chainlesschain 0.166.2 → 0.166.3

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 (170) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-BnZ24WRk.js → AIOps-DZTvbk_H.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-ivXY7MGb.js → ActionButton-IaEVUN3o.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-BQS4OD-k.js → Analytics-CCQab0gl.js} +2 -2
  5. package/src/assets/web-panel/assets/{AppLayout-wOBuOKTO.js → AppLayout-Bs_0GVpx.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-BYuC4nw-.js → Artifacts-Bm83-yJv.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-BIeVfBt6.js → Audit-Bah1XDR5.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-hIuyhmJ7.js → BackgroundAgents-BPZA0B5d.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-B6ohdgPQ.js → Backup-BMydWFiM.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-BzgYCw6h.js → BaseInput-lhopFSZz.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-CwahvZU1.js → Chat-Bbbs5BP1.js} +4 -4
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-B-1IZ_k8.js → ChatBubbleRenderer-BIAfOKCj.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-26EDP2x0.js → Checkbox-CLEMA9J4.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-DYLw1Zvd.js → Codegen-deCSwmnK.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-DH_zAvD-.js → Col-CH-n8haq.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-DURrTXJu.js → Community-DJuAl6dw.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-CQyBqN0p.js → Compact-BMyLBmgs.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-a0DfgKHD.js → Compliance-BK75Ss93.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-C6fY_5Ke.js → Cowork-5XbJwKYq.js} +3 -3
  20. package/src/assets/web-panel/assets/{Cron-DOwmpbTe.js → Cron-Ezgir7IZ.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-DEPOIEUs.js → Crosschain-CKuMoYA7.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-DaKc-CEV.js → DID-CxS244cH.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-C-0KLXq5.js → Dashboard-wrUKrsJy.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-CnsDukzr.js → Dropdown-A6I91Z2J.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-Bi_ACD4N.js → EmailListRenderer-BofaiRYY.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-BZASpnx3.js → FamilyGuardDashboard-D3eeNA64.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-43oTtzyp.js → Federation-DzK-3AjS.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-oyVadnkZ.js → FormItemContext-Dm6mYA8b.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-Cwvfd6TZ.js → GenericCardRenderer-BeWL-Q1b.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-Cgi2wvU0.js → Git-CtGCxg9p.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-l8TWDKZ0.js → Governance-DZvFB46G.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-Dc8j6TaO.js → Inference-ntqp4cmw.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-DgcO-Fwz.js → KnowledgeGraph-CrLYbqLe.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-DjiZpiwa.js → Logs-CKA1PRhC.js} +2 -2
  35. package/src/assets/web-panel/assets/MarkdownRenderer-DtwoKxDJ.js +1 -0
  36. package/src/assets/web-panel/assets/{Marketplace-BeDn1hFc.js → Marketplace-B8aPsXYv.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-PGdVfWK6.js → McpTools-DQOgNdGS.js} +3 -3
  38. package/src/assets/web-panel/assets/{Memory-e76lY3a1.js → Memory-i9IK9B0M.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-DKlQqot_.js → MobileBridge-BynYvpv9.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-C4g6WOEr.js → MobileProjects-DixivGuQ.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-1j3NpRQq.js → Mtc-OWPvWVNr.js} +5 -5
  42. package/src/assets/web-panel/assets/{MtcAudit-DgwiVd1C.js → MtcAudit-Cqpg5C4A.js} +4 -4
  43. package/src/assets/web-panel/assets/{Multisig-Dzg5lZZY.js → Multisig-CT5kMJIZ.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-D7GYhst-.js → NLProgramming-BXD0Dz0h.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-Blcfvaic.js → Notes-T1w5p8N5.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-Dc4Y6vfr.js → NotificationSettings-DFCThpKJ.js} +1 -1
  47. package/src/assets/web-panel/assets/OrderTableRenderer-BJOuM0Kl.js +1 -0
  48. package/src/assets/web-panel/assets/{Organization-DBXq024L.js → Organization-CSFcw86q.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-CFPbdx1Y.js → Overflow-BxVMuLTk.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-w7z61NR5.js → P2P-B8qxY_yX.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-B7eGGZOa.js → PdhVaultBrowser-Bcq27Exy.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-Df5Cl50D.js → Permissions-CGBvJVXP.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-C-We7RF6.js → PersonalDataHub-DM9IEeJ3.js} +5 -5
  54. package/src/assets/web-panel/assets/{Pipeline-B6fHPnKy.js → Pipeline-wEskx2-p.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-B85BdiIc.js → Privacy-DIA02lLJ.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-CcOyazSe.js → ProjectInit-uMXlNLHV.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-BE53KfuU.js → ProjectSettings-Sy3NOtt7.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-DOvMOoe_.js → Projects-xFjfOkQM.js} +1 -1
  59. package/src/assets/web-panel/assets/{Providers-5l7sT9lq.js → Providers-CNyOpbg8.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-DE37RXy4.js → QrScannerModal-Dk1UVRwI.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-BGmGCo7j.js → QuickAsk-B-UqLoLG.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-BFdx8Nrm.js → Recommend-CiTBVZvN.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-C1w-j_hB.js → RemoteSession-BhABd516.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-BOvn-10y.js → Reputation-Dq1xTCcN.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-db-a1YO9.js → Row-DbFc4sc7.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-DeS43ZGM.js → RssFeed-D7IBkkLm.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-BaQYNfeb.js → Search-BVyMlGoa.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-yt1ESHDg.js → Security-BzMm9Be_.js} +3 -3
  69. package/src/assets/web-panel/assets/{Services-BcNqPUsS.js → Services-Dfk0kied.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-X3ceUQWf.js → Skeleton-C8B5mUit.js} +1 -1
  71. package/src/assets/web-panel/assets/Skills-BNTPoJn0.js +1 -0
  72. package/src/assets/web-panel/assets/{Sla-C_fdfbuJ.js → Sla-gnFelKfT.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-CDqohXXQ.js → SpeechSettings-B12gCQkK.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-B25maYEY.js → SyncSettings-CHWk9cpj.js} +2 -2
  75. package/src/assets/web-panel/assets/Tasks-B_zs9jkJ.js +1 -0
  76. package/src/assets/web-panel/assets/{Templates-DUH0iuc4.js → Templates-PjdppQrI.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-DrvhHf9T.js → Tenant-CH3aARxE.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-C2lJVYHA.js → Terminal-BqqrYyg3.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-C1Hf_jYn.js → TimelineRenderer-Dx9soq9f.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-DniS1NpS.js → Tokens-C66KpDDZ.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-4jrcb8oA.js → Trigger-DHxgGsap.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-DiBte55w.js → Trust-3cct4QxN.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-CZRtc4VB.js → UkeySign-Cs6UfDEH.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-BtYGJDmg.js → VideoEditing-jbu2EAQa.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-D1nrTm7H.js → Wallet-BIykFB9D.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-DI91acpx.js → WebAuthn-DFgqKmHG.js} +5 -5
  87. package/src/assets/web-panel/assets/{WorkflowEditor-BtQjI50d.js → WorkflowEditor-CNg5bBiH.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-I4A-f4FC.js → chat-B-6wzojE.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-QZkDkFVt.js → colors-BHAq7y9y.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item--FtCdzpr.js → compact-item-CGJnSTnu.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-CaIKIKxP.js → createContext-Cx0ZF512.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-CNq_RRw4.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-DLYUII6-.js → hasIn-DibIw3z7.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-OQPIS_am.js → index-0NWSa3Xq.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-3rVtgqa2.js → index-746-mNhw.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-BxPoPofq.js → index-Aaeca8o4.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-D4CXFU-w.js → index-B1jAbIxx.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BLGJmgmx.js → index-B28jdxwR.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CL4c5D6G.js → index-B2rOMBeN.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-vfiDxdN2.js → index-BAoFiV3n.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-Du2wUavy.js → index-BCtW4F8-.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DAuf8r5o.js → index-BEXM3qSV.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BGWSmE3G.js → index-BFTGp-aF.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-eTqL91aV.js → index-BJhS6i02.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CQ7OBHka.js → index-BO-XxBD5.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-hfiZ-i2b.js → index-BR2BiNtx.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CBtII-nl.js → index-BRflLAdr.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-Ch0IFpGy.js → index-BTWb3sbj.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-B65QxJaG.js → index-BZ7GbrgF.js} +1 -1
  110. package/src/assets/web-panel/assets/index-B_H-RZ9i.js +1 -0
  111. package/src/assets/web-panel/assets/{index-BebTT7iR.js → index-BiMLsIwd.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-Ygi2rYL1.js → index-Bmqjip63.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DGLHSCHM.js → index-BoySHSgZ.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DJrd_CR3.js → index-Bz3J0eVB.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DK2r6Bv7.js → index-C6M2yHVE.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-yayaayEA.js → index-CH2A_Fdn.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Ooo_5jHo.js → index-CUX9mq3M.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-D2xETCkj.js → index-CY2E4Y99.js} +1 -1
  119. package/src/assets/web-panel/assets/index-CkH9UQQL.js +1 -0
  120. package/src/assets/web-panel/assets/{index-CisYjy88.js → index-CoKu7Q9r.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DA_TPdzX.js → index-CrjkH_QU.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-Bs0qPPFb.js → index-Cuity3gy.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BkJgWW_L.js → index-CwcWpW1q.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-Deg2S9ZJ.js → index-Cz5ety6j.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-CXaeZCRP.js → index-DXNcm44v.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DVitI3UQ.js → index-DjCJIttz.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CgMm85BY.js → index-DnsVRqCa.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-21I79XSf.js → index-SbQacweG.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BcgtvJbC.js → index-g0V_mLQ9.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-BvdwNnHC.js → index-puIs3mTs.js} +3 -3
  131. package/src/assets/web-panel/assets/{index-0DYBQ-6e.js → index-sI_1E0co.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-C3PnIEOH.js → index-woOjtit-.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-DDkTvw8k.js → initDefaultProps-Gbl9QOqg.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-fkr96tN5.js → motion-BHh6ZzZu.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-CGBV0SV2.js → move-mX6Rwrd1.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-DAsCliFt.js → mtc-parser-CuzZa_kI.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-BM8PMmKN.js → omit-DjANYkpi.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-C6SdWoTK.js → pickAttrs-C_3v40wY.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-BG0EVu-d.js → placementArrow-L2HgRede.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-L10IvfYC.js → responsiveObserve-DIkGMHyT.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-TddIkbrn.js → slide-C1hp5tD0.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-FlveF2Yn.js → statusUtils-DH1W2uFA.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-BrXRyebg.js → styleChecker-dEaKQcv2.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-B7_oiDXZ.js → useFlexGapSupport-CD7j1zxt.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-CQYeRYWb.js → useFs-C8jXMvEM.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-DspIkhVi.js → usePersonalDataHub-C4r-8mys.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-BCwmwMAW.js → vnode-DDuI6wgY.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-B0cEGluV.js → zoom-Dd-DteT6.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/commands/team.js +165 -53
  151. package/src/data/changelog.json +13 -0
  152. package/src/lib/agent-team/task-lease.js +718 -6
  153. package/src/lib/agent-team/team-graph-projection.js +303 -0
  154. package/src/lib/agent-team/team-message-bridge.js +83 -5
  155. package/src/lib/agent-team/team-message-tools.js +34 -1
  156. package/src/lib/agent-team/team-runner.js +1131 -9
  157. package/src/lib/agent-team/team-session-message-adapter.js +720 -0
  158. package/src/lib/app-server/cli-agent-kernel-adapter.js +1 -0
  159. package/src/lib/app-server/protocol.js +43 -0
  160. package/src/lib/app-server/server.js +8 -11
  161. package/src/lib/approval-grant-ledger.js +187 -0
  162. package/src/lib/session-message-fabric.js +265 -3
  163. package/src/runtime/headless-stream.js +184 -19
  164. package/src/assets/web-panel/assets/MarkdownRenderer-B5MFCi0N.js +0 -1
  165. package/src/assets/web-panel/assets/OrderTableRenderer-dgM87XIn.js +0 -1
  166. package/src/assets/web-panel/assets/Skills-DmYeax6C.js +0 -1
  167. package/src/assets/web-panel/assets/Tasks-3ILwauYw.js +0 -1
  168. package/src/assets/web-panel/assets/devWarning-D7qVrkrO.js +0 -1
  169. package/src/assets/web-panel/assets/index-D9Y_ZwZn.js +0 -1
  170. package/src/assets/web-panel/assets/index-D_cPes4G.js +0 -1
@@ -22,6 +22,12 @@ import {
22
22
  approvalBindingDigest,
23
23
  verifyApprovalBinding,
24
24
  } from "../lib/agent-authority.js";
25
+ import { validateApprovalDecision } from "../lib/app-server/protocol.js";
26
+ import {
27
+ APPROVAL_GRANTS_EVENT,
28
+ ApprovalGrantLedger,
29
+ approvalPermissionForContext,
30
+ } from "../lib/approval-grant-ledger.js";
25
31
  import {
26
32
  normalizeInteractionBinding,
27
33
  sameInteractionBinding,
@@ -572,14 +578,57 @@ export function parseInputEvent(line) {
572
578
  if (obj && typeof obj === "object" && obj.type === "compact") {
573
579
  return { compact: true };
574
580
  }
575
- // Approval verdicts (panel Approve/Deny for --interactive-approvals):
576
- // {"type":"approval","id":"appr-1","approve":true|false}
581
+ // Approval verdicts (panel/SDK for --interactive-approvals). New clients
582
+ // send the canonical structured decision and echo the request binding. The
583
+ // boolean remains an N-1 migration field for older clients only.
584
+ // {"type":"approval","id":"appr-1","decision":{"kind":"acceptOnce"},"binding":"..."}
585
+ // {"type":"approval","id":"appr-1","approve":true|false} // legacy
577
586
  if (obj && typeof obj === "object" && obj.type === "approval") {
578
587
  if (!obj.id) return null;
588
+ const structured = obj.decision !== undefined;
589
+ let decision;
590
+ let invalidReason = null;
591
+ if (structured) {
592
+ const validation = validateApprovalDecision(obj.decision);
593
+ if (validation.ok) {
594
+ decision = obj.decision;
595
+ } else {
596
+ invalidReason = "invalid-decision";
597
+ decision = {
598
+ kind: "decline",
599
+ reason: "Invalid structured approval decision",
600
+ };
601
+ }
602
+ } else {
603
+ decision =
604
+ obj.approve === true
605
+ ? { kind: "acceptOnce" }
606
+ : { kind: "decline", reason: "Legacy boolean denial" };
607
+ }
608
+ const approve = [
609
+ "acceptOnce",
610
+ "acceptForTurn",
611
+ "acceptForSession",
612
+ ].includes(decision.kind);
613
+ if (
614
+ !invalidReason &&
615
+ structured &&
616
+ typeof obj.approve === "boolean" &&
617
+ obj.approve !== approve
618
+ ) {
619
+ invalidReason = "decision-boolean-mismatch";
620
+ decision = {
621
+ kind: "decline",
622
+ reason: "Structured and legacy approval verdicts disagree",
623
+ };
624
+ }
579
625
  return {
580
626
  approval: {
581
627
  id: String(obj.id),
582
- approve: obj.approve === true,
628
+ approve: invalidReason ? false : approve,
629
+ decision,
630
+ structured,
631
+ invalidReason,
583
632
  // Optional approval binding (authority §"权限来源与跨 Agent 授权边界"):
584
633
  // when present it must match the digest the matching approval_request
585
634
  // advertised, so a stale/mis-routed/param-substituted verdict can't
@@ -2035,12 +2084,61 @@ async function runAgentHeadlessStreamInWorkspace(
2035
2084
  }
2036
2085
  };
2037
2086
 
2087
+ // Structured approval grants are exact tool+args+cwd capabilities. Turn
2088
+ // grants are memory-only and reset before every model turn; session grants
2089
+ // are restored only from a verified authority event and are appended under
2090
+ // the same anchored transcript contract as other session authority state.
2091
+ let approvalGrantLedger = new ApprovalGrantLedger({ sessionId });
2092
+ let approvalGrantPersistenceError = null;
2093
+ if (persist) {
2094
+ try {
2095
+ const event = store.findLatestEvent(
2096
+ sessionId,
2097
+ APPROVAL_GRANTS_EVENT,
2098
+ (candidate) => candidate?.data && typeof candidate.data === "object",
2099
+ );
2100
+ if (event) {
2101
+ approvalGrantLedger = ApprovalGrantLedger.fromJSON(event.data, {
2102
+ sessionId,
2103
+ });
2104
+ }
2105
+ } catch (error) {
2106
+ approvalGrantPersistenceError = error;
2107
+ approvalGrantLedger = new ApprovalGrantLedger({ sessionId });
2108
+ emit({
2109
+ type: "recovery_degraded",
2110
+ component: "approval_grants",
2111
+ session_id: sessionId,
2112
+ error:
2113
+ "Persisted approval grants could not be verified; all grants were discarded",
2114
+ });
2115
+ }
2116
+ }
2117
+ const persistApprovalGrants = () => {
2118
+ if (!persist || approvalGrantPersistenceError) return false;
2119
+ try {
2120
+ const persisted = store.appendAuthorityEvent(
2121
+ sessionId,
2122
+ APPROVAL_GRANTS_EVENT,
2123
+ approvalGrantLedger.toJSON(),
2124
+ );
2125
+ if (persisted === false) {
2126
+ throw new Error("session store rejected approval grants");
2127
+ }
2128
+ return true;
2129
+ } catch (error) {
2130
+ approvalGrantPersistenceError = error;
2131
+ return false;
2132
+ }
2133
+ };
2134
+
2038
2135
  // ── Interactive approvals (--interactive-approvals; chat-panel UX) ────────
2039
2136
  // CONFIRM-tier decisions (risky shell via the ApprovalGate, settings/hook
2040
2137
  // `ask`) normally fail closed in headless. With this opt-in they become a
2041
2138
  // structured round-trip instead: emit `approval_request`, BLOCK the tool
2042
- // until a {"type":"approval",id,approve} arrives on stdin (handled by the
2043
- // concurrent pump below, so the wait never deadlocks), fail closed on
2139
+ // until a canonical structured decision (or an N-1 boolean response) arrives
2140
+ // on stdin (handled by the concurrent pump below, so the wait never
2141
+ // deadlocks), fail closed on
2044
2142
  // timeout (CC_APPROVAL_TIMEOUT_MS, default 120s) or stdin close. The
2045
2143
  // resolution is echoed as `approval_resolved` so UIs can settle their cards.
2046
2144
  const interactive = options.interactiveApprovals === true;
@@ -2050,45 +2148,87 @@ async function runAgentHeadlessStreamInWorkspace(
2050
2148
  Number(process.env.CC_APPROVAL_TIMEOUT_MS) > 0
2051
2149
  ? Number(process.env.CC_APPROVAL_TIMEOUT_MS)
2052
2150
  : 120000;
2053
- const settleApproval = (id, approve, via, incomingBinding = null) => {
2151
+ const settleApproval = (
2152
+ id,
2153
+ decision,
2154
+ via,
2155
+ incomingBinding = null,
2156
+ { structured = false, invalidReason = null } = {},
2157
+ ) => {
2054
2158
  const p = pendingApprovals.get(id);
2055
2159
  if (!p) return;
2160
+ const approve = [
2161
+ "acceptOnce",
2162
+ "acceptForTurn",
2163
+ "acceptForSession",
2164
+ ].includes(decision?.kind);
2056
2165
  // Approval binding (authority §"权限来源与跨 Agent 授权边界"): an *approve*
2057
2166
  // verdict that carries a binding which does NOT match the one the request
2058
2167
  // advertised is stale / mis-routed / argument-tampered — reject it (deny,
2059
2168
  // fail closed) instead of green-lighting a different or changed tool call.
2060
- // A verdict with no binding stays backward-compatible; a deny always wins.
2169
+ // A legacy boolean verdict with no binding stays backward-compatible. A
2170
+ // structured approval must echo the binding; a deny always wins.
2061
2171
  if (
2062
2172
  approve === true &&
2063
- incomingBinding &&
2064
2173
  p.binding &&
2065
- !verifyApprovalBinding(p.binding, incomingBinding)
2174
+ ((structured && !incomingBinding) ||
2175
+ (incomingBinding && !verifyApprovalBinding(p.binding, incomingBinding)))
2066
2176
  ) {
2067
2177
  pendingApprovals.delete(id);
2068
2178
  clearTimeout(p.timer);
2179
+ const rejectionReason = incomingBinding
2180
+ ? "binding-mismatch"
2181
+ : "binding-missing";
2069
2182
  emit({
2070
2183
  type: "approval_resolved",
2071
2184
  id,
2072
2185
  approved: false,
2073
- via: "binding-mismatch",
2186
+ decision: {
2187
+ kind: "decline",
2188
+ reason: `Approval ${rejectionReason}`,
2189
+ },
2190
+ via: rejectionReason,
2074
2191
  session_id: sessionId,
2075
2192
  });
2076
2193
  p.resolve(false);
2077
2194
  return;
2078
2195
  }
2196
+ if (
2197
+ approve &&
2198
+ (decision.kind === "acceptForTurn" ||
2199
+ decision.kind === "acceptForSession")
2200
+ ) {
2201
+ const priorSessionGrants = new Map(approvalGrantLedger.sessionGrants);
2202
+ const priorRevision = approvalGrantLedger.revision;
2203
+ const applied = approvalGrantLedger.applyDecision(
2204
+ decision,
2205
+ p.requiredPermission,
2206
+ p.binding,
2207
+ );
2208
+ decision = applied.decision;
2209
+ if (applied.persistedScope && persist && !persistApprovalGrants()) {
2210
+ approvalGrantLedger.sessionGrants = priorSessionGrants;
2211
+ approvalGrantLedger.revision = priorRevision;
2212
+ decision = { kind: "acceptOnce" };
2213
+ via = "session-grant-persistence-failed";
2214
+ }
2215
+ }
2079
2216
  pendingApprovals.delete(id);
2080
2217
  clearTimeout(p.timer);
2081
2218
  emit({
2082
2219
  type: "approval_resolved",
2083
2220
  id,
2084
- approved: approve === true,
2085
- via,
2221
+ approved: invalidReason ? false : approve,
2222
+ decision,
2223
+ via: invalidReason || via,
2086
2224
  session_id: sessionId,
2087
2225
  });
2088
- p.resolve(approve === true);
2226
+ p.resolve(!invalidReason && approve);
2089
2227
  };
2090
- const interactiveConfirm = (ctx = {}) =>
2091
- new Promise((resolve) => {
2228
+ const interactiveConfirm = (ctx = {}) => {
2229
+ const requiredPermission = approvalPermissionForContext(ctx, { cwd });
2230
+ if (approvalGrantLedger.allows(requiredPermission)) return true;
2231
+ return new Promise((resolve) => {
2092
2232
  const id = `appr-${++approvalSeq}`;
2093
2233
  // Bind this approval request to the exact call it authorizes: the request
2094
2234
  // id, its normalized arguments, and the policy/rule in force. The digest
@@ -2101,11 +2241,21 @@ async function runAgentHeadlessStreamInWorkspace(
2101
2241
  policyDigest: ctx.rule || ctx.riskLevel || ctx.risk || null,
2102
2242
  });
2103
2243
  const timer = setTimeout(
2104
- () => settleApproval(id, false, "timeout"),
2244
+ () =>
2245
+ settleApproval(
2246
+ id,
2247
+ { kind: "decline", reason: "Approval timed out" },
2248
+ "timeout",
2249
+ ),
2105
2250
  approvalTimeoutMs,
2106
2251
  );
2107
2252
  timer.unref?.();
2108
- pendingApprovals.set(id, { resolve, timer, binding });
2253
+ pendingApprovals.set(id, {
2254
+ resolve,
2255
+ timer,
2256
+ binding,
2257
+ requiredPermission,
2258
+ });
2109
2259
  emit({
2110
2260
  type: "approval_request",
2111
2261
  id,
@@ -2116,8 +2266,10 @@ async function runAgentHeadlessStreamInWorkspace(
2116
2266
  rule: ctx.rule || null,
2117
2267
  reason: ctx.reason || null,
2118
2268
  binding,
2269
+ requested_permissions: [requiredPermission],
2119
2270
  });
2120
2271
  });
2272
+ };
2121
2273
 
2122
2274
  let approvalGate = null;
2123
2275
  try {
@@ -2206,6 +2358,10 @@ async function runAgentHeadlessStreamInWorkspace(
2206
2358
  type: "approval_resolved",
2207
2359
  id,
2208
2360
  approved: false,
2361
+ decision: {
2362
+ kind: "decline",
2363
+ reason: `Approval ${via}`,
2364
+ },
2209
2365
  via,
2210
2366
  session_id: sessionId,
2211
2367
  });
@@ -3260,9 +3416,13 @@ async function runAgentHeadlessStreamInWorkspace(
3260
3416
  // Approval verdicts settle a BLOCKED tool — never queued.
3261
3417
  settleApproval(
3262
3418
  parsed.approval.id,
3263
- parsed.approval.approve,
3419
+ parsed.approval.decision,
3264
3420
  parsed.approval.approve ? "user-approve" : "user-deny",
3265
3421
  parsed.approval.binding,
3422
+ {
3423
+ structured: parsed.approval.structured,
3424
+ invalidReason: parsed.approval.invalidReason,
3425
+ },
3266
3426
  );
3267
3427
  continue;
3268
3428
  }
@@ -3321,7 +3481,11 @@ async function runAgentHeadlessStreamInWorkspace(
3321
3481
  // stdin closed while approvals were pending → fail closed so the blocked
3322
3482
  // turn can finish and the process can exit.
3323
3483
  for (const id of [...pendingApprovals.keys()]) {
3324
- settleApproval(id, false, "stdin-closed");
3484
+ settleApproval(
3485
+ id,
3486
+ { kind: "decline", reason: "Approval input closed" },
3487
+ "stdin-closed",
3488
+ );
3325
3489
  }
3326
3490
  // stdin closed while a question was pending → user_timeout (model proceeds).
3327
3491
  for (const id of [...pendingQuestions.keys()]) {
@@ -4112,6 +4276,7 @@ async function runAgentHeadlessStreamInWorkspace(
4112
4276
  }
4113
4277
  }
4114
4278
  turns += 1;
4279
+ approvalGrantLedger.beginTurn(turns);
4115
4280
  if (persistenceFailure) {
4116
4281
  terminalPersistenceFailure = persistenceFailure;
4117
4282
  sawError = true;
@@ -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-BvdwNnHC.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 w=d(_,[["render",m],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-o4ASeD/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};
@@ -1 +0,0 @@
1
- import{I as h,P as l,J as u,U as s,R as n,c as i,K as v,Q as _,V as g,b as o}from"./vendor-Bn1JzzAn.js";import{_ as w}from"./index-BvdwNnHC.js";import"./icons-DG5UD-6K.js";const k={__name:"OrderTableRenderer",props:{event:{type:Object,required:!0}},setup(p,{expose:r}){r();const a=p,e=o(()=>a.event.content||{}),d=o(()=>a.event.extra||{}),m=o(()=>d.value.merchant||e.value.merchant||e.value.counterparty||"—"),c=o(()=>e.value.title||e.value.name||e.value.itemName||e.value.text||"—"),y=o(()=>{const t=e.value.amount??e.value.price??e.value.total;return t==null?"—":`${e.value.currency||"¥"} ${typeof t=="number"?t.toFixed(2):t}`}),T=o(()=>d.value.orderNo||e.value.orderNo||e.value.orderId),f=o(()=>e.value.status||e.value.state),S=o(()=>{const t=(f.value||"").toLowerCase();return t.includes("成功")||t.includes("succe")||t.includes("paid")?"green":t.includes("退")||t.includes("refund")?"orange":t.includes("失败")||t.includes("fail")?"red":"default"}),b=o(()=>{if(!a.event.occurredAt)return"";const t=new Date(a.event.occurredAt);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}),x={props:a,c:e,e:d,merchantText:m,itemText:c,amountText:y,orderNo:T,statusText:f,statusColor:S,formattedTime:b,computed:o};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},N={class:"order-card"},C={class:"head"},O={class:"time"},V={class:"row"},D={class:"val"},R={class:"row"},A={class:"val"},B={class:"row amount-row"},I={class:"val amount"},j={key:0,class:"row"},F={class:"val mono"},M={key:1,class:"row"};function P(p,r,a,e,d,m){const c=h("a-tag");return l(),u("div",N,[s("div",C,[s("span",O,n(e.formattedTime),1),i(c,{color:"gold"},{default:v(()=>[_(n(a.event.source.adapter),1)]),_:1}),i(c,null,{default:v(()=>[_(n(a.event.subtype),1)]),_:1})]),s("div",V,[r[0]||(r[0]=s("span",{class:"key"},"商户",-1)),s("span",D,n(e.merchantText),1)]),s("div",R,[r[1]||(r[1]=s("span",{class:"key"},"商品/项目",-1)),s("span",A,n(e.itemText),1)]),s("div",B,[r[2]||(r[2]=s("span",{class:"key"},"金额",-1)),s("span",I,n(e.amountText),1)]),e.orderNo?(l(),u("div",j,[r[3]||(r[3]=s("span",{class:"key"},"单号",-1)),s("span",F,n(e.orderNo),1)])):g("v-if",!0),e.statusText?(l(),u("div",M,[r[4]||(r[4]=s("span",{class:"key"},"状态",-1)),i(c,{color:e.statusColor},{default:v(()=>[_(n(e.statusText),1)]),_:1},8,["color"])])):g("v-if",!0)])}const K=w(k,[["render",P],["__scopeId","data-v-5ed5524d"],["__file","/tmp/cc-web-panel-o4ASeD/repo/packages/web-panel/src/components/pdh/renderers/OrderTableRenderer.vue"]]);export{K as default};
@@ -1 +0,0 @@
1
- import{E as I,b as w,r as b,I as m,J as y,U as a,R as g,c as i,K as u,V as h,F as C,Z as L,N as O,o as M,P as p,Q as S,S as A}from"./vendor-Bn1JzzAn.js";import{u as q,_ as E}from"./index-BvdwNnHC.js";import{u as N}from"./useShellMode-CgR0wCYM.js";import{p as P}from"./parsers-YNLm7sQ0.js";import{u as R}from"./chat-I4A-f4FC.js";import{aa as V,aq as j,R as B}from"./icons-DG5UD-6K.js";const z=I("skills",()=>{const _=b(!1),t=b([]),n=b(""),e=b("all"),k=w(()=>{const o=new Set(["all"]);return t.value.forEach(l=>{l.category&&o.add(l.category),l.executionMode&&o.add(l.executionMode)}),[...o]}),v=w(()=>{let o=t.value;if(e.value!=="all"&&(o=o.filter(l=>l.category===e.value||l.executionMode===e.value)),n.value){const l=n.value.toLowerCase();o=o.filter(d=>d.name?.toLowerCase().includes(l)||d.description?.toLowerCase().includes(l)||d.title?.toLowerCase().includes(l))}return o});async function f(){const o=q();_.value=!0;try{if(N().isEmbedded){const c=await o.sendRaw({type:"skill.list"},2e4);c?.ok&&Array.isArray(c.result?.skills)?t.value=c.result.skills:(console.error("skill.list custom topic failed:",c?.error),t.value=[]);return}const{output:l}=await o.execute("skill list",2e4),d=P(l);t.value=d}catch(l){console.error("Failed to load skills:",l)}finally{_.value=!1}}return{loading:_,allSkills:t,searchQuery:n,selectedCategory:e,categories:k,filteredSkills:v,loadSkills:f}}),F={__name:"Skills",setup(_,{expose:t}){t();const n=z(),e=R(),k=O(),v=w(()=>n.categories.filter(r=>r!=="all").slice(0,6));function f(r){return{"built-in":"内置","cli-direct":"CLI",agent:"Agent","llm-query":"LLM",hybrid:"混合",workspace:"工作区",marketplace:"市场"}[r]||r}function o(r){return{"cli-direct":"CLI",agent:"Agent","llm-query":"LLM",hybrid:"混合","built-in":"内置"}[r]||r||"未知"}function l(r){return{"cli-direct":"cyan",agent:"purple","llm-query":"blue",hybrid:"orange","built-in":"green"}[r]||"default"}async function d(r){await e.createSession("agent"),k.push("/chat"),setTimeout(()=>{e.currentSessionId&&e.sendMessage(e.currentSessionId,`/skill run ${r}`)},300)}M(()=>{n.allSkills.length||n.loadSkills()});const c={skillsStore:n,chatStore:e,router:k,displayCategories:v,catLabel:f,modeLabel:o,modeColor:l,runSkill:d,computed:w,onMounted:M,get useRouter(){return O},get ReloadOutlined(){return B},get PlayCircleOutlined(){return j},get AppstoreOutlined(){return V},get useSkillsStore(){return z},get useChatStore(){return R}};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}},Q={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},U={class:"page-sub"},D={style:{display:"flex",gap:"12px","margin-bottom":"20px","flex-wrap":"wrap"}},T={key:0,style:{"text-align":"center",padding:"60px"}},G={class:"skills-grid"},J={style:{display:"flex","justify-content":"space-between","align-items":"flex-start"}},K={style:{flex:"1","min-width":"0"}},W={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","margin-bottom":"4px","font-family":"monospace"}},Z={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},H={style:{"margin-left":"12px","flex-shrink":"0"}},X={style:{"margin-top":"10px",display:"flex","justify-content":"flex-end"}},Y={style:{"text-align":"center",padding:"60px",color:"var(--text-muted)"}};function $(_,t,n,e,k,v){const f=m("a-button"),o=m("a-input-search"),l=m("a-radio-button"),d=m("a-radio-group"),c=m("a-spin"),r=m("a-tag"),x=m("a-card");return p(),y("div",null,[a("div",Q,[a("div",null,[t[3]||(t[3]=a("h2",{class:"page-title"},"技能管理",-1)),a("p",U,g(e.skillsStore.allSkills.length)+" 个可用技能",1)]),i(f,{type:"primary",ghost:"",loading:e.skillsStore.loading,onClick:t[0]||(t[0]=s=>e.skillsStore.loadSkills())},{icon:u(()=>[i(e.ReloadOutlined)]),default:u(()=>[t[4]||(t[4]=S(" 刷新 ",-1))]),_:1},8,["loading"])]),h(" Search & Filter "),a("div",D,[i(o,{value:e.skillsStore.searchQuery,"onUpdate:value":t[1]||(t[1]=s=>e.skillsStore.searchQuery=s),placeholder:"搜索技能名称或描述...",style:{width:"300px"},"allow-clear":""},null,8,["value"]),i(d,{value:e.skillsStore.selectedCategory,"onUpdate:value":t[2]||(t[2]=s=>e.skillsStore.selectedCategory=s),"button-style":"solid"},{default:u(()=>[i(l,{value:"all"},{default:u(()=>[...t[5]||(t[5]=[S("全部",-1)])]),_:1}),(p(!0),y(C,null,L(e.displayCategories,s=>(p(),A(l,{key:s,value:s},{default:u(()=>[S(g(e.catLabel(s)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),h(" Loading State "),e.skillsStore.loading?(p(),y("div",T,[i(c,{size:"large"}),t[6]||(t[6]=a("div",{style:{color:"var(--text-muted)","margin-top":"12px"}},"加载技能中...",-1))])):e.skillsStore.filteredSkills.length?(p(),y(C,{key:1},[h(" Skills Grid "),a("div",G,[(p(!0),y(C,null,L(e.skillsStore.filteredSkills,s=>(p(),A(x,{key:s.name,class:"skill-card",size:"small",hoverable:"",style:{background:"var(--bg-card)","border-color":"var(--border-color)",cursor:"default"}},{default:u(()=>[a("div",J,[a("div",K,[a("div",W,g(s.name),1),a("div",Z,g(s.description||"暂无描述"),1)]),a("div",H,[i(r,{color:e.modeColor(s.executionMode),style:{"font-size":"10px"}},{default:u(()=>[S(g(e.modeLabel(s.executionMode)),1)]),_:2},1032,["color"])])]),a("div",X,[i(f,{size:"small",type:"primary",ghost:"",onClick:ee=>e.runSkill(s.name)},{icon:u(()=>[i(e.PlayCircleOutlined)]),default:u(()=>[t[7]||(t[7]=S(" 运行 ",-1))]),_:1},8,["onClick"])])]),_:2},1024))),128))])],2112)):(p(),y(C,{key:2},[h(" Empty State "),a("div",Y,[i(e.AppstoreOutlined,{style:{"font-size":"48px","margin-bottom":"16px",display:"block"}}),a("div",null,g(e.skillsStore.allSkills.length?"没有匹配的技能":"点击刷新加载技能列表"),1)])],2112))])}const ie=E(F,[["render",$],["__scopeId","data-v-d64d43f5"],["__file","/tmp/cc-web-panel-o4ASeD/repo/packages/web-panel/src/views/Skills.vue"]]);export{ie as default};
@@ -1 +0,0 @@
1
- import{E as F,b as z,r as R,I as p,J as c,U as _,c as n,K as a,S as C,V as x,o as I,x as V,P as i,Q as k,R as r,F as T,Z as O}from"./vendor-Bn1JzzAn.js";import{u as P,_ as E}from"./index-BvdwNnHC.js";import{R as U}from"./icons-DG5UD-6K.js";const B=F("tasks",()=>{const y=R([]),l=R(!1);let u=null,t=null,d=null;const b=z(()=>y.value.filter(e=>e.status==="running")),v=z(()=>y.value.filter(e=>e.status==="pending")),w=z(()=>y.value.filter(e=>e.status==="completed"||e.status==="failed"||e.status==="timeout"));async function s(){const e=P();l.value=!0;try{const g=await e.sendRaw({type:"tasks-list"});g&&Array.isArray(g.tasks)&&(y.value=g.tasks)}catch{}finally{l.value=!1}}async function m(e){const g=P();try{await g.sendRaw({type:"tasks-stop",taskId:e})}catch{}finally{await s()}}const f=R(null);function h(e=5e3){N(),s(),u=setInterval(s,e),S()}function N(){u&&(clearInterval(u),u=null),t&&(t(),t=null),d&&(clearTimeout(d),d=null)}function S(){const e=P();if(t)return;const g=D=>{D.type==="task:notification"&&D.payload?.task&&(f.value=D.payload.task,s(),d&&clearTimeout(d),d=setTimeout(()=>{f.value=null,d=null},8e3))};t=e.onRuntimeEvent(g)}function A(e){return!e||e<0?"-":e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${(e/6e4).toFixed(1)}m`}function o(e){switch(e){case"running":return"processing";case"pending":return"default";case"completed":return"success";case"failed":return"error";case"timeout":return"warning";default:return"default"}}return{tasks:y,loading:l,running:b,pending:v,completed:w,lastNotification:f,fetchTasks:s,stopTask:m,startPolling:h,stopPolling:N,formatDuration:A,getStatusColor:o}}),L={__name:"Tasks",setup(y,{expose:l}){l();const u=B(),t=[{title:"状态",key:"status",width:90},{title:"描述",key:"description",ellipsis:!0},{title:"类型",dataIndex:"type",width:100},{title:"耗时",key:"duration",width:90},{title:"创建时间",key:"createdAt",width:180},{title:"结果",key:"result",ellipsis:!0},{title:"操作",key:"action",width:80}];function d(s){return s.status==="running"&&s.startedAt?u.formatDuration(Date.now()-s.startedAt):s.completedAt&&s.startedAt?u.formatDuration(s.completedAt-s.startedAt):"-"}function b(s){return s?new Date(s).toLocaleString():"-"}function v(s,m){return s?s.length>m?`${s.slice(0,m)}...`:s:""}I(()=>u.startPolling(5e3)),V(()=>u.stopPolling());const w={store:u,columns:t,getDuration:d,formatTime:b,truncate:v,onMounted:I,onUnmounted:V,get ReloadOutlined(){return U},get useTasksStore(){return B}};return Object.defineProperty(w,"__isScriptSetup",{enumerable:!1,value:!0}),w}},j={class:"page-header"},J={key:0,class:"error-text"},K={key:1},M={class:"task-header"},Q={class:"task-desc"},W={class:"task-id"},Z={class:"task-meta"},q=["title"],G={key:0,class:"error-text"},H={key:1,class:"success-text"},X={key:2,class:"muted-text"};function Y(y,l,u,t,d,b){const v=p("a-button"),w=p("a-space"),s=p("a-alert"),m=p("a-statistic"),f=p("a-card"),h=p("a-col"),N=p("a-row"),S=p("a-tag"),A=p("a-table");return i(),c("div",null,[_("div",j,[l[3]||(l[3]=_("div",null,[_("h2",{class:"page-title"},"后台任务"),_("p",{class:"page-sub"},"查看后台任务队列、实时通知和任务执行结果。")],-1)),n(w,null,{default:a(()=>[n(v,{ghost:"",loading:t.store.loading,onClick:l[0]||(l[0]=o=>t.store.fetchTasks())},{icon:a(()=>[n(t.ReloadOutlined)]),default:a(()=>[l[2]||(l[2]=k(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),t.store.lastNotification?(i(),C(s,{key:0,type:t.store.lastNotification.status==="completed"?"success":"error","show-icon":"",closable:"",class:"banner",onClose:l[1]||(l[1]=o=>t.store.lastNotification=null)},{message:a(()=>[k(" 任务"+r(t.store.lastNotification.status==="completed"?"完成":"结束")+": "+r(t.store.lastNotification.description||t.store.lastNotification.id.slice(0,16)),1)]),description:a(()=>[t.store.lastNotification.error?(i(),c("span",J,r(t.store.lastNotification.error),1)):t.store.lastNotification.result?(i(),c("span",K,r(t.truncate(String(t.store.lastNotification.result),120)),1)):x("v-if",!0)]),_:1},8,["type"])):x("v-if",!0),n(N,{gutter:[16,16],class:"stats-row"},{default:a(()=>[n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"全部任务",value:t.store.tasks.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"运行中",value:t.store.running.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"等待中",value:t.store.pending.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"已完成",value:t.store.completed.length},null,8,["value"])]),_:1})]),_:1})]),_:1}),t.store.running.length>0?(i(),C(f,{key:1,title:"运行中的任务",class:"panel-card",size:"small"},{default:a(()=>[(i(!0),c(T,null,O(t.store.running,o=>(i(),c("div",{key:o.id,class:"task-item running"},[_("div",M,[n(S,{color:t.store.getStatusColor(o.status)},{default:a(()=>[k(r(o.status.toUpperCase()),1)]),_:2},1032,["color"]),_("span",Q,r(o.description),1),_("span",W,r(o.id.slice(0,16)),1)]),_("div",Z,[_("span",null,"类型: "+r(o.type||"-"),1),_("span",null,"已运行: "+r(t.store.formatDuration(Date.now()-o.startedAt)),1),n(v,{size:"small",danger:"",onClick:e=>t.store.stopTask(o.id)},{default:a(()=>[...l[4]||(l[4]=[k("停止",-1)])]),_:1},8,["onClick"])])]))),128))]),_:1})):x("v-if",!0),n(f,{class:"panel-card"},{default:a(()=>[n(A,{columns:t.columns,"data-source":t.store.tasks,pagination:{pageSize:15,size:"small"},loading:t.store.loading,"row-key":"id",size:"small"},{bodyCell:a(({column:o,record:e})=>[o.key==="status"?(i(),C(S,{key:0,color:t.store.getStatusColor(e.status)},{default:a(()=>[k(r(e.status),1)]),_:2},1032,["color"])):o.key==="description"?(i(),c("span",{key:1,title:e.command},r(e.description),9,q)):o.key==="duration"?(i(),c(T,{key:2},[k(r(t.getDuration(e)),1)],64)):o.key==="createdAt"?(i(),c(T,{key:3},[k(r(t.formatTime(e.createdAt)),1)],64)):o.key==="result"?(i(),c(T,{key:4},[e.error?(i(),c("span",G,r(t.truncate(e.error,60)),1)):e.result?(i(),c("span",H,r(t.truncate(String(e.result),60)),1)):(i(),c("span",X,"-"))],64)):o.key==="action"?(i(),c(T,{key:5},[e.status==="running"?(i(),C(v,{key:0,size:"small",danger:"",onClick:g=>t.store.stopTask(e.id)},{default:a(()=>[...l[5]||(l[5]=[k(" 停止 ",-1)])]),_:1},8,["onClick"])):x("v-if",!0)],64)):x("v-if",!0)]),_:1},8,["data-source","loading"])]),_:1})])}const st=E(L,[["render",Y],["__scopeId","data-v-da5ff6a2"],["__file","/tmp/cc-web-panel-o4ASeD/repo/packages/web-panel/src/views/Tasks.vue"]]);export{st as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-BvdwNnHC.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-DH_zAvD-.js";import{a0 as t}from"./index-BvdwNnHC.js";import"./vendor-Bn1JzzAn.js";import"./index-BxPoPofq.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-db-a1YO9.js";import{a0 as t}from"./index-BvdwNnHC.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-L10IvfYC.js";import"./useFlexGapSupport-B7_oiDXZ.js";import"./styleChecker-BrXRyebg.js";import"./index-BxPoPofq.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};