@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.
- 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/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/index.d.ts +1 -0
- package/dist/server/runtime/http-server/index.js +70 -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/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,176 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { API_PATHS, HTTP_PROTOCOLS, LOCAL_HOSTS } from '../../constants/index.js';
|
|
5
|
+
function parseConfigPortHost(config) {
|
|
6
|
+
const port = (config?.httpserver?.port ?? config?.server?.port ?? config?.port);
|
|
7
|
+
const host = (config?.httpserver?.host ?? config?.server?.host ?? config?.host ?? LOCAL_HOSTS.LOCALHOST);
|
|
8
|
+
return { port, host };
|
|
9
|
+
}
|
|
10
|
+
function resolvePortHost(ctx, options, spinner) {
|
|
11
|
+
if (ctx.isDevPackage) {
|
|
12
|
+
const envPort = Number(ctx.env?.ROUTECODEX_PORT || ctx.env?.RCC_PORT || NaN);
|
|
13
|
+
if (!Number.isNaN(envPort) && envPort > 0) {
|
|
14
|
+
ctx.logger.info(`Using port ${envPort} from environment (ROUTECODEX_PORT/RCC_PORT) [dev package: routecodex]`);
|
|
15
|
+
return { port: envPort, host: LOCAL_HOSTS.LOCALHOST };
|
|
16
|
+
}
|
|
17
|
+
const resolvedPort = ctx.defaultDevPort;
|
|
18
|
+
ctx.logger.info(`Using dev default port ${resolvedPort} (routecodex dev package)`);
|
|
19
|
+
return { port: resolvedPort, host: LOCAL_HOSTS.LOCALHOST };
|
|
20
|
+
}
|
|
21
|
+
const fsImpl = ctx.fsImpl ?? fs;
|
|
22
|
+
const pathImpl = ctx.pathImpl ?? path;
|
|
23
|
+
const home = ctx.getHomeDir ?? (() => homedir());
|
|
24
|
+
const configPath = options.config || pathImpl.join(home(), '.routecodex', 'config.json');
|
|
25
|
+
if (!fsImpl.existsSync(configPath)) {
|
|
26
|
+
spinner.fail(`Configuration file not found: ${configPath}`);
|
|
27
|
+
ctx.logger.error('Cannot determine server port without configuration file');
|
|
28
|
+
ctx.logger.info('Please create a configuration file first:');
|
|
29
|
+
ctx.logger.info(' rcc config init');
|
|
30
|
+
ctx.exit(1);
|
|
31
|
+
}
|
|
32
|
+
let config;
|
|
33
|
+
try {
|
|
34
|
+
const configContent = fsImpl.readFileSync(configPath, 'utf8');
|
|
35
|
+
config = JSON.parse(configContent);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
spinner.fail('Failed to parse configuration file');
|
|
39
|
+
ctx.logger.error(`Invalid JSON in configuration file: ${configPath}`);
|
|
40
|
+
ctx.exit(1);
|
|
41
|
+
}
|
|
42
|
+
const { port, host } = parseConfigPortHost(config);
|
|
43
|
+
if (!port || typeof port !== 'number' || port <= 0) {
|
|
44
|
+
spinner.fail('Invalid or missing port configuration');
|
|
45
|
+
ctx.logger.error('Configuration file must specify a valid port number');
|
|
46
|
+
ctx.exit(1);
|
|
47
|
+
}
|
|
48
|
+
return { port, host: String(host || LOCAL_HOSTS.LOCALHOST) };
|
|
49
|
+
}
|
|
50
|
+
async function stopExisting(ctx, port) {
|
|
51
|
+
const pids = ctx.findListeningPids(port);
|
|
52
|
+
if (!pids.length)
|
|
53
|
+
return;
|
|
54
|
+
for (const pid of pids) {
|
|
55
|
+
ctx.killPidBestEffort(pid, { force: false });
|
|
56
|
+
}
|
|
57
|
+
const deadline = Date.now() + 3500;
|
|
58
|
+
while (Date.now() < deadline) {
|
|
59
|
+
if (ctx.findListeningPids(port).length === 0) {
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
await ctx.sleep(120);
|
|
63
|
+
}
|
|
64
|
+
const remain = ctx.findListeningPids(port);
|
|
65
|
+
for (const pid of remain) {
|
|
66
|
+
ctx.killPidBestEffort(pid, { force: true });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export function createRestartCommand(program, ctx) {
|
|
70
|
+
program
|
|
71
|
+
.command('restart')
|
|
72
|
+
.description('Restart the RouteCodex server')
|
|
73
|
+
.option('-c, --config <config>', 'Configuration file path')
|
|
74
|
+
.option('--log-level <level>', 'Log level (debug, info, warn, error)', 'info')
|
|
75
|
+
.option('--codex', 'Use Codex system prompt (tools unchanged)')
|
|
76
|
+
.option('--claude', 'Use Claude system prompt (tools unchanged)')
|
|
77
|
+
.action(async (options) => {
|
|
78
|
+
const spinner = await ctx.createSpinner('Restarting RouteCodex server...');
|
|
79
|
+
try {
|
|
80
|
+
const { port: resolvedPort, host: resolvedHost } = resolvePortHost(ctx, options, spinner);
|
|
81
|
+
await stopExisting(ctx, resolvedPort);
|
|
82
|
+
spinner.text = 'Starting RouteCodex server...';
|
|
83
|
+
// Prompt source flags
|
|
84
|
+
if (options.codex && options.claude) {
|
|
85
|
+
spinner.fail('Flags --codex and --claude are mutually exclusive');
|
|
86
|
+
ctx.exit(1);
|
|
87
|
+
}
|
|
88
|
+
const restartPrompt = options.codex ? 'codex' : (options.claude ? 'claude' : null);
|
|
89
|
+
if (restartPrompt) {
|
|
90
|
+
// Preserve existing behavior: mutate env for child.
|
|
91
|
+
ctx.env = ctx.env || process.env;
|
|
92
|
+
ctx.env.ROUTECODEX_SYSTEM_PROMPT_SOURCE = restartPrompt;
|
|
93
|
+
ctx.env.ROUTECODEX_SYSTEM_PROMPT_ENABLE = '1';
|
|
94
|
+
}
|
|
95
|
+
const modulesConfigPath = ctx.getModulesConfigPath();
|
|
96
|
+
const serverEntry = ctx.resolveServerEntryPath();
|
|
97
|
+
const env = { ...(ctx.env || process.env) };
|
|
98
|
+
const args = [serverEntry, modulesConfigPath];
|
|
99
|
+
const child = ctx.spawn(ctx.nodeBin, args, { stdio: 'inherit', env });
|
|
100
|
+
const fsImpl = ctx.fsImpl ?? fs;
|
|
101
|
+
const pathImpl = ctx.pathImpl ?? path;
|
|
102
|
+
const home = ctx.getHomeDir ?? (() => homedir());
|
|
103
|
+
try {
|
|
104
|
+
fsImpl.writeFileSync(pathImpl.join(home(), '.routecodex', 'server.cli.pid'), String(child.pid ?? ''), 'utf8');
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
/* ignore */
|
|
108
|
+
}
|
|
109
|
+
spinner.succeed(`RouteCodex server restarting on ${resolvedHost}:${resolvedPort}`);
|
|
110
|
+
ctx.logger.info(`Server will run on port: ${resolvedPort}`);
|
|
111
|
+
ctx.logger.info('Press Ctrl+C to stop the server');
|
|
112
|
+
const shutdown = async (sig) => {
|
|
113
|
+
try {
|
|
114
|
+
await ctx.fetch(`${HTTP_PROTOCOLS.HTTP}${LOCAL_HOSTS.IPV4}:${resolvedPort}${API_PATHS.SHUTDOWN}`, { method: 'POST' }).catch(() => { });
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
/* ignore */
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
child.kill(sig);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
/* ignore */
|
|
124
|
+
}
|
|
125
|
+
if (!ctx.isWindows) {
|
|
126
|
+
try {
|
|
127
|
+
if (child.pid) {
|
|
128
|
+
process.kill(-child.pid, sig);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
/* ignore */
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const deadline = Date.now() + 3500;
|
|
136
|
+
while (Date.now() < deadline) {
|
|
137
|
+
if (ctx.findListeningPids(resolvedPort).length === 0) {
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
await ctx.sleep(100);
|
|
141
|
+
}
|
|
142
|
+
const still = ctx.findListeningPids(resolvedPort);
|
|
143
|
+
for (const pid of still) {
|
|
144
|
+
ctx.killPidBestEffort(pid, { force: true });
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
ctx.exit(0);
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
/* ignore */
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
const onSignal = ctx.onSignal ?? ((sig, cb) => {
|
|
154
|
+
process.on(sig, cb);
|
|
155
|
+
});
|
|
156
|
+
onSignal('SIGINT', () => { void shutdown('SIGINT'); });
|
|
157
|
+
onSignal('SIGTERM', () => { void shutdown('SIGTERM'); });
|
|
158
|
+
const cleanupKeypress2 = ctx.setupKeypress(() => { void shutdown('SIGINT'); });
|
|
159
|
+
child.on('exit', (code, signal) => {
|
|
160
|
+
try {
|
|
161
|
+
cleanupKeypress2();
|
|
162
|
+
}
|
|
163
|
+
catch { /* ignore */ }
|
|
164
|
+
if (signal)
|
|
165
|
+
ctx.exit(0);
|
|
166
|
+
ctx.exit(code ?? 0);
|
|
167
|
+
});
|
|
168
|
+
await ctx.waitForever();
|
|
169
|
+
}
|
|
170
|
+
catch (e) {
|
|
171
|
+
spinner.fail(`Failed to restart: ${e.message}`);
|
|
172
|
+
ctx.exit(1);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=restart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart.js","sourceRoot":"","sources":["../../../src/cli/commands/restart.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import type { ChildProcess, SpawnOptions } from 'node:child_process';
|
|
4
|
+
import type { Command } from 'commander';
|
|
5
|
+
type Spinner = {
|
|
6
|
+
start(text?: string): Spinner;
|
|
7
|
+
succeed(text?: string): void;
|
|
8
|
+
fail(text?: string): void;
|
|
9
|
+
warn(text?: string): void;
|
|
10
|
+
info(text?: string): void;
|
|
11
|
+
stop(): void;
|
|
12
|
+
text: string;
|
|
13
|
+
};
|
|
14
|
+
type LoggerLike = {
|
|
15
|
+
info: (msg: string) => void;
|
|
16
|
+
warning: (msg: string) => void;
|
|
17
|
+
success: (msg: string) => void;
|
|
18
|
+
error: (msg: string) => void;
|
|
19
|
+
};
|
|
20
|
+
export type StartCommandOptions = {
|
|
21
|
+
config?: string;
|
|
22
|
+
port?: string;
|
|
23
|
+
quotaRouting?: unknown;
|
|
24
|
+
logLevel?: string;
|
|
25
|
+
codex?: boolean;
|
|
26
|
+
claude?: boolean;
|
|
27
|
+
ua?: string;
|
|
28
|
+
snap?: boolean;
|
|
29
|
+
snapOff?: boolean;
|
|
30
|
+
verboseErrors?: boolean;
|
|
31
|
+
quietErrors?: boolean;
|
|
32
|
+
restart?: boolean;
|
|
33
|
+
exclusive?: boolean;
|
|
34
|
+
};
|
|
35
|
+
export type StartCommandContext = {
|
|
36
|
+
isDevPackage: boolean;
|
|
37
|
+
isWindows: boolean;
|
|
38
|
+
defaultDevPort: number;
|
|
39
|
+
nodeBin: string;
|
|
40
|
+
createSpinner: (text: string) => Promise<Spinner>;
|
|
41
|
+
logger: LoggerLike;
|
|
42
|
+
env: NodeJS.ProcessEnv;
|
|
43
|
+
fsImpl?: typeof fs;
|
|
44
|
+
pathImpl?: typeof path;
|
|
45
|
+
homedir?: () => string;
|
|
46
|
+
tmpdir?: () => string;
|
|
47
|
+
sleep: (ms: number) => Promise<void>;
|
|
48
|
+
ensureLocalTokenPortalEnv: () => Promise<unknown>;
|
|
49
|
+
ensureTokenDaemonAutoStart: () => Promise<void>;
|
|
50
|
+
stopTokenDaemonIfRunning?: () => Promise<void>;
|
|
51
|
+
ensurePortAvailable: (port: number, spinner: Spinner, opts?: {
|
|
52
|
+
restart?: boolean;
|
|
53
|
+
}) => Promise<void>;
|
|
54
|
+
findListeningPids: (port: number) => number[];
|
|
55
|
+
killPidBestEffort: (pid: number, opts: {
|
|
56
|
+
force: boolean;
|
|
57
|
+
}) => void;
|
|
58
|
+
getModulesConfigPath: () => string;
|
|
59
|
+
resolveServerEntryPath: () => string;
|
|
60
|
+
spawn: (command: string, args: string[], options: SpawnOptions) => ChildProcess;
|
|
61
|
+
fetch: typeof fetch;
|
|
62
|
+
setupKeypress: (onInterrupt: () => void) => () => void;
|
|
63
|
+
waitForever: () => Promise<void>;
|
|
64
|
+
onSignal?: (signal: NodeJS.Signals, cb: () => void) => void;
|
|
65
|
+
exit: (code: number) => never;
|
|
66
|
+
};
|
|
67
|
+
export declare function createStartCommand(program: Command, ctx: StartCommandContext): void;
|
|
68
|
+
export {};
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { homedir, tmpdir } from 'node:os';
|
|
4
|
+
import { API_PATHS, HTTP_PROTOCOLS, LOCAL_HOSTS } from '../../constants/index.js';
|
|
5
|
+
function normalizePort(value) {
|
|
6
|
+
if (typeof value === 'number' && Number.isFinite(value))
|
|
7
|
+
return value;
|
|
8
|
+
if (typeof value === 'string' && value.trim()) {
|
|
9
|
+
const parsed = Number(value);
|
|
10
|
+
if (Number.isFinite(parsed))
|
|
11
|
+
return parsed;
|
|
12
|
+
}
|
|
13
|
+
return NaN;
|
|
14
|
+
}
|
|
15
|
+
function parseBoolish(value) {
|
|
16
|
+
if (typeof value !== 'string')
|
|
17
|
+
return undefined;
|
|
18
|
+
const normalized = value.trim().toLowerCase();
|
|
19
|
+
if (!normalized)
|
|
20
|
+
return undefined;
|
|
21
|
+
if (['1', 'true', 'yes', 'on', 'enable', 'enabled'].includes(normalized))
|
|
22
|
+
return true;
|
|
23
|
+
if (['0', 'false', 'no', 'off', 'disable', 'disabled'].includes(normalized))
|
|
24
|
+
return false;
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
export function createStartCommand(program, ctx) {
|
|
28
|
+
program
|
|
29
|
+
.command('start')
|
|
30
|
+
.description('Start the RouteCodex server')
|
|
31
|
+
.option('-c, --config <config>', 'Configuration file path')
|
|
32
|
+
.option('-p, --port <port>', 'RouteCodex server port (dev package only; overrides env/config)')
|
|
33
|
+
.option('--quota-routing <mode>', 'Quota routing admission control (on|off). off => do not remove providers from pool based on quota')
|
|
34
|
+
.option('--log-level <level>', 'Log level (debug, info, warn, error)', 'info')
|
|
35
|
+
.option('--codex', 'Use Codex system prompt (tools unchanged)')
|
|
36
|
+
.option('--claude', 'Use Claude system prompt (tools unchanged)')
|
|
37
|
+
.option('--ua <mode>', 'Upstream User-Agent override mode (e.g., codex)')
|
|
38
|
+
.option('--snap', 'Force-enable snapshot capture')
|
|
39
|
+
.option('--snap-off', 'Disable snapshot capture')
|
|
40
|
+
.option('--verbose-errors', 'Print verbose error stacks in console output')
|
|
41
|
+
.option('--quiet-errors', 'Silence detailed error stacks')
|
|
42
|
+
.option('--restart', 'Restart if an instance is already running')
|
|
43
|
+
.option('--exclusive', 'Always take over the port (kill existing listeners)')
|
|
44
|
+
.action(async (options) => {
|
|
45
|
+
const spinner = await ctx.createSpinner('Starting RouteCodex server...');
|
|
46
|
+
const fsImpl = ctx.fsImpl ?? fs;
|
|
47
|
+
const pathImpl = ctx.pathImpl ?? path;
|
|
48
|
+
const home = ctx.homedir ?? (() => homedir());
|
|
49
|
+
const tmp = ctx.tmpdir ?? (() => tmpdir());
|
|
50
|
+
try {
|
|
51
|
+
// Validate system prompt replacement flags
|
|
52
|
+
if (options.codex && options.claude) {
|
|
53
|
+
spinner.fail('Flags --codex and --claude are mutually exclusive');
|
|
54
|
+
ctx.exit(1);
|
|
55
|
+
}
|
|
56
|
+
const promptFlag = options.codex ? 'codex' : (options.claude ? 'claude' : null);
|
|
57
|
+
if (promptFlag) {
|
|
58
|
+
ctx.env.ROUTECODEX_SYSTEM_PROMPT_SOURCE = promptFlag;
|
|
59
|
+
ctx.env.ROUTECODEX_SYSTEM_PROMPT_ENABLE = '1';
|
|
60
|
+
}
|
|
61
|
+
const uaFromFlag = typeof options.ua === 'string' && options.ua.trim() ? options.ua.trim() : null;
|
|
62
|
+
const uaMode = uaFromFlag || (options.codex ? 'codex' : null);
|
|
63
|
+
if (uaMode) {
|
|
64
|
+
ctx.env.ROUTECODEX_UA_MODE = uaMode;
|
|
65
|
+
}
|
|
66
|
+
if (options.snap && options.snapOff) {
|
|
67
|
+
spinner.fail('Flags --snap and --snap-off are mutually exclusive');
|
|
68
|
+
ctx.exit(1);
|
|
69
|
+
}
|
|
70
|
+
if (options.snap) {
|
|
71
|
+
ctx.env.ROUTECODEX_SNAPSHOT = '1';
|
|
72
|
+
}
|
|
73
|
+
else if (options.snapOff) {
|
|
74
|
+
ctx.env.ROUTECODEX_SNAPSHOT = '0';
|
|
75
|
+
}
|
|
76
|
+
if (options.verboseErrors && options.quietErrors) {
|
|
77
|
+
spinner.fail('Flags --verbose-errors and --quiet-errors are mutually exclusive');
|
|
78
|
+
ctx.exit(1);
|
|
79
|
+
}
|
|
80
|
+
if (options.verboseErrors) {
|
|
81
|
+
ctx.env.ROUTECODEX_VERBOSE_ERRORS = '1';
|
|
82
|
+
}
|
|
83
|
+
else if (options.quietErrors) {
|
|
84
|
+
ctx.env.ROUTECODEX_VERBOSE_ERRORS = '0';
|
|
85
|
+
}
|
|
86
|
+
// Resolve config path
|
|
87
|
+
let configPath = options.config;
|
|
88
|
+
if (!configPath) {
|
|
89
|
+
configPath = pathImpl.join(home(), '.routecodex', 'config.json');
|
|
90
|
+
}
|
|
91
|
+
// Ensure provided config path is a file (not a directory)
|
|
92
|
+
if (fsImpl.existsSync(configPath)) {
|
|
93
|
+
const stats = fsImpl.statSync(configPath);
|
|
94
|
+
if (stats.isDirectory()) {
|
|
95
|
+
spinner.fail(`Configuration path must be a file, received directory: ${configPath}`);
|
|
96
|
+
ctx.exit(1);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Check if config exists; do NOT create defaults
|
|
100
|
+
if (!fsImpl.existsSync(configPath)) {
|
|
101
|
+
spinner.fail(`Configuration file not found: ${configPath}`);
|
|
102
|
+
ctx.logger.error('Please create a RouteCodex user config first (e.g., ~/.routecodex/config.json).');
|
|
103
|
+
ctx.logger.error('Or initialize via CLI:');
|
|
104
|
+
ctx.logger.error(' rcc config init');
|
|
105
|
+
ctx.logger.error('Or specify a custom configuration file:');
|
|
106
|
+
ctx.logger.error(' rcc start --config ./my-config.json');
|
|
107
|
+
ctx.exit(1);
|
|
108
|
+
}
|
|
109
|
+
// Load and validate configuration (non-dev packages rely on config port)
|
|
110
|
+
let config;
|
|
111
|
+
try {
|
|
112
|
+
const configContent = fsImpl.readFileSync(configPath, 'utf8');
|
|
113
|
+
config = JSON.parse(configContent);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
spinner.fail('Failed to parse configuration file');
|
|
117
|
+
ctx.logger.error(`Invalid JSON in configuration file: ${configPath}`);
|
|
118
|
+
ctx.exit(1);
|
|
119
|
+
}
|
|
120
|
+
const quotaRoutingOverride = parseBoolish(options.quotaRouting);
|
|
121
|
+
if (options.quotaRouting !== undefined && quotaRoutingOverride === undefined) {
|
|
122
|
+
spinner.fail('Invalid --quota-routing value. Use on|off');
|
|
123
|
+
ctx.exit(1);
|
|
124
|
+
}
|
|
125
|
+
if (typeof quotaRoutingOverride === 'boolean') {
|
|
126
|
+
const carrier = config && typeof config === 'object' ? config : {};
|
|
127
|
+
const httpserver = carrier.httpserver && typeof carrier.httpserver === 'object' && carrier.httpserver !== null
|
|
128
|
+
? carrier.httpserver
|
|
129
|
+
: {};
|
|
130
|
+
carrier.httpserver = {
|
|
131
|
+
...httpserver,
|
|
132
|
+
quotaRoutingEnabled: quotaRoutingOverride
|
|
133
|
+
};
|
|
134
|
+
config = carrier;
|
|
135
|
+
const dir = fsImpl.mkdtempSync(pathImpl.join(tmp(), 'routecodex-config-'));
|
|
136
|
+
const patchedPath = pathImpl.join(dir, 'config.json');
|
|
137
|
+
fsImpl.writeFileSync(patchedPath, JSON.stringify(config, null, 2), 'utf8');
|
|
138
|
+
configPath = patchedPath;
|
|
139
|
+
spinner.info(`quota routing override: ${quotaRoutingOverride ? 'on' : 'off'} (temp config)`);
|
|
140
|
+
}
|
|
141
|
+
// Determine effective port:
|
|
142
|
+
// - dev package (`routecodex`): env override, otherwise固定端口 DEFAULT_DEV_PORT
|
|
143
|
+
// - release package (`rcc`): 严格按配置文件端口启动
|
|
144
|
+
let resolvedPort;
|
|
145
|
+
if (ctx.isDevPackage) {
|
|
146
|
+
const flagPort = typeof options.port === 'string' ? Number(options.port) : NaN;
|
|
147
|
+
if (!Number.isNaN(flagPort) && flagPort > 0) {
|
|
148
|
+
ctx.logger.info(`Using port ${flagPort} from --port flag [dev package: routecodex]`);
|
|
149
|
+
resolvedPort = flagPort;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
const envPort = Number(ctx.env.ROUTECODEX_PORT || ctx.env.RCC_PORT || NaN);
|
|
153
|
+
if (!Number.isNaN(envPort) && envPort > 0) {
|
|
154
|
+
ctx.logger.info(`Using port ${envPort} from environment (ROUTECODEX_PORT/RCC_PORT) [dev package: routecodex]`);
|
|
155
|
+
resolvedPort = envPort;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
resolvedPort = ctx.defaultDevPort;
|
|
159
|
+
ctx.logger.info(`Using dev default port ${resolvedPort} (routecodex dev package)`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
const port = (config?.httpserver?.port ?? config?.server?.port ?? config?.port);
|
|
165
|
+
if (!port || typeof port !== 'number' || port <= 0) {
|
|
166
|
+
spinner.fail('Invalid or missing port configuration');
|
|
167
|
+
ctx.logger.error('Please set a valid port (httpserver.port or top-level port) in your configuration');
|
|
168
|
+
ctx.exit(1);
|
|
169
|
+
}
|
|
170
|
+
resolvedPort = port;
|
|
171
|
+
}
|
|
172
|
+
// Ensure port state aligns with requested behavior
|
|
173
|
+
// Preserve existing CLI behavior: always attempt takeover; "restart" flag is informational only here.
|
|
174
|
+
await ctx.ensurePortAvailable(resolvedPort, spinner, { restart: true });
|
|
175
|
+
const resolveServerHost = () => {
|
|
176
|
+
if (typeof config?.httpserver?.host === 'string' && config.httpserver.host.trim())
|
|
177
|
+
return config.httpserver.host;
|
|
178
|
+
if (typeof config?.server?.host === 'string' && config.server.host.trim())
|
|
179
|
+
return config.server.host;
|
|
180
|
+
if (typeof config?.host === 'string' && config.host.trim())
|
|
181
|
+
return config.host;
|
|
182
|
+
return LOCAL_HOSTS.LOCALHOST;
|
|
183
|
+
};
|
|
184
|
+
const serverHost = resolveServerHost();
|
|
185
|
+
ctx.env.ROUTECODEX_PORT = String(resolvedPort);
|
|
186
|
+
ctx.env.RCC_PORT = String(resolvedPort);
|
|
187
|
+
ctx.env.ROUTECODEX_HTTP_HOST = serverHost;
|
|
188
|
+
ctx.env.ROUTECODEX_HTTP_PORT = String(resolvedPort);
|
|
189
|
+
await ctx.ensureLocalTokenPortalEnv();
|
|
190
|
+
// Best-effort auto-start of token daemon (can be disabled via env)
|
|
191
|
+
await ctx.ensureTokenDaemonAutoStart();
|
|
192
|
+
const modulesConfigPath = ctx.getModulesConfigPath();
|
|
193
|
+
if (!fsImpl.existsSync(modulesConfigPath)) {
|
|
194
|
+
spinner.fail(`Modules configuration file not found: ${modulesConfigPath}`);
|
|
195
|
+
ctx.exit(1);
|
|
196
|
+
}
|
|
197
|
+
const nodeBin = ctx.nodeBin || process.execPath;
|
|
198
|
+
const serverEntry = ctx.resolveServerEntryPath();
|
|
199
|
+
const env = { ...ctx.env };
|
|
200
|
+
env.ROUTECODEX_CONFIG = configPath;
|
|
201
|
+
env.ROUTECODEX_CONFIG_PATH = configPath;
|
|
202
|
+
if (ctx.isDevPackage) {
|
|
203
|
+
env.ROUTECODEX_PORT = String(resolvedPort);
|
|
204
|
+
}
|
|
205
|
+
const args = [serverEntry, modulesConfigPath];
|
|
206
|
+
const childProc = ctx.spawn(nodeBin, args, { stdio: 'inherit', env });
|
|
207
|
+
try {
|
|
208
|
+
const pidFile = pathImpl.join(home(), '.routecodex', 'server.cli.pid');
|
|
209
|
+
fsImpl.writeFileSync(pidFile, String(childProc.pid ?? ''), 'utf8');
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
/* ignore */
|
|
213
|
+
}
|
|
214
|
+
spinner.succeed(`RouteCodex server starting on ${serverHost}:${resolvedPort}`);
|
|
215
|
+
ctx.logger.info(`Configuration loaded from: ${configPath}`);
|
|
216
|
+
ctx.logger.info(`Server will run on port: ${resolvedPort}`);
|
|
217
|
+
ctx.logger.info('Press Ctrl+C to stop the server');
|
|
218
|
+
const shutdown = async (sig) => {
|
|
219
|
+
try {
|
|
220
|
+
await ctx.fetch(`${HTTP_PROTOCOLS.HTTP}${LOCAL_HOSTS.IPV4}:${resolvedPort}${API_PATHS.SHUTDOWN}`, { method: 'POST' }).catch(() => { });
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
/* ignore */
|
|
224
|
+
}
|
|
225
|
+
try {
|
|
226
|
+
childProc.kill(sig);
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
/* ignore */
|
|
230
|
+
}
|
|
231
|
+
if (!ctx.isWindows) {
|
|
232
|
+
try {
|
|
233
|
+
if (childProc.pid) {
|
|
234
|
+
process.kill(-childProc.pid, sig);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
/* ignore */
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
const deadline = Date.now() + 3500;
|
|
242
|
+
while (Date.now() < deadline) {
|
|
243
|
+
if (ctx.findListeningPids(resolvedPort).length === 0)
|
|
244
|
+
break;
|
|
245
|
+
await ctx.sleep(120);
|
|
246
|
+
}
|
|
247
|
+
const remain = ctx.findListeningPids(resolvedPort);
|
|
248
|
+
if (remain.length) {
|
|
249
|
+
for (const pid of remain)
|
|
250
|
+
ctx.killPidBestEffort(pid, { force: false });
|
|
251
|
+
const killDeadline = Date.now() + 1500;
|
|
252
|
+
while (Date.now() < killDeadline) {
|
|
253
|
+
if (ctx.findListeningPids(resolvedPort).length === 0)
|
|
254
|
+
break;
|
|
255
|
+
await ctx.sleep(100);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
const still = ctx.findListeningPids(resolvedPort);
|
|
259
|
+
if (still.length) {
|
|
260
|
+
for (const pid of still)
|
|
261
|
+
ctx.killPidBestEffort(pid, { force: true });
|
|
262
|
+
}
|
|
263
|
+
if (ctx.isDevPackage) {
|
|
264
|
+
await ctx.stopTokenDaemonIfRunning?.();
|
|
265
|
+
}
|
|
266
|
+
try {
|
|
267
|
+
ctx.exit(0);
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
/* ignore */
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
const onSignal = ctx.onSignal ?? ((sig, cb) => process.on(sig, cb));
|
|
274
|
+
onSignal('SIGINT', () => { void shutdown('SIGINT'); });
|
|
275
|
+
onSignal('SIGTERM', () => { void shutdown('SIGTERM'); });
|
|
276
|
+
const cleanupKeypress = ctx.setupKeypress(() => { void shutdown('SIGINT'); });
|
|
277
|
+
childProc.on('exit', (code, signal) => {
|
|
278
|
+
try {
|
|
279
|
+
cleanupKeypress();
|
|
280
|
+
}
|
|
281
|
+
catch { /* ignore */ }
|
|
282
|
+
if (signal)
|
|
283
|
+
ctx.exit(0);
|
|
284
|
+
ctx.exit(code ?? 0);
|
|
285
|
+
});
|
|
286
|
+
await ctx.waitForever();
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
spinner.fail('Failed to start server');
|
|
290
|
+
ctx.logger.error(error instanceof Error ? error.message : String(error));
|
|
291
|
+
ctx.exit(1);
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import type { LoadedRouteCodexConfig } from '../../config/routecodex-config-loader.js';
|
|
3
|
+
type LoggerLike = {
|
|
4
|
+
info: (msg: string) => void;
|
|
5
|
+
warning: (msg: string) => void;
|
|
6
|
+
success: (msg: string) => void;
|
|
7
|
+
error: (msg: string) => void;
|
|
8
|
+
};
|
|
9
|
+
export type StatusCommandContext = {
|
|
10
|
+
logger: LoggerLike;
|
|
11
|
+
log: (line: string) => void;
|
|
12
|
+
loadConfig: () => Promise<LoadedRouteCodexConfig>;
|
|
13
|
+
fetch: typeof fetch;
|
|
14
|
+
};
|
|
15
|
+
export declare function createStatusCommand(program: Command, ctx: StatusCommandContext): void;
|
|
16
|
+
export {};
|