@undefineds.co/xpod 0.4.18 → 0.4.19

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 (837) hide show
  1. package/config/components-ignore.json +8 -13
  2. package/dist/api/ai-gateway/pod/HostedPodRoute.d.ts +7 -0
  3. package/dist/api/ai-gateway/pod/HostedPodRoute.js +68 -1
  4. package/dist/api/chatkit/pod-store.js +14 -0
  5. package/dist/api/container/common.js +6 -3
  6. package/dist/api/container/routes.js +9 -6
  7. package/dist/api/handlers/AgentWakeHandler.d.ts +10 -0
  8. package/dist/api/handlers/AgentWakeHandler.js +62 -0
  9. package/dist/api/handlers/AiGatewayManagementHandler.js +43 -0
  10. package/dist/api/handlers/MatrixHandler.d.ts +3 -0
  11. package/dist/api/handlers/MatrixHandler.js +120 -105
  12. package/dist/api/handlers/NetworkSettingsHandler.d.ts +1 -31
  13. package/dist/api/handlers/NetworkSettingsHandler.js +3 -76
  14. package/dist/api/handlers/PodAccessFailureResponse.d.ts +1 -2
  15. package/dist/api/handlers/PodAccessFailureResponse.js +5 -4
  16. package/dist/api/handlers/ReachabilityHandler.js +0 -5
  17. package/dist/api/handlers/readBoundedRequestBody.d.ts +3 -0
  18. package/dist/api/handlers/readBoundedRequestBody.js +37 -0
  19. package/dist/api/matrix/MatrixError.d.ts +6 -0
  20. package/dist/api/matrix/MatrixError.js +14 -0
  21. package/dist/api/matrix/MatrixEventJournal.d.ts +39 -0
  22. package/dist/api/matrix/MatrixEventJournal.js +169 -0
  23. package/dist/api/matrix/MatrixPodResolver.d.ts +12 -0
  24. package/dist/api/matrix/MatrixPodResolver.js +61 -0
  25. package/dist/api/matrix/PodMatrixStore.d.ts +58 -12
  26. package/dist/api/matrix/PodMatrixStore.js +527 -204
  27. package/dist/api/matrix/types.d.ts +15 -0
  28. package/dist/api/reconciler/AgentWakeRuntimeService.d.ts +66 -0
  29. package/dist/api/reconciler/AgentWakeRuntimeService.js +79 -0
  30. package/dist/api/reconciler/AgentWakeRuntimeService.jsonld +173 -0
  31. package/dist/api/reconciler/ServerGroupReconcilerService.d.ts +3 -0
  32. package/dist/api/reconciler/ServerGroupReconcilerService.js +12 -4
  33. package/dist/api/reconciler/ServerGroupReconcilerService.jsonld +8 -0
  34. package/dist/api/reconciler/WakeAgentQueue.d.ts +32 -2
  35. package/dist/api/reconciler/WakeAgentQueue.js +183 -66
  36. package/dist/api/reconciler/WakeAgentQueue.jsonld +152 -6
  37. package/dist/api/reconciler/coordination.d.ts +5 -0
  38. package/dist/api/reconciler/coordination.js +1 -1
  39. package/dist/api/reconciler/coordination.jsonld +20 -0
  40. package/dist/api/reconciler/index.d.ts +1 -0
  41. package/dist/api/reconciler/index.js +1 -0
  42. package/dist/api/runs/store.d.ts +4 -0
  43. package/dist/api/runtime.js +21 -44
  44. package/dist/cli/commands/start.d.ts +18 -11
  45. package/dist/cli/commands/start.js +49 -44
  46. package/dist/cli/commands/stop.js +1 -7
  47. package/dist/components/components.jsonld +1 -1
  48. package/dist/components/context.jsonld +52 -61
  49. package/dist/dns/cloudflare/CloudflareDnsProvider.d.ts +1 -10
  50. package/dist/dns/cloudflare/CloudflareDnsProvider.js +28 -59
  51. package/dist/edge/EdgeNodeAgent.d.ts +0 -5
  52. package/dist/edge/EdgeNodeAgent.js +0 -8
  53. package/dist/edge/acme/AcmeCertificateManager.d.ts +0 -24
  54. package/dist/edge/acme/AcmeCertificateManager.js +7 -75
  55. package/dist/edge/acme/AcmeCertificateManager.jsonld +0 -24
  56. package/dist/edge/frp/FrpcProcessManager.d.ts +0 -16
  57. package/dist/edge/frp/FrpcProcessManager.js +13 -73
  58. package/dist/edge/reachability/ManagedClientFetch.d.ts +0 -2
  59. package/dist/edge/reachability/ManagedClientFetch.js +12 -24
  60. package/dist/edge/reachability/ManagedClientFetch.jsonld +0 -4
  61. package/dist/edge/reachability/ManagedRouteSelector.d.ts +0 -2
  62. package/dist/edge/reachability/ManagedRouteSelector.js +13 -7
  63. package/dist/edge/reachability/ManagedRouteSelector.jsonld +0 -4
  64. package/dist/edge/reachability/P2PDataPlane.d.ts +4 -67
  65. package/dist/edge/reachability/P2PDataPlane.js +15 -156
  66. package/dist/edge/reachability/P2PDataPlane.jsonld +0 -64
  67. package/dist/edge/reachability/P2PSignalingClient.d.ts +0 -2
  68. package/dist/edge/reachability/P2PSignalingClient.js +0 -1
  69. package/dist/edge/reachability/P2PSignalingClient.jsonld +0 -4
  70. package/dist/edge/reachability/ReachabilitySessionService.d.ts +0 -19
  71. package/dist/edge/reachability/ReachabilitySessionService.js +52 -122
  72. package/dist/edge/reachability/ReachabilitySessionService.jsonld +0 -26
  73. package/dist/edge/reachability/TcpP2PDataPlaneTransport.d.ts +4 -28
  74. package/dist/edge/reachability/TcpP2PDataPlaneTransport.js +32 -540
  75. package/dist/edge/reachability/TcpP2PDataPlaneTransport.jsonld +0 -51
  76. package/dist/edge/reachability/TcpP2PSignalingSession.d.ts +0 -7
  77. package/dist/edge/reachability/TcpP2PSignalingSession.js +1 -25
  78. package/dist/edge/reachability/TcpP2PSignalingSession.jsonld +0 -12
  79. package/dist/edge/reachability/index.d.ts +0 -1
  80. package/dist/edge/reachability/index.js +0 -1
  81. package/dist/edge/reachability/types.d.ts +0 -8
  82. package/dist/edge/reachability/types.jsonld +0 -8
  83. package/dist/identity/drizzle/EdgeNodeRepository.d.ts +0 -12
  84. package/dist/identity/drizzle/EdgeNodeRepository.js +0 -37
  85. package/dist/identity/drizzle/PodLookupRepository.js +5 -4
  86. package/dist/identity/drizzle/db.d.ts +0 -8
  87. package/dist/identity/drizzle/db.js +0 -17
  88. package/dist/runtime/GatewayAdminProxyAuth.d.ts +2 -2
  89. package/dist/runtime/Proxy.js +2 -5
  90. package/dist/runtime/css-process.d.ts +3 -3
  91. package/dist/runtime/index.d.ts +1 -7
  92. package/dist/runtime/index.js +1 -21
  93. package/dist/runtime/port-finder.d.ts +3 -27
  94. package/dist/runtime/port-finder.js +22 -52
  95. package/dist/runtime/safe-env.d.ts +1 -1
  96. package/dist/runtime/user-env.d.ts +2 -2
  97. package/dist/supervisor/Supervisor.d.ts +3 -26
  98. package/dist/supervisor/Supervisor.js +23 -130
  99. package/dist/supervisor/types.d.ts +1 -14
  100. package/dist/test-utils/local-managed-client-p2p-e2e-smoke.js +0 -15
  101. package/dist/tunnel/LocalTunnelProvider.d.ts +0 -7
  102. package/dist/tunnel/LocalTunnelProvider.js +3 -11
  103. package/dist/tunnel/LocalTunnelProvider.jsonld +0 -39
  104. package/dist/tunnel/NgrokTunnelProvider.d.ts +0 -2
  105. package/dist/tunnel/NgrokTunnelProvider.js +1 -3
  106. package/dist/tunnel/NgrokTunnelProvider.jsonld +0 -39
  107. package/dist/tunnel/SakuraFrpTunnelProvider.d.ts +1 -3
  108. package/dist/tunnel/SakuraFrpTunnelProvider.js +3 -7
  109. package/dist/tunnel/TunnelLifecycle.d.ts +1 -9
  110. package/dist/tunnel/TunnelLifecycle.js +3 -24
  111. package/dist/tunnel/TunnelProviderCatalog.d.ts +0 -32
  112. package/dist/tunnel/TunnelProviderCatalog.js +0 -43
  113. package/node_modules/@solid/access-token-verifier/node_modules/n3/browser/n3.min.js +1 -0
  114. package/node_modules/@solid/community-server/node_modules/n3/browser/n3.min.js +1 -0
  115. package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.js +10 -39
  116. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsList.js +4 -15
  117. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.d.ts +1 -1
  118. package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.js +1 -4
  119. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeyRow.d.ts +1 -5
  120. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeyRow.js +2 -2
  121. package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.js +1 -5
  122. package/node_modules/@undefineds.co/ai-connections/dist/controller.d.ts +0 -4
  123. package/node_modules/@undefineds.co/ai-connections/dist/controller.js +1 -3
  124. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/aggregates.d.ts +19 -0
  125. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/ast-to-sparql.d.ts +66 -0
  126. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/compile-time-types.d.ts +40 -0
  127. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/comunica-patch.d.ts +2 -0
  128. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/conflict-resolution.d.ts +110 -0
  129. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/discovery/composite-discovery.d.ts +18 -0
  130. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/discovery/index.d.ts +7 -0
  131. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/discovery/interop-discovery.d.ts +36 -0
  132. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/discovery/interop-tables.d.ts +37 -0
  133. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/discovery/interop-types.d.ts +36 -0
  134. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/discovery/provider-cache.d.ts +99 -0
  135. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/discovery/typeindex-discovery.d.ts +32 -0
  136. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/discovery/types.d.ts +132 -0
  137. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/exact-records.d.ts +21 -0
  138. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/index.d.ts +14 -0
  139. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.d.ts +76 -0
  140. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-strategy.d.ts +53 -0
  141. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor-types.d.ts +9 -0
  142. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/pod-executor.d.ts +73 -0
  143. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/sparql-strategy.d.ts +31 -0
  144. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/strategy-factory.d.ts +42 -0
  145. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/types.d.ts +85 -0
  146. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/expressions.d.ts +40 -0
  147. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/federated/executor.d.ts +98 -0
  148. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/federated/index.d.ts +3 -0
  149. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/federated/types.d.ts +69 -0
  150. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/notifications/channels/base-channel.d.ts +29 -0
  151. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/notifications/channels/index.d.ts +4 -0
  152. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/notifications/channels/sse-channel.d.ts +50 -0
  153. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/notifications/channels/websocket-channel.d.ts +16 -0
  154. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/notifications/index.d.ts +3 -0
  155. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/notifications/notifications-client.d.ts +88 -0
  156. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/notifications/types.d.ts +228 -0
  157. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/order-by.d.ts +9 -0
  158. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.d.ts +548 -0
  159. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-dialect.d.ts +324 -0
  160. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-discovery.d.ts +20 -0
  161. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-session.d.ts +52 -0
  162. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/profile-manager.d.ts +90 -0
  163. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/default-id-template.d.ts +10 -0
  164. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/delete-query-builder.d.ts +31 -0
  165. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/helpers.d.ts +11 -0
  166. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/index.d.ts +7 -0
  167. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/insert-query-builder.d.ts +37 -0
  168. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.d.ts +150 -0
  169. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/types.d.ts +40 -0
  170. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/update-query-builder.d.ts +34 -0
  171. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-conditions.d.ts +60 -0
  172. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-where-policy.d.ts +8 -0
  173. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/rdf-constants.d.ts +16 -0
  174. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/rdf-schema-parser.d.ts +34 -0
  175. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/repository.d.ts +78 -0
  176. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-reference.d.ts +31 -0
  177. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/base-resolver.d.ts +141 -0
  178. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/document-resolver.d.ts +36 -0
  179. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/factory.d.ts +27 -0
  180. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/fragment-resolver.d.ts +34 -0
  181. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/index.d.ts +11 -0
  182. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/resource-resolver/types.d.ts +57 -0
  183. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/runtime/pod-runtime.d.ts +60 -0
  184. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/columns.d.ts +74 -0
  185. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/defs.d.ts +101 -0
  186. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/factories.d.ts +29 -0
  187. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/index.d.ts +9 -0
  188. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/pod-table.d.ts +118 -0
  189. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/relations.d.ts +26 -0
  190. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/solid-schema.d.ts +22 -0
  191. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/types.d.ts +45 -0
  192. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/schema/utils.d.ts +15 -0
  193. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/select-plan.d.ts +50 -0
  194. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/services/pod-services.d.ts +43 -0
  195. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/shape/generator.d.ts +12 -0
  196. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/shape/index.d.ts +4 -0
  197. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/shape/manager.d.ts +45 -0
  198. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/shape/shacl-parser.d.ts +19 -0
  199. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/shape/shacl.d.ts +11 -0
  200. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/shape/types.d.ts +149 -0
  201. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/shape/validator.d.ts +11 -0
  202. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/solid-n3-client.d.ts +86 -0
  203. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/sparql/builder/expression-builder.d.ts +56 -0
  204. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/sparql/builder/select-builder.d.ts +44 -0
  205. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/sparql/builder/update-builder.d.ts +33 -0
  206. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/sparql/helpers.d.ts +19 -0
  207. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/sparql/types.d.ts +10 -0
  208. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/sparql-engine.d.ts +16 -0
  209. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/sparql-executor.d.ts +40 -0
  210. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/index.d.ts +29 -0
  211. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/resolver.d.ts +116 -0
  212. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/subject/types.d.ts +97 -0
  213. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/builder.d.ts +86 -0
  214. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/array.d.ts +23 -0
  215. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/default.d.ts +20 -0
  216. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/index.d.ts +35 -0
  217. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/inline.d.ts +35 -0
  218. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/inverse.d.ts +26 -0
  219. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/uri.d.ts +28 -0
  220. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/index.d.ts +9 -0
  221. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/types.d.ts +156 -0
  222. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/typeindex-manager.d.ts +130 -0
  223. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/types.d.ts +57 -0
  224. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/index.d.ts +8 -0
  225. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/resolver.d.ts +153 -0
  226. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/uri/types.d.ts +154 -0
  227. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/utils/debug-logger.d.ts +19 -0
  228. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/utils/origin-auth.d.ts +28 -0
  229. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/utils/pod-root.d.ts +15 -0
  230. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/zod-integration.d.ts +97 -0
  231. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/driver.d.ts +60 -0
  232. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/index.d.ts +31 -0
  233. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/pod.d.ts +140 -0
  234. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/solid.d.ts +21 -0
  235. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/test-utils/real-test-helpers.d.ts +5 -0
  236. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/types/sparql-types.d.ts +27 -0
  237. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/utils/find-by-iri.d.ts +11 -0
  238. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/utils/helpers.d.ts +17 -0
  239. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/utils/namespace.d.ts +4 -0
  240. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/utils/rdf-helpers.d.ts +17 -0
  241. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/utils/rdf-validation.d.ts +27 -0
  242. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/utils/thing-operations.d.ts +28 -0
  243. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/utils/webid-resolver.d.ts +23 -0
  244. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/index.ts +4 -0
  245. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/locales/index.ts +1 -0
  246. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/mini/index.ts +3 -0
  247. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/ZodError.ts +330 -0
  248. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/benchmarks/datetime.ts +58 -0
  249. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/benchmarks/discriminatedUnion.ts +80 -0
  250. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/benchmarks/index.ts +59 -0
  251. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/benchmarks/ipv4.ts +57 -0
  252. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/benchmarks/object.ts +69 -0
  253. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/benchmarks/primitives.ts +162 -0
  254. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/benchmarks/realworld.ts +63 -0
  255. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/benchmarks/string.ts +55 -0
  256. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/benchmarks/union.ts +80 -0
  257. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/errors.ts +13 -0
  258. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/external.ts +6 -0
  259. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/helpers/enumUtil.ts +17 -0
  260. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/helpers/errorUtil.ts +8 -0
  261. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/helpers/parseUtil.ts +176 -0
  262. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/helpers/partialUtil.ts +34 -0
  263. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/helpers/typeAliases.ts +2 -0
  264. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/helpers/util.ts +224 -0
  265. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/index.ts +4 -0
  266. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/locales/en.ts +124 -0
  267. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/standard-schema.ts +113 -0
  268. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/Mocker.ts +54 -0
  269. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/all-errors.test.ts +157 -0
  270. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/anyunknown.test.ts +28 -0
  271. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/array.test.ts +71 -0
  272. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/async-parsing.test.ts +388 -0
  273. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/async-refinements.test.ts +46 -0
  274. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/base.test.ts +29 -0
  275. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/bigint.test.ts +55 -0
  276. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/branded.test.ts +53 -0
  277. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/catch.test.ts +220 -0
  278. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/coerce.test.ts +133 -0
  279. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/complex.test.ts +70 -0
  280. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/custom.test.ts +31 -0
  281. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/date.test.ts +32 -0
  282. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/deepmasking.test.ts +186 -0
  283. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/default.test.ts +112 -0
  284. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/description.test.ts +33 -0
  285. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/discriminated-unions.test.ts +315 -0
  286. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/enum.test.ts +80 -0
  287. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/error.test.ts +551 -0
  288. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/firstparty.test.ts +87 -0
  289. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/firstpartyschematypes.test.ts +21 -0
  290. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/function.test.ts +261 -0
  291. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/generics.test.ts +48 -0
  292. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/instanceof.test.ts +37 -0
  293. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/intersection.test.ts +110 -0
  294. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/language-server.source.ts +76 -0
  295. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/language-server.test.ts +207 -0
  296. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/literal.test.ts +36 -0
  297. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/map.test.ts +110 -0
  298. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/masking.test.ts +4 -0
  299. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/mocker.test.ts +19 -0
  300. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/nan.test.ts +24 -0
  301. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/nativeEnum.test.ts +87 -0
  302. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/nullable.test.ts +42 -0
  303. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/number.test.ts +176 -0
  304. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/object-augmentation.test.ts +29 -0
  305. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/object-in-es5-env.test.ts +29 -0
  306. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/object.test.ts +434 -0
  307. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/optional.test.ts +42 -0
  308. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/parseUtil.test.ts +23 -0
  309. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/parser.test.ts +41 -0
  310. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/partials.test.ts +243 -0
  311. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/pickomit.test.ts +111 -0
  312. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/pipeline.test.ts +29 -0
  313. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/preprocess.test.ts +186 -0
  314. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/primitive.test.ts +440 -0
  315. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/promise.test.ts +90 -0
  316. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/readonly.test.ts +194 -0
  317. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/record.test.ts +171 -0
  318. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/recursive.test.ts +197 -0
  319. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/refine.test.ts +313 -0
  320. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/safeparse.test.ts +27 -0
  321. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/set.test.ts +142 -0
  322. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/standard-schema.test.ts +83 -0
  323. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/string.test.ts +916 -0
  324. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/transformer.test.ts +233 -0
  325. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/tuple.test.ts +90 -0
  326. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/unions.test.ts +57 -0
  327. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/validations.test.ts +133 -0
  328. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/tests/void.test.ts +15 -0
  329. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v3/types.ts +5138 -0
  330. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/checks.ts +32 -0
  331. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/coerce.ts +27 -0
  332. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/compat.ts +70 -0
  333. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/errors.ts +82 -0
  334. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/external.ts +52 -0
  335. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/from-json-schema.ts +659 -0
  336. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/index.ts +5 -0
  337. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/iso.ts +90 -0
  338. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/parse.ts +82 -0
  339. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/schemas.ts +2672 -0
  340. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/anyunknown.test.ts +26 -0
  341. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/apply.test.ts +59 -0
  342. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/array.test.ts +264 -0
  343. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/assignability.test.ts +216 -0
  344. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/async-parsing.test.ts +381 -0
  345. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/async-refinements.test.ts +68 -0
  346. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/base.test.ts +7 -0
  347. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/bigint.test.ts +54 -0
  348. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/brand.test.ts +106 -0
  349. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/catch.test.ts +326 -0
  350. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/coalesce.test.ts +20 -0
  351. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/codec-examples.test.ts +573 -0
  352. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/codec.test.ts +703 -0
  353. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/coerce.test.ts +160 -0
  354. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/continuability.test.ts +374 -0
  355. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/custom.test.ts +40 -0
  356. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/date.test.ts +62 -0
  357. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/datetime.test.ts +302 -0
  358. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/default.test.ts +409 -0
  359. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/describe-meta-checks.test.ts +27 -0
  360. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/description.test.ts +32 -0
  361. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/detached-methods.test.ts +197 -0
  362. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/discriminated-unions.test.ts +694 -0
  363. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/enum.test.ts +285 -0
  364. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/error-utils.test.ts +807 -0
  365. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/error.test.ts +711 -0
  366. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/file.test.ts +96 -0
  367. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/firstparty.test.ts +179 -0
  368. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/fix-json-issue.test.ts +26 -0
  369. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/from-json-schema.test.ts +895 -0
  370. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/function.test.ts +360 -0
  371. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/generics.test.ts +72 -0
  372. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/global-config.test.ts +39 -0
  373. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/hash.test.ts +68 -0
  374. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/index.test.ts +939 -0
  375. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/instanceof.test.ts +60 -0
  376. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/intersection.test.ts +198 -0
  377. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/jitless-allows-eval.test.ts +46 -0
  378. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/json.test.ts +109 -0
  379. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/lazy.test.ts +227 -0
  380. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/literal.test.ts +117 -0
  381. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/locales_ka.test.ts +29 -0
  382. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/locales_ro.test.ts +24 -0
  383. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/map.test.ts +330 -0
  384. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/nan.test.ts +21 -0
  385. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/nested-refine.test.ts +168 -0
  386. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/nonoptional.test.ts +101 -0
  387. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/nullable.test.ts +22 -0
  388. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/number.test.ts +325 -0
  389. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/object.test.ts +717 -0
  390. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/optional.test.ts +333 -0
  391. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/partial.test.ts +450 -0
  392. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/pickomit.test.ts +211 -0
  393. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/pipe.test.ts +101 -0
  394. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/prefault.test.ts +74 -0
  395. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/preprocess-types.test.ts +26 -0
  396. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/preprocess.test.ts +351 -0
  397. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/primitive.test.ts +175 -0
  398. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/promise.test.ts +81 -0
  399. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/prototypes.test.ts +23 -0
  400. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/readonly.test.ts +252 -0
  401. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/record.test.ts +717 -0
  402. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/recursive-types.test.ts +631 -0
  403. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/refine.test.ts +633 -0
  404. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/registries.test.ts +243 -0
  405. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/set.test.ts +181 -0
  406. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/standard-schema.test.ts +134 -0
  407. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/string-formats.test.ts +125 -0
  408. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/string.test.ts +1224 -0
  409. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/stringbool.test.ts +106 -0
  410. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/template-literal.test.ts +771 -0
  411. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/to-json-schema-methods.test.ts +438 -0
  412. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/to-json-schema.test.ts +3125 -0
  413. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/transform.test.ts +378 -0
  414. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/tuple.test.ts +496 -0
  415. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/union.test.ts +273 -0
  416. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/url.test.ts +13 -0
  417. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/validations.test.ts +283 -0
  418. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/classic/tests/void.test.ts +12 -0
  419. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/api.ts +1823 -0
  420. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/checks.ts +1293 -0
  421. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/config.ts +15 -0
  422. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/core.ts +153 -0
  423. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/doc.ts +44 -0
  424. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/errors.ts +455 -0
  425. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/index.ts +16 -0
  426. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/json-schema-generator.ts +126 -0
  427. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/json-schema-processors.ts +666 -0
  428. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/json-schema.ts +147 -0
  429. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/parse.ts +195 -0
  430. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/regexes.ts +190 -0
  431. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/registries.ts +105 -0
  432. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/schemas.ts +4730 -0
  433. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/standard-schema.ts +159 -0
  434. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/tests/extend.test.ts +59 -0
  435. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/tests/index.test.ts +46 -0
  436. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/tests/locales/be.test.ts +124 -0
  437. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/tests/locales/el.test.ts +215 -0
  438. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/tests/locales/en.test.ts +22 -0
  439. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/tests/locales/es.test.ts +181 -0
  440. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/tests/locales/fr.test.ts +72 -0
  441. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/tests/locales/he.test.ts +379 -0
  442. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/tests/locales/hr.test.ts +163 -0
  443. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/tests/locales/nl.test.ts +46 -0
  444. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/tests/locales/ru.test.ts +128 -0
  445. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/tests/locales/tr.test.ts +69 -0
  446. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/tests/locales/uz.test.ts +105 -0
  447. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/tests/record-constructor.test.ts +125 -0
  448. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/tests/recursive-tuples.test.ts +45 -0
  449. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/to-json-schema.ts +622 -0
  450. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/util.ts +983 -0
  451. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/versions.ts +5 -0
  452. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/core/zsf.ts +323 -0
  453. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/index.ts +4 -0
  454. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/ar.ts +115 -0
  455. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/az.ts +111 -0
  456. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/be.ts +176 -0
  457. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/bg.ts +128 -0
  458. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/ca.ts +116 -0
  459. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/cs.ts +118 -0
  460. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/da.ts +123 -0
  461. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/de.ts +116 -0
  462. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/el.ts +121 -0
  463. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/en.ts +123 -0
  464. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/eo.ts +118 -0
  465. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/es.ts +141 -0
  466. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/fa.ts +126 -0
  467. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/fi.ts +121 -0
  468. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/fr-CA.ts +116 -0
  469. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/fr.ts +132 -0
  470. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/he.ts +246 -0
  471. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/hr.ts +131 -0
  472. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/hu.ts +117 -0
  473. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/hy.ts +164 -0
  474. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/id.ts +115 -0
  475. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/index.ts +52 -0
  476. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/is.ts +119 -0
  477. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/it.ts +116 -0
  478. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/ja.ts +114 -0
  479. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/ka.ts +123 -0
  480. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/kh.ts +7 -0
  481. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/km.ts +119 -0
  482. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/ko.ts +121 -0
  483. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/lt.ts +239 -0
  484. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/mk.ts +118 -0
  485. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/ms.ts +115 -0
  486. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/nl.ts +121 -0
  487. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/no.ts +116 -0
  488. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/ota.ts +117 -0
  489. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/pl.ts +118 -0
  490. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/ps.ts +126 -0
  491. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/pt.ts +116 -0
  492. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/ro.ts +129 -0
  493. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/ru.ts +176 -0
  494. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/sl.ts +118 -0
  495. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/sv.ts +119 -0
  496. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/ta.ts +118 -0
  497. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/th.ts +119 -0
  498. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/tr.ts +111 -0
  499. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/ua.ts +7 -0
  500. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/uk.ts +117 -0
  501. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/ur.ts +119 -0
  502. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/uz.ts +117 -0
  503. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/vi.ts +117 -0
  504. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/yo.ts +124 -0
  505. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/zh-CN.ts +116 -0
  506. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/locales/zh-TW.ts +115 -0
  507. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/mini/checks.ts +32 -0
  508. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/mini/coerce.ts +27 -0
  509. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/mini/external.ts +41 -0
  510. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/mini/index.ts +3 -0
  511. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/mini/iso.ts +66 -0
  512. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/mini/parse.ts +14 -0
  513. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/mini/schemas.ts +1947 -0
  514. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/mini/tests/apply.test.ts +24 -0
  515. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/mini/tests/assignability.test.ts +129 -0
  516. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/mini/tests/brand.test.ts +94 -0
  517. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/mini/tests/checks.test.ts +144 -0
  518. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/mini/tests/codec.test.ts +548 -0
  519. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/mini/tests/computed.test.ts +36 -0
  520. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/mini/tests/error.test.ts +22 -0
  521. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/mini/tests/functions.test.ts +5 -0
  522. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/mini/tests/index.test.ts +993 -0
  523. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/mini/tests/number.test.ts +95 -0
  524. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/mini/tests/object.test.ts +227 -0
  525. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/mini/tests/prototypes.test.ts +43 -0
  526. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/mini/tests/recursive-types.test.ts +325 -0
  527. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/mini/tests/standard-schema.test.ts +50 -0
  528. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4/mini/tests/string.test.ts +352 -0
  529. package/node_modules/@undefineds.co/drizzle-solid/node_modules/zod/src/v4-mini/index.ts +3 -0
  530. package/node_modules/@undefineds.co/extension-sdk/dist/layout.d.ts +0 -39
  531. package/node_modules/@undefineds.co/extension-sdk/dist/layout.js +0 -40
  532. package/node_modules/@undefineds.co/extension-sdk/dist/react/app-layout.d.ts +1 -13
  533. package/node_modules/@undefineds.co/extension-sdk/dist/react/app-layout.js +3 -11
  534. package/node_modules/@undefineds.co/extension-sdk/dist/react/workspace-layout.d.ts +4 -13
  535. package/node_modules/@undefineds.co/extension-sdk/dist/react/workspace-layout.js +11 -68
  536. package/node_modules/@undefineds.co/models/node_modules/n3/browser/n3.min.js +1 -0
  537. package/node_modules/@undefineds.co/shared-ui/dist/auth-surface.js +6 -6
  538. package/node_modules/@undefineds.co/shared-ui/dist/dialog.js +4 -4
  539. package/node_modules/@undefineds.co/shared-ui/dist/login.js +1 -1
  540. package/node_modules/@undefineds.co/shared-ui/dist/theme.css +79 -128
  541. package/node_modules/@undefineds.co/shared-ui/dist/toast.js +1 -1
  542. package/node_modules/@undefineds.co/shared-ui/dist/tooltip.js +1 -1
  543. package/node_modules/jose/dist/browser/index.js +30 -0
  544. package/node_modules/jose/dist/browser/jwe/compact/decrypt.js +27 -0
  545. package/node_modules/jose/dist/browser/jwe/compact/encrypt.js +26 -0
  546. package/node_modules/jose/dist/browser/jwe/flattened/decrypt.js +161 -0
  547. package/node_modules/jose/dist/browser/jwe/flattened/encrypt.js +153 -0
  548. package/node_modules/jose/dist/browser/jwe/general/decrypt.js +31 -0
  549. package/node_modules/jose/dist/browser/jwe/general/encrypt.js +174 -0
  550. package/node_modules/jose/dist/browser/jwk/embedded.js +17 -0
  551. package/node_modules/jose/dist/browser/jwk/thumbprint.js +53 -0
  552. package/node_modules/jose/dist/browser/jwks/local.js +124 -0
  553. package/node_modules/jose/dist/browser/jwks/remote.js +139 -0
  554. package/node_modules/jose/dist/browser/jws/compact/sign.js +17 -0
  555. package/node_modules/jose/dist/browser/jws/compact/verify.js +21 -0
  556. package/node_modules/jose/dist/browser/jws/flattened/sign.js +81 -0
  557. package/node_modules/jose/dist/browser/jws/flattened/verify.js +122 -0
  558. package/node_modules/jose/dist/browser/jws/general/sign.js +67 -0
  559. package/node_modules/jose/dist/browser/jws/general/verify.js +24 -0
  560. package/node_modules/jose/dist/browser/jwt/decrypt.js +23 -0
  561. package/node_modules/jose/dist/browser/jwt/encrypt.js +68 -0
  562. package/node_modules/jose/dist/browser/jwt/produce.js +75 -0
  563. package/node_modules/jose/dist/browser/jwt/sign.js +20 -0
  564. package/node_modules/jose/dist/browser/jwt/unsecured.js +32 -0
  565. package/node_modules/jose/dist/browser/jwt/verify.js +15 -0
  566. package/node_modules/jose/dist/browser/key/export.js +12 -0
  567. package/node_modules/jose/dist/browser/key/generate_key_pair.js +4 -0
  568. package/node_modules/jose/dist/browser/key/generate_secret.js +4 -0
  569. package/node_modules/jose/dist/browser/key/import.js +45 -0
  570. package/node_modules/jose/dist/browser/lib/aesgcmkw.js +16 -0
  571. package/node_modules/jose/dist/browser/lib/buffer_utils.js +51 -0
  572. package/node_modules/jose/dist/browser/lib/cek.js +20 -0
  573. package/node_modules/jose/dist/browser/lib/check_iv_length.js +8 -0
  574. package/node_modules/jose/dist/browser/lib/check_key_type.js +77 -0
  575. package/node_modules/jose/dist/browser/lib/check_p2s.js +6 -0
  576. package/node_modules/jose/dist/browser/lib/crypto_key.js +157 -0
  577. package/node_modules/jose/dist/browser/lib/decrypt_key_management.js +129 -0
  578. package/node_modules/jose/dist/browser/lib/encrypt_key_management.js +89 -0
  579. package/node_modules/jose/dist/browser/lib/epoch.js +1 -0
  580. package/node_modules/jose/dist/browser/lib/format_pem.js +4 -0
  581. package/node_modules/jose/dist/browser/lib/invalid_key_input.js +31 -0
  582. package/node_modules/jose/dist/browser/lib/is_disjoint.js +22 -0
  583. package/node_modules/jose/dist/browser/lib/is_jwk.js +13 -0
  584. package/node_modules/jose/dist/browser/lib/is_object.js +16 -0
  585. package/node_modules/jose/dist/browser/lib/iv.js +20 -0
  586. package/node_modules/jose/dist/browser/lib/jwt_claims_set.js +104 -0
  587. package/node_modules/jose/dist/browser/lib/private_symbols.js +1 -0
  588. package/node_modules/jose/dist/browser/lib/secs.js +55 -0
  589. package/node_modules/jose/dist/browser/lib/validate_algorithms.js +11 -0
  590. package/node_modules/jose/dist/browser/lib/validate_crit.js +34 -0
  591. package/node_modules/jose/dist/browser/package.json +1 -0
  592. package/node_modules/jose/dist/browser/runtime/aeskw.js +32 -0
  593. package/node_modules/jose/dist/browser/runtime/asn1.js +205 -0
  594. package/node_modules/jose/dist/browser/runtime/base64url.js +37 -0
  595. package/node_modules/jose/dist/browser/runtime/bogus.js +6 -0
  596. package/node_modules/jose/dist/browser/runtime/check_cek_length.js +8 -0
  597. package/node_modules/jose/dist/browser/runtime/check_key_length.js +8 -0
  598. package/node_modules/jose/dist/browser/runtime/decrypt.js +91 -0
  599. package/node_modules/jose/dist/browser/runtime/digest.js +6 -0
  600. package/node_modules/jose/dist/browser/runtime/ecdhes.js +47 -0
  601. package/node_modules/jose/dist/browser/runtime/encrypt.js +76 -0
  602. package/node_modules/jose/dist/browser/runtime/fetch_jwks.js +34 -0
  603. package/node_modules/jose/dist/browser/runtime/generate.js +143 -0
  604. package/node_modules/jose/dist/browser/runtime/get_sign_verify_key.js +24 -0
  605. package/node_modules/jose/dist/browser/runtime/is_key_like.js +8 -0
  606. package/node_modules/jose/dist/browser/runtime/jwk_to_key.js +104 -0
  607. package/node_modules/jose/dist/browser/runtime/key_to_jwk.js +21 -0
  608. package/node_modules/jose/dist/browser/runtime/normalize_key.js +68 -0
  609. package/node_modules/jose/dist/browser/runtime/pbes2kw.js +51 -0
  610. package/node_modules/jose/dist/browser/runtime/random.js +2 -0
  611. package/node_modules/jose/dist/browser/runtime/rsaes.js +37 -0
  612. package/node_modules/jose/dist/browser/runtime/runtime.js +1 -0
  613. package/node_modules/jose/dist/browser/runtime/sign.js +11 -0
  614. package/node_modules/jose/dist/browser/runtime/subtle_dsa.js +28 -0
  615. package/node_modules/jose/dist/browser/runtime/subtle_rsaes.js +12 -0
  616. package/node_modules/jose/dist/browser/runtime/timing_safe_equal.js +19 -0
  617. package/node_modules/jose/dist/browser/runtime/verify.js +16 -0
  618. package/node_modules/jose/dist/browser/runtime/webcrypto.js +2 -0
  619. package/node_modules/jose/dist/browser/util/base64url.js +3 -0
  620. package/node_modules/jose/dist/browser/util/decode_jwt.js +32 -0
  621. package/node_modules/jose/dist/browser/util/decode_protected_header.js +34 -0
  622. package/node_modules/jose/dist/browser/util/errors.js +114 -0
  623. package/node_modules/jose/dist/browser/util/runtime.js +2 -0
  624. package/node_modules/openid-client/node_modules/jose/dist/browser/index.js +32 -0
  625. package/node_modules/openid-client/node_modules/jose/dist/browser/jwe/compact/decrypt.js +27 -0
  626. package/node_modules/openid-client/node_modules/jose/dist/browser/jwe/compact/encrypt.js +26 -0
  627. package/node_modules/openid-client/node_modules/jose/dist/browser/jwe/flattened/decrypt.js +166 -0
  628. package/node_modules/openid-client/node_modules/jose/dist/browser/jwe/flattened/encrypt.js +175 -0
  629. package/node_modules/openid-client/node_modules/jose/dist/browser/jwe/general/decrypt.js +31 -0
  630. package/node_modules/openid-client/node_modules/jose/dist/browser/jwe/general/encrypt.js +178 -0
  631. package/node_modules/openid-client/node_modules/jose/dist/browser/jwk/embedded.js +17 -0
  632. package/node_modules/openid-client/node_modules/jose/dist/browser/jwk/thumbprint.js +53 -0
  633. package/node_modules/openid-client/node_modules/jose/dist/browser/jwks/local.js +116 -0
  634. package/node_modules/openid-client/node_modules/jose/dist/browser/jwks/remote.js +76 -0
  635. package/node_modules/openid-client/node_modules/jose/dist/browser/jws/compact/sign.js +17 -0
  636. package/node_modules/openid-client/node_modules/jose/dist/browser/jws/compact/verify.js +21 -0
  637. package/node_modules/openid-client/node_modules/jose/dist/browser/jws/flattened/sign.js +81 -0
  638. package/node_modules/openid-client/node_modules/jose/dist/browser/jws/flattened/verify.js +115 -0
  639. package/node_modules/openid-client/node_modules/jose/dist/browser/jws/general/sign.js +67 -0
  640. package/node_modules/openid-client/node_modules/jose/dist/browser/jws/general/verify.js +24 -0
  641. package/node_modules/openid-client/node_modules/jose/dist/browser/jwt/decrypt.js +23 -0
  642. package/node_modules/openid-client/node_modules/jose/dist/browser/jwt/encrypt.js +68 -0
  643. package/node_modules/openid-client/node_modules/jose/dist/browser/jwt/produce.js +54 -0
  644. package/node_modules/openid-client/node_modules/jose/dist/browser/jwt/sign.js +21 -0
  645. package/node_modules/openid-client/node_modules/jose/dist/browser/jwt/unsecured.js +32 -0
  646. package/node_modules/openid-client/node_modules/jose/dist/browser/jwt/verify.js +16 -0
  647. package/node_modules/openid-client/node_modules/jose/dist/browser/key/export.js +12 -0
  648. package/node_modules/openid-client/node_modules/jose/dist/browser/key/generate_key_pair.js +4 -0
  649. package/node_modules/openid-client/node_modules/jose/dist/browser/key/generate_secret.js +4 -0
  650. package/node_modules/openid-client/node_modules/jose/dist/browser/key/import.js +50 -0
  651. package/node_modules/openid-client/node_modules/jose/dist/browser/lib/aesgcmkw.js +14 -0
  652. package/node_modules/openid-client/node_modules/jose/dist/browser/lib/buffer_utils.js +51 -0
  653. package/node_modules/openid-client/node_modules/jose/dist/browser/lib/cek.js +20 -0
  654. package/node_modules/openid-client/node_modules/jose/dist/browser/lib/check_iv_length.js +8 -0
  655. package/node_modules/openid-client/node_modules/jose/dist/browser/lib/check_key_type.js +45 -0
  656. package/node_modules/openid-client/node_modules/jose/dist/browser/lib/check_p2s.js +6 -0
  657. package/node_modules/openid-client/node_modules/jose/dist/browser/lib/crypto_key.js +152 -0
  658. package/node_modules/openid-client/node_modules/jose/dist/browser/lib/decrypt_key_management.js +127 -0
  659. package/node_modules/openid-client/node_modules/jose/dist/browser/lib/encrypt_key_management.js +87 -0
  660. package/node_modules/openid-client/node_modules/jose/dist/browser/lib/epoch.js +1 -0
  661. package/node_modules/openid-client/node_modules/jose/dist/browser/lib/format_pem.js +4 -0
  662. package/node_modules/openid-client/node_modules/jose/dist/browser/lib/invalid_key_input.js +30 -0
  663. package/node_modules/openid-client/node_modules/jose/dist/browser/lib/is_disjoint.js +22 -0
  664. package/node_modules/openid-client/node_modules/jose/dist/browser/lib/is_object.js +16 -0
  665. package/node_modules/openid-client/node_modules/jose/dist/browser/lib/iv.js +20 -0
  666. package/node_modules/openid-client/node_modules/jose/dist/browser/lib/jwt_claims_set.js +102 -0
  667. package/node_modules/openid-client/node_modules/jose/dist/browser/lib/secs.js +44 -0
  668. package/node_modules/openid-client/node_modules/jose/dist/browser/lib/validate_algorithms.js +11 -0
  669. package/node_modules/openid-client/node_modules/jose/dist/browser/lib/validate_crit.js +34 -0
  670. package/node_modules/openid-client/node_modules/jose/dist/browser/package.json +1 -0
  671. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/aeskw.js +32 -0
  672. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/asn1.js +202 -0
  673. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/base64url.js +37 -0
  674. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/bogus.js +6 -0
  675. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/check_cek_length.js +8 -0
  676. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/check_key_length.js +8 -0
  677. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/decrypt.js +85 -0
  678. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/digest.js +6 -0
  679. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/ecdhes.js +46 -0
  680. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/encrypt.js +68 -0
  681. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/fetch_jwks.js +34 -0
  682. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/generate.js +141 -0
  683. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/get_sign_verify_key.js +17 -0
  684. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/is_key_like.js +5 -0
  685. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/jwk_to_key.js +143 -0
  686. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/key_to_jwk.js +21 -0
  687. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/pbes2kw.js +51 -0
  688. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/random.js +2 -0
  689. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/rsaes.js +37 -0
  690. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/runtime.js +1 -0
  691. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/sign.js +11 -0
  692. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/subtle_dsa.js +26 -0
  693. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/subtle_rsaes.js +12 -0
  694. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/timing_safe_equal.js +19 -0
  695. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/verify.js +16 -0
  696. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/webcrypto.js +2 -0
  697. package/node_modules/openid-client/node_modules/jose/dist/browser/runtime/zlib.js +7 -0
  698. package/node_modules/openid-client/node_modules/jose/dist/browser/util/base64url.js +3 -0
  699. package/node_modules/openid-client/node_modules/jose/dist/browser/util/decode_jwt.js +32 -0
  700. package/node_modules/openid-client/node_modules/jose/dist/browser/util/decode_protected_header.js +34 -0
  701. package/node_modules/openid-client/node_modules/jose/dist/browser/util/errors.js +158 -0
  702. package/node_modules/openid-client/node_modules/jose/dist/browser/util/runtime.js +2 -0
  703. package/package.json +2 -3
  704. package/static/app/assets/{index-BeAi28iA.js → index-BCZVzMpj.js} +1 -1
  705. package/static/app/assets/inrupt-smoke.js +36 -37
  706. package/static/app/assets/main.css +1 -0
  707. package/static/app/assets/main.js +13 -12
  708. package/static/app/index.html +2 -2
  709. package/static/app/inrupt-smoke.html +1 -2
  710. package/static/dashboard/assets/{AiConfigContext-DelSqO6L.js → AiConfigContext-B5QP7ow2.js} +1 -1
  711. package/static/dashboard/assets/{AiConfigPage-dbg0aDvd.js → AiConfigPage-C_TdlUjq.js} +1 -1
  712. package/static/dashboard/assets/DocumentProcessingPanel-CormNOdI.js +1 -0
  713. package/static/dashboard/assets/IndexLifecyclePanel-S9wNNyHO.js +1 -0
  714. package/static/dashboard/assets/{IndexSubjectPanel-ClDgj0SY.js → IndexSubjectPanel-CofZT1oE.js} +1 -1
  715. package/static/dashboard/assets/ModelAssignmentsPanel-9tgOjj-y.js +1 -0
  716. package/static/dashboard/assets/ModelsPage-DZ46VnUh.js +11 -0
  717. package/static/dashboard/assets/NetworkPage-TwbIWASf.js +2 -0
  718. package/static/dashboard/assets/{PaneListHeader-xEjcBu9g.js → PaneListHeader-BtVnyutC.js} +1 -1
  719. package/static/dashboard/assets/SearchIndexingPanel-BCq_YMOP.js +1 -0
  720. package/static/dashboard/assets/{StatusSubjectPanel-6s3JXbOd.js → StatusSubjectPanel-DsUKTysU.js} +1 -1
  721. package/static/dashboard/assets/StatusWorkspace-CaVJBRqI.js +1 -0
  722. package/static/dashboard/assets/{SystemSettingsPage-CF_vH-qe.js → SystemSettingsPage-DRWfPjtu.js} +1 -1
  723. package/static/dashboard/assets/SystemSettingsSubjectPanel-CgDP7Ii2.js +33 -0
  724. package/static/dashboard/assets/{XpodAiConnectionsPodStore-CHM-ZwI3.js → XpodAiConnectionsPodStore-C9tHqutw.js} +1 -1
  725. package/static/dashboard/assets/{activity-B7UdTZ1N.js → activity-tgjewO88.js} +1 -1
  726. package/static/dashboard/assets/{badge-B6RuxNt1.js → badge-Czun47II.js} +1 -1
  727. package/static/dashboard/assets/collection-runtime-DnYlU23-.js +1 -0
  728. package/static/dashboard/assets/{dashboard-Dm_h60lA.js → dashboard-CF8SbVSR.js} +92 -132
  729. package/static/dashboard/assets/dashboard-DvuM3VTP.css +1 -0
  730. package/static/dashboard/assets/dialog-D-Yc_lg-.js +1 -0
  731. package/static/dashboard/assets/{download-BW035kpj.js → download-vFuOkjCi.js} +1 -1
  732. package/static/dashboard/assets/{external-link-BMrNvf3c.js → external-link-Cg_VIecD.js} +1 -1
  733. package/static/dashboard/assets/{index-2jlFzexm.js → index-0au0WwkE.js} +1 -1
  734. package/static/dashboard/assets/index-IXCNeEwi.js +41 -0
  735. package/static/dashboard/assets/index-YDcVky3o.js +4 -0
  736. package/static/dashboard/assets/{key-round-C9vxhn7T.js → key-round-9n1xgLbG.js} +1 -1
  737. package/static/dashboard/assets/{rotate-ccw-8Vm0-INc.js → rotate-ccw-DJ6s86DW.js} +1 -1
  738. package/static/dashboard/assets/{skeleton-CY_602wn.js → skeleton-Dg9HePtI.js} +1 -1
  739. package/static/dashboard/assets/{waypoints-DdEdgkxD.js → waypoints-uxc_qOzk.js} +1 -1
  740. package/static/dashboard/assets/workspace-layout-BNtAXhPW.js +1 -0
  741. package/static/dashboard/dashboard.html +2 -2
  742. package/static/settings/assets/{AiConfigContext-CR3YhTA-.js → AiConfigContext-y6ha7pGs.js} +1 -1
  743. package/static/settings/assets/{AiConfigPage-DnOvX2Kx.js → AiConfigPage-CIcIWdXA.js} +1 -1
  744. package/static/settings/assets/DocumentProcessingPanel-Oa_cxMcn.js +1 -0
  745. package/static/settings/assets/IndexLifecyclePanel-DlrnI0Kh.js +1 -0
  746. package/static/settings/assets/{IndexSubjectPanel-CP84xXye.js → IndexSubjectPanel-Dhsl0W32.js} +1 -1
  747. package/static/settings/assets/ModelAssignmentsPanel-CHoiRZeL.js +1 -0
  748. package/static/settings/assets/ModelsPage-CuNW1hGX.js +11 -0
  749. package/static/settings/assets/NetworkPage-BBD2Lc_P.js +2 -0
  750. package/static/settings/assets/{PaneListHeader-Bz0UAhZr.js → PaneListHeader-C81adSBX.js} +1 -1
  751. package/static/settings/assets/SearchIndexingPanel-Dc4QKWd0.js +1 -0
  752. package/static/settings/assets/{StatusSubjectPanel-B2Y6ib3d.js → StatusSubjectPanel-DuxOvqzS.js} +1 -1
  753. package/static/settings/assets/StatusWorkspace-DeD3zi3G.js +1 -0
  754. package/static/settings/assets/{SystemSettingsPage-BbFkv_Wn.js → SystemSettingsPage-8sHOaPb8.js} +1 -1
  755. package/static/settings/assets/SystemSettingsSubjectPanel-B1JXut7S.js +33 -0
  756. package/static/settings/assets/{XpodAiConnectionsPodStore-B11u0BOi.js → XpodAiConnectionsPodStore-G0ClZksP.js} +1 -1
  757. package/static/settings/assets/{activity-BE8Hz8WF.js → activity-DT8pzOea.js} +1 -1
  758. package/static/settings/assets/{auth-callback-5waKJF0n.js → auth-callback-1BlsOtMG.js} +1 -1
  759. package/static/settings/assets/{badge-xeRbYBMf.js → badge-CvKRjSY2.js} +1 -1
  760. package/static/settings/assets/collection-runtime-C6ZAp2cM.js +1 -0
  761. package/static/settings/assets/dialog-LFluK7Nx.js +1 -0
  762. package/static/settings/assets/{download-xI5yyfk7.js → download-CZJeqUm1.js} +1 -1
  763. package/static/settings/assets/{external-link-DmbiCMuc.js → external-link-BsDft3Oe.js} +1 -1
  764. package/static/settings/assets/global-DvuM3VTP.css +1 -0
  765. package/static/settings/assets/{global-BOl78fr8.js → global-cmKEraT4.js} +77 -117
  766. package/static/settings/assets/index-BMPlaRWG.js +1 -0
  767. package/static/settings/assets/index-BiqSFOS1.js +4 -0
  768. package/static/settings/assets/index-XRgmPBKw.js +41 -0
  769. package/static/settings/assets/{index-browser-Bk7jaLCd.js → index-browser-B0slhJKc.js} +1 -1
  770. package/static/settings/assets/{key-round-B3VIp8oI.js → key-round-D1XsWbN_.js} +1 -1
  771. package/static/settings/assets/{rotate-ccw-DRzTN49Z.js → rotate-ccw-CEe0P0fY.js} +1 -1
  772. package/static/settings/assets/settings-DfjkqEJ8.js +1 -0
  773. package/static/settings/assets/{skeleton-Ckhw5HG7.js → skeleton-DA404w6m.js} +1 -1
  774. package/static/settings/assets/{waypoints-BFMI-qS6.js → waypoints-DJDWc4S9.js} +1 -1
  775. package/static/settings/assets/workspace-layout-K38jT4OV.js +1 -0
  776. package/static/settings/auth-callback.html +3 -3
  777. package/static/settings/settings.html +3 -3
  778. package/dist/api/background-service-supervisor.d.ts +0 -63
  779. package/dist/api/background-service-supervisor.js +0 -144
  780. package/dist/api/network/EndpointReachabilityProbe.d.ts +0 -40
  781. package/dist/api/network/EndpointReachabilityProbe.js +0 -129
  782. package/dist/edge/acme/CertificateRenewalScheduler.d.ts +0 -67
  783. package/dist/edge/acme/CertificateRenewalScheduler.js +0 -116
  784. package/dist/edge/reachability/P2PDataPlaneCrypto.d.ts +0 -42
  785. package/dist/edge/reachability/P2PDataPlaneCrypto.js +0 -113
  786. package/dist/edge/reachability/P2PDataPlaneCrypto.jsonld +0 -69
  787. package/dist/edge/reachability/RouteValidation.d.ts +0 -29
  788. package/dist/edge/reachability/RouteValidation.js +0 -58
  789. package/dist/runtime/ingress-occupant.d.ts +0 -39
  790. package/dist/runtime/ingress-occupant.js +0 -111
  791. package/dist/runtime/ingress-port.d.ts +0 -89
  792. package/dist/runtime/ingress-port.js +0 -165
  793. package/dist/runtime/port-reservations.d.ts +0 -86
  794. package/dist/runtime/port-reservations.js +0 -183
  795. package/dist/tunnel/TunnelClientManager.d.ts +0 -73
  796. package/dist/tunnel/TunnelClientManager.js +0 -181
  797. package/dist/tunnel/TunnelClientResolver.d.ts +0 -56
  798. package/dist/tunnel/TunnelClientResolver.js +0 -135
  799. package/dist/tunnel/TunnelDeclaredOrigin.d.ts +0 -78
  800. package/dist/tunnel/TunnelDeclaredOrigin.js +0 -185
  801. package/node_modules/@undefineds.co/extensions/dist-cjs/adapters/langchain.js +0 -49
  802. package/node_modules/@undefineds.co/extensions/dist-cjs/adapters/llamaindex.js +0 -54
  803. package/node_modules/@undefineds.co/extensions/dist-cjs/index.js +0 -22
  804. package/node_modules/@undefineds.co/extensions/dist-cjs/package.json +0 -3
  805. package/node_modules/@undefineds.co/extensions/dist-cjs/paddleocr.js +0 -304
  806. package/node_modules/@undefineds.co/extensions/dist-cjs/reader.js +0 -44
  807. package/node_modules/@undefineds.co/extensions/dist-cjs/registry.js +0 -99
  808. package/node_modules/@undefineds.co/extensions/dist-cjs/types.js +0 -2
  809. package/node_modules/openid-client/types/index.d.ts +0 -623
  810. package/static/app/assets/global.css +0 -1
  811. package/static/dashboard/assets/DocumentProcessingPanel-0-3nlwQf.js +0 -1
  812. package/static/dashboard/assets/IndexLifecyclePanel-DOI3IxOD.js +0 -1
  813. package/static/dashboard/assets/ModelAssignmentsPanel-BSWH19oT.js +0 -1
  814. package/static/dashboard/assets/ModelsPage-BrzxCkEl.js +0 -11
  815. package/static/dashboard/assets/NetworkPage-CxEKeaPz.js +0 -2
  816. package/static/dashboard/assets/SearchIndexingPanel-BGlSvEl5.js +0 -1
  817. package/static/dashboard/assets/StatusWorkspace-LYMDa4b0.js +0 -1
  818. package/static/dashboard/assets/SystemSettingsSubjectPanel-hsfHcJRV.js +0 -33
  819. package/static/dashboard/assets/collection-runtime-CKBQm3Fl.js +0 -1
  820. package/static/dashboard/assets/dashboard-1zrtbMhM.css +0 -1
  821. package/static/dashboard/assets/index-CQDQ8WVr.js +0 -4
  822. package/static/dashboard/assets/workspace-layout-Wed840qR.js +0 -1
  823. package/static/settings/assets/DocumentProcessingPanel-CccpHBs3.js +0 -1
  824. package/static/settings/assets/IndexLifecyclePanel-BrECzBoM.js +0 -1
  825. package/static/settings/assets/ModelAssignmentsPanel-DbFi67Kk.js +0 -1
  826. package/static/settings/assets/ModelsPage-xjHA88qy.js +0 -11
  827. package/static/settings/assets/NetworkPage-Bj4wc0bh.js +0 -2
  828. package/static/settings/assets/SearchIndexingPanel-ykhvw1Vl.js +0 -1
  829. package/static/settings/assets/StatusWorkspace-tx3Xg56J.js +0 -1
  830. package/static/settings/assets/SystemSettingsSubjectPanel-CcbpQmTc.js +0 -33
  831. package/static/settings/assets/collection-runtime-DIBObcT5.js +0 -1
  832. package/static/settings/assets/global-1zrtbMhM.css +0 -1
  833. package/static/settings/assets/index-CFVXiUnV.js +0 -4
  834. package/static/settings/assets/index-DK6qlahe.js +0 -1
  835. package/static/settings/assets/settings-CCM17CMX.js +0 -1
  836. package/static/settings/assets/workspace-layout-Co0KpMKd.js +0 -1
  837. /package/static/app/assets/{global-BGMlqT2c.js → _commonjsHelpers-B-UnjaXt.js} +0 -0
@@ -1,11 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/collection-runtime-DIBObcT5.js","assets/global-BOl78fr8.js","assets/global-1zrtbMhM.css","assets/ai-connections-DexTPyfC.js","assets/XpodAiConnectionsPodStore-B11u0BOi.js","assets/index-browser-Bk7jaLCd.js","assets/layout-DB3pMyTl.js","assets/workspace-layout-Co0KpMKd.js","assets/index-DK6qlahe.js","assets/badge-xeRbYBMf.js","assets/pod-collections-host-KnnGFZHL.js"])))=>i.map(i=>d[i]);
2
- import{aE as ne,r as f,aw as Ba,aC as Da,j as r,al as Rr,an as Na,at as Ze,av as Sa,ak as Ma,ai as Pa,aB as Ua,aF as Ra,f as Pe,aG as Kr,aH as Dn,aI as Nn,aJ as Tr,aK as Or,aL as be,aM as We,aN as ir,aO as Sn,aP as we,aQ as Qt,aR as V,aS as lt,aT as Ye,aU as gn,aV as Rt,aW as st,aX as Le,aY as Ka,aZ as Ta,a_ as De,a$ as Qe,b0 as Lr,b1 as Oa,b2 as Mn,b3 as Ke,b4 as qe,b5 as Ht,b6 as Qr,b7 as Pn,b8 as Un,b9 as Rn,B as G,ba as Me,O as ht,bb as La,P as mt,S as gt,bc as ye,Q as qt,bd as Qa,be as or,bf as Oe,U as Kt,bg as cr,ao as je,bh as Ha,bi as qa,bj as Va,bk as za,bl as Ja,u as Ga}from"./global-BOl78fr8.js";import{d as Xa,W as Ya,T as Wa}from"./workspace-layout-Co0KpMKd.js";import{A as Vt,d as Za,f as _a,g as $a,h as Kn,n as ei,i as ti}from"./ai-connections-DexTPyfC.js";import{p as ni,e as ri,w as si,d as ai}from"./XpodAiConnectionsPodStore-B11u0BOi.js";import{R as ii,A as oi,c as Hr,C as ci,a as li}from"./index-DK6qlahe.js";import{B as Ge}from"./badge-xeRbYBMf.js";const ui=[["path",{d:"M2 10v3",key:"1fnikh"}],["path",{d:"M6 6v11",key:"11sgs0"}],["path",{d:"M10 3v18",key:"yhl04a"}],["path",{d:"M14 8v7",key:"3a1oy3"}],["path",{d:"M18 5v13",key:"123xd1"}],["path",{d:"M22 10v3",key:"154ddg"}]],di=ne("audio-lines",ui);const fi=[["path",{d:"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z",key:"hh9hay"}],["path",{d:"m3.3 7 8.7 5 8.7-5",key:"g66t2b"}],["path",{d:"M12 22V12",key:"d0xqtd"}]],At=ne("box",fi);const pi=[["path",{d:"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z",key:"lc1i9w"}],["path",{d:"m7 16.5-4.74-2.85",key:"1o9zyk"}],["path",{d:"m7 16.5 5-3",key:"va8pkn"}],["path",{d:"M7 16.5v5.17",key:"jnp8gn"}],["path",{d:"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z",key:"8zsnat"}],["path",{d:"m17 16.5-5-3",key:"8arw3v"}],["path",{d:"m17 16.5 4.74-2.85",key:"8rfmw"}],["path",{d:"M17 16.5v5.17",key:"k6z78m"}],["path",{d:"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z",key:"1xygjf"}],["path",{d:"M12 8 7.26 5.15",key:"1vbdud"}],["path",{d:"m12 8 4.74-2.85",key:"3rx089"}],["path",{d:"M12 13.5V8",key:"1io7kd"}]],hi=ne("boxes",pi);const mi=[["path",{d:"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z",key:"l5xja"}],["path",{d:"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z",key:"ep3f8r"}],["path",{d:"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4",key:"1p4c4q"}],["path",{d:"M17.599 6.5a3 3 0 0 0 .399-1.375",key:"tmeiqw"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M19.938 10.5a4 4 0 0 1 .585.396",key:"1qfode"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M19.967 17.484A4 4 0 0 1 18 18",key:"159ez6"}]],qr=ne("brain",mi);const gi=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],Tn=ne("check",gi);const Ai=[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]],xi=ne("copy",Ai);const yi=[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]],zt=ne("external-link",yi);const bi=[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],Ci=ne("eye-off",bi);const vi=[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],wi=ne("eye",vi);const Ei=[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]],Ii=ne("file-text",Ei);const ji=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]],Vr=ne("globe",ji);const ki=[["circle",{cx:"9",cy:"12",r:"1",key:"1vctgf"}],["circle",{cx:"9",cy:"5",r:"1",key:"hp0tcf"}],["circle",{cx:"9",cy:"19",r:"1",key:"fkjjf6"}],["circle",{cx:"15",cy:"12",r:"1",key:"1tmaij"}],["circle",{cx:"15",cy:"5",r:"1",key:"19l28e"}],["circle",{cx:"15",cy:"19",r:"1",key:"f4zoj3"}]],Fi=ne("grip-vertical",ki);const Bi=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]],zr=ne("image",Bi);const Di=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]],Jr=ne("info",Di);const Ni=[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]],lr=ne("key-round",Ni);const Si=[["path",{d:"m16 17 5-5-5-5",key:"1bji2h"}],["path",{d:"M21 12H9",key:"dn1m92"}],["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}]],Mi=ne("log-out",Si);const Pi=[["rect",{x:"14",y:"4",width:"4",height:"16",rx:"1",key:"zuxfzm"}],["rect",{x:"6",y:"4",width:"4",height:"16",rx:"1",key:"1okwgv"}]],Gr=ne("pause",Pi);const Ui=[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]],Xr=ne("pencil",Ui);const Ri=[["polygon",{points:"6 3 20 12 6 21 6 3",key:"1oa8hb"}]],Yr=ne("play",Ri);const Ki=[["path",{d:"M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z",key:"goz73y"}],["path",{d:"m2 22 3-3",key:"19mgm9"}],["path",{d:"M7.5 13.5 10 11",key:"7xgeeb"}],["path",{d:"M10.5 16.5 13 14",key:"10btkg"}],["path",{d:"m18 3-4 4h6l-4 4",key:"16psg9"}]],Ti=ne("plug-zap",Ki);const Oi=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]],at=ne("plus",Oi);const Li=[["path",{d:"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"14sxne"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16",key:"1hlbsb"}],["path",{d:"M16 16h5v5",key:"ccwih5"}]],ur=ne("refresh-ccw",Li);const Qi=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]],Hi=ne("rotate-ccw",Qi);const qi=[["path",{d:"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8",key:"1p45f6"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}]],An=ne("rotate-cw",qi);const Vi=[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]],Wr=ne("search",Vi);const zi=[["path",{d:"M14 17H5",key:"gfn3mx"}],["path",{d:"M19 7h-9",key:"6i9tg"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]],Zr=ne("settings-2",zi);const Ji=[["path",{d:"m7 11 2-2-2-2",key:"1lz0vl"}],["path",{d:"M11 13h4",key:"1p7l4v"}],["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}]],Gi=ne("square-terminal",Ji);const Xi=[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]],On=ne("trash-2",Xi);const Yi=[["path",{d:"m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5",key:"ftymec"}],["rect",{x:"2",y:"6",width:"14",height:"12",rx:"2",key:"158x01"}]],Wi=ne("video",Yi);const Zi=[["path",{d:"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1",key:"18etb6"}],["path",{d:"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4",key:"xoc0q4"}]],_i=ne("wallet",Zi);const $i=[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]],eo=ne("zap",$i);var to=Object.defineProperty,me=(e,t)=>to(e,"name",{value:t,configurable:!0}),[Ln,hd]=Ma("Tooltip",[Hr]),Qn=Hr(),no="TooltipProvider",ro=700,xn="tooltip.open",[so,Hn]=Ln(no),ao=me(e=>{const{__scopeTooltip:t,delayDuration:n=ro,skipDelayDuration:s=300,disableHoverableContent:i=!1,children:a}=e,c=f.useRef(!0),p=f.useRef(!1),h=f.useRef(0);return f.useEffect(()=>{const u=h.current;return()=>window.clearTimeout(u)},[]),r.jsx(so,{scope:t,isOpenDelayedRef:c,delayDuration:n,onOpen:f.useCallback(()=>{s<=0||(window.clearTimeout(h.current),c.current=!1)},[s]),onClose:f.useCallback(()=>{s<=0||(window.clearTimeout(h.current),h.current=window.setTimeout(()=>c.current=!0,s))},[s]),isPointerInTransitRef:p,onPointerInTransitChange:f.useCallback(u=>{p.current=u},[]),disableHoverableContent:i,children:a})},"TooltipProvider"),yn="Tooltip",[io,Jt]=Ln(yn),oo=me(e=>{const{__scopeTooltip:t,children:n,open:s,defaultOpen:i,onOpenChange:a,disableHoverableContent:c,delayDuration:p}=e,h=Hn(yn,e.__scopeTooltip),u=Qn(t),[g,A]=f.useState(null),[x,v]=f.useState(void 0),U=Ba(),B=f.useRef(0),C=c??h.disableHoverableContent,I=p??h.delayDuration,F=f.useRef(!1),[k,P]=Da({prop:s,defaultProp:i??!1,onChange:me(K=>{K?(h.onOpen(),document.dispatchEvent(new CustomEvent(xn))):h.onClose(),a?.(K)},"onChange"),caller:yn}),j=f.useMemo(()=>k?F.current?"delayed-open":"instant-open":"closed",[k]),w=f.useCallback(()=>{window.clearTimeout(B.current),B.current=0,F.current=!1,P(!0)},[P]),m=f.useCallback(()=>{window.clearTimeout(B.current),B.current=0,P(!1)},[P]),b=f.useCallback(()=>{window.clearTimeout(B.current),B.current=window.setTimeout(()=>{F.current=!0,P(!0),B.current=0},I)},[I,P]);f.useEffect(()=>()=>{B.current&&(window.clearTimeout(B.current),B.current=0)},[]);const D=x??U;return r.jsx(ii,{...u,children:r.jsx(io,{scope:t,contentId:D,setContentId:v,open:k,stateAttribute:j,trigger:g,onTriggerChange:A,onTriggerEnter:f.useCallback(()=>{h.isOpenDelayedRef.current?b():w()},[h.isOpenDelayedRef,b,w]),onTriggerLeave:f.useCallback(()=>{C?m():(window.clearTimeout(B.current),B.current=0)},[m,C]),onOpen:w,onClose:m,disableHoverableContent:C,children:n})})},"Tooltip"),dr="TooltipTrigger",co=f.forwardRef(me(function(t,n){const{__scopeTooltip:s,...i}=t,a=Jt(dr,s),c=Hn(dr,s),p=Qn(s),h=f.useRef(null),u=Rr(n,h,a.onTriggerChange),g=f.useRef(!1),A=f.useRef(!1),x=f.useCallback(()=>g.current=!1,[]);return f.useEffect(()=>()=>document.removeEventListener("pointerup",x),[x]),r.jsx(oi,{asChild:!0,...p,children:r.jsx(Na.button,{"aria-describedby":a.open?a.contentId:void 0,"data-state":a.stateAttribute,...i,ref:u,onPointerMove:Ze(t.onPointerMove,v=>{v.pointerType!=="touch"&&!A.current&&!c.isPointerInTransitRef.current&&(a.onTriggerEnter(),A.current=!0)}),onPointerLeave:Ze(t.onPointerLeave,()=>{a.onTriggerLeave(),A.current=!1}),onPointerDown:Ze(t.onPointerDown,()=>{a.open&&a.onClose(),g.current=!0,document.addEventListener("pointerup",x,{once:!0})}),onFocus:Ze(t.onFocus,()=>{g.current||a.onOpen()}),onBlur:Ze(t.onBlur,a.onClose),onClick:Ze(t.onClick,a.onClose)})})},"TooltipTrigger")),lo="TooltipPortal",[md,uo]=Ln(lo,{forceMount:void 0}),ft="TooltipContent",fo=f.forwardRef(me(function(t,n){const s=uo(ft,t.__scopeTooltip),{forceMount:i=s.forceMount,side:a="top",...c}=t,p=Jt(ft,t.__scopeTooltip);return r.jsx(Sa,{present:i||p.open,children:p.disableHoverableContent?r.jsx(_r,{side:a,...c,ref:n}):r.jsx(po,{side:a,...c,ref:n})})},"TooltipContent")),po=f.forwardRef(me(function(t,n){const s=Jt(ft,t.__scopeTooltip),i=Hn(ft,t.__scopeTooltip),a=f.useRef(null),c=Rr(n,a),[p,h]=f.useState(null),{trigger:u,onClose:g}=s,A=a.current,{onPointerInTransitChange:x}=i,v=f.useCallback(()=>{h(null),x(!1)},[x]),U=f.useCallback((B,C)=>{const I=B.currentTarget,F={x:B.clientX,y:B.clientY},k=$r(F,I.getBoundingClientRect()),P=es(F,k),j=ts(C.getBoundingClientRect()),w=rs([...P,...j]);h(w),x(!0)},[x]);return f.useEffect(()=>()=>v(),[v]),f.useEffect(()=>{if(u&&A){const B=me(I=>U(I,A),"handleTriggerLeave"),C=me(I=>U(I,u),"handleContentLeave");return u.addEventListener("pointerleave",B),A.addEventListener("pointerleave",C),()=>{u.removeEventListener("pointerleave",B),A.removeEventListener("pointerleave",C)}}},[u,A,U,v]),f.useEffect(()=>{if(p){const B=me(C=>{const I=C.target,F={x:C.clientX,y:C.clientY},k=u?.contains(I)||A?.contains(I),P=!ns(F,p);k?v():P&&(v(),g())},"handleTrackPointerGrace");return document.addEventListener("pointermove",B),()=>document.removeEventListener("pointermove",B)}},[u,A,p,g,v]),r.jsx(_r,{...t,ref:c})},"TooltipContentHoverable")),ho=Ra("TooltipContent"),_r=f.forwardRef(me(function(t,n){const{__scopeTooltip:s,children:i,"aria-label":a,id:c,onEscapeKeyDown:p,onPointerDownOutside:h,...u}=t,g=Jt(ft,s),A=Qn(s),{onClose:x}=g;f.useEffect(()=>(document.addEventListener(xn,x),()=>document.removeEventListener(xn,x)),[x]),f.useEffect(()=>{if(g.trigger){const U=me(B=>{B.target instanceof Node&&B.target.contains(g.trigger)&&x()},"handleScroll");return window.addEventListener("scroll",U,{capture:!0}),()=>window.removeEventListener("scroll",U,{capture:!0})}},[g.trigger,x]);const{setContentId:v}=g;return Pa(()=>(v(c),()=>{v(void 0)}),[c,v]),r.jsx(Ua,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:p,onPointerDownOutside:h,onFocusOutside:U=>U.preventDefault(),onDismiss:x,children:r.jsxs(ci,{"data-state":g.stateAttribute,role:a?void 0:"tooltip",id:a?void 0:g.contentId,...A,...u,ref:n,style:{...u.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"},children:[r.jsx(ho,{children:i}),a?r.jsx(li,{id:g.contentId,role:"tooltip",children:a}):null]})})},"TooltipContentImpl"));function $r(e,t){const n=Math.abs(t.top-e.y),s=Math.abs(t.bottom-e.y),i=Math.abs(t.right-e.x),a=Math.abs(t.left-e.x);switch(Math.min(n,s,i,a)){case a:return"left";case i:return"right";case n:return"top";case s:return"bottom";default:throw new Error("unreachable")}}me($r,"getExitSideFromRect");function es(e,t,n=5){const s=[];switch(t){case"top":s.push({x:e.x-n,y:e.y+n},{x:e.x+n,y:e.y+n});break;case"bottom":s.push({x:e.x-n,y:e.y-n},{x:e.x+n,y:e.y-n});break;case"left":s.push({x:e.x+n,y:e.y-n},{x:e.x+n,y:e.y+n});break;case"right":s.push({x:e.x-n,y:e.y-n},{x:e.x-n,y:e.y+n});break}return s}me(es,"getPaddedExitPoints");function ts(e){const{top:t,right:n,bottom:s,left:i}=e;return[{x:i,y:t},{x:n,y:t},{x:n,y:s},{x:i,y:s}]}me(ts,"getPointsFromRect");function ns(e,t){const{x:n,y:s}=e;let i=!1;for(let a=0,c=t.length-1;a<t.length;c=a++){const p=t[a],h=t[c],u=p.x,g=p.y,A=h.x,x=h.y;g>s!=x>s&&n<(A-u)*(s-g)/(x-g)+u&&(i=!i)}return i}me(ns,"isPointInPolygon");function rs(e){const t=e.slice();return t.sort((n,s)=>n.x<s.x?-1:n.x>s.x?1:n.y<s.y?-1:n.y>s.y?1:0),ss(t)}me(rs,"getHull");function ss(e){if(e.length<=1)return e.slice();const t=[];for(let s=0;s<e.length;s++){const i=e[s];for(;t.length>=2;){const a=t[t.length-1],c=t[t.length-2];if((a.x-c.x)*(i.y-c.y)>=(a.y-c.y)*(i.x-c.x))t.pop();else break}t.push(i)}t.pop();const n=[];for(let s=e.length-1;s>=0;s--){const i=e[s];for(;n.length>=2;){const a=n[n.length-1],c=n[n.length-2];if((a.x-c.x)*(i.y-c.y)>=(a.y-c.y)*(i.x-c.x))n.pop();else break}n.push(i)}return n.pop(),t.length===1&&n.length===1&&t[0].x===n[0].x&&t[0].y===n[0].y?t:t.concat(n)}me(ss,"getHullPresorted");var mo=ao,go=oo,Ao=co,as=fo;const xt=mo,Gt=go,Xt=Ao,yt=f.forwardRef(({className:e,sideOffset:t=4,...n},s)=>r.jsx(as,{ref:s,sideOffset:t,className:Pe("z-[var(--layer-popover)] overflow-hidden rounded-md border border-border/50 bg-popover","px-2 py-1 text-xs text-popover-foreground shadow-md","animate-in fade-in-0 zoom-in-95","data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95","data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2","data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...n}));yt.displayName=as.displayName;function xo(e){const t=Kr(e).type;return Array.isArray(t)&&t.includes(Dn.AccessControlResource)}async function Yt(e,t){if(!It(e))return{resourceAcl:null,fallbackAcl:null};try{const n=await is(e,t);return n===null?{resourceAcl:null,fallbackAcl:await os(e,t)}:{resourceAcl:n,fallbackAcl:null}}catch(n){if(n instanceof bn)return{resourceAcl:null,fallbackAcl:null};throw n}}async function is(e,t){if(!It(e))return null;try{const n=await Tr(e.internal_resourceInfo.aclUrl,t);if(xo(n))throw new bn(e,n);return Or({...n,internal_accessTo:be(e)})}catch(n){if(n instanceof bn)throw n;return null}}async function os(e,t){const n=new URL(be(e)),s=n.pathname;if(s==="/")return null;const i=yo(s),a=new URL(i,n.origin).href,c=await We(a,t);if(!It(c))return null;const p=await is(c,t);return p===null?os(c,t):p}function yo(e){const t=e.substring(e.length-1)==="/"?e.substring(0,e.length-1):e;return`${e.substring(0,t.lastIndexOf("/"))}/`}function He(e){return Sn(e).filter(bo)}function bo(e){return we(e,Qt.type).includes(V.Authorization)}function qn(e,t){return e.filter(n=>Co(n,t))}function Co(e,t){return we(e,V.accessTo).includes(t)}function Wt(e,t){return e.filter(n=>vo(n,t))}function vo(e,t){return we(e,V.default).includes(t)||we(e,V.defaultForNew).includes(t)}function bt(e){const t=we(e,V.mode);return t.includes(Re.write)?{read:t.includes(Re.read),append:!0,write:!0,control:t.includes(Re.control)}:{read:t.includes(Re.read),append:t.includes(Re.append),write:!1,control:t.includes(Re.control)}}function Ct(e){return e.reduce((t,n)=>t.write||n.write?{read:t.read||n.read,append:!0,write:!0,control:t.control||n.control}:{read:t.read||n.read,append:t.append||n.append,write:!1,control:t.control||n.control},{read:!1,append:!1,write:!1,control:!1})}function wo(e){return He(e).filter(Eo).reduce(Ka,e)}function Eo(e){return Ta(e.predicates,De.namedNode(e.url),De.defaultGraph()).some(t=>!Io(t))?!1:Qe(e,V.accessTo)===null&&Qe(e,V.default)===null&&Qe(e,V.defaultForNew)===null||Qe(e,V.mode)===null||Qe(e,V.agent)===null&&Qe(e,V.agentGroup)===null&&Qe(e,V.agentClass)===null}function Io(e){const{predicate:t}=e,{object:n}=e;return!!(t.equals(De.namedNode(Qt.type))&&n.equals(De.namedNode(V.Authorization))||t.equals(De.namedNode(V.accessTo))||t.equals(De.namedNode(V.default))||t.equals(De.namedNode(V.defaultForNew))||t.equals(De.namedNode(V.mode))&&Object.values(Re).some(s=>n.equals(De.namedNode(s)))||t.equals(De.namedNode(V.agent))||t.equals(De.namedNode(V.agentGroup))||t.equals(De.namedNode(V.agentClass))||t.equals(De.namedNode(V.origin)))}const Re={read:"http://www.w3.org/ns/auth/acl#Read",append:"http://www.w3.org/ns/auth/acl#Append",write:"http://www.w3.org/ns/auth/acl#Write",control:"http://www.w3.org/ns/auth/acl#Control"};function jo(e,t,n){return e.filter(s=>we(s,n).includes(t))}function ko(e,t){const n={};return e.forEach(s=>{const i=we(s,t),a=bt(s);i.forEach(c=>{n[c]=typeof n[c]>"u"?a:Ct([n[c],a])})}),n}function cs(e){let t=st();return t=Ye(t,Qt.type,V.Authorization),e.read&&(t=Le(t,V.mode,Re.read)),e.append&&!e.write&&(t=Le(t,V.mode,Re.append)),e.write&&(t=Le(t,V.mode,Re.write)),e.control&&(t=Le(t,V.mode,Re.control)),t}function Fo(e){let t=st();t=Ye(t,Qt.type,V.Authorization);function n(s,i,a){return we(s,a).reduce((c,p)=>Le(c,a,p),i)}return t=n(e,t,V.accessTo),t=n(e,t,V.default),t=n(e,t,V.defaultForNew),t=n(e,t,V.agent),t=n(e,t,V.agentGroup),t=n(e,t,V.agentClass),t=n(e,t,V.origin),t=n(e,t,V.mode),t}function vt(e,t){return Object.assign(Nn(e),{internal_acl:t})}const Bo=[V.agent,V.agentClass,V.agentGroup,V.origin];function Do(e,t,n,s,i){if(!we(e,n).includes(t)){const p=cs({read:!1,append:!1,write:!1,control:!1});return[e,p]}const a=gn(e,n,t);let c=Fo(e);return c=gn(c,V.accessTo,s),c=Ye(c,n,t),Bo.filter(p=>p!==n).forEach(p=>{c=Rt(c,p)}),[a,c]}function ls(e,t,n,s,i){let a=e;Sn(e).forEach(h=>{const[u,g]=Do(h,i,n,e.internal_accessTo);a=lt(a,u),a=lt(a,g)});let c=cs(t);c=Ye(c,V.accessTo,e.internal_accessTo),c=Ye(c,n,i);const p=lt(a,c);return wo(p)}function us(e,t){return vt(e,{resourceAcl:t,fallbackAcl:null})}function No(e){return e.internal_acl.resourceAcl}class bn extends Error{constructor(t,n){super(`[${ir(t)}] is governed by Access Control Policies in [${ir(n)}] rather than by Web Access Control.`)}}function wt(e){return e.internal_acl.resourceAcl!==null&&be(e)===e.internal_acl.resourceAcl.internal_accessTo&&e.internal_resourceInfo.aclUrl===be(e.internal_acl.resourceAcl)}function Vn(e){return wt(e)?e.internal_acl.resourceAcl:null}function Et(e){return e.internal_acl.fallbackAcl!==null}function So(e){return Et(e)?e.internal_acl.fallbackAcl:null}function Mo(e){return Or({...Oa(),internal_accessTo:be(e),internal_resourceInfo:{sourceIri:e.internal_resourceInfo.aclUrl,isRawData:!1,linkedResources:{}}})}function Po(e){const t=Mo(e),n=He(e.internal_acl.fallbackAcl);return Wt(n,e.internal_acl.fallbackAcl.internal_accessTo).map(c=>(c=Rt(c,V.default),c=Rt(c,V.defaultForNew),c=Ye(c,V.accessTo,be(e)),c=Ye(c,V.default,be(e)),c)).reduce(lt,t)}async function Uo(e,t,n){if(!It(e))throw new Error(`Could not determine the location of the ACL for the Resource at [${be(e)}]; possibly the current user does not have Control access to that Resource. Try calling \`hasAccessibleAcl()\` before calling \`saveAclFor()\`.`);return{...await Lr(e.internal_resourceInfo.aclUrl,t,n),internal_accessTo:be(e)}}function It(e){return typeof e.internal_resourceInfo.aclUrl=="string"}function ds(e,t){return wt(e)?Ko(e.internal_acl.resourceAcl,t):Et(e)?Lo(e.internal_acl.fallbackAcl,t):null}function Ro(e){if(wt(e)){const t=Vn(e);return To(t)}if(Et(e)){const t=So(e);return Qo(t)}return null}function Ko(e,t){const n=He(e),s=qn(n,e.internal_accessTo),a=fs(s,t).map(bt);return Ct(a)}function To(e){const t=He(e),n=qn(t,e.internal_accessTo),s=ps(n);return hs(s)}function Oo(e,t,n){return ls(e,n,V.agent,"resource",t)}function Lo(e,t){const n=He(e),s=Wt(n,e.internal_accessTo),a=fs(s,t).map(bt);return Ct(a)}function Qo(e){const t=He(e),n=Wt(t,e.internal_accessTo),s=ps(n);return hs(s)}function fs(e,t){return jo(e,t,V.agent)}function ps(e){return e.filter(Ho)}function Ho(e){return Qe(e,V.agent)!==null}function hs(e){return ko(e,V.agent)}function ms(e){return wt(e)?qo(e.internal_acl.resourceAcl):Et(e)?Vo(e.internal_acl.fallbackAcl):null}function qo(e){const t=He(e),n=qn(t,e.internal_accessTo),i=gs(n,Mn.Agent).map(bt);return Ct(i)}function Vo(e){const t=He(e),n=Wt(t,e.internal_accessTo),i=gs(n,Mn.Agent).map(bt);return Ct(i)}function zo(e,t){return ls(e,t,V.agentClass,"resource",Mn.Agent)}function gs(e,t){return e.filter(n=>Jo(n,t))}function Jo(e,t){return we(e,V.agentClass).includes(t)}async function As(e,t){if(typeof e.internal_resourceInfo.aclUrl!="string")return null;try{return await We(e.internal_resourceInfo.aclUrl,t)}catch{return null}}const Ne="http://www.w3.org/ns/solid/acp#",pe={AccessControlResource:Ne.concat("AccessControlResource"),PublicAgent:Ne.concat("PublicAgent"),access:Ne.concat("access"),accessControl:Ne.concat("accessControl"),agent:Ne.concat("agent"),allOf:Ne.concat("allOf"),allow:Ne.concat("allow"),anyOf:Ne.concat("anyOf"),apply:Ne.concat("apply"),deny:Ne.concat("deny"),memberAccessControl:Ne.concat("memberAccessControl"),noneOf:Ne.concat("noneOf")},an="http://www.w3.org/ns/auth/acl#",et={Append:an.concat("Append"),Read:an.concat("Read"),Write:an.concat("Write")};async function xs(e,t){const n=ke(e),s=await Lr(be(n),n,t);return Xo(e,s)}function Go(e){return typeof e.internal_acp=="object"&&e.internal_acp!==null&&typeof e.internal_acp.acr=="object"&&e.internal_acp.acr!==null}function ke(e){if(!Go(e))throw new Error(`An Access Control Resource for [${be(e)}] is not available. This could be because the current user is not allowed to see it, or because their Pod Server does not support Access Control Resources.`);return e.internal_acp.acr}function Xo(e,t){return Object.assign(Nn(e),{internal_acp:{...e.internal_acp,acr:t}})}function ys(e){const t=ke(e),n=be(t);return Ke(t,n)}function bs(e){const t=ys(e);return t===null?[]:we(t,pe.accessControl)}function Cs(e,t,n){const s=ke(e);return Array.from(new Set(t.map(i=>{const a=Ke(s,i);return a!==null?we(a,n):[]}).reduce((i,a)=>i.concat(a),[])))}function Yo(e){return Cs(e,bs(e),pe.apply)}function Wo(e){return Cs(e,bs(e),pe.access)}function vs(e,t){const n=we(e,t);return{read:n.includes(et.Read),append:n.includes(et.Append),write:n.includes(et.Write),controlRead:!1,controlWrite:!1}}function Zo(e){return vs(e,pe.allow)}function _o(e){return vs(e,pe.deny)}function fr(e,t,n){const s=qe(t,pe.allOf).map(u=>Ke(ke(e),u)).filter(u=>u!==null),i=s.every(u=>qe(u,pe.agent).includes(n)),a=qe(t,pe.anyOf).map(u=>Ke(ke(e),u)).filter(u=>u!==null),c=a.some(u=>qe(u,pe.agent).includes(n)),p=qe(t,pe.noneOf).map(u=>Ke(ke(e),u)).filter(u=>u!==null),h=p.some(u=>qe(u,pe.agent).includes(n));return s.length+a.length>0&&(s.length===0||i)&&(a.length===0||c)&&(p.length===0||!h)}function pr(e,t,n){const s=Zo(e),i=_o(e);return n==="control"?{read:t.read,append:t.append,write:t.write,controlRead:(t.controlRead||s.read)&&!i.read,controlWrite:(t.controlWrite||s.write)&&!i.write}:{read:(t.read||s.read)&&!i.read,append:(t.append||s.append)&&!i.append,write:(t.write||s.write)&&!i.write,controlRead:t.controlRead,controlWrite:t.controlWrite}}async function Zt(e,t){let n={read:!1,append:!1,write:!1,controlRead:!1,controlWrite:!1};return Yo(e).map(a=>Ke(ke(e),a)).filter(a=>a!==null).forEach(a=>{fr(e,a,t)&&(n=pr(a,n,"resource"))}),Wo(e).map(a=>Ke(ke(e),a)).filter(a=>a!==null).forEach(a=>{fr(e,a,t)&&(n=pr(a,n,"control"))}),n}function ws(e,t){var n,s,i,a;if(e.controlRead!==e.controlWrite)throw new Error("For Pods using Web Access Control, controlRead and controlWrite must be equal.");return{read:(n=e.read)!==null&&n!==void 0?n:t.read,append:(s=e.append)!==null&&s!==void 0?s:t.append,write:(i=e.write)!==null&&i!==void 0?i:t.write,control:(a=e.controlRead)!==null&&a!==void 0?a:t.control}}function zn(e){return{read:e.read,write:e.write,append:e.append,controlRead:e.control,controlWrite:e.control}}async function $o(e,t,n,s){const i=await Yt(e,s),a=n(vt(e,i),t);return a===null?null:zn(a)}async function ec(e,t,n){const s=await Yt(e,n),i=t(vt(e,s));return i===null?null:zn(i)}async function tc(e,t,n){const s=await Yt(e,n),i=t(vt(e,s));if(i===null)return null;const a={};for(const[c,p]of Object.entries(i))a[c]=zn(p);return a}function Es(e,t,n){return $o(e,t,ds,n)}function Is(e,t){return ec(e,ms,t)}function nc(e,t){return tc(e,Ro,t)}async function js(e,t){if(!It(e))return null;const n=await Yt(e,t),s=vt(e,n);let i;if(wt(s))i=No(s);else if(Et(s))i=Po(s);else return null;return us(s,i)}async function ks(e,t,n){let s=null;try{return s=await Uo(e,t,n),us(e,s)}catch{return null}}async function rc(e,t,n,s,i){const a=await js(e,i);if(a===null)return null;const c=Vn(a),p=n(a),h=ws(t,p),u=s(c,h);return ks(a,u,i)}async function sc(e,t,n,s,i,a){const c=await js(e,a);if(c===null)return null;const p=s(c,t),h=Vn(c),u=ws(n,p),g=i(h,t,u);return ks(c,g,a)}async function ac(e,t,n,s){return sc(e,t,n,ds,Oo,s)}async function ic(e,t,n){return rc(e,t,ms,zo,n)}async function oc(e,t){const n=await As(e,t);if(n===null)return null;const s=Kr(n).type;return Array.isArray(s)&&s.includes(pe.AccessControlResource)?be(n):null}async function jt(e,t){const n=await oc(e,t);if(n===null)return null;let s;try{s=await Tr(n,t)}catch{return null}return{...e,internal_acp:{acr:{...s,accessTo:be(e)}}}}async function Fs(e,t,n){const s=await We(e,n),i=await jt(s,n);return i===null?Es(s,t,n):Zt(i,t)}function cc(e){return Array.from(new Set(Sn(ke(e)).map(t=>qe(t,pe.agent)).reduce((t,n)=>t.concat(n),[])))}async function lc(e){return(await Promise.all(cc(e).map(async t=>({[t]:await Zt(e,t)})))).reduce((t,n)=>({...t,...n}),{})}async function uc(e,t){const n=await We(e,t),s=await jt(n,t);return s===null?nc(n,t):lc(s)}async function dc(e){return Zt(e,pe.PublicAgent)}async function Bs(e,t){const n=await We(e,t),s=await jt(n,t);return s===null?Is(n,t):dc(s)}function kt(e,t){return Object.assign(Nn(e),{internal_acp:{...e.internal_acp,acr:lt(e.internal_acp.acr,t)}})}const ut="defaultAccessControl",Tt="defaultAcrAccessControl";function Jn(e,t){const n=ke(e);return be(n).concat("#").concat(t)}function Gn(e,t,n){return Jn(e,t).concat("AgentMatcher").concat(n.charAt(0).toUpperCase()+n.slice(1)).concat("Policy")}function Ds(e,t){const n=ke(e),s=Jn(e,t),i=Ke(n,s);return i===null||typeof i>"u"?st({url:s}):i}function hr(e){return e.includes("Member")?pe.memberAccessControl:pe.accessControl}function Ns(e,t){const n=Jn(e,t),s=ke(e);let i=ys(e);return(i===null||typeof i>"u")&&(i=st({url:be(s)})),we(i,hr(t)).includes(n)?e:(i=Ht(i).addUrl(hr(t),n).build(),kt(e,i))}function fc(e,t){const n=Ns(e,Tt),s=Ds(n,Tt);return kt(n,Ht(s).addUrl(pe.access,t).build())}function pc(e,t){const n=Ns(e,ut),s=Ds(n,ut);return kt(n,Ht(s).addUrl(pe.apply,t).build())}function hc(e,t,n){const s=Gn(e,t,n);return s.includes("Acr")?fc(e,s):pc(e,s)}function Ss(e,t,n){return Gn(e,t,n).concat("Matcher")}function mc(e,t,n){let s=Rt(e,n);return(t.read||t.controlRead)&&(s=Le(s,n,et.Read)),t.append&&(s=Le(s,n,et.Append)),(t.write||t.controlWrite)&&(s=Le(s,n,et.Write)),s}const mr=pe.anyOf;function gc(e,t,n){const s=Gn(e,t,n),i=Ss(e,t,n);let a=Ke(ke(e),s);return a||(e=hc(e,t,n),a=st({url:s}),a=mc(a,{[n]:!0},pe.allow)),we(a,mr).includes(i)?e:(a=Ht(a).addUrl(mr,i).build(),kt(e,a))}function Ac(e,t){return Le(e,Dn.agent,t)}function xc(e,t){return gn(e,Dn.agent,t)}function it(e,t,n,s,i){var a;const c=Ss(e,n,s),p=gc(e,n,s),h=(a=Ke(ke(p),c))!==null&&a!==void 0?a:st({url:c});return kt(p,i==="add"?Ac(h,t):xc(h,t))}async function Ms(e,t,n){const s=await Zt(e,t);return typeof n.read=="boolean"&&s.read!==n.read&&(e=it(e,t,ut,"read",n.read?"add":"remove")),typeof n.append=="boolean"&&s.append!==n.append&&(e=it(e,t,ut,"append",n.append?"add":"remove")),typeof n.write=="boolean"&&s.write!==n.write&&(e=it(e,t,ut,"write",n.write?"add":"remove")),typeof n.controlRead=="boolean"&&s.controlRead!==n.controlRead&&(e=it(e,t,Tt,"controlRead",n.controlRead?"add":"remove")),typeof n.controlWrite=="boolean"&&s.controlWrite!==n.controlWrite&&(e=it(e,t,Tt,"controlWrite",n.controlWrite?"add":"remove")),e}async function yc(e,t,n,s){const i=await We(e,s),a=await jt(i,s);if(a===null)return await ac(i,t,n,s),Es(i,t,s);try{return await xs(await Ms(a,t,n),s),await Fs(e,t,s)}catch{return null}}async function bc(e,t){return Ms(e,pe.PublicAgent,t)}async function Cc(e,t,n){const s=await We(e,n),i=await jt(s,n);if(i===null)return await ic(s,t,n),Is(s,n);try{return await xs(await bc(i,t),n),await Bs(e,n)}catch{return null}}const vc=Object.freeze(Object.defineProperty({__proto__:null,getAclServerResourceInfo:As,getAgentAccess:Fs,getAgentAccessAll:uc,getPublicAccess:Bs,setAgentAccess:yc,setPublicAccess:Cc},Symbol.toStringTag,{value:"Module"}));function wc(e){const t=e.access??vc;return{inspectAgentAccess:n=>Ec(n,e.fetch,t),ensureAgentAccess:async n=>{try{for(const s of n.resources){await Ic(s.url,s.mediaType,e.fetch);const i=await t.setAgentAccess(s.url,n.service.webId,kc(s.access),{fetch:e.fetch});if(!i||!Ps(i,s.access))return Te("permissionDenied",n,"Pod did not grant the requested service access.")}return Te("granted",n)}catch(s){return Te("permissionDenied",n,Cn(s))}},revokeAgentAccess:async n=>{try{for(const s of n.resources)if(!await t.setAgentAccess(s.url,n.service.webId,{read:!1,append:!1,write:!1,controlRead:!1,controlWrite:!1},{fetch:e.fetch}))return Te("permissionDenied",n,"Pod did not revoke the service access.");return Te("missing",n)}catch(s){return Te("permissionDenied",n,Cn(s))}}}}async function Ec(e,t,n){try{for(const s of e.resources){const i=await n.getAgentAccess(s.url,e.service.webId,{fetch:t});if(!i||!Ps(i,s.access))return Te("missing",e)}return Te("granted",e)}catch(s){return Te("permissionDenied",e,Cn(s))}}async function Ic(e,t,n){const s=await n(e,{method:"HEAD"});if(s.ok)return;if(s.status!==404)throw new Error(`Unable to inspect Pod resource (${s.status}).`);await jc(e,n);const i=await n(e,{method:"PUT",headers:{"content-type":t},body:`# Created by the Xpod applet permission broker.
3
- `});if(!i.ok)throw new Error(`Unable to create Pod resource (${i.status}).`)}async function jc(e,t){const n=new URL(e),s=[];let i=new URL("./",n);for(;i.pathname!=="/";){const a=await t(i.href,{method:"HEAD"});if(a.ok)break;if(a.status!==404)throw new Error(`Unable to inspect Pod container (${a.status}).`);s.push(i.href),i=new URL("../",i)}for(const a of s.reverse()){const c=await t(a,{method:"PUT",headers:{"content-type":"text/turtle",link:'<http://www.w3.org/ns/ldp#BasicContainer>; rel="type"'},body:""});if(!c.ok&&c.status!==409)throw new Error(`Unable to create Pod container (${c.status}).`)}}function kc(e){return{read:e.read===!0,append:e.append===!0,write:e.write===!0,controlRead:!1,controlWrite:!1}}function Ps(e,t){return(!t.read||e.read===!0)&&(!t.append||e.append===!0)&&(!t.write||e.write===!0)}function Te(e,t,n){return{status:e,resources:t.resources,...n?{message:n}:{}}}function Cn(e){return e instanceof Error?e.message:"Unable to update Pod service access."}const Fc=Xa;function Bc(e,t){return Dc(e,t)}function Dc(e,t){const n=Nc(e),s=e.createController(t);return n.type==="single-pane"?{layout:"single-pane",controller:s,element:f.createElement(n.render,{controller:s,host:t})}:n.type==="two-pane"?{layout:"two-pane",controller:s,slots:{listHeader:f.createElement(n.slots.listHeader,{controller:s,host:t}),list:f.createElement(n.slots.list,{controller:s,host:t}),mainHeader:f.createElement(n.slots.mainHeader,{controller:s,host:t}),main:f.createElement(n.slots.main,{controller:s,host:t})}}:{layout:"three-pane",controller:s,contextConfig:n.contextConfig,slots:{listHeader:f.createElement(n.slots.listHeader,{controller:s,host:t}),list:f.createElement(n.slots.list,{controller:s,host:t}),mainHeader:f.createElement(n.slots.mainHeader,{controller:s,host:t}),main:f.createElement(n.slots.main,{controller:s,host:t}),context:f.createElement(n.slots.context,{controller:s,host:t})}}}function Nc(e){if("layout"in e){const t=Pc(e.layout),n=Fc(t.descriptor),s=n.type;if(e.manifest.layout!==s)throw new Error(`Applet manifest layout ${e.manifest.layout} does not match descriptor layout ${s}`);if(s==="single-pane"){if(!("render"in t))throw new Error("Applet descriptor single-pane render must be a function");return Ve(t.render,"Applet descriptor single-pane render"),{type:"single-pane",render:t.render}}if(!("slots"in t))throw new Error(`Applet descriptor declares ${s} but no slots were provided`);return s==="two-pane"?(vn(t.slots,"Applet descriptor two-pane"),{type:"two-pane",slots:t.slots}):(Sc(t.slots,"Applet descriptor three-pane"),{type:"three-pane",contextConfig:n.context,slots:t.slots})}if(e.manifest.layout==="single-pane"){if(!("render"in e))throw new Error("Applet manifest declares single-pane but no single-pane renderer was provided");return Ve(e.render,"Applet single-pane render"),{type:"single-pane",render:e.render}}if(e.manifest.layout==="two-pane"&&"slots"in e)return vn(e.slots,"Applet two-pane"),{type:"two-pane",slots:e.slots};throw new Error(`Applet manifest declares ${e.manifest.layout} but no supported applet layout was provided`)}function vn(e,t){Mc(e,t),Ve(e.listHeader,`${t} slot listHeader`),Ve(e.list,`${t} slot list`),Ve(e.mainHeader,`${t} slot mainHeader`),Ve(e.main,`${t} slot main`)}function Sc(e,t){vn(e,t),Ve(e.context,`${t} slot context`)}function Mc(e,t){if(typeof e!="object"||e===null)throw new Error(`${t} slots must be an object`)}function Ve(e,t){if(typeof e!="function")throw new Error(`${t} must be a function`)}function Pc(e){if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("Applet descriptor layout must be an object");if(!("descriptor"in e)||e.descriptor===void 0)throw new Error("Applet descriptor required");return e}const Uc="data:image/png;base64,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",Rc="data:image/png;base64,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",Kc="data:image/png;base64,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",Tc="data:image/png;base64,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",Oc="data:image/png;base64,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",Lc="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABaCAYAAAA4qEECAAAACXBIWXMAACE4AAAhOAFFljFgAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAOdEVYdFNvZnR3YXJlAEZpZ21hnrGWYwAABRxJREFUeAHtnaFTG0EUxh9MLQy1YK4KJMyAT1EoKAYDM23BgKIGFDOFwaFSBQamzIDBdFDgGoMCgQTVGNAM/AF0v8tee9lsQjbZt7m929/MJtcjaciXl7dvv+PuEQUCgYAxfdQBr6+vkbgriTEkRxF4EqOK0dfXd0uGtC20EBeCrovxRYyIik1VjJ9iHAvRq+08oS2hhcgQeJtk9N7f39P19TU9Pj7Sy8sLFYHh4WEaGBigqakpGh0dTXYjystC7J23nt9SaBnFv6iWJuj8/JxOT0/p7u6OigxEX1tbo7m5uWRXRYyvraK7qdBS5N9ijCNy19fX40gO/AeCHx0dxfdUSycTQuwn3WNbCQ2RSxB3eXm5MCnCFKSTw8NDGhsbwz8rQuiPusf163YKkb+LuxIiOYjcGmizsrKSpNOS0O6b7nENES1LN0RzNDMzE094gbdB+ri8vMQmUscHNYXoIvqTGBEmviBy+0Cr/f19bGJua4hqXUT/oRDNHYF8fXV1hc0nEdHv0z+ri2iZNiJMgEFkc5Cvb25usDkktfyHmjrGcYPFSKAzUmuMUnq/KnSEm1BldE4qE0Tp/arQQ8qDA4Y0C9J+CjghCO2IILQjgtCOeEeWgGWYsg3Z2dvbq7Nrl5aWaHp6mmyDUleu+LrCmtBY609OTpIL8MbTIsOM39zcJNug+oIVYQPvUkfKU4gZGRmh3d1d4gCvY6vU9U5o2LZpVldXE+PdKohkW9EMvBJajTDkZY55Qf3W2MAboWHWqCkDx+04wGE726tjL4SGyFtbW3X7cPgItqRt8GFyHBu1VnUgn0mL0CrPz88NbxyRzJGXOVJGgjWh8Uu6MKO4UgbMIHWitYlXk+Hg4GCcMjiwWcrp8EpozlLu5OSEOPFGaJRxKOdsw5mX03ghNGcpx50yErwQGktsjpSBdGFz9deKzAuNSOYwqxDFcABdkWmhOVMGZymnI9NC+1rK6cis0FyrP9UzcUUmhYaRz5EyEMWqZ+KKzAnti5FvSuaE9sXINyVTQvtk5JuSGaF9M/JNyYzQvhn5pmRCaB+NfFN6LrSvRr4pPRXaZyPflJ4K7bORb0rPhPbdyDelJ0Lnwcg3pSdC58HIN8W50Hkx8k1xKnSejHxTnApdlFJOhzOh82bkm+JE6Dwa+aawC51XI98UdqHzauSbwip0no18U9iEzruRb4q1v49WcWnk48JRHK+FD/Ph4YFswCK0KyM/mWi5zm/Ea9lKUdZTh0sjf2Njw9lJpN1iVWiXRj4+TI5TkrmwKrQrI59zouXCmtAujXyubw0nVoR2aeRzTbTcWKk6ZmdnWU5/wyUc0qs/fKDwTTjOZ9Rh8/1YEdpmGdQK1LRZ952bEa5A44ggtCOC0I4IQjtCFTq+5jGHQVMUmmmnFdrHOjUrpLSr69WiCl3BDWrVQGektKum99cJLdtbVNFnRDYHCBiABZXs0dLQfUg3GR7jZnFxkQJmwFSTHKs/0116Hpc2xuXnhxYWFgrf3KZdEM0XFxfYxDw3oTa/aYho2W0hbklULpdjjznQGsWH/6HrMNRWwxv0GcFFpAKNJCLL3GzW8EYyL8Yt/oOzs7P4qxGoBwUDtEkmQKpppsW4KdnBwYG1I8O+AmGVv1mpiDHfrE8WaLfN3ra4+0yyQUDSZg8HTIvSDwArPixGNG32doTA5beeb9I4MqJa1yH0Noyo2FSpVsKVW0Vxmm5aoaJnC+6L1AoVo9JuV85AIBDokr8WvnnavEglMwAAAABJRU5ErkJggg==",Qc="data:image/svg+xml;utf8,%3Csvg%20viewBox%3D%220%200%2024%2024%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Cpath%20d%3D%22M16.361%2010.26a.894.894%200%200%200-.558.47l-.072.148.001.207c0%20.193.004.217.059.353.076.193.152.312.291.448.24.238.51.3.872.205a.86.86%200%200%200%20.517-.436.752.752%200%200%200%20.08-.498c-.064-.453-.33-.782-.724-.897a1.06%201.06%200%200%200-.466%200zm-9.203.005c-.305.096-.533.32-.65.639a1.187%201.187%200%200%200-.06.52c.057.309.31.59.598.667.362.095.632.033.872-.205.14-.136.215-.255.291-.448.055-.136.059-.16.059-.353l.001-.207-.072-.148a.894.894%200%200%200-.565-.472%201.02%201.02%200%200%200-.474.007Zm4.184%202c-.131.071-.223.25-.195.383.031.143.157.288.353.407.105.063.112.072.117.136.004.038-.01.146-.029.243-.02.094-.036.194-.036.222.002.074.07.195.143.253.064.052.076.054.255.059.164.005.198.001.264-.03.169-.082.212-.234.15-.525-.052-.243-.042-.28.087-.355.137-.08.281-.219.324-.314a.365.365%200%200%200-.175-.48.394.394%200%200%200-.181-.033c-.126%200-.207.03-.355.124l-.085.053-.053-.032c-.219-.13-.259-.145-.391-.143a.396.396%200%200%200-.193.032zm.39-2.195c-.373.036-.475.05-.654.086-.291.06-.68.195-.951.328-.94.46-1.589%201.226-1.787%202.114-.04.176-.045.234-.045.53%200%20.294.005.357.043.524.264%201.16%201.332%202.017%202.714%202.173.3.033%201.596.033%201.896%200%201.11-.125%202.064-.727%202.493-1.571.114-.226.169-.372.22-.602.039-.167.044-.23.044-.523%200-.297-.005-.355-.045-.531-.288-1.29-1.539-2.304-3.072-2.497a6.873%206.873%200%200%200-.855-.031zm.645.937a3.283%203.283%200%200%201%201.44.514c.223.148.537.458.671.662.166.251.26.508.303.82.02.143.01.251-.043.482-.08.345-.332.705-.672.957a3.115%203.115%200%200%201-.689.348c-.382.122-.632.144-1.525.138-.582-.006-.686-.01-.853-.042-.57-.107-1.022-.334-1.35-.68-.264-.28-.385-.535-.45-.946-.03-.192.025-.509.137-.776.136-.326.488-.73.836-.963.403-.269.934-.46%201.422-.512.187-.02.586-.02.773-.002zm-5.503-11a1.653%201.653%200%200%200-.683.298C5.617.74%205.173%201.666%204.985%202.819c-.07.436-.119%201.04-.119%201.503%200%20.544.064%201.24.155%201.721.02.107.031.202.023.208a8.12%208.12%200%200%201-.187.152%205.324%205.324%200%200%200-.949%201.02%205.49%205.49%200%200%200-.94%202.339%206.625%206.625%200%200%200-.023%201.357c.091.78.325%201.438.727%202.04l.13.195-.037.064c-.269.452-.498%201.105-.605%201.732-.084.496-.095.629-.095%201.294%200%20.67.009.803.088%201.266.095.555.288%201.143.503%201.534.071.128.243.393.264.407.007.003-.014.067-.046.141a7.405%207.405%200%200%200-.548%201.873c-.062.417-.071.552-.071.991%200%20.56.031.832.148%201.279L3.42%2024h1.478l-.05-.091c-.297-.552-.325-1.575-.068-2.597.117-.472.25-.819.498-1.296l.148-.29v-.177c0-.165-.003-.184-.057-.293a.915.915%200%200%200-.194-.25%201.74%201.74%200%200%201-.385-.543c-.424-.92-.506-2.286-.208-3.451.124-.486.329-.918.544-1.154a.787.787%200%200%200%20.223-.531c0-.195-.07-.355-.224-.522a3.136%203.136%200%200%201-.817-1.729c-.14-.96.114-2.005.69-2.834.563-.814%201.353-1.336%202.237-1.475.199-.033.57-.028.776.01.226.04.367.028.512-.041.179-.085.268-.19.374-.431.093-.215.165-.333.36-.576.234-.29.46-.489.822-.729.413-.27.884-.467%201.352-.561.17-.035.25-.04.569-.04.319%200%20.398.005.569.04a4.07%204.07%200%200%201%201.914.997c.117.109.398.457.488.602.034.057.095.177.132.267.105.241.195.346.374.43.14.068.286.082.503.045.343-.058.607-.053.943.016%201.144.23%202.14%201.173%202.581%202.437.385%201.108.276%202.267-.296%203.153-.097.15-.193.27-.333.419-.301.322-.301.722-.001%201.053.493.539.801%201.866.708%203.036-.062.772-.26%201.463-.533%201.854a2.096%202.096%200%200%201-.224.258.916.916%200%200%200-.194.25c-.054.109-.057.128-.057.293v.178l.148.29c.248.476.38.823.498%201.295.253%201.008.231%202.01-.059%202.581a.845.845%200%200%200-.044.098c0%20.006.329.009.732.009h.73l.02-.074.036-.134c.019-.076.057-.3.088-.516.029-.217.029-1.016%200-1.258-.11-.875-.295-1.57-.597-2.226-.032-.074-.053-.138-.046-.141.008-.005.057-.074.108-.152.376-.569.607-1.284.724-2.228.031-.26.031-1.378%200-1.628-.083-.645-.182-1.082-.348-1.525a6.083%206.083%200%200%200-.329-.7l-.038-.064.131-.194c.402-.604.636-1.262.727-2.04a6.625%206.625%200%200%200-.024-1.358%205.512%205.512%200%200%200-.939-2.339%205.325%205.325%200%200%200-.95-1.02%208.097%208.097%200%200%201-.186-.152.692.692%200%200%201%20.023-.208c.208-1.087.201-2.443-.017-3.503-.19-.924-.535-1.658-.98-2.082-.354-.338-.716-.482-1.15-.455-.996.059-1.8%201.205-2.116%203.01a6.805%206.805%200%200%200-.097.726c0%20.036-.007.066-.015.066a.96.96%200%200%201-.149-.078A4.857%204.857%200%200%200%2012%203.03c-.832%200-1.687.243-2.456.698a.958.958%200%200%201-.148.078c-.008%200-.015-.03-.015-.066a6.71%206.71%200%200%200-.097-.725C8.997%201.392%208.337.319%207.46.048a2.096%202.096%200%200%200-.585-.041Zm.293%201.402c.248.197.523.759.682%201.388.03.113.06.244.069.292.007.047.026.152.041.233.067.365.098.76.102%201.24l.002.475-.12.175-.118.178h-.278c-.324%200-.646.041-.954.124l-.238.06c-.033.007-.038-.003-.057-.144a8.438%208.438%200%200%201%20.016-2.323c.124-.788.413-1.501.696-1.711.067-.05.079-.049.157.013zm9.825-.012c.17.126.358.46.498.888.28.854.36%202.028.212%203.145-.019.14-.024.151-.057.144l-.238-.06a3.693%203.693%200%200%200-.954-.124h-.278l-.119-.178-.119-.175.002-.474c.004-.669.066-1.19.214-1.772.157-.623.434-1.185.68-1.382.078-.062.09-.063.159-.012z%22/%3E%3C/svg%3E",Us="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCIgZmlsbD0ibm9uZSI+CiAgPHBhdGgKICAgIGQ9Ik0zMiA3IDUxIDE2LjV2MTMuOGMwIDEyLjQtNy40IDIxLjItMTkgMjcuNy0xMS42LTYuNS0xOS0xNS4zLTE5LTI3LjdWMTYuNUwzMiA3WiIKICAgIHN0cm9rZT0iIzhBNzJCRSIKICAgIHN0cm9rZS13aWR0aD0iNSIKICAgIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIKICAgIHN0cm9rZS1saW5lam9pbj0icm91bmQiCiAgLz4KPC9zdmc+Cg==",Hc={openai:Uc,anthropic:Rc,kimi:Kc,bailian:Oc,zhipu:Lc,ollama:Qc,deepseek:Tc},qc={kimi:"#000000",ollama:"#FFFFFF"};function Ot(e){return Hc[e]}function wn(e){return qc[e]}function Vc(e){return f.useSyncExternalStore(e.subscribe,()=>e.credentialRows,()=>e.credentialRows)}let on;function zc(){return on??(on=Qr(()=>import("./collection-runtime-DIBObcT5.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]))),on}function Jc(e){const t=typeof e.provider=="string"?e.provider:void 0,n=ni(t);if(n){if(n.startsWith("custom-instance-"))return"custom";const s=Vt.find(i=>n===i||n.startsWith(`${i}-`));if(s)return s}return ri(String(e.id))}function Pt(e){return typeof e=="string"&&e.trim()?e:void 0}function Gc(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 Xc(e){return e instanceof Date?e.toISOString():Pt(e)}function Yc(e){if(e==="oauth"||e==="deviceCode"||e==="apiKey"||e==="local")return e;if(e==="deviceCodeOAuth")return"deviceCode"}function Wc(e,t,n){const s=Yc(e.authMode)??n?.authMode??"apiKey",i=Pt(e.status),a=e.reauthRequired===!0||String(e.reauthRequired)==="true";return{id:String(e.id),provider:t,offeringId:n?.offeringId??Za(t,s),authMode:s,label:Pt(e.accountLabel)??Pt(e.label)??n?.label,enabled:i===void 0?n?.enabled??!0:i==="active",priority:n?.priority??100,health:a?"expired":n?.health??"unknown",maskedHint:n?.maskedHint,baseUrl:n?.baseUrl,proxyUrl:n?.proxyUrl,compatibility:n?.compatibility,expiresAt:Xc(e.expiresAt)??n?.expiresAt,version:Gc(e.keyVersion)??n?.version??0}}function Zc(e,t,n=[]){const s=new Map(n.map(a=>[a.id,a])),i=[];for(const a of t)Jc(a)===e&&i.push(Wc(a,e,s.get(String(a.id))));return i}function _c(e,t){const n={};for(const s of Vt){const i=new Map;for(const a of t[s]?.credentials??[])i.set(a.id,a);for(const a of e[s]?.credentials??[])i.set(a.id,a);n[s]=[...i.values()]}return n}function $c(e,t,n){if(!n)return e;const s={};for(const i of Vt){const a=e[i];a&&(s[i]={...a,credentials:Zc(i,n,t[i]??[])})}return{...e,...s}}const xe=[{id:"openai",name:"OpenAI",description:"OpenAI 官方 GPT 与推理模型,支持 API Key 与订阅导入。",homeUrl:"https://openai.com",apiKeyUrl:"https://platform.openai.com/api-keys",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://api.openai.com/v1"},{id:"anthropic",name:"Anthropic",description:"Anthropic 官方 Claude 模型,支持 API Key 与订阅导入。",homeUrl:"https://www.anthropic.com",apiKeyUrl:"https://console.anthropic.com/settings/keys",apiKeyPlaceholder:"sk-ant-...",defaultBaseUrl:"https://api.anthropic.com"},{id:"kimi",name:"Kimi",description:"月之暗面 Kimi 模型,支持账号订阅、编码套餐与开放平台。",homeUrl:"https://www.moonshot.cn",apiKeyUrl:"https://platform.moonshot.cn/console/api-keys",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://api.moonshot.cn/v1"},{id:"bailian",name:"百炼",description:"阿里云百炼的通义千问等模型,提供按量与多种套餐。",homeUrl:"https://www.aliyun.com/product/bailian",apiKeyUrl:"https://bailian.console.aliyun.com/#/api-key",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1"},{id:"deepseek",name:"DeepSeek",description:"DeepSeek 官方模型,API Key 接入,接口兼容 OpenAI。",homeUrl:"https://www.deepseek.com",apiKeyUrl:"https://platform.deepseek.com/api_keys",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://api.deepseek.com/v1"},{id:"zhipu",name:"智谱 AI",description:"智谱 GLM 系列模型,支持 API Key 与 GLM 编码套餐。",homeUrl:"https://open.bigmodel.cn",apiKeyUrl:"https://open.bigmodel.cn/usercenter/apikeys",apiKeyPlaceholder:"id.secret-...",defaultBaseUrl:"https://open.bigmodel.cn/api/paas/v4"},{id:"ollama",name:"Ollama",description:"运行在本机的 Ollama 模型,无需 API Key,仅本机可达。",homeUrl:"https://ollama.com",defaultBaseUrl:"http://localhost:11434/v1"},{id:"custom",name:"Custom",description:"任意 OpenAI 或 Anthropic 兼容服务,自填地址与 API Key。",homeUrl:"https://undefineds.co",apiKeyPlaceholder:"sk-...",defaultBaseUrl:"https://example.com/v1"}],Xn=[{id:"clients",label:"连接客户端",title:"CONNECT CLIENT"},{id:"keys",label:"Xpod",title:"API KEYS"}],el=75;if(xe.map(e=>e.id).join(",")!==Vt.join(","))throw new Error("AI Connection provider UI is out of sync with the client catalog");class gr extends Error{}function tl(e){const t=e.solid.session.getSnapshot(),n=e.solid.pod,s=n?.status==="ready"?n:void 0,i=t.status==="authenticated"&&s!==void 0;let a,c,p;const h={collection:()=>a,mutations:()=>p};let u=0,g,A;const x=new Set,v=()=>{const N=e.solid.session.getSnapshot();return i&&N.status==="authenticated"&&N.webId===t.webId},U=()=>{u+=1,A=void 0,g=void 0;for(const N of x)N.cancel()},B=()=>{const N=u;let l=!v(),d=!1,M=()=>{};const L={assertCurrent(){if(l||N!==u||!v())throw new gr},dispose(){d||(d=!0,x.delete(L),M())},cancel(){l=!0,L.dispose()}};x.add(L);let $=!0;return M=e.solid.session.subscribe(Ce=>{(!$||Ce.status!=="authenticated"||Ce.webId!==t.webId)&&U()}),$=!1,d&&M(),L},C=i?rl(nl(_a({webId:t.webId,podBaseUrl:s.current.podUrl,authenticatedFetch:e.solid.session.fetch}),e.capabilities.aiClientCredentials),e.capabilities.aiConnectionsPodStore,h,B):null;let I="clients",F="openai",k,P="",j={},w={},m;const b=new Set,D=()=>b.forEach(N=>N()),K=e.capabilities.solidNotifications,Q=e.capabilities.aiConnectionsPodStore,z=new Map;let R=0,q=re(),O=0,Y;function W(){Y===void 0&&(Y=setTimeout(()=>{Y=void 0,O+=1,D()},el))}function te(){if(!Q)return[];const N=new Set,l=a?void 0:Q.credentialsTableDocument?.();if(l&&N.add(l),I==="provider"){const d=Q.providerTableDocument?.(F,k);d&&N.add(d)}return[...N]}function J(){for(const[N,l]of z)z.delete(N),l()}function ce(){if(!K||R===0)return;const N=new Set(te());for(const[l,d]of z)N.has(l)||(z.delete(l),d());for(const l of N)z.has(l)||z.set(l,K.watch(l,W))}function re(){const N=K?K.getState():"unavailable";if(!a||!e.capabilities.podCollections)return N;const l=e.capabilities.podCollections.syncState(a.collection);return l==="unavailable"||l==="degraded"||N==="unavailable"?"unavailable":l==="live"&&N==="live"?"live":"idle"}K?.subscribeState(()=>{const N=re();N!==q&&(q=N,D())}),e.capabilities.podCollections?.subscribeSyncState(()=>{const N=re();N!==q&&(q=N,D())});function de(){const N=a?.collection,l=N?.isReady()?N.toArray:void 0;l!==c&&(c=l,D())}function se(N,l){a=N,p=l;const d=N.collection;d.subscribeChanges(()=>de()),d.on("status:change",()=>de()),de(),ce(),D()}i&&t.webId&&e.capabilities.podCollections&&zc().then(async N=>{const l=await N.openCredentialCollection(e);!l||!Q||se(l,N.collectionCredentialMutations(l,Q))}).catch(()=>{});const ue={client:C,openExternal:e.navigation.openExternal,clientConfigurationBridge:e.capabilities.aiClientConfiguration,get credentialsCollection(){return a?.collection},get credentialRows(){return c},get selectedSection(){return I},get selectedProvider(){return F},get selectedCredentialId(){return k},get searchQuery(){return P},get providerStates(){return j},get providerSummaries(){return w},get providerLoadError(){return m},get liveUpdates(){return q},get liveRevision(){return O},watchPageTables(){R+=1,ce();let N=!1;return()=>{N||(N=!0,R-=1,!(R>0)&&(R=0,J()))}},selectSection(N){I!==N&&(I=N,ce(),D())},selectProvider(N,l){const d=N==="custom"?l:void 0;I==="provider"&&F===N&&k===d||(I="provider",F=N,k=d,ce(),D())},selectFirstUnconfiguredProvider(){const N=xe.findIndex(M=>M.id===F),d=(N<0?xe:[...xe.slice(N+1),...xe.slice(0,N+1)]).find(M=>j[M.id]==="unconfigured"&&M.id!==F)??xe.find(M=>j[M.id]==="unconfigured")??xe[0];d&&ue.selectProvider(d.id)},setSearchQuery(N){P!==N&&(P=N,D())},setProviderState(N,l){if(j[N]===l)return;u+=1,j={...j,[N]:l};const d=w[N]?void 0:pl(N,l);d&&(w={...w,[N]:d}),D()},cancelProviderLoads:U,async loadProviders(){if(!C)return;if(g)return g;const N={};A=N;const l=++u,d=Promise.resolve().then(async()=>{if(A===N){m=void 0,D();try{const M=await C.listProviders();if(l!==u||!v())return;w=Object.fromEntries(M.map(L=>[L.id,L])),j=Object.fromEntries(xe.map(L=>[L.id,cl(w[L.id])])),D()}catch(M){if(M instanceof gr||l!==u||!v())return;m=hl(M),D()}finally{A===N&&(A=void 0,g=void 0)}}});return g=d,d},subscribe(N){return b.add(N),()=>b.delete(N)}};return ue}function nl(e,t){return{...e,async createGatewayKey(n){if(!t)throw new Error("当前账号登录状态不支持创建客户端凭据。");const s=await t.create({name:n.name,webId:e.webId});try{return await e.createGatewayKey({...n,apiKey:s.apiKey,credentialResource:s.resource})}catch(i){try{await t.revoke({clientId:ml(s.apiKey),resource:s.resource,webId:e.webId})}catch{throw new Error("API Key 未能保存到 Pod,且账号凭据撤销失败。该凭据尚未应用到客户端。")}throw i}},async deleteGatewayKey(n){const s=(await e.listGatewayKeys()).find(i=>i.id===n);if(s?.kind==="client-credentials"){if(!t||!s.clientCredentialId)throw new Error("当前账号登录状态无法撤销此客户端凭据,Key 记录已保留。");const a=(await t.list()).find(c=>c.clientId===s.clientCredentialId);if(!a)throw new Error("账号服务中已找不到该客户端凭据,请刷新后重试。");await t.revoke({clientId:a.clientId,resource:a.resource,webId:e.webId})}await e.deleteGatewayKey(n)}}}function rl(e,t,n,s){const i=async()=>{const g=s();try{g.assertCurrent();const A=t?await t.listProviders():await e.listProviders();if(g.assertCurrent(),!t)return A;const x=e.listAuthorizationMethods?await e.listAuthorizationMethods():[];return g.assertCurrent(),dl(A,x)}finally{g.dispose()}};if(!t)return{...e,listProviders:i};const a=new Map,c=t.readCredentialSecret&&t.updateOAuthCredential?(g,A)=>{const x=JSON.stringify([g,A]),v=a.get(x);if(v)return v;const U=(async()=>{const C=(await t.listProviders()).find(w=>w.id===g)?.credentials.find(w=>w.id===A);if(!C)throw new Error("oauth_credential_not_found");const I=await t.readCredentialSecret(g,A),F=typeof I.refreshToken=="string"?I.refreshToken:void 0;if(!F)throw new Error("oauth_refresh_token_required");const k=await e.refreshOAuthCredential(g,A,F,C.version,C.offeringId,I.authorizationMethodId==="browser-oauth"?"authorizationCodeOAuth":void 0);if(k.status!=="completed"||!k.oauthCredential)throw new Error("oauth_refresh_failed");await t.updateOAuthCredential(g,A,C.version,k.oauthCredential);const{oauthCredential:P,...j}=k;return j})().finally(()=>{a.delete(x)});return a.set(x,U),U}:e.refreshOAuthCredential,p=async(g,A,x=!1)=>{let v=!1,U=await t.readCredentialSecret(g,A.id);const B=typeof U.expiresAt=="string"?U.expiresAt:A.expiresAt;if((A.authMode==="oauth"||A.authMode==="deviceCode")&&(x||B&&Date.parse(B)<=Date.now()+6e4)){if(!t.updateOAuthCredential)throw new Error("oauth_refresh_unavailable");await c(g,A.id,"",A.version);const I=(await t.listProviders()).find(F=>F.id===g)?.credentials.find(F=>F.id===A.id);if(!I)throw new Error("oauth_credential_not_found");v=!0,A=I,U=await t.readCredentialSecret(g,A.id)}return{credential:A,secret:U,didRefresh:v}},h={...e,listProviders:i,listModels:t.listModels?async()=>t.listModels():e.listModels,createApiKeyCredential:t.createApiKeyCredential?async(g,A)=>t.createApiKeyCredential(g,A):e.createApiKeyCredential,createLocalCredential:t.createLocalCredential?async(g,A)=>A.authorizationMethodId==="local-session-import"||!A.authorizationMethodId&&A.offeringId==="official-subscription"?e.createLocalCredential(g,A):t.createLocalCredential(g,A):e.createLocalCredential,updateProviderCredential:t.updateProviderCredential?async(g,A,x)=>t.updateProviderCredential(g,A,x):e.updateProviderCredential,deleteProviderCredential:t.deleteProviderCredential?async(g,A)=>t.deleteProviderCredential(g,A):e.deleteProviderCredential,pollDevice:t.saveOAuthCredential?async(g,A)=>{const x=await e.pollDevice(g,A);if(x.status!=="completed"||!x.oauthCredential)return x;const v=await t.saveOAuthCredential(g,x.oauthCredential),{oauthCredential:U,...B}=x;return{...B,credentialId:v?.id??x.credentialId}}:e.pollDevice,refreshOAuthCredential:c,quota:t.readCredentialSecret?async(g,A=!1,x)=>{const U=(await t.listProviders()).find(k=>k.id===g)?.credentials??[],B=x?.credentialId??x?.credentialIri,C=B?U.find(k=>k.id===B):U.find(k=>k.enabled&&(!x?.offeringId||k.offeringId===x.offeringId));if(!C)throw new Error("quota_credential_not_found");const{secret:I}=await p(g,C),F=ln(I,C.authMode);if(!F)throw new Error("credential_secret_unavailable");return e.quotaFromSecret(g,{credentialId:C.id,credentialIri:C.id,authMode:C.authMode==="deviceCode"||C.authMode==="oauth"?"deviceCodeOAuth":"apiKey",offeringId:C.offeringId,baseUrl:C.baseUrl,proxyUrl:C.proxyUrl,compatibility:C.compatibility,secret:F})}:e.quota,disconnect:async(g,A)=>!A||!t.deleteProviderCredential?e.disconnect(g,A):await t.deleteProviderCredential(g,A),testProviderCredential:t.readCredentialSecret?async(g,A)=>{let v=(await t.listProviders()).find(k=>k.id===g)?.credentials.find(k=>k.id===A.credentialId);if(!v)throw new Error("test_credential_not_found");const U=await p(g,v);v=U.credential;const{secret:B}=U,C=ln(B,v.authMode);if(!C)throw new Error("test_secret_missing");let I;try{I=await e.discoverModels(g,{credentialId:v.id,offeringId:v.offeringId,authMode:v.authMode==="deviceCode"||v.authMode==="oauth"?"deviceCodeOAuth":v.authMode==="local"?"local":"apiKey",secret:C,baseUrl:v.baseUrl,proxyUrl:v.proxyUrl,compatibility:v.compatibility})}catch(k){throw await t.markCredentialHealth?.(g,v.id,"invalid",v.version).catch(()=>{}),k}const F=await t.markCredentialHealth?.(g,v.id,"healthy",v.version);return{ok:!0,credentialId:v.id,...F?{credential:F}:{},modelCount:I.models.length,observedAt:I.observedAt}}:e.testProviderCredential,discoverModels:t.readCredentialSecret?async(g,A)=>{const U=(await t.listProviders()).find(j=>j.id===g)?.credentials.filter(j=>j.enabled&&(!A?.offeringId||j.offeringId===A.offeringId)&&(!A?.credentialId||j.id===A.credentialId))??[];if(U.length===0)throw new Error("models_credential_not_found");const B=j=>JSON.stringify([g,j.offeringId,(j.baseUrl??"").trim().replace(/\/+$/u,""),A?.compatibility??j.compatibility??"auto",g==="custom"?j.id:void 0]),C=new Map;for(const j of[...U].sort((w,m)=>w.priority-m.priority)){const w=B(j),m=C.get(w)??[];m.push(j),C.set(w,m)}const I=await Promise.allSettled([...C.values()].map(async j=>{let w;for(const m of j)try{let b=await p(g,m);const D=()=>{const Q=ln(b.secret,m.authMode);if(!Q)throw new Error("models_secret_missing");return e.discoverModels(g,{credentialId:m.id,offeringId:m.offeringId,authMode:m.authMode==="deviceCode"||m.authMode==="oauth"?"deviceCodeOAuth":m.authMode==="local"?"local":"apiKey",secret:Q,baseUrl:m.baseUrl,proxyUrl:m.proxyUrl,compatibility:A?.compatibility??m.compatibility})};let K;try{K=await D()}catch(Q){if(b.didRefresh||!(Q instanceof $a)||Q.code!=="provider_models_fetch_failed"||Q.providerStatus!==401||m.authMode!=="oauth"&&m.authMode!=="deviceCode")throw Q;b=await p(g,b.credential,!0),K=await D()}return{...K,credential:m.id,credentialVersion:b.credential.version,models:K.models.map(Q=>({...Q,offeringId:m.offeringId,...g==="custom"?{credentialId:m.id}:{}}))}}catch(b){w=b}throw w})),F=I.flatMap(j=>j.status==="fulfilled"?[j.value]:[]);if(F.length===0)throw I[0].reason;for(const j of F)await t.markCredentialHealth?.(g,j.credential,"healthy",j.credentialVersion);const k=j=>`${j.offeringId}\0${j.credentialId??""}\0${("resourceId"in j?j.resourceId:void 0)??j.id}`;if(t.saveDiscoveredModels)try{const j=new Set([...C.values()].flatMap((m,b)=>I[b]?.status==="rejected"?[m[0].offeringId]:[])),w=new Map;for(const m of F){const b=U.find(Q=>Q.id===m.credential);if(g!=="custom"&&j.has(b.offeringId))continue;const D=g==="custom"?b.id:b.offeringId,K=w.get(D)??{credential:b.id,models:[]};K.models.push(...m.models),w.set(D,K)}for(const m of w.values())await t.saveDiscoveredModels(g,m.credential,[...new Map(m.models.map(b=>[k(b),b])).values()])}catch{throw new Error("models_persistence_failed")}const P=[...new Map(F.flatMap(j=>j.models).map(j=>[k(j),j])).values()];return{...F[0],models:P,complete:F.length===C.size}}:e.discoverModels,saveModelSelection:t.saveModelSelection?async(g,A,x)=>t.saveModelSelection(g,A,x):e.saveModelSelection};return{...h,...{createApiKeyCredential:(g,A)=>n.mutations()?.createApiKeyCredential(g,A)??h.createApiKeyCredential(g,A),createLocalCredential:(g,A)=>A.authorizationMethodId==="local-session-import"||!A.authorizationMethodId&&A.offeringId==="official-subscription"?h.createLocalCredential(g,A):n.mutations()?.createLocalCredential(g,A)??h.createLocalCredential(g,A),updateProviderCredential:(g,A,x)=>n.mutations()?.updateProviderCredential(g,A,x)??h.updateProviderCredential(g,A,x),deleteProviderCredential:(g,A)=>n.mutations()?.deleteProviderCredential(g,A)??h.deleteProviderCredential(g,A)}}}function Yn(e){return f.useSyncExternalStore(e.subscribe,()=>e.selectedSection??"provider",()=>e.selectedSection??"provider")}function Wn(e){return f.useSyncExternalStore(e.subscribe,()=>e.selectedProvider,()=>e.selectedProvider)}function Rs(e){return f.useSyncExternalStore(e.subscribe,()=>e.selectedCredentialId,()=>e.selectedCredentialId)}function Ks(e){return f.useSyncExternalStore(e.subscribe,()=>e.searchQuery,()=>e.searchQuery)}function sl(e){return f.useSyncExternalStore(e.subscribe,()=>e.providerStates,()=>e.providerStates)}function Ts(e){return f.useSyncExternalStore(e.subscribe,()=>xr(e.providerSummaries),()=>xr(e.providerSummaries))}function al(e){const t=Ts(e),n=Object.keys(t);return n.length>0?n:void 0}function Zn(e){return f.useSyncExternalStore(e.subscribe,()=>e.providerSummaries,()=>e.providerSummaries)}function Os(e){return f.useSyncExternalStore(e.subscribe,()=>e.providerLoadError,()=>e.providerLoadError)}function il(e){return f.useSyncExternalStore(e.subscribe,()=>e.liveUpdates,()=>e.liveUpdates)}function ol(e){return f.useSyncExternalStore(e.subscribe,()=>e.liveRevision,()=>e.liveRevision)}function cl(e){if(!e||e.status==="unconfigured"||e.status==="unavailable")return"unconfigured";if(e.status==="configured")return"configured";if(e.status==="attention")return"attention";const t=Ls(e);return t?.authMode==="oauth"||t?.authMode==="deviceCode"?"connected":"configured"}const Ar=new WeakMap;function xr(e){const t=Ar.get(e);if(t)return t;const n=Object.fromEntries(Object.values(e).filter(Qs).map(s=>[s.id,ll(s)]));return Ar.set(e,n),n}function ll(e){const t=Ls(e),n=e.status==="available"?"connected":e.status==="attention"?"reauthRequired":"disconnected",s=t?.authMode;return{provider:e.id,status:n,authMode:s==="oauth"||s==="deviceCode"?"deviceCodeOAuth":s?"browserAssistedApiKey":void 0,accountLabel:t?.label,expiresAt:t?.expiresAt,reauthRequired:n==="reauthRequired"?!0:void 0,credentialIri:t?.id,version:t?.version,connect:{modes:ul(e),configured:e.status!=="unavailable"}}}function ul(e){const t=[...e.offerings.flatMap(n=>n.authModes??[]),...e.credentials.map(n=>n.authMode)].map(n=>n==="oauth"||n==="deviceCode"?"deviceCodeOAuth":n==="apiKey"||n==="local"?"browserAssistedApiKey":void 0).filter(Qs);return t.length>0?[...new Set(t)]:["browserAssistedApiKey"]}function Ls(e){return e.credentials.find(t=>t.enabled)??e.credentials[0]}function dl(e,t){if(t.length===0)return e;const n=new Map(t.map(s=>[`${s.provider}:${s.offeringId}`,s]));return e.map(s=>({...s,offerings:s.offerings.map(i=>{const a=n.get(`${s.id}:${i.id}`);if(!a)return i;const c=a.authorizationMethods;return{...i,...a.endpoints?{endpoints:a.endpoints}:{},authorizationMethods:c,authModes:fl(i.authModes,c.map(p=>p.authMode))}})}))}function fl(e,t){return Array.from(new Set([...e??[],...t]))}function pl(e,t){if(t==="configured")return{id:e,name:cn(e),offerings:[],credentials:[yr(e,"apiKey")],selectedModels:[],status:"available"};if(t==="connected")return{id:e,name:cn(e),offerings:[],credentials:[yr(e,"deviceCode")],selectedModels:[],status:"available"};if(t!=="attention"&&t!=="loading")return{id:e,name:cn(e),offerings:[],credentials:[],selectedModels:[],status:"unconfigured"}}function yr(e,t){return{id:`${e}:current`,offeringId:t==="deviceCode"||t==="oauth"?"official-subscription":"api-platform",authMode:t,enabled:!0,priority:0,health:"healthy",version:0}}function cn(e){return xe.find(t=>t.id===e)?.name??e}function ln(e,t){if(t==="deviceCode"||t==="oauth"){const s=typeof e.accessToken=="string"&&e.accessToken.trim()?e.accessToken:void 0;return s?{type:"oauth",accessToken:s}:void 0}if(t==="local")return{type:"local"};const n=typeof e.apiKey=="string"&&e.apiKey.trim()?e.apiKey:void 0;return n?{type:"apiKey",apiKey:n}:void 0}function Qs(e){return e!==void 0}function hl(e){return Kn(e)}function ml(e){const t=atob(e.replace(/^sk-/u,"")),n=t.indexOf(":");if(n<=0)throw new Error("客户端凭据格式无效。");return t.slice(0,n)}function gl({controller:e}){const t=al(e),n=f.useContext(Ya),s=Yn(e),i=Wn(e),a=Rs(e),c=Ks(e).trim().toLocaleLowerCase(),p=sl(e),h=Zn(e),u=Os(e),A=(t?xe.filter(m=>t.includes(m.id)):xe).reduce((m,b)=>{if(b.id!=="custom")return[...m,{...b}];const D=h.custom?.credentials??[];return[...m,...D.map(K=>({...b,name:K.label||b.name,credentialId:K.id}))]},[]),x=c?A.filter(m=>un(m,h).toLocaleLowerCase().includes(c)):A,[v,U]=f.useState(!1),B=m=>{const b=p[m.id];return b==="configured"||b==="connected"},C=x.filter(B);x.filter(m=>!B(m));const I=v||C.length===0,F=I?x:C,k=[...Xn.map(m=>({kind:"section",id:m.id,label:m.label})),...F.map(m=>({kind:"provider",provider:m}))],P=f.useRef([]),j=k.findIndex(m=>m.kind==="section"?s===m.id:s==="provider"&&m.provider.id===i&&m.provider.credentialId===a),w=m=>{m.kind==="section"?e.selectSection(m.id):e.selectProvider(m.provider.id,m.provider.credentialId),n?.mode==="stack"&&n.openMain()};return r.jsxs("div",{role:"listbox","aria-label":"AI 服务","aria-orientation":"vertical",className:"py-2",children:[r.jsx("section",{className:"mb-3","aria-label":"API Keys",children:k.filter(m=>m.kind==="section").map(m=>{const b=k.indexOf(m);return r.jsxs(br,{index:b,selected:s===m.id,tabbable:j===b||j<0&&b===0,label:m.label,optionRefs:P,onActivate:()=>w(m),onMove:D=>Cr(k,D,e,P),children:[r.jsx(Al,{section:m.id}),r.jsx("span",{className:Pe("min-w-0 flex-1 truncate text-sm font-medium",s===m.id?"text-foreground":"text-foreground/80"),children:m.label})]},m.id)})}),r.jsxs("section",{"data-testid":"ai-provider-section",children:[r.jsxs("div",{className:"flex items-center justify-between gap-2 px-5 py-1",children:[r.jsx("h2",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:C.length>0&&!I?"已连接":"Provider"}),C.length>0?r.jsx("button",{type:"button","data-testid":"ai-add-connection",className:"text-[11px] text-primary underline-offset-4 hover:underline","aria-expanded":I,onClick:()=>U(m=>!m),children:I?"收起目录":"添加连接"}):null]}),F.map(m=>{const b=k.findIndex(Q=>Q.kind==="provider"&&Q.provider.id===m.id&&Q.provider.credentialId===m.credentialId),D=s==="provider"&&i===m.id&&m.credentialId===a,K=p[m.id]??"loading";return r.jsxs(br,{index:b,selected:D,tabbable:D||j<0&&b===0,label:un(m,h),describedBy:`ai-connections-provider-${m.id}-${m.credentialId??"default"}-status`,optionRefs:P,onActivate:()=>w({kind:"provider",provider:m}),onMove:Q=>Cr(k,Q,e,P),children:[r.jsxs(Pn,{className:"h-9 w-9 shrink-0 rounded-md border border-border/20",style:wn(m.id)?{backgroundColor:wn(m.id)}:void 0,children:[r.jsx(Un,{src:Ot(m.id),className:"object-cover"}),r.jsx(Rn,{className:"rounded-md bg-muted text-[10px] font-bold uppercase text-muted-foreground",children:yl(m.id)})]}),r.jsx("span",{className:Pe("min-w-0 flex-1 truncate text-sm font-medium",D?"text-foreground":"text-foreground/80"),children:un(m,h)}),r.jsx(xl,{state:K,statusId:`ai-connections-provider-${m.id}-${m.credentialId??"default"}-status`})]},`${m.id}:${m.credentialId??"default"}`)}),F.length===0?r.jsx("p",{className:"p-8 text-center text-xs text-muted-foreground",children:"无结果"}):null]}),u?r.jsxs("p",{className:"px-4 py-2 text-xs text-destructive",children:["Provider 状态读取失败:",u]}):null]})}function br({index:e,selected:t,tabbable:n,label:s,describedBy:i,statusId:a,optionRefs:c,onActivate:p,onMove:h,children:u}){const g=A=>{if(A.key==="ArrowDown")h(e+1);else if(A.key==="ArrowUp")h(e-1);else if(A.key==="Home")h(0);else if(A.key==="End")h(Number.POSITIVE_INFINITY);else if(A.key==="Enter"||A.key===" "){A.preventDefault(),p();return}else return;A.preventDefault()};return r.jsx("button",{ref:A=>{c.current[e]=A},type:"button",role:"option","aria-selected":t,"aria-label":s,"aria-describedby":i??a,tabIndex:n?0:-1,onClick:p,onKeyDown:g,className:Pe("group flex w-full items-center gap-3 border-l-[3px] border-transparent px-4 py-3 text-left transition-colors",t?"border-l-primary bg-accent/80":"hover:bg-muted/40"),children:u})}function Cr(e,t,n,s){const i=Math.min(Math.max(t,0),e.length-1),a=e[i];a&&(a.kind==="section"?n.selectSection(a.id):n.selectProvider(a.provider.id,a.provider.credentialId),s.current[i]?.focus())}function Al({section:e}){return r.jsxs(Pn,{className:"h-9 w-9 shrink-0 rounded-md border border-border/20",children:[r.jsx(Un,{src:Us,className:"object-cover"}),r.jsx(Rn,{className:"rounded-md bg-muted text-[10px] font-bold uppercase text-muted-foreground",children:"XP"})]})}function xl({state:e,statusId:t}){const n=e==="configured"||e==="connected";return r.jsxs("span",{id:t,role:"status","aria-live":"polite",className:"flex shrink-0 items-center gap-1.5",children:[n?r.jsx("span",{className:"h-2 w-2 rounded-full bg-primary","aria-hidden":"true"}):null,r.jsx("span",{className:"text-[11px] font-normal text-muted-foreground",children:bl(e)})]})}function yl(e){switch(e){case"openai":return"OA";case"anthropic":return"A";case"kimi":return"K";case"bailian":return"百";case"deepseek":return"DS";case"zhipu":return"智";case"ollama":return"O";case"custom":return"C"}}function un(e,t){return e.name||t[e.id]?.name||e.id}function bl(e){switch(e){case"unconfigured":return"未设置";case"configured":return"已配置";case"connected":return"已连接";case"attention":return"需处理";default:return"读取中"}}function Ft(e){return si(Cl(e))}function Cl(e){if(Array.isArray(e.authorizationMethods))return e.authorizationMethods;const t=e.lifecycle==="unavailable"?"unavailable":"active";return[...new Set(e.authModes??[])].map(n=>n==="apiKey"?{id:"api-key",authMode:"apiKey",connectMode:"browserAssistedApiKey",lifecycle:t}:n==="local"?{id:e.kind==="local"?"local-service":"local-session-import",authMode:"local",lifecycle:t}:{id:"device-code",authMode:n,connectMode:"deviceCodeOAuth",lifecycle:t})}function Bt(e){if(e.connectMode)return e.connectMode;if(e.authMode==="oauth"||e.authMode==="deviceCode")return"deviceCodeOAuth";if(e.authMode==="apiKey")return"browserAssistedApiKey"}function ze(e){return e==="deviceCodeOAuth"||e==="authorizationCodeOAuth"}function Hs(e){return ze(Bt(e))}function tt(e){return e.authMode==="apiKey"||Bt(e)==="browserAssistedApiKey"}const vl="api-key";function ot(e){return e.connectMode==="browserAssistedApiKey"&&e.id!==vl}function dn(e){const t=Bt(e);return ot(e)||t==="authorizationCodeOAuth"?0:t==="deviceCodeOAuth"?1:_n(e)?2:tt(e)?3:4}function _n(e){return e.authMode==="local"}function wl(e){return(e.authModes??[]).some(n=>n==="oauth"||n==="deviceCode")?"deviceCodeOAuth":"browserAssistedApiKey"}function Ut(e){return e?.status==="pending"||e?.status==="authorization_pending"||e?.status==="slow_down"}const qs={"oauth-subscription":"Subscription","api-platform":"API Platform","token-plan":"Token Plan",local:"Local"};function Ae(e){const t=e.label?.trim();if(t)return t;const n=e.kind?qs[e.kind]:void 0;return n||(e.authModes?.some(s=>s==="apiKey")?"API Key":e.authModes?.some(s=>s==="oauth"||s==="deviceCode")?"Account":e.id)}function El(e){return qs[e]??e}function Il(e,t){const n=(t?.length?t:Ft(e)).map(s=>s.authMode==="apiKey"?"API Key":s.authMode==="local"?s.label:"账号授权");return[...new Set(n)].join(" / ")}function jl({label:e,lines:t}){return r.jsx(xt,{children:r.jsxs(Gt,{children:[r.jsx(Xt,{asChild:!0,children:r.jsx("button",{type:"button","aria-label":e,className:"cursor-help rounded-sm text-muted-foreground/50 focus:outline-none focus-visible:text-foreground",children:r.jsx(Jr,{"aria-hidden":"true",className:"h-3.5 w-3.5"})})}),r.jsx(yt,{className:"max-w-xs space-y-2 text-xs",children:t.map((n,s)=>r.jsx("p",{children:n},s))})]})})}function Vs({name:e,mark:t,avatar:n,avatarBackground:s,infoLabel:i,infoLines:a,link:c,badge:p}){return r.jsxs("header",{className:"flex items-start justify-between gap-4",children:[r.jsxs("div",{className:"flex items-center gap-3",children:[r.jsxs(Pn,{className:"h-9 w-9 shrink-0 rounded-lg border border-border/50 bg-muted/50 shadow-sm",style:s?{backgroundColor:s}:void 0,children:[r.jsx(Un,{src:n,className:"object-cover"}),r.jsx(Rn,{className:"rounded-lg bg-transparent text-sm font-bold uppercase text-muted-foreground",children:t})]}),r.jsxs("div",{className:"flex flex-col justify-center gap-0.5",children:[r.jsxs("div",{className:"flex items-center gap-2",children:[r.jsx("h2",{className:"text-base font-semibold leading-none tracking-tight text-foreground",children:e}),r.jsx(jl,{label:i,lines:a})]}),r.jsxs("a",{href:c.href,target:"_blank",rel:"noreferrer",className:"flex items-center gap-0.5 text-[10px] leading-none text-muted-foreground transition-colors hover:text-primary",children:[c.label," ",r.jsx(zt,{"aria-hidden":"true",className:"h-2.5 w-2.5"})]})]})]}),p]})}function kl(e){return e.length===0?10:Math.max(...e.map(t=>t.priority))+10}function nt(e){return e.label?.trim()?e.label:e.maskedHint?`API Key · ${e.maskedHint}`:e.authMode==="oauth"||e.authMode==="deviceCode"?"已授权账号":"API Key"}function vr(e){const t=e.indexOf("@");if(t>0){const n=e.slice(0,t);return`${n.length>6?`${n.slice(0,3)}***${n.slice(-2)}`:n.length>1?`${n[0]}***${n[n.length-1]}`:`${n[0]}***`}${e.slice(t)}`}return e}function Fl(e){return e==="healthy"?"有效":e==="unknown"?"未验证":e==="expired"?"已过期":"错误"}function Bl(e){return e==="healthy"?{row:"bg-emerald-500/5",dot:"bg-emerald-500"}:e==="unknown"?{row:"bg-background",dot:"bg-muted-foreground/50"}:{row:"bg-destructive/5",dot:"bg-destructive"}}function Dl({providerName:e,offeringName:t,quota:n,busy:s,disabled:i=!1,credentialLabel:a,multiple:c=!1,compact:p=!1,paused:h=!1,error:u,onRefresh:g}){if(p){const A=!s&&!u&&n?.status==="available";return r.jsx("div",{className:`min-w-0 text-xs text-muted-foreground ${h?"opacity-60":""}`,children:r.jsxs("div",{className:"flex items-start gap-1",children:[r.jsxs("div",{className:"min-w-0 flex-1 truncate py-1 [&>span+span]:ml-3",children:[h?r.jsx("span",{children:"已停用 · 不参与全部刷新"}):null,s?r.jsx("span",{role:"status",children:"正在查询额度…"}):u?r.jsx("span",{role:"alert",title:u,className:"text-destructive",children:u}):n?n.status==="unsupported"?r.jsx("span",{children:"官方额度接口不支持"}):n.status==="error"?r.jsx("span",{role:"alert",className:"text-destructive",children:"额度查询失败"}):r.jsx(wr,{quota:n}):r.jsx("span",{children:a?"尚未检查":`连接${t}后可查询`}),A&&n.stale?r.jsx("span",{children:"数据可能已过期"}):null]}),r.jsx(Nl,{quota:n,label:a??t}),r.jsx(G,{className:"h-6 w-6 shrink-0 p-0",variant:"ghost",size:"sm","aria-label":`刷新 ${e} ${t}${a?` ${a}`:""}额度`,disabled:s||i,onClick:g,children:s?r.jsx(Me,{"aria-hidden":"true",className:"h-3 w-3 animate-spin"}):r.jsx(ur,{"aria-hidden":"true",className:"h-3 w-3"})})]})})}return r.jsxs("div",{className:`${c?"space-y-1.5":"space-y-3"} border-t border-border/40 pt-3 ${h?"opacity-60":""}`,children:[r.jsxs("div",{className:"flex items-center justify-between gap-2",children:[r.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[c?null:r.jsx(_i,{className:"h-4 w-4 shrink-0 text-primary"}),r.jsxs("div",{className:"min-w-0",children:[r.jsx("div",{className:"break-all text-sm font-medium text-foreground/90",children:c?`凭证:${a}`:"剩余额度"}),c&&!s&&!u&&n?.status==="available"?r.jsx("div",{className:"flex flex-wrap gap-x-3 gap-y-1 text-xs text-muted-foreground",children:r.jsx(wr,{quota:n})}):null]})]}),r.jsxs(G,{className:"shrink-0",variant:"ghost",size:"sm","aria-label":`刷新 ${e} ${t}${c?` ${a}`:""}额度`,disabled:s||i,onClick:g,children:[s?r.jsx(Me,{"aria-hidden":"true",className:"mr-2 h-3.5 w-3.5 animate-spin"}):r.jsx(ur,{"aria-hidden":"true",className:"mr-2 h-3.5 w-3.5"}),s?"查询中":"刷新"]})]}),a&&!c?r.jsxs("p",{className:"text-xs text-muted-foreground",children:["凭证:",a]}):null,h?r.jsx("p",{className:"text-xs text-muted-foreground",children:"已停用 · 不参与全部刷新"}):null,s?r.jsx("p",{role:"status",className:"text-xs text-muted-foreground",children:"正在查询额度…"}):u?r.jsx("p",{role:"alert",className:"text-sm text-destructive",children:u}):n?n.status==="unsupported"?r.jsxs(r.Fragment,{children:[r.jsx("p",{className:"text-sm",children:"官方额度接口不支持"}),r.jsxs("p",{className:"text-xs text-muted-foreground",children:["来源:",n.source]})]}):n.status==="error"?r.jsx("p",{className:"text-sm text-destructive",children:"额度查询失败"}):c?r.jsxs("details",{className:"text-xs text-muted-foreground",children:[r.jsx("summary",{className:"cursor-pointer","aria-label":`${a}额度详情`,children:"详情"}),r.jsx("div",{className:"pt-3",children:r.jsx(En,{quota:n,hideBalance:!0})})]}):r.jsx(En,{quota:n}):r.jsx("p",{className:"text-xs text-muted-foreground",children:a?"尚未检查":`连接${t}后可查询`})]})}function Nl({quota:e,label:t}){const[n,s]=f.useState({left:16,top:16,maxHeight:400}),[i,a]=f.useState(!1),c=f.useRef(null),p=f.useRef(null),h=f.useRef(!1);return f.useEffect(()=>{if(!i)return;const u=A=>{!(A.target instanceof Node)||c.current?.contains(A.target)||p.current?.contains(A.target)||(h.current=!0,a(!1))},g=A=>{A.type==="scroll"&&A.target instanceof Node&&p.current?.contains(A.target)||(h.current=!0,a(!1))};return document.addEventListener("pointerdown",u,!0),document.addEventListener("scroll",g,!0),window.addEventListener("resize",g),()=>{document.removeEventListener("pointerdown",u,!0),document.removeEventListener("scroll",g,!0),window.removeEventListener("resize",g)}},[i]),r.jsxs(ht,{modal:!1,open:i,onOpenChange:u=>{h.current=!1,a(u)},children:[r.jsx(La,{asChild:!0,children:r.jsx(G,{ref:c,className:"h-6 w-6 shrink-0 p-0",variant:"ghost",size:"sm","aria-label":`${t}额度详情`,disabled:!e||e.status==="error",onClick:u=>{const g=u.currentTarget.getBoundingClientRect(),A=Math.min(320,window.innerWidth-32),x=Math.max(16,Math.min(g.right-A,window.innerWidth-A-16)),v=Math.max(16,Math.min(g.bottom+8,window.innerHeight-320));s({left:x,top:v,maxHeight:window.innerHeight-v-16})},children:r.jsx(Jr,{"aria-hidden":"true",className:"h-3 w-3"})})}),r.jsxs(mt,{ref:p,className:"w-[calc(100vw-2rem)] max-w-xs overflow-y-auto p-4",onEscapeKeyDown:()=>c.current?.focus(),onCloseAutoFocus:u=>{h.current&&u.preventDefault()},style:{...n,transform:"none",animation:"none"},"aria-describedby":void 0,children:[r.jsx(gt,{className:"pr-8 text-sm",children:"额度详情"}),e?.status==="available"?r.jsx(En,{quota:e}):e?r.jsxs("p",{className:"break-words text-xs text-muted-foreground",children:["来源:",e.source]}):null]})]})}function wr({quota:e}){return r.jsxs(r.Fragment,{children:[typeof e.balance=="number"?r.jsxs("span",{children:["余额:",e.balance]}):null,e.windows.map((t,n)=>r.jsxs("span",{children:[In(t.name)," · ",zs(t)]},n)),typeof e.balance!="number"&&e.windows.length===0?r.jsx("span",{children:"服务商未返回额度数据"}):null]})}function En({quota:e,hideBalance:t=!1}){return r.jsxs("div",{className:"space-y-3 text-sm",children:[!t&&typeof e.balance=="number"?r.jsxs("div",{children:["余额:",e.balance]}):null,e.windows.map((n,s)=>r.jsxs("div",{className:"space-y-1.5",children:[r.jsxs("div",{className:"flex items-center justify-between gap-3",children:[r.jsx("span",{className:"font-medium text-foreground",children:In(n.name)}),r.jsx("span",{className:"text-muted-foreground",children:zs(n)})]}),ct(n)!==void 0?r.jsx("div",{"aria-label":`${In(n.name)}剩余 ${String(ct(n))}%`,className:"h-1.5 overflow-hidden rounded-full bg-muted",role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":ct(n),children:r.jsx("div",{className:"h-full rounded-full bg-primary",style:{width:`${String(ct(n))}%`}})}):null,n.resetsAt?r.jsxs("p",{className:"text-xs text-muted-foreground",children:["重置:",Er(n.resetsAt)]}):null]},`${String(n.name)}-${s}`)),r.jsxs("p",{className:"text-xs text-muted-foreground",children:["更新:",Er(e.observedAt)]}),r.jsxs("p",{className:"break-words text-xs text-muted-foreground",children:["来源:",e.source,e.stale?" · 数据可能已过期":""]})]})}function In(e){switch(e){case"five-hour":return"5 小时限制";case"weekly":return"周限制";case"monthly":return"月限制";case"weekly-opus":return"Opus 周限制";case"weekly-sonnet":return"Sonnet 周限制";case"available_balance":return"可用余额";case"voucher_balance":return"赠送余额";case"cash_balance":return"现金余额";default:return typeof e=="string"&&e?e:"额度"}}function ct(e){if(!(typeof e.remaining!="number"||typeof e.limit!="number"||e.limit<=0))return Math.max(0,Math.min(100,Math.round(e.remaining/e.limit*1e4)/100))}function zs(e){const t=ct(e);if(t!==void 0)return`剩余 ${String(t)}%`;if(typeof e.remaining=="number"){const n=typeof e.currency=="string"?` ${e.currency}`:"";return`剩余 ${String(e.remaining)}${n}`}return"官方数据可用"}function Er(e){const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}function Sl({methods:e,offering:t,busy:n,disabled:s,onBeginOffering:i,onCreateLocalCredential:a}){return e.length===0?null:r.jsx("div",{className:"flex flex-wrap gap-2",children:e.map(c=>{const p=Bt(c),h=c.lifecycle==="unavailable";return c.label?ze(p)?r.jsxs(G,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",title:h?c.reason:void 0,disabled:n||s||h||!i,onClick:()=>i?.(t,p,c),children:[n?r.jsx(Me,{className:"h-3.5 w-3.5 animate-spin"}):r.jsx(zt,{className:"h-3.5 w-3.5"}),c.label]},c.id):_n(c)?r.jsxs(G,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",title:h?c.reason:"导入当前设备已有登录态,不会发起新的浏览器授权。",disabled:n||s||h||!a,onClick:()=>{a?.(t,c)},children:[n?r.jsx(Me,{className:"h-3.5 w-3.5 animate-spin"}):r.jsx(at,{className:"h-3.5 w-3.5"}),c.label]},c.id):null:null})})}function Ml(e){const t=e.modelDiscovery?.endpointProtocol;return e.endpoints?.find(n=>n.protocol===t)?.baseUrl??e.endpoints?.[0]?.baseUrl}function Pl(e){try{const t=new URL(e);return`${t.host}${t.pathname.replace(/\/$/u,"")}`}catch{return e}}function Ul(e){return e==="responses"?"Responses API":e==="chatCompletions"?"Chat API":e==="anthropic"?"Anthropic API":e}function Rl(e){return e==="responses"?"OpenAI Responses 兼容":e==="chatCompletions"?"OpenAI Chat 兼容":e==="anthropic"?"Anthropic Messages 兼容":`${e} 兼容`}function Kl({definition:e,offering:t,createOfferings:n,status:s,credentials:i,attempt:a,apiKey:c,baseUrl:p,busy:h,disabled:u,error:g,onApiKeyChange:A,onBaseUrlChange:x,onBeginApiKey:v,onBeginBrowser:U,onSaveApiKey:B,onDisconnect:C,onCreateApiKeyCredential:I,onUpdateCredential:F,initialEditing:k,initialCreate:P=!1,onSavingChange:j,onCloseEdit:w}){const m=a?.mode==="browserAssistedApiKey"&&a.status==="pending",b=s==="configured",D=s==="connected",K=!!I,Q=Ft(t).find(X=>!tt(X)),[z,R]=f.useState(t.id),q=n.find(X=>X.id===z)??t,[O,Y]=f.useState(!1),[W,te]=f.useState(k?"edit":P&&I?"create":void 0),[J,ce]=f.useState(k),[re,de]=f.useState(k?.label??""),[se,ue]=f.useState(""),[N,l]=f.useState(k?.baseUrl??""),[d,M]=f.useState(k?.proxyUrl??""),[L,$]=f.useState(),[Ce,ve]=f.useState(!1),[oe,Fe]=f.useState(!1),ee=f.useRef(!1),fe=f.useRef(!1);f.useEffect(()=>{P&&!I&&!fe.current&&(fe.current=!0,v())},[P,I,v]);const Be=()=>{R(t.id),te("create"),ce(void 0),de(""),ue(""),l(""),M(""),$(void 0),ve(!1)},ge=()=>{w(),te(void 0),ce(void 0),de(""),ue(""),l(""),M(""),$(void 0),ve(!1)},le=async()=>{if(h||u||ee.current)return;let X;try{X=ei(d)}catch{$("Proxy URL 格式无效(支持 http、https)");return}if($(void 0),W==="create"){const ie=se.trim();if(!ie||!I)return;ee.current=!0,Fe(!0),j?.(!0);try{await I(q,{apiKey:ie,label:re.trim()||void 0,baseUrl:N.trim()||void 0,proxyUrl:X,priority:kl(i.filter(Z=>Z.offeringId===q.id))}),ge()}catch(Z){$(Z instanceof Error?Z.message:"保存失败,请重试")}finally{ee.current=!1,Fe(!1),j?.(!1)}return}if(W==="edit"&&J&&F){const ie=d.trim()!==(J.proxyUrl??"").trim();ee.current=!0,Fe(!0),j?.(!0);try{await F(J,{label:re.trim()||void 0,baseUrl:N.trim()||void 0,...ie?{proxyUrl:X}:{}}),ge()}catch(Z){$(Z instanceof Error?Z.message:"保存失败,请重试")}finally{ee.current=!1,Fe(!1),j?.(!1)}}};return r.jsxs("div",{className:Pe("space-y-3",W&&"w-full"),children:[a?.userCode?r.jsxs("div",{className:"border-l-2 border-primary bg-muted/30 px-3 py-2 text-sm",children:["验证码:",r.jsx("strong",{className:"font-mono",children:a.userCode})]}):null,!P&&!k?r.jsxs("div",{className:"flex flex-wrap gap-2",children:[I&&n.length>0?r.jsxs(G,{variant:"outline",size:"sm",disabled:h||u||oe,onClick:Be,children:[r.jsx(at,{className:"mr-2 h-4 w-4"}),"添加 API Key"]}):null,K?null:D?r.jsxs(r.Fragment,{children:[r.jsxs(G,{variant:"outline",size:"sm",disabled:h||u||oe,onClick:U,children:[h?r.jsx(Me,{className:"mr-2 h-4 w-4 animate-spin"}):r.jsx(An,{className:"mr-2 h-4 w-4"}),"重新连接"]}),r.jsxs(G,{variant:"ghost",size:"sm",disabled:h||u||oe,onClick:C,children:[r.jsx(Mi,{className:"mr-2 h-4 w-4"}),"断开连接"]})]}):b?r.jsxs(r.Fragment,{children:[r.jsxs(G,{variant:"outline",size:"sm","aria-label":"更新 API Key",disabled:h||u||oe,onClick:v,children:[r.jsx(lr,{className:"mr-2 h-4 w-4"}),"更新 API Key"]}),r.jsx(G,{variant:"ghost",size:"sm",disabled:h||u||oe,onClick:C,children:"移除配置"})]}):r.jsxs(r.Fragment,{children:[Q?r.jsxs(G,{variant:"outline",size:"sm",title:Q.lifecycle==="unavailable"?Q.reason:void 0,disabled:h||u||oe||Q.lifecycle==="unavailable",onClick:U,children:[h?r.jsx(Me,{className:"mr-2 h-4 w-4 animate-spin"}):r.jsx(zt,{className:"mr-2 h-4 w-4"}),Q.label]}):null,r.jsxs(G,{variant:"outline",size:"sm","aria-label":`${e.name} API Key`,disabled:h||u||oe,onClick:v,children:[r.jsx(lr,{className:"mr-2 h-4 w-4"}),"配置 API Key"]})]})]}):null,W?r.jsxs("div",{className:"space-y-2 rounded-lg border border-border/50 bg-muted/10 p-3",children:[W==="create"&&n.length>1?r.jsxs("label",{className:"block space-y-1 text-xs text-muted-foreground",children:[r.jsx("span",{children:"套餐 / 区域"}),r.jsx("select",{"aria-label":`${e.name} 套餐 / 区域`,value:z,disabled:h||u||oe,onChange:X=>{R(X.target.value),$(void 0)},className:"h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground",children:n.map(X=>r.jsx("option",{value:X.id,children:Ae(X)},X.id))})]}):null,W==="edit"?r.jsx(ye,{disabled:h||u||oe,autoComplete:"off","aria-label":`${e.name} API Key 标签`,placeholder:"名称,例如 Work key",value:re,onChange:X=>de(X.target.value)}):null,W==="create"?r.jsx(ye,{disabled:h||u||oe,type:O?"text":"password",autoComplete:"new-password","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} API Key 输入`,placeholder:e.apiKeyPlaceholder||"从官方控制台复制 API Key",value:se,onChange:X=>ue(X.target.value),className:"font-mono"}):null,W==="edit"||Ce?r.jsxs(r.Fragment,{children:[r.jsx(ye,{disabled:h||u||oe,autoComplete:"off","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} Base URL 输入`,placeholder:Ml(W==="edit"?t:q)||e.defaultBaseUrl||"默认服务地址",value:N,onChange:X=>l(X.target.value),className:"font-mono text-xs"}),r.jsx(ye,{disabled:h||u||oe,autoComplete:"off","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} Proxy URL 输入`,placeholder:"http://127.0.0.1:7890",value:d,onChange:X=>M(X.target.value),className:"font-mono text-xs"})]}):null,L?r.jsx("p",{className:"text-xs text-destructive",children:L}):null,r.jsxs("div",{className:"flex flex-wrap gap-2",children:[r.jsx(G,{size:"sm","aria-label":W==="create"?`保存 ${e.name} API Key`:"保存凭证",disabled:h||u||oe||W==="create"&&!se.trim(),onClick:le,children:W==="create"?"保存 API Key":"保存凭证"}),r.jsx(G,{variant:"ghost",size:"sm",disabled:oe,onClick:ge,children:"取消"}),W==="create"?r.jsx(G,{variant:"ghost",size:"sm",disabled:oe,onClick:()=>ve(X=>!X),children:Ce?"收起高级设置":"高级设置"}):null]})]}):null,m&&!W?r.jsxs("div",{className:"space-y-2",children:[r.jsxs("div",{className:"flex items-center justify-between",children:[r.jsx("span",{className:"text-sm font-medium",children:"API Key"}),e.apiKeyUrl?r.jsx("a",{href:e.apiKeyUrl,target:"_blank",rel:"noreferrer",className:"text-xs text-primary hover:underline",children:"获取 API Key"}):null]}),r.jsxs("div",{className:"group relative",children:[r.jsx(ye,{disabled:h||u||oe,type:O?"text":"password",autoComplete:"new-password","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} API Key 输入`,placeholder:e.apiKeyPlaceholder||"从官方控制台复制 API Key",value:c,onChange:X=>A(X.target.value),className:"border-border/60 bg-muted/20 pr-10 font-mono transition-colors focus:border-primary/50 focus:bg-background"}),r.jsx("div",{className:"absolute bottom-1 right-1 top-1 flex items-center",children:r.jsx(G,{variant:"ghost",size:"icon",className:"h-full w-8 rounded hover:bg-muted",onClick:()=>Y(X=>!X),"aria-label":O?"隐藏 API Key":"显示 API Key",children:O?r.jsx(Ci,{className:"h-4 w-4 text-muted-foreground"}):r.jsx(wi,{className:"h-4 w-4 text-muted-foreground"})})})]}),x?r.jsxs("div",{className:"space-y-1.5",children:[r.jsx("span",{className:"text-xs font-medium text-muted-foreground",children:"Base URL(选填)"}),r.jsx(ye,{disabled:h||u||oe,autoComplete:"off","data-lpignore":"true","data-1p-ignore":!0,"aria-label":`${e.name} Base URL 输入`,placeholder:e.defaultBaseUrl||"默认服务地址",value:p,onChange:X=>x(X.target.value),className:"border-border/60 bg-muted/20 font-mono text-xs transition-colors focus:border-primary/50 focus:bg-background"}),r.jsxs("p",{className:"break-all font-mono text-[11px] text-muted-foreground opacity-80",children:[r.jsx("span",{className:"mr-1 select-none opacity-50",children:"预览:"}),(p.trim()||e.defaultBaseUrl||"").replace(/\/+$/,""),"/chat/completions"]})]}):null,r.jsx(G,{size:"sm","aria-label":`保存 ${e.name} API Key`,disabled:!c.trim()||h||u,onClick:B,children:"保存 API Key"})]}):null,g?r.jsx("p",{className:"text-sm text-destructive",children:g}):null]})}function Tl({controller:e,definition:t,offerings:n,apiOfferings:s,credentials:i,status:a,attempt:c,attemptOfferingId:p,apiKey:h,baseUrl:u="",busy:g,disabled:A=!1,error:x,onApiKeyChange:v,onBaseUrlChange:U,onBeginApiKey:B,onBeginBrowser:C,onSaveApiKey:I,onDisconnect:F,onUpdateCredential:k,onCreateApiKeyCredential:P,onBeginOffering:j,onCancelConnect:w,onDismissError:m}){const{editing:b,authorizationOfferingId:D,error:K,saving:Q}=e,z=b||D?n.filter(R=>R.id===(b?.offeringId??D)):s;return r.jsx(ht,{open:e.open,onOpenChange:R=>{R||Q||(c&&Ut(c)&&ze(c.mode)&&w?.({mode:c.mode,attemptId:c.attemptId,state:c.state,signature:c.signature,...c.offeringId?{offeringId:c.offeringId}:{}}),e.close())},children:r.jsxs(mt,{className:"max-h-[85vh] overflow-y-auto sm:max-w-lg","aria-describedby":void 0,children:[r.jsx(qt,{children:r.jsx(gt,{children:e.title})}),r.jsx("div",{className:"space-y-5","aria-label":"添加连接",children:z.map(R=>{const q=Ut(c)&&ze(c?.mode)&&(p??c?.offeringId)!==R.id,O=A||Q||q,Y=Ft(R),W=Y.filter(N=>N.lifecycle==="active"),te=W.some(tt),J=p===R.id?c:void 0,ce=x?.offeringId===R.id?x.authorization:void 0,re=Y.find(N=>N.id===(ce?.authorizationMethodId??J?.authorizationMethodId))??W.find(Hs),de=ce?.mode??J?.mode??(re?Bt(re):wl(R)),se=x?.offeringId===R.id?x.message:void 0;if(R.lifecycle==="unavailable"&&W.length===0)return r.jsxs("fieldset",{"data-create-offering":R.id,className:"space-y-2 border-t border-border/50 pt-3 first:border-t-0 first:pt-0",children:[r.jsx("legend",{className:"px-1 text-sm font-medium",children:Ae(R)}),r.jsx("p",{className:"text-xs text-muted-foreground",children:R.kind==="oauth-subscription"?"暂不可用:账号订阅需在 Xpod 桌面版中导入本机客户端(如 Codex CLI)的登录态,浏览器中无法完成。":"暂不可用:该接入方式尚未提供可用的连接流程。"})]},R.id);const ue=ce?.mode;return se&&ze(ue)?r.jsxs("fieldset",{"data-create-offering":R.id,disabled:O,className:"space-y-3 border-t border-border/50 pt-3 first:border-t-0 first:pt-0","aria-label":`${Ae(R)}接入操作`,children:[r.jsx("legend",{className:"px-1 text-sm font-medium",children:Ae(R)}),J?.status==="unsupported"?r.jsx("p",{className:"text-sm",children:"当前部署未启用账号授权"}):r.jsx(Qa,{title:"登录未完成",description:se,primaryLabel:"重试登录",onPrimary:()=>j?.(R,ue,re),secondaryLabel:"关闭",onSecondary:()=>{m?.(),e.close()}})]},R.id):Ut(J)&&ze(de)?r.jsxs("fieldset",{"data-create-offering":R.id,disabled:O,className:"space-y-3 border-t border-border/50 pt-3 first:border-t-0 first:pt-0","aria-label":`${Ae(R)}接入操作`,children:[r.jsx("legend",{className:"px-1 text-sm font-medium",children:Ae(R)}),r.jsx(or,{title:"正在连接",detail:de==="authorizationCodeOAuth"?"等待网页授权,请在打开的页面完成登录。":J?.userCode?`验证码:${J.userCode}`:"请在打开的页面完成授权。",providerLabel:re?.label??Ae(R),providerHost:t.name}),r.jsx(G,{variant:"ghost",size:"sm",disabled:A,onClick:()=>{J&&w?.({mode:J.mode,attemptId:J.attemptId,state:J.state,signature:J.signature,...J.offeringId?{offeringId:J.offeringId}:{}}),e.close()},children:"取消连接"})]},R.id):r.jsxs("fieldset",{"data-create-offering":R.id,disabled:O,className:"space-y-3 border-t border-border/50 pt-3 first:border-t-0 first:pt-0","aria-label":`${Ae(R)}接入操作`,children:[r.jsx("legend",{className:"px-1 text-sm font-medium",children:Ae(R)}),te?r.jsx(Kl,{definition:t,offering:R,status:a,createOfferings:[R],initialCreate:!b,credentials:i,initialEditing:b?.offeringId===R.id?b:void 0,onCloseEdit:e.close,onSavingChange:e.setSaving,attempt:J??(c?.mode==="browserAssistedApiKey"?c:void 0),apiKey:h,baseUrl:u,busy:g,disabled:O,onApiKeyChange:v,onBaseUrlChange:U,onBeginApiKey:B,onBeginBrowser:C,onSaveApiKey:I,onDisconnect:F,onUpdateCredential:k,onCreateApiKeyCredential:P},`${R.id}:${b?.id??""}`):null,D&&!se?r.jsx(or,{title:"正在连接",detail:"正在启动授权,请稍候。",providerLabel:Ae(R),providerHost:t.name}):null,se?r.jsx("p",{className:"w-full text-sm text-destructive",children:se}):null]},R.id)})}),K?r.jsx("p",{role:"alert",className:"text-sm text-destructive",children:K}):null]})})}function Je({label:e,disabled:t,onClick:n,children:s}){return r.jsxs(Gt,{children:[r.jsx(Xt,{asChild:!0,children:r.jsx(G,{variant:"ghost",size:"icon",className:"h-7 w-7","aria-label":e,disabled:t,onClick:n,children:s})}),r.jsx(yt,{className:"text-xs",children:e})]})}function Ol({credential:e,label:t,busy:n,disabled:s,dragHandle:i,kindLabel:a,quota:c,onToggle:p,onTest:h,onEdit:u,onDelete:g,deleteAriaLabel:A}){const x=s||n,v=Bl(e.health),U=`${e.enabled?"已启用":"已停用"} · ${Fl(e.health)}`;return r.jsxs("div",{"data-credential-state":e.enabled?"enabled":"disabled",className:Pe("flex flex-wrap items-center gap-x-3 gap-y-2 rounded-[inherit] px-4 py-3 transition-colors",e.enabled?v.row:"bg-muted/40 opacity-70"),children:[i,r.jsxs(Gt,{children:[r.jsx(Xt,{asChild:!0,children:r.jsx("span",{"aria-label":U,className:Pe("h-2 w-2 shrink-0 rounded-full",e.enabled?v.dot:"bg-muted-foreground/40")})}),r.jsx(yt,{className:"text-xs",children:U})]}),r.jsxs("div",{className:"min-w-0 flex-1 basis-24",children:[r.jsx("p",{className:"truncate text-sm font-medium text-foreground",children:t}),a?r.jsx("p",{className:"text-xs text-muted-foreground",children:a}):null,e.maskedHint&&!t.includes(e.maskedHint)?r.jsx("p",{className:"mt-1 truncate font-mono text-xs text-muted-foreground",children:e.maskedHint}):null]}),r.jsx("div",{className:"order-last w-full min-w-0 sm:order-none sm:w-auto sm:max-w-[45%]",role:"group","aria-label":`${nt(e)}额度`,children:c}),r.jsxs("div",{className:"flex shrink-0 items-center gap-1",children:[h?r.jsx(Je,{label:`测试连接 ${t}`,disabled:x,onClick:()=>h(e),children:r.jsx(Ti,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}):null,u?r.jsx(Je,{label:`编辑 ${t}`,disabled:x,onClick:u,children:r.jsx(Xr,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}):null,p?r.jsx(Je,{label:`${e.enabled?"停用":"启用"} ${t}`,disabled:x,onClick:()=>p(e,{enabled:!e.enabled}),children:e.enabled?r.jsx(Gr,{"aria-hidden":"true",className:"h-3.5 w-3.5"}):r.jsx(Yr,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}):null,g?r.jsx(Je,{label:A??`删除 ${t}`,disabled:x,onClick:g,children:r.jsx(On,{"aria-hidden":"true",className:"h-3.5 w-3.5"})}):null]})]})}const Ll="当前浏览器无法访问剪贴板,请允许剪贴板访问后重试。";function Ql(e=1500){const[t,n]=f.useState(!1),s=f.useRef(void 0);f.useEffect(()=>()=>clearTimeout(s.current),[]);const i=f.useCallback(async a=>{if(!navigator.clipboard?.writeText)throw new Error(Ll);await navigator.clipboard.writeText(a),n(!0),clearTimeout(s.current),s.current=setTimeout(()=>n(!1),e)},[e]);return{copied:t,copy:i}}function rt({value:e,label:t,text:n,title:s,variant:i="outline",size:a="sm",disabled:c=!1,className:p,iconClassName:h="h-3.5 w-3.5",copiedIconClassName:u,onError:g}){const{copied:A,copy:x}=Ql(),v=n===void 0,U=A?Tn:xi,B=()=>{(async()=>{try{await x(typeof e=="function"?e():e)}catch(C){g?.(C)}})()};return r.jsxs(G,{type:"button",variant:i,size:a,disabled:c,className:p,"aria-label":`复制 ${t}`,title:s??`复制 ${t}`,onClick:B,children:[r.jsx(U,{"aria-hidden":"true",className:Pe(h,A&&u)}),r.jsx("span",{className:v?"sr-only":"ml-1.5",children:A?"已复制":n??"复制"})]})}function Js({endpoints:e,copy:t=!1,display:n="compact"}){return n==="protocol"?r.jsx("ul",{className:"flex flex-wrap gap-2",children:e.map(s=>{const i=Rl(s.protocol);return r.jsx("li",{children:t?r.jsx(rt,{value:s.baseUrl,label:`${i} 地址`,text:i,variant:"outline",className:"h-7 gap-1.5 px-2 text-[11px] font-normal",iconClassName:"h-3 w-3"}):r.jsx("span",{className:"inline-flex h-7 items-center rounded-md border border-border px-2 text-[11px] text-muted-foreground",children:i})},s.protocol)})}):r.jsx("dl",{className:"space-y-1 text-[11px] text-muted-foreground",children:e.map(s=>{const i=Ul(s.protocol);return r.jsxs("div",{className:"flex min-w-0 items-baseline gap-2",children:[r.jsx("dt",{className:"shrink-0 text-foreground/70",children:i}),r.jsx("dd",{className:"min-w-0 truncate font-mono",title:s.baseUrl,children:n==="full"?s.baseUrl:Pl(s.baseUrl)}),t?r.jsx("dd",{className:"shrink-0",children:r.jsx(rt,{value:s.baseUrl,label:`${i} 地址`,variant:"ghost",className:"h-6 gap-1 px-1.5 text-[11px]",iconClassName:"h-3 w-3"})}):null]},`${s.protocol}:${s.baseUrl}`)})})}function Hl({offering:e,methods:t}){const n=e.endpoints??[],s=Ae(e),i=e.kind?El(e.kind):void 0,a=i&&i!==s?[i]:[];return r.jsxs("section",{className:"space-y-2","aria-labelledby":`offering-${e.id}`,children:[r.jsxs("div",{className:"flex items-start justify-between gap-3",children:[r.jsxs("div",{children:[r.jsx("h4",{id:`offering-${e.id}`,className:"text-sm font-medium text-foreground",children:s}),a.length?r.jsx("div",{className:"mt-1 flex items-center gap-2 text-xs text-muted-foreground",children:a.map(c=>r.jsx("span",{children:c},c))}):null]}),r.jsxs("div",{className:"flex flex-wrap items-center justify-end gap-x-3 gap-y-1 text-xs",children:[r.jsx("span",{className:"text-muted-foreground",children:Il(e,t)}),e.consoleUrl?r.jsx(St,{href:e.consoleUrl,label:"控制台"}):null,e.subscriptionUrl?r.jsx(St,{href:e.subscriptionUrl,label:"订阅与账单"}):null,e.quota?.url?r.jsx(St,{href:e.quota.url,label:"额度与用量"}):null,e.usagePolicyUrl?r.jsx(St,{href:e.usagePolicyUrl,label:"使用政策"}):null]})]}),e.lifecycle==="unavailable"&&!Ft(e).some(c=>c.lifecycle==="active")?r.jsx("p",{className:"text-xs text-muted-foreground",children:e.kind==="oauth-subscription"?"暂不可用:账号订阅需在 Xpod 桌面版中导入本机客户端(如 Codex CLI)的登录态,浏览器中无法完成。":"暂不可用:该接入方式尚未提供可用的连接流程。"}):null,n.length?r.jsx(Js,{endpoints:n}):null]})}function St({href:e,label:t}){return r.jsx("a",{href:e,target:"_blank",rel:"noreferrer",className:"text-primary hover:underline",children:t})}function ql({credentials:e,disabled:t,onMove:n,children:s}){const i=f.useRef(null),a=f.useRef(null),c=f.useRef(void 0),p=f.useRef(void 0),h=f.useRef(null),u=f.useRef(void 0),g=f.useRef(t),[A,x]=f.useState(""),v=t||!n||e.length<2,U=e.map(w=>w.id).join("\0"),B=()=>Array.from(i.current?.querySelectorAll("[data-sortable-credential]")??[]),C=()=>{c.current!==void 0&&cancelAnimationFrame(c.current),p.current!==void 0&&clearTimeout(p.current),c.current=void 0,p.current=void 0;for(const w of B()){for(const m of["transform","transition","zIndex","position","boxShadow","willChange","backgroundColor"])w.style[m]="";delete w.dataset.dragging}},I=()=>{const w=h.current;if(!w)return;h.current=null,C();const m=window.matchMedia?.("(prefers-reduced-motion: reduce)").matches??!1,b=B();for(const D of b){const K=w.get(D.dataset.sortableCredential);if(!K||m)continue;const Q=D.getBoundingClientRect();D.style.transition="none",D.style.transform=`translateY(${K.top-Q.top}px)`}i.current?.getBoundingClientRect(),c.current=requestAnimationFrame(()=>{c.current=void 0;for(const D of b)D.style.transition=m?"none":"transform 160ms ease-out, box-shadow 160ms ease-out",D.style.transform="translateY(0px)";p.current=setTimeout(C,m?0:180)})},F=w=>{const m=a.current;if(m){if(c.current!==void 0&&cancelAnimationFrame(c.current),h.current=new Map(m.rows.map(b=>[b.dataset.sortableCredential,b.getBoundingClientRect()])),u.current=U,w&&m.from!==m.to&&!v){const b=m.rects[m.from],D=m.rects[m.to],K=Math.max(0,m.rects[1].top-m.rects[0].bottom),Q=window.matchMedia?.("(prefers-reduced-motion: reduce)").matches??!1;m.rows.forEach((z,R)=>{const q=R===m.from?m.from<m.to?D.bottom-b.bottom:D.top-b.top:m.from<R&&R<=m.to?-(b.height+K):m.to<=R&&R<m.from?b.height+K:0;z.style.transition=Q?"none":"transform 160ms ease-out",z.style.transform=`translateY(${q}px)`;const O=m.rects[R];h.current.set(z.dataset.sortableCredential,{...O,top:O.top+q,bottom:O.bottom+q})})}a.current=null,m.handle.hasPointerCapture?.(m.pointerId)&&m.handle.releasePointerCapture?.(m.pointerId),w&&!v&&e[m.from]?.id===m.id&&k(m.from,m.to),c.current=requestAnimationFrame(()=>{c.current=void 0,(!w||!g.current)&&I()}),p.current=setTimeout(I,1e4)}},k=(w,m)=>{v||w===m||m<0||m>=e.length||(n?.(w,m),x(`已请求将${nt(e[w])}移至第 ${m+1} 位`))},P=f.useRef({finish:F,settle:I,clearMotion:C});f.useLayoutEffect(()=>{P.current={finish:F,settle:I,clearMotion:C},g.current=t}),f.useLayoutEffect(()=>{a.current&&P.current.finish(!1),h.current&&(u.current!==U||!t)&&P.current.settle()},[U,v,t]),f.useEffect(()=>()=>{const w=a.current;a.current=null,h.current=null,w?.handle.hasPointerCapture?.(w.pointerId)&&w.handle.releasePointerCapture?.(w.pointerId),P.current.clearMotion()},[]);const j=()=>{c.current=void 0;const w=a.current;if(!w)return;const m=w.rects[w.from],b=w.rects.length>1?Math.max(0,w.rects[1].top-w.rects[0].bottom):0;w.rows.forEach((D,K)=>{const Q=K===w.from?w.y-w.startY:w.from<K&&K<=w.to?-(m.height+b):w.to<=K&&K<w.from?m.height+b:0;D.style.transform=`translateY(${Q}px)`})};return r.jsxs("div",{ref:i,className:Pe(e.length>0&&"rounded-xl border border-border/70"),children:[r.jsx("span",{className:"sr-only",role:"status",children:A}),e.map((w,m)=>r.jsx("div",{"data-sortable-credential":w.id,className:"border-b border-border/60 first-of-type:rounded-t-xl last-of-type:rounded-b-xl last:border-b-0",children:s(w,n?r.jsx("button",{type:"button",disabled:v,"aria-label":`拖动排序 ${nt(w)}`,title:e.length<2?"至少添加两条连接后可拖动排序":"拖动调整优先级,或使用方向键、Home / End 排序",className:"flex h-8 w-6 shrink-0 touch-none select-none items-center justify-center rounded text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary disabled:opacity-40 enabled:cursor-grab active:cursor-grabbing",onKeyDown:b=>{if(b.key==="Escape"){F(!1);return}const D=b.key==="ArrowUp"?m-1:b.key==="ArrowDown"?m+1:b.key==="Home"?0:b.key==="End"?e.length-1:void 0;D!==void 0&&(b.preventDefault(),k(m,D))},onPointerDown:b=>{if(v||b.button!==0||a.current)return;b.preventDefault(),h.current=null,C(),b.currentTarget.focus(),b.currentTarget.setPointerCapture?.(b.pointerId);const D=B(),K=window.matchMedia?.("(prefers-reduced-motion: reduce)").matches??!1;a.current={id:w.id,from:m,to:m,pointerId:b.pointerId,startY:b.clientY,y:b.clientY,handle:b.currentTarget,rows:D,rects:D.map(Q=>Q.getBoundingClientRect())};for(const[Q,z]of D.entries())z.style.willChange="transform",z.style.transition=K||Q===m?"none":"transform 160ms ease-out",Q===m&&(z.dataset.dragging="true",z.style.position="relative",z.style.zIndex="10",z.style.boxShadow="0 8px 24px rgb(0 0 0 / 0.18)",z.style.backgroundColor="hsl(var(--card))")},onPointerMove:b=>{const D=a.current;if(!D||D.pointerId!==b.pointerId||v)return;D.y=b.clientY;let K=1/0;D.rects.forEach((Q,z)=>{const R=Math.abs(b.clientY-(Q.top+Q.bottom)/2);R<K&&(K=R,D.to=z)}),c.current===void 0&&(c.current=requestAnimationFrame(j))},onPointerUp:b=>{a.current?.pointerId===b.pointerId&&F(!0)},onPointerCancel:b=>{a.current?.pointerId===b.pointerId&&F(!1)},onLostPointerCapture:b=>{a.current?.pointerId===b.pointerId&&F(!1)},children:r.jsx(Fi,{"aria-hidden":"true",className:"h-4 w-4"})}):null)},w.id))]})}function Vl({attempt:e,onDismissError:t,onBeginOffering:n,onBeginBrowser:s,onCreateLocalCredential:i}){const[a,c]=f.useState(!1),[p,h]=f.useState(),[u,g]=f.useState(),[A,x]=f.useState(),[v,U]=f.useState(!1),B=a||!!p||!!u,C=f.useCallback(()=>{c(!1),g(void 0),h(void 0),x(void 0)},[]),I=f.useRef(e);f.useEffect(()=>{const b=I.current;I.current=e,B&&e!==b&&e?.status==="completed"&&C()},[e,B,C]);const F=f.useCallback(()=>{x(void 0),t?.()},[t]),k=f.useCallback(()=>{F(),c(!0)},[F]),P=f.useCallback(()=>{F(),s()},[F,s]),j=f.useCallback((b,D,K)=>{F(),g(b.id),n?.(b,D,K)},[F,n]),w=f.useCallback(async(b,D)=>{if(i){F(),U(!0);try{await i(b,D)}catch(K){x(K instanceof Error?K.message:"连接失败,请重试")}finally{U(!1)}}},[F,i]),m=f.useCallback(b=>{h(b)},[]);return{open:B,title:p?"编辑连接":u?"连接账号":"新建连接",...p?{editing:p}:{},...u?{authorizationOfferingId:u}:{},...A?{error:A}:{},saving:v,beginApiKey:k,beginEdit:m,beginAuthorization:j,beginBrowser:P,beginLocal:w,setSaving:U,close:C}}function zl({definition:e,product:t,status:n,accountLabel:s,attempt:i,attemptOfferingId:a,apiKey:c,baseUrl:p="",busy:h,disabled:u=!1,error:g,suppressError:A=!1,quotas:x={},onApiKeyChange:v,onBaseUrlChange:U,onBeginApiKey:B,onBeginOffering:C,onCancelConnect:I,onBeginBrowser:F,onSaveApiKey:k,onDisconnect:P,onCreateApiKeyCredential:j,onCreateLocalCredential:w,onUpdateCredential:m,onDeleteCredential:b,onTestCredential:D,onReorderCredentials:K,onRefreshQuota:Q,onDismissError:z}){const R=[{id:"api-platform",label:"API Key",kind:"api-platform",authModes:["apiKey"]}],q=t?.credentials??[],O=t?.offerings.length?t.offerings:R,Y=O.map(d=>({offering:d,methods:Ft(d)})),W=Y.filter(d=>d.methods.some(M=>M.lifecycle==="active"&&tt(M))).map(d=>d.offering),te=Y.flatMap(d=>d.methods).find(d=>tt(d)&&!ot(d)&&d.lifecycle==="active"&&d.label)??Y.flatMap(d=>d.methods).find(d=>tt(d)&&!ot(d)&&d.label),J=Y.flatMap(d=>d.methods.filter(M=>M.label&&(Hs(M)||_n(M))).map(M=>({offering:d.offering,method:M}))),ce=Y.flatMap(d=>d.methods).find(d=>ot(d)&&d.lifecycle==="active"&&d.label)??Y.flatMap(d=>d.methods).find(d=>ot(d)&&d.label),re=ce?.label&&!J.some(d=>d.method.label===ce.label)?ce:void 0,de=[...J.map(d=>({key:`${d.offering.id}:${d.method.id}`,rank:dn(d.method),authorization:d})),...re?[{key:"console-login",rank:dn(re),consoleMethod:re}]:[],...te?[{key:"api-key",rank:dn(te),apiKeyMethod:te}]:[]].sort((d,M)=>d.rank-M.rank),se=Ut(i)&&ze(i?.mode),ue=[...q].sort((d,M)=>d.priority-M.priority),N=q.some(d=>x[d.id]?.busy),l=Vl({attempt:i,onDismissError:z,onBeginOffering:C,onBeginBrowser:F,onCreateLocalCredential:w});return r.jsx(xt,{children:r.jsxs("section",{className:"space-y-3","aria-label":"当前连接",children:[r.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[r.jsxs("h3",{className:"flex items-center gap-2 text-sm font-medium text-foreground/90",children:[r.jsx(Zr,{"aria-hidden":"true",className:"h-4 w-4 text-primary"}),"当前连接"]}),r.jsxs("div",{"data-testid":"provider-connect-actions",className:"flex flex-wrap items-center justify-end gap-2",children:[q.length>1?r.jsx(G,{variant:"ghost",size:"sm","aria-label":`刷新全部 ${e.name}额度`,disabled:u||N||!q.some(d=>d.enabled)||!Q,onClick:()=>O.forEach(d=>Q?.(d)),children:N?"查询中":"刷新全部额度"}):null,de.map(d=>"authorization"in d?r.jsx("fieldset",{className:"m-0 min-w-0 border-0 p-0","aria-label":`${Ae(d.authorization.offering)}快捷接入`,children:r.jsx(Sl,{methods:[d.authorization.method],offering:d.authorization.offering,busy:h||l.saving,disabled:u||se,onBeginOffering:C?l.beginAuthorization:void 0,onCreateLocalCredential:w?l.beginLocal:void 0})},d.key):"consoleMethod"in d?r.jsxs(G,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",title:d.consoleMethod.lifecycle==="unavailable"?d.consoleMethod.reason:void 0,disabled:h||l.saving||u||se||d.consoleMethod.lifecycle==="unavailable",onClick:l.beginBrowser,children:[r.jsx(zt,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),d.consoleMethod.label]},d.key):r.jsxs(G,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs","aria-label":"新建 API Key 连接",title:d.apiKeyMethod.lifecycle==="unavailable"?d.apiKeyMethod.reason:void 0,disabled:h||l.saving||u||se||d.apiKeyMethod.lifecycle==="unavailable"||!t&&n==="pending"&&!i,onClick:l.beginApiKey,children:[r.jsx(at,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),d.apiKeyMethod.label]},d.key))]})]}),r.jsxs("div",{"aria-label":"凭据列表",className:"space-y-2",children:[r.jsx(ql,{credentials:ue,disabled:h||u,onMove:K?(d,M)=>{const L=O.find($=>$.id===ue[d]?.offeringId);L&&K(L,ue,d,M)}:void 0,children:(d,M)=>{const L=O.find(oe=>oe.id===d.offeringId);if(!L)return null;const $=d.authMode==="apiKey"?nt(d):d.label?vr(d.label):nt(d),Ce=x[d.id],ve=Ce?.credentialId===d.id?Ce:void 0;return r.jsx(Ol,{credential:d,label:$,dragHandle:M,kindLabel:d.authMode==="apiKey"?"API Key":Ae(L),busy:h,disabled:u,onToggle:m?(oe,Fe)=>{m(oe,Fe).catch(()=>{})}:void 0,onTest:D,onEdit:d.authMode==="apiKey"?()=>l.beginEdit(d):void 0,onDelete:()=>d.authMode==="apiKey"?b?.(d):P(d),deleteAriaLabel:d.authMode==="apiKey"?`删除 ${$}`:`${$} 移除`,quota:r.jsx(Dl,{compact:!0,providerName:e.name,offeringName:Ae(L),credentialLabel:nt(d),multiple:q.length>1,quota:ve?.quota,busy:ve?.busy??!1,error:ve?.error,paused:!d.enabled,disabled:u||!Q,onRefresh:()=>Q?.(L,d)})})}}),q.length?null:r.jsx("p",{className:"flex items-center gap-2 py-6 text-sm text-muted-foreground",children:s?vr(s):"尚未添加连接"}),q.length===0&&(n==="configured"||n==="connected")?r.jsx(G,{variant:"ghost",size:"sm",disabled:h||u,onClick:()=>P(),children:n==="configured"?"移除配置":"断开连接"}):null]}),r.jsx(Tl,{controller:l,definition:e,offerings:O,apiOfferings:W,credentials:q,status:n,attempt:i,attemptOfferingId:a,apiKey:c,baseUrl:p,busy:h,disabled:u,error:g,onApiKeyChange:v,onBaseUrlChange:U,onBeginApiKey:B,onBeginBrowser:F,onSaveApiKey:k,onDisconnect:P,onUpdateCredential:m,onCreateApiKeyCredential:j,onBeginOffering:C,onCancelConnect:I,onDismissError:z}),r.jsxs("details",{className:"text-xs text-muted-foreground",children:[r.jsx("summary",{className:"w-fit cursor-pointer",children:"接入信息"}),r.jsx("div",{className:"mt-2 space-y-3",children:O.map(d=>r.jsx(Hl,{offering:d},d.id))})]}),l.error&&!l.open&&l.error!==g?.message?r.jsx("p",{role:"alert",className:"text-sm text-destructive",children:l.error}):null,g&&(g.offeringId?!l.open:!A)?r.jsx("p",{role:"alert",className:"text-sm text-destructive",children:g.message}):null]})})}const Gs={image:{icon:zr,label:"视觉识别",className:"text-green-500"},pdf:{icon:Ii,label:"文档输入",className:"text-teal-500"},audio:{icon:di,label:"音频输入",className:"text-cyan-500"},video:{icon:Wi,label:"视频输入",className:"text-indigo-500"},web:{icon:Vr,label:"联网搜索",className:"text-blue-500"},tool_call:{icon:At,label:"函数调用",className:"text-orange-500"},reasoning:{icon:qr,label:"推理",className:"text-purple-500"},embedding:{icon:hi,label:"向量模型",className:"text-sky-500"},fast:{icon:eo,label:"快速模型",className:"text-amber-500"}};function Xs(e){return Object.prototype.hasOwnProperty.call(Gs,e)}function Jl({type:e}){if(!Xs(e))return null;const t=Gs[e],n=t.icon;return r.jsx(xt,{children:r.jsxs(Gt,{children:[r.jsx(Xt,{asChild:!0,children:r.jsx("button",{type:"button","aria-label":t.label,className:"flex cursor-help items-center justify-center rounded-sm opacity-80 transition-opacity hover:opacity-100 focus:outline-none focus-visible:opacity-100",children:r.jsx(n,{"aria-hidden":"true",className:Pe("h-3.5 w-3.5",t.className)})})}),r.jsx(yt,{children:t.label})]})})}function Ys(e){return[...new Set([...(e.inputModalities??[]).filter(t=>t!=="text"),...e.capabilities??[]])].filter(Xs)}function pt(e){const t=e.id.lastIndexOf("#");return t>=0?e.id.slice(t+1):e.id}function jn(e){const t=pt(e);return t===e.id?e:{...e,id:t}}function Gl({enabled:e,disabled:t=!1,label:n,onToggle:s}){return r.jsx(Je,{label:`${e?"停用":"启用"} ${n}`,disabled:t,onClick:s,children:e?r.jsx(Gr,{"aria-hidden":"true",className:"h-3.5 w-3.5"}):r.jsx(Yr,{"aria-hidden":"true",className:"h-3.5 w-3.5"})})}function Ws({value:e,onChange:t}){return r.jsxs("div",{className:"relative w-full sm:w-auto",children:[r.jsx(Wr,{"aria-hidden":"true",className:"absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground"}),r.jsx(ye,{value:e,onChange:n=>t(n.target.value),placeholder:"搜索模型...",className:"h-8 w-full bg-background pl-8 text-xs sm:w-[232px]",autoComplete:"off","data-lpignore":"true","data-1p-ignore":!0})]})}function dt({tone:e,children:t}){return r.jsx("div",{className:"flex items-center gap-2 py-6 text-sm text-muted-foreground",children:e==="destructive"?r.jsx("p",{className:"text-destructive",children:t}):t})}function Zs({label:e,modelId:t,iconTokens:n=[],enabled:s,toggleDisabled:i=!1,onToggle:a,onEdit:c,onDelete:p,unavailable:h=!1,badges:u}){const g=!!(a||c||p);return r.jsx(Xl,{label:e,modelId:t,iconTokens:n,selected:s,unavailable:h,badges:u,actions:g?r.jsxs("div",{className:"flex shrink-0 items-center gap-1",children:[c?r.jsx(Je,{label:`编辑 ${e}`,disabled:i,onClick:c,children:r.jsx(Xr,{"aria-hidden":"true",className:"h-3.5 w-3.5 text-muted-foreground"})}):null,a?r.jsx(Gl,{enabled:s,disabled:i,label:e,onToggle:a}):null,p?r.jsx(Je,{label:`删除 ${e}`,disabled:i,onClick:p,children:r.jsx(On,{"aria-hidden":"true",className:"h-3.5 w-3.5 text-muted-foreground"})}):null]}):void 0})}function Xl({label:e,modelId:t,iconTokens:n=[],badges:s,leading:i,actions:a,selected:c=!1,unavailable:p=!1}){return r.jsxs("div",{className:Pe("group flex items-center gap-3 rounded-lg border bg-card p-3 transition-all duration-200 hover:border-border/60 hover:bg-accent/30",c?"border-primary/40 bg-primary/[0.03]":"border-border/40",p&&"opacity-75"),children:[i,r.jsx("div",{className:"shrink-0 rounded bg-muted/50 p-2 text-muted-foreground transition-colors group-hover:text-primary",children:r.jsx(At,{"aria-hidden":"true",className:"h-4 w-4"})}),r.jsxs("div",{className:"min-w-0 flex-1",children:[r.jsxs("div",{className:"flex items-center gap-2",children:[r.jsx("span",{className:"truncate text-sm font-medium text-foreground/90",children:e}),r.jsx("div",{className:"flex items-center gap-1",children:n.map(h=>r.jsx(Jl,{type:h},h))}),s]}),t&&t!==e?r.jsxs("div",{className:"mt-0.5 flex items-center gap-1.5",children:[r.jsx("code",{className:"max-w-[300px] truncate font-mono text-[10px] text-muted-foreground opacity-70",children:t}),r.jsx(rt,{value:t,label:`${e} ID`,title:"复制 ID",variant:"ghost",size:"icon",className:"h-4 w-4 rounded p-0.5 text-muted-foreground opacity-0 transition-opacity hover:bg-muted hover:text-foreground group-hover:opacity-100 group-focus-within:opacity-100 focus:opacity-100",iconClassName:"h-3 w-3",copiedIconClassName:"text-primary"})]}):null]}),a]})}function Yl({definition:e,product:t,status:n,accountLabel:s,attempt:i,attemptOfferingId:a,apiKey:c,baseUrl:p="",busy:h,disabled:u=!1,error:g,quotas:A,models:x,verifyPending:v=!1,onApiKeyChange:U,onBaseUrlChange:B,onBeginApiKey:C,onBeginOffering:I,onCancelConnect:F,onBeginBrowser:k,onSaveApiKey:P,onDisconnect:j,onCreateApiKeyCredential:w,onCreateLocalCredential:m,onUpdateCredential:b,onDeleteCredential:D,onTestCredential:K,onReorderCredentials:Q,onRefreshQuota:z,onVerify:R,onAddModel:q,onEditModel:O,onDeleteModel:Y,selectedModelIds:W,modelSelectionStatus:te,onModelSelectionChange:J,onDismissError:ce}){const re=n==="configured",de=n==="connected",se=x.length===0&&g?.message&&!g.offeringId?g.message:void 0,[ue,N]=f.useState(""),[l,d]=f.useState(W??[]),M=W??l,L=f.useMemo(()=>Zl(x),[x]),$=ee=>ee.selectionIds.some(fe=>M.includes(fe)),Ce=f.useMemo(()=>{const ee=ue.trim().toLocaleLowerCase();return ee?L.filter(fe=>fe.searchText.includes(ee)):L},[L,ue]),ve=L.filter($).length,oe=L.filter(ee=>ee.availability==="unavailable").length,Fe=ee=>{const fe=new Set(M),Be=$(ee);for(const le of Be?ee.selectionIds:ee.availableSelectionIds)Be?fe.delete(le):fe.add(le);const ge=[...fe];W===void 0&&d(ge),J?.(e.id,ge)};return r.jsx(xt,{children:r.jsxs("div",{className:"space-y-8",children:[r.jsx(Vs,{name:e.name,mark:Wl(e.id),avatar:Ot(e.id),avatarBackground:wn(e.id),infoLabel:"提供商说明",infoLines:[e.description,"Provider 凭证保存在当前 Pod,由 Pod 权限保护。"],link:{href:e.homeUrl,label:"访问官网"},badge:r.jsx(Ge,{variant:de||re?"default":"secondary",children:_l(n)})}),r.jsx(zl,{definition:e,product:t,status:n,accountLabel:s,attempt:i,attemptOfferingId:a,apiKey:c,baseUrl:p,busy:h,disabled:u,error:g,suppressError:!!se,quotas:A,onApiKeyChange:U,onBaseUrlChange:B,onBeginApiKey:C,onBeginOffering:I,onCancelConnect:F,onBeginBrowser:k,onSaveApiKey:P,onDisconnect:j,onCreateApiKeyCredential:t?.offerings.length?w:void 0,onCreateLocalCredential:t?.offerings.length?m:void 0,onUpdateCredential:b,onDeleteCredential:D,onTestCredential:K,onReorderCredentials:Q,onRefreshQuota:z,onDismissError:ce}),r.jsxs("section",{className:"space-y-8",children:[r.jsxs("div",{"data-testid":"provider-models-header",className:"flex flex-wrap items-center justify-between gap-2",children:[r.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1",children:[r.jsxs("h3",{className:"flex items-center gap-2 text-sm font-medium text-foreground/90",children:[r.jsx(At,{"aria-hidden":"true",className:"h-4 w-4 text-primary"}),"可用模型"]}),r.jsxs("span",{className:"text-xs text-muted-foreground",children:["共 ",L.length," · 已加入 ",ve," · 已失效 ",oe]}),te==="saving"?r.jsxs("span",{role:"status","aria-live":"polite","aria-atomic":"true",className:"inline-flex items-center gap-1 text-xs text-muted-foreground",children:[r.jsx(Me,{"aria-hidden":"true",className:"h-3 w-3 animate-spin motion-reduce:animate-none"}),"保存中…"]}):null,te==="saved"?r.jsxs("span",{role:"status","aria-live":"polite","aria-atomic":"true",className:"inline-flex items-center gap-1 text-xs text-muted-foreground",children:[r.jsx(Tn,{"aria-hidden":"true",className:"h-3 w-3"}),"已保存"]}):null]}),r.jsxs("div",{"data-testid":"provider-models-actions",className:"flex w-full flex-wrap items-center gap-2 sm:w-auto sm:flex-nowrap sm:justify-end",children:[(re||de)&&(R||q)?r.jsxs(r.Fragment,{children:[q?r.jsxs(G,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",disabled:u||h,onClick:q,children:[r.jsx(at,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),"添加模型"]}):null,R&&x.length>0?r.jsxs(G,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",disabled:u||h||v,onClick:R,children:[v?r.jsx(Me,{"aria-hidden":"true",className:"h-3.5 w-3.5 animate-spin"}):r.jsx(An,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),v?"同步中...":"刷新模型"]}):R?r.jsxs(G,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs",disabled:u||h||v,onClick:R,children:[v?r.jsx(Me,{"aria-hidden":"true",className:"h-3.5 w-3.5 animate-spin"}):r.jsx(An,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),v?"同步中...":"同步模型"]}):null]}):null,r.jsx(Ws,{value:ue,onChange:N})]})]}),x.length===0?r.jsx(dt,{tone:se?"destructive":void 0,children:se??"暂无可用模型"}):Ce.length===0?r.jsx(dt,{children:"未找到匹配的模型"}):r.jsx("div",{className:"grid gap-2",children:Ce.map(ee=>{const fe=_s(ee),Be=$(ee),ge=ee.availability==="unavailable",le=ee.displayName??ee.id,X=Ys(ee);return r.jsx(Zs,{label:le,modelId:ee.id,iconTokens:X,enabled:Be,toggleDisabled:u||h||ge&&!Be,onToggle:()=>Fe(ee),onEdit:ee.custom&&O?()=>O(ee):void 0,onDelete:ee.custom&&Y?()=>Y(ee):void 0,unavailable:ge,badges:r.jsxs(r.Fragment,{children:[ee.custom?r.jsx(Ge,{variant:"outline",className:"shrink-0 text-[10px] font-normal",children:"手工"}):null,ge?r.jsx(Ge,{variant:"destructive",className:"shrink-0 text-[10px] font-normal",children:"已失效"}):null]})},fe)})})]})]})})}function Wl(e){switch(e){case"openai":return"OA";case"anthropic":return"A";case"kimi":return"K";case"bailian":return"百";case"deepseek":return"DS";case"zhipu":return"智";case"ollama":return"O";case"custom":return"C"}}function _s(e){return e.resourceId??(e.offeringId?`${e.offeringId}:${e.id}`:e.id)}function Zl(e){const t=new Map;for(const n of e){const s=`${n.provider}\0${n.id}`,i=_s(n),a=t.get(s),c=[n.id,n.displayName].filter(Boolean).join(`
4
- `).toLocaleLowerCase();if(!a){t.set(s,{...n,selectionIds:[i],availableSelectionIds:n.availability==="unavailable"?[]:[i],searchText:c});continue}a.selectionIds.includes(i)||a.selectionIds.push(i),n.availability!=="unavailable"&&!a.availableSelectionIds.includes(i)&&a.availableSelectionIds.push(i),n.availability!=="unavailable"&&(a.availability=n.availability),a.capabilities=[...new Set([...a.capabilities??[],...n.capabilities??[]])],a.inputModalities=[...new Set([...a.inputModalities??[],...n.inputModalities??[]])],a.searchText+=`
5
- ${c}`}return[...t.values()]}function _l(e){switch(e){case"pending":return"连接中";case"configured":return"已配置";case"connected":return"已连接";case"disconnected":return"未设置";case"reauthRequired":return"需要重新登录";case"failed":return"连接失败";default:return"未检查"}}const $l=[{id:"image",label:"视觉识别",icon:zr}],eu=[{id:"tool_call",label:"函数调用",icon:At},{id:"reasoning",label:"推理",icon:qr},{id:"web",label:"联网搜索",icon:Vr}];function tu({open:e,providerName:t,initialValue:n,error:s,saving:i=!1,onOpenChange:a,onSave:c}){const p=!!n,[h,u]=f.useState(""),[g,A]=f.useState(""),[x,v]=f.useState([]),[U,B]=f.useState([]);f.useEffect(()=>{e&&(u(n?.id??""),A(n?.name??""),v(n?.inputModalities??[]),B(n?.capabilities??[]))},[n,e]);const C=h.trim(),I=!!C&&!i,F=(P,j,w)=>{j(P.includes(w)?P.filter(m=>m!==w):[...P,w])},k=(P,j,w)=>{const m=j.includes(P.id),b=P.icon;return r.jsxs("button",{type:"button","aria-pressed":m,disabled:i,onClick:()=>F(j,w,P.id),className:Pe("flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs transition-colors",m?"border-primary/50 bg-primary/10 text-primary":"border-border/60 text-muted-foreground hover:border-border hover:text-foreground"),children:[r.jsx(b,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),P.label]},P.id)};return r.jsx(ht,{open:e,onOpenChange:a,children:r.jsxs(mt,{className:"max-w-md",children:[r.jsx(qt,{children:r.jsxs(gt,{children:[p?"编辑模型":"添加模型"," · ",t]})}),r.jsxs("div",{className:"flex flex-col gap-4 py-2",children:[r.jsxs("div",{className:"flex flex-col gap-2",children:[r.jsx(Oe,{htmlFor:"ai-model-id",children:"模型 ID"}),r.jsx(ye,{id:"ai-model-id",value:h,disabled:p||i,placeholder:"例如 gpt-4o-mini",onChange:P=>u(P.target.value)})]}),r.jsxs("div",{className:"flex flex-col gap-2",children:[r.jsx(Oe,{htmlFor:"ai-model-name",children:"显示名称"}),r.jsx(ye,{id:"ai-model-name",value:g,disabled:i,placeholder:"留空则使用模型 ID",onChange:P=>A(P.target.value)})]}),r.jsxs("div",{className:"flex flex-col gap-2",children:[r.jsx(Oe,{children:"输入模态"}),r.jsx("div",{className:"flex flex-wrap gap-2",children:$l.map(P=>k(P,x,v))})]}),r.jsxs("div",{className:"flex flex-col gap-2",children:[r.jsx(Oe,{children:"能力标记"}),r.jsx("div",{className:"flex flex-wrap gap-2",children:eu.map(P=>k(P,U,B))})]}),s?r.jsx("p",{className:"text-xs text-destructive",role:"alert",children:s}):null]}),r.jsxs(Kt,{children:[r.jsx(G,{variant:"outline",disabled:i,onClick:()=>a(!1),children:"取消"}),r.jsx(G,{disabled:!I,onClick:()=>c({id:C,name:g.trim(),inputModalities:x,capabilities:U}),children:i?"保存中...":"保存"})]})]})})}const nu="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20800%20800%22%3E%3Crect%20width%3D%22800%22%20height%3D%22800%22%20rx%3D%22120%22%20fill%3D%22%2309090b%22%2F%3E%3Cpath%20fill%3D%22%23fff%22%20fill-rule%3D%22evenodd%22%20d%3D%22%20M165.29%20165.29%20H517.36%20V400%20H400%20V517.36%20H282.65%20V634.72%20H165.29%20Z%20M282.65%20282.65%20V400%20H400%20V282.65%20Z%20%22%2F%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M517.36%20400%20H634.72%20V634.72%20H517.36%20Z%22%2F%3E%3C%2Fsvg%3E",ru="data:image/svg+xml,%3Csvg%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%220%200%2040%2040%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20clip-path%3D%22url(%23clip0_5110_14771)%22%3E%3Crect%20width%3D%2240%22%20height%3D%2240%22%20rx%3D%2220%22%20fill%3D%22url(%23paint0_linear_5110_14771)%22%2F%3E%3Cg%20filter%3D%22url(%23filter0_f_5110_14771)%22%3E%3Ccircle%20cx%3D%2212.6071%22%20cy%3D%2234.9794%22%20r%3D%2214.081%22%20fill%3D%22%2332E6B9%22%20fill-opacity%3D%220.4%22%2F%3E%3C%2Fg%3E%3Cg%20filter%3D%22url(%23filter1_f_5110_14771)%22%3E%3Ccircle%20cx%3D%2233.3404%22%20cy%3D%2243.6185%22%20r%3D%2212.8704%22%20fill%3D%22%2332E6B9%22%2F%3E%3C%2Fg%3E%3Cpath%20d%3D%22M27.6897%203.3426C28.057%203.01322%2028.0795%202.99983%2028.3485%202.98366C28.7851%202.95177%2029.1858%203.16107%2029.8664%203.78072C31.4566%205.22574%2033.6703%208.19724%2035.047%2010.7343L35.5796%2011.7191L36.3309%2012.0927C37.0562%2012.4593%2038.2459%2013.2111%2038.7428%2013.614C38.9673%2013.7997%2038.9992%2013.8032%2039.2326%2013.7124C40.2872%2013.3017%2041.7982%2013.846%2043.1307%2015.1244C44.3302%2016.274%2045.479%2018.2384%2045.9191%2019.8778C45.9833%2020.1417%2046.0683%2020.709%2046.0994%2021.1314C46.1997%2022.6144%2045.7243%2023.7986%2044.8085%2024.3349C44.6213%2024.443%2044.6085%2024.4725%2044.6137%2024.939C44.6559%2027.1604%2044.0571%2029.3777%2042.8543%2031.54C41.4965%2033.9678%2039.0794%2036.4798%2035.8073%2038.846C34.0502%2040.1247%2029.8918%2042.5469%2028.0122%2043.3973C23.5096%2045.4244%2019.8999%2046.2022%2016.7645%2045.8181C14.8943%2045.5915%2012.7771%2044.8611%2011.5246%2044.0137C11.1951%2043.786%2011.1428%2043.7719%2010.8909%2043.8439C9.55017%2044.2289%207.79442%2043.4374%206.30272%2041.7817C5.70771%2041.1197%204.74709%2039.4939%204.43575%2038.6241C3.71569%2036.5887%203.85859%2034.752%204.81783%2033.6551C5.0657%2033.3725%205.07387%2033.3607%205.01972%2032.8856C4.93033%2032.1079%204.88982%2030.9566%204.93066%2030.2138L4.96343%2029.5205L3.92091%2027.6777C2.3078%2024.8074%201.28326%2022.3968%200.887982%2020.5554C0.679402%2019.546%200.692781%2019.0981%200.949061%2018.7667C1.10529%2018.5666%201.61622%2018.3594%202.23252%2018.2455C3.78518%2017.9729%207.17203%2018.2198%2010.9394%2018.885L11.3303%2018.9525L12.1903%2018.1921C13.6179%2016.9275%2014.5665%2016.2176%2016.315%2015.1274C18.1373%2013.9872%2020.1943%2013.0498%2022.5103%2012.3071L23.2533%2012.0687L23.6615%2010.9964C25.1239%207.13587%2026.6218%204.28969%2027.6897%203.3426ZM15.4393%2023.1261C13.7864%2024.0804%2012.9602%2024.5582%2012.3529%2025.093C9.89364%2027.2585%208.9738%2030.6888%2010.0208%2033.7938C10.2794%2034.5606%2010.7568%2035.387%2011.7111%2037.0398C12.6653%2038.6926%2013.1424%2039.5194%2013.6771%2040.1267C15.8426%2042.5859%2019.2732%2043.5045%2022.3783%2042.4574C23.145%2042.1989%2023.972%2041.7223%2025.6248%2040.768L35.1333%2035.2783C36.7862%2034.324%2037.6124%2033.8462%2038.2196%2033.3114C40.6789%2031.1459%2041.5988%2027.7156%2040.5518%2024.6105C40.2932%2023.8438%2039.8157%2023.0174%2038.8615%2021.3646C37.9072%2019.7117%2037.4302%2018.885%2036.8955%2018.2777C34.7299%2015.8185%2031.2993%2014.8999%2028.1943%2015.947C27.4275%2016.2055%2026.6006%2016.6821%2024.9478%2017.6364L15.4393%2023.1261Z%22%20fill%3D%22url(%23paint1_linear_5110_14771)%22%2F%3E%3Crect%20x%3D%2215.8816%22%20y%3D%2230.0273%22%20width%3D%224.00904%22%20height%3D%228.32646%22%20rx%3D%222.00452%22%20transform%3D%22rotate(-30%2015.8816%2030.0273)%22%20fill%3D%22white%22%2F%3E%3Crect%20x%3D%2226.6978%22%20y%3D%2223.7812%22%20width%3D%224.00904%22%20height%3D%228.32646%22%20rx%3D%222.00452%22%20transform%3D%22rotate(-30%2026.6978%2023.7812)%22%20fill%3D%22white%22%2F%3E%3C%2Fg%3E%3Cdefs%3E%3Cfilter%20id%3D%22filter0_f_5110_14771%22%20x%3D%22-14.9163%22%20y%3D%227.45599%22%20width%3D%2255.0468%22%20height%3D%2255.047%22%20filterUnits%3D%22userSpaceOnUse%22%20color-interpolation-filters%3D%22sRGB%22%3E%3CfeFlood%20flood-opacity%3D%220%22%20result%3D%22BackgroundImageFix%22%2F%3E%3CfeBlend%20mode%3D%22normal%22%20in%3D%22SourceGraphic%22%20in2%3D%22BackgroundImageFix%22%20result%3D%22shape%22%2F%3E%3CfeGaussianBlur%20stdDeviation%3D%226.72123%22%20result%3D%22effect1_foregroundBlur_5110_14771%22%2F%3E%3C%2Ffilter%3E%3Cfilter%20id%3D%22filter1_f_5110_14771%22%20x%3D%229.46959%22%20y%3D%2219.7477%22%20width%3D%2247.7417%22%20height%3D%2247.741%22%20filterUnits%3D%22userSpaceOnUse%22%20color-interpolation-filters%3D%22sRGB%22%3E%3CfeFlood%20flood-opacity%3D%220%22%20result%3D%22BackgroundImageFix%22%2F%3E%3CfeBlend%20mode%3D%22normal%22%20in%3D%22SourceGraphic%22%20in2%3D%22BackgroundImageFix%22%20result%3D%22shape%22%2F%3E%3CfeGaussianBlur%20stdDeviation%3D%225.50019%22%20result%3D%22effect1_foregroundBlur_5110_14771%22%2F%3E%3C%2Ffilter%3E%3ClinearGradient%20id%3D%22paint0_linear_5110_14771%22%20x1%3D%2220%22%20y1%3D%220%22%20x2%3D%2220%22%20y2%3D%2240%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20stop-color%3D%22%236C4DFF%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23583ED3%22%2F%3E%3C%2FlinearGradient%3E%3ClinearGradient%20id%3D%22paint1_linear_5110_14771%22%20x1%3D%2214.639%22%20y1%3D%2210.7917%22%20x2%3D%2232.1712%22%20y2%3D%2241.1585%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20stop-color%3D%22white%22%20stop-opacity%3D%220.8%22%2F%3E%3Cstop%20offset%3D%220.437689%22%20stop-color%3D%22white%22%2F%3E%3C%2FlinearGradient%3E%3CclipPath%20id%3D%22clip0_5110_14771%22%3E%3Crect%20width%3D%2240%22%20height%3D%2240%22%20rx%3D%2220%22%20fill%3D%22white%22%2F%3E%3C%2FclipPath%3E%3C%2Fdefs%3E%3C%2Fsvg%3E",su={codex:Ot("openai"),"claude-code":Ot("anthropic"),pi:nu,codebuddy:ru};function au(e){return su[e]}function kn(e){const t=e.trim().replace(/\/+$/,"");return t.endsWith("/v1")?t:`${t}/v1`}function $s(e){return e.trim().replace(/\/+$/,"").replace(/\/v1$/,"")}const Lt=["codex","claude-code","pi","codebuddy"],Se={codex:"Codex","claude-code":"Claude Code",pi:"Pi",codebuddy:"CodeBuddy"};function ea({client:e,className:t="h-4 w-4"}){const n=au(e);return n?r.jsx("img",{src:n,alt:"","aria-hidden":"true",className:`${t} shrink-0 rounded-[3px] object-cover`}):r.jsx(Gi,{className:t,"aria-hidden":"true"})}function iu({bridge:e,endpoint:t,client:n,createClientCredential:s,manualApiKey:i,autoApply:a=!1,compact:c=!1,onComplete:p}){const[h,u]=f.useState({status:"notConfigured"}),[g,A]=f.useState([]),[x,v]=f.useState(),[U,B]=f.useState(""),[C,I]=f.useState(!1),F=f.useRef(!1),[k,P]=f.useState("create"),j=f.useRef(void 0);f.useEffect(()=>{if(v(void 0),B(""),!e){u({status:"unavailable"});return}if(a)return;let O=!0;return(async()=>{let Y;try{Y=await e.inspect(n)}catch(W){Y={status:"unavailable",message:Mt(W)}}O&&u(Y)})(),()=>{O=!1}},[a,e,n]);const w=async O=>{if(!e||!s)return;I(!0);let Y,W=!1;try{Y=j.current,Y||(Y=await s(n),j.current=Y),A([{id:"key",label:"密钥",state:"ok",detail:"本次使用这个 Xpod Key;重试不会新建 Key。"},{id:"write",label:"配置写入",state:"unknown",detail:"正在写入配置…"},{id:"gateway",label:"Gateway 检查",state:"unknown",detail:"本步骤未检查 Xpod 网关。"},{id:"client",label:"客户端验证",state:"unknown",detail:"配置已写入,尚未验证客户端。"}]),await e.apply({client:n,planId:O.planId,apiKey:Y.apiKey,...O.confirmation?.required?{confirmation:{token:O.confirmation.token,targetHash:O.confirmation.targetHash}}:{}}),W=!0,j.current=void 0,A(te=>te.map(J=>J.id==="write"?{...J,state:"ok",detail:"配置已写入;客户端是否已采用仍未验证。"}:J)),u({status:"configured"}),v(void 0),p?.()}catch(te){let J=Mt(te);J==="AI Connection request failed. Please try again."&&(J=`${Se[n]} 配置失败。请重试。`),Y&&!W&&(J=`${J};已保留本次使用的 Xpod Key,重试只会重新写入配置。`),A(ce=>ce.map(re=>re.id==="write"?{...re,state:"failed",detail:J}:re)),u(lu(te)?{status:"failedAndRestored",message:"配置写入失败,已自动恢复原配置。"}:{status:"unavailable",message:J})}finally{I(!1)}},m=async()=>{if(e){I(!0);try{const O=await e.plan({client:n,endpoint:t});a&&!O.confirmation?.required&&s?await w(O):(v(O),B(""))}catch(O){u({status:"unavailable",message:Mt(O)})}finally{I(!1)}}},b=async()=>{!e||!x||!s||await w(x)};f.useEffect(()=>{!a||!e||!s||F.current||(F.current=!0,m())},[a,e,s]);const D=async()=>{if(e){I(!0);try{u(await e.restore(n))}catch(O){u({status:"unavailable",message:Mt(O)})}finally{I(!1)}}},K=x?.confirmation,Q=!K?.required||U===K.token,z=Se[n],R=!e||k==="existing",q=ta(n,t,i);return r.jsxs("div",{className:c?"":"overflow-hidden rounded-md border border-border/60",children:[e&&s?r.jsxs("div",{className:"border-b border-border/60 px-3 py-2",children:[r.jsxs("div",{role:"tablist","aria-label":`${z} 的 Key 来源`,className:"flex flex-wrap gap-2",children:[r.jsx("button",{type:"button",role:"tab","aria-selected":k==="create","data-testid":"client-key-source-create",className:`rounded-lg border px-3 py-1 text-xs ${k==="create"?"border-primary bg-accent text-accent-foreground":"border-border text-foreground hover:bg-accent/60"}`,onClick:()=>P("create"),children:"为这个客户端新建 Key"}),r.jsx("button",{type:"button",role:"tab","aria-selected":k==="existing","data-testid":"client-key-source-existing",className:`rounded-lg border px-3 py-1 text-xs ${k==="existing"?"border-primary bg-accent text-accent-foreground":"border-border text-foreground hover:bg-accent/60"}`,onClick:()=>P("existing"),children:"使用我已经有的 Key"})]}),r.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:k==="existing"?"本页不会新建 Key:请把已有 Key 粘进客户端配置。共用一个 Key 时,停用它会影响所有使用它的客户端。":"会为这个客户端单独创建一个 Key;停用只影响它自己。"})]}):null,c?null:r.jsxs("div",{className:"flex flex-wrap items-center gap-2 px-3 py-2",children:[r.jsx("span",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground",children:r.jsx(ea,{client:n})}),r.jsxs("div",{className:"min-w-[10rem] flex-1",children:[r.jsx("div",{className:"text-sm font-medium",children:z}),R?null:r.jsx("div",{className:"mt-0.5 text-xs text-muted-foreground",children:h.message??(h.status==="configured"?`${z} 正在使用 Xpod。`:"可自动写入本机配置。")})]}),R?null:r.jsx(Ge,{variant:"secondary",children:cu(h.status)}),R?r.jsx(rt,{value:q,label:`${z} 配置`,variant:"ghost",size:"icon",iconClassName:"h-4 w-4"}):r.jsxs("div",{className:"flex items-center gap-1",children:[r.jsx(G,{variant:"outline",size:"sm","aria-label":`配置 ${z}`,disabled:C,onClick:()=>{m()},children:"配置"}),r.jsx(G,{variant:"ghost",size:"icon","aria-label":`恢复 ${z} 配置`,disabled:h.status==="notConfigured"||C,onClick:()=>{D()},children:r.jsx(Hi,{className:"h-4 w-4"})})]})]}),c&&C?r.jsxs("div",{className:"py-1 text-xs text-muted-foreground",children:["正在应用 ",z," 配置…"]}):null,c&&!C&&h.message?r.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2 py-1 text-xs text-destructive",children:[r.jsx("span",{children:h.message}),r.jsx(G,{variant:"outline",size:"sm",onClick:()=>{m()},children:"重试应用配置"})]}):null,g.length>0?r.jsx("ul",{"data-testid":"client-setup-stages",className:"space-y-1 border-t border-border/60 px-4 py-3 text-xs",children:g.map(O=>r.jsxs("li",{"data-testid":"client-setup-stage","data-stage":O.id,"data-stage-state":O.state,className:"flex gap-2",children:[r.jsx("span",{"aria-hidden":"true",children:O.state==="ok"?"✓":O.state==="failed"?"✕":"?"}),r.jsx("span",{className:"font-medium",children:O.label}),r.jsx("span",{className:"min-w-0 flex-1 text-muted-foreground",children:O.detail})]},O.id))}):null,x?r.jsxs("div",{className:"space-y-3 border-t border-border/60 bg-muted/20 px-4 py-3",children:[r.jsx("div",{className:"text-xs font-medium",children:"将执行以下更改"}),x.changes.map(O=>r.jsxs("div",{className:"text-xs text-muted-foreground",children:[r.jsx("span",{className:"font-mono",children:O.target})," · ",ou(O.action),O.backup?" · 创建备份":""]},`${O.target}:${O.action}`)),K?.required?r.jsxs("div",{className:"space-y-2",children:[K.message?r.jsx("div",{className:"text-xs text-muted-foreground",children:K.message}):null,r.jsxs("div",{className:"text-xs text-muted-foreground",children:["确认码:",r.jsx("code",{className:"font-mono text-foreground",children:K.token})]}),r.jsx(ye,{"aria-label":`输入确认码以应用 ${z} 配置`,value:U,onChange:O=>B(O.target.value)})]}):null,r.jsxs("div",{className:"flex gap-2",children:[r.jsx(G,{size:"sm","aria-label":K?.required?`确认并应用 ${z} 配置`:`应用 ${z} 配置`,disabled:!s||C||!Q,onClick:()=>{b()},children:K?.required?"确认并应用":"应用配置"}),r.jsx(G,{variant:"ghost",size:"sm",disabled:C,onClick:()=>{v(void 0),B("")},children:"取消"})]})]}):null]})}function ou(e){switch(e){case"update":return"更新";case"delete":return"删除";default:return"创建或更新"}}function cu(e){switch(e){case"configured":return"已配置";case"drifted":return"配置已变化";case"unverifiable":return"无法验证";case"failedAndRestored":return"已恢复";case"unavailable":return"需手动配置";default:return"未配置"}}function ta(e,t,n){const s=n??"<粘贴 Xpod API Key>",i=kn(t),a=$s(t);switch(e){case"codex":return["# ~/.codex/config.toml","# 将 model_provider 放在第一个配置节之前;已有同名顶层字段时替换",'model_provider = "xpod"',"","[model_providers.xpod]",'name = "Xpod AI Connection"',`base_url = ${JSON.stringify(i)}`,'wire_api = "responses"',"requires_openai_auth = false",`experimental_bearer_token = ${JSON.stringify(s)}`,"# 保留现有订阅登录,Xpod 单独使用此 provider 的 Key"].join(`
6
- `);case"claude-code":return["# ~/.claude/settings.json(合并 env 到现有 JSON)",JSON.stringify({env:{ANTHROPIC_BASE_URL:a,ANTHROPIC_AUTH_TOKEN:s}},null,2)].join(`
7
- `);case"pi":return["# ~/.pi/agent/settings.json(合并到现有 JSON,并将 <model-id> 替换为实际模型)",JSON.stringify({defaultProvider:"xpod",defaultModel:"<model-id>"},null,2),"","# ~/.pi/agent/models.json(合并 providers.xpod 到现有 JSON)",JSON.stringify({providers:{xpod:{baseUrl:i,apiKey:s,authHeader:!0,api:"openai-responses",models:[{id:"<model-id>",name:"<model-id>"}]}}},null,2)].join(`
8
- `);case"codebuddy":return["# ~/.codebuddy/settings.json(合并 env 到现有 JSON)",JSON.stringify({env:{CODEBUDDY_BASE_URL:i,CODEBUDDY_API_KEY:s}},null,2)].join(`
9
- `)}}function lu(e){return!!(e&&typeof e=="object"&&"code"in e&&e.code==="verification_failed_restored")}function Mt(e){return Kn(e)}function uu(e){return[{protocol:"chatCompletions",baseUrl:kn(e)},{protocol:"responses",baseUrl:kn(e)},{protocol:"anthropic",baseUrl:$s(e)}]}function du({record:e,busy:t,confirming:n=!1,onRequestDestroy:s,onCancelDestroy:i,onDestroy:a}){const c=e.name||"未命名 API Key",p=fu(e),h=e.kind!=="client-credentials"||!!e.clientCredentialId;return r.jsxs("li",{"data-key-id":e.id,"data-key-binding":e.appliedTo?"bound":"unbound",className:"flex flex-wrap items-center gap-x-4 gap-y-2 border-b border-border/60 px-4 py-3 first:rounded-t-xl last:rounded-b-xl last:border-b-0",children:[r.jsxs("dl",{className:"flex min-w-0 flex-1 basis-64 flex-wrap items-center gap-x-6 gap-y-2",children:[r.jsx(fn,{label:"用途",className:"min-w-0 flex-1 basis-28",children:r.jsx("span",{className:"block truncate text-sm font-medium text-foreground/90",title:c,children:c})}),r.jsx(fn,{label:"绑定",className:"min-w-0 flex-1 basis-28",children:r.jsxs("span",{className:"flex min-w-0 items-center gap-1.5 text-xs text-muted-foreground",children:[p.clientId?r.jsx(ea,{client:p.clientId,className:"h-3.5 w-3.5"}):null,r.jsx("span",{className:"truncate",title:p.label,children:p.label})]})}),r.jsx(fn,{label:"最后使用",className:"shrink-0",children:r.jsx("span",{className:"block text-xs text-muted-foreground",children:e.lastUsedAt?pu(e.lastUsedAt):"暂无调用记录"})})]}),h?n?r.jsxs("div",{"data-testid":"gateway-key-destroy-confirm",className:"mt-2 shrink-0 rounded-lg border border-destructive/40 bg-destructive/5 p-3 text-xs",children:[r.jsx("p",{className:"text-foreground",children:"删除后,正在使用这个 Key 的客户端会立即失效。Xpod 目前不记录 Key 与客户端/用途的关联, 因此无法列出受影响的对象;请先确认没有客户端在用。更稳妥的做法是给新客户端单独建一个 Key。"}),r.jsxs("div",{className:"mt-2 flex flex-wrap gap-2",children:[r.jsx(G,{variant:"secondary",size:"sm",className:"h-8 text-xs","aria-label":`确认删除 ${c}`,disabled:t,onClick:a,children:"确认删除"}),r.jsx(G,{variant:"ghost",size:"sm",className:"h-8 text-xs","aria-label":`取消删除 ${c}`,disabled:t,onClick:i,children:"取消"})]})]}):r.jsxs(G,{variant:"ghost",size:"sm",className:"h-8 shrink-0 gap-1.5 text-xs text-muted-foreground hover:text-destructive","aria-label":`销毁 ${c}`,title:`销毁 ${c}`,disabled:t,onClick:s,children:[r.jsx(On,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),"销毁"]}):r.jsx("span",{className:"shrink-0 text-[11px] text-muted-foreground",children:"缺少 CSS 凭据标识,无法在此销毁"})]})}function fu(e){const t=e.appliedTo?.trim();if(!t)return{label:"未绑定"};const n=Lt.find(a=>a===t),s=n?Se[n]:t,i=e.appliedOn?.trim();return{clientId:n,label:i?`${s} · ${i}`:s}}function fn({label:e,className:t,children:n}){return r.jsxs("div",{className:t,children:[r.jsx("dt",{className:"text-[11px] leading-tight text-muted-foreground/80",children:e}),r.jsx("dd",{className:"mt-0.5",children:n})]})}function pu(e){const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}function hu({models:e,selection:t}){const[n,s]=f.useState(""),i=f.useMemo(()=>mu(e??[]),[e]),a=n.trim().toLocaleLowerCase(),c=a?i.filter(u=>u.searchText.includes(a)):i,p=i.filter(u=>u.availability==="unavailable").length,h=t?i.filter(u=>t.isSelected(u)).length:i.length;return r.jsxs("section",{className:"space-y-8","aria-label":"可用模型",children:[r.jsxs("div",{"data-testid":"gateway-models-header",className:"flex flex-wrap items-center justify-between gap-2",children:[r.jsxs("div",{className:"flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1",children:[r.jsxs("h3",{className:"flex items-center gap-2 text-sm font-medium text-foreground/90",children:[r.jsx(At,{"aria-hidden":"true",className:"h-4 w-4 text-primary"}),"可用模型"]}),r.jsx("span",{className:"text-xs text-muted-foreground",children:t?`共 ${i.length} · 已发布 ${h} · 已失效 ${p}`:`共 ${i.length} · 已失效 ${p}`}),r.jsx("span",{className:"text-xs text-muted-foreground",children:"Xpod 当前发布的模型"})]}),r.jsx(Ws,{value:n,onChange:s})]}),e===void 0?r.jsx(dt,{children:"Xpod 模型目录尚未就绪"}):i.length===0?r.jsx(dt,{children:"暂无可用模型"}):c.length===0?r.jsx(dt,{children:"未找到匹配的模型"}):r.jsx("div",{className:"grid gap-2",children:c.map(u=>r.jsx(Zs,{label:u.displayName??u.id,modelId:u.id,iconTokens:u.iconTokens,enabled:t?.isSelected(u)??!1,toggleDisabled:t?.disabled,onToggle:t?()=>t.toggle(u):void 0,unavailable:u.availability==="unavailable",badges:r.jsxs(r.Fragment,{children:[u.custom?r.jsx(Ge,{variant:"outline",className:"shrink-0 text-[10px] font-normal",children:"手工"}):null,u.availability==="unavailable"?r.jsx(Ge,{variant:"destructive",className:"shrink-0 text-[10px] font-normal",children:"已失效"}):null]})},u.key))})]})}function mu(e){const t=new Map;for(const n of e){const s=jn(n),i=`${s.provider}\0${s.id}`,a=Ys(s),c=[s.id,s.displayName].filter(Boolean).join(`
10
- `).toLocaleLowerCase(),p=t.get(i);if(!p){t.set(i,{...s,key:i,iconTokens:a,searchText:c});continue}s.availability!=="unavailable"&&(p.availability=s.availability),p.displayName===void 0&&s.displayName!==void 0&&(p.displayName=s.displayName),p.iconTokens=[...new Set([...p.iconTokens,...a])],p.searchText+=`
11
- ${c}`}return[...t.values()]}const pn="我的 API Key",gu="API Key 已创建,请复制或应用到客户端。",Ir="这个 API Key 只在创建时可见:请销毁它,然后重新创建并立即复制或应用。",Au="这个 API Key 只在创建时可见:请销毁它,然后重新创建并直接应用到客户端。",xu="把已接入的 Provider 模型统一发布给编码客户端,兼容 OpenAI 与 Anthropic 协议。",yu="API Key 保存在当前 Pod,由 Pod 权限保护;Xpod 不保存明文。",bu=["flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm transition-[border-color]","disabled:cursor-not-allowed disabled:opacity-50",Ha].join(" ");function Cu({client:e,clientConfigurationBridge:t,gatewayModels:n,modelSelection:s,liveRevision:i=0}){const[a,c]=f.useState([]),[p,h]=f.useState(void 0),[u,g]=f.useState(!0),[A,x]=f.useState(!1),[v,U]=f.useState(pn),[B,C]=f.useState(""),[I,F]=f.useState(!1),[k,P]=f.useState(),[j,w]=f.useState(),[m,b]=f.useState(),[D,K]=f.useState(!1),[Q,z]=f.useState(),[R,q]=f.useState(),O=f.useRef(new Map),Y=f.useRef(!1),W=f.useRef(void 0),te=f.useCallback(l=>{W.current&&cr(W.current),W.current=je(l)},[]),J=f.useCallback(l=>{te({variant:"destructive",description:_e(l),duration:8e3})},[te]);f.useEffect(()=>{let l=!0;return g(!0),q(void 0),O.current.clear(),e.listGatewayKeys().then(d=>{l&&c(d.filter(M=>!M.revokedAt))}).catch(d=>{l&&J(d)}).finally(()=>{l&&g(!1)}),()=>{l=!1,W.current&&cr(W.current)}},[e,J]),f.useEffect(()=>{if(i===0)return;let l=!0;return e.listGatewayKeys().then(d=>{l&&c(d.filter(M=>!M.revokedAt))}).catch(()=>{}),()=>{l=!1}},[e,i]);const ce=()=>{q(void 0),U(pn),C(""),x(!0)},re=()=>{P(void 0),w(void 0),b(void 0),q(void 0),U(pn),C("")},de=async()=>{const l=v.trim();if(!l){q("请填写 API Key 名称。");return}if(!B){q("请选择 API Key 的用途。");return}F(!0),q(void 0);try{const d=await e.createGatewayKey({name:l,appliedTo:B});O.current.set(d.record.id,d.plaintext),c(M=>[d.record,...M.filter(L=>L.id!==d.record.id)]),P(d.record),w(B),b(void 0),te({variant:"success",description:gu})}catch(d){q(_e(d))}finally{F(!1)}},se=(l,d)=>{const M=O.current.get(l.id);if(!M)throw new Error(d);return M},ue=async()=>{if(!k||!j||!t)return;q(void 0);let l;try{l=se(k,Au)}catch(d){q(_e(d));return}K(!0);try{const d=await t.plan({client:j,endpoint:e.apiBase,...j==="codex"&&n!==void 0?{activeModels:n.map(({id:M,provider:L,displayName:$,availability:Ce,contextWindow:ve,inputModalities:oe,capabilities:Fe})=>({id:M,provider:L,displayName:$,availability:Ce,contextWindow:ve,inputModalities:oe,capabilities:Fe}))}:{}});await t.apply({client:d.client,planId:d.planId,apiKey:l,...d.confirmation?.required?{confirmation:{token:d.confirmation.token,targetHash:d.confirmation.targetHash}}:{}}),b(d.client),c(M=>M.map(L=>L.id===k.id?{...L,appliedTo:d.client}:L)),te({variant:"success",description:d.client==="codex"&&n===void 0?"Codex 连接配置已应用,模型目录尚未加载,请稍后刷新配置。":`${Se[d.client]} 配置已应用。`})}catch(d){q(_e(d))}finally{K(!1)}},N=async l=>{if(!Y.current){Y.current=!0,z(l.id),q(void 0);try{await e.deleteGatewayKey(l.id),O.current.delete(l.id),c(d=>d.filter(M=>M.id!==l.id)),k?.id===l.id&&(P(void 0),w(void 0),b(void 0))}catch(d){J(d)}finally{Y.current=!1,z(void 0)}}};return r.jsx(xt,{children:r.jsxs("section",{className:"space-y-8","aria-label":"API Keys",children:[r.jsx(Vs,{name:"Xpod",mark:"XP",avatar:Us,infoLabel:"Xpod 说明",infoLines:[xu,yu],link:{href:e.apiBase,label:"访问 Xpod"},badge:r.jsx(Ge,{variant:a.length>0?"default":"secondary",children:a.length>0?`已签发 ${a.length} 个`:"未配置"})}),r.jsxs("section",{className:"space-y-3","aria-label":"当前连接",children:[r.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[r.jsxs("h3",{className:"flex items-center gap-2 text-sm font-medium text-foreground/90",children:[r.jsx(Zr,{"aria-hidden":"true",className:"h-4 w-4 text-primary"}),"当前连接"]}),r.jsx("div",{className:"flex flex-wrap items-center justify-end gap-2",children:r.jsxs(G,{variant:"outline",size:"sm",className:"h-8 gap-1.5 text-xs","aria-label":"新建 API Key",disabled:I||u,onClick:ce,children:[r.jsx(at,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),"API Key"]})})]}),u?r.jsxs("div",{className:"flex items-center gap-2 py-6 text-sm text-muted-foreground",children:[r.jsx(Me,{"aria-hidden":"true",className:"h-4 w-4 animate-spin"}),"正在读取 API Key"]}):a.length===0?r.jsx("p",{className:"py-2 text-xs text-muted-foreground",children:"尚未签发 API Key"}):r.jsx("ul",{"aria-label":"API Key 列表",className:"rounded-xl border border-border/70",children:a.map(l=>r.jsx(du,{record:l,busy:!!Q,confirming:p===l.id,onRequestDestroy:()=>h(l.id),onCancelDestroy:()=>h(d=>d===l.id?void 0:d),onDestroy:()=>{h(void 0),N(l)}},l.id))}),r.jsxs("details",{className:"text-xs text-muted-foreground",children:[r.jsx("summary",{className:"w-fit cursor-pointer",children:"接入信息"}),r.jsx("div",{className:"mt-2 space-y-3",children:r.jsxs("section",{className:"space-y-2","aria-labelledby":"xpod-access-info",children:[r.jsx("h4",{id:"xpod-access-info",className:"text-sm font-medium text-foreground",children:"Xpod 接入信息"}),r.jsx("p",{className:"text-xs text-muted-foreground",children:"API Key 是签发给客户端应用的 CSS 客户端凭据;Pod 只记录它绑定到哪个客户端,不保存 Key 明文。"}),r.jsx("p",{className:"text-xs text-muted-foreground",children:"同一个 API Key 支持以下兼容协议,按客户端选择并复制对应地址:"}),r.jsx(Js,{endpoints:uu(e.apiBase),copy:!0,display:"protocol"})]})})]})]}),r.jsx(hu,{models:n,selection:s}),r.jsx(ht,{open:A,onOpenChange:l=>{!l&&(I||D)||x(l)},children:r.jsxs(mt,{className:"sm:max-w-md","aria-describedby":void 0,children:[r.jsx(qt,{children:r.jsx(gt,{children:k?"API Key 已签发":"新建 API Key"})}),k&&j?r.jsxs("div",{className:"space-y-5",children:[r.jsxs("div",{className:"space-y-1.5",children:[r.jsxs("p",{className:"text-sm",children:["已签发「",k.name||"未命名 API Key","」,用途:",Se[j],"。"]}),r.jsx("p",{className:"text-xs text-muted-foreground",children:"Xpod 不保存 Key 明文,请立即复制或直接应用到客户端;离开本次会话后无法再次获取。"})]}),k.maskedHint?r.jsx("code",{className:"block truncate rounded-md border border-border/60 bg-muted/30 px-3 py-2 font-mono text-xs text-muted-foreground",children:k.maskedHint}):null,t?null:r.jsx("p",{className:"text-xs text-muted-foreground",children:"当前 Web 环境无法自动写入客户端配置,请复制后手动粘贴;自动应用需要本机连接。"}),R?r.jsx("p",{role:"alert",className:"text-sm text-destructive",children:R}):null,r.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[r.jsx(rt,{value:()=>se(k,Ir),label:"API Key",text:"复制 API Key",disabled:D,iconClassName:"mr-1.5 h-3.5 w-3.5",copiedIconClassName:"mr-1.5 h-3.5 w-3.5 text-emerald-600",onError:l=>q(_e(l))}),r.jsx(rt,{value:()=>ta(j,e.apiBase,se(k,Ir)),label:`${Se[j]} 配置`,text:`复制 ${Se[j]} 配置`,disabled:D,iconClassName:"mr-1.5 h-3.5 w-3.5",copiedIconClassName:"mr-1.5 h-3.5 w-3.5 text-emerald-600",onError:l=>q(_e(l))}),t?m?r.jsxs("span",{role:"status",className:"inline-flex items-center gap-1 text-xs text-muted-foreground",children:[r.jsx(Tn,{"aria-hidden":"true",className:"h-3.5 w-3.5"}),"已应用到 ",Se[m]]}):r.jsxs(G,{type:"button",size:"sm",disabled:D,"aria-label":`应用到 ${Se[j]}`,onClick:()=>{ue()},children:[D?r.jsx(Me,{"aria-hidden":"true",className:"mr-2 h-4 w-4 animate-spin"}):null,D?"正在应用…":`应用到 ${Se[j]}`]}):null]}),r.jsxs(Kt,{children:[r.jsx(G,{type:"button",variant:"ghost",disabled:D,onClick:re,children:"再建一个"}),r.jsx(G,{type:"button",variant:"outline",onClick:()=>x(!1),children:"完成"})]})]}):r.jsxs("form",{className:"space-y-5",onSubmit:l=>{l.preventDefault(),I||de()},children:[r.jsxs("label",{className:"block space-y-2",children:[r.jsx("span",{className:"text-sm font-medium",children:"名称"}),r.jsx(ye,{autoFocus:!0,"aria-label":"API Key 名称",value:v,disabled:I,onChange:l=>U(l.target.value)})]}),r.jsxs("label",{className:"block space-y-2",children:[r.jsx("span",{className:"text-sm font-medium",children:"用途"}),r.jsxs("select",{"aria-label":"API Key 用途",className:bu,value:B,disabled:I,onChange:l=>C(l.target.value),children:[r.jsx("option",{value:"",disabled:!0,children:"选择客户端应用"}),Lt.map(l=>r.jsx("option",{value:l,children:Se[l]},l))]})]}),r.jsx("p",{className:"text-xs text-muted-foreground",children:"用途在创建时确定,Key 会绑定到该客户端应用。"}),R?r.jsx("p",{role:"alert",className:"text-sm text-destructive",children:R}):null,r.jsxs(Kt,{children:[r.jsx(G,{type:"button",variant:"outline",disabled:I,onClick:()=>x(!1),children:"取消"}),r.jsxs(G,{type:"submit","aria-label":"创建 API Key",disabled:I||!v.trim()||!B,children:[I?r.jsx(Me,{"aria-hidden":"true",className:"mr-2 h-4 w-4 animate-spin"}):null,I?"正在创建…":"创建 API Key"]})]})]})]})})]})})}function _e(e){const t=e instanceof Error?e.message.trim():"";return/failed to fetch|networkerror|load failed/i.test(t)?"无法连接配置服务,请检查连接后重试。":/EACCES|permission denied/i.test(t)?"没有权限写入配置文件,请检查文件权限后重试。":t==="Client configuration could not be verified locally."?"配置文件写入后的本地检查未通过,请检查文件内容和权限后重试。":!t||/^(?:AI Connection |AI client configuration )?request failed(?:\. Please try again\.)?$/i.test(t)?"API Key 操作失败,请重试。":t}const vu={};function wu({client:e,renderToaster:t=!0,openExternal:n=Bu,clientConfigurationBridge:s,selectedSection:i="provider",selectedProvider:a,selectedCredentialId:c,providerSummaries:p=vu,providerProducts:h={},providerLoadError:u,providerLoading:g=!1,onProviderStateChange:A,onModelSelectionChange:x,liveRevision:v=0,liveCredentialRows:U}){const[B,C]=f.useState({}),[I,F]=f.useState(Lt[0]),[k,P]=f.useState([]),[j,w]=f.useState(),[m,b]=f.useState(0),[D,K]=f.useState({}),[Q,z]=f.useState({}),[R,q]=f.useState({}),[O,Y]=f.useState({}),[W,te]=f.useState({}),[J,ce]=f.useState({}),[re,de]=f.useState({}),[se,ue]=f.useState({}),[N,l]=f.useState({}),[d,M]=f.useState({}),[L,$]=f.useState(),[Ce,ve]=f.useState(),[oe,Fe]=f.useState(!1),[ee,fe]=f.useState({}),Be=f.useRef(0),ge=f.useRef({}),le=$c({...h,...ee},_c(h,ee),U),X=f.useCallback((o,y)=>{C(S=>({...S,[o]:y})),A?.(o,ju(y))},[A]);f.useEffect(()=>{C(Object.fromEntries(Object.values(p).filter(Nr).map(o=>[o.provider,o.status==="connected"&&o.authMode==="browserAssistedApiKey"?"configured":o.status]))),ce(Object.fromEntries(Object.values(p).filter(Nr).map(o=>[o.provider,o.baseUrl??""])))},[p]),f.useEffect(()=>{K(o=>{const y={...o};let S=!1;for(const[T,E]of Object.entries(h)){if(!E)continue;const H=E.selectedModels.map(Ue),_=o[T];(!_||_.join("\0")!==H.join("\0"))&&(y[T]=H,S=!0)}return S?y:o})},[h]),f.useEffect(()=>{let o=!0;return e.listModels().then(y=>{o&&P(y)}).catch(()=>{}),()=>{o=!1,Be.current+=1}},[e,v]),f.useEffect(()=>{let o=!0;return w(void 0),e.listGatewayModels?.().then(y=>{o&&w(y)}).catch(()=>{}),()=>{o=!1}},[e,m]);const ie=(o,y)=>{de(S=>({...S,[o]:y}))},Z=(o,y,S,T)=>{ue(E=>({...E,[o]:y?{message:y,offeringId:S,authorization:T}:void 0}))},tr=f.useCallback(async o=>{const y=o.verificationUriComplete??o.authorizationUrl??o.verificationUri;y&&await n(y)},[n]),$t=async o=>{ie(o,!0),Z(o),Y(y=>({...y,[o]:void 0}));try{const y=await e.beginConnect(o,"browserAssistedApiKey");q(T=>({...T,[o]:y}));const S=Fn(y.status);if(X(o,S?"pending":y.status==="completed"?"configured":"failed"),!S&&y.status!=="completed"){Z(o,y.message??jr(y.status));return}await tr(y)}catch(y){X(o,"failed"),Z(o,he(y))}finally{ie(o,!1)}},la=async o=>{await $t(o.id)},ua=async(o,y,S,T)=>{if(S==="browserAssistedApiKey"){await $t(o);return}await da(o,S,y.id,T?.id)},da=async(o,y,S,T)=>{if(y==="connectUnsupported")return;ie(o,!0),Z(o),Y(H=>({...H,[o]:S}));const E=Be.current+1;Be.current=E;try{const H=await e.beginConnect(o,y,{offeringId:S,authorizationMethodId:T});if(q(_=>({..._,[o]:H})),!Fn(H.status)){const _=H.status==="completed";_?await nr(o):X(o,"failed"),_||Z(o,H.status==="unsupported"?"当前部署未启用账号授权":H.message??jr(H.status),S,{mode:y,authorizationMethodId:T}),ie(o,!1);return}X(o,"pending"),await tr(H),Iu(e,o,H,E,Be,{onAttempt:_=>q(ae=>({...ae,[o]:_})),onConnected:()=>nr(o),onFailed:_=>{X(o,"failed"),Z(o,_,S,{mode:y,authorizationMethodId:T})},onFinished:()=>ie(o,!1)})}catch(H){X(o,"failed"),Z(o,he(H),S,{mode:y,authorizationMethodId:T}),ie(o,!1)}},nr=async o=>{X(o,"connected");try{const y=(await e.listProviders()).find(S=>S.id===o);y&&fe(S=>({...S,[o]:y}))}catch(y){Z(o,`账号已连接,连接信息刷新失败:${he(y)}`)}},fa=async(o,y)=>{Be.current+=1,ie(o,!1),q(S=>({...S,[o]:void 0})),Y(S=>({...S,[o]:void 0})),X(o,"failed");try{await e.cancelConnect?.(o,y),Z(o,"连接已取消")}catch(S){Z(o,he(S))}},pa=async o=>{const y=W[o.id]?.trim(),S=J[o.id]??p[o.id]?.baseUrl??"",T=R[o.id];if(!(!y||!T)){ie(o.id,!0),Z(o.id);try{const E=await e.completeApiKey(o.id,T,y,void 0,S.trim());q(H=>({...H,[o.id]:E})),te(H=>({...H,[o.id]:""})),X(o.id,"configured"),je({description:"API Key 已保存"})}catch(E){Z(o.id,he(E)),X(o.id,"failed")}finally{ie(o.id,!1)}}},rr=async(o,y)=>{const S=y?le[o]?.credentials.find(T=>T.id===y)?.offeringId:void 0;ie(o,!0),Z(o);try{await e.disconnect(o,y),q(T=>({...T,[o]:void 0})),Y(T=>({...T,[o]:void 0})),l(T=>({...T,[o]:S?{...T[o],[S]:void 0}:void 0})),y?(fe(T=>({...T,[o]:Fr(le[o],o,y)})),je({description:"已从当前 Pod 移除账号"})):(X(o,"disconnected"),je({description:"已断开连接"}))}catch(T){Z(o,he(T),S)}finally{ie(o,!1)}},en=(o,y)=>{fe(S=>({...S,[o]:kr(le[o],o,y)})),X(o,y.authMode==="apiKey"||y.authMode==="local"?"configured":"connected")},Dt=async(o,y,S=!1,T="")=>{M(E=>({...E,[o]:!0})),Z(o);try{const E=y?await e.discoverModels(o,y):await e.discoverModels(o);b(ae=>ae+1);const H=le[o]?.selectedModels??[],_={...Nu(o,y),...E.complete===!1?{markMissing:!1}:{}};try{const Ee=(await e.listModels()).filter(Ie=>Ie.provider===o);P(Ie=>{const Nt=hn(Ie,o,Ee,_),Fa=hn(Nt,o,E.models,_);return Dr(Fa,o,H,E.models,_)})}catch{P(ae=>Dr(hn(ae,o,E.models,_),o,H,E.models,_))}try{const Ee=(await e.listProviders()).find(Ie=>Ie.id===o);Ee&&fe(Ie=>({...Ie,[o]:Ee}))}catch{}return E.complete===!1?Z(o,"部分连接同步失败,已保留原有模型目录,可稍后重试。",y?.offeringId):S&&je({variant:E.models.length>0?"success":"default",description:E.models.length>0?`连接成功,已同步 ${E.models.length} 个模型`:"连接成功,但服务商未返回任何模型。请确认该服务支持 /models 接口,或使用「添加模型」手工录入。"}),!0}catch(E){const H=he(E);return Z(o,`${T}${H}`,y?.offeringId),!1}finally{M(E=>({...E,[o]:!1}))}},ha=async(o,y,S)=>{ie(o,!0),Z(o);try{const T=await e.createApiKeyCredential(o,{offeringId:y.id,apiKey:S.apiKey,label:S.label,baseUrl:S.baseUrl,proxyUrl:S.proxyUrl,priority:S.priority});en(o,T),je({description:"API Key 已添加"}),await Dt(o,{offeringId:T.offeringId,credentialId:T.id})}catch(T){const E=he(T);throw Z(o,E,y.id),new Error(E)}finally{ie(o,!1)}},ma=async(o,y,S)=>{ie(o,!0),Z(o);try{const T=y.kind==="local",E=await e.createLocalCredential(o,{offeringId:y.id,authorizationMethodId:S?.id,label:y.label??Ae(y),...T?{baseUrl:y.endpoints?.[0]?.baseUrl}:{},priority:10});en(o,E),je({description:`${Ae(y)} 已连接`}),y.modelDiscovery?.strategy!=="unsupported"&&await Dt(o,{offeringId:E.offeringId,credentialId:E.id},!1,T?"本地服务已连接,模型获取失败:":"订阅已读取,模型获取失败:")}catch(T){const E=he(T);throw Z(o,E,y.id),new Error(E)}finally{ie(o,!1)}},ga=async(o,y,S)=>{ie(o,!0),Z(o);try{const T=await e.updateProviderCredential(o,y.id,{expectedVersion:y.version,...S});en(o,T),je({description:"凭证已更新"}),T.enabled&&await Dt(o,{offeringId:T.offeringId,credentialId:T.id})}catch(T){const E=he(T);throw Z(o,E,y.offeringId),new Error(E)}finally{ie(o,!1)}},Aa=async(o,y)=>{if(y.id===`${o}:current`&&y.version===0){if(le[o]?.credentials.some(S=>S.id!==y.id)){Z(o,"请重新加载连接后再移除旧连接。",y.offeringId);return}await rr(o);return}ie(o,!0),Z(o);try{await e.deleteProviderCredential(o,y.id);const S=Fr(le[o],o,y.id);fe(T=>({...T,[o]:S})),X(o,na(S)),je({description:"凭证已删除"})}catch(S){Z(o,he(S),y.offeringId)}finally{ie(o,!1)}},xa=async(o,y)=>{ie(o,!0),Z(o);try{const S=await e.testProviderCredential(o,{credentialId:y.id}),T=ku(S);fe(E=>({...E,[o]:T?kr(le[o],o,T):Br(le[o],o,y.id,"healthy")})),je({variant:"success",description:"测试通过"})}catch(S){const T=(await e.listProviders().catch(()=>[])).find(E=>E.id===o);fe(E=>({...E,[o]:T??Br(le[o],o,y.id,"invalid")})),Z(o,he(S),y.offeringId)}finally{ie(o,!1)}},ya=async(o,y,S,T,E)=>{if(E<0||E>=S.length)return;const H=[...S],[_]=H.splice(T,1);if(_){H.splice(E,0,_),ie(o,!0),Z(o);try{const ae=[];for(const[Ee,Ie]of H.entries()){const Nt=(Ee+1)*10;if(Ie.priority===Nt){ae.push(Ie);continue}ae.push(await e.updateProviderCredential(o,Ie.id,{expectedVersion:Ie.version,priority:Nt}))}fe(Ee=>({...Ee,[o]:Fu(le[o],o,y,ae)})),je({description:"顺序已保存"})}catch(ae){Z(o,he(ae),y.id)}finally{ie(o,!1)}}},tn=f.useRef(new Set),ba=async(o,y,S)=>{const T=S?[S]:(le[o]?.credentials??[]).filter(E=>E.enabled&&E.offeringId===y.id);await Promise.all(T.map(async E=>{const H=`${o}\0${E.id}`;if(tn.current.has(H))return;tn.current.add(H);const _=ae=>{l(Ee=>({...Ee,[o]:{...Ee[o],[E.id]:ae}}))};_({busy:!0,credentialId:E.id});try{const ae=await e.quota(o,!0,{offeringId:y.id,credentialId:E.id,credentialIri:E.id});_({quota:ae,busy:!1,credentialId:E.id})}catch(ae){_({busy:!1,error:he(ae),credentialId:E.id})}finally{tn.current.delete(H)}}))},Ca=async o=>{await Dt(o,o==="custom"&&c?{credentialId:c}:void 0,!0)},sr=f.useCallback(async()=>{b(o=>o+1);try{P(await e.listModels())}catch{}},[e]),ar=(o,y)=>{ve(void 0),$({provider:o,model:y})},va=async o=>{if(!L)return;const y=!!L.model;Fe(!0),ve(void 0);try{await e.saveProviderModel(L.provider,{id:o.id,displayName:o.name||void 0,inputModalities:o.inputModalities.length>0?o.inputModalities:void 0,capabilities:o.capabilities.length>0?o.capabilities:void 0}),$(void 0),je({description:y?"模型已更新":"模型已添加"}),await sr()}catch(S){ve(he(S))}finally{Fe(!1)}},wa=async(o,y)=>{Z(o);try{await e.deleteProviderModel(o,y.id),P(S=>S.filter(T=>!(T.provider===o&&T.id===y.id))),je({description:"模型已移除"}),sr()}catch(S){Z(o,he(S))}},nn=f.useCallback((o,y)=>{const S=[...new Set(y)],T=D[o]??le[o]?.selectedModels.map(Ue)??[],E=(ge.current[o]??0)+1;ge.current[o]=E,K(H=>({...H,[o]:S})),z(H=>({...H,[o]:"saving"})),(async()=>{try{const H=[...k.filter(ae=>ae.provider===o),...le[o]?.selectedModels??[]],_=S.map(ae=>{const Ee=H.find(Ie=>Ue(Ie)===ae);return Ee?Mu(Ee):{id:ae}});o==="custom"?await e.saveModelSelection?.(o,_,c):await e.saveModelSelection?.(o,_),ge.current[o]===E&&(b(ae=>ae+1),z(ae=>({...ae,[o]:"saved"})),x?.(o,S))}catch(H){if(ge.current[o]!==E)return;z(_=>({..._,[o]:"error"})),K(_=>({..._,[o]:T})),x?.(o,T),je({variant:"destructive",description:he(H)})}})()},[e,le,ge,k,x,c,D]),rn=f.useCallback(o=>D[o]??le[o]?.selectedModels.map(Ue)??[],[D,le]),sn=f.useCallback(o=>{const y=k.find(S=>S.provider===o.provider&&pt(S)===pt(o));return Ue(y||o)},[k]),Ea=f.useMemo(()=>({isSelected:o=>rn(o.provider).includes(sn(o)),toggle:o=>{const y=rn(o.provider),S=sn(o);nn(o.provider,y.includes(S)?y.filter(T=>T!==S):[...y,S])},disabled:g}),[sn,nn,g,rn]),Ia=r.jsxs("section",{children:[u?r.jsxs("p",{className:"mb-4 rounded-md border border-destructive/30 px-3 py-2 text-sm text-destructive",children:["Provider 状态读取失败:",u]}):null,xe.filter(o=>o.id===(a??"openai")).map(o=>{const y=le[o.id],S=Su(k.filter(E=>E.provider===o.id&&(o.id!=="custom"||!c||E.credentialId===c)),y?.selectedModels??[],j??[]),T=D[o.id]??y?.selectedModels.map(Ue)??[];return r.jsx(Yl,{definition:o,product:y,status:Eu(B[o.id],y),accountLabel:p[o.id]?.accountLabel,attempt:R[o.id],attemptOfferingId:O[o.id],apiKey:W[o.id]??"",baseUrl:J[o.id]??p[o.id]?.baseUrl??"",busy:!!(re[o.id]||d[o.id]),disabled:g,error:se[o.id],quotas:N[o.id],models:S,selectedModelIds:T,modelSelectionStatus:Q[o.id],onApiKeyChange:E=>te(H=>({...H,[o.id]:E})),onBaseUrlChange:E=>ce(H=>({...H,[o.id]:E})),onBeginApiKey:()=>{$t(o.id)},onBeginOffering:(E,H,_)=>{ua(o.id,E,H,_)},onCancelConnect:E=>{fa(o.id,E)},onBeginBrowser:()=>{la(o)},onSaveApiKey:()=>{pa(o)},onDisconnect:E=>{rr(o.id,E?.id)},onCreateApiKeyCredential:(E,H)=>ha(o.id,E,H),onCreateLocalCredential:(E,H)=>ma(o.id,E,H),onUpdateCredential:(E,H)=>ga(o.id,E,H),onDeleteCredential:E=>{Aa(o.id,E)},onTestCredential:E=>{xa(o.id,E)},onReorderCredentials:(E,H,_,ae)=>{ya(o.id,E,H,_,ae)},onRefreshQuota:(E,H)=>{ba(o.id,E,H)},verifyPending:!!d[o.id],onVerify:()=>{Ca(o.id)},onAddModel:()=>ar(o.id),onEditModel:E=>ar(o.id,E),onDeleteModel:E=>{wa(o.id,E)},onModelSelectionChange:nn,onDismissError:()=>Z(o.id)},o.id)})]}),ja=r.jsxs("section",{"data-testid":"ai-client-first",className:"space-y-4",children:[r.jsxs("div",{children:[r.jsx("h2",{className:"text-base font-semibold",children:"连接客户端"}),r.jsx("p",{className:"mt-1 text-sm text-muted-foreground",children:"先选要接入的客户端,再决定复用已有 API Key 还是新建一个;配置写入与验证结果会分步显示。"})]}),r.jsx("div",{role:"tablist","aria-label":"选择客户端",className:"flex flex-wrap gap-2",children:Lt.map(o=>r.jsx("button",{type:"button",role:"tab","aria-selected":o===I,"data-testid":`ai-client-choice-${o}`,className:`rounded-lg border px-3 py-1.5 text-sm ${o===I?"border-primary bg-accent text-accent-foreground":"border-border text-foreground hover:bg-accent/60"}`,onClick:()=>F(o),children:Se[o]},o))}),r.jsx(iu,{bridge:s,client:I,endpoint:e.apiBase})]}),ka=r.jsx(Cu,{client:e,clientConfigurationBridge:s,gatewayModels:j,modelSelection:Ea,liveRevision:v});return r.jsxs("div",{"data-testid":"ai-connections-panel",className:"mx-auto w-full max-w-5xl space-y-10 px-4 py-6 sm:px-8 sm:py-8",children:[t?r.jsx(qa,{}):null,i==="clients"?ja:null,i==="keys"?ka:null,i==="provider"?Ia:null,i==="provider"&&L?r.jsx(tu,{open:!0,providerName:xe.find(o=>o.id===L.provider)?.name??L.provider,initialValue:L.model?{id:L.model.id,name:L.model.displayName??"",inputModalities:L.model.inputModalities??[],capabilities:L.model.capabilities??[]}:void 0,error:Ce,saving:oe,onOpenChange:o=>{o||$(void 0)},onSave:o=>{va(o)}}):null]})}function na(e){if(!e||e.status==="unconfigured"||e.status==="unavailable")return"disconnected";if(e.status==="configured")return"configured";if(e.status==="attention")return"reauthRequired";const t=e.credentials.find(n=>n.enabled)??e.credentials[0];return t?.authMode==="oauth"||t?.authMode==="deviceCode"?"connected":"configured"}function Eu(e,t){return e==="pending"||e==="failed"?e:t?na(t):e??"unknown"}async function Iu(e,t,n,s,i,a){let c=n;try{for(;i.current===s&&Fn(c.status);){if(await Du(Math.max(1,c.intervalSeconds??2)*1e3),i.current!==s)return;c={...c,...await e.pollDevice(t,c)},a.onAttempt(c)}c.status==="completed"?await a.onConnected():i.current===s&&a.onFailed(c.message||`连接${c.status==="expired"?"已过期":"失败"}`)}catch(p){i.current===s&&a.onFailed(he(p))}finally{i.current===s&&a.onFinished()}}function Fn(e){return e==="pending"||e==="authorization_pending"||e==="slow_down"}function jr(e){return e==="expired"?"连接已过期,请重新开始":e==="cancelled"?"连接已取消":e==="unsupported"?"当前 Provider 不支持此连接方式":"连接失败"}function ju(e){return e==="configured"?"configured":e==="connected"?"connected":e==="failed"||e==="reauthRequired"?"attention":e==="pending"?"loading":"unconfigured"}function kr(e,t,n){const s=e??_t(t),i=ra([...s.credentials.filter(a=>a.id!==n.id),n]);return{...s,credentials:i,status:$n(i)}}function Fr(e,t,n){const s=e??_t(t),i=s.credentials.filter(a=>a.id!==n);return{...s,credentials:i,status:$n(i)}}function Br(e,t,n,s){const i=e??_t(t),a=i.credentials.map(c=>c.id===n?{...c,health:s}:c);return{...i,credentials:a,status:a.some(c=>c.enabled&&c.health==="invalid")?"attention":$n(a)}}function ku(e){const t=e.credential;if(!t||typeof t!="object")return;const n=t;return typeof n.id=="string"&&typeof n.offeringId=="string"&&(n.authMode==="oauth"||n.authMode==="deviceCode"||n.authMode==="apiKey"||n.authMode==="local")&&typeof n.version=="number"?n:void 0}function $n(e){if(e.length===0)return"unconfigured";const t=e.filter(n=>n.enabled);return t.length===0?"configured":t.some(n=>n.health==="expired"||n.health==="invalid")?"attention":"available"}function Fu(e,t,n,s){const i=e??_t(t),a=new Set(s.map(c=>c.id));return{...i,offerings:i.offerings.some(c=>c.id===n.id)?i.offerings:[...i.offerings,n],credentials:ra([...i.credentials.filter(c=>!a.has(c.id)),...s])}}function _t(e){return{id:e,name:xe.find(t=>t.id===e)?.name??e,offerings:[],credentials:[],selectedModels:[],status:"unconfigured"}}function ra(e){return[...e].sort((t,n)=>t.priority-n.priority)}function Bu(e){window.open(e,"_blank","noopener,noreferrer")}function Du(e){return new Promise(t=>window.setTimeout(t,e))}function he(e){if(e instanceof TypeError&&/failed to fetch|fetch failed|networkerror|load failed/i.test(e.message))return"暂时无法连接 Xpod,请在连接恢复后确认操作结果,再重试。";const t=Kn(e);return t==="AI Connection request failed. Please try again."?"请求未完成。请确认 Xpod 正在运行且登录仍有效,然后重试。":t}function Nu(e,t){return e==="custom"?t?.credentialId?{markMissing:!0,credentialId:t.credentialId}:{markMissing:!t}:t?.offeringId?{markMissing:!0,offeringId:t.offeringId}:{markMissing:!t}}function hn(e,t,n,s={markMissing:!1}){const i=new Set(n.map(c=>c.id)),a=e.map(c=>s.markMissing&&c.provider===t&&!c.custom&&!i.has(c.id)&&(s.offeringId===void 0||c.offeringId===s.offeringId)&&(s.credentialId===void 0||c.credentialId===s.credentialId)?Xe({...c,availability:"unavailable"}):c);for(const c of n){const p=c,h="provider"in c,u=p.offeringId??(h?void 0:s.offeringId),g=p.credentialId??(h?void 0:s.credentialId),A=a.findIndex(x=>x.provider!==t?!1:p.resourceId&&x.resourceId?p.resourceId===x.resourceId:g!==void 0?x.id===p.id&&x.credentialId===g:u!==void 0?x.id===p.id&&x.offeringId===u:x.id===p.id&&x.offeringId===void 0);A===-1?a.push(Xe({...p,id:p.id,provider:t,availability:p.availability??"available",...u?{offeringId:u}:{},...g?{credentialId:g}:{}})):a[A]=Xe({...a[A],...p,provider:t,displayName:p.displayName??a[A].displayName,availability:p.availability??"available",...u?{offeringId:u}:{},...g?{credentialId:g}:{}})}return a}function Dr(e,t,n,s,i){if(!i.markMissing||n.length===0)return e;const a=new Set(s.map(p=>p.id)),c=[...e];for(const p of n.filter(h=>h.provider===t)){if(p.custom||i.offeringId!==void 0&&p.offeringId!==i.offeringId||i.credentialId!==void 0&&p.credentialId!==i.credentialId||a.has(p.id))continue;const h=Ue(p),u=c.findIndex(A=>A.provider===t&&Ue(A)===h),g=Xe({...p,availability:"unavailable"});u===-1?c.push(g):c[u]=Xe({...c[u],...g,displayName:c[u].displayName??g.displayName})}return c}function Su(e,t,n=[]){const s=new Map;for(const c of n)s.set(`${c.provider}\0${pt(c)}`,c);const i=c=>{const p=s.get(`${c.provider}\0${pt(c)}`),h=[...new Set([...c.capabilities??[],...p?.capabilities??[]])],u=c.inputModalities??p?.inputModalities;return h.length===0&&!u?c:Xe({...c,...h.length>0?{capabilities:h}:{},...u?{inputModalities:u}:{}})},a=e.map(c=>i(jn(c)));for(const c of t.map(jn)){const p=a.findIndex(h=>Ue(h)===Ue(c));if(p===-1){a.push(i(c));continue}a[p]=i(Xe({...a[p],...c,displayName:a[p].displayName??c.displayName,availability:a[p].availability==="unavailable"?"unavailable":c.availability}))}return a}function Xe(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function Ue(e){return e.resourceId??(e.offeringId?`${e.offeringId}:${e.id}`:e.id)}function Mu(e){return{id:e.id,...e.offeringId?{offeringId:e.offeringId}:{},...e.resourceId?{resourceId:e.resourceId}:{}}}function Nr(e){return e!==void 0}function sa({controller:e,renderToaster:t=!0}){const n=Vc(e);return r.jsx(Pu,{controller:e,renderToaster:t,liveCredentialRows:n})}function Pu({controller:e,renderToaster:t,liveCredentialRows:n}){const s=Yn(e),i=Wn(e),a=Rs(e),c=Ts(e),p=Zn(e),h=Os(e),u=ol(e),g=xe.find(C=>C.id===i),A=i==="custom"?p.custom?.credentials.find(C=>C.id===a):void 0,x=Xn.find(C=>C.id===s)?.title,v=A?.label??p[i]?.name??g?.name??i,U=x??`${v} 详情`,B=i==="custom"&&a&&p.custom?{...p,custom:{...p.custom,name:v,offerings:Uu(p.custom,A),credentials:p.custom.credentials.filter(C=>C.id===a),selectedModels:p.custom.selectedModels.filter(C=>C.credentialId===a)}}:p;return f.useEffect(()=>e.watchPageTables(),[e]),f.useEffect(()=>(e.client&&e.loadProviders(),()=>e.cancelProviderLoads()),[e,u]),e.client?r.jsx("section",{role:"region","aria-label":U,children:r.jsx(wu,{client:e.client,renderToaster:t,clientConfigurationBridge:e.clientConfigurationBridge,selectedSection:s,selectedProvider:i,selectedCredentialId:a,openExternal:e.openExternal,providerSummaries:c,providerProducts:B,providerLoadError:h,providerLoading:!p[i]&&!h,onProviderStateChange:e.setProviderState,liveRevision:u,liveCredentialRows:n})}):r.jsxs("section",{role:"alert","aria-label":"AI Connections unavailable",children:[r.jsx("h2",{children:"AI Connections 尚未就绪"}),r.jsx("p",{children:"宿主需要先提供已登录的 WebID 和可用的 Pod。"})]})}function Uu(e,t){if(!t)return e.offerings;const n=t.compatibility??(t.offeringId==="anthropic-compatible"?"anthropic":"openai"),s=e.offerings.find(i=>i.id===t.offeringId)??e.offerings[0];return s?[{...s,id:t.offeringId,label:n==="auto"?"自动探测":n==="anthropic"?"Anthropic 兼容":"OpenAI 兼容",endpoints:t.baseUrl?[{protocol:n==="anthropic"?"anthropic":"chatCompletions",baseUrl:t.baseUrl}]:s.endpoints,modelDiscovery:n==="anthropic"?{strategy:"anthropic",path:"/models",endpointProtocol:"anthropic"}:n==="auto"?{strategy:"auto",path:"/models",endpointProtocol:"auto"}:{strategy:"openaiCompatible",path:"/models",endpointProtocol:"chatCompletions"}}]:[]}function Ru({open:e,saving:t=!1,error:n,onOpenChange:s,onSave:i}){const[a,c]=f.useState(""),[p,h]=f.useState("auto"),[u,g]=f.useState(""),[A,x]=f.useState(""),[v,U]=f.useState(""),[B,C]=f.useState();f.useEffect(()=>{e&&(c(""),h("auto"),g(""),x(""),U(""),C(void 0))},[e]);const I=()=>{C(void 0);let F;try{F=Ku(u)}catch{C("Base URL 必须是有效的 http(s) 地址。");return}const k=a.trim(),P=A.trim();if(!k){C("请输入 Provider 名称。");return}if(!P){C("请输入 API Key。");return}i({offeringId:Tu(p),apiKey:P,label:k,baseUrl:F,priority:10,compatibility:p,...v.trim()?{proxyUrl:v.trim()}:{}})};return r.jsx(ht,{open:e,onOpenChange:s,children:r.jsxs(mt,{className:"max-w-md",style:{maxHeight:"calc(100vh - 2rem)",overflowY:"auto"},"aria-describedby":"ai-custom-provider-description",children:[r.jsx(qt,{children:r.jsx(gt,{children:"添加自定义 Provider"})}),r.jsx("p",{id:"ai-custom-provider-description",className:"text-sm text-muted-foreground",children:"用 OpenAI/Anthropic 兼容协议接入第三方模型服务。Xpod 会把真实 API Key 存进当前 Pod。"}),r.jsxs("div",{className:"flex flex-col gap-4 py-2",children:[r.jsxs("div",{className:"flex flex-col gap-2",children:[r.jsx(Oe,{htmlFor:"ai-custom-provider-name",children:"Provider 名称"}),r.jsx(ye,{id:"ai-custom-provider-name",value:a,disabled:t,placeholder:"例如 OpenRouter",onChange:F=>c(F.target.value)})]}),r.jsxs("div",{className:"flex flex-col gap-2",children:[r.jsx(Oe,{htmlFor:"ai-custom-provider-compatibility",children:"兼容协议"}),r.jsxs("select",{id:"ai-custom-provider-compatibility",value:p,disabled:t,"aria-label":"兼容协议",className:"h-9 rounded-md border border-input bg-background px-3 text-sm",onChange:F=>h(F.target.value),children:[r.jsx("option",{value:"auto",children:"自动探测"}),r.jsx("option",{value:"openai",children:"OpenAI 兼容优先"}),r.jsx("option",{value:"anthropic",children:"Anthropic 兼容优先"})]})]}),r.jsxs("div",{className:"flex flex-col gap-2",children:[r.jsx(Oe,{htmlFor:"ai-custom-provider-base-url",children:"Base URL"}),r.jsx(ye,{id:"ai-custom-provider-base-url",value:u,disabled:t,placeholder:"https://openrouter.ai/api 或 https://openrouter.ai/api/v1",onChange:F=>g(F.target.value)}),r.jsx("p",{className:"text-xs text-muted-foreground",children:"裸域名会自动补齐为 /v1。"})]}),r.jsxs("div",{className:"flex flex-col gap-2",children:[r.jsx(Oe,{htmlFor:"ai-custom-provider-api-key",children:"API Key"}),r.jsx(ye,{id:"ai-custom-provider-api-key",type:"password",value:A,disabled:t,autoComplete:"new-password","data-lpignore":"true",onChange:F=>x(F.target.value)})]}),r.jsxs("div",{className:"flex flex-col gap-2",children:[r.jsx(Oe,{htmlFor:"ai-custom-provider-proxy-url",children:"Proxy URL(可选)"}),r.jsx(ye,{id:"ai-custom-provider-proxy-url",value:v,disabled:t,placeholder:"http://127.0.0.1:7890",onChange:F=>U(F.target.value)})]}),B||n?r.jsx("p",{className:"text-sm text-destructive",children:B??n}):null]}),r.jsxs(Kt,{children:[r.jsx(G,{type:"button",variant:"outline",disabled:t,onClick:()=>s(!1),children:"取消"}),r.jsx(G,{type:"button",disabled:t,onClick:I,children:"保存自定义 Provider"})]})]})})}function Ku(e){const t=e.trim(),n=new URL(t);if(n.protocol!=="http:"&&n.protocol!=="https:")throw new Error("invalid_custom_base_url");n.hash="";const s=n.pathname.replace(/\/+$/u,"");return!s||s===""?n.pathname="/v1":n.pathname=s,n.href.replace(/\/$/u,"")}function Tu(e){return e==="anthropic"?"anthropic-compatible":"openai-compatible"}function Ou({controller:e}){const t=Ks(e),[n,s]=f.useState(!1),[i,a]=f.useState(!1),[c,p]=f.useState(),h=async u=>{if(!e.client){p("请先登录后再添加自定义 Provider。");return}a(!0),p(void 0);let g;try{const A=await e.client.createApiKeyCredential("custom",u);g=A.id,await e.client.discoverModels("custom",{offeringId:A.offeringId,credentialId:A.id,compatibility:u.compatibility}),e.selectProvider("custom",A.id),await e.loadProviders(),s(!1)}catch(A){g&&await e.client.deleteProviderCredential("custom",g).catch(()=>{}),p(A instanceof Error?A.message:"AI Connection request failed. Please try again.")}finally{a(!1)}};return r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"flex h-full min-w-0 items-center gap-2 px-3",children:[r.jsxs("div",{className:"relative min-w-0 flex-1",children:[r.jsx(Wr,{"aria-hidden":"true",className:"pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground"}),r.jsx(ye,{type:"search","aria-label":"搜索 Provider",placeholder:"搜索 Provider",value:t,onChange:u=>e.setSearchQuery(u.target.value),className:"h-8 border-transparent bg-muted/50 pl-8 text-xs focus-visible:bg-background"})]}),r.jsx(G,{type:"button",variant:"ghost",size:"icon",className:"h-8 w-8 shrink-0","aria-label":"添加 AI Connection",title:"添加 AI Connection",onClick:()=>s(!0),children:r.jsx(at,{className:"h-4 w-4","aria-hidden":"true"})})]}),r.jsx(Ru,{open:n,saving:i,error:c,onOpenChange:s,onSave:u=>{h(u)}})]})}const Lu={live:{label:"实时",title:"实时更新已开启:Pod 中的改动会立即反映到本页。",dotClass:"bg-emerald-500"},unavailable:{label:"实时不可用",title:"实时更新当前不可用;本页仍会正常读取与操作。",dotClass:"bg-muted-foreground/60"}};function Qu({controller:e}){const t=Yn(e),n=Wn(e),s=Zn(e),i=il(e),a=xe.find(h=>h.id===n),c=Xn.find(h=>h.id===t)?.title??s[n]?.name??a?.name??n,p=i==="idle"?void 0:Lu[i];return r.jsxs("div",{className:"flex h-full min-w-0 items-center gap-2 px-4",children:[r.jsx("h1",{className:"truncate text-sm font-medium text-foreground",children:c}),p&&r.jsxs("span",{"data-live-updates":i,title:p.title,"aria-label":p.title,className:"ml-auto inline-flex shrink-0 items-center gap-1 text-[10px] font-medium text-muted-foreground",children:[r.jsx("span",{"aria-hidden":"true",className:`h-1.5 w-1.5 rounded-full ${p.dotClass}`}),p.label]})]})}const Hu=["navigation.openExternal","aiClientConfiguration","solidNotifications","podCollections"];function qu(e){const t=mn(e,"Extension manifest");Sr(t.extensionId,"extensionId"),$e(t.name,"name"),$e(t.version,"version"),$e(t.sdkVersion,"sdkVersion");const n=mn(t.contributes,"contributes");if(!Array.isArray(n.applets)||n.applets.length===0)throw new Error("Extension manifest must contribute at least one Applet");const s=new Set;for(const i of n.applets){const a=mn(i,"Applet manifest"),c=Sr(a.appId,"appId");if(s.has(c))throw new Error(`Extension manifest has duplicate appId: ${c}`);if(s.add(c),$e(a.name,"Applet name"),$e(a.entry,"Applet entry"),!Array.isArray(a.commands))throw new Error("Applet commands must be an array");if(a.layout!=="single-pane"&&a.layout!=="two-pane")throw new Error("Applet layout must be single-pane or two-pane")}if(!Array.isArray(t.dataModels))throw new Error("Extension dataModels must be an array");if(!Array.isArray(t.hostCapabilities))throw new Error("Extension hostCapabilities must be an array");for(const i of t.hostCapabilities)if(!Hu.includes(i))throw new Error(`Extension manifest requested unknown Host capability: ${String(i)}`);return e}function mn(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`${t} must be an object`);return e}function $e(e,t){if(typeof e!="string"||e.trim().length===0)throw new Error(`${t} must be a non-empty string`);return e}function Sr(e,t){const n=$e(e,t);let s;try{s=new URL(n)}catch{throw new Error(`${t} must be a valid HTTPS URL`)}if(s.protocol!=="https:")throw new Error(`${t} must be a valid HTTPS URL`);return n}const aa=qu({extensionId:"https://undefineds.co/extensions/ai-connections",name:"AI Connection",version:"0.1.0",sdkVersion:"1",contributes:{applets:[{appId:"https://undefineds.co/applets/ai-connections",name:"AI Connection",entry:".",commands:[],layout:"two-pane"}]},dataModels:[],hostCapabilities:["navigation.openExternal","aiClientConfiguration","solidNotifications","podCollections"]}),er=aa.contributes.applets[0],Bn={manifest:er,createController:tl,activate(e){e.loadProviders()},slots:{listHeader:Ou,list:gl,mainHeader:Qu,main:sa}},Mr={manifest:aa,applets:{[er.appId]:Bn}};function Vu(e={}){return e.renderToaster!==!1?Mr:{...Mr,applets:{[er.appId]:{...Bn,slots:{...Bn.slots,main:({controller:t})=>f.createElement(sa,{controller:t,renderToaster:!1})}}}}}function zu(e){let t,n,s,i=!1;const a=new Set,c=h=>{if(!t)throw new Error(`pod_collections_not_loaded: ${h}() needs the collection engine; use load() so the host can fetch it first`);return t},p=()=>(n??=Qr(()=>import("./pod-collections-host-KnnGFZHL.js"),__vite__mapDeps([10,6])).then(h=>{const u=h.createPodCollectionsCapability(e);return i?(u.dispose(),u):(t=u,s=u.subscribeSyncState(()=>{for(const g of[...a])g()}),u)}),n);return{define(h,u){return c("define").define(h,u)},async load(h,u){return(await p()).define(h,u)},syncState(h){return c("syncState").syncState(h)},subscribeSyncState(h){return a.add(h),()=>{a.delete(h)}},dispose(){i=!0,s?.(),s=void 0,a.clear(),t?.dispose(),t=void 0}}}const Ju="/.notifications/WebSocketChannel2023/",Gu="http://www.w3.org/ns/solid/notifications#WebSocketChannel2023",Xu="https://www.w3.org/ns/solid/notification/v1",Yu=1,Wu={initialMs:1e3,factor:2,maxMs:3e4},Zu=5,_u=1e3;function $u(e){const t=e.indexOf("#");return t<0?e:e.slice(0,t)}function ed(e,t){const n=td(e);return n?nd(t(n))??e:e}function td(e){const t=ia(e);return t==="wss:"?`https:${e.slice(t.length)}`:t==="ws:"?`http:${e.slice(t.length)}`:t==="http:"||t==="https:"?e:void 0}function nd(e){const t=ia(e);if(t==="https:")return`wss:${e.slice(t.length)}`;if(t==="http:")return`ws:${e.slice(t.length)}`}function ia(e){return/^[a-z][a-z\d+.-]*:/iu.exec(e)?.[0].toLowerCase()}function Pr(){const e=globalThis;return typeof e.addEventListener=="function"&&typeof e.removeEventListener=="function"?globalThis:null}function rd(e){const t=e.fetch,n=e.document===void 0?typeof document>"u"?null:document:e.document,s=e.page===void 0?Pr():e.page,i=e.environment===void 0?Pr():e.environment,a=e.createSocket??(l=>new WebSocket(l)),c=e.channelEndpoint??(l=>new URL(Ju,l).toString()),p=e.resolveLocalUrl,h=l=>p?ed(l,p):l,u=e.backoff??Wu,g=e.maxAttempts??Zu,A=e.rearmCoalesceMs??_u,x=new Map,v=new Map,U=new Set;let B="idle",C=!1,I=e.session?e.session.getSnapshot().status==="authenticated":!0,F=Number.NEGATIVE_INFINITY,k=!1,P;const j=()=>n?.visibilityState!=="hidden",w=l=>!C&&I&&j()&&x.get(l.topic)===l&&l.listeners.size>0;function m(){const l=b();if(l!==B){B=l;for(const d of[...U])d(B)}}function b(){if(x.size===0||C||!I||!j())return"idle";let l=!1,d=!1;for(const M of x.values())M.socket?.readyState===Yu?l=!0:M.attempts>=g&&(d=!0);return l?"live":d?"unavailable":"idle"}function D(l){const d=(v.get(l.topic)??0)+1;v.set(l.topic,d);const M={topic:l.topic,sequence:d,receivedAt:Date.now()};for(const L of[...l.listeners])L(M)}async function K(l){const d=await t(c(l),{method:"POST",headers:{"content-type":"application/ld+json",accept:"application/ld+json"},body:JSON.stringify({"@context":Xu,"@type":Gu,topic:l})});if(!d.ok)throw new Error(`Notification subscription failed with status ${d.status}`);const M=await d.json(),L=typeof M.receiveFrom=="string"?M.receiveFrom:void 0;if(!L)throw new Error("Notification subscription response carried no receiveFrom");const $=typeof M.id=="string"?M.id:typeof M["@id"]=="string"?M["@id"]:void 0;return{receiveFrom:L,id:$}}async function Q(l){if(l)try{await t(l,{method:"DELETE",keepalive:!0})}catch{}}function z(l){const d=l.socket;l.socket=void 0,d&&(d.onopen=null,d.onmessage=null,d.onerror=null,d.onclose=null,d.close(1e3,"client unsubscribe"))}function R(l){l.retryTimer!==void 0&&(clearTimeout(l.retryTimer),l.retryTimer=void 0),z(l);const d=l.channelId;l.channelId=void 0,Q(d)}function q(l){if(l.retryTimer!==void 0)return;if(l.attempts>=g||!w(l)){m();return}const d=Math.min(u.initialMs*u.factor**(l.attempts-1),u.maxMs);l.retryTimer=setTimeout(()=>{l.retryTimer=void 0,Y(l)},d),m()}function O(l,d){const M=a(d);l.socket=M,M.onopen=()=>{l.socket===M&&(l.attempts=0,l.settled&&D(l),l.settled=!0,m())},M.onmessage=()=>{l.socket===M&&D(l)},M.onerror=()=>{},M.onclose=()=>{if(l.socket!==M)return;l.socket=void 0;const L=l.channelId;if(l.channelId=void 0,Q(L),!w(l)){m();return}l.attempts+=1,q(l)}}async function Y(l){if(C||l.opening||l.socket||l.retryTimer!==void 0||!I||!j()||l.listeners.size===0)return;l.opening=!0,m();let d;try{d=await K(l.topic)}catch{if(l.opening=!1,!w(l))return;l.attempts+=1,q(l);return}if(l.opening=!1,!w(l)){Q(d.id);return}l.channelId=d.id,O(l,h(d.receiveFrom))}function W(l,d){const M=$u(l);let L=x.get(M);return L||(L={topic:M,listeners:new Set,attempts:0,opening:!1,settled:!1},x.set(M,L)),L.listeners.add(d),ue(),!L.socket&&!L.opening&&L.retryTimer===void 0&&(L.attempts=0,Y(L)),m(),()=>{const $=x.get(M);!$||!$.listeners.delete(d)||($.listeners.size===0&&(x.delete(M),R($),x.size===0&&N()),m())}}function te(){for(const l of x.values())R(l);m()}function J(){if(x.size===0)return!1;const l=Date.now();if(l-F<A)return!1;F=l;for(const d of x.values())d.attempts=0;return!0}function ce(){if(J()){for(const l of x.values())l.socket!==void 0||l.opening||(l.retryTimer!==void 0&&(clearTimeout(l.retryTimer),l.retryTimer=void 0),Y(l));m()}}function re(){J();for(const l of x.values())Y(l);m()}const de=()=>{j()?re():te()},se=()=>{ce()};function ue(){k||C||(k=!0,I=e.session?e.session.getSnapshot().status==="authenticated":!0,n?.addEventListener("visibilitychange",de),s?.addEventListener("pagehide",te),i?.addEventListener("online",se),i?.addEventListener("focus",se),P=e.session?.subscribe(l=>{const d=l.status==="authenticated";d!==I&&(I=d,I?re():te())}))}function N(){k&&(k=!1,n?.removeEventListener("visibilitychange",de),s?.removeEventListener("pagehide",te),i?.removeEventListener("online",se),i?.removeEventListener("focus",se),P?.(),P=void 0)}return{watch:W,getState:()=>B,subscribeState(l){return U.add(l),()=>{U.delete(l)}},dispose(){if(!C){C=!0,N();for(const l of x.values())R(l);x.clear(),m()}}}}const oa=Vu({renderToaster:!1}),Ur=oa.manifest.contributes.applets[0]?.appId,ca=Ur?oa.applets[Ur]:void 0;if(!ca)throw new Error("AI Connection extension did not contribute an applet");const sd=ca;function ad(e,t){const n=za({runtime:e}),s=e.currentPod?.podUrl??e.selectedStorage?.storageUrl??e.podUrl,i=e.currentPod?{status:"ready",current:e.currentPod}:e.podError?{status:"error",error:e.podError.error}:e.state.status==="authenticated"?{status:"opening"}:e.state.status==="error"?{status:"error",error:e.state.error}:{status:"unavailable"},a=window.fetch.bind(window),c={getSnapshot:()=>e.session.getSnapshot(),subscribe:h=>e.session.subscribe(h),fetch:e.fetch},p=rd({fetch:e.fetch,session:c,document:typeof document>"u"?null:document,resolveLocalUrl:h=>e.resolveLocalUrl?.(h)??h});return{solid:{session:c,pod:i,permissions:{...wc({fetch:e.fetch})},requireLogin:async()=>{await n.startLogin()}},navigation:{openExternal:async h=>{window.open(h,"_blank","noopener,noreferrer")}},capabilities:{solidNotifications:p,podCollections:e.currentPod?zu({database:e.currentPod.database,podUrl:e.currentPod.podUrl,feed:p}):void 0,aiClientCredentials:t?.controls?.account?.clientCredentials&&t.bindAccountCapability?Ja({collection:t.controls.account.clientCredentials,assertCurrent:t.bindAccountCapability(),accountIndex:t.idpIndex,fetch:a}):void 0,aiConnectionsPodStore:e.currentPod?ai({database:e.currentPod.database,authenticatedFetch:e.fetch,podUrl:e.currentPod.podUrl,webId:e.currentPod.webId}):void 0,aiClientConfiguration:s&&(globalThis.xpodDesktop!==void 0||e.aiClientConfiguration?.available===!0&&e.aiClientConfiguration.authority==="local-filesystem")?ti({podUrl:s,controlPlaneOrigin:window.location.origin,authenticatedFetch:e.fetch,invocationFetch:a}):void 0}}}function id(e){const t=f.useContext(Va),n=f.useMemo(()=>ad(e,t),[e,t]);return f.useMemo(()=>{const s=Bc(sd,n);if(s.layout!=="two-pane")throw new Error("AI Connection applet must use a two-pane layout");return s},[n])}function od(){const e=Ga(),t=id(e);return r.jsx(Wa,{listHeader:t.slots.listHeader,list:t.slots.list,mainHeader:t.slots.mainHeader,main:t.slots.main,mode:"auto"})}const gd=Object.freeze(Object.defineProperty({__proto__:null,default:od},Symbol.toStringTag,{value:"Module"}));export{gd as M,Wc as c};