@undefineds.co/xpod 0.4.12 → 0.4.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/config/components-ignore.json +11 -7
  2. package/dist/acceptance/QleverSemanticConformance.js +7 -0
  3. package/dist/api/ai-gateway/providers/OfferingAuthorization.d.ts +6 -1
  4. package/dist/api/ai-gateway/providers/OfferingAuthorization.js +0 -3
  5. package/dist/api/ai-gateway/providers/ProviderRegistry.js +1 -1
  6. package/dist/api/container/index.js +1 -0
  7. package/dist/api/container/local.js +30 -12
  8. package/dist/api/container/routes.js +2 -0
  9. package/dist/api/container/types.d.ts +2 -0
  10. package/dist/api/handlers/AdminHandler.d.ts +17 -1
  11. package/dist/api/handlers/AdminHandler.js +40 -3
  12. package/dist/api/handlers/EdgeNodeSignalHandler.js +10 -2
  13. package/dist/api/handlers/NetworkSettingsHandler.d.ts +37 -5
  14. package/dist/api/handlers/NetworkSettingsHandler.js +39 -11
  15. package/dist/api/handlers/ProvisionHandler.d.ts +6 -1
  16. package/dist/api/handlers/ProvisionHandler.js +7 -2
  17. package/dist/api/handlers/ReachabilityHandler.d.ts +6 -0
  18. package/dist/api/handlers/ReachabilityHandler.js +22 -5
  19. package/dist/api/network/NetworkEnvironmentConfigurationStore.d.ts +6 -1
  20. package/dist/api/network/NetworkEnvironmentConfigurationStore.js +72 -16
  21. package/dist/api/runtime.d.ts +9 -0
  22. package/dist/api/runtime.js +15 -2
  23. package/dist/cli/commands/start.d.ts +19 -1
  24. package/dist/cli/commands/start.js +71 -5
  25. package/dist/components/context.jsonld +30 -0
  26. package/dist/edge/EdgeNodeAgent.d.ts +6 -0
  27. package/dist/edge/EdgeNodeAgent.js +1 -1
  28. package/dist/edge/EdgeNodeAgentInitializer.d.ts +2 -0
  29. package/dist/edge/EdgeNodeAgentInitializer.js +1 -0
  30. package/dist/edge/EdgeNodeAgentInitializer.jsonld +19 -0
  31. package/dist/edge/EdgeNodeDnsCoordinator.d.ts +11 -1
  32. package/dist/edge/EdgeNodeDnsCoordinator.js +12 -2
  33. package/dist/edge/EdgeNodeHealthProbeService.d.ts +15 -0
  34. package/dist/edge/EdgeNodeHealthProbeService.js +44 -12
  35. package/dist/edge/EdgeNodeHealthProbeService.jsonld +77 -0
  36. package/dist/edge/ProbeTargetGuard.d.ts +35 -0
  37. package/dist/edge/ProbeTargetGuard.js +142 -0
  38. package/dist/edge/reachability/NodeAccessResolver.d.ts +16 -0
  39. package/dist/edge/reachability/NodeAccessResolver.js +30 -0
  40. package/dist/index.d.ts +3 -1
  41. package/dist/index.js +9 -3
  42. package/dist/main.js +7 -0
  43. package/dist/runtime/Proxy.d.ts +22 -0
  44. package/dist/runtime/Proxy.js +34 -7
  45. package/dist/runtime/bootstrap.d.ts +11 -0
  46. package/dist/runtime/bootstrap.js +21 -1
  47. package/dist/runtime/css-process.d.ts +1 -0
  48. package/dist/runtime/css-process.js +1 -0
  49. package/dist/runtime/host/node/NodeRuntimeHost.js +4 -1
  50. package/dist/runtime/host/types.d.ts +6 -0
  51. package/dist/runtime/index.d.ts +1 -1
  52. package/dist/runtime/index.js +5 -1
  53. package/dist/runtime/lifecycle.js +1 -0
  54. package/dist/runtime/port-finder.d.ts +30 -0
  55. package/dist/runtime/port-finder.js +83 -0
  56. package/dist/runtime/runner/node/NodeGatewayRuntimeRunner.js +1 -0
  57. package/dist/runtime/runner/types.d.ts +5 -0
  58. package/dist/runtime/runtime-types.d.ts +1 -0
  59. package/dist/storage/rdf/PostgresRdfEngine.js +10 -4
  60. package/dist/storage/rdf/RdfAccessScope.js +15 -1
  61. package/dist/storage/rdf/RdfEngineRdfJsSource.js +10 -2
  62. package/dist/test-utils/local-managed-client-p2p-e2e-smoke.js +1 -1
  63. package/dist/tunnel/LocalTunnelProvider.d.ts +15 -0
  64. package/dist/tunnel/LocalTunnelProvider.js +87 -18
  65. package/dist/tunnel/LocalTunnelProvider.jsonld +27 -0
  66. package/dist/tunnel/NgrokTunnelProvider.d.ts +4 -0
  67. package/dist/tunnel/NgrokTunnelProvider.js +117 -43
  68. package/dist/tunnel/NgrokTunnelProvider.jsonld +4 -0
  69. package/dist/tunnel/SakuraFrpTunnelProvider.d.ts +65 -3
  70. package/dist/tunnel/SakuraFrpTunnelProvider.js +268 -25
  71. package/dist/tunnel/TunnelLifecycle.d.ts +14 -0
  72. package/dist/tunnel/TunnelLifecycle.js +34 -0
  73. package/dist/tunnel/TunnelProfiles.d.ts +33 -3
  74. package/dist/tunnel/TunnelProfiles.js +105 -78
  75. package/dist/tunnel/TunnelProvider.d.ts +15 -2
  76. package/dist/tunnel/TunnelProvider.jsonld +8 -0
  77. package/dist/tunnel/TunnelProviderCatalog.d.ts +62 -0
  78. package/dist/tunnel/TunnelProviderCatalog.js +130 -0
  79. package/node_modules/@undefineds.co/ai-connections/dist/AiApiKeyPool.d.ts +1 -1
  80. package/node_modules/@undefineds.co/ai-connections/dist/AiApiKeyPool.js +1 -1
  81. package/node_modules/@undefineds.co/ai-connections/dist/AiAuthorizationActions.d.ts +1 -1
  82. package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.d.ts +1 -1
  83. package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.js +3 -3
  84. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectDialog.d.ts +1 -1
  85. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.d.ts +1 -1
  86. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.js +2 -2
  87. package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialPoolSection.d.ts +1 -1
  88. package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialRow.d.ts +1 -1
  89. package/node_modules/@undefineds.co/ai-connections/dist/AiCustomProviderDialog.d.ts +1 -1
  90. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeyRow.d.ts +1 -1
  91. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.d.ts +1 -1
  92. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayModelsSection.d.ts +1 -1
  93. package/node_modules/@undefineds.co/ai-connections/dist/AiOfferingDetails.d.ts +1 -1
  94. package/node_modules/@undefineds.co/ai-connections/dist/AiProviderCard.d.ts +1 -1
  95. package/node_modules/@undefineds.co/ai-connections/dist/AiQuotaCard.d.ts +1 -1
  96. package/node_modules/@undefineds.co/ai-connections/dist/AiSortableCredentialList.d.ts +1 -1
  97. package/node_modules/@undefineds.co/ai-connections/dist/authorization-methods.d.ts +13 -11
  98. package/node_modules/@undefineds.co/ai-connections/dist/authorization-methods.js +16 -13
  99. package/node_modules/@undefineds.co/ai-connections/dist/collection-runtime.d.ts +1 -1
  100. package/node_modules/@undefineds.co/ai-connections/dist/collection-runtime.js +3 -3
  101. package/node_modules/@undefineds.co/ai-connections/dist/collections.d.ts +1 -1
  102. package/node_modules/@undefineds.co/ai-connections/dist/collections.js +3 -3
  103. package/node_modules/@undefineds.co/ai-connections/dist/{ai-connections-client.d.ts → contract/ai-connections-client.d.ts} +4 -2
  104. package/node_modules/@undefineds.co/ai-connections/dist/{ai-connections-client.js → contract/ai-connections-client.js} +4 -2
  105. package/node_modules/@undefineds.co/ai-connections/dist/{client → contract/client}/normalize.d.ts +17 -7
  106. package/node_modules/@undefineds.co/ai-connections/dist/{client → contract/client}/normalize.js +18 -213
  107. package/node_modules/@undefineds.co/ai-connections/dist/{client → contract/client}/request.js +3 -3
  108. package/node_modules/@undefineds.co/ai-connections/dist/{client → contract/client}/types.d.ts +11 -2
  109. package/node_modules/@undefineds.co/ai-connections/dist/{client-config → contract/client-config}/index.cjs +8 -8
  110. package/node_modules/@undefineds.co/ai-connections/dist/contract/index.d.ts +9 -0
  111. package/node_modules/@undefineds.co/ai-connections/dist/contract/index.js +9 -0
  112. package/node_modules/@undefineds.co/ai-connections/dist/{provider-catalog.cjs → contract/provider-catalog.cjs} +5 -28
  113. package/node_modules/@undefineds.co/ai-connections/dist/{provider-catalog.d.ts → contract/provider-catalog.d.ts} +9 -8
  114. package/node_modules/@undefineds.co/ai-connections/dist/{provider-catalog.js → contract/provider-catalog.js} +11 -31
  115. package/node_modules/@undefineds.co/ai-connections/dist/controller.d.ts +1 -1
  116. package/node_modules/@undefineds.co/ai-connections/dist/controller.js +3 -2
  117. package/node_modules/@undefineds.co/ai-connections/dist/credential-labels.d.ts +1 -1
  118. package/node_modules/@undefineds.co/ai-connections/dist/display-wording.d.ts +20 -0
  119. package/node_modules/@undefineds.co/ai-connections/dist/display-wording.js +73 -0
  120. package/node_modules/@undefineds.co/ai-connections/dist/error-wording.d.ts +24 -0
  121. package/node_modules/@undefineds.co/ai-connections/dist/error-wording.js +253 -0
  122. package/node_modules/@undefineds.co/ai-connections/dist/gateway-endpoints.js +1 -1
  123. package/node_modules/@undefineds.co/ai-connections/dist/index.d.ts +2 -3
  124. package/node_modules/@undefineds.co/ai-connections/dist/index.js +2 -3
  125. package/node_modules/@undefineds.co/ai-connections/dist/offering-endpoints.d.ts +1 -1
  126. package/node_modules/@undefineds.co/ai-connections/dist/offering-label.d.ts +1 -1
  127. package/node_modules/@undefineds.co/ai-connections/dist/provider-visuals.d.ts +1 -1
  128. package/node_modules/@undefineds.co/ai-connections/dist/service-access.js +1 -1
  129. package/node_modules/@undefineds.co/ai-connections/dist/useAiConnectDialog.d.ts +1 -1
  130. package/node_modules/@undefineds.co/ai-connections/package.json +25 -18
  131. package/node_modules/@undefineds.co/shared-ui/dist/index.d.ts +4 -2
  132. package/node_modules/@undefineds.co/shared-ui/dist/index.js +4 -2
  133. package/node_modules/@undefineds.co/shared-ui/dist/login/LoginModal.d.ts +4 -1
  134. package/node_modules/@undefineds.co/shared-ui/dist/login/LoginModal.js +12 -6
  135. package/node_modules/@undefineds.co/shared-ui/dist/login/LoginView.d.ts +1 -1
  136. package/node_modules/@undefineds.co/shared-ui/dist/login/host-types.d.ts +7 -1
  137. package/node_modules/@undefineds.co/shared-ui/dist/login/login-branding.d.ts +6 -0
  138. package/node_modules/@undefineds.co/shared-ui/dist/login/login-branding.js +18 -0
  139. package/node_modules/@undefineds.co/shared-ui/dist/user-facing-errors.d.ts +14 -2
  140. package/node_modules/@undefineds.co/shared-ui/dist/user-facing-errors.js +26 -17
  141. package/node_modules/@undefineds.co/solid-sdk/dist/login-store.d.ts +3 -3
  142. package/node_modules/@undefineds.co/solid-sdk/dist/login-store.js +3 -3
  143. package/package.json +4 -3
  144. package/static/auth-callback/assets/{AiConfigContext-DnQs1ZpW.js → AiConfigContext-DCXpjzpj.js} +1 -1
  145. package/static/auth-callback/assets/{AiConfigPage-DOtvlxH0.js → AiConfigPage-fe-xMIXa.js} +1 -1
  146. package/static/auth-callback/assets/{DocumentProcessingPanel-BS2voQgL.js → DocumentProcessingPanel-BGnkfMuU.js} +1 -1
  147. package/static/auth-callback/assets/{IndexLifecyclePanel-Cvt0cJtN.js → IndexLifecyclePanel-42Jups0j.js} +1 -1
  148. package/static/auth-callback/assets/{IndexSubjectPanel-Dhf01GqF.js → IndexSubjectPanel-CYyLOlQU.js} +1 -1
  149. package/static/auth-callback/assets/{ModelAssignmentsPanel-BJutWaAF.js → ModelAssignmentsPanel-BOvUH4yr.js} +1 -1
  150. package/static/auth-callback/assets/{ModelsPage-BRS0sje3.js → ModelsPage-DwyITxt7.js} +6 -6
  151. package/static/auth-callback/assets/NetworkPage-CG9RelJA.js +2 -0
  152. package/static/auth-callback/assets/{PaneListHeader-QQeJGTp4.js → PaneListHeader-yvd5ohs6.js} +1 -1
  153. package/static/auth-callback/assets/{SearchIndexingPanel-MyNUSEwT.js → SearchIndexingPanel-2_a6ezzj.js} +1 -1
  154. package/static/auth-callback/assets/{StatusSubjectPanel-DQkEVsFs.js → StatusSubjectPanel-8qtVxnzC.js} +1 -1
  155. package/static/auth-callback/assets/{StatusWorkspace-Dkv63Uwk.js → StatusWorkspace-CBdRahCF.js} +1 -1
  156. package/static/auth-callback/assets/{SystemSettingsPage-TIsUfX5d.js → SystemSettingsPage-BZJ6vWkg.js} +1 -1
  157. package/static/auth-callback/assets/{SystemSettingsSubjectPanel-BJWEt2-7.js → SystemSettingsSubjectPanel-xm08UhXP.js} +1 -1
  158. package/static/auth-callback/assets/XpodAiConnectionsPodStore-V6vgGfuw.js +3 -0
  159. package/static/auth-callback/assets/{activity-5hNeNKnL.js → activity-CeM7xly8.js} +1 -1
  160. package/static/auth-callback/assets/ai-connections-C6yaE6WQ.js +1 -0
  161. package/static/auth-callback/assets/{auth-callback-CAFZ3R0B.js → auth-callback-DTG8cSj7.js} +3 -3
  162. package/static/auth-callback/assets/{badge-CAIPI0CB.js → badge-qJo2Zr4d.js} +1 -1
  163. package/static/auth-callback/assets/{collection-runtime-D9s7h9YA.js → collection-runtime-Bztsz31a.js} +1 -1
  164. package/static/auth-callback/assets/{dialog-BjA109aX.js → dialog-D-h6x5x0.js} +1 -1
  165. package/static/auth-callback/assets/{download-B3Up5W2G.js → download-C2ir4lmR.js} +1 -1
  166. package/static/auth-callback/assets/{external-link-BTXgSPzB.js → external-link-THLDL4On.js} +1 -1
  167. package/static/auth-callback/assets/{index-CirW4CJf.js → index-BRpv4yO3.js} +1 -1
  168. package/static/auth-callback/assets/{index-BppXlxcp.js → index-BlVZb9A7.js} +1 -1
  169. package/static/auth-callback/assets/index-D983R1FV.js +4 -0
  170. package/static/auth-callback/assets/{index-browser-DtU38ni3.js → index-browser-3FvR0aaf.js} +1 -1
  171. package/static/auth-callback/assets/{key-round-CQCOrZ7x.js → key-round-C9U5j1Ly.js} +1 -1
  172. package/static/auth-callback/assets/{rotate-ccw-C1zM2KtS.js → rotate-ccw-DP45cD4o.js} +1 -1
  173. package/static/auth-callback/assets/{skeleton-Cqp7_M9-.js → skeleton-Dn4EiSCS.js} +1 -1
  174. package/static/auth-callback/assets/{waypoints-Bj6gAUSQ.js → waypoints-uqFQ3uEG.js} +1 -1
  175. package/static/auth-callback/assets/{workspace-layout-DK8mDzrY.js → workspace-layout-DLYK0Wwu.js} +1 -1
  176. package/static/auth-callback/auth-callback.html +1 -1
  177. package/static/dashboard/assets/{AiConfigContext-BsE7MqX8.js → AiConfigContext-DJcMECNw.js} +1 -1
  178. package/static/dashboard/assets/{AiConfigPage-DvM-lRXa.js → AiConfigPage-BvE7dOTy.js} +1 -1
  179. package/static/dashboard/assets/{DocumentProcessingPanel-BPfdlfuf.js → DocumentProcessingPanel-D9780krf.js} +1 -1
  180. package/static/dashboard/assets/{IndexLifecyclePanel--m0AGxvh.js → IndexLifecyclePanel-SjsUcnbM.js} +1 -1
  181. package/static/dashboard/assets/{IndexSubjectPanel-Bb7m1k3d.js → IndexSubjectPanel-C-ym2Tqi.js} +1 -1
  182. package/static/dashboard/assets/{ModelAssignmentsPanel-BLi_zbMa.js → ModelAssignmentsPanel-BRjZ-arB.js} +1 -1
  183. package/static/dashboard/assets/{ModelsPage-CxdpgnfR.js → ModelsPage-BtTU6du3.js} +6 -6
  184. package/static/dashboard/assets/NetworkPage-CV9qpkDg.js +2 -0
  185. package/static/dashboard/assets/{PaneListHeader-BBCMei0r.js → PaneListHeader-KyPTTBsv.js} +1 -1
  186. package/static/dashboard/assets/{SearchIndexingPanel-Ck4Y-xjR.js → SearchIndexingPanel-DolHGawg.js} +1 -1
  187. package/static/dashboard/assets/{StatusSubjectPanel-D1KWfAXE.js → StatusSubjectPanel-_YZvKiYi.js} +1 -1
  188. package/static/dashboard/assets/{StatusWorkspace-JbA5gzXx.js → StatusWorkspace-Dlbh_G40.js} +1 -1
  189. package/static/dashboard/assets/{SystemSettingsPage-BbwQWsSR.js → SystemSettingsPage-Be7QSIoz.js} +1 -1
  190. package/static/dashboard/assets/{SystemSettingsSubjectPanel-N117nMt5.js → SystemSettingsSubjectPanel-DBp0gja7.js} +1 -1
  191. package/static/dashboard/assets/{XpodAiConnectionsPodStore-CdDOb4SV.js → XpodAiConnectionsPodStore-ClpSjzpP.js} +7 -7
  192. package/static/dashboard/assets/{activity-DX1I96o_.js → activity-lsNbTXJu.js} +1 -1
  193. package/static/dashboard/assets/ai-connections-CXp5gd1J.js +1 -0
  194. package/static/dashboard/assets/{badge-k2vhtDqH.js → badge-CVatKjaG.js} +1 -1
  195. package/static/dashboard/assets/{collection-runtime-BFQ8teQJ.js → collection-runtime-Ec4UnY28.js} +1 -1
  196. package/static/dashboard/assets/{dashboard-DWZ-fmCT.js → dashboard-BEzsRsvF.js} +2 -2
  197. package/static/dashboard/assets/{dialog-1CCw-iHT.js → dialog-BuyelQ4V.js} +1 -1
  198. package/static/dashboard/assets/{download-C6-SNY1q.js → download-B4Nf678F.js} +1 -1
  199. package/static/dashboard/assets/{external-link-BgPcZ_j2.js → external-link-PYv9CvKL.js} +1 -1
  200. package/static/dashboard/assets/index-C9XPE-mI.js +4 -0
  201. package/static/dashboard/assets/{index-D7A8U6Pt.js → index-Cx69bTNh.js} +1 -1
  202. package/static/dashboard/assets/{index-6LcIUIYO.js → index-awr7ulur.js} +1 -1
  203. package/static/dashboard/assets/{key-round-BOd7Jo0Q.js → key-round-VsY80U1Z.js} +1 -1
  204. package/static/dashboard/assets/{rotate-ccw-CCgJqsvx.js → rotate-ccw-Cz1K4vE9.js} +1 -1
  205. package/static/dashboard/assets/{skeleton-Bc7abAn5.js → skeleton-BhNv_8tO.js} +1 -1
  206. package/static/dashboard/assets/{waypoints-s-opmJxx.js → waypoints-DYS9XFYV.js} +1 -1
  207. package/static/dashboard/assets/{workspace-layout-DqIQeTBV.js → workspace-layout-OZJAFx5V.js} +1 -1
  208. package/static/dashboard/dashboard.html +1 -1
  209. package/static/settings/assets/{AiConfigContext-BB9KZySa.js → AiConfigContext-B8JS3MXF.js} +1 -1
  210. package/static/settings/assets/{AiConfigPage-DGSXUkLs.js → AiConfigPage-C3Zl8LUl.js} +1 -1
  211. package/static/settings/assets/{DocumentProcessingPanel-Da2Re6Rg.js → DocumentProcessingPanel-DpDZAQvf.js} +1 -1
  212. package/static/settings/assets/{IndexLifecyclePanel-BSZuIzgr.js → IndexLifecyclePanel-Ec1XF88t.js} +1 -1
  213. package/static/settings/assets/{IndexSubjectPanel-CFd0ay-r.js → IndexSubjectPanel-BulT9BmO.js} +1 -1
  214. package/static/settings/assets/{ModelAssignmentsPanel-CSAryvWJ.js → ModelAssignmentsPanel-BcGSmYjb.js} +1 -1
  215. package/static/settings/assets/{ModelsPage-BQwCwLHU.js → ModelsPage-CvTCKy1T.js} +6 -6
  216. package/static/settings/assets/NetworkPage-DQF5u9Bn.js +2 -0
  217. package/static/settings/assets/{PaneListHeader-Bjh3hRdQ.js → PaneListHeader-D40hqcVl.js} +1 -1
  218. package/static/settings/assets/{SearchIndexingPanel-MjKL5QLU.js → SearchIndexingPanel-iCUPOx_0.js} +1 -1
  219. package/static/settings/assets/{StatusSubjectPanel-Bvl6K4mx.js → StatusSubjectPanel-E--ZHSql.js} +1 -1
  220. package/static/settings/assets/{StatusWorkspace-B0NzrP--.js → StatusWorkspace-YjDAx1II.js} +1 -1
  221. package/static/settings/assets/{SystemSettingsPage-D2z6Z4FE.js → SystemSettingsPage-CDdV3mC9.js} +1 -1
  222. package/static/settings/assets/{SystemSettingsSubjectPanel-4sxma4X4.js → SystemSettingsSubjectPanel-Br8WazDq.js} +1 -1
  223. package/static/settings/assets/XpodAiConnectionsPodStore-CLr38P_Z.js +3 -0
  224. package/static/settings/assets/{activity-CgJJGpjx.js → activity-C5DAHHTE.js} +1 -1
  225. package/static/settings/assets/ai-connections-C6yaE6WQ.js +1 -0
  226. package/static/settings/assets/{badge-C4NypVyT.js → badge-D8eIyxKt.js} +1 -1
  227. package/static/settings/assets/{collection-runtime-CTLCDxAi.js → collection-runtime-DLc9zil8.js} +1 -1
  228. package/static/settings/assets/{dialog-Csq0vWUi.js → dialog-CyuR7Va4.js} +1 -1
  229. package/static/settings/assets/{download-DaLJJ-Wp.js → download-c0oxZrCz.js} +1 -1
  230. package/static/settings/assets/{external-link--w_iW5Au.js → external-link-D3Z34fP_.js} +1 -1
  231. package/static/settings/assets/{index-BukHiu4y.js → index-CKGbRFlc.js} +1 -1
  232. package/static/settings/assets/index-CSr3-2Cj.js +4 -0
  233. package/static/settings/assets/{index-COmVnZi2.js → index-ComidxAm.js} +1 -1
  234. package/static/settings/assets/{index-browser-BGpvHwD0.js → index-browser-CAscEbae.js} +1 -1
  235. package/static/settings/assets/{key-round-Bk4YRjBu.js → key-round-DyjLmXuB.js} +1 -1
  236. package/static/settings/assets/{rotate-ccw-TCabbqsr.js → rotate-ccw-679HF_ec.js} +1 -1
  237. package/static/settings/assets/{settings-CJWpdbNC.js → settings-DKknqu4C.js} +3 -3
  238. package/static/settings/assets/{skeleton-JDHYVe7t.js → skeleton-CkopNkPB.js} +1 -1
  239. package/static/settings/assets/{waypoints-DDvEl-MU.js → waypoints-CrqfAftE.js} +1 -1
  240. package/static/settings/assets/{workspace-layout-DV5QU30U.js → workspace-layout-UN6c4qTG.js} +1 -1
  241. package/static/settings/settings.html +1 -1
  242. package/static/auth-callback/assets/NetworkPage-B3qBfANA.js +0 -2
  243. package/static/auth-callback/assets/XpodAiConnectionsPodStore-BJiXm-PF.js +0 -3
  244. package/static/auth-callback/assets/ai-connections-CryuHGKW.js +0 -1
  245. package/static/auth-callback/assets/index-DlLYWOhw.js +0 -4
  246. package/static/dashboard/assets/NetworkPage-BAIPw-D_.js +0 -2
  247. package/static/dashboard/assets/ai-connections-DwCRqOQa.js +0 -1
  248. package/static/dashboard/assets/index-UD6QOE7H.js +0 -4
  249. package/static/settings/assets/NetworkPage-BKymvsQc.js +0 -2
  250. package/static/settings/assets/XpodAiConnectionsPodStore-BkNQ8fZx.js +0 -3
  251. package/static/settings/assets/ai-connections-CryuHGKW.js +0 -1
  252. package/static/settings/assets/index-B0mQa59b.js +0 -4
  253. /package/node_modules/@undefineds.co/ai-connections/dist/{client → contract/client}/request.d.ts +0 -0
  254. /package/node_modules/@undefineds.co/ai-connections/dist/{client → contract/client}/types.js +0 -0
  255. /package/node_modules/@undefineds.co/ai-connections/dist/{client-config → contract/client-config}/base-adapter.d.ts +0 -0
  256. /package/node_modules/@undefineds.co/ai-connections/dist/{client-config → contract/client-config}/base-adapter.js +0 -0
  257. /package/node_modules/@undefineds.co/ai-connections/dist/{client-config → contract/client-config}/codex.d.ts +0 -0
  258. /package/node_modules/@undefineds.co/ai-connections/dist/{client-config → contract/client-config}/codex.js +0 -0
  259. /package/node_modules/@undefineds.co/ai-connections/dist/{client-config → contract/client-config}/index.d.ts +0 -0
  260. /package/node_modules/@undefineds.co/ai-connections/dist/{client-config → contract/client-config}/index.js +0 -0
  261. /package/node_modules/@undefineds.co/ai-connections/dist/{client-config → contract/client-config}/json-env-adapter.d.ts +0 -0
  262. /package/node_modules/@undefineds.co/ai-connections/dist/{client-config → contract/client-config}/json-env-adapter.js +0 -0
  263. /package/node_modules/@undefineds.co/ai-connections/dist/{client-config → contract/client-config}/pi.d.ts +0 -0
  264. /package/node_modules/@undefineds.co/ai-connections/dist/{client-config → contract/client-config}/pi.js +0 -0
  265. /package/node_modules/@undefineds.co/ai-connections/dist/{client-config → contract/client-config}/transaction.d.ts +0 -0
  266. /package/node_modules/@undefineds.co/ai-connections/dist/{client-config → contract/client-config}/transaction.js +0 -0
  267. /package/node_modules/@undefineds.co/ai-connections/dist/{client-config → contract/client-config}/types.d.ts +0 -0
  268. /package/node_modules/@undefineds.co/ai-connections/dist/{client-config → contract/client-config}/types.js +0 -0
  269. /package/node_modules/@undefineds.co/ai-connections/dist/{credential-storage.d.ts → contract/credential-storage.d.ts} +0 -0
  270. /package/node_modules/@undefineds.co/ai-connections/dist/{credential-storage.js → contract/credential-storage.js} +0 -0
  271. /package/node_modules/@undefineds.co/ai-connections/dist/{endpoint-urls.d.ts → contract/endpoint-urls.d.ts} +0 -0
  272. /package/node_modules/@undefineds.co/ai-connections/dist/{endpoint-urls.js → contract/endpoint-urls.js} +0 -0
@@ -1,2 +0,0 @@
1
- import{c as E,v as pe,r as d,Y as B,j as e,C as N,a as w,b as k,d as C,e as S,B as y,Z as se,R as xe,N as he,w as fe,x as be}from"./settings-CJWpdbNC.js";import{P as ve}from"./PaneListHeader-Bjh3hRdQ.js";import{N as re,W as je}from"./waypoints-DDvEl-MU.js";import{A as ie}from"./activity-CgJJGpjx.js";import{T as ge,u as ye}from"./workspace-layout-DV5QU30U.js";import{E as Ne}from"./external-link--w_iW5Au.js";import{B as L}from"./badge-C4NypVyT.js";import{R as we}from"./rotate-ccw-TCabbqsr.js";import{D as ke}from"./download-DaLJJ-Wp.js";const Ce=[["path",{d:"M17 19a1 1 0 0 1-1-1v-2a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2a1 1 0 0 1-1 1z",key:"trhst0"}],["path",{d:"M17 21v-2",key:"ds4u3f"}],["path",{d:"M19 14V6.5a1 1 0 0 0-7 0v11a1 1 0 0 1-7 0V10",key:"1mo9zo"}],["path",{d:"M21 21v-2",key:"eo0ou"}],["path",{d:"M3 5V3",key:"1k5hjh"}],["path",{d:"M4 10a2 2 0 0 1-2-2V6a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2a2 2 0 0 1-2 2z",key:"1dd30t"}],["path",{d:"M7 5V3",key:"1t1388"}]],Se=E("cable",Ce);const Pe=[["path",{d:"M21.54 15H17a2 2 0 0 0-2 2v4.54",key:"1djwo0"}],["path",{d:"M7 3.34V5a3 3 0 0 0 3 3a2 2 0 0 1 2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2c0-1.1.9-2 2-2h3.17",key:"1tzkfa"}],["path",{d:"M11 21.95V18a2 2 0 0 0-2-2a2 2 0 0 1-2-2v-1a2 2 0 0 0-2-2H2.05",key:"14pb5j"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]],le=E("earth",Pe);const Re=[["circle",{cx:"12",cy:"16",r:"1",key:"1au0dj"}],["rect",{x:"3",y:"10",width:"18",height:"12",rx:"2",key:"6s8ecr"}],["path",{d:"M7 10V7a5 5 0 0 1 10 0v3",key:"1pqi11"}]],De=E("lock-keyhole",Re);const Te=[["path",{d:"M16.247 7.761a6 6 0 0 1 0 8.478",key:"1fwjs5"}],["path",{d:"M19.075 4.933a10 10 0 0 1 0 14.134",key:"ehdyv1"}],["path",{d:"M4.925 19.067a10 10 0 0 1 0-14.134",key:"1q22gi"}],["path",{d:"M7.753 16.239a6 6 0 0 1 0-8.478",key:"r2q7qm"}],["circle",{cx:"12",cy:"12",r:"2",key:"1c9p78"}]],Ae=E("radio",Te);const Ee=[["circle",{cx:"6",cy:"19",r:"3",key:"1kj8tv"}],["path",{d:"M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15",key:"1d8sl"}],["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}]],Le=E("route",Ee);const Ie=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],Me=E("shield-check",Ie);const $e=[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0",key:"dnpr2z"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0",key:"1x1e6c"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}]],Oe=E("wifi",$e);async function Ue({fetchImpl:t}){return Y(t,X("/api/network/settings/status"),{method:"GET",credentials:"include",headers:{accept:"application/json"}})}async function qe({fetchImpl:t}){return Y(t,X("/api/network/settings/diagnose"),{method:"POST",credentials:"include",headers:{accept:"application/json"}})}async function He({fetchImpl:t}){await Y(t,X("/api/network/settings/certificate/renew"),{method:"POST",credentials:"include",headers:{accept:"application/json"}})}async function ze({podUrl:t,fetchImpl:a,patch:s}){return Y(a,Ve("/api/network/settings/configuration",t),{method:"PUT",credentials:"include",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify(s)})}function X(t){const a=typeof window>"u"?"http://localhost":window.location.origin;return new URL(t,a).toString()}function Ve(t,a){return a?new URL(t,a).toString():X(t)}async function Y(t,a,s){const r=await t(a,s);if(!r.ok)throw await r.arrayBuffer(),new Error("Network settings request failed. Please try again.");if(!r.headers.get("content-type")?.includes("application/json"))throw await r.arrayBuffer(),new Error("Network settings request failed. Please try again.");return await r.json()}const te=[{id:"overview",label:"Overview",path:"",icon:re},{id:"endpoints",label:"Endpoints",path:"endpoints",icon:Se},{id:"addresses",label:"Addresses",path:"addresses",icon:le},{id:"domain-dns",label:"Domain & DNS",path:"domain-dns",icon:Le},{id:"https",label:"HTTPS",path:"https",icon:De},{id:"tunnel-profiles",label:"Tunnel Profiles",path:"tunnel-profiles",icon:je},{id:"p2p",label:"P2P",path:"p2p",icon:Ae},{id:"diagnostics",label:"Diagnostics",path:"diagnostics",icon:ie}];function Be(t){const a=["Xpod Network Diagnostics",`Generated: ${t.generatedAt}`,`Canonical URL: ${t.endpoint??"Unavailable"}`],s=t.checks.flatMap(r=>["",`[${r.status.toUpperCase()}] ${r.label}`,...r.detail?[r.detail]:[]]);return[...a,...s].join(`
2
- `)}function jt(){const t=pe(),[a,s]=d.useState(),[r,n]=d.useState([]),[l,o]=d.useState(),[x,u]=d.useState(),[P,h]=d.useState(!1),[T,$]=d.useState(!1),[i,p]=d.useState(!1),[v,R]=d.useState(!1),[_,de]=d.useState(),O=d.useRef(0),U=d.useRef(0),q=d.useRef(0),H=d.useRef(void 0),z=d.useRef(!0),F=typeof window>"u"?void 0:window.location.origin,g=F?`local-host:${F}`:void 0,D=globalThis.fetch;d.useEffect(()=>(z.current=!0,()=>{z.current=!1,O.current+=1,U.current+=1,q.current+=1}),[]);const K=d.useCallback((c,m)=>z.current&&O.current===c&&H.current===m,[]),W=d.useCallback((c,m)=>z.current&&U.current===c&&H.current===m,[]),G=d.useCallback((c,m)=>z.current&&q.current===c&&H.current===m,[]),V=d.useCallback(async()=>{const c=g;if(!c)return;const m=O.current+1;O.current=m,h(!0),u(void 0);try{const A=await Ue({fetchImpl:D});K(m,c)&&s(A)}catch{K(m,c)&&u("网络设置请求失败,请重试。")}finally{K(m,c)&&h(!1)}},[D,g,K]);d.useEffect(()=>{let c=!1;return H.current=g,O.current+=1,U.current+=1,q.current+=1,queueMicrotask(()=>{c||H.current!==g||(s(void 0),n([]),o(void 0),u(void 0),h(!1),$(!1),p(!1),g&&V())}),()=>{c=!0}},[g,V]);const ce=d.useCallback(async()=>{const c=g;if(!c)return;const m=U.current+1;U.current=m,$(!0),u(void 0);try{const A=await qe({fetchImpl:D});W(m,c)&&(n(A.checks),o(new Date),B({description:"诊断完成"}))}catch{W(m,c)&&u("网络诊断失败,请重试。")}finally{W(m,c)&&$(!1)}},[D,g,W]),ue=d.useCallback(async()=>{const c=g;if(!c)return;const m=q.current+1;q.current=m,p(!0),u(void 0);try{await He({fetchImpl:D}),G(m,c)&&(B({variant:"success",description:"证书续签成功"}),await V())}catch{G(m,c)&&u("证书续签失败,请重试。")}finally{G(m,c)&&p(!1)}},[D,g,G,V]),J=d.useCallback(async c=>{if(F){R(!0),u(void 0);try{const m=await ze({fetchImpl:D,patch:c});s(A=>A&&{...A,configuration:m.configuration}),de(m.applyState),B({variant:"success",description:"Network configuration saved"})}catch{u("网络配置保存失败,请重试。")}finally{R(!1)}}},[D,F]),me=d.useMemo(()=>[{key:"local",title:"本机",values:a?.addresses.local??[]},{key:"lan",title:"局域网",values:a?.addresses.lan??[]},{key:"public",title:"公网",values:a?.addresses.public??[]}],[a]),ne=t.pathname.split("/").filter(Boolean).at(-1),b=te.some(c=>c.path===ne)?ne:"overview";return e.jsx(ge,{mode:"auto",listHeader:e.jsx(ve,{title:"Network"}),list:e.jsx(_e,{}),mainHeader:e.jsx(Fe,{title:te.find(c=>(c.path||"overview")===b)?.label??"Overview",loading:P,stale:P&&!!a,onRefresh:V}),main:e.jsxs("section",{className:"flex min-h-full flex-col gap-4 bg-background p-6",children:[x?e.jsx("div",{role:"alert",className:"rounded-md border border-destructive/30 bg-destructive/10 px-4 py-3 text-sm text-destructive",children:x}):null,(b==="overview"||b==="endpoints")&&e.jsx(Qe,{endpoint:a?.endpoint,loading:P&&!a}),b==="overview"&&e.jsx(Ke,{status:a}),(b==="overview"||b==="addresses")&&e.jsx(tt,{sections:me,loading:P&&!a,diagnostics:r,checkedAt:l}),b==="overview"&&e.jsx(lt,{status:a}),b==="domain-dns"&&e.jsxs(e.Fragment,{children:[e.jsx(rt,{status:a}),e.jsx(Ge,{configuration:a?.configuration,saving:v,applyState:_,onSave:J})]}),b==="https"&&e.jsxs(e.Fragment,{children:[e.jsx(it,{status:a}),e.jsx(Je,{configuration:a?.configuration,saving:v,applyState:_,onSave:J})]}),b==="tunnel-profiles"&&e.jsxs(e.Fragment,{children:[e.jsx(We,{title:"Observed tunnel",label:"Tunnel",capability:a?.tunnel}),e.jsx(Xe,{configuration:a?.configuration,saving:v,applyState:_,onSave:J})]}),b==="p2p"&&e.jsx(Ze,{configuration:a?.configuration,saving:v,applyState:_,onSave:J}),(b==="overview"||b==="diagnostics"||b==="https")&&e.jsx(ot,{status:a,endpoint:a?.endpoint,diagnostics:r,diagnosing:T,renewing:i,onDiagnose:ce,onRenewCertificate:ue})]}),className:"min-h-full"})}function _e(){const t=ye();return e.jsx("aside",{className:"h-full border-r border-border bg-muted/20 py-2",children:e.jsx("nav",{"aria-label":"Network sections","data-list-navigation":!0,children:te.map(a=>{const s=a.icon,r=`/network${a.path?`/${a.path}`:""}`;return e.jsxs(he,{to:r,onClick:()=>t.openMain(),onKeyDown:fe,className:({isActive:n})=>be(n,{compact:!1}),end:a.path==="",children:[e.jsx(s,{className:"h-4 w-4","aria-hidden":"true"}),a.label]},a.id)})})})}function Fe({title:t,loading:a,stale:s,onRefresh:r}){return e.jsxs("div",{className:"flex h-full min-w-0 items-center justify-between gap-4 px-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("h1",{className:"text-sm font-semibold text-foreground",children:["Network · ",t]}),e.jsx("div",{className:"truncate text-xs text-muted-foreground","aria-live":"polite",children:s?"Refreshing · showing previous snapshot":"接入点、DNS、TLS、隧道与连通性诊断"})]}),e.jsx("div",{className:"flex items-center gap-2",children:e.jsxs(y,{type:"button",size:"sm",variant:"outline",onClick:r,disabled:a,children:[e.jsx(xe,{className:"mr-2 h-4 w-4","aria-hidden":"true"}),"刷新"]})})]})}function Ke({status:t}){const a=t?.addresses.public[0]??t?.addresses.lan[0]??t?.addresses.local[0]??t?.endpoint,s=t?!t.dns.supported||t.dns.status==="unsupported"?"Configure Domain & DNS, then recheck observed DNS.":!t.tls.supported||!["valid","active","ready"].includes(t.tls.status)?"Review HTTPS configuration and certificate renewal evidence.":"No connectivity action is currently required.":"Refresh network status.";return e.jsxs(N,{children:[e.jsxs(w,{children:[e.jsx(k,{className:"text-base",children:"Recommended access path"}),e.jsx(C,{children:"Chosen from observed public, LAN, then local reachability"})]}),e.jsxs(S,{className:"space-y-3 text-sm",children:[e.jsx("div",{className:"break-words font-medium",children:a??"Unavailable"}),e.jsxs("div",{className:"grid gap-2 sm:grid-cols-4",children:[e.jsxs(L,{variant:"outline",children:["Local ",t?.addresses.local.length?"available":"unavailable"]}),e.jsxs(L,{variant:"outline",children:["LAN ",t?.addresses.lan.length?"available":"unavailable"]}),e.jsxs(L,{variant:"outline",children:["Public ",t?.addresses.public.length?"available":"unavailable"]}),e.jsxs(L,{variant:"outline",children:["Tunnel ",t?.tunnel.status??"unknown"]})]}),e.jsxs("div",{className:"rounded-md border border-border bg-muted/30 p-3",children:[e.jsx("div",{className:"font-medium",children:"Next action"}),e.jsx("div",{className:"mt-1 text-muted-foreground",children:s})]})]})]})}function We({title:t,label:a,capability:s,extra:r}){return e.jsxs(N,{children:[e.jsxs(w,{children:[e.jsx(k,{className:"text-base",children:t}),e.jsx(C,{children:"Observed runtime state"})]}),e.jsx(S,{children:e.jsx(M,{label:a,capability:s,extra:r})})]})}function Z({title:t}){return e.jsxs(N,{children:[e.jsxs(w,{children:[e.jsx(k,{className:"text-base",children:t}),e.jsx(C,{children:"Desired configuration"})]}),e.jsxs(S,{className:"text-sm text-muted-foreground",children:["This runtime does not report a configurable ",t," capability."]})]})}function Ge({configuration:t,saving:a,applyState:s,onSave:r}){const[n,l]=d.useState(t?.domainDns),[o,x]=d.useState("");return d.useEffect(()=>{let u=!1;return queueMicrotask(()=>{u||l(t?.domainDns)}),()=>{u=!0}},[t]),n?e.jsxs(Q,{title:"Saved configuration",applyState:s,children:[e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(j,{name:"domain",label:"Domain",value:n.domain,onChange:u=>l({...n,domain:u})}),e.jsx(j,{name:"provider",label:"DNS provider",value:n.provider,onChange:u=>l({...n,provider:u})}),e.jsx(oe,{name:"recordTtl",label:"Record TTL (seconds)",value:n.recordTtl,min:30,max:86400,onChange:u=>l({...n,recordTtl:u})}),e.jsx(j,{name:"dnsCredential",label:n.credentialConfigured?"Replace credential (configured)":"Credential",value:o,type:"password",onChange:x})]}),e.jsx(ae,{label:"Enable DDNS",checked:n.ddnsEnabled,onChange:u=>l({...n,ddnsEnabled:u})}),e.jsx(ee,{label:"Save DNS configuration",saving:a,onClick:()=>r({domainDns:{domain:n.domain,ddnsEnabled:n.ddnsEnabled,provider:n.provider,recordTtl:n.recordTtl,...o?{credential:o}:{}}})})]}):e.jsx(Z,{title:"Domain & DNS"})}function Je({configuration:t,saving:a,applyState:s,onSave:r}){const[n,l]=d.useState(t?.https);return d.useEffect(()=>{let o=!1;return queueMicrotask(()=>{o||l(t?.https)}),()=>{o=!0}},[t]),n?e.jsxs(Q,{title:"Saved configuration",applyState:s,children:[e.jsx(ae,{label:"Enable HTTPS",checked:n.enabled,onChange:o=>l({...n,enabled:o})}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(j,{name:"acmeEmail",label:"ACME email",value:n.acmeEmail,onChange:o=>l({...n,acmeEmail:o})}),e.jsx(j,{name:"acmeDomains",label:"Certificate domains",value:n.domains.join(", "),onChange:o=>l({...n,domains:o.split(",").map(x=>x.trim()).filter(Boolean)})}),e.jsx(j,{name:"certificatePath",label:"Certificate path",value:n.certificatePath??"",onChange:o=>l({...n,certificatePath:o})}),e.jsx(j,{name:"certificateKeyPath",label:"Private-key path",value:n.certificateKeyPath??"",onChange:o=>l({...n,certificateKeyPath:o})}),e.jsx(oe,{name:"renewBeforeDays",label:"Renew before (days)",value:n.renewBeforeDays,min:1,max:90,onChange:o=>l({...n,renewBeforeDays:o})})]}),e.jsx(ee,{label:"Save HTTPS configuration",saving:a,onClick:()=>r({https:n})})]}):e.jsx(Z,{title:"HTTPS"})}function Xe({configuration:t,saving:a,applyState:s,onSave:r}){const[n,l]=d.useState(t?.tunnelProfiles.activeProfileId??""),[o,x]=d.useState(t?.tunnelProfiles.profiles??[]),[u,P]=d.useState({});if(d.useEffect(()=>{let i=!1;return queueMicrotask(()=>{i||(l(t?.tunnelProfiles.activeProfileId??""),x(t?.tunnelProfiles.profiles??[]),P({}))}),()=>{i=!0}},[t]),!t)return e.jsx(Z,{title:"Tunnel Profiles"});const h=(i,p)=>x(v=>v.map(R=>R.id===i?{...R,...p}:R)),T=()=>{const i=`tunnel-${Date.now()}`;x(p=>[...p,{id:i,provider:"ngrok",label:"New tunnel",credentialConfigured:!1,parameters:{}}])},$=i=>{x(p=>p.filter(v=>v.id!==i)),n===i&&l("")};return e.jsxs(Q,{title:"Saved tunnel profiles",applyState:s,children:[e.jsxs("label",{className:"block space-y-2 text-sm font-medium",children:["Active profile",e.jsxs("select",{value:n,onChange:i=>l(i.target.value),className:"block h-10 w-full rounded-md border border-input bg-background px-3 sm:max-w-sm",children:[e.jsx("option",{value:"",children:"None"}),o.map(i=>e.jsxs("option",{value:i.id,children:[i.label," · ",i.provider]},i.id))]})]}),e.jsx("div",{className:"space-y-3",children:o.map(i=>e.jsxs("div",{className:"space-y-3 rounded-md border border-border p-3 text-sm",children:[e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2",children:[e.jsx(j,{name:`tunnel-label-${i.id}`,label:"Label",value:i.label,onChange:p=>h(i.id,{label:p})}),e.jsxs("label",{className:"block space-y-2 text-sm font-medium",children:["Provider",e.jsxs("select",{value:i.provider,onChange:p=>h(i.id,{provider:p.target.value,parameters:{}}),className:"block h-10 w-full rounded-md border border-input bg-background px-3",children:[e.jsx("option",{value:"ngrok",children:"ngrok"}),e.jsx("option",{value:"cloudflare",children:"Cloudflare"}),e.jsx("option",{value:"frp",children:"frp"})]})]}),e.jsx(j,{name:`tunnel-url-${i.id}`,label:"Public endpoint",value:i.publicEndpoint??"",onChange:p=>h(i.id,{publicEndpoint:p})}),e.jsx(j,{name:`tunnel-credential-${i.id}`,label:i.credentialConfigured?"Replace credential (configured)":"Credential",type:"password",value:u[i.id]??"",onChange:p=>P(v=>({...v,[i.id]:p}))})]}),e.jsxs("details",{children:[e.jsx("summary",{className:"cursor-pointer font-medium",children:"Provider-specific parameters"}),e.jsx("div",{className:"mt-3 grid gap-3 sm:grid-cols-2",children:Ye(i.provider).map(({key:p,label:v})=>e.jsx(j,{name:`tunnel-${p}-${i.id}`,label:v,value:i.parameters?.[p]??"",onChange:R=>h(i.id,{parameters:{...i.parameters,[p]:R}})},p))})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsxs("span",{className:"text-xs text-muted-foreground",children:[n===i.id?"Active after restart":"Inactive"," · credential ",i.credentialConfigured?"configured":"missing"]}),e.jsx(y,{type:"button",size:"sm",variant:"ghost",onClick:()=>$(i.id),children:"Remove"})]})]},i.id))}),e.jsx(y,{type:"button",size:"sm",variant:"outline",onClick:T,children:"Add tunnel profile"}),e.jsx(ee,{label:"Save tunnel profiles",saving:a,onClick:()=>r({tunnelProfiles:{activeProfileId:n,profiles:o.map(i=>({id:i.id,provider:i.provider,label:i.label,publicEndpoint:i.publicEndpoint,parameters:i.parameters,...u[i.id]?{credential:u[i.id]}:{}}))}})})]})}function Ye(t){return t==="ngrok"?[{key:"region",label:"Region"},{key:"hostname",label:"Reserved hostname"}]:t==="cloudflare"?[{key:"tunnelId",label:"Tunnel ID"},{key:"hostname",label:"Hostname"}]:[{key:"serverHost",label:"Server host"},{key:"serverPort",label:"Server port"},{key:"remotePort",label:"Remote port"}]}function Ze({configuration:t,saving:a,applyState:s,onSave:r}){const[n,l]=d.useState(t?.p2p);return d.useEffect(()=>{let o=!1;return queueMicrotask(()=>{o||l(t?.p2p)}),()=>{o=!0}},[t]),n?e.jsxs(Q,{title:"Saved P2P configuration",applyState:s,children:[e.jsx(ae,{label:"Enable P2P fallback",checked:n.enabled,onChange:o=>l({...n,enabled:o})}),e.jsx(j,{name:"signalService",label:"Signal service",value:n.signalService,onChange:o=>l({...n,signalService:o})}),e.jsxs("label",{className:"block space-y-2 text-sm font-medium",children:["Fallback policy",e.jsxs("select",{value:n.fallbackPolicy,onChange:o=>l({...n,fallbackPolicy:o.target.value}),className:"block h-10 w-full rounded-md border border-input bg-background px-3 sm:max-w-sm",children:[e.jsx("option",{value:"never",children:"Never"}),e.jsx("option",{value:"when-direct-unavailable",children:"When direct is unavailable"}),e.jsx("option",{value:"prefer-p2p",children:"Prefer P2P"})]})]}),e.jsx(ee,{label:"Save P2P configuration",saving:a,onClick:()=>r({p2p:n})})]}):e.jsx(Z,{title:"P2P"})}function Q({title:t,applyState:a,children:s}){return e.jsxs(N,{children:[e.jsxs(w,{children:[e.jsx(k,{className:"text-base",children:t}),e.jsx(C,{children:"Desired configuration · not presented as observed until verified"})]}),e.jsxs(S,{className:"space-y-4",children:[a==="restart-required"?e.jsx("div",{role:"status",className:"rounded-md border border-amber-300 bg-amber-50 px-3 py-2 text-sm text-amber-800 dark:bg-amber-950/20 dark:text-amber-200",children:"Saved · restart required"}):null,s]})]})}function j({name:t,label:a,value:s,type:r="text",onChange:n}){return e.jsxs("label",{className:"block space-y-2 text-sm font-medium",children:[a,e.jsx("input",{name:t,type:r,value:s,onChange:l=>n(l.target.value),className:"block h-10 w-full rounded-md border border-input bg-background px-3 text-sm"})]})}function oe({name:t,label:a,value:s,min:r,max:n,onChange:l}){return e.jsxs("label",{className:"block space-y-2 text-sm font-medium",children:[a,e.jsx("input",{name:t,type:"number",value:s,min:r,max:n,onChange:o=>l(o.target.valueAsNumber),className:"block h-10 w-full rounded-md border border-input bg-background px-3 text-sm"})]})}function ae({label:t,checked:a,onChange:s}){return e.jsxs("label",{className:"flex items-center justify-between gap-3 rounded-md border border-border p-3 text-sm font-medium",children:[t,e.jsx("input",{type:"checkbox",checked:a,onChange:r=>s(r.target.checked)})]})}function ee({label:t,saving:a,onClick:s}){return e.jsx("div",{className:"flex justify-end",children:e.jsx(y,{type:"button",onClick:s,disabled:a,children:a?"Saving…":t})})}function Qe({endpoint:t,loading:a}){const s=[{label:"Canonical URL",value:t},{label:"API endpoint",value:t?et(t,"/api/"):void 0}],r=async(n,l)=>{await window.navigator.clipboard.writeText(l),B({description:`${n} copied`})};return e.jsxs(N,{children:[e.jsxs(w,{children:[e.jsxs(k,{className:"flex items-center gap-2 text-base",children:[e.jsx(le,{className:"h-4 w-4","aria-hidden":"true"}),"接入点"]}),e.jsx(C,{children:a?"正在解析接入点":"Observed endpoints · Currently effective route is the canonical URL"})]}),e.jsx(S,{className:"space-y-3",children:s.map(({label:n,value:l})=>e.jsxs("div",{className:"flex items-start justify-between gap-3 rounded-md border border-border p-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-xs font-medium text-muted-foreground",children:n}),e.jsx("div",{className:"mt-1 break-words text-sm text-foreground",children:l||"Unavailable"})]}),l?e.jsxs("div",{className:"flex shrink-0 gap-1",children:[e.jsx(y,{type:"button",size:"icon",variant:"ghost","aria-label":`Copy ${n}`,onClick:()=>{r(n,l)},children:e.jsx(se,{className:"h-4 w-4","aria-hidden":"true"})}),e.jsx(y,{type:"button",size:"icon",variant:"ghost","aria-label":`Open ${n}`,onClick:()=>window.open(l,"_blank","noopener,noreferrer"),children:e.jsx(Ne,{className:"h-4 w-4","aria-hidden":"true"})})]}):null]},n))})]})}function et(t,a){try{return new URL(a,t).toString()}catch{return t}}function tt({sections:t,loading:a,diagnostics:s,checkedAt:r}){return e.jsxs(N,{children:[e.jsxs(w,{children:[e.jsxs(k,{className:"flex items-center gap-2 text-base",children:[e.jsx(Oe,{className:"h-4 w-4","aria-hidden":"true"}),"网络地址"]}),e.jsx(C,{children:a?"正在刷新地址":"由运行时网络能力上报"})]}),e.jsx(S,{className:"space-y-4",children:t.map(n=>e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-medium text-muted-foreground",children:n.title}),n.values.length>0?e.jsx("div",{className:"mt-1 space-y-1",children:n.values.map(l=>e.jsx(at,{scope:n.key,value:l,diagnostics:s,checkedAt:r},l))}):e.jsx("div",{className:"mt-1 text-sm text-muted-foreground",children:"未提供"})]},n.key))})]})}function at({scope:t,value:a,diagnostics:s,checkedAt:r}){const n=nt(a),l=s.find(o=>o.id==="endpoint");return e.jsxs("div",{className:"rounded-md border border-border p-3 text-sm",children:[e.jsx("div",{className:"break-words font-medium text-foreground",children:a}),e.jsxs("dl",{className:"mt-2 grid gap-x-4 gap-y-1 text-xs sm:grid-cols-2",children:[e.jsx(f,{label:"Interface",value:t==="local"?"Loopback":t==="lan"?"LAN interface (name not reported)":"Public route"}),e.jsx(f,{label:"IP version",value:n.ipVersion}),e.jsx(f,{label:"Port",value:n.port}),e.jsx(f,{label:"Reachability",value:l?st(l.status):"Not checked"}),e.jsx(f,{label:"Latency",value:l?.durationMs==null?"Not checked":`${l.durationMs} ms`}),e.jsx(f,{label:"Last checked",value:l?.checkedAt?I(l.checkedAt):r?r.toLocaleString():"Not checked"})]})]})}function f({label:t,value:a}){return e.jsxs("div",{className:"flex justify-between gap-3",children:[e.jsx("dt",{className:"text-muted-foreground",children:t}),e.jsx("dd",{className:"text-right text-foreground",children:a})]})}function nt(t){try{const a=new URL(t),s=a.hostname.replace(/^\[|\]$/g,"");return{ipVersion:s.includes(":")?"IPv6":/^\d{1,3}(?:\.\d{1,3}){3}$/.test(s)?"IPv4":"Resolved hostname",port:a.port||(a.protocol==="https:"?"443":a.protocol==="http:"?"80":"Not reported")}}catch{return{ipVersion:"Not reported",port:"Not reported"}}}function st(t){return t==="ok"?"Reachable":t==="warning"?"Warning":t==="error"?"Unreachable":"Unsupported"}function rt({status:t}){const a=t?.configuration?.domainDns,s=(t?.addresses.public??[]).map(r=>{try{return new URL(r).hostname}catch{return r}});return e.jsxs(N,{children:[e.jsxs(w,{children:[e.jsx(k,{className:"text-base",children:"Observed DNS"}),e.jsx(C,{children:"Observed state is kept separate from desired DNS policy."})]}),e.jsxs(S,{className:"space-y-3",children:[e.jsx(M,{label:"Runtime status",capability:t?.dns}),e.jsxs("dl",{className:"grid gap-2 text-sm sm:grid-cols-2",children:[e.jsx(f,{label:"Observed hostnames",value:s.join(", ")||"Not reported"}),e.jsx(f,{label:"Expected domain",value:a?.domain||"Not configured"}),e.jsx(f,{label:"Expected value",value:t?.addresses.public[0]||"Not reported"}),e.jsx(f,{label:"Provider",value:a?.provider||"Not configured"})]})]})]})}function it({status:t}){const a=t?.configuration?.https;return e.jsxs(N,{children:[e.jsxs(w,{children:[e.jsx(k,{className:"text-base",children:"Observed HTTPS"}),e.jsx(C,{children:"Certificate evidence reported by the active runtime."})]}),e.jsxs(S,{className:"space-y-3",children:[e.jsx(M,{label:"TLS",capability:t?.tls,extra:t?.tls.expiresAt?`Expires ${I(t.tls.expiresAt)}`:void 0}),e.jsxs("dl",{className:"grid gap-2 text-sm sm:grid-cols-2",children:[e.jsx(f,{label:"Certificate domains",value:t?.tls.domains?.join(", ")||a?.domains.join(", ")||"Not reported"}),e.jsx(f,{label:"Issuer",value:t?.tls.issuer||"Not reported by runtime"}),e.jsx(f,{label:"Validity",value:t?.tls.validFrom?`${I(t.tls.validFrom)} — ${t.tls.expiresAt?I(t.tls.expiresAt):"open"}`:t?.tls.status??"Not reported"}),e.jsx(f,{label:"Expiry",value:t?.tls.expiresAt?I(t.tls.expiresAt):"Not reported"}),e.jsx(f,{label:"Renewal status",value:t?.tls.renewalStatus||(t?.actions.renewCertificate?"Renewal available":"Renewal unavailable")}),e.jsx(f,{label:"Renewal policy",value:a?`${a.renewBeforeDays} days before expiry`:"Not configured"})]})]})]})}function lt({status:t}){return e.jsxs(N,{children:[e.jsxs(w,{children:[e.jsxs(k,{className:"flex items-center gap-2 text-base",children:[e.jsx(re,{className:"h-4 w-4","aria-hidden":"true"}),"网络能力"]}),e.jsx(C,{children:"服务端声明的网络支持"})]}),e.jsxs(S,{className:"grid gap-3 text-sm",children:[e.jsx(M,{label:"TLS",capability:t?.tls,extra:t?.tls.expiresAt?`到期时间 ${I(t.tls.expiresAt)}`:void 0}),e.jsx(M,{label:"DNS",capability:t?.dns}),e.jsx(M,{label:"Tunnel",capability:t?.tunnel})]})]})}function ot({status:t,endpoint:a,diagnostics:s,diagnosing:r,renewing:n,onDiagnose:l,onRenewCertificate:o}){const x=s.length>0?Be({generatedAt:new Date().toISOString(),endpoint:a,checks:s}):void 0,u=async()=>{x&&(await window.navigator.clipboard.writeText(x),B({description:"Diagnostic report copied"}))},P=()=>{if(!x)return;const h=URL.createObjectURL(new Blob([x],{type:"text/plain;charset=utf-8"})),T=document.createElement("a");T.href=h,T.download=`xpod-network-diagnostics-${new Date().toISOString().replace(/[:.]/g,"-")}.txt`,T.click(),URL.revokeObjectURL(h)};return e.jsxs(N,{children:[e.jsxs(w,{children:[e.jsxs(k,{className:"flex items-center gap-2 text-base",children:[e.jsx(ie,{className:"h-4 w-4","aria-hidden":"true"}),"操作"]}),e.jsx(C,{children:"仅显示网络能力允许的操作"})]}),e.jsxs(S,{className:"space-y-4",children:[e.jsxs("div",{className:"flex flex-wrap gap-2",children:[t?.actions.diagnose?e.jsxs(y,{type:"button",size:"sm",variant:"outline",onClick:l,disabled:r,children:[e.jsx(Me,{className:"mr-2 h-4 w-4","aria-hidden":"true"}),"连通性诊断"]}):null,t?.actions.renewCertificate?e.jsxs(y,{type:"button",size:"sm",variant:"subtle",onClick:o,disabled:n,children:[e.jsx(we,{className:"mr-2 h-4 w-4","aria-hidden":"true"}),"续签证书"]}):null,e.jsxs(y,{type:"button",size:"sm",variant:"outline",onClick:()=>{u()},disabled:!x,children:[e.jsx(se,{className:"mr-2 h-4 w-4","aria-hidden":"true"}),"Copy diagnostics"]}),e.jsxs(y,{type:"button",size:"sm",variant:"outline",onClick:P,disabled:!x,children:[e.jsx(ke,{className:"mr-2 h-4 w-4","aria-hidden":"true"}),"Export diagnostics"]})]}),s.length>0?e.jsx("div",{className:"space-y-2",children:s.map(h=>e.jsxs("div",{className:"rounded-md border border-border bg-muted/30 p-3",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsx("div",{className:"text-sm font-medium text-foreground",children:h.label}),e.jsx(L,{variant:h.status==="ok"?"secondary":"outline",children:h.status})]}),h.detail?e.jsx("div",{className:"mt-1 break-words text-xs text-muted-foreground",children:h.detail}):null]},h.id))}):e.jsx("div",{className:"text-sm text-muted-foreground",children:"尚未运行过诊断。"})]})]})}function M({label:t,capability:a,extra:s}){const r=a?.supported===!0;return e.jsxs("div",{className:"rounded-md border border-border bg-muted/30 p-3",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-sm font-medium text-foreground",children:r?t:`${t} 不支持`}),e.jsx("div",{className:"text-xs text-muted-foreground",children:a?.status??"读取中"})]}),e.jsx(L,{variant:r?"secondary":"outline",children:r?"支持":"不支持"})]}),s?e.jsx("div",{className:"mt-2 text-xs text-muted-foreground",children:s}):null]})}function I(t){if(!t)return"暂无记录";const a=new Date(t);return Number.isNaN(a.getTime())?"暂无记录":a.toLocaleString()}export{jt as default};
@@ -1,3 +0,0 @@
1
- import{q as h,k as f,s as w,h as J,t as pe}from"./settings-CJWpdbNC.js";import{r as me,a as he,b as be}from"./index-browser-BGpvHwD0.js";import{A as ae,s as O,d as B,c as k,o as X,p as ye,b as z,e as we,C as L}from"./ai-connections-CryuHGKW.js";function ve(e){const t=new TextEncoder().encode(JSON.stringify(e));let r="";for(const o of t)r+=String.fromCharCode(o);return btoa(r)}function Ie(e){const t=atob(e),r=Uint8Array.from(t,o=>o.charCodeAt(0));return JSON.parse(new TextDecoder().decode(r))}function ge(e){return JSON.stringify({algorithm:"PLAINTEXT",encoding:"base64",ciphertext:ve(e.secret),webId:e.webId,credentialIri:e.credentialIri,provider:e.provider})}function Se(e){if(!(typeof e.envelope!="string"||!e.envelope.trim()))try{const t=JSON.parse(e.envelope);if(t.algorithm!=="PLAINTEXT"||t.webId!==e.webId||t.provider!==e.provider||t.credentialIri!==e.credentialIri)return;const r=t.encoding==="base64"?Ie(String(t.ciphertext)):JSON.parse(String(t.ciphertext));return typeof r=="object"&&r!==null&&!Array.isArray(r)?r:void 0}catch{return}}function Re(e){return h.buildId({id:e})}function _e(e){return h.buildId({id:`custom-instance-${encodeURIComponent(e)}.ttl#this`})}function Q(e,t){const r=crypto.randomUUID();return t==="local"?`${e}-local-${r}`:`${e}-${r}`}function Ye(e){const t=(e.split("#",1)[0]??e).split("/").filter(Boolean).at(-1)??"",r=t.endsWith(".ttl")?t.slice(0,-4):t;if(r)return r.startsWith("custom-")||r==="custom"?"custom":ae.find(o=>r===o||r.startsWith(`${o}-`))}function A(e){if(!e)return;const t=e.split("#",1)[0]??e,r=t.split("/").filter(Boolean).at(-1)??t;if(!r)return;const o=r.endsWith(".ttl")?r:`${r}.ttl`,n=e.indexOf("#");return n<0?o:`${o}${e.slice(n)}`}function _(e){const t=A(e);if(t)return(t.split("#",1)[0]??t).replace(/\.ttl$/u,"")}var xe=me(),Ee=he();const M=Array.from(new Set([...ae,"zhipu","ollama","custom"])),G=new WeakMap,Ae=J.storage.base.slice(J.storage.base.lastIndexOf("/")+1);function Ce(e){const t=e.indexOf("#");return t<0?e:e.slice(0,t)}function Ze(e){Te(),pe({createQueryEngine:async()=>new be.QueryEngine});const t=new URL("settings/-/sparql",e.podUrl).toString();return f.setSparqlEndpoint(t),h.setSparqlEndpoint(t),w.setSparqlEndpoint(t),{credentialsTableDocument(){return f.buildIri(e.podUrl,{id:Ae})},providerTableDocument(r,o){const n=v(r);if(!n)throw new Error("unsupported_provider");const i=n==="custom"&&o?j(o):x(n);return h.buildIri(e.podUrl,{id:Ce(i)})},async listModels(){return await e.database.init?.(w),(await e.database.select().from(w).execute()).map($e).filter(U)},async listProviders(){await e.database.init?.(f,h,w);const r=await e.database.select().from(f).execute(),o=await e.database.select().from(h).execute(),n=await e.database.select().from(w).execute();return Me(e,r,o,n)},async createApiKeyCredential(r,o){const n=v(r);if(!n)throw new Error("unsupported_provider");await e.database.init?.(f,h);const i=d(o.id),a=i??f.buildId({id:Q(n,"apiKey")}),c=1,u=O(n,o.offeringId??B(n,"apiKey")),l=o.baseUrl??X(n,u),s=D(o.proxyUrl),p={id:a,provider:n==="custom"?j(a):x(n),service:"ai",authMode:"apiKey",offeringId:u,status:"active",accountLabel:o.label,label:o.label,baseUrl:l,proxyUrl:s,keyVersion:String(c),reauthRequired:!1,encryptedSecret:$(e,n,a,{type:"apiKey",apiKey:o.apiKey}),encryptionAlgorithm:"PLAINTEXT",metadata:{...k({offeringId:u,baseUrl:l,priority:o.priority}),...o.compatibility?{compatibility:o.compatibility}:{}}};return await ee(e,a,p,i!==void 0),y(e,n,p)},async createLocalCredential(r,o){const n=v(r);if(!n)throw new Error("unsupported_provider");await e.database.init?.(f,h);const i=d(o.id),a=i??f.buildId({id:Q(n,"local")}),c=O(n,o.offeringId??B(n,"local")),u=o.baseUrl??X(n,c),l={id:a,provider:x(n),service:"ai",authMode:"local",offeringId:c,status:"active",accountLabel:o.label??"Local",label:o.label??"Local",baseUrl:u,keyVersion:"1",reauthRequired:!1,encryptedSecret:$(e,n,a,{type:"local"}),encryptionAlgorithm:"PLAINTEXT",metadata:k({offeringId:c,baseUrl:u,priority:o.priority})};return await ee(e,a,l,i!==void 0),y(e,n,l)},async saveOAuthCredential(r,o){const n=v(r);if(!n)throw new Error("unsupported_provider");const a=(G.get(e.database)??Promise.resolve()).then(async()=>{await e.database.init?.(f,h);const c=O(n,o.offeringId??B(n,"deviceCode")),l=(await e.database.select().from(f).execute()).find(R=>{const C=y(e,n,R);if(!C||C.authMode!=="deviceCode"&&C.authMode!=="oauth"||re(n,C.offeringId)!==re(n,c)||R.status!=="active"&&R.status!=="disabled")return!1;const fe=T(e,n,C.id,R.encryptedSecret);return Oe(o,I(R.metadata),fe)}),s=l&&y(e,n,l),p=I(l?.metadata),m=s&&T(e,n,s.id,l?.encryptedSecret),b=s?.id??f.buildId({id:`${n}-oauth-${crypto.randomUUID()}`}),g=o.accountLabel??"OAuth",S=o.accountId??d(p?.accountId)??d(m?.accountId),H=o.accountSubject??d(p?.authoritativeSubject)??d(m?.accountSubject)??d(m?.authoritativeSubject),N={...l,id:b,provider:x(n),service:"ai",authMode:"deviceCodeOAuth",offeringId:c,status:s?.enabled===!1?"disabled":"active",accountLabel:l?.accountLabel??g,label:l?.label??g,expiresAt:o.expiresAt,scopes:o.scope?o.scope.split(/\s+/u).filter(Boolean):void 0,keyVersion:String((s?.version??0)+1),reauthRequired:!1,encryptedSecret:$(e,n,b,{type:"deviceCodeOAuth",accessToken:o.accessToken,refreshToken:o.refreshToken,expiresAt:o.expiresAt,scope:o.scope,idToken:o.idToken,accountId:S,accountSubject:H,accountLabel:o.accountLabel,offeringId:c,authorizationMethodId:o.authorizationMethodId}),encryptionAlgorithm:"PLAINTEXT",metadata:{...p,...k({offeringId:c,priority:s?.priority,enabled:s?.enabled,health:"healthy"}),authoritativeSubject:H,accountId:S,authorizationMethodId:o.authorizationMethodId}};if(l){const R={...N};if(delete R.id,!await e.database.updateById(f,b,R))throw new Error("credential_version_conflict")}else await e.database.insert(f).values(N).execute();return y(e,n,N)});return G.set(e.database,a.then(()=>{},()=>{})),a},async updateOAuthCredential(r,o,n,i){const a=v(r);if(!a)throw new Error("unsupported_provider");await e.database.init?.(f,h);const c=await e.database.findById(f,o),u=c&&y(e,a,c);if(!c||!u||u.authMode!=="deviceCode")throw new Error("oauth_credential_not_found");if(u.version!==n)throw new Error("credential_version_conflict");const l=T(e,a,o,c.encryptedSecret),s=i.accountId??d(I(c.metadata)?.accountId)??d(l?.accountId),p=i.accountSubject??d(I(c.metadata)?.authoritativeSubject)??d(l?.accountSubject)??d(l?.authoritativeSubject),m=O(a,i.offeringId??u.offeringId),b={expiresAt:i.expiresAt,scopes:i.scope?i.scope.split(/\s+/u).filter(Boolean):void 0,keyVersion:String(n+1),reauthRequired:!1,status:"active",encryptedSecret:$(e,a,o,{type:"deviceCodeOAuth",accessToken:i.accessToken,refreshToken:i.refreshToken,expiresAt:i.expiresAt,scope:i.scope,idToken:i.idToken,accountId:s,accountSubject:p,accountLabel:i.accountLabel??d(c.accountLabel),offeringId:m,authorizationMethodId:i.authorizationMethodId??d(I(c.metadata)?.authorizationMethodId)}),accountLabel:i.accountLabel??d(c.accountLabel),label:i.accountLabel??d(c.label),offeringId:m,metadata:{...I(c.metadata),...k({offeringId:m,health:"healthy"}),authoritativeSubject:p,accountId:s,authorizationMethodId:i.authorizationMethodId??d(I(c.metadata)?.authorizationMethodId)}},g=await e.database.updateById(f,o,b);if(!g)throw new Error("credential_version_conflict");return y(e,a,g)},async updateProviderCredential(r,o,n){const i=v(r);if(!i)throw new Error("unsupported_provider");await e.database.init?.(f,h);const a=await e.database.findById(f,o),c=a&&y(e,i,a);if(!a||!c)throw new Error("credential_not_found");if(c.version!==n.expectedVersion)throw new Error("credential_version_conflict");const u={...I(a.metadata),...n.priority===void 0?{}:{priority:n.priority},...n.enabled===void 0?{}:{enabled:n.enabled},...n.baseUrl===void 0?{}:{baseUrl:n.baseUrl},...n.proxyUrl===void 0?{}:{proxyUrl:D(n.proxyUrl)}},l={...n.label===void 0?{}:{accountLabel:n.label,label:n.label},...n.baseUrl===void 0?{}:{baseUrl:n.baseUrl},...n.proxyUrl===void 0?{}:{proxyUrl:D(n.proxyUrl)},...n.enabled===void 0?{}:{status:n.enabled?"active":"disabled"},keyVersion:String(c.version+1),metadata:u},s=await e.database.updateById(f,o,l);if(!s)throw new Error("credential_update_failed");const p=y(e,i,s);if(!p)throw new Error("credential_update_failed");return p},async markCredentialHealth(r,o,n,i){const a=v(r);if(!a)throw new Error("unsupported_provider");await e.database.init?.(f);const c=await e.database.findById(f,o),u=c&&y(e,a,c);if(!c||!u)throw new Error("credential_not_found");if(u.version!==i)throw new Error("credential_version_conflict");const l=await e.database.updateById(f,o,{keyVersion:String(u.version+1),metadata:{...I(c.metadata),health:n}});if(!l)throw new Error("credential_update_failed");const s=y(e,a,l);if(!s)throw new Error("credential_update_failed");return s},async deleteProviderCredential(r,o){const n=v(r);if(!n)throw new Error("unsupported_provider");await e.database.init?.(f,h);const i=await e.database.findById(f,o),a=i&&y(e,n,i);if(a)return await e.database.deleteById(f,o),a},async readCredentialSecret(r,o){const n=v(r);if(!n)throw new Error("unsupported_provider");const i=await e.database.findById(f,o);if(!i||!y(e,n,i))throw new Error("credential_not_found");const a=T(e,n,o,i.encryptedSecret);if(!a)throw new Error("credential_secret_unavailable");return a},async saveDiscoveredModels(r,o,n){const i=v(r);if(!i)throw new Error("unsupported_provider");await e.database.init?.(f,h,w);const a=await Y(e,o),c=te(i,a);await oe(e.database,c,z(i));const u=await e.database.select().from(w).execute(),l=new Set(u.map(m=>d(m.id)).filter(U)),s=n.map(Be).filter(U),p=new Set(s.map(m=>m.id));for(const m of u.filter(b=>ze(b,c,i))){const b=E(d(m.id),c)??ce(d(m.id));b&&!p.has(b)&&d(m.status)!=="unavailable"&&await e.database.updateById(w,String(m.id),{status:"unavailable"})}for(const m of s)await Ne(e.database,c,m,l)},async saveModelSelection(r,o,n){const i=v(r);if(!i)throw new Error("unsupported_provider");await e.database.init?.(h,w);const a=i==="custom"&&n?await Y(e,n):null;if(i==="custom"&&n&&!a)throw new Error("credential_not_found");const c=a?te(i,a):x(i);await oe(e.database,c,z(i));const l=(await e.database.select().from(h).execute()).find(S=>P(d(S.id),c)),s=d(l?.id)??c,p=le(l?.hasModel),m=await e.database.select().from(w).execute(),b=[...new Set(o.map(S=>De(i,S,m,a?c:void 0)))];if(!await e.database.updateById(h,s,{hasModel:b}))throw new Error("provider_model_selection_update_failed");e.authenticatedFetch&&await Ue(e,s,p,b)}}}const Pe="https://undefineds.co/ns#hasModel";async function Ue(e,t,r,o){const n=F(h,e.podUrl,t),i=r.map(s=>F(w,e.podUrl,s)),a=o.map(s=>F(w,e.podUrl,s)),c=s=>s.map(p=>`<${n}> <${Pe}> <${p}> .`).join(`
2
- `),u=[i.length>0?`DELETE DATA { ${c(i)} }`:void 0,a.length>0?`INSERT DATA { ${c(a)} }`:void 0].filter(s=>!!s);if(u.length===0)return;const l=await e.authenticatedFetch(n.split("#",1)[0],{method:"PATCH",headers:{"content-type":"application/sparql-update"},body:u.join(`;
3
- `)});if(!l.ok)throw new Error(`provider_model_selection_persist_failed:${l.status}`)}function F(e,t,r){return/^https?:\/\//u.test(r)?r:e.buildIri(t,{id:r})}async function Y(e,t){const r=await e.database.findById(f,t);return r||((await e.database.select().from(f).execute()).find(n=>{const i=d(n.id);return i===t||(i?f.buildIri(e.podUrl,{id:i})===t:!1)})??null)}function Te(){Z(xe.ActionObserverHttp.prototype),Z(Ee.ActionObserverHttp.prototype)}function Z(e){const t=e;if(t.__xpodObservedActorsPatch)return;const r=t.onRun;t.onRun=function(o,n,i){return Array.isArray(this.observedActors)||(this.observedActors=[]),r.call(this,o,n,i)},t.__xpodObservedActorsPatch=!0}function Me(e,t,r,o){const n=t.filter(i=>d(i.service)==="ai").filter(i=>d(i.status)!=="revoked");return M.map(i=>{const a=n.map(s=>y(e,i,s)).filter(U).sort((s,p)=>s.priority-p.priority||s.id.localeCompare(p.id)),c=r.find(s=>_(d(s.id))===i),l=le(c?.hasModel).map(s=>Le(i,s,o));return{id:i,name:i==="custom"?a.find(s=>s.label)?.label??z(i):z(i),offerings:i==="custom"?je(n.filter(s=>y(e,i,s))):ye(i,e.openAiSubscriptionImportAvailable===!0),credentials:a,selectedModels:l,status:Ve(a)}})}async function ee(e,t,r,o){if(!(o?await e.database.findById(f,t):null)){await e.database.insert(f).values(r).execute();return}const i={...r};if(delete i.id,!await e.database.updateById(f,t,i))throw new Error("credential_create_failed")}function $(e,t,r,o){return ge({webId:e.webId,provider:t,credentialIri:f.buildIri(e.podUrl,{id:r}),secret:o})}function Oe(e,t,r){let o=!1;for(const[n,i]of[[e.accountId,[t?.accountId,r?.accountId]],[e.accountSubject,[t?.authoritativeSubject,r?.accountSubject,r?.authoritativeSubject]]]){const a=[...new Set(i.map(d).filter(U).filter(c=>c.trim()))];if(a.length>1)return!1;if(!(!n?.trim()||!a.length)){if(a[0]!==n)return!1;o=!0}}return o}function y(e,t,r){const o=d(r.id);if(!o)return;const n=q(d(r.provider))??qe(o);if(n!==t)return;const i=I(r.metadata),a=ue(r.authMode);if(a)return{id:o,provider:n,offeringId:de(r,n,a),authMode:a,label:d(r.accountLabel)??d(r.label),enabled:ie(i?.enabled)??d(r.status)==="active",priority:ne(i?.priority)??100,health:He(i?.health)??(ie(r.reauthRequired)?"expired":"healthy"),maskedHint:Ke(e,n,o,r.encryptedSecret),baseUrl:d(r.baseUrl),proxyUrl:We(d(r.proxyUrl)??d(i?.proxyUrl)),compatibility:ke(i?.compatibility),expiresAt:Je(r.expiresAt),version:ne(r.keyVersion)??0}}function ke(e){return e==="auto"||e==="openai"||e==="anthropic"?e:void 0}function de(e,t,r){return d(e.offeringId)??d(I(e.metadata)?.offeringId)??W(d(e.provider))??B(t,r)}function Le(e,t,r){const o=r.find(c=>A(d(c.id))===A(t)),n=d(o?.isProvidedBy),i=o?E(t,n??e)??t:E(t,e)??t,a=o??r.find(c=>{const u=d(c.id),l=d(c.isProvidedBy);return u===t||E(u,e)===i||q(l)===e&&E(u,l??e)===i});return{id:i,provider:e,offeringId:W(d(a?.isProvidedBy)),credentialId:K(n),resourceId:d(a?.id)??t,displayName:d(a?.displayName),availability:d(a?.status)==="unavailable"||!a?"unavailable":"available"}}function $e(e){const t=d(e.isProvidedBy),r=q(t),o=r&&E(d(e.id),t??r);if(!(!r||!o))return{id:o,provider:r,offeringId:W(t),credentialId:K(t),resourceId:d(e.id),displayName:d(e.displayName),availability:d(e.status)==="unavailable"?"unavailable":"available",...Fe(e)}}function Be(e){const t=I(e),r=d(t?.id);if(r)return{id:r,displayName:d(t?.displayName),modelType:se(t?.modelType)}}function te(e,t){const r=K(d(t?.provider));return r?j(r):x(e)}function x(e){return Re(e)}function j(e){return _e(e)}function K(e){const t=_(e),r=t?.startsWith("custom-instance-")?t.slice(16):void 0;if(r)try{return decodeURIComponent(r)}catch{return}}function re(e,t){if(!t)return;const r=t.trim().toLowerCase();if(e==="bailian"){if(r==="token-plan")return"token-plan-personal";if(r==="coding-plan")return"coding-plan-pro";if(r==="payg")return"pay-as-you-go"}return r}function P(e,t){const r=A(e),o=A(t);return r!==void 0&&r===o}function ze(e,t,r){const o=d(e.isProvidedBy);return P(o,t)?!0:r==="custom"?!1:_(o)?.startsWith(`${r}-`)===!0}function ce(e){if(!e)return;const t=e.lastIndexOf("#");if(t<0||t===e.length-1)return;const r=e.slice(t+1);try{return decodeURIComponent(r)}catch{return r}}async function oe(e,t,r){(await e.select().from(h).execute()).some(n=>P(d(n.id),t))||await e.insert(h).values({id:t,displayName:r}).execute()}async function Ne(e,t,r,o){const n=V(t,r.id),i={displayName:r.displayName??r.id,isProvidedBy:t,status:"active",...r.modelType?{modelType:r.modelType}:{}};if(o.has(n)){await e.updateById(w,n,i);return}await e.insert(w).values({id:n,...i}).execute(),o.add(n)}function Fe(e){const t=se(e.modelType);return t?{modelType:t,...t==="embedding"?{capabilities:["embedding"]}:{}}:{}}function se(e){const t=d(e)?.trim().toLowerCase();return t==="chat"||t==="embedding"?t:void 0}function V(e,t){const r=A(e)??`${e}.ttl`;return`${r.split("#",1)[0]??r}#${encodeURIComponent(t)}`}function De(e,t,r,o){const n=d(t.resourceId),i=o??x(e),a=d(t.id),c=a?r.filter(l=>{const s=d(l.isProvidedBy),p=_(s);return(o?P(s,o):p===e||p?.startsWith(`${e}-`)===!0)&&E(d(l.id),s??i)===a}):[],u=o||c.length===1?c[0]:void 0;if(n){const l=r.find(b=>d(b.id)===n);if(!l&&u)return String(u.id);const s=d(l?.isProvidedBy),p=_(s),m=o?P(s,o):p===e||p?.startsWith(`${e}-`)===!0;if(l&&!m)throw new Error("invalid_model_selection_resource");if(!l){const b=a??ce(n),g=_(n),S=o?P(g,o):g===e||g?.startsWith(`${e}-`)===!0;if(!b||!S)throw new Error("invalid_model_selection_resource");return V(i,b)}return n}if(!a)throw new Error("invalid_model_selection_resource");return d(u?.id)??V(i,a)}function E(e,t){if(!e)return;const o=A(t)?.split("#",1)[0]??t,n=o.endsWith(".ttl")?`${o}#`:`${o}.ttl#`,i=e.lastIndexOf(n);if(!(i<0))try{return decodeURIComponent(e.slice(i+n.length))}catch{return e.slice(i+n.length)}}function le(e){if(Array.isArray(e))return e.map(d).filter(U);const t=d(e);return t?[t]:[]}function je(e){const t=new Map;for(const r of e){const o=I(r.metadata),n=de(r,"custom",ue(r.authMode)??"apiKey"),i=we(o?.compatibility,n),a=d(r.baseUrl)??d(o?.baseUrl),c=L.find(u=>u.id===n)??L.find(u=>u.id===`${i}-compatible`)??L[0];t.set(n,{...c,id:n,endpoints:a?[{protocol:i==="anthropic"?"anthropic":"chatCompletions",baseUrl:a}]:c.endpoints,modelDiscovery:i==="anthropic"?{strategy:"anthropic",path:"/models",endpointProtocol:"anthropic"}:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"}})}return t.size>0?[...t.values()]:L}function Ve(e){return e.some(t=>t.health==="expired"||t.health==="invalid")?"attention":e.some(t=>t.enabled)?"available":e.length>0?"configured":"unconfigured"}function Ke(e,t,r,o){const n=T(e,t,r,o),i=d(n?.apiKey);if(i)return i.length<=8?`${i.slice(0,2)}…`:`${i.slice(0,3)}...${i.slice(-4)}`}function T(e,t,r,o){return Se({webId:e.webId,provider:t,credentialIri:f.buildIri(e.podUrl,{id:r}),envelope:o})}function q(e){const t=_(e),r=v(t);return r||M.find(o=>t?.startsWith(`${o}-`))}function W(e){const t=_(e);if(t&&!t.startsWith("custom-instance-")){if(t==="bailian-token-plan-personal")return"token-plan";if(t==="bailian-token-plan-team")return"token-plan-team";if(t==="bailian-coding-plan-pro")return"coding-plan";if(t==="bailian-pay-as-you-go")return"pay-as-you-go";for(const r of M)if(t.startsWith(`${r}-`))return t.slice(r.length+1)}}function qe(e){const t=/\/([^/#]+)\.ttl#/u.exec(e);return v(t?.[1])}function v(e){if(typeof e!="string"||!e.trim())return;const t=e.trim().toLowerCase();if(t==="zhipu"||t.startsWith("zhipu-"))return"zhipu";if(M.includes(t))return t;for(const r of M)if(t.startsWith(`${r}-`)||r==="bailian"&&(t==="bailian-token-plan"||t==="bailian-coding-plan"))return r}function D(e){if(e==null||!e.trim())return;let t;try{t=new URL(e.trim())}catch{throw new Error("invalid_proxy_url")}if(!["http:","https:"].includes(t.protocol)||t.username||t.password||t.hash||!t.hostname)throw new Error("invalid_proxy_url");return t.toString().replace(/\/$/u,"")}function We(e){if(e==null||!e.trim())return;let t;try{t=new URL(e.trim())}catch{return}if(!(!["http:","https:"].includes(t.protocol)||!t.hostname))return t.username="",t.password="",t.search="",t.hash="",t.toString().replace(/\/$/u,"")}function ue(e){if(e==="oauth"||e==="deviceCode"||e==="apiKey"||e==="local")return e;if(e==="deviceCodeOAuth")return"deviceCode"}function He(e){if(e==="healthy"||e==="expired"||e==="invalid"||e==="unknown")return e;if(e==="reauthRequired")return"expired";if(e==="disabled")return"unknown"}function I(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function d(e){return typeof e=="string"&&e.trim()?e:void 0}function ne(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"&&e.trim()){const t=Number(e);return Number.isFinite(t)?t:void 0}}function ie(e){if(typeof e=="boolean")return e;if(e==="true")return!0;if(e==="false")return!1}function Je(e){return e instanceof Date?e.toISOString():d(e)}function U(e){return e!==void 0}export{_e as a,Re as b,Q as c,Ze as d,Ye as e,_ as p};
@@ -1 +0,0 @@
1
- const D=["openai","anthropic","kimi","bailian","deepseek","zhipu","ollama","custom"],ee="AI Connection request failed. Please try again.";function Ot(e){if(e==null||!e.trim())return;let t;try{t=new URL(e.trim())}catch{throw new Error("invalid_proxy_url")}if(!["http:","https:"].includes(t.protocol)||t.username||t.password||t.hash)throw new Error("invalid_proxy_url");if(!t.hostname)throw new Error("invalid_proxy_url");return t.href.replace(/\/$/u,"")}class ge extends Error{constructor(t,n){super(t),this.name="AiConnectionsRequestError",this.code=oe(n),this.providerStatus=p(n)&&typeof n.providerStatus=="number"?n.providerStatus:void 0}}function Et(e){return e instanceof Error?F(e.message):F(String(e))}function G(e,t,n={}){const s=oe(e);if(s==="provider_models_response_error"){const f=p(e)&&typeof e.message=="string"?$(e.message):void 0;return f||"模型列表获取失败。请检查密钥、服务地址或网络后重试。"}if(s==="provider_models_fetch_failed"){const f=p(e)&&typeof e.providerStatus=="number"?e.providerStatus:void 0,h=p(e)&&typeof e.providerMessage=="string"?e.providerMessage.trim():void 0;return Ie(be(f,n.authMode),h)}const c=s?E(s,n.provider):void 0;if(c)return c;const d=p(e)&&typeof e.error=="string"?e.error:void 0;if(d){const f=E(d,n.provider);if(f)return f;if(d==="AI Connection service identity is unavailable")return d;if(d==="Provider credential not found for current identity")return"当前身份没有可用的额度凭证。";if(d==="Provider quota adapter not found"||d==="Provider quota lookup failed")return"该接入方式不支持查询官方额度。"}return t===401?"Please sign in again to continue.":t===403?"AI Connection permission was denied.":t===404&&n.provider?`${N(n.provider)} connection is not configured.`:t===429?"AI Connection is rate limited. Please try again later.":t===503?"AI Connection service is unavailable.":ee}const te="订阅登录态自动刷新失败,请稍后重试。",ne="订阅登录态已失效,请在原客户端重新登录后重读,或使用设备码登录。",ie="订阅登录态不可用,请重读登录态或重新登录后再同步模型。",re=new Set([ie,te,ne,"密钥不可用。请检查密钥是否填写正确,或换一个密钥后重试。","模型服务地址不正确。请检查服务地址后重试。","请求太频繁。请稍等一会儿再试。","模型服务暂时没有响应。请稍后重试。","模型列表获取失败。请检查密钥、服务地址或网络后重试。"]);function F(e){if(e.startsWith("provider_models_response_error:"))return $(e.slice(31))??"模型列表获取失败。请检查密钥、服务地址或网络后重试。";const t=E(e);if(t)return t;const n=e.split(":",1)[0]?.trim(),s=n?E(n):void 0;return s||(e==="AI Connection service identity is unavailable"||re.has(e)||Ae(e)?e:e.startsWith("invalid_")?"AI Connection returned an invalid response.":ee)}function oe(e){if(p(e)){if(typeof e.code=="string")return e.code;if(typeof e.errorCode=="string")return e.errorCode;if(typeof e.error=="string"&&/^[a-z][a-z0-9_:-]{0,80}$/i.test(e.error))return e.error}}function E(e,t){switch(e.trim().toLowerCase().replace(/-/g,"_")){case"not_configured":case"notconfigured":return t?`${N(t)} connection is not configured.`:"AI provider connection is not configured.";case"unsupported":return t?`${N(t)} does not support this operation.`:"This AI Connection operation is not supported.";case"service_identity_unavailable":return"AI Connection service identity is unavailable";case"unauthorized":return"Please sign in again to continue.";case"forbidden":case"permission_denied":return"AI Connection permission was denied.";case"rate_limited":return"AI Connection is rate limited. Please try again later.";case"service_unavailable":return"AI Connection service is unavailable.";case"unsafe_provider_base_url":return"该服务地址指向 Xpod 不允许访问的网络,请改用公网 HTTPS 地址。";case"invalid_proxy_url":return"代理地址必须是无账号密码的 HTTP 或 HTTPS 地址。";case"oauth_refresh_failed":case"oauth_refresh_unavailable":case"local_session_refresh_failed":return te;case"oauth_session_reauth_required":case"oauth_refresh_token_required":case"local_session_reauth_required":case"local_session_missing_refresh_token":return ne;case"models_persistence_failed":return"模型已获取,但保存到 Pod 失败。请重试同步模型。";case"quota_credential_not_found":return"当前身份没有可用的额度凭证。";case"credential_secret_unavailable":return"当前凭证密钥不可用,请重新保存后再查询额度。";case"gateway_api_key_plaintext_unavailable":return"Pod 中未找到此 API Key 的原文,无法复制配置。请创建新的 Key,更新客户端后再删除旧 Key。";case"quota_adapter_not_found":return"该接入方式不支持查询官方额度。";default:return}}function be(e,t){return e===401||e===403?t==="deviceCodeOAuth"?ie:"密钥不可用。请检查密钥是否填写正确,或换一个密钥后重试。":e===404?"模型服务地址不正确。请检查服务地址后重试。":e===429?"请求太频繁。请稍等一会儿再试。":e!==void 0&&e>=500?"模型服务暂时没有响应。请稍后重试。":"模型列表获取失败。请检查密钥、服务地址或网络后重试。"}function Ie(e,t){const n=t?$(t):void 0;return n?`${e} 上游返回:${n}`:e}function Ae(e){const n=e.indexOf(" 上游返回:");return n<=0?!1:re.has(e.slice(0,n))}function $(e){return e.replace(/[\u0000-\u001f\u007f]/gu," ").replace(/\bBearer\s+[^\s,;]+/giu,"Bearer [REDACTED]").replace(/(?:sk|id)[._-][A-Za-z0-9._-]{8,}/gu,"[REDACTED]").replace(/https?:\/\/[^\s]+/giu,"[URL]").trim().slice(0,240)||void 0}function N(e){switch(e){case"openai":return"OpenAI";case"anthropic":return"Anthropic";case"kimi":return"Kimi";case"bailian":return"Bailian";case"deepseek":return"DeepSeek";case"zhipu":return"Zhipu";case"ollama":return"Ollama";case"custom":return"Custom"}}async function B(e){const t=await e.text();if(t)try{return JSON.parse(t)}catch{throw new Error(`AI Connection returned invalid JSON (${e.status})`)}}function Pe(e){if(!D.includes(e))throw new Error(`Unsupported AI provider: ${e}`)}function R(e){if(!(!p(e)||typeof e.id!="string"||typeof e.owner!="string"||!Array.isArray(e.scopes)||!e.scopes.every(t=>typeof t=="string")||typeof e.createdAt!="string"))return y({id:e.id,kind:e.kind==="client-credentials"?e.kind:void 0,credentialResource:o(e.credentialResource),fingerprint:o(e.fingerprint),owner:e.owner,scopes:e.scopes,createdAt:e.createdAt,expiresAt:o(e.expiresAt),lastUsedAt:o(e.lastUsedAt),disabledAt:o(e.disabledAt),revokedAt:o(e.revokedAt),name:o(e.name),maskedHint:o(e.maskedHint),plaintextAvailable:typeof e.plaintextAvailable=="boolean"?e.plaintextAvailable:void 0,clientCredentialId:o(e.clientCredentialId),appliedTo:o(e.appliedTo),appliedOn:o(e.appliedOn),appliedAt:o(e.appliedAt),appliedClients:U(e.appliedClients)})}function V(e){if(!Array.isArray(e))throw new Error("AI Connection returned an invalid custom models response");const t=[];for(const n of e)!p(n)||typeof n.id!="string"||!n.id||t.push(y({id:n.id,displayName:o(n.displayName),inputModalities:U(n.inputModalities),outputModalities:U(n.outputModalities),capabilities:U(n.capabilities)}));return t}function U(e){if(!Array.isArray(e))return;const t=e.filter(n=>typeof n=="string");return t.length>0?t:void 0}function ae(e){if(!p(e)||typeof e.id!="string"||Ue(e.id))return;const t=g(e.provider)??g(e.providerId)??g(e.owned_by)??Ce(e.id);if(!t)return;const n=p(e.capabilities)?e.capabilities.imageInput:void 0;return y({id:e.id,provider:t,offeringId:o(e.offeringId),resourceId:o(e.resourceId),displayName:o(e.displayName)??o(e.display_name)??o(e.name),contextWindow:W(e.contextWindow)??W(e.context_window),protocols:Array.isArray(e.protocols)?e.protocols.filter(s=>typeof s=="string"):void 0,custom:e.custom===!0?!0:void 0,inputModalities:J(e.modalities,"input")??(n===!0?["text","image"]:n===!1?["text"]:void 0),outputModalities:J(e.modalities,"output"),capabilities:we(e)})}function J(e,t){if(!p(e))return;const n=e[t];if(!Array.isArray(n))return;const s=n.filter(c=>typeof c=="string");return s.length>0?s:void 0}function we(e){if(Array.isArray(e.custom_capabilities)){const n=e.custom_capabilities.filter(s=>typeof s=="string");if(n.length>0)return n}if(!p(e.capabilities))return;const t=[];return e.capabilities.imageInput===!0&&t.push("image"),e.capabilities.toolCalls===!0&&t.push("tool_call"),e.capabilities.reasoningEffort===!0&&t.push("reasoning"),e.capabilities.fast===!0&&t.push("fast"),e.capabilities.embedding===!0&&t.push("embedding"),t.length>0?t:void 0}function Ue(e){const t=e.toLowerCase();return t==="linx"||t==="linx-lite"||t==="undefineds/linx"||t==="undefineds/linx-lite"}function g(e){if(typeof e!="string")return;const t=e.toLowerCase().trim();return t==="alibaba"||t==="dashscope"||t==="alibaba-bailian"||t==="bailian-coding-plan"||t==="bailian-token-plan"?"bailian":D.includes(t)?t:void 0}function Ce(e){const t=e.split("/",1)[0];return e.includes("/")?g(t):void 0}function W(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function _e(e){const t=new Map;for(const n of e){const s=ke(n);if(!s)continue;const c=t.get(s.id);t.set(s.id,c?ze(c,s):s)}return[...t.values()]}function ke(e){return Me(e)??Se(e)}function Se(e){if(!p(e)||typeof e.provider!="string"||!Qe(e.status)||!p(e.connect)||!Array.isArray(e.connect.modes)||!e.connect.modes.every(H)||typeof e.connect.configured!="boolean")return;const t=g(e.provider);if(!t)return;const n=Ke(e,t);return{id:t,name:fe(t),offerings:[],credentials:n?[n]:[],selectedModels:[],status:$e(e.status)}}function Me(e){if(!p(e))return;const t=g(e.id)??g(e.provider);if(!t||!Be(e.status))return;const n=I(e.offerings,Oe),s=I(e.credentials,C),c=I(e.selectedModels,ae);return{id:t,name:o(e.name)??fe(t),offerings:n,credentials:s,selectedModels:c,status:e.status}}function Oe(e){if(!p(e)||typeof e.id!="string"||!e.id)return;const t=I(e.authModes,pe);return y({id:e.id,label:o(e.label),kind:o(e.kind),lifecycle:xe(e.lifecycle),authModes:t,authorizationMethods:I(e.authorizationMethods,se),runtimeProviderIds:U(e.runtimeProviderIds),productLabel:o(e.productLabel),credentialPrefixHints:U(e.credentialPrefixHints),consoleUrl:o(e.consoleUrl),subscriptionUrl:o(e.subscriptionUrl),endpoints:I(e.endpoints,ce),modelDiscovery:Le(e.modelDiscovery),quota:qe(e.quota),usagePolicyUrl:o(e.usagePolicyUrl),region:o(e.region)})}function Ee(e){if(!p(e)||typeof e.offeringId!="string"||!e.offeringId)return;const t=g(e.provider);if(!t)return;const n=I(e.authorizationMethods,se);return{provider:t,offeringId:e.offeringId,...Array.isArray(e.endpoints)?{endpoints:I(e.endpoints,ce)}:{},authorizationMethods:n}}function se(e){if(!p(e)||typeof e.id!="string"||!e.id)return;const t=pe(e.authMode),n=Te(e.lifecycle);if(!t||!n)return;const s=H(e.connectMode)?e.connectMode:void 0;return y({id:e.id,authMode:t,connectMode:s,label:o(e.label)??Re(e.id,t),lifecycle:n,reason:o(e.reason)})}function Te(e){return e==="active"||e==="unavailable"?e:void 0}function Re(e,t){return e==="device-code"?"设备码登录":e==="local-session-import"?"已有登录态":e==="local-service"?"本地服务":e==="api-key"||t==="apiKey"?"API Key":t==="local"?"本地服务":"浏览器登录"}function xe(e){return e==="active"||e==="legacy"||e==="unavailable"?e:void 0}function ce(e){if(!p(e))return;const t=o(e.protocol),n=o(e.baseUrl);if(!(!t||!n))return y({protocol:t,baseUrl:n,region:o(e.region)})}function Le(e){if(!p(e))return;const t=o(e.strategy),n=o(e.path),s=o(e.endpointProtocol);return t&&n&&s?{strategy:t,path:n,endpointProtocol:s}:void 0}function qe(e){if(!p(e))return;const t=o(e.strategy),n=o(e.url);return t&&n?{strategy:t,url:n}:void 0}function C(e){if(!(!p(e)||typeof e.id!="string"||!e.id||typeof e.offeringId!="string"||!e.offeringId||!ue(e.authMode)||typeof e.enabled!="boolean"||typeof e.priority!="number"||!Number.isFinite(e.priority)||!Fe(e.health)||typeof e.version!="number"||!Number.isFinite(e.version)))return y({id:e.id,provider:g(e.provider),offeringId:e.offeringId,authMode:e.authMode,label:o(e.label),enabled:e.enabled,priority:e.priority,health:e.health,maskedHint:o(e.maskedHint),baseUrl:o(e.baseUrl),proxyUrl:o(e.proxyUrl),expiresAt:o(e.expiresAt),version:e.version})}function de(e){return p(e)?Object.fromEntries(Object.entries(e).filter(([t])=>!Ne(t)).map(([t,n])=>[t,le(n)])):{}}function le(e){return Array.isArray(e)?e.map(le):p(e)?de(e):e}function Ne(e){const t=e.toLocaleLowerCase();return t.includes("secret")||t.includes("token")||t.includes("apikey")||t==="api_key"||t==="key"||t==="authorization"}function ze(e,t){const n=x([...e.credentials,...t.credentials],d=>d.id),s=x([...e.offerings,...t.offerings],d=>d.id),c=x([...e.selectedModels,...t.selectedModels],De);return{id:e.id,name:e.name??t.name,offerings:s,credentials:n,selectedModels:c,status:He(e.status,t.status)}}function De(e){return e.resourceId??`${e.provider}:${e.offeringId??""}:${e.id}`}function $e(e){return e==="connected"?"available":e==="reauthRequired"?"attention":"unconfigured"}function He(e,t){return e==="available"||t==="available"?"available":e==="attention"||t==="attention"?"attention":e==="configured"||t==="configured"?"configured":e==="unconfigured"||t==="unconfigured"?"unconfigured":"unavailable"}function Ke(e,t){if(e.status==="disconnected")return;const n=je(e.authMode);return y({id:o(e.credentialIri)??`${t}:current`,offeringId:Ge(t,n),authMode:n,label:o(e.accountLabel),enabled:e.status==="connected",priority:0,health:e.status==="reauthRequired"||e.reauthRequired===!0?"expired":"healthy",maskedHint:o(e.maskedHint),baseUrl:o(e.baseUrl),proxyUrl:o(e.proxyUrl),expiresAt:o(e.expiresAt),version:typeof e.version=="number"?e.version:0})}function je(e){return e==="deviceCodeOAuth"?"deviceCode":"apiKey"}function Ge(e,t){return e==="kimi"&&(t==="deviceCode"||t==="oauth")?"subscription-key":t==="deviceCode"||t==="oauth"?"official-subscription":"api-platform"}function pe(e){return ue(e)?e:void 0}function ue(e){return e==="oauth"||e==="deviceCode"||e==="apiKey"||e==="local"}function Fe(e){return e==="healthy"||e==="expired"||e==="invalid"||e==="unknown"}function Be(e){return e==="unconfigured"||e==="configured"||e==="available"||e==="attention"||e==="unavailable"}function I(e,t){return Array.isArray(e)?e.map(t).filter(_):[]}function x(e,t){const n=new Set,s=[];for(const c of e){const d=t(c);n.has(d)||(n.add(d),s.push(c))}return s}function fe(e){switch(e){case"openai":return"OpenAI";case"anthropic":return"Anthropic";case"kimi":return"Kimi";case"bailian":return"Alibaba Bailian";case"deepseek":return"DeepSeek";case"zhipu":return"Zhipu";case"ollama":return"Ollama";case"custom":return"Custom"}}function Ve(e){if(!p(e)||typeof e.id!="string"||typeof e.credentialIri!="string"||typeof e.webId!="string"||typeof e.provider!="string"||typeof e.authMode!="string"||typeof e.status!="string")return;const t=g(e.provider);if(t)return y({id:e.id,credentialIri:e.credentialIri,webId:e.webId,provider:t,authMode:e.authMode,status:e.status,accountLabel:o(e.accountLabel),expiresAt:o(e.expiresAt),version:typeof e.version=="number"?e.version:void 0,reauthRequired:typeof e.reauthRequired=="boolean"?e.reauthRequired:void 0})}function Je(e,t){if(!p(e)||!H(e.mode)||!Xe(e.status)||e.provider!==t)throw new Error("AI Connection returned an invalid Connect response");return y({mode:e.mode,status:e.status,provider:t,attemptId:o(e.attemptId),state:o(e.state),signature:o(e.signature),expiresAt:o(e.expiresAt),authorizationUrl:L(e.authorizationUrl),userCode:o(e.userCode),verificationUri:L(e.verificationUri),verificationUriComplete:L(e.verificationUriComplete),intervalSeconds:typeof e.intervalSeconds=="number"?e.intervalSeconds:void 0,apiKeyManagementSupported:typeof e.apiKeyManagementSupported=="boolean"?e.apiKeyManagementSupported:void 0,credentialId:o(e.credentialId),offeringId:o(e.offeringId),authorizationMethodId:o(e.authorizationMethodId),oauthCredential:We(e.oauthCredential),message:o(e.message)})}function We(e){if(e!==void 0){if(!p(e)||typeof e.accessToken!="string"||!e.accessToken||typeof e.refreshToken!="string"||!e.refreshToken)throw new Error("AI Connection returned an invalid OAuth credential payload");return y({accessToken:e.accessToken,refreshToken:e.refreshToken,expiresAt:o(e.expiresAt),scope:o(e.scope),idToken:o(e.idToken),accountSubject:o(e.accountSubject),accountId:o(e.accountId),accountLabel:o(e.accountLabel),offeringId:o(e.offeringId),authorizationMethodId:o(e.authorizationMethodId),expectedVersion:typeof e.expectedVersion=="number"?e.expectedVersion:void 0})}}function Ye(e,t){if(!p(e)||!Array.isArray(e.models))throw new Error("AI Connection returned an invalid model discovery response");const n=e.models.map(s=>{if(!p(s)||typeof s.id!="string"||!s.id)return;const c=Array.isArray(s.capabilities)?s.capabilities.filter(f=>typeof f=="string"):void 0,d=Ze(s.modelType);return y({id:s.id,displayName:o(s.displayName),capabilities:c??(d==="embedding"?["embedding"]:void 0),modelType:d})}).filter(_);return{provider:t,credential:typeof e.credential=="string"?e.credential:"",models:n,observedAt:typeof e.observedAt=="string"?e.observedAt:new Date(0).toISOString(),source:typeof e.source=="string"?e.source:""}}function y(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function Ze(e){return e==="chat"||e==="embedding"?e:void 0}function o(e){return typeof e=="string"?e:void 0}function L(e){if(typeof e=="string")try{const t=new URL(e);return t.protocol==="https:"||t.protocol==="http:"?t.href:void 0}catch{return}}function H(e){return e==="browserAssistedApiKey"||e==="deviceCodeOAuth"||e==="authorizationCodeOAuth"||e==="connectUnsupported"}function Xe(e){return e==="pending"||e==="authorization_pending"||e==="slow_down"||e==="completed"||e==="expired"||e==="cancelled"||e==="unsupported"}function Qe(e){return e==="connected"||e==="disconnected"||e==="reauthRequired"}function p(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function _(e){return e!==void 0}function K(e){const t=new URL(e);if(t.protocol!=="https:"&&t.protocol!=="http:")throw new Error("Current Pod URL must use HTTP or HTTPS");return t.origin}function ve({webId:e,podBaseUrl:t,authenticatedFetch:n}){const s=K(t),c=async(r,i,a,l={})=>{const u=await n(`${s}${r}`,{method:i,credentials:"omit",mode:"cors",headers:{accept:"application/json",...a?{"content-type":"application/json"}:{}},...a?{body:JSON.stringify(a)}:{}}),m=await B(u);if(!u.ok)throw new ge(G(m,u.status,l),m);return m},d=r=>(Pe(r),`/api/ai/gateway/providers/${r}`),f=async(r,i,a,l)=>{const u=await c(`${d(r)}${i}`,a,l,{provider:r});return Je(u,r)},h=async()=>{const r=await c("/v1/models","GET");return Array.isArray(r.data)?r.data.map(ae).filter(_):[]};return{webId:e,apiBase:s,getServiceAccess(){return c("/api/applets/service-access/ai-connections","GET")},async listProviders(){const r=await c("/api/ai/providers","GET");return Array.isArray(r.data)?_e(r.data):[]},async listAuthorizationMethods(){const r=await n(`${s}/api/ai/connections/authorization-methods`,{method:"GET",credentials:"omit",mode:"cors",headers:{accept:"application/json"}});if(r.status===404)return[];const i=await B(r);if(!r.ok)throw new Error(G(i,r.status));return p(i)&&Array.isArray(i.data)?i.data.map(Ee).filter(_):[]},listModels:h,listGatewayModels:h,async listGatewayKeys(){const r=await c("/api/ai/gateway/keys","GET");return Array.isArray(r.data)?r.data.map(R).filter(_):[]},async createGatewayKey(r){const i=await c("/api/ai/gateway/keys","POST",y(r));if(typeof i.key!="string"||!i.key)throw new Error("Xpod did not return the new API Key");const a=R(i.record);if(!a)throw new Error("Xpod returned an invalid API Key record");return{plaintext:i.key,record:a}},async updateGatewayKey(r,i){const a=await c(`/api/ai/gateway/keys/${encodeURIComponent(r)}`,"PATCH",i),l=R(a.record);if(!l)throw new Error("Xpod returned an invalid API Key record");return l},async deleteGatewayKey(r){await c(`/api/ai/gateway/keys/${encodeURIComponent(r)}`,"DELETE")},async beginConnect(r,i,a){return await f(r,"/connect/begin","POST",y({mode:i,offeringId:a?.offeringId,authorizationMethodId:a?.authorizationMethodId}))},connectStatus(r,i){if(!i.attemptId)throw new Error("Connect attempt id is required");const a=new URLSearchParams({state:i.state??"",signature:i.signature??""});return i.mode&&a.set("mode",i.mode),f(r,`/connect/status/${encodeURIComponent(i.attemptId)}?${a}`,"GET")},completeApiKey(r,i,a,l,u){return f(r,"/connect/complete-api-key","POST",y({attemptId:i.attemptId,state:i.state,signature:i.signature,offeringId:i.offeringId,apiKey:a,accountLabel:l,baseUrl:u}))},pollDevice(r,i){return f(r,"/connect/poll","POST",y({mode:i.mode,attemptId:i.attemptId,state:i.state,signature:i.signature,offeringId:i.offeringId}))},cancelConnect(r,i){return f(r,"/connect/cancel","POST",y({mode:i.mode,attemptId:i.attemptId,state:i.state,signature:i.signature,offeringId:i.offeringId}))},refreshOAuthCredential(r,i,a,l,u,m){return f(r,"/connect/refresh","POST",{credentialId:i,refreshToken:a,expectedVersion:l,...u?{offeringId:u}:{},...m?{mode:m}:{}})},async disconnect(r,i){const a=i?`?${new URLSearchParams({credentialId:i})}`:"",l=await c(`${d(r)}/connect${a}`,"DELETE");return Ve(l.record)},async createApiKeyCredential(r,i){const a=await c(`/api/ai/providers/${r}/credentials/api-key`,"POST",y({...i}),{provider:r}),l=C(a.credential);if(!l)throw new Error("AI Connection returned an invalid Provider credential");return l},async createLocalCredential(r,i){const a=await c(`/api/ai/providers/${r}/credentials/local`,"POST",y(i),{provider:r}),l=C(a.credential);if(!l)throw new Error("AI Connection returned an invalid Provider credential");return l},async updateProviderCredential(r,i,a){const l=await c(`/api/ai/providers/${r}/credentials/${encodeURIComponent(i)}`,"PATCH",y({...a}),{provider:r}),u=C(l.credential);if(!u)throw new Error("AI Connection returned an invalid Provider credential");return u},async deleteProviderCredential(r,i){const a=await c(`/api/ai/providers/${r}/credentials/${encodeURIComponent(i)}`,"DELETE",void 0,{provider:r});return C(a.credential)},async testProviderCredential(r,i){const a=await c(`/api/ai/providers/${r}/credentials/test`,"POST",y({...i}),{provider:r});return de(a.result)},quota(r,i=!1,a){const l=!i&&a?.credentialIri?`?credentialIri=${encodeURIComponent(a.credentialIri)}${a.offeringId?`&offeringId=${encodeURIComponent(a.offeringId)}`:""}`:"";return c(`${d(r)}/quota/${i?"refresh":"status"}${l}`,i?"POST":"GET",i?y({offeringId:a?.offeringId,credentialId:a?.credentialId,credentialIri:a?.credentialIri}):void 0,{provider:r})},quotaFromSecret(r,i){return c(`${d(r)}/quota/refresh`,"POST",y(i),{provider:r})},async discoverModels(r,i){const a=await c(`${d(r)}/models/refresh`,"POST",y({...i}),{provider:r,authMode:i?.authMode});return Ye(a,r)},async saveProviderModel(r,i){const a=await c(d(r)+"/models","POST",y({id:i.id,displayName:i.displayName,inputModalities:i.inputModalities,outputModalities:i.outputModalities,capabilities:i.capabilities}),{provider:r});return V(a.data)},async deleteProviderModel(r,i){const a=await c(`${d(r)}/models/${encodeURIComponent(i)}`,"DELETE",void 0,{provider:r});return V(a.data)}}}const ye=[{id:"api-platform",label:"API Platform",kind:"api-platform",lifecycle:"active",authModes:["apiKey"]}],et={id:"api-key",authMode:"apiKey",label:"添加 API Key",lifecycle:"active"},tt={id:"browser-login",authMode:"apiKey",connectMode:"browserAssistedApiKey",label:"浏览器登录",lifecycle:"active"},w=[et,tt],nt=[{id:"openai-compatible",label:"OpenAI Compatible",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],runtimeProviderIds:["custom"],consoleUrl:"https://undefineds.co",subscriptionUrl:"https://undefineds.co",endpoints:[{protocol:"chatCompletions",baseUrl:"https://example.invalid/v1"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"unsupported",url:"https://undefineds.co"}},{id:"anthropic-compatible",label:"Anthropic Compatible",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],runtimeProviderIds:["custom"],consoleUrl:"https://undefineds.co",subscriptionUrl:"https://undefineds.co",endpoints:[{protocol:"anthropic",baseUrl:"https://example.invalid/v1"}],modelDiscovery:{strategy:"anthropic",path:"/models",endpointProtocol:"anthropic"},quota:{strategy:"unsupported",url:"https://undefineds.co"}}],q="https://www.kimi.com/code",it="https://www.kimi.com/user/agreement",rt="https://api.kimi.com/coding/v1",ot="https://api.kimi.com/coding/",at="https://platform.moonshot.cn/console/api-keys",Y="https://platform.moonshot.cn/console/account",st="https://platform.moonshot.cn/docs/intro",ct="https://api.moonshot.ai/v1",S="https://bailian.console.aliyun.com/",M="https://help.aliyun.com/zh/model-studio/",Z="https://open.bigmodel.cn/usercenter/apikeys",X="https://open.bigmodel.cn/",dt="https://open.bigmodel.cn/api/paas/v4",lt="https://open.bigmodel.cn/api/coding/paas/v4",me={openai:[{id:"official-subscription",label:"OpenAI Subscription",kind:"oauth-subscription",lifecycle:"unavailable",authModes:["oauth","local"],productLabel:"OpenAI",runtimeProviderIds:["openai"],credentialPrefixHints:[],consoleUrl:"https://chatgpt.com/codex",subscriptionUrl:"https://chatgpt.com/codex",endpoints:[{protocol:"responses",baseUrl:"https://chatgpt.com/backend-api/codex"}],modelDiscovery:{strategy:"unsupported",path:"/models",endpointProtocol:"responses"},quota:{strategy:"subscription",url:"https://chatgpt.com/codex"},usagePolicyUrl:"https://openai.com/policies/usage-policies/",region:"global"},{id:"api-platform",label:"API Platform",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],authorizationMethods:w,productLabel:"OpenAI",runtimeProviderIds:["openai"],credentialPrefixHints:["sk-"],consoleUrl:"https://platform.openai.com/api-keys",subscriptionUrl:"https://platform.openai.com/settings/organization/billing/overview",endpoints:[{protocol:"responses",baseUrl:"https://api.openai.com/v1"},{protocol:"chatCompletions",baseUrl:"https://api.openai.com/v1"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"responses"},quota:{strategy:"providerApi",url:"https://platform.openai.com/usage"},usagePolicyUrl:"https://openai.com/policies/usage-policies/",region:"global"}],anthropic:[{id:"official-subscription",label:"Claude Code Subscription",kind:"oauth-subscription",lifecycle:"unavailable",authModes:["oauth"],productLabel:"Anthropic",runtimeProviderIds:["anthropic"],credentialPrefixHints:[],consoleUrl:"https://claude.ai/",subscriptionUrl:"https://claude.ai/settings/billing",endpoints:[],modelDiscovery:{strategy:"unsupported",path:"/models",endpointProtocol:"anthropic"},quota:{strategy:"subscription",url:"https://claude.ai/settings/usage"},usagePolicyUrl:"https://www.anthropic.com/legal/aup",region:"global"},{id:"api-platform",label:"API Platform",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],authorizationMethods:w,productLabel:"Anthropic",runtimeProviderIds:["anthropic"],credentialPrefixHints:["sk-ant-"],consoleUrl:"https://console.anthropic.com/settings/keys",subscriptionUrl:"https://console.anthropic.com/settings/plans",endpoints:[{protocol:"anthropic",baseUrl:"https://api.anthropic.com/v1"}],modelDiscovery:{strategy:"anthropic",path:"/models",endpointProtocol:"anthropic"},quota:{strategy:"console",url:"https://console.anthropic.com/settings/limits"},usagePolicyUrl:"https://www.anthropic.com/legal/aup",region:"global"}],kimi:[Q({id:"subscription-key",label:"Token Plan",kind:"token-plan",authModes:["apiKey"],productLabel:"Kimi Coding",runtimeProviderIds:["kimi"],credentialPrefixHints:["sk-kimi-"],baseUrl:rt,anthropicBaseUrl:ot,quotaStrategy:"subscription",quotaUrl:q,consoleUrl:q,subscriptionUrl:q,usagePolicyUrl:it,supportsDeveloperMessages:!1}),Q({id:"api-platform",label:"API Platform",kind:"api-platform",authModes:["apiKey"],productLabel:"Moonshot AI",runtimeProviderIds:["kimi"],credentialPrefixHints:["sk-"],baseUrl:ct,quotaStrategy:"console",quotaUrl:Y,consoleUrl:at,subscriptionUrl:Y,usagePolicyUrl:st})],bailian:[O({id:"pay-as-you-go",label:"Pay as You Go",kind:"api-platform",runtimeProviderIds:["bailian"],credentialPrefixHints:["sk-"],region:"cn",baseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1",anthropicBaseUrl:"https://dashscope.aliyuncs.com/apps/anthropic",quotaStrategy:"console",consoleUrl:S,usagePolicyUrl:M}),O({id:"token-plan",label:"Token Plan Personal",kind:"token-plan",runtimeProviderIds:["bailian-token-plan"],credentialPrefixHints:["sk-"],region:"cn-beijing",baseUrl:"https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1",anthropicBaseUrl:"https://token-plan.cn-beijing.maas.aliyuncs.com/apps/anthropic",quotaStrategy:"subscription",consoleUrl:S,usagePolicyUrl:M}),O({id:"token-plan-team",label:"Token Plan Team",kind:"token-plan",runtimeProviderIds:["bailian-token-plan"],credentialPrefixHints:["sk-"],region:"cn-beijing",baseUrl:"https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1",anthropicBaseUrl:"https://token-plan.cn-beijing.maas.aliyuncs.com/apps/anthropic",quotaStrategy:"subscription",consoleUrl:S,usagePolicyUrl:M}),O({id:"coding-plan",label:"Coding Plan Pro",kind:"token-plan",runtimeProviderIds:["bailian-coding-plan"],credentialPrefixHints:["sk-sp-"],region:"cn",baseUrl:"https://coding.dashscope.aliyuncs.com/v1",anthropicBaseUrl:"https://coding.dashscope.aliyuncs.com/apps/anthropic",quotaStrategy:"subscription",consoleUrl:S,usagePolicyUrl:M})],deepseek:[{id:"api-platform",label:"API Platform",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],productLabel:"DeepSeek",runtimeProviderIds:["deepseek"],credentialPrefixHints:["sk-"],consoleUrl:"https://platform.deepseek.com/api_keys",subscriptionUrl:"https://platform.deepseek.com/usage",endpoints:[{protocol:"chatCompletions",baseUrl:"https://api.deepseek.com/v1"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"console",url:"https://platform.deepseek.com/usage"},usagePolicyUrl:"https://cdn.deepseek.com/policies/en-US/deepseek-open-platform-terms-of-use.html",region:"global"}],ollama:[{id:"local",label:"Local Ollama",kind:"local",lifecycle:"active",authModes:["local"],productLabel:"Ollama",runtimeProviderIds:["ollama"],credentialPrefixHints:[],consoleUrl:"https://ollama.com",subscriptionUrl:"https://ollama.com",endpoints:[{protocol:"chatCompletions",baseUrl:"http://localhost:11434/v1"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"unsupported",url:"https://ollama.com"},usagePolicyUrl:"https://ollama.com",region:"local"}],zhipu:[{id:"api-platform",label:"API Platform",kind:"api-platform",lifecycle:"active",authModes:["apiKey"],authorizationMethods:w,productLabel:"智谱 AI",runtimeProviderIds:["zhipu"],credentialPrefixHints:["id."],consoleUrl:Z,subscriptionUrl:"https://open.bigmodel.cn/finance-center/expense-manage",endpoints:[{protocol:"chatCompletions",baseUrl:dt,region:"cn"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"console",url:"https://open.bigmodel.cn/finance-center/expense-manage"},usagePolicyUrl:X,region:"cn"},{id:"coding-plan",label:"GLM Coding Plan",kind:"token-plan",lifecycle:"active",authModes:["apiKey"],authorizationMethods:w,productLabel:"智谱 AI",runtimeProviderIds:["zhipu"],credentialPrefixHints:["id."],consoleUrl:Z,subscriptionUrl:"https://bigmodel.cn/glm-coding",endpoints:[{protocol:"chatCompletions",baseUrl:lt,region:"cn"}],modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:"subscription",url:"https://bigmodel.cn/glm-coding"},usagePolicyUrl:X,region:"cn"}]};function Q(e){return{id:e.id,label:e.label,kind:e.kind,lifecycle:"active",authModes:e.authModes,authorizationMethods:w,productLabel:e.productLabel,runtimeProviderIds:e.runtimeProviderIds,credentialPrefixHints:e.credentialPrefixHints,consoleUrl:e.consoleUrl,subscriptionUrl:e.subscriptionUrl,endpoints:he(e.baseUrl,e.anthropicBaseUrl,"cn",e.supportsDeveloperMessages),modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:e.quotaStrategy,url:e.quotaUrl},usagePolicyUrl:e.usagePolicyUrl,region:"cn"}}function O(e){return{id:e.id,label:e.label,lifecycle:"active",productLabel:"Alibaba Bailian",kind:e.kind,authModes:["apiKey"],authorizationMethods:w,runtimeProviderIds:e.runtimeProviderIds,credentialPrefixHints:e.credentialPrefixHints,consoleUrl:e.consoleUrl,subscriptionUrl:e.consoleUrl,endpoints:he(e.baseUrl,e.anthropicBaseUrl,e.region),modelDiscovery:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"},quota:{strategy:e.quotaStrategy,url:e.consoleUrl},usagePolicyUrl:e.usagePolicyUrl,region:e.region}}function he(e,t,n,s){return[{protocol:"chatCompletions",baseUrl:e,region:n,...s===void 0?{}:{supportsDeveloperMessages:s}},...t?[{protocol:"anthropic",baseUrl:t,region:n}]:[]]}function pt(e,t=!1){return(me[e]??ye).map(n=>e==="openai"&&n.id==="official-subscription"&&t?{...n,lifecycle:"active",authModes:Array.from(new Set([...n.authModes??[],"local"])),authorizationMethods:[{id:"device-code",authMode:"deviceCode",connectMode:"deviceCodeOAuth",label:"设备码登录",lifecycle:"active"},{id:"local-session-import",authMode:"local",label:"已有登录态",lifecycle:"active"}]}:{...n})}const Tt=D.flatMap(e=>[e,...ut(e).map(t=>`${e}-${t.id}`)]);function ut(e){return e==="custom"?nt:me[e]??ye}function Rt(e,t){return e==="anthropic"||t==="anthropic-compatible"?"anthropic":"openai"}function xt(e){switch(e){case"openai":return"OpenAI";case"anthropic":return"Anthropic";case"kimi":return"Kimi";case"bailian":return"百炼";case"deepseek":return"DeepSeek";case"zhipu":return"智谱 AI";case"ollama":return"Ollama";case"custom":return"Custom"}}function ft(e,t){return e==="openai"&&(t==="local"||t==="oauth"||t==="deviceCode")?"official-subscription":e==="kimi"&&(t==="oauth"||t==="deviceCode")?"subscription-key":e==="bailian"?"pay-as-you-go":e==="ollama"?"local":e==="custom"?"openai-compatible":"api-platform"}function Lt(e,t){const n=pt(e).find(c=>c.id===(t??ft(e,"apiKey")));if(!n)return;const s=n.modelDiscovery?.endpointProtocol;return n.endpoints?.find(c=>c.protocol===s)?.baseUrl??n.endpoints?.[0]?.baseUrl}function qt(e,t){const n=t.trim().toLowerCase();if(e==="bailian"){if(n==="token-plan-personal")return"token-plan";if(n==="coding-plan-pro")return"coding-plan"}return n}function Nt(e){return{offeringId:e.offeringId,priority:e.priority??100,enabled:e.enabled??!0,health:e.health??"unknown",...e.baseUrl?{baseUrl:e.baseUrl}:{}}}const yt=3e4;function zt({webId:e,podUrl:t,authenticatedFetch:n}){return ve({webId:e,podBaseUrl:t,authenticatedFetch:mt(n)})}function mt(e){return(async(t,n)=>z(await e(t,n)))}function ht({podUrl:e,authenticatedFetch:t,invocationFetch:n=t,now:s=()=>new Date,invocationSelector:c=At}){const d=K(e);let f,h;const r=async(u,m)=>{const b=await t(u,m);return f=await It(b.clone(),c),b},i=async()=>{if(wt(f,s()))return f;if(h)return h;h=a();try{return await h}finally{h=void 0}},a=async()=>{if(!(await r(`${d}/api/applets/service-access/ai-connections`,{method:"GET",credentials:"include",headers:{accept:"application/json"}})).ok)throw new Error("AI Connection request failed. Please try again.");const m=f;if(!m?.token)throw new Error("AI Connection request failed. Please try again.");return m},l=async(u,m)=>{const b=await i(),k=Ut(b);if(!k)throw new Error("AI Connection request failed. Please try again.");const j=new Headers(m?.headers);return j.set("Authorization",`Bearer ${k}`),n(u,{...m,credentials:"omit",headers:j})};return(async(u,m)=>{if(gt(u,d))return r(u,m);if(!bt(u,d))return t(u,m);const b=await l(u,m);if(b.status!==401)return z(b);await b.arrayBuffer(),f=void 0;const k=await l(u,m);return z(k)})}function Dt({podUrl:e,controlPlaneOrigin:t,authenticatedFetch:n,invocationFetch:s,now:c}){const d=K(e),f=s??n,r=ht({podUrl:e,authenticatedFetch:n,invocationFetch:(i,a)=>{const l=new URL(i instanceof Request?i.url:String(i),d);if(t&&l.origin===d&&l.pathname.startsWith("/api/ai/client-configuration/")){const u=new URL(`${l.pathname}${l.search}`,t);return f(i instanceof Request?new Request(u,i):u.href,a)}return f(i,a)},now:c,invocationSelector:Pt});return{inspect:async i=>{const a=await r(A(d,i),{method:"GET",credentials:"omit",headers:{accept:"application/json"}});return a.status===403||a.status===404||a.status===503?(await a.arrayBuffer(),v()):P(a)},plan:async i=>P(await r(`${A(d,i.client)}/plan`,{method:"POST",credentials:"omit",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify({endpoint:t?new URL(t).origin:i.endpoint,...i.activeModels!==void 0?{activeModels:i.activeModels}:{}})})),apply:async i=>P(await r(`${A(d,i.client)}/apply`,{method:"POST",credentials:"omit",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify({planId:i.planId,apiKey:i.apiKey,confirmation:i.confirmation})})),verify:async i=>P(await r(`${A(d,i.client)}/verify`,{method:"POST",credentials:"omit",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify({planId:i.planId})})),launch:async i=>P(await r(`${A(d,i)}/launch`,{method:"POST",credentials:"omit",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify({})})),restore:async i=>{const a=await r(`${A(d,i)}/restore`,{method:"POST",credentials:"omit",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify({})});return a.status===403||a.status===404||a.status===503?(await a.arrayBuffer(),v()):P(a)}}}function gt(e,t){try{const n=new URL(String(e),t),s=new URL(t);return n.origin===s.origin&&n.pathname==="/api/applets/service-access/ai-connections"}catch{return!1}}function bt(e,t){try{const n=new URL(String(e),t),s=new URL(t);return n.origin===s.origin&&(n.pathname.startsWith("/api/ai/")||n.pathname.startsWith("/v1/"))}catch{return!1}}async function It(e,t){if(!(!e.ok||!e.headers.get("content-type")?.includes("application/json")))try{const n=await e.json();return Ct(t(n))}catch{return}}function At(e){return e.invocation}function Pt(e){const t=e.aiClientConfiguration;return T(t)?t.invocation:void 0}function wt(e,t){if(!e?.token)return!1;if(!e.expiresAt)return!0;const n=Date.parse(e.expiresAt);return Number.isFinite(n)&&n-t.getTime()>yt}function Ut(e){return e?.token}function Ct(e){if(!T(e))return;const t=["gateway","Key"].join("");return{token:typeof e.token=="string"?e.token:typeof e.apiKey=="string"?e.apiKey:typeof e[t]=="string"?e[t]:void 0,baseUrl:typeof e.baseUrl=="string"?e.baseUrl:void 0,expiresAt:typeof e.expiresAt=="string"?e.expiresAt:void 0}}async function z(e){return e.ok?e:e.headers.get("content-type")?.includes("application/json")?kt(e):(await e.arrayBuffer(),new Response(JSON.stringify({error:"internal_error"}),{status:e.status,statusText:e.statusText,headers:{"content-type":"application/json"}}))}function A(e,t){return`${e}/api/ai/client-configuration/${encodeURIComponent(t)}`}async function P(e){if(!e.ok)throw await _t(e);if(!e.headers.get("content-type")?.includes("application/json"))throw await e.arrayBuffer(),new Error("AI client configuration request failed. Please try again.");return await e.json()}async function _t(e){let t;try{t=e.headers.get("content-type")?.includes("application/json")?await e.json():void 0}catch{t=void 0}if(T(t)){const n=typeof t.code=="string"?t.code:typeof t.error=="string"?t.error:void 0,s=typeof t.message=="string"?t.message:"AI client configuration request failed. Please try again.",c=new Error(s);return c.code=n,c.status=e.status,c.details=t.details,c}return await e.arrayBuffer().catch(()=>{}),new Error("AI client configuration request failed. Please try again.")}function v(){return{status:"unavailable",message:"Host does not support local client configuration. Use the manual setup instructions for your client."}}async function kt(e){let t;try{t=await e.clone().json()}catch{return e}const n=Mt(t);return n?new Response(JSON.stringify({code:n}),{status:e.status,statusText:e.statusText,headers:{"content-type":"application/json"}}):St(t)?new Response(JSON.stringify({code:t.error.code,error:t.error.message}),{status:e.status,statusText:e.statusText,headers:{"content-type":"application/json"}}):e}function St(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;const t=e.error;return!!(t&&typeof t=="object"&&!Array.isArray(t)&&typeof t.code=="string"&&typeof t.message=="string"&&typeof t.status=="number")}function Mt(e){if(!(!T(e)||typeof e.error!="string")&&e.error==="Gateway API Key plaintext is not available")return"gateway_api_key_plaintext_unavailable"}function T(e){return!!(e&&typeof e=="object"&&!Array.isArray(e))}export{D as A,nt as C,zt as a,xt as b,Nt as c,ft as d,Rt as e,Tt as f,ve as g,ge as h,Et as i,Dt as j,Ot as n,Lt as o,pt as p,qt as s};