chainlesschain 0.163.8 → 0.165.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/package.json +7 -4
  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/.build-hash +1 -1
  6. package/src/assets/web-panel/assets/{AIOps-CavM7W3k.js → AIOps-CYxFDrcm.js} +1 -1
  7. package/src/assets/web-panel/assets/{ActionButton-CUvZGabQ.js → ActionButton-CPBtdiU2.js} +1 -1
  8. package/src/assets/web-panel/assets/{Analytics-DeBnWnbe.js → Analytics-Dayq7Dp7.js} +3 -3
  9. package/src/assets/web-panel/assets/{AppLayout-DbI5kxvd.js → AppLayout-6U7bPb2s.js} +4 -4
  10. package/src/assets/web-panel/assets/{Artifacts-D93bigKm.js → Artifacts-D2Iqg_3D.js} +1 -1
  11. package/src/assets/web-panel/assets/{Audit-CBNvfUZa.js → Audit-CdoOB7WV.js} +1 -1
  12. package/src/assets/web-panel/assets/{BackgroundAgents-CJLyh_YU.js → BackgroundAgents-DrnAVB8w.js} +1 -1
  13. package/src/assets/web-panel/assets/{Backup-D_0yoehD.js → Backup-CesMi5cy.js} +1 -1
  14. package/src/assets/web-panel/assets/{BaseInput-TJxmbObW.js → BaseInput-DaX9ptax.js} +1 -1
  15. package/src/assets/web-panel/assets/{Chat-CE0dto1q.js → Chat-OrwOPxDS.js} +5 -5
  16. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CZ5-yYiD.js → ChatBubbleRenderer-CvPZFRxM.js} +1 -1
  17. package/src/assets/web-panel/assets/{Checkbox-Ck1RVIVo.js → Checkbox-DiHbcysC.js} +1 -1
  18. package/src/assets/web-panel/assets/{Codegen-qpoyf6DK.js → Codegen-CbgCkaBJ.js} +1 -1
  19. package/src/assets/web-panel/assets/{Col-DUyPWjIE.js → Col-Du5hgrh4.js} +1 -1
  20. package/src/assets/web-panel/assets/{Community-D_S1BemS.js → Community-DsPOBW-p.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compact-BjxeK-Gc.js → Compact-BwHIFkNC.js} +1 -1
  22. package/src/assets/web-panel/assets/{Compliance-Dd3CEJsu.js → Compliance-BvrDQSgd.js} +1 -1
  23. package/src/assets/web-panel/assets/{Cowork-B4QG7-ad.js → Cowork-gwAE6arx.js} +3 -3
  24. package/src/assets/web-panel/assets/{Cron-BtZnids5.js → Cron-DW-0l4uF.js} +2 -2
  25. package/src/assets/web-panel/assets/{Crosschain-CHPfCBFD.js → Crosschain-j-NsLesB.js} +1 -1
  26. package/src/assets/web-panel/assets/{DID-DT8DCEOK.js → DID-CibVEBOI.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dashboard-COQab5_U.js → Dashboard-W4z9vSfe.js} +2 -2
  28. package/src/assets/web-panel/assets/{Dropdown-BY1PsQuU.js → Dropdown-DAcrkKxG.js} +1 -1
  29. package/src/assets/web-panel/assets/{EmailListRenderer-CsuAuaq3.js → EmailListRenderer-6GXah-89.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-BqpinD-j.js → FamilyGuardDashboard-TKDCq8Ku.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-D0gkfQFv.js → Federation-BXBLlcNm.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-BqgE-axK.js → FormItemContext-BoJJBkG3.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-D0hJ2KvC.js → GenericCardRenderer-okjsl46v.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-CmMB0uPY.js → Git-Rvs7i6nn.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-BnVEI0Dk.js → Governance-CHSUxXXS.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-YTAMihRP.js → Inference-V3BlfxsB.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-0ax7VHop.js → KnowledgeGraph-C_NlD4aR.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-B9TRcokL.js → Logs-Nn4LNxhA.js} +2 -2
  39. package/src/assets/web-panel/assets/MarkdownRenderer-SVAgNnkt.js +1 -0
  40. package/src/assets/web-panel/assets/{Marketplace-B6CSuD_H.js → Marketplace-DEmjFcg-.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-CjMXvOVU.js → McpTools-DlopXipI.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-CXRF71U3.js → Memory-BG3ynX60.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-DQgNp_oS.js → MobileBridge-DeRzWOfT.js} +1 -1
  44. package/src/assets/web-panel/assets/{MobileProjects-DlPwcCbq.js → MobileProjects-Tyd3o2A0.js} +1 -1
  45. package/src/assets/web-panel/assets/{Mtc-6hDTRPe1.js → Mtc-BoPbOv1C.js} +2 -2
  46. package/src/assets/web-panel/assets/{MtcAudit-BlVHU1DS.js → MtcAudit-un-rTHp7.js} +2 -2
  47. package/src/assets/web-panel/assets/{Multisig-DP9pzEbV.js → Multisig-Ds0oveEB.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-Djorh8EV.js → NLProgramming-D09JI-yY.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-oLZ-JkUg.js → Notes-DTRhiKJn.js} +4 -4
  50. package/src/assets/web-panel/assets/{NotificationSettings-Cg288VH3.js → NotificationSettings-BAnnNCim.js} +1 -1
  51. package/src/assets/web-panel/assets/OrderTableRenderer-Yr-1fSYi.js +1 -0
  52. package/src/assets/web-panel/assets/{Organization-CBdo-bHs.js → Organization-S9EAolpj.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-qZdnVumx.js → Overflow-CqcLKqJ8.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-D4kNfGNQ.js → P2P-Dw0F9EcU.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-DnlMemM7.js → PdhVaultBrowser-BDRwUevN.js} +5 -5
  56. package/src/assets/web-panel/assets/{Permissions-DHucHFBJ.js → Permissions-D3_c3nKB.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-BovlOIPR.js → PersonalDataHub-CxdMV98x.js} +4 -4
  58. package/src/assets/web-panel/assets/{Pipeline-Deru3CQY.js → Pipeline-CgjNQFLI.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-Bq5oTTbU.js → Privacy-BHghIIht.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-BfzxVWAz.js → ProjectInit-De6pqaKM.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-CKC6XBtH.js → ProjectSettings-Bg4ZkNYQ.js} +2 -2
  62. package/src/assets/web-panel/assets/Projects-CP8vPvzs.js +1 -0
  63. package/src/assets/web-panel/assets/{Providers-C_jx4TWX.js → Providers-CUnHbNf-.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-BdIHeVGC.js → QrScannerModal-DA2f3Wts.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-BwZwAcPD.js → QuickAsk-C1FeHDqp.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-BNTt0L-m.js → Recommend-B5guaUMN.js} +1 -1
  67. package/src/assets/web-panel/assets/RemoteSession-PDADSds3.js +5 -0
  68. package/src/assets/web-panel/assets/{Reputation-D6VpG32B.js → Reputation-eTlRhgvK.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-D_74OvQQ.js → Row-D7AqSGY0.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-BTr0a-BQ.js → RssFeed-JiuLm4Ja.js} +3 -3
  71. package/src/assets/web-panel/assets/{Search-C3MCFoNU.js → Search-CwruahW3.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-CqW9aJ6s.js → Security-CdhqaR0b.js} +4 -4
  73. package/src/assets/web-panel/assets/{Services-Cw5GNaHF.js → Services-CU0ZIlcT.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-DZps5qeY.js → Skeleton-CtduPfAb.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-C6NQ1znT.js → Skills-CROXm6AY.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-DFP8G2Sh.js → Sla-DiZiABFD.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-ESt6MB6v.js → SpeechSettings-B5pLcXUw.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-BHnN98aM.js → SyncSettings-DBX6J1Oe.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-NiSCaOf-.js → Tasks-BLyRJd3-.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-DsKFhW2C.js → Templates-BKa5qzmk.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-CQ0E0ze5.js → Tenant-DnD3a4M6.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-D_rBu_by.js → Terminal-DEitQeTb.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-D3Vm4Po4.js → TimelineRenderer-CjHggTDq.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-DNTxRH6q.js → Tokens-CsGT7sfl.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-Dgprz1ms.js → Trigger-yr4rFDrW.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-B2rUnVBD.js → Trust-CLvu1Sjp.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-DEGQNc6_.js → UkeySign-B0m7yUP8.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-jlsAx3Eh.js → VideoEditing-C0VvP4lc.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-8jQih1ij.js → Wallet-kllBAG1M.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-XLeO6xIB.js → WebAuthn-C54UQNLx.js} +3 -3
  91. package/src/assets/web-panel/assets/{WorkflowEditor-De_dgDAG.js → WorkflowEditor-B7y8qSvU.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-CI19R_Sk.js → chat-DRzTh8CJ.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-DsYTOYN3.js → colors-BSMwSnCx.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-CM3-t_Qr.js → compact-item-BTg602H5.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-BjxlBRZv.js → createContext-B6EGsdvp.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-Dol8jLEP.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-RDaWX_4i.js → hasIn-DDKqJ8RD.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-nAH87mQP.js → index-323Hhxxt.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DIUnNOjG.js → index-BICn3Qh1.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DyIWssPC.js → index-BMuGd2--.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DX7tuWVJ.js → index-BRqt4fO-.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Cd3euP_4.js → index-BVTAl5N2.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-Cpqm1qfU.js → index-BsR7Y2NG.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DcPFB8qJ.js → index-Bx044qDj.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Cd9OJhHG.js → index-C1GFfuqN.js} +1 -1
  106. package/src/assets/web-panel/assets/index-C3QX5tOl.js +1 -0
  107. package/src/assets/web-panel/assets/{index-B-Z8eFUJ.js → index-C66NpWy5.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BlT2VAEK.js → index-CDTvsX8t.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Dsij_KsN.js → index-CGNklbP6.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-C4gkzxkw.js → index-CHfLYwcW.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-D6sm5-Xq.js → index-CNxg61YP.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-C0yx-jtQ.js → index-CQlHFN_g.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CjTrRt13.js → index-CUEU48o1.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-B7WBt_4T.js → index-CWGax2QW.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-IeiL9RKc.js → index-C_JzIXUq.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CnHH7bnD.js → index-Cf23wVMs.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BKJr-TZp.js → index-CmAInUkX.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CiECJi-Q.js → index-CmAubjDi.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BCnZyIMA.js → index-Co7oM1qr.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Drlnwr8F.js → index-CwPUZbMI.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-9R6BxAr0.js → index-D1naNj4U.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-BGqqJfL0.js → index-D5CsBShd.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-Bi46Xu4u.js → index-DBT3YeQ9.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DXXtGMUJ.js → index-DLdrHhML.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-B0PMlbMs.js → index-Dc77VR3H.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-D0zcy54x.js → index-Dfv2lKu3.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-BN6UPD2E.js → index-DiW0sDkz.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-Dxge-xWl.js → index-DpTHIRfZ.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CyOGN6a5.js → index-DqFXGzzC.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-B9O9YyWE.js → index-XFe-1twF.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-BHNYPO0b.js → index-p2HYn89m.js} +3 -3
  132. package/src/assets/web-panel/assets/{index-CVQMeiwH.js → index-pqfux8vZ.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-pPL66J85.js → index-rjzk9z1Q.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-DoQA0-52.js → index-th2ihDc0.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-B5REnKt8.js → index-u2YVld9W.js} +1 -1
  136. package/src/assets/web-panel/assets/index-xYybvEic.js +1 -0
  137. package/src/assets/web-panel/assets/{initDefaultProps-BTL88of4.js → initDefaultProps-C3Djh9fa.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-BUB2pXwB.js → motion-BzqFmbSe.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-egCkkOMm.js → move-DJo_FFaW.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-DAWhZC8c.js → mtc-parser-_tlTiBvk.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-CvOxe_6d.js → omit-CB2ZyxUg.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-DZUSLZ5Z.js → pickAttrs-DZwIFD4u.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-BERxGNMY.js → placementArrow-DxZY0dgk.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-DZuDfZ9n.js → responsiveObserve-CzzGt7GL.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-DO756sgI.js → slide-BaIK52yz.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-BRQlIz28.js → statusUtils-3-FHu9_M.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-DCSfdybl.js → styleChecker-BkRT68fK.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-LD8dWVve.js → useFlexGapSupport-DHYwKS-s.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-BX9uW2LK.js → useFs-DVVUhV8p.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-BPSlPuHU.js → usePersonalDataHub-CkrFKAzQ.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-BmOILC9V.js → vnode-BuBLFz0c.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-1iKowKGg.js → zoom-kpm6LtXU.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/command-help-index.json +3 -3
  155. package/src/commands/cowork.js +418 -41
  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/data/changelog.json +28 -2
  161. package/src/gateways/ws/action-protocol.js +316 -17
  162. package/src/gateways/ws/message-dispatcher.js +30 -0
  163. package/src/gateways/ws/remote-session-protocol.js +565 -35
  164. package/src/gateways/ws/ws-agent-handler.js +12 -0
  165. package/src/gateways/ws/ws-approval-gate.js +5 -0
  166. package/src/gateways/ws/ws-server.js +510 -50
  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 +2 -0
  170. package/src/harness/remote-session-crypto.js +929 -21
  171. package/src/harness/remote-session-registry.js +945 -24
  172. package/src/harness/session-list-index.js +233 -14
  173. package/src/lib/agent-authority.js +6 -0
  174. package/src/lib/auto-mode-config.js +98 -3
  175. package/src/lib/background-agent-keeper-client.js +248 -0
  176. package/src/lib/background-agent-keeper-protocol.js +291 -0
  177. package/src/lib/background-agent-supervisor.js +1357 -85
  178. package/src/lib/background-interaction-resolver.js +12 -0
  179. package/src/lib/background-session-transport.js +23 -6
  180. package/src/lib/background-turn-bootstrap-protocol.js +190 -0
  181. package/src/lib/cowork-workflow.js +1188 -76
  182. package/src/lib/delivery-production-adapter.js +38 -2
  183. package/src/lib/dynamic-workflow-facade.js +1736 -0
  184. package/src/lib/execution-location-contract.js +551 -0
  185. package/src/lib/execution-location-runtime.js +130 -0
  186. package/src/lib/ide-context.js +94 -6
  187. package/src/lib/mcp-stdio-package-materialization.js +166 -14
  188. package/src/lib/packer/pkg-config-generator.js +2 -0
  189. package/src/lib/permission-authority.js +77 -0
  190. package/src/lib/permission-side-effect-center.js +495 -0
  191. package/src/lib/plugin-runtime/install.js +514 -13
  192. package/src/lib/plugin-runtime/marketplace-artifact-readback.js +900 -0
  193. package/src/lib/plugin-runtime/marketplace-catalog.js +1181 -0
  194. package/src/lib/plugin-runtime/marketplace-impact.js +408 -0
  195. package/src/lib/plugin-runtime/marketplace-remote-artifacts.js +1567 -0
  196. package/src/lib/plugin-security.js +60 -3
  197. package/src/lib/process-execution-broker/index.js +1095 -57
  198. package/src/lib/process-execution-broker/linux-bwrap-descriptor-launch.js +375 -0
  199. package/src/lib/process-execution-broker/linux-generic-bwrap-runtime.js +90 -16
  200. package/src/lib/process-execution-broker/linux-generic-bwrap.js +159 -18
  201. package/src/lib/process-execution-broker/macos-mcp-launcher-contract.js +278 -0
  202. package/src/lib/process-execution-broker/macos-mcp-launcher-protocol.json +23 -0
  203. package/src/lib/process-execution-broker/macos-mcp-launcher.c +1497 -0
  204. package/src/lib/process-execution-broker/mcp-fd-entry-bootstrap.js +37 -0
  205. package/src/lib/process-execution-broker/platform-sandbox.js +2330 -279
  206. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  207. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  208. package/src/lib/process-execution-broker/windows-sandbox.cs +50 -4
  209. package/src/lib/public-ide-capability-manifest.js +3 -0
  210. package/src/lib/remote-approval-bridge.js +777 -34
  211. package/src/lib/remote-control.js +2 -0
  212. package/src/lib/remote-membership-authority.js +632 -0
  213. package/src/lib/remote-membership-coordinator.js +2973 -0
  214. package/src/lib/remote-membership-host-store.js +1799 -0
  215. package/src/lib/runtime-provenance-ledger.js +171 -46
  216. package/src/lib/scoped-permission-store.js +369 -0
  217. package/src/lib/session-anti-rollback-anchor.js +262 -5
  218. package/src/lib/shell-approval.js +169 -6
  219. package/src/lib/sub-agent-context.js +4 -0
  220. package/src/lib/with-file-lock.js +73 -38
  221. package/src/lib/workflow-definition-contract.js +149 -0
  222. package/src/repl/agent-repl.js +111 -36
  223. package/src/repl/chat-repl.js +2 -0
  224. package/src/repl/clipboard-image.js +735 -16
  225. package/src/repl/ide-status.js +1 -1
  226. package/src/repl/prompt-interactions.js +59 -6
  227. package/src/repl/remote-approval.js +29 -7
  228. package/src/runtime/agent-core.js +1182 -155
  229. package/src/runtime/headless-runner.js +52 -30
  230. package/src/runtime/headless-stream.js +51 -28
  231. package/src/workers/background-agent-keeper.js +689 -0
  232. package/src/workers/background-agent-worker.js +365 -13
  233. package/src/workers/background-turn-bootstrap.js +170 -0
  234. package/src/assets/web-panel/assets/MarkdownRenderer-yySN5YNM.js +0 -1
  235. package/src/assets/web-panel/assets/OrderTableRenderer-Bb1O3Ofr.js +0 -1
  236. package/src/assets/web-panel/assets/Projects-CMolGhae.js +0 -1
  237. package/src/assets/web-panel/assets/RemoteSession-Biyn2-Ro.js +0 -5
  238. package/src/assets/web-panel/assets/devWarning-S1ld2LwU.js +0 -1
  239. package/src/assets/web-panel/assets/index-Drz6yq0m.js +0 -1
  240. package/src/assets/web-panel/assets/index-uWiUs7S_.js +0 -1
@@ -296,6 +296,169 @@ function _sendError(server, ws, id, code, message) {
296
296
  server._send(ws, { id, type: "error", code, message });
297
297
  }
298
298
 
299
+ const WORKFLOW_EXECUTION_AUTHORITY_SCHEMA =
300
+ "cc-session-execution-location-authority/v1";
301
+ const WORKFLOW_FORBIDDEN_EXECUTION_INPUT_KEYS = new Set([
302
+ "execution",
303
+ "llmoptions",
304
+ "provider",
305
+ "model",
306
+ "apikey",
307
+ "token",
308
+ "password",
309
+ "secret",
310
+ "credential",
311
+ "credentials",
312
+ "credentialvalue",
313
+ "credentialvalues",
314
+ ]);
315
+
316
+ function hasForbiddenWorkflowExecutionInput(value, seen = new WeakSet()) {
317
+ if (!value || typeof value !== "object") return false;
318
+ if (seen.has(value)) return true;
319
+ seen.add(value);
320
+ for (const key of Reflect.ownKeys(value)) {
321
+ if (typeof key !== "string") return true;
322
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
323
+ if (!descriptor || !Object.hasOwn(descriptor, "value")) return true;
324
+ const normalizedKey = key
325
+ .replaceAll("_", "")
326
+ .replaceAll("-", "")
327
+ .toLowerCase();
328
+ if (WORKFLOW_FORBIDDEN_EXECUTION_INPUT_KEYS.has(normalizedKey)) {
329
+ return true;
330
+ }
331
+ if (hasForbiddenWorkflowExecutionInput(descriptor.value, seen)) {
332
+ return true;
333
+ }
334
+ }
335
+ return false;
336
+ }
337
+
338
+ function _sendWorkflowBlocked(server, ws, id, details = {}) {
339
+ server._send(ws, {
340
+ id,
341
+ type: "workflow:blocked",
342
+ code: details.code || "WORKFLOW_RUN_BLOCKED",
343
+ message: details.message || "workflow execution was blocked",
344
+ workflowId: details.workflowId,
345
+ definitionDigest: details.definitionDigest || null,
346
+ admissionDigest: details.admissionDigest || null,
347
+ preflightDigest: details.preflightDigest || null,
348
+ executionLocationDigest: details.executionLocationDigest || null,
349
+ preflight: details.preflight || null,
350
+ });
351
+ }
352
+
353
+ function _sendWorkflowFailed(server, ws, id, details = {}) {
354
+ server._send(ws, {
355
+ id,
356
+ type: "workflow:failed",
357
+ code: details.code || "WORKFLOW_RUN_FAILED",
358
+ message: details.message || "workflow execution failed",
359
+ runId: details.runId,
360
+ workflowId: details.workflowId,
361
+ executionStarted: true,
362
+ definitionDigest: details.definitionDigest || null,
363
+ admissionDigest: details.admissionDigest || null,
364
+ preflightDigest: details.preflightDigest || null,
365
+ executionLocationDigest: details.executionLocationDigest || null,
366
+ });
367
+ }
368
+
369
+ async function _resolveWorkflowExecutionAuthority(server, sessionId) {
370
+ if (typeof sessionId !== "string" || sessionId.trim() === "") {
371
+ const error = new Error("executionAuthoritySessionId is required");
372
+ error.code = "WORKFLOW_EXECUTION_AUTHORITY_MISSING";
373
+ throw error;
374
+ }
375
+ let provider;
376
+ if (Object.hasOwn(server, "workflowExecutionAuthorityProvider")) {
377
+ const descriptor = Object.getOwnPropertyDescriptor(
378
+ server,
379
+ "workflowExecutionAuthorityProvider",
380
+ );
381
+ if (!descriptor || !Object.hasOwn(descriptor, "value")) {
382
+ const error = new Error(
383
+ "workflow execution authority provider seam must be a data property",
384
+ );
385
+ error.code = "WORKFLOW_EXECUTION_AUTHORITY_PROVIDER_INVALID";
386
+ throw error;
387
+ }
388
+ provider = descriptor.value;
389
+ } else {
390
+ ({ getVerifiedSessionExecutionLocationAuthority: provider } =
391
+ await import("../../harness/jsonl-session-store.js"));
392
+ }
393
+ if (typeof provider !== "function") {
394
+ const error = new Error(
395
+ "workflow execution authority provider is unavailable",
396
+ );
397
+ error.code = "WORKFLOW_EXECUTION_AUTHORITY_PROVIDER_INVALID";
398
+ throw error;
399
+ }
400
+ const verifiedProof = await provider(sessionId);
401
+ let proof;
402
+ try {
403
+ proof = structuredClone(verifiedProof);
404
+ } catch {
405
+ const error = new Error(
406
+ "verified execution authority could not be safely snapshotted",
407
+ );
408
+ error.code = "WORKFLOW_EXECUTION_AUTHORITY_INVALID";
409
+ throw error;
410
+ }
411
+ if (proof?.sessionId !== sessionId) {
412
+ const error = new Error(
413
+ "verified execution authority does not match the requested session",
414
+ );
415
+ error.code = "WORKFLOW_EXECUTION_AUTHORITY_SESSION_MISMATCH";
416
+ throw error;
417
+ }
418
+ return Object.freeze({
419
+ schema: WORKFLOW_EXECUTION_AUTHORITY_SCHEMA,
420
+ authority: "verified-session-start",
421
+ sessionId: proof.sessionId,
422
+ headHash: proof.headHash,
423
+ eventCount: proof.eventCount,
424
+ binding: proof.binding,
425
+ });
426
+ }
427
+
428
+ async function _verifyWorkflowRunAuthorities(
429
+ server,
430
+ cwd,
431
+ { workflowId, definitionDigest, executionAuthoritySessionId },
432
+ ) {
433
+ const { getWorkflowVersion } = await import("../../lib/cowork-workflow.js");
434
+ // Resolve the asynchronous session proof first. The immutable workflow
435
+ // version is the final read in this verifier, leaving no await window in
436
+ // which it can be replaced after verification but before it is returned.
437
+ const executionLocationAuthority = await _resolveWorkflowExecutionAuthority(
438
+ server,
439
+ executionAuthoritySessionId,
440
+ );
441
+ const definitionAuthority = getWorkflowVersion(
442
+ cwd,
443
+ workflowId,
444
+ definitionDigest,
445
+ );
446
+ if (
447
+ !definitionAuthority ||
448
+ definitionAuthority.definitionDigest !== definitionDigest
449
+ ) {
450
+ const error = new Error(
451
+ "the exact admitted workflow definition version is no longer available",
452
+ );
453
+ error.code = "CC_DYNAMIC_WORKFLOW_DEFINITION_AUTHORITY_DRIFT";
454
+ throw error;
455
+ }
456
+ return Object.freeze({
457
+ definitionAuthority,
458
+ executionLocationAuthority,
459
+ });
460
+ }
461
+
299
462
  export async function handleWorkflowList(server, id, ws) {
300
463
  try {
301
464
  const { listWorkflows } = await import("../../lib/cowork-workflow.js");
@@ -310,9 +473,21 @@ export async function handleWorkflowGet(server, id, ws, message) {
310
473
  const { id: wfId } = message || {};
311
474
  if (!wfId) return _sendError(server, ws, id, "MISSING_ID", "id required");
312
475
  try {
313
- const { getWorkflow } = await import("../../lib/cowork-workflow.js");
314
- const workflow = getWorkflow(_cwd(server), wfId);
315
- server._send(ws, { id, type: "workflow:get", workflow: workflow || null });
476
+ const { getWorkflowRecord } = await import("../../lib/cowork-workflow.js");
477
+ const record = getWorkflowRecord(_cwd(server), wfId);
478
+ server._send(ws, {
479
+ id,
480
+ type: "workflow:get",
481
+ workflow: record?.definition || null,
482
+ definitionAuthority: record
483
+ ? {
484
+ status: record.status,
485
+ recordSchema: record.recordSchema,
486
+ definitionSchema: record.definitionSchema,
487
+ definitionDigest: record.definitionDigest,
488
+ }
489
+ : null,
490
+ });
316
491
  } catch (err) {
317
492
  _sendError(server, ws, id, "WORKFLOW_GET_FAILED", err.message);
318
493
  }
@@ -330,7 +505,7 @@ export async function handleWorkflowSave(server, id, ws, message) {
330
505
  );
331
506
  }
332
507
  try {
333
- const { validateWorkflow, saveWorkflow } =
508
+ const { getWorkflowRecord, validateWorkflow, saveWorkflow } =
334
509
  await import("../../lib/cowork-workflow.js");
335
510
  const result = validateWorkflow(workflow);
336
511
  if (!result.valid) {
@@ -343,11 +518,14 @@ export async function handleWorkflowSave(server, id, ws, message) {
343
518
  );
344
519
  }
345
520
  saveWorkflow(_cwd(server), workflow);
521
+ const record = getWorkflowRecord(_cwd(server), workflow.id);
346
522
  server._send(ws, {
347
523
  id,
348
524
  type: "workflow:save",
349
525
  saved: true,
350
526
  workflowId: workflow.id,
527
+ definitionDigest: record.definitionDigest,
528
+ definitionSchema: record.definitionSchema,
351
529
  });
352
530
  } catch (err) {
353
531
  _sendError(server, ws, id, "WORKFLOW_SAVE_FAILED", err.message);
@@ -367,14 +545,77 @@ export async function handleWorkflowRemove(server, id, ws, message) {
367
545
  }
368
546
 
369
547
  export async function handleWorkflowRun(server, id, ws, message) {
370
- const { id: wfId } = message || {};
548
+ const {
549
+ id: wfId,
550
+ definitionDigest,
551
+ executionAuthoritySessionId,
552
+ maxParallel,
553
+ } = message || {};
371
554
  if (!wfId) return _sendError(server, ws, id, "MISSING_ID", "id required");
555
+ if (
556
+ [
557
+ "binding",
558
+ "executionLocation",
559
+ "executionLocationAuthority",
560
+ "executionLocationBinding",
561
+ ].some((field) => Object.hasOwn(message || {}, field))
562
+ ) {
563
+ return _sendWorkflowBlocked(server, ws, id, {
564
+ code: "WORKFLOW_EXECUTION_AUTHORITY_INLINE_FORBIDDEN",
565
+ message:
566
+ "execution authority must be selected by executionAuthoritySessionId",
567
+ workflowId: wfId,
568
+ });
569
+ }
570
+ if (hasForbiddenWorkflowExecutionInput(message)) {
571
+ return _sendWorkflowBlocked(server, ws, id, {
572
+ code: "WORKFLOW_EXECUTION_SECRET_INPUT_FORBIDDEN",
573
+ message:
574
+ "workflow execution options and credential values are not accepted over WS",
575
+ workflowId: wfId,
576
+ });
577
+ }
578
+ if (
579
+ typeof executionAuthoritySessionId !== "string" ||
580
+ executionAuthoritySessionId.trim() === ""
581
+ ) {
582
+ return _sendWorkflowBlocked(server, ws, id, {
583
+ code: "WORKFLOW_EXECUTION_AUTHORITY_MISSING",
584
+ message: "executionAuthoritySessionId is required",
585
+ workflowId: wfId,
586
+ });
587
+ }
372
588
 
589
+ let executionStarted = false;
590
+ let definitionRecord = null;
591
+ let runId = null;
592
+ let eventDigests = null;
373
593
  try {
374
- const { getWorkflow, executeWorkflow } =
594
+ const { getWorkflowRecord, getWorkflowVersion, executeWorkflow } =
375
595
  await import("../../lib/cowork-workflow.js");
376
- const workflow = getWorkflow(_cwd(server), wfId);
377
- if (!workflow) {
596
+ const { executeDynamicWorkflowWithAdmission } =
597
+ await import("../../lib/dynamic-workflow-facade.js");
598
+ let workflowRunTask;
599
+ if (Object.hasOwn(server, "workflowRunTask")) {
600
+ const descriptor = Object.getOwnPropertyDescriptor(
601
+ server,
602
+ "workflowRunTask",
603
+ );
604
+ if (!descriptor || !Object.hasOwn(descriptor, "value")) {
605
+ throw new Error("Workflow task runner seam must be a data property");
606
+ }
607
+ workflowRunTask = descriptor.value;
608
+ } else {
609
+ ({ runCoworkTask: workflowRunTask } =
610
+ await import("../../lib/cowork-task-runner.js"));
611
+ }
612
+ if (typeof workflowRunTask !== "function") {
613
+ throw new Error("Workflow task runner is unavailable");
614
+ }
615
+ definitionRecord = definitionDigest
616
+ ? getWorkflowVersion(_cwd(server), wfId, definitionDigest)
617
+ : getWorkflowRecord(_cwd(server), wfId);
618
+ if (!definitionRecord) {
378
619
  return _sendError(
379
620
  server,
380
621
  ws,
@@ -384,8 +625,7 @@ export async function handleWorkflowRun(server, id, ws, message) {
384
625
  );
385
626
  }
386
627
 
387
- const runId = `wf-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
388
- server._send(ws, { id, type: "workflow:started", runId, workflowId: wfId });
628
+ runId = `wf-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
389
629
 
390
630
  const onStepStart = ({ stepId, message: stepMessage }) => {
391
631
  server._send(ws, {
@@ -394,6 +634,7 @@ export async function handleWorkflowRun(server, id, ws, message) {
394
634
  runId,
395
635
  stepId,
396
636
  message: stepMessage,
637
+ ...eventDigests,
397
638
  });
398
639
  };
399
640
  const onStepComplete = (outcome) => {
@@ -404,15 +645,57 @@ export async function handleWorkflowRun(server, id, ws, message) {
404
645
  stepId: outcome?.id,
405
646
  status: outcome?.status,
406
647
  summary: outcome?.result?.summary,
648
+ ...eventDigests,
407
649
  });
408
650
  };
409
651
 
410
- const record = await executeWorkflow({
411
- workflow,
412
- cwd: _cwd(server),
413
- onStepStart,
414
- onStepComplete,
415
- });
652
+ const outcome = await executeDynamicWorkflowWithAdmission(
653
+ {
654
+ definitionAuthority: definitionRecord,
655
+ executionAuthoritySessionId,
656
+ maxParallel,
657
+ execution: {
658
+ cwd: _cwd(server),
659
+ onStepStart,
660
+ onStepComplete,
661
+ },
662
+ onAdmitted(admission) {
663
+ executionStarted = true;
664
+ eventDigests = Object.freeze({
665
+ definitionDigest: admission.definitionDigest,
666
+ admissionDigest: admission.admissionDigest,
667
+ preflightDigest: admission.preflightDigest,
668
+ executionLocationDigest: admission.executionLocationDigest,
669
+ });
670
+ server._send(ws, {
671
+ id,
672
+ type: "workflow:started",
673
+ runId,
674
+ workflowId: wfId,
675
+ ...eventDigests,
676
+ });
677
+ },
678
+ },
679
+ {
680
+ executeWorkflow: (execution) =>
681
+ executeWorkflow({ ...execution, runTask: workflowRunTask }),
682
+ verifyAuthorities: (lookup) =>
683
+ _verifyWorkflowRunAuthorities(server, _cwd(server), lookup),
684
+ },
685
+ );
686
+ if (!outcome.allowed) {
687
+ return _sendWorkflowBlocked(server, ws, id, {
688
+ code: outcome.error?.code,
689
+ message: outcome.error?.message,
690
+ workflowId: wfId,
691
+ definitionDigest: outcome.definitionDigest,
692
+ admissionDigest: outcome.admissionDigest,
693
+ preflightDigest: outcome.preflightDigest,
694
+ executionLocationDigest: outcome.executionLocationDigest,
695
+ preflight: outcome.preflight,
696
+ });
697
+ }
698
+ const record = outcome.record;
416
699
 
417
700
  server._send(ws, {
418
701
  id,
@@ -420,8 +703,24 @@ export async function handleWorkflowRun(server, id, ws, message) {
420
703
  runId,
421
704
  status: record?.status || "completed",
422
705
  steps: record?.steps || [],
706
+ ...eventDigests,
423
707
  });
424
708
  } catch (err) {
425
- _sendError(server, ws, id, "WORKFLOW_RUN_FAILED", err.message);
709
+ if (!executionStarted && err.executionStarted !== true) {
710
+ _sendWorkflowBlocked(server, ws, id, {
711
+ code: err.code || "WORKFLOW_RUN_ADMISSION_FAILED",
712
+ message: err.message,
713
+ workflowId: wfId,
714
+ definitionDigest: definitionRecord?.definitionDigest,
715
+ });
716
+ return;
717
+ }
718
+ _sendWorkflowFailed(server, ws, id, {
719
+ code: err.code,
720
+ message: err.message,
721
+ runId,
722
+ workflowId: wfId,
723
+ ...eventDigests,
724
+ });
426
725
  }
427
726
  }
@@ -13,11 +13,21 @@ import {
13
13
  handleRemoteSessionClose,
14
14
  handleRemoteSessionDevices,
15
15
  handleRemoteSessionJoin,
16
+ handleRemoteSessionJoinChallenge,
17
+ handleRemoteSessionLeaseAck,
18
+ handleRemoteSessionLeaseCancel,
19
+ handleRemoteSessionLeaseConsume,
20
+ handleRemoteSessionMembershipSnapshot,
16
21
  handleRemoteSessionPairingToken,
17
22
  handleRemoteSessionPolicy,
18
23
  handleRemoteSessionPublish,
19
24
  handleRemoteSessionPushRegister,
25
+ handleRemoteSessionResume,
26
+ handleRemoteSessionResumeChallenge,
27
+ handleRemoteSessionReenable,
28
+ handleRemoteSessionReenableChallenge,
20
29
  handleRemoteSessionRevoke,
30
+ handleRemoteSessionTerminal,
21
31
  } from "./remote-session-protocol.js";
22
32
  import { RemoteCommandLedger } from "../../harness/remote-command-ledger.js";
23
33
 
@@ -123,6 +133,26 @@ export function createWsMessageDispatcher(server) {
123
133
  handleRemoteSessionPairingToken(server, clientId, ws, message),
124
134
  "remote-session-join": () =>
125
135
  handleRemoteSessionJoin(server, clientId, ws, message),
136
+ "remote-session-join-challenge": () =>
137
+ handleRemoteSessionJoinChallenge(server, clientId, ws, message),
138
+ "remote-session-resume-challenge": () =>
139
+ handleRemoteSessionResumeChallenge(server, clientId, ws, message),
140
+ "remote-session-resume": () =>
141
+ handleRemoteSessionResume(server, clientId, ws, message),
142
+ "remote-session-reenable-challenge": () =>
143
+ handleRemoteSessionReenableChallenge(server, clientId, ws, message),
144
+ "remote-session-reenable": () =>
145
+ handleRemoteSessionReenable(server, clientId, ws, message),
146
+ "remote-session-lease-ack": () =>
147
+ handleRemoteSessionLeaseAck(server, clientId, ws, message),
148
+ "remote-session-lease-consume": () =>
149
+ handleRemoteSessionLeaseConsume(server, clientId, ws, message),
150
+ "remote-session-lease-cancel": () =>
151
+ handleRemoteSessionLeaseCancel(server, clientId, ws, message),
152
+ "remote-session-membership-snapshot": () =>
153
+ handleRemoteSessionMembershipSnapshot(server, clientId, ws, message),
154
+ "remote-session-terminal": () =>
155
+ handleRemoteSessionTerminal(server, clientId, ws, message),
126
156
  "remote-session-devices": () =>
127
157
  handleRemoteSessionDevices(server, clientId, ws, message),
128
158
  "remote-session-audit": () =>