@jsonstudio/rcc 0.89.683 → 0.89.912

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 (215) hide show
  1. package/README.md +44 -0
  2. package/dist/build-info.js +2 -2
  3. package/dist/cli.js +164 -116
  4. package/dist/cli.js.map +1 -1
  5. package/dist/client/anthropic/anthropic-protocol-client.js +42 -1
  6. package/dist/client/anthropic/anthropic-protocol-client.js.map +1 -1
  7. package/dist/client/gemini-cli/gemini-cli-protocol-client.js +4 -1
  8. package/dist/client/gemini-cli/gemini-cli-protocol-client.js.map +1 -1
  9. package/dist/commands/camoufox-backfill.d.ts +2 -0
  10. package/dist/commands/camoufox-backfill.js +33 -0
  11. package/dist/commands/camoufox-backfill.js.map +1 -0
  12. package/dist/commands/camoufox-fp.d.ts +2 -0
  13. package/dist/commands/camoufox-fp.js +86 -0
  14. package/dist/commands/camoufox-fp.js.map +1 -0
  15. package/dist/commands/oauth.d.ts +2 -0
  16. package/dist/commands/oauth.js +170 -0
  17. package/dist/commands/oauth.js.map +1 -0
  18. package/dist/commands/provider-update.js +439 -2
  19. package/dist/commands/provider-update.js.map +1 -1
  20. package/dist/commands/quota-status.d.ts +2 -0
  21. package/dist/commands/quota-status.js +80 -0
  22. package/dist/commands/quota-status.js.map +1 -0
  23. package/dist/commands/token-daemon.js +12 -1
  24. package/dist/commands/token-daemon.js.map +1 -1
  25. package/dist/config/provider-v2-loader.d.ts +16 -0
  26. package/dist/config/provider-v2-loader.js +84 -0
  27. package/dist/config/provider-v2-loader.js.map +1 -0
  28. package/dist/config/routecodex-config-loader.js +27 -4
  29. package/dist/config/routecodex-config-loader.js.map +1 -1
  30. package/dist/config/system-prompts/codex-cli.txt +1 -0
  31. package/dist/config/virtual-router-builder.d.ts +9 -0
  32. package/dist/config/virtual-router-builder.js +34 -0
  33. package/dist/config/virtual-router-builder.js.map +1 -0
  34. package/dist/config/virtual-router-types.d.ts +25 -0
  35. package/dist/config/virtual-router-types.js +30 -0
  36. package/dist/config/virtual-router-types.js.map +1 -0
  37. package/dist/manager/index.d.ts +10 -0
  38. package/dist/manager/index.js +27 -0
  39. package/dist/manager/index.js.map +1 -0
  40. package/dist/manager/modules/health/index.d.ts +22 -0
  41. package/dist/manager/modules/health/index.js +82 -0
  42. package/dist/manager/modules/health/index.js.map +1 -0
  43. package/dist/manager/modules/quota/index.d.ts +57 -0
  44. package/dist/manager/modules/quota/index.js +426 -0
  45. package/dist/manager/modules/quota/index.js.map +1 -0
  46. package/dist/manager/modules/routing/index.d.ts +17 -0
  47. package/dist/manager/modules/routing/index.js +61 -0
  48. package/dist/manager/modules/routing/index.js.map +1 -0
  49. package/dist/manager/modules/token/index.d.ts +10 -0
  50. package/dist/manager/modules/token/index.js +58 -0
  51. package/dist/manager/modules/token/index.js.map +1 -0
  52. package/dist/manager/storage/base-store.d.ts +6 -0
  53. package/dist/manager/storage/base-store.js +2 -0
  54. package/dist/manager/storage/base-store.js.map +1 -0
  55. package/dist/manager/storage/file-store.d.ts +25 -0
  56. package/dist/manager/storage/file-store.js +117 -0
  57. package/dist/manager/storage/file-store.js.map +1 -0
  58. package/dist/manager/types.d.ts +9 -0
  59. package/dist/manager/types.js +2 -0
  60. package/dist/manager/types.js.map +1 -0
  61. package/dist/message-center/index.d.ts +5 -0
  62. package/dist/message-center/index.js +6 -0
  63. package/dist/message-center/index.js.map +1 -0
  64. package/dist/message-center/message-center.d.ts +93 -0
  65. package/dist/message-center/message-center.js +189 -0
  66. package/dist/message-center/message-center.js.map +1 -0
  67. package/dist/providers/auth/antigravity-userinfo-helper.d.ts +2 -0
  68. package/dist/providers/auth/antigravity-userinfo-helper.js +102 -0
  69. package/dist/providers/auth/antigravity-userinfo-helper.js.map +1 -1
  70. package/dist/providers/auth/iflow-cookie-auth.d.ts +27 -0
  71. package/dist/providers/auth/iflow-cookie-auth.js +209 -0
  72. package/dist/providers/auth/iflow-cookie-auth.js.map +1 -0
  73. package/dist/providers/auth/oauth-lifecycle.js +29 -22
  74. package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
  75. package/dist/providers/auth/token-scanner/index.js +16 -1
  76. package/dist/providers/auth/token-scanner/index.js.map +1 -1
  77. package/dist/providers/core/config/camoufox-launcher.d.ts +16 -0
  78. package/dist/providers/core/config/camoufox-launcher.js +314 -0
  79. package/dist/providers/core/config/camoufox-launcher.js.map +1 -0
  80. package/dist/providers/core/config/oauth-flows.d.ts +9 -0
  81. package/dist/providers/core/config/oauth-flows.js +50 -19
  82. package/dist/providers/core/config/oauth-flows.js.map +1 -1
  83. package/dist/providers/core/config/provider-oauth-configs.d.ts +6 -0
  84. package/dist/providers/core/config/provider-oauth-configs.js +12 -0
  85. package/dist/providers/core/config/provider-oauth-configs.js.map +1 -1
  86. package/dist/providers/core/config/service-profiles.js +26 -3
  87. package/dist/providers/core/config/service-profiles.js.map +1 -1
  88. package/dist/providers/core/runtime/antigravity-quota-client.d.ts +10 -0
  89. package/dist/providers/core/runtime/antigravity-quota-client.js +88 -0
  90. package/dist/providers/core/runtime/antigravity-quota-client.js.map +1 -0
  91. package/dist/providers/core/runtime/base-provider.d.ts +2 -1
  92. package/dist/providers/core/runtime/base-provider.js +93 -34
  93. package/dist/providers/core/runtime/base-provider.js.map +1 -1
  94. package/dist/providers/core/runtime/gemini-cli-http-provider.js +42 -10
  95. package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
  96. package/dist/providers/core/runtime/http-request-executor.js +24 -0
  97. package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
  98. package/dist/providers/core/runtime/http-transport-provider.d.ts +0 -3
  99. package/dist/providers/core/runtime/http-transport-provider.js +32 -136
  100. package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
  101. package/dist/providers/core/runtime/provider-error-classifier.js +18 -10
  102. package/dist/providers/core/runtime/provider-error-classifier.js.map +1 -1
  103. package/dist/providers/core/runtime/rate-limit-manager.d.ts +6 -0
  104. package/dist/providers/core/runtime/rate-limit-manager.js +23 -0
  105. package/dist/providers/core/runtime/rate-limit-manager.js.map +1 -1
  106. package/dist/providers/core/runtime/responses-provider.js +17 -19
  107. package/dist/providers/core/runtime/responses-provider.js.map +1 -1
  108. package/dist/providers/core/strategies/oauth-auth-code-flow.d.ts +1 -0
  109. package/dist/providers/core/strategies/oauth-auth-code-flow.js +3 -2
  110. package/dist/providers/core/strategies/oauth-auth-code-flow.js.map +1 -1
  111. package/dist/providers/core/strategies/oauth-device-flow.d.ts +1 -0
  112. package/dist/providers/core/strategies/oauth-device-flow.js +3 -2
  113. package/dist/providers/core/strategies/oauth-device-flow.js.map +1 -1
  114. package/dist/providers/core/strategies/oauth-hybrid-flow.d.ts +1 -0
  115. package/dist/providers/core/strategies/oauth-hybrid-flow.js +3 -2
  116. package/dist/providers/core/strategies/oauth-hybrid-flow.js.map +1 -1
  117. package/dist/providers/core/utils/http-client.js +43 -1
  118. package/dist/providers/core/utils/http-client.js.map +1 -1
  119. package/dist/providers/mock/mock-provider-runtime.js +4 -4
  120. package/dist/providers/mock/mock-provider-runtime.js.map +1 -1
  121. package/dist/providers/profile/provider-profile-loader.js +13 -1
  122. package/dist/providers/profile/provider-profile-loader.js.map +1 -1
  123. package/dist/providers/profile/provider-profile.d.ts +5 -0
  124. package/dist/scripts/camoufox/gen-fingerprint-env.py +171 -0
  125. package/dist/scripts/camoufox/launch-auth.mjs +617 -0
  126. package/dist/server/runtime/http-server/daemon-admin/credentials-handler.d.ts +3 -0
  127. package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js +138 -0
  128. package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js.map +1 -0
  129. package/dist/server/runtime/http-server/daemon-admin/providers-handler.d.ts +3 -0
  130. package/dist/server/runtime/http-server/daemon-admin/providers-handler.js +166 -0
  131. package/dist/server/runtime/http-server/daemon-admin/providers-handler.js.map +1 -0
  132. package/dist/server/runtime/http-server/daemon-admin/quota-handler.d.ts +3 -0
  133. package/dist/server/runtime/http-server/daemon-admin/quota-handler.js +109 -0
  134. package/dist/server/runtime/http-server/daemon-admin/quota-handler.js.map +1 -0
  135. package/dist/server/runtime/http-server/daemon-admin/status-handler.d.ts +3 -0
  136. package/dist/server/runtime/http-server/daemon-admin/status-handler.js +43 -0
  137. package/dist/server/runtime/http-server/daemon-admin/status-handler.js.map +1 -0
  138. package/dist/server/runtime/http-server/daemon-admin-routes.d.ts +19 -0
  139. package/dist/server/runtime/http-server/daemon-admin-routes.js +27 -0
  140. package/dist/server/runtime/http-server/daemon-admin-routes.js.map +1 -0
  141. package/dist/server/runtime/http-server/executor-provider.d.ts +1 -0
  142. package/dist/server/runtime/http-server/executor-provider.js +26 -0
  143. package/dist/server/runtime/http-server/executor-provider.js.map +1 -1
  144. package/dist/server/runtime/http-server/executor-response.d.ts +16 -0
  145. package/dist/server/runtime/http-server/executor-response.js +164 -0
  146. package/dist/server/runtime/http-server/executor-response.js.map +1 -0
  147. package/dist/server/runtime/http-server/index.d.ts +6 -0
  148. package/dist/server/runtime/http-server/index.js +121 -53
  149. package/dist/server/runtime/http-server/index.js.map +1 -1
  150. package/dist/server/runtime/http-server/request-executor.d.ts +3 -0
  151. package/dist/server/runtime/http-server/request-executor.js +73 -21
  152. package/dist/server/runtime/http-server/request-executor.js.map +1 -1
  153. package/dist/server/runtime/http-server/routes.d.ts +5 -0
  154. package/dist/server/runtime/http-server/routes.js +45 -1
  155. package/dist/server/runtime/http-server/routes.js.map +1 -1
  156. package/dist/server/runtime/http-server/types.d.ts +1 -0
  157. package/dist/server/utils/client-connection-state.d.ts +8 -0
  158. package/dist/server/utils/client-connection-state.js +52 -0
  159. package/dist/server/utils/client-connection-state.js.map +1 -0
  160. package/dist/server/utils/request-id-manager.js +21 -3
  161. package/dist/server/utils/request-id-manager.js.map +1 -1
  162. package/dist/token-daemon/history-store.d.ts +2 -0
  163. package/dist/token-daemon/history-store.js +6 -2
  164. package/dist/token-daemon/history-store.js.map +1 -1
  165. package/dist/token-daemon/index.js +36 -5
  166. package/dist/token-daemon/index.js.map +1 -1
  167. package/dist/token-daemon/leader-lock.d.ts +11 -0
  168. package/dist/token-daemon/leader-lock.js +79 -0
  169. package/dist/token-daemon/leader-lock.js.map +1 -0
  170. package/dist/token-daemon/message-bus-integrator.d.ts +98 -0
  171. package/dist/token-daemon/message-bus-integrator.js +144 -0
  172. package/dist/token-daemon/message-bus-integrator.js.map +1 -0
  173. package/dist/token-daemon/provider-registry.d.ts +22 -0
  174. package/dist/token-daemon/provider-registry.js +201 -0
  175. package/dist/token-daemon/provider-registry.js.map +1 -0
  176. package/dist/token-daemon/token-daemon.d.ts +8 -0
  177. package/dist/token-daemon/token-daemon.js +196 -11
  178. package/dist/token-daemon/token-daemon.js.map +1 -1
  179. package/dist/token-portal/local-token-portal.d.ts +1 -0
  180. package/dist/token-portal/local-token-portal.js +18 -0
  181. package/dist/token-portal/local-token-portal.js.map +1 -1
  182. package/dist/token-portal/render.js +1 -0
  183. package/dist/token-portal/render.js.map +1 -1
  184. package/dist/tools/error-log.d.ts +31 -0
  185. package/dist/tools/error-log.js +117 -0
  186. package/dist/tools/error-log.js.map +1 -0
  187. package/dist/tools/stats-request-events.d.ts +2 -0
  188. package/dist/tools/stats-request-events.js +16 -0
  189. package/dist/tools/stats-request-events.js.map +1 -0
  190. package/dist/tools/stats-usage.d.ts +31 -0
  191. package/dist/tools/stats-usage.js +206 -0
  192. package/dist/tools/stats-usage.js.map +1 -0
  193. package/package.json +9 -4
  194. package/scripts/analyze-codex-error-failures.mjs +111 -0
  195. package/scripts/analyze-usage-estimate.mjs +240 -0
  196. package/scripts/camoufox/gen-fingerprint-env.py +171 -0
  197. package/scripts/camoufox/launch-auth.mjs +617 -0
  198. package/scripts/classify-codex-samples.mjs +251 -0
  199. package/scripts/cleanup-codex-error-samples.mjs +88 -0
  200. package/scripts/compare-codex-rccx.mjs +268 -0
  201. package/scripts/copy-compat-assets.mjs +18 -0
  202. package/scripts/install-release.sh +1 -1
  203. package/scripts/local-replay-openai-response.mjs +1 -2
  204. package/scripts/pack-mode.mjs +16 -6
  205. package/scripts/replay-codex-sample.mjs +24 -2
  206. package/scripts/responses-compare-server.mjs +119 -0
  207. package/scripts/tests/apply-patch-loop.mjs +266 -7
  208. package/scripts/tests/exec-command-loop.mjs +165 -0
  209. package/scripts/tool-classification-report.ts +281 -0
  210. package/scripts/verification/samples/openai-chat-list-local-files.json +1 -1
  211. package/scripts/verify-apply-patch.mjs +28 -17
  212. package/scripts/verify-codex-error-samples.mjs +102 -0
  213. package/scripts/verify-e2e-toolcall.mjs +71 -4
  214. package/scripts/virtual-router-shadow-v2-real.mjs +143 -0
  215. package/scripts/virtual-router-shadow-v2.mjs +122 -0
@@ -0,0 +1,138 @@
1
+ import path from 'node:path';
2
+ import { isLocalRequest } from '../daemon-admin-routes.js';
3
+ import { collectTokenSnapshot, readTokenFile, evaluateTokenState } from '../../../../token-daemon/token-utils.js';
4
+ async function buildCredentialSummaries() {
5
+ const snapshot = await collectTokenSnapshot();
6
+ const results = [];
7
+ for (const providerSnapshot of snapshot.providers) {
8
+ for (const token of providerSnapshot.tokens) {
9
+ const id = path.basename(token.filePath).replace(/\.json$/i, '');
10
+ const expiresAt = token.state.expiresAt;
11
+ const expiresInSec = token.state.msUntilExpiry !== null && token.state.msUntilExpiry !== undefined
12
+ ? Math.round(token.state.msUntilExpiry / 1000)
13
+ : null;
14
+ const kind = token.state.hasAccessToken || token.state.hasRefreshToken ? 'oauth' : 'apikey';
15
+ results.push({
16
+ id,
17
+ kind,
18
+ provider: providerSnapshot.provider,
19
+ alias: token.alias,
20
+ tokenFile: token.filePath,
21
+ displayName: token.displayName,
22
+ expiresAt,
23
+ expiresInSec,
24
+ status: token.state.status,
25
+ hasRefreshToken: token.state.hasRefreshToken,
26
+ hasAccessToken: token.state.hasAccessToken,
27
+ hasApiKey: token.state.hasApiKey,
28
+ noRefresh: token.state.noRefresh === true
29
+ });
30
+ }
31
+ }
32
+ return results;
33
+ }
34
+ export function registerCredentialRoutes(app, _options) {
35
+ app.get('/daemon/credentials', async (req, res) => {
36
+ if (!isLocalRequest(req)) {
37
+ res.status(403).json({ error: { message: 'forbidden', code: 'forbidden' } });
38
+ return;
39
+ }
40
+ try {
41
+ const items = await buildCredentialSummaries();
42
+ res.status(200).json(items);
43
+ }
44
+ catch (error) {
45
+ const message = error instanceof Error ? error.message : String(error);
46
+ res.status(500).json({ error: { message } });
47
+ }
48
+ });
49
+ app.get('/daemon/credentials/:id', async (req, res) => {
50
+ if (!isLocalRequest(req)) {
51
+ res.status(403).json({ error: { message: 'forbidden', code: 'forbidden' } });
52
+ return;
53
+ }
54
+ const id = String(req.params.id || '').trim();
55
+ if (!id) {
56
+ res.status(400).json({ error: { message: 'id is required' } });
57
+ return;
58
+ }
59
+ try {
60
+ const items = await buildCredentialSummaries();
61
+ const summary = items.find((c) => c.id === id);
62
+ if (!summary) {
63
+ res.status(404).json({ error: { message: 'credential not found', code: 'not_found' } });
64
+ return;
65
+ }
66
+ // 详细视图:在 summary 基础上补充少量非敏感字段(例如 email/projectId),如果存在的话。
67
+ const token = await readTokenFile(summary.tokenFile);
68
+ const now = Date.now();
69
+ const state = evaluateTokenState(token, now);
70
+ const email = token && typeof token.email === 'string'
71
+ ? token.email
72
+ : undefined;
73
+ const projectId = token && typeof token.project_id === 'string'
74
+ ? token.project_id
75
+ : undefined;
76
+ res.status(200).json({
77
+ ...summary,
78
+ expiresAt: state.expiresAt,
79
+ expiresInSec: state.msUntilExpiry !== null && state.msUntilExpiry !== undefined
80
+ ? Math.round(state.msUntilExpiry / 1000)
81
+ : null,
82
+ status: state.status,
83
+ email,
84
+ projectId
85
+ });
86
+ }
87
+ catch (error) {
88
+ const message = error instanceof Error ? error.message : String(error);
89
+ res.status(500).json({ error: { message } });
90
+ }
91
+ });
92
+ app.post('/daemon/credentials/:id/verify', async (req, res) => {
93
+ if (!isLocalRequest(req)) {
94
+ res.status(403).json({ error: { message: 'forbidden', code: 'forbidden' } });
95
+ return;
96
+ }
97
+ const id = String(req.params.id || '').trim();
98
+ if (!id) {
99
+ res.status(400).json({ error: { message: 'id is required' } });
100
+ return;
101
+ }
102
+ try {
103
+ const items = await buildCredentialSummaries();
104
+ const summary = items.find((c) => c.id === id);
105
+ if (!summary) {
106
+ res.status(404).json({ error: { message: 'credential not found', code: 'not_found' } });
107
+ return;
108
+ }
109
+ const token = await readTokenFile(summary.tokenFile);
110
+ const state = evaluateTokenState(token, Date.now());
111
+ res.status(200).json({
112
+ ok: true,
113
+ id: summary.id,
114
+ status: state.status,
115
+ checkedAt: Date.now(),
116
+ message: 'Verified locally (token file parsed and evaluated); no upstream call performed.'
117
+ });
118
+ }
119
+ catch (error) {
120
+ const message = error instanceof Error ? error.message : String(error);
121
+ res.status(500).json({ error: { message } });
122
+ }
123
+ });
124
+ app.post('/daemon/credentials/:id/refresh', (req, res) => {
125
+ if (!isLocalRequest(req)) {
126
+ res.status(403).json({ error: { message: 'forbidden', code: 'forbidden' } });
127
+ return;
128
+ }
129
+ // 为避免在 HTTP 请求路径中触发复杂的交互式 OAuth 流程,当前先返回明确的未实现标记。
130
+ res.status(501).json({
131
+ error: {
132
+ message: 'manual refresh endpoint is not yet implemented; use CLI-based auth helpers instead',
133
+ code: 'not_implemented'
134
+ }
135
+ });
136
+ });
137
+ }
138
+ //# sourceMappingURL=credentials-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials-handler.js","sourceRoot":"","sources":["../../../../../src/server/runtime/http-server/daemon-admin/credentials-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Application } from 'express';
2
+ import type { DaemonAdminRouteOptions } from '../daemon-admin-routes.js';
3
+ export declare function registerProviderRoutes(app: Application, options: DaemonAdminRouteOptions): void;
@@ -0,0 +1,166 @@
1
+ import { isLocalRequest } from '../daemon-admin-routes.js';
2
+ import { loadProviderConfigsV2 } from '../../../../config/provider-v2-loader.js';
3
+ export function registerProviderRoutes(app, options) {
4
+ app.get('/providers/runtimes', (req, res) => {
5
+ if (!isLocalRequest(req)) {
6
+ res.status(403).json({ error: { message: 'forbidden', code: 'forbidden' } });
7
+ return;
8
+ }
9
+ try {
10
+ const artifacts = options.getVirtualRouterArtifacts();
11
+ const targetRuntime = artifacts?.targetRuntime ?? {};
12
+ const items = [];
13
+ for (const [runtimeKey, runtime] of Object.entries(targetRuntime)) {
14
+ const providerKey = typeof runtime.providerKey === 'string'
15
+ ? runtime.providerKey
16
+ : runtimeKey;
17
+ const family = typeof runtime.providerFamily === 'string'
18
+ ? runtime.providerFamily
19
+ : undefined;
20
+ const protocol = typeof runtime.providerProtocol === 'string'
21
+ ? runtime.providerProtocol
22
+ : undefined;
23
+ const series = typeof runtime.series === 'string'
24
+ ? runtime.series
25
+ : undefined;
26
+ items.push({
27
+ providerKey,
28
+ runtimeKey,
29
+ family,
30
+ protocol,
31
+ series,
32
+ enabled: true
33
+ });
34
+ }
35
+ res.status(200).json(items);
36
+ }
37
+ catch (error) {
38
+ const message = error instanceof Error ? error.message : String(error);
39
+ res.status(500).json({ error: { message } });
40
+ }
41
+ });
42
+ // Config V2 Provider 视图:基于 ~/.routecodex/provider/*/config.v2.json 的声明性配置。
43
+ app.get('/config/providers/v2', async (req, res) => {
44
+ if (!isLocalRequest(req)) {
45
+ res.status(403).json({ error: { message: 'forbidden', code: 'forbidden' } });
46
+ return;
47
+ }
48
+ try {
49
+ const configs = await loadProviderConfigsV2();
50
+ const items = Object.values(configs).map((cfg) => {
51
+ const provider = cfg.provider;
52
+ const family = typeof provider.providerType === 'string'
53
+ ? provider.providerType
54
+ : undefined;
55
+ const protocol = typeof provider.compatibilityProfile === 'string'
56
+ ? provider.compatibilityProfile
57
+ : undefined;
58
+ const enabled = typeof provider.enabled === 'boolean'
59
+ ? provider.enabled
60
+ : true;
61
+ const defaultModels = extractDefaultModels(provider);
62
+ const credentialsRef = extractCredentialsRef(provider);
63
+ return {
64
+ id: cfg.providerId,
65
+ family,
66
+ protocol,
67
+ enabled,
68
+ defaultModels,
69
+ credentialsRef,
70
+ version: cfg.version
71
+ };
72
+ });
73
+ res.status(200).json(items);
74
+ }
75
+ catch (error) {
76
+ const message = error instanceof Error ? error.message : String(error);
77
+ res.status(500).json({ error: { message } });
78
+ }
79
+ });
80
+ app.get('/config/providers/v2/:id', async (req, res) => {
81
+ if (!isLocalRequest(req)) {
82
+ res.status(403).json({ error: { message: 'forbidden', code: 'forbidden' } });
83
+ return;
84
+ }
85
+ const id = String(req.params.id || '').trim();
86
+ if (!id) {
87
+ res.status(400).json({ error: { message: 'id is required' } });
88
+ return;
89
+ }
90
+ try {
91
+ const configs = await loadProviderConfigsV2();
92
+ const cfg = configs[id];
93
+ if (!cfg) {
94
+ res.status(404).json({ error: { message: 'provider config not found', code: 'not_found' } });
95
+ return;
96
+ }
97
+ const provider = scrubProviderConfig(cfg.provider);
98
+ res.status(200).json({
99
+ id: cfg.providerId,
100
+ version: cfg.version,
101
+ provider
102
+ });
103
+ }
104
+ catch (error) {
105
+ const message = error instanceof Error ? error.message : String(error);
106
+ res.status(500).json({ error: { message } });
107
+ }
108
+ });
109
+ app.get('/config/providers/v2/:id/preview-route', (req, res) => {
110
+ if (!isLocalRequest(req)) {
111
+ res.status(403).json({ error: { message: 'forbidden', code: 'forbidden' } });
112
+ return;
113
+ }
114
+ const id = String(req.params.id || '').trim();
115
+ if (!id) {
116
+ res.status(400).json({ error: { message: 'id is required' } });
117
+ return;
118
+ }
119
+ res.status(200).json({
120
+ id,
121
+ route: null,
122
+ series: null,
123
+ description: [
124
+ 'Route preview is not yet implemented for Config V2; virtual router builder does not expose a stable description API.'
125
+ ]
126
+ });
127
+ });
128
+ }
129
+ function extractDefaultModels(provider) {
130
+ const modelsNode = provider.models;
131
+ if (!modelsNode || typeof modelsNode !== 'object' || Array.isArray(modelsNode)) {
132
+ return undefined;
133
+ }
134
+ const keys = Object.keys(modelsNode);
135
+ return keys.length ? keys : undefined;
136
+ }
137
+ function extractCredentialsRef(provider) {
138
+ const auth = provider.auth;
139
+ if (!auth || typeof auth !== 'object' || Array.isArray(auth)) {
140
+ return undefined;
141
+ }
142
+ const entries = auth.entries;
143
+ if (!Array.isArray(entries) || entries.length === 0) {
144
+ return undefined;
145
+ }
146
+ const first = entries[0];
147
+ if (typeof first.tokenFile === 'string' && first.tokenFile.trim()) {
148
+ return first.tokenFile.trim();
149
+ }
150
+ return undefined;
151
+ }
152
+ function scrubProviderConfig(provider) {
153
+ const clone = { ...provider };
154
+ const auth = clone.auth;
155
+ if (auth && typeof auth === 'object' && !Array.isArray(auth)) {
156
+ const safeAuth = { ...auth };
157
+ // 删除潜在的敏感字段(目前 v2 配置中一般不存在这些字段,此处为防御性实现)。
158
+ delete safeAuth.apiKey;
159
+ delete safeAuth.api_key;
160
+ delete safeAuth.clientSecret;
161
+ delete safeAuth.secret;
162
+ clone.auth = safeAuth;
163
+ }
164
+ return clone;
165
+ }
166
+ //# sourceMappingURL=providers-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers-handler.js","sourceRoot":"","sources":["../../../../../src/server/runtime/http-server/daemon-admin/providers-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Application } from 'express';
2
+ import type { DaemonAdminRouteOptions } from '../daemon-admin-routes.js';
3
+ export declare function registerQuotaRoutes(app: Application, options: DaemonAdminRouteOptions): void;
@@ -0,0 +1,109 @@
1
+ import { isLocalRequest } from '../daemon-admin-routes.js';
2
+ function getQuotaModule(options) {
3
+ const daemon = options.getManagerDaemon();
4
+ if (!daemon) {
5
+ return null;
6
+ }
7
+ const mod = typeof daemon.getModule === 'function' ? daemon.getModule('quota') : undefined;
8
+ if (!mod) {
9
+ return null;
10
+ }
11
+ return mod;
12
+ }
13
+ export function registerQuotaRoutes(app, options) {
14
+ app.get('/quota/summary', (req, res) => {
15
+ if (!isLocalRequest(req)) {
16
+ res.status(403).json({ error: { message: 'forbidden', code: 'forbidden' } });
17
+ return;
18
+ }
19
+ try {
20
+ const quotaModule = getQuotaModule(options);
21
+ const snapshot = quotaModule ? quotaModule.getRawSnapshot() : {};
22
+ const records = Object.entries(snapshot).map(([key, value]) => ({
23
+ key,
24
+ remainingFraction: value.remainingFraction,
25
+ resetAt: value.resetAt ?? null,
26
+ fetchedAt: value.fetchedAt
27
+ }));
28
+ res.status(200).json({
29
+ updatedAt: Date.now(),
30
+ records
31
+ });
32
+ }
33
+ catch (error) {
34
+ const message = error instanceof Error ? error.message : String(error);
35
+ res.status(500).json({ error: { message } });
36
+ }
37
+ });
38
+ app.get('/quota/runtime', (req, res) => {
39
+ if (!isLocalRequest(req)) {
40
+ res.status(403).json({ error: { message: 'forbidden', code: 'forbidden' } });
41
+ return;
42
+ }
43
+ const runtimeKey = typeof req.query.runtimeKey === 'string' ? req.query.runtimeKey : undefined;
44
+ const providerKey = typeof req.query.providerKey === 'string' ? req.query.providerKey : undefined;
45
+ try {
46
+ const quotaModule = getQuotaModule(options);
47
+ const snapshot = quotaModule ? quotaModule.getRawSnapshot() : {};
48
+ // 当前仅针对 antigravity 语义;snapshot 键格式为 "antigravity://alias/modelId"
49
+ const items = [];
50
+ for (const [key, record] of Object.entries(snapshot)) {
51
+ const parsed = parseAntigravityKey(key);
52
+ if (!parsed) {
53
+ continue;
54
+ }
55
+ if (runtimeKey && !runtimeKey.includes(parsed.alias)) {
56
+ continue;
57
+ }
58
+ if (providerKey && !providerKey.includes(parsed.alias)) {
59
+ continue;
60
+ }
61
+ items.push({
62
+ key,
63
+ alias: parsed.alias,
64
+ modelId: parsed.modelId,
65
+ remainingFraction: record.remainingFraction,
66
+ resetAt: record.resetAt,
67
+ fetchedAt: record.fetchedAt
68
+ });
69
+ }
70
+ res.status(200).json({
71
+ runtimeKey: runtimeKey ?? null,
72
+ providerKey: providerKey ?? null,
73
+ items
74
+ });
75
+ }
76
+ catch (error) {
77
+ const message = error instanceof Error ? error.message : String(error);
78
+ res.status(500).json({ error: { message } });
79
+ }
80
+ });
81
+ app.get('/quota/cooldowns', (req, res) => {
82
+ if (!isLocalRequest(req)) {
83
+ res.status(403).json({ error: { message: 'forbidden', code: 'forbidden' } });
84
+ return;
85
+ }
86
+ // 目前 VirtualRouter 的 series cooldown 状态未通过稳定 API 暴露;
87
+ // 为避免与核心路由实现交叉,先返回空列表,占位以便前端视图对接。
88
+ res.status(200).json([]);
89
+ });
90
+ }
91
+ function parseAntigravityKey(key) {
92
+ // 形如 "antigravity://alias/modelId"
93
+ const prefix = 'antigravity://';
94
+ if (!key.startsWith(prefix)) {
95
+ return null;
96
+ }
97
+ const rest = key.slice(prefix.length);
98
+ const idx = rest.indexOf('/');
99
+ if (idx <= 0) {
100
+ return null;
101
+ }
102
+ const alias = rest.slice(0, idx);
103
+ const modelId = rest.slice(idx + 1);
104
+ if (!alias || !modelId) {
105
+ return null;
106
+ }
107
+ return { alias, modelId };
108
+ }
109
+ //# sourceMappingURL=quota-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quota-handler.js","sourceRoot":"","sources":["../../../../../src/server/runtime/http-server/daemon-admin/quota-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Application } from 'express';
2
+ import type { DaemonAdminRouteOptions } from '../daemon-admin-routes.js';
3
+ export declare function registerStatusRoutes(app: Application, options: DaemonAdminRouteOptions): void;
@@ -0,0 +1,43 @@
1
+ import { isLocalRequest } from '../daemon-admin-routes.js';
2
+ export function registerStatusRoutes(app, options) {
3
+ app.get('/daemon/status', (req, res) => {
4
+ if (!isLocalRequest(req)) {
5
+ res.status(403).json({ error: { message: 'forbidden', code: 'forbidden' } });
6
+ return;
7
+ }
8
+ const manager = options.getManagerDaemon();
9
+ const modules = [];
10
+ if (manager) {
11
+ // 当前 ManagerDaemon 没有统一的 introspection 接口,这里仅基于已知 id 做轻量推断。
12
+ const knownModuleIds = ['token', 'quota', 'health', 'routing'];
13
+ for (const id of knownModuleIds) {
14
+ const mod = typeof manager.getModule === 'function' ? manager.getModule(id) : undefined;
15
+ if (!mod) {
16
+ continue;
17
+ }
18
+ const base = { id, status: 'running' };
19
+ if (id === 'token') {
20
+ // TokenManagerModule 暴露 isLeader 字段;但出于类型约束,我们只做 best-effort 读取。
21
+ const anyMod = mod;
22
+ if (anyMod.isLeader === true) {
23
+ base.status = 'leader';
24
+ }
25
+ }
26
+ modules.push(base);
27
+ }
28
+ }
29
+ const uptimeSec = process.uptime();
30
+ const version = String(process.env.ROUTECODEX_VERSION || 'dev');
31
+ res.status(200).json({
32
+ ok: true,
33
+ serverId: options.getServerId(),
34
+ version,
35
+ uptimeSec,
36
+ manager: {
37
+ active: Boolean(manager),
38
+ modules
39
+ }
40
+ });
41
+ });
42
+ }
43
+ //# sourceMappingURL=status-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-handler.js","sourceRoot":"","sources":["../../../../../src/server/runtime/http-server/daemon-admin/status-handler.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAQ3D,MAAM,UAAU,oBAAoB,CAAC,GAAgB,EAAE,OAAgC;IACrF,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;QACxD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;YAC7E,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,gBAAgB,EAIhC,CAAC;QACT,MAAM,OAAO,GAAuB,EAAE,CAAC;QAEvC,IAAI,OAAO,EAAE,CAAC;YACZ,4DAA4D;YAC5D,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC/D,KAAK,MAAM,EAAE,IAAI,cAAc,EAAE,CAAC;gBAChC,MAAM,GAAG,GAAG,OAAO,OAAO,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACxF,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,SAAS;gBACX,CAAC;gBACD,MAAM,IAAI,GAAqB,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;gBACzD,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;oBACnB,iEAAiE;oBACjE,MAAM,MAAM,GAAG,GAAwC,CAAC;oBACxD,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;wBAC7B,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;oBACzB,CAAC;gBACH,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,KAAK,CAAC,CAAC;QAEhE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,EAAE,EAAE,IAAI;YACR,QAAQ,EAAE,OAAO,CAAC,WAAW,EAAE;YAC/B,OAAO;YACP,SAAS;YACT,OAAO,EAAE;gBACP,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC;gBACxB,OAAO;aACR;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { Application, Request, Response } from 'express';
2
+ export interface DaemonAdminRouteOptions {
3
+ app: Application;
4
+ /**
5
+ * Lazily resolve ManagerDaemon 实例;可能为 null(例如初始化早期或关闭中)。
6
+ */
7
+ getManagerDaemon: () => unknown | null;
8
+ /**
9
+ * 返回当前 HTTP 服务器标识(通常为 host:port)。
10
+ */
11
+ getServerId: () => string;
12
+ /**
13
+ * 返回当前虚拟路由构建产物;用于 Providers 运行时视图。
14
+ */
15
+ getVirtualRouterArtifacts: () => unknown | null;
16
+ }
17
+ export declare function isLocalRequest(req: Request): boolean;
18
+ export declare function rejectNonLocal(req: Request, res: Response): boolean;
19
+ export declare function registerDaemonAdminRoutes(options: DaemonAdminRouteOptions): void;
@@ -0,0 +1,27 @@
1
+ import { registerStatusRoutes } from './daemon-admin/status-handler.js';
2
+ import { registerCredentialRoutes } from './daemon-admin/credentials-handler.js';
3
+ import { registerQuotaRoutes } from './daemon-admin/quota-handler.js';
4
+ import { registerProviderRoutes } from './daemon-admin/providers-handler.js';
5
+ export function isLocalRequest(req) {
6
+ const ip = req.socket?.remoteAddress || '';
7
+ return ip === '127.0.0.1' || ip === '::1' || ip === '::ffff:127.0.0.1';
8
+ }
9
+ export function rejectNonLocal(req, res) {
10
+ if (isLocalRequest(req)) {
11
+ return false;
12
+ }
13
+ res.status(403).json({ error: { message: 'forbidden', code: 'forbidden' } });
14
+ return true;
15
+ }
16
+ export function registerDaemonAdminRoutes(options) {
17
+ const { app } = options;
18
+ // Daemon / manager 状态
19
+ registerStatusRoutes(app, options);
20
+ // Credentials / token 视图
21
+ registerCredentialRoutes(app, options);
22
+ // Quota / 429 冷却视图
23
+ registerQuotaRoutes(app, options);
24
+ // Providers 运行时 + Config V2 视图
25
+ registerProviderRoutes(app, options);
26
+ }
27
+ //# sourceMappingURL=daemon-admin-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-admin-routes.js","sourceRoot":"","sources":["../../../../src/server/runtime/http-server/daemon-admin-routes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAkB7E,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,IAAI,EAAE,CAAC;IAC3C,OAAO,EAAE,KAAK,WAAW,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,kBAAkB,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAY,EAAE,GAAa;IACxD,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;IAC7E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAgC;IACxE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IAExB,sBAAsB;IACtB,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAEnC,yBAAyB;IACzB,wBAAwB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAEvC,mBAAmB;IACnB,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAElC,+BAA+B;IAC/B,sBAAsB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC"}
@@ -1,3 +1,4 @@
1
+ export declare function hasVirtualRouterSeriesCooldown(error: unknown): boolean;
1
2
  export declare function shouldRetryProviderError(error: unknown): boolean;
2
3
  export declare function extractErrorStatusCode(error: unknown): number | undefined;
3
4
  export declare function describeRetryReason(error: unknown): string;
@@ -1,7 +1,33 @@
1
+ export function hasVirtualRouterSeriesCooldown(error) {
2
+ if (!error || typeof error !== 'object') {
3
+ return false;
4
+ }
5
+ const details = error.details;
6
+ if (!details || typeof details !== 'object') {
7
+ return false;
8
+ }
9
+ const seriesDetail = details.virtualRouterSeriesCooldown;
10
+ if (!seriesDetail || typeof seriesDetail !== 'object') {
11
+ return false;
12
+ }
13
+ const record = seriesDetail;
14
+ const cooldownMs = typeof record.cooldownMs === 'number' ? record.cooldownMs : undefined;
15
+ if (!cooldownMs || !Number.isFinite(cooldownMs) || cooldownMs <= 0) {
16
+ return false;
17
+ }
18
+ const source = typeof record.source === 'string' ? record.source.trim().toLowerCase() : undefined;
19
+ const hasQuotaHint = source === 'quota_reset_delay' || typeof record.quotaResetDelay === 'string';
20
+ return hasQuotaHint;
21
+ }
1
22
  export function shouldRetryProviderError(error) {
2
23
  if (!error || typeof error !== 'object') {
3
24
  return false;
4
25
  }
26
+ // virtualRouterSeriesCooldown 表示 provider 已经把 alias 从池子里拉黑,需要切换到下一位。
27
+ // 这类错误仍然属于「可恢复」,因为虚拟路由会根据 cooldown 信息选择新的目标。
28
+ if (hasVirtualRouterSeriesCooldown(error)) {
29
+ return true;
30
+ }
5
31
  const providerError = error;
6
32
  if (providerError.retryable === true) {
7
33
  return true;
@@ -1 +1 @@
1
- {"version":3,"file":"executor-provider.js","sourceRoot":"","sources":["../../../../src/server/runtime/http-server/executor-provider.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,aAAa,GAAG,KAAsB,CAAC;IAC7C,IAAI,aAAa,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,gBAAgB,GAA8B,EAAE,CAAC;IACvD,MAAM,YAAY,GAAI,KAAkC,CAAC,UAAU,CAAC;IACpE,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;QACrC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,eAAe,GAAI,KAA8B,CAAC,MAAM,CAAC;IAC/D,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE,CAAC;QACxC,gBAAgB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,YAAY,GAAI,KAA+B,CAAC,OAAO,CAAC;IAC9D,IAAI,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;QACrD,MAAM,YAAY,GAAI,YAAqC,CAAC,MAAM,CAAC;QACnE,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;YACrC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAI,KAAgC,CAAC,QAAQ,CAAC;IAC5D,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAI,QAAiC,CAAC,MAAM,CAAC;QAC7D,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YACnC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,cAAc,GAAI,QAAqC,CAAC,UAAU,CAAC;QACzE,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE,CAAC;YACvC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,SAAS,EAAuB,EAAE,CAAC,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC;IAC1G,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,GAAI,KAA+B,CAAC,OAAO,CAAC;IACzD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC/C,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,IAAI,OAAQ,KAA+B,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACjE,OAAQ,KAA6B,CAAC,OAAO,CAAC;IAChD,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"executor-provider.js","sourceRoot":"","sources":["../../../../src/server/runtime/http-server/executor-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { PipelineExecutionInput, PipelineExecutionResult } from '../../handlers/types.js';
2
+ export interface ConvertProviderResponseOptions {
3
+ entryEndpoint?: string;
4
+ providerType?: string;
5
+ requestId: string;
6
+ wantsStream: boolean;
7
+ originalRequest?: Record<string, unknown> | undefined;
8
+ processMode?: string;
9
+ response: PipelineExecutionResult;
10
+ pipelineMetadata?: Record<string, unknown>;
11
+ }
12
+ export interface ConvertProviderResponseDeps {
13
+ logStage(stage: string, requestId: string, details?: Record<string, unknown>): void;
14
+ executeNested(input: PipelineExecutionInput): Promise<PipelineExecutionResult>;
15
+ }
16
+ export declare function convertProviderResponseIfNeeded(options: ConvertProviderResponseOptions, deps: ConvertProviderResponseDeps): Promise<PipelineExecutionResult>;