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
@@ -0,0 +1,387 @@
1
+ import { createAgentSession, getAgentDir, SessionManager } from "@gsd/pi-coding-agent";
2
+ import { resolveConfiguredSubagentModel } from "./configured-model.js";
3
+ import { resolveSubagentModel } from "./model-resolution.js";
4
+ import { readBudgetSubagentModelFromSettings } from "./legacy-runner.js";
5
+ import { loadEffectivePreferences } from "../shared/preferences.js";
6
+ const MAX_AGENT_DURATION_MS = 30 * 60 * 1000;
7
+ export const MAX_IN_PROCESS_SUBAGENT_DEPTH = 3;
8
+ export const MAX_ACTIVE_DESCENDANTS = 8;
9
+ const NESTED_EXTENSION_TOOL_ALLOWLIST = new Set([
10
+ "subagent",
11
+ "await_subagent",
12
+ "bg_shell",
13
+ "fetch_page",
14
+ "resolve_library",
15
+ "get_library_docs",
16
+ "tool_search",
17
+ "tool_enable",
18
+ "Skill",
19
+ ]);
20
+ const parentSessionIdByChildSessionId = new Map();
21
+ const childSessionIdsByParentSessionId = new Map();
22
+ const handleBySessionId = new Map();
23
+ let activeDescendantCount = 0;
24
+ function getFinalOutput(messages) {
25
+ for (let i = messages.length - 1; i >= 0; i--) {
26
+ const msg = messages[i];
27
+ if (msg.role === "assistant") {
28
+ for (const part of msg.content) {
29
+ if (part.type === "text")
30
+ return part.text;
31
+ }
32
+ }
33
+ }
34
+ return "";
35
+ }
36
+ function toErrorString(error) {
37
+ return error instanceof Error ? error.message : String(error);
38
+ }
39
+ function createUnknownAgentResult(agents, agentName, task, step, parentSessionFile) {
40
+ const available = agents.map((a) => `"${a.name}"`).join(", ") || "none";
41
+ return {
42
+ agent: agentName,
43
+ agentSource: "unknown",
44
+ task,
45
+ exitCode: 1,
46
+ messages: [],
47
+ stderr: `Unknown agent: "${agentName}". Available agents: ${available}.`,
48
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 0 },
49
+ step,
50
+ parentSessionFile,
51
+ };
52
+ }
53
+ function createResolvedHandle(result) {
54
+ const resultPromise = Promise.resolve(result);
55
+ const handle = {
56
+ result: resultPromise,
57
+ isBusy: () => false,
58
+ prompt: async () => undefined,
59
+ steer: async () => undefined,
60
+ followUp: async () => undefined,
61
+ abort: () => undefined,
62
+ dispose: () => undefined,
63
+ };
64
+ return { handle, currentResult: result, resultPromise };
65
+ }
66
+ function reserveDescendantSlot(depth) {
67
+ if (depth <= 1)
68
+ return () => undefined;
69
+ if (activeDescendantCount >= MAX_ACTIVE_DESCENDANTS)
70
+ return null;
71
+ activeDescendantCount += 1;
72
+ let released = false;
73
+ return () => {
74
+ if (released)
75
+ return;
76
+ released = true;
77
+ activeDescendantCount = Math.max(0, activeDescendantCount - 1);
78
+ };
79
+ }
80
+ function linkParentChildSession(parentSessionId, childSessionId) {
81
+ parentSessionIdByChildSessionId.set(childSessionId, parentSessionId);
82
+ const children = childSessionIdsByParentSessionId.get(parentSessionId) ?? new Set();
83
+ children.add(childSessionId);
84
+ childSessionIdsByParentSessionId.set(parentSessionId, children);
85
+ }
86
+ function unlinkSessionFromParent(sessionId) {
87
+ const parentSessionId = parentSessionIdByChildSessionId.get(sessionId);
88
+ if (!parentSessionId)
89
+ return;
90
+ parentSessionIdByChildSessionId.delete(sessionId);
91
+ const siblings = childSessionIdsByParentSessionId.get(parentSessionId);
92
+ if (!siblings)
93
+ return;
94
+ siblings.delete(sessionId);
95
+ if (siblings.size === 0) {
96
+ childSessionIdsByParentSessionId.delete(parentSessionId);
97
+ }
98
+ }
99
+ function abortDescendantTree(sessionId, visited = new Set()) {
100
+ if (visited.has(sessionId))
101
+ return;
102
+ visited.add(sessionId);
103
+ const descendants = childSessionIdsByParentSessionId.get(sessionId);
104
+ if (!descendants || descendants.size === 0)
105
+ return;
106
+ for (const childSessionId of descendants) {
107
+ handleBySessionId.get(childSessionId)?.abort();
108
+ abortDescendantTree(childSessionId, visited);
109
+ }
110
+ }
111
+ function resolveRequestedToolNames(agent, defaultActiveToolNames) {
112
+ const requested = agent.tools && agent.tools.length > 0 ? agent.tools : defaultActiveToolNames;
113
+ return [...new Set(requested)];
114
+ }
115
+ function applyNestedExtensionToolPolicy(toolNames, extensionToolNames, nestingDepth) {
116
+ if (nestingDepth <= 1) {
117
+ return { activeToolNames: toolNames, droppedTools: [] };
118
+ }
119
+ const activeToolNames = [];
120
+ const droppedTools = [];
121
+ for (const toolName of toolNames) {
122
+ if (!extensionToolNames.has(toolName)) {
123
+ activeToolNames.push(toolName);
124
+ continue;
125
+ }
126
+ if (NESTED_EXTENSION_TOOL_ALLOWLIST.has(toolName)) {
127
+ activeToolNames.push(toolName);
128
+ }
129
+ else {
130
+ droppedTools.push(toolName);
131
+ }
132
+ }
133
+ return { activeToolNames, droppedTools };
134
+ }
135
+ export async function startInProcessSingleAgent(defaultCwd, agents, agentName, task, cwd, step, modelOverride, parentModel, signal, onUpdate, makeDetails, parentSessionFile, depth, parentSessionId, ancestry, onSubagentEvent) {
136
+ const agent = agents.find((candidate) => candidate.name === agentName);
137
+ if (!agent) {
138
+ return createResolvedHandle(createUnknownAgentResult(agents, agentName, task, step, parentSessionFile));
139
+ }
140
+ const nestingDepth = depth ?? 1;
141
+ if (nestingDepth > MAX_IN_PROCESS_SUBAGENT_DEPTH) {
142
+ return createResolvedHandle({
143
+ agent: agentName,
144
+ agentSource: agent.source,
145
+ task,
146
+ exitCode: 1,
147
+ messages: [],
148
+ stderr: `Max subagent depth (${MAX_IN_PROCESS_SUBAGENT_DEPTH}) exceeded.`,
149
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 0 },
150
+ step,
151
+ parentSessionFile,
152
+ });
153
+ }
154
+ const parentAgentName = ancestry && ancestry.length > 0 ? ancestry[ancestry.length - 1] : undefined;
155
+ if (parentAgentName && parentAgentName === agentName) {
156
+ return createResolvedHandle({
157
+ agent: agentName,
158
+ agentSource: agent.source,
159
+ task,
160
+ exitCode: 1,
161
+ messages: [],
162
+ stderr: `Subagent "${agentName}" cannot spawn another subagent with the same name as itself.`,
163
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 0 },
164
+ step,
165
+ parentSessionFile,
166
+ });
167
+ }
168
+ const releaseDescendantSlot = reserveDescendantSlot(nestingDepth);
169
+ if (nestingDepth > 1 && !releaseDescendantSlot) {
170
+ return createResolvedHandle({
171
+ agent: agentName,
172
+ agentSource: agent.source,
173
+ task,
174
+ exitCode: 1,
175
+ messages: [],
176
+ stderr: `Maximum active descendant subagents (${MAX_ACTIVE_DESCENDANTS}) reached. Wait for running descendants to finish or cancel one before spawning more.`,
177
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 0 },
178
+ step,
179
+ parentSessionFile,
180
+ });
181
+ }
182
+ const releaseDescendantSlotOnce = (() => {
183
+ let released = false;
184
+ return () => {
185
+ if (released)
186
+ return;
187
+ released = true;
188
+ releaseDescendantSlot?.();
189
+ };
190
+ })();
191
+ const preferences = loadEffectivePreferences()?.preferences;
192
+ const settingsBudgetModel = readBudgetSubagentModelFromSettings();
193
+ const resolvedModel = resolveConfiguredSubagentModel(agent, preferences, settingsBudgetModel);
194
+ const inferredModel = resolveSubagentModel({ name: agent.name, model: resolvedModel }, { overrideModel: modelOverride, parentModel });
195
+ const currentResult = {
196
+ agent: agentName,
197
+ agentSource: agent.source,
198
+ task,
199
+ exitCode: 0,
200
+ messages: [],
201
+ stderr: "",
202
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 0 },
203
+ model: inferredModel,
204
+ step,
205
+ parentSessionFile,
206
+ };
207
+ const emitUpdate = () => {
208
+ if (!onUpdate)
209
+ return;
210
+ onUpdate({
211
+ content: [{ type: "text", text: getFinalOutput(currentResult.messages) || "(running...)" }],
212
+ details: makeDetails([currentResult]),
213
+ });
214
+ };
215
+ const effectiveCwd = cwd ?? defaultCwd;
216
+ const sessionManager = SessionManager.inMemory(effectiveCwd);
217
+ let session;
218
+ try {
219
+ const created = await createAgentSession({
220
+ cwd: effectiveCwd,
221
+ agentDir: getAgentDir(),
222
+ sessionManager,
223
+ });
224
+ session = created.session;
225
+ await session.bindExtensions({});
226
+ }
227
+ catch (error) {
228
+ releaseDescendantSlotOnce();
229
+ currentResult.exitCode = 1;
230
+ currentResult.stderr = `Failed to initialize in-process subagent session: ${toErrorString(error)}`;
231
+ return createResolvedHandle(currentResult);
232
+ }
233
+ if (inferredModel) {
234
+ const [provider, modelId] = inferredModel.split("/");
235
+ if (provider && modelId) {
236
+ const model = session.modelRegistry.find(provider, modelId);
237
+ if (!model) {
238
+ session.dispose();
239
+ releaseDescendantSlotOnce();
240
+ currentResult.exitCode = 1;
241
+ currentResult.stderr = `Unable to resolve model ${inferredModel} for in-process subagent.`;
242
+ return createResolvedHandle(currentResult);
243
+ }
244
+ await session.setModel(model);
245
+ currentResult.model = `${model.provider}/${model.id}`;
246
+ }
247
+ }
248
+ const defaultActiveToolNames = session.getActiveToolNames();
249
+ const requestedToolNames = resolveRequestedToolNames(agent, defaultActiveToolNames);
250
+ const extensionToolNames = new Set(session.extensionRunner?.getAllRegisteredTools().map((registered) => registered.definition.name) ?? []);
251
+ const { activeToolNames: resolvedActiveToolNames, droppedTools } = applyNestedExtensionToolPolicy(requestedToolNames, extensionToolNames, nestingDepth);
252
+ session.setActiveToolsByName(resolvedActiveToolNames);
253
+ const ancestryChain = ancestry && ancestry.length > 0 ? ancestry.join(" -> ") : "root";
254
+ const nestedPolicyLine = droppedTools.length > 0
255
+ ? `Nested safety policy disabled extension tools: ${droppedTools.join(", ")}.`
256
+ : "";
257
+ const antiRecursionPrompt = [
258
+ `You are already the ${agentName} subagent for this session.`,
259
+ "Do not spawn or delegate to another subagent with the same name as yourself.",
260
+ `If the user asks you to continue ${agentName} work, do that work directly in this session.`,
261
+ `Original delegated task: ${task}`,
262
+ `Current subagent depth: ${nestingDepth}/${MAX_IN_PROCESS_SUBAGENT_DEPTH}.`,
263
+ `Subagent ancestry: ${ancestryChain}.`,
264
+ nestedPolicyLine,
265
+ ].filter(Boolean).join("\n");
266
+ const appendedParts = [antiRecursionPrompt, agent.systemPrompt.trim()].filter((part) => part.length > 0);
267
+ if (appendedParts.length > 0) {
268
+ const appendedPrompt = `${session.systemPrompt}\n\n${appendedParts.join("\n\n")}`;
269
+ session.agent.setSystemPrompt(appendedPrompt);
270
+ }
271
+ let completed = false;
272
+ let disposed = false;
273
+ const unsubscribe = session.subscribe((event) => {
274
+ onSubagentEvent?.(event, currentResult);
275
+ if (event?.type !== "message_end" || !event.message)
276
+ return;
277
+ const message = event.message;
278
+ currentResult.messages.push(message);
279
+ if (message.role === "assistant") {
280
+ currentResult.usage.turns++;
281
+ const usage = message.usage;
282
+ if (usage) {
283
+ currentResult.usage.input += usage.input || 0;
284
+ currentResult.usage.output += usage.output || 0;
285
+ currentResult.usage.cacheRead += usage.cacheRead || 0;
286
+ currentResult.usage.cacheWrite += usage.cacheWrite || 0;
287
+ currentResult.usage.cost += usage.cost?.total || 0;
288
+ currentResult.usage.contextTokens = usage.totalTokens || 0;
289
+ }
290
+ if (message.model)
291
+ currentResult.model = message.model;
292
+ if (message.stopReason)
293
+ currentResult.stopReason = message.stopReason;
294
+ if (message.errorMessage)
295
+ currentResult.errorMessage = message.errorMessage;
296
+ }
297
+ emitUpdate();
298
+ });
299
+ const sessionId = session.sessionId;
300
+ const dispose = () => {
301
+ if (disposed)
302
+ return;
303
+ disposed = true;
304
+ if (sessionId) {
305
+ handleBySessionId.delete(sessionId);
306
+ unlinkSessionFromParent(sessionId);
307
+ }
308
+ releaseDescendantSlotOnce();
309
+ unsubscribe();
310
+ session.dispose();
311
+ };
312
+ const handle = {
313
+ result: Promise.resolve(currentResult),
314
+ sessionId,
315
+ isBusy: () => session.isStreaming,
316
+ prompt: (message, images) => session.prompt(message, { images }),
317
+ steer: (message, images) => session.steer(message, images),
318
+ followUp: (message, images) => session.followUp(message, images),
319
+ abort: () => {
320
+ if (sessionId) {
321
+ abortDescendantTree(sessionId);
322
+ }
323
+ void session.abort();
324
+ },
325
+ dispose,
326
+ };
327
+ if (sessionId) {
328
+ handleBySessionId.set(sessionId, handle);
329
+ if (parentSessionId) {
330
+ linkParentChildSession(parentSessionId, sessionId);
331
+ }
332
+ }
333
+ let timeoutTimer;
334
+ const timeoutPromise = new Promise((_, reject) => {
335
+ timeoutTimer = setTimeout(() => {
336
+ handle.abort();
337
+ reject(new Error(`In-process subagent timed out after ${MAX_AGENT_DURATION_MS}ms.`));
338
+ }, MAX_AGENT_DURATION_MS);
339
+ if (typeof timeoutTimer === "object" && "unref" in timeoutTimer)
340
+ timeoutTimer.unref();
341
+ });
342
+ const runPromise = (async () => {
343
+ if (signal?.aborted) {
344
+ handle.abort();
345
+ throw new Error("Subagent was aborted");
346
+ }
347
+ const onAbort = () => handle.abort();
348
+ signal?.addEventListener("abort", onAbort, { once: true });
349
+ try {
350
+ await session.prompt(task);
351
+ completed = true;
352
+ }
353
+ finally {
354
+ signal?.removeEventListener("abort", onAbort);
355
+ }
356
+ })();
357
+ const resultPromise = (async () => {
358
+ try {
359
+ await Promise.race([runPromise, timeoutPromise]);
360
+ }
361
+ catch (error) {
362
+ currentResult.exitCode = 1;
363
+ currentResult.stderr = toErrorString(error);
364
+ if (signal?.aborted)
365
+ currentResult.stopReason = "aborted";
366
+ }
367
+ finally {
368
+ if (timeoutTimer)
369
+ clearTimeout(timeoutTimer);
370
+ if (!completed && signal?.aborted) {
371
+ currentResult.stopReason = "aborted";
372
+ }
373
+ dispose();
374
+ }
375
+ return currentResult;
376
+ })();
377
+ handle.result = resultPromise;
378
+ return {
379
+ handle,
380
+ currentResult,
381
+ resultPromise,
382
+ };
383
+ }
384
+ export async function runInProcessSingleAgent(defaultCwd, agents, agentName, task, cwd, step, modelOverride, parentModel, signal, onUpdate, makeDetails, parentSessionFile, depth, parentSessionId, ancestry, onSubagentEvent) {
385
+ const started = await startInProcessSingleAgent(defaultCwd, agents, agentName, task, cwd, step, modelOverride, parentModel, signal, onUpdate, makeDetails, parentSessionFile, depth, parentSessionId, ancestry, onSubagentEvent);
386
+ return started.resultPromise;
387
+ }