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.
Files changed (420) hide show
  1. package/package.json +2 -2
  2. package/src/assets/web-panel/assets/AIOps-BqWP6FKu.js +1 -0
  3. package/src/assets/web-panel/assets/AIOps-CSpp7iGY.css +1 -0
  4. package/src/assets/web-panel/assets/{ActionButton-wRdLFzBQ.js → ActionButton-CXwMgOvX.js} +1 -1
  5. package/src/assets/web-panel/assets/Analytics-DAebZ4IY.js +3 -0
  6. package/src/assets/web-panel/assets/Analytics-DJcHjy5J.css +1 -0
  7. package/src/assets/web-panel/assets/AppLayout-CYsqYoME.js +9 -0
  8. package/src/assets/web-panel/assets/AppLayout-VlanTjPw.css +1 -0
  9. package/src/assets/web-panel/assets/Audit-BbTtX1Nf.js +1 -0
  10. package/src/assets/web-panel/assets/Audit-D8oxP0wr.css +1 -0
  11. package/src/assets/web-panel/assets/Backup-DgqY2Eb-.js +1 -0
  12. package/src/assets/web-panel/assets/Backup-Wi9CaP3d.css +1 -0
  13. package/src/assets/web-panel/assets/BaseInput-Cq2ZuSoO.js +1 -0
  14. package/src/assets/web-panel/assets/Chat-D2kqpUyO.js +8 -0
  15. package/src/assets/web-panel/assets/Chat-DDh58PCf.css +1 -0
  16. package/src/assets/web-panel/assets/ChatBubbleRenderer-C-svYkrC.js +1 -0
  17. package/src/assets/web-panel/assets/ChatBubbleRenderer-gy5SDGw2.css +1 -0
  18. package/src/assets/web-panel/assets/{Checkbox-DoGqmF9g.js → Checkbox-_9swHpyc.js} +1 -1
  19. package/src/assets/web-panel/assets/Codegen-BB08p1fn.css +1 -0
  20. package/src/assets/web-panel/assets/Codegen-Cr9YbCPl.js +1 -0
  21. package/src/assets/web-panel/assets/{Col-C-9-jORK.js → Col--wdpCMxx.js} +1 -1
  22. package/src/assets/web-panel/assets/Community-Cbq1nrpo.css +1 -0
  23. package/src/assets/web-panel/assets/Community-DuFcVnLu.js +1 -0
  24. package/src/assets/web-panel/assets/{Compact-CemvxU3z.js → Compact-1yzYeT04.js} +1 -1
  25. package/src/assets/web-panel/assets/Compliance-Dq3aU9Df.js +1 -0
  26. package/src/assets/web-panel/assets/Compliance-NoXr2Vof.css +1 -0
  27. package/src/assets/web-panel/assets/Cowork-BlXJRu6L.css +1 -0
  28. package/src/assets/web-panel/assets/Cowork-CrWcnIg8.js +6 -0
  29. package/src/assets/web-panel/assets/Cron-Bh6fKZ0h.js +2 -0
  30. package/src/assets/web-panel/assets/Crosschain-8ofPaWVW.js +1 -0
  31. package/src/assets/web-panel/assets/Crosschain-CgRAecoR.css +1 -0
  32. package/src/assets/web-panel/assets/DID-D3EiYm3w.js +2 -0
  33. package/src/assets/web-panel/assets/DID-DVsYcgvs.css +1 -0
  34. package/src/assets/web-panel/assets/Dashboard-BFjEdFne.js +3 -0
  35. package/src/assets/web-panel/assets/Dashboard-CAPSdFR4.css +1 -0
  36. package/src/assets/web-panel/assets/Dropdown-pYVPcP6O.js +1 -0
  37. package/src/assets/web-panel/assets/EmailListRenderer-DTPZPx_S.css +1 -0
  38. package/src/assets/web-panel/assets/EmailListRenderer-zBPodwJ1.js +1 -0
  39. package/src/assets/web-panel/assets/FamilyGuardDashboard-CyQTW6PW.js +1 -0
  40. package/src/assets/web-panel/assets/FamilyGuardDashboard-nd3idUVb.css +1 -0
  41. package/src/assets/web-panel/assets/Federation-Ctaq3zYq.js +1 -0
  42. package/src/assets/web-panel/assets/Federation-fGN6iMX_.css +1 -0
  43. package/src/assets/web-panel/assets/FormItemContext-CWYJCLq1.js +2 -0
  44. package/src/assets/web-panel/assets/GenericCardRenderer-B1g6t9R9.js +1 -0
  45. package/src/assets/web-panel/assets/GenericCardRenderer-o85VDYQS.css +1 -0
  46. package/src/assets/web-panel/assets/{Git-DPuaGtg7.css → Git-BdHhxBWR.css} +1 -1
  47. package/src/assets/web-panel/assets/Git-DH-v8iwd.js +2 -0
  48. package/src/assets/web-panel/assets/Governance-DtCS4NDm.css +1 -0
  49. package/src/assets/web-panel/assets/Governance-jZxXvOs5.js +1 -0
  50. package/src/assets/web-panel/assets/Inference-D07LRghn.js +1 -0
  51. package/src/assets/web-panel/assets/Inference-t-w0NgIS.css +1 -0
  52. package/src/assets/web-panel/assets/KnowledgeGraph-4NU1S2Xm.css +1 -0
  53. package/src/assets/web-panel/assets/KnowledgeGraph-DnGtRZhx.js +1 -0
  54. package/src/assets/web-panel/assets/Logs-D2pM9C4W.js +2 -0
  55. package/src/assets/web-panel/assets/Logs-DQbCaYhL.css +1 -0
  56. package/src/assets/web-panel/assets/Marketplace-Bvo5cuGa.css +1 -0
  57. package/src/assets/web-panel/assets/Marketplace-UyIO7C7r.js +1 -0
  58. package/src/assets/web-panel/assets/McpTools-534Q95Mx.css +1 -0
  59. package/src/assets/web-panel/assets/McpTools-Bf1gvZPf.js +7 -0
  60. package/src/assets/web-panel/assets/Memory-C1bWj4RN.js +2 -0
  61. package/src/assets/web-panel/assets/Memory-CleW_R6V.css +1 -0
  62. package/src/assets/web-panel/assets/MobileBridge-C_Ot1H_a.js +3 -0
  63. package/src/assets/web-panel/assets/MobileBridge-zJpPuf4E.css +1 -0
  64. package/src/assets/web-panel/assets/MobileProjects-BD4alw6-.css +1 -0
  65. package/src/assets/web-panel/assets/MobileProjects-zr-PpsT_.js +1 -0
  66. package/src/assets/web-panel/assets/Mtc-CXZGO9Sh.css +1 -0
  67. package/src/assets/web-panel/assets/Mtc-CnzFUz5J.js +6 -0
  68. package/src/assets/web-panel/assets/MtcAudit-C1JM8esp.css +1 -0
  69. package/src/assets/web-panel/assets/MtcAudit-CAAh99wz.js +19 -0
  70. package/src/assets/web-panel/assets/Multisig-BryR2Jpr.css +1 -0
  71. package/src/assets/web-panel/assets/Multisig-D6IAg6HE.js +13 -0
  72. package/src/assets/web-panel/assets/NLProgramming-BFMarxb0.js +1 -0
  73. package/src/assets/web-panel/assets/NLProgramming-DGDHq6Z9.css +1 -0
  74. package/src/assets/web-panel/assets/Notes-BKKmMtqV.css +1 -0
  75. package/src/assets/web-panel/assets/Notes-BRp9ro3t.js +7 -0
  76. package/src/assets/web-panel/assets/NotificationSettings-C0Au3Cxb.js +1 -0
  77. package/src/assets/web-panel/assets/NotificationSettings-CG3Kfuef.css +1 -0
  78. package/src/assets/web-panel/assets/OrderTableRenderer-CfrDjSHT.css +1 -0
  79. package/src/assets/web-panel/assets/OrderTableRenderer-ISp6btRY.js +1 -0
  80. package/src/assets/web-panel/assets/Organization-DYoxLBRX.js +4 -0
  81. package/src/assets/web-panel/assets/Organization-LVvqwG0D.css +1 -0
  82. package/src/assets/web-panel/assets/{Overflow-BFxt7NlK.js → Overflow-rO8JJWGJ.js} +1 -1
  83. package/src/assets/web-panel/assets/{OverrideContext-C_4H9tGA.js → OverrideContext-C2r4vyBb.js} +1 -1
  84. package/src/assets/web-panel/assets/P2P-DJleeXIK.js +2 -0
  85. package/src/assets/web-panel/assets/P2P-DcFvP7F-.css +1 -0
  86. package/src/assets/web-panel/assets/PdhVaultBrowser-DM5qghFp.js +7 -0
  87. package/src/assets/web-panel/assets/PdhVaultBrowser-DZZrUOr1.css +1 -0
  88. package/src/assets/web-panel/assets/Permissions-D5v4Beya.js +4 -0
  89. package/src/assets/web-panel/assets/Permissions-DsPE_IQy.css +1 -0
  90. package/src/assets/web-panel/assets/PersonalDataHub-BhpRlh9D.css +1 -0
  91. package/src/assets/web-panel/assets/PersonalDataHub-c2ZTX0Pv.js +9 -0
  92. package/src/assets/web-panel/assets/Pipeline-BItr5CyP.css +1 -0
  93. package/src/assets/web-panel/assets/Pipeline-Crrkyhpz.js +1 -0
  94. package/src/assets/web-panel/assets/Privacy-DZVyrJKa.js +1 -0
  95. package/src/assets/web-panel/assets/Privacy-F_ENsxZk.css +1 -0
  96. package/src/assets/web-panel/assets/ProjectInit-B86LEzDL.css +1 -0
  97. package/src/assets/web-panel/assets/ProjectInit-DKg7J0gz.js +2 -0
  98. package/src/assets/web-panel/assets/ProjectSettings-3ndmTvVH.js +2 -0
  99. package/src/assets/web-panel/assets/ProjectSettings-DK7KA_iX.css +1 -0
  100. package/src/assets/web-panel/assets/Projects-CmJeUDBW.css +1 -0
  101. package/src/assets/web-panel/assets/Projects-ll5wnj2L.js +1 -0
  102. package/src/assets/web-panel/assets/Providers-BeqBVMhB.js +1 -0
  103. package/src/assets/web-panel/assets/Providers-C6q_fvea.css +1 -0
  104. package/src/assets/web-panel/assets/QuickAsk-DKAAxzuA.js +1 -0
  105. package/src/assets/web-panel/assets/Recommend-Byu7IGei.js +1 -0
  106. package/src/assets/web-panel/assets/Recommend-D_bf91K6.css +1 -0
  107. package/src/assets/web-panel/assets/Reputation-BKhWAmCu.js +1 -0
  108. package/src/assets/web-panel/assets/Reputation-DiOsOleI.css +1 -0
  109. package/src/assets/web-panel/assets/Row-BFtn11O6.js +1 -0
  110. package/src/assets/web-panel/assets/RssFeed-CjcbkyUb.css +1 -0
  111. package/src/assets/web-panel/assets/RssFeed-D5a0PT0k.js +3 -0
  112. package/src/assets/web-panel/assets/Search-DAkuaZNe.js +1 -0
  113. package/src/assets/web-panel/assets/Search-Klk29S7C.css +1 -0
  114. package/src/assets/web-panel/assets/Security-BmrukMHn.css +1 -0
  115. package/src/assets/web-panel/assets/Security-C79Ml2Ms.js +4 -0
  116. package/src/assets/web-panel/assets/Services-BBk_jH6-.js +2 -0
  117. package/src/assets/web-panel/assets/Services-DAnVNhUG.css +1 -0
  118. package/src/assets/web-panel/assets/{Skeleton-DL5ebkDK.js → Skeleton-Cy0VvL0M.js} +1 -1
  119. package/src/assets/web-panel/assets/Skills-BUu9owbR.css +1 -0
  120. package/src/assets/web-panel/assets/Skills-OQNky3uI.js +1 -0
  121. package/src/assets/web-panel/assets/Sla-CbX1f8xN.js +1 -0
  122. package/src/assets/web-panel/assets/Sla-sodqCU4a.css +1 -0
  123. package/src/assets/web-panel/assets/SpeechSettings-BIkoUjws.js +1 -0
  124. package/src/assets/web-panel/assets/SpeechSettings-CgB9nFyq.css +1 -0
  125. package/src/assets/web-panel/assets/SyncSettings-B3hJqmBP.css +1 -0
  126. package/src/assets/web-panel/assets/SyncSettings-DG6Swk7G.js +2 -0
  127. package/src/assets/web-panel/assets/Tasks-C9R8sgyi.js +1 -0
  128. package/src/assets/web-panel/assets/Tasks-nbTUVXvt.css +1 -0
  129. package/src/assets/web-panel/assets/Templates-AaJPeCIz.js +1 -0
  130. package/src/assets/web-panel/assets/Templates-CpFsKk_l.css +1 -0
  131. package/src/assets/web-panel/assets/Tenant-MuPJnOjk.css +1 -0
  132. package/src/assets/web-panel/assets/Tenant-jVFRofww.js +1 -0
  133. package/src/assets/web-panel/assets/Terminal-DHBMzfK6.js +3 -0
  134. package/src/assets/web-panel/assets/Terminal-DHoveJwj.css +1 -0
  135. package/src/assets/web-panel/assets/TimelineRenderer-9RFfOHSI.js +1 -0
  136. package/src/assets/web-panel/assets/TimelineRenderer-BlTAtkOc.css +1 -0
  137. package/src/assets/web-panel/assets/Tokens-CynVae-o.css +1 -0
  138. package/src/assets/web-panel/assets/Tokens-ZTfwuABF.js +1 -0
  139. package/src/assets/web-panel/assets/{Trigger-Rzs-a8Xf.js → Trigger-Xo7uZNQs.js} +1 -1
  140. package/src/assets/web-panel/assets/Trust-C-WrW0Fj.css +1 -0
  141. package/src/assets/web-panel/assets/Trust-C0cTPYvn.js +1 -0
  142. package/src/assets/web-panel/assets/UkeySign-DmMKio71.js +1 -0
  143. package/src/assets/web-panel/assets/VideoEditing-BDFghpzP.css +1 -0
  144. package/src/assets/web-panel/assets/VideoEditing-DP7B-oGT.js +1 -0
  145. package/src/assets/web-panel/assets/Wallet-B1kZDARo.js +4 -0
  146. package/src/assets/web-panel/assets/Wallet-DUbpTRcg.css +1 -0
  147. package/src/assets/web-panel/assets/WebAuthn-Bo5kBx27.js +5 -0
  148. package/src/assets/web-panel/assets/WebAuthn-CVAFRfCQ.css +1 -0
  149. package/src/assets/web-panel/assets/WorkflowEditor-429lPWYk.css +1 -0
  150. package/src/assets/web-panel/assets/WorkflowEditor-DGI9SNHH.js +1 -0
  151. package/src/assets/web-panel/assets/{_getTag-BVc6NQ_K.js → _getTag-DnrRH4E6.js} +1 -1
  152. package/src/assets/web-panel/assets/{chat-C7tndXfg.js → chat-y97W1CIG.js} +1 -1
  153. package/src/assets/web-panel/assets/{collapseMotion-DfnRZex1.js → collapseMotion-mxzzcDsg.js} +1 -1
  154. package/src/assets/web-panel/assets/{colors-dUAGx-eS.js → colors-DtTNo0sH.js} +1 -1
  155. package/src/assets/web-panel/assets/{compact-item-X13u92RU.js → compact-item-D0q0exuS.js} +1 -1
  156. package/src/assets/web-panel/assets/createContext-D7pLFs2I.js +1 -0
  157. package/src/assets/web-panel/assets/{debounce-D9xTw4Sx.js → debounce-CFGTTtN3.js} +1 -1
  158. package/src/assets/web-panel/assets/devWarning-BDK34w0I.js +1 -0
  159. package/src/assets/web-panel/assets/echarts-jxgIOFUZ.js +25 -0
  160. package/src/assets/web-panel/assets/{hasIn-DGFXWm7Y.js → hasIn-CXjG5B2j.js} +1 -1
  161. package/src/assets/web-panel/assets/{icons--SBOhPAi.js → icons-DP3uiYxy.js} +4 -4
  162. package/src/assets/web-panel/assets/{index-Deh_HoQ3.js → index-1dwtkcJv.js} +2 -2
  163. package/src/assets/web-panel/assets/index-4mWZhCzz.js +1 -0
  164. package/src/assets/web-panel/assets/index-6np5ESBM.js +1 -0
  165. package/src/assets/web-panel/assets/{index-Bewc5jaO.js → index-8jxbZupG.js} +1 -1
  166. package/src/assets/web-panel/assets/{index-DW1GR68q.js → index-B3y_4OdG.js} +1 -1
  167. package/src/assets/web-panel/assets/index-B4dPdrvC.js +1 -0
  168. package/src/assets/web-panel/assets/index-B6SaRuCI.js +1 -0
  169. package/src/assets/web-panel/assets/index-B9ekWb3I.js +1 -0
  170. package/src/assets/web-panel/assets/index-BJUf19Wd.js +73 -0
  171. package/src/assets/web-panel/assets/index-BO644Q4S.js +21 -0
  172. package/src/assets/web-panel/assets/index-BPXhU-jp.js +7 -0
  173. package/src/assets/web-panel/assets/index-BU944DeT.js +31 -0
  174. package/src/assets/web-panel/assets/index-B_hjkMtX.js +3 -0
  175. package/src/assets/web-panel/assets/index-BdhEYW2a.js +1 -0
  176. package/src/assets/web-panel/assets/{index-DBfn83eM.js → index-BgmvrPJH.js} +1 -1
  177. package/src/assets/web-panel/assets/index-BgyrM0UN.js +19 -0
  178. package/src/assets/web-panel/assets/{index-Cq-fdWWC.js → index-BnLrbXDA.js} +1 -1
  179. package/src/assets/web-panel/assets/{index-C54Ydkuz.js → index-BqVjUN8b.js} +4 -4
  180. package/src/assets/web-panel/assets/index-BzCPx1cq.js +21 -0
  181. package/src/assets/web-panel/assets/index-CFsPe2N7.js +3 -0
  182. package/src/assets/web-panel/assets/{index-C14mc-46.js → index-CKrbutAQ.js} +1 -1
  183. package/src/assets/web-panel/assets/index-CSdhC7Qo.js +1 -0
  184. package/src/assets/web-panel/assets/{index-BqX3jeij.js → index-Cbqu804A.js} +1 -1
  185. package/src/assets/web-panel/assets/{index-CvlrcZKy.js → index-CkGFqlYX.js} +4 -4
  186. package/src/assets/web-panel/assets/{index-CfX1DEtk.css → index-Cq93VfoF.css} +1 -1
  187. package/src/assets/web-panel/assets/index-Ct6xtKkc.js +1 -0
  188. package/src/assets/web-panel/assets/index-DY6KLlgG.js +1 -0
  189. package/src/assets/web-panel/assets/index-D_4WcI1V.js +13 -0
  190. package/src/assets/web-panel/assets/{index-Ced-t9AY.js → index-DjCawXk1.js} +3 -3
  191. package/src/assets/web-panel/assets/index-Dr45Nm9V.js +55 -0
  192. package/src/assets/web-panel/assets/index-EaIfumgW.js +1 -0
  193. package/src/assets/web-panel/assets/index-POaFzYGS.js +1 -0
  194. package/src/assets/web-panel/assets/index-TrBGgrwG.js +1 -0
  195. package/src/assets/web-panel/assets/{index-DrH9uW99.js → index-YWOEx3rP.js} +2 -2
  196. package/src/assets/web-panel/assets/{index-DZMiVgXE.js → index-_3wPBMKt.js} +1 -1
  197. package/src/assets/web-panel/assets/{index-CBnkvGxd.js → index-aarO4HT9.js} +1 -1
  198. package/src/assets/web-panel/assets/index-bVJvqDAz.js +1 -0
  199. package/src/assets/web-panel/assets/{index-BipKV1Yr.js → index-gFLQe31v.js} +2 -2
  200. package/src/assets/web-panel/assets/index-kvV0f4tV.js +12 -0
  201. package/src/assets/web-panel/assets/index-qoB3whR9.js +12 -0
  202. package/src/assets/web-panel/assets/{initDefaultProps-B8zdOlFC.js → initDefaultProps-BnXISaAa.js} +1 -1
  203. package/src/assets/web-panel/assets/{isPlainObject-_gz-soRW.js → isPlainObject-BWRMT62c.js} +1 -1
  204. package/src/assets/web-panel/assets/isSymbol-S5WZT7lS.js +1 -0
  205. package/src/assets/web-panel/assets/motion-ChY7C0zJ.js +11 -0
  206. package/src/assets/web-panel/assets/{move-BioqdqDn.js → move-ByFZMFM5.js} +1 -1
  207. package/src/assets/web-panel/assets/{mtc-parser-Cc3pB9Xm.js → mtc-parser-BbAbUB-9.js} +1 -1
  208. package/src/assets/web-panel/assets/{omit-C1hn14Vc.js → omit-BYeliY1H.js} +1 -1
  209. package/src/assets/web-panel/assets/{pickAttrs-DgVG8oMj.js → pickAttrs-B9dcAKnu.js} +1 -1
  210. package/src/assets/web-panel/assets/{placementArrow-cJY6hoXZ.js → placementArrow-D3F_txz7.js} +1 -1
  211. package/src/assets/web-panel/assets/{responsiveObserve-DbUdURRx.js → responsiveObserve-ClkwY7wS.js} +1 -1
  212. package/src/assets/web-panel/assets/{slide-C2OEWnC4.js → slide-BNgy2Eea.js} +1 -1
  213. package/src/assets/web-panel/assets/{statusUtils-DghgcGqm.js → statusUtils-Bv3heMCD.js} +1 -1
  214. package/src/assets/web-panel/assets/{styleChecker-GoQ7uwU1.js → styleChecker-DVdlHbQm.js} +1 -1
  215. package/src/assets/web-panel/assets/useFlexGapSupport-alrRY5BK.js +1 -0
  216. package/src/assets/web-panel/assets/{useFs-CZCJDMup.js → useFs-CcVh0-Vu.js} +1 -1
  217. package/src/assets/web-panel/assets/{useMergedState-WwedrFR0.js → useMergedState-Cl2q1fes.js} +1 -1
  218. package/src/assets/web-panel/assets/{usePersonalDataHub-BjAS9b7w.js → usePersonalDataHub-CkkHPhyq.js} +1 -1
  219. package/src/assets/web-panel/assets/{useRefs-Cdq8EWeF.js → useRefs-DD9q4mOT.js} +1 -1
  220. package/src/assets/web-panel/assets/{useState-DGS1NOyn.js → useState-BK4hy8Ma.js} +1 -1
  221. package/src/assets/web-panel/assets/vendor-BvqAck49.js +42 -0
  222. package/src/assets/web-panel/assets/vnode-DWi0X9WN.js +1 -0
  223. package/src/assets/web-panel/assets/{zoom-CzyiNxpd.js → zoom-DCbqxxLH.js} +1 -1
  224. package/src/assets/web-panel/index.html +4 -4
  225. package/src/commands/agent.js +306 -1
  226. package/src/commands/ask.js +35 -1
  227. package/src/commands/checkpoint.js +239 -0
  228. package/src/commands/cost.js +114 -0
  229. package/src/commands/session.js +22 -2
  230. package/src/index.js +4 -0
  231. package/src/lib/file-checkpoint.js +300 -0
  232. package/src/lib/llm-pricing.js +227 -0
  233. package/src/lib/personal-data-hub-wiring.js +30 -0
  234. package/src/lib/recent-session.js +72 -0
  235. package/src/lib/session-picker.js +68 -0
  236. package/src/repl/agent-repl.js +58 -2
  237. package/src/repl/chat-repl.js +16 -1
  238. package/src/runtime/agent-core.js +68 -31
  239. package/src/runtime/fallback-model.js +109 -0
  240. package/src/runtime/file-ref-expander.js +258 -0
  241. package/src/runtime/headless-runner.js +576 -0
  242. package/src/runtime/headless-stream.js +302 -0
  243. package/src/runtime/policies/agent-policy.js +6 -0
  244. package/src/runtime/quiet-stdout.js +35 -0
  245. package/src/runtime/system-prompt.js +60 -0
  246. package/src/assets/web-panel/assets/AIOps-BWWsdf3s.js +0 -1
  247. package/src/assets/web-panel/assets/AIOps-Cchx1iXI.css +0 -1
  248. package/src/assets/web-panel/assets/Analytics-C1-TXmTC.css +0 -1
  249. package/src/assets/web-panel/assets/Analytics-CU1ellhG.js +0 -3
  250. package/src/assets/web-panel/assets/AppLayout-9pWRQa_t.css +0 -1
  251. package/src/assets/web-panel/assets/AppLayout-cXY-mRTd.js +0 -3
  252. package/src/assets/web-panel/assets/Audit-6ZMsXmrO.css +0 -1
  253. package/src/assets/web-panel/assets/Audit-CtQuC6zy.js +0 -1
  254. package/src/assets/web-panel/assets/Backup-CY9QozR7.css +0 -1
  255. package/src/assets/web-panel/assets/Backup-WeATa8CV.js +0 -1
  256. package/src/assets/web-panel/assets/BaseInput-BCu2Cejw.js +0 -1
  257. package/src/assets/web-panel/assets/Chat-Bj0XPlH8.js +0 -7
  258. package/src/assets/web-panel/assets/Chat-IlrLB9ZV.css +0 -1
  259. package/src/assets/web-panel/assets/ChatBubbleRenderer-Bpp2sN9W.js +0 -1
  260. package/src/assets/web-panel/assets/ChatBubbleRenderer-CO908iBt.css +0 -1
  261. package/src/assets/web-panel/assets/Codegen-BLP7id2a.css +0 -1
  262. package/src/assets/web-panel/assets/Codegen-PeBhNei5.js +0 -1
  263. package/src/assets/web-panel/assets/Community-BvaB_Wcs.js +0 -1
  264. package/src/assets/web-panel/assets/Community-C2RejeOY.css +0 -1
  265. package/src/assets/web-panel/assets/Compliance-DOys4Ov1.css +0 -1
  266. package/src/assets/web-panel/assets/Compliance-DjquEqsU.js +0 -1
  267. package/src/assets/web-panel/assets/Cowork-Bv6Tm40_.js +0 -6
  268. package/src/assets/web-panel/assets/Cowork-DsOst4XK.css +0 -1
  269. package/src/assets/web-panel/assets/Cron-D9fPIXV8.js +0 -2
  270. package/src/assets/web-panel/assets/Crosschain-C0WilDBF.js +0 -1
  271. package/src/assets/web-panel/assets/Crosschain-C7Le4Pte.css +0 -1
  272. package/src/assets/web-panel/assets/DID-BX6k3jZi.css +0 -1
  273. package/src/assets/web-panel/assets/DID-CiGeAI1K.js +0 -2
  274. package/src/assets/web-panel/assets/Dashboard-MFDcsVcM.css +0 -1
  275. package/src/assets/web-panel/assets/Dashboard-zqQuizB8.js +0 -3
  276. package/src/assets/web-panel/assets/Dropdown-_Mjb8yOR.js +0 -1
  277. package/src/assets/web-panel/assets/EmailListRenderer-C369EVhV.js +0 -1
  278. package/src/assets/web-panel/assets/EmailListRenderer-CVJ1j3Ll.css +0 -1
  279. package/src/assets/web-panel/assets/FamilyGuardDashboard-D8WsrCmn.js +0 -1
  280. package/src/assets/web-panel/assets/FamilyGuardDashboard-Df-D09Q4.css +0 -1
  281. package/src/assets/web-panel/assets/Federation-CgmfLbx1.css +0 -1
  282. package/src/assets/web-panel/assets/Federation-Dq7CrAzj.js +0 -1
  283. package/src/assets/web-panel/assets/FormItemContext-C7TvuLVK.js +0 -1
  284. package/src/assets/web-panel/assets/GenericCardRenderer-BJUR1Emh.js +0 -1
  285. package/src/assets/web-panel/assets/GenericCardRenderer-DtJFcJYl.css +0 -1
  286. package/src/assets/web-panel/assets/Git-B5MdAp15.js +0 -2
  287. package/src/assets/web-panel/assets/Governance-BIbPWlSM.js +0 -1
  288. package/src/assets/web-panel/assets/Governance-BoipmXaM.css +0 -1
  289. package/src/assets/web-panel/assets/Inference-BWxYJF9-.css +0 -1
  290. package/src/assets/web-panel/assets/Inference-vOz9J05E.js +0 -1
  291. package/src/assets/web-panel/assets/KnowledgeGraph-B_vUO-Td.js +0 -1
  292. package/src/assets/web-panel/assets/KnowledgeGraph-CztPDA96.css +0 -1
  293. package/src/assets/web-panel/assets/Logs-BwPfxX3p.js +0 -2
  294. package/src/assets/web-panel/assets/Logs-Gf_Mv9Nx.css +0 -1
  295. package/src/assets/web-panel/assets/Marketplace-Djp5q9dS.css +0 -1
  296. package/src/assets/web-panel/assets/Marketplace-T5HNwUjX.js +0 -1
  297. package/src/assets/web-panel/assets/McpTools-CDjHmzxH.css +0 -1
  298. package/src/assets/web-panel/assets/McpTools-CuKeBPxy.js +0 -5
  299. package/src/assets/web-panel/assets/Memory-Bcc2hxOA.css +0 -1
  300. package/src/assets/web-panel/assets/Memory-DmRW_sTE.js +0 -2
  301. package/src/assets/web-panel/assets/MobileBridge-DK2N_MJA.js +0 -3
  302. package/src/assets/web-panel/assets/MobileBridge-DwxX55b_.css +0 -1
  303. package/src/assets/web-panel/assets/MobileProjects-Ceaxrqzc.css +0 -1
  304. package/src/assets/web-panel/assets/MobileProjects-wl3bXCnJ.js +0 -1
  305. package/src/assets/web-panel/assets/Mtc-C8e0941i.js +0 -6
  306. package/src/assets/web-panel/assets/Mtc-DHwbdUqA.css +0 -1
  307. package/src/assets/web-panel/assets/MtcAudit-B0x8gahq.css +0 -1
  308. package/src/assets/web-panel/assets/MtcAudit-Cwigy2IR.js +0 -19
  309. package/src/assets/web-panel/assets/Multisig-BSfh_ncy.js +0 -7
  310. package/src/assets/web-panel/assets/Multisig-kwPDnXnl.css +0 -1
  311. package/src/assets/web-panel/assets/NLProgramming-BwzJAfJg.js +0 -1
  312. package/src/assets/web-panel/assets/NLProgramming-CLOvy-35.css +0 -1
  313. package/src/assets/web-panel/assets/Notes-COE2q2gD.css +0 -1
  314. package/src/assets/web-panel/assets/Notes-uilHH6hE.js +0 -7
  315. package/src/assets/web-panel/assets/NotificationSettings-Co0e0uEO.css +0 -1
  316. package/src/assets/web-panel/assets/NotificationSettings-DvM3DTPW.js +0 -1
  317. package/src/assets/web-panel/assets/OrderTableRenderer-BIEm3hZl.js +0 -1
  318. package/src/assets/web-panel/assets/OrderTableRenderer-BnOISpKI.css +0 -1
  319. package/src/assets/web-panel/assets/Organization-BX-cIO8M.css +0 -1
  320. package/src/assets/web-panel/assets/Organization-zxWoIwYM.js +0 -4
  321. package/src/assets/web-panel/assets/P2P-BsbToYKZ.js +0 -2
  322. package/src/assets/web-panel/assets/P2P-Cx88UaiD.css +0 -1
  323. package/src/assets/web-panel/assets/PdhVaultBrowser-B9ZGFpn4.css +0 -1
  324. package/src/assets/web-panel/assets/PdhVaultBrowser-VU8vfhsS.js +0 -7
  325. package/src/assets/web-panel/assets/Permissions-C10Sd26B.js +0 -4
  326. package/src/assets/web-panel/assets/Permissions-C9WlkGl-.css +0 -1
  327. package/src/assets/web-panel/assets/PersonalDataHub-Bz5u9Gth.css +0 -1
  328. package/src/assets/web-panel/assets/PersonalDataHub-edJB7VeU.js +0 -2
  329. package/src/assets/web-panel/assets/Pipeline-DxkXqrH2.css +0 -1
  330. package/src/assets/web-panel/assets/Pipeline-qNmVxn5A.js +0 -1
  331. package/src/assets/web-panel/assets/Privacy-CrsfSFKd.css +0 -1
  332. package/src/assets/web-panel/assets/Privacy-h78XF7eO.js +0 -1
  333. package/src/assets/web-panel/assets/ProjectInit-C9-vm1no.js +0 -2
  334. package/src/assets/web-panel/assets/ProjectInit-CteEo-wF.css +0 -1
  335. package/src/assets/web-panel/assets/ProjectSettings-DpDNsQTb.js +0 -2
  336. package/src/assets/web-panel/assets/ProjectSettings-pLSae-wy.css +0 -1
  337. package/src/assets/web-panel/assets/Projects-BX-SG9R4.css +0 -1
  338. package/src/assets/web-panel/assets/Projects-CwU3W4RD.js +0 -1
  339. package/src/assets/web-panel/assets/Providers-BNI-WkmA.css +0 -1
  340. package/src/assets/web-panel/assets/Providers-C3KZlUEI.js +0 -1
  341. package/src/assets/web-panel/assets/QuickAsk-CILvLGze.js +0 -1
  342. package/src/assets/web-panel/assets/Recommend-CH6wKzGo.css +0 -1
  343. package/src/assets/web-panel/assets/Recommend-XfFlk3BY.js +0 -1
  344. package/src/assets/web-panel/assets/Reputation-BqmWvaMD.js +0 -1
  345. package/src/assets/web-panel/assets/Reputation-D6VPNEd0.css +0 -1
  346. package/src/assets/web-panel/assets/Row-BEbjCI_X.js +0 -1
  347. package/src/assets/web-panel/assets/RssFeed-BlFC20eg.css +0 -1
  348. package/src/assets/web-panel/assets/RssFeed-CFukIl-a.js +0 -3
  349. package/src/assets/web-panel/assets/Search-B6RalzTB.css +0 -1
  350. package/src/assets/web-panel/assets/Search-dVPkf1o2.js +0 -1
  351. package/src/assets/web-panel/assets/Security-13K57V_v.css +0 -1
  352. package/src/assets/web-panel/assets/Security-DlRFaUrn.js +0 -4
  353. package/src/assets/web-panel/assets/Services-C8Qs6KXv.css +0 -1
  354. package/src/assets/web-panel/assets/Services-DKy7AjpA.js +0 -2
  355. package/src/assets/web-panel/assets/Skills-BEqnpg2j.js +0 -1
  356. package/src/assets/web-panel/assets/Skills-BdjRyorN.css +0 -1
  357. package/src/assets/web-panel/assets/Sla-CZ9_lzPI.js +0 -1
  358. package/src/assets/web-panel/assets/Sla-K19oOyQc.css +0 -1
  359. package/src/assets/web-panel/assets/SpeechSettings-DVSY_ehZ.js +0 -1
  360. package/src/assets/web-panel/assets/SpeechSettings-DYPJTDKz.css +0 -1
  361. package/src/assets/web-panel/assets/SyncSettings-C6cDrwDR.css +0 -1
  362. package/src/assets/web-panel/assets/SyncSettings-DgvsRpGt.js +0 -1
  363. package/src/assets/web-panel/assets/Tasks-BJjN_YEm.css +0 -1
  364. package/src/assets/web-panel/assets/Tasks-L5qXKsxK.js +0 -1
  365. package/src/assets/web-panel/assets/Templates-BWTV8-2E.css +0 -1
  366. package/src/assets/web-panel/assets/Templates-DR4VBx7q.js +0 -1
  367. package/src/assets/web-panel/assets/Tenant-D3zkSAV0.css +0 -1
  368. package/src/assets/web-panel/assets/Tenant-jMyaK184.js +0 -1
  369. package/src/assets/web-panel/assets/Terminal-DA5gjCiE.js +0 -3
  370. package/src/assets/web-panel/assets/Terminal-G1DrFtKr.css +0 -1
  371. package/src/assets/web-panel/assets/TimelineRenderer-BM17JHyr.js +0 -1
  372. package/src/assets/web-panel/assets/TimelineRenderer-DmztdsbF.css +0 -1
  373. package/src/assets/web-panel/assets/Tokens-BBOdNRHQ.css +0 -1
  374. package/src/assets/web-panel/assets/Tokens-CCJIrnhi.js +0 -1
  375. package/src/assets/web-panel/assets/Trust-BHeJEfNG.js +0 -1
  376. package/src/assets/web-panel/assets/Trust-DeOo0xAh.css +0 -1
  377. package/src/assets/web-panel/assets/UkeySign-DjcIVRk4.js +0 -1
  378. package/src/assets/web-panel/assets/VideoEditing-BPhptg3q.js +0 -1
  379. package/src/assets/web-panel/assets/VideoEditing-DksiizfS.css +0 -1
  380. package/src/assets/web-panel/assets/Wallet-D_xDgfaz.js +0 -4
  381. package/src/assets/web-panel/assets/Wallet-gR0ZvZbK.css +0 -1
  382. package/src/assets/web-panel/assets/WebAuthn-SSh5VhVO.css +0 -1
  383. package/src/assets/web-panel/assets/WebAuthn-pd961lgM.js +0 -5
  384. package/src/assets/web-panel/assets/WorkflowEditor-BmXDUZ8M.js +0 -1
  385. package/src/assets/web-panel/assets/WorkflowEditor-IiwsD8Kh.css +0 -1
  386. package/src/assets/web-panel/assets/createContext-BBLoTzN8.js +0 -1
  387. package/src/assets/web-panel/assets/devWarning-CNIS3FrJ.js +0 -1
  388. package/src/assets/web-panel/assets/echarts-Dj_pBaVI.js +0 -19
  389. package/src/assets/web-panel/assets/favicon-FSU2gSy6.ico +0 -0
  390. package/src/assets/web-panel/assets/index-1xUFGcnI.js +0 -21
  391. package/src/assets/web-panel/assets/index-4BeUpRaU.js +0 -1
  392. package/src/assets/web-panel/assets/index-AVHrO1io.js +0 -21
  393. package/src/assets/web-panel/assets/index-B2fc2n_u.js +0 -3
  394. package/src/assets/web-panel/assets/index-B5aXiiOG.js +0 -1
  395. package/src/assets/web-panel/assets/index-B78VsLFL.js +0 -1
  396. package/src/assets/web-panel/assets/index-BECv44dY.js +0 -12
  397. package/src/assets/web-panel/assets/index-BGn5-2TK.js +0 -1
  398. package/src/assets/web-panel/assets/index-BM9IHnrf.js +0 -13
  399. package/src/assets/web-panel/assets/index-BlMshk9V.js +0 -1
  400. package/src/assets/web-panel/assets/index-BoWoWh9f.js +0 -19
  401. package/src/assets/web-panel/assets/index-Bt79ud6Y.js +0 -1
  402. package/src/assets/web-panel/assets/index-CO9Tt0Bo.js +0 -1
  403. package/src/assets/web-panel/assets/index-CSZvB2uy.js +0 -12
  404. package/src/assets/web-panel/assets/index-CjeazYU2.js +0 -1
  405. package/src/assets/web-panel/assets/index-Cw-TEBru.js +0 -1
  406. package/src/assets/web-panel/assets/index-CyObfnlZ.js +0 -3
  407. package/src/assets/web-panel/assets/index-D0d2TS5o.js +0 -69
  408. package/src/assets/web-panel/assets/index-DV3zNhRX.js +0 -1
  409. package/src/assets/web-panel/assets/index-DnHElN_A.js +0 -7
  410. package/src/assets/web-panel/assets/index-DspW4reY.js +0 -55
  411. package/src/assets/web-panel/assets/index-DxUFdvJ5.js +0 -1
  412. package/src/assets/web-panel/assets/index-La4F-U-s.js +0 -1
  413. package/src/assets/web-panel/assets/index-azbNWBMo.js +0 -1
  414. package/src/assets/web-panel/assets/index-squRDiXd.js +0 -31
  415. package/src/assets/web-panel/assets/isSymbol-DAy2hlR5.js +0 -1
  416. package/src/assets/web-panel/assets/motion-ChVLXdRp.js +0 -11
  417. package/src/assets/web-panel/assets/useFlexGapSupport-CzD0s7wN.js +0 -1
  418. package/src/assets/web-panel/assets/vendor-DhFY8mDK.js +0 -1
  419. package/src/assets/web-panel/assets/vnode-CnXQ7gJ2.js +0 -1
  420. 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
+ }
@@ -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
- { role: "system", content: buildSystemPrompt(process.cwd()) },
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: effectivePrompt });
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) {
@@ -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: trimmed });
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
- const dir = args.directory ? path.resolve(cwd, args.directory) : cwd;
966
- try {
967
- if (args.content_search) {
968
- const cmd =
969
- process.platform === "win32"
970
- ? `findstr /s /i /n "${args.pattern}" *`
971
- : `grep -r -l -i "${args.pattern}" . --include="*" 2>/dev/null | head -20`;
972
- const output = execSync(cmd, {
973
- cwd: dir,
974
- encoding: "utf8",
975
- timeout: 10000,
976
- });
977
- return attachDescriptor({
978
- matches: output.trim().split("\n").slice(0, 20),
979
- });
980
- } else {
981
- const cmd =
982
- process.platform === "win32"
983
- ? `dir /s /b *${args.pattern}* 2>NUL`
984
- : `find . -name "*${args.pattern}*" -type f 2>/dev/null | head -20`;
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: dir,
1007
+ cwd: root,
987
1008
  encoding: "utf8",
988
1009
  timeout: 10000,
989
1010
  });
990
- return attachDescriptor({
991
- files: output.trim().split("\n").filter(Boolean).slice(0, 20),
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: persona?.toolsDisabled,
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
+ }