@undefineds.co/xpod 0.4.13 → 0.4.15

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 (331) hide show
  1. package/config/cloud.json +0 -3
  2. package/config/components-ignore.json +11 -7
  3. package/config/local.json +0 -3
  4. package/config/xpod.base.json +0 -24
  5. package/dist/api/ai-config/AiConfigStore.d.ts +2 -2
  6. package/dist/api/ai-config/AiConfigStore.js +4 -1
  7. package/dist/api/ai-gateway/auth/CallerPodAccess.d.ts +2 -5
  8. package/dist/api/ai-gateway/auth/CallerPodAccess.js +3 -42
  9. package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.d.ts +2 -1
  10. package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.js +1 -1
  11. package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.d.ts +3 -8
  12. package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.js +9 -32
  13. package/dist/api/ai-gateway/connect/index.d.ts +3 -3
  14. package/dist/api/ai-gateway/connect/index.js +9 -38
  15. package/dist/api/ai-gateway/errors.js +2 -1
  16. package/dist/api/ai-gateway/models/PodModelSelectionRepository.d.ts +3 -3
  17. package/dist/api/ai-gateway/models/PodModelSelectionRepository.js +7 -11
  18. package/dist/api/ai-gateway/pod/HostedPodRoute.d.ts +27 -0
  19. package/dist/api/ai-gateway/pod/HostedPodRoute.js +47 -0
  20. package/dist/api/ai-gateway/pod/OwnerPodAccess.d.ts +79 -0
  21. package/dist/api/ai-gateway/pod/OwnerPodAccess.js +192 -0
  22. package/dist/api/ai-gateway/pod/PodInterfaceKeyStore.d.ts +52 -0
  23. package/dist/api/ai-gateway/pod/PodInterfaceKeyStore.js +61 -0
  24. package/dist/api/ai-gateway/providers/ProviderRegistry.js +1 -1
  25. package/dist/api/ai-gateway/quota/ProviderQuotaAdapter.d.ts +3 -3
  26. package/dist/api/ai-gateway/quota/ProviderQuotaAdapter.js +7 -32
  27. package/dist/api/ai-gateway/service-access/AiConnectionsServiceAccess.d.ts +1 -1
  28. package/dist/api/ai-gateway/service-access/AiConnectionsServiceAccess.js +1 -1
  29. package/dist/api/auth/ClientCredentialsAuthenticator.js +5 -28
  30. package/dist/api/auth/TokenEndpointRoute.d.ts +18 -0
  31. package/dist/api/auth/TokenEndpointRoute.js +36 -0
  32. package/dist/api/chatkit/pod-store.d.ts +4 -4
  33. package/dist/api/chatkit/pod-store.js +24 -95
  34. package/dist/api/container/common.js +36 -23
  35. package/dist/api/container/index.js +1 -0
  36. package/dist/api/container/local.js +88 -37
  37. package/dist/api/container/routes.js +41 -7
  38. package/dist/api/container/types.d.ts +4 -2
  39. package/dist/api/handlers/AdminHandler.d.ts +17 -1
  40. package/dist/api/handlers/AdminHandler.js +40 -3
  41. package/dist/api/handlers/AiGatewayManagementHandler.d.ts +6 -0
  42. package/dist/api/handlers/AiGatewayManagementHandler.js +17 -4
  43. package/dist/api/handlers/EdgeNodeSignalHandler.js +10 -2
  44. package/dist/api/handlers/NetworkSettingsHandler.d.ts +44 -5
  45. package/dist/api/handlers/NetworkSettingsHandler.js +46 -11
  46. package/dist/api/handlers/PodSettingsHandler.d.ts +3 -3
  47. package/dist/api/handlers/PodSettingsHandler.js +3 -3
  48. package/dist/api/handlers/ProvisionHandler.d.ts +35 -1
  49. package/dist/api/handlers/ProvisionHandler.js +53 -2
  50. package/dist/api/handlers/ReachabilityHandler.d.ts +6 -0
  51. package/dist/api/handlers/ReachabilityHandler.js +25 -6
  52. package/dist/api/network/NetworkEnvironmentConfigurationStore.d.ts +6 -1
  53. package/dist/api/network/NetworkEnvironmentConfigurationStore.js +72 -16
  54. package/dist/api/runtime.d.ts +18 -0
  55. package/dist/api/runtime.js +28 -2
  56. package/dist/api/service/AiClientConfigurationService.d.ts +1 -1
  57. package/dist/api/service/AiClientConfigurationService.js +1 -1
  58. package/dist/cli/commands/start.d.ts +26 -1
  59. package/dist/cli/commands/start.js +69 -5
  60. package/dist/components/components.jsonld +1 -1
  61. package/dist/components/context.jsonld +35 -42
  62. package/dist/edge/EdgeNodeAgent.d.ts +16 -0
  63. package/dist/edge/EdgeNodeAgent.js +56 -1
  64. package/dist/edge/EdgeNodeAgent.jsonld +8 -0
  65. package/dist/edge/EdgeNodeAgentInitializer.d.ts +2 -0
  66. package/dist/edge/EdgeNodeAgentInitializer.js +1 -0
  67. package/dist/edge/EdgeNodeAgentInitializer.jsonld +19 -0
  68. package/dist/edge/EdgeNodeDnsCoordinator.d.ts +11 -1
  69. package/dist/edge/EdgeNodeDnsCoordinator.js +12 -2
  70. package/dist/edge/EdgeNodeHealthProbeService.d.ts +15 -0
  71. package/dist/edge/EdgeNodeHealthProbeService.js +44 -12
  72. package/dist/edge/EdgeNodeHealthProbeService.jsonld +77 -0
  73. package/dist/edge/ProbeTargetGuard.d.ts +35 -0
  74. package/dist/edge/ProbeTargetGuard.js +142 -0
  75. package/dist/edge/reachability/NodeAccessResolver.d.ts +16 -0
  76. package/dist/edge/reachability/NodeAccessResolver.js +30 -0
  77. package/dist/edge/reachability/ReachabilitySessionService.js +4 -1
  78. package/dist/edge/reachability/RouteSetBuilder.d.ts +18 -1
  79. package/dist/edge/reachability/RouteSetBuilder.js +47 -0
  80. package/dist/edge/reachability/RouteSetBuilder.jsonld +29 -0
  81. package/dist/edge/reachability/types.d.ts +8 -2
  82. package/dist/http/SubgraphSparqlHttpHandler.d.ts +1 -25
  83. package/dist/http/SubgraphSparqlHttpHandler.js +0 -100
  84. package/dist/http/SubgraphSparqlHttpHandler.jsonld +0 -8
  85. package/dist/identity/drizzle/PodInterfaceKeyRepository.d.ts +33 -0
  86. package/dist/identity/drizzle/PodInterfaceKeyRepository.js +78 -0
  87. package/dist/identity/drizzle/db.d.ts +7 -0
  88. package/dist/identity/drizzle/db.js +30 -0
  89. package/dist/identity/drizzle/schema.pg.d.ts +9 -0
  90. package/dist/identity/drizzle/schema.pg.js +16 -1
  91. package/dist/identity/drizzle/schema.sqlite.d.ts +106 -0
  92. package/dist/identity/drizzle/schema.sqlite.js +16 -1
  93. package/dist/index.d.ts +3 -2
  94. package/dist/index.js +9 -5
  95. package/dist/main.js +7 -0
  96. package/dist/runtime/GatewayAdminProxyAuth.d.ts +1 -16
  97. package/dist/runtime/GatewayAdminProxyAuth.js +2 -71
  98. package/dist/runtime/Proxy.d.ts +32 -1
  99. package/dist/runtime/Proxy.js +125 -31
  100. package/dist/runtime/bootstrap.d.ts +21 -0
  101. package/dist/runtime/bootstrap.js +45 -1
  102. package/dist/runtime/css-process.d.ts +1 -0
  103. package/dist/runtime/css-process.js +1 -0
  104. package/dist/runtime/host/node/NodeRuntimeHost.js +6 -1
  105. package/dist/runtime/host/types.d.ts +6 -0
  106. package/dist/runtime/index.d.ts +1 -1
  107. package/dist/runtime/index.js +4 -1
  108. package/dist/runtime/js-runtime.js +10 -3
  109. package/dist/runtime/lifecycle.js +6 -4
  110. package/dist/runtime/port-finder.d.ts +26 -0
  111. package/dist/runtime/port-finder.js +64 -0
  112. package/dist/runtime/runner/node/NodeGatewayRuntimeRunner.js +1 -0
  113. package/dist/runtime/runner/types.d.ts +5 -0
  114. package/dist/runtime/runtime-types.d.ts +1 -0
  115. package/dist/test-utils/local-managed-client-p2p-e2e-smoke.js +1 -1
  116. package/dist/tunnel/AutoTunnelProvider.d.ts +56 -0
  117. package/dist/tunnel/AutoTunnelProvider.js +181 -0
  118. package/dist/tunnel/LocalTunnelProvider.d.ts +15 -0
  119. package/dist/tunnel/LocalTunnelProvider.js +87 -18
  120. package/dist/tunnel/LocalTunnelProvider.jsonld +27 -0
  121. package/dist/tunnel/NgrokTunnelProvider.d.ts +4 -0
  122. package/dist/tunnel/NgrokTunnelProvider.js +117 -43
  123. package/dist/tunnel/NgrokTunnelProvider.jsonld +4 -0
  124. package/dist/tunnel/SakuraFrpTunnelProvider.d.ts +65 -3
  125. package/dist/tunnel/SakuraFrpTunnelProvider.js +268 -25
  126. package/dist/tunnel/TunnelLifecycle.d.ts +14 -0
  127. package/dist/tunnel/TunnelLifecycle.js +34 -0
  128. package/dist/tunnel/TunnelProfiles.d.ts +33 -3
  129. package/dist/tunnel/TunnelProfiles.js +105 -78
  130. package/dist/tunnel/TunnelProvider.d.ts +15 -2
  131. package/dist/tunnel/TunnelProvider.jsonld +8 -0
  132. package/dist/tunnel/TunnelProviderCatalog.d.ts +62 -0
  133. package/dist/tunnel/TunnelProviderCatalog.js +130 -0
  134. package/dist/tunnel/index.d.ts +1 -0
  135. package/dist/tunnel/index.js +3 -1
  136. package/node_modules/@undefineds.co/ai-connections/dist/AiApiKeyPool.d.ts +1 -1
  137. package/node_modules/@undefineds.co/ai-connections/dist/AiApiKeyPool.js +1 -1
  138. package/node_modules/@undefineds.co/ai-connections/dist/AiAuthorizationActions.d.ts +1 -1
  139. package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.d.ts +1 -1
  140. package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.js +1 -1
  141. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectDialog.d.ts +1 -1
  142. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.d.ts +1 -1
  143. package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialPoolSection.d.ts +1 -1
  144. package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialRow.d.ts +1 -1
  145. package/node_modules/@undefineds.co/ai-connections/dist/AiCustomProviderDialog.d.ts +1 -1
  146. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeyRow.d.ts +1 -1
  147. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.d.ts +1 -1
  148. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayModelsSection.d.ts +1 -1
  149. package/node_modules/@undefineds.co/ai-connections/dist/AiOfferingDetails.d.ts +1 -1
  150. package/node_modules/@undefineds.co/ai-connections/dist/AiProviderCard.d.ts +1 -1
  151. package/node_modules/@undefineds.co/ai-connections/dist/AiQuotaCard.d.ts +1 -1
  152. package/node_modules/@undefineds.co/ai-connections/dist/AiSortableCredentialList.d.ts +1 -1
  153. package/node_modules/@undefineds.co/ai-connections/dist/authorization-methods.d.ts +1 -1
  154. package/node_modules/@undefineds.co/ai-connections/dist/collection-runtime.d.ts +1 -1
  155. package/node_modules/@undefineds.co/ai-connections/dist/collection-runtime.js +3 -3
  156. package/node_modules/@undefineds.co/ai-connections/dist/collections.d.ts +1 -1
  157. package/node_modules/@undefineds.co/ai-connections/dist/collections.js +3 -3
  158. package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/ai-connections-client.d.ts +1 -1
  159. package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/ai-connections-client.js +1 -1
  160. package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/index.cjs +8 -8
  161. package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/index.d.ts +1 -1
  162. package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/index.js +1 -1
  163. package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/provider-catalog.cjs +3 -3
  164. package/node_modules/@undefineds.co/ai-connections/dist/controller.d.ts +1 -1
  165. package/node_modules/@undefineds.co/ai-connections/dist/controller.js +1 -1
  166. package/node_modules/@undefineds.co/ai-connections/dist/credential-labels.d.ts +1 -1
  167. package/node_modules/@undefineds.co/ai-connections/dist/display-wording.d.ts +1 -1
  168. package/node_modules/@undefineds.co/ai-connections/dist/error-wording.d.ts +1 -1
  169. package/node_modules/@undefineds.co/ai-connections/dist/error-wording.js +8 -3
  170. package/node_modules/@undefineds.co/ai-connections/dist/gateway-endpoints.js +1 -1
  171. package/node_modules/@undefineds.co/ai-connections/dist/offering-endpoints.d.ts +1 -1
  172. package/node_modules/@undefineds.co/ai-connections/dist/offering-label.d.ts +1 -1
  173. package/node_modules/@undefineds.co/ai-connections/dist/provider-visuals.d.ts +1 -1
  174. package/node_modules/@undefineds.co/ai-connections/dist/service-access.js +1 -1
  175. package/node_modules/@undefineds.co/ai-connections/dist/useAiConnectDialog.d.ts +1 -1
  176. package/node_modules/@undefineds.co/ai-connections/package.json +31 -1
  177. package/node_modules/@undefineds.co/solid-sdk/dist/access-route.cjs +230 -0
  178. package/node_modules/@undefineds.co/solid-sdk/dist/access-route.d.ts +76 -0
  179. package/node_modules/@undefineds.co/solid-sdk/dist/access-route.js +115 -0
  180. package/node_modules/@undefineds.co/solid-sdk/dist/index.cjs +89 -0
  181. package/node_modules/@undefineds.co/solid-sdk/dist/index.d.ts +1 -0
  182. package/node_modules/@undefineds.co/solid-sdk/dist/index.js +1 -0
  183. package/node_modules/@undefineds.co/solid-sdk/package.json +6 -1
  184. package/package.json +5 -6
  185. package/static/app/assets/inrupt-smoke.js +23 -23
  186. package/static/app/assets/main.css +1 -1
  187. package/static/auth-callback/assets/{AiConfigContext-DlFyEWy9.js → AiConfigContext-Bx0HCAW5.js} +1 -1
  188. package/static/auth-callback/assets/{AiConfigPage-CkYk-SFW.js → AiConfigPage-ChQImMbm.js} +1 -1
  189. package/static/auth-callback/assets/{DocumentProcessingPanel-CqIr3JqN.js → DocumentProcessingPanel-D830H4SH.js} +1 -1
  190. package/static/auth-callback/assets/{IndexLifecyclePanel-C1GKV3Vx.js → IndexLifecyclePanel-CnlkjMF8.js} +1 -1
  191. package/static/auth-callback/assets/{IndexSubjectPanel-ro9lC6XW.js → IndexSubjectPanel-CdEfg_CO.js} +1 -1
  192. package/static/auth-callback/assets/{ModelAssignmentsPanel-DxNdyKRJ.js → ModelAssignmentsPanel-D-8A8dZx.js} +1 -1
  193. package/static/auth-callback/assets/{ModelsPage-BVtWSPBU.js → ModelsPage-Cim7cubp.js} +3 -3
  194. package/static/auth-callback/assets/NetworkPage-CfK3x-pb.js +2 -0
  195. package/static/auth-callback/assets/{PaneListHeader-ByKw8ada.js → PaneListHeader-Bf_kEd4U.js} +1 -1
  196. package/static/auth-callback/assets/{SearchIndexingPanel-CulBKcYT.js → SearchIndexingPanel-4kD4RBEQ.js} +1 -1
  197. package/static/auth-callback/assets/{StatusSubjectPanel-VOcfrt8o.js → StatusSubjectPanel-Bw9AiTSf.js} +1 -1
  198. package/static/auth-callback/assets/{StatusWorkspace-Jsz6hAdE.js → StatusWorkspace-C-301H-0.js} +1 -1
  199. package/static/auth-callback/assets/{SystemSettingsPage-BFNvGAle.js → SystemSettingsPage-BbWn-eG6.js} +1 -1
  200. package/static/auth-callback/assets/{SystemSettingsSubjectPanel-DFRdrSfK.js → SystemSettingsSubjectPanel-DA4wvNSm.js} +1 -1
  201. package/static/auth-callback/assets/{XpodAiConnectionsPodStore-C6KpvHVg.js → XpodAiConnectionsPodStore-CohdyLoX.js} +1 -1
  202. package/static/auth-callback/assets/{activity-DnTlb9iM.js → activity-CCsb9Oam.js} +1 -1
  203. package/static/auth-callback/assets/ai-connections-DexTPyfC.js +1 -0
  204. package/static/auth-callback/assets/{auth-callback-D2UkK5Xj.js → auth-callback-Ds-c62W3.js} +5 -5
  205. package/static/auth-callback/assets/auth-callback-rk080mvG.css +1 -0
  206. package/static/auth-callback/assets/{badge-D7IJuuTM.js → badge-CQm5OyzR.js} +1 -1
  207. package/static/auth-callback/assets/{collection-runtime-wT1n4GS2.js → collection-runtime-DlAuU5TW.js} +1 -1
  208. package/static/auth-callback/assets/{dialog-DickLu5z.js → dialog-CnGzg5Ff.js} +1 -1
  209. package/static/auth-callback/assets/{download-kn8WnRu3.js → download-DwMONJvm.js} +1 -1
  210. package/static/auth-callback/assets/{external-link-B6B8jfSn.js → external-link-Bu5AGqCO.js} +1 -1
  211. package/static/auth-callback/assets/{index-DHF97YLP.js → index-B0T-1YO8.js} +1 -1
  212. package/static/auth-callback/assets/{index-Dz83EEHD.js → index-C8QZf_4W.js} +1 -1
  213. package/static/auth-callback/assets/index-DwIlrIDG.js +4 -0
  214. package/static/auth-callback/assets/{index-browser-CSghinyi.js → index-browser-lRsMcP_7.js} +1 -1
  215. package/static/auth-callback/assets/{key-round-ChkOx3E1.js → key-round-BDMtU57P.js} +1 -1
  216. package/static/auth-callback/assets/{rotate-ccw-B3hE-nyd.js → rotate-ccw-CoKIGCsQ.js} +1 -1
  217. package/static/auth-callback/assets/{skeleton-kEqR7tpI.js → skeleton-CPoSWHDr.js} +1 -1
  218. package/static/auth-callback/assets/{waypoints-D6Jo-SZa.js → waypoints-BeYHxqHv.js} +1 -1
  219. package/static/auth-callback/assets/{workspace-layout-BHwT_cHd.js → workspace-layout-xA5YxiK3.js} +1 -1
  220. package/static/auth-callback/auth-callback.html +2 -2
  221. package/static/dashboard/assets/{AiConfigContext-BfC3v-x2.js → AiConfigContext-rWx4TyiH.js} +1 -1
  222. package/static/dashboard/assets/{AiConfigPage-QNS3u7Ff.js → AiConfigPage-StVJpDFT.js} +1 -1
  223. package/static/dashboard/assets/{DocumentProcessingPanel-Dr4XLeT4.js → DocumentProcessingPanel-DJ5yul2O.js} +1 -1
  224. package/static/dashboard/assets/{IndexLifecyclePanel-KtM_gpeO.js → IndexLifecyclePanel-CpjtgezK.js} +1 -1
  225. package/static/dashboard/assets/{IndexSubjectPanel-DLaiKdLc.js → IndexSubjectPanel-BVKcot1_.js} +1 -1
  226. package/static/dashboard/assets/{ModelAssignmentsPanel-Bk7TvQRq.js → ModelAssignmentsPanel-BxVgWZPc.js} +1 -1
  227. package/static/dashboard/assets/{ModelsPage-Cci3vlos.js → ModelsPage-CECBwmeO.js} +3 -3
  228. package/static/dashboard/assets/NetworkPage-zQgFscEW.js +2 -0
  229. package/static/dashboard/assets/{PaneListHeader-qHME_s08.js → PaneListHeader-DIPe8pS6.js} +1 -1
  230. package/static/dashboard/assets/{SearchIndexingPanel-HZPKj8H9.js → SearchIndexingPanel-lalFJ3c8.js} +1 -1
  231. package/static/dashboard/assets/{StatusSubjectPanel-ij7IpI8d.js → StatusSubjectPanel-CpY_KU-G.js} +1 -1
  232. package/static/dashboard/assets/{StatusWorkspace-Cp02JcaN.js → StatusWorkspace-BwWCii3A.js} +1 -1
  233. package/static/dashboard/assets/{SystemSettingsPage-BSeuvb8X.js → SystemSettingsPage-BKZxX-_n.js} +1 -1
  234. package/static/dashboard/assets/{SystemSettingsSubjectPanel-CP4_luGS.js → SystemSettingsSubjectPanel-BZrqb2C5.js} +1 -1
  235. package/static/dashboard/assets/{XpodAiConnectionsPodStore-urO6zaHL.js → XpodAiConnectionsPodStore-Bbpx9dTN.js} +1 -1
  236. package/static/dashboard/assets/{activity-DxjgQNvr.js → activity-BJ15TLVP.js} +1 -1
  237. package/static/dashboard/assets/ai-connections-GG6qkTJt.js +1 -0
  238. package/static/dashboard/assets/{badge-53qCrRbl.js → badge-BBX5FlaB.js} +1 -1
  239. package/static/dashboard/assets/{collection-runtime-BPAmHG46.js → collection-runtime-UBbHBzdf.js} +1 -1
  240. package/static/dashboard/assets/{dashboard-BcT2ByXw.js → dashboard-7Y6BHyV9.js} +62 -62
  241. package/static/dashboard/assets/dashboard-rk080mvG.css +1 -0
  242. package/static/dashboard/assets/{dialog-B28YtNhS.js → dialog-QrOJ-hB0.js} +1 -1
  243. package/static/dashboard/assets/{download-DkLNceJ4.js → download-DK9x-VOP.js} +1 -1
  244. package/static/dashboard/assets/{external-link-D3TXnlo3.js → external-link-Cnkn87mJ.js} +1 -1
  245. package/static/dashboard/assets/index-B1z84it5.js +4 -0
  246. package/static/dashboard/assets/{index-CIiBu9mr.js → index-DzjauX3N.js} +1 -1
  247. package/static/dashboard/assets/{index-CFIenkeK.js → index-cIa8_efI.js} +1 -1
  248. package/static/dashboard/assets/{key-round-B5ccp6nx.js → key-round-BoS6UqKz.js} +1 -1
  249. package/static/dashboard/assets/{rotate-ccw-DUpfkNnk.js → rotate-ccw-BeWV76i0.js} +1 -1
  250. package/static/dashboard/assets/{skeleton-BRe19fO0.js → skeleton-CypcJL07.js} +1 -1
  251. package/static/dashboard/assets/{waypoints-BKDMxEvu.js → waypoints-zHOOqfhi.js} +1 -1
  252. package/static/dashboard/assets/{workspace-layout-ZTF7C16h.js → workspace-layout-DZ9JuxnM.js} +1 -1
  253. package/static/dashboard/dashboard.html +2 -2
  254. package/static/settings/assets/{AiConfigContext-DsyWgu2i.js → AiConfigContext-D3b1l_Kw.js} +1 -1
  255. package/static/settings/assets/{AiConfigPage-CSCBckKo.js → AiConfigPage-DYKw-atP.js} +1 -1
  256. package/static/settings/assets/{DocumentProcessingPanel-w9yQDbBe.js → DocumentProcessingPanel-DguRfsIV.js} +1 -1
  257. package/static/settings/assets/{IndexLifecyclePanel-CUUXI8mP.js → IndexLifecyclePanel-B85qJJA4.js} +1 -1
  258. package/static/settings/assets/{IndexSubjectPanel-BypAU5TJ.js → IndexSubjectPanel-CsN7IxaV.js} +1 -1
  259. package/static/settings/assets/{ModelAssignmentsPanel-BetgXw1G.js → ModelAssignmentsPanel-DEp9byI6.js} +1 -1
  260. package/static/settings/assets/{ModelsPage-DZpTlTZ3.js → ModelsPage-CzTnPs_G.js} +3 -3
  261. package/static/settings/assets/NetworkPage-BDVnmUU0.js +2 -0
  262. package/static/settings/assets/{PaneListHeader-BGOqGec4.js → PaneListHeader-Cpe39N76.js} +1 -1
  263. package/static/settings/assets/{SearchIndexingPanel-DYAbpZ_9.js → SearchIndexingPanel-DA9w8lLL.js} +1 -1
  264. package/static/settings/assets/{StatusSubjectPanel-CFgzeQ8Q.js → StatusSubjectPanel-BU0Aq0CS.js} +1 -1
  265. package/static/settings/assets/{StatusWorkspace-4Z6g4Jvv.js → StatusWorkspace-D1AC1i5N.js} +1 -1
  266. package/static/settings/assets/{SystemSettingsPage-C1tlrgvI.js → SystemSettingsPage-ChKvOioO.js} +1 -1
  267. package/static/settings/assets/{SystemSettingsSubjectPanel-CcURI-1L.js → SystemSettingsSubjectPanel-DyTpOnD2.js} +1 -1
  268. package/static/settings/assets/{XpodAiConnectionsPodStore-owBQc5nY.js → XpodAiConnectionsPodStore-VU5Bsz1a.js} +1 -1
  269. package/static/settings/assets/{activity-CtBc9cNy.js → activity-DGpLfsQB.js} +1 -1
  270. package/static/settings/assets/ai-connections-DexTPyfC.js +1 -0
  271. package/static/settings/assets/{badge--r-FDIhU.js → badge-_hCrrWRP.js} +1 -1
  272. package/static/settings/assets/{collection-runtime-CnhPmwAM.js → collection-runtime-E40TZ8Cl.js} +1 -1
  273. package/static/settings/assets/{dialog-B7ZRsjN7.js → dialog-DTr2JkHn.js} +1 -1
  274. package/static/settings/assets/{download-DgQ1F8QR.js → download-B_D21DDX.js} +1 -1
  275. package/static/settings/assets/{external-link-Bz7NckNO.js → external-link-BATYaM13.js} +1 -1
  276. package/static/settings/assets/index-BAlAVi-J.js +4 -0
  277. package/static/settings/assets/{index-CkGda_Pg.js → index-Ckh4h9jj.js} +1 -1
  278. package/static/settings/assets/{index-Vv-8Vslg.js → index-DOiwLF4B.js} +1 -1
  279. package/static/settings/assets/{index-browser-Dq7omlpY.js → index-browser-DFFWN3Kr.js} +1 -1
  280. package/static/settings/assets/{key-round-CvuhloKV.js → key-round-ZTVU_1O1.js} +1 -1
  281. package/static/settings/assets/{rotate-ccw-DgFKDaz7.js → rotate-ccw-DDdw8PTU.js} +1 -1
  282. package/static/settings/assets/{settings-BvqY7K96.js → settings-CyLnISOv.js} +62 -62
  283. package/static/settings/assets/settings-rk080mvG.css +1 -0
  284. package/static/settings/assets/{skeleton-D3OeFDF6.js → skeleton-DEzA3hc2.js} +1 -1
  285. package/static/settings/assets/{waypoints-C4WbspTb.js → waypoints-BSdfNvEb.js} +1 -1
  286. package/static/settings/assets/{workspace-layout-B9H1Tqrk.js → workspace-layout-BOQnl_3d.js} +1 -1
  287. package/static/settings/settings.html +2 -2
  288. package/dist/api/ai-gateway/pod/HostedPodDataAccess.d.ts +0 -31
  289. package/dist/api/ai-gateway/pod/HostedPodDataAccess.js +0 -330
  290. package/dist/http/InternalPodDataHttpHandler.d.ts +0 -57
  291. package/dist/http/InternalPodDataHttpHandler.js +0 -551
  292. package/dist/http/InternalPodDataHttpHandler.jsonld +0 -243
  293. package/node_modules/@undefineds.co/ai-connections-core/package.json +0 -61
  294. package/static/auth-callback/assets/NetworkPage-cEvxRMAl.js +0 -2
  295. package/static/auth-callback/assets/ai-connections-C6yaE6WQ.js +0 -1
  296. package/static/auth-callback/assets/auth-callback-Cx9D_1qj.css +0 -1
  297. package/static/auth-callback/assets/index-Cu0EguPo.js +0 -4
  298. package/static/dashboard/assets/NetworkPage-Ot4G2dX5.js +0 -2
  299. package/static/dashboard/assets/ai-connections-CXp5gd1J.js +0 -1
  300. package/static/dashboard/assets/dashboard-Cx9D_1qj.css +0 -1
  301. package/static/dashboard/assets/index-Gp3cLolR.js +0 -4
  302. package/static/settings/assets/NetworkPage-BVkasFGM.js +0 -2
  303. package/static/settings/assets/ai-connections-C6yaE6WQ.js +0 -1
  304. package/static/settings/assets/index-BdXwm8nh.js +0 -4
  305. package/static/settings/assets/settings-Cx9D_1qj.css +0 -1
  306. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/normalize.d.ts +0 -0
  307. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/normalize.js +0 -0
  308. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/request.d.ts +0 -0
  309. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/request.js +0 -0
  310. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/types.d.ts +0 -0
  311. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/types.js +0 -0
  312. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/base-adapter.d.ts +0 -0
  313. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/base-adapter.js +0 -0
  314. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/codex.d.ts +0 -0
  315. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/codex.js +0 -0
  316. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/index.d.ts +0 -0
  317. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/index.js +0 -0
  318. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/json-env-adapter.d.ts +0 -0
  319. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/json-env-adapter.js +0 -0
  320. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/pi.d.ts +0 -0
  321. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/pi.js +0 -0
  322. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/transaction.d.ts +0 -0
  323. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/transaction.js +0 -0
  324. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/types.d.ts +0 -0
  325. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/types.js +0 -0
  326. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/credential-storage.d.ts +0 -0
  327. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/credential-storage.js +0 -0
  328. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/endpoint-urls.d.ts +0 -0
  329. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/endpoint-urls.js +0 -0
  330. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/provider-catalog.d.ts +0 -0
  331. /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/provider-catalog.js +0 -0
@@ -1111,48 +1111,6 @@
1111
1111
  }
1112
1112
  }
1113
1113
  },
1114
- "InternalPodDataHttpHandler": {
1115
- "@id": "undefineds:dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler",
1116
- "@prefix": true,
1117
- "@context": {
1118
- "options_resourceStore": {
1119
- "@id": "undefineds:dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler_options_resourceStore"
1120
- },
1121
- "options_gatewayAdminProxyAuthSecret": {
1122
- "@id": "undefineds:dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler_options_gatewayAdminProxyAuthSecret"
1123
- },
1124
- "options_patchBodyParser": {
1125
- "@id": "undefineds:dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler_options_patchBodyParser"
1126
- },
1127
- "options_sparqlHandler": {
1128
- "@id": "undefineds:dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler_options_sparqlHandler"
1129
- },
1130
- "options_baseUrl": {
1131
- "@id": "undefineds:dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler_options_baseUrl"
1132
- },
1133
- "options_basePath": {
1134
- "@id": "undefineds:dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler_options_basePath"
1135
- },
1136
- "resourceStore": {
1137
- "@id": "undefineds:dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler_options_resourceStore"
1138
- },
1139
- "gatewayAdminProxyAuthSecret": {
1140
- "@id": "undefineds:dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler_options_gatewayAdminProxyAuthSecret"
1141
- },
1142
- "patchBodyParser": {
1143
- "@id": "undefineds:dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler_options_patchBodyParser"
1144
- },
1145
- "sparqlHandler": {
1146
- "@id": "undefineds:dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler_options_sparqlHandler"
1147
- },
1148
- "baseUrl": {
1149
- "@id": "undefineds:dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler_options_baseUrl"
1150
- },
1151
- "basePath": {
1152
- "@id": "undefineds:dist/http/InternalPodDataHttpHandler.jsonld#InternalPodDataHttpHandler_options_basePath"
1153
- }
1154
- }
1155
- },
1156
1114
  "QuotaAdminHttpHandler": {
1157
1115
  "@id": "undefineds:dist/http/quota/QuotaAdminHttpHandler.jsonld#QuotaAdminHttpHandler",
1158
1116
  "@prefix": true,
@@ -1967,6 +1925,15 @@
1967
1925
  "options_locations": {
1968
1926
  "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService_options_locations"
1969
1927
  },
1928
+ "options_resolveAddresses": {
1929
+ "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService_options_resolveAddresses"
1930
+ },
1931
+ "options_headRequest": {
1932
+ "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService_options_headRequest"
1933
+ },
1934
+ "options_maxRedirects": {
1935
+ "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService_options_maxRedirects"
1936
+ },
1970
1937
  "repository": {
1971
1938
  "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService_options_repository"
1972
1939
  },
@@ -1981,6 +1948,15 @@
1981
1948
  },
1982
1949
  "locations": {
1983
1950
  "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService_options_locations"
1951
+ },
1952
+ "resolveAddresses": {
1953
+ "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService_options_resolveAddresses"
1954
+ },
1955
+ "headRequest": {
1956
+ "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService_options_headRequest"
1957
+ },
1958
+ "maxRedirects": {
1959
+ "@id": "undefineds:dist/edge/EdgeNodeHealthProbeService.jsonld#EdgeNodeHealthProbeService_options_maxRedirects"
1984
1960
  }
1985
1961
  }
1986
1962
  },
@@ -2029,6 +2005,9 @@
2029
2005
  "options_p2pTargetBaseUrl": {
2030
2006
  "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_p2pTargetBaseUrl"
2031
2007
  },
2008
+ "options_p2pLanBaseUrl": {
2009
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_p2pLanBaseUrl"
2010
+ },
2032
2011
  "options_p2pLabel": {
2033
2012
  "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_p2pLabel"
2034
2013
  },
@@ -2118,6 +2097,9 @@
2118
2097
  "p2pTargetBaseUrl": {
2119
2098
  "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_p2pTargetBaseUrl"
2120
2099
  },
2100
+ "p2pLanBaseUrl": {
2101
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_p2pLanBaseUrl"
2102
+ },
2121
2103
  "p2pLabel": {
2122
2104
  "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_p2pLabel"
2123
2105
  },
@@ -2959,6 +2941,9 @@
2959
2941
  "options_cloudflaredPath": {
2960
2942
  "@id": "undefineds:dist/tunnel/LocalTunnelProvider.jsonld#LocalTunnelProvider_options_cloudflaredPath"
2961
2943
  },
2944
+ "options_connectTimeoutMs": {
2945
+ "@id": "undefineds:dist/tunnel/LocalTunnelProvider.jsonld#LocalTunnelProvider_options_connectTimeoutMs"
2946
+ },
2962
2947
  "tunnelToken": {
2963
2948
  "@id": "undefineds:dist/tunnel/LocalTunnelProvider.jsonld#LocalTunnelProvider_options_tunnelToken"
2964
2949
  },
@@ -2967,6 +2952,9 @@
2967
2952
  },
2968
2953
  "cloudflaredPath": {
2969
2954
  "@id": "undefineds:dist/tunnel/LocalTunnelProvider.jsonld#LocalTunnelProvider_options_cloudflaredPath"
2955
+ },
2956
+ "connectTimeoutMs": {
2957
+ "@id": "undefineds:dist/tunnel/LocalTunnelProvider.jsonld#LocalTunnelProvider_options_connectTimeoutMs"
2970
2958
  }
2971
2959
  }
2972
2960
  },
@@ -3994,6 +3982,11 @@
3994
3982
  "@prefix": true,
3995
3983
  "@context": {}
3996
3984
  },
3985
+ "BuildPublicAccessRoutesOptions": {
3986
+ "@id": "undefineds:dist/edge/reachability/RouteSetBuilder.jsonld#BuildPublicAccessRoutesOptions",
3987
+ "@prefix": true,
3988
+ "@context": {}
3989
+ },
3997
3990
  "ReachabilitySessionService": {
3998
3991
  "@id": "undefineds:dist/edge/reachability/ReachabilitySessionService.jsonld#ReachabilitySessionService",
3999
3992
  "@prefix": true,
@@ -47,6 +47,12 @@ export interface EdgeNodeAgentOptions {
47
47
  p2p?: {
48
48
  enabled?: boolean | string;
49
49
  targetBaseUrl: string | URL;
50
+ /**
51
+ * Address this node advertises as its LAN route. Defaults to `targetBaseUrl`,
52
+ * and must be set when the forwarding target is a loopback-only listener that
53
+ * other devices on the LAN cannot reach.
54
+ */
55
+ lanBaseUrl?: string | URL;
50
56
  label?: string;
51
57
  host?: string;
52
58
  address?: string;
@@ -85,6 +91,16 @@ export declare class EdgeNodeAgent {
85
91
  private recordWithContent;
86
92
  private collectSystemMetrics;
87
93
  private buildHeartbeatMetadata;
94
+ /**
95
+ * Same-machine access point: the local runtime the agent heartbeats for.
96
+ *
97
+ * It is published as `local-only`, so it never reaches public route discovery -
98
+ * a loopback address is meaningless on any other machine - while managed
99
+ * clients still see it first (priority 10). The canonical URL stays canonical:
100
+ * loopback is only its access route.
101
+ */
102
+ private buildLoopbackHeartbeatRoute;
103
+ private resolveLoopbackTargetUrl;
88
104
  private buildLanHeartbeatRoutes;
89
105
  private buildLanHeartbeatRoute;
90
106
  private buildP2PHeartbeatRoute;
@@ -229,6 +229,13 @@ class EdgeNodeAgent {
229
229
  }
230
230
  buildHeartbeatMetadata(options) {
231
231
  const metadata = { ...(options.metadata ?? {}) };
232
+ // Every access point this node has is reported, not just the public one:
233
+ // clients pick the best path for where they are (`docs/multi-channel-access.md`),
234
+ // and a same-machine client needs the loopback entry to do that.
235
+ const loopbackRoute = this.buildLoopbackHeartbeatRoute(options);
236
+ if (loopbackRoute) {
237
+ metadata.routes = this.mergeHeartbeatRoutes(metadata.routes, [loopbackRoute]);
238
+ }
232
239
  const lanRoutes = this.buildLanHeartbeatRoutes(options);
233
240
  if (lanRoutes.length > 0) {
234
241
  metadata.routes = this.mergeHeartbeatRoutes(metadata.routes, lanRoutes);
@@ -239,12 +246,60 @@ class EdgeNodeAgent {
239
246
  }
240
247
  return metadata;
241
248
  }
249
+ /**
250
+ * Same-machine access point: the local runtime the agent heartbeats for.
251
+ *
252
+ * It is published as `local-only`, so it never reaches public route discovery -
253
+ * a loopback address is meaningless on any other machine - while managed
254
+ * clients still see it first (priority 10). The canonical URL stays canonical:
255
+ * loopback is only its access route.
256
+ */
257
+ buildLoopbackHeartbeatRoute(options) {
258
+ const target = options.p2p?.targetBaseUrl;
259
+ const targetUrl = this.resolveLoopbackTargetUrl(target);
260
+ if (!targetUrl) {
261
+ return undefined;
262
+ }
263
+ return {
264
+ id: 'loopback',
265
+ nodeId: options.nodeId,
266
+ ...(options.baseUrl ? { canonicalUrl: options.baseUrl } : {}),
267
+ kind: 'loopback',
268
+ targetUrl,
269
+ priority: 10,
270
+ requiresManagedClient: true,
271
+ visibility: 'local-only',
272
+ health: 'healthy',
273
+ metadata: {
274
+ source: 'local-runtime',
275
+ },
276
+ };
277
+ }
278
+ resolveLoopbackTargetUrl(target) {
279
+ if (!target) {
280
+ return undefined;
281
+ }
282
+ try {
283
+ const url = target instanceof URL ? target : new URL(String(target));
284
+ if (url.protocol !== 'http:' && url.protocol !== 'https:') {
285
+ return undefined;
286
+ }
287
+ const hostname = url.hostname.toLowerCase().replace(/^\[|\]$/gu, '');
288
+ if (hostname !== 'localhost' && hostname !== '127.0.0.1' && hostname !== '::1') {
289
+ return undefined;
290
+ }
291
+ return url.href.endsWith('/') ? url.href : `${url.href}/`;
292
+ }
293
+ catch {
294
+ return undefined;
295
+ }
296
+ }
242
297
  buildLanHeartbeatRoutes(options) {
243
298
  const p2p = options.p2p;
244
299
  if (!p2p || this.normalizeBoolean(p2p.enabled) === false) {
245
300
  return [];
246
301
  }
247
- const endpoint = this.resolveLanGatewayEndpoint(p2p.targetBaseUrl);
302
+ const endpoint = this.resolveLanGatewayEndpoint(p2p.lanBaseUrl ?? p2p.targetBaseUrl);
248
303
  if (!endpoint) {
249
304
  return [];
250
305
  }
@@ -212,6 +212,14 @@
212
212
  "@id": "undefineds:dist/edge/EdgeNodeAgent.jsonld#EdgeNodeAgent__member_buildHeartbeatMetadata",
213
213
  "memberFieldName": "buildHeartbeatMetadata"
214
214
  },
215
+ {
216
+ "@id": "undefineds:dist/edge/EdgeNodeAgent.jsonld#EdgeNodeAgent__member_buildLoopbackHeartbeatRoute",
217
+ "memberFieldName": "buildLoopbackHeartbeatRoute"
218
+ },
219
+ {
220
+ "@id": "undefineds:dist/edge/EdgeNodeAgent.jsonld#EdgeNodeAgent__member_resolveLoopbackTargetUrl",
221
+ "memberFieldName": "resolveLoopbackTargetUrl"
222
+ },
215
223
  {
216
224
  "@id": "undefineds:dist/edge/EdgeNodeAgent.jsonld#EdgeNodeAgent__member_buildLanHeartbeatRoutes",
217
225
  "memberFieldName": "buildLanHeartbeatRoutes"
@@ -16,6 +16,8 @@ export interface EdgeNodeAgentInitializerOptions {
16
16
  intervalMs?: number | string;
17
17
  p2pEnabled?: boolean | string;
18
18
  p2pTargetBaseUrl?: string;
19
+ /** LAN-facing address; defaults to `p2pTargetBaseUrl` inside the agent. */
20
+ p2pLanBaseUrl?: string;
19
21
  p2pLabel?: string;
20
22
  p2pAcceptIntervalMs?: number | string;
21
23
  p2pConnectTimeoutMs?: number | string;
@@ -86,6 +86,7 @@ class EdgeNodeAgentInitializer extends community_server_1.Initializer {
86
86
  p2p: {
87
87
  enabled: true,
88
88
  targetBaseUrl: options.p2pTargetBaseUrl,
89
+ ...(options.p2pLanBaseUrl ? { lanBaseUrl: options.p2pLanBaseUrl } : {}),
89
90
  label: options.p2pLabel,
90
91
  acceptIntervalMs: this.normalizePositiveInteger(options.p2pAcceptIntervalMs),
91
92
  connectTimeoutMs: this.normalizePositiveInteger(options.p2pConnectTimeoutMs),
@@ -185,6 +185,19 @@
185
185
  ]
186
186
  }
187
187
  },
188
+ {
189
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_p2pLanBaseUrl",
190
+ "range": {
191
+ "@type": "ParameterRangeUnion",
192
+ "parameterRangeElements": [
193
+ "xsd:string",
194
+ {
195
+ "@type": "ParameterRangeUndefined"
196
+ }
197
+ ]
198
+ },
199
+ "comment": "LAN-facing address; defaults to `p2pTargetBaseUrl` inside the agent."
200
+ },
188
201
  {
189
202
  "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_p2pLabel",
190
203
  "range": {
@@ -555,6 +568,12 @@
555
568
  "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_p2pTargetBaseUrl"
556
569
  }
557
570
  },
571
+ {
572
+ "keyRaw": "p2pLanBaseUrl",
573
+ "value": {
574
+ "@id": "undefineds:dist/edge/EdgeNodeAgentInitializer.jsonld#EdgeNodeAgentInitializer_options_p2pLanBaseUrl"
575
+ }
576
+ },
558
577
  {
559
578
  "keyRaw": "p2pLabel",
560
579
  "value": {
@@ -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;