79 lines
2.5 KiB
TypeScript
79 lines
2.5 KiB
TypeScript
import os from "os"
|
|
import path from "path"
|
|
|
|
export interface ConfigLocation {
|
|
/** Resolved absolute base directory containing all persisted server data. */
|
|
baseDir: string
|
|
/** Canonical YAML config file path (may be custom when input points to a YAML file). */
|
|
configYamlPath: string
|
|
/** Canonical YAML state file path (always in baseDir). */
|
|
stateYamlPath: string
|
|
/** Legacy JSON config file path used for migration (always in baseDir, or explicit JSON input). */
|
|
legacyJsonPath: string
|
|
/** Directory for per-instance persisted data (chat history etc.). */
|
|
instancesDir: string
|
|
}
|
|
|
|
function resolvePath(inputPath: string): string {
|
|
if (inputPath.startsWith("~/")) {
|
|
return path.join(os.homedir(), inputPath.slice(2))
|
|
}
|
|
return path.resolve(inputPath)
|
|
}
|
|
|
|
function isYamlPath(filePath: string): boolean {
|
|
const lower = filePath.toLowerCase()
|
|
return lower.endsWith(".yaml") || lower.endsWith(".yml")
|
|
}
|
|
|
|
function isJsonPath(filePath: string): boolean {
|
|
return filePath.toLowerCase().endsWith(".json")
|
|
}
|
|
|
|
/**
|
|
* Resolve CodeNomad's config location into a stable base directory + derived file paths.
|
|
*
|
|
* Supported inputs:
|
|
* - Directory: "~/.config/codenomad"
|
|
* - YAML file: "~/.config/codenomad/config.yaml" (or any *.yml/*.yaml)
|
|
* - Legacy JSON file: "~/.config/codenomad/config.json"
|
|
*/
|
|
export function resolveConfigLocation(raw: string): ConfigLocation {
|
|
const trimmed = (raw ?? "").trim()
|
|
const fallback = "~/.config/codenomad/config.json"
|
|
const input = trimmed.length > 0 ? trimmed : fallback
|
|
|
|
const resolvedInput = resolvePath(input)
|
|
|
|
if (isYamlPath(resolvedInput)) {
|
|
const baseDir = path.dirname(resolvedInput)
|
|
return {
|
|
baseDir,
|
|
configYamlPath: resolvedInput,
|
|
stateYamlPath: path.join(baseDir, "state.yaml"),
|
|
legacyJsonPath: path.join(baseDir, "config.json"),
|
|
instancesDir: path.join(baseDir, "instances"),
|
|
}
|
|
}
|
|
|
|
if (isJsonPath(resolvedInput)) {
|
|
const baseDir = path.dirname(resolvedInput)
|
|
return {
|
|
baseDir,
|
|
configYamlPath: path.join(baseDir, "config.yaml"),
|
|
stateYamlPath: path.join(baseDir, "state.yaml"),
|
|
legacyJsonPath: resolvedInput,
|
|
instancesDir: path.join(baseDir, "instances"),
|
|
}
|
|
}
|
|
|
|
const baseDir = resolvedInput
|
|
return {
|
|
baseDir,
|
|
configYamlPath: path.join(baseDir, "config.yaml"),
|
|
stateYamlPath: path.join(baseDir, "state.yaml"),
|
|
legacyJsonPath: path.join(baseDir, "config.json"),
|
|
instancesDir: path.join(baseDir, "instances"),
|
|
}
|
|
}
|