@mrquake/quakecode-cli 0.64.0

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