chainlesschain 0.162.188 → 0.162.193

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 (337) hide show
  1. package/README.md +61 -11
  2. package/bin/chainlesschain.js +7 -52
  3. package/completions/_cc +209 -0
  4. package/completions/cc.bash +18 -0
  5. package/completions/cc.fish +13 -0
  6. package/completions/cc.ps1 +226 -0
  7. package/package.json +10 -2
  8. package/src/assets/web-panel/assets/{AIOps-Brr1LVcE.js → AIOps-DBLkaTje.js} +1 -1
  9. package/src/assets/web-panel/assets/{ActionButton-DQU74DKG.js → ActionButton-BAy-Qebo.js} +1 -1
  10. package/src/assets/web-panel/assets/{Analytics-CYp9178y.js → Analytics-Dfb1Mlau.js} +3 -3
  11. package/src/assets/web-panel/assets/{AppLayout-DW4SCYsW.js → AppLayout-BbFkN8m0.js} +5 -5
  12. package/src/assets/web-panel/assets/{Artifacts-CYlD_ed1.js → Artifacts-kM4-cEEH.js} +1 -1
  13. package/src/assets/web-panel/assets/{Audit-CWl1rZOi.js → Audit-BSQfYWf3.js} +1 -1
  14. package/src/assets/web-panel/assets/{BackgroundAgents-BOR-LPsa.js → BackgroundAgents-CWDbI_fG.js} +1 -1
  15. package/src/assets/web-panel/assets/{Backup-DLpG7j1X.js → Backup-BxLPbq_Q.js} +1 -1
  16. package/src/assets/web-panel/assets/{BaseInput-B35K9wdr.js → BaseInput-DuIbdrp6.js} +1 -1
  17. package/src/assets/web-panel/assets/{Chat-CwUJb9gB.js → Chat-NEmjGahU.js} +5 -5
  18. package/src/assets/web-panel/assets/{ChatBubbleRenderer-1v6aMS1m.js → ChatBubbleRenderer-DfJEo-5_.js} +1 -1
  19. package/src/assets/web-panel/assets/{Checkbox-pi3-tPNW.js → Checkbox-CaoeG3Ns.js} +1 -1
  20. package/src/assets/web-panel/assets/{Codegen-FyNF35eL.js → Codegen-BFf_g3xY.js} +1 -1
  21. package/src/assets/web-panel/assets/{Col-tGt_JDEr.js → Col-CNOd8mdQ.js} +1 -1
  22. package/src/assets/web-panel/assets/{Community-CC7LonQX.js → Community-BhpDqz-i.js} +1 -1
  23. package/src/assets/web-panel/assets/{Compact-BGXrHHjE.js → Compact-CQ42T7Z6.js} +1 -1
  24. package/src/assets/web-panel/assets/{Compliance-DSW0TBZ8.js → Compliance-DI5PcLMN.js} +1 -1
  25. package/src/assets/web-panel/assets/{Cowork-Bhk7rbvE.js → Cowork-wYYZe0wR.js} +3 -3
  26. package/src/assets/web-panel/assets/{Cron-DxyiQ2NZ.js → Cron-Dlq03DD_.js} +2 -2
  27. package/src/assets/web-panel/assets/{Crosschain-B2ZkxHok.js → Crosschain-BzqS8PP3.js} +1 -1
  28. package/src/assets/web-panel/assets/{DID-yOJV99eJ.js → DID-It55Yem7.js} +2 -2
  29. package/src/assets/web-panel/assets/{Dashboard-CKsttz7D.js → Dashboard-9HkH6oxn.js} +2 -2
  30. package/src/assets/web-panel/assets/{Dropdown-CVFldXSL.js → Dropdown-00e2YWRB.js} +1 -1
  31. package/src/assets/web-panel/assets/{EmailListRenderer-Bufv638J.js → EmailListRenderer-By-ugRDL.js} +1 -1
  32. package/src/assets/web-panel/assets/{FamilyGuardDashboard-4ncjoIjL.js → FamilyGuardDashboard-C396yu5m.js} +1 -1
  33. package/src/assets/web-panel/assets/{Federation-DsknEDoX.js → Federation-BME5sbZY.js} +1 -1
  34. package/src/assets/web-panel/assets/{FormItemContext-Cqe5jWXA.js → FormItemContext-B4TEZCr-.js} +1 -1
  35. package/src/assets/web-panel/assets/{GenericCardRenderer-NAJaFKxc.js → GenericCardRenderer-_9CX9ieY.js} +1 -1
  36. package/src/assets/web-panel/assets/{Git-CszKQpnl.js → Git-BrS6WVSr.js} +2 -2
  37. package/src/assets/web-panel/assets/{Governance-BXGodXi6.js → Governance-BMdCWnKF.js} +1 -1
  38. package/src/assets/web-panel/assets/{Inference-CkoYuG2c.js → Inference-Bcp3vzcA.js} +1 -1
  39. package/src/assets/web-panel/assets/{KnowledgeGraph-DFlEr_T0.js → KnowledgeGraph-DlLuqGY5.js} +1 -1
  40. package/src/assets/web-panel/assets/{Logs-CVaENddA.js → Logs-D-W_6x09.js} +2 -2
  41. package/src/assets/web-panel/assets/MarkdownRenderer-DElGPxCZ.js +1 -0
  42. package/src/assets/web-panel/assets/{Marketplace-CDlLT0fw.js → Marketplace-Dzn2guvI.js} +1 -1
  43. package/src/assets/web-panel/assets/{McpTools-DdwOyszN.js → McpTools-uPict-KL.js} +6 -6
  44. package/src/assets/web-panel/assets/{Memory-DKQnkKuG.js → Memory-BCw43kOb.js} +2 -2
  45. package/src/assets/web-panel/assets/{MobileBridge-DGseqlzJ.js → MobileBridge-DmV8Wv7F.js} +1 -1
  46. package/src/assets/web-panel/assets/{MobileProjects-COBbEOlj.js → MobileProjects-C-HaCmSM.js} +1 -1
  47. package/src/assets/web-panel/assets/{Mtc-O61Vwyli.js → Mtc-C6jxJ34Y.js} +5 -5
  48. package/src/assets/web-panel/assets/{MtcAudit-Dw2SyasS.js → MtcAudit-Za8ExwhQ.js} +5 -5
  49. package/src/assets/web-panel/assets/{Multisig-hSu_l8kf.js → Multisig-KKDbuEgb.js} +3 -3
  50. package/src/assets/web-panel/assets/{NLProgramming-CX1Epurr.js → NLProgramming-Dj97zbCk.js} +1 -1
  51. package/src/assets/web-panel/assets/{Notes-R9xX8o8_.js → Notes-DBXvMraU.js} +4 -4
  52. package/src/assets/web-panel/assets/{NotificationSettings-jtSNLCuK.js → NotificationSettings-DOxITLYl.js} +1 -1
  53. package/src/assets/web-panel/assets/OrderTableRenderer-7DVjZwMM.js +1 -0
  54. package/src/assets/web-panel/assets/{Organization-Pu2WO-U3.js → Organization-D1i73mjb.js} +4 -4
  55. package/src/assets/web-panel/assets/{Overflow-BjnqUyFp.js → Overflow-kW6Q3rvg.js} +1 -1
  56. package/src/assets/web-panel/assets/{P2P-jjkvz44c.js → P2P-C-v_8p2v.js} +2 -2
  57. package/src/assets/web-panel/assets/PdhVaultBrowser-tUbbY64W.js +7 -0
  58. package/src/assets/web-panel/assets/{Permissions-D4yDpivd.js → Permissions-DkHxEZ58.js} +4 -4
  59. package/src/assets/web-panel/assets/{PersonalDataHub-0qsL6iH1.js → PersonalDataHub-DWuMPGrK.js} +5 -5
  60. package/src/assets/web-panel/assets/{Pipeline-Cx7Ybrk2.js → Pipeline-30IYXWWm.js} +1 -1
  61. package/src/assets/web-panel/assets/{Privacy-PbfR_M_V.js → Privacy-DZNQ4RrH.js} +1 -1
  62. package/src/assets/web-panel/assets/{ProjectInit-CyV6Gsub.js → ProjectInit-De2MCElf.js} +2 -2
  63. package/src/assets/web-panel/assets/{ProjectSettings-C7KZ2Wdk.js → ProjectSettings-5uHk9wsC.js} +2 -2
  64. package/src/assets/web-panel/assets/{Projects-DQDjO-yK.js → Projects-XjDfrFLb.js} +1 -1
  65. package/src/assets/web-panel/assets/{Providers-DyFVBBMX.js → Providers-Bgwj6gcE.js} +1 -1
  66. package/src/assets/web-panel/assets/{QrScannerModal-CzB1BC9_.js → QrScannerModal-gKql9umv.js} +1 -1
  67. package/src/assets/web-panel/assets/{QuickAsk-Bk636mC1.js → QuickAsk-BWvmwkh7.js} +1 -1
  68. package/src/assets/web-panel/assets/{Recommend-DoWxHIT3.js → Recommend-Uok4hZPd.js} +1 -1
  69. package/src/assets/web-panel/assets/{RemoteSession-oOVIv9wq.js → RemoteSession-DLJzTk9a.js} +3 -3
  70. package/src/assets/web-panel/assets/{Reputation-BucoReGG.js → Reputation-ZVwIPMSO.js} +1 -1
  71. package/src/assets/web-panel/assets/{Row-DzmOdJU7.js → Row-CN04HxWR.js} +1 -1
  72. package/src/assets/web-panel/assets/{RssFeed-C1tK7KGU.js → RssFeed-BdSrEG4g.js} +3 -3
  73. package/src/assets/web-panel/assets/{Search-CSnInOqk.js → Search-5PwVd0IR.js} +1 -1
  74. package/src/assets/web-panel/assets/{Security-dlejr15l.js → Security-DdBo4zjN.js} +3 -3
  75. package/src/assets/web-panel/assets/{Services-BioPZuNh.js → Services-D3letU7M.js} +2 -2
  76. package/src/assets/web-panel/assets/{Skeleton-DWMibwpC.js → Skeleton--Jb83f1v.js} +1 -1
  77. package/src/assets/web-panel/assets/{Skills-BAAnx1B2.js → Skills-Bg-CulHX.js} +1 -1
  78. package/src/assets/web-panel/assets/{Sla-jWNp4hNO.js → Sla-7QOa7S-X.js} +1 -1
  79. package/src/assets/web-panel/assets/{SpeechSettings-y5kqKha-.js → SpeechSettings-DQwppjRw.js} +1 -1
  80. package/src/assets/web-panel/assets/{SyncSettings-B9GNsc3e.js → SyncSettings-dNPQGL-s.js} +2 -2
  81. package/src/assets/web-panel/assets/{Tasks-BDBYKRen.js → Tasks-Ggs-Z48q.js} +1 -1
  82. package/src/assets/web-panel/assets/{Templates-DRiE5eaN.js → Templates-78TYHgRO.js} +1 -1
  83. package/src/assets/web-panel/assets/{Tenant-BGlAvExF.js → Tenant-xHwwv9vO.js} +1 -1
  84. package/src/assets/web-panel/assets/{Terminal-B8uzrbNY.js → Terminal-BJXSJfm4.js} +2 -2
  85. package/src/assets/web-panel/assets/{TimelineRenderer-Df48iveY.js → TimelineRenderer-fLbjRhJw.js} +1 -1
  86. package/src/assets/web-panel/assets/{Tokens-CcmHndN6.js → Tokens-oMSBSBmB.js} +1 -1
  87. package/src/assets/web-panel/assets/{Trigger-DPkWxmQ2.js → Trigger-CfnY_wX_.js} +1 -1
  88. package/src/assets/web-panel/assets/{Trust-DTb5a5AV.js → Trust-AdyTgYKO.js} +1 -1
  89. package/src/assets/web-panel/assets/{UkeySign-CBmg5vch.js → UkeySign-C5K_81dS.js} +1 -1
  90. package/src/assets/web-panel/assets/{VideoEditing-B0mZrz4O.js → VideoEditing-vcGVDqki.js} +1 -1
  91. package/src/assets/web-panel/assets/{Wallet-Bxs7_mpd.js → Wallet-hhOc3hlY.js} +4 -4
  92. package/src/assets/web-panel/assets/{WebAuthn-C8x3cMxU.js → WebAuthn-CVloC11s.js} +3 -3
  93. package/src/assets/web-panel/assets/{WorkflowEditor-DPrNznrP.js → WorkflowEditor-CYeE32R5.js} +1 -1
  94. package/src/assets/web-panel/assets/{chat-D3bYWu7S.js → chat-CNROR5bN.js} +1 -1
  95. package/src/assets/web-panel/assets/{colors-DY-PwMu4.js → colors-Cjx-cnwU.js} +1 -1
  96. package/src/assets/web-panel/assets/{compact-item-LDk10Kw6.js → compact-item-DOIfelvD.js} +1 -1
  97. package/src/assets/web-panel/assets/{createContext-C-2MZnFq.js → createContext-DfA7UZ8u.js} +1 -1
  98. package/src/assets/web-panel/assets/devWarning-ChcCBGs7.js +1 -0
  99. package/src/assets/web-panel/assets/{hasIn-BQIBjcnB.js → hasIn-BMSCzcfM.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CQVb2dWp.js → index-5-HXgOX5.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BdXnYMCZ.js → index-AWg-0M1S.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Cx6D_dx2.js → index-B4iYzpkL.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-_HRO_cIu.js → index-B5Udeb_6.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DlRYqt3S.js → index-B7gf77CJ.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BrnRO9yE.js → index-BEMwBBHk.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-VCh5zNJo.js → index-BM1y_9hM.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BRI3ngNg.js → index-BUonmKSE.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-C3GNvExG.js → index-BbQ2eQ8H.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DSvo_bp0.js → index-BemJ2u_E.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-L6qixyLc.js → index-BolaOQxx.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-BI4KgcYC.js → index-BxOk9vkG.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CY4KnaO9.js → index-By61ojUx.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-L3smcoQX.js → index-C2K9SNVX.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BX2b9Orc.js → index-C3L5gdiD.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-Cz4b6Z_7.js → index-C7xn0Nub.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-COG61sRv.js → index-CAnvhwg6.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-C7FC8cP2.js → index-CEKMcOyU.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-BN-xdSWZ.js → index-CNC5onm4.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DY2FIrmz.js → index-CVL27kXC.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CiTvBAr-.js → index-CVm1_i3t.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DhRt9cYJ.js → index-CdYBye8B.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-B5pgtZnY.js → index-ClNMrqEY.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-7xKu7Fns.js → index-Cs6l7uRu.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-D4K1weKc.js → index-CshQbilz.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-k7C_oDCO.js → index-Cyweh0Hy.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-D3Oq-DLL.js → index-DBpWXFed.js} +3 -3
  127. package/src/assets/web-panel/assets/{index-DYyLJPlF.js → index-DHtpHZAQ.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-Dh-tkpKQ.js → index-DLmn0BoK.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-8JC9BJa1.js → index-DPAWBrMf.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Dd2Km97U.js → index-DjEsxO5h.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-KFZO_lcx.js → index-FBc_CJBd.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DTIZpPtG.js → index-Icdoqmzt.js} +1 -1
  133. package/src/assets/web-panel/assets/index-Q2IajL54.js +1 -0
  134. package/src/assets/web-panel/assets/index-bRkHgOMc.js +1 -0
  135. package/src/assets/web-panel/assets/{index-lmm9p-jm.js → index-dCd8cSUq.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-HasPt4-h.js → index-m2vG9gG_.js} +1 -1
  137. package/src/assets/web-panel/assets/{index-CaslYch6.js → index-mTpHoEzr.js} +1 -1
  138. package/src/assets/web-panel/assets/{index-CbR6ROOa.js → index-ti_lnTWl.js} +1 -1
  139. package/src/assets/web-panel/assets/{initDefaultProps-zQPSHf2C.js → initDefaultProps-Bu8k7H1Y.js} +1 -1
  140. package/src/assets/web-panel/assets/{motion-CKCStGVk.js → motion-s3iVK41k.js} +1 -1
  141. package/src/assets/web-panel/assets/{move-BufVDGYF.js → move-B6B-E5Jz.js} +1 -1
  142. package/src/assets/web-panel/assets/{mtc-parser-DcaFxy5D.js → mtc-parser-BiYgTidA.js} +1 -1
  143. package/src/assets/web-panel/assets/{omit-EScpkGdo.js → omit-pU1RdUDA.js} +1 -1
  144. package/src/assets/web-panel/assets/{pickAttrs-72hG_qfT.js → pickAttrs-Cdoq_SeM.js} +1 -1
  145. package/src/assets/web-panel/assets/{placementArrow-CMFWiH20.js → placementArrow-DIuvAn2K.js} +1 -1
  146. package/src/assets/web-panel/assets/{responsiveObserve-DKQHS41p.js → responsiveObserve-8w16YR2D.js} +1 -1
  147. package/src/assets/web-panel/assets/{slide-QVAFHTIQ.js → slide-VZ01cZe3.js} +1 -1
  148. package/src/assets/web-panel/assets/{statusUtils-DIz38e2G.js → statusUtils-lh8YMN8Z.js} +1 -1
  149. package/src/assets/web-panel/assets/{styleChecker-zK5cyLby.js → styleChecker-CmDyreec.js} +1 -1
  150. package/src/assets/web-panel/assets/{useFlexGapSupport-DhZngk62.js → useFlexGapSupport-hiJWMU5y.js} +1 -1
  151. package/src/assets/web-panel/assets/{useFs-BvV2cvkg.js → useFs-Thnu-Iaj.js} +1 -1
  152. package/src/assets/web-panel/assets/{usePersonalDataHub-CRmxb9l3.js → usePersonalDataHub-LBdOxjwY.js} +1 -1
  153. package/src/assets/web-panel/assets/{vnode-CgQIbobP.js → vnode-Cg6lFY_X.js} +1 -1
  154. package/src/assets/web-panel/assets/{zoom-D4XrrO0R.js → zoom-DVfsR1YO.js} +1 -1
  155. package/src/assets/web-panel/index.html +1 -1
  156. package/src/cli-help.js +181 -0
  157. package/src/command-help-index.json +181 -0
  158. package/src/command-manifest.json +1107 -175
  159. package/src/command-surface-policy.js +197 -0
  160. package/src/commands/agent.js +98 -33
  161. package/src/commands/artifacts.js +400 -2
  162. package/src/commands/background-session.js +41 -3
  163. package/src/commands/checkpoint-managed.js +1059 -0
  164. package/src/commands/checkpoint-restore-recovery.js +1476 -0
  165. package/src/commands/checkpoint.js +950 -22
  166. package/src/commands/compact.js +101 -25
  167. package/src/commands/config.js +506 -20
  168. package/src/commands/doctor.js +4 -1
  169. package/src/commands/hub.js +1 -1
  170. package/src/commands/mcp.js +688 -24
  171. package/src/commands/pack.js +16 -2
  172. package/src/commands/plugin.js +20 -12
  173. package/src/commands/session-mcp-recovery.js +218 -0
  174. package/src/commands/session.js +470 -110
  175. package/src/commands/setup.js +36 -10
  176. package/src/commands/skill.js +181 -110
  177. package/src/commands/status.js +21 -5
  178. package/src/commands/team-distributed.js +3324 -0
  179. package/src/commands/team.js +1130 -74
  180. package/src/commands/update.js +68 -6
  181. package/src/constants.js +11 -0
  182. package/src/data/changelog.json +26 -0
  183. package/src/gateways/ws/action-protocol.js +10 -0
  184. package/src/gateways/ws/session-protocol.js +555 -27
  185. package/src/gateways/ws/ws-agent-handler.js +541 -14
  186. package/src/gateways/ws/ws-session-gateway.js +129 -22
  187. package/src/gateways/ws/ws-session-state.js +431 -0
  188. package/src/harness/background-task-manager.js +233 -36
  189. package/src/harness/jsonl-session-store.js +2551 -167
  190. package/src/harness/mcp-client.js +802 -61
  191. package/src/harness/prompt-compressor.js +227 -27
  192. package/src/harness/session-index.js +89 -38
  193. package/src/harness/session-list-index.js +254 -0
  194. package/src/harness/structured-handoff.js +410 -0
  195. package/src/lazy-dispatch.js +747 -84
  196. package/src/lib/__tests__/logger.test.js +50 -2
  197. package/src/lib/advisor-runtime.js +1047 -0
  198. package/src/lib/agent-core.js +2 -0
  199. package/src/lib/agent-sandbox.js +120 -26
  200. package/src/lib/agent-session-export.js +20 -0
  201. package/src/lib/agent-team/task-lease.js +271 -3
  202. package/src/lib/agent-team/team-adjudication.js +1501 -0
  203. package/src/lib/agent-team/team-budget.js +4 -1
  204. package/src/lib/agent-team/team-control-store.js +582 -0
  205. package/src/lib/agent-team/team-distributed-queue.js +5246 -0
  206. package/src/lib/agent-team/team-process-checkpoint.js +211 -0
  207. package/src/lib/agent-team/team-runner.js +543 -24
  208. package/src/lib/agent-team/team-worktree.js +1403 -95
  209. package/src/lib/artifact-store.js +131 -8
  210. package/src/lib/background-agent-supervisor.js +185 -13
  211. package/src/lib/background-interaction-journal.js +37 -9
  212. package/src/lib/background-launch-profile.js +1058 -0
  213. package/src/lib/checkpoint-restore-already-completed-controller.js +902 -0
  214. package/src/lib/checkpoint-restore-orchestrator.js +987 -0
  215. package/src/lib/checkpoint-restore-partial-rollback-controller.js +1953 -0
  216. package/src/lib/checkpoint-restore-recovery-controller.js +689 -0
  217. package/src/lib/checkpoint-restore-recovery.js +884 -0
  218. package/src/lib/checkpoint-restore-retention.js +126 -0
  219. package/src/lib/checkpoint-restore-saga.js +5079 -0
  220. package/src/lib/checkpoint-restore-session-recovery.js +1178 -0
  221. package/src/lib/checkpoint-restore-workspace-target-verifier.js +270 -0
  222. package/src/lib/checkpoint-store.js +1688 -97
  223. package/src/lib/checkpoint-timeline-authority.js +522 -0
  224. package/src/lib/checkpoint-timeline.js +642 -0
  225. package/src/lib/config-keys.js +18 -119
  226. package/src/lib/config-manager.js +446 -27
  227. package/src/lib/config-redaction.js +57 -0
  228. package/src/lib/config-schema.js +853 -0
  229. package/src/lib/cowork-mcp-tools.js +5 -0
  230. package/src/lib/cowork-task-runner.js +458 -63
  231. package/src/lib/delivery-coordinator.js +1234 -0
  232. package/src/lib/delivery-evidence.js +450 -0
  233. package/src/lib/doctor-checkup.js +199 -14
  234. package/src/lib/executable-path.js +34 -0
  235. package/src/lib/fatal-handler.js +16 -0
  236. package/src/lib/file-checkpoint.js +4909 -186
  237. package/src/lib/file-lines.js +125 -0
  238. package/src/lib/headless-config-command.js +16 -5
  239. package/src/lib/hook-runner.cjs +139 -38
  240. package/src/lib/hooks-v2-workspace-context.js +10 -0
  241. package/src/lib/impacted-gate-selector.js +424 -0
  242. package/src/lib/interaction-adapter.js +62 -0
  243. package/src/lib/jsonl-session-store.js +1 -35
  244. package/src/lib/logger.js +66 -14
  245. package/src/lib/managed-checkpoint-render.js +60 -0
  246. package/src/lib/managed-tool-checkpoint.js +194 -0
  247. package/src/lib/mcp-call-ledger-store.js +1069 -0
  248. package/src/lib/mcp-call-ledger.js +747 -0
  249. package/src/lib/mcp-client.js +5 -0
  250. package/src/lib/mcp-conflict-scheduler.js +468 -0
  251. package/src/lib/mcp-effect-contract.js +102 -0
  252. package/src/lib/mcp-headers-helper-trust.js +145 -0
  253. package/src/lib/mcp-headers-helper.js +616 -0
  254. package/src/lib/mcp-host-recovery-runtime.js +131 -0
  255. package/src/lib/mcp-ledger-recovery-admission.js +1065 -0
  256. package/src/lib/mcp-recovery-adjudication.js +443 -0
  257. package/src/lib/output-context.js +86 -0
  258. package/src/lib/packer/file-identity.js +170 -0
  259. package/src/lib/packer/index.js +3 -0
  260. package/src/lib/packer/native-update-state.js +277 -0
  261. package/src/lib/packer/pack-update-applier.js +1983 -136
  262. package/src/lib/packer/pack-update-checker.js +34 -0
  263. package/src/lib/packer/pack-update-downloader.js +875 -86
  264. package/src/lib/packer/pack-update-signature.js +86 -0
  265. package/src/lib/packer/pkg-config-generator.js +6 -0
  266. package/src/lib/paths.js +65 -10
  267. package/src/lib/plan-mode.js +831 -14
  268. package/src/lib/plan-persistence.js +540 -0
  269. package/src/lib/plugin-runtime/hooks.js +227 -69
  270. package/src/lib/plugin-runtime/plugin-options.js +189 -44
  271. package/src/lib/pr-automation-policy.js +146 -8
  272. package/src/lib/process-execution-broker/credential-agent.js +7 -0
  273. package/src/lib/process-execution-broker/index.js +491 -13
  274. package/src/lib/process-execution-broker/linux-generic-bwrap-runtime.js +28 -1
  275. package/src/lib/process-execution-broker/linux-generic-bwrap.js +28 -4
  276. package/src/lib/process-execution-broker/platform-sandbox.js +92 -70
  277. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  278. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  279. package/src/lib/process-execution-broker/windows-sandbox.cs +284 -19
  280. package/src/lib/process-execution-broker/workspace-transaction.js +4459 -0
  281. package/src/lib/project-instructions.js +165 -29
  282. package/src/lib/project-mcp-trust.js +67 -0
  283. package/src/lib/public-ide-capability-manifest.js +272 -0
  284. package/src/lib/public-ide-capability-validation.js +351 -0
  285. package/src/lib/secret-store.js +267 -43
  286. package/src/lib/secure-file-identity.js +433 -0
  287. package/src/lib/secure-fs.js +1089 -0
  288. package/src/lib/security-audit.js +58 -0
  289. package/src/lib/service-manager.js +34 -13
  290. package/src/lib/session-budget-runtime.js +1452 -0
  291. package/src/lib/session-host-snapshot.js +388 -0
  292. package/src/lib/session-message-provenance.js +429 -0
  293. package/src/lib/session-projection.js +804 -0
  294. package/src/lib/session-resource-budget.js +1495 -0
  295. package/src/lib/settings-hooks.cjs +138 -22
  296. package/src/lib/settings-loader.cjs +25 -2
  297. package/src/lib/side-effect-ledger-store.js +45 -23
  298. package/src/lib/skill-execution-identity.js +217 -0
  299. package/src/lib/skill-loader.js +299 -18
  300. package/src/lib/sub-agent-context.js +236 -28
  301. package/src/lib/sub-agent-registry.js +5 -0
  302. package/src/lib/subagent-contract.js +94 -0
  303. package/src/lib/todo-manager.js +185 -18
  304. package/src/lib/todo-persistence.js +417 -0
  305. package/src/lib/turn-binding-store.js +41 -23
  306. package/src/lib/turn-binding.js +160 -2
  307. package/src/lib/with-file-lock.js +165 -24
  308. package/src/lib/ws-chat-handler.js +21 -0
  309. package/src/program-base.js +18 -0
  310. package/src/repl/advisor-command.js +103 -0
  311. package/src/repl/agent-repl.js +2175 -146
  312. package/src/repl/btw-command.js +93 -10
  313. package/src/repl/clipboard-image.js +119 -0
  314. package/src/repl/config-summary.js +64 -108
  315. package/src/repl/prompt-editor.js +233 -0
  316. package/src/repl/prompt-interactions.js +344 -0
  317. package/src/repl/prompt-stash.js +354 -0
  318. package/src/repl/prompt-suggestions.js +312 -0
  319. package/src/repl/repl-keybindings.js +227 -0
  320. package/src/repl/session-recap.js +217 -0
  321. package/src/repl/slash-command-registry.js +22 -0
  322. package/src/repl/terminal-layout.js +88 -0
  323. package/src/runtime/agent-core.js +1630 -447
  324. package/src/runtime/coding-agent-contract-shared.cjs +13 -1
  325. package/src/runtime/coding-agent-managed-tool-policy.cjs +7 -2
  326. package/src/runtime/diagnostics.js +32 -13
  327. package/src/runtime/headless-runner.js +310 -118
  328. package/src/runtime/headless-stream.js +356 -95
  329. package/src/runtime/mcp-config.js +148 -14
  330. package/src/runtime/policies/agent-policy.js +14 -0
  331. package/src/runtime/status-diagnostics-lite.js +137 -0
  332. package/src/assets/web-panel/assets/MarkdownRenderer-7iWGwZ-r.js +0 -1
  333. package/src/assets/web-panel/assets/OrderTableRenderer-BU2Yqq5H.js +0 -1
  334. package/src/assets/web-panel/assets/PdhVaultBrowser-69ca_WeR.js +0 -7
  335. package/src/assets/web-panel/assets/devWarning-B4dXIJqD.js +0 -1
  336. package/src/assets/web-panel/assets/index-C-C7DaG6.js +0 -1
  337. package/src/assets/web-panel/assets/index-DkfWzWtd.js +0 -1
@@ -0,0 +1,522 @@
1
+ /**
2
+ * Pure planning/validation for CLI-authoritative checkpoint timeline actions.
3
+ * Hosts may display the preview, but only the CLI commits the returned plan.
4
+ */
5
+
6
+ import { createHash } from "node:crypto";
7
+ import {
8
+ CHECKPOINT_TIMELINE_ACTIONS,
9
+ CHECKPOINT_TIMELINE_ACTION_SCHEMA,
10
+ CHECKPOINT_TIMELINE_ACTION_VERSION,
11
+ resolveCheckpointTimelineAction,
12
+ } from "./checkpoint-timeline.js";
13
+ import { planSessionBranch } from "./session-branch.js";
14
+ import {
15
+ buildExtractiveHandoff,
16
+ formatStructuredHandoff,
17
+ } from "../harness/structured-handoff.js";
18
+ import {
19
+ DURABLE_SYSTEM_MESSAGE_KINDS,
20
+ getDurableSystemMessageProvenance,
21
+ markDurableSystemMessage,
22
+ projectCanonicalResumeMessages,
23
+ } from "./session-message-provenance.js";
24
+
25
+ export const CHECKPOINT_TIMELINE_RESULT_SCHEMA =
26
+ "cc-checkpoint-timeline-result/v1";
27
+ export const CHECKPOINT_TIMELINE_RESULT_VERSION = 1;
28
+ export const CHECKPOINT_TIMELINE_CONFIRMATION_SCHEMA =
29
+ "cc-checkpoint-timeline-confirmation/v1";
30
+ export const CHECKPOINT_TIMELINE_CONFIRMATION_VERSION = 1;
31
+ export const CHECKPOINT_WORKSPACE_BINDING_SCHEMA =
32
+ "cc-checkpoint-workspace-binding/v1";
33
+ export const CHECKPOINT_WORKSPACE_BINDING_VERSION = 1;
34
+ export const CHECKPOINT_TIMELINE_INTENT_EVENT =
35
+ "checkpoint_timeline_action_intent";
36
+ export const CHECKPOINT_TIMELINE_AUDIT_EVENT = "checkpoint_timeline_action";
37
+ export const CHECKPOINT_RESTORE_RECOVERY_RESOLUTION_EVENT =
38
+ "checkpoint_restore_recovery_resolution";
39
+
40
+ function canonical(value) {
41
+ if (value == null || typeof value !== "object") return value;
42
+ if (Array.isArray(value)) return value.map(canonical);
43
+ const out = {};
44
+ for (const key of Object.keys(value).sort()) out[key] = canonical(value[key]);
45
+ return out;
46
+ }
47
+
48
+ function sameEnvelope(left, right) {
49
+ return JSON.stringify(canonical(left)) === JSON.stringify(canonical(right));
50
+ }
51
+
52
+ function digestEnvelope(value) {
53
+ return `sha256:${createHash("sha256")
54
+ .update(JSON.stringify(canonical(value)), "utf8")
55
+ .digest("hex")}`;
56
+ }
57
+
58
+ function exactKeys(value, expected) {
59
+ return (
60
+ value &&
61
+ typeof value === "object" &&
62
+ !Array.isArray(value) &&
63
+ sameEnvelope(Object.keys(value).sort(), [...expected].sort())
64
+ );
65
+ }
66
+
67
+ function isCodeRestore(action) {
68
+ return (
69
+ action === CHECKPOINT_TIMELINE_ACTIONS.RESTORE_CODE ||
70
+ action === CHECKPOINT_TIMELINE_ACTIONS.RESTORE_BOTH
71
+ );
72
+ }
73
+
74
+ function publicWorkspaceBinding(value) {
75
+ if (
76
+ !value ||
77
+ typeof value !== "object" ||
78
+ Array.isArray(value) ||
79
+ value.schema !== CHECKPOINT_WORKSPACE_BINDING_SCHEMA ||
80
+ value.version !== CHECKPOINT_WORKSPACE_BINDING_VERSION ||
81
+ !["git", "copy"].includes(value.engine) ||
82
+ !/^sha256:[a-f0-9]{64}$/.test(value.scopeIdentity || "") ||
83
+ !/^sha256:[a-f0-9]{64}$/.test(value.writePlanIdentity || "")
84
+ ) {
85
+ return null;
86
+ }
87
+ const gitTree = /^git-tree:(?:[a-f0-9]{40}|[a-f0-9]{64})$/;
88
+ const copyState = /^sha256:[a-f0-9]{64}$/;
89
+ const statePattern = value.engine === "git" ? gitTree : copyState;
90
+ if (
91
+ !statePattern.test(value.prestateIdentity || "") ||
92
+ !statePattern.test(value.targetPoststateIdentity || "")
93
+ ) {
94
+ return null;
95
+ }
96
+ return {
97
+ schema: CHECKPOINT_WORKSPACE_BINDING_SCHEMA,
98
+ version: CHECKPOINT_WORKSPACE_BINDING_VERSION,
99
+ engine: value.engine,
100
+ scopeIdentity: value.scopeIdentity,
101
+ prestateIdentity: value.prestateIdentity,
102
+ writePlanIdentity: value.writePlanIdentity,
103
+ targetPoststateIdentity: value.targetPoststateIdentity,
104
+ };
105
+ }
106
+
107
+ export function buildCheckpointTimelineConfirmationSubmission(
108
+ submission,
109
+ workspaceBinding = null,
110
+ ) {
111
+ const workspace = workspaceBinding
112
+ ? publicWorkspaceBinding(workspaceBinding)
113
+ : null;
114
+ if (isCodeRestore(submission?.action) && !workspace) return null;
115
+ if (!isCodeRestore(submission?.action) && workspace) return null;
116
+ const body = {
117
+ schema: CHECKPOINT_TIMELINE_CONFIRMATION_SCHEMA,
118
+ version: CHECKPOINT_TIMELINE_CONFIRMATION_VERSION,
119
+ authority: "cli",
120
+ submission: canonical(submission),
121
+ workspace,
122
+ };
123
+ return { ...body, digest: digestEnvelope(body) };
124
+ }
125
+
126
+ export function validateCheckpointTimelineConfirmationSubmission(
127
+ timeline,
128
+ confirmation,
129
+ ) {
130
+ if (
131
+ !exactKeys(confirmation, [
132
+ "schema",
133
+ "version",
134
+ "authority",
135
+ "submission",
136
+ "workspace",
137
+ "digest",
138
+ ]) ||
139
+ confirmation.schema !== CHECKPOINT_TIMELINE_CONFIRMATION_SCHEMA ||
140
+ confirmation.version !== CHECKPOINT_TIMELINE_CONFIRMATION_VERSION ||
141
+ confirmation.authority !== "cli" ||
142
+ !/^sha256:[a-f0-9]{64}$/.test(confirmation.digest || "")
143
+ ) {
144
+ return { ok: false, code: "TIMELINE_PREVIEW_REQUIRED" };
145
+ }
146
+ const validation = validateCheckpointTimelineSubmission(
147
+ timeline,
148
+ confirmation.submission,
149
+ );
150
+ if (!validation.ok) return validation;
151
+ const workspace = confirmation.workspace
152
+ ? publicWorkspaceBinding(confirmation.workspace)
153
+ : null;
154
+ if (
155
+ (isCodeRestore(validation.submission.action) && !workspace) ||
156
+ (!isCodeRestore(validation.submission.action) &&
157
+ confirmation.workspace !== null) ||
158
+ (workspace && !sameEnvelope(workspace, confirmation.workspace))
159
+ ) {
160
+ return { ok: false, code: "TIMELINE_CONFIRMATION_INVALID" };
161
+ }
162
+ const expected = buildCheckpointTimelineConfirmationSubmission(
163
+ validation.submission,
164
+ workspace,
165
+ );
166
+ if (!expected || !sameEnvelope(expected, confirmation)) {
167
+ return { ok: false, code: "TIMELINE_CONFIRMATION_INVALID" };
168
+ }
169
+ return {
170
+ ok: true,
171
+ entry: validation.entry,
172
+ submission: validation.submission,
173
+ workspace,
174
+ confirmation: expected,
175
+ };
176
+ }
177
+
178
+ export function checkpointTimelineConfirmationsMatch(left, right) {
179
+ return sameEnvelope(left, right);
180
+ }
181
+
182
+ export function validateCheckpointTimelineSubmission(timeline, submission) {
183
+ if (
184
+ !submission ||
185
+ typeof submission !== "object" ||
186
+ Array.isArray(submission) ||
187
+ submission.schema !== CHECKPOINT_TIMELINE_ACTION_SCHEMA ||
188
+ submission.version !== CHECKPOINT_TIMELINE_ACTION_VERSION ||
189
+ submission.authority !== "cli"
190
+ ) {
191
+ return { ok: false, code: "TIMELINE_SUBMISSION_INVALID" };
192
+ }
193
+ if (
194
+ typeof timeline?.revision !== "string" ||
195
+ submission.revision !== timeline.revision
196
+ ) {
197
+ return {
198
+ ok: false,
199
+ code: "TIMELINE_STALE",
200
+ expectedRevision: timeline?.revision || null,
201
+ submittedRevision: submission.revision || null,
202
+ };
203
+ }
204
+ const resolved = resolveCheckpointTimelineAction(
205
+ timeline,
206
+ submission.turnId,
207
+ submission.action,
208
+ );
209
+ if (!resolved.ok) return resolved;
210
+ const expectedCheckpointIdentity =
211
+ resolved.submission.checkpointIdentity || null;
212
+ const submittedCheckpointIdentity = submission.checkpointIdentity || null;
213
+ if (expectedCheckpointIdentity !== submittedCheckpointIdentity) {
214
+ return {
215
+ ok: false,
216
+ code: "TIMELINE_STALE",
217
+ expectedCheckpointIdentity,
218
+ submittedCheckpointIdentity,
219
+ };
220
+ }
221
+ if (!sameEnvelope(resolved.submission, submission)) {
222
+ return { ok: false, code: "TIMELINE_SUBMISSION_INVALID" };
223
+ }
224
+ const entry = timeline.entries.find(
225
+ (candidate) => candidate.turnId === submission.turnId,
226
+ );
227
+ return { ok: true, entry, submission: resolved.submission };
228
+ }
229
+
230
+ function userAnchor(messages, offset) {
231
+ const list = Array.isArray(messages) ? messages : [];
232
+ const numeric = Number(offset);
233
+ if (!Number.isSafeInteger(numeric) || numeric < 1) return null;
234
+ const candidates =
235
+ list[0]?.role === "system"
236
+ ? [numeric - 1, numeric - 2]
237
+ : [numeric - 2, numeric - 1];
238
+ for (const index of candidates) {
239
+ if (index >= 0 && index < list.length && list[index]?.role === "user") {
240
+ return index;
241
+ }
242
+ }
243
+ return null;
244
+ }
245
+
246
+ function summaryMessage(messages, action, turnId) {
247
+ const handoff = buildExtractiveHandoff(messages, {
248
+ maxFallbackSourceChars: 24_000,
249
+ });
250
+ return markDurableSystemMessage(
251
+ {
252
+ role: "system",
253
+ content:
254
+ `[Conversation Summary: ${action} ${turnId}]\n` +
255
+ formatStructuredHandoff(handoff),
256
+ },
257
+ DURABLE_SYSTEM_MESSAGE_KINDS.CHECKPOINT_SUMMARY,
258
+ );
259
+ }
260
+
261
+ function codePreviewShape(value, checkpointId) {
262
+ const data = value && typeof value === "object" ? value : {};
263
+ const source = (key) => (Array.isArray(data[key]) ? data[key] : []);
264
+ const list = (key) =>
265
+ source(key)
266
+ .slice(0, 256)
267
+ .map((item) =>
268
+ typeof item === "string" ? item : String(item?.rel || ""),
269
+ )
270
+ .filter(Boolean);
271
+ const counts = {
272
+ modified: source("modified").length,
273
+ added: source("added").length,
274
+ deleted: source("deleted").length,
275
+ };
276
+ return {
277
+ checkpointId: checkpointId || null,
278
+ modified: list("modified"),
279
+ added: list("added"),
280
+ deleted: list("deleted"),
281
+ summary: {
282
+ ...counts,
283
+ total: counts.modified + counts.added + counts.deleted,
284
+ truncated:
285
+ counts.modified > 256 || counts.added > 256 || counts.deleted > 256,
286
+ },
287
+ };
288
+ }
289
+
290
+ /** Build the exact preview and internal commit plan from current CLI state. */
291
+ export function planCheckpointTimelineAction({
292
+ timeline,
293
+ submission,
294
+ messages = [],
295
+ codePreview = null,
296
+ } = {}) {
297
+ const validation = validateCheckpointTimelineSubmission(timeline, submission);
298
+ if (!validation.ok) return validation;
299
+
300
+ const { entry } = validation;
301
+ const action = submission.action;
302
+ const needsConversation = action !== CHECKPOINT_TIMELINE_ACTIONS.RESTORE_CODE;
303
+ const anchor = needsConversation
304
+ ? userAnchor(messages, submission.conversationOffset)
305
+ : null;
306
+ if (needsConversation && anchor == null) {
307
+ return {
308
+ ok: false,
309
+ code: "TIMELINE_CONVERSATION_ANCHOR_STALE",
310
+ expectedRevision: timeline.revision,
311
+ };
312
+ }
313
+
314
+ const preview = {
315
+ schema: CHECKPOINT_TIMELINE_RESULT_SCHEMA,
316
+ version: CHECKPOINT_TIMELINE_RESULT_VERSION,
317
+ ok: true,
318
+ mode: "preview",
319
+ action,
320
+ sessionId: timeline.sessionId,
321
+ turnId: entry.turnId,
322
+ revision: timeline.revision,
323
+ coverage: entry.coverage,
324
+ excludedPaths: [...(entry.excludedPaths || [])],
325
+ irreversibleSideEffects: [...(entry.irreversibleSideEffects || [])],
326
+ warnings: [...(entry.warnings || [])],
327
+ confirmationRequired: true,
328
+ code:
329
+ action === CHECKPOINT_TIMELINE_ACTIONS.RESTORE_CODE ||
330
+ action === CHECKPOINT_TIMELINE_ACTIONS.RESTORE_BOTH
331
+ ? codePreviewShape(codePreview, submission.checkpointId)
332
+ : null,
333
+ conversation: null,
334
+ branch: null,
335
+ };
336
+ const commit = {
337
+ action,
338
+ turnId: entry.turnId,
339
+ messages: null,
340
+ bindingPruneOffset: null,
341
+ branchPlan: null,
342
+ };
343
+
344
+ if (action === CHECKPOINT_TIMELINE_ACTIONS.RESTORE_CONVERSATION) {
345
+ commit.messages = messages.slice(0, anchor);
346
+ commit.bindingPruneOffset = submission.conversationOffset;
347
+ } else if (action === CHECKPOINT_TIMELINE_ACTIONS.RESTORE_BOTH) {
348
+ commit.messages = messages.slice(0, anchor);
349
+ commit.bindingPruneOffset = submission.conversationOffset;
350
+ } else if (action === CHECKPOINT_TIMELINE_ACTIONS.SUMMARY_FROM) {
351
+ const selected = messages.slice(anchor);
352
+ commit.messages = [
353
+ ...messages.slice(0, anchor),
354
+ summaryMessage(selected, action, entry.turnId),
355
+ ];
356
+ commit.bindingPruneOffset = submission.conversationOffset;
357
+ } else if (action === CHECKPOINT_TIMELINE_ACTIONS.SUMMARY_TO) {
358
+ const entryIndex = timeline.entries.indexOf(entry);
359
+ const next = timeline.entries[entryIndex + 1];
360
+ const nextAnchor = next
361
+ ? userAnchor(messages, next.conversationOffset)
362
+ : messages.length;
363
+ if (nextAnchor == null || nextAnchor <= 0) {
364
+ return { ok: false, code: "TIMELINE_CONVERSATION_ANCHOR_STALE" };
365
+ }
366
+ const systemCount = messages[0]?.role === "system" ? 1 : 0;
367
+ const prefix = messages.slice(systemCount, nextAnchor);
368
+ let canonicalPrefix;
369
+ try {
370
+ canonicalPrefix = projectCanonicalResumeMessages(prefix, {
371
+ strict: true,
372
+ });
373
+ } catch {
374
+ return { ok: false, code: "TIMELINE_CONVERSATION_INVALID" };
375
+ }
376
+ const durableSystems = canonicalPrefix.filter((message) =>
377
+ Boolean(getDurableSystemMessageProvenance(message)),
378
+ );
379
+ // The first system is the current host-owned prompt and stays in place.
380
+ // Other systems survive the rewrite only with runtime provenance. An
381
+ // unmarked verified event must neither survive nor be quoted into the new
382
+ // durable summary, otherwise SUMMARY_TO would bless it on persistence.
383
+ const selected = canonicalPrefix.filter(
384
+ (message) => message.role !== "system",
385
+ );
386
+ commit.messages = [
387
+ ...messages.slice(0, systemCount),
388
+ ...durableSystems,
389
+ summaryMessage(selected, action, entry.turnId),
390
+ ...messages.slice(nextAnchor),
391
+ ];
392
+ // Every surviving later offset shifts when a prefix is summarized.
393
+ commit.bindingPruneOffset = 0;
394
+ } else if (action === CHECKPOINT_TIMELINE_ACTIONS.BRANCH) {
395
+ commit.branchPlan = planSessionBranch({
396
+ parentSessionId: timeline.sessionId,
397
+ turn: {
398
+ turnId: entry.turnId,
399
+ conversationOffset: submission.conversationOffset,
400
+ fileCheckpointId: submission.checkpointId,
401
+ coverage: entry.coverage,
402
+ },
403
+ });
404
+ commit.messages = messages.slice(0, anchor);
405
+ preview.branch = {
406
+ branchSessionId: commit.branchPlan.branchSessionId,
407
+ preservesParent: true,
408
+ requiresWorktree: commit.branchPlan.requiresWorktree,
409
+ warnings: [...commit.branchPlan.warnings],
410
+ };
411
+ }
412
+
413
+ if (commit.messages) {
414
+ preview.conversation = {
415
+ beforeMessages: messages.length,
416
+ afterMessages: commit.messages.length,
417
+ affectedMessages: Math.max(0, messages.length - anchor),
418
+ };
419
+ }
420
+ const workspaceBinding = isCodeRestore(action)
421
+ ? codePreview?.workspaceBinding || null
422
+ : null;
423
+ const publicBinding = workspaceBinding
424
+ ? publicWorkspaceBinding(workspaceBinding)
425
+ : null;
426
+ const confirmationSubmission = buildCheckpointTimelineConfirmationSubmission(
427
+ validation.submission,
428
+ publicBinding,
429
+ );
430
+ if (!confirmationSubmission) {
431
+ return { ok: false, code: "TIMELINE_WORKSPACE_BINDING_INVALID" };
432
+ }
433
+ preview.confirmationSubmission = confirmationSubmission;
434
+ return {
435
+ ok: true,
436
+ preview,
437
+ commit,
438
+ submission: validation.submission,
439
+ workspaceBinding,
440
+ };
441
+ }
442
+
443
+ export function timelineActionError(error) {
444
+ const checkpointRestoreError =
445
+ error?.checkpointRestoreCause ||
446
+ error?.cause?.checkpointRestoreCause ||
447
+ null;
448
+ const operationError = checkpointRestoreError
449
+ ? checkpointRestoreError.transactionError || checkpointRestoreError
450
+ : error?.transactionError || null;
451
+ const recoveryError = operationError || checkpointRestoreError || error;
452
+ const sagaError = checkpointRestoreError || error;
453
+ const retainedRecoveryCandidate =
454
+ error?.transactionRecoveryEvidence ||
455
+ checkpointRestoreError?.transactionRecoveryEvidence ||
456
+ checkpointRestoreError?.transactionError?.transactionRecoveryEvidence ||
457
+ null;
458
+ const retainedRecovery =
459
+ retainedRecoveryCandidate &&
460
+ typeof retainedRecoveryCandidate === "object" &&
461
+ !Array.isArray(retainedRecoveryCandidate)
462
+ ? retainedRecoveryCandidate
463
+ : null;
464
+ const auditError =
465
+ operationError?.checkpointAuditError || error?.checkpointAuditError || null;
466
+ const createdPaths = Array.isArray(recoveryError?.createdPaths)
467
+ ? recoveryError.createdPaths
468
+ : Array.isArray(retainedRecovery?.createdPaths)
469
+ ? retainedRecovery.createdPaths
470
+ : [];
471
+ return {
472
+ schema: CHECKPOINT_TIMELINE_RESULT_SCHEMA,
473
+ version: CHECKPOINT_TIMELINE_RESULT_VERSION,
474
+ ok: false,
475
+ code:
476
+ error?.code === "SESSION_REVISION_STALE"
477
+ ? "TIMELINE_STALE"
478
+ : error?.code === "CHECKPOINT_WORKSPACE_STALE"
479
+ ? "TIMELINE_WORKSPACE_STALE"
480
+ : error?.code || "TIMELINE_ACTION_FAILED",
481
+ error: error?.message || String(error || "timeline action failed"),
482
+ commitState:
483
+ error?.commitState ||
484
+ checkpointRestoreError?.commitState ||
485
+ operationError?.commitState ||
486
+ null,
487
+ operationFailureCode: operationError?.code || null,
488
+ auditFailureCode: auditError?.code || null,
489
+ restorePhase:
490
+ recoveryError?.restorePhase || retainedRecovery?.restorePhase || null,
491
+ safetyCheckpointId:
492
+ recoveryError?.safetyId || retainedRecovery?.safetyId || null,
493
+ safetyCheckpointIdentity:
494
+ recoveryError?.safetyIdentity || retainedRecovery?.safetyIdentity || null,
495
+ safetyCoverage:
496
+ recoveryError?.safetyCoverage || retainedRecovery?.safetyCoverage || null,
497
+ safetyPlanIdentity:
498
+ recoveryError?.safetyPlanIdentity ||
499
+ retainedRecovery?.safetyPlanIdentity ||
500
+ null,
501
+ branchSessionId:
502
+ recoveryError?.branchSessionId ||
503
+ retainedRecovery?.branchSessionId ||
504
+ null,
505
+ createdPaths: createdPaths.slice(0, 256),
506
+ operationId:
507
+ sagaError?.checkpointRestoreOperationId || error?.operationId || null,
508
+ blockingOperationId:
509
+ error?.ownerTransactionId ||
510
+ error?.retainedOwner?.transactionId ||
511
+ error?.priorOwner?.transactionId ||
512
+ null,
513
+ sagaPhase: sagaError?.checkpointRestoreSagaPhase || null,
514
+ sagaSeq: sagaError?.checkpointRestoreSagaSeq || null,
515
+ sagaHeadHash: sagaError?.checkpointRestoreSagaHeadHash || null,
516
+ recoveryRequired: Boolean(
517
+ sagaError?.checkpointRestoreRecoveryRequired ||
518
+ error?.workspaceLockRetained,
519
+ ),
520
+ workspaceLockRetained: error?.workspaceLockRetained === true,
521
+ };
522
+ }