@lenylvt/pi-coding-agent 0.64.0

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 (770) hide show
  1. package/CHANGELOG.md +3331 -0
  2. package/README.md +48 -0
  3. package/dist/bun/cli.d.ts +3 -0
  4. package/dist/bun/cli.d.ts.map +1 -0
  5. package/dist/bun/cli.js +5 -0
  6. package/dist/bun/cli.js.map +1 -0
  7. package/dist/cli/args.d.ts +49 -0
  8. package/dist/cli/args.d.ts.map +1 -0
  9. package/dist/cli/args.js +292 -0
  10. package/dist/cli/args.js.map +1 -0
  11. package/dist/cli/config-selector.d.ts +14 -0
  12. package/dist/cli/config-selector.d.ts.map +1 -0
  13. package/dist/cli/config-selector.js +31 -0
  14. package/dist/cli/config-selector.js.map +1 -0
  15. package/dist/cli/file-processor.d.ts +15 -0
  16. package/dist/cli/file-processor.d.ts.map +1 -0
  17. package/dist/cli/file-processor.js +83 -0
  18. package/dist/cli/file-processor.js.map +1 -0
  19. package/dist/cli/initial-message.d.ts +18 -0
  20. package/dist/cli/initial-message.d.ts.map +1 -0
  21. package/dist/cli/initial-message.js +22 -0
  22. package/dist/cli/initial-message.js.map +1 -0
  23. package/dist/cli/list-models.d.ts +9 -0
  24. package/dist/cli/list-models.d.ts.map +1 -0
  25. package/dist/cli/list-models.js +92 -0
  26. package/dist/cli/list-models.js.map +1 -0
  27. package/dist/cli/session-picker.d.ts +9 -0
  28. package/dist/cli/session-picker.d.ts.map +1 -0
  29. package/dist/cli/session-picker.js +35 -0
  30. package/dist/cli/session-picker.js.map +1 -0
  31. package/dist/cli.d.ts +3 -0
  32. package/dist/cli.d.ts.map +1 -0
  33. package/dist/cli.js +14 -0
  34. package/dist/cli.js.map +1 -0
  35. package/dist/config.d.ts +69 -0
  36. package/dist/config.d.ts.map +1 -0
  37. package/dist/config.js +178 -0
  38. package/dist/config.js.map +1 -0
  39. package/dist/core/agent-session.d.ts +622 -0
  40. package/dist/core/agent-session.d.ts.map +1 -0
  41. package/dist/core/agent-session.js +2688 -0
  42. package/dist/core/agent-session.js.map +1 -0
  43. package/dist/core/auth-storage.d.ts +132 -0
  44. package/dist/core/auth-storage.d.ts.map +1 -0
  45. package/dist/core/auth-storage.js +422 -0
  46. package/dist/core/auth-storage.js.map +1 -0
  47. package/dist/core/bash-executor.d.ts +46 -0
  48. package/dist/core/bash-executor.d.ts.map +1 -0
  49. package/dist/core/bash-executor.js +113 -0
  50. package/dist/core/bash-executor.js.map +1 -0
  51. package/dist/core/compaction/branch-summarization.d.ts +88 -0
  52. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  53. package/dist/core/compaction/branch-summarization.js +243 -0
  54. package/dist/core/compaction/branch-summarization.js.map +1 -0
  55. package/dist/core/compaction/compaction.d.ts +121 -0
  56. package/dist/core/compaction/compaction.d.ts.map +1 -0
  57. package/dist/core/compaction/compaction.js +613 -0
  58. package/dist/core/compaction/compaction.js.map +1 -0
  59. package/dist/core/compaction/index.d.ts +7 -0
  60. package/dist/core/compaction/index.d.ts.map +1 -0
  61. package/dist/core/compaction/index.js +7 -0
  62. package/dist/core/compaction/index.js.map +1 -0
  63. package/dist/core/compaction/utils.d.ts +38 -0
  64. package/dist/core/compaction/utils.d.ts.map +1 -0
  65. package/dist/core/compaction/utils.js +153 -0
  66. package/dist/core/compaction/utils.js.map +1 -0
  67. package/dist/core/defaults.d.ts +3 -0
  68. package/dist/core/defaults.d.ts.map +1 -0
  69. package/dist/core/defaults.js +2 -0
  70. package/dist/core/defaults.js.map +1 -0
  71. package/dist/core/diagnostics.d.ts +15 -0
  72. package/dist/core/diagnostics.d.ts.map +1 -0
  73. package/dist/core/diagnostics.js +2 -0
  74. package/dist/core/diagnostics.js.map +1 -0
  75. package/dist/core/event-bus.d.ts +9 -0
  76. package/dist/core/event-bus.d.ts.map +1 -0
  77. package/dist/core/event-bus.js +25 -0
  78. package/dist/core/event-bus.js.map +1 -0
  79. package/dist/core/exec.d.ts +29 -0
  80. package/dist/core/exec.d.ts.map +1 -0
  81. package/dist/core/exec.js +75 -0
  82. package/dist/core/exec.js.map +1 -0
  83. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  84. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  85. package/dist/core/export-html/ansi-to-html.js +249 -0
  86. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  87. package/dist/core/export-html/index.d.ts +37 -0
  88. package/dist/core/export-html/index.d.ts.map +1 -0
  89. package/dist/core/export-html/index.js +224 -0
  90. package/dist/core/export-html/index.js.map +1 -0
  91. package/dist/core/export-html/template.css +1001 -0
  92. package/dist/core/export-html/template.html +55 -0
  93. package/dist/core/export-html/template.js +1690 -0
  94. package/dist/core/export-html/tool-renderer.d.ts +38 -0
  95. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  96. package/dist/core/export-html/tool-renderer.js +95 -0
  97. package/dist/core/export-html/tool-renderer.js.map +1 -0
  98. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  99. package/dist/core/export-html/vendor/marked.min.js +6 -0
  100. package/dist/core/extensions/index.d.ts +12 -0
  101. package/dist/core/extensions/index.d.ts.map +1 -0
  102. package/dist/core/extensions/index.js +9 -0
  103. package/dist/core/extensions/index.js.map +1 -0
  104. package/dist/core/extensions/loader.d.ts +25 -0
  105. package/dist/core/extensions/loader.d.ts.map +1 -0
  106. package/dist/core/extensions/loader.js +436 -0
  107. package/dist/core/extensions/loader.js.map +1 -0
  108. package/dist/core/extensions/runner.d.ts +148 -0
  109. package/dist/core/extensions/runner.d.ts.map +1 -0
  110. package/dist/core/extensions/runner.js +700 -0
  111. package/dist/core/extensions/runner.js.map +1 -0
  112. package/dist/core/extensions/types.d.ts +1085 -0
  113. package/dist/core/extensions/types.d.ts.map +1 -0
  114. package/dist/core/extensions/types.js +35 -0
  115. package/dist/core/extensions/types.js.map +1 -0
  116. package/dist/core/extensions/wrapper.d.ts +20 -0
  117. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  118. package/dist/core/extensions/wrapper.js +22 -0
  119. package/dist/core/extensions/wrapper.js.map +1 -0
  120. package/dist/core/footer-data-provider.d.ts +44 -0
  121. package/dist/core/footer-data-provider.d.ts.map +1 -0
  122. package/dist/core/footer-data-provider.js +252 -0
  123. package/dist/core/footer-data-provider.js.map +1 -0
  124. package/dist/core/index.d.ts +10 -0
  125. package/dist/core/index.d.ts.map +1 -0
  126. package/dist/core/index.js +10 -0
  127. package/dist/core/index.js.map +1 -0
  128. package/dist/core/keybindings.d.ts +275 -0
  129. package/dist/core/keybindings.d.ts.map +1 -0
  130. package/dist/core/keybindings.js +241 -0
  131. package/dist/core/keybindings.js.map +1 -0
  132. package/dist/core/messages.d.ts +77 -0
  133. package/dist/core/messages.d.ts.map +1 -0
  134. package/dist/core/messages.js +123 -0
  135. package/dist/core/messages.js.map +1 -0
  136. package/dist/core/model-registry.d.ts +132 -0
  137. package/dist/core/model-registry.d.ts.map +1 -0
  138. package/dist/core/model-registry.js +565 -0
  139. package/dist/core/model-registry.js.map +1 -0
  140. package/dist/core/model-resolver.d.ts +110 -0
  141. package/dist/core/model-resolver.d.ts.map +1 -0
  142. package/dist/core/model-resolver.js +464 -0
  143. package/dist/core/model-resolver.js.map +1 -0
  144. package/dist/core/output-guard.d.ts +6 -0
  145. package/dist/core/output-guard.d.ts.map +1 -0
  146. package/dist/core/output-guard.js +59 -0
  147. package/dist/core/output-guard.js.map +1 -0
  148. package/dist/core/package-manager.d.ts +172 -0
  149. package/dist/core/package-manager.d.ts.map +1 -0
  150. package/dist/core/package-manager.js +1801 -0
  151. package/dist/core/package-manager.js.map +1 -0
  152. package/dist/core/prompt-templates.d.ts +51 -0
  153. package/dist/core/prompt-templates.d.ts.map +1 -0
  154. package/dist/core/prompt-templates.js +249 -0
  155. package/dist/core/prompt-templates.js.map +1 -0
  156. package/dist/core/resolve-config-value.d.ts +23 -0
  157. package/dist/core/resolve-config-value.d.ts.map +1 -0
  158. package/dist/core/resolve-config-value.js +126 -0
  159. package/dist/core/resolve-config-value.js.map +1 -0
  160. package/dist/core/resource-loader.d.ts +185 -0
  161. package/dist/core/resource-loader.d.ts.map +1 -0
  162. package/dist/core/resource-loader.js +698 -0
  163. package/dist/core/resource-loader.js.map +1 -0
  164. package/dist/core/sdk.d.ts +90 -0
  165. package/dist/core/sdk.d.ts.map +1 -0
  166. package/dist/core/sdk.js +233 -0
  167. package/dist/core/sdk.js.map +1 -0
  168. package/dist/core/self-update.d.ts +3 -0
  169. package/dist/core/self-update.d.ts.map +1 -0
  170. package/dist/core/self-update.js +46 -0
  171. package/dist/core/self-update.js.map +1 -0
  172. package/dist/core/session-manager.d.ts +329 -0
  173. package/dist/core/session-manager.d.ts.map +1 -0
  174. package/dist/core/session-manager.js +1097 -0
  175. package/dist/core/session-manager.js.map +1 -0
  176. package/dist/core/settings-manager.d.ts +237 -0
  177. package/dist/core/settings-manager.d.ts.map +1 -0
  178. package/dist/core/settings-manager.js +708 -0
  179. package/dist/core/settings-manager.js.map +1 -0
  180. package/dist/core/skills.d.ts +60 -0
  181. package/dist/core/skills.d.ts.map +1 -0
  182. package/dist/core/skills.js +409 -0
  183. package/dist/core/skills.js.map +1 -0
  184. package/dist/core/slash-commands.d.ts +14 -0
  185. package/dist/core/slash-commands.d.ts.map +1 -0
  186. package/dist/core/slash-commands.js +22 -0
  187. package/dist/core/slash-commands.js.map +1 -0
  188. package/dist/core/source-info.d.ts +18 -0
  189. package/dist/core/source-info.d.ts.map +1 -0
  190. package/dist/core/source-info.js +19 -0
  191. package/dist/core/source-info.js.map +1 -0
  192. package/dist/core/system-prompt.d.ts +28 -0
  193. package/dist/core/system-prompt.d.ts.map +1 -0
  194. package/dist/core/system-prompt.js +116 -0
  195. package/dist/core/system-prompt.js.map +1 -0
  196. package/dist/core/timings.d.ts +8 -0
  197. package/dist/core/timings.d.ts.map +1 -0
  198. package/dist/core/timings.js +31 -0
  199. package/dist/core/timings.js.map +1 -0
  200. package/dist/core/tools/bash.d.ts +73 -0
  201. package/dist/core/tools/bash.d.ts.map +1 -0
  202. package/dist/core/tools/bash.js +342 -0
  203. package/dist/core/tools/bash.js.map +1 -0
  204. package/dist/core/tools/edit-diff.d.ts +85 -0
  205. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  206. package/dist/core/tools/edit-diff.js +337 -0
  207. package/dist/core/tools/edit-diff.js.map +1 -0
  208. package/dist/core/tools/edit.d.ts +53 -0
  209. package/dist/core/tools/edit.d.ts.map +1 -0
  210. package/dist/core/tools/edit.js +196 -0
  211. package/dist/core/tools/edit.js.map +1 -0
  212. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  213. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  214. package/dist/core/tools/file-mutation-queue.js +37 -0
  215. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  216. package/dist/core/tools/find.d.ts +46 -0
  217. package/dist/core/tools/find.d.ts.map +1 -0
  218. package/dist/core/tools/find.js +258 -0
  219. package/dist/core/tools/find.js.map +1 -0
  220. package/dist/core/tools/grep.d.ts +56 -0
  221. package/dist/core/tools/grep.d.ts.map +1 -0
  222. package/dist/core/tools/grep.js +293 -0
  223. package/dist/core/tools/grep.js.map +1 -0
  224. package/dist/core/tools/index.d.ts +115 -0
  225. package/dist/core/tools/index.d.ts.map +1 -0
  226. package/dist/core/tools/index.js +86 -0
  227. package/dist/core/tools/index.js.map +1 -0
  228. package/dist/core/tools/ls.d.ts +46 -0
  229. package/dist/core/tools/ls.d.ts.map +1 -0
  230. package/dist/core/tools/ls.js +172 -0
  231. package/dist/core/tools/ls.js.map +1 -0
  232. package/dist/core/tools/path-utils.d.ts +8 -0
  233. package/dist/core/tools/path-utils.d.ts.map +1 -0
  234. package/dist/core/tools/path-utils.js +81 -0
  235. package/dist/core/tools/path-utils.js.map +1 -0
  236. package/dist/core/tools/read.d.ts +46 -0
  237. package/dist/core/tools/read.d.ts.map +1 -0
  238. package/dist/core/tools/read.js +225 -0
  239. package/dist/core/tools/read.js.map +1 -0
  240. package/dist/core/tools/render-utils.d.ts +21 -0
  241. package/dist/core/tools/render-utils.d.ts.map +1 -0
  242. package/dist/core/tools/render-utils.js +49 -0
  243. package/dist/core/tools/render-utils.js.map +1 -0
  244. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  245. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  246. package/dist/core/tools/tool-definition-wrapper.js +32 -0
  247. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  248. package/dist/core/tools/truncate.d.ts +70 -0
  249. package/dist/core/tools/truncate.d.ts.map +1 -0
  250. package/dist/core/tools/truncate.js +205 -0
  251. package/dist/core/tools/truncate.js.map +1 -0
  252. package/dist/core/tools/write.d.ts +35 -0
  253. package/dist/core/tools/write.d.ts.map +1 -0
  254. package/dist/core/tools/write.js +216 -0
  255. package/dist/core/tools/write.js.map +1 -0
  256. package/dist/core/version-check.d.ts +2 -0
  257. package/dist/core/version-check.d.ts.map +1 -0
  258. package/dist/core/version-check.js +73 -0
  259. package/dist/core/version-check.js.map +1 -0
  260. package/dist/index.d.ts +28 -0
  261. package/dist/index.d.ts.map +1 -0
  262. package/dist/index.js +43 -0
  263. package/dist/index.js.map +1 -0
  264. package/dist/main.d.ts +8 -0
  265. package/dist/main.d.ts.map +1 -0
  266. package/dist/main.js +811 -0
  267. package/dist/main.js.map +1 -0
  268. package/dist/migrations.d.ts +32 -0
  269. package/dist/migrations.d.ts.map +1 -0
  270. package/dist/migrations.js +258 -0
  271. package/dist/migrations.js.map +1 -0
  272. package/dist/modes/index.d.ts +9 -0
  273. package/dist/modes/index.d.ts.map +1 -0
  274. package/dist/modes/index.js +8 -0
  275. package/dist/modes/index.js.map +1 -0
  276. package/dist/modes/interactive/components/armin.d.ts +34 -0
  277. package/dist/modes/interactive/components/armin.d.ts.map +1 -0
  278. package/dist/modes/interactive/components/armin.js +333 -0
  279. package/dist/modes/interactive/components/armin.js.map +1 -0
  280. package/dist/modes/interactive/components/assistant-message.d.ts +18 -0
  281. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  282. package/dist/modes/interactive/components/assistant-message.js +107 -0
  283. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  284. package/dist/modes/interactive/components/bash-execution.d.ts +34 -0
  285. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  286. package/dist/modes/interactive/components/bash-execution.js +175 -0
  287. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  288. package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  289. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  290. package/dist/modes/interactive/components/bordered-loader.js +51 -0
  291. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  292. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  293. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  294. package/dist/modes/interactive/components/branch-summary-message.js +44 -0
  295. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  296. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  297. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  298. package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
  299. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  300. package/dist/modes/interactive/components/config-selector.d.ts +71 -0
  301. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  302. package/dist/modes/interactive/components/config-selector.js +479 -0
  303. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  304. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  305. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  306. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  307. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  308. package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  309. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  310. package/dist/modes/interactive/components/custom-editor.js +70 -0
  311. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  312. package/dist/modes/interactive/components/custom-message.d.ts +20 -0
  313. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  314. package/dist/modes/interactive/components/custom-message.js +79 -0
  315. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  316. package/dist/modes/interactive/components/diff.d.ts +12 -0
  317. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  318. package/dist/modes/interactive/components/diff.js +133 -0
  319. package/dist/modes/interactive/components/diff.js.map +1 -0
  320. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  321. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  322. package/dist/modes/interactive/components/dynamic-border.js +21 -0
  323. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  324. package/dist/modes/interactive/components/extension-editor.d.ts +20 -0
  325. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  326. package/dist/modes/interactive/components/extension-editor.js +111 -0
  327. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  328. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  329. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  330. package/dist/modes/interactive/components/extension-input.js +61 -0
  331. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  332. package/dist/modes/interactive/components/extension-selector.d.ts +24 -0
  333. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  334. package/dist/modes/interactive/components/extension-selector.js +78 -0
  335. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  336. package/dist/modes/interactive/components/footer.d.ts +26 -0
  337. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  338. package/dist/modes/interactive/components/footer.js +198 -0
  339. package/dist/modes/interactive/components/footer.js.map +1 -0
  340. package/dist/modes/interactive/components/index.d.ts +31 -0
  341. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  342. package/dist/modes/interactive/components/index.js +32 -0
  343. package/dist/modes/interactive/components/index.js.map +1 -0
  344. package/dist/modes/interactive/components/keybinding-hints.d.ts +8 -0
  345. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  346. package/dist/modes/interactive/components/keybinding-hints.js +22 -0
  347. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  348. package/dist/modes/interactive/components/login-dialog.d.ts +42 -0
  349. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  350. package/dist/modes/interactive/components/login-dialog.js +145 -0
  351. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  352. package/dist/modes/interactive/components/model-selector.d.ts +47 -0
  353. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  354. package/dist/modes/interactive/components/model-selector.js +275 -0
  355. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  356. package/dist/modes/interactive/components/oauth-selector.d.ts +19 -0
  357. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  358. package/dist/modes/interactive/components/oauth-selector.js +97 -0
  359. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  360. package/dist/modes/interactive/components/scoped-models-selector.d.ts +49 -0
  361. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  362. package/dist/modes/interactive/components/scoped-models-selector.js +275 -0
  363. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  364. package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  365. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  366. package/dist/modes/interactive/components/session-selector-search.js +155 -0
  367. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  368. package/dist/modes/interactive/components/session-selector.d.ts +95 -0
  369. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  370. package/dist/modes/interactive/components/session-selector.js +848 -0
  371. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  372. package/dist/modes/interactive/components/settings-selector.d.ts +58 -0
  373. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  374. package/dist/modes/interactive/components/settings-selector.js +301 -0
  375. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  376. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  377. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  378. package/dist/modes/interactive/components/show-images-selector.js +39 -0
  379. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  380. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  381. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  382. package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
  383. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  384. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  385. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  386. package/dist/modes/interactive/components/theme-selector.js +50 -0
  387. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  388. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  389. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  390. package/dist/modes/interactive/components/thinking-selector.js +51 -0
  391. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  392. package/dist/modes/interactive/components/tool-execution.d.ts +58 -0
  393. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  394. package/dist/modes/interactive/components/tool-execution.js +274 -0
  395. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  396. package/dist/modes/interactive/components/tree-selector.d.ts +87 -0
  397. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  398. package/dist/modes/interactive/components/tree-selector.js +1051 -0
  399. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  400. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  401. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  402. package/dist/modes/interactive/components/user-message-selector.js +113 -0
  403. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  404. package/dist/modes/interactive/components/user-message.d.ts +9 -0
  405. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  406. package/dist/modes/interactive/components/user-message.js +28 -0
  407. package/dist/modes/interactive/components/user-message.js.map +1 -0
  408. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  409. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  410. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  411. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  412. package/dist/modes/interactive/interactive-mode.d.ts +311 -0
  413. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  414. package/dist/modes/interactive/interactive-mode.js +3798 -0
  415. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  416. package/dist/modes/interactive/theme/dark.json +85 -0
  417. package/dist/modes/interactive/theme/light.json +84 -0
  418. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  419. package/dist/modes/interactive/theme/theme.d.ts +81 -0
  420. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  421. package/dist/modes/interactive/theme/theme.js +975 -0
  422. package/dist/modes/interactive/theme/theme.js.map +1 -0
  423. package/dist/modes/print-mode.d.ts +28 -0
  424. package/dist/modes/print-mode.d.ts.map +1 -0
  425. package/dist/modes/print-mode.js +107 -0
  426. package/dist/modes/print-mode.js.map +1 -0
  427. package/dist/modes/rpc/jsonl.d.ts +17 -0
  428. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  429. package/dist/modes/rpc/jsonl.js +49 -0
  430. package/dist/modes/rpc/jsonl.js.map +1 -0
  431. package/dist/modes/rpc/rpc-client.d.ts +217 -0
  432. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  433. package/dist/modes/rpc/rpc-client.js +401 -0
  434. package/dist/modes/rpc/rpc-client.js.map +1 -0
  435. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  436. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  437. package/dist/modes/rpc/rpc-mode.js +522 -0
  438. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  439. package/dist/modes/rpc/rpc-types.d.ts +408 -0
  440. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  441. package/dist/modes/rpc/rpc-types.js +8 -0
  442. package/dist/modes/rpc/rpc-types.js.map +1 -0
  443. package/dist/utils/changelog.d.ts +21 -0
  444. package/dist/utils/changelog.d.ts.map +1 -0
  445. package/dist/utils/changelog.js +87 -0
  446. package/dist/utils/changelog.js.map +1 -0
  447. package/dist/utils/child-process.d.ts +11 -0
  448. package/dist/utils/child-process.d.ts.map +1 -0
  449. package/dist/utils/child-process.js +78 -0
  450. package/dist/utils/child-process.js.map +1 -0
  451. package/dist/utils/clipboard-image.d.ts +11 -0
  452. package/dist/utils/clipboard-image.d.ts.map +1 -0
  453. package/dist/utils/clipboard-image.js +245 -0
  454. package/dist/utils/clipboard-image.js.map +1 -0
  455. package/dist/utils/clipboard-native.d.ts +8 -0
  456. package/dist/utils/clipboard-native.d.ts.map +1 -0
  457. package/dist/utils/clipboard-native.js +14 -0
  458. package/dist/utils/clipboard-native.js.map +1 -0
  459. package/dist/utils/clipboard.d.ts +2 -0
  460. package/dist/utils/clipboard.d.ts.map +1 -0
  461. package/dist/utils/clipboard.js +78 -0
  462. package/dist/utils/clipboard.js.map +1 -0
  463. package/dist/utils/exif-orientation.d.ts +5 -0
  464. package/dist/utils/exif-orientation.d.ts.map +1 -0
  465. package/dist/utils/exif-orientation.js +158 -0
  466. package/dist/utils/exif-orientation.js.map +1 -0
  467. package/dist/utils/frontmatter.d.ts +8 -0
  468. package/dist/utils/frontmatter.d.ts.map +1 -0
  469. package/dist/utils/frontmatter.js +26 -0
  470. package/dist/utils/frontmatter.js.map +1 -0
  471. package/dist/utils/git.d.ts +26 -0
  472. package/dist/utils/git.d.ts.map +1 -0
  473. package/dist/utils/git.js +163 -0
  474. package/dist/utils/git.js.map +1 -0
  475. package/dist/utils/image-convert.d.ts +9 -0
  476. package/dist/utils/image-convert.d.ts.map +1 -0
  477. package/dist/utils/image-convert.js +39 -0
  478. package/dist/utils/image-convert.js.map +1 -0
  479. package/dist/utils/image-resize.d.ts +36 -0
  480. package/dist/utils/image-resize.d.ts.map +1 -0
  481. package/dist/utils/image-resize.js +137 -0
  482. package/dist/utils/image-resize.js.map +1 -0
  483. package/dist/utils/mime.d.ts +2 -0
  484. package/dist/utils/mime.d.ts.map +1 -0
  485. package/dist/utils/mime.js +26 -0
  486. package/dist/utils/mime.js.map +1 -0
  487. package/dist/utils/photon.d.ts +21 -0
  488. package/dist/utils/photon.d.ts.map +1 -0
  489. package/dist/utils/photon.js +121 -0
  490. package/dist/utils/photon.js.map +1 -0
  491. package/dist/utils/shell.d.ts +26 -0
  492. package/dist/utils/shell.d.ts.map +1 -0
  493. package/dist/utils/shell.js +186 -0
  494. package/dist/utils/shell.js.map +1 -0
  495. package/dist/utils/sleep.d.ts +5 -0
  496. package/dist/utils/sleep.d.ts.map +1 -0
  497. package/dist/utils/sleep.js +17 -0
  498. package/dist/utils/sleep.js.map +1 -0
  499. package/dist/utils/tools-manager.d.ts +3 -0
  500. package/dist/utils/tools-manager.d.ts.map +1 -0
  501. package/dist/utils/tools-manager.js +252 -0
  502. package/dist/utils/tools-manager.js.map +1 -0
  503. package/docs/compaction.md +394 -0
  504. package/docs/custom-provider.md +327 -0
  505. package/docs/extensions.md +2229 -0
  506. package/docs/images/doom-extension.png +0 -0
  507. package/docs/images/exy.png +0 -0
  508. package/docs/images/interactive-mode.png +0 -0
  509. package/docs/images/tree-view.png +0 -0
  510. package/docs/json.md +82 -0
  511. package/docs/keybindings.md +173 -0
  512. package/docs/models.md +197 -0
  513. package/docs/packages.md +218 -0
  514. package/docs/prompt-templates.md +67 -0
  515. package/docs/providers.md +98 -0
  516. package/docs/release.md +40 -0
  517. package/docs/rpc.md +1377 -0
  518. package/docs/sdk.md +971 -0
  519. package/docs/session.md +412 -0
  520. package/docs/settings.md +149 -0
  521. package/docs/shell-aliases.md +13 -0
  522. package/docs/skills.md +232 -0
  523. package/docs/terminal-setup.md +106 -0
  524. package/docs/termux.md +127 -0
  525. package/docs/themes.md +295 -0
  526. package/docs/tmux.md +61 -0
  527. package/docs/tree.md +228 -0
  528. package/docs/tui.md +887 -0
  529. package/docs/windows.md +17 -0
  530. package/examples/README.md +25 -0
  531. package/examples/extensions/README.md +204 -0
  532. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  533. package/examples/extensions/bash-spawn-hook.ts +30 -0
  534. package/examples/extensions/bookmark.ts +50 -0
  535. package/examples/extensions/built-in-tool-renderer.ts +246 -0
  536. package/examples/extensions/claude-rules.ts +86 -0
  537. package/examples/extensions/commands.ts +72 -0
  538. package/examples/extensions/confirm-destructive.ts +59 -0
  539. package/examples/extensions/custom-compaction.ts +127 -0
  540. package/examples/extensions/custom-footer.ts +64 -0
  541. package/examples/extensions/custom-header.ts +73 -0
  542. package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  543. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  544. package/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
  545. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  546. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  547. package/examples/extensions/dirty-repo-guard.ts +56 -0
  548. package/examples/extensions/doom-overlay/README.md +46 -0
  549. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  550. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  551. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  552. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  553. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  554. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  555. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  556. package/examples/extensions/doom-overlay/index.ts +74 -0
  557. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  558. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  559. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  560. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  561. package/examples/extensions/dynamic-resources/index.ts +15 -0
  562. package/examples/extensions/dynamic-tools.ts +74 -0
  563. package/examples/extensions/event-bus.ts +43 -0
  564. package/examples/extensions/file-trigger.ts +41 -0
  565. package/examples/extensions/git-checkpoint.ts +53 -0
  566. package/examples/extensions/handoff.ts +153 -0
  567. package/examples/extensions/hello.ts +25 -0
  568. package/examples/extensions/hidden-thinking-label.ts +57 -0
  569. package/examples/extensions/inline-bash.ts +94 -0
  570. package/examples/extensions/input-transform.ts +43 -0
  571. package/examples/extensions/interactive-shell.ts +196 -0
  572. package/examples/extensions/mac-system-theme.ts +47 -0
  573. package/examples/extensions/message-renderer.ts +59 -0
  574. package/examples/extensions/minimal-mode.ts +426 -0
  575. package/examples/extensions/modal-editor.ts +85 -0
  576. package/examples/extensions/model-status.ts +31 -0
  577. package/examples/extensions/notify.ts +55 -0
  578. package/examples/extensions/overlay-qa-tests.ts +1348 -0
  579. package/examples/extensions/overlay-test.ts +150 -0
  580. package/examples/extensions/permission-gate.ts +34 -0
  581. package/examples/extensions/pirate.ts +47 -0
  582. package/examples/extensions/plan-mode/README.md +65 -0
  583. package/examples/extensions/plan-mode/index.ts +340 -0
  584. package/examples/extensions/plan-mode/utils.ts +166 -0
  585. package/examples/extensions/preset.ts +397 -0
  586. package/examples/extensions/protected-paths.ts +30 -0
  587. package/examples/extensions/provider-payload.ts +14 -0
  588. package/examples/extensions/qna.ts +122 -0
  589. package/examples/extensions/question.ts +264 -0
  590. package/examples/extensions/questionnaire.ts +427 -0
  591. package/examples/extensions/rainbow-editor.ts +88 -0
  592. package/examples/extensions/reload-runtime.ts +37 -0
  593. package/examples/extensions/rpc-demo.ts +124 -0
  594. package/examples/extensions/sandbox/index.ts +321 -0
  595. package/examples/extensions/sandbox/package.json +19 -0
  596. package/examples/extensions/send-user-message.ts +97 -0
  597. package/examples/extensions/session-name.ts +27 -0
  598. package/examples/extensions/shutdown-command.ts +63 -0
  599. package/examples/extensions/snake.ts +343 -0
  600. package/examples/extensions/space-invaders.ts +560 -0
  601. package/examples/extensions/ssh.ts +220 -0
  602. package/examples/extensions/status-line.ts +40 -0
  603. package/examples/extensions/subagent/README.md +172 -0
  604. package/examples/extensions/subagent/agents/planner.md +37 -0
  605. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  606. package/examples/extensions/subagent/agents/scout.md +50 -0
  607. package/examples/extensions/subagent/agents/worker.md +24 -0
  608. package/examples/extensions/subagent/agents.ts +126 -0
  609. package/examples/extensions/subagent/index.ts +986 -0
  610. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  611. package/examples/extensions/subagent/prompts/implement.md +10 -0
  612. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  613. package/examples/extensions/summarize.ts +206 -0
  614. package/examples/extensions/system-prompt-header.ts +17 -0
  615. package/examples/extensions/timed-confirm.ts +70 -0
  616. package/examples/extensions/titlebar-spinner.ts +58 -0
  617. package/examples/extensions/todo.ts +299 -0
  618. package/examples/extensions/tool-override.ts +144 -0
  619. package/examples/extensions/tools.ts +146 -0
  620. package/examples/extensions/trigger-compact.ts +50 -0
  621. package/examples/extensions/truncated-tool.ts +195 -0
  622. package/examples/extensions/widget-placement.ts +17 -0
  623. package/examples/extensions/with-deps/index.ts +32 -0
  624. package/examples/extensions/with-deps/package.json +22 -0
  625. package/examples/rpc-extension-ui.ts +632 -0
  626. package/examples/sdk/01-minimal.ts +22 -0
  627. package/examples/sdk/02-custom-model.ts +49 -0
  628. package/examples/sdk/03-custom-prompt.ts +55 -0
  629. package/examples/sdk/04-skills.ts +52 -0
  630. package/examples/sdk/05-tools.ts +56 -0
  631. package/examples/sdk/06-extensions.ts +88 -0
  632. package/examples/sdk/07-context-files.ts +40 -0
  633. package/examples/sdk/08-prompt-templates.ts +48 -0
  634. package/examples/sdk/09-api-keys-and-oauth.ts +48 -0
  635. package/examples/sdk/10-settings.ts +51 -0
  636. package/examples/sdk/11-sessions.ts +48 -0
  637. package/examples/sdk/12-full-control.ts +81 -0
  638. package/examples/sdk/README.md +144 -0
  639. package/package.json +95 -0
  640. package/src/bun/cli.ts +5 -0
  641. package/src/cli/args.ts +309 -0
  642. package/src/cli/config-selector.ts +52 -0
  643. package/src/cli/file-processor.ts +100 -0
  644. package/src/cli/initial-message.ts +43 -0
  645. package/src/cli/list-models.ts +104 -0
  646. package/src/cli/session-picker.ts +52 -0
  647. package/src/cli.ts +16 -0
  648. package/src/config.ts +214 -0
  649. package/src/core/agent-session.ts +3279 -0
  650. package/src/core/auth-storage.ts +488 -0
  651. package/src/core/bash-executor.ts +158 -0
  652. package/src/core/compaction/branch-summarization.ts +355 -0
  653. package/src/core/compaction/compaction.ts +823 -0
  654. package/src/core/compaction/index.ts +7 -0
  655. package/src/core/compaction/utils.ts +170 -0
  656. package/src/core/defaults.ts +3 -0
  657. package/src/core/diagnostics.ts +15 -0
  658. package/src/core/event-bus.ts +33 -0
  659. package/src/core/exec.ts +107 -0
  660. package/src/core/export-html/ansi-to-html.ts +258 -0
  661. package/src/core/export-html/index.ts +314 -0
  662. package/src/core/export-html/template.css +1001 -0
  663. package/src/core/export-html/template.html +55 -0
  664. package/src/core/export-html/template.js +1690 -0
  665. package/src/core/export-html/tool-renderer.ts +156 -0
  666. package/src/core/export-html/vendor/highlight.min.js +1213 -0
  667. package/src/core/export-html/vendor/marked.min.js +6 -0
  668. package/src/core/extensions/index.ts +168 -0
  669. package/src/core/extensions/loader.ts +557 -0
  670. package/src/core/extensions/runner.ts +915 -0
  671. package/src/core/extensions/types.ts +1461 -0
  672. package/src/core/extensions/wrapper.ts +27 -0
  673. package/src/core/footer-data-provider.ts +273 -0
  674. package/src/core/index.ts +61 -0
  675. package/src/core/keybindings.ts +302 -0
  676. package/src/core/messages.ts +195 -0
  677. package/src/core/model-registry.ts +766 -0
  678. package/src/core/model-resolver.ts +606 -0
  679. package/src/core/output-guard.ts +74 -0
  680. package/src/core/package-manager.ts +2222 -0
  681. package/src/core/prompt-templates.ts +294 -0
  682. package/src/core/resolve-config-value.ts +142 -0
  683. package/src/core/resource-loader.ts +886 -0
  684. package/src/core/sdk.ts +360 -0
  685. package/src/core/self-update.ts +57 -0
  686. package/src/core/session-manager.ts +1410 -0
  687. package/src/core/settings-manager.ts +973 -0
  688. package/src/core/skills.ts +508 -0
  689. package/src/core/slash-commands.ts +37 -0
  690. package/src/core/source-info.ts +40 -0
  691. package/src/core/system-prompt.ts +168 -0
  692. package/src/core/timings.ts +31 -0
  693. package/src/core/tools/bash.ts +431 -0
  694. package/src/core/tools/edit-diff.ts +445 -0
  695. package/src/core/tools/edit.ts +307 -0
  696. package/src/core/tools/file-mutation-queue.ts +39 -0
  697. package/src/core/tools/find.ts +314 -0
  698. package/src/core/tools/grep.ts +375 -0
  699. package/src/core/tools/index.ts +193 -0
  700. package/src/core/tools/ls.ts +233 -0
  701. package/src/core/tools/path-utils.ts +94 -0
  702. package/src/core/tools/read.ts +269 -0
  703. package/src/core/tools/render-utils.ts +64 -0
  704. package/src/core/tools/tool-definition-wrapper.ts +43 -0
  705. package/src/core/tools/truncate.ts +265 -0
  706. package/src/core/tools/write.ts +285 -0
  707. package/src/core/version-check.ts +85 -0
  708. package/src/index.ts +348 -0
  709. package/src/main.ts +958 -0
  710. package/src/migrations.ts +290 -0
  711. package/src/modes/index.ts +9 -0
  712. package/src/modes/interactive/components/armin.ts +382 -0
  713. package/src/modes/interactive/components/assistant-message.ts +130 -0
  714. package/src/modes/interactive/components/bash-execution.ts +218 -0
  715. package/src/modes/interactive/components/bordered-loader.ts +66 -0
  716. package/src/modes/interactive/components/branch-summary-message.ts +58 -0
  717. package/src/modes/interactive/components/compaction-summary-message.ts +59 -0
  718. package/src/modes/interactive/components/config-selector.ts +592 -0
  719. package/src/modes/interactive/components/countdown-timer.ts +38 -0
  720. package/src/modes/interactive/components/custom-editor.ts +80 -0
  721. package/src/modes/interactive/components/custom-message.ts +99 -0
  722. package/src/modes/interactive/components/diff.ts +147 -0
  723. package/src/modes/interactive/components/dynamic-border.ts +25 -0
  724. package/src/modes/interactive/components/extension-editor.ts +147 -0
  725. package/src/modes/interactive/components/extension-input.ts +87 -0
  726. package/src/modes/interactive/components/extension-selector.ts +107 -0
  727. package/src/modes/interactive/components/footer.ts +216 -0
  728. package/src/modes/interactive/components/index.ts +31 -0
  729. package/src/modes/interactive/components/keybinding-hints.ts +24 -0
  730. package/src/modes/interactive/components/login-dialog.ts +178 -0
  731. package/src/modes/interactive/components/model-selector.ts +328 -0
  732. package/src/modes/interactive/components/oauth-selector.ts +121 -0
  733. package/src/modes/interactive/components/scoped-models-selector.ts +346 -0
  734. package/src/modes/interactive/components/session-selector-search.ts +194 -0
  735. package/src/modes/interactive/components/session-selector.ts +1010 -0
  736. package/src/modes/interactive/components/settings-selector.ts +432 -0
  737. package/src/modes/interactive/components/show-images-selector.ts +50 -0
  738. package/src/modes/interactive/components/skill-invocation-message.ts +55 -0
  739. package/src/modes/interactive/components/theme-selector.ts +67 -0
  740. package/src/modes/interactive/components/thinking-selector.ts +74 -0
  741. package/src/modes/interactive/components/tool-execution.ts +328 -0
  742. package/src/modes/interactive/components/tree-selector.ts +1197 -0
  743. package/src/modes/interactive/components/user-message-selector.ts +143 -0
  744. package/src/modes/interactive/components/user-message.ts +33 -0
  745. package/src/modes/interactive/components/visual-truncate.ts +50 -0
  746. package/src/modes/interactive/interactive-mode.ts +4501 -0
  747. package/src/modes/interactive/theme/dark.json +85 -0
  748. package/src/modes/interactive/theme/light.json +84 -0
  749. package/src/modes/interactive/theme/theme-schema.json +335 -0
  750. package/src/modes/interactive/theme/theme.ts +1137 -0
  751. package/src/modes/print-mode.ts +131 -0
  752. package/src/modes/rpc/jsonl.ts +58 -0
  753. package/src/modes/rpc/rpc-client.ts +505 -0
  754. package/src/modes/rpc/rpc-mode.ts +654 -0
  755. package/src/modes/rpc/rpc-types.ts +262 -0
  756. package/src/utils/changelog.ts +99 -0
  757. package/src/utils/child-process.ts +86 -0
  758. package/src/utils/clipboard-image.ts +300 -0
  759. package/src/utils/clipboard-native.ts +22 -0
  760. package/src/utils/clipboard.ts +81 -0
  761. package/src/utils/exif-orientation.ts +183 -0
  762. package/src/utils/frontmatter.ts +39 -0
  763. package/src/utils/git.ts +192 -0
  764. package/src/utils/image-convert.ts +41 -0
  765. package/src/utils/image-resize.ts +176 -0
  766. package/src/utils/mime.ts +30 -0
  767. package/src/utils/photon.ts +139 -0
  768. package/src/utils/shell.ts +202 -0
  769. package/src/utils/sleep.ts +18 -0
  770. package/src/utils/tools-manager.ts +287 -0
@@ -0,0 +1,606 @@
1
+ /**
2
+ * Model resolution, scoping, and initial selection
3
+ */
4
+
5
+ import type { ThinkingLevel } from "@lenylvt/pi-agent-core";
6
+ import { type Api, type KnownProvider, type Model, modelsAreEqual } from "@lenylvt/pi-ai";
7
+ import chalk from "chalk";
8
+ import { minimatch } from "minimatch";
9
+ import { isValidThinkingLevel } from "../cli/args.js";
10
+ import { DEFAULT_THINKING_LEVEL } from "./defaults.js";
11
+ import type { ModelRegistry } from "./model-registry.js";
12
+
13
+ /** Default model IDs for each known provider */
14
+ export const defaultModelPerProvider: Partial<Record<KnownProvider, string>> = {
15
+ anthropic: "claude-opus-4-6",
16
+ "openai-codex": "gpt-5.4",
17
+ "github-copilot": "gpt-4o",
18
+ openrouter: "openai/gpt-5.1-codex",
19
+ };
20
+
21
+ export interface ScopedModel {
22
+ model: Model<Api>;
23
+ /** Thinking level if explicitly specified in pattern (e.g., "model:high"), undefined otherwise */
24
+ thinkingLevel?: ThinkingLevel;
25
+ }
26
+
27
+ /**
28
+ * Helper to check if a model ID looks like an alias (no date suffix)
29
+ * Dates are typically in format: -20241022 or -20250929
30
+ */
31
+ function isAlias(id: string): boolean {
32
+ // Check if ID ends with -latest
33
+ if (id.endsWith("-latest")) return true;
34
+
35
+ // Check if ID ends with a date pattern (-YYYYMMDD)
36
+ const datePattern = /-\d{8}$/;
37
+ return !datePattern.test(id);
38
+ }
39
+
40
+ /**
41
+ * Find an exact model reference match.
42
+ * Supports either a bare model id or a canonical provider/modelId reference.
43
+ * When matching by bare id, ambiguous matches across providers are rejected.
44
+ */
45
+ export function findExactModelReferenceMatch(
46
+ modelReference: string,
47
+ availableModels: Model<Api>[],
48
+ ): Model<Api> | undefined {
49
+ const trimmedReference = modelReference.trim();
50
+ if (!trimmedReference) {
51
+ return undefined;
52
+ }
53
+
54
+ const normalizedReference = trimmedReference.toLowerCase();
55
+
56
+ const canonicalMatches = availableModels.filter(
57
+ (model) => `${model.provider}/${model.id}`.toLowerCase() === normalizedReference,
58
+ );
59
+ if (canonicalMatches.length === 1) {
60
+ return canonicalMatches[0];
61
+ }
62
+ if (canonicalMatches.length > 1) {
63
+ return undefined;
64
+ }
65
+
66
+ const slashIndex = trimmedReference.indexOf("/");
67
+ if (slashIndex !== -1) {
68
+ const provider = trimmedReference.substring(0, slashIndex).trim();
69
+ const modelId = trimmedReference.substring(slashIndex + 1).trim();
70
+ if (provider && modelId) {
71
+ const providerMatches = availableModels.filter(
72
+ (model) =>
73
+ model.provider.toLowerCase() === provider.toLowerCase() &&
74
+ model.id.toLowerCase() === modelId.toLowerCase(),
75
+ );
76
+ if (providerMatches.length === 1) {
77
+ return providerMatches[0];
78
+ }
79
+ if (providerMatches.length > 1) {
80
+ return undefined;
81
+ }
82
+ }
83
+ }
84
+
85
+ const idMatches = availableModels.filter((model) => model.id.toLowerCase() === normalizedReference);
86
+ return idMatches.length === 1 ? idMatches[0] : undefined;
87
+ }
88
+
89
+ /**
90
+ * Try to match a pattern to a model from the available models list.
91
+ * Returns the matched model or undefined if no match found.
92
+ */
93
+ function tryMatchModel(modelPattern: string, availableModels: Model<Api>[]): Model<Api> | undefined {
94
+ const exactMatch = findExactModelReferenceMatch(modelPattern, availableModels);
95
+ if (exactMatch) {
96
+ return exactMatch;
97
+ }
98
+
99
+ // No exact match - fall back to partial matching
100
+ const matches = availableModels.filter(
101
+ (m) =>
102
+ m.id.toLowerCase().includes(modelPattern.toLowerCase()) ||
103
+ m.name?.toLowerCase().includes(modelPattern.toLowerCase()),
104
+ );
105
+
106
+ if (matches.length === 0) {
107
+ return undefined;
108
+ }
109
+
110
+ // Separate into aliases and dated versions
111
+ const aliases = matches.filter((m) => isAlias(m.id));
112
+ const datedVersions = matches.filter((m) => !isAlias(m.id));
113
+
114
+ if (aliases.length > 0) {
115
+ // Prefer alias - if multiple aliases, pick the one that sorts highest
116
+ aliases.sort((a, b) => b.id.localeCompare(a.id));
117
+ return aliases[0];
118
+ } else {
119
+ // No alias found, pick latest dated version
120
+ datedVersions.sort((a, b) => b.id.localeCompare(a.id));
121
+ return datedVersions[0];
122
+ }
123
+ }
124
+
125
+ export interface ParsedModelResult {
126
+ model: Model<Api> | undefined;
127
+ /** Thinking level if explicitly specified in pattern, undefined otherwise */
128
+ thinkingLevel?: ThinkingLevel;
129
+ warning: string | undefined;
130
+ }
131
+
132
+ function buildFallbackModel(provider: string, modelId: string, availableModels: Model<Api>[]): Model<Api> | undefined {
133
+ const providerModels = availableModels.filter((m) => m.provider === provider);
134
+ if (providerModels.length === 0) return undefined;
135
+
136
+ const defaultId = defaultModelPerProvider[provider as KnownProvider];
137
+ const baseModel = defaultId
138
+ ? (providerModels.find((m) => m.id === defaultId) ?? providerModels[0])
139
+ : providerModels[0];
140
+
141
+ return {
142
+ ...baseModel,
143
+ id: modelId,
144
+ name: modelId,
145
+ };
146
+ }
147
+
148
+ /**
149
+ * Parse a pattern to extract model and thinking level.
150
+ * Handles models with colons in their IDs (e.g., OpenRouter's :exacto suffix).
151
+ *
152
+ * Algorithm:
153
+ * 1. Try to match full pattern as a model
154
+ * 2. If found, return it with "off" thinking level
155
+ * 3. If not found and has colons, split on last colon:
156
+ * - If suffix is valid thinking level, use it and recurse on prefix
157
+ * - If suffix is invalid, warn and recurse on prefix with "off"
158
+ *
159
+ * @internal Exported for testing
160
+ */
161
+ export function parseModelPattern(
162
+ pattern: string,
163
+ availableModels: Model<Api>[],
164
+ options?: { allowInvalidThinkingLevelFallback?: boolean },
165
+ ): ParsedModelResult {
166
+ // Try exact match first
167
+ const exactMatch = tryMatchModel(pattern, availableModels);
168
+ if (exactMatch) {
169
+ return { model: exactMatch, thinkingLevel: undefined, warning: undefined };
170
+ }
171
+
172
+ // No match - try splitting on last colon if present
173
+ const lastColonIndex = pattern.lastIndexOf(":");
174
+ if (lastColonIndex === -1) {
175
+ // No colons, pattern simply doesn't match any model
176
+ return { model: undefined, thinkingLevel: undefined, warning: undefined };
177
+ }
178
+
179
+ const prefix = pattern.substring(0, lastColonIndex);
180
+ const suffix = pattern.substring(lastColonIndex + 1);
181
+
182
+ if (isValidThinkingLevel(suffix)) {
183
+ // Valid thinking level - recurse on prefix and use this level
184
+ const result = parseModelPattern(prefix, availableModels, options);
185
+ if (result.model) {
186
+ // Only use this thinking level if no warning from inner recursion
187
+ return {
188
+ model: result.model,
189
+ thinkingLevel: result.warning ? undefined : suffix,
190
+ warning: result.warning,
191
+ };
192
+ }
193
+ return result;
194
+ } else {
195
+ // Invalid suffix
196
+ const allowFallback = options?.allowInvalidThinkingLevelFallback ?? true;
197
+ if (!allowFallback) {
198
+ // In strict mode (CLI --model parsing), treat it as part of the model id and fail.
199
+ // This avoids accidentally resolving to a different model.
200
+ return { model: undefined, thinkingLevel: undefined, warning: undefined };
201
+ }
202
+
203
+ // Scope mode: recurse on prefix and warn
204
+ const result = parseModelPattern(prefix, availableModels, options);
205
+ if (result.model) {
206
+ return {
207
+ model: result.model,
208
+ thinkingLevel: undefined,
209
+ warning: `Invalid thinking level "${suffix}" in pattern "${pattern}". Using default instead.`,
210
+ };
211
+ }
212
+ return result;
213
+ }
214
+ }
215
+
216
+ /**
217
+ * Resolve model patterns to actual Model objects with optional thinking levels
218
+ * Format: "pattern:level" where :level is optional
219
+ * For each pattern, finds all matching models and picks the best version:
220
+ * 1. Prefer alias (e.g., claude-sonnet-4-5) over dated versions (claude-sonnet-4-5-20250929)
221
+ * 2. If no alias, pick the latest dated version
222
+ *
223
+ * Supports models with colons in their IDs (e.g., OpenRouter's model:exacto).
224
+ * The algorithm tries to match the full pattern first, then progressively
225
+ * strips colon-suffixes to find a match.
226
+ */
227
+ export async function resolveModelScope(patterns: string[], modelRegistry: ModelRegistry): Promise<ScopedModel[]> {
228
+ const availableModels = await modelRegistry.getAvailable();
229
+ const scopedModels: ScopedModel[] = [];
230
+
231
+ for (const pattern of patterns) {
232
+ // Check if pattern contains glob characters
233
+ if (pattern.includes("*") || pattern.includes("?") || pattern.includes("[")) {
234
+ // Extract optional thinking level suffix (e.g., "provider/*:high")
235
+ const colonIdx = pattern.lastIndexOf(":");
236
+ let globPattern = pattern;
237
+ let thinkingLevel: ThinkingLevel | undefined;
238
+
239
+ if (colonIdx !== -1) {
240
+ const suffix = pattern.substring(colonIdx + 1);
241
+ if (isValidThinkingLevel(suffix)) {
242
+ thinkingLevel = suffix;
243
+ globPattern = pattern.substring(0, colonIdx);
244
+ }
245
+ }
246
+
247
+ // Match against "provider/modelId" format OR just model ID
248
+ // This allows "*sonnet*" to match without requiring "anthropic/*sonnet*"
249
+ const matchingModels = availableModels.filter((m) => {
250
+ const fullId = `${m.provider}/${m.id}`;
251
+ return minimatch(fullId, globPattern, { nocase: true }) || minimatch(m.id, globPattern, { nocase: true });
252
+ });
253
+
254
+ if (matchingModels.length === 0) {
255
+ console.warn(chalk.yellow(`Warning: No models match pattern "${pattern}"`));
256
+ continue;
257
+ }
258
+
259
+ for (const model of matchingModels) {
260
+ if (!scopedModels.find((sm) => modelsAreEqual(sm.model, model))) {
261
+ scopedModels.push({ model, thinkingLevel });
262
+ }
263
+ }
264
+ continue;
265
+ }
266
+
267
+ const { model, thinkingLevel, warning } = parseModelPattern(pattern, availableModels);
268
+
269
+ if (warning) {
270
+ console.warn(chalk.yellow(`Warning: ${warning}`));
271
+ }
272
+
273
+ if (!model) {
274
+ console.warn(chalk.yellow(`Warning: No models match pattern "${pattern}"`));
275
+ continue;
276
+ }
277
+
278
+ // Avoid duplicates
279
+ if (!scopedModels.find((sm) => modelsAreEqual(sm.model, model))) {
280
+ scopedModels.push({ model, thinkingLevel });
281
+ }
282
+ }
283
+
284
+ return scopedModels;
285
+ }
286
+
287
+ export interface ResolveCliModelResult {
288
+ model: Model<Api> | undefined;
289
+ thinkingLevel?: ThinkingLevel;
290
+ warning: string | undefined;
291
+ /**
292
+ * Error message suitable for CLI display.
293
+ * When set, model will be undefined.
294
+ */
295
+ error: string | undefined;
296
+ }
297
+
298
+ /**
299
+ * Resolve a single model from CLI flags.
300
+ *
301
+ * Supports:
302
+ * - --provider <provider> --model <pattern>
303
+ * - --model <provider>/<pattern>
304
+ * - Fuzzy matching (same rules as model scoping: exact id, then partial id/name)
305
+ *
306
+ * Note: This does not apply the thinking level by itself, but it may *parse* and
307
+ * return a thinking level from "<pattern>:<thinking>" so the caller can apply it.
308
+ */
309
+ export function resolveCliModel(options: {
310
+ cliProvider?: string;
311
+ cliModel?: string;
312
+ modelRegistry: ModelRegistry;
313
+ }): ResolveCliModelResult {
314
+ const { cliProvider, cliModel, modelRegistry } = options;
315
+
316
+ if (!cliModel) {
317
+ return { model: undefined, warning: undefined, error: undefined };
318
+ }
319
+
320
+ // Important: use *all* models here, not just models with pre-configured auth.
321
+ // This allows "--api-key" to be used for first-time setup.
322
+ const availableModels = modelRegistry.getAll();
323
+ if (availableModels.length === 0) {
324
+ return {
325
+ model: undefined,
326
+ warning: undefined,
327
+ error: "No models available. Check your installation or add models to models.json.",
328
+ };
329
+ }
330
+
331
+ // Build canonical provider lookup (case-insensitive)
332
+ const providerMap = new Map<string, string>();
333
+ for (const m of availableModels) {
334
+ providerMap.set(m.provider.toLowerCase(), m.provider);
335
+ }
336
+
337
+ let provider = cliProvider ? providerMap.get(cliProvider.toLowerCase()) : undefined;
338
+ if (cliProvider && !provider) {
339
+ return {
340
+ model: undefined,
341
+ warning: undefined,
342
+ error: `Unknown provider "${cliProvider}". Use --list-models to see available providers/models.`,
343
+ };
344
+ }
345
+
346
+ // If no explicit --provider, try to interpret "provider/model" format first.
347
+ // When the prefix before the first slash matches a known provider, prefer that
348
+ // interpretation over matching models whose IDs literally contain slashes.
349
+ let pattern = cliModel;
350
+ let inferredProvider = false;
351
+
352
+ if (!provider) {
353
+ const slashIndex = cliModel.indexOf("/");
354
+ if (slashIndex !== -1) {
355
+ const maybeProvider = cliModel.substring(0, slashIndex);
356
+ const canonical = providerMap.get(maybeProvider.toLowerCase());
357
+ if (canonical) {
358
+ provider = canonical;
359
+ pattern = cliModel.substring(slashIndex + 1);
360
+ inferredProvider = true;
361
+ }
362
+ }
363
+ }
364
+
365
+ // If no provider was inferred from the slash, try exact matches without provider inference.
366
+ // This handles models whose IDs naturally contain slashes (e.g. OpenRouter-style IDs).
367
+ if (!provider) {
368
+ const lower = cliModel.toLowerCase();
369
+ const exact = availableModels.find(
370
+ (m) => m.id.toLowerCase() === lower || `${m.provider}/${m.id}`.toLowerCase() === lower,
371
+ );
372
+ if (exact) {
373
+ return { model: exact, warning: undefined, thinkingLevel: undefined, error: undefined };
374
+ }
375
+ }
376
+
377
+ if (cliProvider && provider) {
378
+ // If both were provided, tolerate --model <provider>/<pattern> by stripping the provider prefix
379
+ const prefix = `${provider}/`;
380
+ if (cliModel.toLowerCase().startsWith(prefix.toLowerCase())) {
381
+ pattern = cliModel.substring(prefix.length);
382
+ }
383
+ }
384
+
385
+ const candidates = provider ? availableModels.filter((m) => m.provider === provider) : availableModels;
386
+ const { model, thinkingLevel, warning } = parseModelPattern(pattern, candidates, {
387
+ allowInvalidThinkingLevelFallback: false,
388
+ });
389
+
390
+ if (model) {
391
+ return { model, thinkingLevel, warning, error: undefined };
392
+ }
393
+
394
+ // If we inferred a provider from the slash but found no match within that provider,
395
+ // fall back to matching the full input as a raw model id across all models.
396
+ // This handles OpenRouter-style IDs where the prefix is part of the model id.
397
+ if (inferredProvider) {
398
+ const lower = cliModel.toLowerCase();
399
+ const exact = availableModels.find(
400
+ (m) => m.id.toLowerCase() === lower || `${m.provider}/${m.id}`.toLowerCase() === lower,
401
+ );
402
+ if (exact) {
403
+ return { model: exact, warning: undefined, thinkingLevel: undefined, error: undefined };
404
+ }
405
+ // Also try parseModelPattern on the full input against all models
406
+ const fallback = parseModelPattern(cliModel, availableModels, {
407
+ allowInvalidThinkingLevelFallback: false,
408
+ });
409
+ if (fallback.model) {
410
+ return {
411
+ model: fallback.model,
412
+ thinkingLevel: fallback.thinkingLevel,
413
+ warning: fallback.warning,
414
+ error: undefined,
415
+ };
416
+ }
417
+ }
418
+
419
+ if (provider) {
420
+ const fallbackModel = buildFallbackModel(provider, pattern, availableModels);
421
+ if (fallbackModel) {
422
+ const fallbackWarning = warning
423
+ ? `${warning} Model "${pattern}" not found for provider "${provider}". Using custom model id.`
424
+ : `Model "${pattern}" not found for provider "${provider}". Using custom model id.`;
425
+ return { model: fallbackModel, thinkingLevel: undefined, warning: fallbackWarning, error: undefined };
426
+ }
427
+ }
428
+
429
+ const display = provider ? `${provider}/${pattern}` : cliModel;
430
+ return {
431
+ model: undefined,
432
+ thinkingLevel: undefined,
433
+ warning,
434
+ error: `Model "${display}" not found. Use --list-models to see available models.`,
435
+ };
436
+ }
437
+
438
+ export interface InitialModelResult {
439
+ model: Model<Api> | undefined;
440
+ thinkingLevel: ThinkingLevel;
441
+ fallbackMessage: string | undefined;
442
+ }
443
+
444
+ /**
445
+ * Find the initial model to use based on priority:
446
+ * 1. CLI args (provider + model)
447
+ * 2. First model from scoped models (if not continuing/resuming)
448
+ * 3. Restored from session (if continuing/resuming)
449
+ * 4. Saved default from settings
450
+ * 5. First available model with valid API key
451
+ */
452
+ export async function findInitialModel(options: {
453
+ cliProvider?: string;
454
+ cliModel?: string;
455
+ scopedModels: ScopedModel[];
456
+ isContinuing: boolean;
457
+ defaultProvider?: string;
458
+ defaultModelId?: string;
459
+ defaultThinkingLevel?: ThinkingLevel;
460
+ modelRegistry: ModelRegistry;
461
+ }): Promise<InitialModelResult> {
462
+ const {
463
+ cliProvider,
464
+ cliModel,
465
+ scopedModels,
466
+ isContinuing,
467
+ defaultProvider,
468
+ defaultModelId,
469
+ defaultThinkingLevel,
470
+ modelRegistry,
471
+ } = options;
472
+
473
+ let model: Model<Api> | undefined;
474
+ let thinkingLevel: ThinkingLevel = DEFAULT_THINKING_LEVEL;
475
+
476
+ // 1. CLI args take priority
477
+ if (cliProvider && cliModel) {
478
+ const resolved = resolveCliModel({
479
+ cliProvider,
480
+ cliModel,
481
+ modelRegistry,
482
+ });
483
+ if (resolved.error) {
484
+ console.error(chalk.red(resolved.error));
485
+ process.exit(1);
486
+ }
487
+ if (resolved.model) {
488
+ return { model: resolved.model, thinkingLevel: DEFAULT_THINKING_LEVEL, fallbackMessage: undefined };
489
+ }
490
+ }
491
+
492
+ // 2. Use first model from scoped models (skip if continuing/resuming)
493
+ if (scopedModels.length > 0 && !isContinuing) {
494
+ return {
495
+ model: scopedModels[0].model,
496
+ thinkingLevel: scopedModels[0].thinkingLevel ?? defaultThinkingLevel ?? DEFAULT_THINKING_LEVEL,
497
+ fallbackMessage: undefined,
498
+ };
499
+ }
500
+
501
+ // 3. Try saved default from settings
502
+ if (defaultProvider && defaultModelId) {
503
+ const found = modelRegistry.find(defaultProvider, defaultModelId);
504
+ if (found) {
505
+ model = found;
506
+ if (defaultThinkingLevel) {
507
+ thinkingLevel = defaultThinkingLevel;
508
+ }
509
+ return { model, thinkingLevel, fallbackMessage: undefined };
510
+ }
511
+ }
512
+
513
+ // 4. Try first available model with valid API key
514
+ const availableModels = await modelRegistry.getAvailable();
515
+
516
+ if (availableModels.length > 0) {
517
+ // Try to find a default model from known providers
518
+ for (const provider of Object.keys(defaultModelPerProvider) as KnownProvider[]) {
519
+ const defaultId = defaultModelPerProvider[provider];
520
+ const match = availableModels.find((m) => m.provider === provider && m.id === defaultId);
521
+ if (match) {
522
+ return { model: match, thinkingLevel: DEFAULT_THINKING_LEVEL, fallbackMessage: undefined };
523
+ }
524
+ }
525
+
526
+ // If no default found, use first available
527
+ return { model: availableModels[0], thinkingLevel: DEFAULT_THINKING_LEVEL, fallbackMessage: undefined };
528
+ }
529
+
530
+ // 5. No model found
531
+ return { model: undefined, thinkingLevel: DEFAULT_THINKING_LEVEL, fallbackMessage: undefined };
532
+ }
533
+
534
+ /**
535
+ * Restore model from session, with fallback to available models
536
+ */
537
+ export async function restoreModelFromSession(
538
+ savedProvider: string,
539
+ savedModelId: string,
540
+ currentModel: Model<Api> | undefined,
541
+ shouldPrintMessages: boolean,
542
+ modelRegistry: ModelRegistry,
543
+ ): Promise<{ model: Model<Api> | undefined; fallbackMessage: string | undefined }> {
544
+ const restoredModel = modelRegistry.find(savedProvider, savedModelId);
545
+
546
+ // Check if restored model exists and still has auth configured
547
+ const hasConfiguredAuth = restoredModel ? modelRegistry.hasConfiguredAuth(restoredModel) : false;
548
+
549
+ if (restoredModel && hasConfiguredAuth) {
550
+ if (shouldPrintMessages) {
551
+ console.log(chalk.dim(`Restored model: ${savedProvider}/${savedModelId}`));
552
+ }
553
+ return { model: restoredModel, fallbackMessage: undefined };
554
+ }
555
+
556
+ // Model not found or no API key - fall back
557
+ const reason = !restoredModel ? "model no longer exists" : "no auth configured";
558
+
559
+ if (shouldPrintMessages) {
560
+ console.error(chalk.yellow(`Warning: Could not restore model ${savedProvider}/${savedModelId} (${reason}).`));
561
+ }
562
+
563
+ // If we already have a model, use it as fallback
564
+ if (currentModel) {
565
+ if (shouldPrintMessages) {
566
+ console.log(chalk.dim(`Falling back to: ${currentModel.provider}/${currentModel.id}`));
567
+ }
568
+ return {
569
+ model: currentModel,
570
+ fallbackMessage: `Could not restore model ${savedProvider}/${savedModelId} (${reason}). Using ${currentModel.provider}/${currentModel.id}.`,
571
+ };
572
+ }
573
+
574
+ // Try to find any available model
575
+ const availableModels = await modelRegistry.getAvailable();
576
+
577
+ if (availableModels.length > 0) {
578
+ // Try to find a default model from known providers
579
+ let fallbackModel: Model<Api> | undefined;
580
+ for (const provider of Object.keys(defaultModelPerProvider) as KnownProvider[]) {
581
+ const defaultId = defaultModelPerProvider[provider];
582
+ const match = availableModels.find((m) => m.provider === provider && m.id === defaultId);
583
+ if (match) {
584
+ fallbackModel = match;
585
+ break;
586
+ }
587
+ }
588
+
589
+ // If no default found, use first available
590
+ if (!fallbackModel) {
591
+ fallbackModel = availableModels[0];
592
+ }
593
+
594
+ if (shouldPrintMessages) {
595
+ console.log(chalk.dim(`Falling back to: ${fallbackModel.provider}/${fallbackModel.id}`));
596
+ }
597
+
598
+ return {
599
+ model: fallbackModel,
600
+ fallbackMessage: `Could not restore model ${savedProvider}/${savedModelId} (${reason}). Using ${fallbackModel.provider}/${fallbackModel.id}.`,
601
+ };
602
+ }
603
+
604
+ // No models available
605
+ return { model: undefined, fallbackMessage: undefined };
606
+ }
@@ -0,0 +1,74 @@
1
+ interface StdoutTakeoverState {
2
+ rawStdoutWrite: (chunk: string, callback?: (error?: Error | null) => void) => boolean;
3
+ rawStderrWrite: (chunk: string, callback?: (error?: Error | null) => void) => boolean;
4
+ originalStdoutWrite: typeof process.stdout.write;
5
+ }
6
+
7
+ let stdoutTakeoverState: StdoutTakeoverState | undefined;
8
+
9
+ export function takeOverStdout(): void {
10
+ if (stdoutTakeoverState) {
11
+ return;
12
+ }
13
+
14
+ const rawStdoutWrite = process.stdout.write.bind(process.stdout) as StdoutTakeoverState["rawStdoutWrite"];
15
+ const rawStderrWrite = process.stderr.write.bind(process.stderr) as StdoutTakeoverState["rawStderrWrite"];
16
+ const originalStdoutWrite = process.stdout.write;
17
+
18
+ process.stdout.write = ((
19
+ chunk: string | Uint8Array,
20
+ encodingOrCallback?: BufferEncoding | ((error?: Error | null) => void),
21
+ callback?: (error?: Error | null) => void,
22
+ ): boolean => {
23
+ if (typeof encodingOrCallback === "function") {
24
+ return rawStderrWrite(String(chunk), encodingOrCallback);
25
+ }
26
+ return rawStderrWrite(String(chunk), callback);
27
+ }) as typeof process.stdout.write;
28
+
29
+ stdoutTakeoverState = {
30
+ rawStdoutWrite,
31
+ rawStderrWrite,
32
+ originalStdoutWrite,
33
+ };
34
+ }
35
+
36
+ export function restoreStdout(): void {
37
+ if (!stdoutTakeoverState) {
38
+ return;
39
+ }
40
+
41
+ process.stdout.write = stdoutTakeoverState.originalStdoutWrite;
42
+ stdoutTakeoverState = undefined;
43
+ }
44
+
45
+ export function isStdoutTakenOver(): boolean {
46
+ return stdoutTakeoverState !== undefined;
47
+ }
48
+
49
+ export function writeRawStdout(text: string): void {
50
+ if (stdoutTakeoverState) {
51
+ stdoutTakeoverState.rawStdoutWrite(text);
52
+ return;
53
+ }
54
+ process.stdout.write(text);
55
+ }
56
+
57
+ export async function flushRawStdout(): Promise<void> {
58
+ if (stdoutTakeoverState) {
59
+ await new Promise<void>((resolve, reject) => {
60
+ stdoutTakeoverState?.rawStdoutWrite("", (err) => {
61
+ if (err) reject(err);
62
+ else resolve();
63
+ });
64
+ });
65
+ return;
66
+ }
67
+
68
+ await new Promise<void>((resolve, reject) => {
69
+ process.stdout.write("", (err) => {
70
+ if (err) reject(err);
71
+ else resolve();
72
+ });
73
+ });
74
+ }