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