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.
- package/README.md +151 -29
- package/package.json +2 -2
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-BiHNUlbU.js → AIOps-CEeYTeDB.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-D-UFjDRQ.js → ActionButton-BeRUQ3V2.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DazVsDgW.js → Analytics-DrV718XF.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DXh9UfNJ.js → AppLayout-Cd2Frt7Q.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-CZ6tsceY.js → Artifacts-CUJMlORU.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-RyxnBr_h.js → Audit-CXJcfT6p.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BWS51Q6X.js → BackgroundAgents-DOv6Z7H9.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BRtPcUul.js → Backup-BwdDyBI0.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CGd4vZYY.js → BaseInput-BmLn4kYH.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-h8ijVwCg.js → Chat-COg8pAW2.js} +4 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-4gGkdGgA.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-NyF6dPl8.js → Checkbox-BCP4uoU8.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-Ci4OOxr5.js → Codegen-pRt6Y9JI.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CwTkc9BM.js → Col-DLaprKhS.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DW_tM82m.js → Community-DyATsz5f.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DEvHRV4S.js → Compact-BXAaupZK.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BbjBEEfD.js → Compliance-DpcJBELr.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-10IXBaBa.js → Cowork-DG4EFWyd.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-BZkbpd5I.js → Cron-F6Oy5n2P.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CFQ8L_6v.js → Crosschain-BOdgtalX.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BDF6AkXe.js → DID-DT1dSkjH.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-CoOdWMi4.js → Dashboard-NBUIqWzC.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DEsGmu8Y.js → Dropdown-CSpHeMYB.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BS89SWlK.js → EmailListRenderer-CEG0xISr.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-C1FpCHiI.js → FamilyGuardDashboard-BTZ0BZna.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BzvpVmLA.js → Federation-BuuCTn2V.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BeC259PQ.js → FormItemContext-KAVceevk.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-azgG3bmV.js → GenericCardRenderer-DnHpcQvW.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BmSSowc5.js → Git-C_B_0HwB.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CTBCSyQZ.js → Governance-DPSZuzuu.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DA5xyk4a.js → Inference-BV-06V7q.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-D1gPHNig.js → KnowledgeGraph-wpDuupn6.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BPmLf1AR.js → Logs-Bseca1_I.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-SVLOg49H.js → MarkdownRenderer-B4RLp2zs.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-DtUFcR0E.js → Marketplace-d3kM4DDL.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DS_kqBv-.js → McpTools-DQ_xZ23i.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-Fvh7XL7V.js → Memory-CRIeYO4L.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-C7itAP45.js → MobileBridge-BsllIa9l.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-BUuQy30X.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-B57MiNLK.js → Mtc-BOFDIzrC.js} +6 -6
- package/src/assets/web-panel/assets/{MtcAudit-BXfCUcM7.js → MtcAudit-BQg-vyvG.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-yaJ-ZcF6.js → Multisig-Bo1jrPdN.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CoaUCKrO.js → NLProgramming-Bmod8alw.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BKLM_65R.js → Notes-CGGFL8w-.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DoDtK9uZ.js → NotificationSettings-BsZvCJxC.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BJ28TGr-.js → OrderTableRenderer-C1-Quo_h.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-MuGsdoIb.js → Organization-BjOeDYOi.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BLUN9J4R.js → Overflow-DwVV3l5A.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DWuoBUPd.js → P2P-Cu3DQT9W.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CUi37YPj.js → PdhVaultBrowser-Cg0gR7dH.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-BYQg2pcr.js → Permissions-CsAXxRN5.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CAxoV2xu.js → PersonalDataHub-C-nNmnYp.js} +6 -6
- package/src/assets/web-panel/assets/{Pipeline-B33wGvIO.js → Pipeline-BOnW7nNc.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-A8yXTORP.js → Privacy-ClLSyGKt.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-D49I2I1O.js → ProjectInit-DuLvjjq7.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Ci73jJDw.js → ProjectSettings-DQYYbDD9.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-CF-yD6Cn.js → Projects-Drw8MBGK.js} +1 -1
- package/src/assets/web-panel/assets/Providers-ckqHQe6K.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-Brza0ykJ.js → QrScannerModal-DW5BXk-G.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DFydhjxL.js → QuickAsk-DDLnhNTp.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DLF8_NhA.js → Recommend-PJQ2C91U.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-dyuStW3x.js → RemoteSession-s6wmda34.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-5F3tA6yw.js → Reputation-DC2sb-I3.js} +1 -1
- package/src/assets/web-panel/assets/{Row-Ca2A57S5.js → Row-hPGk1eGj.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-B0bxBkq_.js → RssFeed-RIvfZql0.js} +3 -3
- package/src/assets/web-panel/assets/{Search-CFNvHalZ.js → Search-DFg1G1eR.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DSoH3Hav.js → Security-D6H5p8Dp.js} +4 -4
- package/src/assets/web-panel/assets/{Services-BHpfEmBQ.js → Services-nxYiFV_w.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-Dsh-QNmn.js → Skeleton-BmgFNAdB.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BhT1NkSU.js → Skills-CsaaD2av.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DY9snPeJ.js → Sla-yM5y9yvK.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CWaX0_Cx.js → SpeechSettings-DPy1XMYh.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-B690y_TC.js → SyncSettings-CFVhEyyr.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-2N-w3zWd.js → Tasks-DdO02Inn.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-BjwQOQYC.js → Templates-Eo2d8Llu.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CUqHErxY.js → Tenant-ChESOXgy.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-C13rXvNy.js → Terminal-BJ7oDxTI.js} +2 -2
- package/src/assets/web-panel/assets/TimelineRenderer-hWX0fUvz.js +1 -0
- package/src/assets/web-panel/assets/{Tokens-BXHLGXYC.js → Tokens-DVBZQnd-.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-1e5i65o3.js → Trigger-D89cQfVq.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-FLGqNHs5.js → Trust-BIVSb4-V.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-BbaR_LJB.js → UkeySign-B58gWopl.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-NOp4RIov.js → VideoEditing-DhHI7bmG.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-B7DW7bG4.js → Wallet-C4FheWS_.js} +3 -3
- package/src/assets/web-panel/assets/{WebAuthn-BptSUWix.js → WebAuthn-DnPRq-Bx.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-CAJnDOXS.js → WorkflowEditor-BerRPjpJ.js} +1 -1
- package/src/assets/web-panel/assets/{chat-I8LgG1-Z.js → chat-BzZ52iKr.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CWe7SOVD.js → colors-BI_E4BAn.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-Cx3u3CA3.js → compact-item-d50mr3yk.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CgD5ArwY.js → createContext-C6FsQ1IH.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CagEcIex.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BfQWiXN8.js → hasIn-DLZEMgLP.js} +1 -1
- package/src/assets/web-panel/assets/{index-BuEQSorC.js → index-9H_M2jju.js} +1 -1
- package/src/assets/web-panel/assets/{index-BiI-xPRH.js → index-A5CDWP7y.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAVy98u7.js → index-AHr7ryWf.js} +1 -1
- package/src/assets/web-panel/assets/{index-BUAR7RY-.js → index-B81mo1Et.js} +1 -1
- package/src/assets/web-panel/assets/{index-DlIyt1qF.js → index-BAE3hwev.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dcdm_Z2c.js → index-BB9SqVSt.js} +1 -1
- package/src/assets/web-panel/assets/{index-CWZ3REg6.js → index-BRGx3w6T.js} +3 -3
- package/src/assets/web-panel/assets/{index-B6yChzt1.js → index-BTpIOTfR.js} +1 -1
- package/src/assets/web-panel/assets/{index-DeizoQVZ.js → index-BZjjdQ62.js} +1 -1
- package/src/assets/web-panel/assets/{index-e8BM1yY1.js → index-BcSUl9fA.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNYFQxAW.js → index-BeM4hfht.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGMYTN5W.js → index-Bmr_vxXD.js} +1 -1
- package/src/assets/web-panel/assets/{index-BREnPKGo.js → index-BoNZlzhQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-B1cX4Rxu.js → index-C3k8kevG.js} +1 -1
- package/src/assets/web-panel/assets/{index-3iKP9OTJ.js → index-CLoTQr0W.js} +1 -1
- package/src/assets/web-panel/assets/{index-C1UjHdgZ.js → index-CO8DAF7U.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cy_cCJlr.js → index-CRN5TRTQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-C0nDKhWv.js → index-CUaEHfQ0.js} +1 -1
- package/src/assets/web-panel/assets/{index-DslTuqro.js → index-CVzuawCX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CAUnl4Jv.js → index-CdKt9fOd.js} +1 -1
- package/src/assets/web-panel/assets/{index-CMu16vPC.js → index-CgkoH3_g.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-rIKccl.js → index-CjuKZBqJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bx7BNIRH.js → index-Co7s9LsB.js} +1 -1
- package/src/assets/web-panel/assets/{index-Doc0Ftpd.js → index-D-aBumtY.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cd79NQAx.js → index-DE0V6cp-.js} +1 -1
- package/src/assets/web-panel/assets/{index-V-kIHzAV.js → index-DY4j5zkF.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bi24S7Dw.js → index-Dec0Kf_Z.js} +1 -1
- package/src/assets/web-panel/assets/{index-DCJEY2T0.js → index-DoFtCVZ7.js} +1 -1
- package/src/assets/web-panel/assets/{index-C0ztiqtB.js → index-DqkbHHg8.js} +1 -1
- package/src/assets/web-panel/assets/{index-CcX4FSPf.js → index-DsscwxPE.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdRkCwm4.js → index-GXE0D8Nx.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmgtY58H.js → index-IPkwSAW_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQDKYbnv.js → index-KNGgO4Wm.js} +1 -1
- package/src/assets/web-panel/assets/{index-87gMxqhN.js → index-Pvf30m8Q.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmrdUwzU.js → index-Q5Tn735s.js} +1 -1
- package/src/assets/web-panel/assets/{index-DFb-XIKy.js → index-TWG-_D1M.js} +1 -1
- package/src/assets/web-panel/assets/{index-DsQcURkA.js → index-Y2-q7QLm.js} +1 -1
- package/src/assets/web-panel/assets/index-pzT9PpOU.js +1 -0
- package/src/assets/web-panel/assets/index-z1kFadaX.js +1 -0
- package/src/assets/web-panel/assets/{initDefaultProps-DiBszVdG.js → initDefaultProps-D-4Hzgej.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BGIFFozv.js → motion-D4Wl4xU7.js} +1 -1
- package/src/assets/web-panel/assets/{move-D5W7mp7B.js → move-Cd5eQvL0.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-JFIlxJ7F.js → mtc-parser-B4ilslCW.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CQ3o6LIU.js → omit-Ckarx-tf.js} +1 -1
- package/src/assets/web-panel/assets/parsers-YNLm7sQ0.js +4 -0
- package/src/assets/web-panel/assets/{pickAttrs-R8MIlXo3.js → pickAttrs-QJ0bpCmc.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-sW7ylSky.js → placementArrow-CKHm-tq8.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-Cnl39Vbz.js → responsiveObserve-CV6a_w_Y.js} +1 -1
- package/src/assets/web-panel/assets/{slide-sn8tFd14.js → slide-mHpeQFgk.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-IKKY_QxZ.js → statusUtils-DIaQNQWA.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BNpV4Nqs.js → styleChecker-PJpzavV8.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BWyT_eoU.js → useFlexGapSupport-BH7zTw8S.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-D09p6_U9.js → useFs-BDNG3JDd.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CzW3TkJZ.js → usePersonalDataHub-CY2VWdUg.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-3s3WoAKB.js → vnode-D0kw9jhz.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Cjy_673s.js → zoom-B5g7TN7r.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +3 -3
- package/src/commands/agent.js +105 -35
- package/src/commands/artifacts.js +598 -33
- package/src/commands/cowork.js +200 -5
- package/src/commands/session-budget.js +155 -0
- package/src/commands/session-location.js +968 -1
- package/src/commands/session.js +23 -2
- package/src/data/changelog.json +28 -2
- package/src/gateways/ws/artifact-protocol.js +77 -13
- package/src/gateways/ws/message-dispatcher.js +57 -0
- package/src/gateways/ws/session-protocol.js +391 -24
- package/src/gateways/ws/ws-agent-handler.js +191 -14
- package/src/gateways/ws/ws-server.js +14 -3
- package/src/gateways/ws/ws-session-gateway.js +101 -5
- package/src/harness/jsonl-session-store.js +1210 -0
- package/src/lib/agent-team/team-runner.js +43 -13
- package/src/lib/artifact-access-ledger.js +462 -0
- package/src/lib/artifact-cleanup-ledger.js +861 -0
- package/src/lib/artifact-deletion-ledger.js +678 -0
- package/src/lib/artifact-recovery.js +970 -0
- package/src/lib/artifact-store.js +256 -51
- package/src/lib/artifact-workbench-projection.js +171 -0
- package/src/lib/command-lifecycle-report.js +8 -4
- package/src/lib/cowork-adapter.js +9 -5
- package/src/lib/cowork-task-runner.js +20 -0
- package/src/lib/cowork-workflow.js +178 -20
- package/src/lib/direct-model-usage.js +62 -22
- package/src/lib/dynamic-workflow-runtime.js +3592 -112
- package/src/lib/execution-location-result-apply.js +339 -0
- package/src/lib/execution-location-result-artifact.js +271 -0
- package/src/lib/execution-location-result-review.js +253 -0
- package/src/lib/execution-location-result-store.js +331 -0
- package/src/lib/execution-location-result.js +617 -0
- package/src/lib/execution-location-target.js +240 -3
- package/src/lib/managed-tool-checkpoint.js +47 -4
- package/src/lib/mcp-stdio-executable-identity.js +16 -0
- package/src/lib/mcp-stdio-native-code-policy.js +74 -0
- package/src/lib/mcp-stdio-package-materialization.js +12 -3
- package/src/lib/process-execution-broker/index.js +112 -0
- package/src/lib/process-execution-broker/platform-sandbox.js +57 -3
- package/src/lib/process-execution-broker/workspace-transaction.js +29 -0
- package/src/lib/session-budget-production-root.js +376 -0
- package/src/lib/session-budget-runtime.js +109 -18
- package/src/lib/session-budget-usage.js +63 -0
- package/src/lib/session-host-snapshot.js +19 -2
- package/src/lib/session-projection.js +126 -10
- package/src/lib/session-resource-budget.js +766 -105
- package/src/lib/sub-agent-context.js +69 -22
- package/src/lib/web-ui-server.js +12 -1
- package/src/repl/agent-repl.js +237 -16
- package/src/runtime/agent-core.js +135 -0
- package/src/runtime/headless-runner.js +135 -46
- package/src/runtime/headless-stream.js +133 -25
- package/src/runtime/policies/agent-policy.js +10 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-D7tcdDS9.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-DGbP36-3.js +0 -1
- package/src/assets/web-panel/assets/Providers-D-etEhg5.js +0 -1
- package/src/assets/web-panel/assets/TimelineRenderer-CpbWcya_.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DLv_872g.js +0 -1
- package/src/assets/web-panel/assets/index-CdiGCibe.js +0 -1
- package/src/assets/web-panel/assets/index-D_0z-gyz.js +0 -1
- package/src/assets/web-panel/assets/parsers-UEvh_ShA.js +0 -4
package/src/commands/cowork.js
CHANGED
|
@@ -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
|
-
{
|
|
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
|
+
}
|