@vandeepunk/pi-coding-agent 0.0.6 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (459) hide show
  1. package/CHANGELOG.md +814 -16
  2. package/README.md +66 -27
  3. package/dist/bun/cli.d.ts +3 -0
  4. package/dist/bun/cli.d.ts.map +1 -0
  5. package/dist/bun/cli.js +7 -0
  6. package/dist/bun/cli.js.map +1 -0
  7. package/dist/bun/register-bedrock.d.ts +2 -0
  8. package/dist/bun/register-bedrock.d.ts.map +1 -0
  9. package/dist/bun/register-bedrock.js +4 -0
  10. package/dist/bun/register-bedrock.js.map +1 -0
  11. package/dist/cli/args.d.ts +9 -4
  12. package/dist/cli/args.d.ts.map +1 -1
  13. package/dist/cli/args.js +61 -22
  14. package/dist/cli/args.js.map +1 -1
  15. package/dist/cli/file-processor.d.ts.map +1 -1
  16. package/dist/cli/file-processor.js +4 -0
  17. package/dist/cli/file-processor.js.map +1 -1
  18. package/dist/cli/initial-message.d.ts +18 -0
  19. package/dist/cli/initial-message.d.ts.map +1 -0
  20. package/dist/cli/initial-message.js +22 -0
  21. package/dist/cli/initial-message.js.map +1 -0
  22. package/dist/cli/session-picker.d.ts.map +1 -1
  23. package/dist/cli/session-picker.js +2 -1
  24. package/dist/cli/session-picker.js.map +1 -1
  25. package/dist/cli.d.ts.map +1 -1
  26. package/dist/cli.js +3 -0
  27. package/dist/cli.js.map +1 -1
  28. package/dist/config.d.ts +1 -1
  29. package/dist/config.d.ts.map +1 -1
  30. package/dist/config.js +2 -2
  31. package/dist/config.js.map +1 -1
  32. package/dist/core/agent-session-runtime.d.ts +83 -0
  33. package/dist/core/agent-session-runtime.d.ts.map +1 -0
  34. package/dist/core/agent-session-runtime.js +236 -0
  35. package/dist/core/agent-session-runtime.js.map +1 -0
  36. package/dist/core/agent-session-services.d.ts +86 -0
  37. package/dist/core/agent-session-services.d.ts.map +1 -0
  38. package/dist/core/agent-session-services.js +116 -0
  39. package/dist/core/agent-session-services.js.map +1 -0
  40. package/dist/core/agent-session.d.ts +63 -49
  41. package/dist/core/agent-session.d.ts.map +1 -1
  42. package/dist/core/agent-session.js +599 -370
  43. package/dist/core/agent-session.js.map +1 -1
  44. package/dist/core/auth-storage.d.ts +38 -8
  45. package/dist/core/auth-storage.d.ts.map +1 -1
  46. package/dist/core/auth-storage.js +220 -96
  47. package/dist/core/auth-storage.js.map +1 -1
  48. package/dist/core/bash-executor.d.ts +6 -7
  49. package/dist/core/bash-executor.d.ts.map +1 -1
  50. package/dist/core/bash-executor.js +27 -114
  51. package/dist/core/bash-executor.js.map +1 -1
  52. package/dist/core/compaction/branch-summarization.d.ts +2 -0
  53. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  54. package/dist/core/compaction/branch-summarization.js +3 -2
  55. package/dist/core/compaction/branch-summarization.js.map +1 -1
  56. package/dist/core/compaction/compaction.d.ts +3 -3
  57. package/dist/core/compaction/compaction.d.ts.map +1 -1
  58. package/dist/core/compaction/compaction.js +31 -25
  59. package/dist/core/compaction/compaction.js.map +1 -1
  60. package/dist/core/compaction/utils.d.ts +3 -0
  61. package/dist/core/compaction/utils.d.ts.map +1 -1
  62. package/dist/core/compaction/utils.js +16 -1
  63. package/dist/core/compaction/utils.js.map +1 -1
  64. package/dist/core/exec.d.ts.map +1 -1
  65. package/dist/core/exec.js +7 -3
  66. package/dist/core/exec.js.map +1 -1
  67. package/dist/core/export-html/index.d.ts +7 -4
  68. package/dist/core/export-html/index.d.ts.map +1 -1
  69. package/dist/core/export-html/index.js +10 -8
  70. package/dist/core/export-html/index.js.map +1 -1
  71. package/dist/core/export-html/template.css +43 -13
  72. package/dist/core/export-html/template.html +1 -0
  73. package/dist/core/export-html/template.js +118 -14
  74. package/dist/core/export-html/tool-renderer.d.ts +9 -4
  75. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  76. package/dist/core/export-html/tool-renderer.js +48 -10
  77. package/dist/core/export-html/tool-renderer.js.map +1 -1
  78. package/dist/core/extensions/index.d.ts +5 -4
  79. package/dist/core/extensions/index.d.ts.map +1 -1
  80. package/dist/core/extensions/index.js +2 -2
  81. package/dist/core/extensions/index.js.map +1 -1
  82. package/dist/core/extensions/loader.d.ts.map +1 -1
  83. package/dist/core/extensions/loader.js +49 -13
  84. package/dist/core/extensions/loader.js.map +1 -1
  85. package/dist/core/extensions/runner.d.ts +13 -11
  86. package/dist/core/extensions/runner.d.ts.map +1 -1
  87. package/dist/core/extensions/runner.js +139 -64
  88. package/dist/core/extensions/runner.js.map +1 -1
  89. package/dist/core/extensions/types.d.ts +174 -34
  90. package/dist/core/extensions/types.d.ts.map +1 -1
  91. package/dist/core/extensions/types.js +10 -0
  92. package/dist/core/extensions/types.js.map +1 -1
  93. package/dist/core/extensions/wrapper.d.ts +4 -11
  94. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  95. package/dist/core/extensions/wrapper.js +6 -86
  96. package/dist/core/extensions/wrapper.js.map +1 -1
  97. package/dist/core/footer-data-provider.d.ts +18 -2
  98. package/dist/core/footer-data-provider.d.ts.map +1 -1
  99. package/dist/core/footer-data-provider.js +220 -40
  100. package/dist/core/footer-data-provider.js.map +1 -1
  101. package/dist/core/index.d.ts +4 -1
  102. package/dist/core/index.d.ts.map +1 -1
  103. package/dist/core/index.js +4 -1
  104. package/dist/core/index.js.map +1 -1
  105. package/dist/core/keybindings.d.ts +283 -50
  106. package/dist/core/keybindings.d.ts.map +1 -1
  107. package/dist/core/keybindings.js +221 -134
  108. package/dist/core/keybindings.js.map +1 -1
  109. package/dist/core/model-registry.d.ts +33 -3
  110. package/dist/core/model-registry.d.ts.map +1 -1
  111. package/dist/core/model-registry.js +165 -97
  112. package/dist/core/model-registry.js.map +1 -1
  113. package/dist/core/model-resolver.d.ts +35 -1
  114. package/dist/core/model-resolver.d.ts.map +1 -1
  115. package/dist/core/model-resolver.js +205 -32
  116. package/dist/core/model-resolver.js.map +1 -1
  117. package/dist/core/output-guard.d.ts +6 -0
  118. package/dist/core/output-guard.d.ts.map +1 -0
  119. package/dist/core/output-guard.js +59 -0
  120. package/dist/core/output-guard.js.map +1 -0
  121. package/dist/core/package-manager.d.ts +43 -2
  122. package/dist/core/package-manager.d.ts.map +1 -1
  123. package/dist/core/package-manager.js +541 -102
  124. package/dist/core/package-manager.js.map +1 -1
  125. package/dist/core/prompt-templates.d.ts +5 -4
  126. package/dist/core/prompt-templates.d.ts.map +1 -1
  127. package/dist/core/prompt-templates.js +35 -37
  128. package/dist/core/prompt-templates.js.map +1 -1
  129. package/dist/core/resolve-config-value.d.ts +6 -0
  130. package/dist/core/resolve-config-value.d.ts.map +1 -1
  131. package/dist/core/resolve-config-value.js +75 -8
  132. package/dist/core/resolve-config-value.js.map +1 -1
  133. package/dist/core/resource-loader.d.ts +6 -5
  134. package/dist/core/resource-loader.d.ts.map +1 -1
  135. package/dist/core/resource-loader.js +166 -119
  136. package/dist/core/resource-loader.js.map +1 -1
  137. package/dist/core/sdk.d.ts +11 -8
  138. package/dist/core/sdk.d.ts.map +1 -1
  139. package/dist/core/sdk.js +31 -29
  140. package/dist/core/sdk.js.map +1 -1
  141. package/dist/core/session-cwd.d.ts +19 -0
  142. package/dist/core/session-cwd.d.ts.map +1 -0
  143. package/dist/core/session-cwd.js +38 -0
  144. package/dist/core/session-cwd.js.map +1 -0
  145. package/dist/core/session-manager.d.ts +11 -1
  146. package/dist/core/session-manager.d.ts.map +1 -1
  147. package/dist/core/session-manager.js +39 -25
  148. package/dist/core/session-manager.js.map +1 -1
  149. package/dist/core/settings-manager.d.ts +60 -10
  150. package/dist/core/settings-manager.d.ts.map +1 -1
  151. package/dist/core/settings-manager.js +291 -140
  152. package/dist/core/settings-manager.js.map +1 -1
  153. package/dist/core/skills.d.ts +5 -3
  154. package/dist/core/skills.d.ts.map +1 -1
  155. package/dist/core/skills.js +54 -9
  156. package/dist/core/skills.js.map +1 -1
  157. package/dist/core/slash-commands.d.ts +2 -3
  158. package/dist/core/slash-commands.d.ts.map +1 -1
  159. package/dist/core/slash-commands.js +3 -2
  160. package/dist/core/slash-commands.js.map +1 -1
  161. package/dist/core/source-info.d.ts +18 -0
  162. package/dist/core/source-info.d.ts.map +1 -0
  163. package/dist/core/source-info.js +19 -0
  164. package/dist/core/source-info.js.map +1 -0
  165. package/dist/core/system-prompt.d.ts +4 -0
  166. package/dist/core/system-prompt.d.ts.map +1 -1
  167. package/dist/core/system-prompt.js +31 -52
  168. package/dist/core/system-prompt.js.map +1 -1
  169. package/dist/core/timings.d.ts +1 -0
  170. package/dist/core/timings.d.ts.map +1 -1
  171. package/dist/core/timings.js +6 -0
  172. package/dist/core/timings.js.map +1 -1
  173. package/dist/core/tools/bash.d.ts +24 -6
  174. package/dist/core/tools/bash.d.ts.map +1 -1
  175. package/dist/core/tools/bash.js +225 -115
  176. package/dist/core/tools/bash.js.map +1 -1
  177. package/dist/core/tools/edit-diff.d.ts +23 -1
  178. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  179. package/dist/core/tools/edit-diff.js +151 -57
  180. package/dist/core/tools/edit-diff.js.map +1 -1
  181. package/dist/core/tools/edit.d.ts +20 -6
  182. package/dist/core/tools/edit.d.ts.map +1 -1
  183. package/dist/core/tools/edit.js +111 -61
  184. package/dist/core/tools/edit.js.map +1 -1
  185. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  186. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  187. package/dist/core/tools/file-mutation-queue.js +37 -0
  188. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  189. package/dist/core/tools/find.d.ts +11 -4
  190. package/dist/core/tools/find.d.ts.map +1 -1
  191. package/dist/core/tools/find.js +82 -30
  192. package/dist/core/tools/find.js.map +1 -1
  193. package/dist/core/tools/grep.d.ts +15 -4
  194. package/dist/core/tools/grep.d.ts.map +1 -1
  195. package/dist/core/tools/grep.js +83 -29
  196. package/dist/core/tools/grep.js.map +1 -1
  197. package/dist/core/tools/index.d.ts +63 -21
  198. package/dist/core/tools/index.d.ts.map +1 -1
  199. package/dist/core/tools/index.js +51 -26
  200. package/dist/core/tools/index.js.map +1 -1
  201. package/dist/core/tools/ls.d.ts +9 -3
  202. package/dist/core/tools/ls.d.ts.map +1 -1
  203. package/dist/core/tools/ls.js +67 -13
  204. package/dist/core/tools/ls.js.map +1 -1
  205. package/dist/core/tools/read.d.ts +10 -3
  206. package/dist/core/tools/read.d.ts.map +1 -1
  207. package/dist/core/tools/read.js +110 -51
  208. package/dist/core/tools/read.js.map +1 -1
  209. package/dist/core/tools/render-utils.d.ts +21 -0
  210. package/dist/core/tools/render-utils.d.ts.map +1 -0
  211. package/dist/core/tools/render-utils.js +49 -0
  212. package/dist/core/tools/render-utils.js.map +1 -0
  213. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  214. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  215. package/dist/core/tools/tool-definition-wrapper.js +32 -0
  216. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  217. package/dist/core/tools/write.d.ts +9 -3
  218. package/dist/core/tools/write.d.ts.map +1 -1
  219. package/dist/core/tools/write.js +168 -30
  220. package/dist/core/tools/write.js.map +1 -1
  221. package/dist/index.d.ts +7 -6
  222. package/dist/index.d.ts.map +1 -1
  223. package/dist/index.js +7 -6
  224. package/dist/index.js.map +1 -1
  225. package/dist/main.d.ts.map +1 -1
  226. package/dist/main.js +354 -379
  227. package/dist/main.js.map +1 -1
  228. package/dist/migrations.d.ts.map +1 -1
  229. package/dist/migrations.js +31 -11
  230. package/dist/migrations.js.map +1 -1
  231. package/dist/modes/interactive/components/assistant-message.d.ts +3 -1
  232. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  233. package/dist/modes/interactive/components/assistant-message.js +14 -3
  234. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  235. package/dist/modes/interactive/components/bash-execution.d.ts +0 -1
  236. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  237. package/dist/modes/interactive/components/bash-execution.js +22 -9
  238. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  239. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  240. package/dist/modes/interactive/components/bordered-loader.js +1 -1
  241. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  242. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  243. package/dist/modes/interactive/components/branch-summary-message.js +2 -2
  244. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  245. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  246. package/dist/modes/interactive/components/compaction-summary-message.js +2 -2
  247. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  248. package/dist/modes/interactive/components/config-selector.d.ts +1 -1
  249. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  250. package/dist/modes/interactive/components/config-selector.js +14 -14
  251. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  252. package/dist/modes/interactive/components/custom-editor.d.ts +3 -3
  253. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  254. package/dist/modes/interactive/components/custom-editor.js +6 -6
  255. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  256. package/dist/modes/interactive/components/extension-editor.d.ts +5 -2
  257. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  258. package/dist/modes/interactive/components/extension-editor.js +18 -9
  259. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  260. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  261. package/dist/modes/interactive/components/extension-input.js +5 -5
  262. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  263. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  264. package/dist/modes/interactive/components/extension-selector.js +8 -8
  265. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  266. package/dist/modes/interactive/components/footer.d.ts +1 -0
  267. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  268. package/dist/modes/interactive/components/footer.js +21 -40
  269. package/dist/modes/interactive/components/footer.js.map +1 -1
  270. package/dist/modes/interactive/components/index.d.ts +1 -1
  271. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  272. package/dist/modes/interactive/components/index.js +1 -1
  273. package/dist/modes/interactive/components/index.js.map +1 -1
  274. package/dist/modes/interactive/components/keybinding-hints.d.ts +3 -36
  275. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  276. package/dist/modes/interactive/components/keybinding-hints.js +5 -44
  277. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  278. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  279. package/dist/modes/interactive/components/login-dialog.js +7 -7
  280. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  281. package/dist/modes/interactive/components/model-selector.d.ts +1 -1
  282. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  283. package/dist/modes/interactive/components/model-selector.js +13 -9
  284. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  285. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  286. package/dist/modes/interactive/components/oauth-selector.js +7 -7
  287. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  288. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  289. package/dist/modes/interactive/components/scoped-models-selector.js +4 -4
  290. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  291. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  292. package/dist/modes/interactive/components/session-selector.js +33 -36
  293. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  294. package/dist/modes/interactive/components/settings-selector.d.ts +5 -0
  295. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  296. package/dist/modes/interactive/components/settings-selector.js +25 -1
  297. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  298. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  299. package/dist/modes/interactive/components/show-images-selector.js +5 -1
  300. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  301. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  302. package/dist/modes/interactive/components/skill-invocation-message.js +2 -2
  303. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  304. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  305. package/dist/modes/interactive/components/theme-selector.js +5 -1
  306. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  307. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  308. package/dist/modes/interactive/components/thinking-selector.js +5 -1
  309. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  310. package/dist/modes/interactive/components/tool-execution.d.ts +17 -29
  311. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  312. package/dist/modes/interactive/components/tool-execution.js +139 -501
  313. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  314. package/dist/modes/interactive/components/tree-selector.d.ts +25 -4
  315. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  316. package/dist/modes/interactive/components/tree-selector.js +184 -34
  317. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  318. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  319. package/dist/modes/interactive/components/user-message-selector.js +6 -6
  320. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  321. package/dist/modes/interactive/components/user-message.d.ts +1 -0
  322. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  323. package/dist/modes/interactive/components/user-message.js +12 -0
  324. package/dist/modes/interactive/components/user-message.js.map +1 -1
  325. package/dist/modes/interactive/interactive-mode.d.ts +25 -17
  326. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  327. package/dist/modes/interactive/interactive-mode.js +669 -385
  328. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  329. package/dist/modes/interactive/theme/theme.d.ts +3 -0
  330. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  331. package/dist/modes/interactive/theme/theme.js +83 -48
  332. package/dist/modes/interactive/theme/theme.js.map +1 -1
  333. package/dist/modes/print-mode.d.ts +2 -2
  334. package/dist/modes/print-mode.d.ts.map +1 -1
  335. package/dist/modes/print-mode.js +90 -79
  336. package/dist/modes/print-mode.js.map +1 -1
  337. package/dist/modes/rpc/jsonl.d.ts +17 -0
  338. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  339. package/dist/modes/rpc/jsonl.js +49 -0
  340. package/dist/modes/rpc/jsonl.js.map +1 -0
  341. package/dist/modes/rpc/rpc-client.d.ts +1 -1
  342. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  343. package/dist/modes/rpc/rpc-client.js +8 -11
  344. package/dist/modes/rpc/rpc-client.js.map +1 -1
  345. package/dist/modes/rpc/rpc-mode.d.ts +2 -2
  346. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  347. package/dist/modes/rpc/rpc-mode.js +130 -87
  348. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  349. package/dist/modes/rpc/rpc-types.d.ts +3 -4
  350. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  351. package/dist/modes/rpc/rpc-types.js.map +1 -1
  352. package/dist/package-manager-cli.d.ts +4 -0
  353. package/dist/package-manager-cli.d.ts.map +1 -0
  354. package/dist/package-manager-cli.js +234 -0
  355. package/dist/package-manager-cli.js.map +1 -0
  356. package/dist/utils/child-process.d.ts +11 -0
  357. package/dist/utils/child-process.d.ts.map +1 -0
  358. package/dist/utils/child-process.js +78 -0
  359. package/dist/utils/child-process.js.map +1 -0
  360. package/dist/utils/clipboard-image.d.ts.map +1 -1
  361. package/dist/utils/clipboard-image.js +94 -11
  362. package/dist/utils/clipboard-image.js.map +1 -1
  363. package/dist/utils/clipboard-native.d.ts +1 -0
  364. package/dist/utils/clipboard-native.d.ts.map +1 -1
  365. package/dist/utils/clipboard-native.js.map +1 -1
  366. package/dist/utils/clipboard.d.ts +1 -1
  367. package/dist/utils/clipboard.d.ts.map +1 -1
  368. package/dist/utils/clipboard.js +27 -16
  369. package/dist/utils/clipboard.js.map +1 -1
  370. package/dist/utils/exif-orientation.d.ts +5 -0
  371. package/dist/utils/exif-orientation.d.ts.map +1 -0
  372. package/dist/utils/exif-orientation.js +158 -0
  373. package/dist/utils/exif-orientation.js.map +1 -0
  374. package/dist/utils/git.d.ts +5 -1
  375. package/dist/utils/git.d.ts.map +1 -1
  376. package/dist/utils/git.js +14 -3
  377. package/dist/utils/git.js.map +1 -1
  378. package/dist/utils/image-convert.d.ts.map +1 -1
  379. package/dist/utils/image-convert.js +5 -1
  380. package/dist/utils/image-convert.js.map +1 -1
  381. package/dist/utils/image-resize.d.ts +5 -5
  382. package/dist/utils/image-resize.d.ts.map +1 -1
  383. package/dist/utils/image-resize.js +51 -95
  384. package/dist/utils/image-resize.js.map +1 -1
  385. package/dist/utils/paths.d.ts +7 -0
  386. package/dist/utils/paths.d.ts.map +1 -0
  387. package/dist/utils/paths.js +19 -0
  388. package/dist/utils/paths.js.map +1 -0
  389. package/dist/utils/tools-manager.d.ts.map +1 -1
  390. package/dist/utils/tools-manager.js +67 -22
  391. package/dist/utils/tools-manager.js.map +1 -1
  392. package/docs/compaction.md +6 -2
  393. package/docs/custom-provider.md +57 -9
  394. package/docs/development.md +3 -1
  395. package/docs/extensions.md +437 -67
  396. package/docs/json.md +5 -2
  397. package/docs/keybindings.md +108 -107
  398. package/docs/models.md +50 -2
  399. package/docs/packages.md +17 -10
  400. package/docs/prompt-templates.md +6 -6
  401. package/docs/providers.md +10 -1
  402. package/docs/rpc.md +78 -18
  403. package/docs/sdk.md +261 -96
  404. package/docs/settings.md +28 -3
  405. package/docs/skills.md +9 -4
  406. package/docs/terminal-setup.md +39 -3
  407. package/docs/tmux.md +61 -0
  408. package/docs/tree.md +15 -3
  409. package/docs/tui.md +2 -2
  410. package/examples/extensions/README.md +3 -0
  411. package/examples/extensions/antigravity-image-gen.ts +12 -7
  412. package/examples/extensions/built-in-tool-renderer.ts +246 -0
  413. package/examples/extensions/commands.ts +3 -3
  414. package/examples/extensions/custom-compaction.ts +17 -4
  415. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  416. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  417. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  418. package/examples/extensions/custom-provider-gitlab-duo/test.ts +2 -2
  419. package/examples/extensions/custom-provider-qwen-cli/package.json +1 -1
  420. package/examples/extensions/doom-overlay/doom/build.sh +2 -2
  421. package/examples/extensions/dynamic-tools.ts +74 -0
  422. package/examples/extensions/handoff.ts +5 -2
  423. package/examples/extensions/hello.ts +18 -17
  424. package/examples/extensions/hidden-thinking-label.ts +53 -0
  425. package/examples/extensions/minimal-mode.ts +14 -14
  426. package/examples/extensions/overlay-qa-tests.ts +468 -1
  427. package/examples/extensions/preset.ts +2 -3
  428. package/examples/extensions/provider-payload.ts +14 -0
  429. package/examples/extensions/qna.ts +5 -2
  430. package/examples/extensions/question.ts +2 -2
  431. package/examples/extensions/questionnaire.ts +2 -2
  432. package/examples/extensions/rpc-demo.ts +3 -9
  433. package/examples/extensions/sandbox/index.ts +6 -3
  434. package/examples/extensions/status-line.ts +0 -8
  435. package/examples/extensions/subagent/README.md +4 -4
  436. package/examples/extensions/subagent/agents.ts +2 -3
  437. package/examples/extensions/subagent/index.ts +30 -8
  438. package/examples/extensions/summarize.ts +15 -4
  439. package/examples/extensions/todo.ts +2 -4
  440. package/examples/extensions/tool-override.ts +10 -9
  441. package/examples/extensions/tools.ts +0 -5
  442. package/examples/extensions/trigger-compact.ts +11 -1
  443. package/examples/extensions/truncated-tool.ts +8 -5
  444. package/examples/extensions/widget-placement.ts +4 -12
  445. package/examples/extensions/with-deps/index.ts +1 -5
  446. package/examples/extensions/with-deps/package-lock.json +2 -2
  447. package/examples/extensions/with-deps/package.json +1 -1
  448. package/examples/sdk/02-custom-model.ts +2 -2
  449. package/examples/sdk/04-skills.ts +8 -2
  450. package/examples/sdk/08-prompt-templates.ts +4 -3
  451. package/examples/sdk/09-api-keys-and-oauth.ts +5 -5
  452. package/examples/sdk/10-settings.ts +13 -0
  453. package/examples/sdk/12-full-control.ts +2 -3
  454. package/examples/sdk/13-session-runtime.ts +67 -0
  455. package/examples/sdk/README.md +10 -7
  456. package/package.json +98 -94
  457. /package/examples/extensions/subagent/{commands → prompts}/implement-and-review.md +0 -0
  458. /package/examples/extensions/subagent/{commands → prompts}/implement.md +0 -0
  459. /package/examples/extensions/subagent/{commands → prompts}/scout-and-plan.md +0 -0
package/docs/sdk.md CHANGED
@@ -19,8 +19,8 @@ See [examples/sdk/](../examples/sdk/) for working examples from minimal to full
19
19
  import { AuthStorage, createAgentSession, ModelRegistry, SessionManager } from "@mariozechner/pi-coding-agent";
20
20
 
21
21
  // Set up credential storage and model registry
22
- const authStorage = new AuthStorage();
23
- const modelRegistry = new ModelRegistry(authStorage);
22
+ const authStorage = AuthStorage.create();
23
+ const modelRegistry = ModelRegistry.create(authStorage);
24
24
 
25
25
  const { session } = await createAgentSession({
26
26
  sessionManager: SessionManager.inMemory(),
@@ -49,7 +49,7 @@ The SDK is included in the main package. No separate installation needed.
49
49
 
50
50
  ### createAgentSession()
51
51
 
52
- The main factory function. Creates an `AgentSession` with configurable options.
52
+ The main factory function for a single `AgentSession`.
53
53
 
54
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
55
 
@@ -69,61 +69,117 @@ const { session } = await createAgentSession({
69
69
 
70
70
  ### AgentSession
71
71
 
72
- The session manages the agent lifecycle, message history, and event streaming.
72
+ The session manages agent lifecycle, message history, model state, compaction, and event streaming.
73
73
 
74
74
  ```typescript
75
75
  interface AgentSession {
76
76
  // Send a prompt and wait for completion
77
- // If streaming, requires streamingBehavior option to queue the message
78
77
  prompt(text: string, options?: PromptOptions): Promise<void>;
79
-
78
+
80
79
  // Queue messages during streaming
81
- steer(text: string): Promise<void>; // Interrupt: delivered after current tool, skips remaining
82
- followUp(text: string): Promise<void>; // Wait: delivered only when agent finishes
83
-
80
+ steer(text: string): Promise<void>;
81
+ followUp(text: string): Promise<void>;
82
+
84
83
  // Subscribe to events (returns unsubscribe function)
85
84
  subscribe(listener: (event: AgentSessionEvent) => void): () => void;
86
-
85
+
87
86
  // Session info
88
- sessionFile: string | undefined; // undefined for in-memory
87
+ sessionFile: string | undefined;
89
88
  sessionId: string;
90
-
89
+
91
90
  // Model control
92
91
  setModel(model: Model): Promise<void>;
93
92
  setThinkingLevel(level: ThinkingLevel): void;
94
93
  cycleModel(): Promise<ModelCycleResult | undefined>;
95
94
  cycleThinkingLevel(): ThinkingLevel | undefined;
96
-
95
+
97
96
  // State access
98
97
  agent: Agent;
99
98
  model: Model | undefined;
100
99
  thinkingLevel: ThinkingLevel;
101
100
  messages: AgentMessage[];
102
101
  isStreaming: boolean;
103
-
104
- // Session management
105
- newSession(options?: { parentSession?: string }): Promise<boolean>; // Returns false if cancelled by hook
106
- switchSession(sessionPath: string): Promise<boolean>;
107
-
108
- // Forking
109
- fork(entryId: string): Promise<{ selectedText: string; cancelled: boolean }>; // Creates new session file
110
- navigateTree(targetId: string, options?: { summarize?: boolean; customInstructions?: string; replaceInstructions?: boolean; label?: string }): Promise<{ editorText?: string; cancelled: boolean }>; // In-place navigation
111
-
112
- // Hook message injection
113
- sendHookMessage(message: HookMessage, triggerTurn?: boolean): Promise<void>;
114
-
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
+
115
106
  // Compaction
116
107
  compact(customInstructions?: string): Promise<CompactionResult>;
117
108
  abortCompaction(): void;
118
-
109
+
119
110
  // Abort current operation
120
111
  abort(): Promise<void>;
121
-
112
+
122
113
  // Cleanup
123
114
  dispose(): void;
124
115
  }
125
116
  ```
126
117
 
118
+ Session replacement APIs such as new-session, resume, fork, and import live on `AgentSessionRuntime`, not on `AgentSession`.
119
+
120
+ ### createAgentSessionRuntime() and AgentSessionRuntime
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
+ `createAgentSessionRuntime()` takes a runtime factory plus the initial cwd/session target. The factory closes over process-global fixed inputs, recreates cwd-bound services for the effective cwd, resolves session options against those services, and returns a full runtime result.
126
+
127
+ ```typescript
128
+ import {
129
+ type CreateAgentSessionRuntimeFactory,
130
+ createAgentSessionFromServices,
131
+ createAgentSessionRuntime,
132
+ createAgentSessionServices,
133
+ getAgentDir,
134
+ SessionManager,
135
+ } from "@mariozechner/pi-coding-agent";
136
+
137
+ const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
138
+ const services = await createAgentSessionServices({ cwd });
139
+ return {
140
+ ...(await createAgentSessionFromServices({
141
+ services,
142
+ sessionManager,
143
+ sessionStartEvent,
144
+ })),
145
+ services,
146
+ diagnostics: services.diagnostics,
147
+ };
148
+ };
149
+
150
+ const runtime = await createAgentSessionRuntime(createRuntime, {
151
+ cwd: process.cwd(),
152
+ agentDir: getAgentDir(),
153
+ sessionManager: SessionManager.create(process.cwd()),
154
+ });
155
+ ```
156
+
157
+ `AgentSessionRuntime` owns replacement of the active runtime across:
158
+
159
+ - `newSession()`
160
+ - `switchSession()`
161
+ - `fork()`
162
+ - `importFromJsonl()`
163
+
164
+ Important behavior:
165
+
166
+ - `runtime.session` changes after those operations
167
+ - event subscriptions are attached to a specific `AgentSession`, so re-subscribe after replacement
168
+ - if you use extensions, call `runtime.session.bindExtensions(...)` again for the new session
169
+ - creation returns diagnostics on `runtime.diagnostics`
170
+ - if runtime creation or replacement fails, the method throws and the caller decides how to handle it
171
+
172
+ ```typescript
173
+ let session = runtime.session;
174
+ let unsubscribe = session.subscribe(() => {});
175
+
176
+ await runtime.newSession();
177
+
178
+ unsubscribe();
179
+ session = runtime.session;
180
+ unsubscribe = session.subscribe(() => {});
181
+ ```
182
+
127
183
  ### Prompting and Message Queueing
128
184
 
129
185
  The `prompt()` method handles prompt templates, extension commands, and message sending:
@@ -150,7 +206,7 @@ await session.prompt("After you're done, also check X", { streamingBehavior: "fo
150
206
  For explicit queueing during streaming:
151
207
 
152
208
  ```typescript
153
- // Interrupt the agent (delivered after current tool, skips remaining tools)
209
+ // Queue a steering message for delivery after the current assistant turn finishes its tool calls
154
210
  await session.steer("New instruction");
155
211
 
156
212
  // Wait for agent to finish (delivered only when agent stops)
@@ -171,10 +227,15 @@ const state = session.agent.state;
171
227
  // state.model: Model - current model
172
228
  // state.thinkingLevel: ThinkingLevel - current thinking level
173
229
  // state.systemPrompt: string - system prompt
174
- // state.tools: Tool[] - available tools
230
+ // state.tools: AgentTool[] - available tools
231
+ // state.streamingMessage?: AgentMessage - current partial assistant message
232
+ // state.errorMessage?: string - latest assistant error
175
233
 
176
- // Replace messages (useful for branching, restoration)
177
- session.agent.replaceMessages(messages);
234
+ // Replace messages (useful for branching or restoration)
235
+ session.agent.state.messages = messages; // copies the top-level array
236
+
237
+ // Replace tools
238
+ session.agent.state.tools = tools; // copies the top-level array
178
239
 
179
240
  // Wait for agent to finish processing
180
241
  await session.agent.waitForIdle();
@@ -232,9 +293,12 @@ session.subscribe((event) => {
232
293
  // event.toolResults: tool results from this turn
233
294
  break;
234
295
 
235
- // Session events (auto-compaction, retry)
236
- case "auto_compaction_start":
237
- case "auto_compaction_end":
296
+ // Session events (queue, compaction, retry)
297
+ case "queue_update":
298
+ console.log(event.steering, event.followUp);
299
+ break;
300
+ case "compaction_start":
301
+ case "compaction_end":
238
302
  case "auto_retry_start":
239
303
  case "auto_retry_end":
240
304
  break;
@@ -258,15 +322,19 @@ const { session } = await createAgentSession({
258
322
 
259
323
  `cwd` is used by `DefaultResourceLoader` for:
260
324
  - Project extensions (`.pi/extensions/`)
261
- - Project skills (`.pi/skills/`)
262
- - Project prompts (`.pi/commands/`)
325
+ - Project skills:
326
+ - `.pi/skills/`
327
+ - `.agents/skills/` in `cwd` and ancestor directories (up to git repo root, or filesystem root when not in a repo)
328
+ - Project prompts (`.pi/prompts/`)
263
329
  - Context files (`AGENTS.md` walking up from cwd)
264
330
  - Session directory naming
265
331
 
266
332
  `agentDir` is used by `DefaultResourceLoader` for:
267
333
  - Global extensions (`extensions/`)
268
- - Global skills (`skills/`)
269
- - Global prompts (`commands/`)
334
+ - Global skills:
335
+ - `skills/` under `agentDir` (for example `~/.pi/agent/skills/`)
336
+ - `~/.agents/skills/`
337
+ - Global prompts (`prompts/`)
270
338
  - Global context file (`AGENTS.md`)
271
339
  - Settings (`settings.json`)
272
340
  - Custom models (`models.json`)
@@ -281,8 +349,8 @@ When you pass a custom `ResourceLoader`, `cwd` and `agentDir` no longer control
281
349
  import { getModel } from "@mariozechner/pi-ai";
282
350
  import { AuthStorage, ModelRegistry } from "@mariozechner/pi-coding-agent";
283
351
 
284
- const authStorage = new AuthStorage();
285
- const modelRegistry = new ModelRegistry(authStorage);
352
+ const authStorage = AuthStorage.create();
353
+ const modelRegistry = ModelRegistry.create(authStorage);
286
354
 
287
355
  // Find specific built-in model (doesn't check if API key exists)
288
356
  const opus = getModel("anthropic", "claude-opus-4-5");
@@ -329,8 +397,8 @@ API key resolution priority (handled by AuthStorage):
329
397
  import { AuthStorage, ModelRegistry } from "@mariozechner/pi-coding-agent";
330
398
 
331
399
  // Default: uses ~/.pi/agent/auth.json and ~/.pi/agent/models.json
332
- const authStorage = new AuthStorage();
333
- const modelRegistry = new ModelRegistry(authStorage);
400
+ const authStorage = AuthStorage.create();
401
+ const modelRegistry = ModelRegistry.create(authStorage);
334
402
 
335
403
  const { session } = await createAgentSession({
336
404
  sessionManager: SessionManager.inMemory(),
@@ -342,8 +410,8 @@ const { session } = await createAgentSession({
342
410
  authStorage.setRuntimeApiKey("anthropic", "sk-my-temp-key");
343
411
 
344
412
  // Custom auth storage location
345
- const customAuth = new AuthStorage("/my/app/auth.json");
346
- const customRegistry = new ModelRegistry(customAuth, "/my/app/models.json");
413
+ const customAuth = AuthStorage.create("/my/app/auth.json");
414
+ const customRegistry = ModelRegistry.create(customAuth, "/my/app/models.json");
347
415
 
348
416
  const { session } = await createAgentSession({
349
417
  sessionManager: SessionManager.inMemory(),
@@ -352,7 +420,7 @@ const { session } = await createAgentSession({
352
420
  });
353
421
 
354
422
  // No custom models.json (built-in models only)
355
- const simpleRegistry = new ModelRegistry(authStorage);
423
+ const simpleRegistry = ModelRegistry.inMemory(authStorage);
356
424
  ```
357
425
 
358
426
  > See [examples/sdk/09-api-keys-and-oauth.ts](../examples/sdk/09-api-keys-and-oauth.ts)
@@ -440,21 +508,21 @@ const { session } = await createAgentSession({
440
508
 
441
509
  ```typescript
442
510
  import { Type } from "@sinclair/typebox";
443
- import { createAgentSession, type ToolDefinition } from "@mariozechner/pi-coding-agent";
511
+ import { createAgentSession, defineTool } from "@mariozechner/pi-coding-agent";
444
512
 
445
513
  // Inline custom tool
446
- const myTool: ToolDefinition = {
514
+ const myTool = defineTool({
447
515
  name: "my_tool",
448
516
  label: "My Tool",
449
517
  description: "Does something useful",
450
518
  parameters: Type.Object({
451
519
  input: Type.String({ description: "Input value" }),
452
520
  }),
453
- execute: async (toolCallId, params, onUpdate, ctx, signal) => ({
521
+ execute: async (_toolCallId, params) => ({
454
522
  content: [{ type: "text", text: `Result: ${params.input}` }],
455
523
  details: {},
456
524
  }),
457
- };
525
+ });
458
526
 
459
527
  // Pass custom tools directly
460
528
  const { session } = await createAgentSession({
@@ -462,6 +530,8 @@ const { session } = await createAgentSession({
462
530
  });
463
531
  ```
464
532
 
533
+ Use `defineTool()` for standalone definitions and arrays like `customTools: [myTool]`. Inline `pi.registerTool({ ... })` already infers parameter types correctly.
534
+
465
535
  Custom tools passed via `customTools` are combined with extension-registered tools. Extensions loaded by the ResourceLoader can also register tools via `pi.registerTool()`.
466
536
 
467
537
  > See [examples/sdk/05-tools.ts](../examples/sdk/05-tools.ts)
@@ -580,8 +650,6 @@ const loader = new DefaultResourceLoader({
580
650
  });
581
651
  await loader.reload();
582
652
 
583
- const { session } = await createAgentSession({ resourceLoader: loader });
584
-
585
653
  const { session } = await createAgentSession({ resourceLoader: loader });
586
654
  ```
587
655
 
@@ -592,7 +660,15 @@ const { session } = await createAgentSession({ resourceLoader: loader });
592
660
  Sessions use a tree structure with `id`/`parentId` linking, enabling in-place branching.
593
661
 
594
662
  ```typescript
595
- import { createAgentSession, SessionManager } from "@mariozechner/pi-coding-agent";
663
+ import {
664
+ type CreateAgentSessionRuntimeFactory,
665
+ createAgentSession,
666
+ createAgentSessionFromServices,
667
+ createAgentSessionRuntime,
668
+ createAgentSessionServices,
669
+ getAgentDir,
670
+ SessionManager,
671
+ } from "@mariozechner/pi-coding-agent";
596
672
 
597
673
  // In-memory (no persistence)
598
674
  const { session } = await createAgentSession({
@@ -600,12 +676,12 @@ const { session } = await createAgentSession({
600
676
  });
601
677
 
602
678
  // New persistent session
603
- const { session } = await createAgentSession({
679
+ const { session: persisted } = await createAgentSession({
604
680
  sessionManager: SessionManager.create(process.cwd()),
605
681
  });
606
682
 
607
683
  // Continue most recent
608
- const { session, modelFallbackMessage } = await createAgentSession({
684
+ const { session: continued, modelFallbackMessage } = await createAgentSession({
609
685
  sessionManager: SessionManager.continueRecent(process.cwd()),
610
686
  });
611
687
  if (modelFallbackMessage) {
@@ -613,26 +689,42 @@ if (modelFallbackMessage) {
613
689
  }
614
690
 
615
691
  // Open specific file
616
- const { session } = await createAgentSession({
692
+ const { session: opened } = await createAgentSession({
617
693
  sessionManager: SessionManager.open("/path/to/session.jsonl"),
618
694
  });
619
695
 
620
- // List available sessions (async with optional progress callback)
621
- const sessions = await SessionManager.list(process.cwd());
622
- for (const info of sessions) {
623
- console.log(`${info.id}: ${info.firstMessage} (${info.messageCount} messages, cwd: ${info.cwd})`);
624
- }
696
+ // List sessions
697
+ const currentProjectSessions = await SessionManager.list(process.cwd());
698
+ const allSessions = await SessionManager.listAll(process.cwd());
699
+
700
+ // Session replacement API for /new, /resume, /fork, and import flows.
701
+ const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
702
+ const services = await createAgentSessionServices({ cwd });
703
+ return {
704
+ ...(await createAgentSessionFromServices({
705
+ services,
706
+ sessionManager,
707
+ sessionStartEvent,
708
+ })),
709
+ services,
710
+ diagnostics: services.diagnostics,
711
+ };
712
+ };
625
713
 
626
- // List all sessions across all projects
627
- const allSessions = await SessionManager.listAll((loaded, total) => {
628
- console.log(`Loading ${loaded}/${total}...`);
714
+ const runtime = await createAgentSessionRuntime(createRuntime, {
715
+ cwd: process.cwd(),
716
+ agentDir: getAgentDir(),
717
+ sessionManager: SessionManager.create(process.cwd()),
629
718
  });
630
719
 
631
- // Custom session directory (no cwd encoding)
632
- const customDir = "/path/to/my-sessions";
633
- const { session } = await createAgentSession({
634
- sessionManager: SessionManager.create(process.cwd(), customDir),
635
- });
720
+ // Replace the active session with a fresh one
721
+ await runtime.newSession();
722
+
723
+ // Replace the active session with another saved session
724
+ await runtime.switchSession("/path/to/session.jsonl");
725
+
726
+ // Replace the active session with a fork from a specific entry
727
+ await runtime.fork("entry-id");
636
728
  ```
637
729
 
638
730
  **SessionManager tree API:**
@@ -640,6 +732,10 @@ const { session } = await createAgentSession({
640
732
  ```typescript
641
733
  const sm = SessionManager.open("/path/to/session.jsonl");
642
734
 
735
+ // Session listing
736
+ const currentProjectSessions = await SessionManager.list(process.cwd());
737
+ const allSessions = await SessionManager.listAll(process.cwd());
738
+
643
739
  // Tree traversal
644
740
  const entries = sm.getEntries(); // All entries (excludes header)
645
741
  const tree = sm.getTree(); // Full tree structure
@@ -702,11 +798,18 @@ Settings load from two locations and merge:
702
798
 
703
799
  Project overrides global. Nested objects merge keys. Setters modify global settings by default.
704
800
 
801
+ **Persistence and error handling semantics:**
802
+
803
+ - Settings getters/setters are synchronous for in-memory state.
804
+ - Setters enqueue persistence writes asynchronously.
805
+ - Call `await settingsManager.flush()` when you need a durability boundary (for example, before process exit or before asserting file contents in tests).
806
+ - `SettingsManager` does not print settings I/O errors. Use `settingsManager.drainErrors()` and report them in your app layer.
807
+
705
808
  > See [examples/sdk/10-settings.ts](../examples/sdk/10-settings.ts)
706
809
 
707
810
  ## ResourceLoader
708
811
 
709
- Use `DefaultResourceLoader` to discover extensions, skills, commands, themes, and context files.
812
+ Use `DefaultResourceLoader` to discover extensions, skills, prompts, themes, and context files.
710
813
 
711
814
  ```typescript
712
815
  import {
@@ -757,18 +860,18 @@ import { getModel } from "@mariozechner/pi-ai";
757
860
  import { Type } from "@sinclair/typebox";
758
861
  import {
759
862
  AuthStorage,
863
+ bashTool,
760
864
  createAgentSession,
761
865
  DefaultResourceLoader,
866
+ defineTool,
762
867
  ModelRegistry,
868
+ readTool,
763
869
  SessionManager,
764
870
  SettingsManager,
765
- readTool,
766
- bashTool,
767
- type ToolDefinition,
768
871
  } from "@mariozechner/pi-coding-agent";
769
872
 
770
873
  // Set up auth storage (custom location)
771
- const authStorage = new AuthStorage("/custom/agent/auth.json");
874
+ const authStorage = AuthStorage.create("/custom/agent/auth.json");
772
875
 
773
876
  // Runtime API key override (not persisted)
774
877
  if (process.env.MY_KEY) {
@@ -776,10 +879,10 @@ if (process.env.MY_KEY) {
776
879
  }
777
880
 
778
881
  // Model registry (no custom models.json)
779
- const modelRegistry = new ModelRegistry(authStorage);
882
+ const modelRegistry = ModelRegistry.create(authStorage);
780
883
 
781
884
  // Inline tool
782
- const statusTool: ToolDefinition = {
885
+ const statusTool = defineTool({
783
886
  name: "status",
784
887
  label: "Status",
785
888
  description: "Get system status",
@@ -788,7 +891,7 @@ const statusTool: ToolDefinition = {
788
891
  content: [{ type: "text", text: `Uptime: ${process.uptime()}s` }],
789
892
  details: {},
790
893
  }),
791
- };
894
+ });
792
895
 
793
896
  const model = getModel("anthropic", "claude-opus-4-5");
794
897
  if (!model) throw new Error("Model not found");
@@ -842,20 +945,39 @@ The SDK exports run mode utilities for building custom interfaces on top of `cre
842
945
  Full TUI interactive mode with editor, chat history, and all built-in commands:
843
946
 
844
947
  ```typescript
845
- import { createAgentSession, InteractiveMode } from "@mariozechner/pi-coding-agent";
948
+ import {
949
+ type CreateAgentSessionRuntimeFactory,
950
+ createAgentSessionFromServices,
951
+ createAgentSessionRuntime,
952
+ createAgentSessionServices,
953
+ getAgentDir,
954
+ InteractiveMode,
955
+ SessionManager,
956
+ } from "@mariozechner/pi-coding-agent";
846
957
 
847
- const { session } = await createAgentSession({ /* ... */ });
958
+ const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
959
+ const services = await createAgentSessionServices({ cwd });
960
+ return {
961
+ ...(await createAgentSessionFromServices({ services, sessionManager, sessionStartEvent })),
962
+ services,
963
+ diagnostics: services.diagnostics,
964
+ };
965
+ };
966
+ const runtime = await createAgentSessionRuntime(createRuntime, {
967
+ cwd: process.cwd(),
968
+ agentDir: getAgentDir(),
969
+ sessionManager: SessionManager.create(process.cwd()),
970
+ });
848
971
 
849
- const mode = new InteractiveMode(session, {
850
- // All optional
851
- migratedProviders: [], // Show migration warnings
852
- modelFallbackMessage: undefined, // Show model restore warning
853
- initialMessage: "Hello", // Send on startup
854
- initialImages: [], // Images with initial message
855
- initialMessages: [], // Additional startup prompts
972
+ const mode = new InteractiveMode(runtime, {
973
+ migratedProviders: [],
974
+ modelFallbackMessage: undefined,
975
+ initialMessage: "Hello",
976
+ initialImages: [],
977
+ initialMessages: [],
856
978
  });
857
979
 
858
- await mode.run(); // Blocks until exit
980
+ await mode.run();
859
981
  ```
860
982
 
861
983
  ### runPrintMode
@@ -863,15 +985,35 @@ await mode.run(); // Blocks until exit
863
985
  Single-shot mode: send prompts, output result, exit:
864
986
 
865
987
  ```typescript
866
- import { createAgentSession, runPrintMode } from "@mariozechner/pi-coding-agent";
988
+ import {
989
+ type CreateAgentSessionRuntimeFactory,
990
+ createAgentSessionFromServices,
991
+ createAgentSessionRuntime,
992
+ createAgentSessionServices,
993
+ getAgentDir,
994
+ runPrintMode,
995
+ SessionManager,
996
+ } from "@mariozechner/pi-coding-agent";
867
997
 
868
- const { session } = await createAgentSession({ /* ... */ });
998
+ const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
999
+ const services = await createAgentSessionServices({ cwd });
1000
+ return {
1001
+ ...(await createAgentSessionFromServices({ services, sessionManager, sessionStartEvent })),
1002
+ services,
1003
+ diagnostics: services.diagnostics,
1004
+ };
1005
+ };
1006
+ const runtime = await createAgentSessionRuntime(createRuntime, {
1007
+ cwd: process.cwd(),
1008
+ agentDir: getAgentDir(),
1009
+ sessionManager: SessionManager.create(process.cwd()),
1010
+ });
869
1011
 
870
- await runPrintMode(session, {
871
- mode: "text", // "text" for final response, "json" for all events
872
- initialMessage: "Hello", // First message (can include @file content)
873
- initialImages: [], // Images with initial message
874
- messages: ["Follow up"], // Additional prompts
1012
+ await runPrintMode(runtime, {
1013
+ mode: "text",
1014
+ initialMessage: "Hello",
1015
+ initialImages: [],
1016
+ messages: ["Follow up"],
875
1017
  });
876
1018
  ```
877
1019
 
@@ -880,11 +1022,31 @@ await runPrintMode(session, {
880
1022
  JSON-RPC mode for subprocess integration:
881
1023
 
882
1024
  ```typescript
883
- import { createAgentSession, runRpcMode } from "@mariozechner/pi-coding-agent";
1025
+ import {
1026
+ type CreateAgentSessionRuntimeFactory,
1027
+ createAgentSessionFromServices,
1028
+ createAgentSessionRuntime,
1029
+ createAgentSessionServices,
1030
+ getAgentDir,
1031
+ runRpcMode,
1032
+ SessionManager,
1033
+ } from "@mariozechner/pi-coding-agent";
884
1034
 
885
- const { session } = await createAgentSession({ /* ... */ });
1035
+ const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
1036
+ const services = await createAgentSessionServices({ cwd });
1037
+ return {
1038
+ ...(await createAgentSessionFromServices({ services, sessionManager, sessionStartEvent })),
1039
+ services,
1040
+ diagnostics: services.diagnostics,
1041
+ };
1042
+ };
1043
+ const runtime = await createAgentSessionRuntime(createRuntime, {
1044
+ cwd: process.cwd(),
1045
+ agentDir: getAgentDir(),
1046
+ sessionManager: SessionManager.create(process.cwd()),
1047
+ });
886
1048
 
887
- await runRpcMode(session); // Reads JSON commands from stdin, writes to stdout
1049
+ await runRpcMode(runtime);
888
1050
  ```
889
1051
 
890
1052
  See [RPC documentation](rpc.md) for the JSON protocol.
@@ -917,6 +1079,8 @@ The main entry point exports:
917
1079
  ```typescript
918
1080
  // Factory
919
1081
  createAgentSession
1082
+ createAgentSessionRuntime
1083
+ AgentSessionRuntime
920
1084
 
921
1085
  // Auth and Models
922
1086
  AuthStorage
@@ -928,6 +1092,7 @@ type ResourceLoader
928
1092
  createEventBus
929
1093
 
930
1094
  // Helpers
1095
+ defineTool
931
1096
 
932
1097
  // Session management
933
1098
  SessionManager