@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
@@ -72,6 +72,10 @@ class PodConnectedCredentialRepository {
72
72
  enabled: record.enabled === false ? false : !record.reauthRequired,
73
73
  accountLabel: record.accountLabel,
74
74
  models: selectedModelIds ?? modelsFromMetadata(record.metadata),
75
+ // The Pod also stores the name discovery gave each picked model. The
76
+ // published model list renders the same name-over-id line as the
77
+ // settings pages, so carry the names instead of dropping them here.
78
+ modelNames: modelNamesFromSelectedModels(record.selectedModels),
75
79
  customModels: customModelsFromMetadata(record.metadata),
76
80
  defaultModel: defaultModelFromMetadata(record.metadata),
77
81
  priority: record.priority ?? 100,
@@ -1449,6 +1453,42 @@ class DeepSeekConnectAdapter {
1449
1453
  }
1450
1454
  exports.DeepSeekConnectAdapter = DeepSeekConnectAdapter;
1451
1455
  class ProviderConnectService {
1456
+ /** Cloud settings only manage providers this deployment provides. */
1457
+ requireProvidedProvider(deployment, provider) {
1458
+ if (!this.registry.isProvidedInDeployment(provider, deployment)) {
1459
+ throw new Error('provider_not_available_in_deployment');
1460
+ }
1461
+ }
1462
+ /**
1463
+ * Cloud owns the endpoint: a caller may not point a provided provider at its
1464
+ * own base URL or proxy. Supplying the provided endpoint verbatim (what the
1465
+ * applet does when it fills the offering default) stays valid.
1466
+ */
1467
+ assertEndpointIsProvided(input) {
1468
+ if (input.deployment !== 'cloud') {
1469
+ return;
1470
+ }
1471
+ const proxyUrl = input.proxyUrl?.trim();
1472
+ if (proxyUrl) {
1473
+ throw new Error('provider_endpoint_not_configurable_in_cloud');
1474
+ }
1475
+ const baseUrl = input.baseUrl?.trim();
1476
+ if (!baseUrl) {
1477
+ return;
1478
+ }
1479
+ const provided = new Set(this.providedEndpoints(input.provider));
1480
+ if (!provided.has(normalizeEndpoint(baseUrl))) {
1481
+ throw new Error('provider_endpoint_not_configurable_in_cloud');
1482
+ }
1483
+ }
1484
+ providedEndpoints(provider) {
1485
+ const descriptor = this.registry.getProvider(normalizeProvider(provider));
1486
+ const product = this.registry.getProduct(normalizeProvider(provider));
1487
+ return [
1488
+ descriptor?.defaultBaseUrl,
1489
+ ...(product?.offerings.flatMap((offering) => offering.endpoints.map((endpoint) => endpoint.baseUrl)) ?? []),
1490
+ ].filter((value) => Boolean(value));
1491
+ }
1452
1492
  constructor(options) {
1453
1493
  this.adapters = new Map();
1454
1494
  this.localSessionImporters = new Map();
@@ -1482,6 +1522,7 @@ class ProviderConnectService {
1482
1522
  message,
1483
1523
  });
1484
1524
  }
1525
+ this.requireProvidedProvider(input.deployment, input.provider);
1485
1526
  return this.requireAdapter(input.provider, offeringId, input.requestedMode).begin({
1486
1527
  ...input,
1487
1528
  offeringId,
@@ -1508,7 +1549,10 @@ class ProviderConnectService {
1508
1549
  }));
1509
1550
  }
1510
1551
  async listProviders(input) {
1511
- return Promise.all(this.registry.listProviders().map(async (descriptor) => {
1552
+ // Cloud settings only offer the providers this deployment provides, with the
1553
+ // endpoints the catalog names; self-hosted and local-daemon providers are
1554
+ // Local-only.
1555
+ return Promise.all(this.registry.listProvidedProviders(input.deployment).map(async (descriptor) => {
1512
1556
  const credential = this.credentialRepository?.getCredential
1513
1557
  ? await this.credentialRepository.getCredential({
1514
1558
  ...input,
@@ -1549,8 +1593,10 @@ class ProviderConnectService {
1549
1593
  }));
1550
1594
  }
1551
1595
  async listProviderCredentialPools(input) {
1596
+ const providedProducts = this.registry.listProducts()
1597
+ .filter((product) => this.registry.isProvidedInDeployment(product.id, input.deployment));
1552
1598
  if (!this.credentialRepository) {
1553
- return this.registry.listProducts().map((product) => ({
1599
+ return providedProducts.map((product) => ({
1554
1600
  id: product.id,
1555
1601
  name: product.label,
1556
1602
  status: 'unconfigured',
@@ -1559,7 +1605,7 @@ class ProviderConnectService {
1559
1605
  selectedModels: [],
1560
1606
  }));
1561
1607
  }
1562
- return Promise.all(this.registry.listProducts().map(async (product) => {
1608
+ return Promise.all(providedProducts.map(async (product) => {
1563
1609
  const runtimeProviders = new Set(product.offerings.flatMap((offering) => offering.runtimeProviderIds));
1564
1610
  const credentials = (await Promise.all([...runtimeProviders].map((provider) => this.credentialRepository.listProviderCredentials({
1565
1611
  ...input,
@@ -1572,7 +1618,7 @@ class ProviderConnectService {
1572
1618
  status: aggregateProviderPoolStatus(publicCredentials),
1573
1619
  offerings: product.offerings.map(publicOfferingSummary),
1574
1620
  credentials: publicCredentials,
1575
- selectedModels: selectedModelsFromCredentials(credentials),
1621
+ selectedModels: selectedModelsFromCredentials(credentials, this.registry),
1576
1622
  };
1577
1623
  }));
1578
1624
  }
@@ -1580,6 +1626,13 @@ class ProviderConnectService {
1580
1626
  if (!this.credentialRepository || !this.vault) {
1581
1627
  throw new Error('credential_pool_not_configured');
1582
1628
  }
1629
+ this.requireProvidedProvider(input.deployment, input.provider);
1630
+ this.assertEndpointIsProvided({
1631
+ deployment: input.deployment,
1632
+ provider: input.provider,
1633
+ baseUrl: input.baseUrl,
1634
+ proxyUrl: input.proxyUrl,
1635
+ });
1583
1636
  const provider = normalizeProvider(input.provider);
1584
1637
  const offeringId = requireApiKeyOffering(provider, input.offeringId);
1585
1638
  const proxyUrl = (0, provider_http_transport_1.normalizeProviderProxyUrl)(input.proxyUrl);
@@ -1615,6 +1668,12 @@ class ProviderConnectService {
1615
1668
  async createLocalCredential(input) {
1616
1669
  if (!this.credentialRepository || !this.vault)
1617
1670
  throw new Error('credential_pool_not_configured');
1671
+ this.requireProvidedProvider(input.deployment, input.provider);
1672
+ this.assertEndpointIsProvided({
1673
+ deployment: input.deployment,
1674
+ provider: input.provider,
1675
+ baseUrl: input.baseUrl,
1676
+ });
1618
1677
  const key = JSON.stringify([input.webId, input.deployment, normalizeProvider(input.provider),
1619
1678
  this.requireLocalOffering(normalizeProvider(input.provider), input.offeringId)]);
1620
1679
  const previous = ProviderConnectService.localImportLocks.get(key) ?? Promise.resolve();
@@ -1775,6 +1834,13 @@ class ProviderConnectService {
1775
1834
  return { ...result, ...metadataWithoutUndefined({ ...kimiAccountIdentityHint(input.provider, result.accessToken) }) };
1776
1835
  }
1777
1836
  async updateCredential(input) {
1837
+ this.requireProvidedProvider(input.deployment, input.provider);
1838
+ this.assertEndpointIsProvided({
1839
+ deployment: input.deployment,
1840
+ provider: input.provider,
1841
+ baseUrl: input.patch.baseUrl,
1842
+ proxyUrl: input.patch.proxyUrl,
1843
+ });
1778
1844
  if (!this.credentialRepository) {
1779
1845
  throw new Error('credential_pool_not_configured');
1780
1846
  }
@@ -1885,6 +1951,12 @@ class ProviderConnectService {
1885
1951
  return offering.id;
1886
1952
  }
1887
1953
  completeApiKey(input) {
1954
+ this.requireProvidedProvider(input.deployment, input.provider);
1955
+ this.assertEndpointIsProvided({
1956
+ deployment: input.deployment,
1957
+ provider: input.provider,
1958
+ baseUrl: input.baseUrl,
1959
+ });
1888
1960
  const adapter = this.requireAdapter(input.provider, input.offeringId, 'browserAssistedApiKey');
1889
1961
  if (!adapter.completeApiKey) {
1890
1962
  throw new Error('Provider does not support API key Connect completion');
@@ -2211,7 +2283,27 @@ function aggregateProviderPoolStatus(credentials) {
2211
2283
  }
2212
2284
  return 'configured';
2213
2285
  }
2214
- function selectedModelsFromCredentials(credentials) {
2286
+ /**
2287
+ * Display names of the models a credential picked, keyed by model id.
2288
+ *
2289
+ * A model may be listed once per credential, so the first name the Pod stored
2290
+ * for an id wins; a model without a stored name is simply absent and the caller
2291
+ * falls back to the catalog.
2292
+ */
2293
+ function modelNamesFromSelectedModels(selectedModels) {
2294
+ if (!selectedModels?.length) {
2295
+ return undefined;
2296
+ }
2297
+ const names = {};
2298
+ for (const model of selectedModels) {
2299
+ const name = model.displayName?.trim();
2300
+ if (name && names[model.id] === undefined) {
2301
+ names[model.id] = name;
2302
+ }
2303
+ }
2304
+ return Object.keys(names).length > 0 ? names : undefined;
2305
+ }
2306
+ function selectedModelsFromCredentials(credentials, registry) {
2215
2307
  const selected = new Map();
2216
2308
  for (const credential of credentials) {
2217
2309
  if (credential.status !== 'active') {
@@ -2219,8 +2311,9 @@ function selectedModelsFromCredentials(credentials) {
2219
2311
  }
2220
2312
  const metadata = metadataFromRowValue(credential.metadata);
2221
2313
  const provider = normalizeProvider(credential.provider);
2222
- const models = credential.selectedModels
2223
- ?? modelIdsFromMetadata(metadata).map((id) => ({ id, provider }));
2314
+ const models = (credential.selectedModels
2315
+ ?? modelIdsFromMetadata(metadata).map((id) => ({ id, provider })))
2316
+ .map((model) => withCatalogCapabilities(model, provider, registry));
2224
2317
  for (const model of models) {
2225
2318
  const publicModel = { ...model, provider: productProviderId(provider) };
2226
2319
  selected.set(publicModel.resourceId
@@ -2234,12 +2327,38 @@ function selectedModelsFromCredentials(credentials) {
2234
2327
  custom: true,
2235
2328
  inputModalities: custom.inputModalities,
2236
2329
  outputModalities: custom.outputModalities,
2237
- capabilities: custom.capabilities,
2330
+ // The client reads `custom_capabilities` before the catalog flag object,
2331
+ // so a custom model's own tokens survive normalisation.
2332
+ custom_capabilities: custom.capabilities,
2238
2333
  }));
2239
2334
  }
2240
2335
  }
2241
2336
  return [...selected.values()];
2242
2337
  }
2338
+ /**
2339
+ * Fill a selected model's capability evidence from the provider catalog.
2340
+ *
2341
+ * A credential stores only the model ids a user picked, so the summary carried
2342
+ * no capabilities and the model list had nothing to render next to the names.
2343
+ * Custom models are left alone: they declare their own capabilities, and the
2344
+ * catalog has no authority over a user-defined id.
2345
+ */
2346
+ function withCatalogCapabilities(model, provider, registry) {
2347
+ const descriptor = registry.getModelDescriptor(provider, model.id);
2348
+ if (!descriptor) {
2349
+ return model;
2350
+ }
2351
+ const displayName = model.displayName
2352
+ ?? (typeof descriptor.metadata?.name === 'string' ? descriptor.metadata.name : undefined);
2353
+ return {
2354
+ ...model,
2355
+ ...(displayName ? { displayName } : {}),
2356
+ ...(descriptor.capabilities ? { capabilities: descriptor.capabilities } : {}),
2357
+ ...(descriptor.inputModalities
2358
+ ? { modalities: { input: descriptor.inputModalities } }
2359
+ : {}),
2360
+ };
2361
+ }
2243
2362
  function localSessionImporterKey(provider, offeringId) {
2244
2363
  return `${normalizeProvider(provider)}:${normalizeProvider(offeringId)}`;
2245
2364
  }
@@ -2368,12 +2487,12 @@ function createDefaultConnectedCredentialDb(input) {
2368
2487
  function credentialRowFromRecord(record) {
2369
2488
  const metadata = metadataFromRowValue(record.metadata) ?? {};
2370
2489
  const normalizedProvider = normalizeProvider(record.provider);
2371
- if (record.offeringId === undefined) {
2372
- metadata.offeringId = metadata.offeringId ?? defaultOfferingFor(normalizedProvider, record.authMode);
2373
- }
2374
- else {
2375
- metadata.offeringId = record.offeringId;
2376
- }
2490
+ const offeringId = record.offeringId ?? stringMetadata(metadata, 'offeringId')
2491
+ ?? defaultOfferingFor(normalizedProvider, record.authMode);
2492
+ // MIGRATION WINDOW: the offering is the credential's own `udfs:offeringId`
2493
+ // attribute; the `metadata` copy stays for readers built before that column
2494
+ // existed and goes away with the migration.
2495
+ metadata.offeringId = offeringId;
2377
2496
  metadata.priority = record.priority ?? metadata.priority ?? 100;
2378
2497
  metadata.enabled = record.enabled ?? metadata.enabled ?? record.status === 'active';
2379
2498
  if (record.health !== undefined) {
@@ -2389,9 +2508,12 @@ function credentialRowFromRecord(record) {
2389
2508
  return {
2390
2509
  id: record.id,
2391
2510
  owner: record.webId,
2392
- provider: models_1.aiProviderResource.buildId({ id: normalizeProvider(record.provider) }),
2511
+ // The provider relation names the provider, never the offering: every
2512
+ // offering's rows live in `providers/<provider>.ttl`.
2513
+ provider: models_1.aiProviderResource.buildId({ id: normalizedProvider }),
2393
2514
  service: 'ai',
2394
2515
  authMode: record.authMode,
2516
+ offeringId,
2395
2517
  status: record.status,
2396
2518
  encryptedSecret: JSON.stringify(record.encryptedSecret),
2397
2519
  wrappedDataKey: record.encryptedSecret.wrappedDek,
@@ -2445,7 +2567,12 @@ function recordFromCredentialRow(row) {
2445
2567
  proxyUrl: (0, provider_http_transport_1.normalizeProviderProxyUrl)(stringFrom(row.proxyUrl) ?? stringMetadata(metadata, 'proxyUrl')),
2446
2568
  metadata,
2447
2569
  priority: rowPriorityFromMetadata(row) ?? 100,
2448
- offeringId: rowOfferingIdFromMetadata(row) ?? defaultOfferingFor(provider, authMode),
2570
+ // The credential's own attribute wins. The metadata copy and the default
2571
+ // only cover rows written before `udfs:offeringId` existed; the migration
2572
+ // backfills them.
2573
+ offeringId: stringMetadata(row, 'offeringId')
2574
+ ?? rowOfferingIdFromMetadata(row)
2575
+ ?? defaultOfferingFor(provider, authMode),
2449
2576
  enabled: rowEnabledFromMetadata(row) ?? status === 'active',
2450
2577
  health: rowHealthFromMetadata(row) ?? (reauthRequired ? 'reauthRequired' : 'healthy'),
2451
2578
  };
@@ -2802,6 +2929,15 @@ function productProviderId(provider) {
2802
2929
  return customProviderProductId(normalized)
2803
2930
  ?? normalizeProvider(providerProductFor(normalized)?.id ?? normalized);
2804
2931
  }
2932
+ /**
2933
+ * MIGRATION WINDOW ONLY: the offering an old model reference encoded in its
2934
+ * document name (`providers/openai-official-subscription.ttl#gpt-6-astra`).
2935
+ *
2936
+ * A model's document is its provider's, so a reference written now carries no
2937
+ * offering and this returns `undefined`. It stays only until the migration has
2938
+ * normalised the model rows and `hasModel` references already in Pods; a
2939
+ * credential's offering is read from the credential itself.
2940
+ */
2805
2941
  function offeringIdFromProviderReference(value, provider) {
2806
2942
  if (customProviderInstanceCredentialId(value)) {
2807
2943
  return undefined;
@@ -2825,6 +2961,16 @@ function defaultModelFromMetadata(metadata) {
2825
2961
  const value = metadata?.defaultModel;
2826
2962
  return typeof value === 'string' ? value : undefined;
2827
2963
  }
2964
+ function normalizeEndpoint(value) {
2965
+ const trimmed = value.trim();
2966
+ try {
2967
+ const url = new URL(trimmed);
2968
+ return `${url.origin}${url.pathname.replace(/\/+$/u, '')}`.toLowerCase();
2969
+ }
2970
+ catch {
2971
+ return trimmed.replace(/\/+$/u, '').toLowerCase();
2972
+ }
2973
+ }
2828
2974
  function runtimeCredentialFromMetadata(metadata) {
2829
2975
  const value = metadata?.runtimeCredential;
2830
2976
  const runtime = value && typeof value === 'object' && !Array.isArray(value)
@@ -0,0 +1,12 @@
1
+ import { type AiCredentialSecretDecoder } from '../../../ai/service/AiCredentialSecret';
2
+ import type { CredentialVault } from './CredentialVault';
3
+ export interface AiCredentialSecretDecoderOptions {
4
+ /** Decodes wrapped (secret-cell / Cloud KMS) envelopes the Pod stores. */
5
+ vault?: CredentialVault;
6
+ }
7
+ /**
8
+ * Reads a Pod credential secret the way the Gateway does: plaintext payloads
9
+ * first, then the configured credential vault. Embedding/indexing consumers use
10
+ * this so an AI Connections credential behaves the same on both surfaces.
11
+ */
12
+ export declare function createAiCredentialSecretDecoder(options?: AiCredentialSecretDecoderOptions): AiCredentialSecretDecoder;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createAiCredentialSecretDecoder = createAiCredentialSecretDecoder;
4
+ const AiCredentialSecret_1 = require("../../../ai/service/AiCredentialSecret");
5
+ /**
6
+ * Reads a Pod credential secret the way the Gateway does: plaintext payloads
7
+ * first, then the configured credential vault. Embedding/indexing consumers use
8
+ * this so an AI Connections credential behaves the same on both surfaces.
9
+ */
10
+ function createAiCredentialSecretDecoder(options = {}) {
11
+ return async (row, context) => {
12
+ const plaintext = (0, AiCredentialSecret_1.decodePlaintextAiCredentialSecret)(row);
13
+ if (plaintext) {
14
+ return plaintext;
15
+ }
16
+ const envelope = (0, AiCredentialSecret_1.parseCredentialEnvelope)(row.encryptedSecret);
17
+ if (!envelope || !options.vault) {
18
+ return undefined;
19
+ }
20
+ try {
21
+ return await options.vault.open({ webId: context.webId }, context.credentialIri ?? '', context.provider ?? '', envelope);
22
+ }
23
+ catch {
24
+ // A wrapped secret this runtime cannot open is treated as unavailable, the
25
+ // same as any other credential the deployment cannot use.
26
+ return undefined;
27
+ }
28
+ };
29
+ }
30
+ //# sourceMappingURL=AiCredentialSecretDecoder.js.map
@@ -1,4 +1,4 @@
1
- export type GatewayErrorCode = 'invalid_request' | 'invalid_tool_arguments' | 'unsupported_protocol_event' | 'service_access_missing' | 'credential_unavailable' | 'model_not_available' | 'no_model_available' | 'provider_error' | 'internal_error';
1
+ export type GatewayErrorCode = 'invalid_request' | 'invalid_tool_arguments' | 'unsupported_protocol_event' | 'service_access_missing' | 'credential_unavailable' | 'model_not_available' | 'no_model_available' | 'embedding_model_not_allowed' | 'provider_error' | 'internal_error';
2
2
  export interface NormalizedGatewayError {
3
3
  error: {
4
4
  code: GatewayErrorCode;
@@ -0,0 +1,11 @@
1
+ import type { EmbeddingModelCatalog } from '../../../ai/service/EmbeddingModelPolicy';
2
+ import type { ProviderRegistry } from '../providers/ProviderRegistry';
3
+ /**
4
+ * Adapts the ai-gateway provider catalog to the embedding policy.
5
+ *
6
+ * Cloud only provides providers that have a non-local offering: a local-daemon
7
+ * provider such as Ollama would otherwise pin Cloud embedding traffic to the
8
+ * Cloud node's own loopback. The endpoint always comes from the catalog
9
+ * descriptor, which the deployment may override at construction time.
10
+ */
11
+ export declare function createGatewayEmbeddingModelCatalog(registry: ProviderRegistry, deployment: string): EmbeddingModelCatalog;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createGatewayEmbeddingModelCatalog = createGatewayEmbeddingModelCatalog;
4
+ /**
5
+ * Adapts the ai-gateway provider catalog to the embedding policy.
6
+ *
7
+ * Cloud only provides providers that have a non-local offering: a local-daemon
8
+ * provider such as Ollama would otherwise pin Cloud embedding traffic to the
9
+ * Cloud node's own loopback. The endpoint always comes from the catalog
10
+ * descriptor, which the deployment may override at construction time.
11
+ */
12
+ function createGatewayEmbeddingModelCatalog(registry, deployment) {
13
+ const providedInDeployment = (providerId) => registry.isProvidedInDeployment(providerId, deployment);
14
+ return {
15
+ isManagedEmbeddingModel(provider, modelId) {
16
+ const providerId = registry.resolveManagedProviderId(provider);
17
+ if (!providerId || !providedInDeployment(providerId)) {
18
+ return false;
19
+ }
20
+ return registry.isManagedEmbeddingModel(providerId, modelId);
21
+ },
22
+ managedEmbeddingBaseUrl(provider) {
23
+ const providerId = registry.resolveManagedProviderId(provider);
24
+ if (!providerId || !providedInDeployment(providerId)) {
25
+ return undefined;
26
+ }
27
+ return registry.getProvider(providerId)?.defaultBaseUrl;
28
+ },
29
+ };
30
+ }
31
+ //# sourceMappingURL=GatewayEmbeddingModelCatalog.js.map
@@ -244,14 +244,14 @@ class PodModelSelectionRepository {
244
244
  if (!isMissingResourceError(error))
245
245
  throw error;
246
246
  }
247
- // A model uses a fragment IRI inside its offering document. Plain-LDP
247
+ // A model is a fragment IRI inside its provider document. Plain-LDP
248
248
  // findById can fetch that document yet fail to select the fragment subject,
249
249
  // so resolve it through the indexed isProvidedBy relation as a fallback.
250
250
  const document = modelResourceId.split('#', 1)[0];
251
- const offeringIri = buildProviderResourceIri(webId, `${document}#this`);
251
+ const providerIri = buildProviderResourceIri(webId, `${document}#this`);
252
252
  const rows = await db.select()
253
253
  .from(models_1.aiModelResource)
254
- .where((0, drizzle_solid_1.eq)(models_1.aiModelResource.isProvidedBy, offeringIri))
254
+ .where((0, drizzle_solid_1.eq)(models_1.aiModelResource.isProvidedBy, providerIri))
255
255
  .execute();
256
256
  return rows.find((row) => modelRowMatchesResourceId(row, modelResourceId, webId)) ?? null;
257
257
  }
@@ -556,6 +556,10 @@ function selectedModelResourceIdFromRelation(value, webId) {
556
556
  }
557
557
  function resourceBelongsToProvider(resourceId, providerId) {
558
558
  const document = resourceId.split('#', 1)[0];
559
+ // `startsWith` is a MIGRATION WINDOW allowance for `hasModel` entries written
560
+ // while the offering was encoded in the provider document name
561
+ // (`openai-official-subscription.ttl`); new selections only name
562
+ // `settings/providers/<provider>.ttl`.
559
563
  return document === `${providerId}.ttl` || document.startsWith(`${providerId}-`);
560
564
  }
561
565
  function modelProviderRelationMatches(value, modelResourceId, webId) {
@@ -1,11 +1,23 @@
1
1
  import type { GatewayDeployment } from '../auth/InvocationTokenCodec';
2
2
  import type { AuthContext } from '../../auth/AuthContext';
3
+ import { EmbeddingModelPolicy } from '../../../ai/service/EmbeddingModelPolicy';
3
4
  import { type CustomProviderModel, type PodCredentialRepository } from '../connect';
5
+ import { type ProviderRegistry } from '../providers/ProviderRegistry';
4
6
  export interface ProviderCustomModelsServiceOptions {
5
7
  credentialRepository: PodCredentialRepository;
8
+ /** Provider catalog; decides which providers this deployment offers at all. */
9
+ registry?: ProviderRegistry;
10
+ /**
11
+ * Deployment policy for embedding declarations. A cloud deployment only
12
+ * provides embedding models from the ai-gateway catalog, so a custom model may
13
+ * not claim embedding capability for a model the catalog does not provide.
14
+ */
15
+ embeddingModelPolicy?: EmbeddingModelPolicy;
6
16
  }
7
17
  export declare class ProviderCustomModelsService {
8
18
  private readonly credentialRepository;
19
+ private readonly embeddingModelPolicy;
20
+ private readonly registry;
9
21
  constructor(options: ProviderCustomModelsServiceOptions);
10
22
  upsert(input: {
11
23
  webId: string;
@@ -21,6 +33,12 @@ export declare class ProviderCustomModelsService {
21
33
  modelId: string;
22
34
  auth?: AuthContext;
23
35
  }): Promise<CustomProviderModel[]>;
36
+ /**
37
+ * A custom model may only declare embedding capability when the deployment
38
+ * provides that exact provider/model as an embedding model. Local deployments
39
+ * allow any declaration; cloud deployments do not.
40
+ */
41
+ private assertEmbeddingDeclarationAllowed;
24
42
  private requireCredential;
25
43
  private persistMetadata;
26
44
  }
@@ -1,16 +1,24 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ProviderCustomModelsService = void 0;
4
+ const EmbeddingModelPolicy_1 = require("../../../ai/service/EmbeddingModelPolicy");
4
5
  const connect_1 = require("../connect");
5
6
  const ProviderQuotaAdapter_1 = require("../quota/ProviderQuotaAdapter");
7
+ const ProviderRegistry_1 = require("../providers/ProviderRegistry");
6
8
  class ProviderCustomModelsService {
7
9
  constructor(options) {
8
10
  this.credentialRepository = options.credentialRepository;
11
+ this.embeddingModelPolicy = options.embeddingModelPolicy ?? EmbeddingModelPolicy_1.EmbeddingModelPolicy.allowAll();
12
+ this.registry = options.registry ?? (0, ProviderRegistry_1.createDefaultProviderRegistry)();
9
13
  }
10
14
  async upsert(input) {
11
15
  const credential = await this.requireCredential(input);
16
+ if (!this.registry.isProvidedInDeployment(input.provider, input.deployment)) {
17
+ throw new Error('provider_not_available_in_deployment');
18
+ }
12
19
  const customModels = (0, connect_1.customModelsFromMetadata)(credential.metadata);
13
20
  const entry = serializeCustomModel(input.model);
21
+ this.assertEmbeddingDeclarationAllowed(input.provider, entry);
14
22
  const index = customModels.findIndex((model) => model.id === entry.id);
15
23
  if (index === -1) {
16
24
  customModels.push(entry);
@@ -28,6 +36,21 @@ class ProviderCustomModelsService {
28
36
  await this.persistMetadata(input, credential, customModels);
29
37
  return customModels;
30
38
  }
39
+ /**
40
+ * A custom model may only declare embedding capability when the deployment
41
+ * provides that exact provider/model as an embedding model. Local deployments
42
+ * allow any declaration; cloud deployments do not.
43
+ */
44
+ assertEmbeddingDeclarationAllowed(provider, model) {
45
+ const declaresEmbedding = (model.capabilities ?? [])
46
+ .some((capability) => capability.trim().toLowerCase() === 'embedding');
47
+ if (!declaresEmbedding) {
48
+ return;
49
+ }
50
+ if (!this.embeddingModelPolicy.isAllowed({ provider, model: model.id })) {
51
+ throw new EmbeddingModelPolicy_1.EmbeddingModelNotAllowedError(provider, model.id);
52
+ }
53
+ }
31
54
  async requireCredential(input) {
32
55
  const credential = await this.credentialRepository.getCredential?.({
33
56
  webId: input.webId,
@@ -1,9 +1,11 @@
1
1
  import type { ProviderSecret } from '../credentials/CredentialVault';
2
2
  import { type ProviderDescriptor, type ProviderRegistry } from '../providers/ProviderRegistry';
3
+ import { type DiscoveredProviderModelType } from './ProviderModelType';
4
+ export type { DiscoveredProviderModelType } from './ProviderModelType';
3
5
  export type DiscoveredProviderModel = {
4
6
  id: string;
5
7
  displayName?: string;
6
- modelType: 'chat' | 'embedding' | 'image' | 'audio' | 'other';
8
+ modelType: DiscoveredProviderModelType;
7
9
  };
8
10
  export interface ProviderModelDiscoveryAdapter {
9
11
  readonly provider: string;
@@ -4,6 +4,7 @@ exports.DeepSeekModelDiscoveryAdapter = exports.BailianModelDiscoveryAdapter = e
4
4
  exports.createProviderModelDiscoveryAdapters = createProviderModelDiscoveryAdapters;
5
5
  const errors_1 = require("../errors");
6
6
  const ProviderRegistry_1 = require("../providers/ProviderRegistry");
7
+ const ProviderModelType_1 = require("./ProviderModelType");
7
8
  const ANTHROPIC_VERSION = '2023-06-01';
8
9
  const DEFAULT_MAX_PAGES = 20;
9
10
  /**
@@ -274,53 +275,9 @@ function normalizeModelRow(row) {
274
275
  return {
275
276
  id,
276
277
  ...(displayName ? { displayName } : {}),
277
- modelType: inferModelType(record, id),
278
+ modelType: (0, ProviderModelType_1.inferProviderModelType)(record, id),
278
279
  };
279
280
  }
280
- function inferModelType(record, id) {
281
- const explicit = explicitModelType(record);
282
- if (explicit) {
283
- return explicit;
284
- }
285
- const normalizedId = id.toLowerCase();
286
- if (/(?:embedding|embed)/u.test(normalizedId)) {
287
- return 'embedding';
288
- }
289
- if (/(?:dall[-_ ]?e|stable[-_ ]?diffusion|flux|imagen|midjourney|image[-_ ]?(?:generation|gen))/u.test(normalizedId)) {
290
- return 'image';
291
- }
292
- if (/(?:whisper|tts|speech|musicgen|audio[-_ ]?(?:generation|gen))/u.test(normalizedId)) {
293
- return 'audio';
294
- }
295
- if (/(?:chat|completion|conversation|text[-_ ]?generation|instruct|reason|coder|gpt|claude|kimi|qwen|deepseek|llama|mistral|gemini)/u.test(normalizedId)) {
296
- return 'chat';
297
- }
298
- return 'other';
299
- }
300
- function explicitModelType(record) {
301
- for (const value of [record.modelType, record.model_type, record.type, record.object, record.category]) {
302
- if (typeof value !== 'string') {
303
- continue;
304
- }
305
- const normalized = value.trim().toLowerCase();
306
- if (!normalized || normalized === 'model') {
307
- continue;
308
- }
309
- if (/(?:embedding|embed)/u.test(normalized)) {
310
- return 'embedding';
311
- }
312
- if (/(?:image|dall[-_ ]?e|stable[-_ ]?diffusion|flux|imagen)/u.test(normalized)) {
313
- return 'image';
314
- }
315
- if (/(?:audio|whisper|speech|tts)/u.test(normalized)) {
316
- return 'audio';
317
- }
318
- if (/(?:chat|completion|conversation|text[-_ ]?generation|instruct|reason|coder)/u.test(normalized)) {
319
- return 'chat';
320
- }
321
- }
322
- return undefined;
323
- }
324
281
  function tokenFromSecret(secret) {
325
282
  return nonEmptySecretValue(secret.apiKey) ?? nonEmptySecretValue(secret.accessToken);
326
283
  }
@@ -2,6 +2,7 @@ import type { AuthContext } from '../../auth/AuthContext';
2
2
  import type { GatewayDeployment } from '../auth/InvocationTokenCodec';
3
3
  import type { ConnectCredentialRecord, PodCredentialRepository } from '../connect';
4
4
  import type { CredentialVault } from '../credentials/CredentialVault';
5
+ import { EmbeddingModelPolicy } from '../../../ai/service/EmbeddingModelPolicy';
5
6
  import { type ProviderRegistry } from '../providers/ProviderRegistry';
6
7
  import { type DiscoveredProviderModel, type ProviderModelDiscoveryAdapter } from './ProviderModelDiscoveryAdapters';
7
8
  import type { PodModelSelection, PodSelectedModelInput, PodModelSelectionRepository } from './PodModelSelectionRepository';
@@ -101,6 +102,12 @@ export interface ProviderModelSelectionServiceOptions {
101
102
  baseUrlForProvider?: (provider: string) => string;
102
103
  /** Optional provider-model service for offering-aware caller-owned discovery. */
103
104
  modelsService?: ProviderModelDiscoveryServiceLike;
105
+ /**
106
+ * Deployment policy for embedding models. Discovery can surface any model a
107
+ * BYOK endpoint advertises; a cloud deployment may still only select embedding
108
+ * models its gateway catalog provides.
109
+ */
110
+ embeddingModelPolicy?: EmbeddingModelPolicy;
104
111
  /** Opens the selected caller credential when the Pod stores a secret cell. */
105
112
  credentialVault?: CredentialVault;
106
113
  now?: () => Date;
@@ -119,6 +126,7 @@ export declare class ProviderModelSelectionService {
119
126
  private readonly baseUrlForProvider?;
120
127
  private readonly modelsService?;
121
128
  private readonly credentialVault?;
129
+ private readonly embeddingModelPolicy;
122
130
  private readonly now;
123
131
  private readonly cacheTtlMs;
124
132
  private readonly cache;
@@ -131,6 +139,8 @@ export declare class ProviderModelSelectionService {
131
139
  private discoverAndCache;
132
140
  private openCredentialSecret;
133
141
  private discoverProviderModels;
142
+ /** Cloud settings only manage providers this deployment provides. */
143
+ private requireProvidedProvider;
134
144
  private resolveCredential;
135
145
  private resolveOptionalCredential;
136
146
  private discoveryContext;