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":"index.d.ts","sourceRoot":"","sources":["../../../src/core/tools/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/tools/index.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,8 @@ export const codingTools = [readTool, bashTool, editTool, writeTool];
28
28
  // Read-only tools for exploration without modification (using process.cwd())
29
29
  export const readOnlyTools = [readTool, grepTool, findTool, lsTool];
30
30
  const ptyBuiltinTools = createPtyTools(process.cwd());
31
+ /** Write raw input to an active agent PTY session. Used by the UI for user-controlled focus. */
32
+ export const writeToPtySession = ptyBuiltinTools.writeToSession;
31
33
  // All available tools (using process.cwd())
32
34
  export const allTools = {
33
35
  read: readTool,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/tools/index.ts"],"names":[],"mappings":"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","sourcesContent":["export {\n\ttype BashOperations,\n\ttype BashSpawnContext,\n\ttype BashSpawnHook,\n\ttype BashToolDetails,\n\ttype BashToolInput,\n\ttype BashToolOptions,\n\tbashTool,\n\tcreateBashTool,\n\trewriteBackgroundCommand,\n} from \"./bash.js\";\nexport {\n\ttype BashInterceptorRule,\n\tcheckBashInterception,\n\ttype CompiledInterceptor,\n\tcompileInterceptor,\n\tDEFAULT_BASH_INTERCEPTOR_RULES,\n\ttype InterceptionResult,\n} from \"./bash-interceptor.js\";\nexport {\n\tcreateEditTool,\n\ttype EditOperations,\n\ttype EditToolDetails,\n\ttype EditToolInput,\n\ttype EditToolOptions,\n\teditTool,\n} from \"./edit.js\";\nexport {\n\tcreateFindTool,\n\ttype FindOperations,\n\ttype FindToolDetails,\n\ttype FindToolInput,\n\ttype FindToolOptions,\n\tfindTool,\n} from \"./find.js\";\nexport {\n\tcreateGrepTool,\n\ttype GrepOperations,\n\ttype GrepToolDetails,\n\ttype GrepToolInput,\n\ttype GrepToolOptions,\n\tgrepTool,\n} from \"./grep.js\";\nexport {\n\tcreateLsTool,\n\ttype LsOperations,\n\ttype LsToolDetails,\n\ttype LsToolInput,\n\ttype LsToolOptions,\n\tlsTool,\n} from \"./ls.js\";\nexport {\n\tcreateReadTool,\n\ttype ReadOperations,\n\ttype ReadToolDetails,\n\ttype ReadToolInput,\n\ttype ReadToolOptions,\n\treadTool,\n} from \"./read.js\";\nexport {\n\tDEFAULT_MAX_BYTES,\n\tDEFAULT_MAX_LINES,\n\tformatSize,\n\ttype TruncationOptions,\n\ttype TruncationResult,\n\ttruncateHead,\n\ttruncateLine,\n\ttruncateTail,\n} from \"./truncate.js\";\nexport {\n\tcreateWriteTool,\n\ttype WriteOperations,\n\ttype WriteToolInput,\n\ttype WriteToolOptions,\n\twriteTool,\n} from \"./write.js\";\nexport {\n\tcreateHashlineEditTool,\n\ttype HashlineEditInput,\n\ttype HashlineEditItem,\n\ttype HashlineEditOperations,\n\ttype HashlineEditToolDetails,\n\ttype HashlineEditToolOptions,\n\thashlineEditTool,\n} from \"./hashline-edit.js\";\nexport {\n\tcreateHashlineReadTool,\n\ttype HashlineReadOperations,\n\ttype HashlineReadToolDetails,\n\ttype HashlineReadToolInput,\n\ttype HashlineReadToolOptions,\n\thashlineReadTool,\n} from \"./hashline-read.js\";\nexport {\n\tcreatePtyTools,\n\ttype PtyKillInput,\n\ttype PtyReadInput,\n\ttype PtyResizeInput,\n\ttype PtySendInput,\n\ttype PtyStartInput,\n\ttype PtyToolDetails,\n\ttype PtyWaitInput,\n\tptyToolNames,\n} from \"./pty.js\";\nexport {\n\ttype Anchor,\n\tapplyHashlineEdits,\n\tcomputeLineHash,\n\tformatHashLines,\n\tformatLineTag,\n\ttype HashlineEdit,\n\tHashlineMismatchError,\n\tparseHashlineText,\n\ttype HashMismatch,\n\tparseTag,\n\tstripNewLinePrefixes,\n\tvalidateLineRef,\n} from \"./hashline.js\";\nexport {\n\tcreateLspTool,\n\ttype LspToolDetails,\n\tlspSchema,\n\tlspTool,\n} from \"../lsp/index.js\";\nexport type { LspServerStatus } from \"../lsp/client.js\";\n\nimport type { AgentTool } from \"@gsd/pi-agent-core\";\nimport { type BashToolOptions, bashTool, createBashTool } from \"./bash.js\";\nimport { createEditTool, editTool } from \"./edit.js\";\nimport { createFindTool, findTool } from \"./find.js\";\nimport { createGrepTool, grepTool } from \"./grep.js\";\nimport { createHashlineEditTool, hashlineEditTool } from \"./hashline-edit.js\";\nimport { createHashlineReadTool, hashlineReadTool } from \"./hashline-read.js\";\nimport { createLsTool, lsTool } from \"./ls.js\";\nimport { createPtyTools } from \"./pty.js\";\nimport { createReadTool, type ReadToolOptions, readTool } from \"./read.js\";\nimport { createWriteTool, writeTool } from \"./write.js\";\nimport { createLspTool, lspTool } from \"../lsp/index.js\";\n\n/** Tool type (AgentTool from pi-ai) */\nexport type Tool = AgentTool<any>;\n\n// Default tools for full access mode (using process.cwd())\nexport const codingTools: Tool[] = [readTool, bashTool, editTool, writeTool];\n\n// Read-only tools for exploration without modification (using process.cwd())\nexport const readOnlyTools: Tool[] = [readTool, grepTool, findTool, lsTool];\n\nconst ptyBuiltinTools = createPtyTools(process.cwd());\n\n// All available tools (using process.cwd())\nexport const allTools = {\n\tread: readTool,\n\tbash: bashTool,\n\tedit: editTool,\n\twrite: writeTool,\n\tgrep: grepTool,\n\tfind: findTool,\n\tls: lsTool,\n\tlsp: lspTool,\n\thashline_edit: hashlineEditTool,\n\thashline_read: hashlineReadTool,\n\tpty_start: ptyBuiltinTools.pty_start,\n\tpty_send: ptyBuiltinTools.pty_send,\n\tpty_read: ptyBuiltinTools.pty_read,\n\tpty_wait: ptyBuiltinTools.pty_wait,\n\tpty_resize: ptyBuiltinTools.pty_resize,\n\tpty_kill: ptyBuiltinTools.pty_kill,\n};\n\n// Hashline-mode coding tools — read with hash anchors, edit with hash references\nexport const hashlineCodingTools: Tool[] = [hashlineReadTool, bashTool, hashlineEditTool, writeTool];\n\nexport type ToolName = keyof typeof allTools;\n\nexport interface ToolsOptions {\n\t/** Options for the read tool */\n\tread?: ReadToolOptions;\n\t/** Options for the bash tool */\n\tbash?: BashToolOptions;\n}\n\nfunction addPtyTools<T extends Record<string, Tool>>(target: T, cwd: string): T & Record<string, Tool> {\n\tconst ptyTools = createPtyTools(cwd);\n\treturn {\n\t\t...target,\n\t\tpty_start: ptyTools.pty_start,\n\t\tpty_send: ptyTools.pty_send,\n\t\tpty_read: ptyTools.pty_read,\n\t\tpty_wait: ptyTools.pty_wait,\n\t\tpty_resize: ptyTools.pty_resize,\n\t\tpty_kill: ptyTools.pty_kill,\n\t};\n}\n\n/**\n * Create coding tools configured for a specific working directory.\n */\nexport function createCodingTools(cwd: string, options?: ToolsOptions): Tool[] {\n\treturn [\n\t\tcreateReadTool(cwd, options?.read),\n\t\tcreateBashTool(cwd, options?.bash),\n\t\tcreateEditTool(cwd),\n\t\tcreateWriteTool(cwd),\n\t];\n}\n\n/**\n * Create read-only tools configured for a specific working directory.\n */\nexport function createReadOnlyTools(cwd: string, options?: ToolsOptions): Tool[] {\n\treturn [createReadTool(cwd, options?.read), createGrepTool(cwd), createFindTool(cwd), createLsTool(cwd)];\n}\n\n/**\n * Create all tools configured for a specific working directory.\n */\nexport function createAllTools(cwd: string, options?: ToolsOptions): Record<ToolName, Tool> {\n\treturn addPtyTools({\n\t\tread: createReadTool(cwd, options?.read),\n\t\tbash: createBashTool(cwd, options?.bash),\n\t\tedit: createEditTool(cwd),\n\t\twrite: createWriteTool(cwd),\n\t\tgrep: createGrepTool(cwd),\n\t\tfind: createFindTool(cwd),\n\t\tls: createLsTool(cwd),\n\t\tlsp: createLspTool(cwd),\n\t\thashline_edit: createHashlineEditTool(cwd),\n\t\thashline_read: createHashlineReadTool(cwd, options?.read),\n\t}, cwd) as Record<ToolName, Tool>;\n}\n\n/**\n * Create hashline-mode coding tools configured for a specific working directory.\n * Uses hashline read (LINE#ID prefixed output) and hashline edit (hash-anchor based edits).\n */\nexport function createHashlineCodingTools(cwd: string, options?: ToolsOptions): Tool[] {\n\treturn [\n\t\tcreateHashlineReadTool(cwd, options?.read),\n\t\tcreateBashTool(cwd, options?.bash),\n\t\tcreateHashlineEditTool(cwd),\n\t\tcreateWriteTool(cwd),\n\t];\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/tools/index.ts"],"names":[],"mappings":"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","sourcesContent":["export {\n\ttype BashOperations,\n\ttype BashSpawnContext,\n\ttype BashSpawnHook,\n\ttype BashToolDetails,\n\ttype BashToolInput,\n\ttype BashToolOptions,\n\tbashTool,\n\tcreateBashTool,\n\trewriteBackgroundCommand,\n} from \"./bash.js\";\nexport {\n\ttype BashInterceptorRule,\n\tcheckBashInterception,\n\ttype CompiledInterceptor,\n\tcompileInterceptor,\n\tDEFAULT_BASH_INTERCEPTOR_RULES,\n\ttype InterceptionResult,\n} from \"./bash-interceptor.js\";\nexport {\n\tcreateEditTool,\n\ttype EditOperations,\n\ttype EditToolDetails,\n\ttype EditToolInput,\n\ttype EditToolOptions,\n\teditTool,\n} from \"./edit.js\";\nexport {\n\tcreateFindTool,\n\ttype FindOperations,\n\ttype FindToolDetails,\n\ttype FindToolInput,\n\ttype FindToolOptions,\n\tfindTool,\n} from \"./find.js\";\nexport {\n\tcreateGrepTool,\n\ttype GrepOperations,\n\ttype GrepToolDetails,\n\ttype GrepToolInput,\n\ttype GrepToolOptions,\n\tgrepTool,\n} from \"./grep.js\";\nexport {\n\tcreateLsTool,\n\ttype LsOperations,\n\ttype LsToolDetails,\n\ttype LsToolInput,\n\ttype LsToolOptions,\n\tlsTool,\n} from \"./ls.js\";\nexport {\n\tcreateReadTool,\n\ttype ReadOperations,\n\ttype ReadToolDetails,\n\ttype ReadToolInput,\n\ttype ReadToolOptions,\n\treadTool,\n} from \"./read.js\";\nexport {\n\tDEFAULT_MAX_BYTES,\n\tDEFAULT_MAX_LINES,\n\tformatSize,\n\ttype TruncationOptions,\n\ttype TruncationResult,\n\ttruncateHead,\n\ttruncateLine,\n\ttruncateTail,\n} from \"./truncate.js\";\nexport {\n\tcreateWriteTool,\n\ttype WriteOperations,\n\ttype WriteToolInput,\n\ttype WriteToolOptions,\n\twriteTool,\n} from \"./write.js\";\nexport {\n\tcreateHashlineEditTool,\n\ttype HashlineEditInput,\n\ttype HashlineEditItem,\n\ttype HashlineEditOperations,\n\ttype HashlineEditToolDetails,\n\ttype HashlineEditToolOptions,\n\thashlineEditTool,\n} from \"./hashline-edit.js\";\nexport {\n\tcreateHashlineReadTool,\n\ttype HashlineReadOperations,\n\ttype HashlineReadToolDetails,\n\ttype HashlineReadToolInput,\n\ttype HashlineReadToolOptions,\n\thashlineReadTool,\n} from \"./hashline-read.js\";\nexport {\n\tcreatePtyTools,\n\ttype PtyKillInput,\n\ttype PtyReadInput,\n\ttype PtyResizeInput,\n\ttype PtySendInput,\n\ttype PtyStartInput,\n\ttype PtyToolDetails,\n\ttype PtyWaitInput,\n\tptyToolNames,\n} from \"./pty.js\";\nexport {\n\ttype Anchor,\n\tapplyHashlineEdits,\n\tcomputeLineHash,\n\tformatHashLines,\n\tformatLineTag,\n\ttype HashlineEdit,\n\tHashlineMismatchError,\n\tparseHashlineText,\n\ttype HashMismatch,\n\tparseTag,\n\tstripNewLinePrefixes,\n\tvalidateLineRef,\n} from \"./hashline.js\";\nexport {\n\tcreateLspTool,\n\ttype LspToolDetails,\n\tlspSchema,\n\tlspTool,\n} from \"../lsp/index.js\";\nexport type { LspServerStatus } from \"../lsp/client.js\";\n\nimport type { AgentTool } from \"@gsd/pi-agent-core\";\nimport { type BashToolOptions, bashTool, createBashTool } from \"./bash.js\";\nimport { createEditTool, editTool } from \"./edit.js\";\nimport { createFindTool, findTool } from \"./find.js\";\nimport { createGrepTool, grepTool } from \"./grep.js\";\nimport { createHashlineEditTool, hashlineEditTool } from \"./hashline-edit.js\";\nimport { createHashlineReadTool, hashlineReadTool } from \"./hashline-read.js\";\nimport { createLsTool, lsTool } from \"./ls.js\";\nimport { createPtyTools } from \"./pty.js\";\nimport { createReadTool, type ReadToolOptions, readTool } from \"./read.js\";\nimport { createWriteTool, writeTool } from \"./write.js\";\nimport { createLspTool, lspTool } from \"../lsp/index.js\";\n\n/** Tool type (AgentTool from pi-ai) */\nexport type Tool = AgentTool<any>;\n\n// Default tools for full access mode (using process.cwd())\nexport const codingTools: Tool[] = [readTool, bashTool, editTool, writeTool];\n\n// Read-only tools for exploration without modification (using process.cwd())\nexport const readOnlyTools: Tool[] = [readTool, grepTool, findTool, lsTool];\n\nconst ptyBuiltinTools = createPtyTools(process.cwd());\n\n/** Write raw input to an active agent PTY session. Used by the UI for user-controlled focus. */\nexport const writeToPtySession: (sessionId: string, input: string) => void = ptyBuiltinTools.writeToSession;\n\n// All available tools (using process.cwd())\nexport const allTools = {\n\tread: readTool,\n\tbash: bashTool,\n\tedit: editTool,\n\twrite: writeTool,\n\tgrep: grepTool,\n\tfind: findTool,\n\tls: lsTool,\n\tlsp: lspTool,\n\thashline_edit: hashlineEditTool,\n\thashline_read: hashlineReadTool,\n\tpty_start: ptyBuiltinTools.pty_start,\n\tpty_send: ptyBuiltinTools.pty_send,\n\tpty_read: ptyBuiltinTools.pty_read,\n\tpty_wait: ptyBuiltinTools.pty_wait,\n\tpty_resize: ptyBuiltinTools.pty_resize,\n\tpty_kill: ptyBuiltinTools.pty_kill,\n};\n\n// Hashline-mode coding tools — read with hash anchors, edit with hash references\nexport const hashlineCodingTools: Tool[] = [hashlineReadTool, bashTool, hashlineEditTool, writeTool];\n\nexport type ToolName = keyof typeof allTools;\n\nexport interface ToolsOptions {\n\t/** Options for the read tool */\n\tread?: ReadToolOptions;\n\t/** Options for the bash tool */\n\tbash?: BashToolOptions;\n}\n\nfunction addPtyTools<T extends Record<string, Tool>>(target: T, cwd: string): T & Record<string, Tool> {\n\tconst ptyTools = createPtyTools(cwd);\n\treturn {\n\t\t...target,\n\t\tpty_start: ptyTools.pty_start,\n\t\tpty_send: ptyTools.pty_send,\n\t\tpty_read: ptyTools.pty_read,\n\t\tpty_wait: ptyTools.pty_wait,\n\t\tpty_resize: ptyTools.pty_resize,\n\t\tpty_kill: ptyTools.pty_kill,\n\t};\n}\n\n/**\n * Create coding tools configured for a specific working directory.\n */\nexport function createCodingTools(cwd: string, options?: ToolsOptions): Tool[] {\n\treturn [\n\t\tcreateReadTool(cwd, options?.read),\n\t\tcreateBashTool(cwd, options?.bash),\n\t\tcreateEditTool(cwd),\n\t\tcreateWriteTool(cwd),\n\t];\n}\n\n/**\n * Create read-only tools configured for a specific working directory.\n */\nexport function createReadOnlyTools(cwd: string, options?: ToolsOptions): Tool[] {\n\treturn [createReadTool(cwd, options?.read), createGrepTool(cwd), createFindTool(cwd), createLsTool(cwd)];\n}\n\n/**\n * Create all tools configured for a specific working directory.\n */\nexport function createAllTools(cwd: string, options?: ToolsOptions): Record<ToolName, Tool> {\n\treturn addPtyTools({\n\t\tread: createReadTool(cwd, options?.read),\n\t\tbash: createBashTool(cwd, options?.bash),\n\t\tedit: createEditTool(cwd),\n\t\twrite: createWriteTool(cwd),\n\t\tgrep: createGrepTool(cwd),\n\t\tfind: createFindTool(cwd),\n\t\tls: createLsTool(cwd),\n\t\tlsp: createLspTool(cwd),\n\t\thashline_edit: createHashlineEditTool(cwd),\n\t\thashline_read: createHashlineReadTool(cwd, options?.read),\n\t}, cwd) as Record<ToolName, Tool>;\n}\n\n/**\n * Create hashline-mode coding tools configured for a specific working directory.\n * Uses hashline read (LINE#ID prefixed output) and hashline edit (hash-anchor based edits).\n */\nexport function createHashlineCodingTools(cwd: string, options?: ToolsOptions): Tool[] {\n\treturn [\n\t\tcreateHashlineReadTool(cwd, options?.read),\n\t\tcreateBashTool(cwd, options?.bash),\n\t\tcreateHashlineEditTool(cwd),\n\t\tcreateWriteTool(cwd),\n\t];\n}\n"]}
@@ -44,7 +44,16 @@ export interface PtyToolDetails {
44
44
  view?: "viewport" | "buffer";
45
45
  screenText?: string;
46
46
  }
47
- export declare function createPtyTools(cwd: string): Record<string, AgentTool<any, PtyToolDetails>>;
47
+ export interface PtyToolsResult {
48
+ pty_start: AgentTool<any, PtyToolDetails>;
49
+ pty_send: AgentTool<any, PtyToolDetails>;
50
+ pty_read: AgentTool<any, PtyToolDetails>;
51
+ pty_wait: AgentTool<any, PtyToolDetails>;
52
+ pty_resize: AgentTool<any, PtyToolDetails>;
53
+ pty_kill: AgentTool<any, PtyToolDetails>;
54
+ writeToSession: (sessionId: string, input: string) => void;
55
+ }
56
+ export declare function createPtyTools(cwd: string): PtyToolsResult;
48
57
  export declare const ptyToolNames: readonly ["pty_start", "pty_send", "pty_read", "pty_wait", "pty_resize", "pty_kill"];
49
58
  export {};
50
59
  //# sourceMappingURL=pty.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pty.d.ts","sourceRoot":"","sources":["../../../src/core/tools/pty.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,mBAAmB,CAAC;AAStD,QAAA,MAAM,cAAc;;;;;EAKlB,CAAC;AAEH,QAAA,MAAM,aAAa;;;EAGjB,CAAC;AAEH,QAAA,MAAM,aAAa;;;EAMjB,CAAC;AAEH,QAAA,MAAM,aAAa;;;;;;EASjB,CAAC;AAEH,QAAA,MAAM,eAAe;;;;EAInB,CAAC;AAEH,QAAA,MAAM,aAAa;;EAEjB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;AAC1D,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC;AACxD,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC;AACxD,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC;AACxD,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAC5D,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC;AAexD,MAAM,WAAW,cAAc;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AA2KD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAoG1F;AAED,eAAO,MAAM,YAAY,sFAAuF,CAAC"}
1
+ {"version":3,"file":"pty.d.ts","sourceRoot":"","sources":["../../../src/core/tools/pty.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,mBAAmB,CAAC;AAStD,QAAA,MAAM,cAAc;;;;;EAKlB,CAAC;AAEH,QAAA,MAAM,aAAa;;;EAGjB,CAAC;AAEH,QAAA,MAAM,aAAa;;;EAMjB,CAAC;AAEH,QAAA,MAAM,aAAa;;;;;;EASjB,CAAC;AAEH,QAAA,MAAM,eAAe;;;;EAInB,CAAC;AAEH,QAAA,MAAM,aAAa;;EAEjB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;AAC1D,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC;AACxD,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC;AACxD,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC;AACxD,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAC5D,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC;AAexD,MAAM,WAAW,cAAc;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AA+LD,MAAM,WAAW,cAAc;IAC9B,SAAS,EAAE,SAAS,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC1C,QAAQ,EAAE,SAAS,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACzC,QAAQ,EAAE,SAAS,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACzC,QAAQ,EAAE,SAAS,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACzC,UAAU,EAAE,SAAS,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC3C,QAAQ,EAAE,SAAS,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACzC,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3D;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CA6G1D;AAED,eAAO,MAAM,YAAY,sFAAuF,CAAC"}
@@ -147,11 +147,26 @@ class PtySessionManager {
147
147
  const timeoutMs = Math.max(50, options?.timeoutMs ?? 30000);
148
148
  const stableMs = Math.max(50, options?.stableMs ?? 800);
149
149
  const view = options?.view ?? "viewport";
150
+ const signal = options?.signal;
151
+ const onUpdate = options?.onUpdate;
150
152
  const start = Date.now();
151
153
  let lastSnapshot = "";
152
154
  let stableSince = Date.now();
155
+ let lastUpdateText = "";
153
156
  while (Date.now() - start < timeoutMs) {
157
+ if (signal?.aborted) {
158
+ throw new Error(`pty_wait cancelled`);
159
+ }
154
160
  const { text } = await this.read(sessionId, view);
161
+ // Push live screen text updates to UI
162
+ if (onUpdate && text !== lastUpdateText) {
163
+ lastUpdateText = text;
164
+ const session = this.get(sessionId);
165
+ onUpdate({
166
+ content: [{ type: "text", text: buildReadText(session, view, text) }],
167
+ details: { sessionId, pid: session.pty.handle.pid, completed: session.completed, cancelled: session.cancelled, exitCode: session.exitCode, view, screenText: text },
168
+ });
169
+ }
155
170
  if (options?.text) {
156
171
  if (text.includes(options.text)) {
157
172
  return { session: this.get(sessionId), text };
@@ -169,7 +184,10 @@ class PtySessionManager {
169
184
  return { session: this.get(sessionId), text };
170
185
  }
171
186
  }
172
- await new Promise((resolve) => setTimeout(resolve, 100));
187
+ await new Promise((resolve) => {
188
+ const t = setTimeout(resolve, 100);
189
+ signal?.addEventListener("abort", () => { clearTimeout(t); resolve(); }, { once: true });
190
+ });
173
191
  }
174
192
  await this.read(sessionId, view);
175
193
  throw new Error(options?.text
@@ -240,9 +258,9 @@ export function createPtyTools(cwd) {
240
258
  label: "pty_wait",
241
259
  description: "Wait until text appears in a PTY session or until the PTY screen stops changing. Useful between pty_send calls.",
242
260
  parameters: ptyWaitSchema,
243
- execute: async (_toolCallId, { sessionId, text, view, timeoutMs, stableMs }) => {
261
+ execute: async (_toolCallId, { sessionId, text, view, timeoutMs, stableMs }, signal, onUpdate) => {
244
262
  const effectiveView = view ?? "viewport";
245
- const result = await manager.wait(sessionId, { text, view: effectiveView, timeoutMs, stableMs });
263
+ const result = await manager.wait(sessionId, { text, view: effectiveView, timeoutMs, stableMs, signal, onUpdate: onUpdate });
246
264
  return {
247
265
  content: [{ type: "text", text: buildReadText(result.session, effectiveView, result.text) }],
248
266
  details: { sessionId, pid: result.session.pty.handle.pid, completed: result.session.completed, cancelled: result.session.cancelled, exitCode: result.session.exitCode, view: effectiveView, screenText: result.text },
@@ -276,6 +294,13 @@ export function createPtyTools(cwd) {
276
294
  };
277
295
  },
278
296
  };
297
+ /** Write raw input to an active PTY session by ID. Used by the UI when the user focuses and types into an agent PTY terminal. */
298
+ function writeToSession(sessionId, input) {
299
+ const session = manager.sessions.get(sessionId);
300
+ if (session && !session.completed && session.pty.handle.isActive()) {
301
+ session.pty.handle.write(input);
302
+ }
303
+ }
279
304
  return {
280
305
  pty_start: ptyStartTool,
281
306
  pty_send: ptySendTool,
@@ -283,6 +308,7 @@ export function createPtyTools(cwd) {
283
308
  pty_wait: ptyWaitTool,
284
309
  pty_resize: ptyResizeTool,
285
310
  pty_kill: ptyKillTool,
311
+ writeToSession,
286
312
  };
287
313
  }
288
314
  export const ptyToolNames = ["pty_start", "pty_send", "pty_read", "pty_wait", "pty_resize", "pty_kill"];
@@ -1 +1 @@
1
- {"version":3,"file":"pty.js","sourceRoot":"","sources":["../../../src/core/tools/pty.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type { AgentTool } from \"@gsd/pi-agent-core\";\nimport { type Static, Type } from \"@sinclair/typebox\";\nimport { executeBashInPty, type PtyExecutionSession } from \"../pty-executor.js\";\nimport {\n\tcreateHeadlessTerminal,\n\tsnapshotTerminalBufferText,\n\tsnapshotTerminalViewportText,\n\ttype HeadlessTerminal,\n} from \"../../utils/terminal-screen.js\";\n\nconst ptyStartSchema = Type.Object({\n\tcommand: Type.String({ description: \"Shell command to start inside the PTY\" }),\n\tcols: Type.Optional(Type.Number({ description: \"Terminal width in columns (default 80)\" })),\n\trows: Type.Optional(Type.Number({ description: \"Terminal height in rows (default 24)\" })),\n\tloginShell: Type.Optional(Type.Boolean({ description: \"Whether to run the command in a login shell\" })),\n});\n\nconst ptySendSchema = Type.Object({\n\tsessionId: Type.String({ description: \"PTY session id from pty_start\" }),\n\tinput: Type.String({ description: \"Text or control sequence to send, e.g. \\\"y\\\\r\\\" or \\\"\\\\u001b[A\\\"\" }),\n});\n\nconst ptyReadSchema = Type.Object({\n\tsessionId: Type.String({ description: \"PTY session id from pty_start\" }),\n\tview: Type.Optional(Type.Union([\n\t\tType.Literal(\"viewport\"),\n\t\tType.Literal(\"buffer\"),\n\t], { description: \"Read the visible screen (viewport) or the full logical buffer\" })),\n});\n\nconst ptyWaitSchema = Type.Object({\n\tsessionId: Type.String({ description: \"PTY session id from pty_start\" }),\n\ttext: Type.Optional(Type.String({ description: \"Wait until the viewport or buffer contains this text\" })),\n\tview: Type.Optional(Type.Union([\n\t\tType.Literal(\"viewport\"),\n\t\tType.Literal(\"buffer\"),\n\t], { description: \"Where to search for the text (default viewport)\" })),\n\ttimeoutMs: Type.Optional(Type.Number({ description: \"How long to wait before timing out (default 30000)\" })),\n\tstableMs: Type.Optional(Type.Number({ description: \"If text is omitted, wait until the screen stops changing for this long (default 800)\" })),\n});\n\nconst ptyResizeSchema = Type.Object({\n\tsessionId: Type.String({ description: \"PTY session id from pty_start\" }),\n\tcols: Type.Number({ description: \"Terminal width in columns\" }),\n\trows: Type.Number({ description: \"Terminal height in rows\" }),\n});\n\nconst ptyKillSchema = Type.Object({\n\tsessionId: Type.String({ description: \"PTY session id from pty_start\" }),\n});\n\nexport type PtyStartInput = Static<typeof ptyStartSchema>;\nexport type PtySendInput = Static<typeof ptySendSchema>;\nexport type PtyReadInput = Static<typeof ptyReadSchema>;\nexport type PtyWaitInput = Static<typeof ptyWaitSchema>;\nexport type PtyResizeInput = Static<typeof ptyResizeSchema>;\nexport type PtyKillInput = Static<typeof ptyKillSchema>;\n\ninterface ManagedPtySession {\n\tid: string;\n\tcommand: string;\n\tpty: PtyExecutionSession;\n\tterminal: HeadlessTerminal;\n\twriteChain: Promise<void>;\n\tcompleted: boolean;\n\tcancelled: boolean;\n\texitCode?: number;\n\tcreatedAt: number;\n\tlastUpdateAt: number;\n}\n\nexport interface PtyToolDetails {\n\tsessionId: string;\n\tpid?: number;\n\tcompleted?: boolean;\n\tcancelled?: boolean;\n\texitCode?: number;\n\tview?: \"viewport\" | \"buffer\";\n\tscreenText?: string;\n}\n\nclass PtySessionManager {\n\tprivate sessions = new Map<string, ManagedPtySession>();\n\n\tconstructor(private cwd: string) {}\n\n\tasync start(command: string, options?: { cols?: number; rows?: number; loginShell?: boolean }): Promise<ManagedPtySession> {\n\t\tconst id = `pty_${randomUUID().slice(0, 8)}`;\n\t\tconst terminal = createHeadlessTerminal(options?.cols ?? 80, options?.rows ?? 24, 10000);\n\t\tconst session: ManagedPtySession = {\n\t\t\tid,\n\t\t\tcommand,\n\t\t\tpty: undefined as unknown as PtyExecutionSession,\n\t\t\tterminal,\n\t\t\twriteChain: Promise.resolve(),\n\t\t\tcompleted: false,\n\t\t\tcancelled: false,\n\t\t\tcreatedAt: Date.now(),\n\t\t\tlastUpdateAt: Date.now(),\n\t\t};\n\t\tthis.sessions.set(id, session);\n\n\t\tlet pty: PtyExecutionSession;\n\t\ttry {\n\t\t\tpty = await executeBashInPty(command, {\n\t\t\t\tcols: options?.cols,\n\t\t\t\trows: options?.rows,\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tloginShell: options?.loginShell,\n\t\t\t\tonChunk: (chunk) => {\n\t\t\t\t\tconst current = this.sessions.get(id);\n\t\t\t\t\tif (!current) return;\n\t\t\t\t\tcurrent.lastUpdateAt = Date.now();\n\t\t\t\t\tcurrent.writeChain = current.writeChain.then(\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\tnew Promise<void>((resolve) => {\n\t\t\t\t\t\t\t\tcurrent.terminal.write(chunk, () => resolve());\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis.sessions.delete(id);\n\t\t\tthrow error;\n\t\t}\n\t\tsession.pty = pty;\n\n\t\tpty.result\n\t\t\t.then((result) => {\n\t\t\t\tconst current = this.sessions.get(id);\n\t\t\t\tif (!current) return;\n\t\t\t\tcurrent.completed = true;\n\t\t\t\tcurrent.cancelled = result.cancelled;\n\t\t\t\tcurrent.exitCode = result.exitCode;\n\t\t\t\tcurrent.lastUpdateAt = Date.now();\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tconst current = this.sessions.get(id);\n\t\t\t\tif (!current) return;\n\t\t\t\tcurrent.completed = true;\n\t\t\t\tcurrent.lastUpdateAt = Date.now();\n\t\t\t});\n\n\t\treturn session;\n\t}\n\n\tget(sessionId: string): ManagedPtySession {\n\t\tconst session = this.sessions.get(sessionId);\n\t\tif (!session) {\n\t\t\tthrow new Error(`PTY session not found: ${sessionId}`);\n\t\t}\n\t\treturn session;\n\t}\n\n\tasync send(sessionId: string, input: string): Promise<ManagedPtySession> {\n\t\tconst session = this.get(sessionId);\n\t\tif (session.completed || !session.pty.handle.isActive()) {\n\t\t\tthrow new Error(`PTY session is no longer active: ${sessionId}`);\n\t\t}\n\t\tsession.pty.handle.write(input);\n\t\tsession.lastUpdateAt = Date.now();\n\t\tawait new Promise((resolve) => setTimeout(resolve, 50));\n\t\treturn session;\n\t}\n\n\tasync resize(sessionId: string, cols: number, rows: number): Promise<ManagedPtySession> {\n\t\tconst session = this.get(sessionId);\n\t\tconst safeCols = Math.max(20, cols);\n\t\tconst safeRows = Math.max(5, rows);\n\t\tsession.pty.handle.resize(safeCols, safeRows);\n\t\tsession.terminal.resize(safeCols, safeRows);\n\t\tsession.lastUpdateAt = Date.now();\n\t\treturn session;\n\t}\n\n\tasync kill(sessionId: string): Promise<ManagedPtySession> {\n\t\tconst session = this.get(sessionId);\n\t\tif (session.pty.handle.isActive()) {\n\t\t\tsession.pty.handle.kill();\n\t\t}\n\t\tsession.cancelled = true;\n\t\tsession.completed = true;\n\t\tsession.lastUpdateAt = Date.now();\n\t\treturn session;\n\t}\n\n\tasync read(sessionId: string, view: \"viewport\" | \"buffer\" = \"viewport\"): Promise<{ session: ManagedPtySession; text: string }> {\n\t\tconst session = this.get(sessionId);\n\t\tawait session.writeChain;\n\t\tconst text = view === \"buffer\"\n\t\t\t? snapshotTerminalBufferText(session.terminal)\n\t\t\t: snapshotTerminalViewportText(session.terminal);\n\t\treturn { session, text };\n\t}\n\n\tasync wait(\n\t\tsessionId: string,\n\t\toptions?: { text?: string; view?: \"viewport\" | \"buffer\"; timeoutMs?: number; stableMs?: number },\n\t): Promise<{ session: ManagedPtySession; text: string }> {\n\t\tconst timeoutMs = Math.max(50, options?.timeoutMs ?? 30000);\n\t\tconst stableMs = Math.max(50, options?.stableMs ?? 800);\n\t\tconst view = options?.view ?? \"viewport\";\n\t\tconst start = Date.now();\n\t\tlet lastSnapshot = \"\";\n\t\tlet stableSince = Date.now();\n\n\t\twhile (Date.now() - start < timeoutMs) {\n\t\t\tconst { text } = await this.read(sessionId, view);\n\t\t\tif (options?.text) {\n\t\t\t\tif (text.includes(options.text)) {\n\t\t\t\t\treturn { session: this.get(sessionId), text };\n\t\t\t\t}\n\t\t\t\tif (this.get(sessionId).completed) {\n\t\t\t\t\treturn { session: this.get(sessionId), text };\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (text !== lastSnapshot) {\n\t\t\t\t\tlastSnapshot = text;\n\t\t\t\t\tstableSince = Date.now();\n\t\t\t\t} else if (Date.now() - stableSince >= stableMs || this.get(sessionId).completed) {\n\t\t\t\t\treturn { session: this.get(sessionId), text };\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 100));\n\t\t}\n\n\t\tawait this.read(sessionId, view);\n\t\tthrow new Error(\n\t\t\toptions?.text\n\t\t\t\t? `Timed out waiting for text in PTY session ${sessionId}: ${options.text}`\n\t\t\t\t: `Timed out waiting for PTY session ${sessionId} to stabilize`,\n\t\t);\n\t}\n}\n\nfunction formatSessionSummary(session: ManagedPtySession): string {\n\tconst bits = [`session ${session.id}`, `pid ${session.pty.handle.pid}`];\n\tif (session.completed) {\n\t\tbits.push(session.cancelled ? \"cancelled\" : `completed${session.exitCode !== undefined ? ` exit ${session.exitCode}` : \"\"}`);\n\t} else {\n\t\tbits.push(\"running\");\n\t}\n\treturn bits.join(\" · \");\n}\n\nfunction buildReadText(session: ManagedPtySession, view: \"viewport\" | \"buffer\", text: string): string {\n\tconst header = `[${formatSessionSummary(session)} · ${view}]`;\n\treturn text ? `${header}\\n${text}` : `${header}\\n(no visible text)`;\n}\n\nexport function createPtyTools(cwd: string): Record<string, AgentTool<any, PtyToolDetails>> {\n\tconst manager = new PtySessionManager(cwd);\n\n\tconst ptyStartTool: AgentTool<typeof ptyStartSchema, PtyToolDetails> = {\n\t\tname: \"pty_start\",\n\t\tlabel: \"pty_start\",\n\t\tdescription: \"Start an agent-controlled interactive PTY session. Use this when a command requires terminal interaction, prompts, or a full-screen TUI. Returns a sessionId for follow-up pty_send/pty_read/pty_wait/pty_kill calls.\",\n\t\tparameters: ptyStartSchema,\n\t\texecute: async (_toolCallId, { command, cols, rows, loginShell }) => {\n\t\t\tconst session = await manager.start(command, { cols, rows, loginShell });\n\t\t\tconst { text } = await manager.read(session.id, \"viewport\");\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `Started PTY session ${session.id} for: ${command}\\n${buildReadText(session, \"viewport\", text)}` }],\n\t\t\t\tdetails: { sessionId: session.id, pid: session.pty.handle.pid, completed: session.completed, cancelled: session.cancelled, exitCode: session.exitCode, view: \"viewport\", screenText: text },\n\t\t\t};\n\t\t},\n\t};\n\n\tconst ptySendTool: AgentTool<typeof ptySendSchema, PtyToolDetails> = {\n\t\tname: \"pty_send\",\n\t\tlabel: \"pty_send\",\n\t\tdescription: \"Send text or control sequences to an existing PTY session, e.g. \\\"y\\\\r\\\" or \\\"\\\\u001b[A\\\".\",\n\t\tparameters: ptySendSchema,\n\t\texecute: async (_toolCallId, { sessionId, input }) => {\n\t\t\tconst session = await manager.send(sessionId, input);\n\t\t\tconst { text } = await manager.read(sessionId, \"viewport\");\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `Sent input to ${sessionId}: ${JSON.stringify(input)}\\n${buildReadText(session, \"viewport\", text)}` }],\n\t\t\t\tdetails: { sessionId, pid: session.pty.handle.pid, completed: session.completed, cancelled: session.cancelled, exitCode: session.exitCode, view: \"viewport\", screenText: text },\n\t\t\t};\n\t\t},\n\t};\n\n\tconst ptyReadTool: AgentTool<typeof ptyReadSchema, PtyToolDetails> = {\n\t\tname: \"pty_read\",\n\t\tlabel: \"pty_read\",\n\t\tdescription: \"Read the current PTY screen state. Use view='viewport' for the visible screen or view='buffer' for the full logical buffer.\",\n\t\tparameters: ptyReadSchema,\n\t\texecute: async (_toolCallId, { sessionId, view }) => {\n\t\t\tconst effectiveView = view ?? \"viewport\";\n\t\t\tconst { session, text } = await manager.read(sessionId, effectiveView);\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: buildReadText(session, effectiveView, text) }],\n\t\t\t\tdetails: { sessionId, pid: session.pty.handle.pid, completed: session.completed, cancelled: session.cancelled, exitCode: session.exitCode, view: effectiveView, screenText: text },\n\t\t\t};\n\t\t},\n\t};\n\n\tconst ptyWaitTool: AgentTool<typeof ptyWaitSchema, PtyToolDetails> = {\n\t\tname: \"pty_wait\",\n\t\tlabel: \"pty_wait\",\n\t\tdescription: \"Wait until text appears in a PTY session or until the PTY screen stops changing. Useful between pty_send calls.\",\n\t\tparameters: ptyWaitSchema,\n\t\texecute: async (_toolCallId, { sessionId, text, view, timeoutMs, stableMs }) => {\n\t\t\tconst effectiveView = view ?? \"viewport\";\n\t\t\tconst result = await manager.wait(sessionId, { text, view: effectiveView, timeoutMs, stableMs });\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: buildReadText(result.session, effectiveView, result.text) }],\n\t\t\t\tdetails: { sessionId, pid: result.session.pty.handle.pid, completed: result.session.completed, cancelled: result.session.cancelled, exitCode: result.session.exitCode, view: effectiveView, screenText: result.text },\n\t\t\t};\n\t\t},\n\t};\n\n\tconst ptyResizeTool: AgentTool<typeof ptyResizeSchema, PtyToolDetails> = {\n\t\tname: \"pty_resize\",\n\t\tlabel: \"pty_resize\",\n\t\tdescription: \"Resize an active PTY session to the given terminal dimensions.\",\n\t\tparameters: ptyResizeSchema,\n\t\texecute: async (_toolCallId, { sessionId, cols, rows }) => {\n\t\t\tconst session = await manager.resize(sessionId, cols, rows);\n\t\t\tconst { text } = await manager.read(sessionId, \"viewport\");\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `Resized ${sessionId} to ${cols}x${rows}\\n${buildReadText(session, \"viewport\", text)}` }],\n\t\t\t\tdetails: { sessionId, pid: session.pty.handle.pid, completed: session.completed, cancelled: session.cancelled, exitCode: session.exitCode, view: \"viewport\", screenText: text },\n\t\t\t};\n\t\t},\n\t};\n\n\tconst ptyKillTool: AgentTool<typeof ptyKillSchema, PtyToolDetails> = {\n\t\tname: \"pty_kill\",\n\t\tlabel: \"pty_kill\",\n\t\tdescription: \"Terminate an agent-controlled PTY session.\",\n\t\tparameters: ptyKillSchema,\n\t\texecute: async (_toolCallId, { sessionId }) => {\n\t\t\tconst session = await manager.kill(sessionId);\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `Terminated PTY session ${sessionId}. ${formatSessionSummary(session)}` }],\n\t\t\t\tdetails: { sessionId, pid: session.pty.handle.pid, completed: session.completed, cancelled: session.cancelled, exitCode: session.exitCode },\n\t\t\t};\n\t\t},\n\t};\n\n\treturn {\n\t\tpty_start: ptyStartTool,\n\t\tpty_send: ptySendTool,\n\t\tpty_read: ptyReadTool,\n\t\tpty_wait: ptyWaitTool,\n\t\tpty_resize: ptyResizeTool,\n\t\tpty_kill: ptyKillTool,\n\t};\n}\n\nexport const ptyToolNames = [\"pty_start\", \"pty_send\", \"pty_read\", \"pty_wait\", \"pty_resize\", \"pty_kill\"] as const;\n"]}
1
+ {"version":3,"file":"pty.js","sourceRoot":"","sources":["../../../src/core/tools/pty.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type { AgentTool } from \"@gsd/pi-agent-core\";\nimport { type Static, Type } from \"@sinclair/typebox\";\nimport { executeBashInPty, type PtyExecutionSession } from \"../pty-executor.js\";\nimport {\n\tcreateHeadlessTerminal,\n\tsnapshotTerminalBufferText,\n\tsnapshotTerminalViewportText,\n\ttype HeadlessTerminal,\n} from \"../../utils/terminal-screen.js\";\n\nconst ptyStartSchema = Type.Object({\n\tcommand: Type.String({ description: \"Shell command to start inside the PTY\" }),\n\tcols: Type.Optional(Type.Number({ description: \"Terminal width in columns (default 80)\" })),\n\trows: Type.Optional(Type.Number({ description: \"Terminal height in rows (default 24)\" })),\n\tloginShell: Type.Optional(Type.Boolean({ description: \"Whether to run the command in a login shell\" })),\n});\n\nconst ptySendSchema = Type.Object({\n\tsessionId: Type.String({ description: \"PTY session id from pty_start\" }),\n\tinput: Type.String({ description: \"Text or control sequence to send, e.g. \\\"y\\\\r\\\" or \\\"\\\\u001b[A\\\"\" }),\n});\n\nconst ptyReadSchema = Type.Object({\n\tsessionId: Type.String({ description: \"PTY session id from pty_start\" }),\n\tview: Type.Optional(Type.Union([\n\t\tType.Literal(\"viewport\"),\n\t\tType.Literal(\"buffer\"),\n\t], { description: \"Read the visible screen (viewport) or the full logical buffer\" })),\n});\n\nconst ptyWaitSchema = Type.Object({\n\tsessionId: Type.String({ description: \"PTY session id from pty_start\" }),\n\ttext: Type.Optional(Type.String({ description: \"Wait until the viewport or buffer contains this text\" })),\n\tview: Type.Optional(Type.Union([\n\t\tType.Literal(\"viewport\"),\n\t\tType.Literal(\"buffer\"),\n\t], { description: \"Where to search for the text (default viewport)\" })),\n\ttimeoutMs: Type.Optional(Type.Number({ description: \"How long to wait before timing out (default 30000)\" })),\n\tstableMs: Type.Optional(Type.Number({ description: \"If text is omitted, wait until the screen stops changing for this long (default 800)\" })),\n});\n\nconst ptyResizeSchema = Type.Object({\n\tsessionId: Type.String({ description: \"PTY session id from pty_start\" }),\n\tcols: Type.Number({ description: \"Terminal width in columns\" }),\n\trows: Type.Number({ description: \"Terminal height in rows\" }),\n});\n\nconst ptyKillSchema = Type.Object({\n\tsessionId: Type.String({ description: \"PTY session id from pty_start\" }),\n});\n\nexport type PtyStartInput = Static<typeof ptyStartSchema>;\nexport type PtySendInput = Static<typeof ptySendSchema>;\nexport type PtyReadInput = Static<typeof ptyReadSchema>;\nexport type PtyWaitInput = Static<typeof ptyWaitSchema>;\nexport type PtyResizeInput = Static<typeof ptyResizeSchema>;\nexport type PtyKillInput = Static<typeof ptyKillSchema>;\n\ninterface ManagedPtySession {\n\tid: string;\n\tcommand: string;\n\tpty: PtyExecutionSession;\n\tterminal: HeadlessTerminal;\n\twriteChain: Promise<void>;\n\tcompleted: boolean;\n\tcancelled: boolean;\n\texitCode?: number;\n\tcreatedAt: number;\n\tlastUpdateAt: number;\n}\n\nexport interface PtyToolDetails {\n\tsessionId: string;\n\tpid?: number;\n\tcompleted?: boolean;\n\tcancelled?: boolean;\n\texitCode?: number;\n\tview?: \"viewport\" | \"buffer\";\n\tscreenText?: string;\n}\n\nclass PtySessionManager {\n\treadonly sessions = new Map<string, ManagedPtySession>();\n\n\tconstructor(private cwd: string) {}\n\n\tasync start(command: string, options?: { cols?: number; rows?: number; loginShell?: boolean }): Promise<ManagedPtySession> {\n\t\tconst id = `pty_${randomUUID().slice(0, 8)}`;\n\t\tconst terminal = createHeadlessTerminal(options?.cols ?? 80, options?.rows ?? 24, 10000);\n\t\tconst session: ManagedPtySession = {\n\t\t\tid,\n\t\t\tcommand,\n\t\t\tpty: undefined as unknown as PtyExecutionSession,\n\t\t\tterminal,\n\t\t\twriteChain: Promise.resolve(),\n\t\t\tcompleted: false,\n\t\t\tcancelled: false,\n\t\t\tcreatedAt: Date.now(),\n\t\t\tlastUpdateAt: Date.now(),\n\t\t};\n\t\tthis.sessions.set(id, session);\n\n\t\tlet pty: PtyExecutionSession;\n\t\ttry {\n\t\t\tpty = await executeBashInPty(command, {\n\t\t\t\tcols: options?.cols,\n\t\t\t\trows: options?.rows,\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tloginShell: options?.loginShell,\n\t\t\t\tonChunk: (chunk) => {\n\t\t\t\t\tconst current = this.sessions.get(id);\n\t\t\t\t\tif (!current) return;\n\t\t\t\t\tcurrent.lastUpdateAt = Date.now();\n\t\t\t\t\tcurrent.writeChain = current.writeChain.then(\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\tnew Promise<void>((resolve) => {\n\t\t\t\t\t\t\t\tcurrent.terminal.write(chunk, () => resolve());\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis.sessions.delete(id);\n\t\t\tthrow error;\n\t\t}\n\t\tsession.pty = pty;\n\n\t\tpty.result\n\t\t\t.then((result) => {\n\t\t\t\tconst current = this.sessions.get(id);\n\t\t\t\tif (!current) return;\n\t\t\t\tcurrent.completed = true;\n\t\t\t\tcurrent.cancelled = result.cancelled;\n\t\t\t\tcurrent.exitCode = result.exitCode;\n\t\t\t\tcurrent.lastUpdateAt = Date.now();\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tconst current = this.sessions.get(id);\n\t\t\t\tif (!current) return;\n\t\t\t\tcurrent.completed = true;\n\t\t\t\tcurrent.lastUpdateAt = Date.now();\n\t\t\t});\n\n\t\treturn session;\n\t}\n\n\tget(sessionId: string): ManagedPtySession {\n\t\tconst session = this.sessions.get(sessionId);\n\t\tif (!session) {\n\t\t\tthrow new Error(`PTY session not found: ${sessionId}`);\n\t\t}\n\t\treturn session;\n\t}\n\n\tasync send(sessionId: string, input: string): Promise<ManagedPtySession> {\n\t\tconst session = this.get(sessionId);\n\t\tif (session.completed || !session.pty.handle.isActive()) {\n\t\t\tthrow new Error(`PTY session is no longer active: ${sessionId}`);\n\t\t}\n\t\tsession.pty.handle.write(input);\n\t\tsession.lastUpdateAt = Date.now();\n\t\tawait new Promise((resolve) => setTimeout(resolve, 50));\n\t\treturn session;\n\t}\n\n\tasync resize(sessionId: string, cols: number, rows: number): Promise<ManagedPtySession> {\n\t\tconst session = this.get(sessionId);\n\t\tconst safeCols = Math.max(20, cols);\n\t\tconst safeRows = Math.max(5, rows);\n\t\tsession.pty.handle.resize(safeCols, safeRows);\n\t\tsession.terminal.resize(safeCols, safeRows);\n\t\tsession.lastUpdateAt = Date.now();\n\t\treturn session;\n\t}\n\n\tasync kill(sessionId: string): Promise<ManagedPtySession> {\n\t\tconst session = this.get(sessionId);\n\t\tif (session.pty.handle.isActive()) {\n\t\t\tsession.pty.handle.kill();\n\t\t}\n\t\tsession.cancelled = true;\n\t\tsession.completed = true;\n\t\tsession.lastUpdateAt = Date.now();\n\t\treturn session;\n\t}\n\n\tasync read(sessionId: string, view: \"viewport\" | \"buffer\" = \"viewport\"): Promise<{ session: ManagedPtySession; text: string }> {\n\t\tconst session = this.get(sessionId);\n\t\tawait session.writeChain;\n\t\tconst text = view === \"buffer\"\n\t\t\t? snapshotTerminalBufferText(session.terminal)\n\t\t\t: snapshotTerminalViewportText(session.terminal);\n\t\treturn { session, text };\n\t}\n\n\tasync wait(\n\t\tsessionId: string,\n\t\toptions?: { text?: string; view?: \"viewport\" | \"buffer\"; timeoutMs?: number; stableMs?: number; signal?: AbortSignal; onUpdate?: (result: { content: Array<{ type: string; text: string }>; details: any }) => void },\n\t): Promise<{ session: ManagedPtySession; text: string }> {\n\t\tconst timeoutMs = Math.max(50, options?.timeoutMs ?? 30000);\n\t\tconst stableMs = Math.max(50, options?.stableMs ?? 800);\n\t\tconst view = options?.view ?? \"viewport\";\n\t\tconst signal = options?.signal;\n\t\tconst onUpdate = options?.onUpdate;\n\t\tconst start = Date.now();\n\t\tlet lastSnapshot = \"\";\n\t\tlet stableSince = Date.now();\n\t\tlet lastUpdateText = \"\";\n\n\t\twhile (Date.now() - start < timeoutMs) {\n\t\t\tif (signal?.aborted) {\n\t\t\t\tthrow new Error(`pty_wait cancelled`);\n\t\t\t}\n\t\t\tconst { text } = await this.read(sessionId, view);\n\n\t\t\t// Push live screen text updates to UI\n\t\t\tif (onUpdate && text !== lastUpdateText) {\n\t\t\t\tlastUpdateText = text;\n\t\t\t\tconst session = this.get(sessionId);\n\t\t\t\tonUpdate({\n\t\t\t\t\tcontent: [{ type: \"text\", text: buildReadText(session, view, text) }],\n\t\t\t\t\tdetails: { sessionId, pid: session.pty.handle.pid, completed: session.completed, cancelled: session.cancelled, exitCode: session.exitCode, view, screenText: text },\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (options?.text) {\n\t\t\t\tif (text.includes(options.text)) {\n\t\t\t\t\treturn { session: this.get(sessionId), text };\n\t\t\t\t}\n\t\t\t\tif (this.get(sessionId).completed) {\n\t\t\t\t\treturn { session: this.get(sessionId), text };\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (text !== lastSnapshot) {\n\t\t\t\t\tlastSnapshot = text;\n\t\t\t\t\tstableSince = Date.now();\n\t\t\t\t} else if (Date.now() - stableSince >= stableMs || this.get(sessionId).completed) {\n\t\t\t\t\treturn { session: this.get(sessionId), text };\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tconst t = setTimeout(resolve, 100);\n\t\t\t\tsignal?.addEventListener(\"abort\", () => { clearTimeout(t); resolve(); }, { once: true });\n\t\t\t});\n\t\t}\n\n\t\tawait this.read(sessionId, view);\n\t\tthrow new Error(\n\t\t\toptions?.text\n\t\t\t\t? `Timed out waiting for text in PTY session ${sessionId}: ${options.text}`\n\t\t\t\t: `Timed out waiting for PTY session ${sessionId} to stabilize`,\n\t\t);\n\t}\n}\n\nfunction formatSessionSummary(session: ManagedPtySession): string {\n\tconst bits = [`session ${session.id}`, `pid ${session.pty.handle.pid}`];\n\tif (session.completed) {\n\t\tbits.push(session.cancelled ? \"cancelled\" : `completed${session.exitCode !== undefined ? ` exit ${session.exitCode}` : \"\"}`);\n\t} else {\n\t\tbits.push(\"running\");\n\t}\n\treturn bits.join(\" · \");\n}\n\nfunction buildReadText(session: ManagedPtySession, view: \"viewport\" | \"buffer\", text: string): string {\n\tconst header = `[${formatSessionSummary(session)} · ${view}]`;\n\treturn text ? `${header}\\n${text}` : `${header}\\n(no visible text)`;\n}\n\nexport interface PtyToolsResult {\n\tpty_start: AgentTool<any, PtyToolDetails>;\n\tpty_send: AgentTool<any, PtyToolDetails>;\n\tpty_read: AgentTool<any, PtyToolDetails>;\n\tpty_wait: AgentTool<any, PtyToolDetails>;\n\tpty_resize: AgentTool<any, PtyToolDetails>;\n\tpty_kill: AgentTool<any, PtyToolDetails>;\n\twriteToSession: (sessionId: string, input: string) => void;\n}\n\nexport function createPtyTools(cwd: string): PtyToolsResult {\n\tconst manager = new PtySessionManager(cwd);\n\n\tconst ptyStartTool: AgentTool<typeof ptyStartSchema, PtyToolDetails> = {\n\t\tname: \"pty_start\",\n\t\tlabel: \"pty_start\",\n\t\tdescription: \"Start an agent-controlled interactive PTY session. Use this when a command requires terminal interaction, prompts, or a full-screen TUI. Returns a sessionId for follow-up pty_send/pty_read/pty_wait/pty_kill calls.\",\n\t\tparameters: ptyStartSchema,\n\t\texecute: async (_toolCallId, { command, cols, rows, loginShell }) => {\n\t\t\tconst session = await manager.start(command, { cols, rows, loginShell });\n\t\t\tconst { text } = await manager.read(session.id, \"viewport\");\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `Started PTY session ${session.id} for: ${command}\\n${buildReadText(session, \"viewport\", text)}` }],\n\t\t\t\tdetails: { sessionId: session.id, pid: session.pty.handle.pid, completed: session.completed, cancelled: session.cancelled, exitCode: session.exitCode, view: \"viewport\", screenText: text },\n\t\t\t};\n\t\t},\n\t};\n\n\tconst ptySendTool: AgentTool<typeof ptySendSchema, PtyToolDetails> = {\n\t\tname: \"pty_send\",\n\t\tlabel: \"pty_send\",\n\t\tdescription: \"Send text or control sequences to an existing PTY session, e.g. \\\"y\\\\r\\\" or \\\"\\\\u001b[A\\\".\",\n\t\tparameters: ptySendSchema,\n\t\texecute: async (_toolCallId, { sessionId, input }) => {\n\t\t\tconst session = await manager.send(sessionId, input);\n\t\t\tconst { text } = await manager.read(sessionId, \"viewport\");\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `Sent input to ${sessionId}: ${JSON.stringify(input)}\\n${buildReadText(session, \"viewport\", text)}` }],\n\t\t\t\tdetails: { sessionId, pid: session.pty.handle.pid, completed: session.completed, cancelled: session.cancelled, exitCode: session.exitCode, view: \"viewport\", screenText: text },\n\t\t\t};\n\t\t},\n\t};\n\n\tconst ptyReadTool: AgentTool<typeof ptyReadSchema, PtyToolDetails> = {\n\t\tname: \"pty_read\",\n\t\tlabel: \"pty_read\",\n\t\tdescription: \"Read the current PTY screen state. Use view='viewport' for the visible screen or view='buffer' for the full logical buffer.\",\n\t\tparameters: ptyReadSchema,\n\t\texecute: async (_toolCallId, { sessionId, view }) => {\n\t\t\tconst effectiveView = view ?? \"viewport\";\n\t\t\tconst { session, text } = await manager.read(sessionId, effectiveView);\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: buildReadText(session, effectiveView, text) }],\n\t\t\t\tdetails: { sessionId, pid: session.pty.handle.pid, completed: session.completed, cancelled: session.cancelled, exitCode: session.exitCode, view: effectiveView, screenText: text },\n\t\t\t};\n\t\t},\n\t};\n\n\tconst ptyWaitTool: AgentTool<typeof ptyWaitSchema, PtyToolDetails> = {\n\t\tname: \"pty_wait\",\n\t\tlabel: \"pty_wait\",\n\t\tdescription: \"Wait until text appears in a PTY session or until the PTY screen stops changing. Useful between pty_send calls.\",\n\t\tparameters: ptyWaitSchema,\n\t\texecute: async (_toolCallId, { sessionId, text, view, timeoutMs, stableMs }, signal, onUpdate) => {\n\t\t\tconst effectiveView = view ?? \"viewport\";\n\t\t\tconst result = await manager.wait(sessionId, { text, view: effectiveView, timeoutMs, stableMs, signal, onUpdate: onUpdate as ((result: { content: Array<{ type: string; text: string }>; details: any }) => void) | undefined });\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: buildReadText(result.session, effectiveView, result.text) }],\n\t\t\t\tdetails: { sessionId, pid: result.session.pty.handle.pid, completed: result.session.completed, cancelled: result.session.cancelled, exitCode: result.session.exitCode, view: effectiveView, screenText: result.text },\n\t\t\t};\n\t\t},\n\t};\n\n\tconst ptyResizeTool: AgentTool<typeof ptyResizeSchema, PtyToolDetails> = {\n\t\tname: \"pty_resize\",\n\t\tlabel: \"pty_resize\",\n\t\tdescription: \"Resize an active PTY session to the given terminal dimensions.\",\n\t\tparameters: ptyResizeSchema,\n\t\texecute: async (_toolCallId, { sessionId, cols, rows }) => {\n\t\t\tconst session = await manager.resize(sessionId, cols, rows);\n\t\t\tconst { text } = await manager.read(sessionId, \"viewport\");\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `Resized ${sessionId} to ${cols}x${rows}\\n${buildReadText(session, \"viewport\", text)}` }],\n\t\t\t\tdetails: { sessionId, pid: session.pty.handle.pid, completed: session.completed, cancelled: session.cancelled, exitCode: session.exitCode, view: \"viewport\", screenText: text },\n\t\t\t};\n\t\t},\n\t};\n\n\tconst ptyKillTool: AgentTool<typeof ptyKillSchema, PtyToolDetails> = {\n\t\tname: \"pty_kill\",\n\t\tlabel: \"pty_kill\",\n\t\tdescription: \"Terminate an agent-controlled PTY session.\",\n\t\tparameters: ptyKillSchema,\n\t\texecute: async (_toolCallId, { sessionId }) => {\n\t\t\tconst session = await manager.kill(sessionId);\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `Terminated PTY session ${sessionId}. ${formatSessionSummary(session)}` }],\n\t\t\t\tdetails: { sessionId, pid: session.pty.handle.pid, completed: session.completed, cancelled: session.cancelled, exitCode: session.exitCode },\n\t\t\t};\n\t\t},\n\t};\n\n\t/** Write raw input to an active PTY session by ID. Used by the UI when the user focuses and types into an agent PTY terminal. */\n\tfunction writeToSession(sessionId: string, input: string): void {\n\t\tconst session = manager.sessions.get(sessionId);\n\t\tif (session && !session.completed && session.pty.handle.isActive()) {\n\t\t\tsession.pty.handle.write(input);\n\t\t}\n\t}\n\n\treturn {\n\t\tpty_start: ptyStartTool,\n\t\tpty_send: ptySendTool,\n\t\tpty_read: ptyReadTool,\n\t\tpty_wait: ptyWaitTool,\n\t\tpty_resize: ptyResizeTool,\n\t\tpty_kill: ptyKillTool,\n\t\twriteToSession,\n\t};\n}\n\nexport const ptyToolNames = [\"pty_start\", \"pty_send\", \"pty_read\", \"pty_wait\", \"pty_resize\", \"pty_kill\"] as const;\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tool-summary-line.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-summary-line.test.d.ts","sourceRoot":"","sources":["../../../../../src/modes/interactive/components/__tests__/tool-summary-line.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import stripAnsi from "strip-ansi";
4
+ import { ToolSummaryLine } from "../tool-summary-line.js";
5
+ import { initTheme } from "../../theme/theme.js";
6
+ initTheme("dark");
7
+ describe("ToolSummaryLine", () => {
8
+ it("aggregates repeated tools with tool-row style formatting", () => {
9
+ const summary = new ToolSummaryLine();
10
+ summary.addTool("read", 600);
11
+ summary.addTool("lsp", 250);
12
+ summary.addTool("read", 150);
13
+ const rendered = stripAnsi(summary.render(160).join("\n"));
14
+ assert.match(rendered, /^ ● collapsed tools /);
15
+ assert.ok(rendered.includes("read ×2 · lsp · 1.0s"));
16
+ assert.equal(rendered.includes("⎯"), false);
17
+ });
18
+ it("renders nothing when empty or hidden", () => {
19
+ const summary = new ToolSummaryLine();
20
+ assert.deepEqual(summary.render(80), []);
21
+ summary.addTool("grep", 100);
22
+ summary.setHidden(true);
23
+ assert.deepEqual(summary.render(80), []);
24
+ });
25
+ });
26
+ //# sourceMappingURL=tool-summary-line.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-summary-line.test.js","sourceRoot":"","sources":["../../../../../src/modes/interactive/components/__tests__/tool-summary-line.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,SAAS,CAAC,MAAM,CAAC,CAAC;AAElB,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QACnE,MAAM,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;QACtC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC7B,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5B,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAE7B,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;QAC/C,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC/C,MAAM,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;QACtC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAEzC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC7B,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACxB,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import { describe, it } from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport stripAnsi from \"strip-ansi\";\n\nimport { ToolSummaryLine } from \"../tool-summary-line.js\";\nimport { initTheme } from \"../../theme/theme.js\";\n\ninitTheme(\"dark\");\n\ndescribe(\"ToolSummaryLine\", () => {\n\tit(\"aggregates repeated tools with tool-row style formatting\", () => {\n\t\tconst summary = new ToolSummaryLine();\n\t\tsummary.addTool(\"read\", 600);\n\t\tsummary.addTool(\"lsp\", 250);\n\t\tsummary.addTool(\"read\", 150);\n\n\t\tconst rendered = stripAnsi(summary.render(160).join(\"\\n\"));\n\t\tassert.match(rendered, /^ ● collapsed tools /);\n\t\tassert.ok(rendered.includes(\"read ×2 · lsp · 1.0s\"));\n\t\tassert.equal(rendered.includes(\"⎯\"), false);\n\t});\n\n\tit(\"renders nothing when empty or hidden\", () => {\n\t\tconst summary = new ToolSummaryLine();\n\t\tassert.deepEqual(summary.render(80), []);\n\n\t\tsummary.addTool(\"grep\", 100);\n\t\tsummary.setHidden(true);\n\t\tassert.deepEqual(summary.render(80), []);\n\t});\n});\n"]}
@@ -0,0 +1,45 @@
1
+ import type { Message, Model, SimpleStreamOptions } from "@gsd/pi-ai";
2
+ import { streamSimple } from "@gsd/pi-ai";
3
+ import { type MarkdownTheme, type Component, type Focusable, type TUI } from "@gsd/pi-tui";
4
+ export declare class BtwOverlayComponent implements Component, Focusable {
5
+ private _focused;
6
+ private readonly markdownTheme;
7
+ private readonly model;
8
+ private readonly systemPrompt;
9
+ private readonly baseMessages;
10
+ private readonly ui;
11
+ private readonly input;
12
+ private readonly onDismiss;
13
+ private readonly requestRender;
14
+ private readonly streamFn;
15
+ private readonly streamOptions;
16
+ private readonly btwHistory;
17
+ private readonly turns;
18
+ private currentAbortController;
19
+ private disposed;
20
+ private isStreaming;
21
+ private scrollOffset;
22
+ private followTail;
23
+ private lastWidth;
24
+ get focused(): boolean;
25
+ set focused(value: boolean);
26
+ constructor(question: string, model: Model<any>, systemPrompt: string | undefined, messages: Message[], markdownTheme: MarkdownTheme, ui: TUI, onDismiss: () => void, requestRender: () => void, streamer?: typeof streamSimple, streamOptions?: Pick<SimpleStreamOptions, "apiKey" | "sessionId">);
27
+ handleInput(data: string): void;
28
+ invalidate(): void;
29
+ dispose(): void;
30
+ render(width: number): string[];
31
+ private dismiss;
32
+ private submitTurn;
33
+ private finishAssistantTurn;
34
+ private createUserMessage;
35
+ private getTotalHeight;
36
+ private getBodyHeight;
37
+ private scrollBy;
38
+ private getBodyLines;
39
+ private renderTurnContent;
40
+ private renderTopBorder;
41
+ private renderBottomBorder;
42
+ private renderBodyLine;
43
+ private renderFooterLine;
44
+ }
45
+ //# sourceMappingURL=btw-overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"btw-overlay.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/btw-overlay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA6B,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAqB,MAAM,YAAY,CAAC;AACpH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAGH,KAAK,aAAa,EAGlB,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,GAAG,EAEX,MAAM,aAAa,CAAC;AAmDrB,qBAAa,mBAAoB,YAAW,SAAS,EAAE,SAAS;IAC5D,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAY;IACzC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAM;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAa;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAC/C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoD;IAElF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;IAC5C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiB;IACvC,OAAO,CAAC,sBAAsB,CAA8B;IAC5D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,SAAS,CAAK;IAEtB,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAGzB;gBAGG,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,QAAQ,EAAE,OAAO,EAAE,EACnB,aAAa,EAAE,aAAa,EAC5B,EAAE,EAAE,GAAG,EACP,SAAS,EAAE,MAAM,IAAI,EACrB,aAAa,EAAE,MAAM,IAAI,EACzB,QAAQ,GAAE,OAAO,YAA2B,EAC5C,aAAa,GAAE,IAAI,CAAC,mBAAmB,EAAE,QAAQ,GAAG,WAAW,CAAM;IAqBzE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAuB/B,UAAU,IAAI,IAAI;IAIlB,OAAO,IAAI,IAAI;IAMf,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA+B/B,OAAO,CAAC,OAAO;YAKD,UAAU;IAiFxB,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,eAAe;IAoBvB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,gBAAgB;CAe3B"}