@imdigitalashish/zpi 0.1.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 (604) hide show
  1. package/CHANGELOG.md +2801 -0
  2. package/README.md +95 -0
  3. package/dist/cli/args.d.ts +47 -0
  4. package/dist/cli/args.d.ts.map +1 -0
  5. package/dist/cli/args.js +293 -0
  6. package/dist/cli/args.js.map +1 -0
  7. package/dist/cli/config-selector.d.ts +14 -0
  8. package/dist/cli/config-selector.d.ts.map +1 -0
  9. package/dist/cli/config-selector.js +31 -0
  10. package/dist/cli/config-selector.js.map +1 -0
  11. package/dist/cli/file-processor.d.ts +15 -0
  12. package/dist/cli/file-processor.d.ts.map +1 -0
  13. package/dist/cli/file-processor.js +79 -0
  14. package/dist/cli/file-processor.js.map +1 -0
  15. package/dist/cli/list-models.d.ts +9 -0
  16. package/dist/cli/list-models.d.ts.map +1 -0
  17. package/dist/cli/list-models.js +92 -0
  18. package/dist/cli/list-models.js.map +1 -0
  19. package/dist/cli/session-picker.d.ts +9 -0
  20. package/dist/cli/session-picker.d.ts.map +1 -0
  21. package/dist/cli/session-picker.js +34 -0
  22. package/dist/cli/session-picker.js.map +1 -0
  23. package/dist/cli.d.ts +3 -0
  24. package/dist/cli.d.ts.map +1 -0
  25. package/dist/cli.js +11 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/config.d.ts +68 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +203 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/core/agent-session.d.ts +571 -0
  32. package/dist/core/agent-session.d.ts.map +1 -0
  33. package/dist/core/agent-session.js +2353 -0
  34. package/dist/core/agent-session.js.map +1 -0
  35. package/dist/core/auth-storage.d.ts +129 -0
  36. package/dist/core/auth-storage.d.ts.map +1 -0
  37. package/dist/core/auth-storage.js +394 -0
  38. package/dist/core/auth-storage.js.map +1 -0
  39. package/dist/core/bash-executor.d.ts +47 -0
  40. package/dist/core/bash-executor.d.ts.map +1 -0
  41. package/dist/core/bash-executor.js +212 -0
  42. package/dist/core/bash-executor.js.map +1 -0
  43. package/dist/core/compaction/branch-summarization.d.ts +86 -0
  44. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  45. package/dist/core/compaction/branch-summarization.js +242 -0
  46. package/dist/core/compaction/branch-summarization.js.map +1 -0
  47. package/dist/core/compaction/compaction.d.ts +121 -0
  48. package/dist/core/compaction/compaction.d.ts.map +1 -0
  49. package/dist/core/compaction/compaction.js +607 -0
  50. package/dist/core/compaction/compaction.js.map +1 -0
  51. package/dist/core/compaction/index.d.ts +7 -0
  52. package/dist/core/compaction/index.d.ts.map +1 -0
  53. package/dist/core/compaction/index.js +7 -0
  54. package/dist/core/compaction/index.js.map +1 -0
  55. package/dist/core/compaction/utils.d.ts +35 -0
  56. package/dist/core/compaction/utils.d.ts.map +1 -0
  57. package/dist/core/compaction/utils.js +138 -0
  58. package/dist/core/compaction/utils.js.map +1 -0
  59. package/dist/core/defaults.d.ts +3 -0
  60. package/dist/core/defaults.d.ts.map +1 -0
  61. package/dist/core/defaults.js +2 -0
  62. package/dist/core/defaults.js.map +1 -0
  63. package/dist/core/diagnostics.d.ts +15 -0
  64. package/dist/core/diagnostics.d.ts.map +1 -0
  65. package/dist/core/diagnostics.js +2 -0
  66. package/dist/core/diagnostics.js.map +1 -0
  67. package/dist/core/event-bus.d.ts +9 -0
  68. package/dist/core/event-bus.d.ts.map +1 -0
  69. package/dist/core/event-bus.js +25 -0
  70. package/dist/core/event-bus.js.map +1 -0
  71. package/dist/core/exec.d.ts +29 -0
  72. package/dist/core/exec.d.ts.map +1 -0
  73. package/dist/core/exec.js +71 -0
  74. package/dist/core/exec.js.map +1 -0
  75. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  76. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  77. package/dist/core/export-html/ansi-to-html.js +249 -0
  78. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  79. package/dist/core/export-html/index.d.ts +34 -0
  80. package/dist/core/export-html/index.d.ts.map +1 -0
  81. package/dist/core/export-html/index.js +222 -0
  82. package/dist/core/export-html/index.js.map +1 -0
  83. package/dist/core/export-html/template.css +971 -0
  84. package/dist/core/export-html/template.html +54 -0
  85. package/dist/core/export-html/template.js +1586 -0
  86. package/dist/core/export-html/tool-renderer.d.ts +35 -0
  87. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  88. package/dist/core/export-html/tool-renderer.js +57 -0
  89. package/dist/core/export-html/tool-renderer.js.map +1 -0
  90. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  91. package/dist/core/export-html/vendor/marked.min.js +6 -0
  92. package/dist/core/extensions/index.d.ts +11 -0
  93. package/dist/core/extensions/index.d.ts.map +1 -0
  94. package/dist/core/extensions/index.js +9 -0
  95. package/dist/core/extensions/index.js.map +1 -0
  96. package/dist/core/extensions/loader.d.ts +25 -0
  97. package/dist/core/extensions/loader.d.ts.map +1 -0
  98. package/dist/core/extensions/loader.js +402 -0
  99. package/dist/core/extensions/loader.js.map +1 -0
  100. package/dist/core/extensions/runner.d.ts +146 -0
  101. package/dist/core/extensions/runner.d.ts.map +1 -0
  102. package/dist/core/extensions/runner.js +626 -0
  103. package/dist/core/extensions/runner.js.map +1 -0
  104. package/dist/core/extensions/types.d.ts +984 -0
  105. package/dist/core/extensions/types.d.ts.map +1 -0
  106. package/dist/core/extensions/types.js +35 -0
  107. package/dist/core/extensions/types.js.map +1 -0
  108. package/dist/core/extensions/wrapper.d.ts +27 -0
  109. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  110. package/dist/core/extensions/wrapper.js +102 -0
  111. package/dist/core/extensions/wrapper.js.map +1 -0
  112. package/dist/core/footer-data-provider.d.ts +32 -0
  113. package/dist/core/footer-data-provider.d.ts.map +1 -0
  114. package/dist/core/footer-data-provider.js +134 -0
  115. package/dist/core/footer-data-provider.js.map +1 -0
  116. package/dist/core/index.d.ts +9 -0
  117. package/dist/core/index.d.ts.map +1 -0
  118. package/dist/core/index.js +9 -0
  119. package/dist/core/index.js.map +1 -0
  120. package/dist/core/keybindings.d.ts +55 -0
  121. package/dist/core/keybindings.d.ts.map +1 -0
  122. package/dist/core/keybindings.js +153 -0
  123. package/dist/core/keybindings.js.map +1 -0
  124. package/dist/core/memory.d.ts +64 -0
  125. package/dist/core/memory.d.ts.map +1 -0
  126. package/dist/core/memory.js +247 -0
  127. package/dist/core/memory.js.map +1 -0
  128. package/dist/core/messages.d.ts +77 -0
  129. package/dist/core/messages.d.ts.map +1 -0
  130. package/dist/core/messages.js +149 -0
  131. package/dist/core/messages.js.map +1 -0
  132. package/dist/core/model-registry.d.ts +102 -0
  133. package/dist/core/model-registry.d.ts.map +1 -0
  134. package/dist/core/model-registry.js +515 -0
  135. package/dist/core/model-registry.js.map +1 -0
  136. package/dist/core/model-resolver.d.ts +104 -0
  137. package/dist/core/model-resolver.d.ts.map +1 -0
  138. package/dist/core/model-resolver.js +403 -0
  139. package/dist/core/model-resolver.js.map +1 -0
  140. package/dist/core/package-manager.d.ts +151 -0
  141. package/dist/core/package-manager.d.ts.map +1 -0
  142. package/dist/core/package-manager.js +1426 -0
  143. package/dist/core/package-manager.js.map +1 -0
  144. package/dist/core/prompt-templates.d.ts +50 -0
  145. package/dist/core/prompt-templates.d.ts.map +1 -0
  146. package/dist/core/prompt-templates.js +251 -0
  147. package/dist/core/prompt-templates.js.map +1 -0
  148. package/dist/core/resolve-config-value.d.ts +17 -0
  149. package/dist/core/resolve-config-value.d.ts.map +1 -0
  150. package/dist/core/resolve-config-value.js +59 -0
  151. package/dist/core/resolve-config-value.js.map +1 -0
  152. package/dist/core/resource-loader.d.ts +184 -0
  153. package/dist/core/resource-loader.d.ts.map +1 -0
  154. package/dist/core/resource-loader.js +673 -0
  155. package/dist/core/resource-loader.js.map +1 -0
  156. package/dist/core/sdk.d.ts +90 -0
  157. package/dist/core/sdk.d.ts.map +1 -0
  158. package/dist/core/sdk.js +238 -0
  159. package/dist/core/sdk.js.map +1 -0
  160. package/dist/core/session-manager.d.ts +323 -0
  161. package/dist/core/session-manager.d.ts.map +1 -0
  162. package/dist/core/session-manager.js +1091 -0
  163. package/dist/core/session-manager.js.map +1 -0
  164. package/dist/core/settings-manager.d.ts +230 -0
  165. package/dist/core/settings-manager.d.ts.map +1 -0
  166. package/dist/core/settings-manager.js +656 -0
  167. package/dist/core/settings-manager.js.map +1 -0
  168. package/dist/core/skills.d.ts +58 -0
  169. package/dist/core/skills.d.ts.map +1 -0
  170. package/dist/core/skills.js +364 -0
  171. package/dist/core/skills.js.map +1 -0
  172. package/dist/core/slash-commands.d.ts +15 -0
  173. package/dist/core/slash-commands.d.ts.map +1 -0
  174. package/dist/core/slash-commands.js +23 -0
  175. package/dist/core/slash-commands.js.map +1 -0
  176. package/dist/core/system-prompt.d.ts +26 -0
  177. package/dist/core/system-prompt.d.ts.map +1 -0
  178. package/dist/core/system-prompt.js +150 -0
  179. package/dist/core/system-prompt.js.map +1 -0
  180. package/dist/core/timings.d.ts +7 -0
  181. package/dist/core/timings.d.ts.map +1 -0
  182. package/dist/core/timings.js +25 -0
  183. package/dist/core/timings.js.map +1 -0
  184. package/dist/core/tools/bash.d.ts +55 -0
  185. package/dist/core/tools/bash.d.ts.map +1 -0
  186. package/dist/core/tools/bash.js +242 -0
  187. package/dist/core/tools/bash.js.map +1 -0
  188. package/dist/core/tools/edit-diff.d.ts +63 -0
  189. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  190. package/dist/core/tools/edit-diff.js +243 -0
  191. package/dist/core/tools/edit-diff.js.map +1 -0
  192. package/dist/core/tools/edit.d.ts +39 -0
  193. package/dist/core/tools/edit.d.ts.map +1 -0
  194. package/dist/core/tools/edit.js +146 -0
  195. package/dist/core/tools/edit.js.map +1 -0
  196. package/dist/core/tools/find.d.ts +39 -0
  197. package/dist/core/tools/find.d.ts.map +1 -0
  198. package/dist/core/tools/find.js +206 -0
  199. package/dist/core/tools/find.js.map +1 -0
  200. package/dist/core/tools/grep.d.ts +45 -0
  201. package/dist/core/tools/grep.d.ts.map +1 -0
  202. package/dist/core/tools/grep.js +239 -0
  203. package/dist/core/tools/grep.js.map +1 -0
  204. package/dist/core/tools/index.d.ts +102 -0
  205. package/dist/core/tools/index.d.ts.map +1 -0
  206. package/dist/core/tools/index.js +71 -0
  207. package/dist/core/tools/index.js.map +1 -0
  208. package/dist/core/tools/ls.d.ts +40 -0
  209. package/dist/core/tools/ls.d.ts.map +1 -0
  210. package/dist/core/tools/ls.js +118 -0
  211. package/dist/core/tools/ls.js.map +1 -0
  212. package/dist/core/tools/memory.d.ts +45 -0
  213. package/dist/core/tools/memory.d.ts.map +1 -0
  214. package/dist/core/tools/memory.js +346 -0
  215. package/dist/core/tools/memory.js.map +1 -0
  216. package/dist/core/tools/path-utils.d.ts +8 -0
  217. package/dist/core/tools/path-utils.d.ts.map +1 -0
  218. package/dist/core/tools/path-utils.js +81 -0
  219. package/dist/core/tools/path-utils.js.map +1 -0
  220. package/dist/core/tools/read.d.ts +39 -0
  221. package/dist/core/tools/read.d.ts.map +1 -0
  222. package/dist/core/tools/read.js +166 -0
  223. package/dist/core/tools/read.js.map +1 -0
  224. package/dist/core/tools/truncate.d.ts +70 -0
  225. package/dist/core/tools/truncate.d.ts.map +1 -0
  226. package/dist/core/tools/truncate.js +205 -0
  227. package/dist/core/tools/truncate.js.map +1 -0
  228. package/dist/core/tools/write.d.ts +29 -0
  229. package/dist/core/tools/write.d.ts.map +1 -0
  230. package/dist/core/tools/write.js +78 -0
  231. package/dist/core/tools/write.js.map +1 -0
  232. package/dist/index.d.ts +28 -0
  233. package/dist/index.d.ts.map +1 -0
  234. package/dist/index.js +43 -0
  235. package/dist/index.js.map +1 -0
  236. package/dist/main.d.ts +8 -0
  237. package/dist/main.d.ts.map +1 -0
  238. package/dist/main.js +651 -0
  239. package/dist/main.js.map +1 -0
  240. package/dist/migrations.d.ts +33 -0
  241. package/dist/migrations.d.ts.map +1 -0
  242. package/dist/migrations.js +261 -0
  243. package/dist/migrations.js.map +1 -0
  244. package/dist/modes/index.d.ts +9 -0
  245. package/dist/modes/index.d.ts.map +1 -0
  246. package/dist/modes/index.js +8 -0
  247. package/dist/modes/index.js.map +1 -0
  248. package/dist/modes/interactive/components/armin.d.ts +34 -0
  249. package/dist/modes/interactive/components/armin.d.ts.map +1 -0
  250. package/dist/modes/interactive/components/armin.js +333 -0
  251. package/dist/modes/interactive/components/armin.js.map +1 -0
  252. package/dist/modes/interactive/components/assistant-message.d.ts +16 -0
  253. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  254. package/dist/modes/interactive/components/assistant-message.js +96 -0
  255. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  256. package/dist/modes/interactive/components/bash-execution.d.ts +35 -0
  257. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  258. package/dist/modes/interactive/components/bash-execution.js +162 -0
  259. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  260. package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  261. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  262. package/dist/modes/interactive/components/bordered-loader.js +51 -0
  263. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  264. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  265. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  266. package/dist/modes/interactive/components/branch-summary-message.js +44 -0
  267. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  268. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  269. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  270. package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
  271. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  272. package/dist/modes/interactive/components/config-selector.d.ts +71 -0
  273. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  274. package/dist/modes/interactive/components/config-selector.js +479 -0
  275. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  276. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  277. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  278. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  279. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  280. package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  281. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  282. package/dist/modes/interactive/components/custom-editor.js +70 -0
  283. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  284. package/dist/modes/interactive/components/custom-message.d.ts +20 -0
  285. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  286. package/dist/modes/interactive/components/custom-message.js +79 -0
  287. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  288. package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  289. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
  290. package/dist/modes/interactive/components/daxnuts.js +140 -0
  291. package/dist/modes/interactive/components/daxnuts.js.map +1 -0
  292. package/dist/modes/interactive/components/diff.d.ts +12 -0
  293. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  294. package/dist/modes/interactive/components/diff.js +133 -0
  295. package/dist/modes/interactive/components/diff.js.map +1 -0
  296. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  297. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  298. package/dist/modes/interactive/components/dynamic-border.js +21 -0
  299. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  300. package/dist/modes/interactive/components/extension-editor.d.ts +17 -0
  301. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  302. package/dist/modes/interactive/components/extension-editor.js +102 -0
  303. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  304. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  305. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  306. package/dist/modes/interactive/components/extension-input.js +61 -0
  307. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  308. package/dist/modes/interactive/components/extension-selector.d.ts +24 -0
  309. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  310. package/dist/modes/interactive/components/extension-selector.js +78 -0
  311. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  312. package/dist/modes/interactive/components/footer.d.ts +26 -0
  313. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  314. package/dist/modes/interactive/components/footer.js +213 -0
  315. package/dist/modes/interactive/components/footer.js.map +1 -0
  316. package/dist/modes/interactive/components/index.d.ts +32 -0
  317. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  318. package/dist/modes/interactive/components/index.js +33 -0
  319. package/dist/modes/interactive/components/index.js.map +1 -0
  320. package/dist/modes/interactive/components/keybinding-hints.d.ts +41 -0
  321. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  322. package/dist/modes/interactive/components/keybinding-hints.js +61 -0
  323. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  324. package/dist/modes/interactive/components/login-dialog.d.ts +42 -0
  325. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  326. package/dist/modes/interactive/components/login-dialog.js +145 -0
  327. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  328. package/dist/modes/interactive/components/model-selector.d.ts +47 -0
  329. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  330. package/dist/modes/interactive/components/model-selector.js +271 -0
  331. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  332. package/dist/modes/interactive/components/oauth-selector.d.ts +19 -0
  333. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  334. package/dist/modes/interactive/components/oauth-selector.js +97 -0
  335. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  336. package/dist/modes/interactive/components/scoped-models-selector.d.ts +49 -0
  337. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  338. package/dist/modes/interactive/components/scoped-models-selector.js +275 -0
  339. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  340. package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  341. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  342. package/dist/modes/interactive/components/session-selector-search.js +155 -0
  343. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  344. package/dist/modes/interactive/components/session-selector.d.ts +95 -0
  345. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  346. package/dist/modes/interactive/components/session-selector.js +851 -0
  347. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  348. package/dist/modes/interactive/components/settings-selector.d.ts +58 -0
  349. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  350. package/dist/modes/interactive/components/settings-selector.js +299 -0
  351. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  352. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  353. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  354. package/dist/modes/interactive/components/show-images-selector.js +35 -0
  355. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  356. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  357. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  358. package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
  359. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  360. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  361. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  362. package/dist/modes/interactive/components/theme-selector.js +46 -0
  363. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  364. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  365. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  366. package/dist/modes/interactive/components/thinking-selector.js +47 -0
  367. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  368. package/dist/modes/interactive/components/tool-execution.d.ts +70 -0
  369. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  370. package/dist/modes/interactive/components/tool-execution.js +636 -0
  371. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  372. package/dist/modes/interactive/components/tree-selector.d.ts +68 -0
  373. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  374. package/dist/modes/interactive/components/tree-selector.js +934 -0
  375. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  376. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  377. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  378. package/dist/modes/interactive/components/user-message-selector.js +113 -0
  379. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  380. package/dist/modes/interactive/components/user-message.d.ts +8 -0
  381. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  382. package/dist/modes/interactive/components/user-message.js +16 -0
  383. package/dist/modes/interactive/components/user-message.js.map +1 -0
  384. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  385. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  386. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  387. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  388. package/dist/modes/interactive/interactive-mode.d.ts +316 -0
  389. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  390. package/dist/modes/interactive/interactive-mode.js +3848 -0
  391. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  392. package/dist/modes/interactive/theme/dark.json +85 -0
  393. package/dist/modes/interactive/theme/light.json +84 -0
  394. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  395. package/dist/modes/interactive/theme/theme.d.ts +78 -0
  396. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  397. package/dist/modes/interactive/theme/theme.js +944 -0
  398. package/dist/modes/interactive/theme/theme.js.map +1 -0
  399. package/dist/modes/print-mode.d.ts +28 -0
  400. package/dist/modes/print-mode.d.ts.map +1 -0
  401. package/dist/modes/print-mode.js +101 -0
  402. package/dist/modes/print-mode.js.map +1 -0
  403. package/dist/modes/rpc/rpc-client.d.ts +217 -0
  404. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  405. package/dist/modes/rpc/rpc-client.js +405 -0
  406. package/dist/modes/rpc/rpc-client.js.map +1 -0
  407. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  408. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  409. package/dist/modes/rpc/rpc-mode.js +511 -0
  410. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  411. package/dist/modes/rpc/rpc-types.d.ts +409 -0
  412. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  413. package/dist/modes/rpc/rpc-types.js +8 -0
  414. package/dist/modes/rpc/rpc-types.js.map +1 -0
  415. package/dist/utils/changelog.d.ts +21 -0
  416. package/dist/utils/changelog.d.ts.map +1 -0
  417. package/dist/utils/changelog.js +87 -0
  418. package/dist/utils/changelog.js.map +1 -0
  419. package/dist/utils/clipboard-image.d.ts +11 -0
  420. package/dist/utils/clipboard-image.d.ts.map +1 -0
  421. package/dist/utils/clipboard-image.js +162 -0
  422. package/dist/utils/clipboard-image.js.map +1 -0
  423. package/dist/utils/clipboard-native.d.ts +7 -0
  424. package/dist/utils/clipboard-native.d.ts.map +1 -0
  425. package/dist/utils/clipboard-native.js +14 -0
  426. package/dist/utils/clipboard-native.js.map +1 -0
  427. package/dist/utils/clipboard.d.ts +2 -0
  428. package/dist/utils/clipboard.d.ts.map +1 -0
  429. package/dist/utils/clipboard.js +67 -0
  430. package/dist/utils/clipboard.js.map +1 -0
  431. package/dist/utils/frontmatter.d.ts +8 -0
  432. package/dist/utils/frontmatter.d.ts.map +1 -0
  433. package/dist/utils/frontmatter.js +26 -0
  434. package/dist/utils/frontmatter.js.map +1 -0
  435. package/dist/utils/git.d.ts +26 -0
  436. package/dist/utils/git.d.ts.map +1 -0
  437. package/dist/utils/git.js +163 -0
  438. package/dist/utils/git.js.map +1 -0
  439. package/dist/utils/image-convert.d.ts +9 -0
  440. package/dist/utils/image-convert.d.ts.map +1 -0
  441. package/dist/utils/image-convert.js +35 -0
  442. package/dist/utils/image-convert.js.map +1 -0
  443. package/dist/utils/image-resize.d.ts +36 -0
  444. package/dist/utils/image-resize.d.ts.map +1 -0
  445. package/dist/utils/image-resize.js +181 -0
  446. package/dist/utils/image-resize.js.map +1 -0
  447. package/dist/utils/mime.d.ts +2 -0
  448. package/dist/utils/mime.d.ts.map +1 -0
  449. package/dist/utils/mime.js +26 -0
  450. package/dist/utils/mime.js.map +1 -0
  451. package/dist/utils/photon.d.ts +21 -0
  452. package/dist/utils/photon.d.ts.map +1 -0
  453. package/dist/utils/photon.js +121 -0
  454. package/dist/utils/photon.js.map +1 -0
  455. package/dist/utils/shell.d.ts +26 -0
  456. package/dist/utils/shell.d.ts.map +1 -0
  457. package/dist/utils/shell.js +186 -0
  458. package/dist/utils/shell.js.map +1 -0
  459. package/dist/utils/sleep.d.ts +5 -0
  460. package/dist/utils/sleep.d.ts.map +1 -0
  461. package/dist/utils/sleep.js +17 -0
  462. package/dist/utils/sleep.js.map +1 -0
  463. package/dist/utils/tools-manager.d.ts +3 -0
  464. package/dist/utils/tools-manager.d.ts.map +1 -0
  465. package/dist/utils/tools-manager.js +207 -0
  466. package/dist/utils/tools-manager.js.map +1 -0
  467. package/docs/compaction.md +390 -0
  468. package/docs/custom-provider.md +548 -0
  469. package/docs/development.md +69 -0
  470. package/docs/extensions.md +1935 -0
  471. package/docs/images/doom-extension.png +0 -0
  472. package/docs/images/exy.png +0 -0
  473. package/docs/images/interactive-mode.png +0 -0
  474. package/docs/images/tree-view.png +0 -0
  475. package/docs/json.md +79 -0
  476. package/docs/keybindings.md +174 -0
  477. package/docs/models.md +293 -0
  478. package/docs/packages.md +209 -0
  479. package/docs/prompt-templates.md +67 -0
  480. package/docs/providers.md +186 -0
  481. package/docs/rpc.md +1317 -0
  482. package/docs/sdk.md +968 -0
  483. package/docs/session.md +412 -0
  484. package/docs/settings.md +223 -0
  485. package/docs/shell-aliases.md +13 -0
  486. package/docs/skills.md +231 -0
  487. package/docs/terminal-setup.md +70 -0
  488. package/docs/termux.md +127 -0
  489. package/docs/themes.md +295 -0
  490. package/docs/tree.md +219 -0
  491. package/docs/tui.md +887 -0
  492. package/docs/windows.md +17 -0
  493. package/examples/README.md +25 -0
  494. package/examples/extensions/README.md +203 -0
  495. package/examples/extensions/antigravity-image-gen.ts +413 -0
  496. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  497. package/examples/extensions/bash-spawn-hook.ts +30 -0
  498. package/examples/extensions/bookmark.ts +50 -0
  499. package/examples/extensions/claude-rules.ts +86 -0
  500. package/examples/extensions/commands.ts +72 -0
  501. package/examples/extensions/confirm-destructive.ts +59 -0
  502. package/examples/extensions/custom-compaction.ts +114 -0
  503. package/examples/extensions/custom-footer.ts +64 -0
  504. package/examples/extensions/custom-header.ts +73 -0
  505. package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  506. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  507. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  508. package/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
  509. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  510. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  511. package/examples/extensions/custom-provider-qwen-cli/index.ts +345 -0
  512. package/examples/extensions/custom-provider-qwen-cli/package.json +16 -0
  513. package/examples/extensions/dirty-repo-guard.ts +56 -0
  514. package/examples/extensions/doom-overlay/README.md +46 -0
  515. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  516. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  517. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  518. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  519. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  520. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  521. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  522. package/examples/extensions/doom-overlay/index.ts +74 -0
  523. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  524. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  525. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  526. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  527. package/examples/extensions/dynamic-resources/index.ts +15 -0
  528. package/examples/extensions/event-bus.ts +43 -0
  529. package/examples/extensions/file-trigger.ts +41 -0
  530. package/examples/extensions/git-checkpoint.ts +53 -0
  531. package/examples/extensions/handoff.ts +150 -0
  532. package/examples/extensions/hello.ts +25 -0
  533. package/examples/extensions/inline-bash.ts +94 -0
  534. package/examples/extensions/input-transform.ts +43 -0
  535. package/examples/extensions/interactive-shell.ts +196 -0
  536. package/examples/extensions/mac-system-theme.ts +47 -0
  537. package/examples/extensions/message-renderer.ts +59 -0
  538. package/examples/extensions/minimal-mode.ts +426 -0
  539. package/examples/extensions/modal-editor.ts +85 -0
  540. package/examples/extensions/model-status.ts +31 -0
  541. package/examples/extensions/notify.ts +55 -0
  542. package/examples/extensions/overlay-qa-tests.ts +881 -0
  543. package/examples/extensions/overlay-test.ts +150 -0
  544. package/examples/extensions/permission-gate.ts +34 -0
  545. package/examples/extensions/pirate.ts +47 -0
  546. package/examples/extensions/plan-mode/README.md +65 -0
  547. package/examples/extensions/plan-mode/index.ts +340 -0
  548. package/examples/extensions/plan-mode/utils.ts +168 -0
  549. package/examples/extensions/preset.ts +398 -0
  550. package/examples/extensions/protected-paths.ts +30 -0
  551. package/examples/extensions/qna.ts +119 -0
  552. package/examples/extensions/question.ts +264 -0
  553. package/examples/extensions/questionnaire.ts +427 -0
  554. package/examples/extensions/rainbow-editor.ts +88 -0
  555. package/examples/extensions/reload-runtime.ts +37 -0
  556. package/examples/extensions/rpc-demo.ts +124 -0
  557. package/examples/extensions/sandbox/index.ts +318 -0
  558. package/examples/extensions/sandbox/package-lock.json +92 -0
  559. package/examples/extensions/sandbox/package.json +19 -0
  560. package/examples/extensions/send-user-message.ts +97 -0
  561. package/examples/extensions/session-name.ts +27 -0
  562. package/examples/extensions/shutdown-command.ts +63 -0
  563. package/examples/extensions/snake.ts +343 -0
  564. package/examples/extensions/space-invaders.ts +560 -0
  565. package/examples/extensions/ssh.ts +220 -0
  566. package/examples/extensions/status-line.ts +40 -0
  567. package/examples/extensions/subagent/README.md +172 -0
  568. package/examples/extensions/subagent/agents/planner.md +37 -0
  569. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  570. package/examples/extensions/subagent/agents/scout.md +50 -0
  571. package/examples/extensions/subagent/agents/worker.md +24 -0
  572. package/examples/extensions/subagent/agents.ts +127 -0
  573. package/examples/extensions/subagent/index.ts +964 -0
  574. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  575. package/examples/extensions/subagent/prompts/implement.md +10 -0
  576. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  577. package/examples/extensions/summarize.ts +195 -0
  578. package/examples/extensions/system-prompt-header.ts +17 -0
  579. package/examples/extensions/timed-confirm.ts +70 -0
  580. package/examples/extensions/titlebar-spinner.ts +58 -0
  581. package/examples/extensions/todo.ts +299 -0
  582. package/examples/extensions/tool-override.ts +143 -0
  583. package/examples/extensions/tools.ts +146 -0
  584. package/examples/extensions/trigger-compact.ts +40 -0
  585. package/examples/extensions/truncated-tool.ts +192 -0
  586. package/examples/extensions/widget-placement.ts +17 -0
  587. package/examples/extensions/with-deps/index.ts +36 -0
  588. package/examples/extensions/with-deps/package-lock.json +31 -0
  589. package/examples/extensions/with-deps/package.json +22 -0
  590. package/examples/rpc-extension-ui.ts +632 -0
  591. package/examples/sdk/01-minimal.ts +22 -0
  592. package/examples/sdk/02-custom-model.ts +49 -0
  593. package/examples/sdk/03-custom-prompt.ts +55 -0
  594. package/examples/sdk/04-skills.ts +46 -0
  595. package/examples/sdk/05-tools.ts +56 -0
  596. package/examples/sdk/06-extensions.ts +88 -0
  597. package/examples/sdk/07-context-files.ts +40 -0
  598. package/examples/sdk/08-prompt-templates.ts +47 -0
  599. package/examples/sdk/09-api-keys-and-oauth.ts +48 -0
  600. package/examples/sdk/10-settings.ts +51 -0
  601. package/examples/sdk/11-sessions.ts +48 -0
  602. package/examples/sdk/12-full-control.ts +82 -0
  603. package/examples/sdk/README.md +144 -0
  604. package/package.json +96 -0
@@ -0,0 +1,511 @@
1
+ /**
2
+ * RPC mode: Headless operation with JSON stdin/stdout protocol.
3
+ *
4
+ * Used for embedding the agent in other applications.
5
+ * Receives commands as JSON on stdin, outputs events and responses as JSON on stdout.
6
+ *
7
+ * Protocol:
8
+ * - Commands: JSON objects with `type` field, optional `id` for correlation
9
+ * - Responses: JSON objects with `type: "response"`, `command`, `success`, and optional `data`/`error`
10
+ * - Events: AgentSessionEvent objects streamed as they occur
11
+ * - Extension UI: Extension UI requests are emitted, client responds with extension_ui_response
12
+ */
13
+ import * as crypto from "node:crypto";
14
+ import * as readline from "readline";
15
+ import { theme } from "../interactive/theme/theme.js";
16
+ /**
17
+ * Run in RPC mode.
18
+ * Listens for JSON commands on stdin, outputs events and responses on stdout.
19
+ */
20
+ export async function runRpcMode(session) {
21
+ const output = (obj) => {
22
+ console.log(JSON.stringify(obj));
23
+ };
24
+ const success = (id, command, data) => {
25
+ if (data === undefined) {
26
+ return { id, type: "response", command, success: true };
27
+ }
28
+ return { id, type: "response", command, success: true, data };
29
+ };
30
+ const error = (id, command, message) => {
31
+ return { id, type: "response", command, success: false, error: message };
32
+ };
33
+ // Pending extension UI requests waiting for response
34
+ const pendingExtensionRequests = new Map();
35
+ // Shutdown request flag
36
+ let shutdownRequested = false;
37
+ /** Helper for dialog methods with signal/timeout support */
38
+ function createDialogPromise(opts, defaultValue, request, parseResponse) {
39
+ if (opts?.signal?.aborted)
40
+ return Promise.resolve(defaultValue);
41
+ const id = crypto.randomUUID();
42
+ return new Promise((resolve, reject) => {
43
+ let timeoutId;
44
+ const cleanup = () => {
45
+ if (timeoutId)
46
+ clearTimeout(timeoutId);
47
+ opts?.signal?.removeEventListener("abort", onAbort);
48
+ pendingExtensionRequests.delete(id);
49
+ };
50
+ const onAbort = () => {
51
+ cleanup();
52
+ resolve(defaultValue);
53
+ };
54
+ opts?.signal?.addEventListener("abort", onAbort, { once: true });
55
+ if (opts?.timeout) {
56
+ timeoutId = setTimeout(() => {
57
+ cleanup();
58
+ resolve(defaultValue);
59
+ }, opts.timeout);
60
+ }
61
+ pendingExtensionRequests.set(id, {
62
+ resolve: (response) => {
63
+ cleanup();
64
+ resolve(parseResponse(response));
65
+ },
66
+ reject,
67
+ });
68
+ output({ type: "extension_ui_request", id, ...request });
69
+ });
70
+ }
71
+ /**
72
+ * Create an extension UI context that uses the RPC protocol.
73
+ */
74
+ const createExtensionUIContext = () => ({
75
+ select: (title, options, opts) => createDialogPromise(opts, undefined, { method: "select", title, options, timeout: opts?.timeout }, (r) => "cancelled" in r && r.cancelled ? undefined : "value" in r ? r.value : undefined),
76
+ confirm: (title, message, opts) => createDialogPromise(opts, false, { method: "confirm", title, message, timeout: opts?.timeout }, (r) => "cancelled" in r && r.cancelled ? false : "confirmed" in r ? r.confirmed : false),
77
+ input: (title, placeholder, opts) => createDialogPromise(opts, undefined, { method: "input", title, placeholder, timeout: opts?.timeout }, (r) => "cancelled" in r && r.cancelled ? undefined : "value" in r ? r.value : undefined),
78
+ notify(message, type) {
79
+ // Fire and forget - no response needed
80
+ output({
81
+ type: "extension_ui_request",
82
+ id: crypto.randomUUID(),
83
+ method: "notify",
84
+ message,
85
+ notifyType: type,
86
+ });
87
+ },
88
+ onTerminalInput() {
89
+ // Raw terminal input not supported in RPC mode
90
+ return () => { };
91
+ },
92
+ setStatus(key, text) {
93
+ // Fire and forget - no response needed
94
+ output({
95
+ type: "extension_ui_request",
96
+ id: crypto.randomUUID(),
97
+ method: "setStatus",
98
+ statusKey: key,
99
+ statusText: text,
100
+ });
101
+ },
102
+ setWorkingMessage(_message) {
103
+ // Working message not supported in RPC mode - requires TUI loader access
104
+ },
105
+ setWidget(key, content, options) {
106
+ // Only support string arrays in RPC mode - factory functions are ignored
107
+ if (content === undefined || Array.isArray(content)) {
108
+ output({
109
+ type: "extension_ui_request",
110
+ id: crypto.randomUUID(),
111
+ method: "setWidget",
112
+ widgetKey: key,
113
+ widgetLines: content,
114
+ widgetPlacement: options?.placement,
115
+ });
116
+ }
117
+ // Component factories are not supported in RPC mode - would need TUI access
118
+ },
119
+ setFooter(_factory) {
120
+ // Custom footer not supported in RPC mode - requires TUI access
121
+ },
122
+ setHeader(_factory) {
123
+ // Custom header not supported in RPC mode - requires TUI access
124
+ },
125
+ setTitle(title) {
126
+ // Fire and forget - host can implement terminal title control
127
+ output({
128
+ type: "extension_ui_request",
129
+ id: crypto.randomUUID(),
130
+ method: "setTitle",
131
+ title,
132
+ });
133
+ },
134
+ async custom() {
135
+ // Custom UI not supported in RPC mode
136
+ return undefined;
137
+ },
138
+ pasteToEditor(text) {
139
+ // Paste handling not supported in RPC mode - falls back to setEditorText
140
+ this.setEditorText(text);
141
+ },
142
+ setEditorText(text) {
143
+ // Fire and forget - host can implement editor control
144
+ output({
145
+ type: "extension_ui_request",
146
+ id: crypto.randomUUID(),
147
+ method: "set_editor_text",
148
+ text,
149
+ });
150
+ },
151
+ getEditorText() {
152
+ // Synchronous method can't wait for RPC response
153
+ // Host should track editor state locally if needed
154
+ return "";
155
+ },
156
+ async editor(title, prefill) {
157
+ const id = crypto.randomUUID();
158
+ return new Promise((resolve, reject) => {
159
+ pendingExtensionRequests.set(id, {
160
+ resolve: (response) => {
161
+ if ("cancelled" in response && response.cancelled) {
162
+ resolve(undefined);
163
+ }
164
+ else if ("value" in response) {
165
+ resolve(response.value);
166
+ }
167
+ else {
168
+ resolve(undefined);
169
+ }
170
+ },
171
+ reject,
172
+ });
173
+ output({ type: "extension_ui_request", id, method: "editor", title, prefill });
174
+ });
175
+ },
176
+ setEditorComponent() {
177
+ // Custom editor components not supported in RPC mode
178
+ },
179
+ get theme() {
180
+ return theme;
181
+ },
182
+ getAllThemes() {
183
+ return [];
184
+ },
185
+ getTheme(_name) {
186
+ return undefined;
187
+ },
188
+ setTheme(_theme) {
189
+ // Theme switching not supported in RPC mode
190
+ return { success: false, error: "Theme switching not supported in RPC mode" };
191
+ },
192
+ getToolsExpanded() {
193
+ // Tool expansion not supported in RPC mode - no TUI
194
+ return false;
195
+ },
196
+ setToolsExpanded(_expanded) {
197
+ // Tool expansion not supported in RPC mode - no TUI
198
+ },
199
+ });
200
+ // Set up extensions with RPC-based UI context
201
+ await session.bindExtensions({
202
+ uiContext: createExtensionUIContext(),
203
+ commandContextActions: {
204
+ waitForIdle: () => session.agent.waitForIdle(),
205
+ newSession: async (options) => {
206
+ // Delegate to AgentSession (handles setup + agent state sync)
207
+ const success = await session.newSession(options);
208
+ return { cancelled: !success };
209
+ },
210
+ fork: async (entryId) => {
211
+ const result = await session.fork(entryId);
212
+ return { cancelled: result.cancelled };
213
+ },
214
+ navigateTree: async (targetId, options) => {
215
+ const result = await session.navigateTree(targetId, {
216
+ summarize: options?.summarize,
217
+ customInstructions: options?.customInstructions,
218
+ replaceInstructions: options?.replaceInstructions,
219
+ label: options?.label,
220
+ });
221
+ return { cancelled: result.cancelled };
222
+ },
223
+ switchSession: async (sessionPath) => {
224
+ const success = await session.switchSession(sessionPath);
225
+ return { cancelled: !success };
226
+ },
227
+ reload: async () => {
228
+ await session.reload();
229
+ },
230
+ },
231
+ shutdownHandler: () => {
232
+ shutdownRequested = true;
233
+ },
234
+ onError: (err) => {
235
+ output({ type: "extension_error", extensionPath: err.extensionPath, event: err.event, error: err.error });
236
+ },
237
+ });
238
+ // Output all agent events as JSON
239
+ session.subscribe((event) => {
240
+ output(event);
241
+ });
242
+ // Handle a single command
243
+ const handleCommand = async (command) => {
244
+ const id = command.id;
245
+ switch (command.type) {
246
+ // =================================================================
247
+ // Prompting
248
+ // =================================================================
249
+ case "prompt": {
250
+ // Don't await - events will stream
251
+ // Extension commands are executed immediately, file prompt templates are expanded
252
+ // If streaming and streamingBehavior specified, queues via steer/followUp
253
+ session
254
+ .prompt(command.message, {
255
+ images: command.images,
256
+ streamingBehavior: command.streamingBehavior,
257
+ source: "rpc",
258
+ })
259
+ .catch((e) => output(error(id, "prompt", e.message)));
260
+ return success(id, "prompt");
261
+ }
262
+ case "steer": {
263
+ await session.steer(command.message, command.images);
264
+ return success(id, "steer");
265
+ }
266
+ case "follow_up": {
267
+ await session.followUp(command.message, command.images);
268
+ return success(id, "follow_up");
269
+ }
270
+ case "abort": {
271
+ await session.abort();
272
+ return success(id, "abort");
273
+ }
274
+ case "new_session": {
275
+ const options = command.parentSession ? { parentSession: command.parentSession } : undefined;
276
+ const cancelled = !(await session.newSession(options));
277
+ return success(id, "new_session", { cancelled });
278
+ }
279
+ // =================================================================
280
+ // State
281
+ // =================================================================
282
+ case "get_state": {
283
+ const state = {
284
+ model: session.model,
285
+ thinkingLevel: session.thinkingLevel,
286
+ isStreaming: session.isStreaming,
287
+ isCompacting: session.isCompacting,
288
+ steeringMode: session.steeringMode,
289
+ followUpMode: session.followUpMode,
290
+ sessionFile: session.sessionFile,
291
+ sessionId: session.sessionId,
292
+ sessionName: session.sessionName,
293
+ autoCompactionEnabled: session.autoCompactionEnabled,
294
+ messageCount: session.messages.length,
295
+ pendingMessageCount: session.pendingMessageCount,
296
+ };
297
+ return success(id, "get_state", state);
298
+ }
299
+ // =================================================================
300
+ // Model
301
+ // =================================================================
302
+ case "set_model": {
303
+ const models = await session.modelRegistry.getAvailable();
304
+ const model = models.find((m) => m.provider === command.provider && m.id === command.modelId);
305
+ if (!model) {
306
+ return error(id, "set_model", `Model not found: ${command.provider}/${command.modelId}`);
307
+ }
308
+ await session.setModel(model);
309
+ return success(id, "set_model", model);
310
+ }
311
+ case "cycle_model": {
312
+ const result = await session.cycleModel();
313
+ if (!result) {
314
+ return success(id, "cycle_model", null);
315
+ }
316
+ return success(id, "cycle_model", result);
317
+ }
318
+ case "get_available_models": {
319
+ const models = await session.modelRegistry.getAvailable();
320
+ return success(id, "get_available_models", { models });
321
+ }
322
+ // =================================================================
323
+ // Thinking
324
+ // =================================================================
325
+ case "set_thinking_level": {
326
+ session.setThinkingLevel(command.level);
327
+ return success(id, "set_thinking_level");
328
+ }
329
+ case "cycle_thinking_level": {
330
+ const level = session.cycleThinkingLevel();
331
+ if (!level) {
332
+ return success(id, "cycle_thinking_level", null);
333
+ }
334
+ return success(id, "cycle_thinking_level", { level });
335
+ }
336
+ // =================================================================
337
+ // Queue Modes
338
+ // =================================================================
339
+ case "set_steering_mode": {
340
+ session.setSteeringMode(command.mode);
341
+ return success(id, "set_steering_mode");
342
+ }
343
+ case "set_follow_up_mode": {
344
+ session.setFollowUpMode(command.mode);
345
+ return success(id, "set_follow_up_mode");
346
+ }
347
+ // =================================================================
348
+ // Compaction
349
+ // =================================================================
350
+ case "compact": {
351
+ const result = await session.compact(command.customInstructions);
352
+ return success(id, "compact", result);
353
+ }
354
+ case "set_auto_compaction": {
355
+ session.setAutoCompactionEnabled(command.enabled);
356
+ return success(id, "set_auto_compaction");
357
+ }
358
+ // =================================================================
359
+ // Retry
360
+ // =================================================================
361
+ case "set_auto_retry": {
362
+ session.setAutoRetryEnabled(command.enabled);
363
+ return success(id, "set_auto_retry");
364
+ }
365
+ case "abort_retry": {
366
+ session.abortRetry();
367
+ return success(id, "abort_retry");
368
+ }
369
+ // =================================================================
370
+ // Bash
371
+ // =================================================================
372
+ case "bash": {
373
+ const result = await session.executeBash(command.command);
374
+ return success(id, "bash", result);
375
+ }
376
+ case "abort_bash": {
377
+ session.abortBash();
378
+ return success(id, "abort_bash");
379
+ }
380
+ // =================================================================
381
+ // Session
382
+ // =================================================================
383
+ case "get_session_stats": {
384
+ const stats = session.getSessionStats();
385
+ return success(id, "get_session_stats", stats);
386
+ }
387
+ case "export_html": {
388
+ const path = await session.exportToHtml(command.outputPath);
389
+ return success(id, "export_html", { path });
390
+ }
391
+ case "switch_session": {
392
+ const cancelled = !(await session.switchSession(command.sessionPath));
393
+ return success(id, "switch_session", { cancelled });
394
+ }
395
+ case "fork": {
396
+ const result = await session.fork(command.entryId);
397
+ return success(id, "fork", { text: result.selectedText, cancelled: result.cancelled });
398
+ }
399
+ case "get_fork_messages": {
400
+ const messages = session.getUserMessagesForForking();
401
+ return success(id, "get_fork_messages", { messages });
402
+ }
403
+ case "get_last_assistant_text": {
404
+ const text = session.getLastAssistantText();
405
+ return success(id, "get_last_assistant_text", { text });
406
+ }
407
+ case "set_session_name": {
408
+ const name = command.name.trim();
409
+ if (!name) {
410
+ return error(id, "set_session_name", "Session name cannot be empty");
411
+ }
412
+ session.setSessionName(name);
413
+ return success(id, "set_session_name");
414
+ }
415
+ // =================================================================
416
+ // Messages
417
+ // =================================================================
418
+ case "get_messages": {
419
+ return success(id, "get_messages", { messages: session.messages });
420
+ }
421
+ // =================================================================
422
+ // Commands (available for invocation via prompt)
423
+ // =================================================================
424
+ case "get_commands": {
425
+ const commands = [];
426
+ // Extension commands
427
+ for (const { command, extensionPath } of session.extensionRunner?.getRegisteredCommandsWithPaths() ?? []) {
428
+ commands.push({
429
+ name: command.name,
430
+ description: command.description,
431
+ source: "extension",
432
+ path: extensionPath,
433
+ });
434
+ }
435
+ // Prompt templates (source is always "user" | "project" | "path" in coding-agent)
436
+ for (const template of session.promptTemplates) {
437
+ commands.push({
438
+ name: template.name,
439
+ description: template.description,
440
+ source: "prompt",
441
+ location: template.source,
442
+ path: template.filePath,
443
+ });
444
+ }
445
+ // Skills (source is always "user" | "project" | "path" in coding-agent)
446
+ for (const skill of session.resourceLoader.getSkills().skills) {
447
+ commands.push({
448
+ name: `skill:${skill.name}`,
449
+ description: skill.description,
450
+ source: "skill",
451
+ location: skill.source,
452
+ path: skill.filePath,
453
+ });
454
+ }
455
+ return success(id, "get_commands", { commands });
456
+ }
457
+ default: {
458
+ const unknownCommand = command;
459
+ return error(undefined, unknownCommand.type, `Unknown command: ${unknownCommand.type}`);
460
+ }
461
+ }
462
+ };
463
+ /**
464
+ * Check if shutdown was requested and perform shutdown if so.
465
+ * Called after handling each command when waiting for the next command.
466
+ */
467
+ async function checkShutdownRequested() {
468
+ if (!shutdownRequested)
469
+ return;
470
+ const currentRunner = session.extensionRunner;
471
+ if (currentRunner?.hasHandlers("session_shutdown")) {
472
+ await currentRunner.emit({ type: "session_shutdown" });
473
+ }
474
+ // Close readline interface to stop waiting for input
475
+ rl.close();
476
+ process.exit(0);
477
+ }
478
+ // Listen for JSON input
479
+ const rl = readline.createInterface({
480
+ input: process.stdin,
481
+ output: process.stdout,
482
+ terminal: false,
483
+ });
484
+ rl.on("line", async (line) => {
485
+ try {
486
+ const parsed = JSON.parse(line);
487
+ // Handle extension UI responses
488
+ if (parsed.type === "extension_ui_response") {
489
+ const response = parsed;
490
+ const pending = pendingExtensionRequests.get(response.id);
491
+ if (pending) {
492
+ pendingExtensionRequests.delete(response.id);
493
+ pending.resolve(response);
494
+ }
495
+ return;
496
+ }
497
+ // Handle regular commands
498
+ const command = parsed;
499
+ const response = await handleCommand(command);
500
+ output(response);
501
+ // Check for deferred shutdown request (idle between commands)
502
+ await checkShutdownRequested();
503
+ }
504
+ catch (e) {
505
+ output(error(undefined, "parse", `Failed to parse command: ${e.message}`));
506
+ }
507
+ });
508
+ // Keep process alive forever
509
+ return new Promise(() => { });
510
+ }
511
+ //# sourceMappingURL=rpc-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-mode.js","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-mode.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * RPC mode: Headless operation with JSON stdin/stdout protocol.\r\n *\r\n * Used for embedding the agent in other applications.\r\n * Receives commands as JSON on stdin, outputs events and responses as JSON on stdout.\r\n *\r\n * Protocol:\r\n * - Commands: JSON objects with `type` field, optional `id` for correlation\r\n * - Responses: JSON objects with `type: \"response\"`, `command`, `success`, and optional `data`/`error`\r\n * - Events: AgentSessionEvent objects streamed as they occur\r\n * - Extension UI: Extension UI requests are emitted, client responds with extension_ui_response\r\n */\r\n\r\nimport * as crypto from \"node:crypto\";\r\nimport * as readline from \"readline\";\r\nimport type { AgentSession } from \"../../core/agent-session.js\";\r\nimport type {\r\n\tExtensionUIContext,\r\n\tExtensionUIDialogOptions,\r\n\tExtensionWidgetOptions,\r\n} from \"../../core/extensions/index.js\";\r\nimport { type Theme, theme } from \"../interactive/theme/theme.js\";\r\nimport type {\r\n\tRpcCommand,\r\n\tRpcExtensionUIRequest,\r\n\tRpcExtensionUIResponse,\r\n\tRpcResponse,\r\n\tRpcSessionState,\r\n\tRpcSlashCommand,\r\n} from \"./rpc-types.js\";\r\n\r\n// Re-export types for consumers\r\nexport type {\r\n\tRpcCommand,\r\n\tRpcExtensionUIRequest,\r\n\tRpcExtensionUIResponse,\r\n\tRpcResponse,\r\n\tRpcSessionState,\r\n} from \"./rpc-types.js\";\r\n\r\n/**\r\n * Run in RPC mode.\r\n * Listens for JSON commands on stdin, outputs events and responses on stdout.\r\n */\r\nexport async function runRpcMode(session: AgentSession): Promise<never> {\r\n\tconst output = (obj: RpcResponse | RpcExtensionUIRequest | object) => {\r\n\t\tconsole.log(JSON.stringify(obj));\r\n\t};\r\n\r\n\tconst success = <T extends RpcCommand[\"type\"]>(\r\n\t\tid: string | undefined,\r\n\t\tcommand: T,\r\n\t\tdata?: object | null,\r\n\t): RpcResponse => {\r\n\t\tif (data === undefined) {\r\n\t\t\treturn { id, type: \"response\", command, success: true } as RpcResponse;\r\n\t\t}\r\n\t\treturn { id, type: \"response\", command, success: true, data } as RpcResponse;\r\n\t};\r\n\r\n\tconst error = (id: string | undefined, command: string, message: string): RpcResponse => {\r\n\t\treturn { id, type: \"response\", command, success: false, error: message };\r\n\t};\r\n\r\n\t// Pending extension UI requests waiting for response\r\n\tconst pendingExtensionRequests = new Map<\r\n\t\tstring,\r\n\t\t{ resolve: (value: any) => void; reject: (error: Error) => void }\r\n\t>();\r\n\r\n\t// Shutdown request flag\r\n\tlet shutdownRequested = false;\r\n\r\n\t/** Helper for dialog methods with signal/timeout support */\r\n\tfunction createDialogPromise<T>(\r\n\t\topts: ExtensionUIDialogOptions | undefined,\r\n\t\tdefaultValue: T,\r\n\t\trequest: Record<string, unknown>,\r\n\t\tparseResponse: (response: RpcExtensionUIResponse) => T,\r\n\t): Promise<T> {\r\n\t\tif (opts?.signal?.aborted) return Promise.resolve(defaultValue);\r\n\r\n\t\tconst id = crypto.randomUUID();\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tlet timeoutId: ReturnType<typeof setTimeout> | undefined;\r\n\r\n\t\t\tconst cleanup = () => {\r\n\t\t\t\tif (timeoutId) clearTimeout(timeoutId);\r\n\t\t\t\topts?.signal?.removeEventListener(\"abort\", onAbort);\r\n\t\t\t\tpendingExtensionRequests.delete(id);\r\n\t\t\t};\r\n\r\n\t\t\tconst onAbort = () => {\r\n\t\t\t\tcleanup();\r\n\t\t\t\tresolve(defaultValue);\r\n\t\t\t};\r\n\t\t\topts?.signal?.addEventListener(\"abort\", onAbort, { once: true });\r\n\r\n\t\t\tif (opts?.timeout) {\r\n\t\t\t\ttimeoutId = setTimeout(() => {\r\n\t\t\t\t\tcleanup();\r\n\t\t\t\t\tresolve(defaultValue);\r\n\t\t\t\t}, opts.timeout);\r\n\t\t\t}\r\n\r\n\t\t\tpendingExtensionRequests.set(id, {\r\n\t\t\t\tresolve: (response: RpcExtensionUIResponse) => {\r\n\t\t\t\t\tcleanup();\r\n\t\t\t\t\tresolve(parseResponse(response));\r\n\t\t\t\t},\r\n\t\t\t\treject,\r\n\t\t\t});\r\n\t\t\toutput({ type: \"extension_ui_request\", id, ...request } as RpcExtensionUIRequest);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Create an extension UI context that uses the RPC protocol.\r\n\t */\r\n\tconst createExtensionUIContext = (): ExtensionUIContext => ({\r\n\t\tselect: (title, options, opts) =>\r\n\t\t\tcreateDialogPromise(opts, undefined, { method: \"select\", title, options, timeout: opts?.timeout }, (r) =>\r\n\t\t\t\t\"cancelled\" in r && r.cancelled ? undefined : \"value\" in r ? r.value : undefined,\r\n\t\t\t),\r\n\r\n\t\tconfirm: (title, message, opts) =>\r\n\t\t\tcreateDialogPromise(opts, false, { method: \"confirm\", title, message, timeout: opts?.timeout }, (r) =>\r\n\t\t\t\t\"cancelled\" in r && r.cancelled ? false : \"confirmed\" in r ? r.confirmed : false,\r\n\t\t\t),\r\n\r\n\t\tinput: (title, placeholder, opts) =>\r\n\t\t\tcreateDialogPromise(opts, undefined, { method: \"input\", title, placeholder, timeout: opts?.timeout }, (r) =>\r\n\t\t\t\t\"cancelled\" in r && r.cancelled ? undefined : \"value\" in r ? r.value : undefined,\r\n\t\t\t),\r\n\r\n\t\tnotify(message: string, type?: \"info\" | \"warning\" | \"error\"): void {\r\n\t\t\t// Fire and forget - no response needed\r\n\t\t\toutput({\r\n\t\t\t\ttype: \"extension_ui_request\",\r\n\t\t\t\tid: crypto.randomUUID(),\r\n\t\t\t\tmethod: \"notify\",\r\n\t\t\t\tmessage,\r\n\t\t\t\tnotifyType: type,\r\n\t\t\t} as RpcExtensionUIRequest);\r\n\t\t},\r\n\r\n\t\tonTerminalInput(): () => void {\r\n\t\t\t// Raw terminal input not supported in RPC mode\r\n\t\t\treturn () => {};\r\n\t\t},\r\n\r\n\t\tsetStatus(key: string, text: string | undefined): void {\r\n\t\t\t// Fire and forget - no response needed\r\n\t\t\toutput({\r\n\t\t\t\ttype: \"extension_ui_request\",\r\n\t\t\t\tid: crypto.randomUUID(),\r\n\t\t\t\tmethod: \"setStatus\",\r\n\t\t\t\tstatusKey: key,\r\n\t\t\t\tstatusText: text,\r\n\t\t\t} as RpcExtensionUIRequest);\r\n\t\t},\r\n\r\n\t\tsetWorkingMessage(_message?: string): void {\r\n\t\t\t// Working message not supported in RPC mode - requires TUI loader access\r\n\t\t},\r\n\r\n\t\tsetWidget(key: string, content: unknown, options?: ExtensionWidgetOptions): void {\r\n\t\t\t// Only support string arrays in RPC mode - factory functions are ignored\r\n\t\t\tif (content === undefined || Array.isArray(content)) {\r\n\t\t\t\toutput({\r\n\t\t\t\t\ttype: \"extension_ui_request\",\r\n\t\t\t\t\tid: crypto.randomUUID(),\r\n\t\t\t\t\tmethod: \"setWidget\",\r\n\t\t\t\t\twidgetKey: key,\r\n\t\t\t\t\twidgetLines: content as string[] | undefined,\r\n\t\t\t\t\twidgetPlacement: options?.placement,\r\n\t\t\t\t} as RpcExtensionUIRequest);\r\n\t\t\t}\r\n\t\t\t// Component factories are not supported in RPC mode - would need TUI access\r\n\t\t},\r\n\r\n\t\tsetFooter(_factory: unknown): void {\r\n\t\t\t// Custom footer not supported in RPC mode - requires TUI access\r\n\t\t},\r\n\r\n\t\tsetHeader(_factory: unknown): void {\r\n\t\t\t// Custom header not supported in RPC mode - requires TUI access\r\n\t\t},\r\n\r\n\t\tsetTitle(title: string): void {\r\n\t\t\t// Fire and forget - host can implement terminal title control\r\n\t\t\toutput({\r\n\t\t\t\ttype: \"extension_ui_request\",\r\n\t\t\t\tid: crypto.randomUUID(),\r\n\t\t\t\tmethod: \"setTitle\",\r\n\t\t\t\ttitle,\r\n\t\t\t} as RpcExtensionUIRequest);\r\n\t\t},\r\n\r\n\t\tasync custom() {\r\n\t\t\t// Custom UI not supported in RPC mode\r\n\t\t\treturn undefined as never;\r\n\t\t},\r\n\r\n\t\tpasteToEditor(text: string): void {\r\n\t\t\t// Paste handling not supported in RPC mode - falls back to setEditorText\r\n\t\t\tthis.setEditorText(text);\r\n\t\t},\r\n\r\n\t\tsetEditorText(text: string): void {\r\n\t\t\t// Fire and forget - host can implement editor control\r\n\t\t\toutput({\r\n\t\t\t\ttype: \"extension_ui_request\",\r\n\t\t\t\tid: crypto.randomUUID(),\r\n\t\t\t\tmethod: \"set_editor_text\",\r\n\t\t\t\ttext,\r\n\t\t\t} as RpcExtensionUIRequest);\r\n\t\t},\r\n\r\n\t\tgetEditorText(): string {\r\n\t\t\t// Synchronous method can't wait for RPC response\r\n\t\t\t// Host should track editor state locally if needed\r\n\t\t\treturn \"\";\r\n\t\t},\r\n\r\n\t\tasync editor(title: string, prefill?: string): Promise<string | undefined> {\r\n\t\t\tconst id = crypto.randomUUID();\r\n\t\t\treturn new Promise((resolve, reject) => {\r\n\t\t\t\tpendingExtensionRequests.set(id, {\r\n\t\t\t\t\tresolve: (response: RpcExtensionUIResponse) => {\r\n\t\t\t\t\t\tif (\"cancelled\" in response && response.cancelled) {\r\n\t\t\t\t\t\t\tresolve(undefined);\r\n\t\t\t\t\t\t} else if (\"value\" in response) {\r\n\t\t\t\t\t\t\tresolve(response.value);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tresolve(undefined);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\t\t\t\t\treject,\r\n\t\t\t\t});\r\n\t\t\t\toutput({ type: \"extension_ui_request\", id, method: \"editor\", title, prefill } as RpcExtensionUIRequest);\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\tsetEditorComponent(): void {\r\n\t\t\t// Custom editor components not supported in RPC mode\r\n\t\t},\r\n\r\n\t\tget theme() {\r\n\t\t\treturn theme;\r\n\t\t},\r\n\r\n\t\tgetAllThemes() {\r\n\t\t\treturn [];\r\n\t\t},\r\n\r\n\t\tgetTheme(_name: string) {\r\n\t\t\treturn undefined;\r\n\t\t},\r\n\r\n\t\tsetTheme(_theme: string | Theme) {\r\n\t\t\t// Theme switching not supported in RPC mode\r\n\t\t\treturn { success: false, error: \"Theme switching not supported in RPC mode\" };\r\n\t\t},\r\n\r\n\t\tgetToolsExpanded() {\r\n\t\t\t// Tool expansion not supported in RPC mode - no TUI\r\n\t\t\treturn false;\r\n\t\t},\r\n\r\n\t\tsetToolsExpanded(_expanded: boolean) {\r\n\t\t\t// Tool expansion not supported in RPC mode - no TUI\r\n\t\t},\r\n\t});\r\n\r\n\t// Set up extensions with RPC-based UI context\r\n\tawait session.bindExtensions({\r\n\t\tuiContext: createExtensionUIContext(),\r\n\t\tcommandContextActions: {\r\n\t\t\twaitForIdle: () => session.agent.waitForIdle(),\r\n\t\t\tnewSession: async (options) => {\r\n\t\t\t\t// Delegate to AgentSession (handles setup + agent state sync)\r\n\t\t\t\tconst success = await session.newSession(options);\r\n\t\t\t\treturn { cancelled: !success };\r\n\t\t\t},\r\n\t\t\tfork: async (entryId) => {\r\n\t\t\t\tconst result = await session.fork(entryId);\r\n\t\t\t\treturn { cancelled: result.cancelled };\r\n\t\t\t},\r\n\t\t\tnavigateTree: async (targetId, options) => {\r\n\t\t\t\tconst result = await session.navigateTree(targetId, {\r\n\t\t\t\t\tsummarize: options?.summarize,\r\n\t\t\t\t\tcustomInstructions: options?.customInstructions,\r\n\t\t\t\t\treplaceInstructions: options?.replaceInstructions,\r\n\t\t\t\t\tlabel: options?.label,\r\n\t\t\t\t});\r\n\t\t\t\treturn { cancelled: result.cancelled };\r\n\t\t\t},\r\n\t\t\tswitchSession: async (sessionPath) => {\r\n\t\t\t\tconst success = await session.switchSession(sessionPath);\r\n\t\t\t\treturn { cancelled: !success };\r\n\t\t\t},\r\n\t\t\treload: async () => {\r\n\t\t\t\tawait session.reload();\r\n\t\t\t},\r\n\t\t},\r\n\t\tshutdownHandler: () => {\r\n\t\t\tshutdownRequested = true;\r\n\t\t},\r\n\t\tonError: (err) => {\r\n\t\t\toutput({ type: \"extension_error\", extensionPath: err.extensionPath, event: err.event, error: err.error });\r\n\t\t},\r\n\t});\r\n\r\n\t// Output all agent events as JSON\r\n\tsession.subscribe((event) => {\r\n\t\toutput(event);\r\n\t});\r\n\r\n\t// Handle a single command\r\n\tconst handleCommand = async (command: RpcCommand): Promise<RpcResponse> => {\r\n\t\tconst id = command.id;\r\n\r\n\t\tswitch (command.type) {\r\n\t\t\t// =================================================================\r\n\t\t\t// Prompting\r\n\t\t\t// =================================================================\r\n\r\n\t\t\tcase \"prompt\": {\r\n\t\t\t\t// Don't await - events will stream\r\n\t\t\t\t// Extension commands are executed immediately, file prompt templates are expanded\r\n\t\t\t\t// If streaming and streamingBehavior specified, queues via steer/followUp\r\n\t\t\t\tsession\r\n\t\t\t\t\t.prompt(command.message, {\r\n\t\t\t\t\t\timages: command.images,\r\n\t\t\t\t\t\tstreamingBehavior: command.streamingBehavior,\r\n\t\t\t\t\t\tsource: \"rpc\",\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.catch((e) => output(error(id, \"prompt\", e.message)));\r\n\t\t\t\treturn success(id, \"prompt\");\r\n\t\t\t}\r\n\r\n\t\t\tcase \"steer\": {\r\n\t\t\t\tawait session.steer(command.message, command.images);\r\n\t\t\t\treturn success(id, \"steer\");\r\n\t\t\t}\r\n\r\n\t\t\tcase \"follow_up\": {\r\n\t\t\t\tawait session.followUp(command.message, command.images);\r\n\t\t\t\treturn success(id, \"follow_up\");\r\n\t\t\t}\r\n\r\n\t\t\tcase \"abort\": {\r\n\t\t\t\tawait session.abort();\r\n\t\t\t\treturn success(id, \"abort\");\r\n\t\t\t}\r\n\r\n\t\t\tcase \"new_session\": {\r\n\t\t\t\tconst options = command.parentSession ? { parentSession: command.parentSession } : undefined;\r\n\t\t\t\tconst cancelled = !(await session.newSession(options));\r\n\t\t\t\treturn success(id, \"new_session\", { cancelled });\r\n\t\t\t}\r\n\r\n\t\t\t// =================================================================\r\n\t\t\t// State\r\n\t\t\t// =================================================================\r\n\r\n\t\t\tcase \"get_state\": {\r\n\t\t\t\tconst state: RpcSessionState = {\r\n\t\t\t\t\tmodel: session.model,\r\n\t\t\t\t\tthinkingLevel: session.thinkingLevel,\r\n\t\t\t\t\tisStreaming: session.isStreaming,\r\n\t\t\t\t\tisCompacting: session.isCompacting,\r\n\t\t\t\t\tsteeringMode: session.steeringMode,\r\n\t\t\t\t\tfollowUpMode: session.followUpMode,\r\n\t\t\t\t\tsessionFile: session.sessionFile,\r\n\t\t\t\t\tsessionId: session.sessionId,\r\n\t\t\t\t\tsessionName: session.sessionName,\r\n\t\t\t\t\tautoCompactionEnabled: session.autoCompactionEnabled,\r\n\t\t\t\t\tmessageCount: session.messages.length,\r\n\t\t\t\t\tpendingMessageCount: session.pendingMessageCount,\r\n\t\t\t\t};\r\n\t\t\t\treturn success(id, \"get_state\", state);\r\n\t\t\t}\r\n\r\n\t\t\t// =================================================================\r\n\t\t\t// Model\r\n\t\t\t// =================================================================\r\n\r\n\t\t\tcase \"set_model\": {\r\n\t\t\t\tconst models = await session.modelRegistry.getAvailable();\r\n\t\t\t\tconst model = models.find((m) => m.provider === command.provider && m.id === command.modelId);\r\n\t\t\t\tif (!model) {\r\n\t\t\t\t\treturn error(id, \"set_model\", `Model not found: ${command.provider}/${command.modelId}`);\r\n\t\t\t\t}\r\n\t\t\t\tawait session.setModel(model);\r\n\t\t\t\treturn success(id, \"set_model\", model);\r\n\t\t\t}\r\n\r\n\t\t\tcase \"cycle_model\": {\r\n\t\t\t\tconst result = await session.cycleModel();\r\n\t\t\t\tif (!result) {\r\n\t\t\t\t\treturn success(id, \"cycle_model\", null);\r\n\t\t\t\t}\r\n\t\t\t\treturn success(id, \"cycle_model\", result);\r\n\t\t\t}\r\n\r\n\t\t\tcase \"get_available_models\": {\r\n\t\t\t\tconst models = await session.modelRegistry.getAvailable();\r\n\t\t\t\treturn success(id, \"get_available_models\", { models });\r\n\t\t\t}\r\n\r\n\t\t\t// =================================================================\r\n\t\t\t// Thinking\r\n\t\t\t// =================================================================\r\n\r\n\t\t\tcase \"set_thinking_level\": {\r\n\t\t\t\tsession.setThinkingLevel(command.level);\r\n\t\t\t\treturn success(id, \"set_thinking_level\");\r\n\t\t\t}\r\n\r\n\t\t\tcase \"cycle_thinking_level\": {\r\n\t\t\t\tconst level = session.cycleThinkingLevel();\r\n\t\t\t\tif (!level) {\r\n\t\t\t\t\treturn success(id, \"cycle_thinking_level\", null);\r\n\t\t\t\t}\r\n\t\t\t\treturn success(id, \"cycle_thinking_level\", { level });\r\n\t\t\t}\r\n\r\n\t\t\t// =================================================================\r\n\t\t\t// Queue Modes\r\n\t\t\t// =================================================================\r\n\r\n\t\t\tcase \"set_steering_mode\": {\r\n\t\t\t\tsession.setSteeringMode(command.mode);\r\n\t\t\t\treturn success(id, \"set_steering_mode\");\r\n\t\t\t}\r\n\r\n\t\t\tcase \"set_follow_up_mode\": {\r\n\t\t\t\tsession.setFollowUpMode(command.mode);\r\n\t\t\t\treturn success(id, \"set_follow_up_mode\");\r\n\t\t\t}\r\n\r\n\t\t\t// =================================================================\r\n\t\t\t// Compaction\r\n\t\t\t// =================================================================\r\n\r\n\t\t\tcase \"compact\": {\r\n\t\t\t\tconst result = await session.compact(command.customInstructions);\r\n\t\t\t\treturn success(id, \"compact\", result);\r\n\t\t\t}\r\n\r\n\t\t\tcase \"set_auto_compaction\": {\r\n\t\t\t\tsession.setAutoCompactionEnabled(command.enabled);\r\n\t\t\t\treturn success(id, \"set_auto_compaction\");\r\n\t\t\t}\r\n\r\n\t\t\t// =================================================================\r\n\t\t\t// Retry\r\n\t\t\t// =================================================================\r\n\r\n\t\t\tcase \"set_auto_retry\": {\r\n\t\t\t\tsession.setAutoRetryEnabled(command.enabled);\r\n\t\t\t\treturn success(id, \"set_auto_retry\");\r\n\t\t\t}\r\n\r\n\t\t\tcase \"abort_retry\": {\r\n\t\t\t\tsession.abortRetry();\r\n\t\t\t\treturn success(id, \"abort_retry\");\r\n\t\t\t}\r\n\r\n\t\t\t// =================================================================\r\n\t\t\t// Bash\r\n\t\t\t// =================================================================\r\n\r\n\t\t\tcase \"bash\": {\r\n\t\t\t\tconst result = await session.executeBash(command.command);\r\n\t\t\t\treturn success(id, \"bash\", result);\r\n\t\t\t}\r\n\r\n\t\t\tcase \"abort_bash\": {\r\n\t\t\t\tsession.abortBash();\r\n\t\t\t\treturn success(id, \"abort_bash\");\r\n\t\t\t}\r\n\r\n\t\t\t// =================================================================\r\n\t\t\t// Session\r\n\t\t\t// =================================================================\r\n\r\n\t\t\tcase \"get_session_stats\": {\r\n\t\t\t\tconst stats = session.getSessionStats();\r\n\t\t\t\treturn success(id, \"get_session_stats\", stats);\r\n\t\t\t}\r\n\r\n\t\t\tcase \"export_html\": {\r\n\t\t\t\tconst path = await session.exportToHtml(command.outputPath);\r\n\t\t\t\treturn success(id, \"export_html\", { path });\r\n\t\t\t}\r\n\r\n\t\t\tcase \"switch_session\": {\r\n\t\t\t\tconst cancelled = !(await session.switchSession(command.sessionPath));\r\n\t\t\t\treturn success(id, \"switch_session\", { cancelled });\r\n\t\t\t}\r\n\r\n\t\t\tcase \"fork\": {\r\n\t\t\t\tconst result = await session.fork(command.entryId);\r\n\t\t\t\treturn success(id, \"fork\", { text: result.selectedText, cancelled: result.cancelled });\r\n\t\t\t}\r\n\r\n\t\t\tcase \"get_fork_messages\": {\r\n\t\t\t\tconst messages = session.getUserMessagesForForking();\r\n\t\t\t\treturn success(id, \"get_fork_messages\", { messages });\r\n\t\t\t}\r\n\r\n\t\t\tcase \"get_last_assistant_text\": {\r\n\t\t\t\tconst text = session.getLastAssistantText();\r\n\t\t\t\treturn success(id, \"get_last_assistant_text\", { text });\r\n\t\t\t}\r\n\r\n\t\t\tcase \"set_session_name\": {\r\n\t\t\t\tconst name = command.name.trim();\r\n\t\t\t\tif (!name) {\r\n\t\t\t\t\treturn error(id, \"set_session_name\", \"Session name cannot be empty\");\r\n\t\t\t\t}\r\n\t\t\t\tsession.setSessionName(name);\r\n\t\t\t\treturn success(id, \"set_session_name\");\r\n\t\t\t}\r\n\r\n\t\t\t// =================================================================\r\n\t\t\t// Messages\r\n\t\t\t// =================================================================\r\n\r\n\t\t\tcase \"get_messages\": {\r\n\t\t\t\treturn success(id, \"get_messages\", { messages: session.messages });\r\n\t\t\t}\r\n\r\n\t\t\t// =================================================================\r\n\t\t\t// Commands (available for invocation via prompt)\r\n\t\t\t// =================================================================\r\n\r\n\t\t\tcase \"get_commands\": {\r\n\t\t\t\tconst commands: RpcSlashCommand[] = [];\r\n\r\n\t\t\t\t// Extension commands\r\n\t\t\t\tfor (const { command, extensionPath } of session.extensionRunner?.getRegisteredCommandsWithPaths() ?? []) {\r\n\t\t\t\t\tcommands.push({\r\n\t\t\t\t\t\tname: command.name,\r\n\t\t\t\t\t\tdescription: command.description,\r\n\t\t\t\t\t\tsource: \"extension\",\r\n\t\t\t\t\t\tpath: extensionPath,\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Prompt templates (source is always \"user\" | \"project\" | \"path\" in coding-agent)\r\n\t\t\t\tfor (const template of session.promptTemplates) {\r\n\t\t\t\t\tcommands.push({\r\n\t\t\t\t\t\tname: template.name,\r\n\t\t\t\t\t\tdescription: template.description,\r\n\t\t\t\t\t\tsource: \"prompt\",\r\n\t\t\t\t\t\tlocation: template.source as RpcSlashCommand[\"location\"],\r\n\t\t\t\t\t\tpath: template.filePath,\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Skills (source is always \"user\" | \"project\" | \"path\" in coding-agent)\r\n\t\t\t\tfor (const skill of session.resourceLoader.getSkills().skills) {\r\n\t\t\t\t\tcommands.push({\r\n\t\t\t\t\t\tname: `skill:${skill.name}`,\r\n\t\t\t\t\t\tdescription: skill.description,\r\n\t\t\t\t\t\tsource: \"skill\",\r\n\t\t\t\t\t\tlocation: skill.source as RpcSlashCommand[\"location\"],\r\n\t\t\t\t\t\tpath: skill.filePath,\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn success(id, \"get_commands\", { commands });\r\n\t\t\t}\r\n\r\n\t\t\tdefault: {\r\n\t\t\t\tconst unknownCommand = command as { type: string };\r\n\t\t\t\treturn error(undefined, unknownCommand.type, `Unknown command: ${unknownCommand.type}`);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Check if shutdown was requested and perform shutdown if so.\r\n\t * Called after handling each command when waiting for the next command.\r\n\t */\r\n\tasync function checkShutdownRequested(): Promise<void> {\r\n\t\tif (!shutdownRequested) return;\r\n\r\n\t\tconst currentRunner = session.extensionRunner;\r\n\t\tif (currentRunner?.hasHandlers(\"session_shutdown\")) {\r\n\t\t\tawait currentRunner.emit({ type: \"session_shutdown\" });\r\n\t\t}\r\n\r\n\t\t// Close readline interface to stop waiting for input\r\n\t\trl.close();\r\n\t\tprocess.exit(0);\r\n\t}\r\n\r\n\t// Listen for JSON input\r\n\tconst rl = readline.createInterface({\r\n\t\tinput: process.stdin,\r\n\t\toutput: process.stdout,\r\n\t\tterminal: false,\r\n\t});\r\n\r\n\trl.on(\"line\", async (line: string) => {\r\n\t\ttry {\r\n\t\t\tconst parsed = JSON.parse(line);\r\n\r\n\t\t\t// Handle extension UI responses\r\n\t\t\tif (parsed.type === \"extension_ui_response\") {\r\n\t\t\t\tconst response = parsed as RpcExtensionUIResponse;\r\n\t\t\t\tconst pending = pendingExtensionRequests.get(response.id);\r\n\t\t\t\tif (pending) {\r\n\t\t\t\t\tpendingExtensionRequests.delete(response.id);\r\n\t\t\t\t\tpending.resolve(response);\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// Handle regular commands\r\n\t\t\tconst command = parsed as RpcCommand;\r\n\t\t\tconst response = await handleCommand(command);\r\n\t\t\toutput(response);\r\n\r\n\t\t\t// Check for deferred shutdown request (idle between commands)\r\n\t\t\tawait checkShutdownRequested();\r\n\t\t} catch (e: any) {\r\n\t\t\toutput(error(undefined, \"parse\", `Failed to parse command: ${e.message}`));\r\n\t\t}\r\n\t});\r\n\r\n\t// Keep process alive forever\r\n\treturn new Promise(() => {});\r\n}\r\n"]}