chainlesschain 0.162.157 → 0.162.159

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 (212) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/src/assets/web-panel/.build-hash +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-CfMP2Oud.js → AIOps-ByIiF5bT.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-Zu0N8BQL.js → ActionButton-NlgSFZq5.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-DZTwj5T_.js → Analytics-D17cOUcb.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-CVFJh47v.js → AppLayout-B4mEZcbl.js} +5 -5
  8. package/src/assets/web-panel/assets/Artifacts-CASsmyQw.js +1 -0
  9. package/src/assets/web-panel/assets/Artifacts-CTVt96zW.css +1 -0
  10. package/src/assets/web-panel/assets/{Audit-BMfiLj7T.js → Audit-DYAia2e2.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-BslPCdGF.js → BackgroundAgents-C1lvYUSu.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-CQ_fMC1r.js → Backup-B6agK6bA.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-CsFsARiC.js → BaseInput-DM43R2vy.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-CwfBobco.js → Chat-Dtdp3eXp.js} +6 -6
  15. package/src/assets/web-panel/assets/Chat-KSGPtU0L.css +1 -0
  16. package/src/assets/web-panel/assets/{ChatBubbleRenderer-K6Nf3xeN.js → ChatBubbleRenderer-BL5c_OQ1.js} +1 -1
  17. package/src/assets/web-panel/assets/{Checkbox-DkSyjjPp.js → Checkbox-D2xf7uZt.js} +1 -1
  18. package/src/assets/web-panel/assets/{Codegen-B7Fx3zZ6.js → Codegen-D3j45jJL.js} +1 -1
  19. package/src/assets/web-panel/assets/{Col-Dzfqn8Ep.js → Col-voPJ9fUZ.js} +1 -1
  20. package/src/assets/web-panel/assets/{Community-DhHPdzMM.js → Community-DEsyTESF.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compact-Ct18_8y7.js → Compact-OHV_QXLD.js} +1 -1
  22. package/src/assets/web-panel/assets/{Compliance-CY64IqBi.js → Compliance-eDTJWC-J.js} +1 -1
  23. package/src/assets/web-panel/assets/{Cowork-BYSmWlUl.js → Cowork-BBvy-6d1.js} +2 -2
  24. package/src/assets/web-panel/assets/{Cron-_4xtP3Ug.js → Cron-Dw2eoJxu.js} +2 -2
  25. package/src/assets/web-panel/assets/{Crosschain-B4qY-Ycr.js → Crosschain-DQHms_Bh.js} +1 -1
  26. package/src/assets/web-panel/assets/{DID-CkCzWkx1.js → DID-Cyu7Id1c.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dashboard-C1scT7Ke.js → Dashboard-sIDzkG92.js} +2 -2
  28. package/src/assets/web-panel/assets/{Dropdown-DBnQ2EWd.js → Dropdown-DUW3T2ey.js} +1 -1
  29. package/src/assets/web-panel/assets/{EmailListRenderer-C9JhOTq0.js → EmailListRenderer-CECELXW8.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CWXv5RUv.js → FamilyGuardDashboard-BIZR37ov.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-fYdcbz9W.js → Federation-BEZIQX84.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-CJqOT3Yj.js → FormItemContext-BcdUMznL.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-DGCsHc5K.js → GenericCardRenderer-DsN_fr5H.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-EH2K-H0Q.js → Git-63LhjBx2.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-DJn1X2pR.js → Governance-CYtQtIcH.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-Dch1E8qd.js → Inference-BwR6UUox.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-QIur8j8-.js → KnowledgeGraph-D9lVNTUA.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-DUgHldPg.js → Logs-C4q5h7Ut.js} +2 -2
  39. package/src/assets/web-panel/assets/MarkdownRenderer-DbzhFwvz.css +1 -0
  40. package/src/assets/web-panel/assets/MarkdownRenderer-DexLlXfN.js +1 -0
  41. package/src/assets/web-panel/assets/{Marketplace-DafrSfvd.js → Marketplace-Plksliuw.js} +1 -1
  42. package/src/assets/web-panel/assets/{McpTools-D2xRbfJx.js → McpTools-DZUFfeuG.js} +3 -3
  43. package/src/assets/web-panel/assets/{Memory-C6RbVHAo.js → Memory-NoDYt29V.js} +2 -2
  44. package/src/assets/web-panel/assets/{MobileBridge-BPtVBKqn.js → MobileBridge-CEXGTkdh.js} +1 -1
  45. package/src/assets/web-panel/assets/{MobileProjects-Cuw832cr.js → MobileProjects-DnbJkbZo.js} +1 -1
  46. package/src/assets/web-panel/assets/{Mtc-D6O9fWFa.js → Mtc-DTAa0cwy.js} +5 -5
  47. package/src/assets/web-panel/assets/{MtcAudit-CWZcXIH1.js → MtcAudit-CVV7LnNS.js} +4 -4
  48. package/src/assets/web-panel/assets/{Multisig-DhIBxTFd.js → Multisig-BqqGrjt_.js} +3 -3
  49. package/src/assets/web-panel/assets/{NLProgramming-wkBFS33e.js → NLProgramming-C4WP8DRp.js} +1 -1
  50. package/src/assets/web-panel/assets/{Notes-B09FxncA.js → Notes-Zo4DJUVI.js} +3 -3
  51. package/src/assets/web-panel/assets/{NotificationSettings-oQwtH6-9.js → NotificationSettings-DBcjRaz2.js} +1 -1
  52. package/src/assets/web-panel/assets/OrderTableRenderer-BCQel9bD.js +1 -0
  53. package/src/assets/web-panel/assets/{Organization-CsF-NIjz.js → Organization-BT9WPBOX.js} +4 -4
  54. package/src/assets/web-panel/assets/{Overflow-bLxv9Dqi.js → Overflow-D6b4bZ3q.js} +1 -1
  55. package/src/assets/web-panel/assets/{P2P-DVwQtm4q.js → P2P-Cw3OsYx-.js} +2 -2
  56. package/src/assets/web-panel/assets/{PdhVaultBrowser-Bgic3QKm.js → PdhVaultBrowser-C0nyiK2b.js} +4 -4
  57. package/src/assets/web-panel/assets/{Permissions-as80-9ep.js → Permissions-zVBZEB_C.js} +3 -3
  58. package/src/assets/web-panel/assets/{PersonalDataHub-BGmUw36a.js → PersonalDataHub-BOspsFew.js} +2 -2
  59. package/src/assets/web-panel/assets/{Pipeline-BM96zBxG.js → Pipeline-CQWfZ4XH.js} +1 -1
  60. package/src/assets/web-panel/assets/{Privacy-BBOzBSWe.js → Privacy-C2oGJ_WL.js} +1 -1
  61. package/src/assets/web-panel/assets/{ProjectInit-GHX41V28.js → ProjectInit-BZMR4qY1.js} +2 -2
  62. package/src/assets/web-panel/assets/{ProjectSettings-DraqzxKD.js → ProjectSettings-DAujoP63.js} +2 -2
  63. package/src/assets/web-panel/assets/{Projects-BzzdUml4.js → Projects-DvH_P2Uq.js} +1 -1
  64. package/src/assets/web-panel/assets/{Providers-CSeYNAtW.js → Providers-D_RGHM-v.js} +1 -1
  65. package/src/assets/web-panel/assets/{QrScannerModal-DlzBCdXh.js → QrScannerModal-Mf6KfL2J.js} +1 -1
  66. package/src/assets/web-panel/assets/{QuickAsk-p8iB7od_.js → QuickAsk-5D8URoI_.js} +1 -1
  67. package/src/assets/web-panel/assets/{Recommend-DjOVXacd.js → Recommend-Df4kC8Gy.js} +1 -1
  68. package/src/assets/web-panel/assets/RemoteSession-DGi3f3vO.js +4 -0
  69. package/src/assets/web-panel/assets/{Reputation-CjT3M0Di.js → Reputation-jmkGFNWb.js} +1 -1
  70. package/src/assets/web-panel/assets/{Row-tw8m6T0c.js → Row-DP6Pcu3m.js} +1 -1
  71. package/src/assets/web-panel/assets/{RssFeed-B47KBx_f.js → RssFeed-D60hSuPO.js} +3 -3
  72. package/src/assets/web-panel/assets/{Search-D2sx1PBe.js → Search-0mf1BQUK.js} +1 -1
  73. package/src/assets/web-panel/assets/{Security-JmtL8g7D.js → Security-CfZtLFYV.js} +3 -3
  74. package/src/assets/web-panel/assets/{Services-BxrNqjin.js → Services-D9zpZLWz.js} +2 -2
  75. package/src/assets/web-panel/assets/{Skeleton-udk8L18t.js → Skeleton-D1_44eMD.js} +1 -1
  76. package/src/assets/web-panel/assets/{Skills-DooLT9of.js → Skills-cVFa8zkz.js} +1 -1
  77. package/src/assets/web-panel/assets/{Sla-ITVZE1xI.js → Sla-Cinpzc3L.js} +1 -1
  78. package/src/assets/web-panel/assets/{SpeechSettings-DCkfqY1n.js → SpeechSettings-bqdiJE_P.js} +1 -1
  79. package/src/assets/web-panel/assets/{SyncSettings-CkNlgFjM.js → SyncSettings-Dgl_SLgj.js} +2 -2
  80. package/src/assets/web-panel/assets/{Tasks-BMAoyCM_.js → Tasks-DawWAEhy.js} +1 -1
  81. package/src/assets/web-panel/assets/{Templates-BnrFTlrz.js → Templates-Ca0nY651.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tenant-BjNsy3-i.js → Tenant-CgaGEhLm.js} +1 -1
  83. package/src/assets/web-panel/assets/{Terminal-C0gxLL7V.js → Terminal-D-9EnpRx.js} +2 -2
  84. package/src/assets/web-panel/assets/{TimelineRenderer-CUtj_KHA.js → TimelineRenderer-CSOxDHZ6.js} +1 -1
  85. package/src/assets/web-panel/assets/{Tokens-DOg61zlq.js → Tokens-BpwLZpL3.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trigger-D4ldCewj.js → Trigger-DgowwBK5.js} +1 -1
  87. package/src/assets/web-panel/assets/{Trust-3lk_Zd8j.js → Trust-BZutapjE.js} +1 -1
  88. package/src/assets/web-panel/assets/{UkeySign-kWhFR6Li.js → UkeySign-QZPt8_Sp.js} +1 -1
  89. package/src/assets/web-panel/assets/{VideoEditing-D3GOFVWg.js → VideoEditing-DlQx5UDJ.js} +1 -1
  90. package/src/assets/web-panel/assets/{Wallet-DzrZfBuh.js → Wallet-ZfdTgtWA.js} +4 -4
  91. package/src/assets/web-panel/assets/{WebAuthn-CyVJVp_g.js → WebAuthn-CAp0y_Cr.js} +5 -5
  92. package/src/assets/web-panel/assets/{WorkflowEditor-i_b0wi9b.js → WorkflowEditor-BVITZEmr.js} +1 -1
  93. package/src/assets/web-panel/assets/{chat-DwPCK8I7.js → chat-CC2tPaNg.js} +1 -1
  94. package/src/assets/web-panel/assets/{colors-D0vaVqZU.js → colors-31brc9CA.js} +1 -1
  95. package/src/assets/web-panel/assets/{compact-item-Don7nGW2.js → compact-item-DLMkC9C-.js} +1 -1
  96. package/src/assets/web-panel/assets/{createContext-D84R5qy2.js → createContext-BMtveI6F.js} +1 -1
  97. package/src/assets/web-panel/assets/devWarning-CB8pPOtd.js +1 -0
  98. package/src/assets/web-panel/assets/{hasIn-BeUqVVKU.js → hasIn-DbD6WHW2.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-m9bn0F1p.js → index-3oBsXZmF.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CfYRv-zA.js → index-ALvoNTRF.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-4MkfPLGv.js → index-AaIKG60c.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-LMo9bBLJ.js → index-BFRLmCR3.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-wesQQ2cH.js → index-BKAB6-6V.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CzT56x-_.js → index-BOM-VFlv.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-L73NrmlW.js → index-BPpS-lGb.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-WRw1pM5E.js → index-Bbc2JeQG.js} +1 -1
  107. package/src/assets/web-panel/assets/index-BhXiaiev.js +1 -0
  108. package/src/assets/web-panel/assets/{index-Br3SOdER.js → index-BiRQUoyE.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-D8r7WKk-.js → index-BnFLzejT.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CAdCTTBC.js → index-BoO4WEJB.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-BlfTf0ka.js → index-C-cGlCDW.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-B57al0Z5.js → index-C1PfeI88.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-D4b5XqIy.js → index-C21pdBqs.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CnnxzIx0.js → index-C7LHNw_N.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BNpJf-sf.js → index-CEXa-4zd.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DT40zd7K.js → index-CEwjBA9q.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CL71rIwo.js → index-CFXKbOek.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-BZ1N07Sp.js → index-CJhREOlG.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-C0_sKVi7.js → index-COHHQ9cU.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-DBzBLX-K.js → index-CUmLMFsy.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-De85D9Pc.js → index-CWgfipcC.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-x7VYlV41.js → index-C_eUKGYP.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-hjgrIX5I.js → index-CcVszn2b.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DMT8n9vB.js → index-Cod97Urs.js} +3 -3
  125. package/src/assets/web-panel/assets/{index-DFFzwrNs.js → index-Cwbqh0KZ.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-YKLCotoo.js → index-D67kIagl.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-IGGttsCv.js → index-D7cV0tu0.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DQor_7NF.js → index-DJvxFyIz.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-D84BnuFg.js → index-DZl-UXB6.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CrnVEEQO.js → index-Dm0byjm1.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-BER98o4P.js → index-DndNnYc0.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DA0-EJKx.js → index-WQUO2vvK.js} +1 -1
  133. package/src/assets/web-panel/assets/index-WpaYaE3D.js +1 -0
  134. package/src/assets/web-panel/assets/{index-CExWtm98.js → index-bdaJwTXJ.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-MKZrJrP_.js → index-ep6JchNG.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-7QUwcGTg.js → index-jG6h22Qg.js} +1 -1
  137. package/src/assets/web-panel/assets/{index-BohrJpBf.js → index-ntVQqSML.js} +1 -1
  138. package/src/assets/web-panel/assets/{initDefaultProps-DGeU4vPS.js → initDefaultProps-D5UoBRhN.js} +1 -1
  139. package/src/assets/web-panel/assets/{motion-Dgqj9ab3.js → motion-DltOw0CR.js} +1 -1
  140. package/src/assets/web-panel/assets/{move-BFyEU6Lr.js → move-_oPkk5zj.js} +1 -1
  141. package/src/assets/web-panel/assets/{mtc-parser-CueCXXPC.js → mtc-parser-EES8ROCS.js} +1 -1
  142. package/src/assets/web-panel/assets/{omit-D2pU5OyE.js → omit-B-_39x_M.js} +1 -1
  143. package/src/assets/web-panel/assets/{pickAttrs-CKTf6zD6.js → pickAttrs-l6D0yJHz.js} +1 -1
  144. package/src/assets/web-panel/assets/{placementArrow-DieJaGCN.js → placementArrow-DIeUK31L.js} +1 -1
  145. package/src/assets/web-panel/assets/{responsiveObserve-Bxr-rmU6.js → responsiveObserve-dG4EzUQo.js} +1 -1
  146. package/src/assets/web-panel/assets/{slide-CDEDk3Se.js → slide-DWFzYGdH.js} +1 -1
  147. package/src/assets/web-panel/assets/{statusUtils-icf2eCTx.js → statusUtils-CECdTA5H.js} +1 -1
  148. package/src/assets/web-panel/assets/{styleChecker-qKvgmBhE.js → styleChecker-D6kP-mMK.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFlexGapSupport-1_UhiyJZ.js → useFlexGapSupport-BWfna_rd.js} +1 -1
  150. package/src/assets/web-panel/assets/{useFs-CFGLXDWh.js → useFs-Bb-j6rzo.js} +1 -1
  151. package/src/assets/web-panel/assets/{usePersonalDataHub-UafOXvQ6.js → usePersonalDataHub-D5OIsYM4.js} +1 -1
  152. package/src/assets/web-panel/assets/{vnode-BfPqSx79.js → vnode-DNpwzFTM.js} +1 -1
  153. package/src/assets/web-panel/assets/{zoom-CXsVcRB6.js → zoom-vNLpFQBW.js} +1 -1
  154. package/src/assets/web-panel/index.html +1 -1
  155. package/src/command-manifest.json +17 -3
  156. package/src/commands/agent.js +11 -1
  157. package/src/commands/background-session.js +143 -3
  158. package/src/commands/browse.js +86 -0
  159. package/src/commands/cloud.js +232 -0
  160. package/src/commands/doctor.js +61 -6
  161. package/src/commands/mcp.js +61 -0
  162. package/src/commands/plugin.js +63 -1
  163. package/src/commands/routine.js +367 -0
  164. package/src/commands/session.js +326 -0
  165. package/src/data/changelog.json +12 -2
  166. package/src/harness/jsonl-session-store.js +82 -2
  167. package/src/harness/session-index.js +295 -0
  168. package/src/harness/session-mirror.js +142 -0
  169. package/src/harness/transcript-integrity.js +182 -0
  170. package/src/index.js +8 -0
  171. package/src/lib/background-agent-supervisor.js +126 -2
  172. package/src/lib/channels/channel-manager.js +126 -0
  173. package/src/lib/channels/telegram-channel.js +112 -0
  174. package/src/lib/channels/webhook-channel.js +140 -0
  175. package/src/lib/chrome-connector.js +425 -4
  176. package/src/lib/cloud/bundle.js +110 -0
  177. package/src/lib/cloud/cloud-client.js +152 -0
  178. package/src/lib/computer-use/authorization.js +173 -0
  179. package/src/lib/computer-use/computer-use-server.js +276 -0
  180. package/src/lib/computer-use/control-backend.js +150 -0
  181. package/src/lib/doctor-checkup.js +652 -0
  182. package/src/lib/jsonl-session-store.js +4 -0
  183. package/src/lib/lsp/lsp-server-registry.js +48 -21
  184. package/src/lib/plugin-runtime/governance.js +174 -0
  185. package/src/lib/pr-link-ledger.js +221 -0
  186. package/src/lib/remote-control.js +35 -0
  187. package/src/lib/routine-store.js +352 -0
  188. package/src/lib/session-store-guard.js +40 -0
  189. package/src/lib/session-usage.js +318 -2
  190. package/src/lib/sub-agent-context.js +23 -0
  191. package/src/lib/web-ui-server.js +120 -7
  192. package/src/repl/agent-repl.js +592 -61
  193. package/src/repl/bg-dashboard.js +355 -0
  194. package/src/repl/fast-mode.js +103 -0
  195. package/src/repl/fullscreen-tui.js +197 -0
  196. package/src/repl/remote-approval.js +111 -0
  197. package/src/repl/slash-command-registry.js +11 -3
  198. package/src/repl/voice-dictation.js +132 -0
  199. package/src/runtime/agent-core.js +278 -1
  200. package/src/runtime/coding-agent-contract-shared.cjs +141 -0
  201. package/src/runtime/coding-agent-policy.cjs +33 -0
  202. package/src/runtime/headless-runner.js +71 -7
  203. package/src/runtime/headless-stream.js +14 -8
  204. package/src/runtime/policies/agent-policy.js +6 -0
  205. package/src/assets/web-panel/assets/Artifacts-BbN5V7au.js +0 -1
  206. package/src/assets/web-panel/assets/Artifacts-CRkepl4t.css +0 -1
  207. package/src/assets/web-panel/assets/Chat-DDh58PCf.css +0 -1
  208. package/src/assets/web-panel/assets/OrderTableRenderer-iFKeNf6Y.js +0 -1
  209. package/src/assets/web-panel/assets/RemoteSession-CIGk7gk-.js +0 -4
  210. package/src/assets/web-panel/assets/devWarning-BBwWehQ7.js +0 -1
  211. package/src/assets/web-panel/assets/index-DJ8etkBT.js +0 -1
  212. package/src/assets/web-panel/assets/index-OeaK-zXZ.js +0 -1
@@ -1005,6 +1005,147 @@ const CODING_AGENT_TOOL_CONTRACTS = Object.freeze([
1005
1005
  ],
1006
1006
  },
1007
1007
  },
1008
+ {
1009
+ name: "browser_state",
1010
+ title: "Browser State",
1011
+ kind: "browser",
1012
+ tier: "extension",
1013
+ description:
1014
+ "Capture live state from the user's real Chrome over CDP: current URL/title, open tabs, console messages and failed/error network requests observed during a short watch window, a capped DOM snapshot, and optionally a screenshot (saved to a temp file whose path is returned). Requires a debuggable Chrome — the user starts one with `cc browse chrome launch`. Console/network capture starts at attach time (CDP keeps no history) — set reload=true to observe load-time errors. Use to verify web changes in the user's logged-in browser.",
1015
+ inputSchema: {
1016
+ type: "object",
1017
+ properties: {
1018
+ port: {
1019
+ type: "number",
1020
+ description: "CDP port of the debuggable Chrome (default 9222)",
1021
+ },
1022
+ tab: {
1023
+ type: "number",
1024
+ description: "Tab index to observe (default 0)",
1025
+ },
1026
+ reload: {
1027
+ type: "boolean",
1028
+ description:
1029
+ "Reload the page first to capture load-time console/network (default false)",
1030
+ },
1031
+ watch_ms: {
1032
+ type: "number",
1033
+ description: "Observation window in milliseconds (default 3000)",
1034
+ },
1035
+ include_dom: {
1036
+ type: "boolean",
1037
+ description: "Include a capped HTML snapshot (default true)",
1038
+ },
1039
+ dom_cap: {
1040
+ type: "number",
1041
+ description: "Max HTML characters to return (default 40000)",
1042
+ },
1043
+ screenshot: {
1044
+ type: "boolean",
1045
+ description:
1046
+ "Save a screenshot to a generated temp file and return its path (default false)",
1047
+ },
1048
+ },
1049
+ required: [],
1050
+ },
1051
+ ...TOOL_POLICY_METADATA.browser_state,
1052
+ permissions: {
1053
+ level: "standard",
1054
+ scopes: ["browser:read"],
1055
+ },
1056
+ telemetry: {
1057
+ category: "browser",
1058
+ tags: ["tool:browser_state", "contract:coding-agent", "tier:extension"],
1059
+ },
1060
+ },
1061
+ {
1062
+ name: "browser_act",
1063
+ title: "Browser Actions",
1064
+ kind: "browser",
1065
+ tier: "extension",
1066
+ description:
1067
+ "Perform EXPLICIT actions in the user's connected Chrome over loopback CDP: click, type, press, navigate (http/https only), waitForSelector, screenshot (saved to a generated temp path — never a chosen one), assertText. Approval-gated (HIGH risk): use browser_state first to observe; only act when the task genuinely requires driving the browser. Steps run in order and fail fast unless continue_on_error; each returns {ok, action, detail, durationMs} and every executed step is audit-logged under ~/.chainlesschain/browser-actions/. Requires a debuggable Chrome (`cc browse chrome launch`).",
1068
+ inputSchema: {
1069
+ type: "object",
1070
+ properties: {
1071
+ actions: {
1072
+ type: "array",
1073
+ description:
1074
+ "Ordered action steps. Each item: {type: click|type|press|navigate|waitForSelector|screenshot|assertText} plus its fields — click/waitForSelector/assertText need selector; type needs selector+text; press needs key; navigate needs url (http/https); waitForSelector accepts timeout_ms (capped 30000); assertText needs expected (substring); screenshot takes NO path (generated internally).",
1075
+ items: {
1076
+ type: "object",
1077
+ properties: {
1078
+ type: {
1079
+ type: "string",
1080
+ enum: [
1081
+ "click",
1082
+ "type",
1083
+ "press",
1084
+ "navigate",
1085
+ "waitForSelector",
1086
+ "screenshot",
1087
+ "assertText",
1088
+ ],
1089
+ description: "Action kind",
1090
+ },
1091
+ selector: {
1092
+ type: "string",
1093
+ description:
1094
+ "CSS selector (click/type/waitForSelector/assertText)",
1095
+ },
1096
+ text: { type: "string", description: "Text to type (type)" },
1097
+ key: {
1098
+ type: "string",
1099
+ description: "Key to press, e.g. Enter (press)",
1100
+ },
1101
+ url: {
1102
+ type: "string",
1103
+ description: "http(s):// URL to open (navigate)",
1104
+ },
1105
+ timeout_ms: {
1106
+ type: "number",
1107
+ description:
1108
+ "waitForSelector timeout in ms (default 5000, max 30000)",
1109
+ },
1110
+ expected: {
1111
+ type: "string",
1112
+ description: "Expected substring (assertText)",
1113
+ },
1114
+ },
1115
+ required: ["type"],
1116
+ },
1117
+ },
1118
+ cdp_url: {
1119
+ type: "string",
1120
+ description:
1121
+ "CDP endpoint — loopback-only, e.g. http://127.0.0.1:9222 (default port 9222)",
1122
+ },
1123
+ port: {
1124
+ type: "number",
1125
+ description: "CDP port of the debuggable Chrome (default 9222)",
1126
+ },
1127
+ tab: {
1128
+ type: "number",
1129
+ description: "Tab index to act in (default 0)",
1130
+ },
1131
+ continue_on_error: {
1132
+ type: "boolean",
1133
+ description:
1134
+ "Keep executing remaining steps after a failed one (default false: fail fast)",
1135
+ },
1136
+ },
1137
+ required: ["actions"],
1138
+ },
1139
+ ...TOOL_POLICY_METADATA.browser_act,
1140
+ permissions: {
1141
+ level: "elevated",
1142
+ scopes: ["browser:act"],
1143
+ },
1144
+ telemetry: {
1145
+ category: "browser",
1146
+ tags: ["tool:browser_act", "contract:coding-agent", "tier:extension"],
1147
+ },
1148
+ },
1008
1149
  ]);
1009
1150
 
1010
1151
  const CODING_AGENT_MVP_TOOL_NAMES = Object.freeze(
@@ -304,6 +304,39 @@ const TOOL_POLICY_METADATA = Object.freeze({
304
304
  approvalFlow: "auto",
305
305
  isReadOnly: false,
306
306
  },
307
+ // Attaches to the user's own debuggable Chrome over loopback CDP and
308
+ // observes one tab (console/network/DOM/optional screenshot) for a bounded
309
+ // window. Observation only — it never clicks, types, or navigates; the
310
+ // optional reload re-runs the page the user already has open, and the
311
+ // screenshot goes to a generated temp path (never an agent-chosen one), so
312
+ // the tool stays read-only and plan-mode safe.
313
+ browser_state: {
314
+ riskLevel: RISK_LEVELS.LOW,
315
+ category: TOOL_CATEGORIES.READ,
316
+ availableInPlanMode: true,
317
+ planModeBehavior: "allow",
318
+ requiresPlanApproval: false,
319
+ requiresConfirmation: false,
320
+ approvalFlow: "auto",
321
+ isReadOnly: true,
322
+ },
323
+ // DRIVES the user's connected Chrome over loopback CDP — clicks, typing,
324
+ // key presses, navigation, screenshots, text assertions. Unlike
325
+ // browser_state (pure observation, the default) this mutates the page and
326
+ // acts inside whatever session that browser is logged into, so it carries
327
+ // the same gating as run_shell/run_code: HIGH risk (the ApprovalGate
328
+ // CONFIRMs HIGH even on the trusted/auto tier, so auto mode still prompts),
329
+ // blocked in plan mode, plan approval + explicit confirmation required.
330
+ browser_act: {
331
+ riskLevel: RISK_LEVELS.HIGH,
332
+ category: TOOL_CATEGORIES.EXECUTE,
333
+ availableInPlanMode: false,
334
+ planModeBehavior: "blocked",
335
+ requiresPlanApproval: true,
336
+ requiresConfirmation: true,
337
+ approvalFlow: "policy",
338
+ isReadOnly: false,
339
+ },
307
340
  });
308
341
 
309
342
  function normalizeGitCommand(command) {
@@ -42,10 +42,12 @@ import {
42
42
  appendUserMessage as jsonlAppendUserMessage,
43
43
  appendAssistantMessage as jsonlAppendAssistantMessage,
44
44
  appendTokenUsage as jsonlAppendTokenUsage,
45
+ appendToolCallCompact as jsonlAppendToolCallCompact,
45
46
  appendCompactEvent as jsonlAppendCompactEvent,
46
47
  rebuildMessages as jsonlRebuildMessages,
47
48
  sessionExists as jsonlSessionExists,
48
49
  getLastSessionId as jsonlGetLastSessionId,
50
+ verifySession as jsonlVerifySession,
49
51
  } from "../harness/jsonl-session-store.js";
50
52
  import { expandFileRefsAsync } from "./file-ref-expander.js";
51
53
  import { composeSystemPrompt } from "./system-prompt.js";
@@ -436,8 +438,11 @@ export async function runAgentHeadless(options = {}, deps = {}) {
436
438
  appendAssistantMessage:
437
439
  deps.appendAssistantMessage || jsonlAppendAssistantMessage,
438
440
  appendTokenUsage: deps.appendTokenUsage || jsonlAppendTokenUsage,
441
+ appendToolCallCompact:
442
+ deps.appendToolCallCompact || jsonlAppendToolCallCompact,
439
443
  appendCompactEvent: deps.appendCompactEvent || jsonlAppendCompactEvent,
440
444
  getLastSessionId: deps.getLastSessionId || jsonlGetLastSessionId,
445
+ verifySession: deps.verifySession || jsonlVerifySession,
441
446
  };
442
447
  const isStream = outputFormat === "stream-json";
443
448
  const isJson = outputFormat === "json";
@@ -626,6 +631,30 @@ export async function runAgentHeadless(options = {}, deps = {}) {
626
631
  // never duplicated.
627
632
  let history = [];
628
633
  if (resumeId && store.sessionExists(resumeId)) {
634
+ // Tamper gate: a broken transcript hash chain means the file was edited
635
+ // outside the store. Headless runs fail closed — a tampered transcript is
636
+ // never silently rebuilt into trusted model context. Escape hatch:
637
+ // CC_ALLOW_TAMPERED_RESUME=1 resumes with a stderr warning.
638
+ let trust = null;
639
+ try {
640
+ trust = store.verifySession(resumeId);
641
+ } catch {
642
+ trust = null; // verification unavailable → keep legacy behaviour
643
+ }
644
+ if (trust && trust.status === "tampered") {
645
+ if (process.env.CC_ALLOW_TAMPERED_RESUME !== "1") {
646
+ const msg =
647
+ `Session ${resumeId} transcript failed integrity verification (${trust.reason}` +
648
+ (trust.firstInvalidLine ? ` at line ${trust.firstInvalidLine}` : "") +
649
+ `). Refusing to resume tampered context; run 'cc session verify ${resumeId}', or set CC_ALLOW_TAMPERED_RESUME=1 to override.`;
650
+ emitHeadlessError(msg);
651
+ writeErr(msg + "\n");
652
+ return { exitCode: 1, result: msg, isError: true };
653
+ }
654
+ writeErr(
655
+ `⚠ Resuming a TAMPERED transcript (${trust.reason}) — restored context is untrusted.\n`,
656
+ );
657
+ }
629
658
  try {
630
659
  history = (store.rebuildMessages(resumeId) || []).filter(
631
660
  (m) => m && m.role !== "system",
@@ -1114,6 +1143,12 @@ export async function runAgentHeadless(options = {}, deps = {}) {
1114
1143
  cache_read_input_tokens: 0,
1115
1144
  cache_creation_input_tokens: 0,
1116
1145
  };
1146
+ // 用量归因: attributed child-loop usage (spawn_sub_agent / isolated
1147
+ // run_skill). Kept OUT of the `usage` accumulator above so the result
1148
+ // envelope and the end-of-run aggregate token_usage event keep their
1149
+ // long-standing "main loop only" semantics — the attributed records are
1150
+ // persisted as their own token_usage events instead (no double count).
1151
+ const attributedUsage = [];
1117
1152
  let finalText = "";
1118
1153
  let endReason = "complete";
1119
1154
  let stopForCost = false;
@@ -1274,13 +1309,26 @@ export async function runAgentHeadless(options = {}, deps = {}) {
1274
1309
  break;
1275
1310
  }
1276
1311
  case "token-usage": {
1277
- usage.input_tokens += event.usage?.input_tokens || 0;
1278
- usage.output_tokens += event.usage?.output_tokens || 0;
1279
- // Carry prompt-cache tokens into accumulated usage (cost accuracy).
1280
- usage.cache_read_input_tokens +=
1281
- event.usage?.cache_read_input_tokens || 0;
1282
- usage.cache_creation_input_tokens +=
1283
- event.usage?.cache_creation_input_tokens || 0;
1312
+ if (event.attribution) {
1313
+ // Child-loop (sub-agent / isolated-skill) spend: excluded from
1314
+ // the main `usage` envelope, persisted with its attribution
1315
+ // frame below, but still counted toward the cost budget — it
1316
+ // is real money on the same key.
1317
+ attributedUsage.push({
1318
+ provider: event.provider ?? null,
1319
+ model: event.model ?? null,
1320
+ usage: event.usage || null,
1321
+ attribution: event.attribution,
1322
+ });
1323
+ } else {
1324
+ usage.input_tokens += event.usage?.input_tokens || 0;
1325
+ usage.output_tokens += event.usage?.output_tokens || 0;
1326
+ // Carry prompt-cache tokens into accumulated usage (cost accuracy).
1327
+ usage.cache_read_input_tokens +=
1328
+ event.usage?.cache_read_input_tokens || 0;
1329
+ usage.cache_creation_input_tokens +=
1330
+ event.usage?.cache_creation_input_tokens || 0;
1331
+ }
1284
1332
  emitStream({ type: "token_usage", usage: event.usage });
1285
1333
  if (costBudget) {
1286
1334
  costBudget.add({
@@ -1539,6 +1587,22 @@ export async function runAgentHeadless(options = {}, deps = {}) {
1539
1587
  if (persist && !isError) {
1540
1588
  try {
1541
1589
  if (finalText) store.appendAssistantMessage(sessionId, finalText);
1590
+ // 用量归因: compact per-tool records (name + error flag + skill hint —
1591
+ // never args) so `cc session usage --by tool|mcp` can aggregate
1592
+ // headless sessions too.
1593
+ for (const tc of toolCalls) {
1594
+ store.appendToolCallCompact(sessionId, {
1595
+ tool: tc.tool,
1596
+ isError: Boolean(tc.is_error),
1597
+ skill:
1598
+ tc.tool === "run_skill" ? tc.args?.skill_name || null : undefined,
1599
+ });
1600
+ }
1601
+ // Attributed child-loop usage first (chronology: it happened during
1602
+ // the run), then the unchanged main-loop aggregate.
1603
+ for (const au of attributedUsage) {
1604
+ store.appendTokenUsage(sessionId, au);
1605
+ }
1542
1606
  store.appendTokenUsage(sessionId, usage);
1543
1607
  } catch {
1544
1608
  // Persistence is best-effort — never fail the run over it.
@@ -494,14 +494,20 @@ async function runTurn(messages, loopOptions, { runLoop, emit, costBudget }) {
494
494
  break;
495
495
  }
496
496
  case "token-usage":
497
- usage.input_tokens += event.usage?.input_tokens || 0;
498
- usage.output_tokens += event.usage?.output_tokens || 0;
499
- // Carry prompt-cache tokens into the turn's accumulated usage so the
500
- // final `result` envelope (read by IDE panels) reflects caching too.
501
- usage.cache_read_input_tokens +=
502
- event.usage?.cache_read_input_tokens || 0;
503
- usage.cache_creation_input_tokens +=
504
- event.usage?.cache_creation_input_tokens || 0;
497
+ // 用量归因: attributed child-loop usage (sub-agent / isolated skill)
498
+ // is forwarded on the stream (same wire shape) and counted toward the
499
+ // cost budget, but stays out of the turn's `usage` envelope, which
500
+ // keeps its long-standing main-loop-only semantics.
501
+ if (!event.attribution) {
502
+ usage.input_tokens += event.usage?.input_tokens || 0;
503
+ usage.output_tokens += event.usage?.output_tokens || 0;
504
+ // Carry prompt-cache tokens into the turn's accumulated usage so the
505
+ // final `result` envelope (read by IDE panels) reflects caching too.
506
+ usage.cache_read_input_tokens +=
507
+ event.usage?.cache_read_input_tokens || 0;
508
+ usage.cache_creation_input_tokens +=
509
+ event.usage?.cache_creation_input_tokens || 0;
510
+ }
505
511
  emit({ type: "token_usage", usage: event.usage });
506
512
  if (costBudget) {
507
513
  costBudget.add({
@@ -56,6 +56,12 @@ export function resolveAgentPolicy({
56
56
  pdh: overrides.pdh,
57
57
  outputStyle: overrides.outputStyle,
58
58
  disableSlashCommands: overrides.disableSlashCommands === true,
59
+ // --remote-control also applies interactively: the REPL starts the
60
+ // paired-device approval bridge at startup (批26).
61
+ remoteControl: overrides.remoteControl === true,
62
+ // --channels: inbound channel listeners (webhook/telegram) whose events
63
+ // become user turns in the interactive session (gap-2026-07-11 P0#5).
64
+ channels: overrides.channels || null,
59
65
  };
60
66
  }
61
67
 
@@ -1 +0,0 @@
1
- import{E as V,b as z,r as b,I as w,J as y,U as m,c as i,K as r,S as A,V as S,o as F,f as N,P as d,Q as p,R as v,F as O}from"./vendor-Bn1JzzAn.js";import{u as h,_ as M,d as I}from"./index-DMT8n9vB.js";import{R as U}from"./icons-DG5UD-6K.js";const E=V("artifacts",()=>{const x=b([]),n=b(!1),u=b(""),e=b(""),f=b(null),_=b(!1),C=z(()=>[...new Set(x.value.map(a=>a.kind).filter(Boolean))].sort());async function s(){const t=h();n.value=!0;try{const a={type:"artifact-list"};u.value&&(a.kind=u.value),e.value&&(a.session=e.value);const o=await t.sendRaw(a);o&&Array.isArray(o.artifacts)&&(x.value=[...o.artifacts].reverse())}catch{}finally{n.value=!1}}async function l(t){const a=h();_.value=!0,f.value={entry:t,previewable:!1};try{const o=await a.sendRaw({type:"artifact-content",artifactId:t.id});f.value={entry:t,previewable:o?.previewable===!0,encoding:o?.encoding||null,content:o?.content||"",truncated:o?.truncated===!0,reason:o?.reason||null}}catch(o){f.value={entry:t,previewable:!1,reason:o?.message||"preview failed"}}finally{_.value=!1}}function k(){f.value=null}const g=z(()=>{const t=f.value;return!t?.previewable||t.encoding!=="base64"?null:`data:${t.entry?.mime||"image/png"};base64,${t.content}`});async function R(t){const a=h();if(!t)return!1;try{const o=await a.sendRaw({type:"artifact-remove",artifactId:t});return f.value?.entry?.id===t&&(f.value=null),await s(),o?.found===!0}catch{return!1}}async function B(){const t=h();try{const a=await t.sendRaw({type:"artifact-clean"});return await s(),Number(a?.removed)||0}catch{return 0}}function P(t){const a=Number(t)||0;return a<1024?`${a} B`:a<1024*1024?`${(a/1024).toFixed(1)} KB`:`${(a/(1024*1024)).toFixed(1)} MB`}function c(t){switch(t){case"report":return"blue";case"patch":return"purple";case"screenshot":return"cyan";case"log":return"default";case"data":return"green";default:return"default"}}return{artifacts:x,loading:n,kindFilter:u,sessionFilter:e,kinds:C,preview:f,previewLoading:_,previewImageSrc:g,fetchArtifacts:s,openPreview:l,closePreview:k,removeArtifact:R,cleanExpired:B,formatSize:P,kindColor:c}}),J={__name:"Artifacts",setup(x,{expose:n}){n();const u=E(),e=[{title:"标题",key:"title",dataIndex:"title",ellipsis:!0},{title:"类型",key:"kind",dataIndex:"kind",width:110},{title:"MIME",dataIndex:"mime",width:160,ellipsis:!0},{title:"大小",key:"size",dataIndex:"size",width:90},{title:"发布时间",key:"createdAt",dataIndex:"createdAt",width:170},{title:"会话",dataIndex:"sessionId",width:160,ellipsis:!0},{title:"操作",key:"actions",width:150}],f=z(()=>u.kinds.map(l=>({label:l,value:l})));async function _(l){await u.removeArtifact(l)?I.success("已删除"):I.error("删除失败")}async function C(){const l=await u.cleanExpired();I.info(l>0?`清理了 ${l} 个过期交付物`:"没有过期交付物")}F(()=>{u.fetchArtifacts()}),N(()=>{u.closePreview()});const s={store:u,columns:e,kindOptions:f,onRemove:_,onClean:C,computed:z,onBeforeUnmount:N,onMounted:F,get ReloadOutlined(){return U},get message(){return I},get useArtifactsStore(){return E}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}},K={class:"page-header"},L=["onClick"],T=["src"],j={key:1,class:"preview-text"},D={class:"preview-meta"},Q={key:0};function W(x,n,u,e,f,_){const C=w("a-select"),s=w("a-button"),l=w("a-popconfirm"),k=w("a-space"),g=w("a-tag"),R=w("a-table"),B=w("a-empty"),P=w("a-card");return d(),y("div",null,[m("div",K,[n[6]||(n[6]=m("div",null,[m("h2",{class:"page-title"},"交付物"),m("p",{class:"page-sub"}," agent 用 publish_artifact 发布的交付物(报告 / patch / 截图 / 日志),在这里预览与管理(cc artifacts 同源)。 ")],-1)),i(k,null,{default:r(()=>[i(C,{value:e.store.kindFilter,"onUpdate:value":n[0]||(n[0]=c=>e.store.kindFilter=c),style:{"min-width":"120px"},placeholder:"全部类型","allow-clear":"",options:e.kindOptions,onChange:n[1]||(n[1]=c=>e.store.fetchArtifacts())},null,8,["value","options"]),i(l,{title:"删除所有过期交付物?",onConfirm:e.onClean},{default:r(()=>[i(s,null,{default:r(()=>[...n[4]||(n[4]=[p("清理过期",-1)])]),_:1})]),_:1}),i(s,{ghost:"",loading:e.store.loading,onClick:n[2]||(n[2]=c=>e.store.fetchArtifacts())},{icon:r(()=>[i(e.ReloadOutlined)]),default:r(()=>[n[5]||(n[5]=p(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),i(R,{"data-source":e.store.artifacts,columns:e.columns,"row-key":"id",size:"small",pagination:{pageSize:10,hideOnSinglePage:!0}},{bodyCell:r(({column:c,record:t})=>[c.key==="title"?(d(),y("a",{key:0,onClick:a=>e.store.openPreview(t)},v(t.title),9,L)):c.key==="kind"?(d(),A(g,{key:1,color:e.store.kindColor(t.kind)},{default:r(()=>[p(v(t.kind),1)]),_:2},1032,["color"])):c.key==="size"?(d(),y(O,{key:2},[p(v(e.store.formatSize(t.size)),1)],64)):c.key==="createdAt"?(d(),y(O,{key:3},[p(v((t.createdAt||"").replace("T"," ").slice(0,19)),1)],64)):c.key==="actions"?(d(),A(k,{key:4},{default:r(()=>[i(s,{size:"small",onClick:a=>e.store.openPreview(t)},{default:r(()=>[...n[7]||(n[7]=[p("预览",-1)])]),_:1},8,["onClick"]),i(l,{title:"删除该交付物?",onConfirm:a=>e.onRemove(t.id)},{default:r(()=>[i(s,{size:"small",danger:""},{default:r(()=>[...n[8]||(n[8]=[p("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])]),_:2},1024)):S("v-if",!0)]),_:1},8,["data-source"]),e.store.preview?(d(),A(P,{key:0,size:"small",class:"preview-card",loading:e.store.previewLoading},{title:r(()=>[i(k,null,{default:r(()=>[m("span",null,v(e.store.preview.entry?.title),1),i(g,{color:e.store.kindColor(e.store.preview.entry?.kind)},{default:r(()=>[p(v(e.store.preview.entry?.kind),1)]),_:1},8,["color"]),i(g,{color:"default"},{default:r(()=>[p(v(e.store.preview.entry?.mime),1)]),_:1}),e.store.preview.truncated?(d(),A(g,{key:0,color:"warning"},{default:r(()=>[...n[9]||(n[9]=[p("已截断预览",-1)])]),_:1})):S("v-if",!0)]),_:1})]),extra:r(()=>[i(s,{size:"small",onClick:n[3]||(n[3]=c=>e.store.closePreview())},{default:r(()=>[...n[10]||(n[10]=[p("关闭",-1)])]),_:1})]),default:r(()=>[e.store.previewImageSrc?(d(),y("img",{key:0,src:e.store.previewImageSrc,class:"preview-image",alt:"artifact preview"},null,8,T)):e.store.preview.previewable?(d(),y("pre",j,v(e.store.preview.content||"(空文件)"),1)):(d(),A(B,{key:2,description:e.store.preview.reason||"该类型不支持在线预览,可在本机用 cc artifacts open <id> 打开"},null,8,["description"])),m("div",D,[m("span",null,v(e.store.preview.entry?.id),1),e.store.preview.entry?.sessionId?(d(),y("span",Q," · session "+v(e.store.preview.entry.sessionId),1)):S("v-if",!0),m("span",null," · sha256 "+v((e.store.preview.entry?.sha256||"").slice(0,12))+"…",1)])]),_:1},8,["loading"])):S("v-if",!0)])}const X=M(J,[["render",W],["__scopeId","data-v-c8b48f8c"],["__file","/tmp/cc-web-panel-i5N2Ja/repo/packages/web-panel/src/views/Artifacts.vue"]]);export{X as default};
@@ -1 +0,0 @@
1
- .page-header[data-v-c8b48f8c]{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:16px}.preview-card[data-v-c8b48f8c]{margin-top:16px}.preview-text[data-v-c8b48f8c]{max-height:480px;overflow:auto;white-space:pre-wrap;word-break:break-word;font-size:12px;margin:0}.preview-image[data-v-c8b48f8c]{max-width:100%;max-height:480px;display:block}.preview-meta[data-v-c8b48f8c]{margin-top:8px;color:#808080cc;font-size:12px}
@@ -1 +0,0 @@
1
- .cb-action[data-v-318f1edb]{display:flex;align-items:center;gap:10px;padding:10px 14px;border-radius:10px;background:var(--bg-card-hover);border:1px solid var(--border-color);color:var(--text-secondary);-webkit-user-select:none;user-select:none}.cb-action--expandable[data-v-318f1edb]{cursor:pointer;transition:border-color .15s ease}.cb-action--expandable[data-v-318f1edb]:hover{border-color:#1677ff40}.cb-action--open[data-v-318f1edb]{border-color:#1677ff60}.cb-action__icon[data-v-318f1edb]{display:inline-flex;align-items:center;justify-content:center;color:#52c41a;font-size:14px}.cb-action--running .cb-action__icon[data-v-318f1edb]{color:#1677ff}.cb-action--pending .cb-action__icon[data-v-318f1edb]{color:var(--text-muted)}.cb-action__label[data-v-318f1edb]{font-weight:600;color:var(--text-primary);font-size:13px}.cb-action__detail[data-v-318f1edb]{margin-left:auto;font-size:12px;color:var(--text-secondary);max-width:45%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cb-action__caret[data-v-318f1edb]{margin-left:6px;color:var(--text-muted);font-size:10px}.cb-action--open .cb-action__caret[data-v-318f1edb]{color:#1677ff}.markdown-content[data-v-0b0b9f63] pre{background:var(--bg-base);border-radius:6px;padding:12px;overflow-x:auto;font-size:12px}.markdown-content[data-v-0b0b9f63] code:not(pre code){background:var(--bg-card-hover);padding:1px 5px;border-radius:3px;font-size:12px;color:#f0a500}.markdown-content[data-v-0b0b9f63] p{margin:0 0 8px}.markdown-content[data-v-0b0b9f63] p:last-child{margin:0}.markdown-content[data-v-0b0b9f63] table{border-collapse:collapse;width:100%;font-size:13px}.markdown-content[data-v-0b0b9f63] th,.markdown-content[data-v-0b0b9f63] td{border:1px solid #333;padding:6px 12px}.markdown-content[data-v-0b0b9f63] th{background:var(--bg-card-hover)}.virtual-message-list[data-v-ff0bed80]{height:100%;overflow-y:auto;overflow-x:hidden}.fallback-list[data-v-ff0bed80]{width:100%}.virtual-message-list[data-v-ff0bed80]::-webkit-scrollbar{width:6px}.virtual-message-list[data-v-ff0bed80]::-webkit-scrollbar-track{background:transparent}.virtual-message-list[data-v-ff0bed80]::-webkit-scrollbar-thumb{background:var(--border-color, #c1c1c1);border-radius:3px}.virtual-message-list[data-v-ff0bed80]::-webkit-scrollbar-thumb:hover{background:var(--text-muted, #a8a8a8)}.intent-confirmation-message[data-v-62ebcfe5]{padding:16px;margin:12px 0;background:linear-gradient(135deg,#1890ff14,#1890ff05);border-left:4px solid #1890ff;border-radius:8px}.confirmation-header[data-v-62ebcfe5]{display:flex;align-items:center;gap:12px;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid rgba(24,144,255,.2)}.header-icon[data-v-62ebcfe5]{font-size:20px}.header-text[data-v-62ebcfe5]{font-size:15px;font-weight:600;color:#1890ff}.understanding-content[data-v-62ebcfe5]{display:flex;flex-direction:column;gap:12px;margin-bottom:16px}.original-input[data-v-62ebcfe5],.corrected-input[data-v-62ebcfe5],.intent-section[data-v-62ebcfe5],.key-points-section[data-v-62ebcfe5],.correction-section[data-v-62ebcfe5]{display:flex;flex-direction:column;gap:6px}.label[data-v-62ebcfe5]{font-size:13px;font-weight:600;color:var(--text-secondary, #aaa)}.value[data-v-62ebcfe5]{font-size:14px;color:var(--text-primary, #ddd);line-height:1.6}.original-text[data-v-62ebcfe5]{padding:8px 12px;background:#ffffff0a;border-radius:6px;border:1px dashed var(--border-color, #555);text-decoration:line-through;color:var(--text-muted, #888)}.corrected-text[data-v-62ebcfe5]{padding:8px 12px;background:#52c41a14;border-radius:6px;border:1px solid #52c41a;font-weight:500}.correction-text[data-v-62ebcfe5]{padding:8px 12px;background:#faad1414;border-radius:6px;border:1px solid #faad14;font-weight:500}.key-points-list[data-v-62ebcfe5]{margin:0;padding-left:20px;list-style:disc}.key-points-list li[data-v-62ebcfe5]{margin:4px 0;font-size:14px;line-height:1.6}.action-buttons[data-v-62ebcfe5]{display:flex;gap:12px;margin-top:16px;padding-top:12px;border-top:1px solid rgba(24,144,255,.2)}.streaming-indicator[data-v-62ebcfe5]{display:flex;align-items:center;gap:8px;margin-top:16px;padding-top:12px;border-top:1px solid rgba(24,144,255,.2);font-size:13px;color:var(--text-secondary, #aaa)}.streaming-tokens[data-v-62ebcfe5]{font-size:11px;color:var(--text-muted, #888)}.correction-input-section[data-v-62ebcfe5]{margin-top:16px;padding-top:16px;border-top:1px solid rgba(24,144,255,.2)}.correction-actions[data-v-62ebcfe5]{display:flex;gap:8px;margin-top:12px}.session-item[data-v-ef077a5e]{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:8px;cursor:pointer;transition:background .15s;margin-bottom:4px}.session-item[data-v-ef077a5e]:hover{background:var(--bg-card-hover)}.session-item.active[data-v-ef077a5e]{background:#1677ff20;border:1px solid #1677ff40}.session-icon[data-v-ef077a5e]{font-size:16px}.session-info[data-v-ef077a5e]{flex:1;min-width:0}.session-title[data-v-ef077a5e]{color:#ccc;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.session-meta[data-v-ef077a5e]{color:var(--text-muted);font-size:11px;margin-top:2px}.chat-header[data-v-ef077a5e]{display:flex;align-items:center;justify-content:flex-start;gap:16px;padding:10px 16px;border-bottom:1px solid var(--border-color);flex-shrink:0}.chat-intent-toggle[data-v-ef077a5e]{display:inline-flex;align-items:center;gap:6px;cursor:pointer;-webkit-user-select:none;user-select:none}.chat-intent-toggle-label[data-v-ef077a5e]{font-size:12px;color:var(--text-muted)}.chat-area-body[data-v-ef077a5e]{flex:1;display:flex;flex-direction:column;overflow:hidden;padding:16px 20px 0}.empty-hint[data-v-ef077a5e]{font-size:12px;color:var(--text-muted);margin-top:-4px}.chat-virtual-list[data-v-ef077a5e]{flex:1}.chat-empty-prompts[data-v-ef077a5e]{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--text-muted);gap:12px}.empty-icon[data-v-ef077a5e]{font-size:40px}.empty-title[data-v-ef077a5e]{font-size:14px;color:var(--text-secondary, #aaa)}.quick-prompts[data-v-ef077a5e]{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;max-width:480px;margin-top:8px}.quick-prompt-btn[data-v-ef077a5e]{font-size:12px}.message-row[data-v-ef077a5e]{margin-bottom:16px;padding:0 4px}.msg-with-avatar[data-v-ef077a5e]{display:flex;gap:10px;align-items:flex-start}.msg-with-avatar.user[data-v-ef077a5e]{flex-direction:row-reverse}.msg-with-avatar.user .msg-meta-row[data-v-ef077a5e]{justify-content:flex-end}.msg-with-avatar.user .msg-body[data-v-ef077a5e]{display:flex;flex-direction:column;align-items:flex-end}.msg-body[data-v-ef077a5e]{flex:1;min-width:0;max-width:calc(100% - 50px)}.msg-meta-row[data-v-ef077a5e]{display:flex;gap:6px;align-items:baseline;font-size:11px;color:var(--text-muted);margin-bottom:4px}.msg-role[data-v-ef077a5e]{color:var(--text-secondary, #aaa);font-weight:500}.msg-time[data-v-ef077a5e],.msg-tokens[data-v-ef077a5e]{font-size:10px}.bubble[data-v-ef077a5e]{padding:10px 14px;border-radius:12px;max-width:100%;line-height:1.6;font-size:14px;word-wrap:break-word}.bubble.user[data-v-ef077a5e]{background:#1677ff;color:var(--text-primary);border-bottom-right-radius:4px}.bubble.assistant[data-v-ef077a5e]{background:var(--bg-card-hover);color:var(--text-primary);border-bottom-left-radius:4px}.bubble.streaming[data-v-ef077a5e]:after{content:"▋";animation:blink-ef077a5e .7s step-start infinite;color:#1677ff}@keyframes blink-ef077a5e{50%{opacity:0}}.system-banner[data-v-ef077a5e]{margin:8px 0;padding:10px 14px;background:var(--bg-card-hover);border-left:3px solid #722ed1;border-radius:6px;font-size:13px;color:var(--text-secondary, #aaa);white-space:pre-wrap}.tool-msg[data-v-ef077a5e]{margin:8px 0}.tool-detail[data-v-ef077a5e]{margin-top:6px;padding:10px 12px;border:1px solid var(--border-color);border-radius:8px;background:var(--bg-base)}.tool-detail__result[data-v-ef077a5e]{margin-top:8px;padding-top:8px;border-top:1px solid var(--border-color)}.tool-detail__pre[data-v-ef077a5e]{margin:0;font-size:11px;white-space:pre-wrap;word-break:break-all}.tool-detail__pre--input[data-v-ef077a5e]{color:#aaa}.tool-detail__pre--result[data-v-ef077a5e]{color:#52c41a}.question-card[data-v-ef077a5e]{background:var(--bg-card-hover);border:1px solid #1677ff40;border-radius:10px;padding:14px 16px;margin-top:8px}.question-text[data-v-ef077a5e]{color:#aaa;font-size:13px}[data-v-ef077a5e] .bubble.assistant pre{background:var(--bg-base);border-radius:6px;padding:12px;overflow-x:auto;font-size:12px}[data-v-ef077a5e] .bubble.assistant code:not(pre code){background:var(--bg-card-hover);padding:1px 5px;border-radius:3px;font-size:12px;color:#f0a500}[data-v-ef077a5e] .bubble.assistant p{margin:0 0 8px}[data-v-ef077a5e] .bubble.assistant p:last-child{margin:0}
@@ -1 +0,0 @@
1
- import{I as w,P as l,J as u,U as s,R as n,c as i,K as v,Q as _,V as g,b as a}from"./vendor-Bn1JzzAn.js";import{_ as N}from"./index-DMT8n9vB.js";import"./icons-DG5UD-6K.js";const S={__name:"OrderTableRenderer",props:{event:{type:Object,required:!0}},setup(p,{expose:r}){r();const o=p,e=a(()=>o.event.content||{}),d=a(()=>o.event.extra||{}),m=a(()=>d.value.merchant||e.value.merchant||e.value.counterparty||"—"),c=a(()=>e.value.title||e.value.name||e.value.itemName||e.value.text||"—"),y=a(()=>{const t=e.value.amount??e.value.price??e.value.total;return t==null?"—":`${e.value.currency||"¥"} ${typeof t=="number"?t.toFixed(2):t}`}),T=a(()=>d.value.orderNo||e.value.orderNo||e.value.orderId),f=a(()=>e.value.status||e.value.state),b=a(()=>{const t=(f.value||"").toLowerCase();return t.includes("成功")||t.includes("succe")||t.includes("paid")?"green":t.includes("退")||t.includes("refund")?"orange":t.includes("失败")||t.includes("fail")?"red":"default"}),h=a(()=>{if(!o.event.occurredAt)return"";const t=new Date(o.event.occurredAt);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}),x={props:o,c:e,e:d,merchantText:m,itemText:c,amountText:y,orderNo:T,statusText:f,statusColor:b,formattedTime:h,computed:a};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},k={class:"order-card"},C={class:"head"},O={class:"time"},V={class:"row"},R={class:"val"},B={class:"row"},D={class:"val"},I={class:"row amount-row"},j={class:"val amount"},A={key:0,class:"row"},F={class:"val mono"},J={key:1,class:"row"};function M(p,r,o,e,d,m){const c=w("a-tag");return l(),u("div",k,[s("div",C,[s("span",O,n(e.formattedTime),1),i(c,{color:"gold"},{default:v(()=>[_(n(o.event.source.adapter),1)]),_:1}),i(c,null,{default:v(()=>[_(n(o.event.subtype),1)]),_:1})]),s("div",V,[r[0]||(r[0]=s("span",{class:"key"},"商户",-1)),s("span",R,n(e.merchantText),1)]),s("div",B,[r[1]||(r[1]=s("span",{class:"key"},"商品/项目",-1)),s("span",D,n(e.itemText),1)]),s("div",I,[r[2]||(r[2]=s("span",{class:"key"},"金额",-1)),s("span",j,n(e.amountText),1)]),e.orderNo?(l(),u("div",A,[r[3]||(r[3]=s("span",{class:"key"},"单号",-1)),s("span",F,n(e.orderNo),1)])):g("v-if",!0),e.statusText?(l(),u("div",J,[r[4]||(r[4]=s("span",{class:"key"},"状态",-1)),i(c,{color:e.statusColor},{default:v(()=>[_(n(e.statusText),1)]),_:1},8,["color"])])):g("v-if",!0)])}const K=N(S,[["render",M],["__scopeId","data-v-5ed5524d"],["__file","/tmp/cc-web-panel-i5N2Ja/repo/packages/web-panel/src/components/pdh/renderers/OrderTableRenderer.vue"]]);export{K as default};
@@ -1,4 +0,0 @@
1
- import{E as Ln,r as nt,I as z,J as Tn,U as yt,c as U,K as L,S as lt,V as ve,a8 as Be,b as mt,P as it,Q as P,R as Se,a5 as kn}from"./vendor-Bn1JzzAn.js";import{Q as Un}from"./QrScannerModal-DlzBCdXh.js";import{_ as Nn}from"./index-DMT8n9vB.js";import{ax as qn,aC as Cn}from"./icons-DG5UD-6K.js";import"./markdown-CsiA8-E5.js";function Fn(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name==="Uint8Array"&&"BYTES_PER_ELEMENT"in e&&e.BYTES_PER_ELEMENT===1}function gt(e,t=""){if(typeof e!="number"){const n=t&&`"${t}" `;throw new TypeError(`${n}expected number, got ${typeof e}`)}if(!Number.isSafeInteger(e)||e<0){const n=t&&`"${t}" `;throw new RangeError(`${n}expected integer >= 0, got ${e}`)}}function W(e,t,n=""){const r=Fn(e),o=e?.length,s=t!==void 0;if(!r||s&&o!==t){const i=n&&`"${n}" `,f=s?` of length ${t}`:"",a=r?`length=${o}`:`type=${typeof e}`,c=i+"expected Uint8Array"+f+", got "+a;throw r?new RangeError(c):new TypeError(c)}return e}function ie(e){if(typeof e!="function"||typeof e.create!="function")throw new TypeError("Hash must wrapped by utils.createHasher");if(gt(e.outputLen),gt(e.blockLen),e.outputLen<1)throw new Error('"outputLen" must be >= 1');if(e.blockLen<1)throw new Error('"blockLen" must be >= 1')}function Ft(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function We(e,t){W(e,void 0,"digestInto() output");const n=t.outputLen;if(e.length<n)throw new RangeError('"digestInto() output" expected to be of length >='+n)}function St(...e){for(let t=0;t<e.length;t++)e[t].fill(0)}function Vt(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function V(e,t){return e<<32-t|e>>>t}const Qe=typeof Uint8Array.from([]).toHex=="function"&&typeof Uint8Array.fromHex=="function",Hn=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,"0"));function ce(e){if(W(e),Qe)return e.toHex();let t="";for(let n=0;n<e.length;n++)t+=Hn[e[n]];return t}const G={_0:48,_9:57,A:65,F:70,a:97,f:102};function _e(e){if(e>=G._0&&e<=G._9)return e-G._0;if(e>=G.A&&e<=G.F)return e-(G.A-10);if(e>=G.a&&e<=G.f)return e-(G.a-10)}function fe(e){if(typeof e!="string")throw new TypeError("hex string expected, got "+typeof e);if(Qe)try{return Uint8Array.fromHex(e)}catch(o){throw o instanceof SyntaxError?new RangeError(o.message):o}const t=e.length,n=t/2;if(t%2)throw new RangeError("hex string expected, got unpadded hex of length "+t);const r=new Uint8Array(n);for(let o=0,s=0;o<n;o++,s+=2){const i=_e(e.charCodeAt(s)),f=_e(e.charCodeAt(s+1));if(i===void 0||f===void 0){const a=e[s]+e[s+1];throw new RangeError('hex string expected, got non-hex character "'+a+'" at index '+s)}r[o]=i*16+f}return r}function Zn(e,t={}){const n=(o,s)=>e(s).update(o).digest(),r=e(void 0);return n.outputLen=r.outputLen,n.blockLen=r.blockLen,n.canXOF=r.canXOF,n.create=o=>e(o),Object.assign(n,t),Object.freeze(n)}function Dn(e=32){gt(e,"bytesLength");const t=typeof globalThis=="object"?globalThis.crypto:null;if(typeof t?.getRandomValues!="function")throw new Error("crypto.getRandomValues must be defined");if(e>65536)throw new RangeError(`"bytesLength" expected <= 65536, got ${e}`);return t.getRandomValues(new Uint8Array(e))}const $n=e=>({oid:Uint8Array.from([6,9,96,134,72,1,101,3,4,2,e])});function zn(e,t,n){return e&t^~e&n}function Yn(e,t,n){return e&t^e&n^t&n}class Mn{blockLen;outputLen;canXOF=!1;padOffset;isLE;buffer;view;finished=!1;length=0;pos=0;destroyed=!1;constructor(t,n,r,o){this.blockLen=t,this.outputLen=n,this.padOffset=r,this.isLE=o,this.buffer=new Uint8Array(t),this.view=Vt(this.buffer)}update(t){Ft(this),W(t);const{view:n,buffer:r,blockLen:o}=this,s=t.length;for(let i=0;i<s;){const f=Math.min(o-this.pos,s-i);if(f===o){const a=Vt(t);for(;o<=s-i;i+=o)this.process(a,i);continue}r.set(t.subarray(i,i+f),this.pos),this.pos+=f,i+=f,this.pos===o&&(this.process(n,0),this.pos=0)}return this.length+=t.length,this.roundClean(),this}digestInto(t){Ft(this),We(t,this),this.finished=!0;const{buffer:n,view:r,blockLen:o,isLE:s}=this;let{pos:i}=this;n[i++]=128,St(this.buffer.subarray(i)),this.padOffset>o-i&&(this.process(r,0),i=0);for(let l=i;l<o;l++)n[l]=0;r.setBigUint64(o-8,BigInt(this.length*8),s),this.process(r,0);const f=Vt(t),a=this.outputLen;if(a%4)throw new Error("_sha2: outputLen must be aligned to 32bit");const c=a/4,u=this.get();if(c>u.length)throw new Error("_sha2: outputLen bigger than state");for(let l=0;l<c;l++)f.setUint32(4*l,u[l],s)}digest(){const{buffer:t,outputLen:n}=this;this.digestInto(t);const r=t.slice(0,n);return this.destroy(),r}_cloneInto(t){t||=new this.constructor,t.set(...this.get());const{blockLen:n,buffer:r,length:o,finished:s,destroyed:i,pos:f}=this;return t.destroyed=i,t.finished=s,t.length=o,t.pos=f,o%n&&t.buffer.set(r),t}clone(){return this._cloneInto()}}const J=Uint32Array.from([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),jn=Uint32Array.from([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),tt=new Uint32Array(64);class Vn extends Mn{constructor(t){super(64,t,8,!1)}get(){const{A:t,B:n,C:r,D:o,E:s,F:i,G:f,H:a}=this;return[t,n,r,o,s,i,f,a]}set(t,n,r,o,s,i,f,a){this.A=t|0,this.B=n|0,this.C=r|0,this.D=o|0,this.E=s|0,this.F=i|0,this.G=f|0,this.H=a|0}process(t,n){for(let l=0;l<16;l++,n+=4)tt[l]=t.getUint32(n,!1);for(let l=16;l<64;l++){const w=tt[l-15],p=tt[l-2],m=V(w,7)^V(w,18)^w>>>3,y=V(p,17)^V(p,19)^p>>>10;tt[l]=y+tt[l-7]+m+tt[l-16]|0}let{A:r,B:o,C:s,D:i,E:f,F:a,G:c,H:u}=this;for(let l=0;l<64;l++){const w=V(f,6)^V(f,11)^V(f,25),p=u+w+zn(f,a,c)+jn[l]+tt[l]|0,y=(V(r,2)^V(r,13)^V(r,22))+Yn(r,o,s)|0;u=c,c=a,a=f,f=i+p|0,i=s,s=o,o=r,r=p+y|0}r=r+this.A|0,o=o+this.B|0,s=s+this.C|0,i=i+this.D|0,f=f+this.E|0,a=a+this.F|0,c=c+this.G|0,u=u+this.H|0,this.set(r,o,s,i,f,a,c,u)}roundClean(){St(tt)}destroy(){this.destroyed=!0,this.set(0,0,0,0,0,0,0,0),St(this.buffer)}}class Xn extends Vn{A=J[0]|0;B=J[1]|0;C=J[2]|0;D=J[3]|0;E=J[4]|0;F=J[5]|0;G=J[6]|0;H=J[7]|0;constructor(){super(32)}}const Ie=Zn(()=>new Xn,$n(1));const rt=(e,t,n)=>W(e,t,n),Je=gt,tn=ce,Kn=e=>fe(e),Pn=e=>Dn(e),Ht=BigInt(0),ee=BigInt(1);function en(e,t=""){if(typeof e!="boolean"){const n=t&&`"${t}" `;throw new TypeError(n+"expected boolean, got type="+typeof e)}return e}function Gn(e){if(typeof e=="bigint"){if(!qt(e))throw new RangeError("positive bigint expected, got "+e)}else Je(e);return e}function Re(e,t=""){if(typeof e!="number"){const n=t&&`"${t}" `;throw new TypeError(n+"expected number, got type="+typeof e)}if(!Number.isSafeInteger(e)){const n=t&&`"${t}" `;throw new RangeError(n+"expected safe integer, got "+e)}}function nn(e){if(typeof e!="string")throw new TypeError("hex string expected, got "+typeof e);return e===""?Ht:BigInt("0x"+e)}function Wn(e){return nn(ce(e))}function _t(e){return nn(ce(It(W(e)).reverse()))}function rn(e,t){if(gt(t),t===0)throw new RangeError("zero length");e=Gn(e);const n=e.toString(16);if(n.length>t*2)throw new RangeError("number too large");return fe(n.padStart(t*2,"0"))}function on(e,t){return rn(e,t).reverse()}function Qn(e,t){if(e=rt(e),t=rt(t),e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r++)n|=e[r]^t[r];return n===0}function It(e){return Uint8Array.from(rt(e))}const qt=e=>typeof e=="bigint"&&Ht<=e;function Jn(e,t,n){return qt(e)&&qt(t)&&qt(n)&&t<=e&&e<n}function Zt(e,t,n,r){if(!Jn(t,n,r))throw new RangeError("expected valid "+e+": "+n+" <= n < "+r+", got "+t)}function tr(e){if(e<Ht)throw new Error("expected non-negative bigint, got "+e);let t;for(t=0;e>Ht;e>>=ee,t+=1);return t}const er=e=>(ee<<BigInt(e))-ee;function ae(e,t={},n={}){if(Object.prototype.toString.call(e)!=="[object Object]")throw new TypeError("expected valid options object");function r(s,i,f){if(!f&&i!=="function"&&!Object.hasOwn(e,s))throw new TypeError(`param "${s}" is invalid: expected own property`);const a=e[s];if(f&&a===void 0)return;const c=typeof a;if(c!==i||a===null)throw new TypeError(`param "${s}" is invalid: expected ${i}, got ${c}`)}const o=(s,i)=>Object.entries(s).forEach(([f,a])=>r(f,a,i));o(t,!1),o(n,!0)}const Oe=()=>{throw new Error("not implemented")};const F=BigInt(0),q=BigInt(1),at=BigInt(2),sn=BigInt(3),cn=BigInt(4),fn=BigInt(5),nr=BigInt(7),an=BigInt(8),rr=BigInt(9),un=BigInt(16);function k(e,t){if(t<=F)throw new Error("mod: expected positive modulus, got "+t);const n=e%t;return n>=F?n:t+n}function M(e,t,n){if(t<F)throw new Error("pow2: expected non-negative exponent, got "+t);let r=e;for(;t-- >F;)r*=r,r%=n;return r}function Ae(e,t){if(e===F)throw new Error("invert: expected non-zero number");if(t<=F)throw new Error("invert: expected positive modulus, got "+t);let n=k(e,t),r=t,o=F,s=q;for(;n!==F;){const f=r/n,a=r-n*f,c=o-s*f;r=n,n=a,o=s,s=c}if(r!==q)throw new Error("invert: does not exist");return k(o,t)}function ue(e,t,n){const r=e;if(!r.eql(r.sqr(t),n))throw new Error("Cannot find square root")}function ln(e,t){const n=e,r=(n.ORDER+q)/cn,o=n.pow(t,r);return ue(n,o,t),o}function or(e,t){const n=e,r=(n.ORDER-fn)/an,o=n.mul(t,at),s=n.pow(o,r),i=n.mul(t,s),f=n.mul(n.mul(i,at),s),a=n.mul(i,n.sub(f,n.ONE));return ue(n,a,t),a}function sr(e){const t=le(e),n=dn(e),r=n(t,t.neg(t.ONE)),o=n(t,r),s=n(t,t.neg(r)),i=(e+nr)/un;return((f,a)=>{const c=f;let u=c.pow(a,i),l=c.mul(u,r);const w=c.mul(u,o),p=c.mul(u,s),m=c.eql(c.sqr(l),a),y=c.eql(c.sqr(w),a);u=c.cmov(u,l,m),l=c.cmov(p,w,y);const d=c.eql(c.sqr(l),a),g=c.cmov(u,l,d);return ue(c,g,a),g})}function dn(e){if(e<sn)throw new Error("sqrt is not defined for small field");let t=e-q,n=0;for(;t%at===F;)t/=at,n++;let r=at;const o=le(e);for(;Le(o,r)===1;)if(r++>1e3)throw new Error("Cannot find square root: probably non-prime P");if(n===1)return ln;let s=o.pow(r,t);const i=(t+q)/at;return function(a,c){const u=a;if(u.is0(c))return c;if(Le(u,c)!==1)throw new Error("Cannot find square root");let l=n,w=u.mul(u.ONE,s),p=u.pow(c,t),m=u.pow(c,i);for(;!u.eql(p,u.ONE);){if(u.is0(p))return u.ZERO;let y=1,d=u.sqr(p);for(;!u.eql(d,u.ONE);)if(y++,d=u.sqr(d),y===l)throw new Error("Cannot find square root");const g=q<<BigInt(l-y-1),h=u.pow(w,g);l=y,w=u.sqr(h),p=u.mul(p,w),m=u.mul(m,h)}return m}}function ir(e){return e%cn===sn?ln:e%an===fn?or:e%un===rr?sr(e):dn(e)}const ct=(e,t)=>(k(e,t)&q)===q,cr=["create","isValid","is0","neg","inv","sqrt","sqr","eql","add","sub","mul","pow","div","addN","subN","mulN","sqrN"];function fr(e){const t={ORDER:"bigint",BYTES:"number",BITS:"number"},n=cr.reduce((r,o)=>(r[o]="function",r),t);if(ae(e,n),Re(e.BYTES,"BYTES"),Re(e.BITS,"BITS"),e.BYTES<1||e.BITS<1)throw new Error("invalid field: expected BYTES/BITS > 0");if(e.ORDER<=q)throw new Error("invalid field: expected ORDER > 1, got "+e.ORDER);return e}function ar(e,t,n){const r=e;if(n<F)throw new Error("invalid exponent, negatives unsupported");if(n===F)return r.ONE;if(n===q)return t;let o=r.ONE,s=t;for(;n>F;)n&q&&(o=r.mul(o,s)),s=r.sqr(s),n>>=q;return o}function hn(e,t,n=!1){const r=e,o=new Array(t.length).fill(n?r.ZERO:void 0),s=t.reduce((f,a,c)=>r.is0(a)?f:(o[c]=f,r.mul(f,a)),r.ONE),i=r.inv(s);return t.reduceRight((f,a,c)=>r.is0(a)?f:(o[c]=r.mul(f,o[c]),r.mul(f,a)),i),o}function Le(e,t){const n=e,r=(n.ORDER-q)/at,o=n.pow(t,r),s=n.eql(o,n.ONE),i=n.eql(o,n.ZERO),f=n.eql(o,n.neg(n.ONE));if(!s&&!i&&!f)throw new Error("invalid Legendre symbol result");return s?1:i?0:-1}function ur(e,t){if(t!==void 0&&Je(t),e<=F)throw new Error("invalid n length: expected positive n, got "+e);if(t!==void 0&&t<1)throw new Error("invalid n length: expected positive bit length, got "+t);const n=tr(e);if(t!==void 0&&t<n)throw new Error(`invalid n length: expected bit length (${n}) >= n.length (${t})`);const r=t!==void 0?t:n,o=Math.ceil(r/8);return{nBitLength:r,nByteLength:o}}const Te=new WeakMap;class pn{ORDER;BITS;BYTES;isLE;ZERO=F;ONE=q;_lengths;_mod;constructor(t,n={}){if(t<=q)throw new Error("invalid field: expected ORDER > 1, got "+t);let r;this.isLE=!1,n!=null&&typeof n=="object"&&(typeof n.BITS=="number"&&(r=n.BITS),typeof n.sqrt=="function"&&Object.defineProperty(this,"sqrt",{value:n.sqrt,enumerable:!0}),typeof n.isLE=="boolean"&&(this.isLE=n.isLE),n.allowedLengths&&(this._lengths=Object.freeze(n.allowedLengths.slice())),typeof n.modFromBytes=="boolean"&&(this._mod=n.modFromBytes));const{nBitLength:o,nByteLength:s}=ur(t,r);if(s>2048)throw new Error("invalid field: expected ORDER of <= 2048 bytes");this.ORDER=t,this.BITS=o,this.BYTES=s,Object.freeze(this)}create(t){return k(t,this.ORDER)}isValid(t){if(typeof t!="bigint")throw new TypeError("invalid field element: expected bigint, got "+typeof t);return F<=t&&t<this.ORDER}is0(t){return t===F}isValidNot0(t){return!this.is0(t)&&this.isValid(t)}isOdd(t){return(t&q)===q}neg(t){return k(-t,this.ORDER)}eql(t,n){return t===n}sqr(t){return k(t*t,this.ORDER)}add(t,n){return k(t+n,this.ORDER)}sub(t,n){return k(t-n,this.ORDER)}mul(t,n){return k(t*n,this.ORDER)}pow(t,n){return ar(this,t,n)}div(t,n){return k(t*Ae(n,this.ORDER),this.ORDER)}sqrN(t){return t*t}addN(t,n){return t+n}subN(t,n){return t-n}mulN(t,n){return t*n}inv(t){return Ae(t,this.ORDER)}sqrt(t){let n=Te.get(this);return n||Te.set(this,n=ir(this.ORDER)),n(this,t)}toBytes(t){return this.isLE?on(t,this.BYTES):rn(t,this.BYTES)}fromBytes(t,n=!1){rt(t);const{_lengths:r,BYTES:o,isLE:s,ORDER:i,_mod:f}=this;if(r){if(t.length<1||!r.includes(t.length)||t.length>o)throw new Error("Field.fromBytes: expected "+r+" bytes, got "+t.length);const c=new Uint8Array(o);c.set(t,s?0:c.length-t.length),t=c}if(t.length!==o)throw new Error("Field.fromBytes: expected "+o+" bytes, got "+t.length);let a=s?_t(t):Wn(t);if(f&&(a=k(a,i)),!n&&!this.isValid(a))throw new Error("invalid field element: outside of range 0..ORDER");return a}invertBatch(t){return hn(this,t)}cmov(t,n,r){return en(r,"condition"),r?n:t}}Object.freeze(pn.prototype);function le(e,t={}){return new pn(e,t)}const Dt=BigInt(0),ne=BigInt(1);function ke(e,t){const n=t.negate();return e?n:t}function Xt(e,t){const n=hn(e.Fp,t.map(r=>r.Z));return t.map((r,o)=>e.fromAffine(r.toAffine(n[o])))}function gn(e,t){if(!Number.isSafeInteger(e)||e<=0||e>t)throw new Error("invalid window size, expected [1.."+t+"], got W="+e)}function Kt(e,t){gn(e,t);const n=Math.ceil(t/e)+1,r=2**(e-1),o=2**e,s=er(e),i=BigInt(e);return{windows:n,windowSize:r,mask:s,maxNumber:o,shiftBy:i}}function Ue(e,t,n){const{windowSize:r,mask:o,maxNumber:s,shiftBy:i}=n;let f=Number(e&o),a=e>>i;f>r&&(f-=s,a+=ne);const c=t*r,u=c+Math.abs(f)-1,l=f===0,w=f<0,p=t%2!==0;return{nextN:a,offset:u,isZero:l,isNeg:w,isNegF:p,offsetF:c}}const Pt=new WeakMap,wn=new WeakMap;function Gt(e){return wn.get(e)||1}function Ne(e){if(e!==Dt)throw new Error("invalid wNAF")}class lr{BASE;ZERO;Fn;bits;constructor(t,n){this.BASE=t.BASE,this.ZERO=t.ZERO,this.Fn=t.Fn,this.bits=n}_unsafeLadder(t,n,r=this.ZERO){let o=t;for(;n>Dt;)n&ne&&(r=r.add(o)),o=o.double(),n>>=ne;return r}precomputeWindow(t,n){const{windows:r,windowSize:o}=Kt(n,this.bits),s=[];let i=t,f=i;for(let a=0;a<r;a++){f=i,s.push(f);for(let c=1;c<o;c++)f=f.add(i),s.push(f);i=f.double()}return s}wNAF(t,n,r){if(!this.Fn.isValid(r))throw new Error("invalid scalar");let o=this.ZERO,s=this.BASE;const i=Kt(t,this.bits);for(let f=0;f<i.windows;f++){const{nextN:a,offset:c,isZero:u,isNeg:l,isNegF:w,offsetF:p}=Ue(r,f,i);r=a,u?s=s.add(ke(w,n[p])):o=o.add(ke(l,n[c]))}return Ne(r),{p:o,f:s}}wNAFUnsafe(t,n,r,o=this.ZERO){const s=Kt(t,this.bits);for(let i=0;i<s.windows&&r!==Dt;i++){const{nextN:f,offset:a,isZero:c,isNeg:u}=Ue(r,i,s);if(r=f,!c){const l=n[a];o=o.add(u?l.negate():l)}}return Ne(r),o}getPrecomputes(t,n,r){let o=Pt.get(n);return o||(o=this.precomputeWindow(n,t),t!==1&&(typeof r=="function"&&(o=r(o)),Pt.set(n,o))),o}cached(t,n,r){const o=Gt(t);return this.wNAF(o,this.getPrecomputes(o,t,r),n)}unsafe(t,n,r,o){const s=Gt(t);return s===1?this._unsafeLadder(t,n,o):this.wNAFUnsafe(s,this.getPrecomputes(s,t,r),n,o)}createCache(t,n){gn(n,this.bits),wn.set(t,n),Pt.delete(t)}hasCache(t){return Gt(t)!==1}}function qe(e,t,n){if(t){if(t.ORDER!==e)throw new Error("Field.ORDER must match order: Fp == p, Fn == n");return fr(t),t}else return le(e,{isLE:n})}function dr(e,t,n={},r){if(r===void 0&&(r=e==="edwards"),!t||typeof t!="object")throw new Error(`expected valid ${e} CURVE object`);for(const a of["p","n","h"]){const c=t[a];if(!(typeof c=="bigint"&&c>Dt))throw new Error(`CURVE.${a} must be positive bigint`)}const o=qe(t.p,n.Fp,r),s=qe(t.n,n.Fn,r),f=["Gx","Gy","a","d"];for(const a of f)if(!o.isValid(t[a]))throw new Error(`CURVE.${a} must be valid field element of CURVE.Fp`);return t=Object.freeze(Object.assign({},t)),{CURVE:t,Fp:o,Fn:s}}function hr(e,t){return function(r){const o=e(r);return{secretKey:o,publicKey:t(o)}}}const et=BigInt(0),Z=BigInt(1),Wt=BigInt(2),pr=BigInt(8);function gr(e,t,n,r){const o=e.sqr(n),s=e.sqr(r),i=e.add(e.mul(t.a,o),s),f=e.add(e.ONE,e.mul(t.d,e.mul(o,s)));return e.eql(i,f)}function wr(e,t={}){const n=t,r=dr("edwards",e,n,n.FpFnLE),{Fp:o,Fn:s}=r;let i=r.CURVE;const{h:f}=i;ae(n,{},{uvRatio:"function"});const a=Wt<<BigInt(s.BYTES*8)-Z,c=y=>o.create(y),u=n.uvRatio===void 0?(y,d)=>{try{return{isValid:!0,value:o.sqrt(o.div(y,d))}}catch{return{isValid:!1,value:et}}}:n.uvRatio;if(!gr(o,i,i.Gx,i.Gy))throw new Error("bad curve params: generator point");function l(y,d,g=!1){const h=g?Z:et;return Zt("coordinate "+y,d,h,a),d}function w(y){if(!(y instanceof p))throw new Error("EdwardsPoint expected")}class p{static BASE=new p(i.Gx,i.Gy,Z,c(i.Gx*i.Gy));static ZERO=new p(et,Z,Z,et);static Fp=o;static Fn=s;X;Y;Z;T;constructor(d,g,h,x){this.X=l("x",d),this.Y=l("y",g),this.Z=l("z",h,!0),this.T=l("t",x),Object.freeze(this)}static CURVE(){return i}static fromAffine(d){if(d instanceof p)throw new Error("extended point not allowed");const{x:g,y:h}=d||{};return l("x",g),l("y",h),new p(g,h,Z,c(g*h))}static fromBytes(d,g=!1){const h=o.BYTES,{a:x,d:v}=i;d=It(rt(d,h,"point")),en(g,"zip215");const _=It(d),A=d[h-1];_[h-1]=A&-129;const O=_t(_),E=g?a:o.ORDER;Zt("point.y",O,et,E);const R=c(O*O),C=c(R-Z),b=c(v*R-x);let{isValid:B,value:I}=u(C,b);if(!B)throw new Error("bad point: invalid y coordinate");const S=(I&Z)===Z,T=(A&128)!==0;if(!g&&I===et&&T)throw new Error("bad point: x=0 and x_0=1");return T!==S&&(I=c(-I)),p.fromAffine({x:I,y:O})}static fromHex(d,g=!1){return p.fromBytes(Kn(d),g)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}precompute(d=8,g=!0){return m.createCache(this,d),g||this.multiply(Wt),this}assertValidity(){const d=this,{a:g,d:h}=i;if(d.is0())throw new Error("bad point: ZERO");const{X:x,Y:v,Z:_,T:A}=d,O=c(x*x),E=c(v*v),R=c(_*_),C=c(R*R),b=c(O*g),B=c(R*c(b+E)),I=c(C+c(h*c(O*E)));if(B!==I)throw new Error("bad point: equation left != right (1)");const S=c(x*v),T=c(_*A);if(S!==T)throw new Error("bad point: equation left != right (2)")}equals(d){w(d);const{X:g,Y:h,Z:x}=this,{X:v,Y:_,Z:A}=d,O=c(g*A),E=c(v*x),R=c(h*A),C=c(_*x);return O===E&&R===C}is0(){return this.equals(p.ZERO)}negate(){return new p(c(-this.X),this.Y,this.Z,c(-this.T))}double(){const{a:d}=i,{X:g,Y:h,Z:x}=this,v=c(g*g),_=c(h*h),A=c(Wt*c(x*x)),O=c(d*v),E=g+h,R=c(c(E*E)-v-_),C=O+_,b=C-A,B=O-_,I=c(R*b),S=c(C*B),T=c(R*B),H=c(b*C);return new p(I,S,H,T)}add(d){w(d);const{a:g,d:h}=i,{X:x,Y:v,Z:_,T:A}=this,{X:O,Y:E,Z:R,T:C}=d,b=c(x*O),B=c(v*E),I=c(A*h*C),S=c(_*R),T=c((x+v)*(O+E)-b-B),H=S-I,st=S+I,Y=c(B-g*b),j=c(T*H),X=c(st*Y),K=c(T*Y),Q=c(H*st);return new p(j,X,Q,K)}subtract(d){return w(d),this.add(d.negate())}multiply(d){if(!s.isValidNot0(d))throw new RangeError("invalid scalar: expected 1 <= sc < curve.n");const{p:g,f:h}=m.cached(this,d,x=>Xt(p,x));return Xt(p,[g,h])[0]}multiplyUnsafe(d){if(!s.isValid(d))throw new RangeError("invalid scalar: expected 0 <= sc < curve.n");return d===et?p.ZERO:this.is0()||d===Z?this:m.unsafe(this,d,g=>Xt(p,g))}isSmallOrder(){return this.clearCofactor().is0()}isTorsionFree(){return m.unsafe(this,i.n).is0()}toAffine(d){const g=this;let h=d;const{X:x,Y:v,Z:_}=g,A=g.is0();h==null&&(h=A?pr:o.inv(_));const O=c(x*h),E=c(v*h),R=o.mul(_,h);if(A)return{x:et,y:Z};if(R!==Z)throw new Error("invZ was invalid");return{x:O,y:E}}clearCofactor(){return f===Z?this:this.multiplyUnsafe(f)}toBytes(){const{x:d,y:g}=this.toAffine(),h=o.toBytes(g);return h[h.length-1]|=d&Z?128:0,h}toHex(){return tn(this.toBytes())}toString(){return`<Point ${this.is0()?"ZERO":this.toHex()}>`}}const m=new lr(p,s.BITS);return s.BITS>=8&&p.BASE.precompute(8),Object.freeze(p.prototype),Object.freeze(p),p}class yr{static BASE;static ZERO;static Fp;static Fn;ep;constructor(t){this.ep=t}static fromBytes(t){Oe()}static fromHex(t){Oe()}get x(){return this.toAffine().x}get y(){return this.toAffine().y}clearCofactor(){return this}assertValidity(){this.ep.assertValidity()}toAffine(t){return this.ep.toAffine(t)}toHex(){return tn(this.toBytes())}toString(){return this.toHex()}isTorsionFree(){return!0}isSmallOrder(){return!1}add(t){return this.assertSame(t),this.init(this.ep.add(t.ep))}subtract(t){return this.assertSame(t),this.init(this.ep.subtract(t.ep))}multiply(t){return this.init(this.ep.multiply(t))}multiplyUnsafe(t){return this.init(this.ep.multiplyUnsafe(t))}double(){return this.init(this.ep.double())}negate(){return this.init(this.ep.negate())}precompute(t,n){return this.ep.precompute(t,n),this}}const bt=BigInt(0),dt=BigInt(1),At=BigInt(2);function mr(e){return ae(e,{P:"bigint",type:"string",adjustScalarBytes:"function",powPminus2:"function"},{randomBytes:"function"}),Object.freeze({...e})}function br(e){const t=mr(e),{P:n,type:r,adjustScalarBytes:o,powPminus2:s,randomBytes:i}=t,f=r==="x25519";if(!f&&r!=="x448")throw new Error("invalid type");const a=i===void 0?Pn:i,c=f?255:448,u=f?32:56,l=BigInt(f?9:5),w=BigInt(f?121665:39081),p=f?At**BigInt(254):At**BigInt(447),m=f?BigInt(8)*At**BigInt(251)-dt:BigInt(4)*At**BigInt(445)-dt,y=p+m+dt,d=S=>k(S,n),g=h(l);function h(S){return on(d(S),u)}function x(S){const T=It(rt(S,u,"uCoordinate"));return f&&(T[31]&=127),d(_t(T))}function v(S){return _t(o(It(rt(S,u,"scalar"))))}function _(S,T){const H=C(x(T),v(S));if(H===bt)throw new Error("invalid private or public key received");return h(H)}function A(S){return _(S,g)}const O=A,E=_;function R(S,T,H){const st=d(S*(T-H));return T=d(T-st),H=d(H+st),{x_2:T,x_3:H}}function C(S,T){Zt("u",S,bt,n),Zt("scalar",T,p,y);const H=T,st=S;let Y=dt,j=bt,X=S,K=dt,Q=bt;for(let zt=BigInt(c-1);zt>=bt;zt--){const ge=H>>zt&dt;Q^=ge,{x_2:Y,x_3:X}=R(Q,Y,X),{x_2:j,x_3:K}=R(Q,j,K),Q=ge;const Yt=Y+j,Mt=d(Yt*Yt),jt=Y-j,we=d(jt*jt),ye=Mt-we,On=X+K,An=X-K,me=d(An*Yt),be=d(On*jt),Ee=me+be,xe=me-be;X=d(Ee*Ee),K=d(st*d(xe*xe)),Y=d(Mt*we),j=d(ye*(Mt+d(w*ye)))}({x_2:Y,x_3:X}=R(Q,Y,X)),{x_2:j,x_3:K}=R(Q,j,K);const Rn=s(j);return d(Y*Rn)}const b={secretKey:u,publicKey:u,seed:u},B=S=>(S=S===void 0?a(u):S,rt(S,b.seed,"seed"),S),I={randomSecretKey:B};return Object.freeze(b),Object.freeze(I),Object.freeze({keygen:hr(B,O),getSharedSecret:E,getPublicKey:O,scalarMult:_,scalarMultBase:A,utils:I,GuBytes:g.slice(),lengths:b})}const Er=BigInt(0),Bt=BigInt(1),Ce=BigInt(2),xr=BigInt(3),vr=BigInt(5),Br=BigInt(8),wt=BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed"),yn={p:wt,n:BigInt("0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed"),h:Br,a:BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec"),d:BigInt("0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3"),Gx:BigInt("0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a"),Gy:BigInt("0x6666666666666666666666666666666666666666666666666666666666666658")};function mn(e){const t=BigInt(10),n=BigInt(20),r=BigInt(40),o=BigInt(80),s=wt,f=e*e%s*e%s,a=M(f,Ce,s)*f%s,c=M(a,Bt,s)*e%s,u=M(c,vr,s)*c%s,l=M(u,t,s)*u%s,w=M(l,n,s)*l%s,p=M(w,r,s)*w%s,m=M(p,o,s)*p%s,y=M(m,o,s)*p%s,d=M(y,t,s)*u%s;return{pow_p_5_8:M(d,Ce,s)*e%s,b2:f}}function Sr(e){return e[0]&=248,e[31]&=127,e[31]|=64,e}const re=BigInt("19681161376707505956807079304988542015446066515923890162744021073123829784752");function bn(e,t){const n=wt,r=k(t*t*t,n),o=k(r*r*t,n),s=mn(e*o).pow_p_5_8;let i=k(e*r*s,n);const f=k(t*i*i,n),a=i,c=k(i*re,n),u=f===e,l=f===k(-e,n),w=f===k(-e*re,n);return u&&(i=a),(l||w)&&(i=c),ct(i,n)&&(i=k(-i,n)),{isValid:u||l,value:i}}const pt=wr(yn,{uvRatio:bn}),ft=pt.Fp,_r=pt.Fn,oe=(()=>{const e=wt;return br({P:e,type:"x25519",powPminus2:t=>{const{pow_p_5_8:n,b2:r}=mn(t);return k(M(n,xr,e)*r,e)},adjustScalarBytes:Sr})})(),Fe=re,Ir=BigInt("54469307008909316920995813868745141605393597292927456921205312896311721017578"),He=e=>bn(Bt,e),Rr=BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),Or=e=>ft.create(_t(e)&Rr);class $ extends yr{static BASE=new $(pt.BASE);static ZERO=new $(pt.ZERO);static Fp=ft;static Fn=_r;constructor(t){super(t)}static fromAffine(t){return new $(pt.fromAffine(t))}assertSame(t){if(!(t instanceof $))throw new Error("RistrettoPoint expected")}init(t){return new $(t)}static fromBytes(t){W(t,32);const{a:n,d:r}=yn,o=wt,s=v=>ft.create(v),i=Or(t);if(!Qn(ft.toBytes(i),t)||ct(i,o))throw new Error("invalid ristretto255 encoding 1");const f=s(i*i),a=s(Bt+n*f),c=s(Bt-n*f),u=s(a*a),l=s(c*c),w=s(n*r*u-l),{isValid:p,value:m}=He(s(w*l)),y=s(m*c),d=s(m*y*w);let g=s((i+i)*y);ct(g,o)&&(g=s(-g));const h=s(a*d),x=s(g*h);if(!p||ct(x,o)||h===Er)throw new Error("invalid ristretto255 encoding 2");return new $(new pt(g,h,Bt,x))}static fromHex(t){return $.fromBytes(fe(t))}toBytes(){let{X:t,Y:n,Z:r,T:o}=this.ep;const s=wt,i=d=>ft.create(d),f=i(i(r+n)*i(r-n)),a=i(t*n),c=i(a*a),{value:u}=He(i(f*c)),l=i(u*f),w=i(u*a),p=i(l*w*o);let m;if(ct(o*p,s)){let d=i(n*Fe),g=i(t*Fe);t=d,n=g,m=i(l*Ir)}else m=w;ct(t*p,s)&&(n=i(-n));let y=i((r-n)*m);return ct(y,s)&&(y=i(-y)),ft.toBytes(y)}equals(t){this.assertSame(t);const{X:n,Y:r}=this.ep,{X:o,Y:s}=t.ep,i=c=>ft.create(c),f=i(n*s)===i(r*o),a=i(r*s)===i(n*o);return f||a}is0(){return this.equals($.ZERO)}}Object.freeze($.BASE);Object.freeze($.ZERO);Object.freeze($.prototype);Object.freeze($);class Ze{oHash;iHash;blockLen;outputLen;canXOF=!1;finished=!1;destroyed=!1;constructor(t,n){if(ie(t),W(n,void 0,"key"),this.iHash=t.create(),typeof this.iHash.update!="function")throw new Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;const r=this.blockLen,o=new Uint8Array(r);o.set(n.length>r?t.create().update(n).digest():n);for(let s=0;s<o.length;s++)o[s]^=54;this.iHash.update(o),this.oHash=t.create();for(let s=0;s<o.length;s++)o[s]^=106;this.oHash.update(o),St(o)}update(t){return Ft(this),this.iHash.update(t),this}digestInto(t){Ft(this),We(t,this),this.finished=!0;const n=t.subarray(0,this.outputLen);this.iHash.digestInto(n),this.oHash.update(n),this.oHash.digestInto(n),this.destroy()}digest(){const t=new Uint8Array(this.oHash.outputLen);return this.digestInto(t),t}_cloneInto(t){t||=Object.create(Object.getPrototypeOf(this),{});const{oHash:n,iHash:r,finished:o,destroyed:s,blockLen:i,outputLen:f}=this;return t=t,t.finished=o,t.destroyed=s,t.blockLen=i,t.outputLen=f,t.oHash=n._cloneInto(t.oHash),t.iHash=r._cloneInto(t.iHash),t}clone(){return this._cloneInto()}destroy(){this.destroyed=!0,this.oHash.destroy(),this.iHash.destroy()}}const En=(()=>{const e=((t,n,r)=>new Ze(t,n).update(r).digest());return e.create=(t,n)=>new Ze(t,n),e})();function Ar(e,t,n){return ie(e),n===void 0&&(n=new Uint8Array(e.outputLen)),En(e,n,t)}const Qt=Uint8Array.of(0),De=Uint8Array.of();function Lr(e,t,n,r=32){ie(e),gt(r,"length"),W(t,void 0,"prk");const o=e.outputLen;if(t.length<o)throw new Error('"prk" must be at least HashLen octets');if(r>255*o)throw new Error("Length must be <= 255*HashLen");const s=Math.ceil(r/o);n===void 0?n=De:W(n,void 0,"info");const i=new Uint8Array(s*o),f=En.create(e,t),a=f._cloneInto(),c=new Uint8Array(f.outputLen);for(let u=0;u<s;u++)Qt[0]=u+1,a.update(u===0?De:c).update(n).update(Qt).digestInto(c),i.set(c,o*u),f._cloneInto(a);return f.destroy(),a.destroy(),St(c,Qt),i.slice(0,r)}const Tr=(e,t,n,r,o)=>Lr(e,Ar(e,t,n),r,o);function kr(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name==="Uint8Array"&&"BYTES_PER_ELEMENT"in e&&e.BYTES_PER_ELEMENT===1}function $e(e){if(typeof e!="number")throw new TypeError("number expected, got "+typeof e);if(!Number.isSafeInteger(e)||e<0)throw new RangeError("positive integer expected, got "+e)}function D(e,t,n=""){const r=kr(e),o=e?.length,s=t!==void 0;if(!r||s&&o!==t){const i=n&&`"${n}" `,f=s?` of length ${t}`:"",a=r?`length=${o}`:`type=${typeof e}`,c=i+"expected Uint8Array"+f+", got "+a;throw r?new RangeError(c):new TypeError(c)}return e}function ze(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function Ur(e,t,n=!1){D(e,void 0,"output");const r=t.outputLen;if(e.length<r)throw new RangeError("digestInto() expects output buffer of length at least "+r);if(n&&!Rt(e))throw new Error("invalid output, must be aligned")}function Nr(e){return new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}function ut(e){return new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function ot(...e){for(let t=0;t<e.length;t++)e[t].fill(0)}function $t(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}const de=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68,xn=e=>e<<24&4278190080|e<<8&16711680|e>>>8&65280|e>>>24&255,N=de?e=>e:e=>xn(e)>>>0,qr=e=>{for(let t=0;t<e.length;t++)e[t]=xn(e[t]);return e},he=de?e=>e:qr;function Cr(e,t){if(e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r++)n|=e[r]^t[r];return n===0}function Fr(e,t,n){const r=t,o=n||(()=>[]),s=(f,a)=>r(a,...o(f)).update(f).digest(),i=r(new Uint8Array(e),...o(new Uint8Array(0)));return s.outputLen=i.outputLen,s.blockLen=i.blockLen,s.create=(f,...a)=>r(f,...a),s}const Hr=(e,t)=>{function n(r,...o){if(D(r,void 0,"key"),e.nonceLength!==void 0){const u=o[0];D(u,e.varSizeNonce?void 0:e.nonceLength,"nonce")}const s=e.tagLength;s&&o[1]!==void 0&&D(o[1],void 0,"AAD");const i=t(r,...o),f=(u,l)=>{if(l!==void 0){if(u!==2)throw new Error("cipher output not supported");D(l,void 0,"output")}};let a=!1;return{encrypt(u,l){if(a)throw new Error("cannot encrypt() twice with same key + nonce");return a=!0,D(u),f(i.encrypt.length,l),i.encrypt(u,l)},decrypt(u,l){if(D(u),s&&u.length<s)throw new Error('"ciphertext" expected length bigger than tagLength='+s);return f(i.decrypt.length,l),i.decrypt(u,l)}}}return Object.assign(n,e),n};function Zr(e,t,n=!0){if(t===void 0)return new Uint8Array(e);if(D(t,void 0,"output"),t.length!==e)throw new Error('"output" expected Uint8Array of length '+e+", got: "+t.length);if(n&&!Rt(t))throw new Error("invalid output, must be aligned");return t}function Dr(e,t,n){$e(e),$e(t);const r=new Uint8Array(16),o=$t(r);return o.setBigUint64(0,BigInt(t),n),o.setBigUint64(8,BigInt(e),n),r}function Rt(e){return e.byteOffset%4===0}function Ot(e){return Uint8Array.from(D(e))}const ht=16,vn=new Uint8Array(16),Et=ut(vn),$r=225,zr=(e,t,n,r)=>{const o=r&1;return{s3:n<<31|r>>>1,s2:t<<31|n>>>1,s1:e<<31|t>>>1,s0:e>>>1^$r<<24&-(o&1)}},Lt=e=>(e>>>0&255)<<24|(e>>>8&255)<<16|(e>>>16&255)<<8|e>>>24&255|0,Yr=e=>e>64*1024?8:e>1024?4:2;class Mr{blockLen=ht;outputLen=ht;s0=0;s1=0;s2=0;s3=0;finished=!1;destroyed=!1;t;W;windowSize;constructor(t,n){D(t,16,"key"),t=Ot(t);const r=$t(t);let o=r.getUint32(0,!1),s=r.getUint32(4,!1),i=r.getUint32(8,!1),f=r.getUint32(12,!1);const a=[];for(let m=0;m<128;m++)a.push({s0:Lt(o),s1:Lt(s),s2:Lt(i),s3:Lt(f)}),{s0:o,s1:s,s2:i,s3:f}=zr(o,s,i,f);const c=Yr(n||1024);if(![1,2,4,8].includes(c))throw new Error("ghash: invalid window size, expected 2, 4 or 8");this.W=c;const l=128/c,w=this.windowSize=2**c,p=[];for(let m=0;m<l;m++)for(let y=0;y<w;y++){let d=0,g=0,h=0,x=0;for(let v=0;v<c;v++){if(!(y>>>c-v-1&1))continue;const{s0:A,s1:O,s2:E,s3:R}=a[c*m+v];d^=A,g^=O,h^=E,x^=R}p.push({s0:d,s1:g,s2:h,s3:x})}this.t=p}_updateBlock(t,n,r,o){t^=this.s0,n^=this.s1,r^=this.s2,o^=this.s3;const{W:s,t:i,windowSize:f}=this;let a=0,c=0,u=0,l=0;const w=(1<<s)-1;let p=0;for(const m of[t,n,r,o])for(let y=0;y<4;y++){const d=m>>>8*y&255;for(let g=8/s-1;g>=0;g--){const h=d>>>s*g&w,{s0:x,s1:v,s2:_,s3:A}=i[p*f+h];a^=x,c^=v,u^=_,l^=A,p+=1}}this.s0=a,this.s1=c,this.s2=u,this.s3=l}update(t){ze(this),D(t),t=Ot(t);const n=ut(t),r=Math.floor(t.length/ht),o=t.length%ht;for(let s=0;s<r;s++)this._updateBlock(N(n[s*4+0]),N(n[s*4+1]),N(n[s*4+2]),N(n[s*4+3]));return o&&(vn.set(t.subarray(r*ht)),this._updateBlock(N(Et[0]),N(Et[1]),N(Et[2]),N(Et[3])),ot(Et)),this}destroy(){this.destroyed=!0;const{t}=this;for(const n of t)n.s0=0,n.s1=0,n.s2=0,n.s3=0}digestInto(t){ze(this),Ur(t,this,!0),this.finished=!0;const{s0:n,s1:r,s2:o,s3:s}=this,i=ut(t);i[0]=n,i[1]=r,i[2]=o,i[3]=s,he(i)}digest(){const t=new Uint8Array(ht);return this.digestInto(t),this.destroy(),t}}const Ye=Fr(16,(e,t)=>new Mr(e,t),e=>[e.length]),se=16,jr=4,Tt=new Uint8Array(se),Vr=283;function Xr(e){if(![16,24,32].includes(e.length))throw new Error('"aes key" expected Uint8Array of length 16/24/32, got length='+e.length)}function pe(e){return e<<1^Vr&-(e>>7)}function Me(e,t){let n=0;for(;t>0;t>>=1)n^=e&-(t&1),e=pe(e);return n}const Kr=(()=>{const e=new Uint8Array(256);for(let n=0,r=1;n<256;n++,r^=pe(r))e[n]=r;const t=new Uint8Array(256);t[0]=99;for(let n=0;n<255;n++){let r=e[255-n];r|=r<<8,t[e[n]]=(r^r>>4^r>>5^r>>6^r>>7^99)&255}return ot(e),t})(),Pr=e=>e<<24|e>>>8,Jt=e=>e<<8|e>>>24;function Gr(e,t){if(e.length!==256)throw new Error("Wrong sbox length");const n=new Uint32Array(256).map((c,u)=>t(e[u])),r=n.map(Jt),o=r.map(Jt),s=o.map(Jt),i=new Uint32Array(256*256),f=new Uint32Array(256*256),a=new Uint16Array(256*256);for(let c=0;c<256;c++)for(let u=0;u<256;u++){const l=c*256+u;i[l]=n[c]^r[u],f[l]=o[c]^s[u],a[l]=e[c]<<8|e[u]}return{sbox:e,sbox2:a,T0:n,T1:r,T2:o,T3:s,T01:i,T23:f}}const Bn=Gr(Kr,e=>Me(e,3)<<24|e<<16|e<<8|Me(e,2)),Wr=(()=>{const e=new Uint8Array(16);for(let t=0,n=1;t<16;t++,n=pe(n))e[t]=n;return e})();function Qr(e){D(e);const t=e.length;Xr(e);const{sbox2:n}=Bn,r=[];(!de||!Rt(e))&&r.push(e=Ot(e));const o=he(ut(e)),s=o.length,i=a=>xt(n,a,a,a,a),f=new Uint32Array(t+28);f.set(o);for(let a=s;a<f.length;a++){let c=f[a-1];a%s===0?c=i(Pr(c))^Wr[a/s-1]:s>6&&a%s===4&&(c=i(c)),f[a]=f[a-s]^c}return ot(...r),f}function kt(e,t,n,r,o,s){return e[n<<8&65280|r>>>8&255]^t[o>>>8&65280|s>>>24&255]}function xt(e,t,n,r,o){return e[t&255|n&65280]|e[r>>>16&255|o>>>16&65280]<<16}function je(e,t,n,r,o){const{sbox2:s,T01:i,T23:f}=Bn;let a=0;t^=e[a++],n^=e[a++],r^=e[a++],o^=e[a++];const c=e.length/4-2;for(let m=0;m<c;m++){const y=e[a++]^kt(i,f,t,n,r,o),d=e[a++]^kt(i,f,n,r,o,t),g=e[a++]^kt(i,f,r,o,t,n),h=e[a++]^kt(i,f,o,t,n,r);t=y,n=d,r=g,o=h}const u=e[a++]^xt(s,t,n,r,o),l=e[a++]^xt(s,n,r,o,t),w=e[a++]^xt(s,r,o,t,n),p=e[a++]^xt(s,o,t,n,r);return{s0:u,s1:l,s2:w,s3:p}}function Ut(e,t,n,r,o){D(n,se,"nonce"),D(r),o=Zr(r.length,o);const s=n,i=ut(s),f=$t(s),a=ut(r),c=ut(o),u=t?0:12,l=r.length;let w=f.getUint32(u,t),{s0:p,s1:m,s2:y,s3:d}=je(e,N(i[0]),N(i[1]),N(i[2]),N(i[3]));for(let h=0;h+4<=a.length;h+=4)c[h+0]=a[h+0]^N(p),c[h+1]=a[h+1]^N(m),c[h+2]=a[h+2]^N(y),c[h+3]=a[h+3]^N(d),w=w+1>>>0,f.setUint32(u,w,t),{s0:p,s1:m,s2:y,s3:d}=je(e,N(i[0]),N(i[1]),N(i[2]),N(i[3]));const g=se*Math.floor(a.length/jr);if(g<l){const h=new Uint32Array([p,m,y,d]);he(h);const x=Nr(h);for(let v=g,_=0;v<l;v++,_++)o[v]=r[v]^x[_];ot(h)}return o}function Jr(e,t,n,r,o){const s=o?o.length:0,i=e.create(n,r.length+s);o&&i.update(o);const f=Dr(8*r.length,8*s,t);i.update(r),i.update(f);const a=i.digest();return ot(f),a}const Ve=Hr({blockSize:16,nonceLength:12,tagLength:16,varSizeNonce:!0},function(t,n,r){if(n.length<8)throw new Error("aes/gcm: invalid nonce length");const o=16;function s(f,a,c){const u=Jr(Ye,!1,f,c,r);for(let l=0;l<a.length;l++)u[l]^=a[l];return u}function i(){const f=Qr(t),a=Tt.slice(),c=Tt.slice();if(Ut(f,!1,c,c,a),n.length===12)c.set(n);else{const l=Tt.slice();$t(l).setBigUint64(8,BigInt(n.length*8),!1);const p=Ye.create(a).update(n).update(l);p.digestInto(c),p.destroy()}const u=Ut(f,!1,c,Tt);return{xk:f,authKey:a,counter:c,tagMask:u}}return{encrypt(f){const{xk:a,authKey:c,counter:u,tagMask:l}=i(),w=new Uint8Array(f.length+o),p=[a,c,u,l];Rt(f)||p.push(f=Ot(f)),Ut(a,!1,u,f,w.subarray(0,f.length));const m=s(c,l,w.subarray(0,w.length-o));return p.push(m),w.set(m,f.length),ot(...p),w},decrypt(f){const{xk:a,authKey:c,counter:u,tagMask:l}=i(),w=[a,c,l,u];Rt(f)||w.push(f=Ot(f));const p=f.subarray(0,-o),m=f.subarray(-o),y=s(c,l,p);if(w.push(y),!Cr(y,m))throw ot(...w),new Error("aes/gcm: invalid ghash tag");const d=Ut(a,!1,u,p);return ot(...w),d}}}),Sn="chainlesschain.remote-session.e2ee.v1",Xe="chainlesschain://remote-session/pair#",te=32,to=new TextEncoder,_n=new TextDecoder;function Ct(e){return to.encode(e)}function Nt(e){let t="";for(const n of e)t+=String.fromCharCode(n);return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function vt(e){const t=String(e).replace(/-/g,"+").replace(/_/g,"/"),n=atob(t),r=new Uint8Array(n.length);for(let o=0;o<n.length;o+=1)r[o]=n.charCodeAt(o);return r}function eo(e){const t=new Uint8Array(e);return globalThis.crypto.getRandomValues(t),t}function no(){const e=oe.utils;return e.randomSecretKey?e.randomSecretKey():e.randomPrivateKey()}function Ke(e,t,n){return Ct(`${Sn}
2
- ${e}
3
- ${t}
4
- ${n}`)}function ro(e,t=Date.now()){if(typeof e!="string"||!e.startsWith(Xe))throw new Error("Invalid Remote Session pairing URI");let n;try{n=JSON.parse(_n.decode(vt(e.slice(Xe.length))))}catch{throw new Error("Malformed Remote Session pairing payload")}if(n.v!==1||!n.relayUrl||!n.remoteSessionId||!n.hostPeerId||!n.hostPublicKey||!n.pairingToken)throw new Error("Incomplete Remote Session pairing payload");if(n.expiresAt&&n.expiresAt<=t)throw new Error("Remote Session pairing payload expired");let r;try{r=new URL(n.relayUrl).protocol}catch{r=null}if(r!=="ws:"&&r!=="wss:")throw new Error("Remote Session relay must use ws or wss");return n}class oo{constructor(t,n){if(!t||!n)throw new Error("sessionId and localPeerId are required");this.sessionId=t,this.localPeerId=n,this.secretKey=no(),this.publicKey=oe.getPublicKey(this.secretKey),this.key=null,this.sendSequence=0,this.receivedSequences=new Map}publicKeyBase64(){return Nt(this.publicKey)}pair(t,n){if(!t||!n)throw new Error("Incomplete peer key material");const r=vt(t),o=r.length===te?r:r.slice(-te);if(o.length!==te)throw new Error("Invalid X25519 host public key");const s=oe.getSharedSecret(this.secretKey,o),i=Ie(Ct(n));this.key=Tr(Ie,s,i,Ct(`${Sn}:${this.sessionId}`),32)}encrypt(t){if(!this.key)throw new Error("Remote Session is not paired");const n=this.sendSequence+=1,r=eo(12),o=Ve(this.key,r,Ke(this.sessionId,this.localPeerId,n)).encrypt(Ct(JSON.stringify(t)));return{v:1,sessionId:this.sessionId,senderId:this.localPeerId,sequence:n,nonce:Nt(r),ciphertext:Nt(o.slice(0,o.length-16)),tag:Nt(o.slice(o.length-16))}}decrypt(t){if(t?.v!==1||t.sessionId!==this.sessionId)throw new Error("Invalid encrypted Remote Session envelope");if(!this.key)throw new Error("Remote Session is not paired");const n=this.receivedSequences.get(t.senderId)||0;if(!Number.isSafeInteger(t.sequence)||t.sequence<=n)throw new Error("Remote Session replay or out-of-order envelope rejected");const r=new Uint8Array([...vt(t.ciphertext),...vt(t.tag)]),o=Ve(this.key,vt(t.nonce),Ke(this.sessionId,t.senderId,t.sequence)).decrypt(r);return this.receivedSequences.set(t.senderId,t.sequence),JSON.parse(_n.decode(o))}}const so=1e3,io=3e4;let Pe=0;function In(){return globalThis.crypto?.randomUUID?globalThis.crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`}function co(){return`web-${In()}`}const Ge=Ln("remoteSession",()=>{const e=nt("idle"),t=nt([]),n=nt(""),r=nt(null);let o=null,s=null,i=null,f=null,a=!1,c=!1,u=0,l=null,w=null,p=0;function m(){l&&(clearTimeout(l),l=null)}function y(){if(!i)return;const b=new WebSocket(i.relayUrl);o=b,b.addEventListener("open",()=>{b===o&&b.send(JSON.stringify({type:"register",peerId:f,deviceType:"web",deviceInfo:{protocol:"remote-session.e2ee.v1"}}))}),b.addEventListener("message",B=>{b===o&&g(B.data)}),b.addEventListener("close",()=>{b===o&&(o=null,c?e.value="disconnected":d())}),b.addEventListener("error",()=>{b===o&&(n.value="Remote Session relay connection error")})}function d(){if(c||l)return;const b=Math.min(so*2**u,io);u+=1,e.value="reconnecting",l=setTimeout(()=>{l=null,c||y()},b)}function g(b){try{let B=JSON.parse(typeof b=="string"?b:String(b));if(B.type==="offline-message"&&(B=B.originalMessage||{}),B.type==="registered"){a?e.value="connected":(e.value="pairing",x());return}if(B.type!=="message")return;const I=B.payload;if(!I||I.type!=="remote-session.encrypted")return;const S=s.decrypt(I.envelope);S.type==="pair.accepted"?(a=!0,u=0,e.value="connected"):S.type==="session.revoked"?(c=!0,a=!1,m(),o&&o.close(),o=null,e.value="revoked"):(Pe+=1,t.value=[...t.value,{...S,_id:Pe,_rxAt:Date.now()}].slice(-200))}catch(B){e.value="error",n.value=B?.message||"Remote Session protocol error"}}function h(b,B){return!o||o.readyState!==WebSocket.OPEN||!i?!1:(o.send(JSON.stringify({type:"message",to:i.hostPeerId,payload:{type:b,...B}})),!0)}function x(){const b={type:"pair.join",remoteSessionId:i.remoteSessionId,token:i.pairingToken};w?.token&&(b.pushToken=w.token,b.pushProvider=w.provider||"web"),h("remote-session.pair",{mobilePeerId:f,mobilePublicKey:s.publicKeyBase64(),envelope:s.encrypt(b)})}function v(b){if(!o||o.readyState!==WebSocket.OPEN||!a)return!1;const B={...b,commandId:b.commandId||In(),seq:b.seq??++p};return h("remote-session.encrypted",{envelope:s.encrypt(B)})}function _(b,B={}){C();try{const I=ro(b);return w=B.pushCredentials||null,f=co(),s=new oo(I.remoteSessionId,f),s.pair(I.hostPublicKey,I.pairingToken),i=I,r.value=I.remoteSessionId,a=!1,c=!1,u=0,p=0,n.value="",t.value=[],e.value="connecting",y(),!0}catch(I){return e.value="error",n.value=I?.message||"Invalid pairing link",!1}}function A(b){const B=(b||"").trim();B&&(v({type:"prompt",content:B})||(n.value="Remote Session is not connected"))}function O(b,B){v({type:"approval.resolve",requestId:b,approved:B})}function E(){v({type:"interrupt"})}function R(b,B="web"){if(w=b?{token:b,provider:B}:null,!a)return;const I={type:"push.register"};w?.token&&(I.pushToken=w.token,I.pushProvider=w.provider),v(I)}function C(){if(c=!0,a=!1,m(),o)try{o.close()}catch{}o=null,e.value!=="revoked"&&(e.value="disconnected")}return{status:e,events:t,error:n,remoteSessionId:r,connect:_,sendPrompt:A,approve:O,interrupt:E,updatePushCredentials:R,disconnect:C}}),fo={__name:"RemoteSession",setup(e,{expose:t}){t();const n=Ge(),{status:r,events:o,error:s}=Be(n),i=nt(""),f=nt(""),a=nt(!1),c=mt(()=>["connecting","pairing","connected","reconnecting"].includes(r.value)),u=mt(()=>({idle:"未连接",connecting:"连接中",pairing:"配对中",connected:"已连接",reconnecting:"重连中",disconnected:"已断开",revoked:"已被撤销",error:"错误"})[r.value]||r.value),l=mt(()=>r.value==="connected"?"green":["connecting","pairing","reconnecting"].includes(r.value)?"blue":["revoked","error"].includes(r.value)?"red":"default"),w=mt(()=>[...o.value].reverse());function p(E){return String(E?.type||"").includes("approval")}function m(E){return E?.content||E?.payload?.content||E?.message||""}function y(E){return E?.requestId||E?.approvalId||""}function d(){n.connect(i.value.trim())}function g(E){a.value=!1,E&&(i.value=E,n.connect(E))}function h(E){const R=typeof E=="string"?E:f.value;n.sendPrompt(R),f.value=""}function x(E,R){n.approve(y(E),R)}function v(){n.interrupt()}function _(){n.disconnect()}function A(){s.value=""}const O={store:n,status:r,events:o,error:s,pairingLink:i,promptText:f,scannerOpen:a,isActive:c,statusLabel:u,statusColor:l,orderedEvents:w,isApproval:p,eventBody:m,requestIdOf:y,connect:d,onScanned:g,send:h,respond:x,interrupt:v,disconnect:_,clearError:A,computed:mt,ref:nt,get storeToRefs(){return Be},get LinkOutlined(){return Cn},get ScanOutlined(){return qn},QrScannerModal:Un,get useRemoteSessionStore(){return Ge}};return Object.defineProperty(O,"__isScriptSetup",{enumerable:!1,value:!0}),O}},ao={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}};function uo(e,t,n,r,o,s){const i=z("a-tag"),f=z("a-alert"),a=z("a-textarea"),c=z("a-button"),u=z("a-space"),l=z("a-card"),w=z("a-input-search"),p=z("a-spin"),m=z("a-empty"),y=z("a-list-item-meta"),d=z("a-list-item"),g=z("a-list");return it(),Tn("div",null,[yt("div",ao,[t[4]||(t[4]=yt("div",null,[yt("h2",{class:"page-title"},"远程会话"),yt("p",{class:"page-sub"},"扫码或粘贴桌面端的配对链接,端到端加密接管一个编码会话(观察 / 提示 / 审批 / 中断)")],-1)),U(i,{color:r.statusColor},{default:L(()=>[P(Se(r.statusLabel),1)]),_:1},8,["color"])]),r.error?(it(),lt(f,{key:0,type:"error","show-icon":"",style:{"margin-bottom":"16px"},message:r.error,closable:"",onClose:r.clearError},null,8,["message"])):ve("v-if",!0),r.isActive?(it(),lt(l,{key:2,title:"会话控制",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{extra:L(()=>[U(u,null,{default:L(()=>[U(c,{size:"small",onClick:r.interrupt},{default:L(()=>[...t[8]||(t[8]=[P("中断",-1)])]),_:1}),U(c,{size:"small",danger:"",onClick:r.disconnect},{default:L(()=>[...t[9]||(t[9]=[P("断开",-1)])]),_:1})]),_:1})]),default:L(()=>[U(u,{direction:"vertical",style:{width:"100%"},size:8},{default:L(()=>[U(w,{value:r.promptText,"onUpdate:value":t[2]||(t[2]=h=>r.promptText=h),placeholder:"发送提示到远程会话…","enter-button":"发送",disabled:r.status!=="connected",onSearch:r.send},null,8,["value","disabled"]),r.status==="reconnecting"?(it(),lt(p,{key:0,size:"small"},{tip:L(()=>[...t[10]||(t[10]=[P("正在重连…",-1)])]),_:1})):ve("v-if",!0)]),_:1})]),_:1})):(it(),lt(l,{key:1,title:"连接远程会话",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{default:L(()=>[U(u,{direction:"vertical",style:{width:"100%"},size:12},{default:L(()=>[U(a,{value:r.pairingLink,"onUpdate:value":t[0]||(t[0]=h=>r.pairingLink=h),rows:3,placeholder:"chainlesschain://remote-session/pair#...","allow-clear":""},null,8,["value"]),U(u,null,{default:L(()=>[U(c,{type:"primary",disabled:!r.pairingLink.trim(),onClick:r.connect},{icon:L(()=>[U(r.LinkOutlined)]),default:L(()=>[t[5]||(t[5]=P(" 连接 ",-1))]),_:1},8,["disabled"]),U(c,{onClick:t[1]||(t[1]=h=>r.scannerOpen=!0)},{icon:L(()=>[U(r.ScanOutlined)]),default:L(()=>[t[6]||(t[6]=P(" 扫码 ",-1))]),_:1})]),_:1}),t[7]||(t[7]=yt("p",{class:"page-sub",style:{margin:"0"}}," 链接为一次性配对码,敏感载荷仅在片段(#)中,不会发往服务器。 ",-1))]),_:1})]),_:1})),U(l,{title:"会话事件",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:L(()=>[r.events.length?(it(),lt(g,{key:1,size:"small","data-source":r.orderedEvents},{renderItem:L(({item:h})=>[U(d,null,kn({default:L(()=>[U(y,{description:r.eventBody(h)},{title:L(()=>[U(i,{color:r.isApproval(h)?"orange":"blue"},{default:L(()=>[P(Se(h.type||"event"),1)]),_:2},1032,["color"])]),_:2},1032,["description"])]),_:2},[r.isApproval(h)?{name:"actions",fn:L(()=>[U(c,{type:"link",size:"small",onClick:x=>r.respond(h,!0)},{default:L(()=>[...t[11]||(t[11]=[P("批准",-1)])]),_:1},8,["onClick"]),U(c,{type:"link",size:"small",danger:"",onClick:x=>r.respond(h,!1)},{default:L(()=>[...t[12]||(t[12]=[P("拒绝",-1)])]),_:1},8,["onClick"])]),key:"0"}:void 0]),1024)]),_:1},8,["data-source"])):(it(),lt(m,{key:0,description:"尚无事件"}))]),_:1}),U(r.QrScannerModal,{open:r.scannerOpen,onScanned:r.onScanned,onCancel:t[3]||(t[3]=h=>r.scannerOpen=!1)},null,8,["open"])])}const yo=Nn(fo,[["render",uo],["__file","/tmp/cc-web-panel-i5N2Ja/repo/packages/web-panel/src/views/RemoteSession.vue"]]);export{yo as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-DMT8n9vB.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-tw8m6T0c.js";import{a0 as t}from"./index-DMT8n9vB.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-Bxr-rmU6.js";import"./useFlexGapSupport-1_UhiyJZ.js";import"./styleChecker-qKvgmBhE.js";import"./index-WRw1pM5E.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-Dzfqn8Ep.js";import{a0 as t}from"./index-DMT8n9vB.js";import"./vendor-Bn1JzzAn.js";import"./index-WRw1pM5E.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};