@vandeepunk/pi-coding-agent 0.0.6 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (459) hide show
  1. package/CHANGELOG.md +814 -16
  2. package/README.md +66 -27
  3. package/dist/bun/cli.d.ts +3 -0
  4. package/dist/bun/cli.d.ts.map +1 -0
  5. package/dist/bun/cli.js +7 -0
  6. package/dist/bun/cli.js.map +1 -0
  7. package/dist/bun/register-bedrock.d.ts +2 -0
  8. package/dist/bun/register-bedrock.d.ts.map +1 -0
  9. package/dist/bun/register-bedrock.js +4 -0
  10. package/dist/bun/register-bedrock.js.map +1 -0
  11. package/dist/cli/args.d.ts +9 -4
  12. package/dist/cli/args.d.ts.map +1 -1
  13. package/dist/cli/args.js +61 -22
  14. package/dist/cli/args.js.map +1 -1
  15. package/dist/cli/file-processor.d.ts.map +1 -1
  16. package/dist/cli/file-processor.js +4 -0
  17. package/dist/cli/file-processor.js.map +1 -1
  18. package/dist/cli/initial-message.d.ts +18 -0
  19. package/dist/cli/initial-message.d.ts.map +1 -0
  20. package/dist/cli/initial-message.js +22 -0
  21. package/dist/cli/initial-message.js.map +1 -0
  22. package/dist/cli/session-picker.d.ts.map +1 -1
  23. package/dist/cli/session-picker.js +2 -1
  24. package/dist/cli/session-picker.js.map +1 -1
  25. package/dist/cli.d.ts.map +1 -1
  26. package/dist/cli.js +3 -0
  27. package/dist/cli.js.map +1 -1
  28. package/dist/config.d.ts +1 -1
  29. package/dist/config.d.ts.map +1 -1
  30. package/dist/config.js +2 -2
  31. package/dist/config.js.map +1 -1
  32. package/dist/core/agent-session-runtime.d.ts +83 -0
  33. package/dist/core/agent-session-runtime.d.ts.map +1 -0
  34. package/dist/core/agent-session-runtime.js +236 -0
  35. package/dist/core/agent-session-runtime.js.map +1 -0
  36. package/dist/core/agent-session-services.d.ts +86 -0
  37. package/dist/core/agent-session-services.d.ts.map +1 -0
  38. package/dist/core/agent-session-services.js +116 -0
  39. package/dist/core/agent-session-services.js.map +1 -0
  40. package/dist/core/agent-session.d.ts +63 -49
  41. package/dist/core/agent-session.d.ts.map +1 -1
  42. package/dist/core/agent-session.js +599 -370
  43. package/dist/core/agent-session.js.map +1 -1
  44. package/dist/core/auth-storage.d.ts +38 -8
  45. package/dist/core/auth-storage.d.ts.map +1 -1
  46. package/dist/core/auth-storage.js +220 -96
  47. package/dist/core/auth-storage.js.map +1 -1
  48. package/dist/core/bash-executor.d.ts +6 -7
  49. package/dist/core/bash-executor.d.ts.map +1 -1
  50. package/dist/core/bash-executor.js +27 -114
  51. package/dist/core/bash-executor.js.map +1 -1
  52. package/dist/core/compaction/branch-summarization.d.ts +2 -0
  53. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  54. package/dist/core/compaction/branch-summarization.js +3 -2
  55. package/dist/core/compaction/branch-summarization.js.map +1 -1
  56. package/dist/core/compaction/compaction.d.ts +3 -3
  57. package/dist/core/compaction/compaction.d.ts.map +1 -1
  58. package/dist/core/compaction/compaction.js +31 -25
  59. package/dist/core/compaction/compaction.js.map +1 -1
  60. package/dist/core/compaction/utils.d.ts +3 -0
  61. package/dist/core/compaction/utils.d.ts.map +1 -1
  62. package/dist/core/compaction/utils.js +16 -1
  63. package/dist/core/compaction/utils.js.map +1 -1
  64. package/dist/core/exec.d.ts.map +1 -1
  65. package/dist/core/exec.js +7 -3
  66. package/dist/core/exec.js.map +1 -1
  67. package/dist/core/export-html/index.d.ts +7 -4
  68. package/dist/core/export-html/index.d.ts.map +1 -1
  69. package/dist/core/export-html/index.js +10 -8
  70. package/dist/core/export-html/index.js.map +1 -1
  71. package/dist/core/export-html/template.css +43 -13
  72. package/dist/core/export-html/template.html +1 -0
  73. package/dist/core/export-html/template.js +118 -14
  74. package/dist/core/export-html/tool-renderer.d.ts +9 -4
  75. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  76. package/dist/core/export-html/tool-renderer.js +48 -10
  77. package/dist/core/export-html/tool-renderer.js.map +1 -1
  78. package/dist/core/extensions/index.d.ts +5 -4
  79. package/dist/core/extensions/index.d.ts.map +1 -1
  80. package/dist/core/extensions/index.js +2 -2
  81. package/dist/core/extensions/index.js.map +1 -1
  82. package/dist/core/extensions/loader.d.ts.map +1 -1
  83. package/dist/core/extensions/loader.js +49 -13
  84. package/dist/core/extensions/loader.js.map +1 -1
  85. package/dist/core/extensions/runner.d.ts +13 -11
  86. package/dist/core/extensions/runner.d.ts.map +1 -1
  87. package/dist/core/extensions/runner.js +139 -64
  88. package/dist/core/extensions/runner.js.map +1 -1
  89. package/dist/core/extensions/types.d.ts +174 -34
  90. package/dist/core/extensions/types.d.ts.map +1 -1
  91. package/dist/core/extensions/types.js +10 -0
  92. package/dist/core/extensions/types.js.map +1 -1
  93. package/dist/core/extensions/wrapper.d.ts +4 -11
  94. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  95. package/dist/core/extensions/wrapper.js +6 -86
  96. package/dist/core/extensions/wrapper.js.map +1 -1
  97. package/dist/core/footer-data-provider.d.ts +18 -2
  98. package/dist/core/footer-data-provider.d.ts.map +1 -1
  99. package/dist/core/footer-data-provider.js +220 -40
  100. package/dist/core/footer-data-provider.js.map +1 -1
  101. package/dist/core/index.d.ts +4 -1
  102. package/dist/core/index.d.ts.map +1 -1
  103. package/dist/core/index.js +4 -1
  104. package/dist/core/index.js.map +1 -1
  105. package/dist/core/keybindings.d.ts +283 -50
  106. package/dist/core/keybindings.d.ts.map +1 -1
  107. package/dist/core/keybindings.js +221 -134
  108. package/dist/core/keybindings.js.map +1 -1
  109. package/dist/core/model-registry.d.ts +33 -3
  110. package/dist/core/model-registry.d.ts.map +1 -1
  111. package/dist/core/model-registry.js +165 -97
  112. package/dist/core/model-registry.js.map +1 -1
  113. package/dist/core/model-resolver.d.ts +35 -1
  114. package/dist/core/model-resolver.d.ts.map +1 -1
  115. package/dist/core/model-resolver.js +205 -32
  116. package/dist/core/model-resolver.js.map +1 -1
  117. package/dist/core/output-guard.d.ts +6 -0
  118. package/dist/core/output-guard.d.ts.map +1 -0
  119. package/dist/core/output-guard.js +59 -0
  120. package/dist/core/output-guard.js.map +1 -0
  121. package/dist/core/package-manager.d.ts +43 -2
  122. package/dist/core/package-manager.d.ts.map +1 -1
  123. package/dist/core/package-manager.js +541 -102
  124. package/dist/core/package-manager.js.map +1 -1
  125. package/dist/core/prompt-templates.d.ts +5 -4
  126. package/dist/core/prompt-templates.d.ts.map +1 -1
  127. package/dist/core/prompt-templates.js +35 -37
  128. package/dist/core/prompt-templates.js.map +1 -1
  129. package/dist/core/resolve-config-value.d.ts +6 -0
  130. package/dist/core/resolve-config-value.d.ts.map +1 -1
  131. package/dist/core/resolve-config-value.js +75 -8
  132. package/dist/core/resolve-config-value.js.map +1 -1
  133. package/dist/core/resource-loader.d.ts +6 -5
  134. package/dist/core/resource-loader.d.ts.map +1 -1
  135. package/dist/core/resource-loader.js +166 -119
  136. package/dist/core/resource-loader.js.map +1 -1
  137. package/dist/core/sdk.d.ts +11 -8
  138. package/dist/core/sdk.d.ts.map +1 -1
  139. package/dist/core/sdk.js +31 -29
  140. package/dist/core/sdk.js.map +1 -1
  141. package/dist/core/session-cwd.d.ts +19 -0
  142. package/dist/core/session-cwd.d.ts.map +1 -0
  143. package/dist/core/session-cwd.js +38 -0
  144. package/dist/core/session-cwd.js.map +1 -0
  145. package/dist/core/session-manager.d.ts +11 -1
  146. package/dist/core/session-manager.d.ts.map +1 -1
  147. package/dist/core/session-manager.js +39 -25
  148. package/dist/core/session-manager.js.map +1 -1
  149. package/dist/core/settings-manager.d.ts +60 -10
  150. package/dist/core/settings-manager.d.ts.map +1 -1
  151. package/dist/core/settings-manager.js +291 -140
  152. package/dist/core/settings-manager.js.map +1 -1
  153. package/dist/core/skills.d.ts +5 -3
  154. package/dist/core/skills.d.ts.map +1 -1
  155. package/dist/core/skills.js +54 -9
  156. package/dist/core/skills.js.map +1 -1
  157. package/dist/core/slash-commands.d.ts +2 -3
  158. package/dist/core/slash-commands.d.ts.map +1 -1
  159. package/dist/core/slash-commands.js +3 -2
  160. package/dist/core/slash-commands.js.map +1 -1
  161. package/dist/core/source-info.d.ts +18 -0
  162. package/dist/core/source-info.d.ts.map +1 -0
  163. package/dist/core/source-info.js +19 -0
  164. package/dist/core/source-info.js.map +1 -0
  165. package/dist/core/system-prompt.d.ts +4 -0
  166. package/dist/core/system-prompt.d.ts.map +1 -1
  167. package/dist/core/system-prompt.js +31 -52
  168. package/dist/core/system-prompt.js.map +1 -1
  169. package/dist/core/timings.d.ts +1 -0
  170. package/dist/core/timings.d.ts.map +1 -1
  171. package/dist/core/timings.js +6 -0
  172. package/dist/core/timings.js.map +1 -1
  173. package/dist/core/tools/bash.d.ts +24 -6
  174. package/dist/core/tools/bash.d.ts.map +1 -1
  175. package/dist/core/tools/bash.js +225 -115
  176. package/dist/core/tools/bash.js.map +1 -1
  177. package/dist/core/tools/edit-diff.d.ts +23 -1
  178. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  179. package/dist/core/tools/edit-diff.js +151 -57
  180. package/dist/core/tools/edit-diff.js.map +1 -1
  181. package/dist/core/tools/edit.d.ts +20 -6
  182. package/dist/core/tools/edit.d.ts.map +1 -1
  183. package/dist/core/tools/edit.js +111 -61
  184. package/dist/core/tools/edit.js.map +1 -1
  185. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  186. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  187. package/dist/core/tools/file-mutation-queue.js +37 -0
  188. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  189. package/dist/core/tools/find.d.ts +11 -4
  190. package/dist/core/tools/find.d.ts.map +1 -1
  191. package/dist/core/tools/find.js +82 -30
  192. package/dist/core/tools/find.js.map +1 -1
  193. package/dist/core/tools/grep.d.ts +15 -4
  194. package/dist/core/tools/grep.d.ts.map +1 -1
  195. package/dist/core/tools/grep.js +83 -29
  196. package/dist/core/tools/grep.js.map +1 -1
  197. package/dist/core/tools/index.d.ts +63 -21
  198. package/dist/core/tools/index.d.ts.map +1 -1
  199. package/dist/core/tools/index.js +51 -26
  200. package/dist/core/tools/index.js.map +1 -1
  201. package/dist/core/tools/ls.d.ts +9 -3
  202. package/dist/core/tools/ls.d.ts.map +1 -1
  203. package/dist/core/tools/ls.js +67 -13
  204. package/dist/core/tools/ls.js.map +1 -1
  205. package/dist/core/tools/read.d.ts +10 -3
  206. package/dist/core/tools/read.d.ts.map +1 -1
  207. package/dist/core/tools/read.js +110 -51
  208. package/dist/core/tools/read.js.map +1 -1
  209. package/dist/core/tools/render-utils.d.ts +21 -0
  210. package/dist/core/tools/render-utils.d.ts.map +1 -0
  211. package/dist/core/tools/render-utils.js +49 -0
  212. package/dist/core/tools/render-utils.js.map +1 -0
  213. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  214. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  215. package/dist/core/tools/tool-definition-wrapper.js +32 -0
  216. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  217. package/dist/core/tools/write.d.ts +9 -3
  218. package/dist/core/tools/write.d.ts.map +1 -1
  219. package/dist/core/tools/write.js +168 -30
  220. package/dist/core/tools/write.js.map +1 -1
  221. package/dist/index.d.ts +7 -6
  222. package/dist/index.d.ts.map +1 -1
  223. package/dist/index.js +7 -6
  224. package/dist/index.js.map +1 -1
  225. package/dist/main.d.ts.map +1 -1
  226. package/dist/main.js +354 -379
  227. package/dist/main.js.map +1 -1
  228. package/dist/migrations.d.ts.map +1 -1
  229. package/dist/migrations.js +31 -11
  230. package/dist/migrations.js.map +1 -1
  231. package/dist/modes/interactive/components/assistant-message.d.ts +3 -1
  232. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  233. package/dist/modes/interactive/components/assistant-message.js +14 -3
  234. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  235. package/dist/modes/interactive/components/bash-execution.d.ts +0 -1
  236. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  237. package/dist/modes/interactive/components/bash-execution.js +22 -9
  238. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  239. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  240. package/dist/modes/interactive/components/bordered-loader.js +1 -1
  241. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  242. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  243. package/dist/modes/interactive/components/branch-summary-message.js +2 -2
  244. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  245. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  246. package/dist/modes/interactive/components/compaction-summary-message.js +2 -2
  247. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  248. package/dist/modes/interactive/components/config-selector.d.ts +1 -1
  249. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  250. package/dist/modes/interactive/components/config-selector.js +14 -14
  251. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  252. package/dist/modes/interactive/components/custom-editor.d.ts +3 -3
  253. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  254. package/dist/modes/interactive/components/custom-editor.js +6 -6
  255. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  256. package/dist/modes/interactive/components/extension-editor.d.ts +5 -2
  257. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  258. package/dist/modes/interactive/components/extension-editor.js +18 -9
  259. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  260. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  261. package/dist/modes/interactive/components/extension-input.js +5 -5
  262. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  263. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  264. package/dist/modes/interactive/components/extension-selector.js +8 -8
  265. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  266. package/dist/modes/interactive/components/footer.d.ts +1 -0
  267. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  268. package/dist/modes/interactive/components/footer.js +21 -40
  269. package/dist/modes/interactive/components/footer.js.map +1 -1
  270. package/dist/modes/interactive/components/index.d.ts +1 -1
  271. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  272. package/dist/modes/interactive/components/index.js +1 -1
  273. package/dist/modes/interactive/components/index.js.map +1 -1
  274. package/dist/modes/interactive/components/keybinding-hints.d.ts +3 -36
  275. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  276. package/dist/modes/interactive/components/keybinding-hints.js +5 -44
  277. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  278. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  279. package/dist/modes/interactive/components/login-dialog.js +7 -7
  280. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  281. package/dist/modes/interactive/components/model-selector.d.ts +1 -1
  282. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  283. package/dist/modes/interactive/components/model-selector.js +13 -9
  284. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  285. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  286. package/dist/modes/interactive/components/oauth-selector.js +7 -7
  287. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  288. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  289. package/dist/modes/interactive/components/scoped-models-selector.js +4 -4
  290. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  291. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  292. package/dist/modes/interactive/components/session-selector.js +33 -36
  293. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  294. package/dist/modes/interactive/components/settings-selector.d.ts +5 -0
  295. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  296. package/dist/modes/interactive/components/settings-selector.js +25 -1
  297. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  298. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  299. package/dist/modes/interactive/components/show-images-selector.js +5 -1
  300. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  301. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  302. package/dist/modes/interactive/components/skill-invocation-message.js +2 -2
  303. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  304. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  305. package/dist/modes/interactive/components/theme-selector.js +5 -1
  306. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  307. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  308. package/dist/modes/interactive/components/thinking-selector.js +5 -1
  309. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  310. package/dist/modes/interactive/components/tool-execution.d.ts +17 -29
  311. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  312. package/dist/modes/interactive/components/tool-execution.js +139 -501
  313. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  314. package/dist/modes/interactive/components/tree-selector.d.ts +25 -4
  315. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  316. package/dist/modes/interactive/components/tree-selector.js +184 -34
  317. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  318. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  319. package/dist/modes/interactive/components/user-message-selector.js +6 -6
  320. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  321. package/dist/modes/interactive/components/user-message.d.ts +1 -0
  322. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  323. package/dist/modes/interactive/components/user-message.js +12 -0
  324. package/dist/modes/interactive/components/user-message.js.map +1 -1
  325. package/dist/modes/interactive/interactive-mode.d.ts +25 -17
  326. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  327. package/dist/modes/interactive/interactive-mode.js +669 -385
  328. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  329. package/dist/modes/interactive/theme/theme.d.ts +3 -0
  330. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  331. package/dist/modes/interactive/theme/theme.js +83 -48
  332. package/dist/modes/interactive/theme/theme.js.map +1 -1
  333. package/dist/modes/print-mode.d.ts +2 -2
  334. package/dist/modes/print-mode.d.ts.map +1 -1
  335. package/dist/modes/print-mode.js +90 -79
  336. package/dist/modes/print-mode.js.map +1 -1
  337. package/dist/modes/rpc/jsonl.d.ts +17 -0
  338. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  339. package/dist/modes/rpc/jsonl.js +49 -0
  340. package/dist/modes/rpc/jsonl.js.map +1 -0
  341. package/dist/modes/rpc/rpc-client.d.ts +1 -1
  342. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  343. package/dist/modes/rpc/rpc-client.js +8 -11
  344. package/dist/modes/rpc/rpc-client.js.map +1 -1
  345. package/dist/modes/rpc/rpc-mode.d.ts +2 -2
  346. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  347. package/dist/modes/rpc/rpc-mode.js +130 -87
  348. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  349. package/dist/modes/rpc/rpc-types.d.ts +3 -4
  350. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  351. package/dist/modes/rpc/rpc-types.js.map +1 -1
  352. package/dist/package-manager-cli.d.ts +4 -0
  353. package/dist/package-manager-cli.d.ts.map +1 -0
  354. package/dist/package-manager-cli.js +234 -0
  355. package/dist/package-manager-cli.js.map +1 -0
  356. package/dist/utils/child-process.d.ts +11 -0
  357. package/dist/utils/child-process.d.ts.map +1 -0
  358. package/dist/utils/child-process.js +78 -0
  359. package/dist/utils/child-process.js.map +1 -0
  360. package/dist/utils/clipboard-image.d.ts.map +1 -1
  361. package/dist/utils/clipboard-image.js +94 -11
  362. package/dist/utils/clipboard-image.js.map +1 -1
  363. package/dist/utils/clipboard-native.d.ts +1 -0
  364. package/dist/utils/clipboard-native.d.ts.map +1 -1
  365. package/dist/utils/clipboard-native.js.map +1 -1
  366. package/dist/utils/clipboard.d.ts +1 -1
  367. package/dist/utils/clipboard.d.ts.map +1 -1
  368. package/dist/utils/clipboard.js +27 -16
  369. package/dist/utils/clipboard.js.map +1 -1
  370. package/dist/utils/exif-orientation.d.ts +5 -0
  371. package/dist/utils/exif-orientation.d.ts.map +1 -0
  372. package/dist/utils/exif-orientation.js +158 -0
  373. package/dist/utils/exif-orientation.js.map +1 -0
  374. package/dist/utils/git.d.ts +5 -1
  375. package/dist/utils/git.d.ts.map +1 -1
  376. package/dist/utils/git.js +14 -3
  377. package/dist/utils/git.js.map +1 -1
  378. package/dist/utils/image-convert.d.ts.map +1 -1
  379. package/dist/utils/image-convert.js +5 -1
  380. package/dist/utils/image-convert.js.map +1 -1
  381. package/dist/utils/image-resize.d.ts +5 -5
  382. package/dist/utils/image-resize.d.ts.map +1 -1
  383. package/dist/utils/image-resize.js +51 -95
  384. package/dist/utils/image-resize.js.map +1 -1
  385. package/dist/utils/paths.d.ts +7 -0
  386. package/dist/utils/paths.d.ts.map +1 -0
  387. package/dist/utils/paths.js +19 -0
  388. package/dist/utils/paths.js.map +1 -0
  389. package/dist/utils/tools-manager.d.ts.map +1 -1
  390. package/dist/utils/tools-manager.js +67 -22
  391. package/dist/utils/tools-manager.js.map +1 -1
  392. package/docs/compaction.md +6 -2
  393. package/docs/custom-provider.md +57 -9
  394. package/docs/development.md +3 -1
  395. package/docs/extensions.md +437 -67
  396. package/docs/json.md +5 -2
  397. package/docs/keybindings.md +108 -107
  398. package/docs/models.md +50 -2
  399. package/docs/packages.md +17 -10
  400. package/docs/prompt-templates.md +6 -6
  401. package/docs/providers.md +10 -1
  402. package/docs/rpc.md +78 -18
  403. package/docs/sdk.md +261 -96
  404. package/docs/settings.md +28 -3
  405. package/docs/skills.md +9 -4
  406. package/docs/terminal-setup.md +39 -3
  407. package/docs/tmux.md +61 -0
  408. package/docs/tree.md +15 -3
  409. package/docs/tui.md +2 -2
  410. package/examples/extensions/README.md +3 -0
  411. package/examples/extensions/antigravity-image-gen.ts +12 -7
  412. package/examples/extensions/built-in-tool-renderer.ts +246 -0
  413. package/examples/extensions/commands.ts +3 -3
  414. package/examples/extensions/custom-compaction.ts +17 -4
  415. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  416. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  417. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  418. package/examples/extensions/custom-provider-gitlab-duo/test.ts +2 -2
  419. package/examples/extensions/custom-provider-qwen-cli/package.json +1 -1
  420. package/examples/extensions/doom-overlay/doom/build.sh +2 -2
  421. package/examples/extensions/dynamic-tools.ts +74 -0
  422. package/examples/extensions/handoff.ts +5 -2
  423. package/examples/extensions/hello.ts +18 -17
  424. package/examples/extensions/hidden-thinking-label.ts +53 -0
  425. package/examples/extensions/minimal-mode.ts +14 -14
  426. package/examples/extensions/overlay-qa-tests.ts +468 -1
  427. package/examples/extensions/preset.ts +2 -3
  428. package/examples/extensions/provider-payload.ts +14 -0
  429. package/examples/extensions/qna.ts +5 -2
  430. package/examples/extensions/question.ts +2 -2
  431. package/examples/extensions/questionnaire.ts +2 -2
  432. package/examples/extensions/rpc-demo.ts +3 -9
  433. package/examples/extensions/sandbox/index.ts +6 -3
  434. package/examples/extensions/status-line.ts +0 -8
  435. package/examples/extensions/subagent/README.md +4 -4
  436. package/examples/extensions/subagent/agents.ts +2 -3
  437. package/examples/extensions/subagent/index.ts +30 -8
  438. package/examples/extensions/summarize.ts +15 -4
  439. package/examples/extensions/todo.ts +2 -4
  440. package/examples/extensions/tool-override.ts +10 -9
  441. package/examples/extensions/tools.ts +0 -5
  442. package/examples/extensions/trigger-compact.ts +11 -1
  443. package/examples/extensions/truncated-tool.ts +8 -5
  444. package/examples/extensions/widget-placement.ts +4 -12
  445. package/examples/extensions/with-deps/index.ts +1 -5
  446. package/examples/extensions/with-deps/package-lock.json +2 -2
  447. package/examples/extensions/with-deps/package.json +1 -1
  448. package/examples/sdk/02-custom-model.ts +2 -2
  449. package/examples/sdk/04-skills.ts +8 -2
  450. package/examples/sdk/08-prompt-templates.ts +4 -3
  451. package/examples/sdk/09-api-keys-and-oauth.ts +5 -5
  452. package/examples/sdk/10-settings.ts +13 -0
  453. package/examples/sdk/12-full-control.ts +2 -3
  454. package/examples/sdk/13-session-runtime.ts +67 -0
  455. package/examples/sdk/README.md +10 -7
  456. package/package.json +98 -94
  457. /package/examples/extensions/subagent/{commands → prompts}/implement-and-review.md +0 -0
  458. /package/examples/extensions/subagent/{commands → prompts}/implement.md +0 -0
  459. /package/examples/extensions/subagent/{commands → prompts}/scout-and-plan.md +0 -0
package/docs/settings.md CHANGED
@@ -41,7 +41,8 @@ Edit directly or use `/settings` for common options.
41
41
  | `theme` | string | `"dark"` | Theme name (`"dark"`, `"light"`, or custom) |
42
42
  | `quietStartup` | boolean | `false` | Hide startup header |
43
43
  | `collapseChangelog` | boolean | `false` | Show condensed changelog after updates |
44
- | `doubleEscapeAction` | string | `"tree"` | Action for double-escape: `"tree"` or `"fork"` |
44
+ | `doubleEscapeAction` | string | `"tree"` | Action for double-escape: `"tree"`, `"fork"`, or `"none"` |
45
+ | `treeFilterMode` | string | `"default"` | Default filter for `/tree`: `"default"`, `"no-tools"`, `"user-only"`, `"labeled-only"`, `"all"` |
45
46
  | `editorPaddingX` | number | `0` | Horizontal padding for input editor (0-3) |
46
47
  | `autocompleteMaxVisible` | number | `5` | Max visible items in autocomplete dropdown (3-20) |
47
48
  | `showHardwareCursor` | boolean | `false` | Show terminal cursor |
@@ -69,6 +70,7 @@ Edit directly or use `/settings` for common options.
69
70
  | Setting | Type | Default | Description |
70
71
  |---------|------|---------|-------------|
71
72
  | `branchSummary.reserveTokens` | number | `16384` | Tokens reserved for branch summarization |
73
+ | `branchSummary.skipPrompt` | boolean | `false` | Skip "Summarize branch?" prompt on `/tree` navigation (defaults to no summary) |
72
74
 
73
75
  ### Retry
74
76
 
@@ -98,12 +100,14 @@ When a provider requests a retry delay longer than `maxDelayMs` (e.g., Google's
98
100
  |---------|------|---------|-------------|
99
101
  | `steeringMode` | string | `"one-at-a-time"` | How steering messages are sent: `"all"` or `"one-at-a-time"` |
100
102
  | `followUpMode` | string | `"one-at-a-time"` | How follow-up messages are sent: `"all"` or `"one-at-a-time"` |
103
+ | `transport` | string | `"sse"` | Preferred transport for providers that support multiple transports: `"sse"`, `"websocket"`, or `"auto"` |
101
104
 
102
105
  ### Terminal & Images
103
106
 
104
107
  | Setting | Type | Default | Description |
105
108
  |---------|------|---------|-------------|
106
109
  | `terminal.showImages` | boolean | `true` | Show images in terminal (if supported) |
110
+ | `terminal.clearOnShrink` | boolean | `false` | Clear empty rows when content shrinks (can cause flicker) |
107
111
  | `images.autoResize` | boolean | `true` | Resize images to 2000x2000 max |
108
112
  | `images.blockImages` | boolean | `false` | Block all images from being sent to LLM |
109
113
 
@@ -113,6 +117,27 @@ When a provider requests a retry delay longer than `maxDelayMs` (e.g., Google's
113
117
  |---------|------|---------|-------------|
114
118
  | `shellPath` | string | - | Custom shell path (e.g., for Cygwin on Windows) |
115
119
  | `shellCommandPrefix` | string | - | Prefix for every bash command (e.g., `"shopt -s expand_aliases"`) |
120
+ | `npmCommand` | string[] | - | Command argv used for npm package lookup/install operations (e.g., `["mise", "exec", "node@20", "--", "npm"]`) |
121
+
122
+ ```json
123
+ {
124
+ "npmCommand": ["mise", "exec", "node@20", "--", "npm"]
125
+ }
126
+ ```
127
+
128
+ `npmCommand` is used for all npm package-manager operations, including `npm root -g`, installs, uninstalls, and `npm install` inside git packages. Use argv-style entries exactly as the process should be launched.
129
+
130
+ ### Sessions
131
+
132
+ | Setting | Type | Default | Description |
133
+ |---------|------|---------|-------------|
134
+ | `sessionDir` | string | - | Directory where session files are stored. Accepts absolute or relative paths. |
135
+
136
+ ```json
137
+ { "sessionDir": ".pi/sessions" }
138
+ ```
139
+
140
+ When multiple sources specify a session directory, `--session-dir` CLI flag takes precedence over `sessionDir` in settings.json.
116
141
 
117
142
  ### Model Cycling
118
143
 
@@ -134,7 +159,7 @@ When a provider requests a retry delay longer than `maxDelayMs` (e.g., Google's
134
159
 
135
160
  ### Resources
136
161
 
137
- These settings define where to load extensions, skills, commands, and themes from.
162
+ These settings define where to load extensions, skills, prompts, and themes from.
138
163
 
139
164
  Paths in `~/.pi/agent/settings.json` resolve relative to `~/.pi/agent`. Paths in `.pi/settings.json` resolve relative to `.pi`. Absolute paths and `~` are supported.
140
165
 
@@ -143,7 +168,7 @@ Paths in `~/.pi/agent/settings.json` resolve relative to `~/.pi/agent`. Paths in
143
168
  | `packages` | array | `[]` | npm/git packages to load resources from |
144
169
  | `extensions` | string[] | `[]` | Local extension file paths or directories |
145
170
  | `skills` | string[] | `[]` | Local skill file paths or directories |
146
- | `commands` | string[] | `[]` | Local command template paths or directories |
171
+ | `prompts` | string[] | `[]` | Local prompt template paths or directories |
147
172
  | `themes` | string[] | `[]` | Local theme file paths or directories |
148
173
  | `enableSkillCommands` | boolean | `true` | Register skills as `/skill:name` commands |
149
174
 
package/docs/skills.md CHANGED
@@ -23,15 +23,20 @@ Pi implements the [Agent Skills standard](https://agentskills.io/specification),
23
23
 
24
24
  Pi loads skills from:
25
25
 
26
- - Global: `~/.pi/agent/skills/`
27
- - Project: `.pi/skills/`
26
+ - Global:
27
+ - `~/.pi/agent/skills/`
28
+ - `~/.agents/skills/`
29
+ - Project:
30
+ - `.pi/skills/`
31
+ - `.agents/skills/` in `cwd` and ancestor directories (up to git repo root, or filesystem root when not in a repo)
28
32
  - Packages: `skills/` directories or `pi.skills` entries in `package.json`
29
33
  - Settings: `skills` array with files or directories
30
34
  - CLI: `--skill <path>` (repeatable, additive even with `--no-skills`)
31
35
 
32
36
  Discovery rules:
33
- - Direct `.md` files in the skills directory root
34
- - Recursive `SKILL.md` files under subdirectories
37
+ - In `~/.pi/agent/skills/` and `.pi/skills/`, direct root `.md` files are discovered as individual skills
38
+ - In all skill locations, directories containing `SKILL.md` are discovered recursively
39
+ - In `~/.agents/skills/` and project `.agents/skills/`, root `.md` files are ignored
35
40
 
36
41
  Disable discovery with `--no-skills` (explicit `--skill` paths still load).
37
42
 
@@ -8,13 +8,30 @@ Work out of the box.
8
8
 
9
9
  ## Ghostty
10
10
 
11
- Add to your Ghostty config (`~/.config/ghostty/config`):
11
+ Add to your Ghostty config (`~/Library/Application Support/com.mitchellh.ghostty/config` on macOS, `~/.config/ghostty/config` on Linux):
12
12
 
13
13
  ```
14
14
  keybind = alt+backspace=text:\x1b\x7f
15
+ ```
16
+
17
+ Older Claude Code versions may have added this Ghostty mapping:
18
+
19
+ ```
15
20
  keybind = shift+enter=text:\n
16
21
  ```
17
22
 
23
+ That mapping sends a raw linefeed byte. Inside pi, that is indistinguishable from `Ctrl+J`, so tmux and pi no longer see a real `shift+enter` key event.
24
+
25
+ If Claude Code 2.x or newer is the only reason you added that mapping, you can remove it, unless you want to use Claude Code in tmux, where it still requires that Ghostty mapping.
26
+
27
+ If you want `Shift+Enter` to keep working in tmux via that remap, add `ctrl+j` to your pi `newLine` keybinding in `~/.pi/agent/keybindings.json`:
28
+
29
+ ```json
30
+ {
31
+ "newLine": ["shift+enter", "ctrl+j"]
32
+ }
33
+ ```
34
+
18
35
  ## WezTerm
19
36
 
20
37
  Create `~/.wezterm.lua`:
@@ -46,7 +63,7 @@ Add to `keybindings.json` to enable `Shift+Enter` for multi-line input:
46
63
 
47
64
  ## Windows Terminal
48
65
 
49
- Add to `settings.json` (Ctrl+Shift+, or Settings → Open JSON file):
66
+ Add to `settings.json` (Ctrl+Shift+, or Settings → Open JSON file) to forward the modified Enter keys pi uses:
50
67
 
51
68
  ```json
52
69
  {
@@ -54,12 +71,31 @@ Add to `settings.json` (Ctrl+Shift+, or Settings → Open JSON file):
54
71
  {
55
72
  "command": { "action": "sendInput", "input": "\u001b[13;2u" },
56
73
  "keys": "shift+enter"
74
+ },
75
+ {
76
+ "command": { "action": "sendInput", "input": "\u001b[13;3u" },
77
+ "keys": "alt+enter"
57
78
  }
58
79
  ]
59
80
  }
60
81
  ```
61
82
 
62
- If you already have an `actions` array, add the object to it.
83
+ - `Shift+Enter` inserts a new line.
84
+ - Windows Terminal binds `Alt+Enter` to fullscreen by default. That prevents pi from receiving `Alt+Enter` for follow-up queueing.
85
+ - Remapping `Alt+Enter` to `sendInput` forwards the real key chord to pi instead.
86
+
87
+ If you already have an `actions` array, add the objects to it. If the old fullscreen behavior persists, fully close and reopen Windows Terminal.
88
+
89
+ ## xfce4-terminal, terminator
90
+
91
+ These terminals have limited escape sequence support. Modified Enter keys like `Ctrl+Enter` and `Shift+Enter` cannot be distinguished from plain `Enter`, preventing custom keybindings such as `submit: ["ctrl+enter"]` from working.
92
+
93
+ For the best experience, use a terminal that supports the Kitty keyboard protocol:
94
+ - [Kitty](https://sw.kovidgoyal.net/kitty/)
95
+ - [Ghostty](https://ghostty.org/)
96
+ - [WezTerm](https://wezfurlong.org/wezterm/)
97
+ - [iTerm2](https://iterm2.com/)
98
+ - [Alacritty](https://github.com/alacritty/alacritty) (requires compilation with Kitty protocol support)
63
99
 
64
100
  ## IntelliJ IDEA (Integrated Terminal)
65
101
 
package/docs/tmux.md ADDED
@@ -0,0 +1,61 @@
1
+ # tmux Setup
2
+
3
+ Pi works inside tmux, but tmux strips modifier information from certain keys by default. Without configuration, `Shift+Enter` and `Ctrl+Enter` are usually indistinguishable from plain `Enter`.
4
+
5
+ ## Recommended Configuration
6
+
7
+ Add to `~/.tmux.conf`:
8
+
9
+ ```tmux
10
+ set -g extended-keys on
11
+ set -g extended-keys-format csi-u
12
+ ```
13
+
14
+ Then restart tmux fully:
15
+
16
+ ```bash
17
+ tmux kill-server
18
+ tmux
19
+ ```
20
+
21
+ Pi requests extended key reporting automatically when Kitty keyboard protocol is not available. With `extended-keys-format csi-u`, tmux forwards modified keys in CSI-u format, which is the most reliable configuration.
22
+
23
+ ## Why `csi-u` Is Recommended
24
+
25
+ With only:
26
+
27
+ ```tmux
28
+ set -g extended-keys on
29
+ ```
30
+
31
+ tmux defaults to `extended-keys-format xterm`. When an application requests extended key reporting, modified keys are forwarded in xterm `modifyOtherKeys` format such as:
32
+
33
+ - `Ctrl+C` → `\x1b[27;5;99~`
34
+ - `Ctrl+D` → `\x1b[27;5;100~`
35
+ - `Ctrl+Enter` → `\x1b[27;5;13~`
36
+
37
+ With `extended-keys-format csi-u`, the same keys are forwarded as:
38
+
39
+ - `Ctrl+C` → `\x1b[99;5u`
40
+ - `Ctrl+D` → `\x1b[100;5u`
41
+ - `Ctrl+Enter` → `\x1b[13;5u`
42
+
43
+ Pi supports both formats, but `csi-u` is the recommended tmux setup.
44
+
45
+ ## What This Fixes
46
+
47
+ Without tmux extended keys, modified Enter keys collapse to legacy sequences:
48
+
49
+ | Key | Without extkeys | With `csi-u` |
50
+ |-----|-----------------|--------------|
51
+ | Enter | `\r` | `\r` |
52
+ | Shift+Enter | `\r` | `\x1b[13;2u` |
53
+ | Ctrl+Enter | `\r` | `\x1b[13;5u` |
54
+ | Alt/Option+Enter | `\x1b\r` | `\x1b[13;3u` |
55
+
56
+ This affects the default keybindings (`Enter` to submit, `Shift+Enter` for newline) and any custom keybindings using modified Enter.
57
+
58
+ ## Requirements
59
+
60
+ - tmux 3.2 or later (run `tmux -V` to check)
61
+ - A terminal emulator that supports extended keys (Ghostty, Kitty, iTerm2, WezTerm, Windows Terminal)
package/docs/tree.md CHANGED
@@ -13,7 +13,7 @@ Sessions are stored as trees where each entry has an `id` and `parentId`. The "l
13
13
  | View | Flat list of user messages | Full tree structure |
14
14
  | Action | Extracts path to **new session file** | Changes leaf in **same session** |
15
15
  | Summary | Never | Optional (user prompted) |
16
- | Events | `session_before_fork` / `session_fork` | `session_before_tree` / `session_tree` |
16
+ | Events | `session_before_fork` / `session_start` (`reason: "fork"`) | `session_before_tree` / `session_tree` |
17
17
 
18
18
  ## Tree UI
19
19
 
@@ -33,18 +33,30 @@ Sessions are stored as trees where each entry has an `id` and `parentId`. The "l
33
33
  | Key | Action |
34
34
  |-----|--------|
35
35
  | ↑/↓ | Navigate (depth-first order) |
36
+ | ←/→ | Page up/down |
37
+ | Ctrl+←/Ctrl+→ or Alt+←/Alt+→ | Fold/unfold and jump between branch segments |
38
+ | Shift+L | Set or clear a label on the selected node |
39
+ | Shift+T | Toggle label timestamps |
36
40
  | Enter | Select node |
37
41
  | Escape/Ctrl+C | Cancel |
38
42
  | Ctrl+U | Toggle: user messages only |
39
43
  | Ctrl+O | Toggle: show all (including custom/label entries) |
40
44
 
45
+ `Ctrl+←` or `Alt+←` folds the current node if it is foldable. Foldable nodes are roots and branch segment starts that have visible children. If the current node is not foldable, or is already folded, the selection jumps up to the previous visible branch segment start.
46
+
47
+ `Ctrl+→` or `Alt+→` unfolds the current node if it is folded. Otherwise, the selection jumps down to the next visible branch segment start, or to the branch end when there is no further branch point.
48
+
41
49
  ### Display
42
50
 
43
51
  - Height: half terminal height
44
52
  - Current leaf marked with `← active`
45
53
  - Labels shown inline: `[label-name]`
54
+ - `Shift+T` shows the latest label-change timestamp next to labeled nodes
55
+ - Foldable branch starts show `⊟` in the connector. Folded branches show `⊞`
56
+ - Active path marker `•` appears after the fold indicator when applicable
57
+ - Search and filter changes reset all folds
46
58
  - Default filter hides `label` and `custom` entries (shown in Ctrl+O mode)
47
- - Children sorted by timestamp (oldest first)
59
+ - At each branch point, the active subtree is shown first; other sibling branches are sorted by timestamp (oldest first)
48
60
 
49
61
  ## Selection Behavior
50
62
 
@@ -132,7 +144,7 @@ Flow:
132
144
  4. Fire `session_before_tree` event (hook can cancel or provide summary)
133
145
  5. Run default summarizer if needed
134
146
  6. Switch leaf via `branch()` or `branchWithSummary()`
135
- 7. Update agent: `agent.replaceMessages(sessionManager.buildSessionContext().messages)`
147
+ 7. Update agent: `agent.state.messages = sessionManager.buildSessionContext().messages`
136
148
  8. Fire `session_tree` event
137
149
  9. Notify custom tools via session event
138
150
  10. Return result with `editorText` if user message was selected
package/docs/tui.md CHANGED
@@ -394,7 +394,7 @@ Components accept theme objects for styling.
394
394
  **In `renderCall`/`renderResult`**, use the `theme` parameter:
395
395
 
396
396
  ```typescript
397
- renderResult(result, options, theme) {
397
+ renderResult(result, options, theme, context) {
398
398
  // Use theme.fg() for foreground colors
399
399
  return new Text(theme.fg("success", "Done!"), 0, 0);
400
400
 
@@ -428,7 +428,7 @@ renderResult(result, options, theme) {
428
428
  import { getMarkdownTheme } from "@mariozechner/pi-coding-agent";
429
429
  import { Markdown } from "@mariozechner/pi-tui";
430
430
 
431
- renderResult(result, options, theme) {
431
+ renderResult(result, options, theme, context) {
432
432
  const mdTheme = getMarkdownTheme();
433
433
  return new Markdown(result.details.markdown, 0, 0, mdTheme);
434
434
  }
@@ -33,6 +33,8 @@ cp permission-gate.ts ~/.pi/agent/extensions/
33
33
  | `question.ts` | Demonstrates `ctx.ui.select()` for asking the user questions with custom UI |
34
34
  | `questionnaire.ts` | Multi-question input with tab bar navigation between questions |
35
35
  | `tool-override.ts` | Override built-in tools (e.g., add logging/access control to `read`) |
36
+ | `dynamic-tools.ts` | Register tools after startup (`session_start`) and at runtime via command, with prompt snippets and tool-specific prompt guidelines |
37
+ | `built-in-tool-renderer.ts` | Custom compact rendering for built-in tools (read, bash, edit, write) while keeping original behavior |
36
38
  | `minimal-mode.ts` | Override built-in tool rendering for minimal display (only tool calls, no output in collapsed mode) |
37
39
  | `truncated-tool.ts` | Wraps ripgrep with proper output truncation (50KB/2000 lines) |
38
40
  | `antigravity-image-gen.ts` | Generate images via Google Antigravity with optional save-to-disk modes |
@@ -50,6 +52,7 @@ cp permission-gate.ts ~/.pi/agent/extensions/
50
52
  | `qna.ts` | Extracts questions from last response into editor via `ctx.ui.setEditorText()` |
51
53
  | `status-line.ts` | Shows turn progress in footer via `ctx.ui.setStatus()` with themed colors |
52
54
  | `widget-placement.ts` | Shows widgets above and below the editor via `ctx.ui.setWidget()` placement |
55
+ | `hidden-thinking-label.ts` | Customizes the collapsed thinking label via `ctx.ui.setHiddenThinkingLabel()` |
53
56
  | `model-status.ts` | Shows model changes in status bar via `model_select` hook |
54
57
  | `snake.ts` | Snake game with custom UI, keyboard handling, and session persistence |
55
58
  | `send-user-message.ts` | Demonstrates `pi.sendUserMessage()` for sending user messages from extensions |
@@ -28,10 +28,9 @@
28
28
  import { randomUUID } from "node:crypto";
29
29
  import { existsSync, readFileSync } from "node:fs";
30
30
  import { mkdir, writeFile } from "node:fs/promises";
31
- import { homedir } from "node:os";
32
31
  import { join } from "node:path";
33
32
  import { StringEnum } from "@mariozechner/pi-ai";
34
- import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
33
+ import { type ExtensionAPI, getAgentDir, withFileMutationQueue } from "@mariozechner/pi-coding-agent";
35
34
  import { type Static, Type } from "@sinclair/typebox";
36
35
 
37
36
  const PROVIDER = "google-antigravity";
@@ -49,8 +48,10 @@ type SaveMode = (typeof SAVE_MODES)[number];
49
48
 
50
49
  const ANTIGRAVITY_ENDPOINT = "https://daily-cloudcode-pa.sandbox.googleapis.com";
51
50
 
51
+ const DEFAULT_ANTIGRAVITY_VERSION = "1.18.3";
52
+
52
53
  const ANTIGRAVITY_HEADERS = {
53
- "User-Agent": "antigravity/1.15.8 darwin/arm64",
54
+ "User-Agent": `antigravity/${process.env.PI_AI_ANTIGRAVITY_VERSION || DEFAULT_ANTIGRAVITY_VERSION} darwin/arm64`,
54
55
  "X-Goog-Api-Client": "google-cloud-sdk vscode_cloudshelleditor/0.1",
55
56
  "Client-Metadata": JSON.stringify({
56
57
  ideType: "IDE_UNSPECIFIED",
@@ -182,7 +183,8 @@ function readConfigFile(path: string): ExtensionConfig {
182
183
  }
183
184
 
184
185
  function loadConfig(cwd: string): ExtensionConfig {
185
- const globalConfig = readConfigFile(join(homedir(), ".pi", "agent", "extensions", "antigravity-image-gen.json"));
186
+ const globalPath = join(getAgentDir(), "extensions", "antigravity-image-gen.json");
187
+ const globalConfig = readConfigFile(globalPath);
186
188
  const projectConfig = readConfigFile(join(cwd, ".pi", "extensions", "antigravity-image-gen.json"));
187
189
  return { ...globalConfig, ...projectConfig };
188
190
  }
@@ -202,7 +204,8 @@ function resolveSaveConfig(params: ToolParams, cwd: string): SaveConfig {
202
204
  }
203
205
 
204
206
  if (mode === "global") {
205
- return { mode, outputDir: join(homedir(), ".pi", "agent", "generated-images") };
207
+ const outputDir = join(getAgentDir(), "generated-images");
208
+ return { mode, outputDir };
206
209
  }
207
210
 
208
211
  if (mode === "custom") {
@@ -225,12 +228,14 @@ function imageExtension(mimeType: string): string {
225
228
  }
226
229
 
227
230
  async function saveImage(base64Data: string, mimeType: string, outputDir: string): Promise<string> {
228
- await mkdir(outputDir, { recursive: true });
229
231
  const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
230
232
  const ext = imageExtension(mimeType);
231
233
  const filename = `image-${timestamp}-${randomUUID().slice(0, 8)}.${ext}`;
232
234
  const filePath = join(outputDir, filename);
233
- await writeFile(filePath, Buffer.from(base64Data, "base64"));
235
+ await withFileMutationQueue(filePath, async () => {
236
+ await mkdir(outputDir, { recursive: true });
237
+ await writeFile(filePath, Buffer.from(base64Data, "base64"));
238
+ });
234
239
  return filePath;
235
240
  }
236
241
 
@@ -0,0 +1,246 @@
1
+ /**
2
+ * Built-in Tool Renderer Example - Custom rendering for built-in tools
3
+ *
4
+ * Demonstrates how to override the rendering of built-in tools (read, bash,
5
+ * edit, write) without changing their behavior. Each tool is re-registered
6
+ * with the same name, delegating execution to the original implementation
7
+ * while providing compact custom renderCall/renderResult functions.
8
+ *
9
+ * This is useful for users who prefer more concise tool output, or who want
10
+ * to highlight specific information (e.g., showing only the diff stats for
11
+ * edit, or just the exit code for bash).
12
+ *
13
+ * How it works:
14
+ * - registerTool() with the same name as a built-in replaces it entirely
15
+ * - We create instances of the original tools via createReadTool(), etc.
16
+ * and delegate execute() to them
17
+ * - renderCall() controls what's shown when the tool is invoked
18
+ * - renderResult() controls what's shown after execution completes
19
+ * - The `expanded` flag in renderResult indicates whether the user has
20
+ * toggled the tool output open (via ctrl+e or clicking)
21
+ *
22
+ * Usage:
23
+ * pi -e ./built-in-tool-renderer.ts
24
+ */
25
+
26
+ import type { BashToolDetails, EditToolDetails, ExtensionAPI, ReadToolDetails } from "@mariozechner/pi-coding-agent";
27
+ import { createBashTool, createEditTool, createReadTool, createWriteTool } from "@mariozechner/pi-coding-agent";
28
+ import { Text } from "@mariozechner/pi-tui";
29
+
30
+ export default function (pi: ExtensionAPI) {
31
+ const cwd = process.cwd();
32
+
33
+ // --- Read tool: show path and line count ---
34
+ const originalRead = createReadTool(cwd);
35
+ pi.registerTool({
36
+ name: "read",
37
+ label: "read",
38
+ description: originalRead.description,
39
+ parameters: originalRead.parameters,
40
+
41
+ async execute(toolCallId, params, signal, onUpdate) {
42
+ return originalRead.execute(toolCallId, params, signal, onUpdate);
43
+ },
44
+
45
+ renderCall(args, theme, _context) {
46
+ let text = theme.fg("toolTitle", theme.bold("read "));
47
+ text += theme.fg("accent", args.path);
48
+ if (args.offset || args.limit) {
49
+ const parts: string[] = [];
50
+ if (args.offset) parts.push(`offset=${args.offset}`);
51
+ if (args.limit) parts.push(`limit=${args.limit}`);
52
+ text += theme.fg("dim", ` (${parts.join(", ")})`);
53
+ }
54
+ return new Text(text, 0, 0);
55
+ },
56
+
57
+ renderResult(result, { expanded, isPartial }, theme, _context) {
58
+ if (isPartial) return new Text(theme.fg("warning", "Reading..."), 0, 0);
59
+
60
+ const details = result.details as ReadToolDetails | undefined;
61
+ const content = result.content[0];
62
+
63
+ if (content?.type === "image") {
64
+ return new Text(theme.fg("success", "Image loaded"), 0, 0);
65
+ }
66
+
67
+ if (content?.type !== "text") {
68
+ return new Text(theme.fg("error", "No content"), 0, 0);
69
+ }
70
+
71
+ const lineCount = content.text.split("\n").length;
72
+ let text = theme.fg("success", `${lineCount} lines`);
73
+
74
+ if (details?.truncation?.truncated) {
75
+ text += theme.fg("warning", ` (truncated from ${details.truncation.totalLines})`);
76
+ }
77
+
78
+ if (expanded) {
79
+ const lines = content.text.split("\n").slice(0, 15);
80
+ for (const line of lines) {
81
+ text += `\n${theme.fg("dim", line)}`;
82
+ }
83
+ if (lineCount > 15) {
84
+ text += `\n${theme.fg("muted", `... ${lineCount - 15} more lines`)}`;
85
+ }
86
+ }
87
+
88
+ return new Text(text, 0, 0);
89
+ },
90
+ });
91
+
92
+ // --- Bash tool: show command and exit code ---
93
+ const originalBash = createBashTool(cwd);
94
+ pi.registerTool({
95
+ name: "bash",
96
+ label: "bash",
97
+ description: originalBash.description,
98
+ parameters: originalBash.parameters,
99
+
100
+ async execute(toolCallId, params, signal, onUpdate) {
101
+ return originalBash.execute(toolCallId, params, signal, onUpdate);
102
+ },
103
+
104
+ renderCall(args, theme, _context) {
105
+ let text = theme.fg("toolTitle", theme.bold("$ "));
106
+ const cmd = args.command.length > 80 ? `${args.command.slice(0, 77)}...` : args.command;
107
+ text += theme.fg("accent", cmd);
108
+ if (args.timeout) {
109
+ text += theme.fg("dim", ` (timeout: ${args.timeout}s)`);
110
+ }
111
+ return new Text(text, 0, 0);
112
+ },
113
+
114
+ renderResult(result, { expanded, isPartial }, theme, _context) {
115
+ if (isPartial) return new Text(theme.fg("warning", "Running..."), 0, 0);
116
+
117
+ const details = result.details as BashToolDetails | undefined;
118
+ const content = result.content[0];
119
+ const output = content?.type === "text" ? content.text : "";
120
+
121
+ const exitMatch = output.match(/exit code: (\d+)/);
122
+ const exitCode = exitMatch ? parseInt(exitMatch[1], 10) : null;
123
+ const lineCount = output.split("\n").filter((l) => l.trim()).length;
124
+
125
+ let text = "";
126
+ if (exitCode === 0 || exitCode === null) {
127
+ text += theme.fg("success", "done");
128
+ } else {
129
+ text += theme.fg("error", `exit ${exitCode}`);
130
+ }
131
+ text += theme.fg("dim", ` (${lineCount} lines)`);
132
+
133
+ if (details?.truncation?.truncated) {
134
+ text += theme.fg("warning", " [truncated]");
135
+ }
136
+
137
+ if (expanded) {
138
+ const lines = output.split("\n").slice(0, 20);
139
+ for (const line of lines) {
140
+ text += `\n${theme.fg("dim", line)}`;
141
+ }
142
+ if (output.split("\n").length > 20) {
143
+ text += `\n${theme.fg("muted", "... more output")}`;
144
+ }
145
+ }
146
+
147
+ return new Text(text, 0, 0);
148
+ },
149
+ });
150
+
151
+ // --- Edit tool: show path and diff stats ---
152
+ const originalEdit = createEditTool(cwd);
153
+ pi.registerTool({
154
+ name: "edit",
155
+ label: "edit",
156
+ description: originalEdit.description,
157
+ parameters: originalEdit.parameters,
158
+
159
+ async execute(toolCallId, params, signal, onUpdate) {
160
+ return originalEdit.execute(toolCallId, params, signal, onUpdate);
161
+ },
162
+
163
+ renderCall(args, theme, _context) {
164
+ let text = theme.fg("toolTitle", theme.bold("edit "));
165
+ text += theme.fg("accent", args.path);
166
+ return new Text(text, 0, 0);
167
+ },
168
+
169
+ renderResult(result, { expanded, isPartial }, theme, _context) {
170
+ if (isPartial) return new Text(theme.fg("warning", "Editing..."), 0, 0);
171
+
172
+ const details = result.details as EditToolDetails | undefined;
173
+ const content = result.content[0];
174
+
175
+ if (content?.type === "text" && content.text.startsWith("Error")) {
176
+ return new Text(theme.fg("error", content.text.split("\n")[0]), 0, 0);
177
+ }
178
+
179
+ if (!details?.diff) {
180
+ return new Text(theme.fg("success", "Applied"), 0, 0);
181
+ }
182
+
183
+ // Count additions and removals from the diff
184
+ const diffLines = details.diff.split("\n");
185
+ let additions = 0;
186
+ let removals = 0;
187
+ for (const line of diffLines) {
188
+ if (line.startsWith("+") && !line.startsWith("+++")) additions++;
189
+ if (line.startsWith("-") && !line.startsWith("---")) removals++;
190
+ }
191
+
192
+ let text = theme.fg("success", `+${additions}`);
193
+ text += theme.fg("dim", " / ");
194
+ text += theme.fg("error", `-${removals}`);
195
+
196
+ if (expanded) {
197
+ for (const line of diffLines.slice(0, 30)) {
198
+ if (line.startsWith("+") && !line.startsWith("+++")) {
199
+ text += `\n${theme.fg("success", line)}`;
200
+ } else if (line.startsWith("-") && !line.startsWith("---")) {
201
+ text += `\n${theme.fg("error", line)}`;
202
+ } else {
203
+ text += `\n${theme.fg("dim", line)}`;
204
+ }
205
+ }
206
+ if (diffLines.length > 30) {
207
+ text += `\n${theme.fg("muted", `... ${diffLines.length - 30} more diff lines`)}`;
208
+ }
209
+ }
210
+
211
+ return new Text(text, 0, 0);
212
+ },
213
+ });
214
+
215
+ // --- Write tool: show path and size ---
216
+ const originalWrite = createWriteTool(cwd);
217
+ pi.registerTool({
218
+ name: "write",
219
+ label: "write",
220
+ description: originalWrite.description,
221
+ parameters: originalWrite.parameters,
222
+
223
+ async execute(toolCallId, params, signal, onUpdate) {
224
+ return originalWrite.execute(toolCallId, params, signal, onUpdate);
225
+ },
226
+
227
+ renderCall(args, theme, _context) {
228
+ let text = theme.fg("toolTitle", theme.bold("write "));
229
+ text += theme.fg("accent", args.path);
230
+ const lineCount = args.content.split("\n").length;
231
+ text += theme.fg("dim", ` (${lineCount} lines)`);
232
+ return new Text(text, 0, 0);
233
+ },
234
+
235
+ renderResult(result, { isPartial }, theme, _context) {
236
+ if (isPartial) return new Text(theme.fg("warning", "Writing..."), 0, 0);
237
+
238
+ const content = result.content[0];
239
+ if (content?.type === "text" && content.text.startsWith("Error")) {
240
+ return new Text(theme.fg("error", content.text.split("\n")[0]), 0, 0);
241
+ }
242
+
243
+ return new Text(theme.fg("success", "Written"), 0, 0);
244
+ },
245
+ });
246
+ }
@@ -60,10 +60,10 @@ export default function commandsExtension(pi: ExtensionAPI) {
60
60
  if (selected && !selected.startsWith("---")) {
61
61
  const cmdName = selected.split(" - ")[0].slice(1); // Remove leading /
62
62
  const cmd = commands.find((c) => c.name === cmdName);
63
- if (cmd?.path) {
64
- const showPath = await ctx.ui.confirm(cmd.name, `View source path?\n${cmd.path}`);
63
+ if (cmd?.sourceInfo.path) {
64
+ const showPath = await ctx.ui.confirm(cmd.name, `View source path?\n${cmd.sourceInfo.path}`);
65
65
  if (showPath) {
66
- ctx.ui.notify(cmd.path, "info");
66
+ ctx.ui.notify(cmd.sourceInfo.path, "info");
67
67
  }
68
68
  }
69
69
  }