chainlesschain 0.162.189 → 0.162.193

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 (316) hide show
  1. package/README.md +61 -11
  2. package/bin/chainlesschain.js +7 -52
  3. package/completions/_cc +209 -0
  4. package/completions/cc.bash +18 -0
  5. package/completions/cc.fish +13 -0
  6. package/completions/cc.ps1 +226 -0
  7. package/package.json +10 -2
  8. package/src/assets/web-panel/assets/{AIOps-DbZft8w0.js → AIOps-DBLkaTje.js} +1 -1
  9. package/src/assets/web-panel/assets/{ActionButton-DoOZpwfN.js → ActionButton-BAy-Qebo.js} +1 -1
  10. package/src/assets/web-panel/assets/{Analytics-B0J0KLTW.js → Analytics-Dfb1Mlau.js} +3 -3
  11. package/src/assets/web-panel/assets/{AppLayout-D9eIR0qq.js → AppLayout-BbFkN8m0.js} +5 -5
  12. package/src/assets/web-panel/assets/{Artifacts-BnZXEVeo.js → Artifacts-kM4-cEEH.js} +1 -1
  13. package/src/assets/web-panel/assets/{Audit-X1ce4Bjn.js → Audit-BSQfYWf3.js} +1 -1
  14. package/src/assets/web-panel/assets/{BackgroundAgents-BvWR-y5v.js → BackgroundAgents-CWDbI_fG.js} +1 -1
  15. package/src/assets/web-panel/assets/{Backup-BublSGEd.js → Backup-BxLPbq_Q.js} +1 -1
  16. package/src/assets/web-panel/assets/{BaseInput-CR_77Hso.js → BaseInput-DuIbdrp6.js} +1 -1
  17. package/src/assets/web-panel/assets/{Chat-DixW52tq.js → Chat-NEmjGahU.js} +6 -6
  18. package/src/assets/web-panel/assets/{ChatBubbleRenderer-DDHDpBBA.js → ChatBubbleRenderer-DfJEo-5_.js} +1 -1
  19. package/src/assets/web-panel/assets/{Checkbox-CCv1C87K.js → Checkbox-CaoeG3Ns.js} +1 -1
  20. package/src/assets/web-panel/assets/{Codegen-B03Cc3dd.js → Codegen-BFf_g3xY.js} +1 -1
  21. package/src/assets/web-panel/assets/{Col-CA06-6pU.js → Col-CNOd8mdQ.js} +1 -1
  22. package/src/assets/web-panel/assets/{Community-Bj881J52.js → Community-BhpDqz-i.js} +1 -1
  23. package/src/assets/web-panel/assets/{Compact-UZLTPoaL.js → Compact-CQ42T7Z6.js} +1 -1
  24. package/src/assets/web-panel/assets/{Compliance-kGwzRb_0.js → Compliance-DI5PcLMN.js} +1 -1
  25. package/src/assets/web-panel/assets/{Cowork-KundoYM8.js → Cowork-wYYZe0wR.js} +3 -3
  26. package/src/assets/web-panel/assets/{Cron-BYZyoqDe.js → Cron-Dlq03DD_.js} +2 -2
  27. package/src/assets/web-panel/assets/{Crosschain-BhrrppBX.js → Crosschain-BzqS8PP3.js} +1 -1
  28. package/src/assets/web-panel/assets/{DID-CdC6EguZ.js → DID-It55Yem7.js} +2 -2
  29. package/src/assets/web-panel/assets/{Dashboard-CcQx3J4y.js → Dashboard-9HkH6oxn.js} +2 -2
  30. package/src/assets/web-panel/assets/{Dropdown-BpijtEzQ.js → Dropdown-00e2YWRB.js} +1 -1
  31. package/src/assets/web-panel/assets/{EmailListRenderer-DfZjeZTe.js → EmailListRenderer-By-ugRDL.js} +1 -1
  32. package/src/assets/web-panel/assets/{FamilyGuardDashboard-BFYSf69C.js → FamilyGuardDashboard-C396yu5m.js} +1 -1
  33. package/src/assets/web-panel/assets/{Federation-Okdi3pJm.js → Federation-BME5sbZY.js} +1 -1
  34. package/src/assets/web-panel/assets/{FormItemContext-mH-HebKW.js → FormItemContext-B4TEZCr-.js} +1 -1
  35. package/src/assets/web-panel/assets/{GenericCardRenderer-xivV69x7.js → GenericCardRenderer-_9CX9ieY.js} +1 -1
  36. package/src/assets/web-panel/assets/{Git-1rh_YBwg.js → Git-BrS6WVSr.js} +2 -2
  37. package/src/assets/web-panel/assets/{Governance-eAXkNxdY.js → Governance-BMdCWnKF.js} +1 -1
  38. package/src/assets/web-panel/assets/{Inference-CS6dMVTN.js → Inference-Bcp3vzcA.js} +1 -1
  39. package/src/assets/web-panel/assets/{KnowledgeGraph-Bq_TnkvD.js → KnowledgeGraph-DlLuqGY5.js} +1 -1
  40. package/src/assets/web-panel/assets/{Logs-KchHtiHt.js → Logs-D-W_6x09.js} +2 -2
  41. package/src/assets/web-panel/assets/{MarkdownRenderer-TabqHW9B.js → MarkdownRenderer-DElGPxCZ.js} +1 -1
  42. package/src/assets/web-panel/assets/{Marketplace-CsmGcX5X.js → Marketplace-Dzn2guvI.js} +1 -1
  43. package/src/assets/web-panel/assets/{McpTools-BaPFnnyz.js → McpTools-uPict-KL.js} +6 -6
  44. package/src/assets/web-panel/assets/{Memory-2m-sUUf7.js → Memory-BCw43kOb.js} +2 -2
  45. package/src/assets/web-panel/assets/{MobileBridge-D5nVZBRu.js → MobileBridge-DmV8Wv7F.js} +1 -1
  46. package/src/assets/web-panel/assets/MobileProjects-C-HaCmSM.js +1 -0
  47. package/src/assets/web-panel/assets/{Mtc-3GDvamGa.js → Mtc-C6jxJ34Y.js} +6 -6
  48. package/src/assets/web-panel/assets/{MtcAudit-D2zGuZCH.js → MtcAudit-Za8ExwhQ.js} +5 -5
  49. package/src/assets/web-panel/assets/{Multisig-BBVQ4t6t.js → Multisig-KKDbuEgb.js} +3 -3
  50. package/src/assets/web-panel/assets/{NLProgramming-BIOCyOGp.js → NLProgramming-Dj97zbCk.js} +1 -1
  51. package/src/assets/web-panel/assets/{Notes-DVwBGpzc.js → Notes-DBXvMraU.js} +4 -4
  52. package/src/assets/web-panel/assets/{NotificationSettings-BDnHfIfX.js → NotificationSettings-DOxITLYl.js} +1 -1
  53. package/src/assets/web-panel/assets/OrderTableRenderer-7DVjZwMM.js +1 -0
  54. package/src/assets/web-panel/assets/{Organization-D3SRKaa7.js → Organization-D1i73mjb.js} +4 -4
  55. package/src/assets/web-panel/assets/{Overflow-C2B8ahyn.js → Overflow-kW6Q3rvg.js} +1 -1
  56. package/src/assets/web-panel/assets/{P2P-2iwQzG65.js → P2P-C-v_8p2v.js} +2 -2
  57. package/src/assets/web-panel/assets/{PdhVaultBrowser-CoPiWqMN.js → PdhVaultBrowser-tUbbY64W.js} +5 -5
  58. package/src/assets/web-panel/assets/{Permissions-yV5XNXo5.js → Permissions-DkHxEZ58.js} +4 -4
  59. package/src/assets/web-panel/assets/{PersonalDataHub-uCDJhMUF.js → PersonalDataHub-DWuMPGrK.js} +4 -4
  60. package/src/assets/web-panel/assets/{Pipeline-hN7ucMOA.js → Pipeline-30IYXWWm.js} +1 -1
  61. package/src/assets/web-panel/assets/{Privacy-CgU0ptN4.js → Privacy-DZNQ4RrH.js} +1 -1
  62. package/src/assets/web-panel/assets/{ProjectInit-CfYPiT6j.js → ProjectInit-De2MCElf.js} +2 -2
  63. package/src/assets/web-panel/assets/{ProjectSettings-B0A2C4nw.js → ProjectSettings-5uHk9wsC.js} +2 -2
  64. package/src/assets/web-panel/assets/{Projects-BE5C0ajn.js → Projects-XjDfrFLb.js} +1 -1
  65. package/src/assets/web-panel/assets/{Providers-CstQPf8W.js → Providers-Bgwj6gcE.js} +1 -1
  66. package/src/assets/web-panel/assets/{QrScannerModal-Co3z_ynk.js → QrScannerModal-gKql9umv.js} +1 -1
  67. package/src/assets/web-panel/assets/{QuickAsk-DMTS6pQ6.js → QuickAsk-BWvmwkh7.js} +1 -1
  68. package/src/assets/web-panel/assets/{Recommend-ETw4odUa.js → Recommend-Uok4hZPd.js} +1 -1
  69. package/src/assets/web-panel/assets/RemoteSession-DLJzTk9a.js +5 -0
  70. package/src/assets/web-panel/assets/{Reputation-BTVqQgKq.js → Reputation-ZVwIPMSO.js} +1 -1
  71. package/src/assets/web-panel/assets/{Row-CBKKwwtO.js → Row-CN04HxWR.js} +1 -1
  72. package/src/assets/web-panel/assets/{RssFeed-BHUQ438I.js → RssFeed-BdSrEG4g.js} +3 -3
  73. package/src/assets/web-panel/assets/{Search-B4NqeUsF.js → Search-5PwVd0IR.js} +1 -1
  74. package/src/assets/web-panel/assets/{Security-BRjoYG5_.js → Security-DdBo4zjN.js} +4 -4
  75. package/src/assets/web-panel/assets/{Services-CxQzu3p3.js → Services-D3letU7M.js} +2 -2
  76. package/src/assets/web-panel/assets/{Skeleton-BKzwwmWO.js → Skeleton--Jb83f1v.js} +1 -1
  77. package/src/assets/web-panel/assets/{Skills-DrsFcgth.js → Skills-Bg-CulHX.js} +1 -1
  78. package/src/assets/web-panel/assets/{Sla-D21tmXCH.js → Sla-7QOa7S-X.js} +1 -1
  79. package/src/assets/web-panel/assets/{SpeechSettings-CjyjLfp8.js → SpeechSettings-DQwppjRw.js} +1 -1
  80. package/src/assets/web-panel/assets/{SyncSettings-Cu45-tnx.js → SyncSettings-dNPQGL-s.js} +2 -2
  81. package/src/assets/web-panel/assets/{Tasks-oMcILYOj.js → Tasks-Ggs-Z48q.js} +1 -1
  82. package/src/assets/web-panel/assets/{Templates-Bh-Zcr5R.js → Templates-78TYHgRO.js} +1 -1
  83. package/src/assets/web-panel/assets/{Tenant-68ns63aI.js → Tenant-xHwwv9vO.js} +1 -1
  84. package/src/assets/web-panel/assets/{Terminal-BLJkFykE.js → Terminal-BJXSJfm4.js} +2 -2
  85. package/src/assets/web-panel/assets/{TimelineRenderer-xcrJLq-O.js → TimelineRenderer-fLbjRhJw.js} +1 -1
  86. package/src/assets/web-panel/assets/{Tokens-C6PpFJtf.js → Tokens-oMSBSBmB.js} +1 -1
  87. package/src/assets/web-panel/assets/{Trigger-BaKA7tdM.js → Trigger-CfnY_wX_.js} +1 -1
  88. package/src/assets/web-panel/assets/{Trust-BzhA57Jc.js → Trust-AdyTgYKO.js} +1 -1
  89. package/src/assets/web-panel/assets/{UkeySign-4_U3JkIR.js → UkeySign-C5K_81dS.js} +1 -1
  90. package/src/assets/web-panel/assets/{VideoEditing-162AANxX.js → VideoEditing-vcGVDqki.js} +1 -1
  91. package/src/assets/web-panel/assets/{Wallet-B1viuql_.js → Wallet-hhOc3hlY.js} +4 -4
  92. package/src/assets/web-panel/assets/{WebAuthn-ZVWazhCy.js → WebAuthn-CVloC11s.js} +4 -4
  93. package/src/assets/web-panel/assets/{WorkflowEditor-tzdyUk-1.js → WorkflowEditor-CYeE32R5.js} +1 -1
  94. package/src/assets/web-panel/assets/{chat-DmrHNuwq.js → chat-CNROR5bN.js} +1 -1
  95. package/src/assets/web-panel/assets/{colors-DAJ_M-PK.js → colors-Cjx-cnwU.js} +1 -1
  96. package/src/assets/web-panel/assets/{compact-item-uIzmYwLs.js → compact-item-DOIfelvD.js} +1 -1
  97. package/src/assets/web-panel/assets/{createContext-D_ZmuLwb.js → createContext-DfA7UZ8u.js} +1 -1
  98. package/src/assets/web-panel/assets/devWarning-ChcCBGs7.js +1 -0
  99. package/src/assets/web-panel/assets/{hasIn-CDt_shTL.js → hasIn-BMSCzcfM.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CaelyMgF.js → index-5-HXgOX5.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-D4n1lGTB.js → index-AWg-0M1S.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-saf3VNeP.js → index-B4iYzpkL.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-Bx4d6c1k.js → index-B5Udeb_6.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DdUMcwRB.js → index-B7gf77CJ.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-clSX4PEc.js → index-BEMwBBHk.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DBFmcaCQ.js → index-BM1y_9hM.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-ByzGvpR9.js → index-BUonmKSE.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-C16fYKFD.js → index-BbQ2eQ8H.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CzXqvMuP.js → index-BemJ2u_E.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-D9OE8B3d.js → index-BolaOQxx.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-OzTxFIJP.js → index-BxOk9vkG.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DqDSF2RW.js → index-By61ojUx.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CG0lY4h3.js → index-C2K9SNVX.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-QsgfSZrV.js → index-C3L5gdiD.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-GcKOHD_c.js → index-C7xn0Nub.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BRa4kJ_S.js → index-CAnvhwg6.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CeUpKjvi.js → index-CEKMcOyU.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Cvak6Oe2.js → index-CNC5onm4.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CbD_WW_6.js → index-CVL27kXC.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BHvlm0In.js → index-CVm1_i3t.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-rS3gl_68.js → index-CdYBye8B.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-FyplHuNt.js → index-ClNMrqEY.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DfSSy9uy.js → index-Cs6l7uRu.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-rXdwUeE3.js → index-CshQbilz.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DeGBoLQA.js → index-Cyweh0Hy.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-C5WcdJH2.js → index-DBpWXFed.js} +3 -3
  127. package/src/assets/web-panel/assets/{index-CcZ9xJI9.js → index-DHtpHZAQ.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CKyd472S.js → index-DLmn0BoK.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BAvSmJXW.js → index-DPAWBrMf.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-ifxmu8SY.js → index-DjEsxO5h.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-BDF6EQBs.js → index-FBc_CJBd.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-Bbxjfstq.js → index-Icdoqmzt.js} +1 -1
  133. package/src/assets/web-panel/assets/index-Q2IajL54.js +1 -0
  134. package/src/assets/web-panel/assets/index-bRkHgOMc.js +1 -0
  135. package/src/assets/web-panel/assets/{index-BTCXf1t-.js → index-dCd8cSUq.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-DvFhhe6r.js → index-m2vG9gG_.js} +1 -1
  137. package/src/assets/web-panel/assets/{index-DwfvPe-j.js → index-mTpHoEzr.js} +1 -1
  138. package/src/assets/web-panel/assets/{index-Z8P4BexE.js → index-ti_lnTWl.js} +1 -1
  139. package/src/assets/web-panel/assets/{initDefaultProps-pmfaD-aK.js → initDefaultProps-Bu8k7H1Y.js} +1 -1
  140. package/src/assets/web-panel/assets/{motion-CaQ2CpYF.js → motion-s3iVK41k.js} +1 -1
  141. package/src/assets/web-panel/assets/{move-CkKTqNbI.js → move-B6B-E5Jz.js} +1 -1
  142. package/src/assets/web-panel/assets/{mtc-parser-Dd4xsgRI.js → mtc-parser-BiYgTidA.js} +1 -1
  143. package/src/assets/web-panel/assets/{omit-BFuA5YEs.js → omit-pU1RdUDA.js} +1 -1
  144. package/src/assets/web-panel/assets/{pickAttrs-DDfxOAJc.js → pickAttrs-Cdoq_SeM.js} +1 -1
  145. package/src/assets/web-panel/assets/{placementArrow-Be595JCp.js → placementArrow-DIuvAn2K.js} +1 -1
  146. package/src/assets/web-panel/assets/{responsiveObserve-7byljUM3.js → responsiveObserve-8w16YR2D.js} +1 -1
  147. package/src/assets/web-panel/assets/{slide-CTWfOTaY.js → slide-VZ01cZe3.js} +1 -1
  148. package/src/assets/web-panel/assets/{statusUtils-CNZOuIxM.js → statusUtils-lh8YMN8Z.js} +1 -1
  149. package/src/assets/web-panel/assets/{styleChecker-DwOcBV78.js → styleChecker-CmDyreec.js} +1 -1
  150. package/src/assets/web-panel/assets/{useFlexGapSupport-B6MNwAO9.js → useFlexGapSupport-hiJWMU5y.js} +1 -1
  151. package/src/assets/web-panel/assets/{useFs-CzyQjH9r.js → useFs-Thnu-Iaj.js} +1 -1
  152. package/src/assets/web-panel/assets/{usePersonalDataHub-Dxh3KiVA.js → usePersonalDataHub-LBdOxjwY.js} +1 -1
  153. package/src/assets/web-panel/assets/{vnode-DVfZiS5N.js → vnode-Cg6lFY_X.js} +1 -1
  154. package/src/assets/web-panel/assets/{zoom-BYme7fbY.js → zoom-DVfsR1YO.js} +1 -1
  155. package/src/assets/web-panel/index.html +1 -1
  156. package/src/cli-help.js +181 -0
  157. package/src/command-help-index.json +181 -0
  158. package/src/command-manifest.json +1107 -175
  159. package/src/command-surface-policy.js +197 -0
  160. package/src/commands/agent.js +76 -33
  161. package/src/commands/artifacts.js +400 -2
  162. package/src/commands/background-session.js +41 -3
  163. package/src/commands/checkpoint-restore-recovery.js +1476 -0
  164. package/src/commands/checkpoint.js +947 -22
  165. package/src/commands/compact.js +101 -25
  166. package/src/commands/config.js +506 -20
  167. package/src/commands/doctor.js +4 -1
  168. package/src/commands/hub.js +1 -1
  169. package/src/commands/mcp.js +688 -24
  170. package/src/commands/pack.js +16 -2
  171. package/src/commands/plugin.js +20 -12
  172. package/src/commands/session-mcp-recovery.js +218 -0
  173. package/src/commands/session.js +470 -110
  174. package/src/commands/setup.js +36 -10
  175. package/src/commands/skill.js +181 -110
  176. package/src/commands/status.js +21 -5
  177. package/src/commands/update.js +68 -6
  178. package/src/constants.js +11 -0
  179. package/src/data/changelog.json +14 -1
  180. package/src/gateways/ws/action-protocol.js +10 -0
  181. package/src/gateways/ws/session-protocol.js +555 -27
  182. package/src/gateways/ws/ws-agent-handler.js +541 -14
  183. package/src/gateways/ws/ws-session-gateway.js +129 -22
  184. package/src/gateways/ws/ws-session-state.js +431 -0
  185. package/src/harness/background-task-manager.js +233 -36
  186. package/src/harness/jsonl-session-store.js +2551 -167
  187. package/src/harness/mcp-client.js +802 -61
  188. package/src/harness/prompt-compressor.js +227 -27
  189. package/src/harness/session-index.js +89 -38
  190. package/src/harness/session-list-index.js +254 -0
  191. package/src/harness/structured-handoff.js +410 -0
  192. package/src/lazy-dispatch.js +747 -84
  193. package/src/lib/__tests__/logger.test.js +50 -2
  194. package/src/lib/advisor-runtime.js +1047 -0
  195. package/src/lib/agent-core.js +1 -0
  196. package/src/lib/agent-sandbox.js +120 -26
  197. package/src/lib/agent-session-export.js +20 -0
  198. package/src/lib/agent-team/team-runner.js +230 -8
  199. package/src/lib/artifact-store.js +131 -8
  200. package/src/lib/background-agent-supervisor.js +185 -13
  201. package/src/lib/background-interaction-journal.js +37 -9
  202. package/src/lib/background-launch-profile.js +1058 -0
  203. package/src/lib/checkpoint-restore-already-completed-controller.js +902 -0
  204. package/src/lib/checkpoint-restore-orchestrator.js +987 -0
  205. package/src/lib/checkpoint-restore-partial-rollback-controller.js +1953 -0
  206. package/src/lib/checkpoint-restore-recovery-controller.js +689 -0
  207. package/src/lib/checkpoint-restore-recovery.js +884 -0
  208. package/src/lib/checkpoint-restore-retention.js +126 -0
  209. package/src/lib/checkpoint-restore-saga.js +5079 -0
  210. package/src/lib/checkpoint-restore-session-recovery.js +1178 -0
  211. package/src/lib/checkpoint-restore-workspace-target-verifier.js +270 -0
  212. package/src/lib/checkpoint-store.js +1688 -97
  213. package/src/lib/checkpoint-timeline-authority.js +522 -0
  214. package/src/lib/checkpoint-timeline.js +642 -0
  215. package/src/lib/config-keys.js +18 -119
  216. package/src/lib/config-manager.js +446 -27
  217. package/src/lib/config-redaction.js +57 -0
  218. package/src/lib/config-schema.js +853 -0
  219. package/src/lib/cowork-mcp-tools.js +5 -0
  220. package/src/lib/cowork-task-runner.js +458 -63
  221. package/src/lib/delivery-coordinator.js +1234 -0
  222. package/src/lib/delivery-evidence.js +450 -0
  223. package/src/lib/doctor-checkup.js +199 -14
  224. package/src/lib/executable-path.js +34 -0
  225. package/src/lib/fatal-handler.js +16 -0
  226. package/src/lib/file-checkpoint.js +4909 -186
  227. package/src/lib/file-lines.js +125 -0
  228. package/src/lib/headless-config-command.js +16 -5
  229. package/src/lib/hook-runner.cjs +139 -38
  230. package/src/lib/hooks-v2-workspace-context.js +10 -0
  231. package/src/lib/impacted-gate-selector.js +424 -0
  232. package/src/lib/interaction-adapter.js +62 -0
  233. package/src/lib/jsonl-session-store.js +1 -35
  234. package/src/lib/logger.js +66 -14
  235. package/src/lib/mcp-call-ledger-store.js +1069 -0
  236. package/src/lib/mcp-call-ledger.js +747 -0
  237. package/src/lib/mcp-client.js +5 -0
  238. package/src/lib/mcp-conflict-scheduler.js +468 -0
  239. package/src/lib/mcp-effect-contract.js +102 -0
  240. package/src/lib/mcp-headers-helper-trust.js +145 -0
  241. package/src/lib/mcp-headers-helper.js +616 -0
  242. package/src/lib/mcp-host-recovery-runtime.js +131 -0
  243. package/src/lib/mcp-ledger-recovery-admission.js +1065 -0
  244. package/src/lib/mcp-recovery-adjudication.js +443 -0
  245. package/src/lib/output-context.js +86 -0
  246. package/src/lib/packer/file-identity.js +170 -0
  247. package/src/lib/packer/index.js +3 -0
  248. package/src/lib/packer/native-update-state.js +277 -0
  249. package/src/lib/packer/pack-update-applier.js +1983 -136
  250. package/src/lib/packer/pack-update-checker.js +34 -0
  251. package/src/lib/packer/pack-update-downloader.js +875 -86
  252. package/src/lib/packer/pack-update-signature.js +86 -0
  253. package/src/lib/packer/pkg-config-generator.js +6 -0
  254. package/src/lib/paths.js +65 -10
  255. package/src/lib/plan-mode.js +831 -14
  256. package/src/lib/plan-persistence.js +540 -0
  257. package/src/lib/plugin-runtime/hooks.js +227 -69
  258. package/src/lib/plugin-runtime/plugin-options.js +189 -44
  259. package/src/lib/pr-automation-policy.js +146 -8
  260. package/src/lib/process-execution-broker/credential-agent.js +7 -0
  261. package/src/lib/process-execution-broker/index.js +53 -8
  262. package/src/lib/process-execution-broker/workspace-transaction.js +976 -73
  263. package/src/lib/project-instructions.js +165 -29
  264. package/src/lib/project-mcp-trust.js +67 -0
  265. package/src/lib/public-ide-capability-manifest.js +272 -0
  266. package/src/lib/public-ide-capability-validation.js +351 -0
  267. package/src/lib/secret-store.js +267 -43
  268. package/src/lib/secure-fs.js +1089 -0
  269. package/src/lib/security-audit.js +58 -0
  270. package/src/lib/service-manager.js +34 -13
  271. package/src/lib/session-budget-runtime.js +1452 -0
  272. package/src/lib/session-host-snapshot.js +388 -0
  273. package/src/lib/session-message-provenance.js +429 -0
  274. package/src/lib/session-projection.js +804 -0
  275. package/src/lib/session-resource-budget.js +1495 -0
  276. package/src/lib/settings-hooks.cjs +138 -22
  277. package/src/lib/settings-loader.cjs +25 -2
  278. package/src/lib/side-effect-ledger-store.js +45 -23
  279. package/src/lib/skill-execution-identity.js +217 -0
  280. package/src/lib/skill-loader.js +299 -18
  281. package/src/lib/sub-agent-context.js +236 -28
  282. package/src/lib/sub-agent-registry.js +5 -0
  283. package/src/lib/subagent-contract.js +94 -0
  284. package/src/lib/todo-manager.js +185 -18
  285. package/src/lib/todo-persistence.js +417 -0
  286. package/src/lib/turn-binding-store.js +41 -23
  287. package/src/lib/with-file-lock.js +25 -1
  288. package/src/lib/ws-chat-handler.js +21 -0
  289. package/src/program-base.js +18 -0
  290. package/src/repl/advisor-command.js +103 -0
  291. package/src/repl/agent-repl.js +2156 -145
  292. package/src/repl/btw-command.js +93 -10
  293. package/src/repl/clipboard-image.js +119 -0
  294. package/src/repl/config-summary.js +64 -108
  295. package/src/repl/prompt-editor.js +233 -0
  296. package/src/repl/prompt-interactions.js +344 -0
  297. package/src/repl/prompt-stash.js +354 -0
  298. package/src/repl/prompt-suggestions.js +312 -0
  299. package/src/repl/repl-keybindings.js +227 -0
  300. package/src/repl/session-recap.js +217 -0
  301. package/src/repl/slash-command-registry.js +22 -0
  302. package/src/repl/terminal-layout.js +88 -0
  303. package/src/runtime/agent-core.js +1264 -325
  304. package/src/runtime/coding-agent-contract-shared.cjs +13 -1
  305. package/src/runtime/coding-agent-managed-tool-policy.cjs +7 -2
  306. package/src/runtime/diagnostics.js +32 -13
  307. package/src/runtime/headless-runner.js +298 -118
  308. package/src/runtime/headless-stream.js +353 -95
  309. package/src/runtime/mcp-config.js +148 -14
  310. package/src/runtime/status-diagnostics-lite.js +137 -0
  311. package/src/assets/web-panel/assets/MobileProjects-Bo8MLZvT.js +0 -1
  312. package/src/assets/web-panel/assets/OrderTableRenderer-C7Ek20ag.js +0 -1
  313. package/src/assets/web-panel/assets/RemoteSession-B0rkE09d.js +0 -5
  314. package/src/assets/web-panel/assets/devWarning-DIrncrV1.js +0 -1
  315. package/src/assets/web-panel/assets/index-D-Swwqld.js +0 -1
  316. package/src/assets/web-panel/assets/index-FMZAMKy8.js +0 -1
@@ -20,6 +20,7 @@
20
20
  * @module cowork-mcp-tools
21
21
  */
22
22
  import { validateMcpServerConfig } from "./skill-mcp.js";
23
+ import { mcpEffectDescriptorFields } from "./mcp-effect-contract.js";
23
24
 
24
25
  export const _deps = {
25
26
  importMcpClient: async () => {
@@ -64,6 +65,10 @@ export function toAgentTool(serverName, tool) {
64
65
  source: "cowork-template-mcp",
65
66
  serverName,
66
67
  originalName: tool.name,
68
+ ...mcpEffectDescriptorFields(tool, {
69
+ sourceTrusted: false,
70
+ provenance: `cowork-template:${serverName}`,
71
+ }),
67
72
  },
68
73
  executor: {
69
74
  kind: "mcp",
@@ -7,22 +7,379 @@
7
7
  * @module cowork-task-runner
8
8
  */
9
9
 
10
+ import { randomUUID } from "node:crypto";
10
11
  import { existsSync, mkdirSync, appendFileSync, readFileSync } from "node:fs";
11
12
  import { join } from "node:path";
12
13
  import { SubAgentContext } from "./sub-agent-context.js";
13
14
  import { getTemplate, setUserTemplates } from "./cowork-task-templates.js";
14
15
  import { mountTemplateMcpTools } from "./cowork-mcp-tools.js";
15
16
  import { listUserTemplates } from "./cowork-template-marketplace.js";
17
+ import {
18
+ createMcpCallLedger,
19
+ McpEffect,
20
+ snapshotMcpJsonRpcInput,
21
+ } from "./mcp-call-ledger.js";
22
+ import {
23
+ createMcpRecoveryAdmissionController,
24
+ guardMcpLedgerForRecovery,
25
+ } from "./mcp-ledger-recovery-admission.js";
26
+ import {
27
+ assertMcpVerifiedProjectionAuthority,
28
+ createSessionMcpLedgerSink,
29
+ createMcpLedgerEventReducer,
30
+ formatMcpLedgerRecoveryNotice,
31
+ snapshotMcpLedgerRecoveryProjection,
32
+ } from "./mcp-call-ledger-store.js";
33
+ import {
34
+ appendAuthorityEvent as appendSessionEvent,
35
+ appendAuthorityEventIfHead as appendSessionEventIfHead,
36
+ isUnsafeSessionId,
37
+ readVerifiedEvents as readVerifiedSessionEvents,
38
+ readVerifiedProjection as readVerifiedSessionProjection,
39
+ } from "../harness/jsonl-session-store.js";
16
40
 
17
41
  // ─── Dependencies (overridable for testing) ──────────────────────────────────
18
42
 
19
- export const _deps = { existsSync, mkdirSync, appendFileSync, readFileSync };
43
+ export const _deps = {
44
+ existsSync,
45
+ mkdirSync,
46
+ appendFileSync,
47
+ readFileSync,
48
+ appendSessionEvent,
49
+ appendSessionEventIfHead,
50
+ readVerifiedSessionEvents,
51
+ readVerifiedSessionProjection,
52
+ randomUUID,
53
+ };
20
54
 
21
55
  // ─── Constants ────────────────────────────────────────────────────────────────
22
56
 
23
57
  const DEFAULT_MAX_ITERATIONS = 50;
24
58
  const DEFAULT_TOKEN_BUDGET = 100_000;
25
59
 
60
+ function resolveCoworkMcpSessionId(requested) {
61
+ if (requested != null) {
62
+ if (typeof requested !== "string" || isUnsafeSessionId(requested)) {
63
+ const error = new Error("Cowork MCP session id is invalid");
64
+ error.code = "CC_COWORK_MCP_SESSION_INVALID";
65
+ throw error;
66
+ }
67
+ return requested;
68
+ }
69
+ return `cowork-mcp-${_deps.randomUUID()}`;
70
+ }
71
+
72
+ function publicMcpRecoveryState(recovery, blockMode, readErrorCode = null) {
73
+ const unsettled = Array.isArray(recovery?.unsettled)
74
+ ? recovery.unsettled.slice(0, 20).map((record) =>
75
+ Object.freeze({
76
+ ledgerId: record.ledgerId,
77
+ serverName: record.serverName,
78
+ toolName: record.toolName,
79
+ effect: record.effectContract?.effect || McpEffect.UNKNOWN,
80
+ }),
81
+ )
82
+ : [];
83
+ const incidents = Array.isArray(recovery?.incidents)
84
+ ? recovery.incidents.slice(0, 20).map((incident) =>
85
+ Object.freeze({
86
+ code: incident.code,
87
+ ledgerId: incident.ledgerId || null,
88
+ }),
89
+ )
90
+ : [];
91
+ // Exact replay denies are active admission authority, not display samples.
92
+ // Never truncate this list: dropping one entry would re-enable that call.
93
+ const replayDenied = Array.isArray(recovery?.replayDenied)
94
+ ? recovery.replayDenied.map((entry) =>
95
+ Object.freeze({
96
+ ledgerId: entry.ledgerId,
97
+ serverName: entry.serverName,
98
+ toolName: entry.toolName,
99
+ inputBytes: entry.inputBytes,
100
+ replayDigest: entry.replayDigest,
101
+ }),
102
+ )
103
+ : [];
104
+ if (readErrorCode) {
105
+ incidents.push(Object.freeze({ code: readErrorCode, ledgerId: null }));
106
+ }
107
+ return Object.freeze({
108
+ blockMode,
109
+ unsettled: Object.freeze(unsettled),
110
+ incidents: Object.freeze(incidents),
111
+ replayDenied: Object.freeze(replayDenied),
112
+ headHash: recovery?.headHash || null,
113
+ recoveryDigest: recovery?.recoveryDigest || null,
114
+ remediation:
115
+ recovery?.remediation || (readErrorCode ? "inspect_transcript" : null),
116
+ });
117
+ }
118
+
119
+ function assertCoworkMcpSessionBindingEvent(event, templateId) {
120
+ if (event?.type !== "cowork_mcp_session") return;
121
+ const binding = event.data;
122
+ if (
123
+ binding?.schemaVersion !== 1 ||
124
+ typeof binding.taskId !== "string" ||
125
+ typeof binding.templateId !== "string"
126
+ ) {
127
+ const error = new Error("Cowork MCP session binding is malformed");
128
+ error.code = "CC_COWORK_MCP_SESSION_BIND_INVALID";
129
+ throw error;
130
+ }
131
+ if (binding.templateId !== templateId) {
132
+ const error = new Error(
133
+ `Cowork MCP session is already bound to template ${binding.templateId}`,
134
+ );
135
+ error.code = "CC_COWORK_MCP_SESSION_BIND_CONFLICT";
136
+ throw error;
137
+ }
138
+ }
139
+
140
+ function createCoworkMcpRecoveryProjection(sessionId, templateId, onFinish) {
141
+ const ledger = createMcpLedgerEventReducer({
142
+ sessionId,
143
+ verified: true,
144
+ });
145
+ let acceptedCount = 0;
146
+ let finished = false;
147
+ return Object.freeze({
148
+ accept(event) {
149
+ if (finished) {
150
+ const error = new Error("Cowork MCP projection accepted after finish");
151
+ error.code = "CC_COWORK_MCP_RECOVERY_PROJECTION_INVALID";
152
+ throw error;
153
+ }
154
+ acceptedCount += 1;
155
+ assertCoworkMcpSessionBindingEvent(event, templateId);
156
+ ledger.accept(event);
157
+ },
158
+ finish(authority) {
159
+ if (finished) {
160
+ const error = new Error("Cowork MCP projection finished twice");
161
+ error.code = "CC_COWORK_MCP_RECOVERY_PROJECTION_INVALID";
162
+ throw error;
163
+ }
164
+ finished = true;
165
+ const recovery = ledger.finish();
166
+ assertMcpVerifiedProjectionAuthority(authority, {
167
+ acceptedCount,
168
+ headHash: recovery.headHash,
169
+ });
170
+ const projected = Object.freeze({
171
+ schemaVersion: 1,
172
+ bindingAllowed: true,
173
+ expectedHeadHash: recovery.headHash,
174
+ recovery,
175
+ });
176
+ onFinish(projected);
177
+ return projected;
178
+ },
179
+ });
180
+ }
181
+
182
+ function snapshotCoworkMcpRecoveryProjection(sessionId, value) {
183
+ const snapshot = snapshotMcpJsonRpcInput(value);
184
+ const fields = Object.keys(snapshot || {})
185
+ .sort()
186
+ .join(",");
187
+ if (
188
+ fields !== "bindingAllowed,expectedHeadHash,recovery,schemaVersion" ||
189
+ snapshot.schemaVersion !== 1 ||
190
+ snapshot.bindingAllowed !== true
191
+ ) {
192
+ const error = new TypeError("Cowork MCP recovery projection is malformed");
193
+ error.code = "CC_COWORK_MCP_RECOVERY_PROJECTION_INVALID";
194
+ throw error;
195
+ }
196
+ const recovery = snapshotMcpLedgerRecoveryProjection(
197
+ sessionId,
198
+ snapshot.recovery,
199
+ );
200
+ if (snapshot.expectedHeadHash !== recovery.headHash) {
201
+ const error = new TypeError(
202
+ "Cowork MCP recovery projection head is inconsistent",
203
+ );
204
+ error.code = "CC_COWORK_MCP_RECOVERY_PROJECTION_INVALID";
205
+ throw error;
206
+ }
207
+ return Object.freeze({ ...snapshot, recovery });
208
+ }
209
+
210
+ function readCoworkMcpRecoveryProjection(sessionId, templateId) {
211
+ const hasCustomLegacyReader =
212
+ typeof _deps.readVerifiedSessionEvents === "function" &&
213
+ _deps.readVerifiedSessionEvents !== readVerifiedSessionEvents;
214
+ const readProjection = _deps.readVerifiedSessionProjection;
215
+ if (
216
+ typeof readProjection === "function" &&
217
+ (readProjection !== readVerifiedSessionProjection || !hasCustomLegacyReader)
218
+ ) {
219
+ let projectionCreated = false;
220
+ let finishedProjection;
221
+ const returnedProjection = readProjection(sessionId, () => {
222
+ if (projectionCreated) {
223
+ const error = new Error("Cowork MCP projection factory was reused");
224
+ error.code = "CC_COWORK_MCP_RECOVERY_PROJECTION_INVALID";
225
+ throw error;
226
+ }
227
+ projectionCreated = true;
228
+ return createCoworkMcpRecoveryProjection(
229
+ sessionId,
230
+ templateId,
231
+ (value) => {
232
+ finishedProjection = value;
233
+ },
234
+ );
235
+ });
236
+ if (
237
+ !projectionCreated ||
238
+ finishedProjection === undefined ||
239
+ returnedProjection !== finishedProjection
240
+ ) {
241
+ const error = new Error(
242
+ "Cowork MCP projection reader bypassed its verified factory",
243
+ );
244
+ error.code = "CC_COWORK_MCP_RECOVERY_PROJECTION_INVALID";
245
+ throw error;
246
+ }
247
+ return snapshotCoworkMcpRecoveryProjection(sessionId, returnedProjection);
248
+ }
249
+ if (!hasCustomLegacyReader) {
250
+ const error = new TypeError(
251
+ "Verified Cowork MCP projection reader is unavailable",
252
+ );
253
+ error.code = "CC_COWORK_MCP_RECOVERY_PROJECTION_INVALID";
254
+ throw error;
255
+ }
256
+
257
+ const verifiedEvents = snapshotMcpJsonRpcInput(
258
+ _deps.readVerifiedSessionEvents(sessionId),
259
+ );
260
+ if (!Array.isArray(verifiedEvents)) {
261
+ const invalid = new TypeError(
262
+ "Verified Cowork MCP events must be returned synchronously as an array",
263
+ );
264
+ invalid.code = "CC_MCP_LEDGER_VERIFIED_EVENTS_INVALID";
265
+ throw invalid;
266
+ }
267
+ let finishedProjection;
268
+ const projection = createCoworkMcpRecoveryProjection(
269
+ sessionId,
270
+ templateId,
271
+ (value) => {
272
+ finishedProjection = value;
273
+ },
274
+ );
275
+ for (const event of verifiedEvents) projection.accept(event);
276
+ const returnedProjection = projection.finish(
277
+ Object.freeze({
278
+ headHash: verifiedEvents.at(-1)?.hash || null,
279
+ eventCount: verifiedEvents.length,
280
+ readMessages: () => [],
281
+ }),
282
+ );
283
+ if (returnedProjection !== finishedProjection) {
284
+ const error = new Error("Cowork MCP legacy projection did not finish");
285
+ error.code = "CC_COWORK_MCP_RECOVERY_PROJECTION_INVALID";
286
+ throw error;
287
+ }
288
+ return snapshotCoworkMcpRecoveryProjection(sessionId, returnedProjection);
289
+ }
290
+
291
+ /**
292
+ * Build one session-scoped durable ledger for every template MCP call. The
293
+ * returned ledger is handed to SubAgentContext, so agent-core must complete a
294
+ * durable started prewrite before invoking unknown/write/destructive tools.
295
+ */
296
+ export function prepareCoworkMcpRuntime(mcp, options = {}) {
297
+ if (
298
+ !mcp?.mcpClient ||
299
+ !Array.isArray(mcp.extraToolDefinitions) ||
300
+ mcp.extraToolDefinitions.length === 0
301
+ ) {
302
+ return {
303
+ sessionId: null,
304
+ ledger: null,
305
+ recoveryNotice: null,
306
+ recoveryState: null,
307
+ };
308
+ }
309
+
310
+ const sessionId = resolveCoworkMcpSessionId(options.mcpSessionId);
311
+ if (typeof options.onProgress === "function") {
312
+ options.onProgress({ type: "mcp-session", sessionId });
313
+ }
314
+ let recoveryNotice = null;
315
+ let recoveryState = null;
316
+ let bindingAllowed = false;
317
+ let expectedHeadHash = null;
318
+ try {
319
+ const projected = readCoworkMcpRecoveryProjection(
320
+ sessionId,
321
+ String(options.templateId || "free"),
322
+ );
323
+ const recovery = projected.recovery;
324
+ expectedHeadHash = projected.expectedHeadHash;
325
+ bindingAllowed = projected.bindingAllowed;
326
+ recoveryNotice = formatMcpLedgerRecoveryNotice(recovery);
327
+ const blockMode =
328
+ recovery.incidents.length > 0
329
+ ? "all"
330
+ : recovery.unsettled.length > 0
331
+ ? "unsafe"
332
+ : null;
333
+ recoveryState = publicMcpRecoveryState(recovery, blockMode);
334
+ if (recoveryNotice && typeof options.onProgress === "function") {
335
+ options.onProgress({
336
+ type: "mcp-recovery",
337
+ sessionId,
338
+ unsettled: recovery.unsettled.length,
339
+ incidents: recovery.incidents.length,
340
+ recovery: recoveryState,
341
+ });
342
+ }
343
+ } catch (error) {
344
+ recoveryNotice =
345
+ "MCP recovery notice — the durable Cowork MCP ledger could not be read. " +
346
+ "Do not execute or retry MCP tools until the session transcript has " +
347
+ `been inspected (${error?.code || "CC_MCP_LEDGER_EVENT_READ_FAILED"}).`;
348
+ recoveryState = publicMcpRecoveryState(
349
+ null,
350
+ "all",
351
+ error?.code || "CC_MCP_LEDGER_EVENT_READ_FAILED",
352
+ );
353
+ if (typeof options.onProgress === "function") {
354
+ options.onProgress({
355
+ type: "mcp-recovery",
356
+ sessionId,
357
+ unsettled: 0,
358
+ incidents: 1,
359
+ recovery: recoveryState,
360
+ });
361
+ }
362
+ }
363
+
364
+ const sink = createSessionMcpLedgerSink(sessionId, {
365
+ appendEvent: _deps.appendSessionEvent,
366
+ });
367
+ const recoveryController =
368
+ createMcpRecoveryAdmissionController(recoveryState);
369
+ return {
370
+ sessionId,
371
+ recoveryNotice,
372
+ recoveryState,
373
+ bindingAllowed,
374
+ expectedHeadHash,
375
+ ledger: guardMcpLedgerForRecovery(
376
+ createMcpCallLedger({ sink }),
377
+ recoveryController,
378
+ { code: "CC_COWORK_MCP_RECOVERY_BLOCKED" },
379
+ ),
380
+ };
381
+ }
382
+
26
383
  // ─── Runner ───────────────────────────────────────────────────────────────────
27
384
 
28
385
  /**
@@ -37,6 +394,7 @@ const DEFAULT_TOKEN_BUDGET = 100_000;
37
394
  * @param {object} [options.llmOptions] - LLM provider/model/key
38
395
  * @param {number} [options.maxIterations] - Override iteration limit
39
396
  * @param {number} [options.tokenBudget] - Override token budget
397
+ * @param {string} [options.mcpSessionId] - Stable MCP ledger session for resume
40
398
  * @returns {Promise<{ taskId: string, status: string, result: object }>}
41
399
  */
42
400
  export async function runCoworkTask(options = {}) {
@@ -51,6 +409,7 @@ export async function runCoworkTask(options = {}) {
51
409
  tokenBudget = DEFAULT_TOKEN_BUDGET,
52
410
  onProgress = null,
53
411
  signal = null,
412
+ mcpSessionId = null,
54
413
  } = options;
55
414
 
56
415
  if (!userMessage || typeof userMessage !== "string") {
@@ -95,7 +454,7 @@ export async function runCoworkTask(options = {}) {
95
454
  taskParts.push(`\n## 用户提供的文件\n${files.join("\n")}`);
96
455
  }
97
456
 
98
- const task = taskParts.join("\n");
457
+ let task = taskParts.join("\n");
99
458
 
100
459
  // Mount template-declared MCP servers (best-effort, failures are tolerated)
101
460
  const mcp = await mountTemplateMcpTools(template, {
@@ -103,72 +462,108 @@ export async function runCoworkTask(options = {}) {
103
462
  if (onProgress) onProgress({ type: "mcp-warning", message: msg });
104
463
  },
105
464
  });
106
- if (onProgress && (mcp.mounted.length > 0 || mcp.skipped.length > 0)) {
107
- onProgress({
108
- type: "mcp-mounted",
109
- mounted: mcp.mounted,
110
- skipped: mcp.skipped.map((s) => s.name),
111
- toolCount: mcp.extraToolDefinitions.length,
465
+ try {
466
+ if (onProgress && (mcp.mounted.length > 0 || mcp.skipped.length > 0)) {
467
+ onProgress({
468
+ type: "mcp-mounted",
469
+ mounted: mcp.mounted,
470
+ skipped: mcp.skipped.map((s) => s.name),
471
+ toolCount: mcp.extraToolDefinitions.length,
472
+ });
473
+ }
474
+ const mcpRuntime = prepareCoworkMcpRuntime(mcp, {
475
+ mcpSessionId,
476
+ onProgress,
477
+ templateId: template.id,
112
478
  });
113
- }
479
+ if (mcpRuntime.recoveryNotice) {
480
+ task += `\n\n## MCP Recovery Authority\n${mcpRuntime.recoveryNotice}`;
481
+ }
114
482
 
115
- // Create isolated sub-agent context
116
- const subAgent = SubAgentContext.create({
117
- role: `cowork-${template.id}`,
118
- task,
119
- inheritedContext: null,
120
- maxIterations,
121
- tokenBudget,
122
- db,
123
- llmOptions,
124
- cwd,
125
- onProgress,
126
- signal,
127
- extraToolDefinitions: mcp.extraToolDefinitions,
128
- externalToolDescriptors: mcp.externalToolDescriptors,
129
- externalToolExecutors: mcp.externalToolExecutors,
130
- mcpClient: mcp.mcpClient,
131
- });
483
+ // Create isolated sub-agent context
484
+ const subAgent = SubAgentContext.create({
485
+ role: `cowork-${template.id}`,
486
+ task,
487
+ inheritedContext: null,
488
+ maxIterations,
489
+ tokenBudget,
490
+ db,
491
+ llmOptions,
492
+ cwd,
493
+ onProgress,
494
+ signal,
495
+ extraToolDefinitions: mcp.extraToolDefinitions,
496
+ externalToolDescriptors: mcp.externalToolDescriptors,
497
+ externalToolExecutors: mcp.externalToolExecutors,
498
+ mcpClient: mcp.mcpClient,
499
+ ...(mcpRuntime.ledger ? { mcpCallLedger: mcpRuntime.ledger } : {}),
500
+ });
132
501
 
133
- const taskId = subAgent.id;
502
+ const taskId = subAgent.id;
134
503
 
135
- // Build loop options — pass shell policy overrides if template declares them
136
- const loopOptions = {};
137
- if (
138
- Array.isArray(template.shellPolicyOverrides) &&
139
- template.shellPolicyOverrides.length
140
- ) {
141
- loopOptions.shellPolicyOverrides = template.shellPolicyOverrides;
142
- }
504
+ if (mcpRuntime.sessionId && mcpRuntime.bindingAllowed) {
505
+ const mapped = await _deps.appendSessionEventIfHead(
506
+ mcpRuntime.sessionId,
507
+ "cowork_mcp_session",
508
+ {
509
+ schemaVersion: 1,
510
+ taskId,
511
+ templateId: template.id,
512
+ },
513
+ mcpRuntime.expectedHeadHash,
514
+ );
515
+ if (mapped === false) {
516
+ const error = new Error(
517
+ "Cowork MCP task/session binding was not persisted",
518
+ );
519
+ error.code = "CC_COWORK_MCP_SESSION_BIND_FAILED";
520
+ throw error;
521
+ }
522
+ }
143
523
 
144
- // Run the agent with the user's message
145
- try {
146
- const result = await subAgent.run(userMessage, loopOptions);
147
- const entry = {
148
- taskId,
149
- status: subAgent.status,
150
- templateId: template.id,
151
- templateName: template.name,
152
- result,
153
- };
154
- _appendHistory(cwd, entry, userMessage);
155
- return entry;
156
- } catch (err) {
157
- const entry = {
158
- taskId,
159
- status: "failed",
160
- templateId: template.id,
161
- templateName: template.name,
162
- result: {
163
- summary: `Task failed: ${err.message}`,
164
- artifacts: [],
165
- tokenCount: 0,
166
- toolsUsed: [],
167
- iterationCount: 0,
168
- },
169
- };
170
- _appendHistory(cwd, entry, userMessage);
171
- return entry;
524
+ // Build loop options — pass shell policy overrides if template declares them
525
+ const loopOptions =
526
+ mcpRuntime.sessionId && mcpRuntime.bindingAllowed
527
+ ? { sessionId: mcpRuntime.sessionId }
528
+ : {};
529
+ if (
530
+ Array.isArray(template.shellPolicyOverrides) &&
531
+ template.shellPolicyOverrides.length
532
+ ) {
533
+ loopOptions.shellPolicyOverrides = template.shellPolicyOverrides;
534
+ }
535
+
536
+ // Run the agent with the user's message
537
+ try {
538
+ const result = await subAgent.run(userMessage, loopOptions);
539
+ const entry = {
540
+ taskId,
541
+ status: subAgent.status,
542
+ templateId: template.id,
543
+ templateName: template.name,
544
+ ...(mcpRuntime.sessionId ? { mcpSessionId: mcpRuntime.sessionId } : {}),
545
+ result,
546
+ };
547
+ _appendHistory(cwd, entry, userMessage);
548
+ return entry;
549
+ } catch (err) {
550
+ const entry = {
551
+ taskId,
552
+ status: "failed",
553
+ templateId: template.id,
554
+ templateName: template.name,
555
+ ...(mcpRuntime.sessionId ? { mcpSessionId: mcpRuntime.sessionId } : {}),
556
+ result: {
557
+ summary: `Task failed: ${err.message}`,
558
+ artifacts: [],
559
+ tokenCount: 0,
560
+ toolsUsed: [],
561
+ iterationCount: 0,
562
+ },
563
+ };
564
+ _appendHistory(cwd, entry, userMessage);
565
+ return entry;
566
+ }
172
567
  } finally {
173
568
  await mcp.cleanup();
174
569
  }