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.
- package/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-BnZ24WRk.js → AIOps-DZTvbk_H.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-ivXY7MGb.js → ActionButton-IaEVUN3o.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BQS4OD-k.js → Analytics-CCQab0gl.js} +2 -2
- package/src/assets/web-panel/assets/{AppLayout-wOBuOKTO.js → AppLayout-Bs_0GVpx.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-BYuC4nw-.js → Artifacts-Bm83-yJv.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-BIeVfBt6.js → Audit-Bah1XDR5.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-hIuyhmJ7.js → BackgroundAgents-BPZA0B5d.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-B6ohdgPQ.js → Backup-BMydWFiM.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BzgYCw6h.js → BaseInput-lhopFSZz.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CwahvZU1.js → Chat-Bbbs5BP1.js} +4 -4
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-B-1IZ_k8.js → ChatBubbleRenderer-BIAfOKCj.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-26EDP2x0.js → Checkbox-CLEMA9J4.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DYLw1Zvd.js → Codegen-deCSwmnK.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DH_zAvD-.js → Col-CH-n8haq.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DURrTXJu.js → Community-DJuAl6dw.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CQyBqN0p.js → Compact-BMyLBmgs.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-a0DfgKHD.js → Compliance-BK75Ss93.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-C6fY_5Ke.js → Cowork-5XbJwKYq.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-DOwmpbTe.js → Cron-Ezgir7IZ.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-DEPOIEUs.js → Crosschain-CKuMoYA7.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DaKc-CEV.js → DID-CxS244cH.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-C-0KLXq5.js → Dashboard-wrUKrsJy.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CnsDukzr.js → Dropdown-A6I91Z2J.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-Bi_ACD4N.js → EmailListRenderer-BofaiRYY.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BZASpnx3.js → FamilyGuardDashboard-D3eeNA64.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-43oTtzyp.js → Federation-DzK-3AjS.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-oyVadnkZ.js → FormItemContext-Dm6mYA8b.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-Cwvfd6TZ.js → GenericCardRenderer-BeWL-Q1b.js} +1 -1
- package/src/assets/web-panel/assets/{Git-Cgi2wvU0.js → Git-CtGCxg9p.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-l8TWDKZ0.js → Governance-DZvFB46G.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-Dc8j6TaO.js → Inference-ntqp4cmw.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DgcO-Fwz.js → KnowledgeGraph-CrLYbqLe.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DjiZpiwa.js → Logs-CKA1PRhC.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-DtwoKxDJ.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-BeDn1hFc.js → Marketplace-B8aPsXYv.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-PGdVfWK6.js → McpTools-DQOgNdGS.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-e76lY3a1.js → Memory-i9IK9B0M.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DKlQqot_.js → MobileBridge-BynYvpv9.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-C4g6WOEr.js → MobileProjects-DixivGuQ.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-1j3NpRQq.js → Mtc-OWPvWVNr.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-DgwiVd1C.js → MtcAudit-Cqpg5C4A.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-Dzg5lZZY.js → Multisig-CT5kMJIZ.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-D7GYhst-.js → NLProgramming-BXD0Dz0h.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Blcfvaic.js → Notes-T1w5p8N5.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-Dc4Y6vfr.js → NotificationSettings-DFCThpKJ.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-BJOuM0Kl.js +1 -0
- package/src/assets/web-panel/assets/{Organization-DBXq024L.js → Organization-CSFcw86q.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CFPbdx1Y.js → Overflow-BxVMuLTk.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-w7z61NR5.js → P2P-B8qxY_yX.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-B7eGGZOa.js → PdhVaultBrowser-Bcq27Exy.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-Df5Cl50D.js → Permissions-CGBvJVXP.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-C-We7RF6.js → PersonalDataHub-DM9IEeJ3.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-B6fHPnKy.js → Pipeline-wEskx2-p.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-B85BdiIc.js → Privacy-DIA02lLJ.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CcOyazSe.js → ProjectInit-uMXlNLHV.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BE53KfuU.js → ProjectSettings-Sy3NOtt7.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-DOvMOoe_.js → Projects-xFjfOkQM.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-5l7sT9lq.js → Providers-CNyOpbg8.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DE37RXy4.js → QrScannerModal-Dk1UVRwI.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BGmGCo7j.js → QuickAsk-B-UqLoLG.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BFdx8Nrm.js → Recommend-CiTBVZvN.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-C1w-j_hB.js → RemoteSession-BhABd516.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-BOvn-10y.js → Reputation-Dq1xTCcN.js} +1 -1
- package/src/assets/web-panel/assets/{Row-db-a1YO9.js → Row-DbFc4sc7.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DeS43ZGM.js → RssFeed-D7IBkkLm.js} +3 -3
- package/src/assets/web-panel/assets/{Search-BaQYNfeb.js → Search-BVyMlGoa.js} +1 -1
- package/src/assets/web-panel/assets/{Security-yt1ESHDg.js → Security-BzMm9Be_.js} +3 -3
- package/src/assets/web-panel/assets/{Services-BcNqPUsS.js → Services-Dfk0kied.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-X3ceUQWf.js → Skeleton-C8B5mUit.js} +1 -1
- package/src/assets/web-panel/assets/Skills-BNTPoJn0.js +1 -0
- package/src/assets/web-panel/assets/{Sla-C_fdfbuJ.js → Sla-gnFelKfT.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CDqohXXQ.js → SpeechSettings-B12gCQkK.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-B25maYEY.js → SyncSettings-CHWk9cpj.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-B_zs9jkJ.js +1 -0
- package/src/assets/web-panel/assets/{Templates-DUH0iuc4.js → Templates-PjdppQrI.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DrvhHf9T.js → Tenant-CH3aARxE.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-C2lJVYHA.js → Terminal-BqqrYyg3.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-C1Hf_jYn.js → TimelineRenderer-Dx9soq9f.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DniS1NpS.js → Tokens-C66KpDDZ.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-4jrcb8oA.js → Trigger-DHxgGsap.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DiBte55w.js → Trust-3cct4QxN.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CZRtc4VB.js → UkeySign-Cs6UfDEH.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BtYGJDmg.js → VideoEditing-jbu2EAQa.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-D1nrTm7H.js → Wallet-BIykFB9D.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DI91acpx.js → WebAuthn-DFgqKmHG.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-BtQjI50d.js → WorkflowEditor-CNg5bBiH.js} +1 -1
- package/src/assets/web-panel/assets/{chat-I4A-f4FC.js → chat-B-6wzojE.js} +1 -1
- package/src/assets/web-panel/assets/{colors-QZkDkFVt.js → colors-BHAq7y9y.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item--FtCdzpr.js → compact-item-CGJnSTnu.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CaIKIKxP.js → createContext-Cx0ZF512.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CNq_RRw4.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DLYUII6-.js → hasIn-DibIw3z7.js} +1 -1
- package/src/assets/web-panel/assets/{index-OQPIS_am.js → index-0NWSa3Xq.js} +1 -1
- package/src/assets/web-panel/assets/{index-3rVtgqa2.js → index-746-mNhw.js} +1 -1
- package/src/assets/web-panel/assets/{index-BxPoPofq.js → index-Aaeca8o4.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4CXFU-w.js → index-B1jAbIxx.js} +1 -1
- package/src/assets/web-panel/assets/{index-BLGJmgmx.js → index-B28jdxwR.js} +1 -1
- package/src/assets/web-panel/assets/{index-CL4c5D6G.js → index-B2rOMBeN.js} +1 -1
- package/src/assets/web-panel/assets/{index-vfiDxdN2.js → index-BAoFiV3n.js} +1 -1
- package/src/assets/web-panel/assets/{index-Du2wUavy.js → index-BCtW4F8-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAuf8r5o.js → index-BEXM3qSV.js} +1 -1
- package/src/assets/web-panel/assets/{index-BGWSmE3G.js → index-BFTGp-aF.js} +1 -1
- package/src/assets/web-panel/assets/{index-eTqL91aV.js → index-BJhS6i02.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQ7OBHka.js → index-BO-XxBD5.js} +1 -1
- package/src/assets/web-panel/assets/{index-hfiZ-i2b.js → index-BR2BiNtx.js} +1 -1
- package/src/assets/web-panel/assets/{index-CBtII-nl.js → index-BRflLAdr.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ch0IFpGy.js → index-BTWb3sbj.js} +1 -1
- package/src/assets/web-panel/assets/{index-B65QxJaG.js → index-BZ7GbrgF.js} +1 -1
- package/src/assets/web-panel/assets/index-B_H-RZ9i.js +1 -0
- package/src/assets/web-panel/assets/{index-BebTT7iR.js → index-BiMLsIwd.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ygi2rYL1.js → index-Bmqjip63.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGLHSCHM.js → index-BoySHSgZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DJrd_CR3.js → index-Bz3J0eVB.js} +1 -1
- package/src/assets/web-panel/assets/{index-DK2r6Bv7.js → index-C6M2yHVE.js} +1 -1
- package/src/assets/web-panel/assets/{index-yayaayEA.js → index-CH2A_Fdn.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ooo_5jHo.js → index-CUX9mq3M.js} +1 -1
- package/src/assets/web-panel/assets/{index-D2xETCkj.js → index-CY2E4Y99.js} +1 -1
- package/src/assets/web-panel/assets/index-CkH9UQQL.js +1 -0
- package/src/assets/web-panel/assets/{index-CisYjy88.js → index-CoKu7Q9r.js} +1 -1
- package/src/assets/web-panel/assets/{index-DA_TPdzX.js → index-CrjkH_QU.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bs0qPPFb.js → index-Cuity3gy.js} +1 -1
- package/src/assets/web-panel/assets/{index-BkJgWW_L.js → index-CwcWpW1q.js} +1 -1
- package/src/assets/web-panel/assets/{index-Deg2S9ZJ.js → index-Cz5ety6j.js} +1 -1
- package/src/assets/web-panel/assets/{index-CXaeZCRP.js → index-DXNcm44v.js} +1 -1
- package/src/assets/web-panel/assets/{index-DVitI3UQ.js → index-DjCJIttz.js} +1 -1
- package/src/assets/web-panel/assets/{index-CgMm85BY.js → index-DnsVRqCa.js} +1 -1
- package/src/assets/web-panel/assets/{index-21I79XSf.js → index-SbQacweG.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcgtvJbC.js → index-g0V_mLQ9.js} +1 -1
- package/src/assets/web-panel/assets/{index-BvdwNnHC.js → index-puIs3mTs.js} +3 -3
- package/src/assets/web-panel/assets/{index-0DYBQ-6e.js → index-sI_1E0co.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3PnIEOH.js → index-woOjtit-.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DDkTvw8k.js → initDefaultProps-Gbl9QOqg.js} +1 -1
- package/src/assets/web-panel/assets/{motion-fkr96tN5.js → motion-BHh6ZzZu.js} +1 -1
- package/src/assets/web-panel/assets/{move-CGBV0SV2.js → move-mX6Rwrd1.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DAsCliFt.js → mtc-parser-CuzZa_kI.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BM8PMmKN.js → omit-DjANYkpi.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-C6SdWoTK.js → pickAttrs-C_3v40wY.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BG0EVu-d.js → placementArrow-L2HgRede.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-L10IvfYC.js → responsiveObserve-DIkGMHyT.js} +1 -1
- package/src/assets/web-panel/assets/{slide-TddIkbrn.js → slide-C1hp5tD0.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-FlveF2Yn.js → statusUtils-DH1W2uFA.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BrXRyebg.js → styleChecker-dEaKQcv2.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-B7_oiDXZ.js → useFlexGapSupport-CD7j1zxt.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CQYeRYWb.js → useFs-C8jXMvEM.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DspIkhVi.js → usePersonalDataHub-C4r-8mys.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-BCwmwMAW.js → vnode-DDuI6wgY.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-B0cEGluV.js → zoom-Dd-DteT6.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/team.js +165 -53
- package/src/data/changelog.json +13 -0
- package/src/lib/agent-team/task-lease.js +718 -6
- package/src/lib/agent-team/team-graph-projection.js +303 -0
- package/src/lib/agent-team/team-message-bridge.js +83 -5
- package/src/lib/agent-team/team-message-tools.js +34 -1
- package/src/lib/agent-team/team-runner.js +1131 -9
- package/src/lib/agent-team/team-session-message-adapter.js +720 -0
- package/src/lib/app-server/cli-agent-kernel-adapter.js +1 -0
- package/src/lib/app-server/protocol.js +43 -0
- package/src/lib/app-server/server.js +8 -11
- package/src/lib/approval-grant-ledger.js +187 -0
- package/src/lib/session-message-fabric.js +265 -3
- package/src/runtime/headless-stream.js +184 -19
- package/src/assets/web-panel/assets/MarkdownRenderer-B5MFCi0N.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-dgM87XIn.js +0 -1
- package/src/assets/web-panel/assets/Skills-DmYeax6C.js +0 -1
- package/src/assets/web-panel/assets/Tasks-3ILwauYw.js +0 -1
- package/src/assets/web-panel/assets/devWarning-D7qVrkrO.js +0 -1
- package/src/assets/web-panel/assets/index-D9Y_ZwZn.js +0 -1
- 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
|
|
576
|
-
//
|
|
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:
|
|
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
|
|
2043
|
-
// concurrent pump below, so the wait never
|
|
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 = (
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
2085
|
-
|
|
2221
|
+
approved: invalidReason ? false : approve,
|
|
2222
|
+
decision,
|
|
2223
|
+
via: invalidReason || via,
|
|
2086
2224
|
session_id: sessionId,
|
|
2087
2225
|
});
|
|
2088
|
-
p.resolve(
|
|
2226
|
+
p.resolve(!invalidReason && approve);
|
|
2089
2227
|
};
|
|
2090
|
-
const interactiveConfirm = (ctx = {}) =>
|
|
2091
|
-
|
|
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
|
-
() =>
|
|
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, {
|
|
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.
|
|
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(
|
|
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};
|