@undefineds.co/xpod 0.4.10 → 0.4.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/components-ignore.json +5 -1
- package/config/notifications.json +68 -0
- package/config/xpod.base.json +9 -11
- package/dist/ai/service/AiCredentialSecret.d.ts +30 -0
- package/dist/ai/service/AiCredentialSecret.js +120 -0
- package/dist/ai/service/CredentialReaderImpl.d.ts +18 -0
- package/dist/ai/service/CredentialReaderImpl.js +81 -5
- package/dist/ai/service/CredentialReaderImpl.jsonld +42 -2
- package/dist/ai/service/EmbeddingModelPolicy.d.ts +79 -0
- package/dist/ai/service/EmbeddingModelPolicy.js +134 -0
- package/dist/ai/service/EmbeddingProviderError.js +6 -0
- package/dist/ai/service/EmbeddingServiceImpl.d.ts +13 -1
- package/dist/ai/service/EmbeddingServiceImpl.js +18 -5
- package/dist/ai/service/EmbeddingServiceImpl.jsonld +35 -0
- package/dist/ai/service/index.d.ts +2 -0
- package/dist/ai/service/index.js +2 -0
- package/dist/api/ai-gateway/connect/index.d.ts +20 -2
- package/dist/api/ai-gateway/connect/index.js +162 -16
- package/dist/api/ai-gateway/credentials/AiCredentialSecretDecoder.d.ts +12 -0
- package/dist/api/ai-gateway/credentials/AiCredentialSecretDecoder.js +30 -0
- package/dist/api/ai-gateway/errors.d.ts +1 -1
- package/dist/api/ai-gateway/models/GatewayEmbeddingModelCatalog.d.ts +11 -0
- package/dist/api/ai-gateway/models/GatewayEmbeddingModelCatalog.js +31 -0
- package/dist/api/ai-gateway/models/PodModelSelectionRepository.js +7 -3
- package/dist/api/ai-gateway/models/ProviderCustomModelsService.d.ts +18 -0
- package/dist/api/ai-gateway/models/ProviderCustomModelsService.js +23 -0
- package/dist/api/ai-gateway/models/ProviderModelDiscoveryAdapters.d.ts +3 -1
- package/dist/api/ai-gateway/models/ProviderModelDiscoveryAdapters.js +2 -45
- package/dist/api/ai-gateway/models/ProviderModelSelectionService.d.ts +10 -0
- package/dist/api/ai-gateway/models/ProviderModelSelectionService.js +57 -20
- package/dist/api/ai-gateway/models/ProviderModelType.d.ts +28 -0
- package/dist/api/ai-gateway/models/ProviderModelType.js +34 -0
- package/dist/api/ai-gateway/models/ProviderModelsAdapter.d.ts +10 -0
- package/dist/api/ai-gateway/models/ProviderModelsAdapter.js +3 -4
- package/dist/api/ai-gateway/models/index.d.ts +1 -0
- package/dist/api/ai-gateway/models/index.js +3 -1
- package/dist/api/ai-gateway/providers/CustomRuntimeAdapter.d.ts +7 -0
- package/dist/api/ai-gateway/providers/CustomRuntimeAdapter.js +9 -2
- package/dist/api/ai-gateway/providers/ModelsDevCatalog.d.ts +7 -1
- package/dist/api/ai-gateway/providers/ModelsDevCatalog.js +4 -10
- package/dist/api/ai-gateway/providers/ProviderRegistry.d.ts +107 -0
- package/dist/api/ai-gateway/providers/ProviderRegistry.js +244 -21
- package/dist/api/ai-gateway/providers/ProviderRuntimeRegistry.d.ts +5 -0
- package/dist/api/ai-gateway/providers/ProviderRuntimeRegistry.js +5 -1
- package/dist/api/ai-gateway/quota/SubscriptionQuotaAdapters.d.ts +12 -4
- package/dist/api/ai-gateway/quota/SubscriptionQuotaAdapters.js +11 -11
- package/dist/api/ai-gateway/routing/ModelRouter.d.ts +14 -0
- package/dist/api/ai-gateway/routing/ModelRouter.js +43 -4
- package/dist/api/ai-gateway/service-access/AiConnectionsServiceAccess.d.ts +9 -1
- package/dist/api/ai-gateway/service-access/AiConnectionsServiceAccess.js +3 -27
- package/dist/api/auth/ClientCredentialsAuthenticator.d.ts +0 -1
- package/dist/api/auth/ClientCredentialsAuthenticator.js +0 -3
- package/dist/api/auth/index.d.ts +1 -0
- package/dist/api/auth/index.js +1 -1
- package/dist/api/chatkit/pod-store.d.ts +31 -0
- package/dist/api/chatkit/pod-store.js +132 -8
- package/dist/api/container/common.js +24 -4
- package/dist/api/container/routes.js +17 -2
- package/dist/api/container/types.d.ts +3 -1
- package/dist/api/handlers/AdminHandler.d.ts +13 -0
- package/dist/api/handlers/AdminHandler.js +47 -18
- package/dist/api/handlers/AiConfigHandler.d.ts +6 -0
- package/dist/api/handlers/AiConfigHandler.js +28 -0
- package/dist/api/handlers/AiGatewayManagementHandler.js +36 -0
- package/dist/api/runs/RdfRunContextRetriever.d.ts +14 -0
- package/dist/api/runs/RdfRunContextRetriever.js +41 -5
- package/dist/api/runtime.js +2 -1
- package/dist/cli/commands/secret.d.ts +1 -0
- package/dist/cli/commands/secret.js +25 -7
- package/dist/components/components.jsonld +3 -1
- package/dist/components/context.jsonld +53 -1
- package/dist/http/SubgraphSparqlHttpHandler.d.ts +59 -2
- package/dist/http/SubgraphSparqlHttpHandler.js +145 -13
- package/dist/http/SubgraphSparqlHttpHandler.jsonld +37 -0
- package/dist/identity/drizzle/AccountRoleRepository.d.ts +30 -2
- package/dist/identity/drizzle/AccountRoleRepository.js +163 -15
- package/dist/identity/drizzle/EdgeNodeRepository.d.ts +0 -12
- package/dist/identity/drizzle/EdgeNodeRepository.js +5 -13
- package/dist/identity/drizzle/PodLookupRepository.d.ts +58 -4
- package/dist/identity/drizzle/PodLookupRepository.js +248 -105
- package/dist/identity/drizzle/db.d.ts +19 -0
- package/dist/identity/drizzle/db.js +39 -4
- package/dist/index.d.ts +2 -1
- package/dist/index.js +7 -3
- package/dist/logging/log-file.d.ts +17 -0
- package/dist/logging/log-file.js +69 -0
- package/dist/main.js +2 -1
- package/dist/notifications/NotificationChannelSweeper.d.ts +50 -0
- package/dist/notifications/NotificationChannelSweeper.js +131 -0
- package/dist/notifications/NotificationChannelSweeper.jsonld +136 -0
- package/dist/notifications/ReclaimingWebSocket2023Storer.d.ts +25 -0
- package/dist/notifications/ReclaimingWebSocket2023Storer.js +56 -0
- package/dist/notifications/ReclaimingWebSocket2023Storer.jsonld +77 -0
- package/dist/notifications/index.d.ts +2 -0
- package/dist/notifications/index.js +2 -0
- package/dist/runtime/Proxy.d.ts +37 -0
- package/dist/runtime/Proxy.js +88 -16
- package/dist/runtime/bootstrap.js +2 -1
- package/dist/runtime/upgrade/BunNativeUpgradeRelay.d.ts +116 -0
- package/dist/runtime/upgrade/BunNativeUpgradeRelay.js +423 -0
- package/dist/runtime/upgrade/UpgradeHandshake.d.ts +63 -0
- package/dist/runtime/upgrade/UpgradeHandshake.js +199 -0
- package/dist/runtime/upgrade/WebSocketFrames.d.ts +67 -0
- package/dist/runtime/upgrade/WebSocketFrames.js +224 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiApiKeyPool.js +8 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiAuthorizationActions.d.ts +11 -2
- package/node_modules/@undefineds.co/ai-connections/dist/AiAuthorizationActions.js +27 -10
- package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.d.ts +7 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.js +13 -11
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectDialog.js +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsList.js +10 -6
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMain.d.ts +15 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMain.js +29 -3
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMainHeader.js +18 -3
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.d.ts +16 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.js +92 -20
- package/node_modules/@undefineds.co/ai-connections/dist/AiCopyButton.d.ts +35 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiCopyButton.js +45 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialPoolSection.js +71 -11
- package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialRow.js +9 -7
- package/node_modules/@undefineds.co/ai-connections/dist/AiEndpointList.d.ts +23 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiEndpointList.js +24 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.d.ts +13 -4
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.js +35 -38
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayModelsSection.d.ts +21 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayModelsSection.js +51 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiInfoTooltip.d.ts +15 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiInfoTooltip.js +16 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiModelCatalog.d.ts +175 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiModelCatalog.js +133 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiOfferingDetails.js +2 -2
- package/node_modules/@undefineds.co/ai-connections/dist/AiProviderCard.js +13 -64
- package/node_modules/@undefineds.co/ai-connections/dist/AiProviderHeader.d.ts +21 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiProviderHeader.js +12 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiRowAction.d.ts +15 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiRowAction.js +12 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiSortableCredentialList.js +2 -1
- package/node_modules/@undefineds.co/ai-connections/dist/ai-connections-client.d.ts +7 -0
- package/node_modules/@undefineds.co/ai-connections/dist/ai-connections-client.js +6 -0
- package/node_modules/@undefineds.co/ai-connections/dist/authorization-methods.d.ts +36 -5
- package/node_modules/@undefineds.co/ai-connections/dist/authorization-methods.js +52 -9
- package/node_modules/@undefineds.co/ai-connections/dist/client/normalize.js +30 -3
- package/node_modules/@undefineds.co/ai-connections/dist/client/types.d.ts +21 -1
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/base-adapter.d.ts +1 -3
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/base-adapter.js +3 -7
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/index.cjs +9 -7
- package/node_modules/@undefineds.co/ai-connections/dist/collection-runtime.d.ts +46 -0
- package/node_modules/@undefineds.co/ai-connections/dist/collection-runtime.js +231 -0
- package/node_modules/@undefineds.co/ai-connections/dist/collections.d.ts +119 -0
- package/node_modules/@undefineds.co/ai-connections/dist/collections.js +173 -0
- package/node_modules/@undefineds.co/ai-connections/dist/controller.d.ts +71 -5
- package/node_modules/@undefineds.co/ai-connections/dist/controller.js +285 -16
- package/node_modules/@undefineds.co/ai-connections/dist/credential-labels.d.ts +5 -0
- package/node_modules/@undefineds.co/ai-connections/dist/credential-labels.js +8 -3
- package/node_modules/@undefineds.co/ai-connections/dist/credential-storage.d.ts +59 -0
- package/node_modules/@undefineds.co/ai-connections/dist/credential-storage.js +131 -0
- package/node_modules/@undefineds.co/ai-connections/dist/endpoint-urls.d.ts +15 -0
- package/node_modules/@undefineds.co/ai-connections/dist/endpoint-urls.js +20 -0
- package/node_modules/@undefineds.co/ai-connections/dist/gateway-endpoints.d.ts +14 -0
- package/node_modules/@undefineds.co/ai-connections/dist/gateway-endpoints.js +20 -0
- package/node_modules/@undefineds.co/ai-connections/dist/index.d.ts +8 -0
- package/node_modules/@undefineds.co/ai-connections/dist/index.js +8 -0
- package/node_modules/@undefineds.co/ai-connections/dist/manifest.js +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/offering-endpoints.d.ts +14 -0
- package/node_modules/@undefineds.co/ai-connections/dist/offering-endpoints.js +17 -0
- package/node_modules/@undefineds.co/ai-connections/dist/provider-catalog.cjs +68 -1
- package/node_modules/@undefineds.co/ai-connections/dist/provider-catalog.d.ts +75 -1
- package/node_modules/@undefineds.co/ai-connections/dist/provider-catalog.js +119 -0
- package/node_modules/@undefineds.co/ai-connections/dist/provider-visuals.d.ts +5 -0
- package/node_modules/@undefineds.co/ai-connections/dist/provider-visuals.js +5 -0
- package/node_modules/@undefineds.co/ai-connections/dist/service-access.js +2 -27
- package/node_modules/@undefineds.co/ai-connections/package.json +1 -0
- package/node_modules/@undefineds.co/extension-sdk/dist/manifest.d.ts +1 -1
- package/node_modules/@undefineds.co/extension-sdk/dist/manifest.js +2 -0
- package/node_modules/@undefineds.co/extension-sdk/dist/web.d.ts +150 -0
- package/node_modules/@undefineds.co/extension-sdk/package.json +2 -1
- package/node_modules/@undefineds.co/models/README.md +1 -1
- package/node_modules/@undefineds.co/models/dist/ai-config/index.d.ts +3 -3
- package/node_modules/@undefineds.co/models/dist/ai-gateway.schema.d.ts +5 -0
- package/node_modules/@undefineds.co/models/dist/ai-gateway.schema.js +9 -0
- package/node_modules/@undefineds.co/models/dist/ai-runtime.repository.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/approval.repository.d.ts +2 -2
- package/node_modules/@undefineds.co/models/dist/audit.presentation.d.ts +2 -2
- package/node_modules/@undefineds.co/models/dist/capture.repository.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/chat-project.repository.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/chat.repository.d.ts +2 -2
- package/node_modules/@undefineds.co/models/dist/control-request.repository.d.ts +2 -2
- package/node_modules/@undefineds.co/models/dist/conversation-share.repository.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/credential.schema.d.ts +12 -0
- package/node_modules/@undefineds.co/models/dist/credential.schema.js +15 -1
- package/node_modules/@undefineds.co/models/dist/discovery/index.d.ts +2 -2
- package/node_modules/@undefineds.co/models/dist/discovery/providers.json +248 -7
- package/node_modules/@undefineds.co/models/dist/discovery/types.d.ts +31 -0
- package/node_modules/@undefineds.co/models/dist/extension/index.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/favorite/index.d.ts +2 -2
- package/node_modules/@undefineds.co/models/dist/fixtures/contracts-chat-contact.d.ts +5 -5
- package/node_modules/@undefineds.co/models/dist/import/index.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/index.d.ts +73 -73
- package/node_modules/@undefineds.co/models/dist/index.js +1 -1
- package/node_modules/@undefineds.co/models/dist/input-request.repository.d.ts +2 -2
- package/node_modules/@undefineds.co/models/dist/knowledge/index.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/message.repository.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/namespaces.js +5 -0
- package/node_modules/@undefineds.co/models/dist/pod-storage-descriptor.d.ts +4815 -26
- package/node_modules/@undefineds.co/models/dist/pod-storage-descriptor.js +482 -132
- package/node_modules/@undefineds.co/models/dist/schema.d.ts +4 -0
- package/node_modules/@undefineds.co/models/dist/session/index.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/settings/index.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/sidecar/persistence-mapping.d.ts +5 -5
- package/node_modules/@undefineds.co/models/dist/thread.repository.d.ts +2 -2
- package/node_modules/@undefineds.co/models/dist/types/message-block.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/vocab/_namespaces.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/vocab/index.d.ts +10 -10
- package/node_modules/@undefineds.co/models/dist/vocab/sidecar.vocab.d.ts +1 -0
- package/node_modules/@undefineds.co/models/dist/vocab/sidecar.vocab.js +1 -0
- package/node_modules/@undefineds.co/models/package.json +4 -2
- package/node_modules/@undefineds.co/pod-collections/README.md +71 -0
- package/node_modules/@undefineds.co/pod-collections/dist/diff.d.ts +85 -0
- package/node_modules/@undefineds.co/pod-collections/dist/diff.js +166 -0
- package/node_modules/@undefineds.co/pod-collections/dist/feed.d.ts +17 -0
- package/node_modules/@undefineds.co/pod-collections/dist/feed.js +27 -0
- package/node_modules/@undefineds.co/pod-collections/dist/index.cjs +1042 -0
- package/node_modules/@undefineds.co/pod-collections/dist/index.d.ts +37 -0
- package/node_modules/@undefineds.co/pod-collections/dist/index.js +89 -0
- package/node_modules/@undefineds.co/pod-collections/dist/layout.d.ts +75 -0
- package/node_modules/@undefineds.co/pod-collections/dist/layout.js +173 -0
- package/node_modules/@undefineds.co/pod-collections/dist/mapping.d.ts +78 -0
- package/node_modules/@undefineds.co/pod-collections/dist/mapping.js +287 -0
- package/node_modules/@undefineds.co/pod-collections/dist/mutations.d.ts +83 -0
- package/node_modules/@undefineds.co/pod-collections/dist/mutations.js +273 -0
- package/node_modules/@undefineds.co/pod-collections/dist/react.d.ts +21 -0
- package/node_modules/@undefineds.co/pod-collections/dist/react.js +22 -0
- package/node_modules/@undefineds.co/pod-collections/dist/read.d.ts +65 -0
- package/node_modules/@undefineds.co/pod-collections/dist/read.js +31 -0
- package/node_modules/@undefineds.co/pod-collections/dist/sync.d.ts +66 -0
- package/node_modules/@undefineds.co/pod-collections/dist/sync.js +260 -0
- package/node_modules/@undefineds.co/pod-collections/dist/types.d.ts +155 -0
- package/node_modules/@undefineds.co/pod-collections/dist/types.js +9 -0
- package/node_modules/@undefineds.co/pod-collections/package.json +42 -0
- package/node_modules/@undefineds.co/shared-ui/dist/index.d.ts +0 -1
- package/node_modules/@undefineds.co/shared-ui/dist/index.js +0 -1
- package/package.json +15 -7
- package/static/app/assets/main.css +1 -1
- package/static/app/assets/main.js +12 -13
- package/static/auth-callback/assets/AiConfigContext-DnQs1ZpW.js +1 -0
- package/static/auth-callback/assets/AiConfigPage-DOtvlxH0.js +1 -0
- package/static/auth-callback/assets/DocumentProcessingPanel-BS2voQgL.js +1 -0
- package/static/auth-callback/assets/IndexLifecyclePanel-Cvt0cJtN.js +1 -0
- package/static/auth-callback/assets/{IndexSubjectPanel-C4YG0whI.js → IndexSubjectPanel-Dhf01GqF.js} +1 -1
- package/static/auth-callback/assets/ModelAssignmentsPanel-BJutWaAF.js +1 -0
- package/static/auth-callback/assets/ModelsPage-BRS0sje3.js +11 -0
- package/static/auth-callback/assets/{NetworkPage-Cbdn_P1e.js → NetworkPage-B3qBfANA.js} +2 -2
- package/static/auth-callback/assets/{PaneListHeader-jy70Q00L.js → PaneListHeader-QQeJGTp4.js} +1 -1
- package/static/auth-callback/assets/SearchIndexingPanel-MyNUSEwT.js +1 -0
- package/static/auth-callback/assets/{StatusSubjectPanel-hfjoB5aS.js → StatusSubjectPanel-DQkEVsFs.js} +1 -1
- package/static/{settings/assets/StatusWorkspace-CKD_Rzdr.js → auth-callback/assets/StatusWorkspace-Dkv63Uwk.js} +1 -1
- package/static/auth-callback/assets/SystemSettingsPage-TIsUfX5d.js +1 -0
- package/static/auth-callback/assets/SystemSettingsSubjectPanel-BJWEt2-7.js +33 -0
- package/static/auth-callback/assets/XpodAiConnectionsPodStore-BJiXm-PF.js +3 -0
- package/static/auth-callback/assets/{activity-BcsZZxxw.js → activity-5hNeNKnL.js} +1 -1
- package/static/auth-callback/assets/admin-C6qCRFiY.js +1 -0
- package/static/auth-callback/assets/ai-connections-CryuHGKW.js +1 -0
- package/static/auth-callback/assets/{auth-callback-atKg_oig.js → auth-callback-CAFZ3R0B.js} +80 -84
- package/static/auth-callback/assets/auth-callback-rk080mvG.css +1 -0
- package/static/auth-callback/assets/{badge-BWbRHThQ.js → badge-CAIPI0CB.js} +1 -1
- package/static/auth-callback/assets/collection-runtime-D9s7h9YA.js +1 -0
- package/static/auth-callback/assets/dialog-BjA109aX.js +1 -0
- package/static/auth-callback/assets/{download-BmvG1Vya.js → download-B3Up5W2G.js} +1 -1
- package/static/auth-callback/assets/{external-link-DZ34d3g3.js → external-link-BTXgSPzB.js} +1 -1
- package/static/auth-callback/assets/index-BppXlxcp.js +41 -0
- package/static/auth-callback/assets/index-CirW4CJf.js +1 -0
- package/static/auth-callback/assets/index-DlLYWOhw.js +4 -0
- package/static/auth-callback/assets/{index-browser-B9Z7GU-T.js → index-browser-DtU38ni3.js} +1 -1
- package/static/auth-callback/assets/{key-round-tjP76Se-.js → key-round-CQCOrZ7x.js} +1 -1
- package/static/auth-callback/assets/layout-DB3pMyTl.js +1 -0
- package/static/auth-callback/assets/pod-collections-host-KnnGFZHL.js +8 -0
- package/static/auth-callback/assets/{rotate-ccw-C_L5ZLx1.js → rotate-ccw-C1zM2KtS.js} +1 -1
- package/static/auth-callback/assets/settings-projection-CUkyprDQ.js +1 -0
- package/static/auth-callback/assets/{skeleton-C7tGDQIs.js → skeleton-Cqp7_M9-.js} +1 -1
- package/static/auth-callback/assets/{waypoints-VMNQlWdU.js → waypoints-Bj6gAUSQ.js} +1 -1
- package/static/auth-callback/assets/{workspace-layout-SAp6BtYK.js → workspace-layout-DK8mDzrY.js} +1 -1
- package/static/auth-callback/auth-callback.html +2 -2
- package/static/dashboard/assets/AiConfigContext-BsE7MqX8.js +1 -0
- package/static/dashboard/assets/AiConfigPage-DvM-lRXa.js +1 -0
- package/static/dashboard/assets/DocumentProcessingPanel-BPfdlfuf.js +1 -0
- package/static/dashboard/assets/IndexLifecyclePanel--m0AGxvh.js +1 -0
- package/static/dashboard/assets/{IndexSubjectPanel-DQFPP6-p.js → IndexSubjectPanel-Bb7m1k3d.js} +1 -1
- package/static/dashboard/assets/ModelAssignmentsPanel-BLi_zbMa.js +1 -0
- package/static/dashboard/assets/ModelsPage-CxdpgnfR.js +11 -0
- package/static/dashboard/assets/{NetworkPage-CHQ3YxIB.js → NetworkPage-BAIPw-D_.js} +2 -2
- package/static/dashboard/assets/{PaneListHeader-DsXemAdR.js → PaneListHeader-BBCMei0r.js} +1 -1
- package/static/dashboard/assets/SearchIndexingPanel-Ck4Y-xjR.js +1 -0
- package/static/dashboard/assets/{StatusSubjectPanel-D3PGEYT4.js → StatusSubjectPanel-D1KWfAXE.js} +1 -1
- package/static/dashboard/assets/{StatusWorkspace-BcpePYUW.js → StatusWorkspace-JbA5gzXx.js} +1 -1
- package/static/dashboard/assets/SystemSettingsPage-BbwQWsSR.js +1 -0
- package/static/dashboard/assets/SystemSettingsSubjectPanel-N117nMt5.js +33 -0
- package/static/dashboard/assets/XpodAiConnectionsPodStore-CdDOb4SV.js +18 -0
- package/static/dashboard/assets/{activity-j5zrznu-.js → activity-DX1I96o_.js} +1 -1
- package/static/dashboard/assets/admin-C6qCRFiY.js +1 -0
- package/static/dashboard/assets/ai-connections-DwCRqOQa.js +1 -0
- package/static/dashboard/assets/{badge-CzeBdG7h.js → badge-k2vhtDqH.js} +1 -1
- package/static/dashboard/assets/collection-runtime-BFQ8teQJ.js +1 -0
- package/static/dashboard/assets/{dashboard-D-xANHk1.js → dashboard-DWZ-fmCT.js} +105 -109
- package/static/dashboard/assets/dashboard-rk080mvG.css +1 -0
- package/static/dashboard/assets/dialog-1CCw-iHT.js +1 -0
- package/static/dashboard/assets/{download-IcNdEZWi.js → download-C6-SNY1q.js} +1 -1
- package/static/dashboard/assets/{external-link-DxBxK8Vu.js → external-link-BgPcZ_j2.js} +1 -1
- package/static/dashboard/assets/index-6LcIUIYO.js +1 -0
- package/static/dashboard/assets/index-D7A8U6Pt.js +41 -0
- package/static/dashboard/assets/index-UD6QOE7H.js +4 -0
- package/static/dashboard/assets/{key-round-D1K7warM.js → key-round-BOd7Jo0Q.js} +1 -1
- package/static/dashboard/assets/layout-DB3pMyTl.js +1 -0
- package/static/dashboard/assets/pod-collections-host-KnnGFZHL.js +8 -0
- package/static/dashboard/assets/{rotate-ccw-CcN1N6p9.js → rotate-ccw-CCgJqsvx.js} +1 -1
- package/static/dashboard/assets/settings-projection-CUkyprDQ.js +1 -0
- package/static/dashboard/assets/{skeleton-CKnmJMUH.js → skeleton-Bc7abAn5.js} +1 -1
- package/static/dashboard/assets/{waypoints-DuZPO_wu.js → waypoints-s-opmJxx.js} +1 -1
- package/static/dashboard/assets/{workspace-layout-BUj3wZ_m.js → workspace-layout-DqIQeTBV.js} +1 -1
- package/static/dashboard/dashboard.html +2 -2
- package/static/settings/assets/AiConfigContext-BB9KZySa.js +1 -0
- package/static/settings/assets/AiConfigPage-DGSXUkLs.js +1 -0
- package/static/settings/assets/DocumentProcessingPanel-Da2Re6Rg.js +1 -0
- package/static/settings/assets/IndexLifecyclePanel-BSZuIzgr.js +1 -0
- package/static/settings/assets/{IndexSubjectPanel-73sM16Ma.js → IndexSubjectPanel-CFd0ay-r.js} +1 -1
- package/static/settings/assets/ModelAssignmentsPanel-CSAryvWJ.js +1 -0
- package/static/settings/assets/ModelsPage-BQwCwLHU.js +11 -0
- package/static/settings/assets/{NetworkPage-i6j-M2RY.js → NetworkPage-BKymvsQc.js} +2 -2
- package/static/settings/assets/{PaneListHeader-DpqC0jd5.js → PaneListHeader-Bjh3hRdQ.js} +1 -1
- package/static/settings/assets/SearchIndexingPanel-MjKL5QLU.js +1 -0
- package/static/settings/assets/{StatusSubjectPanel-Dv4q3PGh.js → StatusSubjectPanel-Bvl6K4mx.js} +1 -1
- package/static/settings/assets/StatusWorkspace-B0NzrP--.js +1 -0
- package/static/settings/assets/SystemSettingsPage-D2z6Z4FE.js +1 -0
- package/static/settings/assets/SystemSettingsSubjectPanel-4sxma4X4.js +33 -0
- package/static/settings/assets/XpodAiConnectionsPodStore-BkNQ8fZx.js +3 -0
- package/static/settings/assets/{activity-DaFkk8f3.js → activity-CgJJGpjx.js} +1 -1
- package/static/settings/assets/admin-C6qCRFiY.js +1 -0
- package/static/settings/assets/ai-connections-CryuHGKW.js +1 -0
- package/static/settings/assets/{badge-d5SHdc-x.js → badge-C4NypVyT.js} +1 -1
- package/static/settings/assets/collection-runtime-CTLCDxAi.js +1 -0
- package/static/settings/assets/dialog-Csq0vWUi.js +1 -0
- package/static/settings/assets/{download-CpkwomDr.js → download-DaLJJ-Wp.js} +1 -1
- package/static/settings/assets/{external-link-_4YT42Mf.js → external-link--w_iW5Au.js} +1 -1
- package/static/settings/assets/index-B0mQa59b.js +4 -0
- package/static/settings/assets/index-BukHiu4y.js +1 -0
- package/static/settings/assets/index-COmVnZi2.js +41 -0
- package/static/settings/assets/{index-browser-B06xjBdZ.js → index-browser-BGpvHwD0.js} +1 -1
- package/static/settings/assets/{key-round-Dlqmp1Kq.js → key-round-Bk4YRjBu.js} +1 -1
- package/static/settings/assets/layout-DB3pMyTl.js +1 -0
- package/static/settings/assets/pod-collections-host-KnnGFZHL.js +8 -0
- package/static/settings/assets/{rotate-ccw-TAY65xWT.js → rotate-ccw-TCabbqsr.js} +1 -1
- package/static/settings/assets/{settings-ExBXGgbj.js → settings-CJWpdbNC.js} +105 -109
- package/static/settings/assets/settings-projection-CUkyprDQ.js +1 -0
- package/static/settings/assets/settings-rk080mvG.css +1 -0
- package/static/settings/assets/{skeleton-DKIWjNr9.js → skeleton-JDHYVe7t.js} +1 -1
- package/static/settings/assets/{waypoints-9erLIxyR.js → waypoints-DDvEl-MU.js} +1 -1
- package/static/settings/assets/{workspace-layout-CYXfYIa3.js → workspace-layout-DV5QU30U.js} +1 -1
- package/static/settings/settings.html +2 -2
- package/node_modules/@undefineds.co/shared-ui/dist/oidc-consent.d.ts +0 -54
- package/node_modules/@undefineds.co/shared-ui/dist/oidc-consent.js +0 -21
- package/static/auth-callback/assets/AiConfigContext-C81deMM9.js +0 -1
- package/static/auth-callback/assets/AiConfigPage-evWI8T56.js +0 -1
- package/static/auth-callback/assets/DocumentProcessingPanel-B9GrDEMe.js +0 -1
- package/static/auth-callback/assets/IndexLifecyclePanel-qCo8ABQZ.js +0 -1
- package/static/auth-callback/assets/ModelAssignmentsPanel-DG7Lxh3t.js +0 -1
- package/static/auth-callback/assets/ModelsPage-CgEuqE6p.js +0 -10
- package/static/auth-callback/assets/SearchIndexingPanel-ByU3u7kp.js +0 -1
- package/static/auth-callback/assets/StatusWorkspace-BZd617sV.js +0 -1
- package/static/auth-callback/assets/SystemSettingsPage-BirzWAQM.js +0 -1
- package/static/auth-callback/assets/SystemSettingsSubjectPanel-CmsVWNCx.js +0 -31
- package/static/auth-callback/assets/admin-BU4m6Ko2.js +0 -1
- package/static/auth-callback/assets/ai-connections-CHNTKemd.js +0 -1
- package/static/auth-callback/assets/auth-callback-C_7MUXJb.css +0 -1
- package/static/auth-callback/assets/index-BpV1hsqs.js +0 -4
- package/static/auth-callback/assets/index-D9oE6FXK.js +0 -41
- package/static/dashboard/assets/AiConfigContext-De-OtAWo.js +0 -1
- package/static/dashboard/assets/AiConfigPage-macP4Mop.js +0 -1
- package/static/dashboard/assets/DocumentProcessingPanel-C5ObvCCl.js +0 -1
- package/static/dashboard/assets/IndexLifecyclePanel-xVNa2l40.js +0 -1
- package/static/dashboard/assets/ModelAssignmentsPanel-DMOATFpQ.js +0 -1
- package/static/dashboard/assets/ModelsPage-91UbnETA.js +0 -25
- package/static/dashboard/assets/SearchIndexingPanel-Dh70PNFZ.js +0 -1
- package/static/dashboard/assets/SystemSettingsPage-BiN5GcKx.js +0 -1
- package/static/dashboard/assets/SystemSettingsSubjectPanel-B9QrSiFp.js +0 -31
- package/static/dashboard/assets/admin-BU4m6Ko2.js +0 -1
- package/static/dashboard/assets/ai-connections-CHNTKemd.js +0 -1
- package/static/dashboard/assets/dashboard-C_7MUXJb.css +0 -1
- package/static/dashboard/assets/index-FWZ-s52O.js +0 -41
- package/static/dashboard/assets/index-ZiQZ96oC.js +0 -4
- package/static/settings/assets/AiConfigContext-C0cQMPfG.js +0 -1
- package/static/settings/assets/AiConfigPage-CPhB4iFb.js +0 -1
- package/static/settings/assets/DocumentProcessingPanel-sYI7OpuH.js +0 -1
- package/static/settings/assets/IndexLifecyclePanel-yj8iyiT8.js +0 -1
- package/static/settings/assets/ModelAssignmentsPanel-BFIgUX5v.js +0 -1
- package/static/settings/assets/ModelsPage-BdppXl7E.js +0 -10
- package/static/settings/assets/SearchIndexingPanel-BlPnrkT3.js +0 -1
- package/static/settings/assets/SystemSettingsPage-CiOm2NzV.js +0 -1
- package/static/settings/assets/SystemSettingsSubjectPanel-Cd-GECon.js +0 -31
- package/static/settings/assets/admin-BU4m6Ko2.js +0 -1
- package/static/settings/assets/ai-connections-CHNTKemd.js +0 -1
- package/static/settings/assets/index-BFi9yn7_.js +0 -41
- package/static/settings/assets/index-BGgEhIUy.js +0 -4
- package/static/settings/assets/settings-C_7MUXJb.css +0 -1
|
@@ -5,6 +5,7 @@ const errors_1 = require("../errors");
|
|
|
5
5
|
const connect_1 = require("../connect");
|
|
6
6
|
const ProviderRegistry_1 = require("../providers/ProviderRegistry");
|
|
7
7
|
const ModelsDevCatalog_1 = require("../providers/ModelsDevCatalog");
|
|
8
|
+
const EmbeddingModelPolicy_1 = require("../../../ai/service/EmbeddingModelPolicy");
|
|
8
9
|
class ModelRouter {
|
|
9
10
|
constructor(options) {
|
|
10
11
|
this.registry = options.registry;
|
|
@@ -13,6 +14,7 @@ class ModelRouter {
|
|
|
13
14
|
this.selectionRepository = options.selectionRepository;
|
|
14
15
|
this.defaultProvider = options.defaultProvider ? (0, ProviderRegistry_1.normalizeProviderId)(options.defaultProvider) : undefined;
|
|
15
16
|
this.defaultModel = options.defaultModel;
|
|
17
|
+
this.embeddingModelPolicy = options.embeddingModelPolicy ?? EmbeddingModelPolicy_1.EmbeddingModelPolicy.allowAll();
|
|
16
18
|
this.now = options.now ?? (() => new Date());
|
|
17
19
|
}
|
|
18
20
|
async route(input, excludeCredentialIds = new Set()) {
|
|
@@ -136,7 +138,7 @@ class ModelRouter {
|
|
|
136
138
|
model,
|
|
137
139
|
source: 'exact-model',
|
|
138
140
|
selectionDefault: Boolean(selection.defaultModel && sameModel(selection.defaultModel, selected.id)),
|
|
139
|
-
projection: modelProjection(provider, model),
|
|
141
|
+
projection: modelProjection(provider, model, selected.displayName),
|
|
140
142
|
});
|
|
141
143
|
}
|
|
142
144
|
}
|
|
@@ -478,8 +480,16 @@ class ModelRouter {
|
|
|
478
480
|
const selected = unrestricted
|
|
479
481
|
? provider.models.map((model) => model.id)
|
|
480
482
|
: providerCandidates.flatMap((candidate) => candidate.models ?? []);
|
|
483
|
+
const selectedNames = new Map();
|
|
484
|
+
for (const candidate of providerCandidates) {
|
|
485
|
+
for (const [id, name] of Object.entries(candidate.modelNames ?? {})) {
|
|
486
|
+
if (!selectedNames.has(id)) {
|
|
487
|
+
selectedNames.set(id, name);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
481
491
|
for (const model of selected) {
|
|
482
|
-
const projection = modelProjection(provider, model);
|
|
492
|
+
const projection = modelProjection(provider, model, selectedNames.get(modelIdentity(model)));
|
|
483
493
|
if (seen.has(projection.id)) {
|
|
484
494
|
continue;
|
|
485
495
|
}
|
|
@@ -499,6 +509,7 @@ class ModelRouter {
|
|
|
499
509
|
continue;
|
|
500
510
|
}
|
|
501
511
|
seen.add(key);
|
|
512
|
+
const customCapabilities = this.visibleCustomCapabilities(provider.id, id, customModel.capabilities);
|
|
502
513
|
models.push({
|
|
503
514
|
id,
|
|
504
515
|
object: 'model',
|
|
@@ -513,7 +524,7 @@ class ModelRouter {
|
|
|
513
524
|
},
|
|
514
525
|
}
|
|
515
526
|
: {}),
|
|
516
|
-
...(
|
|
527
|
+
...(customCapabilities.length ? { custom_capabilities: customCapabilities } : {}),
|
|
517
528
|
});
|
|
518
529
|
}
|
|
519
530
|
}
|
|
@@ -526,6 +537,19 @@ class ModelRouter {
|
|
|
526
537
|
&& candidate.quota?.status !== 'exhausted'
|
|
527
538
|
&& (!candidate.cooldownUntil || candidate.cooldownUntil.getTime() <= this.now().getTime());
|
|
528
539
|
}
|
|
540
|
+
/**
|
|
541
|
+
* A Pod can declare any capability on a custom model. Embedding is the one
|
|
542
|
+
* capability a deployment gates through its own catalog, so never advertise an
|
|
543
|
+
* embedding model the catalog does not provide. Other declared capabilities
|
|
544
|
+
* keep their existing behavior.
|
|
545
|
+
*/
|
|
546
|
+
visibleCustomCapabilities(providerId, modelId, capabilities) {
|
|
547
|
+
if (!capabilities?.length) {
|
|
548
|
+
return [];
|
|
549
|
+
}
|
|
550
|
+
return capabilities.filter((capability) => capability.trim().toLowerCase() !== 'embedding'
|
|
551
|
+
|| this.embeddingModelPolicy.isAllowed({ provider: providerId, model: modelId }));
|
|
552
|
+
}
|
|
529
553
|
}
|
|
530
554
|
exports.ModelRouter = ModelRouter;
|
|
531
555
|
function modelIdentity(value) {
|
|
@@ -536,19 +560,34 @@ function modelIdentity(value) {
|
|
|
536
560
|
function sameModel(left, right) {
|
|
537
561
|
return modelIdentity(left).toLowerCase() === modelIdentity(right).toLowerCase();
|
|
538
562
|
}
|
|
539
|
-
|
|
563
|
+
/**
|
|
564
|
+
* One visible model as the OpenAI-shaped `/v1/models` entry.
|
|
565
|
+
*
|
|
566
|
+
* `display_name` is the same evidence the settings model list shows next to the
|
|
567
|
+
* id: the name the Pod row carries from discovery, or the catalog's name for a
|
|
568
|
+
* model the registry describes. Without it the published list can only be read
|
|
569
|
+
* as raw ids while the provider pages show names for the very same models.
|
|
570
|
+
*/
|
|
571
|
+
function modelProjection(provider, modelId, displayName) {
|
|
540
572
|
const descriptor = provider.models.find((model) => sameModel(model.id, modelId)
|
|
541
573
|
|| (model.aliases ?? []).some((alias) => sameModel(alias, modelId)))
|
|
542
574
|
?? (0, ModelsDevCatalog_1.lookupModelsDevModelDescriptor)((0, ProviderRegistry_1.normalizeProviderId)(provider.id), modelIdentity(modelId));
|
|
575
|
+
const name = displayName ?? catalogDisplayName(descriptor);
|
|
543
576
|
return {
|
|
544
577
|
id: modelIdentity(modelId),
|
|
545
578
|
object: 'model',
|
|
546
579
|
owned_by: provider.id,
|
|
580
|
+
...(name ? { display_name: name } : {}),
|
|
547
581
|
...(descriptor?.contextWindow !== undefined ? { context_window: descriptor.contextWindow } : {}),
|
|
548
582
|
...(descriptor?.capabilities ? { capabilities: descriptor.capabilities } : {}),
|
|
549
583
|
...(descriptor?.protocols ? { protocols: descriptor.protocols } : {}),
|
|
550
584
|
};
|
|
551
585
|
}
|
|
586
|
+
/** Discovery metadata names a model the same way the settings summary does. */
|
|
587
|
+
function catalogDisplayName(descriptor) {
|
|
588
|
+
const name = descriptor?.metadata?.name;
|
|
589
|
+
return typeof name === 'string' && name.trim() ? name.trim() : undefined;
|
|
590
|
+
}
|
|
552
591
|
function modelNotAvailableError(model) {
|
|
553
592
|
return new errors_1.GatewayProtocolError('Requested model is not available for this account', {
|
|
554
593
|
code: 'model_not_available',
|
|
@@ -1,5 +1,13 @@
|
|
|
1
|
+
import { AI_CONNECTIONS_PROVIDER_DOCUMENT_IDS } from '@undefineds.co/ai-connections/provider-catalog';
|
|
1
2
|
export declare const AI_CONNECTIONS_APPLET_ID = "co.undefineds.ai-connections";
|
|
2
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Provider documents this service may reach. The list is projected from the
|
|
5
|
+
* shared provider/offering catalogue (`<provider>` plus
|
|
6
|
+
* `<provider>-<offeringId>`); re-exported here because the service-access
|
|
7
|
+
* descriptor is the server-side consumer of that one source, and the applet's
|
|
8
|
+
* descriptor validator reads the same constant.
|
|
9
|
+
*/
|
|
10
|
+
export { AI_CONNECTIONS_PROVIDER_DOCUMENT_IDS };
|
|
3
11
|
export interface AiConnectionsServiceAccessDescriptor {
|
|
4
12
|
appletId: typeof AI_CONNECTIONS_APPLET_ID;
|
|
5
13
|
service: {
|
|
@@ -7,34 +7,10 @@ exports.resolveGatewayAccessKeySecretResourceUrl = resolveGatewayAccessKeySecret
|
|
|
7
7
|
exports.resolveGatewayAccessKeySparqlEndpoint = resolveGatewayAccessKeySparqlEndpoint;
|
|
8
8
|
exports.isGatewayAccessKeySparqlEndpoint = isGatewayAccessKeySparqlEndpoint;
|
|
9
9
|
const drizzle_solid_1 = require("@undefineds.co/drizzle-solid");
|
|
10
|
+
const provider_catalog_1 = require("@undefineds.co/ai-connections/provider-catalog");
|
|
11
|
+
Object.defineProperty(exports, "AI_CONNECTIONS_PROVIDER_DOCUMENT_IDS", { enumerable: true, get: function () { return provider_catalog_1.AI_CONNECTIONS_PROVIDER_DOCUMENT_IDS; } });
|
|
10
12
|
const models_1 = require("@undefineds.co/models");
|
|
11
13
|
exports.AI_CONNECTIONS_APPLET_ID = 'co.undefineds.ai-connections';
|
|
12
|
-
exports.AI_CONNECTIONS_PROVIDER_DOCUMENT_IDS = [
|
|
13
|
-
'openai',
|
|
14
|
-
'openai-official-subscription',
|
|
15
|
-
'openai-api-platform',
|
|
16
|
-
'anthropic',
|
|
17
|
-
'anthropic-official-subscription',
|
|
18
|
-
'anthropic-api-platform',
|
|
19
|
-
'kimi',
|
|
20
|
-
'kimi-subscription-key',
|
|
21
|
-
'kimi-api-platform',
|
|
22
|
-
'bailian',
|
|
23
|
-
'bailian-pay-as-you-go',
|
|
24
|
-
'bailian-token-plan',
|
|
25
|
-
'bailian-token-plan-team',
|
|
26
|
-
'bailian-coding-plan',
|
|
27
|
-
'deepseek',
|
|
28
|
-
'deepseek-api-platform',
|
|
29
|
-
'zhipu',
|
|
30
|
-
'zhipu-api-platform',
|
|
31
|
-
'zhipu-coding-plan',
|
|
32
|
-
'ollama',
|
|
33
|
-
'ollama-local',
|
|
34
|
-
'custom',
|
|
35
|
-
'custom-openai-compatible',
|
|
36
|
-
'custom-anthropic-compatible',
|
|
37
|
-
];
|
|
38
14
|
const declaredResourceBases = new WeakMap([
|
|
39
15
|
[models_1.credentialResource, declaredResourceBase(models_1.credentialResource)],
|
|
40
16
|
[models_1.aiProviderResource, declaredResourceBase(models_1.aiProviderResource)],
|
|
@@ -54,7 +30,7 @@ function createAiConnectionsServiceAccess(input) {
|
|
|
54
30
|
['gatewayAccessKeys', resolveGatewayAccessKeyResourceUrl(input.ownerWebId, input.podBaseUrl)],
|
|
55
31
|
['gatewayAccessKeySecrets', resolveGatewayAccessKeySecretResourceUrl(input.ownerWebId, input.podBaseUrl), 'application/json'],
|
|
56
32
|
['quotaSnapshots', resourceUrl(input.ownerWebId, models_1.quotaSnapshotResource, input.podBaseUrl)],
|
|
57
|
-
...
|
|
33
|
+
...provider_catalog_1.AI_CONNECTIONS_PROVIDER_DOCUMENT_IDS.map((provider) => [
|
|
58
34
|
`providerDocument:${provider}`,
|
|
59
35
|
providerDocumentUrl(input.ownerWebId, provider, input.podBaseUrl),
|
|
60
36
|
]),
|
|
@@ -173,9 +173,6 @@ class ClientCredentialsAuthenticator {
|
|
|
173
173
|
return { success: false, error: 'Token exchange failed' };
|
|
174
174
|
}
|
|
175
175
|
}
|
|
176
|
-
isJwt(token) {
|
|
177
|
-
return /^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/.test(token);
|
|
178
|
-
}
|
|
179
176
|
}
|
|
180
177
|
exports.ClientCredentialsAuthenticator = ClientCredentialsAuthenticator;
|
|
181
178
|
function tokenEndpointRoutingHeaders(tokenEndpoint, publicBaseUrl) {
|
package/dist/api/auth/index.d.ts
CHANGED
package/dist/api/auth/index.js
CHANGED
|
@@ -19,6 +19,6 @@ __exportStar(require("./AuthContext"), exports);
|
|
|
19
19
|
__exportStar(require("./SolidTokenAuthenticator"), exports);
|
|
20
20
|
__exportStar(require("./ClientCredentialsAuthenticator"), exports);
|
|
21
21
|
__exportStar(require("./ServiceTokenAuthenticator"), exports);
|
|
22
|
-
|
|
22
|
+
__exportStar(require("./NodeTokenAuthenticator"), exports);
|
|
23
23
|
__exportStar(require("./MultiAuthenticator"), exports);
|
|
24
24
|
//# sourceMappingURL=index.js.map
|
|
@@ -3,12 +3,21 @@ import type { ThreadMetadata, ThreadRef, ThreadItem, Attachment, Page, StoreItem
|
|
|
3
3
|
import { type RunListOptions, type RunRecordData, type RunStepRecordData, type RunStore } from '../runs/store';
|
|
4
4
|
import { type TaskListOptions, type TaskRecordData, type TaskStore } from '../tasks/store';
|
|
5
5
|
import { type TaskAuthBindingRepository } from '../tasks/TaskAuthBinding';
|
|
6
|
+
import { type AiCredentialSecretDecoder } from '../../ai/service/AiCredentialSecret';
|
|
6
7
|
import { CredentialStatus } from '../../credential/schema/types';
|
|
7
8
|
import { type ServerGroupReconcilerService } from '../reconciler';
|
|
8
9
|
import { type ReaderAiConfig } from '../../document/ReaderAiConfig';
|
|
9
10
|
export interface PodChatKitStoreOptions {
|
|
10
11
|
tokenEndpoint: string;
|
|
11
12
|
serverGroupReconcilerService?: ServerGroupReconcilerService;
|
|
13
|
+
/**
|
|
14
|
+
* Reads a Pod credential secret (AI Connections envelope, `plaintext-v1`
|
|
15
|
+
* payload, or a legacy bare `apiKey`). Defaults to the plaintext decoder; the
|
|
16
|
+
* container injects a vault-backed one so wrapped Cloud secrets resolve too.
|
|
17
|
+
*/
|
|
18
|
+
credentialSecretDecoder?: AiCredentialSecretDecoder;
|
|
19
|
+
/** Deployment whose credentials this runtime prefers when a Pod holds several. */
|
|
20
|
+
deployment?: string;
|
|
12
21
|
}
|
|
13
22
|
/**
|
|
14
23
|
* Pod-based ChatKit Store implementation
|
|
@@ -23,6 +32,8 @@ export declare class PodChatKitStore implements ChatKitStore<StoreContext>, RunS
|
|
|
23
32
|
private readonly logger;
|
|
24
33
|
private readonly tokenEndpoint;
|
|
25
34
|
private readonly serverGroupReconcilerService?;
|
|
35
|
+
private readonly credentialSecretDecoder;
|
|
36
|
+
private readonly deployment?;
|
|
26
37
|
/** 默认 Chat 容器 ID */
|
|
27
38
|
private static readonly DEFAULT_CHAT_ID;
|
|
28
39
|
constructor(options: PodChatKitStoreOptions);
|
|
@@ -216,12 +227,32 @@ export declare class PodChatKitStore implements ChatKitStore<StoreContext>, RunS
|
|
|
216
227
|
private resolvePodResource;
|
|
217
228
|
private findProviderForCredential;
|
|
218
229
|
private findConfiguredEmbeddingModel;
|
|
230
|
+
/**
|
|
231
|
+
* The embedding model this Pod may index with.
|
|
232
|
+
*
|
|
233
|
+
* AI Connections model selection is the allowlist: once a provider has active
|
|
234
|
+
* embedding-typed selections, only those models are usable, and the first one
|
|
235
|
+
* becomes the default when the Pod names none. A provider without an explicit
|
|
236
|
+
* embedding selection keeps the configured model (or the provider default), so
|
|
237
|
+
* existing Pods keep indexing.
|
|
238
|
+
*/
|
|
239
|
+
private resolveEmbeddingModel;
|
|
240
|
+
private selectedEmbeddingModels;
|
|
219
241
|
private sortAiCredentialCandidates;
|
|
220
242
|
private isTruthyValue;
|
|
243
|
+
private isDeploymentCredential;
|
|
221
244
|
private timestampValue;
|
|
222
245
|
private parseIntegerValue;
|
|
223
246
|
private extractModelId;
|
|
224
247
|
private queryAiConfigFromSettingsSparql;
|
|
248
|
+
/**
|
|
249
|
+
* AI Connections stores the secret in `encryptedSecret`; older rows carry a
|
|
250
|
+
* bare `apiKey`. Resolve whichever the row has, so a key entered once is usable
|
|
251
|
+
* by chat and by embedding/indexing alike.
|
|
252
|
+
*/
|
|
253
|
+
private resolveCredentialSecret;
|
|
254
|
+
private credentialEnabledFromMetadata;
|
|
255
|
+
private parseMetadataValue;
|
|
225
256
|
getAiConfig(context: StoreContext): Promise<{
|
|
226
257
|
providerId: string;
|
|
227
258
|
baseUrl: string;
|
|
@@ -27,6 +27,7 @@ const provider_1 = require("../../ai/schema/provider");
|
|
|
27
27
|
const model_1 = require("../../ai/schema/model");
|
|
28
28
|
const config_1 = require("../../ai/schema/config");
|
|
29
29
|
const defaultEmbeddingProfile_1 = require("../../ai/service/defaultEmbeddingProfile");
|
|
30
|
+
const AiCredentialSecret_1 = require("../../ai/service/AiCredentialSecret");
|
|
30
31
|
const tables_1 = require("../../credential/schema/tables");
|
|
31
32
|
const types_2 = require("../../credential/schema/types");
|
|
32
33
|
const models_1 = require("@undefineds.co/models");
|
|
@@ -60,6 +61,8 @@ class PodChatKitStore {
|
|
|
60
61
|
// Track recently created message IDs to avoid SELECT cache timing issues
|
|
61
62
|
this.recentlyCreatedIds = new Set();
|
|
62
63
|
this.tokenEndpoint = options.tokenEndpoint;
|
|
64
|
+
this.credentialSecretDecoder = options.credentialSecretDecoder ?? AiCredentialSecret_1.defaultAiCredentialSecretDecoder;
|
|
65
|
+
this.deployment = options.deployment;
|
|
63
66
|
this.serverGroupReconcilerService = options.serverGroupReconcilerService;
|
|
64
67
|
}
|
|
65
68
|
/** Build a Pod-scoped context for trusted internal maintenance jobs. */
|
|
@@ -1958,8 +1961,60 @@ WHERE { ${deletePatterns.join(' ')} }
|
|
|
1958
1961
|
return undefined;
|
|
1959
1962
|
}
|
|
1960
1963
|
}
|
|
1964
|
+
/**
|
|
1965
|
+
* The embedding model this Pod may index with.
|
|
1966
|
+
*
|
|
1967
|
+
* AI Connections model selection is the allowlist: once a provider has active
|
|
1968
|
+
* embedding-typed selections, only those models are usable, and the first one
|
|
1969
|
+
* becomes the default when the Pod names none. A provider without an explicit
|
|
1970
|
+
* embedding selection keeps the configured model (or the provider default), so
|
|
1971
|
+
* existing Pods keep indexing.
|
|
1972
|
+
*/
|
|
1973
|
+
async resolveEmbeddingModel(db, providerId) {
|
|
1974
|
+
const configured = await this.findConfiguredEmbeddingModel(db, providerId)
|
|
1975
|
+
?? (0, defaultEmbeddingProfile_1.defaultEmbeddingModelForProvider)(providerId);
|
|
1976
|
+
const selected = await this.selectedEmbeddingModels(db, providerId);
|
|
1977
|
+
if (selected.length === 0) {
|
|
1978
|
+
return configured;
|
|
1979
|
+
}
|
|
1980
|
+
if (!configured) {
|
|
1981
|
+
return selected[0];
|
|
1982
|
+
}
|
|
1983
|
+
return selected.some((model) => model.toLowerCase() === configured.toLowerCase())
|
|
1984
|
+
? configured
|
|
1985
|
+
: undefined;
|
|
1986
|
+
}
|
|
1987
|
+
async selectedEmbeddingModels(db, providerId) {
|
|
1988
|
+
try {
|
|
1989
|
+
const rows = await db.select().from(model_1.Model);
|
|
1990
|
+
const selected = new Set();
|
|
1991
|
+
for (const row of rows) {
|
|
1992
|
+
if (!row || String(row.status ?? '') !== 'active')
|
|
1993
|
+
continue;
|
|
1994
|
+
if (String(row.modelType ?? '').toLowerCase() !== 'embedding')
|
|
1995
|
+
continue;
|
|
1996
|
+
const rowProvider = this.extractProviderId(String(row.isProvidedBy ?? ''));
|
|
1997
|
+
if (rowProvider && rowProvider !== providerId)
|
|
1998
|
+
continue;
|
|
1999
|
+
const id = this.extractModelId(String(row.id ?? ''));
|
|
2000
|
+
if (id)
|
|
2001
|
+
selected.add(id);
|
|
2002
|
+
}
|
|
2003
|
+
return [...selected];
|
|
2004
|
+
}
|
|
2005
|
+
catch (error) {
|
|
2006
|
+
this.logger.warn(`Failed to read AI model selections for ${providerId}: ${error}`);
|
|
2007
|
+
return [];
|
|
2008
|
+
}
|
|
2009
|
+
}
|
|
1961
2010
|
sortAiCredentialCandidates(credentials) {
|
|
1962
2011
|
return [...credentials].sort((left, right) => {
|
|
2012
|
+
// A Pod can hold credentials for more than one deployment. Prefer this
|
|
2013
|
+
// runtime's own deployment, exactly like the Gateway credential lookup.
|
|
2014
|
+
const deploymentDelta = Number(this.isDeploymentCredential(right.id)) - Number(this.isDeploymentCredential(left.id));
|
|
2015
|
+
if (deploymentDelta !== 0) {
|
|
2016
|
+
return deploymentDelta;
|
|
2017
|
+
}
|
|
1963
2018
|
const defaultDelta = Number(this.isTruthyValue(right.isDefault)) - Number(this.isTruthyValue(left.isDefault));
|
|
1964
2019
|
if (defaultDelta !== 0) {
|
|
1965
2020
|
return defaultDelta;
|
|
@@ -1981,6 +2036,11 @@ WHERE { ${deletePatterns.join(' ')} }
|
|
|
1981
2036
|
isTruthyValue(value) {
|
|
1982
2037
|
return value === true || value === 'true' || value === 1 || value === '1';
|
|
1983
2038
|
}
|
|
2039
|
+
isDeploymentCredential(id) {
|
|
2040
|
+
const deployment = this.deployment?.trim().toLowerCase();
|
|
2041
|
+
const value = typeof id === 'string' ? id.trim().toLowerCase() : '';
|
|
2042
|
+
return Boolean(deployment && value.startsWith(`${deployment}-`));
|
|
2043
|
+
}
|
|
1984
2044
|
timestampValue(value) {
|
|
1985
2045
|
if (value instanceof Date) {
|
|
1986
2046
|
return value.getTime();
|
|
@@ -2028,11 +2088,15 @@ WHERE { ${deletePatterns.join(' ')} }
|
|
|
2028
2088
|
PREFIX cred: <https://vocab.xpod.dev/credential#>
|
|
2029
2089
|
PREFIX ai: <https://vocab.xpod.dev/ai#>
|
|
2030
2090
|
PREFIX udfs: <https://undefineds.co/ns#>
|
|
2031
|
-
SELECT ?cred ?provider ?apiKey ?isDefault ?lastUsedAt ?failCount ?providerBaseUrl ?credentialBaseUrl ?providerProxyUrl ?credentialProxyUrl ?defaultModel ?hasModel
|
|
2091
|
+
SELECT ?cred ?provider ?apiKey ?encryptedSecret ?secretPayload ?storageMode ?metadata ?isDefault ?lastUsedAt ?failCount ?providerBaseUrl ?credentialBaseUrl ?providerProxyUrl ?credentialProxyUrl ?defaultModel ?hasModel
|
|
2032
2092
|
WHERE {
|
|
2033
2093
|
?cred (cred:service|udfs:service) "ai" ;
|
|
2034
|
-
(cred:status|udfs:status) "active"
|
|
2035
|
-
|
|
2094
|
+
(cred:status|udfs:status) "active" .
|
|
2095
|
+
OPTIONAL { ?cred (cred:apiKey|udfs:apiKey) ?apiKey . }
|
|
2096
|
+
OPTIONAL { ?cred (cred:encryptedSecret|udfs:encryptedSecret) ?encryptedSecret . }
|
|
2097
|
+
OPTIONAL { ?cred (cred:secretPayload|udfs:secretPayload) ?secretPayload . }
|
|
2098
|
+
OPTIONAL { ?cred (cred:storageMode|udfs:storageMode) ?storageMode . }
|
|
2099
|
+
OPTIONAL { ?cred (cred:metadata|udfs:metadata) ?metadata . }
|
|
2036
2100
|
OPTIONAL { ?cred (cred:provider|udfs:provider) ?provider . }
|
|
2037
2101
|
OPTIONAL { ?cred (cred:isDefault|udfs:isDefault) ?isDefault . }
|
|
2038
2102
|
OPTIONAL { ?cred (cred:lastUsedAt|udfs:lastUsedAt) ?lastUsedAt . }
|
|
@@ -2061,11 +2125,17 @@ WHERE { ${deletePatterns.join(' ')} }
|
|
|
2061
2125
|
const credentials = (json.results?.bindings ?? []).map((binding) => {
|
|
2062
2126
|
const credentialIri = this.parseSparqlBindingValue(binding, 'cred') ?? '';
|
|
2063
2127
|
const providerRef = this.parseSparqlBindingValue(binding, 'provider');
|
|
2128
|
+
const metadata = this.parseMetadataValue(this.parseSparqlBindingValue(binding, 'metadata') ?? undefined);
|
|
2064
2129
|
return {
|
|
2065
2130
|
id: this.baseRelativeIdFromPodPath(credentialIri, context, '/settings/'),
|
|
2131
|
+
credentialIri,
|
|
2066
2132
|
provider: providerRef,
|
|
2067
2133
|
providerId: providerRef ? this.extractProviderId(providerRef) : null,
|
|
2068
2134
|
apiKey: this.parseSparqlBindingValue(binding, 'apiKey'),
|
|
2135
|
+
encryptedSecret: this.parseSparqlBindingValue(binding, 'encryptedSecret'),
|
|
2136
|
+
secretPayload: this.parseSparqlBindingValue(binding, 'secretPayload'),
|
|
2137
|
+
storageMode: this.parseSparqlBindingValue(binding, 'storageMode'),
|
|
2138
|
+
enabled: this.credentialEnabledFromMetadata(metadata),
|
|
2069
2139
|
isDefault: this.parseSparqlBindingValue(binding, 'isDefault'),
|
|
2070
2140
|
lastUsedAt: this.parseSparqlBindingValue(binding, 'lastUsedAt'),
|
|
2071
2141
|
failCount: this.parseIntegerValue(this.parseSparqlBindingValue(binding, 'failCount')),
|
|
@@ -2078,25 +2148,74 @@ WHERE { ${deletePatterns.join(' ')} }
|
|
|
2078
2148
|
};
|
|
2079
2149
|
});
|
|
2080
2150
|
for (const cred of this.sortAiCredentialCandidates(credentials)) {
|
|
2081
|
-
if (!cred.provider || !cred.
|
|
2151
|
+
if (!cred.provider || !cred.baseUrl || cred.enabled === false) {
|
|
2082
2152
|
continue;
|
|
2083
2153
|
}
|
|
2084
2154
|
const providerId = cred.providerId || this.extractProviderId(cred.provider);
|
|
2085
2155
|
if (!providerId) {
|
|
2086
2156
|
continue;
|
|
2087
2157
|
}
|
|
2158
|
+
const secret = await this.resolveCredentialSecret(cred, context, providerId);
|
|
2159
|
+
const apiKey = (0, AiCredentialSecret_1.providerTokenFromSecret)(secret) ?? cred.apiKey;
|
|
2160
|
+
if (!apiKey) {
|
|
2161
|
+
continue;
|
|
2162
|
+
}
|
|
2088
2163
|
this.logger.debug(`Using credential ${cred.id} with provider ${providerId}`);
|
|
2089
2164
|
return {
|
|
2090
2165
|
providerId,
|
|
2091
2166
|
baseUrl: cred.baseUrl,
|
|
2092
2167
|
proxyUrl: cred.proxyUrl || undefined,
|
|
2093
2168
|
defaultModel: this.extractModelId(cred.defaultModel),
|
|
2094
|
-
apiKey
|
|
2169
|
+
apiKey,
|
|
2095
2170
|
credentialId: cred.id,
|
|
2096
2171
|
};
|
|
2097
2172
|
}
|
|
2098
2173
|
return undefined;
|
|
2099
2174
|
}
|
|
2175
|
+
/**
|
|
2176
|
+
* AI Connections stores the secret in `encryptedSecret`; older rows carry a
|
|
2177
|
+
* bare `apiKey`. Resolve whichever the row has, so a key entered once is usable
|
|
2178
|
+
* by chat and by embedding/indexing alike.
|
|
2179
|
+
*/
|
|
2180
|
+
async resolveCredentialSecret(row, context, providerId) {
|
|
2181
|
+
const rowIri = row.credentialIri;
|
|
2182
|
+
const credentialIri = typeof rowIri === 'string' && rowIri
|
|
2183
|
+
? rowIri
|
|
2184
|
+
: this.resolvePodResource(context, `settings/credentials.ttl#${(0, models_1.normalizeAIConfigResourceId)(String(row.id ?? ''))}`);
|
|
2185
|
+
try {
|
|
2186
|
+
const secret = await this.credentialSecretDecoder(row, {
|
|
2187
|
+
webId: typeof context.webId === 'string' ? context.webId : '',
|
|
2188
|
+
credentialIri,
|
|
2189
|
+
provider: providerId,
|
|
2190
|
+
});
|
|
2191
|
+
return secret;
|
|
2192
|
+
}
|
|
2193
|
+
catch (error) {
|
|
2194
|
+
this.logger.warn(`Failed to read AI credential secret ${String(row.id)}: ${error}`);
|
|
2195
|
+
return undefined;
|
|
2196
|
+
}
|
|
2197
|
+
}
|
|
2198
|
+
credentialEnabledFromMetadata(metadata) {
|
|
2199
|
+
const enabled = metadata?.enabled;
|
|
2200
|
+
return typeof enabled === 'boolean' ? enabled : undefined;
|
|
2201
|
+
}
|
|
2202
|
+
parseMetadataValue(value) {
|
|
2203
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
2204
|
+
return value;
|
|
2205
|
+
}
|
|
2206
|
+
if (typeof value !== 'string' || !value.trim()) {
|
|
2207
|
+
return undefined;
|
|
2208
|
+
}
|
|
2209
|
+
try {
|
|
2210
|
+
const parsed = JSON.parse(value);
|
|
2211
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
|
|
2212
|
+
? parsed
|
|
2213
|
+
: undefined;
|
|
2214
|
+
}
|
|
2215
|
+
catch {
|
|
2216
|
+
return undefined;
|
|
2217
|
+
}
|
|
2218
|
+
}
|
|
2100
2219
|
async getAiConfig(context) {
|
|
2101
2220
|
const db = await this.getDb(context);
|
|
2102
2221
|
if (!db) {
|
|
@@ -2124,6 +2243,8 @@ WHERE { ${deletePatterns.join(' ')} }
|
|
|
2124
2243
|
for (const cred of this.sortAiCredentialCandidates(credentials)) {
|
|
2125
2244
|
if (!cred.provider)
|
|
2126
2245
|
continue;
|
|
2246
|
+
if (this.credentialEnabledFromMetadata(this.parseMetadataValue(cred.metadata)) === false)
|
|
2247
|
+
continue;
|
|
2127
2248
|
const provider = await this.findProviderForCredential(db, context, cred.provider);
|
|
2128
2249
|
if (!provider)
|
|
2129
2250
|
continue;
|
|
@@ -2131,12 +2252,15 @@ WHERE { ${deletePatterns.join(' ')} }
|
|
|
2131
2252
|
const baseUrl = provider.baseUrl || (0, defaultEmbeddingProfile_1.defaultBaseUrlForProvider)(providerId);
|
|
2132
2253
|
if (!baseUrl)
|
|
2133
2254
|
continue;
|
|
2255
|
+
const secret = await this.resolveCredentialSecret({ ...cred, credentialIri: cred.id }, context, providerId);
|
|
2256
|
+
const apiKey = (0, AiCredentialSecret_1.providerTokenFromSecret)(secret);
|
|
2257
|
+
if (!apiKey)
|
|
2258
|
+
continue;
|
|
2134
2259
|
const defaultModelRef = provider.defaultModel ?? provider.hasModel;
|
|
2135
2260
|
const defaultModel = defaultModelRef
|
|
2136
2261
|
? (await db.findByIri(model_1.Model, defaultModelRef))?.id ?? undefined
|
|
2137
2262
|
: undefined;
|
|
2138
|
-
const embeddingModel = await this.
|
|
2139
|
-
?? (0, defaultEmbeddingProfile_1.defaultEmbeddingModelForProvider)(providerId);
|
|
2263
|
+
const embeddingModel = await this.resolveEmbeddingModel(db, providerId);
|
|
2140
2264
|
this.logger.debug(`Using credential ${cred.id} with provider ${providerId}`);
|
|
2141
2265
|
return {
|
|
2142
2266
|
providerId,
|
|
@@ -2144,7 +2268,7 @@ WHERE { ${deletePatterns.join(' ')} }
|
|
|
2144
2268
|
proxyUrl: provider.proxyUrl || undefined,
|
|
2145
2269
|
defaultModel,
|
|
2146
2270
|
embeddingModel,
|
|
2147
|
-
apiKey
|
|
2271
|
+
apiKey,
|
|
2148
2272
|
credentialId: cred.id,
|
|
2149
2273
|
};
|
|
2150
2274
|
}
|
|
@@ -30,6 +30,7 @@ const PodGatewayAccessKeyRepository_1 = require("../ai-gateway/auth/PodGatewayAc
|
|
|
30
30
|
const HostedPodDataAccess_1 = require("../ai-gateway/pod/HostedPodDataAccess");
|
|
31
31
|
const AiGatewayService_1 = require("../ai-gateway/AiGatewayService");
|
|
32
32
|
const PlaintextCredentialVault_1 = require("../ai-gateway/credentials/PlaintextCredentialVault");
|
|
33
|
+
const AiCredentialSecretDecoder_1 = require("../ai-gateway/credentials/AiCredentialSecretDecoder");
|
|
33
34
|
const connect_1 = require("../ai-gateway/connect");
|
|
34
35
|
const LoopbackAuthorizationCallbackReceiver_1 = require("../ai-gateway/connect/LoopbackAuthorizationCallbackReceiver");
|
|
35
36
|
const FileSessionImportAdapter_1 = require("../ai-gateway/connect/FileSessionImportAdapter");
|
|
@@ -277,10 +278,16 @@ function registerCommonServices(container) {
|
|
|
277
278
|
discoveryRegistry: (0, ProviderModelDiscoveryAdapters_1.createProviderModelDiscoveryAdapters)({ registry: gatewayProviderRegistry }),
|
|
278
279
|
modelsService: providerModelsService,
|
|
279
280
|
credentialVault: credentialVaultForConfig(config),
|
|
281
|
+
embeddingModelPolicy: cradle.embeddingModelPolicy,
|
|
280
282
|
});
|
|
281
283
|
}).singleton(),
|
|
282
|
-
gatewayRuntimeRegistry: (0, awilix_1.asFunction)(({ gatewayProviderRegistry, providerHttpTransport }) => {
|
|
283
|
-
return new ProviderRuntimeRegistry_1.ProviderRuntimeRegistry({
|
|
284
|
+
gatewayRuntimeRegistry: (0, awilix_1.asFunction)(({ config, gatewayProviderRegistry, providerHttpTransport }) => {
|
|
285
|
+
return new ProviderRuntimeRegistry_1.ProviderRuntimeRegistry({
|
|
286
|
+
registry: gatewayProviderRegistry,
|
|
287
|
+
transport: providerHttpTransport,
|
|
288
|
+
// A user-owned endpoint is a Local capability; Cloud uses the catalog's.
|
|
289
|
+
allowCredentialBaseUrl: config.edition === 'local',
|
|
290
|
+
});
|
|
284
291
|
}).singleton(),
|
|
285
292
|
gatewaySessionAffinityStore: (0, awilix_1.asFunction)(({ config }) => {
|
|
286
293
|
// Session affinity secrets are process-local by default: a fresh random
|
|
@@ -306,6 +313,7 @@ function registerCommonServices(container) {
|
|
|
306
313
|
registry: gatewayProviderRegistry,
|
|
307
314
|
affinityStore: gatewaySessionAffinityStore,
|
|
308
315
|
credentials: gatewayCredentialStore.listCredentials.bind(gatewayCredentialStore),
|
|
316
|
+
embeddingModelPolicy: cradle.embeddingModelPolicy,
|
|
309
317
|
});
|
|
310
318
|
const cloudGatewayOrigin = (0, CloudGatewayModelsClient_1.resolveCloudModelsGatewayOrigin)({
|
|
311
319
|
edition: config.edition,
|
|
@@ -441,6 +449,8 @@ function registerCommonServices(container) {
|
|
|
441
449
|
internalPodAccess: cradle.hostedPodDataAccess,
|
|
442
450
|
podBaseUrlResolver: podBaseUrlResolver(cradle),
|
|
443
451
|
}),
|
|
452
|
+
embeddingModelPolicy: cradle.embeddingModelPolicy,
|
|
453
|
+
registry: cradle.gatewayProviderRegistry,
|
|
444
454
|
});
|
|
445
455
|
}).singleton(),
|
|
446
456
|
authenticator: (0, awilix_1.asFunction)(({ nodeRepo, serviceTokenRepo, invocationTokenCodec, gatewayAccessKeyRepository, config, }) => {
|
|
@@ -505,6 +515,10 @@ function registerCommonServices(container) {
|
|
|
505
515
|
return new chatkit_1.PodChatKitStore({
|
|
506
516
|
tokenEndpoint: config.cssTokenEndpoint,
|
|
507
517
|
serverGroupReconcilerService,
|
|
518
|
+
deployment: config.edition,
|
|
519
|
+
credentialSecretDecoder: (0, AiCredentialSecretDecoder_1.createAiCredentialSecretDecoder)({
|
|
520
|
+
vault: credentialVaultForConfig(config),
|
|
521
|
+
}),
|
|
508
522
|
});
|
|
509
523
|
}).singleton(),
|
|
510
524
|
clientReconcilerCoordinator: (0, awilix_1.asFunction)(({ config }) => {
|
|
@@ -634,8 +648,14 @@ function registerCommonServices(container) {
|
|
|
634
648
|
providerRegistry: (0, awilix_1.asFunction)(() => {
|
|
635
649
|
return new service_1.ProviderRegistryImpl();
|
|
636
650
|
}).singleton(),
|
|
637
|
-
|
|
638
|
-
return
|
|
651
|
+
embeddingModelPolicy: (0, awilix_1.asFunction)(({ config, gatewayProviderRegistry }) => {
|
|
652
|
+
return (0, service_1.createEmbeddingModelPolicy)({
|
|
653
|
+
deployment: config.edition,
|
|
654
|
+
catalog: (0, models_1.createGatewayEmbeddingModelCatalog)(gatewayProviderRegistry, config.edition),
|
|
655
|
+
});
|
|
656
|
+
}).singleton(),
|
|
657
|
+
embeddingService: (0, awilix_1.asFunction)(({ providerRegistry, embeddingModelPolicy }) => {
|
|
658
|
+
return new service_1.EmbeddingServiceImpl(providerRegistry, { policy: embeddingModelPolicy });
|
|
639
659
|
}).singleton(),
|
|
640
660
|
vectorService: (0, awilix_1.asFunction)(({ chatKitStore, embeddingService }) => {
|
|
641
661
|
return new VectorService_1.VectorService({
|
|
@@ -260,6 +260,7 @@ function registerSharedRoutes(container, server) {
|
|
|
260
260
|
podLookupRepository,
|
|
261
261
|
store: aiConfigStore,
|
|
262
262
|
lifecycle: aiConfigLifecycle,
|
|
263
|
+
embeddingModelPolicy: container.resolve('embeddingModelPolicy', { allowUnregistered: true }),
|
|
263
264
|
capabilities: () => ({
|
|
264
265
|
textBackends: config.edition === 'cloud' && config.sparqlEndpoint ? ['postgres-fts'] : [],
|
|
265
266
|
vectorBackends: config.edition === 'cloud' && config.sparqlEndpoint ? ['pgvector'] : ['vec'],
|
|
@@ -449,13 +450,15 @@ function resolveLocalStorageProviderBaseUrl(config, env = process.env) {
|
|
|
449
450
|
function registerLocalRoutes(container, server) {
|
|
450
451
|
const config = container.resolve('config');
|
|
451
452
|
(0, LinxCapabilitiesHandler_1.registerLinxCapabilitiesRoutes)(server);
|
|
453
|
+
// DDNS state (托管式 Local 模式). One manager answers both the DDNS status
|
|
454
|
+
// route and the admin reachability verdict, which must agree.
|
|
455
|
+
const ddnsManager = resolveDdnsManager(container);
|
|
452
456
|
// Admin API (配置管理、重启)
|
|
453
457
|
(0, AdminHandler_1.registerAdminRoutes)(server, {
|
|
454
458
|
internalAdminAuthSecret: config.gatewayAdminProxyAuthSecret,
|
|
459
|
+
ddnsManager,
|
|
455
460
|
});
|
|
456
|
-
// DDNS status (托管式 Local 模式)
|
|
457
461
|
try {
|
|
458
|
-
const ddnsManager = container.resolve('ddnsManager', { allowUnregistered: true });
|
|
459
462
|
(0, AdminDdnsHandler_1.registerAdminDdnsRoutes)(server, {
|
|
460
463
|
ddnsManager,
|
|
461
464
|
internalAdminAuthSecret: config.gatewayAdminProxyAuthSecret,
|
|
@@ -548,6 +551,18 @@ function readPositiveInteger(value) {
|
|
|
548
551
|
const parsed = Number.parseInt(value, 10);
|
|
549
552
|
return Number.isInteger(parsed) && parsed > 0 ? parsed : undefined;
|
|
550
553
|
}
|
|
554
|
+
/**
|
|
555
|
+
* The DDNS manager is optional: a node without `XPOD_NODE_TOKEN` registers no
|
|
556
|
+
* DDNS routes and reports its public route as unknowable rather than failed.
|
|
557
|
+
*/
|
|
558
|
+
function resolveDdnsManager(container) {
|
|
559
|
+
try {
|
|
560
|
+
return container.resolve('ddnsManager', { allowUnregistered: true });
|
|
561
|
+
}
|
|
562
|
+
catch {
|
|
563
|
+
return undefined;
|
|
564
|
+
}
|
|
565
|
+
}
|
|
551
566
|
function resolveNetworkEndpoint(config) {
|
|
552
567
|
const configured = config.publicUrl
|
|
553
568
|
?? config.activeTunnelProfile?.publicUrl
|
|
@@ -25,7 +25,7 @@ import type { ChatKitService, AiProvider } from '../chatkit';
|
|
|
25
25
|
import type { StoreContext } from '../chatkit/store';
|
|
26
26
|
import type { PodChatKitStore } from '../chatkit/pod-store';
|
|
27
27
|
import type { RuntimeHost } from '../../runtime/host/types';
|
|
28
|
-
import type { ProviderRegistry, EmbeddingService } from '../../ai/service';
|
|
28
|
+
import type { ProviderRegistry, EmbeddingService, EmbeddingModelPolicy } from '../../ai/service';
|
|
29
29
|
import type { VectorService } from '../service/VectorService';
|
|
30
30
|
import type { RdfSearchIndexingService } from '../service/RdfSearchIndexingService';
|
|
31
31
|
import type { RdfSearchReconciliationRepository } from '../../search/RdfSearchReconciliationRepository';
|
|
@@ -239,6 +239,8 @@ export interface ApiContainerCradle {
|
|
|
239
239
|
serverGroupReconcilerService: ServerGroupReconcilerService;
|
|
240
240
|
providerRegistry: ProviderRegistry;
|
|
241
241
|
embeddingService: EmbeddingService;
|
|
242
|
+
/** Deployment embedding policy: cloud only allows models the gateway catalog provides. */
|
|
243
|
+
embeddingModelPolicy: EmbeddingModelPolicy;
|
|
242
244
|
vectorService: VectorService;
|
|
243
245
|
rdfStorageStatsService: RdfStorageStatsService;
|
|
244
246
|
ddnsRepo?: DdnsRepository;
|