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