@jsonstudio/rcc 0.89.1136 → 0.89.1189

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.
Files changed (134) hide show
  1. package/dist/build-info.js +2 -2
  2. package/dist/cli/commands/clean.d.ts +16 -0
  3. package/dist/cli/commands/clean.js +58 -0
  4. package/dist/cli/commands/clean.js.map +1 -0
  5. package/dist/cli/commands/code.d.ts +55 -0
  6. package/dist/cli/commands/code.js +376 -0
  7. package/dist/cli/commands/code.js.map +1 -0
  8. package/dist/cli/commands/config.d.ts +31 -0
  9. package/dist/cli/commands/config.js +168 -0
  10. package/dist/cli/commands/config.js.map +1 -0
  11. package/dist/cli/commands/env.d.ts +20 -0
  12. package/dist/cli/commands/env.js +73 -0
  13. package/dist/cli/commands/env.js.map +1 -0
  14. package/dist/cli/commands/examples.d.ts +5 -0
  15. package/dist/cli/commands/examples.js +66 -0
  16. package/dist/cli/commands/examples.js.map +1 -0
  17. package/dist/cli/commands/port.d.ts +24 -0
  18. package/dist/cli/commands/port.js +85 -0
  19. package/dist/cli/commands/port.js.map +1 -0
  20. package/dist/cli/commands/restart.d.ts +50 -0
  21. package/dist/cli/commands/restart.js +176 -0
  22. package/dist/cli/commands/restart.js.map +1 -0
  23. package/dist/cli/commands/start.d.ts +68 -0
  24. package/dist/cli/commands/start.js +295 -0
  25. package/dist/cli/commands/start.js.map +1 -0
  26. package/dist/cli/commands/status.d.ts +16 -0
  27. package/dist/cli/commands/status.js +104 -0
  28. package/dist/cli/commands/status.js.map +1 -0
  29. package/dist/cli/commands/stop.d.ts +35 -0
  30. package/dist/cli/commands/stop.js +95 -0
  31. package/dist/cli/commands/stop.js.map +1 -0
  32. package/dist/cli/logger.d.ts +8 -0
  33. package/dist/cli/logger.js +9 -0
  34. package/dist/cli/logger.js.map +1 -0
  35. package/dist/cli/main.d.ts +6 -0
  36. package/dist/cli/main.js +16 -0
  37. package/dist/cli/main.js.map +1 -0
  38. package/dist/cli/program.d.ts +8 -0
  39. package/dist/cli/program.js +16 -0
  40. package/dist/cli/program.js.map +1 -0
  41. package/dist/cli/register/basic-commands.d.ts +30 -0
  42. package/dist/cli/register/basic-commands.js +11 -0
  43. package/dist/cli/register/basic-commands.js.map +1 -0
  44. package/dist/cli/register/code-command.d.ts +3 -0
  45. package/dist/cli/register/code-command.js +5 -0
  46. package/dist/cli/register/code-command.js.map +1 -0
  47. package/dist/cli/register/restart-command.d.ts +3 -0
  48. package/dist/cli/register/restart-command.js +5 -0
  49. package/dist/cli/register/restart-command.js.map +1 -0
  50. package/dist/cli/register/start-command.d.ts +3 -0
  51. package/dist/cli/register/start-command.js +5 -0
  52. package/dist/cli/register/start-command.js.map +1 -0
  53. package/dist/cli/register/status-config-commands.d.ts +16 -0
  54. package/dist/cli/register/status-config-commands.js +7 -0
  55. package/dist/cli/register/status-config-commands.js.map +1 -0
  56. package/dist/cli/register/stop-command.d.ts +3 -0
  57. package/dist/cli/register/stop-command.js +5 -0
  58. package/dist/cli/register/stop-command.js.map +1 -0
  59. package/dist/cli/runtime.d.ts +5 -0
  60. package/dist/cli/runtime.js +11 -0
  61. package/dist/cli/runtime.js.map +1 -0
  62. package/dist/cli/server/port-utils.d.ts +52 -0
  63. package/dist/cli/server/port-utils.js +193 -0
  64. package/dist/cli/server/port-utils.js.map +1 -0
  65. package/dist/cli/spinner.d.ts +10 -0
  66. package/dist/cli/spinner.js +59 -0
  67. package/dist/cli/spinner.js.map +1 -0
  68. package/dist/cli/utils/normalize.d.ts +2 -0
  69. package/dist/cli/utils/normalize.js +22 -0
  70. package/dist/cli/utils/normalize.js.map +1 -0
  71. package/dist/cli/utils/safe-read-json.d.ts +1 -0
  72. package/dist/cli/utils/safe-read-json.js +11 -0
  73. package/dist/cli/utils/safe-read-json.js.map +1 -0
  74. package/dist/cli.js +148 -1775
  75. package/dist/cli.js.map +1 -1
  76. package/dist/client/anthropic/anthropic-protocol-client.js +4 -3
  77. package/dist/client/anthropic/anthropic-protocol-client.js.map +1 -1
  78. package/dist/client/gemini-cli/gemini-cli-protocol-client.d.ts +1 -1
  79. package/dist/client/gemini-cli/gemini-cli-protocol-client.js +10 -3
  80. package/dist/client/gemini-cli/gemini-cli-protocol-client.js.map +1 -1
  81. package/dist/commands/quota-daemon.js +2 -2
  82. package/dist/commands/quota-daemon.js.map +1 -1
  83. package/dist/config/provider-v2-loader.js +4 -2
  84. package/dist/config/provider-v2-loader.js.map +1 -1
  85. package/dist/manager/modules/quota/index.js +21 -4
  86. package/dist/manager/modules/quota/index.js.map +1 -1
  87. package/dist/manager/modules/routing/index.js.map +1 -1
  88. package/dist/manager/storage/file-store.js +1 -1
  89. package/dist/manager/storage/file-store.js.map +1 -1
  90. package/dist/providers/auth/oauth-lifecycle.js +2 -2
  91. package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
  92. package/dist/providers/core/api/provider-config.d.ts +2 -0
  93. package/dist/providers/core/api/provider-types.d.ts +2 -0
  94. package/dist/providers/core/runtime/base-provider.js +21 -27
  95. package/dist/providers/core/runtime/base-provider.js.map +1 -1
  96. package/dist/providers/core/runtime/gemini-cli-http-provider.d.ts +1 -0
  97. package/dist/providers/core/runtime/gemini-cli-http-provider.js +37 -5
  98. package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
  99. package/dist/providers/core/runtime/http-request-executor.js +23 -29
  100. package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
  101. package/dist/providers/core/runtime/http-transport-provider.js +20 -0
  102. package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
  103. package/dist/providers/core/utils/http-client.d.ts +9 -0
  104. package/dist/providers/core/utils/http-client.js +9 -11
  105. package/dist/providers/core/utils/http-client.js.map +1 -1
  106. package/dist/providers/core/utils/provider-error-reporter.js +2 -6
  107. package/dist/providers/core/utils/provider-error-reporter.js.map +1 -1
  108. package/dist/providers/mock/mock-provider-runtime.js +19 -5
  109. package/dist/providers/mock/mock-provider-runtime.js.map +1 -1
  110. package/dist/server/runtime/http-server/index.d.ts +1 -0
  111. package/dist/server/runtime/http-server/index.js +70 -11
  112. package/dist/server/runtime/http-server/index.js.map +1 -1
  113. package/dist/server/runtime/http-server/request-executor.js +9 -1
  114. package/dist/server/runtime/http-server/request-executor.js.map +1 -1
  115. package/dist/server/runtime/http-server/routes.js +8 -4
  116. package/dist/server/runtime/http-server/routes.js.map +1 -1
  117. package/dist/server/runtime/http-server/stats-manager.js +9 -3
  118. package/dist/server/runtime/http-server/stats-manager.js.map +1 -1
  119. package/package.json +10 -4
  120. package/scripts/anthropic-compare-modes.mjs +40 -3
  121. package/scripts/antigravity-smoke.mjs +180 -0
  122. package/scripts/backfill-apply-patch-exec-errorsamples.mjs +225 -0
  123. package/scripts/compare-codex-rccx.mjs +59 -1
  124. package/scripts/compare-responses-request.mjs +50 -4
  125. package/scripts/lib/errorsamples.mjs +23 -0
  126. package/scripts/mock-provider/run-regressions.mjs +12 -2
  127. package/scripts/policy-violations-report.mjs +257 -0
  128. package/scripts/publish-rcc.mjs +16 -2
  129. package/scripts/tests/unified-hub-responses-enforce-safe.mjs +37 -0
  130. package/scripts/tests/unified-hub-shadow-regression.mjs +55 -0
  131. package/scripts/unified-hub-shadow-compare.mjs +359 -0
  132. package/scripts/verify-e2e-gemini-followup-sample.mjs +269 -0
  133. package/scripts/virtual-router-shadow-v2-real.mjs +71 -1
  134. package/scripts/virtual-router-shadow-v2.mjs +41 -0
@@ -1,6 +1,6 @@
1
1
  export const buildInfo = {
2
2
  mode: 'release',
3
- version: '0.89.1136',
4
- buildTime: '2026-01-17T08:01:20.116Z'
3
+ version: '0.89.1189',
4
+ buildTime: '2026-01-18T12:12:39.663Z'
5
5
  };
6
6
  //# sourceMappingURL=build-info.js.map
@@ -0,0 +1,16 @@
1
+ import fs from 'node:fs';
2
+ import type { Command } from 'commander';
3
+ type LoggerLike = {
4
+ info: (msg: string) => void;
5
+ warning: (msg: string) => void;
6
+ success: (msg: string) => void;
7
+ };
8
+ export type CleanCommandContext = {
9
+ logger: LoggerLike;
10
+ getHomeDir?: () => string;
11
+ getCwd?: () => string;
12
+ fsImpl?: Pick<typeof fs, 'existsSync' | 'readdirSync' | 'rmSync'>;
13
+ joinPath?: (...parts: string[]) => string;
14
+ };
15
+ export declare function createCleanCommand(program: Command, ctx: CleanCommandContext): void;
16
+ export {};
@@ -0,0 +1,58 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ export function createCleanCommand(program, ctx) {
5
+ const getHomeDir = ctx.getHomeDir ?? (() => homedir());
6
+ const getCwd = ctx.getCwd ?? (() => process.cwd());
7
+ const fsImpl = ctx.fsImpl ?? fs;
8
+ const joinPath = ctx.joinPath ?? path.join;
9
+ program
10
+ .command('clean')
11
+ .description('Clean captured data and debug logs')
12
+ .option('-y, --yes', 'Confirm deletion without prompt')
13
+ .option('--what <targets>', 'Targets to clean: captures,logs,all', 'all')
14
+ .action(async (options) => {
15
+ const confirm = Boolean(options.yes);
16
+ const what = String(options.what || 'all');
17
+ if (!confirm) {
18
+ ctx.logger.warning('Add --yes to confirm deletion.');
19
+ ctx.logger.info('Example: rcc clean --yes --what all');
20
+ return;
21
+ }
22
+ const home = getHomeDir();
23
+ const targets = [];
24
+ if (what === 'captures' || what === 'all') {
25
+ targets.push({ path: joinPath(home, '.routecodex', 'codex-samples'), label: 'captures' });
26
+ }
27
+ if (what === 'logs' || what === 'all') {
28
+ targets.push({ path: joinPath(getCwd(), 'debug-logs'), label: 'debug-logs' });
29
+ targets.push({ path: joinPath(home, '.routecodex', 'logs'), label: 'user-logs' });
30
+ }
31
+ let removedAny = false;
32
+ for (const t of targets) {
33
+ try {
34
+ if (fsImpl.existsSync(t.path)) {
35
+ const entries = fsImpl.readdirSync(t.path);
36
+ for (const name of entries) {
37
+ const p = joinPath(t.path, name);
38
+ try {
39
+ fsImpl.rmSync(p, { recursive: true, force: true });
40
+ removedAny = true;
41
+ }
42
+ catch (e) {
43
+ ctx.logger.warning(`Failed to remove ${p}: ${e.message}`);
44
+ }
45
+ }
46
+ ctx.logger.success(`Cleared ${t.label} at ${t.path}`);
47
+ }
48
+ }
49
+ catch (e) {
50
+ ctx.logger.warning(`Unable to access ${t.label} at ${t.path}: ${e.message}`);
51
+ }
52
+ }
53
+ if (!removedAny) {
54
+ ctx.logger.info('Nothing to clean.');
55
+ }
56
+ });
57
+ }
58
+ //# sourceMappingURL=clean.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clean.js","sourceRoot":"","sources":["../../../src/cli/commands/clean.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import type { ChildProcess, SpawnOptions } from 'node:child_process';
4
+ import type { Command } from 'commander';
5
+ type Spinner = {
6
+ start(text?: string): Spinner;
7
+ succeed(text?: string): void;
8
+ fail(text?: string): void;
9
+ warn(text?: string): void;
10
+ info(text?: string): void;
11
+ stop(): void;
12
+ text: string;
13
+ };
14
+ type LoggerLike = {
15
+ info: (msg: string) => void;
16
+ warning: (msg: string) => void;
17
+ success: (msg: string) => void;
18
+ error: (msg: string) => void;
19
+ };
20
+ export type CodeCommandOptions = {
21
+ port?: string;
22
+ host: string;
23
+ url?: string;
24
+ config?: string;
25
+ apikey?: string;
26
+ claudePath?: string;
27
+ cwd?: string;
28
+ model?: string;
29
+ profile?: string;
30
+ ensureServer?: boolean;
31
+ };
32
+ export type CodeCommandContext = {
33
+ isDevPackage: boolean;
34
+ isWindows: boolean;
35
+ defaultDevPort: number;
36
+ nodeBin: string;
37
+ createSpinner: (text: string) => Promise<Spinner>;
38
+ logger: LoggerLike;
39
+ env: NodeJS.ProcessEnv;
40
+ rawArgv: string[];
41
+ fsImpl?: typeof fs;
42
+ pathImpl?: typeof path;
43
+ homedir: () => string;
44
+ cwd?: () => string;
45
+ sleep: (ms: number) => Promise<void>;
46
+ fetch: typeof fetch;
47
+ spawn: (command: string, args: string[], options: SpawnOptions) => ChildProcess;
48
+ getModulesConfigPath: () => string;
49
+ resolveServerEntryPath: () => string;
50
+ waitForever: () => Promise<void>;
51
+ onSignal?: (signal: NodeJS.Signals, cb: () => void) => void;
52
+ exit: (code: number) => never;
53
+ };
54
+ export declare function createCodeCommand(program: Command, ctx: CodeCommandContext): void;
55
+ export {};
@@ -0,0 +1,376 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { LOCAL_HOSTS } from '../../constants/index.js';
4
+ function parseServerUrl(raw) {
5
+ const trimmed = String(raw || '').trim();
6
+ if (!trimmed) {
7
+ throw new Error('--url is empty');
8
+ }
9
+ let parsed;
10
+ try {
11
+ parsed = new URL(trimmed);
12
+ }
13
+ catch {
14
+ parsed = new URL(`http://${trimmed}`);
15
+ }
16
+ const protocol = parsed.protocol === 'https:' ? 'https' : 'http';
17
+ const host = parsed.hostname;
18
+ const hasExplicitPort = Boolean(parsed.port && parsed.port.trim());
19
+ const port = hasExplicitPort ? Number(parsed.port) : null;
20
+ const rawPath = typeof parsed.pathname === 'string' ? parsed.pathname : '';
21
+ const basePath = rawPath && rawPath !== '/' ? rawPath.replace(/\/+$/, '') : '';
22
+ return { protocol, host, port: Number.isFinite(port) ? port : null, basePath };
23
+ }
24
+ function readConfigApiKey(fsImpl, configPath) {
25
+ try {
26
+ if (!configPath || !fsImpl.existsSync(configPath)) {
27
+ return null;
28
+ }
29
+ const txt = fsImpl.readFileSync(configPath, 'utf8');
30
+ const cfg = JSON.parse(txt);
31
+ const direct = cfg?.httpserver?.apikey ?? cfg?.modules?.httpserver?.config?.apikey ?? cfg?.server?.apikey;
32
+ const value = typeof direct === 'string' ? direct.trim() : '';
33
+ return value ? value : null;
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ function normalizeConnectHost(host) {
40
+ const v = String(host || '').toLowerCase();
41
+ // NOTE: routecodex expects local base URLs to use 0.0.0.0 (not 127.0.0.1) for compatibility
42
+ // with environments where loopback is not reachable from the launched tool process.
43
+ if (v === '0.0.0.0')
44
+ return '0.0.0.0';
45
+ if (v === '::' || v === '::1' || v === 'localhost')
46
+ return '0.0.0.0';
47
+ return host || '0.0.0.0';
48
+ }
49
+ export function createCodeCommand(program, ctx) {
50
+ const fsImpl = ctx.fsImpl ?? fs;
51
+ const pathImpl = ctx.pathImpl ?? path;
52
+ const getCwd = ctx.cwd ?? (() => process.cwd());
53
+ program
54
+ .command('code')
55
+ .description('Launch Claude Code interface with RouteCodex as proxy (args after this command are passed to Claude by default)')
56
+ .option('-p, --port <port>', 'RouteCodex server port (overrides config file)')
57
+ .option('-h, --host <host>', 'RouteCodex server host', LOCAL_HOSTS.ANY)
58
+ .option('--url <url>', 'RouteCodex base URL (overrides host/port), e.g. https://code.codewhisper.cc')
59
+ .option('-c, --config <config>', 'RouteCodex configuration file path')
60
+ .option('--apikey <apikey>', 'RouteCodex server apikey (defaults to httpserver.apikey in config when present)')
61
+ .option('--claude-path <path>', 'Path to Claude Code executable', 'claude')
62
+ .option('--cwd <dir>', 'Working directory for Claude Code (defaults to current shell cwd)')
63
+ .option('--model <model>', 'Model to use with Claude Code')
64
+ .option('--profile <profile>', 'Claude Code profile to use')
65
+ .option('--ensure-server', 'Ensure RouteCodex server is running before launching Claude')
66
+ .argument('[extraArgs...]', 'Additional args to pass through to Claude')
67
+ .allowUnknownOption(true)
68
+ .allowExcessArguments(true)
69
+ .action(async (extraArgs = [], options) => {
70
+ const extraArgsFromCommander = Array.isArray(extraArgs) ? extraArgs : [];
71
+ const spinner = await ctx.createSpinner('Preparing Claude Code with RouteCodex...');
72
+ try {
73
+ let configPath = options.config;
74
+ if (!configPath) {
75
+ configPath = pathImpl.join(ctx.homedir(), '.routecodex', 'config.json');
76
+ }
77
+ let actualProtocol = 'http';
78
+ let actualPort = options.port ? parseInt(options.port, 10) : null;
79
+ let actualHost = options.host;
80
+ let actualBasePath = '';
81
+ if (options.url && String(options.url).trim()) {
82
+ const parsed = parseServerUrl(options.url);
83
+ actualProtocol = parsed.protocol;
84
+ actualHost = parsed.host || actualHost;
85
+ actualPort = parsed.port ?? actualPort;
86
+ actualBasePath = parsed.basePath;
87
+ }
88
+ // Determine effective port for code command:
89
+ // - dev package (routecodex): env override, otherwise固定 DEFAULT_DEV_PORT,不读取配置端口
90
+ // - release package (rcc): 按配置/参数解析端口
91
+ if (ctx.isDevPackage) {
92
+ if (!actualPort) {
93
+ const envPort = Number(ctx.env.ROUTECODEX_PORT || ctx.env.RCC_PORT || NaN);
94
+ actualPort = Number.isFinite(envPort) && envPort > 0 ? envPort : ctx.defaultDevPort;
95
+ ctx.logger.info(`Using dev default port ${actualPort} for routecodex code (config ports ignored)`);
96
+ }
97
+ }
98
+ else {
99
+ if (!actualPort && fsImpl.existsSync(configPath) && !(options.url && String(options.url).trim())) {
100
+ try {
101
+ const configContent = fsImpl.readFileSync(configPath, 'utf8');
102
+ const config = JSON.parse(configContent);
103
+ actualPort = (config?.httpserver?.port ?? config?.server?.port ?? config?.port) || null;
104
+ actualHost = config?.httpserver?.host || config?.server?.host || config?.host || actualHost;
105
+ }
106
+ catch {
107
+ spinner.warn('Failed to read configuration file, using defaults');
108
+ }
109
+ }
110
+ }
111
+ if (!(options.url && String(options.url).trim()) && !actualPort) {
112
+ spinner.fail('Invalid or missing port configuration for RouteCodex server');
113
+ ctx.logger.error('Please set httpserver.port in your configuration (e.g., ~/.routecodex/config.json) or use --port');
114
+ ctx.exit(1);
115
+ }
116
+ const configuredApiKey = (typeof options.apikey === 'string' && options.apikey.trim() ? options.apikey.trim() : null) ??
117
+ (typeof ctx.env.ROUTECODEX_APIKEY === 'string' && ctx.env.ROUTECODEX_APIKEY.trim()
118
+ ? ctx.env.ROUTECODEX_APIKEY.trim()
119
+ : null) ??
120
+ (typeof ctx.env.RCC_APIKEY === 'string' && ctx.env.RCC_APIKEY.trim() ? ctx.env.RCC_APIKEY.trim() : null) ??
121
+ readConfigApiKey(fsImpl, configPath);
122
+ const connectHost = normalizeConnectHost(actualHost);
123
+ const portPart = actualPort ? `:${actualPort}` : '';
124
+ const serverUrl = `${actualProtocol}://${connectHost}${portPart}${actualBasePath}`;
125
+ if (options.ensureServer) {
126
+ spinner.text = 'Checking RouteCodex server status...';
127
+ try {
128
+ const controller = new AbortController();
129
+ const timeoutId = setTimeout(() => controller.abort(), 3000);
130
+ const headers = configuredApiKey ? { 'x-api-key': configuredApiKey } : undefined;
131
+ const response = await ctx.fetch(`${serverUrl}/ready`, { signal: controller.signal, method: 'GET', headers });
132
+ clearTimeout(timeoutId);
133
+ if (!response.ok)
134
+ throw new Error('Server not ready');
135
+ const j = await response.json().catch(() => ({}));
136
+ if (j?.status !== 'ready')
137
+ throw new Error('Server reported not_ready');
138
+ spinner.succeed('RouteCodex server is ready');
139
+ }
140
+ catch (error) {
141
+ if (options.url && String(options.url).trim()) {
142
+ spinner.fail('RouteCodex server is not reachable (ensure-server with --url cannot auto-start)');
143
+ ctx.logger.error(error instanceof Error ? error.message : String(error));
144
+ ctx.exit(1);
145
+ }
146
+ spinner.info('RouteCodex server is not running, starting it...');
147
+ const serverProcess = ctx.spawn(ctx.nodeBin, [ctx.resolveServerEntryPath(), ctx.getModulesConfigPath()], {
148
+ stdio: 'pipe',
149
+ env: { ...ctx.env },
150
+ detached: true
151
+ });
152
+ try {
153
+ serverProcess.unref?.();
154
+ }
155
+ catch {
156
+ // ignore
157
+ }
158
+ spinner.text = 'Waiting for RouteCodex server to become ready...';
159
+ let ready = false;
160
+ for (let i = 0; i < 30; i++) {
161
+ await ctx.sleep(1000);
162
+ try {
163
+ const headers = configuredApiKey ? { 'x-api-key': configuredApiKey } : undefined;
164
+ const res = await ctx.fetch(`${serverUrl}/ready`, { method: 'GET', headers });
165
+ if (res.ok) {
166
+ const jr = await res.json().catch(() => ({}));
167
+ if (jr?.status === 'ready') {
168
+ ready = true;
169
+ break;
170
+ }
171
+ }
172
+ }
173
+ catch {
174
+ /* ignore */
175
+ }
176
+ }
177
+ if (ready) {
178
+ spinner.succeed('RouteCodex server is ready');
179
+ }
180
+ else {
181
+ spinner.warn('RouteCodex server may not be fully ready, continuing...');
182
+ }
183
+ }
184
+ }
185
+ spinner.text = 'Launching Claude Code...';
186
+ const resolvedBaseHost = normalizeConnectHost(actualHost);
187
+ const anthropicBase = `${actualProtocol}://${resolvedBaseHost}${portPart}${actualBasePath}`;
188
+ const currentCwd = (() => {
189
+ try {
190
+ const d = options.cwd ? String(options.cwd) : getCwd();
191
+ const resolved = pathImpl.resolve(d);
192
+ if (fsImpl.existsSync(resolved)) {
193
+ return resolved;
194
+ }
195
+ }
196
+ catch {
197
+ return getCwd();
198
+ }
199
+ return getCwd();
200
+ })();
201
+ const claudeEnv = {
202
+ ...ctx.env,
203
+ PWD: currentCwd,
204
+ RCC_WORKDIR: currentCwd,
205
+ ROUTECODEX_WORKDIR: currentCwd,
206
+ CLAUDE_WORKDIR: currentCwd,
207
+ ANTHROPIC_BASE_URL: anthropicBase,
208
+ ANTHROPIC_API_URL: anthropicBase,
209
+ ANTHROPIC_API_KEY: configuredApiKey || 'rcc-proxy-key'
210
+ };
211
+ try {
212
+ delete claudeEnv['ANTHROPIC_AUTH_TOKEN'];
213
+ }
214
+ catch {
215
+ /* ignore */
216
+ }
217
+ try {
218
+ delete claudeEnv['ANTHROPIC_TOKEN'];
219
+ }
220
+ catch {
221
+ /* ignore */
222
+ }
223
+ ctx.logger.info('Unset ANTHROPIC_AUTH_TOKEN/ANTHROPIC_TOKEN for Claude process to avoid conflicts');
224
+ ctx.logger.info(`Setting Anthropic base URL to: ${anthropicBase}`);
225
+ const claudeArgs = [];
226
+ if (options.model) {
227
+ claudeArgs.push('--model', options.model);
228
+ }
229
+ if (options.profile) {
230
+ claudeArgs.push('--profile', options.profile);
231
+ }
232
+ // passthrough args after `code`
233
+ try {
234
+ const rawArgv = Array.isArray(ctx.rawArgv) ? ctx.rawArgv : [];
235
+ const idxCode = rawArgv.findIndex((a) => a === 'code');
236
+ const afterCode = idxCode >= 0 ? rawArgv.slice(idxCode + 1) : [];
237
+ const sepIndex = afterCode.indexOf('--');
238
+ const tail = sepIndex >= 0 ? afterCode.slice(sepIndex + 1) : afterCode;
239
+ const knownOpts = new Set([
240
+ '-p',
241
+ '--port',
242
+ '-h',
243
+ '--host',
244
+ '--url',
245
+ '-c',
246
+ '--config',
247
+ '--apikey',
248
+ '--claude-path',
249
+ '--model',
250
+ '--profile',
251
+ '--ensure-server'
252
+ ]);
253
+ const requireValue = new Set([
254
+ '-p',
255
+ '--port',
256
+ '-h',
257
+ '--host',
258
+ '--url',
259
+ '-c',
260
+ '--config',
261
+ '--apikey',
262
+ '--claude-path',
263
+ '--model',
264
+ '--profile'
265
+ ]);
266
+ const passThrough = [];
267
+ for (let i = 0; i < tail.length; i++) {
268
+ const tok = tail[i];
269
+ if (knownOpts.has(tok)) {
270
+ if (requireValue.has(tok)) {
271
+ i++;
272
+ }
273
+ continue;
274
+ }
275
+ if (tok.startsWith('--')) {
276
+ const eq = tok.indexOf('=');
277
+ if (eq > 2) {
278
+ const optName = tok.slice(0, eq);
279
+ if (knownOpts.has(optName))
280
+ continue;
281
+ }
282
+ }
283
+ passThrough.push(tok);
284
+ }
285
+ const merged = [];
286
+ const seen = new Set();
287
+ const pushUnique = (arr) => {
288
+ for (const t of arr) {
289
+ if (!seen.has(t)) {
290
+ seen.add(t);
291
+ merged.push(t);
292
+ }
293
+ }
294
+ };
295
+ pushUnique(extraArgsFromCommander);
296
+ pushUnique(passThrough);
297
+ if (merged.length) {
298
+ claudeArgs.push(...merged);
299
+ }
300
+ }
301
+ catch {
302
+ /* ignore passthrough errors */
303
+ }
304
+ const claudeBin = (() => {
305
+ try {
306
+ const v = String(options?.claudePath || '').trim();
307
+ if (v)
308
+ return v;
309
+ }
310
+ catch {
311
+ // ignore
312
+ }
313
+ const envPath = String(ctx.env.CLAUDE_PATH || '').trim();
314
+ return envPath || 'claude';
315
+ })();
316
+ const shouldUseShell = ctx.isWindows &&
317
+ !pathImpl.extname(claudeBin) &&
318
+ !claudeBin.includes('/') &&
319
+ !claudeBin.includes('\\\\');
320
+ const claudeProcess = ctx.spawn(claudeBin, claudeArgs, {
321
+ stdio: 'inherit',
322
+ env: claudeEnv,
323
+ cwd: currentCwd,
324
+ shell: shouldUseShell
325
+ });
326
+ spinner.succeed('Claude Code launched with RouteCodex proxy');
327
+ ctx.logger.info(`Using RouteCodex server at: http://${resolvedBaseHost}:${actualPort}`);
328
+ ctx.logger.info(`Claude binary: ${claudeBin}`);
329
+ ctx.logger.info(`Working directory for Claude: ${currentCwd}`);
330
+ ctx.logger.info('Press Ctrl+C to exit Claude Code');
331
+ const shutdown = async (sig) => {
332
+ try {
333
+ claudeProcess.kill(sig);
334
+ }
335
+ catch {
336
+ /* ignore */
337
+ }
338
+ ctx.exit(0);
339
+ };
340
+ const onSignal = ctx.onSignal ?? ((sig, cb) => process.on(sig, cb));
341
+ onSignal('SIGINT', () => {
342
+ void shutdown('SIGINT');
343
+ });
344
+ onSignal('SIGTERM', () => {
345
+ void shutdown('SIGTERM');
346
+ });
347
+ claudeProcess.on('error', (err) => {
348
+ try {
349
+ ctx.logger.error(`Failed to launch Claude Code (${claudeBin}): ${err instanceof Error ? err.message : String(err)}`);
350
+ if (ctx.isWindows && shouldUseShell) {
351
+ ctx.logger.error('Tip: If Claude is installed via npm, ensure the shim is in PATH (e.g. claude.cmd).');
352
+ }
353
+ }
354
+ catch {
355
+ /* ignore */
356
+ }
357
+ ctx.exit(1);
358
+ });
359
+ claudeProcess.on('exit', (code, signal) => {
360
+ if (signal) {
361
+ ctx.exit(0);
362
+ }
363
+ else {
364
+ ctx.exit(code ?? 0);
365
+ }
366
+ });
367
+ await ctx.waitForever();
368
+ }
369
+ catch (error) {
370
+ spinner.fail('Failed to launch Claude Code');
371
+ ctx.logger.error(error instanceof Error ? error.message : String(error));
372
+ ctx.exit(1);
373
+ }
374
+ });
375
+ }
376
+ //# sourceMappingURL=code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code.js","sourceRoot":"","sources":["../../../src/cli/commands/code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { spawn } from 'node:child_process';
4
+ import type { Command } from 'commander';
5
+ type Spinner = {
6
+ start(text?: string): Spinner;
7
+ succeed(text?: string): void;
8
+ fail(text?: string): void;
9
+ warn(text?: string): void;
10
+ info(text?: string): void;
11
+ stop(): void;
12
+ text: string;
13
+ };
14
+ type LoggerLike = {
15
+ info: (msg: string) => void;
16
+ warning: (msg: string) => void;
17
+ success: (msg: string) => void;
18
+ error: (msg: string) => void;
19
+ };
20
+ export type ConfigCommandContext = {
21
+ logger: LoggerLike;
22
+ createSpinner: (text: string) => Promise<Spinner>;
23
+ getHomeDir?: () => string;
24
+ fsImpl?: Pick<typeof fs, 'existsSync' | 'readFileSync' | 'writeFileSync' | 'mkdirSync'>;
25
+ pathImpl?: Pick<typeof path, 'join' | 'dirname'>;
26
+ spawnImpl?: typeof spawn;
27
+ env?: Record<string, string | undefined>;
28
+ log?: (line: string) => void;
29
+ };
30
+ export declare function createConfigCommand(program: Command, ctx: ConfigCommandContext): void;
31
+ export {};