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.
Files changed (218) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-DDIUofA8.js → AIOps-axqQfwv8.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-Bm-5xYRn.js → ActionButton-DV-Ro0By.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-D5UH4ljI.js → Analytics-Bt72WEVu.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-D_ifjOOP.js → AppLayout-BtepG55E.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-BY1mXdC7.js → Artifacts-B7KaJ7S_.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-Bujr4Ml3.js → Audit-FNFaUg7A.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-sioKSTcC.js → BackgroundAgents-DFb6J2wQ.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-DDOAK8RK.js → Backup-CC7YBhyj.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-CtCsVVke.js → BaseInput-RkgTNVtj.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-DpNj0vnd.js → Chat-hHEmGZy-.js} +4 -4
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CZta3Ftr.js → ChatBubbleRenderer-CAP9YhHv.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-DoHVNSXq.js → Checkbox-z5wXOQP1.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-DlVl7Qmv.js → Codegen-DVaDJnxy.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-GIqoPYty.js → Col-CJmaRDR5.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-CIAPEVji.js → Community-DF29_2bI.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-BN7JiI_h.js → Compact-DtkQkBzn.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-CqUWCM9B.js → Compliance-xoHDxp7I.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-A4iPp7A4.js → Cowork-BUm-R7ht.js} +3 -3
  20. package/src/assets/web-panel/assets/{Cron-B2zeXXWb.js → Cron-Cgl14ZkB.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-BR2xmWr8.js → Crosschain-BNcbmoqh.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-BzFDjrIv.js → DID-Bwja0Zo9.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-DKtDo3yA.js → Dashboard-Bk5XjEdJ.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-RNx43_YG.js → Dropdown-Ci36Oitq.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-SwMt4Rcy.js → EmailListRenderer--U04ZN4q.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CsYebZ4X.js → FamilyGuardDashboard-B2gNPR2s.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-BmRKvBTy.js → Federation-C4KghYn7.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-CVxGTA-0.js → FormItemContext-QL7x_Q_0.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-x2iXpyB7.js → GenericCardRenderer-F3Ryltwm.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-DfqbkiOP.js → Git-2HassK5k.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-RuHyyj5O.js → Governance-DoBIp7oe.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-Bn7uZ7rI.js → Inference--W01QhZ-.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-DlP7XefZ.js → KnowledgeGraph-DmvwqGpT.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-BYNdOiCd.js → Logs-BBJ4yAel.js} +2 -2
  35. package/src/assets/web-panel/assets/{MarkdownRenderer-aMtgN-R6.js → MarkdownRenderer-BLCZMzhJ.js} +1 -1
  36. package/src/assets/web-panel/assets/{Marketplace-JQYmDqM8.js → Marketplace-D5lNngSI.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-Cyx4yZ-9.js → McpTools-CkEVOMKH.js} +4 -4
  38. package/src/assets/web-panel/assets/{Memory-VDuGZTN2.js → Memory-B1Ow1xVE.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-_yKo97gi.js → MobileBridge-SgYbUfb6.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-CXRXW3q7.js → MobileProjects-BWdOvQAj.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-acTGtfLH.js → Mtc-DcTXSSma.js} +5 -5
  42. package/src/assets/web-panel/assets/{MtcAudit-ClpjXfkY.js → MtcAudit-Dt3WG4oj.js} +4 -4
  43. package/src/assets/web-panel/assets/{Multisig-_6Tn3o96.js → Multisig-B9B38UZx.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-CK7pbZzP.js → NLProgramming-B0S4GGvG.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-Czy6V_P8.js → Notes-DZ5U58Ng.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-Cqx-UVv3.js → NotificationSettings-PjL5ZW34.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-C69WDxGy.js → OrderTableRenderer-DrAX2ESt.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-DFnA9vLQ.js → Organization-Cv1GYs-c.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-ReZkk2yT.js → Overflow-Bbkp_PL3.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-DzjSI0aI.js → P2P-BD8QUgoZ.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-DKTf5xIP.js → PdhVaultBrowser-BO-2PeaB.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-DhQ5klhR.js → Permissions-D_OPVa02.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-CUL1iHrW.js → PersonalDataHub-mh-pEmaB.js} +4 -4
  54. package/src/assets/web-panel/assets/{Pipeline-DU88iu4N.js → Pipeline-6JC2EDdb.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-Bw-sYfyK.js → Privacy-CUshzUAG.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-Bq3Q5y0z.js → ProjectInit-Cs2Aalri.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-C8spzpho.js → ProjectSettings-1ak49tcj.js} +2 -2
  58. package/src/assets/web-panel/assets/Projects-BV4oApsm.js +1 -0
  59. package/src/assets/web-panel/assets/{Providers-Bf4eTP9W.js → Providers-CXXxvafH.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-Dme9BDU1.js → QrScannerModal-PTcDsF58.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-CIXfv1rE.js → QuickAsk-CDwucrJw.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-CIxvdeZ-.js → Recommend-CJlLVRXR.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-C6k7MExI.js → RemoteSession-DlN-ETsO.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-CISDz2bl.js → Reputation-DI23LR6m.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-CdnDxXyf.js → Row-Cl7UQMrM.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-C-QpRHsl.js → RssFeed-CexHNfh8.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-DBjaGzSn.js → Search-BneBWvRN.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-CQKukOeE.js → Security-DX7Phgrp.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-DZz86jWb.js → Services-BWXO8Mte.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-jb8RMK0d.js → Skeleton-DCyOjKPJ.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-CdY76fZG.js → Skills-CXqERsTB.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-C_CSiZX9.js → Sla-bhbrbz8E.js} +1 -1
  73. package/src/assets/web-panel/assets/SpeechSettings-3IPU0HBZ.js +1 -0
  74. package/src/assets/web-panel/assets/{SyncSettings-qvimGO0O.js → SyncSettings-DBNTQLbM.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-Dng5LPJC.js → Tasks-quP0bkN-.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-Bwqq5Wll.js → Templates-BouWmgho.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-DNWuwP7Z.js → Tenant-qv0D9s7z.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-B-6Othpp.js → Terminal-BxvbE8BB.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-DKpKZfzx.js → TimelineRenderer-D-IeLnJ2.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-DzfGMd2J.js → Tokens-CFMKKyVG.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-BXwUi74J.js → Trigger-L8as3UuJ.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-BNzUq4ui.js → Trust-MxmA4VZG.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-BYugxww4.js → UkeySign-C0VvJYRi.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-DdauhtSJ.js → VideoEditing-Bf5QZj8N.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-CSC9bCe_.js → Wallet-BIJ9riRz.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-Q8AN3bTO.js → WebAuthn-B8p9Mhkw.js} +5 -5
  87. package/src/assets/web-panel/assets/{WorkflowEditor-d-LBGCuA.js → WorkflowEditor-BVsuaPen.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-BLVDCgsZ.js → chat-BfkjoKpV.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-BZlPSEHl.js → colors-DeAlsWK8.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-IWseP6R6.js → compact-item-Cs97bz5j.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-DnVRV3Ao.js → createContext-BqbG60LH.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-DPty0mGN.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-DLQZA_Wn.js → hasIn-i_RY0b1X.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-B_N4-Gq9.js → index-0-agYlWL.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-DB0MJgF_.js → index-79V_zv1s.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-BOZJBTWZ.js → index-B-3tEpTc.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DUq0c7gq.js → index-B-JVTrpr.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-Dy0R5ZED.js → index-B1CbOH1i.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-Bxp7uDD8.js → index-B5UkyA3c.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DpVrK6fr.js → index-BESLFt4q.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CT9vVN-X.js → index-BOVkf1K3.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DOoQpuQY.js → index-BYUVuwKt.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CINJQEj6.js → index-BcUXAB2s.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CarMTIyQ.js → index-BkBi5TmC.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-C5dgnilC.js → index-Bm7lLR4c.js} +1 -1
  106. package/src/assets/web-panel/assets/index-Bt7g0Vq_.js +1 -0
  107. package/src/assets/web-panel/assets/{index-CbQNL0ue.js → index-BuLQobzW.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CpBaJ3TD.js → index-CE2VtTlp.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-jWb70ZgZ.js → index-CED2PL_y.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BEu2lMBy.js → index-CG3PRyAL.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DocEhinm.js → index-CIG8fQ2_.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-D_LQodeJ.js → index-COdGA-8n.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DZpYeqrh.js → index-CeWoNHau.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-gt8bNefW.js → index-Cf3WCLmy.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-N_GoWZX4.js → index-CgsqdnRV.js} +1 -1
  116. package/src/assets/web-panel/assets/index-ChVT0p9u.js +1 -0
  117. package/src/assets/web-panel/assets/{index-CZDekj7T.js → index-D2B4VPyP.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-YSw_gxlZ.js → index-D9evtvg2.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DTbxp4UH.js → index-DUUrv141.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Bbj2NS_I.js → index-DiSkx4UB.js} +3 -3
  121. package/src/assets/web-panel/assets/{index-BZs5bBnk.js → index-Dk2qouAz.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DalA0TKC.js → index-Dk7-v4hP.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-1jeAudHd.js → index-DmbfhJUP.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-C1ifZtXo.js → index-DqBgBpgp.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BhA3QEni.js → index-PT_5sBMA.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BSjilZ9L.js → index-U4f5izHz.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-C2FqfMvU.js → index-YXgLng0K.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-COev0W2g.js → index-ZxO_-E8a.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-M7wxfAbm.js → index-dIHr4B_u.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DjWnONdy.js → index-gyFpvL7l.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-Dkwsi1Kn.js → index-s1opAL-M.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-hwVDeoC0.js → index-yObj1O4n.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-Co67Kqmb.js → initDefaultProps-C9h9yKL3.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-BMOxQSF_.js → motion-BvmLsPdu.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-C5fWDw-N.js → move-CoL4ekU1.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-BJevpL0e.js → mtc-parser-C4pMy6xV.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-BCzNU8s6.js → omit-DPuJfNxx.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-CybWvDPk.js → pickAttrs-D0KEeaK2.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-BMWS9HnW.js → placementArrow-BpkyINxt.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-BoL2UnGY.js → responsiveObserve-DQI_wOq8.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-DWNfXraU.js → slide-DYfdDiRg.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-BquTM3tX.js → statusUtils-B5dtvb0D.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-BEkCleim.js → styleChecker-CF310mSj.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-Oecnq7EA.js → useFlexGapSupport-D1Qp4BLp.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-CkDffJ4F.js → useFs-C7_iyvJK.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-qbvKXesB.js → usePersonalDataHub-DZUt_fIm.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-C6v8n6mA.js → vnode-D3dsi0lZ.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-4CTeFILV.js → zoom-WdbOlvdQ.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/command-help-index.json +2 -2
  151. package/src/commands/agent.js +90 -1
  152. package/src/commands/chat.js +11 -2
  153. package/src/commands/compact.js +106 -23
  154. package/src/commands/loop.js +28 -10
  155. package/src/commands/routine.js +1 -1
  156. package/src/commands/scheduler-daemon.js +359 -2
  157. package/src/commands/session-observability.js +305 -0
  158. package/src/commands/session.js +38 -0
  159. package/src/data/changelog.json +14 -1
  160. package/src/gateways/ws/ws-agent-handler.js +439 -5
  161. package/src/harness/jsonl-session-store.js +463 -125
  162. package/src/harness/prompt-compressor.js +86 -13
  163. package/src/harness/provider-backed-compaction.js +100 -27
  164. package/src/lib/advisor-runtime.js +3 -1
  165. package/src/lib/agent-schedule-store.js +414 -4
  166. package/src/lib/agent-team/team-adjudication.js +40 -1
  167. package/src/lib/automation-engine.js +494 -0
  168. package/src/lib/background-agent-supervisor.js +793 -215
  169. package/src/lib/background-command-argv.js +24 -0
  170. package/src/lib/background-interaction-journal.js +361 -52
  171. package/src/lib/background-interaction-resolver.js +32 -0
  172. package/src/lib/background-launch-profile.js +2 -0
  173. package/src/lib/causal-observability.js +2661 -0
  174. package/src/lib/chat-session-admission.js +76 -0
  175. package/src/lib/cost-budget.js +5 -7
  176. package/src/lib/cowork/ab-comparator-cli.js +11 -0
  177. package/src/lib/cowork/debate-review-cli.js +12 -0
  178. package/src/lib/cowork-adapter.js +159 -38
  179. package/src/lib/cowork-cron.js +357 -1
  180. package/src/lib/cowork-task-runner.js +112 -17
  181. package/src/lib/delivery-coordinator.js +142 -0
  182. package/src/lib/direct-model-usage.js +121 -0
  183. package/src/lib/file-lines.js +183 -47
  184. package/src/lib/llm-pricing.js +12 -17
  185. package/src/lib/loop.js +26 -2
  186. package/src/lib/routine-store.js +380 -21
  187. package/src/lib/runtime-usage-ledger.js +182 -0
  188. package/src/lib/scheduler-kernel/agenda-adapter.js +308 -3
  189. package/src/lib/scheduler-kernel/automation-adapter.js +410 -8
  190. package/src/lib/scheduler-kernel/automation-event-adapter.js +36 -0
  191. package/src/lib/scheduler-kernel/cowork-cron-adapter.js +285 -3
  192. package/src/lib/scheduler-kernel/loop-adapter.js +541 -6
  193. package/src/lib/scheduler-kernel/migration-admin.js +346 -0
  194. package/src/lib/scheduler-kernel/migration-rollback-admin.js +932 -0
  195. package/src/lib/scheduler-kernel/routine-adapter.js +394 -20
  196. package/src/lib/scheduler-kernel/runtime.js +63 -1
  197. package/src/lib/scheduler-kernel/source-locator-path.js +142 -0
  198. package/src/lib/scheduler-kernel/store.js +2586 -85
  199. package/src/lib/session-host-lease.js +171 -2
  200. package/src/lib/session-host-snapshot.js +14 -3
  201. package/src/lib/session-persistence-failure.js +1 -0
  202. package/src/lib/session-tail.js +179 -34
  203. package/src/lib/session-transcript-structure.js +96 -0
  204. package/src/lib/sub-agent-context.js +328 -22
  205. package/src/lib/ws-agent-handler.js +4 -1
  206. package/src/repl/agent-repl.js +732 -91
  207. package/src/repl/chat-repl.js +5 -1
  208. package/src/runtime/agent-core.js +1272 -207
  209. package/src/runtime/fallback-model.js +5 -0
  210. package/src/runtime/headless-runner.js +324 -82
  211. package/src/runtime/headless-stream.js +232 -26
  212. package/src/runtime/policies/agent-policy.js +4 -0
  213. package/src/workers/background-agent-worker.js +403 -96
  214. package/src/assets/web-panel/assets/Projects-Dd-xuPIc.js +0 -1
  215. package/src/assets/web-panel/assets/SpeechSettings-C7tT9iad.js +0 -1
  216. package/src/assets/web-panel/assets/devWarning-Jzu62CLC.js +0 -1
  217. package/src/assets/web-panel/assets/index-Zb2MeDSy.js +0 -1
  218. 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
- const absolute = resolve(cwd);
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
  }