@undefineds.co/xpod 0.4.10 → 0.4.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/config/components-ignore.json +5 -1
  2. package/config/notifications.json +68 -0
  3. package/config/xpod.base.json +9 -11
  4. package/dist/ai/service/AiCredentialSecret.d.ts +30 -0
  5. package/dist/ai/service/AiCredentialSecret.js +120 -0
  6. package/dist/ai/service/CredentialReaderImpl.d.ts +18 -0
  7. package/dist/ai/service/CredentialReaderImpl.js +81 -5
  8. package/dist/ai/service/CredentialReaderImpl.jsonld +42 -2
  9. package/dist/ai/service/EmbeddingModelPolicy.d.ts +79 -0
  10. package/dist/ai/service/EmbeddingModelPolicy.js +134 -0
  11. package/dist/ai/service/EmbeddingProviderError.js +6 -0
  12. package/dist/ai/service/EmbeddingServiceImpl.d.ts +13 -1
  13. package/dist/ai/service/EmbeddingServiceImpl.js +18 -5
  14. package/dist/ai/service/EmbeddingServiceImpl.jsonld +35 -0
  15. package/dist/ai/service/index.d.ts +2 -0
  16. package/dist/ai/service/index.js +2 -0
  17. package/dist/api/ai-gateway/connect/index.d.ts +20 -2
  18. package/dist/api/ai-gateway/connect/index.js +162 -16
  19. package/dist/api/ai-gateway/credentials/AiCredentialSecretDecoder.d.ts +12 -0
  20. package/dist/api/ai-gateway/credentials/AiCredentialSecretDecoder.js +30 -0
  21. package/dist/api/ai-gateway/errors.d.ts +1 -1
  22. package/dist/api/ai-gateway/models/GatewayEmbeddingModelCatalog.d.ts +11 -0
  23. package/dist/api/ai-gateway/models/GatewayEmbeddingModelCatalog.js +31 -0
  24. package/dist/api/ai-gateway/models/PodModelSelectionRepository.js +7 -3
  25. package/dist/api/ai-gateway/models/ProviderCustomModelsService.d.ts +18 -0
  26. package/dist/api/ai-gateway/models/ProviderCustomModelsService.js +23 -0
  27. package/dist/api/ai-gateway/models/ProviderModelDiscoveryAdapters.d.ts +3 -1
  28. package/dist/api/ai-gateway/models/ProviderModelDiscoveryAdapters.js +2 -45
  29. package/dist/api/ai-gateway/models/ProviderModelSelectionService.d.ts +10 -0
  30. package/dist/api/ai-gateway/models/ProviderModelSelectionService.js +57 -20
  31. package/dist/api/ai-gateway/models/ProviderModelType.d.ts +28 -0
  32. package/dist/api/ai-gateway/models/ProviderModelType.js +34 -0
  33. package/dist/api/ai-gateway/models/ProviderModelsAdapter.d.ts +10 -0
  34. package/dist/api/ai-gateway/models/ProviderModelsAdapter.js +3 -4
  35. package/dist/api/ai-gateway/models/index.d.ts +1 -0
  36. package/dist/api/ai-gateway/models/index.js +3 -1
  37. package/dist/api/ai-gateway/providers/CustomRuntimeAdapter.d.ts +7 -0
  38. package/dist/api/ai-gateway/providers/CustomRuntimeAdapter.js +9 -2
  39. package/dist/api/ai-gateway/providers/ModelsDevCatalog.d.ts +7 -1
  40. package/dist/api/ai-gateway/providers/ModelsDevCatalog.js +4 -10
  41. package/dist/api/ai-gateway/providers/ProviderRegistry.d.ts +107 -0
  42. package/dist/api/ai-gateway/providers/ProviderRegistry.js +244 -21
  43. package/dist/api/ai-gateway/providers/ProviderRuntimeRegistry.d.ts +5 -0
  44. package/dist/api/ai-gateway/providers/ProviderRuntimeRegistry.js +5 -1
  45. package/dist/api/ai-gateway/quota/SubscriptionQuotaAdapters.d.ts +12 -4
  46. package/dist/api/ai-gateway/quota/SubscriptionQuotaAdapters.js +11 -11
  47. package/dist/api/ai-gateway/routing/ModelRouter.d.ts +14 -0
  48. package/dist/api/ai-gateway/routing/ModelRouter.js +43 -4
  49. package/dist/api/ai-gateway/service-access/AiConnectionsServiceAccess.d.ts +9 -1
  50. package/dist/api/ai-gateway/service-access/AiConnectionsServiceAccess.js +3 -27
  51. package/dist/api/auth/ClientCredentialsAuthenticator.d.ts +0 -1
  52. package/dist/api/auth/ClientCredentialsAuthenticator.js +0 -3
  53. package/dist/api/auth/index.d.ts +1 -0
  54. package/dist/api/auth/index.js +1 -1
  55. package/dist/api/chatkit/pod-store.d.ts +31 -0
  56. package/dist/api/chatkit/pod-store.js +132 -8
  57. package/dist/api/container/common.js +24 -4
  58. package/dist/api/container/routes.js +17 -2
  59. package/dist/api/container/types.d.ts +3 -1
  60. package/dist/api/handlers/AdminHandler.d.ts +13 -0
  61. package/dist/api/handlers/AdminHandler.js +47 -18
  62. package/dist/api/handlers/AiConfigHandler.d.ts +6 -0
  63. package/dist/api/handlers/AiConfigHandler.js +28 -0
  64. package/dist/api/handlers/AiGatewayManagementHandler.js +36 -0
  65. package/dist/api/runs/RdfRunContextRetriever.d.ts +14 -0
  66. package/dist/api/runs/RdfRunContextRetriever.js +41 -5
  67. package/dist/api/runtime.js +2 -1
  68. package/dist/cli/commands/secret.d.ts +1 -0
  69. package/dist/cli/commands/secret.js +25 -7
  70. package/dist/components/components.jsonld +3 -1
  71. package/dist/components/context.jsonld +53 -1
  72. package/dist/http/SubgraphSparqlHttpHandler.d.ts +59 -2
  73. package/dist/http/SubgraphSparqlHttpHandler.js +145 -13
  74. package/dist/http/SubgraphSparqlHttpHandler.jsonld +37 -0
  75. package/dist/identity/drizzle/AccountRoleRepository.d.ts +30 -2
  76. package/dist/identity/drizzle/AccountRoleRepository.js +163 -15
  77. package/dist/identity/drizzle/EdgeNodeRepository.d.ts +0 -12
  78. package/dist/identity/drizzle/EdgeNodeRepository.js +5 -13
  79. package/dist/identity/drizzle/PodLookupRepository.d.ts +58 -4
  80. package/dist/identity/drizzle/PodLookupRepository.js +248 -105
  81. package/dist/identity/drizzle/db.d.ts +19 -0
  82. package/dist/identity/drizzle/db.js +39 -4
  83. package/dist/index.d.ts +2 -1
  84. package/dist/index.js +7 -3
  85. package/dist/logging/log-file.d.ts +17 -0
  86. package/dist/logging/log-file.js +69 -0
  87. package/dist/main.js +2 -1
  88. package/dist/notifications/NotificationChannelSweeper.d.ts +50 -0
  89. package/dist/notifications/NotificationChannelSweeper.js +131 -0
  90. package/dist/notifications/NotificationChannelSweeper.jsonld +136 -0
  91. package/dist/notifications/ReclaimingWebSocket2023Storer.d.ts +25 -0
  92. package/dist/notifications/ReclaimingWebSocket2023Storer.js +56 -0
  93. package/dist/notifications/ReclaimingWebSocket2023Storer.jsonld +77 -0
  94. package/dist/notifications/index.d.ts +2 -0
  95. package/dist/notifications/index.js +2 -0
  96. package/dist/runtime/Proxy.d.ts +37 -0
  97. package/dist/runtime/Proxy.js +88 -16
  98. package/dist/runtime/bootstrap.js +2 -1
  99. package/dist/runtime/upgrade/BunNativeUpgradeRelay.d.ts +116 -0
  100. package/dist/runtime/upgrade/BunNativeUpgradeRelay.js +423 -0
  101. package/dist/runtime/upgrade/UpgradeHandshake.d.ts +63 -0
  102. package/dist/runtime/upgrade/UpgradeHandshake.js +199 -0
  103. package/dist/runtime/upgrade/WebSocketFrames.d.ts +67 -0
  104. package/dist/runtime/upgrade/WebSocketFrames.js +224 -0
  105. package/node_modules/@undefineds.co/ai-connections/dist/AiApiKeyPool.js +8 -1
  106. package/node_modules/@undefineds.co/ai-connections/dist/AiAuthorizationActions.d.ts +11 -2
  107. package/node_modules/@undefineds.co/ai-connections/dist/AiAuthorizationActions.js +27 -10
  108. package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.d.ts +7 -0
  109. package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.js +13 -11
  110. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectDialog.js +1 -1
  111. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsList.js +10 -6
  112. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMain.d.ts +15 -0
  113. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMain.js +29 -3
  114. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMainHeader.js +18 -3
  115. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.d.ts +16 -1
  116. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.js +92 -20
  117. package/node_modules/@undefineds.co/ai-connections/dist/AiCopyButton.d.ts +35 -0
  118. package/node_modules/@undefineds.co/ai-connections/dist/AiCopyButton.js +45 -0
  119. package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialPoolSection.js +71 -11
  120. package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialRow.js +9 -7
  121. package/node_modules/@undefineds.co/ai-connections/dist/AiEndpointList.d.ts +23 -0
  122. package/node_modules/@undefineds.co/ai-connections/dist/AiEndpointList.js +24 -0
  123. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.d.ts +13 -4
  124. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.js +35 -38
  125. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayModelsSection.d.ts +21 -0
  126. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayModelsSection.js +51 -0
  127. package/node_modules/@undefineds.co/ai-connections/dist/AiInfoTooltip.d.ts +15 -0
  128. package/node_modules/@undefineds.co/ai-connections/dist/AiInfoTooltip.js +16 -0
  129. package/node_modules/@undefineds.co/ai-connections/dist/AiModelCatalog.d.ts +175 -0
  130. package/node_modules/@undefineds.co/ai-connections/dist/AiModelCatalog.js +133 -0
  131. package/node_modules/@undefineds.co/ai-connections/dist/AiOfferingDetails.js +2 -2
  132. package/node_modules/@undefineds.co/ai-connections/dist/AiProviderCard.js +13 -64
  133. package/node_modules/@undefineds.co/ai-connections/dist/AiProviderHeader.d.ts +21 -0
  134. package/node_modules/@undefineds.co/ai-connections/dist/AiProviderHeader.js +12 -0
  135. package/node_modules/@undefineds.co/ai-connections/dist/AiRowAction.d.ts +15 -0
  136. package/node_modules/@undefineds.co/ai-connections/dist/AiRowAction.js +12 -0
  137. package/node_modules/@undefineds.co/ai-connections/dist/AiSortableCredentialList.js +2 -1
  138. package/node_modules/@undefineds.co/ai-connections/dist/ai-connections-client.d.ts +7 -0
  139. package/node_modules/@undefineds.co/ai-connections/dist/ai-connections-client.js +6 -0
  140. package/node_modules/@undefineds.co/ai-connections/dist/authorization-methods.d.ts +36 -5
  141. package/node_modules/@undefineds.co/ai-connections/dist/authorization-methods.js +52 -9
  142. package/node_modules/@undefineds.co/ai-connections/dist/client/normalize.js +30 -3
  143. package/node_modules/@undefineds.co/ai-connections/dist/client/types.d.ts +21 -1
  144. package/node_modules/@undefineds.co/ai-connections/dist/client-config/base-adapter.d.ts +1 -3
  145. package/node_modules/@undefineds.co/ai-connections/dist/client-config/base-adapter.js +3 -7
  146. package/node_modules/@undefineds.co/ai-connections/dist/client-config/index.cjs +9 -7
  147. package/node_modules/@undefineds.co/ai-connections/dist/collection-runtime.d.ts +46 -0
  148. package/node_modules/@undefineds.co/ai-connections/dist/collection-runtime.js +231 -0
  149. package/node_modules/@undefineds.co/ai-connections/dist/collections.d.ts +119 -0
  150. package/node_modules/@undefineds.co/ai-connections/dist/collections.js +173 -0
  151. package/node_modules/@undefineds.co/ai-connections/dist/controller.d.ts +71 -5
  152. package/node_modules/@undefineds.co/ai-connections/dist/controller.js +285 -16
  153. package/node_modules/@undefineds.co/ai-connections/dist/credential-labels.d.ts +5 -0
  154. package/node_modules/@undefineds.co/ai-connections/dist/credential-labels.js +8 -3
  155. package/node_modules/@undefineds.co/ai-connections/dist/credential-storage.d.ts +59 -0
  156. package/node_modules/@undefineds.co/ai-connections/dist/credential-storage.js +131 -0
  157. package/node_modules/@undefineds.co/ai-connections/dist/endpoint-urls.d.ts +15 -0
  158. package/node_modules/@undefineds.co/ai-connections/dist/endpoint-urls.js +20 -0
  159. package/node_modules/@undefineds.co/ai-connections/dist/gateway-endpoints.d.ts +14 -0
  160. package/node_modules/@undefineds.co/ai-connections/dist/gateway-endpoints.js +20 -0
  161. package/node_modules/@undefineds.co/ai-connections/dist/index.d.ts +8 -0
  162. package/node_modules/@undefineds.co/ai-connections/dist/index.js +8 -0
  163. package/node_modules/@undefineds.co/ai-connections/dist/manifest.js +1 -1
  164. package/node_modules/@undefineds.co/ai-connections/dist/offering-endpoints.d.ts +14 -0
  165. package/node_modules/@undefineds.co/ai-connections/dist/offering-endpoints.js +17 -0
  166. package/node_modules/@undefineds.co/ai-connections/dist/provider-catalog.cjs +68 -1
  167. package/node_modules/@undefineds.co/ai-connections/dist/provider-catalog.d.ts +75 -1
  168. package/node_modules/@undefineds.co/ai-connections/dist/provider-catalog.js +119 -0
  169. package/node_modules/@undefineds.co/ai-connections/dist/provider-visuals.d.ts +5 -0
  170. package/node_modules/@undefineds.co/ai-connections/dist/provider-visuals.js +5 -0
  171. package/node_modules/@undefineds.co/ai-connections/dist/service-access.js +2 -27
  172. package/node_modules/@undefineds.co/ai-connections/package.json +1 -0
  173. package/node_modules/@undefineds.co/extension-sdk/dist/manifest.d.ts +1 -1
  174. package/node_modules/@undefineds.co/extension-sdk/dist/manifest.js +2 -0
  175. package/node_modules/@undefineds.co/extension-sdk/dist/web.d.ts +150 -0
  176. package/node_modules/@undefineds.co/extension-sdk/package.json +2 -1
  177. package/node_modules/@undefineds.co/models/README.md +1 -1
  178. package/node_modules/@undefineds.co/models/dist/ai-config/index.d.ts +3 -3
  179. package/node_modules/@undefineds.co/models/dist/ai-gateway.schema.d.ts +5 -0
  180. package/node_modules/@undefineds.co/models/dist/ai-gateway.schema.js +9 -0
  181. package/node_modules/@undefineds.co/models/dist/ai-runtime.repository.d.ts +1 -1
  182. package/node_modules/@undefineds.co/models/dist/approval.repository.d.ts +2 -2
  183. package/node_modules/@undefineds.co/models/dist/audit.presentation.d.ts +2 -2
  184. package/node_modules/@undefineds.co/models/dist/capture.repository.d.ts +1 -1
  185. package/node_modules/@undefineds.co/models/dist/chat-project.repository.d.ts +1 -1
  186. package/node_modules/@undefineds.co/models/dist/chat.repository.d.ts +2 -2
  187. package/node_modules/@undefineds.co/models/dist/control-request.repository.d.ts +2 -2
  188. package/node_modules/@undefineds.co/models/dist/conversation-share.repository.d.ts +1 -1
  189. package/node_modules/@undefineds.co/models/dist/credential.schema.d.ts +12 -0
  190. package/node_modules/@undefineds.co/models/dist/credential.schema.js +15 -1
  191. package/node_modules/@undefineds.co/models/dist/discovery/index.d.ts +2 -2
  192. package/node_modules/@undefineds.co/models/dist/discovery/providers.json +248 -7
  193. package/node_modules/@undefineds.co/models/dist/discovery/types.d.ts +31 -0
  194. package/node_modules/@undefineds.co/models/dist/extension/index.d.ts +1 -1
  195. package/node_modules/@undefineds.co/models/dist/favorite/index.d.ts +2 -2
  196. package/node_modules/@undefineds.co/models/dist/fixtures/contracts-chat-contact.d.ts +5 -5
  197. package/node_modules/@undefineds.co/models/dist/import/index.d.ts +1 -1
  198. package/node_modules/@undefineds.co/models/dist/index.d.ts +73 -73
  199. package/node_modules/@undefineds.co/models/dist/index.js +1 -1
  200. package/node_modules/@undefineds.co/models/dist/input-request.repository.d.ts +2 -2
  201. package/node_modules/@undefineds.co/models/dist/knowledge/index.d.ts +1 -1
  202. package/node_modules/@undefineds.co/models/dist/message.repository.d.ts +1 -1
  203. package/node_modules/@undefineds.co/models/dist/namespaces.js +5 -0
  204. package/node_modules/@undefineds.co/models/dist/pod-storage-descriptor.d.ts +4815 -26
  205. package/node_modules/@undefineds.co/models/dist/pod-storage-descriptor.js +482 -132
  206. package/node_modules/@undefineds.co/models/dist/schema.d.ts +4 -0
  207. package/node_modules/@undefineds.co/models/dist/session/index.d.ts +1 -1
  208. package/node_modules/@undefineds.co/models/dist/settings/index.d.ts +1 -1
  209. package/node_modules/@undefineds.co/models/dist/sidecar/persistence-mapping.d.ts +5 -5
  210. package/node_modules/@undefineds.co/models/dist/thread.repository.d.ts +2 -2
  211. package/node_modules/@undefineds.co/models/dist/types/message-block.d.ts +1 -1
  212. package/node_modules/@undefineds.co/models/dist/vocab/_namespaces.d.ts +1 -1
  213. package/node_modules/@undefineds.co/models/dist/vocab/index.d.ts +10 -10
  214. package/node_modules/@undefineds.co/models/dist/vocab/sidecar.vocab.d.ts +1 -0
  215. package/node_modules/@undefineds.co/models/dist/vocab/sidecar.vocab.js +1 -0
  216. package/node_modules/@undefineds.co/models/package.json +4 -2
  217. package/node_modules/@undefineds.co/pod-collections/README.md +71 -0
  218. package/node_modules/@undefineds.co/pod-collections/dist/diff.d.ts +85 -0
  219. package/node_modules/@undefineds.co/pod-collections/dist/diff.js +166 -0
  220. package/node_modules/@undefineds.co/pod-collections/dist/feed.d.ts +17 -0
  221. package/node_modules/@undefineds.co/pod-collections/dist/feed.js +27 -0
  222. package/node_modules/@undefineds.co/pod-collections/dist/index.cjs +1042 -0
  223. package/node_modules/@undefineds.co/pod-collections/dist/index.d.ts +37 -0
  224. package/node_modules/@undefineds.co/pod-collections/dist/index.js +89 -0
  225. package/node_modules/@undefineds.co/pod-collections/dist/layout.d.ts +75 -0
  226. package/node_modules/@undefineds.co/pod-collections/dist/layout.js +173 -0
  227. package/node_modules/@undefineds.co/pod-collections/dist/mapping.d.ts +78 -0
  228. package/node_modules/@undefineds.co/pod-collections/dist/mapping.js +287 -0
  229. package/node_modules/@undefineds.co/pod-collections/dist/mutations.d.ts +83 -0
  230. package/node_modules/@undefineds.co/pod-collections/dist/mutations.js +273 -0
  231. package/node_modules/@undefineds.co/pod-collections/dist/react.d.ts +21 -0
  232. package/node_modules/@undefineds.co/pod-collections/dist/react.js +22 -0
  233. package/node_modules/@undefineds.co/pod-collections/dist/read.d.ts +65 -0
  234. package/node_modules/@undefineds.co/pod-collections/dist/read.js +31 -0
  235. package/node_modules/@undefineds.co/pod-collections/dist/sync.d.ts +66 -0
  236. package/node_modules/@undefineds.co/pod-collections/dist/sync.js +260 -0
  237. package/node_modules/@undefineds.co/pod-collections/dist/types.d.ts +155 -0
  238. package/node_modules/@undefineds.co/pod-collections/dist/types.js +9 -0
  239. package/node_modules/@undefineds.co/pod-collections/package.json +42 -0
  240. package/node_modules/@undefineds.co/shared-ui/dist/index.d.ts +0 -1
  241. package/node_modules/@undefineds.co/shared-ui/dist/index.js +0 -1
  242. package/package.json +15 -7
  243. package/static/app/assets/main.css +1 -1
  244. package/static/app/assets/main.js +12 -13
  245. package/static/auth-callback/assets/AiConfigContext-DnQs1ZpW.js +1 -0
  246. package/static/auth-callback/assets/AiConfigPage-DOtvlxH0.js +1 -0
  247. package/static/auth-callback/assets/DocumentProcessingPanel-BS2voQgL.js +1 -0
  248. package/static/auth-callback/assets/IndexLifecyclePanel-Cvt0cJtN.js +1 -0
  249. package/static/auth-callback/assets/{IndexSubjectPanel-C4YG0whI.js → IndexSubjectPanel-Dhf01GqF.js} +1 -1
  250. package/static/auth-callback/assets/ModelAssignmentsPanel-BJutWaAF.js +1 -0
  251. package/static/auth-callback/assets/ModelsPage-BRS0sje3.js +11 -0
  252. package/static/auth-callback/assets/{NetworkPage-Cbdn_P1e.js → NetworkPage-B3qBfANA.js} +2 -2
  253. package/static/auth-callback/assets/{PaneListHeader-jy70Q00L.js → PaneListHeader-QQeJGTp4.js} +1 -1
  254. package/static/auth-callback/assets/SearchIndexingPanel-MyNUSEwT.js +1 -0
  255. package/static/auth-callback/assets/{StatusSubjectPanel-hfjoB5aS.js → StatusSubjectPanel-DQkEVsFs.js} +1 -1
  256. package/static/{settings/assets/StatusWorkspace-CKD_Rzdr.js → auth-callback/assets/StatusWorkspace-Dkv63Uwk.js} +1 -1
  257. package/static/auth-callback/assets/SystemSettingsPage-TIsUfX5d.js +1 -0
  258. package/static/auth-callback/assets/SystemSettingsSubjectPanel-BJWEt2-7.js +33 -0
  259. package/static/auth-callback/assets/XpodAiConnectionsPodStore-BJiXm-PF.js +3 -0
  260. package/static/auth-callback/assets/{activity-BcsZZxxw.js → activity-5hNeNKnL.js} +1 -1
  261. package/static/auth-callback/assets/admin-C6qCRFiY.js +1 -0
  262. package/static/auth-callback/assets/ai-connections-CryuHGKW.js +1 -0
  263. package/static/auth-callback/assets/{auth-callback-atKg_oig.js → auth-callback-CAFZ3R0B.js} +80 -84
  264. package/static/auth-callback/assets/auth-callback-rk080mvG.css +1 -0
  265. package/static/auth-callback/assets/{badge-BWbRHThQ.js → badge-CAIPI0CB.js} +1 -1
  266. package/static/auth-callback/assets/collection-runtime-D9s7h9YA.js +1 -0
  267. package/static/auth-callback/assets/dialog-BjA109aX.js +1 -0
  268. package/static/auth-callback/assets/{download-BmvG1Vya.js → download-B3Up5W2G.js} +1 -1
  269. package/static/auth-callback/assets/{external-link-DZ34d3g3.js → external-link-BTXgSPzB.js} +1 -1
  270. package/static/auth-callback/assets/index-BppXlxcp.js +41 -0
  271. package/static/auth-callback/assets/index-CirW4CJf.js +1 -0
  272. package/static/auth-callback/assets/index-DlLYWOhw.js +4 -0
  273. package/static/auth-callback/assets/{index-browser-B9Z7GU-T.js → index-browser-DtU38ni3.js} +1 -1
  274. package/static/auth-callback/assets/{key-round-tjP76Se-.js → key-round-CQCOrZ7x.js} +1 -1
  275. package/static/auth-callback/assets/layout-DB3pMyTl.js +1 -0
  276. package/static/auth-callback/assets/pod-collections-host-KnnGFZHL.js +8 -0
  277. package/static/auth-callback/assets/{rotate-ccw-C_L5ZLx1.js → rotate-ccw-C1zM2KtS.js} +1 -1
  278. package/static/auth-callback/assets/settings-projection-CUkyprDQ.js +1 -0
  279. package/static/auth-callback/assets/{skeleton-C7tGDQIs.js → skeleton-Cqp7_M9-.js} +1 -1
  280. package/static/auth-callback/assets/{waypoints-VMNQlWdU.js → waypoints-Bj6gAUSQ.js} +1 -1
  281. package/static/auth-callback/assets/{workspace-layout-SAp6BtYK.js → workspace-layout-DK8mDzrY.js} +1 -1
  282. package/static/auth-callback/auth-callback.html +2 -2
  283. package/static/dashboard/assets/AiConfigContext-BsE7MqX8.js +1 -0
  284. package/static/dashboard/assets/AiConfigPage-DvM-lRXa.js +1 -0
  285. package/static/dashboard/assets/DocumentProcessingPanel-BPfdlfuf.js +1 -0
  286. package/static/dashboard/assets/IndexLifecyclePanel--m0AGxvh.js +1 -0
  287. package/static/dashboard/assets/{IndexSubjectPanel-DQFPP6-p.js → IndexSubjectPanel-Bb7m1k3d.js} +1 -1
  288. package/static/dashboard/assets/ModelAssignmentsPanel-BLi_zbMa.js +1 -0
  289. package/static/dashboard/assets/ModelsPage-CxdpgnfR.js +11 -0
  290. package/static/dashboard/assets/{NetworkPage-CHQ3YxIB.js → NetworkPage-BAIPw-D_.js} +2 -2
  291. package/static/dashboard/assets/{PaneListHeader-DsXemAdR.js → PaneListHeader-BBCMei0r.js} +1 -1
  292. package/static/dashboard/assets/SearchIndexingPanel-Ck4Y-xjR.js +1 -0
  293. package/static/dashboard/assets/{StatusSubjectPanel-D3PGEYT4.js → StatusSubjectPanel-D1KWfAXE.js} +1 -1
  294. package/static/dashboard/assets/{StatusWorkspace-BcpePYUW.js → StatusWorkspace-JbA5gzXx.js} +1 -1
  295. package/static/dashboard/assets/SystemSettingsPage-BbwQWsSR.js +1 -0
  296. package/static/dashboard/assets/SystemSettingsSubjectPanel-N117nMt5.js +33 -0
  297. package/static/dashboard/assets/XpodAiConnectionsPodStore-CdDOb4SV.js +18 -0
  298. package/static/dashboard/assets/{activity-j5zrznu-.js → activity-DX1I96o_.js} +1 -1
  299. package/static/dashboard/assets/admin-C6qCRFiY.js +1 -0
  300. package/static/dashboard/assets/ai-connections-DwCRqOQa.js +1 -0
  301. package/static/dashboard/assets/{badge-CzeBdG7h.js → badge-k2vhtDqH.js} +1 -1
  302. package/static/dashboard/assets/collection-runtime-BFQ8teQJ.js +1 -0
  303. package/static/dashboard/assets/{dashboard-D-xANHk1.js → dashboard-DWZ-fmCT.js} +105 -109
  304. package/static/dashboard/assets/dashboard-rk080mvG.css +1 -0
  305. package/static/dashboard/assets/dialog-1CCw-iHT.js +1 -0
  306. package/static/dashboard/assets/{download-IcNdEZWi.js → download-C6-SNY1q.js} +1 -1
  307. package/static/dashboard/assets/{external-link-DxBxK8Vu.js → external-link-BgPcZ_j2.js} +1 -1
  308. package/static/dashboard/assets/index-6LcIUIYO.js +1 -0
  309. package/static/dashboard/assets/index-D7A8U6Pt.js +41 -0
  310. package/static/dashboard/assets/index-UD6QOE7H.js +4 -0
  311. package/static/dashboard/assets/{key-round-D1K7warM.js → key-round-BOd7Jo0Q.js} +1 -1
  312. package/static/dashboard/assets/layout-DB3pMyTl.js +1 -0
  313. package/static/dashboard/assets/pod-collections-host-KnnGFZHL.js +8 -0
  314. package/static/dashboard/assets/{rotate-ccw-CcN1N6p9.js → rotate-ccw-CCgJqsvx.js} +1 -1
  315. package/static/dashboard/assets/settings-projection-CUkyprDQ.js +1 -0
  316. package/static/dashboard/assets/{skeleton-CKnmJMUH.js → skeleton-Bc7abAn5.js} +1 -1
  317. package/static/dashboard/assets/{waypoints-DuZPO_wu.js → waypoints-s-opmJxx.js} +1 -1
  318. package/static/dashboard/assets/{workspace-layout-BUj3wZ_m.js → workspace-layout-DqIQeTBV.js} +1 -1
  319. package/static/dashboard/dashboard.html +2 -2
  320. package/static/settings/assets/AiConfigContext-BB9KZySa.js +1 -0
  321. package/static/settings/assets/AiConfigPage-DGSXUkLs.js +1 -0
  322. package/static/settings/assets/DocumentProcessingPanel-Da2Re6Rg.js +1 -0
  323. package/static/settings/assets/IndexLifecyclePanel-BSZuIzgr.js +1 -0
  324. package/static/settings/assets/{IndexSubjectPanel-73sM16Ma.js → IndexSubjectPanel-CFd0ay-r.js} +1 -1
  325. package/static/settings/assets/ModelAssignmentsPanel-CSAryvWJ.js +1 -0
  326. package/static/settings/assets/ModelsPage-BQwCwLHU.js +11 -0
  327. package/static/settings/assets/{NetworkPage-i6j-M2RY.js → NetworkPage-BKymvsQc.js} +2 -2
  328. package/static/settings/assets/{PaneListHeader-DpqC0jd5.js → PaneListHeader-Bjh3hRdQ.js} +1 -1
  329. package/static/settings/assets/SearchIndexingPanel-MjKL5QLU.js +1 -0
  330. package/static/settings/assets/{StatusSubjectPanel-Dv4q3PGh.js → StatusSubjectPanel-Bvl6K4mx.js} +1 -1
  331. package/static/settings/assets/StatusWorkspace-B0NzrP--.js +1 -0
  332. package/static/settings/assets/SystemSettingsPage-D2z6Z4FE.js +1 -0
  333. package/static/settings/assets/SystemSettingsSubjectPanel-4sxma4X4.js +33 -0
  334. package/static/settings/assets/XpodAiConnectionsPodStore-BkNQ8fZx.js +3 -0
  335. package/static/settings/assets/{activity-DaFkk8f3.js → activity-CgJJGpjx.js} +1 -1
  336. package/static/settings/assets/admin-C6qCRFiY.js +1 -0
  337. package/static/settings/assets/ai-connections-CryuHGKW.js +1 -0
  338. package/static/settings/assets/{badge-d5SHdc-x.js → badge-C4NypVyT.js} +1 -1
  339. package/static/settings/assets/collection-runtime-CTLCDxAi.js +1 -0
  340. package/static/settings/assets/dialog-Csq0vWUi.js +1 -0
  341. package/static/settings/assets/{download-CpkwomDr.js → download-DaLJJ-Wp.js} +1 -1
  342. package/static/settings/assets/{external-link-_4YT42Mf.js → external-link--w_iW5Au.js} +1 -1
  343. package/static/settings/assets/index-B0mQa59b.js +4 -0
  344. package/static/settings/assets/index-BukHiu4y.js +1 -0
  345. package/static/settings/assets/index-COmVnZi2.js +41 -0
  346. package/static/settings/assets/{index-browser-B06xjBdZ.js → index-browser-BGpvHwD0.js} +1 -1
  347. package/static/settings/assets/{key-round-Dlqmp1Kq.js → key-round-Bk4YRjBu.js} +1 -1
  348. package/static/settings/assets/layout-DB3pMyTl.js +1 -0
  349. package/static/settings/assets/pod-collections-host-KnnGFZHL.js +8 -0
  350. package/static/settings/assets/{rotate-ccw-TAY65xWT.js → rotate-ccw-TCabbqsr.js} +1 -1
  351. package/static/settings/assets/{settings-ExBXGgbj.js → settings-CJWpdbNC.js} +105 -109
  352. package/static/settings/assets/settings-projection-CUkyprDQ.js +1 -0
  353. package/static/settings/assets/settings-rk080mvG.css +1 -0
  354. package/static/settings/assets/{skeleton-DKIWjNr9.js → skeleton-JDHYVe7t.js} +1 -1
  355. package/static/settings/assets/{waypoints-9erLIxyR.js → waypoints-DDvEl-MU.js} +1 -1
  356. package/static/settings/assets/{workspace-layout-CYXfYIa3.js → workspace-layout-DV5QU30U.js} +1 -1
  357. package/static/settings/settings.html +2 -2
  358. package/node_modules/@undefineds.co/shared-ui/dist/oidc-consent.d.ts +0 -54
  359. package/node_modules/@undefineds.co/shared-ui/dist/oidc-consent.js +0 -21
  360. package/static/auth-callback/assets/AiConfigContext-C81deMM9.js +0 -1
  361. package/static/auth-callback/assets/AiConfigPage-evWI8T56.js +0 -1
  362. package/static/auth-callback/assets/DocumentProcessingPanel-B9GrDEMe.js +0 -1
  363. package/static/auth-callback/assets/IndexLifecyclePanel-qCo8ABQZ.js +0 -1
  364. package/static/auth-callback/assets/ModelAssignmentsPanel-DG7Lxh3t.js +0 -1
  365. package/static/auth-callback/assets/ModelsPage-CgEuqE6p.js +0 -10
  366. package/static/auth-callback/assets/SearchIndexingPanel-ByU3u7kp.js +0 -1
  367. package/static/auth-callback/assets/StatusWorkspace-BZd617sV.js +0 -1
  368. package/static/auth-callback/assets/SystemSettingsPage-BirzWAQM.js +0 -1
  369. package/static/auth-callback/assets/SystemSettingsSubjectPanel-CmsVWNCx.js +0 -31
  370. package/static/auth-callback/assets/admin-BU4m6Ko2.js +0 -1
  371. package/static/auth-callback/assets/ai-connections-CHNTKemd.js +0 -1
  372. package/static/auth-callback/assets/auth-callback-C_7MUXJb.css +0 -1
  373. package/static/auth-callback/assets/index-BpV1hsqs.js +0 -4
  374. package/static/auth-callback/assets/index-D9oE6FXK.js +0 -41
  375. package/static/dashboard/assets/AiConfigContext-De-OtAWo.js +0 -1
  376. package/static/dashboard/assets/AiConfigPage-macP4Mop.js +0 -1
  377. package/static/dashboard/assets/DocumentProcessingPanel-C5ObvCCl.js +0 -1
  378. package/static/dashboard/assets/IndexLifecyclePanel-xVNa2l40.js +0 -1
  379. package/static/dashboard/assets/ModelAssignmentsPanel-DMOATFpQ.js +0 -1
  380. package/static/dashboard/assets/ModelsPage-91UbnETA.js +0 -25
  381. package/static/dashboard/assets/SearchIndexingPanel-Dh70PNFZ.js +0 -1
  382. package/static/dashboard/assets/SystemSettingsPage-BiN5GcKx.js +0 -1
  383. package/static/dashboard/assets/SystemSettingsSubjectPanel-B9QrSiFp.js +0 -31
  384. package/static/dashboard/assets/admin-BU4m6Ko2.js +0 -1
  385. package/static/dashboard/assets/ai-connections-CHNTKemd.js +0 -1
  386. package/static/dashboard/assets/dashboard-C_7MUXJb.css +0 -1
  387. package/static/dashboard/assets/index-FWZ-s52O.js +0 -41
  388. package/static/dashboard/assets/index-ZiQZ96oC.js +0 -4
  389. package/static/settings/assets/AiConfigContext-C0cQMPfG.js +0 -1
  390. package/static/settings/assets/AiConfigPage-CPhB4iFb.js +0 -1
  391. package/static/settings/assets/DocumentProcessingPanel-sYI7OpuH.js +0 -1
  392. package/static/settings/assets/IndexLifecyclePanel-yj8iyiT8.js +0 -1
  393. package/static/settings/assets/ModelAssignmentsPanel-BFIgUX5v.js +0 -1
  394. package/static/settings/assets/ModelsPage-BdppXl7E.js +0 -10
  395. package/static/settings/assets/SearchIndexingPanel-BlPnrkT3.js +0 -1
  396. package/static/settings/assets/SystemSettingsPage-CiOm2NzV.js +0 -1
  397. package/static/settings/assets/SystemSettingsSubjectPanel-Cd-GECon.js +0 -31
  398. package/static/settings/assets/admin-BU4m6Ko2.js +0 -1
  399. package/static/settings/assets/ai-connections-CHNTKemd.js +0 -1
  400. package/static/settings/assets/index-BFi9yn7_.js +0 -41
  401. package/static/settings/assets/index-BGgEhIUy.js +0 -4
  402. package/static/settings/assets/settings-C_7MUXJb.css +0 -1
@@ -0,0 +1,423 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.NativeUpgradeConnection = exports.BunNativeUpgradeRelay = void 0;
30
+ const node_net_1 = __importDefault(require("node:net"));
31
+ const node_tls_1 = __importDefault(require("node:tls"));
32
+ const WebSocketFrames_1 = require("./WebSocketFrames");
33
+ const UpgradeHandshake_1 = require("./UpgradeHandshake");
34
+ const DEFAULT_HANDSHAKE_TIMEOUT_MS = 10_000;
35
+ const DEFAULT_CLOSE_GRACE_MS = 5_000;
36
+ const DEFAULT_MAX_HANDSHAKE_BYTES = 64 * 1024;
37
+ const ERROR_SOCKET_LINGER_MS = 1_000;
38
+ const SHUTDOWN_FLUSH_MS = 50;
39
+ /**
40
+ * Loads `ws` from the runtime. Bun resolves this to its built-in, native
41
+ * implementation — the only one that can complete an upgrade on Bun's
42
+ * `node:http` server.
43
+ */
44
+ async function loadRuntimeWebSocketModule() {
45
+ try {
46
+ return await Promise.resolve().then(() => __importStar(require('ws')));
47
+ }
48
+ catch {
49
+ return undefined;
50
+ }
51
+ }
52
+ function describeImplementation(module) {
53
+ const source = module.WebSocketServer?.prototype?.handleUpgrade?.toString?.() ?? '';
54
+ return source.includes('kBunInternals') || source.includes('server.upgrade')
55
+ ? 'runtime-native'
56
+ : 'javascript';
57
+ }
58
+ /** Close codes that must never be sent on the wire (RFC 6455 §7.4.1). */
59
+ function wireCloseCode(code) {
60
+ return code >= 1000 && code <= 4999 && code !== 1005 && code !== 1006 && code !== 1015 ? code : 1000;
61
+ }
62
+ function resolveUpstreamAddress(target) {
63
+ if (target.socketPath) {
64
+ return { kind: 'socket', path: target.socketPath };
65
+ }
66
+ if (!target.url) {
67
+ return undefined;
68
+ }
69
+ try {
70
+ const url = new URL(target.url);
71
+ if (!['http:', 'https:', 'ws:', 'wss:'].includes(url.protocol)) {
72
+ return undefined;
73
+ }
74
+ const secure = url.protocol === 'https:' || url.protocol === 'wss:';
75
+ return {
76
+ kind: 'tcp',
77
+ host: url.hostname,
78
+ port: url.port ? Number(url.port) : secure ? 443 : 80,
79
+ secure,
80
+ };
81
+ }
82
+ catch {
83
+ return undefined;
84
+ }
85
+ }
86
+ function toBuffer(data) {
87
+ if (Buffer.isBuffer(data)) {
88
+ return data;
89
+ }
90
+ if (Array.isArray(data)) {
91
+ return Buffer.concat(data);
92
+ }
93
+ if (typeof data === 'string') {
94
+ return Buffer.from(data, 'utf8');
95
+ }
96
+ return Buffer.from(data);
97
+ }
98
+ class BunNativeUpgradeRelay {
99
+ constructor(options) {
100
+ this.options = options;
101
+ this.connections = new Set();
102
+ this.moduleReported = false;
103
+ this.loadWebSocketModule = options.loadWebSocketModule ?? loadRuntimeWebSocketModule;
104
+ this.handshakeTimeoutMs = options.handshakeTimeoutMs ?? DEFAULT_HANDSHAKE_TIMEOUT_MS;
105
+ this.closeGraceMs = options.closeGraceMs ?? DEFAULT_CLOSE_GRACE_MS;
106
+ this.maxHandshakeBytes = options.maxHandshakeBytes ?? DEFAULT_MAX_HANDSHAKE_BYTES;
107
+ // Warm the module up so the first upgrade does not wait on the import.
108
+ void this.webSocketModule();
109
+ }
110
+ handle(req, socket, head, target) {
111
+ const upgradeHeader = req.headers.upgrade;
112
+ if (req.method !== 'GET' || typeof upgradeHeader !== 'string' || upgradeHeader.toLowerCase() !== 'websocket') {
113
+ this.options.logger.debug(`Rejecting unsupported upgrade request: ${req.method} ${req.url}`);
114
+ socket.destroy();
115
+ return;
116
+ }
117
+ void this.start(req, socket, head, target);
118
+ }
119
+ /** Terminates every relayed connection (gateway shutdown/restart). */
120
+ close() {
121
+ for (const connection of [...this.connections]) {
122
+ connection.shutdown();
123
+ }
124
+ }
125
+ async start(req, socket, head, target) {
126
+ const module = await this.webSocketModule();
127
+ if (!module) {
128
+ this.options.logger.warn('Native WebSocket support is unavailable; falling back to the http-proxy upgrade relay');
129
+ this.options.fallback(req, socket, head, target);
130
+ return;
131
+ }
132
+ const connection = new NativeUpgradeConnection(module, {
133
+ logger: this.options.logger,
134
+ onClosed: (closed) => this.connections.delete(closed),
135
+ handshakeTimeoutMs: this.handshakeTimeoutMs,
136
+ closeGraceMs: this.closeGraceMs,
137
+ maxHandshakeBytes: this.maxHandshakeBytes,
138
+ });
139
+ this.connections.add(connection);
140
+ connection.start(req, socket, head, target);
141
+ }
142
+ async webSocketModule() {
143
+ this.modulePromise ??= this.loadWebSocketModule();
144
+ const module = await this.modulePromise;
145
+ if (module && !this.moduleReported) {
146
+ this.moduleReported = true;
147
+ this.options.logger.debug(`Upgrade relay using a ${describeImplementation(module)} WebSocket implementation`);
148
+ }
149
+ return module;
150
+ }
151
+ }
152
+ exports.BunNativeUpgradeRelay = BunNativeUpgradeRelay;
153
+ class NativeUpgradeConnection {
154
+ constructor(module, deps) {
155
+ this.module = module;
156
+ this.deps = deps;
157
+ this.protocol = '';
158
+ this.handshakeBuffer = Buffer.alloc(0);
159
+ this.state = 'connecting';
160
+ }
161
+ start(req, socket, head, target) {
162
+ this.clientSocket = socket;
163
+ socket.once('error', () => this.destroy());
164
+ socket.once('close', () => this.destroy());
165
+ // The client may disconnect while the module or upstream handshake is
166
+ // pending. Its native Request is no longer valid for handleUpgrade then.
167
+ if (socket.destroyed || req.aborted) {
168
+ this.destroy();
169
+ return;
170
+ }
171
+ const address = resolveUpstreamAddress(target);
172
+ if (!address) {
173
+ this.fail(503, 'Service Unavailable', 'No WebSocket upstream is configured for this path.');
174
+ this.finish();
175
+ return;
176
+ }
177
+ // Upgraded connections are long lived and may stay idle for a long time
178
+ // (a Solid notification channel can live for days), so no idle timeout may
179
+ // tear them down.
180
+ socket.setTimeout?.(0);
181
+ const upstream = this.connectUpstream(address);
182
+ this.upstream = upstream;
183
+ upstream.setNoDelay(true);
184
+ upstream.setKeepAlive(true, 0);
185
+ upstream.setTimeout(0);
186
+ const onHandshakeData = (chunk) => this.onUpstreamHandshakeData(req, socket, head, chunk);
187
+ this.handshakeListener = onHandshakeData;
188
+ upstream.on(address.kind === 'tcp' && address.secure ? 'secureConnect' : 'connect', () => {
189
+ this.state = 'handshaking';
190
+ upstream.write((0, UpgradeHandshake_1.buildUpstreamUpgradeRequest)({
191
+ path: req.url ?? '/',
192
+ headers: req.headers,
193
+ protocols: (0, UpgradeHandshake_1.parseRequestedProtocols)(req.headers['sec-websocket-protocol']),
194
+ ...(0, UpgradeHandshake_1.forwardedHeaderValues)(req),
195
+ }));
196
+ this.handshakeTimer = setTimeout(() => {
197
+ this.deps.logger.warn(`WebSocket upstream handshake timed out for ${req.url}`);
198
+ this.fail(504, 'Gateway Timeout', 'The internal service did not answer the WebSocket handshake.');
199
+ upstream.destroy();
200
+ this.finish();
201
+ }, this.deps.handshakeTimeoutMs);
202
+ });
203
+ upstream.on('data', onHandshakeData);
204
+ upstream.on('error', (error) => {
205
+ this.deps.logger.warn(`WebSocket upstream error for ${req.url}: ${String(error)}`);
206
+ if (this.state === 'connecting' || this.state === 'handshaking') {
207
+ this.fail(502, 'Bad Gateway', 'The internal service is unavailable.');
208
+ }
209
+ this.finish();
210
+ });
211
+ upstream.on('close', () => {
212
+ if (this.state === 'closed') {
213
+ return;
214
+ }
215
+ if (this.state === 'rejected') {
216
+ // The rejection response may end without a graceful `end` (reset).
217
+ this.closeRejectedClient();
218
+ return;
219
+ }
220
+ this.clientSocket?.destroy();
221
+ this.finish();
222
+ });
223
+ }
224
+ /** Closes the relayed connection as part of gateway shutdown. */
225
+ shutdown() {
226
+ try {
227
+ this.client?.close(1001, 'gateway shutting down');
228
+ }
229
+ catch {
230
+ // The client WebSocket may already be closed.
231
+ }
232
+ // Shutdown must not wait for the peer's close handshake — a notification
233
+ // channel can stay idle for days. The short delay lets the close frame
234
+ // reach the client before the sockets go away.
235
+ const timer = setTimeout(() => this.destroy(), SHUTDOWN_FLUSH_MS);
236
+ timer.unref?.();
237
+ }
238
+ connectUpstream(address) {
239
+ if (address.kind === 'socket') {
240
+ return node_net_1.default.connect({ path: address.path });
241
+ }
242
+ return address.secure
243
+ ? node_tls_1.default.connect({ host: address.host, port: address.port, servername: address.host })
244
+ : node_net_1.default.connect({ host: address.host, port: address.port });
245
+ }
246
+ onUpstreamHandshakeData(req, socket, head, chunk) {
247
+ if (this.state !== 'handshaking') {
248
+ return;
249
+ }
250
+ this.handshakeBuffer = Buffer.concat([this.handshakeBuffer, chunk]);
251
+ if (this.handshakeBuffer.length > this.deps.maxHandshakeBytes) {
252
+ this.deps.logger.warn(`WebSocket upstream sent an oversized handshake for ${req.url}`);
253
+ this.fail(502, 'Bad Gateway', 'The internal service sent an invalid WebSocket handshake.');
254
+ this.upstream?.destroy();
255
+ this.finish();
256
+ return;
257
+ }
258
+ const response = (0, UpgradeHandshake_1.parseUpgradeHandshakeResponse)(this.handshakeBuffer);
259
+ if (!response) {
260
+ return;
261
+ }
262
+ this.clearHandshakeTimer();
263
+ const upstream = this.upstream;
264
+ if (!upstream) {
265
+ return;
266
+ }
267
+ if (this.handshakeListener) {
268
+ upstream.removeListener('data', this.handshakeListener);
269
+ this.handshakeListener = undefined;
270
+ }
271
+ if (!(0, UpgradeHandshake_1.isWebSocketUpgrade)(response)) {
272
+ this.relayRejection(response);
273
+ return;
274
+ }
275
+ this.protocol = (0, UpgradeHandshake_1.selectedProtocol)(response);
276
+ this.parser = this.createFrameParser(req.url ?? '/');
277
+ upstream.on('data', (frameChunk) => this.parser?.push(frameChunk));
278
+ this.upgradeClient(req, socket, head, response.rest);
279
+ }
280
+ /**
281
+ * Relays a non-101 upstream answer verbatim so clients observe the real
282
+ * status (401 for an expired ticket, 404 for an unknown channel, ...).
283
+ */
284
+ relayRejection(response) {
285
+ const upstream = this.upstream;
286
+ const socket = this.clientSocket;
287
+ if (!upstream || !socket) {
288
+ return;
289
+ }
290
+ this.state = 'rejected';
291
+ (0, UpgradeHandshake_1.writeUpgradeSocketBytes)(socket, response.head);
292
+ if (response.rest.length > 0) {
293
+ (0, UpgradeHandshake_1.writeUpgradeSocketBytes)(socket, response.rest);
294
+ }
295
+ upstream.on('data', (rest) => (0, UpgradeHandshake_1.writeUpgradeSocketBytes)(socket, rest));
296
+ upstream.on('end', () => this.closeRejectedClient());
297
+ }
298
+ closeRejectedClient() {
299
+ if (this.state === 'closed') {
300
+ return;
301
+ }
302
+ if (this.clientSocket) {
303
+ (0, UpgradeHandshake_1.endUpgradeSocket)(this.clientSocket);
304
+ }
305
+ this.finish();
306
+ }
307
+ createFrameParser(url) {
308
+ return new WebSocketFrames_1.WebSocketFrameParser({
309
+ onMessage: (payload, isBinary) => this.client?.send(payload, { binary: isBinary }),
310
+ onPing: (payload) => {
311
+ this.upstream?.write((0, WebSocketFrames_1.encodeWebSocketFrame)(payload, { opcode: WebSocketFrames_1.WS_OPCODE.pong, mask: true }));
312
+ },
313
+ onPong: () => undefined,
314
+ onClose: (code, reason) => {
315
+ try {
316
+ this.client?.close(wireCloseCode(code), reason);
317
+ }
318
+ catch {
319
+ // The client WebSocket may already be closed.
320
+ }
321
+ this.scheduleUpstreamClose();
322
+ },
323
+ onProtocolError: (reason) => {
324
+ this.deps.logger.warn(`WebSocket upstream protocol error for ${url}: ${reason}`);
325
+ try {
326
+ this.client?.close(WebSocketFrames_1.WS_CLOSE_PROTOCOL_ERROR, 'protocol error');
327
+ }
328
+ catch {
329
+ // The client WebSocket may already be closed.
330
+ }
331
+ this.destroy();
332
+ },
333
+ });
334
+ }
335
+ upgradeClient(req, socket, head, bufferedFrames) {
336
+ const protocol = this.protocol;
337
+ try {
338
+ const server = new this.module.WebSocketServer({
339
+ noServer: true,
340
+ perMessageDeflate: false,
341
+ // The upstream handshake already picked a subprotocol; echo exactly that
342
+ // one so the client observes the same negotiation as a direct connection.
343
+ handleProtocols: () => protocol || false,
344
+ });
345
+ server.handleUpgrade(req, socket, head, (client) => {
346
+ this.client = client;
347
+ this.state = 'open';
348
+ client.on('message', (data, isBinary) => this.forwardClientMessage(data, isBinary));
349
+ client.on('close', (code, reason) => this.onClientClose(code, reason));
350
+ client.on('error', () => this.destroy());
351
+ if (bufferedFrames.length > 0) {
352
+ this.parser?.push(bufferedFrames);
353
+ }
354
+ });
355
+ }
356
+ catch (error) {
357
+ this.deps.logger.warn(`Failed to complete the client WebSocket handshake for ${req.url}: ${String(error)}`);
358
+ this.fail(400, 'Bad Request', 'Invalid WebSocket handshake.');
359
+ this.destroy();
360
+ }
361
+ }
362
+ forwardClientMessage(data, isBinary) {
363
+ if (!this.upstream || this.upstream.destroyed) {
364
+ return;
365
+ }
366
+ this.upstream.write((0, WebSocketFrames_1.encodeWebSocketFrame)(toBuffer(data), {
367
+ opcode: isBinary ? WebSocketFrames_1.WS_OPCODE.binary : WebSocketFrames_1.WS_OPCODE.text,
368
+ mask: true,
369
+ }));
370
+ }
371
+ onClientClose(code, reason) {
372
+ if (this.state === 'open' && this.upstream && !this.upstream.destroyed) {
373
+ this.upstream.write((0, WebSocketFrames_1.encodeWebSocketFrame)((0, WebSocketFrames_1.encodeWebSocketClosePayload)(wireCloseCode(code), reason.toString('utf8')), { opcode: WebSocketFrames_1.WS_OPCODE.close, mask: true }));
374
+ }
375
+ this.scheduleUpstreamClose();
376
+ }
377
+ /** Waits briefly for the upstream close handshake before dropping the socket. */
378
+ scheduleUpstreamClose() {
379
+ this.closeTimer ??= setTimeout(() => this.destroy(), this.deps.closeGraceMs);
380
+ }
381
+ fail(statusCode, statusMessage, message) {
382
+ const socket = this.clientSocket;
383
+ if (!socket || socket.destroyed) {
384
+ return;
385
+ }
386
+ (0, UpgradeHandshake_1.writeUpgradeErrorResponse)(socket, statusCode, statusMessage, {
387
+ 'Content-Type': 'application/json',
388
+ }, JSON.stringify({ error: statusMessage, message }));
389
+ this.errorTimer ??= setTimeout(() => socket.destroy(), ERROR_SOCKET_LINGER_MS);
390
+ }
391
+ destroy() {
392
+ if (this.state === 'closed') {
393
+ return;
394
+ }
395
+ this.upstream?.destroy();
396
+ this.clientSocket?.destroy();
397
+ this.finish();
398
+ }
399
+ clearHandshakeTimer() {
400
+ if (this.handshakeTimer) {
401
+ clearTimeout(this.handshakeTimer);
402
+ this.handshakeTimer = undefined;
403
+ }
404
+ }
405
+ finish() {
406
+ if (this.state === 'closed') {
407
+ return;
408
+ }
409
+ this.state = 'closed';
410
+ this.clearHandshakeTimer();
411
+ if (this.closeTimer) {
412
+ clearTimeout(this.closeTimer);
413
+ this.closeTimer = undefined;
414
+ }
415
+ if (this.errorTimer) {
416
+ clearTimeout(this.errorTimer);
417
+ this.errorTimer = undefined;
418
+ }
419
+ this.deps.onClosed(this);
420
+ }
421
+ }
422
+ exports.NativeUpgradeConnection = NativeUpgradeConnection;
423
+ //# sourceMappingURL=BunNativeUpgradeRelay.js.map
@@ -0,0 +1,63 @@
1
+ import type { IncomingHttpHeaders, IncomingMessage } from 'node:http';
2
+ import type { Duplex } from 'node:stream';
3
+ export interface BuildUpstreamUpgradeOptions {
4
+ /** Request path (including query string) to request from the upstream. */
5
+ path: string;
6
+ /** Client request headers. */
7
+ headers: IncomingHttpHeaders;
8
+ /** Subprotocols requested by the client, in client preference order. */
9
+ protocols: string[];
10
+ /** Freshly generated `Sec-WebSocket-Key`. Defaults to a random key. */
11
+ key?: string;
12
+ /** `X-Forwarded-*` values; parity with `http-proxy`'s `xfwd: true`. */
13
+ forwardedFor?: string;
14
+ forwardedPort?: string;
15
+ forwardedProto?: string;
16
+ }
17
+ export declare function createWebSocketKey(): string;
18
+ /**
19
+ * Builds the raw HTTP upgrade request that is sent to the internal service.
20
+ * The client's `Host` and its application headers (authorization, cookies,
21
+ * origin, DPoP, custom `X-*`, ...) are forwarded unchanged so the internal
22
+ * server answers exactly as it would for a direct connection.
23
+ */
24
+ export declare function buildUpstreamUpgradeRequest(options: BuildUpstreamUpgradeOptions): Buffer;
25
+ export interface UpgradeHandshakeResponse {
26
+ statusCode: number;
27
+ statusMessage: string;
28
+ headers: Record<string, string>;
29
+ /** Raw response bytes (status line + headers), without the body that follows. */
30
+ head: Buffer;
31
+ /** Bytes received after the header block (already-upgraded frames or a body). */
32
+ rest: Buffer;
33
+ }
34
+ /**
35
+ * Parses the beginning of the upstream upgrade response.
36
+ * @returns the parsed response, or `undefined` while the header block is incomplete.
37
+ */
38
+ export declare function parseUpgradeHandshakeResponse(buffer: Buffer): UpgradeHandshakeResponse | undefined;
39
+ /** Subprotocol selected by the upstream server, if any. */
40
+ export declare function selectedProtocol(response: UpgradeHandshakeResponse): string;
41
+ /** True when the upstream actually switched protocols to WebSocket. */
42
+ export declare function isWebSocketUpgrade(response: UpgradeHandshakeResponse): boolean;
43
+ export declare function parseRequestedProtocols(header: string | string[] | undefined): string[];
44
+ /**
45
+ * Writes raw bytes to a socket handed over by the HTTP server's `upgrade` event.
46
+ *
47
+ * Bun's `node:http` server hands the upgrade listener a socket shim whose
48
+ * `write()` never reaches the peer (`socket.write()` returns `true` and the
49
+ * bytes are dropped), which is why the gateway cannot use `http-proxy`'s
50
+ * WebSocket pass there. The underlying Bun socket handle still writes
51
+ * correctly, so error responses are written through it; on every other runtime
52
+ * the regular socket write is used.
53
+ */
54
+ export declare function writeUpgradeSocketBytes(socket: Duplex, chunk: Buffer): void;
55
+ export declare function endUpgradeSocket(socket: Duplex): void;
56
+ /** Writes a complete HTTP response to an upgrade request that could not be relayed. */
57
+ export declare function writeUpgradeErrorResponse(socket: Duplex, statusCode: number, statusMessage: string, headers: Record<string, string>, body: string): void;
58
+ /** Best-effort `X-Forwarded-*` values matching `http-proxy`'s `xfwd: true`. */
59
+ export declare function forwardedHeaderValues(req: IncomingMessage): {
60
+ forwardedFor?: string;
61
+ forwardedPort?: string;
62
+ forwardedProto: string;
63
+ };
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createWebSocketKey = createWebSocketKey;
4
+ exports.buildUpstreamUpgradeRequest = buildUpstreamUpgradeRequest;
5
+ exports.parseUpgradeHandshakeResponse = parseUpgradeHandshakeResponse;
6
+ exports.selectedProtocol = selectedProtocol;
7
+ exports.isWebSocketUpgrade = isWebSocketUpgrade;
8
+ exports.parseRequestedProtocols = parseRequestedProtocols;
9
+ exports.writeUpgradeSocketBytes = writeUpgradeSocketBytes;
10
+ exports.endUpgradeSocket = endUpgradeSocket;
11
+ exports.writeUpgradeErrorResponse = writeUpgradeErrorResponse;
12
+ exports.forwardedHeaderValues = forwardedHeaderValues;
13
+ const node_crypto_1 = require("node:crypto");
14
+ /**
15
+ * HTTP handshake helpers for the gateway's upgrade relay.
16
+ *
17
+ * Upgrade requests are relayed to the internal services byte-for-byte, so the
18
+ * relay has to build the upstream request itself (see `BunNativeUpgradeRelay`).
19
+ * Keeping the header rules here makes them unit-testable and keeps the HTTP
20
+ * semantics of the gateway in one place.
21
+ */
22
+ /** RFC 7230 hop-by-hop headers: never forwarded to the next hop. */
23
+ const HOP_BY_HOP_HEADERS = new Set([
24
+ 'connection',
25
+ 'keep-alive',
26
+ 'proxy-authenticate',
27
+ 'proxy-authorization',
28
+ 'te',
29
+ 'trailer',
30
+ 'transfer-encoding',
31
+ 'upgrade',
32
+ ]);
33
+ /**
34
+ * Headers that belong to a single WebSocket handshake on one hop. They are set
35
+ * by the relay (or by the WebSocket implementation) for the upstream hop and
36
+ * must not be copied from the client request.
37
+ */
38
+ const HANDSHAKE_HEADERS = new Set([
39
+ 'sec-websocket-accept',
40
+ 'sec-websocket-extensions',
41
+ 'sec-websocket-key',
42
+ 'sec-websocket-version',
43
+ // The relay never forwards a request body, so a content-length from the
44
+ // client must not make the upstream wait for one.
45
+ 'content-length',
46
+ ]);
47
+ function createWebSocketKey() {
48
+ return (0, node_crypto_1.randomBytes)(16).toString('base64');
49
+ }
50
+ /**
51
+ * Builds the raw HTTP upgrade request that is sent to the internal service.
52
+ * The client's `Host` and its application headers (authorization, cookies,
53
+ * origin, DPoP, custom `X-*`, ...) are forwarded unchanged so the internal
54
+ * server answers exactly as it would for a direct connection.
55
+ */
56
+ function buildUpstreamUpgradeRequest(options) {
57
+ const headers = new Map();
58
+ for (const [name, value] of Object.entries(options.headers)) {
59
+ const lower = name.toLowerCase();
60
+ if (HOP_BY_HOP_HEADERS.has(lower) || HANDSHAKE_HEADERS.has(lower) || value === undefined) {
61
+ continue;
62
+ }
63
+ headers.set(lower, Array.isArray(value) ? value.join(', ') : String(value));
64
+ }
65
+ appendForwarded(headers, 'x-forwarded-for', options.forwardedFor);
66
+ appendForwarded(headers, 'x-forwarded-port', options.forwardedPort);
67
+ appendForwarded(headers, 'x-forwarded-proto', options.forwardedProto);
68
+ headers.set('upgrade', 'websocket');
69
+ headers.set('connection', 'Upgrade');
70
+ headers.set('sec-websocket-key', options.key ?? createWebSocketKey());
71
+ headers.set('sec-websocket-version', '13');
72
+ if (options.protocols.length > 0) {
73
+ headers.set('sec-websocket-protocol', options.protocols.join(', '));
74
+ }
75
+ const lines = [`GET ${options.path} HTTP/1.1`];
76
+ for (const [name, value] of headers) {
77
+ lines.push(`${name}: ${value}`);
78
+ }
79
+ lines.push('', '');
80
+ return Buffer.from(lines.join('\r\n'), 'latin1');
81
+ }
82
+ function appendForwarded(headers, name, value) {
83
+ if (!value) {
84
+ return;
85
+ }
86
+ const existing = headers.get(name);
87
+ headers.set(name, existing ? `${existing},${value}` : value);
88
+ }
89
+ /**
90
+ * Parses the beginning of the upstream upgrade response.
91
+ * @returns the parsed response, or `undefined` while the header block is incomplete.
92
+ */
93
+ function parseUpgradeHandshakeResponse(buffer) {
94
+ const boundary = buffer.indexOf('\r\n\r\n');
95
+ if (boundary < 0) {
96
+ return undefined;
97
+ }
98
+ const headerBlock = buffer.subarray(0, boundary).toString('latin1');
99
+ const lines = headerBlock.split('\r\n');
100
+ const statusLine = lines.shift() ?? '';
101
+ const match = /^HTTP\/\d\.\d (\d{3}) ?(.*)$/.exec(statusLine);
102
+ if (!match) {
103
+ return undefined;
104
+ }
105
+ const headers = {};
106
+ for (const line of lines) {
107
+ const separator = line.indexOf(':');
108
+ if (separator <= 0) {
109
+ continue;
110
+ }
111
+ const name = line.slice(0, separator).trim().toLowerCase();
112
+ const value = line.slice(separator + 1).trim();
113
+ headers[name] = headers[name] ? `${headers[name]}, ${value}` : value;
114
+ }
115
+ return {
116
+ statusCode: Number(match[1]),
117
+ statusMessage: match[2] ?? '',
118
+ headers,
119
+ head: buffer.subarray(0, boundary + 4),
120
+ rest: buffer.subarray(boundary + 4),
121
+ };
122
+ }
123
+ /** Subprotocol selected by the upstream server, if any. */
124
+ function selectedProtocol(response) {
125
+ const value = response.headers['sec-websocket-protocol'];
126
+ return value ? value.split(',')[0].trim() : '';
127
+ }
128
+ /** True when the upstream actually switched protocols to WebSocket. */
129
+ function isWebSocketUpgrade(response) {
130
+ return response.statusCode === 101 && (response.headers.upgrade ?? '').toLowerCase() === 'websocket';
131
+ }
132
+ function parseRequestedProtocols(header) {
133
+ const value = Array.isArray(header) ? header.join(',') : header;
134
+ if (!value) {
135
+ return [];
136
+ }
137
+ return value.split(',').map((entry) => entry.trim()).filter((entry) => entry.length > 0);
138
+ }
139
+ /**
140
+ * Writes raw bytes to a socket handed over by the HTTP server's `upgrade` event.
141
+ *
142
+ * Bun's `node:http` server hands the upgrade listener a socket shim whose
143
+ * `write()` never reaches the peer (`socket.write()` returns `true` and the
144
+ * bytes are dropped), which is why the gateway cannot use `http-proxy`'s
145
+ * WebSocket pass there. The underlying Bun socket handle still writes
146
+ * correctly, so error responses are written through it; on every other runtime
147
+ * the regular socket write is used.
148
+ */
149
+ function writeUpgradeSocketBytes(socket, chunk) {
150
+ const handle = findBunSocketHandle(socket);
151
+ if (handle) {
152
+ handle.write(chunk);
153
+ return;
154
+ }
155
+ socket.write(chunk);
156
+ }
157
+ function endUpgradeSocket(socket) {
158
+ const handle = findBunSocketHandle(socket);
159
+ if (handle?.end) {
160
+ handle.end();
161
+ return;
162
+ }
163
+ socket.end();
164
+ }
165
+ function findBunSocketHandle(socket) {
166
+ for (const symbol of Object.getOwnPropertySymbols(socket)) {
167
+ if (symbol.description !== 'handle') {
168
+ continue;
169
+ }
170
+ const handle = socket[symbol];
171
+ if (handle && typeof handle.write === 'function') {
172
+ return handle;
173
+ }
174
+ }
175
+ return undefined;
176
+ }
177
+ /** Writes a complete HTTP response to an upgrade request that could not be relayed. */
178
+ function writeUpgradeErrorResponse(socket, statusCode, statusMessage, headers, body) {
179
+ const payload = Buffer.from(body, 'utf8');
180
+ const lines = [`HTTP/1.1 ${statusCode} ${statusMessage}`];
181
+ for (const [name, value] of Object.entries(headers)) {
182
+ lines.push(`${name}: ${value}`);
183
+ }
184
+ lines.push(`Content-Length: ${payload.length}`, 'Connection: close', '', '');
185
+ writeUpgradeSocketBytes(socket, Buffer.concat([Buffer.from(lines.join('\r\n'), 'latin1'), payload]));
186
+ endUpgradeSocket(socket);
187
+ }
188
+ /** Best-effort `X-Forwarded-*` values matching `http-proxy`'s `xfwd: true`. */
189
+ function forwardedHeaderValues(req) {
190
+ const host = Array.isArray(req.headers.host) ? req.headers.host[0] : req.headers.host;
191
+ const port = host?.match(/:(\d+)/)?.[1];
192
+ const encrypted = Boolean(req.socket.encrypted);
193
+ return {
194
+ forwardedFor: req.socket.remoteAddress,
195
+ forwardedPort: port ?? (encrypted ? '443' : '80'),
196
+ forwardedProto: encrypted ? 'wss' : 'ws',
197
+ };
198
+ }
199
+ //# sourceMappingURL=UpgradeHandshake.js.map