@code-yeongyu/senpi 2026.8.26 → 2026.8.28-2

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 (335) hide show
  1. package/CHANGELOG.md +138 -0
  2. package/README.md +3 -3
  3. package/dist/cli/args.d.ts +5 -1
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +18 -1
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/core/agent-session-services.d.ts.map +1 -1
  8. package/dist/core/agent-session-services.js +2 -0
  9. package/dist/core/agent-session-services.js.map +1 -1
  10. package/dist/core/agent-session.d.ts +5 -0
  11. package/dist/core/agent-session.d.ts.map +1 -1
  12. package/dist/core/agent-session.js +11 -1
  13. package/dist/core/agent-session.js.map +1 -1
  14. package/dist/core/auth-storage.d.ts +1 -0
  15. package/dist/core/auth-storage.d.ts.map +1 -1
  16. package/dist/core/auth-storage.js +3 -0
  17. package/dist/core/auth-storage.js.map +1 -1
  18. package/dist/core/bash-executor.d.ts.map +1 -1
  19. package/dist/core/bash-executor.js +67 -29
  20. package/dist/core/bash-executor.js.map +1 -1
  21. package/dist/core/credential-accounts.d.ts +31 -0
  22. package/dist/core/credential-accounts.d.ts.map +1 -0
  23. package/dist/core/credential-accounts.js +135 -0
  24. package/dist/core/credential-accounts.js.map +1 -0
  25. package/dist/core/credential-pool/classify.d.ts +47 -0
  26. package/dist/core/credential-pool/classify.d.ts.map +1 -0
  27. package/dist/core/credential-pool/classify.js +92 -0
  28. package/dist/core/credential-pool/classify.js.map +1 -0
  29. package/dist/core/credential-pool/env-slots.d.ts +22 -0
  30. package/dist/core/credential-pool/env-slots.d.ts.map +1 -0
  31. package/dist/core/credential-pool/env-slots.js +37 -0
  32. package/dist/core/credential-pool/env-slots.js.map +1 -0
  33. package/dist/core/credential-pool/failover.d.ts +62 -0
  34. package/dist/core/credential-pool/failover.d.ts.map +1 -0
  35. package/dist/core/credential-pool/failover.js +124 -0
  36. package/dist/core/credential-pool/failover.js.map +1 -0
  37. package/dist/core/credential-pool/rotation-stream.d.ts +54 -0
  38. package/dist/core/credential-pool/rotation-stream.d.ts.map +1 -0
  39. package/dist/core/credential-pool/rotation-stream.js +183 -0
  40. package/dist/core/credential-pool/rotation-stream.js.map +1 -0
  41. package/dist/core/credential-pool/state-store.d.ts +89 -0
  42. package/dist/core/credential-pool/state-store.d.ts.map +1 -0
  43. package/dist/core/credential-pool/state-store.js +166 -0
  44. package/dist/core/credential-pool/state-store.js.map +1 -0
  45. package/dist/core/extensions/builtin/account/index.d.ts +9 -0
  46. package/dist/core/extensions/builtin/account/index.d.ts.map +1 -0
  47. package/dist/core/extensions/builtin/account/index.js +69 -0
  48. package/dist/core/extensions/builtin/account/index.js.map +1 -0
  49. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  50. package/dist/core/extensions/builtin/compaction/index.js +67 -0
  51. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  52. package/dist/core/extensions/builtin/compaction/log.d.ts +1 -1
  53. package/dist/core/extensions/builtin/compaction/log.d.ts.map +1 -1
  54. package/dist/core/extensions/builtin/compaction/log.js +1 -0
  55. package/dist/core/extensions/builtin/compaction/log.js.map +1 -1
  56. package/dist/core/extensions/builtin/config-reload/index.js +14 -22
  57. package/dist/core/extensions/builtin/config-reload/index.js.map +1 -1
  58. package/dist/core/extensions/builtin/goal/continuation-recovery.d.ts +1 -0
  59. package/dist/core/extensions/builtin/goal/continuation-recovery.d.ts.map +1 -1
  60. package/dist/core/extensions/builtin/goal/continuation-recovery.js +2 -0
  61. package/dist/core/extensions/builtin/goal/continuation-recovery.js.map +1 -1
  62. package/dist/core/extensions/builtin/goal/continuation.d.ts +8 -1
  63. package/dist/core/extensions/builtin/goal/continuation.d.ts.map +1 -1
  64. package/dist/core/extensions/builtin/goal/continuation.js +15 -0
  65. package/dist/core/extensions/builtin/goal/continuation.js.map +1 -1
  66. package/dist/core/extensions/builtin/goal/direct-input-lifecycle.js +2 -2
  67. package/dist/core/extensions/builtin/goal/direct-input-lifecycle.js.map +1 -1
  68. package/dist/core/extensions/builtin/goal/format.d.ts +6 -1
  69. package/dist/core/extensions/builtin/goal/format.d.ts.map +1 -1
  70. package/dist/core/extensions/builtin/goal/format.js +6 -0
  71. package/dist/core/extensions/builtin/goal/format.js.map +1 -1
  72. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  73. package/dist/core/extensions/builtin/goal/index.js +7 -0
  74. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  75. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts.map +1 -1
  76. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +5 -2
  77. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js.map +1 -1
  78. package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
  79. package/dist/core/extensions/builtin/goal/monitor-continuation.js +31 -7
  80. package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
  81. package/dist/core/extensions/builtin/goal/persistence.js +2 -0
  82. package/dist/core/extensions/builtin/goal/persistence.js.map +1 -1
  83. package/dist/core/extensions/builtin/goal/renderers.d.ts +14 -0
  84. package/dist/core/extensions/builtin/goal/renderers.d.ts.map +1 -0
  85. package/dist/core/extensions/builtin/goal/renderers.js +153 -0
  86. package/dist/core/extensions/builtin/goal/renderers.js.map +1 -0
  87. package/dist/core/extensions/builtin/goal/store.d.ts +6 -2
  88. package/dist/core/extensions/builtin/goal/store.d.ts.map +1 -1
  89. package/dist/core/extensions/builtin/goal/store.js +8 -2
  90. package/dist/core/extensions/builtin/goal/store.js.map +1 -1
  91. package/dist/core/extensions/builtin/goal/tool-registration.d.ts.map +1 -1
  92. package/dist/core/extensions/builtin/goal/tool-registration.js +16 -6
  93. package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
  94. package/dist/core/extensions/builtin/goal/types.d.ts +1 -0
  95. package/dist/core/extensions/builtin/goal/types.d.ts.map +1 -1
  96. package/dist/core/extensions/builtin/goal/types.js.map +1 -1
  97. package/dist/core/extensions/builtin/imagegen/index.d.ts.map +1 -1
  98. package/dist/core/extensions/builtin/imagegen/index.js +10 -3
  99. package/dist/core/extensions/builtin/imagegen/index.js.map +1 -1
  100. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  101. package/dist/core/extensions/builtin/index.js +4 -0
  102. package/dist/core/extensions/builtin/index.js.map +1 -1
  103. package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
  104. package/dist/core/extensions/builtin/service-tier.js +13 -0
  105. package/dist/core/extensions/builtin/service-tier.js.map +1 -1
  106. package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
  107. package/dist/core/extensions/builtin/terminal/extension.js +4 -2
  108. package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
  109. package/dist/core/extensions/builtin/todotools/index.js +1 -1
  110. package/dist/core/extensions/builtin/todotools/index.js.map +1 -1
  111. package/dist/core/extensions/builtin/todotools/native-todo-mirror.d.ts +1 -1
  112. package/dist/core/extensions/builtin/todotools/native-todo-mirror.d.ts.map +1 -1
  113. package/dist/core/extensions/builtin/todotools/native-todo-mirror.js +1 -1
  114. package/dist/core/extensions/builtin/todotools/native-todo-mirror.js.map +1 -1
  115. package/dist/core/hidden-stdout-log.d.ts +10 -0
  116. package/dist/core/hidden-stdout-log.d.ts.map +1 -1
  117. package/dist/core/hidden-stdout-log.js +36 -5
  118. package/dist/core/hidden-stdout-log.js.map +1 -1
  119. package/dist/core/model-config-schema.d.ts +85 -12
  120. package/dist/core/model-config-schema.d.ts.map +1 -1
  121. package/dist/core/model-config-schema.js +25 -0
  122. package/dist/core/model-config-schema.js.map +1 -1
  123. package/dist/core/model-runtime.d.ts +36 -1
  124. package/dist/core/model-runtime.d.ts.map +1 -1
  125. package/dist/core/model-runtime.js +142 -12
  126. package/dist/core/model-runtime.js.map +1 -1
  127. package/dist/core/retry-fallback/chains.d.ts +23 -1
  128. package/dist/core/retry-fallback/chains.d.ts.map +1 -1
  129. package/dist/core/retry-fallback/chains.js +59 -3
  130. package/dist/core/retry-fallback/chains.js.map +1 -1
  131. package/dist/core/retry-fallback/controller.d.ts.map +1 -1
  132. package/dist/core/retry-fallback/controller.js +9 -2
  133. package/dist/core/retry-fallback/controller.js.map +1 -1
  134. package/dist/core/retry-fallback/settings.d.ts.map +1 -1
  135. package/dist/core/retry-fallback/settings.js +9 -0
  136. package/dist/core/retry-fallback/settings.js.map +1 -1
  137. package/dist/core/retry-fallback/validate.js +1 -1
  138. package/dist/core/retry-fallback/validate.js.map +1 -1
  139. package/dist/core/sdk.js +1 -1
  140. package/dist/core/sdk.js.map +1 -1
  141. package/dist/core/session-manager.d.ts +9 -0
  142. package/dist/core/session-manager.d.ts.map +1 -1
  143. package/dist/core/session-manager.js +31 -0
  144. package/dist/core/session-manager.js.map +1 -1
  145. package/dist/core/tools/output-accumulator.d.ts +2 -0
  146. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  147. package/dist/core/tools/output-accumulator.js +32 -7
  148. package/dist/core/tools/output-accumulator.js.map +1 -1
  149. package/dist/index.d.ts +1 -1
  150. package/dist/index.d.ts.map +1 -1
  151. package/dist/index.js +1 -1
  152. package/dist/index.js.map +1 -1
  153. package/dist/main.d.ts +7 -0
  154. package/dist/main.d.ts.map +1 -1
  155. package/dist/main.js +48 -4
  156. package/dist/main.js.map +1 -1
  157. package/dist/modes/app-server/server/account.d.ts.map +1 -1
  158. package/dist/modes/app-server/server/account.js +5 -5
  159. package/dist/modes/app-server/server/account.js.map +1 -1
  160. package/dist/modes/index.d.ts +1 -0
  161. package/dist/modes/index.d.ts.map +1 -1
  162. package/dist/modes/index.js +1 -0
  163. package/dist/modes/index.js.map +1 -1
  164. package/dist/modes/interactive/components/footer.d.ts +11 -3
  165. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  166. package/dist/modes/interactive/components/footer.js +31 -1
  167. package/dist/modes/interactive/components/footer.js.map +1 -1
  168. package/dist/modes/interactive/components/tool-execution-fallback.d.ts.map +1 -1
  169. package/dist/modes/interactive/components/tool-execution-fallback.js +82 -1
  170. package/dist/modes/interactive/components/tool-execution-fallback.js.map +1 -1
  171. package/dist/modes/interactive/grok/chrome.d.ts +4 -4
  172. package/dist/modes/interactive/grok/chrome.d.ts.map +1 -1
  173. package/dist/modes/interactive/grok/chrome.js.map +1 -1
  174. package/dist/modes/interactive/grok/footer.d.ts +3 -3
  175. package/dist/modes/interactive/grok/footer.d.ts.map +1 -1
  176. package/dist/modes/interactive/grok/footer.js.map +1 -1
  177. package/dist/modes/interactive/interactive-host-runtime.d.ts +44 -0
  178. package/dist/modes/interactive/interactive-host-runtime.d.ts.map +1 -0
  179. package/dist/modes/interactive/interactive-host-runtime.js +529 -0
  180. package/dist/modes/interactive/interactive-host-runtime.js.map +1 -0
  181. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  182. package/dist/modes/interactive/interactive-mode.js +340 -257
  183. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  184. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  185. package/dist/modes/rpc/connection-handler.js +151 -30
  186. package/dist/modes/rpc/connection-handler.js.map +1 -1
  187. package/dist/modes/rpc/host-ensure.d.ts +41 -0
  188. package/dist/modes/rpc/host-ensure.d.ts.map +1 -0
  189. package/dist/modes/rpc/host-ensure.js +245 -0
  190. package/dist/modes/rpc/host-ensure.js.map +1 -0
  191. package/dist/modes/rpc/host-lifecycle.d.ts +57 -0
  192. package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -0
  193. package/dist/modes/rpc/host-lifecycle.js +491 -0
  194. package/dist/modes/rpc/host-lifecycle.js.map +1 -0
  195. package/dist/modes/rpc/host-watchdog.d.ts +33 -0
  196. package/dist/modes/rpc/host-watchdog.d.ts.map +1 -0
  197. package/dist/modes/rpc/host-watchdog.js +142 -0
  198. package/dist/modes/rpc/host-watchdog.js.map +1 -0
  199. package/dist/modes/rpc/multi-session-host.d.ts +7 -1
  200. package/dist/modes/rpc/multi-session-host.d.ts.map +1 -1
  201. package/dist/modes/rpc/multi-session-host.js +216 -32
  202. package/dist/modes/rpc/multi-session-host.js.map +1 -1
  203. package/dist/modes/rpc/rpc-client.d.ts +115 -8
  204. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  205. package/dist/modes/rpc/rpc-client.js +200 -32
  206. package/dist/modes/rpc/rpc-client.js.map +1 -1
  207. package/dist/modes/rpc/rpc-mode.d.ts +4 -2
  208. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  209. package/dist/modes/rpc/rpc-mode.js +4 -2
  210. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  211. package/dist/modes/rpc/rpc-types.d.ts +166 -3
  212. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  213. package/dist/modes/rpc/rpc-types.js.map +1 -1
  214. package/dist/modes/rpc/session-command-router.d.ts +22 -0
  215. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  216. package/dist/modes/rpc/session-command-router.js +165 -16
  217. package/dist/modes/rpc/session-command-router.js.map +1 -1
  218. package/dist/modes/rpc/session-event-writer.d.ts +15 -2
  219. package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
  220. package/dist/modes/rpc/session-event-writer.js +69 -25
  221. package/dist/modes/rpc/session-event-writer.js.map +1 -1
  222. package/dist/modes/rpc/session-registry.d.ts +16 -0
  223. package/dist/modes/rpc/session-registry.d.ts.map +1 -1
  224. package/dist/modes/rpc/session-registry.js +40 -3
  225. package/dist/modes/rpc/session-registry.js.map +1 -1
  226. package/docs/providers.md +48 -0
  227. package/docs/rpc.md +96 -5
  228. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +56 -0
  229. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  230. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +13 -1
  231. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/inline-worker.ts +15 -1
  232. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-indirect-eval.js +711 -1
  233. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/transport.ts +14 -1
  234. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +10 -10
  235. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-eval-result.ts +9 -3
  236. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +6 -1
  237. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/edit.d.ts.map +1 -1
  238. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/edit.js +20 -4
  239. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/edit.js.map +1 -1
  240. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/index.d.ts +1 -1
  241. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/index.d.ts.map +1 -1
  242. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/index.js.map +1 -1
  243. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/post-mutate.d.ts +21 -0
  244. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/post-mutate.d.ts.map +1 -0
  245. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/post-mutate.js +27 -0
  246. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/post-mutate.js.map +1 -0
  247. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/tool-context.d.ts +24 -0
  248. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/tool-context.d.ts.map +1 -1
  249. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/tool-context.js.map +1 -1
  250. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/write.d.ts.map +1 -1
  251. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/write.js +7 -2
  252. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/write.js.map +1 -1
  253. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  254. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-pairs.d.ts +1 -1
  255. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-pairs.d.ts.map +1 -1
  256. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-pairs.js +46 -14
  257. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-pairs.js.map +1 -1
  258. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts +11 -0
  259. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts.map +1 -1
  260. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js +30 -16
  261. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js.map +1 -1
  262. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.d.ts +2 -1
  263. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.d.ts.map +1 -1
  264. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.js +2 -1
  265. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.js.map +1 -1
  266. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/classify.d.ts +16 -0
  267. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/classify.d.ts.map +1 -0
  268. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/classify.js +75 -0
  269. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/classify.js.map +1 -0
  270. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/failover.d.ts +45 -0
  271. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/failover.d.ts.map +1 -0
  272. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/failover.js +81 -0
  273. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/failover.js.map +1 -0
  274. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/select.d.ts +31 -0
  275. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/select.d.ts.map +1 -0
  276. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/select.js +65 -0
  277. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/select.js.map +1 -0
  278. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.d.ts +12 -0
  279. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.d.ts.map +1 -1
  280. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.js +37 -0
  281. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.js.map +1 -1
  282. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts +6 -0
  283. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts.map +1 -1
  284. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js +32 -6
  285. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js.map +1 -1
  286. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts +3 -2
  287. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts.map +1 -1
  288. package/node_modules/@earendil-works/pi-ai/dist/auth/types.js.map +1 -1
  289. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts +6 -0
  290. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts.map +1 -1
  291. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js +6 -1
  292. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
  293. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +75 -0
  294. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  295. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +75 -0
  296. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  297. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  298. package/node_modules/@earendil-works/pi-ai/dist/providers/data/alibaba-token-plan.json +1 -1
  299. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  300. package/node_modules/@earendil-works/pi-ai/dist/providers/data/baseten.json +1 -1
  301. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  302. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
  303. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  304. package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
  305. package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
  306. package/node_modules/@earendil-works/pi-ai/dist/providers/data/minimax-cn.json +1 -1
  307. package/node_modules/@earendil-works/pi-ai/dist/providers/data/minimax.json +1 -1
  308. package/node_modules/@earendil-works/pi-ai/dist/providers/data/mistral.json +1 -1
  309. package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
  310. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai-codex.json +1 -1
  311. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -1
  312. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  313. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  314. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opengateway.json +1 -1
  315. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  316. package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan-cn.json +1 -1
  317. package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan.json +1 -1
  318. package/node_modules/@earendil-works/pi-ai/dist/providers/data/together.json +1 -1
  319. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  320. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai-coding-cn.json +1 -1
  321. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai.json +1 -1
  322. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  323. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js +4 -0
  324. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js.map +1 -1
  325. package/node_modules/@earendil-works/pi-ai/package.json +5 -5
  326. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  327. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  328. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +5 -0
  329. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
  330. package/node_modules/@earendil-works/pi-tui/dist/terminal.js +90 -1
  331. package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
  332. package/node_modules/@earendil-works/pi-tui/dist/tui.js +1 -1
  333. package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
  334. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  335. package/package.json +7 -7
@@ -0,0 +1,529 @@
1
+ import { executeBashWithOperations } from "../../core/bash-executor.js";
2
+ import { SessionManager } from "../../core/session-manager.js";
3
+ import { SettingsManager } from "../../core/settings-manager.js";
4
+ import { ensureHost } from "../rpc/host-ensure.js";
5
+ import { RpcClient } from "../rpc/rpc-client.js";
6
+ export const INTERACTIVE_HOST_FALLBACK_WARNING = "Warning: shared interactive host unavailable; continuing locally";
7
+ /**
8
+ * Replace only the transport-facing session operations. The object returned is
9
+ * deliberately still an AgentSessionRuntime: InteractiveMode and extensions
10
+ * retain their existing runtime seam, while the authoritative prompt/session
11
+ * state is hosted by the shared RPC process.
12
+ */
13
+ export async function createInteractiveHostRuntime(localRuntime, options) {
14
+ const sessionPath = localRuntime.session.sessionFile;
15
+ if (!sessionPath)
16
+ return localRuntime;
17
+ const startHost = options.ensureHost ?? ((hostOptions) => ensureHost(hostOptions));
18
+ const client = new RpcClient({ socketPath: options.socket });
19
+ try {
20
+ await startHost({ socket: options.socket, agentDir: options.agentDir });
21
+ await client.start();
22
+ const opened = await client.openSession({
23
+ sessionPath,
24
+ cwd: localRuntime.cwd,
25
+ provider: localRuntime.session.model?.provider,
26
+ modelId: localRuntime.session.model?.id,
27
+ thinkingLevel: localRuntime.session.thinkingLevel,
28
+ });
29
+ const remoteSession = createRemoteSessionProxy(localRuntime.session, localRuntime.services.agentDir, client, opened.state, options.onWarning);
30
+ return new RemoteInteractiveRuntime(localRuntime, remoteSession, client);
31
+ }
32
+ catch (cause) {
33
+ await client.stop().catch(() => { });
34
+ options.onWarning?.({
35
+ type: "interactive_host_fallback",
36
+ message: `${INTERACTIVE_HOST_FALLBACK_WARNING}: ${cause instanceof Error ? cause.message : String(cause)}`,
37
+ cause,
38
+ });
39
+ return localRuntime;
40
+ }
41
+ }
42
+ class RemoteInteractiveRuntime {
43
+ #local;
44
+ #remoteSession;
45
+ #client;
46
+ #rebindSession;
47
+ #beforeSessionInvalidate;
48
+ constructor(local, remoteSession, client) {
49
+ this.#local = local;
50
+ this.#remoteSession = remoteSession;
51
+ this.#client = client;
52
+ }
53
+ get session() {
54
+ return this.#remoteSession.session;
55
+ }
56
+ get services() {
57
+ return this.#local.services;
58
+ }
59
+ get cwd() {
60
+ return this.#remoteSession.session.sessionManager.getCwd();
61
+ }
62
+ get diagnostics() {
63
+ return this.#local.diagnostics;
64
+ }
65
+ get modelFallbackMessage() {
66
+ return this.#local.modelFallbackMessage;
67
+ }
68
+ get launchProfile() {
69
+ return this.#local.launchProfile;
70
+ }
71
+ setBeforeSessionInvalidate(callback) {
72
+ this.#beforeSessionInvalidate = callback;
73
+ }
74
+ setRebindSession(callback) {
75
+ this.#rebindSession = callback;
76
+ }
77
+ async dispose() {
78
+ await this.#client.closeSession();
79
+ await this.#client.stop();
80
+ await this.#local.dispose();
81
+ }
82
+ async newSession(options) {
83
+ const result = await this.#client.newSession(options?.parentSession);
84
+ if (!result.cancelled) {
85
+ this.#beforeSessionInvalidate?.();
86
+ this.#remoteSession.abortLocalBash();
87
+ await this.#remoteSession.refresh();
88
+ if (options?.setup) {
89
+ const capture = SessionManager.inMemory(this.#remoteSession.session.sessionManager.getCwd());
90
+ await options.setup(capture);
91
+ for (const entry of capture.getEntries())
92
+ await this.#client.appendSessionEntry(entry);
93
+ await this.#remoteSession.refresh();
94
+ }
95
+ await this.#rebindSession?.();
96
+ if (options?.withSession)
97
+ await options.withSession(this.#remoteSession.createReplacedSessionContext());
98
+ }
99
+ return result;
100
+ }
101
+ async switchSession(sessionPath, options) {
102
+ const result = await this.#client.switchSession(sessionPath, options);
103
+ if (!result.cancelled) {
104
+ this.#beforeSessionInvalidate?.();
105
+ this.#remoteSession.abortLocalBash();
106
+ await this.#remoteSession.refresh();
107
+ await this.#rebindSession?.();
108
+ // The shared host already resolved trust; this callback is retained for
109
+ // compatibility, but its result cannot override host-authoritative state.
110
+ options?.projectTrustContextFactory?.(this.#remoteSession.session.sessionManager.getCwd());
111
+ if (options?.withSession)
112
+ await options.withSession(this.#remoteSession.createReplacedSessionContext());
113
+ }
114
+ return result;
115
+ }
116
+ async fork(entryId, options) {
117
+ const result = await this.#client.fork(entryId, options);
118
+ if (!result.cancelled) {
119
+ this.#beforeSessionInvalidate?.();
120
+ this.#remoteSession.abortLocalBash();
121
+ await this.#refreshAndRebind();
122
+ if (options?.withSession)
123
+ await options.withSession(this.#remoteSession.createReplacedSessionContext());
124
+ }
125
+ return { cancelled: result.cancelled, selectedText: result.text };
126
+ }
127
+ async importFromJsonl(inputPath, cwdOverride) {
128
+ const result = await this.#client.importJsonl(inputPath, cwdOverride);
129
+ if (!result.cancelled) {
130
+ this.#beforeSessionInvalidate?.();
131
+ this.#remoteSession.abortLocalBash();
132
+ await this.#refreshAndRebind();
133
+ }
134
+ return result;
135
+ }
136
+ async #refreshAndRebind() {
137
+ await this.#remoteSession.refresh();
138
+ await this.#rebindSession?.();
139
+ }
140
+ }
141
+ function createRemoteSessionProxy(local, agentDir, client, initialState, onWarning) {
142
+ // Fire-and-forget setters keep the sync AgentSession signature, but their RPC
143
+ // failures must not vanish: the matching *_changed wire event confirms success,
144
+ // and a rejection here is the only signal of failure.
145
+ const reportActionFailure = (action) => (error) => {
146
+ onWarning?.({
147
+ type: "interactive_host_action_failed",
148
+ message: `Warning: shared interactive host ${action} failed: ${error instanceof Error ? error.message : String(error)}`,
149
+ cause: error,
150
+ });
151
+ };
152
+ let state = { ...initialState };
153
+ let bashChunk;
154
+ let localBashAbortController;
155
+ let localBashRunning = false;
156
+ let hostBashRunning = initialState.isBashRunning;
157
+ let sessionManager = local.sessionManager;
158
+ let settingsManager = SettingsManager.create(initialState.cwd, agentDir, {
159
+ projectTrusted: initialState.projectTrusted,
160
+ });
161
+ const updateBashState = () => {
162
+ state = { ...state, isBashRunning: localBashRunning || hostBashRunning };
163
+ };
164
+ const remoteSessionManager = new Proxy({}, {
165
+ get(_target, property, _receiver) {
166
+ if (property === "appendLabelChange") {
167
+ return (entryId, label) => void client.setLabel(entryId, label);
168
+ }
169
+ if (property === "getSessionName")
170
+ return () => state.sessionName;
171
+ const value = Reflect.get(sessionManager, property, sessionManager);
172
+ return typeof value === "function" ? value.bind(sessionManager) : value;
173
+ },
174
+ });
175
+ let streamingAssistant;
176
+ const listeners = new Set();
177
+ client.onEvent((wireEvent) => {
178
+ if (wireEvent.type === "agent_settled")
179
+ state = { ...state, isStreaming: false, retryAttempt: 0 };
180
+ if (wireEvent.type === "bash_start") {
181
+ hostBashRunning = true;
182
+ updateBashState();
183
+ }
184
+ if (wireEvent.type === "bash_end") {
185
+ hostBashRunning = false;
186
+ updateBashState();
187
+ }
188
+ if (wireEvent.type === "bash_execution_update")
189
+ bashChunk?.(wireEvent.delta);
190
+ if (wireEvent.type === "agent_start")
191
+ state = { ...state, isStreaming: true };
192
+ if (wireEvent.type === "compaction_start")
193
+ state = { ...state, isCompacting: true };
194
+ if (wireEvent.type === "compaction_end")
195
+ state = { ...state, isCompacting: false };
196
+ if (wireEvent.type === "auto_retry_start")
197
+ state = { ...state, retryAttempt: wireEvent.attempt };
198
+ if (wireEvent.type === "auto_retry_end")
199
+ state = { ...state, retryAttempt: 0 };
200
+ if (wireEvent.type === "queue_update") {
201
+ state = {
202
+ ...state,
203
+ steering: [...wireEvent.steering],
204
+ followUp: [...wireEvent.followUp],
205
+ ordered: [...wireEvent.ordered],
206
+ pendingMessageCount: wireEvent.steering.length + wireEvent.followUp.length,
207
+ };
208
+ }
209
+ if (wireEvent.type === "model_changed") {
210
+ state = { ...state, model: wireEvent.model, thinkingLevel: wireEvent.thinkingLevel };
211
+ }
212
+ if (wireEvent.type === "thinking_level_changed")
213
+ state = { ...state, thinkingLevel: wireEvent.level };
214
+ if (wireEvent.type === "session_info_changed")
215
+ state = { ...state, sessionName: wireEvent.name };
216
+ if (wireEvent.type === "message_start") {
217
+ if (wireEvent.message.role === "assistant")
218
+ streamingAssistant = structuredClone(wireEvent.message);
219
+ local.agent.state.messages.push(structuredClone(wireEvent.message));
220
+ }
221
+ if (wireEvent.type === "message_end") {
222
+ if (wireEvent.message.role === "assistant")
223
+ streamingAssistant = structuredClone(wireEvent.message);
224
+ const messages = local.agent.state.messages;
225
+ const previous = messages.at(-1);
226
+ if (previous?.role === wireEvent.message.role)
227
+ messages[messages.length - 1] = structuredClone(wireEvent.message);
228
+ }
229
+ if (wireEvent.type === "compaction_end" && wireEvent.accepted && !wireEvent.aborted) {
230
+ try {
231
+ sessionManager.reloadFromDisk?.();
232
+ local.agent.state.messages = sessionManager.buildSessionContext().messages;
233
+ }
234
+ catch {
235
+ // Non-fatal if session file is transiently locked or unavailable
236
+ }
237
+ }
238
+ const event = hydrateMessageUpdate(wireEvent, streamingAssistant);
239
+ for (const listener of listeners)
240
+ listener(event);
241
+ });
242
+ const refresh = async () => {
243
+ const nextState = await client.getState();
244
+ state = { ...stateFromRpc(nextState) };
245
+ let messages;
246
+ settingsManager = SettingsManager.create(nextState.cwd, agentDir, {
247
+ projectTrusted: nextState.projectTrusted,
248
+ });
249
+ if (nextState.sessionFile) {
250
+ // SessionManager.open retains the explicit path even when the host has
251
+ // deferred creating the file for a setup-only session.
252
+ sessionManager = SessionManager.open(nextState.sessionFile, undefined, nextState.cwd);
253
+ if (nextState.entries?.length && !sessionManager.getEntries().length) {
254
+ for (const entry of nextState.entries)
255
+ sessionManager.appendEntry(entry);
256
+ }
257
+ messages = sessionManager.buildSessionContext().messages;
258
+ }
259
+ else {
260
+ messages = await client.getMessages();
261
+ }
262
+ local.agent.state.messages.splice(0, local.agent.state.messages.length, ...structuredClone(messages));
263
+ streamingAssistant = undefined;
264
+ };
265
+ const session = new Proxy(local, {
266
+ get(target, property, receiver) {
267
+ if (property === "prompt")
268
+ return (message, options) => client.prompt(message, {
269
+ ...(options?.images ? { images: options.images } : {}),
270
+ ...(options?.streamingBehavior ? { streamingBehavior: options.streamingBehavior } : {}),
271
+ ...(options?.thinkingLevel ? { thinkingLevel: options.thinkingLevel } : {}),
272
+ ...(options?.promptDisposition ? { promptDisposition: options.promptDisposition } : {}),
273
+ ...(options?.preflightResult ? { preflightResult: options.preflightResult } : {}),
274
+ });
275
+ if (property === "abort")
276
+ return () => client.abort();
277
+ if (property === "abortCompaction")
278
+ return () => void client.abortCompaction();
279
+ if (property === "steer")
280
+ return (message, images, recovery) => {
281
+ const enqueueOrder = recovery?.enqueueOrder ?? Math.max(0, ...state.ordered.map((item) => item.enqueueOrder)) + 1;
282
+ state = {
283
+ ...state,
284
+ steering: [...state.steering, message],
285
+ ordered: [...state.ordered, { text: message, mode: "steer", enqueueOrder }],
286
+ pendingMessageCount: state.pendingMessageCount + 1,
287
+ };
288
+ return client.steer(message, images, { ...recovery, enqueueOrder });
289
+ };
290
+ if (property === "followUp")
291
+ return (message, images, recovery) => {
292
+ const enqueueOrder = recovery?.enqueueOrder ?? Math.max(0, ...state.ordered.map((item) => item.enqueueOrder)) + 1;
293
+ state = {
294
+ ...state,
295
+ followUp: [...state.followUp, message],
296
+ ordered: [...state.ordered, { text: message, mode: "followUp", enqueueOrder }],
297
+ pendingMessageCount: state.pendingMessageCount + 1,
298
+ };
299
+ return client.followUp(message, images, { ...recovery, enqueueOrder });
300
+ };
301
+ if (property === "waitForIdle")
302
+ return () => client.waitForIdle();
303
+ if (property === "getLastAssistantText")
304
+ return () => target.getLastAssistantText();
305
+ if (property === "setModel")
306
+ return async (model) => {
307
+ const next = await client.setModel(model.provider, model.id);
308
+ return { systemPromptName: next.systemPromptName, model: next };
309
+ };
310
+ if (property === "cycleModel")
311
+ return () => client.cycleModel();
312
+ if (property === "setThinkingLevel")
313
+ return (level) => void client.setThinkingLevel(level).catch(reportActionFailure("setThinkingLevel"));
314
+ if (property === "cycleThinkingLevel")
315
+ return () => client.cycleThinkingLevel().then((result) => result?.level);
316
+ if (property === "getAvailableThinkingLevels")
317
+ return () => client.getAvailableThinkingLevels();
318
+ if (property === "setSteeringMode")
319
+ return (mode) => void client.setSteeringMode(mode).catch(reportActionFailure("setSteeringMode"));
320
+ if (property === "setFollowUpMode")
321
+ return (mode) => void client.setFollowUpMode(mode).catch(reportActionFailure("setFollowUpMode"));
322
+ if (property === "compact")
323
+ return (instructions) => client.compact(instructions);
324
+ if (property === "setAutoCompactionEnabled")
325
+ return (enabled) => void client.setAutoCompaction(enabled).catch(reportActionFailure("setAutoCompaction"));
326
+ if (property === "executeBash")
327
+ return async (command, onChunk, options) => {
328
+ if (options?.operations && typeof options.operations.exec === "function") {
329
+ const abortController = new AbortController();
330
+ localBashAbortController = abortController;
331
+ localBashRunning = true;
332
+ updateBashState();
333
+ const sessionAtStart = state.sessionId;
334
+ const prefix = settingsManager.getShellCommandPrefix();
335
+ const resolvedCommand = prefix ? `${prefix}\n${command}` : command;
336
+ try {
337
+ const result = await executeBashWithOperations(resolvedCommand, state.cwd, options.operations, { onChunk, signal: abortController.signal });
338
+ if (state.sessionId === sessionAtStart) {
339
+ await client.recordBashResult(command, result, options.excludeFromContext);
340
+ }
341
+ return result;
342
+ }
343
+ finally {
344
+ localBashAbortController = undefined;
345
+ localBashRunning = false;
346
+ updateBashState();
347
+ }
348
+ }
349
+ bashChunk = onChunk;
350
+ try {
351
+ return await client.bash(command, {
352
+ excludeFromContext: options?.excludeFromContext,
353
+ operations: options?.operations,
354
+ });
355
+ }
356
+ finally {
357
+ bashChunk = undefined;
358
+ }
359
+ };
360
+ if (property === "abortBash")
361
+ return () => {
362
+ if (localBashAbortController)
363
+ localBashAbortController.abort();
364
+ else
365
+ void client.abortBash().catch(reportActionFailure("abortBash"));
366
+ };
367
+ if (property === "getSessionStats")
368
+ return () => client.getSessionStats();
369
+ if (property === "exportToHtml")
370
+ return (outputPath) => client.exportHtml(outputPath).then((result) => result.path);
371
+ if (property === "setSessionName")
372
+ return (name) => client.setSessionName(name).catch(reportActionFailure("setSessionName"));
373
+ if (property === "navigateTree")
374
+ return async (targetId, options) => {
375
+ const result = await client.navigateTree(targetId, options);
376
+ if (!result.cancelled)
377
+ await refresh();
378
+ return result;
379
+ };
380
+ if (property === "getUserMessagesForForking")
381
+ return () => client.getForkMessages();
382
+ if (property === "subscribe")
383
+ return (listener) => {
384
+ listeners.add(listener);
385
+ const localUnsubscribe = target.subscribe(listener);
386
+ return () => {
387
+ listeners.delete(listener);
388
+ localUnsubscribe();
389
+ };
390
+ };
391
+ if (property === "isStreaming")
392
+ return state.isStreaming;
393
+ if (property === "isCompacting")
394
+ return state.isCompacting;
395
+ if (property === "pendingMessageCount")
396
+ return state.pendingMessageCount;
397
+ if (property === "getSteeringMessages")
398
+ return () => state.steering;
399
+ if (property === "getFollowUpMessages")
400
+ return () => state.followUp;
401
+ if (property === "clearQueue")
402
+ return (options) => {
403
+ const result = {
404
+ steering: [...state.steering],
405
+ followUp: [...state.followUp],
406
+ ordered: [...state.ordered],
407
+ };
408
+ Object.defineProperty(result, "ordered", { value: result.ordered, enumerable: false });
409
+ void client.clearQueue(options).catch(reportActionFailure("clearQueue"));
410
+ return result;
411
+ };
412
+ if (property === "abortBranchSummary")
413
+ return () => void client.abortBranchSummary().catch(reportActionFailure("abortBranchSummary"));
414
+ if (property === "recordBashResult")
415
+ return (command, result, options) => void client
416
+ .recordBashResult(command, result, options?.excludeFromContext)
417
+ .catch(reportActionFailure("recordBashResult"));
418
+ if (property === "set_label")
419
+ return undefined;
420
+ if (property === "retryAttempt")
421
+ return state.retryAttempt;
422
+ if (property === "isBashRunning")
423
+ return state.isBashRunning;
424
+ if (property === "reload")
425
+ return (_options) => client.reload();
426
+ if (property === "checkReloadVeto")
427
+ return () => client.checkReloadVeto();
428
+ if (property === "exportToJsonl")
429
+ return (outputPath) => client.exportJsonl(outputPath).then((result) => result.path);
430
+ // The footer and other renderers read session.state.*; surface the
431
+ // host-authoritative fields there too, not only via the direct getters.
432
+ if (property === "state") {
433
+ const localState = target.state;
434
+ return {
435
+ ...localState,
436
+ model: state.model ?? localState.model,
437
+ thinkingLevel: state.thinkingLevel,
438
+ isStreaming: state.isStreaming,
439
+ isCompacting: state.isCompacting,
440
+ };
441
+ }
442
+ if (property === "sessionFile")
443
+ return state.sessionFile;
444
+ if (property === "sessionId")
445
+ return state.sessionId;
446
+ if (property === "sessionName")
447
+ return state.sessionName;
448
+ if (property === "sessionManager")
449
+ return remoteSessionManager;
450
+ if (property === "messages")
451
+ return target.messages;
452
+ if (property === "model")
453
+ return state.model ?? target.model;
454
+ if (property === "thinkingLevel")
455
+ return state.thinkingLevel;
456
+ return Reflect.get(target, property, receiver);
457
+ },
458
+ });
459
+ return {
460
+ session,
461
+ refresh,
462
+ abortLocalBash: () => localBashAbortController?.abort(),
463
+ createReplacedSessionContext: () => {
464
+ const context = local.createReplacedSessionContext();
465
+ Object.defineProperty(context, "cwd", { value: state.cwd });
466
+ Object.defineProperty(context, "sessionManager", { value: remoteSessionManager });
467
+ context.sendMessage = (message, options) => client.sendCustomMessage(message, {
468
+ triggerTurn: options?.triggerTurn,
469
+ deliverAs: options?.deliverAs,
470
+ });
471
+ context.sendUserMessage = (content, options) => {
472
+ if (typeof content === "string")
473
+ return client.prompt(content, {
474
+ streamingBehavior: options?.deliverAs,
475
+ expandPromptTemplates: options?.expandPromptTemplates,
476
+ });
477
+ const text = content
478
+ .filter((part) => part.type === "text")
479
+ .map((part) => part.text)
480
+ .join("\n");
481
+ const images = content.filter((part) => part.type === "image");
482
+ return client.prompt(text, {
483
+ images,
484
+ streamingBehavior: options?.deliverAs,
485
+ expandPromptTemplates: options?.expandPromptTemplates,
486
+ });
487
+ };
488
+ return context;
489
+ },
490
+ };
491
+ }
492
+ function hydrateMessageUpdate(event, streamingAssistant) {
493
+ if (event.type !== "message_update" || !streamingAssistant)
494
+ return event;
495
+ const update = event.assistantMessageEvent;
496
+ if (update.type !== "text_delta" && update.type !== "thinking_delta" && update.type !== "toolcall_delta") {
497
+ return event;
498
+ }
499
+ const content = streamingAssistant.content[update.contentIndex];
500
+ if (update.type === "text_delta" && content?.type === "text")
501
+ content.text += update.delta;
502
+ if (update.type === "thinking_delta" && content?.type === "thinking")
503
+ content.thinking += update.delta;
504
+ if (update.type === "toolcall_delta" && content?.type === "toolCall") {
505
+ const raw = JSON.stringify(content.arguments) + update.delta;
506
+ try {
507
+ const parsed = JSON.parse(raw);
508
+ if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) {
509
+ content.arguments = parsed;
510
+ }
511
+ }
512
+ catch {
513
+ // Keep the last valid arguments until the next complete update.
514
+ }
515
+ }
516
+ streamingAssistant.usage = event.usage;
517
+ return {
518
+ type: "message_update",
519
+ message: structuredClone(streamingAssistant),
520
+ assistantMessageEvent: { ...update, partial: structuredClone(streamingAssistant) },
521
+ };
522
+ }
523
+ function stateFromRpc(state) {
524
+ return state;
525
+ }
526
+ export function isInteractiveHostEvent(event) {
527
+ return typeof event === "object" && event !== null && "type" in event;
528
+ }
529
+ //# sourceMappingURL=interactive-host-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive-host-runtime.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-host-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { AgentSession, AgentSessionEvent, AgentSessionEventListener } from \"../../core/agent-session.ts\";\nimport type { AgentSessionRuntime } from \"../../core/agent-session-runtime.ts\";\nimport type { AgentSessionRuntimeDiagnostic } from \"../../core/agent-session-services.ts\";\nimport { executeBashWithOperations } from \"../../core/bash-executor.ts\";\nimport type { ProjectTrustContext, ReplacedSessionContext } from \"../../core/extensions/index.ts\";\nimport { SessionManager } from \"../../core/session-manager.ts\";\nimport { SettingsManager } from \"../../core/settings-manager.ts\";\nimport type { BashOperations } from \"../../core/tools/bash.ts\";\nimport { type EnsuredHost, ensureHost } from \"../rpc/host-ensure.ts\";\nimport { RpcClient, type RpcClientEvent } from \"../rpc/rpc-client.ts\";\n\nexport const INTERACTIVE_HOST_FALLBACK_WARNING = \"Warning: shared interactive host unavailable; continuing locally\";\n\nexport interface InteractiveHostWarning {\n\treadonly type: \"interactive_host_fallback\" | \"interactive_host_action_failed\";\n\treadonly message: string;\n\treadonly cause: unknown;\n}\n\n/**\n * The session contract InteractiveMode actually runs against. The local\n * AgentSession answers these reads synchronously; the shared-host proxy answers\n * them over RPC. Declaring the union here keeps the proxy honest (no more\n * `as unknown as` lie at the boundary) and lets the compiler find every TUI\n * call site that must await.\n */\nexport type InteractiveSession = Omit<\n\tAgentSession,\n\t\"cycleThinkingLevel\" | \"getAvailableThinkingLevels\" | \"getSessionStats\" | \"getUserMessagesForForking\"\n> & {\n\tcycleThinkingLevel(): ThinkingLevel | undefined | Promise<ThinkingLevel | undefined>;\n\tgetAvailableThinkingLevels(): ThinkingLevel[] | Promise<ThinkingLevel[]>;\n\tgetSessionStats():\n\t\t| ReturnType<AgentSession[\"getSessionStats\"]>\n\t\t| Promise<ReturnType<AgentSession[\"getSessionStats\"]>>;\n\tgetUserMessagesForForking():\n\t\t| ReturnType<AgentSession[\"getUserMessagesForForking\"]>\n\t\t| Promise<ReturnType<AgentSession[\"getUserMessagesForForking\"]>>;\n};\n\nexport interface InteractiveHostRuntimeOptions {\n\treadonly socket: string;\n\treadonly agentDir?: string;\n\treadonly ensureHost?: (options: { socket: string; agentDir?: string }) => Promise<EnsuredHost | undefined>;\n\tonWarning?: (warning: InteractiveHostWarning) => void;\n}\n\n/**\n * Replace only the transport-facing session operations. The object returned is\n * deliberately still an AgentSessionRuntime: InteractiveMode and extensions\n * retain their existing runtime seam, while the authoritative prompt/session\n * state is hosted by the shared RPC process.\n */\nexport async function createInteractiveHostRuntime(\n\tlocalRuntime: AgentSessionRuntime,\n\toptions: InteractiveHostRuntimeOptions,\n): Promise<AgentSessionRuntime> {\n\tconst sessionPath = localRuntime.session.sessionFile;\n\tif (!sessionPath) return localRuntime;\n\tconst startHost = options.ensureHost ?? ((hostOptions) => ensureHost(hostOptions));\n\tconst client = new RpcClient({ socketPath: options.socket });\n\ttry {\n\t\tawait startHost({ socket: options.socket, agentDir: options.agentDir });\n\t\tawait client.start();\n\t\tconst opened = await client.openSession({\n\t\t\tsessionPath,\n\t\t\tcwd: localRuntime.cwd,\n\t\t\tprovider: localRuntime.session.model?.provider,\n\t\t\tmodelId: localRuntime.session.model?.id,\n\t\t\tthinkingLevel: localRuntime.session.thinkingLevel,\n\t\t});\n\t\tconst remoteSession = createRemoteSessionProxy(\n\t\t\tlocalRuntime.session,\n\t\t\tlocalRuntime.services.agentDir,\n\t\t\tclient,\n\t\t\topened.state,\n\t\t\toptions.onWarning,\n\t\t);\n\t\treturn new RemoteInteractiveRuntime(localRuntime, remoteSession, client) as unknown as AgentSessionRuntime;\n\t} catch (cause) {\n\t\tawait client.stop().catch(() => {});\n\t\toptions.onWarning?.({\n\t\t\ttype: \"interactive_host_fallback\",\n\t\t\tmessage: `${INTERACTIVE_HOST_FALLBACK_WARNING}: ${cause instanceof Error ? cause.message : String(cause)}`,\n\t\t\tcause,\n\t\t});\n\t\treturn localRuntime;\n\t}\n}\n\nclass RemoteInteractiveRuntime {\n\treadonly #local: AgentSessionRuntime;\n\treadonly #remoteSession: RemoteSessionProxy;\n\treadonly #client: RpcClient;\n\t#rebindSession: (() => Promise<void>) | undefined;\n\t#beforeSessionInvalidate: (() => void) | undefined;\n\n\tconstructor(local: AgentSessionRuntime, remoteSession: RemoteSessionProxy, client: RpcClient) {\n\t\tthis.#local = local;\n\t\tthis.#remoteSession = remoteSession;\n\t\tthis.#client = client;\n\t}\n\n\tget session(): AgentSession {\n\t\treturn this.#remoteSession.session;\n\t}\n\tget services(): AgentSessionRuntime[\"services\"] {\n\t\treturn this.#local.services;\n\t}\n\tget cwd(): string {\n\t\treturn this.#remoteSession.session.sessionManager.getCwd();\n\t}\n\tget diagnostics(): readonly AgentSessionRuntimeDiagnostic[] {\n\t\treturn this.#local.diagnostics;\n\t}\n\tget modelFallbackMessage(): string | undefined {\n\t\treturn this.#local.modelFallbackMessage;\n\t}\n\tget launchProfile(): AgentSessionRuntime[\"launchProfile\"] {\n\t\treturn this.#local.launchProfile;\n\t}\n\tsetBeforeSessionInvalidate(callback?: () => void): void {\n\t\tthis.#beforeSessionInvalidate = callback;\n\t}\n\tsetRebindSession(callback?: () => Promise<void>): void {\n\t\tthis.#rebindSession = callback;\n\t}\n\tasync dispose(): Promise<void> {\n\t\tawait this.#client.closeSession();\n\t\tawait this.#client.stop();\n\t\tawait this.#local.dispose();\n\t}\n\tasync newSession(options?: {\n\t\tparentSession?: string;\n\t\tsetup?: (sessionManager: SessionManager) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }> {\n\t\tconst result = await this.#client.newSession(options?.parentSession);\n\t\tif (!result.cancelled) {\n\t\t\tthis.#beforeSessionInvalidate?.();\n\t\t\tthis.#remoteSession.abortLocalBash();\n\t\t\tawait this.#remoteSession.refresh();\n\t\t\tif (options?.setup) {\n\t\t\t\tconst capture = SessionManager.inMemory(this.#remoteSession.session.sessionManager.getCwd());\n\t\t\t\tawait options.setup(capture);\n\t\t\t\tfor (const entry of capture.getEntries()) await this.#client.appendSessionEntry(entry);\n\t\t\t\tawait this.#remoteSession.refresh();\n\t\t\t}\n\t\t\tawait this.#rebindSession?.();\n\t\t\tif (options?.withSession) await options.withSession(this.#remoteSession.createReplacedSessionContext());\n\t\t}\n\t\treturn result;\n\t}\n\tasync switchSession(\n\t\tsessionPath: string,\n\t\toptions?: {\n\t\t\tcwdOverride?: string;\n\t\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t\t\tprojectTrustContextFactory?: (cwd: string) => ProjectTrustContext;\n\t\t},\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst result = await this.#client.switchSession(sessionPath, options);\n\t\tif (!result.cancelled) {\n\t\t\tthis.#beforeSessionInvalidate?.();\n\t\t\tthis.#remoteSession.abortLocalBash();\n\t\t\tawait this.#remoteSession.refresh();\n\t\t\tawait this.#rebindSession?.();\n\t\t\t// The shared host already resolved trust; this callback is retained for\n\t\t\t// compatibility, but its result cannot override host-authoritative state.\n\t\t\toptions?.projectTrustContextFactory?.(this.#remoteSession.session.sessionManager.getCwd());\n\t\t\tif (options?.withSession) await options.withSession(this.#remoteSession.createReplacedSessionContext());\n\t\t}\n\t\treturn result;\n\t}\n\tasync fork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }> {\n\t\tconst result = await this.#client.fork(entryId, options);\n\t\tif (!result.cancelled) {\n\t\t\tthis.#beforeSessionInvalidate?.();\n\t\t\tthis.#remoteSession.abortLocalBash();\n\t\t\tawait this.#refreshAndRebind();\n\t\t\tif (options?.withSession) await options.withSession(this.#remoteSession.createReplacedSessionContext());\n\t\t}\n\t\treturn { cancelled: result.cancelled, selectedText: result.text };\n\t}\n\tasync importFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }> {\n\t\tconst result = await this.#client.importJsonl(inputPath, cwdOverride);\n\t\tif (!result.cancelled) {\n\t\t\tthis.#beforeSessionInvalidate?.();\n\t\t\tthis.#remoteSession.abortLocalBash();\n\t\t\tawait this.#refreshAndRebind();\n\t\t}\n\t\treturn result;\n\t}\n\n\tasync #refreshAndRebind(): Promise<void> {\n\t\tawait this.#remoteSession.refresh();\n\t\tawait this.#rebindSession?.();\n\t}\n}\n\ninterface RemoteSessionProxy {\n\treadonly session: AgentSession;\n\trefresh(): Promise<void>;\n\tabortLocalBash(): void;\n\tcreateReplacedSessionContext(): ReplacedSessionContext;\n}\n\nfunction createRemoteSessionProxy(\n\tlocal: AgentSession,\n\tagentDir: string,\n\tclient: RpcClient,\n\tinitialState: ReturnType<typeof stateFromRpc>,\n\tonWarning?: (warning: InteractiveHostWarning) => void,\n): RemoteSessionProxy {\n\t// Fire-and-forget setters keep the sync AgentSession signature, but their RPC\n\t// failures must not vanish: the matching *_changed wire event confirms success,\n\t// and a rejection here is the only signal of failure.\n\tconst reportActionFailure = (action: string) => (error: unknown) => {\n\t\tonWarning?.({\n\t\t\ttype: \"interactive_host_action_failed\",\n\t\t\tmessage: `Warning: shared interactive host ${action} failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\tcause: error,\n\t\t});\n\t};\n\tlet state = { ...initialState };\n\tlet bashChunk: ((chunk: string) => void) | undefined;\n\tlet localBashAbortController: AbortController | undefined;\n\tlet localBashRunning = false;\n\tlet hostBashRunning = initialState.isBashRunning;\n\tlet sessionManager = local.sessionManager;\n\tlet settingsManager = SettingsManager.create(initialState.cwd, agentDir, {\n\t\tprojectTrusted: initialState.projectTrusted,\n\t});\n\tconst updateBashState = () => {\n\t\tstate = { ...state, isBashRunning: localBashRunning || hostBashRunning };\n\t};\n\tconst remoteSessionManager = new Proxy({} as SessionManager, {\n\t\tget(_target, property, _receiver) {\n\t\t\tif (property === \"appendLabelChange\") {\n\t\t\t\treturn (entryId: string, label?: string) => void client.setLabel(entryId, label);\n\t\t\t}\n\t\t\tif (property === \"getSessionName\") return () => state.sessionName;\n\t\t\tconst value = Reflect.get(sessionManager, property, sessionManager);\n\t\t\treturn typeof value === \"function\" ? value.bind(sessionManager) : value;\n\t\t},\n\t});\n\tlet streamingAssistant: Extract<AgentSession[\"messages\"][number], { role: \"assistant\" }> | undefined;\n\tconst listeners = new Set<AgentSessionEventListener>();\n\tclient.onEvent((wireEvent) => {\n\t\tif (wireEvent.type === \"agent_settled\") state = { ...state, isStreaming: false, retryAttempt: 0 };\n\t\tif (wireEvent.type === \"bash_start\") {\n\t\t\thostBashRunning = true;\n\t\t\tupdateBashState();\n\t\t}\n\t\tif (wireEvent.type === \"bash_end\") {\n\t\t\thostBashRunning = false;\n\t\t\tupdateBashState();\n\t\t}\n\t\tif (wireEvent.type === \"bash_execution_update\") bashChunk?.(wireEvent.delta);\n\t\tif (wireEvent.type === \"agent_start\") state = { ...state, isStreaming: true };\n\t\tif (wireEvent.type === \"compaction_start\") state = { ...state, isCompacting: true };\n\t\tif (wireEvent.type === \"compaction_end\") state = { ...state, isCompacting: false };\n\t\tif (wireEvent.type === \"auto_retry_start\") state = { ...state, retryAttempt: wireEvent.attempt };\n\t\tif (wireEvent.type === \"auto_retry_end\") state = { ...state, retryAttempt: 0 };\n\t\tif (wireEvent.type === \"queue_update\") {\n\t\t\tstate = {\n\t\t\t\t...state,\n\t\t\t\tsteering: [...wireEvent.steering],\n\t\t\t\tfollowUp: [...wireEvent.followUp],\n\t\t\t\tordered: [...wireEvent.ordered],\n\t\t\t\tpendingMessageCount: wireEvent.steering.length + wireEvent.followUp.length,\n\t\t\t};\n\t\t}\n\t\tif (wireEvent.type === \"model_changed\") {\n\t\t\tstate = { ...state, model: wireEvent.model, thinkingLevel: wireEvent.thinkingLevel };\n\t\t}\n\t\tif (wireEvent.type === \"thinking_level_changed\") state = { ...state, thinkingLevel: wireEvent.level };\n\t\tif (wireEvent.type === \"session_info_changed\") state = { ...state, sessionName: wireEvent.name };\n\t\tif (wireEvent.type === \"message_start\") {\n\t\t\tif (wireEvent.message.role === \"assistant\") streamingAssistant = structuredClone(wireEvent.message);\n\t\t\tlocal.agent.state.messages.push(structuredClone(wireEvent.message));\n\t\t}\n\t\tif (wireEvent.type === \"message_end\") {\n\t\t\tif (wireEvent.message.role === \"assistant\") streamingAssistant = structuredClone(wireEvent.message);\n\t\t\tconst messages = local.agent.state.messages;\n\t\t\tconst previous = messages.at(-1);\n\t\t\tif (previous?.role === wireEvent.message.role)\n\t\t\t\tmessages[messages.length - 1] = structuredClone(wireEvent.message);\n\t\t}\n\t\tif (wireEvent.type === \"compaction_end\" && wireEvent.accepted && !wireEvent.aborted) {\n\t\t\ttry {\n\t\t\t\tsessionManager.reloadFromDisk?.();\n\t\t\t\tlocal.agent.state.messages = sessionManager.buildSessionContext().messages;\n\t\t\t} catch {\n\t\t\t\t// Non-fatal if session file is transiently locked or unavailable\n\t\t\t}\n\t\t}\n\t\tconst event = hydrateMessageUpdate(wireEvent, streamingAssistant);\n\t\tfor (const listener of listeners) listener(event);\n\t});\n\tconst refresh = async (): Promise<void> => {\n\t\tconst nextState = await client.getState();\n\t\tstate = { ...stateFromRpc(nextState) };\n\t\tlet messages: AgentSession[\"messages\"];\n\t\tsettingsManager = SettingsManager.create(nextState.cwd, agentDir, {\n\t\t\tprojectTrusted: nextState.projectTrusted,\n\t\t});\n\t\tif (nextState.sessionFile) {\n\t\t\t// SessionManager.open retains the explicit path even when the host has\n\t\t\t// deferred creating the file for a setup-only session.\n\t\t\tsessionManager = SessionManager.open(nextState.sessionFile, undefined, nextState.cwd);\n\t\t\tif (nextState.entries?.length && !sessionManager.getEntries().length) {\n\t\t\t\tfor (const entry of nextState.entries) sessionManager.appendEntry(entry);\n\t\t\t}\n\t\t\tmessages = sessionManager.buildSessionContext().messages;\n\t\t} else {\n\t\t\tmessages = await client.getMessages();\n\t\t}\n\t\tlocal.agent.state.messages.splice(0, local.agent.state.messages.length, ...structuredClone(messages));\n\t\tstreamingAssistant = undefined;\n\t};\n\tconst session = new Proxy(local, {\n\t\tget(target, property, receiver) {\n\t\t\tif (property === \"prompt\")\n\t\t\t\treturn (message: string, options?: Parameters<AgentSession[\"prompt\"]>[1]) =>\n\t\t\t\t\tclient.prompt(message, {\n\t\t\t\t\t\t...(options?.images ? { images: options.images } : {}),\n\t\t\t\t\t\t...(options?.streamingBehavior ? { streamingBehavior: options.streamingBehavior } : {}),\n\t\t\t\t\t\t...(options?.thinkingLevel ? { thinkingLevel: options.thinkingLevel } : {}),\n\t\t\t\t\t\t...(options?.promptDisposition ? { promptDisposition: options.promptDisposition } : {}),\n\t\t\t\t\t\t...(options?.preflightResult ? { preflightResult: options.preflightResult } : {}),\n\t\t\t\t\t});\n\t\t\tif (property === \"abort\") return () => client.abort();\n\t\t\tif (property === \"abortCompaction\") return () => void client.abortCompaction();\n\t\t\tif (property === \"steer\")\n\t\t\t\treturn (\n\t\t\t\t\tmessage: string,\n\t\t\t\t\timages?: Parameters<AgentSession[\"steer\"]>[1],\n\t\t\t\t\trecovery?: { enqueueOrder?: number },\n\t\t\t\t) => {\n\t\t\t\t\tconst enqueueOrder =\n\t\t\t\t\t\trecovery?.enqueueOrder ?? Math.max(0, ...state.ordered.map((item) => item.enqueueOrder)) + 1;\n\t\t\t\t\tstate = {\n\t\t\t\t\t\t...state,\n\t\t\t\t\t\tsteering: [...state.steering, message],\n\t\t\t\t\t\tordered: [...state.ordered, { text: message, mode: \"steer\", enqueueOrder }],\n\t\t\t\t\t\tpendingMessageCount: state.pendingMessageCount + 1,\n\t\t\t\t\t};\n\t\t\t\t\treturn client.steer(message, images, { ...recovery, enqueueOrder });\n\t\t\t\t};\n\t\t\tif (property === \"followUp\")\n\t\t\t\treturn (\n\t\t\t\t\tmessage: string,\n\t\t\t\t\timages?: Parameters<AgentSession[\"followUp\"]>[1],\n\t\t\t\t\trecovery?: { enqueueOrder?: number },\n\t\t\t\t) => {\n\t\t\t\t\tconst enqueueOrder =\n\t\t\t\t\t\trecovery?.enqueueOrder ?? Math.max(0, ...state.ordered.map((item) => item.enqueueOrder)) + 1;\n\t\t\t\t\tstate = {\n\t\t\t\t\t\t...state,\n\t\t\t\t\t\tfollowUp: [...state.followUp, message],\n\t\t\t\t\t\tordered: [...state.ordered, { text: message, mode: \"followUp\", enqueueOrder }],\n\t\t\t\t\t\tpendingMessageCount: state.pendingMessageCount + 1,\n\t\t\t\t\t};\n\t\t\t\t\treturn client.followUp(message, images, { ...recovery, enqueueOrder });\n\t\t\t\t};\n\t\t\tif (property === \"waitForIdle\") return () => client.waitForIdle();\n\t\t\tif (property === \"getLastAssistantText\") return () => target.getLastAssistantText();\n\t\t\tif (property === \"setModel\")\n\t\t\t\treturn async (model: NonNullable<AgentSession[\"model\"]>) => {\n\t\t\t\t\tconst next = await client.setModel(model.provider, model.id);\n\t\t\t\t\treturn { systemPromptName: next.systemPromptName, model: next };\n\t\t\t\t};\n\t\t\tif (property === \"cycleModel\") return () => client.cycleModel();\n\t\t\tif (property === \"setThinkingLevel\")\n\t\t\t\treturn (level: AgentSession[\"thinkingLevel\"]) =>\n\t\t\t\t\tvoid client.setThinkingLevel(level).catch(reportActionFailure(\"setThinkingLevel\"));\n\t\t\tif (property === \"cycleThinkingLevel\")\n\t\t\t\treturn () => client.cycleThinkingLevel().then((result) => result?.level);\n\t\t\tif (property === \"getAvailableThinkingLevels\") return () => client.getAvailableThinkingLevels();\n\t\t\tif (property === \"setSteeringMode\")\n\t\t\t\treturn (mode: AgentSession[\"steeringMode\"]) =>\n\t\t\t\t\tvoid client.setSteeringMode(mode).catch(reportActionFailure(\"setSteeringMode\"));\n\t\t\tif (property === \"setFollowUpMode\")\n\t\t\t\treturn (mode: AgentSession[\"followUpMode\"]) =>\n\t\t\t\t\tvoid client.setFollowUpMode(mode).catch(reportActionFailure(\"setFollowUpMode\"));\n\t\t\tif (property === \"compact\") return (instructions?: string) => client.compact(instructions);\n\t\t\tif (property === \"setAutoCompactionEnabled\")\n\t\t\t\treturn (enabled: boolean) =>\n\t\t\t\t\tvoid client.setAutoCompaction(enabled).catch(reportActionFailure(\"setAutoCompaction\"));\n\t\t\tif (property === \"executeBash\")\n\t\t\t\treturn async (\n\t\t\t\t\tcommand: string,\n\t\t\t\t\tonChunk?: (chunk: string) => void,\n\t\t\t\t\toptions?: { excludeFromContext?: boolean; operations?: BashOperations | Record<string, unknown> },\n\t\t\t\t) => {\n\t\t\t\t\tif (options?.operations && typeof options.operations.exec === \"function\") {\n\t\t\t\t\t\tconst abortController = new AbortController();\n\t\t\t\t\t\tlocalBashAbortController = abortController;\n\t\t\t\t\t\tlocalBashRunning = true;\n\t\t\t\t\t\tupdateBashState();\n\t\t\t\t\t\tconst sessionAtStart = state.sessionId;\n\t\t\t\t\t\tconst prefix = settingsManager.getShellCommandPrefix();\n\t\t\t\t\t\tconst resolvedCommand = prefix ? `${prefix}\\n${command}` : command;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst result = await executeBashWithOperations(\n\t\t\t\t\t\t\t\tresolvedCommand,\n\t\t\t\t\t\t\t\tstate.cwd,\n\t\t\t\t\t\t\t\toptions.operations as BashOperations,\n\t\t\t\t\t\t\t\t{ onChunk, signal: abortController.signal },\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (state.sessionId === sessionAtStart) {\n\t\t\t\t\t\t\t\tawait client.recordBashResult(command, result, options.excludeFromContext);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tlocalBashAbortController = undefined;\n\t\t\t\t\t\t\tlocalBashRunning = false;\n\t\t\t\t\t\t\tupdateBashState();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbashChunk = onChunk;\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn await client.bash(command, {\n\t\t\t\t\t\t\texcludeFromContext: options?.excludeFromContext,\n\t\t\t\t\t\t\toperations: options?.operations as Record<string, unknown> | undefined,\n\t\t\t\t\t\t});\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tbashChunk = undefined;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\tif (property === \"abortBash\")\n\t\t\t\treturn () => {\n\t\t\t\t\tif (localBashAbortController) localBashAbortController.abort();\n\t\t\t\t\telse void client.abortBash().catch(reportActionFailure(\"abortBash\"));\n\t\t\t\t};\n\t\t\tif (property === \"getSessionStats\") return () => client.getSessionStats();\n\t\t\tif (property === \"exportToHtml\")\n\t\t\t\treturn (outputPath?: string) => client.exportHtml(outputPath).then((result) => result.path);\n\t\t\tif (property === \"setSessionName\")\n\t\t\t\treturn (name: string) => client.setSessionName(name).catch(reportActionFailure(\"setSessionName\"));\n\t\t\tif (property === \"navigateTree\")\n\t\t\t\treturn async (targetId: string, options?: Parameters<AgentSession[\"navigateTree\"]>[1]) => {\n\t\t\t\t\tconst result = await client.navigateTree(targetId, options);\n\t\t\t\t\tif (!result.cancelled) await refresh();\n\t\t\t\t\treturn result;\n\t\t\t\t};\n\t\t\tif (property === \"getUserMessagesForForking\") return () => client.getForkMessages();\n\t\t\tif (property === \"subscribe\")\n\t\t\t\treturn (listener: AgentSessionEventListener) => {\n\t\t\t\t\tlisteners.add(listener);\n\t\t\t\t\tconst localUnsubscribe = target.subscribe(listener);\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tlisteners.delete(listener);\n\t\t\t\t\t\tlocalUnsubscribe();\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\tif (property === \"isStreaming\") return state.isStreaming;\n\t\t\tif (property === \"isCompacting\") return state.isCompacting;\n\t\t\tif (property === \"pendingMessageCount\") return state.pendingMessageCount;\n\t\t\tif (property === \"getSteeringMessages\") return () => state.steering;\n\t\t\tif (property === \"getFollowUpMessages\") return () => state.followUp;\n\t\t\tif (property === \"clearQueue\")\n\t\t\t\treturn (options?: { abortWillFollow: boolean }) => {\n\t\t\t\t\tconst result = {\n\t\t\t\t\t\tsteering: [...state.steering],\n\t\t\t\t\t\tfollowUp: [...state.followUp],\n\t\t\t\t\t\tordered: [...state.ordered],\n\t\t\t\t\t};\n\t\t\t\t\tObject.defineProperty(result, \"ordered\", { value: result.ordered, enumerable: false });\n\t\t\t\t\tvoid client.clearQueue(options).catch(reportActionFailure(\"clearQueue\"));\n\t\t\t\t\treturn result;\n\t\t\t\t};\n\t\t\tif (property === \"abortBranchSummary\")\n\t\t\t\treturn () => void client.abortBranchSummary().catch(reportActionFailure(\"abortBranchSummary\"));\n\t\t\tif (property === \"recordBashResult\")\n\t\t\t\treturn (\n\t\t\t\t\tcommand: string,\n\t\t\t\t\tresult: Parameters<AgentSession[\"recordBashResult\"]>[1],\n\t\t\t\t\toptions?: { excludeFromContext?: boolean },\n\t\t\t\t) =>\n\t\t\t\t\tvoid client\n\t\t\t\t\t\t.recordBashResult(command, result, options?.excludeFromContext)\n\t\t\t\t\t\t.catch(reportActionFailure(\"recordBashResult\"));\n\t\t\tif (property === \"set_label\") return undefined;\n\t\t\tif (property === \"retryAttempt\") return state.retryAttempt;\n\t\t\tif (property === \"isBashRunning\") return state.isBashRunning;\n\t\t\tif (property === \"reload\") return (_options?: Parameters<AgentSession[\"reload\"]>[0]) => client.reload();\n\t\t\tif (property === \"checkReloadVeto\") return () => client.checkReloadVeto();\n\t\t\tif (property === \"exportToJsonl\")\n\t\t\t\treturn (outputPath?: string) => client.exportJsonl(outputPath).then((result) => result.path);\n\t\t\t// The footer and other renderers read session.state.*; surface the\n\t\t\t// host-authoritative fields there too, not only via the direct getters.\n\t\t\tif (property === \"state\") {\n\t\t\t\tconst localState = target.state;\n\t\t\t\treturn {\n\t\t\t\t\t...localState,\n\t\t\t\t\tmodel: state.model ?? localState.model,\n\t\t\t\t\tthinkingLevel: state.thinkingLevel,\n\t\t\t\t\tisStreaming: state.isStreaming,\n\t\t\t\t\tisCompacting: state.isCompacting,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (property === \"sessionFile\") return state.sessionFile;\n\t\t\tif (property === \"sessionId\") return state.sessionId;\n\t\t\tif (property === \"sessionName\") return state.sessionName;\n\t\t\tif (property === \"sessionManager\") return remoteSessionManager;\n\t\t\tif (property === \"messages\") return target.messages;\n\t\t\tif (property === \"model\") return state.model ?? target.model;\n\t\t\tif (property === \"thinkingLevel\") return state.thinkingLevel;\n\t\t\treturn Reflect.get(target, property, receiver);\n\t\t},\n\t});\n\treturn {\n\t\tsession,\n\t\trefresh,\n\t\tabortLocalBash: () => localBashAbortController?.abort(),\n\t\tcreateReplacedSessionContext: () => {\n\t\t\tconst context = local.createReplacedSessionContext();\n\t\t\tObject.defineProperty(context, \"cwd\", { value: state.cwd });\n\t\t\tObject.defineProperty(context, \"sessionManager\", { value: remoteSessionManager });\n\t\t\tcontext.sendMessage = (message, options) =>\n\t\t\t\tclient.sendCustomMessage(message, {\n\t\t\t\t\ttriggerTurn: options?.triggerTurn,\n\t\t\t\t\tdeliverAs: options?.deliverAs,\n\t\t\t\t});\n\t\t\tcontext.sendUserMessage = (content, options) => {\n\t\t\t\tif (typeof content === \"string\")\n\t\t\t\t\treturn client.prompt(content, {\n\t\t\t\t\t\tstreamingBehavior: options?.deliverAs,\n\t\t\t\t\t\texpandPromptTemplates: options?.expandPromptTemplates,\n\t\t\t\t\t});\n\t\t\t\tconst text = content\n\t\t\t\t\t.filter((part) => part.type === \"text\")\n\t\t\t\t\t.map((part) => part.text)\n\t\t\t\t\t.join(\"\\n\");\n\t\t\t\tconst images = content.filter((part) => part.type === \"image\");\n\t\t\t\treturn client.prompt(text, {\n\t\t\t\t\timages,\n\t\t\t\t\tstreamingBehavior: options?.deliverAs,\n\t\t\t\t\texpandPromptTemplates: options?.expandPromptTemplates,\n\t\t\t\t});\n\t\t\t};\n\t\t\treturn context;\n\t\t},\n\t};\n}\n\nfunction hydrateMessageUpdate(\n\tevent: RpcClientEvent,\n\tstreamingAssistant: Extract<AgentSession[\"messages\"][number], { role: \"assistant\" }> | undefined,\n): AgentSessionEvent {\n\tif (event.type !== \"message_update\" || !streamingAssistant) return event as unknown as AgentSessionEvent;\n\tconst update = event.assistantMessageEvent;\n\tif (update.type !== \"text_delta\" && update.type !== \"thinking_delta\" && update.type !== \"toolcall_delta\") {\n\t\treturn event as unknown as AgentSessionEvent;\n\t}\n\tconst content = streamingAssistant.content[update.contentIndex];\n\tif (update.type === \"text_delta\" && content?.type === \"text\") content.text += update.delta;\n\tif (update.type === \"thinking_delta\" && content?.type === \"thinking\") content.thinking += update.delta;\n\tif (update.type === \"toolcall_delta\" && content?.type === \"toolCall\") {\n\t\tconst raw = JSON.stringify(content.arguments) + update.delta;\n\t\ttry {\n\t\t\tconst parsed: unknown = JSON.parse(raw);\n\t\t\tif (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n\t\t\t\tcontent.arguments = parsed as Record<string, unknown>;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Keep the last valid arguments until the next complete update.\n\t\t}\n\t}\n\tstreamingAssistant.usage = event.usage;\n\treturn {\n\t\ttype: \"message_update\",\n\t\tmessage: structuredClone(streamingAssistant),\n\t\tassistantMessageEvent: { ...update, partial: structuredClone(streamingAssistant) },\n\t} as AgentSessionEvent;\n}\n\nfunction stateFromRpc(state: {\n\tmodel?: AgentSession[\"model\"];\n\tthinkingLevel: AgentSession[\"thinkingLevel\"];\n\tisStreaming: boolean;\n\tisCompacting: boolean;\n\tpendingMessageCount: number;\n\tretryAttempt: number;\n\tisBashRunning: boolean;\n\tsessionFile?: string;\n\tsessionId: string;\n\tsessionName?: string;\n\tcwd: string;\n\tprojectTrusted: boolean;\n\tentries?: import(\"../../core/session-manager.ts\").SessionEntry[];\n\tsteering: string[];\n\tfollowUp: string[];\n\tordered: Array<{ text: string; mode: \"steer\" | \"followUp\"; enqueueOrder: number }>;\n}) {\n\treturn state;\n}\n\nexport function isInteractiveHostEvent(event: RpcClientEvent): event is Extract<RpcClientEvent, { type: string }> {\n\treturn typeof event === \"object\" && event !== null && \"type\" in event;\n}\n"]}