@imdigitalashish/zpi 0.1.1

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 (604) hide show
  1. package/CHANGELOG.md +2801 -0
  2. package/README.md +95 -0
  3. package/dist/cli/args.d.ts +47 -0
  4. package/dist/cli/args.d.ts.map +1 -0
  5. package/dist/cli/args.js +293 -0
  6. package/dist/cli/args.js.map +1 -0
  7. package/dist/cli/config-selector.d.ts +14 -0
  8. package/dist/cli/config-selector.d.ts.map +1 -0
  9. package/dist/cli/config-selector.js +31 -0
  10. package/dist/cli/config-selector.js.map +1 -0
  11. package/dist/cli/file-processor.d.ts +15 -0
  12. package/dist/cli/file-processor.d.ts.map +1 -0
  13. package/dist/cli/file-processor.js +79 -0
  14. package/dist/cli/file-processor.js.map +1 -0
  15. package/dist/cli/list-models.d.ts +9 -0
  16. package/dist/cli/list-models.d.ts.map +1 -0
  17. package/dist/cli/list-models.js +92 -0
  18. package/dist/cli/list-models.js.map +1 -0
  19. package/dist/cli/session-picker.d.ts +9 -0
  20. package/dist/cli/session-picker.d.ts.map +1 -0
  21. package/dist/cli/session-picker.js +34 -0
  22. package/dist/cli/session-picker.js.map +1 -0
  23. package/dist/cli.d.ts +3 -0
  24. package/dist/cli.d.ts.map +1 -0
  25. package/dist/cli.js +11 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/config.d.ts +68 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +203 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/core/agent-session.d.ts +571 -0
  32. package/dist/core/agent-session.d.ts.map +1 -0
  33. package/dist/core/agent-session.js +2353 -0
  34. package/dist/core/agent-session.js.map +1 -0
  35. package/dist/core/auth-storage.d.ts +129 -0
  36. package/dist/core/auth-storage.d.ts.map +1 -0
  37. package/dist/core/auth-storage.js +394 -0
  38. package/dist/core/auth-storage.js.map +1 -0
  39. package/dist/core/bash-executor.d.ts +47 -0
  40. package/dist/core/bash-executor.d.ts.map +1 -0
  41. package/dist/core/bash-executor.js +212 -0
  42. package/dist/core/bash-executor.js.map +1 -0
  43. package/dist/core/compaction/branch-summarization.d.ts +86 -0
  44. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  45. package/dist/core/compaction/branch-summarization.js +242 -0
  46. package/dist/core/compaction/branch-summarization.js.map +1 -0
  47. package/dist/core/compaction/compaction.d.ts +121 -0
  48. package/dist/core/compaction/compaction.d.ts.map +1 -0
  49. package/dist/core/compaction/compaction.js +607 -0
  50. package/dist/core/compaction/compaction.js.map +1 -0
  51. package/dist/core/compaction/index.d.ts +7 -0
  52. package/dist/core/compaction/index.d.ts.map +1 -0
  53. package/dist/core/compaction/index.js +7 -0
  54. package/dist/core/compaction/index.js.map +1 -0
  55. package/dist/core/compaction/utils.d.ts +35 -0
  56. package/dist/core/compaction/utils.d.ts.map +1 -0
  57. package/dist/core/compaction/utils.js +138 -0
  58. package/dist/core/compaction/utils.js.map +1 -0
  59. package/dist/core/defaults.d.ts +3 -0
  60. package/dist/core/defaults.d.ts.map +1 -0
  61. package/dist/core/defaults.js +2 -0
  62. package/dist/core/defaults.js.map +1 -0
  63. package/dist/core/diagnostics.d.ts +15 -0
  64. package/dist/core/diagnostics.d.ts.map +1 -0
  65. package/dist/core/diagnostics.js +2 -0
  66. package/dist/core/diagnostics.js.map +1 -0
  67. package/dist/core/event-bus.d.ts +9 -0
  68. package/dist/core/event-bus.d.ts.map +1 -0
  69. package/dist/core/event-bus.js +25 -0
  70. package/dist/core/event-bus.js.map +1 -0
  71. package/dist/core/exec.d.ts +29 -0
  72. package/dist/core/exec.d.ts.map +1 -0
  73. package/dist/core/exec.js +71 -0
  74. package/dist/core/exec.js.map +1 -0
  75. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  76. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  77. package/dist/core/export-html/ansi-to-html.js +249 -0
  78. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  79. package/dist/core/export-html/index.d.ts +34 -0
  80. package/dist/core/export-html/index.d.ts.map +1 -0
  81. package/dist/core/export-html/index.js +222 -0
  82. package/dist/core/export-html/index.js.map +1 -0
  83. package/dist/core/export-html/template.css +971 -0
  84. package/dist/core/export-html/template.html +54 -0
  85. package/dist/core/export-html/template.js +1586 -0
  86. package/dist/core/export-html/tool-renderer.d.ts +35 -0
  87. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  88. package/dist/core/export-html/tool-renderer.js +57 -0
  89. package/dist/core/export-html/tool-renderer.js.map +1 -0
  90. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  91. package/dist/core/export-html/vendor/marked.min.js +6 -0
  92. package/dist/core/extensions/index.d.ts +11 -0
  93. package/dist/core/extensions/index.d.ts.map +1 -0
  94. package/dist/core/extensions/index.js +9 -0
  95. package/dist/core/extensions/index.js.map +1 -0
  96. package/dist/core/extensions/loader.d.ts +25 -0
  97. package/dist/core/extensions/loader.d.ts.map +1 -0
  98. package/dist/core/extensions/loader.js +402 -0
  99. package/dist/core/extensions/loader.js.map +1 -0
  100. package/dist/core/extensions/runner.d.ts +146 -0
  101. package/dist/core/extensions/runner.d.ts.map +1 -0
  102. package/dist/core/extensions/runner.js +626 -0
  103. package/dist/core/extensions/runner.js.map +1 -0
  104. package/dist/core/extensions/types.d.ts +984 -0
  105. package/dist/core/extensions/types.d.ts.map +1 -0
  106. package/dist/core/extensions/types.js +35 -0
  107. package/dist/core/extensions/types.js.map +1 -0
  108. package/dist/core/extensions/wrapper.d.ts +27 -0
  109. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  110. package/dist/core/extensions/wrapper.js +102 -0
  111. package/dist/core/extensions/wrapper.js.map +1 -0
  112. package/dist/core/footer-data-provider.d.ts +32 -0
  113. package/dist/core/footer-data-provider.d.ts.map +1 -0
  114. package/dist/core/footer-data-provider.js +134 -0
  115. package/dist/core/footer-data-provider.js.map +1 -0
  116. package/dist/core/index.d.ts +9 -0
  117. package/dist/core/index.d.ts.map +1 -0
  118. package/dist/core/index.js +9 -0
  119. package/dist/core/index.js.map +1 -0
  120. package/dist/core/keybindings.d.ts +55 -0
  121. package/dist/core/keybindings.d.ts.map +1 -0
  122. package/dist/core/keybindings.js +153 -0
  123. package/dist/core/keybindings.js.map +1 -0
  124. package/dist/core/memory.d.ts +64 -0
  125. package/dist/core/memory.d.ts.map +1 -0
  126. package/dist/core/memory.js +247 -0
  127. package/dist/core/memory.js.map +1 -0
  128. package/dist/core/messages.d.ts +77 -0
  129. package/dist/core/messages.d.ts.map +1 -0
  130. package/dist/core/messages.js +149 -0
  131. package/dist/core/messages.js.map +1 -0
  132. package/dist/core/model-registry.d.ts +102 -0
  133. package/dist/core/model-registry.d.ts.map +1 -0
  134. package/dist/core/model-registry.js +515 -0
  135. package/dist/core/model-registry.js.map +1 -0
  136. package/dist/core/model-resolver.d.ts +104 -0
  137. package/dist/core/model-resolver.d.ts.map +1 -0
  138. package/dist/core/model-resolver.js +403 -0
  139. package/dist/core/model-resolver.js.map +1 -0
  140. package/dist/core/package-manager.d.ts +151 -0
  141. package/dist/core/package-manager.d.ts.map +1 -0
  142. package/dist/core/package-manager.js +1426 -0
  143. package/dist/core/package-manager.js.map +1 -0
  144. package/dist/core/prompt-templates.d.ts +50 -0
  145. package/dist/core/prompt-templates.d.ts.map +1 -0
  146. package/dist/core/prompt-templates.js +251 -0
  147. package/dist/core/prompt-templates.js.map +1 -0
  148. package/dist/core/resolve-config-value.d.ts +17 -0
  149. package/dist/core/resolve-config-value.d.ts.map +1 -0
  150. package/dist/core/resolve-config-value.js +59 -0
  151. package/dist/core/resolve-config-value.js.map +1 -0
  152. package/dist/core/resource-loader.d.ts +184 -0
  153. package/dist/core/resource-loader.d.ts.map +1 -0
  154. package/dist/core/resource-loader.js +673 -0
  155. package/dist/core/resource-loader.js.map +1 -0
  156. package/dist/core/sdk.d.ts +90 -0
  157. package/dist/core/sdk.d.ts.map +1 -0
  158. package/dist/core/sdk.js +238 -0
  159. package/dist/core/sdk.js.map +1 -0
  160. package/dist/core/session-manager.d.ts +323 -0
  161. package/dist/core/session-manager.d.ts.map +1 -0
  162. package/dist/core/session-manager.js +1091 -0
  163. package/dist/core/session-manager.js.map +1 -0
  164. package/dist/core/settings-manager.d.ts +230 -0
  165. package/dist/core/settings-manager.d.ts.map +1 -0
  166. package/dist/core/settings-manager.js +656 -0
  167. package/dist/core/settings-manager.js.map +1 -0
  168. package/dist/core/skills.d.ts +58 -0
  169. package/dist/core/skills.d.ts.map +1 -0
  170. package/dist/core/skills.js +364 -0
  171. package/dist/core/skills.js.map +1 -0
  172. package/dist/core/slash-commands.d.ts +15 -0
  173. package/dist/core/slash-commands.d.ts.map +1 -0
  174. package/dist/core/slash-commands.js +23 -0
  175. package/dist/core/slash-commands.js.map +1 -0
  176. package/dist/core/system-prompt.d.ts +26 -0
  177. package/dist/core/system-prompt.d.ts.map +1 -0
  178. package/dist/core/system-prompt.js +150 -0
  179. package/dist/core/system-prompt.js.map +1 -0
  180. package/dist/core/timings.d.ts +7 -0
  181. package/dist/core/timings.d.ts.map +1 -0
  182. package/dist/core/timings.js +25 -0
  183. package/dist/core/timings.js.map +1 -0
  184. package/dist/core/tools/bash.d.ts +55 -0
  185. package/dist/core/tools/bash.d.ts.map +1 -0
  186. package/dist/core/tools/bash.js +242 -0
  187. package/dist/core/tools/bash.js.map +1 -0
  188. package/dist/core/tools/edit-diff.d.ts +63 -0
  189. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  190. package/dist/core/tools/edit-diff.js +243 -0
  191. package/dist/core/tools/edit-diff.js.map +1 -0
  192. package/dist/core/tools/edit.d.ts +39 -0
  193. package/dist/core/tools/edit.d.ts.map +1 -0
  194. package/dist/core/tools/edit.js +146 -0
  195. package/dist/core/tools/edit.js.map +1 -0
  196. package/dist/core/tools/find.d.ts +39 -0
  197. package/dist/core/tools/find.d.ts.map +1 -0
  198. package/dist/core/tools/find.js +206 -0
  199. package/dist/core/tools/find.js.map +1 -0
  200. package/dist/core/tools/grep.d.ts +45 -0
  201. package/dist/core/tools/grep.d.ts.map +1 -0
  202. package/dist/core/tools/grep.js +239 -0
  203. package/dist/core/tools/grep.js.map +1 -0
  204. package/dist/core/tools/index.d.ts +102 -0
  205. package/dist/core/tools/index.d.ts.map +1 -0
  206. package/dist/core/tools/index.js +71 -0
  207. package/dist/core/tools/index.js.map +1 -0
  208. package/dist/core/tools/ls.d.ts +40 -0
  209. package/dist/core/tools/ls.d.ts.map +1 -0
  210. package/dist/core/tools/ls.js +118 -0
  211. package/dist/core/tools/ls.js.map +1 -0
  212. package/dist/core/tools/memory.d.ts +45 -0
  213. package/dist/core/tools/memory.d.ts.map +1 -0
  214. package/dist/core/tools/memory.js +346 -0
  215. package/dist/core/tools/memory.js.map +1 -0
  216. package/dist/core/tools/path-utils.d.ts +8 -0
  217. package/dist/core/tools/path-utils.d.ts.map +1 -0
  218. package/dist/core/tools/path-utils.js +81 -0
  219. package/dist/core/tools/path-utils.js.map +1 -0
  220. package/dist/core/tools/read.d.ts +39 -0
  221. package/dist/core/tools/read.d.ts.map +1 -0
  222. package/dist/core/tools/read.js +166 -0
  223. package/dist/core/tools/read.js.map +1 -0
  224. package/dist/core/tools/truncate.d.ts +70 -0
  225. package/dist/core/tools/truncate.d.ts.map +1 -0
  226. package/dist/core/tools/truncate.js +205 -0
  227. package/dist/core/tools/truncate.js.map +1 -0
  228. package/dist/core/tools/write.d.ts +29 -0
  229. package/dist/core/tools/write.d.ts.map +1 -0
  230. package/dist/core/tools/write.js +78 -0
  231. package/dist/core/tools/write.js.map +1 -0
  232. package/dist/index.d.ts +28 -0
  233. package/dist/index.d.ts.map +1 -0
  234. package/dist/index.js +43 -0
  235. package/dist/index.js.map +1 -0
  236. package/dist/main.d.ts +8 -0
  237. package/dist/main.d.ts.map +1 -0
  238. package/dist/main.js +651 -0
  239. package/dist/main.js.map +1 -0
  240. package/dist/migrations.d.ts +33 -0
  241. package/dist/migrations.d.ts.map +1 -0
  242. package/dist/migrations.js +261 -0
  243. package/dist/migrations.js.map +1 -0
  244. package/dist/modes/index.d.ts +9 -0
  245. package/dist/modes/index.d.ts.map +1 -0
  246. package/dist/modes/index.js +8 -0
  247. package/dist/modes/index.js.map +1 -0
  248. package/dist/modes/interactive/components/armin.d.ts +34 -0
  249. package/dist/modes/interactive/components/armin.d.ts.map +1 -0
  250. package/dist/modes/interactive/components/armin.js +333 -0
  251. package/dist/modes/interactive/components/armin.js.map +1 -0
  252. package/dist/modes/interactive/components/assistant-message.d.ts +16 -0
  253. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  254. package/dist/modes/interactive/components/assistant-message.js +96 -0
  255. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  256. package/dist/modes/interactive/components/bash-execution.d.ts +35 -0
  257. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  258. package/dist/modes/interactive/components/bash-execution.js +162 -0
  259. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  260. package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  261. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  262. package/dist/modes/interactive/components/bordered-loader.js +51 -0
  263. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  264. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  265. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  266. package/dist/modes/interactive/components/branch-summary-message.js +44 -0
  267. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  268. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  269. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  270. package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
  271. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  272. package/dist/modes/interactive/components/config-selector.d.ts +71 -0
  273. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  274. package/dist/modes/interactive/components/config-selector.js +479 -0
  275. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  276. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  277. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  278. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  279. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  280. package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  281. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  282. package/dist/modes/interactive/components/custom-editor.js +70 -0
  283. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  284. package/dist/modes/interactive/components/custom-message.d.ts +20 -0
  285. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  286. package/dist/modes/interactive/components/custom-message.js +79 -0
  287. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  288. package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  289. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
  290. package/dist/modes/interactive/components/daxnuts.js +140 -0
  291. package/dist/modes/interactive/components/daxnuts.js.map +1 -0
  292. package/dist/modes/interactive/components/diff.d.ts +12 -0
  293. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  294. package/dist/modes/interactive/components/diff.js +133 -0
  295. package/dist/modes/interactive/components/diff.js.map +1 -0
  296. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  297. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  298. package/dist/modes/interactive/components/dynamic-border.js +21 -0
  299. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  300. package/dist/modes/interactive/components/extension-editor.d.ts +17 -0
  301. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  302. package/dist/modes/interactive/components/extension-editor.js +102 -0
  303. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  304. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  305. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  306. package/dist/modes/interactive/components/extension-input.js +61 -0
  307. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  308. package/dist/modes/interactive/components/extension-selector.d.ts +24 -0
  309. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  310. package/dist/modes/interactive/components/extension-selector.js +78 -0
  311. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  312. package/dist/modes/interactive/components/footer.d.ts +26 -0
  313. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  314. package/dist/modes/interactive/components/footer.js +213 -0
  315. package/dist/modes/interactive/components/footer.js.map +1 -0
  316. package/dist/modes/interactive/components/index.d.ts +32 -0
  317. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  318. package/dist/modes/interactive/components/index.js +33 -0
  319. package/dist/modes/interactive/components/index.js.map +1 -0
  320. package/dist/modes/interactive/components/keybinding-hints.d.ts +41 -0
  321. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  322. package/dist/modes/interactive/components/keybinding-hints.js +61 -0
  323. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  324. package/dist/modes/interactive/components/login-dialog.d.ts +42 -0
  325. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  326. package/dist/modes/interactive/components/login-dialog.js +145 -0
  327. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  328. package/dist/modes/interactive/components/model-selector.d.ts +47 -0
  329. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  330. package/dist/modes/interactive/components/model-selector.js +271 -0
  331. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  332. package/dist/modes/interactive/components/oauth-selector.d.ts +19 -0
  333. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  334. package/dist/modes/interactive/components/oauth-selector.js +97 -0
  335. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  336. package/dist/modes/interactive/components/scoped-models-selector.d.ts +49 -0
  337. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  338. package/dist/modes/interactive/components/scoped-models-selector.js +275 -0
  339. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  340. package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  341. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  342. package/dist/modes/interactive/components/session-selector-search.js +155 -0
  343. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  344. package/dist/modes/interactive/components/session-selector.d.ts +95 -0
  345. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  346. package/dist/modes/interactive/components/session-selector.js +851 -0
  347. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  348. package/dist/modes/interactive/components/settings-selector.d.ts +58 -0
  349. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  350. package/dist/modes/interactive/components/settings-selector.js +299 -0
  351. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  352. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  353. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  354. package/dist/modes/interactive/components/show-images-selector.js +35 -0
  355. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  356. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  357. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  358. package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
  359. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  360. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  361. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  362. package/dist/modes/interactive/components/theme-selector.js +46 -0
  363. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  364. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  365. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  366. package/dist/modes/interactive/components/thinking-selector.js +47 -0
  367. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  368. package/dist/modes/interactive/components/tool-execution.d.ts +70 -0
  369. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  370. package/dist/modes/interactive/components/tool-execution.js +636 -0
  371. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  372. package/dist/modes/interactive/components/tree-selector.d.ts +68 -0
  373. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  374. package/dist/modes/interactive/components/tree-selector.js +934 -0
  375. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  376. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  377. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  378. package/dist/modes/interactive/components/user-message-selector.js +113 -0
  379. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  380. package/dist/modes/interactive/components/user-message.d.ts +8 -0
  381. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  382. package/dist/modes/interactive/components/user-message.js +16 -0
  383. package/dist/modes/interactive/components/user-message.js.map +1 -0
  384. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  385. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  386. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  387. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  388. package/dist/modes/interactive/interactive-mode.d.ts +316 -0
  389. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  390. package/dist/modes/interactive/interactive-mode.js +3848 -0
  391. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  392. package/dist/modes/interactive/theme/dark.json +85 -0
  393. package/dist/modes/interactive/theme/light.json +84 -0
  394. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  395. package/dist/modes/interactive/theme/theme.d.ts +78 -0
  396. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  397. package/dist/modes/interactive/theme/theme.js +944 -0
  398. package/dist/modes/interactive/theme/theme.js.map +1 -0
  399. package/dist/modes/print-mode.d.ts +28 -0
  400. package/dist/modes/print-mode.d.ts.map +1 -0
  401. package/dist/modes/print-mode.js +101 -0
  402. package/dist/modes/print-mode.js.map +1 -0
  403. package/dist/modes/rpc/rpc-client.d.ts +217 -0
  404. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  405. package/dist/modes/rpc/rpc-client.js +405 -0
  406. package/dist/modes/rpc/rpc-client.js.map +1 -0
  407. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  408. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  409. package/dist/modes/rpc/rpc-mode.js +511 -0
  410. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  411. package/dist/modes/rpc/rpc-types.d.ts +409 -0
  412. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  413. package/dist/modes/rpc/rpc-types.js +8 -0
  414. package/dist/modes/rpc/rpc-types.js.map +1 -0
  415. package/dist/utils/changelog.d.ts +21 -0
  416. package/dist/utils/changelog.d.ts.map +1 -0
  417. package/dist/utils/changelog.js +87 -0
  418. package/dist/utils/changelog.js.map +1 -0
  419. package/dist/utils/clipboard-image.d.ts +11 -0
  420. package/dist/utils/clipboard-image.d.ts.map +1 -0
  421. package/dist/utils/clipboard-image.js +162 -0
  422. package/dist/utils/clipboard-image.js.map +1 -0
  423. package/dist/utils/clipboard-native.d.ts +7 -0
  424. package/dist/utils/clipboard-native.d.ts.map +1 -0
  425. package/dist/utils/clipboard-native.js +14 -0
  426. package/dist/utils/clipboard-native.js.map +1 -0
  427. package/dist/utils/clipboard.d.ts +2 -0
  428. package/dist/utils/clipboard.d.ts.map +1 -0
  429. package/dist/utils/clipboard.js +67 -0
  430. package/dist/utils/clipboard.js.map +1 -0
  431. package/dist/utils/frontmatter.d.ts +8 -0
  432. package/dist/utils/frontmatter.d.ts.map +1 -0
  433. package/dist/utils/frontmatter.js +26 -0
  434. package/dist/utils/frontmatter.js.map +1 -0
  435. package/dist/utils/git.d.ts +26 -0
  436. package/dist/utils/git.d.ts.map +1 -0
  437. package/dist/utils/git.js +163 -0
  438. package/dist/utils/git.js.map +1 -0
  439. package/dist/utils/image-convert.d.ts +9 -0
  440. package/dist/utils/image-convert.d.ts.map +1 -0
  441. package/dist/utils/image-convert.js +35 -0
  442. package/dist/utils/image-convert.js.map +1 -0
  443. package/dist/utils/image-resize.d.ts +36 -0
  444. package/dist/utils/image-resize.d.ts.map +1 -0
  445. package/dist/utils/image-resize.js +181 -0
  446. package/dist/utils/image-resize.js.map +1 -0
  447. package/dist/utils/mime.d.ts +2 -0
  448. package/dist/utils/mime.d.ts.map +1 -0
  449. package/dist/utils/mime.js +26 -0
  450. package/dist/utils/mime.js.map +1 -0
  451. package/dist/utils/photon.d.ts +21 -0
  452. package/dist/utils/photon.d.ts.map +1 -0
  453. package/dist/utils/photon.js +121 -0
  454. package/dist/utils/photon.js.map +1 -0
  455. package/dist/utils/shell.d.ts +26 -0
  456. package/dist/utils/shell.d.ts.map +1 -0
  457. package/dist/utils/shell.js +186 -0
  458. package/dist/utils/shell.js.map +1 -0
  459. package/dist/utils/sleep.d.ts +5 -0
  460. package/dist/utils/sleep.d.ts.map +1 -0
  461. package/dist/utils/sleep.js +17 -0
  462. package/dist/utils/sleep.js.map +1 -0
  463. package/dist/utils/tools-manager.d.ts +3 -0
  464. package/dist/utils/tools-manager.d.ts.map +1 -0
  465. package/dist/utils/tools-manager.js +207 -0
  466. package/dist/utils/tools-manager.js.map +1 -0
  467. package/docs/compaction.md +390 -0
  468. package/docs/custom-provider.md +548 -0
  469. package/docs/development.md +69 -0
  470. package/docs/extensions.md +1935 -0
  471. package/docs/images/doom-extension.png +0 -0
  472. package/docs/images/exy.png +0 -0
  473. package/docs/images/interactive-mode.png +0 -0
  474. package/docs/images/tree-view.png +0 -0
  475. package/docs/json.md +79 -0
  476. package/docs/keybindings.md +174 -0
  477. package/docs/models.md +293 -0
  478. package/docs/packages.md +209 -0
  479. package/docs/prompt-templates.md +67 -0
  480. package/docs/providers.md +186 -0
  481. package/docs/rpc.md +1317 -0
  482. package/docs/sdk.md +968 -0
  483. package/docs/session.md +412 -0
  484. package/docs/settings.md +223 -0
  485. package/docs/shell-aliases.md +13 -0
  486. package/docs/skills.md +231 -0
  487. package/docs/terminal-setup.md +70 -0
  488. package/docs/termux.md +127 -0
  489. package/docs/themes.md +295 -0
  490. package/docs/tree.md +219 -0
  491. package/docs/tui.md +887 -0
  492. package/docs/windows.md +17 -0
  493. package/examples/README.md +25 -0
  494. package/examples/extensions/README.md +203 -0
  495. package/examples/extensions/antigravity-image-gen.ts +413 -0
  496. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  497. package/examples/extensions/bash-spawn-hook.ts +30 -0
  498. package/examples/extensions/bookmark.ts +50 -0
  499. package/examples/extensions/claude-rules.ts +86 -0
  500. package/examples/extensions/commands.ts +72 -0
  501. package/examples/extensions/confirm-destructive.ts +59 -0
  502. package/examples/extensions/custom-compaction.ts +114 -0
  503. package/examples/extensions/custom-footer.ts +64 -0
  504. package/examples/extensions/custom-header.ts +73 -0
  505. package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  506. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  507. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  508. package/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
  509. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  510. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  511. package/examples/extensions/custom-provider-qwen-cli/index.ts +345 -0
  512. package/examples/extensions/custom-provider-qwen-cli/package.json +16 -0
  513. package/examples/extensions/dirty-repo-guard.ts +56 -0
  514. package/examples/extensions/doom-overlay/README.md +46 -0
  515. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  516. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  517. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  518. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  519. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  520. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  521. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  522. package/examples/extensions/doom-overlay/index.ts +74 -0
  523. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  524. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  525. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  526. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  527. package/examples/extensions/dynamic-resources/index.ts +15 -0
  528. package/examples/extensions/event-bus.ts +43 -0
  529. package/examples/extensions/file-trigger.ts +41 -0
  530. package/examples/extensions/git-checkpoint.ts +53 -0
  531. package/examples/extensions/handoff.ts +150 -0
  532. package/examples/extensions/hello.ts +25 -0
  533. package/examples/extensions/inline-bash.ts +94 -0
  534. package/examples/extensions/input-transform.ts +43 -0
  535. package/examples/extensions/interactive-shell.ts +196 -0
  536. package/examples/extensions/mac-system-theme.ts +47 -0
  537. package/examples/extensions/message-renderer.ts +59 -0
  538. package/examples/extensions/minimal-mode.ts +426 -0
  539. package/examples/extensions/modal-editor.ts +85 -0
  540. package/examples/extensions/model-status.ts +31 -0
  541. package/examples/extensions/notify.ts +55 -0
  542. package/examples/extensions/overlay-qa-tests.ts +881 -0
  543. package/examples/extensions/overlay-test.ts +150 -0
  544. package/examples/extensions/permission-gate.ts +34 -0
  545. package/examples/extensions/pirate.ts +47 -0
  546. package/examples/extensions/plan-mode/README.md +65 -0
  547. package/examples/extensions/plan-mode/index.ts +340 -0
  548. package/examples/extensions/plan-mode/utils.ts +168 -0
  549. package/examples/extensions/preset.ts +398 -0
  550. package/examples/extensions/protected-paths.ts +30 -0
  551. package/examples/extensions/qna.ts +119 -0
  552. package/examples/extensions/question.ts +264 -0
  553. package/examples/extensions/questionnaire.ts +427 -0
  554. package/examples/extensions/rainbow-editor.ts +88 -0
  555. package/examples/extensions/reload-runtime.ts +37 -0
  556. package/examples/extensions/rpc-demo.ts +124 -0
  557. package/examples/extensions/sandbox/index.ts +318 -0
  558. package/examples/extensions/sandbox/package-lock.json +92 -0
  559. package/examples/extensions/sandbox/package.json +19 -0
  560. package/examples/extensions/send-user-message.ts +97 -0
  561. package/examples/extensions/session-name.ts +27 -0
  562. package/examples/extensions/shutdown-command.ts +63 -0
  563. package/examples/extensions/snake.ts +343 -0
  564. package/examples/extensions/space-invaders.ts +560 -0
  565. package/examples/extensions/ssh.ts +220 -0
  566. package/examples/extensions/status-line.ts +40 -0
  567. package/examples/extensions/subagent/README.md +172 -0
  568. package/examples/extensions/subagent/agents/planner.md +37 -0
  569. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  570. package/examples/extensions/subagent/agents/scout.md +50 -0
  571. package/examples/extensions/subagent/agents/worker.md +24 -0
  572. package/examples/extensions/subagent/agents.ts +127 -0
  573. package/examples/extensions/subagent/index.ts +964 -0
  574. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  575. package/examples/extensions/subagent/prompts/implement.md +10 -0
  576. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  577. package/examples/extensions/summarize.ts +195 -0
  578. package/examples/extensions/system-prompt-header.ts +17 -0
  579. package/examples/extensions/timed-confirm.ts +70 -0
  580. package/examples/extensions/titlebar-spinner.ts +58 -0
  581. package/examples/extensions/todo.ts +299 -0
  582. package/examples/extensions/tool-override.ts +143 -0
  583. package/examples/extensions/tools.ts +146 -0
  584. package/examples/extensions/trigger-compact.ts +40 -0
  585. package/examples/extensions/truncated-tool.ts +192 -0
  586. package/examples/extensions/widget-placement.ts +17 -0
  587. package/examples/extensions/with-deps/index.ts +36 -0
  588. package/examples/extensions/with-deps/package-lock.json +31 -0
  589. package/examples/extensions/with-deps/package.json +22 -0
  590. package/examples/rpc-extension-ui.ts +632 -0
  591. package/examples/sdk/01-minimal.ts +22 -0
  592. package/examples/sdk/02-custom-model.ts +49 -0
  593. package/examples/sdk/03-custom-prompt.ts +55 -0
  594. package/examples/sdk/04-skills.ts +46 -0
  595. package/examples/sdk/05-tools.ts +56 -0
  596. package/examples/sdk/06-extensions.ts +88 -0
  597. package/examples/sdk/07-context-files.ts +40 -0
  598. package/examples/sdk/08-prompt-templates.ts +47 -0
  599. package/examples/sdk/09-api-keys-and-oauth.ts +48 -0
  600. package/examples/sdk/10-settings.ts +51 -0
  601. package/examples/sdk/11-sessions.ts +48 -0
  602. package/examples/sdk/12-full-control.ts +82 -0
  603. package/examples/sdk/README.md +144 -0
  604. package/package.json +96 -0
@@ -0,0 +1,205 @@
1
+ /**
2
+ * Shared truncation utilities for tool outputs.
3
+ *
4
+ * Truncation is based on two independent limits - whichever is hit first wins:
5
+ * - Line limit (default: 2000 lines)
6
+ * - Byte limit (default: 50KB)
7
+ *
8
+ * Never returns partial lines (except bash tail truncation edge case).
9
+ */
10
+ export const DEFAULT_MAX_LINES = 2000;
11
+ export const DEFAULT_MAX_BYTES = 50 * 1024; // 50KB
12
+ export const GREP_MAX_LINE_LENGTH = 500; // Max chars per grep match line
13
+ /**
14
+ * Format bytes as human-readable size.
15
+ */
16
+ export function formatSize(bytes) {
17
+ if (bytes < 1024) {
18
+ return `${bytes}B`;
19
+ }
20
+ else if (bytes < 1024 * 1024) {
21
+ return `${(bytes / 1024).toFixed(1)}KB`;
22
+ }
23
+ else {
24
+ return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
25
+ }
26
+ }
27
+ /**
28
+ * Truncate content from the head (keep first N lines/bytes).
29
+ * Suitable for file reads where you want to see the beginning.
30
+ *
31
+ * Never returns partial lines. If first line exceeds byte limit,
32
+ * returns empty content with firstLineExceedsLimit=true.
33
+ */
34
+ export function truncateHead(content, options = {}) {
35
+ const maxLines = options.maxLines ?? DEFAULT_MAX_LINES;
36
+ const maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;
37
+ const totalBytes = Buffer.byteLength(content, "utf-8");
38
+ const lines = content.split("\n");
39
+ const totalLines = lines.length;
40
+ // Check if no truncation needed
41
+ if (totalLines <= maxLines && totalBytes <= maxBytes) {
42
+ return {
43
+ content,
44
+ truncated: false,
45
+ truncatedBy: null,
46
+ totalLines,
47
+ totalBytes,
48
+ outputLines: totalLines,
49
+ outputBytes: totalBytes,
50
+ lastLinePartial: false,
51
+ firstLineExceedsLimit: false,
52
+ maxLines,
53
+ maxBytes,
54
+ };
55
+ }
56
+ // Check if first line alone exceeds byte limit
57
+ const firstLineBytes = Buffer.byteLength(lines[0], "utf-8");
58
+ if (firstLineBytes > maxBytes) {
59
+ return {
60
+ content: "",
61
+ truncated: true,
62
+ truncatedBy: "bytes",
63
+ totalLines,
64
+ totalBytes,
65
+ outputLines: 0,
66
+ outputBytes: 0,
67
+ lastLinePartial: false,
68
+ firstLineExceedsLimit: true,
69
+ maxLines,
70
+ maxBytes,
71
+ };
72
+ }
73
+ // Collect complete lines that fit
74
+ const outputLinesArr = [];
75
+ let outputBytesCount = 0;
76
+ let truncatedBy = "lines";
77
+ for (let i = 0; i < lines.length && i < maxLines; i++) {
78
+ const line = lines[i];
79
+ const lineBytes = Buffer.byteLength(line, "utf-8") + (i > 0 ? 1 : 0); // +1 for newline
80
+ if (outputBytesCount + lineBytes > maxBytes) {
81
+ truncatedBy = "bytes";
82
+ break;
83
+ }
84
+ outputLinesArr.push(line);
85
+ outputBytesCount += lineBytes;
86
+ }
87
+ // If we exited due to line limit
88
+ if (outputLinesArr.length >= maxLines && outputBytesCount <= maxBytes) {
89
+ truncatedBy = "lines";
90
+ }
91
+ const outputContent = outputLinesArr.join("\n");
92
+ const finalOutputBytes = Buffer.byteLength(outputContent, "utf-8");
93
+ return {
94
+ content: outputContent,
95
+ truncated: true,
96
+ truncatedBy,
97
+ totalLines,
98
+ totalBytes,
99
+ outputLines: outputLinesArr.length,
100
+ outputBytes: finalOutputBytes,
101
+ lastLinePartial: false,
102
+ firstLineExceedsLimit: false,
103
+ maxLines,
104
+ maxBytes,
105
+ };
106
+ }
107
+ /**
108
+ * Truncate content from the tail (keep last N lines/bytes).
109
+ * Suitable for bash output where you want to see the end (errors, final results).
110
+ *
111
+ * May return partial first line if the last line of original content exceeds byte limit.
112
+ */
113
+ export function truncateTail(content, options = {}) {
114
+ const maxLines = options.maxLines ?? DEFAULT_MAX_LINES;
115
+ const maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;
116
+ const totalBytes = Buffer.byteLength(content, "utf-8");
117
+ const lines = content.split("\n");
118
+ const totalLines = lines.length;
119
+ // Check if no truncation needed
120
+ if (totalLines <= maxLines && totalBytes <= maxBytes) {
121
+ return {
122
+ content,
123
+ truncated: false,
124
+ truncatedBy: null,
125
+ totalLines,
126
+ totalBytes,
127
+ outputLines: totalLines,
128
+ outputBytes: totalBytes,
129
+ lastLinePartial: false,
130
+ firstLineExceedsLimit: false,
131
+ maxLines,
132
+ maxBytes,
133
+ };
134
+ }
135
+ // Work backwards from the end
136
+ const outputLinesArr = [];
137
+ let outputBytesCount = 0;
138
+ let truncatedBy = "lines";
139
+ let lastLinePartial = false;
140
+ for (let i = lines.length - 1; i >= 0 && outputLinesArr.length < maxLines; i--) {
141
+ const line = lines[i];
142
+ const lineBytes = Buffer.byteLength(line, "utf-8") + (outputLinesArr.length > 0 ? 1 : 0); // +1 for newline
143
+ if (outputBytesCount + lineBytes > maxBytes) {
144
+ truncatedBy = "bytes";
145
+ // Edge case: if we haven't added ANY lines yet and this line exceeds maxBytes,
146
+ // take the end of the line (partial)
147
+ if (outputLinesArr.length === 0) {
148
+ const truncatedLine = truncateStringToBytesFromEnd(line, maxBytes);
149
+ outputLinesArr.unshift(truncatedLine);
150
+ outputBytesCount = Buffer.byteLength(truncatedLine, "utf-8");
151
+ lastLinePartial = true;
152
+ }
153
+ break;
154
+ }
155
+ outputLinesArr.unshift(line);
156
+ outputBytesCount += lineBytes;
157
+ }
158
+ // If we exited due to line limit
159
+ if (outputLinesArr.length >= maxLines && outputBytesCount <= maxBytes) {
160
+ truncatedBy = "lines";
161
+ }
162
+ const outputContent = outputLinesArr.join("\n");
163
+ const finalOutputBytes = Buffer.byteLength(outputContent, "utf-8");
164
+ return {
165
+ content: outputContent,
166
+ truncated: true,
167
+ truncatedBy,
168
+ totalLines,
169
+ totalBytes,
170
+ outputLines: outputLinesArr.length,
171
+ outputBytes: finalOutputBytes,
172
+ lastLinePartial,
173
+ firstLineExceedsLimit: false,
174
+ maxLines,
175
+ maxBytes,
176
+ };
177
+ }
178
+ /**
179
+ * Truncate a string to fit within a byte limit (from the end).
180
+ * Handles multi-byte UTF-8 characters correctly.
181
+ */
182
+ function truncateStringToBytesFromEnd(str, maxBytes) {
183
+ const buf = Buffer.from(str, "utf-8");
184
+ if (buf.length <= maxBytes) {
185
+ return str;
186
+ }
187
+ // Start from the end, skip maxBytes back
188
+ let start = buf.length - maxBytes;
189
+ // Find a valid UTF-8 boundary (start of a character)
190
+ while (start < buf.length && (buf[start] & 0xc0) === 0x80) {
191
+ start++;
192
+ }
193
+ return buf.slice(start).toString("utf-8");
194
+ }
195
+ /**
196
+ * Truncate a single line to max characters, adding [truncated] suffix.
197
+ * Used for grep match lines.
198
+ */
199
+ export function truncateLine(line, maxChars = GREP_MAX_LINE_LENGTH) {
200
+ if (line.length <= maxChars) {
201
+ return { text: line, wasTruncated: false };
202
+ }
203
+ return { text: `${line.slice(0, maxChars)}... [truncated]`, wasTruncated: true };
204
+ }
205
+ //# sourceMappingURL=truncate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"truncate.js","sourceRoot":"","sources":["../../../src/core/tools/truncate.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Shared truncation utilities for tool outputs.\r\n *\r\n * Truncation is based on two independent limits - whichever is hit first wins:\r\n * - Line limit (default: 2000 lines)\r\n * - Byte limit (default: 50KB)\r\n *\r\n * Never returns partial lines (except bash tail truncation edge case).\r\n */\r\n\r\nexport const DEFAULT_MAX_LINES = 2000;\r\nexport const DEFAULT_MAX_BYTES = 50 * 1024; // 50KB\r\nexport const GREP_MAX_LINE_LENGTH = 500; // Max chars per grep match line\r\n\r\nexport interface TruncationResult {\r\n\t/** The truncated content */\r\n\tcontent: string;\r\n\t/** Whether truncation occurred */\r\n\ttruncated: boolean;\r\n\t/** Which limit was hit: \"lines\", \"bytes\", or null if not truncated */\r\n\ttruncatedBy: \"lines\" | \"bytes\" | null;\r\n\t/** Total number of lines in the original content */\r\n\ttotalLines: number;\r\n\t/** Total number of bytes in the original content */\r\n\ttotalBytes: number;\r\n\t/** Number of complete lines in the truncated output */\r\n\toutputLines: number;\r\n\t/** Number of bytes in the truncated output */\r\n\toutputBytes: number;\r\n\t/** Whether the last line was partially truncated (only for tail truncation edge case) */\r\n\tlastLinePartial: boolean;\r\n\t/** Whether the first line exceeded the byte limit (for head truncation) */\r\n\tfirstLineExceedsLimit: boolean;\r\n\t/** The max lines limit that was applied */\r\n\tmaxLines: number;\r\n\t/** The max bytes limit that was applied */\r\n\tmaxBytes: number;\r\n}\r\n\r\nexport interface TruncationOptions {\r\n\t/** Maximum number of lines (default: 2000) */\r\n\tmaxLines?: number;\r\n\t/** Maximum number of bytes (default: 50KB) */\r\n\tmaxBytes?: number;\r\n}\r\n\r\n/**\r\n * Format bytes as human-readable size.\r\n */\r\nexport function formatSize(bytes: number): string {\r\n\tif (bytes < 1024) {\r\n\t\treturn `${bytes}B`;\r\n\t} else if (bytes < 1024 * 1024) {\r\n\t\treturn `${(bytes / 1024).toFixed(1)}KB`;\r\n\t} else {\r\n\t\treturn `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\r\n\t}\r\n}\r\n\r\n/**\r\n * Truncate content from the head (keep first N lines/bytes).\r\n * Suitable for file reads where you want to see the beginning.\r\n *\r\n * Never returns partial lines. If first line exceeds byte limit,\r\n * returns empty content with firstLineExceedsLimit=true.\r\n */\r\nexport function truncateHead(content: string, options: TruncationOptions = {}): TruncationResult {\r\n\tconst maxLines = options.maxLines ?? DEFAULT_MAX_LINES;\r\n\tconst maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;\r\n\r\n\tconst totalBytes = Buffer.byteLength(content, \"utf-8\");\r\n\tconst lines = content.split(\"\\n\");\r\n\tconst totalLines = lines.length;\r\n\r\n\t// Check if no truncation needed\r\n\tif (totalLines <= maxLines && totalBytes <= maxBytes) {\r\n\t\treturn {\r\n\t\t\tcontent,\r\n\t\t\ttruncated: false,\r\n\t\t\ttruncatedBy: null,\r\n\t\t\ttotalLines,\r\n\t\t\ttotalBytes,\r\n\t\t\toutputLines: totalLines,\r\n\t\t\toutputBytes: totalBytes,\r\n\t\t\tlastLinePartial: false,\r\n\t\t\tfirstLineExceedsLimit: false,\r\n\t\t\tmaxLines,\r\n\t\t\tmaxBytes,\r\n\t\t};\r\n\t}\r\n\r\n\t// Check if first line alone exceeds byte limit\r\n\tconst firstLineBytes = Buffer.byteLength(lines[0], \"utf-8\");\r\n\tif (firstLineBytes > maxBytes) {\r\n\t\treturn {\r\n\t\t\tcontent: \"\",\r\n\t\t\ttruncated: true,\r\n\t\t\ttruncatedBy: \"bytes\",\r\n\t\t\ttotalLines,\r\n\t\t\ttotalBytes,\r\n\t\t\toutputLines: 0,\r\n\t\t\toutputBytes: 0,\r\n\t\t\tlastLinePartial: false,\r\n\t\t\tfirstLineExceedsLimit: true,\r\n\t\t\tmaxLines,\r\n\t\t\tmaxBytes,\r\n\t\t};\r\n\t}\r\n\r\n\t// Collect complete lines that fit\r\n\tconst outputLinesArr: string[] = [];\r\n\tlet outputBytesCount = 0;\r\n\tlet truncatedBy: \"lines\" | \"bytes\" = \"lines\";\r\n\r\n\tfor (let i = 0; i < lines.length && i < maxLines; i++) {\r\n\t\tconst line = lines[i];\r\n\t\tconst lineBytes = Buffer.byteLength(line, \"utf-8\") + (i > 0 ? 1 : 0); // +1 for newline\r\n\r\n\t\tif (outputBytesCount + lineBytes > maxBytes) {\r\n\t\t\ttruncatedBy = \"bytes\";\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\toutputLinesArr.push(line);\r\n\t\toutputBytesCount += lineBytes;\r\n\t}\r\n\r\n\t// If we exited due to line limit\r\n\tif (outputLinesArr.length >= maxLines && outputBytesCount <= maxBytes) {\r\n\t\ttruncatedBy = \"lines\";\r\n\t}\r\n\r\n\tconst outputContent = outputLinesArr.join(\"\\n\");\r\n\tconst finalOutputBytes = Buffer.byteLength(outputContent, \"utf-8\");\r\n\r\n\treturn {\r\n\t\tcontent: outputContent,\r\n\t\ttruncated: true,\r\n\t\ttruncatedBy,\r\n\t\ttotalLines,\r\n\t\ttotalBytes,\r\n\t\toutputLines: outputLinesArr.length,\r\n\t\toutputBytes: finalOutputBytes,\r\n\t\tlastLinePartial: false,\r\n\t\tfirstLineExceedsLimit: false,\r\n\t\tmaxLines,\r\n\t\tmaxBytes,\r\n\t};\r\n}\r\n\r\n/**\r\n * Truncate content from the tail (keep last N lines/bytes).\r\n * Suitable for bash output where you want to see the end (errors, final results).\r\n *\r\n * May return partial first line if the last line of original content exceeds byte limit.\r\n */\r\nexport function truncateTail(content: string, options: TruncationOptions = {}): TruncationResult {\r\n\tconst maxLines = options.maxLines ?? DEFAULT_MAX_LINES;\r\n\tconst maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;\r\n\r\n\tconst totalBytes = Buffer.byteLength(content, \"utf-8\");\r\n\tconst lines = content.split(\"\\n\");\r\n\tconst totalLines = lines.length;\r\n\r\n\t// Check if no truncation needed\r\n\tif (totalLines <= maxLines && totalBytes <= maxBytes) {\r\n\t\treturn {\r\n\t\t\tcontent,\r\n\t\t\ttruncated: false,\r\n\t\t\ttruncatedBy: null,\r\n\t\t\ttotalLines,\r\n\t\t\ttotalBytes,\r\n\t\t\toutputLines: totalLines,\r\n\t\t\toutputBytes: totalBytes,\r\n\t\t\tlastLinePartial: false,\r\n\t\t\tfirstLineExceedsLimit: false,\r\n\t\t\tmaxLines,\r\n\t\t\tmaxBytes,\r\n\t\t};\r\n\t}\r\n\r\n\t// Work backwards from the end\r\n\tconst outputLinesArr: string[] = [];\r\n\tlet outputBytesCount = 0;\r\n\tlet truncatedBy: \"lines\" | \"bytes\" = \"lines\";\r\n\tlet lastLinePartial = false;\r\n\r\n\tfor (let i = lines.length - 1; i >= 0 && outputLinesArr.length < maxLines; i--) {\r\n\t\tconst line = lines[i];\r\n\t\tconst lineBytes = Buffer.byteLength(line, \"utf-8\") + (outputLinesArr.length > 0 ? 1 : 0); // +1 for newline\r\n\r\n\t\tif (outputBytesCount + lineBytes > maxBytes) {\r\n\t\t\ttruncatedBy = \"bytes\";\r\n\t\t\t// Edge case: if we haven't added ANY lines yet and this line exceeds maxBytes,\r\n\t\t\t// take the end of the line (partial)\r\n\t\t\tif (outputLinesArr.length === 0) {\r\n\t\t\t\tconst truncatedLine = truncateStringToBytesFromEnd(line, maxBytes);\r\n\t\t\t\toutputLinesArr.unshift(truncatedLine);\r\n\t\t\t\toutputBytesCount = Buffer.byteLength(truncatedLine, \"utf-8\");\r\n\t\t\t\tlastLinePartial = true;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\toutputLinesArr.unshift(line);\r\n\t\toutputBytesCount += lineBytes;\r\n\t}\r\n\r\n\t// If we exited due to line limit\r\n\tif (outputLinesArr.length >= maxLines && outputBytesCount <= maxBytes) {\r\n\t\ttruncatedBy = \"lines\";\r\n\t}\r\n\r\n\tconst outputContent = outputLinesArr.join(\"\\n\");\r\n\tconst finalOutputBytes = Buffer.byteLength(outputContent, \"utf-8\");\r\n\r\n\treturn {\r\n\t\tcontent: outputContent,\r\n\t\ttruncated: true,\r\n\t\ttruncatedBy,\r\n\t\ttotalLines,\r\n\t\ttotalBytes,\r\n\t\toutputLines: outputLinesArr.length,\r\n\t\toutputBytes: finalOutputBytes,\r\n\t\tlastLinePartial,\r\n\t\tfirstLineExceedsLimit: false,\r\n\t\tmaxLines,\r\n\t\tmaxBytes,\r\n\t};\r\n}\r\n\r\n/**\r\n * Truncate a string to fit within a byte limit (from the end).\r\n * Handles multi-byte UTF-8 characters correctly.\r\n */\r\nfunction truncateStringToBytesFromEnd(str: string, maxBytes: number): string {\r\n\tconst buf = Buffer.from(str, \"utf-8\");\r\n\tif (buf.length <= maxBytes) {\r\n\t\treturn str;\r\n\t}\r\n\r\n\t// Start from the end, skip maxBytes back\r\n\tlet start = buf.length - maxBytes;\r\n\r\n\t// Find a valid UTF-8 boundary (start of a character)\r\n\twhile (start < buf.length && (buf[start] & 0xc0) === 0x80) {\r\n\t\tstart++;\r\n\t}\r\n\r\n\treturn buf.slice(start).toString(\"utf-8\");\r\n}\r\n\r\n/**\r\n * Truncate a single line to max characters, adding [truncated] suffix.\r\n * Used for grep match lines.\r\n */\r\nexport function truncateLine(\r\n\tline: string,\r\n\tmaxChars: number = GREP_MAX_LINE_LENGTH,\r\n): { text: string; wasTruncated: boolean } {\r\n\tif (line.length <= maxChars) {\r\n\t\treturn { text: line, wasTruncated: false };\r\n\t}\r\n\treturn { text: `${line.slice(0, maxChars)}... [truncated]`, wasTruncated: true };\r\n}\r\n"]}
@@ -0,0 +1,29 @@
1
+ import type { AgentTool } from "@mariozechner/pi-agent-core";
2
+ import { type Static } from "@sinclair/typebox";
3
+ declare const writeSchema: import("@sinclair/typebox").TObject<{
4
+ path: import("@sinclair/typebox").TString;
5
+ content: import("@sinclair/typebox").TString;
6
+ }>;
7
+ export type WriteToolInput = Static<typeof writeSchema>;
8
+ /**
9
+ * Pluggable operations for the write tool.
10
+ * Override these to delegate file writing to remote systems (e.g., SSH).
11
+ */
12
+ export interface WriteOperations {
13
+ /** Write content to a file */
14
+ writeFile: (absolutePath: string, content: string) => Promise<void>;
15
+ /** Create directory (recursively) */
16
+ mkdir: (dir: string) => Promise<void>;
17
+ }
18
+ export interface WriteToolOptions {
19
+ /** Custom operations for file writing. Default: local filesystem */
20
+ operations?: WriteOperations;
21
+ }
22
+ export declare function createWriteTool(cwd: string, options?: WriteToolOptions): AgentTool<typeof writeSchema>;
23
+ /** Default write tool using process.cwd() - for backwards compatibility */
24
+ export declare const writeTool: AgentTool<import("@sinclair/typebox").TObject<{
25
+ path: import("@sinclair/typebox").TString;
26
+ content: import("@sinclair/typebox").TString;
27
+ }>, any>;
28
+ export {};
29
+ //# sourceMappingURL=write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../../src/core/tools/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,mBAAmB,CAAC;AAKtD,QAAA,MAAM,WAAW;;;EAGf,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AAExD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC/B,8BAA8B;IAC9B,SAAS,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,qCAAqC;IACrC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAOD,MAAM,WAAW,gBAAgB;IAChC,oEAAoE;IACpE,UAAU,CAAC,EAAE,eAAe,CAAC;CAC7B;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC,OAAO,WAAW,CAAC,CAgFtG;AAED,2EAA2E;AAC3E,eAAO,MAAM,SAAS;;;QAAiC,CAAC","sourcesContent":["import type { AgentTool } from \"@mariozechner/pi-agent-core\";\r\nimport { type Static, Type } from \"@sinclair/typebox\";\r\nimport { mkdir as fsMkdir, writeFile as fsWriteFile } from \"fs/promises\";\r\nimport { dirname } from \"path\";\r\nimport { resolveToCwd } from \"./path-utils.js\";\r\n\r\nconst writeSchema = Type.Object({\r\n\tpath: Type.String({ description: \"Path to the file to write (relative or absolute)\" }),\r\n\tcontent: Type.String({ description: \"Content to write to the file\" }),\r\n});\r\n\r\nexport type WriteToolInput = Static<typeof writeSchema>;\r\n\r\n/**\r\n * Pluggable operations for the write tool.\r\n * Override these to delegate file writing to remote systems (e.g., SSH).\r\n */\r\nexport interface WriteOperations {\r\n\t/** Write content to a file */\r\n\twriteFile: (absolutePath: string, content: string) => Promise<void>;\r\n\t/** Create directory (recursively) */\r\n\tmkdir: (dir: string) => Promise<void>;\r\n}\r\n\r\nconst defaultWriteOperations: WriteOperations = {\r\n\twriteFile: (path, content) => fsWriteFile(path, content, \"utf-8\"),\r\n\tmkdir: (dir) => fsMkdir(dir, { recursive: true }).then(() => {}),\r\n};\r\n\r\nexport interface WriteToolOptions {\r\n\t/** Custom operations for file writing. Default: local filesystem */\r\n\toperations?: WriteOperations;\r\n}\r\n\r\nexport function createWriteTool(cwd: string, options?: WriteToolOptions): AgentTool<typeof writeSchema> {\r\n\tconst ops = options?.operations ?? defaultWriteOperations;\r\n\r\n\treturn {\r\n\t\tname: \"write\",\r\n\t\tlabel: \"write\",\r\n\t\tdescription:\r\n\t\t\t\"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.\",\r\n\t\tparameters: writeSchema,\r\n\t\texecute: async (\r\n\t\t\t_toolCallId: string,\r\n\t\t\t{ path, content }: { path: string; content: string },\r\n\t\t\tsignal?: AbortSignal,\r\n\t\t) => {\r\n\t\t\tconst absolutePath = resolveToCwd(path, cwd);\r\n\t\t\tconst dir = dirname(absolutePath);\r\n\r\n\t\t\treturn new Promise<{ content: Array<{ type: \"text\"; text: string }>; details: undefined }>(\r\n\t\t\t\t(resolve, reject) => {\r\n\t\t\t\t\t// Check if already aborted\r\n\t\t\t\t\tif (signal?.aborted) {\r\n\t\t\t\t\t\treject(new Error(\"Operation aborted\"));\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tlet aborted = false;\r\n\r\n\t\t\t\t\t// Set up abort handler\r\n\t\t\t\t\tconst onAbort = () => {\r\n\t\t\t\t\t\taborted = true;\r\n\t\t\t\t\t\treject(new Error(\"Operation aborted\"));\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tif (signal) {\r\n\t\t\t\t\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Perform the write operation\r\n\t\t\t\t\t(async () => {\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t// Create parent directories if needed\r\n\t\t\t\t\t\t\tawait ops.mkdir(dir);\r\n\r\n\t\t\t\t\t\t\t// Check if aborted before writing\r\n\t\t\t\t\t\t\tif (aborted) {\r\n\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t// Write the file\r\n\t\t\t\t\t\t\tawait ops.writeFile(absolutePath, content);\r\n\r\n\t\t\t\t\t\t\t// Check if aborted after writing\r\n\t\t\t\t\t\t\tif (aborted) {\r\n\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t// Clean up abort handler\r\n\t\t\t\t\t\t\tif (signal) {\r\n\t\t\t\t\t\t\t\tsignal.removeEventListener(\"abort\", onAbort);\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tresolve({\r\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Successfully wrote ${content.length} bytes to ${path}` }],\r\n\t\t\t\t\t\t\t\tdetails: undefined,\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t} catch (error: any) {\r\n\t\t\t\t\t\t\t// Clean up abort handler\r\n\t\t\t\t\t\t\tif (signal) {\r\n\t\t\t\t\t\t\t\tsignal.removeEventListener(\"abort\", onAbort);\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif (!aborted) {\r\n\t\t\t\t\t\t\t\treject(error);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})();\r\n\t\t\t\t},\r\n\t\t\t);\r\n\t\t},\r\n\t};\r\n}\r\n\r\n/** Default write tool using process.cwd() - for backwards compatibility */\r\nexport const writeTool = createWriteTool(process.cwd());\r\n"]}
@@ -0,0 +1,78 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { mkdir as fsMkdir, writeFile as fsWriteFile } from "fs/promises";
3
+ import { dirname } from "path";
4
+ import { resolveToCwd } from "./path-utils.js";
5
+ const writeSchema = Type.Object({
6
+ path: Type.String({ description: "Path to the file to write (relative or absolute)" }),
7
+ content: Type.String({ description: "Content to write to the file" }),
8
+ });
9
+ const defaultWriteOperations = {
10
+ writeFile: (path, content) => fsWriteFile(path, content, "utf-8"),
11
+ mkdir: (dir) => fsMkdir(dir, { recursive: true }).then(() => { }),
12
+ };
13
+ export function createWriteTool(cwd, options) {
14
+ const ops = options?.operations ?? defaultWriteOperations;
15
+ return {
16
+ name: "write",
17
+ label: "write",
18
+ description: "Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.",
19
+ parameters: writeSchema,
20
+ execute: async (_toolCallId, { path, content }, signal) => {
21
+ const absolutePath = resolveToCwd(path, cwd);
22
+ const dir = dirname(absolutePath);
23
+ return new Promise((resolve, reject) => {
24
+ // Check if already aborted
25
+ if (signal?.aborted) {
26
+ reject(new Error("Operation aborted"));
27
+ return;
28
+ }
29
+ let aborted = false;
30
+ // Set up abort handler
31
+ const onAbort = () => {
32
+ aborted = true;
33
+ reject(new Error("Operation aborted"));
34
+ };
35
+ if (signal) {
36
+ signal.addEventListener("abort", onAbort, { once: true });
37
+ }
38
+ // Perform the write operation
39
+ (async () => {
40
+ try {
41
+ // Create parent directories if needed
42
+ await ops.mkdir(dir);
43
+ // Check if aborted before writing
44
+ if (aborted) {
45
+ return;
46
+ }
47
+ // Write the file
48
+ await ops.writeFile(absolutePath, content);
49
+ // Check if aborted after writing
50
+ if (aborted) {
51
+ return;
52
+ }
53
+ // Clean up abort handler
54
+ if (signal) {
55
+ signal.removeEventListener("abort", onAbort);
56
+ }
57
+ resolve({
58
+ content: [{ type: "text", text: `Successfully wrote ${content.length} bytes to ${path}` }],
59
+ details: undefined,
60
+ });
61
+ }
62
+ catch (error) {
63
+ // Clean up abort handler
64
+ if (signal) {
65
+ signal.removeEventListener("abort", onAbort);
66
+ }
67
+ if (!aborted) {
68
+ reject(error);
69
+ }
70
+ }
71
+ })();
72
+ });
73
+ },
74
+ };
75
+ }
76
+ /** Default write tool using process.cwd() - for backwards compatibility */
77
+ export const writeTool = createWriteTool(process.cwd());
78
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../../src/core/tools/write.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentTool } from \"@mariozechner/pi-agent-core\";\r\nimport { type Static, Type } from \"@sinclair/typebox\";\r\nimport { mkdir as fsMkdir, writeFile as fsWriteFile } from \"fs/promises\";\r\nimport { dirname } from \"path\";\r\nimport { resolveToCwd } from \"./path-utils.js\";\r\n\r\nconst writeSchema = Type.Object({\r\n\tpath: Type.String({ description: \"Path to the file to write (relative or absolute)\" }),\r\n\tcontent: Type.String({ description: \"Content to write to the file\" }),\r\n});\r\n\r\nexport type WriteToolInput = Static<typeof writeSchema>;\r\n\r\n/**\r\n * Pluggable operations for the write tool.\r\n * Override these to delegate file writing to remote systems (e.g., SSH).\r\n */\r\nexport interface WriteOperations {\r\n\t/** Write content to a file */\r\n\twriteFile: (absolutePath: string, content: string) => Promise<void>;\r\n\t/** Create directory (recursively) */\r\n\tmkdir: (dir: string) => Promise<void>;\r\n}\r\n\r\nconst defaultWriteOperations: WriteOperations = {\r\n\twriteFile: (path, content) => fsWriteFile(path, content, \"utf-8\"),\r\n\tmkdir: (dir) => fsMkdir(dir, { recursive: true }).then(() => {}),\r\n};\r\n\r\nexport interface WriteToolOptions {\r\n\t/** Custom operations for file writing. Default: local filesystem */\r\n\toperations?: WriteOperations;\r\n}\r\n\r\nexport function createWriteTool(cwd: string, options?: WriteToolOptions): AgentTool<typeof writeSchema> {\r\n\tconst ops = options?.operations ?? defaultWriteOperations;\r\n\r\n\treturn {\r\n\t\tname: \"write\",\r\n\t\tlabel: \"write\",\r\n\t\tdescription:\r\n\t\t\t\"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.\",\r\n\t\tparameters: writeSchema,\r\n\t\texecute: async (\r\n\t\t\t_toolCallId: string,\r\n\t\t\t{ path, content }: { path: string; content: string },\r\n\t\t\tsignal?: AbortSignal,\r\n\t\t) => {\r\n\t\t\tconst absolutePath = resolveToCwd(path, cwd);\r\n\t\t\tconst dir = dirname(absolutePath);\r\n\r\n\t\t\treturn new Promise<{ content: Array<{ type: \"text\"; text: string }>; details: undefined }>(\r\n\t\t\t\t(resolve, reject) => {\r\n\t\t\t\t\t// Check if already aborted\r\n\t\t\t\t\tif (signal?.aborted) {\r\n\t\t\t\t\t\treject(new Error(\"Operation aborted\"));\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tlet aborted = false;\r\n\r\n\t\t\t\t\t// Set up abort handler\r\n\t\t\t\t\tconst onAbort = () => {\r\n\t\t\t\t\t\taborted = true;\r\n\t\t\t\t\t\treject(new Error(\"Operation aborted\"));\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tif (signal) {\r\n\t\t\t\t\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Perform the write operation\r\n\t\t\t\t\t(async () => {\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t// Create parent directories if needed\r\n\t\t\t\t\t\t\tawait ops.mkdir(dir);\r\n\r\n\t\t\t\t\t\t\t// Check if aborted before writing\r\n\t\t\t\t\t\t\tif (aborted) {\r\n\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t// Write the file\r\n\t\t\t\t\t\t\tawait ops.writeFile(absolutePath, content);\r\n\r\n\t\t\t\t\t\t\t// Check if aborted after writing\r\n\t\t\t\t\t\t\tif (aborted) {\r\n\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t// Clean up abort handler\r\n\t\t\t\t\t\t\tif (signal) {\r\n\t\t\t\t\t\t\t\tsignal.removeEventListener(\"abort\", onAbort);\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tresolve({\r\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Successfully wrote ${content.length} bytes to ${path}` }],\r\n\t\t\t\t\t\t\t\tdetails: undefined,\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t} catch (error: any) {\r\n\t\t\t\t\t\t\t// Clean up abort handler\r\n\t\t\t\t\t\t\tif (signal) {\r\n\t\t\t\t\t\t\t\tsignal.removeEventListener(\"abort\", onAbort);\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif (!aborted) {\r\n\t\t\t\t\t\t\t\treject(error);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})();\r\n\t\t\t\t},\r\n\t\t\t);\r\n\t\t},\r\n\t};\r\n}\r\n\r\n/** Default write tool using process.cwd() - for backwards compatibility */\r\nexport const writeTool = createWriteTool(process.cwd());\r\n"]}
@@ -0,0 +1,28 @@
1
+ export { getAgentDir, VERSION } from "./config.js";
2
+ export { AgentSession, type AgentSessionConfig, type AgentSessionEvent, type AgentSessionEventListener, type ModelCycleResult, type ParsedSkillBlock, type PromptOptions, parseSkillBlock, type SessionStats, } from "./core/agent-session.js";
3
+ export { type ApiKeyCredential, type AuthCredential, AuthStorage, type AuthStorageBackend, FileAuthStorageBackend, InMemoryAuthStorageBackend, type OAuthCredential, } from "./core/auth-storage.js";
4
+ export { type BranchPreparation, type BranchSummaryResult, type CollectEntriesResult, type CompactionResult, type CutPointResult, calculateContextTokens, collectEntriesForBranchSummary, compact, DEFAULT_COMPACTION_SETTINGS, estimateTokens, type FileOperations, findCutPoint, findTurnStartIndex, type GenerateBranchSummaryOptions, generateBranchSummary, generateSummary, getLastAssistantUsage, prepareBranchEntries, serializeConversation, shouldCompact, } from "./core/compaction/index.js";
5
+ export { createEventBus, type EventBus, type EventBusController } from "./core/event-bus.js";
6
+ export type { AgentEndEvent, AgentStartEvent, AgentToolResult, AgentToolUpdateCallback, AppAction, BashToolCallEvent, BeforeAgentStartEvent, CompactOptions, ContextEvent, ContextUsage, CustomToolCallEvent, EditToolCallEvent, ExecOptions, ExecResult, Extension, ExtensionActions, ExtensionAPI, ExtensionCommandContext, ExtensionCommandContextActions, ExtensionContext, ExtensionContextActions, ExtensionError, ExtensionEvent, ExtensionFactory, ExtensionFlag, ExtensionHandler, ExtensionRuntime, ExtensionShortcut, ExtensionUIContext, ExtensionUIDialogOptions, ExtensionWidgetOptions, FindToolCallEvent, GrepToolCallEvent, InputEvent, InputEventResult, InputSource, KeybindingsManager, LoadExtensionsResult, LsToolCallEvent, MessageRenderer, MessageRenderOptions, ProviderConfig, ProviderModelConfig, ReadToolCallEvent, RegisteredCommand, RegisteredTool, SessionBeforeCompactEvent, SessionBeforeForkEvent, SessionBeforeSwitchEvent, SessionBeforeTreeEvent, SessionCompactEvent, SessionForkEvent, SessionShutdownEvent, SessionStartEvent, SessionSwitchEvent, SessionTreeEvent, SlashCommandInfo, SlashCommandLocation, SlashCommandSource, TerminalInputHandler, ToolCallEvent, ToolDefinition, ToolInfo, ToolRenderResultOptions, ToolResultEvent, TurnEndEvent, TurnStartEvent, UserBashEvent, UserBashEventResult, WidgetPlacement, WriteToolCallEvent, } from "./core/extensions/index.js";
7
+ export { createExtensionRuntime, discoverAndLoadExtensions, ExtensionRunner, isBashToolResult, isEditToolResult, isFindToolResult, isGrepToolResult, isLsToolResult, isReadToolResult, isToolCallEventType, isWriteToolResult, wrapRegisteredTool, wrapRegisteredTools, wrapToolsWithExtensions, wrapToolWithExtensions, } from "./core/extensions/index.js";
8
+ export type { ReadonlyFooterDataProvider } from "./core/footer-data-provider.js";
9
+ export { buildMemoryPromptSection, compactEpisodicMemories, type EpisodicMemory, formatTimestamp, getMemoryCounts, getMemoryDir, loadStore as loadMemoryStore, type MemoryCounts, type MemoryStore, type MemoryType, type ProceduralMemory, type SemanticMemory, saveStore as saveMemoryStore, searchMemories, } from "./core/memory.js";
10
+ export { convertToLlm } from "./core/messages.js";
11
+ export { ModelRegistry } from "./core/model-registry.js";
12
+ export type { PackageManager, PathMetadata, ProgressCallback, ProgressEvent, ResolvedPaths, ResolvedResource, } from "./core/package-manager.js";
13
+ export { DefaultPackageManager } from "./core/package-manager.js";
14
+ export type { ResourceCollision, ResourceDiagnostic, ResourceLoader } from "./core/resource-loader.js";
15
+ export { DefaultResourceLoader } from "./core/resource-loader.js";
16
+ export { type CreateAgentSessionOptions, type CreateAgentSessionResult, createAgentSession, createBashTool, createCodingTools, createEditTool, createFindTool, createGrepTool, createLsTool, createReadOnlyTools, createReadTool, createWriteTool, type PromptTemplate, readOnlyTools, } from "./core/sdk.js";
17
+ export { type BranchSummaryEntry, buildSessionContext, type CompactionEntry, CURRENT_SESSION_VERSION, type CustomEntry, type CustomMessageEntry, type FileEntry, getLatestCompactionEntry, type ModelChangeEntry, migrateSessionEntries, type NewSessionOptions, parseSessionEntries, type SessionContext, type SessionEntry, type SessionEntryBase, type SessionHeader, type SessionInfo, type SessionInfoEntry, SessionManager, type SessionMessageEntry, type ThinkingLevelChangeEntry, } from "./core/session-manager.js";
18
+ export { type CompactionSettings, type ImageSettings, type PackageSource, type RetrySettings, SettingsManager, } from "./core/settings-manager.js";
19
+ export { formatSkillsForPrompt, type LoadSkillsFromDirOptions, type LoadSkillsResult, loadSkills, loadSkillsFromDir, type Skill, type SkillFrontmatter, } from "./core/skills.js";
20
+ export { type BashOperations, type BashSpawnContext, type BashSpawnHook, type BashToolDetails, type BashToolInput, type BashToolOptions, bashTool, codingTools, DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, type EditOperations, type EditToolDetails, type EditToolInput, type EditToolOptions, editTool, type FindOperations, type FindToolDetails, type FindToolInput, type FindToolOptions, findTool, formatSize, type GrepOperations, type GrepToolDetails, type GrepToolInput, type GrepToolOptions, grepTool, type LsOperations, type LsToolDetails, type LsToolInput, type LsToolOptions, lsTool, type ReadOperations, type ReadToolDetails, type ReadToolInput, type ReadToolOptions, readTool, type ToolsOptions, type TruncationOptions, type TruncationResult, truncateHead, truncateLine, truncateTail, type WriteOperations, type WriteToolInput, type WriteToolOptions, writeTool, } from "./core/tools/index.js";
21
+ export { main } from "./main.js";
22
+ export { InteractiveMode, type InteractiveModeOptions, type PrintModeOptions, runPrintMode, runRpcMode, } from "./modes/index.js";
23
+ export { ArminComponent, AssistantMessageComponent, appKey, appKeyHint, BashExecutionComponent, BorderedLoader, BranchSummaryMessageComponent, CompactionSummaryMessageComponent, CustomEditor, CustomMessageComponent, DynamicBorder, ExtensionEditorComponent, ExtensionInputComponent, ExtensionSelectorComponent, editorKey, FooterComponent, keyHint, LoginDialogComponent, ModelSelectorComponent, OAuthSelectorComponent, type RenderDiffOptions, rawKeyHint, renderDiff, SessionSelectorComponent, type SettingsCallbacks, type SettingsConfig, SettingsSelectorComponent, ShowImagesSelectorComponent, SkillInvocationMessageComponent, ThemeSelectorComponent, ThinkingSelectorComponent, ToolExecutionComponent, type ToolExecutionOptions, TreeSelectorComponent, truncateToVisualLines, UserMessageComponent, UserMessageSelectorComponent, type VisualTruncateResult, } from "./modes/interactive/components/index.js";
24
+ export { getLanguageFromPath, getMarkdownTheme, getSelectListTheme, getSettingsListTheme, highlightCode, initTheme, Theme, type ThemeColor, } from "./modes/interactive/theme/theme.js";
25
+ export { copyToClipboard } from "./utils/clipboard.js";
26
+ export { parseFrontmatter, stripFrontmatter } from "./utils/frontmatter.js";
27
+ export { getShellConfig } from "./utils/shell.js";
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["// Core session management\r\n\r\n// Config paths\r\nexport { getAgentDir, VERSION } from \"./config.js\";\r\nexport {\r\n\tAgentSession,\r\n\ttype AgentSessionConfig,\r\n\ttype AgentSessionEvent,\r\n\ttype AgentSessionEventListener,\r\n\ttype ModelCycleResult,\r\n\ttype ParsedSkillBlock,\r\n\ttype PromptOptions,\r\n\tparseSkillBlock,\r\n\ttype SessionStats,\r\n} from \"./core/agent-session.js\";\r\n// Auth and model registry\r\nexport {\r\n\ttype ApiKeyCredential,\r\n\ttype AuthCredential,\r\n\tAuthStorage,\r\n\ttype AuthStorageBackend,\r\n\tFileAuthStorageBackend,\r\n\tInMemoryAuthStorageBackend,\r\n\ttype OAuthCredential,\r\n} from \"./core/auth-storage.js\";\r\n// Compaction\r\nexport {\r\n\ttype BranchPreparation,\r\n\ttype BranchSummaryResult,\r\n\ttype CollectEntriesResult,\r\n\ttype CompactionResult,\r\n\ttype CutPointResult,\r\n\tcalculateContextTokens,\r\n\tcollectEntriesForBranchSummary,\r\n\tcompact,\r\n\tDEFAULT_COMPACTION_SETTINGS,\r\n\testimateTokens,\r\n\ttype FileOperations,\r\n\tfindCutPoint,\r\n\tfindTurnStartIndex,\r\n\ttype GenerateBranchSummaryOptions,\r\n\tgenerateBranchSummary,\r\n\tgenerateSummary,\r\n\tgetLastAssistantUsage,\r\n\tprepareBranchEntries,\r\n\tserializeConversation,\r\n\tshouldCompact,\r\n} from \"./core/compaction/index.js\";\r\nexport { createEventBus, type EventBus, type EventBusController } from \"./core/event-bus.js\";\r\n// Extension system\r\nexport type {\r\n\tAgentEndEvent,\r\n\tAgentStartEvent,\r\n\tAgentToolResult,\r\n\tAgentToolUpdateCallback,\r\n\tAppAction,\r\n\tBashToolCallEvent,\r\n\tBeforeAgentStartEvent,\r\n\tCompactOptions,\r\n\tContextEvent,\r\n\tContextUsage,\r\n\tCustomToolCallEvent,\r\n\tEditToolCallEvent,\r\n\tExecOptions,\r\n\tExecResult,\r\n\tExtension,\r\n\tExtensionActions,\r\n\tExtensionAPI,\r\n\tExtensionCommandContext,\r\n\tExtensionCommandContextActions,\r\n\tExtensionContext,\r\n\tExtensionContextActions,\r\n\tExtensionError,\r\n\tExtensionEvent,\r\n\tExtensionFactory,\r\n\tExtensionFlag,\r\n\tExtensionHandler,\r\n\tExtensionRuntime,\r\n\tExtensionShortcut,\r\n\tExtensionUIContext,\r\n\tExtensionUIDialogOptions,\r\n\tExtensionWidgetOptions,\r\n\tFindToolCallEvent,\r\n\tGrepToolCallEvent,\r\n\tInputEvent,\r\n\tInputEventResult,\r\n\tInputSource,\r\n\tKeybindingsManager,\r\n\tLoadExtensionsResult,\r\n\tLsToolCallEvent,\r\n\tMessageRenderer,\r\n\tMessageRenderOptions,\r\n\tProviderConfig,\r\n\tProviderModelConfig,\r\n\tReadToolCallEvent,\r\n\tRegisteredCommand,\r\n\tRegisteredTool,\r\n\tSessionBeforeCompactEvent,\r\n\tSessionBeforeForkEvent,\r\n\tSessionBeforeSwitchEvent,\r\n\tSessionBeforeTreeEvent,\r\n\tSessionCompactEvent,\r\n\tSessionForkEvent,\r\n\tSessionShutdownEvent,\r\n\tSessionStartEvent,\r\n\tSessionSwitchEvent,\r\n\tSessionTreeEvent,\r\n\tSlashCommandInfo,\r\n\tSlashCommandLocation,\r\n\tSlashCommandSource,\r\n\tTerminalInputHandler,\r\n\tToolCallEvent,\r\n\tToolDefinition,\r\n\tToolInfo,\r\n\tToolRenderResultOptions,\r\n\tToolResultEvent,\r\n\tTurnEndEvent,\r\n\tTurnStartEvent,\r\n\tUserBashEvent,\r\n\tUserBashEventResult,\r\n\tWidgetPlacement,\r\n\tWriteToolCallEvent,\r\n} from \"./core/extensions/index.js\";\r\nexport {\r\n\tcreateExtensionRuntime,\r\n\tdiscoverAndLoadExtensions,\r\n\tExtensionRunner,\r\n\tisBashToolResult,\r\n\tisEditToolResult,\r\n\tisFindToolResult,\r\n\tisGrepToolResult,\r\n\tisLsToolResult,\r\n\tisReadToolResult,\r\n\tisToolCallEventType,\r\n\tisWriteToolResult,\r\n\twrapRegisteredTool,\r\n\twrapRegisteredTools,\r\n\twrapToolsWithExtensions,\r\n\twrapToolWithExtensions,\r\n} from \"./core/extensions/index.js\";\r\n// Footer data provider (git branch + extension statuses - data not otherwise available to extensions)\r\nexport type { ReadonlyFooterDataProvider } from \"./core/footer-data-provider.js\";\r\nexport {\r\n\tbuildMemoryPromptSection,\r\n\tcompactEpisodicMemories,\r\n\ttype EpisodicMemory,\r\n\tformatTimestamp,\r\n\tgetMemoryCounts,\r\n\tgetMemoryDir,\r\n\tloadStore as loadMemoryStore,\r\n\ttype MemoryCounts,\r\n\ttype MemoryStore,\r\n\ttype MemoryType,\r\n\ttype ProceduralMemory,\r\n\ttype SemanticMemory,\r\n\tsaveStore as saveMemoryStore,\r\n\tsearchMemories,\r\n} from \"./core/memory.js\";\r\nexport { convertToLlm } from \"./core/messages.js\";\r\nexport { ModelRegistry } from \"./core/model-registry.js\";\r\nexport type {\r\n\tPackageManager,\r\n\tPathMetadata,\r\n\tProgressCallback,\r\n\tProgressEvent,\r\n\tResolvedPaths,\r\n\tResolvedResource,\r\n} from \"./core/package-manager.js\";\r\nexport { DefaultPackageManager } from \"./core/package-manager.js\";\r\nexport type { ResourceCollision, ResourceDiagnostic, ResourceLoader } from \"./core/resource-loader.js\";\r\nexport { DefaultResourceLoader } from \"./core/resource-loader.js\";\r\n// SDK for programmatic usage\r\nexport {\r\n\ttype CreateAgentSessionOptions,\r\n\ttype CreateAgentSessionResult,\r\n\t// Factory\r\n\tcreateAgentSession,\r\n\tcreateBashTool,\r\n\t// Tool factories (for custom cwd)\r\n\tcreateCodingTools,\r\n\tcreateEditTool,\r\n\tcreateFindTool,\r\n\tcreateGrepTool,\r\n\tcreateLsTool,\r\n\tcreateReadOnlyTools,\r\n\tcreateReadTool,\r\n\tcreateWriteTool,\r\n\ttype PromptTemplate,\r\n\t// Pre-built tools (use process.cwd())\r\n\treadOnlyTools,\r\n} from \"./core/sdk.js\";\r\nexport {\r\n\ttype BranchSummaryEntry,\r\n\tbuildSessionContext,\r\n\ttype CompactionEntry,\r\n\tCURRENT_SESSION_VERSION,\r\n\ttype CustomEntry,\r\n\ttype CustomMessageEntry,\r\n\ttype FileEntry,\r\n\tgetLatestCompactionEntry,\r\n\ttype ModelChangeEntry,\r\n\tmigrateSessionEntries,\r\n\ttype NewSessionOptions,\r\n\tparseSessionEntries,\r\n\ttype SessionContext,\r\n\ttype SessionEntry,\r\n\ttype SessionEntryBase,\r\n\ttype SessionHeader,\r\n\ttype SessionInfo,\r\n\ttype SessionInfoEntry,\r\n\tSessionManager,\r\n\ttype SessionMessageEntry,\r\n\ttype ThinkingLevelChangeEntry,\r\n} from \"./core/session-manager.js\";\r\nexport {\r\n\ttype CompactionSettings,\r\n\ttype ImageSettings,\r\n\ttype PackageSource,\r\n\ttype RetrySettings,\r\n\tSettingsManager,\r\n} from \"./core/settings-manager.js\";\r\n// Skills\r\nexport {\r\n\tformatSkillsForPrompt,\r\n\ttype LoadSkillsFromDirOptions,\r\n\ttype LoadSkillsResult,\r\n\tloadSkills,\r\n\tloadSkillsFromDir,\r\n\ttype Skill,\r\n\ttype SkillFrontmatter,\r\n} from \"./core/skills.js\";\r\n// Tools\r\nexport {\r\n\ttype BashOperations,\r\n\ttype BashSpawnContext,\r\n\ttype BashSpawnHook,\r\n\ttype BashToolDetails,\r\n\ttype BashToolInput,\r\n\ttype BashToolOptions,\r\n\tbashTool,\r\n\tcodingTools,\r\n\tDEFAULT_MAX_BYTES,\r\n\tDEFAULT_MAX_LINES,\r\n\ttype EditOperations,\r\n\ttype EditToolDetails,\r\n\ttype EditToolInput,\r\n\ttype EditToolOptions,\r\n\teditTool,\r\n\ttype FindOperations,\r\n\ttype FindToolDetails,\r\n\ttype FindToolInput,\r\n\ttype FindToolOptions,\r\n\tfindTool,\r\n\tformatSize,\r\n\ttype GrepOperations,\r\n\ttype GrepToolDetails,\r\n\ttype GrepToolInput,\r\n\ttype GrepToolOptions,\r\n\tgrepTool,\r\n\ttype LsOperations,\r\n\ttype LsToolDetails,\r\n\ttype LsToolInput,\r\n\ttype LsToolOptions,\r\n\tlsTool,\r\n\ttype ReadOperations,\r\n\ttype ReadToolDetails,\r\n\ttype ReadToolInput,\r\n\ttype ReadToolOptions,\r\n\treadTool,\r\n\ttype ToolsOptions,\r\n\ttype TruncationOptions,\r\n\ttype TruncationResult,\r\n\ttruncateHead,\r\n\ttruncateLine,\r\n\ttruncateTail,\r\n\ttype WriteOperations,\r\n\ttype WriteToolInput,\r\n\ttype WriteToolOptions,\r\n\twriteTool,\r\n} from \"./core/tools/index.js\";\r\n// Main entry point\r\nexport { main } from \"./main.js\";\r\n// Run modes for programmatic SDK usage\r\nexport {\r\n\tInteractiveMode,\r\n\ttype InteractiveModeOptions,\r\n\ttype PrintModeOptions,\r\n\trunPrintMode,\r\n\trunRpcMode,\r\n} from \"./modes/index.js\";\r\n// UI components for extensions\r\nexport {\r\n\tArminComponent,\r\n\tAssistantMessageComponent,\r\n\tappKey,\r\n\tappKeyHint,\r\n\tBashExecutionComponent,\r\n\tBorderedLoader,\r\n\tBranchSummaryMessageComponent,\r\n\tCompactionSummaryMessageComponent,\r\n\tCustomEditor,\r\n\tCustomMessageComponent,\r\n\tDynamicBorder,\r\n\tExtensionEditorComponent,\r\n\tExtensionInputComponent,\r\n\tExtensionSelectorComponent,\r\n\teditorKey,\r\n\tFooterComponent,\r\n\tkeyHint,\r\n\tLoginDialogComponent,\r\n\tModelSelectorComponent,\r\n\tOAuthSelectorComponent,\r\n\ttype RenderDiffOptions,\r\n\trawKeyHint,\r\n\trenderDiff,\r\n\tSessionSelectorComponent,\r\n\ttype SettingsCallbacks,\r\n\ttype SettingsConfig,\r\n\tSettingsSelectorComponent,\r\n\tShowImagesSelectorComponent,\r\n\tSkillInvocationMessageComponent,\r\n\tThemeSelectorComponent,\r\n\tThinkingSelectorComponent,\r\n\tToolExecutionComponent,\r\n\ttype ToolExecutionOptions,\r\n\tTreeSelectorComponent,\r\n\ttruncateToVisualLines,\r\n\tUserMessageComponent,\r\n\tUserMessageSelectorComponent,\r\n\ttype VisualTruncateResult,\r\n} from \"./modes/interactive/components/index.js\";\r\n// Theme utilities for custom tools and extensions\r\nexport {\r\n\tgetLanguageFromPath,\r\n\tgetMarkdownTheme,\r\n\tgetSelectListTheme,\r\n\tgetSettingsListTheme,\r\n\thighlightCode,\r\n\tinitTheme,\r\n\tTheme,\r\n\ttype ThemeColor,\r\n} from \"./modes/interactive/theme/theme.js\";\r\n// Clipboard utilities\r\nexport { copyToClipboard } from \"./utils/clipboard.js\";\r\nexport { parseFrontmatter, stripFrontmatter } from \"./utils/frontmatter.js\";\r\n// Shell utilities\r\nexport { getShellConfig } from \"./utils/shell.js\";\r\n"]}
package/dist/index.js ADDED
@@ -0,0 +1,43 @@
1
+ // Core session management
2
+ // Config paths
3
+ export { getAgentDir, VERSION } from "./config.js";
4
+ export { AgentSession, parseSkillBlock, } from "./core/agent-session.js";
5
+ // Auth and model registry
6
+ export { AuthStorage, FileAuthStorageBackend, InMemoryAuthStorageBackend, } from "./core/auth-storage.js";
7
+ // Compaction
8
+ export { calculateContextTokens, collectEntriesForBranchSummary, compact, DEFAULT_COMPACTION_SETTINGS, estimateTokens, findCutPoint, findTurnStartIndex, generateBranchSummary, generateSummary, getLastAssistantUsage, prepareBranchEntries, serializeConversation, shouldCompact, } from "./core/compaction/index.js";
9
+ export { createEventBus } from "./core/event-bus.js";
10
+ export { createExtensionRuntime, discoverAndLoadExtensions, ExtensionRunner, isBashToolResult, isEditToolResult, isFindToolResult, isGrepToolResult, isLsToolResult, isReadToolResult, isToolCallEventType, isWriteToolResult, wrapRegisteredTool, wrapRegisteredTools, wrapToolsWithExtensions, wrapToolWithExtensions, } from "./core/extensions/index.js";
11
+ export { buildMemoryPromptSection, compactEpisodicMemories, formatTimestamp, getMemoryCounts, getMemoryDir, loadStore as loadMemoryStore, saveStore as saveMemoryStore, searchMemories, } from "./core/memory.js";
12
+ export { convertToLlm } from "./core/messages.js";
13
+ export { ModelRegistry } from "./core/model-registry.js";
14
+ export { DefaultPackageManager } from "./core/package-manager.js";
15
+ export { DefaultResourceLoader } from "./core/resource-loader.js";
16
+ // SDK for programmatic usage
17
+ export {
18
+ // Factory
19
+ createAgentSession, createBashTool,
20
+ // Tool factories (for custom cwd)
21
+ createCodingTools, createEditTool, createFindTool, createGrepTool, createLsTool, createReadOnlyTools, createReadTool, createWriteTool,
22
+ // Pre-built tools (use process.cwd())
23
+ readOnlyTools, } from "./core/sdk.js";
24
+ export { buildSessionContext, CURRENT_SESSION_VERSION, getLatestCompactionEntry, migrateSessionEntries, parseSessionEntries, SessionManager, } from "./core/session-manager.js";
25
+ export { SettingsManager, } from "./core/settings-manager.js";
26
+ // Skills
27
+ export { formatSkillsForPrompt, loadSkills, loadSkillsFromDir, } from "./core/skills.js";
28
+ // Tools
29
+ export { bashTool, codingTools, DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, editTool, findTool, formatSize, grepTool, lsTool, readTool, truncateHead, truncateLine, truncateTail, writeTool, } from "./core/tools/index.js";
30
+ // Main entry point
31
+ export { main } from "./main.js";
32
+ // Run modes for programmatic SDK usage
33
+ export { InteractiveMode, runPrintMode, runRpcMode, } from "./modes/index.js";
34
+ // UI components for extensions
35
+ export { ArminComponent, AssistantMessageComponent, appKey, appKeyHint, BashExecutionComponent, BorderedLoader, BranchSummaryMessageComponent, CompactionSummaryMessageComponent, CustomEditor, CustomMessageComponent, DynamicBorder, ExtensionEditorComponent, ExtensionInputComponent, ExtensionSelectorComponent, editorKey, FooterComponent, keyHint, LoginDialogComponent, ModelSelectorComponent, OAuthSelectorComponent, rawKeyHint, renderDiff, SessionSelectorComponent, SettingsSelectorComponent, ShowImagesSelectorComponent, SkillInvocationMessageComponent, ThemeSelectorComponent, ThinkingSelectorComponent, ToolExecutionComponent, TreeSelectorComponent, truncateToVisualLines, UserMessageComponent, UserMessageSelectorComponent, } from "./modes/interactive/components/index.js";
36
+ // Theme utilities for custom tools and extensions
37
+ export { getLanguageFromPath, getMarkdownTheme, getSelectListTheme, getSettingsListTheme, highlightCode, initTheme, Theme, } from "./modes/interactive/theme/theme.js";
38
+ // Clipboard utilities
39
+ export { copyToClipboard } from "./utils/clipboard.js";
40
+ export { parseFrontmatter, stripFrontmatter } from "./utils/frontmatter.js";
41
+ // Shell utilities
42
+ export { getShellConfig } from "./utils/shell.js";
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAE1B,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EACN,YAAY,EAOZ,eAAe,GAEf,MAAM,yBAAyB,CAAC;AACjC,0BAA0B;AAC1B,OAAO,EAGN,WAAW,EAEX,sBAAsB,EACtB,0BAA0B,GAE1B,MAAM,wBAAwB,CAAC;AAChC,aAAa;AACb,OAAO,EAMN,sBAAsB,EACtB,8BAA8B,EAC9B,OAAO,EACP,2BAA2B,EAC3B,cAAc,EAEd,YAAY,EACZ,kBAAkB,EAElB,qBAAqB,EACrB,eAAe,EACf,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,aAAa,GACb,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAA0C,MAAM,qBAAqB,CAAC;AA2E7F,OAAO,EACN,sBAAsB,EACtB,yBAAyB,EACzB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,GACtB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EACN,wBAAwB,EACxB,uBAAuB,EAEvB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,SAAS,IAAI,eAAe,EAM5B,SAAS,IAAI,eAAe,EAC5B,cAAc,GACd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AASzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,6BAA6B;AAC7B,OAAO;AAGN,UAAU;AACV,kBAAkB,EAClB,cAAc;AACd,kCAAkC;AAClC,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACd,eAAe;AAEf,sCAAsC;AACtC,aAAa,GACb,MAAM,eAAe,CAAC;AACvB,OAAO,EAEN,mBAAmB,EAEnB,uBAAuB,EAIvB,wBAAwB,EAExB,qBAAqB,EAErB,mBAAmB,EAOnB,cAAc,GAGd,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAKN,eAAe,GACf,MAAM,4BAA4B,CAAC;AACpC,SAAS;AACT,OAAO,EACN,qBAAqB,EAGrB,UAAU,EACV,iBAAiB,GAGjB,MAAM,kBAAkB,CAAC;AAC1B,QAAQ;AACR,OAAO,EAON,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EAKjB,QAAQ,EAKR,QAAQ,EACR,UAAU,EAKV,QAAQ,EAKR,MAAM,EAKN,QAAQ,EAIR,YAAY,EACZ,YAAY,EACZ,YAAY,EAIZ,SAAS,GACT,MAAM,uBAAuB,CAAC;AAC/B,mBAAmB;AACnB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,uCAAuC;AACvC,OAAO,EACN,eAAe,EAGf,YAAY,EACZ,UAAU,GACV,MAAM,kBAAkB,CAAC;AAC1B,+BAA+B;AAC/B,OAAO,EACN,cAAc,EACd,yBAAyB,EACzB,MAAM,EACN,UAAU,EACV,sBAAsB,EACtB,cAAc,EACd,6BAA6B,EAC7B,iCAAiC,EACjC,YAAY,EACZ,sBAAsB,EACtB,aAAa,EACb,wBAAwB,EACxB,uBAAuB,EACvB,0BAA0B,EAC1B,SAAS,EACT,eAAe,EACf,OAAO,EACP,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EAEtB,UAAU,EACV,UAAU,EACV,wBAAwB,EAGxB,yBAAyB,EACzB,2BAA2B,EAC3B,+BAA+B,EAC/B,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,EAEtB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,4BAA4B,GAE5B,MAAM,yCAAyC,CAAC;AACjD,kDAAkD;AAClD,OAAO,EACN,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,SAAS,EACT,KAAK,GAEL,MAAM,oCAAoC,CAAC;AAC5C,sBAAsB;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC5E,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["// Core session management\r\n\r\n// Config paths\r\nexport { getAgentDir, VERSION } from \"./config.js\";\r\nexport {\r\n\tAgentSession,\r\n\ttype AgentSessionConfig,\r\n\ttype AgentSessionEvent,\r\n\ttype AgentSessionEventListener,\r\n\ttype ModelCycleResult,\r\n\ttype ParsedSkillBlock,\r\n\ttype PromptOptions,\r\n\tparseSkillBlock,\r\n\ttype SessionStats,\r\n} from \"./core/agent-session.js\";\r\n// Auth and model registry\r\nexport {\r\n\ttype ApiKeyCredential,\r\n\ttype AuthCredential,\r\n\tAuthStorage,\r\n\ttype AuthStorageBackend,\r\n\tFileAuthStorageBackend,\r\n\tInMemoryAuthStorageBackend,\r\n\ttype OAuthCredential,\r\n} from \"./core/auth-storage.js\";\r\n// Compaction\r\nexport {\r\n\ttype BranchPreparation,\r\n\ttype BranchSummaryResult,\r\n\ttype CollectEntriesResult,\r\n\ttype CompactionResult,\r\n\ttype CutPointResult,\r\n\tcalculateContextTokens,\r\n\tcollectEntriesForBranchSummary,\r\n\tcompact,\r\n\tDEFAULT_COMPACTION_SETTINGS,\r\n\testimateTokens,\r\n\ttype FileOperations,\r\n\tfindCutPoint,\r\n\tfindTurnStartIndex,\r\n\ttype GenerateBranchSummaryOptions,\r\n\tgenerateBranchSummary,\r\n\tgenerateSummary,\r\n\tgetLastAssistantUsage,\r\n\tprepareBranchEntries,\r\n\tserializeConversation,\r\n\tshouldCompact,\r\n} from \"./core/compaction/index.js\";\r\nexport { createEventBus, type EventBus, type EventBusController } from \"./core/event-bus.js\";\r\n// Extension system\r\nexport type {\r\n\tAgentEndEvent,\r\n\tAgentStartEvent,\r\n\tAgentToolResult,\r\n\tAgentToolUpdateCallback,\r\n\tAppAction,\r\n\tBashToolCallEvent,\r\n\tBeforeAgentStartEvent,\r\n\tCompactOptions,\r\n\tContextEvent,\r\n\tContextUsage,\r\n\tCustomToolCallEvent,\r\n\tEditToolCallEvent,\r\n\tExecOptions,\r\n\tExecResult,\r\n\tExtension,\r\n\tExtensionActions,\r\n\tExtensionAPI,\r\n\tExtensionCommandContext,\r\n\tExtensionCommandContextActions,\r\n\tExtensionContext,\r\n\tExtensionContextActions,\r\n\tExtensionError,\r\n\tExtensionEvent,\r\n\tExtensionFactory,\r\n\tExtensionFlag,\r\n\tExtensionHandler,\r\n\tExtensionRuntime,\r\n\tExtensionShortcut,\r\n\tExtensionUIContext,\r\n\tExtensionUIDialogOptions,\r\n\tExtensionWidgetOptions,\r\n\tFindToolCallEvent,\r\n\tGrepToolCallEvent,\r\n\tInputEvent,\r\n\tInputEventResult,\r\n\tInputSource,\r\n\tKeybindingsManager,\r\n\tLoadExtensionsResult,\r\n\tLsToolCallEvent,\r\n\tMessageRenderer,\r\n\tMessageRenderOptions,\r\n\tProviderConfig,\r\n\tProviderModelConfig,\r\n\tReadToolCallEvent,\r\n\tRegisteredCommand,\r\n\tRegisteredTool,\r\n\tSessionBeforeCompactEvent,\r\n\tSessionBeforeForkEvent,\r\n\tSessionBeforeSwitchEvent,\r\n\tSessionBeforeTreeEvent,\r\n\tSessionCompactEvent,\r\n\tSessionForkEvent,\r\n\tSessionShutdownEvent,\r\n\tSessionStartEvent,\r\n\tSessionSwitchEvent,\r\n\tSessionTreeEvent,\r\n\tSlashCommandInfo,\r\n\tSlashCommandLocation,\r\n\tSlashCommandSource,\r\n\tTerminalInputHandler,\r\n\tToolCallEvent,\r\n\tToolDefinition,\r\n\tToolInfo,\r\n\tToolRenderResultOptions,\r\n\tToolResultEvent,\r\n\tTurnEndEvent,\r\n\tTurnStartEvent,\r\n\tUserBashEvent,\r\n\tUserBashEventResult,\r\n\tWidgetPlacement,\r\n\tWriteToolCallEvent,\r\n} from \"./core/extensions/index.js\";\r\nexport {\r\n\tcreateExtensionRuntime,\r\n\tdiscoverAndLoadExtensions,\r\n\tExtensionRunner,\r\n\tisBashToolResult,\r\n\tisEditToolResult,\r\n\tisFindToolResult,\r\n\tisGrepToolResult,\r\n\tisLsToolResult,\r\n\tisReadToolResult,\r\n\tisToolCallEventType,\r\n\tisWriteToolResult,\r\n\twrapRegisteredTool,\r\n\twrapRegisteredTools,\r\n\twrapToolsWithExtensions,\r\n\twrapToolWithExtensions,\r\n} from \"./core/extensions/index.js\";\r\n// Footer data provider (git branch + extension statuses - data not otherwise available to extensions)\r\nexport type { ReadonlyFooterDataProvider } from \"./core/footer-data-provider.js\";\r\nexport {\r\n\tbuildMemoryPromptSection,\r\n\tcompactEpisodicMemories,\r\n\ttype EpisodicMemory,\r\n\tformatTimestamp,\r\n\tgetMemoryCounts,\r\n\tgetMemoryDir,\r\n\tloadStore as loadMemoryStore,\r\n\ttype MemoryCounts,\r\n\ttype MemoryStore,\r\n\ttype MemoryType,\r\n\ttype ProceduralMemory,\r\n\ttype SemanticMemory,\r\n\tsaveStore as saveMemoryStore,\r\n\tsearchMemories,\r\n} from \"./core/memory.js\";\r\nexport { convertToLlm } from \"./core/messages.js\";\r\nexport { ModelRegistry } from \"./core/model-registry.js\";\r\nexport type {\r\n\tPackageManager,\r\n\tPathMetadata,\r\n\tProgressCallback,\r\n\tProgressEvent,\r\n\tResolvedPaths,\r\n\tResolvedResource,\r\n} from \"./core/package-manager.js\";\r\nexport { DefaultPackageManager } from \"./core/package-manager.js\";\r\nexport type { ResourceCollision, ResourceDiagnostic, ResourceLoader } from \"./core/resource-loader.js\";\r\nexport { DefaultResourceLoader } from \"./core/resource-loader.js\";\r\n// SDK for programmatic usage\r\nexport {\r\n\ttype CreateAgentSessionOptions,\r\n\ttype CreateAgentSessionResult,\r\n\t// Factory\r\n\tcreateAgentSession,\r\n\tcreateBashTool,\r\n\t// Tool factories (for custom cwd)\r\n\tcreateCodingTools,\r\n\tcreateEditTool,\r\n\tcreateFindTool,\r\n\tcreateGrepTool,\r\n\tcreateLsTool,\r\n\tcreateReadOnlyTools,\r\n\tcreateReadTool,\r\n\tcreateWriteTool,\r\n\ttype PromptTemplate,\r\n\t// Pre-built tools (use process.cwd())\r\n\treadOnlyTools,\r\n} from \"./core/sdk.js\";\r\nexport {\r\n\ttype BranchSummaryEntry,\r\n\tbuildSessionContext,\r\n\ttype CompactionEntry,\r\n\tCURRENT_SESSION_VERSION,\r\n\ttype CustomEntry,\r\n\ttype CustomMessageEntry,\r\n\ttype FileEntry,\r\n\tgetLatestCompactionEntry,\r\n\ttype ModelChangeEntry,\r\n\tmigrateSessionEntries,\r\n\ttype NewSessionOptions,\r\n\tparseSessionEntries,\r\n\ttype SessionContext,\r\n\ttype SessionEntry,\r\n\ttype SessionEntryBase,\r\n\ttype SessionHeader,\r\n\ttype SessionInfo,\r\n\ttype SessionInfoEntry,\r\n\tSessionManager,\r\n\ttype SessionMessageEntry,\r\n\ttype ThinkingLevelChangeEntry,\r\n} from \"./core/session-manager.js\";\r\nexport {\r\n\ttype CompactionSettings,\r\n\ttype ImageSettings,\r\n\ttype PackageSource,\r\n\ttype RetrySettings,\r\n\tSettingsManager,\r\n} from \"./core/settings-manager.js\";\r\n// Skills\r\nexport {\r\n\tformatSkillsForPrompt,\r\n\ttype LoadSkillsFromDirOptions,\r\n\ttype LoadSkillsResult,\r\n\tloadSkills,\r\n\tloadSkillsFromDir,\r\n\ttype Skill,\r\n\ttype SkillFrontmatter,\r\n} from \"./core/skills.js\";\r\n// Tools\r\nexport {\r\n\ttype BashOperations,\r\n\ttype BashSpawnContext,\r\n\ttype BashSpawnHook,\r\n\ttype BashToolDetails,\r\n\ttype BashToolInput,\r\n\ttype BashToolOptions,\r\n\tbashTool,\r\n\tcodingTools,\r\n\tDEFAULT_MAX_BYTES,\r\n\tDEFAULT_MAX_LINES,\r\n\ttype EditOperations,\r\n\ttype EditToolDetails,\r\n\ttype EditToolInput,\r\n\ttype EditToolOptions,\r\n\teditTool,\r\n\ttype FindOperations,\r\n\ttype FindToolDetails,\r\n\ttype FindToolInput,\r\n\ttype FindToolOptions,\r\n\tfindTool,\r\n\tformatSize,\r\n\ttype GrepOperations,\r\n\ttype GrepToolDetails,\r\n\ttype GrepToolInput,\r\n\ttype GrepToolOptions,\r\n\tgrepTool,\r\n\ttype LsOperations,\r\n\ttype LsToolDetails,\r\n\ttype LsToolInput,\r\n\ttype LsToolOptions,\r\n\tlsTool,\r\n\ttype ReadOperations,\r\n\ttype ReadToolDetails,\r\n\ttype ReadToolInput,\r\n\ttype ReadToolOptions,\r\n\treadTool,\r\n\ttype ToolsOptions,\r\n\ttype TruncationOptions,\r\n\ttype TruncationResult,\r\n\ttruncateHead,\r\n\ttruncateLine,\r\n\ttruncateTail,\r\n\ttype WriteOperations,\r\n\ttype WriteToolInput,\r\n\ttype WriteToolOptions,\r\n\twriteTool,\r\n} from \"./core/tools/index.js\";\r\n// Main entry point\r\nexport { main } from \"./main.js\";\r\n// Run modes for programmatic SDK usage\r\nexport {\r\n\tInteractiveMode,\r\n\ttype InteractiveModeOptions,\r\n\ttype PrintModeOptions,\r\n\trunPrintMode,\r\n\trunRpcMode,\r\n} from \"./modes/index.js\";\r\n// UI components for extensions\r\nexport {\r\n\tArminComponent,\r\n\tAssistantMessageComponent,\r\n\tappKey,\r\n\tappKeyHint,\r\n\tBashExecutionComponent,\r\n\tBorderedLoader,\r\n\tBranchSummaryMessageComponent,\r\n\tCompactionSummaryMessageComponent,\r\n\tCustomEditor,\r\n\tCustomMessageComponent,\r\n\tDynamicBorder,\r\n\tExtensionEditorComponent,\r\n\tExtensionInputComponent,\r\n\tExtensionSelectorComponent,\r\n\teditorKey,\r\n\tFooterComponent,\r\n\tkeyHint,\r\n\tLoginDialogComponent,\r\n\tModelSelectorComponent,\r\n\tOAuthSelectorComponent,\r\n\ttype RenderDiffOptions,\r\n\trawKeyHint,\r\n\trenderDiff,\r\n\tSessionSelectorComponent,\r\n\ttype SettingsCallbacks,\r\n\ttype SettingsConfig,\r\n\tSettingsSelectorComponent,\r\n\tShowImagesSelectorComponent,\r\n\tSkillInvocationMessageComponent,\r\n\tThemeSelectorComponent,\r\n\tThinkingSelectorComponent,\r\n\tToolExecutionComponent,\r\n\ttype ToolExecutionOptions,\r\n\tTreeSelectorComponent,\r\n\ttruncateToVisualLines,\r\n\tUserMessageComponent,\r\n\tUserMessageSelectorComponent,\r\n\ttype VisualTruncateResult,\r\n} from \"./modes/interactive/components/index.js\";\r\n// Theme utilities for custom tools and extensions\r\nexport {\r\n\tgetLanguageFromPath,\r\n\tgetMarkdownTheme,\r\n\tgetSelectListTheme,\r\n\tgetSettingsListTheme,\r\n\thighlightCode,\r\n\tinitTheme,\r\n\tTheme,\r\n\ttype ThemeColor,\r\n} from \"./modes/interactive/theme/theme.js\";\r\n// Clipboard utilities\r\nexport { copyToClipboard } from \"./utils/clipboard.js\";\r\nexport { parseFrontmatter, stripFrontmatter } from \"./utils/frontmatter.js\";\r\n// Shell utilities\r\nexport { getShellConfig } from \"./utils/shell.js\";\r\n"]}
package/dist/main.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Main entry point for the coding agent CLI.
3
+ *
4
+ * This file handles CLI argument parsing and translates them into
5
+ * createAgentSession() options. The SDK does the heavy lifting.
6
+ */
7
+ export declare function main(args: string[]): Promise<void>;
8
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmhBH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,iBAyOxC","sourcesContent":["/**\r\n * Main entry point for the coding agent CLI.\r\n *\r\n * This file handles CLI argument parsing and translates them into\r\n * createAgentSession() options. The SDK does the heavy lifting.\r\n */\r\n\r\nimport { type ImageContent, modelsAreEqual, supportsXhigh } from \"@mariozechner/pi-ai\";\r\nimport chalk from \"chalk\";\r\nimport { createInterface } from \"readline\";\r\nimport { type Args, parseArgs, printHelp } from \"./cli/args.js\";\r\nimport { selectConfig } from \"./cli/config-selector.js\";\r\nimport { processFileArguments } from \"./cli/file-processor.js\";\r\nimport { listModels } from \"./cli/list-models.js\";\r\nimport { selectSession } from \"./cli/session-picker.js\";\r\nimport { APP_NAME, getAgentDir, getModelsPath, VERSION } from \"./config.js\";\r\nimport { AuthStorage } from \"./core/auth-storage.js\";\r\nimport { DEFAULT_THINKING_LEVEL } from \"./core/defaults.js\";\r\nimport { exportFromFile } from \"./core/export-html/index.js\";\r\nimport type { LoadExtensionsResult } from \"./core/extensions/index.js\";\r\nimport { KeybindingsManager } from \"./core/keybindings.js\";\r\nimport { ModelRegistry } from \"./core/model-registry.js\";\r\nimport { resolveCliModel, resolveModelScope, type ScopedModel } from \"./core/model-resolver.js\";\r\nimport { DefaultPackageManager } from \"./core/package-manager.js\";\r\nimport { DefaultResourceLoader } from \"./core/resource-loader.js\";\r\nimport { type CreateAgentSessionOptions, createAgentSession } from \"./core/sdk.js\";\r\nimport { SessionManager } from \"./core/session-manager.js\";\r\nimport { SettingsManager } from \"./core/settings-manager.js\";\r\nimport { printTimings, time } from \"./core/timings.js\";\r\nimport { allTools } from \"./core/tools/index.js\";\r\nimport { runMigrations, showDeprecationWarnings } from \"./migrations.js\";\r\nimport { InteractiveMode, runPrintMode, runRpcMode } from \"./modes/index.js\";\r\nimport { initTheme, stopThemeWatcher } from \"./modes/interactive/theme/theme.js\";\r\n\r\n/**\r\n * Read all content from piped stdin.\r\n * Returns undefined if stdin is a TTY (interactive terminal).\r\n */\r\nasync function readPipedStdin(): Promise<string | undefined> {\r\n\t// If stdin is a TTY, we're running interactively - don't read stdin\r\n\tif (process.stdin.isTTY) {\r\n\t\treturn undefined;\r\n\t}\r\n\r\n\treturn new Promise((resolve) => {\r\n\t\tlet data = \"\";\r\n\t\tprocess.stdin.setEncoding(\"utf8\");\r\n\t\tprocess.stdin.on(\"data\", (chunk) => {\r\n\t\t\tdata += chunk;\r\n\t\t});\r\n\t\tprocess.stdin.on(\"end\", () => {\r\n\t\t\tresolve(data.trim() || undefined);\r\n\t\t});\r\n\t\tprocess.stdin.resume();\r\n\t});\r\n}\r\n\r\nfunction reportSettingsErrors(settingsManager: SettingsManager, context: string): void {\r\n\tconst errors = settingsManager.drainErrors();\r\n\tfor (const { scope, error } of errors) {\r\n\t\tconsole.error(chalk.yellow(`Warning (${context}, ${scope} settings): ${error.message}`));\r\n\t\tif (error.stack) {\r\n\t\t\tconsole.error(chalk.dim(error.stack));\r\n\t\t}\r\n\t}\r\n}\r\n\r\ntype PackageCommand = \"install\" | \"remove\" | \"update\" | \"list\";\r\n\r\ninterface PackageCommandOptions {\r\n\tcommand: PackageCommand;\r\n\tsource?: string;\r\n\tlocal: boolean;\r\n\thelp: boolean;\r\n\tinvalidOption?: string;\r\n}\r\n\r\nfunction getPackageCommandUsage(command: PackageCommand): string {\r\n\tswitch (command) {\r\n\t\tcase \"install\":\r\n\t\t\treturn `${APP_NAME} install <source> [-l]`;\r\n\t\tcase \"remove\":\r\n\t\t\treturn `${APP_NAME} remove <source> [-l]`;\r\n\t\tcase \"update\":\r\n\t\t\treturn `${APP_NAME} update [source]`;\r\n\t\tcase \"list\":\r\n\t\t\treturn `${APP_NAME} list`;\r\n\t}\r\n}\r\n\r\nfunction printPackageCommandHelp(command: PackageCommand): void {\r\n\tswitch (command) {\r\n\t\tcase \"install\":\r\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\r\n ${getPackageCommandUsage(\"install\")}\r\n\r\nInstall a package and add it to settings.\r\n\r\nOptions:\r\n -l, --local Install project-locally (.pi/settings.json)\r\n\r\nExamples:\r\n ${APP_NAME} install npm:@foo/bar\r\n ${APP_NAME} install git:github.com/user/repo\r\n ${APP_NAME} install git:git@github.com:user/repo\r\n ${APP_NAME} install https://github.com/user/repo\r\n ${APP_NAME} install ssh://git@github.com/user/repo\r\n ${APP_NAME} install ./local/path\r\n`);\r\n\t\t\treturn;\r\n\r\n\t\tcase \"remove\":\r\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\r\n ${getPackageCommandUsage(\"remove\")}\r\n\r\nRemove a package and its source from settings.\r\n\r\nOptions:\r\n -l, --local Remove from project settings (.pi/settings.json)\r\n\r\nExample:\r\n ${APP_NAME} remove npm:@foo/bar\r\n`);\r\n\t\t\treturn;\r\n\r\n\t\tcase \"update\":\r\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\r\n ${getPackageCommandUsage(\"update\")}\r\n\r\nUpdate installed packages.\r\nIf <source> is provided, only that package is updated.\r\n`);\r\n\t\t\treturn;\r\n\r\n\t\tcase \"list\":\r\n\t\t\tconsole.log(`${chalk.bold(\"Usage:\")}\r\n ${getPackageCommandUsage(\"list\")}\r\n\r\nList installed packages from user and project settings.\r\n`);\r\n\t\t\treturn;\r\n\t}\r\n}\r\n\r\nfunction parsePackageCommand(args: string[]): PackageCommandOptions | undefined {\r\n\tconst [command, ...rest] = args;\r\n\tif (command !== \"install\" && command !== \"remove\" && command !== \"update\" && command !== \"list\") {\r\n\t\treturn undefined;\r\n\t}\r\n\r\n\tlet local = false;\r\n\tlet help = false;\r\n\tlet invalidOption: string | undefined;\r\n\tlet source: string | undefined;\r\n\r\n\tfor (const arg of rest) {\r\n\t\tif (arg === \"-h\" || arg === \"--help\") {\r\n\t\t\thelp = true;\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tif (arg === \"-l\" || arg === \"--local\") {\r\n\t\t\tif (command === \"install\" || command === \"remove\") {\r\n\t\t\t\tlocal = true;\r\n\t\t\t} else {\r\n\t\t\t\tinvalidOption = invalidOption ?? arg;\r\n\t\t\t}\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tif (arg.startsWith(\"-\")) {\r\n\t\t\tinvalidOption = invalidOption ?? arg;\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tif (!source) {\r\n\t\t\tsource = arg;\r\n\t\t}\r\n\t}\r\n\r\n\treturn { command, source, local, help, invalidOption };\r\n}\r\n\r\nasync function handlePackageCommand(args: string[]): Promise<boolean> {\r\n\tconst options = parsePackageCommand(args);\r\n\tif (!options) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tif (options.help) {\r\n\t\tprintPackageCommandHelp(options.command);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tif (options.invalidOption) {\r\n\t\tconsole.error(chalk.red(`Unknown option ${options.invalidOption} for \"${options.command}\".`));\r\n\t\tconsole.error(chalk.dim(`Use \"${APP_NAME} --help\" or \"${getPackageCommandUsage(options.command)}\".`));\r\n\t\tprocess.exitCode = 1;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tconst source = options.source;\r\n\tif ((options.command === \"install\" || options.command === \"remove\") && !source) {\r\n\t\tconsole.error(chalk.red(`Missing ${options.command} source.`));\r\n\t\tconsole.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));\r\n\t\tprocess.exitCode = 1;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tconst cwd = process.cwd();\r\n\tconst agentDir = getAgentDir();\r\n\tconst settingsManager = SettingsManager.create(cwd, agentDir);\r\n\treportSettingsErrors(settingsManager, \"package command\");\r\n\tconst packageManager = new DefaultPackageManager({ cwd, agentDir, settingsManager });\r\n\r\n\tpackageManager.setProgressCallback((event) => {\r\n\t\tif (event.type === \"start\") {\r\n\t\t\tprocess.stdout.write(chalk.dim(`${event.message}\\n`));\r\n\t\t}\r\n\t});\r\n\r\n\ttry {\r\n\t\tswitch (options.command) {\r\n\t\t\tcase \"install\":\r\n\t\t\t\tawait packageManager.install(source!, { local: options.local });\r\n\t\t\t\tpackageManager.addSourceToSettings(source!, { local: options.local });\r\n\t\t\t\tconsole.log(chalk.green(`Installed ${source}`));\r\n\t\t\t\treturn true;\r\n\r\n\t\t\tcase \"remove\": {\r\n\t\t\t\tawait packageManager.remove(source!, { local: options.local });\r\n\t\t\t\tconst removed = packageManager.removeSourceFromSettings(source!, { local: options.local });\r\n\t\t\t\tif (!removed) {\r\n\t\t\t\t\tconsole.error(chalk.red(`No matching package found for ${source}`));\r\n\t\t\t\t\tprocess.exitCode = 1;\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\tconsole.log(chalk.green(`Removed ${source}`));\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\tcase \"list\": {\r\n\t\t\t\tconst globalSettings = settingsManager.getGlobalSettings();\r\n\t\t\t\tconst projectSettings = settingsManager.getProjectSettings();\r\n\t\t\t\tconst globalPackages = globalSettings.packages ?? [];\r\n\t\t\t\tconst projectPackages = projectSettings.packages ?? [];\r\n\r\n\t\t\t\tif (globalPackages.length === 0 && projectPackages.length === 0) {\r\n\t\t\t\t\tconsole.log(chalk.dim(\"No packages installed.\"));\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst formatPackage = (pkg: (typeof globalPackages)[number], scope: \"user\" | \"project\") => {\r\n\t\t\t\t\tconst source = typeof pkg === \"string\" ? pkg : pkg.source;\r\n\t\t\t\t\tconst filtered = typeof pkg === \"object\";\r\n\t\t\t\t\tconst display = filtered ? `${source} (filtered)` : source;\r\n\t\t\t\t\tconsole.log(` ${display}`);\r\n\t\t\t\t\tconst path = packageManager.getInstalledPath(source, scope);\r\n\t\t\t\t\tif (path) {\r\n\t\t\t\t\t\tconsole.log(chalk.dim(` ${path}`));\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\r\n\t\t\t\tif (globalPackages.length > 0) {\r\n\t\t\t\t\tconsole.log(chalk.bold(\"User packages:\"));\r\n\t\t\t\t\tfor (const pkg of globalPackages) {\r\n\t\t\t\t\t\tformatPackage(pkg, \"user\");\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (projectPackages.length > 0) {\r\n\t\t\t\t\tif (globalPackages.length > 0) console.log();\r\n\t\t\t\t\tconsole.log(chalk.bold(\"Project packages:\"));\r\n\t\t\t\t\tfor (const pkg of projectPackages) {\r\n\t\t\t\t\t\tformatPackage(pkg, \"project\");\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\tcase \"update\":\r\n\t\t\t\tawait packageManager.update(source);\r\n\t\t\t\tif (source) {\r\n\t\t\t\t\tconsole.log(chalk.green(`Updated ${source}`));\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.log(chalk.green(\"Updated packages\"));\r\n\t\t\t\t}\r\n\t\t\t\treturn true;\r\n\t\t}\r\n\t} catch (error: unknown) {\r\n\t\tconst message = error instanceof Error ? error.message : \"Unknown package command error\";\r\n\t\tconsole.error(chalk.red(`Error: ${message}`));\r\n\t\tprocess.exitCode = 1;\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nasync function prepareInitialMessage(\r\n\tparsed: Args,\r\n\tautoResizeImages: boolean,\r\n): Promise<{\r\n\tinitialMessage?: string;\r\n\tinitialImages?: ImageContent[];\r\n}> {\r\n\tif (parsed.fileArgs.length === 0) {\r\n\t\treturn {};\r\n\t}\r\n\r\n\tconst { text, images } = await processFileArguments(parsed.fileArgs, { autoResizeImages });\r\n\r\n\tlet initialMessage: string;\r\n\tif (parsed.messages.length > 0) {\r\n\t\tinitialMessage = text + parsed.messages[0];\r\n\t\tparsed.messages.shift();\r\n\t} else {\r\n\t\tinitialMessage = text;\r\n\t}\r\n\r\n\treturn {\r\n\t\tinitialMessage,\r\n\t\tinitialImages: images.length > 0 ? images : undefined,\r\n\t};\r\n}\r\n\r\n/** Result from resolving a session argument */\r\ntype ResolvedSession =\r\n\t| { type: \"path\"; path: string } // Direct file path\r\n\t| { type: \"local\"; path: string } // Found in current project\r\n\t| { type: \"global\"; path: string; cwd: string } // Found in different project\r\n\t| { type: \"not_found\"; arg: string }; // Not found anywhere\r\n\r\n/**\r\n * Resolve a session argument to a file path.\r\n * If it looks like a path, use as-is. Otherwise try to match as session ID prefix.\r\n */\r\nasync function resolveSessionPath(sessionArg: string, cwd: string, sessionDir?: string): Promise<ResolvedSession> {\r\n\t// If it looks like a file path, use as-is\r\n\tif (sessionArg.includes(\"/\") || sessionArg.includes(\"\\\\\") || sessionArg.endsWith(\".jsonl\")) {\r\n\t\treturn { type: \"path\", path: sessionArg };\r\n\t}\r\n\r\n\t// Try to match as session ID in current project first\r\n\tconst localSessions = await SessionManager.list(cwd, sessionDir);\r\n\tconst localMatches = localSessions.filter((s) => s.id.startsWith(sessionArg));\r\n\r\n\tif (localMatches.length >= 1) {\r\n\t\treturn { type: \"local\", path: localMatches[0].path };\r\n\t}\r\n\r\n\t// Try global search across all projects\r\n\tconst allSessions = await SessionManager.listAll();\r\n\tconst globalMatches = allSessions.filter((s) => s.id.startsWith(sessionArg));\r\n\r\n\tif (globalMatches.length >= 1) {\r\n\t\tconst match = globalMatches[0];\r\n\t\treturn { type: \"global\", path: match.path, cwd: match.cwd };\r\n\t}\r\n\r\n\t// Not found anywhere\r\n\treturn { type: \"not_found\", arg: sessionArg };\r\n}\r\n\r\n/** Prompt user for yes/no confirmation */\r\nasync function promptConfirm(message: string): Promise<boolean> {\r\n\treturn new Promise((resolve) => {\r\n\t\tconst rl = createInterface({\r\n\t\t\tinput: process.stdin,\r\n\t\t\toutput: process.stdout,\r\n\t\t});\r\n\t\trl.question(`${message} [y/N] `, (answer) => {\r\n\t\t\trl.close();\r\n\t\t\tresolve(answer.toLowerCase() === \"y\" || answer.toLowerCase() === \"yes\");\r\n\t\t});\r\n\t});\r\n}\r\n\r\nasync function createSessionManager(parsed: Args, cwd: string): Promise<SessionManager | undefined> {\r\n\tif (parsed.noSession) {\r\n\t\treturn SessionManager.inMemory();\r\n\t}\r\n\tif (parsed.session) {\r\n\t\tconst resolved = await resolveSessionPath(parsed.session, cwd, parsed.sessionDir);\r\n\r\n\t\tswitch (resolved.type) {\r\n\t\t\tcase \"path\":\r\n\t\t\tcase \"local\":\r\n\t\t\t\treturn SessionManager.open(resolved.path, parsed.sessionDir);\r\n\r\n\t\t\tcase \"global\": {\r\n\t\t\t\t// Session found in different project - ask user if they want to fork\r\n\t\t\t\tconsole.log(chalk.yellow(`Session found in different project: ${resolved.cwd}`));\r\n\t\t\t\tconst shouldFork = await promptConfirm(\"Fork this session into current directory?\");\r\n\t\t\t\tif (!shouldFork) {\r\n\t\t\t\t\tconsole.log(chalk.dim(\"Aborted.\"));\r\n\t\t\t\t\tprocess.exit(0);\r\n\t\t\t\t}\r\n\t\t\t\treturn SessionManager.forkFrom(resolved.path, cwd, parsed.sessionDir);\r\n\t\t\t}\r\n\r\n\t\t\tcase \"not_found\":\r\n\t\t\t\tconsole.error(chalk.red(`No session found matching '${resolved.arg}'`));\r\n\t\t\t\tprocess.exit(1);\r\n\t\t}\r\n\t}\r\n\tif (parsed.continue) {\r\n\t\treturn SessionManager.continueRecent(cwd, parsed.sessionDir);\r\n\t}\r\n\t// --resume is handled separately (needs picker UI)\r\n\t// If --session-dir provided without --continue/--resume, create new session there\r\n\tif (parsed.sessionDir) {\r\n\t\treturn SessionManager.create(cwd, parsed.sessionDir);\r\n\t}\r\n\t// Default case (new session) returns undefined, SDK will create one\r\n\treturn undefined;\r\n}\r\n\r\nfunction buildSessionOptions(\r\n\tparsed: Args,\r\n\tscopedModels: ScopedModel[],\r\n\tsessionManager: SessionManager | undefined,\r\n\tmodelRegistry: ModelRegistry,\r\n\tsettingsManager: SettingsManager,\r\n): { options: CreateAgentSessionOptions; cliThinkingFromModel: boolean } {\r\n\tconst options: CreateAgentSessionOptions = {};\r\n\tlet cliThinkingFromModel = false;\r\n\r\n\tif (sessionManager) {\r\n\t\toptions.sessionManager = sessionManager;\r\n\t}\r\n\r\n\t// Model from CLI\r\n\t// - supports --provider <name> --model <pattern>\r\n\t// - supports --model <provider>/<pattern>\r\n\tif (parsed.model) {\r\n\t\tconst resolved = resolveCliModel({\r\n\t\t\tcliProvider: parsed.provider,\r\n\t\t\tcliModel: parsed.model,\r\n\t\t\tmodelRegistry,\r\n\t\t});\r\n\t\tif (resolved.warning) {\r\n\t\t\tconsole.warn(chalk.yellow(`Warning: ${resolved.warning}`));\r\n\t\t}\r\n\t\tif (resolved.error) {\r\n\t\t\tconsole.error(chalk.red(resolved.error));\r\n\t\t\tprocess.exit(1);\r\n\t\t}\r\n\t\tif (resolved.model) {\r\n\t\t\toptions.model = resolved.model;\r\n\t\t\t// Allow \"--model <pattern>:<thinking>\" as a shorthand.\r\n\t\t\t// Explicit --thinking still takes precedence (applied later).\r\n\t\t\tif (!parsed.thinking && resolved.thinkingLevel) {\r\n\t\t\t\toptions.thinkingLevel = resolved.thinkingLevel;\r\n\t\t\t\tcliThinkingFromModel = true;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (!options.model && scopedModels.length > 0 && !parsed.continue && !parsed.resume) {\r\n\t\t// Check if saved default is in scoped models - use it if so, otherwise first scoped model\r\n\t\tconst savedProvider = settingsManager.getDefaultProvider();\r\n\t\tconst savedModelId = settingsManager.getDefaultModel();\r\n\t\tconst savedModel = savedProvider && savedModelId ? modelRegistry.find(savedProvider, savedModelId) : undefined;\r\n\t\tconst savedInScope = savedModel ? scopedModels.find((sm) => modelsAreEqual(sm.model, savedModel)) : undefined;\r\n\r\n\t\tif (savedInScope) {\r\n\t\t\toptions.model = savedInScope.model;\r\n\t\t\t// Use thinking level from scoped model config if explicitly set\r\n\t\t\tif (!parsed.thinking && savedInScope.thinkingLevel) {\r\n\t\t\t\toptions.thinkingLevel = savedInScope.thinkingLevel;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\toptions.model = scopedModels[0].model;\r\n\t\t\t// Use thinking level from first scoped model if explicitly set\r\n\t\t\tif (!parsed.thinking && scopedModels[0].thinkingLevel) {\r\n\t\t\t\toptions.thinkingLevel = scopedModels[0].thinkingLevel;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Thinking level from CLI (takes precedence over scoped model thinking levels set above)\r\n\tif (parsed.thinking) {\r\n\t\toptions.thinkingLevel = parsed.thinking;\r\n\t}\r\n\r\n\t// Scoped models for Ctrl+P cycling - fill in default thinking level for models without explicit level\r\n\tif (scopedModels.length > 0) {\r\n\t\tconst defaultThinkingLevel = settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\r\n\t\toptions.scopedModels = scopedModels.map((sm) => ({\r\n\t\t\tmodel: sm.model,\r\n\t\t\tthinkingLevel: sm.thinkingLevel ?? defaultThinkingLevel,\r\n\t\t}));\r\n\t}\r\n\r\n\t// API key from CLI - set in authStorage\r\n\t// (handled by caller before createAgentSession)\r\n\r\n\t// Tools\r\n\tif (parsed.noTools) {\r\n\t\t// --no-tools: start with no built-in tools\r\n\t\t// --tools can still add specific ones back\r\n\t\tif (parsed.tools && parsed.tools.length > 0) {\r\n\t\t\toptions.tools = parsed.tools.map((name) => allTools[name]);\r\n\t\t} else {\r\n\t\t\toptions.tools = [];\r\n\t\t}\r\n\t} else if (parsed.tools) {\r\n\t\toptions.tools = parsed.tools.map((name) => allTools[name]);\r\n\t}\r\n\r\n\treturn { options, cliThinkingFromModel };\r\n}\r\n\r\nasync function handleConfigCommand(args: string[]): Promise<boolean> {\r\n\tif (args[0] !== \"config\") {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tconst cwd = process.cwd();\r\n\tconst agentDir = getAgentDir();\r\n\tconst settingsManager = SettingsManager.create(cwd, agentDir);\r\n\treportSettingsErrors(settingsManager, \"config command\");\r\n\tconst packageManager = new DefaultPackageManager({ cwd, agentDir, settingsManager });\r\n\r\n\tconst resolvedPaths = await packageManager.resolve();\r\n\r\n\tawait selectConfig({\r\n\t\tresolvedPaths,\r\n\t\tsettingsManager,\r\n\t\tcwd,\r\n\t\tagentDir,\r\n\t});\r\n\r\n\tprocess.exit(0);\r\n}\r\n\r\nexport async function main(args: string[]) {\r\n\tif (await handlePackageCommand(args)) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (await handleConfigCommand(args)) {\r\n\t\treturn;\r\n\t}\r\n\r\n\t// Run migrations (pass cwd for project-local migrations)\r\n\tconst { migratedAuthProviders: migratedProviders, deprecationWarnings } = runMigrations(process.cwd());\r\n\r\n\t// First pass: parse args to get --extension paths\r\n\tconst firstPass = parseArgs(args);\r\n\r\n\t// Early load extensions to discover their CLI flags\r\n\tconst cwd = process.cwd();\r\n\tconst agentDir = getAgentDir();\r\n\tconst settingsManager = SettingsManager.create(cwd, agentDir);\r\n\treportSettingsErrors(settingsManager, \"startup\");\r\n\tconst authStorage = AuthStorage.create();\r\n\tconst modelRegistry = new ModelRegistry(authStorage, getModelsPath());\r\n\r\n\tconst resourceLoader = new DefaultResourceLoader({\r\n\t\tcwd,\r\n\t\tagentDir,\r\n\t\tsettingsManager,\r\n\t\tadditionalExtensionPaths: firstPass.extensions,\r\n\t\tadditionalSkillPaths: firstPass.skills,\r\n\t\tadditionalPromptTemplatePaths: firstPass.promptTemplates,\r\n\t\tadditionalThemePaths: firstPass.themes,\r\n\t\tnoExtensions: firstPass.noExtensions,\r\n\t\tnoSkills: firstPass.noSkills,\r\n\t\tnoPromptTemplates: firstPass.noPromptTemplates,\r\n\t\tnoThemes: firstPass.noThemes,\r\n\t\tsystemPrompt: firstPass.systemPrompt,\r\n\t\tappendSystemPrompt: firstPass.appendSystemPrompt,\r\n\t});\r\n\tawait resourceLoader.reload();\r\n\ttime(\"resourceLoader.reload\");\r\n\r\n\tconst extensionsResult: LoadExtensionsResult = resourceLoader.getExtensions();\r\n\tfor (const { path, error } of extensionsResult.errors) {\r\n\t\tconsole.error(chalk.red(`Failed to load extension \"${path}\": ${error}`));\r\n\t}\r\n\r\n\t// Apply pending provider registrations from extensions immediately\r\n\t// so they're available for model resolution before AgentSession is created\r\n\tfor (const { name, config } of extensionsResult.runtime.pendingProviderRegistrations) {\r\n\t\tmodelRegistry.registerProvider(name, config);\r\n\t}\r\n\textensionsResult.runtime.pendingProviderRegistrations = [];\r\n\r\n\tconst extensionFlags = new Map<string, { type: \"boolean\" | \"string\" }>();\r\n\tfor (const ext of extensionsResult.extensions) {\r\n\t\tfor (const [name, flag] of ext.flags) {\r\n\t\t\textensionFlags.set(name, { type: flag.type });\r\n\t\t}\r\n\t}\r\n\r\n\t// Second pass: parse args with extension flags\r\n\tconst parsed = parseArgs(args, extensionFlags);\r\n\r\n\t// Pass flag values to extensions via runtime\r\n\tfor (const [name, value] of parsed.unknownFlags) {\r\n\t\textensionsResult.runtime.flagValues.set(name, value);\r\n\t}\r\n\r\n\tif (parsed.version) {\r\n\t\tconsole.log(VERSION);\r\n\t\tprocess.exit(0);\r\n\t}\r\n\r\n\tif (parsed.help) {\r\n\t\tprintHelp();\r\n\t\tprocess.exit(0);\r\n\t}\r\n\r\n\tif (parsed.listModels !== undefined) {\r\n\t\tconst searchPattern = typeof parsed.listModels === \"string\" ? parsed.listModels : undefined;\r\n\t\tawait listModels(modelRegistry, searchPattern);\r\n\t\tprocess.exit(0);\r\n\t}\r\n\r\n\t// Read piped stdin content (if any) - skip for RPC mode which uses stdin for JSON-RPC\r\n\tif (parsed.mode !== \"rpc\") {\r\n\t\tconst stdinContent = await readPipedStdin();\r\n\t\tif (stdinContent !== undefined) {\r\n\t\t\t// Force print mode since interactive mode requires a TTY for keyboard input\r\n\t\t\tparsed.print = true;\r\n\t\t\t// Prepend stdin content to messages\r\n\t\t\tparsed.messages.unshift(stdinContent);\r\n\t\t}\r\n\t}\r\n\r\n\tif (parsed.export) {\r\n\t\tlet result: string;\r\n\t\ttry {\r\n\t\t\tconst outputPath = parsed.messages.length > 0 ? parsed.messages[0] : undefined;\r\n\t\t\tresult = await exportFromFile(parsed.export, outputPath);\r\n\t\t} catch (error: unknown) {\r\n\t\t\tconst message = error instanceof Error ? error.message : \"Failed to export session\";\r\n\t\t\tconsole.error(chalk.red(`Error: ${message}`));\r\n\t\t\tprocess.exit(1);\r\n\t\t}\r\n\t\tconsole.log(`Exported to: ${result}`);\r\n\t\tprocess.exit(0);\r\n\t}\r\n\r\n\tif (parsed.mode === \"rpc\" && parsed.fileArgs.length > 0) {\r\n\t\tconsole.error(chalk.red(\"Error: @file arguments are not supported in RPC mode\"));\r\n\t\tprocess.exit(1);\r\n\t}\r\n\r\n\tconst { initialMessage, initialImages } = await prepareInitialMessage(parsed, settingsManager.getImageAutoResize());\r\n\tconst isInteractive = !parsed.print && parsed.mode === undefined;\r\n\tconst mode = parsed.mode || \"text\";\r\n\tinitTheme(settingsManager.getTheme(), isInteractive);\r\n\r\n\t// Show deprecation warnings in interactive mode\r\n\tif (isInteractive && deprecationWarnings.length > 0) {\r\n\t\tawait showDeprecationWarnings(deprecationWarnings);\r\n\t}\r\n\r\n\tlet scopedModels: ScopedModel[] = [];\r\n\tconst modelPatterns = parsed.models ?? settingsManager.getEnabledModels();\r\n\tif (modelPatterns && modelPatterns.length > 0) {\r\n\t\tscopedModels = await resolveModelScope(modelPatterns, modelRegistry);\r\n\t}\r\n\r\n\t// Create session manager based on CLI flags\r\n\tlet sessionManager = await createSessionManager(parsed, cwd);\r\n\r\n\t// Handle --resume: show session picker\r\n\tif (parsed.resume) {\r\n\t\t// Initialize keybindings so session picker respects user config\r\n\t\tKeybindingsManager.create();\r\n\r\n\t\tconst selectedPath = await selectSession(\r\n\t\t\t(onProgress) => SessionManager.list(cwd, parsed.sessionDir, onProgress),\r\n\t\t\tSessionManager.listAll,\r\n\t\t);\r\n\t\tif (!selectedPath) {\r\n\t\t\tconsole.log(chalk.dim(\"No session selected\"));\r\n\t\t\tstopThemeWatcher();\r\n\t\t\tprocess.exit(0);\r\n\t\t}\r\n\t\tsessionManager = SessionManager.open(selectedPath);\r\n\t}\r\n\r\n\tconst { options: sessionOptions, cliThinkingFromModel } = buildSessionOptions(\r\n\t\tparsed,\r\n\t\tscopedModels,\r\n\t\tsessionManager,\r\n\t\tmodelRegistry,\r\n\t\tsettingsManager,\r\n\t);\r\n\tsessionOptions.authStorage = authStorage;\r\n\tsessionOptions.modelRegistry = modelRegistry;\r\n\tsessionOptions.resourceLoader = resourceLoader;\r\n\r\n\t// Handle CLI --api-key as runtime override (not persisted)\r\n\tif (parsed.apiKey) {\r\n\t\tif (!sessionOptions.model) {\r\n\t\t\tconsole.error(\r\n\t\t\t\tchalk.red(\"--api-key requires a model to be specified via --model, --provider/--model, or --models\"),\r\n\t\t\t);\r\n\t\t\tprocess.exit(1);\r\n\t\t}\r\n\t\tauthStorage.setRuntimeApiKey(sessionOptions.model.provider, parsed.apiKey);\r\n\t}\r\n\r\n\tconst { session, modelFallbackMessage } = await createAgentSession(sessionOptions);\r\n\r\n\tif (!isInteractive && !session.model) {\r\n\t\tconsole.error(chalk.red(\"No models available.\"));\r\n\t\tconsole.error(chalk.yellow(\"\\nSet an API key environment variable:\"));\r\n\t\tconsole.error(\" ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, etc.\");\r\n\t\tconsole.error(chalk.yellow(`\\nOr create ${getModelsPath()}`));\r\n\t\tprocess.exit(1);\r\n\t}\r\n\r\n\t// Clamp thinking level to model capabilities for CLI-provided thinking levels.\r\n\t// This covers both --thinking <level> and --model <pattern>:<thinking>.\r\n\tconst cliThinkingOverride = parsed.thinking !== undefined || cliThinkingFromModel;\r\n\tif (session.model && cliThinkingOverride) {\r\n\t\tlet effectiveThinking = session.thinkingLevel;\r\n\t\tif (!session.model.reasoning) {\r\n\t\t\teffectiveThinking = \"off\";\r\n\t\t} else if (effectiveThinking === \"xhigh\" && !supportsXhigh(session.model)) {\r\n\t\t\teffectiveThinking = \"high\";\r\n\t\t}\r\n\t\tif (effectiveThinking !== session.thinkingLevel) {\r\n\t\t\tsession.setThinkingLevel(effectiveThinking);\r\n\t\t}\r\n\t}\r\n\r\n\tif (mode === \"rpc\") {\r\n\t\tawait runRpcMode(session);\r\n\t} else if (isInteractive) {\r\n\t\tif (scopedModels.length > 0 && (parsed.verbose || !settingsManager.getQuietStartup())) {\r\n\t\t\tconst modelList = scopedModels\r\n\t\t\t\t.map((sm) => {\r\n\t\t\t\t\tconst thinkingStr = sm.thinkingLevel ? `:${sm.thinkingLevel}` : \"\";\r\n\t\t\t\t\treturn `${sm.model.id}${thinkingStr}`;\r\n\t\t\t\t})\r\n\t\t\t\t.join(\", \");\r\n\t\t\tconsole.log(chalk.dim(`Model scope: ${modelList} ${chalk.gray(\"(Ctrl+P to cycle)\")}`));\r\n\t\t}\r\n\r\n\t\tprintTimings();\r\n\t\tconst mode = new InteractiveMode(session, {\r\n\t\t\tmigratedProviders,\r\n\t\t\tmodelFallbackMessage,\r\n\t\t\tinitialMessage,\r\n\t\t\tinitialImages,\r\n\t\t\tinitialMessages: parsed.messages,\r\n\t\t\tverbose: parsed.verbose,\r\n\t\t});\r\n\t\tawait mode.run();\r\n\t} else {\r\n\t\tawait runPrintMode(session, {\r\n\t\t\tmode,\r\n\t\t\tmessages: parsed.messages,\r\n\t\t\tinitialMessage,\r\n\t\t\tinitialImages,\r\n\t\t});\r\n\t\tstopThemeWatcher();\r\n\t\tif (process.stdout.writableLength > 0) {\r\n\t\t\tawait new Promise<void>((resolve) => process.stdout.once(\"drain\", resolve));\r\n\t\t}\r\n\t\tprocess.exit(0);\r\n\t}\r\n}\r\n"]}