@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
package/README.md ADDED
@@ -0,0 +1,95 @@
1
+ # zpi - Memory-Augmented Coding Agent
2
+
3
+ A terminal coding agent with persistent long-term memory that learns from your interactions across sessions.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install -g @imdigitalashish/zpi
9
+ ```
10
+
11
+ ## Setup
12
+
13
+ Authenticate with an API key:
14
+
15
+ ```bash
16
+ export ANTHROPIC_API_KEY=sk-ant-...
17
+ zpi
18
+ ```
19
+
20
+ Or use your existing subscription:
21
+
22
+ ```bash
23
+ zpi
24
+ /login # Then select provider
25
+ ```
26
+
27
+ ## Features
28
+
29
+ - **Persistent Memory System** — procedural, episodic, and semantic memories stored per-project in `.pi/memory/`
30
+ - **Automatic Learning** — the agent detects preferences, workflows, and facts from conversations and saves them automatically
31
+ - **Timestamp Awareness** — the LLM sees when each message was sent and can detect time gaps
32
+ - **Toggle On/Off** — memory system is on by default, disable via `/settings`
33
+
34
+ ## Memory System
35
+
36
+ Memories are stored per-project in `.pi/memory/`:
37
+
38
+ | Type | File | What it stores |
39
+ |------|------|----------------|
40
+ | Procedural | `procedural.json` | Multi-step workflows the user teaches |
41
+ | Episodic | `episodic.json` | Session summaries, mistakes, lessons |
42
+ | Semantic | `semantic.json` | Preferences, rules, facts, conventions |
43
+
44
+ ### Memory Tools (used by the LLM automatically)
45
+
46
+ - `memory_write` — save a new memory
47
+ - `memory_read` — recall memories by type, ID, or search
48
+ - `memory_update` — update an existing memory
49
+ - `memory_delete` — remove a memory
50
+
51
+ ### Memory Commands
52
+
53
+ - `/memory` or `/memory list` — show all memories
54
+ - `/memory show <id>` — show a specific memory
55
+ - `/memory search <query>` — search memories
56
+ - `/memory delete <id>` — delete a memory
57
+ - `/memory compact` — deduplicate and consolidate memories
58
+
59
+ ## Supported Providers
60
+
61
+ | Provider | Auth |
62
+ |----------|------|
63
+ | Anthropic | `ANTHROPIC_API_KEY` or `/login anthropic` |
64
+ | OpenAI | `OPENAI_API_KEY` |
65
+ | Google Gemini | `GOOGLE_GENERATIVE_AI_API_KEY` or `/login google` |
66
+ | AWS Bedrock | `AWS_ACCESS_KEY_ID` + `AWS_SECRET_ACCESS_KEY` |
67
+ | Azure OpenAI | `AZURE_OPENAI_API_KEY` + `AZURE_OPENAI_ENDPOINT` |
68
+ | GitHub Copilot | `/login copilot` |
69
+ | OpenAI-compatible | `OPENAI_API_KEY` + `OPENAI_BASE_URL` |
70
+
71
+ ## Commands
72
+
73
+ | Command | Description |
74
+ |---------|-------------|
75
+ | `/model` | Switch model |
76
+ | `/login` | Authenticate with a provider |
77
+ | `/settings` | Toggle memory, theme, etc. |
78
+ | `/memory` | View/manage memories |
79
+ | `/sessions` | Browse sessions |
80
+ | `/compact` | Compact conversation |
81
+ | `/help` | Show all commands |
82
+
83
+ ## Settings
84
+
85
+ Toggle memory system on/off:
86
+ - Use `/settings` in the TUI
87
+ - Or edit `.pi/settings.json`: `{ "memory": { "enabled": false } }`
88
+
89
+ ## Author
90
+
91
+ [imdigitalashish](https://github.com/imdigitalashish)
92
+
93
+ ## License
94
+
95
+ MIT
@@ -0,0 +1,47 @@
1
+ /**
2
+ * CLI argument parsing and help display
3
+ */
4
+ import type { ThinkingLevel } from "@mariozechner/pi-agent-core";
5
+ import { type ToolName } from "../core/tools/index.js";
6
+ export type Mode = "text" | "json" | "rpc";
7
+ export interface Args {
8
+ provider?: string;
9
+ model?: string;
10
+ apiKey?: string;
11
+ systemPrompt?: string;
12
+ appendSystemPrompt?: string;
13
+ thinking?: ThinkingLevel;
14
+ continue?: boolean;
15
+ resume?: boolean;
16
+ help?: boolean;
17
+ version?: boolean;
18
+ mode?: Mode;
19
+ noSession?: boolean;
20
+ session?: string;
21
+ sessionDir?: string;
22
+ models?: string[];
23
+ tools?: ToolName[];
24
+ noTools?: boolean;
25
+ extensions?: string[];
26
+ noExtensions?: boolean;
27
+ print?: boolean;
28
+ export?: string;
29
+ noSkills?: boolean;
30
+ skills?: string[];
31
+ promptTemplates?: string[];
32
+ noPromptTemplates?: boolean;
33
+ themes?: string[];
34
+ noThemes?: boolean;
35
+ listModels?: string | true;
36
+ verbose?: boolean;
37
+ messages: string[];
38
+ fileArgs: string[];
39
+ /** Unknown flags (potentially extension flags) - map of flag name to value */
40
+ unknownFlags: Map<string, boolean | string>;
41
+ }
42
+ export declare function isValidThinkingLevel(level: string): level is ThinkingLevel;
43
+ export declare function parseArgs(args: string[], extensionFlags?: Map<string, {
44
+ type: "boolean" | "string";
45
+ }>): Args;
46
+ export declare function printHelp(): void;
47
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAGjE,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEjE,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAE3C,MAAM,WAAW,IAAI;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,8EAA8E;IAC9E,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC;CAC5C;AAID,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,aAAa,CAE1E;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,SAAS,GAAG,QAAQ,CAAA;CAAE,CAAC,GAAG,IAAI,CAwH5G;AAED,wBAAgB,SAAS,IAAI,IAAI,CAsIhC","sourcesContent":["/**\r\n * CLI argument parsing and help display\r\n */\r\n\r\nimport type { ThinkingLevel } from \"@mariozechner/pi-agent-core\";\r\nimport chalk from \"chalk\";\r\nimport { APP_NAME, CONFIG_DIR_NAME, ENV_AGENT_DIR } from \"../config.js\";\r\nimport { allTools, type ToolName } from \"../core/tools/index.js\";\r\n\r\nexport type Mode = \"text\" | \"json\" | \"rpc\";\r\n\r\nexport interface Args {\r\n\tprovider?: string;\r\n\tmodel?: string;\r\n\tapiKey?: string;\r\n\tsystemPrompt?: string;\r\n\tappendSystemPrompt?: string;\r\n\tthinking?: ThinkingLevel;\r\n\tcontinue?: boolean;\r\n\tresume?: boolean;\r\n\thelp?: boolean;\r\n\tversion?: boolean;\r\n\tmode?: Mode;\r\n\tnoSession?: boolean;\r\n\tsession?: string;\r\n\tsessionDir?: string;\r\n\tmodels?: string[];\r\n\ttools?: ToolName[];\r\n\tnoTools?: boolean;\r\n\textensions?: string[];\r\n\tnoExtensions?: boolean;\r\n\tprint?: boolean;\r\n\texport?: string;\r\n\tnoSkills?: boolean;\r\n\tskills?: string[];\r\n\tpromptTemplates?: string[];\r\n\tnoPromptTemplates?: boolean;\r\n\tthemes?: string[];\r\n\tnoThemes?: boolean;\r\n\tlistModels?: string | true;\r\n\tverbose?: boolean;\r\n\tmessages: string[];\r\n\tfileArgs: string[];\r\n\t/** Unknown flags (potentially extension flags) - map of flag name to value */\r\n\tunknownFlags: Map<string, boolean | string>;\r\n}\r\n\r\nconst VALID_THINKING_LEVELS = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"] as const;\r\n\r\nexport function isValidThinkingLevel(level: string): level is ThinkingLevel {\r\n\treturn VALID_THINKING_LEVELS.includes(level as ThinkingLevel);\r\n}\r\n\r\nexport function parseArgs(args: string[], extensionFlags?: Map<string, { type: \"boolean\" | \"string\" }>): Args {\r\n\tconst result: Args = {\r\n\t\tmessages: [],\r\n\t\tfileArgs: [],\r\n\t\tunknownFlags: new Map(),\r\n\t};\r\n\r\n\tfor (let i = 0; i < args.length; i++) {\r\n\t\tconst arg = args[i];\r\n\r\n\t\tif (arg === \"--help\" || arg === \"-h\") {\r\n\t\t\tresult.help = true;\r\n\t\t} else if (arg === \"--version\" || arg === \"-v\") {\r\n\t\t\tresult.version = true;\r\n\t\t} else if (arg === \"--mode\" && i + 1 < args.length) {\r\n\t\t\tconst mode = args[++i];\r\n\t\t\tif (mode === \"text\" || mode === \"json\" || mode === \"rpc\") {\r\n\t\t\t\tresult.mode = mode;\r\n\t\t\t}\r\n\t\t} else if (arg === \"--continue\" || arg === \"-c\") {\r\n\t\t\tresult.continue = true;\r\n\t\t} else if (arg === \"--resume\" || arg === \"-r\") {\r\n\t\t\tresult.resume = true;\r\n\t\t} else if (arg === \"--provider\" && i + 1 < args.length) {\r\n\t\t\tresult.provider = args[++i];\r\n\t\t} else if (arg === \"--model\" && i + 1 < args.length) {\r\n\t\t\tresult.model = args[++i];\r\n\t\t} else if (arg === \"--api-key\" && i + 1 < args.length) {\r\n\t\t\tresult.apiKey = args[++i];\r\n\t\t} else if (arg === \"--system-prompt\" && i + 1 < args.length) {\r\n\t\t\tresult.systemPrompt = args[++i];\r\n\t\t} else if (arg === \"--append-system-prompt\" && i + 1 < args.length) {\r\n\t\t\tresult.appendSystemPrompt = args[++i];\r\n\t\t} else if (arg === \"--no-session\") {\r\n\t\t\tresult.noSession = true;\r\n\t\t} else if (arg === \"--session\" && i + 1 < args.length) {\r\n\t\t\tresult.session = args[++i];\r\n\t\t} else if (arg === \"--session-dir\" && i + 1 < args.length) {\r\n\t\t\tresult.sessionDir = args[++i];\r\n\t\t} else if (arg === \"--models\" && i + 1 < args.length) {\r\n\t\t\tresult.models = args[++i].split(\",\").map((s) => s.trim());\r\n\t\t} else if (arg === \"--no-tools\") {\r\n\t\t\tresult.noTools = true;\r\n\t\t} else if (arg === \"--tools\" && i + 1 < args.length) {\r\n\t\t\tconst toolNames = args[++i].split(\",\").map((s) => s.trim());\r\n\t\t\tconst validTools: ToolName[] = [];\r\n\t\t\tfor (const name of toolNames) {\r\n\t\t\t\tif (name in allTools) {\r\n\t\t\t\t\tvalidTools.push(name as ToolName);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.error(\r\n\t\t\t\t\t\tchalk.yellow(`Warning: Unknown tool \"${name}\". Valid tools: ${Object.keys(allTools).join(\", \")}`),\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tresult.tools = validTools;\r\n\t\t} else if (arg === \"--thinking\" && i + 1 < args.length) {\r\n\t\t\tconst level = args[++i];\r\n\t\t\tif (isValidThinkingLevel(level)) {\r\n\t\t\t\tresult.thinking = level;\r\n\t\t\t} else {\r\n\t\t\t\tconsole.error(\r\n\t\t\t\t\tchalk.yellow(\r\n\t\t\t\t\t\t`Warning: Invalid thinking level \"${level}\". Valid values: ${VALID_THINKING_LEVELS.join(\", \")}`,\r\n\t\t\t\t\t),\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t} else if (arg === \"--print\" || arg === \"-p\") {\r\n\t\t\tresult.print = true;\r\n\t\t} else if (arg === \"--export\" && i + 1 < args.length) {\r\n\t\t\tresult.export = args[++i];\r\n\t\t} else if ((arg === \"--extension\" || arg === \"-e\") && i + 1 < args.length) {\r\n\t\t\tresult.extensions = result.extensions ?? [];\r\n\t\t\tresult.extensions.push(args[++i]);\r\n\t\t} else if (arg === \"--no-extensions\" || arg === \"-ne\") {\r\n\t\t\tresult.noExtensions = true;\r\n\t\t} else if (arg === \"--skill\" && i + 1 < args.length) {\r\n\t\t\tresult.skills = result.skills ?? [];\r\n\t\t\tresult.skills.push(args[++i]);\r\n\t\t} else if (arg === \"--prompt-template\" && i + 1 < args.length) {\r\n\t\t\tresult.promptTemplates = result.promptTemplates ?? [];\r\n\t\t\tresult.promptTemplates.push(args[++i]);\r\n\t\t} else if (arg === \"--theme\" && i + 1 < args.length) {\r\n\t\t\tresult.themes = result.themes ?? [];\r\n\t\t\tresult.themes.push(args[++i]);\r\n\t\t} else if (arg === \"--no-skills\" || arg === \"-ns\") {\r\n\t\t\tresult.noSkills = true;\r\n\t\t} else if (arg === \"--no-prompt-templates\" || arg === \"-np\") {\r\n\t\t\tresult.noPromptTemplates = true;\r\n\t\t} else if (arg === \"--no-themes\") {\r\n\t\t\tresult.noThemes = true;\r\n\t\t} else if (arg === \"--list-models\") {\r\n\t\t\t// Check if next arg is a search pattern (not a flag or file arg)\r\n\t\t\tif (i + 1 < args.length && !args[i + 1].startsWith(\"-\") && !args[i + 1].startsWith(\"@\")) {\r\n\t\t\t\tresult.listModels = args[++i];\r\n\t\t\t} else {\r\n\t\t\t\tresult.listModels = true;\r\n\t\t\t}\r\n\t\t} else if (arg === \"--verbose\") {\r\n\t\t\tresult.verbose = true;\r\n\t\t} else if (arg.startsWith(\"@\")) {\r\n\t\t\tresult.fileArgs.push(arg.slice(1)); // Remove @ prefix\r\n\t\t} else if (arg.startsWith(\"--\") && extensionFlags) {\r\n\t\t\t// Check if it's an extension-registered flag\r\n\t\t\tconst flagName = arg.slice(2);\r\n\t\t\tconst extFlag = extensionFlags.get(flagName);\r\n\t\t\tif (extFlag) {\r\n\t\t\t\tif (extFlag.type === \"boolean\") {\r\n\t\t\t\t\tresult.unknownFlags.set(flagName, true);\r\n\t\t\t\t} else if (extFlag.type === \"string\" && i + 1 < args.length) {\r\n\t\t\t\t\tresult.unknownFlags.set(flagName, args[++i]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// Unknown flags without extensionFlags are silently ignored (first pass)\r\n\t\t} else if (!arg.startsWith(\"-\")) {\r\n\t\t\tresult.messages.push(arg);\r\n\t\t}\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n\r\nexport function printHelp(): void {\r\n\tconsole.log(`${chalk.bold(APP_NAME)} - AI coding assistant with read, bash, edit, write tools\r\n\r\n${chalk.bold(\"Usage:\")}\r\n ${APP_NAME} [options] [@files...] [messages...]\r\n\r\n${chalk.bold(\"Commands:\")}\r\n ${APP_NAME} install <source> [-l] Install extension source and add to settings\r\n ${APP_NAME} remove <source> [-l] Remove extension source from settings\r\n ${APP_NAME} update [source] Update installed extensions (skips pinned sources)\r\n ${APP_NAME} list List installed extensions from settings\r\n ${APP_NAME} config Open TUI to enable/disable package resources\r\n ${APP_NAME} <command> --help Show help for install/remove/update/list\r\n\r\n${chalk.bold(\"Options:\")}\r\n --provider <name> Provider name (default: google)\r\n --model <pattern> Model pattern or ID (supports \"provider/id\" and optional \":<thinking>\")\r\n --api-key <key> API key (defaults to env vars)\r\n --system-prompt <text> System prompt (default: coding assistant prompt)\r\n --append-system-prompt <text> Append text or file contents to the system prompt\r\n --mode <mode> Output mode: text (default), json, or rpc\r\n --print, -p Non-interactive mode: process prompt and exit\r\n --continue, -c Continue previous session\r\n --resume, -r Select a session to resume\r\n --session <path> Use specific session file\r\n --session-dir <dir> Directory for session storage and lookup\r\n --no-session Don't save session (ephemeral)\r\n --models <patterns> Comma-separated model patterns for Ctrl+P cycling\r\n Supports globs (anthropic/*, *sonnet*) and fuzzy matching\r\n --no-tools Disable all built-in tools\r\n --tools <tools> Comma-separated list of tools to enable (default: read,bash,edit,write)\r\n Available: read, bash, edit, write, grep, find, ls\r\n --thinking <level> Set thinking level: off, minimal, low, medium, high, xhigh\r\n --extension, -e <path> Load an extension file (can be used multiple times)\r\n --no-extensions, -ne Disable extension discovery (explicit -e paths still work)\r\n --skill <path> Load a skill file or directory (can be used multiple times)\r\n --no-skills, -ns Disable skills discovery and loading\r\n --prompt-template <path> Load a prompt template file or directory (can be used multiple times)\r\n --no-prompt-templates, -np Disable prompt template discovery and loading\r\n --theme <path> Load a theme file or directory (can be used multiple times)\r\n --no-themes Disable theme discovery and loading\r\n --export <file> Export session file to HTML and exit\r\n --list-models [search] List available models (with optional fuzzy search)\r\n --verbose Force verbose startup (overrides quietStartup setting)\r\n --help, -h Show this help\r\n --version, -v Show version number\r\n\r\nExtensions can register additional flags (e.g., --plan from plan-mode extension).\r\n\r\n${chalk.bold(\"Examples:\")}\r\n # Interactive mode\r\n ${APP_NAME}\r\n\r\n # Interactive mode with initial prompt\r\n ${APP_NAME} \"List all .ts files in src/\"\r\n\r\n # Include files in initial message\r\n ${APP_NAME} @prompt.md @image.png \"What color is the sky?\"\r\n\r\n # Non-interactive mode (process and exit)\r\n ${APP_NAME} -p \"List all .ts files in src/\"\r\n\r\n # Multiple messages (interactive)\r\n ${APP_NAME} \"Read package.json\" \"What dependencies do we have?\"\r\n\r\n # Continue previous session\r\n ${APP_NAME} --continue \"What did we discuss?\"\r\n\r\n # Use different model\r\n ${APP_NAME} --provider openai --model gpt-4o-mini \"Help me refactor this code\"\r\n\r\n # Use model with provider prefix (no --provider needed)\r\n ${APP_NAME} --model openai/gpt-4o \"Help me refactor this code\"\r\n\r\n # Use model with thinking level shorthand\r\n ${APP_NAME} --model sonnet:high \"Solve this complex problem\"\r\n\r\n # Limit model cycling to specific models\r\n ${APP_NAME} --models claude-sonnet,claude-haiku,gpt-4o\r\n\r\n # Limit to a specific provider with glob pattern\r\n ${APP_NAME} --models \"github-copilot/*\"\r\n\r\n # Cycle models with fixed thinking levels\r\n ${APP_NAME} --models sonnet:high,haiku:low\r\n\r\n # Start with a specific thinking level\r\n ${APP_NAME} --thinking high \"Solve this complex problem\"\r\n\r\n # Read-only mode (no file modifications possible)\r\n ${APP_NAME} --tools read,grep,find,ls -p \"Review the code in src/\"\r\n\r\n # Export a session file to HTML\r\n ${APP_NAME} --export ~/${CONFIG_DIR_NAME}/agent/sessions/--path--/session.jsonl\r\n ${APP_NAME} --export session.jsonl output.html\r\n\r\n${chalk.bold(\"Environment Variables:\")}\r\n ANTHROPIC_API_KEY - Anthropic Claude API key\r\n ANTHROPIC_OAUTH_TOKEN - Anthropic OAuth token (alternative to API key)\r\n OPENAI_API_KEY - OpenAI GPT API key\r\n AZURE_OPENAI_API_KEY - Azure OpenAI API key\r\n AZURE_OPENAI_BASE_URL - Azure OpenAI base URL (https://{resource}.openai.azure.com/openai/v1)\r\n AZURE_OPENAI_RESOURCE_NAME - Azure OpenAI resource name (alternative to base URL)\r\n AZURE_OPENAI_API_VERSION - Azure OpenAI API version (default: v1)\r\n AZURE_OPENAI_DEPLOYMENT_NAME_MAP - Azure OpenAI model=deployment map (comma-separated)\r\n GEMINI_API_KEY - Google Gemini API key\r\n GROQ_API_KEY - Groq API key\r\n CEREBRAS_API_KEY - Cerebras API key\r\n XAI_API_KEY - xAI Grok API key\r\n OPENROUTER_API_KEY - OpenRouter API key\r\n AI_GATEWAY_API_KEY - Vercel AI Gateway API key\r\n ZAI_API_KEY - ZAI API key\r\n MISTRAL_API_KEY - Mistral API key\r\n MINIMAX_API_KEY - MiniMax API key\r\n KIMI_API_KEY - Kimi For Coding API key\r\n AWS_PROFILE - AWS profile for Amazon Bedrock\r\n AWS_ACCESS_KEY_ID - AWS access key for Amazon Bedrock\r\n AWS_SECRET_ACCESS_KEY - AWS secret key for Amazon Bedrock\r\n AWS_BEARER_TOKEN_BEDROCK - Bedrock API key (bearer token)\r\n AWS_REGION - AWS region for Amazon Bedrock (e.g., us-east-1)\r\n ${ENV_AGENT_DIR.padEnd(32)} - Session storage directory (default: ~/${CONFIG_DIR_NAME}/agent)\r\n PI_PACKAGE_DIR - Override package directory (for Nix/Guix store paths)\r\n PI_SHARE_VIEWER_URL - Base URL for /share command (default: https://pi.dev/session/)\r\n PI_AI_ANTIGRAVITY_VERSION - Override Antigravity User-Agent version (e.g., 1.23.0)\r\n\r\n${chalk.bold(\"Available Tools (default: read, bash, edit, write):\")}\r\n read - Read file contents\r\n bash - Execute bash commands\r\n edit - Edit files with find/replace\r\n write - Write files (creates/overwrites)\r\n grep - Search file contents (read-only, off by default)\r\n find - Find files by glob pattern (read-only, off by default)\r\n ls - List directory contents (read-only, off by default)\r\n`);\r\n}\r\n"]}
@@ -0,0 +1,293 @@
1
+ /**
2
+ * CLI argument parsing and help display
3
+ */
4
+ import chalk from "chalk";
5
+ import { APP_NAME, CONFIG_DIR_NAME, ENV_AGENT_DIR } from "../config.js";
6
+ import { allTools } from "../core/tools/index.js";
7
+ const VALID_THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh"];
8
+ export function isValidThinkingLevel(level) {
9
+ return VALID_THINKING_LEVELS.includes(level);
10
+ }
11
+ export function parseArgs(args, extensionFlags) {
12
+ const result = {
13
+ messages: [],
14
+ fileArgs: [],
15
+ unknownFlags: new Map(),
16
+ };
17
+ for (let i = 0; i < args.length; i++) {
18
+ const arg = args[i];
19
+ if (arg === "--help" || arg === "-h") {
20
+ result.help = true;
21
+ }
22
+ else if (arg === "--version" || arg === "-v") {
23
+ result.version = true;
24
+ }
25
+ else if (arg === "--mode" && i + 1 < args.length) {
26
+ const mode = args[++i];
27
+ if (mode === "text" || mode === "json" || mode === "rpc") {
28
+ result.mode = mode;
29
+ }
30
+ }
31
+ else if (arg === "--continue" || arg === "-c") {
32
+ result.continue = true;
33
+ }
34
+ else if (arg === "--resume" || arg === "-r") {
35
+ result.resume = true;
36
+ }
37
+ else if (arg === "--provider" && i + 1 < args.length) {
38
+ result.provider = args[++i];
39
+ }
40
+ else if (arg === "--model" && i + 1 < args.length) {
41
+ result.model = args[++i];
42
+ }
43
+ else if (arg === "--api-key" && i + 1 < args.length) {
44
+ result.apiKey = args[++i];
45
+ }
46
+ else if (arg === "--system-prompt" && i + 1 < args.length) {
47
+ result.systemPrompt = args[++i];
48
+ }
49
+ else if (arg === "--append-system-prompt" && i + 1 < args.length) {
50
+ result.appendSystemPrompt = args[++i];
51
+ }
52
+ else if (arg === "--no-session") {
53
+ result.noSession = true;
54
+ }
55
+ else if (arg === "--session" && i + 1 < args.length) {
56
+ result.session = args[++i];
57
+ }
58
+ else if (arg === "--session-dir" && i + 1 < args.length) {
59
+ result.sessionDir = args[++i];
60
+ }
61
+ else if (arg === "--models" && i + 1 < args.length) {
62
+ result.models = args[++i].split(",").map((s) => s.trim());
63
+ }
64
+ else if (arg === "--no-tools") {
65
+ result.noTools = true;
66
+ }
67
+ else if (arg === "--tools" && i + 1 < args.length) {
68
+ const toolNames = args[++i].split(",").map((s) => s.trim());
69
+ const validTools = [];
70
+ for (const name of toolNames) {
71
+ if (name in allTools) {
72
+ validTools.push(name);
73
+ }
74
+ else {
75
+ console.error(chalk.yellow(`Warning: Unknown tool "${name}". Valid tools: ${Object.keys(allTools).join(", ")}`));
76
+ }
77
+ }
78
+ result.tools = validTools;
79
+ }
80
+ else if (arg === "--thinking" && i + 1 < args.length) {
81
+ const level = args[++i];
82
+ if (isValidThinkingLevel(level)) {
83
+ result.thinking = level;
84
+ }
85
+ else {
86
+ console.error(chalk.yellow(`Warning: Invalid thinking level "${level}". Valid values: ${VALID_THINKING_LEVELS.join(", ")}`));
87
+ }
88
+ }
89
+ else if (arg === "--print" || arg === "-p") {
90
+ result.print = true;
91
+ }
92
+ else if (arg === "--export" && i + 1 < args.length) {
93
+ result.export = args[++i];
94
+ }
95
+ else if ((arg === "--extension" || arg === "-e") && i + 1 < args.length) {
96
+ result.extensions = result.extensions ?? [];
97
+ result.extensions.push(args[++i]);
98
+ }
99
+ else if (arg === "--no-extensions" || arg === "-ne") {
100
+ result.noExtensions = true;
101
+ }
102
+ else if (arg === "--skill" && i + 1 < args.length) {
103
+ result.skills = result.skills ?? [];
104
+ result.skills.push(args[++i]);
105
+ }
106
+ else if (arg === "--prompt-template" && i + 1 < args.length) {
107
+ result.promptTemplates = result.promptTemplates ?? [];
108
+ result.promptTemplates.push(args[++i]);
109
+ }
110
+ else if (arg === "--theme" && i + 1 < args.length) {
111
+ result.themes = result.themes ?? [];
112
+ result.themes.push(args[++i]);
113
+ }
114
+ else if (arg === "--no-skills" || arg === "-ns") {
115
+ result.noSkills = true;
116
+ }
117
+ else if (arg === "--no-prompt-templates" || arg === "-np") {
118
+ result.noPromptTemplates = true;
119
+ }
120
+ else if (arg === "--no-themes") {
121
+ result.noThemes = true;
122
+ }
123
+ else if (arg === "--list-models") {
124
+ // Check if next arg is a search pattern (not a flag or file arg)
125
+ if (i + 1 < args.length && !args[i + 1].startsWith("-") && !args[i + 1].startsWith("@")) {
126
+ result.listModels = args[++i];
127
+ }
128
+ else {
129
+ result.listModels = true;
130
+ }
131
+ }
132
+ else if (arg === "--verbose") {
133
+ result.verbose = true;
134
+ }
135
+ else if (arg.startsWith("@")) {
136
+ result.fileArgs.push(arg.slice(1)); // Remove @ prefix
137
+ }
138
+ else if (arg.startsWith("--") && extensionFlags) {
139
+ // Check if it's an extension-registered flag
140
+ const flagName = arg.slice(2);
141
+ const extFlag = extensionFlags.get(flagName);
142
+ if (extFlag) {
143
+ if (extFlag.type === "boolean") {
144
+ result.unknownFlags.set(flagName, true);
145
+ }
146
+ else if (extFlag.type === "string" && i + 1 < args.length) {
147
+ result.unknownFlags.set(flagName, args[++i]);
148
+ }
149
+ }
150
+ // Unknown flags without extensionFlags are silently ignored (first pass)
151
+ }
152
+ else if (!arg.startsWith("-")) {
153
+ result.messages.push(arg);
154
+ }
155
+ }
156
+ return result;
157
+ }
158
+ export function printHelp() {
159
+ console.log(`${chalk.bold(APP_NAME)} - AI coding assistant with read, bash, edit, write tools
160
+
161
+ ${chalk.bold("Usage:")}
162
+ ${APP_NAME} [options] [@files...] [messages...]
163
+
164
+ ${chalk.bold("Commands:")}
165
+ ${APP_NAME} install <source> [-l] Install extension source and add to settings
166
+ ${APP_NAME} remove <source> [-l] Remove extension source from settings
167
+ ${APP_NAME} update [source] Update installed extensions (skips pinned sources)
168
+ ${APP_NAME} list List installed extensions from settings
169
+ ${APP_NAME} config Open TUI to enable/disable package resources
170
+ ${APP_NAME} <command> --help Show help for install/remove/update/list
171
+
172
+ ${chalk.bold("Options:")}
173
+ --provider <name> Provider name (default: google)
174
+ --model <pattern> Model pattern or ID (supports "provider/id" and optional ":<thinking>")
175
+ --api-key <key> API key (defaults to env vars)
176
+ --system-prompt <text> System prompt (default: coding assistant prompt)
177
+ --append-system-prompt <text> Append text or file contents to the system prompt
178
+ --mode <mode> Output mode: text (default), json, or rpc
179
+ --print, -p Non-interactive mode: process prompt and exit
180
+ --continue, -c Continue previous session
181
+ --resume, -r Select a session to resume
182
+ --session <path> Use specific session file
183
+ --session-dir <dir> Directory for session storage and lookup
184
+ --no-session Don't save session (ephemeral)
185
+ --models <patterns> Comma-separated model patterns for Ctrl+P cycling
186
+ Supports globs (anthropic/*, *sonnet*) and fuzzy matching
187
+ --no-tools Disable all built-in tools
188
+ --tools <tools> Comma-separated list of tools to enable (default: read,bash,edit,write)
189
+ Available: read, bash, edit, write, grep, find, ls
190
+ --thinking <level> Set thinking level: off, minimal, low, medium, high, xhigh
191
+ --extension, -e <path> Load an extension file (can be used multiple times)
192
+ --no-extensions, -ne Disable extension discovery (explicit -e paths still work)
193
+ --skill <path> Load a skill file or directory (can be used multiple times)
194
+ --no-skills, -ns Disable skills discovery and loading
195
+ --prompt-template <path> Load a prompt template file or directory (can be used multiple times)
196
+ --no-prompt-templates, -np Disable prompt template discovery and loading
197
+ --theme <path> Load a theme file or directory (can be used multiple times)
198
+ --no-themes Disable theme discovery and loading
199
+ --export <file> Export session file to HTML and exit
200
+ --list-models [search] List available models (with optional fuzzy search)
201
+ --verbose Force verbose startup (overrides quietStartup setting)
202
+ --help, -h Show this help
203
+ --version, -v Show version number
204
+
205
+ Extensions can register additional flags (e.g., --plan from plan-mode extension).
206
+
207
+ ${chalk.bold("Examples:")}
208
+ # Interactive mode
209
+ ${APP_NAME}
210
+
211
+ # Interactive mode with initial prompt
212
+ ${APP_NAME} "List all .ts files in src/"
213
+
214
+ # Include files in initial message
215
+ ${APP_NAME} @prompt.md @image.png "What color is the sky?"
216
+
217
+ # Non-interactive mode (process and exit)
218
+ ${APP_NAME} -p "List all .ts files in src/"
219
+
220
+ # Multiple messages (interactive)
221
+ ${APP_NAME} "Read package.json" "What dependencies do we have?"
222
+
223
+ # Continue previous session
224
+ ${APP_NAME} --continue "What did we discuss?"
225
+
226
+ # Use different model
227
+ ${APP_NAME} --provider openai --model gpt-4o-mini "Help me refactor this code"
228
+
229
+ # Use model with provider prefix (no --provider needed)
230
+ ${APP_NAME} --model openai/gpt-4o "Help me refactor this code"
231
+
232
+ # Use model with thinking level shorthand
233
+ ${APP_NAME} --model sonnet:high "Solve this complex problem"
234
+
235
+ # Limit model cycling to specific models
236
+ ${APP_NAME} --models claude-sonnet,claude-haiku,gpt-4o
237
+
238
+ # Limit to a specific provider with glob pattern
239
+ ${APP_NAME} --models "github-copilot/*"
240
+
241
+ # Cycle models with fixed thinking levels
242
+ ${APP_NAME} --models sonnet:high,haiku:low
243
+
244
+ # Start with a specific thinking level
245
+ ${APP_NAME} --thinking high "Solve this complex problem"
246
+
247
+ # Read-only mode (no file modifications possible)
248
+ ${APP_NAME} --tools read,grep,find,ls -p "Review the code in src/"
249
+
250
+ # Export a session file to HTML
251
+ ${APP_NAME} --export ~/${CONFIG_DIR_NAME}/agent/sessions/--path--/session.jsonl
252
+ ${APP_NAME} --export session.jsonl output.html
253
+
254
+ ${chalk.bold("Environment Variables:")}
255
+ ANTHROPIC_API_KEY - Anthropic Claude API key
256
+ ANTHROPIC_OAUTH_TOKEN - Anthropic OAuth token (alternative to API key)
257
+ OPENAI_API_KEY - OpenAI GPT API key
258
+ AZURE_OPENAI_API_KEY - Azure OpenAI API key
259
+ AZURE_OPENAI_BASE_URL - Azure OpenAI base URL (https://{resource}.openai.azure.com/openai/v1)
260
+ AZURE_OPENAI_RESOURCE_NAME - Azure OpenAI resource name (alternative to base URL)
261
+ AZURE_OPENAI_API_VERSION - Azure OpenAI API version (default: v1)
262
+ AZURE_OPENAI_DEPLOYMENT_NAME_MAP - Azure OpenAI model=deployment map (comma-separated)
263
+ GEMINI_API_KEY - Google Gemini API key
264
+ GROQ_API_KEY - Groq API key
265
+ CEREBRAS_API_KEY - Cerebras API key
266
+ XAI_API_KEY - xAI Grok API key
267
+ OPENROUTER_API_KEY - OpenRouter API key
268
+ AI_GATEWAY_API_KEY - Vercel AI Gateway API key
269
+ ZAI_API_KEY - ZAI API key
270
+ MISTRAL_API_KEY - Mistral API key
271
+ MINIMAX_API_KEY - MiniMax API key
272
+ KIMI_API_KEY - Kimi For Coding API key
273
+ AWS_PROFILE - AWS profile for Amazon Bedrock
274
+ AWS_ACCESS_KEY_ID - AWS access key for Amazon Bedrock
275
+ AWS_SECRET_ACCESS_KEY - AWS secret key for Amazon Bedrock
276
+ AWS_BEARER_TOKEN_BEDROCK - Bedrock API key (bearer token)
277
+ AWS_REGION - AWS region for Amazon Bedrock (e.g., us-east-1)
278
+ ${ENV_AGENT_DIR.padEnd(32)} - Session storage directory (default: ~/${CONFIG_DIR_NAME}/agent)
279
+ PI_PACKAGE_DIR - Override package directory (for Nix/Guix store paths)
280
+ PI_SHARE_VIEWER_URL - Base URL for /share command (default: https://pi.dev/session/)
281
+ PI_AI_ANTIGRAVITY_VERSION - Override Antigravity User-Agent version (e.g., 1.23.0)
282
+
283
+ ${chalk.bold("Available Tools (default: read, bash, edit, write):")}
284
+ read - Read file contents
285
+ bash - Execute bash commands
286
+ edit - Edit files with find/replace
287
+ write - Write files (creates/overwrites)
288
+ grep - Search file contents (read-only, off by default)
289
+ find - Find files by glob pattern (read-only, off by default)
290
+ ls - List directory contents (read-only, off by default)
291
+ `);
292
+ }
293
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * CLI argument parsing and help display\r\n */\r\n\r\nimport type { ThinkingLevel } from \"@mariozechner/pi-agent-core\";\r\nimport chalk from \"chalk\";\r\nimport { APP_NAME, CONFIG_DIR_NAME, ENV_AGENT_DIR } from \"../config.js\";\r\nimport { allTools, type ToolName } from \"../core/tools/index.js\";\r\n\r\nexport type Mode = \"text\" | \"json\" | \"rpc\";\r\n\r\nexport interface Args {\r\n\tprovider?: string;\r\n\tmodel?: string;\r\n\tapiKey?: string;\r\n\tsystemPrompt?: string;\r\n\tappendSystemPrompt?: string;\r\n\tthinking?: ThinkingLevel;\r\n\tcontinue?: boolean;\r\n\tresume?: boolean;\r\n\thelp?: boolean;\r\n\tversion?: boolean;\r\n\tmode?: Mode;\r\n\tnoSession?: boolean;\r\n\tsession?: string;\r\n\tsessionDir?: string;\r\n\tmodels?: string[];\r\n\ttools?: ToolName[];\r\n\tnoTools?: boolean;\r\n\textensions?: string[];\r\n\tnoExtensions?: boolean;\r\n\tprint?: boolean;\r\n\texport?: string;\r\n\tnoSkills?: boolean;\r\n\tskills?: string[];\r\n\tpromptTemplates?: string[];\r\n\tnoPromptTemplates?: boolean;\r\n\tthemes?: string[];\r\n\tnoThemes?: boolean;\r\n\tlistModels?: string | true;\r\n\tverbose?: boolean;\r\n\tmessages: string[];\r\n\tfileArgs: string[];\r\n\t/** Unknown flags (potentially extension flags) - map of flag name to value */\r\n\tunknownFlags: Map<string, boolean | string>;\r\n}\r\n\r\nconst VALID_THINKING_LEVELS = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"] as const;\r\n\r\nexport function isValidThinkingLevel(level: string): level is ThinkingLevel {\r\n\treturn VALID_THINKING_LEVELS.includes(level as ThinkingLevel);\r\n}\r\n\r\nexport function parseArgs(args: string[], extensionFlags?: Map<string, { type: \"boolean\" | \"string\" }>): Args {\r\n\tconst result: Args = {\r\n\t\tmessages: [],\r\n\t\tfileArgs: [],\r\n\t\tunknownFlags: new Map(),\r\n\t};\r\n\r\n\tfor (let i = 0; i < args.length; i++) {\r\n\t\tconst arg = args[i];\r\n\r\n\t\tif (arg === \"--help\" || arg === \"-h\") {\r\n\t\t\tresult.help = true;\r\n\t\t} else if (arg === \"--version\" || arg === \"-v\") {\r\n\t\t\tresult.version = true;\r\n\t\t} else if (arg === \"--mode\" && i + 1 < args.length) {\r\n\t\t\tconst mode = args[++i];\r\n\t\t\tif (mode === \"text\" || mode === \"json\" || mode === \"rpc\") {\r\n\t\t\t\tresult.mode = mode;\r\n\t\t\t}\r\n\t\t} else if (arg === \"--continue\" || arg === \"-c\") {\r\n\t\t\tresult.continue = true;\r\n\t\t} else if (arg === \"--resume\" || arg === \"-r\") {\r\n\t\t\tresult.resume = true;\r\n\t\t} else if (arg === \"--provider\" && i + 1 < args.length) {\r\n\t\t\tresult.provider = args[++i];\r\n\t\t} else if (arg === \"--model\" && i + 1 < args.length) {\r\n\t\t\tresult.model = args[++i];\r\n\t\t} else if (arg === \"--api-key\" && i + 1 < args.length) {\r\n\t\t\tresult.apiKey = args[++i];\r\n\t\t} else if (arg === \"--system-prompt\" && i + 1 < args.length) {\r\n\t\t\tresult.systemPrompt = args[++i];\r\n\t\t} else if (arg === \"--append-system-prompt\" && i + 1 < args.length) {\r\n\t\t\tresult.appendSystemPrompt = args[++i];\r\n\t\t} else if (arg === \"--no-session\") {\r\n\t\t\tresult.noSession = true;\r\n\t\t} else if (arg === \"--session\" && i + 1 < args.length) {\r\n\t\t\tresult.session = args[++i];\r\n\t\t} else if (arg === \"--session-dir\" && i + 1 < args.length) {\r\n\t\t\tresult.sessionDir = args[++i];\r\n\t\t} else if (arg === \"--models\" && i + 1 < args.length) {\r\n\t\t\tresult.models = args[++i].split(\",\").map((s) => s.trim());\r\n\t\t} else if (arg === \"--no-tools\") {\r\n\t\t\tresult.noTools = true;\r\n\t\t} else if (arg === \"--tools\" && i + 1 < args.length) {\r\n\t\t\tconst toolNames = args[++i].split(\",\").map((s) => s.trim());\r\n\t\t\tconst validTools: ToolName[] = [];\r\n\t\t\tfor (const name of toolNames) {\r\n\t\t\t\tif (name in allTools) {\r\n\t\t\t\t\tvalidTools.push(name as ToolName);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.error(\r\n\t\t\t\t\t\tchalk.yellow(`Warning: Unknown tool \"${name}\". Valid tools: ${Object.keys(allTools).join(\", \")}`),\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tresult.tools = validTools;\r\n\t\t} else if (arg === \"--thinking\" && i + 1 < args.length) {\r\n\t\t\tconst level = args[++i];\r\n\t\t\tif (isValidThinkingLevel(level)) {\r\n\t\t\t\tresult.thinking = level;\r\n\t\t\t} else {\r\n\t\t\t\tconsole.error(\r\n\t\t\t\t\tchalk.yellow(\r\n\t\t\t\t\t\t`Warning: Invalid thinking level \"${level}\". Valid values: ${VALID_THINKING_LEVELS.join(\", \")}`,\r\n\t\t\t\t\t),\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t} else if (arg === \"--print\" || arg === \"-p\") {\r\n\t\t\tresult.print = true;\r\n\t\t} else if (arg === \"--export\" && i + 1 < args.length) {\r\n\t\t\tresult.export = args[++i];\r\n\t\t} else if ((arg === \"--extension\" || arg === \"-e\") && i + 1 < args.length) {\r\n\t\t\tresult.extensions = result.extensions ?? [];\r\n\t\t\tresult.extensions.push(args[++i]);\r\n\t\t} else if (arg === \"--no-extensions\" || arg === \"-ne\") {\r\n\t\t\tresult.noExtensions = true;\r\n\t\t} else if (arg === \"--skill\" && i + 1 < args.length) {\r\n\t\t\tresult.skills = result.skills ?? [];\r\n\t\t\tresult.skills.push(args[++i]);\r\n\t\t} else if (arg === \"--prompt-template\" && i + 1 < args.length) {\r\n\t\t\tresult.promptTemplates = result.promptTemplates ?? [];\r\n\t\t\tresult.promptTemplates.push(args[++i]);\r\n\t\t} else if (arg === \"--theme\" && i + 1 < args.length) {\r\n\t\t\tresult.themes = result.themes ?? [];\r\n\t\t\tresult.themes.push(args[++i]);\r\n\t\t} else if (arg === \"--no-skills\" || arg === \"-ns\") {\r\n\t\t\tresult.noSkills = true;\r\n\t\t} else if (arg === \"--no-prompt-templates\" || arg === \"-np\") {\r\n\t\t\tresult.noPromptTemplates = true;\r\n\t\t} else if (arg === \"--no-themes\") {\r\n\t\t\tresult.noThemes = true;\r\n\t\t} else if (arg === \"--list-models\") {\r\n\t\t\t// Check if next arg is a search pattern (not a flag or file arg)\r\n\t\t\tif (i + 1 < args.length && !args[i + 1].startsWith(\"-\") && !args[i + 1].startsWith(\"@\")) {\r\n\t\t\t\tresult.listModels = args[++i];\r\n\t\t\t} else {\r\n\t\t\t\tresult.listModels = true;\r\n\t\t\t}\r\n\t\t} else if (arg === \"--verbose\") {\r\n\t\t\tresult.verbose = true;\r\n\t\t} else if (arg.startsWith(\"@\")) {\r\n\t\t\tresult.fileArgs.push(arg.slice(1)); // Remove @ prefix\r\n\t\t} else if (arg.startsWith(\"--\") && extensionFlags) {\r\n\t\t\t// Check if it's an extension-registered flag\r\n\t\t\tconst flagName = arg.slice(2);\r\n\t\t\tconst extFlag = extensionFlags.get(flagName);\r\n\t\t\tif (extFlag) {\r\n\t\t\t\tif (extFlag.type === \"boolean\") {\r\n\t\t\t\t\tresult.unknownFlags.set(flagName, true);\r\n\t\t\t\t} else if (extFlag.type === \"string\" && i + 1 < args.length) {\r\n\t\t\t\t\tresult.unknownFlags.set(flagName, args[++i]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// Unknown flags without extensionFlags are silently ignored (first pass)\r\n\t\t} else if (!arg.startsWith(\"-\")) {\r\n\t\t\tresult.messages.push(arg);\r\n\t\t}\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n\r\nexport function printHelp(): void {\r\n\tconsole.log(`${chalk.bold(APP_NAME)} - AI coding assistant with read, bash, edit, write tools\r\n\r\n${chalk.bold(\"Usage:\")}\r\n ${APP_NAME} [options] [@files...] [messages...]\r\n\r\n${chalk.bold(\"Commands:\")}\r\n ${APP_NAME} install <source> [-l] Install extension source and add to settings\r\n ${APP_NAME} remove <source> [-l] Remove extension source from settings\r\n ${APP_NAME} update [source] Update installed extensions (skips pinned sources)\r\n ${APP_NAME} list List installed extensions from settings\r\n ${APP_NAME} config Open TUI to enable/disable package resources\r\n ${APP_NAME} <command> --help Show help for install/remove/update/list\r\n\r\n${chalk.bold(\"Options:\")}\r\n --provider <name> Provider name (default: google)\r\n --model <pattern> Model pattern or ID (supports \"provider/id\" and optional \":<thinking>\")\r\n --api-key <key> API key (defaults to env vars)\r\n --system-prompt <text> System prompt (default: coding assistant prompt)\r\n --append-system-prompt <text> Append text or file contents to the system prompt\r\n --mode <mode> Output mode: text (default), json, or rpc\r\n --print, -p Non-interactive mode: process prompt and exit\r\n --continue, -c Continue previous session\r\n --resume, -r Select a session to resume\r\n --session <path> Use specific session file\r\n --session-dir <dir> Directory for session storage and lookup\r\n --no-session Don't save session (ephemeral)\r\n --models <patterns> Comma-separated model patterns for Ctrl+P cycling\r\n Supports globs (anthropic/*, *sonnet*) and fuzzy matching\r\n --no-tools Disable all built-in tools\r\n --tools <tools> Comma-separated list of tools to enable (default: read,bash,edit,write)\r\n Available: read, bash, edit, write, grep, find, ls\r\n --thinking <level> Set thinking level: off, minimal, low, medium, high, xhigh\r\n --extension, -e <path> Load an extension file (can be used multiple times)\r\n --no-extensions, -ne Disable extension discovery (explicit -e paths still work)\r\n --skill <path> Load a skill file or directory (can be used multiple times)\r\n --no-skills, -ns Disable skills discovery and loading\r\n --prompt-template <path> Load a prompt template file or directory (can be used multiple times)\r\n --no-prompt-templates, -np Disable prompt template discovery and loading\r\n --theme <path> Load a theme file or directory (can be used multiple times)\r\n --no-themes Disable theme discovery and loading\r\n --export <file> Export session file to HTML and exit\r\n --list-models [search] List available models (with optional fuzzy search)\r\n --verbose Force verbose startup (overrides quietStartup setting)\r\n --help, -h Show this help\r\n --version, -v Show version number\r\n\r\nExtensions can register additional flags (e.g., --plan from plan-mode extension).\r\n\r\n${chalk.bold(\"Examples:\")}\r\n # Interactive mode\r\n ${APP_NAME}\r\n\r\n # Interactive mode with initial prompt\r\n ${APP_NAME} \"List all .ts files in src/\"\r\n\r\n # Include files in initial message\r\n ${APP_NAME} @prompt.md @image.png \"What color is the sky?\"\r\n\r\n # Non-interactive mode (process and exit)\r\n ${APP_NAME} -p \"List all .ts files in src/\"\r\n\r\n # Multiple messages (interactive)\r\n ${APP_NAME} \"Read package.json\" \"What dependencies do we have?\"\r\n\r\n # Continue previous session\r\n ${APP_NAME} --continue \"What did we discuss?\"\r\n\r\n # Use different model\r\n ${APP_NAME} --provider openai --model gpt-4o-mini \"Help me refactor this code\"\r\n\r\n # Use model with provider prefix (no --provider needed)\r\n ${APP_NAME} --model openai/gpt-4o \"Help me refactor this code\"\r\n\r\n # Use model with thinking level shorthand\r\n ${APP_NAME} --model sonnet:high \"Solve this complex problem\"\r\n\r\n # Limit model cycling to specific models\r\n ${APP_NAME} --models claude-sonnet,claude-haiku,gpt-4o\r\n\r\n # Limit to a specific provider with glob pattern\r\n ${APP_NAME} --models \"github-copilot/*\"\r\n\r\n # Cycle models with fixed thinking levels\r\n ${APP_NAME} --models sonnet:high,haiku:low\r\n\r\n # Start with a specific thinking level\r\n ${APP_NAME} --thinking high \"Solve this complex problem\"\r\n\r\n # Read-only mode (no file modifications possible)\r\n ${APP_NAME} --tools read,grep,find,ls -p \"Review the code in src/\"\r\n\r\n # Export a session file to HTML\r\n ${APP_NAME} --export ~/${CONFIG_DIR_NAME}/agent/sessions/--path--/session.jsonl\r\n ${APP_NAME} --export session.jsonl output.html\r\n\r\n${chalk.bold(\"Environment Variables:\")}\r\n ANTHROPIC_API_KEY - Anthropic Claude API key\r\n ANTHROPIC_OAUTH_TOKEN - Anthropic OAuth token (alternative to API key)\r\n OPENAI_API_KEY - OpenAI GPT API key\r\n AZURE_OPENAI_API_KEY - Azure OpenAI API key\r\n AZURE_OPENAI_BASE_URL - Azure OpenAI base URL (https://{resource}.openai.azure.com/openai/v1)\r\n AZURE_OPENAI_RESOURCE_NAME - Azure OpenAI resource name (alternative to base URL)\r\n AZURE_OPENAI_API_VERSION - Azure OpenAI API version (default: v1)\r\n AZURE_OPENAI_DEPLOYMENT_NAME_MAP - Azure OpenAI model=deployment map (comma-separated)\r\n GEMINI_API_KEY - Google Gemini API key\r\n GROQ_API_KEY - Groq API key\r\n CEREBRAS_API_KEY - Cerebras API key\r\n XAI_API_KEY - xAI Grok API key\r\n OPENROUTER_API_KEY - OpenRouter API key\r\n AI_GATEWAY_API_KEY - Vercel AI Gateway API key\r\n ZAI_API_KEY - ZAI API key\r\n MISTRAL_API_KEY - Mistral API key\r\n MINIMAX_API_KEY - MiniMax API key\r\n KIMI_API_KEY - Kimi For Coding API key\r\n AWS_PROFILE - AWS profile for Amazon Bedrock\r\n AWS_ACCESS_KEY_ID - AWS access key for Amazon Bedrock\r\n AWS_SECRET_ACCESS_KEY - AWS secret key for Amazon Bedrock\r\n AWS_BEARER_TOKEN_BEDROCK - Bedrock API key (bearer token)\r\n AWS_REGION - AWS region for Amazon Bedrock (e.g., us-east-1)\r\n ${ENV_AGENT_DIR.padEnd(32)} - Session storage directory (default: ~/${CONFIG_DIR_NAME}/agent)\r\n PI_PACKAGE_DIR - Override package directory (for Nix/Guix store paths)\r\n PI_SHARE_VIEWER_URL - Base URL for /share command (default: https://pi.dev/session/)\r\n PI_AI_ANTIGRAVITY_VERSION - Override Antigravity User-Agent version (e.g., 1.23.0)\r\n\r\n${chalk.bold(\"Available Tools (default: read, bash, edit, write):\")}\r\n read - Read file contents\r\n bash - Execute bash commands\r\n edit - Edit files with find/replace\r\n write - Write files (creates/overwrites)\r\n grep - Search file contents (read-only, off by default)\r\n find - Find files by glob pattern (read-only, off by default)\r\n ls - List directory contents (read-only, off by default)\r\n`);\r\n}\r\n"]}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * TUI config selector for `pi config` command
3
+ */
4
+ import type { ResolvedPaths } from "../core/package-manager.js";
5
+ import type { SettingsManager } from "../core/settings-manager.js";
6
+ export interface ConfigSelectorOptions {
7
+ resolvedPaths: ResolvedPaths;
8
+ settingsManager: SettingsManager;
9
+ cwd: string;
10
+ agentDir: string;
11
+ }
12
+ /** Show TUI config selector and return when closed */
13
+ export declare function selectConfig(options: ConfigSelectorOptions): Promise<void>;
14
+ //# sourceMappingURL=config-selector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-selector.d.ts","sourceRoot":"","sources":["../../src/cli/config-selector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAInE,MAAM,WAAW,qBAAqB;IACrC,aAAa,EAAE,aAAa,CAAC;IAC7B,eAAe,EAAE,eAAe,CAAC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,sDAAsD;AACtD,wBAAsB,YAAY,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiChF","sourcesContent":["/**\r\n * TUI config selector for `pi config` command\r\n */\r\n\r\nimport { ProcessTerminal, TUI } from \"@mariozechner/pi-tui\";\r\nimport type { ResolvedPaths } from \"../core/package-manager.js\";\r\nimport type { SettingsManager } from \"../core/settings-manager.js\";\r\nimport { ConfigSelectorComponent } from \"../modes/interactive/components/config-selector.js\";\r\nimport { initTheme, stopThemeWatcher } from \"../modes/interactive/theme/theme.js\";\r\n\r\nexport interface ConfigSelectorOptions {\r\n\tresolvedPaths: ResolvedPaths;\r\n\tsettingsManager: SettingsManager;\r\n\tcwd: string;\r\n\tagentDir: string;\r\n}\r\n\r\n/** Show TUI config selector and return when closed */\r\nexport async function selectConfig(options: ConfigSelectorOptions): Promise<void> {\r\n\t// Initialize theme before showing TUI\r\n\tinitTheme(options.settingsManager.getTheme(), true);\r\n\r\n\treturn new Promise((resolve) => {\r\n\t\tconst ui = new TUI(new ProcessTerminal());\r\n\t\tlet resolved = false;\r\n\r\n\t\tconst selector = new ConfigSelectorComponent(\r\n\t\t\toptions.resolvedPaths,\r\n\t\t\toptions.settingsManager,\r\n\t\t\toptions.cwd,\r\n\t\t\toptions.agentDir,\r\n\t\t\t() => {\r\n\t\t\t\tif (!resolved) {\r\n\t\t\t\t\tresolved = true;\r\n\t\t\t\t\tui.stop();\r\n\t\t\t\t\tstopThemeWatcher();\r\n\t\t\t\t\tresolve();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t() => {\r\n\t\t\t\tui.stop();\r\n\t\t\t\tstopThemeWatcher();\r\n\t\t\t\tprocess.exit(0);\r\n\t\t\t},\r\n\t\t\t() => ui.requestRender(),\r\n\t\t);\r\n\r\n\t\tui.addChild(selector);\r\n\t\tui.setFocus(selector.getResourceList());\r\n\t\tui.start();\r\n\t});\r\n}\r\n"]}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * TUI config selector for `pi config` command
3
+ */
4
+ import { ProcessTerminal, TUI } from "@mariozechner/pi-tui";
5
+ import { ConfigSelectorComponent } from "../modes/interactive/components/config-selector.js";
6
+ import { initTheme, stopThemeWatcher } from "../modes/interactive/theme/theme.js";
7
+ /** Show TUI config selector and return when closed */
8
+ export async function selectConfig(options) {
9
+ // Initialize theme before showing TUI
10
+ initTheme(options.settingsManager.getTheme(), true);
11
+ return new Promise((resolve) => {
12
+ const ui = new TUI(new ProcessTerminal());
13
+ let resolved = false;
14
+ const selector = new ConfigSelectorComponent(options.resolvedPaths, options.settingsManager, options.cwd, options.agentDir, () => {
15
+ if (!resolved) {
16
+ resolved = true;
17
+ ui.stop();
18
+ stopThemeWatcher();
19
+ resolve();
20
+ }
21
+ }, () => {
22
+ ui.stop();
23
+ stopThemeWatcher();
24
+ process.exit(0);
25
+ }, () => ui.requestRender());
26
+ ui.addChild(selector);
27
+ ui.setFocus(selector.getResourceList());
28
+ ui.start();
29
+ });
30
+ }
31
+ //# sourceMappingURL=config-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-selector.js","sourceRoot":"","sources":["../../src/cli/config-selector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAG5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,oDAAoD,CAAC;AAC7F,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AASlF,sDAAsD;AACtD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAA8B,EAAiB;IACjF,sCAAsC;IACtC,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC;IAEpD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC/B,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;QAC1C,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,MAAM,QAAQ,GAAG,IAAI,uBAAuB,CAC3C,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,eAAe,EACvB,OAAO,CAAC,GAAG,EACX,OAAO,CAAC,QAAQ,EAChB,GAAG,EAAE,CAAC;YACL,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACf,QAAQ,GAAG,IAAI,CAAC;gBAChB,EAAE,CAAC,IAAI,EAAE,CAAC;gBACV,gBAAgB,EAAE,CAAC;gBACnB,OAAO,EAAE,CAAC;YACX,CAAC;QAAA,CACD,EACD,GAAG,EAAE,CAAC;YACL,EAAE,CAAC,IAAI,EAAE,CAAC;YACV,gBAAgB,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAA,CAChB,EACD,GAAG,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,CACxB,CAAC;QAEF,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACtB,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC;QACxC,EAAE,CAAC,KAAK,EAAE,CAAC;IAAA,CACX,CAAC,CAAC;AAAA,CACH","sourcesContent":["/**\r\n * TUI config selector for `pi config` command\r\n */\r\n\r\nimport { ProcessTerminal, TUI } from \"@mariozechner/pi-tui\";\r\nimport type { ResolvedPaths } from \"../core/package-manager.js\";\r\nimport type { SettingsManager } from \"../core/settings-manager.js\";\r\nimport { ConfigSelectorComponent } from \"../modes/interactive/components/config-selector.js\";\r\nimport { initTheme, stopThemeWatcher } from \"../modes/interactive/theme/theme.js\";\r\n\r\nexport interface ConfigSelectorOptions {\r\n\tresolvedPaths: ResolvedPaths;\r\n\tsettingsManager: SettingsManager;\r\n\tcwd: string;\r\n\tagentDir: string;\r\n}\r\n\r\n/** Show TUI config selector and return when closed */\r\nexport async function selectConfig(options: ConfigSelectorOptions): Promise<void> {\r\n\t// Initialize theme before showing TUI\r\n\tinitTheme(options.settingsManager.getTheme(), true);\r\n\r\n\treturn new Promise((resolve) => {\r\n\t\tconst ui = new TUI(new ProcessTerminal());\r\n\t\tlet resolved = false;\r\n\r\n\t\tconst selector = new ConfigSelectorComponent(\r\n\t\t\toptions.resolvedPaths,\r\n\t\t\toptions.settingsManager,\r\n\t\t\toptions.cwd,\r\n\t\t\toptions.agentDir,\r\n\t\t\t() => {\r\n\t\t\t\tif (!resolved) {\r\n\t\t\t\t\tresolved = true;\r\n\t\t\t\t\tui.stop();\r\n\t\t\t\t\tstopThemeWatcher();\r\n\t\t\t\t\tresolve();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t() => {\r\n\t\t\t\tui.stop();\r\n\t\t\t\tstopThemeWatcher();\r\n\t\t\t\tprocess.exit(0);\r\n\t\t\t},\r\n\t\t\t() => ui.requestRender(),\r\n\t\t);\r\n\r\n\t\tui.addChild(selector);\r\n\t\tui.setFocus(selector.getResourceList());\r\n\t\tui.start();\r\n\t});\r\n}\r\n"]}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Process @file CLI arguments into text content and image attachments
3
+ */
4
+ import type { ImageContent } from "@mariozechner/pi-ai";
5
+ export interface ProcessedFiles {
6
+ text: string;
7
+ images: ImageContent[];
8
+ }
9
+ export interface ProcessFileOptions {
10
+ /** Whether to auto-resize images to 2000x2000 max. Default: true */
11
+ autoResizeImages?: boolean;
12
+ }
13
+ /** Process @file arguments into text content and image attachments */
14
+ export declare function processFileArguments(fileArgs: string[], options?: ProcessFileOptions): Promise<ProcessedFiles>;
15
+ //# sourceMappingURL=file-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-processor.d.ts","sourceRoot":"","sources":["../../src/cli/file-processor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAOxD,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IAClC,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,sEAAsE;AACtE,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC,CAwEpH","sourcesContent":["/**\r\n * Process @file CLI arguments into text content and image attachments\r\n */\r\n\r\nimport { access, readFile, stat } from \"node:fs/promises\";\r\nimport type { ImageContent } from \"@mariozechner/pi-ai\";\r\nimport chalk from \"chalk\";\r\nimport { resolve } from \"path\";\r\nimport { resolveReadPath } from \"../core/tools/path-utils.js\";\r\nimport { formatDimensionNote, resizeImage } from \"../utils/image-resize.js\";\r\nimport { detectSupportedImageMimeTypeFromFile } from \"../utils/mime.js\";\r\n\r\nexport interface ProcessedFiles {\r\n\ttext: string;\r\n\timages: ImageContent[];\r\n}\r\n\r\nexport interface ProcessFileOptions {\r\n\t/** Whether to auto-resize images to 2000x2000 max. Default: true */\r\n\tautoResizeImages?: boolean;\r\n}\r\n\r\n/** Process @file arguments into text content and image attachments */\r\nexport async function processFileArguments(fileArgs: string[], options?: ProcessFileOptions): Promise<ProcessedFiles> {\r\n\tconst autoResizeImages = options?.autoResizeImages ?? true;\r\n\tlet text = \"\";\r\n\tconst images: ImageContent[] = [];\r\n\r\n\tfor (const fileArg of fileArgs) {\r\n\t\t// Expand and resolve path (handles ~ expansion and macOS screenshot Unicode spaces)\r\n\t\tconst absolutePath = resolve(resolveReadPath(fileArg, process.cwd()));\r\n\r\n\t\t// Check if file exists\r\n\t\ttry {\r\n\t\t\tawait access(absolutePath);\r\n\t\t} catch {\r\n\t\t\tconsole.error(chalk.red(`Error: File not found: ${absolutePath}`));\r\n\t\t\tprocess.exit(1);\r\n\t\t}\r\n\r\n\t\t// Check if file is empty\r\n\t\tconst stats = await stat(absolutePath);\r\n\t\tif (stats.size === 0) {\r\n\t\t\t// Skip empty files\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tconst mimeType = await detectSupportedImageMimeTypeFromFile(absolutePath);\r\n\r\n\t\tif (mimeType) {\r\n\t\t\t// Handle image file\r\n\t\t\tconst content = await readFile(absolutePath);\r\n\t\t\tconst base64Content = content.toString(\"base64\");\r\n\r\n\t\t\tlet attachment: ImageContent;\r\n\t\t\tlet dimensionNote: string | undefined;\r\n\r\n\t\t\tif (autoResizeImages) {\r\n\t\t\t\tconst resized = await resizeImage({ type: \"image\", data: base64Content, mimeType });\r\n\t\t\t\tdimensionNote = formatDimensionNote(resized);\r\n\t\t\t\tattachment = {\r\n\t\t\t\t\ttype: \"image\",\r\n\t\t\t\t\tmimeType: resized.mimeType,\r\n\t\t\t\t\tdata: resized.data,\r\n\t\t\t\t};\r\n\t\t\t} else {\r\n\t\t\t\tattachment = {\r\n\t\t\t\t\ttype: \"image\",\r\n\t\t\t\t\tmimeType,\r\n\t\t\t\t\tdata: base64Content,\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\timages.push(attachment);\r\n\r\n\t\t\t// Add text reference to image with optional dimension note\r\n\t\t\tif (dimensionNote) {\r\n\t\t\t\ttext += `<file name=\"${absolutePath}\">${dimensionNote}</file>\\n`;\r\n\t\t\t} else {\r\n\t\t\t\ttext += `<file name=\"${absolutePath}\"></file>\\n`;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// Handle text file\r\n\t\t\ttry {\r\n\t\t\t\tconst content = await readFile(absolutePath, \"utf-8\");\r\n\t\t\t\ttext += `<file name=\"${absolutePath}\">\\n${content}\\n</file>\\n`;\r\n\t\t\t} catch (error: unknown) {\r\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\r\n\t\t\t\tconsole.error(chalk.red(`Error: Could not read file ${absolutePath}: ${message}`));\r\n\t\t\t\tprocess.exit(1);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn { text, images };\r\n}\r\n"]}