@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
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
"InvalidRelaySessionRequestError",
|
|
9
9
|
"InvalidTunnelTokenError",
|
|
10
10
|
"LEGACY_DERIVED_INDEX_CONSUMER_ID",
|
|
11
|
+
"LOG_FILE_PATTERN",
|
|
11
12
|
"normalizeContext",
|
|
12
13
|
"NodeRouteSourceNotFoundError",
|
|
13
14
|
"Omit",
|
|
@@ -15,6 +16,8 @@
|
|
|
15
16
|
"P2PSessionNotFoundError",
|
|
16
17
|
"P2PSignalingRequestError",
|
|
17
18
|
"registerDeviceNotificationRuntime",
|
|
19
|
+
"resolveCurrentLogFile",
|
|
20
|
+
"resolveLogFilePattern",
|
|
18
21
|
"SearchApiError",
|
|
19
22
|
"SolidFsConflictError",
|
|
20
23
|
"SolidFsNotFoundError",
|
|
@@ -22,5 +25,6 @@
|
|
|
22
25
|
"UnsupportedSparqlQueryError",
|
|
23
26
|
"Uint8Array",
|
|
24
27
|
"VectorApiError",
|
|
25
|
-
"WaitingRunnerError"
|
|
28
|
+
"WaitingRunnerError",
|
|
29
|
+
"ActivityEmitter"
|
|
26
30
|
]
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"@context": [
|
|
3
|
+
"https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/components/context.jsonld",
|
|
4
|
+
"https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/components/context.jsonld",
|
|
5
|
+
"https://linkedsoftwaredependencies.org/bundles/npm/asynchronous-handlers/^1.0.0/components/context.jsonld"
|
|
6
|
+
],
|
|
7
|
+
"@graph": [
|
|
8
|
+
{
|
|
9
|
+
"comment": "订阅通道记录在 internal_kv 里的只读视图(键前缀与 css:config/http/notifications/base/storage.json 的 ContainerPathStorage 保持一致,清扫器靠它枚举通道)。",
|
|
10
|
+
"@id": "urn:undefineds:xpod:NotificationChannelIndexStorage",
|
|
11
|
+
"@type": "ContainerPathStorage",
|
|
12
|
+
"relativePath": "/notifications/",
|
|
13
|
+
"source": {
|
|
14
|
+
"@id": "urn:solid-server:default:KeyValueStorage"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"comment": "CSS 的 WebSocket2023Storer 只在 socket 关闭时把它从内存 map 移除,通道记录会一直留到 endAt 过期;这里等位替换,在某个通道的最后一个 socket 关闭或出错时删除该通道。",
|
|
19
|
+
"@type": "Override",
|
|
20
|
+
"overrideInstance": {
|
|
21
|
+
"@id": "urn:solid-server:default:WebSocket2023Storer"
|
|
22
|
+
},
|
|
23
|
+
"overrideParameters": {
|
|
24
|
+
"@type": "ReclaimingWebSocket2023Storer",
|
|
25
|
+
"storage": {
|
|
26
|
+
"@id": "urn:solid-server:default:SubscriptionStorage"
|
|
27
|
+
},
|
|
28
|
+
"socketMap": {
|
|
29
|
+
"@id": "urn:solid-server:default:WebSocketMap"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"comment": "启动时清扫一次(进程刚起来,内存 map 必为空,持久化的通道不可能还有活动 socket),之后每 5 分钟清扫一次:无 socket 的通道需要连续两次被判定为孤儿才删除,给“刚创建、socket 还在握手”的通道留出宽限期。只回收本实例 baseUrl 下的通道。",
|
|
35
|
+
"@id": "urn:undefineds:xpod:NotificationChannelSweeper",
|
|
36
|
+
"@type": "NotificationChannelSweeper",
|
|
37
|
+
"storage": {
|
|
38
|
+
"@id": "urn:solid-server:default:SubscriptionStorage"
|
|
39
|
+
},
|
|
40
|
+
"channelIndex": {
|
|
41
|
+
"@id": "urn:undefineds:xpod:NotificationChannelIndexStorage"
|
|
42
|
+
},
|
|
43
|
+
"socketMap": {
|
|
44
|
+
"@id": "urn:solid-server:default:WebSocketMap"
|
|
45
|
+
},
|
|
46
|
+
"baseUrl": {
|
|
47
|
+
"@id": "urn:solid-server:default:variable:baseUrl"
|
|
48
|
+
},
|
|
49
|
+
"intervalMinutes": 5
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"comment": "把清扫器挂进 CSS 启动序列:与 css:config/http/notifications/base/listener.json 挂 ListeningActivityHandler 是同一机制(同一实例的 handlers 数组会追加)。",
|
|
53
|
+
"@id": "urn:solid-server:default:PrimaryParallelInitializer",
|
|
54
|
+
"@type": "ParallelHandler",
|
|
55
|
+
"handlers": [
|
|
56
|
+
{
|
|
57
|
+
"@id": "urn:undefineds:xpod:NotificationChannelSweeper"
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"comment": "寿命兜底:通道最长 12 小时(单位分钟,CSS 默认 20160 分钟即 2 周)。清扫生效时它只是第三道防线,同时保证长时间开着的页面最多被强制重新订阅一次。",
|
|
63
|
+
"@id": "urn:solid-server:default:WebSocket2023Subscriber",
|
|
64
|
+
"@type": "NotificationSubscriber",
|
|
65
|
+
"maxDuration": 720
|
|
66
|
+
}
|
|
67
|
+
]
|
|
68
|
+
}
|
package/config/xpod.base.json
CHANGED
|
@@ -16,7 +16,8 @@
|
|
|
16
16
|
],
|
|
17
17
|
"import": [
|
|
18
18
|
"./cli.json",
|
|
19
|
-
"./resolver.json"
|
|
19
|
+
"./resolver.json",
|
|
20
|
+
"./notifications.json"
|
|
20
21
|
],
|
|
21
22
|
"@graph": [
|
|
22
23
|
{
|
|
@@ -296,23 +297,17 @@
|
|
|
296
297
|
{
|
|
297
298
|
"comment": "Preserve exact WebID IRIs only in controlled CSS RDF templates; keep EJS and HTML escaping unchanged.",
|
|
298
299
|
"@type": "Override",
|
|
299
|
-
"overrideInstance": {
|
|
300
|
-
"@id": "urn:solid-server:default:TemplateEngine"
|
|
301
|
-
},
|
|
300
|
+
"overrideInstance": { "@id": "urn:solid-server:default:TemplateEngine" },
|
|
302
301
|
"overrideParameters": {
|
|
303
302
|
"@type": "StatusWaterfallHandler",
|
|
304
303
|
"handlers": [
|
|
305
304
|
{
|
|
306
305
|
"@type": "EjsTemplateEngine",
|
|
307
|
-
"baseUrl": {
|
|
308
|
-
"@id": "urn:solid-server:default:variable:baseUrl"
|
|
309
|
-
}
|
|
306
|
+
"baseUrl": { "@id": "urn:solid-server:default:variable:baseUrl" }
|
|
310
307
|
},
|
|
311
308
|
{
|
|
312
309
|
"@type": "RdfHandlebarsTemplateEngine",
|
|
313
|
-
"rdfTemplateBaseUrl": {
|
|
314
|
-
"@id": "urn:solid-server:default:variable:baseUrl"
|
|
315
|
-
}
|
|
310
|
+
"rdfTemplateBaseUrl": { "@id": "urn:solid-server:default:variable:baseUrl" }
|
|
316
311
|
}
|
|
317
312
|
]
|
|
318
313
|
}
|
|
@@ -375,7 +370,7 @@
|
|
|
375
370
|
}
|
|
376
371
|
},
|
|
377
372
|
{
|
|
378
|
-
"comment": "Serves subgraph-scoped SPARQL endpoints",
|
|
373
|
+
"comment": "Serves subgraph-scoped SPARQL endpoints. `emitter` is the activity emitter the notification stack listens to (css:config/http/notifications/base/listener.json subscribes to urn:solid-server:default:ResourceStore, i.e. the MonitoringStore), so /-/sparql writes notify like store writes.",
|
|
379
374
|
"@type": "SubgraphSparqlHttpHandler",
|
|
380
375
|
"@id": "urn:undefineds:xpod:SubgraphSparqlHttpHandler",
|
|
381
376
|
"queryEngine": {
|
|
@@ -393,6 +388,9 @@
|
|
|
393
388
|
"updateAuthority": {
|
|
394
389
|
"@id": "urn:undefineds:xpod:MixDataAccessor"
|
|
395
390
|
},
|
|
391
|
+
"emitter": {
|
|
392
|
+
"@id": "urn:solid-server:default:ResourceStore"
|
|
393
|
+
},
|
|
396
394
|
"options_identityDbUrl": {
|
|
397
395
|
"@id": "urn:solid-server:default:variable:identityDbUrl",
|
|
398
396
|
"@type": "Variable"
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading a Pod AI credential's secret.
|
|
3
|
+
*
|
|
4
|
+
* AI Connections stores the provider secret as an `encryptedSecret` envelope
|
|
5
|
+
* (plaintext JSON envelope locally, a wrapped secret cell in Cloud), while some
|
|
6
|
+
* older rows carry a bare `apiKey` property. Every consumer that needs the key —
|
|
7
|
+
* the Gateway for chat, and the embedding/indexing paths — must read the secret
|
|
8
|
+
* the same way, otherwise a key entered through AI Connections works for chat but
|
|
9
|
+
* not for embeddings.
|
|
10
|
+
*/
|
|
11
|
+
export declare const PLAINTEXT_CREDENTIAL_ALGORITHM = "PLAINTEXT";
|
|
12
|
+
export interface AiCredentialSecretContext {
|
|
13
|
+
webId: string;
|
|
14
|
+
/** Credential resource IRI, when the caller knows it (required by wrapped envelopes). */
|
|
15
|
+
credentialIri?: string;
|
|
16
|
+
/** Provider id, when the caller knows it (required by wrapped envelopes). */
|
|
17
|
+
provider?: string;
|
|
18
|
+
}
|
|
19
|
+
export type AiCredentialSecret = Record<string, unknown>;
|
|
20
|
+
export type AiCredentialSecretDecoder = (row: Record<string, unknown>, context: AiCredentialSecretContext) => Promise<AiCredentialSecret | undefined> | AiCredentialSecret | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Default decoder: bare `apiKey`, the `plaintext-v1` payload shape, and the
|
|
23
|
+
* `PLAINTEXT` envelope AI Connections writes locally. Wrapped envelopes return
|
|
24
|
+
* `undefined` so a caller with a credential vault can decode them.
|
|
25
|
+
*/
|
|
26
|
+
export declare const defaultAiCredentialSecretDecoder: AiCredentialSecretDecoder;
|
|
27
|
+
export declare function decodePlaintextAiCredentialSecret(row: Record<string, unknown>): AiCredentialSecret | undefined;
|
|
28
|
+
export declare function parseCredentialEnvelope(value: unknown): Record<string, unknown> | undefined;
|
|
29
|
+
/** Token fields a decoded secret may carry instead of `apiKey`. */
|
|
30
|
+
export declare function providerTokenFromSecret(secret: AiCredentialSecret | undefined): string | undefined;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Reading a Pod AI credential's secret.
|
|
4
|
+
*
|
|
5
|
+
* AI Connections stores the provider secret as an `encryptedSecret` envelope
|
|
6
|
+
* (plaintext JSON envelope locally, a wrapped secret cell in Cloud), while some
|
|
7
|
+
* older rows carry a bare `apiKey` property. Every consumer that needs the key —
|
|
8
|
+
* the Gateway for chat, and the embedding/indexing paths — must read the secret
|
|
9
|
+
* the same way, otherwise a key entered through AI Connections works for chat but
|
|
10
|
+
* not for embeddings.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.defaultAiCredentialSecretDecoder = exports.PLAINTEXT_CREDENTIAL_ALGORITHM = void 0;
|
|
14
|
+
exports.decodePlaintextAiCredentialSecret = decodePlaintextAiCredentialSecret;
|
|
15
|
+
exports.parseCredentialEnvelope = parseCredentialEnvelope;
|
|
16
|
+
exports.providerTokenFromSecret = providerTokenFromSecret;
|
|
17
|
+
exports.PLAINTEXT_CREDENTIAL_ALGORITHM = 'PLAINTEXT';
|
|
18
|
+
/**
|
|
19
|
+
* Default decoder: bare `apiKey`, the `plaintext-v1` payload shape, and the
|
|
20
|
+
* `PLAINTEXT` envelope AI Connections writes locally. Wrapped envelopes return
|
|
21
|
+
* `undefined` so a caller with a credential vault can decode them.
|
|
22
|
+
*/
|
|
23
|
+
const defaultAiCredentialSecretDecoder = (row) => decodePlaintextAiCredentialSecret(row);
|
|
24
|
+
exports.defaultAiCredentialSecretDecoder = defaultAiCredentialSecretDecoder;
|
|
25
|
+
function decodePlaintextAiCredentialSecret(row) {
|
|
26
|
+
const apiKey = stringValue(row.apiKey);
|
|
27
|
+
if (apiKey) {
|
|
28
|
+
return { ...apiKeySecret(row), apiKey };
|
|
29
|
+
}
|
|
30
|
+
const payload = decodePlaintextPayload(row);
|
|
31
|
+
if (payload) {
|
|
32
|
+
return payload;
|
|
33
|
+
}
|
|
34
|
+
return decodePlaintextEnvelope(row.encryptedSecret, row.secretPayload);
|
|
35
|
+
}
|
|
36
|
+
/** The `plaintext-v1` storage shape: a JSON `secretPayload` column. */
|
|
37
|
+
function decodePlaintextPayload(row) {
|
|
38
|
+
const storageMode = stringValue(row.storageMode);
|
|
39
|
+
const secretPayload = stringValue(row.secretPayload);
|
|
40
|
+
if (storageMode !== 'plaintext-v1' || !secretPayload) {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
return parseSecretObject(secretPayload);
|
|
44
|
+
}
|
|
45
|
+
/** The `encryptedSecret` envelope shape used by AI Connections. */
|
|
46
|
+
function decodePlaintextEnvelope(encryptedSecret, secretPayload) {
|
|
47
|
+
const envelope = parseEnvelope(encryptedSecret) ?? parseEnvelope(secretPayload);
|
|
48
|
+
if (!envelope) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
const algorithm = stringValue(envelope.algorithm);
|
|
52
|
+
if (algorithm !== exports.PLAINTEXT_CREDENTIAL_ALGORITHM) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
const ciphertext = stringValue(envelope.ciphertext);
|
|
56
|
+
if (!ciphertext) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
if (stringValue(envelope.encoding) === 'base64') {
|
|
60
|
+
try {
|
|
61
|
+
return parseSecretObject(Buffer.from(ciphertext, 'base64').toString('utf8'));
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return parseSecretObject(ciphertext);
|
|
68
|
+
}
|
|
69
|
+
function parseCredentialEnvelope(value) {
|
|
70
|
+
return parseEnvelope(value);
|
|
71
|
+
}
|
|
72
|
+
function parseEnvelope(value) {
|
|
73
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
74
|
+
return value;
|
|
75
|
+
}
|
|
76
|
+
const serialized = stringValue(value);
|
|
77
|
+
if (!serialized) {
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
const parsed = JSON.parse(serialized);
|
|
82
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
|
|
83
|
+
? parsed
|
|
84
|
+
: undefined;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function parseSecretObject(serialized) {
|
|
91
|
+
if (!serialized.trim()) {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
const parsed = JSON.parse(serialized);
|
|
96
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
|
|
97
|
+
? parsed
|
|
98
|
+
: undefined;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/** Token fields a decoded secret may carry instead of `apiKey`. */
|
|
105
|
+
function providerTokenFromSecret(secret) {
|
|
106
|
+
if (!secret) {
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
return stringValue(secret.apiKey)
|
|
110
|
+
?? stringValue(secret.accessToken)
|
|
111
|
+
?? stringValue(secret.token);
|
|
112
|
+
}
|
|
113
|
+
function apiKeySecret(row) {
|
|
114
|
+
const accessToken = stringValue(row.accessToken);
|
|
115
|
+
return accessToken ? { accessToken } : {};
|
|
116
|
+
}
|
|
117
|
+
function stringValue(value) {
|
|
118
|
+
return typeof value === 'string' && value.trim() ? value.trim() : undefined;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=AiCredentialSecret.js.map
|
|
@@ -1,8 +1,26 @@
|
|
|
1
1
|
import { CredentialReader } from './CredentialReader';
|
|
2
2
|
import type { AiCredential } from './types';
|
|
3
|
+
import { type AiCredentialSecretDecoder } from './AiCredentialSecret';
|
|
4
|
+
export interface CredentialReaderImplOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Reads the Pod credential secret. Defaults to the plaintext decoder, which
|
|
7
|
+
* covers bare `apiKey` rows, `plaintext-v1` payloads, and the `PLAINTEXT`
|
|
8
|
+
* envelope AI Connections writes; the container injects a vault-backed decoder
|
|
9
|
+
* so wrapped Cloud secrets resolve too.
|
|
10
|
+
*/
|
|
11
|
+
secretDecoder?: AiCredentialSecretDecoder;
|
|
12
|
+
}
|
|
3
13
|
export declare class CredentialReaderImpl extends CredentialReader {
|
|
4
14
|
protected readonly logger: import("global-logger-factory").Logger<unknown>;
|
|
15
|
+
private readonly secretDecoder;
|
|
16
|
+
constructor(options?: CredentialReaderImplOptions);
|
|
5
17
|
getAiCredential(podBaseUrl: string, providerId: string, authenticatedFetch: typeof fetch, webId?: string, options?: {
|
|
6
18
|
credentialId?: string;
|
|
7
19
|
}): Promise<AiCredential | null>;
|
|
20
|
+
/**
|
|
21
|
+
* AI Connections stores the provider secret in `encryptedSecret`; the shared
|
|
22
|
+
* selector only understands a plain `apiKey`. Decode each row first so the
|
|
23
|
+
* extension runtime sees the same credentials the Gateway does.
|
|
24
|
+
*/
|
|
25
|
+
private withDecodedSecrets;
|
|
8
26
|
}
|
|
@@ -5,6 +5,7 @@ const global_logger_factory_1 = require("global-logger-factory");
|
|
|
5
5
|
const drizzle_solid_1 = require("@undefineds.co/drizzle-solid");
|
|
6
6
|
const models_1 = require("@undefineds.co/models");
|
|
7
7
|
const CredentialReader_1 = require("./CredentialReader");
|
|
8
|
+
const AiCredentialSecret_1 = require("./AiCredentialSecret");
|
|
8
9
|
const tables_1 = require("../../credential/schema/tables");
|
|
9
10
|
const provider_1 = require("../schema/provider");
|
|
10
11
|
const types_1 = require("../../credential/schema/types");
|
|
@@ -13,9 +14,10 @@ const schema = {
|
|
|
13
14
|
provider: provider_1.Provider,
|
|
14
15
|
};
|
|
15
16
|
class CredentialReaderImpl extends CredentialReader_1.CredentialReader {
|
|
16
|
-
constructor() {
|
|
17
|
-
super(
|
|
17
|
+
constructor(options = {}) {
|
|
18
|
+
super();
|
|
18
19
|
this.logger = (0, global_logger_factory_1.getLoggerFor)(this);
|
|
20
|
+
this.secretDecoder = options.secretDecoder ?? AiCredentialSecret_1.defaultAiCredentialSecretDecoder;
|
|
19
21
|
}
|
|
20
22
|
async getAiCredential(podBaseUrl, providerId, authenticatedFetch, webId, options = {}) {
|
|
21
23
|
try {
|
|
@@ -28,10 +30,12 @@ class CredentialReaderImpl extends CredentialReader_1.CredentialReader {
|
|
|
28
30
|
where: (0, drizzle_solid_1.and)((0, drizzle_solid_1.eq)(tables_1.Credential.service, types_1.ServiceType.AI), (0, drizzle_solid_1.eq)(tables_1.Credential.status, types_1.CredentialStatus.ACTIVE)),
|
|
29
31
|
});
|
|
30
32
|
const providers = await db.query.provider.findMany();
|
|
33
|
+
const enabled = credentials.filter((credential) => credentialEnabled(credential));
|
|
31
34
|
const credentialRows = options.credentialId
|
|
32
|
-
?
|
|
33
|
-
:
|
|
34
|
-
const
|
|
35
|
+
? enabled.filter((credential) => matchesCredentialId(credential, options.credentialId))
|
|
36
|
+
: enabled;
|
|
37
|
+
const decrypted = await this.withDecodedSecrets(credentialRows, { podBaseUrl, webId });
|
|
38
|
+
const selection = (0, models_1.selectAIConfigCredential)(providerId, decrypted, providers);
|
|
35
39
|
if (!selection) {
|
|
36
40
|
this.logger.debug(`No active credential found for provider: ${providerId}`);
|
|
37
41
|
return null;
|
|
@@ -49,8 +53,80 @@ class CredentialReaderImpl extends CredentialReader_1.CredentialReader {
|
|
|
49
53
|
return null;
|
|
50
54
|
}
|
|
51
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* AI Connections stores the provider secret in `encryptedSecret`; the shared
|
|
58
|
+
* selector only understands a plain `apiKey`. Decode each row first so the
|
|
59
|
+
* extension runtime sees the same credentials the Gateway does.
|
|
60
|
+
*/
|
|
61
|
+
async withDecodedSecrets(rows, context) {
|
|
62
|
+
return Promise.all(rows.map(async (row) => {
|
|
63
|
+
if (typeof row?.apiKey === 'string' && row.apiKey.trim()) {
|
|
64
|
+
return row;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
const secret = await this.secretDecoder(row, {
|
|
68
|
+
webId: context.webId ?? '',
|
|
69
|
+
credentialIri: credentialIriFor(row, context.podBaseUrl),
|
|
70
|
+
provider: credentialProviderId(row),
|
|
71
|
+
});
|
|
72
|
+
const apiKey = (0, AiCredentialSecret_1.providerTokenFromSecret)(secret);
|
|
73
|
+
return apiKey ? { ...row, apiKey } : row;
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
this.logger.debug(`Failed to decode credential secret ${String(row?.id)}: ${error}`);
|
|
77
|
+
return row;
|
|
78
|
+
}
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
52
81
|
}
|
|
53
82
|
exports.CredentialReaderImpl = CredentialReaderImpl;
|
|
83
|
+
function credentialEnabled(credential) {
|
|
84
|
+
const metadata = parseMetadata(credential?.metadata);
|
|
85
|
+
return metadata?.enabled !== false;
|
|
86
|
+
}
|
|
87
|
+
function parseMetadata(value) {
|
|
88
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
89
|
+
return value;
|
|
90
|
+
}
|
|
91
|
+
if (typeof value !== 'string' || !value.trim()) {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
const parsed = JSON.parse(value);
|
|
96
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
|
|
97
|
+
? parsed
|
|
98
|
+
: undefined;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function credentialIriFor(row, podBaseUrl) {
|
|
105
|
+
const id = typeof row?.id === 'string' ? row.id : undefined;
|
|
106
|
+
const iri = typeof row?.['@id'] === 'string' ? row['@id'] : undefined;
|
|
107
|
+
if (iri) {
|
|
108
|
+
return iri;
|
|
109
|
+
}
|
|
110
|
+
if (!id) {
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
if (/^https?:\/\//.test(id)) {
|
|
114
|
+
return id;
|
|
115
|
+
}
|
|
116
|
+
const base = podBaseUrl?.replace(/\/+$/, '');
|
|
117
|
+
return base ? `${base}/settings/credentials.ttl#${id}` : undefined;
|
|
118
|
+
}
|
|
119
|
+
function credentialProviderId(row) {
|
|
120
|
+
const value = typeof row?.provider === 'string' ? row.provider : undefined;
|
|
121
|
+
if (!value) {
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
const fragment = value.lastIndexOf('#');
|
|
125
|
+
const withoutFragment = fragment >= 0 && fragment < value.length - 1 ? value.slice(fragment + 1) : value;
|
|
126
|
+
const clean = withoutFragment.replace(/\/+$/, '').replace(/\.ttl$/u, '');
|
|
127
|
+
const segment = clean.slice(clean.lastIndexOf('/') + 1);
|
|
128
|
+
return segment || undefined;
|
|
129
|
+
}
|
|
54
130
|
function matchesCredentialId(credential, requestedId) {
|
|
55
131
|
if (!requestedId)
|
|
56
132
|
return true;
|
|
@@ -11,7 +11,23 @@
|
|
|
11
11
|
"extends": [
|
|
12
12
|
"undefineds:dist/ai/service/CredentialReader.jsonld#CredentialReader"
|
|
13
13
|
],
|
|
14
|
-
"parameters": [
|
|
14
|
+
"parameters": [
|
|
15
|
+
{
|
|
16
|
+
"@id": "undefineds:dist/ai/service/CredentialReaderImpl.jsonld#CredentialReaderImpl_options_secretDecoder",
|
|
17
|
+
"range": {
|
|
18
|
+
"@type": "ParameterRangeUnion",
|
|
19
|
+
"parameterRangeElements": [
|
|
20
|
+
{
|
|
21
|
+
"@type": "ParameterRangeWildcard"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"@type": "ParameterRangeUndefined"
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
},
|
|
28
|
+
"comment": "Reads the Pod credential secret. Defaults to the plaintext decoder, which covers bare `apiKey` rows, `plaintext-v1` payloads, and the `PLAINTEXT` envelope AI Connections writes; the container injects a vault-backed decoder so wrapped Cloud secrets resolve too."
|
|
29
|
+
}
|
|
30
|
+
],
|
|
15
31
|
"memberFields": [
|
|
16
32
|
{
|
|
17
33
|
"@id": "undefineds:dist/ai/service/CredentialReaderImpl.jsonld#CredentialReaderImpl__member_logger",
|
|
@@ -20,12 +36,36 @@
|
|
|
20
36
|
"@type": "ParameterRangeWildcard"
|
|
21
37
|
}
|
|
22
38
|
},
|
|
39
|
+
{
|
|
40
|
+
"@id": "undefineds:dist/ai/service/CredentialReaderImpl.jsonld#CredentialReaderImpl__member_secretDecoder",
|
|
41
|
+
"memberFieldName": "secretDecoder"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"@id": "undefineds:dist/ai/service/CredentialReaderImpl.jsonld#CredentialReaderImpl__member_constructor",
|
|
45
|
+
"memberFieldName": "constructor"
|
|
46
|
+
},
|
|
23
47
|
{
|
|
24
48
|
"@id": "undefineds:dist/ai/service/CredentialReaderImpl.jsonld#CredentialReaderImpl__member_getAiCredential",
|
|
25
49
|
"memberFieldName": "getAiCredential"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"@id": "undefineds:dist/ai/service/CredentialReaderImpl.jsonld#CredentialReaderImpl__member_withDecodedSecrets",
|
|
53
|
+
"memberFieldName": "withDecodedSecrets"
|
|
26
54
|
}
|
|
27
55
|
],
|
|
28
|
-
"constructorArguments": [
|
|
56
|
+
"constructorArguments": [
|
|
57
|
+
{
|
|
58
|
+
"@id": "undefineds:dist/ai/service/CredentialReaderImpl.jsonld#CredentialReaderImpl_options__constructorArgument",
|
|
59
|
+
"fields": [
|
|
60
|
+
{
|
|
61
|
+
"keyRaw": "secretDecoder",
|
|
62
|
+
"value": {
|
|
63
|
+
"@id": "undefineds:dist/ai/service/CredentialReaderImpl.jsonld#CredentialReaderImpl_options_secretDecoder"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
]
|
|
29
69
|
}
|
|
30
70
|
]
|
|
31
71
|
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deployment policy for embedding models and their endpoint.
|
|
3
|
+
*
|
|
4
|
+
* The ai-gateway provider catalog is the authority for which models a
|
|
5
|
+
* deployment provides. A Cloud deployment must not offer arbitrary embedding
|
|
6
|
+
* models — not even through a BYOK credential — and a Cloud user cannot supply an
|
|
7
|
+
* endpoint: the catalog names the provider and the endpoint, the user only brings
|
|
8
|
+
* an API key. A Local deployment may use any model and any endpoint the user
|
|
9
|
+
* configures. This module is the single decision point so the registration,
|
|
10
|
+
* configuration and runtime paths cannot drift apart.
|
|
11
|
+
*/
|
|
12
|
+
export declare const EMBEDDING_MODEL_NOT_ALLOWED = "embedding_model_not_allowed";
|
|
13
|
+
export declare const EMBEDDING_ENDPOINT_NOT_PROVIDED = "embedding_endpoint_not_provided";
|
|
14
|
+
/** Port over the ai-gateway provider catalog. */
|
|
15
|
+
export interface EmbeddingModelCatalog {
|
|
16
|
+
/** True only for models this catalog provides as embedding models. */
|
|
17
|
+
isManagedEmbeddingModel(provider: string, modelId: string): boolean;
|
|
18
|
+
/** Endpoint this deployment provides for that provider, if it provides one. */
|
|
19
|
+
managedEmbeddingBaseUrl(provider: string): string | undefined;
|
|
20
|
+
}
|
|
21
|
+
export interface EmbeddingModelPolicyInput {
|
|
22
|
+
deployment: string;
|
|
23
|
+
catalog?: EmbeddingModelCatalog;
|
|
24
|
+
}
|
|
25
|
+
export interface EmbeddingModelRequest {
|
|
26
|
+
provider: string;
|
|
27
|
+
model: string;
|
|
28
|
+
}
|
|
29
|
+
/** Endpoint inputs a Pod may carry. A Cloud deployment ignores the Pod values. */
|
|
30
|
+
export interface EmbeddingEndpointRequest {
|
|
31
|
+
provider: string;
|
|
32
|
+
baseUrl?: string;
|
|
33
|
+
proxyUrl?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface EmbeddingEndpoint {
|
|
36
|
+
baseUrl?: string;
|
|
37
|
+
proxyUrl?: string;
|
|
38
|
+
/** Whether the endpoint came from the deployment catalog or from the Pod. */
|
|
39
|
+
source: 'catalog' | 'pod';
|
|
40
|
+
}
|
|
41
|
+
export declare class EmbeddingPolicyError extends Error {
|
|
42
|
+
readonly code: string;
|
|
43
|
+
protected constructor(code: string, message: string);
|
|
44
|
+
}
|
|
45
|
+
export declare class EmbeddingModelNotAllowedError extends EmbeddingPolicyError {
|
|
46
|
+
constructor(provider: string, model: string);
|
|
47
|
+
}
|
|
48
|
+
export declare class EmbeddingEndpointNotProvidedError extends EmbeddingPolicyError {
|
|
49
|
+
constructor(provider: string);
|
|
50
|
+
}
|
|
51
|
+
export declare class EmbeddingModelPolicy {
|
|
52
|
+
private readonly catalog?;
|
|
53
|
+
private constructor();
|
|
54
|
+
/** Local deployments (and runtimes without a catalog) keep arbitrary BYOK models. */
|
|
55
|
+
static allowAll(): EmbeddingModelPolicy;
|
|
56
|
+
static fromCatalog(catalog: EmbeddingModelCatalog): EmbeddingModelPolicy;
|
|
57
|
+
isEnforced(): boolean;
|
|
58
|
+
isAllowed(input: EmbeddingModelRequest): boolean;
|
|
59
|
+
assertAllowed(input: EmbeddingModelRequest): void;
|
|
60
|
+
/**
|
|
61
|
+
* Resolve the endpoint an embedding call may use.
|
|
62
|
+
*
|
|
63
|
+
* Local (and catalog-less runtimes) keep whatever the Pod carries. A Cloud
|
|
64
|
+
* deployment replaces the Pod endpoint with the one its catalog provides and
|
|
65
|
+
* drops any Pod proxy, so a BYOK key can never redirect Cloud egress.
|
|
66
|
+
*/
|
|
67
|
+
resolveEndpoint(input: EmbeddingEndpointRequest): EmbeddingEndpoint;
|
|
68
|
+
}
|
|
69
|
+
export declare function createEmbeddingModelPolicy(input: EmbeddingModelPolicyInput): EmbeddingModelPolicy;
|
|
70
|
+
/** True for every deployment rejection, so callers never retry a policy decision. */
|
|
71
|
+
export declare function isEmbeddingPolicyRejection(error: unknown): boolean;
|
|
72
|
+
export declare function isEmbeddingModelNotAllowedError(error: unknown): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Parse an AI Config model assignment (`settings/providers/<provider>.ttl#<model>`
|
|
75
|
+
* or its absolute form) into the provider/model pair the policy checks. A ref
|
|
76
|
+
* that does not name both cannot be proven to be provided, so it resolves to
|
|
77
|
+
* `undefined` and an enforcing policy rejects it.
|
|
78
|
+
*/
|
|
79
|
+
export declare function parseEmbeddingModelRef(ref: string): EmbeddingModelRequest | undefined;
|