@undefineds.co/xpod 0.4.13 → 0.4.14

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 (253) hide show
  1. package/config/components-ignore.json +11 -7
  2. package/dist/api/ai-gateway/providers/ProviderRegistry.js +1 -1
  3. package/dist/api/ai-gateway/service-access/AiConnectionsServiceAccess.d.ts +1 -1
  4. package/dist/api/ai-gateway/service-access/AiConnectionsServiceAccess.js +1 -1
  5. package/dist/api/container/index.js +1 -0
  6. package/dist/api/container/local.js +30 -12
  7. package/dist/api/container/routes.js +2 -0
  8. package/dist/api/container/types.d.ts +2 -0
  9. package/dist/api/handlers/AdminHandler.d.ts +17 -1
  10. package/dist/api/handlers/AdminHandler.js +40 -3
  11. package/dist/api/handlers/EdgeNodeSignalHandler.js +10 -2
  12. package/dist/api/handlers/NetworkSettingsHandler.d.ts +37 -5
  13. package/dist/api/handlers/NetworkSettingsHandler.js +39 -11
  14. package/dist/api/handlers/ProvisionHandler.d.ts +6 -1
  15. package/dist/api/handlers/ProvisionHandler.js +7 -2
  16. package/dist/api/handlers/ReachabilityHandler.d.ts +6 -0
  17. package/dist/api/handlers/ReachabilityHandler.js +22 -5
  18. package/dist/api/network/NetworkEnvironmentConfigurationStore.d.ts +6 -1
  19. package/dist/api/network/NetworkEnvironmentConfigurationStore.js +72 -16
  20. package/dist/api/runtime.d.ts +9 -0
  21. package/dist/api/runtime.js +15 -2
  22. package/dist/api/service/AiClientConfigurationService.d.ts +1 -1
  23. package/dist/api/service/AiClientConfigurationService.js +1 -1
  24. package/dist/cli/commands/start.d.ts +19 -1
  25. package/dist/cli/commands/start.js +71 -5
  26. package/dist/components/context.jsonld +30 -0
  27. package/dist/edge/EdgeNodeAgent.d.ts +6 -0
  28. package/dist/edge/EdgeNodeAgent.js +1 -1
  29. package/dist/edge/EdgeNodeAgentInitializer.d.ts +2 -0
  30. package/dist/edge/EdgeNodeAgentInitializer.js +1 -0
  31. package/dist/edge/EdgeNodeAgentInitializer.jsonld +19 -0
  32. package/dist/edge/EdgeNodeDnsCoordinator.d.ts +11 -1
  33. package/dist/edge/EdgeNodeDnsCoordinator.js +12 -2
  34. package/dist/edge/EdgeNodeHealthProbeService.d.ts +15 -0
  35. package/dist/edge/EdgeNodeHealthProbeService.js +44 -12
  36. package/dist/edge/EdgeNodeHealthProbeService.jsonld +77 -0
  37. package/dist/edge/ProbeTargetGuard.d.ts +35 -0
  38. package/dist/edge/ProbeTargetGuard.js +142 -0
  39. package/dist/edge/reachability/NodeAccessResolver.d.ts +16 -0
  40. package/dist/edge/reachability/NodeAccessResolver.js +30 -0
  41. package/dist/index.d.ts +3 -1
  42. package/dist/index.js +9 -3
  43. package/dist/main.js +7 -0
  44. package/dist/runtime/Proxy.d.ts +22 -0
  45. package/dist/runtime/Proxy.js +34 -7
  46. package/dist/runtime/bootstrap.d.ts +11 -0
  47. package/dist/runtime/bootstrap.js +21 -1
  48. package/dist/runtime/css-process.d.ts +1 -0
  49. package/dist/runtime/css-process.js +1 -0
  50. package/dist/runtime/host/node/NodeRuntimeHost.js +4 -1
  51. package/dist/runtime/host/types.d.ts +6 -0
  52. package/dist/runtime/index.d.ts +1 -1
  53. package/dist/runtime/index.js +5 -1
  54. package/dist/runtime/lifecycle.js +1 -0
  55. package/dist/runtime/port-finder.d.ts +30 -0
  56. package/dist/runtime/port-finder.js +83 -0
  57. package/dist/runtime/runner/node/NodeGatewayRuntimeRunner.js +1 -0
  58. package/dist/runtime/runner/types.d.ts +5 -0
  59. package/dist/runtime/runtime-types.d.ts +1 -0
  60. package/dist/test-utils/local-managed-client-p2p-e2e-smoke.js +1 -1
  61. package/dist/tunnel/LocalTunnelProvider.d.ts +15 -0
  62. package/dist/tunnel/LocalTunnelProvider.js +87 -18
  63. package/dist/tunnel/LocalTunnelProvider.jsonld +27 -0
  64. package/dist/tunnel/NgrokTunnelProvider.d.ts +4 -0
  65. package/dist/tunnel/NgrokTunnelProvider.js +117 -43
  66. package/dist/tunnel/NgrokTunnelProvider.jsonld +4 -0
  67. package/dist/tunnel/SakuraFrpTunnelProvider.d.ts +65 -3
  68. package/dist/tunnel/SakuraFrpTunnelProvider.js +268 -25
  69. package/dist/tunnel/TunnelLifecycle.d.ts +14 -0
  70. package/dist/tunnel/TunnelLifecycle.js +34 -0
  71. package/dist/tunnel/TunnelProfiles.d.ts +33 -3
  72. package/dist/tunnel/TunnelProfiles.js +105 -78
  73. package/dist/tunnel/TunnelProvider.d.ts +15 -2
  74. package/dist/tunnel/TunnelProvider.jsonld +8 -0
  75. package/dist/tunnel/TunnelProviderCatalog.d.ts +62 -0
  76. package/dist/tunnel/TunnelProviderCatalog.js +130 -0
  77. package/node_modules/@undefineds.co/ai-connections/dist/AiApiKeyPool.d.ts +1 -1
  78. package/node_modules/@undefineds.co/ai-connections/dist/AiApiKeyPool.js +1 -1
  79. package/node_modules/@undefineds.co/ai-connections/dist/AiAuthorizationActions.d.ts +1 -1
  80. package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.d.ts +1 -1
  81. package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.js +1 -1
  82. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectDialog.d.ts +1 -1
  83. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.d.ts +1 -1
  84. package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialPoolSection.d.ts +1 -1
  85. package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialRow.d.ts +1 -1
  86. package/node_modules/@undefineds.co/ai-connections/dist/AiCustomProviderDialog.d.ts +1 -1
  87. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeyRow.d.ts +1 -1
  88. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.d.ts +1 -1
  89. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayModelsSection.d.ts +1 -1
  90. package/node_modules/@undefineds.co/ai-connections/dist/AiOfferingDetails.d.ts +1 -1
  91. package/node_modules/@undefineds.co/ai-connections/dist/AiProviderCard.d.ts +1 -1
  92. package/node_modules/@undefineds.co/ai-connections/dist/AiQuotaCard.d.ts +1 -1
  93. package/node_modules/@undefineds.co/ai-connections/dist/AiSortableCredentialList.d.ts +1 -1
  94. package/node_modules/@undefineds.co/ai-connections/dist/authorization-methods.d.ts +1 -1
  95. package/node_modules/@undefineds.co/ai-connections/dist/collection-runtime.d.ts +1 -1
  96. package/node_modules/@undefineds.co/ai-connections/dist/collection-runtime.js +3 -3
  97. package/node_modules/@undefineds.co/ai-connections/dist/collections.d.ts +1 -1
  98. package/node_modules/@undefineds.co/ai-connections/dist/collections.js +3 -3
  99. package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/ai-connections-client.d.ts +1 -1
  100. package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/ai-connections-client.js +1 -1
  101. package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/index.cjs +8 -8
  102. package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/index.d.ts +1 -1
  103. package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/index.js +1 -1
  104. package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/provider-catalog.cjs +3 -3
  105. package/node_modules/@undefineds.co/ai-connections/dist/controller.d.ts +1 -1
  106. package/node_modules/@undefineds.co/ai-connections/dist/controller.js +1 -1
  107. package/node_modules/@undefineds.co/ai-connections/dist/credential-labels.d.ts +1 -1
  108. package/node_modules/@undefineds.co/ai-connections/dist/display-wording.d.ts +1 -1
  109. package/node_modules/@undefineds.co/ai-connections/dist/error-wording.d.ts +1 -1
  110. package/node_modules/@undefineds.co/ai-connections/dist/error-wording.js +1 -1
  111. package/node_modules/@undefineds.co/ai-connections/dist/gateway-endpoints.js +1 -1
  112. package/node_modules/@undefineds.co/ai-connections/dist/offering-endpoints.d.ts +1 -1
  113. package/node_modules/@undefineds.co/ai-connections/dist/offering-label.d.ts +1 -1
  114. package/node_modules/@undefineds.co/ai-connections/dist/provider-visuals.d.ts +1 -1
  115. package/node_modules/@undefineds.co/ai-connections/dist/service-access.js +1 -1
  116. package/node_modules/@undefineds.co/ai-connections/dist/useAiConnectDialog.d.ts +1 -1
  117. package/node_modules/@undefineds.co/ai-connections/package.json +31 -1
  118. package/package.json +5 -6
  119. package/static/app/assets/main.css +1 -1
  120. package/static/auth-callback/assets/{AiConfigContext-DlFyEWy9.js → AiConfigContext-DCXpjzpj.js} +1 -1
  121. package/static/auth-callback/assets/{AiConfigPage-CkYk-SFW.js → AiConfigPage-fe-xMIXa.js} +1 -1
  122. package/static/auth-callback/assets/{DocumentProcessingPanel-CqIr3JqN.js → DocumentProcessingPanel-BGnkfMuU.js} +1 -1
  123. package/static/auth-callback/assets/{IndexLifecyclePanel-C1GKV3Vx.js → IndexLifecyclePanel-42Jups0j.js} +1 -1
  124. package/static/auth-callback/assets/{IndexSubjectPanel-ro9lC6XW.js → IndexSubjectPanel-CYyLOlQU.js} +1 -1
  125. package/static/auth-callback/assets/{ModelAssignmentsPanel-DxNdyKRJ.js → ModelAssignmentsPanel-BOvUH4yr.js} +1 -1
  126. package/static/auth-callback/assets/{ModelsPage-BVtWSPBU.js → ModelsPage-DwyITxt7.js} +3 -3
  127. package/static/auth-callback/assets/NetworkPage-CG9RelJA.js +2 -0
  128. package/static/auth-callback/assets/{PaneListHeader-ByKw8ada.js → PaneListHeader-yvd5ohs6.js} +1 -1
  129. package/static/auth-callback/assets/{SearchIndexingPanel-CulBKcYT.js → SearchIndexingPanel-2_a6ezzj.js} +1 -1
  130. package/static/auth-callback/assets/{StatusSubjectPanel-VOcfrt8o.js → StatusSubjectPanel-8qtVxnzC.js} +1 -1
  131. package/static/auth-callback/assets/{StatusWorkspace-Jsz6hAdE.js → StatusWorkspace-CBdRahCF.js} +1 -1
  132. package/static/auth-callback/assets/{SystemSettingsPage-BFNvGAle.js → SystemSettingsPage-BZJ6vWkg.js} +1 -1
  133. package/static/auth-callback/assets/{SystemSettingsSubjectPanel-DFRdrSfK.js → SystemSettingsSubjectPanel-xm08UhXP.js} +1 -1
  134. package/static/auth-callback/assets/{XpodAiConnectionsPodStore-C6KpvHVg.js → XpodAiConnectionsPodStore-V6vgGfuw.js} +1 -1
  135. package/static/auth-callback/assets/{activity-DnTlb9iM.js → activity-CeM7xly8.js} +1 -1
  136. package/static/auth-callback/assets/{auth-callback-D2UkK5Xj.js → auth-callback-DTG8cSj7.js} +3 -3
  137. package/static/auth-callback/assets/auth-callback-rk080mvG.css +1 -0
  138. package/static/auth-callback/assets/{badge-D7IJuuTM.js → badge-qJo2Zr4d.js} +1 -1
  139. package/static/auth-callback/assets/{collection-runtime-wT1n4GS2.js → collection-runtime-Bztsz31a.js} +1 -1
  140. package/static/auth-callback/assets/{dialog-DickLu5z.js → dialog-D-h6x5x0.js} +1 -1
  141. package/static/auth-callback/assets/{download-kn8WnRu3.js → download-C2ir4lmR.js} +1 -1
  142. package/static/auth-callback/assets/{external-link-B6B8jfSn.js → external-link-THLDL4On.js} +1 -1
  143. package/static/auth-callback/assets/{index-Dz83EEHD.js → index-BRpv4yO3.js} +1 -1
  144. package/static/auth-callback/assets/{index-DHF97YLP.js → index-BlVZb9A7.js} +1 -1
  145. package/static/auth-callback/assets/index-D983R1FV.js +4 -0
  146. package/static/auth-callback/assets/{index-browser-CSghinyi.js → index-browser-3FvR0aaf.js} +1 -1
  147. package/static/auth-callback/assets/{key-round-ChkOx3E1.js → key-round-C9U5j1Ly.js} +1 -1
  148. package/static/auth-callback/assets/{rotate-ccw-B3hE-nyd.js → rotate-ccw-DP45cD4o.js} +1 -1
  149. package/static/auth-callback/assets/{skeleton-kEqR7tpI.js → skeleton-Dn4EiSCS.js} +1 -1
  150. package/static/auth-callback/assets/{waypoints-D6Jo-SZa.js → waypoints-uqFQ3uEG.js} +1 -1
  151. package/static/auth-callback/assets/{workspace-layout-BHwT_cHd.js → workspace-layout-DLYK0Wwu.js} +1 -1
  152. package/static/auth-callback/auth-callback.html +2 -2
  153. package/static/dashboard/assets/{AiConfigContext-BfC3v-x2.js → AiConfigContext-DJcMECNw.js} +1 -1
  154. package/static/dashboard/assets/{AiConfigPage-QNS3u7Ff.js → AiConfigPage-BvE7dOTy.js} +1 -1
  155. package/static/dashboard/assets/{DocumentProcessingPanel-Dr4XLeT4.js → DocumentProcessingPanel-D9780krf.js} +1 -1
  156. package/static/dashboard/assets/{IndexLifecyclePanel-KtM_gpeO.js → IndexLifecyclePanel-SjsUcnbM.js} +1 -1
  157. package/static/dashboard/assets/{IndexSubjectPanel-DLaiKdLc.js → IndexSubjectPanel-C-ym2Tqi.js} +1 -1
  158. package/static/dashboard/assets/{ModelAssignmentsPanel-Bk7TvQRq.js → ModelAssignmentsPanel-BRjZ-arB.js} +1 -1
  159. package/static/dashboard/assets/{ModelsPage-Cci3vlos.js → ModelsPage-BtTU6du3.js} +3 -3
  160. package/static/dashboard/assets/NetworkPage-CV9qpkDg.js +2 -0
  161. package/static/dashboard/assets/{PaneListHeader-qHME_s08.js → PaneListHeader-KyPTTBsv.js} +1 -1
  162. package/static/dashboard/assets/{SearchIndexingPanel-HZPKj8H9.js → SearchIndexingPanel-DolHGawg.js} +1 -1
  163. package/static/dashboard/assets/{StatusSubjectPanel-ij7IpI8d.js → StatusSubjectPanel-_YZvKiYi.js} +1 -1
  164. package/static/dashboard/assets/{StatusWorkspace-Cp02JcaN.js → StatusWorkspace-Dlbh_G40.js} +1 -1
  165. package/static/dashboard/assets/{SystemSettingsPage-BSeuvb8X.js → SystemSettingsPage-Be7QSIoz.js} +1 -1
  166. package/static/dashboard/assets/{SystemSettingsSubjectPanel-CP4_luGS.js → SystemSettingsSubjectPanel-DBp0gja7.js} +1 -1
  167. package/static/dashboard/assets/{XpodAiConnectionsPodStore-urO6zaHL.js → XpodAiConnectionsPodStore-ClpSjzpP.js} +1 -1
  168. package/static/dashboard/assets/{activity-DxjgQNvr.js → activity-lsNbTXJu.js} +1 -1
  169. package/static/dashboard/assets/{badge-53qCrRbl.js → badge-CVatKjaG.js} +1 -1
  170. package/static/dashboard/assets/{collection-runtime-BPAmHG46.js → collection-runtime-Ec4UnY28.js} +1 -1
  171. package/static/dashboard/assets/{dashboard-BcT2ByXw.js → dashboard-BEzsRsvF.js} +2 -2
  172. package/static/dashboard/assets/dashboard-rk080mvG.css +1 -0
  173. package/static/dashboard/assets/{dialog-B28YtNhS.js → dialog-BuyelQ4V.js} +1 -1
  174. package/static/dashboard/assets/{download-DkLNceJ4.js → download-B4Nf678F.js} +1 -1
  175. package/static/dashboard/assets/{external-link-D3TXnlo3.js → external-link-PYv9CvKL.js} +1 -1
  176. package/static/dashboard/assets/index-C9XPE-mI.js +4 -0
  177. package/static/dashboard/assets/{index-CFIenkeK.js → index-Cx69bTNh.js} +1 -1
  178. package/static/dashboard/assets/{index-CIiBu9mr.js → index-awr7ulur.js} +1 -1
  179. package/static/dashboard/assets/{key-round-B5ccp6nx.js → key-round-VsY80U1Z.js} +1 -1
  180. package/static/dashboard/assets/{rotate-ccw-DUpfkNnk.js → rotate-ccw-Cz1K4vE9.js} +1 -1
  181. package/static/dashboard/assets/{skeleton-BRe19fO0.js → skeleton-BhNv_8tO.js} +1 -1
  182. package/static/dashboard/assets/{waypoints-BKDMxEvu.js → waypoints-DYS9XFYV.js} +1 -1
  183. package/static/dashboard/assets/{workspace-layout-ZTF7C16h.js → workspace-layout-OZJAFx5V.js} +1 -1
  184. package/static/dashboard/dashboard.html +2 -2
  185. package/static/settings/assets/{AiConfigContext-DsyWgu2i.js → AiConfigContext-B8JS3MXF.js} +1 -1
  186. package/static/settings/assets/{AiConfigPage-CSCBckKo.js → AiConfigPage-C3Zl8LUl.js} +1 -1
  187. package/static/settings/assets/{DocumentProcessingPanel-w9yQDbBe.js → DocumentProcessingPanel-DpDZAQvf.js} +1 -1
  188. package/static/settings/assets/{IndexLifecyclePanel-CUUXI8mP.js → IndexLifecyclePanel-Ec1XF88t.js} +1 -1
  189. package/static/settings/assets/{IndexSubjectPanel-BypAU5TJ.js → IndexSubjectPanel-BulT9BmO.js} +1 -1
  190. package/static/settings/assets/{ModelAssignmentsPanel-BetgXw1G.js → ModelAssignmentsPanel-BcGSmYjb.js} +1 -1
  191. package/static/settings/assets/{ModelsPage-DZpTlTZ3.js → ModelsPage-CvTCKy1T.js} +3 -3
  192. package/static/settings/assets/NetworkPage-DQF5u9Bn.js +2 -0
  193. package/static/settings/assets/{PaneListHeader-BGOqGec4.js → PaneListHeader-D40hqcVl.js} +1 -1
  194. package/static/settings/assets/{SearchIndexingPanel-DYAbpZ_9.js → SearchIndexingPanel-iCUPOx_0.js} +1 -1
  195. package/static/settings/assets/{StatusSubjectPanel-CFgzeQ8Q.js → StatusSubjectPanel-E--ZHSql.js} +1 -1
  196. package/static/settings/assets/{StatusWorkspace-4Z6g4Jvv.js → StatusWorkspace-YjDAx1II.js} +1 -1
  197. package/static/settings/assets/{SystemSettingsPage-C1tlrgvI.js → SystemSettingsPage-CDdV3mC9.js} +1 -1
  198. package/static/settings/assets/{SystemSettingsSubjectPanel-CcURI-1L.js → SystemSettingsSubjectPanel-Br8WazDq.js} +1 -1
  199. package/static/settings/assets/{XpodAiConnectionsPodStore-owBQc5nY.js → XpodAiConnectionsPodStore-CLr38P_Z.js} +1 -1
  200. package/static/settings/assets/{activity-CtBc9cNy.js → activity-C5DAHHTE.js} +1 -1
  201. package/static/settings/assets/{badge--r-FDIhU.js → badge-D8eIyxKt.js} +1 -1
  202. package/static/settings/assets/{collection-runtime-CnhPmwAM.js → collection-runtime-DLc9zil8.js} +1 -1
  203. package/static/settings/assets/{dialog-B7ZRsjN7.js → dialog-CyuR7Va4.js} +1 -1
  204. package/static/settings/assets/{download-DgQ1F8QR.js → download-c0oxZrCz.js} +1 -1
  205. package/static/settings/assets/{external-link-Bz7NckNO.js → external-link-D3Z34fP_.js} +1 -1
  206. package/static/settings/assets/{index-Vv-8Vslg.js → index-CKGbRFlc.js} +1 -1
  207. package/static/settings/assets/index-CSr3-2Cj.js +4 -0
  208. package/static/settings/assets/{index-CkGda_Pg.js → index-ComidxAm.js} +1 -1
  209. package/static/settings/assets/{index-browser-Dq7omlpY.js → index-browser-CAscEbae.js} +1 -1
  210. package/static/settings/assets/{key-round-CvuhloKV.js → key-round-DyjLmXuB.js} +1 -1
  211. package/static/settings/assets/{rotate-ccw-DgFKDaz7.js → rotate-ccw-679HF_ec.js} +1 -1
  212. package/static/settings/assets/{settings-BvqY7K96.js → settings-DKknqu4C.js} +3 -3
  213. package/static/settings/assets/settings-rk080mvG.css +1 -0
  214. package/static/settings/assets/{skeleton-D3OeFDF6.js → skeleton-CkopNkPB.js} +1 -1
  215. package/static/settings/assets/{waypoints-C4WbspTb.js → waypoints-CrqfAftE.js} +1 -1
  216. package/static/settings/assets/{workspace-layout-B9H1Tqrk.js → workspace-layout-UN6c4qTG.js} +1 -1
  217. package/static/settings/settings.html +2 -2
  218. package/node_modules/@undefineds.co/ai-connections-core/package.json +0 -61
  219. package/static/auth-callback/assets/NetworkPage-cEvxRMAl.js +0 -2
  220. package/static/auth-callback/assets/auth-callback-Cx9D_1qj.css +0 -1
  221. package/static/auth-callback/assets/index-Cu0EguPo.js +0 -4
  222. package/static/dashboard/assets/NetworkPage-Ot4G2dX5.js +0 -2
  223. package/static/dashboard/assets/dashboard-Cx9D_1qj.css +0 -1
  224. package/static/dashboard/assets/index-Gp3cLolR.js +0 -4
  225. package/static/settings/assets/NetworkPage-BVkasFGM.js +0 -2
  226. package/static/settings/assets/index-BdXwm8nh.js +0 -4
  227. package/static/settings/assets/settings-Cx9D_1qj.css +0 -1
  228. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/normalize.d.ts +0 -0
  229. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/normalize.js +0 -0
  230. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/request.d.ts +0 -0
  231. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/request.js +0 -0
  232. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/types.d.ts +0 -0
  233. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/types.js +0 -0
  234. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/base-adapter.d.ts +0 -0
  235. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/base-adapter.js +0 -0
  236. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/codex.d.ts +0 -0
  237. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/codex.js +0 -0
  238. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/index.d.ts +0 -0
  239. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/index.js +0 -0
  240. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/json-env-adapter.d.ts +0 -0
  241. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/json-env-adapter.js +0 -0
  242. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/pi.d.ts +0 -0
  243. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/pi.js +0 -0
  244. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/transaction.d.ts +0 -0
  245. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/transaction.js +0 -0
  246. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/types.d.ts +0 -0
  247. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/types.js +0 -0
  248. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/credential-storage.d.ts +0 -0
  249. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/credential-storage.js +0 -0
  250. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/endpoint-urls.d.ts +0 -0
  251. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/endpoint-urls.js +0 -0
  252. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/provider-catalog.d.ts +0 -0
  253. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/provider-catalog.js +0 -0
@@ -19,7 +19,17 @@ export declare class EdgeNodeDnsCoordinator {
19
19
  private readonly ttl?;
20
20
  private readonly enabled;
21
21
  constructor(options: EdgeNodeDnsCoordinatorOptions);
22
- synchronize(nodeId: string, metadata: Record<string, unknown>): Promise<void>;
22
+ /**
23
+ * Reconciles the DNS record owned by one node.
24
+ *
25
+ * `binding` is the control plane's subdomain assignment for that node. When it is
26
+ * supplied it is authoritative, including when it carries no subdomain: that means the
27
+ * node owns no record and nothing may be written or deleted. Node-reported metadata is
28
+ * still consulted for callers whose subdomain is local (`LocalNetworkManager`).
29
+ */
30
+ synchronize(nodeId: string, metadata: Record<string, unknown>, binding?: {
31
+ subdomain?: string;
32
+ }): Promise<void>;
23
33
  private extractDnsHints;
24
34
  private extractTunnelEntrypoint;
25
35
  private extractString;
@@ -11,12 +11,22 @@ class EdgeNodeDnsCoordinator {
11
11
  this.ttl = this.normalizeTtl(options.ttl);
12
12
  this.enabled = Boolean(this.rootDomain);
13
13
  }
14
- async synchronize(nodeId, metadata) {
14
+ /**
15
+ * Reconciles the DNS record owned by one node.
16
+ *
17
+ * `binding` is the control plane's subdomain assignment for that node. When it is
18
+ * supplied it is authoritative, including when it carries no subdomain: that means the
19
+ * node owns no record and nothing may be written or deleted. Node-reported metadata is
20
+ * still consulted for callers whose subdomain is local (`LocalNetworkManager`).
21
+ */
22
+ async synchronize(nodeId, metadata, binding) {
15
23
  if (!this.enabled) {
16
24
  return;
17
25
  }
18
26
  const hints = this.extractDnsHints(metadata);
19
- const subdomain = this.extractString(metadata.subdomain) ?? hints?.subdomain;
27
+ const subdomain = binding
28
+ ? this.extractString(binding.subdomain)
29
+ : this.extractString(metadata.subdomain) ?? hints?.subdomain;
20
30
  if (!subdomain) {
21
31
  this.logger.debug(`Node ${nodeId} 未提供 subdomain,跳过 DNS 同步。`);
22
32
  return;
@@ -1,10 +1,17 @@
1
1
  import { EdgeNodeRepository } from '../identity/drizzle/EdgeNodeRepository';
2
+ import { type HeadProbeRequest, type ResolveAddresses } from './ProbeTargetGuard';
2
3
  interface EdgeNodeHealthProbeServiceOptions {
3
4
  repository?: EdgeNodeRepository;
4
5
  identityDbUrl?: string;
5
6
  enabled?: boolean | string;
6
7
  timeoutMs?: number | string;
7
8
  locations?: string | string[];
9
+ /** DNS resolution used to validate probe targets; injected in tests. */
10
+ resolveAddresses?: ResolveAddresses;
11
+ /** Transport for the direct HEAD probe; injected in tests. */
12
+ headRequest?: HeadProbeRequest;
13
+ /** Redirect hops followed while re-validating every target. */
14
+ maxRedirects?: number;
8
15
  }
9
16
  export declare class EdgeNodeHealthProbeService {
10
17
  private readonly logger;
@@ -12,6 +19,9 @@ export declare class EdgeNodeHealthProbeService {
12
19
  private readonly enabled;
13
20
  private readonly timeoutMs;
14
21
  private readonly locations;
22
+ private readonly resolveAddresses?;
23
+ private readonly headRequest;
24
+ private readonly maxRedirects;
15
25
  constructor(options: EdgeNodeHealthProbeServiceOptions);
16
26
  probeNode(nodeId: string): Promise<void>;
17
27
  private collectCandidates;
@@ -19,6 +29,11 @@ export declare class EdgeNodeHealthProbeService {
19
29
  private extractManagedTunnelEndpoint;
20
30
  private extractNonEmptyString;
21
31
  private ping;
32
+ /**
33
+ * Follows redirects by hand so every hop is validated again: a public entry point must
34
+ * not be able to bounce the probe into a private address.
35
+ */
36
+ private probePublicCandidate;
22
37
  private toUrl;
23
38
  private createRepository;
24
39
  private normalizeBoolean;
@@ -4,6 +4,7 @@ exports.EdgeNodeHealthProbeService = void 0;
4
4
  const global_logger_factory_1 = require("global-logger-factory");
5
5
  const db_1 = require("../identity/drizzle/db");
6
6
  const EdgeNodeRepository_1 = require("../identity/drizzle/EdgeNodeRepository");
7
+ const ProbeTargetGuard_1 = require("./ProbeTargetGuard");
7
8
  class EdgeNodeHealthProbeService {
8
9
  constructor(options) {
9
10
  this.logger = (0, global_logger_factory_1.getLoggerFor)(this);
@@ -11,6 +12,9 @@ class EdgeNodeHealthProbeService {
11
12
  this.enabled = this.normalizeBoolean(options.enabled) && Boolean(this.repository);
12
13
  this.timeoutMs = this.normalizeTimeout(options.timeoutMs) ?? 3_000;
13
14
  this.locations = this.normalizeLocations(options.locations);
15
+ this.resolveAddresses = options.resolveAddresses;
16
+ this.headRequest = options.headRequest ?? (0, ProbeTargetGuard_1.createPinnedHeadProbeRequest)();
17
+ this.maxRedirects = Math.max(0, Math.trunc(options.maxRedirects ?? 3));
14
18
  }
15
19
  async probeNode(nodeId) {
16
20
  if (!this.enabled) {
@@ -87,8 +91,20 @@ class EdgeNodeHealthProbeService {
87
91
  if (!url) {
88
92
  return { candidate, success: false, error: 'invalid-url', location: location.name, checkedAt: new Date().toISOString() };
89
93
  }
90
- const controller = new AbortController();
91
- const timer = setTimeout(() => controller.abort(), this.timeoutMs);
94
+ // The candidate comes from node metadata, so Cloud only contacts public targets:
95
+ // private, loopback, link-local and metadata addresses stay with clients that can
96
+ // actually reach them.
97
+ const decision = await (0, ProbeTargetGuard_1.assertPublicProbeTarget)(url, this.resolveAddresses);
98
+ if (!decision.allowed) {
99
+ this.logger.debug(`跳过非公网探测目标 ${candidate}: ${decision.reason}`);
100
+ return {
101
+ candidate,
102
+ success: false,
103
+ error: `blocked-target:${decision.reason}`,
104
+ location: location.name,
105
+ checkedAt: new Date().toISOString(),
106
+ };
107
+ }
92
108
  const started = Date.now();
93
109
  try {
94
110
  if (location.endpoint) {
@@ -96,10 +112,9 @@ class EdgeNodeHealthProbeService {
96
112
  probeUrl.searchParams.set('target', url.toString());
97
113
  const response = await fetch(probeUrl.toString(), {
98
114
  method: 'GET',
99
- signal: controller.signal,
100
115
  headers: { 'accept': 'application/json' },
116
+ signal: AbortSignal.timeout(this.timeoutMs),
101
117
  });
102
- clearTimeout(timer);
103
118
  const latencyMs = Date.now() - started;
104
119
  if (!response.ok) {
105
120
  return {
@@ -133,23 +148,18 @@ class EdgeNodeHealthProbeService {
133
148
  };
134
149
  }
135
150
  }
136
- const response = await fetch(url.toString(), {
137
- method: 'HEAD',
138
- signal: controller.signal,
139
- });
140
- clearTimeout(timer);
151
+ const probe = await this.probePublicCandidate(url, decision.address);
141
152
  const latencyMs = Date.now() - started;
142
153
  return {
143
154
  candidate,
144
155
  location: location.name,
145
- success: response.ok,
156
+ success: probe.status >= 200 && probe.status < 400,
146
157
  latencyMs,
147
- error: response.ok ? undefined : `status:${response.status}`,
158
+ error: probe.error ?? (probe.status >= 200 && probe.status < 400 ? undefined : `status:${probe.status}`),
148
159
  checkedAt: new Date().toISOString(),
149
160
  };
150
161
  }
151
162
  catch (error) {
152
- clearTimeout(timer);
153
163
  return {
154
164
  candidate,
155
165
  location: location.name,
@@ -159,6 +169,28 @@ class EdgeNodeHealthProbeService {
159
169
  };
160
170
  }
161
171
  }
172
+ /**
173
+ * Follows redirects by hand so every hop is validated again: a public entry point must
174
+ * not be able to bounce the probe into a private address.
175
+ */
176
+ async probePublicCandidate(startUrl, startAddress) {
177
+ let url = startUrl;
178
+ let address = startAddress;
179
+ for (let hop = 0; hop <= this.maxRedirects; hop += 1) {
180
+ const response = await this.headRequest(url, { address, timeoutMs: this.timeoutMs });
181
+ if (response.status < 300 || response.status >= 400 || !response.location) {
182
+ return { status: response.status };
183
+ }
184
+ const next = new URL(response.location, url);
185
+ const decision = await (0, ProbeTargetGuard_1.assertPublicProbeTarget)(next, this.resolveAddresses);
186
+ if (!decision.allowed) {
187
+ return { status: 0, error: `blocked-redirect:${decision.reason}` };
188
+ }
189
+ url = next;
190
+ address = decision.address;
191
+ }
192
+ return { status: 0, error: 'blocked-redirect:too-many-redirects' };
193
+ }
162
194
  toUrl(value) {
163
195
  try {
164
196
  return new URL(value);
@@ -74,6 +74,49 @@
74
74
  }
75
75
  ]
76
76
  }
77
+ },
78
+ {
79
+ "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService_options_resolveAddresses",
80
+ "range": {
81
+ "@type": "ParameterRangeUnion",
82
+ "parameterRangeElements": [
83
+ {
84
+ "@type": "ParameterRangeWildcard"
85
+ },
86
+ {
87
+ "@type": "ParameterRangeUndefined"
88
+ }
89
+ ]
90
+ },
91
+ "comment": "DNS resolution used to validate probe targets; injected in tests."
92
+ },
93
+ {
94
+ "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService_options_headRequest",
95
+ "range": {
96
+ "@type": "ParameterRangeUnion",
97
+ "parameterRangeElements": [
98
+ {
99
+ "@type": "ParameterRangeWildcard"
100
+ },
101
+ {
102
+ "@type": "ParameterRangeUndefined"
103
+ }
104
+ ]
105
+ },
106
+ "comment": "Transport for the direct HEAD probe; injected in tests."
107
+ },
108
+ {
109
+ "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService_options_maxRedirects",
110
+ "range": {
111
+ "@type": "ParameterRangeUnion",
112
+ "parameterRangeElements": [
113
+ "xsd:number",
114
+ {
115
+ "@type": "ParameterRangeUndefined"
116
+ }
117
+ ]
118
+ },
119
+ "comment": "Redirect hops followed while re-validating every target."
77
120
  }
78
121
  ],
79
122
  "memberFields": [
@@ -97,6 +140,18 @@
97
140
  "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService__member_locations",
98
141
  "memberFieldName": "locations"
99
142
  },
143
+ {
144
+ "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService__member_resolveAddresses",
145
+ "memberFieldName": "resolveAddresses"
146
+ },
147
+ {
148
+ "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService__member_headRequest",
149
+ "memberFieldName": "headRequest"
150
+ },
151
+ {
152
+ "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService__member_maxRedirects",
153
+ "memberFieldName": "maxRedirects"
154
+ },
100
155
  {
101
156
  "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService__member_constructor",
102
157
  "memberFieldName": "constructor"
@@ -125,6 +180,10 @@
125
180
  "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService__member_ping",
126
181
  "memberFieldName": "ping"
127
182
  },
183
+ {
184
+ "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService__member_probePublicCandidate",
185
+ "memberFieldName": "probePublicCandidate"
186
+ },
128
187
  {
129
188
  "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService__member_toUrl",
130
189
  "memberFieldName": "toUrl"
@@ -179,6 +238,24 @@
179
238
  "value": {
180
239
  "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService_options_locations"
181
240
  }
241
+ },
242
+ {
243
+ "keyRaw": "resolveAddresses",
244
+ "value": {
245
+ "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService_options_resolveAddresses"
246
+ }
247
+ },
248
+ {
249
+ "keyRaw": "headRequest",
250
+ "value": {
251
+ "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService_options_headRequest"
252
+ }
253
+ },
254
+ {
255
+ "keyRaw": "maxRedirects",
256
+ "value": {
257
+ "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService_options_maxRedirects"
258
+ }
182
259
  }
183
260
  ]
184
261
  }
@@ -0,0 +1,35 @@
1
+ export type ResolveAddresses = (hostname: string) => Promise<string[]>;
2
+ export type ProbeTargetDecision = {
3
+ allowed: true;
4
+ address: string;
5
+ } | {
6
+ allowed: false;
7
+ reason: string;
8
+ };
9
+ /** Whether an address is a public unicast address a Cloud probe may contact. */
10
+ export declare function isPublicIpAddress(address: string): boolean;
11
+ /** Resolves every address of a probe hostname; injected in tests. */
12
+ export declare function resolveHostAddresses(hostname: string): Promise<string[]>;
13
+ /**
14
+ * Decides whether a probe target may be contacted.
15
+ *
16
+ * Every resolved address has to be public, so a hostname that mixes public and private
17
+ * records is refused instead of racing whichever record the connection picks.
18
+ */
19
+ export declare function assertPublicProbeTarget(url: URL, resolveAddresses?: ResolveAddresses): Promise<ProbeTargetDecision>;
20
+ export interface HeadProbeRequestOptions {
21
+ /** Address the connection is pinned to, already validated by the target policy. */
22
+ address: string;
23
+ timeoutMs: number;
24
+ }
25
+ export type HeadProbeRequest = (url: URL, options: HeadProbeRequestOptions) => Promise<{
26
+ status: number;
27
+ location?: string;
28
+ }>;
29
+ /**
30
+ * HEAD request pinned to a validated address.
31
+ *
32
+ * Pinning is what makes the DNS check meaningful: without it the client would resolve the
33
+ * hostname a second time and a rebinding answer could still reach a private address.
34
+ */
35
+ export declare function createPinnedHeadProbeRequest(): HeadProbeRequest;
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.isPublicIpAddress = isPublicIpAddress;
7
+ exports.resolveHostAddresses = resolveHostAddresses;
8
+ exports.assertPublicProbeTarget = assertPublicProbeTarget;
9
+ exports.createPinnedHeadProbeRequest = createPinnedHeadProbeRequest;
10
+ const node_http_1 = __importDefault(require("node:http"));
11
+ const node_https_1 = __importDefault(require("node:https"));
12
+ const node_net_1 = require("node:net");
13
+ const node_dns_1 = __importDefault(require("node:dns"));
14
+ /**
15
+ * Address ranges a Cloud probe must never contact: the probe target comes from node
16
+ * metadata, so without this an edge node could make the cluster fetch its own private
17
+ * network, loopback services or the cloud metadata endpoint.
18
+ */
19
+ const BLOCKED_IPV4 = new node_net_1.BlockList();
20
+ for (const [network, prefix] of [
21
+ ['0.0.0.0', 8],
22
+ ['10.0.0.0', 8],
23
+ ['100.64.0.0', 10],
24
+ ['127.0.0.0', 8],
25
+ ['169.254.0.0', 16],
26
+ ['172.16.0.0', 12],
27
+ ['192.0.0.0', 24],
28
+ ['192.0.2.0', 24],
29
+ ['192.168.0.0', 16],
30
+ ['198.18.0.0', 15],
31
+ ['198.51.100.0', 24],
32
+ ['203.0.113.0', 24],
33
+ ['224.0.0.0', 4],
34
+ ['240.0.0.0', 4],
35
+ ]) {
36
+ BLOCKED_IPV4.addSubnet(network, prefix, 'ipv4');
37
+ }
38
+ // IPv4-mapped addresses are normalized to IPv4 before checking, so the two families stay
39
+ // in separate lists: a mixed list makes `check(ipv4Address, 'ipv4')` match IPv6 rules.
40
+ const BLOCKED_IPV6 = new node_net_1.BlockList();
41
+ for (const [network, prefix] of [
42
+ ['::', 128],
43
+ ['::1', 128],
44
+ ['64:ff9b::', 96],
45
+ ['fc00::', 7],
46
+ ['fe80::', 10],
47
+ ['ff00::', 8],
48
+ ['2001:db8::', 32],
49
+ ]) {
50
+ BLOCKED_IPV6.addSubnet(network, prefix, 'ipv6');
51
+ }
52
+ /** Whether an address is a public unicast address a Cloud probe may contact. */
53
+ function isPublicIpAddress(address) {
54
+ const normalized = normalizeMappedIpv4(address);
55
+ const family = (0, node_net_1.isIP)(normalized);
56
+ if (family === 4) {
57
+ return !BLOCKED_IPV4.check(normalized, 'ipv4');
58
+ }
59
+ if (family === 6) {
60
+ return !BLOCKED_IPV6.check(normalized, 'ipv6');
61
+ }
62
+ return false;
63
+ }
64
+ function normalizeMappedIpv4(address) {
65
+ const match = /^::ffff:(\d{1,3}(?:\.\d{1,3}){3})$/iu.exec(address);
66
+ return match ? match[1] : address;
67
+ }
68
+ /** Resolves every address of a probe hostname; injected in tests. */
69
+ async function resolveHostAddresses(hostname) {
70
+ const records = await node_dns_1.default.promises.lookup(hostname, { all: true });
71
+ return records.map((record) => record.address);
72
+ }
73
+ /**
74
+ * Decides whether a probe target may be contacted.
75
+ *
76
+ * Every resolved address has to be public, so a hostname that mixes public and private
77
+ * records is refused instead of racing whichever record the connection picks.
78
+ */
79
+ async function assertPublicProbeTarget(url, resolveAddresses = resolveHostAddresses) {
80
+ if (url.protocol !== 'http:' && url.protocol !== 'https:') {
81
+ return { allowed: false, reason: `unsupported-scheme:${url.protocol}` };
82
+ }
83
+ const hostname = url.hostname.replace(/^\[/u, '').replace(/\]$/u, '');
84
+ if ((0, node_net_1.isIP)(hostname) !== 0) {
85
+ return isPublicIpAddress(hostname)
86
+ ? { allowed: true, address: hostname }
87
+ : { allowed: false, reason: `non-public-address:${hostname}` };
88
+ }
89
+ let addresses;
90
+ try {
91
+ addresses = await resolveAddresses(hostname);
92
+ }
93
+ catch (error) {
94
+ return { allowed: false, reason: `unresolvable:${error.message}` };
95
+ }
96
+ if (addresses.length === 0) {
97
+ return { allowed: false, reason: 'unresolvable' };
98
+ }
99
+ const blocked = addresses.find((address) => !isPublicIpAddress(address));
100
+ if (blocked) {
101
+ return { allowed: false, reason: `non-public-address:${blocked}` };
102
+ }
103
+ return { allowed: true, address: addresses[0] };
104
+ }
105
+ /**
106
+ * HEAD request pinned to a validated address.
107
+ *
108
+ * Pinning is what makes the DNS check meaningful: without it the client would resolve the
109
+ * hostname a second time and a rebinding answer could still reach a private address.
110
+ */
111
+ function createPinnedHeadProbeRequest() {
112
+ return (url, { address, timeoutMs }) => new Promise((resolve, reject) => {
113
+ const transport = url.protocol === 'https:' ? node_https_1.default : node_http_1.default;
114
+ const request = transport.request({
115
+ protocol: url.protocol,
116
+ hostname: url.hostname,
117
+ port: url.port || (url.protocol === 'https:' ? 443 : 80),
118
+ path: `${url.pathname}${url.search}`,
119
+ method: 'HEAD',
120
+ timeout: timeoutMs,
121
+ lookup: (_hostname, options, callback) => {
122
+ const entry = { address, family: (0, node_net_1.isIP)(address) === 6 ? 6 : 4 };
123
+ // Node asks for every family when happy-eyeballs is enabled.
124
+ if (options && typeof options === 'object' && options.all) {
125
+ callback(null, [entry]);
126
+ return;
127
+ }
128
+ callback(null, entry.address, entry.family);
129
+ },
130
+ }, (response) => {
131
+ response.resume();
132
+ resolve({
133
+ status: response.statusCode ?? 0,
134
+ location: typeof response.headers.location === 'string' ? response.headers.location : undefined,
135
+ });
136
+ });
137
+ request.on('timeout', () => request.destroy(new Error('probe-timeout')));
138
+ request.on('error', reject);
139
+ request.end();
140
+ });
141
+ }
142
+ //# sourceMappingURL=ProbeTargetGuard.js.map
@@ -0,0 +1,16 @@
1
+ import type { PodLookupRepository } from '../../identity/drizzle/PodLookupRepository';
2
+ /**
3
+ * Whether a Solid principal may act on an edge node.
4
+ *
5
+ * Reachability sessions expose a node's private candidates, so "is authenticated" is not
6
+ * enough: the caller has to be related to that node (Pod ownership, or an explicit grant
7
+ * once one exists).
8
+ */
9
+ export type NodeAccessResolver = (nodeId: string, webId: string) => Promise<boolean>;
10
+ /**
11
+ * Authorizes a WebID for a node when one of the node's Pods is owned by that WebID.
12
+ *
13
+ * A missing repository resolves to "no access" rather than "no restriction": the caller
14
+ * decides what to do with an unprovable relationship, and the reachability handler denies.
15
+ */
16
+ export declare function createPodOwnershipNodeAccessResolver(podLookupRepository: Pick<PodLookupRepository, 'listAllPods'> | undefined): NodeAccessResolver;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createPodOwnershipNodeAccessResolver = createPodOwnershipNodeAccessResolver;
4
+ const global_logger_factory_1 = require("global-logger-factory");
5
+ /**
6
+ * Authorizes a WebID for a node when one of the node's Pods is owned by that WebID.
7
+ *
8
+ * A missing repository resolves to "no access" rather than "no restriction": the caller
9
+ * decides what to do with an unprovable relationship, and the reachability handler denies.
10
+ */
11
+ function createPodOwnershipNodeAccessResolver(podLookupRepository) {
12
+ const logger = (0, global_logger_factory_1.getLoggerFor)('NodeAccessResolver');
13
+ return async (nodeId, webId) => {
14
+ if (!podLookupRepository) {
15
+ return false;
16
+ }
17
+ try {
18
+ const pods = await podLookupRepository.listAllPods();
19
+ return pods.some((pod) => {
20
+ const hosted = pod.nodeId === nodeId || pod.edgeNodeId === nodeId;
21
+ return hosted && (pod.webId === webId || (pod.webIds ?? []).includes(webId));
22
+ });
23
+ }
24
+ catch (error) {
25
+ logger.warn(`Failed to resolve node access for ${nodeId}/${webId}: ${error.message}`);
26
+ return false;
27
+ }
28
+ };
29
+ }
30
+ //# sourceMappingURL=NodeAccessResolver.js.map
package/dist/index.d.ts CHANGED
@@ -51,6 +51,8 @@ import { SimpleEdgeNodeTunnelManager, NoopEdgeNodeTunnelManager } from './edge/E
51
51
  import { FrpTunnelManager } from './edge/FrpTunnelManager';
52
52
  import { AcmeCertificateManager } from './edge/acme/AcmeCertificateManager';
53
53
  import { EdgeNodeHealthProbeService } from './edge/EdgeNodeHealthProbeService';
54
+ import { assertPublicProbeTarget, createPinnedHeadProbeRequest, isPublicIpAddress } from './edge/ProbeTargetGuard';
55
+ import { createPodOwnershipNodeAccessResolver } from './edge/reachability/NodeAccessResolver';
54
56
  import { EdgeNodeAgent } from './edge/EdgeNodeAgent';
55
57
  import { EdgeNodeAgentInitializer } from './edge/EdgeNodeAgentInitializer';
56
58
  import { EdgeNodeCertificateService } from './service/EdgeNodeCertificateService';
@@ -125,6 +127,6 @@ export type { OwnedWebIdEntry, PodOwnershipResolver, PodOwnershipTarget, CssPodO
125
127
  export type { TunnelProvider, TunnelConfig, TunnelSetupOptions, TunnelStatus, } from './tunnel/TunnelProvider';
126
128
  export type { SubdomainRegistration, ConnectivityResult, SubdomainServiceOptions, } from './subdomain/SubdomainService';
127
129
  export { AppStaticAssetHandler } from './http/AppStaticAssetHandler';
128
- export { RepresentationPartialConvertingStore, MinioDataAccessor, SolidRdfDataAccessor, MixDataAccessor, ConfigurableLoggerFactory, resolveLogFilePattern, resolveCurrentLogFile, LOG_FILE_PATTERN, SparqlUpdateResourceStore, SubgraphQueryEngine, SubgraphSparqlHttpHandler, InternalPodDataHttpHandler, QuotaAdminHttpHandler, ClusterIngressRouter, ClusterWebSocketConfigurator, EdgeNodeDirectDebugHttpHandler, EdgeNodeProxyHttpHandler, RouterHttpHandler, RouterHttpRoute, TracingHandler, EdgeNodeCertificateHttpHandler, TerminalHttpHandler, DeviceNotificationHub, DeviceNotificationResourceListener, DeviceNotificationWebSocketServer, DeviceNotificationTicketHandler, registerDeviceNotificationRuntime, ReservedSuffixIdentifierGenerator, DrizzleIndexedStorage, LoginMethodGuardStorage, ValidatingIdentityProviderHttpHandler, PostgresKeyValueStorage, RedisKeyValueStorage, SqliteKeyValueStorage, BaseKeyValueStorage, DrizzleQuotaService, NoopQuotaService, HttpEntitlementProvider, NoopEntitlementProvider, PerAccountQuotaStrategy, TencentDnsProvider, EdgeNodeDnsCoordinator, Dns01CertificateProvisioner, SimpleEdgeNodeTunnelManager, NoopEdgeNodeTunnelManager, FrpTunnelManager, EdgeNodeHealthProbeService, EdgeNodeAgent, EdgeNodeAgentInitializer, EdgeNodeCertificateService, AcmeCertificateManager, EdgeNodeModeDetector, ClusterIdentifierStrategy, UsageTrackingStore, CenterNodeRegistrationService, PodRoutingHttpHandler, ReactAppViewHandler, QuintStore, SqliteQuintStore, PgQuintStore, RdfTermDictionary, RdfQuadIndex, Rdf3xIndex, RdfTextIndex, RdfVectorIndex, PostgresRdfTextIndex, PostgresRdfVectorIndex, SolidRdfEngine, LocalQleverNativeSparqlClient, QleverSparqlEngine, RdfQuerySparqlEngine, PostgresRdfEngine, VectorStore, SqliteVectorStore, PostgresVectorStore, VectorHttpHandler, ProviderRegistry, ProviderRegistryImpl, EmbeddingService, EmbeddingServiceImpl, CredentialReader, CredentialReaderImpl, CloudflareTunnelProvider, LocalTunnelProvider, NgrokTunnelProvider, SubdomainService, MultiDomainIdentifierStrategy, SubdomainPodIdentifierStrategy, DisabledOidcHandler, DisabledIdentityProviderHandler, AutoDetectOidcHandler, AutoDetectIdentityProviderHandler, LoopbackClientIdAdapterFactory, RememberedClientGrantStore, RememberedConsentHandler, RememberedClientPromptFactory, SessionBoundIdentityProviderFactory, ScopedPickWebIdHandler, ConfiguredLoopbackDPoPWebIdExtractor, AccountStorageBindingsHandler, CssPodOwnershipResolver, UrlAwareRedisLocker, ProvisionPodCreator, ProvisionPodStore, ProvisionCodeCodec, LocalPodProvisioningService, SqliteSolidFsSyncJournal, RootedSolidFsSyncJournal, LocalRdfAuthorityRecoveryInitializer, ObservableResourceStore, RdfSearchReconciliationIntentSink, };
130
+ export { RepresentationPartialConvertingStore, MinioDataAccessor, SolidRdfDataAccessor, MixDataAccessor, ConfigurableLoggerFactory, resolveLogFilePattern, resolveCurrentLogFile, LOG_FILE_PATTERN, SparqlUpdateResourceStore, SubgraphQueryEngine, SubgraphSparqlHttpHandler, InternalPodDataHttpHandler, QuotaAdminHttpHandler, ClusterIngressRouter, ClusterWebSocketConfigurator, EdgeNodeDirectDebugHttpHandler, EdgeNodeProxyHttpHandler, RouterHttpHandler, RouterHttpRoute, TracingHandler, EdgeNodeCertificateHttpHandler, TerminalHttpHandler, DeviceNotificationHub, DeviceNotificationResourceListener, DeviceNotificationWebSocketServer, DeviceNotificationTicketHandler, registerDeviceNotificationRuntime, ReservedSuffixIdentifierGenerator, DrizzleIndexedStorage, LoginMethodGuardStorage, ValidatingIdentityProviderHttpHandler, PostgresKeyValueStorage, RedisKeyValueStorage, SqliteKeyValueStorage, BaseKeyValueStorage, DrizzleQuotaService, NoopQuotaService, HttpEntitlementProvider, NoopEntitlementProvider, PerAccountQuotaStrategy, TencentDnsProvider, EdgeNodeDnsCoordinator, Dns01CertificateProvisioner, SimpleEdgeNodeTunnelManager, NoopEdgeNodeTunnelManager, FrpTunnelManager, EdgeNodeHealthProbeService, assertPublicProbeTarget, createPinnedHeadProbeRequest, isPublicIpAddress, createPodOwnershipNodeAccessResolver, EdgeNodeAgent, EdgeNodeAgentInitializer, EdgeNodeCertificateService, AcmeCertificateManager, EdgeNodeModeDetector, ClusterIdentifierStrategy, UsageTrackingStore, CenterNodeRegistrationService, PodRoutingHttpHandler, ReactAppViewHandler, QuintStore, SqliteQuintStore, PgQuintStore, RdfTermDictionary, RdfQuadIndex, Rdf3xIndex, RdfTextIndex, RdfVectorIndex, PostgresRdfTextIndex, PostgresRdfVectorIndex, SolidRdfEngine, LocalQleverNativeSparqlClient, QleverSparqlEngine, RdfQuerySparqlEngine, PostgresRdfEngine, VectorStore, SqliteVectorStore, PostgresVectorStore, VectorHttpHandler, ProviderRegistry, ProviderRegistryImpl, EmbeddingService, EmbeddingServiceImpl, CredentialReader, CredentialReaderImpl, CloudflareTunnelProvider, LocalTunnelProvider, NgrokTunnelProvider, SubdomainService, MultiDomainIdentifierStrategy, SubdomainPodIdentifierStrategy, DisabledOidcHandler, DisabledIdentityProviderHandler, AutoDetectOidcHandler, AutoDetectIdentityProviderHandler, LoopbackClientIdAdapterFactory, RememberedClientGrantStore, RememberedConsentHandler, RememberedClientPromptFactory, SessionBoundIdentityProviderFactory, ScopedPickWebIdHandler, ConfiguredLoopbackDPoPWebIdExtractor, AccountStorageBindingsHandler, CssPodOwnershipResolver, UrlAwareRedisLocker, ProvisionPodCreator, ProvisionPodStore, ProvisionCodeCodec, LocalPodProvisioningService, SqliteSolidFsSyncJournal, RootedSolidFsSyncJournal, LocalRdfAuthorityRecoveryInitializer, ObservableResourceStore, RdfSearchReconciliationIntentSink, };
129
131
  export type { ResourceChangeEvent, ResourceChangeListener, ResourceChangeRecorder, } from './storage/ObservableResourceStore';
130
132
  export { RdfHandlebarsTemplateEngine } from './util/templates/RdfHandlebarsTemplateEngine';
package/dist/index.js CHANGED
@@ -14,9 +14,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.EdgeNodeAgentInitializer = exports.EdgeNodeAgent = exports.EdgeNodeHealthProbeService = exports.FrpTunnelManager = exports.NoopEdgeNodeTunnelManager = exports.SimpleEdgeNodeTunnelManager = exports.Dns01CertificateProvisioner = exports.EdgeNodeDnsCoordinator = exports.TencentDnsProvider = exports.PerAccountQuotaStrategy = exports.NoopEntitlementProvider = exports.HttpEntitlementProvider = exports.NoopQuotaService = exports.DrizzleQuotaService = exports.BaseKeyValueStorage = exports.SqliteKeyValueStorage = exports.RedisKeyValueStorage = exports.PostgresKeyValueStorage = exports.ValidatingIdentityProviderHttpHandler = exports.LoginMethodGuardStorage = exports.DrizzleIndexedStorage = exports.ReservedSuffixIdentifierGenerator = exports.registerDeviceNotificationRuntime = exports.DeviceNotificationTicketHandler = exports.DeviceNotificationWebSocketServer = exports.DeviceNotificationResourceListener = exports.DeviceNotificationHub = exports.TerminalHttpHandler = exports.EdgeNodeCertificateHttpHandler = exports.TracingHandler = exports.RouterHttpRoute = exports.RouterHttpHandler = exports.EdgeNodeProxyHttpHandler = exports.EdgeNodeDirectDebugHttpHandler = exports.ClusterWebSocketConfigurator = exports.ClusterIngressRouter = exports.QuotaAdminHttpHandler = exports.InternalPodDataHttpHandler = exports.SubgraphSparqlHttpHandler = exports.SubgraphQueryEngine = exports.SparqlUpdateResourceStore = exports.LOG_FILE_PATTERN = exports.resolveCurrentLogFile = exports.resolveLogFilePattern = exports.ConfigurableLoggerFactory = exports.MixDataAccessor = exports.SolidRdfDataAccessor = exports.MinioDataAccessor = exports.RepresentationPartialConvertingStore = exports.AppStaticAssetHandler = void 0;
18
- exports.ConfiguredLoopbackDPoPWebIdExtractor = exports.ScopedPickWebIdHandler = exports.SessionBoundIdentityProviderFactory = exports.RememberedClientPromptFactory = exports.RememberedConsentHandler = exports.RememberedClientGrantStore = exports.LoopbackClientIdAdapterFactory = exports.AutoDetectIdentityProviderHandler = exports.AutoDetectOidcHandler = exports.DisabledIdentityProviderHandler = exports.DisabledOidcHandler = exports.SubdomainPodIdentifierStrategy = exports.MultiDomainIdentifierStrategy = exports.SubdomainService = exports.NgrokTunnelProvider = exports.LocalTunnelProvider = exports.CloudflareTunnelProvider = exports.CredentialReaderImpl = exports.CredentialReader = exports.EmbeddingServiceImpl = exports.EmbeddingService = exports.ProviderRegistryImpl = exports.ProviderRegistry = exports.VectorHttpHandler = exports.PostgresVectorStore = exports.SqliteVectorStore = exports.VectorStore = exports.PostgresRdfEngine = exports.RdfQuerySparqlEngine = exports.QleverSparqlEngine = exports.LocalQleverNativeSparqlClient = exports.SolidRdfEngine = exports.PostgresRdfVectorIndex = exports.PostgresRdfTextIndex = exports.RdfVectorIndex = exports.RdfTextIndex = exports.Rdf3xIndex = exports.RdfQuadIndex = exports.RdfTermDictionary = exports.PgQuintStore = exports.SqliteQuintStore = exports.QuintStore = exports.ReactAppViewHandler = exports.PodRoutingHttpHandler = exports.CenterNodeRegistrationService = exports.UsageTrackingStore = exports.ClusterIdentifierStrategy = exports.EdgeNodeModeDetector = exports.AcmeCertificateManager = exports.EdgeNodeCertificateService = void 0;
19
- exports.RdfHandlebarsTemplateEngine = exports.RdfSearchReconciliationIntentSink = exports.ObservableResourceStore = exports.LocalRdfAuthorityRecoveryInitializer = exports.RootedSolidFsSyncJournal = exports.SqliteSolidFsSyncJournal = exports.LocalPodProvisioningService = exports.ProvisionCodeCodec = exports.ProvisionPodStore = exports.ProvisionPodCreator = exports.UrlAwareRedisLocker = exports.CssPodOwnershipResolver = exports.AccountStorageBindingsHandler = void 0;
17
+ exports.createPinnedHeadProbeRequest = exports.assertPublicProbeTarget = exports.EdgeNodeHealthProbeService = exports.FrpTunnelManager = exports.NoopEdgeNodeTunnelManager = exports.SimpleEdgeNodeTunnelManager = exports.Dns01CertificateProvisioner = exports.EdgeNodeDnsCoordinator = exports.TencentDnsProvider = exports.PerAccountQuotaStrategy = exports.NoopEntitlementProvider = exports.HttpEntitlementProvider = exports.NoopQuotaService = exports.DrizzleQuotaService = exports.BaseKeyValueStorage = exports.SqliteKeyValueStorage = exports.RedisKeyValueStorage = exports.PostgresKeyValueStorage = exports.ValidatingIdentityProviderHttpHandler = exports.LoginMethodGuardStorage = exports.DrizzleIndexedStorage = exports.ReservedSuffixIdentifierGenerator = exports.registerDeviceNotificationRuntime = exports.DeviceNotificationTicketHandler = exports.DeviceNotificationWebSocketServer = exports.DeviceNotificationResourceListener = exports.DeviceNotificationHub = exports.TerminalHttpHandler = exports.EdgeNodeCertificateHttpHandler = exports.TracingHandler = exports.RouterHttpRoute = exports.RouterHttpHandler = exports.EdgeNodeProxyHttpHandler = exports.EdgeNodeDirectDebugHttpHandler = exports.ClusterWebSocketConfigurator = exports.ClusterIngressRouter = exports.QuotaAdminHttpHandler = exports.InternalPodDataHttpHandler = exports.SubgraphSparqlHttpHandler = exports.SubgraphQueryEngine = exports.SparqlUpdateResourceStore = exports.LOG_FILE_PATTERN = exports.resolveCurrentLogFile = exports.resolveLogFilePattern = exports.ConfigurableLoggerFactory = exports.MixDataAccessor = exports.SolidRdfDataAccessor = exports.MinioDataAccessor = exports.RepresentationPartialConvertingStore = exports.AppStaticAssetHandler = void 0;
18
+ exports.RememberedConsentHandler = exports.RememberedClientGrantStore = exports.LoopbackClientIdAdapterFactory = exports.AutoDetectIdentityProviderHandler = exports.AutoDetectOidcHandler = exports.DisabledIdentityProviderHandler = exports.DisabledOidcHandler = exports.SubdomainPodIdentifierStrategy = exports.MultiDomainIdentifierStrategy = exports.SubdomainService = exports.NgrokTunnelProvider = exports.LocalTunnelProvider = exports.CloudflareTunnelProvider = exports.CredentialReaderImpl = exports.CredentialReader = exports.EmbeddingServiceImpl = exports.EmbeddingService = exports.ProviderRegistryImpl = exports.ProviderRegistry = exports.VectorHttpHandler = exports.PostgresVectorStore = exports.SqliteVectorStore = exports.VectorStore = exports.PostgresRdfEngine = exports.RdfQuerySparqlEngine = exports.QleverSparqlEngine = exports.LocalQleverNativeSparqlClient = exports.SolidRdfEngine = exports.PostgresRdfVectorIndex = exports.PostgresRdfTextIndex = exports.RdfVectorIndex = exports.RdfTextIndex = exports.Rdf3xIndex = exports.RdfQuadIndex = exports.RdfTermDictionary = exports.PgQuintStore = exports.SqliteQuintStore = exports.QuintStore = exports.ReactAppViewHandler = exports.PodRoutingHttpHandler = exports.CenterNodeRegistrationService = exports.UsageTrackingStore = exports.ClusterIdentifierStrategy = exports.EdgeNodeModeDetector = exports.AcmeCertificateManager = exports.EdgeNodeCertificateService = exports.EdgeNodeAgentInitializer = exports.EdgeNodeAgent = exports.createPodOwnershipNodeAccessResolver = exports.isPublicIpAddress = void 0;
19
+ exports.RdfHandlebarsTemplateEngine = exports.RdfSearchReconciliationIntentSink = exports.ObservableResourceStore = exports.LocalRdfAuthorityRecoveryInitializer = exports.RootedSolidFsSyncJournal = exports.SqliteSolidFsSyncJournal = exports.LocalPodProvisioningService = exports.ProvisionCodeCodec = exports.ProvisionPodStore = exports.ProvisionPodCreator = exports.UrlAwareRedisLocker = exports.CssPodOwnershipResolver = exports.AccountStorageBindingsHandler = exports.ConfiguredLoopbackDPoPWebIdExtractor = exports.ScopedPickWebIdHandler = exports.SessionBoundIdentityProviderFactory = exports.RememberedClientPromptFactory = void 0;
20
20
  require("./runtime/configure-drizzle-solid");
21
21
  const RepresentationPartialConvertingStore_1 = require("./storage/RepresentationPartialConvertingStore");
22
22
  Object.defineProperty(exports, "RepresentationPartialConvertingStore", { enumerable: true, get: function () { return RepresentationPartialConvertingStore_1.RepresentationPartialConvertingStore; } });
@@ -111,6 +111,12 @@ const AcmeCertificateManager_1 = require("./edge/acme/AcmeCertificateManager");
111
111
  Object.defineProperty(exports, "AcmeCertificateManager", { enumerable: true, get: function () { return AcmeCertificateManager_1.AcmeCertificateManager; } });
112
112
  const EdgeNodeHealthProbeService_1 = require("./edge/EdgeNodeHealthProbeService");
113
113
  Object.defineProperty(exports, "EdgeNodeHealthProbeService", { enumerable: true, get: function () { return EdgeNodeHealthProbeService_1.EdgeNodeHealthProbeService; } });
114
+ const ProbeTargetGuard_1 = require("./edge/ProbeTargetGuard");
115
+ Object.defineProperty(exports, "assertPublicProbeTarget", { enumerable: true, get: function () { return ProbeTargetGuard_1.assertPublicProbeTarget; } });
116
+ Object.defineProperty(exports, "createPinnedHeadProbeRequest", { enumerable: true, get: function () { return ProbeTargetGuard_1.createPinnedHeadProbeRequest; } });
117
+ Object.defineProperty(exports, "isPublicIpAddress", { enumerable: true, get: function () { return ProbeTargetGuard_1.isPublicIpAddress; } });
118
+ const NodeAccessResolver_1 = require("./edge/reachability/NodeAccessResolver");
119
+ Object.defineProperty(exports, "createPodOwnershipNodeAccessResolver", { enumerable: true, get: function () { return NodeAccessResolver_1.createPodOwnershipNodeAccessResolver; } });
114
120
  const EdgeNodeAgent_1 = require("./edge/EdgeNodeAgent");
115
121
  Object.defineProperty(exports, "EdgeNodeAgent", { enumerable: true, get: function () { return EdgeNodeAgent_1.EdgeNodeAgent; } });
116
122
  const EdgeNodeAgentInitializer_1 = require("./edge/EdgeNodeAgentInitializer");
package/dist/main.js CHANGED
@@ -213,6 +213,11 @@ async function startRuntime(options) {
213
213
  (0, runtime_1.validateBaseUrl)({ baseUrl, mainPort, explicit: explicitBaseUrl !== undefined });
214
214
  const cssPort = await (0, runtime_1.getFreePortForWildcard)(mainPort + 1);
215
215
  const apiPort = await (0, runtime_1.getFreePortForWildcard)(cssPort + 1);
216
+ // Remote forwarding (managed tunnels, P2P data plane) terminates on this machine, so
217
+ // its origin is a dedicated ingress port instead of the gateway port: the Gateway
218
+ // never treats requests accepted there as local. It is an internal loopback detail, so
219
+ // the OS assigns the port instead of us claiming a neighbour of the planned ports.
220
+ const ingressPort = await (0, runtime_1.getEphemeralLoopbackPort)();
216
221
  const runtimeRoot = path_1.default.join(process.cwd(), '.xpod/runtime/legacy-css');
217
222
  const rdfIndexPath = process.env.CSS_RDF_INDEX_PATH || (0, database_url_1.resolveDefaultRdfIndexPath)({
218
223
  sparqlEndpoint: process.env.CSS_SPARQL_ENDPOINT ?? process.env.SPARQL_ENDPOINT,
@@ -268,6 +273,7 @@ async function startRuntime(options) {
268
273
  apiPort,
269
274
  mainPort,
270
275
  cssPort,
276
+ ingressPort,
271
277
  baseUrl,
272
278
  rdfIndexPath,
273
279
  authMode,
@@ -296,6 +302,7 @@ async function startRuntime(options) {
296
302
  exitOnStop: true,
297
303
  baseUrl,
298
304
  internalAdminAuthSecret: gatewayAdminProxyAuthSecret,
305
+ ingressPort,
299
306
  });
300
307
  proxy.setTargets({
301
308
  css: `http://localhost:${cssPort}`,