@undefineds.co/xpod 0.4.10 → 0.4.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/config/components-ignore.json +5 -1
  2. package/config/notifications.json +68 -0
  3. package/config/xpod.base.json +9 -11
  4. package/dist/ai/service/AiCredentialSecret.d.ts +30 -0
  5. package/dist/ai/service/AiCredentialSecret.js +120 -0
  6. package/dist/ai/service/CredentialReaderImpl.d.ts +18 -0
  7. package/dist/ai/service/CredentialReaderImpl.js +81 -5
  8. package/dist/ai/service/CredentialReaderImpl.jsonld +42 -2
  9. package/dist/ai/service/EmbeddingModelPolicy.d.ts +79 -0
  10. package/dist/ai/service/EmbeddingModelPolicy.js +134 -0
  11. package/dist/ai/service/EmbeddingProviderError.js +6 -0
  12. package/dist/ai/service/EmbeddingServiceImpl.d.ts +13 -1
  13. package/dist/ai/service/EmbeddingServiceImpl.js +18 -5
  14. package/dist/ai/service/EmbeddingServiceImpl.jsonld +35 -0
  15. package/dist/ai/service/index.d.ts +2 -0
  16. package/dist/ai/service/index.js +2 -0
  17. package/dist/api/ai-gateway/connect/index.d.ts +20 -2
  18. package/dist/api/ai-gateway/connect/index.js +162 -16
  19. package/dist/api/ai-gateway/credentials/AiCredentialSecretDecoder.d.ts +12 -0
  20. package/dist/api/ai-gateway/credentials/AiCredentialSecretDecoder.js +30 -0
  21. package/dist/api/ai-gateway/errors.d.ts +1 -1
  22. package/dist/api/ai-gateway/models/GatewayEmbeddingModelCatalog.d.ts +11 -0
  23. package/dist/api/ai-gateway/models/GatewayEmbeddingModelCatalog.js +31 -0
  24. package/dist/api/ai-gateway/models/PodModelSelectionRepository.js +7 -3
  25. package/dist/api/ai-gateway/models/ProviderCustomModelsService.d.ts +18 -0
  26. package/dist/api/ai-gateway/models/ProviderCustomModelsService.js +23 -0
  27. package/dist/api/ai-gateway/models/ProviderModelDiscoveryAdapters.d.ts +3 -1
  28. package/dist/api/ai-gateway/models/ProviderModelDiscoveryAdapters.js +2 -45
  29. package/dist/api/ai-gateway/models/ProviderModelSelectionService.d.ts +10 -0
  30. package/dist/api/ai-gateway/models/ProviderModelSelectionService.js +57 -20
  31. package/dist/api/ai-gateway/models/ProviderModelType.d.ts +28 -0
  32. package/dist/api/ai-gateway/models/ProviderModelType.js +34 -0
  33. package/dist/api/ai-gateway/models/ProviderModelsAdapter.d.ts +10 -0
  34. package/dist/api/ai-gateway/models/ProviderModelsAdapter.js +3 -4
  35. package/dist/api/ai-gateway/models/index.d.ts +1 -0
  36. package/dist/api/ai-gateway/models/index.js +3 -1
  37. package/dist/api/ai-gateway/providers/CustomRuntimeAdapter.d.ts +7 -0
  38. package/dist/api/ai-gateway/providers/CustomRuntimeAdapter.js +9 -2
  39. package/dist/api/ai-gateway/providers/ModelsDevCatalog.d.ts +7 -1
  40. package/dist/api/ai-gateway/providers/ModelsDevCatalog.js +4 -10
  41. package/dist/api/ai-gateway/providers/ProviderRegistry.d.ts +107 -0
  42. package/dist/api/ai-gateway/providers/ProviderRegistry.js +244 -21
  43. package/dist/api/ai-gateway/providers/ProviderRuntimeRegistry.d.ts +5 -0
  44. package/dist/api/ai-gateway/providers/ProviderRuntimeRegistry.js +5 -1
  45. package/dist/api/ai-gateway/quota/SubscriptionQuotaAdapters.d.ts +12 -4
  46. package/dist/api/ai-gateway/quota/SubscriptionQuotaAdapters.js +11 -11
  47. package/dist/api/ai-gateway/routing/ModelRouter.d.ts +14 -0
  48. package/dist/api/ai-gateway/routing/ModelRouter.js +43 -4
  49. package/dist/api/ai-gateway/service-access/AiConnectionsServiceAccess.d.ts +9 -1
  50. package/dist/api/ai-gateway/service-access/AiConnectionsServiceAccess.js +3 -27
  51. package/dist/api/auth/ClientCredentialsAuthenticator.d.ts +0 -1
  52. package/dist/api/auth/ClientCredentialsAuthenticator.js +0 -3
  53. package/dist/api/auth/index.d.ts +1 -0
  54. package/dist/api/auth/index.js +1 -1
  55. package/dist/api/chatkit/pod-store.d.ts +31 -0
  56. package/dist/api/chatkit/pod-store.js +132 -8
  57. package/dist/api/container/common.js +24 -4
  58. package/dist/api/container/routes.js +17 -2
  59. package/dist/api/container/types.d.ts +3 -1
  60. package/dist/api/handlers/AdminHandler.d.ts +13 -0
  61. package/dist/api/handlers/AdminHandler.js +47 -18
  62. package/dist/api/handlers/AiConfigHandler.d.ts +6 -0
  63. package/dist/api/handlers/AiConfigHandler.js +28 -0
  64. package/dist/api/handlers/AiGatewayManagementHandler.js +36 -0
  65. package/dist/api/runs/RdfRunContextRetriever.d.ts +14 -0
  66. package/dist/api/runs/RdfRunContextRetriever.js +41 -5
  67. package/dist/api/runtime.js +2 -1
  68. package/dist/cli/commands/secret.d.ts +1 -0
  69. package/dist/cli/commands/secret.js +25 -7
  70. package/dist/components/components.jsonld +3 -1
  71. package/dist/components/context.jsonld +53 -1
  72. package/dist/http/SubgraphSparqlHttpHandler.d.ts +59 -2
  73. package/dist/http/SubgraphSparqlHttpHandler.js +145 -13
  74. package/dist/http/SubgraphSparqlHttpHandler.jsonld +37 -0
  75. package/dist/identity/drizzle/AccountRoleRepository.d.ts +30 -2
  76. package/dist/identity/drizzle/AccountRoleRepository.js +163 -15
  77. package/dist/identity/drizzle/EdgeNodeRepository.d.ts +0 -12
  78. package/dist/identity/drizzle/EdgeNodeRepository.js +5 -13
  79. package/dist/identity/drizzle/PodLookupRepository.d.ts +58 -4
  80. package/dist/identity/drizzle/PodLookupRepository.js +248 -105
  81. package/dist/identity/drizzle/db.d.ts +19 -0
  82. package/dist/identity/drizzle/db.js +39 -4
  83. package/dist/index.d.ts +2 -1
  84. package/dist/index.js +7 -3
  85. package/dist/logging/log-file.d.ts +17 -0
  86. package/dist/logging/log-file.js +69 -0
  87. package/dist/main.js +2 -1
  88. package/dist/notifications/NotificationChannelSweeper.d.ts +50 -0
  89. package/dist/notifications/NotificationChannelSweeper.js +131 -0
  90. package/dist/notifications/NotificationChannelSweeper.jsonld +136 -0
  91. package/dist/notifications/ReclaimingWebSocket2023Storer.d.ts +25 -0
  92. package/dist/notifications/ReclaimingWebSocket2023Storer.js +56 -0
  93. package/dist/notifications/ReclaimingWebSocket2023Storer.jsonld +77 -0
  94. package/dist/notifications/index.d.ts +2 -0
  95. package/dist/notifications/index.js +2 -0
  96. package/dist/runtime/Proxy.d.ts +37 -0
  97. package/dist/runtime/Proxy.js +88 -16
  98. package/dist/runtime/bootstrap.js +2 -1
  99. package/dist/runtime/upgrade/BunNativeUpgradeRelay.d.ts +116 -0
  100. package/dist/runtime/upgrade/BunNativeUpgradeRelay.js +423 -0
  101. package/dist/runtime/upgrade/UpgradeHandshake.d.ts +63 -0
  102. package/dist/runtime/upgrade/UpgradeHandshake.js +199 -0
  103. package/dist/runtime/upgrade/WebSocketFrames.d.ts +67 -0
  104. package/dist/runtime/upgrade/WebSocketFrames.js +224 -0
  105. package/node_modules/@undefineds.co/ai-connections/dist/AiApiKeyPool.js +8 -1
  106. package/node_modules/@undefineds.co/ai-connections/dist/AiAuthorizationActions.d.ts +11 -2
  107. package/node_modules/@undefineds.co/ai-connections/dist/AiAuthorizationActions.js +27 -10
  108. package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.d.ts +7 -0
  109. package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.js +13 -11
  110. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectDialog.js +1 -1
  111. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsList.js +10 -6
  112. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMain.d.ts +15 -0
  113. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMain.js +29 -3
  114. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMainHeader.js +18 -3
  115. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.d.ts +16 -1
  116. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.js +92 -20
  117. package/node_modules/@undefineds.co/ai-connections/dist/AiCopyButton.d.ts +35 -0
  118. package/node_modules/@undefineds.co/ai-connections/dist/AiCopyButton.js +45 -0
  119. package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialPoolSection.js +71 -11
  120. package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialRow.js +9 -7
  121. package/node_modules/@undefineds.co/ai-connections/dist/AiEndpointList.d.ts +23 -0
  122. package/node_modules/@undefineds.co/ai-connections/dist/AiEndpointList.js +24 -0
  123. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.d.ts +13 -4
  124. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.js +35 -38
  125. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayModelsSection.d.ts +21 -0
  126. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayModelsSection.js +51 -0
  127. package/node_modules/@undefineds.co/ai-connections/dist/AiInfoTooltip.d.ts +15 -0
  128. package/node_modules/@undefineds.co/ai-connections/dist/AiInfoTooltip.js +16 -0
  129. package/node_modules/@undefineds.co/ai-connections/dist/AiModelCatalog.d.ts +175 -0
  130. package/node_modules/@undefineds.co/ai-connections/dist/AiModelCatalog.js +133 -0
  131. package/node_modules/@undefineds.co/ai-connections/dist/AiOfferingDetails.js +2 -2
  132. package/node_modules/@undefineds.co/ai-connections/dist/AiProviderCard.js +13 -64
  133. package/node_modules/@undefineds.co/ai-connections/dist/AiProviderHeader.d.ts +21 -0
  134. package/node_modules/@undefineds.co/ai-connections/dist/AiProviderHeader.js +12 -0
  135. package/node_modules/@undefineds.co/ai-connections/dist/AiRowAction.d.ts +15 -0
  136. package/node_modules/@undefineds.co/ai-connections/dist/AiRowAction.js +12 -0
  137. package/node_modules/@undefineds.co/ai-connections/dist/AiSortableCredentialList.js +2 -1
  138. package/node_modules/@undefineds.co/ai-connections/dist/ai-connections-client.d.ts +7 -0
  139. package/node_modules/@undefineds.co/ai-connections/dist/ai-connections-client.js +6 -0
  140. package/node_modules/@undefineds.co/ai-connections/dist/authorization-methods.d.ts +36 -5
  141. package/node_modules/@undefineds.co/ai-connections/dist/authorization-methods.js +52 -9
  142. package/node_modules/@undefineds.co/ai-connections/dist/client/normalize.js +30 -3
  143. package/node_modules/@undefineds.co/ai-connections/dist/client/types.d.ts +21 -1
  144. package/node_modules/@undefineds.co/ai-connections/dist/client-config/base-adapter.d.ts +1 -3
  145. package/node_modules/@undefineds.co/ai-connections/dist/client-config/base-adapter.js +3 -7
  146. package/node_modules/@undefineds.co/ai-connections/dist/client-config/index.cjs +9 -7
  147. package/node_modules/@undefineds.co/ai-connections/dist/collection-runtime.d.ts +46 -0
  148. package/node_modules/@undefineds.co/ai-connections/dist/collection-runtime.js +231 -0
  149. package/node_modules/@undefineds.co/ai-connections/dist/collections.d.ts +119 -0
  150. package/node_modules/@undefineds.co/ai-connections/dist/collections.js +173 -0
  151. package/node_modules/@undefineds.co/ai-connections/dist/controller.d.ts +71 -5
  152. package/node_modules/@undefineds.co/ai-connections/dist/controller.js +285 -16
  153. package/node_modules/@undefineds.co/ai-connections/dist/credential-labels.d.ts +5 -0
  154. package/node_modules/@undefineds.co/ai-connections/dist/credential-labels.js +8 -3
  155. package/node_modules/@undefineds.co/ai-connections/dist/credential-storage.d.ts +59 -0
  156. package/node_modules/@undefineds.co/ai-connections/dist/credential-storage.js +131 -0
  157. package/node_modules/@undefineds.co/ai-connections/dist/endpoint-urls.d.ts +15 -0
  158. package/node_modules/@undefineds.co/ai-connections/dist/endpoint-urls.js +20 -0
  159. package/node_modules/@undefineds.co/ai-connections/dist/gateway-endpoints.d.ts +14 -0
  160. package/node_modules/@undefineds.co/ai-connections/dist/gateway-endpoints.js +20 -0
  161. package/node_modules/@undefineds.co/ai-connections/dist/index.d.ts +8 -0
  162. package/node_modules/@undefineds.co/ai-connections/dist/index.js +8 -0
  163. package/node_modules/@undefineds.co/ai-connections/dist/manifest.js +1 -1
  164. package/node_modules/@undefineds.co/ai-connections/dist/offering-endpoints.d.ts +14 -0
  165. package/node_modules/@undefineds.co/ai-connections/dist/offering-endpoints.js +17 -0
  166. package/node_modules/@undefineds.co/ai-connections/dist/provider-catalog.cjs +68 -1
  167. package/node_modules/@undefineds.co/ai-connections/dist/provider-catalog.d.ts +75 -1
  168. package/node_modules/@undefineds.co/ai-connections/dist/provider-catalog.js +119 -0
  169. package/node_modules/@undefineds.co/ai-connections/dist/provider-visuals.d.ts +5 -0
  170. package/node_modules/@undefineds.co/ai-connections/dist/provider-visuals.js +5 -0
  171. package/node_modules/@undefineds.co/ai-connections/dist/service-access.js +2 -27
  172. package/node_modules/@undefineds.co/ai-connections/package.json +1 -0
  173. package/node_modules/@undefineds.co/extension-sdk/dist/manifest.d.ts +1 -1
  174. package/node_modules/@undefineds.co/extension-sdk/dist/manifest.js +2 -0
  175. package/node_modules/@undefineds.co/extension-sdk/dist/web.d.ts +150 -0
  176. package/node_modules/@undefineds.co/extension-sdk/package.json +2 -1
  177. package/node_modules/@undefineds.co/models/README.md +1 -1
  178. package/node_modules/@undefineds.co/models/dist/ai-config/index.d.ts +3 -3
  179. package/node_modules/@undefineds.co/models/dist/ai-gateway.schema.d.ts +5 -0
  180. package/node_modules/@undefineds.co/models/dist/ai-gateway.schema.js +9 -0
  181. package/node_modules/@undefineds.co/models/dist/ai-runtime.repository.d.ts +1 -1
  182. package/node_modules/@undefineds.co/models/dist/approval.repository.d.ts +2 -2
  183. package/node_modules/@undefineds.co/models/dist/audit.presentation.d.ts +2 -2
  184. package/node_modules/@undefineds.co/models/dist/capture.repository.d.ts +1 -1
  185. package/node_modules/@undefineds.co/models/dist/chat-project.repository.d.ts +1 -1
  186. package/node_modules/@undefineds.co/models/dist/chat.repository.d.ts +2 -2
  187. package/node_modules/@undefineds.co/models/dist/control-request.repository.d.ts +2 -2
  188. package/node_modules/@undefineds.co/models/dist/conversation-share.repository.d.ts +1 -1
  189. package/node_modules/@undefineds.co/models/dist/credential.schema.d.ts +12 -0
  190. package/node_modules/@undefineds.co/models/dist/credential.schema.js +15 -1
  191. package/node_modules/@undefineds.co/models/dist/discovery/index.d.ts +2 -2
  192. package/node_modules/@undefineds.co/models/dist/discovery/providers.json +248 -7
  193. package/node_modules/@undefineds.co/models/dist/discovery/types.d.ts +31 -0
  194. package/node_modules/@undefineds.co/models/dist/extension/index.d.ts +1 -1
  195. package/node_modules/@undefineds.co/models/dist/favorite/index.d.ts +2 -2
  196. package/node_modules/@undefineds.co/models/dist/fixtures/contracts-chat-contact.d.ts +5 -5
  197. package/node_modules/@undefineds.co/models/dist/import/index.d.ts +1 -1
  198. package/node_modules/@undefineds.co/models/dist/index.d.ts +73 -73
  199. package/node_modules/@undefineds.co/models/dist/index.js +1 -1
  200. package/node_modules/@undefineds.co/models/dist/input-request.repository.d.ts +2 -2
  201. package/node_modules/@undefineds.co/models/dist/knowledge/index.d.ts +1 -1
  202. package/node_modules/@undefineds.co/models/dist/message.repository.d.ts +1 -1
  203. package/node_modules/@undefineds.co/models/dist/namespaces.js +5 -0
  204. package/node_modules/@undefineds.co/models/dist/pod-storage-descriptor.d.ts +4815 -26
  205. package/node_modules/@undefineds.co/models/dist/pod-storage-descriptor.js +482 -132
  206. package/node_modules/@undefineds.co/models/dist/schema.d.ts +4 -0
  207. package/node_modules/@undefineds.co/models/dist/session/index.d.ts +1 -1
  208. package/node_modules/@undefineds.co/models/dist/settings/index.d.ts +1 -1
  209. package/node_modules/@undefineds.co/models/dist/sidecar/persistence-mapping.d.ts +5 -5
  210. package/node_modules/@undefineds.co/models/dist/thread.repository.d.ts +2 -2
  211. package/node_modules/@undefineds.co/models/dist/types/message-block.d.ts +1 -1
  212. package/node_modules/@undefineds.co/models/dist/vocab/_namespaces.d.ts +1 -1
  213. package/node_modules/@undefineds.co/models/dist/vocab/index.d.ts +10 -10
  214. package/node_modules/@undefineds.co/models/dist/vocab/sidecar.vocab.d.ts +1 -0
  215. package/node_modules/@undefineds.co/models/dist/vocab/sidecar.vocab.js +1 -0
  216. package/node_modules/@undefineds.co/models/package.json +4 -2
  217. package/node_modules/@undefineds.co/pod-collections/README.md +71 -0
  218. package/node_modules/@undefineds.co/pod-collections/dist/diff.d.ts +85 -0
  219. package/node_modules/@undefineds.co/pod-collections/dist/diff.js +166 -0
  220. package/node_modules/@undefineds.co/pod-collections/dist/feed.d.ts +17 -0
  221. package/node_modules/@undefineds.co/pod-collections/dist/feed.js +27 -0
  222. package/node_modules/@undefineds.co/pod-collections/dist/index.cjs +1042 -0
  223. package/node_modules/@undefineds.co/pod-collections/dist/index.d.ts +37 -0
  224. package/node_modules/@undefineds.co/pod-collections/dist/index.js +89 -0
  225. package/node_modules/@undefineds.co/pod-collections/dist/layout.d.ts +75 -0
  226. package/node_modules/@undefineds.co/pod-collections/dist/layout.js +173 -0
  227. package/node_modules/@undefineds.co/pod-collections/dist/mapping.d.ts +78 -0
  228. package/node_modules/@undefineds.co/pod-collections/dist/mapping.js +287 -0
  229. package/node_modules/@undefineds.co/pod-collections/dist/mutations.d.ts +83 -0
  230. package/node_modules/@undefineds.co/pod-collections/dist/mutations.js +273 -0
  231. package/node_modules/@undefineds.co/pod-collections/dist/react.d.ts +21 -0
  232. package/node_modules/@undefineds.co/pod-collections/dist/react.js +22 -0
  233. package/node_modules/@undefineds.co/pod-collections/dist/read.d.ts +65 -0
  234. package/node_modules/@undefineds.co/pod-collections/dist/read.js +31 -0
  235. package/node_modules/@undefineds.co/pod-collections/dist/sync.d.ts +66 -0
  236. package/node_modules/@undefineds.co/pod-collections/dist/sync.js +260 -0
  237. package/node_modules/@undefineds.co/pod-collections/dist/types.d.ts +155 -0
  238. package/node_modules/@undefineds.co/pod-collections/dist/types.js +9 -0
  239. package/node_modules/@undefineds.co/pod-collections/package.json +42 -0
  240. package/node_modules/@undefineds.co/shared-ui/dist/index.d.ts +0 -1
  241. package/node_modules/@undefineds.co/shared-ui/dist/index.js +0 -1
  242. package/package.json +15 -7
  243. package/static/app/assets/main.css +1 -1
  244. package/static/app/assets/main.js +12 -13
  245. package/static/auth-callback/assets/AiConfigContext-DnQs1ZpW.js +1 -0
  246. package/static/auth-callback/assets/AiConfigPage-DOtvlxH0.js +1 -0
  247. package/static/auth-callback/assets/DocumentProcessingPanel-BS2voQgL.js +1 -0
  248. package/static/auth-callback/assets/IndexLifecyclePanel-Cvt0cJtN.js +1 -0
  249. package/static/auth-callback/assets/{IndexSubjectPanel-C4YG0whI.js → IndexSubjectPanel-Dhf01GqF.js} +1 -1
  250. package/static/auth-callback/assets/ModelAssignmentsPanel-BJutWaAF.js +1 -0
  251. package/static/auth-callback/assets/ModelsPage-BRS0sje3.js +11 -0
  252. package/static/auth-callback/assets/{NetworkPage-Cbdn_P1e.js → NetworkPage-B3qBfANA.js} +2 -2
  253. package/static/auth-callback/assets/{PaneListHeader-jy70Q00L.js → PaneListHeader-QQeJGTp4.js} +1 -1
  254. package/static/auth-callback/assets/SearchIndexingPanel-MyNUSEwT.js +1 -0
  255. package/static/auth-callback/assets/{StatusSubjectPanel-hfjoB5aS.js → StatusSubjectPanel-DQkEVsFs.js} +1 -1
  256. package/static/{settings/assets/StatusWorkspace-CKD_Rzdr.js → auth-callback/assets/StatusWorkspace-Dkv63Uwk.js} +1 -1
  257. package/static/auth-callback/assets/SystemSettingsPage-TIsUfX5d.js +1 -0
  258. package/static/auth-callback/assets/SystemSettingsSubjectPanel-BJWEt2-7.js +33 -0
  259. package/static/auth-callback/assets/XpodAiConnectionsPodStore-BJiXm-PF.js +3 -0
  260. package/static/auth-callback/assets/{activity-BcsZZxxw.js → activity-5hNeNKnL.js} +1 -1
  261. package/static/auth-callback/assets/admin-C6qCRFiY.js +1 -0
  262. package/static/auth-callback/assets/ai-connections-CryuHGKW.js +1 -0
  263. package/static/auth-callback/assets/{auth-callback-atKg_oig.js → auth-callback-CAFZ3R0B.js} +80 -84
  264. package/static/auth-callback/assets/auth-callback-rk080mvG.css +1 -0
  265. package/static/auth-callback/assets/{badge-BWbRHThQ.js → badge-CAIPI0CB.js} +1 -1
  266. package/static/auth-callback/assets/collection-runtime-D9s7h9YA.js +1 -0
  267. package/static/auth-callback/assets/dialog-BjA109aX.js +1 -0
  268. package/static/auth-callback/assets/{download-BmvG1Vya.js → download-B3Up5W2G.js} +1 -1
  269. package/static/auth-callback/assets/{external-link-DZ34d3g3.js → external-link-BTXgSPzB.js} +1 -1
  270. package/static/auth-callback/assets/index-BppXlxcp.js +41 -0
  271. package/static/auth-callback/assets/index-CirW4CJf.js +1 -0
  272. package/static/auth-callback/assets/index-DlLYWOhw.js +4 -0
  273. package/static/auth-callback/assets/{index-browser-B9Z7GU-T.js → index-browser-DtU38ni3.js} +1 -1
  274. package/static/auth-callback/assets/{key-round-tjP76Se-.js → key-round-CQCOrZ7x.js} +1 -1
  275. package/static/auth-callback/assets/layout-DB3pMyTl.js +1 -0
  276. package/static/auth-callback/assets/pod-collections-host-KnnGFZHL.js +8 -0
  277. package/static/auth-callback/assets/{rotate-ccw-C_L5ZLx1.js → rotate-ccw-C1zM2KtS.js} +1 -1
  278. package/static/auth-callback/assets/settings-projection-CUkyprDQ.js +1 -0
  279. package/static/auth-callback/assets/{skeleton-C7tGDQIs.js → skeleton-Cqp7_M9-.js} +1 -1
  280. package/static/auth-callback/assets/{waypoints-VMNQlWdU.js → waypoints-Bj6gAUSQ.js} +1 -1
  281. package/static/auth-callback/assets/{workspace-layout-SAp6BtYK.js → workspace-layout-DK8mDzrY.js} +1 -1
  282. package/static/auth-callback/auth-callback.html +2 -2
  283. package/static/dashboard/assets/AiConfigContext-BsE7MqX8.js +1 -0
  284. package/static/dashboard/assets/AiConfigPage-DvM-lRXa.js +1 -0
  285. package/static/dashboard/assets/DocumentProcessingPanel-BPfdlfuf.js +1 -0
  286. package/static/dashboard/assets/IndexLifecyclePanel--m0AGxvh.js +1 -0
  287. package/static/dashboard/assets/{IndexSubjectPanel-DQFPP6-p.js → IndexSubjectPanel-Bb7m1k3d.js} +1 -1
  288. package/static/dashboard/assets/ModelAssignmentsPanel-BLi_zbMa.js +1 -0
  289. package/static/dashboard/assets/ModelsPage-CxdpgnfR.js +11 -0
  290. package/static/dashboard/assets/{NetworkPage-CHQ3YxIB.js → NetworkPage-BAIPw-D_.js} +2 -2
  291. package/static/dashboard/assets/{PaneListHeader-DsXemAdR.js → PaneListHeader-BBCMei0r.js} +1 -1
  292. package/static/dashboard/assets/SearchIndexingPanel-Ck4Y-xjR.js +1 -0
  293. package/static/dashboard/assets/{StatusSubjectPanel-D3PGEYT4.js → StatusSubjectPanel-D1KWfAXE.js} +1 -1
  294. package/static/dashboard/assets/{StatusWorkspace-BcpePYUW.js → StatusWorkspace-JbA5gzXx.js} +1 -1
  295. package/static/dashboard/assets/SystemSettingsPage-BbwQWsSR.js +1 -0
  296. package/static/dashboard/assets/SystemSettingsSubjectPanel-N117nMt5.js +33 -0
  297. package/static/dashboard/assets/XpodAiConnectionsPodStore-CdDOb4SV.js +18 -0
  298. package/static/dashboard/assets/{activity-j5zrznu-.js → activity-DX1I96o_.js} +1 -1
  299. package/static/dashboard/assets/admin-C6qCRFiY.js +1 -0
  300. package/static/dashboard/assets/ai-connections-DwCRqOQa.js +1 -0
  301. package/static/dashboard/assets/{badge-CzeBdG7h.js → badge-k2vhtDqH.js} +1 -1
  302. package/static/dashboard/assets/collection-runtime-BFQ8teQJ.js +1 -0
  303. package/static/dashboard/assets/{dashboard-D-xANHk1.js → dashboard-DWZ-fmCT.js} +105 -109
  304. package/static/dashboard/assets/dashboard-rk080mvG.css +1 -0
  305. package/static/dashboard/assets/dialog-1CCw-iHT.js +1 -0
  306. package/static/dashboard/assets/{download-IcNdEZWi.js → download-C6-SNY1q.js} +1 -1
  307. package/static/dashboard/assets/{external-link-DxBxK8Vu.js → external-link-BgPcZ_j2.js} +1 -1
  308. package/static/dashboard/assets/index-6LcIUIYO.js +1 -0
  309. package/static/dashboard/assets/index-D7A8U6Pt.js +41 -0
  310. package/static/dashboard/assets/index-UD6QOE7H.js +4 -0
  311. package/static/dashboard/assets/{key-round-D1K7warM.js → key-round-BOd7Jo0Q.js} +1 -1
  312. package/static/dashboard/assets/layout-DB3pMyTl.js +1 -0
  313. package/static/dashboard/assets/pod-collections-host-KnnGFZHL.js +8 -0
  314. package/static/dashboard/assets/{rotate-ccw-CcN1N6p9.js → rotate-ccw-CCgJqsvx.js} +1 -1
  315. package/static/dashboard/assets/settings-projection-CUkyprDQ.js +1 -0
  316. package/static/dashboard/assets/{skeleton-CKnmJMUH.js → skeleton-Bc7abAn5.js} +1 -1
  317. package/static/dashboard/assets/{waypoints-DuZPO_wu.js → waypoints-s-opmJxx.js} +1 -1
  318. package/static/dashboard/assets/{workspace-layout-BUj3wZ_m.js → workspace-layout-DqIQeTBV.js} +1 -1
  319. package/static/dashboard/dashboard.html +2 -2
  320. package/static/settings/assets/AiConfigContext-BB9KZySa.js +1 -0
  321. package/static/settings/assets/AiConfigPage-DGSXUkLs.js +1 -0
  322. package/static/settings/assets/DocumentProcessingPanel-Da2Re6Rg.js +1 -0
  323. package/static/settings/assets/IndexLifecyclePanel-BSZuIzgr.js +1 -0
  324. package/static/settings/assets/{IndexSubjectPanel-73sM16Ma.js → IndexSubjectPanel-CFd0ay-r.js} +1 -1
  325. package/static/settings/assets/ModelAssignmentsPanel-CSAryvWJ.js +1 -0
  326. package/static/settings/assets/ModelsPage-BQwCwLHU.js +11 -0
  327. package/static/settings/assets/{NetworkPage-i6j-M2RY.js → NetworkPage-BKymvsQc.js} +2 -2
  328. package/static/settings/assets/{PaneListHeader-DpqC0jd5.js → PaneListHeader-Bjh3hRdQ.js} +1 -1
  329. package/static/settings/assets/SearchIndexingPanel-MjKL5QLU.js +1 -0
  330. package/static/settings/assets/{StatusSubjectPanel-Dv4q3PGh.js → StatusSubjectPanel-Bvl6K4mx.js} +1 -1
  331. package/static/settings/assets/StatusWorkspace-B0NzrP--.js +1 -0
  332. package/static/settings/assets/SystemSettingsPage-D2z6Z4FE.js +1 -0
  333. package/static/settings/assets/SystemSettingsSubjectPanel-4sxma4X4.js +33 -0
  334. package/static/settings/assets/XpodAiConnectionsPodStore-BkNQ8fZx.js +3 -0
  335. package/static/settings/assets/{activity-DaFkk8f3.js → activity-CgJJGpjx.js} +1 -1
  336. package/static/settings/assets/admin-C6qCRFiY.js +1 -0
  337. package/static/settings/assets/ai-connections-CryuHGKW.js +1 -0
  338. package/static/settings/assets/{badge-d5SHdc-x.js → badge-C4NypVyT.js} +1 -1
  339. package/static/settings/assets/collection-runtime-CTLCDxAi.js +1 -0
  340. package/static/settings/assets/dialog-Csq0vWUi.js +1 -0
  341. package/static/settings/assets/{download-CpkwomDr.js → download-DaLJJ-Wp.js} +1 -1
  342. package/static/settings/assets/{external-link-_4YT42Mf.js → external-link--w_iW5Au.js} +1 -1
  343. package/static/settings/assets/index-B0mQa59b.js +4 -0
  344. package/static/settings/assets/index-BukHiu4y.js +1 -0
  345. package/static/settings/assets/index-COmVnZi2.js +41 -0
  346. package/static/settings/assets/{index-browser-B06xjBdZ.js → index-browser-BGpvHwD0.js} +1 -1
  347. package/static/settings/assets/{key-round-Dlqmp1Kq.js → key-round-Bk4YRjBu.js} +1 -1
  348. package/static/settings/assets/layout-DB3pMyTl.js +1 -0
  349. package/static/settings/assets/pod-collections-host-KnnGFZHL.js +8 -0
  350. package/static/settings/assets/{rotate-ccw-TAY65xWT.js → rotate-ccw-TCabbqsr.js} +1 -1
  351. package/static/settings/assets/{settings-ExBXGgbj.js → settings-CJWpdbNC.js} +105 -109
  352. package/static/settings/assets/settings-projection-CUkyprDQ.js +1 -0
  353. package/static/settings/assets/settings-rk080mvG.css +1 -0
  354. package/static/settings/assets/{skeleton-DKIWjNr9.js → skeleton-JDHYVe7t.js} +1 -1
  355. package/static/settings/assets/{waypoints-9erLIxyR.js → waypoints-DDvEl-MU.js} +1 -1
  356. package/static/settings/assets/{workspace-layout-CYXfYIa3.js → workspace-layout-DV5QU30U.js} +1 -1
  357. package/static/settings/settings.html +2 -2
  358. package/node_modules/@undefineds.co/shared-ui/dist/oidc-consent.d.ts +0 -54
  359. package/node_modules/@undefineds.co/shared-ui/dist/oidc-consent.js +0 -21
  360. package/static/auth-callback/assets/AiConfigContext-C81deMM9.js +0 -1
  361. package/static/auth-callback/assets/AiConfigPage-evWI8T56.js +0 -1
  362. package/static/auth-callback/assets/DocumentProcessingPanel-B9GrDEMe.js +0 -1
  363. package/static/auth-callback/assets/IndexLifecyclePanel-qCo8ABQZ.js +0 -1
  364. package/static/auth-callback/assets/ModelAssignmentsPanel-DG7Lxh3t.js +0 -1
  365. package/static/auth-callback/assets/ModelsPage-CgEuqE6p.js +0 -10
  366. package/static/auth-callback/assets/SearchIndexingPanel-ByU3u7kp.js +0 -1
  367. package/static/auth-callback/assets/StatusWorkspace-BZd617sV.js +0 -1
  368. package/static/auth-callback/assets/SystemSettingsPage-BirzWAQM.js +0 -1
  369. package/static/auth-callback/assets/SystemSettingsSubjectPanel-CmsVWNCx.js +0 -31
  370. package/static/auth-callback/assets/admin-BU4m6Ko2.js +0 -1
  371. package/static/auth-callback/assets/ai-connections-CHNTKemd.js +0 -1
  372. package/static/auth-callback/assets/auth-callback-C_7MUXJb.css +0 -1
  373. package/static/auth-callback/assets/index-BpV1hsqs.js +0 -4
  374. package/static/auth-callback/assets/index-D9oE6FXK.js +0 -41
  375. package/static/dashboard/assets/AiConfigContext-De-OtAWo.js +0 -1
  376. package/static/dashboard/assets/AiConfigPage-macP4Mop.js +0 -1
  377. package/static/dashboard/assets/DocumentProcessingPanel-C5ObvCCl.js +0 -1
  378. package/static/dashboard/assets/IndexLifecyclePanel-xVNa2l40.js +0 -1
  379. package/static/dashboard/assets/ModelAssignmentsPanel-DMOATFpQ.js +0 -1
  380. package/static/dashboard/assets/ModelsPage-91UbnETA.js +0 -25
  381. package/static/dashboard/assets/SearchIndexingPanel-Dh70PNFZ.js +0 -1
  382. package/static/dashboard/assets/SystemSettingsPage-BiN5GcKx.js +0 -1
  383. package/static/dashboard/assets/SystemSettingsSubjectPanel-B9QrSiFp.js +0 -31
  384. package/static/dashboard/assets/admin-BU4m6Ko2.js +0 -1
  385. package/static/dashboard/assets/ai-connections-CHNTKemd.js +0 -1
  386. package/static/dashboard/assets/dashboard-C_7MUXJb.css +0 -1
  387. package/static/dashboard/assets/index-FWZ-s52O.js +0 -41
  388. package/static/dashboard/assets/index-ZiQZ96oC.js +0 -4
  389. package/static/settings/assets/AiConfigContext-C0cQMPfG.js +0 -1
  390. package/static/settings/assets/AiConfigPage-CPhB4iFb.js +0 -1
  391. package/static/settings/assets/DocumentProcessingPanel-sYI7OpuH.js +0 -1
  392. package/static/settings/assets/IndexLifecyclePanel-yj8iyiT8.js +0 -1
  393. package/static/settings/assets/ModelAssignmentsPanel-BFIgUX5v.js +0 -1
  394. package/static/settings/assets/ModelsPage-BdppXl7E.js +0 -10
  395. package/static/settings/assets/SearchIndexingPanel-BlPnrkT3.js +0 -1
  396. package/static/settings/assets/SystemSettingsPage-CiOm2NzV.js +0 -1
  397. package/static/settings/assets/SystemSettingsSubjectPanel-Cd-GECon.js +0 -31
  398. package/static/settings/assets/admin-BU4m6Ko2.js +0 -1
  399. package/static/settings/assets/ai-connections-CHNTKemd.js +0 -1
  400. package/static/settings/assets/index-BFi9yn7_.js +0 -41
  401. package/static/settings/assets/index-BGgEhIUy.js +0 -4
  402. package/static/settings/assets/settings-C_7MUXJb.css +0 -1
@@ -5,6 +5,7 @@ const errors_1 = require("../errors");
5
5
  const connect_1 = require("../connect");
6
6
  const ProviderRegistry_1 = require("../providers/ProviderRegistry");
7
7
  const ModelsDevCatalog_1 = require("../providers/ModelsDevCatalog");
8
+ const EmbeddingModelPolicy_1 = require("../../../ai/service/EmbeddingModelPolicy");
8
9
  class ModelRouter {
9
10
  constructor(options) {
10
11
  this.registry = options.registry;
@@ -13,6 +14,7 @@ class ModelRouter {
13
14
  this.selectionRepository = options.selectionRepository;
14
15
  this.defaultProvider = options.defaultProvider ? (0, ProviderRegistry_1.normalizeProviderId)(options.defaultProvider) : undefined;
15
16
  this.defaultModel = options.defaultModel;
17
+ this.embeddingModelPolicy = options.embeddingModelPolicy ?? EmbeddingModelPolicy_1.EmbeddingModelPolicy.allowAll();
16
18
  this.now = options.now ?? (() => new Date());
17
19
  }
18
20
  async route(input, excludeCredentialIds = new Set()) {
@@ -136,7 +138,7 @@ class ModelRouter {
136
138
  model,
137
139
  source: 'exact-model',
138
140
  selectionDefault: Boolean(selection.defaultModel && sameModel(selection.defaultModel, selected.id)),
139
- projection: modelProjection(provider, model),
141
+ projection: modelProjection(provider, model, selected.displayName),
140
142
  });
141
143
  }
142
144
  }
@@ -478,8 +480,16 @@ class ModelRouter {
478
480
  const selected = unrestricted
479
481
  ? provider.models.map((model) => model.id)
480
482
  : providerCandidates.flatMap((candidate) => candidate.models ?? []);
483
+ const selectedNames = new Map();
484
+ for (const candidate of providerCandidates) {
485
+ for (const [id, name] of Object.entries(candidate.modelNames ?? {})) {
486
+ if (!selectedNames.has(id)) {
487
+ selectedNames.set(id, name);
488
+ }
489
+ }
490
+ }
481
491
  for (const model of selected) {
482
- const projection = modelProjection(provider, model);
492
+ const projection = modelProjection(provider, model, selectedNames.get(modelIdentity(model)));
483
493
  if (seen.has(projection.id)) {
484
494
  continue;
485
495
  }
@@ -499,6 +509,7 @@ class ModelRouter {
499
509
  continue;
500
510
  }
501
511
  seen.add(key);
512
+ const customCapabilities = this.visibleCustomCapabilities(provider.id, id, customModel.capabilities);
502
513
  models.push({
503
514
  id,
504
515
  object: 'model',
@@ -513,7 +524,7 @@ class ModelRouter {
513
524
  },
514
525
  }
515
526
  : {}),
516
- ...(customModel.capabilities?.length ? { custom_capabilities: [...customModel.capabilities] } : {}),
527
+ ...(customCapabilities.length ? { custom_capabilities: customCapabilities } : {}),
517
528
  });
518
529
  }
519
530
  }
@@ -526,6 +537,19 @@ class ModelRouter {
526
537
  && candidate.quota?.status !== 'exhausted'
527
538
  && (!candidate.cooldownUntil || candidate.cooldownUntil.getTime() <= this.now().getTime());
528
539
  }
540
+ /**
541
+ * A Pod can declare any capability on a custom model. Embedding is the one
542
+ * capability a deployment gates through its own catalog, so never advertise an
543
+ * embedding model the catalog does not provide. Other declared capabilities
544
+ * keep their existing behavior.
545
+ */
546
+ visibleCustomCapabilities(providerId, modelId, capabilities) {
547
+ if (!capabilities?.length) {
548
+ return [];
549
+ }
550
+ return capabilities.filter((capability) => capability.trim().toLowerCase() !== 'embedding'
551
+ || this.embeddingModelPolicy.isAllowed({ provider: providerId, model: modelId }));
552
+ }
529
553
  }
530
554
  exports.ModelRouter = ModelRouter;
531
555
  function modelIdentity(value) {
@@ -536,19 +560,34 @@ function modelIdentity(value) {
536
560
  function sameModel(left, right) {
537
561
  return modelIdentity(left).toLowerCase() === modelIdentity(right).toLowerCase();
538
562
  }
539
- function modelProjection(provider, modelId) {
563
+ /**
564
+ * One visible model as the OpenAI-shaped `/v1/models` entry.
565
+ *
566
+ * `display_name` is the same evidence the settings model list shows next to the
567
+ * id: the name the Pod row carries from discovery, or the catalog's name for a
568
+ * model the registry describes. Without it the published list can only be read
569
+ * as raw ids while the provider pages show names for the very same models.
570
+ */
571
+ function modelProjection(provider, modelId, displayName) {
540
572
  const descriptor = provider.models.find((model) => sameModel(model.id, modelId)
541
573
  || (model.aliases ?? []).some((alias) => sameModel(alias, modelId)))
542
574
  ?? (0, ModelsDevCatalog_1.lookupModelsDevModelDescriptor)((0, ProviderRegistry_1.normalizeProviderId)(provider.id), modelIdentity(modelId));
575
+ const name = displayName ?? catalogDisplayName(descriptor);
543
576
  return {
544
577
  id: modelIdentity(modelId),
545
578
  object: 'model',
546
579
  owned_by: provider.id,
580
+ ...(name ? { display_name: name } : {}),
547
581
  ...(descriptor?.contextWindow !== undefined ? { context_window: descriptor.contextWindow } : {}),
548
582
  ...(descriptor?.capabilities ? { capabilities: descriptor.capabilities } : {}),
549
583
  ...(descriptor?.protocols ? { protocols: descriptor.protocols } : {}),
550
584
  };
551
585
  }
586
+ /** Discovery metadata names a model the same way the settings summary does. */
587
+ function catalogDisplayName(descriptor) {
588
+ const name = descriptor?.metadata?.name;
589
+ return typeof name === 'string' && name.trim() ? name.trim() : undefined;
590
+ }
552
591
  function modelNotAvailableError(model) {
553
592
  return new errors_1.GatewayProtocolError('Requested model is not available for this account', {
554
593
  code: 'model_not_available',
@@ -1,5 +1,13 @@
1
+ import { AI_CONNECTIONS_PROVIDER_DOCUMENT_IDS } from '@undefineds.co/ai-connections/provider-catalog';
1
2
  export declare const AI_CONNECTIONS_APPLET_ID = "co.undefineds.ai-connections";
2
- export declare const AI_CONNECTIONS_PROVIDER_DOCUMENT_IDS: readonly ["openai", "openai-official-subscription", "openai-api-platform", "anthropic", "anthropic-official-subscription", "anthropic-api-platform", "kimi", "kimi-subscription-key", "kimi-api-platform", "bailian", "bailian-pay-as-you-go", "bailian-token-plan", "bailian-token-plan-team", "bailian-coding-plan", "deepseek", "deepseek-api-platform", "zhipu", "zhipu-api-platform", "zhipu-coding-plan", "ollama", "ollama-local", "custom", "custom-openai-compatible", "custom-anthropic-compatible"];
3
+ /**
4
+ * Provider documents this service may reach. The list is projected from the
5
+ * shared provider/offering catalogue (`<provider>` plus
6
+ * `<provider>-<offeringId>`); re-exported here because the service-access
7
+ * descriptor is the server-side consumer of that one source, and the applet's
8
+ * descriptor validator reads the same constant.
9
+ */
10
+ export { AI_CONNECTIONS_PROVIDER_DOCUMENT_IDS };
3
11
  export interface AiConnectionsServiceAccessDescriptor {
4
12
  appletId: typeof AI_CONNECTIONS_APPLET_ID;
5
13
  service: {
@@ -7,34 +7,10 @@ exports.resolveGatewayAccessKeySecretResourceUrl = resolveGatewayAccessKeySecret
7
7
  exports.resolveGatewayAccessKeySparqlEndpoint = resolveGatewayAccessKeySparqlEndpoint;
8
8
  exports.isGatewayAccessKeySparqlEndpoint = isGatewayAccessKeySparqlEndpoint;
9
9
  const drizzle_solid_1 = require("@undefineds.co/drizzle-solid");
10
+ const provider_catalog_1 = require("@undefineds.co/ai-connections/provider-catalog");
11
+ Object.defineProperty(exports, "AI_CONNECTIONS_PROVIDER_DOCUMENT_IDS", { enumerable: true, get: function () { return provider_catalog_1.AI_CONNECTIONS_PROVIDER_DOCUMENT_IDS; } });
10
12
  const models_1 = require("@undefineds.co/models");
11
13
  exports.AI_CONNECTIONS_APPLET_ID = 'co.undefineds.ai-connections';
12
- exports.AI_CONNECTIONS_PROVIDER_DOCUMENT_IDS = [
13
- 'openai',
14
- 'openai-official-subscription',
15
- 'openai-api-platform',
16
- 'anthropic',
17
- 'anthropic-official-subscription',
18
- 'anthropic-api-platform',
19
- 'kimi',
20
- 'kimi-subscription-key',
21
- 'kimi-api-platform',
22
- 'bailian',
23
- 'bailian-pay-as-you-go',
24
- 'bailian-token-plan',
25
- 'bailian-token-plan-team',
26
- 'bailian-coding-plan',
27
- 'deepseek',
28
- 'deepseek-api-platform',
29
- 'zhipu',
30
- 'zhipu-api-platform',
31
- 'zhipu-coding-plan',
32
- 'ollama',
33
- 'ollama-local',
34
- 'custom',
35
- 'custom-openai-compatible',
36
- 'custom-anthropic-compatible',
37
- ];
38
14
  const declaredResourceBases = new WeakMap([
39
15
  [models_1.credentialResource, declaredResourceBase(models_1.credentialResource)],
40
16
  [models_1.aiProviderResource, declaredResourceBase(models_1.aiProviderResource)],
@@ -54,7 +30,7 @@ function createAiConnectionsServiceAccess(input) {
54
30
  ['gatewayAccessKeys', resolveGatewayAccessKeyResourceUrl(input.ownerWebId, input.podBaseUrl)],
55
31
  ['gatewayAccessKeySecrets', resolveGatewayAccessKeySecretResourceUrl(input.ownerWebId, input.podBaseUrl), 'application/json'],
56
32
  ['quotaSnapshots', resourceUrl(input.ownerWebId, models_1.quotaSnapshotResource, input.podBaseUrl)],
57
- ...exports.AI_CONNECTIONS_PROVIDER_DOCUMENT_IDS.map((provider) => [
33
+ ...provider_catalog_1.AI_CONNECTIONS_PROVIDER_DOCUMENT_IDS.map((provider) => [
58
34
  `providerDocument:${provider}`,
59
35
  providerDocumentUrl(input.ownerWebId, provider, input.podBaseUrl),
60
36
  ]),
@@ -42,5 +42,4 @@ export declare class ClientCredentialsAuthenticator implements Authenticator {
42
42
  canAuthenticate(request: IncomingMessage): boolean;
43
43
  authenticate(request: IncomingMessage): Promise<AuthResult>;
44
44
  private exchangeForToken;
45
- private isJwt;
46
45
  }
@@ -173,9 +173,6 @@ class ClientCredentialsAuthenticator {
173
173
  return { success: false, error: 'Token exchange failed' };
174
174
  }
175
175
  }
176
- isJwt(token) {
177
- return /^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/.test(token);
178
- }
179
176
  }
180
177
  exports.ClientCredentialsAuthenticator = ClientCredentialsAuthenticator;
181
178
  function tokenEndpointRoutingHeaders(tokenEndpoint, publicBaseUrl) {
@@ -3,4 +3,5 @@ export * from './AuthContext';
3
3
  export * from './SolidTokenAuthenticator';
4
4
  export * from './ClientCredentialsAuthenticator';
5
5
  export * from './ServiceTokenAuthenticator';
6
+ export * from './NodeTokenAuthenticator';
6
7
  export * from './MultiAuthenticator';
@@ -19,6 +19,6 @@ __exportStar(require("./AuthContext"), exports);
19
19
  __exportStar(require("./SolidTokenAuthenticator"), exports);
20
20
  __exportStar(require("./ClientCredentialsAuthenticator"), exports);
21
21
  __exportStar(require("./ServiceTokenAuthenticator"), exports);
22
- // export * from './NodeTokenAuthenticator'; // TODO: Fix later
22
+ __exportStar(require("./NodeTokenAuthenticator"), exports);
23
23
  __exportStar(require("./MultiAuthenticator"), exports);
24
24
  //# sourceMappingURL=index.js.map
@@ -3,12 +3,21 @@ import type { ThreadMetadata, ThreadRef, ThreadItem, Attachment, Page, StoreItem
3
3
  import { type RunListOptions, type RunRecordData, type RunStepRecordData, type RunStore } from '../runs/store';
4
4
  import { type TaskListOptions, type TaskRecordData, type TaskStore } from '../tasks/store';
5
5
  import { type TaskAuthBindingRepository } from '../tasks/TaskAuthBinding';
6
+ import { type AiCredentialSecretDecoder } from '../../ai/service/AiCredentialSecret';
6
7
  import { CredentialStatus } from '../../credential/schema/types';
7
8
  import { type ServerGroupReconcilerService } from '../reconciler';
8
9
  import { type ReaderAiConfig } from '../../document/ReaderAiConfig';
9
10
  export interface PodChatKitStoreOptions {
10
11
  tokenEndpoint: string;
11
12
  serverGroupReconcilerService?: ServerGroupReconcilerService;
13
+ /**
14
+ * Reads a Pod credential secret (AI Connections envelope, `plaintext-v1`
15
+ * payload, or a legacy bare `apiKey`). Defaults to the plaintext decoder; the
16
+ * container injects a vault-backed one so wrapped Cloud secrets resolve too.
17
+ */
18
+ credentialSecretDecoder?: AiCredentialSecretDecoder;
19
+ /** Deployment whose credentials this runtime prefers when a Pod holds several. */
20
+ deployment?: string;
12
21
  }
13
22
  /**
14
23
  * Pod-based ChatKit Store implementation
@@ -23,6 +32,8 @@ export declare class PodChatKitStore implements ChatKitStore<StoreContext>, RunS
23
32
  private readonly logger;
24
33
  private readonly tokenEndpoint;
25
34
  private readonly serverGroupReconcilerService?;
35
+ private readonly credentialSecretDecoder;
36
+ private readonly deployment?;
26
37
  /** 默认 Chat 容器 ID */
27
38
  private static readonly DEFAULT_CHAT_ID;
28
39
  constructor(options: PodChatKitStoreOptions);
@@ -216,12 +227,32 @@ export declare class PodChatKitStore implements ChatKitStore<StoreContext>, RunS
216
227
  private resolvePodResource;
217
228
  private findProviderForCredential;
218
229
  private findConfiguredEmbeddingModel;
230
+ /**
231
+ * The embedding model this Pod may index with.
232
+ *
233
+ * AI Connections model selection is the allowlist: once a provider has active
234
+ * embedding-typed selections, only those models are usable, and the first one
235
+ * becomes the default when the Pod names none. A provider without an explicit
236
+ * embedding selection keeps the configured model (or the provider default), so
237
+ * existing Pods keep indexing.
238
+ */
239
+ private resolveEmbeddingModel;
240
+ private selectedEmbeddingModels;
219
241
  private sortAiCredentialCandidates;
220
242
  private isTruthyValue;
243
+ private isDeploymentCredential;
221
244
  private timestampValue;
222
245
  private parseIntegerValue;
223
246
  private extractModelId;
224
247
  private queryAiConfigFromSettingsSparql;
248
+ /**
249
+ * AI Connections stores the secret in `encryptedSecret`; older rows carry a
250
+ * bare `apiKey`. Resolve whichever the row has, so a key entered once is usable
251
+ * by chat and by embedding/indexing alike.
252
+ */
253
+ private resolveCredentialSecret;
254
+ private credentialEnabledFromMetadata;
255
+ private parseMetadataValue;
225
256
  getAiConfig(context: StoreContext): Promise<{
226
257
  providerId: string;
227
258
  baseUrl: string;
@@ -27,6 +27,7 @@ const provider_1 = require("../../ai/schema/provider");
27
27
  const model_1 = require("../../ai/schema/model");
28
28
  const config_1 = require("../../ai/schema/config");
29
29
  const defaultEmbeddingProfile_1 = require("../../ai/service/defaultEmbeddingProfile");
30
+ const AiCredentialSecret_1 = require("../../ai/service/AiCredentialSecret");
30
31
  const tables_1 = require("../../credential/schema/tables");
31
32
  const types_2 = require("../../credential/schema/types");
32
33
  const models_1 = require("@undefineds.co/models");
@@ -60,6 +61,8 @@ class PodChatKitStore {
60
61
  // Track recently created message IDs to avoid SELECT cache timing issues
61
62
  this.recentlyCreatedIds = new Set();
62
63
  this.tokenEndpoint = options.tokenEndpoint;
64
+ this.credentialSecretDecoder = options.credentialSecretDecoder ?? AiCredentialSecret_1.defaultAiCredentialSecretDecoder;
65
+ this.deployment = options.deployment;
63
66
  this.serverGroupReconcilerService = options.serverGroupReconcilerService;
64
67
  }
65
68
  /** Build a Pod-scoped context for trusted internal maintenance jobs. */
@@ -1958,8 +1961,60 @@ WHERE { ${deletePatterns.join(' ')} }
1958
1961
  return undefined;
1959
1962
  }
1960
1963
  }
1964
+ /**
1965
+ * The embedding model this Pod may index with.
1966
+ *
1967
+ * AI Connections model selection is the allowlist: once a provider has active
1968
+ * embedding-typed selections, only those models are usable, and the first one
1969
+ * becomes the default when the Pod names none. A provider without an explicit
1970
+ * embedding selection keeps the configured model (or the provider default), so
1971
+ * existing Pods keep indexing.
1972
+ */
1973
+ async resolveEmbeddingModel(db, providerId) {
1974
+ const configured = await this.findConfiguredEmbeddingModel(db, providerId)
1975
+ ?? (0, defaultEmbeddingProfile_1.defaultEmbeddingModelForProvider)(providerId);
1976
+ const selected = await this.selectedEmbeddingModels(db, providerId);
1977
+ if (selected.length === 0) {
1978
+ return configured;
1979
+ }
1980
+ if (!configured) {
1981
+ return selected[0];
1982
+ }
1983
+ return selected.some((model) => model.toLowerCase() === configured.toLowerCase())
1984
+ ? configured
1985
+ : undefined;
1986
+ }
1987
+ async selectedEmbeddingModels(db, providerId) {
1988
+ try {
1989
+ const rows = await db.select().from(model_1.Model);
1990
+ const selected = new Set();
1991
+ for (const row of rows) {
1992
+ if (!row || String(row.status ?? '') !== 'active')
1993
+ continue;
1994
+ if (String(row.modelType ?? '').toLowerCase() !== 'embedding')
1995
+ continue;
1996
+ const rowProvider = this.extractProviderId(String(row.isProvidedBy ?? ''));
1997
+ if (rowProvider && rowProvider !== providerId)
1998
+ continue;
1999
+ const id = this.extractModelId(String(row.id ?? ''));
2000
+ if (id)
2001
+ selected.add(id);
2002
+ }
2003
+ return [...selected];
2004
+ }
2005
+ catch (error) {
2006
+ this.logger.warn(`Failed to read AI model selections for ${providerId}: ${error}`);
2007
+ return [];
2008
+ }
2009
+ }
1961
2010
  sortAiCredentialCandidates(credentials) {
1962
2011
  return [...credentials].sort((left, right) => {
2012
+ // A Pod can hold credentials for more than one deployment. Prefer this
2013
+ // runtime's own deployment, exactly like the Gateway credential lookup.
2014
+ const deploymentDelta = Number(this.isDeploymentCredential(right.id)) - Number(this.isDeploymentCredential(left.id));
2015
+ if (deploymentDelta !== 0) {
2016
+ return deploymentDelta;
2017
+ }
1963
2018
  const defaultDelta = Number(this.isTruthyValue(right.isDefault)) - Number(this.isTruthyValue(left.isDefault));
1964
2019
  if (defaultDelta !== 0) {
1965
2020
  return defaultDelta;
@@ -1981,6 +2036,11 @@ WHERE { ${deletePatterns.join(' ')} }
1981
2036
  isTruthyValue(value) {
1982
2037
  return value === true || value === 'true' || value === 1 || value === '1';
1983
2038
  }
2039
+ isDeploymentCredential(id) {
2040
+ const deployment = this.deployment?.trim().toLowerCase();
2041
+ const value = typeof id === 'string' ? id.trim().toLowerCase() : '';
2042
+ return Boolean(deployment && value.startsWith(`${deployment}-`));
2043
+ }
1984
2044
  timestampValue(value) {
1985
2045
  if (value instanceof Date) {
1986
2046
  return value.getTime();
@@ -2028,11 +2088,15 @@ WHERE { ${deletePatterns.join(' ')} }
2028
2088
  PREFIX cred: <https://vocab.xpod.dev/credential#>
2029
2089
  PREFIX ai: <https://vocab.xpod.dev/ai#>
2030
2090
  PREFIX udfs: <https://undefineds.co/ns#>
2031
- SELECT ?cred ?provider ?apiKey ?isDefault ?lastUsedAt ?failCount ?providerBaseUrl ?credentialBaseUrl ?providerProxyUrl ?credentialProxyUrl ?defaultModel ?hasModel
2091
+ SELECT ?cred ?provider ?apiKey ?encryptedSecret ?secretPayload ?storageMode ?metadata ?isDefault ?lastUsedAt ?failCount ?providerBaseUrl ?credentialBaseUrl ?providerProxyUrl ?credentialProxyUrl ?defaultModel ?hasModel
2032
2092
  WHERE {
2033
2093
  ?cred (cred:service|udfs:service) "ai" ;
2034
- (cred:status|udfs:status) "active" ;
2035
- (cred:apiKey|udfs:apiKey) ?apiKey .
2094
+ (cred:status|udfs:status) "active" .
2095
+ OPTIONAL { ?cred (cred:apiKey|udfs:apiKey) ?apiKey . }
2096
+ OPTIONAL { ?cred (cred:encryptedSecret|udfs:encryptedSecret) ?encryptedSecret . }
2097
+ OPTIONAL { ?cred (cred:secretPayload|udfs:secretPayload) ?secretPayload . }
2098
+ OPTIONAL { ?cred (cred:storageMode|udfs:storageMode) ?storageMode . }
2099
+ OPTIONAL { ?cred (cred:metadata|udfs:metadata) ?metadata . }
2036
2100
  OPTIONAL { ?cred (cred:provider|udfs:provider) ?provider . }
2037
2101
  OPTIONAL { ?cred (cred:isDefault|udfs:isDefault) ?isDefault . }
2038
2102
  OPTIONAL { ?cred (cred:lastUsedAt|udfs:lastUsedAt) ?lastUsedAt . }
@@ -2061,11 +2125,17 @@ WHERE { ${deletePatterns.join(' ')} }
2061
2125
  const credentials = (json.results?.bindings ?? []).map((binding) => {
2062
2126
  const credentialIri = this.parseSparqlBindingValue(binding, 'cred') ?? '';
2063
2127
  const providerRef = this.parseSparqlBindingValue(binding, 'provider');
2128
+ const metadata = this.parseMetadataValue(this.parseSparqlBindingValue(binding, 'metadata') ?? undefined);
2064
2129
  return {
2065
2130
  id: this.baseRelativeIdFromPodPath(credentialIri, context, '/settings/'),
2131
+ credentialIri,
2066
2132
  provider: providerRef,
2067
2133
  providerId: providerRef ? this.extractProviderId(providerRef) : null,
2068
2134
  apiKey: this.parseSparqlBindingValue(binding, 'apiKey'),
2135
+ encryptedSecret: this.parseSparqlBindingValue(binding, 'encryptedSecret'),
2136
+ secretPayload: this.parseSparqlBindingValue(binding, 'secretPayload'),
2137
+ storageMode: this.parseSparqlBindingValue(binding, 'storageMode'),
2138
+ enabled: this.credentialEnabledFromMetadata(metadata),
2069
2139
  isDefault: this.parseSparqlBindingValue(binding, 'isDefault'),
2070
2140
  lastUsedAt: this.parseSparqlBindingValue(binding, 'lastUsedAt'),
2071
2141
  failCount: this.parseIntegerValue(this.parseSparqlBindingValue(binding, 'failCount')),
@@ -2078,25 +2148,74 @@ WHERE { ${deletePatterns.join(' ')} }
2078
2148
  };
2079
2149
  });
2080
2150
  for (const cred of this.sortAiCredentialCandidates(credentials)) {
2081
- if (!cred.provider || !cred.apiKey || !cred.baseUrl) {
2151
+ if (!cred.provider || !cred.baseUrl || cred.enabled === false) {
2082
2152
  continue;
2083
2153
  }
2084
2154
  const providerId = cred.providerId || this.extractProviderId(cred.provider);
2085
2155
  if (!providerId) {
2086
2156
  continue;
2087
2157
  }
2158
+ const secret = await this.resolveCredentialSecret(cred, context, providerId);
2159
+ const apiKey = (0, AiCredentialSecret_1.providerTokenFromSecret)(secret) ?? cred.apiKey;
2160
+ if (!apiKey) {
2161
+ continue;
2162
+ }
2088
2163
  this.logger.debug(`Using credential ${cred.id} with provider ${providerId}`);
2089
2164
  return {
2090
2165
  providerId,
2091
2166
  baseUrl: cred.baseUrl,
2092
2167
  proxyUrl: cred.proxyUrl || undefined,
2093
2168
  defaultModel: this.extractModelId(cred.defaultModel),
2094
- apiKey: cred.apiKey,
2169
+ apiKey,
2095
2170
  credentialId: cred.id,
2096
2171
  };
2097
2172
  }
2098
2173
  return undefined;
2099
2174
  }
2175
+ /**
2176
+ * AI Connections stores the secret in `encryptedSecret`; older rows carry a
2177
+ * bare `apiKey`. Resolve whichever the row has, so a key entered once is usable
2178
+ * by chat and by embedding/indexing alike.
2179
+ */
2180
+ async resolveCredentialSecret(row, context, providerId) {
2181
+ const rowIri = row.credentialIri;
2182
+ const credentialIri = typeof rowIri === 'string' && rowIri
2183
+ ? rowIri
2184
+ : this.resolvePodResource(context, `settings/credentials.ttl#${(0, models_1.normalizeAIConfigResourceId)(String(row.id ?? ''))}`);
2185
+ try {
2186
+ const secret = await this.credentialSecretDecoder(row, {
2187
+ webId: typeof context.webId === 'string' ? context.webId : '',
2188
+ credentialIri,
2189
+ provider: providerId,
2190
+ });
2191
+ return secret;
2192
+ }
2193
+ catch (error) {
2194
+ this.logger.warn(`Failed to read AI credential secret ${String(row.id)}: ${error}`);
2195
+ return undefined;
2196
+ }
2197
+ }
2198
+ credentialEnabledFromMetadata(metadata) {
2199
+ const enabled = metadata?.enabled;
2200
+ return typeof enabled === 'boolean' ? enabled : undefined;
2201
+ }
2202
+ parseMetadataValue(value) {
2203
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
2204
+ return value;
2205
+ }
2206
+ if (typeof value !== 'string' || !value.trim()) {
2207
+ return undefined;
2208
+ }
2209
+ try {
2210
+ const parsed = JSON.parse(value);
2211
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
2212
+ ? parsed
2213
+ : undefined;
2214
+ }
2215
+ catch {
2216
+ return undefined;
2217
+ }
2218
+ }
2100
2219
  async getAiConfig(context) {
2101
2220
  const db = await this.getDb(context);
2102
2221
  if (!db) {
@@ -2124,6 +2243,8 @@ WHERE { ${deletePatterns.join(' ')} }
2124
2243
  for (const cred of this.sortAiCredentialCandidates(credentials)) {
2125
2244
  if (!cred.provider)
2126
2245
  continue;
2246
+ if (this.credentialEnabledFromMetadata(this.parseMetadataValue(cred.metadata)) === false)
2247
+ continue;
2127
2248
  const provider = await this.findProviderForCredential(db, context, cred.provider);
2128
2249
  if (!provider)
2129
2250
  continue;
@@ -2131,12 +2252,15 @@ WHERE { ${deletePatterns.join(' ')} }
2131
2252
  const baseUrl = provider.baseUrl || (0, defaultEmbeddingProfile_1.defaultBaseUrlForProvider)(providerId);
2132
2253
  if (!baseUrl)
2133
2254
  continue;
2255
+ const secret = await this.resolveCredentialSecret({ ...cred, credentialIri: cred.id }, context, providerId);
2256
+ const apiKey = (0, AiCredentialSecret_1.providerTokenFromSecret)(secret);
2257
+ if (!apiKey)
2258
+ continue;
2134
2259
  const defaultModelRef = provider.defaultModel ?? provider.hasModel;
2135
2260
  const defaultModel = defaultModelRef
2136
2261
  ? (await db.findByIri(model_1.Model, defaultModelRef))?.id ?? undefined
2137
2262
  : undefined;
2138
- const embeddingModel = await this.findConfiguredEmbeddingModel(db, providerId)
2139
- ?? (0, defaultEmbeddingProfile_1.defaultEmbeddingModelForProvider)(providerId);
2263
+ const embeddingModel = await this.resolveEmbeddingModel(db, providerId);
2140
2264
  this.logger.debug(`Using credential ${cred.id} with provider ${providerId}`);
2141
2265
  return {
2142
2266
  providerId,
@@ -2144,7 +2268,7 @@ WHERE { ${deletePatterns.join(' ')} }
2144
2268
  proxyUrl: provider.proxyUrl || undefined,
2145
2269
  defaultModel,
2146
2270
  embeddingModel,
2147
- apiKey: cred.apiKey,
2271
+ apiKey,
2148
2272
  credentialId: cred.id,
2149
2273
  };
2150
2274
  }
@@ -30,6 +30,7 @@ const PodGatewayAccessKeyRepository_1 = require("../ai-gateway/auth/PodGatewayAc
30
30
  const HostedPodDataAccess_1 = require("../ai-gateway/pod/HostedPodDataAccess");
31
31
  const AiGatewayService_1 = require("../ai-gateway/AiGatewayService");
32
32
  const PlaintextCredentialVault_1 = require("../ai-gateway/credentials/PlaintextCredentialVault");
33
+ const AiCredentialSecretDecoder_1 = require("../ai-gateway/credentials/AiCredentialSecretDecoder");
33
34
  const connect_1 = require("../ai-gateway/connect");
34
35
  const LoopbackAuthorizationCallbackReceiver_1 = require("../ai-gateway/connect/LoopbackAuthorizationCallbackReceiver");
35
36
  const FileSessionImportAdapter_1 = require("../ai-gateway/connect/FileSessionImportAdapter");
@@ -277,10 +278,16 @@ function registerCommonServices(container) {
277
278
  discoveryRegistry: (0, ProviderModelDiscoveryAdapters_1.createProviderModelDiscoveryAdapters)({ registry: gatewayProviderRegistry }),
278
279
  modelsService: providerModelsService,
279
280
  credentialVault: credentialVaultForConfig(config),
281
+ embeddingModelPolicy: cradle.embeddingModelPolicy,
280
282
  });
281
283
  }).singleton(),
282
- gatewayRuntimeRegistry: (0, awilix_1.asFunction)(({ gatewayProviderRegistry, providerHttpTransport }) => {
283
- return new ProviderRuntimeRegistry_1.ProviderRuntimeRegistry({ registry: gatewayProviderRegistry, transport: providerHttpTransport });
284
+ gatewayRuntimeRegistry: (0, awilix_1.asFunction)(({ config, gatewayProviderRegistry, providerHttpTransport }) => {
285
+ return new ProviderRuntimeRegistry_1.ProviderRuntimeRegistry({
286
+ registry: gatewayProviderRegistry,
287
+ transport: providerHttpTransport,
288
+ // A user-owned endpoint is a Local capability; Cloud uses the catalog's.
289
+ allowCredentialBaseUrl: config.edition === 'local',
290
+ });
284
291
  }).singleton(),
285
292
  gatewaySessionAffinityStore: (0, awilix_1.asFunction)(({ config }) => {
286
293
  // Session affinity secrets are process-local by default: a fresh random
@@ -306,6 +313,7 @@ function registerCommonServices(container) {
306
313
  registry: gatewayProviderRegistry,
307
314
  affinityStore: gatewaySessionAffinityStore,
308
315
  credentials: gatewayCredentialStore.listCredentials.bind(gatewayCredentialStore),
316
+ embeddingModelPolicy: cradle.embeddingModelPolicy,
309
317
  });
310
318
  const cloudGatewayOrigin = (0, CloudGatewayModelsClient_1.resolveCloudModelsGatewayOrigin)({
311
319
  edition: config.edition,
@@ -441,6 +449,8 @@ function registerCommonServices(container) {
441
449
  internalPodAccess: cradle.hostedPodDataAccess,
442
450
  podBaseUrlResolver: podBaseUrlResolver(cradle),
443
451
  }),
452
+ embeddingModelPolicy: cradle.embeddingModelPolicy,
453
+ registry: cradle.gatewayProviderRegistry,
444
454
  });
445
455
  }).singleton(),
446
456
  authenticator: (0, awilix_1.asFunction)(({ nodeRepo, serviceTokenRepo, invocationTokenCodec, gatewayAccessKeyRepository, config, }) => {
@@ -505,6 +515,10 @@ function registerCommonServices(container) {
505
515
  return new chatkit_1.PodChatKitStore({
506
516
  tokenEndpoint: config.cssTokenEndpoint,
507
517
  serverGroupReconcilerService,
518
+ deployment: config.edition,
519
+ credentialSecretDecoder: (0, AiCredentialSecretDecoder_1.createAiCredentialSecretDecoder)({
520
+ vault: credentialVaultForConfig(config),
521
+ }),
508
522
  });
509
523
  }).singleton(),
510
524
  clientReconcilerCoordinator: (0, awilix_1.asFunction)(({ config }) => {
@@ -634,8 +648,14 @@ function registerCommonServices(container) {
634
648
  providerRegistry: (0, awilix_1.asFunction)(() => {
635
649
  return new service_1.ProviderRegistryImpl();
636
650
  }).singleton(),
637
- embeddingService: (0, awilix_1.asFunction)(({ providerRegistry }) => {
638
- return new service_1.EmbeddingServiceImpl(providerRegistry);
651
+ embeddingModelPolicy: (0, awilix_1.asFunction)(({ config, gatewayProviderRegistry }) => {
652
+ return (0, service_1.createEmbeddingModelPolicy)({
653
+ deployment: config.edition,
654
+ catalog: (0, models_1.createGatewayEmbeddingModelCatalog)(gatewayProviderRegistry, config.edition),
655
+ });
656
+ }).singleton(),
657
+ embeddingService: (0, awilix_1.asFunction)(({ providerRegistry, embeddingModelPolicy }) => {
658
+ return new service_1.EmbeddingServiceImpl(providerRegistry, { policy: embeddingModelPolicy });
639
659
  }).singleton(),
640
660
  vectorService: (0, awilix_1.asFunction)(({ chatKitStore, embeddingService }) => {
641
661
  return new VectorService_1.VectorService({
@@ -260,6 +260,7 @@ function registerSharedRoutes(container, server) {
260
260
  podLookupRepository,
261
261
  store: aiConfigStore,
262
262
  lifecycle: aiConfigLifecycle,
263
+ embeddingModelPolicy: container.resolve('embeddingModelPolicy', { allowUnregistered: true }),
263
264
  capabilities: () => ({
264
265
  textBackends: config.edition === 'cloud' && config.sparqlEndpoint ? ['postgres-fts'] : [],
265
266
  vectorBackends: config.edition === 'cloud' && config.sparqlEndpoint ? ['pgvector'] : ['vec'],
@@ -449,13 +450,15 @@ function resolveLocalStorageProviderBaseUrl(config, env = process.env) {
449
450
  function registerLocalRoutes(container, server) {
450
451
  const config = container.resolve('config');
451
452
  (0, LinxCapabilitiesHandler_1.registerLinxCapabilitiesRoutes)(server);
453
+ // DDNS state (托管式 Local 模式). One manager answers both the DDNS status
454
+ // route and the admin reachability verdict, which must agree.
455
+ const ddnsManager = resolveDdnsManager(container);
452
456
  // Admin API (配置管理、重启)
453
457
  (0, AdminHandler_1.registerAdminRoutes)(server, {
454
458
  internalAdminAuthSecret: config.gatewayAdminProxyAuthSecret,
459
+ ddnsManager,
455
460
  });
456
- // DDNS status (托管式 Local 模式)
457
461
  try {
458
- const ddnsManager = container.resolve('ddnsManager', { allowUnregistered: true });
459
462
  (0, AdminDdnsHandler_1.registerAdminDdnsRoutes)(server, {
460
463
  ddnsManager,
461
464
  internalAdminAuthSecret: config.gatewayAdminProxyAuthSecret,
@@ -548,6 +551,18 @@ function readPositiveInteger(value) {
548
551
  const parsed = Number.parseInt(value, 10);
549
552
  return Number.isInteger(parsed) && parsed > 0 ? parsed : undefined;
550
553
  }
554
+ /**
555
+ * The DDNS manager is optional: a node without `XPOD_NODE_TOKEN` registers no
556
+ * DDNS routes and reports its public route as unknowable rather than failed.
557
+ */
558
+ function resolveDdnsManager(container) {
559
+ try {
560
+ return container.resolve('ddnsManager', { allowUnregistered: true });
561
+ }
562
+ catch {
563
+ return undefined;
564
+ }
565
+ }
551
566
  function resolveNetworkEndpoint(config) {
552
567
  const configured = config.publicUrl
553
568
  ?? config.activeTunnelProfile?.publicUrl
@@ -25,7 +25,7 @@ import type { ChatKitService, AiProvider } from '../chatkit';
25
25
  import type { StoreContext } from '../chatkit/store';
26
26
  import type { PodChatKitStore } from '../chatkit/pod-store';
27
27
  import type { RuntimeHost } from '../../runtime/host/types';
28
- import type { ProviderRegistry, EmbeddingService } from '../../ai/service';
28
+ import type { ProviderRegistry, EmbeddingService, EmbeddingModelPolicy } from '../../ai/service';
29
29
  import type { VectorService } from '../service/VectorService';
30
30
  import type { RdfSearchIndexingService } from '../service/RdfSearchIndexingService';
31
31
  import type { RdfSearchReconciliationRepository } from '../../search/RdfSearchReconciliationRepository';
@@ -239,6 +239,8 @@ export interface ApiContainerCradle {
239
239
  serverGroupReconcilerService: ServerGroupReconcilerService;
240
240
  providerRegistry: ProviderRegistry;
241
241
  embeddingService: EmbeddingService;
242
+ /** Deployment embedding policy: cloud only allows models the gateway catalog provides. */
243
+ embeddingModelPolicy: EmbeddingModelPolicy;
242
244
  vectorService: VectorService;
243
245
  rdfStorageStatsService: RdfStorageStatsService;
244
246
  ddnsRepo?: DdnsRepository;