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.
- package/package.json +3 -1
- package/src/assets/web-panel/assets/{AIOps-BQ0kgfA1.js → AIOps-DgGZr3PR.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-Dr1MDANe.js → ActionButton-BAOgBIc_.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CZ5vsaXW.js → Analytics-Ds4GAvNF.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-BIBga881.js → AppLayout-CoJvCkoF.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-vpXHRU3u.js → Artifacts-6EgUaE1T.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-B8exuoub.js → Audit-BYie_i74.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-923evRRN.js → BackgroundAgents-D5gxOhjd.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-sr_sswlQ.js → Backup-CIsVK2pT.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CnW-4XKT.js → BaseInput-ClorP55M.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-FZCsTZIL.js → Chat-CnhTPGGA.js} +6 -6
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Bl1VXgwp.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-DFrxB59H.js → Checkbox-BRavl7TP.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-_b6WEel8.js → Codegen-BXg_ErNT.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CkbnnZ-K.js → Col-CfDPzFPq.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BxM_82zW.js → Community-Cgo0httP.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DYinP45R.js → Compact-DU5JcEQM.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DyXp3sSP.js → Compliance-DCH_TVBl.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BEr2DhW7.js → Cowork-IGb5O2IH.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-B-Vwo1hN.js → Cron-CPp_Xp9F.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-DbLxKddd.js → Crosschain-Cwrqklzw.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BsQ_LFw9.js → DID-D55sBQwM.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-lVlXQHu5.js → Dashboard-CedXhGmP.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-Beo_foO7.js → Dropdown-Dm6_v3V4.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-DszHIXED.js → EmailListRenderer-CWjnuE3G.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DcAwoh81.js → FamilyGuardDashboard-DubTh7y-.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-CuJLa2eb.js → Federation-DlSM4uJv.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-Cxd1lxhc.js → FormItemContext-BYhg0vtG.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BBvq5Jsw.js → GenericCardRenderer-Bkh7qjfK.js} +1 -1
- package/src/assets/web-panel/assets/{Git-WqPKetx6.js → Git-DSLWPKvn.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CWYtY3ke.js → Governance-DIj9O8BB.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BnX1iiNV.js → Inference-Dhep3e5Y.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-BJuM8GN5.js → KnowledgeGraph-Cj8vzxB_.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DqLMNntm.js → Logs-Ba4SsPja.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-DUjyuVB3.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-_vGfmhNl.js → Marketplace-CGs9IIbf.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BeJDOkDj.js → McpTools-BTPAoX4K.js} +4 -4
- package/src/assets/web-panel/assets/{Memory-Da0EEZDO.js → Memory-BJ6ISf2c.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DSuzcCCy.js → MobileBridge-Ca6n3Dcn.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-D0RAk4e8.js → MobileProjects-lvilHuLt.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BE9YgdA0.js → Mtc-CMo0acBV.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-fC2BpO5S.js → MtcAudit-Hz5wBvFX.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-D24Xxqw3.js → Multisig-BK2aKWE6.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Bs3oGvS8.js → NLProgramming-CExpnYMI.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BFjmAA-3.js → Notes-B7IFbuBo.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BX_9Bhv0.js → NotificationSettings-VrGchtb0.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-wjkZwJXI.js → OrderTableRenderer-CyrNTxkU.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-DBcdsVEP.js → Organization-I0C17GBP.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DDyaF9vC.js → Overflow-CXcWvERe.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BB78L4he.js → P2P-FFSCXrZq.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DqTiZFum.js → PdhVaultBrowser-1PB-p8Zk.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-INbnWv4j.js → Permissions-C1YHejsb.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BST-VmTq.js → PersonalDataHub-CEMPpgf8.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-CE7_tS2k.js → Pipeline-FoIScdLr.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-hK5L8dOB.js → Privacy-DDfbEzEj.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BvkkUoDn.js → ProjectInit-Dso4kB0O.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-u7_EUtkm.js → ProjectSettings-WvDoydDc.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-5Fmt_8Nw.js → Projects-NJp0kzkd.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-B9eanarR.js → Providers-BuJXnOLI.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-C0dX5N2f.js → QrScannerModal-Bb3lMvGG.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CKTpG-PZ.js → QuickAsk-Ddxra3fK.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Px_w_XQM.js → Recommend-BW-dR9qw.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-Di0fnYkM.js → RemoteSession-Hnm7-Qkm.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-vesnWjXt.js → Reputation-DKz6meHE.js} +1 -1
- package/src/assets/web-panel/assets/{Row-exbY6LkT.js → Row-BuAsoNTS.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-B3O3x70t.js → RssFeed-_do9DMIH.js} +2 -2
- package/src/assets/web-panel/assets/{Search-uRA0DhNz.js → Search-CMlcw7ND.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CViqdH6K.js → Security-DhAkfSpM.js} +3 -3
- package/src/assets/web-panel/assets/{Services-CkXS97WN.js → Services-5zKLhy46.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DxW5WYnE.js → Skeleton-DCMZ3wfv.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CLxmGFse.js → Skills-DxQgYCC_.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-Cr5fziXq.js → Sla-CJmE4cSN.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-H0JSb3cp.js → SpeechSettings-BgpRTPQp.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DMYWMae7.js → SyncSettings-DkogtYbB.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-CbYyDdF4.js → Tasks-D5OrwAl9.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-Cpc8JjiK.js → Templates-DAZIu5nN.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CRh77Jda.js → Tenant-BRJMI-su.js} +1 -1
- package/src/assets/web-panel/assets/Terminal-CMXLqQKF.js +3 -0
- package/src/assets/web-panel/assets/{TimelineRenderer-D41jzzbG.js → TimelineRenderer-D4z9aSGD.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-C_jWEy6b.js → Tokens-zgYA4UOI.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-Dk1ZUhsy.js → Trigger-DMOgHX4m.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-CLVy4l7m.js → Trust-CEtoNwcT.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-C-FeqFDj.js → UkeySign-DFx2pQfO.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CqVZzyMm.js → VideoEditing-DLssy-7B.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DX9BW9pu.js → Wallet-DQHc6gTl.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-7hQDpWw_.js → WebAuthn-DgKcODkn.js} +2 -2
- package/src/assets/web-panel/assets/{WorkflowEditor-6XqUAO0j.js → WorkflowEditor-cPEWfMOf.js} +1 -1
- package/src/assets/web-panel/assets/{chat-5R_vkaJG.js → chat-Coj7rSO1.js} +1 -1
- package/src/assets/web-panel/assets/{colors-huUPZdC-.js → colors-DiyGfr-6.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CfJlgisE.js → compact-item-DB63aMXh.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-jO8heofr.js → createContext-CENpsYHg.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-XvRaIiyt.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DY8Vxqx7.js → hasIn-B9NOmk0K.js} +1 -1
- package/src/assets/web-panel/assets/{index-B300RPnT.js → index-76GMjcbq.js} +3 -3
- package/src/assets/web-panel/assets/{index-CA6sO5VD.js → index-7IMjHwGU.js} +1 -1
- package/src/assets/web-panel/assets/{index-D1VLuww0.js → index-B0C6zl0y.js} +1 -1
- package/src/assets/web-panel/assets/{index-D0pet5Uy.js → index-B45osqnZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHE8OIls.js → index-BXzMKVLp.js} +1 -1
- package/src/assets/web-panel/assets/{index-vXs3B8GJ.js → index-BkoqtJzV.js} +1 -1
- package/src/assets/web-panel/assets/{index-d1xkbtNz.js → index-BpmTl8QC.js} +1 -1
- package/src/assets/web-panel/assets/{index-BfCx4pFT.js → index-BramLq29.js} +1 -1
- package/src/assets/web-panel/assets/{index-p85YaaKw.js → index-BvQq6gX2.js} +1 -1
- package/src/assets/web-panel/assets/{index-BsBtRWbA.js → index-Bvj07Ab1.js} +1 -1
- package/src/assets/web-panel/assets/{index-KRHroryI.js → index-BxvNtndl.js} +1 -1
- package/src/assets/web-panel/assets/{index-BmqGerpC.js → index-C9d8hdgY.js} +1 -1
- package/src/assets/web-panel/assets/{index-CA90TZxG.js → index-CAXouogg.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bxax9vQ6.js → index-CKNt2vfs.js} +1 -1
- package/src/assets/web-panel/assets/{index-BYLBPpt8.js → index-CRhEJ8JO.js} +1 -1
- package/src/assets/web-panel/assets/{index-DXBcvUnf.js → index-CTuX_MU0.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cjxbu68P.js → index-CXRknr9W.js} +1 -1
- package/src/assets/web-panel/assets/index-CbO1zSXV.js +1 -0
- package/src/assets/web-panel/assets/{index-Cbe9G0V4.js → index-ClEy1v1o.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRElRhyS.js → index-CmNCDN5t.js} +1 -1
- package/src/assets/web-panel/assets/{index-v3pTaEQm.js → index-CvTJ-x6b.js} +1 -1
- package/src/assets/web-panel/assets/{index-ChvHubX3.js → index-CwkK9Kl2.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLhBh-qE.js → index-CxVfbuj9.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQS-uPOK.js → index-DAMKhjtT.js} +1 -1
- package/src/assets/web-panel/assets/{index-C2iVSFpy.js → index-DANoIqXP.js} +1 -1
- package/src/assets/web-panel/assets/{index-B74OXFxC.js → index-D_rZCxxI.js} +1 -1
- package/src/assets/web-panel/assets/{index-dKx57io7.js → index-Dg0v-CXZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRXOP09X.js → index-DqLC0iE4.js} +1 -1
- package/src/assets/web-panel/assets/{index-BtEXSoPL.js → index-DsPDEHOg.js} +1 -1
- package/src/assets/web-panel/assets/{index-DoI2sZm7.js → index-KDCuTzdx.js} +1 -1
- package/src/assets/web-panel/assets/{index-BAON7TzU.js → index-Kp2AETEw.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cis_Ip7H.js → index-U_snupDl.js} +1 -1
- package/src/assets/web-panel/assets/{index-j3O2EEJe.js → index-VDFbduzG.js} +1 -1
- package/src/assets/web-panel/assets/{index-BliaT02i.js → index-Y_UKQpsV.js} +1 -1
- package/src/assets/web-panel/assets/{index-A48PtXw9.js → index-Yb9EfUnY.js} +1 -1
- package/src/assets/web-panel/assets/index-aCu2gbUb.js +1 -0
- package/src/assets/web-panel/assets/{index-CzKmteNS.js → index-mTK_ZHhE.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCqxyvqp.js → index-nio98wGC.js} +1 -1
- package/src/assets/web-panel/assets/{index-Db1cLWir.js → index-t6hXF2Cw.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-MCB7-raZ.js → initDefaultProps-GTwJVIOz.js} +1 -1
- package/src/assets/web-panel/assets/{motion-UWDF9swV.js → motion-BJQLsPx8.js} +1 -1
- package/src/assets/web-panel/assets/{move-CsTmgXZU.js → move-DVQM0bdG.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-fQy6KGLg.js → mtc-parser-CMXI1I2y.js} +1 -1
- package/src/assets/web-panel/assets/{omit-woPnEjd1.js → omit-CAc8MDw9.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-Bs2dZ1gf.js → pickAttrs-BgqzoyP7.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-C7EVgPkg.js → placementArrow-B9ebCdRy.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BH2kYCTN.js → responsiveObserve-Dy8D0D3n.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BFBP2V_e.js → slide-Bcrc8J39.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-xdDxDYse.js → statusUtils-CDW6FOlc.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-aAWgPPQf.js → styleChecker-CWhJrDON.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DkGSAWoO.js → useFlexGapSupport-C82c33XI.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BrOih40N.js → useFs-A6m--mih.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-eIYrgMqO.js → usePersonalDataHub-m-1laJY5.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-B8lutNSE.js → vnode-CL9oKKRa.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CffNre7V.js → zoom-DrOyaof3.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agenda.js +71 -14
- package/src/commands/agent.js +14 -0
- package/src/commands/doctor.js +85 -1
- package/src/commands/plugin.js +226 -9
- package/src/commands/review.js +17 -1
- package/src/commands/session.js +191 -0
- package/src/commands/team.js +19 -1
- package/src/data/changelog.json +10 -4
- package/src/gateways/ws/session-protocol.js +50 -0
- package/src/gateways/ws/ws-agent-handler.js +50 -0
- package/src/harness/jsonl-session-store.js +60 -0
- package/src/harness/worktree-isolator.js +140 -5
- package/src/lib/agent-schedule-store.js +30 -1
- package/src/lib/agent-team/team-worktree.js +37 -2
- package/src/lib/agent-tool-admission.js +125 -0
- package/src/lib/app-preview.js +360 -0
- package/src/lib/async-hook-supervisor.cjs +54 -0
- package/src/lib/capability-manifest.js +319 -0
- package/src/lib/capability-negotiation.js +23 -12
- package/src/lib/diagnostic-bundle.js +230 -0
- package/src/lib/doctor-checkup.js +223 -4
- package/src/lib/execution-location.js +286 -0
- package/src/lib/headless-manifest.js +13 -40
- package/src/lib/hook-stats-store.cjs +197 -0
- package/src/lib/idempotency.js +109 -0
- package/src/lib/jsonl-session-store.js +1 -0
- package/src/lib/lsp/__tests__/lsp-manager.test.js +58 -0
- package/src/lib/lsp/lsp-manager.js +56 -0
- package/src/lib/monitor-event.js +290 -0
- package/src/lib/operation-fingerprint.js +217 -0
- package/src/lib/plugin-runtime/bin.js +37 -0
- package/src/lib/plugin-runtime/capabilities.js +19 -0
- package/src/lib/plugin-runtime/capability-consent.js +28 -0
- package/src/lib/plugin-runtime/hooks.js +37 -0
- package/src/lib/plugin-runtime/lsp.js +38 -0
- package/src/lib/plugin-runtime/mcp.js +40 -0
- package/src/lib/plugin-runtime/monitors.js +37 -0
- package/src/lib/plugin-runtime/plugin-options.js +151 -0
- package/src/lib/pr-automation-policy.js +224 -0
- package/src/lib/project-instructions.js +9 -1
- package/src/lib/remote-approval-bridge.js +66 -13
- package/src/lib/repl-rewind.js +101 -0
- package/src/lib/review-comment-anchor.js +241 -0
- package/src/lib/review-pipeline.js +46 -7
- package/src/lib/runtime-checkup.js +221 -0
- package/src/lib/secret-scan.js +409 -0
- package/src/lib/session-branch.js +0 -0
- package/src/lib/side-effect-ledger.js +105 -0
- package/src/lib/skill-loader.js +32 -0
- package/src/lib/skill-path-scope.js +63 -0
- package/src/lib/sub-agent-context.js +36 -4
- package/src/lib/sub-agent-registry.js +19 -0
- package/src/lib/telemetry/span-recorder.js +17 -4
- package/src/lib/terminal-context.js +195 -0
- package/src/lib/unattended-action-policy.js +182 -0
- package/src/lib/worktree-cleanup-safety.js +138 -0
- package/src/lib/worktree-isolator.js +8 -0
- package/src/lib/worktree-sparse.js +131 -0
- package/src/repl/agent-repl.js +169 -40
- package/src/runtime/agent-core.js +220 -24
- package/src/runtime/diagnostics.js +60 -0
- package/src/runtime/headless-runner.js +135 -2
- package/src/runtime/headless-stream.js +10 -1
- package/src/runtime/policies/agent-policy.js +5 -0
- package/src/runtime/system-prompt.js +21 -8
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DDPd9qT0.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-BqYwEYou.js +0 -1
- package/src/assets/web-panel/assets/Terminal-4D8tNBO5.js +0 -3
- package/src/assets/web-panel/assets/devWarning-DeIrCfH-.js +0 -1
- package/src/assets/web-panel/assets/index-BxUKMRpP.js +0 -1
- package/src/assets/web-panel/assets/index-DscU9iPI.js +0 -1
package/src/repl/agent-repl.js
CHANGED
|
@@ -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(), {
|
|
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(), {
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
3064
|
-
|
|
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
|
|
3067
|
-
|
|
3068
|
-
|
|
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
|
-
|
|
3071
|
-
|
|
3072
|
-
|
|
3073
|
-
)
|
|
3074
|
-
|
|
3075
|
-
|
|
3076
|
-
|
|
3077
|
-
|
|
3078
|
-
|
|
3079
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
3093
|
-
//
|
|
3094
|
-
//
|
|
3095
|
-
//
|
|
3096
|
-
|
|
3097
|
-
|
|
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
|
|
3101
|
-
|
|
3102
|
-
|
|
3103
|
-
|
|
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
|
-
|
|
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,
|