chainlesschain 0.165.2 → 0.165.4
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/assets/{AIOps-lS1R0Cza.js → AIOps-C__nnraW.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BmlgBPsj.js → ActionButton-CsKWHEZ-.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CNKczv1S.js → Analytics-BhIjfjWO.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-BuZGJARQ.js → AppLayout-BjuXFzWZ.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-Dm73Sl-O.js → Artifacts-k6whDkZJ.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-BGMW7A5e.js → Audit-C4FBMYRh.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BQ6M54JR.js → BackgroundAgents-C_vRrSXk.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DBzGP0bR.js → Backup-CngFZeVp.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-D1mLCoOV.js → BaseInput-B_H9EBRm.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BUfcN7p8.js → Chat-DLEC5kt7.js} +4 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-xijcWkJe.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-Du0Yg5Pi.js → Checkbox-m3ClR4xh.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-B2RXziHW.js → Codegen-CmLSFrgp.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DWhekOrR.js → Col-DFGQteHN.js} +1 -1
- package/src/assets/web-panel/assets/{Community-HQhrkon4.js → Community-EUUVORHE.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-izHNb4uz.js → Compact-2PSg0Yr7.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BDwLy41-.js → Compliance-CcKur7gB.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DFJhLa7K.js → Cowork-DK_Fezfa.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-DYY9RG7-.js → Cron-Dbw89xl7.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-rr7tJTtv.js → Crosschain-CH66h_Ec.js} +1 -1
- package/src/assets/web-panel/assets/{DID-D2sfHRLi.js → DID-D1igRb17.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-q_eGdhha.js → Dashboard-DVAsrobk.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-Cufrh2Bz.js → Dropdown-Dl7W8AQs.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-B-kdv10f.js → EmailListRenderer-D5tpaEQC.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-D21XjgfG.js → FamilyGuardDashboard-O_VQf8gq.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-CAwRTLZH.js → Federation-BTVcgS9n.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-vx3daNDF.js → FormItemContext-BRnkJAIz.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CRWY2wU4.js → GenericCardRenderer-8OWSCkDj.js} +1 -1
- package/src/assets/web-panel/assets/{Git-Q6SwauyD.js → Git-WXLYTQj2.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BJ1q4IQZ.js → Governance-BezaUhtc.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CSWjROgD.js → Inference-CuRay3Gu.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-fzuQsWuY.js → KnowledgeGraph-DfWLDW1m.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DVF8Mnns.js → Logs-C55y2pPY.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-hDpWdiBc.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-BQP7LOA4.js → Marketplace-Dk08Uycg.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BNlJCmNc.js → McpTools-C11fSB5V.js} +4 -4
- package/src/assets/web-panel/assets/{Memory-DLLg5WQ4.js → Memory-mr0eZc97.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CR2skNAF.js → MobileBridge-C0iCSRbb.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BxVavObl.js → MobileProjects-CY-xMG8Z.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-B17pgqMI.js → Mtc-Bplqc_Wc.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-4UmV5cIL.js → MtcAudit-BlzwsoSM.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-DoMEXEcU.js → Multisig-BBLmTty6.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-h9DMXFX4.js → NLProgramming-DtT1uf1W.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Cihn-xX8.js → Notes-DcqQAxTK.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BE6ZGa3R.js → NotificationSettings-cb0kWoZe.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-CnwojoSI.js → OrderTableRenderer-kw9HZQNN.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-B2vpwmjb.js → Organization-DlTlbkUN.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-C4z28R0-.js → Overflow-pp1qs-oY.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BVlFkwhW.js → P2P-BESLnyYz.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-BXbEdL5B.js → PdhVaultBrowser-B-J1mGuf.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-C28xs4lp.js → Permissions-B36PeT1_.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-Dgl_rBjM.js → PersonalDataHub-CTK2ad-3.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-3QUIhrKI.js → Pipeline-zJNGXsac.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-8Gh33OZ5.js → Privacy-b9fz0Qf0.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BNmg4tZi.js → ProjectInit-DjZbZgiB.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-vgMfeCf9.js → ProjectSettings-C-hHJXlD.js} +2 -2
- package/src/assets/web-panel/assets/Projects-BC9KSDM6.js +1 -0
- package/src/assets/web-panel/assets/{Providers-CXoOa8eX.js → Providers-Dz-CAYYU.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-BhfTF0oS.js → QrScannerModal-A0yoQ3-3.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-C746HEAj.js → QuickAsk-DrFgFJNC.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BSej8Eo0.js → Recommend-KC8hF1g4.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-f3gmnlG3.js → RemoteSession-DGTPIk6u.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-CyvybpkN.js → Reputation-QmbwM7Yk.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DwV2PeYn.js → Row-BxjJylia.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-11GrzjZy.js → RssFeed-B7Wda1J6.js} +3 -3
- package/src/assets/web-panel/assets/{Search-BjKXkrAY.js → Search-_plQ_YSA.js} +1 -1
- package/src/assets/web-panel/assets/{Security-eWiFb9Yk.js → Security-CD2YJZfx.js} +2 -2
- package/src/assets/web-panel/assets/{Services-CdCsMAtt.js → Services-qQE7NmwE.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-4Q2UTKQ5.js → Skeleton-DgQqkFf7.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-v4rtYrRj.js → Skills-C4C0oFFt.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CRhsFvd_.js → Sla-Px2N2B5c.js} +1 -1
- package/src/assets/web-panel/assets/SpeechSettings-DN6C3lQd.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-D16zonl7.js → SyncSettings-jm5aH_m7.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-Xxozz0i_.js → Tasks-DlkJcv67.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CXJpPtCT.js → Templates-DyrTHUBs.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-XRV0L1ZF.js → Tenant-mC434PtL.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-CYuO1i_w.js → Terminal-o0_s3NgK.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BXqitWsu.js → TimelineRenderer-DAGlAXOw.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BvPrDHIy.js → Tokens-BnulS_bs.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DhCrSTf5.js → Trigger-suQbVXYM.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DmsuZD6K.js → Trust-DbIJAPo5.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-D_yrts5C.js → UkeySign-CQNpbIHi.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-B01ihPrm.js → VideoEditing-D8aWCERk.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DpUjKa-N.js → Wallet-CuLpYfZc.js} +2 -2
- package/src/assets/web-panel/assets/{WebAuthn-CL07yON6.js → WebAuthn-CsfG8ZMc.js} +2 -2
- package/src/assets/web-panel/assets/{WorkflowEditor-CLMflnRr.js → WorkflowEditor-BYsEAZbd.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DtUqe8h_.js → chat-FT4Um3-I.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DPKrgVfy.js → colors-CKbS_Wlt.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BTt2GtOm.js → compact-item-CFJtzuJM.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-D_VeUc1J.js → createContext-B9kSRW6K.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DJZ0gAMu.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-1kndiylj.js → hasIn-DR-x0Xpi.js} +1 -1
- package/src/assets/web-panel/assets/{index-dVc-CXY4.js → index-7jHr_A_k.js} +1 -1
- package/src/assets/web-panel/assets/{index-DFIZ_1Sf.js → index-B3ZX81mK.js} +1 -1
- package/src/assets/web-panel/assets/{index-fk2Rjacw.js → index-B7osrXqy.js} +3 -3
- package/src/assets/web-panel/assets/{index-CHG-KcS4.js → index-BGbPnC5x.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dbbymxpj.js → index-BI5hP_qy.js} +1 -1
- package/src/assets/web-panel/assets/{index-BaZAbw9A.js → index-BK3TiKVq.js} +1 -1
- package/src/assets/web-panel/assets/{index-CzjkKUmR.js → index-BVPU43b1.js} +1 -1
- package/src/assets/web-panel/assets/{index-BAXfRKfG.js → index-BW-t9n-q.js} +1 -1
- package/src/assets/web-panel/assets/{index-8nz_fmlj.js → index-BfFCQHL3.js} +1 -1
- package/src/assets/web-panel/assets/index-Bizb4hkw.js +1 -0
- package/src/assets/web-panel/assets/{index-DdkplL9R.js → index-Bt4fS2eL.js} +1 -1
- package/src/assets/web-panel/assets/{index-DG2MZQ3f.js → index-BwR7yc2h.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfKBRdSS.js → index-Bzz0C1BZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-GsoUQ2M7.js → index-C2JvmYRc.js} +1 -1
- package/src/assets/web-panel/assets/{index-l1BETrDb.js → index-CGaXUsIs.js} +1 -1
- package/src/assets/web-panel/assets/{index-4bna2_SR.js → index-CJmIQ9XR.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfGl8CqG.js → index-C_enk9I_.js} +1 -1
- package/src/assets/web-panel/assets/{index-D95OFht7.js → index-Cr2FLUsD.js} +1 -1
- package/src/assets/web-panel/assets/{index-DsJCDUJG.js → index-CvrCCqJt.js} +1 -1
- package/src/assets/web-panel/assets/{index-sDoMHTNA.js → index-D4LfPvWA.js} +1 -1
- package/src/assets/web-panel/assets/{index-By5n8up9.js → index-DMGmg497.js} +1 -1
- package/src/assets/web-panel/assets/{index-ocf06EVQ.js → index-DShSkww-.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bhudc_Ez.js → index-DTxNy0ZU.js} +1 -1
- package/src/assets/web-panel/assets/{index-CX81qSM4.js → index-DW4BWjTk.js} +1 -1
- package/src/assets/web-panel/assets/{index-BlDNVgBt.js → index-DWdqx7zI.js} +1 -1
- package/src/assets/web-panel/assets/{index-CcO04eDn.js → index-Dap9c3eD.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dwqmtk65.js → index-DcfxhKXR.js} +1 -1
- package/src/assets/web-panel/assets/{index-2eyAXE3d.js → index-DdkIhfi-.js} +1 -1
- package/src/assets/web-panel/assets/{index-brCInrzq.js → index-DeSgw-WV.js} +1 -1
- package/src/assets/web-panel/assets/{index-DJ8vXGOa.js → index-DiNUEpSQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHpBMWCh.js → index-DjEP7WkH.js} +1 -1
- package/src/assets/web-panel/assets/{index-m31Ka8hZ.js → index-DtkFqPVA.js} +1 -1
- package/src/assets/web-panel/assets/{index-CtF7EN49.js → index-KqDaCApw.js} +1 -1
- package/src/assets/web-panel/assets/index-OHSl-xCh.js +1 -0
- package/src/assets/web-panel/assets/{index-B9KvcS7R.js → index-OSzjTzGM.js} +1 -1
- package/src/assets/web-panel/assets/{index-CauoBQkH.js → index-QBSeNVO3.js} +1 -1
- package/src/assets/web-panel/assets/{index-FzdwcSy2.js → index-WE08gMJP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DxdTdBix.js → index-r2VI1Ikk.js} +1 -1
- package/src/assets/web-panel/assets/{index-BepLZwgB.js → index-tqSEHPRT.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CvyYJd7z.js → initDefaultProps-Dd7n7VgI.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DYZkhUdz.js → motion-BwxouRw1.js} +1 -1
- package/src/assets/web-panel/assets/{move-slnJRVT1.js → move-DObN0PG9.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DVc0CKmy.js → mtc-parser-B3nOUQc7.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BCXAtHCq.js → omit-o9WU2Nbl.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DBsemz_K.js → pickAttrs-CL_vvfQ_.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BRtkJ-nv.js → placementArrow-CYrM2tyK.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-Cebq7EZn.js → responsiveObserve-k_06cQ96.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DT7qvId2.js → slide-CPKG0pxS.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-pQiITLkG.js → statusUtils-BDDEeLTw.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-c-19BVKQ.js → styleChecker-Cmb7RTh7.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DsS5-0bE.js → useFlexGapSupport-e2IedC4N.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CxGiMe5n.js → useFs-CE_gxVnm.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-D9btVID5.js → usePersonalDataHub-BkMIIKMz.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CUYFsFEN.js → vnode-DW886XV1.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CXmn_35j.js → zoom-Dwo_adaf.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 +363 -33
- package/src/commands/cowork.js +202 -36
- package/src/commands/session-budget.js +155 -0
- package/src/commands/session-location.js +948 -0
- package/src/commands/session.js +72 -46
- package/src/data/changelog.json +26 -0
- package/src/gateways/ws/artifact-protocol.js +77 -13
- 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 +461 -0
- package/src/lib/artifact-cleanup-ledger.js +861 -0
- package/src/lib/artifact-deletion-ledger.js +677 -0
- package/src/lib/artifact-store.js +256 -51
- package/src/lib/background-agent-keeper-protocol.js +75 -4
- package/src/lib/background-agent-launch-barrier.js +74 -0
- package/src/lib/background-agent-supervisor.js +149 -5
- package/src/lib/background-turn-bootstrap-protocol.js +4 -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 +3184 -111
- 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 +236 -1
- package/src/lib/managed-tool-checkpoint.js +47 -4
- package/src/lib/process-execution-broker/workspace-transaction.js +3 -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-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/lib/with-file-lock.js +175 -26
- package/src/repl/agent-repl.js +237 -16
- package/src/runtime/agent-core.js +123 -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/workers/background-agent-keeper.js +112 -19
- package/src/workers/background-agent-worker.js +383 -134
- package/src/workers/background-turn-bootstrap.js +13 -8
- package/src/assets/web-panel/assets/ChatBubbleRenderer-CY5m8ZHg.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-BLif4QSg.js +0 -1
- package/src/assets/web-panel/assets/Projects-BhtAVilc.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-DLjKsDVu.js +0 -1
- package/src/assets/web-panel/assets/devWarning-Bj5nUW2v.js +0 -1
- package/src/assets/web-panel/assets/index-CPcM-eqo.js +0 -1
- package/src/assets/web-panel/assets/index-xeSyVoRe.js +0 -1
package/src/commands/cowork.js
CHANGED
|
@@ -75,8 +75,9 @@ function renderWorkflowPreflight(preflight) {
|
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
async function loadCoworkWorkflowRecord(cwd, id, definitionDigest) {
|
|
78
|
-
const { getWorkflowRecord, getWorkflowVersion } =
|
|
79
|
-
|
|
78
|
+
const { getWorkflowRecord, getWorkflowVersion } = await import(
|
|
79
|
+
"../lib/cowork-workflow.js"
|
|
80
|
+
);
|
|
80
81
|
return definitionDigest
|
|
81
82
|
? getWorkflowVersion(cwd, id, definitionDigest)
|
|
82
83
|
: getWorkflowRecord(cwd, id);
|
|
@@ -134,8 +135,9 @@ export function registerCoworkCommand(program, commandDeps = {}) {
|
|
|
134
135
|
.option("--model <name>", "LLM model to use")
|
|
135
136
|
.option("--json", "Output as JSON")
|
|
136
137
|
.action(async (target, options) => {
|
|
137
|
-
const { startDebate, DEFAULT_PERSPECTIVES } =
|
|
138
|
-
|
|
138
|
+
const { startDebate, DEFAULT_PERSPECTIVES } = await import(
|
|
139
|
+
"../lib/cowork/debate-review-cli.js"
|
|
140
|
+
);
|
|
139
141
|
|
|
140
142
|
const perspectives = options.perspectives
|
|
141
143
|
.split(",")
|
|
@@ -344,8 +346,9 @@ export function registerCoworkCommand(program, commandDeps = {}) {
|
|
|
344
346
|
let result;
|
|
345
347
|
|
|
346
348
|
if (options.type === "style") {
|
|
347
|
-
const { analyzeProjectStyle } =
|
|
348
|
-
|
|
349
|
+
const { analyzeProjectStyle } = await import(
|
|
350
|
+
"../lib/cowork/project-style-analyzer-cli.js"
|
|
351
|
+
);
|
|
349
352
|
const llmOptions = {};
|
|
350
353
|
if (options.provider) llmOptions.provider = options.provider;
|
|
351
354
|
if (options.model) llmOptions.model = options.model;
|
|
@@ -354,12 +357,14 @@ export function registerCoworkCommand(program, commandDeps = {}) {
|
|
|
354
357
|
llmOptions,
|
|
355
358
|
});
|
|
356
359
|
} else if (options.type === "knowledge-graph") {
|
|
357
|
-
const { buildKnowledgeGraph } =
|
|
358
|
-
|
|
360
|
+
const { buildKnowledgeGraph } = await import(
|
|
361
|
+
"../lib/cowork/code-knowledge-graph-cli.js"
|
|
362
|
+
);
|
|
359
363
|
result = await buildKnowledgeGraph({ targetPath: resolved });
|
|
360
364
|
} else if (options.type === "decisions") {
|
|
361
|
-
const { extractDecisions } =
|
|
362
|
-
|
|
365
|
+
const { extractDecisions } = await import(
|
|
366
|
+
"../lib/cowork/decision-kb-cli.js"
|
|
367
|
+
);
|
|
363
368
|
const llmOptions = {};
|
|
364
369
|
if (options.provider) llmOptions.provider = options.provider;
|
|
365
370
|
if (options.model) llmOptions.model = options.model;
|
|
@@ -408,8 +413,9 @@ export function registerCoworkCommand(program, commandDeps = {}) {
|
|
|
408
413
|
.option("--limit <n>", "Max results", "20")
|
|
409
414
|
.option("--json", "Output as JSON")
|
|
410
415
|
.action(async (query, options) => {
|
|
411
|
-
const { searchTemplatesInHub } =
|
|
412
|
-
|
|
416
|
+
const { searchTemplatesInHub } = await import(
|
|
417
|
+
"../lib/cowork-evomap-adapter.js"
|
|
418
|
+
);
|
|
413
419
|
try {
|
|
414
420
|
const results = await searchTemplatesInHub(query || "", {
|
|
415
421
|
hubUrl: options.hub,
|
|
@@ -455,8 +461,9 @@ export function registerCoworkCommand(program, commandDeps = {}) {
|
|
|
455
461
|
(value, prev) => (prev ? [...prev, value] : [value]),
|
|
456
462
|
)
|
|
457
463
|
.action(async (geneId, options) => {
|
|
458
|
-
const { installTemplateFromHub } =
|
|
459
|
-
|
|
464
|
+
const { installTemplateFromHub } = await import(
|
|
465
|
+
"../lib/cowork-evomap-adapter.js"
|
|
466
|
+
);
|
|
460
467
|
try {
|
|
461
468
|
const template = await installTemplateFromHub(process.cwd(), geneId, {
|
|
462
469
|
hubUrl: options.hub,
|
|
@@ -479,8 +486,9 @@ export function registerCoworkCommand(program, commandDeps = {}) {
|
|
|
479
486
|
.description("List locally installed Cowork templates")
|
|
480
487
|
.option("--json", "Output as JSON")
|
|
481
488
|
.action(async (options) => {
|
|
482
|
-
const { listUserTemplates } =
|
|
483
|
-
|
|
489
|
+
const { listUserTemplates } = await import(
|
|
490
|
+
"../lib/cowork-template-marketplace.js"
|
|
491
|
+
);
|
|
484
492
|
const templates = listUserTemplates(process.cwd());
|
|
485
493
|
if (options.json) {
|
|
486
494
|
console.log(JSON.stringify(templates, null, 2));
|
|
@@ -503,8 +511,9 @@ export function registerCoworkCommand(program, commandDeps = {}) {
|
|
|
503
511
|
.command("remove <id>")
|
|
504
512
|
.description("Remove an installed Cowork template")
|
|
505
513
|
.action(async (id) => {
|
|
506
|
-
const { removeUserTemplate } =
|
|
507
|
-
|
|
514
|
+
const { removeUserTemplate } = await import(
|
|
515
|
+
"../lib/cowork-template-marketplace.js"
|
|
516
|
+
);
|
|
508
517
|
if (removeUserTemplate(process.cwd(), id)) {
|
|
509
518
|
logger.log(chalk.green(`✓ Removed '${id}'`));
|
|
510
519
|
} else {
|
|
@@ -928,8 +937,9 @@ export function registerCoworkCommand(program, commandDeps = {}) {
|
|
|
928
937
|
: {}),
|
|
929
938
|
});
|
|
930
939
|
}
|
|
931
|
-
const { generateDynamicWorkflowDraft } =
|
|
932
|
-
|
|
940
|
+
const { generateDynamicWorkflowDraft } = await import(
|
|
941
|
+
"../lib/dynamic-workflow-draft.js"
|
|
942
|
+
);
|
|
933
943
|
const draft = await generateDynamicWorkflowDraft(
|
|
934
944
|
{ prompt, provider, model },
|
|
935
945
|
{ chat },
|
|
@@ -1017,7 +1027,15 @@ export function registerCoworkCommand(program, commandDeps = {}) {
|
|
|
1017
1027
|
process.cwd(),
|
|
1018
1028
|
runId,
|
|
1019
1029
|
);
|
|
1020
|
-
const projection = runtime.projectDynamicWorkflowRuntime(statePath
|
|
1030
|
+
const projection = runtime.projectDynamicWorkflowRuntime(statePath, {
|
|
1031
|
+
currentStoreReadback: true,
|
|
1032
|
+
...(Object.hasOwn(commandDeps, "workflowArtifactStore")
|
|
1033
|
+
? { artifactStore: commandDeps.workflowArtifactStore }
|
|
1034
|
+
: {}),
|
|
1035
|
+
...(Object.hasOwn(commandDeps, "workflowCheckpointStore")
|
|
1036
|
+
? { checkpointStore: commandDeps.workflowCheckpointStore }
|
|
1037
|
+
: {}),
|
|
1038
|
+
});
|
|
1021
1039
|
if (options.json) {
|
|
1022
1040
|
console.log(JSON.stringify(projection, null, 2));
|
|
1023
1041
|
return;
|
|
@@ -1031,6 +1049,19 @@ export function registerCoworkCommand(program, commandDeps = {}) {
|
|
|
1031
1049
|
for (const effect of projection.pendingEffects) {
|
|
1032
1050
|
logger.log(` pending: ${effect.id} (${effect.key})`);
|
|
1033
1051
|
}
|
|
1052
|
+
for (const request of projection.pendingInputRequests) {
|
|
1053
|
+
logger.log(
|
|
1054
|
+
` needs input: ${request.id} step=${request.stepId} ${request.prompt}`,
|
|
1055
|
+
);
|
|
1056
|
+
}
|
|
1057
|
+
if (projection.currentStoreReadbacks.eligibleCalls > 0) {
|
|
1058
|
+
logger.log(
|
|
1059
|
+
` current stores: ${projection.currentStoreReadbacks.verifiedCalls}/${projection.currentStoreReadbacks.eligibleCalls} verified`,
|
|
1060
|
+
);
|
|
1061
|
+
for (const gap of projection.currentStoreReadbacks.gaps) {
|
|
1062
|
+
logger.log(` current store gap: ${gap}`);
|
|
1063
|
+
}
|
|
1064
|
+
}
|
|
1034
1065
|
} catch (err) {
|
|
1035
1066
|
logger.error(`WORKFLOW_RUNTIME_STATUS_FAILED: ${err.message}`);
|
|
1036
1067
|
process.exitCode = 2;
|
|
@@ -1079,6 +1110,127 @@ export function registerCoworkCommand(program, commandDeps = {}) {
|
|
|
1079
1110
|
});
|
|
1080
1111
|
}
|
|
1081
1112
|
|
|
1113
|
+
workflow
|
|
1114
|
+
.command("runtime-recover-checkpoint <run-id> <call-record-id>")
|
|
1115
|
+
.description(
|
|
1116
|
+
"Settle one crash-visible tool call from its bound terminal checkpoint store record",
|
|
1117
|
+
)
|
|
1118
|
+
.requiredOption(
|
|
1119
|
+
"--expected-revision <n>",
|
|
1120
|
+
"Exact runtime revision shown by runtime-status",
|
|
1121
|
+
)
|
|
1122
|
+
.option("--json", "Machine-readable JSON output")
|
|
1123
|
+
.action(async (runId, callRecordId, options) => {
|
|
1124
|
+
try {
|
|
1125
|
+
const runtime = await import("../lib/dynamic-workflow-runtime.js");
|
|
1126
|
+
const statePath = runtime.dynamicWorkflowRunStatePath(
|
|
1127
|
+
process.cwd(),
|
|
1128
|
+
runId,
|
|
1129
|
+
);
|
|
1130
|
+
const state = runtime.recoverDurableWorkflowCheckpointCall(
|
|
1131
|
+
statePath,
|
|
1132
|
+
{
|
|
1133
|
+
expectedRevision: options.expectedRevision,
|
|
1134
|
+
callRecordId,
|
|
1135
|
+
},
|
|
1136
|
+
Object.hasOwn(commandDeps, "workflowCheckpointStore")
|
|
1137
|
+
? { checkpointStore: commandDeps.workflowCheckpointStore }
|
|
1138
|
+
: {},
|
|
1139
|
+
);
|
|
1140
|
+
const projection = runtime.projectDynamicWorkflowRuntime(state);
|
|
1141
|
+
if (options.json) {
|
|
1142
|
+
console.log(JSON.stringify(projection, null, 2));
|
|
1143
|
+
} else {
|
|
1144
|
+
logger.log(
|
|
1145
|
+
`${projection.runId} ${projection.status} revision=${projection.revision}`,
|
|
1146
|
+
);
|
|
1147
|
+
}
|
|
1148
|
+
} catch (err) {
|
|
1149
|
+
logger.error(
|
|
1150
|
+
`WORKFLOW_RUNTIME_RECOVER_CHECKPOINT_FAILED: ${err.message}`,
|
|
1151
|
+
);
|
|
1152
|
+
process.exitCode = 2;
|
|
1153
|
+
}
|
|
1154
|
+
});
|
|
1155
|
+
|
|
1156
|
+
workflow
|
|
1157
|
+
.command("runtime-recover-checkpoints <run-id>")
|
|
1158
|
+
.description(
|
|
1159
|
+
"Atomically settle every crash-visible child call with a bound terminal checkpoint store record",
|
|
1160
|
+
)
|
|
1161
|
+
.requiredOption(
|
|
1162
|
+
"--expected-revision <n>",
|
|
1163
|
+
"Exact runtime revision shown by runtime-status",
|
|
1164
|
+
)
|
|
1165
|
+
.option("--json", "Machine-readable JSON output")
|
|
1166
|
+
.action(async (runId, options) => {
|
|
1167
|
+
try {
|
|
1168
|
+
const runtime = await import("../lib/dynamic-workflow-runtime.js");
|
|
1169
|
+
const statePath = runtime.dynamicWorkflowRunStatePath(
|
|
1170
|
+
process.cwd(),
|
|
1171
|
+
runId,
|
|
1172
|
+
);
|
|
1173
|
+
const state = runtime.recoverDurableWorkflowCheckpointCalls(
|
|
1174
|
+
statePath,
|
|
1175
|
+
{ expectedRevision: options.expectedRevision },
|
|
1176
|
+
Object.hasOwn(commandDeps, "workflowCheckpointStore")
|
|
1177
|
+
? { checkpointStore: commandDeps.workflowCheckpointStore }
|
|
1178
|
+
: {},
|
|
1179
|
+
);
|
|
1180
|
+
const projection = runtime.projectDynamicWorkflowRuntime(state);
|
|
1181
|
+
if (options.json) {
|
|
1182
|
+
console.log(JSON.stringify(projection, null, 2));
|
|
1183
|
+
} else {
|
|
1184
|
+
logger.log(
|
|
1185
|
+
`${projection.runId} ${projection.status} revision=${projection.revision}`,
|
|
1186
|
+
);
|
|
1187
|
+
}
|
|
1188
|
+
} catch (err) {
|
|
1189
|
+
logger.error(
|
|
1190
|
+
`WORKFLOW_RUNTIME_RECOVER_CHECKPOINTS_FAILED: ${err.message}`,
|
|
1191
|
+
);
|
|
1192
|
+
process.exitCode = 2;
|
|
1193
|
+
}
|
|
1194
|
+
});
|
|
1195
|
+
|
|
1196
|
+
workflow
|
|
1197
|
+
.command("runtime-reply <run-id> <request-id> <response-file>")
|
|
1198
|
+
.description(
|
|
1199
|
+
"Answer one revision-bound durable stage input request from a bounded JSON file",
|
|
1200
|
+
)
|
|
1201
|
+
.requiredOption(
|
|
1202
|
+
"--expected-revision <n>",
|
|
1203
|
+
"Exact runtime revision shown by runtime-status",
|
|
1204
|
+
)
|
|
1205
|
+
.option("--json", "Machine-readable JSON output")
|
|
1206
|
+
.action(async (runId, requestId, responseFile, options) => {
|
|
1207
|
+
try {
|
|
1208
|
+
const runtime = await import("../lib/dynamic-workflow-runtime.js");
|
|
1209
|
+
const statePath = runtime.dynamicWorkflowRunStatePath(
|
|
1210
|
+
process.cwd(),
|
|
1211
|
+
runId,
|
|
1212
|
+
);
|
|
1213
|
+
const answer =
|
|
1214
|
+
runtime.readDynamicWorkflowInputResponseFile(responseFile);
|
|
1215
|
+
const state = runtime.submitDurableWorkflowInput(statePath, {
|
|
1216
|
+
expectedRevision: options.expectedRevision,
|
|
1217
|
+
requestId,
|
|
1218
|
+
answer,
|
|
1219
|
+
});
|
|
1220
|
+
const projection = runtime.projectDynamicWorkflowRuntime(state);
|
|
1221
|
+
if (options.json) {
|
|
1222
|
+
console.log(JSON.stringify(projection, null, 2));
|
|
1223
|
+
} else {
|
|
1224
|
+
logger.log(
|
|
1225
|
+
`${projection.runId} ${projection.status} revision=${projection.revision}`,
|
|
1226
|
+
);
|
|
1227
|
+
}
|
|
1228
|
+
} catch (err) {
|
|
1229
|
+
logger.error(`WORKFLOW_RUNTIME_REPLY_FAILED: ${err.message}`);
|
|
1230
|
+
process.exitCode = 2;
|
|
1231
|
+
}
|
|
1232
|
+
});
|
|
1233
|
+
|
|
1082
1234
|
workflow
|
|
1083
1235
|
.command("runtime-reconcile <run-id> <effect-id> <result-file>")
|
|
1084
1236
|
.description(
|
|
@@ -1159,8 +1311,9 @@ export function registerCoworkCommand(program, commandDeps = {}) {
|
|
|
1159
1311
|
.option("--json", "Machine-readable JSON output")
|
|
1160
1312
|
.action(async (id, options) => {
|
|
1161
1313
|
try {
|
|
1162
|
-
const { listWorkflowVersions } =
|
|
1163
|
-
|
|
1314
|
+
const { listWorkflowVersions } = await import(
|
|
1315
|
+
"../lib/cowork-workflow.js"
|
|
1316
|
+
);
|
|
1164
1317
|
const versions = listWorkflowVersions(process.cwd(), id);
|
|
1165
1318
|
if (options.json) {
|
|
1166
1319
|
console.log(JSON.stringify(versions, null, 2));
|
|
@@ -1405,8 +1558,9 @@ export function registerCoworkCommand(program, commandDeps = {}) {
|
|
|
1405
1558
|
getVerifiedSessionExecutionLocationAuthority: descriptor.value,
|
|
1406
1559
|
});
|
|
1407
1560
|
} else {
|
|
1408
|
-
workflowExecutionAuthorityModule =
|
|
1409
|
-
|
|
1561
|
+
workflowExecutionAuthorityModule = import(
|
|
1562
|
+
"../harness/jsonl-session-store.js"
|
|
1563
|
+
);
|
|
1410
1564
|
}
|
|
1411
1565
|
let workflowRunTaskModule;
|
|
1412
1566
|
if (Object.hasOwn(commandDeps, "workflowRunTask")) {
|
|
@@ -1508,8 +1662,9 @@ export function registerCoworkCommand(program, commandDeps = {}) {
|
|
|
1508
1662
|
runTask: runCoworkTask,
|
|
1509
1663
|
});
|
|
1510
1664
|
}
|
|
1511
|
-
const runtime =
|
|
1512
|
-
|
|
1665
|
+
const runtime = await import(
|
|
1666
|
+
"../lib/dynamic-workflow-runtime.js"
|
|
1667
|
+
);
|
|
1513
1668
|
return runtime.executeDurableDynamicWorkflow(
|
|
1514
1669
|
{
|
|
1515
1670
|
statePath: runtime.dynamicWorkflowRunStatePath(
|
|
@@ -1519,7 +1674,14 @@ export function registerCoworkCommand(program, commandDeps = {}) {
|
|
|
1519
1674
|
runId: options.durableRunId,
|
|
1520
1675
|
execution,
|
|
1521
1676
|
},
|
|
1522
|
-
{
|
|
1677
|
+
{
|
|
1678
|
+
runTask: runCoworkTask,
|
|
1679
|
+
...(Object.hasOwn(commandDeps, "workflowCheckpointStore")
|
|
1680
|
+
? {
|
|
1681
|
+
checkpointStore: commandDeps.workflowCheckpointStore,
|
|
1682
|
+
}
|
|
1683
|
+
: {}),
|
|
1684
|
+
},
|
|
1523
1685
|
);
|
|
1524
1686
|
},
|
|
1525
1687
|
},
|
|
@@ -1667,8 +1829,9 @@ export function registerCoworkCommand(program, commandDeps = {}) {
|
|
|
1667
1829
|
.description("Per-template aggregate stats across all runs")
|
|
1668
1830
|
.option("--json", "Output as JSON")
|
|
1669
1831
|
.action(async (options) => {
|
|
1670
|
-
const { loadHistory, computeTemplateStats } =
|
|
1671
|
-
|
|
1832
|
+
const { loadHistory, computeTemplateStats } = await import(
|
|
1833
|
+
"../lib/cowork-learning.js"
|
|
1834
|
+
);
|
|
1672
1835
|
const stats = computeTemplateStats(loadHistory(process.cwd()));
|
|
1673
1836
|
if (options.json) {
|
|
1674
1837
|
console.log(JSON.stringify(stats, null, 2));
|
|
@@ -1701,8 +1864,9 @@ export function registerCoworkCommand(program, commandDeps = {}) {
|
|
|
1701
1864
|
.option("--min-runs <n>", "Only consider templates with ≥N past runs", "1")
|
|
1702
1865
|
.option("--json", "Output as JSON")
|
|
1703
1866
|
.action(async (messageParts, options) => {
|
|
1704
|
-
const { loadHistory, recommendTemplate } =
|
|
1705
|
-
|
|
1867
|
+
const { loadHistory, recommendTemplate } = await import(
|
|
1868
|
+
"../lib/cowork-learning.js"
|
|
1869
|
+
);
|
|
1706
1870
|
const message = messageParts.join(" ");
|
|
1707
1871
|
const rec = recommendTemplate(message, loadHistory(process.cwd()), {
|
|
1708
1872
|
minRuns: parseInt(options.minRuns, 10) || 1,
|
|
@@ -1731,8 +1895,9 @@ export function registerCoworkCommand(program, commandDeps = {}) {
|
|
|
1731
1895
|
.option("--limit <n>", "Max examples per template", "3")
|
|
1732
1896
|
.option("--json", "Output as JSON")
|
|
1733
1897
|
.action(async (options) => {
|
|
1734
|
-
const { loadHistory, summarizeFailures } =
|
|
1735
|
-
|
|
1898
|
+
const { loadHistory, summarizeFailures } = await import(
|
|
1899
|
+
"../lib/cowork-learning.js"
|
|
1900
|
+
);
|
|
1736
1901
|
const out = summarizeFailures(loadHistory(process.cwd()), {
|
|
1737
1902
|
limit: parseInt(options.limit, 10) || 3,
|
|
1738
1903
|
});
|
|
@@ -1759,8 +1924,9 @@ export function registerCoworkCommand(program, commandDeps = {}) {
|
|
|
1759
1924
|
.description("Suggest systemPromptExtension patches from failure history")
|
|
1760
1925
|
.option("--json", "Output as JSON")
|
|
1761
1926
|
.action(async (options) => {
|
|
1762
|
-
const { loadHistory, suggestPromptPatch } =
|
|
1763
|
-
|
|
1927
|
+
const { loadHistory, suggestPromptPatch } = await import(
|
|
1928
|
+
"../lib/cowork-learning.js"
|
|
1929
|
+
);
|
|
1764
1930
|
const patches = suggestPromptPatch(loadHistory(process.cwd()));
|
|
1765
1931
|
if (options.json) {
|
|
1766
1932
|
console.log(JSON.stringify(patches, null, 2));
|
|
@@ -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
|
+
}
|