@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
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
import fetch from 'node-fetch';
|
|
5
|
+
import { loadRouteCodexConfig } from '../config/routecodex-config-loader.js';
|
|
6
|
+
const SERVER_PID_FILE = path.join(homedir(), '.routecodex', 'server.cli.pid');
|
|
7
|
+
function tryReadNumber(value) {
|
|
8
|
+
if (!value) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
const parsed = Number(String(value).trim());
|
|
12
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : null;
|
|
13
|
+
}
|
|
14
|
+
export async function detectLocalServerInstance() {
|
|
15
|
+
try {
|
|
16
|
+
const cfgPath = await resolveUserConfigPath();
|
|
17
|
+
const { userConfig } = await loadRouteCodexConfig(cfgPath);
|
|
18
|
+
const cfg = userConfig;
|
|
19
|
+
const httpNode = (cfg.httpserver && typeof cfg.httpserver === 'object'
|
|
20
|
+
? cfg.httpserver
|
|
21
|
+
: undefined);
|
|
22
|
+
const srvNode = (cfg.server && typeof cfg.server === 'object'
|
|
23
|
+
? cfg.server
|
|
24
|
+
: undefined);
|
|
25
|
+
const host = readString(httpNode?.host) ??
|
|
26
|
+
readString(srvNode?.host) ??
|
|
27
|
+
'127.0.0.1';
|
|
28
|
+
const port = readNumber(httpNode?.port) ??
|
|
29
|
+
readNumber(srvNode?.port) ??
|
|
30
|
+
readNumber(cfg.port) ??
|
|
31
|
+
5555;
|
|
32
|
+
const baseUrl = `http://${host}:${port}`;
|
|
33
|
+
let status = 'offline';
|
|
34
|
+
try {
|
|
35
|
+
const res = await fetch(`${baseUrl}/health`, { method: 'GET', timeout: 1500 });
|
|
36
|
+
if (res.ok) {
|
|
37
|
+
status = 'online';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
status = 'offline';
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
id: `local-${port}`,
|
|
45
|
+
baseUrl,
|
|
46
|
+
host,
|
|
47
|
+
port,
|
|
48
|
+
configPath: cfgPath,
|
|
49
|
+
status
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async function resolveUserConfigPath() {
|
|
57
|
+
try {
|
|
58
|
+
// Prefer ROUTECODEX_CONFIG if present
|
|
59
|
+
const envPath = process.env.ROUTECODEX_CONFIG || process.env.ROUTECODEX_CONFIG_PATH;
|
|
60
|
+
if (envPath && envPath.trim()) {
|
|
61
|
+
return path.resolve(envPath.trim());
|
|
62
|
+
}
|
|
63
|
+
const defaultPath = path.join(homedir(), '.routecodex', 'config.json');
|
|
64
|
+
return defaultPath;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return path.join(homedir(), '.routecodex', 'config.json');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function readString(value) {
|
|
71
|
+
if (typeof value === 'string' && value.trim()) {
|
|
72
|
+
return value.trim();
|
|
73
|
+
}
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
function readNumber(value) {
|
|
77
|
+
if (typeof value === 'number' && Number.isFinite(value)) {
|
|
78
|
+
return value;
|
|
79
|
+
}
|
|
80
|
+
if (typeof value === 'string' && value.trim()) {
|
|
81
|
+
const parsed = Number(value.trim());
|
|
82
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
83
|
+
}
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
export async function buildServerAuthSnapshot() {
|
|
87
|
+
const server = await detectLocalServerInstance();
|
|
88
|
+
if (!server) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
const { userConfig, providerProfiles } = await loadRouteCodexConfig(server.configPath);
|
|
92
|
+
const providers = projectProviderAuth(providerProfiles, userConfig);
|
|
93
|
+
return { server, providers };
|
|
94
|
+
}
|
|
95
|
+
function projectProviderAuth(collection, _userConfig) {
|
|
96
|
+
const result = [];
|
|
97
|
+
for (const profile of collection.profiles) {
|
|
98
|
+
const baseUrl = profile.transport.baseUrl;
|
|
99
|
+
const endpoint = profile.transport.endpoint;
|
|
100
|
+
const auth = profile.auth;
|
|
101
|
+
if (auth.kind === 'apikey') {
|
|
102
|
+
const apiKeyPreview = typeof auth.apiKey === 'string' && auth.apiKey.trim()
|
|
103
|
+
? anonymizeSecret(auth.apiKey.trim())
|
|
104
|
+
: undefined;
|
|
105
|
+
const apiKeySource = apiKeyPreview ? 'inline'
|
|
106
|
+
: auth.secretRef ? 'secretRef'
|
|
107
|
+
: auth.env ? 'env'
|
|
108
|
+
: undefined;
|
|
109
|
+
result.push({
|
|
110
|
+
id: profile.id,
|
|
111
|
+
protocol: profile.protocol,
|
|
112
|
+
transport: { baseUrl, endpoint },
|
|
113
|
+
auth: {
|
|
114
|
+
kind: 'apikey',
|
|
115
|
+
apiKeySource,
|
|
116
|
+
apiKeyPreview,
|
|
117
|
+
secretRef: auth.secretRef,
|
|
118
|
+
env: auth.env
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (auth.kind === 'oauth') {
|
|
124
|
+
result.push({
|
|
125
|
+
id: profile.id,
|
|
126
|
+
protocol: profile.protocol,
|
|
127
|
+
transport: { baseUrl, endpoint },
|
|
128
|
+
auth: {
|
|
129
|
+
kind: 'oauth',
|
|
130
|
+
tokenFile: auth.tokenFile,
|
|
131
|
+
clientId: auth.clientId,
|
|
132
|
+
tokenUrl: auth.tokenUrl,
|
|
133
|
+
deviceCodeUrl: auth.deviceCodeUrl
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
result.push({
|
|
139
|
+
id: profile.id,
|
|
140
|
+
protocol: profile.protocol,
|
|
141
|
+
transport: { baseUrl, endpoint },
|
|
142
|
+
auth: { kind: 'none' }
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
return result;
|
|
146
|
+
}
|
|
147
|
+
function anonymizeSecret(value) {
|
|
148
|
+
if (!value || value.length <= 8) {
|
|
149
|
+
return '***';
|
|
150
|
+
}
|
|
151
|
+
const prefix = value.slice(0, 4);
|
|
152
|
+
const suffix = value.slice(-4);
|
|
153
|
+
return `${prefix}…${suffix}`;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=server-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-utils.js","sourceRoot":"","sources":["../../src/token-daemon/server-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type TokenDaemonSnapshot } from './token-utils.js';
|
|
2
|
+
import { type TokenDescriptor } from './token-types.js';
|
|
3
|
+
export interface TokenDaemonOptions {
|
|
4
|
+
intervalMs: number;
|
|
5
|
+
refreshAheadMinutes: number;
|
|
6
|
+
}
|
|
7
|
+
export declare class TokenDaemon {
|
|
8
|
+
private readonly intervalMs;
|
|
9
|
+
private readonly refreshAheadMinutes;
|
|
10
|
+
private readonly historyStore;
|
|
11
|
+
private timer;
|
|
12
|
+
private lastRefreshAttempt;
|
|
13
|
+
constructor(options?: Partial<TokenDaemonOptions>);
|
|
14
|
+
start(): Promise<void>;
|
|
15
|
+
stop(): void;
|
|
16
|
+
private tick;
|
|
17
|
+
private trySilentRefresh;
|
|
18
|
+
static getSnapshot(): Promise<TokenDaemonSnapshot>;
|
|
19
|
+
static findTokenBySelector(selector: string): Promise<TokenDescriptor | null>;
|
|
20
|
+
private logDebug;
|
|
21
|
+
private ensurePortalEnvironment;
|
|
22
|
+
private recordHistoryEvent;
|
|
23
|
+
}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { ensureValidOAuthToken } from '../providers/auth/oauth-lifecycle.js';
|
|
6
|
+
import { collectTokenSnapshot } from './token-utils.js';
|
|
7
|
+
import { buildTokenKey, SUPPORTED_OAUTH_PROVIDERS } from './token-types.js';
|
|
8
|
+
import { TokenHistoryStore } from './history-store.js';
|
|
9
|
+
import { ensureLocalTokenPortalEnv } from '../token-portal/local-token-portal.js';
|
|
10
|
+
const DEBUG_FLAG = String(process.env.ROUTECODEX_TOKEN_DAEMON_DEBUG || '').trim().toLowerCase();
|
|
11
|
+
const DEBUG_ENABLED = DEBUG_FLAG === '1' || DEBUG_FLAG === 'true';
|
|
12
|
+
const DEFAULT_INTERVAL_MS = 60_000;
|
|
13
|
+
const DEFAULT_REFRESH_AHEAD_MINUTES = 30;
|
|
14
|
+
const MIN_REFRESH_INTERVAL_MS = 5 * 60_000;
|
|
15
|
+
const GEMINI_PROVIDER_IDS = new Set(['gemini-cli', 'antigravity']);
|
|
16
|
+
export class TokenDaemon {
|
|
17
|
+
intervalMs;
|
|
18
|
+
refreshAheadMinutes;
|
|
19
|
+
historyStore;
|
|
20
|
+
timer = null;
|
|
21
|
+
lastRefreshAttempt = new Map();
|
|
22
|
+
constructor(options) {
|
|
23
|
+
this.intervalMs = options?.intervalMs && options.intervalMs > 0 ? options.intervalMs : DEFAULT_INTERVAL_MS;
|
|
24
|
+
this.refreshAheadMinutes =
|
|
25
|
+
options?.refreshAheadMinutes && options.refreshAheadMinutes > 0
|
|
26
|
+
? options.refreshAheadMinutes
|
|
27
|
+
: DEFAULT_REFRESH_AHEAD_MINUTES;
|
|
28
|
+
this.historyStore = new TokenHistoryStore();
|
|
29
|
+
}
|
|
30
|
+
async start() {
|
|
31
|
+
console.log(chalk.blue('ℹ'), 'Token Refresh Daemon started');
|
|
32
|
+
console.log(chalk.blue('ℹ'), `Polling interval=${Math.round(this.intervalMs / 1000)}s, refreshAhead=${this.refreshAheadMinutes}min`);
|
|
33
|
+
// initial tick
|
|
34
|
+
await this.tick();
|
|
35
|
+
this.timer = setInterval(() => {
|
|
36
|
+
void this.tick().catch((error) => {
|
|
37
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
38
|
+
console.error(chalk.red('✗'), `Token daemon tick failed: ${msg}`);
|
|
39
|
+
});
|
|
40
|
+
}, this.intervalMs);
|
|
41
|
+
}
|
|
42
|
+
stop() {
|
|
43
|
+
if (this.timer) {
|
|
44
|
+
clearInterval(this.timer);
|
|
45
|
+
this.timer = null;
|
|
46
|
+
}
|
|
47
|
+
console.log(chalk.blue('ℹ'), 'Token Refresh Daemon stopped');
|
|
48
|
+
}
|
|
49
|
+
async tick() {
|
|
50
|
+
const snapshot = await collectTokenSnapshot();
|
|
51
|
+
const now = snapshot.timestamp;
|
|
52
|
+
const refreshAheadMs = this.refreshAheadMinutes * 60_000;
|
|
53
|
+
for (const providerSnapshot of snapshot.providers) {
|
|
54
|
+
for (const token of providerSnapshot.tokens) {
|
|
55
|
+
this.logDebug(`[daemon] evaluate token provider=${token.provider} alias=${token.alias} expires=${token.state.expiresAt ?? 'unknown'} remainingMs=${token.state.msUntilExpiry ?? 'unknown'} refreshToken=${token.state.hasRefreshToken}`);
|
|
56
|
+
const key = buildTokenKey(token);
|
|
57
|
+
const { state } = token;
|
|
58
|
+
const expires = state.expiresAt;
|
|
59
|
+
const msLeft = state.msUntilExpiry;
|
|
60
|
+
if (token.alias === 'static') {
|
|
61
|
+
this.logDebug(`[daemon] skip token with static alias provider=${token.provider} file=${token.filePath}`);
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
// respect per-token norefresh 标记:仅做状态展示,不做自动刷新
|
|
65
|
+
if (state.noRefresh) {
|
|
66
|
+
this.logDebug(`[daemon] skip token (noRefresh=true) alias=${token.alias}`);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (!state.hasRefreshToken || !expires || msLeft === null) {
|
|
70
|
+
this.logDebug(`[daemon] skip token missing refresh info alias=${token.alias} hasRefresh=${state.hasRefreshToken} expires=${expires}`);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
// Only attempt auto-refresh when token is valid/expiring and within refresh window
|
|
74
|
+
if (msLeft > refreshAheadMs) {
|
|
75
|
+
this.logDebug(`[daemon] skip token outside refresh window alias=${token.alias} remainingMs=${msLeft} window=${refreshAheadMs}`);
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (msLeft <= 0) {
|
|
79
|
+
this.logDebug(`[daemon] token already expired alias=${token.alias} - forcing immediate refresh`);
|
|
80
|
+
}
|
|
81
|
+
const last = this.lastRefreshAttempt.get(key) || 0;
|
|
82
|
+
if (now - last < MIN_REFRESH_INTERVAL_MS) {
|
|
83
|
+
this.logDebug(`[daemon] skip token throttle alias=${token.alias} sinceLast=${now - last}ms minInterval=${MIN_REFRESH_INTERVAL_MS}`);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
this.lastRefreshAttempt.set(key, now);
|
|
87
|
+
await this.trySilentRefresh(token).catch((error) => {
|
|
88
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
89
|
+
console.error(chalk.red('✗'), `Auto-refresh failed for ${token.provider} (${token.displayName}): ${msg}`);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async trySilentRefresh(token) {
|
|
95
|
+
const providerType = token.provider;
|
|
96
|
+
const rawType = `${providerType}-oauth`;
|
|
97
|
+
const tokenMtimeBefore = await getTokenFileMtime(token.filePath);
|
|
98
|
+
if (await this.historyStore.isAutoSuspended(token, tokenMtimeBefore)) {
|
|
99
|
+
this.logDebug(`[daemon] skip refresh provider=${providerType} alias=${token.alias} reason=auto-suspended`);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const portalReady = await this.ensurePortalEnvironment();
|
|
103
|
+
if (!portalReady) {
|
|
104
|
+
this.logDebug(`[daemon] skip refresh provider=${providerType} alias=${token.alias} reason=portal-unavailable`);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const startedAt = Date.now();
|
|
108
|
+
console.log(chalk.gray('◉'), `Auto-refresh token for ${providerType} (${token.displayName}), file=${token.filePath}`);
|
|
109
|
+
this.logDebug(`[daemon] trigger refresh provider=${providerType} alias=${token.alias} file=${token.filePath}`);
|
|
110
|
+
try {
|
|
111
|
+
await ensureValidOAuthToken(providerType, {
|
|
112
|
+
type: rawType,
|
|
113
|
+
tokenFile: token.filePath
|
|
114
|
+
}, {
|
|
115
|
+
openBrowser: true,
|
|
116
|
+
forceReacquireIfRefreshFails: true
|
|
117
|
+
});
|
|
118
|
+
console.log(chalk.green('✓'), `Token refreshed for ${providerType} (${token.displayName})`);
|
|
119
|
+
this.logDebug(`[daemon] refresh success provider=${providerType} alias=${token.alias}`);
|
|
120
|
+
const tokenMtimeAfter = await getTokenFileMtime(token.filePath);
|
|
121
|
+
await this.recordHistoryEvent(token, 'success', startedAt, {
|
|
122
|
+
tokenFileMtime: tokenMtimeAfter
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
await this.recordHistoryEvent(token, 'failure', startedAt, {
|
|
127
|
+
error,
|
|
128
|
+
tokenFileMtime: tokenMtimeBefore
|
|
129
|
+
});
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
static async getSnapshot() {
|
|
134
|
+
return collectTokenSnapshot();
|
|
135
|
+
}
|
|
136
|
+
static async findTokenBySelector(selector) {
|
|
137
|
+
const snapshot = await collectTokenSnapshot();
|
|
138
|
+
const normalized = selector.trim();
|
|
139
|
+
if (!normalized) {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
const candidates = [];
|
|
143
|
+
for (const providerSnapshot of snapshot.providers) {
|
|
144
|
+
for (const token of providerSnapshot.tokens) {
|
|
145
|
+
const base = token.filePath.split(/[\\/]/).pop() || token.filePath;
|
|
146
|
+
if (token.filePath === normalized || base === normalized || token.filePath.includes(normalized)) {
|
|
147
|
+
candidates.push(token);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (candidates.length === 1) {
|
|
152
|
+
return candidates[0];
|
|
153
|
+
}
|
|
154
|
+
if (candidates.length > 1) {
|
|
155
|
+
console.error(chalk.red('✗'), `Selector "${selector}" matched multiple token files:`);
|
|
156
|
+
for (const t of candidates) {
|
|
157
|
+
console.error(' -', `[${t.provider}] seq=${t.sequence} alias=${t.alias || 'default'} file=${t.filePath}`);
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
// No direct match; allow provider name selector
|
|
162
|
+
const providerMatch = SUPPORTED_OAUTH_PROVIDERS.find((p) => p === normalized);
|
|
163
|
+
if (providerMatch) {
|
|
164
|
+
const byProvider = snapshot.providers.find((p) => p.provider === providerMatch);
|
|
165
|
+
const first = byProvider?.tokens[0];
|
|
166
|
+
if (first) {
|
|
167
|
+
return first;
|
|
168
|
+
}
|
|
169
|
+
return createSyntheticTokenDescriptor(providerMatch);
|
|
170
|
+
}
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
logDebug(message) {
|
|
174
|
+
if (!DEBUG_ENABLED) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
console.log(chalk.gray('[token-daemon-debug]'), message);
|
|
178
|
+
}
|
|
179
|
+
async ensurePortalEnvironment() {
|
|
180
|
+
try {
|
|
181
|
+
await ensureLocalTokenPortalEnv();
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
186
|
+
this.logDebug(`[daemon] portal init failed: ${msg}`);
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
async recordHistoryEvent(token, outcome, startedAt, meta) {
|
|
191
|
+
try {
|
|
192
|
+
const completedAt = Date.now();
|
|
193
|
+
await this.historyStore.recordRefreshResult(token, outcome, {
|
|
194
|
+
startedAt,
|
|
195
|
+
completedAt,
|
|
196
|
+
durationMs: completedAt - startedAt,
|
|
197
|
+
mode: 'auto',
|
|
198
|
+
error: meta?.error ? (meta.error instanceof Error ? meta.error.message : String(meta.error)) : undefined,
|
|
199
|
+
tokenFileMtime: meta?.tokenFileMtime ?? null
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
catch (historyError) {
|
|
203
|
+
this.logDebug(`[daemon] history persistence failed: ${historyError instanceof Error ? historyError.message : String(historyError)}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
async function getTokenFileMtime(filePath) {
|
|
208
|
+
try {
|
|
209
|
+
const stats = await fs.stat(filePath);
|
|
210
|
+
return stats.mtimeMs;
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function defaultTokenFilePath(provider) {
|
|
217
|
+
const home = homedir();
|
|
218
|
+
if (provider === 'iflow') {
|
|
219
|
+
return path.join(home, '.iflow', 'oauth_creds.json');
|
|
220
|
+
}
|
|
221
|
+
if (provider === 'qwen') {
|
|
222
|
+
return path.join(home, '.routecodex', 'auth', 'qwen-oauth.json');
|
|
223
|
+
}
|
|
224
|
+
if (GEMINI_PROVIDER_IDS.has(provider)) {
|
|
225
|
+
const file = provider === 'antigravity' ? 'antigravity-oauth.json' : 'gemini-oauth.json';
|
|
226
|
+
return path.join(home, '.routecodex', 'auth', file);
|
|
227
|
+
}
|
|
228
|
+
return path.join(home, '.routecodex', 'auth', `${provider}-oauth-1-default.json`);
|
|
229
|
+
}
|
|
230
|
+
function createSyntheticTokenDescriptor(provider) {
|
|
231
|
+
const filePath = defaultTokenFilePath(provider);
|
|
232
|
+
return {
|
|
233
|
+
provider,
|
|
234
|
+
filePath,
|
|
235
|
+
sequence: 0,
|
|
236
|
+
alias: 'default',
|
|
237
|
+
state: {
|
|
238
|
+
hasAccessToken: false,
|
|
239
|
+
hasRefreshToken: false,
|
|
240
|
+
hasApiKey: false,
|
|
241
|
+
expiresAt: null,
|
|
242
|
+
msUntilExpiry: null,
|
|
243
|
+
status: 'invalid',
|
|
244
|
+
noRefresh: false
|
|
245
|
+
},
|
|
246
|
+
displayName: path.basename(filePath)
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=token-daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-daemon.js","sourceRoot":"","sources":["../../src/token-daemon/token-daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export type OAuthProviderId = 'iflow' | 'qwen' | 'gemini-cli' | 'antigravity';
|
|
2
|
+
export declare const SUPPORTED_OAUTH_PROVIDERS: OAuthProviderId[];
|
|
3
|
+
export interface RawTokenPayload {
|
|
4
|
+
access_token?: string;
|
|
5
|
+
AccessToken?: string;
|
|
6
|
+
refresh_token?: string;
|
|
7
|
+
api_key?: string;
|
|
8
|
+
apiKey?: string;
|
|
9
|
+
expires_at?: number | string;
|
|
10
|
+
expired?: number | string;
|
|
11
|
+
expiry_date?: number | string;
|
|
12
|
+
email?: string;
|
|
13
|
+
account?: string;
|
|
14
|
+
name?: string;
|
|
15
|
+
norefresh?: boolean;
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
}
|
|
18
|
+
export type TokenStatus = 'valid' | 'expiring' | 'expired' | 'invalid';
|
|
19
|
+
export interface TokenState {
|
|
20
|
+
hasAccessToken: boolean;
|
|
21
|
+
hasRefreshToken: boolean;
|
|
22
|
+
hasApiKey: boolean;
|
|
23
|
+
expiresAt: number | null;
|
|
24
|
+
msUntilExpiry: number | null;
|
|
25
|
+
status: TokenStatus;
|
|
26
|
+
noRefresh: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface TokenIdentity {
|
|
29
|
+
provider: OAuthProviderId;
|
|
30
|
+
filePath: string;
|
|
31
|
+
sequence: number;
|
|
32
|
+
alias: string;
|
|
33
|
+
}
|
|
34
|
+
export interface TokenDescriptor extends TokenIdentity {
|
|
35
|
+
state: TokenState;
|
|
36
|
+
displayName: string;
|
|
37
|
+
}
|
|
38
|
+
export interface TokenUsage {
|
|
39
|
+
serverId: string;
|
|
40
|
+
providerId: string;
|
|
41
|
+
protocol: string;
|
|
42
|
+
}
|
|
43
|
+
export declare function buildTokenKey(id: TokenIdentity): string;
|
|
44
|
+
export declare function formatTokenLabel(desc: TokenDescriptor): string;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
export const SUPPORTED_OAUTH_PROVIDERS = [
|
|
3
|
+
'iflow',
|
|
4
|
+
'qwen',
|
|
5
|
+
'gemini-cli',
|
|
6
|
+
'antigravity'
|
|
7
|
+
];
|
|
8
|
+
export function buildTokenKey(id) {
|
|
9
|
+
return `${id.provider}::${id.filePath}`;
|
|
10
|
+
}
|
|
11
|
+
export function formatTokenLabel(desc) {
|
|
12
|
+
const base = path.basename(desc.filePath);
|
|
13
|
+
if (desc.displayName && desc.displayName !== base) {
|
|
14
|
+
return `${desc.displayName} (${base})`;
|
|
15
|
+
}
|
|
16
|
+
return base;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=token-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-types.js","sourceRoot":"","sources":["../../src/token-daemon/token-types.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAIxB,MAAM,CAAC,MAAM,yBAAyB,GAAsB;IAC1D,OAAO;IACP,MAAM;IACN,YAAY;IACZ,aAAa;CACd,CAAC;AAkDF,MAAM,UAAU,aAAa,CAAC,EAAiB;IAC7C,OAAO,GAAG,EAAE,CAAC,QAAQ,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAqB;IACpD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;QAClD,OAAO,GAAG,IAAI,CAAC,WAAW,KAAK,IAAI,GAAG,CAAC;IACzC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type OAuthProviderId, type RawTokenPayload, type TokenDescriptor, type TokenState } from './token-types.js';
|
|
2
|
+
export declare const DEFAULT_AUTH_DIR: string;
|
|
3
|
+
export declare function readTokenFile(filePath: string): Promise<RawTokenPayload | null>;
|
|
4
|
+
export declare function getExpiresAtMillis(token: RawTokenPayload | null): number | null;
|
|
5
|
+
export declare function hasAccessToken(token: RawTokenPayload | null): boolean;
|
|
6
|
+
export declare function hasApiKey(token: RawTokenPayload | null): boolean;
|
|
7
|
+
export declare function hasRefreshToken(token: RawTokenPayload | null): boolean;
|
|
8
|
+
export declare function evaluateTokenState(token: RawTokenPayload | null, now: number): TokenState;
|
|
9
|
+
export interface ProviderTokenSnapshot {
|
|
10
|
+
provider: OAuthProviderId;
|
|
11
|
+
tokens: TokenDescriptor[];
|
|
12
|
+
}
|
|
13
|
+
export interface TokenDaemonSnapshot {
|
|
14
|
+
timestamp: number;
|
|
15
|
+
providers: ProviderTokenSnapshot[];
|
|
16
|
+
}
|
|
17
|
+
export declare function collectTokenSnapshot(): Promise<TokenDaemonSnapshot>;
|