@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.
Files changed (402) hide show
  1. package/config/components-ignore.json +5 -1
  2. package/config/notifications.json +68 -0
  3. package/config/xpod.base.json +9 -11
  4. package/dist/ai/service/AiCredentialSecret.d.ts +30 -0
  5. package/dist/ai/service/AiCredentialSecret.js +120 -0
  6. package/dist/ai/service/CredentialReaderImpl.d.ts +18 -0
  7. package/dist/ai/service/CredentialReaderImpl.js +81 -5
  8. package/dist/ai/service/CredentialReaderImpl.jsonld +42 -2
  9. package/dist/ai/service/EmbeddingModelPolicy.d.ts +79 -0
  10. package/dist/ai/service/EmbeddingModelPolicy.js +134 -0
  11. package/dist/ai/service/EmbeddingProviderError.js +6 -0
  12. package/dist/ai/service/EmbeddingServiceImpl.d.ts +13 -1
  13. package/dist/ai/service/EmbeddingServiceImpl.js +18 -5
  14. package/dist/ai/service/EmbeddingServiceImpl.jsonld +35 -0
  15. package/dist/ai/service/index.d.ts +2 -0
  16. package/dist/ai/service/index.js +2 -0
  17. package/dist/api/ai-gateway/connect/index.d.ts +20 -2
  18. package/dist/api/ai-gateway/connect/index.js +162 -16
  19. package/dist/api/ai-gateway/credentials/AiCredentialSecretDecoder.d.ts +12 -0
  20. package/dist/api/ai-gateway/credentials/AiCredentialSecretDecoder.js +30 -0
  21. package/dist/api/ai-gateway/errors.d.ts +1 -1
  22. package/dist/api/ai-gateway/models/GatewayEmbeddingModelCatalog.d.ts +11 -0
  23. package/dist/api/ai-gateway/models/GatewayEmbeddingModelCatalog.js +31 -0
  24. package/dist/api/ai-gateway/models/PodModelSelectionRepository.js +7 -3
  25. package/dist/api/ai-gateway/models/ProviderCustomModelsService.d.ts +18 -0
  26. package/dist/api/ai-gateway/models/ProviderCustomModelsService.js +23 -0
  27. package/dist/api/ai-gateway/models/ProviderModelDiscoveryAdapters.d.ts +3 -1
  28. package/dist/api/ai-gateway/models/ProviderModelDiscoveryAdapters.js +2 -45
  29. package/dist/api/ai-gateway/models/ProviderModelSelectionService.d.ts +10 -0
  30. package/dist/api/ai-gateway/models/ProviderModelSelectionService.js +57 -20
  31. package/dist/api/ai-gateway/models/ProviderModelType.d.ts +28 -0
  32. package/dist/api/ai-gateway/models/ProviderModelType.js +34 -0
  33. package/dist/api/ai-gateway/models/ProviderModelsAdapter.d.ts +10 -0
  34. package/dist/api/ai-gateway/models/ProviderModelsAdapter.js +3 -4
  35. package/dist/api/ai-gateway/models/index.d.ts +1 -0
  36. package/dist/api/ai-gateway/models/index.js +3 -1
  37. package/dist/api/ai-gateway/providers/CustomRuntimeAdapter.d.ts +7 -0
  38. package/dist/api/ai-gateway/providers/CustomRuntimeAdapter.js +9 -2
  39. package/dist/api/ai-gateway/providers/ModelsDevCatalog.d.ts +7 -1
  40. package/dist/api/ai-gateway/providers/ModelsDevCatalog.js +4 -10
  41. package/dist/api/ai-gateway/providers/ProviderRegistry.d.ts +107 -0
  42. package/dist/api/ai-gateway/providers/ProviderRegistry.js +244 -21
  43. package/dist/api/ai-gateway/providers/ProviderRuntimeRegistry.d.ts +5 -0
  44. package/dist/api/ai-gateway/providers/ProviderRuntimeRegistry.js +5 -1
  45. package/dist/api/ai-gateway/quota/SubscriptionQuotaAdapters.d.ts +12 -4
  46. package/dist/api/ai-gateway/quota/SubscriptionQuotaAdapters.js +11 -11
  47. package/dist/api/ai-gateway/routing/ModelRouter.d.ts +14 -0
  48. package/dist/api/ai-gateway/routing/ModelRouter.js +43 -4
  49. package/dist/api/ai-gateway/service-access/AiConnectionsServiceAccess.d.ts +9 -1
  50. package/dist/api/ai-gateway/service-access/AiConnectionsServiceAccess.js +3 -27
  51. package/dist/api/auth/ClientCredentialsAuthenticator.d.ts +0 -1
  52. package/dist/api/auth/ClientCredentialsAuthenticator.js +0 -3
  53. package/dist/api/auth/index.d.ts +1 -0
  54. package/dist/api/auth/index.js +1 -1
  55. package/dist/api/chatkit/pod-store.d.ts +31 -0
  56. package/dist/api/chatkit/pod-store.js +132 -8
  57. package/dist/api/container/common.js +24 -4
  58. package/dist/api/container/routes.js +17 -2
  59. package/dist/api/container/types.d.ts +3 -1
  60. package/dist/api/handlers/AdminHandler.d.ts +13 -0
  61. package/dist/api/handlers/AdminHandler.js +47 -18
  62. package/dist/api/handlers/AiConfigHandler.d.ts +6 -0
  63. package/dist/api/handlers/AiConfigHandler.js +28 -0
  64. package/dist/api/handlers/AiGatewayManagementHandler.js +36 -0
  65. package/dist/api/runs/RdfRunContextRetriever.d.ts +14 -0
  66. package/dist/api/runs/RdfRunContextRetriever.js +41 -5
  67. package/dist/api/runtime.js +2 -1
  68. package/dist/cli/commands/secret.d.ts +1 -0
  69. package/dist/cli/commands/secret.js +25 -7
  70. package/dist/components/components.jsonld +3 -1
  71. package/dist/components/context.jsonld +53 -1
  72. package/dist/http/SubgraphSparqlHttpHandler.d.ts +59 -2
  73. package/dist/http/SubgraphSparqlHttpHandler.js +145 -13
  74. package/dist/http/SubgraphSparqlHttpHandler.jsonld +37 -0
  75. package/dist/identity/drizzle/AccountRoleRepository.d.ts +30 -2
  76. package/dist/identity/drizzle/AccountRoleRepository.js +163 -15
  77. package/dist/identity/drizzle/EdgeNodeRepository.d.ts +0 -12
  78. package/dist/identity/drizzle/EdgeNodeRepository.js +5 -13
  79. package/dist/identity/drizzle/PodLookupRepository.d.ts +58 -4
  80. package/dist/identity/drizzle/PodLookupRepository.js +248 -105
  81. package/dist/identity/drizzle/db.d.ts +19 -0
  82. package/dist/identity/drizzle/db.js +39 -4
  83. package/dist/index.d.ts +2 -1
  84. package/dist/index.js +7 -3
  85. package/dist/logging/log-file.d.ts +17 -0
  86. package/dist/logging/log-file.js +69 -0
  87. package/dist/main.js +2 -1
  88. package/dist/notifications/NotificationChannelSweeper.d.ts +50 -0
  89. package/dist/notifications/NotificationChannelSweeper.js +131 -0
  90. package/dist/notifications/NotificationChannelSweeper.jsonld +136 -0
  91. package/dist/notifications/ReclaimingWebSocket2023Storer.d.ts +25 -0
  92. package/dist/notifications/ReclaimingWebSocket2023Storer.js +56 -0
  93. package/dist/notifications/ReclaimingWebSocket2023Storer.jsonld +77 -0
  94. package/dist/notifications/index.d.ts +2 -0
  95. package/dist/notifications/index.js +2 -0
  96. package/dist/runtime/Proxy.d.ts +37 -0
  97. package/dist/runtime/Proxy.js +88 -16
  98. package/dist/runtime/bootstrap.js +2 -1
  99. package/dist/runtime/upgrade/BunNativeUpgradeRelay.d.ts +116 -0
  100. package/dist/runtime/upgrade/BunNativeUpgradeRelay.js +423 -0
  101. package/dist/runtime/upgrade/UpgradeHandshake.d.ts +63 -0
  102. package/dist/runtime/upgrade/UpgradeHandshake.js +199 -0
  103. package/dist/runtime/upgrade/WebSocketFrames.d.ts +67 -0
  104. package/dist/runtime/upgrade/WebSocketFrames.js +224 -0
  105. package/node_modules/@undefineds.co/ai-connections/dist/AiApiKeyPool.js +8 -1
  106. package/node_modules/@undefineds.co/ai-connections/dist/AiAuthorizationActions.d.ts +11 -2
  107. package/node_modules/@undefineds.co/ai-connections/dist/AiAuthorizationActions.js +27 -10
  108. package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.d.ts +7 -0
  109. package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.js +13 -11
  110. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectDialog.js +1 -1
  111. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsList.js +10 -6
  112. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMain.d.ts +15 -0
  113. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMain.js +29 -3
  114. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMainHeader.js +18 -3
  115. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.d.ts +16 -1
  116. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.js +92 -20
  117. package/node_modules/@undefineds.co/ai-connections/dist/AiCopyButton.d.ts +35 -0
  118. package/node_modules/@undefineds.co/ai-connections/dist/AiCopyButton.js +45 -0
  119. package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialPoolSection.js +71 -11
  120. package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialRow.js +9 -7
  121. package/node_modules/@undefineds.co/ai-connections/dist/AiEndpointList.d.ts +23 -0
  122. package/node_modules/@undefineds.co/ai-connections/dist/AiEndpointList.js +24 -0
  123. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.d.ts +13 -4
  124. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.js +35 -38
  125. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayModelsSection.d.ts +21 -0
  126. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayModelsSection.js +51 -0
  127. package/node_modules/@undefineds.co/ai-connections/dist/AiInfoTooltip.d.ts +15 -0
  128. package/node_modules/@undefineds.co/ai-connections/dist/AiInfoTooltip.js +16 -0
  129. package/node_modules/@undefineds.co/ai-connections/dist/AiModelCatalog.d.ts +175 -0
  130. package/node_modules/@undefineds.co/ai-connections/dist/AiModelCatalog.js +133 -0
  131. package/node_modules/@undefineds.co/ai-connections/dist/AiOfferingDetails.js +2 -2
  132. package/node_modules/@undefineds.co/ai-connections/dist/AiProviderCard.js +13 -64
  133. package/node_modules/@undefineds.co/ai-connections/dist/AiProviderHeader.d.ts +21 -0
  134. package/node_modules/@undefineds.co/ai-connections/dist/AiProviderHeader.js +12 -0
  135. package/node_modules/@undefineds.co/ai-connections/dist/AiRowAction.d.ts +15 -0
  136. package/node_modules/@undefineds.co/ai-connections/dist/AiRowAction.js +12 -0
  137. package/node_modules/@undefineds.co/ai-connections/dist/AiSortableCredentialList.js +2 -1
  138. package/node_modules/@undefineds.co/ai-connections/dist/ai-connections-client.d.ts +7 -0
  139. package/node_modules/@undefineds.co/ai-connections/dist/ai-connections-client.js +6 -0
  140. package/node_modules/@undefineds.co/ai-connections/dist/authorization-methods.d.ts +36 -5
  141. package/node_modules/@undefineds.co/ai-connections/dist/authorization-methods.js +52 -9
  142. package/node_modules/@undefineds.co/ai-connections/dist/client/normalize.js +30 -3
  143. package/node_modules/@undefineds.co/ai-connections/dist/client/types.d.ts +21 -1
  144. package/node_modules/@undefineds.co/ai-connections/dist/client-config/base-adapter.d.ts +1 -3
  145. package/node_modules/@undefineds.co/ai-connections/dist/client-config/base-adapter.js +3 -7
  146. package/node_modules/@undefineds.co/ai-connections/dist/client-config/index.cjs +9 -7
  147. package/node_modules/@undefineds.co/ai-connections/dist/collection-runtime.d.ts +46 -0
  148. package/node_modules/@undefineds.co/ai-connections/dist/collection-runtime.js +231 -0
  149. package/node_modules/@undefineds.co/ai-connections/dist/collections.d.ts +119 -0
  150. package/node_modules/@undefineds.co/ai-connections/dist/collections.js +173 -0
  151. package/node_modules/@undefineds.co/ai-connections/dist/controller.d.ts +71 -5
  152. package/node_modules/@undefineds.co/ai-connections/dist/controller.js +285 -16
  153. package/node_modules/@undefineds.co/ai-connections/dist/credential-labels.d.ts +5 -0
  154. package/node_modules/@undefineds.co/ai-connections/dist/credential-labels.js +8 -3
  155. package/node_modules/@undefineds.co/ai-connections/dist/credential-storage.d.ts +59 -0
  156. package/node_modules/@undefineds.co/ai-connections/dist/credential-storage.js +131 -0
  157. package/node_modules/@undefineds.co/ai-connections/dist/endpoint-urls.d.ts +15 -0
  158. package/node_modules/@undefineds.co/ai-connections/dist/endpoint-urls.js +20 -0
  159. package/node_modules/@undefineds.co/ai-connections/dist/gateway-endpoints.d.ts +14 -0
  160. package/node_modules/@undefineds.co/ai-connections/dist/gateway-endpoints.js +20 -0
  161. package/node_modules/@undefineds.co/ai-connections/dist/index.d.ts +8 -0
  162. package/node_modules/@undefineds.co/ai-connections/dist/index.js +8 -0
  163. package/node_modules/@undefineds.co/ai-connections/dist/manifest.js +1 -1
  164. package/node_modules/@undefineds.co/ai-connections/dist/offering-endpoints.d.ts +14 -0
  165. package/node_modules/@undefineds.co/ai-connections/dist/offering-endpoints.js +17 -0
  166. package/node_modules/@undefineds.co/ai-connections/dist/provider-catalog.cjs +68 -1
  167. package/node_modules/@undefineds.co/ai-connections/dist/provider-catalog.d.ts +75 -1
  168. package/node_modules/@undefineds.co/ai-connections/dist/provider-catalog.js +119 -0
  169. package/node_modules/@undefineds.co/ai-connections/dist/provider-visuals.d.ts +5 -0
  170. package/node_modules/@undefineds.co/ai-connections/dist/provider-visuals.js +5 -0
  171. package/node_modules/@undefineds.co/ai-connections/dist/service-access.js +2 -27
  172. package/node_modules/@undefineds.co/ai-connections/package.json +1 -0
  173. package/node_modules/@undefineds.co/extension-sdk/dist/manifest.d.ts +1 -1
  174. package/node_modules/@undefineds.co/extension-sdk/dist/manifest.js +2 -0
  175. package/node_modules/@undefineds.co/extension-sdk/dist/web.d.ts +150 -0
  176. package/node_modules/@undefineds.co/extension-sdk/package.json +2 -1
  177. package/node_modules/@undefineds.co/models/README.md +1 -1
  178. package/node_modules/@undefineds.co/models/dist/ai-config/index.d.ts +3 -3
  179. package/node_modules/@undefineds.co/models/dist/ai-gateway.schema.d.ts +5 -0
  180. package/node_modules/@undefineds.co/models/dist/ai-gateway.schema.js +9 -0
  181. package/node_modules/@undefineds.co/models/dist/ai-runtime.repository.d.ts +1 -1
  182. package/node_modules/@undefineds.co/models/dist/approval.repository.d.ts +2 -2
  183. package/node_modules/@undefineds.co/models/dist/audit.presentation.d.ts +2 -2
  184. package/node_modules/@undefineds.co/models/dist/capture.repository.d.ts +1 -1
  185. package/node_modules/@undefineds.co/models/dist/chat-project.repository.d.ts +1 -1
  186. package/node_modules/@undefineds.co/models/dist/chat.repository.d.ts +2 -2
  187. package/node_modules/@undefineds.co/models/dist/control-request.repository.d.ts +2 -2
  188. package/node_modules/@undefineds.co/models/dist/conversation-share.repository.d.ts +1 -1
  189. package/node_modules/@undefineds.co/models/dist/credential.schema.d.ts +12 -0
  190. package/node_modules/@undefineds.co/models/dist/credential.schema.js +15 -1
  191. package/node_modules/@undefineds.co/models/dist/discovery/index.d.ts +2 -2
  192. package/node_modules/@undefineds.co/models/dist/discovery/providers.json +248 -7
  193. package/node_modules/@undefineds.co/models/dist/discovery/types.d.ts +31 -0
  194. package/node_modules/@undefineds.co/models/dist/extension/index.d.ts +1 -1
  195. package/node_modules/@undefineds.co/models/dist/favorite/index.d.ts +2 -2
  196. package/node_modules/@undefineds.co/models/dist/fixtures/contracts-chat-contact.d.ts +5 -5
  197. package/node_modules/@undefineds.co/models/dist/import/index.d.ts +1 -1
  198. package/node_modules/@undefineds.co/models/dist/index.d.ts +73 -73
  199. package/node_modules/@undefineds.co/models/dist/index.js +1 -1
  200. package/node_modules/@undefineds.co/models/dist/input-request.repository.d.ts +2 -2
  201. package/node_modules/@undefineds.co/models/dist/knowledge/index.d.ts +1 -1
  202. package/node_modules/@undefineds.co/models/dist/message.repository.d.ts +1 -1
  203. package/node_modules/@undefineds.co/models/dist/namespaces.js +5 -0
  204. package/node_modules/@undefineds.co/models/dist/pod-storage-descriptor.d.ts +4815 -26
  205. package/node_modules/@undefineds.co/models/dist/pod-storage-descriptor.js +482 -132
  206. package/node_modules/@undefineds.co/models/dist/schema.d.ts +4 -0
  207. package/node_modules/@undefineds.co/models/dist/session/index.d.ts +1 -1
  208. package/node_modules/@undefineds.co/models/dist/settings/index.d.ts +1 -1
  209. package/node_modules/@undefineds.co/models/dist/sidecar/persistence-mapping.d.ts +5 -5
  210. package/node_modules/@undefineds.co/models/dist/thread.repository.d.ts +2 -2
  211. package/node_modules/@undefineds.co/models/dist/types/message-block.d.ts +1 -1
  212. package/node_modules/@undefineds.co/models/dist/vocab/_namespaces.d.ts +1 -1
  213. package/node_modules/@undefineds.co/models/dist/vocab/index.d.ts +10 -10
  214. package/node_modules/@undefineds.co/models/dist/vocab/sidecar.vocab.d.ts +1 -0
  215. package/node_modules/@undefineds.co/models/dist/vocab/sidecar.vocab.js +1 -0
  216. package/node_modules/@undefineds.co/models/package.json +4 -2
  217. package/node_modules/@undefineds.co/pod-collections/README.md +71 -0
  218. package/node_modules/@undefineds.co/pod-collections/dist/diff.d.ts +85 -0
  219. package/node_modules/@undefineds.co/pod-collections/dist/diff.js +166 -0
  220. package/node_modules/@undefineds.co/pod-collections/dist/feed.d.ts +17 -0
  221. package/node_modules/@undefineds.co/pod-collections/dist/feed.js +27 -0
  222. package/node_modules/@undefineds.co/pod-collections/dist/index.cjs +1042 -0
  223. package/node_modules/@undefineds.co/pod-collections/dist/index.d.ts +37 -0
  224. package/node_modules/@undefineds.co/pod-collections/dist/index.js +89 -0
  225. package/node_modules/@undefineds.co/pod-collections/dist/layout.d.ts +75 -0
  226. package/node_modules/@undefineds.co/pod-collections/dist/layout.js +173 -0
  227. package/node_modules/@undefineds.co/pod-collections/dist/mapping.d.ts +78 -0
  228. package/node_modules/@undefineds.co/pod-collections/dist/mapping.js +287 -0
  229. package/node_modules/@undefineds.co/pod-collections/dist/mutations.d.ts +83 -0
  230. package/node_modules/@undefineds.co/pod-collections/dist/mutations.js +273 -0
  231. package/node_modules/@undefineds.co/pod-collections/dist/react.d.ts +21 -0
  232. package/node_modules/@undefineds.co/pod-collections/dist/react.js +22 -0
  233. package/node_modules/@undefineds.co/pod-collections/dist/read.d.ts +65 -0
  234. package/node_modules/@undefineds.co/pod-collections/dist/read.js +31 -0
  235. package/node_modules/@undefineds.co/pod-collections/dist/sync.d.ts +66 -0
  236. package/node_modules/@undefineds.co/pod-collections/dist/sync.js +260 -0
  237. package/node_modules/@undefineds.co/pod-collections/dist/types.d.ts +155 -0
  238. package/node_modules/@undefineds.co/pod-collections/dist/types.js +9 -0
  239. package/node_modules/@undefineds.co/pod-collections/package.json +42 -0
  240. package/node_modules/@undefineds.co/shared-ui/dist/index.d.ts +0 -1
  241. package/node_modules/@undefineds.co/shared-ui/dist/index.js +0 -1
  242. package/package.json +15 -7
  243. package/static/app/assets/main.css +1 -1
  244. package/static/app/assets/main.js +12 -13
  245. package/static/auth-callback/assets/AiConfigContext-DnQs1ZpW.js +1 -0
  246. package/static/auth-callback/assets/AiConfigPage-DOtvlxH0.js +1 -0
  247. package/static/auth-callback/assets/DocumentProcessingPanel-BS2voQgL.js +1 -0
  248. package/static/auth-callback/assets/IndexLifecyclePanel-Cvt0cJtN.js +1 -0
  249. package/static/auth-callback/assets/{IndexSubjectPanel-C4YG0whI.js → IndexSubjectPanel-Dhf01GqF.js} +1 -1
  250. package/static/auth-callback/assets/ModelAssignmentsPanel-BJutWaAF.js +1 -0
  251. package/static/auth-callback/assets/ModelsPage-BRS0sje3.js +11 -0
  252. package/static/auth-callback/assets/{NetworkPage-Cbdn_P1e.js → NetworkPage-B3qBfANA.js} +2 -2
  253. package/static/auth-callback/assets/{PaneListHeader-jy70Q00L.js → PaneListHeader-QQeJGTp4.js} +1 -1
  254. package/static/auth-callback/assets/SearchIndexingPanel-MyNUSEwT.js +1 -0
  255. package/static/auth-callback/assets/{StatusSubjectPanel-hfjoB5aS.js → StatusSubjectPanel-DQkEVsFs.js} +1 -1
  256. package/static/{settings/assets/StatusWorkspace-CKD_Rzdr.js → auth-callback/assets/StatusWorkspace-Dkv63Uwk.js} +1 -1
  257. package/static/auth-callback/assets/SystemSettingsPage-TIsUfX5d.js +1 -0
  258. package/static/auth-callback/assets/SystemSettingsSubjectPanel-BJWEt2-7.js +33 -0
  259. package/static/auth-callback/assets/XpodAiConnectionsPodStore-BJiXm-PF.js +3 -0
  260. package/static/auth-callback/assets/{activity-BcsZZxxw.js → activity-5hNeNKnL.js} +1 -1
  261. package/static/auth-callback/assets/admin-C6qCRFiY.js +1 -0
  262. package/static/auth-callback/assets/ai-connections-CryuHGKW.js +1 -0
  263. package/static/auth-callback/assets/{auth-callback-atKg_oig.js → auth-callback-CAFZ3R0B.js} +80 -84
  264. package/static/auth-callback/assets/auth-callback-rk080mvG.css +1 -0
  265. package/static/auth-callback/assets/{badge-BWbRHThQ.js → badge-CAIPI0CB.js} +1 -1
  266. package/static/auth-callback/assets/collection-runtime-D9s7h9YA.js +1 -0
  267. package/static/auth-callback/assets/dialog-BjA109aX.js +1 -0
  268. package/static/auth-callback/assets/{download-BmvG1Vya.js → download-B3Up5W2G.js} +1 -1
  269. package/static/auth-callback/assets/{external-link-DZ34d3g3.js → external-link-BTXgSPzB.js} +1 -1
  270. package/static/auth-callback/assets/index-BppXlxcp.js +41 -0
  271. package/static/auth-callback/assets/index-CirW4CJf.js +1 -0
  272. package/static/auth-callback/assets/index-DlLYWOhw.js +4 -0
  273. package/static/auth-callback/assets/{index-browser-B9Z7GU-T.js → index-browser-DtU38ni3.js} +1 -1
  274. package/static/auth-callback/assets/{key-round-tjP76Se-.js → key-round-CQCOrZ7x.js} +1 -1
  275. package/static/auth-callback/assets/layout-DB3pMyTl.js +1 -0
  276. package/static/auth-callback/assets/pod-collections-host-KnnGFZHL.js +8 -0
  277. package/static/auth-callback/assets/{rotate-ccw-C_L5ZLx1.js → rotate-ccw-C1zM2KtS.js} +1 -1
  278. package/static/auth-callback/assets/settings-projection-CUkyprDQ.js +1 -0
  279. package/static/auth-callback/assets/{skeleton-C7tGDQIs.js → skeleton-Cqp7_M9-.js} +1 -1
  280. package/static/auth-callback/assets/{waypoints-VMNQlWdU.js → waypoints-Bj6gAUSQ.js} +1 -1
  281. package/static/auth-callback/assets/{workspace-layout-SAp6BtYK.js → workspace-layout-DK8mDzrY.js} +1 -1
  282. package/static/auth-callback/auth-callback.html +2 -2
  283. package/static/dashboard/assets/AiConfigContext-BsE7MqX8.js +1 -0
  284. package/static/dashboard/assets/AiConfigPage-DvM-lRXa.js +1 -0
  285. package/static/dashboard/assets/DocumentProcessingPanel-BPfdlfuf.js +1 -0
  286. package/static/dashboard/assets/IndexLifecyclePanel--m0AGxvh.js +1 -0
  287. package/static/dashboard/assets/{IndexSubjectPanel-DQFPP6-p.js → IndexSubjectPanel-Bb7m1k3d.js} +1 -1
  288. package/static/dashboard/assets/ModelAssignmentsPanel-BLi_zbMa.js +1 -0
  289. package/static/dashboard/assets/ModelsPage-CxdpgnfR.js +11 -0
  290. package/static/dashboard/assets/{NetworkPage-CHQ3YxIB.js → NetworkPage-BAIPw-D_.js} +2 -2
  291. package/static/dashboard/assets/{PaneListHeader-DsXemAdR.js → PaneListHeader-BBCMei0r.js} +1 -1
  292. package/static/dashboard/assets/SearchIndexingPanel-Ck4Y-xjR.js +1 -0
  293. package/static/dashboard/assets/{StatusSubjectPanel-D3PGEYT4.js → StatusSubjectPanel-D1KWfAXE.js} +1 -1
  294. package/static/dashboard/assets/{StatusWorkspace-BcpePYUW.js → StatusWorkspace-JbA5gzXx.js} +1 -1
  295. package/static/dashboard/assets/SystemSettingsPage-BbwQWsSR.js +1 -0
  296. package/static/dashboard/assets/SystemSettingsSubjectPanel-N117nMt5.js +33 -0
  297. package/static/dashboard/assets/XpodAiConnectionsPodStore-CdDOb4SV.js +18 -0
  298. package/static/dashboard/assets/{activity-j5zrznu-.js → activity-DX1I96o_.js} +1 -1
  299. package/static/dashboard/assets/admin-C6qCRFiY.js +1 -0
  300. package/static/dashboard/assets/ai-connections-DwCRqOQa.js +1 -0
  301. package/static/dashboard/assets/{badge-CzeBdG7h.js → badge-k2vhtDqH.js} +1 -1
  302. package/static/dashboard/assets/collection-runtime-BFQ8teQJ.js +1 -0
  303. package/static/dashboard/assets/{dashboard-D-xANHk1.js → dashboard-DWZ-fmCT.js} +105 -109
  304. package/static/dashboard/assets/dashboard-rk080mvG.css +1 -0
  305. package/static/dashboard/assets/dialog-1CCw-iHT.js +1 -0
  306. package/static/dashboard/assets/{download-IcNdEZWi.js → download-C6-SNY1q.js} +1 -1
  307. package/static/dashboard/assets/{external-link-DxBxK8Vu.js → external-link-BgPcZ_j2.js} +1 -1
  308. package/static/dashboard/assets/index-6LcIUIYO.js +1 -0
  309. package/static/dashboard/assets/index-D7A8U6Pt.js +41 -0
  310. package/static/dashboard/assets/index-UD6QOE7H.js +4 -0
  311. package/static/dashboard/assets/{key-round-D1K7warM.js → key-round-BOd7Jo0Q.js} +1 -1
  312. package/static/dashboard/assets/layout-DB3pMyTl.js +1 -0
  313. package/static/dashboard/assets/pod-collections-host-KnnGFZHL.js +8 -0
  314. package/static/dashboard/assets/{rotate-ccw-CcN1N6p9.js → rotate-ccw-CCgJqsvx.js} +1 -1
  315. package/static/dashboard/assets/settings-projection-CUkyprDQ.js +1 -0
  316. package/static/dashboard/assets/{skeleton-CKnmJMUH.js → skeleton-Bc7abAn5.js} +1 -1
  317. package/static/dashboard/assets/{waypoints-DuZPO_wu.js → waypoints-s-opmJxx.js} +1 -1
  318. package/static/dashboard/assets/{workspace-layout-BUj3wZ_m.js → workspace-layout-DqIQeTBV.js} +1 -1
  319. package/static/dashboard/dashboard.html +2 -2
  320. package/static/settings/assets/AiConfigContext-BB9KZySa.js +1 -0
  321. package/static/settings/assets/AiConfigPage-DGSXUkLs.js +1 -0
  322. package/static/settings/assets/DocumentProcessingPanel-Da2Re6Rg.js +1 -0
  323. package/static/settings/assets/IndexLifecyclePanel-BSZuIzgr.js +1 -0
  324. package/static/settings/assets/{IndexSubjectPanel-73sM16Ma.js → IndexSubjectPanel-CFd0ay-r.js} +1 -1
  325. package/static/settings/assets/ModelAssignmentsPanel-CSAryvWJ.js +1 -0
  326. package/static/settings/assets/ModelsPage-BQwCwLHU.js +11 -0
  327. package/static/settings/assets/{NetworkPage-i6j-M2RY.js → NetworkPage-BKymvsQc.js} +2 -2
  328. package/static/settings/assets/{PaneListHeader-DpqC0jd5.js → PaneListHeader-Bjh3hRdQ.js} +1 -1
  329. package/static/settings/assets/SearchIndexingPanel-MjKL5QLU.js +1 -0
  330. package/static/settings/assets/{StatusSubjectPanel-Dv4q3PGh.js → StatusSubjectPanel-Bvl6K4mx.js} +1 -1
  331. package/static/settings/assets/StatusWorkspace-B0NzrP--.js +1 -0
  332. package/static/settings/assets/SystemSettingsPage-D2z6Z4FE.js +1 -0
  333. package/static/settings/assets/SystemSettingsSubjectPanel-4sxma4X4.js +33 -0
  334. package/static/settings/assets/XpodAiConnectionsPodStore-BkNQ8fZx.js +3 -0
  335. package/static/settings/assets/{activity-DaFkk8f3.js → activity-CgJJGpjx.js} +1 -1
  336. package/static/settings/assets/admin-C6qCRFiY.js +1 -0
  337. package/static/settings/assets/ai-connections-CryuHGKW.js +1 -0
  338. package/static/settings/assets/{badge-d5SHdc-x.js → badge-C4NypVyT.js} +1 -1
  339. package/static/settings/assets/collection-runtime-CTLCDxAi.js +1 -0
  340. package/static/settings/assets/dialog-Csq0vWUi.js +1 -0
  341. package/static/settings/assets/{download-CpkwomDr.js → download-DaLJJ-Wp.js} +1 -1
  342. package/static/settings/assets/{external-link-_4YT42Mf.js → external-link--w_iW5Au.js} +1 -1
  343. package/static/settings/assets/index-B0mQa59b.js +4 -0
  344. package/static/settings/assets/index-BukHiu4y.js +1 -0
  345. package/static/settings/assets/index-COmVnZi2.js +41 -0
  346. package/static/settings/assets/{index-browser-B06xjBdZ.js → index-browser-BGpvHwD0.js} +1 -1
  347. package/static/settings/assets/{key-round-Dlqmp1Kq.js → key-round-Bk4YRjBu.js} +1 -1
  348. package/static/settings/assets/layout-DB3pMyTl.js +1 -0
  349. package/static/settings/assets/pod-collections-host-KnnGFZHL.js +8 -0
  350. package/static/settings/assets/{rotate-ccw-TAY65xWT.js → rotate-ccw-TCabbqsr.js} +1 -1
  351. package/static/settings/assets/{settings-ExBXGgbj.js → settings-CJWpdbNC.js} +105 -109
  352. package/static/settings/assets/settings-projection-CUkyprDQ.js +1 -0
  353. package/static/settings/assets/settings-rk080mvG.css +1 -0
  354. package/static/settings/assets/{skeleton-DKIWjNr9.js → skeleton-JDHYVe7t.js} +1 -1
  355. package/static/settings/assets/{waypoints-9erLIxyR.js → waypoints-DDvEl-MU.js} +1 -1
  356. package/static/settings/assets/{workspace-layout-CYXfYIa3.js → workspace-layout-DV5QU30U.js} +1 -1
  357. package/static/settings/settings.html +2 -2
  358. package/node_modules/@undefineds.co/shared-ui/dist/oidc-consent.d.ts +0 -54
  359. package/node_modules/@undefineds.co/shared-ui/dist/oidc-consent.js +0 -21
  360. package/static/auth-callback/assets/AiConfigContext-C81deMM9.js +0 -1
  361. package/static/auth-callback/assets/AiConfigPage-evWI8T56.js +0 -1
  362. package/static/auth-callback/assets/DocumentProcessingPanel-B9GrDEMe.js +0 -1
  363. package/static/auth-callback/assets/IndexLifecyclePanel-qCo8ABQZ.js +0 -1
  364. package/static/auth-callback/assets/ModelAssignmentsPanel-DG7Lxh3t.js +0 -1
  365. package/static/auth-callback/assets/ModelsPage-CgEuqE6p.js +0 -10
  366. package/static/auth-callback/assets/SearchIndexingPanel-ByU3u7kp.js +0 -1
  367. package/static/auth-callback/assets/StatusWorkspace-BZd617sV.js +0 -1
  368. package/static/auth-callback/assets/SystemSettingsPage-BirzWAQM.js +0 -1
  369. package/static/auth-callback/assets/SystemSettingsSubjectPanel-CmsVWNCx.js +0 -31
  370. package/static/auth-callback/assets/admin-BU4m6Ko2.js +0 -1
  371. package/static/auth-callback/assets/ai-connections-CHNTKemd.js +0 -1
  372. package/static/auth-callback/assets/auth-callback-C_7MUXJb.css +0 -1
  373. package/static/auth-callback/assets/index-BpV1hsqs.js +0 -4
  374. package/static/auth-callback/assets/index-D9oE6FXK.js +0 -41
  375. package/static/dashboard/assets/AiConfigContext-De-OtAWo.js +0 -1
  376. package/static/dashboard/assets/AiConfigPage-macP4Mop.js +0 -1
  377. package/static/dashboard/assets/DocumentProcessingPanel-C5ObvCCl.js +0 -1
  378. package/static/dashboard/assets/IndexLifecyclePanel-xVNa2l40.js +0 -1
  379. package/static/dashboard/assets/ModelAssignmentsPanel-DMOATFpQ.js +0 -1
  380. package/static/dashboard/assets/ModelsPage-91UbnETA.js +0 -25
  381. package/static/dashboard/assets/SearchIndexingPanel-Dh70PNFZ.js +0 -1
  382. package/static/dashboard/assets/SystemSettingsPage-BiN5GcKx.js +0 -1
  383. package/static/dashboard/assets/SystemSettingsSubjectPanel-B9QrSiFp.js +0 -31
  384. package/static/dashboard/assets/admin-BU4m6Ko2.js +0 -1
  385. package/static/dashboard/assets/ai-connections-CHNTKemd.js +0 -1
  386. package/static/dashboard/assets/dashboard-C_7MUXJb.css +0 -1
  387. package/static/dashboard/assets/index-FWZ-s52O.js +0 -41
  388. package/static/dashboard/assets/index-ZiQZ96oC.js +0 -4
  389. package/static/settings/assets/AiConfigContext-C0cQMPfG.js +0 -1
  390. package/static/settings/assets/AiConfigPage-CPhB4iFb.js +0 -1
  391. package/static/settings/assets/DocumentProcessingPanel-sYI7OpuH.js +0 -1
  392. package/static/settings/assets/IndexLifecyclePanel-yj8iyiT8.js +0 -1
  393. package/static/settings/assets/ModelAssignmentsPanel-BFIgUX5v.js +0 -1
  394. package/static/settings/assets/ModelsPage-BdppXl7E.js +0 -10
  395. package/static/settings/assets/SearchIndexingPanel-BlPnrkT3.js +0 -1
  396. package/static/settings/assets/SystemSettingsPage-CiOm2NzV.js +0 -1
  397. package/static/settings/assets/SystemSettingsSubjectPanel-Cd-GECon.js +0 -31
  398. package/static/settings/assets/admin-BU4m6Ko2.js +0 -1
  399. package/static/settings/assets/ai-connections-CHNTKemd.js +0 -1
  400. package/static/settings/assets/index-BFi9yn7_.js +0 -41
  401. package/static/settings/assets/index-BGgEhIUy.js +0 -4
  402. package/static/settings/assets/settings-C_7MUXJb.css +0 -1
@@ -0,0 +1,22 @@
1
+ import { useLiveQuery } from '@tanstack/react-db';
2
+ /**
3
+ * `./react` 入口(§6.2):只有这里 import `@tanstack/react-db`,主入口保持无 React。
4
+ *
5
+ * P1 只保证这一层的签名与编译(§8.2 的测试清单里没有 React 用例);真实渲染、
6
+ * live query 与乐观层的交互验收在 P3 的 pilot 页面上做(§8.6)。
7
+ */
8
+ export { useLiveQuery };
9
+ /**
10
+ * 便捷 hook:把一个集合当单表读出来。
11
+ * `rows` 已含乐观行(库的 `state` 语义),`status` 直接来自 live query。
12
+ */
13
+ export function usePodCollection(collection) {
14
+ const { data, status, isLoading } = useLiveQuery({
15
+ query: (q) => q.from({ row: collection }),
16
+ });
17
+ return {
18
+ rows: data,
19
+ status,
20
+ isLoading,
21
+ };
22
+ }
@@ -0,0 +1,65 @@
1
+ import type { AnyPodTable, SolidDatabase } from '@undefineds.co/drizzle-solid';
2
+ import type { PodModelDescriptor } from '@undefineds.co/models';
3
+ import type { PodDocumentRead } from './types.js';
4
+ /**
5
+ * 唯一的读原语(§8.2):`conditionalDocumentRead(document, { ifNoneMatch })`
6
+ * → `{ etag, subjects }`。
7
+ *
8
+ * ## 文档 ETag:P1 第一件事的结论(§8.7-2 / §9-6)
9
+ *
10
+ * **drizzle-solid 0.3.24 的读路径拿不到文档 ETag**,所以本原语恒返回
11
+ * `etag: undefined`,同步按 §8.7-2 的出口降级为「每个合并窗口全量读 + 投影 diff,
12
+ * 只写真正变化的行」,仍然零轮询(N1)。证据:
13
+ *
14
+ * 1. 类型面上没有任何 ETag 载体:`QueryResourceHelper.findMany/findFirst/find/findById`
15
+ * 返回 `Promise<T[]>`(`node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.d.ts`
16
+ * 的 `QueryResourceHelper`)、`ExecutionStrategy.executeSelect` 返回 `unknown[]`
17
+ * (`dist/core/execution/types.d.ts`)、`ComunicaSPARQLExecutor.executeSelect` 同样
18
+ * (`dist/core/sparql-executor.d.ts:22`)。
19
+ * 2. 实现面上只有写路径读 ETag:整个 `dist/`(CJS 与 ESM 两份)里只有
20
+ * `core/sparql-executor.js:301` / `:344` 两处 `headers.get('ETag')`,都在
21
+ * `executeUpdate()` 里为 PATCH 组装 `If-Match`,从不返回给调用方;
22
+ * `executeDirectSparqlQuery()`(同文件 `:704-745`)只取 `payload.results.bindings`。
23
+ * 3. 读并不落在文档上:`credentialResource` 声明了 `sparqlEndpoint: '/settings/-/sparql'`
24
+ * (`@undefineds.co/models@0.2.57` 的 `dist/credential.schema.js:74`,与 0.2.56 同行同值 ——
25
+ * 该版本改动的是 `credentialDescriptor.fields` / `uniqueBy`,没有动表的 endpoint),
26
+ * `SparqlStrategy.executeSelect()`(`dist/core/execution/sparql-strategy.js:66-82`)
27
+ * 把查询发给该 endpoint,`resolveTargetGraph(table, true)`(`forSelect`)对 document
28
+ * 模式返回 `undefined`,实测生成的查询没有 `GRAPH`/`FROM` 子句:
29
+ * `SELECT ?subject … WHERE { ?subject rdf:type <…/ns#Credential>. … }`。
30
+ * `.test-data/etag-probe/probe.ts` 的记录显示这次读期间**文档本身没有被请求**
31
+ * (只打到 `/settings/-/sparql?query=…`),所以文档 ETag 不是这次读的 validator:
32
+ * 即便能拿到它,也无法用来判定「这次读的结果是否变了」。
33
+ * 4. 唯一能拿到 ETag 的路径是绕过读 API:`database.getDialect().config.session.fetch`
34
+ * 是注入的认证 fetch(实测 `HEAD <document>` → `200 ETag: "v1"`,带 `If-None-Match`
35
+ * 的条件 GET → `304`)。它属于 drizzle-solid 的内部接线(`PodDialect.config.session`),
36
+ * 与 §3.2 想要的「条件**读**」不是同一个资源(见第 3 点),因此本层不依赖它,
37
+ * 也不据此伪造 `metadata.collection.etag`。
38
+ *
39
+ * `ifNoneMatch` 因此只是签名上的兼容位:本实现无法用它短路读,读者应把
40
+ * `etag === undefined` 当作「条件读不可用」的信号(§8.7-2、§9-6)。
41
+ */
42
+ export interface PodDocumentReadSource<D extends PodModelDescriptor> {
43
+ descriptor: D;
44
+ table: AnyPodTable;
45
+ database: SolidDatabase;
46
+ /** 表所在文档的绝对 URL(`resolveTableDocument()` 的结果)。 */
47
+ document: string;
48
+ podUrl: string;
49
+ }
50
+ export interface PodDocumentReadRequest {
51
+ /** 上一次读到的文档 ETag。当前读路径无法使用它(见文件头)。 */
52
+ ifNoneMatch?: string;
53
+ }
54
+ /**
55
+ * 读一个文档的全部主语行。行由 drizzle-solid 的读给出(它已经按表的 `type`
56
+ * 施加类过滤:查询里带 `?subject rdf:type <descriptor.class>`),这里再按文档收敛,
57
+ * 因为该读不是文档作用域的(见文件头第 3 点)。
58
+ */
59
+ export declare function conditionalDocumentRead<D extends PodModelDescriptor>(source: PodDocumentReadSource<D>, _request?: PodDocumentReadRequest): Promise<PodDocumentRead>;
60
+ /**
61
+ * 认证 fetch:drizzle-solid 没有公开的 session fetch 访问器,`PodDialect.config.session`
62
+ * 是唯一可达路径,且就是它自己用的那个 fetch(`sparql-executor.js:296/:319` 的 HEAD/PATCH)。
63
+ * 仅 §4.1 的 `array + uri` PATCH 旁路需要它;拿不到时抛明确错误而不是静默跳过写。
64
+ */
65
+ export declare function sessionFetchOf(database: SolidDatabase): typeof fetch | undefined;
@@ -0,0 +1,31 @@
1
+ import { rowBelongsToDocument } from './layout.js';
2
+ /** drizzle-solid `select().from(table).execute()`;首次读前确保表已 init。 */
3
+ async function selectSubjectRows(table, database) {
4
+ const initialized = typeof table.isInitialized === 'function' ? table.isInitialized() : true;
5
+ if (!initialized)
6
+ await database.init?.(table);
7
+ const rows = await database.select().from(table).execute();
8
+ return rows;
9
+ }
10
+ /**
11
+ * 读一个文档的全部主语行。行由 drizzle-solid 的读给出(它已经按表的 `type`
12
+ * 施加类过滤:查询里带 `?subject rdf:type <descriptor.class>`),这里再按文档收敛,
13
+ * 因为该读不是文档作用域的(见文件头第 3 点)。
14
+ */
15
+ export async function conditionalDocumentRead(source, _request = {}) {
16
+ const subjects = await selectSubjectRows(source.table, source.database);
17
+ return {
18
+ etag: undefined,
19
+ subjects: subjects.filter((subject) => rowBelongsToDocument(source.descriptor, source.document, source.podUrl, subject)),
20
+ };
21
+ }
22
+ /**
23
+ * 认证 fetch:drizzle-solid 没有公开的 session fetch 访问器,`PodDialect.config.session`
24
+ * 是唯一可达路径,且就是它自己用的那个 fetch(`sparql-executor.js:296/:319` 的 HEAD/PATCH)。
25
+ * 仅 §4.1 的 `array + uri` PATCH 旁路需要它;拿不到时抛明确错误而不是静默跳过写。
26
+ */
27
+ export function sessionFetchOf(database) {
28
+ const dialect = database.getDialect?.();
29
+ const candidate = dialect?.config?.session?.fetch;
30
+ return typeof candidate === 'function' ? candidate : undefined;
31
+ }
@@ -0,0 +1,66 @@
1
+ import type { Collection, SyncConfig } from '@tanstack/db';
2
+ import type { AnyPodTable, SolidDatabase } from '@undefineds.co/drizzle-solid';
3
+ import type { PodModelDescriptor } from '@undefineds.co/models';
4
+ import type { PodPendingWrites } from './mutations.js';
5
+ import type { PodDocumentFeed, PodSyncState, RowOf } from './types.js';
6
+ /**
7
+ * TanStack sync 实现(§3)。
8
+ *
9
+ * 时序不可换(§3.1):
10
+ *
11
+ * ```
12
+ * feed.watch(document) ──► 首次整表读(一次 drizzle-solid select)
13
+ * │ │
14
+ * │ 读期间到达的脏信号 → 缓冲
15
+ * ▼ ▼
16
+ * 投递脏信号 ◄──────────── markReady()
17
+ * │
18
+ * ▼
19
+ * 合并窗口(75ms)──► 重读 ──► diff ──► begin/write/commit 增量
20
+ * ```
21
+ *
22
+ * 与 §3.2 伪代码的三处**实测修正**(@tanstack/db@0.9.0):
23
+ *
24
+ * 1. `metadata.row.set()` 必须在事务**打开期间**调用:
25
+ * `dist/esm/collection/sync.js:272-280` 的 `getActivePendingSyncTransaction()` 在
26
+ * 没有未提交事务时抛 `NoPendingSyncTransactionWriteError`,所以伪代码里 `commit()`
27
+ * 之后再 `set` 会直接抛错。这里改成 `write → metadata.row.set → commit`。
28
+ * 2. `commit()` 返回 `true | Promise<void>`(同步可见性收据),必须 `await`:
29
+ * 存在 persisting 的用户事务时,普通 sync 事务会被排队
30
+ * (`dist/esm/collection/state.js:593` 的 `!hasPersistingTransaction || …`),
31
+ * 等待收据就会一直挂住。因此本实现统一用 `begin({ immediate: true })`
32
+ * —— 这正是库为「需要立刻写入 syncedData 的写操作」提供的开关。
33
+ * 3. `metadata.collection` 的 ETag 无法获得(见 `read.ts` 的结论),
34
+ * 所以每个脏信号都是「读 + 投影 diff」,未变的行 0 次 `write()`(§8.7-2 的出口)。
35
+ */
36
+ /** 变更合并窗口,沿用现网 `TABLE_CHANGE_COALESCE_MS`(§3.2)。 */
37
+ export declare const DEFAULT_COALESCE_MS = 75;
38
+ /** §4.2:确认未满足时再等一个合并窗口重试,默认 2 次后抛错。 */
39
+ export declare const DEFAULT_CONFIRM_RETRIES = 2;
40
+ export interface PodSyncOptions<D extends PodModelDescriptor> {
41
+ descriptor: D;
42
+ table: AnyPodTable;
43
+ database: SolidDatabase;
44
+ podUrl: string;
45
+ document: string;
46
+ feed?: PodDocumentFeed;
47
+ coalesceMs?: number;
48
+ confirmRetries?: number;
49
+ pending: PodPendingWrites<RowOf<D>>;
50
+ /** 创建后回填的集合引用(`refresh()` 在 sync 启动前被调用时用它拉起 preload)。 */
51
+ collection: () => Collection<RowOf<D>, string> | undefined;
52
+ }
53
+ export interface PodSyncEngine<R extends object> {
54
+ /** 交给 `createCollection({ sync: { sync } })` 的函数。 */
55
+ sync: SyncConfig<R, string>['sync'];
56
+ /** 显式重读(`PodCollection.refresh()`)。 */
57
+ refresh(): Promise<void>;
58
+ /** §4.2 的确认协议:写后立刻重读,未满足则等一个合并窗口重试。 */
59
+ confirmPending(key: string): Promise<void>;
60
+ state(): PodSyncState;
61
+ /** 释放订阅与定时器(页面卸载/登出;宿主 capability 的 `dispose()`)。 */
62
+ dispose(): void;
63
+ /** @internal 测试钩子:调用库的 `truncate()`(清空 syncedData 与 row metadata)。 */
64
+ truncate(): void;
65
+ }
66
+ export declare function createPodSync<D extends PodModelDescriptor>(options: PodSyncOptions<D>): PodSyncEngine<RowOf<D>>;
@@ -0,0 +1,260 @@
1
+ import { conditionalDocumentRead } from './read.js';
2
+ import { mapSubjectRows, projectionFieldOrder, writeOnlyFields } from './mapping.js';
3
+ import { computeDocumentDiff, projectionHash, stripVirtualProps } from './diff.js';
4
+ import { subscribeDocumentFeed } from './feed.js';
5
+ import { reconcilePendingWrites } from './mutations.js';
6
+ import { PodCollectionError } from './types.js';
7
+ /**
8
+ * TanStack sync 实现(§3)。
9
+ *
10
+ * 时序不可换(§3.1):
11
+ *
12
+ * ```
13
+ * feed.watch(document) ──► 首次整表读(一次 drizzle-solid select)
14
+ * │ │
15
+ * │ 读期间到达的脏信号 → 缓冲
16
+ * ▼ ▼
17
+ * 投递脏信号 ◄──────────── markReady()
18
+ * │
19
+ * ▼
20
+ * 合并窗口(75ms)──► 重读 ──► diff ──► begin/write/commit 增量
21
+ * ```
22
+ *
23
+ * 与 §3.2 伪代码的三处**实测修正**(@tanstack/db@0.9.0):
24
+ *
25
+ * 1. `metadata.row.set()` 必须在事务**打开期间**调用:
26
+ * `dist/esm/collection/sync.js:272-280` 的 `getActivePendingSyncTransaction()` 在
27
+ * 没有未提交事务时抛 `NoPendingSyncTransactionWriteError`,所以伪代码里 `commit()`
28
+ * 之后再 `set` 会直接抛错。这里改成 `write → metadata.row.set → commit`。
29
+ * 2. `commit()` 返回 `true | Promise<void>`(同步可见性收据),必须 `await`:
30
+ * 存在 persisting 的用户事务时,普通 sync 事务会被排队
31
+ * (`dist/esm/collection/state.js:593` 的 `!hasPersistingTransaction || …`),
32
+ * 等待收据就会一直挂住。因此本实现统一用 `begin({ immediate: true })`
33
+ * —— 这正是库为「需要立刻写入 syncedData 的写操作」提供的开关。
34
+ * 3. `metadata.collection` 的 ETag 无法获得(见 `read.ts` 的结论),
35
+ * 所以每个脏信号都是「读 + 投影 diff」,未变的行 0 次 `write()`(§8.7-2 的出口)。
36
+ */
37
+ /** 变更合并窗口,沿用现网 `TABLE_CHANGE_COALESCE_MS`(§3.2)。 */
38
+ export const DEFAULT_COALESCE_MS = 75;
39
+ /** §4.2:确认未满足时再等一个合并窗口重试,默认 2 次后抛错。 */
40
+ export const DEFAULT_CONFIRM_RETRIES = 2;
41
+ function sleep(ms) {
42
+ return new Promise((resolve) => {
43
+ setTimeout(resolve, ms);
44
+ });
45
+ }
46
+ export function createPodSync(options) {
47
+ const { descriptor, table, database, document, podUrl, pending } = options;
48
+ const coalesceMs = options.coalesceMs ?? DEFAULT_COALESCE_MS;
49
+ const confirmRetries = options.confirmRetries ?? DEFAULT_CONFIRM_RETRIES;
50
+ const fieldOrder = projectionFieldOrder(descriptor);
51
+ // `secret: true` 的字段读不回来,确认协议要按这条规则把它们排除在比对之外(§4.2、§9-7)。
52
+ const writeOnly = writeOnlyFields(descriptor);
53
+ const hashOf = (row) => projectionHash(row, fieldOrder);
54
+ let params;
55
+ let subscription;
56
+ let feedAvailable = false;
57
+ let ready = false;
58
+ let failureReported = false;
59
+ let syncState = 'initializing';
60
+ let timer;
61
+ let bufferedSignals = [];
62
+ let running;
63
+ let rerunRequested = false;
64
+ let disposed = false;
65
+ let lastEtag;
66
+ async function ensureParams() {
67
+ if (params)
68
+ return params;
69
+ const collection = options.collection();
70
+ if (!collection) {
71
+ throw new PodCollectionError('sync_not_started', 'collection has not started syncing yet');
72
+ }
73
+ await collection.preload();
74
+ if (!params) {
75
+ throw new PodCollectionError('sync_not_started', 'collection sync did not start');
76
+ }
77
+ return params;
78
+ }
79
+ function schedulePass() {
80
+ if (disposed || timer !== undefined)
81
+ return;
82
+ timer = setTimeout(() => {
83
+ timer = undefined;
84
+ void runPass().catch(() => {
85
+ // 脏信号驱动的读失败:保持现有行,状态标降级(§3.4),等下一次信号或显式 refresh()。
86
+ syncState = 'degraded';
87
+ });
88
+ }, coalesceMs);
89
+ }
90
+ /**
91
+ * 串行化的「读 + diff + 写」:正在跑的一轮会吸收新请求(合并成一轮重跑),
92
+ * 空闲时立刻开一轮。sync 事务一律用 `immediate` 开始(见文件头修正 2)。
93
+ *
94
+ * `running` 必须在**本轮循环结束时同步清掉**(内层 `finally`),不能挂在返回
95
+ * promise 的 `.finally()` 上:后者要等一个额外的微任务,那段时间里 `running`
96
+ * 仍是已完成的旧 promise,调用方会拿到「什么都没做」的旧 promise
97
+ * (实测:首读失败后紧接着 refresh() 不会产生新读)。
98
+ */
99
+ function runPass() {
100
+ if (running) {
101
+ rerunRequested = true;
102
+ return running;
103
+ }
104
+ const task = (async () => {
105
+ try {
106
+ do {
107
+ rerunRequested = false;
108
+ await passOnce();
109
+ } while (rerunRequested && !disposed);
110
+ }
111
+ finally {
112
+ running = undefined;
113
+ }
114
+ })();
115
+ running = task;
116
+ return task;
117
+ }
118
+ async function passOnce() {
119
+ const sync = await ensureParams();
120
+ if (disposed)
121
+ return;
122
+ let read;
123
+ try {
124
+ read = await conditionalDocumentRead({ descriptor, table, database, document, podUrl }, { ifNoneMatch: lastEtag });
125
+ }
126
+ catch (error) {
127
+ // 读失败 → 不动集合,只标降级(§3.4);首读失败必须给库一个结论,否则 live query 永不
128
+ // resolve,所以报一次 markError。之后成功的读会把它带回 ready(库允许 error → ready),
129
+ // 因此这里**不**把 `ready` 置真。
130
+ syncState = 'degraded';
131
+ if (!ready && !failureReported) {
132
+ failureReported = true;
133
+ sync.markError(error);
134
+ }
135
+ return;
136
+ }
137
+ if (read.etag !== undefined)
138
+ lastEtag = read.etag;
139
+ const rows = mapSubjectRows(descriptor, table, read.subjects);
140
+ const next = new Map(rows.map((row) => [String(row.id), row]));
141
+ const presentKeys = [...sync.collection.keys()].map((key) => String(key));
142
+ const knownHash = (key) => {
143
+ const entry = sync.metadata?.row.get(key);
144
+ return entry?.hash;
145
+ };
146
+ const diff = computeDocumentDiff({
147
+ next,
148
+ presentKeys,
149
+ pendingKeys: pending.keys,
150
+ knownHash,
151
+ hashOf,
152
+ presentRow: (key) => sync.collection.get(key),
153
+ });
154
+ if (diff.inserts.length + diff.updates.length + diff.deletes.length > 0) {
155
+ // immediate:库在存在 persisting 用户事务时会把普通 sync 事务排队,
156
+ // 那会让 §4.4 的自回声与 §4.2 的确认永远等不到应用(见文件头修正 2)。
157
+ sync.begin({ immediate: true });
158
+ for (const entry of diff.inserts) {
159
+ sync.write({ type: 'insert', value: stripVirtualProps(entry.row) });
160
+ }
161
+ for (const entry of diff.updates) {
162
+ // `rowUpdateMode: 'full'`:整行替换,键由库用 `getKey(value)` 取(行里有 id)。
163
+ sync.write({ type: 'update', value: stripVirtualProps(entry.row) });
164
+ }
165
+ for (const entry of diff.deletes) {
166
+ // §3.2 要求 delete 带上前一行;0.9.0 的 `ChangeMessageOrDeleteKeyMessage` 联合类型
167
+ // 不允许 delete 携带 value(运行时允许且不使用),因此在这里做一次局部放宽。
168
+ sync.write({
169
+ type: 'delete',
170
+ key: entry.key,
171
+ value: stripVirtualProps(entry.row),
172
+ });
173
+ }
174
+ for (const entry of [...diff.inserts, ...diff.updates]) {
175
+ // 投影哈希写进 row metadata(delete 的 row metadata 由库自动删除,§3.2)。
176
+ sync.metadata?.row.set(entry.key, { hash: hashOf(entry.row) });
177
+ }
178
+ await sync.commit();
179
+ }
180
+ if (!ready) {
181
+ ready = true;
182
+ failureReported = false;
183
+ sync.markReady();
184
+ }
185
+ reconcilePendingWrites(pending, next, hashOf, writeOnly);
186
+ syncState = feedAvailable ? 'live' : 'unavailable';
187
+ }
188
+ async function confirmPending(key) {
189
+ const entry = pending.entries.get(key);
190
+ if (!entry)
191
+ return;
192
+ for (let attempt = 0;; attempt += 1) {
193
+ await runPass();
194
+ if (entry.settled) {
195
+ if (entry.error)
196
+ throw entry.error;
197
+ return;
198
+ }
199
+ if (attempt >= confirmRetries) {
200
+ throw new PodCollectionError('write_unconfirmed', `write to ${key} was not visible in the document after ${confirmRetries + 1} reads`);
201
+ }
202
+ await sleep(coalesceMs);
203
+ }
204
+ }
205
+ const sync = (syncParams) => {
206
+ if (disposed)
207
+ return () => { };
208
+ params = syncParams;
209
+ subscription = subscribeDocumentFeed(options.feed, document, () => {
210
+ if (!ready) {
211
+ bufferedSignals.push({ topic: document });
212
+ return;
213
+ }
214
+ schedulePass();
215
+ });
216
+ feedAvailable = subscription.available;
217
+ void runPass()
218
+ .then(() => {
219
+ if (disposed)
220
+ return;
221
+ // 状态由 passOnce 写(成功 = live/unavailable,失败 = degraded),这里只重放缓冲信号。
222
+ const replay = bufferedSignals;
223
+ bufferedSignals = [];
224
+ if (replay.length > 0)
225
+ schedulePass();
226
+ })
227
+ .catch(() => {
228
+ syncState = 'degraded';
229
+ });
230
+ return () => {
231
+ dispose();
232
+ };
233
+ };
234
+ function dispose() {
235
+ if (disposed)
236
+ return;
237
+ disposed = true;
238
+ if (timer !== undefined) {
239
+ clearTimeout(timer);
240
+ timer = undefined;
241
+ }
242
+ subscription?.unsubscribe();
243
+ subscription = undefined;
244
+ bufferedSignals = [];
245
+ }
246
+ return {
247
+ sync,
248
+ refresh: () => runPass(),
249
+ confirmPending,
250
+ state: () => syncState,
251
+ dispose,
252
+ truncate: () => {
253
+ if (!params || disposed)
254
+ return;
255
+ params.begin({ immediate: true });
256
+ params.truncate();
257
+ void Promise.resolve(params.commit()).catch(() => { });
258
+ },
259
+ };
260
+ }
@@ -0,0 +1,155 @@
1
+ import type { Collection, InsertConfig, Transaction } from '@tanstack/db';
2
+ import type { AnyPodTable, SolidDatabase } from '@undefineds.co/drizzle-solid';
3
+ import type { PodModelDescriptor, PodModelFieldDescriptor, PodModelFieldType } from '@undefineds.co/models';
4
+ /**
5
+ * descriptor 字段类型 → TS 类型(`docs/pod-collections.md` §2.1)。
6
+ * `array: true` 必须先于标量判断。
7
+ *
8
+ * 与 §2.1 代码块的唯一差别是最后两行:`@undefineds.co/models@0.2.57` 仍然把 descriptor
9
+ * 声明成 `PodModelDescriptor`(`fields: Record<string, PodModelFieldDescriptor>`,
10
+ * 见 `dist/pod-storage-descriptor.d.ts:13-34` / `:95`),字段字面量类型没有随包导出,
11
+ * 所以官方 descriptor 的 `{ type: ... }` 是**联合类型**而不是单个字面量 —— 0.2.57 补的是
12
+ * credential 的字段(19 个),没有把字段类型变精确。此时若沿用 §2.1 的 `: string` 兜底,
13
+ * `RowOf<typeof credentialDescriptor>` 会把 `expiresAt` / `createdAt` 等 `timestamp` 字段
14
+ * 也标成 `string`,而运行时它们是 `Date` —— 类型说谎。这里对「类型未被收窄」的情形返回
15
+ * `unknown`:字面量 descriptor(测试与将来的 models 发版)仍得到 §2.1 的精确类型,
16
+ * 官方 descriptor 得到诚实的 `unknown`,绝不静默收窄或放宽成表列类型。
17
+ *
18
+ * 附带后果:`keyof Record<string, …>` 是 `string | number`,所以 `RowOf<官方 descriptor>`
19
+ * 带索引签名,字段名不会被静态校验 —— 这正是 `test/guards.test.ts` 用运行时清单
20
+ * (36 字段 / 36 列 / `uniqueBy`)而不是类型来守漂移的原因。
21
+ */
22
+ export type PodFieldValue<F extends PodModelFieldDescriptor> = F extends {
23
+ array: true;
24
+ } ? PodFieldValue<Omit<F, 'array'>>[] : F extends {
25
+ type: 'number';
26
+ } ? number : F extends {
27
+ type: 'boolean';
28
+ } ? boolean : F extends {
29
+ type: 'timestamp';
30
+ } ? Date : F extends {
31
+ type: 'json';
32
+ } ? unknown : F extends {
33
+ type: 'string' | 'text' | 'uri';
34
+ } ? string : F extends {
35
+ type: PodModelFieldType;
36
+ } ? unknown : string;
37
+ /**
38
+ * 行 = descriptor 的 fields 投影 + 行标识(§2.1)。
39
+ *
40
+ * 行标识只有 `id`(`resourceIdPattern` 的 `{id}` slot,§2.7 的键取法)与 `@id`
41
+ * (主语 IRI)。**不从 drizzle 表列推导行类型**:表列与 descriptor 不一致时由
42
+ * `test/guards.test.ts` 报错,而不是悄悄把行类型放宽到表列。
43
+ */
44
+ export type RowOf<D extends PodModelDescriptor> = {
45
+ [K in keyof D['fields']]: PodFieldValue<D['fields'][K]>;
46
+ } & {
47
+ id: string;
48
+ '@id'?: string;
49
+ };
50
+ /**
51
+ * drizzle-solid `select()` 返回的「主语行」:列名 → 已解码值,外加虚列
52
+ * `id`(base-relative resource id)、`@id` / `uri` / `subject`(主语 IRI)。
53
+ * 形状由 `packages/pod-collections/.test-data` 探针实测,
54
+ * 见 `read.ts` 的 ETag 说明。
55
+ */
56
+ export type PodSubjectRow = Record<string, unknown>;
57
+ /**
58
+ * 一次文档读的结果(§8.2 的 `conditionalDocumentRead`)。
59
+ *
60
+ * `etag` 只有在读路径能拿到文档 validator 时才有值;drizzle-solid 0.3.24 的读
61
+ * 路径拿不到(证据见 `read.ts`),所以实际实现恒为 `undefined`,同步退化为
62
+ * 「每个合并窗口全量读 + 投影 diff」(§8.7-2 的出口)。字段保留是为了将来读原语
63
+ * 能给出 ETag 时不必改签名。
64
+ */
65
+ export interface PodDocumentRead {
66
+ etag: string | undefined;
67
+ subjects: PodSubjectRow[];
68
+ }
69
+ /**
70
+ * 变更 feed 端口(§2.2):只声明集合层用到的那一面,结构上由
71
+ * `SolidNotificationsCapability` 满足。集合层不实现任何传输。
72
+ */
73
+ export interface PodDocumentFeed {
74
+ watch(topicUrl: string, listener: (signal: {
75
+ topic: string;
76
+ }) => void): () => void;
77
+ }
78
+ /** 该 key 上未确认的本地写与服务端行的冲突(§4.5,server wins + 标记)。 */
79
+ export interface PodRowConflict<R extends object> {
80
+ key: string;
81
+ /** 服务端当前行(已生效)。 */
82
+ server: R;
83
+ /** 本地未确认写入的意图。 */
84
+ local: R;
85
+ at: number;
86
+ }
87
+ /** 同步状态:`live` = feed 可用;`unavailable` = 只读一次 + 显式 `refresh()`(N1)。 */
88
+ export type PodSyncState = 'initializing' | 'live' | 'unavailable' | 'degraded';
89
+ /**
90
+ * TanStack 的 Collection + 我们加的观测面(§2.2)。
91
+ * TanStack 的类型不出现在 applet 签名里,换引擎时改动面锁在包内。
92
+ */
93
+ export interface PodCollection<R extends {
94
+ id: string;
95
+ } = Record<string, unknown> & {
96
+ id: string;
97
+ }> extends Collection<R, string> {
98
+ /**
99
+ * 写入负载收窄成「descriptor 字段的一部分 + 行标识」。
100
+ *
101
+ * 为什么不能直接用 `RowOf<D>` 当插入输入:`secret: true` 的字段不从行里投影出去
102
+ * (§2.1),所以行类型拿不到、也读不回这些字段,而写入必须能提供它们。缺的字段
103
+ * 由 drizzle-solid 的列默认值补齐;确认协议按「意图里**可读**的字段」逐字段比对,
104
+ * 不用整行相等(否则带默认值的服务端行永远无法与部分意图相等)。
105
+ *
106
+ * 只写字段(`secret: true`)写得到、读不回,因此**不参与**确认比对,也不会因为
107
+ * 它们被判冲突:它们的证据是写入调用本身成功。规则与理由见 `diff.projectionCovers()`
108
+ * 与 `docs/pod-collections.md` §9-7。
109
+ */
110
+ insert: (data: (Partial<R> & {
111
+ id: string;
112
+ }) | Array<Partial<R> & {
113
+ id: string;
114
+ }>, config?: InsertConfig) => Transaction<Record<string, unknown>>;
115
+ /** 表所在文档的绝对 URL(§2.3 的 topic 推导结果)。 */
116
+ readonly tableDocument: string;
117
+ /** 有未确认本地写的 key。sync 不会用服务端行覆盖它们的 insert/delete 判定(§3、§4.4)。 */
118
+ readonly pendingKeys: ReadonlySet<string>;
119
+ /** 记录到的外部冲突(最近优先)。 */
120
+ readonly conflicts: readonly PodRowConflict<R>[];
121
+ /** 显式条件重读;mutation handler 的确认协议内部也用它(§4.2)。 */
122
+ refresh(): Promise<void>;
123
+ }
124
+ export interface PodCollectionOptions<D extends PodModelDescriptor> {
125
+ /** drizzle-solid 表:I/O 走它。 */
126
+ table: AnyPodTable;
127
+ database: SolidDatabase;
128
+ podUrl: string;
129
+ /** 变更 feed(脏信号)。缺省 = 无 live:只读一次,之后只能显式 refresh()(N1)。 */
130
+ feed?: PodDocumentFeed;
131
+ /**
132
+ * 表所在文档。单文档表可由 `storage.base` 推导(缺省);
133
+ * 跨文档表(模型行按 provider 分文档)必须给,或用 scope 选一个文档。
134
+ */
135
+ document?: string;
136
+ scope?: {
137
+ provider?: string;
138
+ instanceId?: string;
139
+ };
140
+ /** 变更合并窗口,沿用现网 75ms。 */
141
+ coalesceMs?: number;
142
+ onConflict?: (conflict: PodRowConflict<RowOf<D>>) => void;
143
+ /** 确认协议的重试次数(写入后未读回意图时再等一个合并窗口),默认 2(§4.2)。 */
144
+ confirmRetries?: number;
145
+ }
146
+ /** 集合层错误:都带稳定 code,调用方按 code 分派,不解析 message。 */
147
+ export declare class PodCollectionError extends Error {
148
+ readonly code: string;
149
+ /** 原始错误(`Error.cause` 是 ES2022;本包 target ES2020,自己挂字段)。 */
150
+ readonly cause?: unknown;
151
+ constructor(code: string, message: string, options?: {
152
+ cause?: unknown;
153
+ });
154
+ }
155
+ export type { PodModelDescriptor, PodModelFieldDescriptor };
@@ -0,0 +1,9 @@
1
+ /** 集合层错误:都带稳定 code,调用方按 code 分派,不解析 message。 */
2
+ export class PodCollectionError extends Error {
3
+ constructor(code, message, options) {
4
+ super(message);
5
+ this.name = 'PodCollectionError';
6
+ this.code = code;
7
+ this.cause = options?.cause;
8
+ }
9
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@undefineds.co/pod-collections",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "type": "module",
6
+ "sideEffects": false,
7
+ "files": [
8
+ "dist",
9
+ "README.md"
10
+ ],
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js",
15
+ "require": "./dist/index.cjs"
16
+ },
17
+ "./react": {
18
+ "types": "./dist/react.d.ts",
19
+ "import": "./dist/react.js"
20
+ }
21
+ },
22
+ "scripts": {
23
+ "build": "rm -rf dist && tsc -p tsconfig.json && bun ../../scripts/fix-dist-js-imports.mjs dist && bun build src/index.ts --target=node --format=cjs --packages=external --outfile=dist/index.cjs",
24
+ "test": "vitest run test --config ../../vitest.packages.config.mts",
25
+ "typecheck": "tsc --noEmit -p tsconfig.test.json"
26
+ },
27
+ "dependencies": {
28
+ "@tanstack/db": "0.9.0",
29
+ "@tanstack/react-db": "0.3.8",
30
+ "@undefineds.co/models": "0.2.59"
31
+ },
32
+ "peerDependencies": {
33
+ "react": "^19.2.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/react": "^19.2.14",
37
+ "react": "^19.2.0",
38
+ "react-dom": "^19.2.0",
39
+ "typescript": "^6.0.3",
40
+ "vitest": "^4.1.8"
41
+ }
42
+ }
@@ -17,7 +17,6 @@ export { LocalReachabilitySummary, } from './login/LocalReachabilitySummary';
17
17
  export { getProviderActionLabel, getProviderDisplayLabel, getProviderInfoText, getProviderSourceLabel, getProviderStatusBadge, getProviderSubtitle, type ProviderStatusBadge, } from './login/presentation';
18
18
  export { isLocalLoginProvider, isLocalLoginProviderSource, resolveLoginProviderSource, } from './login/provider-model';
19
19
  export type { AuthWindowStatus, ConnectingProviderInfo, LocalLoginProviderSource, LocalLoginStatus, LocalOnboardingCapabilities, LocalOnboardingConnectivity, LocalOnboardingProgress, LocalOnboardingRouteKind, LocalOnboardingRouteProbe, LocalOnboardingSnapshot, LocalOnboardingState, LocalOnboardingTunnel, LocalPodRuntime, LocalSpaceKind, LoginEndpoint, LoginEndpointKind, LoginModalProps, LoginProviderOption, LoginProviderSource, LoginState, ProviderOption, StorageConflict, StoredAccount, } from './login/types';
20
- export * from './oidc-consent';
21
20
  export * from './scroll-area';
22
21
  export * from './separator';
23
22
  export * from './skeleton';