chainlesschain 0.163.7 → 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 +5 -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-axqQfwv8.js → AIOps-D2MEn7fI.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DV-Ro0By.js → ActionButton-lCW_4Gf0.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-Bt72WEVu.js → Analytics-Bs7i-nsS.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-BtepG55E.js → AppLayout-CK7B6S_j.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-B7KaJ7S_.js → Artifacts-C8ILjpyo.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-FNFaUg7A.js → Audit-Bb9cNaWc.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DFb6J2wQ.js → BackgroundAgents-sC9ooXIf.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CC7YBhyj.js → Backup-D-DrsplT.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-RkgTNVtj.js → BaseInput-uCNZpwSK.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-hHEmGZy-.js → Chat-CsDK1uE9.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CAP9YhHv.js → ChatBubbleRenderer-OqSDt50w.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-z5wXOQP1.js → Checkbox-JhTXM1-K.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DVaDJnxy.js → Codegen-BbzZLnyD.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CJmaRDR5.js → Col-D4VW4m4j.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DF29_2bI.js → Community-BXrYawxV.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DtkQkBzn.js → Compact-DCihGy1u.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-xoHDxp7I.js → Compliance-DlyZ-lk8.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BUm-R7ht.js → Cowork-DvGZrhbO.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-Cgl14ZkB.js → Cron-DUncZi8h.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BNcbmoqh.js → Crosschain-C_hLuUcm.js} +1 -1
- package/src/assets/web-panel/assets/{DID-Bwja0Zo9.js → DID-b6YSUqxr.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-Bk5XjEdJ.js → Dashboard-uvM15Cfb.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-Ci36Oitq.js → Dropdown-D1-Nd4qY.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer--U04ZN4q.js → EmailListRenderer-8ApvL6Zc.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-B2gNPR2s.js → FamilyGuardDashboard-LYJt8811.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-C4KghYn7.js → Federation-BbI3HGpv.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-QL7x_Q_0.js → FormItemContext-DSoEKuFu.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-F3Ryltwm.js → GenericCardRenderer-B0S9OWd5.js} +1 -1
- package/src/assets/web-panel/assets/{Git-2HassK5k.js → Git-DIs9Zhf3.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DoBIp7oe.js → Governance-jzZXrxcl.js} +1 -1
- package/src/assets/web-panel/assets/{Inference--W01QhZ-.js → Inference-JUPjf2ZI.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DmvwqGpT.js → KnowledgeGraph-DxnfJvlP.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BBJ4yAel.js → Logs-iXiz8BEE.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-BLCZMzhJ.js → MarkdownRenderer-GmB6DOr6.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-D5lNngSI.js → Marketplace-Y3Xch312.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CkEVOMKH.js → McpTools-D7kGGbO7.js} +4 -4
- package/src/assets/web-panel/assets/{Memory-B1Ow1xVE.js → Memory-Do_hVxzh.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-SgYbUfb6.js → MobileBridge-CtrR0Tas.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-BL0Czcoj.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-DcTXSSma.js → Mtc-qo5QCTGd.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-Dt3WG4oj.js → MtcAudit-cq5mnjYj.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-B9B38UZx.js → Multisig-Bq0MAQHw.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-B0S4GGvG.js → NLProgramming-DdWE6Vi2.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DZ5U58Ng.js → Notes-BxMBFcIp.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-PjL5ZW34.js → NotificationSettings-RTrAcbUe.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DrAX2ESt.js → OrderTableRenderer-DJbpGqzT.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-Cv1GYs-c.js → Organization-SQzIPdqC.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Bbkp_PL3.js → Overflow-02yECh22.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BD8QUgoZ.js → P2P-BNg4pNCM.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-BO-2PeaB.js → PdhVaultBrowser-BxPJZsD3.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-D_OPVa02.js → Permissions-CLnDnPAz.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-mh-pEmaB.js → PersonalDataHub-C5m0AjGf.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-6JC2EDdb.js → Pipeline-VwOf5Dhv.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CUshzUAG.js → Privacy-CC0W2hZd.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Cs2Aalri.js → ProjectInit-Dz893Bob.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-1ak49tcj.js → ProjectSettings-CxQkvl0k.js} +2 -2
- package/src/assets/web-panel/assets/Projects-DDAjkUkT.js +1 -0
- package/src/assets/web-panel/assets/{Providers-CXXxvafH.js → Providers-DeB9IkxK.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-PTcDsF58.js → QrScannerModal-OCeoaswn.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CDwucrJw.js → QuickAsk-DenotaAj.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CJlLVRXR.js → Recommend-Cies_jjI.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DlN-ETsO.js → RemoteSession-Dxzl5n2T.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-DI23LR6m.js → Reputation-CW0mvxgZ.js} +1 -1
- package/src/assets/web-panel/assets/{Row-Cl7UQMrM.js → Row-SEd32qZU.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CexHNfh8.js → RssFeed-BSwnJ3Lm.js} +3 -3
- package/src/assets/web-panel/assets/{Search-BneBWvRN.js → Search-xe2m8bkC.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DX7Phgrp.js → Security-Mq2F9Nro.js} +4 -4
- package/src/assets/web-panel/assets/{Services-BWXO8Mte.js → Services-BKGw2V3P.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DCyOjKPJ.js → Skeleton-DW95-Rxf.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CXqERsTB.js → Skills-CHgChCv_.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-bhbrbz8E.js → Sla-tKh6k3R7.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-3IPU0HBZ.js → SpeechSettings-D6UL3dA5.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DBNTQLbM.js → SyncSettings-D0Fw8fVL.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-quP0bkN-.js → Tasks-20x1GB3D.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-BouWmgho.js → Templates-DJ-lts-a.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-qv0D9s7z.js → Tenant-BFdGpbs7.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BxvbE8BB.js → Terminal-Xpx61vHL.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-D-IeLnJ2.js → TimelineRenderer-C6UIvyZQ.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CFMKKyVG.js → Tokens-Dellq08f.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-L8as3UuJ.js → Trigger-VKw8d0J-.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-MxmA4VZG.js → Trust-DNftdKT5.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-C0VvJYRi.js → UkeySign-DX9VAKJI.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-Bf5QZj8N.js → VideoEditing-B2h3jO8q.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BIJ9riRz.js → Wallet-CjGkof7f.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-B8p9Mhkw.js → WebAuthn-2Zfcu55P.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-BVsuaPen.js → WorkflowEditor-B9eZ8UxZ.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BfkjoKpV.js → chat-CQNfD-YO.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DeAlsWK8.js → colors-D4usyFT2.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-Cs97bz5j.js → compact-item-s4TpjvjX.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BqbG60LH.js → createContext-BRCSvYxj.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DKJjSWRn.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-i_RY0b1X.js → hasIn-AdkUbkV-.js} +1 -1
- package/src/assets/web-panel/assets/{index-BOVkf1K3.js → index--00U6vXZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-B-3tEpTc.js → index-B2V-eKfK.js} +1 -1
- package/src/assets/web-panel/assets/{index-D2B4VPyP.js → index-B4JJCfQ2.js} +1 -1
- package/src/assets/web-panel/assets/{index-BkBi5TmC.js → index-BIoG5yYf.js} +1 -1
- package/src/assets/web-panel/assets/{index-79V_zv1s.js → index-BMcimU-2.js} +1 -1
- package/src/assets/web-panel/assets/{index-U4f5izHz.js → index-BPhkFZ1I.js} +1 -1
- package/src/assets/web-panel/assets/{index-DiSkx4UB.js → index-BQ3DXBtD.js} +3 -3
- package/src/assets/web-panel/assets/{index-dIHr4B_u.js → index-Bad4VNvz.js} +1 -1
- package/src/assets/web-panel/assets/{index-CIG8fQ2_.js → index-BgiXR_-_.js} +1 -1
- package/src/assets/web-panel/assets/{index-DqBgBpgp.js → index-BtobShro.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZxO_-E8a.js → index-Bw2MEnUk.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUUrv141.js → index-C1mJtE6q.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bm7lLR4c.js → index-C484EJiS.js} +1 -1
- package/src/assets/web-panel/assets/{index-COdGA-8n.js → index-C5KAQFPQ.js} +1 -1
- package/src/assets/web-panel/assets/index-C61cnl3K.js +1 -0
- package/src/assets/web-panel/assets/{index-CED2PL_y.js → index-C7Y8Aluc.js} +1 -1
- package/src/assets/web-panel/assets/{index-YXgLng0K.js → index-CCsM_Ybx.js} +1 -1
- package/src/assets/web-panel/assets/{index-0-agYlWL.js → index-CJCFe2Qf.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5UkyA3c.js → index-CJVEOa4i.js} +1 -1
- package/src/assets/web-panel/assets/{index-B1CbOH1i.js → index-CJdQrZth.js} +1 -1
- package/src/assets/web-panel/assets/{index-s1opAL-M.js → index-CKC1t3Ic.js} +1 -1
- package/src/assets/web-panel/assets/{index-yObj1O4n.js → index-CQhAVU5t.js} +1 -1
- package/src/assets/web-panel/assets/{index-CgsqdnRV.js → index-CYdoQsa1.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dk7-v4hP.js → index-Cduu2Hhr.js} +1 -1
- package/src/assets/web-panel/assets/{index-B-JVTrpr.js → index-CkwiSLhU.js} +1 -1
- package/src/assets/web-panel/assets/{index-CeWoNHau.js → index-Cvyt-zhm.js} +1 -1
- package/src/assets/web-panel/assets/{index-CE2VtTlp.js → index-D2GjI2oe.js} +1 -1
- package/src/assets/web-panel/assets/index-D4XFHxBr.js +1 -0
- package/src/assets/web-panel/assets/{index-DmbfhJUP.js → index-DARsAyUp.js} +1 -1
- package/src/assets/web-panel/assets/{index-BESLFt4q.js → index-DVKfQ0Ux.js} +1 -1
- package/src/assets/web-panel/assets/{index-PT_5sBMA.js → index-DZT36ZYq.js} +1 -1
- package/src/assets/web-panel/assets/{index-gyFpvL7l.js → index-D_XBHopw.js} +1 -1
- package/src/assets/web-panel/assets/{index-BYUVuwKt.js → index-DdCB70SS.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcUXAB2s.js → index-DzRjHxEv.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dk2qouAz.js → index-MMN9V6JF.js} +1 -1
- package/src/assets/web-panel/assets/{index-D9evtvg2.js → index-RfMr79MW.js} +1 -1
- package/src/assets/web-panel/assets/{index-BuLQobzW.js → index-_IRVsV9X.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cf3WCLmy.js → index-nXyk8GZ9.js} +1 -1
- package/src/assets/web-panel/assets/{index-CG3PRyAL.js → index-s_buFMEG.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-C9h9yKL3.js → initDefaultProps-Blmpk7HL.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BvmLsPdu.js → motion-DPBJMv1n.js} +1 -1
- package/src/assets/web-panel/assets/{move-CoL4ekU1.js → move-ButdzCM7.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-C4pMy6xV.js → mtc-parser-cyRC_QCe.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DPuJfNxx.js → omit-1epSV7hz.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-D0KEeaK2.js → pickAttrs-DuPY8xJs.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BpkyINxt.js → placementArrow-6XZqarhe.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DQI_wOq8.js → responsiveObserve-B40pXBWM.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DYfdDiRg.js → slide-jbZ9Wu4n.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-B5dtvb0D.js → statusUtils-BKQQcVy4.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CF310mSj.js → styleChecker-NiKfWjUT.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-D1Qp4BLp.js → useFlexGapSupport-bQUCvPeb.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-C7_iyvJK.js → useFs-CUGji7ph.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DZUt_fIm.js → usePersonalDataHub-4veyN2N2.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-D3dsi0lZ.js → vnode-1-nLug-Z.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-WdbOlvdQ.js → zoom-dhCeRDMo.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +6 -6
- package/src/commands/automation.js +103 -1
- 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/commands/team-merge-review.js +937 -0
- package/src/commands/team.js +2 -0
- package/src/data/changelog.json +27 -1
- 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/agent-schedule-store.js +139 -28
- package/src/lib/agent-team/team-merge-review-store.js +765 -0
- package/src/lib/agent-team/team-merge-review-transaction.js +1223 -0
- package/src/lib/agent-team/team-merge-review.js +1847 -0
- package/src/lib/automation-center-incidents.js +314 -0
- package/src/lib/automation-center-runtime.js +448 -0
- package/src/lib/automation-center.js +182 -38
- package/src/lib/automation-engine.js +41 -0
- package/src/lib/automation-execution-authority.js +241 -12
- package/src/lib/automation-execution-incident.js +737 -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-cron.js +85 -14
- 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/scheduler-kernel/agenda-adapter.js +17 -7
- package/src/lib/scheduler-kernel/automation-adapter.js +105 -11
- package/src/lib/scheduler-kernel/automation-event-adapter.js +87 -11
- package/src/lib/scheduler-kernel/contract.js +91 -0
- package/src/lib/scheduler-kernel/cowork-cron-adapter.js +12 -1
- package/src/lib/scheduler-kernel/loop-adapter.js +7 -1
- package/src/lib/scheduler-kernel/routine-adapter.js +7 -1
- package/src/lib/scheduler-kernel/runtime-control-capabilities.js +31 -0
- package/src/lib/scheduler-kernel/runtime.js +176 -3
- package/src/lib/scheduler-kernel/store.js +1253 -45
- 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 +93 -3
- package/src/runtime/headless-runner.js +30 -25
- package/src/runtime/headless-stream.js +32 -25
- package/src/runtime/mcp-config.js +81 -10
- 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/MobileProjects-BWdOvQAj.js +0 -1
- package/src/assets/web-panel/assets/Projects-BV4oApsm.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DPty0mGN.js +0 -1
- package/src/assets/web-panel/assets/index-Bt7g0Vq_.js +0 -1
- package/src/assets/web-panel/assets/index-ChVT0p9u.js +0 -1
package/src/lib/ide-context.js
CHANGED
|
@@ -72,6 +72,14 @@ export function hasIdeTerminalTool(mcp) {
|
|
|
72
72
|
);
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
+
/** Does this MCP surface expose the fixed-budget Context Center projection? */
|
|
76
|
+
export function hasIdeContextCenterTool(mcp) {
|
|
77
|
+
return !!(
|
|
78
|
+
mcp?.mcpClient?.callTool &&
|
|
79
|
+
mcp.externalToolExecutors?.mcp__ide__getContextCenter?.kind === "mcp"
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
|
|
75
83
|
/**
|
|
76
84
|
* Read an MCP tools/call result's first text block as JSON. The IDE bridge
|
|
77
85
|
* servers always wrap handler data as
|
|
@@ -756,15 +764,18 @@ const WORKSPACE_DIAG_CAP = 50;
|
|
|
756
764
|
const TERMINAL_MENTION_LIMIT = 5;
|
|
757
765
|
/** And a roomier per-command output cap, since the user asked for it. */
|
|
758
766
|
const TERMINAL_MENTION_OUTPUT_CAP = 2000;
|
|
767
|
+
/** Explicit @context uses the shared deterministic Context Center budget. */
|
|
768
|
+
const CONTEXT_MENTION_TOKEN_BUDGET = 4096;
|
|
759
769
|
|
|
760
|
-
//
|
|
761
|
-
//
|
|
762
|
-
//
|
|
763
|
-
const IDE_MENTION_RE =
|
|
770
|
+
// IDE pseudo-mentions preceded by start / whitespace / opening bracket-quote
|
|
771
|
+
// (so `foo@selection` and email-like text never match), each taken as a whole
|
|
772
|
+
// word.
|
|
773
|
+
const IDE_MENTION_RE =
|
|
774
|
+
/(^|[\s("'`[{])@(selection|diagnostics|terminal|context)\b/gi;
|
|
764
775
|
|
|
765
776
|
/**
|
|
766
777
|
* Unique IDE pseudo-mentions in the text, in first-seen order. Returns a
|
|
767
|
-
* subset of `["selection", "diagnostics", "terminal"]`.
|
|
778
|
+
* subset of `["selection", "diagnostics", "terminal", "context"]`.
|
|
768
779
|
*/
|
|
769
780
|
export function findIdeMentions(text) {
|
|
770
781
|
const src = typeof text === "string" ? text : "";
|
|
@@ -870,7 +881,64 @@ export function formatTerminalMention(data) {
|
|
|
870
881
|
}
|
|
871
882
|
|
|
872
883
|
/**
|
|
873
|
-
*
|
|
884
|
+
* Render the versioned Context Center projection for an explicit `@context`.
|
|
885
|
+
* The bridge already applies the fixed content budget; this formatter keeps a
|
|
886
|
+
* strict field allowlist and redacts secret-shaped text before prompt injection.
|
|
887
|
+
*/
|
|
888
|
+
export function formatContextCenterMention(data, opts = {}) {
|
|
889
|
+
if (
|
|
890
|
+
data?.schema !== "cc-context-center/v1" ||
|
|
891
|
+
!Array.isArray(data.chips) ||
|
|
892
|
+
data.chips.length === 0
|
|
893
|
+
) {
|
|
894
|
+
return null;
|
|
895
|
+
}
|
|
896
|
+
const env = opts.env || process.env;
|
|
897
|
+
const chips = data.chips
|
|
898
|
+
.slice(0, 64)
|
|
899
|
+
.filter((chip) => chip && typeof chip === "object")
|
|
900
|
+
.map((chip) => ({
|
|
901
|
+
id: String(chip.id || ""),
|
|
902
|
+
kind: String(chip.kind || ""),
|
|
903
|
+
label: String(chip.label || ""),
|
|
904
|
+
source: String(chip.source || ""),
|
|
905
|
+
scope: String(chip.scope || ""),
|
|
906
|
+
freshness:
|
|
907
|
+
chip.freshness && typeof chip.freshness === "object"
|
|
908
|
+
? chip.freshness
|
|
909
|
+
: null,
|
|
910
|
+
range: chip.range && typeof chip.range === "object" ? chip.range : null,
|
|
911
|
+
estimatedTokens: Number(chip.estimatedTokens) || 0,
|
|
912
|
+
allocatedTokens: Number(chip.allocatedTokens) || 0,
|
|
913
|
+
status: String(chip.status || ""),
|
|
914
|
+
pinned: chip.pinned === true,
|
|
915
|
+
refreshable: chip.refreshable !== false,
|
|
916
|
+
reason: String(chip.reason || ""),
|
|
917
|
+
content: redactSecretsInText(String(chip.content || ""), { env }),
|
|
918
|
+
contentTruncated: chip.contentTruncated === true,
|
|
919
|
+
}));
|
|
920
|
+
if (chips.length === 0) return null;
|
|
921
|
+
const payload = {
|
|
922
|
+
schema: data.schema,
|
|
923
|
+
workspaceId: typeof data.workspaceId === "string" ? data.workspaceId : null,
|
|
924
|
+
selectionAlgorithm: String(data.selectionAlgorithm || ""),
|
|
925
|
+
budget: data.budget && typeof data.budget === "object" ? data.budget : null,
|
|
926
|
+
chips,
|
|
927
|
+
};
|
|
928
|
+
const json = JSON.stringify(payload, null, 2).replace(
|
|
929
|
+
/<\/ide-context-center/gi,
|
|
930
|
+
"<\\/ide-context-center",
|
|
931
|
+
);
|
|
932
|
+
return (
|
|
933
|
+
'<ide-context-center note="referenced via @context — deterministic live IDE context">\n' +
|
|
934
|
+
json +
|
|
935
|
+
"\n</ide-context-center>"
|
|
936
|
+
);
|
|
937
|
+
}
|
|
938
|
+
|
|
939
|
+
/**
|
|
940
|
+
* Expand `@selection` / `@diagnostics` / `@terminal` / `@context` mentions
|
|
941
|
+
* found in `text`
|
|
874
942
|
* against the connected IDE. Returns
|
|
875
943
|
* { block: string|null, expanded: string[], warnings: string[] }
|
|
876
944
|
* where `block` is the concatenated context block(s) to APPEND to the user
|
|
@@ -958,6 +1026,26 @@ export async function expandIdeMentions(text, mcp, opts = {}) {
|
|
|
958
1026
|
} else {
|
|
959
1027
|
out.warnings.push("@terminal — no recent commands (left as-is)");
|
|
960
1028
|
}
|
|
1029
|
+
} else if (kind === "context") {
|
|
1030
|
+
if (!hasIdeContextCenterTool(mcp)) {
|
|
1031
|
+
out.warnings.push(
|
|
1032
|
+
"@context — no IDE bridge / Context Center support (left as-is)",
|
|
1033
|
+
);
|
|
1034
|
+
continue;
|
|
1035
|
+
}
|
|
1036
|
+
const data = await callIdeToolJson(
|
|
1037
|
+
mcp,
|
|
1038
|
+
"mcp__ide__getContextCenter",
|
|
1039
|
+
{ budgetTokens: CONTEXT_MENTION_TOKEN_BUDGET },
|
|
1040
|
+
Math.max(timeoutMs, 6000),
|
|
1041
|
+
);
|
|
1042
|
+
const b = formatContextCenterMention(data, { env });
|
|
1043
|
+
if (b) {
|
|
1044
|
+
blocks.push(b);
|
|
1045
|
+
out.expanded.push("context");
|
|
1046
|
+
} else {
|
|
1047
|
+
out.warnings.push("@context — no live context chips (left as-is)");
|
|
1048
|
+
}
|
|
961
1049
|
}
|
|
962
1050
|
} catch {
|
|
963
1051
|
// best-effort: a single failed mention never blocks the turn
|
|
@@ -36,9 +36,9 @@ export const MCP_STDIO_PACKAGE_MATERIALIZATION_CHANGED_CODE =
|
|
|
36
36
|
"CC_MCP_STDIO_PACKAGE_MATERIALIZATION_CHANGED";
|
|
37
37
|
|
|
38
38
|
const MATERIALIZATION_SCHEMA =
|
|
39
|
-
"chainlesschain.mcp-stdio-package-materialization/
|
|
40
|
-
const MATERIALIZATION_VERSION =
|
|
41
|
-
const CAPSULE_SCHEMA = "chainlesschain.mcp-stdio-node-capsule/
|
|
39
|
+
"chainlesschain.mcp-stdio-package-materialization/v5";
|
|
40
|
+
const MATERIALIZATION_VERSION = 5;
|
|
41
|
+
const CAPSULE_SCHEMA = "chainlesschain.mcp-stdio-node-capsule/v4";
|
|
42
42
|
const CAPSULE_RELATIVE_PATH = "capsule/server.cjs";
|
|
43
43
|
const CAPSULE_BUILDER = "esbuild-wasm";
|
|
44
44
|
const CAPSULE_BUILDER_VERSION = "0.28.1";
|
|
@@ -64,6 +64,25 @@ const CAPSULE_RESOLVER_SHA256 =
|
|
|
64
64
|
const CAPSULE_RESOLVER_BYTES = 24_417;
|
|
65
65
|
const CAPSULE_STDIN_WRAPPER_SCHEMA =
|
|
66
66
|
"chainlesschain.mcp-stdio-capsule-stdin-wrapper/v1";
|
|
67
|
+
const CAPSULE_BUILTIN_POLICY_SCHEMA =
|
|
68
|
+
"chainlesschain.mcp-stdio-static-builtin-policy/v2";
|
|
69
|
+
const CAPSULE_EXECUTION_CONTEXT_ISOLATION =
|
|
70
|
+
"required-mcp-os-sandbox-boundaries-v1";
|
|
71
|
+
// These builtins can create a fresh JavaScript isolate/process or evaluate
|
|
72
|
+
// code through a privileged runtime surface. Same-realm Module guards do not
|
|
73
|
+
// propagate there, so their presence is bound explicitly to the capsule
|
|
74
|
+
// manifest and is admissible only through the product's mandatory
|
|
75
|
+
// filesystem/network/process-tree/code-snapshot OS sandbox contract.
|
|
76
|
+
const CAPSULE_EXECUTION_CONTEXT_BUILTINS = new Set([
|
|
77
|
+
"child_process",
|
|
78
|
+
"cluster",
|
|
79
|
+
"inspector",
|
|
80
|
+
"inspector/promises",
|
|
81
|
+
"vm",
|
|
82
|
+
"worker_threads",
|
|
83
|
+
]);
|
|
84
|
+
const CAPSULE_BUILTIN_ALLOWLIST_MARKER =
|
|
85
|
+
"__CHAINLESSCHAIN_MCP_STATIC_BUILTIN_ALLOWLIST_8F43C70E__";
|
|
67
86
|
const INDEX_LABEL = "MCP stdio package materialization index";
|
|
68
87
|
const MANIFEST_LABEL = "MCP stdio package materialization manifest";
|
|
69
88
|
const MAX_FILES = 10_000;
|
|
@@ -128,7 +147,7 @@ export function getMcpStdioPackageMaterializationRoot(options = {}) {
|
|
|
128
147
|
return path.resolve(
|
|
129
148
|
options.root ||
|
|
130
149
|
process.env.CC_MCP_PACKAGE_MATERIALIZATION_ROOT ||
|
|
131
|
-
path.join(getCacheDir(), "mcp-stdio-package-materializations-
|
|
150
|
+
path.join(getCacheDir(), "mcp-stdio-package-materializations-v5"),
|
|
132
151
|
);
|
|
133
152
|
}
|
|
134
153
|
|
|
@@ -138,7 +157,7 @@ export function getMcpStdioPackageMaterializationIndexPath(options = {}) {
|
|
|
138
157
|
process.env.CC_MCP_PACKAGE_MATERIALIZATION_INDEX ||
|
|
139
158
|
path.join(
|
|
140
159
|
getMachineSecurityAnchorDir(),
|
|
141
|
-
"mcp-stdio-package-materializations-
|
|
160
|
+
"mcp-stdio-package-materializations-v5.json",
|
|
142
161
|
),
|
|
143
162
|
);
|
|
144
163
|
}
|
|
@@ -1036,20 +1055,32 @@ async function runCapsuleBuilderWorker({
|
|
|
1036
1055
|
function capsuleRuntimeGuard() {
|
|
1037
1056
|
return `;(() => {
|
|
1038
1057
|
const Module = require("node:module");
|
|
1039
|
-
const
|
|
1058
|
+
const known = new Set(Module.builtinModules.flatMap((name) => [name, name.startsWith("node:") ? name : "node:" + name]));
|
|
1059
|
+
const allowed = new Set(${CAPSULE_BUILTIN_ALLOWLIST_MARKER});
|
|
1040
1060
|
const originalLoad = Module._load;
|
|
1041
1061
|
const originalResolveFilename = Module._resolveFilename;
|
|
1042
1062
|
const blocked = (kind, request) => {
|
|
1043
1063
|
const error = new Error("MCP stdio capsule blocked " + kind + (request === undefined ? "" : ": " + String(request)));
|
|
1044
|
-
error.code = kind === "native module loading"
|
|
1064
|
+
error.code = kind === "native module loading"
|
|
1065
|
+
? "CC_MCP_STDIO_NATIVE_MODULE_BLOCKED"
|
|
1066
|
+
: kind === "builtin module loading" || kind === "internal binding loading"
|
|
1067
|
+
? "CC_MCP_STDIO_BUILTIN_MODULE_BLOCKED"
|
|
1068
|
+
: "CC_MCP_STDIO_EXTERNAL_MODULE_BLOCKED";
|
|
1045
1069
|
throw error;
|
|
1046
1070
|
};
|
|
1071
|
+
const assertAllowedModule = (kind, request) => {
|
|
1072
|
+
if (typeof request !== "string") blocked(kind, request);
|
|
1073
|
+
if (known.has(request) && !allowed.has(request)) {
|
|
1074
|
+
blocked("builtin module loading", request);
|
|
1075
|
+
}
|
|
1076
|
+
if (!known.has(request)) blocked(kind, request);
|
|
1077
|
+
};
|
|
1047
1078
|
Object.defineProperty(Module, "_load", {
|
|
1048
1079
|
configurable: false,
|
|
1049
1080
|
enumerable: false,
|
|
1050
1081
|
writable: false,
|
|
1051
1082
|
value: function(request) {
|
|
1052
|
-
|
|
1083
|
+
assertAllowedModule("external module loading", request);
|
|
1053
1084
|
return Reflect.apply(originalLoad, this, arguments);
|
|
1054
1085
|
},
|
|
1055
1086
|
});
|
|
@@ -1058,10 +1089,33 @@ function capsuleRuntimeGuard() {
|
|
|
1058
1089
|
enumerable: false,
|
|
1059
1090
|
writable: false,
|
|
1060
1091
|
value: function(request) {
|
|
1061
|
-
|
|
1092
|
+
assertAllowedModule("external module resolution", request);
|
|
1062
1093
|
return Reflect.apply(originalResolveFilename, this, arguments);
|
|
1063
1094
|
},
|
|
1064
1095
|
});
|
|
1096
|
+
if (typeof process.getBuiltinModule === "function") {
|
|
1097
|
+
const originalGetBuiltinModule = process.getBuiltinModule;
|
|
1098
|
+
Object.defineProperty(process, "getBuiltinModule", {
|
|
1099
|
+
configurable: false,
|
|
1100
|
+
enumerable: false,
|
|
1101
|
+
writable: false,
|
|
1102
|
+
value: function(request) {
|
|
1103
|
+
if (typeof request !== "string" || !allowed.has(request)) {
|
|
1104
|
+
blocked("builtin module loading", request);
|
|
1105
|
+
}
|
|
1106
|
+
return Reflect.apply(originalGetBuiltinModule, this, arguments);
|
|
1107
|
+
},
|
|
1108
|
+
});
|
|
1109
|
+
}
|
|
1110
|
+
for (const bindingName of ["binding", "_linkedBinding"]) {
|
|
1111
|
+
if (typeof process[bindingName] !== "function") continue;
|
|
1112
|
+
Object.defineProperty(process, bindingName, {
|
|
1113
|
+
configurable: false,
|
|
1114
|
+
enumerable: false,
|
|
1115
|
+
writable: false,
|
|
1116
|
+
value: function(request) { blocked("internal binding loading", request); },
|
|
1117
|
+
});
|
|
1118
|
+
}
|
|
1065
1119
|
Object.defineProperty(process, "dlopen", {
|
|
1066
1120
|
configurable: false,
|
|
1067
1121
|
enumerable: false,
|
|
@@ -1071,6 +1125,54 @@ function capsuleRuntimeGuard() {
|
|
|
1071
1125
|
})();`;
|
|
1072
1126
|
}
|
|
1073
1127
|
|
|
1128
|
+
function expandBuiltinAllowlist(externalBuiltins) {
|
|
1129
|
+
const allowed = new Set();
|
|
1130
|
+
for (const name of externalBuiltins) {
|
|
1131
|
+
const canonical = name.startsWith("node:") ? name.slice(5) : name;
|
|
1132
|
+
allowed.add(canonical);
|
|
1133
|
+
allowed.add(`node:${canonical}`);
|
|
1134
|
+
}
|
|
1135
|
+
return Object.freeze([...allowed].sort());
|
|
1136
|
+
}
|
|
1137
|
+
|
|
1138
|
+
function executionContextBuiltins(externalBuiltins) {
|
|
1139
|
+
return Object.freeze(
|
|
1140
|
+
[
|
|
1141
|
+
...new Set(
|
|
1142
|
+
externalBuiltins
|
|
1143
|
+
.map((name) => (name.startsWith("node:") ? name.slice(5) : name))
|
|
1144
|
+
.filter((name) => CAPSULE_EXECUTION_CONTEXT_BUILTINS.has(name))
|
|
1145
|
+
.map((name) => `node:${name}`),
|
|
1146
|
+
),
|
|
1147
|
+
].sort(),
|
|
1148
|
+
);
|
|
1149
|
+
}
|
|
1150
|
+
|
|
1151
|
+
function bindCapsuleBuiltinAllowlist(outputBytes, allowedBuiltins) {
|
|
1152
|
+
const source = Buffer.from(
|
|
1153
|
+
outputBytes.buffer,
|
|
1154
|
+
outputBytes.byteOffset,
|
|
1155
|
+
outputBytes.byteLength,
|
|
1156
|
+
).toString("utf8");
|
|
1157
|
+
const markerCount = source.split(CAPSULE_BUILTIN_ALLOWLIST_MARKER).length - 1;
|
|
1158
|
+
if (markerCount !== 1) {
|
|
1159
|
+
throw new Error(
|
|
1160
|
+
"MCP capsule output did not retain exactly one host builtin-policy marker",
|
|
1161
|
+
);
|
|
1162
|
+
}
|
|
1163
|
+
const output = Buffer.from(
|
|
1164
|
+
source.replace(
|
|
1165
|
+
CAPSULE_BUILTIN_ALLOWLIST_MARKER,
|
|
1166
|
+
JSON.stringify(allowedBuiltins),
|
|
1167
|
+
),
|
|
1168
|
+
"utf8",
|
|
1169
|
+
);
|
|
1170
|
+
if (output.length <= 0 || output.length > MAX_CAPSULE_BYTES) {
|
|
1171
|
+
throw new Error("MCP capsule output exceeds its post-policy byte limit");
|
|
1172
|
+
}
|
|
1173
|
+
return output;
|
|
1174
|
+
}
|
|
1175
|
+
|
|
1074
1176
|
export function esbuildRelativeEntrypointArg(
|
|
1075
1177
|
entrypointRelative,
|
|
1076
1178
|
canonicalSnapshotRoot,
|
|
@@ -1318,11 +1420,14 @@ async function buildCapsule({
|
|
|
1318
1420
|
}
|
|
1319
1421
|
}
|
|
1320
1422
|
|
|
1321
|
-
const
|
|
1322
|
-
|
|
1323
|
-
result.output.byteOffset,
|
|
1324
|
-
result.output.byteLength,
|
|
1423
|
+
const normalizedExternalBuiltins = Object.freeze(
|
|
1424
|
+
[...new Set(externalBuiltins)].sort(),
|
|
1325
1425
|
);
|
|
1426
|
+
const allowedBuiltins = expandBuiltinAllowlist(normalizedExternalBuiltins);
|
|
1427
|
+
const transitiveBuiltins = executionContextBuiltins(
|
|
1428
|
+
normalizedExternalBuiltins,
|
|
1429
|
+
);
|
|
1430
|
+
const output = bindCapsuleBuiltinAllowlist(result.output, allowedBuiltins);
|
|
1326
1431
|
let descriptor;
|
|
1327
1432
|
try {
|
|
1328
1433
|
descriptor = _deps.fs.openSync(
|
|
@@ -1388,7 +1493,17 @@ async function buildCapsule({
|
|
|
1388
1493
|
nodeTarget: "node22",
|
|
1389
1494
|
inputCount: inputs.length,
|
|
1390
1495
|
inputDigest: sha256(canonicalJson(inputs)),
|
|
1391
|
-
externalBuiltins:
|
|
1496
|
+
externalBuiltins: normalizedExternalBuiltins,
|
|
1497
|
+
builtinPolicy: Object.freeze({
|
|
1498
|
+
schema: CAPSULE_BUILTIN_POLICY_SCHEMA,
|
|
1499
|
+
mode: "static-external-only",
|
|
1500
|
+
allowedBuiltins,
|
|
1501
|
+
executionContextBuiltins: transitiveBuiltins,
|
|
1502
|
+
transitiveIsolation:
|
|
1503
|
+
transitiveBuiltins.length > 0
|
|
1504
|
+
? CAPSULE_EXECUTION_CONTEXT_ISOLATION
|
|
1505
|
+
: "not-required",
|
|
1506
|
+
}),
|
|
1392
1507
|
});
|
|
1393
1508
|
}
|
|
1394
1509
|
|
|
@@ -1446,6 +1561,22 @@ function validateManifest(manifest) {
|
|
|
1446
1561
|
manifest.capsule.externalBuiltins.some(
|
|
1447
1562
|
(name) => typeof name !== "string" || !NODE_BUILTINS.has(name),
|
|
1448
1563
|
) ||
|
|
1564
|
+
manifest.capsule?.builtinPolicy?.schema !== CAPSULE_BUILTIN_POLICY_SCHEMA ||
|
|
1565
|
+
manifest.capsule?.builtinPolicy?.mode !== "static-external-only" ||
|
|
1566
|
+
!Array.isArray(manifest.capsule?.builtinPolicy?.allowedBuiltins) ||
|
|
1567
|
+
manifest.capsule.builtinPolicy.allowedBuiltins.some(
|
|
1568
|
+
(name) => typeof name !== "string" || !NODE_BUILTINS.has(name),
|
|
1569
|
+
) ||
|
|
1570
|
+
!Array.isArray(manifest.capsule?.builtinPolicy?.executionContextBuiltins) ||
|
|
1571
|
+
manifest.capsule.builtinPolicy.executionContextBuiltins.some(
|
|
1572
|
+
(name) =>
|
|
1573
|
+
typeof name !== "string" ||
|
|
1574
|
+
!name.startsWith("node:") ||
|
|
1575
|
+
!CAPSULE_EXECUTION_CONTEXT_BUILTINS.has(name.slice(5)),
|
|
1576
|
+
) ||
|
|
1577
|
+
!["not-required", CAPSULE_EXECUTION_CONTEXT_ISOLATION].includes(
|
|
1578
|
+
manifest.capsule?.builtinPolicy?.transitiveIsolation,
|
|
1579
|
+
) ||
|
|
1449
1580
|
!Array.isArray(manifest.files) ||
|
|
1450
1581
|
!Number.isSafeInteger(manifest.fileCount) ||
|
|
1451
1582
|
!Number.isSafeInteger(manifest.totalBytes) ||
|
|
@@ -1464,6 +1595,18 @@ function validateManifest(manifest) {
|
|
|
1464
1595
|
manifest.capsule.inputCount > manifest.fileCount ||
|
|
1465
1596
|
canonicalJson(manifest.capsule.externalBuiltins) !==
|
|
1466
1597
|
canonicalJson([...new Set(manifest.capsule.externalBuiltins)].sort()) ||
|
|
1598
|
+
canonicalJson(manifest.capsule.builtinPolicy.allowedBuiltins) !==
|
|
1599
|
+
canonicalJson(
|
|
1600
|
+
expandBuiltinAllowlist(manifest.capsule.externalBuiltins),
|
|
1601
|
+
) ||
|
|
1602
|
+
canonicalJson(manifest.capsule.builtinPolicy.executionContextBuiltins) !==
|
|
1603
|
+
canonicalJson(
|
|
1604
|
+
executionContextBuiltins(manifest.capsule.externalBuiltins),
|
|
1605
|
+
) ||
|
|
1606
|
+
manifest.capsule.builtinPolicy.transitiveIsolation !==
|
|
1607
|
+
(manifest.capsule.builtinPolicy.executionContextBuiltins.length > 0
|
|
1608
|
+
? CAPSULE_EXECUTION_CONTEXT_ISOLATION
|
|
1609
|
+
: "not-required") ||
|
|
1467
1610
|
sha256(canonicalJson(manifest.files)) !== manifest.closureDigest
|
|
1468
1611
|
) {
|
|
1469
1612
|
throw materializationError(
|
|
@@ -1591,6 +1734,15 @@ function verifyPublishedGeneration(root, record, expectedFingerprint) {
|
|
|
1591
1734
|
capsule: Object.freeze({
|
|
1592
1735
|
...manifest.capsule,
|
|
1593
1736
|
externalBuiltins: Object.freeze([...manifest.capsule.externalBuiltins]),
|
|
1737
|
+
builtinPolicy: Object.freeze({
|
|
1738
|
+
...manifest.capsule.builtinPolicy,
|
|
1739
|
+
allowedBuiltins: Object.freeze([
|
|
1740
|
+
...manifest.capsule.builtinPolicy.allowedBuiltins,
|
|
1741
|
+
]),
|
|
1742
|
+
executionContextBuiltins: Object.freeze([
|
|
1743
|
+
...manifest.capsule.builtinPolicy.executionContextBuiltins,
|
|
1744
|
+
]),
|
|
1745
|
+
}),
|
|
1594
1746
|
}),
|
|
1595
1747
|
closureDigest: manifest.closureDigest,
|
|
1596
1748
|
fileCount: manifest.fileCount,
|
|
@@ -428,6 +428,8 @@ export function generatePkgConfig(ctx) {
|
|
|
428
428
|
`${posixify(cliRoot)}/src/lib/process-execution-broker/windows-sandbox-helper.dll`,
|
|
429
429
|
`${posixify(cliRoot)}/src/lib/process-execution-broker/windows-sandbox-helper.exe`,
|
|
430
430
|
`${posixify(cliRoot)}/src/lib/process-execution-broker/windows-sandbox.cs`,
|
|
431
|
+
`${posixify(cliRoot)}/src/lib/process-execution-broker/macos-mcp-launcher.c`,
|
|
432
|
+
`${posixify(cliRoot)}/src/lib/process-execution-broker/macos-mcp-launcher-protocol.json`,
|
|
431
433
|
`${posixify(cliRoot)}/install/install.ps1`,
|
|
432
434
|
...capsuleBuilderAssets(cliRoot).map(posixify),
|
|
433
435
|
];
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/** Resolve static settings plus CLI-owned workspace-scoped permission rules. */
|
|
2
|
+
|
|
3
|
+
import settingsLoader from "./settings-loader.cjs";
|
|
4
|
+
import { ScopedPermissionStore } from "./scoped-permission-store.js";
|
|
5
|
+
|
|
6
|
+
const { applyManagedPermissionPolicy, loadSettings } = settingsLoader;
|
|
7
|
+
const KINDS = ["allow", "ask", "deny"];
|
|
8
|
+
|
|
9
|
+
function cloneRules(rules) {
|
|
10
|
+
return Object.fromEntries(
|
|
11
|
+
KINDS.map((kind) => [kind, [...(rules?.[kind] || [])]]),
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function hasRules(rules) {
|
|
16
|
+
return KINDS.some((kind) => rules[kind].length > 0);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function loadPermissionAuthority({
|
|
20
|
+
cwd = process.cwd(),
|
|
21
|
+
settingsFile = null,
|
|
22
|
+
managedSettingsFile = null,
|
|
23
|
+
env = process.env,
|
|
24
|
+
baseRules = null,
|
|
25
|
+
scopedStore = null,
|
|
26
|
+
} = {}) {
|
|
27
|
+
const loaded = loadSettings({
|
|
28
|
+
cwd,
|
|
29
|
+
settingsFile,
|
|
30
|
+
managedSettingsFile,
|
|
31
|
+
env,
|
|
32
|
+
});
|
|
33
|
+
const sources = baseRules ? {} : { ...loaded.sources };
|
|
34
|
+
let rules = baseRules
|
|
35
|
+
? applyManagedPermissionPolicy(baseRules, loaded.managed, sources)
|
|
36
|
+
: cloneRules(loaded.rules);
|
|
37
|
+
let scoped = null;
|
|
38
|
+
|
|
39
|
+
// Explicit caller rules retain their historical replacement semantics.
|
|
40
|
+
// Managed-only policy also suppresses every user-owned scoped grant.
|
|
41
|
+
if (!baseRules) {
|
|
42
|
+
scoped = (scopedStore || new ScopedPermissionStore({ cwd })).list();
|
|
43
|
+
const managedOnly =
|
|
44
|
+
loaded.managed?.allowManagedPermissionRulesOnly === true;
|
|
45
|
+
scoped = {
|
|
46
|
+
...scoped,
|
|
47
|
+
rules: scoped.rules.map((record) => ({
|
|
48
|
+
...record,
|
|
49
|
+
effectiveStatus:
|
|
50
|
+
managedOnly && record.status === "active"
|
|
51
|
+
? "suppressed-by-managed-policy"
|
|
52
|
+
: record.status,
|
|
53
|
+
})),
|
|
54
|
+
};
|
|
55
|
+
if (!managedOnly) {
|
|
56
|
+
for (const record of scoped.rules) {
|
|
57
|
+
if (record.status !== "active") continue;
|
|
58
|
+
if (!rules[record.decision].includes(record.rule)) {
|
|
59
|
+
rules[record.decision].push(record.rule);
|
|
60
|
+
sources[`${record.decision}:${record.rule}`] = `scoped:${record.id}`;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
...loaded,
|
|
68
|
+
rules,
|
|
69
|
+
sources,
|
|
70
|
+
scoped,
|
|
71
|
+
hasRules: hasRules(rules),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function createPermissionRulesProvider(options = {}) {
|
|
76
|
+
return () => loadPermissionAuthority(options);
|
|
77
|
+
}
|