@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.
Files changed (372) 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/chatkit/pod-store.d.ts +31 -0
  52. package/dist/api/chatkit/pod-store.js +132 -8
  53. package/dist/api/container/common.js +24 -4
  54. package/dist/api/container/routes.js +17 -2
  55. package/dist/api/container/types.d.ts +3 -1
  56. package/dist/api/handlers/AdminHandler.d.ts +13 -0
  57. package/dist/api/handlers/AdminHandler.js +47 -18
  58. package/dist/api/handlers/AiConfigHandler.d.ts +6 -0
  59. package/dist/api/handlers/AiConfigHandler.js +28 -0
  60. package/dist/api/handlers/AiGatewayManagementHandler.js +36 -0
  61. package/dist/api/runs/RdfRunContextRetriever.d.ts +14 -0
  62. package/dist/api/runs/RdfRunContextRetriever.js +41 -5
  63. package/dist/api/runtime.js +2 -1
  64. package/dist/cli/commands/secret.d.ts +1 -0
  65. package/dist/cli/commands/secret.js +25 -7
  66. package/dist/components/components.jsonld +3 -1
  67. package/dist/components/context.jsonld +53 -1
  68. package/dist/http/SubgraphSparqlHttpHandler.d.ts +59 -2
  69. package/dist/http/SubgraphSparqlHttpHandler.js +145 -13
  70. package/dist/http/SubgraphSparqlHttpHandler.jsonld +37 -0
  71. package/dist/identity/drizzle/EdgeNodeRepository.d.ts +0 -12
  72. package/dist/identity/drizzle/EdgeNodeRepository.js +5 -13
  73. package/dist/index.d.ts +2 -1
  74. package/dist/index.js +7 -3
  75. package/dist/logging/log-file.d.ts +17 -0
  76. package/dist/logging/log-file.js +69 -0
  77. package/dist/main.js +2 -1
  78. package/dist/notifications/NotificationChannelSweeper.d.ts +50 -0
  79. package/dist/notifications/NotificationChannelSweeper.js +131 -0
  80. package/dist/notifications/NotificationChannelSweeper.jsonld +136 -0
  81. package/dist/notifications/ReclaimingWebSocket2023Storer.d.ts +25 -0
  82. package/dist/notifications/ReclaimingWebSocket2023Storer.js +56 -0
  83. package/dist/notifications/ReclaimingWebSocket2023Storer.jsonld +77 -0
  84. package/dist/notifications/index.d.ts +2 -0
  85. package/dist/notifications/index.js +2 -0
  86. package/dist/runtime/Proxy.d.ts +37 -0
  87. package/dist/runtime/Proxy.js +88 -16
  88. package/dist/runtime/bootstrap.js +2 -1
  89. package/dist/runtime/upgrade/BunNativeUpgradeRelay.d.ts +116 -0
  90. package/dist/runtime/upgrade/BunNativeUpgradeRelay.js +423 -0
  91. package/dist/runtime/upgrade/UpgradeHandshake.d.ts +63 -0
  92. package/dist/runtime/upgrade/UpgradeHandshake.js +199 -0
  93. package/dist/runtime/upgrade/WebSocketFrames.d.ts +67 -0
  94. package/dist/runtime/upgrade/WebSocketFrames.js +224 -0
  95. package/node_modules/@undefineds.co/ai-connections/dist/AiApiKeyPool.js +8 -1
  96. package/node_modules/@undefineds.co/ai-connections/dist/AiAuthorizationActions.d.ts +11 -2
  97. package/node_modules/@undefineds.co/ai-connections/dist/AiAuthorizationActions.js +27 -10
  98. package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.d.ts +7 -0
  99. package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.js +13 -11
  100. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectDialog.js +1 -1
  101. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsList.js +10 -6
  102. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMain.d.ts +15 -0
  103. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMain.js +29 -3
  104. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMainHeader.js +18 -3
  105. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.d.ts +16 -1
  106. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.js +92 -20
  107. package/node_modules/@undefineds.co/ai-connections/dist/AiCopyButton.d.ts +35 -0
  108. package/node_modules/@undefineds.co/ai-connections/dist/AiCopyButton.js +45 -0
  109. package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialPoolSection.js +71 -11
  110. package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialRow.js +9 -7
  111. package/node_modules/@undefineds.co/ai-connections/dist/AiEndpointList.d.ts +23 -0
  112. package/node_modules/@undefineds.co/ai-connections/dist/AiEndpointList.js +24 -0
  113. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.d.ts +13 -4
  114. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.js +35 -38
  115. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayModelsSection.d.ts +21 -0
  116. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayModelsSection.js +51 -0
  117. package/node_modules/@undefineds.co/ai-connections/dist/AiInfoTooltip.d.ts +15 -0
  118. package/node_modules/@undefineds.co/ai-connections/dist/AiInfoTooltip.js +16 -0
  119. package/node_modules/@undefineds.co/ai-connections/dist/AiModelCatalog.d.ts +175 -0
  120. package/node_modules/@undefineds.co/ai-connections/dist/AiModelCatalog.js +133 -0
  121. package/node_modules/@undefineds.co/ai-connections/dist/AiOfferingDetails.js +2 -2
  122. package/node_modules/@undefineds.co/ai-connections/dist/AiProviderCard.js +13 -64
  123. package/node_modules/@undefineds.co/ai-connections/dist/AiProviderHeader.d.ts +21 -0
  124. package/node_modules/@undefineds.co/ai-connections/dist/AiProviderHeader.js +12 -0
  125. package/node_modules/@undefineds.co/ai-connections/dist/AiRowAction.d.ts +15 -0
  126. package/node_modules/@undefineds.co/ai-connections/dist/AiRowAction.js +12 -0
  127. package/node_modules/@undefineds.co/ai-connections/dist/AiSortableCredentialList.js +2 -1
  128. package/node_modules/@undefineds.co/ai-connections/dist/ai-connections-client.d.ts +7 -0
  129. package/node_modules/@undefineds.co/ai-connections/dist/ai-connections-client.js +6 -0
  130. package/node_modules/@undefineds.co/ai-connections/dist/authorization-methods.d.ts +36 -5
  131. package/node_modules/@undefineds.co/ai-connections/dist/authorization-methods.js +52 -9
  132. package/node_modules/@undefineds.co/ai-connections/dist/client/normalize.js +30 -3
  133. package/node_modules/@undefineds.co/ai-connections/dist/client/types.d.ts +21 -1
  134. package/node_modules/@undefineds.co/ai-connections/dist/client-config/base-adapter.d.ts +1 -3
  135. package/node_modules/@undefineds.co/ai-connections/dist/client-config/base-adapter.js +3 -7
  136. package/node_modules/@undefineds.co/ai-connections/dist/client-config/index.cjs +9 -7
  137. package/node_modules/@undefineds.co/ai-connections/dist/collection-runtime.d.ts +46 -0
  138. package/node_modules/@undefineds.co/ai-connections/dist/collection-runtime.js +231 -0
  139. package/node_modules/@undefineds.co/ai-connections/dist/collections.d.ts +119 -0
  140. package/node_modules/@undefineds.co/ai-connections/dist/collections.js +173 -0
  141. package/node_modules/@undefineds.co/ai-connections/dist/controller.d.ts +71 -5
  142. package/node_modules/@undefineds.co/ai-connections/dist/controller.js +285 -16
  143. package/node_modules/@undefineds.co/ai-connections/dist/credential-labels.d.ts +5 -0
  144. package/node_modules/@undefineds.co/ai-connections/dist/credential-labels.js +8 -3
  145. package/node_modules/@undefineds.co/ai-connections/dist/credential-storage.d.ts +59 -0
  146. package/node_modules/@undefineds.co/ai-connections/dist/credential-storage.js +131 -0
  147. package/node_modules/@undefineds.co/ai-connections/dist/endpoint-urls.d.ts +15 -0
  148. package/node_modules/@undefineds.co/ai-connections/dist/endpoint-urls.js +20 -0
  149. package/node_modules/@undefineds.co/ai-connections/dist/gateway-endpoints.d.ts +14 -0
  150. package/node_modules/@undefineds.co/ai-connections/dist/gateway-endpoints.js +20 -0
  151. package/node_modules/@undefineds.co/ai-connections/dist/index.d.ts +8 -0
  152. package/node_modules/@undefineds.co/ai-connections/dist/index.js +8 -0
  153. package/node_modules/@undefineds.co/ai-connections/dist/manifest.js +1 -1
  154. package/node_modules/@undefineds.co/ai-connections/dist/offering-endpoints.d.ts +14 -0
  155. package/node_modules/@undefineds.co/ai-connections/dist/offering-endpoints.js +17 -0
  156. package/node_modules/@undefineds.co/ai-connections/dist/provider-catalog.cjs +68 -1
  157. package/node_modules/@undefineds.co/ai-connections/dist/provider-catalog.d.ts +75 -1
  158. package/node_modules/@undefineds.co/ai-connections/dist/provider-catalog.js +119 -0
  159. package/node_modules/@undefineds.co/ai-connections/dist/provider-visuals.d.ts +5 -0
  160. package/node_modules/@undefineds.co/ai-connections/dist/provider-visuals.js +5 -0
  161. package/node_modules/@undefineds.co/ai-connections/dist/service-access.js +2 -27
  162. package/node_modules/@undefineds.co/ai-connections/package.json +1 -0
  163. package/node_modules/@undefineds.co/extension-sdk/dist/manifest.d.ts +1 -1
  164. package/node_modules/@undefineds.co/extension-sdk/dist/manifest.js +2 -0
  165. package/node_modules/@undefineds.co/extension-sdk/dist/web.d.ts +150 -0
  166. package/node_modules/@undefineds.co/extension-sdk/package.json +2 -1
  167. package/node_modules/@undefineds.co/models/README.md +1 -1
  168. package/node_modules/@undefineds.co/models/dist/ai-config/index.d.ts +3 -3
  169. package/node_modules/@undefineds.co/models/dist/ai-gateway.schema.d.ts +5 -0
  170. package/node_modules/@undefineds.co/models/dist/ai-gateway.schema.js +9 -0
  171. package/node_modules/@undefineds.co/models/dist/ai-runtime.repository.d.ts +1 -1
  172. package/node_modules/@undefineds.co/models/dist/approval.repository.d.ts +2 -2
  173. package/node_modules/@undefineds.co/models/dist/audit.presentation.d.ts +2 -2
  174. package/node_modules/@undefineds.co/models/dist/capture.repository.d.ts +1 -1
  175. package/node_modules/@undefineds.co/models/dist/chat-project.repository.d.ts +1 -1
  176. package/node_modules/@undefineds.co/models/dist/chat.repository.d.ts +2 -2
  177. package/node_modules/@undefineds.co/models/dist/control-request.repository.d.ts +2 -2
  178. package/node_modules/@undefineds.co/models/dist/conversation-share.repository.d.ts +1 -1
  179. package/node_modules/@undefineds.co/models/dist/credential.schema.d.ts +12 -0
  180. package/node_modules/@undefineds.co/models/dist/credential.schema.js +15 -1
  181. package/node_modules/@undefineds.co/models/dist/discovery/index.d.ts +2 -2
  182. package/node_modules/@undefineds.co/models/dist/discovery/providers.json +248 -7
  183. package/node_modules/@undefineds.co/models/dist/discovery/types.d.ts +31 -0
  184. package/node_modules/@undefineds.co/models/dist/extension/index.d.ts +1 -1
  185. package/node_modules/@undefineds.co/models/dist/favorite/index.d.ts +2 -2
  186. package/node_modules/@undefineds.co/models/dist/fixtures/contracts-chat-contact.d.ts +5 -5
  187. package/node_modules/@undefineds.co/models/dist/import/index.d.ts +1 -1
  188. package/node_modules/@undefineds.co/models/dist/index.d.ts +73 -73
  189. package/node_modules/@undefineds.co/models/dist/index.js +1 -1
  190. package/node_modules/@undefineds.co/models/dist/input-request.repository.d.ts +2 -2
  191. package/node_modules/@undefineds.co/models/dist/knowledge/index.d.ts +1 -1
  192. package/node_modules/@undefineds.co/models/dist/message.repository.d.ts +1 -1
  193. package/node_modules/@undefineds.co/models/dist/namespaces.js +5 -0
  194. package/node_modules/@undefineds.co/models/dist/pod-storage-descriptor.d.ts +4815 -26
  195. package/node_modules/@undefineds.co/models/dist/pod-storage-descriptor.js +482 -132
  196. package/node_modules/@undefineds.co/models/dist/schema.d.ts +4 -0
  197. package/node_modules/@undefineds.co/models/dist/session/index.d.ts +1 -1
  198. package/node_modules/@undefineds.co/models/dist/settings/index.d.ts +1 -1
  199. package/node_modules/@undefineds.co/models/dist/sidecar/persistence-mapping.d.ts +5 -5
  200. package/node_modules/@undefineds.co/models/dist/thread.repository.d.ts +2 -2
  201. package/node_modules/@undefineds.co/models/dist/types/message-block.d.ts +1 -1
  202. package/node_modules/@undefineds.co/models/dist/vocab/_namespaces.d.ts +1 -1
  203. package/node_modules/@undefineds.co/models/dist/vocab/index.d.ts +10 -10
  204. package/node_modules/@undefineds.co/models/dist/vocab/sidecar.vocab.d.ts +1 -0
  205. package/node_modules/@undefineds.co/models/dist/vocab/sidecar.vocab.js +1 -0
  206. package/node_modules/@undefineds.co/models/package.json +4 -2
  207. package/node_modules/@undefineds.co/pod-collections/README.md +71 -0
  208. package/node_modules/@undefineds.co/pod-collections/dist/diff.d.ts +85 -0
  209. package/node_modules/@undefineds.co/pod-collections/dist/diff.js +166 -0
  210. package/node_modules/@undefineds.co/pod-collections/dist/feed.d.ts +17 -0
  211. package/node_modules/@undefineds.co/pod-collections/dist/feed.js +27 -0
  212. package/node_modules/@undefineds.co/pod-collections/dist/index.cjs +1042 -0
  213. package/node_modules/@undefineds.co/pod-collections/dist/index.d.ts +37 -0
  214. package/node_modules/@undefineds.co/pod-collections/dist/index.js +89 -0
  215. package/node_modules/@undefineds.co/pod-collections/dist/layout.d.ts +75 -0
  216. package/node_modules/@undefineds.co/pod-collections/dist/layout.js +173 -0
  217. package/node_modules/@undefineds.co/pod-collections/dist/mapping.d.ts +78 -0
  218. package/node_modules/@undefineds.co/pod-collections/dist/mapping.js +287 -0
  219. package/node_modules/@undefineds.co/pod-collections/dist/mutations.d.ts +83 -0
  220. package/node_modules/@undefineds.co/pod-collections/dist/mutations.js +273 -0
  221. package/node_modules/@undefineds.co/pod-collections/dist/react.d.ts +21 -0
  222. package/node_modules/@undefineds.co/pod-collections/dist/react.js +22 -0
  223. package/node_modules/@undefineds.co/pod-collections/dist/read.d.ts +65 -0
  224. package/node_modules/@undefineds.co/pod-collections/dist/read.js +31 -0
  225. package/node_modules/@undefineds.co/pod-collections/dist/sync.d.ts +66 -0
  226. package/node_modules/@undefineds.co/pod-collections/dist/sync.js +260 -0
  227. package/node_modules/@undefineds.co/pod-collections/dist/types.d.ts +155 -0
  228. package/node_modules/@undefineds.co/pod-collections/dist/types.js +9 -0
  229. package/node_modules/@undefineds.co/pod-collections/package.json +42 -0
  230. package/package.json +15 -7
  231. package/static/app/assets/main.css +1 -1
  232. package/static/auth-callback/assets/AiConfigContext-DnQs1ZpW.js +1 -0
  233. package/static/auth-callback/assets/AiConfigPage-DOtvlxH0.js +1 -0
  234. package/static/auth-callback/assets/DocumentProcessingPanel-BS2voQgL.js +1 -0
  235. package/static/auth-callback/assets/IndexLifecyclePanel-Cvt0cJtN.js +1 -0
  236. package/static/auth-callback/assets/{IndexSubjectPanel-BbUqop4b.js → IndexSubjectPanel-Dhf01GqF.js} +1 -1
  237. package/static/auth-callback/assets/ModelAssignmentsPanel-BJutWaAF.js +1 -0
  238. package/static/auth-callback/assets/ModelsPage-BRS0sje3.js +11 -0
  239. package/static/auth-callback/assets/{NetworkPage-Vp2PrMxs.js → NetworkPage-B3qBfANA.js} +2 -2
  240. package/static/auth-callback/assets/{PaneListHeader-DY7baSFl.js → PaneListHeader-QQeJGTp4.js} +1 -1
  241. package/static/auth-callback/assets/SearchIndexingPanel-MyNUSEwT.js +1 -0
  242. package/static/auth-callback/assets/{StatusSubjectPanel-ArIS-TxT.js → StatusSubjectPanel-DQkEVsFs.js} +1 -1
  243. package/static/{settings/assets/StatusWorkspace-CoMFRXoV.js → auth-callback/assets/StatusWorkspace-Dkv63Uwk.js} +1 -1
  244. package/static/auth-callback/assets/{SystemSettingsPage-BDvT1NUz.js → SystemSettingsPage-TIsUfX5d.js} +1 -1
  245. package/static/{dashboard/assets/SystemSettingsSubjectPanel-WaE8mTQi.js → auth-callback/assets/SystemSettingsSubjectPanel-BJWEt2-7.js} +5 -5
  246. package/static/auth-callback/assets/XpodAiConnectionsPodStore-BJiXm-PF.js +3 -0
  247. package/static/auth-callback/assets/{activity-D1Dsfa_0.js → activity-5hNeNKnL.js} +1 -1
  248. package/static/auth-callback/assets/ai-connections-CryuHGKW.js +1 -0
  249. package/static/auth-callback/assets/{auth-callback-Cmf4hXVZ.js → auth-callback-CAFZ3R0B.js} +6 -6
  250. package/static/auth-callback/assets/auth-callback-rk080mvG.css +1 -0
  251. package/static/auth-callback/assets/{badge-CZsHq3Ih.js → badge-CAIPI0CB.js} +1 -1
  252. package/static/auth-callback/assets/collection-runtime-D9s7h9YA.js +1 -0
  253. package/static/auth-callback/assets/dialog-BjA109aX.js +1 -0
  254. package/static/auth-callback/assets/{download-DU9ntlHw.js → download-B3Up5W2G.js} +1 -1
  255. package/static/auth-callback/assets/{external-link-BfzaaZDx.js → external-link-BTXgSPzB.js} +1 -1
  256. package/static/auth-callback/assets/index-BppXlxcp.js +41 -0
  257. package/static/auth-callback/assets/index-CirW4CJf.js +1 -0
  258. package/static/auth-callback/assets/index-DlLYWOhw.js +4 -0
  259. package/static/auth-callback/assets/{index-browser-BNFqqC74.js → index-browser-DtU38ni3.js} +1 -1
  260. package/static/auth-callback/assets/{key-round-BwP3DBWo.js → key-round-CQCOrZ7x.js} +1 -1
  261. package/static/auth-callback/assets/layout-DB3pMyTl.js +1 -0
  262. package/static/auth-callback/assets/pod-collections-host-KnnGFZHL.js +8 -0
  263. package/static/auth-callback/assets/{rotate-ccw-VMwnmyab.js → rotate-ccw-C1zM2KtS.js} +1 -1
  264. package/static/auth-callback/assets/{skeleton-CoD55rBT.js → skeleton-Cqp7_M9-.js} +1 -1
  265. package/static/auth-callback/assets/{waypoints-DRo_1Ca7.js → waypoints-Bj6gAUSQ.js} +1 -1
  266. package/static/auth-callback/assets/{workspace-layout--mcXl3My.js → workspace-layout-DK8mDzrY.js} +1 -1
  267. package/static/auth-callback/auth-callback.html +2 -2
  268. package/static/dashboard/assets/AiConfigContext-BsE7MqX8.js +1 -0
  269. package/static/dashboard/assets/AiConfigPage-DvM-lRXa.js +1 -0
  270. package/static/dashboard/assets/DocumentProcessingPanel-BPfdlfuf.js +1 -0
  271. package/static/dashboard/assets/IndexLifecyclePanel--m0AGxvh.js +1 -0
  272. package/static/dashboard/assets/{IndexSubjectPanel-B2cXwl8X.js → IndexSubjectPanel-Bb7m1k3d.js} +1 -1
  273. package/static/dashboard/assets/ModelAssignmentsPanel-BLi_zbMa.js +1 -0
  274. package/static/dashboard/assets/ModelsPage-CxdpgnfR.js +11 -0
  275. package/static/dashboard/assets/{NetworkPage-DV2V0qWO.js → NetworkPage-BAIPw-D_.js} +2 -2
  276. package/static/dashboard/assets/{PaneListHeader-D0c1yCFH.js → PaneListHeader-BBCMei0r.js} +1 -1
  277. package/static/dashboard/assets/SearchIndexingPanel-Ck4Y-xjR.js +1 -0
  278. package/static/dashboard/assets/{StatusSubjectPanel-oPSECj7i.js → StatusSubjectPanel-D1KWfAXE.js} +1 -1
  279. package/static/dashboard/assets/{StatusWorkspace-PdovQPKa.js → StatusWorkspace-JbA5gzXx.js} +1 -1
  280. package/static/dashboard/assets/{SystemSettingsPage-CtNDklkx.js → SystemSettingsPage-BbwQWsSR.js} +1 -1
  281. package/static/{settings/assets/SystemSettingsSubjectPanel-DExjDo_v.js → dashboard/assets/SystemSettingsSubjectPanel-N117nMt5.js} +5 -5
  282. package/static/dashboard/assets/XpodAiConnectionsPodStore-CdDOb4SV.js +18 -0
  283. package/static/dashboard/assets/{activity-B9ylSoyr.js → activity-DX1I96o_.js} +1 -1
  284. package/static/dashboard/assets/ai-connections-DwCRqOQa.js +1 -0
  285. package/static/dashboard/assets/{badge-BNbFbpIb.js → badge-k2vhtDqH.js} +1 -1
  286. package/static/dashboard/assets/collection-runtime-BFQ8teQJ.js +1 -0
  287. package/static/dashboard/assets/{dashboard-CD-FFVRD.js → dashboard-DWZ-fmCT.js} +4 -4
  288. package/static/dashboard/assets/dashboard-rk080mvG.css +1 -0
  289. package/static/dashboard/assets/dialog-1CCw-iHT.js +1 -0
  290. package/static/dashboard/assets/{download-nOP38LtW.js → download-C6-SNY1q.js} +1 -1
  291. package/static/dashboard/assets/{external-link-Bh2ewN9E.js → external-link-BgPcZ_j2.js} +1 -1
  292. package/static/dashboard/assets/index-6LcIUIYO.js +1 -0
  293. package/static/dashboard/assets/index-D7A8U6Pt.js +41 -0
  294. package/static/dashboard/assets/index-UD6QOE7H.js +4 -0
  295. package/static/dashboard/assets/{key-round-bGmguBLv.js → key-round-BOd7Jo0Q.js} +1 -1
  296. package/static/dashboard/assets/layout-DB3pMyTl.js +1 -0
  297. package/static/dashboard/assets/pod-collections-host-KnnGFZHL.js +8 -0
  298. package/static/dashboard/assets/{rotate-ccw-D2x__ODW.js → rotate-ccw-CCgJqsvx.js} +1 -1
  299. package/static/dashboard/assets/{skeleton-VOqft8WS.js → skeleton-Bc7abAn5.js} +1 -1
  300. package/static/dashboard/assets/{waypoints-fgRqm4oH.js → waypoints-s-opmJxx.js} +1 -1
  301. package/static/dashboard/assets/{workspace-layout-DV4dgeHX.js → workspace-layout-DqIQeTBV.js} +1 -1
  302. package/static/dashboard/dashboard.html +2 -2
  303. package/static/settings/assets/AiConfigContext-BB9KZySa.js +1 -0
  304. package/static/settings/assets/AiConfigPage-DGSXUkLs.js +1 -0
  305. package/static/settings/assets/DocumentProcessingPanel-Da2Re6Rg.js +1 -0
  306. package/static/settings/assets/IndexLifecyclePanel-BSZuIzgr.js +1 -0
  307. package/static/settings/assets/{IndexSubjectPanel-BgbI9c-a.js → IndexSubjectPanel-CFd0ay-r.js} +1 -1
  308. package/static/settings/assets/ModelAssignmentsPanel-CSAryvWJ.js +1 -0
  309. package/static/settings/assets/ModelsPage-BQwCwLHU.js +11 -0
  310. package/static/settings/assets/{NetworkPage-C8OA9Mtp.js → NetworkPage-BKymvsQc.js} +2 -2
  311. package/static/settings/assets/{PaneListHeader-COvlPJWj.js → PaneListHeader-Bjh3hRdQ.js} +1 -1
  312. package/static/settings/assets/SearchIndexingPanel-MjKL5QLU.js +1 -0
  313. package/static/settings/assets/{StatusSubjectPanel-BuLml7qn.js → StatusSubjectPanel-Bvl6K4mx.js} +1 -1
  314. package/static/settings/assets/StatusWorkspace-B0NzrP--.js +1 -0
  315. package/static/settings/assets/{SystemSettingsPage-DlzmaWV-.js → SystemSettingsPage-D2z6Z4FE.js} +1 -1
  316. package/static/{auth-callback/assets/SystemSettingsSubjectPanel-CDqRuC4t.js → settings/assets/SystemSettingsSubjectPanel-4sxma4X4.js} +5 -5
  317. package/static/settings/assets/XpodAiConnectionsPodStore-BkNQ8fZx.js +3 -0
  318. package/static/settings/assets/{activity-TLerXgMs.js → activity-CgJJGpjx.js} +1 -1
  319. package/static/settings/assets/ai-connections-CryuHGKW.js +1 -0
  320. package/static/settings/assets/{badge-Bcs8iWrH.js → badge-C4NypVyT.js} +1 -1
  321. package/static/settings/assets/collection-runtime-CTLCDxAi.js +1 -0
  322. package/static/settings/assets/dialog-Csq0vWUi.js +1 -0
  323. package/static/settings/assets/{download-Ct3QmHPt.js → download-DaLJJ-Wp.js} +1 -1
  324. package/static/settings/assets/{external-link-C8KiHbss.js → external-link--w_iW5Au.js} +1 -1
  325. package/static/settings/assets/index-B0mQa59b.js +4 -0
  326. package/static/settings/assets/index-BukHiu4y.js +1 -0
  327. package/static/settings/assets/index-COmVnZi2.js +41 -0
  328. package/static/settings/assets/{index-browser-CazX1pc2.js → index-browser-BGpvHwD0.js} +1 -1
  329. package/static/settings/assets/{key-round-B19YD1GA.js → key-round-Bk4YRjBu.js} +1 -1
  330. package/static/settings/assets/layout-DB3pMyTl.js +1 -0
  331. package/static/settings/assets/pod-collections-host-KnnGFZHL.js +8 -0
  332. package/static/settings/assets/{rotate-ccw-AQm2kMgU.js → rotate-ccw-TCabbqsr.js} +1 -1
  333. package/static/settings/assets/{settings-C-VBtt9r.js → settings-CJWpdbNC.js} +5 -5
  334. package/static/settings/assets/settings-rk080mvG.css +1 -0
  335. package/static/settings/assets/{skeleton-DyZ1OBYf.js → skeleton-JDHYVe7t.js} +1 -1
  336. package/static/settings/assets/{waypoints-CC3wq-SU.js → waypoints-DDvEl-MU.js} +1 -1
  337. package/static/settings/assets/{workspace-layout-BxXNKgf9.js → workspace-layout-DV5QU30U.js} +1 -1
  338. package/static/settings/settings.html +2 -2
  339. package/static/auth-callback/assets/AiConfigContext-DqWRSm7n.js +0 -1
  340. package/static/auth-callback/assets/AiConfigPage-C5YYyvzl.js +0 -1
  341. package/static/auth-callback/assets/DocumentProcessingPanel-DZCiacBz.js +0 -1
  342. package/static/auth-callback/assets/IndexLifecyclePanel-CCLeOljB.js +0 -1
  343. package/static/auth-callback/assets/ModelAssignmentsPanel-jUUTDKuh.js +0 -1
  344. package/static/auth-callback/assets/ModelsPage-B08zdtff.js +0 -10
  345. package/static/auth-callback/assets/SearchIndexingPanel-D4YRg1-8.js +0 -1
  346. package/static/auth-callback/assets/StatusWorkspace-Cp5LQ9Yx.js +0 -1
  347. package/static/auth-callback/assets/ai-connections-CHNTKemd.js +0 -1
  348. package/static/auth-callback/assets/auth-callback-DWMMiFjh.css +0 -1
  349. package/static/auth-callback/assets/index-DSNnLUbU.js +0 -4
  350. package/static/auth-callback/assets/index-FHhHoKgp.js +0 -41
  351. package/static/dashboard/assets/AiConfigContext-BpPDKSzI.js +0 -1
  352. package/static/dashboard/assets/AiConfigPage-wsqEZDIX.js +0 -1
  353. package/static/dashboard/assets/DocumentProcessingPanel-CDSy3juc.js +0 -1
  354. package/static/dashboard/assets/IndexLifecyclePanel-CVd6vQCX.js +0 -1
  355. package/static/dashboard/assets/ModelAssignmentsPanel-BeBZhnQd.js +0 -1
  356. package/static/dashboard/assets/ModelsPage-B6McSCJw.js +0 -25
  357. package/static/dashboard/assets/SearchIndexingPanel-CGs0OZ12.js +0 -1
  358. package/static/dashboard/assets/ai-connections-CHNTKemd.js +0 -1
  359. package/static/dashboard/assets/dashboard-DWMMiFjh.css +0 -1
  360. package/static/dashboard/assets/index-PgS-Bt7X.js +0 -41
  361. package/static/dashboard/assets/index-QN2QgEwr.js +0 -4
  362. package/static/settings/assets/AiConfigContext-zKQYdfai.js +0 -1
  363. package/static/settings/assets/AiConfigPage-Bs1EE3Ei.js +0 -1
  364. package/static/settings/assets/DocumentProcessingPanel-CSFfdOXS.js +0 -1
  365. package/static/settings/assets/IndexLifecyclePanel-BR9Su49B.js +0 -1
  366. package/static/settings/assets/ModelAssignmentsPanel-C0BE7nbk.js +0 -1
  367. package/static/settings/assets/ModelsPage-CU-YQ8_7.js +0 -10
  368. package/static/settings/assets/SearchIndexingPanel-Bdd46mIV.js +0 -1
  369. package/static/settings/assets/ai-connections-CHNTKemd.js +0 -1
  370. package/static/settings/assets/index-1Q2cRjZd.js +0 -41
  371. package/static/settings/assets/index-DBO_Vq0P.js +0 -4
  372. package/static/settings/assets/settings-DWMMiFjh.css +0 -1
@@ -19,7 +19,7 @@ const ALLOWED_METHODS = ['GET', 'POST', 'OPTIONS'];
19
19
  const MODEL_COLLECTION_SUFFIX = '/settings/providers/-/sparql';
20
20
  const SETTINGS_COLLECTION_SUFFIX = '/settings/-/sparql';
21
21
  class SubgraphSparqlHttpHandler extends community_server_1.HttpHandler {
22
- constructor(queryEngine, credentialsExtractor, permissionReader, authorizer, options = {}, updateAuthority) {
22
+ constructor(queryEngine, credentialsExtractor, permissionReader, authorizer, options = {}, updateAuthority, emitter) {
23
23
  super();
24
24
  this.logger = (0, global_logger_factory_1.getLoggerFor)(this);
25
25
  this.generator = new sparqljs_1.Generator();
@@ -30,6 +30,7 @@ class SubgraphSparqlHttpHandler extends community_server_1.HttpHandler {
30
30
  this.sidecarPath = options.sidecarPath ?? '/-/sparql';
31
31
  this.defaultBandwidthLimit = this.normalizeLimit(options.defaultAccountBandwidthLimitBps);
32
32
  this.updateAuthority = updateAuthority;
33
+ this.emitter = emitter;
33
34
  // Identity DB is used for pod lookup (to resolve accountId/podId from URL)
34
35
  if (options.identityDbUrl) {
35
36
  const db = (0, db_1.getIdentityDatabase)(options.identityDbUrl);
@@ -335,6 +336,13 @@ class SubgraphSparqlHttpHandler extends community_server_1.HttpHandler {
335
336
  : this.rewriteDefaultGraphUpdates(parsed, queryRequest.baseUrl);
336
337
  this.logger.verbose(`[SubgraphSPARQL] Rewritten Query: ${rewritten}`);
337
338
  const skippedSilentAuthorityLoad = Boolean(this.updateAuthority && loadDocumentPlan?.silent && !nativeOptions?.loadDocument);
339
+ // A LOAD that resolved to an empty document rewrites to `INSERT DATA { GRAPH <g> { } }`,
340
+ // which cannot create or change anything, so it must not notify either.
341
+ const emptyAuthorityLoad = Boolean(this.updateAuthority && loadDocumentPlan && nativeOptions?.loadDocument?.body.trim().length === 0);
342
+ const emitActivities = Boolean(this.emitter) && !emptyAuthorityLoad;
343
+ // Existence has to be captured before the write because the activity term depends on it
344
+ // (`Create` for a document the update brings into existence, `Update` otherwise).
345
+ const pendingActivities = emitActivities ? await this.resolvePendingActivities(accessPlan) : [];
338
346
  if (!skippedSilentAuthorityLoad) {
339
347
  if (this.updateAuthority) {
340
348
  await this.updateAuthority.executeSparqlUpdate(rewritten, queryRequest.baseUrl, readAccessScope);
@@ -342,12 +350,115 @@ class SubgraphSparqlHttpHandler extends community_server_1.HttpHandler {
342
350
  else {
343
351
  await this.engine.queryVoid(rewritten, queryRequest.baseUrl, readAccessScope, nativeOptions);
344
352
  }
353
+ // Only a successful write notifies; a throwing write skips this line entirely.
354
+ this.emitActivities(pendingActivities);
345
355
  }
346
356
  await this.refreshUsage(queryRequest.baseUrl);
347
357
  response.statusCode = 204;
348
358
  response.setHeader('Cache-Control', 'no-store');
349
359
  response.end();
350
360
  }
361
+ /**
362
+ * Turns the write targets of an update access plan into the activities that should be emitted.
363
+ *
364
+ * Only documents actually written by the update (the plan's `writeTargets`) are considered:
365
+ * one activity per document, never per quad and never for an untouched resource.
366
+ */
367
+ async resolvePendingActivities(plan) {
368
+ const pending = [];
369
+ for (const [graph, effect] of plan.targetEffects) {
370
+ const documentUrl = this.resourceUrlForGraphValue(graph);
371
+ const existedBefore = await this.documentExistedBefore(documentUrl);
372
+ const activity = this.resolveActivity(effect, existedBefore);
373
+ if (activity) {
374
+ pending.push({ identifier: { path: documentUrl }, activity });
375
+ }
376
+ }
377
+ return pending;
378
+ }
379
+ /**
380
+ * Maps the SPARQL update operation applied to one document to the ActivityStream term the
381
+ * CSS notification generators understand (`MonitoringStore` only forwards `as:Add|Create|Delete|Remove|Update`).
382
+ *
383
+ * Mapping (the closest faithful term for each operation):
384
+ * - `CREATE [SILENT] GRAPH` -> `as:Create` when the document did not exist yet;
385
+ * a `CREATE` on an existing graph is a silent no-op -> nothing.
386
+ * - `INSERT DATA` / `INSERT … WHERE` / `LOAD` /
387
+ * `ADD` / `COPY` target -> `as:Create` when the document did not exist yet, else `as:Update`
388
+ * (same `exists ? Update : Create` rule CSS uses for PUT).
389
+ * - `DELETE DATA` / `DELETE WHERE` /
390
+ * `INSERT … DELETE … WHERE` -> `as:Update` (partial removal; the document itself survives).
391
+ * - `CLEAR GRAPH` / `DROP GRAPH` / `MOVE` source -> `as:Update`: every triple is gone, but
392
+ `MixDataAccessor.executeSparqlUpdate` rewrites the graph into an *empty* document instead of
393
+ removing the resource, so a re-read returns 200-empty rather than 404. That observable result
394
+ equals a `DELETE DATA` which removes every triple, which maps to `Update`. `as:Delete` is
395
+ therefore deliberately unused: it becomes correct only once an accessor actually removes the
396
+ document (a re-read would then be 404).
397
+ * - delete-only update on a missing document -> nothing (SPARQL no-op).
398
+ * - `as:Add` / `as:Remove` are deliberately not used: those describe container membership changes
399
+ * (`DataAccessorBasedStore.addContainerActivity`), and the sidecar writes document graphs only.
400
+ */
401
+ resolveActivity(effect, existedBefore) {
402
+ if (effect.createdGraph) {
403
+ return existedBefore === true ? undefined : community_server_2.AS.terms.Create;
404
+ }
405
+ if (!effect.addedData && existedBefore === false) {
406
+ // DELETE/CLEAR/DROP against a document that does not exist changes nothing.
407
+ return undefined;
408
+ }
409
+ if (!effect.addedData && effect.removedAllData) {
410
+ // CLEAR/DROP/MOVE-source: the document survives as an empty document, so this is an update.
411
+ return community_server_2.AS.terms.Update;
412
+ }
413
+ if (existedBefore === false) {
414
+ return community_server_2.AS.terms.Create;
415
+ }
416
+ return community_server_2.AS.terms.Update;
417
+ }
418
+ /**
419
+ * Checks whether the document already exists before the update is applied.
420
+ *
421
+ * Uses the same accessor that performs the write, so the answer describes the storage the
422
+ * activity is about. Returns `undefined` when the answer cannot be determined; callers then
423
+ * fall back to the conservative `Update`/`Delete` terms instead of `Create`.
424
+ */
425
+ async documentExistedBefore(documentUrl) {
426
+ if (!this.updateAuthority) {
427
+ return undefined;
428
+ }
429
+ try {
430
+ await this.updateAuthority.getMetadata({ path: documentUrl });
431
+ return true;
432
+ }
433
+ catch (error) {
434
+ if (community_server_2.NotFoundHttpError.isInstance(error)) {
435
+ return false;
436
+ }
437
+ this.logger.debug(`Could not determine pre-update existence of ${documentUrl}: ${error instanceof Error ? error.message : String(error)}`);
438
+ return undefined;
439
+ }
440
+ }
441
+ /**
442
+ * Emits the resolved activities on the injected {@link ActivityEmitter}.
443
+ *
444
+ * Mirrors `MonitoringStore.emitChanged`
445
+ * (node_modules/@solid/community-server/dist/storage/MonitoringStore.js:36-45): for every changed resource
446
+ * one `changed` event plus the ActivityStream-typed event, with the same metadata shape
447
+ * `DataAccessorBasedStore.addActivityMetadata` produces (an `urn:npm:solid:community-server:activity:` quad).
448
+ * `ListeningActivityHandler` (dist/server/notifications/ListeningActivityHandler.js:25) subscribes to `changed`
449
+ * and derives the notification state by re-reading the store, so no ETag has to be carried here.
450
+ */
451
+ emitActivities(activities) {
452
+ if (!this.emitter || activities.length === 0) {
453
+ return;
454
+ }
455
+ for (const { identifier, activity } of activities) {
456
+ const metadata = new community_server_2.RepresentationMetadata(identifier, { [community_server_2.SOLID_AS.activity]: activity });
457
+ this.emitter.emit('changed', identifier, activity, metadata);
458
+ this.emitter.emit(activity.value, identifier, metadata);
459
+ this.logger.debug(`[SubgraphSPARQL] Emitted ${activity.value} activity for ${identifier.path}`);
460
+ }
461
+ }
351
462
  async sendPayload(response, payload, contentType, context, statusCode = 200) {
352
463
  const buffer = typeof payload === 'string' ? Buffer.from(payload, 'utf8') : payload;
353
464
  const limit = context ? await this.resolveBandwidthLimit(context) : undefined;
@@ -514,6 +625,7 @@ class SubgraphSparqlHttpHandler extends community_server_1.HttpHandler {
514
625
  needsReadScope: false,
515
626
  readTargets: new Set(),
516
627
  writeTargets: new Map(),
628
+ targetEffects: new Map(),
517
629
  loadDocuments: [],
518
630
  clearGraphs: [],
519
631
  graphCopies: [],
@@ -533,7 +645,7 @@ class SubgraphSparqlHttpHandler extends community_server_1.HttpHandler {
533
645
  ? this.assertGraphTermInScope(operation.destination, basePath)
534
646
  : basePath;
535
647
  plan.readTargets.add(sourceUri);
536
- this.addWriteTarget(plan, targetGraph ?? basePath, [policy_engine_1.PERMISSIONS.Append]);
648
+ this.addWriteTarget(plan, targetGraph ?? basePath, [policy_engine_1.PERMISSIONS.Append], { addedData: true });
537
649
  plan.loadDocuments.push({
538
650
  sourceUri,
539
651
  targetGraph: targetGraph ?? basePath,
@@ -548,7 +660,7 @@ class SubgraphSparqlHttpHandler extends community_server_1.HttpHandler {
548
660
  plan.hasDelete = true;
549
661
  plan.needsReadScope = true;
550
662
  const graph = this.assertGraphInScope(operation.graph, basePath) ?? basePath;
551
- this.addWriteTarget(plan, graph, [policy_engine_1.PERMISSIONS.Delete]);
663
+ this.addWriteTarget(plan, graph, [policy_engine_1.PERMISSIONS.Delete], { removedAllData: true });
552
664
  plan.clearGraphs.push(graph);
553
665
  continue;
554
666
  }
@@ -561,17 +673,23 @@ class SubgraphSparqlHttpHandler extends community_server_1.HttpHandler {
561
673
  plan.hasInsert = true;
562
674
  plan.needsReadScope = true;
563
675
  plan.readTargets.add(sourceGraph);
676
+ // A self copy/add/move is reduced by `rewriteGraphCopyUpdate` to `CREATE SILENT GRAPH <targetGraph>`,
677
+ // so such a target is only (possibly) created and never cleared or re-filled.
678
+ const selfCopy = sourceGraph === targetGraph;
679
+ const targetEffect = selfCopy
680
+ ? { createdGraph: true }
681
+ : { removedAllData: true, addedData: true };
564
682
  if (operation.type === 'add') {
565
- this.addWriteTarget(plan, targetGraph, [policy_engine_1.PERMISSIONS.Append]);
683
+ this.addWriteTarget(plan, targetGraph, [policy_engine_1.PERMISSIONS.Append], selfCopy ? targetEffect : { addedData: true });
566
684
  }
567
685
  else if (operation.type === 'copy') {
568
686
  plan.hasDelete = true;
569
- this.addWriteTarget(plan, targetGraph, [policy_engine_1.PERMISSIONS.Delete, policy_engine_1.PERMISSIONS.Append]);
687
+ this.addWriteTarget(plan, targetGraph, [policy_engine_1.PERMISSIONS.Delete, policy_engine_1.PERMISSIONS.Append], targetEffect);
570
688
  }
571
689
  else {
572
690
  plan.hasDelete = true;
573
- this.addWriteTarget(plan, targetGraph, [policy_engine_1.PERMISSIONS.Delete, policy_engine_1.PERMISSIONS.Append]);
574
- this.addWriteTarget(plan, sourceGraph, [policy_engine_1.PERMISSIONS.Delete]);
691
+ this.addWriteTarget(plan, targetGraph, [policy_engine_1.PERMISSIONS.Delete, policy_engine_1.PERMISSIONS.Append], targetEffect);
692
+ this.addWriteTarget(plan, sourceGraph, [policy_engine_1.PERMISSIONS.Delete], selfCopy ? {} : { removedAllData: true });
575
693
  }
576
694
  plan.graphCopies.push({ operation: operation.type, sourceGraph, targetGraph });
577
695
  continue;
@@ -579,7 +697,7 @@ class SubgraphSparqlHttpHandler extends community_server_1.HttpHandler {
579
697
  if (this.isCreateGraphOperation(operation)) {
580
698
  plan.hasInsert = true;
581
699
  const graph = this.assertGraphInScope(operation.graph, basePath) ?? basePath;
582
- this.addWriteTarget(plan, graph, [policy_engine_1.PERMISSIONS.Append]);
700
+ this.addWriteTarget(plan, graph, [policy_engine_1.PERMISSIONS.Append], { createdGraph: true });
583
701
  continue;
584
702
  }
585
703
  if (!this.isInsertDeleteOperation(operation)) {
@@ -600,7 +718,7 @@ class SubgraphSparqlHttpHandler extends community_server_1.HttpHandler {
600
718
  this.assertGraphInScope(operation.graph, basePath);
601
719
  }
602
720
  if (operation.updateType === 'insert' || operation.updateType === 'insertdelete') {
603
- this.inspectQuads(operation.insert ?? [], basePath, defaultGraph, plan, [policy_engine_1.PERMISSIONS.Append]);
721
+ this.inspectQuads(operation.insert ?? [], basePath, defaultGraph, plan, [policy_engine_1.PERMISSIONS.Append], { addedData: true });
604
722
  }
605
723
  if (operation.updateType === 'delete' || operation.updateType === 'insertdelete' || operation.updateType === 'deletewhere') {
606
724
  this.inspectQuads(operation.delete ?? [], basePath, defaultGraph, plan, [policy_engine_1.PERMISSIONS.Delete]);
@@ -622,16 +740,16 @@ class SubgraphSparqlHttpHandler extends community_server_1.HttpHandler {
622
740
  }
623
741
  return plan;
624
742
  }
625
- inspectQuads(quads, basePath, defaultGraph, plan, modes) {
743
+ inspectQuads(quads, basePath, defaultGraph, plan, modes, effect = {}) {
626
744
  for (const quad of quads) {
627
745
  if (quad.type === 'graph') {
628
746
  const graph = this.assertGraphTermInScope(quad.name, basePath);
629
747
  if (graph) {
630
- this.addWriteTarget(plan, graph, modes);
748
+ this.addWriteTarget(plan, graph, modes, effect);
631
749
  }
632
750
  }
633
751
  else {
634
- this.addWriteTarget(plan, defaultGraph, modes);
752
+ this.addWriteTarget(plan, defaultGraph, modes, effect);
635
753
  }
636
754
  }
637
755
  }
@@ -681,12 +799,26 @@ class SubgraphSparqlHttpHandler extends community_server_1.HttpHandler {
681
799
  }
682
800
  throw new community_server_2.BadRequestHttpError('Unsupported graph target in SPARQL update.');
683
801
  }
684
- addWriteTarget(plan, graph, modes) {
802
+ /**
803
+ * Registers a graph as written by the update and records which kind of change applies to it.
804
+ *
805
+ * Several operations can target the same graph in one request; the flags are accumulated so the graph
806
+ * still yields at most one activity. This is also the only place write targets are created, which keeps
807
+ * notification coverage tied to the same plan that drives authorization.
808
+ */
809
+ addWriteTarget(plan, graph, modes, effect = {}) {
685
810
  const existing = plan.writeTargets.get(graph) ?? new Set();
686
811
  for (const mode of modes) {
687
812
  existing.add(mode);
688
813
  }
689
814
  plan.writeTargets.set(graph, existing);
815
+ const merged = plan.targetEffects.get(graph) ?? { addedData: false, removedAllData: false, createdGraph: false };
816
+ for (const key of Object.keys(effect)) {
817
+ if (effect[key]) {
818
+ merged[key] = true;
819
+ }
820
+ }
821
+ plan.targetEffects.set(graph, merged);
690
822
  }
691
823
  async readLoadDocument(plan, basePath, accessScope) {
692
824
  const quads = await this.engine.constructGraph(plan.sourceUri, basePath, accessScope);
@@ -25,6 +25,20 @@
25
25
  ]
26
26
  }
27
27
  },
28
+ {
29
+ "@id": "undefineds:dist/http/SubgraphSparqlHttpHandler.jsonld#SubgraphSparqlHttpHandler_emitter",
30
+ "range": {
31
+ "@type": "ParameterRangeUnion",
32
+ "parameterRangeElements": [
33
+ {
34
+ "@type": "ParameterRangeWildcard"
35
+ },
36
+ {
37
+ "@type": "ParameterRangeUndefined"
38
+ }
39
+ ]
40
+ }
41
+ },
28
42
  {
29
43
  "@id": "undefineds:dist/http/SubgraphSparqlHttpHandler.jsonld#SubgraphSparqlHttpHandler_queryEngine",
30
44
  "range": "undefineds:dist/storage/sparql/SubgraphQueryEngine.jsonld#SubgraphQueryEngine"
@@ -162,6 +176,10 @@
162
176
  "@id": "undefineds:dist/http/SubgraphSparqlHttpHandler.jsonld#SubgraphSparqlHttpHandler__member_updateAuthority",
163
177
  "memberFieldName": "updateAuthority"
164
178
  },
179
+ {
180
+ "@id": "undefineds:dist/http/SubgraphSparqlHttpHandler.jsonld#SubgraphSparqlHttpHandler__member_emitter",
181
+ "memberFieldName": "emitter"
182
+ },
165
183
  {
166
184
  "@id": "undefineds:dist/http/SubgraphSparqlHttpHandler.jsonld#SubgraphSparqlHttpHandler__member_generator",
167
185
  "memberFieldName": "generator"
@@ -214,6 +232,22 @@
214
232
  "@id": "undefineds:dist/http/SubgraphSparqlHttpHandler.jsonld#SubgraphSparqlHttpHandler__member_executeUpdate",
215
233
  "memberFieldName": "executeUpdate"
216
234
  },
235
+ {
236
+ "@id": "undefineds:dist/http/SubgraphSparqlHttpHandler.jsonld#SubgraphSparqlHttpHandler__member_resolvePendingActivities",
237
+ "memberFieldName": "resolvePendingActivities"
238
+ },
239
+ {
240
+ "@id": "undefineds:dist/http/SubgraphSparqlHttpHandler.jsonld#SubgraphSparqlHttpHandler__member_resolveActivity",
241
+ "memberFieldName": "resolveActivity"
242
+ },
243
+ {
244
+ "@id": "undefineds:dist/http/SubgraphSparqlHttpHandler.jsonld#SubgraphSparqlHttpHandler__member_documentExistedBefore",
245
+ "memberFieldName": "documentExistedBefore"
246
+ },
247
+ {
248
+ "@id": "undefineds:dist/http/SubgraphSparqlHttpHandler.jsonld#SubgraphSparqlHttpHandler__member_emitActivities",
249
+ "memberFieldName": "emitActivities"
250
+ },
217
251
  {
218
252
  "@id": "undefineds:dist/http/SubgraphSparqlHttpHandler.jsonld#SubgraphSparqlHttpHandler__member_sendPayload",
219
253
  "memberFieldName": "sendPayload"
@@ -459,6 +493,9 @@
459
493
  },
460
494
  {
461
495
  "@id": "undefineds:dist/http/SubgraphSparqlHttpHandler.jsonld#SubgraphSparqlHttpHandler_updateAuthority"
496
+ },
497
+ {
498
+ "@id": "undefineds:dist/http/SubgraphSparqlHttpHandler.jsonld#SubgraphSparqlHttpHandler_emitter"
462
499
  }
463
500
  ]
464
501
  }
@@ -153,18 +153,6 @@ export declare class EdgeNodeRepository {
153
153
  * Remove a center node from the cluster.
154
154
  */
155
155
  removeCenterNode(nodeId: string): Promise<boolean>;
156
- /**
157
- * List nodes owned by a specific account
158
- */
159
- listNodesByAccount(accountId: string): Promise<Array<{
160
- nodeId: string;
161
- displayName?: string;
162
- capabilities: Record<string, unknown> | null;
163
- stringCapabilities: string[] | null;
164
- accessMode: string | null;
165
- lastSeen: Date | null;
166
- connectivityStatus: string | null;
167
- }>>;
168
156
  /**
169
157
  * Delete a node
170
158
  */
@@ -39,7 +39,7 @@ class EdgeNodeRepository {
39
39
  createdAt: createdAt?.toISOString(),
40
40
  updatedAt: updatedAt?.toISOString(),
41
41
  lastSeen: lastSeen?.toISOString(),
42
- metadata: typeof row.metadata === 'string' ? JSON.parse(row.metadata) : (row.metadata ?? null),
42
+ metadata: parseJsonRecord(row.metadata),
43
43
  };
44
44
  });
45
45
  }
@@ -77,7 +77,7 @@ class EdgeNodeRepository {
77
77
  displayName: row.display_name == null ? undefined : String(row.display_name),
78
78
  tokenHash: String(row.token_hash ?? ''),
79
79
  nodeType: (['center', 'edge', 'sp'].includes(row.node_type) ? row.node_type : 'edge'),
80
- metadata: typeof row.metadata === 'string' ? JSON.parse(row.metadata) : (row.metadata ?? null),
80
+ metadata: parseJsonRecord(row.metadata),
81
81
  };
82
82
  }
83
83
  async updateNodeHeartbeat(nodeId, metadata, timestamp) {
@@ -166,7 +166,7 @@ class EdgeNodeRepository {
166
166
  const row = result.rows[0];
167
167
  return {
168
168
  nodeId: String(row.id),
169
- metadata: typeof row.metadata === 'string' ? JSON.parse(row.metadata) : (row.metadata ?? null),
169
+ metadata: parseJsonRecord(row.metadata),
170
170
  lastSeen: (0, db_1.fromDbTimestamp)(row.last_seen),
171
171
  };
172
172
  }
@@ -327,7 +327,7 @@ class EdgeNodeRepository {
327
327
  await this.ready;
328
328
  const token = (0, node_crypto_1.randomBytes)(32).toString('base64url');
329
329
  const tokenHash = (0, node_crypto_1.createHash)('sha256').update(token).digest('hex');
330
- const now = Math.floor(Date.now() / 1000); // Unix timestamp for SQLite compatibility
330
+ const now = (0, db_1.toDbTimestamp)(this.db, new Date());
331
331
  // Use upsert pattern: INSERT ... ON CONFLICT UPDATE
332
332
  await (0, db_1.executeStatement)(this.db, (0, drizzle_orm_1.sql) `
333
333
  INSERT INTO cluster_node (
@@ -352,7 +352,7 @@ class EdgeNodeRepository {
352
352
  */
353
353
  async updateCenterNodeHeartbeat(nodeId, internalIp, internalPort, timestamp) {
354
354
  await this.ready;
355
- const ts = Math.floor(timestamp.getTime() / 1000); // Unix timestamp for SQLite compatibility
355
+ const ts = (0, db_1.toDbTimestamp)(this.db, timestamp);
356
356
  await (0, db_1.executeStatement)(this.db, (0, drizzle_orm_1.sql) `
357
357
  UPDATE cluster_node
358
358
  SET internal_ip = ${internalIp},
@@ -457,14 +457,6 @@ class EdgeNodeRepository {
457
457
  return true;
458
458
  }
459
459
  // ============ Account-based Node Methods ============
460
- /**
461
- * List nodes owned by a specific account
462
- */
463
- async listNodesByAccount(accountId) {
464
- await this.ready;
465
- void accountId;
466
- return [];
467
- }
468
460
  /**
469
461
  * Delete a node
470
462
  */
package/dist/index.d.ts CHANGED
@@ -5,6 +5,7 @@ import { SolidRdfDataAccessor } from './storage/accessors/SolidRdfDataAccessor';
5
5
  import { MixDataAccessor } from './storage/accessors/MixDataAccessor';
6
6
  export type { LocalRdfAuthorityJournal, LocalRdfIndexAccessor, } from './storage/accessors/MixDataAccessor';
7
7
  import { ConfigurableLoggerFactory } from './logging/ConfigurableLoggerFactory';
8
+ import { LOG_FILE_PATTERN, resolveCurrentLogFile, resolveLogFilePattern } from './logging/log-file';
8
9
  import { SubgraphQueryEngine } from './storage/sparql/SubgraphQueryEngine';
9
10
  export type { SparqlEngine } from './storage/sparql/SubgraphQueryEngine';
10
11
  export type { RdfEngineLike, RdfEngineStorageStats, RdfDerivedIndexRefreshResult, RdfIndexStats, RdfIndexSpaceObject, RdfIndexMetrics, RdfIndexPutOptions, RdfPatternQuery, RdfQuadIndexOptions, RdfQuadIndexScanResult, RdfTextIndexLike, RdfTextIndexOptions, RdfTextIndexSyncLike, RdfVectorIndexLike, RdfVectorIndexOptions, RdfVectorIndexSyncLike, RdfShadowBackfillOptions, RdfShadowBackfillResult, RdfShadowDiff, RdfShadowScanResult, RdfSourceInput, RdfSourceScope, } from './storage/rdf/types';
@@ -124,6 +125,6 @@ export type { OwnedWebIdEntry, PodOwnershipResolver, PodOwnershipTarget, CssPodO
124
125
  export type { TunnelProvider, TunnelConfig, TunnelSetupOptions, TunnelStatus, } from './tunnel/TunnelProvider';
125
126
  export type { SubdomainRegistration, ConnectivityResult, SubdomainServiceOptions, } from './subdomain/SubdomainService';
126
127
  export { AppStaticAssetHandler } from './http/AppStaticAssetHandler';
127
- export { RepresentationPartialConvertingStore, MinioDataAccessor, SolidRdfDataAccessor, MixDataAccessor, ConfigurableLoggerFactory, SparqlUpdateResourceStore, SubgraphQueryEngine, SubgraphSparqlHttpHandler, InternalPodDataHttpHandler, QuotaAdminHttpHandler, ClusterIngressRouter, ClusterWebSocketConfigurator, EdgeNodeDirectDebugHttpHandler, EdgeNodeProxyHttpHandler, RouterHttpHandler, RouterHttpRoute, TracingHandler, EdgeNodeCertificateHttpHandler, TerminalHttpHandler, DeviceNotificationHub, DeviceNotificationResourceListener, DeviceNotificationWebSocketServer, DeviceNotificationTicketHandler, registerDeviceNotificationRuntime, ReservedSuffixIdentifierGenerator, DrizzleIndexedStorage, LoginMethodGuardStorage, ValidatingIdentityProviderHttpHandler, PostgresKeyValueStorage, RedisKeyValueStorage, SqliteKeyValueStorage, BaseKeyValueStorage, DrizzleQuotaService, NoopQuotaService, HttpEntitlementProvider, NoopEntitlementProvider, PerAccountQuotaStrategy, TencentDnsProvider, EdgeNodeDnsCoordinator, Dns01CertificateProvisioner, SimpleEdgeNodeTunnelManager, NoopEdgeNodeTunnelManager, FrpTunnelManager, EdgeNodeHealthProbeService, EdgeNodeAgent, EdgeNodeAgentInitializer, EdgeNodeCertificateService, AcmeCertificateManager, EdgeNodeModeDetector, ClusterIdentifierStrategy, UsageTrackingStore, CenterNodeRegistrationService, PodRoutingHttpHandler, ReactAppViewHandler, QuintStore, SqliteQuintStore, PgQuintStore, RdfTermDictionary, RdfQuadIndex, Rdf3xIndex, RdfTextIndex, RdfVectorIndex, PostgresRdfTextIndex, PostgresRdfVectorIndex, SolidRdfEngine, LocalQleverNativeSparqlClient, QleverSparqlEngine, RdfQuerySparqlEngine, PostgresRdfEngine, VectorStore, SqliteVectorStore, PostgresVectorStore, VectorHttpHandler, ProviderRegistry, ProviderRegistryImpl, EmbeddingService, EmbeddingServiceImpl, CredentialReader, CredentialReaderImpl, CloudflareTunnelProvider, LocalTunnelProvider, NgrokTunnelProvider, SubdomainService, MultiDomainIdentifierStrategy, SubdomainPodIdentifierStrategy, DisabledOidcHandler, DisabledIdentityProviderHandler, AutoDetectOidcHandler, AutoDetectIdentityProviderHandler, LoopbackClientIdAdapterFactory, RememberedClientGrantStore, RememberedConsentHandler, RememberedClientPromptFactory, SessionBoundIdentityProviderFactory, ScopedPickWebIdHandler, ConfiguredLoopbackDPoPWebIdExtractor, AccountStorageBindingsHandler, CssPodOwnershipResolver, UrlAwareRedisLocker, ProvisionPodCreator, ProvisionPodStore, ProvisionCodeCodec, LocalPodProvisioningService, SqliteSolidFsSyncJournal, RootedSolidFsSyncJournal, LocalRdfAuthorityRecoveryInitializer, ObservableResourceStore, RdfSearchReconciliationIntentSink, };
128
+ export { RepresentationPartialConvertingStore, MinioDataAccessor, SolidRdfDataAccessor, MixDataAccessor, ConfigurableLoggerFactory, resolveLogFilePattern, resolveCurrentLogFile, LOG_FILE_PATTERN, SparqlUpdateResourceStore, SubgraphQueryEngine, SubgraphSparqlHttpHandler, InternalPodDataHttpHandler, QuotaAdminHttpHandler, ClusterIngressRouter, ClusterWebSocketConfigurator, EdgeNodeDirectDebugHttpHandler, EdgeNodeProxyHttpHandler, RouterHttpHandler, RouterHttpRoute, TracingHandler, EdgeNodeCertificateHttpHandler, TerminalHttpHandler, DeviceNotificationHub, DeviceNotificationResourceListener, DeviceNotificationWebSocketServer, DeviceNotificationTicketHandler, registerDeviceNotificationRuntime, ReservedSuffixIdentifierGenerator, DrizzleIndexedStorage, LoginMethodGuardStorage, ValidatingIdentityProviderHttpHandler, PostgresKeyValueStorage, RedisKeyValueStorage, SqliteKeyValueStorage, BaseKeyValueStorage, DrizzleQuotaService, NoopQuotaService, HttpEntitlementProvider, NoopEntitlementProvider, PerAccountQuotaStrategy, TencentDnsProvider, EdgeNodeDnsCoordinator, Dns01CertificateProvisioner, SimpleEdgeNodeTunnelManager, NoopEdgeNodeTunnelManager, FrpTunnelManager, EdgeNodeHealthProbeService, EdgeNodeAgent, EdgeNodeAgentInitializer, EdgeNodeCertificateService, AcmeCertificateManager, EdgeNodeModeDetector, ClusterIdentifierStrategy, UsageTrackingStore, CenterNodeRegistrationService, PodRoutingHttpHandler, ReactAppViewHandler, QuintStore, SqliteQuintStore, PgQuintStore, RdfTermDictionary, RdfQuadIndex, Rdf3xIndex, RdfTextIndex, RdfVectorIndex, PostgresRdfTextIndex, PostgresRdfVectorIndex, SolidRdfEngine, LocalQleverNativeSparqlClient, QleverSparqlEngine, RdfQuerySparqlEngine, PostgresRdfEngine, VectorStore, SqliteVectorStore, PostgresVectorStore, VectorHttpHandler, ProviderRegistry, ProviderRegistryImpl, EmbeddingService, EmbeddingServiceImpl, CredentialReader, CredentialReaderImpl, CloudflareTunnelProvider, LocalTunnelProvider, NgrokTunnelProvider, SubdomainService, MultiDomainIdentifierStrategy, SubdomainPodIdentifierStrategy, DisabledOidcHandler, DisabledIdentityProviderHandler, AutoDetectOidcHandler, AutoDetectIdentityProviderHandler, LoopbackClientIdAdapterFactory, RememberedClientGrantStore, RememberedConsentHandler, RememberedClientPromptFactory, SessionBoundIdentityProviderFactory, ScopedPickWebIdHandler, ConfiguredLoopbackDPoPWebIdExtractor, AccountStorageBindingsHandler, CssPodOwnershipResolver, UrlAwareRedisLocker, ProvisionPodCreator, ProvisionPodStore, ProvisionCodeCodec, LocalPodProvisioningService, SqliteSolidFsSyncJournal, RootedSolidFsSyncJournal, LocalRdfAuthorityRecoveryInitializer, ObservableResourceStore, RdfSearchReconciliationIntentSink, };
128
129
  export type { ResourceChangeEvent, ResourceChangeListener, ResourceChangeRecorder, } from './storage/ObservableResourceStore';
129
130
  export { RdfHandlebarsTemplateEngine } from './util/templates/RdfHandlebarsTemplateEngine';
package/dist/index.js CHANGED
@@ -14,9 +14,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.EdgeNodeModeDetector = exports.AcmeCertificateManager = exports.EdgeNodeCertificateService = exports.EdgeNodeAgentInitializer = exports.EdgeNodeAgent = exports.EdgeNodeHealthProbeService = exports.FrpTunnelManager = exports.NoopEdgeNodeTunnelManager = exports.SimpleEdgeNodeTunnelManager = exports.Dns01CertificateProvisioner = exports.EdgeNodeDnsCoordinator = exports.TencentDnsProvider = exports.PerAccountQuotaStrategy = exports.NoopEntitlementProvider = exports.HttpEntitlementProvider = exports.NoopQuotaService = exports.DrizzleQuotaService = exports.BaseKeyValueStorage = exports.SqliteKeyValueStorage = exports.RedisKeyValueStorage = exports.PostgresKeyValueStorage = exports.ValidatingIdentityProviderHttpHandler = exports.LoginMethodGuardStorage = exports.DrizzleIndexedStorage = exports.ReservedSuffixIdentifierGenerator = exports.registerDeviceNotificationRuntime = exports.DeviceNotificationTicketHandler = exports.DeviceNotificationWebSocketServer = exports.DeviceNotificationResourceListener = exports.DeviceNotificationHub = exports.TerminalHttpHandler = exports.EdgeNodeCertificateHttpHandler = exports.TracingHandler = exports.RouterHttpRoute = exports.RouterHttpHandler = exports.EdgeNodeProxyHttpHandler = exports.EdgeNodeDirectDebugHttpHandler = exports.ClusterWebSocketConfigurator = exports.ClusterIngressRouter = exports.QuotaAdminHttpHandler = exports.InternalPodDataHttpHandler = exports.SubgraphSparqlHttpHandler = exports.SubgraphQueryEngine = exports.SparqlUpdateResourceStore = exports.ConfigurableLoggerFactory = exports.MixDataAccessor = exports.SolidRdfDataAccessor = exports.MinioDataAccessor = exports.RepresentationPartialConvertingStore = exports.AppStaticAssetHandler = void 0;
18
- exports.UrlAwareRedisLocker = exports.CssPodOwnershipResolver = exports.AccountStorageBindingsHandler = exports.ConfiguredLoopbackDPoPWebIdExtractor = exports.ScopedPickWebIdHandler = exports.SessionBoundIdentityProviderFactory = exports.RememberedClientPromptFactory = exports.RememberedConsentHandler = exports.RememberedClientGrantStore = exports.LoopbackClientIdAdapterFactory = exports.AutoDetectIdentityProviderHandler = exports.AutoDetectOidcHandler = exports.DisabledIdentityProviderHandler = exports.DisabledOidcHandler = exports.SubdomainPodIdentifierStrategy = exports.MultiDomainIdentifierStrategy = exports.SubdomainService = exports.NgrokTunnelProvider = exports.LocalTunnelProvider = exports.CloudflareTunnelProvider = exports.CredentialReaderImpl = exports.CredentialReader = exports.EmbeddingServiceImpl = exports.EmbeddingService = exports.ProviderRegistryImpl = exports.ProviderRegistry = exports.VectorHttpHandler = exports.PostgresVectorStore = exports.SqliteVectorStore = exports.VectorStore = exports.PostgresRdfEngine = exports.RdfQuerySparqlEngine = exports.QleverSparqlEngine = exports.LocalQleverNativeSparqlClient = exports.SolidRdfEngine = exports.PostgresRdfVectorIndex = exports.PostgresRdfTextIndex = exports.RdfVectorIndex = exports.RdfTextIndex = exports.Rdf3xIndex = exports.RdfQuadIndex = exports.RdfTermDictionary = exports.PgQuintStore = exports.SqliteQuintStore = exports.QuintStore = exports.ReactAppViewHandler = exports.PodRoutingHttpHandler = exports.CenterNodeRegistrationService = exports.UsageTrackingStore = exports.ClusterIdentifierStrategy = void 0;
19
- exports.RdfHandlebarsTemplateEngine = exports.RdfSearchReconciliationIntentSink = exports.ObservableResourceStore = exports.LocalRdfAuthorityRecoveryInitializer = exports.RootedSolidFsSyncJournal = exports.SqliteSolidFsSyncJournal = exports.LocalPodProvisioningService = exports.ProvisionCodeCodec = exports.ProvisionPodStore = exports.ProvisionPodCreator = void 0;
17
+ exports.EdgeNodeAgentInitializer = exports.EdgeNodeAgent = exports.EdgeNodeHealthProbeService = exports.FrpTunnelManager = exports.NoopEdgeNodeTunnelManager = exports.SimpleEdgeNodeTunnelManager = exports.Dns01CertificateProvisioner = exports.EdgeNodeDnsCoordinator = exports.TencentDnsProvider = exports.PerAccountQuotaStrategy = exports.NoopEntitlementProvider = exports.HttpEntitlementProvider = exports.NoopQuotaService = exports.DrizzleQuotaService = exports.BaseKeyValueStorage = exports.SqliteKeyValueStorage = exports.RedisKeyValueStorage = exports.PostgresKeyValueStorage = exports.ValidatingIdentityProviderHttpHandler = exports.LoginMethodGuardStorage = exports.DrizzleIndexedStorage = exports.ReservedSuffixIdentifierGenerator = exports.registerDeviceNotificationRuntime = exports.DeviceNotificationTicketHandler = exports.DeviceNotificationWebSocketServer = exports.DeviceNotificationResourceListener = exports.DeviceNotificationHub = exports.TerminalHttpHandler = exports.EdgeNodeCertificateHttpHandler = exports.TracingHandler = exports.RouterHttpRoute = exports.RouterHttpHandler = exports.EdgeNodeProxyHttpHandler = exports.EdgeNodeDirectDebugHttpHandler = exports.ClusterWebSocketConfigurator = exports.ClusterIngressRouter = exports.QuotaAdminHttpHandler = exports.InternalPodDataHttpHandler = exports.SubgraphSparqlHttpHandler = exports.SubgraphQueryEngine = exports.SparqlUpdateResourceStore = exports.LOG_FILE_PATTERN = exports.resolveCurrentLogFile = exports.resolveLogFilePattern = exports.ConfigurableLoggerFactory = exports.MixDataAccessor = exports.SolidRdfDataAccessor = exports.MinioDataAccessor = exports.RepresentationPartialConvertingStore = exports.AppStaticAssetHandler = void 0;
18
+ exports.ConfiguredLoopbackDPoPWebIdExtractor = exports.ScopedPickWebIdHandler = exports.SessionBoundIdentityProviderFactory = exports.RememberedClientPromptFactory = exports.RememberedConsentHandler = exports.RememberedClientGrantStore = exports.LoopbackClientIdAdapterFactory = exports.AutoDetectIdentityProviderHandler = exports.AutoDetectOidcHandler = exports.DisabledIdentityProviderHandler = exports.DisabledOidcHandler = exports.SubdomainPodIdentifierStrategy = exports.MultiDomainIdentifierStrategy = exports.SubdomainService = exports.NgrokTunnelProvider = exports.LocalTunnelProvider = exports.CloudflareTunnelProvider = exports.CredentialReaderImpl = exports.CredentialReader = exports.EmbeddingServiceImpl = exports.EmbeddingService = exports.ProviderRegistryImpl = exports.ProviderRegistry = exports.VectorHttpHandler = exports.PostgresVectorStore = exports.SqliteVectorStore = exports.VectorStore = exports.PostgresRdfEngine = exports.RdfQuerySparqlEngine = exports.QleverSparqlEngine = exports.LocalQleverNativeSparqlClient = exports.SolidRdfEngine = exports.PostgresRdfVectorIndex = exports.PostgresRdfTextIndex = exports.RdfVectorIndex = exports.RdfTextIndex = exports.Rdf3xIndex = exports.RdfQuadIndex = exports.RdfTermDictionary = exports.PgQuintStore = exports.SqliteQuintStore = exports.QuintStore = exports.ReactAppViewHandler = exports.PodRoutingHttpHandler = exports.CenterNodeRegistrationService = exports.UsageTrackingStore = exports.ClusterIdentifierStrategy = exports.EdgeNodeModeDetector = exports.AcmeCertificateManager = exports.EdgeNodeCertificateService = void 0;
19
+ exports.RdfHandlebarsTemplateEngine = exports.RdfSearchReconciliationIntentSink = exports.ObservableResourceStore = exports.LocalRdfAuthorityRecoveryInitializer = exports.RootedSolidFsSyncJournal = exports.SqliteSolidFsSyncJournal = exports.LocalPodProvisioningService = exports.ProvisionCodeCodec = exports.ProvisionPodStore = exports.ProvisionPodCreator = exports.UrlAwareRedisLocker = exports.CssPodOwnershipResolver = exports.AccountStorageBindingsHandler = void 0;
20
20
  require("./runtime/configure-drizzle-solid");
21
21
  const RepresentationPartialConvertingStore_1 = require("./storage/RepresentationPartialConvertingStore");
22
22
  Object.defineProperty(exports, "RepresentationPartialConvertingStore", { enumerable: true, get: function () { return RepresentationPartialConvertingStore_1.RepresentationPartialConvertingStore; } });
@@ -28,6 +28,10 @@ const MixDataAccessor_1 = require("./storage/accessors/MixDataAccessor");
28
28
  Object.defineProperty(exports, "MixDataAccessor", { enumerable: true, get: function () { return MixDataAccessor_1.MixDataAccessor; } });
29
29
  const ConfigurableLoggerFactory_1 = require("./logging/ConfigurableLoggerFactory");
30
30
  Object.defineProperty(exports, "ConfigurableLoggerFactory", { enumerable: true, get: function () { return ConfigurableLoggerFactory_1.ConfigurableLoggerFactory; } });
31
+ const log_file_1 = require("./logging/log-file");
32
+ Object.defineProperty(exports, "LOG_FILE_PATTERN", { enumerable: true, get: function () { return log_file_1.LOG_FILE_PATTERN; } });
33
+ Object.defineProperty(exports, "resolveCurrentLogFile", { enumerable: true, get: function () { return log_file_1.resolveCurrentLogFile; } });
34
+ Object.defineProperty(exports, "resolveLogFilePattern", { enumerable: true, get: function () { return log_file_1.resolveLogFilePattern; } });
31
35
  const SubgraphQueryEngine_1 = require("./storage/sparql/SubgraphQueryEngine");
32
36
  Object.defineProperty(exports, "SubgraphQueryEngine", { enumerable: true, get: function () { return SubgraphQueryEngine_1.SubgraphQueryEngine; } });
33
37
  __exportStar(require("./document"), exports);
@@ -0,0 +1,17 @@
1
+ /** Directory, relative to the runtime working directory. */
2
+ export declare const LOG_DIRECTORY = "logs";
3
+ /** File name template; the rotating transport substitutes `%DATE%`. */
4
+ export declare const LOG_FILE_NAME_PATTERN = "xpod-%DATE%.log";
5
+ /** Both segments, for callers that join them onto a working directory themselves. */
6
+ export declare const LOG_FILE_PATTERN = "logs/xpod-%DATE%.log";
7
+ /** Absolute path template handed to the logging transport. */
8
+ export declare function resolveLogFilePattern(cwd?: string): string;
9
+ /**
10
+ * The log file currently being appended to, or `null` when the runtime has not
11
+ * written one yet.
12
+ *
13
+ * Daily rotation produces one file per date and size rotation keeps older
14
+ * segments as `.log.N` next to it, so the live file is identified by
15
+ * modification time rather than by name.
16
+ */
17
+ export declare function resolveCurrentLogFile(cwd?: string): string | null;
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LOG_FILE_PATTERN = exports.LOG_FILE_NAME_PATTERN = exports.LOG_DIRECTORY = void 0;
7
+ exports.resolveLogFilePattern = resolveLogFilePattern;
8
+ exports.resolveCurrentLogFile = resolveCurrentLogFile;
9
+ /**
10
+ * Canonical location of the runtime log file.
11
+ *
12
+ * Every writer (main entry, runtime bootstrap, API service) and every reader
13
+ * (admin diagnostics) resolves the path through this module. When the reader
14
+ * guessed its own file names instead, the Logs page reported "no log file"
15
+ * while the runtime kept writing to one.
16
+ */
17
+ const node_fs_1 = __importDefault(require("node:fs"));
18
+ const node_path_1 = __importDefault(require("node:path"));
19
+ /** Directory, relative to the runtime working directory. */
20
+ exports.LOG_DIRECTORY = 'logs';
21
+ /** File name template; the rotating transport substitutes `%DATE%`. */
22
+ exports.LOG_FILE_NAME_PATTERN = 'xpod-%DATE%.log';
23
+ /** Both segments, for callers that join them onto a working directory themselves. */
24
+ exports.LOG_FILE_PATTERN = `${exports.LOG_DIRECTORY}/${exports.LOG_FILE_NAME_PATTERN}`;
25
+ /** Concrete files the template produces, including rotated siblings such as `xpod-2026-09-13.log.2`. */
26
+ const CONCRETE_LOG_FILE_NAME = /^xpod-.*\.log(\.\d+)?$/;
27
+ /** Absolute path template handed to the logging transport. */
28
+ function resolveLogFilePattern(cwd = process.cwd()) {
29
+ return node_path_1.default.join(cwd, exports.LOG_DIRECTORY, exports.LOG_FILE_NAME_PATTERN);
30
+ }
31
+ /**
32
+ * The log file currently being appended to, or `null` when the runtime has not
33
+ * written one yet.
34
+ *
35
+ * Daily rotation produces one file per date and size rotation keeps older
36
+ * segments as `.log.N` next to it, so the live file is identified by
37
+ * modification time rather than by name.
38
+ */
39
+ function resolveCurrentLogFile(cwd = process.cwd()) {
40
+ const directory = node_path_1.default.join(cwd, exports.LOG_DIRECTORY);
41
+ let names;
42
+ try {
43
+ names = node_fs_1.default.readdirSync(directory);
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ let newest = null;
49
+ for (const name of names) {
50
+ if (!CONCRETE_LOG_FILE_NAME.test(name))
51
+ continue;
52
+ const file = node_path_1.default.join(directory, name);
53
+ let mtimeMs;
54
+ try {
55
+ const stats = node_fs_1.default.statSync(file);
56
+ if (!stats.isFile())
57
+ continue;
58
+ mtimeMs = stats.mtimeMs;
59
+ }
60
+ catch {
61
+ continue;
62
+ }
63
+ if (!newest || mtimeMs > newest.mtimeMs) {
64
+ newest = { file, mtimeMs };
65
+ }
66
+ }
67
+ return newest?.file ?? null;
68
+ }
69
+ //# sourceMappingURL=log-file.js.map
package/dist/main.js CHANGED
@@ -17,6 +17,7 @@ const css_process_1 = require("./runtime/css-process");
17
17
  const oidc_issuer_1 = require("./runtime/oidc-issuer");
18
18
  const AuthMode_1 = require("./authorization/AuthMode");
19
19
  const ConfigurableLoggerFactory_1 = require("./logging/ConfigurableLoggerFactory");
20
+ const log_file_1 = require("./logging/log-file");
20
21
  const supervisor_1 = require("./supervisor");
21
22
  const js_runtime_1 = require("./runtime/js-runtime");
22
23
  const database_url_1 = require("./runtime/database-url");
@@ -27,7 +28,7 @@ const EXIT_INTERNAL_ERROR = 50;
27
28
  let logger = (0, global_logger_factory_1.getLoggerFor)('Main');
28
29
  function initLogger() {
29
30
  const loggerFactory = new ConfigurableLoggerFactory_1.ConfigurableLoggerFactory(process.env.CSS_LOGGING_LEVEL || 'info', {
30
- fileName: path_1.default.join(process.cwd(), 'logs/xpod-%DATE%.log'),
31
+ fileName: (0, log_file_1.resolveLogFilePattern)(),
31
32
  showLocation: true,
32
33
  });
33
34
  (0, global_logger_factory_1.setGlobalLoggerFactory)(loggerFactory);
@@ -0,0 +1,50 @@
1
+ import type { Finalizable, KeyValueStorage, NotificationChannelStorage, WebSocketMap } from '@solid/community-server';
2
+ import { Initializer } from '@solid/community-server';
3
+ /** 默认清扫间隔(分钟)。同时是“新建但尚未连上 socket”的通道的宽限期。 */
4
+ export declare const NOTIFICATION_CHANNEL_SWEEP_INTERVAL_MINUTES = 5;
5
+ /**
6
+ * 回收没有活动 socket 的通知通道。
7
+ *
8
+ * 背景:CSS 的 `WebSocket2023Storer` 只在 socket 关闭时把它从内存 map 中移除,通道记录留在
9
+ * `SubscriptionStorage` 里直到 `endAt` 过期(默认 2 周);客户端 DELETE 失败、页面崩溃、
10
+ * 进程被强杀等情况都会留下再也无人使用、也无人回收的通道。`ReclaimingWebSocket2023Storer`
11
+ * 覆盖了正常关闭的路径,本组件负责其余部分:
12
+ *
13
+ * 1. 启动时清扫一次:进程刚起来,内存 map 必然为空,任何持久化的通道都不可能还有活动 socket;
14
+ * 2. 之后每 {@link NOTIFICATION_CHANNEL_SWEEP_INTERVAL_MINUTES} 分钟清扫一次:无 socket 的通道
15
+ * 需要连续两次被判定为孤儿才删除,避免误删“刚 POST 出来、socket 还在握手”的通道。
16
+ *
17
+ * 只回收本实例 `baseUrl` 下的通道:通道 id 由本实例的订阅路由生成,Cloud 集群中共享
18
+ * `internal_kv` 的其他节点(若存在)的通道由各自实例负责,这里不做跨实例删除。
19
+ * 与 socket 归属相关的限制(同一个 baseUrl 被多个 CSS 进程共享时无法判断通道是否在别的进程里存活)
20
+ * 见 `docs/COMPONENTS.md`。
21
+ */
22
+ export declare class NotificationChannelSweeper extends Initializer implements Finalizable {
23
+ protected readonly logger: import("global-logger-factory").Logger<unknown>;
24
+ private readonly channelStorage;
25
+ private readonly channelIndex;
26
+ private readonly socketMap;
27
+ private readonly baseUrl;
28
+ private readonly intervalMs;
29
+ /** 见过一次、但当时没有活动 socket 的通道 id;下一次仍是孤儿才回收。 */
30
+ private readonly awaitingSecondLook;
31
+ private timer?;
32
+ private sweeping;
33
+ constructor(storage: NotificationChannelStorage, channelIndex: KeyValueStorage<string, unknown>, socketMap: WebSocketMap, baseUrl: string, intervalMinutes?: number);
34
+ /**
35
+ * CSS 启动序列的一部分(在 HTTP server 开始监听之前执行):先做一次启动清扫,再挂上有界的周期任务。
36
+ *
37
+ * 实测同一次 CSS 启动里本方法会被调用两次(配置图里只出现一次)。这里做成幂等:重复调用既不重复清扫,
38
+ * 也不重复注册定时器——两个定时器会让“连续两次判定”退化成相隔几百毫秒的两次判定,等于没有宽限期。
39
+ */
40
+ handle(): Promise<void>;
41
+ finalize(): Promise<void>;
42
+ /**
43
+ * 执行一次清扫,返回被回收的通道数量。
44
+ *
45
+ * @param initial - 启动清扫:内存中还没有任何 socket,因此无 socket 的通道一律视为孤儿。
46
+ */
47
+ sweep(initial?: boolean): Promise<number>;
48
+ /** 枚举本实例 baseUrl 下的通道记录。topic 索引行(值是 id 数组)不是通道,跳过。 */
49
+ private listOwnedChannels;
50
+ }