@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
@@ -1,5 +1,23 @@
1
1
  import { AS, DCTerms, FOAF, MEETING, ODRL, RDF, SCHEMA, SIOC, UDFS, VCARD, WF } from './namespaces.js';
2
- export const credentialDescriptor = {
2
+ /**
3
+ * Declares a descriptor while keeping the literal field map.
4
+ *
5
+ * Annotating a descriptor with `PodModelDescriptor` erases `fields` into
6
+ * `Record<string, PodModelFieldDescriptor>`: `keyof fields` collapses to
7
+ * `string | number` and every `type`/`array`/`secret` literal widens to its
8
+ * union. Consumers that derive row types from descriptors (a mapped type over
9
+ * `D['fields']`) then get an index signature, so a stale field name compiles and
10
+ * reads `undefined` at runtime. The `const F` type parameter is the whole
11
+ * point: declare with `definePodModelDescriptor({...})` and the literal keys,
12
+ * field types, and flags survive into the published `.d.ts`.
13
+ *
14
+ * Runtime behaviour is the identity function: the returned value is the same
15
+ * object the caller passed.
16
+ */
17
+ export function definePodModelDescriptor(descriptor) {
18
+ return descriptor;
19
+ }
20
+ export const credentialDescriptor = definePodModelDescriptor({
3
21
  uri: UDFS.Credential,
4
22
  version: '1.0.0',
5
23
  source: 'official',
@@ -17,30 +35,34 @@ export const credentialDescriptor = {
17
35
  type: 'string',
18
36
  predicate: UDFS.term('id'),
19
37
  required: true,
20
- description: 'Local credential id.',
38
+ description: 'Base-relative credential row id. Every credential in a provider pool keeps its own id.',
21
39
  },
22
- service: {
40
+ provider: {
41
+ type: 'uri',
42
+ predicate: UDFS.provider,
43
+ references: { resource: 'provider', key: 'id' },
44
+ description: 'Provider resource URI this credential connects through, as a URI relation to the provider row.',
45
+ },
46
+ authMode: {
23
47
  type: 'string',
24
- predicate: UDFS.service,
25
- required: true,
26
- description: 'Credential service grouping, for example ai or infra.',
48
+ predicate: UDFS.authMode,
49
+ description: 'Authentication mode such as apiKey, oauth, deviceCode, or console.',
27
50
  },
28
- providerId: {
51
+ offeringId: {
29
52
  type: 'string',
30
- predicate: UDFS.provider,
31
- required: true,
32
- description: 'Provider identifier such as openai or cloudflare.',
53
+ predicate: UDFS.offeringId,
54
+ description: 'Offering id this credential connects through. Offerings are catalog content, so this stays a plain attribute, not a relation.',
33
55
  },
34
- secretType: {
56
+ service: {
35
57
  type: 'string',
36
- predicate: UDFS.secretType,
58
+ predicate: UDFS.service,
37
59
  required: true,
38
- description: 'Provider-specific secret kind such as api-key or tunnel-token.',
60
+ description: 'Credential service grouping, for example ai or infra.',
39
61
  },
40
- label: {
62
+ status: {
41
63
  type: 'string',
42
- predicate: UDFS.label,
43
- description: 'User-facing credential label.',
64
+ predicate: UDFS.status,
65
+ description: 'Credential health status.',
44
66
  },
45
67
  apiKey: {
46
68
  type: 'string',
@@ -48,11 +70,6 @@ export const credentialDescriptor = {
48
70
  secret: true,
49
71
  description: 'Secret token or API key material.',
50
72
  },
51
- authMode: {
52
- type: 'string',
53
- predicate: UDFS.authMode,
54
- description: 'Authentication mode such as apiKey, oauth, deviceCode, or console.',
55
- },
56
73
  storageMode: {
57
74
  type: 'string',
58
75
  predicate: UDFS.storageMode,
@@ -112,17 +129,112 @@ export const credentialDescriptor = {
112
129
  predicate: UDFS.reauthRequired,
113
130
  description: 'Whether this credential requires user reauthentication.',
114
131
  },
115
- status: {
132
+ baseUrl: {
116
133
  type: 'string',
117
- predicate: UDFS.status,
118
- description: 'Credential health status.',
134
+ predicate: UDFS.baseUrl,
135
+ description: 'Provider API base URL recorded on the credential.',
136
+ },
137
+ proxyUrl: {
138
+ type: 'string',
139
+ predicate: UDFS.proxyUrl,
140
+ description: 'Proxy URL used for requests made with this credential.',
141
+ },
142
+ label: {
143
+ type: 'string',
144
+ predicate: UDFS.label,
145
+ description: 'User-facing credential label.',
146
+ },
147
+ isDefault: {
148
+ type: 'boolean',
149
+ predicate: UDFS.isDefault,
150
+ description: 'Whether this credential is the default credential for its provider.',
151
+ },
152
+ createdAt: {
153
+ type: 'timestamp',
154
+ predicate: DCTerms.created,
155
+ description: 'Creation timestamp, set by the store.',
156
+ },
157
+ lastUsedAt: {
158
+ type: 'timestamp',
159
+ predicate: UDFS.lastUsedAt,
160
+ description: 'Last successful use timestamp.',
161
+ },
162
+ clientCredentialId: {
163
+ type: 'string',
164
+ predicate: UDFS.clientCredentialId,
165
+ description: 'Client the issued credential belongs to. An external runtime identifier, not an RDF link.',
166
+ },
167
+ appliedTo: {
168
+ type: 'string',
169
+ predicate: UDFS.appliedTo,
170
+ description: 'Client application id the credential is in effect for. A runtime identifier, not an RDF link.',
171
+ },
172
+ appliedOn: {
173
+ type: 'string',
174
+ predicate: UDFS.appliedOn,
175
+ description: 'Device id that wrote the applied configuration. A runtime identifier, not an RDF link.',
176
+ },
177
+ appliedAt: {
178
+ type: 'timestamp',
179
+ predicate: UDFS.appliedAt,
180
+ description: 'Timestamp when the credential was applied.',
181
+ },
182
+ failCount: {
183
+ type: 'number',
184
+ predicate: UDFS.failCount,
185
+ description: 'Failed use count recorded for the credential.',
186
+ },
187
+ rateLimitResetAt: {
188
+ type: 'timestamp',
189
+ predicate: UDFS.rateLimitResetAt,
190
+ description: 'Timestamp when the provider rate limit is expected to reset.',
191
+ },
192
+ oauthRefreshToken: {
193
+ type: 'string',
194
+ predicate: UDFS.oauthRefreshToken,
195
+ secret: true,
196
+ description: 'OAuth refresh token.',
197
+ },
198
+ oauthAccessToken: {
199
+ type: 'string',
200
+ predicate: UDFS.oauthAccessToken,
201
+ secret: true,
202
+ description: 'OAuth access token.',
203
+ },
204
+ oauthExpiresAt: {
205
+ type: 'timestamp',
206
+ predicate: UDFS.oauthExpiresAt,
207
+ description: 'OAuth access token expiry timestamp.',
208
+ },
209
+ projectId: {
210
+ type: 'string',
211
+ predicate: UDFS.projectId,
212
+ description: 'Provider project identifier recorded for the credential.',
213
+ },
214
+ organizationId: {
215
+ type: 'string',
216
+ predicate: UDFS.organizationId,
217
+ description: 'Provider organization identifier recorded for the credential.',
218
+ },
219
+ metadata: {
220
+ type: 'json',
221
+ predicate: UDFS.metadata,
222
+ description: 'Opaque adapter-local metadata bag; shared relations must be explicit fields.',
119
223
  },
120
224
  },
121
- uniqueBy: ['service', 'providerId', 'secretType'],
225
+ // A credential pool holds several credentials per provider and offering (one
226
+ // per account or key), so `service`, `provider`, and `offeringId` are not
227
+ // unique together, and `secretType` is a resolution hint rather than a column.
228
+ // The row id is the only column that identifies a credential, so it is the
229
+ // whole key here; provider and offering stay attributes of the credential.
230
+ uniqueBy: ['id'],
122
231
  writableFields: [
123
- 'label',
124
- 'apiKey',
232
+ 'provider',
125
233
  'authMode',
234
+ 'offeringId',
235
+ 'service',
236
+ 'status',
237
+ 'apiKey',
126
238
  'storageMode',
127
239
  'secretPayload',
128
240
  'encryptedSecret',
@@ -134,29 +246,41 @@ export const credentialDescriptor = {
134
246
  'accountLabel',
135
247
  'lastRefreshAt',
136
248
  'reauthRequired',
137
- 'status',
249
+ 'baseUrl',
250
+ 'proxyUrl',
251
+ 'label',
252
+ 'isDefault',
253
+ 'lastUsedAt',
254
+ 'clientCredentialId',
255
+ 'appliedTo',
256
+ 'appliedOn',
257
+ 'appliedAt',
258
+ 'failCount',
259
+ 'rateLimitResetAt',
260
+ 'oauthRefreshToken',
261
+ 'oauthAccessToken',
262
+ 'oauthExpiresAt',
263
+ 'projectId',
264
+ 'organizationId',
265
+ 'metadata',
138
266
  ],
139
267
  mergePolicy: 'upsert',
140
268
  examples: [
141
269
  {
142
270
  request: '保存 Cloudflare tunnel token',
143
271
  match: {
144
- service: 'infra',
145
- providerId: 'cloudflare',
146
- secretType: 'tunnel-token',
272
+ id: 'cloudflare-5f2c9a1e',
147
273
  },
148
274
  },
149
275
  {
150
276
  request: '保存 OpenAI API key',
151
277
  match: {
152
- service: 'ai',
153
- providerId: 'openai',
154
- secretType: 'api-key',
278
+ id: 'openai-2b7d4e10',
155
279
  },
156
280
  },
157
281
  ],
158
- };
159
- export const gatewayAccessKeyDescriptor = {
282
+ });
283
+ export const gatewayAccessKeyDescriptor = definePodModelDescriptor({
160
284
  uri: UDFS.GatewayAccessKey,
161
285
  version: '1.0.0',
162
286
  source: 'official',
@@ -218,16 +342,16 @@ export const gatewayAccessKeyDescriptor = {
218
342
  predicate: UDFS.lastUsedAt,
219
343
  description: 'Last successful Gateway use timestamp.',
220
344
  },
221
- disabledAt: {
222
- type: 'timestamp',
223
- predicate: UDFS.disabledAt,
224
- description: 'Temporary disable timestamp. Clear it to enable the key again.',
225
- },
226
345
  revokedAt: {
227
346
  type: 'timestamp',
228
347
  predicate: UDFS.revokedAt,
229
348
  description: 'Revocation timestamp. Presence means the key is no longer valid.',
230
349
  },
350
+ disabledAt: {
351
+ type: 'timestamp',
352
+ predicate: UDFS.disabledAt,
353
+ description: 'Temporary disable timestamp. Clear it to enable the key again.',
354
+ },
231
355
  },
232
356
  uniqueBy: ['id'],
233
357
  writableFields: [
@@ -249,8 +373,8 @@ export const gatewayAccessKeyDescriptor = {
249
373
  match: { id: 'ai/gateway/access-keys.ttl#key_1' },
250
374
  },
251
375
  ],
252
- };
253
- export const quotaSnapshotDescriptor = {
376
+ });
377
+ export const quotaSnapshotDescriptor = definePodModelDescriptor({
254
378
  uri: UDFS.QuotaSnapshot,
255
379
  version: '1.0.0',
256
380
  source: 'official',
@@ -270,6 +394,7 @@ export const quotaSnapshotDescriptor = {
270
394
  credential: {
271
395
  type: 'uri',
272
396
  predicate: UDFS.credential,
397
+ references: { resource: 'credential', key: 'id' },
273
398
  required: true,
274
399
  description: 'Credential resource URI this quota snapshot describes.',
275
400
  },
@@ -340,8 +465,225 @@ export const quotaSnapshotDescriptor = {
340
465
  match: { id: 'ai/gateway/quota.ttl#quota_1' },
341
466
  },
342
467
  ],
343
- };
344
- export const approvalDescriptor = {
468
+ });
469
+ export const aiProviderDescriptor = definePodModelDescriptor({
470
+ uri: UDFS.Provider,
471
+ version: '1.0.0',
472
+ source: 'official',
473
+ trustLevel: 'high',
474
+ namespace: UDFS.NAMESPACE,
475
+ class: UDFS.Provider,
476
+ resourceKind: 'provider',
477
+ description: 'AI provider endpoint configured in the Pod: endpoint, proxy, console entry, backend support, and the models it exposes. Its model rows live in the same provider document and are linked from here through hasModel.',
478
+ // One document per provider: the table id default is `{key}.ttl` against the
479
+ // `/settings/providers/` base, so `buildId({ id: provider })` resolves to
480
+ // `<provider>.ttl` and its model rows are subjects inside that document.
481
+ storage: {
482
+ base: '/settings/providers/',
483
+ resourceIdPattern: '{key}.ttl',
484
+ },
485
+ fields: {
486
+ id: {
487
+ type: 'string',
488
+ predicate: UDFS.term('id'),
489
+ required: true,
490
+ description: 'Base-relative provider row id, for example openai.ttl.',
491
+ },
492
+ displayName: {
493
+ type: 'string',
494
+ predicate: UDFS.displayName,
495
+ description: 'Provider display name stored on the provider row.',
496
+ },
497
+ baseUrl: {
498
+ type: 'string',
499
+ predicate: UDFS.baseUrl,
500
+ description: 'Provider API base URL.',
501
+ },
502
+ proxyUrl: {
503
+ type: 'string',
504
+ predicate: UDFS.proxyUrl,
505
+ description: 'Proxy URL used for provider requests.',
506
+ },
507
+ homepage: {
508
+ type: 'string',
509
+ predicate: UDFS.homepage,
510
+ description: 'Provider homepage URL.',
511
+ },
512
+ apiKeyUrl: {
513
+ type: 'string',
514
+ predicate: UDFS.apiKeyUrl,
515
+ description: 'URL where a user creates an API key for this provider.',
516
+ },
517
+ connectMode: {
518
+ type: 'string',
519
+ predicate: UDFS.connectMode,
520
+ description: 'Connection mode recorded for the provider authorization method.',
521
+ },
522
+ hasModel: {
523
+ type: 'uri',
524
+ predicate: UDFS.hasModel,
525
+ references: { resource: 'ai-model', key: 'id' },
526
+ array: true,
527
+ description: 'Model rows this provider exposes, as subjects inside the provider document.',
528
+ },
529
+ defaultModel: {
530
+ type: 'uri',
531
+ predicate: UDFS.defaultModel,
532
+ references: { resource: 'ai-model', key: 'id' },
533
+ description: 'Default model for this provider when a request does not select one.',
534
+ },
535
+ supportsBackend: {
536
+ type: 'string',
537
+ predicate: UDFS.supportsBackend,
538
+ description: 'Backends this provider can serve, read as a backend list by the AI config selector.',
539
+ },
540
+ capabilities: {
541
+ type: 'string',
542
+ predicate: UDFS.capability,
543
+ array: true,
544
+ description: 'Provider capability tags.',
545
+ },
546
+ rotationPolicy: {
547
+ type: 'string',
548
+ predicate: UDFS.rotationPolicy,
549
+ description: 'Credential rotation policy recorded for the provider.',
550
+ },
551
+ },
552
+ uniqueBy: ['id'],
553
+ writableFields: [
554
+ 'displayName',
555
+ 'baseUrl',
556
+ 'proxyUrl',
557
+ 'homepage',
558
+ 'apiKeyUrl',
559
+ 'connectMode',
560
+ 'hasModel',
561
+ 'defaultModel',
562
+ 'supportsBackend',
563
+ 'capabilities',
564
+ 'rotationPolicy',
565
+ ],
566
+ mergePolicy: 'upsert',
567
+ examples: [
568
+ {
569
+ request: 'Describe the provider document a Pod AI connection writes',
570
+ match: { id: 'openai.ttl' },
571
+ },
572
+ ],
573
+ });
574
+ export const aiModelDescriptor = definePodModelDescriptor({
575
+ uri: UDFS.AIModel,
576
+ version: '1.0.0',
577
+ source: 'official',
578
+ trustLevel: 'high',
579
+ namespace: UDFS.NAMESPACE,
580
+ class: UDFS.AIModel,
581
+ resourceKind: 'ai-model',
582
+ description: 'AI model exposed by a provider, stored as a subject inside that provider document. The provider relation and model capabilities are URI facts, while pricing and modality facts stay literals.',
583
+ // Model rows are subjects inside the provider document: the table id default
584
+ // is `{isProvidedBy.doc}#{key}` against the `/settings/providers/` base, so
585
+ // `buildId({ id: modelKey, isProvidedBy: providerIri })` resolves to
586
+ // `<provider>.ttl#<modelKey>`.
587
+ storage: {
588
+ base: '/settings/providers/',
589
+ resourceIdPattern: '{isProvidedBy.doc}#{key}',
590
+ },
591
+ fields: {
592
+ id: {
593
+ type: 'string',
594
+ predicate: UDFS.term('id'),
595
+ required: true,
596
+ description: 'Base-relative model row id: provider document plus model key, for example openai.ttl#gpt-4o.',
597
+ },
598
+ rdfType: {
599
+ type: 'uri',
600
+ predicate: RDF.type,
601
+ array: true,
602
+ description: 'RDF class of the model row. The base table defaults to AIModel, and subclass tables narrow it.',
603
+ },
604
+ displayName: {
605
+ type: 'string',
606
+ predicate: UDFS.displayName,
607
+ description: 'Model display name stored on the model row.',
608
+ },
609
+ isProvidedBy: {
610
+ type: 'uri',
611
+ predicate: UDFS.isProvidedBy,
612
+ references: { resource: 'provider', key: 'id' },
613
+ description: 'Provider document this model row belongs to, as a URI relation to the provider row.',
614
+ },
615
+ inputModalities: {
616
+ type: 'text',
617
+ predicate: UDFS.inputModality,
618
+ array: true,
619
+ description: 'Input modalities the model accepts.',
620
+ },
621
+ outputModalities: {
622
+ type: 'text',
623
+ predicate: UDFS.outputModality,
624
+ array: true,
625
+ description: 'Output modalities the model produces.',
626
+ },
627
+ runtimeCapabilities: {
628
+ type: 'string',
629
+ predicate: UDFS.capability,
630
+ array: true,
631
+ description: 'Adapter/runtime endpoint capabilities, kept separate from semantic model capabilities.',
632
+ },
633
+ capabilities: {
634
+ type: 'uri',
635
+ predicate: UDFS.hasCapability,
636
+ array: true,
637
+ description: 'Semantic capabilities of the model, as URIs.',
638
+ },
639
+ pricingInput: {
640
+ type: 'number',
641
+ predicate: UDFS.pricingInput,
642
+ description: 'Input token price recorded for the model.',
643
+ },
644
+ pricingOutput: {
645
+ type: 'number',
646
+ predicate: UDFS.pricingOutput,
647
+ description: 'Output token price recorded for the model.',
648
+ },
649
+ status: {
650
+ type: 'string',
651
+ predicate: UDFS.status,
652
+ description: 'Model availability status.',
653
+ },
654
+ createdAt: {
655
+ type: 'timestamp',
656
+ predicate: UDFS.createdAt,
657
+ description: 'Creation timestamp, set by the store.',
658
+ },
659
+ updatedAt: {
660
+ type: 'timestamp',
661
+ predicate: UDFS.updatedAt,
662
+ description: 'Last update timestamp.',
663
+ },
664
+ },
665
+ uniqueBy: ['id'],
666
+ writableFields: [
667
+ 'displayName',
668
+ 'isProvidedBy',
669
+ 'inputModalities',
670
+ 'outputModalities',
671
+ 'runtimeCapabilities',
672
+ 'capabilities',
673
+ 'pricingInput',
674
+ 'pricingOutput',
675
+ 'status',
676
+ 'updatedAt',
677
+ ],
678
+ mergePolicy: 'upsert',
679
+ examples: [
680
+ {
681
+ request: 'Describe a model row inside a provider document',
682
+ match: { id: 'openai.ttl#gpt-4o' },
683
+ },
684
+ ],
685
+ });
686
+ export const approvalDescriptor = definePodModelDescriptor({
345
687
  uri: UDFS.ApprovalRequest,
346
688
  version: '1.0.0',
347
689
  source: 'official',
@@ -370,11 +712,13 @@ export const approvalDescriptor = {
370
712
  chat: {
371
713
  type: 'uri',
372
714
  predicate: UDFS.conversation,
715
+ references: { resource: 'chat', key: 'id' },
373
716
  description: 'Related chat command surface.',
374
717
  },
375
718
  thread: {
376
719
  type: 'uri',
377
720
  predicate: UDFS.inThread,
721
+ references: { resource: 'thread', key: 'id' },
378
722
  description: 'Related concrete thread/work site.',
379
723
  },
380
724
  toolCallId: {
@@ -511,8 +855,8 @@ export const approvalDescriptor = {
511
855
  },
512
856
  },
513
857
  ],
514
- };
515
- export const inputRequestDescriptor = {
858
+ });
859
+ export const inputRequestDescriptor = definePodModelDescriptor({
516
860
  uri: UDFS.InputRequest,
517
861
  version: '1.0.0',
518
862
  source: 'official',
@@ -541,21 +885,25 @@ export const inputRequestDescriptor = {
541
885
  chat: {
542
886
  type: 'uri',
543
887
  predicate: UDFS.conversation,
888
+ references: { resource: 'chat', key: 'id' },
544
889
  description: 'Related chat command surface.',
545
890
  },
546
891
  thread: {
547
892
  type: 'uri',
548
893
  predicate: UDFS.inThread,
894
+ references: { resource: 'thread', key: 'id' },
549
895
  description: 'Related concrete thread/work site.',
550
896
  },
551
897
  run: {
552
898
  type: 'uri',
553
899
  predicate: UDFS.run,
900
+ references: { resource: 'run', key: 'id' },
554
901
  description: 'Run waiting for input.',
555
902
  },
556
903
  task: {
557
904
  type: 'uri',
558
905
  predicate: UDFS.task,
906
+ references: { resource: 'task', key: 'id' },
559
907
  description: 'Task whose execution requires input.',
560
908
  },
561
909
  requester: {
@@ -679,7 +1027,7 @@ export const inputRequestDescriptor = {
679
1027
  },
680
1028
  },
681
1029
  ],
682
- };
1030
+ });
683
1031
  function exactIdStorage(base = '/.data/') {
684
1032
  return {
685
1033
  base,
@@ -692,7 +1040,7 @@ const idField = {
692
1040
  required: true,
693
1041
  description: 'Base-relative resource id. For exact-id descriptors this includes the full document path and optional fragment.',
694
1042
  };
695
- export const captureCandidateDescriptor = {
1043
+ export const captureCandidateDescriptor = definePodModelDescriptor({
696
1044
  uri: UDFS.CaptureCandidate,
697
1045
  version: '1.0.0',
698
1046
  source: 'official',
@@ -712,10 +1060,10 @@ export const captureCandidateDescriptor = {
712
1060
  reason: { type: 'text', predicate: UDFS.reason, description: 'Short rationale for why this source might be worth capturing.' },
713
1061
  status: { type: 'string', predicate: UDFS.status, description: 'Candidate lifecycle status such as candidate, promoted, rejected, duplicate, ignored, or superseded.' },
714
1062
  sourceHash: { type: 'string', predicate: UDFS.sourceHash, description: 'Optional source digest for duplicate detection.' },
715
- chat: { type: 'uri', predicate: UDFS.conversation, description: 'Related chat command surface.' },
716
- thread: { type: 'uri', predicate: UDFS.inThread, description: 'Related concrete thread/work site.' },
717
- task: { type: 'uri', predicate: UDFS.task, description: 'Related task.' },
718
- run: { type: 'uri', predicate: UDFS.run, description: 'Related run.' },
1063
+ chat: { type: 'uri', predicate: UDFS.conversation, references: { resource: 'chat', key: 'id' }, description: 'Related chat command surface.' },
1064
+ thread: { type: 'uri', predicate: UDFS.inThread, references: { resource: 'thread', key: 'id' }, description: 'Related concrete thread/work site.' },
1065
+ task: { type: 'uri', predicate: UDFS.task, references: { resource: 'task', key: 'id' }, description: 'Related task.' },
1066
+ run: { type: 'uri', predicate: UDFS.run, references: { resource: 'run', key: 'id' }, description: 'Related run.' },
719
1067
  actor: { type: 'uri', predicate: DCTerms.creator, description: 'Secretary, user, or worker that created the candidate.' },
720
1068
  metadata: { type: 'json', predicate: UDFS.metadata, description: 'Opaque adapter-local metadata; shared relations must be explicit fields.' },
721
1069
  createdAt: { type: 'timestamp', predicate: DCTerms.created, description: 'Creation timestamp.' },
@@ -748,8 +1096,8 @@ export const captureCandidateDescriptor = {
748
1096
  },
749
1097
  },
750
1098
  ],
751
- };
752
- export const captureEventDescriptor = {
1099
+ });
1100
+ export const captureEventDescriptor = definePodModelDescriptor({
753
1101
  uri: UDFS.CaptureEvent,
754
1102
  version: '1.0.0',
755
1103
  source: 'official',
@@ -762,7 +1110,7 @@ export const captureEventDescriptor = {
762
1110
  fields: {
763
1111
  id: idField,
764
1112
  source: { type: 'uri', predicate: DCTerms.source, required: true, description: 'Original message, file, URL, fetched document, or resource considered by capture.' },
765
- captureCandidate: { type: 'uri', predicate: UDFS.captureCandidate, description: 'Candidate resource involved in this event, when applicable.' },
1113
+ captureCandidate: { type: 'uri', predicate: UDFS.captureCandidate, references: { resource: 'capture-candidate', key: 'id' }, description: 'Candidate resource involved in this event, when applicable.' },
766
1114
  targetResource: { type: 'uri', predicate: UDFS.targetResource, description: 'Formal resource affected by this capture decision.' },
767
1115
  decision: { type: 'string', predicate: UDFS.captureDecision, required: true, description: 'Decision such as direct_commit, optimistic_commit, candidate_created, promoted, rejected, corrected, rollback, duplicate, or ignored.' },
768
1116
  suggestedType: { type: 'uri', predicate: UDFS.suggestedType, description: 'Type suggested at decision time.' },
@@ -770,12 +1118,12 @@ export const captureEventDescriptor = {
770
1118
  confidence: { type: 'string', predicate: UDFS.confidence, description: 'Classifier confidence at decision time.' },
771
1119
  reason: { type: 'text', predicate: UDFS.reason, description: 'Explanation for the capture decision.' },
772
1120
  userCorrection: { type: 'text', predicate: UDFS.userCorrection, description: 'User correction to type, target, title, summary, or content.' },
773
- approval: { type: 'uri', predicate: UDFS.approval, description: 'ApprovalRequest controlling an authority gate, if any.' },
774
- inputRequest: { type: 'uri', predicate: UDFS.inputRequest, description: 'InputRequest controlling missing information, if any.' },
775
- chat: { type: 'uri', predicate: UDFS.conversation, description: 'Related chat command surface.' },
776
- thread: { type: 'uri', predicate: UDFS.inThread, description: 'Related concrete thread/work site.' },
777
- task: { type: 'uri', predicate: UDFS.task, description: 'Related task.' },
778
- run: { type: 'uri', predicate: UDFS.run, description: 'Related run.' },
1121
+ approval: { type: 'uri', predicate: UDFS.approval, references: { resource: 'approval', key: 'id' }, description: 'ApprovalRequest controlling an authority gate, if any.' },
1122
+ inputRequest: { type: 'uri', predicate: UDFS.inputRequest, references: { resource: 'input-request', key: 'id' }, description: 'InputRequest controlling missing information, if any.' },
1123
+ chat: { type: 'uri', predicate: UDFS.conversation, references: { resource: 'chat', key: 'id' }, description: 'Related chat command surface.' },
1124
+ thread: { type: 'uri', predicate: UDFS.inThread, references: { resource: 'thread', key: 'id' }, description: 'Related concrete thread/work site.' },
1125
+ task: { type: 'uri', predicate: UDFS.task, references: { resource: 'task', key: 'id' }, description: 'Related task.' },
1126
+ run: { type: 'uri', predicate: UDFS.run, references: { resource: 'run', key: 'id' }, description: 'Related run.' },
779
1127
  actor: { type: 'uri', predicate: DCTerms.creator, description: 'Secretary, user, or worker that made or recorded the decision.' },
780
1128
  about: { type: 'uri', predicate: SCHEMA.about, description: 'Control object or semantic subject the event is about.' },
781
1129
  metadata: { type: 'json', predicate: UDFS.metadata, description: 'Opaque adapter-local metadata; shared relations must be explicit fields.' },
@@ -811,8 +1159,8 @@ export const captureEventDescriptor = {
811
1159
  },
812
1160
  },
813
1161
  ],
814
- };
815
- export const contactDescriptor = {
1162
+ });
1163
+ export const contactDescriptor = definePodModelDescriptor({
816
1164
  uri: UDFS.Contact,
817
1165
  version: '1.0.0',
818
1166
  source: 'official',
@@ -850,8 +1198,8 @@ export const contactDescriptor = {
850
1198
  ],
851
1199
  mergePolicy: 'upsert',
852
1200
  examples: [{ request: 'Create an AI agent contact projection', match: { id: 'agent-secretary.ttl' } }],
853
- };
854
- export const chatDescriptor = {
1201
+ });
1202
+ export const chatDescriptor = definePodModelDescriptor({
855
1203
  uri: MEETING.LongChat,
856
1204
  version: '1.0.0',
857
1205
  source: 'official',
@@ -871,7 +1219,7 @@ export const chatDescriptor = {
871
1219
  starred: { type: 'boolean', predicate: UDFS.favorite, description: 'Favorite flag.' },
872
1220
  muted: { type: 'boolean', predicate: UDFS.muted, description: 'Muted flag.' },
873
1221
  unreadCount: { type: 'number', predicate: UDFS.unreadCount, description: 'Unread message count.' },
874
- contact: { type: 'uri', predicate: UDFS.hasContact, description: 'Optional counterpart/contact represented by this channel.' },
1222
+ contact: { type: 'uri', predicate: UDFS.hasContact, references: { resource: 'contact', key: 'id' }, description: 'Optional counterpart/contact represented by this channel.' },
875
1223
  participants: { type: 'uri', predicate: WF.participant, array: true, description: 'Participant resource URIs.' },
876
1224
  metadata: { type: 'json', predicate: UDFS.metadata, description: 'Opaque adapter/UI metadata.' },
877
1225
  lastActiveAt: { type: 'timestamp', predicate: UDFS.lastActiveAt, description: 'Last activity timestamp.' },
@@ -886,8 +1234,8 @@ export const chatDescriptor = {
886
1234
  ],
887
1235
  mergePolicy: 'upsert',
888
1236
  examples: [{ request: 'Create a team chat surface', match: { id: 'team/index.ttl#this' } }],
889
- };
890
- export const threadDescriptor = {
1237
+ });
1238
+ export const threadDescriptor = definePodModelDescriptor({
891
1239
  uri: SIOC.Thread,
892
1240
  version: '1.0.0',
893
1241
  source: 'official',
@@ -910,8 +1258,8 @@ export const threadDescriptor = {
910
1258
  writableFields: ['parent', 'title', 'status', 'starred', 'workspace', 'metadata'],
911
1259
  mergePolicy: 'upsert',
912
1260
  examples: [{ request: 'Create a thread under a chat surface', match: { id: 'chat/team/index.ttl#thread' } }],
913
- };
914
- export const messageDescriptor = {
1261
+ });
1262
+ export const messageDescriptor = definePodModelDescriptor({
915
1263
  uri: MEETING.Message,
916
1264
  version: '1.0.0',
917
1265
  source: 'official',
@@ -924,8 +1272,8 @@ export const messageDescriptor = {
924
1272
  fields: {
925
1273
  id: idField,
926
1274
  parent: { type: 'uri', predicate: SIOC.has_parent, required: true, description: 'Parent command surface/container URI.' },
927
- chat: { type: 'uri', predicate: WF.message, description: 'Solid Chat compatibility containment relation.' },
928
- thread: { type: 'uri', predicate: SIOC.has_member, description: 'Thread containment relation.' },
1275
+ chat: { type: 'uri', predicate: WF.message, references: { resource: 'chat', key: 'id' }, description: 'Solid Chat compatibility containment relation.' },
1276
+ thread: { type: 'uri', predicate: SIOC.has_member, references: { resource: 'thread', key: 'id' }, description: 'Thread containment relation.' },
929
1277
  maker: { type: 'uri', predicate: FOAF.maker, description: 'Author resource IRI.' },
930
1278
  role: { type: 'string', predicate: UDFS.messageType, description: 'Message role.' },
931
1279
  content: { type: 'text', predicate: SIOC.content, required: true, description: 'Plain text content.' },
@@ -953,8 +1301,8 @@ export const messageDescriptor = {
953
1301
  ],
954
1302
  mergePolicy: 'append',
955
1303
  examples: [{ request: 'Append a message under a team chat', match: { id: 'chat/team/2026/06/14/messages.ttl#msg_1' } }],
956
- };
957
- export const chatProjectContextDescriptor = {
1304
+ });
1305
+ export const chatProjectContextDescriptor = definePodModelDescriptor({
958
1306
  uri: UDFS.ChatProjectContext,
959
1307
  version: '1.0.0',
960
1308
  source: 'official',
@@ -976,8 +1324,8 @@ export const chatProjectContextDescriptor = {
976
1324
  writableFields: ['workspace', 'instructions', 'memoryEnabled', 'createdAt', 'updatedAt'],
977
1325
  mergePolicy: 'upsert',
978
1326
  examples: [{ request: 'Save shared instructions for a workspace', match: { id: 'workspace-key.ttl' } }],
979
- };
980
- export const chatProjectMemoryDescriptor = {
1327
+ });
1328
+ export const chatProjectMemoryDescriptor = definePodModelDescriptor({
981
1329
  uri: UDFS.ProjectMemory,
982
1330
  version: '1.0.0',
983
1331
  source: 'official',
@@ -999,8 +1347,8 @@ export const chatProjectMemoryDescriptor = {
999
1347
  writableFields: ['workspace', 'text', 'sourceMessage', 'createdAt', 'updatedAt'],
1000
1348
  mergePolicy: 'upsert',
1001
1349
  examples: [{ request: 'Remember an explicit project fact', match: { id: 'memory-id.ttl' } }],
1002
- };
1003
- export const conversationShareDescriptor = {
1350
+ });
1351
+ export const conversationShareDescriptor = definePodModelDescriptor({
1004
1352
  uri: UDFS.ConversationShare,
1005
1353
  version: '1.0.0',
1006
1354
  source: 'official',
@@ -1023,8 +1371,8 @@ export const conversationShareDescriptor = {
1023
1371
  writableFields: ['thread', 'resourceUrl', 'includeToolDetails', 'excludedMessageIds', 'createdAt', 'revokedAt'],
1024
1372
  mergePolicy: 'upsert',
1025
1373
  examples: [{ request: 'Record a read-only conversation share', match: { id: 'share-id.ttl' } }],
1026
- };
1027
- export const ideaDescriptor = {
1374
+ });
1375
+ export const ideaDescriptor = definePodModelDescriptor({
1028
1376
  uri: UDFS.Idea,
1029
1377
  version: '1.0.0',
1030
1378
  source: 'official',
@@ -1048,8 +1396,8 @@ export const ideaDescriptor = {
1048
1396
  conflicts: { type: 'text', predicate: UDFS.conflicts, array: true, description: 'Potential semantic conflicts.' },
1049
1397
  nextStep: { type: 'text', predicate: UDFS.nextStep, description: 'Suggested next action.' },
1050
1398
  promotedTo: { type: 'uri', predicate: UDFS.promotedTo, description: 'Committed resource created from the idea.' },
1051
- chat: { type: 'uri', predicate: UDFS.conversation, description: 'Source chat.' },
1052
- thread: { type: 'uri', predicate: UDFS.inThread, description: 'Source thread.' },
1399
+ chat: { type: 'uri', predicate: UDFS.conversation, references: { resource: 'chat', key: 'id' }, description: 'Source chat.' },
1400
+ thread: { type: 'uri', predicate: UDFS.inThread, references: { resource: 'thread', key: 'id' }, description: 'Source thread.' },
1053
1401
  sourceMessages: { type: 'uri', predicate: DCTerms.source, array: true, description: 'Source messages.' },
1054
1402
  createdBy: { type: 'uri', predicate: DCTerms.creator, description: 'Creator WebID or agent URI.' },
1055
1403
  metadata: { type: 'json', predicate: UDFS.metadata, description: 'Opaque adapter metadata.' },
@@ -1067,8 +1415,8 @@ export const ideaDescriptor = {
1067
1415
  match: { id: '2026/05/28.ttl#idea_symphony_quality_metrics' },
1068
1416
  },
1069
1417
  ],
1070
- };
1071
- export const issueDescriptor = {
1418
+ });
1419
+ export const issueDescriptor = definePodModelDescriptor({
1072
1420
  uri: UDFS.Issue,
1073
1421
  version: '1.0.0',
1074
1422
  source: 'official',
@@ -1089,9 +1437,9 @@ export const issueDescriptor = {
1089
1437
  status: { type: 'string', predicate: UDFS.status, description: 'Issue lifecycle status.' },
1090
1438
  priority: { type: 'string', predicate: UDFS.priority, description: 'Issue priority.' },
1091
1439
  labels: { type: 'text', predicate: UDFS.tags, array: true, description: 'Tags or labels.' },
1092
- chat: { type: 'uri', predicate: UDFS.conversation, description: 'Owning or source chat.' },
1093
- thread: { type: 'uri', predicate: UDFS.inThread, description: 'Owning or source thread.' },
1094
- parentIssue: { type: 'uri', predicate: UDFS.parentIssue, description: 'Parent issue.' },
1440
+ chat: { type: 'uri', predicate: UDFS.conversation, references: { resource: 'chat', key: 'id' }, description: 'Owning or source chat.' },
1441
+ thread: { type: 'uri', predicate: UDFS.inThread, references: { resource: 'thread', key: 'id' }, description: 'Owning or source thread.' },
1442
+ parentIssue: { type: 'uri', predicate: UDFS.parentIssue, references: { resource: 'issue', key: 'id' }, description: 'Parent issue.' },
1095
1443
  tasks: { type: 'uri', predicate: UDFS.task, array: true, description: 'Executable task slices.' },
1096
1444
  createdBy: { type: 'uri', predicate: DCTerms.creator, description: 'Creator WebID or agent URI.' },
1097
1445
  assignedTo: { type: 'uri', predicate: UDFS.assignedTo, description: 'Assignee WebID or agent URI.' },
@@ -1110,8 +1458,8 @@ export const issueDescriptor = {
1110
1458
  match: { id: 'issue_symphony_runtime_projection.ttl' },
1111
1459
  },
1112
1460
  ],
1113
- };
1114
- export const taskDescriptor = {
1461
+ });
1462
+ export const taskDescriptor = definePodModelDescriptor({
1115
1463
  uri: UDFS.Task,
1116
1464
  version: '1.0.0',
1117
1465
  source: 'official',
@@ -1126,7 +1474,7 @@ export const taskDescriptor = {
1126
1474
  title: { type: 'string', predicate: DCTerms.title, description: 'Task title.' },
1127
1475
  instruction: { type: 'text', predicate: UDFS.instruction, required: true, description: 'Executable instruction.' },
1128
1476
  prompt: { type: 'text', predicate: UDFS.prompt, description: 'Runtime prompt projection.' },
1129
- issue: { type: 'uri', predicate: UDFS.issue, description: 'Originating issue.' },
1477
+ issue: { type: 'uri', predicate: UDFS.issue, references: { resource: 'issue', key: 'id' }, description: 'Originating issue.' },
1130
1478
  message: { type: 'uri', predicate: UDFS.message, description: 'Message that produced this task.' },
1131
1479
  workspace: { type: 'uri', predicate: UDFS.workspace, required: true, description: 'Workspace URI.' },
1132
1480
  status: { type: 'string', predicate: UDFS.status, description: 'Task lifecycle status.' },
@@ -1147,8 +1495,8 @@ export const taskDescriptor = {
1147
1495
  match: { id: 'task_symphony_worker_projection' },
1148
1496
  },
1149
1497
  ],
1150
- };
1151
- export const scheduleDescriptor = {
1498
+ });
1499
+ export const scheduleDescriptor = definePodModelDescriptor({
1152
1500
  uri: UDFS.Schedule,
1153
1501
  version: '1.0.0',
1154
1502
  source: 'official',
@@ -1160,7 +1508,7 @@ export const scheduleDescriptor = {
1160
1508
  storage: exactIdStorage(),
1161
1509
  fields: {
1162
1510
  id: idField,
1163
- task: { type: 'uri', predicate: UDFS.task, required: true, description: 'Scheduled task.' },
1511
+ task: { type: 'uri', predicate: UDFS.task, references: { resource: 'task', key: 'id' }, required: true, description: 'Scheduled task.' },
1164
1512
  status: { type: 'string', predicate: UDFS.status, description: 'Schedule lifecycle status.' },
1165
1513
  scheduleKind: { type: 'string', predicate: UDFS.scheduleKind, description: 'Schedule kind: once, interval, or cron.' },
1166
1514
  cron: { type: 'string', predicate: UDFS.cron, description: 'Cron expression.' },
@@ -1175,8 +1523,8 @@ export const scheduleDescriptor = {
1175
1523
  writableFields: ['task', 'status', 'scheduleKind', 'cron', 'intervalSeconds', 'timezone', 'startsAt', 'nextRunAt', 'lastRunAt', 'metadata'],
1176
1524
  mergePolicy: 'upsert',
1177
1525
  examples: [{ request: 'Create a time trigger for a task', match: { id: 'schedules/schedule_1.ttl' } }],
1178
- };
1179
- export const automationRuleDescriptor = {
1526
+ });
1527
+ export const automationRuleDescriptor = definePodModelDescriptor({
1180
1528
  uri: UDFS.AutomationRule,
1181
1529
  version: '1.0.0',
1182
1530
  source: 'official',
@@ -1192,8 +1540,8 @@ export const automationRuleDescriptor = {
1192
1540
  description: { type: 'text', predicate: DCTerms.description, description: 'Rule description.' },
1193
1541
  status: { type: 'string', predicate: UDFS.status, description: 'Rule lifecycle status.' },
1194
1542
  ruleKind: { type: 'string', predicate: UDFS.ruleKind, description: 'Rule kind: event, schedule, or manual.' },
1195
- task: { type: 'uri', predicate: UDFS.task, description: 'Task dispatched by this rule.' },
1196
- schedule: { type: 'uri', predicate: UDFS.schedule, description: 'Schedule that triggers this rule.' },
1543
+ task: { type: 'uri', predicate: UDFS.task, references: { resource: 'task', key: 'id' }, description: 'Task dispatched by this rule.' },
1544
+ schedule: { type: 'uri', predicate: UDFS.schedule, references: { resource: 'schedule', key: 'id' }, description: 'Schedule that triggers this rule.' },
1197
1545
  source: { type: 'uri', predicate: DCTerms.source, description: 'Source resource.' },
1198
1546
  target: { type: 'uri', predicate: AS.target, description: 'Target resource.' },
1199
1547
  condition: { type: 'json', predicate: UDFS.condition, description: 'Structured condition.' },
@@ -1206,8 +1554,8 @@ export const automationRuleDescriptor = {
1206
1554
  writableFields: ['title', 'description', 'status', 'ruleKind', 'task', 'schedule', 'source', 'target', 'condition', 'actions', 'metadata', 'lastTriggeredAt', 'lastRunStatus'],
1207
1555
  mergePolicy: 'upsert',
1208
1556
  examples: [{ request: 'Create an automation rule that dispatches a task', match: { id: 'automation/rule_1.ttl' } }],
1209
- };
1210
- export const deliveryDescriptor = {
1557
+ });
1558
+ export const deliveryDescriptor = definePodModelDescriptor({
1211
1559
  uri: UDFS.Delivery,
1212
1560
  version: '1.0.0',
1213
1561
  source: 'official',
@@ -1221,12 +1569,12 @@ export const deliveryDescriptor = {
1221
1569
  id: idField,
1222
1570
  kind: { type: 'string', predicate: UDFS.deliveryKind, description: 'Delivery kind.' },
1223
1571
  status: { type: 'string', predicate: UDFS.status, description: 'Delivery lifecycle status.' },
1224
- task: { type: 'uri', predicate: UDFS.task, description: 'Task being delivered.' },
1572
+ task: { type: 'uri', predicate: UDFS.task, references: { resource: 'task', key: 'id' }, description: 'Task being delivered.' },
1225
1573
  source: { type: 'uri', predicate: DCTerms.source, description: 'Source resource.' },
1226
1574
  target: { type: 'uri', predicate: AS.target, description: 'Target resource.' },
1227
- chat: { type: 'uri', predicate: UDFS.conversation, description: 'Related chat.' },
1228
- thread: { type: 'uri', predicate: UDFS.inThread, description: 'Source thread.' },
1229
- targetThread: { type: 'uri', predicate: UDFS.targetThread, description: 'Target thread.' },
1575
+ chat: { type: 'uri', predicate: UDFS.conversation, references: { resource: 'chat', key: 'id' }, description: 'Related chat.' },
1576
+ thread: { type: 'uri', predicate: UDFS.inThread, references: { resource: 'thread', key: 'id' }, description: 'Source thread.' },
1577
+ targetThread: { type: 'uri', predicate: UDFS.targetThread, references: { resource: 'thread', key: 'id' }, description: 'Target thread.' },
1230
1578
  targetSession: { type: 'uri', predicate: UDFS.targetSession, description: 'Target session.' },
1231
1579
  actor: { type: 'uri', predicate: AS.actor, description: 'Actor.' },
1232
1580
  object: { type: 'uri', predicate: AS.object, description: 'Object resource.' },
@@ -1248,8 +1596,8 @@ export const deliveryDescriptor = {
1248
1596
  ],
1249
1597
  mergePolicy: 'upsert',
1250
1598
  examples: [{ request: 'Create a worker delivery package', match: { id: 'task/symphony/2026/05/28/deliveries.ttl#delivery_1' } }],
1251
- };
1252
- export const runDescriptor = {
1599
+ });
1600
+ export const runDescriptor = definePodModelDescriptor({
1253
1601
  uri: UDFS.Run,
1254
1602
  version: '1.0.0',
1255
1603
  source: 'official',
@@ -1261,11 +1609,11 @@ export const runDescriptor = {
1261
1609
  storage: exactIdStorage(),
1262
1610
  fields: {
1263
1611
  id: idField,
1264
- task: { type: 'uri', predicate: UDFS.task, description: 'Task being executed.' },
1265
- delivery: { type: 'uri', predicate: UDFS.delivery, description: 'Delivery that caused or carries this run.' },
1612
+ task: { type: 'uri', predicate: UDFS.task, references: { resource: 'task', key: 'id' }, description: 'Task being executed.' },
1613
+ delivery: { type: 'uri', predicate: UDFS.delivery, references: { resource: 'delivery', key: 'id' }, description: 'Delivery that caused or carries this run.' },
1266
1614
  trigger: { type: 'uri', predicate: UDFS.trigger, description: 'Resource that triggered the run.' },
1267
1615
  input: { type: 'uri', predicate: UDFS.input, description: 'Concrete input/context projection resource.' },
1268
- thread: { type: 'uri', predicate: UDFS.inThread, required: true, description: 'Runtime thread.' },
1616
+ thread: { type: 'uri', predicate: UDFS.inThread, references: { resource: 'thread', key: 'id' }, required: true, description: 'Runtime thread.' },
1269
1617
  workspace: { type: 'uri', predicate: UDFS.workspace, required: true, description: 'Workspace URI.' },
1270
1618
  status: { type: 'string', predicate: UDFS.status, description: 'Run lifecycle status.' },
1271
1619
  runner: { type: 'string', predicate: UDFS.runner, required: true, description: 'Runtime implementation.' },
@@ -1288,8 +1636,8 @@ export const runDescriptor = {
1288
1636
  ],
1289
1637
  mergePolicy: 'upsert',
1290
1638
  examples: [{ request: 'Record a runtime execution attempt', match: { id: 'task/symphony/2026/05/28/runs.ttl#run_1' } }],
1291
- };
1292
- export const runStepDescriptor = {
1639
+ });
1640
+ export const runStepDescriptor = definePodModelDescriptor({
1293
1641
  uri: UDFS.RunStep,
1294
1642
  version: '1.0.0',
1295
1643
  source: 'official',
@@ -1301,7 +1649,7 @@ export const runStepDescriptor = {
1301
1649
  storage: exactIdStorage(),
1302
1650
  fields: {
1303
1651
  id: idField,
1304
- run: { type: 'uri', predicate: UDFS.run, required: true, description: 'Run this step belongs to.' },
1652
+ run: { type: 'uri', predicate: UDFS.run, references: { resource: 'run', key: 'id' }, required: true, description: 'Run this step belongs to.' },
1305
1653
  stepType: { type: 'string', predicate: UDFS.stepType, required: true, description: 'RunStep event type.' },
1306
1654
  message: { type: 'string', predicate: DCTerms.description, description: 'Human-readable step message.' },
1307
1655
  payload: { type: 'json', predicate: UDFS.payload, description: 'Structured step payload.' },
@@ -1310,8 +1658,8 @@ export const runStepDescriptor = {
1310
1658
  writableFields: ['run', 'stepType', 'message', 'payload'],
1311
1659
  mergePolicy: 'append',
1312
1660
  examples: [{ request: 'Append a runtime tool call step', match: { id: 'task/symphony/2026/05/28/runs.ttl#run-step_1' } }],
1313
- };
1314
- export const evidenceDescriptor = {
1661
+ });
1662
+ export const evidenceDescriptor = definePodModelDescriptor({
1315
1663
  uri: UDFS.Evidence,
1316
1664
  version: '1.0.0',
1317
1665
  source: 'official',
@@ -1325,11 +1673,11 @@ export const evidenceDescriptor = {
1325
1673
  id: idField,
1326
1674
  evidenceKind: { type: 'string', predicate: UDFS.evidenceKind, required: true, description: 'Evidence kind.' },
1327
1675
  about: { type: 'uri', predicate: SCHEMA.about, required: true, description: 'Control object this evidence supports.' },
1328
- issue: { type: 'uri', predicate: UDFS.issue, description: 'Related issue.' },
1329
- task: { type: 'uri', predicate: UDFS.task, description: 'Related task.' },
1330
- delivery: { type: 'uri', predicate: UDFS.delivery, description: 'Related delivery.' },
1331
- run: { type: 'uri', predicate: UDFS.run, description: 'Related run.' },
1332
- thread: { type: 'uri', predicate: UDFS.inThread, description: 'Related thread.' },
1676
+ issue: { type: 'uri', predicate: UDFS.issue, references: { resource: 'issue', key: 'id' }, description: 'Related issue.' },
1677
+ task: { type: 'uri', predicate: UDFS.task, references: { resource: 'task', key: 'id' }, description: 'Related task.' },
1678
+ delivery: { type: 'uri', predicate: UDFS.delivery, references: { resource: 'delivery', key: 'id' }, description: 'Related delivery.' },
1679
+ run: { type: 'uri', predicate: UDFS.run, references: { resource: 'run', key: 'id' }, description: 'Related run.' },
1680
+ thread: { type: 'uri', predicate: UDFS.inThread, references: { resource: 'thread', key: 'id' }, description: 'Related thread.' },
1333
1681
  summary: { type: 'text', predicate: DCTerms.abstract, description: 'Evidence summary.' },
1334
1682
  source: { type: 'uri', predicate: DCTerms.source, description: 'Source artifact or document.' },
1335
1683
  actor: { type: 'uri', predicate: DCTerms.creator, description: 'Actor that produced the evidence.' },
@@ -1340,8 +1688,8 @@ export const evidenceDescriptor = {
1340
1688
  writableFields: ['evidenceKind', 'about', 'issue', 'task', 'delivery', 'run', 'thread', 'summary', 'source', 'actor', 'outcome', 'metadata'],
1341
1689
  mergePolicy: 'append',
1342
1690
  examples: [{ request: 'Record test evidence for a task', match: { id: 'task/symphony/2026/05/28/evidence.ttl#evidence_1' } }],
1343
- };
1344
- export const reportDescriptor = {
1691
+ });
1692
+ export const reportDescriptor = definePodModelDescriptor({
1345
1693
  uri: UDFS.Report,
1346
1694
  version: '1.0.0',
1347
1695
  source: 'official',
@@ -1357,12 +1705,12 @@ export const reportDescriptor = {
1357
1705
  status: { type: 'string', predicate: UDFS.status, description: 'Report lifecycle status.' },
1358
1706
  outcome: { type: 'string', predicate: UDFS.outcome, description: 'Reported outcome.' },
1359
1707
  about: { type: 'uri', predicate: SCHEMA.about, required: true, description: 'Control object being summarized.' },
1360
- issue: { type: 'uri', predicate: UDFS.issue, description: 'Related issue.' },
1361
- task: { type: 'uri', predicate: UDFS.task, description: 'Related task.' },
1362
- delivery: { type: 'uri', predicate: UDFS.delivery, description: 'Related delivery.' },
1363
- run: { type: 'uri', predicate: UDFS.run, description: 'Related run.' },
1364
- thread: { type: 'uri', predicate: UDFS.inThread, description: 'Related thread.' },
1365
- evidence: { type: 'uri', predicate: UDFS.evidence, array: true, description: 'Evidence summarized by this report.' },
1708
+ issue: { type: 'uri', predicate: UDFS.issue, references: { resource: 'issue', key: 'id' }, description: 'Related issue.' },
1709
+ task: { type: 'uri', predicate: UDFS.task, references: { resource: 'task', key: 'id' }, description: 'Related task.' },
1710
+ delivery: { type: 'uri', predicate: UDFS.delivery, references: { resource: 'delivery', key: 'id' }, description: 'Related delivery.' },
1711
+ run: { type: 'uri', predicate: UDFS.run, references: { resource: 'run', key: 'id' }, description: 'Related run.' },
1712
+ thread: { type: 'uri', predicate: UDFS.inThread, references: { resource: 'thread', key: 'id' }, description: 'Related thread.' },
1713
+ evidence: { type: 'uri', predicate: UDFS.evidence, references: { resource: 'evidence', key: 'id' }, array: true, description: 'Evidence summarized by this report.' },
1366
1714
  summary: { type: 'text', predicate: DCTerms.abstract, required: true, description: 'Report summary.' },
1367
1715
  reviewer: { type: 'uri', predicate: SCHEMA.reviewedBy, description: 'Reviewer.' },
1368
1716
  actor: { type: 'uri', predicate: DCTerms.creator, description: 'Actor that produced the report.' },
@@ -1379,8 +1727,8 @@ export const reportDescriptor = {
1379
1727
  ],
1380
1728
  mergePolicy: 'upsert',
1381
1729
  examples: [{ request: 'Publish a worker handoff report', match: { id: 'task/symphony/2026/05/28/reports.ttl#report_1' } }],
1382
- };
1383
- export const sessionDescriptor = {
1730
+ });
1731
+ export const sessionDescriptor = definePodModelDescriptor({
1384
1732
  uri: UDFS.term('Session'),
1385
1733
  version: '1.0.0',
1386
1734
  source: 'official',
@@ -1393,8 +1741,8 @@ export const sessionDescriptor = {
1393
1741
  fields: {
1394
1742
  id: idField,
1395
1743
  owner: { type: 'uri', predicate: UDFS.actor, required: true, description: 'Session owner.' },
1396
- chat: { type: 'uri', predicate: UDFS.conversation, description: 'Related chat.' },
1397
- thread: { type: 'uri', predicate: UDFS.inThread, description: 'Related thread.' },
1744
+ chat: { type: 'uri', predicate: UDFS.conversation, references: { resource: 'chat', key: 'id' }, description: 'Related chat.' },
1745
+ thread: { type: 'uri', predicate: UDFS.inThread, references: { resource: 'thread', key: 'id' }, description: 'Related thread.' },
1398
1746
  status: { type: 'string', predicate: UDFS.sessionStatus, description: 'Session lifecycle status.' },
1399
1747
  tool: { type: 'string', predicate: UDFS.sessionTool, description: 'Runtime tool or backend.' },
1400
1748
  tokenUsage: { type: 'number', predicate: UDFS.tokenUsage, description: 'Token usage.' },
@@ -1408,11 +1756,13 @@ export const sessionDescriptor = {
1408
1756
  writableFields: ['owner', 'chat', 'thread', 'status', 'tool', 'tokenUsage', 'messages', 'policy', 'policyVersion', 'metadata', 'archivedAt'],
1409
1757
  mergePolicy: 'upsert',
1410
1758
  examples: [{ request: 'Record a worker runtime session', match: { id: '2026/05/28/sess_1.ttl' } }],
1411
- };
1759
+ });
1412
1760
  export const officialPodModelDescriptors = [
1413
1761
  credentialDescriptor,
1414
1762
  gatewayAccessKeyDescriptor,
1415
1763
  quotaSnapshotDescriptor,
1764
+ aiProviderDescriptor,
1765
+ aiModelDescriptor,
1416
1766
  contactDescriptor,
1417
1767
  chatDescriptor,
1418
1768
  threadDescriptor,