@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,168 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { spawn } from 'node:child_process';
5
+ import { API_ENDPOINTS, DEFAULT_CONFIG, HTTP_PROTOCOLS, LOCAL_HOSTS } from '../../constants/index.js';
6
+ function buildTemplate(template) {
7
+ switch (template) {
8
+ case 'lmstudio':
9
+ return {
10
+ server: { port: DEFAULT_CONFIG.PORT, host: LOCAL_HOSTS.LOCALHOST },
11
+ logging: { level: 'info' },
12
+ providers: {
13
+ lmstudio: {
14
+ type: 'lmstudio',
15
+ baseUrl: `${HTTP_PROTOCOLS.HTTP}${LOCAL_HOSTS.LOCALHOST}:${DEFAULT_CONFIG.LM_STUDIO_PORT}`,
16
+ apiKey: '${LM_STUDIO_API_KEY:-}',
17
+ models: {
18
+ 'gpt-oss-20b-mlx': { maxTokens: 8192, temperature: 0.7, supportsStreaming: true, supportsTools: true },
19
+ 'qwen2.5-7b-instruct': { maxTokens: 32768, temperature: 0.7, supportsStreaming: true, supportsTools: true }
20
+ },
21
+ timeout: 60000,
22
+ retryAttempts: 3
23
+ }
24
+ },
25
+ routing: {
26
+ default: 'lmstudio',
27
+ models: {
28
+ 'gpt-4': 'gpt-oss-20b-mlx',
29
+ 'gpt-4-turbo': 'gpt-oss-20b-mlx',
30
+ 'gpt-3.5-turbo': 'gpt-oss-20b-mlx',
31
+ 'claude-3-haiku': 'qwen2.5-7b-instruct',
32
+ 'claude-3-sonnet': 'gpt-oss-20b-mlx'
33
+ }
34
+ },
35
+ features: {
36
+ tools: { enabled: true, maxTools: 10 },
37
+ streaming: { enabled: true, chunkSize: 1024 },
38
+ oauth: { enabled: true, providers: ['qwen', 'iflow'] }
39
+ }
40
+ };
41
+ case 'oauth':
42
+ return {
43
+ server: { port: DEFAULT_CONFIG.PORT, host: LOCAL_HOSTS.LOCALHOST },
44
+ logging: { level: 'info' },
45
+ providers: {
46
+ qwen: {
47
+ type: 'qwen-provider',
48
+ baseUrl: 'https://chat.qwen.ai',
49
+ oauth: {
50
+ clientId: 'f0304373b74a44d2b584a3fb70ca9e56',
51
+ deviceCodeUrl: 'https://chat.qwen.ai/api/v1/oauth2/device/code',
52
+ tokenUrl: 'https://chat.qwen.ai/api/v1/oauth2/token',
53
+ scopes: ['openid', 'profile', 'email', 'model.completion']
54
+ },
55
+ models: {
56
+ 'qwen3-coder-plus': { maxTokens: 32768, temperature: 0.7, supportsStreaming: true, supportsTools: true }
57
+ }
58
+ }
59
+ },
60
+ routing: { default: 'qwen', models: { 'gpt-4': 'qwen3-coder-plus', 'gpt-3.5-turbo': 'qwen3-coder-plus' } },
61
+ features: {
62
+ tools: { enabled: true, maxTools: 10 },
63
+ streaming: { enabled: true, chunkSize: 1024 },
64
+ oauth: { enabled: true, autoRefresh: true, sharedCredentials: true }
65
+ }
66
+ };
67
+ default:
68
+ return {
69
+ server: { port: DEFAULT_CONFIG.PORT, host: LOCAL_HOSTS.LOCALHOST },
70
+ logging: { level: 'info' },
71
+ providers: {
72
+ openai: {
73
+ type: 'openai',
74
+ apiKey: '${OPENAI_API_KEY}',
75
+ baseUrl: API_ENDPOINTS.OPENAI,
76
+ models: { 'gpt-4': { maxTokens: 8192, temperature: 0.7 }, 'gpt-3.5-turbo': { maxTokens: 4096, temperature: 0.7 } }
77
+ }
78
+ },
79
+ routing: { default: 'openai' },
80
+ features: { tools: { enabled: true, maxTools: 10 }, streaming: { enabled: true, chunkSize: 1024 } }
81
+ };
82
+ }
83
+ }
84
+ async function initializeConfig(ctx, configPath, template, force = false) {
85
+ const spinner = await ctx.createSpinner('Initializing configuration...');
86
+ const fsImpl = ctx.fsImpl ?? fs;
87
+ const pathImpl = ctx.pathImpl ?? path;
88
+ try {
89
+ const configDir = pathImpl.dirname(configPath);
90
+ if (!fsImpl.existsSync(configDir)) {
91
+ fsImpl.mkdirSync(configDir, { recursive: true });
92
+ }
93
+ if (fsImpl.existsSync(configPath) && !force) {
94
+ spinner.warn('Configuration file already exists');
95
+ spinner.info('Use --force flag to overwrite or choose a different path');
96
+ return;
97
+ }
98
+ const templateConfig = buildTemplate(template);
99
+ fsImpl.writeFileSync(configPath, JSON.stringify(templateConfig, null, 2));
100
+ spinner.succeed(`Configuration initialized: ${configPath}`);
101
+ ctx.logger.info(`Template used: ${template || 'default'}`);
102
+ ctx.logger.info('You can now start the server with: rcc start');
103
+ }
104
+ catch (error) {
105
+ spinner.fail('Failed to initialize configuration');
106
+ ctx.logger.error(`Initialization failed: ${error instanceof Error ? error.message : String(error)}`);
107
+ }
108
+ }
109
+ export function createConfigCommand(program, ctx) {
110
+ const fsImpl = ctx.fsImpl ?? fs;
111
+ const pathImpl = ctx.pathImpl ?? path;
112
+ const home = ctx.getHomeDir ?? (() => homedir());
113
+ const env = ctx.env ?? process.env;
114
+ const log = ctx.log ?? ((line) => console.log(line));
115
+ const spawnImpl = ctx.spawnImpl ?? spawn;
116
+ program
117
+ .command('config')
118
+ .description('Configuration management')
119
+ .argument('<action>', 'Action to perform (show, edit, validate, init)')
120
+ .option('-c, --config <config>', 'Configuration file path')
121
+ .option('-t, --template <template>', 'Configuration template (default, lmstudio, oauth)')
122
+ .option('-f, --force', 'Force overwrite existing configuration')
123
+ .action(async (action, options) => {
124
+ try {
125
+ const configPath = options.config || pathImpl.join(home(), '.routecodex', 'config.json');
126
+ switch (action) {
127
+ case 'init':
128
+ await initializeConfig(ctx, configPath, options.template, Boolean(options.force));
129
+ break;
130
+ case 'show':
131
+ if (fsImpl.existsSync(configPath)) {
132
+ const config = JSON.parse(fsImpl.readFileSync(configPath, 'utf8'));
133
+ log(JSON.stringify(config, null, 2));
134
+ }
135
+ else {
136
+ ctx.logger.error('Configuration file not found');
137
+ }
138
+ break;
139
+ case 'edit': {
140
+ const editor = env.EDITOR || 'nano';
141
+ spawnImpl(editor, [configPath], { stdio: 'inherit' });
142
+ break;
143
+ }
144
+ case 'validate': {
145
+ if (fsImpl.existsSync(configPath)) {
146
+ try {
147
+ JSON.parse(fsImpl.readFileSync(configPath, 'utf8'));
148
+ ctx.logger.success('Configuration is valid');
149
+ }
150
+ catch (error) {
151
+ ctx.logger.error(`Configuration is invalid: ${error instanceof Error ? error.message : String(error)}`);
152
+ }
153
+ }
154
+ else {
155
+ ctx.logger.error('Configuration file not found');
156
+ }
157
+ break;
158
+ }
159
+ default:
160
+ ctx.logger.error('Unknown action. Use: show, edit, validate, init');
161
+ }
162
+ }
163
+ catch (error) {
164
+ ctx.logger.error(`Config command failed: ${error instanceof Error ? error.message : String(error)}`);
165
+ }
166
+ });
167
+ }
168
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Command } from 'commander';
2
+ export type EnvCommandOptions = {
3
+ port?: string;
4
+ host?: string;
5
+ config?: string;
6
+ json?: boolean;
7
+ };
8
+ export type EnvCommandContext = {
9
+ isDevPackage: boolean;
10
+ defaultDevPort: number;
11
+ log: (line: string) => void;
12
+ error: (line: string) => void;
13
+ exit: (code: number) => never;
14
+ };
15
+ export declare function computeEnvOutput(args: {
16
+ host: string;
17
+ port: number;
18
+ json: boolean;
19
+ }): string[];
20
+ export declare function createEnvCommand(program: Command, ctx: EnvCommandContext): void;
@@ -0,0 +1,73 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { LOCAL_HOSTS } from '../../constants/index.js';
5
+ import { normalizeConnectHost, normalizePort } from '../utils/normalize.js';
6
+ import { safeReadJson } from '../utils/safe-read-json.js';
7
+ export function computeEnvOutput(args) {
8
+ const base = `http://${args.host}:${args.port}`;
9
+ if (args.json) {
10
+ return [
11
+ JSON.stringify({
12
+ ANTHROPIC_BASE_URL: base,
13
+ ANTHROPIC_API_URL: base,
14
+ ANTHROPIC_API_KEY: 'rcc-proxy-key',
15
+ UNSET: ['ANTHROPIC_TOKEN', 'ANTHROPIC_AUTH_TOKEN']
16
+ }, null, 2)
17
+ ];
18
+ }
19
+ return [
20
+ `export ANTHROPIC_BASE_URL=${base}`,
21
+ `export ANTHROPIC_API_URL=${base}`,
22
+ 'export ANTHROPIC_API_KEY=rcc-proxy-key',
23
+ 'unset ANTHROPIC_TOKEN',
24
+ 'unset ANTHROPIC_AUTH_TOKEN'
25
+ ];
26
+ }
27
+ export function createEnvCommand(program, ctx) {
28
+ program
29
+ .command('env')
30
+ .description('Print environment exports for Anthropic tools to use RouteCodex proxy')
31
+ .option('-p, --port <port>', 'RouteCodex server port (overrides config file)')
32
+ .option('-h, --host <host>', 'RouteCodex server host')
33
+ .option('-c, --config <config>', 'RouteCodex configuration file path')
34
+ .option('--json', 'Output JSON instead of shell exports')
35
+ .action(async (options) => {
36
+ try {
37
+ const configPath = options.config ? options.config : path.join(homedir(), '.routecodex', 'config.json');
38
+ let host = options.host;
39
+ let port = normalizePort(options.port);
40
+ if (ctx.isDevPackage) {
41
+ if (!Number.isFinite(port)) {
42
+ const envPort = Number(process.env.ROUTECODEX_PORT || process.env.RCC_PORT || NaN);
43
+ port = Number.isFinite(envPort) && envPort > 0 ? envPort : ctx.defaultDevPort;
44
+ }
45
+ }
46
+ else {
47
+ if (!Number.isFinite(port) && fs.existsSync(configPath)) {
48
+ const cfg = safeReadJson(configPath);
49
+ port = normalizePort(cfg?.httpserver?.port ?? cfg?.server?.port ?? cfg?.port);
50
+ host =
51
+ typeof cfg?.httpserver?.host === 'string'
52
+ ? cfg.httpserver.host
53
+ : typeof cfg?.server?.host === 'string'
54
+ ? cfg.server.host
55
+ : (cfg?.host ?? host);
56
+ }
57
+ }
58
+ if (!Number.isFinite(port) || !port || port <= 0) {
59
+ throw new Error('Missing port. Set via --port, env or config file');
60
+ }
61
+ const resolvedHost = normalizeConnectHost(host, LOCAL_HOSTS.IPV4);
62
+ const lines = computeEnvOutput({ host: resolvedHost, port, json: Boolean(options.json) });
63
+ for (const line of lines) {
64
+ ctx.log(line);
65
+ }
66
+ }
67
+ catch (error) {
68
+ ctx.error(error instanceof Error ? error.message : String(error));
69
+ ctx.exit(1);
70
+ }
71
+ });
72
+ }
73
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/cli/commands/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Command } from 'commander';
2
+ export type ExamplesCommandContext = {
3
+ log: (line: string) => void;
4
+ };
5
+ export declare function createExamplesCommand(program: Command, ctx: ExamplesCommandContext): void;
@@ -0,0 +1,66 @@
1
+ import chalk from 'chalk';
2
+ export function createExamplesCommand(program, ctx) {
3
+ program
4
+ .command('examples')
5
+ .description('Show usage examples')
6
+ .action(() => {
7
+ ctx.log(chalk.cyan('RouteCodex Usage Examples'));
8
+ ctx.log('='.repeat(40));
9
+ ctx.log('');
10
+ ctx.log(chalk.yellow('1. Initialize Configuration:'));
11
+ ctx.log(' # Create default configuration');
12
+ ctx.log(' rcc config init');
13
+ ctx.log('');
14
+ ctx.log(' # Create LMStudio configuration');
15
+ ctx.log(' rcc config init --template lmstudio');
16
+ ctx.log('');
17
+ ctx.log(' # Create OAuth configuration');
18
+ ctx.log(' rcc config init --template oauth');
19
+ ctx.log('');
20
+ ctx.log(chalk.yellow('2. Start Server:'));
21
+ ctx.log(' # Start with default config');
22
+ ctx.log(' rcc start');
23
+ ctx.log('');
24
+ ctx.log(' # Start with custom config');
25
+ ctx.log(' rcc start --config ./config/lmstudio-config.json');
26
+ ctx.log('');
27
+ ctx.log(' # Note: Port must be specified in configuration file');
28
+ ctx.log(' # Server will not start without valid port configuration');
29
+ ctx.log('');
30
+ ctx.log(chalk.yellow('3. Launch Claude Code:'));
31
+ ctx.log(' # Launch Claude Code with automatic server start');
32
+ ctx.log(' rcc code --ensure-server');
33
+ ctx.log('');
34
+ ctx.log(' # Launch Claude Code with specific model');
35
+ ctx.log(' rcc code --model claude-3-haiku');
36
+ ctx.log('');
37
+ ctx.log(' # Launch Claude Code with custom profile');
38
+ ctx.log(' rcc code --profile my-profile');
39
+ ctx.log('');
40
+ ctx.log(chalk.yellow('4. Configuration Management:'));
41
+ ctx.log(' # Show current configuration');
42
+ ctx.log(' rcc config show');
43
+ ctx.log('');
44
+ ctx.log(' # Edit configuration');
45
+ ctx.log(' rcc config edit');
46
+ ctx.log('');
47
+ ctx.log(' # Validate configuration');
48
+ ctx.log(' rcc config validate');
49
+ ctx.log('');
50
+ ctx.log(chalk.yellow('6. Environment Variables:'));
51
+ ctx.log(' # Set LM Studio API Key');
52
+ ctx.log(' export LM_STUDIO_API_KEY="your-api-key"');
53
+ ctx.log('');
54
+ ctx.log(' # Set OpenAI API Key');
55
+ ctx.log(' export OPENAI_API_KEY="your-api-key"');
56
+ ctx.log('');
57
+ ctx.log(chalk.yellow('7. Testing:'));
58
+ ctx.log(' # Test with curl');
59
+ ctx.log(' curl -X POST http://localhost:5506/v1/chat/completions \\');
60
+ ctx.log(' -H "Content-Type: application/json" \\');
61
+ ctx.log(' -H "Authorization: Bearer test-key" \\');
62
+ ctx.log(' -d \'{"model": "gpt-4", "messages": [{"role": "user", "content": "Hello!"}]}\'');
63
+ ctx.log('');
64
+ });
65
+ }
66
+ //# sourceMappingURL=examples.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"examples.js","sourceRoot":"","sources":["../../../src/cli/commands/examples.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Command } from 'commander';
2
+ type Spinner = {
3
+ start(text?: string): Spinner;
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 PortCommandContext = {
12
+ defaultPort: number;
13
+ createSpinner: (text: string) => Promise<Spinner>;
14
+ findListeningPids: (port: number) => number[];
15
+ killPidBestEffort: (pid: number, opts: {
16
+ force: boolean;
17
+ }) => void;
18
+ sleep: (ms: number) => Promise<void>;
19
+ log: (line: string) => void;
20
+ error: (line: string) => void;
21
+ exit: (code: number) => never;
22
+ };
23
+ export declare function createPortCommand(program: Command, ctx: PortCommandContext): void;
24
+ export {};
@@ -0,0 +1,85 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import chalk from 'chalk';
3
+ import { loadRouteCodexConfig } from '../../config/routecodex-config-loader.js';
4
+ function parseConfigPort(userConfig) {
5
+ const cfg = userConfig;
6
+ const port = cfg?.httpserver?.port ?? cfg?.server?.port ?? cfg?.port;
7
+ return typeof port === 'number' && Number.isFinite(port) ? port : NaN;
8
+ }
9
+ export function createPortCommand(program, ctx) {
10
+ program
11
+ .command('port')
12
+ .description('Port utilities (doctor)')
13
+ .argument('<sub>', 'Subcommand: doctor')
14
+ .argument('[port]', `Port number (e.g., ${ctx.defaultPort})`)
15
+ .option('--kill', 'Kill all listeners on the port')
16
+ .action(async (sub, portArg, opts) => {
17
+ if ((sub || '').toLowerCase() !== 'doctor') {
18
+ ctx.error(chalk.red('Unknown subcommand. Use: rcc port doctor [port] [--kill]'));
19
+ ctx.exit(2);
20
+ }
21
+ const spinner = await ctx.createSpinner('Inspecting port...');
22
+ try {
23
+ let port = Number(portArg || 0);
24
+ if (!Number.isFinite(port) || port <= 0) {
25
+ try {
26
+ const loaded = await loadRouteCodexConfig();
27
+ const fromCfg = parseConfigPort(loaded.userConfig);
28
+ port = Number.isFinite(fromCfg) && fromCfg > 0 ? fromCfg : port;
29
+ }
30
+ catch {
31
+ // ignore; fall back to explicit arg requirement
32
+ }
33
+ }
34
+ if (!Number.isFinite(port) || port <= 0) {
35
+ spinner.fail('Missing port. Provide an explicit port or set it in ~/.routecodex/config.json');
36
+ ctx.exit(1);
37
+ }
38
+ const pids = ctx.findListeningPids(port);
39
+ spinner.stop();
40
+ ctx.log(chalk.cyan(`Port ${port} listeners:`));
41
+ if (!pids.length) {
42
+ ctx.log(' (none)');
43
+ }
44
+ else {
45
+ for (const pid of pids) {
46
+ let cmd = '';
47
+ try {
48
+ cmd = spawnSync('ps', ['-o', 'command=', '-p', String(pid)], { encoding: 'utf8' }).stdout.trim();
49
+ }
50
+ catch {
51
+ cmd = '';
52
+ }
53
+ const origin = /node\s+.*routecodex-worktree/.test(cmd)
54
+ ? 'local-dev'
55
+ : (/node\s+.*lib\/node_modules\/routecodex/.test(cmd) ? 'global' : 'unknown');
56
+ ctx.log(` PID ${pid} [${origin}] ${cmd}`);
57
+ }
58
+ }
59
+ if (opts.kill && pids.length) {
60
+ const ksp = await ctx.createSpinner(`Killing ${pids.length} listener(s) on ${port}...`);
61
+ for (const pid of pids) {
62
+ try {
63
+ ctx.killPidBestEffort(pid, { force: true });
64
+ }
65
+ catch (e) {
66
+ ksp.warn(`Failed to kill ${pid}: ${e.message}`);
67
+ }
68
+ }
69
+ await ctx.sleep(300);
70
+ const remain = ctx.findListeningPids(port);
71
+ if (remain.length) {
72
+ ksp.fail(`Some listeners remain: ${remain.join(', ')}`);
73
+ ctx.exit(1);
74
+ }
75
+ ksp.succeed(`Port ${port} is now free.`);
76
+ }
77
+ }
78
+ catch (e) {
79
+ spinner.fail('Port inspection failed');
80
+ ctx.error(e instanceof Error ? e.message : String(e));
81
+ ctx.exit(1);
82
+ }
83
+ });
84
+ }
85
+ //# sourceMappingURL=port.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port.js","sourceRoot":"","sources":["../../../src/cli/commands/port.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
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
+ error: (msg: string) => void;
17
+ };
18
+ export type RestartCommandOptions = {
19
+ config?: string;
20
+ logLevel?: string;
21
+ codex?: boolean;
22
+ claude?: boolean;
23
+ };
24
+ export type RestartCommandContext = {
25
+ isDevPackage: boolean;
26
+ isWindows: boolean;
27
+ defaultDevPort: number;
28
+ createSpinner: (text: string) => Promise<Spinner>;
29
+ logger: LoggerLike;
30
+ findListeningPids: (port: number) => number[];
31
+ killPidBestEffort: (pid: number, opts: {
32
+ force: boolean;
33
+ }) => void;
34
+ sleep: (ms: number) => Promise<void>;
35
+ getModulesConfigPath: () => string;
36
+ resolveServerEntryPath: () => string;
37
+ nodeBin: string;
38
+ spawn: (command: string, args: string[], options: SpawnOptions) => ChildProcess;
39
+ fetch: typeof fetch;
40
+ setupKeypress: (onInterrupt: () => void) => () => void;
41
+ waitForever: () => Promise<void>;
42
+ env?: NodeJS.ProcessEnv;
43
+ fsImpl?: Pick<typeof fs, 'existsSync' | 'readFileSync' | 'writeFileSync'>;
44
+ pathImpl?: Pick<typeof path, 'join'>;
45
+ getHomeDir?: () => string;
46
+ onSignal?: (signal: NodeJS.Signals, cb: () => void) => void;
47
+ exit: (code: number) => never;
48
+ };
49
+ export declare function createRestartCommand(program: Command, ctx: RestartCommandContext): void;
50
+ export {};