@bastani/atomic 0.9.11-alpha.2 → 0.9.11-alpha.4

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 (495) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/builtin/cursor/package.json +2 -2
  3. package/dist/builtin/intercom/package.json +1 -1
  4. package/dist/builtin/mcp/package.json +1 -1
  5. package/dist/builtin/subagents/CHANGELOG.md +6 -0
  6. package/dist/builtin/subagents/package.json +1 -1
  7. package/dist/builtin/subagents/src/runs/background/notify.ts +3 -1
  8. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-chain.ts +5 -2
  9. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +2 -1
  10. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +5 -2
  11. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +34 -0
  12. package/dist/builtin/web-access/package.json +1 -1
  13. package/dist/builtin/workflows/CHANGELOG.md +20 -0
  14. package/dist/builtin/workflows/builtin/goal-prompts.ts +8 -3
  15. package/dist/builtin/workflows/builtin/goal.ts +4 -4
  16. package/dist/builtin/workflows/builtin/ralph-forked-prompts.ts +1 -1
  17. package/dist/builtin/workflows/builtin/ralph-reviewer-prompt.ts +3 -1
  18. package/dist/builtin/workflows/builtin/ralph-runner.ts +2 -0
  19. package/dist/builtin/workflows/builtin/ralph.ts +4 -4
  20. package/dist/builtin/workflows/builtin/shared-prompts.ts +16 -0
  21. package/dist/builtin/workflows/package.json +2 -2
  22. package/dist/builtin/workflows/src/authoring/workflow.ts +1 -0
  23. package/dist/builtin/workflows/src/durable/dbos-lifecycle.ts +27 -1
  24. package/dist/builtin/workflows/src/durable/factory.ts +29 -3
  25. package/dist/builtin/workflows/src/durable/index.ts +2 -0
  26. package/dist/builtin/workflows/src/engine/run-durable-admission.ts +50 -0
  27. package/dist/builtin/workflows/src/engine/run.ts +12 -17
  28. package/dist/builtin/workflows/src/extension/extension-factory.ts +16 -1
  29. package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +16 -2
  30. package/dist/builtin/workflows/src/extension/index.bundle.mjs +71724 -0
  31. package/dist/builtin/workflows/src/extension/runtime.ts +5 -3
  32. package/dist/builtin/workflows/src/extension/ui-surface.ts +4 -0
  33. package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +4 -1
  34. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +3 -1
  35. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +1 -0
  36. package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +1 -0
  37. package/dist/builtin/workflows/src/shared/types.ts +7 -0
  38. package/dist/builtin/workflows/src/shared/workflow-authoring-types.d.ts +1 -0
  39. package/dist/builtin/workflows/src/shared/workflow-authoring-types.ts +1 -0
  40. package/dist/builtin/workflows/src/tui/host-input-form.ts +1 -1
  41. package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +6 -8
  42. package/dist/builtin/workflows/src/tui/stage-chat-view-types.ts +2 -0
  43. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +4 -0
  44. package/dist/cli/args.d.ts +8 -0
  45. package/dist/cli/args.d.ts.map +1 -1
  46. package/dist/cli/args.js +18 -2
  47. package/dist/cli/args.js.map +1 -1
  48. package/dist/cli/config-selector.d.ts +4 -2
  49. package/dist/cli/config-selector.d.ts.map +1 -1
  50. package/dist/cli/config-selector.js +1 -1
  51. package/dist/cli/config-selector.js.map +1 -1
  52. package/dist/cli/startup-ui.d.ts +3 -0
  53. package/dist/cli/startup-ui.d.ts.map +1 -1
  54. package/dist/cli/startup-ui.js +50 -1
  55. package/dist/cli/startup-ui.js.map +1 -1
  56. package/dist/cli.js +2 -0
  57. package/dist/cli.js.map +1 -1
  58. package/dist/config-command-parser.d.ts +9 -0
  59. package/dist/config-command-parser.d.ts.map +1 -0
  60. package/dist/config-command-parser.js +22 -0
  61. package/dist/config-command-parser.js.map +1 -0
  62. package/dist/config-self-update.d.ts +6 -2
  63. package/dist/config-self-update.d.ts.map +1 -1
  64. package/dist/config-self-update.js +17 -10
  65. package/dist/config-self-update.js.map +1 -1
  66. package/dist/config.d.ts +3 -3
  67. package/dist/config.d.ts.map +1 -1
  68. package/dist/config.js +4 -4
  69. package/dist/config.js.map +1 -1
  70. package/dist/core/agent-session-export.d.ts.map +1 -1
  71. package/dist/core/agent-session-export.js +32 -25
  72. package/dist/core/agent-session-export.js.map +1 -1
  73. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  74. package/dist/core/agent-session-extension-bindings.js +9 -3
  75. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  76. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  77. package/dist/core/agent-session-prompt.js +5 -0
  78. package/dist/core/agent-session-prompt.js.map +1 -1
  79. package/dist/core/agent-session-services.d.ts +2 -0
  80. package/dist/core/agent-session-services.d.ts.map +1 -1
  81. package/dist/core/agent-session-services.js +8 -5
  82. package/dist/core/agent-session-services.js.map +1 -1
  83. package/dist/core/agent-session-tree.d.ts.map +1 -1
  84. package/dist/core/agent-session-tree.js +3 -1
  85. package/dist/core/agent-session-tree.js.map +1 -1
  86. package/dist/core/agent-session-types.d.ts +5 -0
  87. package/dist/core/agent-session-types.d.ts.map +1 -1
  88. package/dist/core/agent-session-types.js.map +1 -1
  89. package/dist/core/auth-storage.d.ts +6 -2
  90. package/dist/core/auth-storage.d.ts.map +1 -1
  91. package/dist/core/auth-storage.js +5 -1
  92. package/dist/core/auth-storage.js.map +1 -1
  93. package/dist/core/cache-stats.d.ts +25 -0
  94. package/dist/core/cache-stats.d.ts.map +1 -0
  95. package/dist/core/cache-stats.js +68 -0
  96. package/dist/core/cache-stats.js.map +1 -0
  97. package/dist/core/compaction/branch-summarization.d.ts +2 -1
  98. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  99. package/dist/core/compaction/branch-summarization.js +1 -0
  100. package/dist/core/compaction/branch-summarization.js.map +1 -1
  101. package/dist/core/extensions/agent-events.d.ts +10 -0
  102. package/dist/core/extensions/agent-events.d.ts.map +1 -1
  103. package/dist/core/extensions/agent-events.js.map +1 -1
  104. package/dist/core/extensions/api-types.d.ts +8 -2
  105. package/dist/core/extensions/api-types.d.ts.map +1 -1
  106. package/dist/core/extensions/api-types.js.map +1 -1
  107. package/dist/core/extensions/event-types.d.ts +2 -2
  108. package/dist/core/extensions/event-types.d.ts.map +1 -1
  109. package/dist/core/extensions/event-types.js.map +1 -1
  110. package/dist/core/extensions/index.d.ts +1 -1
  111. package/dist/core/extensions/index.d.ts.map +1 -1
  112. package/dist/core/extensions/index.js.map +1 -1
  113. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  114. package/dist/core/extensions/loader-api.js +13 -2
  115. package/dist/core/extensions/loader-api.js.map +1 -1
  116. package/dist/core/extensions/loader-core.d.ts.map +1 -1
  117. package/dist/core/extensions/loader-core.js +1 -0
  118. package/dist/core/extensions/loader-core.js.map +1 -1
  119. package/dist/core/extensions/loader-runtime.d.ts.map +1 -1
  120. package/dist/core/extensions/loader-runtime.js +15 -7
  121. package/dist/core/extensions/loader-runtime.js.map +1 -1
  122. package/dist/core/extensions/message-types.d.ts +5 -0
  123. package/dist/core/extensions/message-types.d.ts.map +1 -1
  124. package/dist/core/extensions/message-types.js.map +1 -1
  125. package/dist/core/extensions/provider-types.d.ts +46 -0
  126. package/dist/core/extensions/provider-types.d.ts.map +1 -1
  127. package/dist/core/extensions/provider-types.js.map +1 -1
  128. package/dist/core/extensions/runner-registries.d.ts +2 -1
  129. package/dist/core/extensions/runner-registries.d.ts.map +1 -1
  130. package/dist/core/extensions/runner-registries.js +8 -0
  131. package/dist/core/extensions/runner-registries.js.map +1 -1
  132. package/dist/core/extensions/runner.d.ts +5 -2
  133. package/dist/core/extensions/runner.d.ts.map +1 -1
  134. package/dist/core/extensions/runner.js +35 -13
  135. package/dist/core/extensions/runner.js.map +1 -1
  136. package/dist/core/extensions/runtime-types.d.ts +8 -2
  137. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  138. package/dist/core/extensions/runtime-types.js.map +1 -1
  139. package/dist/core/extensions/ui-types.d.ts +4 -0
  140. package/dist/core/extensions/ui-types.d.ts.map +1 -1
  141. package/dist/core/extensions/ui-types.js.map +1 -1
  142. package/dist/core/http-dispatcher.d.ts +1 -0
  143. package/dist/core/http-dispatcher.d.ts.map +1 -1
  144. package/dist/core/http-dispatcher.js +16 -2
  145. package/dist/core/http-dispatcher.js.map +1 -1
  146. package/dist/core/keybindings.d.ts +6 -1
  147. package/dist/core/keybindings.d.ts.map +1 -1
  148. package/dist/core/keybindings.js +3 -1
  149. package/dist/core/keybindings.js.map +1 -1
  150. package/dist/core/model-registry-auth.d.ts +2 -0
  151. package/dist/core/model-registry-auth.d.ts.map +1 -1
  152. package/dist/core/model-registry-auth.js +18 -1
  153. package/dist/core/model-registry-auth.js.map +1 -1
  154. package/dist/core/model-registry-custom-loader.d.ts.map +1 -1
  155. package/dist/core/model-registry-custom-loader.js +14 -2
  156. package/dist/core/model-registry-custom-loader.js.map +1 -1
  157. package/dist/core/model-registry-dynamic.js +2 -2
  158. package/dist/core/model-registry-dynamic.js.map +1 -1
  159. package/dist/core/model-registry-loader.d.ts.map +1 -1
  160. package/dist/core/model-registry-loader.js +2 -1
  161. package/dist/core/model-registry-loader.js.map +1 -1
  162. package/dist/core/model-registry-schemas.d.ts +17 -0
  163. package/dist/core/model-registry-schemas.d.ts.map +1 -1
  164. package/dist/core/model-registry-schemas.js +2 -0
  165. package/dist/core/model-registry-schemas.js.map +1 -1
  166. package/dist/core/model-registry-types.d.ts +10 -1
  167. package/dist/core/model-registry-types.d.ts.map +1 -1
  168. package/dist/core/model-registry-types.js.map +1 -1
  169. package/dist/core/model-registry.d.ts +26 -36
  170. package/dist/core/model-registry.d.ts.map +1 -1
  171. package/dist/core/model-registry.js +72 -67
  172. package/dist/core/model-registry.js.map +1 -1
  173. package/dist/core/model-resolver-defaults.d.ts.map +1 -1
  174. package/dist/core/model-resolver-defaults.js +3 -0
  175. package/dist/core/model-resolver-defaults.js.map +1 -1
  176. package/dist/core/model-runtime.d.ts +52 -0
  177. package/dist/core/model-runtime.d.ts.map +1 -0
  178. package/dist/core/model-runtime.js +120 -0
  179. package/dist/core/model-runtime.js.map +1 -0
  180. package/dist/core/oauth-provider-bridge.d.ts +3 -1
  181. package/dist/core/oauth-provider-bridge.d.ts.map +1 -1
  182. package/dist/core/oauth-provider-bridge.js +6 -4
  183. package/dist/core/oauth-provider-bridge.js.map +1 -1
  184. package/dist/core/package-manager-resolver.js +22 -11
  185. package/dist/core/package-manager-resolver.js.map +1 -1
  186. package/dist/core/package-manager-resource-collector.d.ts.map +1 -1
  187. package/dist/core/package-manager-resource-collector.js +8 -2
  188. package/dist/core/package-manager-resource-collector.js.map +1 -1
  189. package/dist/core/package-manager-resource-patterns.d.ts +1 -0
  190. package/dist/core/package-manager-resource-patterns.d.ts.map +1 -1
  191. package/dist/core/package-manager-resource-patterns.js +15 -0
  192. package/dist/core/package-manager-resource-patterns.js.map +1 -1
  193. package/dist/core/package-manager-source.d.ts.map +1 -1
  194. package/dist/core/package-manager-source.js +15 -8
  195. package/dist/core/package-manager-source.js.map +1 -1
  196. package/dist/core/package-manager-types.d.ts +1 -0
  197. package/dist/core/package-manager-types.d.ts.map +1 -1
  198. package/dist/core/package-manager-types.js.map +1 -1
  199. package/dist/core/provider-display-names.d.ts.map +1 -1
  200. package/dist/core/provider-display-names.js +4 -0
  201. package/dist/core/provider-display-names.js.map +1 -1
  202. package/dist/core/resource-loader-core.d.ts.map +1 -1
  203. package/dist/core/resource-loader-core.js.map +1 -1
  204. package/dist/core/resource-loader-extensions.d.ts.map +1 -1
  205. package/dist/core/resource-loader-extensions.js +5 -2
  206. package/dist/core/resource-loader-extensions.js.map +1 -1
  207. package/dist/core/resource-loader-helpers.d.ts.map +1 -1
  208. package/dist/core/resource-loader-helpers.js +1 -0
  209. package/dist/core/resource-loader-helpers.js.map +1 -1
  210. package/dist/core/resource-loader-internals.d.ts +2 -2
  211. package/dist/core/resource-loader-internals.d.ts.map +1 -1
  212. package/dist/core/resource-loader-internals.js.map +1 -1
  213. package/dist/core/resource-loader-types.d.ts +3 -3
  214. package/dist/core/resource-loader-types.d.ts.map +1 -1
  215. package/dist/core/resource-loader-types.js.map +1 -1
  216. package/dist/core/sdk-exports.d.ts +1 -1
  217. package/dist/core/sdk-exports.d.ts.map +1 -1
  218. package/dist/core/sdk-exports.js.map +1 -1
  219. package/dist/core/sdk-types.d.ts +3 -0
  220. package/dist/core/sdk-types.d.ts.map +1 -1
  221. package/dist/core/sdk-types.js.map +1 -1
  222. package/dist/core/sdk.js +6 -2
  223. package/dist/core/sdk.js.map +1 -1
  224. package/dist/core/session-manager-core.d.ts +1 -1
  225. package/dist/core/session-manager-core.d.ts.map +1 -1
  226. package/dist/core/session-manager-core.js +2 -2
  227. package/dist/core/session-manager-core.js.map +1 -1
  228. package/dist/core/session-manager-entries.d.ts +2 -2
  229. package/dist/core/session-manager-entries.d.ts.map +1 -1
  230. package/dist/core/session-manager-entries.js +2 -1
  231. package/dist/core/session-manager-entries.js.map +1 -1
  232. package/dist/core/session-manager-history.d.ts +5 -0
  233. package/dist/core/session-manager-history.d.ts.map +1 -1
  234. package/dist/core/session-manager-history.js +33 -0
  235. package/dist/core/session-manager-history.js.map +1 -1
  236. package/dist/core/session-manager-types.d.ts +4 -2
  237. package/dist/core/session-manager-types.d.ts.map +1 -1
  238. package/dist/core/session-manager-types.js.map +1 -1
  239. package/dist/core/session-manager.d.ts +1 -1
  240. package/dist/core/session-manager.d.ts.map +1 -1
  241. package/dist/core/session-manager.js +1 -1
  242. package/dist/core/session-manager.js.map +1 -1
  243. package/dist/core/settings-manager-basic-accessors.d.ts +7 -0
  244. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  245. package/dist/core/settings-manager-basic-accessors.js +35 -0
  246. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  247. package/dist/core/settings-manager-resource-accessors.d.ts +3 -0
  248. package/dist/core/settings-manager-resource-accessors.d.ts.map +1 -1
  249. package/dist/core/settings-manager-resource-accessors.js +16 -0
  250. package/dist/core/settings-manager-resource-accessors.js.map +1 -1
  251. package/dist/core/settings-types.d.ts +8 -2
  252. package/dist/core/settings-types.d.ts.map +1 -1
  253. package/dist/core/settings-types.js.map +1 -1
  254. package/dist/core/slash-commands.d.ts +1 -0
  255. package/dist/core/slash-commands.d.ts.map +1 -1
  256. package/dist/core/slash-commands.js +1 -1
  257. package/dist/core/slash-commands.js.map +1 -1
  258. package/dist/core/usage-totals.d.ts +18 -0
  259. package/dist/core/usage-totals.d.ts.map +1 -0
  260. package/dist/core/usage-totals.js +40 -0
  261. package/dist/core/usage-totals.js.map +1 -0
  262. package/dist/extensions/index.d.ts +3 -0
  263. package/dist/extensions/index.d.ts.map +1 -0
  264. package/dist/extensions/index.js +5 -0
  265. package/dist/extensions/index.js.map +1 -0
  266. package/dist/extensions/llama/client.d.ts +61 -0
  267. package/dist/extensions/llama/client.d.ts.map +1 -0
  268. package/dist/extensions/llama/client.js +300 -0
  269. package/dist/extensions/llama/client.js.map +1 -0
  270. package/dist/extensions/llama/huggingface-ui.d.ts +33 -0
  271. package/dist/extensions/llama/huggingface-ui.d.ts.map +1 -0
  272. package/dist/extensions/llama/huggingface-ui.js +166 -0
  273. package/dist/extensions/llama/huggingface-ui.js.map +1 -0
  274. package/dist/extensions/llama/huggingface.d.ts +23 -0
  275. package/dist/extensions/llama/huggingface.d.ts.map +1 -0
  276. package/dist/extensions/llama/huggingface.js +139 -0
  277. package/dist/extensions/llama/huggingface.js.map +1 -0
  278. package/dist/extensions/llama/index.d.ts +3 -0
  279. package/dist/extensions/llama/index.d.ts.map +1 -0
  280. package/dist/extensions/llama/index.js +208 -0
  281. package/dist/extensions/llama/index.js.map +1 -0
  282. package/dist/extensions/llama/provider.d.ts +11 -0
  283. package/dist/extensions/llama/provider.d.ts.map +1 -0
  284. package/dist/extensions/llama/provider.js +93 -0
  285. package/dist/extensions/llama/provider.js.map +1 -0
  286. package/dist/extensions/llama/ui.d.ts +42 -0
  287. package/dist/extensions/llama/ui.d.ts.map +1 -0
  288. package/dist/extensions/llama/ui.js +237 -0
  289. package/dist/extensions/llama/ui.js.map +1 -0
  290. package/dist/index-extensions.d.ts +1 -1
  291. package/dist/index-extensions.d.ts.map +1 -1
  292. package/dist/index-extensions.js.map +1 -1
  293. package/dist/index.d.ts +4 -3
  294. package/dist/index.d.ts.map +1 -1
  295. package/dist/index.js +4 -3
  296. package/dist/index.js.map +1 -1
  297. package/dist/main-first-time-setup.d.ts +6 -0
  298. package/dist/main-first-time-setup.d.ts.map +1 -0
  299. package/dist/main-first-time-setup.js +10 -0
  300. package/dist/main-first-time-setup.js.map +1 -0
  301. package/dist/main-types.d.ts +2 -2
  302. package/dist/main-types.d.ts.map +1 -1
  303. package/dist/main-types.js.map +1 -1
  304. package/dist/main.d.ts.map +1 -1
  305. package/dist/main.js +17 -7
  306. package/dist/main.js.map +1 -1
  307. package/dist/modes/interactive/chat-input-actions.d.ts.map +1 -1
  308. package/dist/modes/interactive/chat-input-actions.js +14 -2
  309. package/dist/modes/interactive/chat-input-actions.js.map +1 -1
  310. package/dist/modes/interactive/components/chat-session-host-rendering.d.ts.map +1 -1
  311. package/dist/modes/interactive/components/chat-session-host-rendering.js +5 -1
  312. package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
  313. package/dist/modes/interactive/components/config-selector-list.d.ts +6 -6
  314. package/dist/modes/interactive/components/config-selector-list.d.ts.map +1 -1
  315. package/dist/modes/interactive/components/config-selector-list.js +64 -125
  316. package/dist/modes/interactive/components/config-selector-list.js.map +1 -1
  317. package/dist/modes/interactive/components/config-selector-project-scope.d.ts +4 -0
  318. package/dist/modes/interactive/components/config-selector-project-scope.d.ts.map +1 -0
  319. package/dist/modes/interactive/components/config-selector-project-scope.js +61 -0
  320. package/dist/modes/interactive/components/config-selector-project-scope.js.map +1 -0
  321. package/dist/modes/interactive/components/config-selector.d.ts +8 -5
  322. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  323. package/dist/modes/interactive/components/config-selector.js +46 -22
  324. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  325. package/dist/modes/interactive/components/custom-entry.d.ts +16 -0
  326. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -0
  327. package/dist/modes/interactive/components/custom-entry.js +45 -0
  328. package/dist/modes/interactive/components/custom-entry.js.map +1 -0
  329. package/dist/modes/interactive/components/first-time-setup.d.ts +24 -0
  330. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -0
  331. package/dist/modes/interactive/components/first-time-setup.js +69 -0
  332. package/dist/modes/interactive/components/first-time-setup.js.map +1 -0
  333. package/dist/modes/interactive/components/footer.d.ts +7 -1
  334. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  335. package/dist/modes/interactive/components/footer.js +55 -27
  336. package/dist/modes/interactive/components/footer.js.map +1 -1
  337. package/dist/modes/interactive/components/host-input-form.d.ts +2 -0
  338. package/dist/modes/interactive/components/host-input-form.d.ts.map +1 -1
  339. package/dist/modes/interactive/components/host-input-form.js +6 -3
  340. package/dist/modes/interactive/components/host-input-form.js.map +1 -1
  341. package/dist/modes/interactive/components/idle-status.d.ts +8 -0
  342. package/dist/modes/interactive/components/idle-status.d.ts.map +1 -0
  343. package/dist/modes/interactive/components/idle-status.js +13 -0
  344. package/dist/modes/interactive/components/idle-status.js.map +1 -0
  345. package/dist/modes/interactive/components/index.d.ts +3 -0
  346. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  347. package/dist/modes/interactive/components/index.js +3 -0
  348. package/dist/modes/interactive/components/index.js.map +1 -1
  349. package/dist/modes/interactive/components/login-dialog.d.ts +5 -5
  350. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  351. package/dist/modes/interactive/components/login-dialog.js +14 -6
  352. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  353. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
  354. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  355. package/dist/modes/interactive/components/oauth-selector.js +10 -6
  356. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  357. package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -1
  358. package/dist/modes/interactive/components/settings-selector-handlers.js +6 -0
  359. package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -1
  360. package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
  361. package/dist/modes/interactive/components/settings-selector-items.js +14 -0
  362. package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
  363. package/dist/modes/interactive/components/settings-selector-types.d.ts +4 -0
  364. package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
  365. package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
  366. package/dist/modes/interactive/interactive-agent-events.js +21 -0
  367. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  368. package/dist/modes/interactive/interactive-auth-login.js +17 -8
  369. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  370. package/dist/modes/interactive/interactive-auth-routing.d.ts +2 -0
  371. package/dist/modes/interactive/interactive-auth-routing.d.ts.map +1 -1
  372. package/dist/modes/interactive/interactive-auth-routing.js +88 -40
  373. package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
  374. package/dist/modes/interactive/interactive-autocomplete.js +6 -0
  375. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  376. package/dist/modes/interactive/interactive-extension-runtime.js +4 -0
  377. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
  378. package/dist/modes/interactive/interactive-global-clear.d.ts +10 -2
  379. package/dist/modes/interactive/interactive-global-clear.d.ts.map +1 -1
  380. package/dist/modes/interactive/interactive-global-clear.js +3 -1
  381. package/dist/modes/interactive/interactive-global-clear.js.map +1 -1
  382. package/dist/modes/interactive/interactive-input-handling.js +6 -4
  383. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  384. package/dist/modes/interactive/interactive-mode-helpers.d.ts +2 -1
  385. package/dist/modes/interactive/interactive-mode-helpers.d.ts.map +1 -1
  386. package/dist/modes/interactive/interactive-mode-helpers.js +6 -10
  387. package/dist/modes/interactive/interactive-mode-helpers.js.map +1 -1
  388. package/dist/modes/interactive/interactive-mode-surface.d.ts +11 -2
  389. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  390. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  391. package/dist/modes/interactive/interactive-render-chat.js +69 -12
  392. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  393. package/dist/modes/interactive/interactive-resource-rendering.js +1 -1
  394. package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -1
  395. package/dist/modes/interactive/interactive-selectors.js +10 -0
  396. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  397. package/dist/modes/interactive/interactive-session-routing.js +3 -0
  398. package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
  399. package/dist/modes/interactive/interactive-slash-commands.js +14 -0
  400. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  401. package/dist/modes/interactive/login-provider-options.d.ts +21 -0
  402. package/dist/modes/interactive/login-provider-options.d.ts.map +1 -0
  403. package/dist/modes/interactive/login-provider-options.js +51 -0
  404. package/dist/modes/interactive/login-provider-options.js.map +1 -0
  405. package/dist/modes/interactive-engine/engine-input-form.d.ts +1 -1
  406. package/dist/modes/interactive-engine/engine-input-form.d.ts.map +1 -1
  407. package/dist/modes/interactive-engine/engine-input-form.js +10 -2
  408. package/dist/modes/interactive-engine/engine-input-form.js.map +1 -1
  409. package/dist/modes/interactive-engine/engine-monitor.d.ts +8 -1
  410. package/dist/modes/interactive-engine/engine-monitor.d.ts.map +1 -1
  411. package/dist/modes/interactive-engine/engine-monitor.js +13 -15
  412. package/dist/modes/interactive-engine/engine-monitor.js.map +1 -1
  413. package/dist/modes/interactive-engine/input-form-host.d.ts.map +1 -1
  414. package/dist/modes/interactive-engine/input-form-host.js +7 -2
  415. package/dist/modes/interactive-engine/input-form-host.js.map +1 -1
  416. package/dist/modes/interactive-engine/isolated-runtime.js +1 -1
  417. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  418. package/dist/modes/interactive-engine/protocol.d.ts +5 -0
  419. package/dist/modes/interactive-engine/protocol.d.ts.map +1 -1
  420. package/dist/modes/interactive-engine/protocol.js +9 -1
  421. package/dist/modes/interactive-engine/protocol.js.map +1 -1
  422. package/dist/modes/interactive-engine/remote-model-catalog.d.ts +2 -0
  423. package/dist/modes/interactive-engine/remote-model-catalog.d.ts.map +1 -1
  424. package/dist/modes/interactive-engine/remote-model-catalog.js +33 -0
  425. package/dist/modes/interactive-engine/remote-model-catalog.js.map +1 -1
  426. package/dist/modes/rpc/rpc-client-api.d.ts +3 -1
  427. package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -1
  428. package/dist/modes/rpc/rpc-client-api.js +15 -0
  429. package/dist/modes/rpc/rpc-client-api.js.map +1 -1
  430. package/dist/modes/rpc/rpc-client-process.d.ts.map +1 -1
  431. package/dist/modes/rpc/rpc-client-process.js +3 -0
  432. package/dist/modes/rpc/rpc-client-process.js.map +1 -1
  433. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  434. package/dist/modes/rpc/rpc-client.js +1 -0
  435. package/dist/modes/rpc/rpc-client.js.map +1 -1
  436. package/dist/modes/rpc/rpc-command-handler.d.ts +5 -1
  437. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  438. package/dist/modes/rpc/rpc-command-handler.js +62 -2
  439. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  440. package/dist/modes/rpc/rpc-extension-ui.d.ts +3 -1
  441. package/dist/modes/rpc/rpc-extension-ui.d.ts.map +1 -1
  442. package/dist/modes/rpc/rpc-extension-ui.js +7 -2
  443. package/dist/modes/rpc/rpc-extension-ui.js.map +1 -1
  444. package/dist/modes/rpc/rpc-input-scheduler.d.ts.map +1 -1
  445. package/dist/modes/rpc/rpc-input-scheduler.js +1 -0
  446. package/dist/modes/rpc/rpc-input-scheduler.js.map +1 -1
  447. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  448. package/dist/modes/rpc/rpc-mode.js +1 -0
  449. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  450. package/dist/modes/rpc/rpc-session-binding.d.ts +1 -0
  451. package/dist/modes/rpc/rpc-session-binding.d.ts.map +1 -1
  452. package/dist/modes/rpc/rpc-session-binding.js +66 -43
  453. package/dist/modes/rpc/rpc-session-binding.js.map +1 -1
  454. package/dist/modes/rpc/rpc-types.d.ts +31 -0
  455. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  456. package/dist/modes/rpc/rpc-types.js.map +1 -1
  457. package/dist/package-manager-cli.d.ts +3 -3
  458. package/dist/package-manager-cli.d.ts.map +1 -1
  459. package/dist/package-manager-cli.js +55 -51
  460. package/dist/package-manager-cli.js.map +1 -1
  461. package/dist/rpc-entry.js +6 -2
  462. package/dist/rpc-entry.js.map +1 -1
  463. package/dist/self-update-plan.d.ts +12 -0
  464. package/dist/self-update-plan.d.ts.map +1 -0
  465. package/dist/self-update-plan.js +42 -0
  466. package/dist/self-update-plan.js.map +1 -0
  467. package/dist/utils/clipboard-native.d.ts +1 -0
  468. package/dist/utils/clipboard-native.d.ts.map +1 -1
  469. package/dist/utils/clipboard-native.js.map +1 -1
  470. package/dist/utils/clipboard.d.ts +3 -0
  471. package/dist/utils/clipboard.d.ts.map +1 -1
  472. package/dist/utils/clipboard.js +10 -0
  473. package/dist/utils/clipboard.js.map +1 -1
  474. package/dist/utils/compile-cache.d.ts +8 -0
  475. package/dist/utils/compile-cache.d.ts.map +1 -0
  476. package/dist/utils/compile-cache.js +31 -0
  477. package/dist/utils/compile-cache.js.map +1 -0
  478. package/dist/utils/version-check.d.ts +1 -0
  479. package/dist/utils/version-check.d.ts.map +1 -1
  480. package/dist/utils/version-check.js +3 -3
  481. package/dist/utils/version-check.js.map +1 -1
  482. package/docs/docs.json +2 -1
  483. package/docs/extensions.md +56 -4
  484. package/docs/keybindings.md +3 -0
  485. package/docs/llama-cpp.md +70 -0
  486. package/docs/models.md +8 -3
  487. package/docs/packages.md +4 -2
  488. package/docs/providers.md +37 -3
  489. package/docs/sdk.md +18 -0
  490. package/docs/settings.md +19 -3
  491. package/docs/tui.md +2 -0
  492. package/docs/usage.md +7 -0
  493. package/docs/workflows.md +34 -11
  494. package/npm-shrinkwrap.json +23 -23
  495. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-command-handler.js","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-command-handler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { KeyId } from \"@earendil-works/pi-tui\";\nimport { runCallback } from \"../../core/callback-activity.ts\";\nimport { KeybindingsManager } from \"../../core/keybindings.ts\";\nimport type { AgentSession } from \"../../core/agent-session.ts\";\nimport type { AgentSessionRuntime } from \"../../core/agent-session-runtime.ts\";\nimport {\n\tcreateRpcErrorResponse,\n\tcreateRpcSuccessResponse,\n\tformatRpcErrorMessage,\n\tparseRpcContextWindow,\n\ttype RpcOutput,\n} from \"./rpc-responses.ts\";\nimport type { KeybindingsReloadCoordinator } from \"./rpc-keybindings-reload.ts\";\nimport type { RpcCommand, RpcResponse, RpcSessionState, RpcSlashCommand } from \"./rpc-types.ts\";\n\nexport type RpcCommandHandler = (command: RpcCommand) => Promise<RpcResponse | undefined>;\n\ninterface RpcCommandHandlerOptions {\n\truntimeHost: AgentSessionRuntime;\n\tgetSession: () => AgentSession;\n\trebindSession: () => Promise<void>;\n\toutput: RpcOutput;\n\tkeybindings?: KeybindingsManager;\n\treloadCoordinator?: KeybindingsReloadCoordinator<AgentSession>;\n}\n\nexport function createRpcCommandHandler({\n\truntimeHost,\n\tgetSession,\n\trebindSession,\n\toutput,\n\tkeybindings,\n\treloadCoordinator,\n}: RpcCommandHandlerOptions): RpcCommandHandler {\n\tlet fallbackShortcutKeybindings: KeybindingsManager | undefined;\n\tconst getShortcutBindings = () => {\n\t\tif (keybindings) return keybindings.getEffectiveConfig();\n\t\tif (fallbackShortcutKeybindings) fallbackShortcutKeybindings.reload();\n\t\telse fallbackShortcutKeybindings = KeybindingsManager.create(runtimeHost.services.agentDir);\n\t\treturn fallbackShortcutKeybindings.getEffectiveConfig();\n\t};\n\treturn async (command: RpcCommand): Promise<RpcResponse | undefined> => {\n\t\tconst id = command.id;\n\t\tconst session = getSession();\n\n\t\tswitch (command.type) {\n\t\t\tcase \"prompt\": {\n\t\t\t\tlet preflightSucceeded = false;\n\t\t\t\tvoid session\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\tpreflightResult: (didSucceed) => {\n\t\t\t\t\t\t\tif (didSucceed) {\n\t\t\t\t\t\t\t\tpreflightSucceeded = true;\n\t\t\t\t\t\t\t\toutput(createRpcSuccessResponse(id, \"prompt\"));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\t.catch((promptError: unknown) => {\n\t\t\t\t\t\tif (!preflightSucceeded) {\n\t\t\t\t\t\t\toutput(createRpcErrorResponse(id, \"prompt\", formatRpcErrorMessage(promptError)));\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\treturn undefined;\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 createRpcSuccessResponse(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 createRpcSuccessResponse(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 createRpcSuccessResponse(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 createRpcSuccessResponse(id, \"new_session\", result);\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 createRpcSuccessResponse(id, \"get_state\", state);\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((candidate) => candidate.provider === command.provider && candidate.id === command.modelId);\n\t\t\t\tif (!model) {\n\t\t\t\t\treturn createRpcErrorResponse(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 createRpcSuccessResponse(id, \"set_model\", session.model ?? model);\n\t\t\t}\n\n\t\t\tcase \"cycle_model\": {\n\t\t\t\tconst result = await session.cycleModel(command.direction);\n\t\t\t\treturn createRpcSuccessResponse(id, \"cycle_model\", result ?? null);\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 createRpcSuccessResponse(id, \"get_available_models\", { models, scopedModels: session.scopedModels });\n\t\t\t}\n\n\t\t\tcase \"logout_provider\": {\n\t\t\t\tconst result = await runtimeHost.logoutProvider(command.provider);\n\t\t\t\treturn createRpcSuccessResponse(id, \"logout_provider\", result);\n\t\t\t}\n\t\t\tcase \"refresh_models\": {\n\t\t\t\tsession.modelRegistry.authStorage.reload();\n\t\t\t\tconst result = await session.modelRegistry.refresh({\n\t\t\t\t\ttimeoutMs: command.timeoutMs,\n\t\t\t\t\tforce: command.force,\n\t\t\t\t\tallowNetwork: command.allowNetwork,\n\t\t\t\t});\n\t\t\t\treturn createRpcSuccessResponse(id, \"refresh_models\", {\n\t\t\t\t\taborted: result.aborted,\n\t\t\t\t\terrors: [...result.errors].map(([provider, error]) => ({ provider, message: error.message })),\n\t\t\t\t\tmodels: session.modelRegistry.getAvailable(),\n\t\t\t\t\tscopedModels: session.scopedModels,\n\t\t\t\t});\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 createRpcSuccessResponse(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\treturn createRpcSuccessResponse(id, \"cycle_thinking_level\", level ? { level } : null);\n\t\t\t}\n\n\t\t\tcase \"get_available_thinking_levels\": {\n\t\t\t\treturn createRpcSuccessResponse(id, \"get_available_thinking_levels\", {\n\t\t\t\t\tlevels: session.getAvailableThinkingLevels(),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tcase \"set_context_window\": {\n\t\t\t\tconst contextWindow = parseRpcContextWindow(command.contextWindow);\n\t\t\t\tsession.setContextWindow(contextWindow);\n\t\t\t\treturn createRpcSuccessResponse(id, \"set_context_window\");\n\t\t\t}\n\n\t\t\tcase \"get_available_context_windows\": {\n\t\t\t\treturn createRpcSuccessResponse(id, \"get_available_context_windows\", {\n\t\t\t\t\tcontextWindows: session.getAvailableContextWindows(),\n\t\t\t\t\tcurrentContextWindow: session.model?.contextWindow,\n\t\t\t\t\tsupportsSelection: session.supportsContextWindowSelection(),\n\t\t\t\t});\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 createRpcSuccessResponse(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 createRpcSuccessResponse(id, \"set_follow_up_mode\");\n\t\t\t}\n\n\t\t\tcase \"compact\": {\n\t\t\t\tconst result = await session.compact();\n\t\t\t\treturn createRpcSuccessResponse(id, \"compact\", result);\n\t\t\t}\n\n\n\t\t\tcase \"set_auto_compaction\": {\n\t\t\t\tsession.setAutoCompactionEnabled(command.enabled);\n\t\t\t\treturn createRpcSuccessResponse(id, \"set_auto_compaction\");\n\t\t\t}\n\n\t\t\tcase \"abort_compaction\": {\n\t\t\t\tsession.abortCompaction();\n\t\t\t\treturn createRpcSuccessResponse(id, \"abort_compaction\");\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 createRpcSuccessResponse(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 createRpcSuccessResponse(id, \"abort_retry\");\n\t\t\t}\n\n\t\t\tcase \"clear_queue\": {\n\t\t\t\treturn createRpcSuccessResponse(id, \"clear_queue\", session.clearQueue());\n\t\t\t}\n\n\t\t\tcase \"bash\": {\n\t\t\t\tconst result = await session.executeBash(command.command, undefined, {\n\t\t\t\t\texcludeFromContext: command.excludeFromContext,\n\t\t\t\t});\n\t\t\t\treturn createRpcSuccessResponse(id, \"bash\", result);\n\t\t\t}\n\n\t\t\tcase \"user_bash\": {\n\t\t\t\tconst intercepted = await session.extensionRunner.emitUserBash({\n\t\t\t\t\ttype: \"user_bash\",\n\t\t\t\t\tcommand: command.command,\n\t\t\t\t\texcludeFromContext: command.excludeFromContext === true,\n\t\t\t\t\tcwd: session.sessionManager.getCwd(),\n\t\t\t\t});\n\t\t\t\tif (intercepted?.result) {\n\t\t\t\t\tsession.recordBashResult(command.command, intercepted.result, { excludeFromContext: command.excludeFromContext });\n\t\t\t\t\treturn createRpcSuccessResponse(id, \"user_bash\", intercepted.result);\n\t\t\t\t}\n\t\t\t\tconst result = await session.executeBash(command.command, undefined, {\n\t\t\t\t\texcludeFromContext: command.excludeFromContext,\n\t\t\t\t\toperations: intercepted?.operations,\n\t\t\t\t});\n\t\t\t\treturn createRpcSuccessResponse(id, \"user_bash\", result);\n\t\t\t}\n\n\t\t\tcase \"abort_bash\": {\n\t\t\t\tsession.abortBash();\n\t\t\t\treturn createRpcSuccessResponse(id, \"abort_bash\");\n\t\t\t}\n\n\t\t\tcase \"get_session_stats\": {\n\t\t\t\treturn createRpcSuccessResponse(id, \"get_session_stats\", session.getSessionStats());\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 createRpcSuccessResponse(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 createRpcSuccessResponse(id, \"switch_session\", result);\n\t\t\t}\n\n\t\t\tcase \"import_session\": {\n\t\t\t\tconst result = await runtimeHost.importFromJsonl(command.inputPath, command.cwdOverride);\n\t\t\t\tif (!result.cancelled) await rebindSession();\n\t\t\t\treturn createRpcSuccessResponse(id, \"import_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 createRpcSuccessResponse(id, \"fork\", { text: result.selectedText, cancelled: result.cancelled });\n\t\t\t}\n\n\t\t\tcase \"clone\": {\n\t\t\t\tconst leafId = session.sessionManager.getLeafId();\n\t\t\t\tif (!leafId) {\n\t\t\t\t\treturn createRpcErrorResponse(id, \"clone\", \"Cannot clone session: no current entry selected\");\n\t\t\t\t}\n\t\t\t\tconst result = await runtimeHost.fork(leafId, { position: \"at\" });\n\t\t\t\tif (!result.cancelled) {\n\t\t\t\t\tawait rebindSession();\n\t\t\t\t}\n\t\t\t\treturn createRpcSuccessResponse(id, \"clone\", { 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 createRpcSuccessResponse(id, \"get_fork_messages\", { messages });\n\t\t\t}\n\n\t\t\tcase \"get_entries\": {\n\t\t\t\tconst sessionManager = session.sessionManager;\n\t\t\t\tlet entries = sessionManager.getEntries();\n\t\t\t\tif (command.since !== undefined) {\n\t\t\t\t\tconst sinceIndex = entries.findIndex((e) => e.id === command.since);\n\t\t\t\t\tif (sinceIndex === -1) {\n\t\t\t\t\t\treturn createRpcErrorResponse(id, \"get_entries\", `Entry not found: ${command.since}`);\n\t\t\t\t\t}\n\t\t\t\t\tentries = entries.slice(sinceIndex + 1);\n\t\t\t\t}\n\t\t\t\treturn createRpcSuccessResponse(id, \"get_entries\", { entries, leafId: sessionManager.getLeafId() });\n\t\t\t}\n\n\t\t\tcase \"get_tree\": {\n\t\t\t\tconst sessionManager = session.sessionManager;\n\t\t\t\treturn createRpcSuccessResponse(id, \"get_tree\", {\n\t\t\t\t\ttree: sessionManager.getTree(),\n\t\t\t\t\tleafId: sessionManager.getLeafId(),\n\t\t\t\t});\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 createRpcSuccessResponse(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 createRpcErrorResponse(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 createRpcSuccessResponse(id, \"set_session_name\");\n\t\t\t}\n\n\t\t\tcase \"navigate_tree\": {\n\t\t\t\tconst result = await session.navigateTree(command.targetId, command.options);\n\t\t\t\treturn createRpcSuccessResponse(id, \"navigate_tree\", {\n\t\t\t\t\tcancelled: result.cancelled,\n\t\t\t\t\teditorText: result.editorText,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tcase \"set_label\": {\n\t\t\t\tsession.sessionManager.appendLabelChange(command.entryId, command.label);\n\t\t\t\treturn createRpcSuccessResponse(id, \"set_label\");\n\t\t\t}\n\n\t\t\tcase \"reload\": {\n\t\t\t\tif (reloadCoordinator) await reloadCoordinator.reload(session);\n\t\t\t\telse await session.reload();\n\t\t\t\treturn createRpcSuccessResponse(id, \"reload\");\n\t\t\t}\n\n\t\t\tcase \"get_shortcuts\": {\n\t\t\t\tconst effectiveBindings = getShortcutBindings();\n\t\t\t\tconst shortcuts = session.extensionRunner.getShortcuts(effectiveBindings);\n\t\t\t\treturn createRpcSuccessResponse(id, \"get_shortcuts\", {\n\t\t\t\t\tshortcuts: [...shortcuts].map(([key, shortcut]) => ({ key, description: shortcut.description })),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tcase \"invoke_shortcut\": {\n\t\t\t\tconst shortcut = session.extensionRunner\n\t\t\t\t\t.getShortcuts(getShortcutBindings())\n\t\t\t\t\t.get(command.key as KeyId);\n\t\t\t\tif (!shortcut) return createRpcErrorResponse(id, \"invoke_shortcut\", `Shortcut not found: ${command.key}`);\n\t\t\t\tawait runCallback(\n\t\t\t\t\t{ kind: \"extension.hook\", name: `shortcut:${command.key}`, sourcePath: shortcut.extensionPath },\n\t\t\t\t\t() => shortcut.handler(session.extensionRunner.createContext()),\n\t\t\t\t);\n\t\t\t\treturn createRpcSuccessResponse(id, \"invoke_shortcut\");\n\t\t\t}\n\n\t\t\tcase \"get_messages\": {\n\t\t\t\treturn createRpcSuccessResponse(id, \"get_messages\", { messages: session.messages });\n\t\t\t}\n\n\t\t\tcase \"get_command_completions\": {\n\t\t\t\tconst registeredCommand = session.extensionRunner\n\t\t\t\t\t.getRegisteredCommands()\n\t\t\t\t\t.find((candidate) => candidate.invocationName === command.commandName);\n\t\t\t\tconst getArgumentCompletions = registeredCommand?.getArgumentCompletions;\n\t\t\t\tif (registeredCommand === undefined || getArgumentCompletions === undefined) {\n\t\t\t\t\treturn createRpcSuccessResponse(id, \"get_command_completions\", { completions: null });\n\t\t\t\t}\n\t\t\t\tconst completions = await runCallback(\n\t\t\t\t\t{ kind: \"extension.hook\", name: `command-completions:${command.commandName}`, sourcePath: registeredCommand.sourceInfo.path },\n\t\t\t\t\t() => getArgumentCompletions(command.argumentPrefix),\n\t\t\t\t);\n\t\t\t\treturn createRpcSuccessResponse(id, \"get_command_completions\", { completions });\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 registeredCommand of session.extensionRunner.getRegisteredCommands()) {\n\t\t\t\t\tcommands.push({\n\t\t\t\t\t\tname: registeredCommand.invocationName,\n\t\t\t\t\t\tdescription: registeredCommand.description,\n\t\t\t\t\t\t...(registeredCommand.getArgumentCompletions !== undefined ? { hasArgumentCompletions: true } : {}),\n\t\t\t\t\t\tsource: \"extension\",\n\t\t\t\t\t\tsourceInfo: registeredCommand.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 createRpcSuccessResponse(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 createRpcErrorResponse(id, unknownCommand.type, `Unknown command: ${unknownCommand.type}`);\n\t\t\t}\n\t\t}\n\t};\n}\n"]}
1
+ {"version":3,"file":"rpc-command-handler.js","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-command-handler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { KeyId } from \"@earendil-works/pi-tui\";\nimport { runCallback } from \"../../core/callback-activity.ts\";\nimport { KeybindingsManager } from \"../../core/keybindings.ts\";\nimport type { AgentSession } from \"../../core/agent-session.ts\";\nimport type { AgentSessionRuntime } from \"../../core/agent-session-runtime.ts\";\nimport {\n\tcreateRpcErrorResponse,\n\tcreateRpcSuccessResponse,\n\tformatRpcErrorMessage,\n\tparseRpcContextWindow,\n\ttype RpcOutput,\n} from \"./rpc-responses.ts\";\nimport type { KeybindingsReloadCoordinator } from \"./rpc-keybindings-reload.ts\";\nimport type { RpcCommand, RpcResponse, RpcSessionState, RpcSlashCommand } from \"./rpc-types.ts\";\n\nexport type RpcCommandHandler = (command: RpcCommand) => Promise<RpcResponse | undefined>;\n\ninterface ProviderLoginInput {\n\topen(\n\t\trequest: import(\"../../core/extensions/ui-types.ts\").HostInputFormRequest,\n\t\tsignal?: AbortSignal,\n\t): Promise<Record<string, string> | undefined>;\n}\n\ninterface RpcCommandHandlerOptions {\n\truntimeHost: AgentSessionRuntime;\n\tgetSession: () => AgentSession;\n\trebindSession: () => Promise<void>;\n\toutput: RpcOutput;\n\tkeybindings?: KeybindingsManager;\n\treloadCoordinator?: KeybindingsReloadCoordinator<AgentSession>;\n\tinputForm?: ProviderLoginInput;\n}\n\nexport function createRpcCommandHandler({\n\truntimeHost,\n\tgetSession,\n\trebindSession,\n\toutput,\n\tkeybindings,\n\treloadCoordinator,\n\tinputForm,\n}: RpcCommandHandlerOptions): RpcCommandHandler {\n\tlet fallbackShortcutKeybindings: KeybindingsManager | undefined;\n\tconst providerLoginControllers = new Map<string, AbortController>();\n\tconst getShortcutBindings = () => {\n\t\tif (keybindings) return keybindings.getEffectiveConfig();\n\t\tif (fallbackShortcutKeybindings) fallbackShortcutKeybindings.reload();\n\t\telse fallbackShortcutKeybindings = KeybindingsManager.create(runtimeHost.services.agentDir);\n\t\treturn fallbackShortcutKeybindings.getEffectiveConfig();\n\t};\n\treturn async (command: RpcCommand): Promise<RpcResponse | undefined> => {\n\t\tconst id = command.id;\n\t\tconst session = getSession();\n\n\t\tswitch (command.type) {\n\t\t\tcase \"prompt\": {\n\t\t\t\tlet preflightSucceeded = false;\n\t\t\t\tvoid session\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\tpreflightResult: (didSucceed) => {\n\t\t\t\t\t\t\tif (didSucceed) {\n\t\t\t\t\t\t\t\tpreflightSucceeded = true;\n\t\t\t\t\t\t\t\toutput(createRpcSuccessResponse(id, \"prompt\"));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\t.catch((promptError: unknown) => {\n\t\t\t\t\t\tif (!preflightSucceeded) {\n\t\t\t\t\t\t\toutput(createRpcErrorResponse(id, \"prompt\", formatRpcErrorMessage(promptError)));\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\treturn undefined;\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 createRpcSuccessResponse(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 createRpcSuccessResponse(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 createRpcSuccessResponse(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 createRpcSuccessResponse(id, \"new_session\", result);\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 createRpcSuccessResponse(id, \"get_state\", state);\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((candidate) => candidate.provider === command.provider && candidate.id === command.modelId);\n\t\t\t\tif (!model) {\n\t\t\t\t\treturn createRpcErrorResponse(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 createRpcSuccessResponse(id, \"set_model\", session.model ?? model);\n\t\t\t}\n\n\t\t\tcase \"cycle_model\": {\n\t\t\t\tconst result = await session.cycleModel(command.direction);\n\t\t\t\treturn createRpcSuccessResponse(id, \"cycle_model\", result ?? null);\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 createRpcSuccessResponse(id, \"get_available_models\", {\n\t\t\t\t\tmodels,\n\t\t\t\t\tscopedModels: session.scopedModels,\n\t\t\t\t\tcustomAuthProviders: session.modelRegistry.getCustomApiKeyAuthProviders(),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tcase \"login_provider\": {\n\t\t\t\tconst customAuth = session.modelRegistry.getCustomApiKeyAuth(command.provider);\n\t\t\t\tif (!customAuth) throw new Error(`Provider does not support custom API-key login: ${command.provider}`);\n\t\t\t\tif (!inputForm) throw new Error(\"Provider login requires an interactive input host\");\n\t\t\t\tif (providerLoginControllers.has(command.provider)) throw new Error(`Login already in progress: ${command.provider}`);\n\t\t\t\tconst controller = new AbortController();\n\t\t\t\tproviderLoginControllers.set(command.provider, controller);\n\t\t\t\ttry {\n\t\t\t\t\tconst credential = await customAuth.login({\n\t\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t\t\tprompt: async (prompt) => {\n\t\t\t\t\t\t\tconst values = await inputForm.open({\n\t\t\t\t\t\t\t\ttitle: prompt.message,\n\t\t\t\t\t\t\t\theading: \"PROVIDER LOGIN\",\n\t\t\t\t\t\t\t\tsubmitLabel: \"[ Submit ]\",\n\t\t\t\t\t\t\t\tfields: [{\n\t\t\t\t\t\t\t\t\tname: \"value\", type: \"string\", required: false, initialValue: \"\",\n\t\t\t\t\t\t\t\t\tplaceholder: prompt.placeholder,\n\t\t\t\t\t\t\t\t}],\n\t\t\t\t\t\t\t}, controller.signal);\n\t\t\t\t\t\t\tif (!values || controller.signal.aborted) throw new Error(\"Login cancelled\");\n\t\t\t\t\t\t\treturn values.value ?? \"\";\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\tif (controller.signal.aborted) return createRpcSuccessResponse(id, \"login_provider\", { provider: command.provider, cancelled: true });\n\t\t\t\t\tsession.modelRegistry.authStorage.set(command.provider, credential);\n\t\t\t\t\tawait session.modelRegistry.refresh();\n\t\t\t\t\treturn createRpcSuccessResponse(id, \"login_provider\", {\n\t\t\t\t\t\tprovider: command.provider, cancelled: false, credential,\n\t\t\t\t\t\tmodels: session.modelRegistry.getAvailable(),\n\t\t\t\t\t\tscopedModels: session.scopedModels,\n\t\t\t\t\t\tcustomAuthProviders: session.modelRegistry.getCustomApiKeyAuthProviders(),\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (controller.signal.aborted || (error instanceof Error && error.message === \"Login cancelled\")) {\n\t\t\t\t\t\treturn createRpcSuccessResponse(id, \"login_provider\", { provider: command.provider, cancelled: true });\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t} finally {\n\t\t\t\t\tif (providerLoginControllers.get(command.provider) === controller) providerLoginControllers.delete(command.provider);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcase \"cancel_login_provider\": {\n\t\t\t\tproviderLoginControllers.get(command.provider)?.abort();\n\t\t\t\treturn createRpcSuccessResponse(id, \"cancel_login_provider\");\n\t\t\t}\n\n\t\t\tcase \"logout_provider\": {\n\t\t\t\tconst result = await runtimeHost.logoutProvider(command.provider);\n\t\t\t\treturn createRpcSuccessResponse(id, \"logout_provider\", result);\n\t\t\t}\n\t\t\tcase \"refresh_models\": {\n\t\t\t\tsession.modelRegistry.authStorage.reload();\n\t\t\t\tconst result = await session.modelRegistry.refresh({\n\t\t\t\t\ttimeoutMs: command.timeoutMs,\n\t\t\t\t\tforce: command.force,\n\t\t\t\t\tallowNetwork: command.allowNetwork,\n\t\t\t\t});\n\t\t\t\treturn createRpcSuccessResponse(id, \"refresh_models\", {\n\t\t\t\t\taborted: result.aborted,\n\t\t\t\t\terrors: [...result.errors].map(([provider, error]) => ({ provider, message: error.message })),\n\t\t\t\t\tmodels: session.modelRegistry.getAvailable(),\n\t\t\t\t\tscopedModels: session.scopedModels,\n\t\t\t\t\tcustomAuthProviders: session.modelRegistry.getCustomApiKeyAuthProviders(),\n\t\t\t\t});\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 createRpcSuccessResponse(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\treturn createRpcSuccessResponse(id, \"cycle_thinking_level\", level ? { level } : null);\n\t\t\t}\n\n\t\t\tcase \"get_available_thinking_levels\": {\n\t\t\t\treturn createRpcSuccessResponse(id, \"get_available_thinking_levels\", {\n\t\t\t\t\tlevels: session.getAvailableThinkingLevels(),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tcase \"set_context_window\": {\n\t\t\t\tconst contextWindow = parseRpcContextWindow(command.contextWindow);\n\t\t\t\tsession.setContextWindow(contextWindow);\n\t\t\t\treturn createRpcSuccessResponse(id, \"set_context_window\");\n\t\t\t}\n\n\t\t\tcase \"get_available_context_windows\": {\n\t\t\t\treturn createRpcSuccessResponse(id, \"get_available_context_windows\", {\n\t\t\t\t\tcontextWindows: session.getAvailableContextWindows(),\n\t\t\t\t\tcurrentContextWindow: session.model?.contextWindow,\n\t\t\t\t\tsupportsSelection: session.supportsContextWindowSelection(),\n\t\t\t\t});\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 createRpcSuccessResponse(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 createRpcSuccessResponse(id, \"set_follow_up_mode\");\n\t\t\t}\n\n\t\t\tcase \"compact\": {\n\t\t\t\tconst result = await session.compact();\n\t\t\t\treturn createRpcSuccessResponse(id, \"compact\", result);\n\t\t\t}\n\n\n\t\t\tcase \"set_auto_compaction\": {\n\t\t\t\tsession.setAutoCompactionEnabled(command.enabled);\n\t\t\t\treturn createRpcSuccessResponse(id, \"set_auto_compaction\");\n\t\t\t}\n\n\t\t\tcase \"abort_compaction\": {\n\t\t\t\tsession.abortCompaction();\n\t\t\t\treturn createRpcSuccessResponse(id, \"abort_compaction\");\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 createRpcSuccessResponse(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 createRpcSuccessResponse(id, \"abort_retry\");\n\t\t\t}\n\n\t\t\tcase \"clear_queue\": {\n\t\t\t\treturn createRpcSuccessResponse(id, \"clear_queue\", session.clearQueue());\n\t\t\t}\n\n\t\t\tcase \"bash\": {\n\t\t\t\tconst result = await session.executeBash(command.command, undefined, {\n\t\t\t\t\texcludeFromContext: command.excludeFromContext,\n\t\t\t\t});\n\t\t\t\treturn createRpcSuccessResponse(id, \"bash\", result);\n\t\t\t}\n\n\t\t\tcase \"user_bash\": {\n\t\t\t\tconst intercepted = await session.extensionRunner.emitUserBash({\n\t\t\t\t\ttype: \"user_bash\",\n\t\t\t\t\tcommand: command.command,\n\t\t\t\t\texcludeFromContext: command.excludeFromContext === true,\n\t\t\t\t\tcwd: session.sessionManager.getCwd(),\n\t\t\t\t});\n\t\t\t\tif (intercepted?.result) {\n\t\t\t\t\tsession.recordBashResult(command.command, intercepted.result, { excludeFromContext: command.excludeFromContext });\n\t\t\t\t\treturn createRpcSuccessResponse(id, \"user_bash\", intercepted.result);\n\t\t\t\t}\n\t\t\t\tconst result = await session.executeBash(command.command, undefined, {\n\t\t\t\t\texcludeFromContext: command.excludeFromContext,\n\t\t\t\t\toperations: intercepted?.operations,\n\t\t\t\t});\n\t\t\t\treturn createRpcSuccessResponse(id, \"user_bash\", result);\n\t\t\t}\n\n\t\t\tcase \"abort_bash\": {\n\t\t\t\tsession.abortBash();\n\t\t\t\treturn createRpcSuccessResponse(id, \"abort_bash\");\n\t\t\t}\n\n\t\t\tcase \"get_session_stats\": {\n\t\t\t\treturn createRpcSuccessResponse(id, \"get_session_stats\", session.getSessionStats());\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 createRpcSuccessResponse(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 createRpcSuccessResponse(id, \"switch_session\", result);\n\t\t\t}\n\n\t\t\tcase \"import_session\": {\n\t\t\t\tconst result = await runtimeHost.importFromJsonl(command.inputPath, command.cwdOverride);\n\t\t\t\tif (!result.cancelled) await rebindSession();\n\t\t\t\treturn createRpcSuccessResponse(id, \"import_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 createRpcSuccessResponse(id, \"fork\", { text: result.selectedText, cancelled: result.cancelled });\n\t\t\t}\n\n\t\t\tcase \"clone\": {\n\t\t\t\tconst leafId = session.sessionManager.getLeafId();\n\t\t\t\tif (!leafId) {\n\t\t\t\t\treturn createRpcErrorResponse(id, \"clone\", \"Cannot clone session: no current entry selected\");\n\t\t\t\t}\n\t\t\t\tconst result = await runtimeHost.fork(leafId, { position: \"at\" });\n\t\t\t\tif (!result.cancelled) {\n\t\t\t\t\tawait rebindSession();\n\t\t\t\t}\n\t\t\t\treturn createRpcSuccessResponse(id, \"clone\", { 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 createRpcSuccessResponse(id, \"get_fork_messages\", { messages });\n\t\t\t}\n\n\t\t\tcase \"get_entries\": {\n\t\t\t\tconst sessionManager = session.sessionManager;\n\t\t\t\tlet entries = sessionManager.getEntries();\n\t\t\t\tif (command.since !== undefined) {\n\t\t\t\t\tconst sinceIndex = entries.findIndex((e) => e.id === command.since);\n\t\t\t\t\tif (sinceIndex === -1) {\n\t\t\t\t\t\treturn createRpcErrorResponse(id, \"get_entries\", `Entry not found: ${command.since}`);\n\t\t\t\t\t}\n\t\t\t\t\tentries = entries.slice(sinceIndex + 1);\n\t\t\t\t}\n\t\t\t\treturn createRpcSuccessResponse(id, \"get_entries\", { entries, leafId: sessionManager.getLeafId() });\n\t\t\t}\n\n\t\t\tcase \"get_tree\": {\n\t\t\t\tconst sessionManager = session.sessionManager;\n\t\t\t\treturn createRpcSuccessResponse(id, \"get_tree\", {\n\t\t\t\t\ttree: sessionManager.getTree(),\n\t\t\t\t\tleafId: sessionManager.getLeafId(),\n\t\t\t\t});\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 createRpcSuccessResponse(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 createRpcErrorResponse(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 createRpcSuccessResponse(id, \"set_session_name\");\n\t\t\t}\n\n\t\t\tcase \"navigate_tree\": {\n\t\t\t\tconst result = await session.navigateTree(command.targetId, command.options);\n\t\t\t\treturn createRpcSuccessResponse(id, \"navigate_tree\", {\n\t\t\t\t\tcancelled: result.cancelled,\n\t\t\t\t\teditorText: result.editorText,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tcase \"set_label\": {\n\t\t\t\tsession.sessionManager.appendLabelChange(command.entryId, command.label);\n\t\t\t\treturn createRpcSuccessResponse(id, \"set_label\");\n\t\t\t}\n\n\t\t\tcase \"reload\": {\n\t\t\t\tif (reloadCoordinator) await reloadCoordinator.reload(session);\n\t\t\t\telse await session.reload();\n\t\t\t\treturn createRpcSuccessResponse(id, \"reload\");\n\t\t\t}\n\n\t\t\tcase \"get_shortcuts\": {\n\t\t\t\tconst effectiveBindings = getShortcutBindings();\n\t\t\t\tconst shortcuts = session.extensionRunner.getShortcuts(effectiveBindings);\n\t\t\t\treturn createRpcSuccessResponse(id, \"get_shortcuts\", {\n\t\t\t\t\tshortcuts: [...shortcuts].map(([key, shortcut]) => ({ key, description: shortcut.description })),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tcase \"invoke_shortcut\": {\n\t\t\t\tconst shortcut = session.extensionRunner\n\t\t\t\t\t.getShortcuts(getShortcutBindings())\n\t\t\t\t\t.get(command.key as KeyId);\n\t\t\t\tif (!shortcut) return createRpcErrorResponse(id, \"invoke_shortcut\", `Shortcut not found: ${command.key}`);\n\t\t\t\tawait runCallback(\n\t\t\t\t\t{ kind: \"extension.hook\", name: `shortcut:${command.key}`, sourcePath: shortcut.extensionPath },\n\t\t\t\t\t() => shortcut.handler(session.extensionRunner.createContext()),\n\t\t\t\t);\n\t\t\t\treturn createRpcSuccessResponse(id, \"invoke_shortcut\");\n\t\t\t}\n\n\t\t\tcase \"get_messages\": {\n\t\t\t\treturn createRpcSuccessResponse(id, \"get_messages\", { messages: session.messages });\n\t\t\t}\n\n\t\t\tcase \"get_command_completions\": {\n\t\t\t\tconst registeredCommand = session.extensionRunner\n\t\t\t\t\t.getRegisteredCommands()\n\t\t\t\t\t.find((candidate) => candidate.invocationName === command.commandName);\n\t\t\t\tconst getArgumentCompletions = registeredCommand?.getArgumentCompletions;\n\t\t\t\tif (registeredCommand === undefined || getArgumentCompletions === undefined) {\n\t\t\t\t\treturn createRpcSuccessResponse(id, \"get_command_completions\", { completions: null });\n\t\t\t\t}\n\t\t\t\tconst completions = await runCallback(\n\t\t\t\t\t{ kind: \"extension.hook\", name: `command-completions:${command.commandName}`, sourcePath: registeredCommand.sourceInfo.path },\n\t\t\t\t\t() => getArgumentCompletions(command.argumentPrefix),\n\t\t\t\t);\n\t\t\t\treturn createRpcSuccessResponse(id, \"get_command_completions\", { completions });\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 registeredCommand of session.extensionRunner.getRegisteredCommands()) {\n\t\t\t\t\tcommands.push({\n\t\t\t\t\t\tname: registeredCommand.invocationName,\n\t\t\t\t\t\tdescription: registeredCommand.description,\n\t\t\t\t\t\t...(registeredCommand.getArgumentCompletions !== undefined ? { hasArgumentCompletions: true } : {}),\n\t\t\t\t\t\tsource: \"extension\",\n\t\t\t\t\t\tsourceInfo: registeredCommand.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 createRpcSuccessResponse(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 createRpcErrorResponse(id, unknownCommand.type, `Unknown command: ${unknownCommand.type}`);\n\t\t\t}\n\t\t}\n\t};\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import type { ExtensionUIContext } from "../../core/extensions/index.ts";
2
+ import type { FooterDataProvider } from "../../core/footer-data-provider.ts";
2
3
  import type { EngineCustomUiService } from "../interactive-engine/engine-custom-ui.ts";
3
4
  import type { EngineInputFormService } from "../interactive-engine/engine-input-form.ts";
4
5
  import type { EngineSessionPickerService } from "../interactive-engine/engine-session-picker.ts";
@@ -15,7 +16,8 @@ interface CreateRpcExtensionUIContextOptions {
15
16
  customUi?: EngineCustomUiService;
16
17
  sessionPicker?: EngineSessionPickerService;
17
18
  inputForm?: EngineInputFormService;
19
+ footerDataProvider?: FooterDataProvider;
18
20
  }
19
- export declare function createRpcExtensionUIContext({ output, pendingExtensionRequests, customUi, sessionPicker, inputForm, }: CreateRpcExtensionUIContextOptions): ExtensionUIContext;
21
+ export declare function createRpcExtensionUIContext({ output, pendingExtensionRequests, customUi, sessionPicker, inputForm, footerDataProvider, }: CreateRpcExtensionUIContextOptions): ExtensionUIContext;
20
22
  export {};
21
23
  //# sourceMappingURL=rpc-extension-ui.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-extension-ui.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-extension-ui.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,kBAAkB,EAMlB,MAAM,gCAAgC,CAAC;AAExC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AACvF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AACzF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gDAAgD,CAAC;AACjG,OAAO,KAAK,EAAyB,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,0BAA0B;IAC1C,OAAO,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC;IACjD,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC/B;AAED,MAAM,MAAM,2BAA2B,GAAG,GAAG,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;AAElF,UAAU,kCAAkC;IAC3C,MAAM,EAAE,SAAS,CAAC;IAClB,wBAAwB,EAAE,2BAA2B,CAAC;IACtD,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,aAAa,CAAC,EAAE,0BAA0B,CAAC;IAC3C,SAAS,CAAC,EAAE,sBAAsB,CAAC;CACnC;AAyDD,wBAAgB,2BAA2B,CAAC,EAC3C,MAAM,EACN,wBAAwB,EACxB,QAAQ,EACR,aAAa,EACb,SAAS,GACT,EAAE,kCAAkC,GAAG,kBAAkB,CAqNzD"}
1
+ {"version":3,"file":"rpc-extension-ui.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-extension-ui.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,kBAAkB,EAMlB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AACvF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AACzF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gDAAgD,CAAC;AACjG,OAAO,KAAK,EAAyB,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,0BAA0B;IAC1C,OAAO,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC;IACjD,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC/B;AAED,MAAM,MAAM,2BAA2B,GAAG,GAAG,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;AAElF,UAAU,kCAAkC;IAC3C,MAAM,EAAE,SAAS,CAAC;IAClB,wBAAwB,EAAE,2BAA2B,CAAC;IACtD,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,aAAa,CAAC,EAAE,0BAA0B,CAAC;IAC3C,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;CACxC;AAyDD,wBAAgB,2BAA2B,CAAC,EAC3C,MAAM,EACN,wBAAwB,EACxB,QAAQ,EACR,aAAa,EACb,SAAS,EACT,kBAAkB,GAClB,EAAE,kCAAkC,GAAG,kBAAkB,CA0NzD"}
@@ -36,7 +36,7 @@ function createDialogPromise({ output, pendingExtensionRequests, dialogOptions,
36
36
  function emitExtensionUIRequest(output, request) {
37
37
  output({ type: "extension_ui_request", id: crypto.randomUUID(), ...request });
38
38
  }
39
- export function createRpcExtensionUIContext({ output, pendingExtensionRequests, customUi, sessionPicker, inputForm, }) {
39
+ export function createRpcExtensionUIContext({ output, pendingExtensionRequests, customUi, sessionPicker, inputForm, footerDataProvider, }) {
40
40
  const unsupportedWarnings = new Set();
41
41
  let toolsExpanded = false;
42
42
  const warnUnsupported = (method) => {
@@ -89,6 +89,11 @@ export function createRpcExtensionUIContext({ output, pendingExtensionRequests,
89
89
  return () => { };
90
90
  },
91
91
  setStatus(key, text) {
92
+ footerDataProvider?.setExtensionStatus(key, text);
93
+ // Isolated custom UI components (e.g. an attached stage-chat footer)
94
+ // re-render only after an engine_custom_invalidate; without this the
95
+ // mirrored status text goes stale until an unrelated repaint occurs.
96
+ customUi?.requestRender();
92
97
  emitExtensionUIRequest(output, { method: "setStatus", statusKey: key, statusText: text });
93
98
  },
94
99
  setWorkingMessage(_message) {
@@ -175,7 +180,7 @@ export function createRpcExtensionUIContext({ output, pendingExtensionRequests,
175
180
  return undefined;
176
181
  },
177
182
  getFooterDataProvider() {
178
- return {
183
+ return footerDataProvider ?? {
179
184
  getGitBranch: () => null,
180
185
  getExtensionStatuses: () => new Map(),
181
186
  getAvailableProviderCount: () => 1,
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-extension-ui.js","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-extension-ui.ts"],"names":[],"mappings":"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","sourcesContent":["import * as crypto from \"node:crypto\";\nimport type { Component, TUI } from \"@earendil-works/pi-tui\";\nimport type {\n\tExtensionUIContext,\n\tExtensionUIDialogOptions,\n\tExtensionWidgetOptions,\n\tHostInputFormRequest,\n\tHostSessionPickerRequest,\n\tWorkingIndicatorOptions,\n} from \"../../core/extensions/index.ts\";\nimport { type Theme, theme } from \"../interactive/theme/theme.ts\";\nimport type { EngineCustomUiService } from \"../interactive-engine/engine-custom-ui.ts\";\nimport type { EngineInputFormService } from \"../interactive-engine/engine-input-form.ts\";\nimport type { EngineSessionPickerService } from \"../interactive-engine/engine-session-picker.ts\";\nimport type { RpcExtensionUIRequest, RpcExtensionUIResponse } from \"./rpc-types.ts\";\nimport type { RpcOutput } from \"./rpc-responses.ts\";\n\nexport interface RpcPendingExtensionRequest {\n\tresolve: (value: RpcExtensionUIResponse) => void;\n\treject: (error: Error) => void;\n}\n\nexport type RpcPendingExtensionRequests = Map<string, RpcPendingExtensionRequest>;\n\ninterface CreateRpcExtensionUIContextOptions {\n\toutput: RpcOutput;\n\tpendingExtensionRequests: RpcPendingExtensionRequests;\n\tcustomUi?: EngineCustomUiService;\n\tsessionPicker?: EngineSessionPickerService;\n\tinputForm?: EngineInputFormService;\n}\n\ninterface DialogPromiseOptions<T> extends CreateRpcExtensionUIContextOptions {\n\tdialogOptions: ExtensionUIDialogOptions | undefined;\n\tdefaultValue: T;\n\trequest: Record<string, unknown>;\n\tparseResponse: (response: RpcExtensionUIResponse) => T;\n}\n\nfunction createDialogPromise<T>({\n\toutput,\n\tpendingExtensionRequests,\n\tdialogOptions,\n\tdefaultValue,\n\trequest,\n\tparseResponse,\n}: DialogPromiseOptions<T>): Promise<T> {\n\tif (dialogOptions?.signal?.aborted) return Promise.resolve(defaultValue);\n\n\tconst id = crypto.randomUUID();\n\treturn new Promise((resolve, reject) => {\n\t\tlet timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n\t\tconst cleanup = () => {\n\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\tdialogOptions?.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\tpendingExtensionRequests.delete(id);\n\t\t};\n\n\t\tconst onAbort = () => {\n\t\t\tcleanup();\n\t\t\tresolve(defaultValue);\n\t\t};\n\t\tdialogOptions?.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\tif (dialogOptions?.timeout) {\n\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve(defaultValue);\n\t\t\t}, dialogOptions.timeout);\n\t\t}\n\n\t\tpendingExtensionRequests.set(id, {\n\t\t\tresolve: (response: RpcExtensionUIResponse) => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve(parseResponse(response));\n\t\t\t},\n\t\t\treject,\n\t\t});\n\t\toutput({ type: \"extension_ui_request\", id, ...request } as RpcExtensionUIRequest);\n\t});\n}\n\nfunction emitExtensionUIRequest(output: RpcOutput, request: Record<string, unknown>): void {\n\toutput({ type: \"extension_ui_request\", id: crypto.randomUUID(), ...request } as RpcExtensionUIRequest);\n}\n\nexport function createRpcExtensionUIContext({\n\toutput,\n\tpendingExtensionRequests,\n\tcustomUi,\n\tsessionPicker,\n\tinputForm,\n}: CreateRpcExtensionUIContextOptions): ExtensionUIContext {\n\tconst unsupportedWarnings = new Set<string>();\n\tlet toolsExpanded = false;\n\tconst warnUnsupported = (method: string): void => {\n\t\tif (!customUi || unsupportedWarnings.has(method)) return;\n\t\tunsupportedWarnings.add(method);\n\t\temitExtensionUIRequest(output, {\n\t\t\tmethod: \"notify\",\n\t\t\tmessage: `${method} is unavailable in isolated interactive mode because it requires a synchronous host callback`,\n\t\t\tnotifyType: \"warning\",\n\t\t});\n\t};\n\treturn {\n\t\tselect: (title, options, opts) =>\n\t\t\tcreateDialogPromise({\n\t\t\t\toutput,\n\t\t\t\tpendingExtensionRequests,\n\t\t\t\tdialogOptions: opts,\n\t\t\t\tdefaultValue: undefined,\n\t\t\t\trequest: { method: \"select\", title, options, timeout: opts?.timeout },\n\t\t\t\tparseResponse: (response) =>\n\t\t\t\t\t\"cancelled\" in response && response.cancelled ? undefined : \"value\" in response ? response.value : undefined,\n\t\t\t}),\n\n\t\tconfirm: (title, message, opts) =>\n\t\t\tcreateDialogPromise({\n\t\t\t\toutput,\n\t\t\t\tpendingExtensionRequests,\n\t\t\t\tdialogOptions: opts,\n\t\t\t\tdefaultValue: false,\n\t\t\t\trequest: { method: \"confirm\", title, message, timeout: opts?.timeout },\n\t\t\t\tparseResponse: (response) =>\n\t\t\t\t\t\"cancelled\" in response && response.cancelled ? false : \"confirmed\" in response ? response.confirmed : false,\n\t\t\t}),\n\n\t\tinput: (title, placeholder, opts) =>\n\t\t\tcreateDialogPromise({\n\t\t\t\toutput,\n\t\t\t\tpendingExtensionRequests,\n\t\t\t\tdialogOptions: opts,\n\t\t\t\tdefaultValue: undefined,\n\t\t\t\trequest: { method: \"input\", title, placeholder, timeout: opts?.timeout },\n\t\t\t\tparseResponse: (response) =>\n\t\t\t\t\t\"cancelled\" in response && response.cancelled ? undefined : \"value\" in response ? response.value : undefined,\n\t\t\t}),\n\n\t\tnotify(message: string, type?: \"info\" | \"warning\" | \"error\"): void {\n\t\t\temitExtensionUIRequest(output, { method: \"notify\", message, notifyType: type });\n\t\t},\n\n\t\trequestRender(): void { customUi?.requestRender(); },\n\n\t\tgetHostCustomUiState: () => customUi?.getHostCustomUiState() ?? {\n\t\t\tblockingInlineCustomUiDepth: 0,\n\t\t\tblockingInlineCustomUiActive: false,\n\t\t},\n\t\tonHostCustomUiStateChange: (listener) => customUi?.onHostCustomUiStateChange(listener) ?? (() => {}),\n\t\tfocusHostInlineCustomUi: () => customUi?.focusHostInlineCustomUi() ?? false,\n\n\t\tonTerminalInput(): () => void {\n\t\t\twarnUnsupported(\"ctx.ui.onTerminalInput\");\n\t\t\treturn () => {};\n\t\t},\n\n\t\tsetStatus(key: string, text: string | undefined): void {\n\t\t\temitExtensionUIRequest(output, { method: \"setStatus\", statusKey: key, statusText: text });\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\tsetWorkingVisible(_visible: boolean): void {\n\t\t\t// Working visibility not supported in RPC mode - requires TUI loader access\n\t\t},\n\n\t\tsetWorkingIndicator(_options?: WorkingIndicatorOptions): void {\n\t\t\t// Working indicator customization 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\tif (content === undefined) {\n\t\t\t\tcustomUi?.setWidget(key, undefined, options?.placement);\n\t\t\t\temitExtensionUIRequest(output, {\n\t\t\t\t\tmethod: \"setWidget\", widgetKey: key, widgetLines: undefined, widgetPlacement: options?.placement,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (Array.isArray(content)) {\n\t\t\t\temitExtensionUIRequest(output, {\n\t\t\t\t\tmethod: \"setWidget\", widgetKey: key, widgetLines: content as string[], widgetPlacement: options?.placement,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (customUi && typeof content === \"function\") {\n\t\t\t\tcustomUi.setWidget(key, content as (tui: TUI, theme: Theme) => Component & { dispose?(): void }, options?.placement);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\twarnUnsupported(\"component-factory widgets\");\n\t\t},\n\n\t\tsetFooter(): void { warnUnsupported(\"ctx.ui.setFooter\"); },\n\n\t\tsetHeader(): void { warnUnsupported(\"ctx.ui.setHeader\"); },\n\n\t\tsetTitle(title: string): void {\n\t\t\temitExtensionUIRequest(output, { method: \"setTitle\", title });\n\t\t},\n\n\t\tcustom: (factory, options) => customUi\n\t\t\t? customUi.custom(factory, options)\n\t\t\t: Promise.resolve(undefined as never),\n\n\t\t// Exposed in the isolated engine child, where the terminal host mounts\n\t\t// the real session selector natively so picker navigation never crosses\n\t\t// the process boundary. Absent in plain headless RPC (no interactive\n\t\t// host); callers must fail with an actionable error, not degrade.\n\t\t...(sessionPicker ? { hostSessionPicker: (request: HostSessionPickerRequest) => sessionPicker.open(request) } : {}),\n\t\t...(inputForm ? { hostInputForm: (request: HostInputFormRequest) => inputForm.open(request) } : {}),\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\temitExtensionUIRequest(output, { method: \"set_editor_text\", text });\n\t\t},\n\n\t\tgetEditorText(): string {\n\t\t\twarnUnsupported(\"ctx.ui.getEditorText\");\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\taddAutocompleteProvider(): void { warnUnsupported(\"ctx.ui.addAutocompleteProvider\"); },\n\n\t\tsetEditorComponent(): void { warnUnsupported(\"ctx.ui.setEditorComponent\"); },\n\n\t\tgetEditorComponent() {\n\t\t\t// Custom editor components not supported in RPC mode\n\t\t\treturn undefined;\n\t\t},\n\n\t\tgetFooterDataProvider() {\n\t\t\treturn {\n\t\t\t\tgetGitBranch: () => null,\n\t\t\t\tgetExtensionStatuses: () => new Map(),\n\t\t\t\tgetAvailableProviderCount: () => 1,\n\t\t\t\tonBranchChange: () => () => {},\n\t\t\t};\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\treturn toolsExpanded;\n\t\t},\n\n\t\tsetToolsExpanded(expanded: boolean) {\n\t\t\ttoolsExpanded = expanded;\n\t\t\tcustomUi?.requestRender();\n\t\t},\n\n\t\tgetChatRenderSettings() {\n\t\t\treturn {\n\t\t\t\thideThinkingBlock: false,\n\t\t\t\thiddenThinkingLabel: \"Thinking...\",\n\t\t\t\ttoolOutputExpanded: toolsExpanded,\n\t\t\t\tshowImages: false,\n\t\t\t\timageWidthCells: 60,\n\t\t\t\tgetToolDefinition: () => undefined,\n\t\t\t\tgetCustomMessageRenderer: () => undefined,\n\t\t\t};\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"rpc-extension-ui.js","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-extension-ui.ts"],"names":[],"mappings":"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","sourcesContent":["import * as crypto from \"node:crypto\";\nimport type { Component, TUI } from \"@earendil-works/pi-tui\";\nimport type {\n\tExtensionUIContext,\n\tExtensionUIDialogOptions,\n\tExtensionWidgetOptions,\n\tHostInputFormRequest,\n\tHostSessionPickerRequest,\n\tWorkingIndicatorOptions,\n} from \"../../core/extensions/index.ts\";\nimport type { FooterDataProvider } from \"../../core/footer-data-provider.ts\";\nimport { type Theme, theme } from \"../interactive/theme/theme.ts\";\nimport type { EngineCustomUiService } from \"../interactive-engine/engine-custom-ui.ts\";\nimport type { EngineInputFormService } from \"../interactive-engine/engine-input-form.ts\";\nimport type { EngineSessionPickerService } from \"../interactive-engine/engine-session-picker.ts\";\nimport type { RpcExtensionUIRequest, RpcExtensionUIResponse } from \"./rpc-types.ts\";\nimport type { RpcOutput } from \"./rpc-responses.ts\";\n\nexport interface RpcPendingExtensionRequest {\n\tresolve: (value: RpcExtensionUIResponse) => void;\n\treject: (error: Error) => void;\n}\n\nexport type RpcPendingExtensionRequests = Map<string, RpcPendingExtensionRequest>;\n\ninterface CreateRpcExtensionUIContextOptions {\n\toutput: RpcOutput;\n\tpendingExtensionRequests: RpcPendingExtensionRequests;\n\tcustomUi?: EngineCustomUiService;\n\tsessionPicker?: EngineSessionPickerService;\n\tinputForm?: EngineInputFormService;\n\tfooterDataProvider?: FooterDataProvider;\n}\n\ninterface DialogPromiseOptions<T> extends CreateRpcExtensionUIContextOptions {\n\tdialogOptions: ExtensionUIDialogOptions | undefined;\n\tdefaultValue: T;\n\trequest: Record<string, unknown>;\n\tparseResponse: (response: RpcExtensionUIResponse) => T;\n}\n\nfunction createDialogPromise<T>({\n\toutput,\n\tpendingExtensionRequests,\n\tdialogOptions,\n\tdefaultValue,\n\trequest,\n\tparseResponse,\n}: DialogPromiseOptions<T>): Promise<T> {\n\tif (dialogOptions?.signal?.aborted) return Promise.resolve(defaultValue);\n\n\tconst id = crypto.randomUUID();\n\treturn new Promise((resolve, reject) => {\n\t\tlet timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n\t\tconst cleanup = () => {\n\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\tdialogOptions?.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\tpendingExtensionRequests.delete(id);\n\t\t};\n\n\t\tconst onAbort = () => {\n\t\t\tcleanup();\n\t\t\tresolve(defaultValue);\n\t\t};\n\t\tdialogOptions?.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\tif (dialogOptions?.timeout) {\n\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve(defaultValue);\n\t\t\t}, dialogOptions.timeout);\n\t\t}\n\n\t\tpendingExtensionRequests.set(id, {\n\t\t\tresolve: (response: RpcExtensionUIResponse) => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve(parseResponse(response));\n\t\t\t},\n\t\t\treject,\n\t\t});\n\t\toutput({ type: \"extension_ui_request\", id, ...request } as RpcExtensionUIRequest);\n\t});\n}\n\nfunction emitExtensionUIRequest(output: RpcOutput, request: Record<string, unknown>): void {\n\toutput({ type: \"extension_ui_request\", id: crypto.randomUUID(), ...request } as RpcExtensionUIRequest);\n}\n\nexport function createRpcExtensionUIContext({\n\toutput,\n\tpendingExtensionRequests,\n\tcustomUi,\n\tsessionPicker,\n\tinputForm,\n\tfooterDataProvider,\n}: CreateRpcExtensionUIContextOptions): ExtensionUIContext {\n\tconst unsupportedWarnings = new Set<string>();\n\tlet toolsExpanded = false;\n\tconst warnUnsupported = (method: string): void => {\n\t\tif (!customUi || unsupportedWarnings.has(method)) return;\n\t\tunsupportedWarnings.add(method);\n\t\temitExtensionUIRequest(output, {\n\t\t\tmethod: \"notify\",\n\t\t\tmessage: `${method} is unavailable in isolated interactive mode because it requires a synchronous host callback`,\n\t\t\tnotifyType: \"warning\",\n\t\t});\n\t};\n\treturn {\n\t\tselect: (title, options, opts) =>\n\t\t\tcreateDialogPromise({\n\t\t\t\toutput,\n\t\t\t\tpendingExtensionRequests,\n\t\t\t\tdialogOptions: opts,\n\t\t\t\tdefaultValue: undefined,\n\t\t\t\trequest: { method: \"select\", title, options, timeout: opts?.timeout },\n\t\t\t\tparseResponse: (response) =>\n\t\t\t\t\t\"cancelled\" in response && response.cancelled ? undefined : \"value\" in response ? response.value : undefined,\n\t\t\t}),\n\n\t\tconfirm: (title, message, opts) =>\n\t\t\tcreateDialogPromise({\n\t\t\t\toutput,\n\t\t\t\tpendingExtensionRequests,\n\t\t\t\tdialogOptions: opts,\n\t\t\t\tdefaultValue: false,\n\t\t\t\trequest: { method: \"confirm\", title, message, timeout: opts?.timeout },\n\t\t\t\tparseResponse: (response) =>\n\t\t\t\t\t\"cancelled\" in response && response.cancelled ? false : \"confirmed\" in response ? response.confirmed : false,\n\t\t\t}),\n\n\t\tinput: (title, placeholder, opts) =>\n\t\t\tcreateDialogPromise({\n\t\t\t\toutput,\n\t\t\t\tpendingExtensionRequests,\n\t\t\t\tdialogOptions: opts,\n\t\t\t\tdefaultValue: undefined,\n\t\t\t\trequest: { method: \"input\", title, placeholder, timeout: opts?.timeout },\n\t\t\t\tparseResponse: (response) =>\n\t\t\t\t\t\"cancelled\" in response && response.cancelled ? undefined : \"value\" in response ? response.value : undefined,\n\t\t\t}),\n\n\t\tnotify(message: string, type?: \"info\" | \"warning\" | \"error\"): void {\n\t\t\temitExtensionUIRequest(output, { method: \"notify\", message, notifyType: type });\n\t\t},\n\n\t\trequestRender(): void { customUi?.requestRender(); },\n\n\t\tgetHostCustomUiState: () => customUi?.getHostCustomUiState() ?? {\n\t\t\tblockingInlineCustomUiDepth: 0,\n\t\t\tblockingInlineCustomUiActive: false,\n\t\t},\n\t\tonHostCustomUiStateChange: (listener) => customUi?.onHostCustomUiStateChange(listener) ?? (() => {}),\n\t\tfocusHostInlineCustomUi: () => customUi?.focusHostInlineCustomUi() ?? false,\n\n\t\tonTerminalInput(): () => void {\n\t\t\twarnUnsupported(\"ctx.ui.onTerminalInput\");\n\t\t\treturn () => {};\n\t\t},\n\n\t\tsetStatus(key: string, text: string | undefined): void {\n\t\t\tfooterDataProvider?.setExtensionStatus(key, text);\n\t\t\t// Isolated custom UI components (e.g. an attached stage-chat footer)\n\t\t\t// re-render only after an engine_custom_invalidate; without this the\n\t\t\t// mirrored status text goes stale until an unrelated repaint occurs.\n\t\t\tcustomUi?.requestRender();\n\t\t\temitExtensionUIRequest(output, { method: \"setStatus\", statusKey: key, statusText: text });\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\tsetWorkingVisible(_visible: boolean): void {\n\t\t\t// Working visibility not supported in RPC mode - requires TUI loader access\n\t\t},\n\n\t\tsetWorkingIndicator(_options?: WorkingIndicatorOptions): void {\n\t\t\t// Working indicator customization 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\tif (content === undefined) {\n\t\t\t\tcustomUi?.setWidget(key, undefined, options?.placement);\n\t\t\t\temitExtensionUIRequest(output, {\n\t\t\t\t\tmethod: \"setWidget\", widgetKey: key, widgetLines: undefined, widgetPlacement: options?.placement,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (Array.isArray(content)) {\n\t\t\t\temitExtensionUIRequest(output, {\n\t\t\t\t\tmethod: \"setWidget\", widgetKey: key, widgetLines: content as string[], widgetPlacement: options?.placement,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (customUi && typeof content === \"function\") {\n\t\t\t\tcustomUi.setWidget(key, content as (tui: TUI, theme: Theme) => Component & { dispose?(): void }, options?.placement);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\twarnUnsupported(\"component-factory widgets\");\n\t\t},\n\n\t\tsetFooter(): void { warnUnsupported(\"ctx.ui.setFooter\"); },\n\n\t\tsetHeader(): void { warnUnsupported(\"ctx.ui.setHeader\"); },\n\n\t\tsetTitle(title: string): void {\n\t\t\temitExtensionUIRequest(output, { method: \"setTitle\", title });\n\t\t},\n\n\t\tcustom: (factory, options) => customUi\n\t\t\t? customUi.custom(factory, options)\n\t\t\t: Promise.resolve(undefined as never),\n\n\t\t// Exposed in the isolated engine child, where the terminal host mounts\n\t\t// the real session selector natively so picker navigation never crosses\n\t\t// the process boundary. Absent in plain headless RPC (no interactive\n\t\t// host); callers must fail with an actionable error, not degrade.\n\t\t...(sessionPicker ? { hostSessionPicker: (request: HostSessionPickerRequest) => sessionPicker.open(request) } : {}),\n\t\t...(inputForm ? { hostInputForm: (request: HostInputFormRequest) => inputForm.open(request) } : {}),\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\temitExtensionUIRequest(output, { method: \"set_editor_text\", text });\n\t\t},\n\n\t\tgetEditorText(): string {\n\t\t\twarnUnsupported(\"ctx.ui.getEditorText\");\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\taddAutocompleteProvider(): void { warnUnsupported(\"ctx.ui.addAutocompleteProvider\"); },\n\n\t\tsetEditorComponent(): void { warnUnsupported(\"ctx.ui.setEditorComponent\"); },\n\n\t\tgetEditorComponent() {\n\t\t\t// Custom editor components not supported in RPC mode\n\t\t\treturn undefined;\n\t\t},\n\n\t\tgetFooterDataProvider() {\n\t\t\treturn footerDataProvider ?? {\n\t\t\t\tgetGitBranch: () => null,\n\t\t\t\tgetExtensionStatuses: () => new Map(),\n\t\t\t\tgetAvailableProviderCount: () => 1,\n\t\t\t\tonBranchChange: () => () => {},\n\t\t\t};\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\treturn toolsExpanded;\n\t\t},\n\n\t\tsetToolsExpanded(expanded: boolean) {\n\t\t\ttoolsExpanded = expanded;\n\t\t\tcustomUi?.requestRender();\n\t\t},\n\n\t\tgetChatRenderSettings() {\n\t\t\treturn {\n\t\t\t\thideThinkingBlock: false,\n\t\t\t\thiddenThinkingLabel: \"Thinking...\",\n\t\t\t\ttoolOutputExpanded: toolsExpanded,\n\t\t\t\tshowImages: false,\n\t\t\t\timageWidthCells: 60,\n\t\t\t\tgetToolDefinition: () => undefined,\n\t\t\t\tgetCustomMessageRenderer: () => undefined,\n\t\t\t};\n\t\t},\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-input-scheduler.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-input-scheduler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAS7D,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,sBAAsB,CAIxF;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAWhE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CA8B3G"}
1
+ {"version":3,"file":"rpc-input-scheduler.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-input-scheduler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAU7D,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,sBAAsB,CAIxF;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAWhE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CA8B3G"}
@@ -1,6 +1,7 @@
1
1
  import { parseInteractiveEngineCommand } from "../interactive-engine/protocol.js";
2
2
  const INTERRUPT_COMMANDS = new Set([
3
3
  "abort",
4
+ "cancel_login_provider",
4
5
  "abort_compaction",
5
6
  "abort_retry",
6
7
  "abort_bash",
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-input-scheduler.js","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-input-scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AAGlF,MAAM,kBAAkB,GAAwB,IAAI,GAAG,CAAC;IACvD,OAAO;IACP,kBAAkB;IAClB,aAAa;IACb,YAAY;CACZ,CAAC,CAAC;AAEH,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACtD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QACjD,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,uBAAuB;QACzD,IAAI,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACtD,IAAI,6BAA6B,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACrD,IAAI,KAAoB,CAAC;IACzB,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA8C,CAAC;QAC7E,KAAK,GAAG,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;IACD,IAAI,wBAAwB,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,OAAO,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAClH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,UAA2C;IAClF,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,MAAM,MAAM,GAAG,CAAC,IAAY,EAAiB,EAAE;QAC9C,IAAI,CAAC;YACJ,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACF,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,GAAS,EAAE;QACpC,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxB,cAAc,GAAG,KAAK,CAAC;YACvB,OAAO;QACR,CAAC;QACD,cAAc,GAAG,IAAI,CAAC;QACtB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC;IAEF,OAAO,CAAC,IAAY,EAAQ,EAAE;QAC7B,IAAI,0BAA0B,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAClC,OAAO;QACR,CAAC;QACD,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,cAAc;YAAE,iBAAiB,EAAE,CAAC;IAC1C,CAAC,CAAC;AACH,CAAC","sourcesContent":["import { parseInteractiveEngineCommand } from \"../interactive-engine/protocol.ts\";\nimport type { RpcExtensionUIResponse } from \"./rpc-types.ts\";\n\nconst INTERRUPT_COMMANDS: ReadonlySet<string> = new Set([\n\t\"abort\",\n\t\"abort_compaction\",\n\t\"abort_retry\",\n\t\"abort_bash\",\n]);\n\nexport function isRpcExtensionUIResponse(value: unknown): value is RpcExtensionUIResponse {\n\treturn typeof value === \"object\" && value !== null &&\n\t\t\"type\" in value && value.type === \"extension_ui_response\" &&\n\t\t\"id\" in value && typeof value.id === \"string\";\n}\n\n/**\n * Control frames must remain reachable while an ordinary RPC command is\n * pending. Interrupts cancel that command, while host responses can unblock UI\n * work awaited by it. Everything else stays on the ordered command lane.\n */\nexport function isConcurrentRpcControlLine(line: string): boolean {\n\tif (parseInteractiveEngineCommand(line)) return true;\n\tlet value: object | null;\n\ttry {\n\t\tconst parsed = JSON.parse(line) as object | boolean | null | number | string;\n\t\tvalue = typeof parsed === \"object\" && !Array.isArray(parsed) ? parsed : null;\n\t} catch {\n\t\treturn false;\n\t}\n\tif (isRpcExtensionUIResponse(value)) return true;\n\treturn value !== null && \"type\" in value && typeof value.type === \"string\" && INTERRUPT_COMMANDS.has(value.type);\n}\n\n/**\n * Runs ordinary RPC input one frame at a time while giving validated control\n * frames an independent lane. The first ordinary frame starts synchronously,\n * so a following interrupt cannot overtake initialization of the operation it\n * is intended to cancel.\n */\nexport function createRpcInputScheduler(handleLine: (line: string) => Promise<void>): (line: string) => void {\n\tconst ordinaryQueue: string[] = [];\n\tlet ordinaryActive = false;\n\n\tconst invoke = (line: string): Promise<void> => {\n\t\ttry {\n\t\t\treturn handleLine(line);\n\t\t} catch (error) {\n\t\t\treturn Promise.reject(error);\n\t\t}\n\t};\n\n\tconst startNextOrdinary = (): void => {\n\t\tconst line = ordinaryQueue.shift();\n\t\tif (line === undefined) {\n\t\t\tordinaryActive = false;\n\t\t\treturn;\n\t\t}\n\t\tordinaryActive = true;\n\t\tvoid invoke(line).finally(startNextOrdinary).catch(() => {});\n\t};\n\n\treturn (line: string): void => {\n\t\tif (isConcurrentRpcControlLine(line)) {\n\t\t\tvoid invoke(line).catch(() => {});\n\t\t\treturn;\n\t\t}\n\t\tordinaryQueue.push(line);\n\t\tif (!ordinaryActive) startNextOrdinary();\n\t};\n}\n"]}
1
+ {"version":3,"file":"rpc-input-scheduler.js","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-input-scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AAGlF,MAAM,kBAAkB,GAAwB,IAAI,GAAG,CAAC;IACvD,OAAO;IACP,uBAAuB;IACvB,kBAAkB;IAClB,aAAa;IACb,YAAY;CACZ,CAAC,CAAC;AAEH,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACtD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QACjD,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,uBAAuB;QACzD,IAAI,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACtD,IAAI,6BAA6B,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACrD,IAAI,KAAoB,CAAC;IACzB,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA8C,CAAC;QAC7E,KAAK,GAAG,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;IACD,IAAI,wBAAwB,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,OAAO,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAClH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,UAA2C;IAClF,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,MAAM,MAAM,GAAG,CAAC,IAAY,EAAiB,EAAE;QAC9C,IAAI,CAAC;YACJ,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACF,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,GAAS,EAAE;QACpC,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxB,cAAc,GAAG,KAAK,CAAC;YACvB,OAAO;QACR,CAAC;QACD,cAAc,GAAG,IAAI,CAAC;QACtB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC;IAEF,OAAO,CAAC,IAAY,EAAQ,EAAE;QAC7B,IAAI,0BAA0B,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAClC,OAAO;QACR,CAAC;QACD,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,cAAc;YAAE,iBAAiB,EAAE,CAAC;IAC1C,CAAC,CAAC;AACH,CAAC","sourcesContent":["import { parseInteractiveEngineCommand } from \"../interactive-engine/protocol.ts\";\nimport type { RpcExtensionUIResponse } from \"./rpc-types.ts\";\n\nconst INTERRUPT_COMMANDS: ReadonlySet<string> = new Set([\n\t\"abort\",\n\t\"cancel_login_provider\",\n\t\"abort_compaction\",\n\t\"abort_retry\",\n\t\"abort_bash\",\n]);\n\nexport function isRpcExtensionUIResponse(value: unknown): value is RpcExtensionUIResponse {\n\treturn typeof value === \"object\" && value !== null &&\n\t\t\"type\" in value && value.type === \"extension_ui_response\" &&\n\t\t\"id\" in value && typeof value.id === \"string\";\n}\n\n/**\n * Control frames must remain reachable while an ordinary RPC command is\n * pending. Interrupts cancel that command, while host responses can unblock UI\n * work awaited by it. Everything else stays on the ordered command lane.\n */\nexport function isConcurrentRpcControlLine(line: string): boolean {\n\tif (parseInteractiveEngineCommand(line)) return true;\n\tlet value: object | null;\n\ttry {\n\t\tconst parsed = JSON.parse(line) as object | boolean | null | number | string;\n\t\tvalue = typeof parsed === \"object\" && !Array.isArray(parsed) ? parsed : null;\n\t} catch {\n\t\treturn false;\n\t}\n\tif (isRpcExtensionUIResponse(value)) return true;\n\treturn value !== null && \"type\" in value && typeof value.type === \"string\" && INTERRUPT_COMMANDS.has(value.type);\n}\n\n/**\n * Runs ordinary RPC input one frame at a time while giving validated control\n * frames an independent lane. The first ordinary frame starts synchronously,\n * so a following interrupt cannot overtake initialization of the operation it\n * is intended to cancel.\n */\nexport function createRpcInputScheduler(handleLine: (line: string) => Promise<void>): (line: string) => void {\n\tconst ordinaryQueue: string[] = [];\n\tlet ordinaryActive = false;\n\n\tconst invoke = (line: string): Promise<void> => {\n\t\ttry {\n\t\t\treturn handleLine(line);\n\t\t} catch (error) {\n\t\t\treturn Promise.reject(error);\n\t\t}\n\t};\n\n\tconst startNextOrdinary = (): void => {\n\t\tconst line = ordinaryQueue.shift();\n\t\tif (line === undefined) {\n\t\t\tordinaryActive = false;\n\t\t\treturn;\n\t\t}\n\t\tordinaryActive = true;\n\t\tvoid invoke(line).finally(startNextOrdinary).catch(() => {});\n\t};\n\n\treturn (line: string): void => {\n\t\tif (isConcurrentRpcControlLine(line)) {\n\t\t\tvoid invoke(line).catch(() => {});\n\t\t\treturn;\n\t\t}\n\t\tordinaryQueue.push(line);\n\t\tif (!ordinaryActive) startNextOrdinary();\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-mode.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-mode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAqB/E,YAAY,EACX,UAAU,EACV,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,WAAW,EACX,eAAe,GACf,MAAM,gBAAgB,CAAC;AAExB;;;GAGG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,mBAAmB,GAAG,OAAO,CAAC,KAAK,CAAC,CAqJjF"}
1
+ {"version":3,"file":"rpc-mode.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-mode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAqB/E,YAAY,EACX,UAAU,EACV,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,WAAW,EACX,eAAe,GACf,MAAM,gBAAgB,CAAC;AAExB;;;GAGG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,mBAAmB,GAAG,OAAO,CAAC,KAAK,CAAC,CAsJjF"}
@@ -88,6 +88,7 @@ export async function runRpcMode(runtimeHost) {
88
88
  output,
89
89
  keybindings,
90
90
  reloadCoordinator,
91
+ inputForm,
91
92
  });
92
93
  async function shutdown(exitCode = 0, signal) {
93
94
  if (shuttingDown) {
@@ -1 +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 { setKeybindings } from \"@earendil-works/pi-tui\";\nimport type { AgentSessionRuntime } from \"../../core/agent-session-runtime.ts\";\nimport type { AgentSession } from \"../../core/agent-session.ts\";\nimport { KeybindingsManager } from \"../../core/keybindings.ts\";\nimport { flushRawStdout, takeOverStdout, writeRawStdout } from \"../../core/output-guard.ts\";\nimport { killTrackedDetachedChildren } from \"../../utils/shell.ts\";\nimport { EngineCustomUiService } from \"../interactive-engine/engine-custom-ui.ts\";\nimport { EngineInputFormService } from \"../interactive-engine/engine-input-form.ts\";\nimport { EngineRenderService } from \"../interactive-engine/engine-render-service.ts\";\nimport { EngineSessionPickerService } from \"../interactive-engine/engine-session-picker.ts\";\nimport { startInteractiveEngineLiveness } from \"../interactive-engine/engine-child-liveness.ts\";\nimport { INTERACTIVE_ENGINE_MAX_FRAME_BYTES, serializeInteractiveEngineMessage } from \"../interactive-engine/protocol.ts\";\nimport { attachJsonlLineReader } from \"./jsonl.ts\";\nimport { createRpcCommandHandler } from \"./rpc-command-handler.ts\";\nimport { createRpcInputLineHandler } from \"./rpc-input.ts\";\nimport { createRpcInputScheduler } from \"./rpc-input-scheduler.ts\";\nimport type { RpcPendingExtensionRequests } from \"./rpc-extension-ui.ts\";\nimport { RpcOutputBuffer } from \"./rpc-output-buffer.ts\";\nimport { RpcSessionBinding } from \"./rpc-session-binding.ts\";\nimport { KeybindingsReloadCoordinator } from \"./rpc-keybindings-reload.ts\";\n\n// Re-export types for consumers\nexport type {\n\tRpcCommand,\n\tRpcContextWindowInfo,\n\tRpcExtensionUIRequest,\n\tRpcExtensionUIResponse,\n\tRpcResponse,\n\tRpcSessionState,\n} from \"./rpc-types.ts\";\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: AgentSessionRuntime): Promise<never> {\n\ttakeOverStdout();\n\n\tconst interactiveEngineChild = process.env.ATOMIC_INTERACTIVE_ENGINE_CHILD === \"1\";\n\tconst keybindings = interactiveEngineChild ? KeybindingsManager.create(runtimeHost.services.agentDir) : undefined;\n\tif (keybindings) setKeybindings(keybindings);\n\n\tconst outputBuffer = new RpcOutputBuffer();\n\tconst output = outputBuffer.output;\n\tconst pendingExtensionRequests: RpcPendingExtensionRequests = new Map();\n\tconst signalCleanupHandlers: Array<() => void> = [];\n\tconst engineLiveness = startInteractiveEngineLiveness(writeRawStdout);\n\tconst customUi = keybindings\n\t\t? new EngineCustomUiService(writeRawStdout, keybindings)\n\t\t: undefined;\n\tconst renderService = interactiveEngineChild\n\t\t? new EngineRenderService(writeRawStdout)\n\t\t: undefined;\n\tconst sessionPicker = interactiveEngineChild\n\t\t? new EngineSessionPickerService(writeRawStdout)\n\t\t: undefined;\n\tconst inputForm = interactiveEngineChild\n\t\t? new EngineInputFormService(writeRawStdout)\n\t\t: undefined;\n\tconst reloadCoordinator = keybindings\n\t\t? new KeybindingsReloadCoordinator<AgentSession>(\n\t\t\t\tkeybindings,\n\t\t\t\t(state) => writeRawStdout(serializeInteractiveEngineMessage({ type: \"engine_keybindings_reloaded\", state })),\n\t\t\t\t(session, effectiveBindings) => [...session.extensionRunner.getShortcuts(effectiveBindings)]\n\t\t\t\t\t.map(([key, shortcut]) => ({\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\t...(shortcut.description === undefined ? {} : { description: shortcut.description }),\n\t\t\t\t\t})),\n\t\t\t)\n\t\t: undefined;\n\n\tlet shutdownRequested = false;\n\tlet shuttingDown = false;\n\tlet detachInput = () => {};\n\n\tconst requestShutdown = () => {\n\t\tshutdownRequested = true;\n\t};\n\n\tconst sessionBinding = new RpcSessionBinding({\n\t\truntimeHost,\n\t\toutput,\n\t\tpendingExtensionRequests,\n\t\trequestShutdown,\n\t\tcustomUi,\n\t\trenderService,\n\t\tsessionPicker,\n\t\tinputForm,\n\t\treloadCoordinator,\n\t});\n\n\truntimeHost.setRebindSession(async () => {\n\t\tawait sessionBinding.rebindSession();\n\t});\n\n\tconst handleCommand = createRpcCommandHandler({\n\t\truntimeHost,\n\t\tgetSession: () => sessionBinding.currentSession,\n\t\trebindSession: () => sessionBinding.rebindSession(),\n\t\toutput,\n\t\tkeybindings,\n\t\treloadCoordinator,\n\t});\n\n\tasync function shutdown(exitCode = 0, signal?: NodeJS.Signals): Promise<never> {\n\t\tif (shuttingDown) {\n\t\t\tprocess.exit(exitCode);\n\t\t}\n\t\tshuttingDown = true;\n\t\tfor (const cleanup of signalCleanupHandlers) {\n\t\t\tcleanup();\n\t\t}\n\t\tsessionBinding.disposeSubscriptions();\n\t\tengineLiveness.stop();\n\t\tcustomUi?.dispose();\n\t\trenderService?.dispose();\n\t\tsessionPicker?.dispose();\n\t\tinputForm?.dispose();\n\t\toutputBuffer.dispose();\n\t\tawait runtimeHost.dispose();\n\t\tdetachInput();\n\t\tprocess.stdin.pause();\n\t\tif (signal !== \"SIGTERM\") {\n\t\t\tawait flushRawStdout();\n\t\t}\n\t\tprocess.exit(exitCode);\n\t}\n\n\tconst checkShutdownRequested = async (): Promise<void> => {\n\t\tif (!shutdownRequested) return;\n\t\tawait shutdown();\n\t};\n\n\tconst registerSignalHandlers = (): void => {\n\t\tconst signals: NodeJS.Signals[] = [\"SIGTERM\"];\n\t\tif (process.platform !== \"win32\") {\n\t\t\tsignals.push(\"SIGHUP\");\n\t\t}\n\n\t\tfor (const signal of signals) {\n\t\t\tconst handler = () => {\n\t\t\t\tkillTrackedDetachedChildren();\n\t\t\t\tvoid shutdown(signal === \"SIGHUP\" ? 129 : 143, signal);\n\t\t\t};\n\t\t\tprocess.on(signal, handler);\n\t\t\tsignalCleanupHandlers.push(() => process.off(signal, handler));\n\t\t}\n\t};\n\n\n\tconst handleInputLine = createRpcInputLineHandler({\n\t\toutput,\n\t\tpendingExtensionRequests,\n\t\thandleCommand,\n\t\tcheckShutdownRequested,\n\t\thandleInteractiveEngineLine: customUi || renderService || sessionPicker || inputForm\n\t\t\t? (line) => customUi?.handleLine(line) === true || renderService?.handleLine(line) === true || sessionPicker?.handleLine(line) === true || inputForm?.handleLine(line) === true\n\t\t\t: undefined,\n\t});\n\n\tconst onInputEnd = () => {\n\t\tvoid shutdown();\n\t};\n\tprocess.stdin.on(\"end\", onInputEnd);\n\n\tdetachInput = (() => {\n\t\tconst scheduleInputLine = createRpcInputScheduler(handleInputLine);\n\t\tconst detachJsonl = attachJsonlLineReader(process.stdin, scheduleInputLine, {\n\t\t\tmaxBytesPerTurn: 256 * 1024,\n\t\t\tmaxFrameBytes: INTERACTIVE_ENGINE_MAX_FRAME_BYTES,\n\t\t\tonOversizedLine: () => output({ type: \"response\", command: \"parse\", success: false, error: \"RPC command exceeded the 1 MiB frame limit\" }),\n\t\t});\n\t\treturn () => {\n\t\t\tdetachJsonl();\n\t\t\tprocess.stdin.off(\"end\", onInputEnd);\n\t\t};\n\t})();\n\tregisterSignalHandlers();\n\tengineLiveness.ready();\n\tawait sessionBinding.rebindSession();\n\tengineLiveness.bound();\n\n\t// Keep process alive forever\n\treturn new Promise(() => {});\n}\n"]}
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 { setKeybindings } from \"@earendil-works/pi-tui\";\nimport type { AgentSessionRuntime } from \"../../core/agent-session-runtime.ts\";\nimport type { AgentSession } from \"../../core/agent-session.ts\";\nimport { KeybindingsManager } from \"../../core/keybindings.ts\";\nimport { flushRawStdout, takeOverStdout, writeRawStdout } from \"../../core/output-guard.ts\";\nimport { killTrackedDetachedChildren } from \"../../utils/shell.ts\";\nimport { EngineCustomUiService } from \"../interactive-engine/engine-custom-ui.ts\";\nimport { EngineInputFormService } from \"../interactive-engine/engine-input-form.ts\";\nimport { EngineRenderService } from \"../interactive-engine/engine-render-service.ts\";\nimport { EngineSessionPickerService } from \"../interactive-engine/engine-session-picker.ts\";\nimport { startInteractiveEngineLiveness } from \"../interactive-engine/engine-child-liveness.ts\";\nimport { INTERACTIVE_ENGINE_MAX_FRAME_BYTES, serializeInteractiveEngineMessage } from \"../interactive-engine/protocol.ts\";\nimport { attachJsonlLineReader } from \"./jsonl.ts\";\nimport { createRpcCommandHandler } from \"./rpc-command-handler.ts\";\nimport { createRpcInputLineHandler } from \"./rpc-input.ts\";\nimport { createRpcInputScheduler } from \"./rpc-input-scheduler.ts\";\nimport type { RpcPendingExtensionRequests } from \"./rpc-extension-ui.ts\";\nimport { RpcOutputBuffer } from \"./rpc-output-buffer.ts\";\nimport { RpcSessionBinding } from \"./rpc-session-binding.ts\";\nimport { KeybindingsReloadCoordinator } from \"./rpc-keybindings-reload.ts\";\n\n// Re-export types for consumers\nexport type {\n\tRpcCommand,\n\tRpcContextWindowInfo,\n\tRpcExtensionUIRequest,\n\tRpcExtensionUIResponse,\n\tRpcResponse,\n\tRpcSessionState,\n} from \"./rpc-types.ts\";\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: AgentSessionRuntime): Promise<never> {\n\ttakeOverStdout();\n\n\tconst interactiveEngineChild = process.env.ATOMIC_INTERACTIVE_ENGINE_CHILD === \"1\";\n\tconst keybindings = interactiveEngineChild ? KeybindingsManager.create(runtimeHost.services.agentDir) : undefined;\n\tif (keybindings) setKeybindings(keybindings);\n\n\tconst outputBuffer = new RpcOutputBuffer();\n\tconst output = outputBuffer.output;\n\tconst pendingExtensionRequests: RpcPendingExtensionRequests = new Map();\n\tconst signalCleanupHandlers: Array<() => void> = [];\n\tconst engineLiveness = startInteractiveEngineLiveness(writeRawStdout);\n\tconst customUi = keybindings\n\t\t? new EngineCustomUiService(writeRawStdout, keybindings)\n\t\t: undefined;\n\tconst renderService = interactiveEngineChild\n\t\t? new EngineRenderService(writeRawStdout)\n\t\t: undefined;\n\tconst sessionPicker = interactiveEngineChild\n\t\t? new EngineSessionPickerService(writeRawStdout)\n\t\t: undefined;\n\tconst inputForm = interactiveEngineChild\n\t\t? new EngineInputFormService(writeRawStdout)\n\t\t: undefined;\n\tconst reloadCoordinator = keybindings\n\t\t? new KeybindingsReloadCoordinator<AgentSession>(\n\t\t\t\tkeybindings,\n\t\t\t\t(state) => writeRawStdout(serializeInteractiveEngineMessage({ type: \"engine_keybindings_reloaded\", state })),\n\t\t\t\t(session, effectiveBindings) => [...session.extensionRunner.getShortcuts(effectiveBindings)]\n\t\t\t\t\t.map(([key, shortcut]) => ({\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\t...(shortcut.description === undefined ? {} : { description: shortcut.description }),\n\t\t\t\t\t})),\n\t\t\t)\n\t\t: undefined;\n\n\tlet shutdownRequested = false;\n\tlet shuttingDown = false;\n\tlet detachInput = () => {};\n\n\tconst requestShutdown = () => {\n\t\tshutdownRequested = true;\n\t};\n\n\tconst sessionBinding = new RpcSessionBinding({\n\t\truntimeHost,\n\t\toutput,\n\t\tpendingExtensionRequests,\n\t\trequestShutdown,\n\t\tcustomUi,\n\t\trenderService,\n\t\tsessionPicker,\n\t\tinputForm,\n\t\treloadCoordinator,\n\t});\n\n\truntimeHost.setRebindSession(async () => {\n\t\tawait sessionBinding.rebindSession();\n\t});\n\n\tconst handleCommand = createRpcCommandHandler({\n\t\truntimeHost,\n\t\tgetSession: () => sessionBinding.currentSession,\n\t\trebindSession: () => sessionBinding.rebindSession(),\n\t\toutput,\n\t\tkeybindings,\n\t\treloadCoordinator,\n\t\tinputForm,\n\t});\n\n\tasync function shutdown(exitCode = 0, signal?: NodeJS.Signals): Promise<never> {\n\t\tif (shuttingDown) {\n\t\t\tprocess.exit(exitCode);\n\t\t}\n\t\tshuttingDown = true;\n\t\tfor (const cleanup of signalCleanupHandlers) {\n\t\t\tcleanup();\n\t\t}\n\t\tsessionBinding.disposeSubscriptions();\n\t\tengineLiveness.stop();\n\t\tcustomUi?.dispose();\n\t\trenderService?.dispose();\n\t\tsessionPicker?.dispose();\n\t\tinputForm?.dispose();\n\t\toutputBuffer.dispose();\n\t\tawait runtimeHost.dispose();\n\t\tdetachInput();\n\t\tprocess.stdin.pause();\n\t\tif (signal !== \"SIGTERM\") {\n\t\t\tawait flushRawStdout();\n\t\t}\n\t\tprocess.exit(exitCode);\n\t}\n\n\tconst checkShutdownRequested = async (): Promise<void> => {\n\t\tif (!shutdownRequested) return;\n\t\tawait shutdown();\n\t};\n\n\tconst registerSignalHandlers = (): void => {\n\t\tconst signals: NodeJS.Signals[] = [\"SIGTERM\"];\n\t\tif (process.platform !== \"win32\") {\n\t\t\tsignals.push(\"SIGHUP\");\n\t\t}\n\n\t\tfor (const signal of signals) {\n\t\t\tconst handler = () => {\n\t\t\t\tkillTrackedDetachedChildren();\n\t\t\t\tvoid shutdown(signal === \"SIGHUP\" ? 129 : 143, signal);\n\t\t\t};\n\t\t\tprocess.on(signal, handler);\n\t\t\tsignalCleanupHandlers.push(() => process.off(signal, handler));\n\t\t}\n\t};\n\n\n\tconst handleInputLine = createRpcInputLineHandler({\n\t\toutput,\n\t\tpendingExtensionRequests,\n\t\thandleCommand,\n\t\tcheckShutdownRequested,\n\t\thandleInteractiveEngineLine: customUi || renderService || sessionPicker || inputForm\n\t\t\t? (line) => customUi?.handleLine(line) === true || renderService?.handleLine(line) === true || sessionPicker?.handleLine(line) === true || inputForm?.handleLine(line) === true\n\t\t\t: undefined,\n\t});\n\n\tconst onInputEnd = () => {\n\t\tvoid shutdown();\n\t};\n\tprocess.stdin.on(\"end\", onInputEnd);\n\n\tdetachInput = (() => {\n\t\tconst scheduleInputLine = createRpcInputScheduler(handleInputLine);\n\t\tconst detachJsonl = attachJsonlLineReader(process.stdin, scheduleInputLine, {\n\t\t\tmaxBytesPerTurn: 256 * 1024,\n\t\t\tmaxFrameBytes: INTERACTIVE_ENGINE_MAX_FRAME_BYTES,\n\t\t\tonOversizedLine: () => output({ type: \"response\", command: \"parse\", success: false, error: \"RPC command exceeded the 1 MiB frame limit\" }),\n\t\t});\n\t\treturn () => {\n\t\t\tdetachJsonl();\n\t\t\tprocess.stdin.off(\"end\", onInputEnd);\n\t\t};\n\t})();\n\tregisterSignalHandlers();\n\tengineLiveness.ready();\n\tawait sessionBinding.rebindSession();\n\tengineLiveness.bound();\n\n\t// Keep process alive forever\n\treturn new Promise(() => {});\n}\n"]}
@@ -31,6 +31,7 @@ export declare class RpcSessionBinding {
31
31
  private readonly inputForm;
32
32
  private readonly requestShutdown;
33
33
  private readonly reloadCoordinator;
34
+ private footerDataProvider;
34
35
  constructor({ runtimeHost, output, pendingExtensionRequests, requestShutdown, customUi, renderService, sessionPicker, inputForm, reloadCoordinator }: RpcSessionBindingOptions);
35
36
  get currentSession(): AgentSession;
36
37
  rebindSession(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-session-binding.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-session-binding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE/E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AACvF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AACzF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gDAAgD,CAAC;AAC1F,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gDAAgD,CAAC;AACjG,OAAO,EAA+B,KAAK,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACtG,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAChF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,UAAU,wBAAwB;IACjC,WAAW,EAAE,mBAAmB,CAAC;IACjC,MAAM,EAAE,SAAS,CAAC;IAClB,wBAAwB,EAAE,2BAA2B,CAAC;IACtD,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,aAAa,CAAC,EAAE,0BAA0B,CAAC;IAC3C,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,iBAAiB,CAAC,EAAE,4BAA4B,CAAC,YAAY,CAAC,CAAC;CAC/D;AAED,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,WAAW,CAAC,CAAa;IACjC,OAAO,CAAC,uBAAuB,CAAC,CAAa;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAA8B;IACvE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoC;IAC7D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAChE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyC;IACvE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqC;IAC/D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAa;IAC7C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAyD;IAE3F,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,wBAAwB,EAAE,eAAe,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,iBAAiB,EAAE,EAAE,wBAAwB,EAW7K;IAED,IAAI,cAAc,IAAI,YAAY,CAEjC;IAEK,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAwDnC;IAED,oBAAoB,IAAI,IAAI,CAK3B;CACD"}
1
+ {"version":3,"file":"rpc-session-binding.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-session-binding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAG/E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AACvF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AACzF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gDAAgD,CAAC;AAC1F,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gDAAgD,CAAC;AACjG,OAAO,EAA+B,KAAK,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACtG,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAChF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,UAAU,wBAAwB;IACjC,WAAW,EAAE,mBAAmB,CAAC;IACjC,MAAM,EAAE,SAAS,CAAC;IAClB,wBAAwB,EAAE,2BAA2B,CAAC;IACtD,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,aAAa,CAAC,EAAE,0BAA0B,CAAC;IAC3C,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,iBAAiB,CAAC,EAAE,4BAA4B,CAAC,YAAY,CAAC,CAAC;CAC/D;AAED,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,WAAW,CAAC,CAAa;IACjC,OAAO,CAAC,uBAAuB,CAAC,CAAa;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAA8B;IACvE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoC;IAC7D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAChE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyC;IACvE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqC;IAC/D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAa;IAC7C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAyD;IAE3F,OAAO,CAAC,kBAAkB,CAAiC;IAC3D,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,wBAAwB,EAAE,eAAe,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,iBAAiB,EAAE,EAAE,wBAAwB,EAW7K;IAED,IAAI,cAAc,IAAI,YAAY,CAEjC;IAEK,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CA2EnC;IAED,oBAAoB,IAAI,IAAI,CAO3B;CACD"}
@@ -1,3 +1,4 @@
1
+ import { FooterDataProvider } from "../../core/footer-data-provider.js";
1
2
  import { waitForRawStdoutBackpressure } from "../../core/output-guard.js";
2
3
  import { createRpcExtensionUIContext } from "./rpc-extension-ui.js";
3
4
  export class RpcSessionBinding {
@@ -18,53 +19,73 @@ export class RpcSessionBinding {
18
19
  }
19
20
  async rebindSession() {
20
21
  this.session = this.runtimeHost.session;
22
+ this.disposeSubscriptions();
21
23
  const session = this.session;
22
24
  this.renderService?.bindSession(session);
23
- await session.bindExtensions({
24
- uiContext: createRpcExtensionUIContext({
25
- output: this.output,
26
- pendingExtensionRequests: this.pendingExtensionRequests,
27
- customUi: this.customUi,
28
- sessionPicker: this.sessionPicker,
29
- inputForm: this.inputForm,
30
- }),
31
- mode: this.customUi ? "tui" : "rpc",
32
- commandContextActions: {
33
- waitForIdle: () => this.session.agent.waitForIdle(),
34
- newSession: async (options) => this.runtimeHost.newSession(options),
35
- fork: async (entryId, forkOptions) => {
36
- const result = await this.runtimeHost.fork(entryId, forkOptions);
37
- return { cancelled: result.cancelled };
38
- },
39
- navigateTree: async (targetId, options) => {
40
- const result = await this.session.navigateTree(targetId, {
41
- summarize: options?.summarize,
42
- customInstructions: options?.customInstructions,
43
- replaceInstructions: options?.replaceInstructions,
44
- label: options?.label,
45
- });
46
- return { cancelled: result.cancelled };
47
- },
48
- switchSession: async (sessionPath, options) => {
49
- return this.runtimeHost.switchSession(sessionPath, options);
25
+ this.footerDataProvider = new FooterDataProvider(session.sessionManager.getCwd());
26
+ // Seed the provider count from the current catalog snapshot, mirroring
27
+ // updateProviderCountFromSnapshot() in interactive startup, so the
28
+ // embedded footer shows the (provider) model prefix in multi-provider
29
+ // sessions instead of defaulting to 0.
30
+ const models = session.scopedModels.length > 0
31
+ ? session.scopedModels.map((scoped) => scoped.model)
32
+ : session.modelRegistry.getAvailable();
33
+ this.footerDataProvider.setAvailableProviderCount(new Set(models.map((model) => model.provider)).size);
34
+ try {
35
+ await session.bindExtensions({
36
+ uiContext: createRpcExtensionUIContext({
37
+ output: this.output,
38
+ pendingExtensionRequests: this.pendingExtensionRequests,
39
+ customUi: this.customUi,
40
+ sessionPicker: this.sessionPicker,
41
+ inputForm: this.inputForm,
42
+ footerDataProvider: this.footerDataProvider,
43
+ }),
44
+ mode: this.customUi ? "tui" : "rpc",
45
+ commandContextActions: {
46
+ waitForIdle: () => this.session.agent.waitForIdle(),
47
+ newSession: async (options) => this.runtimeHost.newSession(options),
48
+ fork: async (entryId, forkOptions) => {
49
+ const result = await this.runtimeHost.fork(entryId, forkOptions);
50
+ return { cancelled: result.cancelled };
51
+ },
52
+ navigateTree: async (targetId, options) => {
53
+ const result = await this.session.navigateTree(targetId, {
54
+ summarize: options?.summarize,
55
+ customInstructions: options?.customInstructions,
56
+ replaceInstructions: options?.replaceInstructions,
57
+ label: options?.label,
58
+ });
59
+ return { cancelled: result.cancelled };
60
+ },
61
+ switchSession: async (sessionPath, options) => {
62
+ return this.runtimeHost.switchSession(sessionPath, options);
63
+ },
64
+ reload: async () => {
65
+ const steeringMode = this.session.steeringMode;
66
+ const followUpMode = this.session.followUpMode;
67
+ if (this.reloadCoordinator)
68
+ await this.reloadCoordinator.reload(this.session);
69
+ else
70
+ await this.session.reload();
71
+ this.session.setSteeringMode(steeringMode);
72
+ this.session.setFollowUpMode(followUpMode);
73
+ },
50
74
  },
51
- reload: async () => {
52
- const steeringMode = this.session.steeringMode;
53
- const followUpMode = this.session.followUpMode;
54
- if (this.reloadCoordinator)
55
- await this.reloadCoordinator.reload(this.session);
56
- else
57
- await this.session.reload();
58
- this.session.setSteeringMode(steeringMode);
59
- this.session.setFollowUpMode(followUpMode);
75
+ shutdownHandler: this.requestShutdown,
76
+ onError: (err) => {
77
+ this.output({ type: "extension_error", extensionPath: err.extensionPath, event: err.event, error: err.error });
60
78
  },
61
- },
62
- shutdownHandler: this.requestShutdown,
63
- onError: (err) => {
64
- this.output({ type: "extension_error", extensionPath: err.extensionPath, event: err.event, error: err.error });
65
- },
66
- });
67
- this.disposeSubscriptions();
79
+ });
80
+ this.footerDataProvider.startGitWatcher();
81
+ }
82
+ catch (error) {
83
+ // Leave no partially-initialized footer state behind if extension
84
+ // binding fails; dispose the provider and rethrow.
85
+ this.footerDataProvider.dispose();
86
+ this.footerDataProvider = undefined;
87
+ throw error;
88
+ }
68
89
  this.unsubscribe = session.subscribe((event) => {
69
90
  this.output(event);
70
91
  });
@@ -76,8 +97,10 @@ export class RpcSessionBinding {
76
97
  disposeSubscriptions() {
77
98
  this.unsubscribe?.();
78
99
  this.unsubscribeBackpressure?.();
100
+ this.footerDataProvider?.dispose();
79
101
  this.unsubscribe = undefined;
80
102
  this.unsubscribeBackpressure = undefined;
103
+ this.footerDataProvider = undefined;
81
104
  }
82
105
  }
83
106
  //# sourceMappingURL=rpc-session-binding.js.map