@mrquake/quakecode-cli 0.64.0

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