@ouhuang/pi-coding-agent 0.65.1

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