chainlesschain 0.163.6 → 0.163.7
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/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-DDIUofA8.js → AIOps-axqQfwv8.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-Bm-5xYRn.js → ActionButton-DV-Ro0By.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-D5UH4ljI.js → Analytics-Bt72WEVu.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-D_ifjOOP.js → AppLayout-BtepG55E.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-BY1mXdC7.js → Artifacts-B7KaJ7S_.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-Bujr4Ml3.js → Audit-FNFaUg7A.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-sioKSTcC.js → BackgroundAgents-DFb6J2wQ.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DDOAK8RK.js → Backup-CC7YBhyj.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CtCsVVke.js → BaseInput-RkgTNVtj.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-DpNj0vnd.js → Chat-hHEmGZy-.js} +4 -4
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CZta3Ftr.js → ChatBubbleRenderer-CAP9YhHv.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-DoHVNSXq.js → Checkbox-z5wXOQP1.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DlVl7Qmv.js → Codegen-DVaDJnxy.js} +1 -1
- package/src/assets/web-panel/assets/{Col-GIqoPYty.js → Col-CJmaRDR5.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CIAPEVji.js → Community-DF29_2bI.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BN7JiI_h.js → Compact-DtkQkBzn.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CqUWCM9B.js → Compliance-xoHDxp7I.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-A4iPp7A4.js → Cowork-BUm-R7ht.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-B2zeXXWb.js → Cron-Cgl14ZkB.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BR2xmWr8.js → Crosschain-BNcbmoqh.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BzFDjrIv.js → DID-Bwja0Zo9.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DKtDo3yA.js → Dashboard-Bk5XjEdJ.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-RNx43_YG.js → Dropdown-Ci36Oitq.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-SwMt4Rcy.js → EmailListRenderer--U04ZN4q.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CsYebZ4X.js → FamilyGuardDashboard-B2gNPR2s.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BmRKvBTy.js → Federation-C4KghYn7.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CVxGTA-0.js → FormItemContext-QL7x_Q_0.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-x2iXpyB7.js → GenericCardRenderer-F3Ryltwm.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DfqbkiOP.js → Git-2HassK5k.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-RuHyyj5O.js → Governance-DoBIp7oe.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-Bn7uZ7rI.js → Inference--W01QhZ-.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DlP7XefZ.js → KnowledgeGraph-DmvwqGpT.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BYNdOiCd.js → Logs-BBJ4yAel.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-aMtgN-R6.js → MarkdownRenderer-BLCZMzhJ.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-JQYmDqM8.js → Marketplace-D5lNngSI.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Cyx4yZ-9.js → McpTools-CkEVOMKH.js} +4 -4
- package/src/assets/web-panel/assets/{Memory-VDuGZTN2.js → Memory-B1Ow1xVE.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-_yKo97gi.js → MobileBridge-SgYbUfb6.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CXRXW3q7.js → MobileProjects-BWdOvQAj.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-acTGtfLH.js → Mtc-DcTXSSma.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-ClpjXfkY.js → MtcAudit-Dt3WG4oj.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-_6Tn3o96.js → Multisig-B9B38UZx.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CK7pbZzP.js → NLProgramming-B0S4GGvG.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Czy6V_P8.js → Notes-DZ5U58Ng.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-Cqx-UVv3.js → NotificationSettings-PjL5ZW34.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-C69WDxGy.js → OrderTableRenderer-DrAX2ESt.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-DFnA9vLQ.js → Organization-Cv1GYs-c.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-ReZkk2yT.js → Overflow-Bbkp_PL3.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DzjSI0aI.js → P2P-BD8QUgoZ.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DKTf5xIP.js → PdhVaultBrowser-BO-2PeaB.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-DhQ5klhR.js → Permissions-D_OPVa02.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CUL1iHrW.js → PersonalDataHub-mh-pEmaB.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-DU88iu4N.js → Pipeline-6JC2EDdb.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-Bw-sYfyK.js → Privacy-CUshzUAG.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Bq3Q5y0z.js → ProjectInit-Cs2Aalri.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-C8spzpho.js → ProjectSettings-1ak49tcj.js} +2 -2
- package/src/assets/web-panel/assets/Projects-BV4oApsm.js +1 -0
- package/src/assets/web-panel/assets/{Providers-Bf4eTP9W.js → Providers-CXXxvafH.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-Dme9BDU1.js → QrScannerModal-PTcDsF58.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CIXfv1rE.js → QuickAsk-CDwucrJw.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CIxvdeZ-.js → Recommend-CJlLVRXR.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-C6k7MExI.js → RemoteSession-DlN-ETsO.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-CISDz2bl.js → Reputation-DI23LR6m.js} +1 -1
- package/src/assets/web-panel/assets/{Row-CdnDxXyf.js → Row-Cl7UQMrM.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-C-QpRHsl.js → RssFeed-CexHNfh8.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DBjaGzSn.js → Search-BneBWvRN.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CQKukOeE.js → Security-DX7Phgrp.js} +4 -4
- package/src/assets/web-panel/assets/{Services-DZz86jWb.js → Services-BWXO8Mte.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-jb8RMK0d.js → Skeleton-DCyOjKPJ.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CdY76fZG.js → Skills-CXqERsTB.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-C_CSiZX9.js → Sla-bhbrbz8E.js} +1 -1
- package/src/assets/web-panel/assets/SpeechSettings-3IPU0HBZ.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-qvimGO0O.js → SyncSettings-DBNTQLbM.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-Dng5LPJC.js → Tasks-quP0bkN-.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-Bwqq5Wll.js → Templates-BouWmgho.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DNWuwP7Z.js → Tenant-qv0D9s7z.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-B-6Othpp.js → Terminal-BxvbE8BB.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-DKpKZfzx.js → TimelineRenderer-D-IeLnJ2.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DzfGMd2J.js → Tokens-CFMKKyVG.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BXwUi74J.js → Trigger-L8as3UuJ.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BNzUq4ui.js → Trust-MxmA4VZG.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-BYugxww4.js → UkeySign-C0VvJYRi.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DdauhtSJ.js → VideoEditing-Bf5QZj8N.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CSC9bCe_.js → Wallet-BIJ9riRz.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-Q8AN3bTO.js → WebAuthn-B8p9Mhkw.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-d-LBGCuA.js → WorkflowEditor-BVsuaPen.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BLVDCgsZ.js → chat-BfkjoKpV.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BZlPSEHl.js → colors-DeAlsWK8.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-IWseP6R6.js → compact-item-Cs97bz5j.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DnVRV3Ao.js → createContext-BqbG60LH.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DPty0mGN.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DLQZA_Wn.js → hasIn-i_RY0b1X.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_N4-Gq9.js → index-0-agYlWL.js} +1 -1
- package/src/assets/web-panel/assets/{index-DB0MJgF_.js → index-79V_zv1s.js} +1 -1
- package/src/assets/web-panel/assets/{index-BOZJBTWZ.js → index-B-3tEpTc.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUq0c7gq.js → index-B-JVTrpr.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dy0R5ZED.js → index-B1CbOH1i.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bxp7uDD8.js → index-B5UkyA3c.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpVrK6fr.js → index-BESLFt4q.js} +1 -1
- package/src/assets/web-panel/assets/{index-CT9vVN-X.js → index-BOVkf1K3.js} +1 -1
- package/src/assets/web-panel/assets/{index-DOoQpuQY.js → index-BYUVuwKt.js} +1 -1
- package/src/assets/web-panel/assets/{index-CINJQEj6.js → index-BcUXAB2s.js} +1 -1
- package/src/assets/web-panel/assets/{index-CarMTIyQ.js → index-BkBi5TmC.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5dgnilC.js → index-Bm7lLR4c.js} +1 -1
- package/src/assets/web-panel/assets/index-Bt7g0Vq_.js +1 -0
- package/src/assets/web-panel/assets/{index-CbQNL0ue.js → index-BuLQobzW.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpBaJ3TD.js → index-CE2VtTlp.js} +1 -1
- package/src/assets/web-panel/assets/{index-jWb70ZgZ.js → index-CED2PL_y.js} +1 -1
- package/src/assets/web-panel/assets/{index-BEu2lMBy.js → index-CG3PRyAL.js} +1 -1
- package/src/assets/web-panel/assets/{index-DocEhinm.js → index-CIG8fQ2_.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_LQodeJ.js → index-COdGA-8n.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZpYeqrh.js → index-CeWoNHau.js} +1 -1
- package/src/assets/web-panel/assets/{index-gt8bNefW.js → index-Cf3WCLmy.js} +1 -1
- package/src/assets/web-panel/assets/{index-N_GoWZX4.js → index-CgsqdnRV.js} +1 -1
- package/src/assets/web-panel/assets/index-ChVT0p9u.js +1 -0
- package/src/assets/web-panel/assets/{index-CZDekj7T.js → index-D2B4VPyP.js} +1 -1
- package/src/assets/web-panel/assets/{index-YSw_gxlZ.js → index-D9evtvg2.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTbxp4UH.js → index-DUUrv141.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bbj2NS_I.js → index-DiSkx4UB.js} +3 -3
- package/src/assets/web-panel/assets/{index-BZs5bBnk.js → index-Dk2qouAz.js} +1 -1
- package/src/assets/web-panel/assets/{index-DalA0TKC.js → index-Dk7-v4hP.js} +1 -1
- package/src/assets/web-panel/assets/{index-1jeAudHd.js → index-DmbfhJUP.js} +1 -1
- package/src/assets/web-panel/assets/{index-C1ifZtXo.js → index-DqBgBpgp.js} +1 -1
- package/src/assets/web-panel/assets/{index-BhA3QEni.js → index-PT_5sBMA.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSjilZ9L.js → index-U4f5izHz.js} +1 -1
- package/src/assets/web-panel/assets/{index-C2FqfMvU.js → index-YXgLng0K.js} +1 -1
- package/src/assets/web-panel/assets/{index-COev0W2g.js → index-ZxO_-E8a.js} +1 -1
- package/src/assets/web-panel/assets/{index-M7wxfAbm.js → index-dIHr4B_u.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjWnONdy.js → index-gyFpvL7l.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dkwsi1Kn.js → index-s1opAL-M.js} +1 -1
- package/src/assets/web-panel/assets/{index-hwVDeoC0.js → index-yObj1O4n.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-Co67Kqmb.js → initDefaultProps-C9h9yKL3.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BMOxQSF_.js → motion-BvmLsPdu.js} +1 -1
- package/src/assets/web-panel/assets/{move-C5fWDw-N.js → move-CoL4ekU1.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BJevpL0e.js → mtc-parser-C4pMy6xV.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BCzNU8s6.js → omit-DPuJfNxx.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CybWvDPk.js → pickAttrs-D0KEeaK2.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BMWS9HnW.js → placementArrow-BpkyINxt.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BoL2UnGY.js → responsiveObserve-DQI_wOq8.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DWNfXraU.js → slide-DYfdDiRg.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BquTM3tX.js → statusUtils-B5dtvb0D.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BEkCleim.js → styleChecker-CF310mSj.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Oecnq7EA.js → useFlexGapSupport-D1Qp4BLp.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CkDffJ4F.js → useFs-C7_iyvJK.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-qbvKXesB.js → usePersonalDataHub-DZUt_fIm.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-C6v8n6mA.js → vnode-D3dsi0lZ.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-4CTeFILV.js → zoom-WdbOlvdQ.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +2 -2
- package/src/commands/agent.js +90 -1
- package/src/commands/chat.js +11 -2
- package/src/commands/compact.js +106 -23
- package/src/commands/loop.js +28 -10
- package/src/commands/routine.js +1 -1
- package/src/commands/scheduler-daemon.js +359 -2
- package/src/commands/session-observability.js +305 -0
- package/src/commands/session.js +38 -0
- package/src/data/changelog.json +14 -1
- package/src/gateways/ws/ws-agent-handler.js +439 -5
- package/src/harness/jsonl-session-store.js +463 -125
- package/src/harness/prompt-compressor.js +86 -13
- package/src/harness/provider-backed-compaction.js +100 -27
- package/src/lib/advisor-runtime.js +3 -1
- package/src/lib/agent-schedule-store.js +414 -4
- package/src/lib/agent-team/team-adjudication.js +40 -1
- package/src/lib/automation-engine.js +494 -0
- package/src/lib/background-agent-supervisor.js +793 -215
- package/src/lib/background-command-argv.js +24 -0
- package/src/lib/background-interaction-journal.js +361 -52
- package/src/lib/background-interaction-resolver.js +32 -0
- package/src/lib/background-launch-profile.js +2 -0
- package/src/lib/causal-observability.js +2661 -0
- package/src/lib/chat-session-admission.js +76 -0
- package/src/lib/cost-budget.js +5 -7
- package/src/lib/cowork/ab-comparator-cli.js +11 -0
- package/src/lib/cowork/debate-review-cli.js +12 -0
- package/src/lib/cowork-adapter.js +159 -38
- package/src/lib/cowork-cron.js +357 -1
- package/src/lib/cowork-task-runner.js +112 -17
- package/src/lib/delivery-coordinator.js +142 -0
- package/src/lib/direct-model-usage.js +121 -0
- package/src/lib/file-lines.js +183 -47
- package/src/lib/llm-pricing.js +12 -17
- package/src/lib/loop.js +26 -2
- package/src/lib/routine-store.js +380 -21
- package/src/lib/runtime-usage-ledger.js +182 -0
- package/src/lib/scheduler-kernel/agenda-adapter.js +308 -3
- package/src/lib/scheduler-kernel/automation-adapter.js +410 -8
- package/src/lib/scheduler-kernel/automation-event-adapter.js +36 -0
- package/src/lib/scheduler-kernel/cowork-cron-adapter.js +285 -3
- package/src/lib/scheduler-kernel/loop-adapter.js +541 -6
- package/src/lib/scheduler-kernel/migration-admin.js +346 -0
- package/src/lib/scheduler-kernel/migration-rollback-admin.js +932 -0
- package/src/lib/scheduler-kernel/routine-adapter.js +394 -20
- package/src/lib/scheduler-kernel/runtime.js +63 -1
- package/src/lib/scheduler-kernel/source-locator-path.js +142 -0
- package/src/lib/scheduler-kernel/store.js +2586 -85
- package/src/lib/session-host-lease.js +171 -2
- package/src/lib/session-host-snapshot.js +14 -3
- package/src/lib/session-persistence-failure.js +1 -0
- package/src/lib/session-tail.js +179 -34
- package/src/lib/session-transcript-structure.js +96 -0
- package/src/lib/sub-agent-context.js +328 -22
- package/src/lib/ws-agent-handler.js +4 -1
- package/src/repl/agent-repl.js +732 -91
- package/src/repl/chat-repl.js +5 -1
- package/src/runtime/agent-core.js +1272 -207
- package/src/runtime/fallback-model.js +5 -0
- package/src/runtime/headless-runner.js +324 -82
- package/src/runtime/headless-stream.js +232 -26
- package/src/runtime/policies/agent-policy.js +4 -0
- package/src/workers/background-agent-worker.js +403 -96
- package/src/assets/web-panel/assets/Projects-Dd-xuPIc.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-C7tT9iad.js +0 -1
- package/src/assets/web-panel/assets/devWarning-Jzu62CLC.js +0 -1
- package/src/assets/web-panel/assets/index-Zb2MeDSy.js +0 -1
- package/src/assets/web-panel/assets/index-fikqml4k.js +0 -1
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
-
import { resolve } from "node:path";
|
|
3
2
|
import {
|
|
4
3
|
advanceScheduleNextAt,
|
|
4
|
+
adjudicateSchedulerScheduleFire,
|
|
5
5
|
bindSchedulerScheduleFire,
|
|
6
6
|
completeSchedulerScheduleFire,
|
|
7
7
|
coworkCronFireKey,
|
|
8
|
+
coworkCronMigrationSourceDigest,
|
|
9
|
+
coworkCronMigrationSourceSnapshot,
|
|
8
10
|
ensureScheduleNextAt,
|
|
9
11
|
getSchedule,
|
|
10
12
|
hasSecondsResolution,
|
|
11
13
|
latestCoworkCronTime,
|
|
12
14
|
loadSchedules,
|
|
13
15
|
parseCron,
|
|
16
|
+
prepareCoworkSchedulerMigration,
|
|
17
|
+
restoreCoworkSchedulerMigration,
|
|
18
|
+
retireCoworkSchedulerMigration,
|
|
14
19
|
} from "../cowork-cron.js";
|
|
15
20
|
import {
|
|
16
21
|
SchedulerKernelError,
|
|
@@ -20,10 +25,12 @@ import {
|
|
|
20
25
|
normalizeJson,
|
|
21
26
|
} from "./contract.js";
|
|
22
27
|
import { SchedulerRuntime } from "./runtime.js";
|
|
28
|
+
import { schedulerMigrationSourceDigest } from "./store.js";
|
|
23
29
|
import {
|
|
24
30
|
bindSchedulerAuthorityPolicy,
|
|
25
31
|
createSchedulerAuthorityResolver,
|
|
26
32
|
} from "./authority-resolver.js";
|
|
33
|
+
import { canonicalSchedulerSourcePath } from "./source-locator-path.js";
|
|
27
34
|
|
|
28
35
|
export const COWORK_CRON_SCHEDULER_KIND = "cowork-cron";
|
|
29
36
|
export const COWORK_CRON_SCHEDULER_CAPABILITY = "cowork.task.execute";
|
|
@@ -67,8 +74,7 @@ function normalizedCwd(cwd) {
|
|
|
67
74
|
"Cowork cron scheduler requires a workspace path",
|
|
68
75
|
);
|
|
69
76
|
}
|
|
70
|
-
|
|
71
|
-
return process.platform === "win32" ? absolute.toLowerCase() : absolute;
|
|
77
|
+
return canonicalSchedulerSourcePath(cwd);
|
|
72
78
|
}
|
|
73
79
|
|
|
74
80
|
function normalizeCreatedAt(value) {
|
|
@@ -264,6 +270,200 @@ export function syncCoworkCronSchedulerJob(schedulerStore, cwd, schedule) {
|
|
|
264
270
|
}
|
|
265
271
|
}
|
|
266
272
|
|
|
273
|
+
export function migrateCoworkCronSchedule({ cwd, schedulerStore, schedule }) {
|
|
274
|
+
const workspace = normalizedCwd(cwd);
|
|
275
|
+
const snapshot = coworkCronScheduleSnapshot(schedule);
|
|
276
|
+
const sourceScope = { store: "cowork-schedules", workspace };
|
|
277
|
+
const sourceLocator = {
|
|
278
|
+
schemaVersion: 1,
|
|
279
|
+
type: "cowork-workspace",
|
|
280
|
+
workspace,
|
|
281
|
+
};
|
|
282
|
+
const desired = buildCoworkCronSchedulerJob(workspace, snapshot);
|
|
283
|
+
desired.authority = bindSchedulerAuthorityPolicy(
|
|
284
|
+
schedulerStore,
|
|
285
|
+
desired.authority,
|
|
286
|
+
);
|
|
287
|
+
const sourceSnapshot = coworkCronMigrationSourceSnapshot(schedule);
|
|
288
|
+
const sourceDigest = coworkCronMigrationSourceDigest(schedule);
|
|
289
|
+
let prepared = schedulerStore.getActiveDomainMigrationBySource({
|
|
290
|
+
domain: "cowork-cron",
|
|
291
|
+
sourceScope,
|
|
292
|
+
sourceId: snapshot.id,
|
|
293
|
+
});
|
|
294
|
+
if (prepared) {
|
|
295
|
+
const migrationEntries = prepared.entries.filter(
|
|
296
|
+
(candidate) =>
|
|
297
|
+
candidate.domain === "cowork-cron" &&
|
|
298
|
+
candidate.sourceId === snapshot.id,
|
|
299
|
+
);
|
|
300
|
+
if (prepared.entries.length !== 1 || migrationEntries.length !== 1) {
|
|
301
|
+
throw coworkCronError(
|
|
302
|
+
"COWORK_SCHEDULER_MIGRATION_DOMAIN_MISMATCH",
|
|
303
|
+
"Cowork schedule belongs to an invalid mixed-domain migration",
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
const [migrationEntry] = migrationEntries;
|
|
307
|
+
schedulerStore.bindDomainMigrationSourceLocator({
|
|
308
|
+
migrationId: prepared.id,
|
|
309
|
+
entryId: migrationEntry.entryId,
|
|
310
|
+
sourceLocator,
|
|
311
|
+
expectedSourceDigest: migrationEntry.sourceDigest,
|
|
312
|
+
expectedTargetJobId: migrationEntry.targetJobId,
|
|
313
|
+
});
|
|
314
|
+
prepared = schedulerStore.getDomainMigration(prepared.id);
|
|
315
|
+
} else {
|
|
316
|
+
prepared = schedulerStore.prepareDomainMigration({
|
|
317
|
+
entries: [
|
|
318
|
+
{
|
|
319
|
+
domain: "cowork-cron",
|
|
320
|
+
sourceId: snapshot.id,
|
|
321
|
+
sourceScope,
|
|
322
|
+
sourceLocator,
|
|
323
|
+
source: sourceSnapshot,
|
|
324
|
+
targetJob: desired,
|
|
325
|
+
rollbackStrategy: "disable",
|
|
326
|
+
},
|
|
327
|
+
],
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
if (
|
|
331
|
+
prepared.entries.length !== 1 ||
|
|
332
|
+
prepared.entries[0].domain !== "cowork-cron"
|
|
333
|
+
) {
|
|
334
|
+
throw coworkCronError(
|
|
335
|
+
"COWORK_SCHEDULER_MIGRATION_DOMAIN_MISMATCH",
|
|
336
|
+
"Cowork schedule belongs to an invalid mixed-domain migration",
|
|
337
|
+
);
|
|
338
|
+
}
|
|
339
|
+
if (
|
|
340
|
+
prepared.entries[0].sourceDigest !==
|
|
341
|
+
schedulerMigrationSourceDigest(sourceSnapshot) ||
|
|
342
|
+
prepared.entries[0].targetJobId !== desired.id
|
|
343
|
+
) {
|
|
344
|
+
throw coworkCronError(
|
|
345
|
+
"COWORK_SCHEDULER_MIGRATION_SOURCE_CHANGED",
|
|
346
|
+
`Cowork schedule changed after migration started: ${snapshot.id}`,
|
|
347
|
+
);
|
|
348
|
+
}
|
|
349
|
+
let migration = prepared;
|
|
350
|
+
if (["rolling_back", "rolled_back"].includes(migration.state)) {
|
|
351
|
+
throw coworkCronError(
|
|
352
|
+
"COWORK_SCHEDULER_MIGRATION_STATE_CONFLICT",
|
|
353
|
+
`Cowork migration cannot resume from state ${migration.state}`,
|
|
354
|
+
);
|
|
355
|
+
}
|
|
356
|
+
if (migration.state === "retired") {
|
|
357
|
+
retireCoworkSchedulerMigration(workspace, snapshot.id, {
|
|
358
|
+
migrationId: migration.id,
|
|
359
|
+
sourceDigest,
|
|
360
|
+
targetJobId: desired.id,
|
|
361
|
+
retirementToken: migration.entries[0].retirementToken,
|
|
362
|
+
});
|
|
363
|
+
return migration;
|
|
364
|
+
}
|
|
365
|
+
if (migration.state === "prepared") {
|
|
366
|
+
prepareCoworkSchedulerMigration(workspace, snapshot.id, {
|
|
367
|
+
migrationId: migration.id,
|
|
368
|
+
sourceDigest,
|
|
369
|
+
targetJobId: desired.id,
|
|
370
|
+
});
|
|
371
|
+
migration = schedulerStore.applyDomainMigration(migration.id);
|
|
372
|
+
}
|
|
373
|
+
if (migration.state === "applied") {
|
|
374
|
+
migration = schedulerStore.verifyDomainMigration(migration.id, {
|
|
375
|
+
sources: [
|
|
376
|
+
{ entryId: migration.entries[0].entryId, source: sourceSnapshot },
|
|
377
|
+
],
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
const retiring =
|
|
381
|
+
migration.state === "retiring"
|
|
382
|
+
? migration
|
|
383
|
+
: schedulerStore.beginDomainMigrationRetirement(migration.id);
|
|
384
|
+
const entry = retiring.entries[0];
|
|
385
|
+
const retired = retireCoworkSchedulerMigration(workspace, snapshot.id, {
|
|
386
|
+
migrationId: migration.id,
|
|
387
|
+
sourceDigest,
|
|
388
|
+
targetJobId: desired.id,
|
|
389
|
+
retirementToken: entry.retirementToken,
|
|
390
|
+
});
|
|
391
|
+
schedulerStore.confirmDomainMigrationEntryRetired({
|
|
392
|
+
migrationId: migration.id,
|
|
393
|
+
entryId: entry.entryId,
|
|
394
|
+
retirementToken: entry.retirementToken,
|
|
395
|
+
source: retired,
|
|
396
|
+
});
|
|
397
|
+
return schedulerStore.getDomainMigration(migration.id);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
export function rollbackCoworkCronMigration({
|
|
401
|
+
cwd,
|
|
402
|
+
schedulerStore,
|
|
403
|
+
migrationId,
|
|
404
|
+
}) {
|
|
405
|
+
const workspace = normalizedCwd(cwd);
|
|
406
|
+
const assertRollbackBinding = (migration) => {
|
|
407
|
+
if (
|
|
408
|
+
migration?.id !== migrationId ||
|
|
409
|
+
!Array.isArray(migration.entries) ||
|
|
410
|
+
migration.entries.length === 0 ||
|
|
411
|
+
migration.entries.some((entry) => entry.domain !== "cowork-cron")
|
|
412
|
+
) {
|
|
413
|
+
throw coworkCronError(
|
|
414
|
+
"COWORK_SCHEDULER_MIGRATION_DOMAIN_MISMATCH",
|
|
415
|
+
"Cowork rollback cannot operate on a mixed-domain migration",
|
|
416
|
+
);
|
|
417
|
+
}
|
|
418
|
+
for (const entry of migration.entries) {
|
|
419
|
+
const locator = entry.sourceLocator;
|
|
420
|
+
if (
|
|
421
|
+
locator?.schemaVersion !== 1 ||
|
|
422
|
+
locator.type !== "cowork-workspace" ||
|
|
423
|
+
locator.workspace !== workspace
|
|
424
|
+
) {
|
|
425
|
+
throw coworkCronError(
|
|
426
|
+
"COWORK_SCHEDULER_MIGRATION_SOURCE_UNBOUND",
|
|
427
|
+
`Cowork rollback source locator does not match its workspace: ${entry.sourceId}`,
|
|
428
|
+
);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
return migration;
|
|
432
|
+
};
|
|
433
|
+
const current = assertRollbackBinding(
|
|
434
|
+
schedulerStore.getDomainMigration(migrationId),
|
|
435
|
+
);
|
|
436
|
+
if (current.state === "rolled_back") {
|
|
437
|
+
return { ...current, deduplicated: true };
|
|
438
|
+
}
|
|
439
|
+
const migration = assertRollbackBinding(
|
|
440
|
+
schedulerStore.beginDomainMigrationRollback(migrationId),
|
|
441
|
+
);
|
|
442
|
+
if (migration.state === "rolled_back") return migration;
|
|
443
|
+
const entries = migration.entries;
|
|
444
|
+
for (const entry of entries) {
|
|
445
|
+
if (entry.state === "rolled_back") continue;
|
|
446
|
+
schedulerStore.restoreDomainMigrationEntrySource({
|
|
447
|
+
migrationId,
|
|
448
|
+
entryId: entry.entryId,
|
|
449
|
+
retirementToken: entry.retirementToken,
|
|
450
|
+
restoreSource: () => {
|
|
451
|
+
const current = getSchedule(workspace, entry.sourceId);
|
|
452
|
+
const restored = current.schedulerMigration
|
|
453
|
+
? restoreCoworkSchedulerMigration(workspace, entry.sourceId, {
|
|
454
|
+
migrationId,
|
|
455
|
+
sourceDigest: coworkCronMigrationSourceDigest(current),
|
|
456
|
+
targetJobId: entry.targetJobId,
|
|
457
|
+
retirementToken: entry.retirementToken,
|
|
458
|
+
})
|
|
459
|
+
: current;
|
|
460
|
+
return coworkCronMigrationSourceSnapshot(restored);
|
|
461
|
+
},
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
return schedulerStore.getDomainMigration(migrationId);
|
|
465
|
+
}
|
|
466
|
+
|
|
267
467
|
export function coworkCronScheduledFor(schedule, at) {
|
|
268
468
|
const date = at instanceof Date ? new Date(at.getTime()) : new Date(at);
|
|
269
469
|
if (!Number.isFinite(date.getTime())) {
|
|
@@ -371,6 +571,39 @@ export function createCoworkCronSchedulerAdapter({ runTask, now } = {}) {
|
|
|
371
571
|
}
|
|
372
572
|
return {
|
|
373
573
|
kind: COWORK_CRON_SCHEDULER_KIND,
|
|
574
|
+
async adjudicate({ occurrence, adjudication }) {
|
|
575
|
+
const payload = occurrence.payload;
|
|
576
|
+
const cwd = normalizedCwd(payload.cwd);
|
|
577
|
+
const expected = coworkCronScheduleSnapshot(payload.schedule);
|
|
578
|
+
const expectedDigest = coworkCronScheduleDigest(expected);
|
|
579
|
+
if (payload.snapshotDigest !== expectedDigest) {
|
|
580
|
+
throw coworkCronError(
|
|
581
|
+
"COWORK_CRON_ADJUDICATION_SNAPSHOT_INVALID",
|
|
582
|
+
`Cowork cron adjudication snapshot is invalid: ${occurrence.id}`,
|
|
583
|
+
);
|
|
584
|
+
}
|
|
585
|
+
adjudicateSchedulerScheduleFire(cwd, expected.id, {
|
|
586
|
+
deliveryId: occurrence.triggerKey,
|
|
587
|
+
occurrenceId: occurrence.id,
|
|
588
|
+
snapshotDigest: expectedDigest,
|
|
589
|
+
attempt: adjudication.expectedAttempt,
|
|
590
|
+
decision: adjudication.decision,
|
|
591
|
+
requestId: adjudication.requestId,
|
|
592
|
+
at: now(),
|
|
593
|
+
});
|
|
594
|
+
if (adjudication.decision === "confirmed_applied") {
|
|
595
|
+
return {
|
|
596
|
+
settled: true,
|
|
597
|
+
result: {
|
|
598
|
+
scheduleId: expected.id,
|
|
599
|
+
deliveryId: occurrence.triggerKey,
|
|
600
|
+
status: "adjudicated-applied",
|
|
601
|
+
adjudicationRequestId: adjudication.requestId,
|
|
602
|
+
},
|
|
603
|
+
};
|
|
604
|
+
}
|
|
605
|
+
return { continue: true };
|
|
606
|
+
},
|
|
374
607
|
async execute({ occurrence, signal }) {
|
|
375
608
|
const payload = occurrence.payload;
|
|
376
609
|
const expected = coworkCronScheduleSnapshot(payload?.schedule);
|
|
@@ -589,6 +822,7 @@ export class CoworkCronSchedulerBridge {
|
|
|
589
822
|
leaseMs,
|
|
590
823
|
renewIntervalMs,
|
|
591
824
|
authorityResolver,
|
|
825
|
+
migrateLegacy = true,
|
|
592
826
|
} = {}) {
|
|
593
827
|
if (!schedulerStore) {
|
|
594
828
|
throw coworkCronError(
|
|
@@ -605,6 +839,7 @@ export class CoworkCronSchedulerBridge {
|
|
|
605
839
|
this.cwd = normalizedCwd(cwd);
|
|
606
840
|
this.schedulerStore = schedulerStore;
|
|
607
841
|
this.now = now;
|
|
842
|
+
this.migrateLegacy = migrateLegacy !== false;
|
|
608
843
|
this.runtime = new SchedulerRuntime({
|
|
609
844
|
store: schedulerStore,
|
|
610
845
|
adapters: [createCoworkCronSchedulerAdapter({ runTask, now })],
|
|
@@ -623,6 +858,33 @@ export class CoworkCronSchedulerBridge {
|
|
|
623
858
|
async runDue({ signal } = {}) {
|
|
624
859
|
const results = [];
|
|
625
860
|
const observed = new Set();
|
|
861
|
+
if (!signal?.aborted && this.migrateLegacy) {
|
|
862
|
+
const sourceScope = {
|
|
863
|
+
store: "cowork-schedules",
|
|
864
|
+
workspace: this.cwd,
|
|
865
|
+
};
|
|
866
|
+
const candidates = loadSchedules(this.cwd, {
|
|
867
|
+
failOnMalformed: true,
|
|
868
|
+
}).filter((schedule) => {
|
|
869
|
+
const activeMigration =
|
|
870
|
+
this.schedulerStore.getActiveDomainMigrationBySource({
|
|
871
|
+
domain: "cowork-cron",
|
|
872
|
+
sourceScope,
|
|
873
|
+
sourceId: schedule.id,
|
|
874
|
+
});
|
|
875
|
+
if (schedule.schedulerMigration) {
|
|
876
|
+
return activeMigration?.state !== "retired";
|
|
877
|
+
}
|
|
878
|
+
return activeMigration?.state !== undefined;
|
|
879
|
+
});
|
|
880
|
+
for (const schedule of candidates) {
|
|
881
|
+
migrateCoworkCronSchedule({
|
|
882
|
+
cwd: this.cwd,
|
|
883
|
+
schedulerStore: this.schedulerStore,
|
|
884
|
+
schedule,
|
|
885
|
+
});
|
|
886
|
+
}
|
|
887
|
+
}
|
|
626
888
|
const recovered = await this.runtime.runUntilIdle({
|
|
627
889
|
limit: 10_000,
|
|
628
890
|
signal,
|
|
@@ -703,6 +965,26 @@ export class CoworkCronSchedulerBridge {
|
|
|
703
965
|
result,
|
|
704
966
|
});
|
|
705
967
|
}
|
|
968
|
+
if (this.migrateLegacy) {
|
|
969
|
+
const candidates = loadSchedules(this.cwd, {
|
|
970
|
+
failOnMalformed: true,
|
|
971
|
+
}).filter(
|
|
972
|
+
(schedule) =>
|
|
973
|
+
schedule.enabled === true &&
|
|
974
|
+
!schedule.schedulerMigration &&
|
|
975
|
+
[undefined, "succeeded"].includes(
|
|
976
|
+
schedule.schedulerExecution?.status,
|
|
977
|
+
) &&
|
|
978
|
+
!schedule.activeDelivery,
|
|
979
|
+
);
|
|
980
|
+
for (const schedule of candidates) {
|
|
981
|
+
migrateCoworkCronSchedule({
|
|
982
|
+
cwd: this.cwd,
|
|
983
|
+
schedulerStore: this.schedulerStore,
|
|
984
|
+
schedule,
|
|
985
|
+
});
|
|
986
|
+
}
|
|
987
|
+
}
|
|
706
988
|
return results;
|
|
707
989
|
}
|
|
708
990
|
}
|