@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.
- package/config/cloud.json +0 -3
- package/config/components-ignore.json +11 -7
- package/config/local.json +0 -3
- package/config/xpod.base.json +0 -24
- package/dist/api/ai-config/AiConfigStore.d.ts +2 -2
- package/dist/api/ai-config/AiConfigStore.js +4 -1
- package/dist/api/ai-gateway/auth/CallerPodAccess.d.ts +2 -5
- package/dist/api/ai-gateway/auth/CallerPodAccess.js +3 -42
- package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.d.ts +2 -1
- package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.js +1 -1
- package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.d.ts +3 -8
- package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.js +9 -32
- package/dist/api/ai-gateway/connect/index.d.ts +3 -3
- package/dist/api/ai-gateway/connect/index.js +9 -38
- package/dist/api/ai-gateway/errors.js +2 -1
- package/dist/api/ai-gateway/models/PodModelSelectionRepository.d.ts +3 -3
- package/dist/api/ai-gateway/models/PodModelSelectionRepository.js +7 -11
- package/dist/api/ai-gateway/pod/HostedPodRoute.d.ts +27 -0
- package/dist/api/ai-gateway/pod/HostedPodRoute.js +47 -0
- package/dist/api/ai-gateway/pod/OwnerPodAccess.d.ts +79 -0
- package/dist/api/ai-gateway/pod/OwnerPodAccess.js +192 -0
- package/dist/api/ai-gateway/pod/PodInterfaceKeyStore.d.ts +52 -0
- package/dist/api/ai-gateway/pod/PodInterfaceKeyStore.js +61 -0
- package/dist/api/ai-gateway/providers/ProviderRegistry.js +1 -1
- package/dist/api/ai-gateway/quota/ProviderQuotaAdapter.d.ts +3 -3
- package/dist/api/ai-gateway/quota/ProviderQuotaAdapter.js +7 -32
- package/dist/api/ai-gateway/service-access/AiConnectionsServiceAccess.d.ts +1 -1
- package/dist/api/ai-gateway/service-access/AiConnectionsServiceAccess.js +1 -1
- package/dist/api/auth/ClientCredentialsAuthenticator.js +5 -28
- package/dist/api/auth/TokenEndpointRoute.d.ts +18 -0
- package/dist/api/auth/TokenEndpointRoute.js +36 -0
- package/dist/api/chatkit/pod-store.d.ts +4 -4
- package/dist/api/chatkit/pod-store.js +24 -95
- package/dist/api/container/common.js +36 -23
- package/dist/api/container/index.js +1 -0
- package/dist/api/container/local.js +88 -37
- package/dist/api/container/routes.js +41 -7
- package/dist/api/container/types.d.ts +4 -2
- package/dist/api/handlers/AdminHandler.d.ts +17 -1
- package/dist/api/handlers/AdminHandler.js +40 -3
- package/dist/api/handlers/AiGatewayManagementHandler.d.ts +6 -0
- package/dist/api/handlers/AiGatewayManagementHandler.js +17 -4
- package/dist/api/handlers/EdgeNodeSignalHandler.js +10 -2
- package/dist/api/handlers/NetworkSettingsHandler.d.ts +44 -5
- package/dist/api/handlers/NetworkSettingsHandler.js +46 -11
- package/dist/api/handlers/PodSettingsHandler.d.ts +3 -3
- package/dist/api/handlers/PodSettingsHandler.js +3 -3
- package/dist/api/handlers/ProvisionHandler.d.ts +35 -1
- package/dist/api/handlers/ProvisionHandler.js +53 -2
- package/dist/api/handlers/ReachabilityHandler.d.ts +6 -0
- package/dist/api/handlers/ReachabilityHandler.js +25 -6
- package/dist/api/network/NetworkEnvironmentConfigurationStore.d.ts +6 -1
- package/dist/api/network/NetworkEnvironmentConfigurationStore.js +72 -16
- package/dist/api/runtime.d.ts +18 -0
- package/dist/api/runtime.js +28 -2
- package/dist/api/service/AiClientConfigurationService.d.ts +1 -1
- package/dist/api/service/AiClientConfigurationService.js +1 -1
- package/dist/cli/commands/start.d.ts +26 -1
- package/dist/cli/commands/start.js +69 -5
- package/dist/components/components.jsonld +1 -1
- package/dist/components/context.jsonld +35 -42
- package/dist/edge/EdgeNodeAgent.d.ts +16 -0
- package/dist/edge/EdgeNodeAgent.js +56 -1
- package/dist/edge/EdgeNodeAgent.jsonld +8 -0
- package/dist/edge/EdgeNodeAgentInitializer.d.ts +2 -0
- package/dist/edge/EdgeNodeAgentInitializer.js +1 -0
- package/dist/edge/EdgeNodeAgentInitializer.jsonld +19 -0
- package/dist/edge/EdgeNodeDnsCoordinator.d.ts +11 -1
- package/dist/edge/EdgeNodeDnsCoordinator.js +12 -2
- package/dist/edge/EdgeNodeHealthProbeService.d.ts +15 -0
- package/dist/edge/EdgeNodeHealthProbeService.js +44 -12
- package/dist/edge/EdgeNodeHealthProbeService.jsonld +77 -0
- package/dist/edge/ProbeTargetGuard.d.ts +35 -0
- package/dist/edge/ProbeTargetGuard.js +142 -0
- package/dist/edge/reachability/NodeAccessResolver.d.ts +16 -0
- package/dist/edge/reachability/NodeAccessResolver.js +30 -0
- package/dist/edge/reachability/ReachabilitySessionService.js +4 -1
- package/dist/edge/reachability/RouteSetBuilder.d.ts +18 -1
- package/dist/edge/reachability/RouteSetBuilder.js +47 -0
- package/dist/edge/reachability/RouteSetBuilder.jsonld +29 -0
- package/dist/edge/reachability/types.d.ts +8 -2
- package/dist/http/SubgraphSparqlHttpHandler.d.ts +1 -25
- package/dist/http/SubgraphSparqlHttpHandler.js +0 -100
- package/dist/http/SubgraphSparqlHttpHandler.jsonld +0 -8
- package/dist/identity/drizzle/PodInterfaceKeyRepository.d.ts +33 -0
- package/dist/identity/drizzle/PodInterfaceKeyRepository.js +78 -0
- package/dist/identity/drizzle/db.d.ts +7 -0
- package/dist/identity/drizzle/db.js +30 -0
- package/dist/identity/drizzle/schema.pg.d.ts +9 -0
- package/dist/identity/drizzle/schema.pg.js +16 -1
- package/dist/identity/drizzle/schema.sqlite.d.ts +106 -0
- package/dist/identity/drizzle/schema.sqlite.js +16 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +9 -5
- package/dist/main.js +7 -0
- package/dist/runtime/GatewayAdminProxyAuth.d.ts +1 -16
- package/dist/runtime/GatewayAdminProxyAuth.js +2 -71
- package/dist/runtime/Proxy.d.ts +32 -1
- package/dist/runtime/Proxy.js +125 -31
- package/dist/runtime/bootstrap.d.ts +21 -0
- package/dist/runtime/bootstrap.js +45 -1
- package/dist/runtime/css-process.d.ts +1 -0
- package/dist/runtime/css-process.js +1 -0
- package/dist/runtime/host/node/NodeRuntimeHost.js +6 -1
- package/dist/runtime/host/types.d.ts +6 -0
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.js +4 -1
- package/dist/runtime/js-runtime.js +10 -3
- package/dist/runtime/lifecycle.js +6 -4
- package/dist/runtime/port-finder.d.ts +26 -0
- package/dist/runtime/port-finder.js +64 -0
- package/dist/runtime/runner/node/NodeGatewayRuntimeRunner.js +1 -0
- package/dist/runtime/runner/types.d.ts +5 -0
- package/dist/runtime/runtime-types.d.ts +1 -0
- package/dist/test-utils/local-managed-client-p2p-e2e-smoke.js +1 -1
- package/dist/tunnel/AutoTunnelProvider.d.ts +56 -0
- package/dist/tunnel/AutoTunnelProvider.js +181 -0
- package/dist/tunnel/LocalTunnelProvider.d.ts +15 -0
- package/dist/tunnel/LocalTunnelProvider.js +87 -18
- package/dist/tunnel/LocalTunnelProvider.jsonld +27 -0
- package/dist/tunnel/NgrokTunnelProvider.d.ts +4 -0
- package/dist/tunnel/NgrokTunnelProvider.js +117 -43
- package/dist/tunnel/NgrokTunnelProvider.jsonld +4 -0
- package/dist/tunnel/SakuraFrpTunnelProvider.d.ts +65 -3
- package/dist/tunnel/SakuraFrpTunnelProvider.js +268 -25
- package/dist/tunnel/TunnelLifecycle.d.ts +14 -0
- package/dist/tunnel/TunnelLifecycle.js +34 -0
- package/dist/tunnel/TunnelProfiles.d.ts +33 -3
- package/dist/tunnel/TunnelProfiles.js +105 -78
- package/dist/tunnel/TunnelProvider.d.ts +15 -2
- package/dist/tunnel/TunnelProvider.jsonld +8 -0
- package/dist/tunnel/TunnelProviderCatalog.d.ts +62 -0
- package/dist/tunnel/TunnelProviderCatalog.js +130 -0
- package/dist/tunnel/index.d.ts +1 -0
- package/dist/tunnel/index.js +3 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiApiKeyPool.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiApiKeyPool.js +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiAuthorizationActions.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.js +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectDialog.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialPoolSection.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialRow.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiCustomProviderDialog.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeyRow.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayModelsSection.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiOfferingDetails.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiProviderCard.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiQuotaCard.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiSortableCredentialList.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/authorization-methods.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/collection-runtime.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/collection-runtime.js +3 -3
- package/node_modules/@undefineds.co/ai-connections/dist/collections.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/collections.js +3 -3
- package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/ai-connections-client.d.ts +1 -1
- package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/ai-connections-client.js +1 -1
- package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/index.cjs +8 -8
- package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/index.d.ts +1 -1
- package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/index.js +1 -1
- package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/provider-catalog.cjs +3 -3
- package/node_modules/@undefineds.co/ai-connections/dist/controller.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/controller.js +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/credential-labels.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/display-wording.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/error-wording.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/error-wording.js +8 -3
- package/node_modules/@undefineds.co/ai-connections/dist/gateway-endpoints.js +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/offering-endpoints.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/offering-label.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/provider-visuals.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/service-access.js +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/useAiConnectDialog.d.ts +1 -1
- package/node_modules/@undefineds.co/ai-connections/package.json +31 -1
- package/node_modules/@undefineds.co/solid-sdk/dist/access-route.cjs +230 -0
- package/node_modules/@undefineds.co/solid-sdk/dist/access-route.d.ts +76 -0
- package/node_modules/@undefineds.co/solid-sdk/dist/access-route.js +115 -0
- package/node_modules/@undefineds.co/solid-sdk/dist/index.cjs +89 -0
- package/node_modules/@undefineds.co/solid-sdk/dist/index.d.ts +1 -0
- package/node_modules/@undefineds.co/solid-sdk/dist/index.js +1 -0
- package/node_modules/@undefineds.co/solid-sdk/package.json +6 -1
- package/package.json +5 -6
- package/static/app/assets/inrupt-smoke.js +23 -23
- package/static/app/assets/main.css +1 -1
- package/static/auth-callback/assets/{AiConfigContext-DlFyEWy9.js → AiConfigContext-Bx0HCAW5.js} +1 -1
- package/static/auth-callback/assets/{AiConfigPage-CkYk-SFW.js → AiConfigPage-ChQImMbm.js} +1 -1
- package/static/auth-callback/assets/{DocumentProcessingPanel-CqIr3JqN.js → DocumentProcessingPanel-D830H4SH.js} +1 -1
- package/static/auth-callback/assets/{IndexLifecyclePanel-C1GKV3Vx.js → IndexLifecyclePanel-CnlkjMF8.js} +1 -1
- package/static/auth-callback/assets/{IndexSubjectPanel-ro9lC6XW.js → IndexSubjectPanel-CdEfg_CO.js} +1 -1
- package/static/auth-callback/assets/{ModelAssignmentsPanel-DxNdyKRJ.js → ModelAssignmentsPanel-D-8A8dZx.js} +1 -1
- package/static/auth-callback/assets/{ModelsPage-BVtWSPBU.js → ModelsPage-Cim7cubp.js} +3 -3
- package/static/auth-callback/assets/NetworkPage-CfK3x-pb.js +2 -0
- package/static/auth-callback/assets/{PaneListHeader-ByKw8ada.js → PaneListHeader-Bf_kEd4U.js} +1 -1
- package/static/auth-callback/assets/{SearchIndexingPanel-CulBKcYT.js → SearchIndexingPanel-4kD4RBEQ.js} +1 -1
- package/static/auth-callback/assets/{StatusSubjectPanel-VOcfrt8o.js → StatusSubjectPanel-Bw9AiTSf.js} +1 -1
- package/static/auth-callback/assets/{StatusWorkspace-Jsz6hAdE.js → StatusWorkspace-C-301H-0.js} +1 -1
- package/static/auth-callback/assets/{SystemSettingsPage-BFNvGAle.js → SystemSettingsPage-BbWn-eG6.js} +1 -1
- package/static/auth-callback/assets/{SystemSettingsSubjectPanel-DFRdrSfK.js → SystemSettingsSubjectPanel-DA4wvNSm.js} +1 -1
- package/static/auth-callback/assets/{XpodAiConnectionsPodStore-C6KpvHVg.js → XpodAiConnectionsPodStore-CohdyLoX.js} +1 -1
- package/static/auth-callback/assets/{activity-DnTlb9iM.js → activity-CCsb9Oam.js} +1 -1
- package/static/auth-callback/assets/ai-connections-DexTPyfC.js +1 -0
- package/static/auth-callback/assets/{auth-callback-D2UkK5Xj.js → auth-callback-Ds-c62W3.js} +5 -5
- package/static/auth-callback/assets/auth-callback-rk080mvG.css +1 -0
- package/static/auth-callback/assets/{badge-D7IJuuTM.js → badge-CQm5OyzR.js} +1 -1
- package/static/auth-callback/assets/{collection-runtime-wT1n4GS2.js → collection-runtime-DlAuU5TW.js} +1 -1
- package/static/auth-callback/assets/{dialog-DickLu5z.js → dialog-CnGzg5Ff.js} +1 -1
- package/static/auth-callback/assets/{download-kn8WnRu3.js → download-DwMONJvm.js} +1 -1
- package/static/auth-callback/assets/{external-link-B6B8jfSn.js → external-link-Bu5AGqCO.js} +1 -1
- package/static/auth-callback/assets/{index-DHF97YLP.js → index-B0T-1YO8.js} +1 -1
- package/static/auth-callback/assets/{index-Dz83EEHD.js → index-C8QZf_4W.js} +1 -1
- package/static/auth-callback/assets/index-DwIlrIDG.js +4 -0
- package/static/auth-callback/assets/{index-browser-CSghinyi.js → index-browser-lRsMcP_7.js} +1 -1
- package/static/auth-callback/assets/{key-round-ChkOx3E1.js → key-round-BDMtU57P.js} +1 -1
- package/static/auth-callback/assets/{rotate-ccw-B3hE-nyd.js → rotate-ccw-CoKIGCsQ.js} +1 -1
- package/static/auth-callback/assets/{skeleton-kEqR7tpI.js → skeleton-CPoSWHDr.js} +1 -1
- package/static/auth-callback/assets/{waypoints-D6Jo-SZa.js → waypoints-BeYHxqHv.js} +1 -1
- package/static/auth-callback/assets/{workspace-layout-BHwT_cHd.js → workspace-layout-xA5YxiK3.js} +1 -1
- package/static/auth-callback/auth-callback.html +2 -2
- package/static/dashboard/assets/{AiConfigContext-BfC3v-x2.js → AiConfigContext-rWx4TyiH.js} +1 -1
- package/static/dashboard/assets/{AiConfigPage-QNS3u7Ff.js → AiConfigPage-StVJpDFT.js} +1 -1
- package/static/dashboard/assets/{DocumentProcessingPanel-Dr4XLeT4.js → DocumentProcessingPanel-DJ5yul2O.js} +1 -1
- package/static/dashboard/assets/{IndexLifecyclePanel-KtM_gpeO.js → IndexLifecyclePanel-CpjtgezK.js} +1 -1
- package/static/dashboard/assets/{IndexSubjectPanel-DLaiKdLc.js → IndexSubjectPanel-BVKcot1_.js} +1 -1
- package/static/dashboard/assets/{ModelAssignmentsPanel-Bk7TvQRq.js → ModelAssignmentsPanel-BxVgWZPc.js} +1 -1
- package/static/dashboard/assets/{ModelsPage-Cci3vlos.js → ModelsPage-CECBwmeO.js} +3 -3
- package/static/dashboard/assets/NetworkPage-zQgFscEW.js +2 -0
- package/static/dashboard/assets/{PaneListHeader-qHME_s08.js → PaneListHeader-DIPe8pS6.js} +1 -1
- package/static/dashboard/assets/{SearchIndexingPanel-HZPKj8H9.js → SearchIndexingPanel-lalFJ3c8.js} +1 -1
- package/static/dashboard/assets/{StatusSubjectPanel-ij7IpI8d.js → StatusSubjectPanel-CpY_KU-G.js} +1 -1
- package/static/dashboard/assets/{StatusWorkspace-Cp02JcaN.js → StatusWorkspace-BwWCii3A.js} +1 -1
- package/static/dashboard/assets/{SystemSettingsPage-BSeuvb8X.js → SystemSettingsPage-BKZxX-_n.js} +1 -1
- package/static/dashboard/assets/{SystemSettingsSubjectPanel-CP4_luGS.js → SystemSettingsSubjectPanel-BZrqb2C5.js} +1 -1
- package/static/dashboard/assets/{XpodAiConnectionsPodStore-urO6zaHL.js → XpodAiConnectionsPodStore-Bbpx9dTN.js} +1 -1
- package/static/dashboard/assets/{activity-DxjgQNvr.js → activity-BJ15TLVP.js} +1 -1
- package/static/dashboard/assets/ai-connections-GG6qkTJt.js +1 -0
- package/static/dashboard/assets/{badge-53qCrRbl.js → badge-BBX5FlaB.js} +1 -1
- package/static/dashboard/assets/{collection-runtime-BPAmHG46.js → collection-runtime-UBbHBzdf.js} +1 -1
- package/static/dashboard/assets/{dashboard-BcT2ByXw.js → dashboard-7Y6BHyV9.js} +62 -62
- package/static/dashboard/assets/dashboard-rk080mvG.css +1 -0
- package/static/dashboard/assets/{dialog-B28YtNhS.js → dialog-QrOJ-hB0.js} +1 -1
- package/static/dashboard/assets/{download-DkLNceJ4.js → download-DK9x-VOP.js} +1 -1
- package/static/dashboard/assets/{external-link-D3TXnlo3.js → external-link-Cnkn87mJ.js} +1 -1
- package/static/dashboard/assets/index-B1z84it5.js +4 -0
- package/static/dashboard/assets/{index-CIiBu9mr.js → index-DzjauX3N.js} +1 -1
- package/static/dashboard/assets/{index-CFIenkeK.js → index-cIa8_efI.js} +1 -1
- package/static/dashboard/assets/{key-round-B5ccp6nx.js → key-round-BoS6UqKz.js} +1 -1
- package/static/dashboard/assets/{rotate-ccw-DUpfkNnk.js → rotate-ccw-BeWV76i0.js} +1 -1
- package/static/dashboard/assets/{skeleton-BRe19fO0.js → skeleton-CypcJL07.js} +1 -1
- package/static/dashboard/assets/{waypoints-BKDMxEvu.js → waypoints-zHOOqfhi.js} +1 -1
- package/static/dashboard/assets/{workspace-layout-ZTF7C16h.js → workspace-layout-DZ9JuxnM.js} +1 -1
- package/static/dashboard/dashboard.html +2 -2
- package/static/settings/assets/{AiConfigContext-DsyWgu2i.js → AiConfigContext-D3b1l_Kw.js} +1 -1
- package/static/settings/assets/{AiConfigPage-CSCBckKo.js → AiConfigPage-DYKw-atP.js} +1 -1
- package/static/settings/assets/{DocumentProcessingPanel-w9yQDbBe.js → DocumentProcessingPanel-DguRfsIV.js} +1 -1
- package/static/settings/assets/{IndexLifecyclePanel-CUUXI8mP.js → IndexLifecyclePanel-B85qJJA4.js} +1 -1
- package/static/settings/assets/{IndexSubjectPanel-BypAU5TJ.js → IndexSubjectPanel-CsN7IxaV.js} +1 -1
- package/static/settings/assets/{ModelAssignmentsPanel-BetgXw1G.js → ModelAssignmentsPanel-DEp9byI6.js} +1 -1
- package/static/settings/assets/{ModelsPage-DZpTlTZ3.js → ModelsPage-CzTnPs_G.js} +3 -3
- package/static/settings/assets/NetworkPage-BDVnmUU0.js +2 -0
- package/static/settings/assets/{PaneListHeader-BGOqGec4.js → PaneListHeader-Cpe39N76.js} +1 -1
- package/static/settings/assets/{SearchIndexingPanel-DYAbpZ_9.js → SearchIndexingPanel-DA9w8lLL.js} +1 -1
- package/static/settings/assets/{StatusSubjectPanel-CFgzeQ8Q.js → StatusSubjectPanel-BU0Aq0CS.js} +1 -1
- package/static/settings/assets/{StatusWorkspace-4Z6g4Jvv.js → StatusWorkspace-D1AC1i5N.js} +1 -1
- package/static/settings/assets/{SystemSettingsPage-C1tlrgvI.js → SystemSettingsPage-ChKvOioO.js} +1 -1
- package/static/settings/assets/{SystemSettingsSubjectPanel-CcURI-1L.js → SystemSettingsSubjectPanel-DyTpOnD2.js} +1 -1
- package/static/settings/assets/{XpodAiConnectionsPodStore-owBQc5nY.js → XpodAiConnectionsPodStore-VU5Bsz1a.js} +1 -1
- package/static/settings/assets/{activity-CtBc9cNy.js → activity-DGpLfsQB.js} +1 -1
- package/static/settings/assets/ai-connections-DexTPyfC.js +1 -0
- package/static/settings/assets/{badge--r-FDIhU.js → badge-_hCrrWRP.js} +1 -1
- package/static/settings/assets/{collection-runtime-CnhPmwAM.js → collection-runtime-E40TZ8Cl.js} +1 -1
- package/static/settings/assets/{dialog-B7ZRsjN7.js → dialog-DTr2JkHn.js} +1 -1
- package/static/settings/assets/{download-DgQ1F8QR.js → download-B_D21DDX.js} +1 -1
- package/static/settings/assets/{external-link-Bz7NckNO.js → external-link-BATYaM13.js} +1 -1
- package/static/settings/assets/index-BAlAVi-J.js +4 -0
- package/static/settings/assets/{index-CkGda_Pg.js → index-Ckh4h9jj.js} +1 -1
- package/static/settings/assets/{index-Vv-8Vslg.js → index-DOiwLF4B.js} +1 -1
- package/static/settings/assets/{index-browser-Dq7omlpY.js → index-browser-DFFWN3Kr.js} +1 -1
- package/static/settings/assets/{key-round-CvuhloKV.js → key-round-ZTVU_1O1.js} +1 -1
- package/static/settings/assets/{rotate-ccw-DgFKDaz7.js → rotate-ccw-DDdw8PTU.js} +1 -1
- package/static/settings/assets/{settings-BvqY7K96.js → settings-CyLnISOv.js} +62 -62
- package/static/settings/assets/settings-rk080mvG.css +1 -0
- package/static/settings/assets/{skeleton-D3OeFDF6.js → skeleton-DEzA3hc2.js} +1 -1
- package/static/settings/assets/{waypoints-C4WbspTb.js → waypoints-BSdfNvEb.js} +1 -1
- package/static/settings/assets/{workspace-layout-B9H1Tqrk.js → workspace-layout-BOQnl_3d.js} +1 -1
- package/static/settings/settings.html +2 -2
- package/dist/api/ai-gateway/pod/HostedPodDataAccess.d.ts +0 -31
- package/dist/api/ai-gateway/pod/HostedPodDataAccess.js +0 -330
- package/dist/http/InternalPodDataHttpHandler.d.ts +0 -57
- package/dist/http/InternalPodDataHttpHandler.js +0 -551
- package/dist/http/InternalPodDataHttpHandler.jsonld +0 -243
- package/node_modules/@undefineds.co/ai-connections-core/package.json +0 -61
- package/static/auth-callback/assets/NetworkPage-cEvxRMAl.js +0 -2
- package/static/auth-callback/assets/ai-connections-C6yaE6WQ.js +0 -1
- package/static/auth-callback/assets/auth-callback-Cx9D_1qj.css +0 -1
- package/static/auth-callback/assets/index-Cu0EguPo.js +0 -4
- package/static/dashboard/assets/NetworkPage-Ot4G2dX5.js +0 -2
- package/static/dashboard/assets/ai-connections-CXp5gd1J.js +0 -1
- package/static/dashboard/assets/dashboard-Cx9D_1qj.css +0 -1
- package/static/dashboard/assets/index-Gp3cLolR.js +0 -4
- package/static/settings/assets/NetworkPage-BVkasFGM.js +0 -2
- package/static/settings/assets/ai-connections-C6yaE6WQ.js +0 -1
- package/static/settings/assets/index-BdXwm8nh.js +0 -4
- package/static/settings/assets/settings-Cx9D_1qj.css +0 -1
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/normalize.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/normalize.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/request.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/request.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/types.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client/types.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/base-adapter.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/base-adapter.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/codex.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/codex.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/index.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/index.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/json-env-adapter.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/json-env-adapter.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/pi.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/pi.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/transaction.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/transaction.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/types.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/client-config/types.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/credential-storage.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/credential-storage.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/endpoint-urls.d.ts +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/endpoint-urls.js +0 -0
- /package/node_modules/@undefineds.co/{ai-connections-core/dist → ai-connections/dist/contract}/provider-catalog.d.ts +0 -0
- /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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
91
|
-
|
|
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
|
|
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:
|
|
156
|
+
success: probe.status >= 200 && probe.status < 400,
|
|
146
157
|
latencyMs,
|
|
147
|
-
error:
|
|
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;
|