chainlesschain 0.162.29 → 0.162.31
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 +2 -2
- package/src/assets/web-panel/assets/AIOps-BqWP6FKu.js +1 -0
- package/src/assets/web-panel/assets/AIOps-CSpp7iGY.css +1 -0
- package/src/assets/web-panel/assets/{ActionButton-wRdLFzBQ.js → ActionButton-CXwMgOvX.js} +1 -1
- package/src/assets/web-panel/assets/Analytics-DAebZ4IY.js +3 -0
- package/src/assets/web-panel/assets/Analytics-DJcHjy5J.css +1 -0
- package/src/assets/web-panel/assets/AppLayout-CYsqYoME.js +9 -0
- package/src/assets/web-panel/assets/AppLayout-VlanTjPw.css +1 -0
- package/src/assets/web-panel/assets/Audit-BbTtX1Nf.js +1 -0
- package/src/assets/web-panel/assets/Audit-D8oxP0wr.css +1 -0
- package/src/assets/web-panel/assets/Backup-DgqY2Eb-.js +1 -0
- package/src/assets/web-panel/assets/Backup-Wi9CaP3d.css +1 -0
- package/src/assets/web-panel/assets/BaseInput-Cq2ZuSoO.js +1 -0
- package/src/assets/web-panel/assets/Chat-D2kqpUyO.js +8 -0
- package/src/assets/web-panel/assets/Chat-DDh58PCf.css +1 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-C-svYkrC.js +1 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-gy5SDGw2.css +1 -0
- package/src/assets/web-panel/assets/{Checkbox-DoGqmF9g.js → Checkbox-_9swHpyc.js} +1 -1
- package/src/assets/web-panel/assets/Codegen-BB08p1fn.css +1 -0
- package/src/assets/web-panel/assets/Codegen-Cr9YbCPl.js +1 -0
- package/src/assets/web-panel/assets/{Col-C-9-jORK.js → Col--wdpCMxx.js} +1 -1
- package/src/assets/web-panel/assets/Community-Cbq1nrpo.css +1 -0
- package/src/assets/web-panel/assets/Community-DuFcVnLu.js +1 -0
- package/src/assets/web-panel/assets/{Compact-CemvxU3z.js → Compact-1yzYeT04.js} +1 -1
- package/src/assets/web-panel/assets/Compliance-Dq3aU9Df.js +1 -0
- package/src/assets/web-panel/assets/Compliance-NoXr2Vof.css +1 -0
- package/src/assets/web-panel/assets/Cowork-BlXJRu6L.css +1 -0
- package/src/assets/web-panel/assets/Cowork-CrWcnIg8.js +6 -0
- package/src/assets/web-panel/assets/Cron-Bh6fKZ0h.js +2 -0
- package/src/assets/web-panel/assets/Crosschain-8ofPaWVW.js +1 -0
- package/src/assets/web-panel/assets/Crosschain-CgRAecoR.css +1 -0
- package/src/assets/web-panel/assets/DID-D3EiYm3w.js +2 -0
- package/src/assets/web-panel/assets/DID-DVsYcgvs.css +1 -0
- package/src/assets/web-panel/assets/Dashboard-BFjEdFne.js +3 -0
- package/src/assets/web-panel/assets/Dashboard-CAPSdFR4.css +1 -0
- package/src/assets/web-panel/assets/Dropdown-pYVPcP6O.js +1 -0
- package/src/assets/web-panel/assets/EmailListRenderer-DTPZPx_S.css +1 -0
- package/src/assets/web-panel/assets/EmailListRenderer-zBPodwJ1.js +1 -0
- package/src/assets/web-panel/assets/FamilyGuardDashboard-CyQTW6PW.js +1 -0
- package/src/assets/web-panel/assets/FamilyGuardDashboard-nd3idUVb.css +1 -0
- package/src/assets/web-panel/assets/Federation-Ctaq3zYq.js +1 -0
- package/src/assets/web-panel/assets/Federation-fGN6iMX_.css +1 -0
- package/src/assets/web-panel/assets/FormItemContext-CWYJCLq1.js +2 -0
- package/src/assets/web-panel/assets/GenericCardRenderer-B1g6t9R9.js +1 -0
- package/src/assets/web-panel/assets/GenericCardRenderer-o85VDYQS.css +1 -0
- package/src/assets/web-panel/assets/{Git-DPuaGtg7.css → Git-BdHhxBWR.css} +1 -1
- package/src/assets/web-panel/assets/Git-DH-v8iwd.js +2 -0
- package/src/assets/web-panel/assets/Governance-DtCS4NDm.css +1 -0
- package/src/assets/web-panel/assets/Governance-jZxXvOs5.js +1 -0
- package/src/assets/web-panel/assets/Inference-D07LRghn.js +1 -0
- package/src/assets/web-panel/assets/Inference-t-w0NgIS.css +1 -0
- package/src/assets/web-panel/assets/KnowledgeGraph-4NU1S2Xm.css +1 -0
- package/src/assets/web-panel/assets/KnowledgeGraph-DnGtRZhx.js +1 -0
- package/src/assets/web-panel/assets/Logs-D2pM9C4W.js +2 -0
- package/src/assets/web-panel/assets/Logs-DQbCaYhL.css +1 -0
- package/src/assets/web-panel/assets/Marketplace-Bvo5cuGa.css +1 -0
- package/src/assets/web-panel/assets/Marketplace-UyIO7C7r.js +1 -0
- package/src/assets/web-panel/assets/McpTools-534Q95Mx.css +1 -0
- package/src/assets/web-panel/assets/McpTools-Bf1gvZPf.js +7 -0
- package/src/assets/web-panel/assets/Memory-C1bWj4RN.js +2 -0
- package/src/assets/web-panel/assets/Memory-CleW_R6V.css +1 -0
- package/src/assets/web-panel/assets/MobileBridge-C_Ot1H_a.js +3 -0
- package/src/assets/web-panel/assets/MobileBridge-zJpPuf4E.css +1 -0
- package/src/assets/web-panel/assets/MobileProjects-BD4alw6-.css +1 -0
- package/src/assets/web-panel/assets/MobileProjects-zr-PpsT_.js +1 -0
- package/src/assets/web-panel/assets/Mtc-CXZGO9Sh.css +1 -0
- package/src/assets/web-panel/assets/Mtc-CnzFUz5J.js +6 -0
- package/src/assets/web-panel/assets/MtcAudit-C1JM8esp.css +1 -0
- package/src/assets/web-panel/assets/MtcAudit-CAAh99wz.js +19 -0
- package/src/assets/web-panel/assets/Multisig-BryR2Jpr.css +1 -0
- package/src/assets/web-panel/assets/Multisig-D6IAg6HE.js +13 -0
- package/src/assets/web-panel/assets/NLProgramming-BFMarxb0.js +1 -0
- package/src/assets/web-panel/assets/NLProgramming-DGDHq6Z9.css +1 -0
- package/src/assets/web-panel/assets/Notes-BKKmMtqV.css +1 -0
- package/src/assets/web-panel/assets/Notes-BRp9ro3t.js +7 -0
- package/src/assets/web-panel/assets/NotificationSettings-C0Au3Cxb.js +1 -0
- package/src/assets/web-panel/assets/NotificationSettings-CG3Kfuef.css +1 -0
- package/src/assets/web-panel/assets/OrderTableRenderer-CfrDjSHT.css +1 -0
- package/src/assets/web-panel/assets/OrderTableRenderer-ISp6btRY.js +1 -0
- package/src/assets/web-panel/assets/Organization-DYoxLBRX.js +4 -0
- package/src/assets/web-panel/assets/Organization-LVvqwG0D.css +1 -0
- package/src/assets/web-panel/assets/{Overflow-BFxt7NlK.js → Overflow-rO8JJWGJ.js} +1 -1
- package/src/assets/web-panel/assets/{OverrideContext-C_4H9tGA.js → OverrideContext-C2r4vyBb.js} +1 -1
- package/src/assets/web-panel/assets/P2P-DJleeXIK.js +2 -0
- package/src/assets/web-panel/assets/P2P-DcFvP7F-.css +1 -0
- package/src/assets/web-panel/assets/PdhVaultBrowser-DM5qghFp.js +7 -0
- package/src/assets/web-panel/assets/PdhVaultBrowser-DZZrUOr1.css +1 -0
- package/src/assets/web-panel/assets/Permissions-D5v4Beya.js +4 -0
- package/src/assets/web-panel/assets/Permissions-DsPE_IQy.css +1 -0
- package/src/assets/web-panel/assets/PersonalDataHub-BhpRlh9D.css +1 -0
- package/src/assets/web-panel/assets/PersonalDataHub-c2ZTX0Pv.js +9 -0
- package/src/assets/web-panel/assets/Pipeline-BItr5CyP.css +1 -0
- package/src/assets/web-panel/assets/Pipeline-Crrkyhpz.js +1 -0
- package/src/assets/web-panel/assets/Privacy-DZVyrJKa.js +1 -0
- package/src/assets/web-panel/assets/Privacy-F_ENsxZk.css +1 -0
- package/src/assets/web-panel/assets/ProjectInit-B86LEzDL.css +1 -0
- package/src/assets/web-panel/assets/ProjectInit-DKg7J0gz.js +2 -0
- package/src/assets/web-panel/assets/ProjectSettings-3ndmTvVH.js +2 -0
- package/src/assets/web-panel/assets/ProjectSettings-DK7KA_iX.css +1 -0
- package/src/assets/web-panel/assets/Projects-CmJeUDBW.css +1 -0
- package/src/assets/web-panel/assets/Projects-ll5wnj2L.js +1 -0
- package/src/assets/web-panel/assets/Providers-BeqBVMhB.js +1 -0
- package/src/assets/web-panel/assets/Providers-C6q_fvea.css +1 -0
- package/src/assets/web-panel/assets/QuickAsk-DKAAxzuA.js +1 -0
- package/src/assets/web-panel/assets/Recommend-Byu7IGei.js +1 -0
- package/src/assets/web-panel/assets/Recommend-D_bf91K6.css +1 -0
- package/src/assets/web-panel/assets/Reputation-BKhWAmCu.js +1 -0
- package/src/assets/web-panel/assets/Reputation-DiOsOleI.css +1 -0
- package/src/assets/web-panel/assets/Row-BFtn11O6.js +1 -0
- package/src/assets/web-panel/assets/RssFeed-CjcbkyUb.css +1 -0
- package/src/assets/web-panel/assets/RssFeed-D5a0PT0k.js +3 -0
- package/src/assets/web-panel/assets/Search-DAkuaZNe.js +1 -0
- package/src/assets/web-panel/assets/Search-Klk29S7C.css +1 -0
- package/src/assets/web-panel/assets/Security-BmrukMHn.css +1 -0
- package/src/assets/web-panel/assets/Security-C79Ml2Ms.js +4 -0
- package/src/assets/web-panel/assets/Services-BBk_jH6-.js +2 -0
- package/src/assets/web-panel/assets/Services-DAnVNhUG.css +1 -0
- package/src/assets/web-panel/assets/{Skeleton-DL5ebkDK.js → Skeleton-Cy0VvL0M.js} +1 -1
- package/src/assets/web-panel/assets/Skills-BUu9owbR.css +1 -0
- package/src/assets/web-panel/assets/Skills-OQNky3uI.js +1 -0
- package/src/assets/web-panel/assets/Sla-CbX1f8xN.js +1 -0
- package/src/assets/web-panel/assets/Sla-sodqCU4a.css +1 -0
- package/src/assets/web-panel/assets/SpeechSettings-BIkoUjws.js +1 -0
- package/src/assets/web-panel/assets/SpeechSettings-CgB9nFyq.css +1 -0
- package/src/assets/web-panel/assets/SyncSettings-B3hJqmBP.css +1 -0
- package/src/assets/web-panel/assets/SyncSettings-DG6Swk7G.js +2 -0
- package/src/assets/web-panel/assets/Tasks-C9R8sgyi.js +1 -0
- package/src/assets/web-panel/assets/Tasks-nbTUVXvt.css +1 -0
- package/src/assets/web-panel/assets/Templates-AaJPeCIz.js +1 -0
- package/src/assets/web-panel/assets/Templates-CpFsKk_l.css +1 -0
- package/src/assets/web-panel/assets/Tenant-MuPJnOjk.css +1 -0
- package/src/assets/web-panel/assets/Tenant-jVFRofww.js +1 -0
- package/src/assets/web-panel/assets/Terminal-DHBMzfK6.js +3 -0
- package/src/assets/web-panel/assets/Terminal-DHoveJwj.css +1 -0
- package/src/assets/web-panel/assets/TimelineRenderer-9RFfOHSI.js +1 -0
- package/src/assets/web-panel/assets/TimelineRenderer-BlTAtkOc.css +1 -0
- package/src/assets/web-panel/assets/Tokens-CynVae-o.css +1 -0
- package/src/assets/web-panel/assets/Tokens-ZTfwuABF.js +1 -0
- package/src/assets/web-panel/assets/{Trigger-Rzs-a8Xf.js → Trigger-Xo7uZNQs.js} +1 -1
- package/src/assets/web-panel/assets/Trust-C-WrW0Fj.css +1 -0
- package/src/assets/web-panel/assets/Trust-C0cTPYvn.js +1 -0
- package/src/assets/web-panel/assets/UkeySign-DmMKio71.js +1 -0
- package/src/assets/web-panel/assets/VideoEditing-BDFghpzP.css +1 -0
- package/src/assets/web-panel/assets/VideoEditing-DP7B-oGT.js +1 -0
- package/src/assets/web-panel/assets/Wallet-B1kZDARo.js +4 -0
- package/src/assets/web-panel/assets/Wallet-DUbpTRcg.css +1 -0
- package/src/assets/web-panel/assets/WebAuthn-Bo5kBx27.js +5 -0
- package/src/assets/web-panel/assets/WebAuthn-CVAFRfCQ.css +1 -0
- package/src/assets/web-panel/assets/WorkflowEditor-429lPWYk.css +1 -0
- package/src/assets/web-panel/assets/WorkflowEditor-DGI9SNHH.js +1 -0
- package/src/assets/web-panel/assets/{_getTag-BVc6NQ_K.js → _getTag-DnrRH4E6.js} +1 -1
- package/src/assets/web-panel/assets/{chat-C7tndXfg.js → chat-y97W1CIG.js} +1 -1
- package/src/assets/web-panel/assets/{collapseMotion-DfnRZex1.js → collapseMotion-mxzzcDsg.js} +1 -1
- package/src/assets/web-panel/assets/{colors-dUAGx-eS.js → colors-DtTNo0sH.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-X13u92RU.js → compact-item-D0q0exuS.js} +1 -1
- package/src/assets/web-panel/assets/createContext-D7pLFs2I.js +1 -0
- package/src/assets/web-panel/assets/{debounce-D9xTw4Sx.js → debounce-CFGTTtN3.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BDK34w0I.js +1 -0
- package/src/assets/web-panel/assets/echarts-jxgIOFUZ.js +25 -0
- package/src/assets/web-panel/assets/{hasIn-DGFXWm7Y.js → hasIn-CXjG5B2j.js} +1 -1
- package/src/assets/web-panel/assets/{icons--SBOhPAi.js → icons-DP3uiYxy.js} +4 -4
- package/src/assets/web-panel/assets/{index-Deh_HoQ3.js → index-1dwtkcJv.js} +2 -2
- package/src/assets/web-panel/assets/index-4mWZhCzz.js +1 -0
- package/src/assets/web-panel/assets/index-6np5ESBM.js +1 -0
- package/src/assets/web-panel/assets/{index-Bewc5jaO.js → index-8jxbZupG.js} +1 -1
- package/src/assets/web-panel/assets/{index-DW1GR68q.js → index-B3y_4OdG.js} +1 -1
- package/src/assets/web-panel/assets/index-B4dPdrvC.js +1 -0
- package/src/assets/web-panel/assets/index-B6SaRuCI.js +1 -0
- package/src/assets/web-panel/assets/index-B9ekWb3I.js +1 -0
- package/src/assets/web-panel/assets/index-BJUf19Wd.js +73 -0
- package/src/assets/web-panel/assets/index-BO644Q4S.js +21 -0
- package/src/assets/web-panel/assets/index-BPXhU-jp.js +7 -0
- package/src/assets/web-panel/assets/index-BU944DeT.js +31 -0
- package/src/assets/web-panel/assets/index-B_hjkMtX.js +3 -0
- package/src/assets/web-panel/assets/index-BdhEYW2a.js +1 -0
- package/src/assets/web-panel/assets/{index-DBfn83eM.js → index-BgmvrPJH.js} +1 -1
- package/src/assets/web-panel/assets/index-BgyrM0UN.js +19 -0
- package/src/assets/web-panel/assets/{index-Cq-fdWWC.js → index-BnLrbXDA.js} +1 -1
- package/src/assets/web-panel/assets/{index-C54Ydkuz.js → index-BqVjUN8b.js} +4 -4
- package/src/assets/web-panel/assets/index-BzCPx1cq.js +21 -0
- package/src/assets/web-panel/assets/index-CFsPe2N7.js +3 -0
- package/src/assets/web-panel/assets/{index-C14mc-46.js → index-CKrbutAQ.js} +1 -1
- package/src/assets/web-panel/assets/index-CSdhC7Qo.js +1 -0
- package/src/assets/web-panel/assets/{index-BqX3jeij.js → index-Cbqu804A.js} +1 -1
- package/src/assets/web-panel/assets/{index-CvlrcZKy.js → index-CkGFqlYX.js} +4 -4
- package/src/assets/web-panel/assets/{index-CfX1DEtk.css → index-Cq93VfoF.css} +1 -1
- package/src/assets/web-panel/assets/index-Ct6xtKkc.js +1 -0
- package/src/assets/web-panel/assets/index-DY6KLlgG.js +1 -0
- package/src/assets/web-panel/assets/index-D_4WcI1V.js +13 -0
- package/src/assets/web-panel/assets/{index-Ced-t9AY.js → index-DjCawXk1.js} +3 -3
- package/src/assets/web-panel/assets/index-Dr45Nm9V.js +55 -0
- package/src/assets/web-panel/assets/index-EaIfumgW.js +1 -0
- package/src/assets/web-panel/assets/index-POaFzYGS.js +1 -0
- package/src/assets/web-panel/assets/index-TrBGgrwG.js +1 -0
- package/src/assets/web-panel/assets/{index-DrH9uW99.js → index-YWOEx3rP.js} +2 -2
- package/src/assets/web-panel/assets/{index-DZMiVgXE.js → index-_3wPBMKt.js} +1 -1
- package/src/assets/web-panel/assets/{index-CBnkvGxd.js → index-aarO4HT9.js} +1 -1
- package/src/assets/web-panel/assets/index-bVJvqDAz.js +1 -0
- package/src/assets/web-panel/assets/{index-BipKV1Yr.js → index-gFLQe31v.js} +2 -2
- package/src/assets/web-panel/assets/index-kvV0f4tV.js +12 -0
- package/src/assets/web-panel/assets/index-qoB3whR9.js +12 -0
- package/src/assets/web-panel/assets/{initDefaultProps-B8zdOlFC.js → initDefaultProps-BnXISaAa.js} +1 -1
- package/src/assets/web-panel/assets/{isPlainObject-_gz-soRW.js → isPlainObject-BWRMT62c.js} +1 -1
- package/src/assets/web-panel/assets/isSymbol-S5WZT7lS.js +1 -0
- package/src/assets/web-panel/assets/motion-ChY7C0zJ.js +11 -0
- package/src/assets/web-panel/assets/{move-BioqdqDn.js → move-ByFZMFM5.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-Cc3pB9Xm.js → mtc-parser-BbAbUB-9.js} +1 -1
- package/src/assets/web-panel/assets/{omit-C1hn14Vc.js → omit-BYeliY1H.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DgVG8oMj.js → pickAttrs-B9dcAKnu.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-cJY6hoXZ.js → placementArrow-D3F_txz7.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DbUdURRx.js → responsiveObserve-ClkwY7wS.js} +1 -1
- package/src/assets/web-panel/assets/{slide-C2OEWnC4.js → slide-BNgy2Eea.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DghgcGqm.js → statusUtils-Bv3heMCD.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-GoQ7uwU1.js → styleChecker-DVdlHbQm.js} +1 -1
- package/src/assets/web-panel/assets/useFlexGapSupport-alrRY5BK.js +1 -0
- package/src/assets/web-panel/assets/{useFs-CZCJDMup.js → useFs-CcVh0-Vu.js} +1 -1
- package/src/assets/web-panel/assets/{useMergedState-WwedrFR0.js → useMergedState-Cl2q1fes.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BjAS9b7w.js → usePersonalDataHub-CkkHPhyq.js} +1 -1
- package/src/assets/web-panel/assets/{useRefs-Cdq8EWeF.js → useRefs-DD9q4mOT.js} +1 -1
- package/src/assets/web-panel/assets/{useState-DGS1NOyn.js → useState-BK4hy8Ma.js} +1 -1
- package/src/assets/web-panel/assets/vendor-BvqAck49.js +42 -0
- package/src/assets/web-panel/assets/vnode-DWi0X9WN.js +1 -0
- package/src/assets/web-panel/assets/{zoom-CzyiNxpd.js → zoom-DCbqxxLH.js} +1 -1
- package/src/assets/web-panel/index.html +4 -4
- package/src/commands/agent.js +306 -1
- package/src/commands/ask.js +35 -1
- package/src/commands/checkpoint.js +239 -0
- package/src/commands/cost.js +114 -0
- package/src/commands/session.js +22 -2
- package/src/index.js +4 -0
- package/src/lib/file-checkpoint.js +300 -0
- package/src/lib/llm-pricing.js +227 -0
- package/src/lib/personal-data-hub-wiring.js +30 -0
- package/src/lib/recent-session.js +72 -0
- package/src/lib/session-picker.js +68 -0
- package/src/repl/agent-repl.js +58 -2
- package/src/repl/chat-repl.js +16 -1
- package/src/runtime/agent-core.js +68 -31
- package/src/runtime/fallback-model.js +109 -0
- package/src/runtime/file-ref-expander.js +258 -0
- package/src/runtime/headless-runner.js +576 -0
- package/src/runtime/headless-stream.js +302 -0
- package/src/runtime/policies/agent-policy.js +6 -0
- package/src/runtime/quiet-stdout.js +35 -0
- package/src/runtime/system-prompt.js +60 -0
- package/src/assets/web-panel/assets/AIOps-BWWsdf3s.js +0 -1
- package/src/assets/web-panel/assets/AIOps-Cchx1iXI.css +0 -1
- package/src/assets/web-panel/assets/Analytics-C1-TXmTC.css +0 -1
- package/src/assets/web-panel/assets/Analytics-CU1ellhG.js +0 -3
- package/src/assets/web-panel/assets/AppLayout-9pWRQa_t.css +0 -1
- package/src/assets/web-panel/assets/AppLayout-cXY-mRTd.js +0 -3
- package/src/assets/web-panel/assets/Audit-6ZMsXmrO.css +0 -1
- package/src/assets/web-panel/assets/Audit-CtQuC6zy.js +0 -1
- package/src/assets/web-panel/assets/Backup-CY9QozR7.css +0 -1
- package/src/assets/web-panel/assets/Backup-WeATa8CV.js +0 -1
- package/src/assets/web-panel/assets/BaseInput-BCu2Cejw.js +0 -1
- package/src/assets/web-panel/assets/Chat-Bj0XPlH8.js +0 -7
- package/src/assets/web-panel/assets/Chat-IlrLB9ZV.css +0 -1
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Bpp2sN9W.js +0 -1
- package/src/assets/web-panel/assets/ChatBubbleRenderer-CO908iBt.css +0 -1
- package/src/assets/web-panel/assets/Codegen-BLP7id2a.css +0 -1
- package/src/assets/web-panel/assets/Codegen-PeBhNei5.js +0 -1
- package/src/assets/web-panel/assets/Community-BvaB_Wcs.js +0 -1
- package/src/assets/web-panel/assets/Community-C2RejeOY.css +0 -1
- package/src/assets/web-panel/assets/Compliance-DOys4Ov1.css +0 -1
- package/src/assets/web-panel/assets/Compliance-DjquEqsU.js +0 -1
- package/src/assets/web-panel/assets/Cowork-Bv6Tm40_.js +0 -6
- package/src/assets/web-panel/assets/Cowork-DsOst4XK.css +0 -1
- package/src/assets/web-panel/assets/Cron-D9fPIXV8.js +0 -2
- package/src/assets/web-panel/assets/Crosschain-C0WilDBF.js +0 -1
- package/src/assets/web-panel/assets/Crosschain-C7Le4Pte.css +0 -1
- package/src/assets/web-panel/assets/DID-BX6k3jZi.css +0 -1
- package/src/assets/web-panel/assets/DID-CiGeAI1K.js +0 -2
- package/src/assets/web-panel/assets/Dashboard-MFDcsVcM.css +0 -1
- package/src/assets/web-panel/assets/Dashboard-zqQuizB8.js +0 -3
- package/src/assets/web-panel/assets/Dropdown-_Mjb8yOR.js +0 -1
- package/src/assets/web-panel/assets/EmailListRenderer-C369EVhV.js +0 -1
- package/src/assets/web-panel/assets/EmailListRenderer-CVJ1j3Ll.css +0 -1
- package/src/assets/web-panel/assets/FamilyGuardDashboard-D8WsrCmn.js +0 -1
- package/src/assets/web-panel/assets/FamilyGuardDashboard-Df-D09Q4.css +0 -1
- package/src/assets/web-panel/assets/Federation-CgmfLbx1.css +0 -1
- package/src/assets/web-panel/assets/Federation-Dq7CrAzj.js +0 -1
- package/src/assets/web-panel/assets/FormItemContext-C7TvuLVK.js +0 -1
- package/src/assets/web-panel/assets/GenericCardRenderer-BJUR1Emh.js +0 -1
- package/src/assets/web-panel/assets/GenericCardRenderer-DtJFcJYl.css +0 -1
- package/src/assets/web-panel/assets/Git-B5MdAp15.js +0 -2
- package/src/assets/web-panel/assets/Governance-BIbPWlSM.js +0 -1
- package/src/assets/web-panel/assets/Governance-BoipmXaM.css +0 -1
- package/src/assets/web-panel/assets/Inference-BWxYJF9-.css +0 -1
- package/src/assets/web-panel/assets/Inference-vOz9J05E.js +0 -1
- package/src/assets/web-panel/assets/KnowledgeGraph-B_vUO-Td.js +0 -1
- package/src/assets/web-panel/assets/KnowledgeGraph-CztPDA96.css +0 -1
- package/src/assets/web-panel/assets/Logs-BwPfxX3p.js +0 -2
- package/src/assets/web-panel/assets/Logs-Gf_Mv9Nx.css +0 -1
- package/src/assets/web-panel/assets/Marketplace-Djp5q9dS.css +0 -1
- package/src/assets/web-panel/assets/Marketplace-T5HNwUjX.js +0 -1
- package/src/assets/web-panel/assets/McpTools-CDjHmzxH.css +0 -1
- package/src/assets/web-panel/assets/McpTools-CuKeBPxy.js +0 -5
- package/src/assets/web-panel/assets/Memory-Bcc2hxOA.css +0 -1
- package/src/assets/web-panel/assets/Memory-DmRW_sTE.js +0 -2
- package/src/assets/web-panel/assets/MobileBridge-DK2N_MJA.js +0 -3
- package/src/assets/web-panel/assets/MobileBridge-DwxX55b_.css +0 -1
- package/src/assets/web-panel/assets/MobileProjects-Ceaxrqzc.css +0 -1
- package/src/assets/web-panel/assets/MobileProjects-wl3bXCnJ.js +0 -1
- package/src/assets/web-panel/assets/Mtc-C8e0941i.js +0 -6
- package/src/assets/web-panel/assets/Mtc-DHwbdUqA.css +0 -1
- package/src/assets/web-panel/assets/MtcAudit-B0x8gahq.css +0 -1
- package/src/assets/web-panel/assets/MtcAudit-Cwigy2IR.js +0 -19
- package/src/assets/web-panel/assets/Multisig-BSfh_ncy.js +0 -7
- package/src/assets/web-panel/assets/Multisig-kwPDnXnl.css +0 -1
- package/src/assets/web-panel/assets/NLProgramming-BwzJAfJg.js +0 -1
- package/src/assets/web-panel/assets/NLProgramming-CLOvy-35.css +0 -1
- package/src/assets/web-panel/assets/Notes-COE2q2gD.css +0 -1
- package/src/assets/web-panel/assets/Notes-uilHH6hE.js +0 -7
- package/src/assets/web-panel/assets/NotificationSettings-Co0e0uEO.css +0 -1
- package/src/assets/web-panel/assets/NotificationSettings-DvM3DTPW.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-BIEm3hZl.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-BnOISpKI.css +0 -1
- package/src/assets/web-panel/assets/Organization-BX-cIO8M.css +0 -1
- package/src/assets/web-panel/assets/Organization-zxWoIwYM.js +0 -4
- package/src/assets/web-panel/assets/P2P-BsbToYKZ.js +0 -2
- package/src/assets/web-panel/assets/P2P-Cx88UaiD.css +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-B9ZGFpn4.css +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-VU8vfhsS.js +0 -7
- package/src/assets/web-panel/assets/Permissions-C10Sd26B.js +0 -4
- package/src/assets/web-panel/assets/Permissions-C9WlkGl-.css +0 -1
- package/src/assets/web-panel/assets/PersonalDataHub-Bz5u9Gth.css +0 -1
- package/src/assets/web-panel/assets/PersonalDataHub-edJB7VeU.js +0 -2
- package/src/assets/web-panel/assets/Pipeline-DxkXqrH2.css +0 -1
- package/src/assets/web-panel/assets/Pipeline-qNmVxn5A.js +0 -1
- package/src/assets/web-panel/assets/Privacy-CrsfSFKd.css +0 -1
- package/src/assets/web-panel/assets/Privacy-h78XF7eO.js +0 -1
- package/src/assets/web-panel/assets/ProjectInit-C9-vm1no.js +0 -2
- package/src/assets/web-panel/assets/ProjectInit-CteEo-wF.css +0 -1
- package/src/assets/web-panel/assets/ProjectSettings-DpDNsQTb.js +0 -2
- package/src/assets/web-panel/assets/ProjectSettings-pLSae-wy.css +0 -1
- package/src/assets/web-panel/assets/Projects-BX-SG9R4.css +0 -1
- package/src/assets/web-panel/assets/Projects-CwU3W4RD.js +0 -1
- package/src/assets/web-panel/assets/Providers-BNI-WkmA.css +0 -1
- package/src/assets/web-panel/assets/Providers-C3KZlUEI.js +0 -1
- package/src/assets/web-panel/assets/QuickAsk-CILvLGze.js +0 -1
- package/src/assets/web-panel/assets/Recommend-CH6wKzGo.css +0 -1
- package/src/assets/web-panel/assets/Recommend-XfFlk3BY.js +0 -1
- package/src/assets/web-panel/assets/Reputation-BqmWvaMD.js +0 -1
- package/src/assets/web-panel/assets/Reputation-D6VPNEd0.css +0 -1
- package/src/assets/web-panel/assets/Row-BEbjCI_X.js +0 -1
- package/src/assets/web-panel/assets/RssFeed-BlFC20eg.css +0 -1
- package/src/assets/web-panel/assets/RssFeed-CFukIl-a.js +0 -3
- package/src/assets/web-panel/assets/Search-B6RalzTB.css +0 -1
- package/src/assets/web-panel/assets/Search-dVPkf1o2.js +0 -1
- package/src/assets/web-panel/assets/Security-13K57V_v.css +0 -1
- package/src/assets/web-panel/assets/Security-DlRFaUrn.js +0 -4
- package/src/assets/web-panel/assets/Services-C8Qs6KXv.css +0 -1
- package/src/assets/web-panel/assets/Services-DKy7AjpA.js +0 -2
- package/src/assets/web-panel/assets/Skills-BEqnpg2j.js +0 -1
- package/src/assets/web-panel/assets/Skills-BdjRyorN.css +0 -1
- package/src/assets/web-panel/assets/Sla-CZ9_lzPI.js +0 -1
- package/src/assets/web-panel/assets/Sla-K19oOyQc.css +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-DVSY_ehZ.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-DYPJTDKz.css +0 -1
- package/src/assets/web-panel/assets/SyncSettings-C6cDrwDR.css +0 -1
- package/src/assets/web-panel/assets/SyncSettings-DgvsRpGt.js +0 -1
- package/src/assets/web-panel/assets/Tasks-BJjN_YEm.css +0 -1
- package/src/assets/web-panel/assets/Tasks-L5qXKsxK.js +0 -1
- package/src/assets/web-panel/assets/Templates-BWTV8-2E.css +0 -1
- package/src/assets/web-panel/assets/Templates-DR4VBx7q.js +0 -1
- package/src/assets/web-panel/assets/Tenant-D3zkSAV0.css +0 -1
- package/src/assets/web-panel/assets/Tenant-jMyaK184.js +0 -1
- package/src/assets/web-panel/assets/Terminal-DA5gjCiE.js +0 -3
- package/src/assets/web-panel/assets/Terminal-G1DrFtKr.css +0 -1
- package/src/assets/web-panel/assets/TimelineRenderer-BM17JHyr.js +0 -1
- package/src/assets/web-panel/assets/TimelineRenderer-DmztdsbF.css +0 -1
- package/src/assets/web-panel/assets/Tokens-BBOdNRHQ.css +0 -1
- package/src/assets/web-panel/assets/Tokens-CCJIrnhi.js +0 -1
- package/src/assets/web-panel/assets/Trust-BHeJEfNG.js +0 -1
- package/src/assets/web-panel/assets/Trust-DeOo0xAh.css +0 -1
- package/src/assets/web-panel/assets/UkeySign-DjcIVRk4.js +0 -1
- package/src/assets/web-panel/assets/VideoEditing-BPhptg3q.js +0 -1
- package/src/assets/web-panel/assets/VideoEditing-DksiizfS.css +0 -1
- package/src/assets/web-panel/assets/Wallet-D_xDgfaz.js +0 -4
- package/src/assets/web-panel/assets/Wallet-gR0ZvZbK.css +0 -1
- package/src/assets/web-panel/assets/WebAuthn-SSh5VhVO.css +0 -1
- package/src/assets/web-panel/assets/WebAuthn-pd961lgM.js +0 -5
- package/src/assets/web-panel/assets/WorkflowEditor-BmXDUZ8M.js +0 -1
- package/src/assets/web-panel/assets/WorkflowEditor-IiwsD8Kh.css +0 -1
- package/src/assets/web-panel/assets/createContext-BBLoTzN8.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CNIS3FrJ.js +0 -1
- package/src/assets/web-panel/assets/echarts-Dj_pBaVI.js +0 -19
- package/src/assets/web-panel/assets/favicon-FSU2gSy6.ico +0 -0
- package/src/assets/web-panel/assets/index-1xUFGcnI.js +0 -21
- package/src/assets/web-panel/assets/index-4BeUpRaU.js +0 -1
- package/src/assets/web-panel/assets/index-AVHrO1io.js +0 -21
- package/src/assets/web-panel/assets/index-B2fc2n_u.js +0 -3
- package/src/assets/web-panel/assets/index-B5aXiiOG.js +0 -1
- package/src/assets/web-panel/assets/index-B78VsLFL.js +0 -1
- package/src/assets/web-panel/assets/index-BECv44dY.js +0 -12
- package/src/assets/web-panel/assets/index-BGn5-2TK.js +0 -1
- package/src/assets/web-panel/assets/index-BM9IHnrf.js +0 -13
- package/src/assets/web-panel/assets/index-BlMshk9V.js +0 -1
- package/src/assets/web-panel/assets/index-BoWoWh9f.js +0 -19
- package/src/assets/web-panel/assets/index-Bt79ud6Y.js +0 -1
- package/src/assets/web-panel/assets/index-CO9Tt0Bo.js +0 -1
- package/src/assets/web-panel/assets/index-CSZvB2uy.js +0 -12
- package/src/assets/web-panel/assets/index-CjeazYU2.js +0 -1
- package/src/assets/web-panel/assets/index-Cw-TEBru.js +0 -1
- package/src/assets/web-panel/assets/index-CyObfnlZ.js +0 -3
- package/src/assets/web-panel/assets/index-D0d2TS5o.js +0 -69
- package/src/assets/web-panel/assets/index-DV3zNhRX.js +0 -1
- package/src/assets/web-panel/assets/index-DnHElN_A.js +0 -7
- package/src/assets/web-panel/assets/index-DspW4reY.js +0 -55
- package/src/assets/web-panel/assets/index-DxUFdvJ5.js +0 -1
- package/src/assets/web-panel/assets/index-La4F-U-s.js +0 -1
- package/src/assets/web-panel/assets/index-azbNWBMo.js +0 -1
- package/src/assets/web-panel/assets/index-squRDiXd.js +0 -31
- package/src/assets/web-panel/assets/isSymbol-DAy2hlR5.js +0 -1
- package/src/assets/web-panel/assets/motion-ChVLXdRp.js +0 -11
- package/src/assets/web-panel/assets/useFlexGapSupport-CzD0s7wN.js +0 -1
- package/src/assets/web-panel/assets/vendor-DhFY8mDK.js +0 -1
- package/src/assets/web-panel/assets/vnode-CnXQ7gJ2.js +0 -1
- package/src/assets/web-panel/assets/warning-Pq00owYb.js +0 -1
package/src/commands/agent.js
CHANGED
|
@@ -6,7 +6,56 @@
|
|
|
6
6
|
* AI reads files, writes code, runs commands, and explains what it's doing.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
import fs from "node:fs";
|
|
9
11
|
import { createAgentRuntimeFactory } from "../runtime/runtime-factory.js";
|
|
12
|
+
import { resolvePromptText } from "../runtime/system-prompt.js";
|
|
13
|
+
import { makeFallbackChatFn } from "../runtime/fallback-model.js";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Resolve + validate `--add-dir` values into absolute, existing, de-duped
|
|
17
|
+
* directories. Invalid entries are skipped with a stderr warning rather than
|
|
18
|
+
* aborting the run. Relative paths resolve against the process cwd.
|
|
19
|
+
*
|
|
20
|
+
* @param {string[]} [rawDirs]
|
|
21
|
+
* @returns {string[]} absolute directory paths
|
|
22
|
+
*/
|
|
23
|
+
export function resolveAddDirs(rawDirs) {
|
|
24
|
+
const out = [];
|
|
25
|
+
for (const d of rawDirs || []) {
|
|
26
|
+
const abs = path.resolve(process.cwd(), d);
|
|
27
|
+
try {
|
|
28
|
+
if (fs.existsSync(abs) && fs.statSync(abs).isDirectory()) {
|
|
29
|
+
if (!out.includes(abs)) out.push(abs);
|
|
30
|
+
} else {
|
|
31
|
+
process.stderr.write(`--add-dir: skipping non-directory "${d}"\n`);
|
|
32
|
+
}
|
|
33
|
+
} catch {
|
|
34
|
+
process.stderr.write(`--add-dir: skipping unreadable "${d}"\n`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Read all of stdin as a UTF-8 string. Resolves "" immediately when stdin is a
|
|
42
|
+
* TTY (nothing piped) so we never block an interactive invocation.
|
|
43
|
+
*/
|
|
44
|
+
function readStdin() {
|
|
45
|
+
return new Promise((resolve) => {
|
|
46
|
+
if (process.stdin.isTTY) {
|
|
47
|
+
resolve("");
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
let data = "";
|
|
51
|
+
process.stdin.setEncoding("utf8");
|
|
52
|
+
process.stdin.on("data", (chunk) => {
|
|
53
|
+
data += chunk;
|
|
54
|
+
});
|
|
55
|
+
process.stdin.on("end", () => resolve(data));
|
|
56
|
+
process.stdin.on("error", () => resolve(data));
|
|
57
|
+
});
|
|
58
|
+
}
|
|
10
59
|
|
|
11
60
|
export function registerAgentCommand(program) {
|
|
12
61
|
program
|
|
@@ -15,6 +64,10 @@ export function registerAgentCommand(program) {
|
|
|
15
64
|
.description(
|
|
16
65
|
"Start an agentic AI session (reads/writes files, runs commands)",
|
|
17
66
|
)
|
|
67
|
+
.argument(
|
|
68
|
+
"[task...]",
|
|
69
|
+
"Headless task — when given (or with -p / piped stdin), runs non-interactively",
|
|
70
|
+
)
|
|
18
71
|
.option("--model <model>", "Model name")
|
|
19
72
|
.option(
|
|
20
73
|
"--provider <provider>",
|
|
@@ -23,6 +76,19 @@ export function registerAgentCommand(program) {
|
|
|
23
76
|
.option("--base-url <url>", "API base URL")
|
|
24
77
|
.option("--api-key <key>", "API key")
|
|
25
78
|
.option("--session <id>", "Resume a previous agent session")
|
|
79
|
+
.option(
|
|
80
|
+
"-c, --continue",
|
|
81
|
+
"Resume the most recent session (no id needed — claude --continue parity)",
|
|
82
|
+
)
|
|
83
|
+
.option(
|
|
84
|
+
"--resume [id]",
|
|
85
|
+
"Resume a session by id (no id → most recent — claude --resume parity)",
|
|
86
|
+
)
|
|
87
|
+
.option(
|
|
88
|
+
"--add-dir <dir>",
|
|
89
|
+
"Extra working directory the agent may read/search/edit (repeatable)",
|
|
90
|
+
(val, prev) => (prev || []).concat([val]),
|
|
91
|
+
)
|
|
26
92
|
.option("--agent-id <id>", "Agent id for scoped memory recall")
|
|
27
93
|
.option("--recall-limit <n>", "Top-K memories to inject into system prompt")
|
|
28
94
|
.option("--recall-query <q>", "Query string for startup memory recall")
|
|
@@ -36,7 +102,235 @@ export function registerAgentCommand(program) {
|
|
|
36
102
|
"--bundle <path>",
|
|
37
103
|
"Agent bundle directory (chainless-agent.toml + AGENTS.md + skills/ + mcp.json + USER.md)",
|
|
38
104
|
)
|
|
39
|
-
|
|
105
|
+
// ── Headless / print mode (Claude-Code `claude -p` parity) ───────────
|
|
106
|
+
.option(
|
|
107
|
+
"-p, --print [prompt]",
|
|
108
|
+
"Headless: run one non-interactive turn and exit",
|
|
109
|
+
)
|
|
110
|
+
.option(
|
|
111
|
+
"--output-format <fmt>",
|
|
112
|
+
"Headless output: text | json | stream-json",
|
|
113
|
+
"text",
|
|
114
|
+
)
|
|
115
|
+
.option("--max-turns <n>", "Cap agent loop iterations (headless)")
|
|
116
|
+
.option(
|
|
117
|
+
"--allowed-tools <list>",
|
|
118
|
+
"Comma/space-separated tool allow-list (headless)",
|
|
119
|
+
)
|
|
120
|
+
.option(
|
|
121
|
+
"--disallowed-tools <list>",
|
|
122
|
+
"Comma/space-separated tool deny-list (headless)",
|
|
123
|
+
)
|
|
124
|
+
.option(
|
|
125
|
+
"--permission-mode <mode>",
|
|
126
|
+
"default | plan | acceptEdits | bypassPermissions (headless)",
|
|
127
|
+
)
|
|
128
|
+
.option(
|
|
129
|
+
"--no-file-refs",
|
|
130
|
+
"Disable @path file-reference expansion in the prompt (headless)",
|
|
131
|
+
)
|
|
132
|
+
.option(
|
|
133
|
+
"--system-prompt <text>",
|
|
134
|
+
"Replace the built-in system prompt (literal text or @file)",
|
|
135
|
+
)
|
|
136
|
+
.option(
|
|
137
|
+
"--append-system-prompt <text>",
|
|
138
|
+
"Append extra guidance to the system prompt (literal text or @file)",
|
|
139
|
+
)
|
|
140
|
+
.option(
|
|
141
|
+
"--input-format <fmt>",
|
|
142
|
+
"Headless input: text | stream-json (NDJSON user events on stdin, multi-turn)",
|
|
143
|
+
"text",
|
|
144
|
+
)
|
|
145
|
+
.option(
|
|
146
|
+
"--fallback-model <model>",
|
|
147
|
+
"Retry once on this model when the primary fails (overload/network)",
|
|
148
|
+
)
|
|
149
|
+
.action(async (task, options) => {
|
|
150
|
+
// `--continue` / `--resume` resolve a session id so the user need not
|
|
151
|
+
// copy it. Explicit `--session <id>` always wins. `--resume <id>` targets
|
|
152
|
+
// a specific session; `--continue` or a bare `--resume` pick the most
|
|
153
|
+
// recent. All three funnel into `options.session`, which both the headless
|
|
154
|
+
// runner and the interactive runtime use to replay prior history.
|
|
155
|
+
if (typeof options.resume === "string" && !options.session) {
|
|
156
|
+
options.session = options.resume;
|
|
157
|
+
}
|
|
158
|
+
if ((options.continue || options.resume === true) && !options.session) {
|
|
159
|
+
const { bootstrap } = await import("../runtime/bootstrap.js");
|
|
160
|
+
const ctx = await bootstrap({ verbose: program.opts().verbose });
|
|
161
|
+
// Headless intent also means "no interactive picker is possible": -p,
|
|
162
|
+
// a positional task, an explicit --output-format, or a non-TTY stdin.
|
|
163
|
+
const headlessIntent =
|
|
164
|
+
options.print !== undefined ||
|
|
165
|
+
(Array.isArray(task) && task.length > 0) ||
|
|
166
|
+
options.outputFormat !== "text" ||
|
|
167
|
+
!process.stdin.isTTY;
|
|
168
|
+
if (headlessIntent) {
|
|
169
|
+
// Headless replays the JSONL store only, so resolve "most recent"
|
|
170
|
+
// from there — a DB-only id would resume into an empty transcript.
|
|
171
|
+
const { getLastSessionId } =
|
|
172
|
+
await import("../harness/jsonl-session-store.js");
|
|
173
|
+
options.session = getLastSessionId();
|
|
174
|
+
} else {
|
|
175
|
+
// Interactive: picker across both stores (agent REPL rebuilds either).
|
|
176
|
+
const { pickRecentSession } =
|
|
177
|
+
await import("../lib/session-picker.js");
|
|
178
|
+
const picked = await pickRecentSession(ctx, {
|
|
179
|
+
message: "Resume which agent session?",
|
|
180
|
+
});
|
|
181
|
+
options.session = picked.id;
|
|
182
|
+
}
|
|
183
|
+
if (!options.session) {
|
|
184
|
+
process.stderr.write(
|
|
185
|
+
"No previous session to continue. Start one with `cc agent`.\n",
|
|
186
|
+
);
|
|
187
|
+
process.exit(1);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Extra workspace roots (--add-dir) — shared by headless + interactive.
|
|
192
|
+
const additionalDirectories = resolveAddDirs(options.addDir);
|
|
193
|
+
|
|
194
|
+
// --fallback-model: a chatFn that retries once on the backup model when
|
|
195
|
+
// the primary errors out (overload / rate-limit / network). Passed into
|
|
196
|
+
// the headless runners via options.chatFn (the agent loop's seam), so no
|
|
197
|
+
// runner changes are needed. Notice goes to stderr to keep stdout clean.
|
|
198
|
+
const fallbackChatFn = options.fallbackModel
|
|
199
|
+
? makeFallbackChatFn({
|
|
200
|
+
fallbackModel: options.fallbackModel,
|
|
201
|
+
onFallback: ({ from, to, error }) =>
|
|
202
|
+
process.stderr.write(
|
|
203
|
+
`Note: model "${from}" failed (${error}); retrying with --fallback-model "${to}".\n`,
|
|
204
|
+
),
|
|
205
|
+
})
|
|
206
|
+
: undefined;
|
|
207
|
+
|
|
208
|
+
// ── Streaming-input mode (--input-format stream-json) ────────────────
|
|
209
|
+
// A persistent multi-turn conversation driven by NDJSON user events on
|
|
210
|
+
// stdin; output is always NDJSON. Routed before single-prompt handling
|
|
211
|
+
// so stdin is consumed as events, not as one prompt.
|
|
212
|
+
if (options.inputFormat === "stream-json") {
|
|
213
|
+
const { runAgentHeadlessStream } =
|
|
214
|
+
await import("../runtime/headless-stream.js");
|
|
215
|
+
const { parseToolList } = await import("../runtime/headless-runner.js");
|
|
216
|
+
const cwd = process.cwd();
|
|
217
|
+
let outcome;
|
|
218
|
+
try {
|
|
219
|
+
outcome = await runAgentHeadlessStream({
|
|
220
|
+
model: options.model,
|
|
221
|
+
provider: options.provider,
|
|
222
|
+
baseUrl: options.baseUrl,
|
|
223
|
+
apiKey: options.apiKey,
|
|
224
|
+
sessionId: options.session,
|
|
225
|
+
permissionMode: options.permissionMode,
|
|
226
|
+
allowedTools: parseToolList(options.allowedTools),
|
|
227
|
+
disallowedTools: parseToolList(options.disallowedTools),
|
|
228
|
+
additionalDirectories,
|
|
229
|
+
maxTurns: options.maxTurns
|
|
230
|
+
? parseInt(options.maxTurns, 10)
|
|
231
|
+
: undefined,
|
|
232
|
+
expandFileRefs: options.fileRefs !== false,
|
|
233
|
+
systemPrompt: resolvePromptText(options.systemPrompt, { cwd }),
|
|
234
|
+
appendSystemPrompt: resolvePromptText(options.appendSystemPrompt, {
|
|
235
|
+
cwd,
|
|
236
|
+
}),
|
|
237
|
+
chatFn: fallbackChatFn,
|
|
238
|
+
});
|
|
239
|
+
} catch (err) {
|
|
240
|
+
process.stderr.write(`Error: ${err.message}\n`);
|
|
241
|
+
process.exit(1);
|
|
242
|
+
}
|
|
243
|
+
process.exit(outcome.exitCode);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
if (options.inputFormat && options.inputFormat !== "text") {
|
|
247
|
+
process.stderr.write(
|
|
248
|
+
`Invalid --input-format "${options.inputFormat}". Expected: text | stream-json.\n`,
|
|
249
|
+
);
|
|
250
|
+
process.exit(1);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// Resolve the headless prompt from: --print value, positional task, or
|
|
254
|
+
// piped stdin (in that precedence). Any of them → headless mode.
|
|
255
|
+
const positional =
|
|
256
|
+
Array.isArray(task) && task.length > 0 ? task.join(" ") : "";
|
|
257
|
+
let prompt = "";
|
|
258
|
+
if (typeof options.print === "string" && options.print.trim()) {
|
|
259
|
+
prompt = options.print.trim();
|
|
260
|
+
} else if (positional) {
|
|
261
|
+
prompt = positional;
|
|
262
|
+
}
|
|
263
|
+
// -p with no inline value, or an explicit --output-format, signals
|
|
264
|
+
// headless intent; pull the prompt from piped stdin when one is present.
|
|
265
|
+
const wantsHeadless =
|
|
266
|
+
options.print !== undefined ||
|
|
267
|
+
Boolean(positional) ||
|
|
268
|
+
options.outputFormat !== "text";
|
|
269
|
+
if (!prompt && (wantsHeadless || !process.stdin.isTTY)) {
|
|
270
|
+
const piped = (await readStdin()).trim();
|
|
271
|
+
if (piped) prompt = piped;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
if (prompt) {
|
|
275
|
+
// Resume requested onto a session with no headless (JSONL) transcript?
|
|
276
|
+
// Warn instead of silently starting empty — headless resume rebuilds
|
|
277
|
+
// from the JSONL store only (DB-only sessions are not replayable here).
|
|
278
|
+
const resumeRequested =
|
|
279
|
+
Boolean(options.continue) || options.resume !== undefined;
|
|
280
|
+
if (resumeRequested && options.session) {
|
|
281
|
+
const { sessionExists } =
|
|
282
|
+
await import("../harness/jsonl-session-store.js");
|
|
283
|
+
if (!sessionExists(options.session)) {
|
|
284
|
+
process.stderr.write(
|
|
285
|
+
`Note: no headless transcript for session "${options.session}" — ` +
|
|
286
|
+
"starting fresh (headless resume reads JSONL sessions only).\n",
|
|
287
|
+
);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
const { runAgentHeadless, parseToolList } =
|
|
291
|
+
await import("../runtime/headless-runner.js");
|
|
292
|
+
const maxTurns = options.maxTurns
|
|
293
|
+
? parseInt(options.maxTurns, 10)
|
|
294
|
+
: undefined;
|
|
295
|
+
let outcome;
|
|
296
|
+
try {
|
|
297
|
+
outcome = await runAgentHeadless({
|
|
298
|
+
prompt,
|
|
299
|
+
model: options.model,
|
|
300
|
+
provider: options.provider,
|
|
301
|
+
baseUrl: options.baseUrl,
|
|
302
|
+
apiKey: options.apiKey,
|
|
303
|
+
sessionId: options.session,
|
|
304
|
+
// A resolved --session/--continue/--resume id means "replay this
|
|
305
|
+
// conversation and persist the new turns"; the runner loads prior
|
|
306
|
+
// history when the id already exists and creates it otherwise.
|
|
307
|
+
resume: options.session,
|
|
308
|
+
outputFormat: options.outputFormat,
|
|
309
|
+
permissionMode: options.permissionMode,
|
|
310
|
+
allowedTools: parseToolList(options.allowedTools),
|
|
311
|
+
disallowedTools: parseToolList(options.disallowedTools),
|
|
312
|
+
additionalDirectories,
|
|
313
|
+
maxTurns,
|
|
314
|
+
// commander maps --no-file-refs → options.fileRefs === false
|
|
315
|
+
expandFileRefs: options.fileRefs !== false,
|
|
316
|
+
// --system-prompt / --append-system-prompt (literal or @file)
|
|
317
|
+
systemPrompt: resolvePromptText(options.systemPrompt, {
|
|
318
|
+
cwd: process.cwd(),
|
|
319
|
+
}),
|
|
320
|
+
appendSystemPrompt: resolvePromptText(options.appendSystemPrompt, {
|
|
321
|
+
cwd: process.cwd(),
|
|
322
|
+
}),
|
|
323
|
+
// --fallback-model: retry once on a backup model on transient errors
|
|
324
|
+
chatFn: fallbackChatFn,
|
|
325
|
+
});
|
|
326
|
+
} catch (err) {
|
|
327
|
+
process.stderr.write(`Error: ${err.message}\n`);
|
|
328
|
+
process.exit(1);
|
|
329
|
+
}
|
|
330
|
+
process.exit(outcome.exitCode);
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
|
|
40
334
|
const runtime = createAgentRuntimeFactory().createAgentRuntime({
|
|
41
335
|
model: options.model,
|
|
42
336
|
provider: options.provider,
|
|
@@ -50,6 +344,17 @@ export function registerAgentCommand(program) {
|
|
|
50
344
|
noStream: options.stream === false, // true when --no-stream
|
|
51
345
|
parkOnExit: options.parkOnExit, // false when --no-park-on-exit
|
|
52
346
|
bundlePath: options.bundle || null,
|
|
347
|
+
additionalDirectories,
|
|
348
|
+
// --system-prompt / --append-system-prompt (literal or @file) also
|
|
349
|
+
// apply to interactive sessions, composed in startAgentRepl.
|
|
350
|
+
systemPrompt: resolvePromptText(options.systemPrompt, {
|
|
351
|
+
cwd: process.cwd(),
|
|
352
|
+
}),
|
|
353
|
+
appendSystemPrompt: resolvePromptText(options.appendSystemPrompt, {
|
|
354
|
+
cwd: process.cwd(),
|
|
355
|
+
}),
|
|
356
|
+
// --fallback-model also applies interactively (wrapper built in the REPL)
|
|
357
|
+
fallbackModel: options.fallbackModel || null,
|
|
53
358
|
});
|
|
54
359
|
await runtime.startAgentSession();
|
|
55
360
|
});
|
package/src/commands/ask.js
CHANGED
|
@@ -25,9 +25,28 @@ import ora from "ora";
|
|
|
25
25
|
import { logger } from "../lib/logger.js";
|
|
26
26
|
import { BUILT_IN_PROVIDERS } from "../lib/llm-providers.js";
|
|
27
27
|
import { loadConfig } from "../lib/config-manager.js";
|
|
28
|
+
import { expandFileRefs } from "../runtime/file-ref-expander.js";
|
|
28
29
|
|
|
29
30
|
const ANDROID_LOCAL_OLLAMA_URL = "http://127.0.0.1:18484";
|
|
30
31
|
|
|
32
|
+
/**
|
|
33
|
+
* Expand `@path` file references in the question (Claude-Code parity), unless
|
|
34
|
+
* disabled. Returns the (possibly augmented) prompt plus any warnings for
|
|
35
|
+
* typo'd paths. Exported so the wiring is unit-testable without a live LLM.
|
|
36
|
+
*
|
|
37
|
+
* @param {string} question
|
|
38
|
+
* @param {object} [opts] { cwd, enabled }
|
|
39
|
+
* @returns {{ prompt:string, warnings:string[] }}
|
|
40
|
+
*/
|
|
41
|
+
export function expandQuestionRefs(
|
|
42
|
+
question,
|
|
43
|
+
{ cwd = process.cwd(), enabled = true } = {},
|
|
44
|
+
) {
|
|
45
|
+
if (!enabled) return { prompt: question, warnings: [] };
|
|
46
|
+
const { prompt, warnings } = expandFileRefs(question, { cwd });
|
|
47
|
+
return { prompt, warnings };
|
|
48
|
+
}
|
|
49
|
+
|
|
31
50
|
/**
|
|
32
51
|
* Resolve effective Ollama base URL given CLI options, env, and config.
|
|
33
52
|
* Exported for unit testing.
|
|
@@ -144,6 +163,10 @@ export function registerAskCommand(program) {
|
|
|
144
163
|
"--prefer-android-local",
|
|
145
164
|
"Route ollama provider at the Android in-APK LocalLlmServer (127.0.0.1:18484). One-shot equivalent of `cc config set llm.preferAndroidLocal true`.",
|
|
146
165
|
)
|
|
166
|
+
.option(
|
|
167
|
+
"--no-file-refs",
|
|
168
|
+
"Do not expand @path file references in the question",
|
|
169
|
+
)
|
|
147
170
|
.option("--json", "Output as JSON")
|
|
148
171
|
.action(async (question, options) => {
|
|
149
172
|
const config = loadConfig();
|
|
@@ -167,9 +190,20 @@ export function registerAskCommand(program) {
|
|
|
167
190
|
resolvedOptions.baseUrl = options.baseUrl || config.llm?.baseUrl;
|
|
168
191
|
}
|
|
169
192
|
|
|
193
|
+
// Expand @path references (e.g. `cc ask "summarize @notes.md"`) before
|
|
194
|
+
// sending to the model. The original question is preserved for --json
|
|
195
|
+
// output; only the LLM sees the injected file contents.
|
|
196
|
+
const { prompt: expandedQuestion, warnings } = expandQuestionRefs(
|
|
197
|
+
question,
|
|
198
|
+
{ enabled: options.fileRefs !== false },
|
|
199
|
+
);
|
|
200
|
+
for (const w of warnings) {
|
|
201
|
+
process.stderr.write(`[@ref] ${w}\n`);
|
|
202
|
+
}
|
|
203
|
+
|
|
170
204
|
const spinner = ora("Thinking...").start();
|
|
171
205
|
try {
|
|
172
|
-
const answer = await queryLLM(
|
|
206
|
+
const answer = await queryLLM(expandedQuestion, resolvedOptions);
|
|
173
207
|
|
|
174
208
|
spinner.stop();
|
|
175
209
|
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cc checkpoint — manual file-state snapshot / rewind (Claude-Code rewind parity).
|
|
3
|
+
*
|
|
4
|
+
* cc checkpoint create <paths...> [--label <l>] snapshot files/dirs
|
|
5
|
+
* cc checkpoint list list checkpoints
|
|
6
|
+
* cc checkpoint show <id> [--diff] manifest, or diff vs current
|
|
7
|
+
* cc checkpoint restore <id> [--dry-run] [--force] roll files back
|
|
8
|
+
* cc checkpoint delete <id> [--force] remove a checkpoint
|
|
9
|
+
*
|
|
10
|
+
* Restore takes an automatic safety snapshot of the current contents first, so
|
|
11
|
+
* a rewind is itself reversible. Distinct from `cc workflow checkpoint`
|
|
12
|
+
* (workflow execution state, not files).
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import chalk from "chalk";
|
|
16
|
+
import { logger } from "../lib/logger.js";
|
|
17
|
+
|
|
18
|
+
export function registerCheckpointCommand(program) {
|
|
19
|
+
const cp = program
|
|
20
|
+
.command("checkpoint")
|
|
21
|
+
.description("Snapshot / rewind file state (manual checkpoints)");
|
|
22
|
+
|
|
23
|
+
cp.command("create <paths...>")
|
|
24
|
+
.description("Snapshot the given files/directories")
|
|
25
|
+
.option("--label <label>", "Human label for this checkpoint")
|
|
26
|
+
.option("--json", "Output as JSON")
|
|
27
|
+
.action(async (paths, options) => {
|
|
28
|
+
try {
|
|
29
|
+
const { createCheckpoint } = await import("../lib/file-checkpoint.js");
|
|
30
|
+
const m = createCheckpoint(paths, { label: options.label });
|
|
31
|
+
if (options.json) {
|
|
32
|
+
console.log(JSON.stringify(m, null, 2));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
logger.log(
|
|
36
|
+
chalk.green(`✓ checkpoint ${chalk.bold(m.id)}`) +
|
|
37
|
+
(m.label ? chalk.gray(` "${m.label}"`) : ""),
|
|
38
|
+
);
|
|
39
|
+
logger.log(chalk.gray(` ${m.fileCount} file(s) snapshotted`));
|
|
40
|
+
} catch (err) {
|
|
41
|
+
logger.error(chalk.red(`checkpoint create failed: ${err.message}`));
|
|
42
|
+
process.exitCode = 1;
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
cp.command("list")
|
|
47
|
+
.alias("ls")
|
|
48
|
+
.description("List checkpoints (newest first)")
|
|
49
|
+
.option("--json", "Output as JSON")
|
|
50
|
+
.action(async (options) => {
|
|
51
|
+
try {
|
|
52
|
+
const { listCheckpoints } = await import("../lib/file-checkpoint.js");
|
|
53
|
+
const all = listCheckpoints();
|
|
54
|
+
if (options.json) {
|
|
55
|
+
console.log(JSON.stringify(all, null, 2));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (all.length === 0) {
|
|
59
|
+
logger.log(
|
|
60
|
+
chalk.gray(
|
|
61
|
+
"No checkpoints. Create one: cc checkpoint create <paths...>",
|
|
62
|
+
),
|
|
63
|
+
);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
for (const c of all) {
|
|
67
|
+
logger.log(
|
|
68
|
+
`${chalk.cyan(c.id.padEnd(22))} ${chalk.gray(c.createdAt)} ` +
|
|
69
|
+
`${String(c.fileCount).padStart(4)} files` +
|
|
70
|
+
(c.label ? chalk.gray(` "${c.label}"`) : ""),
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
} catch (err) {
|
|
74
|
+
logger.error(chalk.red(`checkpoint list failed: ${err.message}`));
|
|
75
|
+
process.exitCode = 1;
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
cp.command("show <id>")
|
|
80
|
+
.description("Show a checkpoint's files, or its diff vs current state")
|
|
81
|
+
.option("--diff", "Compare snapshot against current on-disk files")
|
|
82
|
+
.option("--json", "Output as JSON")
|
|
83
|
+
.action(async (id, options) => {
|
|
84
|
+
try {
|
|
85
|
+
const { getCheckpoint, diffCheckpoint } =
|
|
86
|
+
await import("../lib/file-checkpoint.js");
|
|
87
|
+
if (options.diff) {
|
|
88
|
+
const d = diffCheckpoint(id);
|
|
89
|
+
if (options.json) {
|
|
90
|
+
console.log(JSON.stringify(d, null, 2));
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
logger.log(chalk.bold(`Diff vs current — ${id}`));
|
|
94
|
+
logger.log(` ${chalk.yellow("modified")}: ${d.modified.length}`);
|
|
95
|
+
d.modified.forEach((f) => logger.log(chalk.yellow(` M ${f}`)));
|
|
96
|
+
logger.log(` ${chalk.red("deleted")}: ${d.deleted.length}`);
|
|
97
|
+
d.deleted.forEach((f) => logger.log(chalk.red(` D ${f}`)));
|
|
98
|
+
logger.log(chalk.gray(` unchanged: ${d.unchanged.length}`));
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const m = getCheckpoint(id);
|
|
102
|
+
if (!m) {
|
|
103
|
+
logger.error(chalk.red(`no such checkpoint: ${id}`));
|
|
104
|
+
process.exitCode = 1;
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (options.json) {
|
|
108
|
+
console.log(JSON.stringify(m, null, 2));
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
logger.log(chalk.bold(`Checkpoint ${m.id}`));
|
|
112
|
+
if (m.label) logger.log(chalk.gray(` label: ${m.label}`));
|
|
113
|
+
logger.log(
|
|
114
|
+
chalk.gray(` created: ${m.createdAt} files: ${m.fileCount}`),
|
|
115
|
+
);
|
|
116
|
+
for (const f of m.files) {
|
|
117
|
+
logger.log(` ${chalk.gray(String(f.bytes).padStart(8))} ${f.rel}`);
|
|
118
|
+
}
|
|
119
|
+
} catch (err) {
|
|
120
|
+
logger.error(chalk.red(`checkpoint show failed: ${err.message}`));
|
|
121
|
+
process.exitCode = 1;
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
cp.command("restore <id>")
|
|
126
|
+
.description(
|
|
127
|
+
"Restore files from a checkpoint (auto-snapshots current state first)",
|
|
128
|
+
)
|
|
129
|
+
.option("--dry-run", "Show what would change without writing")
|
|
130
|
+
.option("--force", "Restore without the interactive confirm prompt")
|
|
131
|
+
.option("--json", "Output as JSON")
|
|
132
|
+
.action(async (id, options) => {
|
|
133
|
+
try {
|
|
134
|
+
const { restoreCheckpoint, diffCheckpoint } =
|
|
135
|
+
await import("../lib/file-checkpoint.js");
|
|
136
|
+
|
|
137
|
+
if (options.dryRun) {
|
|
138
|
+
const r = restoreCheckpoint(id, { dryRun: true });
|
|
139
|
+
if (options.json) {
|
|
140
|
+
console.log(JSON.stringify(r, null, 2));
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
logger.log(chalk.bold(`Dry-run restore — ${id}`));
|
|
144
|
+
logger.log(` would restore: ${r.restored.length} file(s)`);
|
|
145
|
+
r.restored.forEach((f) => logger.log(chalk.yellow(` ~ ${f}`)));
|
|
146
|
+
logger.log(chalk.gray(` already matching: ${r.unchanged.length}`));
|
|
147
|
+
if (r.missingBlob.length) {
|
|
148
|
+
logger.log(
|
|
149
|
+
chalk.red(` missing blobs: ${r.missingBlob.join(", ")}`),
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Destructive: overwrites current files. Require --force when not a TTY;
|
|
156
|
+
// prompt when interactive.
|
|
157
|
+
if (!options.force) {
|
|
158
|
+
const d = diffCheckpoint(id);
|
|
159
|
+
const willChange = d.modified.length + d.deleted.length;
|
|
160
|
+
if (process.stdin.isTTY) {
|
|
161
|
+
const { confirm } = await import("@inquirer/prompts");
|
|
162
|
+
const ok = await confirm({
|
|
163
|
+
message: `Restore ${id}? ${willChange} file(s) will be overwritten (a safety checkpoint is taken first).`,
|
|
164
|
+
default: false,
|
|
165
|
+
}).catch(() => false);
|
|
166
|
+
if (!ok) {
|
|
167
|
+
logger.log(chalk.gray("Aborted."));
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
} else {
|
|
171
|
+
logger.error(
|
|
172
|
+
chalk.red(
|
|
173
|
+
`Refusing to restore without --force (non-interactive). ${willChange} file(s) would change. Re-run with --dry-run to preview or --force to proceed.`,
|
|
174
|
+
),
|
|
175
|
+
);
|
|
176
|
+
process.exitCode = 1;
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
const r = restoreCheckpoint(id);
|
|
182
|
+
if (options.json) {
|
|
183
|
+
console.log(JSON.stringify(r, null, 2));
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
logger.log(
|
|
187
|
+
chalk.green(`✓ restored ${r.restored.length} file(s) from ${id}`),
|
|
188
|
+
);
|
|
189
|
+
r.restored.forEach((f) => logger.log(chalk.gray(` ~ ${f}`)));
|
|
190
|
+
if (r.safetyId) {
|
|
191
|
+
logger.log(
|
|
192
|
+
chalk.gray(
|
|
193
|
+
` safety checkpoint of prior state: ${r.safetyId} (undo with: cc checkpoint restore ${r.safetyId})`,
|
|
194
|
+
),
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
if (r.missingBlob.length) {
|
|
198
|
+
logger.log(
|
|
199
|
+
chalk.red(` missing blobs (skipped): ${r.missingBlob.join(", ")}`),
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
} catch (err) {
|
|
203
|
+
logger.error(chalk.red(`checkpoint restore failed: ${err.message}`));
|
|
204
|
+
process.exitCode = 1;
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
cp.command("delete <id>")
|
|
209
|
+
.alias("rm")
|
|
210
|
+
.description("Delete a checkpoint")
|
|
211
|
+
.option("--force", "Skip confirmation")
|
|
212
|
+
.action(async (id, options) => {
|
|
213
|
+
try {
|
|
214
|
+
const { deleteCheckpoint, getCheckpoint } =
|
|
215
|
+
await import("../lib/file-checkpoint.js");
|
|
216
|
+
if (!getCheckpoint(id)) {
|
|
217
|
+
logger.error(chalk.red(`no such checkpoint: ${id}`));
|
|
218
|
+
process.exitCode = 1;
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
if (!options.force && process.stdin.isTTY) {
|
|
222
|
+
const { confirm } = await import("@inquirer/prompts");
|
|
223
|
+
const ok = await confirm({
|
|
224
|
+
message: `Delete checkpoint ${id}?`,
|
|
225
|
+
default: false,
|
|
226
|
+
}).catch(() => false);
|
|
227
|
+
if (!ok) {
|
|
228
|
+
logger.log(chalk.gray("Aborted."));
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
deleteCheckpoint(id);
|
|
233
|
+
logger.log(chalk.green(`✓ deleted ${id}`));
|
|
234
|
+
} catch (err) {
|
|
235
|
+
logger.error(chalk.red(`checkpoint delete failed: ${err.message}`));
|
|
236
|
+
process.exitCode = 1;
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
}
|