chainlesschain 0.166.6 → 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.
- package/README.md +21 -0
- package/package.json +5 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-CVnFjTfG.js → AIOps-DJvpifGx.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BxkwuuQC.js → ActionButton-D2UhuF_A.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-C2670q6z.js → Analytics-C9ho9obu.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CU_rylW6.js → AppLayout-BvRCpFK3.js} +3 -3
- package/src/assets/web-panel/assets/{Artifacts-DGJmYqnj.js → Artifacts-jxrySvpk.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-BZOQbINJ.js → Audit-ovEw0ZYl.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DghB4QwF.js → BackgroundAgents-D7H5z6zS.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-l0mwPbta.js → Backup-BuXob8za.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-Bv3WSZOh.js → BaseInput-CtnszuQ2.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-s88nBdvt.js → Chat-B_mYE8fJ.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-Z8CBuB1a.js → ChatBubbleRenderer-DaiA6CsX.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-B5icasEs.js → Checkbox-ierdtcJD.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CsUFqNud.js → Codegen-3VKPJD_B.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DlBtClaW.js → Col-1EdMyf5P.js} +1 -1
- package/src/assets/web-panel/assets/{Community-xRn1IdLB.js → Community-D6H7UA8K.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-naIr8a_o.js → Compact-BBAZvYIm.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-Dp9esfFE.js → Compliance-CgsTrAoj.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DQlMYJB-.js → Cowork-tnZgLoTE.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-Cd0oNLzJ.js → Cron-CPpZw2Nh.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BtDIx3XX.js → Crosschain-BymBcp5z.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BOlpzEwg.js → DID-DKPxS_K1.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DV15Axk1.js → Dashboard-DvJhEmH9.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-COXrewN1.js → Dropdown-b8iQyQIZ.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-EjIt0Cm7.js → EmailListRenderer--0-A-zKb.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DJlhwb-R.js → FamilyGuardDashboard-C12iDN06.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BMiFl82k.js → Federation-BRhaE2Z8.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BUcDQyxn.js → FormItemContext-C4dnq7yf.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-C25uFxvK.js → GenericCardRenderer-CGAdbR5n.js} +1 -1
- package/src/assets/web-panel/assets/{Git-D20uaEUU.js → Git-4eA2fYzL.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CQxYJjCX.js → Governance-BJuY9Y-9.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-m-sczpS5.js → Inference-DZ5Dy4up.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CBsIlU0S.js → KnowledgeGraph-BMTjRs4A.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-D0-5bqeu.js → Logs-BKEeQEfJ.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-B05DgASC.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-CwDGFu2Q.js → Marketplace-Dhho4fEg.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-7FxJ3omT.js → McpTools-BW6xxSlU.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-DOVyb59U.js → Memory-mPqlpSkq.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DZXl-Hje.js → MobileBridge-Cb9N_DQI.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DlZ8tRXt.js → MobileProjects-BNs8tah_.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-D7Pjx1s_.js → Mtc-CaxBt8tn.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-BND7lX8p.js → MtcAudit-DRPQbp3t.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BknS7B-p.js → Multisig-CRm-d8bK.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-7C2-KPHt.js → NLProgramming-BCCk3LPs.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DNWdTndN.js → Notes-Cv8SN8gN.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-DCm4KcJZ.js → NotificationSettings-CggIvTh5.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DyVwwjJx.js → OrderTableRenderer-BW3_bV12.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-Dl2O_qJ9.js → Organization-BuRE-VCO.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BOFCvk9Q.js → Overflow-DBrm1gju.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DgdVowY1.js → P2P-CWVnDYgS.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-8RKUIpte.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-BHNEUUwa.js → Permissions-tDUAxogW.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CaZbrOdz.js → PersonalDataHub-Dv2-CFis.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-DJDnoXmE.js → Pipeline-DM6kvFni.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CBQr2eX8.js → Privacy-DzK-yL0d.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Yghqa06z.js → ProjectInit-B5UrNpkj.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-HBAtJi8U.js → ProjectSettings-CxJD43oW.js} +2 -2
- package/src/assets/web-panel/assets/Projects-Z2Orm8Ma.js +1 -0
- package/src/assets/web-panel/assets/{Providers-uJTz77GI.js → Providers-CYl4jRYK.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-k3M5ouTp.js → QrScannerModal-DeH2T0fH.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CMji45PH.js → QuickAsk-Bw9k_kTk.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DyoZYPls.js → Recommend-Bl_jGwoi.js} +1 -1
- package/src/assets/web-panel/assets/RemoteSession-d6u01Kq0.js +5 -0
- package/src/assets/web-panel/assets/{Reputation-D4hIs4vV.js → Reputation-Ds_Dfr-k.js} +1 -1
- package/src/assets/web-panel/assets/{Row-mzE-ElTg.js → Row-BpQUQTNj.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-cg7J3hI6.js → RssFeed-BatpZBGt.js} +3 -3
- package/src/assets/web-panel/assets/{Search-6M0TkGSZ.js → Search-D7hOObzi.js} +1 -1
- package/src/assets/web-panel/assets/{Security-B1GQ67qh.js → Security-dXQ4FKNt.js} +4 -4
- package/src/assets/web-panel/assets/{Services-D_RwU_5S.js → Services-D8wInGPa.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-TZjk-dsW.js → Skeleton-DXQCoYpM.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CG6FcaCV.js → Skills-D3oLRIVn.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BI190QDv.js → Sla-BmP4-LnJ.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BWmxF2Wu.js → SpeechSettings-DLj-xzro.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CwPiGw6L.js → SyncSettings-8KKaaRMr.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-BIXgCeSk.js → Tasks-GyK42I7C.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CQFgGCoK.js → Templates-n1y_8UBG.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DAelEdkL.js → Tenant-B39nBph8.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BbqWK6qh.js → Terminal-DCQoOKXe.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-cmG3zvY5.js → TimelineRenderer-BkhbDfXk.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-C8444NKU.js → Tokens-BeHIIU8D.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-C1Rpnz0I.js → Trigger-BHvWXVOb.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-u4koPiFD.js → Trust-y2WaOSto.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-oPWKn80Z.js → UkeySign-DBFeJBzt.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-D0CUUY_5.js → VideoEditing-BEOWitC-.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-fu9pIAbt.js → Wallet-BITedTe6.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-Bc5ciuOx.js → WebAuthn-DMwlJVin.js} +2 -2
- package/src/assets/web-panel/assets/{WorkflowEditor-BCin4_4N.js → WorkflowEditor-CKfGFEu1.js} +1 -1
- package/src/assets/web-panel/assets/{chat-B2jbM-XN.js → chat-DR6gnBGF.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CUVoUQ_2.js → colors-C_Hw5NCn.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DgOGpkRH.js → compact-item-B8IPwsEu.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DIxU6eKI.js → createContext-D-u4JVnJ.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-Cq6lSd_q.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DoKRKMav.js → hasIn-CZubdS4D.js} +1 -1
- package/src/assets/web-panel/assets/{index-ByjrulIZ.js → index-11ASqx-A.js} +1 -1
- package/src/assets/web-panel/assets/index-BQ3213fz.js +1 -0
- package/src/assets/web-panel/assets/{index-BwYofQJg.js → index-BXS6wYJZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLdpHe6w.js → index-Bi21Etg4.js} +1 -1
- package/src/assets/web-panel/assets/{index-2flsPFIX.js → index-Bizm87cX.js} +1 -1
- package/src/assets/web-panel/assets/{index-BXb-Smmm.js → index-Bv2132PO.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5ySiGYy.js → index-BzoFanEQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CWbL1-N0.js → index-C25rOz7O.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cj-us-D_.js → index-C2VmtNaQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9TsO9T9.js → index-Cbm8F0M2.js} +1 -1
- package/src/assets/web-panel/assets/{index-eTWPaeBI.js → index-CfniPP5p.js} +1 -1
- package/src/assets/web-panel/assets/{index-D2yo6ast.js → index-Cg2bCeol.js} +1 -1
- package/src/assets/web-panel/assets/{index-CPXdBnGi.js → index-CiXkhOkY.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCLeNqIL.js → index-Cl5RpreD.js} +1 -1
- package/src/assets/web-panel/assets/{index-BtSPhEyC.js → index-CqmLw8cs.js} +1 -1
- package/src/assets/web-panel/assets/{index-eYxUASSG.js → index-Ctje8Vl3.js} +1 -1
- package/src/assets/web-panel/assets/{index-i5MB455u.js → index-D1w96gg9.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpvyOt5Z.js → index-D47jt8ET.js} +1 -1
- package/src/assets/web-panel/assets/{index-CeWSw-z5.js → index-DJ6pG79m.js} +1 -1
- package/src/assets/web-panel/assets/{index-B3F_p8NA.js → index-DTosx2Wu.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9mSYovv.js → index-DY6MHo9D.js} +1 -1
- package/src/assets/web-panel/assets/{index-DJMHnbmu.js → index-DcFjRT-K.js} +1 -1
- package/src/assets/web-panel/assets/{index-D-ufbAJB.js → index-DfnzrUxU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BFUprhNd.js → index-DjRrqooR.js} +1 -1
- package/src/assets/web-panel/assets/{index-Co4lDEk-.js → index-DmRcgiYT.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGTZdZOE.js → index-DpjHpRoq.js} +3 -3
- package/src/assets/web-panel/assets/{index-DHugFl3v.js → index-Dt-w3xQ7.js} +1 -1
- package/src/assets/web-panel/assets/{index-B-f6l4Vm.js → index-DuOU5apg.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtyAuGOm.js → index-LvjAKDSl.js} +1 -1
- package/src/assets/web-panel/assets/{index-be8SonCh.js → index-_nL79NT8.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRMEO2Tl.js → index-auyNYjLo.js} +1 -1
- package/src/assets/web-panel/assets/{index-C88m9lsi.js → index-cVqbas5C.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqlwIjJx.js → index-ffe7bvqP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpTFx8Xx.js → index-idZKyADQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cskz--fd.js → index-k1Xa5iw1.js} +1 -1
- package/src/assets/web-panel/assets/{index-CF80xxPG.js → index-mYZJxGH6.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ds8r3Fzb.js → index-rYBHSDcJ.js} +1 -1
- package/src/assets/web-panel/assets/index-vJagfET2.js +1 -0
- package/src/assets/web-panel/assets/{index-C846lPGD.js → index-xoNssgz_.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-B4chl7iR.js → initDefaultProps-lcU_dT2r.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DruN9h96.js → motion-Dc7UNXZ1.js} +1 -1
- package/src/assets/web-panel/assets/{move-Cl0UtCgU.js → move-Cll8ZXaL.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-FX2ttw70.js → mtc-parser-CAb_yLIM.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BDCneY46.js → omit-DurYMyTe.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DycsEg8b.js → pickAttrs-BITQyOlw.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Bc-dBuMv.js → placementArrow-Dg1rH91i.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve--Wwaf8lu.js → responsiveObserve-D_EWIeac.js} +1 -1
- package/src/assets/web-panel/assets/{slide-vDmHQqHH.js → slide-lK4d3zsh.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-9c52yv3G.js → statusUtils-Bflq-Git.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BT4BiO6_.js → styleChecker-Ccp0I-wt.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-C7XxWPcP.js → useFlexGapSupport-CYZbByYA.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BHoMqh4i.js → useFs-B_x0nxFD.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BOLxvsAG.js → usePersonalDataHub-DW55rL85.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CA7poeeP.js → vnode-Ca6MH3W8.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-B_sAn-co.js → zoom-NdHelOog.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/graph.js +215 -5
- package/src/commands/orchestrate.js +61 -9
- package/src/commands/team-distributed.js +342 -2
- package/src/commands/team.js +169 -7
- package/src/data/changelog.json +46 -0
- package/src/gateways/ws/message-dispatcher.js +4 -0
- package/src/gateways/ws/session-protocol.js +89 -11
- package/src/gateways/ws/ws-agent-handler.js +65 -9
- package/src/gateways/ws/ws-approval-gate.js +181 -16
- package/src/gateways/ws/ws-server.js +16 -6
- package/src/generated/cc-agent-protocol.schema.json +154 -3
- package/src/lib/agent-team/task-lease.js +487 -3
- package/src/lib/agent-team/team-agent-stream.js +16 -0
- package/src/lib/agent-team/team-distributed-graph-bridge.js +257 -0
- package/src/lib/agent-team/team-distributed-graph-writer.js +523 -0
- package/src/lib/agent-team/team-distributed-queue.js +251 -0
- package/src/lib/agent-team/team-graph-runtime-adapter.js +1918 -0
- package/src/lib/agent-team/team-runner.js +285 -3
- package/src/lib/app-server/graph-runtime.js +1078 -0
- package/src/lib/app-server/rollout-store.js +32 -0
- package/src/lib/app-server/server.js +200 -0
- package/src/lib/approval-grant-ledger.js +69 -0
- package/src/lib/autonomous-agent.js +11 -0
- package/src/lib/codex-app-server-adapter.js +11 -20
- package/src/lib/cowork-graph-authority-adapter.js +455 -0
- package/src/lib/dynamic-workflow-facade.js +83 -16
- package/src/lib/graph-kernel/adapters.js +93 -20
- package/src/lib/graph-kernel/authority.js +324 -0
- package/src/lib/graph-kernel/compiler.js +67 -21
- package/src/lib/graph-kernel/cutover-authority-resolver.js +245 -0
- package/src/lib/graph-kernel/cutover-ledger.js +692 -0
- package/src/lib/graph-kernel/event-store.js +15 -1
- package/src/lib/graph-kernel/graph-runtime-surfaces.json +1427 -0
- package/src/lib/graph-kernel/index.js +4 -0
- package/src/lib/graph-kernel/migration-saga.js +309 -0
- package/src/lib/graph-kernel/retirement-evidence.js +567 -0
- package/src/lib/graph-kernel/runtime-surface-manifest.js +481 -0
- package/src/lib/graph-kernel/runtime.js +737 -38
- package/src/lib/graph-kernel/store-cutover-evidence.js +354 -0
- package/src/lib/graph-kernel/trace-reducer.js +6 -0
- package/src/lib/graph-kernel/trigger-adapter.js +60 -3
- package/src/lib/interaction-adapter.js +61 -9
- package/src/lib/legacy-runtime-authority.js +160 -0
- package/src/lib/orchestrator.js +28 -0
- package/src/lib/policy-decision-event.js +149 -0
- package/src/lib/process-execution-broker/platform-sandbox.js +15 -1
- package/src/lib/record-replay/index.js +1 -0
- package/src/lib/record-replay/playwright-ui-driver.js +327 -0
- package/src/lib/scheduler-kernel/graph-authority-adapter.js +512 -0
- package/src/lib/scheduler-kernel/runtime.js +75 -2
- package/src/lib/webhook-security.js +484 -36
- package/src/runtime/coding-agent-events.cjs +13 -11
- package/src/runtime/headless-runner.js +17 -1
- package/src/runtime/headless-stream.js +66 -3
- package/src/runtime/session-slash-commands.js +57 -6
- package/src/assets/web-panel/assets/MarkdownRenderer-BwH414Ms.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-BiaZfQIM.js +0 -7
- package/src/assets/web-panel/assets/Projects-DiCGnMjz.js +0 -1
- package/src/assets/web-panel/assets/RemoteSession-s1gR38IO.js +0 -5
- package/src/assets/web-panel/assets/devWarning-DiSlgCC4.js +0 -1
- package/src/assets/web-panel/assets/index-9WIQEHvv.js +0 -1
- package/src/assets/web-panel/assets/index-B7mDobAl.js +0 -1
|
@@ -26,6 +26,32 @@
|
|
|
26
26
|
*/
|
|
27
27
|
|
|
28
28
|
import { approvalBindingDigest } from "../../lib/agent-authority.js";
|
|
29
|
+
import {
|
|
30
|
+
APPROVAL_GRANTS_EVENT,
|
|
31
|
+
ApprovalGrantLedger,
|
|
32
|
+
approvalPermissionForContext,
|
|
33
|
+
} from "../../lib/approval-grant-ledger.js";
|
|
34
|
+
|
|
35
|
+
function approvalDecision(value) {
|
|
36
|
+
const candidate =
|
|
37
|
+
value?.decision && typeof value.decision === "object"
|
|
38
|
+
? value.decision
|
|
39
|
+
: value;
|
|
40
|
+
if (
|
|
41
|
+
candidate &&
|
|
42
|
+
[
|
|
43
|
+
"acceptOnce",
|
|
44
|
+
"acceptForTurn",
|
|
45
|
+
"acceptForSession",
|
|
46
|
+
"decline",
|
|
47
|
+
"cancel",
|
|
48
|
+
].includes(candidate.kind)
|
|
49
|
+
) {
|
|
50
|
+
return candidate;
|
|
51
|
+
}
|
|
52
|
+
if (value === true) return { kind: "acceptOnce" };
|
|
53
|
+
return { kind: "decline" };
|
|
54
|
+
}
|
|
29
55
|
|
|
30
56
|
/**
|
|
31
57
|
* Build the binding-attaching confirmer for one WS session.
|
|
@@ -35,9 +61,19 @@ import { approvalBindingDigest } from "../../lib/agent-authority.js";
|
|
|
35
61
|
* @param {string} opts.sessionId
|
|
36
62
|
* @returns {(ctx?: object) => Promise<boolean>}
|
|
37
63
|
*/
|
|
38
|
-
export function buildWsApprovalConfirmer({
|
|
64
|
+
export function buildWsApprovalConfirmer({
|
|
65
|
+
interaction,
|
|
66
|
+
sessionId,
|
|
67
|
+
cwd = null,
|
|
68
|
+
ledgerState = { ledger: new ApprovalGrantLedger({ sessionId }) },
|
|
69
|
+
persistApprovalGrants = () => false,
|
|
70
|
+
}) {
|
|
39
71
|
let approvalSeq = 0;
|
|
40
72
|
return async (ctx = {}) => {
|
|
73
|
+
const requiredPermission = approvalPermissionForContext(ctx, {
|
|
74
|
+
cwd: cwd || ctx.cwd || null,
|
|
75
|
+
});
|
|
76
|
+
if (ledgerState.ledger.allows(requiredPermission)) return true;
|
|
41
77
|
const command = ctx.command ?? ctx.args?.command ?? null;
|
|
42
78
|
const risk = ctx.riskLevel || ctx.risk || "unknown";
|
|
43
79
|
// Bind this approval to the exact call it authorizes (same recipe as the
|
|
@@ -51,22 +87,66 @@ export function buildWsApprovalConfirmer({ interaction, sessionId }) {
|
|
|
51
87
|
const what = ctx.tool || ctx.toolName || "tool";
|
|
52
88
|
const detail = command != null ? `: ${String(command).slice(0, 200)}` : "";
|
|
53
89
|
try {
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
90
|
+
const options = {
|
|
91
|
+
default: false,
|
|
92
|
+
binding,
|
|
93
|
+
// Structured context so UIs can render a proper approval card
|
|
94
|
+
// instead of parsing the question text. Reusable permissions are
|
|
95
|
+
// host-issued and exact; the renderer may choose a lifetime but may
|
|
96
|
+
// never widen this set.
|
|
97
|
+
approval: {
|
|
98
|
+
tool: what,
|
|
99
|
+
command,
|
|
100
|
+
risk,
|
|
101
|
+
rule: ctx.rule || null,
|
|
102
|
+
requestedPermissions: [requiredPermission],
|
|
67
103
|
},
|
|
104
|
+
};
|
|
105
|
+
const rawDecision = interaction.askApproval
|
|
106
|
+
? await interaction.askApproval(
|
|
107
|
+
`Approve ${what}${detail}? (risk: ${risk})`,
|
|
108
|
+
options,
|
|
109
|
+
)
|
|
110
|
+
: await interaction.askConfirm(
|
|
111
|
+
`Approve ${what}${detail}? (risk: ${risk})`,
|
|
112
|
+
options,
|
|
113
|
+
);
|
|
114
|
+
let decision = approvalDecision(rawDecision);
|
|
115
|
+
const approved = [
|
|
116
|
+
"acceptOnce",
|
|
117
|
+
"acceptForTurn",
|
|
118
|
+
"acceptForSession",
|
|
119
|
+
].includes(decision.kind);
|
|
120
|
+
if (
|
|
121
|
+
approved &&
|
|
122
|
+
(decision.kind === "acceptForTurn" ||
|
|
123
|
+
decision.kind === "acceptForSession")
|
|
124
|
+
) {
|
|
125
|
+
const priorSessionGrants = new Map(ledgerState.ledger.sessionGrants);
|
|
126
|
+
const priorRevision = ledgerState.ledger.revision;
|
|
127
|
+
const applied = ledgerState.ledger.applyDecision(
|
|
128
|
+
decision,
|
|
129
|
+
requiredPermission,
|
|
130
|
+
binding,
|
|
131
|
+
);
|
|
132
|
+
decision = applied.decision;
|
|
133
|
+
if (applied.granted.length === 0) return false;
|
|
134
|
+
if (applied.persistedScope && !persistApprovalGrants()) {
|
|
135
|
+
ledgerState.ledger.sessionGrants = priorSessionGrants;
|
|
136
|
+
ledgerState.ledger.revision = priorRevision;
|
|
137
|
+
// Match the stream-json contract: persistence failure never creates
|
|
138
|
+
// a phantom session grant, but the exact operation may proceed once.
|
|
139
|
+
decision = { kind: "acceptOnce" };
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
interaction.recordApprovalDecision?.({
|
|
143
|
+
binding,
|
|
144
|
+
decision,
|
|
145
|
+
requiredPermission,
|
|
146
|
+
});
|
|
147
|
+
return ["acceptOnce", "acceptForTurn", "acceptForSession"].includes(
|
|
148
|
+
decision.kind,
|
|
68
149
|
);
|
|
69
|
-
return ok === true;
|
|
70
150
|
} catch {
|
|
71
151
|
// timeout / disconnect / interrupt → fail closed, never approve
|
|
72
152
|
return false;
|
|
@@ -91,6 +171,7 @@ export function buildWsApprovalConfirmer({ interaction, sessionId }) {
|
|
|
91
171
|
export async function createWsApprovalGate({
|
|
92
172
|
sessionId,
|
|
93
173
|
interaction,
|
|
174
|
+
cwd = null,
|
|
94
175
|
deps = {},
|
|
95
176
|
}) {
|
|
96
177
|
try {
|
|
@@ -104,8 +185,59 @@ export async function createWsApprovalGate({
|
|
|
104
185
|
loadSessionCore(),
|
|
105
186
|
]);
|
|
106
187
|
const inner = await singletons.getApprovalGate();
|
|
188
|
+
const store =
|
|
189
|
+
deps.sessionStore ||
|
|
190
|
+
(await import("../../harness/jsonl-session-store.js"));
|
|
191
|
+
const ledgerState = {
|
|
192
|
+
ledger: new ApprovalGrantLedger({ sessionId }),
|
|
193
|
+
};
|
|
194
|
+
let approvalGrantPersistenceError = null;
|
|
195
|
+
try {
|
|
196
|
+
const event = store.findLatestEvent(
|
|
197
|
+
sessionId,
|
|
198
|
+
APPROVAL_GRANTS_EVENT,
|
|
199
|
+
(candidate) => candidate?.data && typeof candidate.data === "object",
|
|
200
|
+
);
|
|
201
|
+
if (event) {
|
|
202
|
+
ledgerState.ledger = ApprovalGrantLedger.fromJSON(event.data, {
|
|
203
|
+
sessionId,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
} catch (error) {
|
|
207
|
+
approvalGrantPersistenceError = error;
|
|
208
|
+
ledgerState.ledger = new ApprovalGrantLedger({ sessionId });
|
|
209
|
+
interaction.emit?.("recovery-degraded", {
|
|
210
|
+
component: "approval_grants",
|
|
211
|
+
error:
|
|
212
|
+
"Persisted approval grants could not be verified; all grants were discarded",
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
const persistApprovalGrants = () => {
|
|
216
|
+
if (approvalGrantPersistenceError) return false;
|
|
217
|
+
try {
|
|
218
|
+
const persisted = store.appendAuthorityEvent(
|
|
219
|
+
sessionId,
|
|
220
|
+
APPROVAL_GRANTS_EVENT,
|
|
221
|
+
ledgerState.ledger.toJSON(),
|
|
222
|
+
);
|
|
223
|
+
if (persisted === false) {
|
|
224
|
+
throw new Error("session store rejected approval grants");
|
|
225
|
+
}
|
|
226
|
+
return true;
|
|
227
|
+
} catch (error) {
|
|
228
|
+
approvalGrantPersistenceError = error;
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
};
|
|
107
232
|
const confirmer =
|
|
108
|
-
deps.confirmer ||
|
|
233
|
+
deps.confirmer ||
|
|
234
|
+
buildWsApprovalConfirmer({
|
|
235
|
+
interaction,
|
|
236
|
+
sessionId,
|
|
237
|
+
cwd,
|
|
238
|
+
ledgerState,
|
|
239
|
+
persistApprovalGrants,
|
|
240
|
+
});
|
|
109
241
|
const gate = new core.ApprovalGate({
|
|
110
242
|
defaultPolicy: core.APPROVAL_POLICY?.STRICT || "strict",
|
|
111
243
|
confirm: confirmer,
|
|
@@ -129,6 +261,39 @@ export async function createWsApprovalGate({
|
|
|
129
261
|
getSessionPolicy: (sid) => inner.getSessionPolicy(sid || sessionId),
|
|
130
262
|
setSessionPolicy: (sid, policy) =>
|
|
131
263
|
inner.setSessionPolicy(sid || sessionId, policy),
|
|
264
|
+
beginTurn: (turnId) => ledgerState.ledger.beginTurn(turnId),
|
|
265
|
+
listGrants: () => ledgerState.ledger.listGrants(),
|
|
266
|
+
revokeGrant: (grantId) => {
|
|
267
|
+
const existing = ledgerState.ledger
|
|
268
|
+
.listGrants()
|
|
269
|
+
.find((grant) => grant.grantId === String(grantId || ""));
|
|
270
|
+
if (!existing) {
|
|
271
|
+
return { success: false, error: "Approval grant was not found" };
|
|
272
|
+
}
|
|
273
|
+
if (existing.lifetime === "turn") {
|
|
274
|
+
const result = ledgerState.ledger.revoke(grantId);
|
|
275
|
+
return { success: result.revoked, grant: result.grant };
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
const candidate = ApprovalGrantLedger.fromJSON(
|
|
279
|
+
ledgerState.ledger.toJSON(),
|
|
280
|
+
{ sessionId },
|
|
281
|
+
);
|
|
282
|
+
const result = candidate.revoke(grantId);
|
|
283
|
+
if (!result.revoked) {
|
|
284
|
+
return { success: false, error: "Approval grant was not found" };
|
|
285
|
+
}
|
|
286
|
+
const previous = ledgerState.ledger;
|
|
287
|
+
ledgerState.ledger = candidate;
|
|
288
|
+
if (!persistApprovalGrants()) {
|
|
289
|
+
ledgerState.ledger = previous;
|
|
290
|
+
return {
|
|
291
|
+
success: false,
|
|
292
|
+
error: "Approval grant revocation could not be persisted",
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
return { success: true, grant: result.grant };
|
|
296
|
+
},
|
|
132
297
|
};
|
|
133
298
|
} catch {
|
|
134
299
|
return null; // degrade to the legacy no-gate path
|
|
@@ -53,6 +53,8 @@ import {
|
|
|
53
53
|
handleSessionClose,
|
|
54
54
|
handleSessionInterrupt,
|
|
55
55
|
handleSessionAnswer,
|
|
56
|
+
handleApprovalGrantsList,
|
|
57
|
+
handleApprovalGrantRevoke,
|
|
56
58
|
handleHostToolResult,
|
|
57
59
|
handleSubAgentList,
|
|
58
60
|
handleSubAgentGet,
|
|
@@ -746,9 +748,8 @@ export class ChainlessChainWSServer extends EventEmitter {
|
|
|
746
748
|
/** Read the same static + scoped authority used by the Agent Core. */
|
|
747
749
|
async _handlePermissionRulesGet(id, ws) {
|
|
748
750
|
try {
|
|
749
|
-
const { loadPermissionAuthority } =
|
|
750
|
-
"../../lib/permission-authority.js"
|
|
751
|
-
);
|
|
751
|
+
const { loadPermissionAuthority } =
|
|
752
|
+
await import("../../lib/permission-authority.js");
|
|
752
753
|
const loaded = loadPermissionAuthority({ cwd: this.projectRoot });
|
|
753
754
|
this._send(ws, {
|
|
754
755
|
id,
|
|
@@ -1416,6 +1417,16 @@ export class ChainlessChainWSServer extends EventEmitter {
|
|
|
1416
1417
|
return handleSessionAnswer(this, id, ws, message);
|
|
1417
1418
|
}
|
|
1418
1419
|
|
|
1420
|
+
/** @private */
|
|
1421
|
+
_handleApprovalGrantsList(id, ws, message) {
|
|
1422
|
+
return handleApprovalGrantsList(this, id, ws, message);
|
|
1423
|
+
}
|
|
1424
|
+
|
|
1425
|
+
/** @private */
|
|
1426
|
+
_handleApprovalGrantRevoke(id, ws, message) {
|
|
1427
|
+
return handleApprovalGrantRevoke(this, id, ws, message);
|
|
1428
|
+
}
|
|
1429
|
+
|
|
1419
1430
|
_handleHostToolResult(id, ws, message) {
|
|
1420
1431
|
return handleHostToolResult(this, id, ws, message);
|
|
1421
1432
|
}
|
|
@@ -1498,9 +1509,8 @@ export class ChainlessChainWSServer extends EventEmitter {
|
|
|
1498
1509
|
/** @private — ping/pong heartbeat to detect dead connections */
|
|
1499
1510
|
async _ensureTaskManager() {
|
|
1500
1511
|
if (this._taskManager) return this._taskManager;
|
|
1501
|
-
const { BackgroundTaskManager } =
|
|
1502
|
-
"../../harness/background-task-manager.js"
|
|
1503
|
-
);
|
|
1512
|
+
const { BackgroundTaskManager } =
|
|
1513
|
+
await import("../../harness/background-task-manager.js");
|
|
1504
1514
|
this._taskManager = new BackgroundTaskManager({
|
|
1505
1515
|
recoverOnStart: true,
|
|
1506
1516
|
policyCwd: this.projectRoot,
|
|
@@ -16,7 +16,8 @@
|
|
|
16
16
|
"graph_effect_receipts",
|
|
17
17
|
"deterministic_trace",
|
|
18
18
|
"agent_stream_events",
|
|
19
|
-
"agent_stream_payloads"
|
|
19
|
+
"agent_stream_payloads",
|
|
20
|
+
"unified_policy_decision"
|
|
20
21
|
]
|
|
21
22
|
},
|
|
22
23
|
"oneOf": [
|
|
@@ -1626,6 +1627,26 @@
|
|
|
1626
1627
|
}
|
|
1627
1628
|
}
|
|
1628
1629
|
},
|
|
1630
|
+
"HumanTaskDecision": {
|
|
1631
|
+
"type": "object",
|
|
1632
|
+
"additionalProperties": false,
|
|
1633
|
+
"required": [
|
|
1634
|
+
"actorId",
|
|
1635
|
+
"decision",
|
|
1636
|
+
"decidedAt"
|
|
1637
|
+
],
|
|
1638
|
+
"properties": {
|
|
1639
|
+
"actorId": {
|
|
1640
|
+
"$ref": "#/$defs/Identifier"
|
|
1641
|
+
},
|
|
1642
|
+
"decision": {
|
|
1643
|
+
"$ref": "#/$defs/ApprovalDecision"
|
|
1644
|
+
},
|
|
1645
|
+
"decidedAt": {
|
|
1646
|
+
"$ref": "#/$defs/Timestamp"
|
|
1647
|
+
}
|
|
1648
|
+
}
|
|
1649
|
+
},
|
|
1629
1650
|
"HumanTask": {
|
|
1630
1651
|
"type": "object",
|
|
1631
1652
|
"additionalProperties": false,
|
|
@@ -1659,6 +1680,12 @@
|
|
|
1659
1680
|
"operationDigest": {
|
|
1660
1681
|
"$ref": "#/$defs/Digest"
|
|
1661
1682
|
},
|
|
1683
|
+
"operation": {
|
|
1684
|
+
"$ref": "#/$defs/JsonValue"
|
|
1685
|
+
},
|
|
1686
|
+
"authorityDigest": {
|
|
1687
|
+
"$ref": "#/$defs/Digest"
|
|
1688
|
+
},
|
|
1662
1689
|
"status": {
|
|
1663
1690
|
"enum": [
|
|
1664
1691
|
"open",
|
|
@@ -1668,6 +1695,21 @@
|
|
|
1668
1695
|
"expired"
|
|
1669
1696
|
]
|
|
1670
1697
|
},
|
|
1698
|
+
"quorum": {
|
|
1699
|
+
"type": "integer",
|
|
1700
|
+
"minimum": 1,
|
|
1701
|
+
"maximum": 64
|
|
1702
|
+
},
|
|
1703
|
+
"separationOfDuties": {
|
|
1704
|
+
"type": "boolean"
|
|
1705
|
+
},
|
|
1706
|
+
"decisions": {
|
|
1707
|
+
"type": "array",
|
|
1708
|
+
"maxItems": 64,
|
|
1709
|
+
"items": {
|
|
1710
|
+
"$ref": "#/$defs/HumanTaskDecision"
|
|
1711
|
+
}
|
|
1712
|
+
},
|
|
1671
1713
|
"claimActorId": {
|
|
1672
1714
|
"anyOf": [
|
|
1673
1715
|
{
|
|
@@ -1688,12 +1730,32 @@
|
|
|
1688
1730
|
}
|
|
1689
1731
|
]
|
|
1690
1732
|
},
|
|
1733
|
+
"claimExpiresAt": {
|
|
1734
|
+
"anyOf": [
|
|
1735
|
+
{
|
|
1736
|
+
"$ref": "#/$defs/Timestamp"
|
|
1737
|
+
},
|
|
1738
|
+
{
|
|
1739
|
+
"type": "null"
|
|
1740
|
+
}
|
|
1741
|
+
]
|
|
1742
|
+
},
|
|
1691
1743
|
"nonce": {
|
|
1692
1744
|
"$ref": "#/$defs/Identifier"
|
|
1693
1745
|
},
|
|
1694
1746
|
"expiresAt": {
|
|
1695
1747
|
"$ref": "#/$defs/Timestamp"
|
|
1696
1748
|
},
|
|
1749
|
+
"createdAt": {
|
|
1750
|
+
"$ref": "#/$defs/Timestamp"
|
|
1751
|
+
},
|
|
1752
|
+
"updatedAt": {
|
|
1753
|
+
"$ref": "#/$defs/Timestamp"
|
|
1754
|
+
},
|
|
1755
|
+
"reason": {
|
|
1756
|
+
"type": "string",
|
|
1757
|
+
"maxLength": 1024
|
|
1758
|
+
},
|
|
1697
1759
|
"decision": {
|
|
1698
1760
|
"anyOf": [
|
|
1699
1761
|
{
|
|
@@ -1822,7 +1884,8 @@
|
|
|
1822
1884
|
"token_usage",
|
|
1823
1885
|
"tool_result",
|
|
1824
1886
|
"tool_use",
|
|
1825
|
-
"user"
|
|
1887
|
+
"user",
|
|
1888
|
+
"policy_decision"
|
|
1826
1889
|
]
|
|
1827
1890
|
},
|
|
1828
1891
|
"AgentStreamEventEnvelope": {
|
|
@@ -2444,6 +2507,85 @@
|
|
|
2444
2507
|
}
|
|
2445
2508
|
}
|
|
2446
2509
|
},
|
|
2510
|
+
"AgentPolicyDecisionStreamEvent": {
|
|
2511
|
+
"type": "object",
|
|
2512
|
+
"required": [
|
|
2513
|
+
"type",
|
|
2514
|
+
"schema_version",
|
|
2515
|
+
"decision_id",
|
|
2516
|
+
"source",
|
|
2517
|
+
"decision",
|
|
2518
|
+
"policy_digest"
|
|
2519
|
+
],
|
|
2520
|
+
"properties": {
|
|
2521
|
+
"type": {
|
|
2522
|
+
"const": "policy_decision"
|
|
2523
|
+
},
|
|
2524
|
+
"schema_version": {
|
|
2525
|
+
"const": 1
|
|
2526
|
+
},
|
|
2527
|
+
"decision_id": {
|
|
2528
|
+
"type": "string",
|
|
2529
|
+
"minLength": 1,
|
|
2530
|
+
"maxLength": 160
|
|
2531
|
+
},
|
|
2532
|
+
"source": {
|
|
2533
|
+
"enum": [
|
|
2534
|
+
"hook",
|
|
2535
|
+
"tool"
|
|
2536
|
+
]
|
|
2537
|
+
},
|
|
2538
|
+
"decision": {
|
|
2539
|
+
"enum": [
|
|
2540
|
+
"allow",
|
|
2541
|
+
"ask",
|
|
2542
|
+
"deny"
|
|
2543
|
+
]
|
|
2544
|
+
},
|
|
2545
|
+
"session_id": {
|
|
2546
|
+
"type": "string",
|
|
2547
|
+
"maxLength": 160
|
|
2548
|
+
},
|
|
2549
|
+
"turn_id": {
|
|
2550
|
+
"type": "string",
|
|
2551
|
+
"maxLength": 160
|
|
2552
|
+
},
|
|
2553
|
+
"tool_use_id": {
|
|
2554
|
+
"type": "string",
|
|
2555
|
+
"maxLength": 160
|
|
2556
|
+
},
|
|
2557
|
+
"tool": {
|
|
2558
|
+
"type": "string",
|
|
2559
|
+
"maxLength": 256
|
|
2560
|
+
},
|
|
2561
|
+
"hook_event": {
|
|
2562
|
+
"type": "string",
|
|
2563
|
+
"maxLength": 96
|
|
2564
|
+
},
|
|
2565
|
+
"via": {
|
|
2566
|
+
"type": "string",
|
|
2567
|
+
"maxLength": 120
|
|
2568
|
+
},
|
|
2569
|
+
"rule": {
|
|
2570
|
+
"type": "string",
|
|
2571
|
+
"maxLength": 256
|
|
2572
|
+
},
|
|
2573
|
+
"reason": {
|
|
2574
|
+
"type": "string",
|
|
2575
|
+
"maxLength": 512
|
|
2576
|
+
},
|
|
2577
|
+
"chain": {
|
|
2578
|
+
"type": "array",
|
|
2579
|
+
"maxItems": 8,
|
|
2580
|
+
"items": {
|
|
2581
|
+
"$ref": "#/$defs/JsonValue"
|
|
2582
|
+
}
|
|
2583
|
+
},
|
|
2584
|
+
"policy_digest": {
|
|
2585
|
+
"$ref": "#/$defs/Digest"
|
|
2586
|
+
}
|
|
2587
|
+
}
|
|
2588
|
+
},
|
|
2447
2589
|
"AgentQuestionRequestStreamEvent": {
|
|
2448
2590
|
"type": "object",
|
|
2449
2591
|
"required": [
|
|
@@ -3276,6 +3418,9 @@
|
|
|
3276
3418
|
},
|
|
3277
3419
|
{
|
|
3278
3420
|
"$ref": "#/$defs/AgentUserStreamEvent"
|
|
3421
|
+
},
|
|
3422
|
+
{
|
|
3423
|
+
"$ref": "#/$defs/AgentPolicyDecisionStreamEvent"
|
|
3279
3424
|
}
|
|
3280
3425
|
]
|
|
3281
3426
|
},
|
|
@@ -3390,7 +3535,13 @@
|
|
|
3390
3535
|
"thread/list",
|
|
3391
3536
|
"thread/archive",
|
|
3392
3537
|
"turn/start",
|
|
3393
|
-
"turn/interrupt"
|
|
3538
|
+
"turn/interrupt",
|
|
3539
|
+
"graph/compile",
|
|
3540
|
+
"graph/run",
|
|
3541
|
+
"graph/status",
|
|
3542
|
+
"graph/history",
|
|
3543
|
+
"graph/cancel",
|
|
3544
|
+
"graph/reconcile"
|
|
3394
3545
|
]
|
|
3395
3546
|
}
|
|
3396
3547
|
}
|