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
@@ -6,7 +6,56 @@
6
6
  * AI reads files, writes code, runs commands, and explains what it's doing.
7
7
  */
8
8
 
9
+ import path from "node:path";
10
+ import fs from "node:fs";
9
11
  import { createAgentRuntimeFactory } from "../runtime/runtime-factory.js";
12
+ import { resolvePromptText } from "../runtime/system-prompt.js";
13
+ import { makeFallbackChatFn } from "../runtime/fallback-model.js";
14
+
15
+ /**
16
+ * Resolve + validate `--add-dir` values into absolute, existing, de-duped
17
+ * directories. Invalid entries are skipped with a stderr warning rather than
18
+ * aborting the run. Relative paths resolve against the process cwd.
19
+ *
20
+ * @param {string[]} [rawDirs]
21
+ * @returns {string[]} absolute directory paths
22
+ */
23
+ export function resolveAddDirs(rawDirs) {
24
+ const out = [];
25
+ for (const d of rawDirs || []) {
26
+ const abs = path.resolve(process.cwd(), d);
27
+ try {
28
+ if (fs.existsSync(abs) && fs.statSync(abs).isDirectory()) {
29
+ if (!out.includes(abs)) out.push(abs);
30
+ } else {
31
+ process.stderr.write(`--add-dir: skipping non-directory "${d}"\n`);
32
+ }
33
+ } catch {
34
+ process.stderr.write(`--add-dir: skipping unreadable "${d}"\n`);
35
+ }
36
+ }
37
+ return out;
38
+ }
39
+
40
+ /**
41
+ * Read all of stdin as a UTF-8 string. Resolves "" immediately when stdin is a
42
+ * TTY (nothing piped) so we never block an interactive invocation.
43
+ */
44
+ function readStdin() {
45
+ return new Promise((resolve) => {
46
+ if (process.stdin.isTTY) {
47
+ resolve("");
48
+ return;
49
+ }
50
+ let data = "";
51
+ process.stdin.setEncoding("utf8");
52
+ process.stdin.on("data", (chunk) => {
53
+ data += chunk;
54
+ });
55
+ process.stdin.on("end", () => resolve(data));
56
+ process.stdin.on("error", () => resolve(data));
57
+ });
58
+ }
10
59
 
11
60
  export function registerAgentCommand(program) {
12
61
  program
@@ -15,6 +64,10 @@ export function registerAgentCommand(program) {
15
64
  .description(
16
65
  "Start an agentic AI session (reads/writes files, runs commands)",
17
66
  )
67
+ .argument(
68
+ "[task...]",
69
+ "Headless task — when given (or with -p / piped stdin), runs non-interactively",
70
+ )
18
71
  .option("--model <model>", "Model name")
19
72
  .option(
20
73
  "--provider <provider>",
@@ -23,6 +76,19 @@ export function registerAgentCommand(program) {
23
76
  .option("--base-url <url>", "API base URL")
24
77
  .option("--api-key <key>", "API key")
25
78
  .option("--session <id>", "Resume a previous agent session")
79
+ .option(
80
+ "-c, --continue",
81
+ "Resume the most recent session (no id needed — claude --continue parity)",
82
+ )
83
+ .option(
84
+ "--resume [id]",
85
+ "Resume a session by id (no id → most recent — claude --resume parity)",
86
+ )
87
+ .option(
88
+ "--add-dir <dir>",
89
+ "Extra working directory the agent may read/search/edit (repeatable)",
90
+ (val, prev) => (prev || []).concat([val]),
91
+ )
26
92
  .option("--agent-id <id>", "Agent id for scoped memory recall")
27
93
  .option("--recall-limit <n>", "Top-K memories to inject into system prompt")
28
94
  .option("--recall-query <q>", "Query string for startup memory recall")
@@ -36,7 +102,235 @@ export function registerAgentCommand(program) {
36
102
  "--bundle <path>",
37
103
  "Agent bundle directory (chainless-agent.toml + AGENTS.md + skills/ + mcp.json + USER.md)",
38
104
  )
39
- .action(async (options) => {
105
+ // ── Headless / print mode (Claude-Code `claude -p` parity) ───────────
106
+ .option(
107
+ "-p, --print [prompt]",
108
+ "Headless: run one non-interactive turn and exit",
109
+ )
110
+ .option(
111
+ "--output-format <fmt>",
112
+ "Headless output: text | json | stream-json",
113
+ "text",
114
+ )
115
+ .option("--max-turns <n>", "Cap agent loop iterations (headless)")
116
+ .option(
117
+ "--allowed-tools <list>",
118
+ "Comma/space-separated tool allow-list (headless)",
119
+ )
120
+ .option(
121
+ "--disallowed-tools <list>",
122
+ "Comma/space-separated tool deny-list (headless)",
123
+ )
124
+ .option(
125
+ "--permission-mode <mode>",
126
+ "default | plan | acceptEdits | bypassPermissions (headless)",
127
+ )
128
+ .option(
129
+ "--no-file-refs",
130
+ "Disable @path file-reference expansion in the prompt (headless)",
131
+ )
132
+ .option(
133
+ "--system-prompt <text>",
134
+ "Replace the built-in system prompt (literal text or @file)",
135
+ )
136
+ .option(
137
+ "--append-system-prompt <text>",
138
+ "Append extra guidance to the system prompt (literal text or @file)",
139
+ )
140
+ .option(
141
+ "--input-format <fmt>",
142
+ "Headless input: text | stream-json (NDJSON user events on stdin, multi-turn)",
143
+ "text",
144
+ )
145
+ .option(
146
+ "--fallback-model <model>",
147
+ "Retry once on this model when the primary fails (overload/network)",
148
+ )
149
+ .action(async (task, options) => {
150
+ // `--continue` / `--resume` resolve a session id so the user need not
151
+ // copy it. Explicit `--session <id>` always wins. `--resume <id>` targets
152
+ // a specific session; `--continue` or a bare `--resume` pick the most
153
+ // recent. All three funnel into `options.session`, which both the headless
154
+ // runner and the interactive runtime use to replay prior history.
155
+ if (typeof options.resume === "string" && !options.session) {
156
+ options.session = options.resume;
157
+ }
158
+ if ((options.continue || options.resume === true) && !options.session) {
159
+ const { bootstrap } = await import("../runtime/bootstrap.js");
160
+ const ctx = await bootstrap({ verbose: program.opts().verbose });
161
+ // Headless intent also means "no interactive picker is possible": -p,
162
+ // a positional task, an explicit --output-format, or a non-TTY stdin.
163
+ const headlessIntent =
164
+ options.print !== undefined ||
165
+ (Array.isArray(task) && task.length > 0) ||
166
+ options.outputFormat !== "text" ||
167
+ !process.stdin.isTTY;
168
+ if (headlessIntent) {
169
+ // Headless replays the JSONL store only, so resolve "most recent"
170
+ // from there — a DB-only id would resume into an empty transcript.
171
+ const { getLastSessionId } =
172
+ await import("../harness/jsonl-session-store.js");
173
+ options.session = getLastSessionId();
174
+ } else {
175
+ // Interactive: picker across both stores (agent REPL rebuilds either).
176
+ const { pickRecentSession } =
177
+ await import("../lib/session-picker.js");
178
+ const picked = await pickRecentSession(ctx, {
179
+ message: "Resume which agent session?",
180
+ });
181
+ options.session = picked.id;
182
+ }
183
+ if (!options.session) {
184
+ process.stderr.write(
185
+ "No previous session to continue. Start one with `cc agent`.\n",
186
+ );
187
+ process.exit(1);
188
+ }
189
+ }
190
+
191
+ // Extra workspace roots (--add-dir) — shared by headless + interactive.
192
+ const additionalDirectories = resolveAddDirs(options.addDir);
193
+
194
+ // --fallback-model: a chatFn that retries once on the backup model when
195
+ // the primary errors out (overload / rate-limit / network). Passed into
196
+ // the headless runners via options.chatFn (the agent loop's seam), so no
197
+ // runner changes are needed. Notice goes to stderr to keep stdout clean.
198
+ const fallbackChatFn = options.fallbackModel
199
+ ? makeFallbackChatFn({
200
+ fallbackModel: options.fallbackModel,
201
+ onFallback: ({ from, to, error }) =>
202
+ process.stderr.write(
203
+ `Note: model "${from}" failed (${error}); retrying with --fallback-model "${to}".\n`,
204
+ ),
205
+ })
206
+ : undefined;
207
+
208
+ // ── Streaming-input mode (--input-format stream-json) ────────────────
209
+ // A persistent multi-turn conversation driven by NDJSON user events on
210
+ // stdin; output is always NDJSON. Routed before single-prompt handling
211
+ // so stdin is consumed as events, not as one prompt.
212
+ if (options.inputFormat === "stream-json") {
213
+ const { runAgentHeadlessStream } =
214
+ await import("../runtime/headless-stream.js");
215
+ const { parseToolList } = await import("../runtime/headless-runner.js");
216
+ const cwd = process.cwd();
217
+ let outcome;
218
+ try {
219
+ outcome = await runAgentHeadlessStream({
220
+ model: options.model,
221
+ provider: options.provider,
222
+ baseUrl: options.baseUrl,
223
+ apiKey: options.apiKey,
224
+ sessionId: options.session,
225
+ permissionMode: options.permissionMode,
226
+ allowedTools: parseToolList(options.allowedTools),
227
+ disallowedTools: parseToolList(options.disallowedTools),
228
+ additionalDirectories,
229
+ maxTurns: options.maxTurns
230
+ ? parseInt(options.maxTurns, 10)
231
+ : undefined,
232
+ expandFileRefs: options.fileRefs !== false,
233
+ systemPrompt: resolvePromptText(options.systemPrompt, { cwd }),
234
+ appendSystemPrompt: resolvePromptText(options.appendSystemPrompt, {
235
+ cwd,
236
+ }),
237
+ chatFn: fallbackChatFn,
238
+ });
239
+ } catch (err) {
240
+ process.stderr.write(`Error: ${err.message}\n`);
241
+ process.exit(1);
242
+ }
243
+ process.exit(outcome.exitCode);
244
+ return;
245
+ }
246
+ if (options.inputFormat && options.inputFormat !== "text") {
247
+ process.stderr.write(
248
+ `Invalid --input-format "${options.inputFormat}". Expected: text | stream-json.\n`,
249
+ );
250
+ process.exit(1);
251
+ }
252
+
253
+ // Resolve the headless prompt from: --print value, positional task, or
254
+ // piped stdin (in that precedence). Any of them → headless mode.
255
+ const positional =
256
+ Array.isArray(task) && task.length > 0 ? task.join(" ") : "";
257
+ let prompt = "";
258
+ if (typeof options.print === "string" && options.print.trim()) {
259
+ prompt = options.print.trim();
260
+ } else if (positional) {
261
+ prompt = positional;
262
+ }
263
+ // -p with no inline value, or an explicit --output-format, signals
264
+ // headless intent; pull the prompt from piped stdin when one is present.
265
+ const wantsHeadless =
266
+ options.print !== undefined ||
267
+ Boolean(positional) ||
268
+ options.outputFormat !== "text";
269
+ if (!prompt && (wantsHeadless || !process.stdin.isTTY)) {
270
+ const piped = (await readStdin()).trim();
271
+ if (piped) prompt = piped;
272
+ }
273
+
274
+ if (prompt) {
275
+ // Resume requested onto a session with no headless (JSONL) transcript?
276
+ // Warn instead of silently starting empty — headless resume rebuilds
277
+ // from the JSONL store only (DB-only sessions are not replayable here).
278
+ const resumeRequested =
279
+ Boolean(options.continue) || options.resume !== undefined;
280
+ if (resumeRequested && options.session) {
281
+ const { sessionExists } =
282
+ await import("../harness/jsonl-session-store.js");
283
+ if (!sessionExists(options.session)) {
284
+ process.stderr.write(
285
+ `Note: no headless transcript for session "${options.session}" — ` +
286
+ "starting fresh (headless resume reads JSONL sessions only).\n",
287
+ );
288
+ }
289
+ }
290
+ const { runAgentHeadless, parseToolList } =
291
+ await import("../runtime/headless-runner.js");
292
+ const maxTurns = options.maxTurns
293
+ ? parseInt(options.maxTurns, 10)
294
+ : undefined;
295
+ let outcome;
296
+ try {
297
+ outcome = await runAgentHeadless({
298
+ prompt,
299
+ model: options.model,
300
+ provider: options.provider,
301
+ baseUrl: options.baseUrl,
302
+ apiKey: options.apiKey,
303
+ sessionId: options.session,
304
+ // A resolved --session/--continue/--resume id means "replay this
305
+ // conversation and persist the new turns"; the runner loads prior
306
+ // history when the id already exists and creates it otherwise.
307
+ resume: options.session,
308
+ outputFormat: options.outputFormat,
309
+ permissionMode: options.permissionMode,
310
+ allowedTools: parseToolList(options.allowedTools),
311
+ disallowedTools: parseToolList(options.disallowedTools),
312
+ additionalDirectories,
313
+ maxTurns,
314
+ // commander maps --no-file-refs → options.fileRefs === false
315
+ expandFileRefs: options.fileRefs !== false,
316
+ // --system-prompt / --append-system-prompt (literal or @file)
317
+ systemPrompt: resolvePromptText(options.systemPrompt, {
318
+ cwd: process.cwd(),
319
+ }),
320
+ appendSystemPrompt: resolvePromptText(options.appendSystemPrompt, {
321
+ cwd: process.cwd(),
322
+ }),
323
+ // --fallback-model: retry once on a backup model on transient errors
324
+ chatFn: fallbackChatFn,
325
+ });
326
+ } catch (err) {
327
+ process.stderr.write(`Error: ${err.message}\n`);
328
+ process.exit(1);
329
+ }
330
+ process.exit(outcome.exitCode);
331
+ return;
332
+ }
333
+
40
334
  const runtime = createAgentRuntimeFactory().createAgentRuntime({
41
335
  model: options.model,
42
336
  provider: options.provider,
@@ -50,6 +344,17 @@ export function registerAgentCommand(program) {
50
344
  noStream: options.stream === false, // true when --no-stream
51
345
  parkOnExit: options.parkOnExit, // false when --no-park-on-exit
52
346
  bundlePath: options.bundle || null,
347
+ additionalDirectories,
348
+ // --system-prompt / --append-system-prompt (literal or @file) also
349
+ // apply to interactive sessions, composed in startAgentRepl.
350
+ systemPrompt: resolvePromptText(options.systemPrompt, {
351
+ cwd: process.cwd(),
352
+ }),
353
+ appendSystemPrompt: resolvePromptText(options.appendSystemPrompt, {
354
+ cwd: process.cwd(),
355
+ }),
356
+ // --fallback-model also applies interactively (wrapper built in the REPL)
357
+ fallbackModel: options.fallbackModel || null,
53
358
  });
54
359
  await runtime.startAgentSession();
55
360
  });
@@ -25,9 +25,28 @@ import ora from "ora";
25
25
  import { logger } from "../lib/logger.js";
26
26
  import { BUILT_IN_PROVIDERS } from "../lib/llm-providers.js";
27
27
  import { loadConfig } from "../lib/config-manager.js";
28
+ import { expandFileRefs } from "../runtime/file-ref-expander.js";
28
29
 
29
30
  const ANDROID_LOCAL_OLLAMA_URL = "http://127.0.0.1:18484";
30
31
 
32
+ /**
33
+ * Expand `@path` file references in the question (Claude-Code parity), unless
34
+ * disabled. Returns the (possibly augmented) prompt plus any warnings for
35
+ * typo'd paths. Exported so the wiring is unit-testable without a live LLM.
36
+ *
37
+ * @param {string} question
38
+ * @param {object} [opts] { cwd, enabled }
39
+ * @returns {{ prompt:string, warnings:string[] }}
40
+ */
41
+ export function expandQuestionRefs(
42
+ question,
43
+ { cwd = process.cwd(), enabled = true } = {},
44
+ ) {
45
+ if (!enabled) return { prompt: question, warnings: [] };
46
+ const { prompt, warnings } = expandFileRefs(question, { cwd });
47
+ return { prompt, warnings };
48
+ }
49
+
31
50
  /**
32
51
  * Resolve effective Ollama base URL given CLI options, env, and config.
33
52
  * Exported for unit testing.
@@ -144,6 +163,10 @@ export function registerAskCommand(program) {
144
163
  "--prefer-android-local",
145
164
  "Route ollama provider at the Android in-APK LocalLlmServer (127.0.0.1:18484). One-shot equivalent of `cc config set llm.preferAndroidLocal true`.",
146
165
  )
166
+ .option(
167
+ "--no-file-refs",
168
+ "Do not expand @path file references in the question",
169
+ )
147
170
  .option("--json", "Output as JSON")
148
171
  .action(async (question, options) => {
149
172
  const config = loadConfig();
@@ -167,9 +190,20 @@ export function registerAskCommand(program) {
167
190
  resolvedOptions.baseUrl = options.baseUrl || config.llm?.baseUrl;
168
191
  }
169
192
 
193
+ // Expand @path references (e.g. `cc ask "summarize @notes.md"`) before
194
+ // sending to the model. The original question is preserved for --json
195
+ // output; only the LLM sees the injected file contents.
196
+ const { prompt: expandedQuestion, warnings } = expandQuestionRefs(
197
+ question,
198
+ { enabled: options.fileRefs !== false },
199
+ );
200
+ for (const w of warnings) {
201
+ process.stderr.write(`[@ref] ${w}\n`);
202
+ }
203
+
170
204
  const spinner = ora("Thinking...").start();
171
205
  try {
172
- const answer = await queryLLM(question, resolvedOptions);
206
+ const answer = await queryLLM(expandedQuestion, resolvedOptions);
173
207
 
174
208
  spinner.stop();
175
209
 
@@ -0,0 +1,239 @@
1
+ /**
2
+ * cc checkpoint — manual file-state snapshot / rewind (Claude-Code rewind parity).
3
+ *
4
+ * cc checkpoint create <paths...> [--label <l>] snapshot files/dirs
5
+ * cc checkpoint list list checkpoints
6
+ * cc checkpoint show <id> [--diff] manifest, or diff vs current
7
+ * cc checkpoint restore <id> [--dry-run] [--force] roll files back
8
+ * cc checkpoint delete <id> [--force] remove a checkpoint
9
+ *
10
+ * Restore takes an automatic safety snapshot of the current contents first, so
11
+ * a rewind is itself reversible. Distinct from `cc workflow checkpoint`
12
+ * (workflow execution state, not files).
13
+ */
14
+
15
+ import chalk from "chalk";
16
+ import { logger } from "../lib/logger.js";
17
+
18
+ export function registerCheckpointCommand(program) {
19
+ const cp = program
20
+ .command("checkpoint")
21
+ .description("Snapshot / rewind file state (manual checkpoints)");
22
+
23
+ cp.command("create <paths...>")
24
+ .description("Snapshot the given files/directories")
25
+ .option("--label <label>", "Human label for this checkpoint")
26
+ .option("--json", "Output as JSON")
27
+ .action(async (paths, options) => {
28
+ try {
29
+ const { createCheckpoint } = await import("../lib/file-checkpoint.js");
30
+ const m = createCheckpoint(paths, { label: options.label });
31
+ if (options.json) {
32
+ console.log(JSON.stringify(m, null, 2));
33
+ return;
34
+ }
35
+ logger.log(
36
+ chalk.green(`✓ checkpoint ${chalk.bold(m.id)}`) +
37
+ (m.label ? chalk.gray(` "${m.label}"`) : ""),
38
+ );
39
+ logger.log(chalk.gray(` ${m.fileCount} file(s) snapshotted`));
40
+ } catch (err) {
41
+ logger.error(chalk.red(`checkpoint create failed: ${err.message}`));
42
+ process.exitCode = 1;
43
+ }
44
+ });
45
+
46
+ cp.command("list")
47
+ .alias("ls")
48
+ .description("List checkpoints (newest first)")
49
+ .option("--json", "Output as JSON")
50
+ .action(async (options) => {
51
+ try {
52
+ const { listCheckpoints } = await import("../lib/file-checkpoint.js");
53
+ const all = listCheckpoints();
54
+ if (options.json) {
55
+ console.log(JSON.stringify(all, null, 2));
56
+ return;
57
+ }
58
+ if (all.length === 0) {
59
+ logger.log(
60
+ chalk.gray(
61
+ "No checkpoints. Create one: cc checkpoint create <paths...>",
62
+ ),
63
+ );
64
+ return;
65
+ }
66
+ for (const c of all) {
67
+ logger.log(
68
+ `${chalk.cyan(c.id.padEnd(22))} ${chalk.gray(c.createdAt)} ` +
69
+ `${String(c.fileCount).padStart(4)} files` +
70
+ (c.label ? chalk.gray(` "${c.label}"`) : ""),
71
+ );
72
+ }
73
+ } catch (err) {
74
+ logger.error(chalk.red(`checkpoint list failed: ${err.message}`));
75
+ process.exitCode = 1;
76
+ }
77
+ });
78
+
79
+ cp.command("show <id>")
80
+ .description("Show a checkpoint's files, or its diff vs current state")
81
+ .option("--diff", "Compare snapshot against current on-disk files")
82
+ .option("--json", "Output as JSON")
83
+ .action(async (id, options) => {
84
+ try {
85
+ const { getCheckpoint, diffCheckpoint } =
86
+ await import("../lib/file-checkpoint.js");
87
+ if (options.diff) {
88
+ const d = diffCheckpoint(id);
89
+ if (options.json) {
90
+ console.log(JSON.stringify(d, null, 2));
91
+ return;
92
+ }
93
+ logger.log(chalk.bold(`Diff vs current — ${id}`));
94
+ logger.log(` ${chalk.yellow("modified")}: ${d.modified.length}`);
95
+ d.modified.forEach((f) => logger.log(chalk.yellow(` M ${f}`)));
96
+ logger.log(` ${chalk.red("deleted")}: ${d.deleted.length}`);
97
+ d.deleted.forEach((f) => logger.log(chalk.red(` D ${f}`)));
98
+ logger.log(chalk.gray(` unchanged: ${d.unchanged.length}`));
99
+ return;
100
+ }
101
+ const m = getCheckpoint(id);
102
+ if (!m) {
103
+ logger.error(chalk.red(`no such checkpoint: ${id}`));
104
+ process.exitCode = 1;
105
+ return;
106
+ }
107
+ if (options.json) {
108
+ console.log(JSON.stringify(m, null, 2));
109
+ return;
110
+ }
111
+ logger.log(chalk.bold(`Checkpoint ${m.id}`));
112
+ if (m.label) logger.log(chalk.gray(` label: ${m.label}`));
113
+ logger.log(
114
+ chalk.gray(` created: ${m.createdAt} files: ${m.fileCount}`),
115
+ );
116
+ for (const f of m.files) {
117
+ logger.log(` ${chalk.gray(String(f.bytes).padStart(8))} ${f.rel}`);
118
+ }
119
+ } catch (err) {
120
+ logger.error(chalk.red(`checkpoint show failed: ${err.message}`));
121
+ process.exitCode = 1;
122
+ }
123
+ });
124
+
125
+ cp.command("restore <id>")
126
+ .description(
127
+ "Restore files from a checkpoint (auto-snapshots current state first)",
128
+ )
129
+ .option("--dry-run", "Show what would change without writing")
130
+ .option("--force", "Restore without the interactive confirm prompt")
131
+ .option("--json", "Output as JSON")
132
+ .action(async (id, options) => {
133
+ try {
134
+ const { restoreCheckpoint, diffCheckpoint } =
135
+ await import("../lib/file-checkpoint.js");
136
+
137
+ if (options.dryRun) {
138
+ const r = restoreCheckpoint(id, { dryRun: true });
139
+ if (options.json) {
140
+ console.log(JSON.stringify(r, null, 2));
141
+ return;
142
+ }
143
+ logger.log(chalk.bold(`Dry-run restore — ${id}`));
144
+ logger.log(` would restore: ${r.restored.length} file(s)`);
145
+ r.restored.forEach((f) => logger.log(chalk.yellow(` ~ ${f}`)));
146
+ logger.log(chalk.gray(` already matching: ${r.unchanged.length}`));
147
+ if (r.missingBlob.length) {
148
+ logger.log(
149
+ chalk.red(` missing blobs: ${r.missingBlob.join(", ")}`),
150
+ );
151
+ }
152
+ return;
153
+ }
154
+
155
+ // Destructive: overwrites current files. Require --force when not a TTY;
156
+ // prompt when interactive.
157
+ if (!options.force) {
158
+ const d = diffCheckpoint(id);
159
+ const willChange = d.modified.length + d.deleted.length;
160
+ if (process.stdin.isTTY) {
161
+ const { confirm } = await import("@inquirer/prompts");
162
+ const ok = await confirm({
163
+ message: `Restore ${id}? ${willChange} file(s) will be overwritten (a safety checkpoint is taken first).`,
164
+ default: false,
165
+ }).catch(() => false);
166
+ if (!ok) {
167
+ logger.log(chalk.gray("Aborted."));
168
+ return;
169
+ }
170
+ } else {
171
+ logger.error(
172
+ chalk.red(
173
+ `Refusing to restore without --force (non-interactive). ${willChange} file(s) would change. Re-run with --dry-run to preview or --force to proceed.`,
174
+ ),
175
+ );
176
+ process.exitCode = 1;
177
+ return;
178
+ }
179
+ }
180
+
181
+ const r = restoreCheckpoint(id);
182
+ if (options.json) {
183
+ console.log(JSON.stringify(r, null, 2));
184
+ return;
185
+ }
186
+ logger.log(
187
+ chalk.green(`✓ restored ${r.restored.length} file(s) from ${id}`),
188
+ );
189
+ r.restored.forEach((f) => logger.log(chalk.gray(` ~ ${f}`)));
190
+ if (r.safetyId) {
191
+ logger.log(
192
+ chalk.gray(
193
+ ` safety checkpoint of prior state: ${r.safetyId} (undo with: cc checkpoint restore ${r.safetyId})`,
194
+ ),
195
+ );
196
+ }
197
+ if (r.missingBlob.length) {
198
+ logger.log(
199
+ chalk.red(` missing blobs (skipped): ${r.missingBlob.join(", ")}`),
200
+ );
201
+ }
202
+ } catch (err) {
203
+ logger.error(chalk.red(`checkpoint restore failed: ${err.message}`));
204
+ process.exitCode = 1;
205
+ }
206
+ });
207
+
208
+ cp.command("delete <id>")
209
+ .alias("rm")
210
+ .description("Delete a checkpoint")
211
+ .option("--force", "Skip confirmation")
212
+ .action(async (id, options) => {
213
+ try {
214
+ const { deleteCheckpoint, getCheckpoint } =
215
+ await import("../lib/file-checkpoint.js");
216
+ if (!getCheckpoint(id)) {
217
+ logger.error(chalk.red(`no such checkpoint: ${id}`));
218
+ process.exitCode = 1;
219
+ return;
220
+ }
221
+ if (!options.force && process.stdin.isTTY) {
222
+ const { confirm } = await import("@inquirer/prompts");
223
+ const ok = await confirm({
224
+ message: `Delete checkpoint ${id}?`,
225
+ default: false,
226
+ }).catch(() => false);
227
+ if (!ok) {
228
+ logger.log(chalk.gray("Aborted."));
229
+ return;
230
+ }
231
+ }
232
+ deleteCheckpoint(id);
233
+ logger.log(chalk.green(`✓ deleted ${id}`));
234
+ } catch (err) {
235
+ logger.error(chalk.red(`checkpoint delete failed: ${err.message}`));
236
+ process.exitCode = 1;
237
+ }
238
+ });
239
+ }