@jsonstudio/rcc 0.89.333 → 0.89.548
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 +3 -3
- package/dist/build-info.js.map +1 -1
- package/dist/cli.js +110 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/token-daemon.d.ts +2 -0
- package/dist/commands/token-daemon.js +183 -0
- package/dist/commands/token-daemon.js.map +1 -0
- package/dist/index.js +20 -3
- package/dist/index.js.map +1 -1
- package/dist/modules/llmswitch/bridge.d.ts +1 -1
- package/dist/modules/llmswitch/bridge.js +3 -2
- package/dist/modules/llmswitch/bridge.js.map +1 -1
- package/dist/modules/pipeline/utils/colored-logger.js +3 -1
- package/dist/modules/pipeline/utils/colored-logger.js.map +1 -1
- package/dist/providers/auth/gemini-cli-userinfo-helper.js +12 -2
- package/dist/providers/auth/gemini-cli-userinfo-helper.js.map +1 -1
- package/dist/providers/auth/oauth-lifecycle.js +337 -25
- package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
- package/dist/providers/core/config/oauth-flows.d.ts +23 -0
- package/dist/providers/core/config/oauth-flows.js +92 -5
- package/dist/providers/core/config/oauth-flows.js.map +1 -1
- package/dist/providers/core/config/provider-oauth-configs.js +9 -3
- package/dist/providers/core/config/provider-oauth-configs.js.map +1 -1
- package/dist/providers/core/config/service-profiles.js +18 -10
- package/dist/providers/core/config/service-profiles.js.map +1 -1
- package/dist/providers/core/runtime/base-provider.d.ts +2 -0
- package/dist/providers/core/runtime/base-provider.js +35 -1
- package/dist/providers/core/runtime/base-provider.js.map +1 -1
- package/dist/providers/core/runtime/gemini-cli-http-provider.js +87 -20
- package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
- package/dist/providers/core/runtime/http-request-executor.d.ts +1 -0
- package/dist/providers/core/runtime/http-request-executor.js +75 -1
- package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
- package/dist/providers/core/runtime/http-transport-provider.d.ts +2 -0
- package/dist/providers/core/runtime/http-transport-provider.js +60 -2
- package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
- package/dist/providers/core/runtime/iflow-http-provider.d.ts +4 -0
- package/dist/providers/core/runtime/iflow-http-provider.js +28 -0
- package/dist/providers/core/runtime/iflow-http-provider.js.map +1 -1
- package/dist/providers/core/runtime/rate-limit-manager.d.ts +30 -0
- package/dist/providers/core/runtime/rate-limit-manager.js +136 -0
- package/dist/providers/core/runtime/rate-limit-manager.js.map +1 -0
- package/dist/providers/core/runtime/responses-provider.js +8 -3
- package/dist/providers/core/runtime/responses-provider.js.map +1 -1
- package/dist/providers/core/runtime/vision-debug-utils.d.ts +13 -0
- package/dist/providers/core/runtime/vision-debug-utils.js +114 -0
- package/dist/providers/core/runtime/vision-debug-utils.js.map +1 -0
- package/dist/providers/core/strategies/oauth-auth-code-flow.js +75 -26
- package/dist/providers/core/strategies/oauth-auth-code-flow.js.map +1 -1
- package/dist/providers/core/utils/http-client.js +2 -1
- package/dist/providers/core/utils/http-client.js.map +1 -1
- package/dist/providers/core/utils/provider-error-reporter.js +31 -5
- package/dist/providers/core/utils/provider-error-reporter.js.map +1 -1
- package/dist/providers/core/utils/provider-type-utils.js +1 -1
- package/dist/providers/core/utils/provider-type-utils.js.map +1 -1
- package/dist/providers/core/utils/snapshot-writer.d.ts +1 -1
- package/dist/providers/core/utils/snapshot-writer.js.map +1 -1
- package/dist/server/handlers/sse-dispatcher.js +22 -2
- package/dist/server/handlers/sse-dispatcher.js.map +1 -1
- package/dist/server/runtime/http-server/index.d.ts +9 -0
- package/dist/server/runtime/http-server/index.js +512 -144
- package/dist/server/runtime/http-server/index.js.map +1 -1
- package/dist/server/runtime/http-server/provider-utils.js +1 -1
- package/dist/server/runtime/http-server/provider-utils.js.map +1 -1
- package/dist/server/runtime/http-server/request-executor.d.ts +10 -0
- package/dist/server/runtime/http-server/request-executor.js +553 -159
- 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 +29 -0
- package/dist/server/runtime/http-server/routes.js.map +1 -1
- package/dist/server/runtime/http-server/runtime-manager.js +33 -0
- package/dist/server/runtime/http-server/runtime-manager.js.map +1 -1
- package/dist/server/utils/utf8-chunk-buffer.d.ts +43 -0
- package/dist/server/utils/utf8-chunk-buffer.js +132 -0
- package/dist/server/utils/utf8-chunk-buffer.js.map +1 -0
- package/dist/token-daemon/history-store.d.ts +75 -0
- package/dist/token-daemon/history-store.js +207 -0
- package/dist/token-daemon/history-store.js.map +1 -0
- package/dist/token-daemon/index.d.ts +7 -0
- package/dist/token-daemon/index.js +336 -0
- package/dist/token-daemon/index.js.map +1 -0
- package/dist/token-daemon/server-utils.d.ts +33 -0
- package/dist/token-daemon/server-utils.js +155 -0
- package/dist/token-daemon/server-utils.js.map +1 -0
- package/dist/token-daemon/token-daemon.d.ts +23 -0
- package/dist/token-daemon/token-daemon.js +249 -0
- package/dist/token-daemon/token-daemon.js.map +1 -0
- package/dist/token-daemon/token-types.d.ts +44 -0
- package/dist/token-daemon/token-types.js +18 -0
- package/dist/token-daemon/token-types.js.map +1 -0
- package/dist/token-daemon/token-utils.d.ts +17 -0
- package/dist/token-daemon/token-utils.js +153 -0
- package/dist/token-daemon/token-utils.js.map +1 -0
- package/dist/token-portal/local-token-portal.d.ts +1 -0
- package/dist/token-portal/local-token-portal.js +89 -0
- package/dist/token-portal/local-token-portal.js.map +1 -0
- package/dist/token-portal/render.d.ts +10 -0
- package/dist/token-portal/render.js +56 -0
- package/dist/token-portal/render.js.map +1 -0
- package/dist/tools/semantic-replay.js +7 -6
- package/dist/tools/semantic-replay.js.map +1 -1
- package/dist/utils/error-handler-registry.d.ts +36 -0
- package/dist/utils/error-handler-registry.js +93 -7
- package/dist/utils/error-handler-registry.js.map +1 -1
- package/node_modules/@jsonstudio/llms/README.md +2 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/codecs/gemini-openai-codec.js +137 -5
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/gemini-web-search.d.ts +17 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/gemini-web-search.js +68 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-image-content.d.ts +2 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-image-content.js +83 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-vision-prompt.d.ts +11 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-vision-prompt.js +177 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-web-search.d.ts +2 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-web-search.js +63 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/universal-shape-filter.js +11 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-gemini.json +17 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-glm.json +190 -181
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-iflow.json +195 -195
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-lmstudio.json +43 -43
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-qwen.json +20 -20
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/responses-c4m.json +42 -42
- package/node_modules/@jsonstudio/llms/dist/conversion/config/sample-config.json +1 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-pipeline-executor.js +24 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-types.d.ts +8 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline.js +39 -4
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/target-utils.js +6 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/process/chat-process.js +213 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/provider-response.d.ts +34 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/provider-response.js +84 -24
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/server-side-tools.d.ts +26 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/server-side-tools.js +383 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/semantic-mappers/gemini-mapper.js +241 -14
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/semantic-mappers/responses-mapper.js +17 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/standardized-bridge.js +14 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/types/standardized.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/responses/responses-openai-bridge.js +82 -3
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/anthropic-message-utils.js +92 -3
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/bridge-message-utils.js +137 -10
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-output-builder.js +43 -2
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/snapshot-utils.js +17 -47
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-filter-pipeline.js +1 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-mapping.js +25 -2
- package/node_modules/@jsonstudio/llms/dist/index.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/index.js +1 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap.js +308 -43
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/classifier.js +11 -17
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/context-advisor.d.ts +0 -2
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/context-advisor.js +0 -12
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine.d.ts +17 -2
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine.js +332 -95
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/features.js +1 -1
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/message-utils.js +36 -24
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/provider-registry.js +2 -1
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/token-counter.js +14 -3
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/types.d.ts +66 -2
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/types.js +2 -1
- package/node_modules/@jsonstudio/llms/dist/servertool/engine.d.ts +27 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/engine.js +60 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/flow-types.d.ts +40 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/flow-types.js +1 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/vision.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/vision.js +194 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/web-search.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/web-search.js +638 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/orchestration-types.d.ts +33 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/orchestration-types.js +1 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/registry.d.ts +18 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/registry.js +27 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/server-side-tools.d.ts +8 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/server-side-tools.js +208 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/types.d.ts +88 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/types.js +1 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/vision-tool.d.ts +2 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/vision-tool.js +185 -0
- package/node_modules/@jsonstudio/llms/dist/sse/json-to-sse/event-generators/responses.js +15 -3
- package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/builders/response-builder.js +6 -3
- package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/gemini-sse-to-json-converter.js +27 -1
- package/node_modules/@jsonstudio/llms/dist/sse/types/gemini-types.d.ts +20 -1
- package/node_modules/@jsonstudio/llms/dist/sse/types/responses-types.js +1 -1
- package/node_modules/@jsonstudio/llms/dist/telemetry/stats-center.d.ts +73 -0
- package/node_modules/@jsonstudio/llms/dist/telemetry/stats-center.js +280 -0
- package/node_modules/@jsonstudio/llms/package.json +1 -1
- package/package.json +3 -2
- package/scripts/pack-mode.mjs +2 -1
- package/scripts/publish-rcc.mjs +20 -4
- package/scripts/test-iflow-web-search.mjs +141 -0
- package/scripts/test-iflow.mjs +93 -1
- package/scripts/tests/virtual-router-health.mjs +141 -6
- package/dist/tools/replay-request.d.ts +0 -0
- package/dist/tools/replay-request.js +0 -2
- package/dist/tools/replay-request.js.map +0 -1
|
@@ -13,7 +13,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
|
13
13
|
|
|
14
14
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
15
15
|
const ROOT = path.resolve(__dirname, '../..');
|
|
16
|
-
const CORE_DIST = path.join(ROOT, 'sharedmodule', 'llmswitch-core', 'dist', '
|
|
16
|
+
const CORE_DIST = path.join(ROOT, 'sharedmodule', 'llmswitch-core', 'dist', 'router', 'virtual-router');
|
|
17
17
|
|
|
18
18
|
async function loadCoreModule(rel) {
|
|
19
19
|
const file = path.join(CORE_DIST, rel);
|
|
@@ -21,16 +21,19 @@ async function loadCoreModule(rel) {
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
const { VirtualRouterEngine } = await loadCoreModule('engine.js');
|
|
24
|
+
const { bootstrapVirtualRouterConfig } = await loadCoreModule('bootstrap.js');
|
|
24
25
|
const { providerErrorCenter } = await loadCoreModule('error-center.js');
|
|
25
26
|
const { VirtualRouterError } = await loadCoreModule('types.js');
|
|
26
27
|
|
|
27
28
|
function parseArgs(argv) {
|
|
28
|
-
const args = { out: null };
|
|
29
|
+
const args = { out: null, config: null };
|
|
29
30
|
const list = [...argv];
|
|
30
31
|
while (list.length) {
|
|
31
32
|
const cur = list.shift();
|
|
32
33
|
if (cur === '--out' || cur === '--output') {
|
|
33
34
|
args.out = list.shift() || null;
|
|
35
|
+
} else if (cur === '--config') {
|
|
36
|
+
args.config = list.shift() || null;
|
|
34
37
|
} else if (cur === '--help' || cur === '-h') {
|
|
35
38
|
args.help = true;
|
|
36
39
|
}
|
|
@@ -57,9 +60,18 @@ function createRouterConfig() {
|
|
|
57
60
|
'charlie.sim-model': buildProviderProfile('charlie.sim-model', 'https://charlie.local/v1')
|
|
58
61
|
};
|
|
59
62
|
const routing = {
|
|
60
|
-
default:
|
|
61
|
-
|
|
62
|
-
|
|
63
|
+
default: [
|
|
64
|
+
{ id: 'default-primary', priority: 200, targets: ['alpha.sim-model', 'bravo.sim-model'] },
|
|
65
|
+
{ id: 'default-backup', backup: true, priority: 100, targets: ['charlie.sim-model'] }
|
|
66
|
+
],
|
|
67
|
+
coding: [
|
|
68
|
+
{ id: 'coding-primary', priority: 200, targets: ['bravo.sim-model', 'charlie.sim-model'] },
|
|
69
|
+
{ id: 'coding-backup', backup: true, priority: 100, targets: ['alpha.sim-model'] }
|
|
70
|
+
],
|
|
71
|
+
thinking: [
|
|
72
|
+
{ id: 'thinking-primary', priority: 200, targets: ['charlie.sim-model'] },
|
|
73
|
+
{ id: 'thinking-backup', backup: true, priority: 100, targets: ['bravo.sim-model'] }
|
|
74
|
+
]
|
|
63
75
|
};
|
|
64
76
|
return {
|
|
65
77
|
routing,
|
|
@@ -227,16 +239,128 @@ async function scenarioScheduler(sim) {
|
|
|
227
239
|
sim.runRoute('thinking');
|
|
228
240
|
}
|
|
229
241
|
|
|
242
|
+
async function scenarioPriorityPools(sim) {
|
|
243
|
+
const first = sim.runRoute('thinking');
|
|
244
|
+
if (first !== 'charlie.sim-model') {
|
|
245
|
+
throw new Error(`expected primary thinking pool hit charlie.sim-model, got ${first}`);
|
|
246
|
+
}
|
|
247
|
+
sim.engine.handleProviderFailure({
|
|
248
|
+
providerKey: 'charlie.sim-model',
|
|
249
|
+
reason: 'priority-test',
|
|
250
|
+
fatal: true,
|
|
251
|
+
affectsHealth: true,
|
|
252
|
+
cooldownOverrideMs: 60_000
|
|
253
|
+
});
|
|
254
|
+
const second = sim.runRoute('thinking');
|
|
255
|
+
if (second !== 'bravo.sim-model') {
|
|
256
|
+
throw new Error(`expected thinking backup pool hit bravo.sim-model, got ${second}`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
230
260
|
async function scenarioRoutingDirectives(sim) {
|
|
231
261
|
sim.runRoute('baseline', '普通请求');
|
|
232
262
|
sim.runRoute('forced-thinking', '请仔细分析这个问题 <**thinking**>');
|
|
233
263
|
sim.runRoute('forced-provider', '请强制使用这个provider <**charlie.sim-model**> 来回答');
|
|
234
264
|
}
|
|
235
265
|
|
|
266
|
+
async function scenarioRealConfig(configPath) {
|
|
267
|
+
const resolvedPath = path.resolve(configPath);
|
|
268
|
+
console.log(`\n=== Scenario: real-config (${resolvedPath}) ===`);
|
|
269
|
+
const source = JSON.parse(await fs.readFile(resolvedPath, 'utf-8'));
|
|
270
|
+
const section = source.virtualrouter && typeof source.virtualrouter === 'object' ? source.virtualrouter : source;
|
|
271
|
+
const { config } = bootstrapVirtualRouterConfig(section);
|
|
272
|
+
const engine = new VirtualRouterEngine();
|
|
273
|
+
engine.initialize(config);
|
|
274
|
+
const thinkingPools = config.routing.thinking ?? [];
|
|
275
|
+
const primaryPools = thinkingPools.filter((tier) => !tier.backup);
|
|
276
|
+
const backupPools = thinkingPools.filter((tier) => tier.backup);
|
|
277
|
+
|
|
278
|
+
const runThinking = (label) => {
|
|
279
|
+
const reqId = `real-config-${label}-${Date.now()}`;
|
|
280
|
+
const request = {
|
|
281
|
+
model: 'gpt-5.2-codex',
|
|
282
|
+
messages: [
|
|
283
|
+
{ role: 'system', content: 'diagnostic' },
|
|
284
|
+
{ role: 'user', content: `深入思考:${label}` }
|
|
285
|
+
]
|
|
286
|
+
};
|
|
287
|
+
const metadata = {
|
|
288
|
+
requestId: reqId,
|
|
289
|
+
entryEndpoint: '/v1/responses',
|
|
290
|
+
processMode: 'chat',
|
|
291
|
+
stream: false,
|
|
292
|
+
direction: 'request',
|
|
293
|
+
providerProtocol: 'openai-responses'
|
|
294
|
+
};
|
|
295
|
+
const result = engine.route(request, metadata);
|
|
296
|
+
console.log(
|
|
297
|
+
JSON.stringify(
|
|
298
|
+
{
|
|
299
|
+
stage: 'real-config-route',
|
|
300
|
+
label,
|
|
301
|
+
providerKey: result.decision.providerKey,
|
|
302
|
+
route: result.decision.routeName,
|
|
303
|
+
poolId: result.decision.poolId
|
|
304
|
+
},
|
|
305
|
+
null,
|
|
306
|
+
2
|
|
307
|
+
)
|
|
308
|
+
);
|
|
309
|
+
return result.decision.providerKey;
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
const markUnavailable = (targets, reason) => {
|
|
313
|
+
for (const key of targets || []) {
|
|
314
|
+
engine.handleProviderFailure({
|
|
315
|
+
providerKey: key,
|
|
316
|
+
fatal: true,
|
|
317
|
+
affectsHealth: true,
|
|
318
|
+
reason,
|
|
319
|
+
cooldownOverrideMs: 60_000
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
};
|
|
323
|
+
|
|
324
|
+
// Primary hit
|
|
325
|
+
const firstProvider = runThinking('primary-hit');
|
|
326
|
+
const primaryTargets = primaryPools.flatMap((pool) => pool.targets ?? []);
|
|
327
|
+
const backupTargets = backupPools.flatMap((pool) => pool.targets ?? []);
|
|
328
|
+
if (primaryTargets.length === 0) {
|
|
329
|
+
console.warn('[real-config] No explicit primary thinking pool configured.');
|
|
330
|
+
} else if (!primaryTargets.includes(firstProvider)) {
|
|
331
|
+
console.warn('[real-config] First provider is not part of primary tier:', firstProvider);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// Drain primary
|
|
335
|
+
markUnavailable(primaryTargets, 'primary-exhausted');
|
|
336
|
+
const secondProvider = runThinking('backup-hit');
|
|
337
|
+
if (backupTargets.length && !backupTargets.includes(secondProvider)) {
|
|
338
|
+
throw new Error(
|
|
339
|
+
`[real-config] Expected backup pool provider after draining primary, got ${secondProvider}`
|
|
340
|
+
);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// Drain backup -> should fall to default
|
|
344
|
+
markUnavailable(backupTargets, 'backup-exhausted');
|
|
345
|
+
const thirdProvider = runThinking('default-fallback');
|
|
346
|
+
const usedRoute = engine.getStatus().routes;
|
|
347
|
+
console.log(
|
|
348
|
+
JSON.stringify(
|
|
349
|
+
{
|
|
350
|
+
stage: 'real-config-summary',
|
|
351
|
+
thirdProvider,
|
|
352
|
+
routes: usedRoute
|
|
353
|
+
},
|
|
354
|
+
null,
|
|
355
|
+
2
|
|
356
|
+
)
|
|
357
|
+
);
|
|
358
|
+
}
|
|
359
|
+
|
|
236
360
|
async function main() {
|
|
237
361
|
const args = parseArgs(process.argv.slice(2));
|
|
238
362
|
if (args.help) {
|
|
239
|
-
console.log('Usage: node scripts/tests/virtual-router-health.mjs [--out summary.json]');
|
|
363
|
+
console.log('Usage: node scripts/tests/virtual-router-health.mjs [--out summary.json] [--config ~/.routecodex/config.json]');
|
|
240
364
|
return;
|
|
241
365
|
}
|
|
242
366
|
|
|
@@ -247,6 +371,7 @@ async function main() {
|
|
|
247
371
|
['upstream', scenarioUpstream],
|
|
248
372
|
['timeout', scenarioTimeout],
|
|
249
373
|
['scheduler', scenarioScheduler],
|
|
374
|
+
['priority-pools', scenarioPriorityPools],
|
|
250
375
|
['routing-directives', scenarioRoutingDirectives]
|
|
251
376
|
];
|
|
252
377
|
|
|
@@ -260,6 +385,16 @@ async function main() {
|
|
|
260
385
|
});
|
|
261
386
|
}
|
|
262
387
|
|
|
388
|
+
if (args.config) {
|
|
389
|
+
try {
|
|
390
|
+
await scenarioRealConfig(args.config);
|
|
391
|
+
summary.push({ name: 'real-config', status: 'ok', lastHealth: null });
|
|
392
|
+
} catch (error) {
|
|
393
|
+
console.error('[real-config] failed:', error);
|
|
394
|
+
summary.push({ name: 'real-config', status: 'failed', error: error?.message || String(error), lastHealth: null });
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
263
398
|
if (args.out) {
|
|
264
399
|
const outFile = path.resolve(process.cwd(), args.out);
|
|
265
400
|
await fs.mkdir(path.dirname(outFile), { recursive: true });
|
|
File without changes
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"replay-request.js","sourceRoot":"","sources":["../../src/tools/replay-request.ts"],"names":[],"mappings":""}
|