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