lsd-pi 1.2.4 → 1.3.6

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 (357) hide show
  1. package/README.md +22 -16
  2. package/dist/app-paths.d.ts +4 -0
  3. package/dist/app-paths.js +4 -0
  4. package/dist/bedrock-auth.d.ts +4 -0
  5. package/dist/bedrock-auth.js +4 -0
  6. package/dist/bundled-extension-paths.d.ts +4 -0
  7. package/dist/bundled-extension-paths.js +4 -0
  8. package/dist/cli-theme.d.ts +2 -2
  9. package/dist/cli-theme.js +13 -14
  10. package/dist/cli.js +43 -3
  11. package/dist/codex-rotate-settings.d.ts +4 -0
  12. package/dist/codex-rotate-settings.js +4 -0
  13. package/dist/help-text.d.ts +4 -0
  14. package/dist/help-text.js +4 -0
  15. package/dist/lsd-brand.d.ts +4 -0
  16. package/dist/lsd-brand.js +4 -0
  17. package/dist/onboarding-llm.d.ts +5 -0
  18. package/dist/onboarding-llm.js +5 -0
  19. package/dist/project-sessions.d.ts +4 -0
  20. package/dist/project-sessions.js +4 -0
  21. package/dist/resources/agents/generic.md +1 -0
  22. package/dist/resources/agents/scout.md +8 -1
  23. package/dist/resources/agents/worker.md +1 -0
  24. package/dist/resources/extensions/ask-user-questions.js +70 -0
  25. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +6 -16
  26. package/dist/resources/extensions/browser-tools/tools/codegen.js +5 -5
  27. package/dist/resources/extensions/browser-tools/tools/navigation.js +107 -178
  28. package/dist/resources/extensions/browser-tools/tools/network-mock.js +112 -167
  29. package/dist/resources/extensions/browser-tools/tools/pages.js +182 -234
  30. package/dist/resources/extensions/browser-tools/tools/refs.js +202 -461
  31. package/dist/resources/extensions/browser-tools/tools/session.js +176 -323
  32. package/dist/resources/extensions/browser-tools/tools/state-persistence.js +91 -154
  33. package/dist/resources/extensions/browser-tools/utils.js +1 -1
  34. package/dist/resources/extensions/mac-tools/index.js +19 -34
  35. package/dist/resources/extensions/memory/index.js +20 -2
  36. package/dist/resources/extensions/shared/interview-ui.js +103 -20
  37. package/dist/resources/extensions/slash-commands/extension-manifest.json +2 -2
  38. package/dist/resources/extensions/slash-commands/fast.js +73 -0
  39. package/dist/resources/extensions/slash-commands/index.js +2 -0
  40. package/dist/resources/extensions/slash-commands/plan.js +54 -28
  41. package/dist/resources/extensions/slash-commands/tools.js +40 -4
  42. package/dist/resources/extensions/subagent/agent-switcher-component.js +208 -0
  43. package/dist/resources/extensions/subagent/agent-switcher-model.js +107 -0
  44. package/dist/resources/extensions/subagent/background-job-manager.js +24 -6
  45. package/dist/resources/extensions/subagent/background-runner.js +4 -0
  46. package/dist/resources/extensions/subagent/in-process-runner.js +387 -0
  47. package/dist/resources/extensions/subagent/index.js +715 -370
  48. package/dist/resources/extensions/subagent/launch-helpers.js +19 -5
  49. package/dist/resources/extensions/subagent/legacy-runner.js +503 -0
  50. package/dist/resources/extensions/voice/index.js +96 -36
  51. package/dist/resources/extensions/voice/push-to-talk.js +26 -0
  52. package/dist/shared-paths.d.ts +4 -0
  53. package/dist/shared-paths.js +4 -0
  54. package/dist/shared-preferences.d.ts +4 -0
  55. package/dist/shared-preferences.js +4 -0
  56. package/dist/startup-model-validation.d.ts +1 -1
  57. package/dist/startup-timings.d.ts +4 -0
  58. package/dist/startup-timings.js +4 -0
  59. package/dist/update-check.d.ts +4 -0
  60. package/dist/update-check.js +4 -0
  61. package/dist/update-cmd.d.ts +4 -0
  62. package/dist/update-cmd.js +4 -0
  63. package/dist/welcome-screen.js +4 -4
  64. package/dist/wizard.d.ts +4 -0
  65. package/dist/wizard.js +4 -0
  66. package/package.json +1 -1
  67. package/packages/pi-agent-core/dist/agent.d.ts +28 -0
  68. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  69. package/packages/pi-agent-core/dist/agent.js +105 -5
  70. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  71. package/packages/pi-agent-core/dist/types.d.ts +13 -2
  72. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  73. package/packages/pi-agent-core/dist/types.js.map +1 -1
  74. package/packages/pi-agent-core/src/agent.ts +142 -6
  75. package/packages/pi-agent-core/src/types.ts +12 -3
  76. package/packages/pi-ai/dist/adaptive/classifier.d.ts +29 -0
  77. package/packages/pi-ai/dist/adaptive/classifier.d.ts.map +1 -0
  78. package/packages/pi-ai/dist/adaptive/classifier.js +72 -0
  79. package/packages/pi-ai/dist/adaptive/classifier.js.map +1 -0
  80. package/packages/pi-ai/dist/adaptive/classifier.test.d.ts +2 -0
  81. package/packages/pi-ai/dist/adaptive/classifier.test.d.ts.map +1 -0
  82. package/packages/pi-ai/dist/adaptive/classifier.test.js +32 -0
  83. package/packages/pi-ai/dist/adaptive/classifier.test.js.map +1 -0
  84. package/packages/pi-ai/dist/index.d.ts +1 -0
  85. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  86. package/packages/pi-ai/dist/index.js +1 -0
  87. package/packages/pi-ai/dist/index.js.map +1 -1
  88. package/packages/pi-ai/dist/providers/amazon-bedrock.js +0 -2
  89. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  90. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  91. package/packages/pi-ai/dist/providers/anthropic-shared.js +0 -2
  92. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  93. package/packages/pi-ai/dist/providers/azure-openai-responses.d.ts +1 -1
  94. package/packages/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
  95. package/packages/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
  96. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  97. package/packages/pi-ai/dist/providers/google-gemini-cli.js +0 -4
  98. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  99. package/packages/pi-ai/dist/providers/google-vertex.js +0 -5
  100. package/packages/pi-ai/dist/providers/google-vertex.js.map +1 -1
  101. package/packages/pi-ai/dist/providers/google.js +0 -5
  102. package/packages/pi-ai/dist/providers/google.js.map +1 -1
  103. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts +35 -2
  104. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  105. package/packages/pi-ai/dist/providers/openai-codex-responses.js +32 -6
  106. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  107. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +127 -16
  108. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -1
  109. package/packages/pi-ai/dist/providers/openai-completions.d.ts +1 -1
  110. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  111. package/packages/pi-ai/dist/providers/openai-completions.js +0 -1
  112. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  113. package/packages/pi-ai/dist/providers/openai-responses.d.ts +9 -2
  114. package/packages/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
  115. package/packages/pi-ai/dist/providers/openai-responses.fast-mode.test.d.ts +2 -0
  116. package/packages/pi-ai/dist/providers/openai-responses.fast-mode.test.d.ts.map +1 -0
  117. package/packages/pi-ai/dist/providers/openai-responses.fast-mode.test.js +67 -0
  118. package/packages/pi-ai/dist/providers/openai-responses.fast-mode.test.js.map +1 -0
  119. package/packages/pi-ai/dist/providers/openai-responses.js +21 -3
  120. package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
  121. package/packages/pi-ai/dist/providers/openai-shared.d.ts +0 -1
  122. package/packages/pi-ai/dist/providers/openai-shared.d.ts.map +1 -1
  123. package/packages/pi-ai/dist/providers/openai-shared.js +0 -4
  124. package/packages/pi-ai/dist/providers/openai-shared.js.map +1 -1
  125. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  126. package/packages/pi-ai/dist/providers/simple-options.js +2 -1
  127. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  128. package/packages/pi-ai/dist/types.d.ts +6 -2
  129. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  130. package/packages/pi-ai/dist/types.js.map +1 -1
  131. package/packages/pi-ai/src/adaptive/classifier.test.ts +38 -0
  132. package/packages/pi-ai/src/adaptive/classifier.ts +107 -0
  133. package/packages/pi-ai/src/index.ts +1 -0
  134. package/packages/pi-ai/src/providers/amazon-bedrock.ts +0 -2
  135. package/packages/pi-ai/src/providers/anthropic-shared.ts +0 -2
  136. package/packages/pi-ai/src/providers/azure-openai-responses.ts +1 -1
  137. package/packages/pi-ai/src/providers/google-gemini-cli.ts +0 -4
  138. package/packages/pi-ai/src/providers/google-vertex.ts +0 -5
  139. package/packages/pi-ai/src/providers/google.ts +0 -5
  140. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +143 -20
  141. package/packages/pi-ai/src/providers/openai-codex-responses.ts +48 -7
  142. package/packages/pi-ai/src/providers/openai-completions.ts +1 -2
  143. package/packages/pi-ai/src/providers/openai-responses.fast-mode.test.ts +73 -0
  144. package/packages/pi-ai/src/providers/openai-responses.ts +27 -4
  145. package/packages/pi-ai/src/providers/openai-shared.ts +0 -3
  146. package/packages/pi-ai/src/providers/simple-options.ts +2 -1
  147. package/packages/pi-ai/src/types.ts +6 -2
  148. package/packages/pi-coding-agent/dist/cli/args.js +2 -2
  149. package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
  150. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +7 -2
  151. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  152. package/packages/pi-coding-agent/dist/core/agent-session.js +53 -20
  153. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  154. package/packages/pi-coding-agent/dist/core/keybindings.d.ts +1 -1
  155. package/packages/pi-coding-agent/dist/core/keybindings.d.ts.map +1 -1
  156. package/packages/pi-coding-agent/dist/core/keybindings.js +2 -0
  157. package/packages/pi-coding-agent/dist/core/keybindings.js.map +1 -1
  158. package/packages/pi-coding-agent/dist/core/lsp/lsp.md +3 -1
  159. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  160. package/packages/pi-coding-agent/dist/core/sdk.js +36 -8
  161. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  162. package/packages/pi-coding-agent/dist/core/sdk.test.js +37 -0
  163. package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -1
  164. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +8 -0
  165. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  166. package/packages/pi-coding-agent/dist/core/session-manager.js +4 -0
  167. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  168. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +18 -7
  169. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  170. package/packages/pi-coding-agent/dist/core/settings-manager.fast-mode.test.d.ts +2 -0
  171. package/packages/pi-coding-agent/dist/core/settings-manager.fast-mode.test.d.ts.map +1 -0
  172. package/packages/pi-coding-agent/dist/core/settings-manager.fast-mode.test.js +35 -0
  173. package/packages/pi-coding-agent/dist/core/settings-manager.fast-mode.test.js.map +1 -0
  174. package/packages/pi-coding-agent/dist/core/settings-manager.js +32 -2
  175. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  176. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  177. package/packages/pi-coding-agent/dist/core/skills.js +4 -1
  178. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  179. package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
  180. package/packages/pi-coding-agent/dist/core/slash-commands.js +2 -1
  181. package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
  182. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  183. package/packages/pi-coding-agent/dist/core/system-prompt.js +12 -3
  184. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  185. package/packages/pi-coding-agent/dist/core/tool-priority.d.ts +4 -0
  186. package/packages/pi-coding-agent/dist/core/tool-priority.d.ts.map +1 -0
  187. package/packages/pi-coding-agent/dist/core/tool-priority.js +18 -0
  188. package/packages/pi-coding-agent/dist/core/tool-priority.js.map +1 -0
  189. package/packages/pi-coding-agent/dist/core/tool-priority.test.d.ts +2 -0
  190. package/packages/pi-coding-agent/dist/core/tool-priority.test.d.ts.map +1 -0
  191. package/packages/pi-coding-agent/dist/core/tool-priority.test.js +27 -0
  192. package/packages/pi-coding-agent/dist/core/tool-priority.test.js.map +1 -0
  193. package/packages/pi-coding-agent/dist/core/tools/grep.js +1 -1
  194. package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  195. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -0
  196. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  197. package/packages/pi-coding-agent/dist/core/tools/index.js +2 -0
  198. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  199. package/packages/pi-coding-agent/dist/core/tools/pty.d.ts +10 -1
  200. package/packages/pi-coding-agent/dist/core/tools/pty.d.ts.map +1 -1
  201. package/packages/pi-coding-agent/dist/core/tools/pty.js +29 -3
  202. package/packages/pi-coding-agent/dist/core/tools/pty.js.map +1 -1
  203. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-summary-line.test.d.ts +2 -0
  204. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-summary-line.test.d.ts.map +1 -0
  205. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-summary-line.test.js +26 -0
  206. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-summary-line.test.js.map +1 -0
  207. package/packages/pi-coding-agent/dist/modes/interactive/components/btw-overlay.d.ts +45 -0
  208. package/packages/pi-coding-agent/dist/modes/interactive/components/btw-overlay.d.ts.map +1 -0
  209. package/packages/pi-coding-agent/dist/modes/interactive/components/btw-overlay.js +314 -0
  210. package/packages/pi-coding-agent/dist/modes/interactive/components/btw-overlay.js.map +1 -0
  211. package/packages/pi-coding-agent/dist/modes/interactive/components/btw-overlay.test.d.ts +2 -0
  212. package/packages/pi-coding-agent/dist/modes/interactive/components/btw-overlay.test.d.ts.map +1 -0
  213. package/packages/pi-coding-agent/dist/modes/interactive/components/btw-overlay.test.js +122 -0
  214. package/packages/pi-coding-agent/dist/modes/interactive/components/btw-overlay.test.js.map +1 -0
  215. package/packages/pi-coding-agent/dist/modes/interactive/components/embedded-terminal.js +1 -1
  216. package/packages/pi-coding-agent/dist/modes/interactive/components/embedded-terminal.js.map +1 -1
  217. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts +2 -0
  218. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  219. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +19 -2
  220. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  221. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +11 -2
  222. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  223. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +49 -6
  224. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  225. package/packages/pi-coding-agent/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  226. package/packages/pi-coding-agent/dist/modes/interactive/components/thinking-selector.js +1 -2
  227. package/packages/pi-coding-agent/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  228. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +6 -0
  229. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  230. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +18 -4
  231. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  232. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-summary-line.d.ts +13 -0
  233. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-summary-line.d.ts.map +1 -0
  234. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-summary-line.js +49 -0
  235. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-summary-line.js.map +1 -0
  236. package/packages/pi-coding-agent/dist/modes/interactive/controllers/__tests__/chat-controller.collapsed-tool-summary.test.d.ts +2 -0
  237. package/packages/pi-coding-agent/dist/modes/interactive/controllers/__tests__/chat-controller.collapsed-tool-summary.test.d.ts.map +1 -0
  238. package/packages/pi-coding-agent/dist/modes/interactive/controllers/__tests__/chat-controller.collapsed-tool-summary.test.js +197 -0
  239. package/packages/pi-coding-agent/dist/modes/interactive/controllers/__tests__/chat-controller.collapsed-tool-summary.test.js.map +1 -0
  240. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  241. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +106 -0
  242. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  243. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  244. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -0
  245. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  246. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +3 -0
  247. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  248. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  249. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +4 -0
  250. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  251. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +88 -2
  252. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  253. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  254. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +41 -0
  255. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  256. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +2 -2
  257. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  258. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +10 -6
  259. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  260. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +1 -1
  261. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  262. package/packages/pi-coding-agent/dist/modes/print-mode.d.ts.map +1 -1
  263. package/packages/pi-coding-agent/dist/modes/print-mode.js +6 -0
  264. package/packages/pi-coding-agent/dist/modes/print-mode.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  266. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +20 -0
  267. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  268. package/packages/pi-coding-agent/dist/tests/path-display.test.js +15 -0
  269. package/packages/pi-coding-agent/dist/tests/path-display.test.js.map +1 -1
  270. package/packages/pi-coding-agent/package.json +1 -1
  271. package/packages/pi-coding-agent/src/cli/args.ts +2 -2
  272. package/packages/pi-coding-agent/src/core/agent-session.ts +58 -21
  273. package/packages/pi-coding-agent/src/core/keybindings.ts +4 -1
  274. package/packages/pi-coding-agent/src/core/lsp/lsp.md +3 -1
  275. package/packages/pi-coding-agent/src/core/sdk.test.ts +45 -0
  276. package/packages/pi-coding-agent/src/core/sdk.ts +39 -8
  277. package/packages/pi-coding-agent/src/core/session-manager.ts +12 -0
  278. package/packages/pi-coding-agent/src/core/settings-manager.fast-mode.test.ts +46 -0
  279. package/packages/pi-coding-agent/src/core/settings-manager.ts +50 -9
  280. package/packages/pi-coding-agent/src/core/skills.ts +4 -1
  281. package/packages/pi-coding-agent/src/core/slash-commands.ts +2 -1
  282. package/packages/pi-coding-agent/src/core/system-prompt.ts +14 -3
  283. package/packages/pi-coding-agent/src/core/tool-priority.test.ts +30 -0
  284. package/packages/pi-coding-agent/src/core/tool-priority.ts +17 -0
  285. package/packages/pi-coding-agent/src/core/tools/grep.ts +1 -1
  286. package/packages/pi-coding-agent/src/core/tools/index.ts +3 -0
  287. package/packages/pi-coding-agent/src/core/tools/pty.ts +45 -6
  288. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-summary-line.test.ts +31 -0
  289. package/packages/pi-coding-agent/src/modes/interactive/components/btw-overlay.test.ts +172 -0
  290. package/packages/pi-coding-agent/src/modes/interactive/components/btw-overlay.ts +402 -0
  291. package/packages/pi-coding-agent/src/modes/interactive/components/embedded-terminal.ts +1 -1
  292. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +18 -2
  293. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +63 -9
  294. package/packages/pi-coding-agent/src/modes/interactive/components/thinking-selector.ts +1 -2
  295. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1154 -1136
  296. package/packages/pi-coding-agent/src/modes/interactive/components/tool-summary-line.ts +64 -0
  297. package/packages/pi-coding-agent/src/modes/interactive/controllers/__tests__/chat-controller.collapsed-tool-summary.test.ts +228 -0
  298. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +494 -389
  299. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +7 -0
  300. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +3 -0
  301. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +103 -3
  302. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +60 -1
  303. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +11 -7
  304. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +1 -1
  305. package/packages/pi-coding-agent/src/modes/print-mode.ts +6 -0
  306. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +29 -0
  307. package/packages/pi-coding-agent/src/tests/path-display.test.ts +17 -0
  308. package/packages/pi-tui/dist/components/loader.d.ts +5 -2
  309. package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
  310. package/packages/pi-tui/dist/components/loader.js +33 -3
  311. package/packages/pi-tui/dist/components/loader.js.map +1 -1
  312. package/packages/pi-tui/src/components/loader.ts +31 -3
  313. package/packages/rpc-client/src/index.ts +1 -1
  314. package/packages/rpc-client/src/rpc-client.ts +29 -0
  315. package/packages/rpc-client/src/rpc-types.ts +1 -1
  316. package/pkg/dist/modes/interactive/theme/theme.d.ts +2 -2
  317. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  318. package/pkg/dist/modes/interactive/theme/theme.js +10 -6
  319. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  320. package/pkg/dist/modes/interactive/theme/themes.js +1 -1
  321. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  322. package/pkg/package.json +1 -1
  323. package/src/resources/agents/generic.md +1 -0
  324. package/src/resources/agents/scout.md +8 -1
  325. package/src/resources/agents/worker.md +1 -0
  326. package/src/resources/extensions/ask-user-questions.ts +88 -0
  327. package/src/resources/extensions/bg-shell/bg-shell-tool.ts +6 -16
  328. package/src/resources/extensions/browser-tools/tools/codegen.ts +5 -5
  329. package/src/resources/extensions/browser-tools/tools/navigation.ts +118 -196
  330. package/src/resources/extensions/browser-tools/tools/network-mock.ts +114 -205
  331. package/src/resources/extensions/browser-tools/tools/pages.ts +183 -237
  332. package/src/resources/extensions/browser-tools/tools/refs.ts +193 -507
  333. package/src/resources/extensions/browser-tools/tools/session.ts +182 -321
  334. package/src/resources/extensions/browser-tools/tools/state-persistence.ts +94 -172
  335. package/src/resources/extensions/browser-tools/utils.ts +1 -1
  336. package/src/resources/extensions/mac-tools/index.ts +19 -34
  337. package/src/resources/extensions/memory/index.ts +22 -2
  338. package/src/resources/extensions/shared/interview-ui.ts +108 -15
  339. package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +61 -0
  340. package/src/resources/extensions/shared/tests/custom-ui-fallbacks.test.ts +46 -0
  341. package/src/resources/extensions/slash-commands/extension-manifest.json +2 -2
  342. package/src/resources/extensions/slash-commands/fast.ts +89 -0
  343. package/src/resources/extensions/slash-commands/index.ts +2 -0
  344. package/src/resources/extensions/slash-commands/plan.ts +59 -30
  345. package/src/resources/extensions/slash-commands/tools.ts +43 -4
  346. package/src/resources/extensions/subagent/agent-switcher-component.ts +228 -0
  347. package/src/resources/extensions/subagent/agent-switcher-model.ts +160 -0
  348. package/src/resources/extensions/subagent/background-job-manager.ts +57 -6
  349. package/src/resources/extensions/subagent/background-runner.ts +8 -0
  350. package/src/resources/extensions/subagent/background-types.ts +4 -0
  351. package/src/resources/extensions/subagent/in-process-runner.ts +534 -0
  352. package/src/resources/extensions/subagent/index.ts +998 -493
  353. package/src/resources/extensions/subagent/launch-helpers.ts +15 -4
  354. package/src/resources/extensions/subagent/legacy-runner.ts +607 -0
  355. package/src/resources/extensions/voice/index.ts +308 -238
  356. package/src/resources/extensions/voice/push-to-talk.ts +42 -0
  357. package/src/resources/extensions/voice/tests/push-to-talk.test.ts +109 -0
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-mode.js","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-mode.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RPC mode: Headless operation with JSON stdin/stdout protocol.\n *\n * Used for embedding the agent in other applications.\n * Receives commands as JSON on stdin, outputs events and responses as JSON on stdout.\n *\n * Protocol:\n * - Commands: JSON objects with `type` field, optional `id` for correlation\n * - Responses: JSON objects with `type: \"response\"`, `command`, `success`, and optional `data`/`error`\n * - Events: AgentSessionEvent objects streamed as they occur\n * - Extension UI: Extension UI requests are emitted, client responds with extension_ui_response\n */\n\nimport * as crypto from \"node:crypto\";\nimport type { AgentSession } from \"../../core/agent-session.js\";\nimport type {\n\tExtensionUIContext,\n\tExtensionUIDialogOptions,\n\tExtensionWidgetOptions,\n} from \"../../core/extensions/index.js\";\nimport { InteractiveMode } from \"../interactive/interactive-mode.js\";\nimport { type Theme, theme } from \"../interactive/theme/theme.js\";\nimport { createDefaultCommandContextActions } from \"../shared/command-context-actions.js\";\nimport { attachJsonlLineReader, serializeJsonLine } from \"./jsonl.js\";\nimport { RemoteTerminal } from \"./remote-terminal.js\";\nimport type {\n\tRpcCommand,\n\tRpcExtensionUIRequest,\n\tRpcExtensionUIResponse,\n\tRpcInitResult,\n\tRpcResponse,\n\tRpcSessionState,\n\tRpcSlashCommand,\n} from \"./rpc-types.js\";\n\n// Re-export types for consumers\nexport type {\n\tRpcCommand,\n\tRpcExtensionUIRequest,\n\tRpcExtensionUIResponse,\n\tRpcInitResult,\n\tRpcProtocolVersion,\n\tRpcResponse,\n\tRpcSessionState,\n\tRpcV2Event,\n} from \"./rpc-types.js\";\n\n/**\n * Run in RPC mode.\n * Listens for JSON commands on stdin, outputs events and responses on stdout.\n */\nexport async function runRpcMode(session: AgentSession): Promise<never> {\n\tconst output = (obj: RpcResponse | RpcExtensionUIRequest | object) => {\n\t\tprocess.stdout.write(serializeJsonLine(obj));\n\t};\n\n\tconst success = <T extends RpcCommand[\"type\"]>(\n\t\tid: string | undefined,\n\t\tcommand: T,\n\t\tdata?: object | null,\n\t): RpcResponse => {\n\t\tif (data === undefined) {\n\t\t\treturn { id, type: \"response\", command, success: true } as RpcResponse;\n\t\t}\n\t\treturn { id, type: \"response\", command, success: true, data } as RpcResponse;\n\t};\n\n\tconst error = (id: string | undefined, command: string, message: string): RpcResponse => {\n\t\treturn { id, type: \"response\", command, success: false, error: message };\n\t};\n\n\t// Pending extension UI requests waiting for response\n\tconst pendingExtensionRequests = new Map<\n\t\tstring,\n\t\t{ resolve: (value: any) => void; reject: (error: Error) => void }\n\t>();\n\n\t// Shutdown request flag\n\tlet shutdownRequested = false;\n\n\t// v2 protocol version detection state\n\tlet protocolVersion: 1 | 2 = 1;\n\tlet protocolLocked = false;\n\n\t// v2 runId threading: tracks the current execution run\n\tlet currentRunId: string | null = null;\n\n\t// v2 event filtering: null = no filter (all events); Set = only listed event types\n\tlet eventFilter: Set<string> | null = null;\n\n\tconst embeddedTerminalEnabled = process.env.GSD_WEB_BRIDGE_TUI === \"1\";\n\tconst remoteTerminal = embeddedTerminalEnabled\n\t\t? new RemoteTerminal({\n\t\t\t\tonWrite: (data) => {\n\t\t\t\t\toutput({ type: \"terminal_output\", data });\n\t\t\t\t},\n\t\t\t})\n\t\t: null;\n\tlet embeddedInteractiveMode: InteractiveMode | null = null;\n\tlet embeddedInteractiveInitPromise: Promise<void> | null = null;\n\tconst startupNotifications: Array<{ message: string; type?: \"info\" | \"warning\" | \"error\" | \"success\" }> = [];\n\tconst statusState = new Map<string, string | undefined>();\n\tconst widgetState = new Map<string, { content: unknown; options?: ExtensionWidgetOptions }>();\n\tlet footerFactory: Parameters<ExtensionUIContext[\"setFooter\"]>[0] | undefined;\n\tlet headerFactory: Parameters<ExtensionUIContext[\"setHeader\"]>[0] | undefined;\n\tlet workingMessageState: string | undefined;\n\tlet titleState: string | undefined;\n\tlet editorTextState: string | undefined;\n\n\tconst withEmbeddedUiContext = async (apply: (ui: ExtensionUIContext) => void | Promise<void>): Promise<void> => {\n\t\tif (!embeddedInteractiveMode) {\n\t\t\treturn;\n\t\t}\n\t\tawait apply(embeddedInteractiveMode.getExtensionUIContext());\n\t};\n\n\tconst replayEmbeddedUiState = async (interactiveMode: InteractiveMode): Promise<void> => {\n\t\tconst ui = interactiveMode.getExtensionUIContext();\n\t\tui.setHeader(headerFactory);\n\t\tui.setFooter(footerFactory);\n\t\tfor (const [key, text] of statusState.entries()) {\n\t\t\tui.setStatus(key, text);\n\t\t}\n\t\tfor (const [key, widget] of widgetState.entries()) {\n\t\t\tui.setWidget(key, widget.content as any, widget.options);\n\t\t}\n\t\tui.setWorkingMessage(workingMessageState);\n\t\tif (titleState) {\n\t\t\tui.setTitle(titleState);\n\t\t}\n\t\tif (editorTextState !== undefined) {\n\t\t\tui.setEditorText(editorTextState);\n\t\t}\n\t\tfor (const { message, type } of startupNotifications) {\n\t\t\tui.notify(message, type);\n\t\t}\n\t};\n\n\tconst ensureEmbeddedInteractiveMode = async (): Promise<InteractiveMode> => {\n\t\tif (!embeddedTerminalEnabled || !remoteTerminal) {\n\t\t\tthrow new Error(\"Embedded terminal is not enabled for this RPC host\");\n\t\t}\n\n\t\tif (embeddedInteractiveMode) {\n\t\t\treturn embeddedInteractiveMode;\n\t\t}\n\n\t\tif (!embeddedInteractiveInitPromise) {\n\t\t\tembeddedInteractiveMode = new InteractiveMode(session, {\n\t\t\t\tterminal: remoteTerminal,\n\t\t\t\tbindExtensions: false,\n\t\t\t\tsubmitPromptsDirectly: true,\n\t\t\t\tshutdownBehavior: \"ignore\",\n\t\t\t});\n\t\t\tembeddedInteractiveInitPromise = embeddedInteractiveMode.init().then(async () => {\n\t\t\t\tawait replayEmbeddedUiState(embeddedInteractiveMode!);\n\t\t\t}).catch((error) => {\n\t\t\t\tembeddedInteractiveMode = null;\n\t\t\t\tthrow error;\n\t\t\t}).finally(() => {\n\t\t\t\tembeddedInteractiveInitPromise = null;\n\t\t\t});\n\t\t}\n\n\t\tawait embeddedInteractiveInitPromise;\n\t\treturn embeddedInteractiveMode!;\n\t};\n\n\t/** Helper for dialog methods with signal/timeout support */\n\tfunction createDialogPromise<T>(\n\t\topts: ExtensionUIDialogOptions | undefined,\n\t\tdefaultValue: T,\n\t\trequest: Record<string, unknown>,\n\t\tparseResponse: (response: RpcExtensionUIResponse) => T,\n\t): Promise<T> {\n\t\tif (opts?.signal?.aborted) return Promise.resolve(defaultValue);\n\n\t\tconst id = crypto.randomUUID();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n\t\t\tconst cleanup = () => {\n\t\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\t\topts?.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\tpendingExtensionRequests.delete(id);\n\t\t\t};\n\n\t\t\tconst onAbort = () => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve(defaultValue);\n\t\t\t};\n\t\t\topts?.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\t\tif (opts?.timeout) {\n\t\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tresolve(defaultValue);\n\t\t\t\t}, opts.timeout);\n\t\t\t}\n\n\t\t\tpendingExtensionRequests.set(id, {\n\t\t\t\tresolve: (response: RpcExtensionUIResponse) => {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tresolve(parseResponse(response));\n\t\t\t\t},\n\t\t\t\treject,\n\t\t\t});\n\t\t\toutput({ type: \"extension_ui_request\", id, ...request } as RpcExtensionUIRequest);\n\t\t});\n\t}\n\n\t/**\n\t * Create an extension UI context that uses the RPC protocol.\n\t */\n\tconst createExtensionUIContext = (): ExtensionUIContext => ({\n\t\tselect: (title, options, opts) =>\n\t\t\tcreateDialogPromise(opts, undefined, { method: \"select\", title, options, timeout: opts?.timeout, allowMultiple: opts?.allowMultiple }, (r) =>\n\t\t\t\t\"cancelled\" in r && r.cancelled ? undefined : \"values\" in r ? r.values : \"value\" in r ? r.value : undefined,\n\t\t\t),\n\n\t\tconfirm: (title, message, opts) =>\n\t\t\tcreateDialogPromise(opts, false, { method: \"confirm\", title, message, timeout: opts?.timeout }, (r) =>\n\t\t\t\t\"cancelled\" in r && r.cancelled ? false : \"confirmed\" in r ? r.confirmed : false,\n\t\t\t),\n\n\t\tinput: (title, placeholder, opts) =>\n\t\t\tcreateDialogPromise(opts, undefined, { method: \"input\", title, placeholder, timeout: opts?.timeout }, (r) =>\n\t\t\t\t\"cancelled\" in r && r.cancelled ? undefined : \"value\" in r ? r.value : undefined,\n\t\t\t),\n\n\t\tnotify(message: string, type?: \"info\" | \"warning\" | \"error\" | \"success\"): void {\n\t\t\tstartupNotifications.push({ message, type });\n\t\t\tif (startupNotifications.length > 20) {\n\t\t\t\tstartupNotifications.splice(0, startupNotifications.length - 20);\n\t\t\t}\n\t\t\t// Fire and forget - no response needed\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"notify\",\n\t\t\t\tmessage,\n\t\t\t\tnotifyType: type,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t\tvoid withEmbeddedUiContext((ui) => {\n\t\t\t\tui.notify(message, type);\n\t\t\t});\n\t\t},\n\n\t\tonTerminalInput(): () => void {\n\t\t\t// Raw terminal input not supported in RPC mode\n\t\t\treturn () => {};\n\t\t},\n\n\t\tsetStatus(key: string, text: string | undefined): void {\n\t\t\tstatusState.set(key, text);\n\t\t\t// Fire and forget - no response needed\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"setStatus\",\n\t\t\t\tstatusKey: key,\n\t\t\t\tstatusText: text,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t\tvoid withEmbeddedUiContext((ui) => {\n\t\t\t\tui.setStatus(key, text);\n\t\t\t});\n\t\t},\n\n\t\tsetWorkingMessage(message?: string): void {\n\t\t\tworkingMessageState = message;\n\t\t\tvoid withEmbeddedUiContext((ui) => {\n\t\t\t\tui.setWorkingMessage(message);\n\t\t\t});\n\t\t},\n\n\t\tsetWidget(key: string, content: unknown, options?: ExtensionWidgetOptions): void {\n\t\t\twidgetState.set(key, { content, options });\n\t\t\tif (content === undefined || Array.isArray(content)) {\n\t\t\t\toutput({\n\t\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\t\tmethod: \"setWidget\",\n\t\t\t\t\twidgetKey: key,\n\t\t\t\t\twidgetLines: content as string[] | undefined,\n\t\t\t\t\twidgetPlacement: options?.placement,\n\t\t\t\t} as RpcExtensionUIRequest);\n\t\t\t} else if (typeof content === \"function\") {\n\t\t\t\t// Factory-based widgets require TUI access which RPC mode does not have.\n\t\t\t\t// Emit a minimal placeholder so the RPC client knows a widget was requested.\n\t\t\t\toutput({\n\t\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\t\tmethod: \"setWidget\",\n\t\t\t\t\twidgetKey: key,\n\t\t\t\t\twidgetLines: undefined,\n\t\t\t\t\twidgetPlacement: options?.placement,\n\t\t\t\t} as RpcExtensionUIRequest);\n\t\t\t}\n\t\t\tvoid withEmbeddedUiContext((ui) => {\n\t\t\t\tui.setWidget(key, content as any, options);\n\t\t\t});\n\t\t},\n\n\t\tsetFooter(factory: Parameters<ExtensionUIContext[\"setFooter\"]>[0]): void {\n\t\t\tfooterFactory = factory;\n\t\t\tvoid withEmbeddedUiContext((ui) => {\n\t\t\t\tui.setFooter(factory);\n\t\t\t});\n\t\t},\n\n\t\tsetHeader(factory: Parameters<ExtensionUIContext[\"setHeader\"]>[0]): void {\n\t\t\theaderFactory = factory;\n\t\t\tvoid withEmbeddedUiContext((ui) => {\n\t\t\t\tui.setHeader(factory);\n\t\t\t});\n\t\t},\n\n\t\tsetTitle(title: string): void {\n\t\t\ttitleState = title;\n\t\t\t// Fire and forget - host can implement terminal title control\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"setTitle\",\n\t\t\t\ttitle,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t\tvoid withEmbeddedUiContext((ui) => {\n\t\t\t\tui.setTitle(title);\n\t\t\t});\n\t\t},\n\n\t\tasync custom() {\n\t\t\t// Custom UI not supported in RPC mode\n\t\t\treturn undefined as never;\n\t\t},\n\n\t\tpasteToEditor(text: string): void {\n\t\t\t// Paste handling not supported in RPC mode - falls back to setEditorText\n\t\t\tthis.setEditorText(text);\n\t\t},\n\n\t\tsetEditorText(text: string): void {\n\t\t\teditorTextState = text;\n\t\t\t// Fire and forget - host can implement editor control\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"set_editor_text\",\n\t\t\t\ttext,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t\tvoid withEmbeddedUiContext((ui) => {\n\t\t\t\tui.setEditorText(text);\n\t\t\t});\n\t\t},\n\n\t\tgetEditorText(): string {\n\t\t\t// Synchronous method can't wait for RPC response\n\t\t\t// Host should track editor state locally if needed\n\t\t\treturn \"\";\n\t\t},\n\n\t\tasync editor(title: string, prefill?: string): Promise<string | undefined> {\n\t\t\tconst id = crypto.randomUUID();\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tpendingExtensionRequests.set(id, {\n\t\t\t\t\tresolve: (response: RpcExtensionUIResponse) => {\n\t\t\t\t\t\tif (\"cancelled\" in response && response.cancelled) {\n\t\t\t\t\t\t\tresolve(undefined);\n\t\t\t\t\t\t} else if (\"value\" in response) {\n\t\t\t\t\t\t\tresolve(response.value);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresolve(undefined);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\treject,\n\t\t\t\t});\n\t\t\t\toutput({ type: \"extension_ui_request\", id, method: \"editor\", title, prefill } as RpcExtensionUIRequest);\n\t\t\t});\n\t\t},\n\n\t\tsetEditorComponent(): void {\n\t\t\t// Custom editor components not supported in RPC mode\n\t\t},\n\n\t\tget theme() {\n\t\t\treturn theme;\n\t\t},\n\n\t\tgetAllThemes() {\n\t\t\treturn [];\n\t\t},\n\n\t\tgetTheme(_name: string) {\n\t\t\treturn undefined;\n\t\t},\n\n\t\tsetTheme(_theme: string | Theme) {\n\t\t\t// Theme switching not supported in RPC mode\n\t\t\treturn { success: false, error: \"Theme switching not supported in RPC mode\" };\n\t\t},\n\n\t\tgetToolsExpanded() {\n\t\t\t// Tool expansion not supported in RPC mode - no TUI\n\t\t\treturn false;\n\t\t},\n\n\t\tsetToolsExpanded(_expanded: boolean) {\n\t\t\t// Tool expansion not supported in RPC mode - no TUI\n\t\t},\n\t});\n\n\t// Set up extensions with RPC-based UI context.\n\t// Do not block the initial RPC handshake on extension session_start hooks:\n\t// browser boot only needs get_state, and several startup-only notifications\n\t// (MCP availability, web-search status, etc.) can complete in the background.\n\t// Track readiness so consumers can know when extension commands are available.\n\tlet extensionsReady = false;\n\tconst extensionsReadyPromise = session.bindExtensions({\n\t\tuiContext: createExtensionUIContext(),\n\t\tcommandContextActions: createDefaultCommandContextActions(session),\n\t\tshutdownHandler: () => {\n\t\t\tshutdownRequested = true;\n\t\t},\n\t\tonError: (err) => {\n\t\t\toutput({ type: \"extension_error\", extensionPath: err.extensionPath, event: err.event, error: err.error });\n\t\t},\n\t}).then(() => {\n\t\textensionsReady = true;\n\t\toutput({ type: \"extensions_ready\" });\n\t}).catch((error) => {\n\t\textensionsReady = true; // Mark ready even on failure so consumers don't wait forever\n\t\toutput({\n\t\t\ttype: \"extension_error\",\n\t\t\tevent: \"session_start\",\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t});\n\t});\n\tvoid extensionsReadyPromise;\n\n\t// Output all agent events as JSON\n\tconst unsubscribe = session.subscribe((event) => {\n\t\t// v2: emit synthesized events before the regular event\n\t\tif (protocolVersion === 2) {\n\t\t\t// cost_update on assistant message_end\n\t\t\tif (event.type === \"message_end\" && event.message.role === \"assistant\" && currentRunId) {\n\t\t\t\tconst stats = session.getSessionStats();\n\t\t\t\tconst costUpdate = {\n\t\t\t\t\ttype: \"cost_update\" as const,\n\t\t\t\t\trunId: currentRunId,\n\t\t\t\t\tturnCost: session.getLastTurnCost(),\n\t\t\t\t\tcumulativeCost: stats.cost,\n\t\t\t\t\ttokens: {\n\t\t\t\t\t\tinput: stats.tokens.input,\n\t\t\t\t\t\toutput: stats.tokens.output,\n\t\t\t\t\t\tcacheRead: stats.tokens.cacheRead,\n\t\t\t\t\t\tcacheWrite: stats.tokens.cacheWrite,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tif (!eventFilter || eventFilter.has(\"cost_update\")) {\n\t\t\t\t\toutput(costUpdate);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// execution_complete on agent_end\n\t\t\tif (event.type === \"agent_end\" && currentRunId) {\n\t\t\t\tconst stats = session.getSessionStats();\n\t\t\t\tconst completionEvent = {\n\t\t\t\t\ttype: \"execution_complete\" as const,\n\t\t\t\t\trunId: currentRunId,\n\t\t\t\t\tstatus: \"completed\" as const,\n\t\t\t\t\tstats,\n\t\t\t\t};\n\t\t\t\tif (!eventFilter || eventFilter.has(\"execution_complete\")) {\n\t\t\t\t\toutput(completionEvent);\n\t\t\t\t}\n\t\t\t\tcurrentRunId = null;\n\t\t\t}\n\t\t}\n\n\t\t// Apply event filter (v2 only, applies to agent session events only)\n\t\tif (protocolVersion === 2 && eventFilter && !eventFilter.has(event.type)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Emit the regular event, with runId injection in v2 mode\n\t\tif (protocolVersion === 2 && currentRunId) {\n\t\t\toutput({ ...event, runId: currentRunId });\n\t\t} else {\n\t\t\toutput(event);\n\t\t}\n\t});\n\n\t// Handle a single command\n\tconst handleCommand = async (command: RpcCommand): Promise<RpcResponse> => {\n\t\tconst id = command.id;\n\n\t\tswitch (command.type) {\n\t\t\t// =================================================================\n\t\t\t// Prompting\n\t\t\t// =================================================================\n\n\t\t\tcase \"prompt\": {\n\t\t\t\t// v2: generate runId for execution tracking\n\t\t\t\tconst runId = protocolVersion === 2 ? crypto.randomUUID() : undefined;\n\t\t\t\tif (runId) currentRunId = runId;\n\t\t\t\t// Don't await - events will stream\n\t\t\t\t// Extension commands are executed immediately, file prompt templates are expanded\n\t\t\t\t// If streaming and streamingBehavior specified, queues via steer/followUp\n\t\t\t\tsession\n\t\t\t\t\t.prompt(command.message, {\n\t\t\t\t\t\timages: command.images,\n\t\t\t\t\t\tstreamingBehavior: command.streamingBehavior,\n\t\t\t\t\t\tsource: \"rpc\",\n\t\t\t\t\t})\n\t\t\t\t\t.catch((e) => output(error(id, \"prompt\", e.message)));\n\t\t\t\treturn { id, type: \"response\", command: \"prompt\", success: true, ...(runId && { runId }) } as RpcResponse;\n\t\t\t}\n\n\t\t\tcase \"steer\": {\n\t\t\t\t// v2: generate runId for execution tracking\n\t\t\t\tconst runId = protocolVersion === 2 ? crypto.randomUUID() : undefined;\n\t\t\t\tif (runId) currentRunId = runId;\n\t\t\t\tawait session.steer(command.message, command.images);\n\t\t\t\treturn { id, type: \"response\", command: \"steer\", success: true, ...(runId && { runId }) } as RpcResponse;\n\t\t\t}\n\n\t\t\tcase \"follow_up\": {\n\t\t\t\t// v2: generate runId for execution tracking\n\t\t\t\tconst runId = protocolVersion === 2 ? crypto.randomUUID() : undefined;\n\t\t\t\tif (runId) currentRunId = runId;\n\t\t\t\tawait session.followUp(command.message, command.images);\n\t\t\t\treturn { id, type: \"response\", command: \"follow_up\", success: true, ...(runId && { runId }) } as RpcResponse;\n\t\t\t}\n\n\t\t\tcase \"abort\": {\n\t\t\t\tawait session.abort();\n\t\t\t\treturn success(id, \"abort\");\n\t\t\t}\n\n\t\t\tcase \"new_session\": {\n\t\t\t\tconst options = command.parentSession ? { parentSession: command.parentSession } : undefined;\n\t\t\t\tconst cancelled = !(await session.newSession(options));\n\t\t\t\treturn success(id, \"new_session\", { cancelled });\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// State\n\t\t\t// =================================================================\n\n\t\t\tcase \"get_state\": {\n\t\t\t\tconst state: RpcSessionState = {\n\t\t\t\t\tmodel: session.model,\n\t\t\t\t\tthinkingLevel: session.thinkingLevel,\n\t\t\t\t\tisStreaming: session.isStreaming,\n\t\t\t\t\tisCompacting: session.isCompacting,\n\t\t\t\t\tsteeringMode: session.steeringMode,\n\t\t\t\t\tfollowUpMode: session.followUpMode,\n\t\t\t\t\tsessionFile: session.sessionFile,\n\t\t\t\t\tsessionId: session.sessionId,\n\t\t\t\t\tsessionName: session.sessionName,\n\t\t\t\t\tautoCompactionEnabled: session.autoCompactionEnabled,\n\t\t\t\t\tautoRetryEnabled: session.autoRetryEnabled,\n\t\t\t\t\tretryInProgress: session.isRetrying,\n\t\t\t\t\tretryAttempt: session.retryAttempt,\n\t\t\t\t\tmessageCount: session.messages.length,\n\t\t\t\t\tpendingMessageCount: session.pendingMessageCount,\n\t\t\t\t\textensionsReady,\n\t\t\t\t};\n\t\t\t\treturn success(id, \"get_state\", state);\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Model\n\t\t\t// =================================================================\n\n\t\t\tcase \"set_model\": {\n\t\t\t\tconst models = await session.modelRegistry.getAvailable();\n\t\t\t\tconst model = models.find((m) => m.provider === command.provider && m.id === command.modelId);\n\t\t\t\tif (!model) {\n\t\t\t\t\treturn error(id, \"set_model\", `Model not found: ${command.provider}/${command.modelId}`);\n\t\t\t\t}\n\t\t\t\tawait session.setModel(model);\n\t\t\t\treturn success(id, \"set_model\", model);\n\t\t\t}\n\n\t\t\tcase \"cycle_model\": {\n\t\t\t\tconst result = await session.cycleModel();\n\t\t\t\tif (!result) {\n\t\t\t\t\treturn success(id, \"cycle_model\", null);\n\t\t\t\t}\n\t\t\t\treturn success(id, \"cycle_model\", result);\n\t\t\t}\n\n\t\t\tcase \"get_available_models\": {\n\t\t\t\tconst models = await session.modelRegistry.getAvailable();\n\t\t\t\treturn success(id, \"get_available_models\", { models });\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Thinking\n\t\t\t// =================================================================\n\n\t\t\tcase \"set_thinking_level\": {\n\t\t\t\tsession.setThinkingLevel(command.level);\n\t\t\t\treturn success(id, \"set_thinking_level\");\n\t\t\t}\n\n\t\t\tcase \"cycle_thinking_level\": {\n\t\t\t\tconst level = session.cycleThinkingLevel();\n\t\t\t\tif (!level) {\n\t\t\t\t\treturn success(id, \"cycle_thinking_level\", null);\n\t\t\t\t}\n\t\t\t\treturn success(id, \"cycle_thinking_level\", { level });\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Queue Modes\n\t\t\t// =================================================================\n\n\t\t\tcase \"set_steering_mode\": {\n\t\t\t\tsession.setSteeringMode(command.mode);\n\t\t\t\treturn success(id, \"set_steering_mode\");\n\t\t\t}\n\n\t\t\tcase \"set_follow_up_mode\": {\n\t\t\t\tsession.setFollowUpMode(command.mode);\n\t\t\t\treturn success(id, \"set_follow_up_mode\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Compaction\n\t\t\t// =================================================================\n\n\t\t\tcase \"compact\": {\n\t\t\t\tconst result = await session.compact(command.customInstructions);\n\t\t\t\treturn success(id, \"compact\", result);\n\t\t\t}\n\n\t\t\tcase \"set_auto_compaction\": {\n\t\t\t\tsession.setAutoCompactionEnabled(command.enabled);\n\t\t\t\treturn success(id, \"set_auto_compaction\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Retry\n\t\t\t// =================================================================\n\n\t\t\tcase \"set_auto_retry\": {\n\t\t\t\tsession.setAutoRetryEnabled(command.enabled);\n\t\t\t\treturn success(id, \"set_auto_retry\");\n\t\t\t}\n\n\t\t\tcase \"abort_retry\": {\n\t\t\t\tsession.abortRetry();\n\t\t\t\treturn success(id, \"abort_retry\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Bash\n\t\t\t// =================================================================\n\n\t\t\tcase \"bash\": {\n\t\t\t\tconst result = await session.executeBash(command.command);\n\t\t\t\treturn success(id, \"bash\", result);\n\t\t\t}\n\n\t\t\tcase \"abort_bash\": {\n\t\t\t\tsession.abortBash();\n\t\t\t\treturn success(id, \"abort_bash\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Session\n\t\t\t// =================================================================\n\n\t\t\tcase \"get_session_stats\": {\n\t\t\t\tconst stats = session.getSessionStats();\n\t\t\t\treturn success(id, \"get_session_stats\", stats);\n\t\t\t}\n\n\t\t\tcase \"export_html\": {\n\t\t\t\tconst path = await session.exportToHtml(command.outputPath);\n\t\t\t\treturn success(id, \"export_html\", { path });\n\t\t\t}\n\n\t\t\tcase \"switch_session\": {\n\t\t\t\tconst cancelled = !(await session.switchSession(command.sessionPath));\n\t\t\t\treturn success(id, \"switch_session\", { cancelled });\n\t\t\t}\n\n\t\t\tcase \"fork\": {\n\t\t\t\tconst result = await session.fork(command.entryId);\n\t\t\t\treturn success(id, \"fork\", { text: result.selectedText, cancelled: result.cancelled });\n\t\t\t}\n\n\t\t\tcase \"get_fork_messages\": {\n\t\t\t\tconst messages = session.getUserMessagesForForking();\n\t\t\t\treturn success(id, \"get_fork_messages\", { messages });\n\t\t\t}\n\n\t\t\tcase \"get_last_assistant_text\": {\n\t\t\t\tconst text = session.getLastAssistantText();\n\t\t\t\treturn success(id, \"get_last_assistant_text\", { text });\n\t\t\t}\n\n\t\t\tcase \"set_session_name\": {\n\t\t\t\tconst name = command.name.trim();\n\t\t\t\tif (!name) {\n\t\t\t\t\treturn error(id, \"set_session_name\", \"Session name cannot be empty\");\n\t\t\t\t}\n\t\t\t\tsession.setSessionName(name);\n\t\t\t\treturn success(id, \"set_session_name\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Messages\n\t\t\t// =================================================================\n\n\t\t\tcase \"get_messages\": {\n\t\t\t\treturn success(id, \"get_messages\", { messages: session.messages });\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Commands (available for invocation via prompt)\n\t\t\t// =================================================================\n\n\t\t\tcase \"get_commands\": {\n\t\t\t\tconst commands: RpcSlashCommand[] = [];\n\n\t\t\t\t// Extension commands\n\t\t\t\tfor (const { command, extensionPath } of session.extensionRunner?.getRegisteredCommandsWithPaths() ?? []) {\n\t\t\t\t\tcommands.push({\n\t\t\t\t\t\tname: command.name,\n\t\t\t\t\t\tdescription: command.description,\n\t\t\t\t\t\tsource: \"extension\",\n\t\t\t\t\t\tpath: extensionPath,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Prompt templates (source is always \"user\" | \"project\" | \"path\" in coding-agent)\n\t\t\t\tfor (const template of session.promptTemplates) {\n\t\t\t\t\tcommands.push({\n\t\t\t\t\t\tname: template.name,\n\t\t\t\t\t\tdescription: template.description,\n\t\t\t\t\t\tsource: \"prompt\",\n\t\t\t\t\t\tlocation: template.source as RpcSlashCommand[\"location\"],\n\t\t\t\t\t\tpath: template.filePath,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Skills (source is always \"user\" | \"project\" | \"path\" in coding-agent)\n\t\t\t\tfor (const skill of session.resourceLoader.getSkills().skills) {\n\t\t\t\t\tcommands.push({\n\t\t\t\t\t\tname: `skill:${skill.name}`,\n\t\t\t\t\t\tdescription: skill.description,\n\t\t\t\t\t\tsource: \"skill\",\n\t\t\t\t\t\tlocation: skill.source as RpcSlashCommand[\"location\"],\n\t\t\t\t\t\tpath: skill.filePath,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn success(id, \"get_commands\", { commands });\n\t\t\t}\n\n\t\t\tcase \"terminal_input\": {\n\t\t\t\tawait ensureEmbeddedInteractiveMode();\n\t\t\t\tremoteTerminal!.pushInput(command.data);\n\t\t\t\treturn success(id, \"terminal_input\");\n\t\t\t}\n\n\t\t\tcase \"terminal_resize\": {\n\t\t\t\tawait ensureEmbeddedInteractiveMode();\n\t\t\t\tremoteTerminal!.resize(command.cols, command.rows);\n\t\t\t\treturn success(id, \"terminal_resize\");\n\t\t\t}\n\n\t\t\tcase \"terminal_redraw\": {\n\t\t\t\tconst interactiveMode = await ensureEmbeddedInteractiveMode();\n\t\t\t\tinteractiveMode.requestRender(true);\n\t\t\t\treturn success(id, \"terminal_redraw\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// v2 Protocol: subscribe\n\t\t\t// =================================================================\n\n\t\t\tcase \"subscribe\": {\n\t\t\t\tif (command.events.includes(\"*\")) {\n\t\t\t\t\teventFilter = null; // wildcard = all events\n\t\t\t\t} else {\n\t\t\t\t\teventFilter = new Set(command.events);\n\t\t\t\t}\n\t\t\t\treturn success(id, \"subscribe\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// v2 Protocol: shutdown\n\t\t\t// =================================================================\n\n\t\t\tcase \"shutdown\": {\n\t\t\t\tshutdownRequested = true;\n\t\t\t\treturn success(id, \"shutdown\");\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tconst unknownCommand = command as { type: string; id?: string };\n\t\t\t\treturn error(unknownCommand.id, unknownCommand.type, `Unknown command: ${unknownCommand.type}`);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Check if shutdown was requested and perform shutdown if so.\n\t * Called after handling each command when waiting for the next command.\n\t */\n\tlet detachInput = () => {};\n\n\tasync function checkShutdownRequested(): Promise<void> {\n\t\tif (!shutdownRequested) return;\n\n\t\tconst currentRunner = session.extensionRunner;\n\t\tif (currentRunner?.hasHandlers(\"session_shutdown\")) {\n\t\t\tawait currentRunner.emit({ type: \"session_shutdown\" });\n\t\t}\n\n\t\tunsubscribe();\n\t\tembeddedInteractiveMode?.stop();\n\t\tdetachInput();\n\t\tprocess.stdin.pause();\n\t\tprocess.exit(0);\n\t}\n\n\tconst handleInputLine = async (line: string) => {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(line);\n\n\t\t\t// Handle extension UI responses (bypass protocol detection)\n\t\t\tif (parsed.type === \"extension_ui_response\") {\n\t\t\t\tconst response = parsed as RpcExtensionUIResponse;\n\t\t\t\tconst pending = pendingExtensionRequests.get(response.id);\n\t\t\t\tif (pending) {\n\t\t\t\t\tpendingExtensionRequests.delete(response.id);\n\t\t\t\t\tpending.resolve(response);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst command = parsed as RpcCommand;\n\n\t\t\t// Protocol version detection: first non-UI-response command locks the version\n\t\t\tif (!protocolLocked) {\n\t\t\t\tprotocolLocked = true;\n\t\t\t\tif (command.type === \"init\") {\n\t\t\t\t\tprotocolVersion = 2;\n\t\t\t\t\tconst initResult: RpcInitResult = {\n\t\t\t\t\t\tprotocolVersion: 2,\n\t\t\t\t\t\tsessionId: session.sessionId,\n\t\t\t\t\t\tcapabilities: {\n\t\t\t\t\t\t\tevents: [\"execution_complete\", \"cost_update\"],\n\t\t\t\t\t\t\tcommands: [\"init\", \"shutdown\", \"subscribe\"],\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\toutput(success(command.id, \"init\", initResult));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Non-init first message: lock to v1, fall through to normal handling\n\t\t\t\tprotocolVersion = 1;\n\t\t\t} else if (command.type === \"init\") {\n\t\t\t\t// Already locked — reject re-init\n\t\t\t\toutput(error(command.id, \"init\", \"Protocol version already locked. init must be the first command.\"));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Handle regular commands\n\t\t\tconst response = await handleCommand(command);\n\t\t\toutput(response);\n\n\t\t\t// Check for deferred shutdown request (idle between commands)\n\t\t\tawait checkShutdownRequested();\n\t\t} catch (e: any) {\n\t\t\toutput(error(undefined, \"parse\", `Failed to parse command: ${e.message}`));\n\t\t}\n\t};\n\n\tdetachInput = attachJsonlLineReader(process.stdin, (line) => {\n\t\tvoid handleInputLine(line);\n\t});\n\n\t// Keep process alive forever\n\treturn new Promise(() => {});\n}\n"]}
1
+ {"version":3,"file":"rpc-mode.js","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-mode.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RPC mode: Headless operation with JSON stdin/stdout protocol.\n *\n * Used for embedding the agent in other applications.\n * Receives commands as JSON on stdin, outputs events and responses as JSON on stdout.\n *\n * Protocol:\n * - Commands: JSON objects with `type` field, optional `id` for correlation\n * - Responses: JSON objects with `type: \"response\"`, `command`, `success`, and optional `data`/`error`\n * - Events: AgentSessionEvent objects streamed as they occur\n * - Extension UI: Extension UI requests are emitted, client responds with extension_ui_response\n */\n\nimport * as crypto from \"node:crypto\";\nimport type { AgentSession } from \"../../core/agent-session.js\";\nimport type {\n\tExtensionUIContext,\n\tExtensionUIDialogOptions,\n\tExtensionWidgetOptions,\n} from \"../../core/extensions/index.js\";\nimport { InteractiveMode } from \"../interactive/interactive-mode.js\";\nimport { type Theme, theme } from \"../interactive/theme/theme.js\";\nimport {\n\tgetPermissionMode,\n\tregisterStdioApprovalHandler,\n\tregisterStdioClassifierHandler,\n\tregisterStdioNetworkApprovalHandler,\n\tresolveApprovalResponse,\n\tresolveClassifierResponse,\n\tresolveNetworkApprovalResponse,\n\ttype NetworkApprovalDecision,\n} from \"../../core/tool-approval.js\";\nimport { createDefaultCommandContextActions } from \"../shared/command-context-actions.js\";\nimport { attachJsonlLineReader, serializeJsonLine } from \"./jsonl.js\";\nimport { RemoteTerminal } from \"./remote-terminal.js\";\nimport type {\n\tRpcCommand,\n\tRpcExtensionUIRequest,\n\tRpcExtensionUIResponse,\n\tRpcInitResult,\n\tRpcResponse,\n\tRpcSessionState,\n\tRpcSlashCommand,\n} from \"./rpc-types.js\";\n\n// Re-export types for consumers\nexport type {\n\tRpcCommand,\n\tRpcExtensionUIRequest,\n\tRpcExtensionUIResponse,\n\tRpcInitResult,\n\tRpcProtocolVersion,\n\tRpcResponse,\n\tRpcSessionState,\n\tRpcV2Event,\n} from \"./rpc-types.js\";\n\n/**\n * Run in RPC mode.\n * Listens for JSON commands on stdin, outputs events and responses on stdout.\n */\nexport async function runRpcMode(session: AgentSession): Promise<never> {\n\tconst permMode = getPermissionMode();\n\tif (permMode === \"accept-on-edit\") registerStdioApprovalHandler();\n\tif (permMode === \"auto\") registerStdioClassifierHandler();\n\tregisterStdioNetworkApprovalHandler();\n\n\tconst output = (obj: RpcResponse | RpcExtensionUIRequest | object) => {\n\t\tprocess.stdout.write(serializeJsonLine(obj));\n\t};\n\n\tconst success = <T extends RpcCommand[\"type\"]>(\n\t\tid: string | undefined,\n\t\tcommand: T,\n\t\tdata?: object | null,\n\t): RpcResponse => {\n\t\tif (data === undefined) {\n\t\t\treturn { id, type: \"response\", command, success: true } as RpcResponse;\n\t\t}\n\t\treturn { id, type: \"response\", command, success: true, data } as RpcResponse;\n\t};\n\n\tconst error = (id: string | undefined, command: string, message: string): RpcResponse => {\n\t\treturn { id, type: \"response\", command, success: false, error: message };\n\t};\n\n\t// Pending extension UI requests waiting for response\n\tconst pendingExtensionRequests = new Map<\n\t\tstring,\n\t\t{ resolve: (value: any) => void; reject: (error: Error) => void }\n\t>();\n\n\t// Shutdown request flag\n\tlet shutdownRequested = false;\n\n\t// v2 protocol version detection state\n\tlet protocolVersion: 1 | 2 = 1;\n\tlet protocolLocked = false;\n\n\t// v2 runId threading: tracks the current execution run\n\tlet currentRunId: string | null = null;\n\n\t// v2 event filtering: null = no filter (all events); Set = only listed event types\n\tlet eventFilter: Set<string> | null = null;\n\n\tconst embeddedTerminalEnabled = process.env.GSD_WEB_BRIDGE_TUI === \"1\";\n\tconst remoteTerminal = embeddedTerminalEnabled\n\t\t? new RemoteTerminal({\n\t\t\t\tonWrite: (data) => {\n\t\t\t\t\toutput({ type: \"terminal_output\", data });\n\t\t\t\t},\n\t\t\t})\n\t\t: null;\n\tlet embeddedInteractiveMode: InteractiveMode | null = null;\n\tlet embeddedInteractiveInitPromise: Promise<void> | null = null;\n\tconst startupNotifications: Array<{ message: string; type?: \"info\" | \"warning\" | \"error\" | \"success\" }> = [];\n\tconst statusState = new Map<string, string | undefined>();\n\tconst widgetState = new Map<string, { content: unknown; options?: ExtensionWidgetOptions }>();\n\tlet footerFactory: Parameters<ExtensionUIContext[\"setFooter\"]>[0] | undefined;\n\tlet headerFactory: Parameters<ExtensionUIContext[\"setHeader\"]>[0] | undefined;\n\tlet workingMessageState: string | undefined;\n\tlet titleState: string | undefined;\n\tlet editorTextState: string | undefined;\n\n\tconst withEmbeddedUiContext = async (apply: (ui: ExtensionUIContext) => void | Promise<void>): Promise<void> => {\n\t\tif (!embeddedInteractiveMode) {\n\t\t\treturn;\n\t\t}\n\t\tawait apply(embeddedInteractiveMode.getExtensionUIContext());\n\t};\n\n\tconst replayEmbeddedUiState = async (interactiveMode: InteractiveMode): Promise<void> => {\n\t\tconst ui = interactiveMode.getExtensionUIContext();\n\t\tui.setHeader(headerFactory);\n\t\tui.setFooter(footerFactory);\n\t\tfor (const [key, text] of statusState.entries()) {\n\t\t\tui.setStatus(key, text);\n\t\t}\n\t\tfor (const [key, widget] of widgetState.entries()) {\n\t\t\tui.setWidget(key, widget.content as any, widget.options);\n\t\t}\n\t\tui.setWorkingMessage(workingMessageState);\n\t\tif (titleState) {\n\t\t\tui.setTitle(titleState);\n\t\t}\n\t\tif (editorTextState !== undefined) {\n\t\t\tui.setEditorText(editorTextState);\n\t\t}\n\t\tfor (const { message, type } of startupNotifications) {\n\t\t\tui.notify(message, type);\n\t\t}\n\t};\n\n\tconst ensureEmbeddedInteractiveMode = async (): Promise<InteractiveMode> => {\n\t\tif (!embeddedTerminalEnabled || !remoteTerminal) {\n\t\t\tthrow new Error(\"Embedded terminal is not enabled for this RPC host\");\n\t\t}\n\n\t\tif (embeddedInteractiveMode) {\n\t\t\treturn embeddedInteractiveMode;\n\t\t}\n\n\t\tif (!embeddedInteractiveInitPromise) {\n\t\t\tembeddedInteractiveMode = new InteractiveMode(session, {\n\t\t\t\tterminal: remoteTerminal,\n\t\t\t\tbindExtensions: false,\n\t\t\t\tsubmitPromptsDirectly: true,\n\t\t\t\tshutdownBehavior: \"ignore\",\n\t\t\t});\n\t\t\tembeddedInteractiveInitPromise = embeddedInteractiveMode.init().then(async () => {\n\t\t\t\tawait replayEmbeddedUiState(embeddedInteractiveMode!);\n\t\t\t}).catch((error) => {\n\t\t\t\tembeddedInteractiveMode = null;\n\t\t\t\tthrow error;\n\t\t\t}).finally(() => {\n\t\t\t\tembeddedInteractiveInitPromise = null;\n\t\t\t});\n\t\t}\n\n\t\tawait embeddedInteractiveInitPromise;\n\t\treturn embeddedInteractiveMode!;\n\t};\n\n\t/** Helper for dialog methods with signal/timeout support */\n\tfunction createDialogPromise<T>(\n\t\topts: ExtensionUIDialogOptions | undefined,\n\t\tdefaultValue: T,\n\t\trequest: Record<string, unknown>,\n\t\tparseResponse: (response: RpcExtensionUIResponse) => T,\n\t): Promise<T> {\n\t\tif (opts?.signal?.aborted) return Promise.resolve(defaultValue);\n\n\t\tconst id = crypto.randomUUID();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n\t\t\tconst cleanup = () => {\n\t\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\t\topts?.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\tpendingExtensionRequests.delete(id);\n\t\t\t};\n\n\t\t\tconst onAbort = () => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve(defaultValue);\n\t\t\t};\n\t\t\topts?.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\t\tif (opts?.timeout) {\n\t\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tresolve(defaultValue);\n\t\t\t\t}, opts.timeout);\n\t\t\t}\n\n\t\t\tpendingExtensionRequests.set(id, {\n\t\t\t\tresolve: (response: RpcExtensionUIResponse) => {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tresolve(parseResponse(response));\n\t\t\t\t},\n\t\t\t\treject,\n\t\t\t});\n\t\t\toutput({ type: \"extension_ui_request\", id, ...request } as RpcExtensionUIRequest);\n\t\t});\n\t}\n\n\t/**\n\t * Create an extension UI context that uses the RPC protocol.\n\t */\n\tconst createExtensionUIContext = (): ExtensionUIContext => ({\n\t\tselect: (title, options, opts) =>\n\t\t\tcreateDialogPromise(opts, undefined, { method: \"select\", title, options, timeout: opts?.timeout, allowMultiple: opts?.allowMultiple }, (r) =>\n\t\t\t\t\"cancelled\" in r && r.cancelled ? undefined : \"values\" in r ? r.values : \"value\" in r ? r.value : undefined,\n\t\t\t),\n\n\t\tconfirm: (title, message, opts) =>\n\t\t\tcreateDialogPromise(opts, false, { method: \"confirm\", title, message, timeout: opts?.timeout }, (r) =>\n\t\t\t\t\"cancelled\" in r && r.cancelled ? false : \"confirmed\" in r ? r.confirmed : false,\n\t\t\t),\n\n\t\tinput: (title, placeholder, opts) =>\n\t\t\tcreateDialogPromise(opts, undefined, { method: \"input\", title, placeholder, timeout: opts?.timeout }, (r) =>\n\t\t\t\t\"cancelled\" in r && r.cancelled ? undefined : \"value\" in r ? r.value : undefined,\n\t\t\t),\n\n\t\tnotify(message: string, type?: \"info\" | \"warning\" | \"error\" | \"success\"): void {\n\t\t\tstartupNotifications.push({ message, type });\n\t\t\tif (startupNotifications.length > 20) {\n\t\t\t\tstartupNotifications.splice(0, startupNotifications.length - 20);\n\t\t\t}\n\t\t\t// Fire and forget - no response needed\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"notify\",\n\t\t\t\tmessage,\n\t\t\t\tnotifyType: type,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t\tvoid withEmbeddedUiContext((ui) => {\n\t\t\t\tui.notify(message, type);\n\t\t\t});\n\t\t},\n\n\t\tonTerminalInput(): () => void {\n\t\t\t// Raw terminal input not supported in RPC mode\n\t\t\treturn () => {};\n\t\t},\n\n\t\tsetStatus(key: string, text: string | undefined): void {\n\t\t\tstatusState.set(key, text);\n\t\t\t// Fire and forget - no response needed\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"setStatus\",\n\t\t\t\tstatusKey: key,\n\t\t\t\tstatusText: text,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t\tvoid withEmbeddedUiContext((ui) => {\n\t\t\t\tui.setStatus(key, text);\n\t\t\t});\n\t\t},\n\n\t\tsetWorkingMessage(message?: string): void {\n\t\t\tworkingMessageState = message;\n\t\t\tvoid withEmbeddedUiContext((ui) => {\n\t\t\t\tui.setWorkingMessage(message);\n\t\t\t});\n\t\t},\n\n\t\tsetWidget(key: string, content: unknown, options?: ExtensionWidgetOptions): void {\n\t\t\twidgetState.set(key, { content, options });\n\t\t\tif (content === undefined || Array.isArray(content)) {\n\t\t\t\toutput({\n\t\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\t\tmethod: \"setWidget\",\n\t\t\t\t\twidgetKey: key,\n\t\t\t\t\twidgetLines: content as string[] | undefined,\n\t\t\t\t\twidgetPlacement: options?.placement,\n\t\t\t\t} as RpcExtensionUIRequest);\n\t\t\t} else if (typeof content === \"function\") {\n\t\t\t\t// Factory-based widgets require TUI access which RPC mode does not have.\n\t\t\t\t// Emit a minimal placeholder so the RPC client knows a widget was requested.\n\t\t\t\toutput({\n\t\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\t\tmethod: \"setWidget\",\n\t\t\t\t\twidgetKey: key,\n\t\t\t\t\twidgetLines: undefined,\n\t\t\t\t\twidgetPlacement: options?.placement,\n\t\t\t\t} as RpcExtensionUIRequest);\n\t\t\t}\n\t\t\tvoid withEmbeddedUiContext((ui) => {\n\t\t\t\tui.setWidget(key, content as any, options);\n\t\t\t});\n\t\t},\n\n\t\tsetFooter(factory: Parameters<ExtensionUIContext[\"setFooter\"]>[0]): void {\n\t\t\tfooterFactory = factory;\n\t\t\tvoid withEmbeddedUiContext((ui) => {\n\t\t\t\tui.setFooter(factory);\n\t\t\t});\n\t\t},\n\n\t\tsetHeader(factory: Parameters<ExtensionUIContext[\"setHeader\"]>[0]): void {\n\t\t\theaderFactory = factory;\n\t\t\tvoid withEmbeddedUiContext((ui) => {\n\t\t\t\tui.setHeader(factory);\n\t\t\t});\n\t\t},\n\n\t\tsetTitle(title: string): void {\n\t\t\ttitleState = title;\n\t\t\t// Fire and forget - host can implement terminal title control\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"setTitle\",\n\t\t\t\ttitle,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t\tvoid withEmbeddedUiContext((ui) => {\n\t\t\t\tui.setTitle(title);\n\t\t\t});\n\t\t},\n\n\t\tasync custom() {\n\t\t\t// Custom UI not supported in RPC mode\n\t\t\treturn undefined as never;\n\t\t},\n\n\t\tpasteToEditor(text: string): void {\n\t\t\t// Paste handling not supported in RPC mode - falls back to setEditorText\n\t\t\tthis.setEditorText(text);\n\t\t},\n\n\t\tsetEditorText(text: string): void {\n\t\t\teditorTextState = text;\n\t\t\t// Fire and forget - host can implement editor control\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"set_editor_text\",\n\t\t\t\ttext,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t\tvoid withEmbeddedUiContext((ui) => {\n\t\t\t\tui.setEditorText(text);\n\t\t\t});\n\t\t},\n\n\t\tgetEditorText(): string {\n\t\t\t// Synchronous method can't wait for RPC response\n\t\t\t// Host should track editor state locally if needed\n\t\t\treturn \"\";\n\t\t},\n\n\t\tasync editor(title: string, prefill?: string): Promise<string | undefined> {\n\t\t\tconst id = crypto.randomUUID();\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tpendingExtensionRequests.set(id, {\n\t\t\t\t\tresolve: (response: RpcExtensionUIResponse) => {\n\t\t\t\t\t\tif (\"cancelled\" in response && response.cancelled) {\n\t\t\t\t\t\t\tresolve(undefined);\n\t\t\t\t\t\t} else if (\"value\" in response) {\n\t\t\t\t\t\t\tresolve(response.value);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresolve(undefined);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\treject,\n\t\t\t\t});\n\t\t\t\toutput({ type: \"extension_ui_request\", id, method: \"editor\", title, prefill } as RpcExtensionUIRequest);\n\t\t\t});\n\t\t},\n\n\t\tsetEditorComponent(): void {\n\t\t\t// Custom editor components not supported in RPC mode\n\t\t},\n\n\t\tget theme() {\n\t\t\treturn theme;\n\t\t},\n\n\t\tgetAllThemes() {\n\t\t\treturn [];\n\t\t},\n\n\t\tgetTheme(_name: string) {\n\t\t\treturn undefined;\n\t\t},\n\n\t\tsetTheme(_theme: string | Theme) {\n\t\t\t// Theme switching not supported in RPC mode\n\t\t\treturn { success: false, error: \"Theme switching not supported in RPC mode\" };\n\t\t},\n\n\t\tgetToolsExpanded() {\n\t\t\t// Tool expansion not supported in RPC mode - no TUI\n\t\t\treturn false;\n\t\t},\n\n\t\tsetToolsExpanded(_expanded: boolean) {\n\t\t\t// Tool expansion not supported in RPC mode - no TUI\n\t\t},\n\t});\n\n\t// Set up extensions with RPC-based UI context.\n\t// Do not block the initial RPC handshake on extension session_start hooks:\n\t// browser boot only needs get_state, and several startup-only notifications\n\t// (MCP availability, web-search status, etc.) can complete in the background.\n\t// Track readiness so consumers can know when extension commands are available.\n\tlet extensionsReady = false;\n\tconst extensionsReadyPromise = session.bindExtensions({\n\t\tuiContext: createExtensionUIContext(),\n\t\tcommandContextActions: createDefaultCommandContextActions(session),\n\t\tshutdownHandler: () => {\n\t\t\tshutdownRequested = true;\n\t\t},\n\t\tonError: (err) => {\n\t\t\toutput({ type: \"extension_error\", extensionPath: err.extensionPath, event: err.event, error: err.error });\n\t\t},\n\t}).then(() => {\n\t\textensionsReady = true;\n\t\toutput({ type: \"extensions_ready\" });\n\t}).catch((error) => {\n\t\textensionsReady = true; // Mark ready even on failure so consumers don't wait forever\n\t\toutput({\n\t\t\ttype: \"extension_error\",\n\t\t\tevent: \"session_start\",\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t});\n\t});\n\tvoid extensionsReadyPromise;\n\n\t// Output all agent events as JSON\n\tconst unsubscribe = session.subscribe((event) => {\n\t\t// v2: emit synthesized events before the regular event\n\t\tif (protocolVersion === 2) {\n\t\t\t// cost_update on assistant message_end\n\t\t\tif (event.type === \"message_end\" && event.message.role === \"assistant\" && currentRunId) {\n\t\t\t\tconst stats = session.getSessionStats();\n\t\t\t\tconst costUpdate = {\n\t\t\t\t\ttype: \"cost_update\" as const,\n\t\t\t\t\trunId: currentRunId,\n\t\t\t\t\tturnCost: session.getLastTurnCost(),\n\t\t\t\t\tcumulativeCost: stats.cost,\n\t\t\t\t\ttokens: {\n\t\t\t\t\t\tinput: stats.tokens.input,\n\t\t\t\t\t\toutput: stats.tokens.output,\n\t\t\t\t\t\tcacheRead: stats.tokens.cacheRead,\n\t\t\t\t\t\tcacheWrite: stats.tokens.cacheWrite,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tif (!eventFilter || eventFilter.has(\"cost_update\")) {\n\t\t\t\t\toutput(costUpdate);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// execution_complete on agent_end\n\t\t\tif (event.type === \"agent_end\" && currentRunId) {\n\t\t\t\tconst stats = session.getSessionStats();\n\t\t\t\tconst completionEvent = {\n\t\t\t\t\ttype: \"execution_complete\" as const,\n\t\t\t\t\trunId: currentRunId,\n\t\t\t\t\tstatus: \"completed\" as const,\n\t\t\t\t\tstats,\n\t\t\t\t};\n\t\t\t\tif (!eventFilter || eventFilter.has(\"execution_complete\")) {\n\t\t\t\t\toutput(completionEvent);\n\t\t\t\t}\n\t\t\t\tcurrentRunId = null;\n\t\t\t}\n\t\t}\n\n\t\t// Apply event filter (v2 only, applies to agent session events only)\n\t\tif (protocolVersion === 2 && eventFilter && !eventFilter.has(event.type)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Emit the regular event, with runId injection in v2 mode\n\t\tif (protocolVersion === 2 && currentRunId) {\n\t\t\toutput({ ...event, runId: currentRunId });\n\t\t} else {\n\t\t\toutput(event);\n\t\t}\n\t});\n\n\t// Handle a single command\n\tconst handleCommand = async (command: RpcCommand): Promise<RpcResponse> => {\n\t\tconst id = command.id;\n\n\t\tswitch (command.type) {\n\t\t\t// =================================================================\n\t\t\t// Prompting\n\t\t\t// =================================================================\n\n\t\t\tcase \"prompt\": {\n\t\t\t\t// v2: generate runId for execution tracking\n\t\t\t\tconst runId = protocolVersion === 2 ? crypto.randomUUID() : undefined;\n\t\t\t\tif (runId) currentRunId = runId;\n\t\t\t\t// Don't await - events will stream\n\t\t\t\t// Extension commands are executed immediately, file prompt templates are expanded\n\t\t\t\t// If streaming and streamingBehavior specified, queues via steer/followUp\n\t\t\t\tsession\n\t\t\t\t\t.prompt(command.message, {\n\t\t\t\t\t\timages: command.images,\n\t\t\t\t\t\tstreamingBehavior: command.streamingBehavior,\n\t\t\t\t\t\tsource: \"rpc\",\n\t\t\t\t\t})\n\t\t\t\t\t.catch((e) => output(error(id, \"prompt\", e.message)));\n\t\t\t\treturn { id, type: \"response\", command: \"prompt\", success: true, ...(runId && { runId }) } as RpcResponse;\n\t\t\t}\n\n\t\t\tcase \"steer\": {\n\t\t\t\t// v2: generate runId for execution tracking\n\t\t\t\tconst runId = protocolVersion === 2 ? crypto.randomUUID() : undefined;\n\t\t\t\tif (runId) currentRunId = runId;\n\t\t\t\tawait session.steer(command.message, command.images);\n\t\t\t\treturn { id, type: \"response\", command: \"steer\", success: true, ...(runId && { runId }) } as RpcResponse;\n\t\t\t}\n\n\t\t\tcase \"follow_up\": {\n\t\t\t\t// v2: generate runId for execution tracking\n\t\t\t\tconst runId = protocolVersion === 2 ? crypto.randomUUID() : undefined;\n\t\t\t\tif (runId) currentRunId = runId;\n\t\t\t\tawait session.followUp(command.message, command.images);\n\t\t\t\treturn { id, type: \"response\", command: \"follow_up\", success: true, ...(runId && { runId }) } as RpcResponse;\n\t\t\t}\n\n\t\t\tcase \"abort\": {\n\t\t\t\tawait session.abort();\n\t\t\t\treturn success(id, \"abort\");\n\t\t\t}\n\n\t\t\tcase \"new_session\": {\n\t\t\t\tconst options = command.parentSession ? { parentSession: command.parentSession } : undefined;\n\t\t\t\tconst cancelled = !(await session.newSession(options));\n\t\t\t\treturn success(id, \"new_session\", { cancelled });\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// State\n\t\t\t// =================================================================\n\n\t\t\tcase \"get_state\": {\n\t\t\t\tconst state: RpcSessionState = {\n\t\t\t\t\tmodel: session.model,\n\t\t\t\t\tthinkingLevel: session.thinkingLevel,\n\t\t\t\t\tisStreaming: session.isStreaming,\n\t\t\t\t\tisCompacting: session.isCompacting,\n\t\t\t\t\tsteeringMode: session.steeringMode,\n\t\t\t\t\tfollowUpMode: session.followUpMode,\n\t\t\t\t\tsessionFile: session.sessionFile,\n\t\t\t\t\tsessionId: session.sessionId,\n\t\t\t\t\tsessionName: session.sessionName,\n\t\t\t\t\tautoCompactionEnabled: session.autoCompactionEnabled,\n\t\t\t\t\tautoRetryEnabled: session.autoRetryEnabled,\n\t\t\t\t\tretryInProgress: session.isRetrying,\n\t\t\t\t\tretryAttempt: session.retryAttempt,\n\t\t\t\t\tmessageCount: session.messages.length,\n\t\t\t\t\tpendingMessageCount: session.pendingMessageCount,\n\t\t\t\t\textensionsReady,\n\t\t\t\t};\n\t\t\t\treturn success(id, \"get_state\", state);\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Model\n\t\t\t// =================================================================\n\n\t\t\tcase \"set_model\": {\n\t\t\t\tconst models = await session.modelRegistry.getAvailable();\n\t\t\t\tconst model = models.find((m) => m.provider === command.provider && m.id === command.modelId);\n\t\t\t\tif (!model) {\n\t\t\t\t\treturn error(id, \"set_model\", `Model not found: ${command.provider}/${command.modelId}`);\n\t\t\t\t}\n\t\t\t\tawait session.setModel(model);\n\t\t\t\treturn success(id, \"set_model\", model);\n\t\t\t}\n\n\t\t\tcase \"cycle_model\": {\n\t\t\t\tconst result = await session.cycleModel();\n\t\t\t\tif (!result) {\n\t\t\t\t\treturn success(id, \"cycle_model\", null);\n\t\t\t\t}\n\t\t\t\treturn success(id, \"cycle_model\", result);\n\t\t\t}\n\n\t\t\tcase \"get_available_models\": {\n\t\t\t\tconst models = await session.modelRegistry.getAvailable();\n\t\t\t\treturn success(id, \"get_available_models\", { models });\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Thinking\n\t\t\t// =================================================================\n\n\t\t\tcase \"set_thinking_level\": {\n\t\t\t\tsession.setThinkingLevel(command.level);\n\t\t\t\treturn success(id, \"set_thinking_level\");\n\t\t\t}\n\n\t\t\tcase \"cycle_thinking_level\": {\n\t\t\t\tconst level = session.cycleThinkingLevel();\n\t\t\t\tif (!level) {\n\t\t\t\t\treturn success(id, \"cycle_thinking_level\", null);\n\t\t\t\t}\n\t\t\t\treturn success(id, \"cycle_thinking_level\", { level });\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Queue Modes\n\t\t\t// =================================================================\n\n\t\t\tcase \"set_steering_mode\": {\n\t\t\t\tsession.setSteeringMode(command.mode);\n\t\t\t\treturn success(id, \"set_steering_mode\");\n\t\t\t}\n\n\t\t\tcase \"set_follow_up_mode\": {\n\t\t\t\tsession.setFollowUpMode(command.mode);\n\t\t\t\treturn success(id, \"set_follow_up_mode\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Compaction\n\t\t\t// =================================================================\n\n\t\t\tcase \"compact\": {\n\t\t\t\tconst result = await session.compact(command.customInstructions);\n\t\t\t\treturn success(id, \"compact\", result);\n\t\t\t}\n\n\t\t\tcase \"set_auto_compaction\": {\n\t\t\t\tsession.setAutoCompactionEnabled(command.enabled);\n\t\t\t\treturn success(id, \"set_auto_compaction\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Retry\n\t\t\t// =================================================================\n\n\t\t\tcase \"set_auto_retry\": {\n\t\t\t\tsession.setAutoRetryEnabled(command.enabled);\n\t\t\t\treturn success(id, \"set_auto_retry\");\n\t\t\t}\n\n\t\t\tcase \"abort_retry\": {\n\t\t\t\tsession.abortRetry();\n\t\t\t\treturn success(id, \"abort_retry\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Bash\n\t\t\t// =================================================================\n\n\t\t\tcase \"bash\": {\n\t\t\t\tconst result = await session.executeBash(command.command);\n\t\t\t\treturn success(id, \"bash\", result);\n\t\t\t}\n\n\t\t\tcase \"abort_bash\": {\n\t\t\t\tsession.abortBash();\n\t\t\t\treturn success(id, \"abort_bash\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Session\n\t\t\t// =================================================================\n\n\t\t\tcase \"get_session_stats\": {\n\t\t\t\tconst stats = session.getSessionStats();\n\t\t\t\treturn success(id, \"get_session_stats\", stats);\n\t\t\t}\n\n\t\t\tcase \"export_html\": {\n\t\t\t\tconst path = await session.exportToHtml(command.outputPath);\n\t\t\t\treturn success(id, \"export_html\", { path });\n\t\t\t}\n\n\t\t\tcase \"switch_session\": {\n\t\t\t\tconst cancelled = !(await session.switchSession(command.sessionPath));\n\t\t\t\treturn success(id, \"switch_session\", { cancelled });\n\t\t\t}\n\n\t\t\tcase \"fork\": {\n\t\t\t\tconst result = await session.fork(command.entryId);\n\t\t\t\treturn success(id, \"fork\", { text: result.selectedText, cancelled: result.cancelled });\n\t\t\t}\n\n\t\t\tcase \"get_fork_messages\": {\n\t\t\t\tconst messages = session.getUserMessagesForForking();\n\t\t\t\treturn success(id, \"get_fork_messages\", { messages });\n\t\t\t}\n\n\t\t\tcase \"get_last_assistant_text\": {\n\t\t\t\tconst text = session.getLastAssistantText();\n\t\t\t\treturn success(id, \"get_last_assistant_text\", { text });\n\t\t\t}\n\n\t\t\tcase \"set_session_name\": {\n\t\t\t\tconst name = command.name.trim();\n\t\t\t\tif (!name) {\n\t\t\t\t\treturn error(id, \"set_session_name\", \"Session name cannot be empty\");\n\t\t\t\t}\n\t\t\t\tsession.setSessionName(name);\n\t\t\t\treturn success(id, \"set_session_name\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Messages\n\t\t\t// =================================================================\n\n\t\t\tcase \"get_messages\": {\n\t\t\t\treturn success(id, \"get_messages\", { messages: session.messages });\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// Commands (available for invocation via prompt)\n\t\t\t// =================================================================\n\n\t\t\tcase \"get_commands\": {\n\t\t\t\tconst commands: RpcSlashCommand[] = [];\n\n\t\t\t\t// Extension commands\n\t\t\t\tfor (const { command, extensionPath } of session.extensionRunner?.getRegisteredCommandsWithPaths() ?? []) {\n\t\t\t\t\tcommands.push({\n\t\t\t\t\t\tname: command.name,\n\t\t\t\t\t\tdescription: command.description,\n\t\t\t\t\t\tsource: \"extension\",\n\t\t\t\t\t\tpath: extensionPath,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Prompt templates (source is always \"user\" | \"project\" | \"path\" in coding-agent)\n\t\t\t\tfor (const template of session.promptTemplates) {\n\t\t\t\t\tcommands.push({\n\t\t\t\t\t\tname: template.name,\n\t\t\t\t\t\tdescription: template.description,\n\t\t\t\t\t\tsource: \"prompt\",\n\t\t\t\t\t\tlocation: template.source as RpcSlashCommand[\"location\"],\n\t\t\t\t\t\tpath: template.filePath,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Skills (source is always \"user\" | \"project\" | \"path\" in coding-agent)\n\t\t\t\tfor (const skill of session.resourceLoader.getSkills().skills) {\n\t\t\t\t\tcommands.push({\n\t\t\t\t\t\tname: `skill:${skill.name}`,\n\t\t\t\t\t\tdescription: skill.description,\n\t\t\t\t\t\tsource: \"skill\",\n\t\t\t\t\t\tlocation: skill.source as RpcSlashCommand[\"location\"],\n\t\t\t\t\t\tpath: skill.filePath,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn success(id, \"get_commands\", { commands });\n\t\t\t}\n\n\t\t\tcase \"terminal_input\": {\n\t\t\t\tawait ensureEmbeddedInteractiveMode();\n\t\t\t\tremoteTerminal!.pushInput(command.data);\n\t\t\t\treturn success(id, \"terminal_input\");\n\t\t\t}\n\n\t\t\tcase \"terminal_resize\": {\n\t\t\t\tawait ensureEmbeddedInteractiveMode();\n\t\t\t\tremoteTerminal!.resize(command.cols, command.rows);\n\t\t\t\treturn success(id, \"terminal_resize\");\n\t\t\t}\n\n\t\t\tcase \"terminal_redraw\": {\n\t\t\t\tconst interactiveMode = await ensureEmbeddedInteractiveMode();\n\t\t\t\tinteractiveMode.requestRender(true);\n\t\t\t\treturn success(id, \"terminal_redraw\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// v2 Protocol: subscribe\n\t\t\t// =================================================================\n\n\t\t\tcase \"subscribe\": {\n\t\t\t\tif (command.events.includes(\"*\")) {\n\t\t\t\t\teventFilter = null; // wildcard = all events\n\t\t\t\t} else {\n\t\t\t\t\teventFilter = new Set(command.events);\n\t\t\t\t}\n\t\t\t\treturn success(id, \"subscribe\");\n\t\t\t}\n\n\t\t\t// =================================================================\n\t\t\t// v2 Protocol: shutdown\n\t\t\t// =================================================================\n\n\t\t\tcase \"shutdown\": {\n\t\t\t\tshutdownRequested = true;\n\t\t\t\treturn success(id, \"shutdown\");\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tconst unknownCommand = command as { type: string; id?: string };\n\t\t\t\treturn error(unknownCommand.id, unknownCommand.type, `Unknown command: ${unknownCommand.type}`);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Check if shutdown was requested and perform shutdown if so.\n\t * Called after handling each command when waiting for the next command.\n\t */\n\tlet detachInput = () => {};\n\n\tasync function checkShutdownRequested(): Promise<void> {\n\t\tif (!shutdownRequested) return;\n\n\t\tconst currentRunner = session.extensionRunner;\n\t\tif (currentRunner?.hasHandlers(\"session_shutdown\")) {\n\t\t\tawait currentRunner.emit({ type: \"session_shutdown\" });\n\t\t}\n\n\t\tunsubscribe();\n\t\tembeddedInteractiveMode?.stop();\n\t\tdetachInput();\n\t\tprocess.stdin.pause();\n\t\tprocess.exit(0);\n\t}\n\n\tconst handleInputLine = async (line: string) => {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(line);\n\n\t\t\t// Handle extension UI responses (bypass protocol detection)\n\t\t\tif (parsed.type === \"extension_ui_response\") {\n\t\t\t\tconst response = parsed as RpcExtensionUIResponse;\n\t\t\t\tconst pending = pendingExtensionRequests.get(response.id);\n\t\t\t\tif (pending) {\n\t\t\t\t\tpendingExtensionRequests.delete(response.id);\n\t\t\t\t\tpending.resolve(response);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Handle raw approval/classifier/network responses from RPC hosts.\n\t\t\tif (parsed.type === \"approval_response\") {\n\t\t\t\tresolveApprovalResponse(parsed.id, Boolean(parsed.approved));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (parsed.type === \"classifier_response\") {\n\t\t\t\tresolveClassifierResponse(parsed.id, Boolean(parsed.approved));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (parsed.type === \"network_approval_response\" && typeof parsed.decision === \"string\") {\n\t\t\t\tresolveNetworkApprovalResponse(parsed.id, parsed.decision as NetworkApprovalDecision);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst command = parsed as RpcCommand;\n\n\t\t\t// Protocol version detection: first non-UI-response command locks the version\n\t\t\tif (!protocolLocked) {\n\t\t\t\tprotocolLocked = true;\n\t\t\t\tif (command.type === \"init\") {\n\t\t\t\t\tprotocolVersion = 2;\n\t\t\t\t\tconst initResult: RpcInitResult = {\n\t\t\t\t\t\tprotocolVersion: 2,\n\t\t\t\t\t\tsessionId: session.sessionId,\n\t\t\t\t\t\tcapabilities: {\n\t\t\t\t\t\t\tevents: [\"execution_complete\", \"cost_update\"],\n\t\t\t\t\t\t\tcommands: [\"init\", \"shutdown\", \"subscribe\"],\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\toutput(success(command.id, \"init\", initResult));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Non-init first message: lock to v1, fall through to normal handling\n\t\t\t\tprotocolVersion = 1;\n\t\t\t} else if (command.type === \"init\") {\n\t\t\t\t// Already locked — reject re-init\n\t\t\t\toutput(error(command.id, \"init\", \"Protocol version already locked. init must be the first command.\"));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Handle regular commands\n\t\t\tconst response = await handleCommand(command);\n\t\t\toutput(response);\n\n\t\t\t// Check for deferred shutdown request (idle between commands)\n\t\t\tawait checkShutdownRequested();\n\t\t} catch (e: any) {\n\t\t\toutput(error(undefined, \"parse\", `Failed to parse command: ${e.message}`));\n\t\t}\n\t};\n\n\tdetachInput = attachJsonlLineReader(process.stdin, (line) => {\n\t\tvoid handleInputLine(line);\n\t});\n\n\t// Keep process alive forever\n\treturn new Promise(() => {});\n}\n"]}
@@ -8,6 +8,7 @@ import test from "node:test";
8
8
  import assert from "node:assert/strict";
9
9
  import { toPosixPath } from "../utils/path-display.js";
10
10
  import { buildSystemPrompt } from "../core/system-prompt.js";
11
+ import { createGrepTool } from "../core/tools/grep.js";
11
12
  // ─── toPosixPath ────────────────────────────────────────────────────────────
12
13
  test("toPosixPath: converts Windows backslash paths to forward slashes", () => {
13
14
  assert.equal(toPosixPath("C:\\Users\\name\\project"), "C:/Users/name/project");
@@ -55,6 +56,20 @@ test("buildSystemPrompt: encourages scout-first reconnaissance when subagent is
55
56
  assert.match(prompt, /Skip scout only when the task is clearly narrow/i);
56
57
  assert.match(prompt, /When the user names a subagent such as scout, worker, reviewer, or planner, invoke the subagent tool directly/i);
57
58
  });
59
+ test("buildSystemPrompt: prefers lsp over grep for typed code navigation when available", () => {
60
+ const prompt = buildSystemPrompt({
61
+ cwd: "/home/user/project",
62
+ selectedTools: ["read", "grep", "find", "ls", "lsp"],
63
+ });
64
+ assert.match(prompt, /use lsp first for symbols/i);
65
+ assert.match(prompt, /Do not use grep\/find as a substitute for symbol navigation when LSP is available/i);
66
+ assert.match(prompt, /If LSP is unavailable or failing, say so briefly and then fall back to grep\/read/i);
67
+ });
68
+ test("createGrepTool: description steers semantic code navigation to lsp", () => {
69
+ const tool = createGrepTool(process.cwd());
70
+ assert.match(tool.description, /Use this for raw text search, not semantic code navigation/i);
71
+ assert.match(tool.description, /use the `lsp` tool instead when available/i);
72
+ });
58
73
  // ─── Regression: no backslash paths in LLM-visible text ────────────────────
59
74
  /**
60
75
  * Pattern that matches Windows-style absolute paths with backslashes.
@@ -1 +1 @@
1
- {"version":3,"file":"path-display.test.js","sourceRoot":"","sources":["../../src/tests/path-display.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Cross-platform path display tests.\n *\n * Verifies that toPosixPath correctly normalizes Windows paths and that\n * the system prompt builder produces forward-slash paths for LLM consumption.\n */\n\nimport test from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport { toPosixPath } from \"../utils/path-display.js\";\nimport { buildSystemPrompt } from \"../core/system-prompt.js\";\n\n// ─── toPosixPath ────────────────────────────────────────────────────────────\n\ntest(\"toPosixPath: converts Windows backslash paths to forward slashes\", () => {\n\tassert.equal(toPosixPath(\"C:\\\\Users\\\\name\\\\project\"), \"C:/Users/name/project\");\n});\n\ntest(\"toPosixPath: handles mixed separators\", () => {\n\tassert.equal(toPosixPath(\"C:\\\\Users/name\\\\project/src\"), \"C:/Users/name/project/src\");\n});\n\ntest(\"toPosixPath: no-op for Unix paths\", () => {\n\tassert.equal(toPosixPath(\"/home/user/project\"), \"/home/user/project\");\n});\n\ntest(\"toPosixPath: handles empty string\", () => {\n\tassert.equal(toPosixPath(\"\"), \"\");\n});\n\ntest(\"toPosixPath: handles Windows UNC paths\", () => {\n\tassert.equal(toPosixPath(\"\\\\\\\\server\\\\share\\\\dir\"), \"//server/share/dir\");\n});\n\ntest(\"toPosixPath: handles .gsd/worktrees path on Windows\", () => {\n\tassert.equal(\n\t\ttoPosixPath(\"C:\\\\Users\\\\name\\\\project\\\\.gsd\\\\worktrees\\\\M001\"),\n\t\t\"C:/Users/name/project/.gsd/worktrees/M001\",\n\t);\n});\n\n// ─── System prompt path normalization ───────────────────────────────────────\n\ntest(\"buildSystemPrompt: cwd uses forward slashes even with Windows input\", () => {\n\tconst prompt = buildSystemPrompt({\n\t\tcwd: \"C:\\\\Users\\\\name\\\\development\\\\app-name\",\n\t});\n\tassert.ok(\n\t\tprompt.includes(\"C:/Users/name/development/app-name\"),\n\t\t\"System prompt should contain forward-slash path\",\n\t);\n\tassert.ok(\n\t\t!prompt.includes(\"C:\\\\Users\\\\name\\\\development\\\\app-name\"),\n\t\t\"System prompt must NOT contain backslash path\",\n\t);\n});\n\ntest(\"buildSystemPrompt: Unix paths pass through unchanged\", () => {\n\tconst prompt = buildSystemPrompt({\n\t\tcwd: \"/home/user/project\",\n\t});\n\tassert.ok(prompt.includes(\"/home/user/project\"));\n});\n\ntest(\"buildSystemPrompt: encourages scout-first reconnaissance when subagent is available\", () => {\n\tconst prompt = buildSystemPrompt({\n\t\tcwd: \"/home/user/project\",\n\t\tselectedTools: [\"read\", \"lsp\", \"subagent\", \"edit\", \"write\"],\n\t});\n\tassert.match(prompt, /delegate reconnaissance to the scout subagent/i);\n\tassert.match(prompt, /0 scouts for narrow known-file work, 1 scout for one broad unfamiliar subsystem/i);\n\tassert.match(prompt, /For one scout use \\{ agent, task \\}/i);\n\tassert.match(prompt, /Scout is for mapping and reconnaissance only/i);\n\tassert.match(prompt, /multiple scout subagents in parallel/i);\n\tassert.match(prompt, /broad review or audit requests, use scout only as a prep step/i);\n\tassert.match(prompt, /Skip scout only when the task is clearly narrow/i);\n\tassert.match(prompt, /When the user names a subagent such as scout, worker, reviewer, or planner, invoke the subagent tool directly/i);\n});\n\n// ─── Regression: no backslash paths in LLM-visible text ────────────────────\n\n/**\n * Pattern that matches Windows-style absolute paths with backslashes.\n * Catches: C:\\Users\\..., D:\\Projects\\..., \\\\server\\share\\...\n * Does not match: escaped chars in regex, JSON strings, etc.\n */\nconst WINDOWS_ABS_PATH_RE = /[A-Z]:\\\\[A-Za-z]/;\n\ntest(\"buildSystemPrompt: no Windows absolute paths with backslashes in output\", () => {\n\t// Simulate a Windows-like cwd\n\tconst prompt = buildSystemPrompt({\n\t\tcwd: \"D:\\\\Projects\\\\my-app\\\\.gsd\\\\worktrees\\\\M002\",\n\t});\n\tconst lines = prompt.split(\"\\n\");\n\tconst violations = lines.filter(line => WINDOWS_ABS_PATH_RE.test(line));\n\tassert.equal(\n\t\tviolations.length, 0,\n\t\t`System prompt contains Windows backslash paths:\\n${violations.join(\"\\n\")}`,\n\t);\n});\n"]}
1
+ {"version":3,"file":"path-display.test.js","sourceRoot":"","sources":["../../src/tests/path-display.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,+EAA+E;AAE/E,IAAI,CAAC,kEAAkE,EAAE,GAAG,EAAE;IAC7E,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,0BAA0B,CAAC,EAAE,uBAAuB,CAAC,CAAC;AAChF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;IAClD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,6BAA6B,CAAC,EAAE,2BAA2B,CAAC,CAAC;AACvF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;IAC9C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC,CAAC;AACvE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;IAC9C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACnD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,wBAAwB,CAAC,EAAE,oBAAoB,CAAC,CAAC;AAC3E,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE;IAChE,MAAM,CAAC,KAAK,CACX,WAAW,CAAC,iDAAiD,CAAC,EAC9D,2CAA2C,CAC3C,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAE/E,IAAI,CAAC,qEAAqE,EAAE,GAAG,EAAE;IAChF,MAAM,MAAM,GAAG,iBAAiB,CAAC;QAChC,GAAG,EAAE,wCAAwC;KAC7C,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CACR,MAAM,CAAC,QAAQ,CAAC,oCAAoC,CAAC,EACrD,iDAAiD,CACjD,CAAC;IACF,MAAM,CAAC,EAAE,CACR,CAAC,MAAM,CAAC,QAAQ,CAAC,wCAAwC,CAAC,EAC1D,+CAA+C,CAC/C,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;IACjE,MAAM,MAAM,GAAG,iBAAiB,CAAC;QAChC,GAAG,EAAE,oBAAoB;KACzB,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qFAAqF,EAAE,GAAG,EAAE;IAChG,MAAM,MAAM,GAAG,iBAAiB,CAAC;QAChC,GAAG,EAAE,oBAAoB;QACzB,aAAa,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC;KAC3D,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,gDAAgD,CAAC,CAAC;IACvE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,kFAAkF,CAAC,CAAC;IACzG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,sCAAsC,CAAC,CAAC;IAC7D,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,+CAA+C,CAAC,CAAC;IACtE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,uCAAuC,CAAC,CAAC;IAC9D,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,gEAAgE,CAAC,CAAC;IACvF,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,kDAAkD,CAAC,CAAC;IACzE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,gHAAgH,CAAC,CAAC;AACxI,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mFAAmF,EAAE,GAAG,EAAE;IAC9F,MAAM,MAAM,GAAG,iBAAiB,CAAC;QAChC,GAAG,EAAE,oBAAoB;QACzB,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC;KACpD,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;IACnD,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,oFAAoF,CAAC,CAAC;IAC3G,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,oFAAoF,CAAC,CAAC;AAC5G,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oEAAoE,EAAE,GAAG,EAAE;IAC/E,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,6DAA6D,CAAC,CAAC;IAC9F,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,4CAA4C,CAAC,CAAC;AAC9E,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,kBAAkB,CAAC;AAE/C,IAAI,CAAC,yEAAyE,EAAE,GAAG,EAAE;IACpF,8BAA8B;IAC9B,MAAM,MAAM,GAAG,iBAAiB,CAAC;QAChC,GAAG,EAAE,6CAA6C;KAClD,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,MAAM,CAAC,KAAK,CACX,UAAU,CAAC,MAAM,EAAE,CAAC,EACpB,oDAAoD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC3E,CAAC;AACH,CAAC,CAAC,CAAC","sourcesContent":["/**\n * Cross-platform path display tests.\n *\n * Verifies that toPosixPath correctly normalizes Windows paths and that\n * the system prompt builder produces forward-slash paths for LLM consumption.\n */\n\nimport test from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport { toPosixPath } from \"../utils/path-display.js\";\nimport { buildSystemPrompt } from \"../core/system-prompt.js\";\nimport { createGrepTool } from \"../core/tools/grep.js\";\n\n// ─── toPosixPath ────────────────────────────────────────────────────────────\n\ntest(\"toPosixPath: converts Windows backslash paths to forward slashes\", () => {\n\tassert.equal(toPosixPath(\"C:\\\\Users\\\\name\\\\project\"), \"C:/Users/name/project\");\n});\n\ntest(\"toPosixPath: handles mixed separators\", () => {\n\tassert.equal(toPosixPath(\"C:\\\\Users/name\\\\project/src\"), \"C:/Users/name/project/src\");\n});\n\ntest(\"toPosixPath: no-op for Unix paths\", () => {\n\tassert.equal(toPosixPath(\"/home/user/project\"), \"/home/user/project\");\n});\n\ntest(\"toPosixPath: handles empty string\", () => {\n\tassert.equal(toPosixPath(\"\"), \"\");\n});\n\ntest(\"toPosixPath: handles Windows UNC paths\", () => {\n\tassert.equal(toPosixPath(\"\\\\\\\\server\\\\share\\\\dir\"), \"//server/share/dir\");\n});\n\ntest(\"toPosixPath: handles .gsd/worktrees path on Windows\", () => {\n\tassert.equal(\n\t\ttoPosixPath(\"C:\\\\Users\\\\name\\\\project\\\\.gsd\\\\worktrees\\\\M001\"),\n\t\t\"C:/Users/name/project/.gsd/worktrees/M001\",\n\t);\n});\n\n// ─── System prompt path normalization ───────────────────────────────────────\n\ntest(\"buildSystemPrompt: cwd uses forward slashes even with Windows input\", () => {\n\tconst prompt = buildSystemPrompt({\n\t\tcwd: \"C:\\\\Users\\\\name\\\\development\\\\app-name\",\n\t});\n\tassert.ok(\n\t\tprompt.includes(\"C:/Users/name/development/app-name\"),\n\t\t\"System prompt should contain forward-slash path\",\n\t);\n\tassert.ok(\n\t\t!prompt.includes(\"C:\\\\Users\\\\name\\\\development\\\\app-name\"),\n\t\t\"System prompt must NOT contain backslash path\",\n\t);\n});\n\ntest(\"buildSystemPrompt: Unix paths pass through unchanged\", () => {\n\tconst prompt = buildSystemPrompt({\n\t\tcwd: \"/home/user/project\",\n\t});\n\tassert.ok(prompt.includes(\"/home/user/project\"));\n});\n\ntest(\"buildSystemPrompt: encourages scout-first reconnaissance when subagent is available\", () => {\n\tconst prompt = buildSystemPrompt({\n\t\tcwd: \"/home/user/project\",\n\t\tselectedTools: [\"read\", \"lsp\", \"subagent\", \"edit\", \"write\"],\n\t});\n\tassert.match(prompt, /delegate reconnaissance to the scout subagent/i);\n\tassert.match(prompt, /0 scouts for narrow known-file work, 1 scout for one broad unfamiliar subsystem/i);\n\tassert.match(prompt, /For one scout use \\{ agent, task \\}/i);\n\tassert.match(prompt, /Scout is for mapping and reconnaissance only/i);\n\tassert.match(prompt, /multiple scout subagents in parallel/i);\n\tassert.match(prompt, /broad review or audit requests, use scout only as a prep step/i);\n\tassert.match(prompt, /Skip scout only when the task is clearly narrow/i);\n\tassert.match(prompt, /When the user names a subagent such as scout, worker, reviewer, or planner, invoke the subagent tool directly/i);\n});\n\ntest(\"buildSystemPrompt: prefers lsp over grep for typed code navigation when available\", () => {\n\tconst prompt = buildSystemPrompt({\n\t\tcwd: \"/home/user/project\",\n\t\tselectedTools: [\"read\", \"grep\", \"find\", \"ls\", \"lsp\"],\n\t});\n\tassert.match(prompt, /use lsp first for symbols/i);\n\tassert.match(prompt, /Do not use grep\\/find as a substitute for symbol navigation when LSP is available/i);\n\tassert.match(prompt, /If LSP is unavailable or failing, say so briefly and then fall back to grep\\/read/i);\n});\n\ntest(\"createGrepTool: description steers semantic code navigation to lsp\", () => {\n\tconst tool = createGrepTool(process.cwd());\n\tassert.match(tool.description, /Use this for raw text search, not semantic code navigation/i);\n\tassert.match(tool.description, /use the `lsp` tool instead when available/i);\n});\n\n// ─── Regression: no backslash paths in LLM-visible text ────────────────────\n\n/**\n * Pattern that matches Windows-style absolute paths with backslashes.\n * Catches: C:\\Users\\..., D:\\Projects\\..., \\\\server\\share\\...\n * Does not match: escaped chars in regex, JSON strings, etc.\n */\nconst WINDOWS_ABS_PATH_RE = /[A-Z]:\\\\[A-Za-z]/;\n\ntest(\"buildSystemPrompt: no Windows absolute paths with backslashes in output\", () => {\n\t// Simulate a Windows-like cwd\n\tconst prompt = buildSystemPrompt({\n\t\tcwd: \"D:\\\\Projects\\\\my-app\\\\.gsd\\\\worktrees\\\\M002\",\n\t});\n\tconst lines = prompt.split(\"\\n\");\n\tconst violations = lines.filter(line => WINDOWS_ABS_PATH_RE.test(line));\n\tassert.equal(\n\t\tviolations.length, 0,\n\t\t`System prompt contains Windows backslash paths:\\n${violations.join(\"\\n\")}`,\n\t);\n});\n"]}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gsd/pi-coding-agent",
3
- "version": "1.2.3",
3
+ "version": "1.3.6",
4
4
  "description": "Coding agent CLI (vendored from pi-mono)",
5
5
  "type": "module",
6
6
  "piConfig": {
@@ -53,7 +53,7 @@ export interface Args {
53
53
  bare?: boolean;
54
54
  }
55
55
 
56
- const VALID_THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh", "adaptive"] as const;
56
+ const VALID_THINKING_LEVELS = ["off", "low", "medium", "high", "xhigh", "adaptive"] as const;
57
57
 
58
58
  export function isValidThinkingLevel(level: string): level is ThinkingLevel {
59
59
  return VALID_THINKING_LEVELS.includes(level as ThinkingLevel);
@@ -229,7 +229,7 @@ ${chalk.bold("Options:")}
229
229
  --no-tools Disable all built-in tools
230
230
  --tools <tools> Comma-separated list of tools to enable (default: read,bash,edit,write)
231
231
  Available: read, bash, edit, write, lsp, grep, find, ls
232
- --thinking <level> Set thinking level: off, minimal, low, medium, high, xhigh
232
+ --thinking <level> Set thinking level: off, low, medium, high, xhigh
233
233
  --extension, -e <path> Load an extension file (can be used multiple times)
234
234
  --no-extensions, -ne Disable extension discovery (explicit -e paths still work)
235
235
  --skill <path> Load a skill file or directory (can be used multiple times)
@@ -122,6 +122,7 @@ export function parseSkillBlock(text: string): ParsedSkillBlock | null {
122
122
  export type SessionStateChangeReason =
123
123
  | "set_model"
124
124
  | "set_thinking_level"
125
+ | "adaptive_classified"
125
126
  | "set_steering_mode"
126
127
  | "set_follow_up_mode"
127
128
  | "set_auto_compaction"
@@ -231,17 +232,8 @@ export interface SessionStats {
231
232
  // Constants
232
233
  // ============================================================================
233
234
 
234
- /** Standard thinking levels */
235
- const THINKING_LEVELS: ThinkingLevel[] = ["off", "minimal", "low", "medium", "high"];
236
-
237
- /** Thinking levels including xhigh (for supported models) */
238
- const THINKING_LEVELS_WITH_XHIGH: ThinkingLevel[] = ["off", "minimal", "low", "medium", "high", "xhigh"];
239
-
240
- /** Thinking levels for models supporting adaptive thinking (Claude Opus/Sonnet 4.6+) */
241
- const THINKING_LEVELS_WITH_ADAPTIVE: ThinkingLevel[] = ["off", "adaptive", "minimal", "low", "medium", "high"];
242
-
243
- /** Thinking levels for models supporting both adaptive and xhigh */
244
- const THINKING_LEVELS_WITH_ADAPTIVE_AND_XHIGH: ThinkingLevel[] = ["off", "adaptive", "minimal", "low", "medium", "high", "xhigh"];
235
+ /** Canonical thinking levels; availability is filtered per model capability */
236
+ const THINKING_LEVELS_ALL: ThinkingLevel[] = ["off", "adaptive", "low", "medium", "high", "xhigh"];
245
237
 
246
238
  // ============================================================================
247
239
  // AgentSession Class
@@ -479,6 +471,9 @@ export class AgentSession {
479
471
 
480
472
  // Notify all listeners
481
473
  this._emit(event);
474
+ if (event.type === "adaptive_classified") {
475
+ this._emitSessionStateChanged("adaptive_classified");
476
+ }
482
477
 
483
478
  // Handle session persistence
484
479
  if (event.type === "message_end") {
@@ -563,6 +558,7 @@ export class AgentSession {
563
558
 
564
559
  // Auto-retry after downsizing
565
560
  setTimeout(() => {
561
+ this._enforcePlanModeHighThinkingLevel();
566
562
  this.agent.continue().catch(() => {});
567
563
  }, 0);
568
564
  return;
@@ -828,6 +824,11 @@ export class AgentSession {
828
824
  return this.agent.state.thinkingLevel;
829
825
  }
830
826
 
827
+ /** Last adaptive classifier decision for footer/debug visibility */
828
+ get lastAdaptiveDecision(): AgentState["lastAdaptiveDecision"] {
829
+ return this.agent.state.lastAdaptiveDecision;
830
+ }
831
+
831
832
  /** Whether agent is currently streaming a response */
832
833
  get isStreaming(): boolean {
833
834
  return this.agent.state.isStreaming;
@@ -1124,6 +1125,25 @@ export class AgentSession {
1124
1125
  return guidelines;
1125
1126
  }
1126
1127
 
1128
+ private static readonly STANDARD_TOOL_NAMES: readonly string[] = [
1129
+ "read", "bash", "edit", "write", "lsp", "grep", "find", "ls",
1130
+ "bg_shell",
1131
+ "web_search", "fetch_page",
1132
+ "resolve_library", "get_library_docs",
1133
+ "subagent", "await_subagent", "Skill",
1134
+ "ask_user_questions", "secure_env_collect",
1135
+ "browser_navigate", "browser_click", "browser_type", "browser_screenshot",
1136
+ "browser_scroll", "browser_key_press", "browser_evaluate",
1137
+ "browser_find", "browser_wait_for", "browser_close",
1138
+ "browser_assert", "browser_batch",
1139
+ "tool_search", "tool_enable",
1140
+ ];
1141
+
1142
+ private _getStandardToolNames(toolRegistry: Map<string, any>): string[] {
1143
+ const available = new Set(toolRegistry.keys());
1144
+ return AgentSession.STANDARD_TOOL_NAMES.filter((name) => available.has(name));
1145
+ }
1146
+
1127
1147
  private _rebuildSystemPrompt(toolNames: string[]): string {
1128
1148
  const validToolNames = toolNames.filter((name) => this._toolRegistry.has(name));
1129
1149
  const toolSnippets: Record<string, string> = {};
@@ -1164,6 +1184,16 @@ export class AgentSession {
1164
1184
  // Prompting
1165
1185
  // =========================================================================
1166
1186
 
1187
+ private _enforcePlanModeHighThinkingLevel(): void {
1188
+ if (getPermissionMode() !== "plan") return;
1189
+ if (!this.supportsThinking()) return;
1190
+ if (this.agent.state.thinkingLevel === "high") return;
1191
+
1192
+ this.agent.setThinkingLevel("high");
1193
+ this.sessionManager.appendThinkingLevelChange("high");
1194
+ this._emitSessionStateChanged("set_thinking_level");
1195
+ }
1196
+
1167
1197
  /**
1168
1198
  * Send a prompt to the agent.
1169
1199
  * - Handles extension commands (registered via pi.registerCommand) immediately, even during streaming
@@ -1327,6 +1357,7 @@ export class AgentSession {
1327
1357
  }
1328
1358
  }
1329
1359
 
1360
+ this._enforcePlanModeHighThinkingLevel();
1330
1361
  await this.agent.prompt(messages);
1331
1362
  await this._waitForAutomatedFollowUps();
1332
1363
  }
@@ -2000,15 +2031,11 @@ export class AgentSession {
2000
2031
  */
2001
2032
  getAvailableThinkingLevels(): ThinkingLevel[] {
2002
2033
  if (!this.supportsThinking()) return ["off"];
2003
- const adaptive = this.supportsAdaptiveThinking();
2004
- const xhigh = this.supportsXhighThinking();
2005
- if (adaptive && xhigh) return THINKING_LEVELS_WITH_ADAPTIVE_AND_XHIGH;
2006
- if (adaptive) return THINKING_LEVELS_WITH_ADAPTIVE;
2007
- return xhigh ? THINKING_LEVELS_WITH_XHIGH : THINKING_LEVELS;
2034
+ return THINKING_LEVELS_ALL.filter((level) => level !== "xhigh" || this.supportsXhighThinking());
2008
2035
  }
2009
2036
 
2010
2037
  /**
2011
- * Check if current model supports adaptive thinking (Claude Opus/Sonnet 4.6+).
2038
+ * Check if current model supports provider-side adaptive thinking.
2012
2039
  */
2013
2040
  supportsAdaptiveThinking(): boolean {
2014
2041
  return this.model ? supportsAdaptiveThinking(this.model.id) : false;
@@ -2035,8 +2062,15 @@ export class AgentSession {
2035
2062
  if (
2036
2063
  targetModel.provider === "anthropic" &&
2037
2064
  targetModel.reasoning === true &&
2038
- this.settingsManager.getAnthropicAdaptiveByDefault() &&
2039
- supportsAdaptiveThinking(targetModel.id)
2065
+ supportsAdaptiveThinking(targetModel.id) &&
2066
+ (this.settingsManager.getClientAdaptiveByDefault() || this.settingsManager.getAnthropicAdaptiveByDefault())
2067
+ ) {
2068
+ return "adaptive";
2069
+ }
2070
+ if (
2071
+ targetModel.reasoning === true &&
2072
+ this.settingsManager.getClientAdaptiveByDefault() &&
2073
+ !!this.settingsManager.getAdaptiveClassifierModel()
2040
2074
  ) {
2041
2075
  return "adaptive";
2042
2076
  }
@@ -2047,7 +2081,7 @@ export class AgentSession {
2047
2081
  }
2048
2082
 
2049
2083
  private _clampThinkingLevel(level: ThinkingLevel, availableLevels: ThinkingLevel[]): ThinkingLevel {
2050
- const ordered = THINKING_LEVELS_WITH_ADAPTIVE_AND_XHIGH;
2084
+ const ordered = THINKING_LEVELS_ALL;
2051
2085
  const available = new Set(availableLevels);
2052
2086
  const requestedIndex = ordered.indexOf(level);
2053
2087
  if (requestedIndex === -1) {
@@ -2316,6 +2350,7 @@ export class AgentSession {
2316
2350
  downsizeConversationImages(messages as Message[]);
2317
2351
  }
2318
2352
  this.agent.replaceMessages(messages.slice(0, -1));
2353
+ this._enforcePlanModeHighThinkingLevel();
2319
2354
  this.agent.continue().catch((err) => {
2320
2355
  runner.emitError({
2321
2356
  extensionPath: "<runtime>",
@@ -2424,7 +2459,9 @@ export class AgentSession {
2424
2459
  ? [...options.activeToolNames]
2425
2460
  : this.settingsManager.getToolProfile() === "full"
2426
2461
  ? Array.from(toolRegistry.keys())
2427
- : [...previousActiveToolNames];
2462
+ : this.settingsManager.getToolProfile() === "standard"
2463
+ ? this._getStandardToolNames(toolRegistry)
2464
+ : [...previousActiveToolNames];
2428
2465
 
2429
2466
  if (options?.includeAllExtensionTools) {
2430
2467
  for (const tool of wrappedExtensionTools) {
@@ -36,7 +36,8 @@ export type AppAction =
36
36
  | "resume"
37
37
  | "cyclePermissionMode"
38
38
  | "showHotkeys"
39
- | "terminalFocus";
39
+ | "terminalFocus"
40
+ | "toggleNotificationSound";
40
41
 
41
42
  /**
42
43
  * All configurable actions.
@@ -76,6 +77,7 @@ const DEFAULT_APP_KEYBINDINGS: Record<AppAction, KeyId | KeyId[]> = {
76
77
  cyclePermissionMode: "shift+tab",
77
78
  showHotkeys: "ctrl+k",
78
79
  terminalFocus: "tab",
80
+ toggleNotificationSound: "alt+n",
79
81
  };
80
82
 
81
83
  /**
@@ -110,6 +112,7 @@ const APP_ACTIONS: AppAction[] = [
110
112
  "cyclePermissionMode",
111
113
  "showHotkeys",
112
114
  "terminalFocus",
115
+ "toggleNotificationSound",
113
116
  ];
114
117
 
115
118
  function isAppAction(action: string): action is AppAction {
@@ -1,4 +1,6 @@
1
- Preferred tool for code navigation in typed codebases. Use this instead of grep/find when looking up symbol definitions, references, implementations, type info, callers, or rename targets.
1
+ Preferred first-choice tool for code navigation in typed codebases. Use this instead of grep/find when looking up symbol definitions, references, implementations, type info, callers, or rename targets.
2
+
3
+ Use `lsp` first when a language server is available. Do not use grep/find as a substitute for semantic symbol navigation unless LSP is unavailable or failing.
2
4
 
3
5
  Interacts with Language Server Protocol servers for code intelligence.
4
6