95 lines
2.6 KiB
JavaScript
95 lines
2.6 KiB
JavaScript
import dotenv from "dotenv";
|
|
import fs from "fs";
|
|
import path from "path";
|
|
|
|
dotenv.config({ path: path.resolve(process.cwd(), ".env") });
|
|
|
|
function toBool(value, fallback = false) {
|
|
if (value == null) {
|
|
return fallback;
|
|
}
|
|
|
|
return String(value).toLowerCase() === "true";
|
|
}
|
|
|
|
export function getActiveApiKey() {
|
|
const activeKey = (process.env.ACTIVE_KEY ?? "pro").toLowerCase();
|
|
if (activeKey === "lite") {
|
|
return process.env.API_KEY_LITE ?? "";
|
|
}
|
|
|
|
return process.env.API_KEY_PRO ?? "";
|
|
}
|
|
|
|
export function getRuntimeConfig() {
|
|
const claudeBin = resolveClaudeBinary(process.env.CLAUDE_BIN ?? "claude");
|
|
return {
|
|
port: Number(process.env.PORT ?? 3001),
|
|
nodeEnv: process.env.NODE_ENV ?? "development",
|
|
claudeBin,
|
|
shell: process.env.CLAUDE_SHELL ?? "/bin/zsh",
|
|
workspaceDir: process.env.CLAUDE_WORKSPACE_DIR
|
|
? path.resolve(process.env.CLAUDE_WORKSPACE_DIR)
|
|
: process.cwd(),
|
|
anthropicBaseUrl: process.env.ANTHROPIC_BASE_URL ?? "",
|
|
anthropicModel: process.env.ANTHROPIC_MODEL ?? "",
|
|
activeKey: (process.env.ACTIVE_KEY ?? "pro").toLowerCase(),
|
|
claudeArgs: process.env.CLAUDE_ARGS?.trim() ? process.env.CLAUDE_ARGS.trim().split(/\s+/) : ["--dangerously-skip-permissions"],
|
|
watchLogLimit: Number(process.env.WATCH_LOG_LIMIT ?? 400),
|
|
chatChunkLimit: Number(process.env.CHAT_CHUNK_LIMIT ?? 2000),
|
|
logToConsole: toBool(process.env.LOG_TO_CONSOLE, true)
|
|
};
|
|
}
|
|
|
|
function resolveClaudeBinary(rawValue) {
|
|
const candidates = [];
|
|
|
|
if (rawValue) {
|
|
candidates.push(rawValue);
|
|
}
|
|
|
|
candidates.push("/Users/wisecolt-macmini/.local/bin/claude");
|
|
candidates.push("/usr/local/bin/claude");
|
|
candidates.push("/opt/homebrew/bin/claude");
|
|
|
|
for (const candidate of candidates) {
|
|
if (path.isAbsolute(candidate) && fs.existsSync(candidate)) {
|
|
return candidate;
|
|
}
|
|
}
|
|
|
|
const pathEntries = String(process.env.PATH ?? "").split(path.delimiter);
|
|
for (const entry of pathEntries) {
|
|
const candidate = path.join(entry, rawValue);
|
|
if (fs.existsSync(candidate)) {
|
|
return candidate;
|
|
}
|
|
}
|
|
|
|
return rawValue;
|
|
}
|
|
|
|
export function getClaudeEnv(config) {
|
|
const cleanEnv = { ...process.env };
|
|
delete cleanEnv.ANTHROPIC_AUTH_TOKEN;
|
|
|
|
return {
|
|
...cleanEnv,
|
|
ANTHROPIC_API_KEY: getActiveApiKey(),
|
|
ANTHROPIC_BASE_URL: config.anthropicBaseUrl,
|
|
ANTHROPIC_MODEL: config.anthropicModel,
|
|
TERM: "xterm-256color",
|
|
COLORTERM: "truecolor"
|
|
};
|
|
}
|
|
|
|
export function getPublicRuntimeConfig(config) {
|
|
return {
|
|
claudeBin: config.claudeBin,
|
|
anthropicBaseUrl: config.anthropicBaseUrl,
|
|
anthropicModel: config.anthropicModel,
|
|
activeKey: config.activeKey,
|
|
workspaceDir: config.workspaceDir
|
|
};
|
|
}
|