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
|
@@ -263,11 +263,41 @@ async function initHub() {
|
|
|
263
263
|
// Fall back to rule-only — registry still works
|
|
264
264
|
}
|
|
265
265
|
|
|
266
|
+
// ADB one-click readiness for the social platforms (B站/微博/抖音/小红书/
|
|
267
|
+
// 头条/快手): each has a *AdbSync hub method that pulls from a rooted phone
|
|
268
|
+
// over USB. The probe runs one `adb devices` so readiness() can show
|
|
269
|
+
// "已连接手机,点一键采集" vs "请插上 root 手机" instead of the misleading
|
|
270
|
+
// snapshot guidance. Best-effort — never throws into the readiness probe.
|
|
271
|
+
const ADB_ONE_CLICK_NAMES = new Set([
|
|
272
|
+
"social-bilibili",
|
|
273
|
+
"social-weibo",
|
|
274
|
+
"social-douyin",
|
|
275
|
+
"social-xiaohongshu",
|
|
276
|
+
"social-toutiao",
|
|
277
|
+
"social-kuaishou",
|
|
278
|
+
]);
|
|
279
|
+
const adbReadinessProbe = async () => {
|
|
280
|
+
try {
|
|
281
|
+
const { listDevices } = await import("./host-adb-bridge.js");
|
|
282
|
+
const serials = await listDevices();
|
|
283
|
+
return {
|
|
284
|
+
deviceConnected: Array.isArray(serials) && serials.length > 0,
|
|
285
|
+
serial: serials && serials[0],
|
|
286
|
+
};
|
|
287
|
+
} catch (_e) {
|
|
288
|
+
return { deviceConnected: false };
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
|
|
266
292
|
const registry = new AdapterRegistry({
|
|
267
293
|
vault,
|
|
268
294
|
kgSink: kgSink ? kgSink.write.bind(kgSink) : null,
|
|
269
295
|
ragSink: ragSink ? ragSink.write.bind(ragSink) : null,
|
|
270
296
|
entityResolver,
|
|
297
|
+
adbReadiness: {
|
|
298
|
+
probe: adbReadinessProbe,
|
|
299
|
+
oneClickNames: ADB_ONE_CLICK_NAMES,
|
|
300
|
+
},
|
|
271
301
|
});
|
|
272
302
|
|
|
273
303
|
const engine = new AnalysisEngine({
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve the most-recent session id across both stores (DB + JSONL).
|
|
3
|
+
*
|
|
4
|
+
* Shared by `cc agent --continue` and `cc session resume` (id-less form) so a
|
|
5
|
+
* user can pick up the last conversation with a one-liner — Claude-Code
|
|
6
|
+
* `claude --continue` parity.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { listSessions } from "./session-manager.js";
|
|
10
|
+
import { listJsonlSessions } from "../harness/jsonl-session-store.js";
|
|
11
|
+
import { feature } from "./feature-flags.js";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Merge both stores into a single newest-first, id-deduped list.
|
|
15
|
+
*
|
|
16
|
+
* @param {object} ctx bootstrap() context (may be null; db is optional)
|
|
17
|
+
* @param {object} [opts]
|
|
18
|
+
* @param {number} [opts.scan=20] how many recent rows to merge per store
|
|
19
|
+
* @returns {Array<object>} session rows (id, title, message_count, updated_at, _store)
|
|
20
|
+
*/
|
|
21
|
+
export function listRecentSessions(ctx, opts = {}) {
|
|
22
|
+
const scan = Math.max(1, opts.scan || 20);
|
|
23
|
+
const sessions = [];
|
|
24
|
+
|
|
25
|
+
if (ctx && ctx.db) {
|
|
26
|
+
try {
|
|
27
|
+
const db = ctx.db.getDatabase();
|
|
28
|
+
sessions.push(
|
|
29
|
+
...listSessions(db, { limit: scan }).map((s) => ({
|
|
30
|
+
...s,
|
|
31
|
+
_store: "db",
|
|
32
|
+
})),
|
|
33
|
+
);
|
|
34
|
+
} catch (err) {
|
|
35
|
+
/* db unavailable — fall through to JSONL */
|
|
36
|
+
void err;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (feature("JSONL_SESSION")) {
|
|
41
|
+
try {
|
|
42
|
+
sessions.push(
|
|
43
|
+
...listJsonlSessions({ limit: scan }).map((s) => ({
|
|
44
|
+
...s,
|
|
45
|
+
_store: "jsonl",
|
|
46
|
+
})),
|
|
47
|
+
);
|
|
48
|
+
} catch (err) {
|
|
49
|
+
void err;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Dedup by id (JSONL precedence via sort+seen), newest updated_at first.
|
|
54
|
+
const seen = new Set();
|
|
55
|
+
return sessions
|
|
56
|
+
.sort((a, b) => ((b.updated_at || "") > (a.updated_at || "") ? 1 : -1))
|
|
57
|
+
.filter((s) => {
|
|
58
|
+
if (!s || !s.id || seen.has(s.id)) return false;
|
|
59
|
+
seen.add(s.id);
|
|
60
|
+
return true;
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @param {object} ctx bootstrap() context (may be null; db is optional)
|
|
66
|
+
* @param {object} [opts] forwarded to {@link listRecentSessions}
|
|
67
|
+
* @returns {string|null} the most-recently-updated session id, or null
|
|
68
|
+
*/
|
|
69
|
+
export function resolveMostRecentSessionId(ctx, opts = {}) {
|
|
70
|
+
const sessions = listRecentSessions(ctx, opts);
|
|
71
|
+
return sessions.length > 0 ? sessions[0].id : null;
|
|
72
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive "which session to resume?" picker — shared by `cc session resume`
|
|
3
|
+
* and `cc agent --resume/--continue` so both render the same list and apply the
|
|
4
|
+
* same fallbacks (Claude-Code `--resume` parity).
|
|
5
|
+
*
|
|
6
|
+
* Behaviour:
|
|
7
|
+
* - 0 sessions → { id: null } (caller decides how to report)
|
|
8
|
+
* - non-TTY / single / noPicker → most-recent, no prompt (claude --continue)
|
|
9
|
+
* - TTY + >1 sessions → inquirer `select`; Ctrl-C falls back to most-recent
|
|
10
|
+
*
|
|
11
|
+
* All non-determinism (the session list, TTY-ness, the prompt fn) is injectable
|
|
12
|
+
* via `deps` so the deterministic branches are unit-testable without a TTY.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import chalk from "chalk";
|
|
16
|
+
import { listRecentSessions } from "./recent-session.js";
|
|
17
|
+
|
|
18
|
+
/** Render one session row for the picker list. */
|
|
19
|
+
export function formatSessionChoice(s) {
|
|
20
|
+
const title = (s.title || "Untitled").slice(0, 50).padEnd(50);
|
|
21
|
+
const msgs = chalk.cyan(`${s.message_count ?? 0} msgs`);
|
|
22
|
+
const when = chalk.gray(s.updated_at || "");
|
|
23
|
+
const store = s._store === "jsonl" ? " " + chalk.yellow("[JSONL]") : "";
|
|
24
|
+
return {
|
|
25
|
+
name: `${title} ${msgs} ${when}${store}`,
|
|
26
|
+
value: s.id,
|
|
27
|
+
short: String(s.id).slice(0, 12),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Resolve which recent session to resume.
|
|
33
|
+
*
|
|
34
|
+
* @param {object} ctx bootstrap() context (db optional)
|
|
35
|
+
* @param {object} [opts]
|
|
36
|
+
* @param {string} [opts.message] picker prompt
|
|
37
|
+
* @param {boolean} [opts.noPicker] force most-recent, skip the prompt
|
|
38
|
+
* @param {number} [opts.scan] forwarded to listRecentSessions
|
|
39
|
+
* @param {object} [deps] { listRecentSessions, isTTY, select }
|
|
40
|
+
* @returns {Promise<{id:string|null, sessions:Array, picked:boolean}>}
|
|
41
|
+
*/
|
|
42
|
+
export async function pickRecentSession(ctx, opts = {}, deps = {}) {
|
|
43
|
+
const list = deps.listRecentSessions || listRecentSessions;
|
|
44
|
+
const isTTY =
|
|
45
|
+
deps.isTTY !== undefined ? deps.isTTY : Boolean(process.stdin.isTTY);
|
|
46
|
+
|
|
47
|
+
const sessions = list(ctx, { scan: opts.scan });
|
|
48
|
+
if (!sessions || sessions.length === 0) {
|
|
49
|
+
return { id: null, sessions: [], picked: false };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// No interactive prompt possible/wanted → newest wins (claude --continue).
|
|
53
|
+
if (!isTTY || sessions.length === 1 || opts.noPicker) {
|
|
54
|
+
return { id: sessions[0].id, sessions, picked: false };
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const select = deps.select || (await import("@inquirer/prompts")).select;
|
|
58
|
+
try {
|
|
59
|
+
const id = await select({
|
|
60
|
+
message: opts.message || "Resume which session?",
|
|
61
|
+
choices: sessions.map(formatSessionChoice),
|
|
62
|
+
});
|
|
63
|
+
return { id, sessions, picked: true };
|
|
64
|
+
} catch {
|
|
65
|
+
// Ctrl-C / non-interactive environment → fall back to most recent.
|
|
66
|
+
return { id: sessions[0].id, sessions, picked: false };
|
|
67
|
+
}
|
|
68
|
+
}
|
package/src/repl/agent-repl.js
CHANGED
|
@@ -65,6 +65,9 @@ import {
|
|
|
65
65
|
agentLoop as coreAgentLoop,
|
|
66
66
|
formatToolArgs,
|
|
67
67
|
} from "../runtime/agent-core.js";
|
|
68
|
+
import { expandFileRefs } from "../runtime/file-ref-expander.js";
|
|
69
|
+
import { composeSystemPrompt } from "../runtime/system-prompt.js";
|
|
70
|
+
import { makeFallbackChatFn } from "../runtime/fallback-model.js";
|
|
68
71
|
|
|
69
72
|
/**
|
|
70
73
|
* Reference to the runtime DB for hook execution (set during startAgentRepl)
|
|
@@ -150,6 +153,26 @@ export async function startAgentRepl(options = {}) {
|
|
|
150
153
|
let provider = options.provider || "ollama";
|
|
151
154
|
const baseUrl = options.baseUrl || "http://localhost:11434";
|
|
152
155
|
const apiKey = options.apiKey || null;
|
|
156
|
+
// Extra workspace roots (--add-dir): advertised in the system prompt and
|
|
157
|
+
// spanned by search_files.
|
|
158
|
+
const additionalDirectories = Array.isArray(options.additionalDirectories)
|
|
159
|
+
? options.additionalDirectories
|
|
160
|
+
: [];
|
|
161
|
+
|
|
162
|
+
// --fallback-model: retry a turn's LLM call once on a backup model when the
|
|
163
|
+
// primary errors out (overload / network). Built once; passed into every
|
|
164
|
+
// agentLoop call via chatFn. Undefined when no fallback configured.
|
|
165
|
+
const _fallbackChatFn = options.fallbackModel
|
|
166
|
+
? makeFallbackChatFn({
|
|
167
|
+
fallbackModel: options.fallbackModel,
|
|
168
|
+
onFallback: ({ from, to, error }) =>
|
|
169
|
+
logger.info(
|
|
170
|
+
chalk.yellow(
|
|
171
|
+
`[fallback] model "${from}" failed (${error}); retrying with "${to}"`,
|
|
172
|
+
),
|
|
173
|
+
),
|
|
174
|
+
})
|
|
175
|
+
: undefined;
|
|
153
176
|
|
|
154
177
|
// Bootstrap runtime (best-effort, DB not required)
|
|
155
178
|
let db = null;
|
|
@@ -299,7 +322,18 @@ export async function startAgentRepl(options = {}) {
|
|
|
299
322
|
}
|
|
300
323
|
|
|
301
324
|
const messages = [
|
|
302
|
-
{
|
|
325
|
+
{
|
|
326
|
+
role: "system",
|
|
327
|
+
// --system-prompt replaces the built-in prompt; --append-system-prompt
|
|
328
|
+
// extends it (parity with the headless runners).
|
|
329
|
+
content: composeSystemPrompt(
|
|
330
|
+
buildSystemPrompt(process.cwd(), { additionalDirectories }),
|
|
331
|
+
{
|
|
332
|
+
systemPrompt: options.systemPrompt,
|
|
333
|
+
appendSystemPrompt: options.appendSystemPrompt,
|
|
334
|
+
},
|
|
335
|
+
),
|
|
336
|
+
},
|
|
303
337
|
];
|
|
304
338
|
|
|
305
339
|
// Deep Agents Deploy Phase 1 — load agent bundle if --bundle provided.
|
|
@@ -1418,8 +1452,28 @@ export async function startAgentRepl(options = {}) {
|
|
|
1418
1452
|
logger.verbose(`[hook] prompt rewritten by UserPromptSubmit hook`);
|
|
1419
1453
|
}
|
|
1420
1454
|
|
|
1455
|
+
// Expand @path file references into context blocks (Claude-Code parity),
|
|
1456
|
+
// so `review @src/x.js` injects the file contents. Typo'd paths are warned
|
|
1457
|
+
// about and left as-is.
|
|
1458
|
+
let userContent = effectivePrompt;
|
|
1459
|
+
try {
|
|
1460
|
+
const fileRefs = expandFileRefs(effectivePrompt, { cwd: process.cwd() });
|
|
1461
|
+
userContent = fileRefs.prompt;
|
|
1462
|
+
for (const w of fileRefs.warnings) {
|
|
1463
|
+
logger.info(chalk.yellow(`[@ref] ${w}`));
|
|
1464
|
+
}
|
|
1465
|
+
if (fileRefs.refs.length > 0) {
|
|
1466
|
+
const summary = fileRefs.refs
|
|
1467
|
+
.map((r) => `${r.rel}${r.kind === "dir" ? "/" : ""}`)
|
|
1468
|
+
.join(", ");
|
|
1469
|
+
logger.verbose(`[@ref] injected: ${summary}`);
|
|
1470
|
+
}
|
|
1471
|
+
} catch (err) {
|
|
1472
|
+
logger.verbose(`[@ref] expansion skipped: ${err.message}`);
|
|
1473
|
+
}
|
|
1474
|
+
|
|
1421
1475
|
// Add user message
|
|
1422
|
-
messages.push({ role: "user", content:
|
|
1476
|
+
messages.push({ role: "user", content: userContent });
|
|
1423
1477
|
|
|
1424
1478
|
// Slot-filling: detect intent and fill missing parameters interactively
|
|
1425
1479
|
try {
|
|
@@ -1476,9 +1530,11 @@ export async function startAgentRepl(options = {}) {
|
|
|
1476
1530
|
iterationBudget,
|
|
1477
1531
|
sessionId,
|
|
1478
1532
|
cwd: process.cwd(),
|
|
1533
|
+
additionalDirectories,
|
|
1479
1534
|
prepareCall: defaultPrepareCall,
|
|
1480
1535
|
approvalGate: _approvalGate,
|
|
1481
1536
|
mcpClient: _bundleMcpClient || undefined,
|
|
1537
|
+
chatFn: _fallbackChatFn,
|
|
1482
1538
|
});
|
|
1483
1539
|
|
|
1484
1540
|
if (sessionId && usageEvents?.length) {
|
package/src/repl/chat-repl.js
CHANGED
|
@@ -12,6 +12,7 @@ import readline from "readline";
|
|
|
12
12
|
import chalk from "chalk";
|
|
13
13
|
import { logger } from "../lib/logger.js";
|
|
14
14
|
import { BUILT_IN_PROVIDERS } from "../lib/llm-providers.js";
|
|
15
|
+
import { expandFileRefs } from "../runtime/file-ref-expander.js";
|
|
15
16
|
import {
|
|
16
17
|
streamOllama,
|
|
17
18
|
streamOpenAI,
|
|
@@ -153,8 +154,22 @@ export async function startChatRepl(options = {}) {
|
|
|
153
154
|
}
|
|
154
155
|
}
|
|
155
156
|
|
|
157
|
+
// Expand @path file references into context blocks (Claude-Code parity),
|
|
158
|
+
// so `summarize @notes.md` injects the file. The model sees the expanded
|
|
159
|
+
// content; the JSONL log keeps the original line for readability.
|
|
160
|
+
let userContent = trimmed;
|
|
161
|
+
try {
|
|
162
|
+
const fileRefs = expandFileRefs(trimmed, { cwd: process.cwd() });
|
|
163
|
+
userContent = fileRefs.prompt;
|
|
164
|
+
for (const w of fileRefs.warnings) {
|
|
165
|
+
logger.info(chalk.yellow(`[@ref] ${w}`));
|
|
166
|
+
}
|
|
167
|
+
} catch (err) {
|
|
168
|
+
logger.verbose?.(`[@ref] expansion skipped: ${err.message}`);
|
|
169
|
+
}
|
|
170
|
+
|
|
156
171
|
// Add user message
|
|
157
|
-
messages.push({ role: "user", content:
|
|
172
|
+
messages.push({ role: "user", content: userContent });
|
|
158
173
|
|
|
159
174
|
// Stream the response
|
|
160
175
|
process.stdout.write(chalk.blue("ai> "));
|
|
@@ -338,9 +338,12 @@ function _buildPersonaPrompt(persona, envLines, cwd) {
|
|
|
338
338
|
* 4. Default hardcoded prompt → fallback when no persona
|
|
339
339
|
*
|
|
340
340
|
* @param {string} [cwd] - working directory
|
|
341
|
+
* @param {object} [opts]
|
|
342
|
+
* @param {string[]} [opts.additionalDirectories] - extra workspace roots
|
|
343
|
+
* (absolute paths) the agent may read/search/edit beyond `cwd`.
|
|
341
344
|
* @returns {string} complete system prompt
|
|
342
345
|
*/
|
|
343
|
-
export function buildSystemPrompt(cwd) {
|
|
346
|
+
export function buildSystemPrompt(cwd, opts = {}) {
|
|
344
347
|
const dir = cwd || process.cwd();
|
|
345
348
|
|
|
346
349
|
// Check for project persona
|
|
@@ -393,6 +396,19 @@ export function buildSystemPrompt(cwd) {
|
|
|
393
396
|
// Non-critical
|
|
394
397
|
}
|
|
395
398
|
|
|
399
|
+
// Advertise extra workspace roots (--add-dir) so the model knows it may
|
|
400
|
+
// reach beyond cwd and which absolute paths to use.
|
|
401
|
+
const extraDirs = Array.isArray(opts.additionalDirectories)
|
|
402
|
+
? opts.additionalDirectories.filter(Boolean)
|
|
403
|
+
: [];
|
|
404
|
+
if (extraDirs.length > 0) {
|
|
405
|
+
prompt +=
|
|
406
|
+
`\n\n## Additional working directories\n` +
|
|
407
|
+
`Beyond the current working directory, you may read, search, and edit ` +
|
|
408
|
+
`files under these absolute roots. Pass absolute paths to access them:\n` +
|
|
409
|
+
extraDirs.map((d) => `- ${d}`).join("\n");
|
|
410
|
+
}
|
|
411
|
+
|
|
396
412
|
return prompt;
|
|
397
413
|
}
|
|
398
414
|
|
|
@@ -529,6 +545,7 @@ export async function executeTool(name, args, context = {}) {
|
|
|
529
545
|
shellPolicyOverrides: context.shellPolicyOverrides || null,
|
|
530
546
|
approvalGate: context.approvalGate || null,
|
|
531
547
|
shellConfirm: context.shellConfirm || null,
|
|
548
|
+
additionalDirectories: context.additionalDirectories || null,
|
|
532
549
|
});
|
|
533
550
|
} catch (err) {
|
|
534
551
|
if (hookDb) {
|
|
@@ -598,6 +615,7 @@ async function executeToolInner(
|
|
|
598
615
|
shellPolicyOverrides,
|
|
599
616
|
approvalGate,
|
|
600
617
|
shellConfirm,
|
|
618
|
+
additionalDirectories,
|
|
601
619
|
},
|
|
602
620
|
) {
|
|
603
621
|
const localToolDescriptor =
|
|
@@ -962,41 +980,52 @@ async function executeToolInner(
|
|
|
962
980
|
}
|
|
963
981
|
|
|
964
982
|
case "search_files": {
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
}
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
}
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
983
|
+
// An explicit directory scopes the search to one root; otherwise span
|
|
984
|
+
// cwd plus any --add-dir roots so cross-package searches find matches.
|
|
985
|
+
const extraRoots = Array.isArray(additionalDirectories)
|
|
986
|
+
? additionalDirectories.filter(Boolean)
|
|
987
|
+
: [];
|
|
988
|
+
const roots = args.directory
|
|
989
|
+
? [path.resolve(cwd, args.directory)]
|
|
990
|
+
: [cwd, ...extraRoots];
|
|
991
|
+
const isContent = Boolean(args.content_search);
|
|
992
|
+
const cmd = isContent
|
|
993
|
+
? process.platform === "win32"
|
|
994
|
+
? `findstr /s /i /n "${args.pattern}" *`
|
|
995
|
+
: `grep -r -l -i "${args.pattern}" . --include="*" 2>/dev/null | head -20`
|
|
996
|
+
: process.platform === "win32"
|
|
997
|
+
? `dir /s /b *${args.pattern}* 2>NUL`
|
|
998
|
+
: `find . -name "*${args.pattern}*" -type f 2>/dev/null | head -20`;
|
|
999
|
+
|
|
1000
|
+
const hits = [];
|
|
1001
|
+
const seen = new Set();
|
|
1002
|
+
for (const root of roots) {
|
|
1003
|
+
if (hits.length >= 20) break;
|
|
1004
|
+
try {
|
|
1005
|
+
if (!fs.existsSync(root)) continue;
|
|
985
1006
|
const output = execSync(cmd, {
|
|
986
|
-
cwd:
|
|
1007
|
+
cwd: root,
|
|
987
1008
|
encoding: "utf8",
|
|
988
1009
|
timeout: 10000,
|
|
989
1010
|
});
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
1011
|
+
for (const line of output.trim().split("\n")) {
|
|
1012
|
+
const v = line.trim();
|
|
1013
|
+
if (!v || seen.has(v)) continue;
|
|
1014
|
+
// Qualify with the root so multi-root results stay unambiguous.
|
|
1015
|
+
const labeled = roots.length > 1 ? `${root}: ${v}` : v;
|
|
1016
|
+
seen.add(v);
|
|
1017
|
+
hits.push(labeled);
|
|
1018
|
+
if (hits.length >= 20) break;
|
|
1019
|
+
}
|
|
1020
|
+
} catch {
|
|
1021
|
+
// No matches in this root — continue to the next.
|
|
993
1022
|
}
|
|
994
|
-
} catch {
|
|
995
|
-
return attachDescriptor({
|
|
996
|
-
files: [],
|
|
997
|
-
message: "No matches found",
|
|
998
|
-
});
|
|
999
1023
|
}
|
|
1024
|
+
|
|
1025
|
+
if (hits.length === 0) {
|
|
1026
|
+
return attachDescriptor({ files: [], message: "No matches found" });
|
|
1027
|
+
}
|
|
1028
|
+
return attachDescriptor(isContent ? { matches: hits } : { files: hits });
|
|
1000
1029
|
}
|
|
1001
1030
|
|
|
1002
1031
|
case "list_dir": {
|
|
@@ -1608,9 +1637,16 @@ export async function chatWithTools(rawMessages, options) {
|
|
|
1608
1637
|
} = options;
|
|
1609
1638
|
|
|
1610
1639
|
const persona = _loadProjectPersona(options.cwd);
|
|
1640
|
+
// Merge the project-persona deny-list with any caller-supplied deny-list
|
|
1641
|
+
// (e.g. headless `--disallowed-tools`). Without this merge the caller's
|
|
1642
|
+
// deny-list is silently dropped and the tool stays callable.
|
|
1643
|
+
const mergedDisabledTools = [
|
|
1644
|
+
...(Array.isArray(persona?.toolsDisabled) ? persona.toolsDisabled : []),
|
|
1645
|
+
...(Array.isArray(options.disabledTools) ? options.disabledTools : []),
|
|
1646
|
+
];
|
|
1611
1647
|
const tools = getAgentToolDefinitions({
|
|
1612
1648
|
names: options.enabledToolNames,
|
|
1613
|
-
disabledTools:
|
|
1649
|
+
disabledTools: mergedDisabledTools,
|
|
1614
1650
|
extraTools: [
|
|
1615
1651
|
...(options.hostManagedToolPolicy?.toolDefinitions || []),
|
|
1616
1652
|
...(options.extraToolDefinitions || []),
|
|
@@ -1842,6 +1878,7 @@ export async function* agentLoop(messages, options) {
|
|
|
1842
1878
|
shellPolicyOverrides: options.shellPolicyOverrides || null,
|
|
1843
1879
|
approvalGate: options.approvalGate || null,
|
|
1844
1880
|
shellConfirm: options.shellConfirm || null,
|
|
1881
|
+
additionalDirectories: options.additionalDirectories || null,
|
|
1845
1882
|
};
|
|
1846
1883
|
|
|
1847
1884
|
throwIfAborted(signal);
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `--fallback-model` support — Claude-Code parity for unattended runs.
|
|
3
|
+
*
|
|
4
|
+
* Wraps the agent loop's LLM call so a single request that fails with a
|
|
5
|
+
* *retryable* error (overload / rate-limit / transient network) is transparently
|
|
6
|
+
* re-issued once with a backup model. Because it sits at the chatFn seam
|
|
7
|
+
* (`agentLoop` uses `options.chatFn || chatWithTools`), fallback needs no changes
|
|
8
|
+
* to the runners — the wrapped fn is passed in via `options.chatFn`.
|
|
9
|
+
*
|
|
10
|
+
* Same-provider only: the fallback swaps `options.model`, keeping the configured
|
|
11
|
+
* provider / baseUrl / apiKey. Cross-provider fallback is a larger feature.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { chatWithTools } from "./agent-core.js";
|
|
15
|
+
|
|
16
|
+
// Heuristics for "try again on a different model" — overloaded backends,
|
|
17
|
+
// rate limits, and transient connectivity. Deliberately conservative: a 4xx
|
|
18
|
+
// that is not 429 (bad request / auth) is NOT retried.
|
|
19
|
+
const RETRYABLE_PATTERNS = [
|
|
20
|
+
/overload/i,
|
|
21
|
+
/rate.?limit/i,
|
|
22
|
+
/too many requests/i,
|
|
23
|
+
/temporarily unavailable/i,
|
|
24
|
+
/\b429\b/,
|
|
25
|
+
/\b50[0234]\b/,
|
|
26
|
+
/\b529\b/,
|
|
27
|
+
/timeout/i,
|
|
28
|
+
/timed out/i,
|
|
29
|
+
/ETIMEDOUT/i,
|
|
30
|
+
/ECONNREFUSED/i,
|
|
31
|
+
/ECONNRESET/i,
|
|
32
|
+
/ENOTFOUND/i,
|
|
33
|
+
/EAI_AGAIN/i,
|
|
34
|
+
/socket hang up/i,
|
|
35
|
+
/fetch failed/i,
|
|
36
|
+
/network error/i,
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Decide whether an error from an LLM call warrants a fallback retry.
|
|
41
|
+
* @param {any} err
|
|
42
|
+
* @returns {boolean}
|
|
43
|
+
*/
|
|
44
|
+
export function isRetryableModelError(err) {
|
|
45
|
+
if (!err) return false;
|
|
46
|
+
const status =
|
|
47
|
+
typeof err.status === "number"
|
|
48
|
+
? err.status
|
|
49
|
+
: typeof err.statusCode === "number"
|
|
50
|
+
? err.statusCode
|
|
51
|
+
: null;
|
|
52
|
+
if (status === 429) return true;
|
|
53
|
+
if (status !== null && status >= 500 && status <= 599) return true;
|
|
54
|
+
|
|
55
|
+
const parts = [
|
|
56
|
+
err.message,
|
|
57
|
+
typeof err.code === "string" ? err.code : "",
|
|
58
|
+
err.cause?.message,
|
|
59
|
+
err.cause?.code,
|
|
60
|
+
]
|
|
61
|
+
.filter(Boolean)
|
|
62
|
+
.join(" ");
|
|
63
|
+
return RETRYABLE_PATTERNS.some((re) => re.test(parts));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Build a chatFn that retries once on the fallback model.
|
|
68
|
+
*
|
|
69
|
+
* @param {object} opts
|
|
70
|
+
* @param {string} opts.fallbackModel backup model name (required)
|
|
71
|
+
* @param {Function} [opts.baseChatFn=chatWithTools] underlying LLM call
|
|
72
|
+
* @param {Function} [opts.isRetryable] error predicate (testing seam)
|
|
73
|
+
* @param {Function} [opts.onFallback] notified ({from,to,error}) on retry
|
|
74
|
+
* @returns {Function} a (messages, options) => Promise<result> chatFn
|
|
75
|
+
*/
|
|
76
|
+
export function makeFallbackChatFn(opts = {}) {
|
|
77
|
+
const fallbackModel = opts.fallbackModel;
|
|
78
|
+
const baseChatFn = opts.baseChatFn || chatWithTools;
|
|
79
|
+
const isRetryable = opts.isRetryable || isRetryableModelError;
|
|
80
|
+
const onFallback = opts.onFallback;
|
|
81
|
+
|
|
82
|
+
return async function chatWithFallback(messages, options = {}) {
|
|
83
|
+
try {
|
|
84
|
+
return await baseChatFn(messages, options);
|
|
85
|
+
} catch (err) {
|
|
86
|
+
const primaryModel = options.model;
|
|
87
|
+
// Skip a no-op retry when the fallback is the same model as the primary.
|
|
88
|
+
if (
|
|
89
|
+
!fallbackModel ||
|
|
90
|
+
fallbackModel === primaryModel ||
|
|
91
|
+
!isRetryable(err)
|
|
92
|
+
) {
|
|
93
|
+
throw err;
|
|
94
|
+
}
|
|
95
|
+
if (typeof onFallback === "function") {
|
|
96
|
+
try {
|
|
97
|
+
onFallback({
|
|
98
|
+
from: primaryModel,
|
|
99
|
+
to: fallbackModel,
|
|
100
|
+
error: err?.message || String(err),
|
|
101
|
+
});
|
|
102
|
+
} catch {
|
|
103
|
+
// Notification is best-effort — never mask the retry.
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return await baseChatFn(messages, { ...options, model: fallbackModel });
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
}
|