chainlesschain 0.162.189 → 0.162.197

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 (317) hide show
  1. package/README.md +84 -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-DbZft8w0.js → AIOps-D3Gu1a5d.js} +1 -1
  9. package/src/assets/web-panel/assets/{ActionButton-DoOZpwfN.js → ActionButton-DrwAoKaz.js} +1 -1
  10. package/src/assets/web-panel/assets/{Analytics-B0J0KLTW.js → Analytics-C7Q-gd_3.js} +3 -3
  11. package/src/assets/web-panel/assets/{AppLayout-D9eIR0qq.js → AppLayout-DgBtae-n.js} +4 -4
  12. package/src/assets/web-panel/assets/{Artifacts-BnZXEVeo.js → Artifacts-pQ6LcA-W.js} +1 -1
  13. package/src/assets/web-panel/assets/{Audit-X1ce4Bjn.js → Audit-DK61tocB.js} +1 -1
  14. package/src/assets/web-panel/assets/{BackgroundAgents-BvWR-y5v.js → BackgroundAgents-BOKgDFRh.js} +1 -1
  15. package/src/assets/web-panel/assets/{Backup-BublSGEd.js → Backup-Bo9G4vTP.js} +1 -1
  16. package/src/assets/web-panel/assets/{BaseInput-CR_77Hso.js → BaseInput-Do_dE9_v.js} +1 -1
  17. package/src/assets/web-panel/assets/{Chat-DixW52tq.js → Chat-COVvZzOL.js} +6 -6
  18. package/src/assets/web-panel/assets/ChatBubbleRenderer-BUUyJ5QO.js +1 -0
  19. package/src/assets/web-panel/assets/{Checkbox-CCv1C87K.js → Checkbox-Z9MJMolt.js} +1 -1
  20. package/src/assets/web-panel/assets/{Codegen-B03Cc3dd.js → Codegen-BVzWKVbf.js} +1 -1
  21. package/src/assets/web-panel/assets/{Col-CA06-6pU.js → Col-C8MnYcbT.js} +1 -1
  22. package/src/assets/web-panel/assets/{Community-Bj881J52.js → Community-DQxqw15l.js} +1 -1
  23. package/src/assets/web-panel/assets/{Compact-UZLTPoaL.js → Compact-BAUmrh3y.js} +1 -1
  24. package/src/assets/web-panel/assets/{Compliance-kGwzRb_0.js → Compliance-jPAkQ3zK.js} +1 -1
  25. package/src/assets/web-panel/assets/{Cowork-KundoYM8.js → Cowork-BBQyxbh8.js} +2 -2
  26. package/src/assets/web-panel/assets/{Cron-BYZyoqDe.js → Cron-W5koq8Z5.js} +2 -2
  27. package/src/assets/web-panel/assets/{Crosschain-BhrrppBX.js → Crosschain-BQhnu5hS.js} +1 -1
  28. package/src/assets/web-panel/assets/{DID-CdC6EguZ.js → DID-DD7PlI18.js} +2 -2
  29. package/src/assets/web-panel/assets/{Dashboard-CcQx3J4y.js → Dashboard-w_ILuwKI.js} +2 -2
  30. package/src/assets/web-panel/assets/{Dropdown-BpijtEzQ.js → Dropdown-qiDUAyAo.js} +1 -1
  31. package/src/assets/web-panel/assets/{EmailListRenderer-DfZjeZTe.js → EmailListRenderer-PDeBcI5H.js} +1 -1
  32. package/src/assets/web-panel/assets/{FamilyGuardDashboard-BFYSf69C.js → FamilyGuardDashboard-SuArscRM.js} +1 -1
  33. package/src/assets/web-panel/assets/{Federation-Okdi3pJm.js → Federation-BCovZaUn.js} +1 -1
  34. package/src/assets/web-panel/assets/{FormItemContext-mH-HebKW.js → FormItemContext-DjlFdVFk.js} +1 -1
  35. package/src/assets/web-panel/assets/{GenericCardRenderer-xivV69x7.js → GenericCardRenderer-DoEZ7fcS.js} +1 -1
  36. package/src/assets/web-panel/assets/{Git-1rh_YBwg.js → Git-CV0-6GPI.js} +2 -2
  37. package/src/assets/web-panel/assets/{Governance-eAXkNxdY.js → Governance-B_SFN50w.js} +1 -1
  38. package/src/assets/web-panel/assets/{Inference-CS6dMVTN.js → Inference-heI0Eo6k.js} +1 -1
  39. package/src/assets/web-panel/assets/{KnowledgeGraph-Bq_TnkvD.js → KnowledgeGraph-Cz5INS5p.js} +1 -1
  40. package/src/assets/web-panel/assets/{Logs-KchHtiHt.js → Logs-BSFxiHkg.js} +2 -2
  41. package/src/assets/web-panel/assets/MarkdownRenderer-1mNozZ8v.js +1 -0
  42. package/src/assets/web-panel/assets/{Marketplace-CsmGcX5X.js → Marketplace-0TWTpE7k.js} +1 -1
  43. package/src/assets/web-panel/assets/{McpTools-BaPFnnyz.js → McpTools-CV4-wBLm.js} +4 -4
  44. package/src/assets/web-panel/assets/{Memory-2m-sUUf7.js → Memory-x5bH5rw5.js} +2 -2
  45. package/src/assets/web-panel/assets/{MobileBridge-D5nVZBRu.js → MobileBridge-DaBmUu9G.js} +1 -1
  46. package/src/assets/web-panel/assets/{MobileProjects-Bo8MLZvT.js → MobileProjects-DqnoFPgR.js} +1 -1
  47. package/src/assets/web-panel/assets/{Mtc-3GDvamGa.js → Mtc-B_zKEBif.js} +4 -4
  48. package/src/assets/web-panel/assets/{MtcAudit-D2zGuZCH.js → MtcAudit-BCfKD2yg.js} +4 -4
  49. package/src/assets/web-panel/assets/{Multisig-BBVQ4t6t.js → Multisig-DgYfj6c_.js} +3 -3
  50. package/src/assets/web-panel/assets/{NLProgramming-BIOCyOGp.js → NLProgramming-Dz09lFUm.js} +1 -1
  51. package/src/assets/web-panel/assets/{Notes-DVwBGpzc.js → Notes-Cuj6ugBE.js} +3 -3
  52. package/src/assets/web-panel/assets/{NotificationSettings-BDnHfIfX.js → NotificationSettings-DK2WXjhg.js} +1 -1
  53. package/src/assets/web-panel/assets/{OrderTableRenderer-C7Ek20ag.js → OrderTableRenderer-D1IAOQoo.js} +1 -1
  54. package/src/assets/web-panel/assets/{Organization-D3SRKaa7.js → Organization-9fqnPvTw.js} +4 -4
  55. package/src/assets/web-panel/assets/{Overflow-C2B8ahyn.js → Overflow-n5xHkhow.js} +1 -1
  56. package/src/assets/web-panel/assets/{P2P-2iwQzG65.js → P2P-B5AUWwH-.js} +2 -2
  57. package/src/assets/web-panel/assets/{PdhVaultBrowser-CoPiWqMN.js → PdhVaultBrowser-CoUDV6dy.js} +4 -4
  58. package/src/assets/web-panel/assets/{Permissions-yV5XNXo5.js → Permissions-DPRmQf_H.js} +4 -4
  59. package/src/assets/web-panel/assets/{PersonalDataHub-uCDJhMUF.js → PersonalDataHub-B37bsbEN.js} +4 -4
  60. package/src/assets/web-panel/assets/{Pipeline-hN7ucMOA.js → Pipeline-CCAuPqu9.js} +1 -1
  61. package/src/assets/web-panel/assets/{Privacy-CgU0ptN4.js → Privacy-B81msZdv.js} +1 -1
  62. package/src/assets/web-panel/assets/{ProjectInit-CfYPiT6j.js → ProjectInit-B-Py2NbF.js} +2 -2
  63. package/src/assets/web-panel/assets/{ProjectSettings-B0A2C4nw.js → ProjectSettings-CYsneiRB.js} +2 -2
  64. package/src/assets/web-panel/assets/{Projects-BE5C0ajn.js → Projects-Y975Mh6R.js} +1 -1
  65. package/src/assets/web-panel/assets/{Providers-CstQPf8W.js → Providers-uO-10aP1.js} +1 -1
  66. package/src/assets/web-panel/assets/{QrScannerModal-Co3z_ynk.js → QrScannerModal-Bj_6gJ0l.js} +1 -1
  67. package/src/assets/web-panel/assets/{QuickAsk-DMTS6pQ6.js → QuickAsk-BgpBCMPE.js} +1 -1
  68. package/src/assets/web-panel/assets/{Recommend-ETw4odUa.js → Recommend-DhUW3YUA.js} +1 -1
  69. package/src/assets/web-panel/assets/RemoteSession-DdeyfbkA.js +5 -0
  70. package/src/assets/web-panel/assets/{Reputation-BTVqQgKq.js → Reputation-fxW421xd.js} +1 -1
  71. package/src/assets/web-panel/assets/{Row-CBKKwwtO.js → Row-De73w1og.js} +1 -1
  72. package/src/assets/web-panel/assets/{RssFeed-BHUQ438I.js → RssFeed-3US_Q_lj.js} +2 -2
  73. package/src/assets/web-panel/assets/{Search-B4NqeUsF.js → Search-DbZ_DU74.js} +1 -1
  74. package/src/assets/web-panel/assets/{Security-BRjoYG5_.js → Security-DoIU1vMF.js} +4 -4
  75. package/src/assets/web-panel/assets/{Services-CxQzu3p3.js → Services-DB_RGqpc.js} +2 -2
  76. package/src/assets/web-panel/assets/{Skeleton-BKzwwmWO.js → Skeleton-DnzLaayC.js} +1 -1
  77. package/src/assets/web-panel/assets/{Skills-DrsFcgth.js → Skills-VzVXHENF.js} +1 -1
  78. package/src/assets/web-panel/assets/{Sla-D21tmXCH.js → Sla-DMfvjCAI.js} +1 -1
  79. package/src/assets/web-panel/assets/{SpeechSettings-CjyjLfp8.js → SpeechSettings-DQQOYWbF.js} +1 -1
  80. package/src/assets/web-panel/assets/{SyncSettings-Cu45-tnx.js → SyncSettings-Bmx3FG1P.js} +2 -2
  81. package/src/assets/web-panel/assets/{Tasks-oMcILYOj.js → Tasks-DOQyfb-2.js} +1 -1
  82. package/src/assets/web-panel/assets/{Templates-Bh-Zcr5R.js → Templates-D6hTRT7c.js} +1 -1
  83. package/src/assets/web-panel/assets/{Tenant-68ns63aI.js → Tenant-CTPQZAzs.js} +1 -1
  84. package/src/assets/web-panel/assets/{Terminal-BLJkFykE.js → Terminal-B7vII3oH.js} +2 -2
  85. package/src/assets/web-panel/assets/{TimelineRenderer-xcrJLq-O.js → TimelineRenderer-BkiFJeXV.js} +1 -1
  86. package/src/assets/web-panel/assets/{Tokens-C6PpFJtf.js → Tokens-BPPdQMNo.js} +1 -1
  87. package/src/assets/web-panel/assets/{Trigger-BaKA7tdM.js → Trigger-BxG8JAEI.js} +1 -1
  88. package/src/assets/web-panel/assets/{Trust-BzhA57Jc.js → Trust-DHD7nMpM.js} +1 -1
  89. package/src/assets/web-panel/assets/{UkeySign-4_U3JkIR.js → UkeySign-B4BJpU47.js} +1 -1
  90. package/src/assets/web-panel/assets/{VideoEditing-162AANxX.js → VideoEditing-CRiGpFx2.js} +1 -1
  91. package/src/assets/web-panel/assets/{Wallet-B1viuql_.js → Wallet-BSDSNiem.js} +4 -4
  92. package/src/assets/web-panel/assets/{WebAuthn-ZVWazhCy.js → WebAuthn-DLTUh5Zv.js} +5 -5
  93. package/src/assets/web-panel/assets/WorkflowEditor-tW2MwjhD.js +1 -0
  94. package/src/assets/web-panel/assets/{chat-DmrHNuwq.js → chat-SgsLQ3FC.js} +1 -1
  95. package/src/assets/web-panel/assets/{colors-DAJ_M-PK.js → colors-BHjjLIKO.js} +1 -1
  96. package/src/assets/web-panel/assets/{compact-item-uIzmYwLs.js → compact-item-VceErdKq.js} +1 -1
  97. package/src/assets/web-panel/assets/{createContext-D_ZmuLwb.js → createContext-BZ332MYl.js} +1 -1
  98. package/src/assets/web-panel/assets/devWarning-DosMaL-k.js +1 -0
  99. package/src/assets/web-panel/assets/{hasIn-CDt_shTL.js → hasIn-CBTjJOjn.js} +1 -1
  100. package/src/assets/web-panel/assets/index-0O5ePnUq.js +1 -0
  101. package/src/assets/web-panel/assets/{index-rXdwUeE3.js → index-1n7xjKDU.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BAvSmJXW.js → index-29wVzi-k.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-C16fYKFD.js → index-B2u26AS3.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-C5WcdJH2.js → index-B40dQn0G.js} +3 -3
  105. package/src/assets/web-panel/assets/{index-CaelyMgF.js → index-B5KAGxNo.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-OzTxFIJP.js → index-BC1xuQgX.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CzXqvMuP.js → index-BETEjuNr.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-clSX4PEc.js → index-BOtvPdHt.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-saf3VNeP.js → index-BPXFLYdW.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DdUMcwRB.js → index-BQSmZGgs.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DfSSy9uy.js → index-BRWhLbWF.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-GcKOHD_c.js → index-BTlc-Bve.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BHvlm0In.js → index-BY1wexYG.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Cvak6Oe2.js → index-BcUenmCX.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CKyd472S.js → index-BeiqkxJG.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DvFhhe6r.js → index-BhXZEUAc.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DBFmcaCQ.js → index-By5jBtkV.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DqDSF2RW.js → index-CLc19alH.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DeGBoLQA.js → index-CMVvxIS8.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-FyplHuNt.js → index-C_B9rFQE.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CeUpKjvi.js → index-CaIS_TNX.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-BRa4kJ_S.js → index-CawpdGTW.js} +1 -1
  123. package/src/assets/web-panel/assets/index-ChAzPigF.js +1 -0
  124. package/src/assets/web-panel/assets/{index-QsgfSZrV.js → index-CpumS98o.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BDF6EQBs.js → index-Cr4rjlW5.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-rS3gl_68.js → index-CrUgDQkf.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-D4n1lGTB.js → index-CtjLcCNU.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-ifxmu8SY.js → index-DUkVN794.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BTCXf1t-.js → index-D_SePDWj.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Bbxjfstq.js → index-DaCCy6lq.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-D9OE8B3d.js → index-DdefYBSw.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-CG0lY4h3.js → index-DePOeMDM.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-Bx4d6c1k.js → index-DgPvuIn2.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-Z8P4BexE.js → index-FJ3zC9LK.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-ByzGvpR9.js → index-_PHrIO4O.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-DwfvPe-j.js → index-fU7wNHDB.js} +1 -1
  137. package/src/assets/web-panel/assets/{index-CcZ9xJI9.js → index-iYQNU9za.js} +1 -1
  138. package/src/assets/web-panel/assets/{index-CbD_WW_6.js → index-vIXOpcjD.js} +1 -1
  139. package/src/assets/web-panel/assets/{initDefaultProps-pmfaD-aK.js → initDefaultProps-D1oZNz0D.js} +1 -1
  140. package/src/assets/web-panel/assets/{motion-CaQ2CpYF.js → motion-C8k6doMO.js} +1 -1
  141. package/src/assets/web-panel/assets/{move-CkKTqNbI.js → move-DJ4qSbYt.js} +1 -1
  142. package/src/assets/web-panel/assets/{mtc-parser-Dd4xsgRI.js → mtc-parser-CdpJD85j.js} +1 -1
  143. package/src/assets/web-panel/assets/{omit-BFuA5YEs.js → omit-B0V4slKA.js} +1 -1
  144. package/src/assets/web-panel/assets/{pickAttrs-DDfxOAJc.js → pickAttrs-Di5NiW1F.js} +1 -1
  145. package/src/assets/web-panel/assets/{placementArrow-Be595JCp.js → placementArrow-B5OMHgEM.js} +1 -1
  146. package/src/assets/web-panel/assets/{responsiveObserve-7byljUM3.js → responsiveObserve-C6U9IWql.js} +1 -1
  147. package/src/assets/web-panel/assets/{slide-CTWfOTaY.js → slide-BMyTH3rN.js} +1 -1
  148. package/src/assets/web-panel/assets/{statusUtils-CNZOuIxM.js → statusUtils-C7d6BG7Z.js} +1 -1
  149. package/src/assets/web-panel/assets/{styleChecker-DwOcBV78.js → styleChecker-CR50QnQy.js} +1 -1
  150. package/src/assets/web-panel/assets/{useFlexGapSupport-B6MNwAO9.js → useFlexGapSupport-DBEeoMb8.js} +1 -1
  151. package/src/assets/web-panel/assets/{useFs-CzyQjH9r.js → useFs-3r099cjv.js} +1 -1
  152. package/src/assets/web-panel/assets/{usePersonalDataHub-Dxh3KiVA.js → usePersonalDataHub-C5IYNdTK.js} +1 -1
  153. package/src/assets/web-panel/assets/{vnode-DVfZiS5N.js → vnode-DmEOLRHf.js} +1 -1
  154. package/src/assets/web-panel/assets/{zoom-BYme7fbY.js → zoom-DnpUiVCB.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 +1271 -175
  159. package/src/command-surface-policy.js +312 -0
  160. package/src/commands/agent.js +76 -33
  161. package/src/commands/artifacts.js +400 -2
  162. package/src/commands/background-session.js +41 -3
  163. package/src/commands/checkpoint-restore-recovery.js +1476 -0
  164. package/src/commands/checkpoint.js +947 -22
  165. package/src/commands/compact.js +101 -25
  166. package/src/commands/config.js +506 -20
  167. package/src/commands/doctor.js +4 -1
  168. package/src/commands/hub.js +1 -1
  169. package/src/commands/mcp.js +688 -24
  170. package/src/commands/pack.js +16 -2
  171. package/src/commands/plugin.js +20 -12
  172. package/src/commands/session-mcp-recovery.js +218 -0
  173. package/src/commands/session.js +470 -110
  174. package/src/commands/setup.js +36 -10
  175. package/src/commands/skill.js +181 -110
  176. package/src/commands/status.js +21 -5
  177. package/src/commands/update.js +68 -6
  178. package/src/constants.js +11 -0
  179. package/src/data/changelog.json +14 -1
  180. package/src/gateways/ws/action-protocol.js +10 -0
  181. package/src/gateways/ws/session-protocol.js +555 -27
  182. package/src/gateways/ws/ws-agent-handler.js +541 -14
  183. package/src/gateways/ws/ws-session-gateway.js +129 -22
  184. package/src/gateways/ws/ws-session-state.js +431 -0
  185. package/src/harness/background-task-manager.js +233 -36
  186. package/src/harness/jsonl-session-store.js +2551 -167
  187. package/src/harness/mcp-client.js +802 -61
  188. package/src/harness/prompt-compressor.js +227 -27
  189. package/src/harness/session-index.js +89 -38
  190. package/src/harness/session-list-index.js +254 -0
  191. package/src/harness/structured-handoff.js +410 -0
  192. package/src/lazy-dispatch.js +747 -84
  193. package/src/lib/__tests__/logger.test.js +50 -2
  194. package/src/lib/advisor-runtime.js +1047 -0
  195. package/src/lib/agent-core.js +1 -0
  196. package/src/lib/agent-sandbox.js +120 -26
  197. package/src/lib/agent-session-export.js +20 -0
  198. package/src/lib/agent-team/team-runner.js +230 -8
  199. package/src/lib/artifact-store.js +131 -8
  200. package/src/lib/background-agent-supervisor.js +185 -13
  201. package/src/lib/background-interaction-journal.js +37 -9
  202. package/src/lib/background-launch-profile.js +1058 -0
  203. package/src/lib/checkpoint-restore-already-completed-controller.js +902 -0
  204. package/src/lib/checkpoint-restore-orchestrator.js +987 -0
  205. package/src/lib/checkpoint-restore-partial-rollback-controller.js +1953 -0
  206. package/src/lib/checkpoint-restore-recovery-controller.js +689 -0
  207. package/src/lib/checkpoint-restore-recovery.js +884 -0
  208. package/src/lib/checkpoint-restore-retention.js +126 -0
  209. package/src/lib/checkpoint-restore-saga.js +5079 -0
  210. package/src/lib/checkpoint-restore-session-recovery.js +1178 -0
  211. package/src/lib/checkpoint-restore-workspace-target-verifier.js +270 -0
  212. package/src/lib/checkpoint-store.js +1688 -97
  213. package/src/lib/checkpoint-timeline-authority.js +522 -0
  214. package/src/lib/checkpoint-timeline.js +642 -0
  215. package/src/lib/config-keys.js +18 -119
  216. package/src/lib/config-manager.js +446 -27
  217. package/src/lib/config-redaction.js +57 -0
  218. package/src/lib/config-schema.js +853 -0
  219. package/src/lib/cowork-mcp-tools.js +5 -0
  220. package/src/lib/cowork-task-runner.js +458 -63
  221. package/src/lib/delivery-coordinator.js +1234 -0
  222. package/src/lib/delivery-evidence.js +450 -0
  223. package/src/lib/doctor-checkup.js +199 -14
  224. package/src/lib/executable-path.js +34 -0
  225. package/src/lib/fatal-handler.js +16 -0
  226. package/src/lib/file-checkpoint.js +4909 -186
  227. package/src/lib/file-lines.js +125 -0
  228. package/src/lib/headless-config-command.js +16 -5
  229. package/src/lib/hook-runner.cjs +139 -38
  230. package/src/lib/hooks-v2-workspace-context.js +10 -0
  231. package/src/lib/impacted-gate-selector.js +424 -0
  232. package/src/lib/interaction-adapter.js +62 -0
  233. package/src/lib/jsonl-session-store.js +1 -35
  234. package/src/lib/logger.js +66 -14
  235. package/src/lib/mcp-call-ledger-store.js +1069 -0
  236. package/src/lib/mcp-call-ledger.js +747 -0
  237. package/src/lib/mcp-client.js +5 -0
  238. package/src/lib/mcp-conflict-scheduler.js +468 -0
  239. package/src/lib/mcp-effect-contract.js +102 -0
  240. package/src/lib/mcp-headers-helper-trust.js +145 -0
  241. package/src/lib/mcp-headers-helper.js +616 -0
  242. package/src/lib/mcp-host-recovery-runtime.js +131 -0
  243. package/src/lib/mcp-ledger-recovery-admission.js +1065 -0
  244. package/src/lib/mcp-recovery-adjudication.js +443 -0
  245. package/src/lib/output-context.js +86 -0
  246. package/src/lib/packer/file-identity.js +170 -0
  247. package/src/lib/packer/index.js +3 -0
  248. package/src/lib/packer/native-update-state.js +277 -0
  249. package/src/lib/packer/pack-update-applier.js +1983 -136
  250. package/src/lib/packer/pack-update-checker.js +34 -0
  251. package/src/lib/packer/pack-update-downloader.js +875 -86
  252. package/src/lib/packer/pack-update-signature.js +86 -0
  253. package/src/lib/packer/pkg-config-generator.js +6 -0
  254. package/src/lib/paths.js +65 -10
  255. package/src/lib/plan-mode.js +831 -14
  256. package/src/lib/plan-persistence.js +540 -0
  257. package/src/lib/plugin-runtime/hooks.js +227 -69
  258. package/src/lib/plugin-runtime/plugin-options.js +189 -44
  259. package/src/lib/pr-automation-policy.js +146 -8
  260. package/src/lib/process-execution-broker/credential-agent.js +7 -0
  261. package/src/lib/process-execution-broker/index.js +53 -8
  262. package/src/lib/process-execution-broker/workspace-transaction.js +976 -73
  263. package/src/lib/project-instructions.js +165 -29
  264. package/src/lib/project-mcp-trust.js +67 -0
  265. package/src/lib/public-ide-capability-manifest.js +278 -0
  266. package/src/lib/public-ide-capability-validation.js +351 -0
  267. package/src/lib/secret-store.js +267 -43
  268. package/src/lib/secure-fs.js +1089 -0
  269. package/src/lib/security-audit.js +58 -0
  270. package/src/lib/service-manager.js +34 -13
  271. package/src/lib/session-budget-runtime.js +1452 -0
  272. package/src/lib/session-host-snapshot.js +388 -0
  273. package/src/lib/session-message-provenance.js +429 -0
  274. package/src/lib/session-projection.js +804 -0
  275. package/src/lib/session-resource-budget.js +1495 -0
  276. package/src/lib/settings-hooks.cjs +138 -22
  277. package/src/lib/settings-loader.cjs +25 -2
  278. package/src/lib/side-effect-ledger-store.js +45 -23
  279. package/src/lib/skill-execution-identity.js +217 -0
  280. package/src/lib/skill-loader.js +299 -18
  281. package/src/lib/sub-agent-context.js +236 -28
  282. package/src/lib/sub-agent-registry.js +5 -0
  283. package/src/lib/subagent-contract.js +94 -0
  284. package/src/lib/todo-manager.js +185 -18
  285. package/src/lib/todo-persistence.js +417 -0
  286. package/src/lib/turn-binding-store.js +41 -23
  287. package/src/lib/with-file-lock.js +25 -1
  288. package/src/lib/ws-chat-handler.js +21 -0
  289. package/src/program-base.js +18 -0
  290. package/src/repl/advisor-command.js +103 -0
  291. package/src/repl/agent-repl.js +2332 -154
  292. package/src/repl/btw-command.js +93 -10
  293. package/src/repl/clipboard-image.js +119 -0
  294. package/src/repl/config-summary.js +64 -108
  295. package/src/repl/prompt-editor.js +233 -0
  296. package/src/repl/prompt-interactions.js +404 -0
  297. package/src/repl/prompt-stash.js +354 -0
  298. package/src/repl/prompt-suggestions.js +312 -0
  299. package/src/repl/repl-keybindings.js +227 -0
  300. package/src/repl/session-recap.js +217 -0
  301. package/src/repl/slash-command-registry.js +25 -4
  302. package/src/repl/terminal-layout.js +88 -0
  303. package/src/runtime/agent-core.js +1264 -325
  304. package/src/runtime/coding-agent-contract-shared.cjs +13 -1
  305. package/src/runtime/coding-agent-managed-tool-policy.cjs +7 -2
  306. package/src/runtime/diagnostics.js +32 -13
  307. package/src/runtime/headless-runner.js +298 -118
  308. package/src/runtime/headless-stream.js +353 -95
  309. package/src/runtime/mcp-config.js +148 -14
  310. package/src/runtime/status-diagnostics-lite.js +137 -0
  311. package/src/assets/web-panel/assets/ChatBubbleRenderer-DDHDpBBA.js +0 -1
  312. package/src/assets/web-panel/assets/MarkdownRenderer-TabqHW9B.js +0 -1
  313. package/src/assets/web-panel/assets/RemoteSession-B0rkE09d.js +0 -5
  314. package/src/assets/web-panel/assets/WorkflowEditor-tzdyUk-1.js +0 -1
  315. package/src/assets/web-panel/assets/devWarning-DIrncrV1.js +0 -1
  316. package/src/assets/web-panel/assets/index-D-Swwqld.js +0 -1
  317. package/src/assets/web-panel/assets/index-FMZAMKy8.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
+ }