claude-provider-switch 0.1.0 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -171,9 +171,6 @@ var assertValidProviderInput = (provider) => {
171
171
  if (!provider.authToken || !provider.authToken.trim()) {
172
172
  throw new Error("Auth token is required.");
173
173
  }
174
- if (!provider.model || !provider.model.trim()) {
175
- throw new Error("Model is required.");
176
- }
177
174
  try {
178
175
  new URL(provider.baseUrl);
179
176
  } catch {
@@ -197,9 +194,6 @@ var assertProviderHasAuthToken = (provider) => {
197
194
  if (!provider.authToken || !provider.authToken.trim()) {
198
195
  throw new Error("Auth token is required to apply provider.");
199
196
  }
200
- if (!provider.model || !provider.model.trim()) {
201
- throw new Error("Model is required to apply provider.");
202
- }
203
197
  };
204
198
  var addProvider = (config, provider) => {
205
199
  const normalizedName = normalizeProviderName(provider.name);
@@ -397,6 +391,12 @@ var applyProviderToClaudeSettings = async (provider, options = {}) => {
397
391
  delete env.ANTHROPIC_MODEL;
398
392
  }
399
393
  }
394
+ env.API_TIMEOUT_MS = "3000000";
395
+ if (isAnthropic) {
396
+ delete env.CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC;
397
+ } else {
398
+ env.CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC = "1";
399
+ }
400
400
  const nextSettings = {
401
401
  ...settings,
402
402
  env
@@ -656,11 +656,6 @@ program.command("add").argument("<name>", "Provider name").option("--base-url <u
656
656
  process.exitCode = 1;
657
657
  return;
658
658
  }
659
- if (!options.model?.trim()) {
660
- console.error("Model is required.");
661
- process.exitCode = 1;
662
- return;
663
- }
664
659
  const config = await ensureConfig();
665
660
  const provider = {
666
661
  name,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/core/presets.ts","../src/core/config.ts","../src/core/paths.ts","../src/core/claudeSettings.ts","../src/server.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport path from \"path\";\nimport net from \"net\";\nimport {\n addProvider,\n assertProviderHasAuthToken,\n applyProviderToClaudeSettings,\n ensureConfig,\n findProvider,\n removeProvider,\n saveConfig,\n setCurrentProvider\n} from \"./core\";\nimport type { ProviderConfig } from \"./core\";\nimport { startServer } from \"./server\";\n\nconst defaultUiDist = path.resolve(__dirname, \"ui\");\n\nconst program = new Command();\n\nconst readTokenFromStdin = async (): Promise<string> =>\n await new Promise<string>((resolve, reject) => {\n let token = \"\";\n process.stdin.setEncoding(\"utf8\");\n process.stdin.on(\"data\", (chunk) => {\n token += chunk;\n });\n process.stdin.on(\"end\", () => resolve(token.trim()));\n process.stdin.on(\"error\", reject);\n });\n\nconst formatProvider = (provider: ProviderConfig) => {\n const parts = [provider.name];\n if (provider.baseUrl) {\n parts.push(`(${provider.baseUrl})`);\n }\n if (provider.model) {\n parts.push(`[model: ${provider.model}]`);\n }\n return parts.join(\" \");\n};\n\nconst findAvailablePort = async (start: number, attempts = 20) => {\n for (let i = 0; i < attempts; i += 1) {\n const port = start + i;\n const available = await new Promise<boolean>((resolve) => {\n const server = net.createServer();\n server.once(\"error\", () => resolve(false));\n server.once(\"listening\", () => {\n server.close(() => resolve(true));\n });\n server.listen(port, \"127.0.0.1\");\n });\n\n if (available) {\n return port;\n }\n }\n\n throw new Error(\"No available port found.\");\n};\n\nprogram.name(\"claude-provider\").description(\"Claude provider switcher\");\n\nprogram\n .command(\"list\")\n .description(\"List configured providers\")\n .action(async () => {\n const config = await ensureConfig();\n const current = config.current;\n\n for (const provider of config.providers) {\n const marker = provider.name === current ? \"*\" : \" \";\n console.log(`${marker} ${formatProvider(provider)}`);\n }\n });\n\nprogram\n .command(\"current\")\n .description(\"Show current provider\")\n .action(async () => {\n const config = await ensureConfig();\n if (!config.current) {\n console.log(\"No provider selected.\");\n return;\n }\n\n const provider = findProvider(config, config.current);\n if (!provider) {\n console.log(\"Current provider not found in config.\");\n return;\n }\n\n console.log(formatProvider(provider));\n });\n\nprogram\n .command(\"set\")\n .argument(\"<name>\", \"Provider name\")\n .description(\"Set current provider and apply to Claude settings\")\n .action(async (name: string) => {\n const config = await ensureConfig();\n const nextConfig = setCurrentProvider(config, name);\n const provider = findProvider(nextConfig, name);\n if (!provider) {\n console.error(\"Provider not found.\");\n process.exitCode = 1;\n return;\n }\n\n try {\n assertProviderHasAuthToken(provider);\n } catch (error) {\n console.error((error as Error).message);\n process.exitCode = 1;\n return;\n }\n\n await saveConfig(nextConfig);\n await applyProviderToClaudeSettings(provider);\n console.log(`Applied provider '${provider.name}'.`);\n });\n\nprogram\n .command(\"add\")\n .argument(\"<name>\", \"Provider name\")\n .option(\"--base-url <url>\", \"Base URL\")\n .option(\"--token <token>\", \"Auth token\")\n .option(\"--token-stdin\", \"Read auth token from stdin\")\n .option(\"--model <model>\", \"Model name\")\n .option(\"--website <url>\", \"Website URL\")\n .option(\"--description <text>\", \"Description\")\n .description(\"Add a custom provider\")\n .action(async (\n name: string,\n options: {\n baseUrl?: string;\n token?: string;\n tokenStdin?: boolean;\n model?: string;\n website?: string;\n description?: string;\n }\n ) => {\n if (options.token && options.tokenStdin) {\n console.error(\"Use either --token or --token-stdin, not both.\");\n process.exitCode = 1;\n return;\n }\n\n let authToken = options.token?.trim() ?? \"\";\n if (options.tokenStdin) {\n if (process.stdin.isTTY) {\n console.error(\"No stdin input detected for --token-stdin.\");\n process.exitCode = 1;\n return;\n }\n authToken = await readTokenFromStdin();\n }\n\n if (!options.baseUrl?.trim()) {\n console.error(\"Base URL is required.\");\n process.exitCode = 1;\n return;\n }\n if (!authToken) {\n console.error(\"Auth token is required.\");\n process.exitCode = 1;\n return;\n }\n if (!options.model?.trim()) {\n console.error(\"Model is required.\");\n process.exitCode = 1;\n return;\n }\n const config = await ensureConfig();\n const provider: ProviderConfig = {\n name,\n baseUrl: options.baseUrl,\n authToken,\n model: options.model,\n website: options.website,\n description: options.description,\n preset: false\n };\n\n const nextConfig = addProvider(config, provider);\n await saveConfig(nextConfig);\n console.log(`Added provider '${name}'.`);\n });\n\nprogram\n .command(\"remove\")\n .argument(\"<name>\", \"Provider name\")\n .description(\"Remove a provider\")\n .action(async (name: string) => {\n const config = await ensureConfig();\n const nextConfig = removeProvider(config, name);\n await saveConfig(nextConfig);\n console.log(`Removed provider '${name}'.`);\n });\n\nprogram\n .command(\"serve\")\n .description(\"Start local web UI and API server\")\n .option(\"--port <port>\", \"Port\", (value) => Number(value))\n .action(async (options: { port?: number }) => {\n const preferredPort = options.port ?? 8787;\n const port = await findAvailablePort(preferredPort, 20);\n const server = await startServer({ uiDistPath: defaultUiDist }, port);\n\n server.on(\"listening\", () => {\n console.log(`Server running at http://localhost:${port}`);\n });\n });\n\nprogram.parseAsync(process.argv);\n","import { ProviderConfig } from \"./types\";\n\nexport const DEFAULT_PRESETS: ProviderConfig[] = [\n {\n name: \"anthropic\",\n baseUrl: \"https://api.anthropic.com\",\n authToken: \"\",\n model: \"\",\n preset: true,\n description: \"Official Anthropic API\",\n website: \"https://www.anthropic.com\",\n },\n {\n name: \"智谱Coding Plan\",\n baseUrl: \"https://open.bigmodel.cn/api/anthropic\",\n authToken: \"\",\n model: \"\",\n preset: true,\n description: \"Zhipu AI (GLM) compatible endpoint\",\n website: \"https://open.bigmodel.cn\",\n },\n {\n name: \"火山方舟Coding Plan\",\n baseUrl: \"https://ark.cn-beijing.volces.com/api/coding\",\n authToken: \"\",\n model: \"ark-code-latest\",\n preset: true,\n description: \"火山方舟 coding plan anthropic compatible endpoint\",\n website: \"https://www.volcengine.com\",\n },\n {\n name: \"custom\",\n baseUrl: \"\",\n authToken: \"\",\n model: \"\",\n preset: true,\n description: \"Custom endpoint\",\n website: \"\",\n },\n];\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { ConfigFile, PathsOptions, ProviderConfig } from \"./types\";\nimport { DEFAULT_PRESETS } from \"./presets\";\nimport { resolvePaths } from \"./paths\";\n\nconst CONFIG_VERSION = 1 as const;\n\nexport const normalizeProviderName = (name: string) => name.trim().toLowerCase();\nconst isAnthropicName = (name: string) => normalizeProviderName(name) === \"anthropic\";\nconst isAnthropicProvider = (provider: ProviderConfig) =>\n isAnthropicName(provider.name);\n\nexport const createDefaultConfig = (): ConfigFile => ({\n version: CONFIG_VERSION,\n current: DEFAULT_PRESETS[0]?.name ?? null,\n providers: DEFAULT_PRESETS.map((provider) => ({ ...provider }))\n});\n\nconst readJsonFile = async <T>(filePath: string): Promise<T> => {\n const raw = await fs.readFile(filePath, \"utf8\");\n return JSON.parse(raw) as T;\n};\n\nconst ensureOwnerOnlyFile = async (filePath: string) => {\n try {\n await fs.chmod(filePath, 0o600);\n } catch {\n // Ignore chmod errors on unsupported platforms/filesystems.\n }\n};\n\nconst writeJsonFile = async (filePath: string, data: unknown) => {\n const content = `${JSON.stringify(data, null, 2)}\\n`;\n await fs.writeFile(filePath, content, { encoding: \"utf8\", mode: 0o600 });\n await ensureOwnerOnlyFile(filePath);\n};\n\nexport const ensureConfig = async (options: PathsOptions = {}): Promise<ConfigFile> => {\n const { configDir, configPath } = resolvePaths(options);\n await fs.mkdir(configDir, { recursive: true, mode: 0o700 });\n\n try {\n const config = await readJsonFile<ConfigFile>(configPath);\n return normalizeConfig(config);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n\n const config = createDefaultConfig();\n await writeJsonFile(configPath, config);\n return config;\n }\n};\n\nexport const saveConfig = async (\n config: ConfigFile,\n options: PathsOptions = {}\n): Promise<void> => {\n const { configDir, configPath } = resolvePaths(options);\n await fs.mkdir(configDir, { recursive: true, mode: 0o700 });\n await writeJsonFile(configPath, normalizeConfig(config));\n};\n\nexport const normalizeConfig = (config: ConfigFile): ConfigFile => {\n const providers = Array.isArray(config.providers) ? config.providers : [];\n const normalizedProviders = providers\n .filter((provider): provider is ProviderConfig => Boolean(provider?.name))\n .map((provider) => ({\n ...provider,\n name: normalizeProviderName(provider.name)\n }));\n\n const uniqueProviders = new Map<string, ProviderConfig>();\n for (const provider of normalizedProviders) {\n if (!uniqueProviders.has(provider.name)) {\n uniqueProviders.set(provider.name, provider);\n }\n }\n\n return {\n version: CONFIG_VERSION,\n current: config.current ? normalizeProviderName(config.current) : null,\n providers: Array.from(uniqueProviders.values())\n };\n};\n\nexport const findProvider = (\n config: ConfigFile,\n name: string\n): ProviderConfig | undefined => {\n const normalized = normalizeProviderName(name);\n return config.providers.find((provider) => provider.name === normalized);\n};\n\nexport const assertValidProviderInput = (provider: ProviderConfig) => {\n if (!provider.name.trim()) {\n throw new Error(\"Provider name is required.\");\n }\n if (!provider.baseUrl || !provider.baseUrl.trim()) {\n throw new Error(\"Base URL is required.\");\n }\n if (!provider.authToken || !provider.authToken.trim()) {\n throw new Error(\"Auth token is required.\");\n }\n if (!provider.model || !provider.model.trim()) {\n throw new Error(\"Model is required.\");\n }\n try {\n new URL(provider.baseUrl);\n } catch {\n throw new Error(\"Base URL must be a valid URL.\");\n }\n if (provider.website) {\n try {\n new URL(provider.website);\n } catch {\n throw new Error(\"Website must be a valid URL.\");\n }\n }\n};\n\nexport const assertProviderHasAuthToken = (provider: ProviderConfig) => {\n if (isAnthropicProvider(provider)) {\n return;\n }\n if (!provider.baseUrl || !provider.baseUrl.trim()) {\n throw new Error(\"Base URL is required to apply provider.\");\n }\n if (!provider.authToken || !provider.authToken.trim()) {\n throw new Error(\"Auth token is required to apply provider.\");\n }\n if (!provider.model || !provider.model.trim()) {\n throw new Error(\"Model is required to apply provider.\");\n }\n};\n\nexport const addProvider = (\n config: ConfigFile,\n provider: ProviderConfig\n): ConfigFile => {\n const normalizedName = normalizeProviderName(provider.name);\n if (config.providers.some((item) => item.name === normalizedName)) {\n throw new Error(`Provider '${normalizedName}' already exists.`);\n }\n\n assertValidProviderInput(provider);\n\n return {\n ...config,\n providers: [\n ...config.providers,\n {\n ...provider,\n name: normalizedName,\n preset: false\n }\n ]\n };\n};\n\nexport const updateProvider = (\n config: ConfigFile,\n name: string,\n updates: ProviderConfig\n): ConfigFile => {\n const normalizedName = normalizeProviderName(name);\n const target = findProvider(config, normalizedName);\n if (!target) {\n throw new Error(`Provider '${normalizedName}' not found.`);\n }\n if (isAnthropicName(normalizedName) && target.preset) {\n throw new Error(\"Anthropic preset is read-only.\");\n }\n\n const nextAuthToken =\n typeof updates.authToken === \"string\" && updates.authToken.trim()\n ? updates.authToken\n : target.authToken;\n\n const updatedProvider: ProviderConfig = {\n name: normalizedName,\n baseUrl: updates.baseUrl !== undefined ? updates.baseUrl : target.baseUrl,\n authToken: nextAuthToken,\n model: updates.model !== undefined ? updates.model : target.model,\n website: updates.website !== undefined ? updates.website : target.website,\n description:\n updates.description !== undefined ? updates.description : target.description,\n preset: target.preset\n };\n\n assertValidProviderInput(updatedProvider);\n\n return {\n ...config,\n providers: config.providers.map((provider) =>\n provider.name === normalizedName ? updatedProvider : provider\n )\n };\n};\n\nexport const removeProvider = (config: ConfigFile, name: string): ConfigFile => {\n const normalizedName = normalizeProviderName(name);\n const target = findProvider(config, normalizedName);\n if (target && isAnthropicName(normalizedName) && target.preset) {\n throw new Error(\"Anthropic preset is read-only.\");\n }\n const providers = config.providers.filter(\n (provider) => provider.name !== normalizedName\n );\n\n if (providers.length === config.providers.length) {\n throw new Error(`Provider '${normalizedName}' not found.`);\n }\n\n return {\n ...config,\n current: config.current === normalizedName ? null : config.current,\n providers\n };\n};\n\nexport const setCurrentProvider = (config: ConfigFile, name: string): ConfigFile => {\n const normalizedName = normalizeProviderName(name);\n const provider = findProvider(config, normalizedName);\n if (!provider) {\n throw new Error(`Provider '${normalizedName}' not found.`);\n }\n\n return {\n ...config,\n current: normalizedName\n };\n};\n","import path from \"path\";\nimport os from \"os\";\nimport { PathsOptions } from \"./types\";\n\nexport const resolvePaths = (options: PathsOptions = {}) => {\n const fallbackConfigDir = path.join(\n os.homedir(),\n \".config\",\n \"claude-provider-switcher\"\n );\n const resolvedConfigPath =\n options.configPath ||\n process.env.CPS_CONFIG_PATH ||\n path.join(fallbackConfigDir, \"config.json\");\n const resolvedConfigDir =\n options.configDir ||\n process.env.CPS_CONFIG_DIR ||\n path.dirname(resolvedConfigPath);\n\n const fallbackClaudeDir = path.join(os.homedir(), \".claude\");\n const resolvedClaudeSettingsPath =\n options.claudeSettingsPath ||\n process.env.CPS_CLAUDE_SETTINGS_PATH ||\n path.join(fallbackClaudeDir, \"settings.json\");\n const resolvedClaudeDir =\n options.claudeDir ||\n process.env.CPS_CLAUDE_DIR ||\n path.dirname(resolvedClaudeSettingsPath);\n\n return {\n configDir: resolvedConfigDir,\n configPath: resolvedConfigPath,\n claudeDir: resolvedClaudeDir,\n claudeSettingsPath: resolvedClaudeSettingsPath\n };\n};\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { resolvePaths } from \"./paths\";\nimport { PathsOptions, ProviderConfig } from \"./types\";\n\nconst BACKUP_PREFIX = \"settings.backup-\";\nconst BACKUP_NAME_PATTERN =\n /^settings\\.backup-\\d{4}-\\d{2}-\\d{2}T\\d{2}-\\d{2}-\\d{2}-\\d{3}Z\\.json$/;\n\nexport type ClaudeSettings = {\n env?: Record<string, string>;\n [key: string]: unknown;\n};\n\nconst readJsonFile = async <T>(filePath: string): Promise<T> => {\n const raw = await fs.readFile(filePath, \"utf8\");\n return JSON.parse(raw) as T;\n};\n\nconst ensureOwnerOnlyFile = async (filePath: string) => {\n try {\n await fs.chmod(filePath, 0o600);\n } catch {\n // Ignore chmod errors on unsupported platforms/filesystems.\n }\n};\n\nconst writeJsonFile = async (filePath: string, data: unknown) => {\n const content = `${JSON.stringify(data, null, 2)}\\n`;\n await fs.writeFile(filePath, content, { encoding: \"utf8\", mode: 0o600 });\n await ensureOwnerOnlyFile(filePath);\n};\n\nexport const readClaudeSettings = async (\n options: PathsOptions = {}\n): Promise<ClaudeSettings> => {\n const { claudeSettingsPath } = resolvePaths(options);\n\n try {\n return await readJsonFile<ClaudeSettings>(claudeSettingsPath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n return {};\n }\n};\n\nexport type ClaudeSettingsBackup = {\n name: string;\n mtime: number;\n size: number;\n};\n\nconst listBackups = async (claudeDir: string) => {\n try {\n const entries = await fs.readdir(claudeDir, { withFileTypes: true });\n return entries\n .filter(\n (entry) => entry.isFile() && entry.name.startsWith(BACKUP_PREFIX)\n )\n .map((entry) => entry.name);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n};\n\nconst pruneBackups = async (claudeDir: string, keep = 3) => {\n const backups = await listBackups(claudeDir);\n if (backups.length <= keep) {\n return;\n }\n\n const backupPaths = await Promise.all(\n backups.map(async (name) => {\n const fullPath = path.join(claudeDir, name);\n const stat = await fs.stat(fullPath);\n return { name, fullPath, mtime: stat.mtimeMs };\n })\n );\n\n backupPaths.sort((a, b) => b.mtime - a.mtime);\n const toRemove = backupPaths.slice(keep);\n\n await Promise.all(toRemove.map((backup) => fs.unlink(backup.fullPath)));\n};\n\nconst backupClaudeSettings = async (\n claudeSettingsPath: string,\n claudeDir: string\n) => {\n try {\n await fs.access(claudeSettingsPath);\n } catch {\n return;\n }\n\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const backupName = `${BACKUP_PREFIX}${timestamp}.json`;\n const backupPath = path.join(claudeDir, backupName);\n\n await fs.copyFile(claudeSettingsPath, backupPath);\n await ensureOwnerOnlyFile(backupPath);\n await pruneBackups(claudeDir, 3);\n};\n\nexport const listClaudeSettingsBackups = async (\n options: PathsOptions = {}\n): Promise<ClaudeSettingsBackup[]> => {\n const { claudeDir } = resolvePaths(options);\n const names = await listBackups(claudeDir);\n\n const backups = await Promise.all(\n names.map(async (name) => {\n const fullPath = path.join(claudeDir, name);\n const stat = await fs.stat(fullPath);\n return { name, mtime: stat.mtimeMs, size: stat.size };\n })\n );\n\n return backups.sort((a, b) => b.mtime - a.mtime);\n};\n\nexport const restoreClaudeSettingsBackup = async (\n name: string,\n options: PathsOptions = {}\n): Promise<void> => {\n if (!name || !BACKUP_NAME_PATTERN.test(name)) {\n throw new Error(\"Invalid backup name.\");\n }\n\n const { claudeDir, claudeSettingsPath } = resolvePaths(options);\n const resolvedClaudeDir = path.resolve(claudeDir);\n const backupPath = path.resolve(claudeDir, name);\n const relativePath = path.relative(resolvedClaudeDir, backupPath);\n if (relativePath.startsWith(\"..\") || path.isAbsolute(relativePath)) {\n throw new Error(\"Invalid backup path.\");\n }\n\n await fs.mkdir(claudeDir, { recursive: true, mode: 0o700 });\n await backupClaudeSettings(claudeSettingsPath, claudeDir);\n await fs.copyFile(backupPath, claudeSettingsPath);\n await ensureOwnerOnlyFile(claudeSettingsPath);\n};\n\nexport const applyProviderToClaudeSettings = async (\n provider: ProviderConfig,\n options: PathsOptions = {}\n): Promise<ClaudeSettings> => {\n const { claudeDir, claudeSettingsPath } = resolvePaths(options);\n\n await fs.mkdir(claudeDir, { recursive: true, mode: 0o700 });\n const settings = await readClaudeSettings(options);\n const env =\n settings.env && typeof settings.env === \"object\"\n ? { ...(settings.env as Record<string, string>) }\n : {};\n\n const isAnthropic =\n provider.name && provider.name.trim().toLowerCase() === \"anthropic\";\n\n if (isAnthropic) {\n delete env.ANTHROPIC_BASE_URL;\n delete env.ANTHROPIC_AUTH_TOKEN;\n delete env.ANTHROPIC_MODEL;\n } else {\n env.ANTHROPIC_BASE_URL = provider.baseUrl ?? \"\";\n env.ANTHROPIC_AUTH_TOKEN = provider.authToken ?? \"\";\n\n if (provider.model && provider.model.trim()) {\n env.ANTHROPIC_MODEL = provider.model.trim();\n } else {\n delete env.ANTHROPIC_MODEL;\n }\n }\n\n const nextSettings = {\n ...settings,\n env\n };\n\n await backupClaudeSettings(claudeSettingsPath, claudeDir);\n await writeJsonFile(claudeSettingsPath, nextSettings);\n\n return nextSettings;\n};\n","import express from \"express\";\nimport path from \"path\";\nimport fs from \"fs/promises\";\nimport type { Server } from \"http\";\nimport {\n addProvider,\n assertProviderHasAuthToken,\n applyProviderToClaudeSettings,\n ensureConfig,\n findProvider,\n listClaudeSettingsBackups,\n removeProvider,\n restoreClaudeSettingsBackup,\n saveConfig,\n setCurrentProvider,\n updateProvider\n} from \"./core\";\nimport type { PathsOptions, ProviderConfig } from \"./core\";\n\nexport type ServerOptions = PathsOptions & {\n uiDistPath?: string;\n};\n\nexport const sanitizeProviderForResponse = (\n provider: ProviderConfig\n): ProviderConfig => ({\n ...provider,\n authToken: provider.authToken ? \"***\" : \"\"\n});\n\nexport const sanitizeProvidersForResponse = (\n providers: ProviderConfig[]\n): ProviderConfig[] => providers.map(sanitizeProviderForResponse);\n\nconst loadConfig = async (options: PathsOptions) => ensureConfig(options);\n\nconst resolveUiDist = async (uiDistPath?: string) => {\n if (!uiDistPath) {\n return null;\n }\n\n try {\n const stats = await fs.stat(uiDistPath);\n if (stats.isDirectory()) {\n return uiDistPath;\n }\n } catch {\n return null;\n }\n\n return null;\n};\n\nexport const createApp = async (\n options: ServerOptions = {}\n): Promise<express.Express> => {\n const app = express();\n app.use(express.json());\n\n app.get(\"/api/providers\", async (_req, res) => {\n const config = await loadConfig(options);\n res.json({\n providers: sanitizeProvidersForResponse(config.providers),\n current: config.current\n });\n });\n\n app.post(\"/api/providers\", async (req, res) => {\n try {\n const config = await loadConfig(options);\n const payload = req.body as ProviderConfig;\n const nextConfig = addProvider(config, payload);\n await saveConfig(nextConfig, options);\n res\n .status(201)\n .json({ providers: sanitizeProvidersForResponse(nextConfig.providers) });\n } catch (error) {\n res.status(400).json({ error: (error as Error).message });\n }\n });\n\n app.put(\"/api/providers/:name\", async (req, res) => {\n try {\n const config = await loadConfig(options);\n const updates = req.body as ProviderConfig;\n const nextConfig = updateProvider(config, req.params.name, updates);\n await saveConfig(nextConfig, options);\n res.json({ providers: sanitizeProvidersForResponse(nextConfig.providers) });\n } catch (error) {\n res.status(400).json({ error: (error as Error).message });\n }\n });\n\n app.delete(\"/api/providers/:name\", async (req, res) => {\n try {\n const config = await loadConfig(options);\n const nextConfig = removeProvider(config, req.params.name);\n await saveConfig(nextConfig, options);\n res.json({\n providers: sanitizeProvidersForResponse(nextConfig.providers),\n current: nextConfig.current\n });\n } catch (error) {\n res.status(400).json({ error: (error as Error).message });\n }\n });\n\n app.get(\"/api/current\", async (_req, res) => {\n const config = await loadConfig(options);\n const provider = config.current\n ? findProvider(config, config.current)\n : undefined;\n res.json({\n current: config.current,\n provider: provider ? sanitizeProviderForResponse(provider) : undefined\n });\n });\n\n app.get(\"/api/backups\", async (_req, res) => {\n const backups = await listClaudeSettingsBackups(options);\n res.json({ backups });\n });\n\n app.post(\"/api/backups/restore\", async (req, res) => {\n try {\n const { name } = req.body as { name?: string };\n if (!name) {\n res.status(400).json({ error: \"Backup name is required.\" });\n return;\n }\n await restoreClaudeSettingsBackup(name, options);\n res.json({ restored: true });\n } catch (error) {\n res.status(400).json({ error: (error as Error).message });\n }\n });\n\n app.post(\"/api/current\", async (req, res) => {\n try {\n const config = await loadConfig(options);\n const { name } = req.body as { name?: string };\n if (!name) {\n res.status(400).json({ error: \"Provider name is required.\" });\n return;\n }\n\n const nextConfig = setCurrentProvider(config, name);\n const provider = findProvider(nextConfig, name);\n if (!provider) {\n res.status(404).json({ error: \"Provider not found.\" });\n return;\n }\n\n try {\n assertProviderHasAuthToken(provider);\n } catch (error) {\n res.status(400).json({ error: (error as Error).message });\n return;\n }\n\n await saveConfig(nextConfig, options);\n await applyProviderToClaudeSettings(provider, options);\n\n res.json({\n current: nextConfig.current,\n provider: sanitizeProviderForResponse(provider)\n });\n } catch (error) {\n res.status(400).json({ error: (error as Error).message });\n }\n });\n\n const uiDist = await resolveUiDist(options.uiDistPath);\n if (uiDist) {\n app.use(express.static(uiDist));\n app.get(\"*\", async (_req, res) => {\n res.sendFile(path.join(uiDist, \"index.html\"));\n });\n } else {\n app.get(\"/\", (_req, res) => {\n res\n .status(200)\n .send(\n \"UI not built. Run `npm -w packages/ui run build` and restart the server.\"\n );\n });\n }\n\n return app;\n};\n\nexport const startServer = async (\n options: ServerOptions,\n port: number\n): Promise<Server> => {\n const app = await createApp(options);\n return app.listen(port, \"127.0.0.1\");\n};\n"],"mappings":"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","names":["import_path","path","os","fs","import_promises","import_path","readJsonFile","fs","ensureOwnerOnlyFile","writeJsonFile","path","import_path","import_promises","fs","express","path","path","net"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/core/presets.ts","../src/core/config.ts","../src/core/paths.ts","../src/core/claudeSettings.ts","../src/server.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport path from \"path\";\nimport net from \"net\";\nimport {\n addProvider,\n assertProviderHasAuthToken,\n applyProviderToClaudeSettings,\n ensureConfig,\n findProvider,\n removeProvider,\n saveConfig,\n setCurrentProvider\n} from \"./core\";\nimport type { ProviderConfig } from \"./core\";\nimport { startServer } from \"./server\";\n\nconst defaultUiDist = path.resolve(__dirname, \"ui\");\n\nconst program = new Command();\n\nconst readTokenFromStdin = async (): Promise<string> =>\n await new Promise<string>((resolve, reject) => {\n let token = \"\";\n process.stdin.setEncoding(\"utf8\");\n process.stdin.on(\"data\", (chunk) => {\n token += chunk;\n });\n process.stdin.on(\"end\", () => resolve(token.trim()));\n process.stdin.on(\"error\", reject);\n });\n\nconst formatProvider = (provider: ProviderConfig) => {\n const parts = [provider.name];\n if (provider.baseUrl) {\n parts.push(`(${provider.baseUrl})`);\n }\n if (provider.model) {\n parts.push(`[model: ${provider.model}]`);\n }\n return parts.join(\" \");\n};\n\nconst findAvailablePort = async (start: number, attempts = 20) => {\n for (let i = 0; i < attempts; i += 1) {\n const port = start + i;\n const available = await new Promise<boolean>((resolve) => {\n const server = net.createServer();\n server.once(\"error\", () => resolve(false));\n server.once(\"listening\", () => {\n server.close(() => resolve(true));\n });\n server.listen(port, \"127.0.0.1\");\n });\n\n if (available) {\n return port;\n }\n }\n\n throw new Error(\"No available port found.\");\n};\n\nprogram.name(\"claude-provider\").description(\"Claude provider switcher\");\n\nprogram\n .command(\"list\")\n .description(\"List configured providers\")\n .action(async () => {\n const config = await ensureConfig();\n const current = config.current;\n\n for (const provider of config.providers) {\n const marker = provider.name === current ? \"*\" : \" \";\n console.log(`${marker} ${formatProvider(provider)}`);\n }\n });\n\nprogram\n .command(\"current\")\n .description(\"Show current provider\")\n .action(async () => {\n const config = await ensureConfig();\n if (!config.current) {\n console.log(\"No provider selected.\");\n return;\n }\n\n const provider = findProvider(config, config.current);\n if (!provider) {\n console.log(\"Current provider not found in config.\");\n return;\n }\n\n console.log(formatProvider(provider));\n });\n\nprogram\n .command(\"set\")\n .argument(\"<name>\", \"Provider name\")\n .description(\"Set current provider and apply to Claude settings\")\n .action(async (name: string) => {\n const config = await ensureConfig();\n const nextConfig = setCurrentProvider(config, name);\n const provider = findProvider(nextConfig, name);\n if (!provider) {\n console.error(\"Provider not found.\");\n process.exitCode = 1;\n return;\n }\n\n try {\n assertProviderHasAuthToken(provider);\n } catch (error) {\n console.error((error as Error).message);\n process.exitCode = 1;\n return;\n }\n\n await saveConfig(nextConfig);\n await applyProviderToClaudeSettings(provider);\n console.log(`Applied provider '${provider.name}'.`);\n });\n\nprogram\n .command(\"add\")\n .argument(\"<name>\", \"Provider name\")\n .option(\"--base-url <url>\", \"Base URL\")\n .option(\"--token <token>\", \"Auth token\")\n .option(\"--token-stdin\", \"Read auth token from stdin\")\n .option(\"--model <model>\", \"Model name\")\n .option(\"--website <url>\", \"Website URL\")\n .option(\"--description <text>\", \"Description\")\n .description(\"Add a custom provider\")\n .action(async (\n name: string,\n options: {\n baseUrl?: string;\n token?: string;\n tokenStdin?: boolean;\n model?: string;\n website?: string;\n description?: string;\n }\n ) => {\n if (options.token && options.tokenStdin) {\n console.error(\"Use either --token or --token-stdin, not both.\");\n process.exitCode = 1;\n return;\n }\n\n let authToken = options.token?.trim() ?? \"\";\n if (options.tokenStdin) {\n if (process.stdin.isTTY) {\n console.error(\"No stdin input detected for --token-stdin.\");\n process.exitCode = 1;\n return;\n }\n authToken = await readTokenFromStdin();\n }\n\n if (!options.baseUrl?.trim()) {\n console.error(\"Base URL is required.\");\n process.exitCode = 1;\n return;\n }\n if (!authToken) {\n console.error(\"Auth token is required.\");\n process.exitCode = 1;\n return;\n }\n const config = await ensureConfig();\n const provider: ProviderConfig = {\n name,\n baseUrl: options.baseUrl,\n authToken,\n model: options.model,\n website: options.website,\n description: options.description,\n preset: false\n };\n\n const nextConfig = addProvider(config, provider);\n await saveConfig(nextConfig);\n console.log(`Added provider '${name}'.`);\n });\n\nprogram\n .command(\"remove\")\n .argument(\"<name>\", \"Provider name\")\n .description(\"Remove a provider\")\n .action(async (name: string) => {\n const config = await ensureConfig();\n const nextConfig = removeProvider(config, name);\n await saveConfig(nextConfig);\n console.log(`Removed provider '${name}'.`);\n });\n\nprogram\n .command(\"serve\")\n .description(\"Start local web UI and API server\")\n .option(\"--port <port>\", \"Port\", (value) => Number(value))\n .action(async (options: { port?: number }) => {\n const preferredPort = options.port ?? 8787;\n const port = await findAvailablePort(preferredPort, 20);\n const server = await startServer({ uiDistPath: defaultUiDist }, port);\n\n server.on(\"listening\", () => {\n console.log(`Server running at http://localhost:${port}`);\n });\n });\n\nprogram.parseAsync(process.argv);\n","import { ProviderConfig } from \"./types\";\n\nexport const DEFAULT_PRESETS: ProviderConfig[] = [\n {\n name: \"anthropic\",\n baseUrl: \"https://api.anthropic.com\",\n authToken: \"\",\n model: \"\",\n preset: true,\n description: \"Official Anthropic API\",\n website: \"https://www.anthropic.com\",\n },\n {\n name: \"智谱Coding Plan\",\n baseUrl: \"https://open.bigmodel.cn/api/anthropic\",\n authToken: \"\",\n model: \"\",\n preset: true,\n description: \"Zhipu AI (GLM) compatible endpoint\",\n website: \"https://open.bigmodel.cn\",\n },\n {\n name: \"火山方舟Coding Plan\",\n baseUrl: \"https://ark.cn-beijing.volces.com/api/coding\",\n authToken: \"\",\n model: \"ark-code-latest\",\n preset: true,\n description: \"火山方舟 coding plan anthropic compatible endpoint\",\n website: \"https://www.volcengine.com\",\n },\n {\n name: \"custom\",\n baseUrl: \"\",\n authToken: \"\",\n model: \"\",\n preset: true,\n description: \"Custom endpoint\",\n website: \"\",\n },\n];\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { ConfigFile, PathsOptions, ProviderConfig } from \"./types\";\nimport { DEFAULT_PRESETS } from \"./presets\";\nimport { resolvePaths } from \"./paths\";\n\nconst CONFIG_VERSION = 1 as const;\n\nexport const normalizeProviderName = (name: string) => name.trim().toLowerCase();\nconst isAnthropicName = (name: string) => normalizeProviderName(name) === \"anthropic\";\nconst isAnthropicProvider = (provider: ProviderConfig) =>\n isAnthropicName(provider.name);\n\nexport const createDefaultConfig = (): ConfigFile => ({\n version: CONFIG_VERSION,\n current: DEFAULT_PRESETS[0]?.name ?? null,\n providers: DEFAULT_PRESETS.map((provider) => ({ ...provider }))\n});\n\nconst readJsonFile = async <T>(filePath: string): Promise<T> => {\n const raw = await fs.readFile(filePath, \"utf8\");\n return JSON.parse(raw) as T;\n};\n\nconst ensureOwnerOnlyFile = async (filePath: string) => {\n try {\n await fs.chmod(filePath, 0o600);\n } catch {\n // Ignore chmod errors on unsupported platforms/filesystems.\n }\n};\n\nconst writeJsonFile = async (filePath: string, data: unknown) => {\n const content = `${JSON.stringify(data, null, 2)}\\n`;\n await fs.writeFile(filePath, content, { encoding: \"utf8\", mode: 0o600 });\n await ensureOwnerOnlyFile(filePath);\n};\n\nexport const ensureConfig = async (options: PathsOptions = {}): Promise<ConfigFile> => {\n const { configDir, configPath } = resolvePaths(options);\n await fs.mkdir(configDir, { recursive: true, mode: 0o700 });\n\n try {\n const config = await readJsonFile<ConfigFile>(configPath);\n return normalizeConfig(config);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n\n const config = createDefaultConfig();\n await writeJsonFile(configPath, config);\n return config;\n }\n};\n\nexport const saveConfig = async (\n config: ConfigFile,\n options: PathsOptions = {}\n): Promise<void> => {\n const { configDir, configPath } = resolvePaths(options);\n await fs.mkdir(configDir, { recursive: true, mode: 0o700 });\n await writeJsonFile(configPath, normalizeConfig(config));\n};\n\nexport const normalizeConfig = (config: ConfigFile): ConfigFile => {\n const providers = Array.isArray(config.providers) ? config.providers : [];\n const normalizedProviders = providers\n .filter((provider): provider is ProviderConfig => Boolean(provider?.name))\n .map((provider) => ({\n ...provider,\n name: normalizeProviderName(provider.name)\n }));\n\n const uniqueProviders = new Map<string, ProviderConfig>();\n for (const provider of normalizedProviders) {\n if (!uniqueProviders.has(provider.name)) {\n uniqueProviders.set(provider.name, provider);\n }\n }\n\n return {\n version: CONFIG_VERSION,\n current: config.current ? normalizeProviderName(config.current) : null,\n providers: Array.from(uniqueProviders.values())\n };\n};\n\nexport const findProvider = (\n config: ConfigFile,\n name: string\n): ProviderConfig | undefined => {\n const normalized = normalizeProviderName(name);\n return config.providers.find((provider) => provider.name === normalized);\n};\n\nexport const assertValidProviderInput = (provider: ProviderConfig) => {\n if (!provider.name.trim()) {\n throw new Error(\"Provider name is required.\");\n }\n if (!provider.baseUrl || !provider.baseUrl.trim()) {\n throw new Error(\"Base URL is required.\");\n }\n if (!provider.authToken || !provider.authToken.trim()) {\n throw new Error(\"Auth token is required.\");\n }\n try {\n new URL(provider.baseUrl);\n } catch {\n throw new Error(\"Base URL must be a valid URL.\");\n }\n if (provider.website) {\n try {\n new URL(provider.website);\n } catch {\n throw new Error(\"Website must be a valid URL.\");\n }\n }\n};\n\nexport const assertProviderHasAuthToken = (provider: ProviderConfig) => {\n if (isAnthropicProvider(provider)) {\n return;\n }\n if (!provider.baseUrl || !provider.baseUrl.trim()) {\n throw new Error(\"Base URL is required to apply provider.\");\n }\n if (!provider.authToken || !provider.authToken.trim()) {\n throw new Error(\"Auth token is required to apply provider.\");\n }\n};\n\nexport const addProvider = (\n config: ConfigFile,\n provider: ProviderConfig\n): ConfigFile => {\n const normalizedName = normalizeProviderName(provider.name);\n if (config.providers.some((item) => item.name === normalizedName)) {\n throw new Error(`Provider '${normalizedName}' already exists.`);\n }\n\n assertValidProviderInput(provider);\n\n return {\n ...config,\n providers: [\n ...config.providers,\n {\n ...provider,\n name: normalizedName,\n preset: false\n }\n ]\n };\n};\n\nexport const updateProvider = (\n config: ConfigFile,\n name: string,\n updates: ProviderConfig\n): ConfigFile => {\n const normalizedName = normalizeProviderName(name);\n const target = findProvider(config, normalizedName);\n if (!target) {\n throw new Error(`Provider '${normalizedName}' not found.`);\n }\n if (isAnthropicName(normalizedName) && target.preset) {\n throw new Error(\"Anthropic preset is read-only.\");\n }\n\n const nextAuthToken =\n typeof updates.authToken === \"string\" && updates.authToken.trim()\n ? updates.authToken\n : target.authToken;\n\n const updatedProvider: ProviderConfig = {\n name: normalizedName,\n baseUrl: updates.baseUrl !== undefined ? updates.baseUrl : target.baseUrl,\n authToken: nextAuthToken,\n model: updates.model !== undefined ? updates.model : target.model,\n website: updates.website !== undefined ? updates.website : target.website,\n description:\n updates.description !== undefined ? updates.description : target.description,\n preset: target.preset\n };\n\n assertValidProviderInput(updatedProvider);\n\n return {\n ...config,\n providers: config.providers.map((provider) =>\n provider.name === normalizedName ? updatedProvider : provider\n )\n };\n};\n\nexport const removeProvider = (config: ConfigFile, name: string): ConfigFile => {\n const normalizedName = normalizeProviderName(name);\n const target = findProvider(config, normalizedName);\n if (target && isAnthropicName(normalizedName) && target.preset) {\n throw new Error(\"Anthropic preset is read-only.\");\n }\n const providers = config.providers.filter(\n (provider) => provider.name !== normalizedName\n );\n\n if (providers.length === config.providers.length) {\n throw new Error(`Provider '${normalizedName}' not found.`);\n }\n\n return {\n ...config,\n current: config.current === normalizedName ? null : config.current,\n providers\n };\n};\n\nexport const setCurrentProvider = (config: ConfigFile, name: string): ConfigFile => {\n const normalizedName = normalizeProviderName(name);\n const provider = findProvider(config, normalizedName);\n if (!provider) {\n throw new Error(`Provider '${normalizedName}' not found.`);\n }\n\n return {\n ...config,\n current: normalizedName\n };\n};\n","import path from \"path\";\nimport os from \"os\";\nimport { PathsOptions } from \"./types\";\n\nexport const resolvePaths = (options: PathsOptions = {}) => {\n const fallbackConfigDir = path.join(\n os.homedir(),\n \".config\",\n \"claude-provider-switcher\"\n );\n const resolvedConfigPath =\n options.configPath ||\n process.env.CPS_CONFIG_PATH ||\n path.join(fallbackConfigDir, \"config.json\");\n const resolvedConfigDir =\n options.configDir ||\n process.env.CPS_CONFIG_DIR ||\n path.dirname(resolvedConfigPath);\n\n const fallbackClaudeDir = path.join(os.homedir(), \".claude\");\n const resolvedClaudeSettingsPath =\n options.claudeSettingsPath ||\n process.env.CPS_CLAUDE_SETTINGS_PATH ||\n path.join(fallbackClaudeDir, \"settings.json\");\n const resolvedClaudeDir =\n options.claudeDir ||\n process.env.CPS_CLAUDE_DIR ||\n path.dirname(resolvedClaudeSettingsPath);\n\n return {\n configDir: resolvedConfigDir,\n configPath: resolvedConfigPath,\n claudeDir: resolvedClaudeDir,\n claudeSettingsPath: resolvedClaudeSettingsPath\n };\n};\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport { resolvePaths } from \"./paths\";\nimport { PathsOptions, ProviderConfig } from \"./types\";\n\nconst BACKUP_PREFIX = \"settings.backup-\";\nconst BACKUP_NAME_PATTERN =\n /^settings\\.backup-\\d{4}-\\d{2}-\\d{2}T\\d{2}-\\d{2}-\\d{2}-\\d{3}Z\\.json$/;\n\nexport type ClaudeSettings = {\n env?: Record<string, string>;\n [key: string]: unknown;\n};\n\nconst readJsonFile = async <T>(filePath: string): Promise<T> => {\n const raw = await fs.readFile(filePath, \"utf8\");\n return JSON.parse(raw) as T;\n};\n\nconst ensureOwnerOnlyFile = async (filePath: string) => {\n try {\n await fs.chmod(filePath, 0o600);\n } catch {\n // Ignore chmod errors on unsupported platforms/filesystems.\n }\n};\n\nconst writeJsonFile = async (filePath: string, data: unknown) => {\n const content = `${JSON.stringify(data, null, 2)}\\n`;\n await fs.writeFile(filePath, content, { encoding: \"utf8\", mode: 0o600 });\n await ensureOwnerOnlyFile(filePath);\n};\n\nexport const readClaudeSettings = async (\n options: PathsOptions = {}\n): Promise<ClaudeSettings> => {\n const { claudeSettingsPath } = resolvePaths(options);\n\n try {\n return await readJsonFile<ClaudeSettings>(claudeSettingsPath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n return {};\n }\n};\n\nexport type ClaudeSettingsBackup = {\n name: string;\n mtime: number;\n size: number;\n};\n\nconst listBackups = async (claudeDir: string) => {\n try {\n const entries = await fs.readdir(claudeDir, { withFileTypes: true });\n return entries\n .filter(\n (entry) => entry.isFile() && entry.name.startsWith(BACKUP_PREFIX)\n )\n .map((entry) => entry.name);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n};\n\nconst pruneBackups = async (claudeDir: string, keep = 3) => {\n const backups = await listBackups(claudeDir);\n if (backups.length <= keep) {\n return;\n }\n\n const backupPaths = await Promise.all(\n backups.map(async (name) => {\n const fullPath = path.join(claudeDir, name);\n const stat = await fs.stat(fullPath);\n return { name, fullPath, mtime: stat.mtimeMs };\n })\n );\n\n backupPaths.sort((a, b) => b.mtime - a.mtime);\n const toRemove = backupPaths.slice(keep);\n\n await Promise.all(toRemove.map((backup) => fs.unlink(backup.fullPath)));\n};\n\nconst backupClaudeSettings = async (\n claudeSettingsPath: string,\n claudeDir: string\n) => {\n try {\n await fs.access(claudeSettingsPath);\n } catch {\n return;\n }\n\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const backupName = `${BACKUP_PREFIX}${timestamp}.json`;\n const backupPath = path.join(claudeDir, backupName);\n\n await fs.copyFile(claudeSettingsPath, backupPath);\n await ensureOwnerOnlyFile(backupPath);\n await pruneBackups(claudeDir, 3);\n};\n\nexport const listClaudeSettingsBackups = async (\n options: PathsOptions = {}\n): Promise<ClaudeSettingsBackup[]> => {\n const { claudeDir } = resolvePaths(options);\n const names = await listBackups(claudeDir);\n\n const backups = await Promise.all(\n names.map(async (name) => {\n const fullPath = path.join(claudeDir, name);\n const stat = await fs.stat(fullPath);\n return { name, mtime: stat.mtimeMs, size: stat.size };\n })\n );\n\n return backups.sort((a, b) => b.mtime - a.mtime);\n};\n\nexport const restoreClaudeSettingsBackup = async (\n name: string,\n options: PathsOptions = {}\n): Promise<void> => {\n if (!name || !BACKUP_NAME_PATTERN.test(name)) {\n throw new Error(\"Invalid backup name.\");\n }\n\n const { claudeDir, claudeSettingsPath } = resolvePaths(options);\n const resolvedClaudeDir = path.resolve(claudeDir);\n const backupPath = path.resolve(claudeDir, name);\n const relativePath = path.relative(resolvedClaudeDir, backupPath);\n if (relativePath.startsWith(\"..\") || path.isAbsolute(relativePath)) {\n throw new Error(\"Invalid backup path.\");\n }\n\n await fs.mkdir(claudeDir, { recursive: true, mode: 0o700 });\n await backupClaudeSettings(claudeSettingsPath, claudeDir);\n await fs.copyFile(backupPath, claudeSettingsPath);\n await ensureOwnerOnlyFile(claudeSettingsPath);\n};\n\nexport const applyProviderToClaudeSettings = async (\n provider: ProviderConfig,\n options: PathsOptions = {}\n): Promise<ClaudeSettings> => {\n const { claudeDir, claudeSettingsPath } = resolvePaths(options);\n\n await fs.mkdir(claudeDir, { recursive: true, mode: 0o700 });\n const settings = await readClaudeSettings(options);\n const env =\n settings.env && typeof settings.env === \"object\"\n ? { ...(settings.env as Record<string, string>) }\n : {};\n\n const isAnthropic =\n provider.name && provider.name.trim().toLowerCase() === \"anthropic\";\n\n if (isAnthropic) {\n delete env.ANTHROPIC_BASE_URL;\n delete env.ANTHROPIC_AUTH_TOKEN;\n delete env.ANTHROPIC_MODEL;\n } else {\n env.ANTHROPIC_BASE_URL = provider.baseUrl ?? \"\";\n env.ANTHROPIC_AUTH_TOKEN = provider.authToken ?? \"\";\n\n if (provider.model && provider.model.trim()) {\n env.ANTHROPIC_MODEL = provider.model.trim();\n } else {\n delete env.ANTHROPIC_MODEL;\n }\n }\n env.API_TIMEOUT_MS = \"3000000\";\n if (isAnthropic) {\n delete env.CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC;\n } else {\n env.CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC = \"1\";\n }\n\n const nextSettings = {\n ...settings,\n env\n };\n\n await backupClaudeSettings(claudeSettingsPath, claudeDir);\n await writeJsonFile(claudeSettingsPath, nextSettings);\n\n return nextSettings;\n};\n","import express from \"express\";\nimport path from \"path\";\nimport fs from \"fs/promises\";\nimport type { Server } from \"http\";\nimport {\n addProvider,\n assertProviderHasAuthToken,\n applyProviderToClaudeSettings,\n ensureConfig,\n findProvider,\n listClaudeSettingsBackups,\n removeProvider,\n restoreClaudeSettingsBackup,\n saveConfig,\n setCurrentProvider,\n updateProvider\n} from \"./core\";\nimport type { PathsOptions, ProviderConfig } from \"./core\";\n\nexport type ServerOptions = PathsOptions & {\n uiDistPath?: string;\n};\n\nexport const sanitizeProviderForResponse = (\n provider: ProviderConfig\n): ProviderConfig => ({\n ...provider,\n authToken: provider.authToken ? \"***\" : \"\"\n});\n\nexport const sanitizeProvidersForResponse = (\n providers: ProviderConfig[]\n): ProviderConfig[] => providers.map(sanitizeProviderForResponse);\n\nconst loadConfig = async (options: PathsOptions) => ensureConfig(options);\n\nconst resolveUiDist = async (uiDistPath?: string) => {\n if (!uiDistPath) {\n return null;\n }\n\n try {\n const stats = await fs.stat(uiDistPath);\n if (stats.isDirectory()) {\n return uiDistPath;\n }\n } catch {\n return null;\n }\n\n return null;\n};\n\nexport const createApp = async (\n options: ServerOptions = {}\n): Promise<express.Express> => {\n const app = express();\n app.use(express.json());\n\n app.get(\"/api/providers\", async (_req, res) => {\n const config = await loadConfig(options);\n res.json({\n providers: sanitizeProvidersForResponse(config.providers),\n current: config.current\n });\n });\n\n app.post(\"/api/providers\", async (req, res) => {\n try {\n const config = await loadConfig(options);\n const payload = req.body as ProviderConfig;\n const nextConfig = addProvider(config, payload);\n await saveConfig(nextConfig, options);\n res\n .status(201)\n .json({ providers: sanitizeProvidersForResponse(nextConfig.providers) });\n } catch (error) {\n res.status(400).json({ error: (error as Error).message });\n }\n });\n\n app.put(\"/api/providers/:name\", async (req, res) => {\n try {\n const config = await loadConfig(options);\n const updates = req.body as ProviderConfig;\n const nextConfig = updateProvider(config, req.params.name, updates);\n await saveConfig(nextConfig, options);\n res.json({ providers: sanitizeProvidersForResponse(nextConfig.providers) });\n } catch (error) {\n res.status(400).json({ error: (error as Error).message });\n }\n });\n\n app.delete(\"/api/providers/:name\", async (req, res) => {\n try {\n const config = await loadConfig(options);\n const nextConfig = removeProvider(config, req.params.name);\n await saveConfig(nextConfig, options);\n res.json({\n providers: sanitizeProvidersForResponse(nextConfig.providers),\n current: nextConfig.current\n });\n } catch (error) {\n res.status(400).json({ error: (error as Error).message });\n }\n });\n\n app.get(\"/api/current\", async (_req, res) => {\n const config = await loadConfig(options);\n const provider = config.current\n ? findProvider(config, config.current)\n : undefined;\n res.json({\n current: config.current,\n provider: provider ? sanitizeProviderForResponse(provider) : undefined\n });\n });\n\n app.get(\"/api/backups\", async (_req, res) => {\n const backups = await listClaudeSettingsBackups(options);\n res.json({ backups });\n });\n\n app.post(\"/api/backups/restore\", async (req, res) => {\n try {\n const { name } = req.body as { name?: string };\n if (!name) {\n res.status(400).json({ error: \"Backup name is required.\" });\n return;\n }\n await restoreClaudeSettingsBackup(name, options);\n res.json({ restored: true });\n } catch (error) {\n res.status(400).json({ error: (error as Error).message });\n }\n });\n\n app.post(\"/api/current\", async (req, res) => {\n try {\n const config = await loadConfig(options);\n const { name } = req.body as { name?: string };\n if (!name) {\n res.status(400).json({ error: \"Provider name is required.\" });\n return;\n }\n\n const nextConfig = setCurrentProvider(config, name);\n const provider = findProvider(nextConfig, name);\n if (!provider) {\n res.status(404).json({ error: \"Provider not found.\" });\n return;\n }\n\n try {\n assertProviderHasAuthToken(provider);\n } catch (error) {\n res.status(400).json({ error: (error as Error).message });\n return;\n }\n\n await saveConfig(nextConfig, options);\n await applyProviderToClaudeSettings(provider, options);\n\n res.json({\n current: nextConfig.current,\n provider: sanitizeProviderForResponse(provider)\n });\n } catch (error) {\n res.status(400).json({ error: (error as Error).message });\n }\n });\n\n const uiDist = await resolveUiDist(options.uiDistPath);\n if (uiDist) {\n app.use(express.static(uiDist));\n app.get(\"*\", async (_req, res) => {\n res.sendFile(path.join(uiDist, \"index.html\"));\n });\n } else {\n app.get(\"/\", (_req, res) => {\n res\n .status(200)\n .send(\n \"UI not built. Run `npm -w packages/ui run build` and restart the server.\"\n );\n });\n }\n\n return app;\n};\n\nexport const startServer = async (\n options: ServerOptions,\n port: number\n): Promise<Server> => {\n const app = await createApp(options);\n return app.listen(port, \"127.0.0.1\");\n};\n"],"mappings":"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","names":["import_path","path","os","fs","import_promises","import_path","readJsonFile","fs","ensureOwnerOnlyFile","writeJsonFile","path","import_path","import_promises","fs","express","path","path","net"]}