@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
@@ -0,0 +1,104 @@
1
+ import { LOCAL_HOSTS } from '../../constants/index.js';
2
+ function pickPortHost(userConfig) {
3
+ const portCandidate = userConfig?.httpserver?.port ?? userConfig?.server?.port ?? userConfig?.port;
4
+ const port = typeof portCandidate === 'number' && Number.isFinite(portCandidate) ? portCandidate : null;
5
+ const hostCandidate = typeof userConfig?.httpserver?.host === 'string'
6
+ ? userConfig.httpserver.host
7
+ : (typeof userConfig?.server?.host === 'string' ? userConfig.server.host : userConfig?.host);
8
+ const host = typeof hostCandidate === 'string' && hostCandidate.trim() ? hostCandidate.trim() : LOCAL_HOSTS.LOCALHOST;
9
+ return { port, host };
10
+ }
11
+ async function checkServer(ctx, port, host) {
12
+ const startedAt = Date.now();
13
+ const controller = new AbortController();
14
+ const t = setTimeout(() => {
15
+ try {
16
+ controller.abort();
17
+ }
18
+ catch {
19
+ /* ignore */
20
+ }
21
+ }, 5000);
22
+ try {
23
+ const url = `http://${host}:${port}/health`;
24
+ const res = await ctx.fetch(url, { method: 'GET', signal: controller.signal });
25
+ const responseTime = Date.now() - startedAt;
26
+ if (!res.ok) {
27
+ return { status: 'error', port, host, responseTime };
28
+ }
29
+ const data = await res.json().catch(() => null);
30
+ const status = data?.status ? String(data.status) : 'unknown';
31
+ return { status, port, host, responseTime };
32
+ }
33
+ catch (error) {
34
+ const responseTime = Date.now() - startedAt;
35
+ const message = error instanceof Error ? error.message : String(error);
36
+ const isTimeout = message.toLowerCase().includes('aborted') || message.toLowerCase().includes('timeout');
37
+ return { status: isTimeout ? 'timeout' : 'stopped', port, host, responseTime, error: message };
38
+ }
39
+ finally {
40
+ clearTimeout(t);
41
+ }
42
+ }
43
+ function printHuman(ctx, status) {
44
+ const normalized = status.status === 'healthy' || status.status === 'ready' ? 'running' : status.status;
45
+ switch (normalized) {
46
+ case 'running':
47
+ ctx.logger.success(`Server is running on ${status.host}:${status.port}`);
48
+ break;
49
+ case 'stopped':
50
+ ctx.logger.error('Server is not running');
51
+ break;
52
+ case 'error':
53
+ ctx.logger.error('Server is in error state');
54
+ break;
55
+ default:
56
+ ctx.logger.warning('Server status unknown');
57
+ }
58
+ }
59
+ export function createStatusCommand(program, ctx) {
60
+ program
61
+ .command('status')
62
+ .description('Show server status')
63
+ .option('-j, --json', 'Output in JSON format')
64
+ .action(async (options) => {
65
+ try {
66
+ let loaded = null;
67
+ try {
68
+ loaded = await ctx.loadConfig();
69
+ }
70
+ catch {
71
+ loaded = null;
72
+ }
73
+ if (!loaded) {
74
+ ctx.logger.error('Configuration file not found');
75
+ ctx.logger.info('Please create a configuration file first:');
76
+ ctx.logger.info(' rcc config init');
77
+ if (options.json) {
78
+ ctx.log(JSON.stringify({ error: 'Configuration file not found' }, null, 2));
79
+ }
80
+ return;
81
+ }
82
+ const { port, host } = pickPortHost(loaded.userConfig);
83
+ if (!port || port <= 0) {
84
+ const errorMsg = 'Invalid or missing port configuration in configuration file';
85
+ ctx.logger.error(errorMsg);
86
+ if (options.json) {
87
+ ctx.log(JSON.stringify({ error: errorMsg }, null, 2));
88
+ }
89
+ return;
90
+ }
91
+ const status = await checkServer(ctx, port, host);
92
+ if (options.json) {
93
+ ctx.log(JSON.stringify(status, null, 2));
94
+ }
95
+ else {
96
+ printHuman(ctx, status);
97
+ }
98
+ }
99
+ catch (error) {
100
+ ctx.logger.error(`Status check failed: ${error instanceof Error ? error.message : String(error)}`);
101
+ }
102
+ });
103
+ }
104
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import type { Command } from 'commander';
4
+ type Spinner = {
5
+ start(text?: string): Spinner;
6
+ succeed(text?: string): void;
7
+ fail(text?: string): void;
8
+ warn(text?: string): void;
9
+ info(text?: string): void;
10
+ stop(): void;
11
+ text: string;
12
+ };
13
+ type LoggerLike = {
14
+ info: (msg: string) => void;
15
+ error: (msg: string) => void;
16
+ };
17
+ export type StopCommandContext = {
18
+ isDevPackage: boolean;
19
+ defaultDevPort: number;
20
+ createSpinner: (text: string) => Promise<Spinner>;
21
+ logger: LoggerLike;
22
+ findListeningPids: (port: number) => number[];
23
+ killPidBestEffort: (pid: number, opts: {
24
+ force: boolean;
25
+ }) => void;
26
+ sleep: (ms: number) => Promise<void>;
27
+ stopTokenDaemonIfRunning?: () => Promise<void>;
28
+ env?: Record<string, string | undefined>;
29
+ fsImpl?: Pick<typeof fs, 'existsSync' | 'readFileSync'>;
30
+ pathImpl?: Pick<typeof path, 'join'>;
31
+ getHomeDir?: () => string;
32
+ exit: (code: number) => never;
33
+ };
34
+ export declare function createStopCommand(program: Command, ctx: StopCommandContext): void;
35
+ export {};
@@ -0,0 +1,95 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ function parseConfigPort(config) {
5
+ const port = config?.httpserver?.port ?? config?.server?.port ?? config?.port;
6
+ return typeof port === 'number' && Number.isFinite(port) ? port : NaN;
7
+ }
8
+ function resolveStopPort(ctx, spinner) {
9
+ if (ctx.isDevPackage) {
10
+ const envPort = Number(ctx.env?.ROUTECODEX_PORT || ctx.env?.RCC_PORT || NaN);
11
+ if (!Number.isNaN(envPort) && envPort > 0) {
12
+ ctx.logger.info(`Using port ${envPort} from environment (ROUTECODEX_PORT/RCC_PORT) [dev package: routecodex]`);
13
+ return envPort;
14
+ }
15
+ const resolvedPort = ctx.defaultDevPort;
16
+ ctx.logger.info(`Using dev default port ${resolvedPort} (routecodex dev package)`);
17
+ return resolvedPort;
18
+ }
19
+ const fsImpl = ctx.fsImpl ?? fs;
20
+ const pathImpl = ctx.pathImpl ?? path;
21
+ const home = ctx.getHomeDir ?? (() => homedir());
22
+ const configPath = pathImpl.join(home(), '.routecodex', 'config.json');
23
+ if (!fsImpl.existsSync(configPath)) {
24
+ spinner.fail(`Configuration file not found: ${configPath}`);
25
+ ctx.logger.error('Cannot determine server port without configuration file');
26
+ ctx.logger.info('Please create a configuration file first:');
27
+ ctx.logger.info(' rcc config init');
28
+ ctx.exit(1);
29
+ }
30
+ let config;
31
+ try {
32
+ const configContent = fsImpl.readFileSync(configPath, 'utf8');
33
+ config = JSON.parse(configContent);
34
+ }
35
+ catch {
36
+ spinner.fail('Failed to parse configuration file');
37
+ ctx.logger.error(`Invalid JSON in configuration file: ${configPath}`);
38
+ ctx.exit(1);
39
+ }
40
+ const port = parseConfigPort(config);
41
+ if (!Number.isFinite(port) || port <= 0) {
42
+ spinner.fail('Invalid or missing port configuration');
43
+ ctx.logger.error('Configuration file must specify a valid port number');
44
+ ctx.exit(1);
45
+ }
46
+ return port;
47
+ }
48
+ export function createStopCommand(program, ctx) {
49
+ program
50
+ .command('stop')
51
+ .description('Stop the RouteCodex server')
52
+ .action(async () => {
53
+ const spinner = await ctx.createSpinner('Stopping RouteCodex server...');
54
+ try {
55
+ const resolvedPort = resolveStopPort(ctx, spinner);
56
+ const pids = ctx.findListeningPids(resolvedPort);
57
+ if (!pids.length) {
58
+ spinner.succeed(`No server listening on ${resolvedPort}.`);
59
+ if (ctx.isDevPackage) {
60
+ await ctx.stopTokenDaemonIfRunning?.();
61
+ }
62
+ return;
63
+ }
64
+ for (const pid of pids) {
65
+ ctx.killPidBestEffort(pid, { force: false });
66
+ }
67
+ const deadline = Date.now() + 3000;
68
+ while (Date.now() < deadline) {
69
+ if (ctx.findListeningPids(resolvedPort).length === 0) {
70
+ spinner.succeed(`Stopped server on ${resolvedPort}.`);
71
+ if (ctx.isDevPackage) {
72
+ await ctx.stopTokenDaemonIfRunning?.();
73
+ }
74
+ return;
75
+ }
76
+ await ctx.sleep(100);
77
+ }
78
+ const remain = ctx.findListeningPids(resolvedPort);
79
+ if (remain.length) {
80
+ for (const pid of remain) {
81
+ ctx.killPidBestEffort(pid, { force: true });
82
+ }
83
+ }
84
+ spinner.succeed(`Force stopped server on ${resolvedPort}.`);
85
+ if (ctx.isDevPackage) {
86
+ await ctx.stopTokenDaemonIfRunning?.();
87
+ }
88
+ }
89
+ catch (e) {
90
+ spinner.fail(`Failed to stop: ${e.message}`);
91
+ ctx.exit(1);
92
+ }
93
+ });
94
+ }
95
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/cli/commands/stop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type CliLogger = {
2
+ info: (msg: string) => void;
3
+ success: (msg: string) => void;
4
+ warning: (msg: string) => void;
5
+ error: (msg: string) => void;
6
+ debug: (msg: string) => void;
7
+ };
8
+ export declare const logger: CliLogger;
@@ -0,0 +1,9 @@
1
+ import chalk from 'chalk';
2
+ export const logger = {
3
+ info: (msg) => console.log(`${chalk.blue('ℹ')} ${msg}`),
4
+ success: (msg) => console.log(`${chalk.green('✓')} ${msg}`),
5
+ warning: (msg) => console.log(`${chalk.yellow('⚠')} ${msg}`),
6
+ error: (msg) => console.log(`${chalk.red('✗')} ${msg}`),
7
+ debug: (msg) => console.log(`${chalk.gray('◉')} ${msg}`)
8
+ };
9
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/cli/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,MAAM,CAAC,MAAM,MAAM,GAAc;IAC/B,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAG,IAAM,GAAG,EAAE,CAAC;IACnE,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAG,IAAM,GAAG,EAAE,CAAC;IACvE,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAG,IAAM,GAAG,EAAE,CAAC;IACxE,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAG,IAAM,GAAG,EAAE,CAAC;IACnE,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAG,IAAM,GAAG,EAAE,CAAC;CACrE,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { CliRuntime } from './runtime.js';
2
+ export declare function runCli(argv: string[], ctx: {
3
+ pkgName: string;
4
+ cliVersion: string;
5
+ runtime: CliRuntime;
6
+ }): Promise<number>;
@@ -0,0 +1,16 @@
1
+ import { createCliProgram } from './program.js';
2
+ export async function runCli(argv, ctx) {
3
+ const program = createCliProgram(ctx);
4
+ program.exitOverride((err) => {
5
+ throw err;
6
+ });
7
+ try {
8
+ await program.parseAsync(argv, { from: 'node' });
9
+ return 0;
10
+ }
11
+ catch (err) {
12
+ const e = err;
13
+ return typeof e?.exitCode === 'number' ? e.exitCode : 1;
14
+ }
15
+ }
16
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAMhD,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,IAAc,EACd,GAAiE;IAEjE,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAEtC,OAAO,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,EAAE;QAC3B,MAAM,GAAG,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAAyB,CAAC;QACpC,OAAO,OAAO,CAAC,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Command } from 'commander';
2
+ import type { CliRuntime } from './runtime.js';
3
+ export type CliProgramContext = {
4
+ pkgName: string;
5
+ cliVersion: string;
6
+ runtime: CliRuntime;
7
+ };
8
+ export declare function createCliProgram(ctx: CliProgramContext): Command;
@@ -0,0 +1,16 @@
1
+ import { Command } from 'commander';
2
+ export function createCliProgram(ctx) {
3
+ const program = new Command();
4
+ program.configureOutput({
5
+ writeOut: (str) => ctx.runtime.writeOut(str),
6
+ writeErr: (str) => ctx.runtime.writeErr(str)
7
+ });
8
+ program
9
+ .name(ctx.pkgName === 'rcc' ? 'rcc' : 'routecodex')
10
+ .description('RouteCodex CLI - Multi-provider OpenAI proxy server and Claude Code interface')
11
+ .version(ctx.cliVersion);
12
+ // Keep behavior deterministic in tests (Commander will treat extra args as unknown command).
13
+ program.command('noop', { hidden: true }).description('internal').action(() => { });
14
+ return program;
15
+ }
16
+ //# sourceMappingURL=program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,MAAM,UAAU,gBAAgB,CAAC,GAAsB;IACrD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO,CAAC,eAAe,CAAC;QACtB,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC5C,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;KAC7C,CAAC,CAAC;IAEH,OAAO;SACJ,IAAI,CAAC,GAAG,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC;SAClD,WAAW,CAAC,+EAA+E,CAAC;SAC5F,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAE3B,6FAA6F;IAC7F,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAEnF,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { Command } from 'commander';
2
+ import type { Spinner } from '../spinner.js';
3
+ import type { CliLogger } from '../logger.js';
4
+ export declare function registerBasicCommands(program: Command, deps: {
5
+ env: {
6
+ isDevPackage: boolean;
7
+ defaultDevPort: number;
8
+ log: (line: string) => void;
9
+ error: (line: string) => void;
10
+ exit: (code: number) => never;
11
+ };
12
+ clean: {
13
+ logger: CliLogger;
14
+ };
15
+ examples: {
16
+ log: (line: string) => void;
17
+ };
18
+ port: {
19
+ defaultPort: number;
20
+ createSpinner: (text: string) => Promise<Spinner>;
21
+ findListeningPids: (port: number) => number[];
22
+ killPidBestEffort: (pid: number, opts: {
23
+ force: boolean;
24
+ }) => void;
25
+ sleep: (ms: number) => Promise<void>;
26
+ log: (line: string) => void;
27
+ error: (line: string) => void;
28
+ exit: (code: number) => never;
29
+ };
30
+ }): void;
@@ -0,0 +1,11 @@
1
+ import { createCleanCommand } from '../commands/clean.js';
2
+ import { createEnvCommand } from '../commands/env.js';
3
+ import { createExamplesCommand } from '../commands/examples.js';
4
+ import { createPortCommand } from '../commands/port.js';
5
+ export function registerBasicCommands(program, deps) {
6
+ createEnvCommand(program, deps.env);
7
+ createCleanCommand(program, deps.clean);
8
+ createExamplesCommand(program, deps.examples);
9
+ createPortCommand(program, deps.port);
10
+ }
11
+ //# sourceMappingURL=basic-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basic-commands.js","sourceRoot":"","sources":["../../../src/cli/register/basic-commands.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,UAAU,qBAAqB,CACnC,OAAgB,EAChB,IAwBC;IAED,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACpC,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACxC,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ import { type CodeCommandContext } from '../commands/code.js';
3
+ export declare function registerCodeCommand(program: Command, ctx: CodeCommandContext): void;
@@ -0,0 +1,5 @@
1
+ import { createCodeCommand } from '../commands/code.js';
2
+ export function registerCodeCommand(program, ctx) {
3
+ createCodeCommand(program, ctx);
4
+ }
5
+ //# sourceMappingURL=code-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-command.js","sourceRoot":"","sources":["../../../src/cli/register/code-command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAA2B,MAAM,qBAAqB,CAAC;AAEjF,MAAM,UAAU,mBAAmB,CAAC,OAAgB,EAAE,GAAuB;IAC3E,iBAAiB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ import { type RestartCommandContext } from '../commands/restart.js';
3
+ export declare function registerRestartCommand(program: Command, ctx: RestartCommandContext): void;
@@ -0,0 +1,5 @@
1
+ import { createRestartCommand } from '../commands/restart.js';
2
+ export function registerRestartCommand(program, ctx) {
3
+ createRestartCommand(program, ctx);
4
+ }
5
+ //# sourceMappingURL=restart-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restart-command.js","sourceRoot":"","sources":["../../../src/cli/register/restart-command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAA8B,MAAM,wBAAwB,CAAC;AAE1F,MAAM,UAAU,sBAAsB,CAAC,OAAgB,EAAE,GAA0B;IACjF,oBAAoB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ import { type StartCommandContext } from '../commands/start.js';
3
+ export declare function registerStartCommand(program: Command, ctx: StartCommandContext): void;
@@ -0,0 +1,5 @@
1
+ import { createStartCommand } from '../commands/start.js';
2
+ export function registerStartCommand(program, ctx) {
3
+ createStartCommand(program, ctx);
4
+ }
5
+ //# sourceMappingURL=start-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-command.js","sourceRoot":"","sources":["../../../src/cli/register/start-command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAA4B,MAAM,sBAAsB,CAAC;AAEpF,MAAM,UAAU,oBAAoB,CAAC,OAAgB,EAAE,GAAwB;IAC7E,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Command } from 'commander';
2
+ import type { LoadedRouteCodexConfig } from '../../config/routecodex-config-loader.js';
3
+ import type { CliLogger } from '../logger.js';
4
+ import type { Spinner } from '../spinner.js';
5
+ export declare function registerStatusConfigCommands(program: Command, deps: {
6
+ config: {
7
+ logger: CliLogger;
8
+ createSpinner: (text: string) => Promise<Spinner>;
9
+ };
10
+ status: {
11
+ logger: CliLogger;
12
+ log: (line: string) => void;
13
+ loadConfig: () => Promise<LoadedRouteCodexConfig>;
14
+ fetch: typeof fetch;
15
+ };
16
+ }): void;
@@ -0,0 +1,7 @@
1
+ import { createConfigCommand } from '../commands/config.js';
2
+ import { createStatusCommand } from '../commands/status.js';
3
+ export function registerStatusConfigCommands(program, deps) {
4
+ createConfigCommand(program, deps.config);
5
+ createStatusCommand(program, deps.status);
6
+ }
7
+ //# sourceMappingURL=status-config-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-config-commands.js","sourceRoot":"","sources":["../../../src/cli/register/status-config-commands.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,4BAA4B,CAC1C,OAAgB,EAChB,IAWC;IAED,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1C,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ import { type StopCommandContext } from '../commands/stop.js';
3
+ export declare function registerStopCommand(program: Command, ctx: StopCommandContext): void;
@@ -0,0 +1,5 @@
1
+ import { createStopCommand } from '../commands/stop.js';
2
+ export function registerStopCommand(program, ctx) {
3
+ createStopCommand(program, ctx);
4
+ }
5
+ //# sourceMappingURL=stop-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop-command.js","sourceRoot":"","sources":["../../../src/cli/register/stop-command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAA2B,MAAM,qBAAqB,CAAC;AAEjF,MAAM,UAAU,mBAAmB,CAAC,OAAgB,EAAE,GAAuB;IAC3E,iBAAiB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export type CliRuntime = {
2
+ writeOut: (text: string) => void;
3
+ writeErr: (text: string) => void;
4
+ };
5
+ export declare function createNodeRuntime(): CliRuntime;
@@ -0,0 +1,11 @@
1
+ export function createNodeRuntime() {
2
+ return {
3
+ writeOut: (text) => {
4
+ process.stdout.write(text);
5
+ },
6
+ writeErr: (text) => {
7
+ process.stderr.write(text);
8
+ }
9
+ };
10
+ }
11
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/cli/runtime.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE;YACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE;YACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { spawnSync as nodeSpawnSync } from 'node:child_process';
2
+ export type PortUtilsSpinner = {
3
+ start(text?: string): PortUtilsSpinner;
4
+ succeed(text?: string): void;
5
+ fail(text?: string): void;
6
+ warn(text?: string): void;
7
+ info(text?: string): void;
8
+ stop(): void;
9
+ text: string;
10
+ };
11
+ export type PortUtilsLogger = {
12
+ info: (msg: string) => void;
13
+ success: (msg: string) => void;
14
+ warning: (msg: string) => void;
15
+ error: (msg: string) => void;
16
+ };
17
+ export declare function killPidBestEffortImpl(args: {
18
+ pid: number;
19
+ force: boolean;
20
+ isWindows: boolean;
21
+ spawnSyncImpl?: typeof nodeSpawnSync;
22
+ processKill?: typeof process.kill;
23
+ }): void;
24
+ export declare function findListeningPidsImpl(args: {
25
+ port: number;
26
+ isWindows: boolean;
27
+ spawnSyncImpl?: typeof nodeSpawnSync;
28
+ logger: PortUtilsLogger;
29
+ parseNetstatListeningPids: (stdout: string, port: number) => number[];
30
+ }): number[];
31
+ export declare function isServerHealthyQuickImpl(args: {
32
+ port: number;
33
+ fetchImpl: typeof fetch;
34
+ }): Promise<boolean>;
35
+ export declare function ensurePortAvailableImpl(args: {
36
+ port: number;
37
+ parentSpinner: PortUtilsSpinner;
38
+ opts?: {
39
+ restart?: boolean;
40
+ };
41
+ fetchImpl: typeof fetch;
42
+ sleep: (ms: number) => Promise<void>;
43
+ env: NodeJS.ProcessEnv;
44
+ logger: PortUtilsLogger;
45
+ createSpinner: (text: string) => Promise<PortUtilsSpinner>;
46
+ findListeningPids: (port: number) => number[];
47
+ killPidBestEffort: (pid: number, opts: {
48
+ force: boolean;
49
+ }) => void;
50
+ isServerHealthyQuick: (port: number) => Promise<boolean>;
51
+ exit: (code: number) => never;
52
+ }): Promise<void>;