@undefineds.co/xpod 0.3.71-rc.8 → 0.3.71

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/api/ai-gateway/connect/index.d.ts +2 -0
  2. package/dist/api/ai-gateway/connect/index.js +87 -24
  3. package/dist/api/ai-gateway/connect/index.js.map +1 -1
  4. package/dist/api/ai-gateway/pod/HostedPodDataAccess.js +2 -2
  5. package/dist/api/ai-gateway/pod/HostedPodDataAccess.js.map +1 -1
  6. package/dist/api/container/common.js +1 -1
  7. package/dist/api/container/common.js.map +1 -1
  8. package/dist/api/container/routes.js +1 -1
  9. package/dist/api/container/routes.js.map +1 -1
  10. package/dist/api/handlers/AiGatewayManagementHandler.js +28 -12
  11. package/dist/api/handlers/AiGatewayManagementHandler.js.map +1 -1
  12. package/dist/api/handlers/PodSettingsHandler.d.ts +12 -19
  13. package/dist/api/handlers/PodSettingsHandler.js +12 -51
  14. package/dist/api/handlers/PodSettingsHandler.js.map +1 -1
  15. package/dist/http/InternalPodDataHttpHandler.d.ts +3 -1
  16. package/dist/http/InternalPodDataHttpHandler.js +48 -7
  17. package/dist/http/InternalPodDataHttpHandler.js.map +1 -1
  18. package/dist/http/InternalPodDataHttpHandler.jsonld +10 -2
  19. package/dist/runtime/GatewayAdminProxyAuth.d.ts +1 -1
  20. package/dist/runtime/GatewayAdminProxyAuth.js +1 -1
  21. package/dist/runtime/GatewayAdminProxyAuth.js.map +1 -1
  22. package/dist/runtime/Proxy.d.ts +1 -0
  23. package/dist/runtime/Proxy.js +22 -0
  24. package/dist/runtime/Proxy.js.map +1 -1
  25. package/package.json +1 -1
  26. package/static/dashboard/assets/{NetworkPage-CXjiUMR1.js → NetworkPage-CsERgA2D.js} +1 -1
  27. package/static/dashboard/assets/{PaneListHeader-BSipfl0W.js → PaneListHeader-WJWFvTKY.js} +1 -1
  28. package/static/dashboard/assets/{PodPage-Bd3Xhmp-.js → PodPage-Bo_NbnK1.js} +1 -1
  29. package/static/dashboard/assets/{ServicesPage-CI3jWZGe.js → ServicesPage-CrNDXQlg.js} +1 -1
  30. package/static/dashboard/assets/{card-z5BV5hTo.js → card-Cjax171A.js} +1 -1
  31. package/static/dashboard/assets/{dashboard-CSrqAv2L.js → dashboard-CaE1mRUL.js} +4 -4
  32. package/static/dashboard/assets/{database-Ct5ZPe6L.js → database-B0sGiSz2.js} +1 -1
  33. package/static/dashboard/assets/{external-link-B7wD1hkm.js → external-link-C_ANDdCY.js} +1 -1
  34. package/static/dashboard/assets/{index-tOBaUnM1.js → index-CDoxbvUP.js} +1 -1
  35. package/static/dashboard/assets/{refresh-cw-CFDZPaE8.js → refresh-cw-DHzHxCme.js} +1 -1
  36. package/static/dashboard/assets/{services-status-context-DN1Icg4A.js → services-status-context-ukghtkFD.js} +1 -1
  37. package/static/dashboard/dashboard.html +1 -1
  38. package/static/settings/assets/ModelsPage-ClTKzRGm.js +1 -0
  39. package/static/settings/assets/{PaneListHeader-BtON8Z5Q.js → PaneListHeader-DTVY4Ig2.js} +1 -1
  40. package/static/settings/assets/{PodPage-9LGuOloQ.js → PodPage-L_JAOD-r.js} +1 -1
  41. package/static/settings/assets/{ServicesPage-ZoT9-B_0.js → ServicesPage-BwLxrSWw.js} +1 -1
  42. package/static/settings/assets/{SettingsPage-Bj4lB3mq.js → SettingsPage-DUGHDPQx.js} +1 -1
  43. package/static/settings/assets/{card-CCGngjas.js → card-BZF0jSa_.js} +1 -1
  44. package/static/settings/assets/{services-status-context-CBfImxL_.js → services-status-context-BnbZHZnu.js} +1 -1
  45. package/static/settings/assets/{settings-yUyFIJxi.js → settings-BN7FyntE.js} +4 -4
  46. package/static/settings/assets/{workspace-layout-B0wJpPze.js → workspace-layout-jzYHoh3_.js} +1 -1
  47. package/static/settings/settings.html +1 -1
  48. package/static/settings/assets/ModelsPage-D87RrLB0.js +0 -1
@@ -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 { 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"]}
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 `http://127.0.0.1:${process.env.XPOD_MAIN_PORT ?? '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"]}
@@ -184,7 +184,7 @@ function registerSharedRoutes(container, server) {
184
184
  (0, PodSettingsHandler_1.registerPodSettingsRoutes)(server, {
185
185
  podLookupRepository,
186
186
  usageRepo: new UsageRepository_1.UsageRepository(container.resolve('db')),
187
- aiConnectionStatusReader: new PodSettingsHandler_1.DrizzlePodAiConnectionStatusReader(hostedPodDataAccess),
187
+ aiConnectionStatusReader: new PodSettingsHandler_1.ProviderConnectPodAiConnectionStatusReader(providerConnectService, config.edition),
188
188
  });
189
189
  (0, NetworkSettingsHandler_1.registerNetworkSettingsRoutes)(server, {
190
190
  endpoint: () => resolveNetworkEndpoint(config),
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/api/container/routes.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 路由注册\n *\n * 根据容器中的服务注册 API 路由\n */\n\nimport type { AwilixContainer } from 'awilix';\nimport type { ApiContainerCradle, ApiContainerConfig } from './types';\nimport type { ApiServer } from '../ApiServer';\n\nimport { registerEdgeNodeSignalRoutes } from '../handlers/EdgeNodeSignalHandler';\nimport { registerReachabilityRoutes } from '../handlers/ReachabilityHandler';\nimport { registerNodeRoutes } from '../handlers/NodeHandler';\nimport { registerChatRoutes } from '../handlers/ChatHandler';\nimport { registerSubdomainRoutes } from '../handlers/SubdomainHandler';\nimport { registerSubdomainClientRoutes } from '../handlers/SubdomainClientHandler';\nimport { registerDdnsRoutes } from '../handlers/DdnsHandler';\nimport { registerChatKitRoutes } from '../handlers/ChatKitHandler';\nimport { registerChatKitV1Routes } from '../handlers/ChatKitV1Handler';\nimport { registerInngestRoutes } from '../handlers/InngestHandler';\nimport { registerRunRoutes } from '../handlers/RunHandler';\nimport { registerMatrixRoutes } from '../handlers/MatrixHandler';\nimport { registerCoordinationRoutes } from '../handlers/CoordinationHandler';\nimport { registerDashboardRoutes } from '../handlers/DashboardHandler';\nimport { registerSettingsRoutes } from '../handlers/SettingsHandler';\nimport { registerAdminRoutes } from '../handlers/AdminHandler';\nimport { registerAdminDdnsRoutes } from '../handlers/AdminDdnsHandler';\nimport { registerLinxCapabilitiesRoutes } from '../handlers/LinxCapabilitiesHandler';\nimport { createLocalSetupProvisionStateWriter, registerProvisionRoutes, registerProvisionStatusRoute } from '../handlers/ProvisionHandler';\nimport { registerPodManagementRoutes } from '../handlers/PodManagementHandler';\nimport { DrizzlePodAiConnectionStatusReader, registerPodSettingsRoutes } from '../handlers/PodSettingsHandler';\nimport {\n createAddressReaders,\n createCertificateCapability,\n createDeploymentNetworkSettingsAuthorizer,\n createDnsStatusReader,\n createPublicAddressReader,\n createTunnelStatusReader,\n registerNetworkSettingsRoutes,\n} from '../handlers/NetworkSettingsHandler';\nimport { registerQuotaRoutes } from '../handlers/QuotaHandler';\nimport { registerUsageRoutes } from '../handlers/UsageHandler';\nimport { registerRdfStatsRoutes } from '../handlers/RdfStatsHandler';\nimport { registerAiGatewayManagementRoutes } from '../handlers/AiGatewayManagementHandler';\nimport { registerAiClientConfigurationRoutes } from '../handlers/AiClientConfigurationHandler';\nimport { registerDeviceNotificationRuntime, type DeviceNotificationRuntimeOptions } from '../handlers/DeviceNotificationRuntime';\nimport { AiClientConfigurationService } from '../service/AiClientConfigurationService';\nimport type { EdgeNodeRepository } from '../../identity/drizzle/EdgeNodeRepository';\nimport { UsageRepository } from '../../storage/quota/UsageRepository';\nimport { DrizzleQuotaService } from '../../quota/DrizzleQuotaService';\nimport { LocalPodProvisioningService } from '../../provision/LocalPodProvisioningService';\nimport { verifyServiceAccessToken } from '../../provision/ServiceAccessTokenCodec';\nimport {\n findEdgeNodeCertificateCapabilityBridge,\n resolveEdgeNodeCertificateCapabilityBridgeId,\n} from '../../edge/EdgeNodeCertificateCapabilityBridge';\nimport * as path from 'node:path';\nimport { PACKAGE_ROOT } from '../../runtime';\n\n/**\n * 注册所有 API 路由\n */\nexport function registerRoutes(container: AwilixContainer<ApiContainerCradle>): void {\n const server = container.resolve('apiServer') as ApiServer;\n const config = container.resolve('config') as ApiContainerConfig;\n\n // 公共健康检查端点\n registerHealthRoutes(server);\n\n // 共享路由\n registerSharedRoutes(container, server);\n\n // 根据 edition 注册专属路由\n if (config.edition === 'cloud') {\n registerCloudRoutes(container, server);\n } else {\n registerLocalRoutes(container, server);\n }\n}\n\n/**\n * 健康检查路由\n */\nfunction registerHealthRoutes(server: ApiServer): void {\n server.get('/health', async (_req, res) => {\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ status: 'ok' }));\n }, { public: true });\n\n server.get('/ready', async (_req, res) => {\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ status: 'ready' }));\n }, { public: true });\n\n // Dashboard 静态资源\n const staticDir = path.resolve(PACKAGE_ROOT, 'static/dashboard');\n registerDashboardRoutes(server, { staticDir });\n const settingsStaticDir = path.resolve(PACKAGE_ROOT, 'static/settings');\n registerSettingsRoutes(server, { staticDir: settingsStaticDir });\n}\n\n/**\n * 共享路由 (cloud 和 local 都有)\n */\nfunction registerSharedRoutes(\n container: AwilixContainer<ApiContainerCradle>,\n server: ApiServer,\n): void {\n const nodeRepo = container.resolve('nodeRepo') as EdgeNodeRepository;\n const chatService = container.resolve('chatService');\n const chatKitService = container.resolve('chatKitService');\n const chatKitStore = container.resolve('chatKitStore');\n const runExecutionBackend = container.resolve('runExecutionBackend');\n const matrixStore = container.resolve('matrixStore');\n const clientReconcilerCoordinator = container.resolve('clientReconcilerCoordinator');\n const inngestTaskScheduler = container.resolve('inngestTaskScheduler');\n const inngestRuntimeConfig = container.resolve('inngestRuntimeConfig');\n const rdfStorageStatsService = container.resolve('rdfStorageStatsService');\n const hostedPodDataAccess = container.resolve('hostedPodDataAccess');\n const aiConnectionInvocationKeyIssuer = container.resolve('aiConnectionInvocationKeyIssuer');\n const providerConnectService = container.resolve('providerConnectService');\n const providerQuotaService = container.resolve('providerQuotaService', { allowUnregistered: true });\n const config = container.resolve('config') as ApiContainerConfig;\n const aiClientConfigurationService = resolveAiClientConfigurationService(container, config);\n const ddnsManager = container.resolve('ddnsManager', { allowUnregistered: true });\n const dnsProvider = container.resolve('dnsProvider', { allowUnregistered: true });\n const dnsCoordinator = container.resolve('dnsCoordinator', { allowUnregistered: true });\n const localTunnelProvider = container.resolve('localTunnelProvider', { allowUnregistered: true });\n const cloudTunnelProvider = container.resolve('tunnelProvider', { allowUnregistered: true });\n const tunnelProvider = localTunnelProvider ?? cloudTunnelProvider;\n const edgeCertificateBridge = createDynamicEdgeCertificateBridge(config);\n const certificateCapability = createCertificateCapability(\n container.resolve('certificateManager', { allowUnregistered: true }),\n container.resolve('acmeCertificateManager', { allowUnregistered: true }),\n container.resolve('clusterCertificateManager', { allowUnregistered: true }),\n edgeCertificateBridge,\n );\n const podLookupRepository = container.resolve('podLookupRepo');\n const accountRoleRepository = container.resolve('accountRoleRepo', { allowUnregistered: true });\n if (!podLookupRepository) {\n throw new Error('Pod settings route requires podLookupRepo');\n }\n\n registerEdgeNodeSignalRoutes(server, {\n repository: nodeRepo,\n dnsCoordinator: container.resolve('dnsCoordinator', { allowUnregistered: true }) as any,\n healthProbeService: container.resolve('healthProbeService', { allowUnregistered: true }) as any,\n });\n registerReachabilityRoutes(server, {\n repository: nodeRepo,\n baseStorageDomain: config.subdomain?.baseStorageDomain,\n apiBaseUrl: config.cloudApiEndpoint ?? process.env.XPOD_CLOUD_API_ENDPOINT ?? process.env.CSS_BASE_URL,\n });\n registerNodeRoutes(server, { repository: nodeRepo });\n const aiGatewayService = container.resolve('aiGatewayService');\n registerChatRoutes(server, {\n chatService,\n aiGatewayService,\n acceptanceEndpointsEnabled: process.env.XPOD_ACCEPTANCE_ENDPOINTS_ENABLED === 'true',\n });\n registerChatKitRoutes(server, { chatKitService });\n registerChatKitV1Routes(server, { store: chatKitStore });\n registerRunRoutes(server, { runStore: chatKitStore });\n registerMatrixRoutes(server, { store: matrixStore });\n registerCoordinationRoutes(server, { clientReconcilerCoordinator });\n registerInngestRoutes(server, {\n backend: runExecutionBackend,\n taskScheduler: inngestTaskScheduler,\n runtimeConfig: inngestRuntimeConfig,\n });\n registerRdfStatsRoutes(server, {\n rdfStorageStatsService,\n });\n registerAiGatewayManagementRoutes(server, {\n deployment: config.edition,\n connectService: providerConnectService,\n quotaService: providerQuotaService,\n aiClientConfiguration: aiClientConfigurationService?.capability(),\n aiConnectionInvocationKeyIssuer,\n });\n registerAiClientConfigurationRoutes(server, {\n service: aiClientConfigurationService,\n });\n const notificationOrigin = config.publicUrl ?? config.solidBaseUrl ?? process.env.CSS_BASE_URL ?? `http://${config.host === '0.0.0.0' ? '127.0.0.1' : config.host}:${config.port}`;\n registerDeviceNotificationRuntime(server, {\n origin: notificationOrigin,\n authorizeTopic: createOwnerOnlyNotificationTopicAuthorizer(notificationOrigin),\n });\n registerPodSettingsRoutes(server, {\n podLookupRepository,\n usageRepo: new UsageRepository(container.resolve('db')),\n aiConnectionStatusReader: new DrizzlePodAiConnectionStatusReader(hostedPodDataAccess),\n });\n registerNetworkSettingsRoutes(server, {\n endpoint: () => resolveNetworkEndpoint(config),\n ...createAddressReaders({\n endpoint: () => resolveNetworkEndpoint(config),\n port: config.port,\n publicUrls: [\n config.publicUrl,\n config.activeTunnelProfile?.publicUrl,\n ],\n }),\n publicAddresses: createPublicAddressReader({\n configuredUrls: [\n config.publicUrl,\n config.activeTunnelProfile?.publicUrl,\n ],\n ddnsManager,\n tunnelProvider,\n }),\n dnsStatusReader: createDnsStatusReader({ ddnsManager, dnsProvider, dnsCoordinator }),\n tunnelStatusReader: createTunnelStatusReader(tunnelProvider),\n tlsStatusReader: certificateCapability?.tlsStatusReader,\n certificateRenewer: certificateCapability?.certificateRenewer,\n authorizer: createDeploymentNetworkSettingsAuthorizer({\n deployment: config.edition,\n accountRoleRepository,\n }),\n });\n\n // Quota & Usage API (Business 对接)\n try {\n const quotaService = new DrizzleQuotaService({ identityDbUrl: config.databaseUrl });\n const usageRepo = new UsageRepository(container.resolve('db'));\n registerQuotaRoutes(server, { quotaService, usageRepo });\n registerUsageRoutes(server, { usageRepo });\n console.log('[Shared] Quota & Usage routes registered');\n } catch (error) {\n console.log(`[Shared] Quota & Usage routes not registered: ${error}`);\n }\n}\n\ntype DeviceNotificationTopicAuthorizer = NonNullable<DeviceNotificationRuntimeOptions['authorizeTopic']>;\n\nfunction createOwnerOnlyNotificationTopicAuthorizer(origin: string): DeviceNotificationTopicAuthorizer {\n return async ({ identity, topic }) => {\n // Owner-only fallback until a shared Solid Read permission reader is available for runtime injection.\n // This is not a full WebACL/ACP authorization decision.\n return topic.startsWith(new URL(`/${identity.localPart}/`, origin).toString());\n };\n}\n\nfunction resolveAiClientConfigurationService(\n container: AwilixContainer<ApiContainerCradle>,\n config: ApiContainerConfig,\n): AiClientConfigurationService | undefined {\n const injected = container.resolve('aiClientConfigurationService', { allowUnregistered: true });\n if (injected) return injected;\n const capability = config.aiClientConfiguration;\n if (!capability?.enabled || capability.authority !== 'local-filesystem') {\n return undefined;\n }\n return new AiClientConfigurationService({\n homeDir: capability.homeDir,\n backupRoot: capability.backupRoot,\n });\n}\n\nfunction createDynamicEdgeCertificateBridge(config: ApiContainerConfig): unknown {\n const bridgeId = resolveEdgeNodeCertificateCapabilityBridgeId({\n nodeId: config.nodeId,\n baseUrl: config.solidBaseUrl ?? config.publicUrl,\n });\n if (!bridgeId) {\n return undefined;\n }\n return {\n readCertificateStatus: async () => {\n return await findEdgeNodeCertificateCapabilityBridge(bridgeId)?.readCertificateStatus()\n ?? { supported: false, status: 'unsupported' };\n },\n renewCertificate: async () => {\n const bridge = findEdgeNodeCertificateCapabilityBridge(bridgeId);\n if (!bridge) {\n throw Object.assign(new Error('Certificate runtime is not available.'), {\n statusCode: 503,\n code: 'certificate_renewal_unavailable',\n });\n }\n return await bridge.renewCertificate();\n },\n isAvailable: async () => {\n return Boolean(await findEdgeNodeCertificateCapabilityBridge(bridgeId)?.isAvailable());\n },\n };\n}\n\n/**\n * Cloud 模式专属路由\n */\nfunction registerCloudRoutes(\n container: AwilixContainer<ApiContainerCradle>,\n server: ApiServer,\n): void {\n // 子域名管理 API (需要 SubdomainService)\n try {\n const subdomainService = container.resolve('subdomainService') as ApiContainerCradle['subdomainService'];\n if (subdomainService) {\n registerSubdomainRoutes(server, { subdomainService });\n console.log('[Cloud] Subdomain routes registered');\n }\n } catch {\n console.log('[Cloud] Subdomain routes not registered (service not available)');\n }\n\n // DDNS 服务\n try {\n const ddnsRepo = container.resolve('ddnsRepo', { allowUnregistered: true });\n const dnsProvider = container.resolve('dnsProvider', { allowUnregistered: true });\n const config = container.resolve('config') as ApiContainerConfig;\n\n if (ddnsRepo) {\n const baseStorageDomain = config.subdomain?.baseStorageDomain;\n if (baseStorageDomain) {\n registerDdnsRoutes(server, {\n ddnsRepo: ddnsRepo as any,\n dnsProvider: dnsProvider as any,\n defaultDomain: baseStorageDomain,\n });\n console.log(`[Cloud] DDNS routes registered (domain: ${baseStorageDomain})`);\n } else {\n console.log('[Cloud] DDNS routes not registered (no CSS_BASE_STORAGE_DOMAIN)');\n }\n }\n } catch {\n console.log('[Cloud] DDNS routes not registered (repo not available)');\n }\n\n // SP Provision API (SP 注册)\n try {\n const nodeRepo = container.resolve('nodeRepo') as EdgeNodeRepository;\n const config = container.resolve('config') as ApiContainerConfig;\n const baseUrl = process.env.CSS_BASE_URL || 'http://localhost:3000/';\n const baseStorageDomain = config.subdomain?.baseStorageDomain;\n const ddnsRepo = container.resolve('ddnsRepo', { allowUnregistered: true }) as any;\n const dnsProvider = container.resolve('dnsProvider', { allowUnregistered: true }) as any;\n const tunnelProvider = container.resolve('tunnelProvider', { allowUnregistered: true }) as any;\n registerProvisionRoutes(server, {\n repository: nodeRepo,\n ddnsRepo,\n dnsProvider,\n tunnelProvider,\n baseUrl,\n baseStorageDomain,\n });\n console.log(`[Cloud] Provision routes registered${baseStorageDomain ? ` (baseStorageDomain: ${baseStorageDomain})` : ''}`);\n } catch {\n console.log('[Cloud] Provision routes not registered (dependencies not available)');\n }\n}\n\n/**\n * Local 模式专属路由\n */\nfunction registerLocalRoutes(\n container: AwilixContainer<ApiContainerCradle>,\n server: ApiServer,\n): void {\n const config = container.resolve('config') as ApiContainerConfig;\n registerLinxCapabilitiesRoutes(server);\n\n // Admin API (配置管理、重启)\n registerAdminRoutes(server, {\n internalAdminAuthSecret: config.gatewayAdminProxyAuthSecret,\n });\n // DDNS status (托管式 Local 模式)\n try {\n const ddnsManager = container.resolve('ddnsManager', { allowUnregistered: true }) as any;\n registerAdminDdnsRoutes(server, { ddnsManager });\n } catch {\n // ignore\n }\n\n // 子域名客户端 API (通过 SubdomainClient 调用 Cloud)\n try {\n const subdomainClient = container.resolve('subdomainClient') as ApiContainerCradle['subdomainClient'];\n if (subdomainClient) {\n registerSubdomainClientRoutes(server, { subdomainClient });\n console.log('[Local] Subdomain client routes registered');\n }\n } catch {\n console.log('[Local] Subdomain client routes not registered (client not available)');\n }\n\n // Pod Provision API (SP 端,供 Cloud 回调创建 Pod)\n try {\n const config = container.resolve('config') as ApiContainerConfig;\n // rootDir: CSS 数据目录,默认 ./data\n const rootDir = process.env.CSS_ROOT_FILE_PATH || './data';\n // serviceToken 验证:从 SP 配置中读取\n const expectedServiceToken = config.serviceToken;\n\n if (expectedServiceToken) {\n const baseUrl = process.env.CSS_BASE_URL || 'http://localhost:3000/';\n const sparqlEndpoint = process.env.CSS_SPARQL_ENDPOINT || process.env.SPARQL_ENDPOINT;\n const identityDbUrl = process.env.CSS_IDENTITY_DB_URL || process.env.DATABASE_URL;\n const provisioningService = sparqlEndpoint && identityDbUrl\n ? new LocalPodProvisioningService({\n baseUrl,\n rootDir,\n sparqlEndpoint,\n identityDbUrl,\n rdfIndexPath: config.rdfIndexPath,\n oidcIssuer: process.env.oidcIssuer ?? config.oidcIssuer,\n authMode: config.authMode,\n })\n : undefined;\n\n registerPodManagementRoutes(server, {\n rootDir,\n verifyServiceToken: async (token: string) => (\n token === expectedServiceToken\n || verifyServiceAccessToken(token, { serviceToken: expectedServiceToken }).valid\n ),\n provisioningService,\n podLookupRepository: container.resolve('podLookupRepo', { allowUnregistered: true }),\n storageProviderBaseUrl: baseUrl,\n });\n console.log(`[Local] Pod provision routes registered (/provision/pods, /provision/webids, ${provisioningService ? 'css-compatible' : 'directory-only'})`);\n } else {\n console.log('[Local] Pod provision routes not registered (serviceToken not configured)');\n }\n } catch (error) {\n console.log(`[Local] Pod provision routes not registered: ${error}`);\n }\n\n // SP 状态查询 (供 Linx 查询 SP 配置状态)\n try {\n const config = container.resolve('config') as ApiContainerConfig;\n registerProvisionStatusRoute(server, {\n cloudUrl: config.cloudApiEndpoint,\n nodeId: config.nodeId,\n nodeToken: config.nodeToken,\n serviceToken: config.serviceToken,\n publicUrl: process.env.XPOD_PUBLIC_URL ?? config.publicUrl ?? process.env.CSS_BASE_URL,\n spDomain: process.env.XPOD_SP_DOMAIN ?? config.spDomain,\n localPort: readPositiveInteger(process.env.CSS_PORT ?? process.env.XPOD_PORT ?? process.env.PORT),\n tunnelToken: process.env.CLOUDFLARE_TUNNEL_TOKEN ?? process.env.SAKURA_TUNNEL_TOKEN ?? process.env.SAKURA_TOKEN,\n cloudBaseUrl: config.oidcIssuer || config.cloudApiEndpoint,\n provisionCode: process.env.XPOD_PROVISION_CODE ?? config.provisionCode,\n persistState: createLocalSetupProvisionStateWriter(\n config.localSetupPath,\n config.localSetupProviderId,\n ),\n });\n console.log('[Local] Provision status route registered (/provision/status)');\n } catch (error) {\n console.log(`[Local] Provision status route not registered: ${error}`);\n }\n}\n\nfunction readPositiveInteger(value: string | undefined): number | undefined {\n if (!value) {\n return undefined;\n }\n\n const parsed = Number.parseInt(value, 10);\n return Number.isInteger(parsed) && parsed > 0 ? parsed : undefined;\n}\n\nfunction resolveNetworkEndpoint(config: ApiContainerConfig): string {\n const configured = config.publicUrl\n ?? config.activeTunnelProfile?.publicUrl\n ?? config.solidBaseUrl\n ?? `http://${config.host === '0.0.0.0' ? '127.0.0.1' : config.host}:${config.port}/`;\n try {\n return new URL(configured).toString().replace(/\\/+$/u, '') + '/';\n } catch {\n return `http://127.0.0.1:${config.port}/`;\n }\n}\n"]}
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/api/container/routes.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 路由注册\n *\n * 根据容器中的服务注册 API 路由\n */\n\nimport type { AwilixContainer } from 'awilix';\nimport type { ApiContainerCradle, ApiContainerConfig } from './types';\nimport type { ApiServer } from '../ApiServer';\n\nimport { registerEdgeNodeSignalRoutes } from '../handlers/EdgeNodeSignalHandler';\nimport { registerReachabilityRoutes } from '../handlers/ReachabilityHandler';\nimport { registerNodeRoutes } from '../handlers/NodeHandler';\nimport { registerChatRoutes } from '../handlers/ChatHandler';\nimport { registerSubdomainRoutes } from '../handlers/SubdomainHandler';\nimport { registerSubdomainClientRoutes } from '../handlers/SubdomainClientHandler';\nimport { registerDdnsRoutes } from '../handlers/DdnsHandler';\nimport { registerChatKitRoutes } from '../handlers/ChatKitHandler';\nimport { registerChatKitV1Routes } from '../handlers/ChatKitV1Handler';\nimport { registerInngestRoutes } from '../handlers/InngestHandler';\nimport { registerRunRoutes } from '../handlers/RunHandler';\nimport { registerMatrixRoutes } from '../handlers/MatrixHandler';\nimport { registerCoordinationRoutes } from '../handlers/CoordinationHandler';\nimport { registerDashboardRoutes } from '../handlers/DashboardHandler';\nimport { registerSettingsRoutes } from '../handlers/SettingsHandler';\nimport { registerAdminRoutes } from '../handlers/AdminHandler';\nimport { registerAdminDdnsRoutes } from '../handlers/AdminDdnsHandler';\nimport { registerLinxCapabilitiesRoutes } from '../handlers/LinxCapabilitiesHandler';\nimport { createLocalSetupProvisionStateWriter, registerProvisionRoutes, registerProvisionStatusRoute } from '../handlers/ProvisionHandler';\nimport { registerPodManagementRoutes } from '../handlers/PodManagementHandler';\nimport { ProviderConnectPodAiConnectionStatusReader, registerPodSettingsRoutes } from '../handlers/PodSettingsHandler';\nimport {\n createAddressReaders,\n createCertificateCapability,\n createDeploymentNetworkSettingsAuthorizer,\n createDnsStatusReader,\n createPublicAddressReader,\n createTunnelStatusReader,\n registerNetworkSettingsRoutes,\n} from '../handlers/NetworkSettingsHandler';\nimport { registerQuotaRoutes } from '../handlers/QuotaHandler';\nimport { registerUsageRoutes } from '../handlers/UsageHandler';\nimport { registerRdfStatsRoutes } from '../handlers/RdfStatsHandler';\nimport { registerAiGatewayManagementRoutes } from '../handlers/AiGatewayManagementHandler';\nimport { registerAiClientConfigurationRoutes } from '../handlers/AiClientConfigurationHandler';\nimport { registerDeviceNotificationRuntime, type DeviceNotificationRuntimeOptions } from '../handlers/DeviceNotificationRuntime';\nimport { AiClientConfigurationService } from '../service/AiClientConfigurationService';\nimport type { EdgeNodeRepository } from '../../identity/drizzle/EdgeNodeRepository';\nimport { UsageRepository } from '../../storage/quota/UsageRepository';\nimport { DrizzleQuotaService } from '../../quota/DrizzleQuotaService';\nimport { LocalPodProvisioningService } from '../../provision/LocalPodProvisioningService';\nimport { verifyServiceAccessToken } from '../../provision/ServiceAccessTokenCodec';\nimport {\n findEdgeNodeCertificateCapabilityBridge,\n resolveEdgeNodeCertificateCapabilityBridgeId,\n} from '../../edge/EdgeNodeCertificateCapabilityBridge';\nimport * as path from 'node:path';\nimport { PACKAGE_ROOT } from '../../runtime';\n\n/**\n * 注册所有 API 路由\n */\nexport function registerRoutes(container: AwilixContainer<ApiContainerCradle>): void {\n const server = container.resolve('apiServer') as ApiServer;\n const config = container.resolve('config') as ApiContainerConfig;\n\n // 公共健康检查端点\n registerHealthRoutes(server);\n\n // 共享路由\n registerSharedRoutes(container, server);\n\n // 根据 edition 注册专属路由\n if (config.edition === 'cloud') {\n registerCloudRoutes(container, server);\n } else {\n registerLocalRoutes(container, server);\n }\n}\n\n/**\n * 健康检查路由\n */\nfunction registerHealthRoutes(server: ApiServer): void {\n server.get('/health', async (_req, res) => {\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ status: 'ok' }));\n }, { public: true });\n\n server.get('/ready', async (_req, res) => {\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ status: 'ready' }));\n }, { public: true });\n\n // Dashboard 静态资源\n const staticDir = path.resolve(PACKAGE_ROOT, 'static/dashboard');\n registerDashboardRoutes(server, { staticDir });\n const settingsStaticDir = path.resolve(PACKAGE_ROOT, 'static/settings');\n registerSettingsRoutes(server, { staticDir: settingsStaticDir });\n}\n\n/**\n * 共享路由 (cloud 和 local 都有)\n */\nfunction registerSharedRoutes(\n container: AwilixContainer<ApiContainerCradle>,\n server: ApiServer,\n): void {\n const nodeRepo = container.resolve('nodeRepo') as EdgeNodeRepository;\n const chatService = container.resolve('chatService');\n const chatKitService = container.resolve('chatKitService');\n const chatKitStore = container.resolve('chatKitStore');\n const runExecutionBackend = container.resolve('runExecutionBackend');\n const matrixStore = container.resolve('matrixStore');\n const clientReconcilerCoordinator = container.resolve('clientReconcilerCoordinator');\n const inngestTaskScheduler = container.resolve('inngestTaskScheduler');\n const inngestRuntimeConfig = container.resolve('inngestRuntimeConfig');\n const rdfStorageStatsService = container.resolve('rdfStorageStatsService');\n const hostedPodDataAccess = container.resolve('hostedPodDataAccess');\n const aiConnectionInvocationKeyIssuer = container.resolve('aiConnectionInvocationKeyIssuer');\n const providerConnectService = container.resolve('providerConnectService');\n const providerQuotaService = container.resolve('providerQuotaService', { allowUnregistered: true });\n const config = container.resolve('config') as ApiContainerConfig;\n const aiClientConfigurationService = resolveAiClientConfigurationService(container, config);\n const ddnsManager = container.resolve('ddnsManager', { allowUnregistered: true });\n const dnsProvider = container.resolve('dnsProvider', { allowUnregistered: true });\n const dnsCoordinator = container.resolve('dnsCoordinator', { allowUnregistered: true });\n const localTunnelProvider = container.resolve('localTunnelProvider', { allowUnregistered: true });\n const cloudTunnelProvider = container.resolve('tunnelProvider', { allowUnregistered: true });\n const tunnelProvider = localTunnelProvider ?? cloudTunnelProvider;\n const edgeCertificateBridge = createDynamicEdgeCertificateBridge(config);\n const certificateCapability = createCertificateCapability(\n container.resolve('certificateManager', { allowUnregistered: true }),\n container.resolve('acmeCertificateManager', { allowUnregistered: true }),\n container.resolve('clusterCertificateManager', { allowUnregistered: true }),\n edgeCertificateBridge,\n );\n const podLookupRepository = container.resolve('podLookupRepo');\n const accountRoleRepository = container.resolve('accountRoleRepo', { allowUnregistered: true });\n if (!podLookupRepository) {\n throw new Error('Pod settings route requires podLookupRepo');\n }\n\n registerEdgeNodeSignalRoutes(server, {\n repository: nodeRepo,\n dnsCoordinator: container.resolve('dnsCoordinator', { allowUnregistered: true }) as any,\n healthProbeService: container.resolve('healthProbeService', { allowUnregistered: true }) as any,\n });\n registerReachabilityRoutes(server, {\n repository: nodeRepo,\n baseStorageDomain: config.subdomain?.baseStorageDomain,\n apiBaseUrl: config.cloudApiEndpoint ?? process.env.XPOD_CLOUD_API_ENDPOINT ?? process.env.CSS_BASE_URL,\n });\n registerNodeRoutes(server, { repository: nodeRepo });\n const aiGatewayService = container.resolve('aiGatewayService');\n registerChatRoutes(server, {\n chatService,\n aiGatewayService,\n acceptanceEndpointsEnabled: process.env.XPOD_ACCEPTANCE_ENDPOINTS_ENABLED === 'true',\n });\n registerChatKitRoutes(server, { chatKitService });\n registerChatKitV1Routes(server, { store: chatKitStore });\n registerRunRoutes(server, { runStore: chatKitStore });\n registerMatrixRoutes(server, { store: matrixStore });\n registerCoordinationRoutes(server, { clientReconcilerCoordinator });\n registerInngestRoutes(server, {\n backend: runExecutionBackend,\n taskScheduler: inngestTaskScheduler,\n runtimeConfig: inngestRuntimeConfig,\n });\n registerRdfStatsRoutes(server, {\n rdfStorageStatsService,\n });\n registerAiGatewayManagementRoutes(server, {\n deployment: config.edition,\n connectService: providerConnectService,\n quotaService: providerQuotaService,\n aiClientConfiguration: aiClientConfigurationService?.capability(),\n aiConnectionInvocationKeyIssuer,\n });\n registerAiClientConfigurationRoutes(server, {\n service: aiClientConfigurationService,\n });\n const notificationOrigin = config.publicUrl ?? config.solidBaseUrl ?? process.env.CSS_BASE_URL ?? `http://${config.host === '0.0.0.0' ? '127.0.0.1' : config.host}:${config.port}`;\n registerDeviceNotificationRuntime(server, {\n origin: notificationOrigin,\n authorizeTopic: createOwnerOnlyNotificationTopicAuthorizer(notificationOrigin),\n });\n registerPodSettingsRoutes(server, {\n podLookupRepository,\n usageRepo: new UsageRepository(container.resolve('db')),\n aiConnectionStatusReader: new ProviderConnectPodAiConnectionStatusReader(providerConnectService, config.edition),\n });\n registerNetworkSettingsRoutes(server, {\n endpoint: () => resolveNetworkEndpoint(config),\n ...createAddressReaders({\n endpoint: () => resolveNetworkEndpoint(config),\n port: config.port,\n publicUrls: [\n config.publicUrl,\n config.activeTunnelProfile?.publicUrl,\n ],\n }),\n publicAddresses: createPublicAddressReader({\n configuredUrls: [\n config.publicUrl,\n config.activeTunnelProfile?.publicUrl,\n ],\n ddnsManager,\n tunnelProvider,\n }),\n dnsStatusReader: createDnsStatusReader({ ddnsManager, dnsProvider, dnsCoordinator }),\n tunnelStatusReader: createTunnelStatusReader(tunnelProvider),\n tlsStatusReader: certificateCapability?.tlsStatusReader,\n certificateRenewer: certificateCapability?.certificateRenewer,\n authorizer: createDeploymentNetworkSettingsAuthorizer({\n deployment: config.edition,\n accountRoleRepository,\n }),\n });\n\n // Quota & Usage API (Business 对接)\n try {\n const quotaService = new DrizzleQuotaService({ identityDbUrl: config.databaseUrl });\n const usageRepo = new UsageRepository(container.resolve('db'));\n registerQuotaRoutes(server, { quotaService, usageRepo });\n registerUsageRoutes(server, { usageRepo });\n console.log('[Shared] Quota & Usage routes registered');\n } catch (error) {\n console.log(`[Shared] Quota & Usage routes not registered: ${error}`);\n }\n}\n\ntype DeviceNotificationTopicAuthorizer = NonNullable<DeviceNotificationRuntimeOptions['authorizeTopic']>;\n\nfunction createOwnerOnlyNotificationTopicAuthorizer(origin: string): DeviceNotificationTopicAuthorizer {\n return async ({ identity, topic }) => {\n // Owner-only fallback until a shared Solid Read permission reader is available for runtime injection.\n // This is not a full WebACL/ACP authorization decision.\n return topic.startsWith(new URL(`/${identity.localPart}/`, origin).toString());\n };\n}\n\nfunction resolveAiClientConfigurationService(\n container: AwilixContainer<ApiContainerCradle>,\n config: ApiContainerConfig,\n): AiClientConfigurationService | undefined {\n const injected = container.resolve('aiClientConfigurationService', { allowUnregistered: true });\n if (injected) return injected;\n const capability = config.aiClientConfiguration;\n if (!capability?.enabled || capability.authority !== 'local-filesystem') {\n return undefined;\n }\n return new AiClientConfigurationService({\n homeDir: capability.homeDir,\n backupRoot: capability.backupRoot,\n });\n}\n\nfunction createDynamicEdgeCertificateBridge(config: ApiContainerConfig): unknown {\n const bridgeId = resolveEdgeNodeCertificateCapabilityBridgeId({\n nodeId: config.nodeId,\n baseUrl: config.solidBaseUrl ?? config.publicUrl,\n });\n if (!bridgeId) {\n return undefined;\n }\n return {\n readCertificateStatus: async () => {\n return await findEdgeNodeCertificateCapabilityBridge(bridgeId)?.readCertificateStatus()\n ?? { supported: false, status: 'unsupported' };\n },\n renewCertificate: async () => {\n const bridge = findEdgeNodeCertificateCapabilityBridge(bridgeId);\n if (!bridge) {\n throw Object.assign(new Error('Certificate runtime is not available.'), {\n statusCode: 503,\n code: 'certificate_renewal_unavailable',\n });\n }\n return await bridge.renewCertificate();\n },\n isAvailable: async () => {\n return Boolean(await findEdgeNodeCertificateCapabilityBridge(bridgeId)?.isAvailable());\n },\n };\n}\n\n/**\n * Cloud 模式专属路由\n */\nfunction registerCloudRoutes(\n container: AwilixContainer<ApiContainerCradle>,\n server: ApiServer,\n): void {\n // 子域名管理 API (需要 SubdomainService)\n try {\n const subdomainService = container.resolve('subdomainService') as ApiContainerCradle['subdomainService'];\n if (subdomainService) {\n registerSubdomainRoutes(server, { subdomainService });\n console.log('[Cloud] Subdomain routes registered');\n }\n } catch {\n console.log('[Cloud] Subdomain routes not registered (service not available)');\n }\n\n // DDNS 服务\n try {\n const ddnsRepo = container.resolve('ddnsRepo', { allowUnregistered: true });\n const dnsProvider = container.resolve('dnsProvider', { allowUnregistered: true });\n const config = container.resolve('config') as ApiContainerConfig;\n\n if (ddnsRepo) {\n const baseStorageDomain = config.subdomain?.baseStorageDomain;\n if (baseStorageDomain) {\n registerDdnsRoutes(server, {\n ddnsRepo: ddnsRepo as any,\n dnsProvider: dnsProvider as any,\n defaultDomain: baseStorageDomain,\n });\n console.log(`[Cloud] DDNS routes registered (domain: ${baseStorageDomain})`);\n } else {\n console.log('[Cloud] DDNS routes not registered (no CSS_BASE_STORAGE_DOMAIN)');\n }\n }\n } catch {\n console.log('[Cloud] DDNS routes not registered (repo not available)');\n }\n\n // SP Provision API (SP 注册)\n try {\n const nodeRepo = container.resolve('nodeRepo') as EdgeNodeRepository;\n const config = container.resolve('config') as ApiContainerConfig;\n const baseUrl = process.env.CSS_BASE_URL || 'http://localhost:3000/';\n const baseStorageDomain = config.subdomain?.baseStorageDomain;\n const ddnsRepo = container.resolve('ddnsRepo', { allowUnregistered: true }) as any;\n const dnsProvider = container.resolve('dnsProvider', { allowUnregistered: true }) as any;\n const tunnelProvider = container.resolve('tunnelProvider', { allowUnregistered: true }) as any;\n registerProvisionRoutes(server, {\n repository: nodeRepo,\n ddnsRepo,\n dnsProvider,\n tunnelProvider,\n baseUrl,\n baseStorageDomain,\n });\n console.log(`[Cloud] Provision routes registered${baseStorageDomain ? ` (baseStorageDomain: ${baseStorageDomain})` : ''}`);\n } catch {\n console.log('[Cloud] Provision routes not registered (dependencies not available)');\n }\n}\n\n/**\n * Local 模式专属路由\n */\nfunction registerLocalRoutes(\n container: AwilixContainer<ApiContainerCradle>,\n server: ApiServer,\n): void {\n const config = container.resolve('config') as ApiContainerConfig;\n registerLinxCapabilitiesRoutes(server);\n\n // Admin API (配置管理、重启)\n registerAdminRoutes(server, {\n internalAdminAuthSecret: config.gatewayAdminProxyAuthSecret,\n });\n // DDNS status (托管式 Local 模式)\n try {\n const ddnsManager = container.resolve('ddnsManager', { allowUnregistered: true }) as any;\n registerAdminDdnsRoutes(server, { ddnsManager });\n } catch {\n // ignore\n }\n\n // 子域名客户端 API (通过 SubdomainClient 调用 Cloud)\n try {\n const subdomainClient = container.resolve('subdomainClient') as ApiContainerCradle['subdomainClient'];\n if (subdomainClient) {\n registerSubdomainClientRoutes(server, { subdomainClient });\n console.log('[Local] Subdomain client routes registered');\n }\n } catch {\n console.log('[Local] Subdomain client routes not registered (client not available)');\n }\n\n // Pod Provision API (SP 端,供 Cloud 回调创建 Pod)\n try {\n const config = container.resolve('config') as ApiContainerConfig;\n // rootDir: CSS 数据目录,默认 ./data\n const rootDir = process.env.CSS_ROOT_FILE_PATH || './data';\n // serviceToken 验证:从 SP 配置中读取\n const expectedServiceToken = config.serviceToken;\n\n if (expectedServiceToken) {\n const baseUrl = process.env.CSS_BASE_URL || 'http://localhost:3000/';\n const sparqlEndpoint = process.env.CSS_SPARQL_ENDPOINT || process.env.SPARQL_ENDPOINT;\n const identityDbUrl = process.env.CSS_IDENTITY_DB_URL || process.env.DATABASE_URL;\n const provisioningService = sparqlEndpoint && identityDbUrl\n ? new LocalPodProvisioningService({\n baseUrl,\n rootDir,\n sparqlEndpoint,\n identityDbUrl,\n rdfIndexPath: config.rdfIndexPath,\n oidcIssuer: process.env.oidcIssuer ?? config.oidcIssuer,\n authMode: config.authMode,\n })\n : undefined;\n\n registerPodManagementRoutes(server, {\n rootDir,\n verifyServiceToken: async (token: string) => (\n token === expectedServiceToken\n || verifyServiceAccessToken(token, { serviceToken: expectedServiceToken }).valid\n ),\n provisioningService,\n podLookupRepository: container.resolve('podLookupRepo', { allowUnregistered: true }),\n storageProviderBaseUrl: baseUrl,\n });\n console.log(`[Local] Pod provision routes registered (/provision/pods, /provision/webids, ${provisioningService ? 'css-compatible' : 'directory-only'})`);\n } else {\n console.log('[Local] Pod provision routes not registered (serviceToken not configured)');\n }\n } catch (error) {\n console.log(`[Local] Pod provision routes not registered: ${error}`);\n }\n\n // SP 状态查询 (供 Linx 查询 SP 配置状态)\n try {\n const config = container.resolve('config') as ApiContainerConfig;\n registerProvisionStatusRoute(server, {\n cloudUrl: config.cloudApiEndpoint,\n nodeId: config.nodeId,\n nodeToken: config.nodeToken,\n serviceToken: config.serviceToken,\n publicUrl: process.env.XPOD_PUBLIC_URL ?? config.publicUrl ?? process.env.CSS_BASE_URL,\n spDomain: process.env.XPOD_SP_DOMAIN ?? config.spDomain,\n localPort: readPositiveInteger(process.env.CSS_PORT ?? process.env.XPOD_PORT ?? process.env.PORT),\n tunnelToken: process.env.CLOUDFLARE_TUNNEL_TOKEN ?? process.env.SAKURA_TUNNEL_TOKEN ?? process.env.SAKURA_TOKEN,\n cloudBaseUrl: config.oidcIssuer || config.cloudApiEndpoint,\n provisionCode: process.env.XPOD_PROVISION_CODE ?? config.provisionCode,\n persistState: createLocalSetupProvisionStateWriter(\n config.localSetupPath,\n config.localSetupProviderId,\n ),\n });\n console.log('[Local] Provision status route registered (/provision/status)');\n } catch (error) {\n console.log(`[Local] Provision status route not registered: ${error}`);\n }\n}\n\nfunction readPositiveInteger(value: string | undefined): number | undefined {\n if (!value) {\n return undefined;\n }\n\n const parsed = Number.parseInt(value, 10);\n return Number.isInteger(parsed) && parsed > 0 ? parsed : undefined;\n}\n\nfunction resolveNetworkEndpoint(config: ApiContainerConfig): string {\n const configured = config.publicUrl\n ?? config.activeTunnelProfile?.publicUrl\n ?? config.solidBaseUrl\n ?? `http://${config.host === '0.0.0.0' ? '127.0.0.1' : config.host}:${config.port}/`;\n try {\n return new URL(configured).toString().replace(/\\/+$/u, '') + '/';\n } catch {\n return `http://127.0.0.1:${config.port}/`;\n }\n}\n"]}
@@ -106,18 +106,27 @@ function registerAiGatewayManagementRoutes(server, options) {
106
106
  if (!connectService) {
107
107
  return;
108
108
  }
109
- const result = await connectService.completeApiKey({
110
- webId: request.auth.webId,
111
- deployment: options.deployment,
112
- provider: params.provider,
113
- attemptId: stringBody(body.attemptId),
114
- state: stringBody(body.state),
115
- signature: stringBody(body.signature),
116
- apiKey,
117
- accountLabel: normalizeOptionalString(body.accountLabel),
118
- auth: request.auth,
119
- });
120
- sendJson(response, 200, publicConnectResult(result));
109
+ try {
110
+ const result = await connectService.completeApiKey({
111
+ webId: request.auth.webId,
112
+ deployment: options.deployment,
113
+ provider: params.provider,
114
+ attemptId: stringBody(body.attemptId),
115
+ state: stringBody(body.state),
116
+ signature: stringBody(body.signature),
117
+ apiKey,
118
+ accountLabel: normalizeOptionalString(body.accountLabel),
119
+ auth: request.auth,
120
+ });
121
+ sendJson(response, 200, publicConnectResult(result));
122
+ }
123
+ catch (error) {
124
+ const stage = credentialPersistenceFailureStage(error);
125
+ if (!stage) {
126
+ throw error;
127
+ }
128
+ sendJson(response, 500, { error: 'credential_persistence_failed', stage });
129
+ }
121
130
  });
122
131
  server.post('/api/ai/gateway/providers/:provider/connect/poll', async (request, response, params) => {
123
132
  if (!authorizeProviderConnect(request, response)) {
@@ -238,6 +247,13 @@ function registerAiGatewayManagementRoutes(server, options) {
238
247
  }
239
248
  });
240
249
  }
250
+ function credentialPersistenceFailureStage(error) {
251
+ if (!(error instanceof Error)) {
252
+ return undefined;
253
+ }
254
+ const match = /^credential_persistence_failed:([a-z][a-z0-9-]*)$/u.exec(error.message);
255
+ return match?.[1];
256
+ }
241
257
  function authorizeManagementCaller(request, response, options) {
242
258
  const auth = request.auth;
243
259
  if (!auth) {
@@ -1 +1 @@
1
- {"version":3,"file":"AiGatewayManagementHandler.js","sourceRoot":"","sources":["../../../src/api/handlers/AiGatewayManagementHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ServerResponse } from 'node:http';\nimport type { ApiServer } from '../ApiServer';\nimport type { AuthenticatedRequest } from '../middleware/AuthMiddleware';\nimport { readBoundedJsonBody } from '../http/readBoundedJsonBody';\nimport type { SolidAuthContext } from '../auth/AuthContext';\nimport type { GatewayDeployment } from '../ai-gateway/auth/InvocationTokenCodec';\nimport type {\n CompleteApiKeyInput,\n ConnectBeginInput,\n ProviderConnectService,\n} from '../ai-gateway/connect';\nimport type { ProviderQuotaService } from '../ai-gateway/quota';\nimport { createAiConnectionServiceAccess } from '../ai-gateway/service-access/AiConnectionServiceAccess';\nimport type { AiConnectionInvocationKeyIssuer } from '../ai-gateway/auth/AiConnectionInvocationKeyIssuer';\nimport {\n type AiClientConfigurationCapabilityDescriptor,\n unavailableAiClientConfigurationCapability,\n} from '../service/AiClientConfigurationService';\n\nexport interface AiGatewayManagementHandlerOptions {\n deployment: GatewayDeployment;\n connectService?: ProviderConnectService;\n quotaService?: ProviderQuotaService;\n aiClientConfiguration?: AiClientConfigurationCapabilityDescriptor;\n aiConnectionInvocationKeyIssuer?: Pick<AiConnectionInvocationKeyIssuer, 'issueClientConfiguration'>;\n now?: () => Date;\n jsonBodyLimitBytes?: number;\n}\n\nexport function registerAiGatewayManagementRoutes(\n server: ApiServer,\n options: AiGatewayManagementHandlerOptions,\n): void {\n const jsonBodyLimitBytes = options.jsonBodyLimitBytes ?? 64 * 1024;\n\n server.get('/api/applets/service-access/ai-connection', async (request, response) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const descriptor = createAiConnectionServiceAccess({\n ownerWebId: request.auth.webId,\n serviceWebId: request.auth.webId,\n });\n const invocation = options.aiConnectionInvocationKeyIssuer\n ? await options.aiConnectionInvocationKeyIssuer.issueClientConfiguration({ auth: request.auth })\n : undefined;\n sendJson(response, 200, {\n ...descriptor,\n aiClientConfiguration: options.aiClientConfiguration ?? unavailableAiClientConfigurationCapability(),\n ...(invocation ? { invocation } : {}),\n });\n });\n\n server.get('/api/ai/connections/providers', async (request, response) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const providers = await connectService.listProviders({\n webId: request.auth!.webId,\n deployment: options.deployment,\n auth: request.auth,\n });\n sendJson(response, 200, {\n data: publicConnectResult(providers),\n });\n });\n\n server.post('/api/ai/gateway/providers/:provider/connect/begin', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const body = await readJsonObject(request, response, jsonBodyLimitBytes);\n if (!body) {\n return;\n }\n const mode = typeof body.mode === 'string' ? body.mode : undefined;\n if (mode !== 'browserAssistedApiKey' && mode !== 'deviceCodeOAuth' && mode !== 'connectUnsupported') {\n sendJson(response, 400, { error: 'mode must be a supported Connect mode' });\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const result = await connectService.begin({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n requestedMode: mode,\n expectedCredentialVersion: typeof body.expectedCredentialVersion === 'number'\n ? body.expectedCredentialVersion\n : undefined,\n auth: request.auth,\n } satisfies ConnectBeginInput);\n sendJson(response, 200, publicConnectResult(result));\n });\n\n server.get('/api/ai/gateway/providers/:provider/connect/status/:attemptId', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const url = new URL(request.url ?? '/', `http://${request.headers.host ?? 'localhost'}`);\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const result = await connectService.status({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n attemptId: decodeURIComponent(params.attemptId),\n state: url.searchParams.get('state') ?? '',\n signature: url.searchParams.get('signature') ?? '',\n auth: request.auth,\n });\n sendJson(response, 200, publicConnectResult(result));\n });\n\n server.post('/api/ai/gateway/providers/:provider/connect/complete-api-key', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const body = await readJsonObject(request, response, jsonBodyLimitBytes);\n if (!body) {\n return;\n }\n const apiKey = normalizeOptionalString(body.apiKey);\n if (!apiKey) {\n sendJson(response, 400, { error: 'apiKey is required' });\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const result = await connectService.completeApiKey({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n attemptId: stringBody(body.attemptId),\n state: stringBody(body.state),\n signature: stringBody(body.signature),\n apiKey,\n accountLabel: normalizeOptionalString(body.accountLabel),\n auth: request.auth,\n } satisfies CompleteApiKeyInput);\n sendJson(response, 200, publicConnectResult(result));\n });\n\n server.post('/api/ai/gateway/providers/:provider/connect/poll', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const body = await readJsonObject(request, response, jsonBodyLimitBytes);\n if (!body) {\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const result = await connectService.pollDevice({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n attemptId: stringBody(body.attemptId),\n state: stringBody(body.state),\n signature: stringBody(body.signature),\n auth: request.auth,\n });\n sendJson(response, 200, publicConnectResult(result));\n });\n\n server.post('/api/ai/gateway/providers/:provider/connect/refresh', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const body = await readJsonObject(request, response, jsonBodyLimitBytes);\n if (!body) {\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const record = await connectService.refresh({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n auth: request.auth,\n });\n sendJson(response, 200, { record: record ? publicCredentialRecord(record) : undefined });\n });\n\n server.delete('/api/ai/gateway/providers/:provider/connect', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const record = await connectService.disconnect({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n auth: request.auth,\n });\n sendJson(response, 200, { record: record ? publicCredentialRecord(record) : undefined });\n });\n\n server.get('/api/ai/gateway/providers/:provider/connect/callback', async (_request, response) => {\n // This endpoint is intentionally public only for signed one-time OAuth callbacks.\n // Browser-assisted API key completion is never accepted here because API keys\n // must be submitted through the authenticated management API.\n sendJson(response, 405, {\n error: 'Public Connect callback is unsupported for current provider Connect modes',\n });\n }, { public: true });\n\n server.get('/api/ai/gateway/providers/:provider/quota/status', async (request, response, params) => {\n if (!authorizeProviderQuota(request, response)) {\n return;\n }\n const quotaService = requireQuotaService(options, response);\n if (!quotaService) {\n return;\n }\n const url = new URL(request.url ?? '/', `http://${request.headers.host ?? 'localhost'}`);\n try {\n const result = await quotaService.status({\n webId: request.auth.webId,\n deployment: options.deployment,\n provider: params.provider,\n credentialIri: normalizeOptionalString(url.searchParams.get('credentialIri')),\n refresh: false,\n auth: request.auth,\n });\n sendJson(response, 200, result);\n } catch (error) {\n sendQuotaError(response, error);\n }\n });\n\n server.post('/api/ai/gateway/providers/:provider/quota/refresh', async (request, response, params) => {\n if (!authorizeProviderQuota(request, response)) {\n return;\n }\n const body = await readJsonObject(request, response, jsonBodyLimitBytes);\n if (!body) {\n return;\n }\n const quotaService = requireQuotaService(options, response);\n if (!quotaService) {\n return;\n }\n try {\n const result = await quotaService.status({\n webId: request.auth.webId,\n deployment: options.deployment,\n provider: params.provider,\n credentialIri: normalizeOptionalString(body.credentialIri),\n refresh: true,\n auth: request.auth,\n });\n sendJson(response, 200, result);\n } catch (error) {\n sendQuotaError(response, error);\n }\n });\n}\n\nfunction authorizeManagementCaller(\n request: AuthenticatedRequest,\n response: ServerResponse,\n options: {\n nonSolidPrincipalError: string;\n },\n): boolean {\n const auth = request.auth;\n if (!auth) {\n sendJson(response, 401, { error: 'Authentication required' });\n return false;\n }\n if (auth.type === 'solid' && auth.webId) {\n return true;\n }\n sendJson(response, 403, { error: options.nonSolidPrincipalError });\n return false;\n}\n\nfunction authorizeCurrentSolidManagement(\n request: AuthenticatedRequest,\n response: ServerResponse,\n options: {\n nonSolidPrincipalError: string;\n },\n): request is AuthenticatedRequest & { auth: SolidAuthContext } {\n if (!authorizeManagementCaller(request, response, options)) {\n return false;\n }\n const auth = request.auth;\n if (!auth || auth.type !== 'solid' || !auth.webId) {\n sendJson(response, 403, { error: 'Insufficient permissions' });\n return false;\n }\n return true;\n}\n\nfunction authorizeProviderConnect(\n request: AuthenticatedRequest,\n response: ServerResponse,\n): request is AuthenticatedRequest & { auth: Extract<NonNullable<AuthenticatedRequest['auth']>, { type: 'solid' }> } {\n return authorizeCurrentSolidManagement(request, response, {\n nonSolidPrincipalError: 'Provider Connect requires the current Solid identity',\n });\n}\n\nfunction authorizeProviderQuota(\n request: AuthenticatedRequest,\n response: ServerResponse,\n): request is AuthenticatedRequest & { auth: Extract<NonNullable<AuthenticatedRequest['auth']>, { type: 'solid' }> } {\n return authorizeCurrentSolidManagement(request, response, {\n nonSolidPrincipalError: 'Provider quota requires the current Solid identity',\n });\n}\n\nfunction requireConnectService(\n options: AiGatewayManagementHandlerOptions,\n response: ServerResponse,\n): ProviderConnectService | undefined {\n if (!options.connectService) {\n sendJson(response, 503, { error: 'AI provider Connect service is not configured' });\n return undefined;\n }\n return options.connectService;\n}\n\nfunction requireQuotaService(\n options: AiGatewayManagementHandlerOptions,\n response: ServerResponse,\n): ProviderQuotaService | undefined {\n if (!options.quotaService) {\n sendJson(response, 503, { error: 'AI provider quota service is not configured' });\n return undefined;\n }\n return options.quotaService;\n}\n\nfunction sendQuotaError(response: ServerResponse, error: unknown): void {\n const message = error instanceof Error ? error.message : String(error);\n if (message === 'quota_credential_not_found') {\n sendJson(response, 404, { error: 'Provider credential not found for current identity' });\n return;\n }\n if (message.startsWith('quota_adapter_not_found:')) {\n sendJson(response, 404, { error: 'Provider quota adapter not found' });\n return;\n }\n sendJson(response, 500, { error: 'Provider quota lookup failed' });\n}\n\nasync function readJsonObject(\n request: AuthenticatedRequest,\n response: ServerResponse,\n limitBytes: number,\n): Promise<Record<string, unknown> | undefined> {\n const bodyResult = await readBoundedJsonBody(request, { limitBytes });\n if (!bodyResult.ok) {\n sendJson(response, bodyResult.status, { error: bodyResult.error });\n return undefined;\n }\n const body = bodyResult.value;\n if (!body || typeof body !== 'object' || Array.isArray(body)) {\n sendJson(response, 400, { error: 'Request body must be a JSON object' });\n return undefined;\n }\n return body as Record<string, unknown>;\n}\n\nfunction normalizeOptionalString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction stringBody(value: unknown): string {\n return typeof value === 'string' ? value : '';\n}\n\nfunction publicCredentialRecord(record: {\n id: string;\n credentialIri: string;\n webId: string;\n provider: string;\n deployment: string;\n authMode: string;\n status: string;\n accountLabel?: string;\n expiresAt?: Date;\n version?: number;\n reauthRequired?: boolean;\n metadata?: Record<string, unknown>;\n}): Record<string, unknown> {\n return {\n id: record.id,\n credentialIri: record.credentialIri,\n provider: record.provider,\n authMode: record.authMode,\n status: record.status,\n accountLabel: record.accountLabel,\n expiresAt: record.expiresAt?.toISOString(),\n version: record.version,\n reauthRequired: record.reauthRequired,\n };\n}\n\nfunction publicConnectResult(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(publicConnectResult);\n }\n if (!value || typeof value !== 'object' || value instanceof Date) {\n return value;\n }\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([key]) => ![\n 'deployment',\n 'webId',\n 'encryptedSecret',\n 'metadata',\n ].includes(key))\n .map(([key, item]) => [key, publicConnectResult(item)]),\n );\n}\n\nfunction sendJson(response: ServerResponse, status: number, data: unknown): void {\n response.statusCode = status;\n response.setHeader('Content-Type', 'application/json');\n response.end(JSON.stringify(data));\n}\n"]}
1
+ {"version":3,"file":"AiGatewayManagementHandler.js","sourceRoot":"","sources":["../../../src/api/handlers/AiGatewayManagementHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ServerResponse } from 'node:http';\nimport type { ApiServer } from '../ApiServer';\nimport type { AuthenticatedRequest } from '../middleware/AuthMiddleware';\nimport { readBoundedJsonBody } from '../http/readBoundedJsonBody';\nimport type { SolidAuthContext } from '../auth/AuthContext';\nimport type { GatewayDeployment } from '../ai-gateway/auth/InvocationTokenCodec';\nimport type {\n CompleteApiKeyInput,\n ConnectBeginInput,\n ProviderConnectService,\n} from '../ai-gateway/connect';\nimport type { ProviderQuotaService } from '../ai-gateway/quota';\nimport { createAiConnectionServiceAccess } from '../ai-gateway/service-access/AiConnectionServiceAccess';\nimport type { AiConnectionInvocationKeyIssuer } from '../ai-gateway/auth/AiConnectionInvocationKeyIssuer';\nimport {\n type AiClientConfigurationCapabilityDescriptor,\n unavailableAiClientConfigurationCapability,\n} from '../service/AiClientConfigurationService';\n\nexport interface AiGatewayManagementHandlerOptions {\n deployment: GatewayDeployment;\n connectService?: ProviderConnectService;\n quotaService?: ProviderQuotaService;\n aiClientConfiguration?: AiClientConfigurationCapabilityDescriptor;\n aiConnectionInvocationKeyIssuer?: Pick<AiConnectionInvocationKeyIssuer, 'issueClientConfiguration'>;\n now?: () => Date;\n jsonBodyLimitBytes?: number;\n}\n\nexport function registerAiGatewayManagementRoutes(\n server: ApiServer,\n options: AiGatewayManagementHandlerOptions,\n): void {\n const jsonBodyLimitBytes = options.jsonBodyLimitBytes ?? 64 * 1024;\n\n server.get('/api/applets/service-access/ai-connection', async (request, response) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const descriptor = createAiConnectionServiceAccess({\n ownerWebId: request.auth.webId,\n serviceWebId: request.auth.webId,\n });\n const invocation = options.aiConnectionInvocationKeyIssuer\n ? await options.aiConnectionInvocationKeyIssuer.issueClientConfiguration({ auth: request.auth })\n : undefined;\n sendJson(response, 200, {\n ...descriptor,\n aiClientConfiguration: options.aiClientConfiguration ?? unavailableAiClientConfigurationCapability(),\n ...(invocation ? { invocation } : {}),\n });\n });\n\n server.get('/api/ai/connections/providers', async (request, response) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const providers = await connectService.listProviders({\n webId: request.auth!.webId,\n deployment: options.deployment,\n auth: request.auth,\n });\n sendJson(response, 200, {\n data: publicConnectResult(providers),\n });\n });\n\n server.post('/api/ai/gateway/providers/:provider/connect/begin', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const body = await readJsonObject(request, response, jsonBodyLimitBytes);\n if (!body) {\n return;\n }\n const mode = typeof body.mode === 'string' ? body.mode : undefined;\n if (mode !== 'browserAssistedApiKey' && mode !== 'deviceCodeOAuth' && mode !== 'connectUnsupported') {\n sendJson(response, 400, { error: 'mode must be a supported Connect mode' });\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const result = await connectService.begin({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n requestedMode: mode,\n expectedCredentialVersion: typeof body.expectedCredentialVersion === 'number'\n ? body.expectedCredentialVersion\n : undefined,\n auth: request.auth,\n } satisfies ConnectBeginInput);\n sendJson(response, 200, publicConnectResult(result));\n });\n\n server.get('/api/ai/gateway/providers/:provider/connect/status/:attemptId', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const url = new URL(request.url ?? '/', `http://${request.headers.host ?? 'localhost'}`);\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const result = await connectService.status({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n attemptId: decodeURIComponent(params.attemptId),\n state: url.searchParams.get('state') ?? '',\n signature: url.searchParams.get('signature') ?? '',\n auth: request.auth,\n });\n sendJson(response, 200, publicConnectResult(result));\n });\n\n server.post('/api/ai/gateway/providers/:provider/connect/complete-api-key', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const body = await readJsonObject(request, response, jsonBodyLimitBytes);\n if (!body) {\n return;\n }\n const apiKey = normalizeOptionalString(body.apiKey);\n if (!apiKey) {\n sendJson(response, 400, { error: 'apiKey is required' });\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n try {\n const result = await connectService.completeApiKey({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n attemptId: stringBody(body.attemptId),\n state: stringBody(body.state),\n signature: stringBody(body.signature),\n apiKey,\n accountLabel: normalizeOptionalString(body.accountLabel),\n auth: request.auth,\n } satisfies CompleteApiKeyInput);\n sendJson(response, 200, publicConnectResult(result));\n } catch (error) {\n const stage = credentialPersistenceFailureStage(error);\n if (!stage) {\n throw error;\n }\n sendJson(response, 500, { error: 'credential_persistence_failed', stage });\n }\n });\n\n server.post('/api/ai/gateway/providers/:provider/connect/poll', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const body = await readJsonObject(request, response, jsonBodyLimitBytes);\n if (!body) {\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const result = await connectService.pollDevice({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n attemptId: stringBody(body.attemptId),\n state: stringBody(body.state),\n signature: stringBody(body.signature),\n auth: request.auth,\n });\n sendJson(response, 200, publicConnectResult(result));\n });\n\n server.post('/api/ai/gateway/providers/:provider/connect/refresh', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const body = await readJsonObject(request, response, jsonBodyLimitBytes);\n if (!body) {\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const record = await connectService.refresh({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n auth: request.auth,\n });\n sendJson(response, 200, { record: record ? publicCredentialRecord(record) : undefined });\n });\n\n server.delete('/api/ai/gateway/providers/:provider/connect', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const record = await connectService.disconnect({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n auth: request.auth,\n });\n sendJson(response, 200, { record: record ? publicCredentialRecord(record) : undefined });\n });\n\n server.get('/api/ai/gateway/providers/:provider/connect/callback', async (_request, response) => {\n // This endpoint is intentionally public only for signed one-time OAuth callbacks.\n // Browser-assisted API key completion is never accepted here because API keys\n // must be submitted through the authenticated management API.\n sendJson(response, 405, {\n error: 'Public Connect callback is unsupported for current provider Connect modes',\n });\n }, { public: true });\n\n server.get('/api/ai/gateway/providers/:provider/quota/status', async (request, response, params) => {\n if (!authorizeProviderQuota(request, response)) {\n return;\n }\n const quotaService = requireQuotaService(options, response);\n if (!quotaService) {\n return;\n }\n const url = new URL(request.url ?? '/', `http://${request.headers.host ?? 'localhost'}`);\n try {\n const result = await quotaService.status({\n webId: request.auth.webId,\n deployment: options.deployment,\n provider: params.provider,\n credentialIri: normalizeOptionalString(url.searchParams.get('credentialIri')),\n refresh: false,\n auth: request.auth,\n });\n sendJson(response, 200, result);\n } catch (error) {\n sendQuotaError(response, error);\n }\n });\n\n server.post('/api/ai/gateway/providers/:provider/quota/refresh', async (request, response, params) => {\n if (!authorizeProviderQuota(request, response)) {\n return;\n }\n const body = await readJsonObject(request, response, jsonBodyLimitBytes);\n if (!body) {\n return;\n }\n const quotaService = requireQuotaService(options, response);\n if (!quotaService) {\n return;\n }\n try {\n const result = await quotaService.status({\n webId: request.auth.webId,\n deployment: options.deployment,\n provider: params.provider,\n credentialIri: normalizeOptionalString(body.credentialIri),\n refresh: true,\n auth: request.auth,\n });\n sendJson(response, 200, result);\n } catch (error) {\n sendQuotaError(response, error);\n }\n });\n}\n\nfunction credentialPersistenceFailureStage(error: unknown): string | undefined {\n if (!(error instanceof Error)) {\n return undefined;\n }\n const match = /^credential_persistence_failed:([a-z][a-z0-9-]*)$/u.exec(error.message);\n return match?.[1];\n}\n\nfunction authorizeManagementCaller(\n request: AuthenticatedRequest,\n response: ServerResponse,\n options: {\n nonSolidPrincipalError: string;\n },\n): boolean {\n const auth = request.auth;\n if (!auth) {\n sendJson(response, 401, { error: 'Authentication required' });\n return false;\n }\n if (auth.type === 'solid' && auth.webId) {\n return true;\n }\n sendJson(response, 403, { error: options.nonSolidPrincipalError });\n return false;\n}\n\nfunction authorizeCurrentSolidManagement(\n request: AuthenticatedRequest,\n response: ServerResponse,\n options: {\n nonSolidPrincipalError: string;\n },\n): request is AuthenticatedRequest & { auth: SolidAuthContext } {\n if (!authorizeManagementCaller(request, response, options)) {\n return false;\n }\n const auth = request.auth;\n if (!auth || auth.type !== 'solid' || !auth.webId) {\n sendJson(response, 403, { error: 'Insufficient permissions' });\n return false;\n }\n return true;\n}\n\nfunction authorizeProviderConnect(\n request: AuthenticatedRequest,\n response: ServerResponse,\n): request is AuthenticatedRequest & { auth: Extract<NonNullable<AuthenticatedRequest['auth']>, { type: 'solid' }> } {\n return authorizeCurrentSolidManagement(request, response, {\n nonSolidPrincipalError: 'Provider Connect requires the current Solid identity',\n });\n}\n\nfunction authorizeProviderQuota(\n request: AuthenticatedRequest,\n response: ServerResponse,\n): request is AuthenticatedRequest & { auth: Extract<NonNullable<AuthenticatedRequest['auth']>, { type: 'solid' }> } {\n return authorizeCurrentSolidManagement(request, response, {\n nonSolidPrincipalError: 'Provider quota requires the current Solid identity',\n });\n}\n\nfunction requireConnectService(\n options: AiGatewayManagementHandlerOptions,\n response: ServerResponse,\n): ProviderConnectService | undefined {\n if (!options.connectService) {\n sendJson(response, 503, { error: 'AI provider Connect service is not configured' });\n return undefined;\n }\n return options.connectService;\n}\n\nfunction requireQuotaService(\n options: AiGatewayManagementHandlerOptions,\n response: ServerResponse,\n): ProviderQuotaService | undefined {\n if (!options.quotaService) {\n sendJson(response, 503, { error: 'AI provider quota service is not configured' });\n return undefined;\n }\n return options.quotaService;\n}\n\nfunction sendQuotaError(response: ServerResponse, error: unknown): void {\n const message = error instanceof Error ? error.message : String(error);\n if (message === 'quota_credential_not_found') {\n sendJson(response, 404, { error: 'Provider credential not found for current identity' });\n return;\n }\n if (message.startsWith('quota_adapter_not_found:')) {\n sendJson(response, 404, { error: 'Provider quota adapter not found' });\n return;\n }\n sendJson(response, 500, { error: 'Provider quota lookup failed' });\n}\n\nasync function readJsonObject(\n request: AuthenticatedRequest,\n response: ServerResponse,\n limitBytes: number,\n): Promise<Record<string, unknown> | undefined> {\n const bodyResult = await readBoundedJsonBody(request, { limitBytes });\n if (!bodyResult.ok) {\n sendJson(response, bodyResult.status, { error: bodyResult.error });\n return undefined;\n }\n const body = bodyResult.value;\n if (!body || typeof body !== 'object' || Array.isArray(body)) {\n sendJson(response, 400, { error: 'Request body must be a JSON object' });\n return undefined;\n }\n return body as Record<string, unknown>;\n}\n\nfunction normalizeOptionalString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction stringBody(value: unknown): string {\n return typeof value === 'string' ? value : '';\n}\n\nfunction publicCredentialRecord(record: {\n id: string;\n credentialIri: string;\n webId: string;\n provider: string;\n deployment: string;\n authMode: string;\n status: string;\n accountLabel?: string;\n expiresAt?: Date;\n version?: number;\n reauthRequired?: boolean;\n metadata?: Record<string, unknown>;\n}): Record<string, unknown> {\n return {\n id: record.id,\n credentialIri: record.credentialIri,\n provider: record.provider,\n authMode: record.authMode,\n status: record.status,\n accountLabel: record.accountLabel,\n expiresAt: record.expiresAt?.toISOString(),\n version: record.version,\n reauthRequired: record.reauthRequired,\n };\n}\n\nfunction publicConnectResult(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(publicConnectResult);\n }\n if (!value || typeof value !== 'object' || value instanceof Date) {\n return value;\n }\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([key]) => ![\n 'deployment',\n 'webId',\n 'encryptedSecret',\n 'metadata',\n ].includes(key))\n .map(([key, item]) => [key, publicConnectResult(item)]),\n );\n}\n\nfunction sendJson(response: ServerResponse, status: number, data: unknown): void {\n response.statusCode = status;\n response.setHeader('Content-Type', 'application/json');\n response.end(JSON.stringify(data));\n}\n"]}