@sheason/pi-coding-agent 0.74.1-sheason.0 → 0.78.0-sheason.0.6.0-alpha.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 (516) hide show
  1. package/CHANGELOG.md +256 -4
  2. package/README.md +16 -8
  3. package/dist/bun/cli.d.ts.map +1 -1
  4. package/dist/bun/cli.js.map +1 -1
  5. package/dist/cli/args.d.ts +7 -2
  6. package/dist/cli/args.d.ts.map +1 -1
  7. package/dist/cli/args.js +49 -1
  8. package/dist/cli/args.js.map +1 -1
  9. package/dist/cli/config-selector.d.ts +2 -2
  10. package/dist/cli/config-selector.d.ts.map +1 -1
  11. package/dist/cli/config-selector.js +1 -1
  12. package/dist/cli/config-selector.js.map +1 -1
  13. package/dist/cli/file-processor.d.ts.map +1 -1
  14. package/dist/cli/file-processor.js +2 -3
  15. package/dist/cli/file-processor.js.map +1 -1
  16. package/dist/cli/initial-message.d.ts +1 -1
  17. package/dist/cli/initial-message.d.ts.map +1 -1
  18. package/dist/cli/initial-message.js.map +1 -1
  19. package/dist/cli/list-models.d.ts +1 -1
  20. package/dist/cli/list-models.d.ts.map +1 -1
  21. package/dist/cli/list-models.js.map +1 -1
  22. package/dist/cli/session-picker.d.ts +1 -1
  23. package/dist/cli/session-picker.d.ts.map +1 -1
  24. package/dist/cli/session-picker.js.map +1 -1
  25. package/dist/cli.d.ts.map +1 -1
  26. package/dist/cli.js +4 -6
  27. package/dist/cli.js.map +1 -1
  28. package/dist/config.d.ts.map +1 -1
  29. package/dist/config.js +61 -32
  30. package/dist/config.js.map +1 -1
  31. package/dist/core/agent-session-proxy.d.ts +268 -0
  32. package/dist/core/agent-session-proxy.d.ts.map +1 -0
  33. package/dist/core/agent-session-proxy.js +2 -0
  34. package/dist/core/agent-session-proxy.js.map +1 -0
  35. package/dist/core/agent-session-runtime.d.ts +10 -10
  36. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  37. package/dist/core/agent-session-runtime.js +14 -14
  38. package/dist/core/agent-session-runtime.js.map +1 -1
  39. package/dist/core/agent-session-services.d.ts +8 -7
  40. package/dist/core/agent-session-services.d.ts.map +1 -1
  41. package/dist/core/agent-session-services.js +4 -2
  42. package/dist/core/agent-session-services.js.map +1 -1
  43. package/dist/core/agent-session.d.ts +60 -27
  44. package/dist/core/agent-session.d.ts.map +1 -1
  45. package/dist/core/agent-session.js +303 -177
  46. package/dist/core/agent-session.js.map +1 -1
  47. package/dist/core/auth-guidance.d.ts.map +1 -1
  48. package/dist/core/auth-guidance.js.map +1 -1
  49. package/dist/core/auth-storage.d.ts +1 -1
  50. package/dist/core/auth-storage.d.ts.map +1 -1
  51. package/dist/core/auth-storage.js +3 -2
  52. package/dist/core/auth-storage.js.map +1 -1
  53. package/dist/core/bash-executor.d.ts +1 -1
  54. package/dist/core/bash-executor.d.ts.map +1 -1
  55. package/dist/core/bash-executor.js.map +1 -1
  56. package/dist/core/compaction/branch-summarization.d.ts +3 -3
  57. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  58. package/dist/core/compaction/branch-summarization.js.map +1 -1
  59. package/dist/core/compaction/compaction.d.ts +5 -5
  60. package/dist/core/compaction/compaction.d.ts.map +1 -1
  61. package/dist/core/compaction/compaction.js +41 -37
  62. package/dist/core/compaction/compaction.js.map +1 -1
  63. package/dist/core/compaction/index.d.ts +3 -3
  64. package/dist/core/compaction/index.d.ts.map +1 -1
  65. package/dist/core/compaction/index.js.map +1 -1
  66. package/dist/core/exec.d.ts.map +1 -1
  67. package/dist/core/exec.js.map +1 -1
  68. package/dist/core/export-html/index.d.ts +1 -1
  69. package/dist/core/export-html/index.d.ts.map +1 -1
  70. package/dist/core/export-html/index.js +8 -6
  71. package/dist/core/export-html/index.js.map +1 -1
  72. package/dist/core/export-html/template.js +23 -6
  73. package/dist/core/export-html/tool-renderer.d.ts +2 -2
  74. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  75. package/dist/core/export-html/tool-renderer.js.map +1 -1
  76. package/dist/core/extensions/index.d.ts +8 -8
  77. package/dist/core/extensions/index.d.ts.map +1 -1
  78. package/dist/core/extensions/index.js.map +1 -1
  79. package/dist/core/extensions/loader.d.ts +2 -2
  80. package/dist/core/extensions/loader.d.ts.map +1 -1
  81. package/dist/core/extensions/loader.js +17 -34
  82. package/dist/core/extensions/loader.js.map +1 -1
  83. package/dist/core/extensions/runner.d.ts +12 -7
  84. package/dist/core/extensions/runner.d.ts.map +1 -1
  85. package/dist/core/extensions/runner.js +36 -2
  86. package/dist/core/extensions/runner.js.map +1 -1
  87. package/dist/core/extensions/types.d.ts +26 -24
  88. package/dist/core/extensions/types.d.ts.map +1 -1
  89. package/dist/core/extensions/types.js.map +1 -1
  90. package/dist/core/extensions/wrapper.d.ts +2 -2
  91. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  92. package/dist/core/extensions/wrapper.js.map +1 -1
  93. package/dist/core/footer-data-provider.d.ts +3 -1
  94. package/dist/core/footer-data-provider.d.ts.map +1 -1
  95. package/dist/core/footer-data-provider.js +4 -0
  96. package/dist/core/footer-data-provider.js.map +1 -1
  97. package/dist/core/http-dispatcher.d.ts +21 -0
  98. package/dist/core/http-dispatcher.d.ts.map +1 -0
  99. package/dist/core/http-dispatcher.js +48 -0
  100. package/dist/core/http-dispatcher.js.map +1 -0
  101. package/dist/core/index.d.ts +8 -8
  102. package/dist/core/index.d.ts.map +1 -1
  103. package/dist/core/index.js.map +1 -1
  104. package/dist/core/keybindings.d.ts.map +1 -1
  105. package/dist/core/keybindings.js.map +1 -1
  106. package/dist/core/local-agent-session-proxy.d.ts +82 -0
  107. package/dist/core/local-agent-session-proxy.d.ts.map +1 -0
  108. package/dist/core/local-agent-session-proxy.js +531 -0
  109. package/dist/core/local-agent-session-proxy.js.map +1 -0
  110. package/dist/core/messages.d.ts +0 -9
  111. package/dist/core/messages.d.ts.map +1 -1
  112. package/dist/core/messages.js +0 -10
  113. package/dist/core/messages.js.map +1 -1
  114. package/dist/core/model-registry.d.ts +4 -4
  115. package/dist/core/model-registry.d.ts.map +1 -1
  116. package/dist/core/model-registry.js +72 -16
  117. package/dist/core/model-registry.js.map +1 -1
  118. package/dist/core/model-resolver.d.ts +1 -1
  119. package/dist/core/model-resolver.d.ts.map +1 -1
  120. package/dist/core/model-resolver.js +1 -1
  121. package/dist/core/model-resolver.js.map +1 -1
  122. package/dist/core/output-guard.d.ts +1 -0
  123. package/dist/core/output-guard.d.ts.map +1 -1
  124. package/dist/core/output-guard.js +52 -22
  125. package/dist/core/output-guard.js.map +1 -1
  126. package/dist/core/package-manager.d.ts +7 -1
  127. package/dist/core/package-manager.d.ts.map +1 -1
  128. package/dist/core/package-manager.js +129 -64
  129. package/dist/core/package-manager.js.map +1 -1
  130. package/dist/core/prompt-templates.d.ts +1 -1
  131. package/dist/core/prompt-templates.d.ts.map +1 -1
  132. package/dist/core/prompt-templates.js +12 -24
  133. package/dist/core/prompt-templates.js.map +1 -1
  134. package/dist/core/provider-display-names.d.ts.map +1 -1
  135. package/dist/core/provider-display-names.js +0 -1
  136. package/dist/core/provider-display-names.js.map +1 -1
  137. package/dist/core/resolve-config-value.d.ts +9 -1
  138. package/dist/core/resolve-config-value.d.ts.map +1 -1
  139. package/dist/core/resolve-config-value.js +134 -11
  140. package/dist/core/resolve-config-value.js.map +1 -1
  141. package/dist/core/resource-loader.d.ts +13 -10
  142. package/dist/core/resource-loader.d.ts.map +1 -1
  143. package/dist/core/resource-loader.js +41 -33
  144. package/dist/core/resource-loader.js.map +1 -1
  145. package/dist/core/sdk.d.ts +15 -13
  146. package/dist/core/sdk.d.ts.map +1 -1
  147. package/dist/core/sdk.js +24 -17
  148. package/dist/core/sdk.js.map +1 -1
  149. package/dist/core/session-manager.d.ts +20 -10
  150. package/dist/core/session-manager.d.ts.map +1 -1
  151. package/dist/core/session-manager.js +201 -106
  152. package/dist/core/session-manager.js.map +1 -1
  153. package/dist/core/settings-manager.d.ts +5 -0
  154. package/dist/core/settings-manager.d.ts.map +1 -1
  155. package/dist/core/settings-manager.js +31 -13
  156. package/dist/core/settings-manager.js.map +1 -1
  157. package/dist/core/skills.d.ts +2 -2
  158. package/dist/core/skills.d.ts.map +1 -1
  159. package/dist/core/skills.js +10 -27
  160. package/dist/core/skills.js.map +1 -1
  161. package/dist/core/slash-commands.d.ts +1 -1
  162. package/dist/core/slash-commands.d.ts.map +1 -1
  163. package/dist/core/slash-commands.js.map +1 -1
  164. package/dist/core/source-info.d.ts +1 -1
  165. package/dist/core/source-info.d.ts.map +1 -1
  166. package/dist/core/source-info.js.map +1 -1
  167. package/dist/core/system-prompt.d.ts +1 -1
  168. package/dist/core/system-prompt.d.ts.map +1 -1
  169. package/dist/core/system-prompt.js +16 -9
  170. package/dist/core/system-prompt.js.map +1 -1
  171. package/dist/core/telemetry.d.ts +1 -1
  172. package/dist/core/telemetry.d.ts.map +1 -1
  173. package/dist/core/telemetry.js.map +1 -1
  174. package/dist/core/tools/bash.d.ts +2 -2
  175. package/dist/core/tools/bash.d.ts.map +1 -1
  176. package/dist/core/tools/bash.js +55 -54
  177. package/dist/core/tools/bash.js.map +1 -1
  178. package/dist/core/tools/edit-diff.d.ts +3 -1
  179. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  180. package/dist/core/tools/edit-diff.js +8 -1
  181. package/dist/core/tools/edit-diff.js.map +1 -1
  182. package/dist/core/tools/edit.d.ts +5 -3
  183. package/dist/core/tools/edit.d.ts.map +1 -1
  184. package/dist/core/tools/edit.js +51 -91
  185. package/dist/core/tools/edit.js.map +1 -1
  186. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  187. package/dist/core/tools/file-mutation-queue.js +27 -12
  188. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  189. package/dist/core/tools/find.d.ts +2 -2
  190. package/dist/core/tools/find.d.ts.map +1 -1
  191. package/dist/core/tools/find.js +2 -3
  192. package/dist/core/tools/find.js.map +1 -1
  193. package/dist/core/tools/grep.d.ts +2 -2
  194. package/dist/core/tools/grep.d.ts.map +1 -1
  195. package/dist/core/tools/grep.js +3 -3
  196. package/dist/core/tools/grep.js.map +1 -1
  197. package/dist/core/tools/index.d.ts +17 -17
  198. package/dist/core/tools/index.d.ts.map +1 -1
  199. package/dist/core/tools/index.js.map +1 -1
  200. package/dist/core/tools/ls.d.ts +2 -2
  201. package/dist/core/tools/ls.d.ts.map +1 -1
  202. package/dist/core/tools/ls.js +10 -12
  203. package/dist/core/tools/ls.js.map +1 -1
  204. package/dist/core/tools/output-accumulator.d.ts +3 -1
  205. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  206. package/dist/core/tools/output-accumulator.js +9 -3
  207. package/dist/core/tools/output-accumulator.js.map +1 -1
  208. package/dist/core/tools/path-utils.d.ts +2 -0
  209. package/dist/core/tools/path-utils.d.ts.map +1 -1
  210. package/dist/core/tools/path-utils.js +39 -21
  211. package/dist/core/tools/path-utils.js.map +1 -1
  212. package/dist/core/tools/read.d.ts +2 -2
  213. package/dist/core/tools/read.d.ts.map +1 -1
  214. package/dist/core/tools/read.js +15 -15
  215. package/dist/core/tools/read.js.map +1 -1
  216. package/dist/core/tools/render-utils.d.ts +5 -2
  217. package/dist/core/tools/render-utils.d.ts.map +1 -1
  218. package/dist/core/tools/render-utils.js +17 -1
  219. package/dist/core/tools/render-utils.js.map +1 -1
  220. package/dist/core/tools/tool-definition-wrapper.d.ts +1 -1
  221. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  222. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  223. package/dist/core/tools/truncate.d.ts.map +1 -1
  224. package/dist/core/tools/truncate.js +12 -2
  225. package/dist/core/tools/truncate.js.map +1 -1
  226. package/dist/core/tools/write.d.ts +1 -1
  227. package/dist/core/tools/write.d.ts.map +1 -1
  228. package/dist/core/tools/write.js +25 -41
  229. package/dist/core/tools/write.js.map +1 -1
  230. package/dist/d-pi-worker.d.ts +12 -0
  231. package/dist/d-pi-worker.d.ts.map +1 -0
  232. package/dist/d-pi-worker.js +9 -0
  233. package/dist/d-pi-worker.js.map +1 -0
  234. package/dist/index.d.ts +30 -28
  235. package/dist/index.d.ts.map +1 -1
  236. package/dist/index.js +5 -3
  237. package/dist/index.js.map +1 -1
  238. package/dist/main.d.ts +1 -1
  239. package/dist/main.d.ts.map +1 -1
  240. package/dist/main.js +100 -39
  241. package/dist/main.js.map +1 -1
  242. package/dist/migrations.d.ts.map +1 -1
  243. package/dist/migrations.js +118 -1
  244. package/dist/migrations.js.map +1 -1
  245. package/dist/modes/connect/auth-headers.d.ts +2 -0
  246. package/dist/modes/connect/auth-headers.d.ts.map +1 -0
  247. package/dist/modes/connect/auth-headers.js +2 -0
  248. package/dist/modes/connect/auth-headers.js.map +1 -0
  249. package/dist/modes/connect/client-extension-sync.d.ts +13 -0
  250. package/dist/modes/connect/client-extension-sync.d.ts.map +1 -0
  251. package/dist/modes/connect/client-extension-sync.js +51 -0
  252. package/dist/modes/connect/client-extension-sync.js.map +1 -0
  253. package/dist/modes/connect/connect-mode.d.ts +6 -0
  254. package/dist/modes/connect/connect-mode.d.ts.map +1 -0
  255. package/dist/modes/connect/connect-mode.js +29 -0
  256. package/dist/modes/connect/connect-mode.js.map +1 -0
  257. package/dist/modes/connect/remote-agent-session-proxy.d.ts +81 -0
  258. package/dist/modes/connect/remote-agent-session-proxy.d.ts.map +1 -0
  259. package/dist/modes/connect/remote-agent-session-proxy.js +326 -0
  260. package/dist/modes/connect/remote-agent-session-proxy.js.map +1 -0
  261. package/dist/modes/connect/sse-client.d.ts +18 -0
  262. package/dist/modes/connect/sse-client.d.ts.map +1 -0
  263. package/dist/modes/connect/sse-client.js +90 -0
  264. package/dist/modes/connect/sse-client.js.map +1 -0
  265. package/dist/modes/index.d.ts +5 -5
  266. package/dist/modes/index.d.ts.map +1 -1
  267. package/dist/modes/index.js.map +1 -1
  268. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  269. package/dist/modes/interactive/components/armin.js.map +1 -1
  270. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  271. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  272. package/dist/modes/interactive/components/bash-execution.d.ts +1 -1
  273. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  274. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  275. package/dist/modes/interactive/components/bordered-loader.d.ts +1 -1
  276. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  277. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  278. package/dist/modes/interactive/components/branch-summary-message.d.ts +1 -1
  279. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  280. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  281. package/dist/modes/interactive/components/compaction-summary-message.d.ts +1 -1
  282. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  283. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  284. package/dist/modes/interactive/components/config-selector.d.ts +4 -4
  285. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  286. package/dist/modes/interactive/components/config-selector.js +8 -5
  287. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  288. package/dist/modes/interactive/components/countdown-timer.d.ts +2 -2
  289. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  290. package/dist/modes/interactive/components/countdown-timer.js +2 -2
  291. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  292. package/dist/modes/interactive/components/custom-editor.d.ts +1 -1
  293. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  294. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  295. package/dist/modes/interactive/components/custom-message.d.ts +2 -2
  296. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  297. package/dist/modes/interactive/components/custom-message.js +0 -1
  298. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  299. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  300. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  301. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  302. package/dist/modes/interactive/components/diff.js.map +1 -1
  303. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  304. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  305. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  306. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  307. package/dist/modes/interactive/components/extension-editor.d.ts +1 -1
  308. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  309. package/dist/modes/interactive/components/extension-editor.js +14 -6
  310. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  311. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  312. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  313. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  314. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  315. package/dist/modes/interactive/components/footer.d.ts +15 -4
  316. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  317. package/dist/modes/interactive/components/footer.js +126 -8
  318. package/dist/modes/interactive/components/footer.js.map +1 -1
  319. package/dist/modes/interactive/components/index.d.ts +31 -31
  320. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  321. package/dist/modes/interactive/components/index.js.map +1 -1
  322. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  323. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  324. package/dist/modes/interactive/components/login-dialog.d.ts +7 -1
  325. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  326. package/dist/modes/interactive/components/login-dialog.js +28 -5
  327. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  328. package/dist/modes/interactive/components/model-selector.d.ts +2 -2
  329. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  330. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  331. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
  332. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  333. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  334. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  335. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  336. package/dist/modes/interactive/components/session-selector-search.d.ts +1 -1
  337. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  338. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  339. package/dist/modes/interactive/components/session-selector.d.ts +3 -3
  340. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  341. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  342. package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
  343. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  344. package/dist/modes/interactive/components/settings-selector.js +15 -0
  345. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  346. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  347. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  348. package/dist/modes/interactive/components/skill-invocation-message.d.ts +1 -1
  349. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  350. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  351. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  352. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  353. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  354. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  355. package/dist/modes/interactive/components/tool-execution.d.ts +1 -1
  356. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  357. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  358. package/dist/modes/interactive/components/tree-selector.d.ts +1 -1
  359. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  360. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  361. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  362. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  363. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  364. package/dist/modes/interactive/components/user-message.js.map +1 -1
  365. package/dist/modes/interactive/interactive-mode.d.ts +53 -7
  366. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  367. package/dist/modes/interactive/interactive-mode.js +1247 -205
  368. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  369. package/dist/modes/interactive/theme/dark.json +5 -4
  370. package/dist/modes/interactive/theme/light.json +5 -4
  371. package/dist/modes/interactive/theme/theme.d.ts +22 -3
  372. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  373. package/dist/modes/interactive/theme/theme.js +130 -69
  374. package/dist/modes/interactive/theme/theme.js.map +1 -1
  375. package/dist/modes/print-mode.d.ts +1 -1
  376. package/dist/modes/print-mode.d.ts.map +1 -1
  377. package/dist/modes/print-mode.js.map +1 -1
  378. package/dist/modes/rpc/rpc-client.d.ts +8 -5
  379. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  380. package/dist/modes/rpc/rpc-client.js +65 -8
  381. package/dist/modes/rpc/rpc-client.js.map +1 -1
  382. package/dist/modes/rpc/rpc-mode.d.ts +2 -2
  383. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  384. package/dist/modes/rpc/rpc-mode.js +18 -4
  385. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  386. package/dist/modes/rpc/rpc-types.d.ts +5 -4
  387. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  388. package/dist/modes/rpc/rpc-types.js.map +1 -1
  389. package/dist/modes/serve/api-handlers.d.ts +4 -0
  390. package/dist/modes/serve/api-handlers.d.ts.map +1 -0
  391. package/dist/modes/serve/api-handlers.js +324 -0
  392. package/dist/modes/serve/api-handlers.js.map +1 -0
  393. package/dist/modes/serve/http-server.d.ts +14 -0
  394. package/dist/modes/serve/http-server.d.ts.map +1 -0
  395. package/dist/modes/serve/http-server.js +94 -0
  396. package/dist/modes/serve/http-server.js.map +1 -0
  397. package/dist/modes/serve/serve-mode.d.ts +10 -0
  398. package/dist/modes/serve/serve-mode.d.ts.map +1 -0
  399. package/dist/modes/serve/serve-mode.js +217 -0
  400. package/dist/modes/serve/serve-mode.js.map +1 -0
  401. package/dist/package-manager-cli.d.ts.map +1 -1
  402. package/dist/package-manager-cli.js +62 -7
  403. package/dist/package-manager-cli.js.map +1 -1
  404. package/dist/utils/ansi.d.ts.map +1 -1
  405. package/dist/utils/ansi.js +47 -72
  406. package/dist/utils/ansi.js.map +1 -1
  407. package/dist/utils/changelog.d.ts +1 -1
  408. package/dist/utils/changelog.d.ts.map +1 -1
  409. package/dist/utils/changelog.js.map +1 -1
  410. package/dist/utils/child-process.d.ts +5 -2
  411. package/dist/utils/child-process.d.ts.map +1 -1
  412. package/dist/utils/child-process.js +9 -7
  413. package/dist/utils/child-process.js.map +1 -1
  414. package/dist/utils/clipboard-image.d.ts.map +1 -1
  415. package/dist/utils/clipboard-image.js.map +1 -1
  416. package/dist/utils/clipboard-native.d.ts +3 -1
  417. package/dist/utils/clipboard-native.d.ts.map +1 -1
  418. package/dist/utils/clipboard-native.js +14 -8
  419. package/dist/utils/clipboard-native.js.map +1 -1
  420. package/dist/utils/clipboard.d.ts.map +1 -1
  421. package/dist/utils/clipboard.js.map +1 -1
  422. package/dist/utils/deprecation.d.ts +4 -0
  423. package/dist/utils/deprecation.d.ts.map +1 -0
  424. package/dist/utils/deprecation.js +13 -0
  425. package/dist/utils/deprecation.js.map +1 -0
  426. package/dist/utils/exif-orientation.d.ts +1 -1
  427. package/dist/utils/exif-orientation.d.ts.map +1 -1
  428. package/dist/utils/exif-orientation.js.map +1 -1
  429. package/dist/utils/html.d.ts +7 -0
  430. package/dist/utils/html.d.ts.map +1 -0
  431. package/dist/utils/html.js +40 -0
  432. package/dist/utils/html.js.map +1 -0
  433. package/dist/utils/image-convert.d.ts.map +1 -1
  434. package/dist/utils/image-convert.js.map +1 -1
  435. package/dist/utils/image-resize-core.d.ts +30 -0
  436. package/dist/utils/image-resize-core.d.ts.map +1 -0
  437. package/dist/utils/image-resize-core.js +124 -0
  438. package/dist/utils/image-resize-core.js.map +1 -0
  439. package/dist/utils/image-resize-worker.d.ts +2 -0
  440. package/dist/utils/image-resize-worker.d.ts.map +1 -0
  441. package/dist/utils/image-resize-worker.js +31 -0
  442. package/dist/utils/image-resize-worker.js.map +1 -0
  443. package/dist/utils/image-resize.d.ts +7 -27
  444. package/dist/utils/image-resize.d.ts.map +1 -1
  445. package/dist/utils/image-resize.js +75 -131
  446. package/dist/utils/image-resize.js.map +1 -1
  447. package/dist/utils/json.d.ts +3 -0
  448. package/dist/utils/json.d.ts.map +1 -0
  449. package/dist/utils/json.js +7 -0
  450. package/dist/utils/json.js.map +1 -0
  451. package/dist/utils/paths.d.ts +16 -1
  452. package/dist/utils/paths.d.ts.map +1 -1
  453. package/dist/utils/paths.js +49 -7
  454. package/dist/utils/paths.js.map +1 -1
  455. package/dist/utils/shell.d.ts.map +1 -1
  456. package/dist/utils/shell.js +6 -1
  457. package/dist/utils/shell.js.map +1 -1
  458. package/dist/utils/syntax-highlight.d.ts +12 -0
  459. package/dist/utils/syntax-highlight.d.ts.map +1 -0
  460. package/dist/utils/syntax-highlight.js +118 -0
  461. package/dist/utils/syntax-highlight.js.map +1 -0
  462. package/dist/utils/tools-manager.d.ts.map +1 -1
  463. package/dist/utils/tools-manager.js +4 -1
  464. package/dist/utils/tools-manager.js.map +1 -1
  465. package/dist/utils/version-check.d.ts +2 -1
  466. package/dist/utils/version-check.d.ts.map +1 -1
  467. package/dist/utils/version-check.js +9 -4
  468. package/dist/utils/version-check.js.map +1 -1
  469. package/dist/utils/windows-self-update.d.ts +3 -0
  470. package/dist/utils/windows-self-update.d.ts.map +1 -0
  471. package/dist/utils/windows-self-update.js +77 -0
  472. package/dist/utils/windows-self-update.js.map +1 -0
  473. package/docs/custom-provider.md +111 -21
  474. package/docs/development.md +1 -1
  475. package/docs/extensions.md +13 -7
  476. package/docs/index.md +13 -3
  477. package/docs/models.md +32 -13
  478. package/docs/packages.md +9 -6
  479. package/docs/providers.md +13 -5
  480. package/docs/quickstart.md +24 -1
  481. package/docs/rpc.md +2 -1
  482. package/docs/sdk.md +8 -0
  483. package/docs/session-format.md +1 -1
  484. package/docs/sessions.md +8 -0
  485. package/docs/settings.md +8 -6
  486. package/docs/skills.md +3 -4
  487. package/docs/terminal-setup.md +8 -0
  488. package/docs/termux.md +3 -3
  489. package/docs/tui.md +2 -2
  490. package/docs/usage.md +13 -2
  491. package/examples/extensions/README.md +1 -0
  492. package/examples/extensions/custom-provider-anthropic/index.ts +1 -1
  493. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  494. package/examples/extensions/custom-provider-anthropic/package.json +2 -2
  495. package/examples/extensions/custom-provider-gitlab-duo/index.ts +54 -3
  496. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  497. package/examples/extensions/custom-provider-gitlab-duo/test.ts +1 -1
  498. package/examples/extensions/doom-overlay/doom-component.ts +2 -2
  499. package/examples/extensions/doom-overlay/index.ts +3 -3
  500. package/examples/extensions/git-merge-and-resolve.ts +115 -0
  501. package/examples/extensions/input-transform-streaming.ts +39 -0
  502. package/examples/extensions/overlay-qa-tests.ts +97 -66
  503. package/examples/extensions/overlay-test.ts +7 -4
  504. package/examples/extensions/plan-mode/index.ts +1 -1
  505. package/examples/extensions/sandbox/package-lock.json +2 -2
  506. package/examples/extensions/sandbox/package.json +2 -2
  507. package/examples/extensions/subagent/README.md +3 -0
  508. package/examples/extensions/subagent/index.ts +42 -20
  509. package/examples/extensions/with-deps/package-lock.json +2 -2
  510. package/examples/extensions/with-deps/package.json +3 -3
  511. package/npm-shrinkwrap.json +1790 -0
  512. package/package.json +39 -32
  513. package/dist/utils/uuid.d.ts +0 -2
  514. package/dist/utils/uuid.d.ts.map +0 -1
  515. package/dist/utils/uuid.js +0 -40
  516. package/dist/utils/uuid.js.map +0 -1
@@ -0,0 +1,13 @@
1
+ import type { LoadExtensionsResult } from "../../core/extensions/index.ts";
2
+ import type { ConnectAuthHeaders } from "./auth-headers.ts";
3
+ export interface RemoteClientExtensionFile {
4
+ path: string;
5
+ content: string;
6
+ }
7
+ export interface RemoteClientExtensionBundle {
8
+ path: string;
9
+ entry: string;
10
+ files: RemoteClientExtensionFile[];
11
+ }
12
+ export declare function loadRemoteClientExtensions(url: string, cwd: string, headers?: ConnectAuthHeaders): Promise<LoadExtensionsResult>;
13
+ //# sourceMappingURL=client-extension-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-extension-sync.d.ts","sourceRoot":"","sources":["../../../src/modes/connect/client-extension-sync.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,WAAW,yBAAyB;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,2BAA2B;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,yBAAyB,EAAE,CAAC;CACnC;AAiCD,wBAAsB,0BAA0B,CAC/C,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,oBAAoB,CAAC,CAkB/B","sourcesContent":["import { mkdirSync, mkdtempSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join, relative, resolve, sep } from \"node:path\";\nimport { createEventBus } from \"../../core/event-bus.ts\";\nimport type { LoadExtensionsResult } from \"../../core/extensions/index.ts\";\nimport { loadExtensions } from \"../../core/extensions/loader.ts\";\nimport type { ConnectAuthHeaders } from \"./auth-headers.ts\";\n\nexport interface RemoteClientExtensionFile {\n\tpath: string;\n\tcontent: string;\n}\n\nexport interface RemoteClientExtensionBundle {\n\tpath: string;\n\tentry: string;\n\tfiles: RemoteClientExtensionFile[];\n}\n\nfunction assertSafeRelativePath(path: string): void {\n\tif (!path || path.startsWith(\"/\") || path === \"..\" || path.startsWith(`..${sep}`) || path.startsWith(\"../\")) {\n\t\tthrow new Error(`Unsafe remote extension file path: ${path}`);\n\t}\n}\n\nfunction resolveBundlePath(bundleDir: string, path: string): string {\n\tassertSafeRelativePath(path);\n\tconst resolvedPath = resolve(bundleDir, path);\n\tconst relativePath = relative(bundleDir, resolvedPath);\n\tassertSafeRelativePath(relativePath);\n\treturn resolvedPath;\n}\n\nfunction writeBundle(bundle: RemoteClientExtensionBundle, baseDir: string): string {\n\tconst bundleDir = join(baseDir, encodeURIComponent(bundle.path));\n\tmkdirSync(bundleDir, { recursive: true });\n\tfor (const file of bundle.files) {\n\t\tconst filePath = resolveBundlePath(bundleDir, file.path);\n\t\tmkdirSync(dirname(filePath), { recursive: true });\n\t\twriteFileSync(filePath, file.content, { flag: \"w\" });\n\t}\n\tconst originalEntry = resolveBundlePath(bundleDir, bundle.entry);\n\tconst shimPath = join(bundleDir, \".pi-client-entry.mjs\");\n\tconst importPath = `./${relative(dirname(shimPath), originalEntry).split(sep).join(\"/\")}`;\n\twriteFileSync(shimPath, `import { client } from ${JSON.stringify(importPath)};\\nexport default client;\\n`, {\n\t\tflag: \"w\",\n\t});\n\treturn shimPath;\n}\n\nexport async function loadRemoteClientExtensions(\n\turl: string,\n\tcwd: string,\n\theaders?: ConnectAuthHeaders,\n): Promise<LoadExtensionsResult> {\n\tconst response = await fetch(`${url}/client-extensions`, { headers });\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to load client extensions: ${response.status} ${response.statusText}`);\n\t}\n\tconst bundles = (await response.json()) as RemoteClientExtensionBundle[];\n\tconst syncDir = mkdtempSync(join(tmpdir(), \"pi-remote-client-extensions-\"));\n\tconst entryPaths = bundles.map((bundle) => writeBundle(bundle, syncDir));\n\tconst result = await loadExtensions(entryPaths, resolve(cwd), createEventBus());\n\tfor (const extension of result.extensions) {\n\t\tconst matchingBundle = bundles.find((bundle) =>\n\t\t\textension.resolvedPath.startsWith(join(syncDir, encodeURIComponent(bundle.path))),\n\t\t);\n\t\tif (matchingBundle) {\n\t\t\textension.path = `<remote-client:${matchingBundle.path}>`;\n\t\t}\n\t}\n\treturn result;\n}\n"]}
@@ -0,0 +1,51 @@
1
+ import { mkdirSync, mkdtempSync, writeFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { dirname, join, relative, resolve, sep } from "node:path";
4
+ import { createEventBus } from "../../core/event-bus.js";
5
+ import { loadExtensions } from "../../core/extensions/loader.js";
6
+ function assertSafeRelativePath(path) {
7
+ if (!path || path.startsWith("/") || path === ".." || path.startsWith(`..${sep}`) || path.startsWith("../")) {
8
+ throw new Error(`Unsafe remote extension file path: ${path}`);
9
+ }
10
+ }
11
+ function resolveBundlePath(bundleDir, path) {
12
+ assertSafeRelativePath(path);
13
+ const resolvedPath = resolve(bundleDir, path);
14
+ const relativePath = relative(bundleDir, resolvedPath);
15
+ assertSafeRelativePath(relativePath);
16
+ return resolvedPath;
17
+ }
18
+ function writeBundle(bundle, baseDir) {
19
+ const bundleDir = join(baseDir, encodeURIComponent(bundle.path));
20
+ mkdirSync(bundleDir, { recursive: true });
21
+ for (const file of bundle.files) {
22
+ const filePath = resolveBundlePath(bundleDir, file.path);
23
+ mkdirSync(dirname(filePath), { recursive: true });
24
+ writeFileSync(filePath, file.content, { flag: "w" });
25
+ }
26
+ const originalEntry = resolveBundlePath(bundleDir, bundle.entry);
27
+ const shimPath = join(bundleDir, ".pi-client-entry.mjs");
28
+ const importPath = `./${relative(dirname(shimPath), originalEntry).split(sep).join("/")}`;
29
+ writeFileSync(shimPath, `import { client } from ${JSON.stringify(importPath)};\nexport default client;\n`, {
30
+ flag: "w",
31
+ });
32
+ return shimPath;
33
+ }
34
+ export async function loadRemoteClientExtensions(url, cwd, headers) {
35
+ const response = await fetch(`${url}/client-extensions`, { headers });
36
+ if (!response.ok) {
37
+ throw new Error(`Failed to load client extensions: ${response.status} ${response.statusText}`);
38
+ }
39
+ const bundles = (await response.json());
40
+ const syncDir = mkdtempSync(join(tmpdir(), "pi-remote-client-extensions-"));
41
+ const entryPaths = bundles.map((bundle) => writeBundle(bundle, syncDir));
42
+ const result = await loadExtensions(entryPaths, resolve(cwd), createEventBus());
43
+ for (const extension of result.extensions) {
44
+ const matchingBundle = bundles.find((bundle) => extension.resolvedPath.startsWith(join(syncDir, encodeURIComponent(bundle.path))));
45
+ if (matchingBundle) {
46
+ extension.path = `<remote-client:${matchingBundle.path}>`;
47
+ }
48
+ }
49
+ return result;
50
+ }
51
+ //# sourceMappingURL=client-extension-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-extension-sync.js","sourceRoot":"","sources":["../../../src/modes/connect/client-extension-sync.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdirSync, mkdtempSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join, relative, resolve, sep } from \"node:path\";\nimport { createEventBus } from \"../../core/event-bus.ts\";\nimport type { LoadExtensionsResult } from \"../../core/extensions/index.ts\";\nimport { loadExtensions } from \"../../core/extensions/loader.ts\";\nimport type { ConnectAuthHeaders } from \"./auth-headers.ts\";\n\nexport interface RemoteClientExtensionFile {\n\tpath: string;\n\tcontent: string;\n}\n\nexport interface RemoteClientExtensionBundle {\n\tpath: string;\n\tentry: string;\n\tfiles: RemoteClientExtensionFile[];\n}\n\nfunction assertSafeRelativePath(path: string): void {\n\tif (!path || path.startsWith(\"/\") || path === \"..\" || path.startsWith(`..${sep}`) || path.startsWith(\"../\")) {\n\t\tthrow new Error(`Unsafe remote extension file path: ${path}`);\n\t}\n}\n\nfunction resolveBundlePath(bundleDir: string, path: string): string {\n\tassertSafeRelativePath(path);\n\tconst resolvedPath = resolve(bundleDir, path);\n\tconst relativePath = relative(bundleDir, resolvedPath);\n\tassertSafeRelativePath(relativePath);\n\treturn resolvedPath;\n}\n\nfunction writeBundle(bundle: RemoteClientExtensionBundle, baseDir: string): string {\n\tconst bundleDir = join(baseDir, encodeURIComponent(bundle.path));\n\tmkdirSync(bundleDir, { recursive: true });\n\tfor (const file of bundle.files) {\n\t\tconst filePath = resolveBundlePath(bundleDir, file.path);\n\t\tmkdirSync(dirname(filePath), { recursive: true });\n\t\twriteFileSync(filePath, file.content, { flag: \"w\" });\n\t}\n\tconst originalEntry = resolveBundlePath(bundleDir, bundle.entry);\n\tconst shimPath = join(bundleDir, \".pi-client-entry.mjs\");\n\tconst importPath = `./${relative(dirname(shimPath), originalEntry).split(sep).join(\"/\")}`;\n\twriteFileSync(shimPath, `import { client } from ${JSON.stringify(importPath)};\\nexport default client;\\n`, {\n\t\tflag: \"w\",\n\t});\n\treturn shimPath;\n}\n\nexport async function loadRemoteClientExtensions(\n\turl: string,\n\tcwd: string,\n\theaders?: ConnectAuthHeaders,\n): Promise<LoadExtensionsResult> {\n\tconst response = await fetch(`${url}/client-extensions`, { headers });\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to load client extensions: ${response.status} ${response.statusText}`);\n\t}\n\tconst bundles = (await response.json()) as RemoteClientExtensionBundle[];\n\tconst syncDir = mkdtempSync(join(tmpdir(), \"pi-remote-client-extensions-\"));\n\tconst entryPaths = bundles.map((bundle) => writeBundle(bundle, syncDir));\n\tconst result = await loadExtensions(entryPaths, resolve(cwd), createEventBus());\n\tfor (const extension of result.extensions) {\n\t\tconst matchingBundle = bundles.find((bundle) =>\n\t\t\textension.resolvedPath.startsWith(join(syncDir, encodeURIComponent(bundle.path))),\n\t\t);\n\t\tif (matchingBundle) {\n\t\t\textension.path = `<remote-client:${matchingBundle.path}>`;\n\t\t}\n\t}\n\treturn result;\n}\n"]}
@@ -0,0 +1,6 @@
1
+ export interface ConnectModeOptions {
2
+ url: string;
3
+ authToken?: string;
4
+ }
5
+ export declare function runConnectMode(options: ConnectModeOptions): Promise<void>;
6
+ //# sourceMappingURL=connect-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-mode.d.ts","sourceRoot":"","sources":["../../../src/modes/connect/connect-mode.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmC/E","sourcesContent":["import type { SessionStateSnapshot } from \"../../core/agent-session-proxy.ts\";\nimport { InteractiveMode } from \"../interactive/interactive-mode.ts\";\nimport { RemoteAgentSessionProxy } from \"./remote-agent-session-proxy.ts\";\n\nexport interface ConnectModeOptions {\n\turl: string;\n\tauthToken?: string;\n}\n\nexport async function runConnectMode(options: ConnectModeOptions): Promise<void> {\n\tconst { authToken, url } = options;\n\tconst headers = authToken ? { Authorization: `Bearer ${authToken}` } : undefined;\n\n\t// Fetch initial state snapshot\n\tconst stateResponse = await fetch(`${url}/state`, { headers });\n\tif (!stateResponse.ok) {\n\t\tthrow new Error(`Failed to connect to ${url}: ${stateResponse.status} ${stateResponse.statusText}`);\n\t}\n\tconst snapshot = (await stateResponse.json()) as SessionStateSnapshot;\n\n\t// Create InteractiveMode first so we have a reference for graceful shutdown\n\tconst mode = new InteractiveMode(undefined, {\n\t\tbanner: snapshot.banner,\n\t\tremoteClientExtensionsUrl: url,\n\t\tremoteClientExtensionHeaders: headers,\n\t});\n\n\t// Create remote proxy with disconnect callback for graceful shutdown\n\tconst proxy = new RemoteAgentSessionProxy(\n\t\turl,\n\t\tsnapshot,\n\t\t(reason) => {\n\t\t\tmode.showStatus(`Disconnected: ${reason}`);\n\t\t\t// Schedule shutdown after a brief delay so the user sees the message\n\t\t\tsetTimeout(() => void mode.shutdown(), 1500);\n\t\t},\n\t\t{ headers },\n\t);\n\n\t// Assign proxy to mode after construction\n\tmode.setProxy(proxy);\n\n\tawait proxy.connect();\n\tawait mode.run();\n}\n"]}
@@ -0,0 +1,29 @@
1
+ import { InteractiveMode } from "../interactive/interactive-mode.js";
2
+ import { RemoteAgentSessionProxy } from "./remote-agent-session-proxy.js";
3
+ export async function runConnectMode(options) {
4
+ const { authToken, url } = options;
5
+ const headers = authToken ? { Authorization: `Bearer ${authToken}` } : undefined;
6
+ // Fetch initial state snapshot
7
+ const stateResponse = await fetch(`${url}/state`, { headers });
8
+ if (!stateResponse.ok) {
9
+ throw new Error(`Failed to connect to ${url}: ${stateResponse.status} ${stateResponse.statusText}`);
10
+ }
11
+ const snapshot = (await stateResponse.json());
12
+ // Create InteractiveMode first so we have a reference for graceful shutdown
13
+ const mode = new InteractiveMode(undefined, {
14
+ banner: snapshot.banner,
15
+ remoteClientExtensionsUrl: url,
16
+ remoteClientExtensionHeaders: headers,
17
+ });
18
+ // Create remote proxy with disconnect callback for graceful shutdown
19
+ const proxy = new RemoteAgentSessionProxy(url, snapshot, (reason) => {
20
+ mode.showStatus(`Disconnected: ${reason}`);
21
+ // Schedule shutdown after a brief delay so the user sees the message
22
+ setTimeout(() => void mode.shutdown(), 1500);
23
+ }, { headers });
24
+ // Assign proxy to mode after construction
25
+ mode.setProxy(proxy);
26
+ await proxy.connect();
27
+ await mode.run();
28
+ }
29
+ //# sourceMappingURL=connect-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-mode.js","sourceRoot":"","sources":["../../../src/modes/connect/connect-mode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAO1E,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA2B,EAAiB;IAChF,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IACnC,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAEjF,+BAA+B;IAC/B,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/D,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,KAAK,aAAa,CAAC,MAAM,IAAI,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC;IACrG,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,MAAM,aAAa,CAAC,IAAI,EAAE,CAAyB,CAAC;IAEtE,4EAA4E;IAC5E,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,SAAS,EAAE;QAC3C,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,yBAAyB,EAAE,GAAG;QAC9B,4BAA4B,EAAE,OAAO;KACrC,CAAC,CAAC;IAEH,qEAAqE;IACrE,MAAM,KAAK,GAAG,IAAI,uBAAuB,CACxC,GAAG,EACH,QAAQ,EACR,CAAC,MAAM,EAAE,EAAE,CAAC;QACX,IAAI,CAAC,UAAU,CAAC,iBAAiB,MAAM,EAAE,CAAC,CAAC;QAC3C,qEAAqE;QACrE,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC;IAAA,CAC7C,EACD,EAAE,OAAO,EAAE,CACX,CAAC;IAEF,0CAA0C;IAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAErB,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;IACtB,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;AAAA,CACjB","sourcesContent":["import type { SessionStateSnapshot } from \"../../core/agent-session-proxy.ts\";\nimport { InteractiveMode } from \"../interactive/interactive-mode.ts\";\nimport { RemoteAgentSessionProxy } from \"./remote-agent-session-proxy.ts\";\n\nexport interface ConnectModeOptions {\n\turl: string;\n\tauthToken?: string;\n}\n\nexport async function runConnectMode(options: ConnectModeOptions): Promise<void> {\n\tconst { authToken, url } = options;\n\tconst headers = authToken ? { Authorization: `Bearer ${authToken}` } : undefined;\n\n\t// Fetch initial state snapshot\n\tconst stateResponse = await fetch(`${url}/state`, { headers });\n\tif (!stateResponse.ok) {\n\t\tthrow new Error(`Failed to connect to ${url}: ${stateResponse.status} ${stateResponse.statusText}`);\n\t}\n\tconst snapshot = (await stateResponse.json()) as SessionStateSnapshot;\n\n\t// Create InteractiveMode first so we have a reference for graceful shutdown\n\tconst mode = new InteractiveMode(undefined, {\n\t\tbanner: snapshot.banner,\n\t\tremoteClientExtensionsUrl: url,\n\t\tremoteClientExtensionHeaders: headers,\n\t});\n\n\t// Create remote proxy with disconnect callback for graceful shutdown\n\tconst proxy = new RemoteAgentSessionProxy(\n\t\turl,\n\t\tsnapshot,\n\t\t(reason) => {\n\t\t\tmode.showStatus(`Disconnected: ${reason}`);\n\t\t\t// Schedule shutdown after a brief delay so the user sees the message\n\t\t\tsetTimeout(() => void mode.shutdown(), 1500);\n\t\t},\n\t\t{ headers },\n\t);\n\n\t// Assign proxy to mode after construction\n\tmode.setProxy(proxy);\n\n\tawait proxy.connect();\n\tawait mode.run();\n}\n"]}
@@ -0,0 +1,81 @@
1
+ import type { AgentMessage, ThinkingLevel } from "@sheason/pi-agent-core";
2
+ import type { AgentSessionEvent } from "../../core/agent-session.ts";
3
+ import type { AgentSessionProxy, ContextUsageInfo, ModelInfo, ModelItemData, ProxyPromptOptions, ServeSlashCommand, SessionItemData, SessionStateSnapshot, TokenUsage, TreeNodeData, UserMessageItem } from "../../core/agent-session-proxy.ts";
4
+ import type { ConnectAuthHeaders } from "./auth-headers.ts";
5
+ type Listener = (event: AgentSessionEvent) => void;
6
+ type DisconnectCallback = (reason: string) => void;
7
+ export declare class RemoteAgentSessionProxy implements AgentSessionProxy {
8
+ private _state;
9
+ private readonly _subscribers;
10
+ private readonly _sseClient;
11
+ private readonly _baseUrl;
12
+ private readonly _onDisconnect;
13
+ private readonly _headers;
14
+ constructor(baseUrl: string, initialState: SessionStateSnapshot, onDisconnect?: DisconnectCallback, options?: {
15
+ headers?: ConnectAuthHeaders;
16
+ });
17
+ connect(): Promise<void>;
18
+ private _handleEvent;
19
+ private _updateState;
20
+ private _fetchState;
21
+ private _post;
22
+ private _getJson;
23
+ subscribe(listener: Listener): () => void;
24
+ prompt(text: string, options?: ProxyPromptOptions): Promise<void>;
25
+ steer(text: string, images?: Array<{
26
+ url: string;
27
+ mediaType?: string;
28
+ }>): void;
29
+ followUp(text: string, images?: Array<{
30
+ url: string;
31
+ mediaType?: string;
32
+ }>): void;
33
+ abort(): void;
34
+ abortBash(): void;
35
+ get model(): string;
36
+ get thinkingLevel(): ThinkingLevel;
37
+ get isStreaming(): boolean;
38
+ get isCompacting(): boolean;
39
+ get isBashRunning(): boolean;
40
+ get steeringMessages(): readonly string[];
41
+ get followUpMessages(): readonly string[];
42
+ get sessionFile(): string | undefined;
43
+ get sessionName(): string | undefined;
44
+ get messages(): readonly AgentMessage[];
45
+ get tokenUsage(): TokenUsage;
46
+ get contextUsage(): ContextUsageInfo;
47
+ get modelInfo(): ModelInfo;
48
+ get autoCompactEnabled(): boolean;
49
+ get cwd(): string;
50
+ get availableProviderCount(): number;
51
+ compact(customInstructions?: string): Promise<void>;
52
+ setModel(modelId: string): void;
53
+ cycleModel(direction: 1 | -1): void;
54
+ setThinkingLevel(level: ThinkingLevel): void;
55
+ cycleThinkingLevel(direction: 1 | -1): void;
56
+ setAutoCompactEnabled(enabled: boolean): void;
57
+ setSteeringMode(mode: "all" | "one-at-a-time"): void;
58
+ setFollowUpMode(mode: "all" | "one-at-a-time"): void;
59
+ newSession(): Promise<void>;
60
+ switchSession(sessionFile: string): Promise<void>;
61
+ fork(entryId?: string): Promise<void>;
62
+ renameSession(name: string): void;
63
+ setLabel(entryId: string, label: string | undefined): void;
64
+ setScopedModels(enabledIds: string[] | null): void;
65
+ setEnabledModels(patterns: string[] | undefined): void;
66
+ updateSettings(updates: Record<string, unknown>): void;
67
+ reload(): Promise<void>;
68
+ getTree(): TreeNodeData[];
69
+ fetchTree(): Promise<TreeNodeData[]>;
70
+ getUserMessagesForForking(): UserMessageItem[];
71
+ fetchUserMessages(): Promise<UserMessageItem[]>;
72
+ getSessions(): Promise<SessionItemData[]>;
73
+ getCommands(): ServeSlashCommand[];
74
+ fetchCommands(): Promise<ServeSlashCommand[]>;
75
+ getModels(): ModelItemData[];
76
+ fetchModels(): Promise<ModelItemData[]>;
77
+ dispose(): void;
78
+ getSnapshot(): SessionStateSnapshot;
79
+ }
80
+ export {};
81
+ //# sourceMappingURL=remote-agent-session-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-agent-session-proxy.d.ts","sourceRoot":"","sources":["../../../src/modes/connect/remote-agent-session-proxy.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage, ThinkingLevel } from \"@sheason/pi-agent-core\";\nimport type { AgentSessionEvent } from \"../../core/agent-session.ts\";\nimport type {\n\tAgentSessionProxy,\n\tContextUsageInfo,\n\tModelInfo,\n\tModelItemData,\n\tProxyPromptOptions,\n\tServeSlashCommand,\n\tSessionItemData,\n\tSessionStateSnapshot,\n\tTokenUsage,\n\tTreeNodeData,\n\tUserMessageItem,\n} from \"../../core/agent-session-proxy.ts\";\nimport type { ConnectAuthHeaders } from \"./auth-headers.ts\";\nimport { SseClient } from \"./sse-client.ts\";\n\ntype Listener = (event: AgentSessionEvent) => void;\ntype DisconnectCallback = (reason: string) => void;\n\nexport class RemoteAgentSessionProxy implements AgentSessionProxy {\n\tprivate _state: SessionStateSnapshot;\n\tprivate readonly _subscribers: Set<Listener> = new Set();\n\tprivate readonly _sseClient: SseClient;\n\tprivate readonly _baseUrl: string;\n\tprivate readonly _onDisconnect: DisconnectCallback | undefined;\n\tprivate readonly _headers: ConnectAuthHeaders | undefined;\n\n\tconstructor(\n\t\tbaseUrl: string,\n\t\tinitialState: SessionStateSnapshot,\n\t\tonDisconnect?: DisconnectCallback,\n\t\toptions: { headers?: ConnectAuthHeaders } = {},\n\t) {\n\t\tthis._baseUrl = baseUrl;\n\t\tthis._state = initialState;\n\t\tthis._onDisconnect = onDisconnect;\n\t\tthis._headers = options.headers;\n\n\t\tthis._sseClient = new SseClient(\n\t\t\t`${baseUrl}/events`,\n\t\t\tthis._headers,\n\t\t\t(event) => this._handleEvent(event),\n\t\t\t(error) => {\n\t\t\t\tprocess.stderr.write(`[connect] SSE error: ${error.message}\\n`);\n\t\t\t\tthis._onDisconnect?.(`SSE error: ${error.message}`);\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tprocess.stderr.write(`[connect] SSE connection closed\\n`);\n\t\t\t\tthis._onDisconnect?.(`SSE connection closed`);\n\t\t\t},\n\t\t);\n\t}\n\n\tasync connect(): Promise<void> {\n\t\tawait this._sseClient.connect();\n\t}\n\n\tprivate _handleEvent(event: AgentSessionEvent): void {\n\t\t// For session_replaced, fetch fresh state BEFORE notifying subscribers\n\t\tif (event.type === \"session_replaced\") {\n\t\t\tthis._state = { ...this._state, messages: [] };\n\t\t\tthis._fetchState()\n\t\t\t\t.then(() => {\n\t\t\t\t\tfor (const subscriber of this._subscribers) {\n\t\t\t\t\t\tsubscriber(event);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch((e: Error) => {\n\t\t\t\t\tprocess.stderr.write(`[connect] failed to fetch state after session_replaced: ${e.message}\\n`);\n\t\t\t\t\t// Still notify subscribers even on failure so UI resets\n\t\t\t\t\tfor (const subscriber of this._subscribers) {\n\t\t\t\t\t\tsubscriber(event);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tthis._updateState(event);\n\t\tfor (const subscriber of this._subscribers) {\n\t\t\tsubscriber(event);\n\t\t}\n\t}\n\n\tprivate _updateState(event: AgentSessionEvent): void {\n\t\tswitch (event.type) {\n\t\t\tcase \"message_start\":\n\t\t\tcase \"message_update\":\n\t\t\tcase \"message_end\":\n\t\t\t\t// Messages managed via events, not the messages array\n\t\t\t\tbreak;\n\t\t\tcase \"agent_start\":\n\t\t\t\tthis._state = { ...this._state, isStreaming: true };\n\t\t\t\tbreak;\n\t\t\tcase \"agent_end\":\n\t\t\t\tthis._state = { ...this._state, isStreaming: false };\n\t\t\t\tbreak;\n\t\t\tcase \"compaction_start\":\n\t\t\t\tthis._state = { ...this._state, isCompacting: true };\n\t\t\t\tbreak;\n\t\t\tcase \"compaction_end\":\n\t\t\t\tthis._state = { ...this._state, isCompacting: false };\n\t\t\t\tbreak;\n\t\t\tcase \"queue_update\":\n\t\t\t\tthis._state = {\n\t\t\t\t\t...this._state,\n\t\t\t\t\tsteeringMessages: event.steering,\n\t\t\t\t\tfollowUpMessages: event.followUp,\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase \"session_info_changed\":\n\t\t\t\tthis._state = { ...this._state, sessionName: event.name };\n\t\t\t\tbreak;\n\t\t\tcase \"thinking_level_changed\":\n\t\t\t\tthis._state = { ...this._state, thinkingLevel: event.level };\n\t\t\t\tbreak;\n\t\t\tcase \"state_update\":\n\t\t\t\t// Server pushes a full snapshot update with token usage, context usage, etc.\n\t\t\t\tif (event.snapshot) {\n\t\t\t\t\tthis._state = { ...this._state, ...event.snapshot };\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/** Fetch full state snapshot from server and update local cache */\n\tprivate async _fetchState(): Promise<void> {\n\t\tconst response = await fetch(`${this._baseUrl}/state`, { headers: this._headers });\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`GET /state returned HTTP ${response.status}`);\n\t\t}\n\t\tconst snapshot = (await response.json()) as SessionStateSnapshot;\n\t\tthis._state = snapshot;\n\t}\n\n\tprivate async _post(endpoint: string, body?: unknown): Promise<unknown> {\n\t\tconst response = await fetch(`${this._baseUrl}/${endpoint}`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { ...this._headers, \"Content-Type\": \"application/json\" },\n\t\t\tbody: body ? JSON.stringify(body) : undefined,\n\t\t});\n\t\tconst data = await response.json();\n\t\tif (!response.ok) {\n\t\t\tthrow new Error((data as { error?: string }).error ?? `HTTP ${response.status}`);\n\t\t}\n\t\treturn data;\n\t}\n\n\t/** GET {endpoint} and return parsed JSON. Throws with status + server error\n\t * body on non-2xx, so callers see the real cause instead of a misleading\n\t * downstream failure (e.g. `.map is not a function` on a JSON object). */\n\tprivate async _getJson<T>(endpoint: string): Promise<T> {\n\t\tconst response = await fetch(`${this._baseUrl}/${endpoint}`, { headers: this._headers });\n\t\tif (!response.ok) {\n\t\t\tlet detail = \"\";\n\t\t\ttry {\n\t\t\t\tconst body = (await response.json()) as { error?: unknown };\n\t\t\t\tif (body && typeof body === \"object\" && \"error\" in body) {\n\t\t\t\t\tdetail = `: ${String(body.error)}`;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// body was not JSON; leave detail empty\n\t\t\t}\n\t\t\tthrow new Error(`${endpoint} returned ${response.status}${detail}`);\n\t\t}\n\t\treturn (await response.json()) as T;\n\t}\n\n\t// Event subscription\n\tsubscribe(listener: Listener): () => void {\n\t\tthis._subscribers.add(listener);\n\t\treturn () => {\n\t\t\tthis._subscribers.delete(listener);\n\t\t};\n\t}\n\n\t// Commands\n\tasync prompt(text: string, options?: ProxyPromptOptions): Promise<void> {\n\t\tawait this._post(\"prompt\", { text, options });\n\t}\n\n\tsteer(text: string, images?: Array<{ url: string; mediaType?: string }>): void {\n\t\tthis._post(\"prompt\", { text, options: { images, streamingBehavior: \"steer\" } }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] steer failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tfollowUp(text: string, images?: Array<{ url: string; mediaType?: string }>): void {\n\t\tthis._post(\"prompt\", { text, options: { images, streamingBehavior: \"followUp\" } }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] followUp failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tabort(): void {\n\t\tthis._post(\"abort\").catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] abort failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tabortBash(): void {\n\t\tthis._post(\"abort-bash\").catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] abortBash failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\t// State queries\n\tget model(): string {\n\t\treturn this._state.model;\n\t}\n\tget thinkingLevel(): ThinkingLevel {\n\t\treturn this._state.thinkingLevel;\n\t}\n\tget isStreaming(): boolean {\n\t\treturn this._state.isStreaming;\n\t}\n\tget isCompacting(): boolean {\n\t\treturn this._state.isCompacting;\n\t}\n\tget isBashRunning(): boolean {\n\t\treturn this._state.isBashRunning;\n\t}\n\tget steeringMessages(): readonly string[] {\n\t\treturn this._state.steeringMessages;\n\t}\n\tget followUpMessages(): readonly string[] {\n\t\treturn this._state.followUpMessages;\n\t}\n\tget sessionFile(): string | undefined {\n\t\treturn this._state.sessionFile;\n\t}\n\tget sessionName(): string | undefined {\n\t\treturn this._state.sessionName;\n\t}\n\tget messages(): readonly AgentMessage[] {\n\t\treturn this._state.messages;\n\t}\n\tget tokenUsage(): TokenUsage {\n\t\treturn this._state.tokenUsage;\n\t}\n\tget contextUsage(): ContextUsageInfo {\n\t\treturn this._state.contextUsage;\n\t}\n\tget modelInfo(): ModelInfo {\n\t\treturn this._state.modelInfo;\n\t}\n\tget autoCompactEnabled(): boolean {\n\t\treturn this._state.autoCompactEnabled;\n\t}\n\tget cwd(): string {\n\t\treturn this._state.cwd;\n\t}\n\tget availableProviderCount(): number {\n\t\treturn this._state.availableProviderCount;\n\t}\n\n\t// Session operations\n\tasync compact(customInstructions?: string): Promise<void> {\n\t\tawait this._post(\"compact\", { customInstructions });\n\t}\n\n\tsetModel(modelId: string): void {\n\t\tthis._post(\"set-model\", { modelId }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] setModel failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tcycleModel(direction: 1 | -1): void {\n\t\tthis._post(\"cycle-model\", { direction }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] cycleModel failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tsetThinkingLevel(level: ThinkingLevel): void {\n\t\tthis._post(\"set-thinking-level\", { level }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] setThinkingLevel failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tcycleThinkingLevel(direction: 1 | -1): void {\n\t\tthis._post(\"cycle-thinking-level\", { direction }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] cycleThinkingLevel failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tsetAutoCompactEnabled(enabled: boolean): void {\n\t\tthis._post(\"settings\", { autoCompact: enabled }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] setAutoCompactEnabled failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tsetSteeringMode(mode: \"all\" | \"one-at-a-time\"): void {\n\t\tthis._post(\"settings\", { steeringMode: mode }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] setSteeringMode failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tsetFollowUpMode(mode: \"all\" | \"one-at-a-time\"): void {\n\t\tthis._post(\"settings\", { followUpMode: mode }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] setFollowUpMode failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\t// Runtime operations\n\tasync newSession(): Promise<void> {\n\t\tawait this._post(\"new-session\");\n\t}\n\n\tasync switchSession(sessionFile: string): Promise<void> {\n\t\tawait this._post(\"switch-session\", { sessionFile });\n\t}\n\n\tasync fork(entryId?: string): Promise<void> {\n\t\tawait this._post(\"fork\", { entryId });\n\t}\n\n\trenameSession(name: string): void {\n\t\tthis._post(\"name\", { name }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] renameSession failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tsetLabel(entryId: string, label: string | undefined): void {\n\t\tthis._post(\"label\", { entryId, label }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] setLabel failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tsetScopedModels(enabledIds: string[] | null): void {\n\t\tthis._post(\"scoped-models\", { enabledIds }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] setScopedModels failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tsetEnabledModels(patterns: string[] | undefined): void {\n\t\tthis._post(\"enabled-models\", { patterns }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] setEnabledModels failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tupdateSettings(updates: Record<string, unknown>): void {\n\t\tthis._post(\"settings\", updates).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] updateSettings failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tasync reload(): Promise<void> {\n\t\tawait this._post(\"reload\");\n\t}\n\n\t// Data queries\n\tgetTree(): TreeNodeData[] {\n\t\t// Fetch synchronously from cached snapshot or fetch on demand\n\t\t// For now, we'll fetch via a separate GET request\n\t\tthrow new Error(\"Use fetchTree() for async tree data\");\n\t}\n\n\tasync fetchTree(): Promise<TreeNodeData[]> {\n\t\treturn this._getJson<TreeNodeData[]>(\"tree\");\n\t}\n\n\tgetUserMessagesForForking(): UserMessageItem[] {\n\t\tthrow new Error(\"Use fetchUserMessages() for async data\");\n\t}\n\n\tasync fetchUserMessages(): Promise<UserMessageItem[]> {\n\t\treturn this._getJson<UserMessageItem[]>(\"user-messages\");\n\t}\n\n\tasync getSessions(): Promise<SessionItemData[]> {\n\t\treturn this._getJson<SessionItemData[]>(\"sessions\");\n\t}\n\n\tgetCommands(): ServeSlashCommand[] {\n\t\tthrow new Error(\"Use fetchCommands() for async data\");\n\t}\n\n\tasync fetchCommands(): Promise<ServeSlashCommand[]> {\n\t\treturn this._getJson<ServeSlashCommand[]>(\"commands\");\n\t}\n\n\tgetModels(): ModelItemData[] {\n\t\tthrow new Error(\"Use fetchModels() for async data\");\n\t}\n\n\tasync fetchModels(): Promise<ModelItemData[]> {\n\t\treturn this._getJson<ModelItemData[]>(\"models\");\n\t}\n\n\t// Lifecycle\n\tdispose(): void {\n\t\tthis._sseClient.disconnect();\n\t}\n\n\t// Snapshot\n\tgetSnapshot(): SessionStateSnapshot {\n\t\treturn { ...this._state };\n\t}\n}\n"]}
@@ -0,0 +1,326 @@
1
+ import { SseClient } from "./sse-client.js";
2
+ export class RemoteAgentSessionProxy {
3
+ _state;
4
+ _subscribers = new Set();
5
+ _sseClient;
6
+ _baseUrl;
7
+ _onDisconnect;
8
+ _headers;
9
+ constructor(baseUrl, initialState, onDisconnect, options = {}) {
10
+ this._baseUrl = baseUrl;
11
+ this._state = initialState;
12
+ this._onDisconnect = onDisconnect;
13
+ this._headers = options.headers;
14
+ this._sseClient = new SseClient(`${baseUrl}/events`, this._headers, (event) => this._handleEvent(event), (error) => {
15
+ process.stderr.write(`[connect] SSE error: ${error.message}\n`);
16
+ this._onDisconnect?.(`SSE error: ${error.message}`);
17
+ }, () => {
18
+ process.stderr.write(`[connect] SSE connection closed\n`);
19
+ this._onDisconnect?.(`SSE connection closed`);
20
+ });
21
+ }
22
+ async connect() {
23
+ await this._sseClient.connect();
24
+ }
25
+ _handleEvent(event) {
26
+ // For session_replaced, fetch fresh state BEFORE notifying subscribers
27
+ if (event.type === "session_replaced") {
28
+ this._state = { ...this._state, messages: [] };
29
+ this._fetchState()
30
+ .then(() => {
31
+ for (const subscriber of this._subscribers) {
32
+ subscriber(event);
33
+ }
34
+ })
35
+ .catch((e) => {
36
+ process.stderr.write(`[connect] failed to fetch state after session_replaced: ${e.message}\n`);
37
+ // Still notify subscribers even on failure so UI resets
38
+ for (const subscriber of this._subscribers) {
39
+ subscriber(event);
40
+ }
41
+ });
42
+ return;
43
+ }
44
+ this._updateState(event);
45
+ for (const subscriber of this._subscribers) {
46
+ subscriber(event);
47
+ }
48
+ }
49
+ _updateState(event) {
50
+ switch (event.type) {
51
+ case "message_start":
52
+ case "message_update":
53
+ case "message_end":
54
+ // Messages managed via events, not the messages array
55
+ break;
56
+ case "agent_start":
57
+ this._state = { ...this._state, isStreaming: true };
58
+ break;
59
+ case "agent_end":
60
+ this._state = { ...this._state, isStreaming: false };
61
+ break;
62
+ case "compaction_start":
63
+ this._state = { ...this._state, isCompacting: true };
64
+ break;
65
+ case "compaction_end":
66
+ this._state = { ...this._state, isCompacting: false };
67
+ break;
68
+ case "queue_update":
69
+ this._state = {
70
+ ...this._state,
71
+ steeringMessages: event.steering,
72
+ followUpMessages: event.followUp,
73
+ };
74
+ break;
75
+ case "session_info_changed":
76
+ this._state = { ...this._state, sessionName: event.name };
77
+ break;
78
+ case "thinking_level_changed":
79
+ this._state = { ...this._state, thinkingLevel: event.level };
80
+ break;
81
+ case "state_update":
82
+ // Server pushes a full snapshot update with token usage, context usage, etc.
83
+ if (event.snapshot) {
84
+ this._state = { ...this._state, ...event.snapshot };
85
+ }
86
+ break;
87
+ }
88
+ }
89
+ /** Fetch full state snapshot from server and update local cache */
90
+ async _fetchState() {
91
+ const response = await fetch(`${this._baseUrl}/state`, { headers: this._headers });
92
+ if (!response.ok) {
93
+ throw new Error(`GET /state returned HTTP ${response.status}`);
94
+ }
95
+ const snapshot = (await response.json());
96
+ this._state = snapshot;
97
+ }
98
+ async _post(endpoint, body) {
99
+ const response = await fetch(`${this._baseUrl}/${endpoint}`, {
100
+ method: "POST",
101
+ headers: { ...this._headers, "Content-Type": "application/json" },
102
+ body: body ? JSON.stringify(body) : undefined,
103
+ });
104
+ const data = await response.json();
105
+ if (!response.ok) {
106
+ throw new Error(data.error ?? `HTTP ${response.status}`);
107
+ }
108
+ return data;
109
+ }
110
+ /** GET {endpoint} and return parsed JSON. Throws with status + server error
111
+ * body on non-2xx, so callers see the real cause instead of a misleading
112
+ * downstream failure (e.g. `.map is not a function` on a JSON object). */
113
+ async _getJson(endpoint) {
114
+ const response = await fetch(`${this._baseUrl}/${endpoint}`, { headers: this._headers });
115
+ if (!response.ok) {
116
+ let detail = "";
117
+ try {
118
+ const body = (await response.json());
119
+ if (body && typeof body === "object" && "error" in body) {
120
+ detail = `: ${String(body.error)}`;
121
+ }
122
+ }
123
+ catch {
124
+ // body was not JSON; leave detail empty
125
+ }
126
+ throw new Error(`${endpoint} returned ${response.status}${detail}`);
127
+ }
128
+ return (await response.json());
129
+ }
130
+ // Event subscription
131
+ subscribe(listener) {
132
+ this._subscribers.add(listener);
133
+ return () => {
134
+ this._subscribers.delete(listener);
135
+ };
136
+ }
137
+ // Commands
138
+ async prompt(text, options) {
139
+ await this._post("prompt", { text, options });
140
+ }
141
+ steer(text, images) {
142
+ this._post("prompt", { text, options: { images, streamingBehavior: "steer" } }).catch((e) => {
143
+ process.stderr.write(`[connect] steer failed: ${e.message}\n`);
144
+ });
145
+ }
146
+ followUp(text, images) {
147
+ this._post("prompt", { text, options: { images, streamingBehavior: "followUp" } }).catch((e) => {
148
+ process.stderr.write(`[connect] followUp failed: ${e.message}\n`);
149
+ });
150
+ }
151
+ abort() {
152
+ this._post("abort").catch((e) => {
153
+ process.stderr.write(`[connect] abort failed: ${e.message}\n`);
154
+ });
155
+ }
156
+ abortBash() {
157
+ this._post("abort-bash").catch((e) => {
158
+ process.stderr.write(`[connect] abortBash failed: ${e.message}\n`);
159
+ });
160
+ }
161
+ // State queries
162
+ get model() {
163
+ return this._state.model;
164
+ }
165
+ get thinkingLevel() {
166
+ return this._state.thinkingLevel;
167
+ }
168
+ get isStreaming() {
169
+ return this._state.isStreaming;
170
+ }
171
+ get isCompacting() {
172
+ return this._state.isCompacting;
173
+ }
174
+ get isBashRunning() {
175
+ return this._state.isBashRunning;
176
+ }
177
+ get steeringMessages() {
178
+ return this._state.steeringMessages;
179
+ }
180
+ get followUpMessages() {
181
+ return this._state.followUpMessages;
182
+ }
183
+ get sessionFile() {
184
+ return this._state.sessionFile;
185
+ }
186
+ get sessionName() {
187
+ return this._state.sessionName;
188
+ }
189
+ get messages() {
190
+ return this._state.messages;
191
+ }
192
+ get tokenUsage() {
193
+ return this._state.tokenUsage;
194
+ }
195
+ get contextUsage() {
196
+ return this._state.contextUsage;
197
+ }
198
+ get modelInfo() {
199
+ return this._state.modelInfo;
200
+ }
201
+ get autoCompactEnabled() {
202
+ return this._state.autoCompactEnabled;
203
+ }
204
+ get cwd() {
205
+ return this._state.cwd;
206
+ }
207
+ get availableProviderCount() {
208
+ return this._state.availableProviderCount;
209
+ }
210
+ // Session operations
211
+ async compact(customInstructions) {
212
+ await this._post("compact", { customInstructions });
213
+ }
214
+ setModel(modelId) {
215
+ this._post("set-model", { modelId }).catch((e) => {
216
+ process.stderr.write(`[connect] setModel failed: ${e.message}\n`);
217
+ });
218
+ }
219
+ cycleModel(direction) {
220
+ this._post("cycle-model", { direction }).catch((e) => {
221
+ process.stderr.write(`[connect] cycleModel failed: ${e.message}\n`);
222
+ });
223
+ }
224
+ setThinkingLevel(level) {
225
+ this._post("set-thinking-level", { level }).catch((e) => {
226
+ process.stderr.write(`[connect] setThinkingLevel failed: ${e.message}\n`);
227
+ });
228
+ }
229
+ cycleThinkingLevel(direction) {
230
+ this._post("cycle-thinking-level", { direction }).catch((e) => {
231
+ process.stderr.write(`[connect] cycleThinkingLevel failed: ${e.message}\n`);
232
+ });
233
+ }
234
+ setAutoCompactEnabled(enabled) {
235
+ this._post("settings", { autoCompact: enabled }).catch((e) => {
236
+ process.stderr.write(`[connect] setAutoCompactEnabled failed: ${e.message}\n`);
237
+ });
238
+ }
239
+ setSteeringMode(mode) {
240
+ this._post("settings", { steeringMode: mode }).catch((e) => {
241
+ process.stderr.write(`[connect] setSteeringMode failed: ${e.message}\n`);
242
+ });
243
+ }
244
+ setFollowUpMode(mode) {
245
+ this._post("settings", { followUpMode: mode }).catch((e) => {
246
+ process.stderr.write(`[connect] setFollowUpMode failed: ${e.message}\n`);
247
+ });
248
+ }
249
+ // Runtime operations
250
+ async newSession() {
251
+ await this._post("new-session");
252
+ }
253
+ async switchSession(sessionFile) {
254
+ await this._post("switch-session", { sessionFile });
255
+ }
256
+ async fork(entryId) {
257
+ await this._post("fork", { entryId });
258
+ }
259
+ renameSession(name) {
260
+ this._post("name", { name }).catch((e) => {
261
+ process.stderr.write(`[connect] renameSession failed: ${e.message}\n`);
262
+ });
263
+ }
264
+ setLabel(entryId, label) {
265
+ this._post("label", { entryId, label }).catch((e) => {
266
+ process.stderr.write(`[connect] setLabel failed: ${e.message}\n`);
267
+ });
268
+ }
269
+ setScopedModels(enabledIds) {
270
+ this._post("scoped-models", { enabledIds }).catch((e) => {
271
+ process.stderr.write(`[connect] setScopedModels failed: ${e.message}\n`);
272
+ });
273
+ }
274
+ setEnabledModels(patterns) {
275
+ this._post("enabled-models", { patterns }).catch((e) => {
276
+ process.stderr.write(`[connect] setEnabledModels failed: ${e.message}\n`);
277
+ });
278
+ }
279
+ updateSettings(updates) {
280
+ this._post("settings", updates).catch((e) => {
281
+ process.stderr.write(`[connect] updateSettings failed: ${e.message}\n`);
282
+ });
283
+ }
284
+ async reload() {
285
+ await this._post("reload");
286
+ }
287
+ // Data queries
288
+ getTree() {
289
+ // Fetch synchronously from cached snapshot or fetch on demand
290
+ // For now, we'll fetch via a separate GET request
291
+ throw new Error("Use fetchTree() for async tree data");
292
+ }
293
+ async fetchTree() {
294
+ return this._getJson("tree");
295
+ }
296
+ getUserMessagesForForking() {
297
+ throw new Error("Use fetchUserMessages() for async data");
298
+ }
299
+ async fetchUserMessages() {
300
+ return this._getJson("user-messages");
301
+ }
302
+ async getSessions() {
303
+ return this._getJson("sessions");
304
+ }
305
+ getCommands() {
306
+ throw new Error("Use fetchCommands() for async data");
307
+ }
308
+ async fetchCommands() {
309
+ return this._getJson("commands");
310
+ }
311
+ getModels() {
312
+ throw new Error("Use fetchModels() for async data");
313
+ }
314
+ async fetchModels() {
315
+ return this._getJson("models");
316
+ }
317
+ // Lifecycle
318
+ dispose() {
319
+ this._sseClient.disconnect();
320
+ }
321
+ // Snapshot
322
+ getSnapshot() {
323
+ return { ...this._state };
324
+ }
325
+ }
326
+ //# sourceMappingURL=remote-agent-session-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-agent-session-proxy.js","sourceRoot":"","sources":["../../../src/modes/connect/remote-agent-session-proxy.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage, ThinkingLevel } from \"@sheason/pi-agent-core\";\nimport type { AgentSessionEvent } from \"../../core/agent-session.ts\";\nimport type {\n\tAgentSessionProxy,\n\tContextUsageInfo,\n\tModelInfo,\n\tModelItemData,\n\tProxyPromptOptions,\n\tServeSlashCommand,\n\tSessionItemData,\n\tSessionStateSnapshot,\n\tTokenUsage,\n\tTreeNodeData,\n\tUserMessageItem,\n} from \"../../core/agent-session-proxy.ts\";\nimport type { ConnectAuthHeaders } from \"./auth-headers.ts\";\nimport { SseClient } from \"./sse-client.ts\";\n\ntype Listener = (event: AgentSessionEvent) => void;\ntype DisconnectCallback = (reason: string) => void;\n\nexport class RemoteAgentSessionProxy implements AgentSessionProxy {\n\tprivate _state: SessionStateSnapshot;\n\tprivate readonly _subscribers: Set<Listener> = new Set();\n\tprivate readonly _sseClient: SseClient;\n\tprivate readonly _baseUrl: string;\n\tprivate readonly _onDisconnect: DisconnectCallback | undefined;\n\tprivate readonly _headers: ConnectAuthHeaders | undefined;\n\n\tconstructor(\n\t\tbaseUrl: string,\n\t\tinitialState: SessionStateSnapshot,\n\t\tonDisconnect?: DisconnectCallback,\n\t\toptions: { headers?: ConnectAuthHeaders } = {},\n\t) {\n\t\tthis._baseUrl = baseUrl;\n\t\tthis._state = initialState;\n\t\tthis._onDisconnect = onDisconnect;\n\t\tthis._headers = options.headers;\n\n\t\tthis._sseClient = new SseClient(\n\t\t\t`${baseUrl}/events`,\n\t\t\tthis._headers,\n\t\t\t(event) => this._handleEvent(event),\n\t\t\t(error) => {\n\t\t\t\tprocess.stderr.write(`[connect] SSE error: ${error.message}\\n`);\n\t\t\t\tthis._onDisconnect?.(`SSE error: ${error.message}`);\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tprocess.stderr.write(`[connect] SSE connection closed\\n`);\n\t\t\t\tthis._onDisconnect?.(`SSE connection closed`);\n\t\t\t},\n\t\t);\n\t}\n\n\tasync connect(): Promise<void> {\n\t\tawait this._sseClient.connect();\n\t}\n\n\tprivate _handleEvent(event: AgentSessionEvent): void {\n\t\t// For session_replaced, fetch fresh state BEFORE notifying subscribers\n\t\tif (event.type === \"session_replaced\") {\n\t\t\tthis._state = { ...this._state, messages: [] };\n\t\t\tthis._fetchState()\n\t\t\t\t.then(() => {\n\t\t\t\t\tfor (const subscriber of this._subscribers) {\n\t\t\t\t\t\tsubscriber(event);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch((e: Error) => {\n\t\t\t\t\tprocess.stderr.write(`[connect] failed to fetch state after session_replaced: ${e.message}\\n`);\n\t\t\t\t\t// Still notify subscribers even on failure so UI resets\n\t\t\t\t\tfor (const subscriber of this._subscribers) {\n\t\t\t\t\t\tsubscriber(event);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tthis._updateState(event);\n\t\tfor (const subscriber of this._subscribers) {\n\t\t\tsubscriber(event);\n\t\t}\n\t}\n\n\tprivate _updateState(event: AgentSessionEvent): void {\n\t\tswitch (event.type) {\n\t\t\tcase \"message_start\":\n\t\t\tcase \"message_update\":\n\t\t\tcase \"message_end\":\n\t\t\t\t// Messages managed via events, not the messages array\n\t\t\t\tbreak;\n\t\t\tcase \"agent_start\":\n\t\t\t\tthis._state = { ...this._state, isStreaming: true };\n\t\t\t\tbreak;\n\t\t\tcase \"agent_end\":\n\t\t\t\tthis._state = { ...this._state, isStreaming: false };\n\t\t\t\tbreak;\n\t\t\tcase \"compaction_start\":\n\t\t\t\tthis._state = { ...this._state, isCompacting: true };\n\t\t\t\tbreak;\n\t\t\tcase \"compaction_end\":\n\t\t\t\tthis._state = { ...this._state, isCompacting: false };\n\t\t\t\tbreak;\n\t\t\tcase \"queue_update\":\n\t\t\t\tthis._state = {\n\t\t\t\t\t...this._state,\n\t\t\t\t\tsteeringMessages: event.steering,\n\t\t\t\t\tfollowUpMessages: event.followUp,\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase \"session_info_changed\":\n\t\t\t\tthis._state = { ...this._state, sessionName: event.name };\n\t\t\t\tbreak;\n\t\t\tcase \"thinking_level_changed\":\n\t\t\t\tthis._state = { ...this._state, thinkingLevel: event.level };\n\t\t\t\tbreak;\n\t\t\tcase \"state_update\":\n\t\t\t\t// Server pushes a full snapshot update with token usage, context usage, etc.\n\t\t\t\tif (event.snapshot) {\n\t\t\t\t\tthis._state = { ...this._state, ...event.snapshot };\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/** Fetch full state snapshot from server and update local cache */\n\tprivate async _fetchState(): Promise<void> {\n\t\tconst response = await fetch(`${this._baseUrl}/state`, { headers: this._headers });\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`GET /state returned HTTP ${response.status}`);\n\t\t}\n\t\tconst snapshot = (await response.json()) as SessionStateSnapshot;\n\t\tthis._state = snapshot;\n\t}\n\n\tprivate async _post(endpoint: string, body?: unknown): Promise<unknown> {\n\t\tconst response = await fetch(`${this._baseUrl}/${endpoint}`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { ...this._headers, \"Content-Type\": \"application/json\" },\n\t\t\tbody: body ? JSON.stringify(body) : undefined,\n\t\t});\n\t\tconst data = await response.json();\n\t\tif (!response.ok) {\n\t\t\tthrow new Error((data as { error?: string }).error ?? `HTTP ${response.status}`);\n\t\t}\n\t\treturn data;\n\t}\n\n\t/** GET {endpoint} and return parsed JSON. Throws with status + server error\n\t * body on non-2xx, so callers see the real cause instead of a misleading\n\t * downstream failure (e.g. `.map is not a function` on a JSON object). */\n\tprivate async _getJson<T>(endpoint: string): Promise<T> {\n\t\tconst response = await fetch(`${this._baseUrl}/${endpoint}`, { headers: this._headers });\n\t\tif (!response.ok) {\n\t\t\tlet detail = \"\";\n\t\t\ttry {\n\t\t\t\tconst body = (await response.json()) as { error?: unknown };\n\t\t\t\tif (body && typeof body === \"object\" && \"error\" in body) {\n\t\t\t\t\tdetail = `: ${String(body.error)}`;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// body was not JSON; leave detail empty\n\t\t\t}\n\t\t\tthrow new Error(`${endpoint} returned ${response.status}${detail}`);\n\t\t}\n\t\treturn (await response.json()) as T;\n\t}\n\n\t// Event subscription\n\tsubscribe(listener: Listener): () => void {\n\t\tthis._subscribers.add(listener);\n\t\treturn () => {\n\t\t\tthis._subscribers.delete(listener);\n\t\t};\n\t}\n\n\t// Commands\n\tasync prompt(text: string, options?: ProxyPromptOptions): Promise<void> {\n\t\tawait this._post(\"prompt\", { text, options });\n\t}\n\n\tsteer(text: string, images?: Array<{ url: string; mediaType?: string }>): void {\n\t\tthis._post(\"prompt\", { text, options: { images, streamingBehavior: \"steer\" } }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] steer failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tfollowUp(text: string, images?: Array<{ url: string; mediaType?: string }>): void {\n\t\tthis._post(\"prompt\", { text, options: { images, streamingBehavior: \"followUp\" } }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] followUp failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tabort(): void {\n\t\tthis._post(\"abort\").catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] abort failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tabortBash(): void {\n\t\tthis._post(\"abort-bash\").catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] abortBash failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\t// State queries\n\tget model(): string {\n\t\treturn this._state.model;\n\t}\n\tget thinkingLevel(): ThinkingLevel {\n\t\treturn this._state.thinkingLevel;\n\t}\n\tget isStreaming(): boolean {\n\t\treturn this._state.isStreaming;\n\t}\n\tget isCompacting(): boolean {\n\t\treturn this._state.isCompacting;\n\t}\n\tget isBashRunning(): boolean {\n\t\treturn this._state.isBashRunning;\n\t}\n\tget steeringMessages(): readonly string[] {\n\t\treturn this._state.steeringMessages;\n\t}\n\tget followUpMessages(): readonly string[] {\n\t\treturn this._state.followUpMessages;\n\t}\n\tget sessionFile(): string | undefined {\n\t\treturn this._state.sessionFile;\n\t}\n\tget sessionName(): string | undefined {\n\t\treturn this._state.sessionName;\n\t}\n\tget messages(): readonly AgentMessage[] {\n\t\treturn this._state.messages;\n\t}\n\tget tokenUsage(): TokenUsage {\n\t\treturn this._state.tokenUsage;\n\t}\n\tget contextUsage(): ContextUsageInfo {\n\t\treturn this._state.contextUsage;\n\t}\n\tget modelInfo(): ModelInfo {\n\t\treturn this._state.modelInfo;\n\t}\n\tget autoCompactEnabled(): boolean {\n\t\treturn this._state.autoCompactEnabled;\n\t}\n\tget cwd(): string {\n\t\treturn this._state.cwd;\n\t}\n\tget availableProviderCount(): number {\n\t\treturn this._state.availableProviderCount;\n\t}\n\n\t// Session operations\n\tasync compact(customInstructions?: string): Promise<void> {\n\t\tawait this._post(\"compact\", { customInstructions });\n\t}\n\n\tsetModel(modelId: string): void {\n\t\tthis._post(\"set-model\", { modelId }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] setModel failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tcycleModel(direction: 1 | -1): void {\n\t\tthis._post(\"cycle-model\", { direction }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] cycleModel failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tsetThinkingLevel(level: ThinkingLevel): void {\n\t\tthis._post(\"set-thinking-level\", { level }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] setThinkingLevel failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tcycleThinkingLevel(direction: 1 | -1): void {\n\t\tthis._post(\"cycle-thinking-level\", { direction }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] cycleThinkingLevel failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tsetAutoCompactEnabled(enabled: boolean): void {\n\t\tthis._post(\"settings\", { autoCompact: enabled }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] setAutoCompactEnabled failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tsetSteeringMode(mode: \"all\" | \"one-at-a-time\"): void {\n\t\tthis._post(\"settings\", { steeringMode: mode }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] setSteeringMode failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tsetFollowUpMode(mode: \"all\" | \"one-at-a-time\"): void {\n\t\tthis._post(\"settings\", { followUpMode: mode }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] setFollowUpMode failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\t// Runtime operations\n\tasync newSession(): Promise<void> {\n\t\tawait this._post(\"new-session\");\n\t}\n\n\tasync switchSession(sessionFile: string): Promise<void> {\n\t\tawait this._post(\"switch-session\", { sessionFile });\n\t}\n\n\tasync fork(entryId?: string): Promise<void> {\n\t\tawait this._post(\"fork\", { entryId });\n\t}\n\n\trenameSession(name: string): void {\n\t\tthis._post(\"name\", { name }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] renameSession failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tsetLabel(entryId: string, label: string | undefined): void {\n\t\tthis._post(\"label\", { entryId, label }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] setLabel failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tsetScopedModels(enabledIds: string[] | null): void {\n\t\tthis._post(\"scoped-models\", { enabledIds }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] setScopedModels failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tsetEnabledModels(patterns: string[] | undefined): void {\n\t\tthis._post(\"enabled-models\", { patterns }).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] setEnabledModels failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tupdateSettings(updates: Record<string, unknown>): void {\n\t\tthis._post(\"settings\", updates).catch((e: Error) => {\n\t\t\tprocess.stderr.write(`[connect] updateSettings failed: ${e.message}\\n`);\n\t\t});\n\t}\n\n\tasync reload(): Promise<void> {\n\t\tawait this._post(\"reload\");\n\t}\n\n\t// Data queries\n\tgetTree(): TreeNodeData[] {\n\t\t// Fetch synchronously from cached snapshot or fetch on demand\n\t\t// For now, we'll fetch via a separate GET request\n\t\tthrow new Error(\"Use fetchTree() for async tree data\");\n\t}\n\n\tasync fetchTree(): Promise<TreeNodeData[]> {\n\t\treturn this._getJson<TreeNodeData[]>(\"tree\");\n\t}\n\n\tgetUserMessagesForForking(): UserMessageItem[] {\n\t\tthrow new Error(\"Use fetchUserMessages() for async data\");\n\t}\n\n\tasync fetchUserMessages(): Promise<UserMessageItem[]> {\n\t\treturn this._getJson<UserMessageItem[]>(\"user-messages\");\n\t}\n\n\tasync getSessions(): Promise<SessionItemData[]> {\n\t\treturn this._getJson<SessionItemData[]>(\"sessions\");\n\t}\n\n\tgetCommands(): ServeSlashCommand[] {\n\t\tthrow new Error(\"Use fetchCommands() for async data\");\n\t}\n\n\tasync fetchCommands(): Promise<ServeSlashCommand[]> {\n\t\treturn this._getJson<ServeSlashCommand[]>(\"commands\");\n\t}\n\n\tgetModels(): ModelItemData[] {\n\t\tthrow new Error(\"Use fetchModels() for async data\");\n\t}\n\n\tasync fetchModels(): Promise<ModelItemData[]> {\n\t\treturn this._getJson<ModelItemData[]>(\"models\");\n\t}\n\n\t// Lifecycle\n\tdispose(): void {\n\t\tthis._sseClient.disconnect();\n\t}\n\n\t// Snapshot\n\tgetSnapshot(): SessionStateSnapshot {\n\t\treturn { ...this._state };\n\t}\n}\n"]}