@jsonstudio/rcc 0.89.1136 → 0.89.1205
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build-info.js +2 -2
- package/dist/cli/commands/clean.d.ts +16 -0
- package/dist/cli/commands/clean.js +58 -0
- package/dist/cli/commands/clean.js.map +1 -0
- package/dist/cli/commands/code.d.ts +55 -0
- package/dist/cli/commands/code.js +376 -0
- package/dist/cli/commands/code.js.map +1 -0
- package/dist/cli/commands/config.d.ts +31 -0
- package/dist/cli/commands/config.js +168 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/env.d.ts +20 -0
- package/dist/cli/commands/env.js +73 -0
- package/dist/cli/commands/env.js.map +1 -0
- package/dist/cli/commands/examples.d.ts +5 -0
- package/dist/cli/commands/examples.js +66 -0
- package/dist/cli/commands/examples.js.map +1 -0
- package/dist/cli/commands/port.d.ts +24 -0
- package/dist/cli/commands/port.js +85 -0
- package/dist/cli/commands/port.js.map +1 -0
- package/dist/cli/commands/restart.d.ts +50 -0
- package/dist/cli/commands/restart.js +176 -0
- package/dist/cli/commands/restart.js.map +1 -0
- package/dist/cli/commands/start.d.ts +68 -0
- package/dist/cli/commands/start.js +295 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +16 -0
- package/dist/cli/commands/status.js +104 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +35 -0
- package/dist/cli/commands/stop.js +95 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/logger.d.ts +8 -0
- package/dist/cli/logger.js +9 -0
- package/dist/cli/logger.js.map +1 -0
- package/dist/cli/main.d.ts +6 -0
- package/dist/cli/main.js +16 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/program.d.ts +8 -0
- package/dist/cli/program.js +16 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/cli/register/basic-commands.d.ts +30 -0
- package/dist/cli/register/basic-commands.js +11 -0
- package/dist/cli/register/basic-commands.js.map +1 -0
- package/dist/cli/register/code-command.d.ts +3 -0
- package/dist/cli/register/code-command.js +5 -0
- package/dist/cli/register/code-command.js.map +1 -0
- package/dist/cli/register/restart-command.d.ts +3 -0
- package/dist/cli/register/restart-command.js +5 -0
- package/dist/cli/register/restart-command.js.map +1 -0
- package/dist/cli/register/start-command.d.ts +3 -0
- package/dist/cli/register/start-command.js +5 -0
- package/dist/cli/register/start-command.js.map +1 -0
- package/dist/cli/register/status-config-commands.d.ts +16 -0
- package/dist/cli/register/status-config-commands.js +7 -0
- package/dist/cli/register/status-config-commands.js.map +1 -0
- package/dist/cli/register/stop-command.d.ts +3 -0
- package/dist/cli/register/stop-command.js +5 -0
- package/dist/cli/register/stop-command.js.map +1 -0
- package/dist/cli/runtime.d.ts +5 -0
- package/dist/cli/runtime.js +11 -0
- package/dist/cli/runtime.js.map +1 -0
- package/dist/cli/server/port-utils.d.ts +52 -0
- package/dist/cli/server/port-utils.js +193 -0
- package/dist/cli/server/port-utils.js.map +1 -0
- package/dist/cli/spinner.d.ts +10 -0
- package/dist/cli/spinner.js +59 -0
- package/dist/cli/spinner.js.map +1 -0
- package/dist/cli/utils/normalize.d.ts +2 -0
- package/dist/cli/utils/normalize.js +22 -0
- package/dist/cli/utils/normalize.js.map +1 -0
- package/dist/cli/utils/safe-read-json.d.ts +1 -0
- package/dist/cli/utils/safe-read-json.js +11 -0
- package/dist/cli/utils/safe-read-json.js.map +1 -0
- package/dist/cli.js +148 -1775
- package/dist/cli.js.map +1 -1
- package/dist/client/anthropic/anthropic-protocol-client.js +4 -3
- package/dist/client/anthropic/anthropic-protocol-client.js.map +1 -1
- package/dist/client/gemini-cli/gemini-cli-protocol-client.d.ts +1 -1
- package/dist/client/gemini-cli/gemini-cli-protocol-client.js +10 -3
- package/dist/client/gemini-cli/gemini-cli-protocol-client.js.map +1 -1
- package/dist/commands/quota-daemon.js +2 -2
- package/dist/commands/quota-daemon.js.map +1 -1
- package/dist/config/provider-v2-loader.js +4 -2
- package/dist/config/provider-v2-loader.js.map +1 -1
- package/dist/manager/modules/quota/index.js +21 -4
- package/dist/manager/modules/quota/index.js.map +1 -1
- package/dist/manager/modules/routing/index.js.map +1 -1
- package/dist/manager/storage/file-store.js +1 -1
- package/dist/manager/storage/file-store.js.map +1 -1
- package/dist/modules/llmswitch/bridge.js +45 -1
- package/dist/modules/llmswitch/bridge.js.map +1 -1
- package/dist/providers/auth/oauth-lifecycle.js +2 -2
- package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
- package/dist/providers/core/api/provider-config.d.ts +2 -0
- package/dist/providers/core/api/provider-types.d.ts +2 -0
- package/dist/providers/core/runtime/base-provider.js +21 -27
- package/dist/providers/core/runtime/base-provider.js.map +1 -1
- package/dist/providers/core/runtime/gemini-cli-http-provider.d.ts +1 -0
- package/dist/providers/core/runtime/gemini-cli-http-provider.js +37 -5
- package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
- package/dist/providers/core/runtime/http-request-executor.js +23 -29
- package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
- package/dist/providers/core/runtime/http-transport-provider.js +20 -0
- package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
- package/dist/providers/core/utils/http-client.d.ts +9 -0
- package/dist/providers/core/utils/http-client.js +9 -11
- package/dist/providers/core/utils/http-client.js.map +1 -1
- package/dist/providers/core/utils/provider-error-reporter.js +2 -6
- package/dist/providers/core/utils/provider-error-reporter.js.map +1 -1
- package/dist/providers/mock/mock-provider-runtime.js +19 -5
- package/dist/providers/mock/mock-provider-runtime.js.map +1 -1
- package/dist/server/runtime/http-server/hub-shadow-compare.d.ts +18 -0
- package/dist/server/runtime/http-server/hub-shadow-compare.js +180 -0
- package/dist/server/runtime/http-server/hub-shadow-compare.js.map +1 -0
- package/dist/server/runtime/http-server/index.d.ts +4 -0
- package/dist/server/runtime/http-server/index.js +202 -11
- package/dist/server/runtime/http-server/index.js.map +1 -1
- package/dist/server/runtime/http-server/request-executor.js +9 -1
- package/dist/server/runtime/http-server/request-executor.js.map +1 -1
- package/dist/server/runtime/http-server/routes.js +8 -4
- package/dist/server/runtime/http-server/routes.js.map +1 -1
- package/dist/server/runtime/http-server/stats-manager.js +9 -3
- package/dist/server/runtime/http-server/stats-manager.js.map +1 -1
- package/dist/utils/errorsamples.d.ts +5 -0
- package/dist/utils/errorsamples.js +27 -0
- package/dist/utils/errorsamples.js.map +1 -0
- package/dist/utils/runtime-versions.d.ts +1 -0
- package/dist/utils/runtime-versions.js +38 -0
- package/dist/utils/runtime-versions.js.map +1 -0
- package/package.json +10 -4
- package/scripts/anthropic-compare-modes.mjs +40 -3
- package/scripts/antigravity-smoke.mjs +180 -0
- package/scripts/backfill-apply-patch-exec-errorsamples.mjs +225 -0
- package/scripts/compare-codex-rccx.mjs +59 -1
- package/scripts/compare-responses-request.mjs +50 -4
- package/scripts/lib/errorsamples.mjs +23 -0
- package/scripts/mock-provider/run-regressions.mjs +12 -2
- package/scripts/policy-violations-report.mjs +257 -0
- package/scripts/publish-rcc.mjs +16 -2
- package/scripts/tests/unified-hub-responses-enforce-safe.mjs +37 -0
- package/scripts/tests/unified-hub-shadow-regression.mjs +55 -0
- package/scripts/unified-hub-shadow-compare.mjs +359 -0
- package/scripts/verify-e2e-gemini-followup-sample.mjs +269 -0
- package/scripts/virtual-router-shadow-v2-real.mjs +71 -1
- 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":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG3C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAoCtG,SAAS,aAAa,CAAC,QAA4B;IACjD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,UAAU;YACb,OAAO;gBACL,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,SAAS,EAAE;gBAClE,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;gBAC1B,SAAS,EAAE;oBACT,QAAQ,EAAE;wBACR,IAAI,EAAE,UAAU;wBAChB,OAAO,EAAE,GAAG,cAAc,CAAC,IAAI,GAAG,WAAW,CAAC,SAAS,IAAI,cAAc,CAAC,cAAc,EAAE;wBAC1F,MAAM,EAAE,wBAAwB;wBAChC,MAAM,EAAE;4BACN,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;4BACtG,qBAAqB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;yBAC5G;wBACD,OAAO,EAAE,KAAK;wBACd,aAAa,EAAE,CAAC;qBACjB;iBACF;gBACD,OAAO,EAAE;oBACP,OAAO,EAAE,UAAU;oBACnB,MAAM,EAAE;wBACN,OAAO,EAAE,iBAAiB;wBAC1B,aAAa,EAAE,iBAAiB;wBAChC,eAAe,EAAE,iBAAiB;wBAClC,gBAAgB,EAAE,qBAAqB;wBACvC,iBAAiB,EAAE,iBAAiB;qBACrC;iBACF;gBACD,QAAQ,EAAE;oBACR,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;oBACtC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;oBAC7C,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;iBACvD;aACF,CAAC;QACJ,KAAK,OAAO;YACV,OAAO;gBACL,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,SAAS,EAAE;gBAClE,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;gBAC1B,SAAS,EAAE;oBACT,IAAI,EAAE;wBACJ,IAAI,EAAE,eAAe;wBACrB,OAAO,EAAE,sBAAsB;wBAC/B,KAAK,EAAE;4BACL,QAAQ,EAAE,kCAAkC;4BAC5C,aAAa,EAAE,gDAAgD;4BAC/D,QAAQ,EAAE,0CAA0C;4BACpD,MAAM,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,kBAAkB,CAAC;yBAC3D;wBACD,MAAM,EAAE;4BACN,kBAAkB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;yBACzG;qBACF;iBACF;gBACD,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,kBAAkB,EAAE,EAAE;gBAC1G,QAAQ,EAAE;oBACR,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;oBACtC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;oBAC7C,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE;iBACrE;aACF,CAAC;QACJ;YACE,OAAO;gBACL,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,SAAS,EAAE;gBAClE,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;gBAC1B,SAAS,EAAE;oBACT,MAAM,EAAE;wBACN,IAAI,EAAE,QAAQ;wBACd,MAAM,EAAE,mBAAmB;wBAC3B,OAAO,EAAE,aAAa,CAAC,MAAM;wBAC7B,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE;qBACnH;iBACF;gBACD,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;gBAC9B,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE;aACpG,CAAC;IACN,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,GAAyB,EAAE,UAAkB,EAAE,QAAiB,EAAE,QAAiB,KAAK;IACtH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,+BAA+B,CAAC,CAAC;IAEzE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC;IAEtC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;YACzE,OAAO;QACT,CAAC;QAED,MAAM,cAAc,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE1E,OAAO,CAAC,OAAO,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;QAC5D,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACnD,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACvG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAgB,EAAE,GAAyB;IAC7E,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC;IACtC,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACnC,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,KAAK,CAAC;IAEzC,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0BAA0B,CAAC;SACvC,QAAQ,CAAC,UAAU,EAAE,gDAAgD,CAAC;SACtE,MAAM,CAAC,uBAAuB,EAAE,yBAAyB,CAAC;SAC1D,MAAM,CAAC,2BAA2B,EAAE,mDAAmD,CAAC;SACxF,MAAM,CAAC,aAAa,EAAE,wCAAwC,CAAC;SAC/D,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,OAAgE,EAAE,EAAE;QACjG,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;YAEzF,QAAQ,MAAM,EAAE,CAAC;gBACf,KAAK,MAAM;oBACT,MAAM,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;oBAClF,MAAM;gBACR,KAAK,MAAM;oBACT,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;wBAClC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;wBACnE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;oBACvC,CAAC;yBAAM,CAAC;wBACN,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;oBACnD,CAAC;oBACD,MAAM;gBACR,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC;oBACpC,SAAS,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;oBACtD,MAAM;gBACR,CAAC;gBACD,KAAK,UAAU,CAAC,CAAC,CAAC;oBAChB,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;wBAClC,IAAI,CAAC;4BACH,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;4BACpD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;wBAC/C,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACf,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;wBAC1G,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;oBACnD,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD;oBACE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvG,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -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,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 {};
|