@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
@@ -3,9 +3,8 @@
3
3
  */
4
4
 
5
5
  import * as fs from "node:fs";
6
- import * as os from "node:os";
7
6
  import * as path from "node:path";
8
- import { parseFrontmatter } from "@mariozechner/pi-coding-agent";
7
+ import { getAgentDir, parseFrontmatter } from "@mariozechner/pi-coding-agent";
9
8
 
10
9
  export type AgentScope = "user" | "project" | "both";
11
10
 
@@ -96,7 +95,7 @@ function findNearestProjectAgentsDir(cwd: string): string | null {
96
95
  }
97
96
 
98
97
  export function discoverAgents(cwd: string, scope: AgentScope): AgentDiscoveryResult {
99
- const userDir = path.join(os.homedir(), ".pi", "agent", "agents");
98
+ const userDir = path.join(getAgentDir(), "agents");
100
99
  const projectAgentsDir = findNearestProjectAgentsDir(cwd);
101
100
 
102
101
  const userAgents = scope === "project" ? [] : loadAgentsFromDir(userDir, "user");
@@ -19,7 +19,7 @@ import * as path from "node:path";
19
19
  import type { AgentToolResult } from "@mariozechner/pi-agent-core";
20
20
  import type { Message } from "@mariozechner/pi-ai";
21
21
  import { StringEnum } from "@mariozechner/pi-ai";
22
- import { type ExtensionAPI, getMarkdownTheme } from "@mariozechner/pi-coding-agent";
22
+ import { type ExtensionAPI, getMarkdownTheme, withFileMutationQueue } from "@mariozechner/pi-coding-agent";
23
23
  import { Container, Markdown, Spacer, Text } from "@mariozechner/pi-tui";
24
24
  import { Type } from "@sinclair/typebox";
25
25
  import { type AgentConfig, type AgentScope, discoverAgents } from "./agents.js";
@@ -207,14 +207,31 @@ async function mapWithConcurrencyLimit<TIn, TOut>(
207
207
  return results;
208
208
  }
209
209
 
210
- function writePromptToTempFile(agentName: string, prompt: string): { dir: string; filePath: string } {
211
- const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagent-"));
210
+ async function writePromptToTempFile(agentName: string, prompt: string): Promise<{ dir: string; filePath: string }> {
211
+ const tmpDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), "pi-subagent-"));
212
212
  const safeName = agentName.replace(/[^\w.-]+/g, "_");
213
213
  const filePath = path.join(tmpDir, `prompt-${safeName}.md`);
214
- fs.writeFileSync(filePath, prompt, { encoding: "utf-8", mode: 0o600 });
214
+ await withFileMutationQueue(filePath, async () => {
215
+ await fs.promises.writeFile(filePath, prompt, { encoding: "utf-8", mode: 0o600 });
216
+ });
215
217
  return { dir: tmpDir, filePath };
216
218
  }
217
219
 
220
+ function getPiInvocation(args: string[]): { command: string; args: string[] } {
221
+ const currentScript = process.argv[1];
222
+ if (currentScript && fs.existsSync(currentScript)) {
223
+ return { command: process.execPath, args: [currentScript, ...args] };
224
+ }
225
+
226
+ const execName = path.basename(process.execPath).toLowerCase();
227
+ const isGenericRuntime = /^(node|bun)(\.exe)?$/.test(execName);
228
+ if (!isGenericRuntime) {
229
+ return { command: process.execPath, args };
230
+ }
231
+
232
+ return { command: "pi", args };
233
+ }
234
+
218
235
  type OnUpdateCallback = (partial: AgentToolResult<SubagentDetails>) => void;
219
236
 
220
237
  async function runSingleAgent(
@@ -274,7 +291,7 @@ async function runSingleAgent(
274
291
 
275
292
  try {
276
293
  if (agent.systemPrompt.trim()) {
277
- const tmp = writePromptToTempFile(agent.name, agent.systemPrompt);
294
+ const tmp = await writePromptToTempFile(agent.name, agent.systemPrompt);
278
295
  tmpPromptDir = tmp.dir;
279
296
  tmpPromptPath = tmp.filePath;
280
297
  args.push("--append-system-prompt", tmpPromptPath);
@@ -284,7 +301,12 @@ async function runSingleAgent(
284
301
  let wasAborted = false;
285
302
 
286
303
  const exitCode = await new Promise<number>((resolve) => {
287
- const proc = spawn("pi", args, { cwd: cwd ?? defaultCwd, shell: false, stdio: ["ignore", "pipe", "pipe"] });
304
+ const invocation = getPiInvocation(args);
305
+ const proc = spawn(invocation.command, invocation.args, {
306
+ cwd: cwd ?? defaultCwd,
307
+ shell: false,
308
+ stdio: ["ignore", "pipe", "pipe"],
309
+ });
288
310
  let buffer = "";
289
311
 
290
312
  const processLine = (line: string) => {
@@ -646,7 +668,7 @@ export default function (pi: ExtensionAPI) {
646
668
  };
647
669
  },
648
670
 
649
- renderCall(args, theme) {
671
+ renderCall(args, theme, _context) {
650
672
  const scope: AgentScope = args.agentScope ?? "user";
651
673
  if (args.chain && args.chain.length > 0) {
652
674
  let text =
@@ -690,7 +712,7 @@ export default function (pi: ExtensionAPI) {
690
712
  return new Text(text, 0, 0);
691
713
  },
692
714
 
693
- renderResult(result, { expanded }, theme) {
715
+ renderResult(result, { expanded }, theme, _context) {
694
716
  const details = result.details as SubagentDetails | undefined;
695
717
  if (!details || details.results.length === 0) {
696
718
  const text = result.content[0];
@@ -165,12 +165,15 @@ export default function (pi: ExtensionAPI) {
165
165
  ctx.ui.notify("Model openai/gpt-5.2 not found", "warning");
166
166
  }
167
167
 
168
- const apiKey = model ? await ctx.modelRegistry.getApiKey(model) : undefined;
169
- if (!apiKey && ctx.hasUI) {
168
+ const auth = model ? await ctx.modelRegistry.getApiKeyAndHeaders(model) : undefined;
169
+ if (auth && !auth.ok && ctx.hasUI) {
170
+ ctx.ui.notify(auth.error, "warning");
171
+ }
172
+ if (auth?.ok && !auth.apiKey && ctx.hasUI) {
170
173
  ctx.ui.notify("No API key for openai/gpt-5.2", "warning");
171
174
  }
172
175
 
173
- if (!model || !apiKey) {
176
+ if (!model || !auth?.ok || !auth.apiKey) {
174
177
  return;
175
178
  }
176
179
 
@@ -182,7 +185,15 @@ export default function (pi: ExtensionAPI) {
182
185
  },
183
186
  ];
184
187
 
185
- const response = await complete(model, { messages: summaryMessages }, { apiKey, reasoningEffort: "high" });
188
+ const response = await complete(
189
+ model,
190
+ { messages: summaryMessages },
191
+ {
192
+ apiKey: auth.apiKey,
193
+ headers: auth.headers,
194
+ reasoningEffort: "high",
195
+ },
196
+ );
186
197
 
187
198
  const summary = response.content
188
199
  .filter((c): c is { type: "text"; text: string } => c.type === "text")
@@ -130,8 +130,6 @@ export default function (pi: ExtensionAPI) {
130
130
 
131
131
  // Reconstruct state on session events
132
132
  pi.on("session_start", async (_event, ctx) => reconstructState(ctx));
133
- pi.on("session_switch", async (_event, ctx) => reconstructState(ctx));
134
- pi.on("session_fork", async (_event, ctx) => reconstructState(ctx));
135
133
  pi.on("session_tree", async (_event, ctx) => reconstructState(ctx));
136
134
 
137
135
  // Register the todo tool for the LLM
@@ -220,14 +218,14 @@ export default function (pi: ExtensionAPI) {
220
218
  }
221
219
  },
222
220
 
223
- renderCall(args, theme) {
221
+ renderCall(args, theme, _context) {
224
222
  let text = theme.fg("toolTitle", theme.bold("todo ")) + theme.fg("muted", args.action);
225
223
  if (args.text) text += ` ${theme.fg("dim", `"${args.text}"`)}`;
226
224
  if (args.id !== undefined) text += ` ${theme.fg("accent", `#${args.id}`)}`;
227
225
  return new Text(text, 0, 0);
228
226
  },
229
227
 
230
- renderResult(result, { expanded }, theme) {
228
+ renderResult(result, { expanded }, theme, _context) {
231
229
  const details = result.details as TodoDetails | undefined;
232
230
  if (!details) {
233
231
  const text = result.content[0];
@@ -21,14 +21,13 @@
21
21
  */
22
22
 
23
23
  import type { TextContent } from "@mariozechner/pi-ai";
24
- import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
24
+ import { type ExtensionAPI, getAgentDir, withFileMutationQueue } from "@mariozechner/pi-coding-agent";
25
25
  import { Type } from "@sinclair/typebox";
26
- import { appendFileSync, constants, readFileSync } from "fs";
27
- import { access, readFile } from "fs/promises";
28
- import { homedir } from "os";
26
+ import { constants, readFileSync } from "fs";
27
+ import { access, appendFile, readFile } from "fs/promises";
29
28
  import { join, resolve } from "path";
30
29
 
31
- const LOG_FILE = join(homedir(), ".pi", "agent", "read-access.log");
30
+ const LOG_FILE = join(getAgentDir(), "read-access.log");
32
31
 
33
32
  // Paths that are blocked from reading
34
33
  const BLOCKED_PATTERNS = [
@@ -45,14 +44,16 @@ function isBlockedPath(path: string): boolean {
45
44
  return BLOCKED_PATTERNS.some((pattern) => pattern.test(path));
46
45
  }
47
46
 
48
- function logAccess(path: string, allowed: boolean, reason?: string) {
47
+ async function logAccess(path: string, allowed: boolean, reason?: string) {
49
48
  const timestamp = new Date().toISOString();
50
49
  const status = allowed ? "ALLOWED" : "BLOCKED";
51
50
  const msg = reason ? ` (${reason})` : "";
52
51
  const line = `[${timestamp}] ${status}: ${path}${msg}\n`;
53
52
 
54
53
  try {
55
- appendFileSync(LOG_FILE, line);
54
+ await withFileMutationQueue(LOG_FILE, async () => {
55
+ await appendFile(LOG_FILE, line);
56
+ });
56
57
  } catch {
57
58
  // Ignore logging errors
58
59
  }
@@ -78,7 +79,7 @@ export default function (pi: ExtensionAPI) {
78
79
 
79
80
  // Check if path is blocked
80
81
  if (isBlockedPath(absolutePath)) {
81
- logAccess(absolutePath, false, "matches blocked pattern");
82
+ await logAccess(absolutePath, false, "matches blocked pattern");
82
83
  return {
83
84
  content: [
84
85
  {
@@ -91,7 +92,7 @@ export default function (pi: ExtensionAPI) {
91
92
  }
92
93
 
93
94
  // Log allowed access
94
- logAccess(absolutePath, true);
95
+ await logAccess(absolutePath, true);
95
96
 
96
97
  // Perform the actual read (simplified implementation)
97
98
  try {
@@ -138,9 +138,4 @@ export default function toolsExtension(pi: ExtensionAPI) {
138
138
  pi.on("session_tree", async (_event, ctx) => {
139
139
  restoreFromBranch(ctx);
140
140
  });
141
-
142
- // Restore state after forking
143
- pi.on("session_fork", async (_event, ctx) => {
144
- restoreFromBranch(ctx);
145
- });
146
141
  }
@@ -3,6 +3,8 @@ import type { ExtensionAPI, ExtensionContext } from "@mariozechner/pi-coding-age
3
3
  const COMPACT_THRESHOLD_TOKENS = 100_000;
4
4
 
5
5
  export default function (pi: ExtensionAPI) {
6
+ let previousTokens: number | null | undefined;
7
+
6
8
  const triggerCompaction = (ctx: ExtensionContext, customInstructions?: string) => {
7
9
  if (ctx.hasUI) {
8
10
  ctx.ui.notify("Compaction started", "info");
@@ -24,7 +26,15 @@ export default function (pi: ExtensionAPI) {
24
26
 
25
27
  pi.on("turn_end", (_event, ctx) => {
26
28
  const usage = ctx.getContextUsage();
27
- if (!usage || usage.tokens <= COMPACT_THRESHOLD_TOKENS) {
29
+ const currentTokens = usage?.tokens ?? null;
30
+ if (currentTokens === null) {
31
+ return;
32
+ }
33
+
34
+ const crossedThreshold =
35
+ previousTokens !== undefined && previousTokens !== null && previousTokens <= COMPACT_THRESHOLD_TOKENS;
36
+ previousTokens = currentTokens;
37
+ if (!crossedThreshold || currentTokens <= COMPACT_THRESHOLD_TOKENS) {
28
38
  return;
29
39
  }
30
40
  triggerCompaction(ctx);
@@ -14,6 +14,7 @@
14
14
  * built-in `grep` tool in src/core/tools/grep.ts for a more complete implementation.
15
15
  */
16
16
 
17
+ import { mkdtemp, writeFile } from "node:fs/promises";
17
18
  import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
18
19
  import {
19
20
  DEFAULT_MAX_BYTES,
@@ -21,11 +22,11 @@ import {
21
22
  formatSize,
22
23
  type TruncationResult,
23
24
  truncateHead,
25
+ withFileMutationQueue,
24
26
  } from "@mariozechner/pi-coding-agent";
25
27
  import { Text } from "@mariozechner/pi-tui";
26
28
  import { Type } from "@sinclair/typebox";
27
29
  import { execSync } from "child_process";
28
- import { mkdtempSync, writeFileSync } from "fs";
29
30
  import { tmpdir } from "os";
30
31
  import { join } from "path";
31
32
 
@@ -108,9 +109,11 @@ export default function (pi: ExtensionAPI) {
108
109
 
109
110
  if (truncation.truncated) {
110
111
  // Save full output to a temp file so LLM can access it if needed
111
- const tempDir = mkdtempSync(join(tmpdir(), "pi-rg-"));
112
+ const tempDir = await mkdtemp(join(tmpdir(), "pi-rg-"));
112
113
  const tempFile = join(tempDir, "output.txt");
113
- writeFileSync(tempFile, output);
114
+ await withFileMutationQueue(tempFile, async () => {
115
+ await writeFile(tempFile, output, "utf8");
116
+ });
114
117
 
115
118
  details.truncation = truncation;
116
119
  details.fullOutputPath = tempFile;
@@ -132,7 +135,7 @@ export default function (pi: ExtensionAPI) {
132
135
  },
133
136
 
134
137
  // Custom rendering of the tool call (shown before/during execution)
135
- renderCall(args, theme) {
138
+ renderCall(args, theme, _context) {
136
139
  let text = theme.fg("toolTitle", theme.bold("rg "));
137
140
  text += theme.fg("accent", `"${args.pattern}"`);
138
141
  if (args.path) {
@@ -145,7 +148,7 @@ export default function (pi: ExtensionAPI) {
145
148
  },
146
149
 
147
150
  // Custom rendering of the tool result
148
- renderResult(result, { expanded, isPartial }, theme) {
151
+ renderResult(result, { expanded, isPartial }, theme, _context) {
149
152
  const details = result.details as RgDetails | undefined;
150
153
 
151
154
  // Handle streaming/partial results
@@ -1,17 +1,9 @@
1
- import type { ExtensionAPI, ExtensionContext } from "@mariozechner/pi-coding-agent";
2
-
3
- const applyWidgets = (ctx: ExtensionContext) => {
4
- if (!ctx.hasUI) return;
5
- ctx.ui.setWidget("widget-above", ["Above editor widget"]);
6
- ctx.ui.setWidget("widget-below", ["Below editor widget"], { placement: "belowEditor" });
7
- };
1
+ import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
8
2
 
9
3
  export default function widgetPlacementExtension(pi: ExtensionAPI) {
10
4
  pi.on("session_start", (_event, ctx) => {
11
- applyWidgets(ctx);
12
- });
13
-
14
- pi.on("session_switch", (_event, ctx) => {
15
- applyWidgets(ctx);
5
+ if (!ctx.hasUI) return;
6
+ ctx.ui.setWidget("widget-above", ["Above editor widget"]);
7
+ ctx.ui.setWidget("widget-below", ["Below editor widget"], { placement: "belowEditor" });
16
8
  });
17
9
  }
@@ -21,11 +21,7 @@ export default function (pi: ExtensionAPI) {
21
21
  execute: async (_toolCallId, params) => {
22
22
  const result = ms(params.duration as ms.StringValue);
23
23
  if (result === undefined) {
24
- return {
25
- content: [{ type: "text", text: `Invalid duration: "${params.duration}"` }],
26
- isError: true,
27
- details: {},
28
- };
24
+ throw new Error(`Invalid duration: "${params.duration}"`);
29
25
  }
30
26
  return {
31
27
  content: [{ type: "text", text: `${params.duration} = ${result} milliseconds` }],
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
- "version": "1.16.9",
3
+ "version": "1.29.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-with-deps",
9
- "version": "1.16.9",
9
+ "version": "1.29.1",
10
10
  "dependencies": {
11
11
  "ms": "^2.1.3"
12
12
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
3
  "private": true,
4
- "version": "1.16.9",
4
+ "version": "1.29.1",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -8,8 +8,8 @@ import { getModel } from "@mariozechner/pi-ai";
8
8
  import { AuthStorage, createAgentSession, ModelRegistry } from "@mariozechner/pi-coding-agent";
9
9
 
10
10
  // Set up auth storage and model registry
11
- const authStorage = new AuthStorage();
12
- const modelRegistry = new ModelRegistry(authStorage);
11
+ const authStorage = AuthStorage.create();
12
+ const modelRegistry = ModelRegistry.create(authStorage);
13
13
 
14
14
  // Option 1: Find a specific built-in model by provider/id
15
15
  const opus = getModel("anthropic", "claude-opus-4-5");
@@ -5,7 +5,13 @@
5
5
  * Discover, filter, merge, or replace them.
6
6
  */
7
7
 
8
- import { createAgentSession, DefaultResourceLoader, SessionManager, type Skill } from "@mariozechner/pi-coding-agent";
8
+ import {
9
+ createAgentSession,
10
+ createSyntheticSourceInfo,
11
+ DefaultResourceLoader,
12
+ SessionManager,
13
+ type Skill,
14
+ } from "@mariozechner/pi-coding-agent";
9
15
 
10
16
  // Or define custom skills inline
11
17
  const customSkill: Skill = {
@@ -13,7 +19,7 @@ const customSkill: Skill = {
13
19
  description: "Custom project instructions",
14
20
  filePath: "/virtual/SKILL.md",
15
21
  baseDir: "/virtual",
16
- source: "path",
22
+ sourceInfo: createSyntheticSourceInfo("/virtual/SKILL.md", { source: "sdk" }),
17
23
  disableModelInvocation: false,
18
24
  };
19
25
 
@@ -6,6 +6,7 @@
6
6
 
7
7
  import {
8
8
  createAgentSession,
9
+ createSyntheticSourceInfo,
9
10
  DefaultResourceLoader,
10
11
  type PromptTemplate,
11
12
  SessionManager,
@@ -15,8 +16,8 @@ import {
15
16
  const deployTemplate: PromptTemplate = {
16
17
  name: "deploy",
17
18
  description: "Deploy the application",
18
- source: "path",
19
- filePath: "/virtual/commands/deploy.md",
19
+ filePath: "/virtual/prompts/deploy.md",
20
+ sourceInfo: createSyntheticSourceInfo("/virtual/prompts/deploy.md", { source: "sdk" }),
20
21
  content: `# Deploy Instructions
21
22
 
22
23
  1. Build: npm run build
@@ -32,7 +33,7 @@ const loader = new DefaultResourceLoader({
32
33
  });
33
34
  await loader.reload();
34
35
 
35
- // Discover templates from cwd/.pi/commands/ and ~/.pi/agent/commands/
36
+ // Discover templates from cwd/.pi/prompts/ and ~/.pi/agent/prompts/
36
37
  const discovered = loader.getPrompts().prompts;
37
38
  console.log("Discovered prompt templates:");
38
39
  for (const template of discovered) {
@@ -8,8 +8,8 @@ import { AuthStorage, createAgentSession, ModelRegistry, SessionManager } from "
8
8
 
9
9
  // Default: AuthStorage uses ~/.pi/agent/auth.json
10
10
  // ModelRegistry loads built-in + custom models from ~/.pi/agent/models.json
11
- const authStorage = new AuthStorage();
12
- const modelRegistry = new ModelRegistry(authStorage);
11
+ const authStorage = AuthStorage.create();
12
+ const modelRegistry = ModelRegistry.create(authStorage);
13
13
 
14
14
  await createAgentSession({
15
15
  sessionManager: SessionManager.inMemory(),
@@ -19,8 +19,8 @@ await createAgentSession({
19
19
  console.log("Session with default auth storage and model registry");
20
20
 
21
21
  // Custom auth storage location
22
- const customAuthStorage = new AuthStorage("/tmp/my-app/auth.json");
23
- const customModelRegistry = new ModelRegistry(customAuthStorage, "/tmp/my-app/models.json");
22
+ const customAuthStorage = AuthStorage.create("/tmp/my-app/auth.json");
23
+ const customModelRegistry = ModelRegistry.create(customAuthStorage, "/tmp/my-app/models.json");
24
24
 
25
25
  await createAgentSession({
26
26
  sessionManager: SessionManager.inMemory(),
@@ -39,7 +39,7 @@ await createAgentSession({
39
39
  console.log("Session with runtime API key override");
40
40
 
41
41
  // No models.json - only built-in models
42
- const simpleRegistry = new ModelRegistry(authStorage); // null = no models.json
42
+ const simpleRegistry = ModelRegistry.inMemory(authStorage);
43
43
  await createAgentSession({
44
44
  sessionManager: SessionManager.inMemory(),
45
45
  authStorage,
@@ -24,6 +24,19 @@ await createAgentSession({
24
24
 
25
25
  console.log("Session created with custom settings");
26
26
 
27
+ // Setters update memory immediately and queue persistence writes.
28
+ // Call flush() when you need a durability boundary.
29
+ settingsManager.setDefaultThinkingLevel("low");
30
+ await settingsManager.flush();
31
+
32
+ // Surface settings I/O errors at the app layer.
33
+ const settingsErrors = settingsManager.drainErrors();
34
+ if (settingsErrors.length > 0) {
35
+ for (const { scope, error } of settingsErrors) {
36
+ console.warn(`Warning (${scope} settings): ${error.message}`);
37
+ }
38
+ }
39
+
27
40
  // For testing without file I/O:
28
41
  const inMemorySettings = SettingsManager.inMemory({
29
42
  compaction: { enabled: false },
@@ -22,7 +22,7 @@ import {
22
22
  } from "@mariozechner/pi-coding-agent";
23
23
 
24
24
  // Custom auth storage location
25
- const authStorage = new AuthStorage("/tmp/my-agent/auth.json");
25
+ const authStorage = AuthStorage.create("/tmp/my-agent/auth.json");
26
26
 
27
27
  // Runtime API key override (not persisted)
28
28
  if (process.env.MY_ANTHROPIC_KEY) {
@@ -30,7 +30,7 @@ if (process.env.MY_ANTHROPIC_KEY) {
30
30
  }
31
31
 
32
32
  // Model registry with no custom models.json
33
- const modelRegistry = new ModelRegistry(authStorage);
33
+ const modelRegistry = ModelRegistry.inMemory(authStorage);
34
34
 
35
35
  const model = getModel("anthropic", "claude-sonnet-4-20250514");
36
36
  if (!model) throw new Error("Model not found");
@@ -53,7 +53,6 @@ const resourceLoader: ResourceLoader = {
53
53
  getSystemPrompt: () => `You are a minimal assistant.
54
54
  Available: read, bash. Be concise.`,
55
55
  getAppendSystemPrompt: () => [],
56
- getPathMetadata: () => new Map(),
57
56
  extendResources: () => {},
58
57
  reload: async () => {},
59
58
  };
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Session runtime
3
+ *
4
+ * Use AgentSessionRuntime when you need to replace the active AgentSession,
5
+ * for example for new-session, resume, fork, or import flows.
6
+ *
7
+ * The important pattern is: after the runtime replaces the active session,
8
+ * rebind any session-local subscriptions and extension bindings to `runtime.session`.
9
+ */
10
+
11
+ import {
12
+ type CreateAgentSessionRuntimeFactory,
13
+ createAgentSessionFromServices,
14
+ createAgentSessionRuntime,
15
+ createAgentSessionServices,
16
+ getAgentDir,
17
+ SessionManager,
18
+ } from "@mariozechner/pi-coding-agent";
19
+
20
+ const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
21
+ const services = await createAgentSessionServices({ cwd });
22
+ return {
23
+ ...(await createAgentSessionFromServices({
24
+ services,
25
+ sessionManager,
26
+ sessionStartEvent,
27
+ })),
28
+ services,
29
+ diagnostics: services.diagnostics,
30
+ };
31
+ };
32
+ const runtime = await createAgentSessionRuntime(createRuntime, {
33
+ cwd: process.cwd(),
34
+ agentDir: getAgentDir(),
35
+ sessionManager: SessionManager.create(process.cwd()),
36
+ });
37
+
38
+ let unsubscribe: (() => void) | undefined;
39
+
40
+ async function bindSession() {
41
+ unsubscribe?.();
42
+ const session = runtime.session;
43
+ await session.bindExtensions({});
44
+ unsubscribe = session.subscribe((event) => {
45
+ if (event.type === "queue_update") {
46
+ console.log("Queued:", event.steering.length + event.followUp.length);
47
+ }
48
+ });
49
+ return session;
50
+ }
51
+
52
+ let session = await bindSession();
53
+ const originalSessionFile = session.sessionFile;
54
+ console.log("Initial session:", originalSessionFile);
55
+
56
+ await runtime.newSession();
57
+ session = await bindSession();
58
+ console.log("After newSession():", session.sessionFile);
59
+
60
+ if (originalSessionFile) {
61
+ await runtime.switchSession(originalSessionFile);
62
+ session = await bindSession();
63
+ console.log("After switchSession():", session.sessionFile);
64
+ }
65
+
66
+ unsubscribe?.();
67
+ await runtime.dispose();
@@ -1,6 +1,8 @@
1
1
  # SDK Examples
2
2
 
3
- Programmatic usage of pi-coding-agent via `createAgentSession()`.
3
+ Programmatic usage of pi-coding-agent via `createAgentSession()` and `createAgentSessionRuntime()`.
4
+
5
+ The runtime example shows how to build a recreate function that closes over process-global fixed inputs and recreates cwd-bound services and sessions as the active session cwd changes.
4
6
 
5
7
  ## Examples
6
8
 
@@ -18,6 +20,7 @@ Programmatic usage of pi-coding-agent via `createAgentSession()`.
18
20
  | `10-settings.ts` | Override compaction, retry, terminal settings |
19
21
  | `11-sessions.ts` | In-memory, persistent, continue, list sessions |
20
22
  | `12-full-control.ts` | Replace everything, no discovery |
23
+ | `13-session-runtime.ts` | Manage runtime-backed session replacement |
21
24
 
22
25
  ## Running
23
26
 
@@ -43,8 +46,8 @@ import {
43
46
  } from "@mariozechner/pi-coding-agent";
44
47
 
45
48
  // Auth and models setup
46
- const authStorage = new AuthStorage();
47
- const modelRegistry = new ModelRegistry(authStorage);
49
+ const authStorage = AuthStorage.create();
50
+ const modelRegistry = ModelRegistry.create(authStorage);
48
51
 
49
52
  // Minimal
50
53
  const { session } = await createAgentSession({ authStorage, modelRegistry });
@@ -71,9 +74,9 @@ const { session } = await createAgentSession({
71
74
  });
72
75
 
73
76
  // Full control
74
- const customAuth = new AuthStorage("/my/app/auth.json");
77
+ const customAuth = AuthStorage.create("/my/app/auth.json");
75
78
  customAuth.setRuntimeApiKey("anthropic", process.env.MY_KEY!);
76
- const customRegistry = new ModelRegistry(customAuth);
79
+ const customRegistry = ModelRegistry.create(customAuth);
77
80
 
78
81
  const resourceLoader = new DefaultResourceLoader({
79
82
  systemPromptOverride: () => "You are helpful.",
@@ -108,8 +111,8 @@ await session.prompt("Hello");
108
111
 
109
112
  | Option | Default | Description |
110
113
  |--------|---------|-------------|
111
- | `authStorage` | `new AuthStorage()` | Credential storage |
112
- | `modelRegistry` | `new ModelRegistry(authStorage)` | Model registry |
114
+ | `authStorage` | `AuthStorage.create()` | Credential storage |
115
+ | `modelRegistry` | `ModelRegistry.create(authStorage)` | Model registry |
113
116
  | `cwd` | `process.cwd()` | Working directory |
114
117
  | `agentDir` | `~/.pi/agent` | Config directory |
115
118
  | `model` | From settings/first available | Model to use |