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.
Files changed (252) hide show
  1. package/package.json +5 -1
  2. package/scripts/macos-mcp-launcher-build.mjs +317 -0
  3. package/scripts/macos-mcp-launcher-postinstall.sh +54 -0
  4. package/scripts/macos-mcp-launcher-preinstall.sh +61 -0
  5. package/src/assets/web-panel/assets/{AIOps-axqQfwv8.js → AIOps-D2MEn7fI.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-DV-Ro0By.js → ActionButton-lCW_4Gf0.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-Bt72WEVu.js → Analytics-Bs7i-nsS.js} +3 -3
  8. package/src/assets/web-panel/assets/{AppLayout-BtepG55E.js → AppLayout-CK7B6S_j.js} +5 -5
  9. package/src/assets/web-panel/assets/{Artifacts-B7KaJ7S_.js → Artifacts-C8ILjpyo.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-FNFaUg7A.js → Audit-Bb9cNaWc.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-DFb6J2wQ.js → BackgroundAgents-sC9ooXIf.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-CC7YBhyj.js → Backup-D-DrsplT.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-RkgTNVtj.js → BaseInput-uCNZpwSK.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-hHEmGZy-.js → Chat-CsDK1uE9.js} +6 -6
  15. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CAP9YhHv.js → ChatBubbleRenderer-OqSDt50w.js} +1 -1
  16. package/src/assets/web-panel/assets/{Checkbox-z5wXOQP1.js → Checkbox-JhTXM1-K.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-DVaDJnxy.js → Codegen-BbzZLnyD.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-CJmaRDR5.js → Col-D4VW4m4j.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-DF29_2bI.js → Community-BXrYawxV.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-DtkQkBzn.js → Compact-DCihGy1u.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-xoHDxp7I.js → Compliance-DlyZ-lk8.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-BUm-R7ht.js → Cowork-DvGZrhbO.js} +2 -2
  23. package/src/assets/web-panel/assets/{Cron-Cgl14ZkB.js → Cron-DUncZi8h.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-BNcbmoqh.js → Crosschain-C_hLuUcm.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-Bwja0Zo9.js → DID-b6YSUqxr.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-Bk5XjEdJ.js → Dashboard-uvM15Cfb.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-Ci36Oitq.js → Dropdown-D1-Nd4qY.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer--U04ZN4q.js → EmailListRenderer-8ApvL6Zc.js} +1 -1
  29. package/src/assets/web-panel/assets/{FamilyGuardDashboard-B2gNPR2s.js → FamilyGuardDashboard-LYJt8811.js} +1 -1
  30. package/src/assets/web-panel/assets/{Federation-C4KghYn7.js → Federation-BbI3HGpv.js} +1 -1
  31. package/src/assets/web-panel/assets/{FormItemContext-QL7x_Q_0.js → FormItemContext-DSoEKuFu.js} +1 -1
  32. package/src/assets/web-panel/assets/{GenericCardRenderer-F3Ryltwm.js → GenericCardRenderer-B0S9OWd5.js} +1 -1
  33. package/src/assets/web-panel/assets/{Git-2HassK5k.js → Git-DIs9Zhf3.js} +2 -2
  34. package/src/assets/web-panel/assets/{Governance-DoBIp7oe.js → Governance-jzZXrxcl.js} +1 -1
  35. package/src/assets/web-panel/assets/{Inference--W01QhZ-.js → Inference-JUPjf2ZI.js} +1 -1
  36. package/src/assets/web-panel/assets/{KnowledgeGraph-DmvwqGpT.js → KnowledgeGraph-DxnfJvlP.js} +1 -1
  37. package/src/assets/web-panel/assets/{Logs-BBJ4yAel.js → Logs-iXiz8BEE.js} +2 -2
  38. package/src/assets/web-panel/assets/{MarkdownRenderer-BLCZMzhJ.js → MarkdownRenderer-GmB6DOr6.js} +1 -1
  39. package/src/assets/web-panel/assets/{Marketplace-D5lNngSI.js → Marketplace-Y3Xch312.js} +1 -1
  40. package/src/assets/web-panel/assets/{McpTools-CkEVOMKH.js → McpTools-D7kGGbO7.js} +4 -4
  41. package/src/assets/web-panel/assets/{Memory-B1Ow1xVE.js → Memory-Do_hVxzh.js} +2 -2
  42. package/src/assets/web-panel/assets/{MobileBridge-SgYbUfb6.js → MobileBridge-CtrR0Tas.js} +1 -1
  43. package/src/assets/web-panel/assets/MobileProjects-BL0Czcoj.js +1 -0
  44. package/src/assets/web-panel/assets/{Mtc-DcTXSSma.js → Mtc-qo5QCTGd.js} +2 -2
  45. package/src/assets/web-panel/assets/{MtcAudit-Dt3WG4oj.js → MtcAudit-cq5mnjYj.js} +2 -2
  46. package/src/assets/web-panel/assets/{Multisig-B9B38UZx.js → Multisig-Bq0MAQHw.js} +3 -3
  47. package/src/assets/web-panel/assets/{NLProgramming-B0S4GGvG.js → NLProgramming-DdWE6Vi2.js} +1 -1
  48. package/src/assets/web-panel/assets/{Notes-DZ5U58Ng.js → Notes-BxMBFcIp.js} +3 -3
  49. package/src/assets/web-panel/assets/{NotificationSettings-PjL5ZW34.js → NotificationSettings-RTrAcbUe.js} +1 -1
  50. package/src/assets/web-panel/assets/{OrderTableRenderer-DrAX2ESt.js → OrderTableRenderer-DJbpGqzT.js} +1 -1
  51. package/src/assets/web-panel/assets/{Organization-Cv1GYs-c.js → Organization-SQzIPdqC.js} +4 -4
  52. package/src/assets/web-panel/assets/{Overflow-Bbkp_PL3.js → Overflow-02yECh22.js} +1 -1
  53. package/src/assets/web-panel/assets/{P2P-BD8QUgoZ.js → P2P-BNg4pNCM.js} +2 -2
  54. package/src/assets/web-panel/assets/{PdhVaultBrowser-BO-2PeaB.js → PdhVaultBrowser-BxPJZsD3.js} +3 -3
  55. package/src/assets/web-panel/assets/{Permissions-D_OPVa02.js → Permissions-CLnDnPAz.js} +4 -4
  56. package/src/assets/web-panel/assets/{PersonalDataHub-mh-pEmaB.js → PersonalDataHub-C5m0AjGf.js} +4 -4
  57. package/src/assets/web-panel/assets/{Pipeline-6JC2EDdb.js → Pipeline-VwOf5Dhv.js} +1 -1
  58. package/src/assets/web-panel/assets/{Privacy-CUshzUAG.js → Privacy-CC0W2hZd.js} +1 -1
  59. package/src/assets/web-panel/assets/{ProjectInit-Cs2Aalri.js → ProjectInit-Dz893Bob.js} +2 -2
  60. package/src/assets/web-panel/assets/{ProjectSettings-1ak49tcj.js → ProjectSettings-CxQkvl0k.js} +2 -2
  61. package/src/assets/web-panel/assets/Projects-DDAjkUkT.js +1 -0
  62. package/src/assets/web-panel/assets/{Providers-CXXxvafH.js → Providers-DeB9IkxK.js} +1 -1
  63. package/src/assets/web-panel/assets/{QrScannerModal-PTcDsF58.js → QrScannerModal-OCeoaswn.js} +1 -1
  64. package/src/assets/web-panel/assets/{QuickAsk-CDwucrJw.js → QuickAsk-DenotaAj.js} +1 -1
  65. package/src/assets/web-panel/assets/{Recommend-CJlLVRXR.js → Recommend-Cies_jjI.js} +1 -1
  66. package/src/assets/web-panel/assets/{RemoteSession-DlN-ETsO.js → RemoteSession-Dxzl5n2T.js} +3 -3
  67. package/src/assets/web-panel/assets/{Reputation-DI23LR6m.js → Reputation-CW0mvxgZ.js} +1 -1
  68. package/src/assets/web-panel/assets/{Row-Cl7UQMrM.js → Row-SEd32qZU.js} +1 -1
  69. package/src/assets/web-panel/assets/{RssFeed-CexHNfh8.js → RssFeed-BSwnJ3Lm.js} +3 -3
  70. package/src/assets/web-panel/assets/{Search-BneBWvRN.js → Search-xe2m8bkC.js} +1 -1
  71. package/src/assets/web-panel/assets/{Security-DX7Phgrp.js → Security-Mq2F9Nro.js} +4 -4
  72. package/src/assets/web-panel/assets/{Services-BWXO8Mte.js → Services-BKGw2V3P.js} +2 -2
  73. package/src/assets/web-panel/assets/{Skeleton-DCyOjKPJ.js → Skeleton-DW95-Rxf.js} +1 -1
  74. package/src/assets/web-panel/assets/{Skills-CXqERsTB.js → Skills-CHgChCv_.js} +1 -1
  75. package/src/assets/web-panel/assets/{Sla-bhbrbz8E.js → Sla-tKh6k3R7.js} +1 -1
  76. package/src/assets/web-panel/assets/{SpeechSettings-3IPU0HBZ.js → SpeechSettings-D6UL3dA5.js} +1 -1
  77. package/src/assets/web-panel/assets/{SyncSettings-DBNTQLbM.js → SyncSettings-D0Fw8fVL.js} +2 -2
  78. package/src/assets/web-panel/assets/{Tasks-quP0bkN-.js → Tasks-20x1GB3D.js} +1 -1
  79. package/src/assets/web-panel/assets/{Templates-BouWmgho.js → Templates-DJ-lts-a.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tenant-qv0D9s7z.js → Tenant-BFdGpbs7.js} +1 -1
  81. package/src/assets/web-panel/assets/{Terminal-BxvbE8BB.js → Terminal-Xpx61vHL.js} +2 -2
  82. package/src/assets/web-panel/assets/{TimelineRenderer-D-IeLnJ2.js → TimelineRenderer-C6UIvyZQ.js} +1 -1
  83. package/src/assets/web-panel/assets/{Tokens-CFMKKyVG.js → Tokens-Dellq08f.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trigger-L8as3UuJ.js → Trigger-VKw8d0J-.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trust-MxmA4VZG.js → Trust-DNftdKT5.js} +1 -1
  86. package/src/assets/web-panel/assets/{UkeySign-C0VvJYRi.js → UkeySign-DX9VAKJI.js} +1 -1
  87. package/src/assets/web-panel/assets/{VideoEditing-Bf5QZj8N.js → VideoEditing-B2h3jO8q.js} +1 -1
  88. package/src/assets/web-panel/assets/{Wallet-BIJ9riRz.js → Wallet-CjGkof7f.js} +4 -4
  89. package/src/assets/web-panel/assets/{WebAuthn-B8p9Mhkw.js → WebAuthn-2Zfcu55P.js} +4 -4
  90. package/src/assets/web-panel/assets/{WorkflowEditor-BVsuaPen.js → WorkflowEditor-B9eZ8UxZ.js} +1 -1
  91. package/src/assets/web-panel/assets/{chat-BfkjoKpV.js → chat-CQNfD-YO.js} +1 -1
  92. package/src/assets/web-panel/assets/{colors-DeAlsWK8.js → colors-D4usyFT2.js} +1 -1
  93. package/src/assets/web-panel/assets/{compact-item-Cs97bz5j.js → compact-item-s4TpjvjX.js} +1 -1
  94. package/src/assets/web-panel/assets/{createContext-BqbG60LH.js → createContext-BRCSvYxj.js} +1 -1
  95. package/src/assets/web-panel/assets/devWarning-DKJjSWRn.js +1 -0
  96. package/src/assets/web-panel/assets/{hasIn-i_RY0b1X.js → hasIn-AdkUbkV-.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-BOVkf1K3.js → index--00U6vXZ.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-B-3tEpTc.js → index-B2V-eKfK.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-D2B4VPyP.js → index-B4JJCfQ2.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BkBi5TmC.js → index-BIoG5yYf.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-79V_zv1s.js → index-BMcimU-2.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-U4f5izHz.js → index-BPhkFZ1I.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DiSkx4UB.js → index-BQ3DXBtD.js} +3 -3
  104. package/src/assets/web-panel/assets/{index-dIHr4B_u.js → index-Bad4VNvz.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CIG8fQ2_.js → index-BgiXR_-_.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DqBgBpgp.js → index-BtobShro.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-ZxO_-E8a.js → index-Bw2MEnUk.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DUUrv141.js → index-C1mJtE6q.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Bm7lLR4c.js → index-C484EJiS.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-COdGA-8n.js → index-C5KAQFPQ.js} +1 -1
  111. package/src/assets/web-panel/assets/index-C61cnl3K.js +1 -0
  112. package/src/assets/web-panel/assets/{index-CED2PL_y.js → index-C7Y8Aluc.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-YXgLng0K.js → index-CCsM_Ybx.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-0-agYlWL.js → index-CJCFe2Qf.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-B5UkyA3c.js → index-CJVEOa4i.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-B1CbOH1i.js → index-CJdQrZth.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-s1opAL-M.js → index-CKC1t3Ic.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-yObj1O4n.js → index-CQhAVU5t.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CgsqdnRV.js → index-CYdoQsa1.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Dk7-v4hP.js → index-Cduu2Hhr.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-B-JVTrpr.js → index-CkwiSLhU.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-CeWoNHau.js → index-Cvyt-zhm.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CE2VtTlp.js → index-D2GjI2oe.js} +1 -1
  124. package/src/assets/web-panel/assets/index-D4XFHxBr.js +1 -0
  125. package/src/assets/web-panel/assets/{index-DmbfhJUP.js → index-DARsAyUp.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BESLFt4q.js → index-DVKfQ0Ux.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-PT_5sBMA.js → index-DZT36ZYq.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-gyFpvL7l.js → index-D_XBHopw.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BYUVuwKt.js → index-DdCB70SS.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-BcUXAB2s.js → index-DzRjHxEv.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-Dk2qouAz.js → index-MMN9V6JF.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-D9evtvg2.js → index-RfMr79MW.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-BuLQobzW.js → index-_IRVsV9X.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-Cf3WCLmy.js → index-nXyk8GZ9.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-CG3PRyAL.js → index-s_buFMEG.js} +1 -1
  136. package/src/assets/web-panel/assets/{initDefaultProps-C9h9yKL3.js → initDefaultProps-Blmpk7HL.js} +1 -1
  137. package/src/assets/web-panel/assets/{motion-BvmLsPdu.js → motion-DPBJMv1n.js} +1 -1
  138. package/src/assets/web-panel/assets/{move-CoL4ekU1.js → move-ButdzCM7.js} +1 -1
  139. package/src/assets/web-panel/assets/{mtc-parser-C4pMy6xV.js → mtc-parser-cyRC_QCe.js} +1 -1
  140. package/src/assets/web-panel/assets/{omit-DPuJfNxx.js → omit-1epSV7hz.js} +1 -1
  141. package/src/assets/web-panel/assets/{pickAttrs-D0KEeaK2.js → pickAttrs-DuPY8xJs.js} +1 -1
  142. package/src/assets/web-panel/assets/{placementArrow-BpkyINxt.js → placementArrow-6XZqarhe.js} +1 -1
  143. package/src/assets/web-panel/assets/{responsiveObserve-DQI_wOq8.js → responsiveObserve-B40pXBWM.js} +1 -1
  144. package/src/assets/web-panel/assets/{slide-DYfdDiRg.js → slide-jbZ9Wu4n.js} +1 -1
  145. package/src/assets/web-panel/assets/{statusUtils-B5dtvb0D.js → statusUtils-BKQQcVy4.js} +1 -1
  146. package/src/assets/web-panel/assets/{styleChecker-CF310mSj.js → styleChecker-NiKfWjUT.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFlexGapSupport-D1Qp4BLp.js → useFlexGapSupport-bQUCvPeb.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFs-C7_iyvJK.js → useFs-CUGji7ph.js} +1 -1
  149. package/src/assets/web-panel/assets/{usePersonalDataHub-DZUt_fIm.js → usePersonalDataHub-4veyN2N2.js} +1 -1
  150. package/src/assets/web-panel/assets/{vnode-D3dsi0lZ.js → vnode-1-nLug-Z.js} +1 -1
  151. package/src/assets/web-panel/assets/{zoom-WdbOlvdQ.js → zoom-dhCeRDMo.js} +1 -1
  152. package/src/assets/web-panel/index.html +1 -1
  153. package/src/command-help-index.json +6 -6
  154. package/src/commands/automation.js +103 -1
  155. package/src/commands/cowork.js +174 -19
  156. package/src/commands/permissions.js +240 -16
  157. package/src/commands/plugin.js +1293 -56
  158. package/src/commands/session-location.js +276 -0
  159. package/src/commands/session.js +2 -0
  160. package/src/commands/team-merge-review.js +937 -0
  161. package/src/commands/team.js +2 -0
  162. package/src/data/changelog.json +27 -1
  163. package/src/gateways/ws/action-protocol.js +35 -10
  164. package/src/gateways/ws/remote-session-protocol.js +24 -1
  165. package/src/gateways/ws/ws-agent-handler.js +12 -0
  166. package/src/gateways/ws/ws-server.js +48 -12
  167. package/src/harness/jsonl-session-store.js +341 -24
  168. package/src/harness/mcp-client.js +8 -1
  169. package/src/harness/remote-session-audit.js +1 -0
  170. package/src/harness/remote-session-crypto.js +210 -2
  171. package/src/harness/remote-session-registry.js +159 -6
  172. package/src/harness/session-list-index.js +233 -14
  173. package/src/lib/agent-authority.js +6 -0
  174. package/src/lib/agent-schedule-store.js +139 -28
  175. package/src/lib/agent-team/team-merge-review-store.js +765 -0
  176. package/src/lib/agent-team/team-merge-review-transaction.js +1223 -0
  177. package/src/lib/agent-team/team-merge-review.js +1847 -0
  178. package/src/lib/automation-center-incidents.js +314 -0
  179. package/src/lib/automation-center-runtime.js +448 -0
  180. package/src/lib/automation-center.js +182 -38
  181. package/src/lib/automation-engine.js +41 -0
  182. package/src/lib/automation-execution-authority.js +241 -12
  183. package/src/lib/automation-execution-incident.js +737 -0
  184. package/src/lib/background-agent-keeper-client.js +248 -0
  185. package/src/lib/background-agent-keeper-protocol.js +147 -0
  186. package/src/lib/background-agent-supervisor.js +520 -40
  187. package/src/lib/background-interaction-resolver.js +12 -0
  188. package/src/lib/background-turn-bootstrap-protocol.js +126 -0
  189. package/src/lib/cowork-cron.js +85 -14
  190. package/src/lib/cowork-workflow.js +336 -16
  191. package/src/lib/dynamic-workflow-facade.js +648 -0
  192. package/src/lib/execution-location-contract.js +551 -0
  193. package/src/lib/execution-location-runtime.js +130 -0
  194. package/src/lib/ide-context.js +94 -6
  195. package/src/lib/mcp-stdio-package-materialization.js +166 -14
  196. package/src/lib/packer/pkg-config-generator.js +2 -0
  197. package/src/lib/permission-authority.js +77 -0
  198. package/src/lib/permission-side-effect-center.js +495 -0
  199. package/src/lib/plugin-runtime/install.js +514 -13
  200. package/src/lib/plugin-runtime/marketplace-artifact-readback.js +900 -0
  201. package/src/lib/plugin-runtime/marketplace-catalog.js +1181 -0
  202. package/src/lib/plugin-runtime/marketplace-impact.js +408 -0
  203. package/src/lib/plugin-runtime/marketplace-remote-artifacts.js +1567 -0
  204. package/src/lib/plugin-security.js +60 -3
  205. package/src/lib/process-execution-broker/index.js +1095 -57
  206. package/src/lib/process-execution-broker/linux-bwrap-descriptor-launch.js +375 -0
  207. package/src/lib/process-execution-broker/linux-generic-bwrap-runtime.js +90 -16
  208. package/src/lib/process-execution-broker/linux-generic-bwrap.js +159 -18
  209. package/src/lib/process-execution-broker/macos-mcp-launcher-contract.js +278 -0
  210. package/src/lib/process-execution-broker/macos-mcp-launcher-protocol.json +23 -0
  211. package/src/lib/process-execution-broker/macos-mcp-launcher.c +1497 -0
  212. package/src/lib/process-execution-broker/mcp-fd-entry-bootstrap.js +37 -0
  213. package/src/lib/process-execution-broker/platform-sandbox.js +2330 -279
  214. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  215. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  216. package/src/lib/process-execution-broker/windows-sandbox.cs +50 -4
  217. package/src/lib/public-ide-capability-manifest.js +3 -0
  218. package/src/lib/remote-approval-bridge.js +123 -17
  219. package/src/lib/remote-membership-authority.js +632 -0
  220. package/src/lib/remote-membership-coordinator.js +2409 -0
  221. package/src/lib/remote-membership-host-store.js +1750 -0
  222. package/src/lib/scheduler-kernel/agenda-adapter.js +17 -7
  223. package/src/lib/scheduler-kernel/automation-adapter.js +105 -11
  224. package/src/lib/scheduler-kernel/automation-event-adapter.js +87 -11
  225. package/src/lib/scheduler-kernel/contract.js +91 -0
  226. package/src/lib/scheduler-kernel/cowork-cron-adapter.js +12 -1
  227. package/src/lib/scheduler-kernel/loop-adapter.js +7 -1
  228. package/src/lib/scheduler-kernel/routine-adapter.js +7 -1
  229. package/src/lib/scheduler-kernel/runtime-control-capabilities.js +31 -0
  230. package/src/lib/scheduler-kernel/runtime.js +176 -3
  231. package/src/lib/scheduler-kernel/store.js +1253 -45
  232. package/src/lib/scoped-permission-store.js +369 -0
  233. package/src/lib/session-anti-rollback-anchor.js +262 -5
  234. package/src/lib/sub-agent-context.js +4 -0
  235. package/src/lib/workflow-definition-contract.js +149 -0
  236. package/src/repl/agent-repl.js +41 -7
  237. package/src/repl/chat-repl.js +2 -0
  238. package/src/repl/clipboard-image.js +735 -16
  239. package/src/repl/ide-status.js +1 -1
  240. package/src/repl/prompt-interactions.js +59 -6
  241. package/src/runtime/agent-core.js +93 -3
  242. package/src/runtime/headless-runner.js +30 -25
  243. package/src/runtime/headless-stream.js +32 -25
  244. package/src/runtime/mcp-config.js +81 -10
  245. package/src/workers/background-agent-keeper.js +498 -0
  246. package/src/workers/background-agent-worker.js +358 -13
  247. package/src/workers/background-turn-bootstrap.js +143 -0
  248. package/src/assets/web-panel/assets/MobileProjects-BWdOvQAj.js +0 -1
  249. package/src/assets/web-panel/assets/Projects-BV4oApsm.js +0 -1
  250. package/src/assets/web-panel/assets/devWarning-DPty0mGN.js +0 -1
  251. package/src/assets/web-panel/assets/index-Bt7g0Vq_.js +0 -1
  252. package/src/assets/web-panel/assets/index-ChVT0p9u.js +0 -1
@@ -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
- // `@selection` / `@diagnostics` / `@terminal` preceded by start / whitespace /
761
- // opening bracket-quote (so `foo@selection` and email-like text never match),
762
- // each taken as a whole word.
763
- const IDE_MENTION_RE = /(^|[\s("'`[{])@(selection|diagnostics|terminal)\b/gi;
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
- * Expand `@selection` / `@diagnostics` / `@terminal` mentions found in `text`
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/v3";
40
- const MATERIALIZATION_VERSION = 3;
41
- const CAPSULE_SCHEMA = "chainlesschain.mcp-stdio-node-capsule/v2";
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-v3"),
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-v3.json",
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 allowed = new Set(Module.builtinModules.flatMap((name) => [name, name.startsWith("node:") ? name : "node:" + name]));
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" ? "CC_MCP_STDIO_NATIVE_MODULE_BLOCKED" : "CC_MCP_STDIO_EXTERNAL_MODULE_BLOCKED";
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
- if (typeof request !== "string" || !allowed.has(request)) blocked("external module loading", request);
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
- if (typeof request !== "string" || !allowed.has(request)) blocked("external module resolution", request);
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 output = Buffer.from(
1322
- result.output.buffer,
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: Object.freeze([...new Set(externalBuiltins)].sort()),
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
+ }