chainlesschain 0.163.8 → 0.165.1
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 +7 -4
- 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/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-CavM7W3k.js → AIOps-CYxFDrcm.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CUvZGabQ.js → ActionButton-CPBtdiU2.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DeBnWnbe.js → Analytics-Dayq7Dp7.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DbI5kxvd.js → AppLayout-6U7bPb2s.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-D93bigKm.js → Artifacts-D2Iqg_3D.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CBNvfUZa.js → Audit-CdoOB7WV.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-CJLyh_YU.js → BackgroundAgents-DrnAVB8w.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-D_0yoehD.js → Backup-CesMi5cy.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-TJxmbObW.js → BaseInput-DaX9ptax.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CE0dto1q.js → Chat-OrwOPxDS.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CZ5-yYiD.js → ChatBubbleRenderer-CvPZFRxM.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-Ck1RVIVo.js → Checkbox-DiHbcysC.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-qpoyf6DK.js → Codegen-CbgCkaBJ.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DUyPWjIE.js → Col-Du5hgrh4.js} +1 -1
- package/src/assets/web-panel/assets/{Community-D_S1BemS.js → Community-DsPOBW-p.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BjxeK-Gc.js → Compact-BwHIFkNC.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-Dd3CEJsu.js → Compliance-BvrDQSgd.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-B4QG7-ad.js → Cowork-gwAE6arx.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-BtZnids5.js → Cron-DW-0l4uF.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CHPfCBFD.js → Crosschain-j-NsLesB.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DT8DCEOK.js → DID-CibVEBOI.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-COQab5_U.js → Dashboard-W4z9vSfe.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BY1PsQuU.js → Dropdown-DAcrkKxG.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CsuAuaq3.js → EmailListRenderer-6GXah-89.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BqpinD-j.js → FamilyGuardDashboard-TKDCq8Ku.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-D0gkfQFv.js → Federation-BXBLlcNm.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BqgE-axK.js → FormItemContext-BoJJBkG3.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-D0hJ2KvC.js → GenericCardRenderer-okjsl46v.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CmMB0uPY.js → Git-Rvs7i6nn.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BnVEI0Dk.js → Governance-CHSUxXXS.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-YTAMihRP.js → Inference-V3BlfxsB.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-0ax7VHop.js → KnowledgeGraph-C_NlD4aR.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-B9TRcokL.js → Logs-Nn4LNxhA.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-SVAgNnkt.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-B6CSuD_H.js → Marketplace-DEmjFcg-.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CjMXvOVU.js → McpTools-DlopXipI.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-CXRF71U3.js → Memory-BG3ynX60.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DQgNp_oS.js → MobileBridge-DeRzWOfT.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DlPwcCbq.js → MobileProjects-Tyd3o2A0.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-6hDTRPe1.js → Mtc-BoPbOv1C.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-BlVHU1DS.js → MtcAudit-un-rTHp7.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-DP9pzEbV.js → Multisig-Ds0oveEB.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Djorh8EV.js → NLProgramming-D09JI-yY.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-oLZ-JkUg.js → Notes-DTRhiKJn.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-Cg288VH3.js → NotificationSettings-BAnnNCim.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-Yr-1fSYi.js +1 -0
- package/src/assets/web-panel/assets/{Organization-CBdo-bHs.js → Organization-S9EAolpj.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-qZdnVumx.js → Overflow-CqcLKqJ8.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-D4kNfGNQ.js → P2P-Dw0F9EcU.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DnlMemM7.js → PdhVaultBrowser-BDRwUevN.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-DHucHFBJ.js → Permissions-D3_c3nKB.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BovlOIPR.js → PersonalDataHub-CxdMV98x.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-Deru3CQY.js → Pipeline-CgjNQFLI.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-Bq5oTTbU.js → Privacy-BHghIIht.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BfzxVWAz.js → ProjectInit-De6pqaKM.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CKC6XBtH.js → ProjectSettings-Bg4ZkNYQ.js} +2 -2
- package/src/assets/web-panel/assets/Projects-CP8vPvzs.js +1 -0
- package/src/assets/web-panel/assets/{Providers-C_jx4TWX.js → Providers-CUnHbNf-.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-BdIHeVGC.js → QrScannerModal-DA2f3Wts.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BwZwAcPD.js → QuickAsk-C1FeHDqp.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BNTt0L-m.js → Recommend-B5guaUMN.js} +1 -1
- package/src/assets/web-panel/assets/RemoteSession-PDADSds3.js +5 -0
- package/src/assets/web-panel/assets/{Reputation-D6VpG32B.js → Reputation-eTlRhgvK.js} +1 -1
- package/src/assets/web-panel/assets/{Row-D_74OvQQ.js → Row-D7AqSGY0.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BTr0a-BQ.js → RssFeed-JiuLm4Ja.js} +3 -3
- package/src/assets/web-panel/assets/{Search-C3MCFoNU.js → Search-CwruahW3.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CqW9aJ6s.js → Security-CdhqaR0b.js} +4 -4
- package/src/assets/web-panel/assets/{Services-Cw5GNaHF.js → Services-CU0ZIlcT.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DZps5qeY.js → Skeleton-CtduPfAb.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-C6NQ1znT.js → Skills-CROXm6AY.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DFP8G2Sh.js → Sla-DiZiABFD.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-ESt6MB6v.js → SpeechSettings-B5pLcXUw.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BHnN98aM.js → SyncSettings-DBX6J1Oe.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-NiSCaOf-.js → Tasks-BLyRJd3-.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DsKFhW2C.js → Templates-BKa5qzmk.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CQ0E0ze5.js → Tenant-DnD3a4M6.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-D_rBu_by.js → Terminal-DEitQeTb.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-D3Vm4Po4.js → TimelineRenderer-CjHggTDq.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DNTxRH6q.js → Tokens-CsGT7sfl.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-Dgprz1ms.js → Trigger-yr4rFDrW.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-B2rUnVBD.js → Trust-CLvu1Sjp.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DEGQNc6_.js → UkeySign-B0m7yUP8.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-jlsAx3Eh.js → VideoEditing-C0VvP4lc.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-8jQih1ij.js → Wallet-kllBAG1M.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-XLeO6xIB.js → WebAuthn-C54UQNLx.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-De_dgDAG.js → WorkflowEditor-B7y8qSvU.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CI19R_Sk.js → chat-DRzTh8CJ.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DsYTOYN3.js → colors-BSMwSnCx.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CM3-t_Qr.js → compact-item-BTg602H5.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BjxlBRZv.js → createContext-B6EGsdvp.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-Dol8jLEP.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-RDaWX_4i.js → hasIn-DDKqJ8RD.js} +1 -1
- package/src/assets/web-panel/assets/{index-nAH87mQP.js → index-323Hhxxt.js} +1 -1
- package/src/assets/web-panel/assets/{index-DIUnNOjG.js → index-BICn3Qh1.js} +1 -1
- package/src/assets/web-panel/assets/{index-DyIWssPC.js → index-BMuGd2--.js} +1 -1
- package/src/assets/web-panel/assets/{index-DX7tuWVJ.js → index-BRqt4fO-.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cd3euP_4.js → index-BVTAl5N2.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cpqm1qfU.js → index-BsR7Y2NG.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcPFB8qJ.js → index-Bx044qDj.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cd9OJhHG.js → index-C1GFfuqN.js} +1 -1
- package/src/assets/web-panel/assets/index-C3QX5tOl.js +1 -0
- package/src/assets/web-panel/assets/{index-B-Z8eFUJ.js → index-C66NpWy5.js} +1 -1
- package/src/assets/web-panel/assets/{index-BlT2VAEK.js → index-CDTvsX8t.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dsij_KsN.js → index-CGNklbP6.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4gkzxkw.js → index-CHfLYwcW.js} +1 -1
- package/src/assets/web-panel/assets/{index-D6sm5-Xq.js → index-CNxg61YP.js} +1 -1
- package/src/assets/web-panel/assets/{index-C0yx-jtQ.js → index-CQlHFN_g.js} +1 -1
- package/src/assets/web-panel/assets/{index-CjTrRt13.js → index-CUEU48o1.js} +1 -1
- package/src/assets/web-panel/assets/{index-B7WBt_4T.js → index-CWGax2QW.js} +1 -1
- package/src/assets/web-panel/assets/{index-IeiL9RKc.js → index-C_JzIXUq.js} +1 -1
- package/src/assets/web-panel/assets/{index-CnHH7bnD.js → index-Cf23wVMs.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKJr-TZp.js → index-CmAInUkX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CiECJi-Q.js → index-CmAubjDi.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCnZyIMA.js → index-Co7oM1qr.js} +1 -1
- package/src/assets/web-panel/assets/{index-Drlnwr8F.js → index-CwPUZbMI.js} +1 -1
- package/src/assets/web-panel/assets/{index-9R6BxAr0.js → index-D1naNj4U.js} +1 -1
- package/src/assets/web-panel/assets/{index-BGqqJfL0.js → index-D5CsBShd.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bi46Xu4u.js → index-DBT3YeQ9.js} +1 -1
- package/src/assets/web-panel/assets/{index-DXXtGMUJ.js → index-DLdrHhML.js} +1 -1
- package/src/assets/web-panel/assets/{index-B0PMlbMs.js → index-Dc77VR3H.js} +1 -1
- package/src/assets/web-panel/assets/{index-D0zcy54x.js → index-Dfv2lKu3.js} +1 -1
- package/src/assets/web-panel/assets/{index-BN6UPD2E.js → index-DiW0sDkz.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dxge-xWl.js → index-DpTHIRfZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CyOGN6a5.js → index-DqFXGzzC.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9O9YyWE.js → index-XFe-1twF.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHNYPO0b.js → index-p2HYn89m.js} +3 -3
- package/src/assets/web-panel/assets/{index-CVQMeiwH.js → index-pqfux8vZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-pPL66J85.js → index-rjzk9z1Q.js} +1 -1
- package/src/assets/web-panel/assets/{index-DoQA0-52.js → index-th2ihDc0.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5REnKt8.js → index-u2YVld9W.js} +1 -1
- package/src/assets/web-panel/assets/index-xYybvEic.js +1 -0
- package/src/assets/web-panel/assets/{initDefaultProps-BTL88of4.js → initDefaultProps-C3Djh9fa.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BUB2pXwB.js → motion-BzqFmbSe.js} +1 -1
- package/src/assets/web-panel/assets/{move-egCkkOMm.js → move-DJo_FFaW.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DAWhZC8c.js → mtc-parser-_tlTiBvk.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CvOxe_6d.js → omit-CB2ZyxUg.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DZUSLZ5Z.js → pickAttrs-DZwIFD4u.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BERxGNMY.js → placementArrow-DxZY0dgk.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DZuDfZ9n.js → responsiveObserve-CzzGt7GL.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DO756sgI.js → slide-BaIK52yz.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BRQlIz28.js → statusUtils-3-FHu9_M.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DCSfdybl.js → styleChecker-BkRT68fK.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-LD8dWVve.js → useFlexGapSupport-DHYwKS-s.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BX9uW2LK.js → useFs-DVVUhV8p.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BPSlPuHU.js → usePersonalDataHub-CkrFKAzQ.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-BmOILC9V.js → vnode-BuBLFz0c.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-1iKowKGg.js → zoom-kpm6LtXU.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 +418 -41
- 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 +28 -2
- package/src/gateways/ws/action-protocol.js +316 -17
- package/src/gateways/ws/message-dispatcher.js +30 -0
- package/src/gateways/ws/remote-session-protocol.js +565 -35
- package/src/gateways/ws/ws-agent-handler.js +12 -0
- package/src/gateways/ws/ws-approval-gate.js +5 -0
- package/src/gateways/ws/ws-server.js +510 -50
- package/src/harness/jsonl-session-store.js +341 -24
- package/src/harness/mcp-client.js +8 -1
- package/src/harness/remote-session-audit.js +2 -0
- package/src/harness/remote-session-crypto.js +929 -21
- package/src/harness/remote-session-registry.js +945 -24
- package/src/harness/session-list-index.js +233 -14
- package/src/lib/agent-authority.js +6 -0
- package/src/lib/auto-mode-config.js +98 -3
- package/src/lib/background-agent-keeper-client.js +248 -0
- package/src/lib/background-agent-keeper-protocol.js +291 -0
- package/src/lib/background-agent-supervisor.js +1357 -85
- package/src/lib/background-interaction-resolver.js +12 -0
- package/src/lib/background-session-transport.js +23 -6
- package/src/lib/background-turn-bootstrap-protocol.js +190 -0
- package/src/lib/cowork-workflow.js +1188 -76
- package/src/lib/delivery-production-adapter.js +38 -2
- package/src/lib/dynamic-workflow-facade.js +1736 -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 +777 -34
- package/src/lib/remote-control.js +2 -0
- package/src/lib/remote-membership-authority.js +632 -0
- package/src/lib/remote-membership-coordinator.js +2973 -0
- package/src/lib/remote-membership-host-store.js +1799 -0
- package/src/lib/runtime-provenance-ledger.js +171 -46
- package/src/lib/scoped-permission-store.js +369 -0
- package/src/lib/session-anti-rollback-anchor.js +262 -5
- package/src/lib/shell-approval.js +169 -6
- package/src/lib/sub-agent-context.js +4 -0
- package/src/lib/with-file-lock.js +73 -38
- package/src/lib/workflow-definition-contract.js +149 -0
- package/src/repl/agent-repl.js +111 -36
- 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/repl/remote-approval.js +29 -7
- package/src/runtime/agent-core.js +1182 -155
- package/src/runtime/headless-runner.js +52 -30
- package/src/runtime/headless-stream.js +51 -28
- package/src/workers/background-agent-keeper.js +689 -0
- package/src/workers/background-agent-worker.js +365 -13
- package/src/workers/background-turn-bootstrap.js +170 -0
- package/src/assets/web-panel/assets/MarkdownRenderer-yySN5YNM.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-Bb1O3Ofr.js +0 -1
- package/src/assets/web-panel/assets/Projects-CMolGhae.js +0 -1
- package/src/assets/web-panel/assets/RemoteSession-Biyn2-Ro.js +0 -5
- 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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "chainlesschain",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.165.1",
|
|
4
4
|
"description": "CLI for ChainlessChain - install, configure, and manage your personal AI management system",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -56,6 +56,9 @@
|
|
|
56
56
|
"scripts/postinstall.mjs",
|
|
57
57
|
"scripts/repair-node-pty.mjs",
|
|
58
58
|
"scripts/build-windows-sandbox-helper.ps1",
|
|
59
|
+
"scripts/macos-mcp-launcher-build.mjs",
|
|
60
|
+
"scripts/macos-mcp-launcher-preinstall.sh",
|
|
61
|
+
"scripts/macos-mcp-launcher-postinstall.sh",
|
|
59
62
|
"scripts/command-lifecycle-report.mjs",
|
|
60
63
|
"README.md"
|
|
61
64
|
],
|
|
@@ -83,8 +86,8 @@
|
|
|
83
86
|
"@chainlesschain/core-infra": "0.1.1",
|
|
84
87
|
"@chainlesschain/core-mtc": "0.2.3",
|
|
85
88
|
"@chainlesschain/core-multisig": "0.1.4",
|
|
86
|
-
"@chainlesschain/personal-data-hub": "0.4.
|
|
87
|
-
"@chainlesschain/session-core": "0.3.
|
|
89
|
+
"@chainlesschain/personal-data-hub": "0.4.58",
|
|
90
|
+
"@chainlesschain/session-core": "0.3.5",
|
|
88
91
|
"@chainlesschain/shared-logger": "0.1.1",
|
|
89
92
|
"@inquirer/prompts": "^7.2.0",
|
|
90
93
|
"@noble/curves": "^1.9.7",
|
|
@@ -93,7 +96,7 @@
|
|
|
93
96
|
"chalk": "^5.4.1",
|
|
94
97
|
"commander": "^12.1.0",
|
|
95
98
|
"esbuild-wasm": "0.28.1",
|
|
96
|
-
"js-yaml": "^3.
|
|
99
|
+
"js-yaml": "^3.15.1",
|
|
97
100
|
"ora": "^8.1.1",
|
|
98
101
|
"semver": "^7.6.3",
|
|
99
102
|
"sql.js": "^1.14.1",
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import crypto from "node:crypto";
|
|
4
|
+
import fs from "node:fs";
|
|
5
|
+
import os from "node:os";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { spawnSync } from "node:child_process";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
|
+
import {
|
|
10
|
+
MACOS_MCP_LAUNCHER_INPUTS,
|
|
11
|
+
MACOS_MCP_LAUNCHER_INSTALL_CONTRACT_SCHEMA,
|
|
12
|
+
isMacosMcpLauncherPackageVersion,
|
|
13
|
+
verifyMacosMcpLauncherInstallContract,
|
|
14
|
+
} from "../src/lib/process-execution-broker/macos-mcp-launcher-contract.js";
|
|
15
|
+
|
|
16
|
+
export {
|
|
17
|
+
MACOS_MCP_LAUNCHER_INSTALL_CONTRACT_SCHEMA,
|
|
18
|
+
verifyMacosMcpLauncherInstallContract,
|
|
19
|
+
};
|
|
20
|
+
export const MACOS_MCP_LAUNCHER_SOURCE = MACOS_MCP_LAUNCHER_INPUTS.sourcePath;
|
|
21
|
+
export const MACOS_MCP_LAUNCHER_PROTOCOL =
|
|
22
|
+
MACOS_MCP_LAUNCHER_INPUTS.protocolPath;
|
|
23
|
+
|
|
24
|
+
function sha256(bytes) {
|
|
25
|
+
return crypto.createHash("sha256").update(bytes).digest("hex");
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function loadMacosMcpLauncherBuildInputs() {
|
|
29
|
+
return MACOS_MCP_LAUNCHER_INPUTS;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function cString(value) {
|
|
33
|
+
if (typeof value !== "string" || value.includes("\0")) {
|
|
34
|
+
throw new TypeError("generated C string must be NUL-free");
|
|
35
|
+
}
|
|
36
|
+
return JSON.stringify(value);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function generatedMacosMcpLauncherHeader(inputs) {
|
|
40
|
+
const { protocol } = inputs;
|
|
41
|
+
return [
|
|
42
|
+
"#ifndef CHAINLESSCHAIN_MACOS_MCP_LAUNCHER_GENERATED_H",
|
|
43
|
+
"#define CHAINLESSCHAIN_MACOS_MCP_LAUNCHER_GENERATED_H",
|
|
44
|
+
`#define CC_PROTOCOL_VERSION ${protocol.protocolVersion}`,
|
|
45
|
+
`#define CC_PROTOCOL_SHA256 ${cString(inputs.protocolSha256)}`,
|
|
46
|
+
`#define CC_HELPER_SOURCE_SHA256 ${cString(inputs.sourceSha256)}`,
|
|
47
|
+
`#define CC_GATE_BOOTSTRAP_SHA256 ${cString(inputs.gateBootstrapSha256)}`,
|
|
48
|
+
`#define CC_GATE_BOOTSTRAP ${cString(inputs.gateBootstrap)}`,
|
|
49
|
+
`#define CC_PACKAGE_IDENTIFIER ${cString(protocol.packageIdentifier)}`,
|
|
50
|
+
`#define CC_HELPER_INSTALL_PATH ${cString(protocol.helperInstallPath)}`,
|
|
51
|
+
`#define CC_INSTALL_CONTRACT_PATH ${cString(protocol.installContractPath)}`,
|
|
52
|
+
`#define CC_SNAPSHOT_ROOT ${cString(protocol.snapshotRoot)}`,
|
|
53
|
+
`#define CC_SNAPSHOT_LOCK_NAME ${cString(protocol.snapshotLockName)}`,
|
|
54
|
+
`#define CC_SANDBOX_EXECUTABLE ${cString(protocol.sandboxExecutable)}`,
|
|
55
|
+
`#define CC_RUNTIME_FD ${protocol.runtimeFd}`,
|
|
56
|
+
`#define CC_ENTRY_FD ${protocol.entryFd}`,
|
|
57
|
+
`#define CC_CAPSULE_ROOT_FD ${protocol.capsuleRootFd}`,
|
|
58
|
+
`#define CC_GATE_FD ${protocol.gateFd}`,
|
|
59
|
+
`#define CC_READY_FD ${protocol.readyFd}`,
|
|
60
|
+
`#define CC_CALLER_LIFELINE_FD ${protocol.callerLifelineFd}`,
|
|
61
|
+
`#define CC_MAXIMUM_RUNTIME_BYTES ${protocol.maximumRuntimeBytes}`,
|
|
62
|
+
`#define CC_MAXIMUM_ENTRY_BYTES ${protocol.maximumEntryBytes}`,
|
|
63
|
+
`#define CC_MAXIMUM_PASSTHROUGH_ARGS ${protocol.maximumPassthroughArgs}`,
|
|
64
|
+
`#define CC_MAX_STALE_SNAPSHOTS ${protocol.maximumStaleSnapshots}`,
|
|
65
|
+
`#define CC_READY_TIMEOUT_MS ${protocol.readyTimeoutMs}`,
|
|
66
|
+
"#endif",
|
|
67
|
+
"",
|
|
68
|
+
].join("\n");
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function run(command, args, options = {}) {
|
|
72
|
+
const result = spawnSync(command, args, {
|
|
73
|
+
encoding: "utf8",
|
|
74
|
+
stdio: "pipe",
|
|
75
|
+
timeout: 120_000,
|
|
76
|
+
...options,
|
|
77
|
+
});
|
|
78
|
+
if (result.error || result.status !== 0 || result.signal) {
|
|
79
|
+
const detail = String(result.stderr || result.stdout || "").trim();
|
|
80
|
+
throw (
|
|
81
|
+
result.error ||
|
|
82
|
+
new Error(
|
|
83
|
+
`${path.basename(command)} failed (${result.status ?? result.signal}): ${detail}`,
|
|
84
|
+
)
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export function macosMcpLauncherCompilerArguments({
|
|
91
|
+
sdkPath,
|
|
92
|
+
temporaryRoot,
|
|
93
|
+
sourcePath = MACOS_MCP_LAUNCHER_SOURCE,
|
|
94
|
+
outputPath,
|
|
95
|
+
}) {
|
|
96
|
+
for (const [name, value] of Object.entries({
|
|
97
|
+
sdkPath,
|
|
98
|
+
temporaryRoot,
|
|
99
|
+
sourcePath,
|
|
100
|
+
outputPath,
|
|
101
|
+
})) {
|
|
102
|
+
if (typeof value !== "string" || !path.isAbsolute(value)) {
|
|
103
|
+
throw new TypeError(`${name} must be an absolute path`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return [
|
|
107
|
+
"-std=c11",
|
|
108
|
+
"-O2",
|
|
109
|
+
"-Wall",
|
|
110
|
+
"-Wextra",
|
|
111
|
+
"-Werror",
|
|
112
|
+
"-Wno-deprecated-declarations",
|
|
113
|
+
"-mmacosx-version-min=13.0",
|
|
114
|
+
"-isysroot",
|
|
115
|
+
sdkPath,
|
|
116
|
+
"-I",
|
|
117
|
+
temporaryRoot,
|
|
118
|
+
sourcePath,
|
|
119
|
+
"-o",
|
|
120
|
+
outputPath,
|
|
121
|
+
];
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export function buildMacosMcpLauncher(outputPath, options = {}) {
|
|
125
|
+
if ((options.platform || process.platform) !== "darwin") {
|
|
126
|
+
throw new Error("macOS MCP launcher can only be compiled on macOS");
|
|
127
|
+
}
|
|
128
|
+
const inputs = loadMacosMcpLauncherBuildInputs();
|
|
129
|
+
const temporaryRoot = fs.mkdtempSync(
|
|
130
|
+
path.join(options.tmpdir || os.tmpdir(), "cc-macos-mcp-launcher-build-"),
|
|
131
|
+
);
|
|
132
|
+
try {
|
|
133
|
+
const header = path.join(temporaryRoot, "macos-mcp-launcher-generated.h");
|
|
134
|
+
fs.writeFileSync(header, generatedMacosMcpLauncherHeader(inputs), {
|
|
135
|
+
mode: 0o600,
|
|
136
|
+
});
|
|
137
|
+
const output = path.resolve(outputPath);
|
|
138
|
+
fs.mkdirSync(path.dirname(output), { recursive: true });
|
|
139
|
+
const clang = run("/usr/bin/xcrun", [
|
|
140
|
+
"--sdk",
|
|
141
|
+
"macosx",
|
|
142
|
+
"--find",
|
|
143
|
+
"clang",
|
|
144
|
+
]).stdout.trim();
|
|
145
|
+
const sdkPath = fs.realpathSync(
|
|
146
|
+
run("/usr/bin/xcrun", [
|
|
147
|
+
"--sdk",
|
|
148
|
+
"macosx",
|
|
149
|
+
"--show-sdk-path",
|
|
150
|
+
]).stdout.trim(),
|
|
151
|
+
);
|
|
152
|
+
run(
|
|
153
|
+
clang,
|
|
154
|
+
macosMcpLauncherCompilerArguments({
|
|
155
|
+
sdkPath,
|
|
156
|
+
temporaryRoot,
|
|
157
|
+
outputPath: output,
|
|
158
|
+
}),
|
|
159
|
+
);
|
|
160
|
+
fs.chmodSync(output, 0o755);
|
|
161
|
+
return Object.freeze({ output, ...inputs });
|
|
162
|
+
} finally {
|
|
163
|
+
fs.rmSync(temporaryRoot, { recursive: true, force: true });
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function parseCodesignDetails(stderr) {
|
|
168
|
+
const details = String(stderr || "");
|
|
169
|
+
const teamIdentifier = details.match(/^TeamIdentifier=(.+)$/mu)?.[1];
|
|
170
|
+
const signingIdentifier = details.match(/^Identifier=(.+)$/mu)?.[1];
|
|
171
|
+
if (!teamIdentifier || !/^[A-Z0-9]{10}$/u.test(teamIdentifier)) {
|
|
172
|
+
throw new Error("signed helper has no valid Developer ID team identifier");
|
|
173
|
+
}
|
|
174
|
+
if (signingIdentifier !== "com.chainlesschain.cli.mcp-launcher") {
|
|
175
|
+
throw new Error("signed helper identifier does not match the launcher");
|
|
176
|
+
}
|
|
177
|
+
if (!/^CodeDirectory .+ flags=.+\(runtime\)/mu.test(details)) {
|
|
178
|
+
throw new Error("signed helper does not require the hardened runtime");
|
|
179
|
+
}
|
|
180
|
+
return { teamIdentifier, signingIdentifier };
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export function createMacosMcpLauncherInstallContract({
|
|
184
|
+
helperPath,
|
|
185
|
+
expectedTeamIdentifier,
|
|
186
|
+
expectedDesignatedRequirement,
|
|
187
|
+
packageVersion,
|
|
188
|
+
platform = process.platform,
|
|
189
|
+
}) {
|
|
190
|
+
if (platform !== "darwin") {
|
|
191
|
+
throw new Error("signed helper contract can only be created on macOS");
|
|
192
|
+
}
|
|
193
|
+
if (!/^[A-Z0-9]{10}$/u.test(expectedTeamIdentifier || "")) {
|
|
194
|
+
throw new Error("expected macOS team identifier is invalid");
|
|
195
|
+
}
|
|
196
|
+
if (
|
|
197
|
+
typeof expectedDesignatedRequirement !== "string" ||
|
|
198
|
+
!expectedDesignatedRequirement.startsWith("identifier ")
|
|
199
|
+
) {
|
|
200
|
+
throw new Error("expected designated requirement is invalid");
|
|
201
|
+
}
|
|
202
|
+
if (!isMacosMcpLauncherPackageVersion(packageVersion)) {
|
|
203
|
+
throw new Error("macOS MCP launcher package version is invalid");
|
|
204
|
+
}
|
|
205
|
+
const inputs = loadMacosMcpLauncherBuildInputs();
|
|
206
|
+
const helper = path.resolve(helperPath);
|
|
207
|
+
const verification = run("/usr/bin/codesign", [
|
|
208
|
+
"--verify",
|
|
209
|
+
"--strict",
|
|
210
|
+
"--verbose=4",
|
|
211
|
+
`-R=${expectedDesignatedRequirement}`,
|
|
212
|
+
helper,
|
|
213
|
+
]);
|
|
214
|
+
const description = run("/usr/bin/codesign", ["-dvvv", helper]);
|
|
215
|
+
const signing = parseCodesignDetails(description.stderr);
|
|
216
|
+
const requirement = run("/usr/bin/codesign", [
|
|
217
|
+
"-dr",
|
|
218
|
+
"-",
|
|
219
|
+
helper,
|
|
220
|
+
]).stderr.match(/^designated => (.+)$/mu)?.[1];
|
|
221
|
+
if (
|
|
222
|
+
verification.status !== 0 ||
|
|
223
|
+
signing.teamIdentifier !== expectedTeamIdentifier ||
|
|
224
|
+
requirement !== expectedDesignatedRequirement
|
|
225
|
+
) {
|
|
226
|
+
throw new Error("helper signature does not match protected release policy");
|
|
227
|
+
}
|
|
228
|
+
const helperBytes = fs.readFileSync(helper);
|
|
229
|
+
return Object.freeze({
|
|
230
|
+
schema: MACOS_MCP_LAUNCHER_INSTALL_CONTRACT_SCHEMA,
|
|
231
|
+
protocolVersion: inputs.protocol.protocolVersion,
|
|
232
|
+
protocolSha256: inputs.protocolSha256,
|
|
233
|
+
sourceSha256: inputs.sourceSha256,
|
|
234
|
+
gateBootstrapSha256: inputs.gateBootstrapSha256,
|
|
235
|
+
helperSha256: sha256(helperBytes),
|
|
236
|
+
helperBytes: helperBytes.length,
|
|
237
|
+
packageIdentifier: inputs.protocol.packageIdentifier,
|
|
238
|
+
packageVersion,
|
|
239
|
+
helperInstallPath: inputs.protocol.helperInstallPath,
|
|
240
|
+
installContractPath: inputs.protocol.installContractPath,
|
|
241
|
+
snapshotRoot: inputs.protocol.snapshotRoot,
|
|
242
|
+
snapshotLockName: inputs.protocol.snapshotLockName,
|
|
243
|
+
sandboxExecutable: inputs.protocol.sandboxExecutable,
|
|
244
|
+
ownerUid: 0,
|
|
245
|
+
ownerGid: 0,
|
|
246
|
+
helperMode: "4555",
|
|
247
|
+
contractMode: "0444",
|
|
248
|
+
snapshotRootMode: "0711",
|
|
249
|
+
snapshotLockMode: "0600",
|
|
250
|
+
snapshotLockMechanism:
|
|
251
|
+
"root-helper-openat-o_excl-preserve-inode-across-upgrade-v1",
|
|
252
|
+
signingIdentifier: signing.signingIdentifier,
|
|
253
|
+
teamIdentifier: signing.teamIdentifier,
|
|
254
|
+
designatedRequirement: requirement,
|
|
255
|
+
hardenedRuntimeRequired: true,
|
|
256
|
+
notarizedPackageRequired: true,
|
|
257
|
+
rootInstallRequired: true,
|
|
258
|
+
runtimeSnapshotMechanism: "root-copy-hash-protected-path-ready-unlink-v1",
|
|
259
|
+
entrySnapshotMechanism:
|
|
260
|
+
"root-copy-hash-readonly-reopen-unlink-fsync-fd4-v1",
|
|
261
|
+
targetDescriptorMechanism:
|
|
262
|
+
"stdio-fd3-null-fd4-entry-fd5-null-fd6-gate-fd7-ready-bootstrap-close-v1",
|
|
263
|
+
callerLifelineFd: inputs.protocol.callerLifelineFd,
|
|
264
|
+
globalLaunchSerialization: true,
|
|
265
|
+
maximumStaleSnapshots: inputs.protocol.maximumStaleSnapshots,
|
|
266
|
+
sandboxExecLiveGateRequired: true,
|
|
267
|
+
parentDeathLiveGateRequired: true,
|
|
268
|
+
inPlaceOverwriteLiveGateRequired: true,
|
|
269
|
+
signalFloodLiveGateRequired: true,
|
|
270
|
+
snapshotLockUpgradeLiveGateRequired: true,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
function usage() {
|
|
275
|
+
throw new Error(
|
|
276
|
+
"usage: macos-mcp-launcher-build.mjs build <output> | contract <signed-helper> <team-id> <requirement> <package-version> <output.json>",
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
function main(argv = process.argv.slice(2)) {
|
|
281
|
+
if (argv[0] === "build" && argv.length === 2) {
|
|
282
|
+
const built = buildMacosMcpLauncher(argv[1]);
|
|
283
|
+
process.stdout.write(`${built.sourceSha256} ${built.output}\n`);
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
if (argv[0] === "contract" && argv.length === 6) {
|
|
287
|
+
const contract = createMacosMcpLauncherInstallContract({
|
|
288
|
+
helperPath: argv[1],
|
|
289
|
+
expectedTeamIdentifier: argv[2],
|
|
290
|
+
expectedDesignatedRequirement: argv[3],
|
|
291
|
+
packageVersion: argv[4],
|
|
292
|
+
});
|
|
293
|
+
verifyMacosMcpLauncherInstallContract(contract);
|
|
294
|
+
fs.writeFileSync(
|
|
295
|
+
path.resolve(argv[5]),
|
|
296
|
+
`${JSON.stringify(contract, null, 2)}\n`,
|
|
297
|
+
{
|
|
298
|
+
mode: 0o600,
|
|
299
|
+
},
|
|
300
|
+
);
|
|
301
|
+
process.stdout.write(`${contract.helperSha256} ${argv[5]}\n`);
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
usage();
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
if (
|
|
308
|
+
process.argv[1] &&
|
|
309
|
+
path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)
|
|
310
|
+
) {
|
|
311
|
+
try {
|
|
312
|
+
main();
|
|
313
|
+
} catch (error) {
|
|
314
|
+
process.stderr.write(`macOS MCP launcher build failed: ${error.message}\n`);
|
|
315
|
+
process.exitCode = 1;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
|
|
3
|
+
set -eu
|
|
4
|
+
|
|
5
|
+
helper='/Library/PrivilegedHelperTools/com.chainlesschain.cli.mcp-launcher'
|
|
6
|
+
contract='/Library/PrivilegedHelperTools/com.chainlesschain.cli.mcp-launcher.json'
|
|
7
|
+
base='/Library/Application Support/ChainlessChain'
|
|
8
|
+
launcher="$base/McpLauncher"
|
|
9
|
+
snapshot_root="$launcher/runtime"
|
|
10
|
+
lock="$snapshot_root/launcher.lock"
|
|
11
|
+
|
|
12
|
+
verify_directory() {
|
|
13
|
+
candidate=$1
|
|
14
|
+
expected_mode=$2
|
|
15
|
+
if [ -L "$candidate" ] || [ ! -d "$candidate" ]; then
|
|
16
|
+
echo "invalid macOS MCP launcher directory: $candidate" >&2
|
|
17
|
+
exit 77
|
|
18
|
+
fi
|
|
19
|
+
if [ "$(/usr/bin/stat -f '%u:%g:%Lp' "$candidate")" != "0:0:$expected_mode" ]; then
|
|
20
|
+
echo "untrusted macOS MCP launcher directory metadata: $candidate" >&2
|
|
21
|
+
exit 77
|
|
22
|
+
fi
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
verify_regular() {
|
|
26
|
+
candidate=$1
|
|
27
|
+
expected_mode=$2
|
|
28
|
+
if [ -L "$candidate" ] || [ ! -f "$candidate" ]; then
|
|
29
|
+
echo "invalid macOS MCP launcher member: $candidate" >&2
|
|
30
|
+
exit 77
|
|
31
|
+
fi
|
|
32
|
+
if [ "$(/usr/bin/stat -f '%u:%g:%Lp:%l' "$candidate")" != "0:0:$expected_mode:1" ]; then
|
|
33
|
+
echo "untrusted macOS MCP launcher member metadata: $candidate" >&2
|
|
34
|
+
exit 77
|
|
35
|
+
fi
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
# This script deliberately never repairs pre-existing ownership or modes. The
|
|
39
|
+
# signed pkg payload installs the helper, contract, and directories. The helper
|
|
40
|
+
# creates the lock with openat(O_CREAT|O_EXCL|O_NOFOLLOW) only when absent; an
|
|
41
|
+
# exact existing lock is verified and preserved across upgrades.
|
|
42
|
+
verify_directory '/Library' 755
|
|
43
|
+
verify_directory '/Library/PrivilegedHelperTools' 755
|
|
44
|
+
verify_directory '/Library/Application Support' 755
|
|
45
|
+
verify_directory "$base" 755
|
|
46
|
+
verify_directory "$launcher" 755
|
|
47
|
+
verify_directory "$snapshot_root" 711
|
|
48
|
+
verify_regular "$helper" 4555
|
|
49
|
+
verify_regular "$contract" 444
|
|
50
|
+
/usr/bin/codesign --verify --strict --verbose=4 "$helper"
|
|
51
|
+
"$helper" --install-lock-v1
|
|
52
|
+
verify_regular "$lock" 600
|
|
53
|
+
|
|
54
|
+
exit 0
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
|
|
3
|
+
set -eu
|
|
4
|
+
|
|
5
|
+
helper='/Library/PrivilegedHelperTools/com.chainlesschain.cli.mcp-launcher'
|
|
6
|
+
contract='/Library/PrivilegedHelperTools/com.chainlesschain.cli.mcp-launcher.json'
|
|
7
|
+
base='/Library/Application Support/ChainlessChain'
|
|
8
|
+
launcher="$base/McpLauncher"
|
|
9
|
+
snapshot_root="$launcher/runtime"
|
|
10
|
+
lock="$snapshot_root/launcher.lock"
|
|
11
|
+
|
|
12
|
+
verify_directory() {
|
|
13
|
+
candidate=$1
|
|
14
|
+
expected_mode=$2
|
|
15
|
+
optional=$3
|
|
16
|
+
if [ ! -e "$candidate" ] && [ ! -L "$candidate" ]; then
|
|
17
|
+
[ "$optional" = 1 ] && return 0
|
|
18
|
+
echo "required macOS MCP launcher parent is absent: $candidate" >&2
|
|
19
|
+
exit 77
|
|
20
|
+
fi
|
|
21
|
+
if [ -L "$candidate" ] || [ ! -d "$candidate" ]; then
|
|
22
|
+
echo "refusing untrusted macOS MCP launcher directory: $candidate" >&2
|
|
23
|
+
exit 77
|
|
24
|
+
fi
|
|
25
|
+
if [ "$(/usr/bin/stat -f '%u:%g:%Lp' "$candidate")" != "0:0:$expected_mode" ]; then
|
|
26
|
+
echo "refusing macOS MCP launcher directory metadata: $candidate" >&2
|
|
27
|
+
exit 77
|
|
28
|
+
fi
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
verify_regular_if_present() {
|
|
32
|
+
candidate=$1
|
|
33
|
+
expected_mode=$2
|
|
34
|
+
if [ ! -e "$candidate" ] && [ ! -L "$candidate" ]; then
|
|
35
|
+
return 0
|
|
36
|
+
fi
|
|
37
|
+
if [ -L "$candidate" ] || [ ! -f "$candidate" ]; then
|
|
38
|
+
echo "refusing untrusted macOS MCP launcher member: $candidate" >&2
|
|
39
|
+
exit 77
|
|
40
|
+
fi
|
|
41
|
+
if [ "$(/usr/bin/stat -f '%u:%g:%Lp:%l' "$candidate")" != "0:0:$expected_mode:1" ]; then
|
|
42
|
+
echo "refusing macOS MCP launcher member metadata: $candidate" >&2
|
|
43
|
+
exit 77
|
|
44
|
+
fi
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
# Every optional product component is either absent below a verified,
|
|
48
|
+
# non-user-writable root parent or already has the exact trusted metadata from
|
|
49
|
+
# an earlier signed install. A non-root caller therefore cannot swap it after
|
|
50
|
+
# this check; root compromise remains explicitly out of scope.
|
|
51
|
+
verify_directory '/Library' 755 0
|
|
52
|
+
verify_directory '/Library/Application Support' 755 0
|
|
53
|
+
verify_directory '/Library/PrivilegedHelperTools' 755 1
|
|
54
|
+
verify_directory "$base" 755 1
|
|
55
|
+
verify_directory "$launcher" 755 1
|
|
56
|
+
verify_directory "$snapshot_root" 711 1
|
|
57
|
+
verify_regular_if_present "$helper" 4555
|
|
58
|
+
verify_regular_if_present "$contract" 444
|
|
59
|
+
verify_regular_if_present "$lock" 600
|
|
60
|
+
|
|
61
|
+
exit 0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
7501ce7991944fc2f8f59425dd357617431dca3c12f0059d15e4ca10e63b4df7
|