@undefineds.co/xpod 0.3.69 → 0.3.71-rc.2

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 (178) hide show
  1. package/config/cloud.json +3 -28
  2. package/config/local.json +3 -0
  3. package/config/resolver.json +7 -0
  4. package/config/xpod.base.json +20 -0
  5. package/dist/agents/ClaudeExecutor.js +1 -1
  6. package/dist/agents/ClaudeExecutor.js.map +1 -1
  7. package/dist/agents/types.d.ts +5 -5
  8. package/dist/agents/types.js.map +1 -1
  9. package/dist/api/ai-gateway/AiGatewayService.d.ts +5 -16
  10. package/dist/api/ai-gateway/AiGatewayService.js +13 -35
  11. package/dist/api/ai-gateway/AiGatewayService.js.map +1 -1
  12. package/dist/api/ai-gateway/auth/AiConnectionInvocationKeyIssuer.d.ts +3 -2
  13. package/dist/api/ai-gateway/auth/AiConnectionInvocationKeyIssuer.js +37 -12
  14. package/dist/api/ai-gateway/auth/AiConnectionInvocationKeyIssuer.js.map +1 -1
  15. package/dist/api/ai-gateway/auth/GatewayPrincipal.d.ts +2 -16
  16. package/dist/api/ai-gateway/auth/GatewayPrincipal.js +3 -33
  17. package/dist/api/ai-gateway/auth/GatewayPrincipal.js.map +1 -1
  18. package/dist/api/ai-gateway/auth/InvocationTokenAuthenticator.d.ts +23 -0
  19. package/dist/api/ai-gateway/auth/InvocationTokenAuthenticator.js +81 -0
  20. package/dist/api/ai-gateway/auth/InvocationTokenAuthenticator.js.map +1 -0
  21. package/dist/api/ai-gateway/auth/InvocationTokenCodec.d.ts +7 -4
  22. package/dist/api/ai-gateway/auth/InvocationTokenCodec.js.map +1 -1
  23. package/dist/api/ai-gateway/connect/index.d.ts +7 -26
  24. package/dist/api/ai-gateway/connect/index.js +40 -67
  25. package/dist/api/ai-gateway/connect/index.js.map +1 -1
  26. package/dist/api/ai-gateway/credentials/PlaintextCredentialPayload.d.ts +17 -0
  27. package/dist/api/ai-gateway/credentials/PlaintextCredentialPayload.js +65 -0
  28. package/dist/api/ai-gateway/credentials/PlaintextCredentialPayload.js.map +1 -0
  29. package/dist/api/ai-gateway/pod/HostedPodDataAccess.d.ts +24 -0
  30. package/dist/api/ai-gateway/pod/HostedPodDataAccess.js +149 -0
  31. package/dist/api/ai-gateway/pod/HostedPodDataAccess.js.map +1 -0
  32. package/dist/api/ai-gateway/quota/ProviderQuotaAdapter.d.ts +13 -5
  33. package/dist/api/ai-gateway/quota/ProviderQuotaAdapter.js +16 -19
  34. package/dist/api/ai-gateway/quota/ProviderQuotaAdapter.js.map +1 -1
  35. package/dist/api/ai-gateway/service-access/AiConnectionServiceAccess.d.ts +1 -1
  36. package/dist/api/ai-gateway/service-access/AiConnectionServiceAccess.js +0 -2
  37. package/dist/api/ai-gateway/service-access/AiConnectionServiceAccess.js.map +1 -1
  38. package/dist/api/auth/AuthContext.d.ts +1 -12
  39. package/dist/api/auth/AuthContext.js +0 -11
  40. package/dist/api/auth/AuthContext.js.map +1 -1
  41. package/dist/api/auth/ClientCredentialsAuthenticator.js +4 -11
  42. package/dist/api/auth/ClientCredentialsAuthenticator.js.map +1 -1
  43. package/dist/api/chatkit/default-agent.d.ts +2 -2
  44. package/dist/api/chatkit/default-agent.js +4 -4
  45. package/dist/api/chatkit/default-agent.js.map +1 -1
  46. package/dist/api/chatkit/runtime/AcpAgentRuntime.js +1 -1
  47. package/dist/api/chatkit/runtime/AcpAgentRuntime.js.map +1 -1
  48. package/dist/api/container/common.js +28 -69
  49. package/dist/api/container/common.js.map +1 -1
  50. package/dist/api/container/index.js +5 -6
  51. package/dist/api/container/index.js.map +1 -1
  52. package/dist/api/container/routes.js +2 -5
  53. package/dist/api/container/routes.js.map +1 -1
  54. package/dist/api/container/types.d.ts +8 -10
  55. package/dist/api/container/types.js.map +1 -1
  56. package/dist/api/handlers/AiClientConfigurationHandler.js +3 -3
  57. package/dist/api/handlers/AiClientConfigurationHandler.js.map +1 -1
  58. package/dist/api/handlers/AiGatewayHandler.js +2 -2
  59. package/dist/api/handlers/AiGatewayHandler.js.map +1 -1
  60. package/dist/api/handlers/AiGatewayManagementHandler.d.ts +2 -10
  61. package/dist/api/handlers/AiGatewayManagementHandler.js +4 -154
  62. package/dist/api/handlers/AiGatewayManagementHandler.js.map +1 -1
  63. package/dist/api/handlers/NetworkSettingsHandler.js +0 -3
  64. package/dist/api/handlers/NetworkSettingsHandler.js.map +1 -1
  65. package/dist/api/handlers/PodSettingsHandler.d.ts +5 -2
  66. package/dist/api/handlers/PodSettingsHandler.js +3 -3
  67. package/dist/api/handlers/PodSettingsHandler.js.map +1 -1
  68. package/dist/api/runs/AgentRuntimeTypes.d.ts +3 -3
  69. package/dist/api/runs/AgentRuntimeTypes.js +10 -10
  70. package/dist/api/runs/AgentRuntimeTypes.js.map +1 -1
  71. package/dist/api/runs/InngestRunExecutionBackend.d.ts +15 -9
  72. package/dist/api/runs/InngestRunExecutionBackend.js +25 -10
  73. package/dist/api/runs/InngestRunExecutionBackend.js.map +1 -1
  74. package/dist/api/runs/PiAgentRuntimeDriver.js +2 -2
  75. package/dist/api/runs/PiAgentRuntimeDriver.js.map +1 -1
  76. package/dist/api/runs/RunStateCenter.js +1 -1
  77. package/dist/api/runs/RunStateCenter.js.map +1 -1
  78. package/dist/api/service/AiClientConfigurationService.d.ts +2 -2
  79. package/dist/api/service/AiClientConfigurationService.js +11 -11
  80. package/dist/api/service/AiClientConfigurationService.js.map +1 -1
  81. package/dist/api/tasks/InngestTaskScheduler.d.ts +16 -10
  82. package/dist/api/tasks/InngestTaskScheduler.js +24 -12
  83. package/dist/api/tasks/InngestTaskScheduler.js.map +1 -1
  84. package/dist/cli/commands/start.js +7 -7
  85. package/dist/cli/commands/start.js.map +1 -1
  86. package/dist/components/components.jsonld +1 -0
  87. package/dist/components/context.jsonld +42 -0
  88. package/dist/http/InternalPodDataHttpHandler.d.ts +32 -0
  89. package/dist/http/InternalPodDataHttpHandler.js +258 -0
  90. package/dist/http/InternalPodDataHttpHandler.js.map +1 -0
  91. package/dist/http/InternalPodDataHttpHandler.jsonld +201 -0
  92. package/dist/index.d.ts +2 -1
  93. package/dist/index.js +4 -2
  94. package/dist/index.js.map +1 -1
  95. package/dist/main.js +13 -13
  96. package/dist/main.js.map +1 -1
  97. package/dist/runtime/GatewayAdminProxyAuth.d.ts +15 -1
  98. package/dist/runtime/GatewayAdminProxyAuth.js +57 -2
  99. package/dist/runtime/GatewayAdminProxyAuth.js.map +1 -1
  100. package/dist/runtime/bootstrap.js +3 -0
  101. package/dist/runtime/bootstrap.js.map +1 -1
  102. package/dist/runtime/css-process.d.ts +1 -1
  103. package/dist/runtime/css-process.js +4 -1
  104. package/dist/runtime/css-process.js.map +1 -1
  105. package/dist/runtime/runner/node/CommunitySolidServerCssRunner.d.ts +2 -0
  106. package/dist/runtime/runner/node/CommunitySolidServerCssRunner.js +50 -0
  107. package/dist/runtime/runner/node/CommunitySolidServerCssRunner.js.map +1 -1
  108. package/dist/storage/rdf/PostgresRdfEngine.js +2 -0
  109. package/dist/storage/rdf/PostgresRdfEngine.js.map +1 -1
  110. package/dist/storage/rdf/PostgresRdfVectorIndex.d.ts +1 -0
  111. package/dist/storage/rdf/PostgresRdfVectorIndex.js +1 -1
  112. package/dist/storage/rdf/PostgresRdfVectorIndex.js.map +1 -1
  113. package/dist/storage/rdf/PostgresRdfVectorIndex.jsonld +29 -0
  114. package/node_modules/@undefineds.co/ai-connection/dist/AiClientConfigurationSection.d.ts +5 -5
  115. package/node_modules/@undefineds.co/ai-connection/dist/AiClientConfigurationSection.js +7 -7
  116. package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionMain.js +1 -1
  117. package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionPanel.d.ts +3 -1
  118. package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionPanel.js +74 -60
  119. package/node_modules/@undefineds.co/ai-connection/dist/ai-connection-client.d.ts +0 -21
  120. package/node_modules/@undefineds.co/ai-connection/dist/ai-connection-client.js +0 -41
  121. package/node_modules/@undefineds.co/ai-connection/dist/client-config/base-adapter.d.ts +1 -0
  122. package/node_modules/@undefineds.co/ai-connection/dist/client-config/base-adapter.js +7 -2
  123. package/node_modules/@undefineds.co/ai-connection/dist/client-config/codex.js +3 -3
  124. package/node_modules/@undefineds.co/ai-connection/dist/client-config/index.cjs +15 -9
  125. package/node_modules/@undefineds.co/ai-connection/dist/client-config/json-env-adapter.js +4 -4
  126. package/node_modules/@undefineds.co/ai-connection/dist/client-config/pi.js +3 -3
  127. package/node_modules/@undefineds.co/ai-connection/dist/client-config/types.d.ts +1 -1
  128. package/node_modules/@undefineds.co/ai-connection/dist/controller.d.ts +2 -1
  129. package/node_modules/@undefineds.co/ai-connection/dist/controller.js +1 -0
  130. package/node_modules/@undefineds.co/ai-connection/dist/service-access.js +0 -1
  131. package/node_modules/@undefineds.co/extension-sdk/dist/web.d.ts +22 -1
  132. package/package.json +3 -3
  133. package/static/app/assets/main.js +7 -7
  134. package/static/dashboard/assets/NetworkPage-CXjiUMR1.js +2 -0
  135. package/static/dashboard/assets/{PaneListHeader-57nvMwH6.js → PaneListHeader-BSipfl0W.js} +1 -1
  136. package/static/dashboard/assets/PodPage-Bd3Xhmp-.js +2 -0
  137. package/static/dashboard/assets/ServicesPage-CI3jWZGe.js +1 -0
  138. package/static/dashboard/assets/{card-B9Zjf_2p.js → card-z5BV5hTo.js} +1 -1
  139. package/static/dashboard/assets/{dashboard-8C6o666W.js → dashboard-CSrqAv2L.js} +2 -2
  140. package/static/dashboard/assets/{database-DPh9wDY9.js → database-Ct5ZPe6L.js} +1 -1
  141. package/static/dashboard/assets/{external-link-VbMQvVMz.js → external-link-B7wD1hkm.js} +1 -1
  142. package/static/dashboard/assets/index-tOBaUnM1.js +44 -0
  143. package/static/dashboard/assets/{refresh-cw-BxVxNxNr.js → refresh-cw-CFDZPaE8.js} +1 -1
  144. package/static/dashboard/assets/{services-status-context-DKmJ7ISr.js → services-status-context-DN1Icg4A.js} +1 -1
  145. package/static/dashboard/dashboard.html +1 -1
  146. package/static/settings/assets/ModelsPage-D87RrLB0.js +1 -0
  147. package/static/settings/assets/{PaneListHeader-Bgaze006.js → PaneListHeader-BtON8Z5Q.js} +1 -1
  148. package/static/settings/assets/PodPage-9LGuOloQ.js +2 -0
  149. package/static/settings/assets/ServicesPage-ZoT9-B_0.js +1 -0
  150. package/static/settings/assets/SettingsPage-Bj4lB3mq.js +41 -0
  151. package/static/settings/assets/{card-B_bXSIn-.js → card-CCGngjas.js} +1 -1
  152. package/static/settings/assets/{services-status-context-DiX-AbrP.js → services-status-context-CBfImxL_.js} +1 -1
  153. package/static/settings/assets/{settings-B30oMfZq.js → settings-yUyFIJxi.js} +2 -2
  154. package/static/settings/assets/{workspace-layout-Dv1Yn9Ci.js → workspace-layout-B0wJpPze.js} +1 -1
  155. package/static/settings/settings.html +1 -1
  156. package/dist/api/ai-gateway/auth/ClientCredentialsInternalPodAccessTokenProvider.d.ts +0 -25
  157. package/dist/api/ai-gateway/auth/ClientCredentialsInternalPodAccessTokenProvider.js +0 -91
  158. package/dist/api/ai-gateway/auth/ClientCredentialsInternalPodAccessTokenProvider.js.map +0 -1
  159. package/dist/api/ai-gateway/auth/GatewayApiKey.d.ts +0 -28
  160. package/dist/api/ai-gateway/auth/GatewayApiKey.js +0 -162
  161. package/dist/api/ai-gateway/auth/GatewayApiKey.js.map +0 -1
  162. package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.d.ts +0 -56
  163. package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.js +0 -143
  164. package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.js.map +0 -1
  165. package/dist/api/ai-gateway/auth/GatewayKeyLocatorCodec.d.ts +0 -26
  166. package/dist/api/ai-gateway/auth/GatewayKeyLocatorCodec.js +0 -97
  167. package/dist/api/ai-gateway/auth/GatewayKeyLocatorCodec.js.map +0 -1
  168. package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.d.ts +0 -54
  169. package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.js +0 -152
  170. package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.js.map +0 -1
  171. package/static/dashboard/assets/NetworkPage-Brt79fuQ.js +0 -2
  172. package/static/dashboard/assets/PodPage-CM6do1vB.js +0 -2
  173. package/static/dashboard/assets/ServicesPage-BUNxGJRz.js +0 -1
  174. package/static/dashboard/assets/index-RfiFckzb.js +0 -51
  175. package/static/settings/assets/ModelsPage-D_IH7AH3.js +0 -1
  176. package/static/settings/assets/PodPage-Cy1VNObw.js +0 -2
  177. package/static/settings/assets/ServicesPage-BsFaxVWC.js +0 -1
  178. package/static/settings/assets/SettingsPage-UafNWE_p.js +0 -48
@@ -6,6 +6,7 @@
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.registerCommonServices = registerCommonServices;
9
+ const node_crypto_1 = require("node:crypto");
9
10
  const awilix_1 = require("awilix");
10
11
  const db_1 = require("../../identity/drizzle/db");
11
12
  const EdgeNodeRepository_1 = require("../../identity/drizzle/EdgeNodeRepository");
@@ -17,12 +18,10 @@ const ClientCredentialsAuthenticator_1 = require("../auth/ClientCredentialsAuthe
17
18
  const NodeTokenAuthenticator_1 = require("../auth/NodeTokenAuthenticator");
18
19
  const ServiceTokenAuthenticator_1 = require("../auth/ServiceTokenAuthenticator");
19
20
  const MultiAuthenticator_1 = require("../auth/MultiAuthenticator");
20
- const GatewayApiKeyAuthenticator_1 = require("../ai-gateway/auth/GatewayApiKeyAuthenticator");
21
- const PodGatewayAccessKeyRepository_1 = require("../ai-gateway/auth/PodGatewayAccessKeyRepository");
22
- const GatewayKeyLocatorCodec_1 = require("../ai-gateway/auth/GatewayKeyLocatorCodec");
23
- const ClientCredentialsInternalPodAccessTokenProvider_1 = require("../ai-gateway/auth/ClientCredentialsInternalPodAccessTokenProvider");
21
+ const InvocationTokenAuthenticator_1 = require("../ai-gateway/auth/InvocationTokenAuthenticator");
24
22
  const AiConnectionInvocationKeyIssuer_1 = require("../ai-gateway/auth/AiConnectionInvocationKeyIssuer");
25
23
  const InvocationTokenCodec_1 = require("../ai-gateway/auth/InvocationTokenCodec");
24
+ const HostedPodDataAccess_1 = require("../ai-gateway/pod/HostedPodDataAccess");
26
25
  const AiGatewayService_1 = require("../ai-gateway/AiGatewayService");
27
26
  const connect_1 = require("../ai-gateway/connect");
28
27
  const ProviderRegistry_1 = require("../ai-gateway/providers/ProviderRegistry");
@@ -55,6 +54,9 @@ function resolveCssServiceBaseUrl() {
55
54
  }
56
55
  return 'http://localhost:3000/';
57
56
  }
57
+ function resolveHostedPodCssBaseUrl() {
58
+ return process.env.CSS_INTERNAL_URL ?? 'http://localhost:3000/';
59
+ }
58
60
  function resolveAiConnectionBaseUrl(config) {
59
61
  const origin = config.publicUrl
60
62
  ?? process.env.XPOD_PUBLIC_URL
@@ -65,6 +67,9 @@ function resolveAiConnectionBaseUrl(config) {
65
67
  function resolveAiConnectionAudience(config) {
66
68
  return new URL(resolveAiConnectionBaseUrl(config)).origin;
67
69
  }
70
+ function randomSecret() {
71
+ return (0, node_crypto_1.randomBytes)(32).toString('base64url');
72
+ }
68
73
  /**
69
74
  * 注册共享服务到容器
70
75
  */
@@ -102,41 +107,19 @@ function registerCommonServices(container) {
102
107
  scopes: ['quota:write', 'usage:read', 'account:manage', 'network:read', 'network:write'],
103
108
  });
104
109
  }).singleton(),
105
- gatewayInternalPodAccess: (0, awilix_1.asFunction)(({ config }) => {
106
- if (!config.gatewayInternalClientId || !config.gatewayInternalClientSecret) {
107
- return undefined;
108
- }
109
- return new ClientCredentialsInternalPodAccessTokenProvider_1.ClientCredentialsInternalPodAccessTokenProvider({
110
- tokenEndpoint: config.cssTokenEndpoint,
111
- clientId: config.gatewayInternalClientId,
112
- clientSecret: config.gatewayInternalClientSecret,
113
- });
114
- }).singleton(),
115
- gatewayAccessKeyRepository: (0, awilix_1.asFunction)(({ config, gatewayInternalPodAccess }) => {
116
- if (!config.gatewayLocatorSecret) {
117
- throw new Error('XPOD_GATEWAY_LOCATOR_SECRET is required for Gateway API key locator encryption');
118
- }
119
- return new PodGatewayAccessKeyRepository_1.PodGatewayAccessKeyRepository({
120
- locatorCodec: new GatewayKeyLocatorCodec_1.AesGatewayKeyLocatorCodec({
121
- active: {
122
- kid: config.gatewayLocatorKeyId ?? 'active',
123
- secret: config.gatewayLocatorSecret,
124
- },
125
- previous: config.gatewayPreviousLocatorSecrets,
126
- }),
127
- internalPodAccess: gatewayInternalPodAccess,
110
+ hostedPodDataAccess: (0, awilix_1.asFunction)(({ config }) => {
111
+ return new HostedPodDataAccess_1.HostedPodDataAccess({
112
+ cssBaseUrl: resolveHostedPodCssBaseUrl(),
113
+ gatewayAdminProxyAuthSecret: config.gatewayAdminProxyAuthSecret,
128
114
  });
129
115
  }).singleton(),
130
116
  invocationTokenCodec: (0, awilix_1.asFunction)(({ config }) => {
131
- if (!config.gatewayLocatorSecret) {
132
- throw new Error('XPOD_GATEWAY_LOCATOR_SECRET is required for invocation token encryption');
133
- }
134
117
  return new InvocationTokenCodec_1.AesInvocationTokenCodec({
135
118
  active: {
136
- kid: config.gatewayLocatorKeyId ?? 'active',
137
- secret: config.gatewayLocatorSecret,
119
+ kid: config.aiConnectionInvocationKeyId ?? 'ephemeral',
120
+ secret: config.aiConnectionInvocationSecret ?? randomSecret(),
138
121
  },
139
- previous: config.gatewayPreviousLocatorSecrets,
122
+ previous: config.aiConnectionPreviousInvocationSecrets,
140
123
  });
141
124
  }).singleton(),
142
125
  aiConnectionInvocationKeyIssuer: (0, awilix_1.asFunction)(({ config, invocationTokenCodec }) => {
@@ -163,16 +146,9 @@ function registerCommonServices(container) {
163
146
  adapters: [],
164
147
  });
165
148
  }
166
- if (!config.secretCellCredentialVaultFactory) {
167
- throw new Error('AI Gateway Connect requires XPOD_SECRET_CELL_KEY_ID and XPOD_SECRET_CELL_KEY');
168
- }
169
- const signingSecret = config.aiGatewayConnectSigningSecret ?? config.gatewayLocatorSecret;
170
- if (!signingSecret) {
171
- throw new Error('AI Gateway Connect requires XPOD_AI_GATEWAY_CONNECT_SIGNING_SECRET or XPOD_GATEWAY_LOCATOR_SECRET');
172
- }
173
- const internalPodAccess = cradle.gatewayInternalPodAccess;
149
+ const signingSecret = config.aiGatewayConnectSigningSecret ?? randomSecret();
150
+ const internalPodAccess = cradle.hostedPodDataAccess;
174
151
  const credentialRepository = new connect_1.PodConnectedCredentialRepository({ internalPodAccess });
175
- const vault = config.secretCellCredentialVaultFactory();
176
152
  const attempts = new connect_1.InMemoryConnectAttemptStore();
177
153
  const adapters = [
178
154
  new connect_1.BrowserAssistedApiKeyConnectAdapter({
@@ -180,7 +156,6 @@ function registerCommonServices(container) {
180
156
  consoleUrl: 'https://platform.openai.com/api-keys',
181
157
  attempts,
182
158
  credentialRepository,
183
- vault,
184
159
  deployment: config.edition,
185
160
  signingSecret,
186
161
  }),
@@ -189,7 +164,6 @@ function registerCommonServices(container) {
189
164
  consoleUrl: 'https://console.anthropic.com/settings/keys',
190
165
  attempts,
191
166
  credentialRepository,
192
- vault,
193
167
  deployment: config.edition,
194
168
  signingSecret,
195
169
  }),
@@ -198,7 +172,6 @@ function registerCommonServices(container) {
198
172
  consoleUrl: 'https://bailian.console.aliyun.com/',
199
173
  attempts,
200
174
  credentialRepository,
201
- vault,
202
175
  deployment: config.edition,
203
176
  signingSecret,
204
177
  }),
@@ -207,7 +180,6 @@ function registerCommonServices(container) {
207
180
  adapters.push(new connect_1.KimiDeviceCodeConnectAdapter({
208
181
  attempts,
209
182
  credentialRepository,
210
- vault,
211
183
  deployment: config.edition,
212
184
  signingSecret,
213
185
  clientId: config.aiGatewayKimiClientId,
@@ -223,7 +195,6 @@ function registerCommonServices(container) {
223
195
  }),
224
196
  adapters,
225
197
  credentialRepository,
226
- vault,
227
198
  });
228
199
  }).singleton(),
229
200
  gatewayProviderRegistry: (0, awilix_1.asFunction)(({ config }) => {
@@ -238,19 +209,16 @@ function registerCommonServices(container) {
238
209
  }
239
210
  return registry;
240
211
  }).singleton(),
241
- gatewayCredentialStore: (0, awilix_1.asFunction)(({ gatewayInternalPodAccess }) => {
212
+ gatewayCredentialStore: (0, awilix_1.asFunction)(({ hostedPodDataAccess }) => {
242
213
  return new connect_1.PodConnectedCredentialRepository({
243
- internalPodAccess: gatewayInternalPodAccess,
214
+ internalPodAccess: hostedPodDataAccess,
244
215
  });
245
216
  }).singleton(),
246
217
  gatewayRuntimeRegistry: (0, awilix_1.asFunction)(({ gatewayProviderRegistry }) => {
247
218
  return new ProviderRuntimeRegistry_1.ProviderRuntimeRegistry({ registry: gatewayProviderRegistry });
248
219
  }).singleton(),
249
220
  gatewaySessionAffinityStore: (0, awilix_1.asFunction)(({ config }) => {
250
- const secret = config.gatewayLocatorSecret;
251
- if (!secret) {
252
- throw new Error('AI Gateway inference requires XPOD_GATEWAY_LOCATOR_SECRET for session affinity hashing');
253
- }
221
+ const secret = config.aiGatewaySessionAffinitySecret ?? randomSecret();
254
222
  if (config.redisUrl) {
255
223
  return new RedisSessionAffinityStore_1.RedisSessionAffinityStore({
256
224
  client: config.redisUrl,
@@ -261,9 +229,6 @@ function registerCommonServices(container) {
261
229
  }).singleton(),
262
230
  aiGatewayService: (0, awilix_1.asFunction)((cradle) => {
263
231
  const { config } = cradle;
264
- if (!config.secretCellCredentialVaultFactory) {
265
- throw new Error('AI Gateway inference requires XPOD_SECRET_CELL_KEY_ID and XPOD_SECRET_CELL_KEY');
266
- }
267
232
  const gatewayProviderRegistry = cradle.gatewayProviderRegistry;
268
233
  const gatewayCredentialStore = cradle.gatewayCredentialStore;
269
234
  const gatewayRuntimeRegistry = cradle.gatewayRuntimeRegistry;
@@ -279,7 +244,6 @@ function registerCommonServices(container) {
279
244
  router,
280
245
  credentials: gatewayCredentialStore,
281
246
  runtimes: gatewayRuntimeRegistry,
282
- vault: config.secretCellCredentialVaultFactory(),
283
247
  });
284
248
  }).singleton(),
285
249
  providerQuotaService: (0, awilix_1.asFunction)((cradle) => {
@@ -287,14 +251,10 @@ function registerCommonServices(container) {
287
251
  if (!config.aiGatewayConnectEnabled) {
288
252
  return undefined;
289
253
  }
290
- if (!config.secretCellCredentialVaultFactory) {
291
- throw new Error('AI Gateway quota requires XPOD_SECRET_CELL_KEY_ID and XPOD_SECRET_CELL_KEY');
292
- }
293
- const internalPodAccess = cradle.gatewayInternalPodAccess;
254
+ const internalPodAccess = cradle.hostedPodDataAccess;
294
255
  return new quota_1.ProviderQuotaService({
295
256
  repository: new quota_1.PodQuotaSnapshotRepository({ internalPodAccess }),
296
257
  credentialRepository: new connect_1.PodConnectedCredentialRepository({ internalPodAccess }),
297
- vault: config.secretCellCredentialVaultFactory(),
298
258
  adapters: [
299
259
  new quota_1.OpenAiQuotaAdapter(),
300
260
  new quota_1.AnthropicQuotaAdapter(),
@@ -304,7 +264,7 @@ function registerCommonServices(container) {
304
264
  ],
305
265
  });
306
266
  }).singleton(),
307
- authenticator: (0, awilix_1.asFunction)(({ nodeRepo, serviceTokenRepo, gatewayAccessKeyRepository, invocationTokenCodec, config }) => {
267
+ authenticator: (0, awilix_1.asFunction)(({ nodeRepo, serviceTokenRepo, invocationTokenCodec, config }) => {
308
268
  const solidAuthenticator = new SolidTokenAuthenticator_1.SolidTokenAuthenticator({
309
269
  resolveAccountId: async (webId) => webId,
310
270
  publicBaseUrl: config.solidBaseUrl,
@@ -319,16 +279,15 @@ function registerCommonServices(container) {
319
279
  const serviceTokenAuthenticator = new ServiceTokenAuthenticator_1.ServiceTokenAuthenticator({
320
280
  repository: serviceTokenRepo,
321
281
  });
322
- const gatewayApiKeyAuthenticator = new GatewayApiKeyAuthenticator_1.GatewayApiKeyAuthenticator({
323
- repository: gatewayAccessKeyRepository,
324
- invocationTokenCodec,
282
+ const invocationTokenAuthenticator = new InvocationTokenAuthenticator_1.InvocationTokenAuthenticator({
283
+ codec: invocationTokenCodec,
325
284
  deployment: config.edition,
326
- invocationTokenAudience: resolveAiConnectionAudience(config),
285
+ audience: resolveAiConnectionAudience(config),
327
286
  });
328
287
  return new MultiAuthenticator_1.MultiAuthenticator({
329
- // Order: Solid DPoP → Service Token → Node Token → Gateway Key → Client Credentials.
288
+ // Order: Solid DPoP → Service Token → Node Token → short-lived invocation → Client Credentials.
330
289
  // Agent execution is scoped by ChatKit thread/workspace and Run state, not standalone Agent JWTs.
331
- authenticators: [solidAuthenticator, serviceTokenAuthenticator, nodeTokenAuthenticator, gatewayApiKeyAuthenticator, clientCredAuthenticator],
290
+ authenticators: [solidAuthenticator, serviceTokenAuthenticator, nodeTokenAuthenticator, invocationTokenAuthenticator, clientCredAuthenticator],
332
291
  });
333
292
  }).singleton(),
334
293
  authMiddleware: (0, awilix_1.asFunction)(({ authenticator }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/api/container/common.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 共享服务注册\n *\n * cloud 和 local 模式都需要的服务\n */\n\nimport { asFunction, type AwilixContainer } from 'awilix';\nimport type { ApiContainerCradle } from './types';\n\nimport { getIdentityDatabase } from '../../identity/drizzle/db';\nimport { EdgeNodeRepository } from '../../identity/drizzle/EdgeNodeRepository';\nimport { AccountRoleRepository } from '../../identity/drizzle/AccountRoleRepository';\nimport { ServiceTokenRepository } from '../../identity/drizzle/ServiceTokenRepository';\nimport { LocalSetupServiceTokenRepository } from '../../setup/LocalSetupServiceTokenRepository';\nimport { SolidTokenAuthenticator } from '../auth/SolidTokenAuthenticator';\nimport { ClientCredentialsAuthenticator } from '../auth/ClientCredentialsAuthenticator';\nimport { NodeTokenAuthenticator } from '../auth/NodeTokenAuthenticator';\nimport { ServiceTokenAuthenticator } from '../auth/ServiceTokenAuthenticator';\nimport { MultiAuthenticator } from '../auth/MultiAuthenticator';\nimport { GatewayApiKeyAuthenticator } from '../ai-gateway/auth/GatewayApiKeyAuthenticator';\nimport { PodGatewayAccessKeyRepository } from '../ai-gateway/auth/PodGatewayAccessKeyRepository';\nimport { AesGatewayKeyLocatorCodec } from '../ai-gateway/auth/GatewayKeyLocatorCodec';\nimport { ClientCredentialsInternalPodAccessTokenProvider } from '../ai-gateway/auth/ClientCredentialsInternalPodAccessTokenProvider';\nimport { AiConnectionInvocationKeyIssuer } from '../ai-gateway/auth/AiConnectionInvocationKeyIssuer';\nimport { AesInvocationTokenCodec } from '../ai-gateway/auth/InvocationTokenCodec';\nimport { AiGatewayService } from '../ai-gateway/AiGatewayService';\nimport {\n BrowserAssistedApiKeyConnectAdapter,\n InMemoryConnectAttemptStore,\n KimiDeviceCodeConnectAdapter,\n PodConnectedCredentialRepository,\n ProviderConnectService,\n} from '../ai-gateway/connect';\nimport { createDefaultProviderRegistry as createDefaultGatewayProviderRegistry } from '../ai-gateway/providers/ProviderRegistry';\nimport { ProviderRuntimeRegistry } from '../ai-gateway/providers/ProviderRuntimeRegistry';\nimport { ModelRouter } from '../ai-gateway/routing/ModelRouter';\nimport { InMemorySessionAffinityStore } from '../ai-gateway/routing/InMemorySessionAffinityStore';\nimport { RedisSessionAffinityStore } from '../ai-gateway/routing/RedisSessionAffinityStore';\nimport {\n AnthropicQuotaAdapter,\n BailianQuotaAdapter,\n DeepSeekQuotaAdapter,\n KimiQuotaAdapter,\n OpenAiQuotaAdapter,\n PodQuotaSnapshotRepository,\n ProviderQuotaService,\n} from '../ai-gateway/quota';\nimport { AuthMiddleware } from '../middleware/AuthMiddleware';\nimport { VercelChatService } from '../service/VercelChatService';\nimport { VectorService } from '../service/VectorService';\nimport { RdfStorageStatsService } from '../service/RdfStorageStatsService';\nimport { ApiServer } from '../ApiServer';\nimport { ChatKitService, PodChatKitStore, VercelAiProvider } from '../chatkit';\nimport { PodMatrixStore } from '../matrix';\nimport { ClientReconcilerCoordinator, ServerGroupReconcilerService } from '../reconciler';\nimport { InngestRunExecutionBackend } from '../runs/InngestRunExecutionBackend';\nimport { PiAgentRuntimeDriver } from '../runs/PiAgentRuntimeDriver';\nimport { RunAuthContextRegistry } from '../runs/RunAuthContextRegistry';\nimport { InngestTaskScheduler, TaskAuthBindingService, TaskService } from '../tasks';\nimport { EmbeddingServiceImpl, ProviderRegistryImpl } from '../../ai/service';\nimport { createApiRdfEngine, createApiRdfSearchIndexingService, createApiRunContextRetriever } from './rdf';\nimport {\n getEdgeNodeCertificateCapabilityBridge,\n resolveEdgeNodeCertificateCapabilityBridgeId,\n} from '../../edge/EdgeNodeCertificateCapabilityBridge';\n\nfunction resolveCssServiceBaseUrl(): string {\n if (process.env.CSS_INTERNAL_URL) {\n return process.env.CSS_INTERNAL_URL;\n }\n\n if (process.env.CSS_BASE_URL) {\n return process.env.CSS_BASE_URL;\n }\n\n return 'http://localhost:3000/';\n}\n\nfunction resolveAiConnectionBaseUrl(config: ApiContainerCradle['config']): string {\n const origin = config.publicUrl\n ?? process.env.XPOD_PUBLIC_URL\n ?? process.env.CSS_BASE_URL\n ?? `http://${config.host === '0.0.0.0' ? '127.0.0.1' : config.host}:${config.port}`;\n return new URL('/v1', origin.endsWith('/') ? origin : `${origin}/`).toString().replace(/\\/$/u, '');\n}\n\nfunction resolveAiConnectionAudience(config: ApiContainerCradle['config']): string {\n return new URL(resolveAiConnectionBaseUrl(config)).origin;\n}\n\n/**\n * 注册共享服务到容器\n */\nexport function registerCommonServices(\n container: AwilixContainer<ApiContainerCradle>,\n): void {\n container.register({\n // 数据库\n db: asFunction(({ config }: ApiContainerCradle) => {\n return getIdentityDatabase(config.databaseUrl);\n }).singleton(),\n\n edgeNodeCertificateCapabilityBridge: asFunction(({ config }: ApiContainerCradle) => {\n const bridgeId = resolveEdgeNodeCertificateCapabilityBridgeId({\n nodeId: config.nodeId,\n baseUrl: config.solidBaseUrl ?? config.publicUrl,\n });\n return bridgeId ? getEdgeNodeCertificateCapabilityBridge(bridgeId) : undefined;\n }).singleton(),\n\n // 仓库\n nodeRepo: asFunction(({ db, config }: ApiContainerCradle) => {\n return new EdgeNodeRepository(db, {\n ensureClusterTables: config.edition === 'cloud',\n });\n }).singleton(),\n\n accountRoleRepo: asFunction(({ db }: ApiContainerCradle) => {\n return new AccountRoleRepository(db);\n }).singleton(),\n\n // 认证\n serviceTokenRepo: asFunction(({ db, config }: ApiContainerCradle) => {\n if (config.edition === 'cloud') {\n return new ServiceTokenRepository(db);\n }\n\n return new LocalSetupServiceTokenRepository({\n token: config.serviceToken,\n serviceType: 'local',\n serviceId: config.nodeId ?? 'local-1',\n scopes: ['quota:write', 'usage:read', 'account:manage', 'network:read', 'network:write'],\n });\n }).singleton(),\n\n gatewayInternalPodAccess: asFunction(({ config }: ApiContainerCradle) => {\n if (!config.gatewayInternalClientId || !config.gatewayInternalClientSecret) {\n return undefined;\n }\n return new ClientCredentialsInternalPodAccessTokenProvider({\n tokenEndpoint: config.cssTokenEndpoint,\n clientId: config.gatewayInternalClientId,\n clientSecret: config.gatewayInternalClientSecret,\n });\n }).singleton(),\n\n gatewayAccessKeyRepository: asFunction(({ config, gatewayInternalPodAccess }: ApiContainerCradle) => {\n if (!config.gatewayLocatorSecret) {\n throw new Error('XPOD_GATEWAY_LOCATOR_SECRET is required for Gateway API key locator encryption');\n }\n return new PodGatewayAccessKeyRepository({\n locatorCodec: new AesGatewayKeyLocatorCodec({\n active: {\n kid: config.gatewayLocatorKeyId ?? 'active',\n secret: config.gatewayLocatorSecret,\n },\n previous: config.gatewayPreviousLocatorSecrets,\n }),\n internalPodAccess: gatewayInternalPodAccess,\n });\n }).singleton(),\n\n invocationTokenCodec: asFunction(({ config }: ApiContainerCradle) => {\n if (!config.gatewayLocatorSecret) {\n throw new Error('XPOD_GATEWAY_LOCATOR_SECRET is required for invocation token encryption');\n }\n return new AesInvocationTokenCodec({\n active: {\n kid: config.gatewayLocatorKeyId ?? 'active',\n secret: config.gatewayLocatorSecret,\n },\n previous: config.gatewayPreviousLocatorSecrets,\n });\n }).singleton(),\n\n aiConnectionInvocationKeyIssuer: asFunction(({ config, invocationTokenCodec }: ApiContainerCradle) => {\n return new AiConnectionInvocationKeyIssuer({\n codec: invocationTokenCodec,\n deployment: config.edition,\n baseUrl: resolveAiConnectionBaseUrl(config),\n audience: resolveAiConnectionAudience(config),\n });\n }).singleton(),\n\n providerConnectService: asFunction((cradle: ApiContainerCradle) => {\n const { config } = cradle;\n if (!config.aiGatewayConnectEnabled) {\n return new ProviderConnectService({\n registry: createDefaultGatewayProviderRegistry({\n connect: {\n openai: { configured: false, notes: ['AI Gateway provider Connect is disabled in this Xpod deployment.'] },\n anthropic: { configured: false, notes: ['AI Gateway provider Connect is disabled in this Xpod deployment.'] },\n kimi: { configured: false, notes: ['AI Gateway provider Connect is disabled in this Xpod deployment.'] },\n bailian: { configured: false, notes: ['AI Gateway provider Connect is disabled in this Xpod deployment.'] },\n deepseek: { configured: false },\n },\n }),\n adapters: [],\n });\n }\n if (!config.secretCellCredentialVaultFactory) {\n throw new Error('AI Gateway Connect requires XPOD_SECRET_CELL_KEY_ID and XPOD_SECRET_CELL_KEY');\n }\n const signingSecret = config.aiGatewayConnectSigningSecret ?? config.gatewayLocatorSecret;\n if (!signingSecret) {\n throw new Error('AI Gateway Connect requires XPOD_AI_GATEWAY_CONNECT_SIGNING_SECRET or XPOD_GATEWAY_LOCATOR_SECRET');\n }\n const internalPodAccess = cradle.gatewayInternalPodAccess;\n const credentialRepository = new PodConnectedCredentialRepository({ internalPodAccess });\n const vault = config.secretCellCredentialVaultFactory();\n const attempts = new InMemoryConnectAttemptStore();\n const adapters = [\n new BrowserAssistedApiKeyConnectAdapter({\n provider: 'openai',\n consoleUrl: 'https://platform.openai.com/api-keys',\n attempts,\n credentialRepository,\n vault,\n deployment: config.edition,\n signingSecret,\n }),\n new BrowserAssistedApiKeyConnectAdapter({\n provider: 'anthropic',\n consoleUrl: 'https://console.anthropic.com/settings/keys',\n attempts,\n credentialRepository,\n vault,\n deployment: config.edition,\n signingSecret,\n }),\n new BrowserAssistedApiKeyConnectAdapter({\n provider: 'bailian',\n consoleUrl: 'https://bailian.console.aliyun.com/',\n attempts,\n credentialRepository,\n vault,\n deployment: config.edition,\n signingSecret,\n }),\n ];\n if (config.aiGatewayKimiClientId) {\n adapters.push(new KimiDeviceCodeConnectAdapter({\n attempts,\n credentialRepository,\n vault,\n deployment: config.edition,\n signingSecret,\n clientId: config.aiGatewayKimiClientId,\n }));\n }\n return new ProviderConnectService({\n registry: createDefaultGatewayProviderRegistry({\n connect: {\n kimi: config.aiGatewayKimiClientId\n ? { configured: true }\n : { configured: false, notes: ['not_configured: XPOD_AI_GATEWAY_KIMI_CLIENT_ID is not configured.'] },\n },\n }),\n adapters,\n credentialRepository,\n vault,\n });\n }).singleton(),\n\n gatewayProviderRegistry: asFunction(({ config }: ApiContainerCradle) => {\n const registry = createDefaultGatewayProviderRegistry();\n const openAiBaseUrl = config.aiGatewayProviderBaseUrls?.openai;\n if (openAiBaseUrl) {\n registry.register({\n ...registry.requireProvider('openai'),\n defaultBaseUrl: openAiBaseUrl,\n safeBaseUrls: [openAiBaseUrl],\n });\n }\n return registry;\n }).singleton(),\n\n gatewayCredentialStore: asFunction(({ gatewayInternalPodAccess }: ApiContainerCradle) => {\n return new PodConnectedCredentialRepository({\n internalPodAccess: gatewayInternalPodAccess,\n });\n }).singleton(),\n\n gatewayRuntimeRegistry: asFunction(({ gatewayProviderRegistry }: ApiContainerCradle) => {\n return new ProviderRuntimeRegistry({ registry: gatewayProviderRegistry });\n }).singleton(),\n\n gatewaySessionAffinityStore: asFunction(({ config }: ApiContainerCradle) => {\n const secret = config.gatewayLocatorSecret;\n if (!secret) {\n throw new Error('AI Gateway inference requires XPOD_GATEWAY_LOCATOR_SECRET for session affinity hashing');\n }\n if (config.redisUrl) {\n return new RedisSessionAffinityStore({\n client: config.redisUrl,\n secret,\n });\n }\n return new InMemorySessionAffinityStore({ secret });\n }).singleton(),\n\n aiGatewayService: asFunction((cradle: ApiContainerCradle) => {\n const { config } = cradle;\n if (!config.secretCellCredentialVaultFactory) {\n throw new Error('AI Gateway inference requires XPOD_SECRET_CELL_KEY_ID and XPOD_SECRET_CELL_KEY');\n }\n const gatewayProviderRegistry = cradle.gatewayProviderRegistry;\n const gatewayCredentialStore = cradle.gatewayCredentialStore;\n const gatewayRuntimeRegistry = cradle.gatewayRuntimeRegistry;\n const gatewaySessionAffinityStore = cradle.gatewaySessionAffinityStore;\n const router = new ModelRouter({\n registry: gatewayProviderRegistry,\n affinityStore: gatewaySessionAffinityStore,\n credentials: gatewayCredentialStore.listCredentials.bind(gatewayCredentialStore),\n });\n return new AiGatewayService({\n deployment: config.edition,\n registry: gatewayProviderRegistry,\n router,\n credentials: gatewayCredentialStore,\n runtimes: gatewayRuntimeRegistry,\n vault: config.secretCellCredentialVaultFactory(),\n });\n }).singleton(),\n\n providerQuotaService: asFunction((cradle: ApiContainerCradle) => {\n const { config } = cradle;\n if (!config.aiGatewayConnectEnabled) {\n return undefined;\n }\n if (!config.secretCellCredentialVaultFactory) {\n throw new Error('AI Gateway quota requires XPOD_SECRET_CELL_KEY_ID and XPOD_SECRET_CELL_KEY');\n }\n const internalPodAccess = cradle.gatewayInternalPodAccess;\n return new ProviderQuotaService({\n repository: new PodQuotaSnapshotRepository({ internalPodAccess }),\n credentialRepository: new PodConnectedCredentialRepository({ internalPodAccess }),\n vault: config.secretCellCredentialVaultFactory(),\n adapters: [\n new OpenAiQuotaAdapter(),\n new AnthropicQuotaAdapter(),\n new KimiQuotaAdapter(),\n new BailianQuotaAdapter(),\n new DeepSeekQuotaAdapter(),\n ],\n });\n }).singleton(),\n\n authenticator: asFunction(({ nodeRepo, serviceTokenRepo, gatewayAccessKeyRepository, invocationTokenCodec, config }: ApiContainerCradle) => {\n const solidAuthenticator = new SolidTokenAuthenticator({\n resolveAccountId: async (webId) => webId,\n publicBaseUrl: config.solidBaseUrl,\n internalBaseUrl: config.cssTokenEndpoint,\n });\n\n const clientCredAuthenticator = new ClientCredentialsAuthenticator({\n tokenEndpoint: config.cssTokenEndpoint,\n });\n\n const nodeTokenAuthenticator = new NodeTokenAuthenticator({\n repository: nodeRepo,\n });\n\n const serviceTokenAuthenticator = new ServiceTokenAuthenticator({\n repository: serviceTokenRepo,\n });\n\n const gatewayApiKeyAuthenticator = new GatewayApiKeyAuthenticator({\n repository: gatewayAccessKeyRepository,\n invocationTokenCodec,\n deployment: config.edition,\n invocationTokenAudience: resolveAiConnectionAudience(config),\n });\n\n return new MultiAuthenticator({\n // Order: Solid DPoP → Service Token → Node Token → Gateway Key → Client Credentials.\n // Agent execution is scoped by ChatKit thread/workspace and Run state, not standalone Agent JWTs.\n authenticators: [solidAuthenticator, serviceTokenAuthenticator, nodeTokenAuthenticator, gatewayApiKeyAuthenticator, clientCredAuthenticator],\n });\n }).singleton(),\n\n authMiddleware: asFunction(({ authenticator }: ApiContainerCradle) => {\n return new AuthMiddleware({ authenticator });\n }).singleton(),\n\n // Reconciler / Wake 运行态协调\n serverGroupReconcilerService: asFunction(({ config }: ApiContainerCradle) => {\n return new ServerGroupReconcilerService({\n redisUrl: config.redisUrl,\n });\n }).singleton(),\n\n // ChatKit 存储与服务\n chatKitStore: asFunction(({ config, serverGroupReconcilerService }: ApiContainerCradle) => {\n return new PodChatKitStore({\n tokenEndpoint: config.cssTokenEndpoint,\n serverGroupReconcilerService,\n });\n }).singleton(),\n\n clientReconcilerCoordinator: asFunction(({ config }: ApiContainerCradle) => {\n return new ClientReconcilerCoordinator({\n redisUrl: config.redisUrl,\n });\n }).singleton(),\n\n matrixStore: asFunction(({ config, serverGroupReconcilerService }: ApiContainerCradle) => {\n return new PodMatrixStore({\n serverGroupReconcilerService,\n serverName: (() => {\n try {\n return new URL(process.env.CSS_BASE_URL ?? '').host || undefined;\n } catch {\n return undefined;\n }\n })(),\n });\n }).singleton(),\n\n chatKitAiProvider: asFunction(({ chatKitStore, aiGatewayService }: ApiContainerCradle) => {\n return new VercelAiProvider({ store: chatKitStore, aiGatewayService });\n }).singleton(),\n\n runAuthContextRegistry: asFunction(() => {\n return new RunAuthContextRegistry();\n }).singleton(),\n\n taskAuthBindingService: asFunction(({ chatKitStore }: ApiContainerCradle) => {\n return new TaskAuthBindingService({\n repository: chatKitStore,\n });\n }).singleton(),\n\n rdfEngine: asFunction(({ config }: ApiContainerCradle) => {\n return createApiRdfEngine(config);\n }).singleton(),\n\n runContextRetriever: asFunction(({ rdfEngine, chatKitStore, embeddingService }: ApiContainerCradle) => {\n return createApiRunContextRetriever(rdfEngine, { chatKitStore, embeddingService });\n }).singleton(),\n\n rdfSearchIndexingService: asFunction(({ rdfEngine, chatKitStore, embeddingService }: ApiContainerCradle) => {\n return createApiRdfSearchIndexingService(rdfEngine, { chatKitStore, embeddingService });\n }).singleton(),\n\n rdfStorageStatsService: asFunction(({ config, rdfEngine }: ApiContainerCradle) => {\n return new RdfStorageStatsService({\n edition: config.edition,\n sparqlEndpoint: config.sparqlEndpoint,\n rdfEngine,\n });\n }).singleton(),\n\n runExecutionBackend: asFunction(({ config, inngestRuntimeConfig, chatKitStore, taskAuthBindingService, runAuthContextRegistry, runContextRetriever, rdfSearchIndexingService, aiConnectionInvocationKeyIssuer }: ApiContainerCradle) => {\n return new InngestRunExecutionBackend({\n baseUrl: inngestRuntimeConfig?.baseUrl,\n eventKey: inngestRuntimeConfig?.eventKey,\n signingKey: inngestRuntimeConfig?.signingKey,\n isDev: inngestRuntimeConfig?.enabled ? !inngestRuntimeConfig.durableDelivery : true,\n durableDelivery: inngestRuntimeConfig?.durableDelivery ?? false,\n store: chatKitStore,\n contextRetriever: runContextRetriever,\n aiConnectionInvocationKeyIssuer,\n contextRecorder: (context) => runAuthContextRegistry.remember(context),\n contextResolver: async (data) => {\n const fallback = runAuthContextRegistry.resolve({ webId: data.webId });\n if (data.authBindingId && fallback) {\n return await taskAuthBindingService.resolveRunContext(data.authBindingId, fallback) ?? fallback;\n }\n return fallback;\n },\n runtimeDriver: new PiAgentRuntimeDriver({\n agentLoopIsolation: config.edition === 'cloud' ? 'sandboxed-process' : 'in-process',\n requireSandbox: config.edition === 'cloud',\n rdfSearchIndexingService,\n }),\n });\n }).singleton(),\n\n chatKitService: asFunction(({ chatKitStore, chatKitAiProvider, runExecutionBackend, runContextRetriever, aiConnectionInvocationKeyIssuer }: ApiContainerCradle) => {\n return new ChatKitService({\n store: chatKitStore,\n aiProvider: chatKitAiProvider,\n enableAgentRuntime: true,\n runExecutionBackend,\n contextRetriever: runContextRetriever,\n aiConnectionInvocationKeyIssuer,\n requireAiConnectionInvocationKeyIssuer: true,\n });\n }).singleton(),\n\n taskService: asFunction(({ chatKitStore, runExecutionBackend, runContextRetriever, aiConnectionInvocationKeyIssuer }: ApiContainerCradle) => {\n return new TaskService({\n store: chatKitStore,\n executionBackend: runExecutionBackend,\n contextRetriever: runContextRetriever,\n aiConnectionInvocationKeyIssuer,\n requireAiConnectionInvocationKeyIssuer: true,\n });\n }).singleton(),\n\n inngestTaskScheduler: asFunction(({ runExecutionBackend, taskService, taskAuthBindingService, inngestRuntimeConfig, runAuthContextRegistry }: ApiContainerCradle) => {\n return new InngestTaskScheduler({\n backend: runExecutionBackend,\n taskService,\n getContexts: () => runAuthContextRegistry.list(),\n recordContext: (context) => runAuthContextRegistry.remember(context),\n resolveContext: async (data) => {\n const fallback = runAuthContextRegistry.resolve({ webId: data.webId });\n if (data.authBindingId && fallback) {\n return await taskAuthBindingService.resolveRunContext(data.authBindingId, fallback) ?? fallback;\n }\n return fallback;\n },\n durableDelivery: inngestRuntimeConfig?.durableDelivery ?? false,\n executeInline: true,\n });\n }).singleton(),\n\n providerRegistry: asFunction(() => {\n return new ProviderRegistryImpl();\n }).singleton(),\n\n embeddingService: asFunction(({ providerRegistry }: ApiContainerCradle) => {\n return new EmbeddingServiceImpl(providerRegistry);\n }).singleton(),\n\n vectorService: asFunction(({ chatKitStore, embeddingService }: ApiContainerCradle) => {\n return new VectorService({\n cssBaseUrl: resolveCssServiceBaseUrl(),\n store: chatKitStore,\n embeddingService,\n });\n }).singleton(),\n\n // 业务服务\n chatService: asFunction(({ chatKitStore, aiGatewayService }: ApiContainerCradle) => {\n return new VercelChatService(chatKitStore, { aiGatewayService });\n }).singleton(),\n\n\n // API Server\n apiServer: asFunction(({ config, authMiddleware }: ApiContainerCradle) => {\n return new ApiServer({\n port: config.port,\n host: config.host,\n socketPath: config.socketPath,\n runtimeHost: config.runtimeHost,\n authMiddleware,\n corsOrigins: config.corsOrigins,\n });\n }).singleton(),\n });\n}\n"]}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/api/container/common.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 共享服务注册\n *\n * cloud 和 local 模式都需要的服务\n */\n\nimport { randomBytes } from 'node:crypto';\nimport { asFunction, type AwilixContainer } from 'awilix';\nimport type { ApiContainerCradle } from './types';\n\nimport { getIdentityDatabase } from '../../identity/drizzle/db';\nimport { EdgeNodeRepository } from '../../identity/drizzle/EdgeNodeRepository';\nimport { AccountRoleRepository } from '../../identity/drizzle/AccountRoleRepository';\nimport { ServiceTokenRepository } from '../../identity/drizzle/ServiceTokenRepository';\nimport { LocalSetupServiceTokenRepository } from '../../setup/LocalSetupServiceTokenRepository';\nimport { SolidTokenAuthenticator } from '../auth/SolidTokenAuthenticator';\nimport { ClientCredentialsAuthenticator } from '../auth/ClientCredentialsAuthenticator';\nimport { NodeTokenAuthenticator } from '../auth/NodeTokenAuthenticator';\nimport { ServiceTokenAuthenticator } from '../auth/ServiceTokenAuthenticator';\nimport { MultiAuthenticator } from '../auth/MultiAuthenticator';\nimport { InvocationTokenAuthenticator } from '../ai-gateway/auth/InvocationTokenAuthenticator';\nimport { AiConnectionInvocationKeyIssuer } from '../ai-gateway/auth/AiConnectionInvocationKeyIssuer';\nimport { AesInvocationTokenCodec } from '../ai-gateway/auth/InvocationTokenCodec';\nimport { HostedPodDataAccess } from '../ai-gateway/pod/HostedPodDataAccess';\nimport { AiGatewayService } from '../ai-gateway/AiGatewayService';\nimport {\n BrowserAssistedApiKeyConnectAdapter,\n InMemoryConnectAttemptStore,\n KimiDeviceCodeConnectAdapter,\n PodConnectedCredentialRepository,\n ProviderConnectService,\n} from '../ai-gateway/connect';\nimport { createDefaultProviderRegistry as createDefaultGatewayProviderRegistry } from '../ai-gateway/providers/ProviderRegistry';\nimport { ProviderRuntimeRegistry } from '../ai-gateway/providers/ProviderRuntimeRegistry';\nimport { ModelRouter } from '../ai-gateway/routing/ModelRouter';\nimport { InMemorySessionAffinityStore } from '../ai-gateway/routing/InMemorySessionAffinityStore';\nimport { RedisSessionAffinityStore } from '../ai-gateway/routing/RedisSessionAffinityStore';\nimport {\n AnthropicQuotaAdapter,\n BailianQuotaAdapter,\n DeepSeekQuotaAdapter,\n KimiQuotaAdapter,\n OpenAiQuotaAdapter,\n PodQuotaSnapshotRepository,\n ProviderQuotaService,\n} from '../ai-gateway/quota';\nimport { AuthMiddleware } from '../middleware/AuthMiddleware';\nimport { VercelChatService } from '../service/VercelChatService';\nimport { VectorService } from '../service/VectorService';\nimport { RdfStorageStatsService } from '../service/RdfStorageStatsService';\nimport { ApiServer } from '../ApiServer';\nimport { ChatKitService, PodChatKitStore, VercelAiProvider } from '../chatkit';\nimport { PodMatrixStore } from '../matrix';\nimport { ClientReconcilerCoordinator, ServerGroupReconcilerService } from '../reconciler';\nimport { InngestRunExecutionBackend } from '../runs/InngestRunExecutionBackend';\nimport { PiAgentRuntimeDriver } from '../runs/PiAgentRuntimeDriver';\nimport { RunAuthContextRegistry } from '../runs/RunAuthContextRegistry';\nimport { InngestTaskScheduler, TaskAuthBindingService, TaskService } from '../tasks';\nimport { EmbeddingServiceImpl, ProviderRegistryImpl } from '../../ai/service';\nimport { createApiRdfEngine, createApiRdfSearchIndexingService, createApiRunContextRetriever } from './rdf';\nimport {\n getEdgeNodeCertificateCapabilityBridge,\n resolveEdgeNodeCertificateCapabilityBridgeId,\n} from '../../edge/EdgeNodeCertificateCapabilityBridge';\n\nfunction resolveCssServiceBaseUrl(): string {\n if (process.env.CSS_INTERNAL_URL) {\n return process.env.CSS_INTERNAL_URL;\n }\n\n if (process.env.CSS_BASE_URL) {\n return process.env.CSS_BASE_URL;\n }\n\n return 'http://localhost:3000/';\n}\n\nfunction resolveHostedPodCssBaseUrl(): string {\n return process.env.CSS_INTERNAL_URL ?? 'http://localhost:3000/';\n}\n\nfunction resolveAiConnectionBaseUrl(config: ApiContainerCradle['config']): string {\n const origin = config.publicUrl\n ?? process.env.XPOD_PUBLIC_URL\n ?? process.env.CSS_BASE_URL\n ?? `http://${config.host === '0.0.0.0' ? '127.0.0.1' : config.host}:${config.port}`;\n return new URL('/v1', origin.endsWith('/') ? origin : `${origin}/`).toString().replace(/\\/$/u, '');\n}\n\nfunction resolveAiConnectionAudience(config: ApiContainerCradle['config']): string {\n return new URL(resolveAiConnectionBaseUrl(config)).origin;\n}\n\nfunction randomSecret(): string {\n return randomBytes(32).toString('base64url');\n}\n\n/**\n * 注册共享服务到容器\n */\nexport function registerCommonServices(\n container: AwilixContainer<ApiContainerCradle>,\n): void {\n container.register({\n // 数据库\n db: asFunction(({ config }: ApiContainerCradle) => {\n return getIdentityDatabase(config.databaseUrl);\n }).singleton(),\n\n edgeNodeCertificateCapabilityBridge: asFunction(({ config }: ApiContainerCradle) => {\n const bridgeId = resolveEdgeNodeCertificateCapabilityBridgeId({\n nodeId: config.nodeId,\n baseUrl: config.solidBaseUrl ?? config.publicUrl,\n });\n return bridgeId ? getEdgeNodeCertificateCapabilityBridge(bridgeId) : undefined;\n }).singleton(),\n\n // 仓库\n nodeRepo: asFunction(({ db, config }: ApiContainerCradle) => {\n return new EdgeNodeRepository(db, {\n ensureClusterTables: config.edition === 'cloud',\n });\n }).singleton(),\n\n accountRoleRepo: asFunction(({ db }: ApiContainerCradle) => {\n return new AccountRoleRepository(db);\n }).singleton(),\n\n // 认证\n serviceTokenRepo: asFunction(({ db, config }: ApiContainerCradle) => {\n if (config.edition === 'cloud') {\n return new ServiceTokenRepository(db);\n }\n\n return new LocalSetupServiceTokenRepository({\n token: config.serviceToken,\n serviceType: 'local',\n serviceId: config.nodeId ?? 'local-1',\n scopes: ['quota:write', 'usage:read', 'account:manage', 'network:read', 'network:write'],\n });\n }).singleton(),\n\n hostedPodDataAccess: asFunction(({ config }: ApiContainerCradle) => {\n return new HostedPodDataAccess({\n cssBaseUrl: resolveHostedPodCssBaseUrl(),\n gatewayAdminProxyAuthSecret: config.gatewayAdminProxyAuthSecret,\n });\n }).singleton(),\n\n invocationTokenCodec: asFunction(({ config }: ApiContainerCradle) => {\n return new AesInvocationTokenCodec({\n active: {\n kid: config.aiConnectionInvocationKeyId ?? 'ephemeral',\n secret: config.aiConnectionInvocationSecret ?? randomSecret(),\n },\n previous: config.aiConnectionPreviousInvocationSecrets,\n });\n }).singleton(),\n\n aiConnectionInvocationKeyIssuer: asFunction(({ config, invocationTokenCodec }: ApiContainerCradle) => {\n return new AiConnectionInvocationKeyIssuer({\n codec: invocationTokenCodec,\n deployment: config.edition,\n baseUrl: resolveAiConnectionBaseUrl(config),\n audience: resolveAiConnectionAudience(config),\n });\n }).singleton(),\n\n providerConnectService: asFunction((cradle: ApiContainerCradle) => {\n const { config } = cradle;\n if (!config.aiGatewayConnectEnabled) {\n return new ProviderConnectService({\n registry: createDefaultGatewayProviderRegistry({\n connect: {\n openai: { configured: false, notes: ['AI Gateway provider Connect is disabled in this Xpod deployment.'] },\n anthropic: { configured: false, notes: ['AI Gateway provider Connect is disabled in this Xpod deployment.'] },\n kimi: { configured: false, notes: ['AI Gateway provider Connect is disabled in this Xpod deployment.'] },\n bailian: { configured: false, notes: ['AI Gateway provider Connect is disabled in this Xpod deployment.'] },\n deepseek: { configured: false },\n },\n }),\n adapters: [],\n });\n }\n const signingSecret = config.aiGatewayConnectSigningSecret ?? randomSecret();\n const internalPodAccess = cradle.hostedPodDataAccess;\n const credentialRepository = new PodConnectedCredentialRepository({ internalPodAccess });\n const attempts = new InMemoryConnectAttemptStore();\n const adapters = [\n new BrowserAssistedApiKeyConnectAdapter({\n provider: 'openai',\n consoleUrl: 'https://platform.openai.com/api-keys',\n attempts,\n credentialRepository,\n deployment: config.edition,\n signingSecret,\n }),\n new BrowserAssistedApiKeyConnectAdapter({\n provider: 'anthropic',\n consoleUrl: 'https://console.anthropic.com/settings/keys',\n attempts,\n credentialRepository,\n deployment: config.edition,\n signingSecret,\n }),\n new BrowserAssistedApiKeyConnectAdapter({\n provider: 'bailian',\n consoleUrl: 'https://bailian.console.aliyun.com/',\n attempts,\n credentialRepository,\n deployment: config.edition,\n signingSecret,\n }),\n ];\n if (config.aiGatewayKimiClientId) {\n adapters.push(new KimiDeviceCodeConnectAdapter({\n attempts,\n credentialRepository,\n deployment: config.edition,\n signingSecret,\n clientId: config.aiGatewayKimiClientId,\n }));\n }\n return new ProviderConnectService({\n registry: createDefaultGatewayProviderRegistry({\n connect: {\n kimi: config.aiGatewayKimiClientId\n ? { configured: true }\n : { configured: false, notes: ['not_configured: XPOD_AI_GATEWAY_KIMI_CLIENT_ID is not configured.'] },\n },\n }),\n adapters,\n credentialRepository,\n });\n }).singleton(),\n\n gatewayProviderRegistry: asFunction(({ config }: ApiContainerCradle) => {\n const registry = createDefaultGatewayProviderRegistry();\n const openAiBaseUrl = config.aiGatewayProviderBaseUrls?.openai;\n if (openAiBaseUrl) {\n registry.register({\n ...registry.requireProvider('openai'),\n defaultBaseUrl: openAiBaseUrl,\n safeBaseUrls: [openAiBaseUrl],\n });\n }\n return registry;\n }).singleton(),\n\n gatewayCredentialStore: asFunction(({ hostedPodDataAccess }: ApiContainerCradle) => {\n return new PodConnectedCredentialRepository({\n internalPodAccess: hostedPodDataAccess,\n });\n }).singleton(),\n\n gatewayRuntimeRegistry: asFunction(({ gatewayProviderRegistry }: ApiContainerCradle) => {\n return new ProviderRuntimeRegistry({ registry: gatewayProviderRegistry });\n }).singleton(),\n\n gatewaySessionAffinityStore: asFunction(({ config }: ApiContainerCradle) => {\n const secret = config.aiGatewaySessionAffinitySecret ?? randomSecret();\n if (config.redisUrl) {\n return new RedisSessionAffinityStore({\n client: config.redisUrl,\n secret,\n });\n }\n return new InMemorySessionAffinityStore({ secret });\n }).singleton(),\n\n aiGatewayService: asFunction((cradle: ApiContainerCradle) => {\n const { config } = cradle;\n const gatewayProviderRegistry = cradle.gatewayProviderRegistry;\n const gatewayCredentialStore = cradle.gatewayCredentialStore;\n const gatewayRuntimeRegistry = cradle.gatewayRuntimeRegistry;\n const gatewaySessionAffinityStore = cradle.gatewaySessionAffinityStore;\n const router = new ModelRouter({\n registry: gatewayProviderRegistry,\n affinityStore: gatewaySessionAffinityStore,\n credentials: gatewayCredentialStore.listCredentials.bind(gatewayCredentialStore),\n });\n return new AiGatewayService({\n deployment: config.edition,\n registry: gatewayProviderRegistry,\n router,\n credentials: gatewayCredentialStore,\n runtimes: gatewayRuntimeRegistry,\n });\n }).singleton(),\n\n providerQuotaService: asFunction((cradle: ApiContainerCradle) => {\n const { config } = cradle;\n if (!config.aiGatewayConnectEnabled) {\n return undefined;\n }\n const internalPodAccess = cradle.hostedPodDataAccess;\n return new ProviderQuotaService({\n repository: new PodQuotaSnapshotRepository({ internalPodAccess }),\n credentialRepository: new PodConnectedCredentialRepository({ internalPodAccess }),\n adapters: [\n new OpenAiQuotaAdapter(),\n new AnthropicQuotaAdapter(),\n new KimiQuotaAdapter(),\n new BailianQuotaAdapter(),\n new DeepSeekQuotaAdapter(),\n ],\n });\n }).singleton(),\n\n authenticator: asFunction(({ nodeRepo, serviceTokenRepo, invocationTokenCodec, config }: ApiContainerCradle) => {\n const solidAuthenticator = new SolidTokenAuthenticator({\n resolveAccountId: async (webId) => webId,\n publicBaseUrl: config.solidBaseUrl,\n internalBaseUrl: config.cssTokenEndpoint,\n });\n\n const clientCredAuthenticator = new ClientCredentialsAuthenticator({\n tokenEndpoint: config.cssTokenEndpoint,\n });\n\n const nodeTokenAuthenticator = new NodeTokenAuthenticator({\n repository: nodeRepo,\n });\n\n const serviceTokenAuthenticator = new ServiceTokenAuthenticator({\n repository: serviceTokenRepo,\n });\n\n const invocationTokenAuthenticator = new InvocationTokenAuthenticator({\n codec: invocationTokenCodec,\n deployment: config.edition,\n audience: resolveAiConnectionAudience(config),\n });\n\n return new MultiAuthenticator({\n // Order: Solid DPoP → Service Token → Node Token → short-lived invocation → Client Credentials.\n // Agent execution is scoped by ChatKit thread/workspace and Run state, not standalone Agent JWTs.\n authenticators: [solidAuthenticator, serviceTokenAuthenticator, nodeTokenAuthenticator, invocationTokenAuthenticator, clientCredAuthenticator],\n });\n }).singleton(),\n\n authMiddleware: asFunction(({ authenticator }: ApiContainerCradle) => {\n return new AuthMiddleware({ authenticator });\n }).singleton(),\n\n // Reconciler / Wake 运行态协调\n serverGroupReconcilerService: asFunction(({ config }: ApiContainerCradle) => {\n return new ServerGroupReconcilerService({\n redisUrl: config.redisUrl,\n });\n }).singleton(),\n\n // ChatKit 存储与服务\n chatKitStore: asFunction(({ config, serverGroupReconcilerService }: ApiContainerCradle) => {\n return new PodChatKitStore({\n tokenEndpoint: config.cssTokenEndpoint,\n serverGroupReconcilerService,\n });\n }).singleton(),\n\n clientReconcilerCoordinator: asFunction(({ config }: ApiContainerCradle) => {\n return new ClientReconcilerCoordinator({\n redisUrl: config.redisUrl,\n });\n }).singleton(),\n\n matrixStore: asFunction(({ config, serverGroupReconcilerService }: ApiContainerCradle) => {\n return new PodMatrixStore({\n serverGroupReconcilerService,\n serverName: (() => {\n try {\n return new URL(process.env.CSS_BASE_URL ?? '').host || undefined;\n } catch {\n return undefined;\n }\n })(),\n });\n }).singleton(),\n\n chatKitAiProvider: asFunction(({ chatKitStore, aiGatewayService }: ApiContainerCradle) => {\n return new VercelAiProvider({ store: chatKitStore, aiGatewayService });\n }).singleton(),\n\n runAuthContextRegistry: asFunction(() => {\n return new RunAuthContextRegistry();\n }).singleton(),\n\n taskAuthBindingService: asFunction(({ chatKitStore }: ApiContainerCradle) => {\n return new TaskAuthBindingService({\n repository: chatKitStore,\n });\n }).singleton(),\n\n rdfEngine: asFunction(({ config }: ApiContainerCradle) => {\n return createApiRdfEngine(config);\n }).singleton(),\n\n runContextRetriever: asFunction(({ rdfEngine, chatKitStore, embeddingService }: ApiContainerCradle) => {\n return createApiRunContextRetriever(rdfEngine, { chatKitStore, embeddingService });\n }).singleton(),\n\n rdfSearchIndexingService: asFunction(({ rdfEngine, chatKitStore, embeddingService }: ApiContainerCradle) => {\n return createApiRdfSearchIndexingService(rdfEngine, { chatKitStore, embeddingService });\n }).singleton(),\n\n rdfStorageStatsService: asFunction(({ config, rdfEngine }: ApiContainerCradle) => {\n return new RdfStorageStatsService({\n edition: config.edition,\n sparqlEndpoint: config.sparqlEndpoint,\n rdfEngine,\n });\n }).singleton(),\n\n runExecutionBackend: asFunction(({ config, inngestRuntimeConfig, chatKitStore, taskAuthBindingService, runAuthContextRegistry, runContextRetriever, rdfSearchIndexingService, aiConnectionInvocationKeyIssuer }: ApiContainerCradle) => {\n return new InngestRunExecutionBackend({\n baseUrl: inngestRuntimeConfig?.baseUrl,\n eventKey: inngestRuntimeConfig?.eventKey,\n signingKey: inngestRuntimeConfig?.signingKey,\n isDev: inngestRuntimeConfig?.enabled ? !inngestRuntimeConfig.durableDelivery : true,\n durableDelivery: inngestRuntimeConfig?.durableDelivery ?? false,\n store: chatKitStore,\n contextRetriever: runContextRetriever,\n aiConnectionInvocationKeyIssuer,\n contextRecorder: (context) => runAuthContextRegistry.remember(context),\n contextResolver: async (data) => {\n const fallback = runAuthContextRegistry.resolve({ webId: data.webId });\n if (data.authBindingId && fallback) {\n return await taskAuthBindingService.resolveRunContext(data.authBindingId, fallback) ?? fallback;\n }\n return fallback;\n },\n runtimeDriver: new PiAgentRuntimeDriver({\n agentLoopIsolation: config.edition === 'cloud' ? 'sandboxed-process' : 'in-process',\n requireSandbox: config.edition === 'cloud',\n rdfSearchIndexingService,\n }),\n });\n }).singleton(),\n\n chatKitService: asFunction(({ chatKitStore, chatKitAiProvider, runExecutionBackend, runContextRetriever, aiConnectionInvocationKeyIssuer }: ApiContainerCradle) => {\n return new ChatKitService({\n store: chatKitStore,\n aiProvider: chatKitAiProvider,\n enableAgentRuntime: true,\n runExecutionBackend,\n contextRetriever: runContextRetriever,\n aiConnectionInvocationKeyIssuer,\n requireAiConnectionInvocationKeyIssuer: true,\n });\n }).singleton(),\n\n taskService: asFunction(({ chatKitStore, runExecutionBackend, runContextRetriever, aiConnectionInvocationKeyIssuer }: ApiContainerCradle) => {\n return new TaskService({\n store: chatKitStore,\n executionBackend: runExecutionBackend,\n contextRetriever: runContextRetriever,\n aiConnectionInvocationKeyIssuer,\n requireAiConnectionInvocationKeyIssuer: true,\n });\n }).singleton(),\n\n inngestTaskScheduler: asFunction(({ runExecutionBackend, taskService, taskAuthBindingService, inngestRuntimeConfig, runAuthContextRegistry }: ApiContainerCradle) => {\n return new InngestTaskScheduler({\n backend: runExecutionBackend,\n taskService,\n getContexts: () => runAuthContextRegistry.list(),\n recordContext: (context) => runAuthContextRegistry.remember(context),\n resolveContext: async (data) => {\n const fallback = runAuthContextRegistry.resolve({ webId: data.webId });\n if (data.authBindingId && fallback) {\n return await taskAuthBindingService.resolveRunContext(data.authBindingId, fallback) ?? fallback;\n }\n return fallback;\n },\n durableDelivery: inngestRuntimeConfig?.durableDelivery ?? false,\n executeInline: true,\n });\n }).singleton(),\n\n providerRegistry: asFunction(() => {\n return new ProviderRegistryImpl();\n }).singleton(),\n\n embeddingService: asFunction(({ providerRegistry }: ApiContainerCradle) => {\n return new EmbeddingServiceImpl(providerRegistry);\n }).singleton(),\n\n vectorService: asFunction(({ chatKitStore, embeddingService }: ApiContainerCradle) => {\n return new VectorService({\n cssBaseUrl: resolveCssServiceBaseUrl(),\n store: chatKitStore,\n embeddingService,\n });\n }).singleton(),\n\n // 业务服务\n chatService: asFunction(({ chatKitStore, aiGatewayService }: ApiContainerCradle) => {\n return new VercelChatService(chatKitStore, { aiGatewayService });\n }).singleton(),\n\n\n // API Server\n apiServer: asFunction(({ config, authMiddleware }: ApiContainerCradle) => {\n return new ApiServer({\n port: config.port,\n host: config.host,\n socketPath: config.socketPath,\n runtimeHost: config.runtimeHost,\n authMiddleware,\n corsOrigins: config.corsOrigins,\n });\n }).singleton(),\n });\n}\n"]}
@@ -136,11 +136,10 @@ function loadConfigFromEnv() {
136
136
  corsOrigins: process.env.CORS_ORIGINS?.split(',').map(s => s.trim()) ?? ['*'],
137
137
  cssTokenEndpoint: resolveCssTokenEndpoint(),
138
138
  solidBaseUrl: process.env.CSS_BASE_URL,
139
- gatewayLocatorSecret: process.env.XPOD_GATEWAY_LOCATOR_SECRET,
140
- gatewayLocatorKeyId: process.env.XPOD_GATEWAY_LOCATOR_KEY_ID,
141
- gatewayPreviousLocatorSecrets: parseGatewayPreviousLocatorSecrets(process.env.XPOD_GATEWAY_PREVIOUS_LOCATOR_SECRETS),
142
- gatewayInternalClientId: process.env.XPOD_GATEWAY_INTERNAL_CLIENT_ID,
143
- gatewayInternalClientSecret: process.env.XPOD_GATEWAY_INTERNAL_CLIENT_SECRET,
139
+ aiConnectionInvocationSecret: process.env.XPOD_AI_CONNECTION_INVOCATION_SECRET,
140
+ aiConnectionInvocationKeyId: process.env.XPOD_AI_CONNECTION_INVOCATION_KEY_ID,
141
+ aiConnectionPreviousInvocationSecrets: parsePreviousInvocationSecrets(process.env.XPOD_AI_CONNECTION_PREVIOUS_INVOCATION_SECRETS),
142
+ aiGatewaySessionAffinitySecret: process.env.XPOD_AI_GATEWAY_SESSION_AFFINITY_SECRET,
144
143
  gatewayAdminProxyAuthSecret: process.env.XPOD_GATEWAY_ADMIN_PROXY_AUTH_SECRET,
145
144
  aiGatewayConnectEnabled: process.env.XPOD_AI_GATEWAY_CONNECT_ENABLED === 'true',
146
145
  secretCellCredentialVaultFactory,
@@ -242,7 +241,7 @@ function assertSecretCellKeyId(value, variable) {
242
241
  throw new Error(`${variable} must be 1-128 safe key ID characters`);
243
242
  }
244
243
  }
245
- function parseGatewayPreviousLocatorSecrets(value) {
244
+ function parsePreviousInvocationSecrets(value) {
246
245
  if (!value?.trim()) {
247
246
  return undefined;
248
247
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/container/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * API Container 入口\n *\n * 使用 Awilix 进行依赖注入,根据 edition 注册不同服务\n */\n\nimport { createContainer, asValue, InjectionMode, type AwilixContainer } from 'awilix';\nimport { randomUUID, createHash } from 'node:crypto';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { ApiContainerCradle, ApiContainerConfig } from './types';\nimport { registerCommonServices } from './common';\nimport { registerCloudServices } from './cloud';\nimport { registerLocalServices } from './local';\nimport { registerBusinessToken } from './business-token';\nimport { resolveExternalOidcIssuer } from '../../runtime/oidc-issuer';\nimport { resolveAuthModeFromEnv } from '../../authorization/AuthMode';\nimport { readLocalProvisionState, resolveLocalSetupPath, resolveLocalSetupProviderId } from '../../provision/LocalProvisionState';\nimport { resolveTunnelProfileState } from '../../tunnel/TunnelProfiles';\nimport {\n DeploymentRootKeyProvider,\n parseDeploymentRootKeyConfig,\n SecretCellVault,\n} from '../../security/secret-cell';\nimport { SecretCellCredentialVault } from '../ai-gateway/credentials/SecretCellCredentialVault';\nimport type { CredentialVault } from '../ai-gateway/credentials/CredentialVault';\n\nexport type { ApiContainerCradle, ApiContainerConfig } from './types';\n\nconst OFFICIAL_CLOUD_IDENTITY_ORIGIN = 'https://id.undefineds.co';\nconst OFFICIAL_CLOUD_API_ORIGIN = 'https://api.undefineds.co';\n\nfunction ensureTrailingSlash(url: string): string {\n return url.endsWith('/') ? url : `${url}/`;\n}\n\nfunction resolveCssTokenEndpoint(): string {\n if (process.env.CSS_TOKEN_ENDPOINT) {\n return process.env.CSS_TOKEN_ENDPOINT;\n }\n\n if (process.env.CSS_BASE_URL) {\n return `${ensureTrailingSlash(process.env.CSS_BASE_URL)}.oidc/token`;\n }\n\n return 'http://localhost:3000/.oidc/token';\n}\n\nfunction normalizeOptionalBaseUrl(value: string | undefined): string | undefined {\n if (!value?.trim()) {\n return undefined;\n }\n const url = new URL(value);\n return url.toString().replace(/\\/$/u, '');\n}\n\n/**\n * 创建 API 容器\n */\nexport function createApiContainer(config: ApiContainerConfig): AwilixContainer<ApiContainerCradle> {\n const container = createContainer<ApiContainerCradle>({\n injectionMode: InjectionMode.PROXY,\n strict: true,\n });\n\n // 注册配置\n container.register({\n config: asValue(config),\n inngestRuntimeConfig: asValue(config.inngestRuntimeConfig),\n });\n\n // 注册共享服务\n registerCommonServices(container);\n\n // 根据 edition 注册专属服务\n if (config.edition === 'cloud') {\n registerCloudServices(container);\n } else {\n registerLocalServices(container);\n }\n\n // 注册 Business Token (如果配置了 XPOD_BUSINESS_TOKEN)\n registerBusinessToken(container);\n\n return container;\n}\n\n/**\n * 从环境变量读取配置\n */\nexport function loadConfigFromEnv(): ApiContainerConfig {\n const edition = (process.env.XPOD_EDITION ?? 'local') as 'cloud' | 'local';\n const rootDir = process.env.CSS_ROOT_FILE_PATH || './data';\n const localSetupPath = resolveLocalSetupPath(process.env.XPOD_LOCAL_SETUP_PATH, rootDir);\n const localSetupProviderId = resolveLocalSetupProviderId(process.env.XPOD_PROVIDER_ID);\n const localSetupState = edition === 'local'\n ? readLocalProvisionState(localSetupPath, localSetupProviderId)\n : undefined;\n\n // Port auto-increment: API_PORT = CSS_PORT + 1 if not explicitly set\n const cssPort = parseInt(process.env.CSS_PORT ?? '3000', 10);\n const apiPort = process.env.API_PORT\n ? parseInt(process.env.API_PORT, 10)\n : cssPort + 1;\n\n const cloudApiEndpoint = process.env.XPOD_CLOUD_API_ENDPOINT\n ?? localSetupState?.cloudApiUrl\n ?? OFFICIAL_CLOUD_API_ORIGIN;\n const nodeId = loadOrGenerateDeviceId(process.env.XPOD_NODE_ID ?? localSetupState?.nodeId);\n const nodeToken = process.env.XPOD_NODE_TOKEN ?? localSetupState?.nodeToken;\n const serviceToken = process.env.XPOD_SERVICE_TOKEN ?? localSetupState?.serviceToken;\n const oidcIssuer = resolveExternalOidcIssuer(process.env)\n ?? localSetupState?.cloudIdentityUrl\n ?? (\n nodeToken\n ? OFFICIAL_CLOUD_IDENTITY_ORIGIN\n : undefined\n );\n const tunnelProfileState = resolveTunnelProfileState(process.env);\n const secretCellCredentialVaultFactory = loadSecretCellCredentialVaultFactory(process.env);\n const openAiGatewayBaseUrl = normalizeOptionalBaseUrl(process.env.XPOD_AI_GATEWAY_OPENAI_BASE_URL);\n\n return {\n edition,\n port: apiPort,\n host: process.env.API_HOST ?? '0.0.0.0',\n socketPath: process.env.API_SOCKET_PATH,\n authMode: resolveAuthModeFromEnv(process.env),\n rdfIndexPath: process.env.CSS_RDF_INDEX_PATH,\n databaseUrl: process.env.CSS_IDENTITY_DB_URL ?? process.env.DATABASE_URL ?? '',\n sparqlEndpoint: process.env.CSS_SPARQL_ENDPOINT ?? process.env.SPARQL_ENDPOINT,\n rdfNativeSparqlEnabled: process.env.XPOD_RDF_NATIVE_SPARQL_ENABLED === 'true',\n redisUrl: process.env.CSS_REDIS_CLIENT ?? process.env.REDIS_URL,\n corsOrigins: process.env.CORS_ORIGINS?.split(',').map(s => s.trim()) ?? ['*'],\n cssTokenEndpoint: resolveCssTokenEndpoint(),\n solidBaseUrl: process.env.CSS_BASE_URL,\n gatewayLocatorSecret: process.env.XPOD_GATEWAY_LOCATOR_SECRET,\n gatewayLocatorKeyId: process.env.XPOD_GATEWAY_LOCATOR_KEY_ID,\n gatewayPreviousLocatorSecrets: parseGatewayPreviousLocatorSecrets(process.env.XPOD_GATEWAY_PREVIOUS_LOCATOR_SECRETS),\n gatewayInternalClientId: process.env.XPOD_GATEWAY_INTERNAL_CLIENT_ID,\n gatewayInternalClientSecret: process.env.XPOD_GATEWAY_INTERNAL_CLIENT_SECRET,\n gatewayAdminProxyAuthSecret: process.env.XPOD_GATEWAY_ADMIN_PROXY_AUTH_SECRET,\n aiGatewayConnectEnabled: process.env.XPOD_AI_GATEWAY_CONNECT_ENABLED === 'true',\n secretCellCredentialVaultFactory,\n aiGatewayConnectSigningSecret: process.env.XPOD_AI_GATEWAY_CONNECT_SIGNING_SECRET,\n aiGatewayKimiClientId: process.env.XPOD_AI_GATEWAY_KIMI_CLIENT_ID,\n aiGatewayProviderBaseUrls: openAiGatewayBaseUrl ? { openai: openAiGatewayBaseUrl } : undefined,\n inngest: {\n enabled: process.env.XPOD_INNGEST_ENABLED !== 'false',\n mode: process.env.XPOD_INNGEST_MODE === 'spawn' || process.env.XPOD_INNGEST_MODE === 'managed'\n ? process.env.XPOD_INNGEST_MODE\n : undefined,\n port: process.env.XPOD_INNGEST_PORT ? parseInt(process.env.XPOD_INNGEST_PORT, 10) : undefined,\n host: process.env.XPOD_INNGEST_HOST ?? '127.0.0.1',\n baseUrl: process.env.XPOD_INNGEST_BASE_URL,\n eventKey: process.env.XPOD_INNGEST_EVENT_KEY ?? process.env.INNGEST_EVENT_KEY,\n signingKey: process.env.XPOD_INNGEST_SIGNING_KEY ?? process.env.INNGEST_SIGNING_KEY,\n binaryPath: process.env.XPOD_INNGEST_BIN,\n sqliteDir: process.env.XPOD_INNGEST_SQLITE_DIR,\n },\n\n // 子域名配置 (cloud 模式)\n subdomain: {\n baseStorageDomain: process.env.CSS_BASE_STORAGE_DOMAIN,\n cloudflareAccountId: process.env.CLOUDFLARE_ACCOUNT_ID,\n cloudflareApiToken: process.env.CLOUDFLARE_API_TOKEN,\n tencentDnsSecretId: process.env.TENCENT_DNS_SECRET_ID,\n tencentDnsSecretKey: process.env.TENCENT_DNS_SECRET_KEY,\n },\n\n // Local 托管式:连接 Cloud\n cloudApiEndpoint,\n nodeId,\n nodeToken,\n serviceToken,\n provisionCode: process.env.XPOD_PROVISION_CODE ?? localSetupState?.provisionCode,\n publicUrl: process.env.XPOD_PUBLIC_URL ?? localSetupState?.publicUrl,\n spDomain: process.env.XPOD_SP_DOMAIN ?? localSetupState?.spDomain,\n localSetupPath,\n localSetupProviderId,\n\n // OIDC Issuer (Local 托管式使用 Cloud IdP)\n // 如果配置了 XPOD_NODE_TOKEN,默认使用 Cloud IdP\n oidcIssuer,\n\n // 隧道配置\n tunnelProvider: tunnelProfileState.activeProvider,\n tunnelProfiles: tunnelProfileState.profiles,\n tunnelActiveProfileId: tunnelProfileState.activeProfileId,\n activeTunnelProfile: tunnelProfileState.activeProfile,\n cloudflareTunnelToken: process.env.CLOUDFLARE_TUNNEL_TOKEN,\n // Prefer SAKURA_TUNNEL_TOKEN; keep SAKURA_TOKEN for backward compatibility.\n sakuraTunnelToken: process.env.SAKURA_TUNNEL_TOKEN ?? process.env.SAKURA_TOKEN,\n ngrokAuthToken: process.env.NGROK_AUTHTOKEN,\n ngrokUrl: process.env.NGROK_URL,\n ngrokPath: process.env.NGROK_BIN,\n\n // Edge 节点管理 (cloud 模式)\n edgeNodesEnabled: process.env.XPOD_EDGE_NODES_ENABLED === 'true',\n };\n}\n\nfunction loadSecretCellCredentialVaultFactory(env: NodeJS.ProcessEnv): (() => CredentialVault) | undefined {\n const activeKeyId = env.XPOD_SECRET_CELL_KEY_ID?.trim();\n const activeKey = env.XPOD_SECRET_CELL_KEY;\n const previousKeysJson = env.XPOD_SECRET_CELL_PREVIOUS_KEYS;\n if (!activeKeyId && !activeKey && !previousKeysJson) {\n return undefined;\n }\n if (!activeKeyId || !activeKey) {\n throw new Error('XPOD_SECRET_CELL_KEY_ID and XPOD_SECRET_CELL_KEY must be configured together');\n }\n assertSecretCellKeyId(activeKeyId, 'XPOD_SECRET_CELL_KEY_ID');\n\n const keys = Object.create(null) as Record<string, Uint8Array>;\n keys[activeKeyId] = parseDeploymentRootKeyConfig(activeKey);\n if (previousKeysJson) {\n let previous: unknown;\n try {\n previous = JSON.parse(previousKeysJson);\n } catch {\n throw new Error('XPOD_SECRET_CELL_PREVIOUS_KEYS must be a JSON object of keyId to base64 key');\n }\n if (!previous || typeof previous !== 'object' || Array.isArray(previous)) {\n throw new Error('XPOD_SECRET_CELL_PREVIOUS_KEYS must be a JSON object of keyId to base64 key');\n }\n for (const [keyId, value] of Object.entries(previous as Record<string, unknown>)) {\n if (typeof value !== 'string') {\n throw new Error('XPOD_SECRET_CELL_PREVIOUS_KEYS must map non-empty keyIds to base64 keys');\n }\n assertSecretCellKeyId(keyId, 'XPOD_SECRET_CELL_PREVIOUS_KEYS keyId');\n if (keyId === activeKeyId) {\n throw new Error('XPOD_SECRET_CELL_PREVIOUS_KEYS must not redefine the active keyId');\n }\n keys[keyId] = parseDeploymentRootKeyConfig(value);\n }\n }\n\n return () => new SecretCellCredentialVault({\n vault: new SecretCellVault({\n rootKeys: new DeploymentRootKeyProvider({ activeKeyId, keys }),\n }),\n });\n}\n\nfunction assertSecretCellKeyId(value: string, variable: string): void {\n if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(value)) {\n throw new Error(`${variable} must be 1-128 safe key ID characters`);\n }\n}\n\nfunction parseGatewayPreviousLocatorSecrets(value: string | undefined): Array<{ kid: string; secret: string }> | undefined {\n if (!value?.trim()) {\n return undefined;\n }\n const entries = value\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean)\n .map((entry) => {\n const separator = entry.indexOf(':');\n if (separator <= 0 || separator === entry.length - 1) {\n throw new Error('XPOD_GATEWAY_PREVIOUS_LOCATOR_SECRETS entries must be kid:secret');\n }\n return {\n kid: entry.slice(0, separator),\n secret: entry.slice(separator + 1),\n };\n });\n return entries.length ? entries : undefined;\n}\n\n/**\n * 获取设备首个非内部网卡的 MAC 地址。\n * 返回小写冒号分隔格式,如 \"aa:bb:cc:dd:ee:ff\"。\n * 容器/虚拟机中可能拿不到稳定 MAC,此时返回 undefined。\n */\nfunction getFirstMacAddress(): string | undefined {\n const interfaces = os.networkInterfaces();\n for (const name of Object.keys(interfaces)) {\n for (const iface of interfaces[name] ?? []) {\n if (!iface.internal && iface.mac && iface.mac !== '00:00:00:00:00:00') {\n return iface.mac.toLowerCase();\n }\n }\n }\n return undefined;\n}\n\n/**\n * 读取或生成设备 ID(持久化到 data/.device-id)。\n *\n * 优先级:\n * 1. 环境变量 XPOD_NODE_ID\n * 2. 已持久化的 data/.device-id\n * 3. 基于 MAC 地址的 SHA-256 哈希(截取前 32 位 hex)\n * 4. 随机 UUID(容器/虚拟机无稳定 MAC 时兜底)\n *\n * 生成后写入 data/.device-id,后续启动直接读取,保证同一设备 ID 稳定。\n */\nfunction loadOrGenerateDeviceId(envNodeId?: string): string | undefined {\n if (envNodeId) {\n return envNodeId;\n }\n\n const rootDir = process.env.CSS_ROOT_FILE_PATH || './data';\n const deviceIdPath = path.join(rootDir, '.device-id');\n\n // 尝试从文件读取\n try {\n if (fs.existsSync(deviceIdPath)) {\n const content = fs.readFileSync(deviceIdPath, 'utf-8').trim();\n if (content) {\n return content;\n }\n }\n } catch {\n // 读取失败,继续生成\n }\n\n // 优先用 MAC 哈希,拿不到则 UUID 兜底\n const mac = getFirstMacAddress();\n const deviceId = mac\n ? createHash('sha256').update(mac).digest('hex').slice(0, 32)\n : randomUUID();\n\n try {\n if (!fs.existsSync(rootDir)) {\n fs.mkdirSync(rootDir, { recursive: true });\n }\n fs.writeFileSync(deviceIdPath, deviceId, 'utf-8');\n } catch {\n // 写入失败不阻塞启动\n }\n\n return deviceId;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/container/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * API Container 入口\n *\n * 使用 Awilix 进行依赖注入,根据 edition 注册不同服务\n */\n\nimport { createContainer, asValue, InjectionMode, type AwilixContainer } from 'awilix';\nimport { randomUUID, createHash } from 'node:crypto';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { ApiContainerCradle, ApiContainerConfig } from './types';\nimport { registerCommonServices } from './common';\nimport { registerCloudServices } from './cloud';\nimport { registerLocalServices } from './local';\nimport { registerBusinessToken } from './business-token';\nimport { resolveExternalOidcIssuer } from '../../runtime/oidc-issuer';\nimport { resolveAuthModeFromEnv } from '../../authorization/AuthMode';\nimport { readLocalProvisionState, resolveLocalSetupPath, resolveLocalSetupProviderId } from '../../provision/LocalProvisionState';\nimport { resolveTunnelProfileState } from '../../tunnel/TunnelProfiles';\nimport {\n DeploymentRootKeyProvider,\n parseDeploymentRootKeyConfig,\n SecretCellVault,\n} from '../../security/secret-cell';\nimport { SecretCellCredentialVault } from '../ai-gateway/credentials/SecretCellCredentialVault';\nimport type { CredentialVault } from '../ai-gateway/credentials/CredentialVault';\n\nexport type { ApiContainerCradle, ApiContainerConfig } from './types';\n\nconst OFFICIAL_CLOUD_IDENTITY_ORIGIN = 'https://id.undefineds.co';\nconst OFFICIAL_CLOUD_API_ORIGIN = 'https://api.undefineds.co';\n\nfunction ensureTrailingSlash(url: string): string {\n return url.endsWith('/') ? url : `${url}/`;\n}\n\nfunction resolveCssTokenEndpoint(): string {\n if (process.env.CSS_TOKEN_ENDPOINT) {\n return process.env.CSS_TOKEN_ENDPOINT;\n }\n\n if (process.env.CSS_BASE_URL) {\n return `${ensureTrailingSlash(process.env.CSS_BASE_URL)}.oidc/token`;\n }\n\n return 'http://localhost:3000/.oidc/token';\n}\n\nfunction normalizeOptionalBaseUrl(value: string | undefined): string | undefined {\n if (!value?.trim()) {\n return undefined;\n }\n const url = new URL(value);\n return url.toString().replace(/\\/$/u, '');\n}\n\n/**\n * 创建 API 容器\n */\nexport function createApiContainer(config: ApiContainerConfig): AwilixContainer<ApiContainerCradle> {\n const container = createContainer<ApiContainerCradle>({\n injectionMode: InjectionMode.PROXY,\n strict: true,\n });\n\n // 注册配置\n container.register({\n config: asValue(config),\n inngestRuntimeConfig: asValue(config.inngestRuntimeConfig),\n });\n\n // 注册共享服务\n registerCommonServices(container);\n\n // 根据 edition 注册专属服务\n if (config.edition === 'cloud') {\n registerCloudServices(container);\n } else {\n registerLocalServices(container);\n }\n\n // 注册 Business Token (如果配置了 XPOD_BUSINESS_TOKEN)\n registerBusinessToken(container);\n\n return container;\n}\n\n/**\n * 从环境变量读取配置\n */\nexport function loadConfigFromEnv(): ApiContainerConfig {\n const edition = (process.env.XPOD_EDITION ?? 'local') as 'cloud' | 'local';\n const rootDir = process.env.CSS_ROOT_FILE_PATH || './data';\n const localSetupPath = resolveLocalSetupPath(process.env.XPOD_LOCAL_SETUP_PATH, rootDir);\n const localSetupProviderId = resolveLocalSetupProviderId(process.env.XPOD_PROVIDER_ID);\n const localSetupState = edition === 'local'\n ? readLocalProvisionState(localSetupPath, localSetupProviderId)\n : undefined;\n\n // Port auto-increment: API_PORT = CSS_PORT + 1 if not explicitly set\n const cssPort = parseInt(process.env.CSS_PORT ?? '3000', 10);\n const apiPort = process.env.API_PORT\n ? parseInt(process.env.API_PORT, 10)\n : cssPort + 1;\n\n const cloudApiEndpoint = process.env.XPOD_CLOUD_API_ENDPOINT\n ?? localSetupState?.cloudApiUrl\n ?? OFFICIAL_CLOUD_API_ORIGIN;\n const nodeId = loadOrGenerateDeviceId(process.env.XPOD_NODE_ID ?? localSetupState?.nodeId);\n const nodeToken = process.env.XPOD_NODE_TOKEN ?? localSetupState?.nodeToken;\n const serviceToken = process.env.XPOD_SERVICE_TOKEN ?? localSetupState?.serviceToken;\n const oidcIssuer = resolveExternalOidcIssuer(process.env)\n ?? localSetupState?.cloudIdentityUrl\n ?? (\n nodeToken\n ? OFFICIAL_CLOUD_IDENTITY_ORIGIN\n : undefined\n );\n const tunnelProfileState = resolveTunnelProfileState(process.env);\n const secretCellCredentialVaultFactory = loadSecretCellCredentialVaultFactory(process.env);\n const openAiGatewayBaseUrl = normalizeOptionalBaseUrl(process.env.XPOD_AI_GATEWAY_OPENAI_BASE_URL);\n\n return {\n edition,\n port: apiPort,\n host: process.env.API_HOST ?? '0.0.0.0',\n socketPath: process.env.API_SOCKET_PATH,\n authMode: resolveAuthModeFromEnv(process.env),\n rdfIndexPath: process.env.CSS_RDF_INDEX_PATH,\n databaseUrl: process.env.CSS_IDENTITY_DB_URL ?? process.env.DATABASE_URL ?? '',\n sparqlEndpoint: process.env.CSS_SPARQL_ENDPOINT ?? process.env.SPARQL_ENDPOINT,\n rdfNativeSparqlEnabled: process.env.XPOD_RDF_NATIVE_SPARQL_ENABLED === 'true',\n redisUrl: process.env.CSS_REDIS_CLIENT ?? process.env.REDIS_URL,\n corsOrigins: process.env.CORS_ORIGINS?.split(',').map(s => s.trim()) ?? ['*'],\n cssTokenEndpoint: resolveCssTokenEndpoint(),\n solidBaseUrl: process.env.CSS_BASE_URL,\n aiConnectionInvocationSecret: process.env.XPOD_AI_CONNECTION_INVOCATION_SECRET,\n aiConnectionInvocationKeyId: process.env.XPOD_AI_CONNECTION_INVOCATION_KEY_ID,\n aiConnectionPreviousInvocationSecrets: parsePreviousInvocationSecrets(process.env.XPOD_AI_CONNECTION_PREVIOUS_INVOCATION_SECRETS),\n aiGatewaySessionAffinitySecret: process.env.XPOD_AI_GATEWAY_SESSION_AFFINITY_SECRET,\n gatewayAdminProxyAuthSecret: process.env.XPOD_GATEWAY_ADMIN_PROXY_AUTH_SECRET,\n aiGatewayConnectEnabled: process.env.XPOD_AI_GATEWAY_CONNECT_ENABLED === 'true',\n secretCellCredentialVaultFactory,\n aiGatewayConnectSigningSecret: process.env.XPOD_AI_GATEWAY_CONNECT_SIGNING_SECRET,\n aiGatewayKimiClientId: process.env.XPOD_AI_GATEWAY_KIMI_CLIENT_ID,\n aiGatewayProviderBaseUrls: openAiGatewayBaseUrl ? { openai: openAiGatewayBaseUrl } : undefined,\n inngest: {\n enabled: process.env.XPOD_INNGEST_ENABLED !== 'false',\n mode: process.env.XPOD_INNGEST_MODE === 'spawn' || process.env.XPOD_INNGEST_MODE === 'managed'\n ? process.env.XPOD_INNGEST_MODE\n : undefined,\n port: process.env.XPOD_INNGEST_PORT ? parseInt(process.env.XPOD_INNGEST_PORT, 10) : undefined,\n host: process.env.XPOD_INNGEST_HOST ?? '127.0.0.1',\n baseUrl: process.env.XPOD_INNGEST_BASE_URL,\n eventKey: process.env.XPOD_INNGEST_EVENT_KEY ?? process.env.INNGEST_EVENT_KEY,\n signingKey: process.env.XPOD_INNGEST_SIGNING_KEY ?? process.env.INNGEST_SIGNING_KEY,\n binaryPath: process.env.XPOD_INNGEST_BIN,\n sqliteDir: process.env.XPOD_INNGEST_SQLITE_DIR,\n },\n\n // 子域名配置 (cloud 模式)\n subdomain: {\n baseStorageDomain: process.env.CSS_BASE_STORAGE_DOMAIN,\n cloudflareAccountId: process.env.CLOUDFLARE_ACCOUNT_ID,\n cloudflareApiToken: process.env.CLOUDFLARE_API_TOKEN,\n tencentDnsSecretId: process.env.TENCENT_DNS_SECRET_ID,\n tencentDnsSecretKey: process.env.TENCENT_DNS_SECRET_KEY,\n },\n\n // Local 托管式:连接 Cloud\n cloudApiEndpoint,\n nodeId,\n nodeToken,\n serviceToken,\n provisionCode: process.env.XPOD_PROVISION_CODE ?? localSetupState?.provisionCode,\n publicUrl: process.env.XPOD_PUBLIC_URL ?? localSetupState?.publicUrl,\n spDomain: process.env.XPOD_SP_DOMAIN ?? localSetupState?.spDomain,\n localSetupPath,\n localSetupProviderId,\n\n // OIDC Issuer (Local 托管式使用 Cloud IdP)\n // 如果配置了 XPOD_NODE_TOKEN,默认使用 Cloud IdP\n oidcIssuer,\n\n // 隧道配置\n tunnelProvider: tunnelProfileState.activeProvider,\n tunnelProfiles: tunnelProfileState.profiles,\n tunnelActiveProfileId: tunnelProfileState.activeProfileId,\n activeTunnelProfile: tunnelProfileState.activeProfile,\n cloudflareTunnelToken: process.env.CLOUDFLARE_TUNNEL_TOKEN,\n // Prefer SAKURA_TUNNEL_TOKEN; keep SAKURA_TOKEN for backward compatibility.\n sakuraTunnelToken: process.env.SAKURA_TUNNEL_TOKEN ?? process.env.SAKURA_TOKEN,\n ngrokAuthToken: process.env.NGROK_AUTHTOKEN,\n ngrokUrl: process.env.NGROK_URL,\n ngrokPath: process.env.NGROK_BIN,\n\n // Edge 节点管理 (cloud 模式)\n edgeNodesEnabled: process.env.XPOD_EDGE_NODES_ENABLED === 'true',\n };\n}\n\nfunction loadSecretCellCredentialVaultFactory(env: NodeJS.ProcessEnv): (() => CredentialVault) | undefined {\n const activeKeyId = env.XPOD_SECRET_CELL_KEY_ID?.trim();\n const activeKey = env.XPOD_SECRET_CELL_KEY;\n const previousKeysJson = env.XPOD_SECRET_CELL_PREVIOUS_KEYS;\n if (!activeKeyId && !activeKey && !previousKeysJson) {\n return undefined;\n }\n if (!activeKeyId || !activeKey) {\n throw new Error('XPOD_SECRET_CELL_KEY_ID and XPOD_SECRET_CELL_KEY must be configured together');\n }\n assertSecretCellKeyId(activeKeyId, 'XPOD_SECRET_CELL_KEY_ID');\n\n const keys = Object.create(null) as Record<string, Uint8Array>;\n keys[activeKeyId] = parseDeploymentRootKeyConfig(activeKey);\n if (previousKeysJson) {\n let previous: unknown;\n try {\n previous = JSON.parse(previousKeysJson);\n } catch {\n throw new Error('XPOD_SECRET_CELL_PREVIOUS_KEYS must be a JSON object of keyId to base64 key');\n }\n if (!previous || typeof previous !== 'object' || Array.isArray(previous)) {\n throw new Error('XPOD_SECRET_CELL_PREVIOUS_KEYS must be a JSON object of keyId to base64 key');\n }\n for (const [keyId, value] of Object.entries(previous as Record<string, unknown>)) {\n if (typeof value !== 'string') {\n throw new Error('XPOD_SECRET_CELL_PREVIOUS_KEYS must map non-empty keyIds to base64 keys');\n }\n assertSecretCellKeyId(keyId, 'XPOD_SECRET_CELL_PREVIOUS_KEYS keyId');\n if (keyId === activeKeyId) {\n throw new Error('XPOD_SECRET_CELL_PREVIOUS_KEYS must not redefine the active keyId');\n }\n keys[keyId] = parseDeploymentRootKeyConfig(value);\n }\n }\n\n return () => new SecretCellCredentialVault({\n vault: new SecretCellVault({\n rootKeys: new DeploymentRootKeyProvider({ activeKeyId, keys }),\n }),\n });\n}\n\nfunction assertSecretCellKeyId(value: string, variable: string): void {\n if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(value)) {\n throw new Error(`${variable} must be 1-128 safe key ID characters`);\n }\n}\n\nfunction parsePreviousInvocationSecrets(value: string | undefined): Array<{ kid: string; secret: string }> | undefined {\n if (!value?.trim()) {\n return undefined;\n }\n const entries = value\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean)\n .map((entry) => {\n const separator = entry.indexOf(':');\n if (separator <= 0 || separator === entry.length - 1) {\n throw new Error('XPOD_GATEWAY_PREVIOUS_LOCATOR_SECRETS entries must be kid:secret');\n }\n return {\n kid: entry.slice(0, separator),\n secret: entry.slice(separator + 1),\n };\n });\n return entries.length ? entries : undefined;\n}\n\n/**\n * 获取设备首个非内部网卡的 MAC 地址。\n * 返回小写冒号分隔格式,如 \"aa:bb:cc:dd:ee:ff\"。\n * 容器/虚拟机中可能拿不到稳定 MAC,此时返回 undefined。\n */\nfunction getFirstMacAddress(): string | undefined {\n const interfaces = os.networkInterfaces();\n for (const name of Object.keys(interfaces)) {\n for (const iface of interfaces[name] ?? []) {\n if (!iface.internal && iface.mac && iface.mac !== '00:00:00:00:00:00') {\n return iface.mac.toLowerCase();\n }\n }\n }\n return undefined;\n}\n\n/**\n * 读取或生成设备 ID(持久化到 data/.device-id)。\n *\n * 优先级:\n * 1. 环境变量 XPOD_NODE_ID\n * 2. 已持久化的 data/.device-id\n * 3. 基于 MAC 地址的 SHA-256 哈希(截取前 32 位 hex)\n * 4. 随机 UUID(容器/虚拟机无稳定 MAC 时兜底)\n *\n * 生成后写入 data/.device-id,后续启动直接读取,保证同一设备 ID 稳定。\n */\nfunction loadOrGenerateDeviceId(envNodeId?: string): string | undefined {\n if (envNodeId) {\n return envNodeId;\n }\n\n const rootDir = process.env.CSS_ROOT_FILE_PATH || './data';\n const deviceIdPath = path.join(rootDir, '.device-id');\n\n // 尝试从文件读取\n try {\n if (fs.existsSync(deviceIdPath)) {\n const content = fs.readFileSync(deviceIdPath, 'utf-8').trim();\n if (content) {\n return content;\n }\n }\n } catch {\n // 读取失败,继续生成\n }\n\n // 优先用 MAC 哈希,拿不到则 UUID 兜底\n const mac = getFirstMacAddress();\n const deviceId = mac\n ? createHash('sha256').update(mac).digest('hex').slice(0, 32)\n : randomUUID();\n\n try {\n if (!fs.existsSync(rootDir)) {\n fs.mkdirSync(rootDir, { recursive: true });\n }\n fs.writeFileSync(deviceIdPath, deviceId, 'utf-8');\n } catch {\n // 写入失败不阻塞启动\n }\n\n return deviceId;\n}\n"]}
@@ -117,8 +117,7 @@ function registerSharedRoutes(container, server) {
117
117
  const inngestTaskScheduler = container.resolve('inngestTaskScheduler');
118
118
  const inngestRuntimeConfig = container.resolve('inngestRuntimeConfig');
119
119
  const rdfStorageStatsService = container.resolve('rdfStorageStatsService');
120
- const gatewayAccessKeyRepository = container.resolve('gatewayAccessKeyRepository');
121
- const gatewayInternalPodAccess = container.resolve('gatewayInternalPodAccess');
120
+ const hostedPodDataAccess = container.resolve('hostedPodDataAccess');
122
121
  const aiConnectionInvocationKeyIssuer = container.resolve('aiConnectionInvocationKeyIssuer');
123
122
  const providerConnectService = container.resolve('providerConnectService');
124
123
  const providerQuotaService = container.resolve('providerQuotaService', { allowUnregistered: true });
@@ -168,11 +167,9 @@ function registerSharedRoutes(container, server) {
168
167
  rdfStorageStatsService,
169
168
  });
170
169
  (0, AiGatewayManagementHandler_1.registerAiGatewayManagementRoutes)(server, {
171
- repository: gatewayAccessKeyRepository,
172
170
  deployment: config.edition,
173
171
  connectService: providerConnectService,
174
172
  quotaService: providerQuotaService,
175
- servicePrincipal: gatewayInternalPodAccess,
176
173
  aiClientConfiguration: aiClientConfigurationService?.capability(),
177
174
  aiConnectionInvocationKeyIssuer,
178
175
  });
@@ -187,7 +184,7 @@ function registerSharedRoutes(container, server) {
187
184
  (0, PodSettingsHandler_1.registerPodSettingsRoutes)(server, {
188
185
  podLookupRepository,
189
186
  usageRepo: new UsageRepository_1.UsageRepository(container.resolve('db')),
190
- aiConnectionStatusReader: new PodSettingsHandler_1.DrizzlePodAiConnectionStatusReader(gatewayInternalPodAccess),
187
+ aiConnectionStatusReader: new PodSettingsHandler_1.DrizzlePodAiConnectionStatusReader(hostedPodDataAccess),
191
188
  });
192
189
  (0, NetworkSettingsHandler_1.registerNetworkSettingsRoutes)(server, {
193
190
  endpoint: () => resolveNetworkEndpoint(config),