apex-code 0.5.0 → 0.5.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 (509) hide show
  1. package/CHANGELOG.md +257 -5
  2. package/README.md +624 -0
  3. package/dist/bun/cli.d.ts +3 -1
  4. package/dist/bun/cli.d.ts.map +1 -1
  5. package/dist/bun/cli.js +3 -9
  6. package/dist/bun/cli.js.map +1 -1
  7. package/dist/bun/runtime-setup.d.ts +2 -0
  8. package/dist/bun/runtime-setup.d.ts.map +1 -0
  9. package/dist/bun/runtime-setup.js +9 -0
  10. package/dist/bun/runtime-setup.js.map +1 -0
  11. package/dist/bun/sandbox-env-setup.d.ts +2 -0
  12. package/dist/bun/sandbox-env-setup.d.ts.map +1 -0
  13. package/dist/bun/sandbox-env-setup.js +4 -0
  14. package/dist/bun/sandbox-env-setup.js.map +1 -0
  15. package/dist/cli/args.d.ts.map +1 -1
  16. package/dist/cli/args.js +16 -5
  17. package/dist/cli/args.js.map +1 -1
  18. package/dist/cli/config-selector.d.ts.map +1 -1
  19. package/dist/cli/config-selector.js +2 -1
  20. package/dist/cli/config-selector.js.map +1 -1
  21. package/dist/cli/file-processor.d.ts +1 -1
  22. package/dist/cli/file-processor.d.ts.map +1 -1
  23. package/dist/cli/file-processor.js.map +1 -1
  24. package/dist/cli/session-picker.d.ts +1 -1
  25. package/dist/cli/session-picker.d.ts.map +1 -1
  26. package/dist/cli/session-picker.js.map +1 -1
  27. package/dist/cli/setup.d.ts +2 -0
  28. package/dist/cli/setup.d.ts.map +1 -0
  29. package/dist/cli/setup.js +13 -0
  30. package/dist/cli/setup.js.map +1 -0
  31. package/dist/config.d.ts +1 -0
  32. package/dist/config.d.ts.map +1 -1
  33. package/dist/config.js +1 -0
  34. package/dist/config.js.map +1 -1
  35. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  36. package/dist/core/agent-session-runtime.js +16 -8
  37. package/dist/core/agent-session-runtime.js.map +1 -1
  38. package/dist/core/agent-session.d.ts +85 -15
  39. package/dist/core/agent-session.d.ts.map +1 -1
  40. package/dist/core/agent-session.js +685 -266
  41. package/dist/core/agent-session.js.map +1 -1
  42. package/dist/core/auth-storage.d.ts +4 -0
  43. package/dist/core/auth-storage.d.ts.map +1 -1
  44. package/dist/core/auth-storage.js +55 -0
  45. package/dist/core/auth-storage.js.map +1 -1
  46. package/dist/core/bug-report.d.ts +176 -0
  47. package/dist/core/bug-report.d.ts.map +1 -0
  48. package/dist/core/bug-report.js +291 -0
  49. package/dist/core/bug-report.js.map +1 -0
  50. package/dist/core/cache-stats.d.ts.map +1 -1
  51. package/dist/core/cache-stats.js +12 -1
  52. package/dist/core/cache-stats.js.map +1 -1
  53. package/dist/core/cache-warmer.d.ts +103 -0
  54. package/dist/core/cache-warmer.d.ts.map +1 -0
  55. package/dist/core/cache-warmer.js +356 -0
  56. package/dist/core/cache-warmer.js.map +1 -0
  57. package/dist/core/compaction/branch-summarization.d.ts +1 -1
  58. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  59. package/dist/core/compaction/branch-summarization.js +4 -3
  60. package/dist/core/compaction/branch-summarization.js.map +1 -1
  61. package/dist/core/compaction/compaction.d.ts +5 -3
  62. package/dist/core/compaction/compaction.d.ts.map +1 -1
  63. package/dist/core/compaction/compaction.js +163 -66
  64. package/dist/core/compaction/compaction.js.map +1 -1
  65. package/dist/core/context/pipeline.d.ts +8 -8
  66. package/dist/core/context/pipeline.d.ts.map +1 -1
  67. package/dist/core/context/pipeline.js +21 -12
  68. package/dist/core/context/pipeline.js.map +1 -1
  69. package/dist/core/crash-log.d.ts +27 -0
  70. package/dist/core/crash-log.d.ts.map +1 -0
  71. package/dist/core/crash-log.js +139 -0
  72. package/dist/core/crash-log.js.map +1 -0
  73. package/dist/core/export-html/template.js +6 -1
  74. package/dist/core/extensions/index.d.ts +1 -1
  75. package/dist/core/extensions/index.d.ts.map +1 -1
  76. package/dist/core/extensions/index.js.map +1 -1
  77. package/dist/core/extensions/jiti-loader.d.ts +2 -0
  78. package/dist/core/extensions/jiti-loader.d.ts.map +1 -0
  79. package/dist/core/extensions/jiti-loader.js +4 -0
  80. package/dist/core/extensions/jiti-loader.js.map +1 -0
  81. package/dist/core/extensions/jiti-static-loader.d.ts +2 -0
  82. package/dist/core/extensions/jiti-static-loader.d.ts.map +1 -0
  83. package/dist/core/extensions/jiti-static-loader.js +4 -0
  84. package/dist/core/extensions/jiti-static-loader.js.map +1 -0
  85. package/dist/core/extensions/loader.d.ts.map +1 -1
  86. package/dist/core/extensions/loader.js +40 -59
  87. package/dist/core/extensions/loader.js.map +1 -1
  88. package/dist/core/extensions/runner.d.ts +24 -8
  89. package/dist/core/extensions/runner.d.ts.map +1 -1
  90. package/dist/core/extensions/runner.js +195 -72
  91. package/dist/core/extensions/runner.js.map +1 -1
  92. package/dist/core/extensions/types.d.ts +142 -55
  93. package/dist/core/extensions/types.d.ts.map +1 -1
  94. package/dist/core/extensions/types.js.map +1 -1
  95. package/dist/core/extensions/virtual-modules.d.ts +3 -0
  96. package/dist/core/extensions/virtual-modules.d.ts.map +1 -0
  97. package/dist/core/extensions/virtual-modules.js +41 -0
  98. package/dist/core/extensions/virtual-modules.js.map +1 -0
  99. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  100. package/dist/core/extensions/wrapper.js +1 -20
  101. package/dist/core/extensions/wrapper.js.map +1 -1
  102. package/dist/core/http-dispatcher.d.ts.map +1 -1
  103. package/dist/core/http-dispatcher.js +2 -0
  104. package/dist/core/http-dispatcher.js.map +1 -1
  105. package/dist/core/index.d.ts +2 -1
  106. package/dist/core/index.d.ts.map +1 -1
  107. package/dist/core/index.js.map +1 -1
  108. package/dist/core/keybindings.d.ts +6 -1
  109. package/dist/core/keybindings.d.ts.map +1 -1
  110. package/dist/core/keybindings.js +5 -1
  111. package/dist/core/keybindings.js.map +1 -1
  112. package/dist/core/messages.d.ts +1 -1
  113. package/dist/core/messages.d.ts.map +1 -1
  114. package/dist/core/messages.js +1 -0
  115. package/dist/core/messages.js.map +1 -1
  116. package/dist/core/model-config.d.ts +168 -20
  117. package/dist/core/model-config.d.ts.map +1 -1
  118. package/dist/core/model-config.js +44 -18
  119. package/dist/core/model-config.js.map +1 -1
  120. package/dist/core/model-registry.d.ts +5 -1
  121. package/dist/core/model-registry.d.ts.map +1 -1
  122. package/dist/core/model-registry.js +8 -0
  123. package/dist/core/model-registry.js.map +1 -1
  124. package/dist/core/model-resolver.d.ts.map +1 -1
  125. package/dist/core/model-resolver.js +4 -3
  126. package/dist/core/model-resolver.js.map +1 -1
  127. package/dist/core/model-runtime.d.ts +1 -0
  128. package/dist/core/model-runtime.d.ts.map +1 -1
  129. package/dist/core/model-runtime.js +12 -6
  130. package/dist/core/model-runtime.js.map +1 -1
  131. package/dist/core/permissions/store.d.ts.map +1 -1
  132. package/dist/core/permissions/store.js +11 -8
  133. package/dist/core/permissions/store.js.map +1 -1
  134. package/dist/core/prompt-templates.d.ts +6 -1
  135. package/dist/core/prompt-templates.d.ts.map +1 -1
  136. package/dist/core/prompt-templates.js +61 -35
  137. package/dist/core/prompt-templates.js.map +1 -1
  138. package/dist/core/provider-composer.d.ts +4 -2
  139. package/dist/core/provider-composer.d.ts.map +1 -1
  140. package/dist/core/provider-composer.js +29 -2
  141. package/dist/core/provider-composer.js.map +1 -1
  142. package/dist/core/radius.d.ts +3 -0
  143. package/dist/core/radius.d.ts.map +1 -1
  144. package/dist/core/radius.js +6 -0
  145. package/dist/core/radius.js.map +1 -1
  146. package/dist/core/resource-loader.d.ts.map +1 -1
  147. package/dist/core/resource-loader.js +6 -2
  148. package/dist/core/resource-loader.js.map +1 -1
  149. package/dist/core/sdk.d.ts.map +1 -1
  150. package/dist/core/sdk.js +63 -42
  151. package/dist/core/sdk.js.map +1 -1
  152. package/dist/core/session-export.d.ts +6 -2
  153. package/dist/core/session-export.d.ts.map +1 -1
  154. package/dist/core/session-export.js +14 -13
  155. package/dist/core/session-export.js.map +1 -1
  156. package/dist/core/session-manager.d.ts +66 -15
  157. package/dist/core/session-manager.d.ts.map +1 -1
  158. package/dist/core/session-manager.js +295 -115
  159. package/dist/core/session-manager.js.map +1 -1
  160. package/dist/core/settings-manager.d.ts +27 -4
  161. package/dist/core/settings-manager.d.ts.map +1 -1
  162. package/dist/core/settings-manager.js +55 -7
  163. package/dist/core/settings-manager.js.map +1 -1
  164. package/dist/core/skills.d.ts +1 -1
  165. package/dist/core/skills.d.ts.map +1 -1
  166. package/dist/core/skills.js +5 -4
  167. package/dist/core/skills.js.map +1 -1
  168. package/dist/core/slash-commands.d.ts.map +1 -1
  169. package/dist/core/slash-commands.js +1 -0
  170. package/dist/core/slash-commands.js.map +1 -1
  171. package/dist/core/system-prompt.d.ts +49 -6
  172. package/dist/core/system-prompt.d.ts.map +1 -1
  173. package/dist/core/system-prompt.js +140 -79
  174. package/dist/core/system-prompt.js.map +1 -1
  175. package/dist/core/tools/bash.d.ts +7 -8
  176. package/dist/core/tools/bash.d.ts.map +1 -1
  177. package/dist/core/tools/bash.js +20 -115
  178. package/dist/core/tools/bash.js.map +1 -1
  179. package/dist/core/tools/edit.d.ts +1 -12
  180. package/dist/core/tools/edit.d.ts.map +1 -1
  181. package/dist/core/tools/edit.js +6 -204
  182. package/dist/core/tools/edit.js.map +1 -1
  183. package/dist/core/tools/find.d.ts.map +1 -1
  184. package/dist/core/tools/find.js +4 -55
  185. package/dist/core/tools/find.js.map +1 -1
  186. package/dist/core/tools/grep.d.ts.map +1 -1
  187. package/dist/core/tools/grep.js +4 -60
  188. package/dist/core/tools/grep.js.map +1 -1
  189. package/dist/core/tools/ls.d.ts.map +1 -1
  190. package/dist/core/tools/ls.js +4 -49
  191. package/dist/core/tools/ls.js.map +1 -1
  192. package/dist/core/tools/read.d.ts +4 -1
  193. package/dist/core/tools/read.d.ts.map +1 -1
  194. package/dist/core/tools/read.js +10 -125
  195. package/dist/core/tools/read.js.map +1 -1
  196. package/dist/core/tools/renderers/bash.d.ts +18 -0
  197. package/dist/core/tools/renderers/bash.d.ts.map +1 -0
  198. package/dist/core/tools/renderers/bash.js +126 -0
  199. package/dist/core/tools/renderers/bash.js.map +1 -0
  200. package/dist/core/tools/renderers/edit.d.ts +23 -0
  201. package/dist/core/tools/renderers/edit.d.ts.map +1 -0
  202. package/dist/core/tools/renderers/edit.js +207 -0
  203. package/dist/core/tools/renderers/edit.js.map +1 -0
  204. package/dist/core/tools/renderers/find.d.ts +10 -0
  205. package/dist/core/tools/renderers/find.d.ts.map +1 -0
  206. package/dist/core/tools/renderers/find.js +64 -0
  207. package/dist/core/tools/renderers/find.js.map +1 -0
  208. package/dist/core/tools/renderers/grep.d.ts +10 -0
  209. package/dist/core/tools/renderers/grep.d.ts.map +1 -0
  210. package/dist/core/tools/renderers/grep.js +69 -0
  211. package/dist/core/tools/renderers/grep.js.map +1 -0
  212. package/dist/core/tools/renderers/index.d.ts +34 -0
  213. package/dist/core/tools/renderers/index.d.ts.map +1 -0
  214. package/dist/core/tools/renderers/index.js +47 -0
  215. package/dist/core/tools/renderers/index.js.map +1 -0
  216. package/dist/core/tools/renderers/ls.d.ts +10 -0
  217. package/dist/core/tools/renderers/ls.d.ts.map +1 -0
  218. package/dist/core/tools/renderers/ls.js +58 -0
  219. package/dist/core/tools/renderers/ls.js.map +1 -0
  220. package/dist/core/tools/renderers/read.d.ts +11 -0
  221. package/dist/core/tools/renderers/read.d.ts.map +1 -0
  222. package/dist/core/tools/renderers/read.js +132 -0
  223. package/dist/core/tools/renderers/read.js.map +1 -0
  224. package/dist/core/tools/renderers/write.d.ts +10 -0
  225. package/dist/core/tools/renderers/write.d.ts.map +1 -0
  226. package/dist/core/tools/renderers/write.js +152 -0
  227. package/dist/core/tools/renderers/write.js.map +1 -0
  228. package/dist/core/tools/write.d.ts.map +1 -1
  229. package/dist/core/tools/write.js +6 -146
  230. package/dist/core/tools/write.js.map +1 -1
  231. package/dist/core/usage-totals.d.ts +1 -1
  232. package/dist/core/usage-totals.d.ts.map +1 -1
  233. package/dist/core/usage-totals.js +5 -1
  234. package/dist/core/usage-totals.js.map +1 -1
  235. package/dist/extensions/llama/client.d.ts +2 -0
  236. package/dist/extensions/llama/client.d.ts.map +1 -1
  237. package/dist/extensions/llama/client.js +7 -3
  238. package/dist/extensions/llama/client.js.map +1 -1
  239. package/dist/extensions/llama/provider.d.ts.map +1 -1
  240. package/dist/extensions/llama/provider.js +20 -5
  241. package/dist/extensions/llama/provider.js.map +1 -1
  242. package/dist/index.d.ts +5 -4
  243. package/dist/index.d.ts.map +1 -1
  244. package/dist/index.js +1 -1
  245. package/dist/index.js.map +1 -1
  246. package/dist/main.d.ts.map +1 -1
  247. package/dist/main.js +21 -13
  248. package/dist/main.js.map +1 -1
  249. package/dist/modes/interactive/bug-report.d.ts +16 -0
  250. package/dist/modes/interactive/bug-report.d.ts.map +1 -0
  251. package/dist/modes/interactive/bug-report.js +167 -0
  252. package/dist/modes/interactive/bug-report.js.map +1 -0
  253. package/dist/modes/interactive/chat-viewport.d.ts +20 -0
  254. package/dist/modes/interactive/chat-viewport.d.ts.map +1 -0
  255. package/dist/modes/interactive/chat-viewport.js +28 -0
  256. package/dist/modes/interactive/chat-viewport.js.map +1 -0
  257. package/dist/modes/interactive/components/assistant-message.d.ts +7 -0
  258. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  259. package/dist/modes/interactive/components/assistant-message.js +63 -17
  260. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  261. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  262. package/dist/modes/interactive/components/branch-summary-message.js +12 -5
  263. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  264. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  265. package/dist/modes/interactive/components/compaction-summary-message.js +12 -5
  266. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  267. package/dist/modes/interactive/components/custom-editor.d.ts +12 -0
  268. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  269. package/dist/modes/interactive/components/custom-editor.js +38 -0
  270. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  271. package/dist/modes/interactive/components/error-summary.d.ts +11 -0
  272. package/dist/modes/interactive/components/error-summary.d.ts.map +1 -0
  273. package/dist/modes/interactive/components/error-summary.js +31 -0
  274. package/dist/modes/interactive/components/error-summary.js.map +1 -0
  275. package/dist/modes/interactive/components/extension-editor.d.ts +4 -1
  276. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  277. package/dist/modes/interactive/components/extension-editor.js +6 -1
  278. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  279. package/dist/modes/interactive/components/extension-input.d.ts +2 -0
  280. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  281. package/dist/modes/interactive/components/extension-input.js +6 -0
  282. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  283. package/dist/modes/interactive/components/extension-selector.d.ts +2 -0
  284. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  285. package/dist/modes/interactive/components/extension-selector.js +4 -0
  286. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  287. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  288. package/dist/modes/interactive/components/footer.js +4 -1
  289. package/dist/modes/interactive/components/footer.js.map +1 -1
  290. package/dist/modes/interactive/components/index.d.ts +1 -1
  291. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  292. package/dist/modes/interactive/components/index.js.map +1 -1
  293. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  294. package/dist/modes/interactive/components/model-selector.js +3 -3
  295. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  296. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  297. package/dist/modes/interactive/components/scoped-models-selector.js +13 -15
  298. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  299. package/dist/modes/interactive/components/session-selector.d.ts +5 -5
  300. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  301. package/dist/modes/interactive/components/session-selector.js +74 -48
  302. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  303. package/dist/modes/interactive/components/settings-selector.d.ts +5 -1
  304. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  305. package/dist/modes/interactive/components/settings-selector.js +35 -10
  306. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  307. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  308. package/dist/modes/interactive/components/skill-invocation-message.js +11 -4
  309. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  310. package/dist/modes/interactive/components/status-indicator.d.ts +3 -1
  311. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  312. package/dist/modes/interactive/components/status-indicator.js +10 -3
  313. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  314. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  315. package/dist/modes/interactive/components/thinking-selector.js +6 -6
  316. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  317. package/dist/modes/interactive/components/tool-execution.d.ts +27 -5
  318. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  319. package/dist/modes/interactive/components/tool-execution.js +64 -42
  320. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  321. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  322. package/dist/modes/interactive/components/tree-selector.js +9 -0
  323. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  324. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
  325. package/dist/modes/interactive/components/trust-selector.js +2 -2
  326. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  327. package/dist/modes/interactive/interactive-mode.d.ts +43 -29
  328. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  329. package/dist/modes/interactive/interactive-mode.js +431 -166
  330. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  331. package/dist/modes/interactive/theme/dark.json +2 -1
  332. package/dist/modes/interactive/theme/light.json +2 -1
  333. package/dist/modes/interactive/theme/theme-controller.d.ts +1 -0
  334. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  335. package/dist/modes/interactive/theme/theme-controller.js +5 -0
  336. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  337. package/dist/modes/interactive/theme/theme-json.d.ts +84 -0
  338. package/dist/modes/interactive/theme/theme-json.d.ts.map +1 -0
  339. package/dist/modes/interactive/theme/theme-json.js +130 -0
  340. package/dist/modes/interactive/theme/theme-json.js.map +1 -0
  341. package/dist/modes/interactive/theme/theme-schema.json +6 -2
  342. package/dist/modes/interactive/theme/theme.d.ts +14 -5
  343. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  344. package/dist/modes/interactive/theme/theme.js +18 -119
  345. package/dist/modes/interactive/theme/theme.js.map +1 -1
  346. package/dist/modes/interactive/tui-renderer.d.ts +21 -0
  347. package/dist/modes/interactive/tui-renderer.d.ts.map +1 -0
  348. package/dist/modes/interactive/tui-renderer.js +66 -0
  349. package/dist/modes/interactive/tui-renderer.js.map +1 -0
  350. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  351. package/dist/modes/rpc/rpc-mode.js +2 -2
  352. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  353. package/dist/testing/replay/recorded-provider.d.ts +2 -2
  354. package/dist/testing/replay/recorded-provider.d.ts.map +1 -1
  355. package/dist/testing/replay/recorded-provider.js +2 -5
  356. package/dist/testing/replay/recorded-provider.js.map +1 -1
  357. package/dist/testing/replay/runner.d.ts.map +1 -1
  358. package/dist/testing/replay/runner.js +0 -1
  359. package/dist/testing/replay/runner.js.map +1 -1
  360. package/dist/utils/clipboard-command.d.ts +7 -0
  361. package/dist/utils/clipboard-command.d.ts.map +1 -0
  362. package/dist/utils/clipboard-command.js +45 -0
  363. package/dist/utils/clipboard-command.js.map +1 -0
  364. package/dist/utils/clipboard-image.d.ts.map +1 -1
  365. package/dist/utils/clipboard-image.js +53 -81
  366. package/dist/utils/clipboard-image.js.map +1 -1
  367. package/dist/utils/clipboard.d.ts.map +1 -1
  368. package/dist/utils/clipboard.js +111 -121
  369. package/dist/utils/clipboard.js.map +1 -1
  370. package/dist/utils/exif-orientation.d.ts.map +1 -1
  371. package/dist/utils/exif-orientation.js +2 -3
  372. package/dist/utils/exif-orientation.js.map +1 -1
  373. package/dist/utils/mime.d.ts.map +1 -1
  374. package/dist/utils/mime.js +1 -1
  375. package/dist/utils/mime.js.map +1 -1
  376. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  377. package/dist/utils/syntax-highlight.js +21 -21
  378. package/dist/utils/syntax-highlight.js.map +1 -1
  379. package/dist/utils/tool-result-images.d.ts +3 -1
  380. package/dist/utils/tool-result-images.d.ts.map +1 -1
  381. package/dist/utils/tool-result-images.js +4 -1
  382. package/dist/utils/tool-result-images.js.map +1 -1
  383. package/dist/utils/tools-manager.d.ts.map +1 -1
  384. package/dist/utils/tools-manager.js +11 -2
  385. package/dist/utils/tools-manager.js.map +1 -1
  386. package/dist/utils/wsl.d.ts +3 -0
  387. package/dist/utils/wsl.d.ts.map +1 -0
  388. package/dist/utils/wsl.js +15 -0
  389. package/dist/utils/wsl.js.map +1 -0
  390. package/dist/utils/zip.d.ts +7 -0
  391. package/dist/utils/zip.d.ts.map +1 -0
  392. package/dist/utils/zip.js +60 -0
  393. package/dist/utils/zip.js.map +1 -0
  394. package/docs/cli-integration.md +107 -0
  395. package/docs/cli.md +269 -0
  396. package/docs/compaction.md +73 -24
  397. package/docs/configuration.md +45 -0
  398. package/docs/containerization.md +22 -21
  399. package/docs/custom-provider.md +21 -12
  400. package/docs/development.md +19 -0
  401. package/docs/docs.json +139 -95
  402. package/docs/extensions.md +243 -371
  403. package/docs/how-pi-works.md +49 -0
  404. package/docs/images/interactive-mode.png +0 -0
  405. package/docs/index.md +3 -3
  406. package/docs/json.md +7 -3
  407. package/docs/keybindings.md +57 -54
  408. package/docs/llama-cpp.md +2 -2
  409. package/docs/message-types.md +261 -0
  410. package/docs/models.md +103 -49
  411. package/docs/packages.md +49 -47
  412. package/docs/prompt-templates.md +29 -56
  413. package/docs/providers.md +91 -139
  414. package/docs/quickstart.md +42 -14
  415. package/docs/rpc-commands.md +854 -0
  416. package/docs/rpc-extension-ui.md +200 -0
  417. package/docs/rpc.md +121 -223
  418. package/docs/sdk.md +99 -124
  419. package/docs/security.md +7 -7
  420. package/docs/session-format.md +85 -82
  421. package/docs/sessions.md +41 -57
  422. package/docs/settings.md +94 -87
  423. package/docs/shell-aliases.md +68 -3
  424. package/docs/skills.md +62 -49
  425. package/docs/slash-commands.md +60 -0
  426. package/docs/terminal-setup.md +86 -55
  427. package/docs/termux.md +65 -75
  428. package/docs/themes.md +64 -86
  429. package/docs/tmux.md +29 -7
  430. package/docs/tui.md +67 -122
  431. package/docs/usage.md +31 -42
  432. package/docs/windows.md +41 -13
  433. package/examples/README.md +16 -2
  434. package/examples/extensions/README.md +0 -1
  435. package/examples/extensions/custom-provider-anthropic/index.ts +18 -12
  436. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  437. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  438. package/examples/extensions/custom-provider-gitlab-duo/index.ts +2 -2
  439. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  440. package/examples/extensions/dynamic-resources/dynamic.json +2 -0
  441. package/examples/extensions/gondolin/package-lock.json +2 -2
  442. package/examples/extensions/gondolin/package.json +1 -1
  443. package/examples/extensions/prompt-customizer.ts +19 -67
  444. package/examples/extensions/sandbox/package-lock.json +2 -2
  445. package/examples/extensions/sandbox/package.json +1 -1
  446. package/examples/extensions/with-deps/package-lock.json +2 -2
  447. package/examples/extensions/with-deps/package.json +1 -1
  448. package/examples/plugins/pi-example-plugin/README.md +38 -0
  449. package/examples/plugins/pi-example-plugin/package.json +10 -0
  450. package/examples/plugins/pi-example-plugin/src/contract.ts +13 -0
  451. package/examples/plugins/pi-example-plugin/src/session.ts +24 -0
  452. package/examples/plugins/pi-example-plugin/src/tui.ts +31 -0
  453. package/examples/rpc-client.ts +35 -0
  454. package/examples/rpc-extension-ui.ts +25 -5
  455. package/examples/sdk/README.md +1 -1
  456. package/npm-shrinkwrap.json +861 -513
  457. package/package.json +27 -18
  458. package/dist/bun/register-bedrock.d.ts +0 -2
  459. package/dist/bun/register-bedrock.d.ts.map +0 -1
  460. package/dist/bun/register-bedrock.js +0 -4
  461. package/dist/bun/register-bedrock.js.map +0 -1
  462. package/dist/cli/experimental/auth.d.ts +0 -16
  463. package/dist/cli/experimental/auth.d.ts.map +0 -1
  464. package/dist/cli/experimental/auth.js +0 -13
  465. package/dist/cli/experimental/auth.js.map +0 -1
  466. package/dist/cli/experimental/cli.d.ts +0 -6
  467. package/dist/cli/experimental/cli.d.ts.map +0 -1
  468. package/dist/cli/experimental/cli.js +0 -5
  469. package/dist/cli/experimental/cli.js.map +0 -1
  470. package/dist/cli/experimental/command-options.d.ts +0 -17
  471. package/dist/cli/experimental/command-options.d.ts.map +0 -1
  472. package/dist/cli/experimental/command-options.js +0 -35
  473. package/dist/cli/experimental/command-options.js.map +0 -1
  474. package/dist/cli/experimental/command.d.ts +0 -63
  475. package/dist/cli/experimental/command.d.ts.map +0 -1
  476. package/dist/cli/experimental/command.js +0 -130
  477. package/dist/cli/experimental/command.js.map +0 -1
  478. package/dist/cli/experimental/commands/client.d.ts +0 -13
  479. package/dist/cli/experimental/commands/client.d.ts.map +0 -1
  480. package/dist/cli/experimental/commands/client.js +0 -25
  481. package/dist/cli/experimental/commands/client.js.map +0 -1
  482. package/dist/cli/experimental/commands/pi.d.ts +0 -15
  483. package/dist/cli/experimental/commands/pi.d.ts.map +0 -1
  484. package/dist/cli/experimental/commands/pi.js +0 -28
  485. package/dist/cli/experimental/commands/pi.js.map +0 -1
  486. package/dist/cli/experimental/commands/server.d.ts +0 -13
  487. package/dist/cli/experimental/commands/server.d.ts.map +0 -1
  488. package/dist/cli/experimental/commands/server.js +0 -25
  489. package/dist/cli/experimental/commands/server.js.map +0 -1
  490. package/dist/cli/experimental/transport-address.d.ts +0 -10
  491. package/dist/cli/experimental/transport-address.d.ts.map +0 -1
  492. package/dist/cli/experimental/transport-address.js +0 -38
  493. package/dist/cli/experimental/transport-address.js.map +0 -1
  494. package/dist/client/index.d.ts +0 -3
  495. package/dist/client/index.d.ts.map +0 -1
  496. package/dist/client/index.js +0 -3
  497. package/dist/client/index.js.map +0 -1
  498. package/dist/client/remote-session.d.ts +0 -53
  499. package/dist/client/remote-session.d.ts.map +0 -1
  500. package/dist/client/remote-session.js +0 -340
  501. package/dist/client/remote-session.js.map +0 -1
  502. package/dist/client/transcript.d.ts +0 -12
  503. package/dist/client/transcript.d.ts.map +0 -1
  504. package/dist/client/transcript.js +0 -98
  505. package/dist/client/transcript.js.map +0 -1
  506. package/dist/utils/clipboard-native.d.ts +0 -11
  507. package/dist/utils/clipboard-native.d.ts.map +0 -1
  508. package/dist/utils/clipboard-native.js +0 -20
  509. package/dist/utils/clipboard-native.js.map +0 -1
@@ -0,0 +1,200 @@
1
+ # RPC Extension UI
2
+
3
+ Extensions can request user interaction through `ctx.ui`. In RPC mode, supported calls become a request/response subprotocol alongside normal [RPC commands](rpc-commands.md) and [session events](json.md).
4
+
5
+ There are two categories of extension UI methods:
6
+
7
+ - **Dialog methods** (`select`, `confirm`, `input`, `editor`): emit an `extension_ui_request` on stdout and block until the client sends back an `extension_ui_response` on stdin with the matching `id`.
8
+ - **Fire-and-forget methods** (`notify`, `setStatus`, `setWidget`, `setTitle`, `set_editor_text`): emit an `extension_ui_request` on stdout but do not expect a response. The client can display the information or ignore it.
9
+
10
+ If a dialog method includes a `timeout` field, the agent-side will auto-resolve with a default value when the timeout expires. The client does not need to track timeouts.
11
+
12
+ ## Limitations
13
+
14
+ Some `ExtensionUIContext` methods are not supported or degraded in RPC mode because they require direct terminal UI access:
15
+
16
+ - `custom()` returns `undefined`.
17
+ - `onTerminalInput()` returns a no-op unsubscribe function.
18
+ - `setWorkingMessage()`, `setWorkingVisible()`, `setWorkingIndicator()`, `setHiddenThinkingLabel()`, `setFooter()`, `setHeader()`, `addAutocompleteProvider()`, `setEditorComponent()`, and `setToolsExpanded()` are no-ops.
19
+ - `getEditorText()` returns `""` and `getEditorComponent()` returns `undefined`.
20
+ - `getToolsExpanded()` returns `false`.
21
+ - `pasteToEditor()` delegates to `setEditorText()` without terminal paste handling.
22
+ - `getAllThemes()` returns `[]`, and `getTheme()` returns `undefined`.
23
+ - `setTheme()` returns `{ success: false, error: "Theme switching not supported in RPC mode" }`.
24
+
25
+ Note: `ctx.mode` is `"rpc"` and `ctx.hasUI` is `true` in RPC mode because the dialog and fire-and-forget methods are functional via the extension UI sub-protocol. Use `ctx.mode === "tui"` to guard TUI-specific features like `custom()` that require a real terminal.
26
+
27
+ ## Requests from Apex Code
28
+
29
+ All requests have `type: "extension_ui_request"`, a unique `id`, and a `method` field.
30
+
31
+ ### select
32
+
33
+ Prompt the user to choose from a list. Dialog methods with a `timeout` field include the timeout in milliseconds; the agent auto-resolves with `undefined` if the client doesn't respond in time.
34
+
35
+ ```json
36
+ {
37
+ "type": "extension_ui_request",
38
+ "id": "uuid-1",
39
+ "method": "select",
40
+ "title": "Allow dangerous command?",
41
+ "options": ["Allow", "Block"],
42
+ "timeout": 10000
43
+ }
44
+ ```
45
+
46
+ Expected response: `extension_ui_response` with `value` (the selected option string) or `cancelled: true`.
47
+
48
+ ### confirm
49
+
50
+ Prompt the user for yes/no confirmation.
51
+
52
+ ```json
53
+ {
54
+ "type": "extension_ui_request",
55
+ "id": "uuid-2",
56
+ "method": "confirm",
57
+ "title": "Clear session?",
58
+ "message": "All messages will be lost.",
59
+ "timeout": 5000
60
+ }
61
+ ```
62
+
63
+ Expected response: `extension_ui_response` with `confirmed: true/false` or `cancelled: true`.
64
+
65
+ ### input
66
+
67
+ Prompt the user for free-form text.
68
+
69
+ ```json
70
+ {
71
+ "type": "extension_ui_request",
72
+ "id": "uuid-3",
73
+ "method": "input",
74
+ "title": "Enter a value",
75
+ "placeholder": "type something..."
76
+ }
77
+ ```
78
+
79
+ Expected response: `extension_ui_response` with `value` (the entered text) or `cancelled: true`.
80
+
81
+ ### editor
82
+
83
+ Open a multi-line text editor with optional prefilled content.
84
+
85
+ ```json
86
+ {
87
+ "type": "extension_ui_request",
88
+ "id": "uuid-4",
89
+ "method": "editor",
90
+ "title": "Edit some text",
91
+ "prefill": "Line 1\nLine 2\nLine 3"
92
+ }
93
+ ```
94
+
95
+ Expected response: `extension_ui_response` with `value` (the edited text) or `cancelled: true`.
96
+
97
+ ### notify
98
+
99
+ Display a notification. Fire-and-forget, no response expected.
100
+
101
+ ```json
102
+ {
103
+ "type": "extension_ui_request",
104
+ "id": "uuid-5",
105
+ "method": "notify",
106
+ "message": "Command blocked by user",
107
+ "notifyType": "warning"
108
+ }
109
+ ```
110
+
111
+ The `notifyType` field is `"info"`, `"warning"`, or `"error"`. Defaults to `"info"` if omitted.
112
+
113
+ ### setStatus
114
+
115
+ Set or clear a status entry in the footer/status bar. Fire-and-forget.
116
+
117
+ ```json
118
+ {
119
+ "type": "extension_ui_request",
120
+ "id": "uuid-6",
121
+ "method": "setStatus",
122
+ "statusKey": "my-ext",
123
+ "statusText": "Turn 3 running..."
124
+ }
125
+ ```
126
+
127
+ Send `statusText: undefined` (or omit it) to clear the status entry for that key.
128
+
129
+ ### setWidget
130
+
131
+ Set or clear a widget (block of text lines) displayed above or below the editor. Fire-and-forget.
132
+
133
+ ```json
134
+ {
135
+ "type": "extension_ui_request",
136
+ "id": "uuid-7",
137
+ "method": "setWidget",
138
+ "widgetKey": "my-ext",
139
+ "widgetLines": ["--- My Widget ---", "Line 1", "Line 2"],
140
+ "widgetPlacement": "aboveEditor"
141
+ }
142
+ ```
143
+
144
+ Send `widgetLines: undefined` (or omit it) to clear the widget. The `widgetPlacement` field is `"aboveEditor"` (default) or `"belowEditor"`. Only string arrays are supported in RPC mode; component factories are ignored.
145
+
146
+ ### setTitle
147
+
148
+ Set the terminal window/tab title. Fire-and-forget.
149
+
150
+ ```json
151
+ {
152
+ "type": "extension_ui_request",
153
+ "id": "uuid-8",
154
+ "method": "setTitle",
155
+ "title": "Apex Code - my project"
156
+ }
157
+ ```
158
+
159
+ ### set_editor_text
160
+
161
+ Set the text in the input editor. Fire-and-forget.
162
+
163
+ ```json
164
+ {
165
+ "type": "extension_ui_request",
166
+ "id": "uuid-9",
167
+ "method": "set_editor_text",
168
+ "text": "prefilled text for the user"
169
+ }
170
+ ```
171
+
172
+ ## Responses to Apex Code
173
+
174
+ Responses are sent for dialog methods only (`select`, `confirm`, `input`, `editor`). The `id` must match the request.
175
+
176
+ ### Value response (select, input, editor)
177
+
178
+ ```json
179
+ {"type": "extension_ui_response", "id": "uuid-1", "value": "Allow"}
180
+ ```
181
+
182
+ ### Confirmation response (confirm)
183
+
184
+ ```json
185
+ {"type": "extension_ui_response", "id": "uuid-2", "confirmed": true}
186
+ ```
187
+
188
+ ### Cancellation response (any dialog)
189
+
190
+ Dismiss any dialog method. The extension receives `undefined` (for select/input/editor) or `false` (for confirm).
191
+
192
+ ```json
193
+ {"type": "extension_ui_response", "id": "uuid-3", "cancelled": true}
194
+ ```
195
+
196
+ ## Example
197
+
198
+ See the checked [RPC extension UI client](../examples/rpc-extension-ui.ts) and its [demo extension](../examples/extensions/rpc-demo.ts).
199
+
200
+ The exported request and response unions are defined in [`rpc-types.ts`](https://github.com/Fchery87/apex-code/blob/main/packages/coding-agent/src/modes/rpc/rpc-types.ts). See [Extensions](extensions.md#ui-and-modes) for mode-independent extension guidance.
package/docs/rpc.md CHANGED
@@ -1,38 +1,38 @@
1
1
  # RPC Mode
2
2
 
3
- RPC mode enables headless operation of the coding agent via a JSON protocol over stdin/stdout. This is useful for embedding the agent in other applications, IDEs, or custom UIs.
3
+ RPC mode runs Pi as a long-lived subprocess controlled through JSON records on stdin and stdout. Use it for language-independent integrations, process isolation, IDEs, and custom user interfaces.
4
4
 
5
5
  **Note for Node.js/TypeScript users**: If you're building a Node.js application, consider using `AgentSession` directly from `apex-code` instead of spawning a subprocess. See [`src/core/agent-session.ts`](../src/core/agent-session.ts) for the API. For a subprocess-based TypeScript client, see [`src/modes/rpc/rpc-client.ts`](../src/modes/rpc/rpc-client.ts).
6
6
 
7
- ## Starting RPC Mode
7
+ | Interface | Process boundary | Control model | Best fit |
8
+ |---|---|---|---|
9
+ | [SDK](sdk.md) | In process | Direct TypeScript methods and events | Node.js or Bun hosts that want complete API access |
10
+ | RPC | Child process | JSONL commands, responses, and events | Other languages, isolated processes, IDEs, or custom clients |
11
+
12
+ ## Start RPC mode
8
13
 
9
14
  ```bash
10
15
  apex-code --mode rpc [options]
11
16
  ```
12
17
 
13
- Common options:
14
- - `--provider <name>`: Set the LLM provider (anthropic, openai, google, etc.)
15
- - `--model <pattern>`: Model pattern or ID (supports `provider/id` and optional `:<thinking>`)
16
- - `--name <name>` / `-n <name>`: Set the session display name at startup
17
- - `--no-session`: Disable session persistence
18
- - `--session-dir <path>`: Custom session storage directory
18
+ Normal CLI options still select the working folder, model, tools, resources, and session behavior. Common choices include `--provider`, `--model`, `--name`, `--no-session`, and `--session-dir`. See [Command Line](cli.md) for the complete, version-specific interface; `apex-code --help` is authoritative for the installed version.
19
19
 
20
- ## Protocol Overview
20
+ RPC mode rejects `@file` prompt arguments. Send prompts through the [`prompt`](rpc-commands.md#prompt) command instead.
21
21
 
22
- - **Commands**: JSON objects sent to stdin, one per line
23
- - **Responses**: JSON objects with `type: "response"` indicating command success/failure
24
- - **Events**: Agent events streamed to stdout as JSON lines
22
+ ## Protocol records
25
23
 
26
- All commands support an optional `id` field for request/response correlation. If provided, the corresponding response will include the same `id`. `bash_execution_update` events also include the `id` of their originating `bash` command.
24
+ The protocol has four record families:
27
25
 
28
- ### Framing
26
+ | Direction | Record | Purpose |
27
+ |---|---|---|
28
+ | stdin | Command | Ask Pi to prompt, inspect state, change configuration, or manage the session |
29
+ | stdout | `response` | Report whether one command succeeded and return any command data |
30
+ | stdout | Session event | Stream run, message, tool, queue, compaction, and retry activity |
31
+ | Both | Extension UI record | Forward supported extension interactions between Pi and the client |
29
32
 
30
- RPC mode uses strict JSONL semantics with LF (`\n`) as the only record delimiter.
33
+ See [RPC Commands](rpc-commands.md), [JSON Event Stream](json.md), and [RPC Extension UI](rpc-extension-ui.md) for the canonical record definitions.
31
34
 
32
- This matters for clients:
33
- - Split records on `\n` only
34
- - Accept optional `\r\n` input by stripping a trailing `\r`
35
- - Do not use generic line readers that treat Unicode separators as newlines
35
+ ### Correlate commands and responses
36
36
 
37
37
  In particular, Node `readline` is not protocol-compliant for RPC mode because it also splits on `U+2028` and `U+2029`, which are valid inside JSON strings.
38
38
 
@@ -123,7 +123,7 @@ See [set_follow_up_mode](#set_follow_up_mode) for controlling how follow-up mess
123
123
 
124
124
  #### abort
125
125
 
126
- Abort the current agent operation.
126
+ Abort the current operation and wait for the session to become idle before responding.
127
127
 
128
128
  ```json
129
129
  {"type": "abort"}
@@ -1362,257 +1362,155 @@ Responses are sent for dialog methods only (`select`, `confirm`, `input`, `edito
1362
1362
  #### Confirmation response (confirm)
1363
1363
 
1364
1364
  ```json
1365
- {"type": "extension_ui_response", "id": "uuid-2", "confirmed": true}
1365
+ {"id":"req-1","type":"get_state"}
1366
+ {"id":"req-1","type":"response","command":"get_state","success":true,"data":{"...":"..."}}
1366
1367
  ```
1367
1368
 
1368
- #### Cancellation response (any dialog)
1369
+ Use unique IDs whenever more than one command can be outstanding. Command handling is asynchronous, so clients should correlate by ID rather than response order.
1369
1370
 
1370
- Dismiss any dialog method. The extension receives `undefined` (for select/input/editor) or `false` (for confirm).
1371
+ Session events generally have no command ID because they describe session activity. `bash_execution_update` is the exception: when the originating [`bash`](rpc-commands.md#bash) command has an ID, its output events repeat that ID.
1371
1372
 
1372
- ```json
1373
- {"type": "extension_ui_response", "id": "uuid-3", "cancelled": true}
1374
- ```
1373
+ An `extension_ui_response` uses the ID supplied by its `extension_ui_request`. It does not produce a normal command response.
1375
1374
 
1376
- ## Error Handling
1375
+ ## Framing
1377
1376
 
1378
- Failed commands return a response with `success: false`:
1377
+ RPC uses strict JSONL framing. Write one complete JSON object per record and terminate it with LF (`\n`). Read stdout as a byte or UTF-8 stream and split records only on LF. Strip an optional preceding carriage return to accept CRLF input.
1379
1378
 
1380
- ```json
1381
- {
1382
- "type": "response",
1383
- "command": "set_model",
1384
- "success": false,
1385
- "error": "Model not found: invalid/model"
1386
- }
1387
- ```
1379
+ Do not use a generic line reader that treats Unicode line or paragraph separators as record boundaries. In particular, Node.js `readline` also splits on `U+2028` and `U+2029`, which are valid inside JSON strings.
1388
1380
 
1389
- Parse errors:
1381
+ Read stdout continuously. Pi honors stdout backpressure, but a client that stops reading can stall the process. Honor stdin backpressure when writing commands. Stdout is reserved for protocol records; diagnostics and application logging go to stderr.
1390
1382
 
1391
- ```json
1392
- {
1393
- "type": "response",
1394
- "command": "parse",
1395
- "success": false,
1396
- "error": "Failed to parse command: Unexpected token..."
1397
- }
1398
- ```
1383
+ ## Run lifecycle
1399
1384
 
1400
- ## Types
1401
-
1402
- Source files:
1403
- - [`packages/ai/src/types.ts`](../../ai/src/types.ts) - `Model`, `UserMessage`, `AssistantMessage`, `ToolResultMessage`
1404
- - [`packages/agent/src/types.ts`](../../agent/src/types.ts) - `AgentMessage`, `AgentEvent`
1405
- - [`src/core/messages.ts`](../src/core/messages.ts) - `BashExecutionMessage`
1406
- - [`src/modes/json-event.ts`](../src/modes/json-event.ts) - `JsonAgentSessionEvent`
1407
- - [`src/modes/rpc/rpc-types.ts`](../src/modes/rpc/rpc-types.ts) - RPC command/response types, extension UI request/response types
1408
-
1409
- ### Model
1385
+ A successful `prompt` response means the prompt was accepted, queued, or handled. It does not mean model work completed:
1410
1386
 
1411
1387
  ```json
1412
- {
1413
- "id": "claude-sonnet-4-20250514",
1414
- "name": "Claude Sonnet 4",
1415
- "api": "anthropic-messages",
1416
- "provider": "anthropic",
1417
- "baseUrl": "https://api.anthropic.com",
1418
- "reasoning": true,
1419
- "input": ["text", "image"],
1420
- "contextWindow": 200000,
1421
- "maxTokens": 16384,
1422
- "cost": {
1423
- "input": 3.0,
1424
- "output": 15.0,
1425
- "cacheRead": 0.3,
1426
- "cacheWrite": 3.75
1427
- }
1428
- }
1388
+ {"id":"req-2","type":"prompt","message":"Review this repository"}
1389
+ {"id":"req-2","type":"response","command":"prompt","success":true}
1429
1390
  ```
1430
1391
 
1431
- ### UserMessage
1392
+ Continue consuming [events](json.md) after that response. `agent_end` marks the end of one low-level agent run, but retries, overflow recovery, compaction, steering, or follow-up work can still follow. Wait for `agent_settled` when the client needs to know Pi will not continue automatically.
1432
1393
 
1433
- ```json
1434
- {
1435
- "role": "user",
1436
- "content": "Hello!",
1437
- "timestamp": 1733234567890,
1438
- "attachments": []
1439
- }
1440
- ```
1394
+ Subscribe before sending a prompt to avoid missing a fast completion. `RpcClient.promptAndWait()` does this internally. If using separate `RpcClient` calls, install the event listener before `prompt()` and call `waitForIdle()` only while a run is active.
1441
1395
 
1442
- The `content` field can be a string or an array of `TextContent`/`ImageContent` blocks.
1396
+ ## Errors
1443
1397
 
1444
- ### AssistantMessage
1398
+ A failed command returns one response with `success: false`:
1445
1399
 
1446
1400
  ```json
1447
- {
1448
- "role": "assistant",
1449
- "content": [
1450
- {"type": "text", "text": "Hello! How can I help?"},
1451
- {"type": "thinking", "thinking": "User is greeting me..."},
1452
- {"type": "toolCall", "id": "call_123", "name": "bash", "arguments": {"command": "ls"}}
1453
- ],
1454
- "api": "anthropic-messages",
1455
- "provider": "anthropic",
1456
- "model": "claude-sonnet-4-20250514",
1457
- "usage": {
1458
- "input": 100,
1459
- "output": 50,
1460
- "cacheRead": 0,
1461
- "cacheWrite": 0,
1462
- "cost": {"input": 0.0003, "output": 0.00075, "cacheRead": 0, "cacheWrite": 0, "total": 0.00105}
1463
- },
1464
- "stopReason": "stop",
1465
- "timestamp": 1733234567890
1466
- }
1401
+ {"id":"req-3","type":"response","command":"set_model","success":false,"error":"Model not found: invalid/model"}
1467
1402
  ```
1468
1403
 
1469
- Stop reasons: `"stop"`, `"length"`, `"toolUse"`, `"error"`, `"aborted"`
1470
-
1471
- ### ToolResultMessage
1404
+ Malformed JSON produces a parse response without a request ID:
1472
1405
 
1473
1406
  ```json
1474
- {
1475
- "role": "toolResult",
1476
- "toolCallId": "call_123",
1477
- "toolName": "bash",
1478
- "content": [{"type": "text", "text": "total 48\ndrwxr-xr-x ..."}],
1479
- "usage": {
1480
- "input": 100,
1481
- "output": 50,
1482
- "cacheRead": 0,
1483
- "cacheWrite": 0,
1484
- "totalTokens": 150,
1485
- "cost": {"input": 0.0003, "output": 0.00075, "cacheRead": 0, "cacheWrite": 0, "total": 0.00105}
1486
- },
1487
- "isError": false,
1488
- "timestamp": 1733234567890
1489
- }
1407
+ {"type":"response","command":"parse","success":false,"error":"Failed to parse command: Unexpected token..."}
1490
1408
  ```
1491
1409
 
1492
- `usage` is optional and reports nested LLM work performed by the tool. When present, it contributes to session token and cost totals.
1410
+ A success response only covers command handling. Provider failures and aborts after a prompt is accepted appear in the message and event stream.
1493
1411
 
1494
- ### BashExecutionMessage
1412
+ Clients must also handle child-process startup failures, unexpected exits, stderr diagnostics, cancellation, and their own deadlines. Do not parse stderr as protocol data.
1495
1413
 
1496
- Created by the `bash` RPC command (not by LLM tool calls):
1414
+ ## Shutdown
1497
1415
 
1498
- ```json
1499
- {
1500
- "role": "bashExecution",
1501
- "command": "ls -la",
1502
- "output": "total 48\ndrwxr-xr-x ...",
1503
- "exitCode": 0,
1504
- "cancelled": false,
1505
- "truncated": false,
1506
- "fullOutputPath": null,
1507
- "timestamp": 1733234567890
1508
- }
1509
- ```
1416
+ Close the child's stdin to request an orderly shutdown. Pi disposes the active runtime before exiting. Clients should still handle process signals and unexpected exits.
1510
1417
 
1511
- ### Attachment
1418
+ An extension can also request shutdown through its extension context. Pi completes shutdown after the current command or after the active run emits `agent_settled`.
1512
1419
 
1513
- ```json
1514
- {
1515
- "id": "img1",
1516
- "type": "image",
1517
- "fileName": "photo.jpg",
1518
- "mimeType": "image/jpeg",
1519
- "size": 102400,
1520
- "content": "base64-encoded-data...",
1521
- "extractedText": null,
1522
- "preview": null
1523
- }
1524
- ```
1420
+ ## Minimal client
1525
1421
 
1526
- ## Example: Basic Client (Python)
1422
+ This Python example uses a binary pipe reader, which splits on LF without treating Unicode separators as protocol boundaries:
1527
1423
 
1528
1424
  ```python
1529
- import subprocess
1530
1425
  import json
1426
+ import subprocess
1531
1427
 
1532
1428
  proc = subprocess.Popen(
1533
1429
  ["apex-code", "--mode", "rpc", "--no-session"],
1534
1430
  stdin=subprocess.PIPE,
1535
1431
  stdout=subprocess.PIPE,
1536
- text=True
1537
1432
  )
1538
1433
 
1539
- def send(cmd):
1540
- proc.stdin.write(json.dumps(cmd) + "\n")
1541
- proc.stdin.flush()
1542
-
1543
- def read_events():
1544
- for line in proc.stdout:
1545
- yield json.loads(line)
1546
-
1547
- # Send prompt
1548
- send({"type": "prompt", "message": "Hello!"})
1549
-
1550
- # Process events
1551
- for event in read_events():
1552
- if event.get("type") == "message_update":
1553
- delta = event.get("assistantMessageEvent", {})
1554
- if delta.get("type") == "text_delta":
1555
- print(delta["delta"], end="", flush=True)
1556
-
1557
- if event.get("type") == "agent_end":
1434
+ assert process.stdin is not None
1435
+ assert process.stdout is not None
1436
+
1437
+ command = {"id": "prompt-1", "type": "prompt", "message": "Hello"}
1438
+ process.stdin.write(json.dumps(command).encode("utf-8") + b"\n")
1439
+ process.stdin.flush()
1440
+
1441
+ while line := process.stdout.readline():
1442
+ record = json.loads(line)
1443
+ if record.get("type") == "message_update":
1444
+ update = record["assistantMessageEvent"]
1445
+ if update["type"] == "text_delta":
1446
+ print(update["delta"], end="", flush=True)
1447
+ elif record.get("type") == "agent_settled":
1558
1448
  print()
1559
1449
  break
1450
+
1451
+ process.stdin.close()
1452
+ process.wait()
1560
1453
  ```
1561
1454
 
1562
- ## Example: Interactive Client (Node.js)
1455
+ For maintained TypeScript clients, use the checked [RPC client example](../examples/rpc-client.ts). It requires a built Pi CLI because the repository example points to `dist/cli.js`.
1563
1456
 
1564
- See [`test/rpc-example.ts`](../test/rpc-example.ts) for a complete interactive example, or [`src/modes/rpc/rpc-client.ts`](../src/modes/rpc/rpc-client.ts) for a typed client implementation.
1457
+ ## Reference
1565
1458
 
1566
- For a complete example of handling the extension UI protocol, see [`examples/rpc-extension-ui.ts`](../examples/rpc-extension-ui.ts) which pairs with the [`examples/extensions/rpc-demo.ts`](../examples/extensions/rpc-demo.ts) extension.
1459
+ - [RPC Commands](rpc-commands.md): every stdin command and response
1460
+ - [JSON Event Stream](json.md): shared stdout session events and streaming reconstruction
1461
+ - [RPC Extension UI](rpc-extension-ui.md): dialogs, notifications, responses, and limitations
1462
+ - [Message Types](message-types.md): messages and content blocks used by responses and events
1463
+ - [Session File Format](session-format.md): entries returned by session commands
1464
+ - [`rpc-types.ts`](https://github.com/earendil-works/pi/blob/main/packages/coding-agent/src/modes/rpc/rpc-types.ts): exported TypeScript protocol definitions
1465
+ - [`RpcClient`](https://github.com/earendil-works/pi/blob/main/packages/coding-agent/src/modes/rpc/rpc-client.ts): subprocess client implementation
1567
1466
 
1568
- ```javascript
1569
- const { spawn } = require("child_process");
1570
- const { StringDecoder } = require("string_decoder");
1467
+ ## Moved reference anchors
1571
1468
 
1572
1469
  const agent = spawn("apex-code", ["--mode", "rpc", "--no-session"]);
1573
1470
 
1574
- function attachJsonlReader(stream, onLine) {
1575
- const decoder = new StringDecoder("utf8");
1576
- let buffer = "";
1577
-
1578
- stream.on("data", (chunk) => {
1579
- buffer += typeof chunk === "string" ? chunk : decoder.write(chunk);
1580
-
1581
- while (true) {
1582
- const newlineIndex = buffer.indexOf("\n");
1583
- if (newlineIndex === -1) break;
1584
-
1585
- let line = buffer.slice(0, newlineIndex);
1586
- buffer = buffer.slice(newlineIndex + 1);
1587
- if (line.endsWith("\r")) line = line.slice(0, -1);
1588
- onLine(line);
1589
- }
1590
- });
1591
-
1592
- stream.on("end", () => {
1593
- buffer += decoder.end();
1594
- if (buffer.length > 0) {
1595
- onLine(buffer.endsWith("\r") ? buffer.slice(0, -1) : buffer);
1596
- }
1597
- });
1598
- }
1599
-
1600
- attachJsonlReader(agent.stdout, (line) => {
1601
- const event = JSON.parse(line);
1602
-
1603
- if (event.type === "message_update") {
1604
- const { assistantMessageEvent } = event;
1605
- if (assistantMessageEvent.type === "text_delta") {
1606
- process.stdout.write(assistantMessageEvent.delta);
1607
- }
1608
- }
1609
- });
1610
-
1611
- // Send prompt
1612
- agent.stdin.write(JSON.stringify({ type: "prompt", message: "Hello" }) + "\n");
1613
-
1614
- // Abort on Ctrl+C
1615
- process.on("SIGINT", () => {
1616
- agent.stdin.write(JSON.stringify({ type: "abort" }) + "\n");
1617
- });
1618
- ```
1471
+ <a id="prompt"></a>
1472
+ <a id="steer"></a>
1473
+ <a id="follow_up"></a>
1474
+ <a id="abort"></a>
1475
+ <a id="clear_queue"></a>
1476
+ <a id="new_session"></a>
1477
+ <a id="get_state"></a>
1478
+ <a id="get_messages"></a>
1479
+ <a id="set_model"></a>
1480
+ <a id="cycle_model"></a>
1481
+ <a id="get_available_models"></a>
1482
+ <a id="set_thinking_level"></a>
1483
+ <a id="cycle_thinking_level"></a>
1484
+ <a id="get_available_thinking_levels"></a>
1485
+ <a id="set_steering_mode"></a>
1486
+ <a id="set_follow_up_mode"></a>
1487
+ <a id="compact"></a>
1488
+ <a id="set_auto_compaction"></a>
1489
+ <a id="set_auto_retry"></a>
1490
+ <a id="abort_retry"></a>
1491
+ <a id="bash"></a>
1492
+ <a id="abort_bash"></a>
1493
+ <a id="get_session_stats"></a>
1494
+ <a id="export_html"></a>
1495
+ <a id="switch_session"></a>
1496
+ <a id="fork"></a>
1497
+ <a id="clone"></a>
1498
+ <a id="get_fork_messages"></a>
1499
+ <a id="get_entries"></a>
1500
+ <a id="get_tree"></a>
1501
+ <a id="get_last_assistant_text"></a>
1502
+ <a id="set_session_name"></a>
1503
+ <a id="get_commands"></a>
1504
+
1505
+ Command details moved to [RPC Commands](rpc-commands.md).
1506
+
1507
+ <a id="message_update-streaming"></a>
1508
+ <a id="bash_execution_update"></a>
1509
+ <a id="compaction_start--compaction_end"></a>
1510
+ <a id="summarization_retry_scheduled--summarization_retry_attempt_start--summarization_retry_finished"></a>
1511
+
1512
+ Event details moved to [JSON Event Stream](json.md).
1513
+
1514
+ <a id="extension-ui-protocol"></a>
1515
+
1516
+ Extension interaction details moved to [RPC Extension UI](rpc-extension-ui.md).