@undefineds.co/xpod 0.4.11 → 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/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/EdgeNodeRepository.d.ts +0 -12
- package/dist/identity/drizzle/EdgeNodeRepository.js +5 -13
- 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/package.json +15 -7
- package/static/app/assets/main.css +1 -1
- 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-BbUqop4b.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-Vp2PrMxs.js → NetworkPage-B3qBfANA.js} +2 -2
- package/static/auth-callback/assets/{PaneListHeader-DY7baSFl.js → PaneListHeader-QQeJGTp4.js} +1 -1
- package/static/auth-callback/assets/SearchIndexingPanel-MyNUSEwT.js +1 -0
- package/static/auth-callback/assets/{StatusSubjectPanel-ArIS-TxT.js → StatusSubjectPanel-DQkEVsFs.js} +1 -1
- package/static/{settings/assets/StatusWorkspace-CoMFRXoV.js → auth-callback/assets/StatusWorkspace-Dkv63Uwk.js} +1 -1
- package/static/auth-callback/assets/{SystemSettingsPage-BDvT1NUz.js → SystemSettingsPage-TIsUfX5d.js} +1 -1
- package/static/{dashboard/assets/SystemSettingsSubjectPanel-WaE8mTQi.js → auth-callback/assets/SystemSettingsSubjectPanel-BJWEt2-7.js} +5 -5
- package/static/auth-callback/assets/XpodAiConnectionsPodStore-BJiXm-PF.js +3 -0
- package/static/auth-callback/assets/{activity-D1Dsfa_0.js → activity-5hNeNKnL.js} +1 -1
- package/static/auth-callback/assets/ai-connections-CryuHGKW.js +1 -0
- package/static/auth-callback/assets/{auth-callback-Cmf4hXVZ.js → auth-callback-CAFZ3R0B.js} +6 -6
- package/static/auth-callback/assets/auth-callback-rk080mvG.css +1 -0
- package/static/auth-callback/assets/{badge-CZsHq3Ih.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-DU9ntlHw.js → download-B3Up5W2G.js} +1 -1
- package/static/auth-callback/assets/{external-link-BfzaaZDx.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-BNFqqC74.js → index-browser-DtU38ni3.js} +1 -1
- package/static/auth-callback/assets/{key-round-BwP3DBWo.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-VMwnmyab.js → rotate-ccw-C1zM2KtS.js} +1 -1
- package/static/auth-callback/assets/{skeleton-CoD55rBT.js → skeleton-Cqp7_M9-.js} +1 -1
- package/static/auth-callback/assets/{waypoints-DRo_1Ca7.js → waypoints-Bj6gAUSQ.js} +1 -1
- package/static/auth-callback/assets/{workspace-layout--mcXl3My.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-B2cXwl8X.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-DV2V0qWO.js → NetworkPage-BAIPw-D_.js} +2 -2
- package/static/dashboard/assets/{PaneListHeader-D0c1yCFH.js → PaneListHeader-BBCMei0r.js} +1 -1
- package/static/dashboard/assets/SearchIndexingPanel-Ck4Y-xjR.js +1 -0
- package/static/dashboard/assets/{StatusSubjectPanel-oPSECj7i.js → StatusSubjectPanel-D1KWfAXE.js} +1 -1
- package/static/dashboard/assets/{StatusWorkspace-PdovQPKa.js → StatusWorkspace-JbA5gzXx.js} +1 -1
- package/static/dashboard/assets/{SystemSettingsPage-CtNDklkx.js → SystemSettingsPage-BbwQWsSR.js} +1 -1
- package/static/{settings/assets/SystemSettingsSubjectPanel-DExjDo_v.js → dashboard/assets/SystemSettingsSubjectPanel-N117nMt5.js} +5 -5
- package/static/dashboard/assets/XpodAiConnectionsPodStore-CdDOb4SV.js +18 -0
- package/static/dashboard/assets/{activity-B9ylSoyr.js → activity-DX1I96o_.js} +1 -1
- package/static/dashboard/assets/ai-connections-DwCRqOQa.js +1 -0
- package/static/dashboard/assets/{badge-BNbFbpIb.js → badge-k2vhtDqH.js} +1 -1
- package/static/dashboard/assets/collection-runtime-BFQ8teQJ.js +1 -0
- package/static/dashboard/assets/{dashboard-CD-FFVRD.js → dashboard-DWZ-fmCT.js} +4 -4
- package/static/dashboard/assets/dashboard-rk080mvG.css +1 -0
- package/static/dashboard/assets/dialog-1CCw-iHT.js +1 -0
- package/static/dashboard/assets/{download-nOP38LtW.js → download-C6-SNY1q.js} +1 -1
- package/static/dashboard/assets/{external-link-Bh2ewN9E.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-bGmguBLv.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-D2x__ODW.js → rotate-ccw-CCgJqsvx.js} +1 -1
- package/static/dashboard/assets/{skeleton-VOqft8WS.js → skeleton-Bc7abAn5.js} +1 -1
- package/static/dashboard/assets/{waypoints-fgRqm4oH.js → waypoints-s-opmJxx.js} +1 -1
- package/static/dashboard/assets/{workspace-layout-DV4dgeHX.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-BgbI9c-a.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-C8OA9Mtp.js → NetworkPage-BKymvsQc.js} +2 -2
- package/static/settings/assets/{PaneListHeader-COvlPJWj.js → PaneListHeader-Bjh3hRdQ.js} +1 -1
- package/static/settings/assets/SearchIndexingPanel-MjKL5QLU.js +1 -0
- package/static/settings/assets/{StatusSubjectPanel-BuLml7qn.js → StatusSubjectPanel-Bvl6K4mx.js} +1 -1
- package/static/settings/assets/StatusWorkspace-B0NzrP--.js +1 -0
- package/static/settings/assets/{SystemSettingsPage-DlzmaWV-.js → SystemSettingsPage-D2z6Z4FE.js} +1 -1
- package/static/{auth-callback/assets/SystemSettingsSubjectPanel-CDqRuC4t.js → settings/assets/SystemSettingsSubjectPanel-4sxma4X4.js} +5 -5
- package/static/settings/assets/XpodAiConnectionsPodStore-BkNQ8fZx.js +3 -0
- package/static/settings/assets/{activity-TLerXgMs.js → activity-CgJJGpjx.js} +1 -1
- package/static/settings/assets/ai-connections-CryuHGKW.js +1 -0
- package/static/settings/assets/{badge-Bcs8iWrH.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-Ct3QmHPt.js → download-DaLJJ-Wp.js} +1 -1
- package/static/settings/assets/{external-link-C8KiHbss.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-CazX1pc2.js → index-browser-BGpvHwD0.js} +1 -1
- package/static/settings/assets/{key-round-B19YD1GA.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-AQm2kMgU.js → rotate-ccw-TCabbqsr.js} +1 -1
- package/static/settings/assets/{settings-C-VBtt9r.js → settings-CJWpdbNC.js} +5 -5
- package/static/settings/assets/settings-rk080mvG.css +1 -0
- package/static/settings/assets/{skeleton-DyZ1OBYf.js → skeleton-JDHYVe7t.js} +1 -1
- package/static/settings/assets/{waypoints-CC3wq-SU.js → waypoints-DDvEl-MU.js} +1 -1
- package/static/settings/assets/{workspace-layout-BxXNKgf9.js → workspace-layout-DV5QU30U.js} +1 -1
- package/static/settings/settings.html +2 -2
- package/static/auth-callback/assets/AiConfigContext-DqWRSm7n.js +0 -1
- package/static/auth-callback/assets/AiConfigPage-C5YYyvzl.js +0 -1
- package/static/auth-callback/assets/DocumentProcessingPanel-DZCiacBz.js +0 -1
- package/static/auth-callback/assets/IndexLifecyclePanel-CCLeOljB.js +0 -1
- package/static/auth-callback/assets/ModelAssignmentsPanel-jUUTDKuh.js +0 -1
- package/static/auth-callback/assets/ModelsPage-B08zdtff.js +0 -10
- package/static/auth-callback/assets/SearchIndexingPanel-D4YRg1-8.js +0 -1
- package/static/auth-callback/assets/StatusWorkspace-Cp5LQ9Yx.js +0 -1
- package/static/auth-callback/assets/ai-connections-CHNTKemd.js +0 -1
- package/static/auth-callback/assets/auth-callback-DWMMiFjh.css +0 -1
- package/static/auth-callback/assets/index-DSNnLUbU.js +0 -4
- package/static/auth-callback/assets/index-FHhHoKgp.js +0 -41
- package/static/dashboard/assets/AiConfigContext-BpPDKSzI.js +0 -1
- package/static/dashboard/assets/AiConfigPage-wsqEZDIX.js +0 -1
- package/static/dashboard/assets/DocumentProcessingPanel-CDSy3juc.js +0 -1
- package/static/dashboard/assets/IndexLifecyclePanel-CVd6vQCX.js +0 -1
- package/static/dashboard/assets/ModelAssignmentsPanel-BeBZhnQd.js +0 -1
- package/static/dashboard/assets/ModelsPage-B6McSCJw.js +0 -25
- package/static/dashboard/assets/SearchIndexingPanel-CGs0OZ12.js +0 -1
- package/static/dashboard/assets/ai-connections-CHNTKemd.js +0 -1
- package/static/dashboard/assets/dashboard-DWMMiFjh.css +0 -1
- package/static/dashboard/assets/index-PgS-Bt7X.js +0 -41
- package/static/dashboard/assets/index-QN2QgEwr.js +0 -4
- package/static/settings/assets/AiConfigContext-zKQYdfai.js +0 -1
- package/static/settings/assets/AiConfigPage-Bs1EE3Ei.js +0 -1
- package/static/settings/assets/DocumentProcessingPanel-CSFfdOXS.js +0 -1
- package/static/settings/assets/IndexLifecyclePanel-BR9Su49B.js +0 -1
- package/static/settings/assets/ModelAssignmentsPanel-C0BE7nbk.js +0 -1
- package/static/settings/assets/ModelsPage-CU-YQ8_7.js +0 -10
- package/static/settings/assets/SearchIndexingPanel-Bdd46mIV.js +0 -1
- package/static/settings/assets/ai-connections-CHNTKemd.js +0 -1
- package/static/settings/assets/index-1Q2cRjZd.js +0 -41
- package/static/settings/assets/index-DBO_Vq0P.js +0 -4
- package/static/settings/assets/settings-DWMMiFjh.css +0 -1
|
@@ -321,6 +321,7 @@ export declare const solidResources: {
|
|
|
321
321
|
id: import("@undefineds.co/drizzle-solid/dist/core/schema").PodStringColumn<false, false>;
|
|
322
322
|
provider: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
323
323
|
authMode: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, true>;
|
|
324
|
+
offeringId: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
324
325
|
service: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, true>;
|
|
325
326
|
status: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, true>;
|
|
326
327
|
apiKey: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
@@ -352,6 +353,7 @@ export declare const solidResources: {
|
|
|
352
353
|
oauthExpiresAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
|
|
353
354
|
projectId: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
354
355
|
organizationId: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
356
|
+
metadata: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"json", null, false, false>;
|
|
355
357
|
}>>;
|
|
356
358
|
aiProviderResource: import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
|
|
357
359
|
id: import("@undefineds.co/drizzle-solid/dist/core/schema").PodStringColumn<false, false>;
|
|
@@ -1049,6 +1051,7 @@ export declare const solidSchema: {
|
|
|
1049
1051
|
id: import("@undefineds.co/drizzle-solid/dist/core/schema").PodStringColumn<false, false>;
|
|
1050
1052
|
provider: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
1051
1053
|
authMode: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, true>;
|
|
1054
|
+
offeringId: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
1052
1055
|
service: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, true>;
|
|
1053
1056
|
status: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, true>;
|
|
1054
1057
|
apiKey: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
@@ -1080,6 +1083,7 @@ export declare const solidSchema: {
|
|
|
1080
1083
|
oauthExpiresAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
|
|
1081
1084
|
projectId: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
1082
1085
|
organizationId: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
|
|
1086
|
+
metadata: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"json", null, false, false>;
|
|
1083
1087
|
}>>;
|
|
1084
1088
|
aiProviderTable: import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
|
|
1085
1089
|
id: import("@undefineds.co/drizzle-solid/dist/core/schema").PodStringColumn<false, false>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { sessionResource, sessionTable, buildRuntimeSessionIri, extractSessionIdFromSessionRef, extractRuntimeSessionId, type SessionStatus, type SessionRow, type SessionInsert, type SessionUpdate, } from './session.schema';
|
|
1
|
+
export { sessionResource, sessionTable, buildRuntimeSessionIri, extractSessionIdFromSessionRef, extractRuntimeSessionId, type SessionStatus, type SessionRow, type SessionInsert, type SessionUpdate, } from './session.schema.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { settingsResource, settingsTable, SETTING_KEYS, type SettingKey, type SettingsRow, type SettingsInsert, type SettingsUpdate } from "./settings.schema";
|
|
1
|
+
export { settingsResource, settingsTable, SETTING_KEYS, type SettingKey, type SettingsRow, type SettingsInsert, type SettingsUpdate } from "./settings.schema.js";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { ApprovalInsert, ApprovalUpdate } from '../approval.schema';
|
|
2
|
-
import type { AuditInsert } from '../audit.schema';
|
|
3
|
-
import type { GrantInsert } from '../grant.schema';
|
|
4
|
-
import type { InboxNotificationInsert } from '../inbox-notification.schema';
|
|
5
|
-
import type { ToolCallEvent, InboxApprovalEvent, SessionStateEvent } from './sidecar-events';
|
|
1
|
+
import type { ApprovalInsert, ApprovalUpdate } from '../approval.schema.js';
|
|
2
|
+
import type { AuditInsert } from '../audit.schema.js';
|
|
3
|
+
import type { GrantInsert } from '../grant.schema.js';
|
|
4
|
+
import type { InboxNotificationInsert } from '../inbox-notification.schema.js';
|
|
5
|
+
import type { ToolCallEvent, InboxApprovalEvent, SessionStateEvent } from './sidecar-events.js';
|
|
6
6
|
export type ChatSessionProjection = {
|
|
7
7
|
chat: string;
|
|
8
8
|
sessionStatus: 'active' | 'paused' | 'completed' | 'error';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { definePodRepository } from './repository';
|
|
2
|
-
import { threadResource, type ThreadRow, type ThreadInsert, type ThreadUpdate } from './thread.schema';
|
|
1
|
+
import { definePodRepository } from './repository.js';
|
|
2
|
+
import { threadResource, type ThreadRow, type ThreadInsert, type ThreadUpdate } from './thread.schema.js';
|
|
3
3
|
export interface ChatThreadTarget extends Record<string, unknown> {
|
|
4
4
|
parent: string;
|
|
5
5
|
id?: string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ToolApprovalStatus, ToolCallStatus, TaskProgressStepStatus } from './collaboration-blocks';
|
|
1
|
+
import type { ToolApprovalStatus, ToolCallStatus, TaskProgressStepStatus } from './collaboration-blocks.js';
|
|
2
2
|
/**
|
|
3
3
|
* Message Block Types - 基于 Cherry Studio 的 block-based 消息系统
|
|
4
4
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from '../namespaces';
|
|
1
|
+
export * from '../namespaces.js';
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
export * from './_namespaces';
|
|
2
|
-
export * from './chat.vocab';
|
|
3
|
-
export * from './message.vocab';
|
|
4
|
-
export * from './contact.vocab';
|
|
5
|
-
export * from './thread.vocab';
|
|
6
|
-
export * from './session.vocab';
|
|
7
|
-
export * from './workflow.vocab';
|
|
8
|
-
export * from './capture.vocab';
|
|
9
|
-
export * from './sidecar.vocab';
|
|
10
|
-
export * from './reader-materialization.vocab';
|
|
1
|
+
export * from './_namespaces.js';
|
|
2
|
+
export * from './chat.vocab.js';
|
|
3
|
+
export * from './message.vocab.js';
|
|
4
|
+
export * from './contact.vocab.js';
|
|
5
|
+
export * from './thread.vocab.js';
|
|
6
|
+
export * from './session.vocab.js';
|
|
7
|
+
export * from './workflow.vocab.js';
|
|
8
|
+
export * from './capture.vocab.js';
|
|
9
|
+
export * from './sidecar.vocab.js';
|
|
10
|
+
export * from './reader-materialization.vocab.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@undefineds.co/models",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.59",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -95,7 +95,9 @@
|
|
|
95
95
|
"skills:pack": "yarn skills:check && node scripts/pack-skills.mjs",
|
|
96
96
|
"sync:discovery:vercel": "node --experimental-strip-types scripts/sync-discovery-vercel.ts",
|
|
97
97
|
"test": "vitest run",
|
|
98
|
-
"test:
|
|
98
|
+
"test:types": "tsc -p tsconfig.types.json",
|
|
99
|
+
"test:dist-types": "node scripts/check-dist-types.mjs",
|
|
100
|
+
"test:ci": "tsc -p tsconfig.types.json && node scripts/check-dist-types.mjs && vitest run tests/ai-config.test.ts tests/ai-runtime-repository.test.ts tests/ai-runtime-schema.test.ts tests/ai-gateway-schema.test.ts tests/chat-project.test.ts tests/client.test.ts tests/contracts-chat-contact.contract.test.ts tests/discovery-vercel.test.ts tests/discovery.test.ts tests/issue-schema.test.ts tests/message-repository.test.ts tests/profile.test.ts tests/protocol-metadata.test.ts tests/repository.test.ts tests/resource-utils.test.ts tests/session-schema.test.ts tests/sidecar-events.contract.test.ts tests/resource-schema.test.ts tests/resource-id-defaults.test.ts tests/pod-storage-descriptor.test.ts tests/pod-storage-descriptor.types.test.ts tests/capture-schema.test.ts tests/udfs-cli.test.ts",
|
|
99
101
|
"test:pod": "dotenv -e ../linx-models/.env -- vitest run tests/pod.integration.test.ts"
|
|
100
102
|
},
|
|
101
103
|
"dependencies": {
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# @undefineds.co/pod-collections
|
|
2
|
+
|
|
3
|
+
声明式 **Pod 表集合** adapter:一个 Pod 表(同一 RDF 文档内的一类主语)用一条声明描述,
|
|
4
|
+
消费方拿到的是活数据 —— 按 key 增量更新、带乐观写入与回滚。
|
|
5
|
+
|
|
6
|
+
设计权威:[`docs/pod-collections.md`](../../docs/pod-collections.md)(§2 声明、§3 同步算法、
|
|
7
|
+
§4 乐观契约、§8 分期)。本包是那份设计的 P1 落地。
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
import { credentialDescriptor, credentialResource } from '@undefineds.co/models';
|
|
11
|
+
import { definePodCollection } from '@undefineds.co/pod-collections';
|
|
12
|
+
|
|
13
|
+
const credentials = definePodCollection(credentialDescriptor, {
|
|
14
|
+
table: credentialResource,
|
|
15
|
+
database,
|
|
16
|
+
podUrl,
|
|
17
|
+
feed: solidNotifications, // 宿主注入的脏信号能力(结构上满足 PodDocumentFeed)
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
credentials.tableDocument; // `${podUrl}settings/credentials.ttl`(由 storage.base 推导)
|
|
21
|
+
await credentials.preload();
|
|
22
|
+
const row = credentials.get('openai-1'); // RowOf<typeof credentialDescriptor>
|
|
23
|
+
await credentials.update('openai-1', (draft) => { draft.label = 'Renamed'; }).isPersisted.promise;
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## 定位(做什么)
|
|
27
|
+
|
|
28
|
+
- **schema 只来自 models 的 descriptor**:`storage.base` / `resourceIdPattern` 推导文档(topic),
|
|
29
|
+
`fields[*].predicate` 决定字段落在哪一列,`class` 决定行准入。本包不写表清单、不写字段映射表、
|
|
30
|
+
不写布局常量(守卫测试 `test/guards.test.ts` 会失败)。
|
|
31
|
+
- **读**:`conditionalDocumentRead()` 是唯一读原语,走 drizzle-solid 的 `select()`;脏信号驱动
|
|
32
|
+
合并窗口(默认 75ms)后的重读 + 投影 diff,只写真正变化的行(`begin/write/commit`),
|
|
33
|
+
未变的行不产生新对象,组件身份与乐观状态都不被整表替换动摇。
|
|
34
|
+
- **写**:`onInsert` / `onUpdate` / `onDelete` → `insert().values()` / `updateById()` / `deleteById()`;
|
|
35
|
+
`array: true` + `type: 'uri'` 字段走一次认证过的 SPARQL PATCH(单一入口 `writeField()`),
|
|
36
|
+
不进 ORM。
|
|
37
|
+
- **乐观**:写入后立刻重读确认,确认条件满足前 handler 不 resolve;服务端拒绝或读不到意图 →
|
|
38
|
+
抛错,由 TanStack DB 自动回滚;外部冲突 server wins + `conflicts` 标记 + `onConflict` 回调。
|
|
39
|
+
确认只承诺**读得回来**的东西:只写字段(`secret: true`,不进投影)不参与比对,也不会
|
|
40
|
+
因为它们判冲突 —— 它们的证据是写入调用本身成功;可读字段一个都不放宽(`§9-7`)。
|
|
41
|
+
- **不轮询**:没有 feed 就只读一次,之后只能显式 `refresh()`,同步状态为 `unavailable`;
|
|
42
|
+
源码里没有 `setInterval`(守卫测试断言)。
|
|
43
|
+
|
|
44
|
+
## 边界(不做什么)
|
|
45
|
+
|
|
46
|
+
- **不做 schema 副本**:字段、谓词、布局、日期分桶、exact id 规则都以 `@undefineds.co/models`
|
|
47
|
+
为权威;发现 descriptor 与 drizzle 表漂移时本包**报错**而不是就地补一份映射。
|
|
48
|
+
`@undefineds.co/models@0.2.57` 起 `credentialDescriptor.fields` 与 credential 表的
|
|
49
|
+
36 个列**逐谓词完全对齐**(0.2.56 曾缺 18 个 by-predicate 表列、多一个无承载列的
|
|
50
|
+
`secretType`),`uniqueBy` 也改成真实列 `['id']` —— 见 `test/guards.test.ts` 里锁定的
|
|
51
|
+
双向空集与精确计数(任何未来的漂移都会让那组断言失败)。
|
|
52
|
+
- **不做传输**:`PodDocumentFeed` 只有 `watch(topic, listener)`,是宿主能力的窄端口,
|
|
53
|
+
不实现 websocket / 订阅生命周期。
|
|
54
|
+
- **不做行级文档表**(`base = '/.data/'` + `{id}`,一行一文档,如 gateway access key):
|
|
55
|
+
topic 语义是容器订阅,不在本期(§1.2)。
|
|
56
|
+
- **不做 `loadSubset` 谓词下推**(§8.1 的 P5)。
|
|
57
|
+
- **P1 未覆盖**:宿主能力接线与 pilot 页面(`ui/src/**`、`packages/extension-sdk`、
|
|
58
|
+
`packages/ai-connections`)属于下一期;`./react` 入口只保证签名与编译。
|
|
59
|
+
|
|
60
|
+
## 文档 ETag 的结论(P1 第一件事)
|
|
61
|
+
|
|
62
|
+
drizzle-solid 0.3.24 的读路径**拿不到文档 ETag**,因此 `conditionalDocumentRead()` 恒返回
|
|
63
|
+
`etag: undefined`,同步按设计文档 §8.7-2 的出口降级(每个合并窗口全量读 + 投影 diff,
|
|
64
|
+
零轮询),`metadata.collection` 不写任何伪造的 ETag。证据与请求实测见 `src/read.ts` 文件头
|
|
65
|
+
与 `.test-data/etag-probe/probe.ts`。
|
|
66
|
+
|
|
67
|
+
## 脚本
|
|
68
|
+
|
|
69
|
+
- `bun run test`:`vitest run test --config ../../vitest.packages.config.mts`
|
|
70
|
+
- `bun run typecheck`:`tsc --noEmit -p tsconfig.test.json`(含测试与 `RowOf` 的类型级断言)
|
|
71
|
+
- `bun run build`:`tsc -p tsconfig.json` → `dist/`(ESM + 类型声明)
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 投影哈希与三向 diff(§3.2、§3.3)。
|
|
3
|
+
*
|
|
4
|
+
* 两个设计点:
|
|
5
|
+
*
|
|
6
|
+
* 1. **`metadata.row` 存的是投影哈希,不是 per-row ETag**:一个 Solid 文档只有一个
|
|
7
|
+
* ETag,文档内的主语没有独立 validator(§3.2)。哈希按谓词排序的字段顺序计算
|
|
8
|
+
* (`mapping.projectionFieldOrder()`),与字段声明顺序无关。
|
|
9
|
+
* 2. **update 的判定用「上次服务端投影哈希」,insert/delete 的判定用「集合当前呈现
|
|
10
|
+
* 的行」**,且带未确认写的 key 不参与 insert/delete 判定。理由:乐观写期间
|
|
11
|
+
* `collection.state` 里那一行已经是写入后的值,若用呈现行做 update 判定,自回声
|
|
12
|
+
* 会被判成 0 次写,服务端行永远进不了 syncedData,乐观层一撤就回退到旧值
|
|
13
|
+
* (实测 `@tanstack/db@0.9.0` 的 `CollectionStateManager.get()` = 乐观覆盖层 ??
|
|
14
|
+
* syncedData;事务完成时乐观层被丢弃)。用 `metadata.row` 的哈希判定 update,
|
|
15
|
+
* 服务端行会写进 syncedData,而库自己的冗余抑制
|
|
16
|
+
* (`dist/esm/collection/state.js:885-905` 的 `isRedundantSync`)保证呈现值不变时
|
|
17
|
+
* 不产生事件 —— 这才是「无闪烁」的机制。
|
|
18
|
+
*/
|
|
19
|
+
export interface PodProjectionEntry<R extends object> {
|
|
20
|
+
key: string;
|
|
21
|
+
row: R;
|
|
22
|
+
}
|
|
23
|
+
export interface PodDocumentDiff<R extends object> {
|
|
24
|
+
inserts: PodProjectionEntry<R>[];
|
|
25
|
+
updates: PodProjectionEntry<R>[];
|
|
26
|
+
deletes: PodProjectionEntry<R>[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 去掉 TanStack 的虚属性(`$synced` / `$origin` / `$key` / `$collectionId`)。
|
|
30
|
+
* 按约定前缀 `$` 判定:`@tanstack/db@0.9.0` 的 `virtual-props.d.ts` 明确「用户 schema
|
|
31
|
+
* 不应含 `$` 前缀字段,保留给虚属性」,且 `VIRTUAL_PROP_NAMES` 没有从包入口导出。
|
|
32
|
+
*/
|
|
33
|
+
export declare function stripVirtualProps<R extends object>(row: R): R;
|
|
34
|
+
/**
|
|
35
|
+
* 行的投影哈希:只包含行标识 `id` 与 descriptor 声明的字段(按谓词顺序)、
|
|
36
|
+
* 递归排序对象键、`undefined` 不参与。
|
|
37
|
+
*
|
|
38
|
+
* 两点取舍:
|
|
39
|
+
* - **不含 `@id`**:主语 IRI 由 `id` + 文档推导(`subjectIriForRow`),带上它只会让
|
|
40
|
+
* 写入意图(applet 给的行常常没有 `@id`)与服务端投影不可比;身份已经由 `id` 表达。
|
|
41
|
+
* - **不含 descriptor 之外的键**:集合的行就是 descriptor 投影,多出来的键既不会
|
|
42
|
+
* 出现在服务端读里,也不该让「未变」被误判成「变了」。
|
|
43
|
+
*/
|
|
44
|
+
export declare function projectionHash<R extends object>(row: R, fieldOrder: readonly string[]): string;
|
|
45
|
+
/**
|
|
46
|
+
* 服务端投影是否覆盖了写入意图:意图里**每个可读字段**(`@id` 与只写字段除外)都相等。
|
|
47
|
+
*
|
|
48
|
+
* 逐字段而不是整行哈希:插入意图通常只带一部分字段,其余由列默认值补齐;
|
|
49
|
+
* 服务端行也可能带读取侧才有的字段(`@id`)。
|
|
50
|
+
*
|
|
51
|
+
* ## 只写字段(`secret: true`)为什么不参与比对
|
|
52
|
+
*
|
|
53
|
+
* 确认协议必须只承诺能读回来的东西。`secret: true` 的字段按 §2.1 被排除在投影之外
|
|
54
|
+
* (`mapping.writeOnlyFields()` 是那条规则的唯一来源),**任何读取路径都不可能返回它们**,
|
|
55
|
+
* 所以「服务端行里等于意图值」这个条件对它们永远不可能成立:
|
|
56
|
+
*
|
|
57
|
+
* - 把它们算进比对 ⇒ 带 secret 的意图永远无法确认(旧缺陷:随后落进
|
|
58
|
+
* `hashOf(server) !== beforeHash` 分支,被误判成 `write_conflict`);
|
|
59
|
+
* - 反过来把「读不到」当成冲突同样是错的:它不是「服务端值和我们写的不一样」,
|
|
60
|
+
* 而是「这一层看不见」。
|
|
61
|
+
*
|
|
62
|
+
* 选定规则:**只写字段被排除在确认比对之外;它们的唯一证据是写入调用本身成功**
|
|
63
|
+
* (`mutations.createMutationHandlers()` 只在 `insert/updateById` 或 `array+uri` 的
|
|
64
|
+
* PATCH resolve 之后才进入确认循环;写入抛错会直接回滚,根本不走到这里),
|
|
65
|
+
* 集合行则始终是投影行 —— 不假装把 secret 读了回来。
|
|
66
|
+
*
|
|
67
|
+
* 措辞边界:这不削弱**可读**字段的确认。意图里出现的每个非 secret 字段(包括
|
|
68
|
+
* descriptor 声明了、但当前没有承载列因而读不回来的字段,§2.7 的漂移面)仍然逐字段
|
|
69
|
+
* 比对;任何一个对不上,`reconcilePendingWrites()` 依旧判 `write_conflict`。
|
|
70
|
+
*/
|
|
71
|
+
export declare function projectionCovers<R extends object>(row: R | undefined, intent: R, writeOnly?: ReadonlySet<string>): boolean;
|
|
72
|
+
export interface PodDocumentDiffInput<R extends object> {
|
|
73
|
+
/** 服务端(文档)当前投影,按行键。 */
|
|
74
|
+
next: ReadonlyMap<string, R>;
|
|
75
|
+
/** 集合当前呈现的行键(含乐观覆盖层)。 */
|
|
76
|
+
presentKeys: Iterable<string>;
|
|
77
|
+
/** 有未确认本地写的 key:不参与 insert/delete 判定(§3.4、§4.4)。 */
|
|
78
|
+
pendingKeys: ReadonlySet<string>;
|
|
79
|
+
/** 上一次服务端投影哈希(`metadata.row`)。 */
|
|
80
|
+
knownHash: (key: string) => string | undefined;
|
|
81
|
+
hashOf: (row: R) => string;
|
|
82
|
+
/** 已从文档消失的行的原值,供 `write({type:'delete', value})` 使用。 */
|
|
83
|
+
presentRow?: (key: string) => R | undefined;
|
|
84
|
+
}
|
|
85
|
+
export declare function computeDocumentDiff<R extends object>(input: PodDocumentDiffInput<R>): PodDocumentDiff<R>;
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 投影哈希与三向 diff(§3.2、§3.3)。
|
|
3
|
+
*
|
|
4
|
+
* 两个设计点:
|
|
5
|
+
*
|
|
6
|
+
* 1. **`metadata.row` 存的是投影哈希,不是 per-row ETag**:一个 Solid 文档只有一个
|
|
7
|
+
* ETag,文档内的主语没有独立 validator(§3.2)。哈希按谓词排序的字段顺序计算
|
|
8
|
+
* (`mapping.projectionFieldOrder()`),与字段声明顺序无关。
|
|
9
|
+
* 2. **update 的判定用「上次服务端投影哈希」,insert/delete 的判定用「集合当前呈现
|
|
10
|
+
* 的行」**,且带未确认写的 key 不参与 insert/delete 判定。理由:乐观写期间
|
|
11
|
+
* `collection.state` 里那一行已经是写入后的值,若用呈现行做 update 判定,自回声
|
|
12
|
+
* 会被判成 0 次写,服务端行永远进不了 syncedData,乐观层一撤就回退到旧值
|
|
13
|
+
* (实测 `@tanstack/db@0.9.0` 的 `CollectionStateManager.get()` = 乐观覆盖层 ??
|
|
14
|
+
* syncedData;事务完成时乐观层被丢弃)。用 `metadata.row` 的哈希判定 update,
|
|
15
|
+
* 服务端行会写进 syncedData,而库自己的冗余抑制
|
|
16
|
+
* (`dist/esm/collection/state.js:885-905` 的 `isRedundantSync`)保证呈现值不变时
|
|
17
|
+
* 不产生事件 —— 这才是「无闪烁」的机制。
|
|
18
|
+
*/
|
|
19
|
+
/** 默认「没有只写字段」:不传 `writeOnly` 的调用方语义与改动前一致。 */
|
|
20
|
+
const EMPTY_FIELDS = new Set();
|
|
21
|
+
/**
|
|
22
|
+
* 去掉 TanStack 的虚属性(`$synced` / `$origin` / `$key` / `$collectionId`)。
|
|
23
|
+
* 按约定前缀 `$` 判定:`@tanstack/db@0.9.0` 的 `virtual-props.d.ts` 明确「用户 schema
|
|
24
|
+
* 不应含 `$` 前缀字段,保留给虚属性」,且 `VIRTUAL_PROP_NAMES` 没有从包入口导出。
|
|
25
|
+
*/
|
|
26
|
+
export function stripVirtualProps(row) {
|
|
27
|
+
const source = row;
|
|
28
|
+
const stripped = {};
|
|
29
|
+
for (const [key, value] of Object.entries(source)) {
|
|
30
|
+
if (key.startsWith('$'))
|
|
31
|
+
continue;
|
|
32
|
+
stripped[key] = value;
|
|
33
|
+
}
|
|
34
|
+
return stripped;
|
|
35
|
+
}
|
|
36
|
+
function canonicalValue(value) {
|
|
37
|
+
if (value instanceof Date)
|
|
38
|
+
return value.toISOString();
|
|
39
|
+
if (Array.isArray(value))
|
|
40
|
+
return value.map((item) => canonicalValue(item));
|
|
41
|
+
if (value && typeof value === 'object') {
|
|
42
|
+
if (value instanceof Set)
|
|
43
|
+
return [...value].map((item) => canonicalValue(item));
|
|
44
|
+
const entries = Object.entries(value)
|
|
45
|
+
.filter(([, item]) => item !== undefined)
|
|
46
|
+
.sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0));
|
|
47
|
+
return Object.fromEntries(entries.map(([key, item]) => [key, canonicalValue(item)]));
|
|
48
|
+
}
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 行的投影哈希:只包含行标识 `id` 与 descriptor 声明的字段(按谓词顺序)、
|
|
53
|
+
* 递归排序对象键、`undefined` 不参与。
|
|
54
|
+
*
|
|
55
|
+
* 两点取舍:
|
|
56
|
+
* - **不含 `@id`**:主语 IRI 由 `id` + 文档推导(`subjectIriForRow`),带上它只会让
|
|
57
|
+
* 写入意图(applet 给的行常常没有 `@id`)与服务端投影不可比;身份已经由 `id` 表达。
|
|
58
|
+
* - **不含 descriptor 之外的键**:集合的行就是 descriptor 投影,多出来的键既不会
|
|
59
|
+
* 出现在服务端读里,也不该让「未变」被误判成「变了」。
|
|
60
|
+
*/
|
|
61
|
+
export function projectionHash(row, fieldOrder) {
|
|
62
|
+
const source = stripVirtualProps(row);
|
|
63
|
+
const ordered = {};
|
|
64
|
+
if (source.id !== undefined)
|
|
65
|
+
ordered.id = canonicalValue(source.id);
|
|
66
|
+
for (const field of fieldOrder) {
|
|
67
|
+
if (source[field] !== undefined)
|
|
68
|
+
ordered[field] = canonicalValue(source[field]);
|
|
69
|
+
}
|
|
70
|
+
return JSON.stringify(ordered);
|
|
71
|
+
}
|
|
72
|
+
function canonicalEquals(left, right) {
|
|
73
|
+
if (left === undefined || right === undefined)
|
|
74
|
+
return left === right;
|
|
75
|
+
return JSON.stringify(canonicalValue(left)) === JSON.stringify(canonicalValue(right));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 服务端投影是否覆盖了写入意图:意图里**每个可读字段**(`@id` 与只写字段除外)都相等。
|
|
79
|
+
*
|
|
80
|
+
* 逐字段而不是整行哈希:插入意图通常只带一部分字段,其余由列默认值补齐;
|
|
81
|
+
* 服务端行也可能带读取侧才有的字段(`@id`)。
|
|
82
|
+
*
|
|
83
|
+
* ## 只写字段(`secret: true`)为什么不参与比对
|
|
84
|
+
*
|
|
85
|
+
* 确认协议必须只承诺能读回来的东西。`secret: true` 的字段按 §2.1 被排除在投影之外
|
|
86
|
+
* (`mapping.writeOnlyFields()` 是那条规则的唯一来源),**任何读取路径都不可能返回它们**,
|
|
87
|
+
* 所以「服务端行里等于意图值」这个条件对它们永远不可能成立:
|
|
88
|
+
*
|
|
89
|
+
* - 把它们算进比对 ⇒ 带 secret 的意图永远无法确认(旧缺陷:随后落进
|
|
90
|
+
* `hashOf(server) !== beforeHash` 分支,被误判成 `write_conflict`);
|
|
91
|
+
* - 反过来把「读不到」当成冲突同样是错的:它不是「服务端值和我们写的不一样」,
|
|
92
|
+
* 而是「这一层看不见」。
|
|
93
|
+
*
|
|
94
|
+
* 选定规则:**只写字段被排除在确认比对之外;它们的唯一证据是写入调用本身成功**
|
|
95
|
+
* (`mutations.createMutationHandlers()` 只在 `insert/updateById` 或 `array+uri` 的
|
|
96
|
+
* PATCH resolve 之后才进入确认循环;写入抛错会直接回滚,根本不走到这里),
|
|
97
|
+
* 集合行则始终是投影行 —— 不假装把 secret 读了回来。
|
|
98
|
+
*
|
|
99
|
+
* 措辞边界:这不削弱**可读**字段的确认。意图里出现的每个非 secret 字段(包括
|
|
100
|
+
* descriptor 声明了、但当前没有承载列因而读不回来的字段,§2.7 的漂移面)仍然逐字段
|
|
101
|
+
* 比对;任何一个对不上,`reconcilePendingWrites()` 依旧判 `write_conflict`。
|
|
102
|
+
*/
|
|
103
|
+
export function projectionCovers(row, intent, writeOnly = EMPTY_FIELDS) {
|
|
104
|
+
if (row === undefined)
|
|
105
|
+
return false;
|
|
106
|
+
const source = stripVirtualProps(row);
|
|
107
|
+
const target = stripVirtualProps(intent);
|
|
108
|
+
for (const [key, value] of Object.entries(target)) {
|
|
109
|
+
if (key === '@id' || value === undefined)
|
|
110
|
+
continue;
|
|
111
|
+
if (writeOnly.has(key))
|
|
112
|
+
continue;
|
|
113
|
+
if (!canonicalEquals(source[key], value))
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
export function computeDocumentDiff(input) {
|
|
119
|
+
const present = new Set(input.presentKeys);
|
|
120
|
+
const inserts = [];
|
|
121
|
+
const updates = [];
|
|
122
|
+
const deletes = [];
|
|
123
|
+
/**
|
|
124
|
+
* The projection the collection should already hold for `key`.
|
|
125
|
+
*
|
|
126
|
+
* Row metadata is the fast path, but a store/library combination without it
|
|
127
|
+
* would otherwise answer `undefined` for every key and make every sync pass
|
|
128
|
+
* rewrite every present row - our own echo would replace rows that did not
|
|
129
|
+
* change. Falling back to the row we last applied answers the same question
|
|
130
|
+
* ("did this projection change?") from data we always have.
|
|
131
|
+
*/
|
|
132
|
+
const baselineHash = (key) => {
|
|
133
|
+
const known = input.knownHash(key);
|
|
134
|
+
if (known !== undefined)
|
|
135
|
+
return known;
|
|
136
|
+
const held = input.presentRow?.(key);
|
|
137
|
+
return held === undefined ? undefined : input.hashOf(held);
|
|
138
|
+
};
|
|
139
|
+
for (const [key, row] of input.next) {
|
|
140
|
+
if (input.pendingKeys.has(key)) {
|
|
141
|
+
// 未确认的本地写:服务端行仍要进 syncedData(否则乐观层撤不掉),
|
|
142
|
+
// 但不能据此判定 insert(那会在乐观行还在时插入同一 key)。
|
|
143
|
+
if (present.has(key) && baselineHash(key) !== input.hashOf(row)) {
|
|
144
|
+
updates.push({ key, row });
|
|
145
|
+
}
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
if (!present.has(key)) {
|
|
149
|
+
inserts.push({ key, row });
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (baselineHash(key) !== input.hashOf(row))
|
|
153
|
+
updates.push({ key, row });
|
|
154
|
+
}
|
|
155
|
+
for (const key of present) {
|
|
156
|
+
if (input.next.has(key))
|
|
157
|
+
continue;
|
|
158
|
+
if (input.pendingKeys.has(key))
|
|
159
|
+
continue;
|
|
160
|
+
const row = input.presentRow?.(key);
|
|
161
|
+
if (row === undefined)
|
|
162
|
+
continue;
|
|
163
|
+
deletes.push({ key, row });
|
|
164
|
+
}
|
|
165
|
+
return { inserts, updates, deletes };
|
|
166
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { PodDocumentFeed } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* 变更 feed 端口与无 feed 时的降级(§2.2、§1.5 N1)。
|
|
4
|
+
*
|
|
5
|
+
* 传输层不在本包:`PodDocumentFeed` 只是宿主注入的**脏信号**端口,结构上由
|
|
6
|
+
* `SolidNotificationsCapability` 满足。没有 feed 时**不装任何轮询**:只读一次,
|
|
7
|
+
* 之后只能显式 `refresh()`,同步状态显式为 `unavailable`。
|
|
8
|
+
*/
|
|
9
|
+
export interface PodFeedSubscription {
|
|
10
|
+
/** feed 是否真的建立(无 feed / watch 抛错时为 false)。 */
|
|
11
|
+
readonly available: boolean;
|
|
12
|
+
unsubscribe(): void;
|
|
13
|
+
}
|
|
14
|
+
/** 订阅文档脏信号;无 feed 或订阅失败时返回不可用订阅,调用方据此标注状态。 */
|
|
15
|
+
export declare function subscribeDocumentFeed(feed: PodDocumentFeed | undefined, topicUrl: string, listener: (signal: {
|
|
16
|
+
topic: string;
|
|
17
|
+
}) => void): PodFeedSubscription;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const NOOP_SUBSCRIPTION = {
|
|
2
|
+
available: false,
|
|
3
|
+
unsubscribe: () => { },
|
|
4
|
+
};
|
|
5
|
+
/** 订阅文档脏信号;无 feed 或订阅失败时返回不可用订阅,调用方据此标注状态。 */
|
|
6
|
+
export function subscribeDocumentFeed(feed, topicUrl, listener) {
|
|
7
|
+
if (!feed || typeof feed.watch !== 'function')
|
|
8
|
+
return NOOP_SUBSCRIPTION;
|
|
9
|
+
try {
|
|
10
|
+
const unsubscribe = feed.watch(topicUrl, listener);
|
|
11
|
+
if (typeof unsubscribe !== 'function')
|
|
12
|
+
return NOOP_SUBSCRIPTION;
|
|
13
|
+
let active = true;
|
|
14
|
+
return {
|
|
15
|
+
available: true,
|
|
16
|
+
unsubscribe: () => {
|
|
17
|
+
if (!active)
|
|
18
|
+
return;
|
|
19
|
+
active = false;
|
|
20
|
+
unsubscribe();
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return NOOP_SUBSCRIPTION;
|
|
26
|
+
}
|
|
27
|
+
}
|