@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
@@ -21,7 +21,22 @@ export declare class GatewayProxy {
21
21
  private readonly nativeUpgradeRelay?;
22
22
  /** Sockets created by `upgrade` events, dropped on shutdown. */
23
23
  private readonly upgradeSockets;
24
+ /**
25
+ * Loopback-only listener used as the origin of everything that forwards remote
26
+ * traffic to this Gateway (managed tunnels, P2P data plane). Requests accepted
27
+ * there are never treated as local, so a forwarded request cannot inherit the
28
+ * trust that a real local client has.
29
+ */
30
+ private readonly ingressPort?;
31
+ private ingressServer?;
24
32
  constructor(port: number | undefined, supervisor: Supervisor, bindHost?: string, options?: GatewayProxyOptions);
33
+ /**
34
+ * Builds one HTTP listener plus its WebSocket routing.
35
+ *
36
+ * `untrustedIngress` marks the listener that tunnels and the P2P data plane
37
+ * connect to; see `ingressPort`.
38
+ */
39
+ private createListener;
25
40
  /**
26
41
  * Upgraded sockets outlive the HTTP request that created them; they are
27
42
  * tracked so shutdown can drop them instead of waiting for a long lived
@@ -52,6 +67,7 @@ export declare class GatewayProxy {
52
67
  * (oven-sh/bun#28396), so waiting forever would block gateway restarts.
53
68
  */
54
69
  private closeServer;
70
+ private ingressListenEndpoint;
55
71
  private handleRequest;
56
72
  private isApiWebProductPath;
57
73
  private shouldRouteToApi;
@@ -102,4 +118,10 @@ export interface GatewayProxyOptions {
102
118
  * client socket at all.
103
119
  */
104
120
  nativeUpgradeRelay?: boolean;
121
+ /**
122
+ * Port for the loopback-only ingress listener that remote forwarding paths
123
+ * (managed tunnels, P2P data plane) use as their origin. Omit it when the
124
+ * Gateway has no remote ingress.
125
+ */
126
+ ingressPort?: number;
105
127
  }
@@ -58,6 +58,7 @@ class GatewayProxy {
58
58
  this.baseUrl = options.baseUrl;
59
59
  this.internalAdminAuthSecret = options.internalAdminAuthSecret;
60
60
  this.clientRemoteAddressResolver = options.clientRemoteAddressResolver;
61
+ this.ingressPort = options.ingressPort;
61
62
  this.proxy = http_proxy_1.default.createProxyServer({
62
63
  xfwd: true,
63
64
  });
@@ -87,14 +88,26 @@ class GatewayProxy {
87
88
  outgoing.end(rewritten.body);
88
89
  });
89
90
  });
90
- this.server = http_1.default.createServer(this.handleRequest.bind(this));
91
+ this.server = this.createListener(false);
92
+ if (this.ingressPort !== undefined) {
93
+ this.ingressServer = this.createListener(true);
94
+ }
91
95
  if (options.nativeUpgradeRelay ?? isBunRuntime()) {
92
96
  this.nativeUpgradeRelay = new BunNativeUpgradeRelay_1.BunNativeUpgradeRelay({
93
97
  logger: this.logger,
94
98
  fallback: (req, socket, head, target) => this.relayUpgradeWithHttpProxy(req, socket, head, target),
95
99
  });
96
100
  }
97
- this.server.on('upgrade', (req, socket, head) => {
101
+ }
102
+ /**
103
+ * Builds one HTTP listener plus its WebSocket routing.
104
+ *
105
+ * `untrustedIngress` marks the listener that tunnels and the P2P data plane
106
+ * connect to; see `ingressPort`.
107
+ */
108
+ createListener(untrustedIngress) {
109
+ const server = http_1.default.createServer((req, res) => this.handleRequest(req, res, untrustedIngress));
110
+ server.on('upgrade', (req, socket, head) => {
98
111
  this.trackUpgradeSocket(socket);
99
112
  const target = this.resolveUpgradeTarget(req.url ?? '/');
100
113
  if (!target) {
@@ -107,6 +120,7 @@ class GatewayProxy {
107
120
  }
108
121
  this.relayUpgradeWithHttpProxy(req, socket, head, target);
109
122
  });
123
+ return server;
110
124
  }
111
125
  /**
112
126
  * Upgraded sockets outlive the HTTP request that created them; they are
@@ -143,6 +157,10 @@ class GatewayProxy {
143
157
  async start() {
144
158
  await this.runtimeHost.listen(this.server, this.listenEndpoint);
145
159
  this.logger.info(`Listening on ${this.runtimeHost.formatListenEndpoint(this.listenEndpoint)}`);
160
+ if (this.ingressServer) {
161
+ await this.runtimeHost.listen(this.ingressServer, this.ingressListenEndpoint());
162
+ this.logger.info(`Ingress listener on 127.0.0.1:${this.ingressPort} (never local)`);
163
+ }
146
164
  }
147
165
  async stop() {
148
166
  this.nativeUpgradeRelay?.close();
@@ -153,7 +171,10 @@ class GatewayProxy {
153
171
  }
154
172
  this.upgradeSockets.clear();
155
173
  this.proxy.close();
156
- await this.closeServer();
174
+ await this.closeServer(this.server, this.listenEndpoint);
175
+ if (this.ingressServer) {
176
+ await this.closeServer(this.ingressServer, this.ingressListenEndpoint());
177
+ }
157
178
  }
158
179
  /**
159
180
  * Closes the listener with a bounded wait.
@@ -164,8 +185,8 @@ class GatewayProxy {
164
185
  * back once a WebSocket was closed from the server side
165
186
  * (oven-sh/bun#28396), so waiting forever would block gateway restarts.
166
187
  */
167
- async closeServer() {
168
- const closing = this.runtimeHost.close(this.server, this.listenEndpoint);
188
+ async closeServer(server, endpoint) {
189
+ const closing = this.runtimeHost.close(server, endpoint);
169
190
  let timer;
170
191
  const timedOut = await Promise.race([
171
192
  closing.then(() => false),
@@ -182,7 +203,10 @@ class GatewayProxy {
182
203
  void closing.catch(() => undefined);
183
204
  }
184
205
  }
185
- handleRequest(req, res) {
206
+ ingressListenEndpoint() {
207
+ return this.runtimeHost.createListenEndpoint({ port: this.ingressPort, host: '127.0.0.1' });
208
+ }
209
+ handleRequest(req, res, untrustedIngress = false) {
186
210
  const url = req.url ?? '/';
187
211
  // Route matching must ignore the query string: OIDC callbacks and other
188
212
  // product URLs arrive as `/ai-connections?code=...`, and exact-path
@@ -190,7 +214,10 @@ class GatewayProxy {
190
214
  const pathname = url.split('?')[0];
191
215
  const origin = req.headers.origin;
192
216
  const originalRemoteAddress = this.clientRemoteAddressResolver?.(req) ?? req.socket.remoteAddress;
193
- const originalClientLoopback = (0, GatewayAdminProxyAuth_1.isLoopbackRemoteAddress)(originalRemoteAddress);
217
+ // A loopback peer address only proves the connection came from this machine. Managed
218
+ // tunnels and the P2P data plane terminate here too, so anything that arrived through
219
+ // a remote forwarding path is never local, whatever its peer address or headers say.
220
+ const originalClientLoopback = !untrustedIngress && (0, GatewayAdminProxyAuth_1.isLoopbackRemoteAddress)(originalRemoteAddress);
194
221
  const internalPodProxyHeaders = this.verifiedInternalPodProxyHeaders(req, originalClientLoopback);
195
222
  (0, GatewayAdminProxyAuth_1.stripGatewayAdminProxyHeaders)(req.headers);
196
223
  if (internalPodProxyHeaders) {
@@ -28,6 +28,17 @@ export interface RuntimeBootstrapState {
28
28
  export declare function cssAuthModeConfigImports(authMode: AuthMode): string[];
29
29
  export declare function resolveRuntimeBootstrap(id: string, options: XpodRuntimeOptions, host: RuntimeHost, platform?: RuntimePlatform): Promise<RuntimeBootstrapState>;
30
30
  export declare function buildRuntimeEnv(state: RuntimeBootstrapState, options: XpodRuntimeOptions, envFromFile?: Record<string, string | undefined>): Record<string, string | undefined>;
31
+ /**
32
+ * Local endpoints the edge agent uses when it serves P2P peer traffic.
33
+ *
34
+ * `targetBaseUrl` is where forwarded peer requests are sent: the ingress listener,
35
+ * which the Gateway never treats as local. `lanBaseUrl` stays on the gateway
36
+ * listener because other devices on the LAN must be able to reach it.
37
+ */
38
+ export declare function resolveP2PLocalBaseUrls(state: RuntimeBootstrapState): {
39
+ targetBaseUrl?: string;
40
+ lanBaseUrl?: string;
41
+ };
31
42
  export declare function buildRuntimeShorthand(runtimeEnv: Record<string, string | undefined>, options: XpodRuntimeOptions, state: RuntimeBootstrapState, baseEnv?: Record<string, string | undefined>): Record<string, string | number | boolean>;
32
43
  export declare function createCssRuntimeConfig(state: RuntimeBootstrapState, _open?: boolean, platform?: Pick<RuntimePlatform, 'dirname' | 'ensureDir' | 'joinPath' | 'readTextFile' | 'writeTextFile'>): string;
33
44
  export declare function initRuntimeLogger(level: string, platform?: Pick<RuntimePlatform, 'cwd' | 'joinPath'>): void;
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.cssAuthModeConfigImports = cssAuthModeConfigImports;
7
7
  exports.resolveRuntimeBootstrap = resolveRuntimeBootstrap;
8
8
  exports.buildRuntimeEnv = buildRuntimeEnv;
9
+ exports.resolveP2PLocalBaseUrls = resolveP2PLocalBaseUrls;
9
10
  exports.buildRuntimeShorthand = buildRuntimeShorthand;
10
11
  exports.createCssRuntimeConfig = createCssRuntimeConfig;
11
12
  exports.initRuntimeLogger = initRuntimeLogger;
@@ -204,6 +205,7 @@ function buildRuntimeEnv(state, options, envFromFile = {}) {
204
205
  API_HOST: state.bindHost,
205
206
  API_SOCKET_PATH: state.sockets.api,
206
207
  XPOD_MAIN_PORT: state.ports.gateway !== undefined ? String(state.ports.gateway) : undefined,
208
+ XPOD_GATEWAY_INGRESS_PORT: state.ports.ingress !== undefined ? String(state.ports.ingress) : undefined,
207
209
  XPOD_GATEWAY_ADMIN_PROXY_AUTH_SECRET: state.gatewayAdminProxyAuthSecret,
208
210
  // Auto-provision may write these during API startup. Include them even when
209
211
  // undefined so RuntimeEnvironmentSession can restore/clear them afterwards.
@@ -222,11 +224,28 @@ function buildRuntimeEnv(state, options, envFromFile = {}) {
222
224
  };
223
225
  return (0, AuthMode_1.applyAuthModeEnv)(runtimeEnv, state.cssAuthMode);
224
226
  }
227
+ /**
228
+ * Local endpoints the edge agent uses when it serves P2P peer traffic.
229
+ *
230
+ * `targetBaseUrl` is where forwarded peer requests are sent: the ingress listener,
231
+ * which the Gateway never treats as local. `lanBaseUrl` stays on the gateway
232
+ * listener because other devices on the LAN must be able to reach it.
233
+ */
234
+ function resolveP2PLocalBaseUrls(state) {
235
+ if (state.transport !== 'port' || state.ports.gateway === undefined) {
236
+ return {};
237
+ }
238
+ return {
239
+ targetBaseUrl: state.ports.ingress === undefined ? undefined : `http://127.0.0.1:${state.ports.ingress}/`,
240
+ lanBaseUrl: `http://127.0.0.1:${state.ports.gateway}/`,
241
+ };
242
+ }
225
243
  function buildRuntimeShorthand(runtimeEnv, options, state, baseEnv = NodeRuntimePlatform_1.nodeRuntimePlatform.baseEnv) {
226
244
  const envValue = (key) => runtimeEnv[key] ?? baseEnv[key];
227
245
  const externalOidcIssuer = (0, oidc_issuer_1.resolveExternalOidcIssuer)({
228
246
  SOLID_OIDC_ISSUER: envValue('SOLID_OIDC_ISSUER'),
229
247
  });
248
+ const p2pLocalBaseUrls = resolveP2PLocalBaseUrls(state);
230
249
  return {
231
250
  ...withDefinedEntries([
232
251
  ['baseStorageDomain', envValue('CSS_BASE_STORAGE_DOMAIN')],
@@ -249,7 +268,8 @@ function buildRuntimeShorthand(runtimeEnv, options, state, baseEnv = NodeRuntime
249
268
  ['nodeId', envValue('XPOD_NODE_ID')],
250
269
  ['nodeToken', envValue('XPOD_NODE_TOKEN')],
251
270
  ['p2pEnabled', envValue('XPOD_P2P_ENABLED')],
252
- ['p2pTargetBaseUrl', envValue('XPOD_P2P_TARGET_BASE_URL')],
271
+ ['p2pTargetBaseUrl', envValue('XPOD_P2P_TARGET_BASE_URL') ?? p2pLocalBaseUrls.targetBaseUrl],
272
+ ['p2pLanBaseUrl', envValue('XPOD_P2P_LAN_BASE_URL') ?? p2pLocalBaseUrls.lanBaseUrl],
253
273
  ['p2pLabel', envValue('XPOD_P2P_LABEL')],
254
274
  ['p2pAcceptIntervalMs', envValue('XPOD_P2P_ACCEPT_INTERVAL_MS')],
255
275
  ['p2pConnectTimeoutMs', envValue('XPOD_P2P_CONNECT_TIMEOUT_MS')],
@@ -30,6 +30,7 @@ export declare function buildApiChildEnv(options: {
30
30
  apiPort: number;
31
31
  mainPort: number;
32
32
  cssPort: number;
33
+ ingressPort?: number;
33
34
  baseUrl: string;
34
35
  rdfIndexPath?: string;
35
36
  authMode?: AuthMode | string;
@@ -271,6 +271,7 @@ function buildApiChildEnv(options) {
271
271
  ...(options.externalOidcIssuer ? { oidcIssuer: options.externalOidcIssuer } : {}),
272
272
  API_PORT: options.apiPort.toString(),
273
273
  XPOD_MAIN_PORT: options.mainPort.toString(),
274
+ ...(options.ingressPort !== undefined ? { XPOD_GATEWAY_INGRESS_PORT: options.ingressPort.toString() } : {}),
274
275
  CSS_PORT: options.cssPort.toString(),
275
276
  CSS_BASE_URL: baseUrl,
276
277
  ...(options.gatewayAdminProxyAuthSecret ? { XPOD_GATEWAY_ADMIN_PROXY_AUTH_SECRET: options.gatewayAdminProxyAuthSecret } : {}),
@@ -23,7 +23,10 @@ class NodeRuntimeHost {
23
23
  const gateway = options.gatewayPort ?? await (0, port_finder_1.getFreePort)(options.basePort ?? 5600);
24
24
  const css = options.cssPort ?? await (0, port_finder_1.getFreePort)(gateway + 1);
25
25
  const api = options.apiPort ?? await (0, port_finder_1.getFreePort)(css + 1);
26
- return { gateway, css, api };
26
+ // The ingress listener is an internal detail of this runtime, so it takes an
27
+ // OS-assigned port instead of claiming the neighbour of a planned service port.
28
+ const ingress = options.ingressPort ?? await (0, port_finder_1.getEphemeralLoopbackPort)();
29
+ return { gateway, css, api, ingress };
27
30
  }
28
31
  createListenEndpoint(options) {
29
32
  if (options.socketPath) {
@@ -24,12 +24,18 @@ export interface RuntimePortAllocationOptions {
24
24
  gatewayPort?: number;
25
25
  cssPort?: number;
26
26
  apiPort?: number;
27
+ ingressPort?: number;
27
28
  basePort?: number;
28
29
  }
29
30
  export interface RuntimePorts {
30
31
  gateway: number;
31
32
  css: number;
32
33
  api: number;
34
+ /**
35
+ * Loopback-only listener that remote forwarding paths (managed tunnels, P2P
36
+ * data plane) use as their origin, so their requests never count as local.
37
+ */
38
+ ingress: number;
33
39
  }
34
40
  export interface RuntimeHost {
35
41
  readonly name: string;
@@ -10,7 +10,7 @@ export { createOpenAuthContext, registerManagedRuntimeServices, startApiRuntime,
10
10
  export type { RuntimeServices } from './lifecycle';
11
11
  export { GatewayProxy } from './Proxy';
12
12
  export { createGatewayAdminProxyAuthSecret } from './GatewayAdminProxyAuth';
13
- export { getFreePort, getFreePortForWildcard } from './port-finder';
13
+ export { getEphemeralLoopbackPort, getFreePort, getFreePortForWildcard, readPortFile, requireFreePortForWildcard, resolveStableLoopbackPort } from './port-finder';
14
14
  export { ensureTrailingSlash, INVALID_CONFIGURATION_PREFIX, validateBaseUrl } from './base-url';
15
15
  export type { ValidateBaseUrlOptions } from './base-url';
16
16
  export { applyEnv, loadEnvFile } from './env-utils';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.startXpodRuntime = exports.nodeGatewayRuntimeRunner = exports.NodeGatewayRuntimeRunner = exports.nodeApiRuntimeRunner = exports.NodeApiRuntimeRunner = exports.communitySolidServerCssRunner = exports.CommunitySolidServerCssRunner = exports.registerSocketOriginShims = exports.registerSocketFetchOrigin = exports.nodeRuntimePlatform = exports.NodeRuntimePlatform = exports.nodeRuntimeHost = exports.NodeRuntimeHost = exports.resolveXpodEnvPath = exports.defaultXpodEnvPath = exports.loadEnvFile = exports.applyEnv = exports.validateBaseUrl = exports.INVALID_CONFIGURATION_PREFIX = exports.ensureTrailingSlash = exports.getFreePortForWildcard = exports.getFreePort = exports.createGatewayAdminProxyAuthSecret = exports.GatewayProxy = exports.stopRuntimeServices = exports.startGatewayRuntime = exports.startCssRuntime = exports.startApiRuntime = exports.registerManagedRuntimeServices = exports.createOpenAuthContext = exports.createRuntimeEnvironmentSession = exports.nodeRuntimeDriver = exports.NodeRuntimeDriver = exports.resolveRuntimeBootstrap = exports.initRuntimeLogger = exports.createCssRuntimeConfig = exports.buildRuntimeShorthand = exports.buildRuntimeEnv = exports.ensureBunUndiciCompat = exports.findPackageRoot = exports.PACKAGE_ROOT = void 0;
3
+ exports.startXpodRuntime = exports.nodeGatewayRuntimeRunner = exports.NodeGatewayRuntimeRunner = exports.nodeApiRuntimeRunner = exports.NodeApiRuntimeRunner = exports.communitySolidServerCssRunner = exports.CommunitySolidServerCssRunner = exports.registerSocketOriginShims = exports.registerSocketFetchOrigin = exports.nodeRuntimePlatform = exports.NodeRuntimePlatform = exports.nodeRuntimeHost = exports.NodeRuntimeHost = exports.resolveXpodEnvPath = exports.defaultXpodEnvPath = exports.loadEnvFile = exports.applyEnv = exports.validateBaseUrl = exports.INVALID_CONFIGURATION_PREFIX = exports.ensureTrailingSlash = exports.resolveStableLoopbackPort = exports.requireFreePortForWildcard = exports.readPortFile = exports.getFreePortForWildcard = exports.getFreePort = exports.getEphemeralLoopbackPort = exports.createGatewayAdminProxyAuthSecret = exports.GatewayProxy = exports.stopRuntimeServices = exports.startGatewayRuntime = exports.startCssRuntime = exports.startApiRuntime = exports.registerManagedRuntimeServices = exports.createOpenAuthContext = exports.createRuntimeEnvironmentSession = exports.nodeRuntimeDriver = exports.NodeRuntimeDriver = exports.resolveRuntimeBootstrap = exports.initRuntimeLogger = exports.createCssRuntimeConfig = exports.buildRuntimeShorthand = exports.buildRuntimeEnv = exports.ensureBunUndiciCompat = exports.findPackageRoot = exports.PACKAGE_ROOT = void 0;
4
4
  require("./configure-drizzle-solid");
5
5
  var package_root_1 = require("./package-root");
6
6
  Object.defineProperty(exports, "PACKAGE_ROOT", { enumerable: true, get: function () { return package_root_1.PACKAGE_ROOT; } });
@@ -30,8 +30,12 @@ Object.defineProperty(exports, "GatewayProxy", { enumerable: true, get: function
30
30
  var GatewayAdminProxyAuth_1 = require("./GatewayAdminProxyAuth");
31
31
  Object.defineProperty(exports, "createGatewayAdminProxyAuthSecret", { enumerable: true, get: function () { return GatewayAdminProxyAuth_1.createGatewayAdminProxyAuthSecret; } });
32
32
  var port_finder_1 = require("./port-finder");
33
+ Object.defineProperty(exports, "getEphemeralLoopbackPort", { enumerable: true, get: function () { return port_finder_1.getEphemeralLoopbackPort; } });
33
34
  Object.defineProperty(exports, "getFreePort", { enumerable: true, get: function () { return port_finder_1.getFreePort; } });
34
35
  Object.defineProperty(exports, "getFreePortForWildcard", { enumerable: true, get: function () { return port_finder_1.getFreePortForWildcard; } });
36
+ Object.defineProperty(exports, "readPortFile", { enumerable: true, get: function () { return port_finder_1.readPortFile; } });
37
+ Object.defineProperty(exports, "requireFreePortForWildcard", { enumerable: true, get: function () { return port_finder_1.requireFreePortForWildcard; } });
38
+ Object.defineProperty(exports, "resolveStableLoopbackPort", { enumerable: true, get: function () { return port_finder_1.resolveStableLoopbackPort; } });
35
39
  var base_url_1 = require("./base-url");
36
40
  Object.defineProperty(exports, "ensureTrailingSlash", { enumerable: true, get: function () { return base_url_1.ensureTrailingSlash; } });
37
41
  Object.defineProperty(exports, "INVALID_CONFIGURATION_PREFIX", { enumerable: true, get: function () { return base_url_1.INVALID_CONFIGURATION_PREFIX; } });
@@ -108,6 +108,7 @@ async function startGatewayRuntime({ state, host, supervisor, shutdownHandler, g
108
108
  supervisor,
109
109
  internalAdminAuthSecret: state.gatewayAdminProxyAuthSecret,
110
110
  clientRemoteAddressResolver,
111
+ ingressPort: state.ports.ingress,
111
112
  targets: {
112
113
  css: state.transport === 'socket' ? { socketPath: state.sockets.css } : { url: `http://127.0.0.1:${state.ports.css}` },
113
114
  api: state.transport === 'socket' ? { socketPath: state.sockets.api } : { url: `http://127.0.0.1:${state.ports.api}` },
@@ -1,7 +1,37 @@
1
1
  export declare function getFreePort(basePort: number, host?: string, timeoutMs?: number): Promise<number>;
2
+ /**
3
+ * Loopback port handed out by the OS for a listener that must not collide with ports the
4
+ * embedding process plans for other services.
5
+ *
6
+ * Probing next to the ports this runtime already owns is not safe: a host that allocates
7
+ * `gateway + 10`/`gateway + 11` (the full integration matrix does) has already reserved
8
+ * the neighbour of our own `api` port for another runtime, and binding it steals that
9
+ * runtime's service.
10
+ */
11
+ export declare function getEphemeralLoopbackPort(): Promise<number>;
12
+ /**
13
+ * The ingress port this deployment should keep using.
14
+ *
15
+ * Remote tunnels forward to a port the operator typed into a provider console, so an
16
+ * OS-assigned port would invalidate that copy on every restart. The port is remembered in
17
+ * the runtime state directory; if something else took it meanwhile, a new one is chosen and
18
+ * persisted — the caller reports the change so the stale console value can be corrected.
19
+ */
20
+ export declare function resolveStableLoopbackPort(stateFile: string): Promise<{
21
+ port: number;
22
+ changed: boolean;
23
+ }>;
24
+ export declare function readPortFile(stateFile: string): number | undefined;
2
25
  /**
3
26
  * Allocates a port for child services that bind wildcard addresses.
4
27
  * CSS may bind `::` while the API binds `0.0.0.0`, so probing only localhost
5
28
  * can miss an occupied port on the other address family.
6
29
  */
30
+ /**
31
+ * Takes exactly this port or fails.
32
+ *
33
+ * A port that a tunnel console forwards to cannot be substituted: `getFreePortForWildcard`
34
+ * scans upward, which would leave the runtime listening somewhere the tunnel never reaches.
35
+ */
36
+ export declare function requireFreePortForWildcard(port: number, timeoutMs?: number): Promise<number>;
7
37
  export declare function getFreePortForWildcard(basePort: number, timeoutMs?: number): Promise<number>;
@@ -4,9 +4,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.getFreePort = getFreePort;
7
+ exports.getEphemeralLoopbackPort = getEphemeralLoopbackPort;
8
+ exports.resolveStableLoopbackPort = resolveStableLoopbackPort;
9
+ exports.readPortFile = readPortFile;
10
+ exports.requireFreePortForWildcard = requireFreePortForWildcard;
7
11
  exports.getFreePortForWildcard = getFreePortForWildcard;
8
12
  const node_net_1 = __importDefault(require("node:net"));
9
13
  const node_os_1 = __importDefault(require("node:os"));
14
+ const node_fs_1 = require("node:fs");
15
+ const node_path_1 = require("node:path");
10
16
  const HIGHEST_PORT = 65_535;
11
17
  const PORT_PROBE_TIMEOUT_MS = 1_000;
12
18
  const RETRYABLE_PORT_ERRORS = new Set([
@@ -105,6 +111,65 @@ async function getFreePort(basePort, host = '127.0.0.1', timeoutMs = PORT_PROBE_
105
111
  }
106
112
  throw new Error(`No open port available from ${host}:${basePort} to ${host}:${HIGHEST_PORT}`);
107
113
  }
114
+ /**
115
+ * Loopback port handed out by the OS for a listener that must not collide with ports the
116
+ * embedding process plans for other services.
117
+ *
118
+ * Probing next to the ports this runtime already owns is not safe: a host that allocates
119
+ * `gateway + 10`/`gateway + 11` (the full integration matrix does) has already reserved
120
+ * the neighbour of our own `api` port for another runtime, and binding it steals that
121
+ * runtime's service.
122
+ */
123
+ async function getEphemeralLoopbackPort() {
124
+ return await new Promise((resolve, reject) => {
125
+ const server = node_net_1.default.createServer();
126
+ server.once('error', reject);
127
+ server.listen(0, '127.0.0.1', () => {
128
+ const address = server.address();
129
+ const port = typeof address === 'object' && address ? address.port : 0;
130
+ server.close((error) => {
131
+ if (error) {
132
+ reject(error);
133
+ return;
134
+ }
135
+ resolve(port);
136
+ });
137
+ });
138
+ });
139
+ }
140
+ /**
141
+ * The ingress port this deployment should keep using.
142
+ *
143
+ * Remote tunnels forward to a port the operator typed into a provider console, so an
144
+ * OS-assigned port would invalidate that copy on every restart. The port is remembered in
145
+ * the runtime state directory; if something else took it meanwhile, a new one is chosen and
146
+ * persisted — the caller reports the change so the stale console value can be corrected.
147
+ */
148
+ async function resolveStableLoopbackPort(stateFile) {
149
+ const remembered = readPortFile(stateFile);
150
+ if (remembered !== undefined && await canListen(remembered, '127.0.0.1')) {
151
+ return { port: remembered, changed: false };
152
+ }
153
+ const port = await getEphemeralLoopbackPort();
154
+ try {
155
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(stateFile), { recursive: true });
156
+ (0, node_fs_1.writeFileSync)(stateFile, `${port}\n`);
157
+ }
158
+ catch {
159
+ // A deployment without a writable state directory still gets a working port; it just
160
+ // cannot promise the same one next time.
161
+ }
162
+ return { port, changed: remembered !== undefined };
163
+ }
164
+ function readPortFile(stateFile) {
165
+ try {
166
+ const port = Number.parseInt((0, node_fs_1.readFileSync)(stateFile, 'utf8').trim(), 10);
167
+ return Number.isInteger(port) && port > 0 && port <= 65535 ? port : undefined;
168
+ }
169
+ catch {
170
+ return undefined;
171
+ }
172
+ }
108
173
  function hasIpv6Address() {
109
174
  return Object.values(node_os_1.default.networkInterfaces()).some((entries) => entries?.some((entry) => entry.family === 'IPv6'));
110
175
  }
@@ -113,6 +178,24 @@ function hasIpv6Address() {
113
178
  * CSS may bind `::` while the API binds `0.0.0.0`, so probing only localhost
114
179
  * can miss an occupied port on the other address family.
115
180
  */
181
+ /**
182
+ * Takes exactly this port or fails.
183
+ *
184
+ * A port that a tunnel console forwards to cannot be substituted: `getFreePortForWildcard`
185
+ * scans upward, which would leave the runtime listening somewhere the tunnel never reaches.
186
+ */
187
+ async function requireFreePortForWildcard(port, timeoutMs = PORT_PROBE_TIMEOUT_MS) {
188
+ if (!Number.isInteger(port) || port <= 0 || port > 65535) {
189
+ throw new Error(`ingress port ${port} is not a valid port number`);
190
+ }
191
+ if (!await canListen(port, '0.0.0.0', timeoutMs)) {
192
+ throw new Error(`ingress port ${port} is already in use; free it or point the tunnel at another port`);
193
+ }
194
+ if (hasIpv6Address() && !await canListen(port, '::', timeoutMs)) {
195
+ throw new Error(`ingress port ${port} is already in use on IPv6; free it or point the tunnel at another port`);
196
+ }
197
+ return port;
198
+ }
116
199
  async function getFreePortForWildcard(basePort, timeoutMs = PORT_PROBE_TIMEOUT_MS) {
117
200
  const probeIpv6 = hasIpv6Address();
118
201
  for (let port = basePort; port <= HIGHEST_PORT; port++) {
@@ -15,6 +15,7 @@ class NodeGatewayRuntimeRunner {
15
15
  runtimeHost: options.runtimeHost,
16
16
  internalAdminAuthSecret: options.internalAdminAuthSecret,
17
17
  clientRemoteAddressResolver: options.clientRemoteAddressResolver,
18
+ ingressPort: options.ingressPort,
18
19
  });
19
20
  gateway.setTargets(options.targets);
20
21
  await gateway.start();
@@ -33,6 +33,11 @@ export interface GatewayRuntimeRunnerStartOptions {
33
33
  supervisor: Supervisor;
34
34
  internalAdminAuthSecret: string;
35
35
  clientRemoteAddressResolver?: (req: http.IncomingMessage) => string | undefined;
36
+ /**
37
+ * Loopback-only ingress listener for remote forwarding paths (tunnels, P2P).
38
+ * Port transport only; socket transport has no remote ingress.
39
+ */
40
+ ingressPort?: number;
36
41
  targets: {
37
42
  css: RuntimeConnectionTarget;
38
43
  api: RuntimeConnectionTarget;
@@ -10,6 +10,7 @@ export interface XpodRuntimePorts {
10
10
  gateway?: number;
11
11
  css?: number;
12
12
  api?: number;
13
+ ingress?: number;
13
14
  }
14
15
  export interface XpodRuntimeSockets {
15
16
  gateway?: string;
@@ -38,7 +38,7 @@ async function runLocalManagedClientP2PE2ESmoke(options = {}) {
38
38
  const { token: serviceToken } = await serviceTokenRepo.createToken({
39
39
  serviceType: 'cloud',
40
40
  serviceId: 'managed-client-smoke',
41
- scopes: ['reachability:read', 'reachability:write'],
41
+ scopes: ['network:read', 'network:write'],
42
42
  });
43
43
  const signalApi = await startSignalApi({
44
44
  nodeRepo,
@@ -10,6 +10,8 @@ export interface LocalTunnelProviderOptions {
10
10
  publicUrl?: string;
11
11
  /** cloudflared 可执行文件路径 (默认 'cloudflared') */
12
12
  cloudflaredPath?: string;
13
+ /** 等待代理发布的毫秒数;超时后状态为 failed,而不是"仍在连接" */
14
+ connectTimeoutMs?: number;
13
15
  }
14
16
  /**
15
17
  * Local Tunnel Provider
@@ -28,6 +30,7 @@ export declare class LocalTunnelProvider implements TunnelProvider {
28
30
  private readonly tunnelToken;
29
31
  private readonly publicUrl?;
30
32
  private readonly cloudflaredPath;
33
+ private readonly connectTimeoutMs;
31
34
  private process;
32
35
  private status;
33
36
  private currentConfig;
@@ -46,6 +49,8 @@ export declare class LocalTunnelProvider implements TunnelProvider {
46
49
  /**
47
50
  * 解析并打印 cloudflared 日志
48
51
  */
52
+ /** Set when the dashboard's origin port and this runtime's ingress port disagree. */
53
+ private originMismatch?;
49
54
  private logOutput;
50
55
  /**
51
56
  * 停止隧道
@@ -86,3 +91,13 @@ export declare class LocalTunnelProvider implements TunnelProvider {
86
91
  */
87
92
  isManagedByUs(): boolean;
88
93
  }
94
+ /**
95
+ * The origin a remotely-managed tunnel declares for its hostname.
96
+ *
97
+ * Both halves are reported: pointing the dashboard at `https://localhost:<port>` while this
98
+ * runtime serves plain HTTP there fails the TLS handshake, and the edge shows only a 502.
99
+ */
100
+ export declare function readDashboardOrigin(output: string): {
101
+ scheme: string;
102
+ port: number;
103
+ } | undefined;