chainlesschain 0.163.8 → 0.164.0
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 +4 -1
- package/scripts/macos-mcp-launcher-build.mjs +317 -0
- package/scripts/macos-mcp-launcher-postinstall.sh +54 -0
- package/scripts/macos-mcp-launcher-preinstall.sh +61 -0
- package/src/assets/web-panel/assets/{AIOps-CavM7W3k.js → AIOps-D2MEn7fI.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CUvZGabQ.js → ActionButton-lCW_4Gf0.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DeBnWnbe.js → Analytics-Bs7i-nsS.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DbI5kxvd.js → AppLayout-CK7B6S_j.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-D93bigKm.js → Artifacts-C8ILjpyo.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CBNvfUZa.js → Audit-Bb9cNaWc.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-CJLyh_YU.js → BackgroundAgents-sC9ooXIf.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-D_0yoehD.js → Backup-D-DrsplT.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-TJxmbObW.js → BaseInput-uCNZpwSK.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CE0dto1q.js → Chat-CsDK1uE9.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CZ5-yYiD.js → ChatBubbleRenderer-OqSDt50w.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-Ck1RVIVo.js → Checkbox-JhTXM1-K.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-qpoyf6DK.js → Codegen-BbzZLnyD.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DUyPWjIE.js → Col-D4VW4m4j.js} +1 -1
- package/src/assets/web-panel/assets/{Community-D_S1BemS.js → Community-BXrYawxV.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BjxeK-Gc.js → Compact-DCihGy1u.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-Dd3CEJsu.js → Compliance-DlyZ-lk8.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-B4QG7-ad.js → Cowork-DvGZrhbO.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-BtZnids5.js → Cron-DUncZi8h.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CHPfCBFD.js → Crosschain-C_hLuUcm.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DT8DCEOK.js → DID-b6YSUqxr.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-COQab5_U.js → Dashboard-uvM15Cfb.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BY1PsQuU.js → Dropdown-D1-Nd4qY.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CsuAuaq3.js → EmailListRenderer-8ApvL6Zc.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BqpinD-j.js → FamilyGuardDashboard-LYJt8811.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-D0gkfQFv.js → Federation-BbI3HGpv.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BqgE-axK.js → FormItemContext-DSoEKuFu.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-D0hJ2KvC.js → GenericCardRenderer-B0S9OWd5.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CmMB0uPY.js → Git-DIs9Zhf3.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BnVEI0Dk.js → Governance-jzZXrxcl.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-YTAMihRP.js → Inference-JUPjf2ZI.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-0ax7VHop.js → KnowledgeGraph-DxnfJvlP.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-B9TRcokL.js → Logs-iXiz8BEE.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-GmB6DOr6.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-B6CSuD_H.js → Marketplace-Y3Xch312.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CjMXvOVU.js → McpTools-D7kGGbO7.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-CXRF71U3.js → Memory-Do_hVxzh.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DQgNp_oS.js → MobileBridge-CtrR0Tas.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-BL0Czcoj.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-6hDTRPe1.js → Mtc-qo5QCTGd.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-BlVHU1DS.js → MtcAudit-cq5mnjYj.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-DP9pzEbV.js → Multisig-Bq0MAQHw.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Djorh8EV.js → NLProgramming-DdWE6Vi2.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-oLZ-JkUg.js → Notes-BxMBFcIp.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-Cg288VH3.js → NotificationSettings-RTrAcbUe.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-Bb1O3Ofr.js → OrderTableRenderer-DJbpGqzT.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-CBdo-bHs.js → Organization-SQzIPdqC.js} +2 -2
- package/src/assets/web-panel/assets/{Overflow-qZdnVumx.js → Overflow-02yECh22.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-D4kNfGNQ.js → P2P-BNg4pNCM.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DnlMemM7.js → PdhVaultBrowser-BxPJZsD3.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-DHucHFBJ.js → Permissions-CLnDnPAz.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-BovlOIPR.js → PersonalDataHub-C5m0AjGf.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-Deru3CQY.js → Pipeline-VwOf5Dhv.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-Bq5oTTbU.js → Privacy-CC0W2hZd.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BfzxVWAz.js → ProjectInit-Dz893Bob.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CKC6XBtH.js → ProjectSettings-CxQkvl0k.js} +2 -2
- package/src/assets/web-panel/assets/Projects-DDAjkUkT.js +1 -0
- package/src/assets/web-panel/assets/{Providers-C_jx4TWX.js → Providers-DeB9IkxK.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-BdIHeVGC.js → QrScannerModal-OCeoaswn.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BwZwAcPD.js → QuickAsk-DenotaAj.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BNTt0L-m.js → Recommend-Cies_jjI.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-Biyn2-Ro.js → RemoteSession-Dxzl5n2T.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-D6VpG32B.js → Reputation-CW0mvxgZ.js} +1 -1
- package/src/assets/web-panel/assets/{Row-D_74OvQQ.js → Row-SEd32qZU.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BTr0a-BQ.js → RssFeed-BSwnJ3Lm.js} +3 -3
- package/src/assets/web-panel/assets/{Search-C3MCFoNU.js → Search-xe2m8bkC.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CqW9aJ6s.js → Security-Mq2F9Nro.js} +3 -3
- package/src/assets/web-panel/assets/{Services-Cw5GNaHF.js → Services-BKGw2V3P.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DZps5qeY.js → Skeleton-DW95-Rxf.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-C6NQ1znT.js → Skills-CHgChCv_.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DFP8G2Sh.js → Sla-tKh6k3R7.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-ESt6MB6v.js → SpeechSettings-D6UL3dA5.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BHnN98aM.js → SyncSettings-D0Fw8fVL.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-NiSCaOf-.js → Tasks-20x1GB3D.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DsKFhW2C.js → Templates-DJ-lts-a.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CQ0E0ze5.js → Tenant-BFdGpbs7.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-D_rBu_by.js → Terminal-Xpx61vHL.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-D3Vm4Po4.js → TimelineRenderer-C6UIvyZQ.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DNTxRH6q.js → Tokens-Dellq08f.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-Dgprz1ms.js → Trigger-VKw8d0J-.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-B2rUnVBD.js → Trust-DNftdKT5.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DEGQNc6_.js → UkeySign-DX9VAKJI.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-jlsAx3Eh.js → VideoEditing-B2h3jO8q.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-8jQih1ij.js → Wallet-CjGkof7f.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-XLeO6xIB.js → WebAuthn-2Zfcu55P.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-De_dgDAG.js → WorkflowEditor-B9eZ8UxZ.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CI19R_Sk.js → chat-CQNfD-YO.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DsYTOYN3.js → colors-D4usyFT2.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CM3-t_Qr.js → compact-item-s4TpjvjX.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BjxlBRZv.js → createContext-BRCSvYxj.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DKJjSWRn.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-RDaWX_4i.js → hasIn-AdkUbkV-.js} +1 -1
- package/src/assets/web-panel/assets/{index-BN6UPD2E.js → index--00U6vXZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CiECJi-Q.js → index-B2V-eKfK.js} +1 -1
- package/src/assets/web-panel/assets/{index-CnHH7bnD.js → index-B4JJCfQ2.js} +1 -1
- package/src/assets/web-panel/assets/{index-CjTrRt13.js → index-BIoG5yYf.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dxge-xWl.js → index-BMcimU-2.js} +1 -1
- package/src/assets/web-panel/assets/{index-9R6BxAr0.js → index-BPhkFZ1I.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHNYPO0b.js → index-BQ3DXBtD.js} +3 -3
- package/src/assets/web-panel/assets/{index-Cpqm1qfU.js → index-Bad4VNvz.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9O9YyWE.js → index-BgiXR_-_.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5REnKt8.js → index-BtobShro.js} +1 -1
- package/src/assets/web-panel/assets/{index-D6sm5-Xq.js → index-Bw2MEnUk.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcPFB8qJ.js → index-C1mJtE6q.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKJr-TZp.js → index-C484EJiS.js} +1 -1
- package/src/assets/web-panel/assets/{index-Drlnwr8F.js → index-C5KAQFPQ.js} +1 -1
- package/src/assets/web-panel/assets/index-C61cnl3K.js +1 -0
- package/src/assets/web-panel/assets/{index-Dsij_KsN.js → index-C7Y8Aluc.js} +1 -1
- package/src/assets/web-panel/assets/{index-IeiL9RKc.js → index-CCsM_Ybx.js} +1 -1
- package/src/assets/web-panel/assets/{index-B-Z8eFUJ.js → index-CJCFe2Qf.js} +1 -1
- package/src/assets/web-panel/assets/{index-CyOGN6a5.js → index-CJVEOa4i.js} +1 -1
- package/src/assets/web-panel/assets/{index-B0PMlbMs.js → index-CJdQrZth.js} +1 -1
- package/src/assets/web-panel/assets/{index-nAH87mQP.js → index-CKC1t3Ic.js} +1 -1
- package/src/assets/web-panel/assets/{index-BGqqJfL0.js → index-CQhAVU5t.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cd9OJhHG.js → index-CYdoQsa1.js} +1 -1
- package/src/assets/web-panel/assets/{index-D0zcy54x.js → index-Cduu2Hhr.js} +1 -1
- package/src/assets/web-panel/assets/{index-DIUnNOjG.js → index-CkwiSLhU.js} +1 -1
- package/src/assets/web-panel/assets/{index-CVQMeiwH.js → index-Cvyt-zhm.js} +1 -1
- package/src/assets/web-panel/assets/{index-BlT2VAEK.js → index-D2GjI2oe.js} +1 -1
- package/src/assets/web-panel/assets/index-D4XFHxBr.js +1 -0
- package/src/assets/web-panel/assets/{index-C0yx-jtQ.js → index-DARsAyUp.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bi46Xu4u.js → index-DVKfQ0Ux.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cd3euP_4.js → index-DZT36ZYq.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCnZyIMA.js → index-D_XBHopw.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4gkzxkw.js → index-DdCB70SS.js} +1 -1
- package/src/assets/web-panel/assets/{index-B7WBt_4T.js → index-DzRjHxEv.js} +1 -1
- package/src/assets/web-panel/assets/{index-DX7tuWVJ.js → index-MMN9V6JF.js} +1 -1
- package/src/assets/web-panel/assets/{index-DoQA0-52.js → index-RfMr79MW.js} +1 -1
- package/src/assets/web-panel/assets/{index-DXXtGMUJ.js → index-_IRVsV9X.js} +1 -1
- package/src/assets/web-panel/assets/{index-pPL66J85.js → index-nXyk8GZ9.js} +1 -1
- package/src/assets/web-panel/assets/{index-DyIWssPC.js → index-s_buFMEG.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BTL88of4.js → initDefaultProps-Blmpk7HL.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BUB2pXwB.js → motion-DPBJMv1n.js} +1 -1
- package/src/assets/web-panel/assets/{move-egCkkOMm.js → move-ButdzCM7.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DAWhZC8c.js → mtc-parser-cyRC_QCe.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CvOxe_6d.js → omit-1epSV7hz.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DZUSLZ5Z.js → pickAttrs-DuPY8xJs.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BERxGNMY.js → placementArrow-6XZqarhe.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DZuDfZ9n.js → responsiveObserve-B40pXBWM.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DO756sgI.js → slide-jbZ9Wu4n.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BRQlIz28.js → statusUtils-BKQQcVy4.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DCSfdybl.js → styleChecker-NiKfWjUT.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-LD8dWVve.js → useFlexGapSupport-bQUCvPeb.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BX9uW2LK.js → useFs-CUGji7ph.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BPSlPuHU.js → usePersonalDataHub-4veyN2N2.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-BmOILC9V.js → vnode-1-nLug-Z.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-1iKowKGg.js → zoom-dhCeRDMo.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +3 -3
- package/src/commands/cowork.js +174 -19
- package/src/commands/permissions.js +240 -16
- package/src/commands/plugin.js +1293 -56
- package/src/commands/session-location.js +276 -0
- package/src/commands/session.js +2 -0
- package/src/data/changelog.json +15 -2
- package/src/gateways/ws/action-protocol.js +35 -10
- package/src/gateways/ws/remote-session-protocol.js +24 -1
- package/src/gateways/ws/ws-agent-handler.js +12 -0
- package/src/gateways/ws/ws-server.js +48 -12
- package/src/harness/jsonl-session-store.js +341 -24
- package/src/harness/mcp-client.js +8 -1
- package/src/harness/remote-session-audit.js +1 -0
- package/src/harness/remote-session-crypto.js +210 -2
- package/src/harness/remote-session-registry.js +159 -6
- package/src/harness/session-list-index.js +233 -14
- package/src/lib/agent-authority.js +6 -0
- package/src/lib/background-agent-keeper-client.js +248 -0
- package/src/lib/background-agent-keeper-protocol.js +147 -0
- package/src/lib/background-agent-supervisor.js +520 -40
- package/src/lib/background-interaction-resolver.js +12 -0
- package/src/lib/background-turn-bootstrap-protocol.js +126 -0
- package/src/lib/cowork-workflow.js +336 -16
- package/src/lib/dynamic-workflow-facade.js +648 -0
- package/src/lib/execution-location-contract.js +551 -0
- package/src/lib/execution-location-runtime.js +130 -0
- package/src/lib/ide-context.js +94 -6
- package/src/lib/mcp-stdio-package-materialization.js +166 -14
- package/src/lib/packer/pkg-config-generator.js +2 -0
- package/src/lib/permission-authority.js +77 -0
- package/src/lib/permission-side-effect-center.js +495 -0
- package/src/lib/plugin-runtime/install.js +514 -13
- package/src/lib/plugin-runtime/marketplace-artifact-readback.js +900 -0
- package/src/lib/plugin-runtime/marketplace-catalog.js +1181 -0
- package/src/lib/plugin-runtime/marketplace-impact.js +408 -0
- package/src/lib/plugin-runtime/marketplace-remote-artifacts.js +1567 -0
- package/src/lib/plugin-security.js +60 -3
- package/src/lib/process-execution-broker/index.js +1095 -57
- package/src/lib/process-execution-broker/linux-bwrap-descriptor-launch.js +375 -0
- package/src/lib/process-execution-broker/linux-generic-bwrap-runtime.js +90 -16
- package/src/lib/process-execution-broker/linux-generic-bwrap.js +159 -18
- package/src/lib/process-execution-broker/macos-mcp-launcher-contract.js +278 -0
- package/src/lib/process-execution-broker/macos-mcp-launcher-protocol.json +23 -0
- package/src/lib/process-execution-broker/macos-mcp-launcher.c +1497 -0
- package/src/lib/process-execution-broker/mcp-fd-entry-bootstrap.js +37 -0
- package/src/lib/process-execution-broker/platform-sandbox.js +2330 -279
- package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
- package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
- package/src/lib/process-execution-broker/windows-sandbox.cs +50 -4
- package/src/lib/public-ide-capability-manifest.js +3 -0
- package/src/lib/remote-approval-bridge.js +123 -17
- package/src/lib/remote-membership-authority.js +632 -0
- package/src/lib/remote-membership-coordinator.js +2409 -0
- package/src/lib/remote-membership-host-store.js +1750 -0
- package/src/lib/scoped-permission-store.js +369 -0
- package/src/lib/session-anti-rollback-anchor.js +262 -5
- package/src/lib/sub-agent-context.js +4 -0
- package/src/lib/workflow-definition-contract.js +149 -0
- package/src/repl/agent-repl.js +41 -7
- package/src/repl/chat-repl.js +2 -0
- package/src/repl/clipboard-image.js +735 -16
- package/src/repl/ide-status.js +1 -1
- package/src/repl/prompt-interactions.js +59 -6
- package/src/runtime/agent-core.js +83 -3
- package/src/runtime/headless-runner.js +30 -25
- package/src/runtime/headless-stream.js +32 -25
- package/src/workers/background-agent-keeper.js +498 -0
- package/src/workers/background-agent-worker.js +358 -13
- package/src/workers/background-turn-bootstrap.js +143 -0
- package/src/assets/web-panel/assets/MarkdownRenderer-yySN5YNM.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-DlPwcCbq.js +0 -1
- package/src/assets/web-panel/assets/Projects-CMolGhae.js +0 -1
- package/src/assets/web-panel/assets/devWarning-S1ld2LwU.js +0 -1
- package/src/assets/web-panel/assets/index-Drz6yq0m.js +0 -1
- package/src/assets/web-panel/assets/index-uWiUs7S_.js +0 -1
|
@@ -3,15 +3,18 @@
|
|
|
3
3
|
* permission ruleset (Claude-Code `permissions.{allow,ask,deny}` parity).
|
|
4
4
|
*
|
|
5
5
|
* cc permissions list [--json] merged ruleset + source file
|
|
6
|
+
* cc permissions activity [--session <id>] actual resources/effects/recovery
|
|
6
7
|
* cc permissions test <tool> <args...> dry-run: which rule decides?
|
|
7
8
|
* cc permissions add <allow|ask|deny> <rule> append a rule to a settings file
|
|
8
9
|
* cc permissions allow|ask|deny <rule> convenience aliases for add
|
|
10
|
+
* cc permissions scoped <decision> <rule> add a workspace-bound TTL rule
|
|
11
|
+
* cc permissions revoke <id> --revision <n> CAS-revoke a scoped rule
|
|
9
12
|
* [--local | --user] (default target: project)
|
|
10
13
|
*
|
|
11
|
-
* The ruleset is loaded by
|
|
12
|
-
* evaluated by permission-rules (deny > ask > allow).
|
|
13
|
-
* and
|
|
14
|
-
*
|
|
14
|
+
* The ruleset is loaded by the shared permission authority resolver and
|
|
15
|
+
* evaluated by permission-rules (deny > ask > allow). Scoped mutations are
|
|
16
|
+
* CLI-owned and live outside the repository; IDE clients call this surface
|
|
17
|
+
* instead of editing authority files directly.
|
|
15
18
|
*/
|
|
16
19
|
|
|
17
20
|
import chalk from "chalk";
|
|
@@ -24,7 +27,37 @@ const KIND_COLOR = {
|
|
|
24
27
|
};
|
|
25
28
|
|
|
26
29
|
const RUNTIME_ADVISORY =
|
|
27
|
-
"
|
|
30
|
+
"permission rules are enforced by Agent Core; scoped rules are refreshed before every tool call, while managed host policy and ApprovalGate still apply.";
|
|
31
|
+
|
|
32
|
+
const DURATION_UNITS = Object.freeze({
|
|
33
|
+
s: 1000,
|
|
34
|
+
m: 60 * 1000,
|
|
35
|
+
h: 60 * 60 * 1000,
|
|
36
|
+
d: 24 * 60 * 60 * 1000,
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
function parseDurationMs(value) {
|
|
40
|
+
const match = String(value || "")
|
|
41
|
+
.trim()
|
|
42
|
+
.toLowerCase()
|
|
43
|
+
.match(/^(\d+)(s|m|h|d)$/);
|
|
44
|
+
if (!match) {
|
|
45
|
+
throw new Error("duration must be an integer followed by s, m, h, or d");
|
|
46
|
+
}
|
|
47
|
+
const duration = Number(match[1]) * DURATION_UNITS[match[2]];
|
|
48
|
+
if (!Number.isSafeInteger(duration) || duration < 1000) {
|
|
49
|
+
throw new Error("duration must be at least 1s and within the safe range");
|
|
50
|
+
}
|
|
51
|
+
return duration;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function parseNonNegativeInteger(value, label) {
|
|
55
|
+
const number = Number(value);
|
|
56
|
+
if (!Number.isSafeInteger(number) || number < 0) {
|
|
57
|
+
throw new Error(`${label} must be a non-negative integer`);
|
|
58
|
+
}
|
|
59
|
+
return number;
|
|
60
|
+
}
|
|
28
61
|
|
|
29
62
|
function printRuntimeAdvisory() {
|
|
30
63
|
logger.log(chalk.yellow(RUNTIME_ADVISORY));
|
|
@@ -49,7 +82,12 @@ function buildArgs(tool, positional, rulesMod) {
|
|
|
49
82
|
return {};
|
|
50
83
|
}
|
|
51
84
|
|
|
52
|
-
async function persistPermissionRule(
|
|
85
|
+
async function persistPermissionRule(
|
|
86
|
+
decision,
|
|
87
|
+
rule,
|
|
88
|
+
options,
|
|
89
|
+
operation = "add",
|
|
90
|
+
) {
|
|
53
91
|
try {
|
|
54
92
|
const kind = String(decision || "").toLowerCase();
|
|
55
93
|
if (!["allow", "ask", "deny"].includes(kind)) {
|
|
@@ -110,11 +148,13 @@ export function registerPermissionsCommand(program) {
|
|
|
110
148
|
.option("--settings <file>", "Also merge an explicit settings file")
|
|
111
149
|
.action(async (options) => {
|
|
112
150
|
try {
|
|
113
|
-
const {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
151
|
+
const { loadPermissionAuthority } =
|
|
152
|
+
await import("../lib/permission-authority.js");
|
|
153
|
+
const { rules, sources, files, managed, managedFile, scoped } =
|
|
154
|
+
loadPermissionAuthority({
|
|
155
|
+
cwd: process.cwd(),
|
|
156
|
+
settingsFile: options.settings,
|
|
157
|
+
});
|
|
118
158
|
if (options.json) {
|
|
119
159
|
console.log(
|
|
120
160
|
JSON.stringify(
|
|
@@ -124,8 +164,9 @@ export function registerPermissionsCommand(program) {
|
|
|
124
164
|
files,
|
|
125
165
|
managed,
|
|
126
166
|
managedFile,
|
|
167
|
+
scoped,
|
|
127
168
|
enforcement: {
|
|
128
|
-
status: "
|
|
169
|
+
status: "enforced",
|
|
129
170
|
note: RUNTIME_ADVISORY,
|
|
130
171
|
},
|
|
131
172
|
},
|
|
@@ -144,7 +185,7 @@ export function registerPermissionsCommand(program) {
|
|
|
144
185
|
"(or create .claude/settings.json with a permissions block)",
|
|
145
186
|
),
|
|
146
187
|
);
|
|
147
|
-
return;
|
|
188
|
+
if (!scoped?.rules?.length) return;
|
|
148
189
|
}
|
|
149
190
|
for (const kind of ["deny", "ask", "allow"]) {
|
|
150
191
|
if (rules[kind].length === 0) continue;
|
|
@@ -191,6 +232,17 @@ export function registerPermissionsCommand(program) {
|
|
|
191
232
|
);
|
|
192
233
|
}
|
|
193
234
|
}
|
|
235
|
+
if (scoped?.rules?.length) {
|
|
236
|
+
logger.log(chalk.bold("\nworkspace-scoped rules"));
|
|
237
|
+
for (const record of scoped.rules) {
|
|
238
|
+
const status = record.effectiveStatus || record.status;
|
|
239
|
+
const color = status === "active" ? chalk.green : chalk.gray;
|
|
240
|
+
logger.log(
|
|
241
|
+
` ${color(status.padEnd(28))} ${record.id} r${record.revision} ${record.decision} ${record.rule}`,
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
logger.log(chalk.dim(` authority: ${scoped.file}`));
|
|
245
|
+
}
|
|
194
246
|
} catch (err) {
|
|
195
247
|
logger.error(chalk.red(`permissions list failed: ${err.message}`));
|
|
196
248
|
process.exitCode = 1;
|
|
@@ -246,6 +298,82 @@ export function registerPermissionsCommand(program) {
|
|
|
246
298
|
}
|
|
247
299
|
});
|
|
248
300
|
|
|
301
|
+
// ── activity ──────────────────────────────────────────────────────────
|
|
302
|
+
cmd
|
|
303
|
+
.command("activity")
|
|
304
|
+
.description(
|
|
305
|
+
"Show actual resource, side-effect, permission, and recovery evidence",
|
|
306
|
+
)
|
|
307
|
+
.option("-s, --session <id>", "Persisted CLI session", "default")
|
|
308
|
+
.option("-n, --limit <n>", "Maximum side-effect records", "50")
|
|
309
|
+
.option("--json", "Output the versioned center projection as JSON")
|
|
310
|
+
.action(async (options) => {
|
|
311
|
+
try {
|
|
312
|
+
const sessionId = String(options.session || "default").trim();
|
|
313
|
+
const limit = Math.max(
|
|
314
|
+
1,
|
|
315
|
+
Math.min(100, parseNonNegativeInteger(options.limit, "limit")),
|
|
316
|
+
);
|
|
317
|
+
const { loadSideEffectLedger } =
|
|
318
|
+
await import("../lib/side-effect-ledger-store.js");
|
|
319
|
+
const { loadTurnBindingLog } =
|
|
320
|
+
await import("../lib/turn-binding-store.js");
|
|
321
|
+
const { loadMcpLedgerRecovery } =
|
|
322
|
+
await import("../lib/mcp-call-ledger-store.js");
|
|
323
|
+
const { sessionExists } =
|
|
324
|
+
await import("../harness/jsonl-session-store.js");
|
|
325
|
+
const { buildPermissionSideEffectCenter } =
|
|
326
|
+
await import("../lib/permission-side-effect-center.js");
|
|
327
|
+
const mcpRecords = sessionExists(sessionId)
|
|
328
|
+
? loadMcpLedgerRecovery(sessionId).records
|
|
329
|
+
: [];
|
|
330
|
+
const projection = buildPermissionSideEffectCenter({
|
|
331
|
+
sessionId,
|
|
332
|
+
operations: loadSideEffectLedger(sessionId).list(),
|
|
333
|
+
mcpRecords,
|
|
334
|
+
turns: loadTurnBindingLog(sessionId).list(),
|
|
335
|
+
limit,
|
|
336
|
+
});
|
|
337
|
+
if (options.json) {
|
|
338
|
+
console.log(JSON.stringify(projection, null, 2));
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
if (projection.entries.length === 0) {
|
|
342
|
+
logger.log(
|
|
343
|
+
chalk.gray(`No side-effect evidence for session ${sessionId}.`),
|
|
344
|
+
);
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
logger.log(
|
|
348
|
+
chalk.bold(
|
|
349
|
+
`${projection.entries.length} actual side effect(s) · ${projection.summary.irreversible} irreversible · ${projection.summary.inspect} need inspection`,
|
|
350
|
+
),
|
|
351
|
+
);
|
|
352
|
+
for (const entry of projection.entries) {
|
|
353
|
+
const coverage =
|
|
354
|
+
entry.recovery.coverage === "full"
|
|
355
|
+
? chalk.green(entry.recovery.coverage)
|
|
356
|
+
: entry.recovery.coverage === "partial"
|
|
357
|
+
? chalk.yellow(entry.recovery.coverage)
|
|
358
|
+
: chalk.red(entry.recovery.coverage);
|
|
359
|
+
logger.log(
|
|
360
|
+
`${chalk.cyan(entry.tool)} ${entry.kind} ${entry.state} · recovery ${coverage}/${entry.recovery.action}`,
|
|
361
|
+
);
|
|
362
|
+
for (const [kind, values] of Object.entries(entry.resources)) {
|
|
363
|
+
if (values.length) {
|
|
364
|
+
logger.log(chalk.gray(` ${kind}: ${values.join(", ")}`));
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
for (const warning of entry.unresolvedResources) {
|
|
368
|
+
logger.log(chalk.yellow(` unresolved: ${warning}`));
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
} catch (err) {
|
|
372
|
+
logger.error(chalk.red(`permissions activity failed: ${err.message}`));
|
|
373
|
+
process.exitCode = 1;
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
|
|
249
377
|
// ── test (dry-run) ─────────────────────────────────────────────────────
|
|
250
378
|
cmd
|
|
251
379
|
.command("test <tool> [args...]")
|
|
@@ -256,13 +384,14 @@ export function registerPermissionsCommand(program) {
|
|
|
256
384
|
.option("--settings <file>", "Also merge an explicit settings file")
|
|
257
385
|
.action(async (tool, args, options) => {
|
|
258
386
|
try {
|
|
259
|
-
const {
|
|
260
|
-
|
|
387
|
+
const { ruleSource } = await import("../lib/settings-loader.cjs");
|
|
388
|
+
const { loadPermissionAuthority } =
|
|
389
|
+
await import("../lib/permission-authority.js");
|
|
261
390
|
// .cjs default-export interop: module.exports surfaces as `.default`.
|
|
262
391
|
const rulesMod = await import("../lib/permission-rules.cjs");
|
|
263
392
|
const mod = rulesMod.default || rulesMod;
|
|
264
393
|
|
|
265
|
-
const { rules, sources } =
|
|
394
|
+
const { rules, sources } = loadPermissionAuthority({
|
|
266
395
|
cwd: process.cwd(),
|
|
267
396
|
settingsFile: options.settings,
|
|
268
397
|
});
|
|
@@ -392,4 +521,99 @@ export function registerPermissionsCommand(program) {
|
|
|
392
521
|
await persistPermissionRule(decision, rule, options, decision);
|
|
393
522
|
});
|
|
394
523
|
}
|
|
524
|
+
|
|
525
|
+
cmd
|
|
526
|
+
.command("scoped <decision> <rule>")
|
|
527
|
+
.description(
|
|
528
|
+
"Create a workspace-bound, expiring rule in the CLI security store",
|
|
529
|
+
)
|
|
530
|
+
.requiredOption(
|
|
531
|
+
"--expires-in <duration>",
|
|
532
|
+
"TTL such as 30s, 15m, 2h, or 1d",
|
|
533
|
+
)
|
|
534
|
+
.option("--reason <text>", "Human-readable reason for the grant")
|
|
535
|
+
.option(
|
|
536
|
+
"--expected-generation <n>",
|
|
537
|
+
"Create only if the store generation still matches",
|
|
538
|
+
)
|
|
539
|
+
.option("--json", "Output as JSON")
|
|
540
|
+
.action(async (decision, rule, options) => {
|
|
541
|
+
try {
|
|
542
|
+
const ttlMs = parseDurationMs(options.expiresIn);
|
|
543
|
+
const expectedGeneration =
|
|
544
|
+
options.expectedGeneration === undefined
|
|
545
|
+
? null
|
|
546
|
+
: parseNonNegativeInteger(
|
|
547
|
+
options.expectedGeneration,
|
|
548
|
+
"expected generation",
|
|
549
|
+
);
|
|
550
|
+
const { ScopedPermissionStore } =
|
|
551
|
+
await import("../lib/scoped-permission-store.js");
|
|
552
|
+
const store = new ScopedPermissionStore({ cwd: process.cwd() });
|
|
553
|
+
const record = store.add({
|
|
554
|
+
decision,
|
|
555
|
+
rule,
|
|
556
|
+
expiresAt: Date.now() + ttlMs,
|
|
557
|
+
reason: options.reason || "",
|
|
558
|
+
expectedGeneration,
|
|
559
|
+
});
|
|
560
|
+
if (options.json) {
|
|
561
|
+
console.log(
|
|
562
|
+
JSON.stringify(
|
|
563
|
+
{
|
|
564
|
+
record,
|
|
565
|
+
authority: {
|
|
566
|
+
file: store.filePath,
|
|
567
|
+
workspace: store.workspace,
|
|
568
|
+
},
|
|
569
|
+
},
|
|
570
|
+
null,
|
|
571
|
+
2,
|
|
572
|
+
),
|
|
573
|
+
);
|
|
574
|
+
return;
|
|
575
|
+
}
|
|
576
|
+
logger.log(
|
|
577
|
+
`${KIND_COLOR[record.decision].bold("✓ scoped " + record.decision)} ${record.rule}`,
|
|
578
|
+
);
|
|
579
|
+
logger.log(
|
|
580
|
+
chalk.gray(
|
|
581
|
+
` ${record.id} r${record.revision}; expires ${new Date(record.expiresAt).toISOString()}`,
|
|
582
|
+
),
|
|
583
|
+
);
|
|
584
|
+
} catch (err) {
|
|
585
|
+
logger.error(chalk.red(`permissions scoped failed: ${err.message}`));
|
|
586
|
+
process.exitCode = 1;
|
|
587
|
+
}
|
|
588
|
+
});
|
|
589
|
+
|
|
590
|
+
cmd
|
|
591
|
+
.command("revoke <id>")
|
|
592
|
+
.description("Revoke a workspace-scoped rule with revision CAS")
|
|
593
|
+
.requiredOption("--revision <n>", "Expected record revision")
|
|
594
|
+
.option("--json", "Output as JSON")
|
|
595
|
+
.action(async (id, options) => {
|
|
596
|
+
try {
|
|
597
|
+
const expectedRevision = parseNonNegativeInteger(
|
|
598
|
+
options.revision,
|
|
599
|
+
"revision",
|
|
600
|
+
);
|
|
601
|
+
const { ScopedPermissionStore } =
|
|
602
|
+
await import("../lib/scoped-permission-store.js");
|
|
603
|
+
const store = new ScopedPermissionStore({ cwd: process.cwd() });
|
|
604
|
+
const record = store.revoke({ id, expectedRevision });
|
|
605
|
+
if (options.json) {
|
|
606
|
+
console.log(JSON.stringify({ record }, null, 2));
|
|
607
|
+
return;
|
|
608
|
+
}
|
|
609
|
+
logger.log(
|
|
610
|
+
chalk.green(
|
|
611
|
+
`Revoked ${record.id} at revision ${record.revision} (${record.rule})`,
|
|
612
|
+
),
|
|
613
|
+
);
|
|
614
|
+
} catch (err) {
|
|
615
|
+
logger.error(chalk.red(`permissions revoke failed: ${err.message}`));
|
|
616
|
+
process.exitCode = 1;
|
|
617
|
+
}
|
|
618
|
+
});
|
|
395
619
|
}
|