claude-provider-switch 0.1.3 → 0.1.4

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/README.md CHANGED
@@ -19,14 +19,16 @@ Open `http://localhost:8787` and manage providers from the UI, or use CLI comman
19
19
  ```bash
20
20
  cps list
21
21
  cps current
22
+ cps select
22
23
  cps set anthropic
23
24
  ```
24
25
 
25
26
  ## Commands
26
27
 
27
- - `cps list`: list all providers
28
+ - `cps list`: list all providers (show id + name)
28
29
  - `cps current`: show current provider
29
- - `cps set <name>`: switch provider and apply to Claude settings
30
+ - `cps select`: interactively select and apply a provider
31
+ - `cps set <id>`: switch provider by id and apply to Claude settings
30
32
  - `cps add <name>`: add a provider
31
33
  - `cps remove <name>`: remove a provider
32
34
  - `cps serve`: start local UI + API server
package/dist/index.js CHANGED
@@ -27,10 +27,12 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
27
27
  var import_commander = require("commander");
28
28
  var import_path4 = __toESM(require("path"));
29
29
  var import_net = __toESM(require("net"));
30
+ var import_promises4 = __toESM(require("readline/promises"));
30
31
 
31
32
  // src/core/presets.ts
32
33
  var DEFAULT_PRESETS = [
33
34
  {
35
+ id: "anthropic",
34
36
  name: "anthropic",
35
37
  baseUrl: "https://api.anthropic.com",
36
38
  authToken: "",
@@ -40,6 +42,7 @@ var DEFAULT_PRESETS = [
40
42
  website: "https://www.anthropic.com"
41
43
  },
42
44
  {
45
+ id: "zhipu",
43
46
  name: "\u667A\u8C31Coding Plan",
44
47
  baseUrl: "https://open.bigmodel.cn/api/anthropic",
45
48
  authToken: "",
@@ -49,6 +52,7 @@ var DEFAULT_PRESETS = [
49
52
  website: "https://open.bigmodel.cn"
50
53
  },
51
54
  {
55
+ id: "volc",
52
56
  name: "\u706B\u5C71\u65B9\u821FCoding Plan",
53
57
  baseUrl: "https://ark.cn-beijing.volces.com/api/coding",
54
58
  authToken: "",
@@ -58,6 +62,7 @@ var DEFAULT_PRESETS = [
58
62
  website: "https://www.volcengine.com"
59
63
  },
60
64
  {
65
+ id: "custom",
61
66
  name: "custom",
62
67
  baseUrl: "",
63
68
  authToken: "",
@@ -96,8 +101,31 @@ var resolvePaths = (options = {}) => {
96
101
  // src/core/config.ts
97
102
  var CONFIG_VERSION = 1;
98
103
  var normalizeProviderName = (name) => name.trim().toLowerCase();
104
+ var normalizeProviderId = (id) => id.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 24).replace(/-+$/g, "");
99
105
  var isAnthropicName = (name) => normalizeProviderName(name) === "anthropic";
100
106
  var isAnthropicProvider = (provider) => isAnthropicName(provider.name);
107
+ var toProviderIdBase = (provider) => {
108
+ const explicitId = typeof provider.id === "string" ? normalizeProviderId(provider.id) : "";
109
+ if (explicitId) {
110
+ return explicitId;
111
+ }
112
+ const fromName = normalizeProviderId(provider.name);
113
+ return fromName || "provider";
114
+ };
115
+ var buildUniqueProviderId = (base, usedIds) => {
116
+ if (!usedIds.has(base)) {
117
+ usedIds.add(base);
118
+ return base;
119
+ }
120
+ let index = 2;
121
+ let candidate = `${base}-${index}`;
122
+ while (usedIds.has(candidate)) {
123
+ index += 1;
124
+ candidate = `${base}-${index}`;
125
+ }
126
+ usedIds.add(candidate);
127
+ return candidate;
128
+ };
101
129
  var createDefaultConfig = () => ({
102
130
  version: CONFIG_VERSION,
103
131
  current: DEFAULT_PRESETS[0]?.name ?? null,
@@ -143,7 +171,8 @@ var normalizeConfig = (config) => {
143
171
  const providers = Array.isArray(config.providers) ? config.providers : [];
144
172
  const normalizedProviders = providers.filter((provider) => Boolean(provider?.name)).map((provider) => ({
145
173
  ...provider,
146
- name: normalizeProviderName(provider.name)
174
+ name: normalizeProviderName(provider.name),
175
+ id: typeof provider.id === "string" ? normalizeProviderId(provider.id) : void 0
147
176
  }));
148
177
  const uniqueProviders = /* @__PURE__ */ new Map();
149
178
  for (const provider of normalizedProviders) {
@@ -151,16 +180,41 @@ var normalizeConfig = (config) => {
151
180
  uniqueProviders.set(provider.name, provider);
152
181
  }
153
182
  }
183
+ const usedIds = /* @__PURE__ */ new Set();
184
+ const providersWithIds = Array.from(uniqueProviders.values()).map((provider) => {
185
+ const id = buildUniqueProviderId(toProviderIdBase(provider), usedIds);
186
+ return {
187
+ ...provider,
188
+ id
189
+ };
190
+ });
154
191
  return {
155
192
  version: CONFIG_VERSION,
156
193
  current: config.current ? normalizeProviderName(config.current) : null,
157
- providers: Array.from(uniqueProviders.values())
194
+ providers: providersWithIds
158
195
  };
159
196
  };
160
197
  var findProvider = (config, name) => {
161
198
  const normalized = normalizeProviderName(name);
162
199
  return config.providers.find((provider) => provider.name === normalized);
163
200
  };
201
+ var findProviderByReference = (config, reference) => {
202
+ const normalizedId = normalizeProviderId(reference);
203
+ if (normalizedId) {
204
+ const byId = config.providers.find((provider) => provider.id === normalizedId);
205
+ if (byId) {
206
+ return byId;
207
+ }
208
+ }
209
+ return findProvider(config, reference);
210
+ };
211
+ var findProviderById = (config, id) => {
212
+ const normalizedId = normalizeProviderId(id);
213
+ if (!normalizedId) {
214
+ return void 0;
215
+ }
216
+ return config.providers.find((provider) => provider.id === normalizedId);
217
+ };
164
218
  var assertValidProviderInput = (provider) => {
165
219
  if (!provider.name.trim()) {
166
220
  throw new Error("Provider name is required.");
@@ -201,12 +255,20 @@ var addProvider = (config, provider) => {
201
255
  throw new Error(`Provider '${normalizedName}' already exists.`);
202
256
  }
203
257
  assertValidProviderInput(provider);
258
+ const usedIds = new Set(
259
+ config.providers.map((item) => typeof item.id === "string" ? normalizeProviderId(item.id) : "").filter(Boolean)
260
+ );
261
+ const nextId = buildUniqueProviderId(
262
+ toProviderIdBase({ ...provider, name: normalizedName }),
263
+ usedIds
264
+ );
204
265
  return {
205
266
  ...config,
206
267
  providers: [
207
268
  ...config.providers,
208
269
  {
209
270
  ...provider,
271
+ id: nextId,
210
272
  name: normalizedName,
211
273
  preset: false
212
274
  }
@@ -224,6 +286,7 @@ var updateProvider = (config, name, updates) => {
224
286
  }
225
287
  const nextAuthToken = typeof updates.authToken === "string" && updates.authToken.trim() ? updates.authToken : target.authToken;
226
288
  const updatedProvider = {
289
+ id: target.id,
227
290
  name: normalizedName,
228
291
  baseUrl: updates.baseUrl !== void 0 ? updates.baseUrl : target.baseUrl,
229
292
  authToken: nextAuthToken,
@@ -259,14 +322,23 @@ var removeProvider = (config, name) => {
259
322
  };
260
323
  };
261
324
  var setCurrentProvider = (config, name) => {
262
- const normalizedName = normalizeProviderName(name);
263
- const provider = findProvider(config, normalizedName);
325
+ const provider = findProviderByReference(config, name);
264
326
  if (!provider) {
265
- throw new Error(`Provider '${normalizedName}' not found.`);
327
+ throw new Error(`Provider '${name}' not found.`);
266
328
  }
267
329
  return {
268
330
  ...config,
269
- current: normalizedName
331
+ current: provider.name
332
+ };
333
+ };
334
+ var setCurrentProviderById = (config, id) => {
335
+ const provider = findProviderById(config, id);
336
+ if (!provider) {
337
+ throw new Error(`Provider id '${id}' not found.`);
338
+ }
339
+ return {
340
+ ...config,
341
+ current: provider.name
270
342
  };
271
343
  };
272
344
 
@@ -509,7 +581,7 @@ var createApp = async (options = {}) => {
509
581
  return;
510
582
  }
511
583
  const nextConfig = setCurrentProvider(config, name);
512
- const provider = findProvider(nextConfig, name);
584
+ const provider = findProviderByReference(nextConfig, name);
513
585
  if (!provider) {
514
586
  res.status(404).json({ error: "Provider not found." });
515
587
  return;
@@ -563,7 +635,7 @@ var readTokenFromStdin = async () => await new Promise((resolve, reject) => {
563
635
  process.stdin.on("error", reject);
564
636
  });
565
637
  var formatProvider = (provider) => {
566
- const parts = [provider.name];
638
+ const parts = [`[${provider.id ?? "-"}] ${provider.name}`];
567
639
  if (provider.baseUrl) {
568
640
  parts.push(`(${provider.baseUrl})`);
569
641
  }
@@ -589,6 +661,18 @@ var findAvailablePort = async (start, attempts = 20) => {
589
661
  }
590
662
  throw new Error("No available port found.");
591
663
  };
664
+ var applyProviderById = async (id) => {
665
+ const config = await ensureConfig();
666
+ const nextConfig = setCurrentProviderById(config, id);
667
+ const provider = findProviderById(nextConfig, id);
668
+ if (!provider) {
669
+ throw new Error("Provider not found.");
670
+ }
671
+ assertProviderHasAuthToken(provider);
672
+ await saveConfig(nextConfig);
673
+ await applyProviderToClaudeSettings(provider);
674
+ return provider;
675
+ };
592
676
  program.name("claude-provider").description("Claude provider switcher");
593
677
  program.command("list").description("List configured providers").action(async () => {
594
678
  const config = await ensureConfig();
@@ -611,25 +695,63 @@ program.command("current").description("Show current provider").action(async ()
611
695
  }
612
696
  console.log(formatProvider(provider));
613
697
  });
614
- program.command("set").argument("<name>", "Provider name").description("Set current provider and apply to Claude settings").action(async (name) => {
698
+ program.command("set").argument("<id>", "Provider id").description("Set current provider by id and apply to Claude settings").action(async (id) => {
699
+ try {
700
+ const provider = await applyProviderById(id);
701
+ console.log(`Applied provider '${provider.name}'.`);
702
+ } catch (error) {
703
+ console.error(error.message);
704
+ process.exitCode = 1;
705
+ }
706
+ });
707
+ program.command("select").description("Interactively select provider and apply to Claude settings").action(async () => {
615
708
  const config = await ensureConfig();
616
- const nextConfig = setCurrentProvider(config, name);
617
- const provider = findProvider(nextConfig, name);
618
- if (!provider) {
619
- console.error("Provider not found.");
709
+ if (config.providers.length === 0) {
710
+ console.error("No providers configured.");
620
711
  process.exitCode = 1;
621
712
  return;
622
713
  }
714
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
715
+ console.error("Interactive select requires a TTY terminal.");
716
+ process.exitCode = 1;
717
+ return;
718
+ }
719
+ const current = config.current;
720
+ config.providers.forEach((provider, index) => {
721
+ const marker = provider.name === current ? "*" : " ";
722
+ console.log(`${index + 1}. ${marker} ${formatProvider(provider)}`);
723
+ });
724
+ const rl = import_promises4.default.createInterface({
725
+ input: process.stdin,
726
+ output: process.stdout
727
+ });
623
728
  try {
624
- assertProviderHasAuthToken(provider);
729
+ const answer = (await rl.question("Select provider by number: ")).trim();
730
+ const selectedIndex = Number.parseInt(answer, 10);
731
+ if (!Number.isInteger(selectedIndex) || selectedIndex < 1 || selectedIndex > config.providers.length) {
732
+ console.error("Invalid selection.");
733
+ process.exitCode = 1;
734
+ return;
735
+ }
736
+ const provider = config.providers[selectedIndex - 1];
737
+ if (!provider) {
738
+ console.error("Provider not found.");
739
+ process.exitCode = 1;
740
+ return;
741
+ }
742
+ if (!provider.id) {
743
+ console.error("Provider id is missing.");
744
+ process.exitCode = 1;
745
+ return;
746
+ }
747
+ const applied = await applyProviderById(provider.id);
748
+ console.log(`Applied provider '${applied.name}'.`);
625
749
  } catch (error) {
626
750
  console.error(error.message);
627
751
  process.exitCode = 1;
628
- return;
752
+ } finally {
753
+ rl.close();
629
754
  }
630
- await saveConfig(nextConfig);
631
- await applyProviderToClaudeSettings(provider);
632
- console.log(`Applied provider '${provider.name}'.`);
633
755
  });
634
756
  program.command("add").argument("<name>", "Provider name").option("--base-url <url>", "Base URL").option("--token <token>", "Auth token").option("--token-stdin", "Read auth token from stdin").option("--model <model>", "Model name").option("--website <url>", "Website URL").option("--description <text>", "Description").description("Add a custom provider").action(async (name, options) => {
635
757
  if (options.token && options.tokenStdin) {
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 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"]}
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 readline from \"node:readline/promises\";\nimport {\n addProvider,\n assertProviderHasAuthToken,\n applyProviderToClaudeSettings,\n ensureConfig,\n findProvider,\n findProviderById,\n removeProvider,\n saveConfig,\n setCurrentProviderById\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.id ?? \"-\"}] ${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\nconst applyProviderById = async (id: string): Promise<ProviderConfig> => {\n const config = await ensureConfig();\n const nextConfig = setCurrentProviderById(config, id);\n const provider = findProviderById(nextConfig, id);\n if (!provider) {\n throw new Error(\"Provider not found.\");\n }\n\n assertProviderHasAuthToken(provider);\n await saveConfig(nextConfig);\n await applyProviderToClaudeSettings(provider);\n return provider;\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(\"<id>\", \"Provider id\")\n .description(\"Set current provider by id and apply to Claude settings\")\n .action(async (id: string) => {\n try {\n const provider = await applyProviderById(id);\n console.log(`Applied provider '${provider.name}'.`);\n } catch (error) {\n console.error((error as Error).message);\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"select\")\n .description(\"Interactively select provider and apply to Claude settings\")\n .action(async () => {\n const config = await ensureConfig();\n if (config.providers.length === 0) {\n console.error(\"No providers configured.\");\n process.exitCode = 1;\n return;\n }\n\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n console.error(\"Interactive select requires a TTY terminal.\");\n process.exitCode = 1;\n return;\n }\n\n const current = config.current;\n config.providers.forEach((provider, index) => {\n const marker = provider.name === current ? \"*\" : \" \";\n console.log(`${index + 1}. ${marker} ${formatProvider(provider)}`);\n });\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n try {\n const answer = (await rl.question(\"Select provider by number: \")).trim();\n const selectedIndex = Number.parseInt(answer, 10);\n if (\n !Number.isInteger(selectedIndex) ||\n selectedIndex < 1 ||\n selectedIndex > config.providers.length\n ) {\n console.error(\"Invalid selection.\");\n process.exitCode = 1;\n return;\n }\n\n const provider = config.providers[selectedIndex - 1];\n if (!provider) {\n console.error(\"Provider not found.\");\n process.exitCode = 1;\n return;\n }\n if (!provider.id) {\n console.error(\"Provider id is missing.\");\n process.exitCode = 1;\n return;\n }\n\n const applied = await applyProviderById(provider.id);\n console.log(`Applied provider '${applied.name}'.`);\n } catch (error) {\n console.error((error as Error).message);\n process.exitCode = 1;\n } finally {\n rl.close();\n }\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 id: \"anthropic\",\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 id: \"zhipu\",\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 id: \"volc\",\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 id: \"custom\",\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();\nexport const normalizeProviderId = (id: string) =>\n id\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 24)\n .replace(/-+$/g, \"\");\nconst isAnthropicName = (name: string) => normalizeProviderName(name) === \"anthropic\";\nconst isAnthropicProvider = (provider: ProviderConfig) =>\n isAnthropicName(provider.name);\n\nconst toProviderIdBase = (provider: ProviderConfig) => {\n const explicitId =\n typeof provider.id === \"string\" ? normalizeProviderId(provider.id) : \"\";\n if (explicitId) {\n return explicitId;\n }\n\n const fromName = normalizeProviderId(provider.name);\n return fromName || \"provider\";\n};\n\nconst buildUniqueProviderId = (base: string, usedIds: Set<string>) => {\n if (!usedIds.has(base)) {\n usedIds.add(base);\n return base;\n }\n\n let index = 2;\n let candidate = `${base}-${index}`;\n while (usedIds.has(candidate)) {\n index += 1;\n candidate = `${base}-${index}`;\n }\n\n usedIds.add(candidate);\n return candidate;\n};\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 id:\n typeof provider.id === \"string\"\n ? normalizeProviderId(provider.id)\n : undefined\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 const usedIds = new Set<string>();\n const providersWithIds = Array.from(uniqueProviders.values()).map((provider) => {\n const id = buildUniqueProviderId(toProviderIdBase(provider), usedIds);\n return {\n ...provider,\n id\n };\n });\n\n return {\n version: CONFIG_VERSION,\n current: config.current ? normalizeProviderName(config.current) : null,\n providers: providersWithIds\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 findProviderByReference = (\n config: ConfigFile,\n reference: string\n): ProviderConfig | undefined => {\n const normalizedId = normalizeProviderId(reference);\n if (normalizedId) {\n const byId = config.providers.find((provider) => provider.id === normalizedId);\n if (byId) {\n return byId;\n }\n }\n\n return findProvider(config, reference);\n};\n\nexport const findProviderById = (\n config: ConfigFile,\n id: string\n): ProviderConfig | undefined => {\n const normalizedId = normalizeProviderId(id);\n if (!normalizedId) {\n return undefined;\n }\n return config.providers.find((provider) => provider.id === normalizedId);\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 const usedIds = new Set(\n config.providers\n .map((item) => (typeof item.id === \"string\" ? normalizeProviderId(item.id) : \"\"))\n .filter(Boolean)\n );\n const nextId = buildUniqueProviderId(\n toProviderIdBase({ ...provider, name: normalizedName }),\n usedIds\n );\n\n return {\n ...config,\n providers: [\n ...config.providers,\n {\n ...provider,\n id: nextId,\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 id: target.id,\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 provider = findProviderByReference(config, name);\n if (!provider) {\n throw new Error(`Provider '${name}' not found.`);\n }\n\n return {\n ...config,\n current: provider.name\n };\n};\n\nexport const setCurrentProviderById = (\n config: ConfigFile,\n id: string\n): ConfigFile => {\n const provider = findProviderById(config, id);\n if (!provider) {\n throw new Error(`Provider id '${id}' not found.`);\n }\n\n return {\n ...config,\n current: provider.name\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 findProviderByReference,\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 = findProviderByReference(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":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uBAAwB;AACxB,IAAAA,eAAiB;AACjB,iBAAgB;AAChB,IAAAC,mBAAqB;;;ACDd,IAAM,kBAAoC;AAAA,EAC/C;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AACF;;;AC3CA,sBAAe;;;ACAf,kBAAiB;AACjB,gBAAe;AAGR,IAAM,eAAe,CAAC,UAAwB,CAAC,MAAM;AAC1D,QAAM,oBAAoB,YAAAC,QAAK;AAAA,IAC7B,UAAAC,QAAG,QAAQ;AAAA,IACX;AAAA,IACA;AAAA,EACF;AACA,QAAM,qBACJ,QAAQ,cACR,QAAQ,IAAI,mBACZ,YAAAD,QAAK,KAAK,mBAAmB,aAAa;AAC5C,QAAM,oBACJ,QAAQ,aACR,QAAQ,IAAI,kBACZ,YAAAA,QAAK,QAAQ,kBAAkB;AAEjC,QAAM,oBAAoB,YAAAA,QAAK,KAAK,UAAAC,QAAG,QAAQ,GAAG,SAAS;AAC3D,QAAM,6BACJ,QAAQ,sBACR,QAAQ,IAAI,4BACZ,YAAAD,QAAK,KAAK,mBAAmB,eAAe;AAC9C,QAAM,oBACJ,QAAQ,aACR,QAAQ,IAAI,kBACZ,YAAAA,QAAK,QAAQ,0BAA0B;AAEzC,SAAO;AAAA,IACL,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,oBAAoB;AAAA,EACtB;AACF;;;AD7BA,IAAM,iBAAiB;AAEhB,IAAM,wBAAwB,CAAC,SAAiB,KAAK,KAAK,EAAE,YAAY;AACxE,IAAM,sBAAsB,CAAC,OAClC,GACG,KAAK,EACL,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,EACtB,MAAM,GAAG,EAAE,EACX,QAAQ,QAAQ,EAAE;AACvB,IAAM,kBAAkB,CAAC,SAAiB,sBAAsB,IAAI,MAAM;AAC1E,IAAM,sBAAsB,CAAC,aAC3B,gBAAgB,SAAS,IAAI;AAE/B,IAAM,mBAAmB,CAAC,aAA6B;AACrD,QAAM,aACJ,OAAO,SAAS,OAAO,WAAW,oBAAoB,SAAS,EAAE,IAAI;AACvE,MAAI,YAAY;AACd,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,oBAAoB,SAAS,IAAI;AAClD,SAAO,YAAY;AACrB;AAEA,IAAM,wBAAwB,CAAC,MAAc,YAAyB;AACpE,MAAI,CAAC,QAAQ,IAAI,IAAI,GAAG;AACtB,YAAQ,IAAI,IAAI;AAChB,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ;AACZ,MAAI,YAAY,GAAG,IAAI,IAAI,KAAK;AAChC,SAAO,QAAQ,IAAI,SAAS,GAAG;AAC7B,aAAS;AACT,gBAAY,GAAG,IAAI,IAAI,KAAK;AAAA,EAC9B;AAEA,UAAQ,IAAI,SAAS;AACrB,SAAO;AACT;AAEO,IAAM,sBAAsB,OAAmB;AAAA,EACpD,SAAS;AAAA,EACT,SAAS,gBAAgB,CAAC,GAAG,QAAQ;AAAA,EACrC,WAAW,gBAAgB,IAAI,CAAC,cAAc,EAAE,GAAG,SAAS,EAAE;AAChE;AAEA,IAAM,eAAe,OAAU,aAAiC;AAC9D,QAAM,MAAM,MAAM,gBAAAE,QAAG,SAAS,UAAU,MAAM;AAC9C,SAAO,KAAK,MAAM,GAAG;AACvB;AAEA,IAAM,sBAAsB,OAAO,aAAqB;AACtD,MAAI;AACF,UAAM,gBAAAA,QAAG,MAAM,UAAU,GAAK;AAAA,EAChC,QAAQ;AAAA,EAER;AACF;AAEA,IAAM,gBAAgB,OAAO,UAAkB,SAAkB;AAC/D,QAAM,UAAU,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA;AAChD,QAAM,gBAAAA,QAAG,UAAU,UAAU,SAAS,EAAE,UAAU,QAAQ,MAAM,IAAM,CAAC;AACvE,QAAM,oBAAoB,QAAQ;AACpC;AAEO,IAAM,eAAe,OAAO,UAAwB,CAAC,MAA2B;AACrF,QAAM,EAAE,WAAW,WAAW,IAAI,aAAa,OAAO;AACtD,QAAM,gBAAAA,QAAG,MAAM,WAAW,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAE1D,MAAI;AACF,UAAM,SAAS,MAAM,aAAyB,UAAU;AACxD,WAAO,gBAAgB,MAAM;AAAA,EAC/B,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,YAAM;AAAA,IACR;AAEA,UAAM,SAAS,oBAAoB;AACnC,UAAM,cAAc,YAAY,MAAM;AACtC,WAAO;AAAA,EACT;AACF;AAEO,IAAM,aAAa,OACxB,QACA,UAAwB,CAAC,MACP;AAClB,QAAM,EAAE,WAAW,WAAW,IAAI,aAAa,OAAO;AACtD,QAAM,gBAAAA,QAAG,MAAM,WAAW,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAC1D,QAAM,cAAc,YAAY,gBAAgB,MAAM,CAAC;AACzD;AAEO,IAAM,kBAAkB,CAAC,WAAmC;AACjE,QAAM,YAAY,MAAM,QAAQ,OAAO,SAAS,IAAI,OAAO,YAAY,CAAC;AACxE,QAAM,sBAAsB,UACzB,OAAO,CAAC,aAAyC,QAAQ,UAAU,IAAI,CAAC,EACxE,IAAI,CAAC,cAAc;AAAA,IAClB,GAAG;AAAA,IACH,MAAM,sBAAsB,SAAS,IAAI;AAAA,IACzC,IACE,OAAO,SAAS,OAAO,WACnB,oBAAoB,SAAS,EAAE,IAC/B;AAAA,EACR,EAAE;AAEJ,QAAM,kBAAkB,oBAAI,IAA4B;AACxD,aAAW,YAAY,qBAAqB;AAC1C,QAAI,CAAC,gBAAgB,IAAI,SAAS,IAAI,GAAG;AACvC,sBAAgB,IAAI,SAAS,MAAM,QAAQ;AAAA,IAC7C;AAAA,EACF;AAEA,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,mBAAmB,MAAM,KAAK,gBAAgB,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa;AAC9E,UAAM,KAAK,sBAAsB,iBAAiB,QAAQ,GAAG,OAAO;AACpE,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS,OAAO,UAAU,sBAAsB,OAAO,OAAO,IAAI;AAAA,IAClE,WAAW;AAAA,EACb;AACF;AAEO,IAAM,eAAe,CAC1B,QACA,SAC+B;AAC/B,QAAM,aAAa,sBAAsB,IAAI;AAC7C,SAAO,OAAO,UAAU,KAAK,CAAC,aAAa,SAAS,SAAS,UAAU;AACzE;AAEO,IAAM,0BAA0B,CACrC,QACA,cAC+B;AAC/B,QAAM,eAAe,oBAAoB,SAAS;AAClD,MAAI,cAAc;AAChB,UAAM,OAAO,OAAO,UAAU,KAAK,CAAC,aAAa,SAAS,OAAO,YAAY;AAC7E,QAAI,MAAM;AACR,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,aAAa,QAAQ,SAAS;AACvC;AAEO,IAAM,mBAAmB,CAC9B,QACA,OAC+B;AAC/B,QAAM,eAAe,oBAAoB,EAAE;AAC3C,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AACA,SAAO,OAAO,UAAU,KAAK,CAAC,aAAa,SAAS,OAAO,YAAY;AACzE;AAEO,IAAM,2BAA2B,CAAC,aAA6B;AACpE,MAAI,CAAC,SAAS,KAAK,KAAK,GAAG;AACzB,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AACA,MAAI,CAAC,SAAS,WAAW,CAAC,SAAS,QAAQ,KAAK,GAAG;AACjD,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AACA,MAAI,CAAC,SAAS,aAAa,CAAC,SAAS,UAAU,KAAK,GAAG;AACrD,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACA,MAAI;AACF,QAAI,IAAI,SAAS,OAAO;AAAA,EAC1B,QAAQ;AACN,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AACA,MAAI,SAAS,SAAS;AACpB,QAAI;AACF,UAAI,IAAI,SAAS,OAAO;AAAA,IAC1B,QAAQ;AACN,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AAAA,EACF;AACF;AAEO,IAAM,6BAA6B,CAAC,aAA6B;AACtE,MAAI,oBAAoB,QAAQ,GAAG;AACjC;AAAA,EACF;AACA,MAAI,CAAC,SAAS,WAAW,CAAC,SAAS,QAAQ,KAAK,GAAG;AACjD,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AACA,MAAI,CAAC,SAAS,aAAa,CAAC,SAAS,UAAU,KAAK,GAAG;AACrD,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACF;AAEO,IAAM,cAAc,CACzB,QACA,aACe;AACf,QAAM,iBAAiB,sBAAsB,SAAS,IAAI;AAC1D,MAAI,OAAO,UAAU,KAAK,CAAC,SAAS,KAAK,SAAS,cAAc,GAAG;AACjE,UAAM,IAAI,MAAM,aAAa,cAAc,mBAAmB;AAAA,EAChE;AAEA,2BAAyB,QAAQ;AAEjC,QAAM,UAAU,IAAI;AAAA,IAClB,OAAO,UACJ,IAAI,CAAC,SAAU,OAAO,KAAK,OAAO,WAAW,oBAAoB,KAAK,EAAE,IAAI,EAAG,EAC/E,OAAO,OAAO;AAAA,EACnB;AACA,QAAM,SAAS;AAAA,IACb,iBAAiB,EAAE,GAAG,UAAU,MAAM,eAAe,CAAC;AAAA,IACtD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW;AAAA,MACT,GAAG,OAAO;AAAA,MACV;AAAA,QACE,GAAG;AAAA,QACH,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,iBAAiB,CAC5B,QACA,MACA,YACe;AACf,QAAM,iBAAiB,sBAAsB,IAAI;AACjD,QAAM,SAAS,aAAa,QAAQ,cAAc;AAClD,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,aAAa,cAAc,cAAc;AAAA,EAC3D;AACA,MAAI,gBAAgB,cAAc,KAAK,OAAO,QAAQ;AACpD,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AAEA,QAAM,gBACJ,OAAO,QAAQ,cAAc,YAAY,QAAQ,UAAU,KAAK,IAC5D,QAAQ,YACR,OAAO;AAEb,QAAM,kBAAkC;AAAA,IACtC,IAAI,OAAO;AAAA,IACX,MAAM;AAAA,IACN,SAAS,QAAQ,YAAY,SAAY,QAAQ,UAAU,OAAO;AAAA,IAClE,WAAW;AAAA,IACX,OAAO,QAAQ,UAAU,SAAY,QAAQ,QAAQ,OAAO;AAAA,IAC5D,SAAS,QAAQ,YAAY,SAAY,QAAQ,UAAU,OAAO;AAAA,IAClE,aACE,QAAQ,gBAAgB,SAAY,QAAQ,cAAc,OAAO;AAAA,IACnE,QAAQ,OAAO;AAAA,EACjB;AAEA,2BAAyB,eAAe;AAExC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW,OAAO,UAAU;AAAA,MAAI,CAAC,aAC/B,SAAS,SAAS,iBAAiB,kBAAkB;AAAA,IACvD;AAAA,EACF;AACF;AAEO,IAAM,iBAAiB,CAAC,QAAoB,SAA6B;AAC9E,QAAM,iBAAiB,sBAAsB,IAAI;AACjD,QAAM,SAAS,aAAa,QAAQ,cAAc;AAClD,MAAI,UAAU,gBAAgB,cAAc,KAAK,OAAO,QAAQ;AAC9D,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AACA,QAAM,YAAY,OAAO,UAAU;AAAA,IACjC,CAAC,aAAa,SAAS,SAAS;AAAA,EAClC;AAEA,MAAI,UAAU,WAAW,OAAO,UAAU,QAAQ;AAChD,UAAM,IAAI,MAAM,aAAa,cAAc,cAAc;AAAA,EAC3D;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS,OAAO,YAAY,iBAAiB,OAAO,OAAO;AAAA,IAC3D;AAAA,EACF;AACF;AAEO,IAAM,qBAAqB,CAAC,QAAoB,SAA6B;AAClF,QAAM,WAAW,wBAAwB,QAAQ,IAAI;AACrD,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,aAAa,IAAI,cAAc;AAAA,EACjD;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS,SAAS;AAAA,EACpB;AACF;AAEO,IAAM,yBAAyB,CACpC,QACA,OACe;AACf,QAAM,WAAW,iBAAiB,QAAQ,EAAE;AAC5C,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,gBAAgB,EAAE,cAAc;AAAA,EAClD;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS,SAAS;AAAA,EACpB;AACF;;;AEzUA,IAAAC,mBAAe;AACf,IAAAC,eAAiB;AAIjB,IAAM,gBAAgB;AACtB,IAAM,sBACJ;AAOF,IAAMC,gBAAe,OAAU,aAAiC;AAC9D,QAAM,MAAM,MAAM,iBAAAC,QAAG,SAAS,UAAU,MAAM;AAC9C,SAAO,KAAK,MAAM,GAAG;AACvB;AAEA,IAAMC,uBAAsB,OAAO,aAAqB;AACtD,MAAI;AACF,UAAM,iBAAAD,QAAG,MAAM,UAAU,GAAK;AAAA,EAChC,QAAQ;AAAA,EAER;AACF;AAEA,IAAME,iBAAgB,OAAO,UAAkB,SAAkB;AAC/D,QAAM,UAAU,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA;AAChD,QAAM,iBAAAF,QAAG,UAAU,UAAU,SAAS,EAAE,UAAU,QAAQ,MAAM,IAAM,CAAC;AACvE,QAAMC,qBAAoB,QAAQ;AACpC;AAEO,IAAM,qBAAqB,OAChC,UAAwB,CAAC,MACG;AAC5B,QAAM,EAAE,mBAAmB,IAAI,aAAa,OAAO;AAEnD,MAAI;AACF,WAAO,MAAMF,cAA6B,kBAAkB;AAAA,EAC9D,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,YAAM;AAAA,IACR;AACA,WAAO,CAAC;AAAA,EACV;AACF;AAQA,IAAM,cAAc,OAAO,cAAsB;AAC/C,MAAI;AACF,UAAM,UAAU,MAAM,iBAAAC,QAAG,QAAQ,WAAW,EAAE,eAAe,KAAK,CAAC;AACnE,WAAO,QACJ;AAAA,MACC,CAAC,UAAU,MAAM,OAAO,KAAK,MAAM,KAAK,WAAW,aAAa;AAAA,IAClE,EACC,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,EAC9B,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO,CAAC;AAAA,IACV;AACA,UAAM;AAAA,EACR;AACF;AAEA,IAAM,eAAe,OAAO,WAAmB,OAAO,MAAM;AAC1D,QAAM,UAAU,MAAM,YAAY,SAAS;AAC3C,MAAI,QAAQ,UAAU,MAAM;AAC1B;AAAA,EACF;AAEA,QAAM,cAAc,MAAM,QAAQ;AAAA,IAChC,QAAQ,IAAI,OAAO,SAAS;AAC1B,YAAM,WAAW,aAAAG,QAAK,KAAK,WAAW,IAAI;AAC1C,YAAM,OAAO,MAAM,iBAAAH,QAAG,KAAK,QAAQ;AACnC,aAAO,EAAE,MAAM,UAAU,OAAO,KAAK,QAAQ;AAAA,IAC/C,CAAC;AAAA,EACH;AAEA,cAAY,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAC5C,QAAM,WAAW,YAAY,MAAM,IAAI;AAEvC,QAAM,QAAQ,IAAI,SAAS,IAAI,CAAC,WAAW,iBAAAA,QAAG,OAAO,OAAO,QAAQ,CAAC,CAAC;AACxE;AAEA,IAAM,uBAAuB,OAC3B,oBACA,cACG;AACH,MAAI;AACF,UAAM,iBAAAA,QAAG,OAAO,kBAAkB;AAAA,EACpC,QAAQ;AACN;AAAA,EACF;AAEA,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,QAAM,aAAa,GAAG,aAAa,GAAG,SAAS;AAC/C,QAAM,aAAa,aAAAG,QAAK,KAAK,WAAW,UAAU;AAElD,QAAM,iBAAAH,QAAG,SAAS,oBAAoB,UAAU;AAChD,QAAMC,qBAAoB,UAAU;AACpC,QAAM,aAAa,WAAW,CAAC;AACjC;AAEO,IAAM,4BAA4B,OACvC,UAAwB,CAAC,MACW;AACpC,QAAM,EAAE,UAAU,IAAI,aAAa,OAAO;AAC1C,QAAM,QAAQ,MAAM,YAAY,SAAS;AAEzC,QAAM,UAAU,MAAM,QAAQ;AAAA,IAC5B,MAAM,IAAI,OAAO,SAAS;AACxB,YAAM,WAAW,aAAAE,QAAK,KAAK,WAAW,IAAI;AAC1C,YAAM,OAAO,MAAM,iBAAAH,QAAG,KAAK,QAAQ;AACnC,aAAO,EAAE,MAAM,OAAO,KAAK,SAAS,MAAM,KAAK,KAAK;AAAA,IACtD,CAAC;AAAA,EACH;AAEA,SAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACjD;AAEO,IAAM,8BAA8B,OACzC,MACA,UAAwB,CAAC,MACP;AAClB,MAAI,CAAC,QAAQ,CAAC,oBAAoB,KAAK,IAAI,GAAG;AAC5C,UAAM,IAAI,MAAM,sBAAsB;AAAA,EACxC;AAEA,QAAM,EAAE,WAAW,mBAAmB,IAAI,aAAa,OAAO;AAC9D,QAAM,oBAAoB,aAAAG,QAAK,QAAQ,SAAS;AAChD,QAAM,aAAa,aAAAA,QAAK,QAAQ,WAAW,IAAI;AAC/C,QAAM,eAAe,aAAAA,QAAK,SAAS,mBAAmB,UAAU;AAChE,MAAI,aAAa,WAAW,IAAI,KAAK,aAAAA,QAAK,WAAW,YAAY,GAAG;AAClE,UAAM,IAAI,MAAM,sBAAsB;AAAA,EACxC;AAEA,QAAM,iBAAAH,QAAG,MAAM,WAAW,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAC1D,QAAM,qBAAqB,oBAAoB,SAAS;AACxD,QAAM,iBAAAA,QAAG,SAAS,YAAY,kBAAkB;AAChD,QAAMC,qBAAoB,kBAAkB;AAC9C;AAEO,IAAM,gCAAgC,OAC3C,UACA,UAAwB,CAAC,MACG;AAC5B,QAAM,EAAE,WAAW,mBAAmB,IAAI,aAAa,OAAO;AAE9D,QAAM,iBAAAD,QAAG,MAAM,WAAW,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAC1D,QAAM,WAAW,MAAM,mBAAmB,OAAO;AACjD,QAAM,MACJ,SAAS,OAAO,OAAO,SAAS,QAAQ,WACpC,EAAE,GAAI,SAAS,IAA+B,IAC9C,CAAC;AAEP,QAAM,cACJ,SAAS,QAAQ,SAAS,KAAK,KAAK,EAAE,YAAY,MAAM;AAE1D,MAAI,aAAa;AACf,WAAO,IAAI;AACX,WAAO,IAAI;AACX,WAAO,IAAI;AAAA,EACb,OAAO;AACL,QAAI,qBAAqB,SAAS,WAAW;AAC7C,QAAI,uBAAuB,SAAS,aAAa;AAEjD,QAAI,SAAS,SAAS,SAAS,MAAM,KAAK,GAAG;AAC3C,UAAI,kBAAkB,SAAS,MAAM,KAAK;AAAA,IAC5C,OAAO;AACL,aAAO,IAAI;AAAA,IACb;AAAA,EACF;AACA,MAAI,iBAAiB;AACrB,MAAI,aAAa;AACf,WAAO,IAAI;AAAA,EACb,OAAO;AACL,QAAI,2CAA2C;AAAA,EACjD;AAEA,QAAM,eAAe;AAAA,IACnB,GAAG;AAAA,IACH;AAAA,EACF;AAEA,QAAM,qBAAqB,oBAAoB,SAAS;AACxD,QAAME,eAAc,oBAAoB,YAAY;AAEpD,SAAO;AACT;;;AClMA,qBAAoB;AACpB,IAAAE,eAAiB;AACjB,IAAAC,mBAAe;AAsBR,IAAM,8BAA8B,CACzC,cACoB;AAAA,EACpB,GAAG;AAAA,EACH,WAAW,SAAS,YAAY,QAAQ;AAC1C;AAEO,IAAM,+BAA+B,CAC1C,cACqB,UAAU,IAAI,2BAA2B;AAEhE,IAAM,aAAa,OAAO,YAA0B,aAAa,OAAO;AAExE,IAAM,gBAAgB,OAAO,eAAwB;AACnD,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,QAAQ,MAAM,iBAAAC,QAAG,KAAK,UAAU;AACtC,QAAI,MAAM,YAAY,GAAG;AACvB,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,IAAM,YAAY,OACvB,UAAyB,CAAC,MACG;AAC7B,QAAM,UAAM,eAAAC,SAAQ;AACpB,MAAI,IAAI,eAAAA,QAAQ,KAAK,CAAC;AAEtB,MAAI,IAAI,kBAAkB,OAAO,MAAM,QAAQ;AAC7C,UAAM,SAAS,MAAM,WAAW,OAAO;AACvC,QAAI,KAAK;AAAA,MACP,WAAW,6BAA6B,OAAO,SAAS;AAAA,MACxD,SAAS,OAAO;AAAA,IAClB,CAAC;AAAA,EACH,CAAC;AAED,MAAI,KAAK,kBAAkB,OAAO,KAAK,QAAQ;AAC7C,QAAI;AACF,YAAM,SAAS,MAAM,WAAW,OAAO;AACvC,YAAM,UAAU,IAAI;AACpB,YAAM,aAAa,YAAY,QAAQ,OAAO;AAC9C,YAAM,WAAW,YAAY,OAAO;AACpC,UACG,OAAO,GAAG,EACV,KAAK,EAAE,WAAW,6BAA6B,WAAW,SAAS,EAAE,CAAC;AAAA,IAC3E,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAQ,MAAgB,QAAQ,CAAC;AAAA,IAC1D;AAAA,EACF,CAAC;AAED,MAAI,IAAI,wBAAwB,OAAO,KAAK,QAAQ;AAClD,QAAI;AACF,YAAM,SAAS,MAAM,WAAW,OAAO;AACvC,YAAM,UAAU,IAAI;AACpB,YAAM,aAAa,eAAe,QAAQ,IAAI,OAAO,MAAM,OAAO;AAClE,YAAM,WAAW,YAAY,OAAO;AACpC,UAAI,KAAK,EAAE,WAAW,6BAA6B,WAAW,SAAS,EAAE,CAAC;AAAA,IAC5E,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAQ,MAAgB,QAAQ,CAAC;AAAA,IAC1D;AAAA,EACF,CAAC;AAED,MAAI,OAAO,wBAAwB,OAAO,KAAK,QAAQ;AACrD,QAAI;AACF,YAAM,SAAS,MAAM,WAAW,OAAO;AACvC,YAAM,aAAa,eAAe,QAAQ,IAAI,OAAO,IAAI;AACzD,YAAM,WAAW,YAAY,OAAO;AACpC,UAAI,KAAK;AAAA,QACP,WAAW,6BAA6B,WAAW,SAAS;AAAA,QAC5D,SAAS,WAAW;AAAA,MACtB,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAQ,MAAgB,QAAQ,CAAC;AAAA,IAC1D;AAAA,EACF,CAAC;AAED,MAAI,IAAI,gBAAgB,OAAO,MAAM,QAAQ;AAC3C,UAAM,SAAS,MAAM,WAAW,OAAO;AACvC,UAAM,WAAW,OAAO,UACpB,aAAa,QAAQ,OAAO,OAAO,IACnC;AACJ,QAAI,KAAK;AAAA,MACP,SAAS,OAAO;AAAA,MAChB,UAAU,WAAW,4BAA4B,QAAQ,IAAI;AAAA,IAC/D,CAAC;AAAA,EACH,CAAC;AAED,MAAI,IAAI,gBAAgB,OAAO,MAAM,QAAQ;AAC3C,UAAM,UAAU,MAAM,0BAA0B,OAAO;AACvD,QAAI,KAAK,EAAE,QAAQ,CAAC;AAAA,EACtB,CAAC;AAED,MAAI,KAAK,wBAAwB,OAAO,KAAK,QAAQ;AACnD,QAAI;AACF,YAAM,EAAE,KAAK,IAAI,IAAI;AACrB,UAAI,CAAC,MAAM;AACT,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,2BAA2B,CAAC;AAC1D;AAAA,MACF;AACA,YAAM,4BAA4B,MAAM,OAAO;AAC/C,UAAI,KAAK,EAAE,UAAU,KAAK,CAAC;AAAA,IAC7B,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAQ,MAAgB,QAAQ,CAAC;AAAA,IAC1D;AAAA,EACF,CAAC;AAED,MAAI,KAAK,gBAAgB,OAAO,KAAK,QAAQ;AAC3C,QAAI;AACF,YAAM,SAAS,MAAM,WAAW,OAAO;AACvC,YAAM,EAAE,KAAK,IAAI,IAAI;AACrB,UAAI,CAAC,MAAM;AACT,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,6BAA6B,CAAC;AAC5D;AAAA,MACF;AAEA,YAAM,aAAa,mBAAmB,QAAQ,IAAI;AAClD,YAAM,WAAW,wBAAwB,YAAY,IAAI;AACzD,UAAI,CAAC,UAAU;AACb,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,sBAAsB,CAAC;AACrD;AAAA,MACF;AAEA,UAAI;AACF,mCAA2B,QAAQ;AAAA,MACrC,SAAS,OAAO;AACd,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAQ,MAAgB,QAAQ,CAAC;AACxD;AAAA,MACF;AAEA,YAAM,WAAW,YAAY,OAAO;AACpC,YAAM,8BAA8B,UAAU,OAAO;AAErD,UAAI,KAAK;AAAA,QACP,SAAS,WAAW;AAAA,QACpB,UAAU,4BAA4B,QAAQ;AAAA,MAChD,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAQ,MAAgB,QAAQ,CAAC;AAAA,IAC1D;AAAA,EACF,CAAC;AAED,QAAM,SAAS,MAAM,cAAc,QAAQ,UAAU;AACrD,MAAI,QAAQ;AACV,QAAI,IAAI,eAAAA,QAAQ,OAAO,MAAM,CAAC;AAC9B,QAAI,IAAI,KAAK,OAAO,MAAM,QAAQ;AAChC,UAAI,SAAS,aAAAC,QAAK,KAAK,QAAQ,YAAY,CAAC;AAAA,IAC9C,CAAC;AAAA,EACH,OAAO;AACL,QAAI,IAAI,KAAK,CAAC,MAAM,QAAQ;AAC1B,UACG,OAAO,GAAG,EACV;AAAA,QACC;AAAA,MACF;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEO,IAAM,cAAc,OACzB,SACA,SACoB;AACpB,QAAM,MAAM,MAAM,UAAU,OAAO;AACnC,SAAO,IAAI,OAAO,MAAM,WAAW;AACrC;;;ALpLA,IAAM,gBAAgB,aAAAC,QAAK,QAAQ,WAAW,IAAI;AAElD,IAAM,UAAU,IAAI,yBAAQ;AAE5B,IAAM,qBAAqB,YACzB,MAAM,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC7C,MAAI,QAAQ;AACZ,UAAQ,MAAM,YAAY,MAAM;AAChC,UAAQ,MAAM,GAAG,QAAQ,CAAC,UAAU;AAClC,aAAS;AAAA,EACX,CAAC;AACD,UAAQ,MAAM,GAAG,OAAO,MAAM,QAAQ,MAAM,KAAK,CAAC,CAAC;AACnD,UAAQ,MAAM,GAAG,SAAS,MAAM;AAClC,CAAC;AAEH,IAAM,iBAAiB,CAAC,aAA6B;AACnD,QAAM,QAAQ,CAAC,IAAI,SAAS,MAAM,GAAG,KAAK,SAAS,IAAI,EAAE;AACzD,MAAI,SAAS,SAAS;AACpB,UAAM,KAAK,IAAI,SAAS,OAAO,GAAG;AAAA,EACpC;AACA,MAAI,SAAS,OAAO;AAClB,UAAM,KAAK,WAAW,SAAS,KAAK,GAAG;AAAA,EACzC;AACA,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,IAAM,oBAAoB,OAAO,OAAe,WAAW,OAAO;AAChE,WAAS,IAAI,GAAG,IAAI,UAAU,KAAK,GAAG;AACpC,UAAM,OAAO,QAAQ;AACrB,UAAM,YAAY,MAAM,IAAI,QAAiB,CAAC,YAAY;AACxD,YAAM,SAAS,WAAAC,QAAI,aAAa;AAChC,aAAO,KAAK,SAAS,MAAM,QAAQ,KAAK,CAAC;AACzC,aAAO,KAAK,aAAa,MAAM;AAC7B,eAAO,MAAM,MAAM,QAAQ,IAAI,CAAC;AAAA,MAClC,CAAC;AACD,aAAO,OAAO,MAAM,WAAW;AAAA,IACjC,CAAC;AAED,QAAI,WAAW;AACb,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,0BAA0B;AAC5C;AAEA,IAAM,oBAAoB,OAAO,OAAwC;AACvE,QAAM,SAAS,MAAM,aAAa;AAClC,QAAM,aAAa,uBAAuB,QAAQ,EAAE;AACpD,QAAM,WAAW,iBAAiB,YAAY,EAAE;AAChD,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,qBAAqB;AAAA,EACvC;AAEA,6BAA2B,QAAQ;AACnC,QAAM,WAAW,UAAU;AAC3B,QAAM,8BAA8B,QAAQ;AAC5C,SAAO;AACT;AAEA,QAAQ,KAAK,iBAAiB,EAAE,YAAY,0BAA0B;AAEtE,QACG,QAAQ,MAAM,EACd,YAAY,2BAA2B,EACvC,OAAO,YAAY;AAClB,QAAM,SAAS,MAAM,aAAa;AAClC,QAAM,UAAU,OAAO;AAEvB,aAAW,YAAY,OAAO,WAAW;AACvC,UAAM,SAAS,SAAS,SAAS,UAAU,MAAM;AACjD,YAAQ,IAAI,GAAG,MAAM,IAAI,eAAe,QAAQ,CAAC,EAAE;AAAA,EACrD;AACF,CAAC;AAEH,QACG,QAAQ,SAAS,EACjB,YAAY,uBAAuB,EACnC,OAAO,YAAY;AAClB,QAAM,SAAS,MAAM,aAAa;AAClC,MAAI,CAAC,OAAO,SAAS;AACnB,YAAQ,IAAI,uBAAuB;AACnC;AAAA,EACF;AAEA,QAAM,WAAW,aAAa,QAAQ,OAAO,OAAO;AACpD,MAAI,CAAC,UAAU;AACb,YAAQ,IAAI,uCAAuC;AACnD;AAAA,EACF;AAEA,UAAQ,IAAI,eAAe,QAAQ,CAAC;AACtC,CAAC;AAEH,QACG,QAAQ,KAAK,EACb,SAAS,QAAQ,aAAa,EAC9B,YAAY,yDAAyD,EACrE,OAAO,OAAO,OAAe;AAC5B,MAAI;AACF,UAAM,WAAW,MAAM,kBAAkB,EAAE;AAC3C,YAAQ,IAAI,qBAAqB,SAAS,IAAI,IAAI;AAAA,EACpD,SAAS,OAAO;AACd,YAAQ,MAAO,MAAgB,OAAO;AACtC,YAAQ,WAAW;AAAA,EACrB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,4DAA4D,EACxE,OAAO,YAAY;AAClB,QAAM,SAAS,MAAM,aAAa;AAClC,MAAI,OAAO,UAAU,WAAW,GAAG;AACjC,YAAQ,MAAM,0BAA0B;AACxC,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,MAAM,SAAS,CAAC,QAAQ,OAAO,OAAO;AACjD,YAAQ,MAAM,6CAA6C;AAC3D,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,UAAU,OAAO;AACvB,SAAO,UAAU,QAAQ,CAAC,UAAU,UAAU;AAC5C,UAAM,SAAS,SAAS,SAAS,UAAU,MAAM;AACjD,YAAQ,IAAI,GAAG,QAAQ,CAAC,KAAK,MAAM,IAAI,eAAe,QAAQ,CAAC,EAAE;AAAA,EACnE,CAAC;AAED,QAAM,KAAK,iBAAAC,QAAS,gBAAgB;AAAA,IAClC,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,EAClB,CAAC;AAED,MAAI;AACF,UAAM,UAAU,MAAM,GAAG,SAAS,6BAA6B,GAAG,KAAK;AACvE,UAAM,gBAAgB,OAAO,SAAS,QAAQ,EAAE;AAChD,QACE,CAAC,OAAO,UAAU,aAAa,KAC/B,gBAAgB,KAChB,gBAAgB,OAAO,UAAU,QACjC;AACA,cAAQ,MAAM,oBAAoB;AAClC,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,WAAW,OAAO,UAAU,gBAAgB,CAAC;AACnD,QAAI,CAAC,UAAU;AACb,cAAQ,MAAM,qBAAqB;AACnC,cAAQ,WAAW;AACnB;AAAA,IACF;AACA,QAAI,CAAC,SAAS,IAAI;AAChB,cAAQ,MAAM,yBAAyB;AACvC,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,UAAU,MAAM,kBAAkB,SAAS,EAAE;AACnD,YAAQ,IAAI,qBAAqB,QAAQ,IAAI,IAAI;AAAA,EACnD,SAAS,OAAO;AACd,YAAQ,MAAO,MAAgB,OAAO;AACtC,YAAQ,WAAW;AAAA,EACrB,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF,CAAC;AAEH,QACG,QAAQ,KAAK,EACb,SAAS,UAAU,eAAe,EAClC,OAAO,oBAAoB,UAAU,EACrC,OAAO,mBAAmB,YAAY,EACtC,OAAO,iBAAiB,4BAA4B,EACpD,OAAO,mBAAmB,YAAY,EACtC,OAAO,mBAAmB,aAAa,EACvC,OAAO,wBAAwB,aAAa,EAC5C,YAAY,uBAAuB,EACnC,OAAO,OACN,MACA,YAQG;AACH,MAAI,QAAQ,SAAS,QAAQ,YAAY;AACvC,YAAQ,MAAM,gDAAgD;AAC9D,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,MAAI,YAAY,QAAQ,OAAO,KAAK,KAAK;AACzC,MAAI,QAAQ,YAAY;AACtB,QAAI,QAAQ,MAAM,OAAO;AACvB,cAAQ,MAAM,4CAA4C;AAC1D,cAAQ,WAAW;AACnB;AAAA,IACF;AACA,gBAAY,MAAM,mBAAmB;AAAA,EACvC;AAEA,MAAI,CAAC,QAAQ,SAAS,KAAK,GAAG;AAC5B,YAAQ,MAAM,uBAAuB;AACrC,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,MAAI,CAAC,WAAW;AACd,YAAQ,MAAM,yBAAyB;AACvC,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,QAAM,SAAS,MAAM,aAAa;AAClC,QAAM,WAA2B;AAAA,IAC/B;AAAA,IACA,SAAS,QAAQ;AAAA,IACjB;AAAA,IACA,OAAO,QAAQ;AAAA,IACf,SAAS,QAAQ;AAAA,IACjB,aAAa,QAAQ;AAAA,IACrB,QAAQ;AAAA,EACV;AAEA,QAAM,aAAa,YAAY,QAAQ,QAAQ;AAC/C,QAAM,WAAW,UAAU;AAC3B,UAAQ,IAAI,mBAAmB,IAAI,IAAI;AACzC,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,SAAS,UAAU,eAAe,EAClC,YAAY,mBAAmB,EAC/B,OAAO,OAAO,SAAiB;AAC9B,QAAM,SAAS,MAAM,aAAa;AAClC,QAAM,aAAa,eAAe,QAAQ,IAAI;AAC9C,QAAM,WAAW,UAAU;AAC3B,UAAQ,IAAI,qBAAqB,IAAI,IAAI;AAC3C,CAAC;AAEH,QACG,QAAQ,OAAO,EACf,YAAY,mCAAmC,EAC/C,OAAO,iBAAiB,QAAQ,CAAC,UAAU,OAAO,KAAK,CAAC,EACxD,OAAO,OAAO,YAA+B;AAC5C,QAAM,gBAAgB,QAAQ,QAAQ;AACtC,QAAM,OAAO,MAAM,kBAAkB,eAAe,EAAE;AACtD,QAAM,SAAS,MAAM,YAAY,EAAE,YAAY,cAAc,GAAG,IAAI;AAEpE,SAAO,GAAG,aAAa,MAAM;AAC3B,YAAQ,IAAI,sCAAsC,IAAI,EAAE;AAAA,EAC1D,CAAC;AACH,CAAC;AAEH,QAAQ,WAAW,QAAQ,IAAI;","names":["import_path","import_promises","path","os","fs","import_promises","import_path","readJsonFile","fs","ensureOwnerOnlyFile","writeJsonFile","path","import_path","import_promises","fs","express","path","path","net","readline"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-provider-switch",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "CLI + local web UI for switching Claude Code providers",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/ladieman217/claude-provider-switch#readme",