chainlesschain 0.162.163 → 0.162.165

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 (220) hide show
  1. package/package.json +3 -1
  2. package/src/assets/web-panel/assets/{AIOps-BQ0kgfA1.js → AIOps-DgGZr3PR.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-Dr1MDANe.js → ActionButton-BAOgBIc_.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-CZ5vsaXW.js → Analytics-Ds4GAvNF.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-BIBga881.js → AppLayout-CoJvCkoF.js} +4 -4
  6. package/src/assets/web-panel/assets/{Artifacts-vpXHRU3u.js → Artifacts-6EgUaE1T.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-B8exuoub.js → Audit-BYie_i74.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-923evRRN.js → BackgroundAgents-D5gxOhjd.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-sr_sswlQ.js → Backup-CIsVK2pT.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-CnW-4XKT.js → BaseInput-ClorP55M.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-FZCsTZIL.js → Chat-CnhTPGGA.js} +6 -6
  12. package/src/assets/web-panel/assets/ChatBubbleRenderer-Bl1VXgwp.js +1 -0
  13. package/src/assets/web-panel/assets/{Checkbox-DFrxB59H.js → Checkbox-BRavl7TP.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-_b6WEel8.js → Codegen-BXg_ErNT.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-CkbnnZ-K.js → Col-CfDPzFPq.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-BxM_82zW.js → Community-Cgo0httP.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-DYinP45R.js → Compact-DU5JcEQM.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-DyXp3sSP.js → Compliance-DCH_TVBl.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-BEr2DhW7.js → Cowork-IGb5O2IH.js} +2 -2
  20. package/src/assets/web-panel/assets/{Cron-B-Vwo1hN.js → Cron-CPp_Xp9F.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-DbLxKddd.js → Crosschain-Cwrqklzw.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-BsQ_LFw9.js → DID-D55sBQwM.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-lVlXQHu5.js → Dashboard-CedXhGmP.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-Beo_foO7.js → Dropdown-Dm6_v3V4.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-DszHIXED.js → EmailListRenderer-CWjnuE3G.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DcAwoh81.js → FamilyGuardDashboard-DubTh7y-.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-CuJLa2eb.js → Federation-DlSM4uJv.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-Cxd1lxhc.js → FormItemContext-BYhg0vtG.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-BBvq5Jsw.js → GenericCardRenderer-Bkh7qjfK.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-WqPKetx6.js → Git-DSLWPKvn.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-CWYtY3ke.js → Governance-DIj9O8BB.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-BnX1iiNV.js → Inference-Dhep3e5Y.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-BJuM8GN5.js → KnowledgeGraph-Cj8vzxB_.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-DqLMNntm.js → Logs-Ba4SsPja.js} +2 -2
  35. package/src/assets/web-panel/assets/MarkdownRenderer-DUjyuVB3.js +1 -0
  36. package/src/assets/web-panel/assets/{Marketplace-_vGfmhNl.js → Marketplace-CGs9IIbf.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-BeJDOkDj.js → McpTools-BTPAoX4K.js} +4 -4
  38. package/src/assets/web-panel/assets/{Memory-Da0EEZDO.js → Memory-BJ6ISf2c.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-DSuzcCCy.js → MobileBridge-Ca6n3Dcn.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-D0RAk4e8.js → MobileProjects-lvilHuLt.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-BE9YgdA0.js → Mtc-CMo0acBV.js} +2 -2
  42. package/src/assets/web-panel/assets/{MtcAudit-fC2BpO5S.js → MtcAudit-Hz5wBvFX.js} +4 -4
  43. package/src/assets/web-panel/assets/{Multisig-D24Xxqw3.js → Multisig-BK2aKWE6.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-Bs3oGvS8.js → NLProgramming-CExpnYMI.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-BFjmAA-3.js → Notes-B7IFbuBo.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-BX_9Bhv0.js → NotificationSettings-VrGchtb0.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-wjkZwJXI.js → OrderTableRenderer-CyrNTxkU.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-DBcdsVEP.js → Organization-I0C17GBP.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-DDyaF9vC.js → Overflow-CXcWvERe.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-BB78L4he.js → P2P-FFSCXrZq.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-DqTiZFum.js → PdhVaultBrowser-1PB-p8Zk.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-INbnWv4j.js → Permissions-C1YHejsb.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-BST-VmTq.js → PersonalDataHub-CEMPpgf8.js} +2 -2
  54. package/src/assets/web-panel/assets/{Pipeline-CE7_tS2k.js → Pipeline-FoIScdLr.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-hK5L8dOB.js → Privacy-DDfbEzEj.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-BvkkUoDn.js → ProjectInit-Dso4kB0O.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-u7_EUtkm.js → ProjectSettings-WvDoydDc.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-5Fmt_8Nw.js → Projects-NJp0kzkd.js} +1 -1
  59. package/src/assets/web-panel/assets/{Providers-B9eanarR.js → Providers-BuJXnOLI.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-C0dX5N2f.js → QrScannerModal-Bb3lMvGG.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-CKTpG-PZ.js → QuickAsk-Ddxra3fK.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-Px_w_XQM.js → Recommend-BW-dR9qw.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-Di0fnYkM.js → RemoteSession-Hnm7-Qkm.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-vesnWjXt.js → Reputation-DKz6meHE.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-exbY6LkT.js → Row-BuAsoNTS.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-B3O3x70t.js → RssFeed-_do9DMIH.js} +2 -2
  67. package/src/assets/web-panel/assets/{Search-uRA0DhNz.js → Search-CMlcw7ND.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-CViqdH6K.js → Security-DhAkfSpM.js} +3 -3
  69. package/src/assets/web-panel/assets/{Services-CkXS97WN.js → Services-5zKLhy46.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-DxW5WYnE.js → Skeleton-DCMZ3wfv.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-CLxmGFse.js → Skills-DxQgYCC_.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-Cr5fziXq.js → Sla-CJmE4cSN.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-H0JSb3cp.js → SpeechSettings-BgpRTPQp.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-DMYWMae7.js → SyncSettings-DkogtYbB.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-CbYyDdF4.js → Tasks-D5OrwAl9.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-Cpc8JjiK.js → Templates-DAZIu5nN.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-CRh77Jda.js → Tenant-BRJMI-su.js} +1 -1
  78. package/src/assets/web-panel/assets/Terminal-CMXLqQKF.js +3 -0
  79. package/src/assets/web-panel/assets/{TimelineRenderer-D41jzzbG.js → TimelineRenderer-D4z9aSGD.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-C_jWEy6b.js → Tokens-zgYA4UOI.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-Dk1ZUhsy.js → Trigger-DMOgHX4m.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-CLVy4l7m.js → Trust-CEtoNwcT.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-C-FeqFDj.js → UkeySign-DFx2pQfO.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-CqVZzyMm.js → VideoEditing-DLssy-7B.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-DX9BW9pu.js → Wallet-DQHc6gTl.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-7hQDpWw_.js → WebAuthn-DgKcODkn.js} +2 -2
  87. package/src/assets/web-panel/assets/{WorkflowEditor-6XqUAO0j.js → WorkflowEditor-cPEWfMOf.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-5R_vkaJG.js → chat-Coj7rSO1.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-huUPZdC-.js → colors-DiyGfr-6.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-CfJlgisE.js → compact-item-DB63aMXh.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-jO8heofr.js → createContext-CENpsYHg.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-XvRaIiyt.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-DY8Vxqx7.js → hasIn-B9NOmk0K.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-B300RPnT.js → index-76GMjcbq.js} +3 -3
  95. package/src/assets/web-panel/assets/{index-CA6sO5VD.js → index-7IMjHwGU.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-D1VLuww0.js → index-B0C6zl0y.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-D0pet5Uy.js → index-B45osqnZ.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BHE8OIls.js → index-BXzMKVLp.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-vXs3B8GJ.js → index-BkoqtJzV.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-d1xkbtNz.js → index-BpmTl8QC.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BfCx4pFT.js → index-BramLq29.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-p85YaaKw.js → index-BvQq6gX2.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BsBtRWbA.js → index-Bvj07Ab1.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-KRHroryI.js → index-BxvNtndl.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BmqGerpC.js → index-C9d8hdgY.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CA90TZxG.js → index-CAXouogg.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-Bxax9vQ6.js → index-CKNt2vfs.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BYLBPpt8.js → index-CRhEJ8JO.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DXBcvUnf.js → index-CTuX_MU0.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Cjxbu68P.js → index-CXRknr9W.js} +1 -1
  111. package/src/assets/web-panel/assets/index-CbO1zSXV.js +1 -0
  112. package/src/assets/web-panel/assets/{index-Cbe9G0V4.js → index-ClEy1v1o.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CRElRhyS.js → index-CmNCDN5t.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-v3pTaEQm.js → index-CvTJ-x6b.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-ChvHubX3.js → index-CwkK9Kl2.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CLhBh-qE.js → index-CxVfbuj9.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BQS-uPOK.js → index-DAMKhjtT.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-C2iVSFpy.js → index-DANoIqXP.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-B74OXFxC.js → index-D_rZCxxI.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-dKx57io7.js → index-Dg0v-CXZ.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BRXOP09X.js → index-DqLC0iE4.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-BtEXSoPL.js → index-DsPDEHOg.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DoI2sZm7.js → index-KDCuTzdx.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-BAON7TzU.js → index-Kp2AETEw.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Cis_Ip7H.js → index-U_snupDl.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-j3O2EEJe.js → index-VDFbduzG.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-BliaT02i.js → index-Y_UKQpsV.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-A48PtXw9.js → index-Yb9EfUnY.js} +1 -1
  129. package/src/assets/web-panel/assets/index-aCu2gbUb.js +1 -0
  130. package/src/assets/web-panel/assets/{index-CzKmteNS.js → index-mTK_ZHhE.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-BCqxyvqp.js → index-nio98wGC.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-Db1cLWir.js → index-t6hXF2Cw.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-MCB7-raZ.js → initDefaultProps-GTwJVIOz.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-UWDF9swV.js → motion-BJQLsPx8.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-CsTmgXZU.js → move-DVQM0bdG.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-fQy6KGLg.js → mtc-parser-CMXI1I2y.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-woPnEjd1.js → omit-CAc8MDw9.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-Bs2dZ1gf.js → pickAttrs-BgqzoyP7.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-C7EVgPkg.js → placementArrow-B9ebCdRy.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-BH2kYCTN.js → responsiveObserve-Dy8D0D3n.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-BFBP2V_e.js → slide-Bcrc8J39.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-xdDxDYse.js → statusUtils-CDW6FOlc.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-aAWgPPQf.js → styleChecker-CWhJrDON.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-DkGSAWoO.js → useFlexGapSupport-C82c33XI.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-BrOih40N.js → useFs-A6m--mih.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-eIYrgMqO.js → usePersonalDataHub-m-1laJY5.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-B8lutNSE.js → vnode-CL9oKKRa.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-CffNre7V.js → zoom-DrOyaof3.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/commands/agenda.js +71 -14
  151. package/src/commands/agent.js +14 -0
  152. package/src/commands/doctor.js +85 -1
  153. package/src/commands/plugin.js +226 -9
  154. package/src/commands/review.js +17 -1
  155. package/src/commands/session.js +191 -0
  156. package/src/commands/team.js +19 -1
  157. package/src/data/changelog.json +10 -4
  158. package/src/gateways/ws/session-protocol.js +50 -0
  159. package/src/gateways/ws/ws-agent-handler.js +50 -0
  160. package/src/harness/jsonl-session-store.js +60 -0
  161. package/src/harness/worktree-isolator.js +140 -5
  162. package/src/lib/agent-schedule-store.js +30 -1
  163. package/src/lib/agent-team/team-worktree.js +37 -2
  164. package/src/lib/agent-tool-admission.js +125 -0
  165. package/src/lib/app-preview.js +360 -0
  166. package/src/lib/async-hook-supervisor.cjs +54 -0
  167. package/src/lib/capability-manifest.js +319 -0
  168. package/src/lib/capability-negotiation.js +23 -12
  169. package/src/lib/diagnostic-bundle.js +230 -0
  170. package/src/lib/doctor-checkup.js +223 -4
  171. package/src/lib/execution-location.js +286 -0
  172. package/src/lib/headless-manifest.js +13 -40
  173. package/src/lib/hook-stats-store.cjs +197 -0
  174. package/src/lib/idempotency.js +109 -0
  175. package/src/lib/jsonl-session-store.js +1 -0
  176. package/src/lib/lsp/__tests__/lsp-manager.test.js +58 -0
  177. package/src/lib/lsp/lsp-manager.js +56 -0
  178. package/src/lib/monitor-event.js +290 -0
  179. package/src/lib/operation-fingerprint.js +217 -0
  180. package/src/lib/plugin-runtime/bin.js +37 -0
  181. package/src/lib/plugin-runtime/capabilities.js +19 -0
  182. package/src/lib/plugin-runtime/capability-consent.js +28 -0
  183. package/src/lib/plugin-runtime/hooks.js +37 -0
  184. package/src/lib/plugin-runtime/lsp.js +38 -0
  185. package/src/lib/plugin-runtime/mcp.js +40 -0
  186. package/src/lib/plugin-runtime/monitors.js +37 -0
  187. package/src/lib/plugin-runtime/plugin-options.js +151 -0
  188. package/src/lib/pr-automation-policy.js +224 -0
  189. package/src/lib/project-instructions.js +9 -1
  190. package/src/lib/remote-approval-bridge.js +66 -13
  191. package/src/lib/repl-rewind.js +101 -0
  192. package/src/lib/review-comment-anchor.js +241 -0
  193. package/src/lib/review-pipeline.js +46 -7
  194. package/src/lib/runtime-checkup.js +221 -0
  195. package/src/lib/secret-scan.js +409 -0
  196. package/src/lib/session-branch.js +0 -0
  197. package/src/lib/side-effect-ledger.js +105 -0
  198. package/src/lib/skill-loader.js +32 -0
  199. package/src/lib/skill-path-scope.js +63 -0
  200. package/src/lib/sub-agent-context.js +36 -4
  201. package/src/lib/sub-agent-registry.js +19 -0
  202. package/src/lib/telemetry/span-recorder.js +17 -4
  203. package/src/lib/terminal-context.js +195 -0
  204. package/src/lib/unattended-action-policy.js +182 -0
  205. package/src/lib/worktree-cleanup-safety.js +138 -0
  206. package/src/lib/worktree-isolator.js +8 -0
  207. package/src/lib/worktree-sparse.js +131 -0
  208. package/src/repl/agent-repl.js +169 -40
  209. package/src/runtime/agent-core.js +220 -24
  210. package/src/runtime/diagnostics.js +60 -0
  211. package/src/runtime/headless-runner.js +135 -2
  212. package/src/runtime/headless-stream.js +10 -1
  213. package/src/runtime/policies/agent-policy.js +5 -0
  214. package/src/runtime/system-prompt.js +21 -8
  215. package/src/assets/web-panel/assets/ChatBubbleRenderer-DDPd9qT0.js +0 -1
  216. package/src/assets/web-panel/assets/MarkdownRenderer-BqYwEYou.js +0 -1
  217. package/src/assets/web-panel/assets/Terminal-4D8tNBO5.js +0 -3
  218. package/src/assets/web-panel/assets/devWarning-DeIrCfH-.js +0 -1
  219. package/src/assets/web-panel/assets/index-BxUKMRpP.js +0 -1
  220. package/src/assets/web-panel/assets/index-DscU9iPI.js +0 -1
@@ -1038,11 +1038,22 @@ export async function startAgentRepl(options = {}) {
1038
1038
  // output-style persona can be swapped in/out at runtime via /output-style.
1039
1039
  // `let` (not const): /add-dir rebuilds this mid-session to re-advertise the
1040
1040
  // updated working roots; output-style swaps also read it live.
1041
+ // --no-project-memory (options.projectMemory === false): lean prompt — skip
1042
+ // rules.md (in buildSystemPrompt) + the cc.md/CLAUDE.md block (in
1043
+ // composeSystemPrompt). Map only an explicit `false` to a suppressing value;
1044
+ // anything else (Commander defaults an absent `--no-` flag to `true`) stays
1045
+ // `undefined` so the runtime default-on path — and CC_PROJECT_MEMORY=0 — keep
1046
+ // their existing behaviour byte-identically.
1047
+ const _leanNoProjectMemory = options.projectMemory === false;
1041
1048
  let _replBaseSystem = composeSystemPrompt(
1042
- buildSystemPrompt(process.cwd(), { additionalDirectories }),
1049
+ buildSystemPrompt(process.cwd(), {
1050
+ additionalDirectories,
1051
+ projectMemory: options.projectMemory,
1052
+ }),
1043
1053
  {
1044
1054
  systemPrompt: options.systemPrompt,
1045
1055
  appendSystemPrompt: options.appendSystemPrompt,
1056
+ projectMemory: _leanNoProjectMemory ? false : undefined,
1046
1057
  },
1047
1058
  );
1048
1059
  let _activeOutputStyle = null; // { name, body }
@@ -2188,7 +2199,7 @@ export async function startAgentRepl(options = {}) {
2188
2199
  ` ${chalk.cyan("/export")} Save this conversation to a Markdown file (/export [path])`,
2189
2200
  );
2190
2201
  logger.log(
2191
- ` ${chalk.cyan("/rewind")} Rewind to an earlier turn (double-Esc lists); ${chalk.cyan("/rewind clear")} restores a /clear`,
2202
+ ` ${chalk.cyan("/rewind")} Rewind to an earlier turn (double-Esc lists); ${chalk.cyan("/rewind <n> --files|--conversation")} scopes it; ${chalk.cyan("/rewind <n> --branch")} forks a session; ${chalk.cyan("/rewind clear")} restores a /clear`,
2192
2203
  );
2193
2204
  logger.log(
2194
2205
  ` ${chalk.cyan("/goal <cond>")} Set a session goal checked after each turn (exit-zero:/file-exists:/contains:/regex:/text); ${chalk.cyan("/goal")} shows, ${chalk.cyan("/goal clear")} drops`,
@@ -2393,10 +2404,14 @@ export async function startAgentRepl(options = {}) {
2393
2404
  // Re-advertise the updated roots in the system prompt; keep the
2394
2405
  // active output-style body layered on top (same as /output-style).
2395
2406
  _replBaseSystem = composeSystemPrompt(
2396
- buildSystemPrompt(process.cwd(), { additionalDirectories }),
2407
+ buildSystemPrompt(process.cwd(), {
2408
+ additionalDirectories,
2409
+ projectMemory: options.projectMemory,
2410
+ }),
2397
2411
  {
2398
2412
  systemPrompt: options.systemPrompt,
2399
2413
  appendSystemPrompt: options.appendSystemPrompt,
2414
+ projectMemory: _leanNoProjectMemory ? false : undefined,
2400
2415
  },
2401
2416
  );
2402
2417
  messages[0].content = _activeOutputStyle
@@ -3020,9 +3035,17 @@ export async function startAgentRepl(options = {}) {
3020
3035
  restoreClearedConversation,
3021
3036
  buildRewindPlan,
3022
3037
  renderRewindWarnings,
3038
+ buildBranchPlan,
3039
+ renderBranchPlan,
3040
+ parseRewindArg,
3041
+ RESTORE_SCOPE,
3023
3042
  } = await import("../lib/repl-rewind.js");
3024
3043
  const arg = trimmed.slice("/rewind".length).trim();
3025
- if (arg === "clear" || arg === "undo-clear") {
3044
+ // Parse the turn number + optional restore scope (--conversation /
3045
+ // --files / --both). Claude-Code parity: a rewind can restore the
3046
+ // conversation only, the files only, or both.
3047
+ const parsed = parseRewindArg(arg);
3048
+ if (parsed.command === "clear") {
3026
3049
  // Restore the conversation stashed by /clear (Claude-Code 2.1.191).
3027
3050
  const r = restoreClearedConversation(
3028
3051
  messages,
@@ -3045,13 +3068,86 @@ export async function startAgentRepl(options = {}) {
3045
3068
  prompt();
3046
3069
  return;
3047
3070
  }
3048
- if (!arg) {
3071
+ if (parsed.command === "branch") {
3072
+ // "从这里分支" (P0-3's fourth restore action): fork a NEW independent
3073
+ // session that keeps history up to the chosen turn and diverges from
3074
+ // there. The origin session is NEVER truncated (preservesParent), so
3075
+ // the live conversation continues unchanged.
3076
+ const targetTurn = listUserTurns(messages, { limit: 1000 }).find(
3077
+ (t) => t.n === parsed.n,
3078
+ );
3079
+ if (!targetTurn) {
3080
+ logger.error(`No such turn: ${parsed.n} — run /rewind to list.`);
3081
+ } else if (!sessionId) {
3082
+ logger.error(
3083
+ "Branch needs a persisted session — none is active yet.",
3084
+ );
3085
+ } else {
3086
+ const turnIndex = targetTurn.index;
3087
+ const plan = buildBranchPlan(
3088
+ messages,
3089
+ _checkpointMarks,
3090
+ turnIndex,
3091
+ {
3092
+ parentSessionId: sessionId,
3093
+ writeIntent: parsed.writeIntent,
3094
+ },
3095
+ );
3096
+ if (!plan || !plan.branchSessionId) {
3097
+ logger.error("Could not plan a branch from that turn.");
3098
+ } else {
3099
+ try {
3100
+ const { createBranchSession } =
3101
+ await import("../harness/jsonl-session-store.js");
3102
+ const res = createBranchSession({
3103
+ branchSessionId: plan.branchSessionId,
3104
+ parentSessionId: sessionId,
3105
+ parentTurnId: plan.parentTurnId,
3106
+ messages: messages.slice(0, turnIndex),
3107
+ meta: { title: `Branch of ${sessionId}` },
3108
+ });
3109
+ logger.log(
3110
+ chalk.green(
3111
+ res.created
3112
+ ? `🌿 branched to ${res.branchSessionId} — ${res.messages} message(s) kept; parent ${sessionId} untouched`
3113
+ : `🌿 branch ${res.branchSessionId} already exists; parent ${sessionId} untouched`,
3114
+ ),
3115
+ );
3116
+ for (const line of renderBranchPlan(plan))
3117
+ logger.log(chalk.yellow(line));
3118
+ logger.log(
3119
+ chalk.gray(
3120
+ ` resume it with cc agent --resume ${res.branchSessionId}` +
3121
+ (plan.requiresWorktree
3122
+ ? " (write task → branch into an isolated worktree)"
3123
+ : ""),
3124
+ ),
3125
+ );
3126
+ } catch (e) {
3127
+ logger.error(`branch failed: ${e.message}`);
3128
+ }
3129
+ }
3130
+ }
3131
+ prompt();
3132
+ return;
3133
+ }
3134
+ if (parsed.command === "list") {
3049
3135
  logger.log(chalk.bold("\nRewind — pick a user turn (newest first):"));
3050
3136
  logger.log(renderTurnList(listUserTurns(messages)));
3051
3137
  const fileHint = _checkpointMarks.length
3052
3138
  ? " (restores files to that point too — checkpoints are on)"
3053
3139
  : " (conversation only — start with --checkpoint / git to also rewind files)";
3054
3140
  logger.log(chalk.gray(`Usage: /rewind <n>${fileHint}`));
3141
+ logger.log(
3142
+ chalk.gray(
3143
+ " scope: /rewind <n> --conversation | --files | --both (default)",
3144
+ ),
3145
+ );
3146
+ logger.log(
3147
+ chalk.gray(
3148
+ " branch: /rewind <n> --branch [--write] forks an independent session (parent kept)",
3149
+ ),
3150
+ );
3055
3151
  if (_clearedConversation) {
3056
3152
  logger.log(
3057
3153
  chalk.gray(
@@ -3060,50 +3156,67 @@ export async function startAgentRepl(options = {}) {
3060
3156
  );
3061
3157
  }
3062
3158
  } else {
3063
- // Snapshot BEFORE rewindToTurn truncates `messages`: buildRewindPlan
3064
- // needs the target turn still present to bind it to its checkpoint.
3159
+ const scope = parsed.scope;
3160
+ const rewindConversation = scope !== RESTORE_SCOPE.FILES;
3161
+ const restoreFiles = scope !== RESTORE_SCOPE.CONVERSATION;
3162
+ // Snapshot + locate the target turn BEFORE any truncation:
3163
+ // buildRewindPlan needs the turn still present to bind its checkpoint,
3164
+ // and a files-only rewind keeps the conversation intact entirely.
3065
3165
  const preRewind = messages.slice();
3066
- const res = rewindToTurn(messages, arg);
3067
- if (!res) {
3068
- logger.error(`No such turn: ${arg} — run /rewind to list.`);
3166
+ const targetTurn = listUserTurns(messages, { limit: 1000 }).find(
3167
+ (t) => t.n === parsed.n,
3168
+ );
3169
+ if (!targetTurn) {
3170
+ logger.error(`No such turn: ${parsed.n} — run /rewind to list.`);
3069
3171
  } else {
3070
- logger.log(
3071
- chalk.yellow(
3072
- `⎌ rewound — dropped ${res.removed} message(s); edit and resend below`,
3073
- ),
3074
- );
3075
- // Coverage-aware honesty (P1 turn/checkpoint binding): print what a
3076
- // restore can and cannot promise for this turn BEFORE offering the
3077
- // file restore — a shell/external side-effect → PARTIAL, no
3078
- // checkpoint → files can't be restored, conversation/files drift.
3079
- // Derived from the REPL's existing marks (no new agent-loop events);
3172
+ const turnIndex = targetTurn.index;
3173
+ // 1) Conversation rewind (skipped for files-only).
3174
+ if (rewindConversation) {
3175
+ const res = rewindToTurn(messages, parsed.n);
3176
+ logger.log(
3177
+ chalk.yellow(
3178
+ `⎌ rewound — dropped ${res.removed} message(s); edit and resend below`,
3179
+ ),
3180
+ );
3181
+ } else {
3182
+ logger.log(
3183
+ chalk.yellow("⎌ files-only rewind — conversation left intact"),
3184
+ );
3185
+ }
3186
+ // 2) Coverage-aware honesty for the CHOSEN scope (P1 turn/checkpoint
3187
+ // binding): print what a restore can and cannot promise — a shell/
3188
+ // external side-effect → PARTIAL, no checkpoint → files can't be
3189
+ // restored, and a scope-specific conversation/files drift. Derived
3190
+ // from the REPL's existing marks (no new agent-loop events);
3080
3191
  // best-effort so the advisory never blocks the rewind itself.
3081
3192
  try {
3082
3193
  const plan = buildRewindPlan(
3083
3194
  preRewind,
3084
3195
  _checkpointMarks,
3085
- res.index,
3196
+ turnIndex,
3197
+ scope,
3086
3198
  );
3087
3199
  for (const line of renderRewindWarnings(plan))
3088
3200
  logger.log(chalk.yellow(line));
3089
3201
  } catch {
3090
3202
  /* advisory only — a rewind must never fail over its own warning */
3091
3203
  }
3092
- // Claude-Code parity: rewind restores files too. Match the dropped
3093
- // turn to the snapshot taken just before it first mutated the tree,
3094
- // then offer to roll the working tree back to it (undoable — the
3095
- // restore takes its own safety checkpoint first).
3096
- const cp = pickCheckpointForTurn(_checkpointMarks, res.index);
3097
- pruneMarksAfter(_checkpointMarks, res.index);
3204
+ // 3) File restore (skipped for conversation-only). Match the turn to
3205
+ // the snapshot taken just before it first mutated the tree, then
3206
+ // offer to roll the working tree back to it (undoable — the restore
3207
+ // takes its own safety checkpoint first). Prune dropped-turn marks
3208
+ // only when the conversation was actually truncated.
3209
+ const cp = restoreFiles
3210
+ ? pickCheckpointForTurn(_checkpointMarks, turnIndex)
3211
+ : null;
3212
+ if (rewindConversation)
3213
+ pruneMarksAfter(_checkpointMarks, turnIndex);
3098
3214
  if (cp) {
3099
3215
  const q = (p) => new Promise((r) => rl.question(p, r));
3100
- const ans = (
3101
- await q(
3102
- chalk.yellow(
3103
- ` Also restore files to before this turn? (checkpoint ${cp.id}) [Y/n] `,
3104
- ),
3105
- )
3106
- )
3216
+ const promptText = rewindConversation
3217
+ ? ` Also restore files to before this turn? (checkpoint ${cp.id}) [Y/n] `
3218
+ : ` Restore files to before this turn? (checkpoint ${cp.id}) [Y/n] `;
3219
+ const ans = (await q(chalk.yellow(promptText)))
3107
3220
  .trim()
3108
3221
  .toLowerCase();
3109
3222
  if (ans === "" || ans === "y" || ans === "yes") {
@@ -3120,7 +3233,7 @@ export async function startAgentRepl(options = {}) {
3120
3233
  );
3121
3234
  } catch (e) {
3122
3235
  logger.error(
3123
- ` file restore skipped: ${e.message} (conversation already rewound)`,
3236
+ ` file restore skipped: ${e.message}${rewindConversation ? " (conversation already rewound)" : ""}`,
3124
3237
  );
3125
3238
  }
3126
3239
  } else {
@@ -3130,9 +3243,19 @@ export async function startAgentRepl(options = {}) {
3130
3243
  ),
3131
3244
  );
3132
3245
  }
3246
+ } else if (restoreFiles && scope === RESTORE_SCOPE.FILES) {
3247
+ logger.log(
3248
+ chalk.gray(
3249
+ " no checkpoint captured for that turn — nothing to restore",
3250
+ ),
3251
+ );
3133
3252
  }
3134
3253
  prompt();
3135
- if (res.text) rl.write(res.text);
3254
+ // Prefill the input line with the turn's text only when the
3255
+ // conversation was rewound (edit-and-resend); files-only leaves the
3256
+ // conversation and the prompt untouched.
3257
+ if (rewindConversation && typeof targetTurn.content === "string")
3258
+ rl.write(targetTurn.content);
3136
3259
  return;
3137
3260
  }
3138
3261
  }
@@ -3437,7 +3560,9 @@ export async function startAgentRepl(options = {}) {
3437
3560
  if (!_asyncHookSupervisor) {
3438
3561
  const { AsyncHookSupervisor } =
3439
3562
  await import("../lib/async-hook-supervisor.cjs");
3440
- _asyncHookSupervisor = new AsyncHookSupervisor();
3563
+ _asyncHookSupervisor = new AsyncHookSupervisor({
3564
+ persistStats: true,
3565
+ });
3441
3566
  }
3442
3567
  dispatchAsyncHooks(_settingsHooks, "ConfigChange", payload, {
3443
3568
  cwd,
@@ -4813,7 +4938,9 @@ export async function startAgentRepl(options = {}) {
4813
4938
  if (!_asyncHookSupervisor) {
4814
4939
  const { AsyncHookSupervisor } =
4815
4940
  await import("../lib/async-hook-supervisor.cjs");
4816
- _asyncHookSupervisor = new AsyncHookSupervisor();
4941
+ _asyncHookSupervisor = new AsyncHookSupervisor({
4942
+ persistStats: true,
4943
+ });
4817
4944
  }
4818
4945
  dispatchAsyncHooks(
4819
4946
  _settingsHooks,
@@ -5100,7 +5227,7 @@ export async function startAgentRepl(options = {}) {
5100
5227
  if (_settingsHooks && !_asyncHookSupervisor) {
5101
5228
  const { AsyncHookSupervisor } =
5102
5229
  await import("../lib/async-hook-supervisor.cjs");
5103
- _asyncHookSupervisor = new AsyncHookSupervisor();
5230
+ _asyncHookSupervisor = new AsyncHookSupervisor({ persistStats: true });
5104
5231
  }
5105
5232
  const {
5106
5233
  content: response,
@@ -5442,7 +5569,9 @@ export async function startAgentRepl(options = {}) {
5442
5569
  if (!_asyncHookSupervisor) {
5443
5570
  const { AsyncHookSupervisor } =
5444
5571
  await import("../lib/async-hook-supervisor.cjs");
5445
- _asyncHookSupervisor = new AsyncHookSupervisor();
5572
+ _asyncHookSupervisor = new AsyncHookSupervisor({
5573
+ persistStats: true,
5574
+ });
5446
5575
  }
5447
5576
  dispatchAsyncHooks(
5448
5577
  _settingsHooks,