@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.
Files changed (191) hide show
  1. package/dist/build-info.js +3 -3
  2. package/dist/build-info.js.map +1 -1
  3. package/dist/cli.js +110 -1
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/token-daemon.d.ts +2 -0
  6. package/dist/commands/token-daemon.js +183 -0
  7. package/dist/commands/token-daemon.js.map +1 -0
  8. package/dist/index.js +20 -3
  9. package/dist/index.js.map +1 -1
  10. package/dist/modules/llmswitch/bridge.d.ts +1 -1
  11. package/dist/modules/llmswitch/bridge.js +3 -2
  12. package/dist/modules/llmswitch/bridge.js.map +1 -1
  13. package/dist/modules/pipeline/utils/colored-logger.js +3 -1
  14. package/dist/modules/pipeline/utils/colored-logger.js.map +1 -1
  15. package/dist/providers/auth/gemini-cli-userinfo-helper.js +12 -2
  16. package/dist/providers/auth/gemini-cli-userinfo-helper.js.map +1 -1
  17. package/dist/providers/auth/oauth-lifecycle.js +337 -25
  18. package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
  19. package/dist/providers/core/config/oauth-flows.d.ts +23 -0
  20. package/dist/providers/core/config/oauth-flows.js +92 -5
  21. package/dist/providers/core/config/oauth-flows.js.map +1 -1
  22. package/dist/providers/core/config/provider-oauth-configs.js +9 -3
  23. package/dist/providers/core/config/provider-oauth-configs.js.map +1 -1
  24. package/dist/providers/core/config/service-profiles.js +18 -10
  25. package/dist/providers/core/config/service-profiles.js.map +1 -1
  26. package/dist/providers/core/runtime/base-provider.d.ts +2 -0
  27. package/dist/providers/core/runtime/base-provider.js +35 -1
  28. package/dist/providers/core/runtime/base-provider.js.map +1 -1
  29. package/dist/providers/core/runtime/gemini-cli-http-provider.js +87 -20
  30. package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
  31. package/dist/providers/core/runtime/http-request-executor.d.ts +1 -0
  32. package/dist/providers/core/runtime/http-request-executor.js +75 -1
  33. package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
  34. package/dist/providers/core/runtime/http-transport-provider.d.ts +2 -0
  35. package/dist/providers/core/runtime/http-transport-provider.js +60 -2
  36. package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
  37. package/dist/providers/core/runtime/iflow-http-provider.d.ts +4 -0
  38. package/dist/providers/core/runtime/iflow-http-provider.js +28 -0
  39. package/dist/providers/core/runtime/iflow-http-provider.js.map +1 -1
  40. package/dist/providers/core/runtime/rate-limit-manager.d.ts +30 -0
  41. package/dist/providers/core/runtime/rate-limit-manager.js +136 -0
  42. package/dist/providers/core/runtime/rate-limit-manager.js.map +1 -0
  43. package/dist/providers/core/runtime/responses-provider.js +8 -3
  44. package/dist/providers/core/runtime/responses-provider.js.map +1 -1
  45. package/dist/providers/core/runtime/vision-debug-utils.d.ts +13 -0
  46. package/dist/providers/core/runtime/vision-debug-utils.js +114 -0
  47. package/dist/providers/core/runtime/vision-debug-utils.js.map +1 -0
  48. package/dist/providers/core/strategies/oauth-auth-code-flow.js +75 -26
  49. package/dist/providers/core/strategies/oauth-auth-code-flow.js.map +1 -1
  50. package/dist/providers/core/utils/http-client.js +2 -1
  51. package/dist/providers/core/utils/http-client.js.map +1 -1
  52. package/dist/providers/core/utils/provider-error-reporter.js +31 -5
  53. package/dist/providers/core/utils/provider-error-reporter.js.map +1 -1
  54. package/dist/providers/core/utils/provider-type-utils.js +1 -1
  55. package/dist/providers/core/utils/provider-type-utils.js.map +1 -1
  56. package/dist/providers/core/utils/snapshot-writer.d.ts +1 -1
  57. package/dist/providers/core/utils/snapshot-writer.js.map +1 -1
  58. package/dist/server/handlers/sse-dispatcher.js +22 -2
  59. package/dist/server/handlers/sse-dispatcher.js.map +1 -1
  60. package/dist/server/runtime/http-server/index.d.ts +9 -0
  61. package/dist/server/runtime/http-server/index.js +512 -144
  62. package/dist/server/runtime/http-server/index.js.map +1 -1
  63. package/dist/server/runtime/http-server/provider-utils.js +1 -1
  64. package/dist/server/runtime/http-server/provider-utils.js.map +1 -1
  65. package/dist/server/runtime/http-server/request-executor.d.ts +10 -0
  66. package/dist/server/runtime/http-server/request-executor.js +553 -159
  67. package/dist/server/runtime/http-server/request-executor.js.map +1 -1
  68. package/dist/server/runtime/http-server/routes.d.ts +5 -0
  69. package/dist/server/runtime/http-server/routes.js +29 -0
  70. package/dist/server/runtime/http-server/routes.js.map +1 -1
  71. package/dist/server/runtime/http-server/runtime-manager.js +33 -0
  72. package/dist/server/runtime/http-server/runtime-manager.js.map +1 -1
  73. package/dist/server/utils/utf8-chunk-buffer.d.ts +43 -0
  74. package/dist/server/utils/utf8-chunk-buffer.js +132 -0
  75. package/dist/server/utils/utf8-chunk-buffer.js.map +1 -0
  76. package/dist/token-daemon/history-store.d.ts +75 -0
  77. package/dist/token-daemon/history-store.js +207 -0
  78. package/dist/token-daemon/history-store.js.map +1 -0
  79. package/dist/token-daemon/index.d.ts +7 -0
  80. package/dist/token-daemon/index.js +336 -0
  81. package/dist/token-daemon/index.js.map +1 -0
  82. package/dist/token-daemon/server-utils.d.ts +33 -0
  83. package/dist/token-daemon/server-utils.js +155 -0
  84. package/dist/token-daemon/server-utils.js.map +1 -0
  85. package/dist/token-daemon/token-daemon.d.ts +23 -0
  86. package/dist/token-daemon/token-daemon.js +249 -0
  87. package/dist/token-daemon/token-daemon.js.map +1 -0
  88. package/dist/token-daemon/token-types.d.ts +44 -0
  89. package/dist/token-daemon/token-types.js +18 -0
  90. package/dist/token-daemon/token-types.js.map +1 -0
  91. package/dist/token-daemon/token-utils.d.ts +17 -0
  92. package/dist/token-daemon/token-utils.js +153 -0
  93. package/dist/token-daemon/token-utils.js.map +1 -0
  94. package/dist/token-portal/local-token-portal.d.ts +1 -0
  95. package/dist/token-portal/local-token-portal.js +89 -0
  96. package/dist/token-portal/local-token-portal.js.map +1 -0
  97. package/dist/token-portal/render.d.ts +10 -0
  98. package/dist/token-portal/render.js +56 -0
  99. package/dist/token-portal/render.js.map +1 -0
  100. package/dist/tools/semantic-replay.js +7 -6
  101. package/dist/tools/semantic-replay.js.map +1 -1
  102. package/dist/utils/error-handler-registry.d.ts +36 -0
  103. package/dist/utils/error-handler-registry.js +93 -7
  104. package/dist/utils/error-handler-registry.js.map +1 -1
  105. package/node_modules/@jsonstudio/llms/README.md +2 -0
  106. package/node_modules/@jsonstudio/llms/dist/conversion/codecs/gemini-openai-codec.js +137 -5
  107. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/gemini-web-search.d.ts +17 -0
  108. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/gemini-web-search.js +68 -0
  109. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-image-content.d.ts +2 -0
  110. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-image-content.js +83 -0
  111. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-vision-prompt.d.ts +11 -0
  112. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-vision-prompt.js +177 -0
  113. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-web-search.d.ts +2 -0
  114. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-web-search.js +63 -0
  115. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/universal-shape-filter.js +11 -0
  116. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-gemini.json +17 -0
  117. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-glm.json +190 -181
  118. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-iflow.json +195 -195
  119. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-lmstudio.json +43 -43
  120. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-qwen.json +20 -20
  121. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/responses-c4m.json +42 -42
  122. package/node_modules/@jsonstudio/llms/dist/conversion/config/sample-config.json +1 -1
  123. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-pipeline-executor.js +24 -0
  124. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-types.d.ts +8 -0
  125. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline.js +39 -4
  126. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/target-utils.js +6 -0
  127. package/node_modules/@jsonstudio/llms/dist/conversion/hub/process/chat-process.js +213 -1
  128. package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/provider-response.d.ts +34 -0
  129. package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/provider-response.js +84 -24
  130. package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/server-side-tools.d.ts +26 -0
  131. package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/server-side-tools.js +383 -0
  132. package/node_modules/@jsonstudio/llms/dist/conversion/hub/semantic-mappers/gemini-mapper.js +241 -14
  133. package/node_modules/@jsonstudio/llms/dist/conversion/hub/semantic-mappers/responses-mapper.js +17 -1
  134. package/node_modules/@jsonstudio/llms/dist/conversion/hub/standardized-bridge.js +14 -0
  135. package/node_modules/@jsonstudio/llms/dist/conversion/hub/types/standardized.d.ts +1 -0
  136. package/node_modules/@jsonstudio/llms/dist/conversion/responses/responses-openai-bridge.js +82 -3
  137. package/node_modules/@jsonstudio/llms/dist/conversion/shared/anthropic-message-utils.js +92 -3
  138. package/node_modules/@jsonstudio/llms/dist/conversion/shared/bridge-message-utils.js +137 -10
  139. package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-output-builder.js +43 -2
  140. package/node_modules/@jsonstudio/llms/dist/conversion/shared/snapshot-utils.js +17 -47
  141. package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-filter-pipeline.js +1 -0
  142. package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-mapping.js +25 -2
  143. package/node_modules/@jsonstudio/llms/dist/index.d.ts +1 -0
  144. package/node_modules/@jsonstudio/llms/dist/index.js +1 -0
  145. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap.js +308 -43
  146. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/classifier.js +11 -17
  147. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/context-advisor.d.ts +0 -2
  148. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/context-advisor.js +0 -12
  149. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine.d.ts +17 -2
  150. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine.js +332 -95
  151. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/features.js +1 -1
  152. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/message-utils.js +36 -24
  153. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/provider-registry.js +2 -1
  154. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/token-counter.js +14 -3
  155. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/types.d.ts +66 -2
  156. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/types.js +2 -1
  157. package/node_modules/@jsonstudio/llms/dist/servertool/engine.d.ts +27 -0
  158. package/node_modules/@jsonstudio/llms/dist/servertool/engine.js +60 -0
  159. package/node_modules/@jsonstudio/llms/dist/servertool/flow-types.d.ts +40 -0
  160. package/node_modules/@jsonstudio/llms/dist/servertool/flow-types.js +1 -0
  161. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/vision.d.ts +1 -0
  162. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/vision.js +194 -0
  163. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/web-search.d.ts +1 -0
  164. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/web-search.js +638 -0
  165. package/node_modules/@jsonstudio/llms/dist/servertool/orchestration-types.d.ts +33 -0
  166. package/node_modules/@jsonstudio/llms/dist/servertool/orchestration-types.js +1 -0
  167. package/node_modules/@jsonstudio/llms/dist/servertool/registry.d.ts +18 -0
  168. package/node_modules/@jsonstudio/llms/dist/servertool/registry.js +27 -0
  169. package/node_modules/@jsonstudio/llms/dist/servertool/server-side-tools.d.ts +8 -0
  170. package/node_modules/@jsonstudio/llms/dist/servertool/server-side-tools.js +208 -0
  171. package/node_modules/@jsonstudio/llms/dist/servertool/types.d.ts +88 -0
  172. package/node_modules/@jsonstudio/llms/dist/servertool/types.js +1 -0
  173. package/node_modules/@jsonstudio/llms/dist/servertool/vision-tool.d.ts +2 -0
  174. package/node_modules/@jsonstudio/llms/dist/servertool/vision-tool.js +185 -0
  175. package/node_modules/@jsonstudio/llms/dist/sse/json-to-sse/event-generators/responses.js +15 -3
  176. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/builders/response-builder.js +6 -3
  177. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/gemini-sse-to-json-converter.js +27 -1
  178. package/node_modules/@jsonstudio/llms/dist/sse/types/gemini-types.d.ts +20 -1
  179. package/node_modules/@jsonstudio/llms/dist/sse/types/responses-types.js +1 -1
  180. package/node_modules/@jsonstudio/llms/dist/telemetry/stats-center.d.ts +73 -0
  181. package/node_modules/@jsonstudio/llms/dist/telemetry/stats-center.js +280 -0
  182. package/node_modules/@jsonstudio/llms/package.json +1 -1
  183. package/package.json +3 -2
  184. package/scripts/pack-mode.mjs +2 -1
  185. package/scripts/publish-rcc.mjs +20 -4
  186. package/scripts/test-iflow-web-search.mjs +141 -0
  187. package/scripts/test-iflow.mjs +93 -1
  188. package/scripts/tests/virtual-router-health.mjs +141 -6
  189. package/dist/tools/replay-request.d.ts +0 -0
  190. package/dist/tools/replay-request.js +0 -2
  191. 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":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AA0C7E,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAAC;AAE9E,SAAS,aAAa,CAAC,KAAgC;IACrD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB;IAC7C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,qBAAqB,EAAE,CAAC;QAC9C,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,UAA2B,CAAC;QACxC,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ;YACpE,CAAC,CAAE,GAAG,CAAC,UAA4B;YACnC,CAAC,CAAC,SAAS,CAAC,CAAC;QACf,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;YAC3D,CAAC,CAAE,GAAG,CAAC,MAAwB;YAC/B,CAAC,CAAC,SAAS,CAAC,CAAC;QACf,MAAM,IAAI,GACR,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC;YAC1B,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC;YACzB,WAAW,CAAC;QACd,MAAM,IAAI,GACR,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC;YAC1B,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC;YACzB,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;YACpB,IAAI,CAAC;QACP,MAAM,OAAO,GAAG,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC;QAEzC,IAAI,MAAM,GAAiC,SAAS,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,SAAS,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAS,CAAC,CAAC;YACtF,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACX,MAAM,GAAG,QAAQ,CAAC;YACpB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,GAAG,SAAS,CAAC;QACrB,CAAC;QAED,OAAO;YACL,EAAE,EAAE,SAAS,IAAI,EAAE;YACnB,OAAO;YACP,IAAI;YACJ,IAAI;YACJ,UAAU,EAAE,OAAO;YACnB,MAAM;SACP,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,qBAAqB;IAClC,IAAI,CAAC;QACH,sCAAsC;QACtC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;QACpF,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;QACvE,OAAO,WAAW,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACpC,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACtD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,MAAM,MAAM,GAAG,MAAM,yBAAyB,EAAE,CAAC;IACjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACvF,MAAM,SAAS,GAAG,mBAAmB,CAAC,gBAAgB,EAAE,UAA2B,CAAC,CAAC;IACrF,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,mBAAmB,CAC1B,UAAqC,EACrC,WAA0B;IAE1B,MAAM,MAAM,GAAuB,EAAE,CAAC;IACtC,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC;QAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC;QAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,MAAM,aAAa,GACjB,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;gBACnD,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACrC,CAAC,CAAC,SAAS,CAAC;YAChB,MAAM,YAAY,GAChB,aAAa,CAAC,CAAC,CAAC,QAAQ;gBACxB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;oBAC9B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK;wBAClB,CAAC,CAAC,SAAS,CAAC;YACd,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,SAAS,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;gBAChC,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,YAAY;oBACZ,aAAa;oBACb,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,GAAG,EAAE,IAAI,CAAC,GAAG;iBACd;aACF,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,SAAS,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;gBAChC,IAAI,EAAE;oBACJ,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,aAAa,EAAE,IAAI,CAAC,aAAa;iBAClC;aACF,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,SAAS,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;YAChC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;SACvB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,OAAO,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;AAC/B,CAAC"}
@@ -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>;