chainlesschain 0.166.7 → 0.166.9

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 (187) hide show
  1. package/README.md +21 -0
  2. package/package.json +3 -1
  3. package/src/assets/web-panel/.build-hash +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-BlrmQxa2.js → AIOps-DJvpifGx.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-zyRyLITg.js → ActionButton-D2UhuF_A.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-DwGz7OGN.js → Analytics-C9ho9obu.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-Dc-nj7Zd.js → AppLayout-BvRCpFK3.js} +5 -5
  8. package/src/assets/web-panel/assets/{Artifacts-7Hu3O73p.js → Artifacts-jxrySvpk.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-Bnoe3-fR.js → Audit-ovEw0ZYl.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-BqYFrDKZ.js → BackgroundAgents-D7H5z6zS.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-B3hwW1nz.js → Backup-BuXob8za.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-XFVxLA4w.js → BaseInput-CtnszuQ2.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-CWRDNw7e.js → Chat-B_mYE8fJ.js} +6 -6
  14. package/src/assets/web-panel/assets/{ChatBubbleRenderer-Bf30VM8G.js → ChatBubbleRenderer-DaiA6CsX.js} +1 -1
  15. package/src/assets/web-panel/assets/{Checkbox-kFeeBgac.js → Checkbox-ierdtcJD.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-CCxp8xoI.js → Codegen-3VKPJD_B.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-BLKZalle.js → Col-1EdMyf5P.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-DD0eWCez.js → Community-D6H7UA8K.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-CHqHWdy0.js → Compact-BBAZvYIm.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-Bw54uPiK.js → Compliance-CgsTrAoj.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-DZ13zKNJ.js → Cowork-tnZgLoTE.js} +3 -3
  22. package/src/assets/web-panel/assets/{Cron-Dlj5Jevg.js → Cron-CPpZw2Nh.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-Nvz0aR0j.js → Crosschain-BymBcp5z.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-Ct89eUyY.js → DID-DKPxS_K1.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-BHUH5IAe.js → Dashboard-DvJhEmH9.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-BhZG-PO7.js → Dropdown-b8iQyQIZ.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-ae4RVwwJ.js → EmailListRenderer--0-A-zKb.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-AOcxLfLr.js → FamilyGuardDashboard-C12iDN06.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-BK2PJQOF.js → Federation-BRhaE2Z8.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-C2n3xO2_.js → FormItemContext-C4dnq7yf.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-DcyUVFZq.js → GenericCardRenderer-CGAdbR5n.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-tBae9Lt8.js → Git-4eA2fYzL.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-DmNR3AP4.js → Governance-BJuY9Y-9.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-CoseEigi.js → Inference-DZ5Dy4up.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-Bdjd1sxr.js → KnowledgeGraph-BMTjRs4A.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-CtlkKIcn.js → Logs-BKEeQEfJ.js} +2 -2
  37. package/src/assets/web-panel/assets/MarkdownRenderer-B05DgASC.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-BTYb7nEx.js → Marketplace-Dhho4fEg.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-D0iUdW3P.js → McpTools-BW6xxSlU.js} +2 -2
  40. package/src/assets/web-panel/assets/{Memory--gwI7w4Y.js → Memory-mPqlpSkq.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-JmFBi24T.js → MobileBridge-Cb9N_DQI.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-BK01cQRx.js → MobileProjects-BNs8tah_.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-u7avzyoO.js → Mtc-CaxBt8tn.js} +5 -5
  44. package/src/assets/web-panel/assets/{MtcAudit-gT3z5fo_.js → MtcAudit-DRPQbp3t.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-BIqZTz5n.js → Multisig-CRm-d8bK.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-DdhVfXYq.js → NLProgramming-BCCk3LPs.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-CBlyUmY3.js → Notes-Cv8SN8gN.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-DSyI26N3.js → NotificationSettings-CggIvTh5.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-B7IEuNz4.js → OrderTableRenderer-BW3_bV12.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-ozhi4kGS.js → Organization-BuRE-VCO.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-CBy57RVM.js → Overflow-DBrm1gju.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-CA-ZRv77.js → P2P-CWVnDYgS.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-DOHc9zm8.js → PdhVaultBrowser-8RKUIpte.js} +3 -3
  54. package/src/assets/web-panel/assets/{Permissions-DiP632GP.js → Permissions-tDUAxogW.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-AnU8O-SS.js → PersonalDataHub-Dv2-CFis.js} +5 -5
  56. package/src/assets/web-panel/assets/{Pipeline-DDibOUaP.js → Pipeline-DM6kvFni.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-D421t36T.js → Privacy-DzK-yL0d.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-DR879ZPJ.js → ProjectInit-B5UrNpkj.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-Ded8o6aY.js → ProjectSettings-CxJD43oW.js} +2 -2
  60. package/src/assets/web-panel/assets/Projects-Z2Orm8Ma.js +1 -0
  61. package/src/assets/web-panel/assets/{Providers-Boivuu-E.js → Providers-CYl4jRYK.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-xKD_ntKp.js → QrScannerModal-DeH2T0fH.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-D3y_A6FV.js → QuickAsk-Bw9k_kTk.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-BjKM-YC2.js → Recommend-Bl_jGwoi.js} +1 -1
  65. package/src/assets/web-panel/assets/RemoteSession-d6u01Kq0.js +5 -0
  66. package/src/assets/web-panel/assets/{Reputation-Ci2GjH5p.js → Reputation-Ds_Dfr-k.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-B0-T2BSh.js → Row-BpQUQTNj.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-Bet-ur-r.js → RssFeed-BatpZBGt.js} +2 -2
  69. package/src/assets/web-panel/assets/{Search-DWtRAS2R.js → Search-D7hOObzi.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-BDfu2Qn6.js → Security-dXQ4FKNt.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-CvJmvSMM.js → Services-D8wInGPa.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-CEbrKpdC.js → Skeleton-DXQCoYpM.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-CjVeiETf.js → Skills-D3oLRIVn.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-Dibypxum.js → Sla-BmP4-LnJ.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-XflYXp7a.js → SpeechSettings-DLj-xzro.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-ro1Ivx1E.js → SyncSettings-8KKaaRMr.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-CHq1qFbo.js → Tasks-GyK42I7C.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-CRnUZxtZ.js → Templates-n1y_8UBG.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-jUX72JCA.js → Tenant-B39nBph8.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-BBhAs7pt.js → Terminal-DCQoOKXe.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-CD5M3RGp.js → TimelineRenderer-BkhbDfXk.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-sah3v0gu.js → Tokens-BeHIIU8D.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-BNT3Uz3s.js → Trigger-BHvWXVOb.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-BytMGPMo.js → Trust-y2WaOSto.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-BkYVMRQs.js → UkeySign-DBFeJBzt.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-psvb5Q7Y.js → VideoEditing-BEOWitC-.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-PFQTW0MH.js → Wallet-BITedTe6.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-DgO-OwRT.js → WebAuthn-DMwlJVin.js} +5 -5
  89. package/src/assets/web-panel/assets/{WorkflowEditor-DL2l9VNl.js → WorkflowEditor-CKfGFEu1.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-C84akEzN.js → chat-DR6gnBGF.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-DzTWuQKP.js → colors-C_Hw5NCn.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-CR9LJQFv.js → compact-item-B8IPwsEu.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-CTTov5Kn.js → createContext-D-u4JVnJ.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-Cq6lSd_q.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-DALj523o.js → hasIn-CZubdS4D.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-Be6Os5S8.js → index-11ASqx-A.js} +1 -1
  97. package/src/assets/web-panel/assets/index-BQ3213fz.js +1 -0
  98. package/src/assets/web-panel/assets/{index-CXaCRXN4.js → index-BXS6wYJZ.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-7ux_XohH.js → index-Bi21Etg4.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CXTEpfGe.js → index-Bizm87cX.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DH6OG-ci.js → index-Bv2132PO.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CZhhFQi9.js → index-BzoFanEQ.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-B6QOJbSn.js → index-C25rOz7O.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CunGDV0g.js → index-C2VmtNaQ.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CmELknPe.js → index-Cbm8F0M2.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DZER6Lj3.js → index-CfniPP5p.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-B2qpjU-D.js → index-Cg2bCeol.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-QW0EXx14.js → index-CiXkhOkY.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-C5eeMl_2.js → index-Cl5RpreD.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-s4CFyn-n.js → index-CqmLw8cs.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-eJcFleIV.js → index-Ctje8Vl3.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-3-XJoYgX.js → index-D1w96gg9.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-_8vetPbU.js → index-D47jt8ET.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Cef0n4k_.js → index-DJ6pG79m.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-AXnERsyV.js → index-DTosx2Wu.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DtW6Zr_i.js → index-DY6MHo9D.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CNmTDXmf.js → index-DcFjRT-K.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Dah8M4l2.js → index-DfnzrUxU.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-D0MqUnKO.js → index-DjRrqooR.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CqUgXYIQ.js → index-DmRcgiYT.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-D9ScRFxz.js → index-DpjHpRoq.js} +3 -3
  122. package/src/assets/web-panel/assets/{index-DjE_ew7U.js → index-Dt-w3xQ7.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-W9axN_Ce.js → index-DuOU5apg.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-BDyt57zL.js → index-LvjAKDSl.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-hzzTITR9.js → index-_nL79NT8.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BNaQt49r.js → index-auyNYjLo.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-DBIPnoTj.js → index-cVqbas5C.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CnxjXIsK.js → index-ffe7bvqP.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BHRXKiU1.js → index-idZKyADQ.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-D_Bg0LdK.js → index-k1Xa5iw1.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-BKNIzw0U.js → index-mYZJxGH6.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DxdzSljS.js → index-rYBHSDcJ.js} +1 -1
  133. package/src/assets/web-panel/assets/index-vJagfET2.js +1 -0
  134. package/src/assets/web-panel/assets/{index-CjkPDSX4.js → index-xoNssgz_.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-JuW8mFj7.js → initDefaultProps-lcU_dT2r.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-Cwb0HBve.js → motion-Dc7UNXZ1.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-DHokzMgu.js → move-Cll8ZXaL.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-DX31y6QS.js → mtc-parser-CAb_yLIM.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-BCIUYDA6.js → omit-DurYMyTe.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-DMCj4EoZ.js → pickAttrs-BITQyOlw.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-Dy5K-u1s.js → placementArrow-Dg1rH91i.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-DkGeZu54.js → responsiveObserve-D_EWIeac.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-Dc5dyJdg.js → slide-lK4d3zsh.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-DIUBjOaC.js → statusUtils-Bflq-Git.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-DmyEOxm5.js → styleChecker-Ccp0I-wt.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-FRhakk1e.js → useFlexGapSupport-CYZbByYA.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-clXyV1WQ.js → useFs-B_x0nxFD.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-UF6DG41z.js → usePersonalDataHub-DW55rL85.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-CoCt95G7.js → vnode-Ca6MH3W8.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-yVWt-ENm.js → zoom-NdHelOog.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/command-help-index.json +1 -1
  153. package/src/commands/orchestrate.js +61 -9
  154. package/src/data/changelog.json +34 -1
  155. package/src/gateways/ws/message-dispatcher.js +4 -0
  156. package/src/gateways/ws/session-protocol.js +89 -11
  157. package/src/gateways/ws/ws-agent-handler.js +65 -9
  158. package/src/gateways/ws/ws-approval-gate.js +181 -16
  159. package/src/gateways/ws/ws-server.js +16 -6
  160. package/src/generated/cc-agent-protocol.schema.json +148 -2
  161. package/src/lib/agent-team/task-lease.js +172 -3
  162. package/src/lib/agent-team/team-runner.js +60 -1
  163. package/src/lib/app-server/graph-runtime.js +326 -2
  164. package/src/lib/app-server/server.js +60 -0
  165. package/src/lib/approval-grant-ledger.js +69 -0
  166. package/src/lib/codex-app-server-adapter.js +11 -20
  167. package/src/lib/graph-kernel/compiler.js +66 -13
  168. package/src/lib/graph-kernel/cutover-authority-resolver.js +26 -0
  169. package/src/lib/graph-kernel/cutover-ledger.js +53 -11
  170. package/src/lib/graph-kernel/retirement-evidence.js +567 -0
  171. package/src/lib/graph-kernel/runtime.js +76 -14
  172. package/src/lib/interaction-adapter.js +61 -9
  173. package/src/lib/policy-decision-event.js +149 -0
  174. package/src/lib/process-execution-broker/platform-sandbox.js +15 -1
  175. package/src/lib/record-replay/index.js +1 -0
  176. package/src/lib/record-replay/playwright-ui-driver.js +327 -0
  177. package/src/lib/webhook-security.js +484 -36
  178. package/src/runtime/coding-agent-events.cjs +13 -11
  179. package/src/runtime/headless-runner.js +17 -1
  180. package/src/runtime/headless-stream.js +66 -3
  181. package/src/runtime/session-slash-commands.js +57 -6
  182. package/src/assets/web-panel/assets/MarkdownRenderer-CZsTBEQE.js +0 -1
  183. package/src/assets/web-panel/assets/Projects-BHPxiucB.js +0 -1
  184. package/src/assets/web-panel/assets/RemoteSession-CgqKMXG4.js +0 -5
  185. package/src/assets/web-panel/assets/devWarning-BOhvmlpc.js +0 -1
  186. package/src/assets/web-panel/assets/index-DDyMJexx.js +0 -1
  187. package/src/assets/web-panel/assets/index-btiojFYn.js +0 -1
@@ -38,6 +38,10 @@ import {
38
38
  executeHooksV2Event,
39
39
  resolvePromptExpansion,
40
40
  } from "../lib/hooks-v2-producers.js";
41
+ import {
42
+ projectHookPolicyDecision,
43
+ projectToolPolicyDecision,
44
+ } from "../lib/policy-decision-event.js";
41
45
  import { runWithHostHooksV2Workspace } from "../lib/hooks-v2-workspace-context.js";
42
46
  import { bootstrap } from "./bootstrap.js";
43
47
  import {
@@ -875,6 +879,7 @@ async function runTurn(
875
879
  persistUsageEvent,
876
880
  persistToolEvent,
877
881
  sessionBudget,
882
+ emitPolicyDecisionEvents = false,
878
883
  now = Date.now,
879
884
  },
880
885
  ) {
@@ -1067,6 +1072,18 @@ async function runTurn(
1067
1072
  ? { permission_decision: event.permission_decision }
1068
1073
  : {}),
1069
1074
  });
1075
+ if (
1076
+ (typeof emitPolicyDecisionEvents === "function"
1077
+ ? emitPolicyDecisionEvents()
1078
+ : emitPolicyDecisionEvents) === true
1079
+ ) {
1080
+ const policyEvent = projectToolPolicyDecision(event, {
1081
+ sessionId: loopOptions.sessionId,
1082
+ turnId: event.turn_id,
1083
+ toolUseId: lastCall?.id,
1084
+ });
1085
+ if (policyEvent) emit(policyEvent);
1086
+ }
1070
1087
  if (settledItem) {
1071
1088
  emit({ type: "plan_update", ...planSnapshot(pm) });
1072
1089
  }
@@ -1545,7 +1562,13 @@ async function runAgentHeadlessStreamInWorkspace(
1545
1562
  const emit = streamCoalescer.emit;
1546
1563
  const removeHookObserver =
1547
1564
  options.includeHookEvents === true
1548
- ? addHooksV2EventObserver(sessionId, (event) => emit(event))
1565
+ ? addHooksV2EventObserver(sessionId, (event) => {
1566
+ emit(event);
1567
+ if (fieldGate.permission_decision !== false) {
1568
+ const policyEvent = projectHookPolicyDecision(event);
1569
+ if (policyEvent) emit(policyEvent);
1570
+ }
1571
+ })
1549
1572
  : null;
1550
1573
  streamCleanup.setOutputCleanup(() => streamCoalescer.flush?.());
1551
1574
 
@@ -2114,13 +2137,13 @@ async function runAgentHeadlessStreamInWorkspace(
2114
2137
  });
2115
2138
  }
2116
2139
  }
2117
- const persistApprovalGrants = () => {
2140
+ const persistApprovalGrants = (ledger = approvalGrantLedger) => {
2118
2141
  if (!persist || approvalGrantPersistenceError) return false;
2119
2142
  try {
2120
2143
  const persisted = store.appendAuthorityEvent(
2121
2144
  sessionId,
2122
2145
  APPROVAL_GRANTS_EVENT,
2123
- approvalGrantLedger.toJSON(),
2146
+ ledger.toJSON(),
2124
2147
  );
2125
2148
  if (persisted === false) {
2126
2149
  throw new Error("session store rejected approval grants");
@@ -2131,6 +2154,41 @@ async function runAgentHeadlessStreamInWorkspace(
2131
2154
  return false;
2132
2155
  }
2133
2156
  };
2157
+ const listApprovalGrants = () => approvalGrantLedger.listGrants();
2158
+ const revokeApprovalGrant = (grantId) => {
2159
+ const existing = approvalGrantLedger
2160
+ .listGrants()
2161
+ .find((grant) => grant.grantId === String(grantId || ""));
2162
+ if (!existing) {
2163
+ return { success: false, error: "Approval grant was not found" };
2164
+ }
2165
+ if (existing.lifetime === "turn") {
2166
+ const result = approvalGrantLedger.revoke(grantId);
2167
+ return { success: result.revoked, grant: result.grant };
2168
+ }
2169
+
2170
+ // Session revocation is a copy/persist/swap transaction. Preserve current
2171
+ // turn grants in the candidate, but never expose it as active until its
2172
+ // authority event has been appended successfully.
2173
+ const candidate = ApprovalGrantLedger.fromJSON(
2174
+ approvalGrantLedger.toJSON(),
2175
+ { sessionId },
2176
+ );
2177
+ candidate.turnId = approvalGrantLedger.turnId;
2178
+ candidate.turnGrants = new Map(approvalGrantLedger.turnGrants);
2179
+ const result = candidate.revoke(grantId);
2180
+ if (!result.revoked) {
2181
+ return { success: false, error: "Approval grant was not found" };
2182
+ }
2183
+ if (persist && !persistApprovalGrants(candidate)) {
2184
+ return {
2185
+ success: false,
2186
+ error: "Approval grant revocation could not be persisted",
2187
+ };
2188
+ }
2189
+ approvalGrantLedger = candidate;
2190
+ return { success: true, grant: result.grant };
2191
+ };
2134
2192
 
2135
2193
  // ── Interactive approvals (--interactive-approvals; chat-panel UX) ────────
2136
2194
  // CONFIRM-tier decisions (risky shell via the ApprovalGate, settings/hook
@@ -3570,6 +3628,8 @@ async function runAgentHeadlessStreamInWorkspace(
3570
3628
  projectMemoryEnabled:
3571
3629
  options.projectMemory !== false &&
3572
3630
  process.env.CC_PROJECT_MEMORY !== "0",
3631
+ listApprovalGrants,
3632
+ revokeApprovalGrant,
3573
3633
  },
3574
3634
  deps.sessionSlashCommandDeps || {},
3575
3635
  );
@@ -4375,6 +4435,9 @@ async function runAgentHeadlessStreamInWorkspace(
4375
4435
  persistUsageEvent,
4376
4436
  persistToolEvent,
4377
4437
  sessionBudget: options.sessionBudget || null,
4438
+ emitPolicyDecisionEvents: () =>
4439
+ options.includeHookEvents === true &&
4440
+ fieldGate.permission_decision !== false,
4378
4441
  },
4379
4442
  );
4380
4443
  } catch (err) {
@@ -1,15 +1,17 @@
1
1
  /**
2
- * Read-only, session-scoped slash commands for the stream-json protocol.
2
+ * Session-scoped slash commands for the stream-json protocol.
3
3
  *
4
4
  * These commands are handled by the live headless-stream process so their
5
5
  * output describes this session (model, loaded memory, MCP connections, hooks,
6
6
  * permissions and background tasks). They never become a user/model turn.
7
7
  *
8
- * The first protocol version is deliberately read-only. Mutating REPL forms
9
- * such as `/agents new`, `/tasks kill` and `/permissions <mode>` fail with a
10
- * stable error code instead of silently discarding their arguments.
8
+ * General configuration stays read-only. The one bounded mutation is exact
9
+ * approval-grant revocation through `/permissions revoke <grantId>`; it is
10
+ * delegated to the live session's authoritative grant ledger.
11
11
  */
12
12
 
13
+ import { APPROVAL_GRANTS_SCHEMA } from "../lib/approval-grant-ledger.js";
14
+
13
15
  export const SESSION_SLASH_COMMANDS = Object.freeze([
14
16
  "status",
15
17
  "doctor",
@@ -320,13 +322,62 @@ async function runHooks(context, deps) {
320
322
  return success(formatSettingsHooks(context.settingsHooks));
321
323
  }
322
324
 
325
+ function approvalGrantProjection(action, grants, revoked = null) {
326
+ return JSON.stringify({
327
+ schema: APPROVAL_GRANTS_SCHEMA,
328
+ action,
329
+ grants: Array.isArray(grants) ? grants : [],
330
+ ...(revoked ? { revoked } : {}),
331
+ });
332
+ }
333
+
323
334
  async function runPermissions(context, deps) {
324
- if (context.event.argumentText) {
335
+ const argument = context.event.argumentText.trim();
336
+ if (argument === "grants" || argument === "grants list") {
337
+ if (typeof context.listApprovalGrants !== "function") {
338
+ return failure(
339
+ "APPROVAL_GRANT_AUTHORITY_UNAVAILABLE",
340
+ "The live session approval grant authority is unavailable.",
341
+ );
342
+ }
343
+ const grants = await context.listApprovalGrants();
344
+ return success(approvalGrantProjection("list", grants));
345
+ }
346
+
347
+ const revoke = /^revoke\s+(grant_[0-9a-f]{64})$/u.exec(argument);
348
+ if (revoke) {
349
+ if (
350
+ typeof context.revokeApprovalGrant !== "function" ||
351
+ typeof context.listApprovalGrants !== "function"
352
+ ) {
353
+ return failure(
354
+ "APPROVAL_GRANT_AUTHORITY_UNAVAILABLE",
355
+ "The live session approval grant authority is unavailable.",
356
+ );
357
+ }
358
+ const result = await context.revokeApprovalGrant(revoke[1]);
359
+ if (!result?.success) {
360
+ return failure(
361
+ "APPROVAL_GRANT_REVOKE_FAILED",
362
+ result?.error || "Approval grant could not be revoked.",
363
+ );
364
+ }
365
+ return success(
366
+ approvalGrantProjection(
367
+ "revoke",
368
+ await context.listApprovalGrants(),
369
+ result.grant,
370
+ ),
371
+ );
372
+ }
373
+
374
+ if (argument) {
325
375
  return failure(
326
376
  "UNSUPPORTED_ARGUMENTS",
327
377
  "Changing permission mode through /permissions is not supported over " +
328
378
  "stream-json. Start a new session with --permission-mode <mode>; use " +
329
- "/permissions without arguments to inspect the active rules.",
379
+ "/permissions without arguments to inspect the active rules or " +
380
+ "/permissions grants to review reusable grants.",
330
381
  );
331
382
  }
332
383
  const { renderPermissions: defaultRenderer } =
@@ -1 +0,0 @@
1
- import{P as c,J as p,b as s}from"./vendor-Bn1JzzAn.js";import{r as a}from"./markdown-Yo_c6Krv.js";import{_ as d}from"./index-D9ScRFxz.js";const _={__name:"MarkdownRenderer",props:{content:{type:String,default:""}},setup(t,{expose:o}){o();const e=t,r=s(()=>a(e.content||"")),n={props:e,rendered:r,computed:s,get renderMarkdown(){return a}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},i=["innerHTML"];function m(t,o,e,r,n,u){return c(),p("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const b=d(_,[["render",m],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-TsYAbK/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{b as M};
@@ -1 +0,0 @@
1
- import{I as i,J as I,U,R as s,Q as r,c as t,K as a,V as _,S as x,o as oe,b as ee,r as u,P as p,F as ne,a2 as ge}from"./vendor-Bn1JzzAn.js";import{_ as we,b as re,u as ie,d}from"./index-D9ScRFxz.js";import{u as de}from"./useShellMode-CgR0wCYM.js";import{aN as ke,aO as be,aP as Fe,f as je,a5 as Ce,a8 as xe,at as Oe,R as Se}from"./icons-DG5UD-6K.js";const Pe={__name:"Projects",setup(se,{expose:l}){l();const{t:te}=re(),e=ie(),{isEmbedded:W}=de();async function w(o,f,ye,ae=8e3){if(W){const Z=await e.sendRaw({...f,type:o},ae);if(!Z?.ok){const $=Z?.error;throw new Error(typeof $=="string"?$:$?.message||`${o} failed`)}return Z.result}return e.executeJson(ye,ae)}const B=u(!1),y=u([]),O=u(""),S=u(""),P=u(!1),v=u(null),h=u([]),k=u(!1),E=u(!1),L=u(!1),b=u({name:"",description:"",type:"document",rootPath:""}),z=[{title:"ID",key:"id",width:110},{title:"名称",key:"name"},{title:"类型",key:"project_type",width:120},{title:"状态",key:"status",width:100},{title:"同步",key:"sync_status",width:100},{title:"更新",key:"updated_at",width:160},{title:"操作",key:"actions",width:180,fixed:"right"}],V=ee(()=>{const o={active:0,draft:0,completed:0,archived:0};for(const f of y.value)o[f.status]!==void 0&&(o[f.status]+=1);return o}),J=ee(()=>y.value.filter(o=>!(O.value&&o.status!==O.value||S.value&&!o.name.toLowerCase().includes(S.value.toLowerCase()))));function g(o){switch(o){case"active":return"green";case"draft":return"default";case"completed":return"cyan";case"archived":return"gold";default:return"default"}}function K(o){switch(o){case"synced":return"green";case"pending":return"orange";case"conflict":return"red";case"error":return"red";default:return"default"}}function Q(o){return!o&&o!==0?"-":new Date(typeof o=="number"?o:parseInt(o,10)).toLocaleString("zh-CN",{hour12:!1})}async function C(){B.value=!0;try{const o=await w("project.list",{limit:500},"project list --limit 500 --json",1e4);y.value=Array.isArray(o?.projects)?o.projects:Array.isArray(o)?o:[]}catch(o){d.error("加载失败: "+(o.message||o)),y.value=[]}finally{B.value=!1}}function Y(o){return{onClick:()=>M(o)}}async function M(o){v.value=o,P.value=!0,k.value=!0,h.value=[];try{const f=await w("project.listFiles",{projectId:o.id,limit:200},`project list-files ${o.id} --json`,8e3);h.value=Array.isArray(f?.files)?f.files:[]}catch{h.value=[]}finally{k.value=!1}}async function G(o){try{(await w("project.delete",{id:o.id},`project delete ${o.id} --json`,8e3))?.ok?(d.success(`已删除项目 '${o.name}'`),P.value=!1,await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}function H(){b.value={name:"",description:"",type:"document",rootPath:""},E.value=!0}async function T(){if(!b.value.name.trim()){d.warning("请输入项目名称");return}L.value=!0;try{const o=await w("project.init",{name:b.value.name.trim(),description:b.value.description||null,projectType:b.value.type,rootPath:b.value.rootPath||null},`project init "${b.value.name.trim()}" --type ${b.value.type} --json`,8e3);o?.id?(d.success(`已创建项目 '${o.name}'`),E.value=!1,await C()):d.error("创建失败")}catch(o){d.error(o.message||String(o))}finally{L.value=!1}}const F=u(!1),D=u(!1),j=u({path:"",content:""}),A=u(!1),m=u(!1),R=u({path:""}),n=u(!1),c=u(null),q=u(""),X=u(!1);function ue(){j.value={path:"",content:""},F.value=!0}function ce(){R.value={path:""},A.value=!0}async function N(){if(v.value){k.value=!0;try{const o=await w("project.listFiles",{projectId:v.value.id,limit:200},`project list-files ${v.value.id} --json`,8e3);h.value=Array.isArray(o?.files)?o.files:[]}catch(o){d.error("刷新文件失败: "+(o.message||o))}finally{k.value=!1}}}async function fe(){if(!j.value.path.trim()){d.warning("请输入文件路径");return}if(v.value){D.value=!0;try{const o=await w("project.createFile",{projectId:v.value.id,filePath:j.value.path.trim(),content:j.value.content||""},`project create-file ${v.value.id} "${j.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件 '${o.file_name}'`),F.value=!1,await N(),await C()):d.error("创建文件失败")}catch(o){d.error(o.message||String(o))}finally{D.value=!1}}}async function pe(){if(!R.value.path.trim()){d.warning("请输入文件夹路径");return}if(v.value){m.value=!0;try{const o=await w("project.createFolder",{projectId:v.value.id,folderPath:R.value.path.trim()},`project create-folder ${v.value.id} "${R.value.path.trim()}" --json`,8e3);o?.id?(d.success(`已创建文件夹 '${o.file_name}'`),A.value=!1,await N(),await C()):d.error("创建文件夹失败")}catch(o){d.error(o.message||String(o))}finally{m.value=!1}}}async function ve(o){try{(await w("project.deleteFile",{fileId:o.id},`project delete-file ${o.id} --json`,8e3))?.deleted?(d.success(`已删除 '${o.file_name}'`),await N(),await C()):d.error("删除失败")}catch(f){d.error(f.message||String(f))}}async function me(o){if(o.is_folder){d.info("文件夹无内容可编辑");return}try{const f=await w("project.getFile",{fileId:o.id},`project get-file ${o.id} --json`,8e3);c.value=o,q.value=f?.content||"",n.value=!0}catch(f){d.error("读取文件失败: "+(f.message||f))}}async function _e(){if(c.value){X.value=!0;try{(await w("project.writeFile",{fileId:c.value.id,content:q.value},`project write-file ${c.value.id} --json`,8e3))?.id?(d.success("已保存"),n.value=!1,await N()):d.error("保存失败")}catch(o){d.error(o.message||String(o))}finally{X.value=!1}}}oe(()=>{C()});const le={t:te,ws:e,isEmbedded:W,callProjectTopic:w,loading:B,projects:y,statusFilter:O,nameFilter:S,detailOpen:P,detail:v,files:h,filesLoading:k,createOpen:E,creating:L,newProject:b,columns:z,countByStatus:V,filteredProjects:J,statusColor:g,syncColor:K,formatTime:Q,loadAll:C,onRowClick:Y,openDetail:M,onDelete:G,onShowCreate:H,onCreate:T,createFileOpen:F,creatingFile:D,newFile:j,createFolderOpen:A,creatingFolder:m,newFolder:R,editFileOpen:n,editingFile:c,editFileContent:q,savingFile:X,openCreateFile:ue,openCreateFolder:ce,refreshFiles:N,onCreateFile:fe,onCreateFolder:pe,onDeleteFile:ve,openEditFile:me,onSaveFile:_e,ref:u,computed:ee,onMounted:oe,get ReloadOutlined(){return Se},get PlusOutlined(){return Oe},get FolderOutlined(){return xe},get FileTextOutlined(){return Ce},get CheckCircleOutlined(){return je},get CheckSquareOutlined(){return Fe},get FileAddOutlined(){return be},get FolderAddOutlined(){return ke},get message(){return d},get useI18n(){return re},get useWsStore(){return ie},get useShellMode(){return de}};return Object.defineProperty(le,"__isScriptSetup",{enumerable:!1,value:!0}),le}},ze={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},Ae={class:"page-title"},Ie={class:"page-sub"},Ue={class:"filter-bar",style:{"margin-bottom":"12px",display:"flex",gap:"12px","align-items":"center"}},he={key:0,style:{"font-size":"12px",color:"#888"}},De={key:0,style:{color:"#888","font-size":"12px"}},Re={key:0},Te={key:1,style:{color:"#888"}},Be=["onClick"],Ee={key:0,style:{color:"#888","font-size":"12px"}};function Le(se,l,te,e,W,w){const B=i("router-link"),y=i("a-button"),O=i("a-space"),S=i("a-statistic"),P=i("a-card"),v=i("a-col"),h=i("a-row"),k=i("a-radio-button"),E=i("a-radio-group"),L=i("a-input-search"),b=i("a-alert"),z=i("a-tag"),V=i("a-popconfirm"),J=i("a-table"),g=i("a-descriptions-item"),K=i("a-descriptions"),Q=i("a-divider"),C=i("a-empty"),Y=i("a-list-item"),M=i("a-list"),G=i("a-spin"),H=i("a-drawer"),T=i("a-input"),F=i("a-form-item"),D=i("a-textarea"),j=i("a-form"),A=i("a-modal"),m=i("a-select-option"),R=i("a-select");return p(),I("div",null,[U("div",ze,[U("div",null,[U("h2",Ae,s(e.t("projects.title")),1),U("p",Ie,[l[17]||(l[17]=r("桌面 / CLI / 手机 三端共享同一份项目数据,Phase 3d sync 自动同步 (",-1)),t(B,{to:"/project-init"},{default:a(()=>[...l[16]||(l[16]=[r("项目初始化 / 环境设置",-1)])]),_:1}),l[18]||(l[18]=r(")",-1))])]),t(O,null,{default:a(()=>[t(y,{loading:e.loading,onClick:e.loadAll},{icon:a(()=>[t(e.ReloadOutlined)]),default:a(()=>[l[19]||(l[19]=r(" 刷新 ",-1))]),_:1},8,["loading"]),t(y,{type:"primary",onClick:e.onShowCreate},{icon:a(()=>[t(e.PlusOutlined)]),default:a(()=>[l[20]||(l[20]=r(" 新建项目 ",-1))]),_:1})]),_:1})]),_(" Stats "),t(h,{gutter:[16,16],style:{"margin-bottom":"20px"}},{default:a(()=>[t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"总项目",value:e.projects.length,"value-style":{color:"#1677ff",fontSize:"20px"}},{prefix:a(()=>[t(e.FolderOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"活跃",value:e.countByStatus.active,"value-style":{color:"#52c41a",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckCircleOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"草稿",value:e.countByStatus.draft,"value-style":{color:"#8c8c8c",fontSize:"20px"}},{prefix:a(()=>[t(e.FileTextOutlined)]),_:1},8,["value"])]),_:1})]),_:1}),t(v,{xs:12,sm:8,lg:6},{default:a(()=>[t(P,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:a(()=>[t(S,{title:"已完成",value:e.countByStatus.completed,"value-style":{color:"#13c2c2",fontSize:"20px"}},{prefix:a(()=>[t(e.CheckSquareOutlined)]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),_(" Filter "),U("div",Ue,[t(E,{value:e.statusFilter,"onUpdate:value":l[0]||(l[0]=n=>e.statusFilter=n),size:"small","button-style":"solid"},{default:a(()=>[t(k,{value:""},{default:a(()=>[...l[21]||(l[21]=[r("全部",-1)])]),_:1}),t(k,{value:"active"},{default:a(()=>[...l[22]||(l[22]=[r("活跃",-1)])]),_:1}),t(k,{value:"draft"},{default:a(()=>[...l[23]||(l[23]=[r("草稿",-1)])]),_:1}),t(k,{value:"completed"},{default:a(()=>[...l[24]||(l[24]=[r("已完成",-1)])]),_:1}),t(k,{value:"archived"},{default:a(()=>[...l[25]||(l[25]=[r("已归档",-1)])]),_:1})]),_:1},8,["value"]),t(L,{value:e.nameFilter,"onUpdate:value":l[1]||(l[1]=n=>e.nameFilter=n),placeholder:"按名称过滤",style:{"max-width":"260px"},"allow-clear":""},null,8,["value"])]),!e.projects.length&&!e.loading?(p(),x(b,{key:0,type:"info",message:"还没有项目",description:'运行 `cc project init <name>` 或点击右上角"新建项目"按钮创建。桌面 / CLI / 手机三端共享同一份数据。',"show-icon":"",style:{"margin-bottom":"16px"}})):_("v-if",!0),e.projects.length||e.loading?(p(),x(J,{key:1,columns:e.columns,"data-source":e.filteredProjects,loading:e.loading,pagination:{pageSize:20,showSizeChanger:!0},"row-key":"id","custom-row":e.onRowClick},{bodyCell:a(({column:n,record:c})=>[n.key==="id"?(p(),I("code",he,s(c.id.slice(0,8))+"…",1)):n.key==="name"?(p(),I(ne,{key:1},[U("strong",null,s(c.name),1),c.description?(p(),I("div",De,s(c.description),1)):_("v-if",!0)],64)):n.key==="project_type"?(p(),x(z,{key:2},{default:a(()=>[r(s(c.project_type),1)]),_:2},1024)):n.key==="status"?(p(),x(z,{key:3,color:e.statusColor(c.status)},{default:a(()=>[r(s(c.status),1)]),_:2},1032,["color"])):n.key==="sync_status"?(p(),x(z,{key:4,color:e.syncColor(c.sync_status)},{default:a(()=>[r(s(c.sync_status||"unknown"),1)]),_:2},1032,["color"])):n.key==="updated_at"?(p(),I(ne,{key:5},[r(s(e.formatTime(c.updated_at)),1)],64)):n.key==="actions"?(p(),x(O,{key:6,onClick:l[2]||(l[2]=ge(()=>{},["stop"]))},{default:a(()=>[t(y,{size:"small",onClick:q=>e.openDetail(c)},{default:a(()=>[...l[26]||(l[26]=[r("详情",-1)])]),_:1},8,["onClick"]),t(V,{title:`删除项目 '${c.name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:q=>e.onDelete(c)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[27]||(l[27]=[r("删除",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)):_("v-if",!0)]),_:1},8,["data-source","loading"])):_("v-if",!0),_(" Detail drawer "),t(H,{open:e.detailOpen,"onUpdate:open":l[3]||(l[3]=n=>e.detailOpen=n),title:e.detail?.name||"项目详情",width:"640",placement:"right"},{default:a(()=>[e.detail?(p(),x(K,{key:0,column:1,bordered:"",size:"small"},{default:a(()=>[t(g,{label:"ID"},{default:a(()=>[U("code",null,s(e.detail.id),1)]),_:1}),t(g,{label:"名称"},{default:a(()=>[r(s(e.detail.name),1)]),_:1}),t(g,{label:"描述"},{default:a(()=>[r(s(e.detail.description||"-"),1)]),_:1}),t(g,{label:"类型"},{default:a(()=>[t(z,null,{default:a(()=>[r(s(e.detail.project_type),1)]),_:1})]),_:1}),t(g,{label:"状态"},{default:a(()=>[t(z,{color:e.statusColor(e.detail.status)},{default:a(()=>[r(s(e.detail.status),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"同步状态"},{default:a(()=>[t(z,{color:e.syncColor(e.detail.sync_status)},{default:a(()=>[r(s(e.detail.sync_status||"unknown"),1)]),_:1},8,["color"])]),_:1}),t(g,{label:"用户"},{default:a(()=>[r(s(e.detail.user_id),1)]),_:1}),t(g,{label:"根路径"},{default:a(()=>[e.detail.root_path?(p(),I("code",Re,s(e.detail.root_path),1)):(p(),I("span",Te,"(无)"))]),_:1}),t(g,{label:"文件数"},{default:a(()=>[r(s(e.detail.file_count||0),1)]),_:1}),t(g,{label:"创建"},{default:a(()=>[r(s(e.formatTime(e.detail.created_at)),1)]),_:1}),t(g,{label:"更新"},{default:a(()=>[r(s(e.formatTime(e.detail.updated_at)),1)]),_:1})]),_:1})):_("v-if",!0),t(Q,null,{default:a(()=>[...l[28]||(l[28]=[r("文件",-1)])]),_:1}),_(" Sub-phase 7.3 (2026-05-17): 文件 CRUD toolbar "),t(O,{style:{"margin-bottom":"12px"}},{default:a(()=>[t(y,{size:"small",type:"primary",disabled:!e.detail,onClick:e.openCreateFile},{default:a(()=>[t(e.FileAddOutlined),l[29]||(l[29]=r(" 新建文件 ",-1))]),_:1},8,["disabled"]),t(y,{size:"small",disabled:!e.detail,onClick:e.openCreateFolder},{default:a(()=>[t(e.FolderAddOutlined),l[30]||(l[30]=r(" 新建文件夹 ",-1))]),_:1},8,["disabled"])]),_:1}),t(G,{spinning:e.filesLoading},{default:a(()=>[!e.files.length&&!e.filesLoading?(p(),x(C,{key:0,description:"无文件 (点上方按钮新建)"})):(p(),x(M,{key:1,size:"small","data-source":e.files},{renderItem:a(({item:n})=>[t(Y,null,{extra:a(()=>[t(O,null,{default:a(()=>[n.file_size?(p(),I("span",Ee,s(n.file_size)+" B",1)):_("v-if",!0),t(V,{title:`删除 ${n.is_folder?"文件夹":"文件"} '${n.file_name}' ?`,"ok-text":"删除","ok-type":"danger","cancel-text":"取消",onConfirm:c=>e.onDeleteFile(n)},{default:a(()=>[t(y,{size:"small",danger:""},{default:a(()=>[...l[31]||(l[31]=[r("×",-1)])]),_:1})]),_:1},8,["title","onConfirm"])]),_:2},1024)]),default:a(()=>[U("span",{style:{cursor:"pointer"},onClick:c=>e.openEditFile(n)},s(n.is_folder?"📁":"📄")+" "+s(n.file_path),9,Be)]),_:2},1024)]),_:1},8,["data-source"]))]),_:1},8,["spinning"])]),_:1},8,["open","title"]),_(" Sub-phase 7.3: Create file modal "),t(A,{open:e.createFileOpen,"onUpdate:open":l[6]||(l[6]=n=>e.createFileOpen=n),title:"新建文件","confirm-loading":e.creatingFile,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFile},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(F,{label:"文件路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFile.path,"onUpdate:value":l[4]||(l[4]=n=>e.newFile.path=n),placeholder:"例如 README.md 或 src/main.kt"},null,8,["value"])]),_:1}),t(F,{label:"初始内容(可选)"},{default:a(()=>[t(D,{value:e.newFile.content,"onUpdate:value":l[5]||(l[5]=n=>e.newFile.content=n),rows:6,placeholder:"留空创建空文件"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Create folder modal "),t(A,{open:e.createFolderOpen,"onUpdate:open":l[8]||(l[8]=n=>e.createFolderOpen=n),title:"新建文件夹","confirm-loading":e.creatingFolder,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreateFolder},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(F,{label:"文件夹路径(项目内)",required:""},{default:a(()=>[t(T,{value:e.newFolder.path,"onUpdate:value":l[7]||(l[7]=n=>e.newFolder.path=n),placeholder:"例如 src/utils"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"]),_(" Sub-phase 7.3: Edit file content modal "),t(A,{open:e.editFileOpen,"onUpdate:open":l[10]||(l[10]=n=>e.editFileOpen=n),title:`编辑 ${e.editingFile?.file_name||""}`,"confirm-loading":e.savingFile,"ok-text":"保存","cancel-text":"取消",onOk:e.onSaveFile,width:"720"},{default:a(()=>[t(D,{value:e.editFileContent,"onUpdate:value":l[9]||(l[9]=n=>e.editFileContent=n),rows:18,"auto-size":{minRows:12,maxRows:24},style:{"font-family":"monospace"}},null,8,["value"])]),_:1},8,["open","title","confirm-loading"]),_(" Create modal "),t(A,{open:e.createOpen,"onUpdate:open":l[15]||(l[15]=n=>e.createOpen=n),title:"新建项目","confirm-loading":e.creating,"ok-text":"创建","cancel-text":"取消",onOk:e.onCreate},{default:a(()=>[t(j,{layout:"vertical"},{default:a(()=>[t(F,{label:"项目名称",required:""},{default:a(()=>[t(T,{value:e.newProject.name,"onUpdate:value":l[11]||(l[11]=n=>e.newProject.name=n),placeholder:"例如:旅行计划-上海"},null,8,["value"])]),_:1}),t(F,{label:"描述"},{default:a(()=>[t(D,{value:e.newProject.description,"onUpdate:value":l[12]||(l[12]=n=>e.newProject.description=n),rows:2},null,8,["value"])]),_:1}),t(F,{label:"类型"},{default:a(()=>[t(R,{value:e.newProject.type,"onUpdate:value":l[13]||(l[13]=n=>e.newProject.type=n)},{default:a(()=>[t(m,{value:"document"},{default:a(()=>[...l[32]||(l[32]=[r("文档 (document)",-1)])]),_:1}),t(m,{value:"data"},{default:a(()=>[...l[33]||(l[33]=[r("数据 (data)",-1)])]),_:1}),t(m,{value:"web"},{default:a(()=>[...l[34]||(l[34]=[r("Web",-1)])]),_:1}),t(m,{value:"app"},{default:a(()=>[...l[35]||(l[35]=[r("应用 (app)",-1)])]),_:1}),t(m,{value:"presentation"},{default:a(()=>[...l[36]||(l[36]=[r("演示文稿",-1)])]),_:1}),t(m,{value:"spreadsheet"},{default:a(()=>[...l[37]||(l[37]=[r("表格",-1)])]),_:1}),t(m,{value:"design"},{default:a(()=>[...l[38]||(l[38]=[r("设计",-1)])]),_:1}),t(m,{value:"code"},{default:a(()=>[...l[39]||(l[39]=[r("代码",-1)])]),_:1}),t(m,{value:"workflow"},{default:a(()=>[...l[40]||(l[40]=[r("工作流",-1)])]),_:1}),t(m,{value:"knowledge"},{default:a(()=>[...l[41]||(l[41]=[r("知识库",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),t(F,{label:"根路径 (可选)"},{default:a(()=>[t(T,{value:e.newProject.rootPath,"onUpdate:value":l[14]||(l[14]=n=>e.newProject.rootPath=n),placeholder:"留空则仅元数据"},null,8,["value"])]),_:1})]),_:1})]),_:1},8,["open","confirm-loading"])])}const We=we(Pe,[["render",Le],["__scopeId","data-v-019ac5aa"],["__file","/tmp/cc-web-panel-TsYAbK/repo/packages/web-panel/src/views/Projects.vue"]]);export{We as default};
@@ -1,5 +0,0 @@
1
- import{E as lr,r as re,I as ee,J as Ue,U as qe,c as k,K as R,S as ie,V as be,o as Xt,a8 as Gt,b as Ne,P as K,Q as Y,R as Ee,F as ur,Z as fr,a5 as dr}from"./vendor-Bn1JzzAn.js";import{Q as pr}from"./QrScannerModal-xKD_ntKp.js";import{_ as hr}from"./index-D9ScRFxz.js";import{ax as gr,aC as mr}from"./icons-DG5UD-6K.js";import"./markdown-CsiA8-E5.js";function wr(t){return t instanceof Uint8Array||ArrayBuffer.isView(t)&&t.constructor.name==="Uint8Array"&&"BYTES_PER_ELEMENT"in t&&t.BYTES_PER_ELEMENT===1}function Oe(t,e=""){if(typeof t!="number"){const n=e&&`"${e}" `;throw new TypeError(`${n}expected number, got ${typeof t}`)}if(!Number.isSafeInteger(t)||t<0){const n=e&&`"${e}" `;throw new RangeError(`${n}expected integer >= 0, got ${t}`)}}function le(t,e,n=""){const r=wr(t),o=t?.length,i=e!==void 0;if(!r||i&&o!==e){const s=n&&`"${n}" `,a=i?` of length ${e}`:"",l=r?`length=${o}`:`type=${typeof t}`,c=s+"expected Uint8Array"+a+", got "+l;throw r?new RangeError(c):new TypeError(c)}return t}function Dt(t){if(typeof t!="function"||typeof t.create!="function")throw new TypeError("Hash must wrapped by utils.createHasher");if(Oe(t.outputLen),Oe(t.blockLen),t.outputLen<1)throw new Error('"outputLen" must be >= 1');if(t.blockLen<1)throw new Error('"blockLen" must be >= 1')}function dt(t,e=!0){if(t.destroyed)throw new Error("Hash instance has been destroyed");if(e&&t.finished)throw new Error("Hash#digest() has already been called")}function On(t,e){le(t,void 0,"digestInto() output");const n=e.outputLen;if(t.length<n)throw new RangeError('"digestInto() output" expected to be of length >='+n)}function He(...t){for(let e=0;e<t.length;e++)t[e].fill(0)}function bt(t){return new DataView(t.buffer,t.byteOffset,t.byteLength)}function ce(t,e){return t<<32-e|t>>>e}const Tn=typeof Uint8Array.from([]).toHex=="function"&&typeof Uint8Array.fromHex=="function",yr=Array.from({length:256},(t,e)=>e.toString(16).padStart(2,"0"));function Pt(t){if(le(t),Tn)return t.toHex();let e="";for(let n=0;n<t.length;n++)e+=yr[t[n]];return e}const ae={_0:48,_9:57,A:65,F:70,a:97,f:102};function Qt(t){if(t>=ae._0&&t<=ae._9)return t-ae._0;if(t>=ae.A&&t<=ae.F)return t-(ae.A-10);if(t>=ae.a&&t<=ae.f)return t-(ae.a-10)}function Ft(t){if(typeof t!="string")throw new TypeError("hex string expected, got "+typeof t);if(Tn)try{return Uint8Array.fromHex(t)}catch(o){throw o instanceof SyntaxError?new RangeError(o.message):o}const e=t.length,n=e/2;if(e%2)throw new RangeError("hex string expected, got unpadded hex of length "+e);const r=new Uint8Array(n);for(let o=0,i=0;o<n;o++,i+=2){const s=Qt(t.charCodeAt(i)),a=Qt(t.charCodeAt(i+1));if(s===void 0||a===void 0){const l=t[i]+t[i+1];throw new RangeError('hex string expected, got non-hex character "'+l+'" at index '+i)}r[o]=s*16+a}return r}function br(t,e={}){const n=(o,i)=>t(i).update(o).digest(),r=t(void 0);return n.outputLen=r.outputLen,n.blockLen=r.blockLen,n.canXOF=r.canXOF,n.create=o=>t(o),Object.assign(n,e),Object.freeze(n)}function Er(t=32){Oe(t,"bytesLength");const e=typeof globalThis=="object"?globalThis.crypto:null;if(typeof e?.getRandomValues!="function")throw new Error("crypto.getRandomValues must be defined");if(t>65536)throw new RangeError(`"bytesLength" expected <= 65536, got ${t}`);return e.getRandomValues(new Uint8Array(t))}const vr=t=>({oid:Uint8Array.from([6,9,96,134,72,1,101,3,4,2,t])});function xr(t,e,n){return t&e^~t&n}function Sr(t,e,n){return t&e^t&n^e&n}class Ir{blockLen;outputLen;canXOF=!1;padOffset;isLE;buffer;view;finished=!1;length=0;pos=0;destroyed=!1;constructor(e,n,r,o){this.blockLen=e,this.outputLen=n,this.padOffset=r,this.isLE=o,this.buffer=new Uint8Array(e),this.view=bt(this.buffer)}update(e){dt(this),le(e);const{view:n,buffer:r,blockLen:o}=this,i=e.length;for(let s=0;s<i;){const a=Math.min(o-this.pos,i-s);if(a===o){const l=bt(e);for(;o<=i-s;s+=o)this.process(l,s);continue}r.set(e.subarray(s,s+a),this.pos),this.pos+=a,s+=a,this.pos===o&&(this.process(n,0),this.pos=0)}return this.length+=e.length,this.roundClean(),this}digestInto(e){dt(this),On(e,this),this.finished=!0;const{buffer:n,view:r,blockLen:o,isLE:i}=this;let{pos:s}=this;n[s++]=128,He(this.buffer.subarray(s)),this.padOffset>o-s&&(this.process(r,0),s=0);for(let u=s;u<o;u++)n[u]=0;r.setBigUint64(o-8,BigInt(this.length*8),i),this.process(r,0);const a=bt(e),l=this.outputLen;if(l%4)throw new Error("_sha2: outputLen must be aligned to 32bit");const c=l/4,f=this.get();if(c>f.length)throw new Error("_sha2: outputLen bigger than state");for(let u=0;u<c;u++)a.setUint32(4*u,f[u],i)}digest(){const{buffer:e,outputLen:n}=this;this.digestInto(e);const r=e.slice(0,n);return this.destroy(),r}_cloneInto(e){e||=new this.constructor,e.set(...this.get());const{blockLen:n,buffer:r,length:o,finished:i,destroyed:s,pos:a}=this;return e.destroyed=s,e.finished=i,e.length=o,e.pos=a,o%n&&e.buffer.set(r),e}clone(){return this._cloneInto()}}const fe=Uint32Array.from([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),_r=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]),de=new Uint32Array(64);class Rr extends Ir{constructor(e){super(64,e,8,!1)}get(){const{A:e,B:n,C:r,D:o,E:i,F:s,G:a,H:l}=this;return[e,n,r,o,i,s,a,l]}set(e,n,r,o,i,s,a,l){this.A=e|0,this.B=n|0,this.C=r|0,this.D=o|0,this.E=i|0,this.F=s|0,this.G=a|0,this.H=l|0}process(e,n){for(let u=0;u<16;u++,n+=4)de[u]=e.getUint32(n,!1);for(let u=16;u<64;u++){const g=de[u-15],d=de[u-2],m=ce(g,7)^ce(g,18)^g>>>3,E=ce(d,17)^ce(d,19)^d>>>10;de[u]=E+de[u-7]+m+de[u-16]|0}let{A:r,B:o,C:i,D:s,E:a,F:l,G:c,H:f}=this;for(let u=0;u<64;u++){const g=ce(a,6)^ce(a,11)^ce(a,25),d=f+g+xr(a,l,c)+_r[u]+de[u]|0,E=(ce(r,2)^ce(r,13)^ce(r,22))+Sr(r,o,i)|0;f=c,c=l,l=a,a=s+d|0,s=i,i=o,o=r,r=d+E|0}r=r+this.A|0,o=o+this.B|0,i=i+this.C|0,s=s+this.D|0,a=a+this.E|0,l=l+this.F|0,c=c+this.G|0,f=f+this.H|0,this.set(r,o,i,s,a,l,c,f)}roundClean(){He(de)}destroy(){this.destroyed=!0,this.set(0,0,0,0,0,0,0,0),He(this.buffer)}}class Ar extends Rr{A=fe[0]|0;B=fe[1]|0;C=fe[2]|0;D=fe[3]|0;E=fe[4]|0;F=fe[5]|0;G=fe[6]|0;H=fe[7]|0;constructor(){super(32)}}const Wt=br(()=>new Ar,vr(1));const he=(t,e,n)=>le(t,e,n),kn=Oe,Ln=Pt,Br=t=>Ft(t),Or=t=>Er(t),pt=BigInt(0),kt=BigInt(1);function Cn(t,e=""){if(typeof t!="boolean"){const n=e&&`"${e}" `;throw new TypeError(n+"expected boolean, got type="+typeof t)}return t}function Tr(t){if(typeof t=="bigint"){if(!lt(t))throw new RangeError("positive bigint expected, got "+t)}else kn(t);return t}function Jt(t,e=""){if(typeof t!="number"){const n=e&&`"${e}" `;throw new TypeError(n+"expected number, got type="+typeof t)}if(!Number.isSafeInteger(t)){const n=e&&`"${e}" `;throw new RangeError(n+"expected safe integer, got "+t)}}function Un(t){if(typeof t!="string")throw new TypeError("hex string expected, got "+typeof t);return t===""?pt:BigInt("0x"+t)}function kr(t){return Un(Pt(t))}function $e(t){return Un(Pt(ze(le(t)).reverse()))}function qn(t,e){if(Oe(e),e===0)throw new RangeError("zero length");t=Tr(t);const n=t.toString(16);if(n.length>e*2)throw new RangeError("number too large");return Ft(n.padStart(e*2,"0"))}function Nn(t,e){return qn(t,e).reverse()}function Lr(t,e){if(t=he(t),e=he(e),t.length!==e.length)return!1;let n=0;for(let r=0;r<t.length;r++)n|=t[r]^e[r];return n===0}function ze(t){return Uint8Array.from(he(t))}const lt=t=>typeof t=="bigint"&&pt<=t;function Cr(t,e,n){return lt(t)&&lt(e)&&lt(n)&&e<=t&&t<n}function ht(t,e,n,r){if(!Cr(e,n,r))throw new RangeError("expected valid "+t+": "+n+" <= n < "+r+", got "+e)}function Ur(t){if(t<pt)throw new Error("expected non-negative bigint, got "+t);let e;for(e=0;t>pt;t>>=kt,e+=1);return e}const qr=t=>(kt<<BigInt(t))-kt;function jt(t,e={},n={}){if(Object.prototype.toString.call(t)!=="[object Object]")throw new TypeError("expected valid options object");function r(i,s,a){if(!a&&s!=="function"&&!Object.hasOwn(t,i))throw new TypeError(`param "${i}" is invalid: expected own property`);const l=t[i];if(a&&l===void 0)return;const c=typeof l;if(c!==s||l===null)throw new TypeError(`param "${i}" is invalid: expected ${s}, got ${c}`)}const o=(i,s)=>Object.entries(i).forEach(([a,l])=>r(a,l,s));o(e,!1),o(n,!0)}const en=()=>{throw new Error("not implemented")};const V=BigInt(0),$=BigInt(1),Se=BigInt(2),Mn=BigInt(3),Dn=BigInt(4),Pn=BigInt(5),Nr=BigInt(7),Fn=BigInt(8),Mr=BigInt(9),jn=BigInt(16);function D(t,e){if(e<=V)throw new Error("mod: expected positive modulus, got "+e);const n=t%e;return n>=V?n:e+n}function se(t,e,n){if(e<V)throw new Error("pow2: expected non-negative exponent, got "+e);let r=t;for(;e-- >V;)r*=r,r%=n;return r}function tn(t,e){if(t===V)throw new Error("invert: expected non-zero number");if(e<=V)throw new Error("invert: expected positive modulus, got "+e);let n=D(t,e),r=e,o=V,i=$;for(;n!==V;){const a=r/n,l=r-n*a,c=o-i*a;r=n,n=l,o=i,i=c}if(r!==$)throw new Error("invert: does not exist");return D(o,e)}function Ht(t,e,n){const r=t;if(!r.eql(r.sqr(e),n))throw new Error("Cannot find square root")}function Hn(t,e){const n=t,r=(n.ORDER+$)/Dn,o=n.pow(e,r);return Ht(n,o,e),o}function Dr(t,e){const n=t,r=(n.ORDER-Pn)/Fn,o=n.mul(e,Se),i=n.pow(o,r),s=n.mul(e,i),a=n.mul(n.mul(s,Se),i),l=n.mul(s,n.sub(a,n.ONE));return Ht(n,l,e),l}function Pr(t){const e=$t(t),n=$n(t),r=n(e,e.neg(e.ONE)),o=n(e,r),i=n(e,e.neg(r)),s=(t+Nr)/jn;return((a,l)=>{const c=a;let f=c.pow(l,s),u=c.mul(f,r);const g=c.mul(f,o),d=c.mul(f,i),m=c.eql(c.sqr(u),l),E=c.eql(c.sqr(g),l);f=c.cmov(f,u,m),u=c.cmov(d,g,E);const h=c.eql(c.sqr(u),l),b=c.cmov(f,u,h);return Ht(c,b,l),b})}function $n(t){if(t<Mn)throw new Error("sqrt is not defined for small field");let e=t-$,n=0;for(;e%Se===V;)e/=Se,n++;let r=Se;const o=$t(t);for(;nn(o,r)===1;)if(r++>1e3)throw new Error("Cannot find square root: probably non-prime P");if(n===1)return Hn;let i=o.pow(r,e);const s=(e+$)/Se;return function(l,c){const f=l;if(f.is0(c))return c;if(nn(f,c)!==1)throw new Error("Cannot find square root");let u=n,g=f.mul(f.ONE,i),d=f.pow(c,e),m=f.pow(c,s);for(;!f.eql(d,f.ONE);){if(f.is0(d))return f.ZERO;let E=1,h=f.sqr(d);for(;!f.eql(h,f.ONE);)if(E++,h=f.sqr(h),E===u)throw new Error("Cannot find square root");const b=$<<BigInt(u-E-1),y=f.pow(g,b);u=E,g=f.sqr(y),d=f.mul(d,g),m=f.mul(m,y)}return m}}function Fr(t){return t%Dn===Mn?Hn:t%Fn===Pn?Dr:t%jn===Mr?Pr(t):$n(t)}const ve=(t,e)=>(D(t,e)&$)===$,jr=["create","isValid","is0","neg","inv","sqrt","sqr","eql","add","sub","mul","pow","div","addN","subN","mulN","sqrN"];function Hr(t){const e={ORDER:"bigint",BYTES:"number",BITS:"number"},n=jr.reduce((r,o)=>(r[o]="function",r),e);if(jt(t,n),Jt(t.BYTES,"BYTES"),Jt(t.BITS,"BITS"),t.BYTES<1||t.BITS<1)throw new Error("invalid field: expected BYTES/BITS > 0");if(t.ORDER<=$)throw new Error("invalid field: expected ORDER > 1, got "+t.ORDER);return t}function $r(t,e,n){const r=t;if(n<V)throw new Error("invalid exponent, negatives unsupported");if(n===V)return r.ONE;if(n===$)return e;let o=r.ONE,i=e;for(;n>V;)n&$&&(o=r.mul(o,i)),i=r.sqr(i),n>>=$;return o}function zn(t,e,n=!1){const r=t,o=new Array(e.length).fill(n?r.ZERO:void 0),i=e.reduce((a,l,c)=>r.is0(l)?a:(o[c]=a,r.mul(a,l)),r.ONE),s=r.inv(i);return e.reduceRight((a,l,c)=>r.is0(l)?a:(o[c]=r.mul(a,o[c]),r.mul(a,l)),s),o}function nn(t,e){const n=t,r=(n.ORDER-$)/Se,o=n.pow(e,r),i=n.eql(o,n.ONE),s=n.eql(o,n.ZERO),a=n.eql(o,n.neg(n.ONE));if(!i&&!s&&!a)throw new Error("invalid Legendre symbol result");return i?1:s?0:-1}function zr(t,e){if(e!==void 0&&kn(e),t<=V)throw new Error("invalid n length: expected positive n, got "+t);if(e!==void 0&&e<1)throw new Error("invalid n length: expected positive bit length, got "+e);const n=Ur(t);if(e!==void 0&&e<n)throw new Error(`invalid n length: expected bit length (${n}) >= n.length (${e})`);const r=e!==void 0?e:n,o=Math.ceil(r/8);return{nBitLength:r,nByteLength:o}}const rn=new WeakMap;class Zn{ORDER;BITS;BYTES;isLE;ZERO=V;ONE=$;_lengths;_mod;constructor(e,n={}){if(e<=$)throw new Error("invalid field: expected ORDER > 1, got "+e);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:i}=zr(e,r);if(i>2048)throw new Error("invalid field: expected ORDER of <= 2048 bytes");this.ORDER=e,this.BITS=o,this.BYTES=i,Object.freeze(this)}create(e){return D(e,this.ORDER)}isValid(e){if(typeof e!="bigint")throw new TypeError("invalid field element: expected bigint, got "+typeof e);return V<=e&&e<this.ORDER}is0(e){return e===V}isValidNot0(e){return!this.is0(e)&&this.isValid(e)}isOdd(e){return(e&$)===$}neg(e){return D(-e,this.ORDER)}eql(e,n){return e===n}sqr(e){return D(e*e,this.ORDER)}add(e,n){return D(e+n,this.ORDER)}sub(e,n){return D(e-n,this.ORDER)}mul(e,n){return D(e*n,this.ORDER)}pow(e,n){return $r(this,e,n)}div(e,n){return D(e*tn(n,this.ORDER),this.ORDER)}sqrN(e){return e*e}addN(e,n){return e+n}subN(e,n){return e-n}mulN(e,n){return e*n}inv(e){return tn(e,this.ORDER)}sqrt(e){let n=rn.get(this);return n||rn.set(this,n=Fr(this.ORDER)),n(this,e)}toBytes(e){return this.isLE?Nn(e,this.BYTES):qn(e,this.BYTES)}fromBytes(e,n=!1){he(e);const{_lengths:r,BYTES:o,isLE:i,ORDER:s,_mod:a}=this;if(r){if(e.length<1||!r.includes(e.length)||e.length>o)throw new Error("Field.fromBytes: expected "+r+" bytes, got "+e.length);const c=new Uint8Array(o);c.set(e,i?0:c.length-e.length),e=c}if(e.length!==o)throw new Error("Field.fromBytes: expected "+o+" bytes, got "+e.length);let l=i?$e(e):kr(e);if(a&&(l=D(l,s)),!n&&!this.isValid(l))throw new Error("invalid field element: outside of range 0..ORDER");return l}invertBatch(e){return zn(this,e)}cmov(e,n,r){return Cn(r,"condition"),r?n:e}}Object.freeze(Zn.prototype);function $t(t,e={}){return new Zn(t,e)}const gt=BigInt(0),Lt=BigInt(1);function on(t,e){const n=e.negate();return t?n:e}function Et(t,e){const n=zn(t.Fp,e.map(r=>r.Z));return e.map((r,o)=>t.fromAffine(r.toAffine(n[o])))}function Kn(t,e){if(!Number.isSafeInteger(t)||t<=0||t>e)throw new Error("invalid window size, expected [1.."+e+"], got W="+t)}function vt(t,e){Kn(t,e);const n=Math.ceil(e/t)+1,r=2**(t-1),o=2**t,i=qr(t),s=BigInt(t);return{windows:n,windowSize:r,mask:i,maxNumber:o,shiftBy:s}}function sn(t,e,n){const{windowSize:r,mask:o,maxNumber:i,shiftBy:s}=n;let a=Number(t&o),l=t>>s;a>r&&(a-=i,l+=Lt);const c=e*r,f=c+Math.abs(a)-1,u=a===0,g=a<0,d=e%2!==0;return{nextN:l,offset:f,isZero:u,isNeg:g,isNegF:d,offsetF:c}}const xt=new WeakMap,Yn=new WeakMap;function St(t){return Yn.get(t)||1}function cn(t){if(t!==gt)throw new Error("invalid wNAF")}class Zr{BASE;ZERO;Fn;bits;constructor(e,n){this.BASE=e.BASE,this.ZERO=e.ZERO,this.Fn=e.Fn,this.bits=n}_unsafeLadder(e,n,r=this.ZERO){let o=e;for(;n>gt;)n&Lt&&(r=r.add(o)),o=o.double(),n>>=Lt;return r}precomputeWindow(e,n){const{windows:r,windowSize:o}=vt(n,this.bits),i=[];let s=e,a=s;for(let l=0;l<r;l++){a=s,i.push(a);for(let c=1;c<o;c++)a=a.add(s),i.push(a);s=a.double()}return i}wNAF(e,n,r){if(!this.Fn.isValid(r))throw new Error("invalid scalar");let o=this.ZERO,i=this.BASE;const s=vt(e,this.bits);for(let a=0;a<s.windows;a++){const{nextN:l,offset:c,isZero:f,isNeg:u,isNegF:g,offsetF:d}=sn(r,a,s);r=l,f?i=i.add(on(g,n[d])):o=o.add(on(u,n[c]))}return cn(r),{p:o,f:i}}wNAFUnsafe(e,n,r,o=this.ZERO){const i=vt(e,this.bits);for(let s=0;s<i.windows&&r!==gt;s++){const{nextN:a,offset:l,isZero:c,isNeg:f}=sn(r,s,i);if(r=a,!c){const u=n[l];o=o.add(f?u.negate():u)}}return cn(r),o}getPrecomputes(e,n,r){let o=xt.get(n);return o||(o=this.precomputeWindow(n,e),e!==1&&(typeof r=="function"&&(o=r(o)),xt.set(n,o))),o}cached(e,n,r){const o=St(e);return this.wNAF(o,this.getPrecomputes(o,e,r),n)}unsafe(e,n,r,o){const i=St(e);return i===1?this._unsafeLadder(e,n,o):this.wNAFUnsafe(i,this.getPrecomputes(i,e,r),n,o)}createCache(e,n){Kn(n,this.bits),Yn.set(e,n),xt.delete(e)}hasCache(e){return St(e)!==1}}function an(t,e,n){if(e){if(e.ORDER!==t)throw new Error("Field.ORDER must match order: Fp == p, Fn == n");return Hr(e),e}else return $t(t,{isLE:n})}function Kr(t,e,n={},r){if(r===void 0&&(r=t==="edwards"),!e||typeof e!="object")throw new Error(`expected valid ${t} CURVE object`);for(const l of["p","n","h"]){const c=e[l];if(!(typeof c=="bigint"&&c>gt))throw new Error(`CURVE.${l} must be positive bigint`)}const o=an(e.p,n.Fp,r),i=an(e.n,n.Fn,r),a=["Gx","Gy","a","d"];for(const l of a)if(!o.isValid(e[l]))throw new Error(`CURVE.${l} must be valid field element of CURVE.Fp`);return e=Object.freeze(Object.assign({},e)),{CURVE:e,Fp:o,Fn:i}}function Yr(t,e){return function(r){const o=t(r);return{secretKey:o,publicKey:e(o)}}}const pe=BigInt(0),Q=BigInt(1),It=BigInt(2),Vr=BigInt(8);function Xr(t,e,n,r){const o=t.sqr(n),i=t.sqr(r),s=t.add(t.mul(e.a,o),i),a=t.add(t.ONE,t.mul(e.d,t.mul(o,i)));return t.eql(s,a)}function Gr(t,e={}){const n=e,r=Kr("edwards",t,n,n.FpFnLE),{Fp:o,Fn:i}=r;let s=r.CURVE;const{h:a}=s;jt(n,{},{uvRatio:"function"});const l=It<<BigInt(i.BYTES*8)-Q,c=E=>o.create(E),f=n.uvRatio===void 0?(E,h)=>{try{return{isValid:!0,value:o.sqrt(o.div(E,h))}}catch{return{isValid:!1,value:pe}}}:n.uvRatio;if(!Xr(o,s,s.Gx,s.Gy))throw new Error("bad curve params: generator point");function u(E,h,b=!1){const y=b?Q:pe;return ht("coordinate "+E,h,y,l),h}function g(E){if(!(E instanceof d))throw new Error("EdwardsPoint expected")}class d{static BASE=new d(s.Gx,s.Gy,Q,c(s.Gx*s.Gy));static ZERO=new d(pe,Q,Q,pe);static Fp=o;static Fn=i;X;Y;Z;T;constructor(h,b,y,x){this.X=u("x",h),this.Y=u("y",b),this.Z=u("z",y,!0),this.T=u("t",x),Object.freeze(this)}static CURVE(){return s}static fromAffine(h){if(h instanceof d)throw new Error("extended point not allowed");const{x:b,y}=h||{};return u("x",b),u("y",y),new d(b,y,Q,c(b*y))}static fromBytes(h,b=!1){const y=o.BYTES,{a:x,d:S}=s;h=ze(he(h,y,"point")),Cn(b,"zip215");const _=ze(h),A=h[y-1];_[y-1]=A&-129;const B=$e(_),L=b?l:o.ORDER;ht("point.y",B,pe,L);const U=c(B*B),j=c(U-Q),M=c(S*U-x);let{isValid:H,value:P}=f(j,M);if(!H)throw new Error("bad point: invalid y coordinate");const O=(P&Q)===Q,I=(A&128)!==0;if(!b&&P===pe&&I)throw new Error("bad point: x=0 and x_0=1");return I!==O&&(P=c(-P)),d.fromAffine({x:P,y:B})}static fromHex(h,b=!1){return d.fromBytes(Br(h),b)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}precompute(h=8,b=!0){return m.createCache(this,h),b||this.multiply(It),this}assertValidity(){const h=this,{a:b,d:y}=s;if(h.is0())throw new Error("bad point: ZERO");const{X:x,Y:S,Z:_,T:A}=h,B=c(x*x),L=c(S*S),U=c(_*_),j=c(U*U),M=c(B*b),H=c(U*c(M+L)),P=c(j+c(y*c(B*L)));if(H!==P)throw new Error("bad point: equation left != right (1)");const O=c(x*S),I=c(_*A);if(O!==I)throw new Error("bad point: equation left != right (2)")}equals(h){g(h);const{X:b,Y:y,Z:x}=this,{X:S,Y:_,Z:A}=h,B=c(b*A),L=c(S*x),U=c(y*A),j=c(_*x);return B===L&&U===j}is0(){return this.equals(d.ZERO)}negate(){return new d(c(-this.X),this.Y,this.Z,c(-this.T))}double(){const{a:h}=s,{X:b,Y:y,Z:x}=this,S=c(b*b),_=c(y*y),A=c(It*c(x*x)),B=c(h*S),L=b+y,U=c(c(L*L)-S-_),j=B+_,M=j-A,H=B-_,P=c(U*M),O=c(j*H),I=c(U*H),q=c(M*j);return new d(P,O,q,I)}add(h){g(h);const{a:b,d:y}=s,{X:x,Y:S,Z:_,T:A}=this,{X:B,Y:L,Z:U,T:j}=h,M=c(x*B),H=c(S*L),P=c(A*y*j),O=c(_*U),I=c((x+S)*(B+L)-M-H),q=O-P,J=O+P,z=c(H-b*M),Z=c(I*q),X=c(J*z),ne=c(I*z),G=c(q*J);return new d(Z,X,G,ne)}subtract(h){return g(h),this.add(h.negate())}multiply(h){if(!i.isValidNot0(h))throw new RangeError("invalid scalar: expected 1 <= sc < curve.n");const{p:b,f:y}=m.cached(this,h,x=>Et(d,x));return Et(d,[b,y])[0]}multiplyUnsafe(h){if(!i.isValid(h))throw new RangeError("invalid scalar: expected 0 <= sc < curve.n");return h===pe?d.ZERO:this.is0()||h===Q?this:m.unsafe(this,h,b=>Et(d,b))}isSmallOrder(){return this.clearCofactor().is0()}isTorsionFree(){return m.unsafe(this,s.n).is0()}toAffine(h){const b=this;let y=h;const{X:x,Y:S,Z:_}=b,A=b.is0();y==null&&(y=A?Vr:o.inv(_));const B=c(x*y),L=c(S*y),U=o.mul(_,y);if(A)return{x:pe,y:Q};if(U!==Q)throw new Error("invZ was invalid");return{x:B,y:L}}clearCofactor(){return a===Q?this:this.multiplyUnsafe(a)}toBytes(){const{x:h,y:b}=this.toAffine(),y=o.toBytes(b);return y[y.length-1]|=h&Q?128:0,y}toHex(){return Ln(this.toBytes())}toString(){return`<Point ${this.is0()?"ZERO":this.toHex()}>`}}const m=new Zr(d,i.BITS);return i.BITS>=8&&d.BASE.precompute(8),Object.freeze(d.prototype),Object.freeze(d),d}class Qr{static BASE;static ZERO;static Fp;static Fn;ep;constructor(e){this.ep=e}static fromBytes(e){en()}static fromHex(e){en()}get x(){return this.toAffine().x}get y(){return this.toAffine().y}clearCofactor(){return this}assertValidity(){this.ep.assertValidity()}toAffine(e){return this.ep.toAffine(e)}toHex(){return Ln(this.toBytes())}toString(){return this.toHex()}isTorsionFree(){return!0}isSmallOrder(){return!1}add(e){return this.assertSame(e),this.init(this.ep.add(e.ep))}subtract(e){return this.assertSame(e),this.init(this.ep.subtract(e.ep))}multiply(e){return this.init(this.ep.multiply(e))}multiplyUnsafe(e){return this.init(this.ep.multiplyUnsafe(e))}double(){return this.init(this.ep.double())}negate(){return this.init(this.ep.negate())}precompute(e,n){return this.ep.precompute(e,n),this}}const Me=BigInt(0),Re=BigInt(1),et=BigInt(2);function Wr(t){return jt(t,{P:"bigint",type:"string",adjustScalarBytes:"function",powPminus2:"function"},{randomBytes:"function"}),Object.freeze({...t})}function Jr(t){const e=Wr(t),{P:n,type:r,adjustScalarBytes:o,powPminus2:i,randomBytes:s}=e,a=r==="x25519";if(!a&&r!=="x448")throw new Error("invalid type");const l=s===void 0?Or:s,c=a?255:448,f=a?32:56,u=BigInt(a?9:5),g=BigInt(a?121665:39081),d=a?et**BigInt(254):et**BigInt(447),m=a?BigInt(8)*et**BigInt(251)-Re:BigInt(4)*et**BigInt(445)-Re,E=d+m+Re,h=O=>D(O,n),b=y(u);function y(O){return Nn(h(O),f)}function x(O){const I=ze(he(O,f,"uCoordinate"));return a&&(I[31]&=127),h($e(I))}function S(O){return $e(o(ze(he(O,f,"scalar"))))}function _(O,I){const q=j(x(I),S(O));if(q===Me)throw new Error("invalid private or public key received");return y(q)}function A(O){return _(O,b)}const B=A,L=_;function U(O,I,q){const J=h(O*(I-q));return I=h(I-J),q=h(q+J),{x_2:I,x_3:q}}function j(O,I){ht("u",O,Me,n),ht("scalar",I,d,E);const q=I,J=O;let z=Re,Z=Me,X=O,ne=Re,G=Me;for(let oe=BigInt(c-1);oe>=Me;oe--){const Ye=q>>oe&Re;G^=Ye,{x_2:z,x_3:X}=U(G,z,X),{x_2:Z,x_3:ne}=U(G,Z,ne),G=Ye;const _e=z+Z,me=h(_e*_e),ue=z-Z,Ve=h(ue*ue),Xe=me-Ve,wt=X+ne,yt=X-ne,Ge=h(yt*_e),Qe=h(wt*ue),Le=Ge+Qe,p=Ge-Qe;X=h(Le*Le),ne=h(J*h(p*p)),z=h(me*Ve),Z=h(Xe*(me+h(g*Xe)))}({x_2:z,x_3:X}=U(G,z,X)),{x_2:Z,x_3:ne}=U(G,Z,ne);const ke=i(Z);return h(z*ke)}const M={secretKey:f,publicKey:f,seed:f},H=O=>(O=O===void 0?l(f):O,he(O,M.seed,"seed"),O),P={randomSecretKey:H};return Object.freeze(M),Object.freeze(P),Object.freeze({keygen:Yr(H,B),getSharedSecret:L,getPublicKey:B,scalarMult:_,scalarMultBase:A,utils:P,GuBytes:b.slice(),lengths:M})}const eo=BigInt(0),je=BigInt(1),ln=BigInt(2),to=BigInt(3),no=BigInt(5),ro=BigInt(8),Te=BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed"),Vn={p:Te,n:BigInt("0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed"),h:ro,a:BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec"),d:BigInt("0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3"),Gx:BigInt("0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a"),Gy:BigInt("0x6666666666666666666666666666666666666666666666666666666666666658")};function Xn(t){const e=BigInt(10),n=BigInt(20),r=BigInt(40),o=BigInt(80),i=Te,a=t*t%i*t%i,l=se(a,ln,i)*a%i,c=se(l,je,i)*t%i,f=se(c,no,i)*c%i,u=se(f,e,i)*f%i,g=se(u,n,i)*u%i,d=se(g,r,i)*g%i,m=se(d,o,i)*d%i,E=se(m,o,i)*d%i,h=se(E,e,i)*f%i;return{pow_p_5_8:se(h,ln,i)*t%i,b2:a}}function oo(t){return t[0]&=248,t[31]&=127,t[31]|=64,t}const Ct=BigInt("19681161376707505956807079304988542015446066515923890162744021073123829784752");function Gn(t,e){const n=Te,r=D(e*e*e,n),o=D(r*r*e,n),i=Xn(t*o).pow_p_5_8;let s=D(t*r*i,n);const a=D(e*s*s,n),l=s,c=D(s*Ct,n),f=a===t,u=a===D(-t,n),g=a===D(-t*Ct,n);return f&&(s=l),(u||g)&&(s=c),ve(s,n)&&(s=D(-s,n)),{isValid:f||u,value:s}}const Be=Gr(Vn,{uvRatio:Gn}),xe=Be.Fp,io=Be.Fn,Ut=(()=>{const t=Te;return Jr({P:t,type:"x25519",powPminus2:e=>{const{pow_p_5_8:n,b2:r}=Xn(e);return D(se(n,to,t)*r,t)},adjustScalarBytes:oo})})(),un=Ct,so=BigInt("54469307008909316920995813868745141605393597292927456921205312896311721017578"),fn=t=>Gn(je,t),co=BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),ao=t=>xe.create($e(t)&co);class te extends Qr{static BASE=new te(Be.BASE);static ZERO=new te(Be.ZERO);static Fp=xe;static Fn=io;constructor(e){super(e)}static fromAffine(e){return new te(Be.fromAffine(e))}assertSame(e){if(!(e instanceof te))throw new Error("RistrettoPoint expected")}init(e){return new te(e)}static fromBytes(e){le(e,32);const{a:n,d:r}=Vn,o=Te,i=S=>xe.create(S),s=ao(e);if(!Lr(xe.toBytes(s),e)||ve(s,o))throw new Error("invalid ristretto255 encoding 1");const a=i(s*s),l=i(je+n*a),c=i(je-n*a),f=i(l*l),u=i(c*c),g=i(n*r*f-u),{isValid:d,value:m}=fn(i(g*u)),E=i(m*c),h=i(m*E*g);let b=i((s+s)*E);ve(b,o)&&(b=i(-b));const y=i(l*h),x=i(b*y);if(!d||ve(x,o)||y===eo)throw new Error("invalid ristretto255 encoding 2");return new te(new Be(b,y,je,x))}static fromHex(e){return te.fromBytes(Ft(e))}toBytes(){let{X:e,Y:n,Z:r,T:o}=this.ep;const i=Te,s=h=>xe.create(h),a=s(s(r+n)*s(r-n)),l=s(e*n),c=s(l*l),{value:f}=fn(s(a*c)),u=s(f*a),g=s(f*l),d=s(u*g*o);let m;if(ve(o*d,i)){let h=s(n*un),b=s(e*un);e=h,n=b,m=s(u*so)}else m=g;ve(e*d,i)&&(n=s(-n));let E=s((r-n)*m);return ve(E,i)&&(E=s(-E)),xe.toBytes(E)}equals(e){this.assertSame(e);const{X:n,Y:r}=this.ep,{X:o,Y:i}=e.ep,s=c=>xe.create(c),a=s(n*i)===s(r*o),l=s(r*i)===s(n*o);return a||l}is0(){return this.equals(te.ZERO)}}Object.freeze(te.BASE);Object.freeze(te.ZERO);Object.freeze(te.prototype);Object.freeze(te);class dn{oHash;iHash;blockLen;outputLen;canXOF=!1;finished=!1;destroyed=!1;constructor(e,n){if(Dt(e),le(n,void 0,"key"),this.iHash=e.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?e.create().update(n).digest():n);for(let i=0;i<o.length;i++)o[i]^=54;this.iHash.update(o),this.oHash=e.create();for(let i=0;i<o.length;i++)o[i]^=106;this.oHash.update(o),He(o)}update(e){return dt(this),this.iHash.update(e),this}digestInto(e){dt(this),On(e,this),this.finished=!0;const n=e.subarray(0,this.outputLen);this.iHash.digestInto(n),this.oHash.update(n),this.oHash.digestInto(n),this.destroy()}digest(){const e=new Uint8Array(this.oHash.outputLen);return this.digestInto(e),e}_cloneInto(e){e||=Object.create(Object.getPrototypeOf(this),{});const{oHash:n,iHash:r,finished:o,destroyed:i,blockLen:s,outputLen:a}=this;return e=e,e.finished=o,e.destroyed=i,e.blockLen=s,e.outputLen=a,e.oHash=n._cloneInto(e.oHash),e.iHash=r._cloneInto(e.iHash),e}clone(){return this._cloneInto()}destroy(){this.destroyed=!0,this.oHash.destroy(),this.iHash.destroy()}}const Qn=(()=>{const t=((e,n,r)=>new dn(e,n).update(r).digest());return t.create=(e,n)=>new dn(e,n),t})();function lo(t,e,n){return Dt(t),n===void 0&&(n=new Uint8Array(t.outputLen)),Qn(t,n,e)}const _t=Uint8Array.of(0),pn=Uint8Array.of();function uo(t,e,n,r=32){Dt(t),Oe(r,"length"),le(e,void 0,"prk");const o=t.outputLen;if(e.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 i=Math.ceil(r/o);n===void 0?n=pn:le(n,void 0,"info");const s=new Uint8Array(i*o),a=Qn.create(t,e),l=a._cloneInto(),c=new Uint8Array(a.outputLen);for(let f=0;f<i;f++)_t[0]=f+1,l.update(f===0?pn:c).update(n).update(_t).digestInto(c),s.set(c,o*f),a._cloneInto(l);return a.destroy(),l.destroy(),He(c,_t),s.slice(0,r)}const fo=(t,e,n,r,o)=>uo(t,lo(t,e,n),r,o);function po(t){return t instanceof Uint8Array||ArrayBuffer.isView(t)&&t.constructor.name==="Uint8Array"&&"BYTES_PER_ELEMENT"in t&&t.BYTES_PER_ELEMENT===1}function hn(t){if(typeof t!="number")throw new TypeError("number expected, got "+typeof t);if(!Number.isSafeInteger(t)||t<0)throw new RangeError("positive integer expected, got "+t)}function W(t,e,n=""){const r=po(t),o=t?.length,i=e!==void 0;if(!r||i&&o!==e){const s=n&&`"${n}" `,a=i?` of length ${e}`:"",l=r?`length=${o}`:`type=${typeof t}`,c=s+"expected Uint8Array"+a+", got "+l;throw r?new RangeError(c):new TypeError(c)}return t}function gn(t,e=!0){if(t.destroyed)throw new Error("Hash instance has been destroyed");if(e&&t.finished)throw new Error("Hash#digest() has already been called")}function ho(t,e,n=!1){W(t,void 0,"output");const r=e.outputLen;if(t.length<r)throw new RangeError("digestInto() expects output buffer of length at least "+r);if(n&&!Ze(t))throw new Error("invalid output, must be aligned")}function go(t){return new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}function Ie(t){return new Uint32Array(t.buffer,t.byteOffset,Math.floor(t.byteLength/4))}function ge(...t){for(let e=0;e<t.length;e++)t[e].fill(0)}function mt(t){return new DataView(t.buffer,t.byteOffset,t.byteLength)}const zt=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68,Wn=t=>t<<24&4278190080|t<<8&16711680|t>>>8&65280|t>>>24&255,F=zt?t=>t:t=>Wn(t)>>>0,mo=t=>{for(let e=0;e<t.length;e++)t[e]=Wn(t[e]);return t},Zt=zt?t=>t:mo;function wo(t,e){if(t.length!==e.length)return!1;let n=0;for(let r=0;r<t.length;r++)n|=t[r]^e[r];return n===0}function yo(t,e,n){const r=e,o=n||(()=>[]),i=(a,l)=>r(l,...o(a)).update(a).digest(),s=r(new Uint8Array(t),...o(new Uint8Array(0)));return i.outputLen=s.outputLen,i.blockLen=s.blockLen,i.create=(a,...l)=>r(a,...l),i}const bo=(t,e)=>{function n(r,...o){if(W(r,void 0,"key"),t.nonceLength!==void 0){const f=o[0];W(f,t.varSizeNonce?void 0:t.nonceLength,"nonce")}const i=t.tagLength;i&&o[1]!==void 0&&W(o[1],void 0,"AAD");const s=e(r,...o),a=(f,u)=>{if(u!==void 0){if(f!==2)throw new Error("cipher output not supported");W(u,void 0,"output")}};let l=!1;return{encrypt(f,u){if(l)throw new Error("cannot encrypt() twice with same key + nonce");return l=!0,W(f),a(s.encrypt.length,u),s.encrypt(f,u)},decrypt(f,u){if(W(f),i&&f.length<i)throw new Error('"ciphertext" expected length bigger than tagLength='+i);return a(s.decrypt.length,u),s.decrypt(f,u)}}}return Object.assign(n,t),n};function Eo(t,e,n=!0){if(e===void 0)return new Uint8Array(t);if(W(e,void 0,"output"),e.length!==t)throw new Error('"output" expected Uint8Array of length '+t+", got: "+e.length);if(n&&!Ze(e))throw new Error("invalid output, must be aligned");return e}function vo(t,e,n){hn(t),hn(e);const r=new Uint8Array(16),o=mt(r);return o.setBigUint64(0,BigInt(e),n),o.setBigUint64(8,BigInt(t),n),r}function Ze(t){return t.byteOffset%4===0}function Ke(t){return Uint8Array.from(W(t))}const Ae=16,Jn=new Uint8Array(16),De=Ie(Jn),xo=225,So=(t,e,n,r)=>{const o=r&1;return{s3:n<<31|r>>>1,s2:e<<31|n>>>1,s1:t<<31|e>>>1,s0:t>>>1^xo<<24&-(o&1)}},tt=t=>(t>>>0&255)<<24|(t>>>8&255)<<16|(t>>>16&255)<<8|t>>>24&255|0,Io=t=>t>64*1024?8:t>1024?4:2;class _o{blockLen=Ae;outputLen=Ae;s0=0;s1=0;s2=0;s3=0;finished=!1;destroyed=!1;t;W;windowSize;constructor(e,n){W(e,16,"key"),e=Ke(e);const r=mt(e);let o=r.getUint32(0,!1),i=r.getUint32(4,!1),s=r.getUint32(8,!1),a=r.getUint32(12,!1);const l=[];for(let m=0;m<128;m++)l.push({s0:tt(o),s1:tt(i),s2:tt(s),s3:tt(a)}),{s0:o,s1:i,s2:s,s3:a}=So(o,i,s,a);const c=Io(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 u=128/c,g=this.windowSize=2**c,d=[];for(let m=0;m<u;m++)for(let E=0;E<g;E++){let h=0,b=0,y=0,x=0;for(let S=0;S<c;S++){if(!(E>>>c-S-1&1))continue;const{s0:A,s1:B,s2:L,s3:U}=l[c*m+S];h^=A,b^=B,y^=L,x^=U}d.push({s0:h,s1:b,s2:y,s3:x})}this.t=d}_updateBlock(e,n,r,o){e^=this.s0,n^=this.s1,r^=this.s2,o^=this.s3;const{W:i,t:s,windowSize:a}=this;let l=0,c=0,f=0,u=0;const g=(1<<i)-1;let d=0;for(const m of[e,n,r,o])for(let E=0;E<4;E++){const h=m>>>8*E&255;for(let b=8/i-1;b>=0;b--){const y=h>>>i*b&g,{s0:x,s1:S,s2:_,s3:A}=s[d*a+y];l^=x,c^=S,f^=_,u^=A,d+=1}}this.s0=l,this.s1=c,this.s2=f,this.s3=u}update(e){gn(this),W(e),e=Ke(e);const n=Ie(e),r=Math.floor(e.length/Ae),o=e.length%Ae;for(let i=0;i<r;i++)this._updateBlock(F(n[i*4+0]),F(n[i*4+1]),F(n[i*4+2]),F(n[i*4+3]));return o&&(Jn.set(e.subarray(r*Ae)),this._updateBlock(F(De[0]),F(De[1]),F(De[2]),F(De[3])),ge(De)),this}destroy(){this.destroyed=!0;const{t:e}=this;for(const n of e)n.s0=0,n.s1=0,n.s2=0,n.s3=0}digestInto(e){gn(this),ho(e,this,!0),this.finished=!0;const{s0:n,s1:r,s2:o,s3:i}=this,s=Ie(e);s[0]=n,s[1]=r,s[2]=o,s[3]=i,Zt(s)}digest(){const e=new Uint8Array(Ae);return this.digestInto(e),this.destroy(),e}}const mn=yo(16,(t,e)=>new _o(t,e),t=>[t.length]),qt=16,Ro=4,nt=new Uint8Array(qt),Ao=283;function Bo(t){if(![16,24,32].includes(t.length))throw new Error('"aes key" expected Uint8Array of length 16/24/32, got length='+t.length)}function Kt(t){return t<<1^Ao&-(t>>7)}function wn(t,e){let n=0;for(;e>0;e>>=1)n^=t&-(e&1),t=Kt(t);return n}const Oo=(()=>{const t=new Uint8Array(256);for(let n=0,r=1;n<256;n++,r^=Kt(r))t[n]=r;const e=new Uint8Array(256);e[0]=99;for(let n=0;n<255;n++){let r=t[255-n];r|=r<<8,e[t[n]]=(r^r>>4^r>>5^r>>6^r>>7^99)&255}return ge(t),e})(),To=t=>t<<24|t>>>8,Rt=t=>t<<8|t>>>24;function ko(t,e){if(t.length!==256)throw new Error("Wrong sbox length");const n=new Uint32Array(256).map((c,f)=>e(t[f])),r=n.map(Rt),o=r.map(Rt),i=o.map(Rt),s=new Uint32Array(256*256),a=new Uint32Array(256*256),l=new Uint16Array(256*256);for(let c=0;c<256;c++)for(let f=0;f<256;f++){const u=c*256+f;s[u]=n[c]^r[f],a[u]=o[c]^i[f],l[u]=t[c]<<8|t[f]}return{sbox:t,sbox2:l,T0:n,T1:r,T2:o,T3:i,T01:s,T23:a}}const er=ko(Oo,t=>wn(t,3)<<24|t<<16|t<<8|wn(t,2)),Lo=(()=>{const t=new Uint8Array(16);for(let e=0,n=1;e<16;e++,n=Kt(n))t[e]=n;return t})();function Co(t){W(t);const e=t.length;Bo(t);const{sbox2:n}=er,r=[];(!zt||!Ze(t))&&r.push(t=Ke(t));const o=Zt(Ie(t)),i=o.length,s=l=>Pe(n,l,l,l,l),a=new Uint32Array(e+28);a.set(o);for(let l=i;l<a.length;l++){let c=a[l-1];l%i===0?c=s(To(c))^Lo[l/i-1]:i>6&&l%i===4&&(c=s(c)),a[l]=a[l-i]^c}return ge(...r),a}function rt(t,e,n,r,o,i){return t[n<<8&65280|r>>>8&255]^e[o>>>8&65280|i>>>24&255]}function Pe(t,e,n,r,o){return t[e&255|n&65280]|t[r>>>16&255|o>>>16&65280]<<16}function yn(t,e,n,r,o){const{sbox2:i,T01:s,T23:a}=er;let l=0;e^=t[l++],n^=t[l++],r^=t[l++],o^=t[l++];const c=t.length/4-2;for(let m=0;m<c;m++){const E=t[l++]^rt(s,a,e,n,r,o),h=t[l++]^rt(s,a,n,r,o,e),b=t[l++]^rt(s,a,r,o,e,n),y=t[l++]^rt(s,a,o,e,n,r);e=E,n=h,r=b,o=y}const f=t[l++]^Pe(i,e,n,r,o),u=t[l++]^Pe(i,n,r,o,e),g=t[l++]^Pe(i,r,o,e,n),d=t[l++]^Pe(i,o,e,n,r);return{s0:f,s1:u,s2:g,s3:d}}function ot(t,e,n,r,o){W(n,qt,"nonce"),W(r),o=Eo(r.length,o);const i=n,s=Ie(i),a=mt(i),l=Ie(r),c=Ie(o),f=e?0:12,u=r.length;let g=a.getUint32(f,e),{s0:d,s1:m,s2:E,s3:h}=yn(t,F(s[0]),F(s[1]),F(s[2]),F(s[3]));for(let y=0;y+4<=l.length;y+=4)c[y+0]=l[y+0]^F(d),c[y+1]=l[y+1]^F(m),c[y+2]=l[y+2]^F(E),c[y+3]=l[y+3]^F(h),g=g+1>>>0,a.setUint32(f,g,e),{s0:d,s1:m,s2:E,s3:h}=yn(t,F(s[0]),F(s[1]),F(s[2]),F(s[3]));const b=qt*Math.floor(l.length/Ro);if(b<u){const y=new Uint32Array([d,m,E,h]);Zt(y);const x=go(y);for(let S=b,_=0;S<u;S++,_++)o[S]=r[S]^x[_];ge(y)}return o}function Uo(t,e,n,r,o){const i=o?o.length:0,s=t.create(n,r.length+i);o&&s.update(o);const a=vo(8*r.length,8*i,e);s.update(r),s.update(a);const l=s.digest();return ge(a),l}const bn=bo({blockSize:16,nonceLength:12,tagLength:16,varSizeNonce:!0},function(e,n,r){if(n.length<8)throw new Error("aes/gcm: invalid nonce length");const o=16;function i(a,l,c){const f=Uo(mn,!1,a,c,r);for(let u=0;u<l.length;u++)f[u]^=l[u];return f}function s(){const a=Co(e),l=nt.slice(),c=nt.slice();if(ot(a,!1,c,c,l),n.length===12)c.set(n);else{const u=nt.slice();mt(u).setBigUint64(8,BigInt(n.length*8),!1);const d=mn.create(l).update(n).update(u);d.digestInto(c),d.destroy()}const f=ot(a,!1,c,nt);return{xk:a,authKey:l,counter:c,tagMask:f}}return{encrypt(a){const{xk:l,authKey:c,counter:f,tagMask:u}=s(),g=new Uint8Array(a.length+o),d=[l,c,f,u];Ze(a)||d.push(a=Ke(a)),ot(l,!1,f,a,g.subarray(0,a.length));const m=i(c,u,g.subarray(0,g.length-o));return d.push(m),g.set(m,a.length),ge(...d),g},decrypt(a){const{xk:l,authKey:c,counter:f,tagMask:u}=s(),g=[l,c,u,f];Ze(a)||g.push(a=Ke(a));const d=a.subarray(0,-o),m=a.subarray(-o),E=i(c,u,d);if(g.push(E),!wo(E,m))throw ge(...g),new Error("aes/gcm: invalid ghash tag");const h=ot(l,!1,f,d);return ge(...g),h}}}),tr="chainlesschain.remote-session.e2ee.v1",En="chainlesschain://remote-session/pair#",At=32,qo=new TextEncoder,nr=new TextDecoder;function ut(t){return qo.encode(t)}function it(t){let e="";for(const n of t)e+=String.fromCharCode(n);return btoa(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function Fe(t){const e=String(t).replace(/-/g,"+").replace(/_/g,"/"),n=atob(e),r=new Uint8Array(n.length);for(let o=0;o<n.length;o+=1)r[o]=n.charCodeAt(o);return r}function No(t){const e=new Uint8Array(t);return globalThis.crypto.getRandomValues(e),e}function Mo(){const t=Ut.utils;return t.randomSecretKey?t.randomSecretKey():t.randomPrivateKey()}function vn(t,e,n){return ut(`${tr}
2
- ${t}
3
- ${e}
4
- ${n}`)}function Do(t,e=Date.now()){if(typeof t!="string"||!t.startsWith(En))throw new Error("Invalid Remote Session pairing URI");let n;try{n=JSON.parse(nr.decode(Fe(t.slice(En.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<=e)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 Po{constructor(e,n){if(!e||!n)throw new Error("sessionId and localPeerId are required");this.sessionId=e,this.localPeerId=n,this.secretKey=Mo(),this.publicKey=Ut.getPublicKey(this.secretKey),this.key=null,this.sendSequence=0,this.receivedSequences=new Map}publicKeyBase64(){return it(this.publicKey)}pair(e,n){if(!e||!n)throw new Error("Incomplete peer key material");const r=Fe(e),o=r.length===At?r:r.slice(-At);if(o.length!==At)throw new Error("Invalid X25519 host public key");const i=Ut.getSharedSecret(this.secretKey,o),s=Wt(ut(n));this.key=fo(Wt,i,s,ut(`${tr}:${this.sessionId}`),32)}encrypt(e){if(!this.key)throw new Error("Remote Session is not paired");const n=this.sendSequence+=1,r=No(12),o=bn(this.key,r,vn(this.sessionId,this.localPeerId,n)).encrypt(ut(JSON.stringify(e)));return{v:1,sessionId:this.sessionId,senderId:this.localPeerId,sequence:n,nonce:it(r),ciphertext:it(o.slice(0,o.length-16)),tag:it(o.slice(o.length-16))}}decrypt(e){if(e?.v!==1||e.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(e.senderId)||0;if(!Number.isSafeInteger(e.sequence)||e.sequence<=n)throw new Error("Remote Session replay or out-of-order envelope rejected");const r=new Uint8Array([...Fe(e.ciphertext),...Fe(e.tag)]),o=bn(this.key,Fe(e.nonce),vn(this.sessionId,e.senderId,e.sequence)).decrypt(r);return this.receivedSequences.set(e.senderId,e.sequence),JSON.parse(nr.decode(o))}}const rr="chainlesschain://remote-control/pair#";function Fo(t){const e=String(t).replace(/-/g,"+").replace(/_/g,"/"),n=e.padEnd(e.length+(4-e.length%4)%4,"="),r=atob(n),o=new Uint8Array(r.length);for(let i=0;i<r.length;i+=1)o[i]=r.charCodeAt(i);return new TextDecoder().decode(o)}function or(t){return typeof t=="string"&&t.startsWith(rr)}function Bt(t){const e=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.exec(t);if(!e)return!1;const[n,r]=[Number(e[1]),Number(e[2])];return[e[1],e[2],e[3],e[4]].some(o=>Number(o)>255)?!1:n===127||n===10||n===172&&r>=16&&r<=31||n===192&&r===168||n===169&&r===254}function jo(t){const e=String(t||"").toLowerCase().replace(/^\[|\]$/g,"");if(!e)return!1;if(e==="localhost"||Bt(e)||e==="::1")return!0;const n=/^::ffff:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/.exec(e);if(n)return Bt(n[1]);const r=/^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/.exec(e);if(r){const o=parseInt(r[1],16),i=parseInt(r[2],16);return Bt(`${o>>8&255}.${o&255}.${i>>8&255}.${i&255}`)}return!!(/^fe[89ab]/.test(e)||/^f[cd]/.test(e))}function Ho(t){let e;try{e=new URL(String(t))}catch{throw new Error(`Invalid direct pairing endpoint: ${t}`)}if(e.protocol!=="ws:"&&e.protocol!=="wss:")throw new Error(`Direct pairing endpoint must be ws:// or wss:// (got ${e.protocol})`);if(e.protocol==="ws:"&&!jo(e.hostname))throw new Error(`Refusing plaintext ws:// to non-private host "${e.hostname}" — direct pairing is LAN/loopback only; use wss:// for anything else`);return e}function $o(t,e=Date.now()){if(!or(t))throw new Error("Not a remote-control pairing URI");let n;try{n=JSON.parse(Fo(t.slice(rr.length)))}catch{throw new Error("Malformed remote-control pairing payload")}if(n.v!==1||n.transport!=="direct")throw new Error(`Unsupported remote-control pairing payload (v=${n.v}, transport=${n.transport})`);if(!n.wsUrl||!n.remoteSessionId||!n.pairingToken)throw new Error("Pairing payload is missing wsUrl/session/token");if(n.expiresAt!=null&&n.expiresAt<=e)throw new Error("Pairing link has expired — generate a new one");return Ho(n.wsUrl),{wsUrl:n.wsUrl,serverToken:n.serverToken||null,remoteSessionId:n.remoteSessionId,agentSessionId:n.agentSessionId||null,pairingToken:n.pairingToken,scopes:Array.isArray(n.scopes)?n.scopes:null,expiresAt:n.expiresAt??null,durableMembership:n.durableMembership===!0}}const zo="chainlesschain.remote-membership-authentication-challenge.v1\0",ir="cc-remote-membership-credential/v1",Zo="cc-remote-membership",Ko=1,st="credentials",Yo="cc.remote-membership.ed25519.v1:",ct=Object.freeze({storageUnavailable:!0});function sr(t){let e="";for(const n of new Uint8Array(t))e+=String.fromCharCode(n);return btoa(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function Vo(t){return[...new Uint8Array(t)].map(e=>e.toString(16).padStart(2,"0")).join("")}function Nt(t){if(t===null||typeof t=="boolean"||typeof t=="string")return JSON.stringify(t);if(typeof t=="number"){if(!Number.isSafeInteger(t)||Object.is(t,-0))throw new Error("Remote membership challenge contains a non-canonical number");return JSON.stringify(t)}if(Array.isArray(t))return`[${t.map(e=>Nt(e)).join(",")}]`;if(!t||typeof t!="object")throw new Error("Remote membership challenge is not canonical JSON");return`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${Nt(t[e])}`).join(",")}}`}function Ot(t){const e=typeof t=="string"?t.trim():"";if(!e||e.length>256||/[\u0000-\u001f\u007f]/.test(e))throw new Error("Remote membership session id is invalid");return e}function cr(t,{optional:e=!1}={}){if(e&&t==null)return null;const n=typeof t=="string"?t.trim():"";if(!n||n.length>256||/[\u0000-\u001f\u007f]/.test(n))throw new Error("Remote membership principal id is invalid");return n}function xn(t,e){try{e?.removeItem(`${Yo}${t}`)}catch{}}function Xo(t=globalThis.indexedDB){if(!t||typeof t.open!="function")return null;let e=null;function n(){return e||(e=new Promise((o,i)=>{const s=t.open(Zo,Ko);s.onupgradeneeded=()=>{const a=s.result;a.objectStoreNames.contains(st)||a.createObjectStore(st,{keyPath:"sessionId"})},s.onsuccess=()=>o(s.result),s.onerror=()=>i(s.error||new Error("Remote membership database failed")),s.onblocked=()=>i(new Error("Remote membership database upgrade is blocked"))}).catch(o=>{throw e=null,o}),e)}async function r(o,i){const s=await n();return new Promise((a,l)=>{const c=s.transaction(st,o),f=c.objectStore(st);let u,g=!1;const d=i(f);d.onsuccess=()=>{u=d.result},d.onerror=m=>{if(d.error?.name==="ConstraintError"){g=!0,m.preventDefault(),m.stopPropagation();return}},c.oncomplete=()=>a(g?{duplicate:!0}:{result:u}),c.onerror=()=>l(c.error||d.error||new Error("Credential transaction failed")),c.onabort=()=>l(c.error||d.error||new Error("Credential transaction aborted"))})}return Object.freeze({async get(o){return(await r("readonly",i=>i.get(o))).result},async add(o){return(await r("readwrite",s=>s.add(o))).duplicate!==!0},async put(o){await r("readwrite",i=>i.put(o))},async delete(o){await r("readwrite",i=>i.delete(o))}})}function Mt(t,{type:e,usage:n,extractable:r}){if(!t||t.type!==e||t.algorithm?.name!=="Ed25519"||t.extractable!==r||!Array.isArray(t.usages)||t.usages.length!==1||t.usages[0]!==n)throw new Error("Remote membership credential record is invalid")}function at(t,e){if(!t||typeof t!="object"||Array.isArray(t)||t.schema!==ir||t.sessionId!==e)throw new Error("Remote membership credential record is invalid");return Mt(t.publicKey,{type:"public",usage:"verify",extractable:!0}),Mt(t.privateKey,{type:"private",usage:"sign",extractable:!1}),cr(t.principalId,{optional:!0}),t}function Go({subtle:t=globalThis.crypto?.subtle,credentialStore:e=Xo(),legacyStorage:n=(()=>{try{return globalThis.localStorage||null}catch{return null}})()}={}){if(!t)throw new Error("WebCrypto is required for durable pairing");const r=new Map,o=new Map;function i(u,g){const m=(o.get(u)||Promise.resolve()).then(g,g);return o.set(u,m),m.finally(()=>{o.get(u)===m&&o.delete(u)})}async function s(u){r.delete(u);try{await e?.delete(u)}catch{}}async function a(u){const g=r.get(u);if(g)try{return{record:at(g,u),persistence:"memory"}}catch{r.delete(u)}if(!e)return null;let d;try{d=await e.get(u)}catch{return ct}if(!d)return null;try{return{record:at(d,u),persistence:"indexeddb"}}catch{return await s(u),null}}async function l(u,g){const d=await t.exportKey("spki",u.publicKey),m=sr(d),E=`ed25519:${Vo(await t.digest("SHA-256",d))}`;if(u.principalId&&u.principalId!==E)throw new Error("Remote membership principal binding changed");return Object.freeze({publicKey:m,privateKey:u.privateKey,principalId:u.principalId||null,credentialPrincipalId:E,persistence:g})}async function c(u,{memoryOnly:g=!1}={}){const d=await t.generateKey({name:"Ed25519"},!1,["sign","verify"]),m=at({schema:ir,sessionId:u,publicKey:d.publicKey,privateKey:d.privateKey,principalId:null},u);if(e&&!g){let E;try{E=await e.add(m)}catch{return r.set(u,m),{record:m,persistence:"memory"}}if(E)return{record:m,persistence:"indexeddb"};const h=await a(u);if(h&&h!==ct)return h;throw new Error("Concurrent credential creation did not persist a key")}return r.set(u,m),{record:m,persistence:"memory"}}async function f(u){xn(u,n);const g=await a(u),d=g===ct?await c(u,{memoryOnly:!0}):g||await c(u);return l(d.record,d.persistence)}return Object.freeze({getOrCreate(u){const g=Ot(u);return i(g,()=>f(g))},rememberPrincipal(u,g){const d=Ot(u),m=cr(g);return i(d,async()=>{const E=await a(d);if(E===ct)throw new Error("Remote membership principal persistence is unavailable");const h=E||await c(d),b=await l(h.record,h.persistence);if(m!==b.credentialPrincipalId)throw new Error("Remote membership principal binding changed");if(h.record.principalId&&h.record.principalId!==m)throw new Error("Remote membership principal binding changed");if(h.record.principalId===m&&h.persistence==="indexeddb")return b;if(h.persistence!=="indexeddb"||!e)throw new Error("Remote membership principal could not be persisted before join");const y=at({...h.record,principalId:m},d);try{await e.put(y)}catch(x){throw new Error("Remote membership principal could not be persisted before join",{cause:x})}return l(y,"indexeddb")})},forget(u){const g=Ot(u);return i(g,async()=>{xn(g,n),r.delete(g);try{await e?.delete(g)}catch{}})}})}let Tt=null;function Yt(){return Tt||(Tt=Go()),Tt}function Qo(t){return Yt().getOrCreate(t)}function Wo(t,e){return Yt().rememberPrincipal(t,e)}function Jo(t){return Yt().forget(t)}async function Sn(t,e){const n=globalThis.crypto?.subtle;if(!n||!e)throw new Error("Remote membership signing credential is unavailable");Mt(e,{type:"private",usage:"sign",extractable:!1});const r=new TextEncoder,o=r.encode(zo),i=r.encode(Nt(t)),s=new Uint8Array(o.length+i.length);return s.set(o,0),s.set(i,o.length),sr(await n.sign({name:"Ed25519"},e,s))}const In=1e3,_n=3e4,Rn=20,ei=15e3,ti=5e3,ni=2;let An=0;function ft(){return globalThis.crypto?.randomUUID?globalThis.crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`}function ri(){return`web-${ft()}`}const Bn=lr("remoteSession",()=>{const t=re("idle"),e=re([]),n=re(""),r=re(null),o=re(null),i=re(null),s=re([]),a=re([]);let l=null,c=null,f=null,u=null,g=!1,d=!1,m=0,E=null,h=null,b=0,y=null,x=0,S=null,_=null,A=null,B=null,L=new Map,U=0;function j(){E&&(clearTimeout(E),E=null)}function M(){h&&(clearTimeout(h),h=null)}function H(p){const w=p?.payload&&typeof p.payload=="object"?p.payload:p;if(p?.type==="permission.request"){const v=p.requestId||p.approvalId||null;v&&!s.value.some(T=>T.requestId===v)&&(s.value=[...s.value,{requestId:v,tool:p.tool||null,action:p.action||null,detail:p.detail||null,askedAt:p.askedAt||Date.now(),fingerprint:p.fingerprint||null,binding:p.binding||null,revision:p.revision??null}])}else if(p?.type==="permission.resolved"){const v=p.requestId||p.approvalId||null;v&&P(v)}else if(["question_request","question.requested","question"].includes(p?.type)){const v=w?.requestId||w?.id||p?.id||null,T=w?.binding&&typeof w.binding=="object"&&!Array.isArray(w.binding)?w.binding:null;v&&T&&!a.value.some(N=>N.requestId===v)&&(a.value=[...a.value,{requestId:v,question:w.question||w.prompt||"",options:Array.isArray(w.options)?w.options:[],multiSelect:w.multiSelect===!0,binding:T}])}else if(["question_resolved","question.resolved"].includes(p?.type)){const v=w?.requestId||w?.id||p?.id||null;v&&O(v)}An+=1,e.value=[...e.value,{...p,_id:An,_rxAt:Date.now()}].slice(-200)}function P(p){s.value=s.value.filter(w=>w.requestId!==p)}function O(p){a.value=a.value.filter(w=>w.requestId!==p)}function I(p){!p||!p.requestId||e.value.some(v=>v.type==="permission.resolved"&&v.requestId===p.requestId)||s.value.some(v=>v.requestId===p.requestId)||(s.value=[...s.value,p])}function q(){if(!f)return;g||(b=0);const p=new WebSocket(f.relayUrl);l=p,p.addEventListener("open",()=>{p===l&&p.send(JSON.stringify({type:"register",peerId:u,deviceType:"web",deviceInfo:{protocol:"remote-session.e2ee.v1"}}))}),p.addEventListener("message",w=>{p===l&&Z(w.data)}),p.addEventListener("close",()=>{p===l&&(M(),l=null,d?t.value="disconnected":J())}),p.addEventListener("error",()=>{p===l&&(n.value="Remote Session relay connection error")})}function J(){if(d||E)return;if(m>=Rn){t.value="disconnected",n.value="Remote Session 重连已放弃(中继长时间不可达)— 回到本页可自动重试";return}const p=Math.min(In*2**m,_n);m+=1,t.value="reconnecting",E=setTimeout(()=>{E=null,d||q()},p)}function z(){if(!(d||E)){if(o.value==="direct"){if(!_?.durableMembership||!B||S)return;m=0,n.value="",me(_,{resumeOnly:!0});return}o.value!=="relay"||!f||l||(m=0,n.value="",t.value="connecting",q())}}function Z(p){try{let w=JSON.parse(typeof p=="string"?p:String(p));if(w.type==="offline-message"&&(w=w.originalMessage||{}),w.type==="registered"){g?t.value="connected":(t.value="pairing",ne());return}if(w.type!=="message")return;const v=w.payload;if(!v||v.type!=="remote-session.encrypted")return;const T=c.decrypt(v.envelope);T.type==="pair.accepted"?(M(),g=!0,b=0,m=0,t.value="connected"):T.type==="session.revoked"?(d=!0,g=!1,j(),M(),l&&l.close(),l=null,t.value="revoked"):H(T)}catch(w){t.value="error",n.value=w?.message||"Remote Session protocol error"}}function X(p,w){return!l||l.readyState!==WebSocket.OPEN||!f?!1:(l.send(JSON.stringify({type:"message",to:f.hostPeerId,payload:{type:p,...w}})),!0)}function ne(){const p={type:"pair.join",remoteSessionId:f.remoteSessionId,token:f.pairingToken,capabilities:["approval-binding-v1","approval-decision-v1"]};y?.token&&(p.pushToken=y.token,p.pushProvider=y.provider||"web");const w=X("remote-session.pair",{mobilePeerId:u,mobilePublicKey:c.publicKeyBase64(),envelope:c.encrypt(p)});return M(),w?(h=setTimeout(()=>{if(h=null,!(g||d)){if(b>=ni){try{l?.close()}catch{}return}b+=1,ne()}},ti),!0):!1}function G(p){if(!l||l.readyState!==WebSocket.OPEN||!g)return!1;const w={...p,commandId:p.commandId||ft(),seq:p.seq??++x};return X("remote-session.encrypted",{envelope:c.encrypt(w)})}function ke(p){for(const[,w]of L)clearTimeout(w.timer),w.reject(new Error(p));L=new Map}function oe(p,w={}){const v=S;if(!v||v.readyState!==WebSocket.OPEN)return Promise.reject(new Error("not connected"));const T=`web-rc-${++U}-${ft()}`;return new Promise((N,we)=>{const We=setTimeout(()=>{L.delete(T),we(new Error(`request "${p}" timed out`))},ei);L.set(T,{resolve:N,reject:we,timer:We}),v.send(JSON.stringify({id:T,type:p,...w}))})}function Ye(p){let w;try{w=JSON.parse(typeof p=="string"?p:String(p))}catch{return}const v=w.requestId&&L.has(w.requestId)?w.requestId:w.id&&L.has(w.id)?w.id:null;if(v){const T=L.get(v);if(L.delete(v),clearTimeout(T.timer),w.type==="error"){const N=new Error(w.message||w.payload?.message||"server error");typeof w.code=="string"&&w.code&&(N.code=w.code),N.remoteResponse=!0,T.reject(N)}else T.resolve(w);return}if(w.type==="remote-session-event"&&w.remoteSessionId===_?.remoteSessionId){H(w.event||{});return}if(w.type==="remote-session-revoked"&&w.remoteSessionId===_?.remoteSessionId){d=!0;const T=_.remoteSessionId;B=null,A=null,Jo(T),S&&S.close(),S=null,t.value="revoked"}}function _e(){if(d||E||!_?.durableMembership||!B)return;if(m>=Rn){t.value="disconnected",n.value="Durable Remote Session reconnect attempts were exhausted; retry from this page.";return}const p=Math.min(In*2**m,_n);m+=1,t.value="reconnecting",E=setTimeout(()=>{E=null,!d&&_&&me(_,{resumeOnly:!0})},p)}function me(p,{resumeOnly:w=!1}={}){_=p,r.value=p.remoteSessionId,o.value="direct",i.value=p.scopes,t.value=w?"reconnecting":"connecting";const v=new WebSocket(p.wsUrl);S=v,v.addEventListener("open",async()=>{if(v===S)try{if(t.value=w?"reconnecting":"pairing",p.serverToken){const N=await oe("auth",{token:p.serverToken});if(!N.success)throw new Error(N.message||"authentication failed")}let T;if(p.durableMembership){A=A||await Qo(p.remoteSessionId),B=B||A.principalId||null;const N=C=>typeof C=="string"&&/^[1-9]\d*$/.test(C),we=(C,Ce,ye)=>{const Je=C.session?.sessionId||null,ar=C.member?.principalId||C.member?.clientId||null;if(Je!==p.remoteSessionId||ar!==A.credentialPrincipalId||!N(ye?.sessionEpoch)||!N(ye?.membershipEpoch)||C.session?.sessionEpoch!==ye.sessionEpoch||C.member?.membershipEpoch!==ye.membershipEpoch)throw new Error(`Durable Remote Session ${Ce} binding changed`);return C},We=async()=>{if(!B)throw new Error("Durable Remote Session principal binding is unavailable");const C=await oe("remote-session-resume-challenge",{remoteSessionId:p.remoteSessionId,principalId:B});if(C.challenge?.sessionId!==p.remoteSessionId||C.challenge?.principalId!==B||!N(C.challenge?.sessionEpoch)||!N(C.challenge?.membershipEpoch))throw new Error("Durable Remote Session resume challenge binding changed");const Ce=await Sn(C.challenge,A.privateKey);return we(await oe("remote-session-resume",{remoteSessionId:p.remoteSessionId,challengeId:C.challenge.challengeId,signature:Ce}),"resume",C.challenge)},Vt=async()=>{const C=await oe("remote-session-join-challenge",{remoteSessionId:p.remoteSessionId,token:p.pairingToken,credentialPublicKey:A.publicKey,capabilities:["approval-binding-v1","approval-decision-v1"]});if(C.challenge?.sessionId!==p.remoteSessionId||C.challenge?.principalId!==A.credentialPrincipalId||C.challenge?.credentialPublicKey!==A.publicKey||!N(C.challenge?.sessionEpoch)||!N(C.challenge?.membershipEpoch))throw new Error("Durable Remote Session join challenge binding changed");A=await Wo(p.remoteSessionId,A.credentialPrincipalId),B=A.principalId;const Ce=await Sn(C.challenge,A.privateKey);try{return we(await oe("remote-session-join",{remoteSessionId:p.remoteSessionId,challengeId:C.challenge.challengeId,signature:Ce}),"join",C.challenge)}catch(ye){if(ye?.remoteResponse)throw ye;try{return await We()}catch(Je){throw Je.joinOutcomeUnknown=!0,Je}}};if(B)try{T=await We()}catch(C){if(w||C?.code!=="REMOTE_SESSION_MEMBERSHIP_NOT_ACTIVE")throw C;T=await Vt()}else{if(w)throw new Error("Durable Remote Session principal binding is unavailable");T=await Vt()}}else T=await oe("remote-session-join",{remoteSessionId:p.remoteSessionId,token:p.pairingToken});if(v!==S)return;i.value=T.member?.scopes||p.scopes,m=0,n.value="",t.value="connected"}catch(T){if(v!==S)return;n.value=T?.message||"Direct pairing failed",ke(n.value),S=null;try{v.close()}catch{}!d&&(w||T?.joinOutcomeUnknown===!0)?_e():t.value="error"}}),v.addEventListener("message",T=>{v===S&&Ye(T.data)}),v.addEventListener("close",()=>{if(v===S){if(S=null,ke("connection closed"),d){t.value!=="revoked"&&(t.value="disconnected");return}if(p.durableMembership&&B){_e();return}["connected","connecting","pairing","reconnecting"].includes(t.value)&&(t.value="disconnected",n.value="直连会话已断开 — 配对码为一次性,请在主机端重新生成配对链接")}}),v.addEventListener("error",()=>{v===S&&(n.value="Remote control host connection error")})}function ue(p){return oe("remote-session-publish",{remoteSessionId:_.remoteSessionId,commandId:ft(),seq:++x,event:p}).catch(w=>(n.value=w?.message||"Remote control send failed",null))}function Ve(p,w={}){Le();try{if(n.value="",e.value=[],s.value=[],d=!1,x=0,or(p))return A=null,B=null,m=0,me($o(p)),!0;const v=Do(p);return y=w.pushCredentials||null,u=ri(),c=new Po(v.remoteSessionId,u),c.pair(v.hostPublicKey,v.pairingToken),f=v,r.value=v.remoteSessionId,o.value="relay",i.value=null,g=!1,b=0,m=0,t.value="connecting",q(),!0}catch(v){return t.value="error",n.value=v?.message||"Invalid pairing link",!1}}function Xe(p){const w=(p||"").trim();if(w){if(o.value==="direct"){S?ue({type:"prompt",content:w}):n.value="Remote Session is not connected";return}G({type:"prompt",content:w})||(n.value="Remote Session is not connected")}}function wt(p,w){if(!p)return;const v=s.value.find(N=>N.requestId===p)||null;P(p);const T=w?{kind:"acceptOnce"}:{kind:"decline"};if(o.value==="direct"){if(!S){n.value="Remote Session is not connected",I(v);return}ue({type:"approval.resolve",requestId:p,decision:T,answer:w,approved:w,fingerprint:v?.fingerprint||null,binding:v?.binding||null,revision:v?.revision??null}).then(N=>{N===null&&I(v)});return}G({type:"approval.resolve",requestId:p,decision:T,approved:w,fingerprint:v?.fingerprint||null,binding:v?.binding||null,revision:v?.revision??null})||(n.value="Remote Session is not connected",I(v))}function yt(p,w){if(!p)return;const v=a.value.find(N=>N.requestId===p)||null;if(!v?.binding)return;O(p);const T={type:"question.answer",requestId:p,answer:w,binding:v.binding};if(o.value==="direct"){if(!S){n.value="Remote Session is not connected",a.value=[...a.value,v];return}ue(T).then(N=>{N===null&&!a.value.some(we=>we.requestId===p)&&(a.value=[...a.value,v])});return}G(T)||(n.value="Remote Session is not connected",a.value=[...a.value,v])}function Ge(){if(o.value==="direct"){S&&ue({type:"interrupt"});return}G({type:"interrupt"})}function Qe(p,w="web"){if(y=p?{token:p,provider:w}:null,!g)return;const v={type:"push.register"};y?.token&&(v.pushToken=y.token,v.pushProvider=y.provider),G(v)}function Le(){if(d=!0,g=!1,j(),M(),l)try{l.close()}catch{}if(l=null,S)try{S.close()}catch{}S=null,_=null,A=null,B=null,ke("disconnected"),t.value!=="revoked"&&(t.value="disconnected")}return{status:t,events:e,error:n,remoteSessionId:r,transport:o,scopes:i,pendingApprovals:s,pendingQuestions:a,connect:Ve,sendPrompt:Xe,approve:wt,answerQuestion:yt,interrupt:Ge,updatePushCredentials:Qe,resumeReconnect:z,disconnect:Le}}),oi={__name:"RemoteSession",setup(t,{expose:e}){e();const n=Bn();Xt(()=>n.resumeReconnect());const{status:r,events:o,error:i,transport:s,pendingApprovals:a,pendingQuestions:l}=Gt(n),c=re(""),f=re(""),u=re(!1),g=Ne(()=>["connecting","pairing","connected","reconnecting"].includes(r.value)),d=Ne(()=>({idle:"未连接",connecting:"连接中",pairing:"配对中",connected:"已连接",reconnecting:"重连中",disconnected:"已断开",revoked:"已被撤销",error:"错误"})[r.value]||r.value),m=Ne(()=>r.value==="connected"?"green":["connecting","pairing","reconnecting"].includes(r.value)?"blue":["revoked","error"].includes(r.value)?"red":"default"),E=Ne(()=>[...o.value].reverse());function h(I){return String(I?.type||"").includes("approval")}function b(I){return I?.content||I?.payload?.content||I?.message||""}function y(I){return I?.requestId||I?.approvalId||""}function x(){n.connect(c.value.trim())}function S(I){u.value=!1,I&&(c.value=I,n.connect(I))}function _(I){const q=typeof I=="string"?I:f.value;n.sendPrompt(q),f.value=""}function A(I,q){n.approve(y(I),q)}function B(I,q){n.approve(I.requestId,q)}function L(I){return String(I&&typeof I=="object"?I.label??I.value??"":I??"")}function U(I){return I&&typeof I=="object"&&"value"in I?I.value:L(I)}function j(I,q){let J=q;if(J===void 0){const z=I.options.map(L).filter(Boolean),Z=window.prompt(`${I.question||"Input required"}${z.length?`
5
- Options: ${z.join(", ")}`:""}`);if(Z===null)return;J=I.multiSelect?Z.split(",").map(X=>X.trim()).filter(Boolean):Z}n.answerQuestion(I.requestId,J)}function M(){n.interrupt()}function H(){n.disconnect()}function P(){i.value=""}const O={store:n,status:r,events:o,error:i,transport:s,pendingApprovals:a,pendingQuestions:l,pairingLink:c,promptText:f,scannerOpen:u,isActive:g,statusLabel:d,statusColor:m,orderedEvents:E,isApproval:h,eventBody:b,requestIdOf:y,connect:x,onScanned:S,send:_,respond:A,respondPermission:B,optionLabel:L,optionValue:U,answerQuestion:j,interrupt:M,disconnect:H,clearError:P,computed:Ne,onMounted:Xt,ref:re,get storeToRefs(){return Gt},get LinkOutlined(){return mr},get ScanOutlined(){return gr},QrScannerModal:pr,get useRemoteSessionStore(){return Bn}};return Object.defineProperty(O,"__isScriptSetup",{enumerable:!1,value:!0}),O}},ii={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},si={key:0,class:"page-sub"},ci={key:0,style:{"word-break":"break-all"}},ai={key:1,class:"page-sub"};function li(t,e,n,r,o,i){const s=ee("a-tag"),a=ee("a-space"),l=ee("a-alert"),c=ee("a-textarea"),f=ee("a-button"),u=ee("a-card"),g=ee("a-input-search"),d=ee("a-spin"),m=ee("a-list-item-meta"),E=ee("a-list-item"),h=ee("a-list"),b=ee("a-badge"),y=ee("a-empty");return K(),Ue("div",null,[qe("div",ii,[e[4]||(e[4]=qe("div",null,[qe("h2",{class:"page-title"},"远程会话"),qe("p",{class:"page-sub"}," 扫码或粘贴桌面端的配对链接,接管一个编码会话(观察 / 提示 / 审批 / 中断)——支持中继 E2EE 链接与局域网直连链接 ")],-1)),k(a,null,{default:R(()=>[r.transport?(K(),ie(s,{key:0,color:"purple"},{default:R(()=>[Y(Ee(r.transport==="direct"?"直连":"中继"),1)]),_:1})):be("v-if",!0),k(s,{color:r.statusColor},{default:R(()=>[Y(Ee(r.statusLabel),1)]),_:1},8,["color"])]),_:1})]),r.error?(K(),ie(l,{key:0,type:"error","show-icon":"",style:{"margin-bottom":"16px"},message:r.error,closable:"",onClose:r.clearError},null,8,["message"])):be("v-if",!0),r.isActive?(K(),ie(u,{key:2,title:"会话控制",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{extra:R(()=>[k(a,null,{default:R(()=>[k(f,{size:"small",onClick:r.interrupt},{default:R(()=>[...e[8]||(e[8]=[Y("中断",-1)])]),_:1}),k(f,{size:"small",danger:"",onClick:r.disconnect},{default:R(()=>[...e[9]||(e[9]=[Y("断开",-1)])]),_:1})]),_:1})]),default:R(()=>[k(a,{direction:"vertical",style:{width:"100%"},size:8},{default:R(()=>[k(g,{value:r.promptText,"onUpdate:value":e[2]||(e[2]=x=>r.promptText=x),placeholder:"发送提示到远程会话…","enter-button":"发送",disabled:r.status!=="connected",onSearch:r.send},null,8,["value","disabled"]),r.status==="reconnecting"?(K(),ie(d,{key:0,size:"small"},{tip:R(()=>[...e[10]||(e[10]=[Y("正在重连…",-1)])]),_:1})):be("v-if",!0)]),_:1})]),_:1})):(K(),ie(u,{key:1,title:"连接远程会话",style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{default:R(()=>[k(a,{direction:"vertical",style:{width:"100%"},size:12},{default:R(()=>[k(c,{value:r.pairingLink,"onUpdate:value":e[0]||(e[0]=x=>r.pairingLink=x),rows:3,placeholder:"chainlesschain://remote-session/pair#…(中继)或 chainlesschain://remote-control/pair#…(局域网直连)","allow-clear":""},null,8,["value"]),k(a,null,{default:R(()=>[k(f,{type:"primary",disabled:!r.pairingLink.trim(),onClick:r.connect},{icon:R(()=>[k(r.LinkOutlined)]),default:R(()=>[e[5]||(e[5]=Y(" 连接 ",-1))]),_:1},8,["disabled"]),k(f,{onClick:e[1]||(e[1]=x=>r.scannerOpen=!0)},{icon:R(()=>[k(r.ScanOutlined)]),default:R(()=>[e[6]||(e[6]=Y(" 扫码 ",-1))]),_:1})]),_:1}),e[7]||(e[7]=qe("p",{class:"page-sub",style:{margin:"0"}}," 链接为一次性配对码,敏感载荷仅在片段(#)中,不会发往服务器。 ",-1))]),_:1})]),_:1})),r.pendingQuestions.length?(K(),ie(u,{key:3,title:"Agent questions",style:{background:"var(--bg-card)","border-color":"var(--warning-color, #faad14)","margin-bottom":"16px"}},{default:R(()=>[k(h,{size:"small","data-source":r.pendingQuestions,"data-testid":"question-cards"},{renderItem:R(({item:x})=>[k(E,null,{actions:R(()=>[(K(!0),Ue(ur,null,fr(x.multiSelect?[]:x.options,S=>(K(),ie(f,{key:r.optionLabel(S),size:"small",onClick:_=>r.answerQuestion(x,r.optionValue(S))},{default:R(()=>[Y(Ee(r.optionLabel(S)),1)]),_:2},1032,["onClick"]))),128)),x.multiSelect||!x.options.length?(K(),ie(f,{key:0,type:"primary",size:"small",onClick:S=>r.answerQuestion(x)},{default:R(()=>[...e[11]||(e[11]=[Y(" Answer ",-1)])]),_:1},8,["onClick"])):be("v-if",!0)]),default:R(()=>[k(m,{description:x.question||"Input required"},null,8,["description"])]),_:2},1024)]),_:1},8,["data-source"])]),_:1})):be("v-if",!0),r.pendingApprovals.length?(K(),ie(u,{key:4,style:{background:"var(--bg-card)","border-color":"var(--warning-color, #faad14)","margin-bottom":"16px"}},{title:R(()=>[e[12]||(e[12]=Y(" 待审批权限请求 ",-1)),k(b,{count:r.pendingApprovals.length,style:{"margin-left":"8px"}},null,8,["count"])]),default:R(()=>[k(h,{size:"small","data-source":r.pendingApprovals,"data-testid":"approval-cards"},{renderItem:R(({item:x})=>[k(E,null,{actions:R(()=>[k(f,{type:"primary",size:"small",onClick:S=>r.respondPermission(x,!0)},{default:R(()=>[...e[13]||(e[13]=[Y("批准",-1)])]),_:1},8,["onClick"]),k(f,{size:"small",danger:"",onClick:S=>r.respondPermission(x,!1)},{default:R(()=>[...e[14]||(e[14]=[Y("拒绝",-1)])]),_:1},8,["onClick"])]),default:R(()=>[k(m,null,{title:R(()=>[k(a,null,{default:R(()=>[k(s,{color:"orange"},{default:R(()=>[Y(Ee(x.tool||"tool"),1)]),_:2},1024),x.action?(K(),Ue("span",si,Ee(x.action),1)):be("v-if",!0)]),_:2},1024)]),description:R(()=>[x.detail?(K(),Ue("code",ci,Ee(x.detail),1)):(K(),Ue("span",ai,"(无详情)"))]),_:2},1024)]),_:2},1024)]),_:1},8,["data-source"])]),_:1})):be("v-if",!0),k(u,{title:"会话事件",style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:R(()=>[r.events.length?(K(),ie(h,{key:1,size:"small","data-source":r.orderedEvents},{renderItem:R(({item:x})=>[k(E,null,dr({default:R(()=>[k(m,{description:r.eventBody(x)},{title:R(()=>[k(s,{color:r.isApproval(x)?"orange":"blue"},{default:R(()=>[Y(Ee(x.type||"event"),1)]),_:2},1032,["color"])]),_:2},1032,["description"])]),_:2},[r.isApproval(x)?{name:"actions",fn:R(()=>[k(f,{type:"link",size:"small",onClick:S=>r.respond(x,!0)},{default:R(()=>[...e[15]||(e[15]=[Y("批准",-1)])]),_:1},8,["onClick"]),k(f,{type:"link",size:"small",danger:"",onClick:S=>r.respond(x,!1)},{default:R(()=>[...e[16]||(e[16]=[Y("拒绝",-1)])]),_:1},8,["onClick"])]),key:"0"}:void 0]),1024)]),_:1},8,["data-source"])):(K(),ie(y,{key:0,description:"尚无事件"}))]),_:1}),k(r.QrScannerModal,{open:r.scannerOpen,onScanned:r.onScanned,onCancel:e[3]||(e[3]=x=>r.scannerOpen=!1)},null,8,["open"])])}const gi=hr(oi,[["render",li],["__file","/tmp/cc-web-panel-TsYAbK/repo/packages/web-panel/src/views/RemoteSession.vue"]]);export{gi as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-D9ScRFxz.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-B0-T2BSh.js";import{a0 as t}from"./index-D9ScRFxz.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-DkGeZu54.js";import"./useFlexGapSupport-FRhakk1e.js";import"./styleChecker-DmyEOxm5.js";import"./index-B2qpjU-D.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-BLKZalle.js";import{a0 as t}from"./index-D9ScRFxz.js";import"./vendor-Bn1JzzAn.js";import"./index-B2qpjU-D.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};