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
|
Binary file
|
|
Binary file
|
|
@@ -89,7 +89,10 @@ namespace ChainlessChain.WindowsSandbox
|
|
|
89
89
|
private const UInt32 WAIT_TIMEOUT = 0x00000102;
|
|
90
90
|
private const UInt32 HANDLE_FLAG_INHERIT = 0x00000001;
|
|
91
91
|
private const Int32 ERROR_INSUFFICIENT_BUFFER = 122;
|
|
92
|
+
private const Int32 ERROR_OPLOCK_NOT_GRANTED = 300;
|
|
92
93
|
private const Int32 ERROR_IO_PENDING = 997;
|
|
94
|
+
private const Int32 LAUNCH_PATH_OPLOCK_MAX_ATTEMPTS = 22;
|
|
95
|
+
private const Int32 LAUNCH_PATH_OPLOCK_RETRY_BASE_DELAY_MS = 50;
|
|
93
96
|
private const Int32 HRESULT_FROM_WIN32_ERROR_ALREADY_EXISTS =
|
|
94
97
|
unchecked((Int32)0x800700B7);
|
|
95
98
|
private const Int32 SecurityImpersonation = 2;
|
|
@@ -122,8 +125,10 @@ namespace ChainlessChain.WindowsSandbox
|
|
|
122
125
|
private const UInt16 IMAGE_FILE_MACHINE_ARM64 = 0xaa64;
|
|
123
126
|
private const UInt32 GENERIC_READ = 0x80000000;
|
|
124
127
|
private const UInt32 GENERIC_WRITE = 0x40000000;
|
|
128
|
+
private const UInt32 FILE_READ_ATTRIBUTES = 0x00000080;
|
|
125
129
|
private const UInt32 FILE_SHARE_READ = 0x00000001;
|
|
126
130
|
private const UInt32 FILE_SHARE_WRITE = 0x00000002;
|
|
131
|
+
private const UInt32 FILE_SHARE_DELETE = 0x00000004;
|
|
127
132
|
private const UInt32 OPEN_EXISTING = 3;
|
|
128
133
|
private const UInt32 FILE_ATTRIBUTE_DIRECTORY = 0x00000010;
|
|
129
134
|
private const UInt32 FILE_ATTRIBUTE_NORMAL = 0x00000080;
|
|
@@ -2305,6 +2310,42 @@ namespace ChainlessChain.WindowsSandbox
|
|
|
2305
2310
|
|
|
2306
2311
|
private static LaunchPathLock AcquireLaunchPathLock(
|
|
2307
2312
|
LaunchPathLockSpec spec)
|
|
2313
|
+
{
|
|
2314
|
+
for (
|
|
2315
|
+
int attempt = 1;
|
|
2316
|
+
attempt <= LAUNCH_PATH_OPLOCK_MAX_ATTEMPTS;
|
|
2317
|
+
attempt++)
|
|
2318
|
+
{
|
|
2319
|
+
try
|
|
2320
|
+
{
|
|
2321
|
+
return AcquireLaunchPathLockOnce(spec);
|
|
2322
|
+
}
|
|
2323
|
+
catch (Win32Exception error)
|
|
2324
|
+
{
|
|
2325
|
+
if (
|
|
2326
|
+
error.NativeErrorCode != ERROR_OPLOCK_NOT_GRANTED ||
|
|
2327
|
+
attempt == LAUNCH_PATH_OPLOCK_MAX_ATTEMPTS)
|
|
2328
|
+
{
|
|
2329
|
+
throw;
|
|
2330
|
+
}
|
|
2331
|
+
// Filter oplocks are exclusive. Another strict helper or
|
|
2332
|
+
// a short-lived host scanner can hold the same runtime;
|
|
2333
|
+
// add at most 4.75s of backoff for that explicit denial.
|
|
2334
|
+
// AcquireLaunchPathLockOnce closes every failed attempt
|
|
2335
|
+
// before this delay, and all identity checks run again.
|
|
2336
|
+
int retryDelay = Math.Min(
|
|
2337
|
+
250,
|
|
2338
|
+
LAUNCH_PATH_OPLOCK_RETRY_BASE_DELAY_MS *
|
|
2339
|
+
attempt);
|
|
2340
|
+
Thread.Sleep(retryDelay);
|
|
2341
|
+
}
|
|
2342
|
+
}
|
|
2343
|
+
throw new InvalidOperationException(
|
|
2344
|
+
"Launch path Filter oplock retry contract failed");
|
|
2345
|
+
}
|
|
2346
|
+
|
|
2347
|
+
private static LaunchPathLock AcquireLaunchPathLockOnce(
|
|
2348
|
+
LaunchPathLockSpec spec)
|
|
2308
2349
|
{
|
|
2309
2350
|
UInt64 expectedDevice;
|
|
2310
2351
|
UInt64 expectedFileId;
|
|
@@ -2345,8 +2386,8 @@ namespace ChainlessChain.WindowsSandbox
|
|
|
2345
2386
|
{
|
|
2346
2387
|
lockingHandle = CreateFile(
|
|
2347
2388
|
expectedPath,
|
|
2348
|
-
|
|
2349
|
-
FILE_SHARE_READ,
|
|
2389
|
+
FILE_READ_ATTRIBUTES,
|
|
2390
|
+
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
|
|
2350
2391
|
ref attributes,
|
|
2351
2392
|
OPEN_EXISTING,
|
|
2352
2393
|
FILE_FLAG_OVERLAPPED,
|
|
@@ -2373,12 +2414,17 @@ namespace ChainlessChain.WindowsSandbox
|
|
|
2373
2414
|
0,
|
|
2374
2415
|
out returned,
|
|
2375
2416
|
overlapped);
|
|
2376
|
-
int oplockError =
|
|
2417
|
+
int oplockError = completed
|
|
2418
|
+
? 0
|
|
2419
|
+
: Marshal.GetLastWin32Error();
|
|
2377
2420
|
if (completed || oplockError != ERROR_IO_PENDING)
|
|
2378
2421
|
{
|
|
2379
2422
|
throw new Win32Exception(
|
|
2380
2423
|
oplockError,
|
|
2381
|
-
"FSCTL_REQUEST_FILTER_OPLOCK was not granted"
|
|
2424
|
+
"FSCTL_REQUEST_FILTER_OPLOCK was not granted " +
|
|
2425
|
+
"(win32=" +
|
|
2426
|
+
oplockError.ToString(CultureInfo.InvariantCulture) +
|
|
2427
|
+
", role=" + spec.role + ")");
|
|
2382
2428
|
}
|
|
2383
2429
|
oplockPending = true;
|
|
2384
2430
|
|
|
@@ -37,6 +37,7 @@ const BRIDGE_TOOL_FEATURES = [
|
|
|
37
37
|
["getCallHierarchy", "semantic_call_hierarchy"],
|
|
38
38
|
["getSymbolInfo", "semantic_symbols"],
|
|
39
39
|
["getProjectModel", "project_model"],
|
|
40
|
+
["getContextCenter", "context_center"],
|
|
40
41
|
];
|
|
41
42
|
|
|
42
43
|
const VSCODE_COMMANDS = [
|
|
@@ -58,6 +59,7 @@ const VSCODE_COMMANDS = [
|
|
|
58
59
|
"chainlesschain.chrome.connector",
|
|
59
60
|
"chainlesschain.artifacts.show",
|
|
60
61
|
"chainlesschain.policy.show",
|
|
62
|
+
"chainlesschain.context.show",
|
|
61
63
|
"chainlesschain.workspace.scanAutoExec",
|
|
62
64
|
"chainlesschain.remote.doctor",
|
|
63
65
|
"chainlesschain.lens.explain",
|
|
@@ -106,6 +108,7 @@ const JETBRAINS_ACTIONS = [
|
|
|
106
108
|
"chainlesschain.usage.Show",
|
|
107
109
|
"chainlesschain.artifacts.Browse",
|
|
108
110
|
"chainlesschain.policy.Viewer",
|
|
111
|
+
"chainlesschain.context.Center",
|
|
109
112
|
"chainlesschain.plugins.Manage",
|
|
110
113
|
"chainlesschain.worktree.Tasks",
|
|
111
114
|
"chainlesschain.chrome.Connector",
|
|
@@ -29,6 +29,11 @@ import {
|
|
|
29
29
|
defaultApprovalAuthorityStatePath,
|
|
30
30
|
} from "./approval-authority-store.js";
|
|
31
31
|
import { OperationApprovalRegistry } from "./operation-fingerprint.js";
|
|
32
|
+
import {
|
|
33
|
+
DurableRemoteMembershipAuthority,
|
|
34
|
+
REMOTE_MEMBERSHIP_AUTHORITY_UNAVAILABLE_CODE,
|
|
35
|
+
REMOTE_MEMBERSHIP_AUTHORITY_VERSION,
|
|
36
|
+
} from "./remote-membership-authority.js";
|
|
32
37
|
import {
|
|
33
38
|
buildDirectPairingUri,
|
|
34
39
|
pickLanAddress,
|
|
@@ -50,6 +55,8 @@ export class RemoteApprovalBridge {
|
|
|
50
55
|
now = Date.now,
|
|
51
56
|
approvalStore = undefined,
|
|
52
57
|
approvalStateFile = null,
|
|
58
|
+
membershipAuthority = undefined,
|
|
59
|
+
membershipStateFile = null,
|
|
53
60
|
onSecurityError = null,
|
|
54
61
|
} = {}) {
|
|
55
62
|
if (!wsUrl) throw new Error("wsUrl is required");
|
|
@@ -71,6 +78,13 @@ export class RemoteApprovalBridge {
|
|
|
71
78
|
this._securityErrors = [];
|
|
72
79
|
this._onSecurityError =
|
|
73
80
|
typeof onSecurityError === "function" ? onSecurityError : null;
|
|
81
|
+
this._membershipAuthority =
|
|
82
|
+
membershipAuthority === undefined
|
|
83
|
+
? () =>
|
|
84
|
+
new DurableRemoteMembershipAuthority(
|
|
85
|
+
membershipStateFile ? { filePath: membershipStateFile } : {},
|
|
86
|
+
)
|
|
87
|
+
: membershipAuthority;
|
|
74
88
|
const durableStore =
|
|
75
89
|
approvalStore === undefined
|
|
76
90
|
? new ApprovalAuthorityStore({
|
|
@@ -100,6 +114,23 @@ export class RemoteApprovalBridge {
|
|
|
100
114
|
this._approvalStore = durableStore;
|
|
101
115
|
}
|
|
102
116
|
|
|
117
|
+
_requireMembershipAuthority() {
|
|
118
|
+
if (typeof this._membershipAuthority === "function") {
|
|
119
|
+
this._membershipAuthority = this._membershipAuthority();
|
|
120
|
+
}
|
|
121
|
+
if (
|
|
122
|
+
!this._membershipAuthority ||
|
|
123
|
+
typeof this._membershipAuthority.withActiveMembership !== "function"
|
|
124
|
+
) {
|
|
125
|
+
const error = new Error(
|
|
126
|
+
"Durable Remote membership authority is unavailable; remote approval is denied",
|
|
127
|
+
);
|
|
128
|
+
error.code = REMOTE_MEMBERSHIP_AUTHORITY_UNAVAILABLE_CODE;
|
|
129
|
+
throw error;
|
|
130
|
+
}
|
|
131
|
+
return this._membershipAuthority;
|
|
132
|
+
}
|
|
133
|
+
|
|
103
134
|
_recordSecurityError({ action, requestId = null, reason, errorCode = null }) {
|
|
104
135
|
const entry = {
|
|
105
136
|
timestamp: this._now(),
|
|
@@ -139,7 +170,17 @@ export class RemoteApprovalBridge {
|
|
|
139
170
|
sessionId: this.agentSessionId,
|
|
140
171
|
name: this.name,
|
|
141
172
|
scopes: this.scopes,
|
|
173
|
+
requireDurableMembershipAuthority: true,
|
|
142
174
|
});
|
|
175
|
+
if (
|
|
176
|
+
created.session?.membershipAuthority !==
|
|
177
|
+
REMOTE_MEMBERSHIP_AUTHORITY_VERSION ||
|
|
178
|
+
typeof created.session?.sessionEpoch !== "string"
|
|
179
|
+
) {
|
|
180
|
+
throw new Error(
|
|
181
|
+
"Remote Session server did not establish durable membership authority",
|
|
182
|
+
);
|
|
183
|
+
}
|
|
143
184
|
this.remoteSessionId = created.session.sessionId;
|
|
144
185
|
this.pairing = created.pairing;
|
|
145
186
|
return this;
|
|
@@ -181,6 +222,28 @@ export class RemoteApprovalBridge {
|
|
|
181
222
|
const requestId = message.event.requestId || message.event.approvalId;
|
|
182
223
|
const pending = requestId ? this._pending.get(requestId) : null;
|
|
183
224
|
if (!pending) return;
|
|
225
|
+
if (message.agentSessionId !== this.agentSessionId) {
|
|
226
|
+
this._recordSecurityError({
|
|
227
|
+
action: "approval.resolve",
|
|
228
|
+
requestId,
|
|
229
|
+
reason: "membership-agent-session-mismatch",
|
|
230
|
+
});
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (
|
|
234
|
+
message.membershipAuthority !== REMOTE_MEMBERSHIP_AUTHORITY_VERSION ||
|
|
235
|
+
typeof message.from !== "string" ||
|
|
236
|
+
!message.from ||
|
|
237
|
+
typeof message.sessionEpoch !== "string" ||
|
|
238
|
+
typeof message.membershipEpoch !== "string"
|
|
239
|
+
) {
|
|
240
|
+
this._recordSecurityError({
|
|
241
|
+
action: "approval.resolve",
|
|
242
|
+
requestId,
|
|
243
|
+
reason: "membership-binding-required",
|
|
244
|
+
});
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
184
247
|
// The device must echo the complete durable capability tuple. Missing,
|
|
185
248
|
// mismatched, stale, duplicate, or expired resolutions never settle an
|
|
186
249
|
// approval; only the store's successful CAS can return approved=true.
|
|
@@ -202,23 +265,66 @@ export class RemoteApprovalBridge {
|
|
|
202
265
|
}
|
|
203
266
|
const decision =
|
|
204
267
|
rawAnswer === true || rawAnswer === "true" || rawAnswer === "yes";
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
268
|
+
let fenced;
|
|
269
|
+
try {
|
|
270
|
+
// The membership lock encloses the approval-store CAS. Therefore a
|
|
271
|
+
// revoke either commits first and suppresses this CAS, or waits behind an
|
|
272
|
+
// approval that has already linearized. No server-forwarded `from`
|
|
273
|
+
// string can authorize a side effect on its own.
|
|
274
|
+
fenced = this._requireMembershipAuthority().withActiveMembership(
|
|
275
|
+
{
|
|
276
|
+
sessionId: this.remoteSessionId,
|
|
277
|
+
principalId: message.from,
|
|
278
|
+
sessionEpoch: message.sessionEpoch,
|
|
279
|
+
membershipEpoch: message.membershipEpoch,
|
|
280
|
+
},
|
|
281
|
+
"approve",
|
|
282
|
+
(membership) => {
|
|
283
|
+
const authority = {
|
|
284
|
+
origin: ORIGIN.REMOTE,
|
|
285
|
+
authenticated: true,
|
|
286
|
+
scopes: ["approve"],
|
|
287
|
+
principalId: membership.principalId,
|
|
288
|
+
sessionId: this.agentSessionId,
|
|
289
|
+
remoteSessionId: membership.sessionId,
|
|
290
|
+
sessionEpoch: membership.sessionEpoch,
|
|
291
|
+
membershipEpoch: membership.membershipEpoch,
|
|
292
|
+
};
|
|
293
|
+
return this._registry.resolve(pending.fingerprint, {
|
|
294
|
+
requestId,
|
|
295
|
+
fingerprint: message.event.fingerprint,
|
|
296
|
+
binding: message.event.binding,
|
|
297
|
+
sessionId: this.agentSessionId,
|
|
298
|
+
decision,
|
|
299
|
+
authority,
|
|
300
|
+
expectedRevision: message.event.revision,
|
|
301
|
+
now: this._now(),
|
|
302
|
+
});
|
|
303
|
+
},
|
|
304
|
+
);
|
|
305
|
+
} catch (error) {
|
|
306
|
+
const verdict = {
|
|
307
|
+
reason: "membership-state-unavailable",
|
|
308
|
+
errorCode: error?.code || REMOTE_MEMBERSHIP_AUTHORITY_UNAVAILABLE_CODE,
|
|
309
|
+
};
|
|
310
|
+
this._recordSecurityError({
|
|
311
|
+
action: "approval.resolve",
|
|
312
|
+
requestId,
|
|
313
|
+
reason: verdict.reason,
|
|
314
|
+
errorCode: verdict.errorCode,
|
|
315
|
+
});
|
|
316
|
+
this._settleDeniedForStateFailure(requestId, pending, verdict);
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
if (!fenced.ok) {
|
|
320
|
+
this._recordSecurityError({
|
|
321
|
+
action: "approval.resolve",
|
|
322
|
+
requestId,
|
|
323
|
+
reason: fenced.reason,
|
|
324
|
+
});
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
const verdict = fenced.value;
|
|
222
328
|
if (!verdict.ok) {
|
|
223
329
|
this._recordSecurityError({
|
|
224
330
|
action: "approval.resolve",
|