@vaclav-synacek/pi-coding-agent-termux 0.45.7

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 (478) hide show
  1. package/CHANGELOG.md +1961 -0
  2. package/README.md +1392 -0
  3. package/dist/cli/args.d.ts +42 -0
  4. package/dist/cli/args.d.ts.map +1 -0
  5. package/dist/cli/args.js +248 -0
  6. package/dist/cli/args.js.map +1 -0
  7. package/dist/cli/file-processor.d.ts +15 -0
  8. package/dist/cli/file-processor.d.ts.map +1 -0
  9. package/dist/cli/file-processor.js +79 -0
  10. package/dist/cli/file-processor.js.map +1 -0
  11. package/dist/cli/list-models.d.ts +9 -0
  12. package/dist/cli/list-models.d.ts.map +1 -0
  13. package/dist/cli/list-models.js +92 -0
  14. package/dist/cli/list-models.js.map +1 -0
  15. package/dist/cli/session-picker.d.ts +9 -0
  16. package/dist/cli/session-picker.d.ts.map +1 -0
  17. package/dist/cli/session-picker.js +32 -0
  18. package/dist/cli/session-picker.js.map +1 -0
  19. package/dist/cli.d.ts +3 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +10 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/config.d.ts +61 -0
  24. package/dist/config.d.ts.map +1 -0
  25. package/dist/config.js +141 -0
  26. package/dist/config.js.map +1 -0
  27. package/dist/core/agent-session.d.ts +523 -0
  28. package/dist/core/agent-session.d.ts.map +1 -0
  29. package/dist/core/agent-session.js +1795 -0
  30. package/dist/core/agent-session.js.map +1 -0
  31. package/dist/core/auth-storage.d.ts +112 -0
  32. package/dist/core/auth-storage.d.ts.map +1 -0
  33. package/dist/core/auth-storage.js +297 -0
  34. package/dist/core/auth-storage.js.map +1 -0
  35. package/dist/core/bash-executor.d.ts +47 -0
  36. package/dist/core/bash-executor.d.ts.map +1 -0
  37. package/dist/core/bash-executor.js +211 -0
  38. package/dist/core/bash-executor.js.map +1 -0
  39. package/dist/core/compaction/branch-summarization.d.ts +84 -0
  40. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  41. package/dist/core/compaction/branch-summarization.js +235 -0
  42. package/dist/core/compaction/branch-summarization.js.map +1 -0
  43. package/dist/core/compaction/compaction.d.ts +110 -0
  44. package/dist/core/compaction/compaction.d.ts.map +1 -0
  45. package/dist/core/compaction/compaction.js +559 -0
  46. package/dist/core/compaction/compaction.js.map +1 -0
  47. package/dist/core/compaction/index.d.ts +7 -0
  48. package/dist/core/compaction/index.d.ts.map +1 -0
  49. package/dist/core/compaction/index.js +7 -0
  50. package/dist/core/compaction/index.js.map +1 -0
  51. package/dist/core/compaction/utils.d.ts +35 -0
  52. package/dist/core/compaction/utils.d.ts.map +1 -0
  53. package/dist/core/compaction/utils.js +138 -0
  54. package/dist/core/compaction/utils.js.map +1 -0
  55. package/dist/core/event-bus.d.ts +9 -0
  56. package/dist/core/event-bus.d.ts.map +1 -0
  57. package/dist/core/event-bus.js +25 -0
  58. package/dist/core/event-bus.js.map +1 -0
  59. package/dist/core/exec.d.ts +29 -0
  60. package/dist/core/exec.d.ts.map +1 -0
  61. package/dist/core/exec.js +71 -0
  62. package/dist/core/exec.js.map +1 -0
  63. package/dist/core/export-html/index.d.ts +17 -0
  64. package/dist/core/export-html/index.d.ts.map +1 -0
  65. package/dist/core/export-html/index.js +193 -0
  66. package/dist/core/export-html/index.js.map +1 -0
  67. package/dist/core/export-html/template.css +910 -0
  68. package/dist/core/export-html/template.html +54 -0
  69. package/dist/core/export-html/template.js +1329 -0
  70. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  71. package/dist/core/export-html/vendor/marked.min.js +6 -0
  72. package/dist/core/extensions/index.d.ts +10 -0
  73. package/dist/core/extensions/index.d.ts.map +1 -0
  74. package/dist/core/extensions/index.js +9 -0
  75. package/dist/core/extensions/index.js.map +1 -0
  76. package/dist/core/extensions/loader.d.ts +25 -0
  77. package/dist/core/extensions/loader.d.ts.map +1 -0
  78. package/dist/core/extensions/loader.js +383 -0
  79. package/dist/core/extensions/loader.js.map +1 -0
  80. package/dist/core/extensions/runner.d.ts +89 -0
  81. package/dist/core/extensions/runner.d.ts.map +1 -0
  82. package/dist/core/extensions/runner.js +406 -0
  83. package/dist/core/extensions/runner.js.map +1 -0
  84. package/dist/core/extensions/types.d.ts +654 -0
  85. package/dist/core/extensions/types.d.ts.map +1 -0
  86. package/dist/core/extensions/types.js +32 -0
  87. package/dist/core/extensions/types.js.map +1 -0
  88. package/dist/core/extensions/wrapper.d.ts +27 -0
  89. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  90. package/dist/core/extensions/wrapper.js +102 -0
  91. package/dist/core/extensions/wrapper.js.map +1 -0
  92. package/dist/core/footer-data-provider.d.ts +25 -0
  93. package/dist/core/footer-data-provider.d.ts.map +1 -0
  94. package/dist/core/footer-data-provider.js +121 -0
  95. package/dist/core/footer-data-provider.js.map +1 -0
  96. package/dist/core/index.d.ts +9 -0
  97. package/dist/core/index.d.ts.map +1 -0
  98. package/dist/core/index.js +9 -0
  99. package/dist/core/index.js.map +1 -0
  100. package/dist/core/keybindings.d.ts +59 -0
  101. package/dist/core/keybindings.d.ts.map +1 -0
  102. package/dist/core/keybindings.js +151 -0
  103. package/dist/core/keybindings.js.map +1 -0
  104. package/dist/core/messages.d.ts +77 -0
  105. package/dist/core/messages.d.ts.map +1 -0
  106. package/dist/core/messages.js +123 -0
  107. package/dist/core/messages.js.map +1 -0
  108. package/dist/core/model-registry.d.ts +57 -0
  109. package/dist/core/model-registry.d.ts.map +1 -0
  110. package/dist/core/model-registry.js +314 -0
  111. package/dist/core/model-registry.js.map +1 -0
  112. package/dist/core/model-resolver.d.ts +76 -0
  113. package/dist/core/model-resolver.d.ts.map +1 -0
  114. package/dist/core/model-resolver.js +308 -0
  115. package/dist/core/model-resolver.js.map +1 -0
  116. package/dist/core/prompt-templates.d.ts +40 -0
  117. package/dist/core/prompt-templates.d.ts.map +1 -0
  118. package/dist/core/prompt-templates.js +197 -0
  119. package/dist/core/prompt-templates.js.map +1 -0
  120. package/dist/core/sdk.d.ts +181 -0
  121. package/dist/core/sdk.d.ts.map +1 -0
  122. package/dist/core/sdk.js +466 -0
  123. package/dist/core/sdk.js.map +1 -0
  124. package/dist/core/session-manager.d.ts +313 -0
  125. package/dist/core/session-manager.d.ts.map +1 -0
  126. package/dist/core/session-manager.js +996 -0
  127. package/dist/core/session-manager.js.map +1 -0
  128. package/dist/core/settings-manager.d.ts +138 -0
  129. package/dist/core/settings-manager.d.ts.map +1 -0
  130. package/dist/core/settings-manager.js +327 -0
  131. package/dist/core/settings-manager.js.map +1 -0
  132. package/dist/core/skills.d.ts +50 -0
  133. package/dist/core/skills.d.ts.map +1 -0
  134. package/dist/core/skills.js +338 -0
  135. package/dist/core/skills.js.map +1 -0
  136. package/dist/core/system-prompt.d.ts +48 -0
  137. package/dist/core/system-prompt.d.ts.map +1 -0
  138. package/dist/core/system-prompt.js +224 -0
  139. package/dist/core/system-prompt.js.map +1 -0
  140. package/dist/core/timings.d.ts +7 -0
  141. package/dist/core/timings.d.ts.map +1 -0
  142. package/dist/core/timings.js +25 -0
  143. package/dist/core/timings.js.map +1 -0
  144. package/dist/core/tools/bash.d.ts +42 -0
  145. package/dist/core/tools/bash.d.ts.map +1 -0
  146. package/dist/core/tools/bash.js +223 -0
  147. package/dist/core/tools/bash.js.map +1 -0
  148. package/dist/core/tools/edit-diff.d.ts +33 -0
  149. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  150. package/dist/core/tools/edit-diff.js +171 -0
  151. package/dist/core/tools/edit-diff.js.map +1 -0
  152. package/dist/core/tools/edit.d.ts +37 -0
  153. package/dist/core/tools/edit.d.ts.map +1 -0
  154. package/dist/core/tools/edit.js +143 -0
  155. package/dist/core/tools/edit.js.map +1 -0
  156. package/dist/core/tools/find.d.ts +37 -0
  157. package/dist/core/tools/find.d.ts.map +1 -0
  158. package/dist/core/tools/find.js +206 -0
  159. package/dist/core/tools/find.js.map +1 -0
  160. package/dist/core/tools/grep.d.ts +43 -0
  161. package/dist/core/tools/grep.d.ts.map +1 -0
  162. package/dist/core/tools/grep.js +239 -0
  163. package/dist/core/tools/grep.js.map +1 -0
  164. package/dist/core/tools/index.d.ts +70 -0
  165. package/dist/core/tools/index.d.ts.map +1 -0
  166. package/dist/core/tools/index.js +56 -0
  167. package/dist/core/tools/index.js.map +1 -0
  168. package/dist/core/tools/ls.d.ts +38 -0
  169. package/dist/core/tools/ls.d.ts.map +1 -0
  170. package/dist/core/tools/ls.js +118 -0
  171. package/dist/core/tools/ls.js.map +1 -0
  172. package/dist/core/tools/path-utils.d.ts +8 -0
  173. package/dist/core/tools/path-utils.d.ts.map +1 -0
  174. package/dist/core/tools/path-utils.js +53 -0
  175. package/dist/core/tools/path-utils.js.map +1 -0
  176. package/dist/core/tools/read.d.ts +37 -0
  177. package/dist/core/tools/read.d.ts.map +1 -0
  178. package/dist/core/tools/read.js +165 -0
  179. package/dist/core/tools/read.js.map +1 -0
  180. package/dist/core/tools/truncate.d.ts +70 -0
  181. package/dist/core/tools/truncate.d.ts.map +1 -0
  182. package/dist/core/tools/truncate.js +205 -0
  183. package/dist/core/tools/truncate.js.map +1 -0
  184. package/dist/core/tools/write.d.ts +27 -0
  185. package/dist/core/tools/write.d.ts.map +1 -0
  186. package/dist/core/tools/write.js +78 -0
  187. package/dist/core/tools/write.js.map +1 -0
  188. package/dist/index.d.ts +19 -0
  189. package/dist/index.d.ts.map +1 -0
  190. package/dist/index.js +35 -0
  191. package/dist/index.js.map +1 -0
  192. package/dist/main.d.ts +8 -0
  193. package/dist/main.d.ts.map +1 -0
  194. package/dist/main.js +354 -0
  195. package/dist/main.js.map +1 -0
  196. package/dist/migrations.d.ts +33 -0
  197. package/dist/migrations.d.ts.map +1 -0
  198. package/dist/migrations.js +261 -0
  199. package/dist/migrations.js.map +1 -0
  200. package/dist/modes/index.d.ts +9 -0
  201. package/dist/modes/index.d.ts.map +1 -0
  202. package/dist/modes/index.js +8 -0
  203. package/dist/modes/index.js.map +1 -0
  204. package/dist/modes/interactive/components/armin.d.ts +34 -0
  205. package/dist/modes/interactive/components/armin.d.ts.map +1 -0
  206. package/dist/modes/interactive/components/armin.js +333 -0
  207. package/dist/modes/interactive/components/armin.js.map +1 -0
  208. package/dist/modes/interactive/components/assistant-message.d.ts +15 -0
  209. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  210. package/dist/modes/interactive/components/assistant-message.js +89 -0
  211. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  212. package/dist/modes/interactive/components/bash-execution.d.ts +35 -0
  213. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  214. package/dist/modes/interactive/components/bash-execution.js +161 -0
  215. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  216. package/dist/modes/interactive/components/bordered-loader.d.ts +12 -0
  217. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  218. package/dist/modes/interactive/components/bordered-loader.js +30 -0
  219. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  220. package/dist/modes/interactive/components/branch-summary-message.d.ts +15 -0
  221. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  222. package/dist/modes/interactive/components/branch-summary-message.js +39 -0
  223. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  224. package/dist/modes/interactive/components/compaction-summary-message.d.ts +15 -0
  225. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  226. package/dist/modes/interactive/components/compaction-summary-message.js +40 -0
  227. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  228. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  229. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  230. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  231. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  232. package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  233. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  234. package/dist/modes/interactive/components/custom-editor.js +69 -0
  235. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  236. package/dist/modes/interactive/components/custom-message.d.ts +19 -0
  237. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  238. package/dist/modes/interactive/components/custom-message.js +84 -0
  239. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  240. package/dist/modes/interactive/components/diff.d.ts +12 -0
  241. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  242. package/dist/modes/interactive/components/diff.js +133 -0
  243. package/dist/modes/interactive/components/diff.js.map +1 -0
  244. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  245. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  246. package/dist/modes/interactive/components/dynamic-border.js +21 -0
  247. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  248. package/dist/modes/interactive/components/extension-editor.d.ts +15 -0
  249. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  250. package/dist/modes/interactive/components/extension-editor.js +96 -0
  251. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  252. package/dist/modes/interactive/components/extension-input.d.ts +20 -0
  253. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  254. package/dist/modes/interactive/components/extension-input.js +51 -0
  255. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  256. package/dist/modes/interactive/components/extension-selector.d.ts +24 -0
  257. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  258. package/dist/modes/interactive/components/extension-selector.js +73 -0
  259. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  260. package/dist/modes/interactive/components/footer.d.ts +26 -0
  261. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  262. package/dist/modes/interactive/components/footer.js +207 -0
  263. package/dist/modes/interactive/components/footer.js.map +1 -0
  264. package/dist/modes/interactive/components/index.d.ts +29 -0
  265. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  266. package/dist/modes/interactive/components/index.js +30 -0
  267. package/dist/modes/interactive/components/index.js.map +1 -0
  268. package/dist/modes/interactive/components/login-dialog.d.ts +39 -0
  269. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  270. package/dist/modes/interactive/components/login-dialog.js +135 -0
  271. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  272. package/dist/modes/interactive/components/model-selector.d.ts +35 -0
  273. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  274. package/dist/modes/interactive/components/model-selector.js +211 -0
  275. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  276. package/dist/modes/interactive/components/oauth-selector.d.ts +19 -0
  277. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  278. package/dist/modes/interactive/components/oauth-selector.js +98 -0
  279. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  280. package/dist/modes/interactive/components/scoped-models-selector.d.ts +46 -0
  281. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  282. package/dist/modes/interactive/components/scoped-models-selector.js +258 -0
  283. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  284. package/dist/modes/interactive/components/session-selector.d.ts +44 -0
  285. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  286. package/dist/modes/interactive/components/session-selector.js +311 -0
  287. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  288. package/dist/modes/interactive/components/settings-selector.d.ts +43 -0
  289. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  290. package/dist/modes/interactive/components/settings-selector.js +219 -0
  291. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  292. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  293. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  294. package/dist/modes/interactive/components/show-images-selector.js +35 -0
  295. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  296. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  297. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  298. package/dist/modes/interactive/components/theme-selector.js +46 -0
  299. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  300. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  301. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  302. package/dist/modes/interactive/components/thinking-selector.js +47 -0
  303. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  304. package/dist/modes/interactive/components/tool-execution.d.ts +70 -0
  305. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  306. package/dist/modes/interactive/components/tool-execution.js +606 -0
  307. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  308. package/dist/modes/interactive/components/tree-selector.d.ts +52 -0
  309. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  310. package/dist/modes/interactive/components/tree-selector.js +745 -0
  311. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  312. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  313. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  314. package/dist/modes/interactive/components/user-message-selector.js +113 -0
  315. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  316. package/dist/modes/interactive/components/user-message.d.ts +8 -0
  317. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  318. package/dist/modes/interactive/components/user-message.js +16 -0
  319. package/dist/modes/interactive/components/user-message.js.map +1 -0
  320. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  321. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  322. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  323. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  324. package/dist/modes/interactive/interactive-mode.d.ts +261 -0
  325. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  326. package/dist/modes/interactive/interactive-mode.js +3194 -0
  327. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  328. package/dist/modes/interactive/theme/dark.json +85 -0
  329. package/dist/modes/interactive/theme/light.json +84 -0
  330. package/dist/modes/interactive/theme/theme-schema.json +308 -0
  331. package/dist/modes/interactive/theme/theme.d.ts +71 -0
  332. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  333. package/dist/modes/interactive/theme/theme.js +893 -0
  334. package/dist/modes/interactive/theme/theme.js.map +1 -0
  335. package/dist/modes/print-mode.d.ts +28 -0
  336. package/dist/modes/print-mode.d.ts.map +1 -0
  337. package/dist/modes/print-mode.js +140 -0
  338. package/dist/modes/print-mode.js.map +1 -0
  339. package/dist/modes/rpc/rpc-client.d.ts +209 -0
  340. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  341. package/dist/modes/rpc/rpc-client.js +392 -0
  342. package/dist/modes/rpc/rpc-client.js.map +1 -0
  343. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  344. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  345. package/dist/modes/rpc/rpc-mode.js +486 -0
  346. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  347. package/dist/modes/rpc/rpc-types.d.ts +372 -0
  348. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  349. package/dist/modes/rpc/rpc-types.js +8 -0
  350. package/dist/modes/rpc/rpc-types.js.map +1 -0
  351. package/dist/utils/changelog.d.ts +21 -0
  352. package/dist/utils/changelog.d.ts.map +1 -0
  353. package/dist/utils/changelog.js +87 -0
  354. package/dist/utils/changelog.js.map +1 -0
  355. package/dist/utils/clipboard-image.d.ts +11 -0
  356. package/dist/utils/clipboard-image.d.ts.map +1 -0
  357. package/dist/utils/clipboard-image.js +129 -0
  358. package/dist/utils/clipboard-image.js.map +1 -0
  359. package/dist/utils/clipboard.d.ts +2 -0
  360. package/dist/utils/clipboard.d.ts.map +1 -0
  361. package/dist/utils/clipboard.js +73 -0
  362. package/dist/utils/clipboard.js.map +1 -0
  363. package/dist/utils/image-convert.d.ts +9 -0
  364. package/dist/utils/image-convert.d.ts.map +1 -0
  365. package/dist/utils/image-convert.js +31 -0
  366. package/dist/utils/image-convert.js.map +1 -0
  367. package/dist/utils/image-resize.d.ts +36 -0
  368. package/dist/utils/image-resize.d.ts.map +1 -0
  369. package/dist/utils/image-resize.js +188 -0
  370. package/dist/utils/image-resize.js.map +1 -0
  371. package/dist/utils/mime.d.ts +2 -0
  372. package/dist/utils/mime.d.ts.map +1 -0
  373. package/dist/utils/mime.js +26 -0
  374. package/dist/utils/mime.js.map +1 -0
  375. package/dist/utils/shell.d.ts +26 -0
  376. package/dist/utils/shell.d.ts.map +1 -0
  377. package/dist/utils/shell.js +151 -0
  378. package/dist/utils/shell.js.map +1 -0
  379. package/dist/utils/tools-manager.d.ts +3 -0
  380. package/dist/utils/tools-manager.d.ts.map +1 -0
  381. package/dist/utils/tools-manager.js +187 -0
  382. package/dist/utils/tools-manager.js.map +1 -0
  383. package/dist/utils/vips.d.ts +11 -0
  384. package/dist/utils/vips.d.ts.map +1 -0
  385. package/dist/utils/vips.js +35 -0
  386. package/dist/utils/vips.js.map +1 -0
  387. package/docs/compaction.md +388 -0
  388. package/docs/extensions.md +1524 -0
  389. package/docs/rpc.md +1046 -0
  390. package/docs/sdk.md +1024 -0
  391. package/docs/session.md +255 -0
  392. package/docs/skills.md +317 -0
  393. package/docs/theme.md +617 -0
  394. package/docs/tree.md +201 -0
  395. package/docs/tui.md +797 -0
  396. package/examples/README.md +24 -0
  397. package/examples/extensions/README.md +168 -0
  398. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  399. package/examples/extensions/chalk-logger.ts +26 -0
  400. package/examples/extensions/claude-rules.ts +86 -0
  401. package/examples/extensions/confirm-destructive.ts +59 -0
  402. package/examples/extensions/custom-compaction.ts +114 -0
  403. package/examples/extensions/custom-footer.ts +64 -0
  404. package/examples/extensions/custom-header.ts +72 -0
  405. package/examples/extensions/dirty-repo-guard.ts +56 -0
  406. package/examples/extensions/doom-overlay/README.md +46 -0
  407. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  408. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  409. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  410. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  411. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  412. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  413. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  414. package/examples/extensions/doom-overlay/index.ts +74 -0
  415. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  416. package/examples/extensions/file-trigger.ts +41 -0
  417. package/examples/extensions/git-checkpoint.ts +53 -0
  418. package/examples/extensions/handoff.ts +150 -0
  419. package/examples/extensions/hello.ts +25 -0
  420. package/examples/extensions/interactive-shell.ts +196 -0
  421. package/examples/extensions/mac-system-theme.ts +47 -0
  422. package/examples/extensions/modal-editor.ts +85 -0
  423. package/examples/extensions/model-status.ts +31 -0
  424. package/examples/extensions/notify.ts +25 -0
  425. package/examples/extensions/overlay-qa-tests.ts +881 -0
  426. package/examples/extensions/overlay-test.ts +145 -0
  427. package/examples/extensions/permission-gate.ts +34 -0
  428. package/examples/extensions/pirate.ts +47 -0
  429. package/examples/extensions/plan-mode/README.md +65 -0
  430. package/examples/extensions/plan-mode/index.ts +340 -0
  431. package/examples/extensions/plan-mode/utils.ts +168 -0
  432. package/examples/extensions/preset.ts +398 -0
  433. package/examples/extensions/protected-paths.ts +30 -0
  434. package/examples/extensions/qna.ts +119 -0
  435. package/examples/extensions/question.ts +277 -0
  436. package/examples/extensions/questionnaire.ts +427 -0
  437. package/examples/extensions/rainbow-editor.ts +95 -0
  438. package/examples/extensions/sandbox/index.ts +318 -0
  439. package/examples/extensions/sandbox/package-lock.json +92 -0
  440. package/examples/extensions/sandbox/package.json +19 -0
  441. package/examples/extensions/send-user-message.ts +97 -0
  442. package/examples/extensions/shutdown-command.ts +63 -0
  443. package/examples/extensions/snake.ts +343 -0
  444. package/examples/extensions/ssh.ts +220 -0
  445. package/examples/extensions/status-line.ts +40 -0
  446. package/examples/extensions/subagent/README.md +172 -0
  447. package/examples/extensions/subagent/agents/planner.md +37 -0
  448. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  449. package/examples/extensions/subagent/agents/scout.md +50 -0
  450. package/examples/extensions/subagent/agents/worker.md +24 -0
  451. package/examples/extensions/subagent/agents.ts +156 -0
  452. package/examples/extensions/subagent/index.ts +963 -0
  453. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  454. package/examples/extensions/subagent/prompts/implement.md +10 -0
  455. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  456. package/examples/extensions/summarize.ts +195 -0
  457. package/examples/extensions/timed-confirm.ts +70 -0
  458. package/examples/extensions/todo.ts +299 -0
  459. package/examples/extensions/tool-override.ts +143 -0
  460. package/examples/extensions/tools.ts +146 -0
  461. package/examples/extensions/truncated-tool.ts +192 -0
  462. package/examples/extensions/with-deps/index.ts +36 -0
  463. package/examples/extensions/with-deps/package-lock.json +31 -0
  464. package/examples/extensions/with-deps/package.json +22 -0
  465. package/examples/sdk/01-minimal.ts +22 -0
  466. package/examples/sdk/02-custom-model.ts +49 -0
  467. package/examples/sdk/03-custom-prompt.ts +44 -0
  468. package/examples/sdk/04-skills.ts +47 -0
  469. package/examples/sdk/05-tools.ts +56 -0
  470. package/examples/sdk/06-extensions.ts +79 -0
  471. package/examples/sdk/07-context-files.ts +36 -0
  472. package/examples/sdk/08-prompt-templates.ts +42 -0
  473. package/examples/sdk/09-api-keys-and-oauth.ts +55 -0
  474. package/examples/sdk/10-settings.ts +38 -0
  475. package/examples/sdk/11-sessions.ts +48 -0
  476. package/examples/sdk/12-full-control.ts +72 -0
  477. package/examples/sdk/README.md +150 -0
  478. package/package.json +88 -0
package/docs/sdk.md ADDED
@@ -0,0 +1,1024 @@
1
+ > pi can help you use the SDK. Ask it to build an integration for your use case.
2
+
3
+ # SDK
4
+
5
+ The SDK provides programmatic access to pi's agent capabilities. Use it to embed pi in other applications, build custom interfaces, or integrate with automated workflows.
6
+
7
+ **Example use cases:**
8
+ - Build a custom UI (web, desktop, mobile)
9
+ - Integrate agent capabilities into existing applications
10
+ - Create automated pipelines with agent reasoning
11
+ - Build custom tools that spawn sub-agents
12
+ - Test agent behavior programmatically
13
+
14
+ See [examples/sdk/](../examples/sdk/) for working examples from minimal to full control.
15
+
16
+ ## Quick Start
17
+
18
+ ```typescript
19
+ import { createAgentSession, discoverAuthStorage, discoverModels, SessionManager } from "@mariozechner/pi-coding-agent";
20
+
21
+ // Set up credential storage and model registry
22
+ const authStorage = discoverAuthStorage();
23
+ const modelRegistry = discoverModels(authStorage);
24
+
25
+ const { session } = await createAgentSession({
26
+ sessionManager: SessionManager.inMemory(),
27
+ authStorage,
28
+ modelRegistry,
29
+ });
30
+
31
+ session.subscribe((event) => {
32
+ if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
33
+ process.stdout.write(event.assistantMessageEvent.delta);
34
+ }
35
+ });
36
+
37
+ await session.prompt("What files are in the current directory?");
38
+ ```
39
+
40
+ ## Installation
41
+
42
+ ```bash
43
+ npm install @mariozechner/pi-coding-agent
44
+ ```
45
+
46
+ The SDK is included in the main package. No separate installation needed.
47
+
48
+ ## Core Concepts
49
+
50
+ ### createAgentSession()
51
+
52
+ The main factory function. Creates an `AgentSession` with configurable options.
53
+
54
+ **Philosophy:** "Omit to discover, provide to override."
55
+ - Omit an option → pi discovers/loads from standard locations
56
+ - Provide an option → your value is used, discovery skipped for that option
57
+
58
+ ```typescript
59
+ import { createAgentSession } from "@mariozechner/pi-coding-agent";
60
+
61
+ // Minimal: all defaults (discovers everything from cwd and ~/.pi/agent)
62
+ const { session } = await createAgentSession();
63
+
64
+ // Custom: override specific options
65
+ const { session } = await createAgentSession({
66
+ model: myModel,
67
+ systemPrompt: "You are helpful.",
68
+ tools: [readTool, bashTool],
69
+ sessionManager: SessionManager.inMemory(),
70
+ });
71
+ ```
72
+
73
+ ### AgentSession
74
+
75
+ The session manages the agent lifecycle, message history, and event streaming.
76
+
77
+ ```typescript
78
+ interface AgentSession {
79
+ // Send a prompt and wait for completion
80
+ // If streaming, requires streamingBehavior option to queue the message
81
+ prompt(text: string, options?: PromptOptions): Promise<void>;
82
+
83
+ // Queue messages during streaming
84
+ steer(text: string): Promise<void>; // Interrupt: delivered after current tool, skips remaining
85
+ followUp(text: string): Promise<void>; // Wait: delivered only when agent finishes
86
+
87
+ // Subscribe to events (returns unsubscribe function)
88
+ subscribe(listener: (event: AgentSessionEvent) => void): () => void;
89
+
90
+ // Session info
91
+ sessionFile: string | undefined; // undefined for in-memory
92
+ sessionId: string;
93
+
94
+ // Model control
95
+ setModel(model: Model): Promise<void>;
96
+ setThinkingLevel(level: ThinkingLevel): void;
97
+ cycleModel(): Promise<ModelCycleResult | undefined>;
98
+ cycleThinkingLevel(): ThinkingLevel | undefined;
99
+
100
+ // State access
101
+ agent: Agent;
102
+ model: Model | undefined;
103
+ thinkingLevel: ThinkingLevel;
104
+ messages: AgentMessage[];
105
+ isStreaming: boolean;
106
+
107
+ // Session management
108
+ newSession(options?: { parentSession?: string }): Promise<boolean>; // Returns false if cancelled by hook
109
+ switchSession(sessionPath: string): Promise<boolean>;
110
+
111
+ // Forking
112
+ fork(entryId: string): Promise<{ selectedText: string; cancelled: boolean }>; // Creates new session file
113
+ navigateTree(targetId: string, options?: { summarize?: boolean }): Promise<{ editorText?: string; cancelled: boolean }>; // In-place navigation
114
+
115
+ // Hook message injection
116
+ sendHookMessage(message: HookMessage, triggerTurn?: boolean): Promise<void>;
117
+
118
+ // Compaction
119
+ compact(customInstructions?: string): Promise<CompactionResult>;
120
+ abortCompaction(): void;
121
+
122
+ // Abort current operation
123
+ abort(): Promise<void>;
124
+
125
+ // Cleanup
126
+ dispose(): void;
127
+ }
128
+ ```
129
+
130
+ ### Prompting and Message Queueing
131
+
132
+ The `prompt()` method handles prompt templates, extension commands, and message sending:
133
+
134
+ ```typescript
135
+ // Basic prompt (when not streaming)
136
+ await session.prompt("What files are here?");
137
+
138
+ // With images
139
+ await session.prompt("What's in this image?", {
140
+ images: [{ type: "image", source: { type: "base64", mediaType: "image/png", data: "..." } }]
141
+ });
142
+
143
+ // During streaming: must specify how to queue the message
144
+ await session.prompt("Stop and do this instead", { streamingBehavior: "steer" });
145
+ await session.prompt("After you're done, also check X", { streamingBehavior: "followUp" });
146
+ ```
147
+
148
+ **Behavior:**
149
+ - **Extension commands** (e.g., `/mycommand`): Execute immediately, even during streaming. They manage their own LLM interaction via `pi.sendMessage()`.
150
+ - **File-based prompt templates** (from `.md` files): Expanded to their content before sending/queueing.
151
+ - **During streaming without `streamingBehavior`**: Throws an error. Use `steer()` or `followUp()` directly, or specify the option.
152
+
153
+ For explicit queueing during streaming:
154
+
155
+ ```typescript
156
+ // Interrupt the agent (delivered after current tool, skips remaining tools)
157
+ await session.steer("New instruction");
158
+
159
+ // Wait for agent to finish (delivered only when agent stops)
160
+ await session.followUp("After you're done, also do this");
161
+ ```
162
+
163
+ Both `steer()` and `followUp()` expand file-based prompt templates but error on extension commands (extension commands cannot be queued).
164
+
165
+ ### Agent and AgentState
166
+
167
+ The `Agent` class (from `@mariozechner/pi-agent-core`) handles the core LLM interaction. Access it via `session.agent`.
168
+
169
+ ```typescript
170
+ // Access current state
171
+ const state = session.agent.state;
172
+
173
+ // state.messages: AgentMessage[] - conversation history
174
+ // state.model: Model - current model
175
+ // state.thinkingLevel: ThinkingLevel - current thinking level
176
+ // state.systemPrompt: string - system prompt
177
+ // state.tools: Tool[] - available tools
178
+
179
+ // Replace messages (useful for branching, restoration)
180
+ session.agent.replaceMessages(messages);
181
+
182
+ // Wait for agent to finish processing
183
+ await session.agent.waitForIdle();
184
+ ```
185
+
186
+ ### Events
187
+
188
+ Subscribe to events to receive streaming output and lifecycle notifications.
189
+
190
+ ```typescript
191
+ session.subscribe((event) => {
192
+ switch (event.type) {
193
+ // Streaming text from assistant
194
+ case "message_update":
195
+ if (event.assistantMessageEvent.type === "text_delta") {
196
+ process.stdout.write(event.assistantMessageEvent.delta);
197
+ }
198
+ if (event.assistantMessageEvent.type === "thinking_delta") {
199
+ // Thinking output (if thinking enabled)
200
+ }
201
+ break;
202
+
203
+ // Tool execution
204
+ case "tool_execution_start":
205
+ console.log(`Tool: ${event.toolName}`);
206
+ break;
207
+ case "tool_execution_update":
208
+ // Streaming tool output
209
+ break;
210
+ case "tool_execution_end":
211
+ console.log(`Result: ${event.isError ? "error" : "success"}`);
212
+ break;
213
+
214
+ // Message lifecycle
215
+ case "message_start":
216
+ // New message starting
217
+ break;
218
+ case "message_end":
219
+ // Message complete
220
+ break;
221
+
222
+ // Agent lifecycle
223
+ case "agent_start":
224
+ // Agent started processing prompt
225
+ break;
226
+ case "agent_end":
227
+ // Agent finished (event.messages contains new messages)
228
+ break;
229
+
230
+ // Turn lifecycle (one LLM response + tool calls)
231
+ case "turn_start":
232
+ break;
233
+ case "turn_end":
234
+ // event.message: assistant response
235
+ // event.toolResults: tool results from this turn
236
+ break;
237
+
238
+ // Session events (auto-compaction, retry)
239
+ case "auto_compaction_start":
240
+ case "auto_compaction_end":
241
+ case "auto_retry_start":
242
+ case "auto_retry_end":
243
+ break;
244
+ }
245
+ });
246
+ ```
247
+
248
+ ## Options Reference
249
+
250
+ ### Directories
251
+
252
+ ```typescript
253
+ const { session } = await createAgentSession({
254
+ // Working directory for project-local discovery
255
+ cwd: process.cwd(), // default
256
+
257
+ // Global config directory
258
+ agentDir: "~/.pi/agent", // default (expands ~)
259
+ });
260
+ ```
261
+
262
+ `cwd` is used for:
263
+ - Project extensions (`.pi/extensions/`)
264
+ - Project skills (`.pi/skills/`)
265
+ - Project prompts (`.pi/prompts/`)
266
+ - Context files (`AGENTS.md` walking up from cwd)
267
+ - Session directory naming
268
+
269
+ `agentDir` is used for:
270
+ - Global extensions (`extensions/`)
271
+ - Global skills (`skills/`)
272
+ - Global prompts (`prompts/`)
273
+ - Global context file (`AGENTS.md`)
274
+ - Settings (`settings.json`)
275
+ - Custom models (`models.json`)
276
+ - Credentials (`auth.json`)
277
+ - Sessions (`sessions/`)
278
+
279
+ ### Model
280
+
281
+ ```typescript
282
+ import { getModel } from "@mariozechner/pi-ai";
283
+ import { discoverAuthStorage, discoverModels } from "@mariozechner/pi-coding-agent";
284
+
285
+ const authStorage = discoverAuthStorage();
286
+ const modelRegistry = discoverModels(authStorage);
287
+
288
+ // Find specific built-in model (doesn't check if API key exists)
289
+ const opus = getModel("anthropic", "claude-opus-4-5");
290
+ if (!opus) throw new Error("Model not found");
291
+
292
+ // Find any model by provider/id, including custom models from models.json
293
+ // (doesn't check if API key exists)
294
+ const customModel = modelRegistry.find("my-provider", "my-model");
295
+
296
+ // Get only models that have valid API keys configured
297
+ const available = await modelRegistry.getAvailable();
298
+
299
+ const { session } = await createAgentSession({
300
+ model: opus,
301
+ thinkingLevel: "medium", // off, minimal, low, medium, high, xhigh
302
+
303
+ // Models for cycling (Ctrl+P in interactive mode)
304
+ scopedModels: [
305
+ { model: opus, thinkingLevel: "high" },
306
+ { model: haiku, thinkingLevel: "off" },
307
+ ],
308
+
309
+ authStorage,
310
+ modelRegistry,
311
+ });
312
+ ```
313
+
314
+ If no model is provided:
315
+ 1. Tries to restore from session (if continuing)
316
+ 2. Uses default from settings
317
+ 3. Falls back to first available model
318
+
319
+ > See [examples/sdk/02-custom-model.ts](../examples/sdk/02-custom-model.ts)
320
+
321
+ ### API Keys and OAuth
322
+
323
+ API key resolution priority (handled by AuthStorage):
324
+ 1. Runtime overrides (via `setRuntimeApiKey`, not persisted)
325
+ 2. Stored credentials in `auth.json` (API keys or OAuth tokens)
326
+ 3. Environment variables (`ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, etc.)
327
+ 4. Fallback resolver (for custom provider keys from `models.json`)
328
+
329
+ ```typescript
330
+ import { AuthStorage, ModelRegistry, discoverAuthStorage, discoverModels } from "@mariozechner/pi-coding-agent";
331
+
332
+ // Default: uses ~/.pi/agent/auth.json and ~/.pi/agent/models.json
333
+ const authStorage = discoverAuthStorage();
334
+ const modelRegistry = discoverModels(authStorage);
335
+
336
+ const { session } = await createAgentSession({
337
+ sessionManager: SessionManager.inMemory(),
338
+ authStorage,
339
+ modelRegistry,
340
+ });
341
+
342
+ // Runtime API key override (not persisted to disk)
343
+ authStorage.setRuntimeApiKey("anthropic", "sk-my-temp-key");
344
+
345
+ // Custom auth storage location
346
+ const customAuth = new AuthStorage("/my/app/auth.json");
347
+ const customRegistry = new ModelRegistry(customAuth, "/my/app/models.json");
348
+
349
+ const { session } = await createAgentSession({
350
+ sessionManager: SessionManager.inMemory(),
351
+ authStorage: customAuth,
352
+ modelRegistry: customRegistry,
353
+ });
354
+
355
+ // No custom models.json (built-in models only)
356
+ const simpleRegistry = new ModelRegistry(authStorage);
357
+ ```
358
+
359
+ > See [examples/sdk/09-api-keys-and-oauth.ts](../examples/sdk/09-api-keys-and-oauth.ts)
360
+
361
+ ### System Prompt
362
+
363
+ ```typescript
364
+ const { session } = await createAgentSession({
365
+ // Replace entirely
366
+ systemPrompt: "You are a helpful assistant.",
367
+
368
+ // Or modify default (receives default, returns modified)
369
+ systemPrompt: (defaultPrompt) => {
370
+ return `${defaultPrompt}\n\n## Additional Rules\n- Be concise`;
371
+ },
372
+ });
373
+ ```
374
+
375
+ > See [examples/sdk/03-custom-prompt.ts](../examples/sdk/03-custom-prompt.ts)
376
+
377
+ ### Tools
378
+
379
+ ```typescript
380
+ import {
381
+ codingTools, // read, bash, edit, write (default)
382
+ readOnlyTools, // read, grep, find, ls
383
+ readTool, bashTool, editTool, writeTool,
384
+ grepTool, findTool, lsTool,
385
+ } from "@mariozechner/pi-coding-agent";
386
+
387
+ // Use built-in tool set
388
+ const { session } = await createAgentSession({
389
+ tools: readOnlyTools,
390
+ });
391
+
392
+ // Pick specific tools
393
+ const { session } = await createAgentSession({
394
+ tools: [readTool, bashTool, grepTool],
395
+ });
396
+ ```
397
+
398
+ #### Tools with Custom cwd
399
+
400
+ **Important:** The pre-built tool instances (`readTool`, `bashTool`, etc.) use `process.cwd()` for path resolution. When you specify a custom `cwd` AND provide explicit `tools`, you must use the tool factory functions to ensure paths resolve correctly:
401
+
402
+ ```typescript
403
+ import {
404
+ createCodingTools, // Creates [read, bash, edit, write] for specific cwd
405
+ createReadOnlyTools, // Creates [read, grep, find, ls] for specific cwd
406
+ createReadTool,
407
+ createBashTool,
408
+ createEditTool,
409
+ createWriteTool,
410
+ createGrepTool,
411
+ createFindTool,
412
+ createLsTool,
413
+ } from "@mariozechner/pi-coding-agent";
414
+
415
+ const cwd = "/path/to/project";
416
+
417
+ // Use factory for tool sets
418
+ const { session } = await createAgentSession({
419
+ cwd,
420
+ tools: createCodingTools(cwd), // Tools resolve paths relative to cwd
421
+ });
422
+
423
+ // Or pick specific tools
424
+ const { session } = await createAgentSession({
425
+ cwd,
426
+ tools: [createReadTool(cwd), createBashTool(cwd), createGrepTool(cwd)],
427
+ });
428
+ ```
429
+
430
+ **When you don't need factories:**
431
+ - If you omit `tools`, pi automatically creates them with the correct `cwd`
432
+ - If you use `process.cwd()` as your `cwd`, the pre-built instances work fine
433
+
434
+ **When you must use factories:**
435
+ - When you specify both `cwd` (different from `process.cwd()`) AND `tools`
436
+
437
+ > See [examples/sdk/05-tools.ts](../examples/sdk/05-tools.ts)
438
+
439
+ ### Custom Tools
440
+
441
+ ```typescript
442
+ import { Type } from "@sinclair/typebox";
443
+ import { createAgentSession, type ToolDefinition } from "@mariozechner/pi-coding-agent";
444
+
445
+ // Inline custom tool
446
+ const myTool: ToolDefinition = {
447
+ name: "my_tool",
448
+ label: "My Tool",
449
+ description: "Does something useful",
450
+ parameters: Type.Object({
451
+ input: Type.String({ description: "Input value" }),
452
+ }),
453
+ execute: async (toolCallId, params, onUpdate, ctx, signal) => ({
454
+ content: [{ type: "text", text: `Result: ${params.input}` }],
455
+ details: {},
456
+ }),
457
+ };
458
+
459
+ // Pass custom tools directly
460
+ const { session } = await createAgentSession({
461
+ customTools: [myTool],
462
+ });
463
+ ```
464
+
465
+ Custom tools passed via `customTools` are combined with extension-registered tools. Extensions discovered from `~/.pi/agent/extensions/` and `.pi/extensions/` can also register tools via `pi.registerTool()`.
466
+
467
+ > See [examples/sdk/05-tools.ts](../examples/sdk/05-tools.ts)
468
+
469
+ ### Extensions
470
+
471
+ By default, extensions are discovered from multiple locations:
472
+ - `~/.pi/agent/extensions/` (global)
473
+ - `.pi/extensions/` (project-local)
474
+ - Paths listed in `settings.json` `"extensions"` array
475
+
476
+ ```typescript
477
+ import { createAgentSession, type ExtensionFactory } from "@mariozechner/pi-coding-agent";
478
+
479
+ // Inline extension factory
480
+ const myExtension: ExtensionFactory = (pi) => {
481
+ pi.on("tool_call", async (event, ctx) => {
482
+ console.log(`Tool: ${event.toolName}`);
483
+ });
484
+
485
+ pi.registerCommand("hello", {
486
+ description: "Say hello",
487
+ handler: async (args, ctx) => {
488
+ ctx.ui.notify("Hello!", "info");
489
+ },
490
+ });
491
+ };
492
+
493
+ // Pass inline extensions (skips file discovery)
494
+ const { session } = await createAgentSession({
495
+ extensions: [myExtension],
496
+ });
497
+
498
+ // Add paths to load (merged with discovery)
499
+ const { session } = await createAgentSession({
500
+ additionalExtensionPaths: ["/path/to/my-extension.ts"],
501
+ });
502
+
503
+ // Disable extension discovery entirely
504
+ const { session } = await createAgentSession({
505
+ extensions: [],
506
+ });
507
+ ```
508
+
509
+ Extensions can register tools, subscribe to events, add commands, and more. See [extensions.md](extensions.md) for the full API.
510
+
511
+ **Event Bus:** Extensions can communicate via `pi.events`. Pass a shared `eventBus` to `createAgentSession()` if you need to emit/listen from outside:
512
+
513
+ ```typescript
514
+ import { createAgentSession, createEventBus } from "@mariozechner/pi-coding-agent";
515
+
516
+ const eventBus = createEventBus();
517
+ const { session } = await createAgentSession({ eventBus });
518
+
519
+ // Listen for events from extensions
520
+ eventBus.on("my-extension:status", (data) => console.log(data));
521
+ ```
522
+
523
+ > See [examples/sdk/06-extensions.ts](../examples/sdk/06-extensions.ts) and [docs/extensions.md](extensions.md)
524
+
525
+ ### Skills
526
+
527
+ ```typescript
528
+ import { createAgentSession, discoverSkills, type Skill } from "@mariozechner/pi-coding-agent";
529
+
530
+ // Discover and filter
531
+ const { skills: allSkills, warnings } = discoverSkills();
532
+ const filtered = allSkills.filter(s => s.name.includes("search"));
533
+
534
+ // Custom skill
535
+ const mySkill: Skill = {
536
+ name: "my-skill",
537
+ description: "Custom instructions",
538
+ filePath: "/path/to/SKILL.md",
539
+ baseDir: "/path/to",
540
+ source: "custom",
541
+ };
542
+
543
+ const { session } = await createAgentSession({
544
+ skills: [...filtered, mySkill],
545
+ });
546
+
547
+ // Disable skills
548
+ const { session } = await createAgentSession({
549
+ skills: [],
550
+ });
551
+
552
+ // Discovery with settings filter
553
+ const { skills } = discoverSkills(process.cwd(), undefined, {
554
+ ignoredSkills: ["browser-*"], // glob patterns to exclude
555
+ includeSkills: ["search-*"], // glob patterns to include (empty = all)
556
+ });
557
+ ```
558
+
559
+ > See [examples/sdk/04-skills.ts](../examples/sdk/04-skills.ts)
560
+
561
+ ### Context Files
562
+
563
+ ```typescript
564
+ import { createAgentSession, discoverContextFiles } from "@mariozechner/pi-coding-agent";
565
+
566
+ // Discover AGENTS.md files
567
+ const discovered = discoverContextFiles();
568
+
569
+ // Add custom context
570
+ const { session } = await createAgentSession({
571
+ contextFiles: [
572
+ ...discovered,
573
+ {
574
+ path: "/virtual/AGENTS.md",
575
+ content: "# Guidelines\n\n- Be concise\n- Use TypeScript",
576
+ },
577
+ ],
578
+ });
579
+
580
+ // Disable context files
581
+ const { session } = await createAgentSession({
582
+ contextFiles: [],
583
+ });
584
+ ```
585
+
586
+ > See [examples/sdk/07-context-files.ts](../examples/sdk/07-context-files.ts)
587
+
588
+ ### Slash Commands
589
+
590
+ ```typescript
591
+ import { createAgentSession, discoverPromptTemplates, type PromptTemplate } from "@mariozechner/pi-coding-agent";
592
+
593
+ const discovered = discoverPromptTemplates();
594
+
595
+ const customCommand: PromptTemplate = {
596
+ name: "deploy",
597
+ description: "Deploy the application",
598
+ source: "(custom)",
599
+ content: "# Deploy\n\n1. Build\n2. Test\n3. Deploy",
600
+ };
601
+
602
+ const { session } = await createAgentSession({
603
+ promptTemplates: [...discovered, customCommand],
604
+ });
605
+ ```
606
+
607
+ > See [examples/sdk/08-prompt-templates.ts](../examples/sdk/08-prompt-templates.ts)
608
+
609
+ ### Session Management
610
+
611
+ Sessions use a tree structure with `id`/`parentId` linking, enabling in-place branching.
612
+
613
+ ```typescript
614
+ import { createAgentSession, SessionManager } from "@mariozechner/pi-coding-agent";
615
+
616
+ // In-memory (no persistence)
617
+ const { session } = await createAgentSession({
618
+ sessionManager: SessionManager.inMemory(),
619
+ });
620
+
621
+ // New persistent session
622
+ const { session } = await createAgentSession({
623
+ sessionManager: SessionManager.create(process.cwd()),
624
+ });
625
+
626
+ // Continue most recent
627
+ const { session, modelFallbackMessage } = await createAgentSession({
628
+ sessionManager: SessionManager.continueRecent(process.cwd()),
629
+ });
630
+ if (modelFallbackMessage) {
631
+ console.log("Note:", modelFallbackMessage);
632
+ }
633
+
634
+ // Open specific file
635
+ const { session } = await createAgentSession({
636
+ sessionManager: SessionManager.open("/path/to/session.jsonl"),
637
+ });
638
+
639
+ // List available sessions (async with optional progress callback)
640
+ const sessions = await SessionManager.list(process.cwd());
641
+ for (const info of sessions) {
642
+ console.log(`${info.id}: ${info.firstMessage} (${info.messageCount} messages, cwd: ${info.cwd})`);
643
+ }
644
+
645
+ // List all sessions across all projects
646
+ const allSessions = await SessionManager.listAll((loaded, total) => {
647
+ console.log(`Loading ${loaded}/${total}...`);
648
+ });
649
+
650
+ // Custom session directory (no cwd encoding)
651
+ const customDir = "/path/to/my-sessions";
652
+ const { session } = await createAgentSession({
653
+ sessionManager: SessionManager.create(process.cwd(), customDir),
654
+ });
655
+ ```
656
+
657
+ **SessionManager tree API:**
658
+
659
+ ```typescript
660
+ const sm = SessionManager.open("/path/to/session.jsonl");
661
+
662
+ // Tree traversal
663
+ const entries = sm.getEntries(); // All entries (excludes header)
664
+ const tree = sm.getTree(); // Full tree structure
665
+ const path = sm.getPath(); // Path from root to current leaf
666
+ const leaf = sm.getLeafEntry(); // Current leaf entry
667
+ const entry = sm.getEntry(id); // Get entry by ID
668
+ const children = sm.getChildren(id); // Direct children of entry
669
+
670
+ // Labels
671
+ const label = sm.getLabel(id); // Get label for entry
672
+ sm.appendLabelChange(id, "checkpoint"); // Set label
673
+
674
+ // Branching
675
+ sm.branch(entryId); // Move leaf to earlier entry
676
+ sm.branchWithSummary(id, "Summary..."); // Branch with context summary
677
+ sm.createBranchedSession(leafId); // Extract path to new file
678
+ ```
679
+
680
+ > See [examples/sdk/11-sessions.ts](../examples/sdk/11-sessions.ts) and [docs/session.md](session.md)
681
+
682
+ ### Settings Management
683
+
684
+ ```typescript
685
+ import { createAgentSession, SettingsManager, SessionManager } from "@mariozechner/pi-coding-agent";
686
+
687
+ // Default: loads from files (global + project merged)
688
+ const { session } = await createAgentSession({
689
+ settingsManager: SettingsManager.create(),
690
+ });
691
+
692
+ // With overrides
693
+ const settingsManager = SettingsManager.create();
694
+ settingsManager.applyOverrides({
695
+ compaction: { enabled: false },
696
+ retry: { enabled: true, maxRetries: 5 },
697
+ });
698
+ const { session } = await createAgentSession({ settingsManager });
699
+
700
+ // In-memory (no file I/O, for testing)
701
+ const { session } = await createAgentSession({
702
+ settingsManager: SettingsManager.inMemory({ compaction: { enabled: false } }),
703
+ sessionManager: SessionManager.inMemory(),
704
+ });
705
+
706
+ // Custom directories
707
+ const { session } = await createAgentSession({
708
+ settingsManager: SettingsManager.create("/custom/cwd", "/custom/agent"),
709
+ });
710
+ ```
711
+
712
+ **Static factories:**
713
+ - `SettingsManager.create(cwd?, agentDir?)` - Load from files
714
+ - `SettingsManager.inMemory(settings?)` - No file I/O
715
+
716
+ **Project-specific settings:**
717
+
718
+ Settings load from two locations and merge:
719
+ 1. Global: `~/.pi/agent/settings.json`
720
+ 2. Project: `<cwd>/.pi/settings.json`
721
+
722
+ Project overrides global. Nested objects merge keys. Setters only modify global (project is read-only for version control).
723
+
724
+ > See [examples/sdk/10-settings.ts](../examples/sdk/10-settings.ts)
725
+
726
+ ## Discovery Functions
727
+
728
+ All discovery functions accept optional `cwd` and `agentDir` parameters.
729
+
730
+ ```typescript
731
+ import { getModel } from "@mariozechner/pi-ai";
732
+ import {
733
+ AuthStorage,
734
+ ModelRegistry,
735
+ discoverAuthStorage,
736
+ discoverModels,
737
+ discoverSkills,
738
+ discoverExtensions,
739
+ discoverContextFiles,
740
+ discoverPromptTemplates,
741
+ loadSettings,
742
+ buildSystemPrompt,
743
+ createEventBus,
744
+ } from "@mariozechner/pi-coding-agent";
745
+
746
+ // Auth and Models
747
+ const authStorage = discoverAuthStorage(); // ~/.pi/agent/auth.json
748
+ const modelRegistry = discoverModels(authStorage); // + ~/.pi/agent/models.json
749
+ const allModels = modelRegistry.getAll(); // All models (built-in + custom)
750
+ const available = await modelRegistry.getAvailable(); // Only models with API keys
751
+ const model = modelRegistry.find("provider", "id"); // Find specific model
752
+ const builtIn = getModel("anthropic", "claude-opus-4-5"); // Built-in only
753
+
754
+ // Skills
755
+ const { skills, warnings } = discoverSkills(cwd, agentDir, skillsSettings);
756
+
757
+ // Extensions (async - loads TypeScript)
758
+ // Pass eventBus to share pi.events across extensions
759
+ const eventBus = createEventBus();
760
+ const { extensions, errors } = await discoverExtensions(eventBus, cwd, agentDir);
761
+
762
+ // Context files
763
+ const contextFiles = discoverContextFiles(cwd, agentDir);
764
+
765
+ // Prompt templates
766
+ const templates = discoverPromptTemplates(cwd, agentDir);
767
+
768
+ // Settings (global + project merged)
769
+ const settings = loadSettings(cwd, agentDir);
770
+
771
+ // Build system prompt manually
772
+ const prompt = buildSystemPrompt({
773
+ skills,
774
+ contextFiles,
775
+ appendPrompt: "Additional instructions",
776
+ cwd,
777
+ });
778
+ ```
779
+
780
+ ## Return Value
781
+
782
+ `createAgentSession()` returns:
783
+
784
+ ```typescript
785
+ interface CreateAgentSessionResult {
786
+ // The session
787
+ session: AgentSession;
788
+
789
+ // Extensions result (for runner setup)
790
+ extensionsResult: LoadExtensionsResult;
791
+
792
+ // Warning if session model couldn't be restored
793
+ modelFallbackMessage?: string;
794
+ }
795
+
796
+ interface LoadExtensionsResult {
797
+ extensions: Extension[];
798
+ errors: Array<{ path: string; error: string }>;
799
+ runtime: ExtensionRuntime;
800
+ }
801
+ ```
802
+
803
+ ## Complete Example
804
+
805
+ ```typescript
806
+ import { getModel } from "@mariozechner/pi-ai";
807
+ import { Type } from "@sinclair/typebox";
808
+ import {
809
+ AuthStorage,
810
+ createAgentSession,
811
+ ModelRegistry,
812
+ SessionManager,
813
+ SettingsManager,
814
+ readTool,
815
+ bashTool,
816
+ type ExtensionFactory,
817
+ type ToolDefinition,
818
+ } from "@mariozechner/pi-coding-agent";
819
+
820
+ // Set up auth storage (custom location)
821
+ const authStorage = new AuthStorage("/custom/agent/auth.json");
822
+
823
+ // Runtime API key override (not persisted)
824
+ if (process.env.MY_KEY) {
825
+ authStorage.setRuntimeApiKey("anthropic", process.env.MY_KEY);
826
+ }
827
+
828
+ // Model registry (no custom models.json)
829
+ const modelRegistry = new ModelRegistry(authStorage);
830
+
831
+ // Inline extension
832
+ const auditExtension: ExtensionFactory = (pi) => {
833
+ pi.on("tool_call", async (event) => {
834
+ console.log(`[Audit] ${event.toolName}`);
835
+ return undefined;
836
+ });
837
+ };
838
+
839
+ // Inline tool
840
+ const statusTool: ToolDefinition = {
841
+ name: "status",
842
+ label: "Status",
843
+ description: "Get system status",
844
+ parameters: Type.Object({}),
845
+ execute: async () => ({
846
+ content: [{ type: "text", text: `Uptime: ${process.uptime()}s` }],
847
+ details: {},
848
+ }),
849
+ };
850
+
851
+ const model = getModel("anthropic", "claude-opus-4-5");
852
+ if (!model) throw new Error("Model not found");
853
+
854
+ // In-memory settings with overrides
855
+ const settingsManager = SettingsManager.inMemory({
856
+ compaction: { enabled: false },
857
+ retry: { enabled: true, maxRetries: 2 },
858
+ });
859
+
860
+ const { session } = await createAgentSession({
861
+ cwd: process.cwd(),
862
+ agentDir: "/custom/agent",
863
+
864
+ model,
865
+ thinkingLevel: "off",
866
+ authStorage,
867
+ modelRegistry,
868
+
869
+ systemPrompt: "You are a minimal assistant. Be concise.",
870
+
871
+ tools: [readTool, bashTool],
872
+ customTools: [statusTool],
873
+ extensions: [auditExtension],
874
+ skills: [],
875
+ contextFiles: [],
876
+ promptTemplates: [],
877
+
878
+ sessionManager: SessionManager.inMemory(),
879
+ settingsManager,
880
+ });
881
+
882
+ session.subscribe((event) => {
883
+ if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
884
+ process.stdout.write(event.assistantMessageEvent.delta);
885
+ }
886
+ });
887
+
888
+ await session.prompt("Get status and list files.");
889
+ ```
890
+
891
+ ## Run Modes
892
+
893
+ The SDK exports run mode utilities for building custom interfaces on top of `createAgentSession()`:
894
+
895
+ ### InteractiveMode
896
+
897
+ Full TUI interactive mode with editor, chat history, and all built-in commands:
898
+
899
+ ```typescript
900
+ import { createAgentSession, InteractiveMode } from "@mariozechner/pi-coding-agent";
901
+
902
+ const { session } = await createAgentSession({ /* ... */ });
903
+
904
+ const mode = new InteractiveMode(session, {
905
+ // All optional
906
+ migratedProviders: [], // Show migration warnings
907
+ modelFallbackMessage: undefined, // Show model restore warning
908
+ initialMessage: "Hello", // Send on startup
909
+ initialImages: [], // Images with initial message
910
+ initialMessages: [], // Additional startup prompts
911
+ });
912
+
913
+ await mode.run(); // Blocks until exit
914
+ ```
915
+
916
+ ### runPrintMode
917
+
918
+ Single-shot mode: send prompts, output result, exit:
919
+
920
+ ```typescript
921
+ import { createAgentSession, runPrintMode } from "@mariozechner/pi-coding-agent";
922
+
923
+ const { session } = await createAgentSession({ /* ... */ });
924
+
925
+ await runPrintMode(session, {
926
+ mode: "text", // "text" for final response, "json" for all events
927
+ initialMessage: "Hello", // First message (can include @file content)
928
+ initialImages: [], // Images with initial message
929
+ messages: ["Follow up"], // Additional prompts
930
+ });
931
+ ```
932
+
933
+ ### runRpcMode
934
+
935
+ JSON-RPC mode for subprocess integration:
936
+
937
+ ```typescript
938
+ import { createAgentSession, runRpcMode } from "@mariozechner/pi-coding-agent";
939
+
940
+ const { session } = await createAgentSession({ /* ... */ });
941
+
942
+ await runRpcMode(session); // Reads JSON commands from stdin, writes to stdout
943
+ ```
944
+
945
+ See [RPC documentation](rpc.md) for the JSON protocol.
946
+
947
+ ## RPC Mode Alternative
948
+
949
+ For subprocess-based integration without building with the SDK, use the CLI directly:
950
+
951
+ ```bash
952
+ pi --mode rpc --no-session
953
+ ```
954
+
955
+ See [RPC documentation](rpc.md) for the JSON protocol.
956
+
957
+ The SDK is preferred when:
958
+ - You want type safety
959
+ - You're in the same Node.js process
960
+ - You need direct access to agent state
961
+ - You want to customize tools/extensions programmatically
962
+
963
+ RPC mode is preferred when:
964
+ - You're integrating from another language
965
+ - You want process isolation
966
+ - You're building a language-agnostic client
967
+
968
+ ## Exports
969
+
970
+ The main entry point exports:
971
+
972
+ ```typescript
973
+ // Factory
974
+ createAgentSession
975
+
976
+ // Auth and Models
977
+ AuthStorage
978
+ ModelRegistry
979
+ discoverAuthStorage
980
+ discoverModels
981
+
982
+ // Discovery
983
+ discoverSkills
984
+ discoverExtensions
985
+ discoverContextFiles
986
+ discoverPromptTemplates
987
+
988
+ // Event Bus (for shared extension communication)
989
+ createEventBus
990
+
991
+ // Helpers
992
+ loadSettings
993
+ buildSystemPrompt
994
+
995
+ // Session management
996
+ SessionManager
997
+ SettingsManager
998
+
999
+ // Built-in tools (use process.cwd())
1000
+ codingTools
1001
+ readOnlyTools
1002
+ readTool, bashTool, editTool, writeTool
1003
+ grepTool, findTool, lsTool
1004
+
1005
+ // Tool factories (for custom cwd)
1006
+ createCodingTools
1007
+ createReadOnlyTools
1008
+ createReadTool, createBashTool, createEditTool, createWriteTool
1009
+ createGrepTool, createFindTool, createLsTool
1010
+
1011
+ // Types
1012
+ type CreateAgentSessionOptions
1013
+ type CreateAgentSessionResult
1014
+ type ExtensionFactory
1015
+ type ExtensionAPI
1016
+ type ToolDefinition
1017
+ type Skill
1018
+ type PromptTemplate
1019
+ type Settings
1020
+ type SkillsSettings
1021
+ type Tool
1022
+ ```
1023
+
1024
+ For extension types, see [extensions.md](extensions.md) for the full API.