@undefineds.co/xpod 0.3.70 → 0.3.71-rc.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/cloud.json +3 -0
- package/config/local.json +3 -0
- package/config/resolver.json +7 -0
- package/config/xpod.base.json +20 -0
- package/dist/agents/ClaudeExecutor.js +1 -1
- package/dist/agents/ClaudeExecutor.js.map +1 -1
- package/dist/agents/types.d.ts +5 -5
- package/dist/agents/types.js.map +1 -1
- package/dist/api/ai-gateway/AiGatewayService.d.ts +5 -16
- package/dist/api/ai-gateway/AiGatewayService.js +13 -35
- package/dist/api/ai-gateway/AiGatewayService.js.map +1 -1
- package/dist/api/ai-gateway/auth/AiConnectionInvocationKeyIssuer.d.ts +3 -2
- package/dist/api/ai-gateway/auth/AiConnectionInvocationKeyIssuer.js +37 -12
- package/dist/api/ai-gateway/auth/AiConnectionInvocationKeyIssuer.js.map +1 -1
- package/dist/api/ai-gateway/auth/GatewayPrincipal.d.ts +2 -16
- package/dist/api/ai-gateway/auth/GatewayPrincipal.js +3 -33
- package/dist/api/ai-gateway/auth/GatewayPrincipal.js.map +1 -1
- package/dist/api/ai-gateway/auth/InvocationTokenAuthenticator.d.ts +23 -0
- package/dist/api/ai-gateway/auth/InvocationTokenAuthenticator.js +81 -0
- package/dist/api/ai-gateway/auth/InvocationTokenAuthenticator.js.map +1 -0
- package/dist/api/ai-gateway/auth/InvocationTokenCodec.d.ts +7 -4
- package/dist/api/ai-gateway/auth/InvocationTokenCodec.js.map +1 -1
- package/dist/api/ai-gateway/connect/index.d.ts +7 -26
- package/dist/api/ai-gateway/connect/index.js +40 -67
- package/dist/api/ai-gateway/connect/index.js.map +1 -1
- package/dist/api/ai-gateway/credentials/PlaintextCredentialPayload.d.ts +17 -0
- package/dist/api/ai-gateway/credentials/PlaintextCredentialPayload.js +65 -0
- package/dist/api/ai-gateway/credentials/PlaintextCredentialPayload.js.map +1 -0
- package/dist/api/ai-gateway/pod/HostedPodDataAccess.d.ts +24 -0
- package/dist/api/ai-gateway/pod/HostedPodDataAccess.js +149 -0
- package/dist/api/ai-gateway/pod/HostedPodDataAccess.js.map +1 -0
- package/dist/api/ai-gateway/quota/ProviderQuotaAdapter.d.ts +13 -5
- package/dist/api/ai-gateway/quota/ProviderQuotaAdapter.js +16 -19
- package/dist/api/ai-gateway/quota/ProviderQuotaAdapter.js.map +1 -1
- package/dist/api/ai-gateway/service-access/AiConnectionServiceAccess.d.ts +1 -1
- package/dist/api/ai-gateway/service-access/AiConnectionServiceAccess.js +0 -2
- package/dist/api/ai-gateway/service-access/AiConnectionServiceAccess.js.map +1 -1
- package/dist/api/auth/AuthContext.d.ts +1 -12
- package/dist/api/auth/AuthContext.js +0 -11
- package/dist/api/auth/AuthContext.js.map +1 -1
- package/dist/api/auth/ClientCredentialsAuthenticator.js +4 -11
- package/dist/api/auth/ClientCredentialsAuthenticator.js.map +1 -1
- package/dist/api/chatkit/default-agent.d.ts +2 -2
- package/dist/api/chatkit/default-agent.js +4 -4
- package/dist/api/chatkit/default-agent.js.map +1 -1
- package/dist/api/chatkit/runtime/AcpAgentRuntime.js +1 -1
- package/dist/api/chatkit/runtime/AcpAgentRuntime.js.map +1 -1
- package/dist/api/container/common.js +28 -69
- package/dist/api/container/common.js.map +1 -1
- package/dist/api/container/index.js +5 -6
- package/dist/api/container/index.js.map +1 -1
- package/dist/api/container/routes.js +2 -5
- package/dist/api/container/routes.js.map +1 -1
- package/dist/api/container/types.d.ts +8 -10
- package/dist/api/container/types.js.map +1 -1
- package/dist/api/handlers/AiClientConfigurationHandler.js +3 -3
- package/dist/api/handlers/AiClientConfigurationHandler.js.map +1 -1
- package/dist/api/handlers/AiGatewayHandler.js +2 -2
- package/dist/api/handlers/AiGatewayHandler.js.map +1 -1
- package/dist/api/handlers/AiGatewayManagementHandler.d.ts +2 -10
- package/dist/api/handlers/AiGatewayManagementHandler.js +4 -154
- package/dist/api/handlers/AiGatewayManagementHandler.js.map +1 -1
- package/dist/api/handlers/NetworkSettingsHandler.js +0 -3
- package/dist/api/handlers/NetworkSettingsHandler.js.map +1 -1
- package/dist/api/handlers/PodSettingsHandler.d.ts +5 -2
- package/dist/api/handlers/PodSettingsHandler.js +3 -3
- package/dist/api/handlers/PodSettingsHandler.js.map +1 -1
- package/dist/api/runs/AgentRuntimeTypes.d.ts +3 -3
- package/dist/api/runs/AgentRuntimeTypes.js +10 -10
- package/dist/api/runs/AgentRuntimeTypes.js.map +1 -1
- package/dist/api/runs/InngestRunExecutionBackend.d.ts +15 -9
- package/dist/api/runs/InngestRunExecutionBackend.js +25 -10
- package/dist/api/runs/InngestRunExecutionBackend.js.map +1 -1
- package/dist/api/runs/PiAgentRuntimeDriver.js +2 -2
- package/dist/api/runs/PiAgentRuntimeDriver.js.map +1 -1
- package/dist/api/runs/RunStateCenter.js +1 -1
- package/dist/api/runs/RunStateCenter.js.map +1 -1
- package/dist/api/service/AiClientConfigurationService.d.ts +2 -2
- package/dist/api/service/AiClientConfigurationService.js +11 -11
- package/dist/api/service/AiClientConfigurationService.js.map +1 -1
- package/dist/api/tasks/InngestTaskScheduler.d.ts +16 -10
- package/dist/api/tasks/InngestTaskScheduler.js +24 -12
- package/dist/api/tasks/InngestTaskScheduler.js.map +1 -1
- package/dist/cli/commands/start.js +7 -7
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/components/components.jsonld +1 -0
- package/dist/components/context.jsonld +36 -0
- package/dist/http/InternalPodDataHttpHandler.d.ts +32 -0
- package/dist/http/InternalPodDataHttpHandler.js +258 -0
- package/dist/http/InternalPodDataHttpHandler.js.map +1 -0
- package/dist/http/InternalPodDataHttpHandler.jsonld +201 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/main.js +13 -13
- package/dist/main.js.map +1 -1
- package/dist/runtime/GatewayAdminProxyAuth.d.ts +15 -1
- package/dist/runtime/GatewayAdminProxyAuth.js +57 -2
- package/dist/runtime/GatewayAdminProxyAuth.js.map +1 -1
- package/dist/runtime/bootstrap.js +3 -0
- package/dist/runtime/bootstrap.js.map +1 -1
- package/dist/runtime/css-process.d.ts +1 -1
- package/dist/runtime/css-process.js +4 -1
- package/dist/runtime/css-process.js.map +1 -1
- package/dist/runtime/runner/node/CommunitySolidServerCssRunner.d.ts +2 -0
- package/dist/runtime/runner/node/CommunitySolidServerCssRunner.js +50 -0
- package/dist/runtime/runner/node/CommunitySolidServerCssRunner.js.map +1 -1
- package/node_modules/@undefineds.co/ai-connection/dist/AiClientConfigurationSection.d.ts +5 -5
- package/node_modules/@undefineds.co/ai-connection/dist/AiClientConfigurationSection.js +7 -7
- package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionMain.js +1 -1
- package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionPanel.d.ts +3 -1
- package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionPanel.js +74 -60
- package/node_modules/@undefineds.co/ai-connection/dist/ai-connection-client.d.ts +0 -21
- package/node_modules/@undefineds.co/ai-connection/dist/ai-connection-client.js +0 -41
- package/node_modules/@undefineds.co/ai-connection/dist/client-config/base-adapter.d.ts +1 -0
- package/node_modules/@undefineds.co/ai-connection/dist/client-config/base-adapter.js +7 -2
- package/node_modules/@undefineds.co/ai-connection/dist/client-config/codex.js +3 -3
- package/node_modules/@undefineds.co/ai-connection/dist/client-config/index.cjs +15 -9
- package/node_modules/@undefineds.co/ai-connection/dist/client-config/json-env-adapter.js +4 -4
- package/node_modules/@undefineds.co/ai-connection/dist/client-config/pi.js +3 -3
- package/node_modules/@undefineds.co/ai-connection/dist/client-config/types.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connection/dist/controller.d.ts +2 -1
- package/node_modules/@undefineds.co/ai-connection/dist/controller.js +1 -0
- package/node_modules/@undefineds.co/ai-connection/dist/service-access.js +0 -1
- package/node_modules/@undefineds.co/extension-sdk/dist/web.d.ts +22 -1
- package/package.json +3 -3
- package/static/app/assets/main.js +7 -7
- package/static/dashboard/assets/NetworkPage-CXjiUMR1.js +2 -0
- package/static/dashboard/assets/{PaneListHeader-57nvMwH6.js → PaneListHeader-BSipfl0W.js} +1 -1
- package/static/dashboard/assets/PodPage-Bd3Xhmp-.js +2 -0
- package/static/dashboard/assets/ServicesPage-CI3jWZGe.js +1 -0
- package/static/dashboard/assets/{card-B9Zjf_2p.js → card-z5BV5hTo.js} +1 -1
- package/static/dashboard/assets/{dashboard-8C6o666W.js → dashboard-CSrqAv2L.js} +2 -2
- package/static/dashboard/assets/{database-DPh9wDY9.js → database-Ct5ZPe6L.js} +1 -1
- package/static/dashboard/assets/{external-link-VbMQvVMz.js → external-link-B7wD1hkm.js} +1 -1
- package/static/dashboard/assets/index-tOBaUnM1.js +44 -0
- package/static/dashboard/assets/{refresh-cw-BxVxNxNr.js → refresh-cw-CFDZPaE8.js} +1 -1
- package/static/dashboard/assets/{services-status-context-DKmJ7ISr.js → services-status-context-DN1Icg4A.js} +1 -1
- package/static/dashboard/dashboard.html +1 -1
- package/static/settings/assets/ModelsPage-03NPWzoX.js +1 -0
- package/static/settings/assets/{PaneListHeader-Bgaze006.js → PaneListHeader-DMD8OJef.js} +1 -1
- package/static/settings/assets/PodPage-DT4EMYhL.js +2 -0
- package/static/settings/assets/ServicesPage-CJ0ub6IH.js +1 -0
- package/static/settings/assets/SettingsPage-BkR7ZK18.js +41 -0
- package/static/settings/assets/{card-B_bXSIn-.js → card-Cjsia0_V.js} +1 -1
- package/static/settings/assets/{services-status-context-DiX-AbrP.js → services-status-context-CkuKmH5h.js} +1 -1
- package/static/settings/assets/{settings-B30oMfZq.js → settings-Cyyv6-SD.js} +2 -2
- package/static/settings/assets/{workspace-layout-Dv1Yn9Ci.js → workspace-layout-B47luv6r.js} +1 -1
- package/static/settings/settings.html +1 -1
- package/dist/api/ai-gateway/auth/ClientCredentialsInternalPodAccessTokenProvider.d.ts +0 -25
- package/dist/api/ai-gateway/auth/ClientCredentialsInternalPodAccessTokenProvider.js +0 -91
- package/dist/api/ai-gateway/auth/ClientCredentialsInternalPodAccessTokenProvider.js.map +0 -1
- package/dist/api/ai-gateway/auth/GatewayApiKey.d.ts +0 -28
- package/dist/api/ai-gateway/auth/GatewayApiKey.js +0 -162
- package/dist/api/ai-gateway/auth/GatewayApiKey.js.map +0 -1
- package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.d.ts +0 -56
- package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.js +0 -143
- package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.js.map +0 -1
- package/dist/api/ai-gateway/auth/GatewayKeyLocatorCodec.d.ts +0 -26
- package/dist/api/ai-gateway/auth/GatewayKeyLocatorCodec.js +0 -97
- package/dist/api/ai-gateway/auth/GatewayKeyLocatorCodec.js.map +0 -1
- package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.d.ts +0 -54
- package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.js +0 -152
- package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.js.map +0 -1
- package/static/dashboard/assets/NetworkPage-Brt79fuQ.js +0 -2
- package/static/dashboard/assets/PodPage-CM6do1vB.js +0 -2
- package/static/dashboard/assets/ServicesPage-BUNxGJRz.js +0 -1
- package/static/dashboard/assets/index-RfiFckzb.js +0 -51
- package/static/settings/assets/ModelsPage-D_IH7AH3.js +0 -1
- package/static/settings/assets/PodPage-Cy1VNObw.js +0 -2
- package/static/settings/assets/ServicesPage-BsFaxVWC.js +0 -1
- 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
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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.
|
|
137
|
-
secret: config.
|
|
119
|
+
kid: config.aiConnectionInvocationKeyId ?? 'ephemeral',
|
|
120
|
+
secret: config.aiConnectionInvocationSecret ?? randomSecret(),
|
|
138
121
|
},
|
|
139
|
-
previous: config.
|
|
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
|
-
|
|
167
|
-
|
|
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)(({
|
|
212
|
+
gatewayCredentialStore: (0, awilix_1.asFunction)(({ hostedPodDataAccess }) => {
|
|
242
213
|
return new connect_1.PodConnectedCredentialRepository({
|
|
243
|
-
internalPodAccess:
|
|
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.
|
|
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
|
-
|
|
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,
|
|
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
|
|
323
|
-
|
|
324
|
-
invocationTokenCodec,
|
|
282
|
+
const invocationTokenAuthenticator = new InvocationTokenAuthenticator_1.InvocationTokenAuthenticator({
|
|
283
|
+
codec: invocationTokenCodec,
|
|
325
284
|
deployment: config.edition,
|
|
326
|
-
|
|
285
|
+
audience: resolveAiConnectionAudience(config),
|
|
327
286
|
});
|
|
328
287
|
return new MultiAuthenticator_1.MultiAuthenticator({
|
|
329
|
-
// Order: Solid DPoP → Service Token → Node Token →
|
|
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,
|
|
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
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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
|
|
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
|
|
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(
|
|
187
|
+
aiConnectionStatusReader: new PodSettingsHandler_1.DrizzlePodAiConnectionStatusReader(hostedPodDataAccess),
|
|
191
188
|
});
|
|
192
189
|
(0, NetworkSettingsHandler_1.registerNetworkSettingsRoutes)(server, {
|
|
193
190
|
endpoint: () => resolveNetworkEndpoint(config),
|