chainlesschain 0.165.1 → 0.165.2

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 (202) hide show
  1. package/README.md +248 -2
  2. package/package.json +4 -1
  3. package/src/assets/web-panel/assets/{AIOps-CYxFDrcm.js → AIOps-lS1R0Cza.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-CPBtdiU2.js → ActionButton-BmlgBPsj.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-Dayq7Dp7.js → Analytics-CNKczv1S.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-6U7bPb2s.js → AppLayout-BuZGJARQ.js} +4 -4
  7. package/src/assets/web-panel/assets/{Artifacts-D2Iqg_3D.js → Artifacts-Dm73Sl-O.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-CdoOB7WV.js → Audit-BGMW7A5e.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-DrnAVB8w.js → BackgroundAgents-BQ6M54JR.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-CesMi5cy.js → Backup-DBzGP0bR.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-DaX9ptax.js → BaseInput-D1mLCoOV.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-OrwOPxDS.js → Chat-BUfcN7p8.js} +4 -4
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CvPZFRxM.js → ChatBubbleRenderer-CY5m8ZHg.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-DiHbcysC.js → Checkbox-Du0Yg5Pi.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-CbgCkaBJ.js → Codegen-B2RXziHW.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-Du5hgrh4.js → Col-DWhekOrR.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-DsPOBW-p.js → Community-HQhrkon4.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-BwHIFkNC.js → Compact-izHNb4uz.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-BvrDQSgd.js → Compliance-BDwLy41-.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-gwAE6arx.js → Cowork-DFJhLa7K.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-DW-0l4uF.js → Cron-DYY9RG7-.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-j-NsLesB.js → Crosschain-rr7tJTtv.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-CibVEBOI.js → DID-D2sfHRLi.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-W4z9vSfe.js → Dashboard-q_eGdhha.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-DAcrkKxG.js → Dropdown-Cufrh2Bz.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-6GXah-89.js → EmailListRenderer-B-kdv10f.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-TKDCq8Ku.js → FamilyGuardDashboard-D21XjgfG.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-BXBLlcNm.js → Federation-CAwRTLZH.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-BoJJBkG3.js → FormItemContext-vx3daNDF.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-okjsl46v.js → GenericCardRenderer-CRWY2wU4.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-Rvs7i6nn.js → Git-Q6SwauyD.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-CHSUxXXS.js → Governance-BJ1q4IQZ.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-V3BlfxsB.js → Inference-CSWjROgD.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-C_NlD4aR.js → KnowledgeGraph-fzuQsWuY.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-Nn4LNxhA.js → Logs-DVF8Mnns.js} +2 -2
  36. package/src/assets/web-panel/assets/MarkdownRenderer-BLif4QSg.js +1 -0
  37. package/src/assets/web-panel/assets/{Marketplace-DEmjFcg-.js → Marketplace-BQP7LOA4.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-DlopXipI.js → McpTools-BNlJCmNc.js} +4 -4
  39. package/src/assets/web-panel/assets/{Memory-BG3ynX60.js → Memory-DLLg5WQ4.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-DeRzWOfT.js → MobileBridge-CR2skNAF.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-Tyd3o2A0.js → MobileProjects-BxVavObl.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-BoPbOv1C.js → Mtc-B17pgqMI.js} +4 -4
  43. package/src/assets/web-panel/assets/{MtcAudit-un-rTHp7.js → MtcAudit-4UmV5cIL.js} +2 -2
  44. package/src/assets/web-panel/assets/{Multisig-Ds0oveEB.js → Multisig-DoMEXEcU.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-D09JI-yY.js → NLProgramming-h9DMXFX4.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-DTRhiKJn.js → Notes-Cihn-xX8.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-BAnnNCim.js → NotificationSettings-BE6ZGa3R.js} +1 -1
  48. package/src/assets/web-panel/assets/{OrderTableRenderer-Yr-1fSYi.js → OrderTableRenderer-CnwojoSI.js} +1 -1
  49. package/src/assets/web-panel/assets/{Organization-S9EAolpj.js → Organization-B2vpwmjb.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-CqcLKqJ8.js → Overflow-C4z28R0-.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-Dw0F9EcU.js → P2P-BVlFkwhW.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-BDRwUevN.js → PdhVaultBrowser-BXbEdL5B.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-D3_c3nKB.js → Permissions-C28xs4lp.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-CxdMV98x.js → PersonalDataHub-Dgl_rBjM.js} +3 -3
  55. package/src/assets/web-panel/assets/{Pipeline-CgjNQFLI.js → Pipeline-3QUIhrKI.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-BHghIIht.js → Privacy-8Gh33OZ5.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-De6pqaKM.js → ProjectInit-BNmg4tZi.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-Bg4ZkNYQ.js → ProjectSettings-vgMfeCf9.js} +2 -2
  59. package/src/assets/web-panel/assets/Projects-BhtAVilc.js +1 -0
  60. package/src/assets/web-panel/assets/{Providers-CUnHbNf-.js → Providers-CXoOa8eX.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-DA2f3Wts.js → QrScannerModal-BhfTF0oS.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-C1FeHDqp.js → QuickAsk-C746HEAj.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-B5guaUMN.js → Recommend-BSej8Eo0.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-PDADSds3.js → RemoteSession-f3gmnlG3.js} +3 -3
  65. package/src/assets/web-panel/assets/{Reputation-eTlRhgvK.js → Reputation-CyvybpkN.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-D7AqSGY0.js → Row-DwV2PeYn.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-JiuLm4Ja.js → RssFeed-11GrzjZy.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-CwruahW3.js → Search-BjKXkrAY.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-CdhqaR0b.js → Security-eWiFb9Yk.js} +4 -4
  70. package/src/assets/web-panel/assets/{Services-CU0ZIlcT.js → Services-CdCsMAtt.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-CtduPfAb.js → Skeleton-4Q2UTKQ5.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-CROXm6AY.js → Skills-v4rtYrRj.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-DiZiABFD.js → Sla-CRhsFvd_.js} +1 -1
  74. package/src/assets/web-panel/assets/SpeechSettings-DLjKsDVu.js +1 -0
  75. package/src/assets/web-panel/assets/{SyncSettings-DBX6J1Oe.js → SyncSettings-D16zonl7.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-BLyRJd3-.js → Tasks-Xxozz0i_.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-BKa5qzmk.js → Templates-CXJpPtCT.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-DnD3a4M6.js → Tenant-XRV0L1ZF.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-DEitQeTb.js → Terminal-CYuO1i_w.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-CjHggTDq.js → TimelineRenderer-BXqitWsu.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-CsGT7sfl.js → Tokens-BvPrDHIy.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-yr4rFDrW.js → Trigger-DhCrSTf5.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-CLvu1Sjp.js → Trust-DmsuZD6K.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-B0m7yUP8.js → UkeySign-D_yrts5C.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-C0VvP4lc.js → VideoEditing-B01ihPrm.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-kllBAG1M.js → Wallet-DpUjKa-N.js} +3 -3
  87. package/src/assets/web-panel/assets/{WebAuthn-C54UQNLx.js → WebAuthn-CL07yON6.js} +3 -3
  88. package/src/assets/web-panel/assets/{WorkflowEditor-B7y8qSvU.js → WorkflowEditor-CLMflnRr.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-DRzTh8CJ.js → chat-DtUqe8h_.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-BSMwSnCx.js → colors-DPKrgVfy.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-BTg602H5.js → compact-item-BTt2GtOm.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-B6EGsdvp.js → createContext-D_VeUc1J.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-Bj5nUW2v.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-DDKqJ8RD.js → hasIn-1kndiylj.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-CUEU48o1.js → index-2eyAXE3d.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-rjzk9z1Q.js → index-4bna2_SR.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-CmAubjDi.js → index-8nz_fmlj.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-Co7oM1qr.js → index-B9KvcS7R.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BMuGd2--.js → index-BAXfRKfG.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BVTAl5N2.js → index-BHpBMWCh.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DpTHIRfZ.js → index-BaZAbw9A.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CWGax2QW.js → index-BepLZwgB.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DiW0sDkz.js → index-Bhudc_Ez.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CGNklbP6.js → index-BlDNVgBt.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-u2YVld9W.js → index-By5n8up9.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-pqfux8vZ.js → index-CHG-KcS4.js} +1 -1
  107. package/src/assets/web-panel/assets/index-CPcM-eqo.js +1 -0
  108. package/src/assets/web-panel/assets/{index-BRqt4fO-.js → index-CX81qSM4.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-BsR7Y2NG.js → index-CauoBQkH.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-C_JzIXUq.js → index-CcO04eDn.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CQlHFN_g.js → index-CtF7EN49.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CwPUZbMI.js → index-CzjkKUmR.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-th2ihDc0.js → index-D95OFht7.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CHfLYwcW.js → index-DFIZ_1Sf.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-C1GFfuqN.js → index-DG2MZQ3f.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-D1naNj4U.js → index-DJ8vXGOa.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DLdrHhML.js → index-Dbbymxpj.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DBT3YeQ9.js → index-DdkplL9R.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BICn3Qh1.js → index-DfGl8CqG.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-DqFXGzzC.js → index-DfKBRdSS.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-Bx044qDj.js → index-DsJCDUJG.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-XFe-1twF.js → index-Dwqmtk65.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-C66NpWy5.js → index-DxdTdBix.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CmAInUkX.js → index-FzdwcSy2.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Cf23wVMs.js → index-GsoUQ2M7.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-D5CsBShd.js → index-brCInrzq.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-323Hhxxt.js → index-dVc-CXY4.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-p2HYn89m.js → index-fk2Rjacw.js} +3 -3
  129. package/src/assets/web-panel/assets/{index-Dfv2lKu3.js → index-l1BETrDb.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CNxg61YP.js → index-m31Ka8hZ.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CDTvsX8t.js → index-ocf06EVQ.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-Dc77VR3H.js → index-sDoMHTNA.js} +1 -1
  133. package/src/assets/web-panel/assets/index-xeSyVoRe.js +1 -0
  134. package/src/assets/web-panel/assets/{initDefaultProps-C3Djh9fa.js → initDefaultProps-CvyYJd7z.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-BzqFmbSe.js → motion-DYZkhUdz.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-DJo_FFaW.js → move-slnJRVT1.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-_tlTiBvk.js → mtc-parser-DVc0CKmy.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-CB2ZyxUg.js → omit-BCXAtHCq.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-DZwIFD4u.js → pickAttrs-DBsemz_K.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-DxZY0dgk.js → placementArrow-BRtkJ-nv.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-CzzGt7GL.js → responsiveObserve-Cebq7EZn.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-BaIK52yz.js → slide-DT7qvId2.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-3-FHu9_M.js → statusUtils-pQiITLkG.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-BkRT68fK.js → styleChecker-c-19BVKQ.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-DHYwKS-s.js → useFlexGapSupport-DsS5-0bE.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-DVVUhV8p.js → useFs-CxGiMe5n.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-CkrFKAzQ.js → usePersonalDataHub-D9btVID5.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-BuBLFz0c.js → vnode-CUYFsFEN.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-kpm6LtXU.js → zoom-CXmn_35j.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/command-help-index.json +1 -1
  152. package/src/commands/cowork.js +280 -5
  153. package/src/commands/plugin.js +819 -64
  154. package/src/commands/session-location.js +318 -7
  155. package/src/constants.js +2 -2
  156. package/src/data/changelog.json +14 -1
  157. package/src/gateways/ws/action-protocol.js +1 -1
  158. package/src/harness/jsonl-session-store.js +638 -2
  159. package/src/harness/prompt-compressor.js +4 -0
  160. package/src/lib/background-agent-keeper-client.js +29 -0
  161. package/src/lib/background-agent-keeper-protocol.js +4 -0
  162. package/src/lib/background-agent-supervisor.js +59 -29
  163. package/src/lib/cowork-task-runner.js +70 -0
  164. package/src/lib/cowork-workflow.js +42 -9
  165. package/src/lib/doctor-checkup.js +34 -10
  166. package/src/lib/dynamic-workflow-draft.js +535 -0
  167. package/src/lib/dynamic-workflow-facade.js +11 -11
  168. package/src/lib/dynamic-workflow-runtime.js +2974 -0
  169. package/src/lib/execution-location-contract.js +111 -7
  170. package/src/lib/execution-location-runtime.js +3 -1
  171. package/src/lib/execution-location-target.js +910 -0
  172. package/src/lib/llm-providers.js +1 -0
  173. package/src/lib/mcp-call-ledger-store.js +35 -0
  174. package/src/lib/mcp-call-ledger.js +30 -0
  175. package/src/lib/plugin-runtime/__tests__/remote-source.test.js +34 -16
  176. package/src/lib/plugin-runtime/install.js +4956 -657
  177. package/src/lib/plugin-runtime/manifest.js +3 -1
  178. package/src/lib/plugin-runtime/marketplace-artifact-readback.js +671 -31
  179. package/src/lib/plugin-runtime/marketplace-catalog.js +68 -2
  180. package/src/lib/plugin-runtime/marketplace-impact.js +208 -15
  181. package/src/lib/plugin-runtime/marketplace-network.js +317 -0
  182. package/src/lib/plugin-runtime/marketplace-pac-worker.js +15 -0
  183. package/src/lib/plugin-runtime/marketplace-remote-artifacts.js +25 -2
  184. package/src/lib/plugin-runtime/marketplace-source-cache.js +359 -0
  185. package/src/lib/plugin-runtime/policy.js +21 -6
  186. package/src/lib/plugin-runtime/publisher-trust.js +332 -0
  187. package/src/lib/plugin-runtime/remote-source.js +323 -27
  188. package/src/lib/plugin-runtime/scopes.js +317 -41
  189. package/src/lib/plugin-runtime/transaction-journal.js +806 -0
  190. package/src/lib/public-ide-capability-manifest.js +1 -1
  191. package/src/lib/remote-membership-coordinator.js +8 -6
  192. package/src/lib/sub-agent-context.js +268 -2
  193. package/src/lib/task-model-selector.js +1 -1
  194. package/src/lib/with-file-lock.js +95 -5
  195. package/src/runtime/agent-core.js +595 -41
  196. package/src/workers/background-agent-keeper.js +40 -10
  197. package/src/assets/web-panel/assets/MarkdownRenderer-SVAgNnkt.js +0 -1
  198. package/src/assets/web-panel/assets/Projects-CP8vPvzs.js +0 -1
  199. package/src/assets/web-panel/assets/SpeechSettings-B5pLcXUw.js +0 -1
  200. package/src/assets/web-panel/assets/devWarning-Dol8jLEP.js +0 -1
  201. package/src/assets/web-panel/assets/index-C3QX5tOl.js +0 -1
  202. package/src/assets/web-panel/assets/index-xYybvEic.js +0 -1
@@ -48,7 +48,7 @@ function projectWorkflowExecutionAuthority(sessionId, verifiedProof) {
48
48
  }
49
49
  return Object.freeze({
50
50
  schema: SESSION_EXECUTION_LOCATION_AUTHORITY_SCHEMA,
51
- authority: "verified-session-start",
51
+ authority: proof.authority || "verified-session-start",
52
52
  sessionId: proof.sessionId,
53
53
  headHash: proof.headHash,
54
54
  eventCount: proof.eventCount,
@@ -866,6 +866,256 @@ export function registerCoworkCommand(program, commandDeps = {}) {
866
866
  .command("workflow")
867
867
  .description("Define and execute multi-step Cowork workflows (DAG)");
868
868
 
869
+ workflow
870
+ .command("draft <prompt>")
871
+ .description(
872
+ "Generate a digest-bound workflow draft for explicit human review",
873
+ )
874
+ .option("--provider <name>", "LLM provider to use")
875
+ .option("--model <name>", "LLM model to use")
876
+ .action(async (prompt, options) => {
877
+ try {
878
+ let chat;
879
+ let provider;
880
+ let model;
881
+ if (Object.hasOwn(commandDeps, "workflowDraftChat")) {
882
+ const descriptor = Object.getOwnPropertyDescriptor(
883
+ commandDeps,
884
+ "workflowDraftChat",
885
+ );
886
+ if (
887
+ !descriptor ||
888
+ !Object.hasOwn(descriptor, "value") ||
889
+ typeof descriptor.value !== "function"
890
+ ) {
891
+ throw new Error(
892
+ "Cowork workflow draft chat seam must be a function data property",
893
+ );
894
+ }
895
+ chat = descriptor.value;
896
+ provider = options.provider || "fixture";
897
+ model = options.model || "fixture-model";
898
+ } else {
899
+ const [{ createChatFn }, { BUILT_IN_PROVIDERS }, { loadConfig }] =
900
+ await Promise.all([
901
+ import("../lib/cowork-adapter.js"),
902
+ import("../lib/llm-providers.js"),
903
+ import("../lib/config-manager.js"),
904
+ ]);
905
+ const config = loadConfig()?.llm || {};
906
+ provider =
907
+ options.provider ||
908
+ process.env.LLM_PROVIDER ||
909
+ config.provider ||
910
+ "ollama";
911
+ const providerDefinition = BUILT_IN_PROVIDERS[provider];
912
+ if (!providerDefinition) {
913
+ throw new Error(`Unsupported workflow draft provider: ${provider}`);
914
+ }
915
+ model =
916
+ options.model ||
917
+ process.env.LLM_MODEL ||
918
+ (config.provider === provider ? config.model : null) ||
919
+ providerDefinition.models[0];
920
+ chat = createChatFn({
921
+ provider,
922
+ model,
923
+ ...(config.provider === provider && config.baseUrl
924
+ ? { baseUrl: config.baseUrl }
925
+ : {}),
926
+ ...(config.provider === provider && config.apiKey
927
+ ? { apiKey: config.apiKey }
928
+ : {}),
929
+ });
930
+ }
931
+ const { generateDynamicWorkflowDraft } =
932
+ await import("../lib/dynamic-workflow-draft.js");
933
+ const draft = await generateDynamicWorkflowDraft(
934
+ { prompt, provider, model },
935
+ { chat },
936
+ );
937
+ console.log(JSON.stringify(draft, null, 2));
938
+ } catch (err) {
939
+ logger.error(`WORKFLOW_DRAFT_FAILED: ${err.message}`);
940
+ process.exitCode = 2;
941
+ }
942
+ });
943
+
944
+ workflow
945
+ .command("review <file>")
946
+ .description(
947
+ "Accept or reject an exact workflow draft; accepted definitions are versioned",
948
+ )
949
+ .requiredOption(
950
+ "--expected-draft-digest <sha256>",
951
+ "Exact draft digest shown during review",
952
+ )
953
+ .requiredOption("--reviewer <identity>", "Human reviewer identity")
954
+ .option("--accept", "Accept and save the reviewed definition")
955
+ .option("--reject", "Reject without saving the definition")
956
+ .option("--reason <text>", "Bounded, secret-free review reason")
957
+ .option("--json", "Machine-readable JSON output")
958
+ .action(async (file, options) => {
959
+ try {
960
+ if (options.accept === options.reject) {
961
+ throw new Error("exactly one of --accept or --reject is required");
962
+ }
963
+ const [draftModule, workflowModule] = await Promise.all([
964
+ import("../lib/dynamic-workflow-draft.js"),
965
+ import("../lib/cowork-workflow.js"),
966
+ ]);
967
+ const draft = draftModule.readDynamicWorkflowDraftFile(file);
968
+ const review = draftModule.reviewDynamicWorkflowDraft({
969
+ draft,
970
+ expectedDraftDigest: options.expectedDraftDigest,
971
+ decision: options.accept ? "accept" : "reject",
972
+ reviewer: options.reviewer,
973
+ reason: options.reason,
974
+ });
975
+ let persisted = false;
976
+ if (review.status === "accepted") {
977
+ workflowModule.saveWorkflow(process.cwd(), review.definition);
978
+ const record = workflowModule.getWorkflowRecord(
979
+ process.cwd(),
980
+ review.definition.id,
981
+ );
982
+ if (
983
+ !record ||
984
+ record.definitionDigest !== review.acceptedDefinitionDigest
985
+ ) {
986
+ throw new Error(
987
+ "reviewed workflow readback did not match its accepted digest",
988
+ );
989
+ }
990
+ persisted = true;
991
+ }
992
+ const result = Object.freeze({ ...review, persisted });
993
+ if (options.json) {
994
+ console.log(JSON.stringify(result, null, 2));
995
+ return;
996
+ }
997
+ const label = review.status === "accepted" ? "Accepted" : "Rejected";
998
+ logger.log(`${label} workflow draft ${review.draftDigest}`);
999
+ logger.log(` review: ${review.reviewDigest}`);
1000
+ logger.log(
1001
+ ` definition: ${review.acceptedDefinitionDigest || "not-saved"}`,
1002
+ );
1003
+ } catch (err) {
1004
+ logger.error(`WORKFLOW_REVIEW_FAILED: ${err.message}`);
1005
+ process.exitCode = 2;
1006
+ }
1007
+ });
1008
+
1009
+ workflow
1010
+ .command("runtime-status <run-id>")
1011
+ .description("Read a durable workflow run without invoking a task provider")
1012
+ .option("--json", "Machine-readable JSON output")
1013
+ .action(async (runId, options) => {
1014
+ try {
1015
+ const runtime = await import("../lib/dynamic-workflow-runtime.js");
1016
+ const statePath = runtime.dynamicWorkflowRunStatePath(
1017
+ process.cwd(),
1018
+ runId,
1019
+ );
1020
+ const projection = runtime.projectDynamicWorkflowRuntime(statePath);
1021
+ if (options.json) {
1022
+ console.log(JSON.stringify(projection, null, 2));
1023
+ return;
1024
+ }
1025
+ logger.log(`${projection.runId} ${projection.status}`);
1026
+ logger.log(` revision: ${projection.revision}`);
1027
+ logger.log(` definition: ${projection.definitionDigest}`);
1028
+ logger.log(
1029
+ ` effects: ${projection.settledEffectCount}/${projection.effectCount} settled`,
1030
+ );
1031
+ for (const effect of projection.pendingEffects) {
1032
+ logger.log(` pending: ${effect.id} (${effect.key})`);
1033
+ }
1034
+ } catch (err) {
1035
+ logger.error(`WORKFLOW_RUNTIME_STATUS_FAILED: ${err.message}`);
1036
+ process.exitCode = 2;
1037
+ }
1038
+ });
1039
+
1040
+ for (const action of ["pause", "stop", "resume"]) {
1041
+ workflow
1042
+ .command(`runtime-${action} <run-id>`)
1043
+ .description(
1044
+ `${action[0].toUpperCase()}${action.slice(1)} a revision-bound durable workflow run`,
1045
+ )
1046
+ .requiredOption(
1047
+ "--expected-revision <n>",
1048
+ "Exact runtime revision shown by runtime-status",
1049
+ )
1050
+ .option("--json", "Machine-readable JSON output")
1051
+ .action(async (runId, options) => {
1052
+ try {
1053
+ const runtime = await import("../lib/dynamic-workflow-runtime.js");
1054
+ const statePath = runtime.dynamicWorkflowRunStatePath(
1055
+ process.cwd(),
1056
+ runId,
1057
+ );
1058
+ const operation =
1059
+ action === "pause"
1060
+ ? runtime.requestDurableWorkflowPause
1061
+ : action === "stop"
1062
+ ? runtime.requestDurableWorkflowStop
1063
+ : runtime.prepareDurableWorkflowResume;
1064
+ const state = operation(statePath, options.expectedRevision);
1065
+ const projection = runtime.projectDynamicWorkflowRuntime(state);
1066
+ if (options.json) {
1067
+ console.log(JSON.stringify(projection, null, 2));
1068
+ } else {
1069
+ logger.log(
1070
+ `${projection.runId} ${projection.status} revision=${projection.revision}`,
1071
+ );
1072
+ }
1073
+ } catch (err) {
1074
+ logger.error(
1075
+ `WORKFLOW_RUNTIME_${action.toUpperCase()}_FAILED: ${err.message}`,
1076
+ );
1077
+ process.exitCode = 2;
1078
+ }
1079
+ });
1080
+ }
1081
+
1082
+ workflow
1083
+ .command("runtime-reconcile <run-id> <effect-id> <result-file>")
1084
+ .description(
1085
+ "Settle one outcome-unknown effect from a bounded provider result file",
1086
+ )
1087
+ .requiredOption(
1088
+ "--expected-revision <n>",
1089
+ "Exact runtime revision shown by runtime-status",
1090
+ )
1091
+ .option("--json", "Machine-readable JSON output")
1092
+ .action(async (runId, effectId, resultFile, options) => {
1093
+ try {
1094
+ const runtime = await import("../lib/dynamic-workflow-runtime.js");
1095
+ const statePath = runtime.dynamicWorkflowRunStatePath(
1096
+ process.cwd(),
1097
+ runId,
1098
+ );
1099
+ const result = runtime.readDynamicWorkflowEffectResultFile(resultFile);
1100
+ const state = runtime.reconcileDurableWorkflowEffect(statePath, {
1101
+ expectedRevision: options.expectedRevision,
1102
+ effectId,
1103
+ result,
1104
+ });
1105
+ const projection = runtime.projectDynamicWorkflowRuntime(state);
1106
+ if (options.json) {
1107
+ console.log(JSON.stringify(projection, null, 2));
1108
+ } else {
1109
+ logger.log(
1110
+ `${projection.runId} ${projection.status} revision=${projection.revision}`,
1111
+ );
1112
+ }
1113
+ } catch (err) {
1114
+ logger.error(`WORKFLOW_RUNTIME_RECONCILE_FAILED: ${err.message}`);
1115
+ process.exitCode = 2;
1116
+ }
1117
+ });
1118
+
869
1119
  workflow
870
1120
  .command("list")
871
1121
  .description("List saved workflows")
@@ -1127,7 +1377,11 @@ export function registerCoworkCommand(program, commandDeps = {}) {
1127
1377
  "Verified session whose start event anchors execution authority",
1128
1378
  )
1129
1379
  .option("--continue-on-error", "Keep running after a step fails", false)
1130
- .option("--max-parallel <n>", "Max parallel steps per batch", "4")
1380
+ .option("--max-parallel <n>", "Max parallel steps per batch")
1381
+ .option(
1382
+ "--durable-run-id <id>",
1383
+ "Use request-before-provider durable runtime with atomic effect batches",
1384
+ )
1131
1385
  .option(
1132
1386
  "--pipeline",
1133
1387
  "No-barrier scheduling: start each step as soon as its own deps finish",
@@ -1203,6 +1457,8 @@ export function registerCoworkCommand(program, commandDeps = {}) {
1203
1457
  return;
1204
1458
  }
1205
1459
  const wf = record.definition;
1460
+ const requestedMaxParallel =
1461
+ options.maxParallel || (options.durableRunId ? "1" : "4");
1206
1462
  const executionAuthoritySessionId =
1207
1463
  requireWorkflowExecutionAuthoritySession(
1208
1464
  options.executionAuthoritySession,
@@ -1211,7 +1467,7 @@ export function registerCoworkCommand(program, commandDeps = {}) {
1211
1467
  {
1212
1468
  definitionAuthority: record,
1213
1469
  executionAuthoritySessionId,
1214
- maxParallel: options.maxParallel,
1470
+ maxParallel: requestedMaxParallel,
1215
1471
  execution: {
1216
1472
  cwd: process.cwd(),
1217
1473
  continueOnError: !!options.continueOnError,
@@ -1245,8 +1501,27 @@ export function registerCoworkCommand(program, commandDeps = {}) {
1245
1501
  getWorkflowVersion,
1246
1502
  getVerifiedSessionExecutionLocationAuthority,
1247
1503
  }),
1248
- executeWorkflow: (execution) =>
1249
- executeCoworkWorkflow({ ...execution, runTask: runCoworkTask }),
1504
+ executeWorkflow: async (execution) => {
1505
+ if (!options.durableRunId) {
1506
+ return executeCoworkWorkflow({
1507
+ ...execution,
1508
+ runTask: runCoworkTask,
1509
+ });
1510
+ }
1511
+ const runtime =
1512
+ await import("../lib/dynamic-workflow-runtime.js");
1513
+ return runtime.executeDurableDynamicWorkflow(
1514
+ {
1515
+ statePath: runtime.dynamicWorkflowRunStatePath(
1516
+ process.cwd(),
1517
+ options.durableRunId,
1518
+ ),
1519
+ runId: options.durableRunId,
1520
+ execution,
1521
+ },
1522
+ { runTask: runCoworkTask },
1523
+ );
1524
+ },
1250
1525
  },
1251
1526
  );
1252
1527
  if (!outcome.allowed) {