chainlesschain 0.165.3 → 0.165.5

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 (214) hide show
  1. package/README.md +151 -29
  2. package/package.json +2 -2
  3. package/src/assets/web-panel/.build-hash +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-BiHNUlbU.js → AIOps-CEeYTeDB.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-D-UFjDRQ.js → ActionButton-BeRUQ3V2.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-DazVsDgW.js → Analytics-DrV718XF.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-DXh9UfNJ.js → AppLayout-Cd2Frt7Q.js} +5 -5
  8. package/src/assets/web-panel/assets/{Artifacts-CZ6tsceY.js → Artifacts-CUJMlORU.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-RyxnBr_h.js → Audit-CXJcfT6p.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-BWS51Q6X.js → BackgroundAgents-DOv6Z7H9.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-BRtPcUul.js → Backup-BwdDyBI0.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-CGd4vZYY.js → BaseInput-BmLn4kYH.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-h8ijVwCg.js → Chat-COg8pAW2.js} +4 -4
  14. package/src/assets/web-panel/assets/ChatBubbleRenderer-4gGkdGgA.js +1 -0
  15. package/src/assets/web-panel/assets/{Checkbox-NyF6dPl8.js → Checkbox-BCP4uoU8.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-Ci4OOxr5.js → Codegen-pRt6Y9JI.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-CwTkc9BM.js → Col-DLaprKhS.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-DW_tM82m.js → Community-DyATsz5f.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-DEvHRV4S.js → Compact-BXAaupZK.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-BbjBEEfD.js → Compliance-DpcJBELr.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-10IXBaBa.js → Cowork-DG4EFWyd.js} +2 -2
  22. package/src/assets/web-panel/assets/{Cron-BZkbpd5I.js → Cron-F6Oy5n2P.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-CFQ8L_6v.js → Crosschain-BOdgtalX.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-BDF6AkXe.js → DID-DT1dSkjH.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-CoOdWMi4.js → Dashboard-NBUIqWzC.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-DEsGmu8Y.js → Dropdown-CSpHeMYB.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-BS89SWlK.js → EmailListRenderer-CEG0xISr.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-C1FpCHiI.js → FamilyGuardDashboard-BTZ0BZna.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-BzvpVmLA.js → Federation-BuuCTn2V.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-BeC259PQ.js → FormItemContext-KAVceevk.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-azgG3bmV.js → GenericCardRenderer-DnHpcQvW.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-BmSSowc5.js → Git-C_B_0HwB.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-CTBCSyQZ.js → Governance-DPSZuzuu.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-DA5xyk4a.js → Inference-BV-06V7q.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-D1gPHNig.js → KnowledgeGraph-wpDuupn6.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-BPmLf1AR.js → Logs-Bseca1_I.js} +2 -2
  37. package/src/assets/web-panel/assets/{MarkdownRenderer-SVLOg49H.js → MarkdownRenderer-B4RLp2zs.js} +1 -1
  38. package/src/assets/web-panel/assets/{Marketplace-DtUFcR0E.js → Marketplace-d3kM4DDL.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-DS_kqBv-.js → McpTools-DQ_xZ23i.js} +3 -3
  40. package/src/assets/web-panel/assets/{Memory-Fvh7XL7V.js → Memory-CRIeYO4L.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-C7itAP45.js → MobileBridge-BsllIa9l.js} +1 -1
  42. package/src/assets/web-panel/assets/MobileProjects-BUuQy30X.js +1 -0
  43. package/src/assets/web-panel/assets/{Mtc-B57MiNLK.js → Mtc-BOFDIzrC.js} +6 -6
  44. package/src/assets/web-panel/assets/{MtcAudit-BXfCUcM7.js → MtcAudit-BQg-vyvG.js} +5 -5
  45. package/src/assets/web-panel/assets/{Multisig-yaJ-ZcF6.js → Multisig-Bo1jrPdN.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-CoaUCKrO.js → NLProgramming-Bmod8alw.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-BKLM_65R.js → Notes-CGGFL8w-.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-DoDtK9uZ.js → NotificationSettings-BsZvCJxC.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-BJ28TGr-.js → OrderTableRenderer-C1-Quo_h.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-MuGsdoIb.js → Organization-BjOeDYOi.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-BLUN9J4R.js → Overflow-DwVV3l5A.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-DWuoBUPd.js → P2P-Cu3DQT9W.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-CUi37YPj.js → PdhVaultBrowser-Cg0gR7dH.js} +3 -3
  54. package/src/assets/web-panel/assets/{Permissions-BYQg2pcr.js → Permissions-CsAXxRN5.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-CAxoV2xu.js → PersonalDataHub-C-nNmnYp.js} +6 -6
  56. package/src/assets/web-panel/assets/{Pipeline-B33wGvIO.js → Pipeline-BOnW7nNc.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-A8yXTORP.js → Privacy-ClLSyGKt.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-D49I2I1O.js → ProjectInit-DuLvjjq7.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-Ci73jJDw.js → ProjectSettings-DQYYbDD9.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-CF-yD6Cn.js → Projects-Drw8MBGK.js} +1 -1
  61. package/src/assets/web-panel/assets/Providers-ckqHQe6K.js +1 -0
  62. package/src/assets/web-panel/assets/{QrScannerModal-Brza0ykJ.js → QrScannerModal-DW5BXk-G.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-DFydhjxL.js → QuickAsk-DDLnhNTp.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-DLF8_NhA.js → Recommend-PJQ2C91U.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-dyuStW3x.js → RemoteSession-s6wmda34.js} +3 -3
  66. package/src/assets/web-panel/assets/{Reputation-5F3tA6yw.js → Reputation-DC2sb-I3.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-Ca2A57S5.js → Row-hPGk1eGj.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-B0bxBkq_.js → RssFeed-RIvfZql0.js} +3 -3
  69. package/src/assets/web-panel/assets/{Search-CFNvHalZ.js → Search-DFg1G1eR.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-DSoH3Hav.js → Security-D6H5p8Dp.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-BHpfEmBQ.js → Services-nxYiFV_w.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-Dsh-QNmn.js → Skeleton-BmgFNAdB.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-BhT1NkSU.js → Skills-CsaaD2av.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-DY9snPeJ.js → Sla-yM5y9yvK.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-CWaX0_Cx.js → SpeechSettings-DPy1XMYh.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-B690y_TC.js → SyncSettings-CFVhEyyr.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-2N-w3zWd.js → Tasks-DdO02Inn.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-BjwQOQYC.js → Templates-Eo2d8Llu.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-CUqHErxY.js → Tenant-ChESOXgy.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-C13rXvNy.js → Terminal-BJ7oDxTI.js} +2 -2
  81. package/src/assets/web-panel/assets/TimelineRenderer-hWX0fUvz.js +1 -0
  82. package/src/assets/web-panel/assets/{Tokens-BXHLGXYC.js → Tokens-DVBZQnd-.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-1e5i65o3.js → Trigger-D89cQfVq.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-FLGqNHs5.js → Trust-BIVSb4-V.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-BbaR_LJB.js → UkeySign-B58gWopl.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-NOp4RIov.js → VideoEditing-DhHI7bmG.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-B7DW7bG4.js → Wallet-C4FheWS_.js} +3 -3
  88. package/src/assets/web-panel/assets/{WebAuthn-BptSUWix.js → WebAuthn-DnPRq-Bx.js} +5 -5
  89. package/src/assets/web-panel/assets/{WorkflowEditor-CAJnDOXS.js → WorkflowEditor-BerRPjpJ.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-I8LgG1-Z.js → chat-BzZ52iKr.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-CWe7SOVD.js → colors-BI_E4BAn.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-Cx3u3CA3.js → compact-item-d50mr3yk.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-CgD5ArwY.js → createContext-C6FsQ1IH.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-CagEcIex.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-BfQWiXN8.js → hasIn-DLZEMgLP.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-BuEQSorC.js → index-9H_M2jju.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-BiI-xPRH.js → index-A5CDWP7y.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DAVy98u7.js → index-AHr7ryWf.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BUAR7RY-.js → index-B81mo1Et.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DlIyt1qF.js → index-BAE3hwev.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-Dcdm_Z2c.js → index-BB9SqVSt.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CWZ3REg6.js → index-BRGx3w6T.js} +3 -3
  103. package/src/assets/web-panel/assets/{index-B6yChzt1.js → index-BTpIOTfR.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DeizoQVZ.js → index-BZjjdQ62.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-e8BM1yY1.js → index-BcSUl9fA.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CNYFQxAW.js → index-BeM4hfht.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DGMYTN5W.js → index-Bmr_vxXD.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BREnPKGo.js → index-BoNZlzhQ.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-B1cX4Rxu.js → index-C3k8kevG.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-3iKP9OTJ.js → index-CLoTQr0W.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-C1UjHdgZ.js → index-CO8DAF7U.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-Cy_cCJlr.js → index-CRN5TRTQ.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-C0nDKhWv.js → index-CUaEHfQ0.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DslTuqro.js → index-CVzuawCX.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CAUnl4Jv.js → index-CdKt9fOd.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CMu16vPC.js → index-CgkoH3_g.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-C-rIKccl.js → index-CjuKZBqJ.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Bx7BNIRH.js → index-Co7s9LsB.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-Doc0Ftpd.js → index-D-aBumtY.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Cd79NQAx.js → index-DE0V6cp-.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-V-kIHzAV.js → index-DY4j5zkF.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-Bi24S7Dw.js → index-Dec0Kf_Z.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DCJEY2T0.js → index-DoFtCVZ7.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-C0ztiqtB.js → index-DqkbHHg8.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-CcX4FSPf.js → index-DsscwxPE.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CdRkCwm4.js → index-GXE0D8Nx.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-DmgtY58H.js → index-IPkwSAW_.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CQDKYbnv.js → index-KNGgO4Wm.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-87gMxqhN.js → index-Pvf30m8Q.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DmrdUwzU.js → index-Q5Tn735s.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DFb-XIKy.js → index-TWG-_D1M.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DsQcURkA.js → index-Y2-q7QLm.js} +1 -1
  133. package/src/assets/web-panel/assets/index-pzT9PpOU.js +1 -0
  134. package/src/assets/web-panel/assets/index-z1kFadaX.js +1 -0
  135. package/src/assets/web-panel/assets/{initDefaultProps-DiBszVdG.js → initDefaultProps-D-4Hzgej.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-BGIFFozv.js → motion-D4Wl4xU7.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-D5W7mp7B.js → move-Cd5eQvL0.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-JFIlxJ7F.js → mtc-parser-B4ilslCW.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-CQ3o6LIU.js → omit-Ckarx-tf.js} +1 -1
  140. package/src/assets/web-panel/assets/parsers-YNLm7sQ0.js +4 -0
  141. package/src/assets/web-panel/assets/{pickAttrs-R8MIlXo3.js → pickAttrs-QJ0bpCmc.js} +1 -1
  142. package/src/assets/web-panel/assets/{placementArrow-sW7ylSky.js → placementArrow-CKHm-tq8.js} +1 -1
  143. package/src/assets/web-panel/assets/{responsiveObserve-Cnl39Vbz.js → responsiveObserve-CV6a_w_Y.js} +1 -1
  144. package/src/assets/web-panel/assets/{slide-sn8tFd14.js → slide-mHpeQFgk.js} +1 -1
  145. package/src/assets/web-panel/assets/{statusUtils-IKKY_QxZ.js → statusUtils-DIaQNQWA.js} +1 -1
  146. package/src/assets/web-panel/assets/{styleChecker-BNpV4Nqs.js → styleChecker-PJpzavV8.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFlexGapSupport-BWyT_eoU.js → useFlexGapSupport-BH7zTw8S.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFs-D09p6_U9.js → useFs-BDNG3JDd.js} +1 -1
  149. package/src/assets/web-panel/assets/{usePersonalDataHub-CzW3TkJZ.js → usePersonalDataHub-CY2VWdUg.js} +1 -1
  150. package/src/assets/web-panel/assets/{vnode-3s3WoAKB.js → vnode-D0kw9jhz.js} +1 -1
  151. package/src/assets/web-panel/assets/{zoom-Cjy_673s.js → zoom-B5g7TN7r.js} +1 -1
  152. package/src/assets/web-panel/index.html +1 -1
  153. package/src/command-help-index.json +3 -3
  154. package/src/commands/agent.js +105 -35
  155. package/src/commands/artifacts.js +598 -33
  156. package/src/commands/cowork.js +200 -5
  157. package/src/commands/session-budget.js +155 -0
  158. package/src/commands/session-location.js +968 -1
  159. package/src/commands/session.js +23 -2
  160. package/src/data/changelog.json +28 -2
  161. package/src/gateways/ws/artifact-protocol.js +77 -13
  162. package/src/gateways/ws/message-dispatcher.js +57 -0
  163. package/src/gateways/ws/session-protocol.js +391 -24
  164. package/src/gateways/ws/ws-agent-handler.js +191 -14
  165. package/src/gateways/ws/ws-server.js +14 -3
  166. package/src/gateways/ws/ws-session-gateway.js +101 -5
  167. package/src/harness/jsonl-session-store.js +1210 -0
  168. package/src/lib/agent-team/team-runner.js +43 -13
  169. package/src/lib/artifact-access-ledger.js +462 -0
  170. package/src/lib/artifact-cleanup-ledger.js +861 -0
  171. package/src/lib/artifact-deletion-ledger.js +678 -0
  172. package/src/lib/artifact-recovery.js +970 -0
  173. package/src/lib/artifact-store.js +256 -51
  174. package/src/lib/artifact-workbench-projection.js +171 -0
  175. package/src/lib/command-lifecycle-report.js +8 -4
  176. package/src/lib/cowork-adapter.js +9 -5
  177. package/src/lib/cowork-task-runner.js +20 -0
  178. package/src/lib/cowork-workflow.js +178 -20
  179. package/src/lib/direct-model-usage.js +62 -22
  180. package/src/lib/dynamic-workflow-runtime.js +3592 -112
  181. package/src/lib/execution-location-result-apply.js +339 -0
  182. package/src/lib/execution-location-result-artifact.js +271 -0
  183. package/src/lib/execution-location-result-review.js +253 -0
  184. package/src/lib/execution-location-result-store.js +331 -0
  185. package/src/lib/execution-location-result.js +617 -0
  186. package/src/lib/execution-location-target.js +240 -3
  187. package/src/lib/managed-tool-checkpoint.js +47 -4
  188. package/src/lib/mcp-stdio-executable-identity.js +16 -0
  189. package/src/lib/mcp-stdio-native-code-policy.js +74 -0
  190. package/src/lib/mcp-stdio-package-materialization.js +12 -3
  191. package/src/lib/process-execution-broker/index.js +112 -0
  192. package/src/lib/process-execution-broker/platform-sandbox.js +57 -3
  193. package/src/lib/process-execution-broker/workspace-transaction.js +29 -0
  194. package/src/lib/session-budget-production-root.js +376 -0
  195. package/src/lib/session-budget-runtime.js +109 -18
  196. package/src/lib/session-budget-usage.js +63 -0
  197. package/src/lib/session-host-snapshot.js +19 -2
  198. package/src/lib/session-projection.js +126 -10
  199. package/src/lib/session-resource-budget.js +766 -105
  200. package/src/lib/sub-agent-context.js +69 -22
  201. package/src/lib/web-ui-server.js +12 -1
  202. package/src/repl/agent-repl.js +237 -16
  203. package/src/runtime/agent-core.js +135 -0
  204. package/src/runtime/headless-runner.js +135 -46
  205. package/src/runtime/headless-stream.js +133 -25
  206. package/src/runtime/policies/agent-policy.js +10 -0
  207. package/src/assets/web-panel/assets/ChatBubbleRenderer-D7tcdDS9.js +0 -1
  208. package/src/assets/web-panel/assets/MobileProjects-DGbP36-3.js +0 -1
  209. package/src/assets/web-panel/assets/Providers-D-etEhg5.js +0 -1
  210. package/src/assets/web-panel/assets/TimelineRenderer-CpbWcya_.js +0 -1
  211. package/src/assets/web-panel/assets/devWarning-DLv_872g.js +0 -1
  212. package/src/assets/web-panel/assets/index-CdiGCibe.js +0 -1
  213. package/src/assets/web-panel/assets/index-D_0z-gyz.js +0 -1
  214. package/src/assets/web-panel/assets/parsers-UEvh_ShA.js +0 -4
@@ -1009,15 +1009,24 @@ export function registerCoworkCommand(program, commandDeps = {}) {
1009
1009
  workflow
1010
1010
  .command("runtime-status <run-id>")
1011
1011
  .description("Read a durable workflow run without invoking a task provider")
1012
+ .option("--cwd <path>", "Project root containing the durable run")
1012
1013
  .option("--json", "Machine-readable JSON output")
1013
1014
  .action(async (runId, options) => {
1014
1015
  try {
1015
1016
  const runtime = await import("../lib/dynamic-workflow-runtime.js");
1016
1017
  const statePath = runtime.dynamicWorkflowRunStatePath(
1017
- process.cwd(),
1018
+ options.cwd || process.cwd(),
1018
1019
  runId,
1019
1020
  );
1020
- const projection = runtime.projectDynamicWorkflowRuntime(statePath);
1021
+ const projection = runtime.projectDynamicWorkflowRuntime(statePath, {
1022
+ currentStoreReadback: true,
1023
+ ...(Object.hasOwn(commandDeps, "workflowArtifactStore")
1024
+ ? { artifactStore: commandDeps.workflowArtifactStore }
1025
+ : {}),
1026
+ ...(Object.hasOwn(commandDeps, "workflowCheckpointStore")
1027
+ ? { checkpointStore: commandDeps.workflowCheckpointStore }
1028
+ : {}),
1029
+ });
1021
1030
  if (options.json) {
1022
1031
  console.log(JSON.stringify(projection, null, 2));
1023
1032
  return;
@@ -1031,12 +1040,65 @@ export function registerCoworkCommand(program, commandDeps = {}) {
1031
1040
  for (const effect of projection.pendingEffects) {
1032
1041
  logger.log(` pending: ${effect.id} (${effect.key})`);
1033
1042
  }
1043
+ for (const request of projection.pendingInputRequests) {
1044
+ logger.log(
1045
+ ` needs input: ${request.id} step=${request.stepId} ${request.prompt}`,
1046
+ );
1047
+ }
1048
+ if (projection.currentStoreReadbacks.eligibleCalls > 0) {
1049
+ logger.log(
1050
+ ` current stores: ${projection.currentStoreReadbacks.verifiedCalls}/${projection.currentStoreReadbacks.eligibleCalls} verified`,
1051
+ );
1052
+ for (const gap of projection.currentStoreReadbacks.gaps) {
1053
+ logger.log(` current store gap: ${gap}`);
1054
+ }
1055
+ }
1034
1056
  } catch (err) {
1035
1057
  logger.error(`WORKFLOW_RUNTIME_STATUS_FAILED: ${err.message}`);
1036
1058
  process.exitCode = 2;
1037
1059
  }
1038
1060
  });
1039
1061
 
1062
+ workflow
1063
+ .command("runtime-recovery-plan")
1064
+ .description(
1065
+ "Dry-run the bounded startup/periodic recovery policy for this project",
1066
+ )
1067
+ .option("--cwd <path>", "Project root containing durable runs")
1068
+ .option("-n, --limit <n>", "Maximum durable runs to inspect", "100")
1069
+ .option("--json", "Machine-readable JSON output")
1070
+ .action(async (options) => {
1071
+ try {
1072
+ const runtime = await import("../lib/dynamic-workflow-runtime.js");
1073
+ const plan = runtime.buildDynamicWorkflowRecoveryPlan(
1074
+ options.cwd || process.cwd(),
1075
+ {
1076
+ limit: Math.max(1, parseInt(options.limit) || 100),
1077
+ ...(Object.hasOwn(commandDeps, "workflowCheckpointStore")
1078
+ ? { checkpointStore: commandDeps.workflowCheckpointStore }
1079
+ : {}),
1080
+ },
1081
+ );
1082
+ if (options.json) {
1083
+ console.log(JSON.stringify(plan, null, 2));
1084
+ return;
1085
+ }
1086
+ logger.log(
1087
+ `${plan.summary.attention}/${plan.summary.total} durable runs need attention; plan ${plan.planDigest}`,
1088
+ );
1089
+ for (const item of plan.items.filter(
1090
+ (entry) => entry.risk !== "none",
1091
+ )) {
1092
+ logger.log(
1093
+ ` ${item.runId} ${item.risk} action=${item.recommendedAction} revision=${item.revision}`,
1094
+ );
1095
+ }
1096
+ } catch (err) {
1097
+ logger.error(`WORKFLOW_RUNTIME_RECOVERY_PLAN_FAILED: ${err.message}`);
1098
+ process.exitCode = 2;
1099
+ }
1100
+ });
1101
+
1040
1102
  for (const action of ["pause", "stop", "resume"]) {
1041
1103
  workflow
1042
1104
  .command(`runtime-${action} <run-id>`)
@@ -1047,12 +1109,13 @@ export function registerCoworkCommand(program, commandDeps = {}) {
1047
1109
  "--expected-revision <n>",
1048
1110
  "Exact runtime revision shown by runtime-status",
1049
1111
  )
1112
+ .option("--cwd <path>", "Project root containing the durable run")
1050
1113
  .option("--json", "Machine-readable JSON output")
1051
1114
  .action(async (runId, options) => {
1052
1115
  try {
1053
1116
  const runtime = await import("../lib/dynamic-workflow-runtime.js");
1054
1117
  const statePath = runtime.dynamicWorkflowRunStatePath(
1055
- process.cwd(),
1118
+ options.cwd || process.cwd(),
1056
1119
  runId,
1057
1120
  );
1058
1121
  const operation =
@@ -1079,6 +1142,130 @@ export function registerCoworkCommand(program, commandDeps = {}) {
1079
1142
  });
1080
1143
  }
1081
1144
 
1145
+ workflow
1146
+ .command("runtime-recover-checkpoint <run-id> <call-record-id>")
1147
+ .description(
1148
+ "Settle one crash-visible tool call from its bound terminal checkpoint store record",
1149
+ )
1150
+ .requiredOption(
1151
+ "--expected-revision <n>",
1152
+ "Exact runtime revision shown by runtime-status",
1153
+ )
1154
+ .option("--cwd <path>", "Project root containing the durable run")
1155
+ .option("--json", "Machine-readable JSON output")
1156
+ .action(async (runId, callRecordId, options) => {
1157
+ try {
1158
+ const runtime = await import("../lib/dynamic-workflow-runtime.js");
1159
+ const statePath = runtime.dynamicWorkflowRunStatePath(
1160
+ options.cwd || process.cwd(),
1161
+ runId,
1162
+ );
1163
+ const state = runtime.recoverDurableWorkflowCheckpointCall(
1164
+ statePath,
1165
+ {
1166
+ expectedRevision: options.expectedRevision,
1167
+ callRecordId,
1168
+ },
1169
+ Object.hasOwn(commandDeps, "workflowCheckpointStore")
1170
+ ? { checkpointStore: commandDeps.workflowCheckpointStore }
1171
+ : {},
1172
+ );
1173
+ const projection = runtime.projectDynamicWorkflowRuntime(state);
1174
+ if (options.json) {
1175
+ console.log(JSON.stringify(projection, null, 2));
1176
+ } else {
1177
+ logger.log(
1178
+ `${projection.runId} ${projection.status} revision=${projection.revision}`,
1179
+ );
1180
+ }
1181
+ } catch (err) {
1182
+ logger.error(
1183
+ `WORKFLOW_RUNTIME_RECOVER_CHECKPOINT_FAILED: ${err.message}`,
1184
+ );
1185
+ process.exitCode = 2;
1186
+ }
1187
+ });
1188
+
1189
+ workflow
1190
+ .command("runtime-recover-checkpoints <run-id>")
1191
+ .description(
1192
+ "Atomically settle every crash-visible child call with a bound terminal checkpoint store record",
1193
+ )
1194
+ .requiredOption(
1195
+ "--expected-revision <n>",
1196
+ "Exact runtime revision shown by runtime-status",
1197
+ )
1198
+ .option("--cwd <path>", "Project root containing the durable run")
1199
+ .option("--json", "Machine-readable JSON output")
1200
+ .action(async (runId, options) => {
1201
+ try {
1202
+ const runtime = await import("../lib/dynamic-workflow-runtime.js");
1203
+ const statePath = runtime.dynamicWorkflowRunStatePath(
1204
+ options.cwd || process.cwd(),
1205
+ runId,
1206
+ );
1207
+ const state = runtime.recoverDurableWorkflowCheckpointCalls(
1208
+ statePath,
1209
+ { expectedRevision: options.expectedRevision },
1210
+ Object.hasOwn(commandDeps, "workflowCheckpointStore")
1211
+ ? { checkpointStore: commandDeps.workflowCheckpointStore }
1212
+ : {},
1213
+ );
1214
+ const projection = runtime.projectDynamicWorkflowRuntime(state);
1215
+ if (options.json) {
1216
+ console.log(JSON.stringify(projection, null, 2));
1217
+ } else {
1218
+ logger.log(
1219
+ `${projection.runId} ${projection.status} revision=${projection.revision}`,
1220
+ );
1221
+ }
1222
+ } catch (err) {
1223
+ logger.error(
1224
+ `WORKFLOW_RUNTIME_RECOVER_CHECKPOINTS_FAILED: ${err.message}`,
1225
+ );
1226
+ process.exitCode = 2;
1227
+ }
1228
+ });
1229
+
1230
+ workflow
1231
+ .command("runtime-reply <run-id> <request-id> <response-file>")
1232
+ .description(
1233
+ "Answer one revision-bound durable stage input request from a bounded JSON file",
1234
+ )
1235
+ .requiredOption(
1236
+ "--expected-revision <n>",
1237
+ "Exact runtime revision shown by runtime-status",
1238
+ )
1239
+ .option("--cwd <path>", "Project root containing the durable run")
1240
+ .option("--json", "Machine-readable JSON output")
1241
+ .action(async (runId, requestId, responseFile, options) => {
1242
+ try {
1243
+ const runtime = await import("../lib/dynamic-workflow-runtime.js");
1244
+ const statePath = runtime.dynamicWorkflowRunStatePath(
1245
+ options.cwd || process.cwd(),
1246
+ runId,
1247
+ );
1248
+ const answer =
1249
+ runtime.readDynamicWorkflowInputResponseFile(responseFile);
1250
+ const state = runtime.submitDurableWorkflowInput(statePath, {
1251
+ expectedRevision: options.expectedRevision,
1252
+ requestId,
1253
+ answer,
1254
+ });
1255
+ const projection = runtime.projectDynamicWorkflowRuntime(state);
1256
+ if (options.json) {
1257
+ console.log(JSON.stringify(projection, null, 2));
1258
+ } else {
1259
+ logger.log(
1260
+ `${projection.runId} ${projection.status} revision=${projection.revision}`,
1261
+ );
1262
+ }
1263
+ } catch (err) {
1264
+ logger.error(`WORKFLOW_RUNTIME_REPLY_FAILED: ${err.message}`);
1265
+ process.exitCode = 2;
1266
+ }
1267
+ });
1268
+
1082
1269
  workflow
1083
1270
  .command("runtime-reconcile <run-id> <effect-id> <result-file>")
1084
1271
  .description(
@@ -1088,12 +1275,13 @@ export function registerCoworkCommand(program, commandDeps = {}) {
1088
1275
  "--expected-revision <n>",
1089
1276
  "Exact runtime revision shown by runtime-status",
1090
1277
  )
1278
+ .option("--cwd <path>", "Project root containing the durable run")
1091
1279
  .option("--json", "Machine-readable JSON output")
1092
1280
  .action(async (runId, effectId, resultFile, options) => {
1093
1281
  try {
1094
1282
  const runtime = await import("../lib/dynamic-workflow-runtime.js");
1095
1283
  const statePath = runtime.dynamicWorkflowRunStatePath(
1096
- process.cwd(),
1284
+ options.cwd || process.cwd(),
1097
1285
  runId,
1098
1286
  );
1099
1287
  const result = runtime.readDynamicWorkflowEffectResultFile(resultFile);
@@ -1519,7 +1707,14 @@ export function registerCoworkCommand(program, commandDeps = {}) {
1519
1707
  runId: options.durableRunId,
1520
1708
  execution,
1521
1709
  },
1522
- { runTask: runCoworkTask },
1710
+ {
1711
+ runTask: runCoworkTask,
1712
+ ...(Object.hasOwn(commandDeps, "workflowCheckpointStore")
1713
+ ? {
1714
+ checkpointStore: commandDeps.workflowCheckpointStore,
1715
+ }
1716
+ : {}),
1717
+ },
1523
1718
  );
1524
1719
  },
1525
1720
  },
@@ -0,0 +1,155 @@
1
+ import {
2
+ adjudicateProductionSessionBudgetRecovery,
3
+ readProductionSessionBudget,
4
+ readProductionSessionBudgetRecoveryReceipts,
5
+ } from "../lib/session-budget-production-root.js";
6
+
7
+ function writeJson(value, write = console.log) {
8
+ write(JSON.stringify(value, null, 2));
9
+ }
10
+
11
+ function collect(value, previous) {
12
+ return [...previous, value];
13
+ }
14
+
15
+ function parseSettlement(value) {
16
+ let parsed;
17
+ try {
18
+ parsed = JSON.parse(value);
19
+ } catch (error) {
20
+ throw new Error(`Invalid --settlement JSON: ${error.message}`);
21
+ }
22
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
23
+ throw new Error("Invalid --settlement JSON: expected one object");
24
+ }
25
+ return parsed;
26
+ }
27
+
28
+ export function renderSessionBudgetStatus(status) {
29
+ if (!status) return ["No durable session budget authority was found."];
30
+ const lines = [
31
+ `Session budget ${status.sessionId} (revision ${status.revision})`,
32
+ `turns ${status.totals.turns}/${status.limits.maxTurns ?? "unlimited"}; tokens ${status.totals.tokens}/${status.limits.maxTokens ?? "unlimited"}; USD ${status.totals.spentUsd}/${status.limits.maxUsd ?? "unlimited"}`,
33
+ `tool time ${status.totals.toolMs}/${status.limits.maxToolMs ?? "unlimited"} ms; active wall ${status.totals.elapsedMs}/${status.limits.maxWallMs ?? "unlimited"} ms`,
34
+ `recovery ${status.recoveryRequired ? `required (${status.pendingRecovery.length})` : "not required"}`,
35
+ ];
36
+ const adjudication = status.state?.recoveryAdjudication;
37
+ if (adjudication) {
38
+ lines.push(
39
+ `recovery adjudication ${adjudication.headDigest} (sequence ${adjudication.count})`,
40
+ );
41
+ }
42
+ for (const pending of status.pendingRecovery) {
43
+ lines.push(
44
+ ` ${pending.authorityId} ${pending.resourceType}/${pending.kind}`,
45
+ );
46
+ }
47
+ return lines;
48
+ }
49
+
50
+ export function renderSessionBudgetReceipts(receipts) {
51
+ if (!receipts) {
52
+ return ["No durable session budget authority was found."];
53
+ }
54
+ const retained = receipts.entries.length;
55
+ const lines = [
56
+ `Session budget recovery receipts ${receipts.sessionId} (revision ${receipts.revision})`,
57
+ `history ${receipts.complete ? "complete" : "partial"}; retained ${retained}/${receipts.count}; head ${receipts.headDigest || "none"}`,
58
+ ];
59
+ if (!receipts.complete && receipts.baseDigest) {
60
+ lines.push(
61
+ ` legacy prefix through sequence ${receipts.baseSequence}: ${receipts.baseDigest}`,
62
+ );
63
+ }
64
+ for (const receipt of receipts.entries) {
65
+ lines.push(
66
+ ` sequence ${receipt.sequence}: ${receipt.digest}; settled ${receipt.settled.length}; abandoned ${receipt.abandoned.length}; tokens ${receipt.totalsBefore.tokens}->${receipt.totalsAfter.tokens}; USD ${receipt.totalsBefore.spentUsd}->${receipt.totalsAfter.spentUsd}`,
67
+ );
68
+ }
69
+ return lines;
70
+ }
71
+
72
+ export function registerSessionBudgetCommands(session, dependencies = {}) {
73
+ const readBudget =
74
+ dependencies.readProductionSessionBudget || readProductionSessionBudget;
75
+ const readReceipts =
76
+ dependencies.readProductionSessionBudgetRecoveryReceipts ||
77
+ readProductionSessionBudgetRecoveryReceipts;
78
+ const adjudicate =
79
+ dependencies.adjudicateProductionSessionBudgetRecovery ||
80
+ adjudicateProductionSessionBudgetRecovery;
81
+ const write = dependencies.write || console.log;
82
+ const writeError = dependencies.writeError || console.error;
83
+
84
+ const budget = session
85
+ .command("budget")
86
+ .description("Inspect or adjudicate a durable session budget authority");
87
+
88
+ budget
89
+ .command("status <session-id>", { isDefault: true })
90
+ .description("Read the current durable session budget status")
91
+ .option("--json", "Output JSON")
92
+ .action((sessionId, options) => {
93
+ try {
94
+ const status = readBudget(sessionId);
95
+ if (options.json) writeJson(status, write);
96
+ else for (const line of renderSessionBudgetStatus(status)) write(line);
97
+ } catch (error) {
98
+ writeError(`Session budget status failed: ${error.message}`);
99
+ process.exitCode = 1;
100
+ }
101
+ });
102
+
103
+ budget
104
+ .command("recover <session-id>")
105
+ .description(
106
+ "Adjudicate every exact crash-pending authority as verified usage or abandoned",
107
+ )
108
+ .option(
109
+ "--abandon <authority-id...>",
110
+ "Exact opaque authority ids shown by session budget status",
111
+ )
112
+ .option(
113
+ "--settlement <json>",
114
+ "Repeatable verified usage JSON with authorityId, provider, model, and usage",
115
+ collect,
116
+ [],
117
+ )
118
+ .option("--json", "Output JSON")
119
+ .action((sessionId, options) => {
120
+ try {
121
+ const result = adjudicate(sessionId, {
122
+ abandoned: options.abandon || [],
123
+ settled: options.settlement.map(parseSettlement),
124
+ });
125
+ if (options.json) writeJson(result, write);
126
+ else {
127
+ write(
128
+ `Recovered session budget ${sessionId}; recorded ${result.settled.length} verified usage settlement(s), abandoned ${result.abandoned.length} exact authority id(s); adjudication ${result.adjudication.digest}.`,
129
+ );
130
+ }
131
+ } catch (error) {
132
+ writeError(`Session budget recovery failed: ${error.message}`);
133
+ process.exitCode = 1;
134
+ }
135
+ });
136
+
137
+ budget
138
+ .command("receipts <session-id>")
139
+ .description(
140
+ "Read canonical content-free recovery receipts retained by the durable budget",
141
+ )
142
+ .option("--json", "Output JSON")
143
+ .action((sessionId, options) => {
144
+ try {
145
+ const receipts = readReceipts(sessionId);
146
+ if (options.json) writeJson(receipts, write);
147
+ else {
148
+ for (const line of renderSessionBudgetReceipts(receipts)) write(line);
149
+ }
150
+ } catch (error) {
151
+ writeError(`Session budget receipts failed: ${error.message}`);
152
+ process.exitCode = 1;
153
+ }
154
+ });
155
+ }