@qduc/term2 0.7.1 → 0.7.3

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 (956) hide show
  1. package/dist/agent.d.ts +1 -0
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +17 -1
  4. package/dist/agent.js.map +1 -1
  5. package/dist/agent.test.js +36 -0
  6. package/dist/agent.test.js.map +1 -1
  7. package/dist/app.d.ts +3 -3
  8. package/dist/app.d.ts.map +1 -1
  9. package/dist/app.js +193 -86
  10. package/dist/app.js.map +1 -1
  11. package/dist/app.large-uncached-warning.test.js.map +1 -1
  12. package/dist/cli.integration.test.js +101 -5
  13. package/dist/cli.integration.test.js.map +1 -1
  14. package/dist/cli.js +61 -12
  15. package/dist/cli.js.map +1 -1
  16. package/dist/components/ApprovalPrompt.ask-user.test.d.ts +2 -0
  17. package/dist/components/ApprovalPrompt.ask-user.test.d.ts.map +1 -0
  18. package/dist/components/ApprovalPrompt.ask-user.test.js +108 -0
  19. package/dist/components/ApprovalPrompt.ask-user.test.js.map +1 -0
  20. package/dist/components/ApprovalPrompt.d.ts +4 -4
  21. package/dist/components/ApprovalPrompt.d.ts.map +1 -1
  22. package/dist/components/ApprovalPrompt.js +76 -13
  23. package/dist/components/ApprovalPrompt.js.map +1 -1
  24. package/dist/components/BottomArea.d.ts +11 -2
  25. package/dist/components/BottomArea.d.ts.map +1 -1
  26. package/dist/components/BottomArea.js +20 -6
  27. package/dist/components/BottomArea.js.map +1 -1
  28. package/dist/components/BottomArea.test.js +37 -4
  29. package/dist/components/BottomArea.test.js.map +1 -1
  30. package/dist/components/Common/MenuContainer.d.ts +3 -4
  31. package/dist/components/Common/MenuContainer.d.ts.map +1 -1
  32. package/dist/components/Common/MenuContainer.js +14 -14
  33. package/dist/components/Common/MenuContainer.js.map +1 -1
  34. package/dist/components/Common/MenuContainer.test.d.ts +2 -0
  35. package/dist/components/Common/MenuContainer.test.d.ts.map +1 -0
  36. package/dist/components/Common/MenuContainer.test.js +66 -0
  37. package/dist/components/Common/MenuContainer.test.js.map +1 -0
  38. package/dist/components/Input/PopupManager.d.ts +14 -0
  39. package/dist/components/Input/PopupManager.d.ts.map +1 -1
  40. package/dist/components/Input/PopupManager.js +6 -4
  41. package/dist/components/Input/PopupManager.js.map +1 -1
  42. package/dist/components/Input/input-width.d.ts +2 -1
  43. package/dist/components/Input/input-width.d.ts.map +1 -1
  44. package/dist/components/Input/input-width.js +6 -2
  45. package/dist/components/Input/input-width.js.map +1 -1
  46. package/dist/components/Input/popup-props.d.ts +3 -1
  47. package/dist/components/Input/popup-props.d.ts.map +1 -1
  48. package/dist/components/Input/popup-props.js +12 -1
  49. package/dist/components/Input/popup-props.js.map +1 -1
  50. package/dist/components/Input/popup-props.test.js +9 -0
  51. package/dist/components/Input/popup-props.test.js.map +1 -1
  52. package/dist/components/InputBox.d.ts +8 -0
  53. package/dist/components/InputBox.d.ts.map +1 -1
  54. package/dist/components/InputBox.js +97 -33
  55. package/dist/components/InputBox.js.map +1 -1
  56. package/dist/components/InputBox.test.js +174 -7
  57. package/dist/components/InputBox.test.js.map +1 -1
  58. package/dist/components/LargeUncachedConfirmationPrompt.d.ts +10 -0
  59. package/dist/components/LargeUncachedConfirmationPrompt.d.ts.map +1 -0
  60. package/dist/components/LargeUncachedConfirmationPrompt.js +49 -0
  61. package/dist/components/LargeUncachedConfirmationPrompt.js.map +1 -0
  62. package/dist/components/LargeUncachedConfirmationPrompt.test.d.ts +2 -0
  63. package/dist/components/LargeUncachedConfirmationPrompt.test.d.ts.map +1 -0
  64. package/dist/components/LargeUncachedConfirmationPrompt.test.js +48 -0
  65. package/dist/components/LargeUncachedConfirmationPrompt.test.js.map +1 -0
  66. package/dist/components/MessageList.d.ts +10 -0
  67. package/dist/components/MessageList.d.ts.map +1 -1
  68. package/dist/components/MessageList.js +34 -3
  69. package/dist/components/MessageList.js.map +1 -1
  70. package/dist/components/MessageList.test.js +54 -1
  71. package/dist/components/MessageList.test.js.map +1 -1
  72. package/dist/components/ModelSelectionMenu.d.ts.map +1 -1
  73. package/dist/components/ModelSelectionMenu.debug.test.d.ts +2 -0
  74. package/dist/components/ModelSelectionMenu.debug.test.d.ts.map +1 -0
  75. package/dist/components/ModelSelectionMenu.debug.test.js.map +1 -0
  76. package/dist/components/ModelSelectionMenu.js +1 -4
  77. package/dist/components/ModelSelectionMenu.js.map +1 -1
  78. package/dist/components/PathSelectionMenu.d.ts +1 -0
  79. package/dist/components/PathSelectionMenu.d.ts.map +1 -1
  80. package/dist/components/PathSelectionMenu.js +11 -15
  81. package/dist/components/PathSelectionMenu.js.map +1 -1
  82. package/dist/components/PathSelectionMenu.test.d.ts +2 -0
  83. package/dist/components/PathSelectionMenu.test.d.ts.map +1 -0
  84. package/dist/components/PathSelectionMenu.test.js +17 -0
  85. package/dist/components/PathSelectionMenu.test.js.map +1 -0
  86. package/dist/components/ProviderSelectionMenu.d.ts +15 -0
  87. package/dist/components/ProviderSelectionMenu.d.ts.map +1 -0
  88. package/dist/components/ProviderSelectionMenu.js +172 -0
  89. package/dist/components/ProviderSelectionMenu.js.map +1 -0
  90. package/dist/components/ProviderSelectionMenu.test.d.ts +2 -0
  91. package/dist/components/ProviderSelectionMenu.test.d.ts.map +1 -0
  92. package/dist/components/ProviderSelectionMenu.test.js +97 -0
  93. package/dist/components/ProviderSelectionMenu.test.js.map +1 -0
  94. package/dist/components/SettingsSelectionMenu.d.ts.map +1 -1
  95. package/dist/components/SettingsSelectionMenu.js +1 -12
  96. package/dist/components/SettingsSelectionMenu.js.map +1 -1
  97. package/dist/components/SettingsValueSelectionMenu.d.ts +2 -1
  98. package/dist/components/SettingsValueSelectionMenu.d.ts.map +1 -1
  99. package/dist/components/SettingsValueSelectionMenu.js +12 -13
  100. package/dist/components/SettingsValueSelectionMenu.js.map +1 -1
  101. package/dist/components/StatusBar.d.ts +1 -0
  102. package/dist/components/StatusBar.d.ts.map +1 -1
  103. package/dist/components/StatusBar.js +21 -15
  104. package/dist/components/StatusBar.js.map +1 -1
  105. package/dist/components/StatusBar.test.js +23 -4
  106. package/dist/components/StatusBar.test.js.map +1 -1
  107. package/dist/components/UndoSelectionMenu.d.ts.map +1 -1
  108. package/dist/components/UndoSelectionMenu.js +1 -1
  109. package/dist/components/UndoSelectionMenu.js.map +1 -1
  110. package/dist/context/InputContext.d.ts +6 -1
  111. package/dist/context/InputContext.d.ts.map +1 -1
  112. package/dist/context/InputContext.images.test.d.ts +2 -0
  113. package/dist/context/InputContext.images.test.d.ts.map +1 -0
  114. package/dist/context/InputContext.images.test.js +56 -0
  115. package/dist/context/InputContext.images.test.js.map +1 -0
  116. package/dist/context/InputContext.js +3 -2
  117. package/dist/context/InputContext.js.map +1 -1
  118. package/dist/hooks/use-app-commands.d.ts +2 -1
  119. package/dist/hooks/use-app-commands.d.ts.map +1 -1
  120. package/dist/hooks/use-app-commands.js +11 -2
  121. package/dist/hooks/use-app-commands.js.map +1 -1
  122. package/dist/hooks/use-app-commands.test.js +2 -0
  123. package/dist/hooks/use-app-commands.test.js.map +1 -1
  124. package/dist/hooks/use-conversation.clear.test.js +31 -0
  125. package/dist/hooks/use-conversation.clear.test.js.map +1 -1
  126. package/dist/hooks/use-conversation.d.ts +12 -2
  127. package/dist/hooks/use-conversation.d.ts.map +1 -1
  128. package/dist/hooks/use-conversation.js +36 -5
  129. package/dist/hooks/use-conversation.js.map +1 -1
  130. package/dist/hooks/use-conversation.resume.test.js +26 -3
  131. package/dist/hooks/use-conversation.resume.test.js.map +1 -1
  132. package/dist/hooks/use-escape-key.d.ts +12 -3
  133. package/dist/hooks/use-escape-key.d.ts.map +1 -1
  134. package/dist/hooks/use-escape-key.js +25 -11
  135. package/dist/hooks/use-escape-key.js.map +1 -1
  136. package/dist/hooks/use-escape-key.test.js +154 -14
  137. package/dist/hooks/use-escape-key.test.js.map +1 -1
  138. package/dist/hooks/use-mode-handlers.d.ts +13 -1
  139. package/dist/hooks/use-mode-handlers.d.ts.map +1 -1
  140. package/dist/hooks/use-mode-handlers.js +22 -1
  141. package/dist/hooks/use-mode-handlers.js.map +1 -1
  142. package/dist/hooks/use-mode-handlers.test.d.ts +2 -0
  143. package/dist/hooks/use-mode-handlers.test.d.ts.map +1 -0
  144. package/dist/hooks/use-mode-handlers.test.js +119 -0
  145. package/dist/hooks/use-mode-handlers.test.js.map +1 -0
  146. package/dist/hooks/use-path-completion.d.ts +10 -3
  147. package/dist/hooks/use-path-completion.d.ts.map +1 -1
  148. package/dist/hooks/use-path-completion.js +53 -9
  149. package/dist/hooks/use-path-completion.js.map +1 -1
  150. package/dist/hooks/use-path-completion.test.d.ts +2 -0
  151. package/dist/hooks/use-path-completion.test.d.ts.map +1 -0
  152. package/dist/hooks/use-path-completion.test.js +66 -0
  153. package/dist/hooks/use-path-completion.test.js.map +1 -0
  154. package/dist/hooks/use-provider-selection.d.ts +60 -0
  155. package/dist/hooks/use-provider-selection.d.ts.map +1 -0
  156. package/dist/hooks/use-provider-selection.js +767 -0
  157. package/dist/hooks/use-provider-selection.js.map +1 -0
  158. package/dist/hooks/use-provider-selection.test.d.ts +2 -0
  159. package/dist/hooks/use-provider-selection.test.d.ts.map +1 -0
  160. package/dist/hooks/use-provider-selection.test.js +793 -0
  161. package/dist/hooks/use-provider-selection.test.js.map +1 -0
  162. package/dist/hooks/use-runtime-settings.d.ts.map +1 -1
  163. package/dist/hooks/use-runtime-settings.js +2 -2
  164. package/dist/hooks/use-runtime-settings.js.map +1 -1
  165. package/dist/hooks/use-selection.d.ts +3 -1
  166. package/dist/hooks/use-selection.d.ts.map +1 -1
  167. package/dist/hooks/use-selection.js +115 -24
  168. package/dist/hooks/use-selection.js.map +1 -1
  169. package/dist/hooks/use-selection.test.js +96 -2
  170. package/dist/hooks/use-selection.test.js.map +1 -1
  171. package/dist/hooks/use-settings-completion.d.ts.map +1 -1
  172. package/dist/hooks/use-settings-completion.js +8 -1
  173. package/dist/hooks/use-settings-completion.js.map +1 -1
  174. package/dist/hooks/use-settings-completion.test.js +4 -0
  175. package/dist/hooks/use-settings-completion.test.js.map +1 -1
  176. package/dist/hooks/use-settings-value-completion.d.ts +3 -0
  177. package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
  178. package/dist/hooks/use-settings-value-completion.js +140 -18
  179. package/dist/hooks/use-settings-value-completion.js.map +1 -1
  180. package/dist/hooks/use-settings-value-completion.test.js +71 -1
  181. package/dist/hooks/use-settings-value-completion.test.js.map +1 -1
  182. package/dist/hooks/use-terminal-width.d.ts +2 -1
  183. package/dist/hooks/use-terminal-width.d.ts.map +1 -1
  184. package/dist/hooks/use-terminal-width.js +2 -1
  185. package/dist/hooks/use-terminal-width.js.map +1 -1
  186. package/dist/hooks/use-trigger-detection.d.ts +4 -2
  187. package/dist/hooks/use-trigger-detection.d.ts.map +1 -1
  188. package/dist/hooks/use-trigger-detection.js +42 -8
  189. package/dist/hooks/use-trigger-detection.js.map +1 -1
  190. package/dist/hooks/use-trigger-detection.test.js +2 -1
  191. package/dist/hooks/use-trigger-detection.test.js.map +1 -1
  192. package/dist/inspect_zod.d.ts +2 -0
  193. package/dist/inspect_zod.d.ts.map +1 -0
  194. package/dist/inspect_zod.js +16 -0
  195. package/dist/inspect_zod.js.map +1 -0
  196. package/dist/lib/openai-agent-client.chat.test.js +8 -0
  197. package/dist/lib/openai-agent-client.chat.test.js.map +1 -1
  198. package/dist/lib/openai-agent-client.d.ts +11 -6
  199. package/dist/lib/openai-agent-client.d.ts.map +1 -1
  200. package/dist/lib/openai-agent-client.js +241 -37
  201. package/dist/lib/openai-agent-client.js.map +1 -1
  202. package/dist/lib/openai-agent-client.public-methods.test.js +326 -23
  203. package/dist/lib/openai-agent-client.public-methods.test.js.map +1 -1
  204. package/dist/lib/openai-agent-client.test.js +62 -0
  205. package/dist/lib/openai-agent-client.test.js.map +1 -1
  206. package/dist/lib/tool-execution-limiter.d.ts +16 -0
  207. package/dist/lib/tool-execution-limiter.d.ts.map +1 -0
  208. package/dist/lib/tool-execution-limiter.js +112 -0
  209. package/dist/lib/tool-execution-limiter.js.map +1 -0
  210. package/dist/lib/tool-execution-limiter.test.d.ts +2 -0
  211. package/dist/lib/tool-execution-limiter.test.d.ts.map +1 -0
  212. package/dist/lib/tool-execution-limiter.test.js +70 -0
  213. package/dist/lib/tool-execution-limiter.test.js.map +1 -0
  214. package/dist/lib/tool-invoke.d.ts +27 -0
  215. package/dist/lib/tool-invoke.d.ts.map +1 -1
  216. package/dist/lib/tool-invoke.js +124 -95
  217. package/dist/lib/tool-invoke.js.map +1 -1
  218. package/dist/lib/tool-invoke.test.js +92 -30
  219. package/dist/lib/tool-invoke.test.js.map +1 -1
  220. package/dist/non-interactive.d.ts +2 -1
  221. package/dist/non-interactive.d.ts.map +1 -1
  222. package/dist/non-interactive.js +10 -2
  223. package/dist/non-interactive.js.map +1 -1
  224. package/dist/prompts/gpt-5-modern.md +105 -91
  225. package/dist/prompts/gpt-5.5.md +106 -0
  226. package/dist/prompts/gpt-5.md +7 -4
  227. package/dist/prompts/orchestrator.md +27 -44
  228. package/dist/prompts/plan-mode-info.md +2 -0
  229. package/dist/prompts/prompt-constructor.d.ts.map +1 -1
  230. package/dist/prompts/prompt-constructor.js +8 -0
  231. package/dist/prompts/prompt-constructor.js.map +1 -1
  232. package/dist/prompts/prompt-constructor.test.js +13 -0
  233. package/dist/prompts/prompt-constructor.test.js.map +1 -1
  234. package/dist/prompts/prompt-constructor.test.ts +16 -0
  235. package/dist/prompts/prompt-constructor.ts +10 -0
  236. package/dist/prompts/prompt-profiles.js +1 -1
  237. package/dist/prompts/prompt-profiles.js.map +1 -1
  238. package/dist/prompts/prompt-profiles.ts +1 -1
  239. package/dist/prompts/prompt-selector.test.js +1 -1
  240. package/dist/prompts/prompt-selector.test.js.map +1 -1
  241. package/dist/prompts/prompt-selector.test.ts +1 -1
  242. package/dist/prompts/subagent-delegation.d.ts.map +1 -1
  243. package/dist/prompts/subagent-delegation.js +17 -1
  244. package/dist/prompts/subagent-delegation.js.map +1 -1
  245. package/dist/prompts/subagent-delegation.test.js +21 -0
  246. package/dist/prompts/subagent-delegation.test.js.map +1 -1
  247. package/dist/prompts/subagent-delegation.test.ts +26 -0
  248. package/dist/prompts/subagent-delegation.ts +17 -1
  249. package/dist/prompts/subagents/base-anthropic.md +3 -0
  250. package/dist/prompts/subagents/base-codex.md +3 -0
  251. package/dist/prompts/subagents/base-gpt-5-modern.md +3 -0
  252. package/dist/prompts/subagents/base-simple.md +3 -0
  253. package/dist/prompts/subagents/explorer.md +8 -10
  254. package/dist/prompts/subagents/researcher.md +2 -1
  255. package/dist/prompts/subagents/worker.md +12 -3
  256. package/dist/prompts/subagents/worktree-hygiene.md +6 -0
  257. package/dist/providers/ai-sdk-anthropic.provider.d.ts +4 -1
  258. package/dist/providers/ai-sdk-anthropic.provider.d.ts.map +1 -1
  259. package/dist/providers/ai-sdk-anthropic.provider.js +65 -22
  260. package/dist/providers/ai-sdk-anthropic.provider.js.map +1 -1
  261. package/dist/providers/ai-sdk-anthropic.provider.test.js +24 -1
  262. package/dist/providers/ai-sdk-anthropic.provider.test.js.map +1 -1
  263. package/dist/providers/ai-sdk-openai-compatible.provider.d.ts +0 -2
  264. package/dist/providers/ai-sdk-openai-compatible.provider.d.ts.map +1 -1
  265. package/dist/providers/ai-sdk-openai-compatible.provider.js +4 -8
  266. package/dist/providers/ai-sdk-openai-compatible.provider.js.map +1 -1
  267. package/dist/providers/ai-sdk-openai-compatible.provider.test.js +1 -119
  268. package/dist/providers/ai-sdk-openai-compatible.provider.test.js.map +1 -1
  269. package/dist/providers/anthropic-middleware.d.ts +25 -0
  270. package/dist/providers/anthropic-middleware.d.ts.map +1 -0
  271. package/dist/providers/anthropic-middleware.js +32 -0
  272. package/dist/providers/anthropic-middleware.js.map +1 -0
  273. package/dist/providers/anthropic-middleware.test.d.ts +2 -0
  274. package/dist/providers/anthropic-middleware.test.d.ts.map +1 -0
  275. package/dist/providers/anthropic-middleware.test.js +142 -0
  276. package/dist/providers/anthropic-middleware.test.js.map +1 -0
  277. package/dist/providers/codex-responses-model.d.ts +1 -0
  278. package/dist/providers/codex-responses-model.d.ts.map +1 -1
  279. package/dist/providers/codex-responses-model.js +97 -34
  280. package/dist/providers/codex-responses-model.js.map +1 -1
  281. package/dist/providers/codex-responses-model.test.js +158 -0
  282. package/dist/providers/codex-responses-model.test.js.map +1 -1
  283. package/dist/providers/codex.provider.d.ts.map +1 -1
  284. package/dist/providers/codex.provider.js +16 -9
  285. package/dist/providers/codex.provider.js.map +1 -1
  286. package/dist/providers/codex.provider.test.js +2 -1
  287. package/dist/providers/codex.provider.test.js.map +1 -1
  288. package/dist/providers/custom-provider-adapter.test.js +6 -2
  289. package/dist/providers/custom-provider-adapter.test.js.map +1 -1
  290. package/dist/providers/fallback-responses-model.d.ts +3 -1
  291. package/dist/providers/fallback-responses-model.d.ts.map +1 -1
  292. package/dist/providers/fallback-responses-model.js +31 -4
  293. package/dist/providers/fallback-responses-model.js.map +1 -1
  294. package/dist/providers/fallback-responses-model.test.js +65 -8
  295. package/dist/providers/fallback-responses-model.test.js.map +1 -1
  296. package/dist/providers/fetch/composer.d.ts +1 -0
  297. package/dist/providers/fetch/composer.d.ts.map +1 -1
  298. package/dist/providers/fetch/composer.js +1 -0
  299. package/dist/providers/fetch/composer.js.map +1 -1
  300. package/dist/providers/fetch/composer.test.js +58 -17
  301. package/dist/providers/fetch/composer.test.js.map +1 -1
  302. package/dist/providers/fetch/logging-middleware.d.ts +3 -2
  303. package/dist/providers/fetch/logging-middleware.d.ts.map +1 -1
  304. package/dist/providers/fetch/logging-middleware.js +5 -2
  305. package/dist/providers/fetch/logging-middleware.js.map +1 -1
  306. package/dist/providers/openai-compatible-behavior-gate.test.js +1 -42
  307. package/dist/providers/openai-compatible-behavior-gate.test.js.map +1 -1
  308. package/dist/providers/openai-compatible-lazy.d.ts +4 -0
  309. package/dist/providers/openai-compatible-lazy.d.ts.map +1 -0
  310. package/dist/providers/openai-compatible-lazy.js +55 -0
  311. package/dist/providers/openai-compatible-lazy.js.map +1 -0
  312. package/dist/providers/openai-compatible-middleware.d.ts +5 -2
  313. package/dist/providers/openai-compatible-middleware.d.ts.map +1 -1
  314. package/dist/providers/openai-compatible-middleware.js +8 -11
  315. package/dist/providers/openai-compatible-middleware.js.map +1 -1
  316. package/dist/providers/openai-compatible.provider.d.ts +5 -1
  317. package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
  318. package/dist/providers/openai-compatible.provider.js +59 -37
  319. package/dist/providers/openai-compatible.provider.js.map +1 -1
  320. package/dist/providers/openai-compatible.provider.test.js +97 -2
  321. package/dist/providers/openai-compatible.provider.test.js.map +1 -1
  322. package/dist/providers/openai.provider.d.ts +8 -1
  323. package/dist/providers/openai.provider.d.ts.map +1 -1
  324. package/dist/providers/openai.provider.js +43 -10
  325. package/dist/providers/openai.provider.js.map +1 -1
  326. package/dist/providers/openai.provider.test.d.ts +2 -0
  327. package/dist/providers/openai.provider.test.d.ts.map +1 -0
  328. package/dist/providers/openai.provider.test.js +59 -0
  329. package/dist/providers/openai.provider.test.js.map +1 -0
  330. package/dist/providers/opencode-routing.d.ts +4 -0
  331. package/dist/providers/opencode-routing.d.ts.map +1 -0
  332. package/dist/providers/opencode-routing.js +14 -0
  333. package/dist/providers/opencode-routing.js.map +1 -0
  334. package/dist/providers/opencode-session.d.ts +19 -0
  335. package/dist/providers/opencode-session.d.ts.map +1 -0
  336. package/dist/providers/opencode-session.js +76 -0
  337. package/dist/providers/opencode-session.js.map +1 -0
  338. package/dist/providers/opencode.provider.d.ts +0 -8
  339. package/dist/providers/opencode.provider.d.ts.map +1 -1
  340. package/dist/providers/opencode.provider.js +0 -32
  341. package/dist/providers/opencode.provider.js.map +1 -1
  342. package/dist/providers/opencode.provider.test.d.ts +2 -0
  343. package/dist/providers/opencode.provider.test.d.ts.map +1 -0
  344. package/dist/providers/opencode.provider.test.js +186 -0
  345. package/dist/providers/opencode.provider.test.js.map +1 -0
  346. package/dist/providers/openrouter.provider.createRunner.test.js +5 -0
  347. package/dist/providers/openrouter.provider.createRunner.test.js.map +1 -1
  348. package/dist/providers/openrouter.provider.d.ts.map +1 -1
  349. package/dist/providers/openrouter.provider.js +8 -4
  350. package/dist/providers/openrouter.provider.js.map +1 -1
  351. package/dist/providers/registry.d.ts +3 -0
  352. package/dist/providers/registry.d.ts.map +1 -1
  353. package/dist/providers/registry.js.map +1 -1
  354. package/dist/providers/registry.test.js +1 -0
  355. package/dist/providers/registry.test.js.map +1 -1
  356. package/dist/scripts/eval-auto-approval/runner.js +4 -0
  357. package/dist/scripts/eval-auto-approval/runner.js.map +1 -1
  358. package/dist/services/conversation-integration.test.js +8 -4
  359. package/dist/services/conversation-integration.test.js.map +1 -1
  360. package/dist/services/conversation-log-events.d.ts +3 -0
  361. package/dist/services/conversation-log-events.d.ts.map +1 -1
  362. package/dist/services/conversation-log-events.js.map +1 -1
  363. package/dist/services/conversation-log-writer.d.ts.map +1 -1
  364. package/dist/services/conversation-log-writer.js +1 -2
  365. package/dist/services/conversation-log-writer.js.map +1 -1
  366. package/dist/services/conversation-persistence.d.ts +1 -1
  367. package/dist/services/conversation-persistence.d.ts.map +1 -1
  368. package/dist/services/conversation-persistence.js +53 -4
  369. package/dist/services/conversation-persistence.js.map +1 -1
  370. package/dist/services/conversation-persistence.test.js +203 -1
  371. package/dist/services/conversation-persistence.test.js.map +1 -1
  372. package/dist/services/conversation-replay.d.ts.map +1 -1
  373. package/dist/services/conversation-replay.js +114 -8
  374. package/dist/services/conversation-replay.js.map +1 -1
  375. package/dist/services/conversation-replay.test.js +368 -0
  376. package/dist/services/conversation-replay.test.js.map +1 -1
  377. package/dist/services/conversation-result-builder.test.js +9 -0
  378. package/dist/services/conversation-result-builder.test.js.map +1 -1
  379. package/dist/services/conversation-service.d.ts +3 -1
  380. package/dist/services/conversation-service.d.ts.map +1 -1
  381. package/dist/services/conversation-service.js +3 -0
  382. package/dist/services/conversation-service.js.map +1 -1
  383. package/dist/services/conversation-session-reasoning.test.js +5 -1
  384. package/dist/services/conversation-session-reasoning.test.js.map +1 -1
  385. package/dist/services/conversation-session.auto-approval.test.js +25 -1
  386. package/dist/services/conversation-session.auto-approval.test.js.map +1 -1
  387. package/dist/services/conversation-session.d.ts +8 -2
  388. package/dist/services/conversation-session.d.ts.map +1 -1
  389. package/dist/services/conversation-session.js +88 -44
  390. package/dist/services/conversation-session.js.map +1 -1
  391. package/dist/services/conversation-store.merge-modes.test.d.ts.map +1 -1
  392. package/dist/services/conversation-store.merge-modes.test.js +160 -1
  393. package/dist/services/conversation-store.merge-modes.test.js.map +1 -1
  394. package/dist/services/file-service.d.ts +20 -4
  395. package/dist/services/file-service.d.ts.map +1 -1
  396. package/dist/services/file-service.js +111 -52
  397. package/dist/services/file-service.js.map +1 -1
  398. package/dist/services/file-service.test.d.ts +2 -0
  399. package/dist/services/file-service.test.d.ts.map +1 -0
  400. package/dist/services/file-service.test.js +60 -0
  401. package/dist/services/file-service.test.js.map +1 -0
  402. package/dist/services/large-uncached-input-guard.d.ts.map +1 -1
  403. package/dist/services/large-uncached-input-guard.js +4 -3
  404. package/dist/services/large-uncached-input-guard.js.map +1 -1
  405. package/dist/services/large-uncached-input-guard.test.js +22 -0
  406. package/dist/services/large-uncached-input-guard.test.js.map +1 -1
  407. package/dist/services/logging-service.d.ts +0 -3
  408. package/dist/services/logging-service.d.ts.map +1 -1
  409. package/dist/services/logging-service.js +12 -8
  410. package/dist/services/logging-service.js.map +1 -1
  411. package/dist/services/mode-notices.d.ts +4 -5
  412. package/dist/services/mode-notices.d.ts.map +1 -1
  413. package/dist/services/mode-notices.js +4 -5
  414. package/dist/services/mode-notices.js.map +1 -1
  415. package/dist/services/notification-service.d.ts +42 -0
  416. package/dist/services/notification-service.d.ts.map +1 -0
  417. package/dist/services/notification-service.js +116 -0
  418. package/dist/services/notification-service.js.map +1 -0
  419. package/dist/services/notification-service.test.d.ts +2 -0
  420. package/dist/services/notification-service.test.d.ts.map +1 -0
  421. package/dist/services/notification-service.test.js +151 -0
  422. package/dist/services/notification-service.test.js.map +1 -0
  423. package/dist/services/provider-traffic.d.ts +8 -9
  424. package/dist/services/provider-traffic.d.ts.map +1 -1
  425. package/dist/services/provider-traffic.js +25 -12
  426. package/dist/services/provider-traffic.js.map +1 -1
  427. package/dist/services/provider-traffic.test.js +102 -1
  428. package/dist/services/provider-traffic.test.js.map +1 -1
  429. package/dist/services/service-interfaces.d.ts +12 -16
  430. package/dist/services/service-interfaces.d.ts.map +1 -1
  431. package/dist/services/session-context-service.d.ts +8 -0
  432. package/dist/services/session-context-service.d.ts.map +1 -0
  433. package/dist/services/session-context-service.js +19 -0
  434. package/dist/services/session-context-service.js.map +1 -0
  435. package/dist/services/session-context-service.test.d.ts +2 -0
  436. package/dist/services/session-context-service.test.d.ts.map +1 -0
  437. package/dist/services/session-context-service.test.js +38 -0
  438. package/dist/services/session-context-service.test.js.map +1 -0
  439. package/dist/services/settings-env.d.ts.map +1 -1
  440. package/dist/services/settings-env.js +4 -1
  441. package/dist/services/settings-env.js.map +1 -1
  442. package/dist/services/settings-persistence.d.ts.map +1 -1
  443. package/dist/services/settings-persistence.js +0 -1
  444. package/dist/services/settings-persistence.js.map +1 -1
  445. package/dist/services/settings-persistence.test.js +2 -2
  446. package/dist/services/settings-persistence.test.js.map +1 -1
  447. package/dist/services/settings-schema.d.ts +25 -1
  448. package/dist/services/settings-schema.d.ts.map +1 -1
  449. package/dist/services/settings-schema.js +54 -23
  450. package/dist/services/settings-schema.js.map +1 -1
  451. package/dist/services/settings-schema.test.js +10 -0
  452. package/dist/services/settings-schema.test.js.map +1 -1
  453. package/dist/services/settings-service.d.ts +8 -0
  454. package/dist/services/settings-service.d.ts.map +1 -1
  455. package/dist/services/settings-service.js +60 -23
  456. package/dist/services/settings-service.js.map +1 -1
  457. package/dist/services/settings-sources.d.ts.map +1 -1
  458. package/dist/services/settings-sources.js +1 -0
  459. package/dist/services/settings-sources.js.map +1 -1
  460. package/dist/services/settings-sources.test.js +2 -0
  461. package/dist/services/settings-sources.test.js.map +1 -1
  462. package/dist/services/shell-auto-approval-evaluator.d.ts +3 -2
  463. package/dist/services/shell-auto-approval-evaluator.d.ts.map +1 -1
  464. package/dist/services/shell-auto-approval-evaluator.js +3 -3
  465. package/dist/services/shell-auto-approval-evaluator.js.map +1 -1
  466. package/dist/services/shell-auto-approval-evaluator.test.js +20 -0
  467. package/dist/services/shell-auto-approval-evaluator.test.js.map +1 -1
  468. package/dist/services/shell-auto-approval-resolver.d.ts +2 -1
  469. package/dist/services/shell-auto-approval-resolver.d.ts.map +1 -1
  470. package/dist/services/shell-auto-approval-resolver.js +2 -0
  471. package/dist/services/shell-auto-approval-resolver.js.map +1 -1
  472. package/dist/services/shell-auto-approval-resolver.test.js +10 -0
  473. package/dist/services/shell-auto-approval-resolver.test.js.map +1 -1
  474. package/dist/services/subagents/subagent-manager.d.ts +2 -1
  475. package/dist/services/subagents/subagent-manager.d.ts.map +1 -1
  476. package/dist/services/subagents/subagent-manager.js +182 -13
  477. package/dist/services/subagents/subagent-manager.js.map +1 -1
  478. package/dist/services/subagents/subagent-manager.test.js +548 -17
  479. package/dist/services/subagents/subagent-manager.test.js.map +1 -1
  480. package/dist/tools/apply-patch.d.ts.map +1 -1
  481. package/dist/tools/apply-patch.js +2 -2
  482. package/dist/tools/apply-patch.js.map +1 -1
  483. package/dist/tools/ask-user-constants.d.ts +7 -0
  484. package/dist/tools/ask-user-constants.d.ts.map +1 -0
  485. package/dist/tools/ask-user-constants.js +7 -0
  486. package/dist/tools/ask-user-constants.js.map +1 -0
  487. package/dist/tools/ask-user.d.ts +11 -0
  488. package/dist/tools/ask-user.d.ts.map +1 -0
  489. package/dist/tools/ask-user.js +56 -0
  490. package/dist/tools/ask-user.js.map +1 -0
  491. package/dist/tools/ask-user.test.d.ts +2 -0
  492. package/dist/tools/ask-user.test.d.ts.map +1 -0
  493. package/dist/tools/ask-user.test.js +129 -0
  494. package/dist/tools/ask-user.test.js.map +1 -0
  495. package/dist/tools/code-context.js +1 -1
  496. package/dist/tools/code-context.js.map +1 -1
  497. package/dist/tools/code-context.test.js +278 -0
  498. package/dist/tools/code-context.test.js.map +1 -1
  499. package/dist/tools/format-helpers.d.ts +13 -0
  500. package/dist/tools/format-helpers.d.ts.map +1 -1
  501. package/dist/tools/format-helpers.js +34 -0
  502. package/dist/tools/format-helpers.js.map +1 -1
  503. package/dist/tools/format-helpers.test.d.ts +2 -0
  504. package/dist/tools/format-helpers.test.d.ts.map +1 -0
  505. package/dist/tools/format-helpers.test.js +51 -0
  506. package/dist/tools/format-helpers.test.js.map +1 -0
  507. package/dist/tools/language-providers.d.ts.map +1 -1
  508. package/dist/tools/language-providers.js +379 -0
  509. package/dist/tools/language-providers.js.map +1 -1
  510. package/dist/tools/languages/cpp.d.ts +8 -0
  511. package/dist/tools/languages/cpp.d.ts.map +1 -0
  512. package/dist/tools/languages/cpp.js +306 -0
  513. package/dist/tools/languages/cpp.js.map +1 -0
  514. package/dist/tools/languages/csharp.d.ts +5 -0
  515. package/dist/tools/languages/csharp.d.ts.map +1 -0
  516. package/dist/tools/languages/csharp.js +225 -0
  517. package/dist/tools/languages/csharp.js.map +1 -0
  518. package/dist/tools/languages/go.d.ts +7 -0
  519. package/dist/tools/languages/go.d.ts.map +1 -0
  520. package/dist/tools/languages/go.js +223 -0
  521. package/dist/tools/languages/go.js.map +1 -0
  522. package/dist/tools/languages/index.d.ts +6 -0
  523. package/dist/tools/languages/index.d.ts.map +1 -0
  524. package/dist/tools/languages/index.js +32 -0
  525. package/dist/tools/languages/index.js.map +1 -0
  526. package/dist/tools/languages/java.d.ts +5 -0
  527. package/dist/tools/languages/java.d.ts.map +1 -0
  528. package/dist/tools/languages/java.js +183 -0
  529. package/dist/tools/languages/java.js.map +1 -0
  530. package/dist/tools/languages/json.d.ts +3 -0
  531. package/dist/tools/languages/json.d.ts.map +1 -0
  532. package/dist/tools/languages/json.js +40 -0
  533. package/dist/tools/languages/json.js.map +1 -0
  534. package/dist/tools/languages/php.d.ts +8 -0
  535. package/dist/tools/languages/php.d.ts.map +1 -0
  536. package/dist/tools/languages/php.js +139 -0
  537. package/dist/tools/languages/php.js.map +1 -0
  538. package/dist/tools/languages/python.d.ts +7 -0
  539. package/dist/tools/languages/python.d.ts.map +1 -0
  540. package/dist/tools/languages/python.js +189 -0
  541. package/dist/tools/languages/python.js.map +1 -0
  542. package/dist/tools/languages/ruby.d.ts +8 -0
  543. package/dist/tools/languages/ruby.d.ts.map +1 -0
  544. package/dist/tools/languages/ruby.js +94 -0
  545. package/dist/tools/languages/ruby.js.map +1 -0
  546. package/dist/tools/languages/rust.d.ts +7 -0
  547. package/dist/tools/languages/rust.d.ts.map +1 -0
  548. package/dist/tools/languages/rust.js +186 -0
  549. package/dist/tools/languages/rust.js.map +1 -0
  550. package/dist/tools/languages/types.d.ts +39 -0
  551. package/dist/tools/languages/types.d.ts.map +1 -0
  552. package/dist/tools/languages/types.js +2 -0
  553. package/dist/tools/languages/types.js.map +1 -0
  554. package/dist/tools/languages/typescript.d.ts +4 -0
  555. package/dist/tools/languages/typescript.d.ts.map +1 -0
  556. package/dist/tools/languages/typescript.js +94 -0
  557. package/dist/tools/languages/typescript.js.map +1 -0
  558. package/dist/tools/languages/utils.d.ts +14 -0
  559. package/dist/tools/languages/utils.d.ts.map +1 -0
  560. package/dist/tools/languages/utils.js +73 -0
  561. package/dist/tools/languages/utils.js.map +1 -0
  562. package/dist/tools/search-replace.d.ts.map +1 -1
  563. package/dist/tools/search-replace.js +2 -2
  564. package/dist/tools/search-replace.js.map +1 -1
  565. package/dist/tools/shell.d.ts.map +1 -1
  566. package/dist/tools/shell.js +13 -1
  567. package/dist/tools/shell.js.map +1 -1
  568. package/dist/tools/tool-names.d.ts +1 -0
  569. package/dist/tools/tool-names.d.ts.map +1 -1
  570. package/dist/tools/tool-names.js +1 -0
  571. package/dist/tools/tool-names.js.map +1 -1
  572. package/dist/tools/web-fetch.d.ts.map +1 -1
  573. package/dist/tools/web-fetch.js +1 -1
  574. package/dist/tools/web-fetch.js.map +1 -1
  575. package/dist/utils/clipboard.d.ts +2 -1
  576. package/dist/utils/clipboard.d.ts.map +1 -1
  577. package/dist/utils/clipboard.js +2 -35
  578. package/dist/utils/clipboard.js.map +1 -1
  579. package/dist/utils/command-safety/_scratch-classify.test.d.ts +2 -0
  580. package/dist/utils/command-safety/_scratch-classify.test.d.ts.map +1 -0
  581. package/dist/utils/command-safety/_scratch-classify.test.js +22 -0
  582. package/dist/utils/command-safety/_scratch-classify.test.js.map +1 -0
  583. package/dist/utils/command-safety/constants.d.ts.map +1 -1
  584. package/dist/utils/command-safety/constants.js +21 -0
  585. package/dist/utils/command-safety/constants.js.map +1 -1
  586. package/dist/utils/command-safety/handlers/git-handler.d.ts.map +1 -1
  587. package/dist/utils/command-safety/handlers/git-handler.js +28 -2
  588. package/dist/utils/command-safety/handlers/git-handler.js.map +1 -1
  589. package/dist/utils/command-safety/path-analysis.d.ts.map +1 -1
  590. package/dist/utils/command-safety/path-analysis.js +6 -0
  591. package/dist/utils/command-safety/path-analysis.js.map +1 -1
  592. package/dist/utils/command-safety/scratch-classify.test.d.ts +2 -0
  593. package/dist/utils/command-safety/scratch-classify.test.d.ts.map +1 -0
  594. package/dist/utils/command-safety/scratch-classify.test.js +22 -0
  595. package/dist/utils/command-safety/scratch-classify.test.js.map +1 -0
  596. package/dist/utils/command-safety/scratch-tally.test.d.ts +2 -0
  597. package/dist/utils/command-safety/scratch-tally.test.d.ts.map +1 -0
  598. package/dist/utils/command-safety/scratch-tally.test.js +68 -0
  599. package/dist/utils/command-safety/scratch-tally.test.js.map +1 -0
  600. package/dist/utils/command-safety.evaluator-false-positives.test.d.ts +2 -0
  601. package/dist/utils/command-safety.evaluator-false-positives.test.d.ts.map +1 -0
  602. package/dist/utils/command-safety.evaluator-false-positives.test.js +72 -0
  603. package/dist/utils/command-safety.evaluator-false-positives.test.js.map +1 -0
  604. package/dist/utils/header-sanitizer.d.ts +2 -0
  605. package/dist/utils/header-sanitizer.d.ts.map +1 -0
  606. package/dist/utils/header-sanitizer.js +38 -0
  607. package/dist/utils/header-sanitizer.js.map +1 -0
  608. package/dist/utils/header-sanitizer.test.d.ts +2 -0
  609. package/dist/utils/header-sanitizer.test.d.ts.map +1 -0
  610. package/dist/utils/header-sanitizer.test.js +56 -0
  611. package/dist/utils/header-sanitizer.test.js.map +1 -0
  612. package/dist/utils/home-directory-start-guard.d.ts +10 -0
  613. package/dist/utils/home-directory-start-guard.d.ts.map +1 -0
  614. package/dist/utils/home-directory-start-guard.js +20 -0
  615. package/dist/utils/home-directory-start-guard.js.map +1 -0
  616. package/dist/utils/home-directory-start-guard.test.d.ts +2 -0
  617. package/dist/utils/home-directory-start-guard.test.d.ts.map +1 -0
  618. package/dist/utils/home-directory-start-guard.test.js +40 -0
  619. package/dist/utils/home-directory-start-guard.test.js.map +1 -0
  620. package/dist/utils/inject-warning-into-tool-output.d.ts +2 -0
  621. package/dist/utils/inject-warning-into-tool-output.d.ts.map +1 -0
  622. package/dist/utils/inject-warning-into-tool-output.js +66 -0
  623. package/dist/utils/inject-warning-into-tool-output.js.map +1 -0
  624. package/dist/utils/project-tree.d.ts +14 -0
  625. package/dist/utils/project-tree.d.ts.map +1 -0
  626. package/dist/utils/project-tree.js +111 -0
  627. package/dist/utils/project-tree.js.map +1 -0
  628. package/dist/utils/project-tree.test.d.ts +2 -0
  629. package/dist/utils/project-tree.test.d.ts.map +1 -0
  630. package/dist/utils/project-tree.test.js +149 -0
  631. package/dist/utils/project-tree.test.js.map +1 -0
  632. package/dist/utils/provider-traffic-extractor.d.ts +1 -0
  633. package/dist/utils/provider-traffic-extractor.d.ts.map +1 -1
  634. package/dist/utils/provider-traffic-extractor.js +1 -0
  635. package/dist/utils/provider-traffic-extractor.js.map +1 -1
  636. package/dist/utils/provider-traffic-extractor.test.js +2 -0
  637. package/dist/utils/provider-traffic-extractor.test.js.map +1 -1
  638. package/dist/utils/settings-command.d.ts.map +1 -1
  639. package/dist/utils/settings-command.js +11 -0
  640. package/dist/utils/settings-command.js.map +1 -1
  641. package/dist/utils/terminal-clear.d.ts +7 -0
  642. package/dist/utils/terminal-clear.d.ts.map +1 -0
  643. package/dist/utils/terminal-clear.js +5 -0
  644. package/dist/utils/terminal-clear.js.map +1 -0
  645. package/dist/utils/terminal-clear.test.d.ts +2 -0
  646. package/dist/utils/terminal-clear.test.d.ts.map +1 -0
  647. package/dist/utils/terminal-clear.test.js +13 -0
  648. package/dist/utils/terminal-clear.test.js.map +1 -0
  649. package/dist/utils/token-usage.d.ts +6 -2
  650. package/dist/utils/token-usage.d.ts.map +1 -1
  651. package/dist/utils/token-usage.js +11 -4
  652. package/dist/utils/token-usage.js.map +1 -1
  653. package/dist/utils/token-usage.test.js +15 -0
  654. package/dist/utils/token-usage.test.js.map +1 -1
  655. package/dist/utils/tty-osc.d.ts +27 -0
  656. package/dist/utils/tty-osc.d.ts.map +1 -0
  657. package/dist/utils/tty-osc.js +66 -0
  658. package/dist/utils/tty-osc.js.map +1 -0
  659. package/dist/utils/tty-osc.test.d.ts +2 -0
  660. package/dist/utils/tty-osc.test.d.ts.map +1 -0
  661. package/dist/utils/tty-osc.test.js +130 -0
  662. package/dist/utils/tty-osc.test.js.map +1 -0
  663. package/package.json +2 -2
  664. package/readme.md +2 -2
  665. package/dist/agent.lite-mode.test.d.ts +0 -2
  666. package/dist/agent.lite-mode.test.d.ts.map +0 -1
  667. package/dist/agent.lite-mode.test.js +0 -39
  668. package/dist/agent.lite-mode.test.js.map +0 -1
  669. package/dist/app.large-uncached-warning.test.js +0 -15
  670. package/dist/components/ApprovalPrompt.test.d.ts +0 -2
  671. package/dist/components/ApprovalPrompt.test.d.ts.map +0 -1
  672. package/dist/components/ApprovalPrompt.test.js +0 -23
  673. package/dist/components/ApprovalPrompt.test.js.map +0 -1
  674. package/dist/components/LiveResponse.test.d.ts +0 -2
  675. package/dist/components/LiveResponse.test.d.ts.map +0 -1
  676. package/dist/components/LiveResponse.test.js +0 -13
  677. package/dist/components/LiveResponse.test.js.map +0 -1
  678. package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts +0 -2
  679. package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts.map +0 -1
  680. package/dist/components/ModelSelectionMenu.error-tabs.test.js +0 -18
  681. package/dist/components/ModelSelectionMenu.error-tabs.test.js.map +0 -1
  682. package/dist/components/TextInput.d.ts +0 -42
  683. package/dist/components/TextInput.d.ts.map +0 -1
  684. package/dist/components/TextInput.js +0 -398
  685. package/dist/components/TextInput.js.map +0 -1
  686. package/dist/components/TextInput.test.d.ts +0 -2
  687. package/dist/components/TextInput.test.d.ts.map +0 -1
  688. package/dist/components/TextInput.test.js +0 -75
  689. package/dist/components/TextInput.test.js.map +0 -1
  690. package/dist/debug_ask_mentor.d.ts +0 -2
  691. package/dist/debug_ask_mentor.d.ts.map +0 -1
  692. package/dist/debug_ask_mentor.js +0 -73
  693. package/dist/debug_ask_mentor.js.map +0 -1
  694. package/dist/hooks/use-conversation.max-turns-undo.test.d.ts +0 -2
  695. package/dist/hooks/use-conversation.max-turns-undo.test.d.ts.map +0 -1
  696. package/dist/hooks/use-conversation.max-turns-undo.test.js +0 -118
  697. package/dist/hooks/use-conversation.max-turns-undo.test.js.map +0 -1
  698. package/dist/lib/shell.d.ts +0 -7
  699. package/dist/lib/shell.d.ts.map +0 -1
  700. package/dist/lib/shell.js +0 -56
  701. package/dist/lib/shell.js.map +0 -1
  702. package/dist/modes/companion/command-index.d.ts +0 -26
  703. package/dist/modes/companion/command-index.d.ts.map +0 -1
  704. package/dist/modes/companion/command-index.js +0 -50
  705. package/dist/modes/companion/command-index.js.map +0 -1
  706. package/dist/modes/companion/command-index.test.d.ts +0 -2
  707. package/dist/modes/companion/command-index.test.d.ts.map +0 -1
  708. package/dist/modes/companion/command-index.test.js +0 -86
  709. package/dist/modes/companion/command-index.test.js.map +0 -1
  710. package/dist/modes/companion/companion-app.d.ts +0 -12
  711. package/dist/modes/companion/companion-app.d.ts.map +0 -1
  712. package/dist/modes/companion/companion-app.js +0 -297
  713. package/dist/modes/companion/companion-app.js.map +0 -1
  714. package/dist/modes/companion/companion-session.d.ts +0 -63
  715. package/dist/modes/companion/companion-session.d.ts.map +0 -1
  716. package/dist/modes/companion/companion-session.js +0 -146
  717. package/dist/modes/companion/companion-session.js.map +0 -1
  718. package/dist/modes/companion/companion-session.test.d.ts +0 -2
  719. package/dist/modes/companion/companion-session.test.d.ts.map +0 -1
  720. package/dist/modes/companion/companion-session.test.js +0 -28
  721. package/dist/modes/companion/companion-session.test.js.map +0 -1
  722. package/dist/modes/companion/components/status-bar.d.ts +0 -13
  723. package/dist/modes/companion/components/status-bar.d.ts.map +0 -1
  724. package/dist/modes/companion/components/status-bar.js +0 -26
  725. package/dist/modes/companion/components/status-bar.js.map +0 -1
  726. package/dist/modes/companion/context-buffer.d.ts +0 -65
  727. package/dist/modes/companion/context-buffer.d.ts.map +0 -1
  728. package/dist/modes/companion/context-buffer.js +0 -156
  729. package/dist/modes/companion/context-buffer.js.map +0 -1
  730. package/dist/modes/companion/context-buffer.test.d.ts +0 -2
  731. package/dist/modes/companion/context-buffer.test.d.ts.map +0 -1
  732. package/dist/modes/companion/context-buffer.test.js +0 -154
  733. package/dist/modes/companion/context-buffer.test.js.map +0 -1
  734. package/dist/modes/companion/event-detector.d.ts +0 -46
  735. package/dist/modes/companion/event-detector.d.ts.map +0 -1
  736. package/dist/modes/companion/event-detector.js +0 -169
  737. package/dist/modes/companion/event-detector.js.map +0 -1
  738. package/dist/modes/companion/event-detector.test.d.ts +0 -2
  739. package/dist/modes/companion/event-detector.test.d.ts.map +0 -1
  740. package/dist/modes/companion/event-detector.test.js +0 -121
  741. package/dist/modes/companion/event-detector.test.js.map +0 -1
  742. package/dist/modes/companion/index.d.ts +0 -33
  743. package/dist/modes/companion/index.d.ts.map +0 -1
  744. package/dist/modes/companion/index.js +0 -21
  745. package/dist/modes/companion/index.js.map +0 -1
  746. package/dist/modes/companion/input-key-mapper.d.ts +0 -3
  747. package/dist/modes/companion/input-key-mapper.d.ts.map +0 -1
  748. package/dist/modes/companion/input-key-mapper.js +0 -31
  749. package/dist/modes/companion/input-key-mapper.js.map +0 -1
  750. package/dist/modes/companion/input-key-mapper.test.d.ts +0 -2
  751. package/dist/modes/companion/input-key-mapper.test.d.ts.map +0 -1
  752. package/dist/modes/companion/input-key-mapper.test.js +0 -26
  753. package/dist/modes/companion/input-key-mapper.test.js.map +0 -1
  754. package/dist/modes/companion/input-parser.d.ts +0 -53
  755. package/dist/modes/companion/input-parser.d.ts.map +0 -1
  756. package/dist/modes/companion/input-parser.js +0 -114
  757. package/dist/modes/companion/input-parser.js.map +0 -1
  758. package/dist/modes/companion/input-parser.test.d.ts +0 -2
  759. package/dist/modes/companion/input-parser.test.d.ts.map +0 -1
  760. package/dist/modes/companion/input-parser.test.js +0 -123
  761. package/dist/modes/companion/input-parser.test.js.map +0 -1
  762. package/dist/modes/companion/mode-manager.d.ts +0 -41
  763. package/dist/modes/companion/mode-manager.d.ts.map +0 -1
  764. package/dist/modes/companion/mode-manager.js +0 -56
  765. package/dist/modes/companion/mode-manager.js.map +0 -1
  766. package/dist/modes/companion/mode-manager.test.d.ts +0 -2
  767. package/dist/modes/companion/mode-manager.test.d.ts.map +0 -1
  768. package/dist/modes/companion/mode-manager.test.js +0 -65
  769. package/dist/modes/companion/mode-manager.test.js.map +0 -1
  770. package/dist/modes/companion/output-classifier.d.ts +0 -15
  771. package/dist/modes/companion/output-classifier.d.ts.map +0 -1
  772. package/dist/modes/companion/output-classifier.js +0 -77
  773. package/dist/modes/companion/output-classifier.js.map +0 -1
  774. package/dist/modes/companion/output-classifier.test.d.ts +0 -2
  775. package/dist/modes/companion/output-classifier.test.d.ts.map +0 -1
  776. package/dist/modes/companion/output-classifier.test.js +0 -133
  777. package/dist/modes/companion/output-classifier.test.js.map +0 -1
  778. package/dist/modes/companion/pty-wrapper.d.ts +0 -46
  779. package/dist/modes/companion/pty-wrapper.d.ts.map +0 -1
  780. package/dist/modes/companion/pty-wrapper.js +0 -143
  781. package/dist/modes/companion/pty-wrapper.js.map +0 -1
  782. package/dist/modes/companion/safety-classifier.d.ts +0 -31
  783. package/dist/modes/companion/safety-classifier.d.ts.map +0 -1
  784. package/dist/modes/companion/safety-classifier.js +0 -140
  785. package/dist/modes/companion/safety-classifier.js.map +0 -1
  786. package/dist/modes/companion/safety-classifier.test.d.ts +0 -2
  787. package/dist/modes/companion/safety-classifier.test.d.ts.map +0 -1
  788. package/dist/modes/companion/safety-classifier.test.js +0 -151
  789. package/dist/modes/companion/safety-classifier.test.js.map +0 -1
  790. package/dist/modes/companion/summarizer.d.ts +0 -24
  791. package/dist/modes/companion/summarizer.d.ts.map +0 -1
  792. package/dist/modes/companion/summarizer.js +0 -132
  793. package/dist/modes/companion/summarizer.js.map +0 -1
  794. package/dist/modes/companion/terminal-history.d.ts +0 -27
  795. package/dist/modes/companion/terminal-history.d.ts.map +0 -1
  796. package/dist/modes/companion/terminal-history.js +0 -142
  797. package/dist/modes/companion/terminal-history.js.map +0 -1
  798. package/dist/prompts/simple-mentor.md +0 -215
  799. package/dist/providers/ai-sdk-openai.provider.d.ts +0 -14
  800. package/dist/providers/ai-sdk-openai.provider.d.ts.map +0 -1
  801. package/dist/providers/ai-sdk-openai.provider.js +0 -18
  802. package/dist/providers/ai-sdk-openai.provider.js.map +0 -1
  803. package/dist/providers/github-copilot/converters.d.ts +0 -45
  804. package/dist/providers/github-copilot/converters.d.ts.map +0 -1
  805. package/dist/providers/github-copilot/converters.js +0 -118
  806. package/dist/providers/github-copilot/converters.js.map +0 -1
  807. package/dist/providers/github-copilot/converters.test.d.ts +0 -2
  808. package/dist/providers/github-copilot/converters.test.d.ts.map +0 -1
  809. package/dist/providers/github-copilot/converters.test.js +0 -162
  810. package/dist/providers/github-copilot/converters.test.js.map +0 -1
  811. package/dist/providers/github-copilot/github-copilot.provider.d.ts +0 -2
  812. package/dist/providers/github-copilot/github-copilot.provider.d.ts.map +0 -1
  813. package/dist/providers/github-copilot/github-copilot.provider.js +0 -75
  814. package/dist/providers/github-copilot/github-copilot.provider.js.map +0 -1
  815. package/dist/providers/github-copilot/github-copilot.provider.test.d.ts +0 -2
  816. package/dist/providers/github-copilot/github-copilot.provider.test.d.ts.map +0 -1
  817. package/dist/providers/github-copilot/github-copilot.provider.test.js +0 -26
  818. package/dist/providers/github-copilot/github-copilot.provider.test.js.map +0 -1
  819. package/dist/providers/github-copilot/index.d.ts +0 -4
  820. package/dist/providers/github-copilot/index.d.ts.map +0 -1
  821. package/dist/providers/github-copilot/index.js +0 -4
  822. package/dist/providers/github-copilot/index.js.map +0 -1
  823. package/dist/providers/github-copilot/model.d.ts +0 -24
  824. package/dist/providers/github-copilot/model.d.ts.map +0 -1
  825. package/dist/providers/github-copilot/model.delta.test.d.ts +0 -2
  826. package/dist/providers/github-copilot/model.delta.test.d.ts.map +0 -1
  827. package/dist/providers/github-copilot/model.delta.test.js +0 -15
  828. package/dist/providers/github-copilot/model.delta.test.js.map +0 -1
  829. package/dist/providers/github-copilot/model.js +0 -498
  830. package/dist/providers/github-copilot/model.js.map +0 -1
  831. package/dist/providers/github-copilot/model.test.d.ts +0 -2
  832. package/dist/providers/github-copilot/model.test.d.ts.map +0 -1
  833. package/dist/providers/github-copilot/model.test.js +0 -63
  834. package/dist/providers/github-copilot/model.test.js.map +0 -1
  835. package/dist/providers/github-copilot/provider.d.ts +0 -15
  836. package/dist/providers/github-copilot/provider.d.ts.map +0 -1
  837. package/dist/providers/github-copilot/provider.js +0 -25
  838. package/dist/providers/github-copilot/provider.js.map +0 -1
  839. package/dist/providers/github-copilot/provider.test.d.ts +0 -2
  840. package/dist/providers/github-copilot/provider.test.d.ts.map +0 -1
  841. package/dist/providers/github-copilot/provider.test.js +0 -52
  842. package/dist/providers/github-copilot/provider.test.js.map +0 -1
  843. package/dist/providers/github-copilot/utils.d.ts +0 -20
  844. package/dist/providers/github-copilot/utils.d.ts.map +0 -1
  845. package/dist/providers/github-copilot/utils.js +0 -142
  846. package/dist/providers/github-copilot/utils.js.map +0 -1
  847. package/dist/providers/github-copilot/utils.test.d.ts +0 -2
  848. package/dist/providers/github-copilot/utils.test.d.ts.map +0 -1
  849. package/dist/providers/github-copilot/utils.test.js +0 -21
  850. package/dist/providers/github-copilot/utils.test.js.map +0 -1
  851. package/dist/providers/openai-compatible/api.d.ts +0 -17
  852. package/dist/providers/openai-compatible/api.d.ts.map +0 -1
  853. package/dist/providers/openai-compatible/api.js +0 -58
  854. package/dist/providers/openai-compatible/api.js.map +0 -1
  855. package/dist/providers/openai-compatible/model.d.ts +0 -17
  856. package/dist/providers/openai-compatible/model.d.ts.map +0 -1
  857. package/dist/providers/openai-compatible/model.js +0 -473
  858. package/dist/providers/openai-compatible/model.js.map +0 -1
  859. package/dist/providers/openai-compatible/provider.d.ts +0 -22
  860. package/dist/providers/openai-compatible/provider.d.ts.map +0 -1
  861. package/dist/providers/openai-compatible/provider.js +0 -43
  862. package/dist/providers/openai-compatible/provider.js.map +0 -1
  863. package/dist/providers/openai-compatible/reasoning-content.test.d.ts +0 -2
  864. package/dist/providers/openai-compatible/reasoning-content.test.d.ts.map +0 -1
  865. package/dist/providers/openai-compatible/reasoning-content.test.js +0 -258
  866. package/dist/providers/openai-compatible/reasoning-content.test.js.map +0 -1
  867. package/dist/providers/openai-compatible/utils.d.ts +0 -3
  868. package/dist/providers/openai-compatible/utils.d.ts.map +0 -1
  869. package/dist/providers/openai-compatible/utils.js +0 -11
  870. package/dist/providers/openai-compatible/utils.js.map +0 -1
  871. package/dist/providers/openrouter/api.d.ts +0 -39
  872. package/dist/providers/openrouter/api.d.ts.map +0 -1
  873. package/dist/providers/openrouter/api.js +0 -164
  874. package/dist/providers/openrouter/api.js.map +0 -1
  875. package/dist/providers/openrouter/converters.d.ts +0 -8
  876. package/dist/providers/openrouter/converters.d.ts.map +0 -1
  877. package/dist/providers/openrouter/converters.js +0 -391
  878. package/dist/providers/openrouter/converters.js.map +0 -1
  879. package/dist/providers/openrouter/converters.test.d.ts +0 -2
  880. package/dist/providers/openrouter/converters.test.d.ts.map +0 -1
  881. package/dist/providers/openrouter/converters.test.js +0 -179
  882. package/dist/providers/openrouter/converters.test.js.map +0 -1
  883. package/dist/providers/openrouter/index.d.ts +0 -4
  884. package/dist/providers/openrouter/index.d.ts.map +0 -1
  885. package/dist/providers/openrouter/index.js +0 -4
  886. package/dist/providers/openrouter/index.js.map +0 -1
  887. package/dist/providers/openrouter/model.d.ts +0 -14
  888. package/dist/providers/openrouter/model.d.ts.map +0 -1
  889. package/dist/providers/openrouter/model.js +0 -457
  890. package/dist/providers/openrouter/model.js.map +0 -1
  891. package/dist/providers/openrouter/provider.d.ts +0 -15
  892. package/dist/providers/openrouter/provider.d.ts.map +0 -1
  893. package/dist/providers/openrouter/provider.js +0 -21
  894. package/dist/providers/openrouter/provider.js.map +0 -1
  895. package/dist/providers/openrouter/reasoning-content.test.d.ts +0 -2
  896. package/dist/providers/openrouter/reasoning-content.test.d.ts.map +0 -1
  897. package/dist/providers/openrouter/reasoning-content.test.js +0 -122
  898. package/dist/providers/openrouter/reasoning-content.test.js.map +0 -1
  899. package/dist/providers/openrouter/utils.d.ts +0 -11
  900. package/dist/providers/openrouter/utils.d.ts.map +0 -1
  901. package/dist/providers/openrouter/utils.js +0 -29
  902. package/dist/providers/openrouter/utils.js.map +0 -1
  903. package/dist/providers/openrouter.api.retry.test.d.ts +0 -2
  904. package/dist/providers/openrouter.api.retry.test.d.ts.map +0 -1
  905. package/dist/providers/openrouter.api.retry.test.js +0 -148
  906. package/dist/providers/openrouter.api.retry.test.js.map +0 -1
  907. package/dist/providers/openrouter.test.d.ts +0 -2
  908. package/dist/providers/openrouter.test.d.ts.map +0 -1
  909. package/dist/providers/openrouter.test.js +0 -1449
  910. package/dist/providers/openrouter.test.js.map +0 -1
  911. package/dist/providers/protocol-client.d.ts +0 -17
  912. package/dist/providers/protocol-client.d.ts.map +0 -1
  913. package/dist/providers/protocol-client.js +0 -57
  914. package/dist/providers/protocol-client.js.map +0 -1
  915. package/dist/providers/protocol-client.test.d.ts +0 -2
  916. package/dist/providers/protocol-client.test.d.ts.map +0 -1
  917. package/dist/providers/protocol-client.test.js +0 -55
  918. package/dist/providers/protocol-client.test.js.map +0 -1
  919. package/dist/safety-checker.js +0 -57
  920. package/dist/services/check_mock.d.ts +0 -2
  921. package/dist/services/check_mock.d.ts.map +0 -1
  922. package/dist/services/check_mock.js +0 -22
  923. package/dist/services/check_mock.js.map +0 -1
  924. package/dist/services/conversation-service.test.d.ts +0 -2
  925. package/dist/services/conversation-service.test.d.ts.map +0 -1
  926. package/dist/services/conversation-service.test.js +0 -156
  927. package/dist/services/conversation-service.test.js.map +0 -1
  928. package/dist/services/conversation-store.merge-modes.removed.d.ts +0 -2
  929. package/dist/services/conversation-store.merge-modes.removed.d.ts.map +0 -1
  930. package/dist/services/conversation-store.merge-modes.removed.js +0 -2
  931. package/dist/services/conversation-store.merge-modes.removed.js.map +0 -1
  932. package/dist/services/repro-error.test.d.ts +0 -2
  933. package/dist/services/repro-error.test.d.ts.map +0 -1
  934. package/dist/services/repro-error.test.js +0 -38
  935. package/dist/services/repro-error.test.js.map +0 -1
  936. package/dist/services/subagents/reasoning-inheritance.test.d.ts +0 -2
  937. package/dist/services/subagents/reasoning-inheritance.test.d.ts.map +0 -1
  938. package/dist/services/subagents/reasoning-inheritance.test.js +0 -73
  939. package/dist/services/subagents/reasoning-inheritance.test.js.map +0 -1
  940. package/dist/tools/bash.d.ts +0 -10
  941. package/dist/tools/bash.d.ts.map +0 -1
  942. package/dist/tools/bash.js +0 -55
  943. package/dist/tools/bash.js.map +0 -1
  944. package/dist/utils/command-safety.d.ts +0 -21
  945. package/dist/utils/command-safety.d.ts.map +0 -1
  946. package/dist/utils/command-safety.devnull.test.d.ts +0 -2
  947. package/dist/utils/command-safety.devnull.test.d.ts.map +0 -1
  948. package/dist/utils/command-safety.devnull.test.js +0 -13
  949. package/dist/utils/command-safety.devnull.test.js.map +0 -1
  950. package/dist/utils/command-safety.js +0 -348
  951. package/dist/utils/command-safety.js.map +0 -1
  952. package/dist/utils/extract-command-messages.test.d.ts +0 -2
  953. package/dist/utils/extract-command-messages.test.d.ts.map +0 -1
  954. package/dist/utils/provider-traffic-extractor.repro.test.d.ts +0 -2
  955. package/dist/utils/provider-traffic-extractor.repro.test.d.ts.map +0 -1
  956. package/dist/utils/provider-traffic-extractor.repro.test.js.map +0 -1
@@ -2,8 +2,20 @@ import test from 'ava';
2
2
  import fs from 'node:fs';
3
3
  import path from 'node:path';
4
4
  import { ModelBehaviorError } from '@openai/agents';
5
- import { SubagentManager } from './subagent-manager.js';
5
+ import { SubagentManager as RealSubagentManager } from './subagent-manager.js';
6
6
  import { registerProvider } from '../../providers/registry.js';
7
+ const createSessionContextService = () => ({
8
+ runWithContext: (_context, fn) => fn(),
9
+ getContext: () => null,
10
+ });
11
+ const SubagentManager = class extends RealSubagentManager {
12
+ constructor(deps) {
13
+ super({
14
+ ...deps,
15
+ sessionContextService: deps.sessionContextService ?? createSessionContextService(),
16
+ });
17
+ }
18
+ };
7
19
  // ========== Mock Utilities ==========
8
20
  function createMockLogger() {
9
21
  return {
@@ -27,6 +39,9 @@ function createMockSettings(values = {}) {
27
39
  },
28
40
  };
29
41
  }
42
+ function getAgentTool(agent, name) {
43
+ return agent.tools.find((tool) => tool.name === name);
44
+ }
30
45
  // ========== Provider Mocks ==========
31
46
  let mentorManagerRunnerCalls = [];
32
47
  let mentorManagerResponseCounter = 0;
@@ -90,7 +105,11 @@ test.serial('run() returns failed result for unknown role', async (t) => {
90
105
  'agent.model': 'mock-model',
91
106
  'agent.provider': 'mock-mentor-manager',
92
107
  });
93
- const manager = new SubagentManager({ logger: createMockLogger(), settings });
108
+ const manager = new SubagentManager({
109
+ logger: createMockLogger(),
110
+ settings,
111
+ sessionContextService: createSessionContextService(),
112
+ });
94
113
  const result = await manager.run({ role: 'nonexistent-role-xyz', task: 'do something' });
95
114
  t.is(result.status, 'failed');
96
115
  t.truthy(result.error);
@@ -104,7 +123,11 @@ test.serial('run() with mentor role uses mentorModel setting', async (t) => {
104
123
  'agent.mentorModel': 'mentor-model',
105
124
  'agent.mentorProvider': 'mock-mentor-manager',
106
125
  });
107
- const manager = new SubagentManager({ logger: createMockLogger(), settings });
126
+ const manager = new SubagentManager({
127
+ logger: createMockLogger(),
128
+ settings,
129
+ sessionContextService: createSessionContextService(),
130
+ });
108
131
  const result = await manager.run({ role: 'mentor', task: 'advise me' });
109
132
  t.is(result.status, 'completed');
110
133
  t.is(result.role, 'mentor');
@@ -117,7 +140,11 @@ test.serial('run() with mentor role fails when mentorModel is not set', async (t
117
140
  'agent.model': 'main-model',
118
141
  'agent.provider': 'mock-mentor-manager',
119
142
  });
120
- const manager = new SubagentManager({ logger: createMockLogger(), settings });
143
+ const manager = new SubagentManager({
144
+ logger: createMockLogger(),
145
+ settings,
146
+ sessionContextService: createSessionContextService(),
147
+ });
121
148
  const result = await manager.run({ role: 'mentor', task: 'advise me' });
122
149
  t.is(result.status, 'failed');
123
150
  t.true(result.error.includes('Mentor model is not configured'));
@@ -129,7 +156,11 @@ test.serial('run() mentor maintains conversation history across calls', async (t
129
156
  'agent.mentorModel': 'mentor-model',
130
157
  'agent.mentorProvider': 'mock-mentor-manager',
131
158
  });
132
- const manager = new SubagentManager({ logger: createMockLogger(), settings });
159
+ const manager = new SubagentManager({
160
+ logger: createMockLogger(),
161
+ settings,
162
+ sessionContextService: createSessionContextService(),
163
+ });
133
164
  await manager.run({ role: 'mentor', task: 'first question' });
134
165
  await manager.run({ role: 'mentor', task: 'second question' });
135
166
  t.is(mentorManagerRunnerCalls.length, 2);
@@ -144,7 +175,11 @@ test.serial('resetMentorSession() clears conversation history', async (t) => {
144
175
  'agent.mentorModel': 'mentor-model',
145
176
  'agent.mentorProvider': 'mock-mentor-manager',
146
177
  });
147
- const manager = new SubagentManager({ logger: createMockLogger(), settings });
178
+ const manager = new SubagentManager({
179
+ logger: createMockLogger(),
180
+ settings,
181
+ sessionContextService: createSessionContextService(),
182
+ });
148
183
  await manager.run({ role: 'mentor', task: 'first question' });
149
184
  t.true(mentorManagerRunnerCalls[0].input.length >= 1);
150
185
  manager.resetMentorSession();
@@ -158,7 +193,11 @@ test.serial('run() with explorer role returns SubagentResult', async (t) => {
158
193
  'agent.model': 'mock-model',
159
194
  'agent.provider': 'mock-explorer-provider',
160
195
  });
161
- const manager = new SubagentManager({ logger: createMockLogger(), settings });
196
+ const manager = new SubagentManager({
197
+ logger: createMockLogger(),
198
+ settings,
199
+ sessionContextService: createSessionContextService(),
200
+ });
162
201
  const result = await manager.run({ role: 'explorer', task: 'find all TypeScript files' });
163
202
  t.is(result.status, 'completed');
164
203
  t.is(result.role, 'explorer');
@@ -171,7 +210,11 @@ test.serial('run() passes parent abort signal into the delegated provider run',
171
210
  'agent.model': 'mock-model',
172
211
  'agent.provider': 'mock-explorer-provider',
173
212
  });
174
- const manager = new SubagentManager({ logger: createMockLogger(), settings });
213
+ const manager = new SubagentManager({
214
+ logger: createMockLogger(),
215
+ settings,
216
+ sessionContextService: createSessionContextService(),
217
+ });
175
218
  const abortController = new AbortController();
176
219
  await manager.run({
177
220
  role: 'explorer',
@@ -200,7 +243,11 @@ test.serial('run() cancels a delegated provider run when the parent signal abort
200
243
  'agent.model': 'mock-model',
201
244
  'agent.provider': 'mock-aborted-subagent-provider',
202
245
  });
203
- const manager = new SubagentManager({ logger: createMockLogger(), settings });
246
+ const manager = new SubagentManager({
247
+ logger: createMockLogger(),
248
+ settings,
249
+ sessionContextService: createSessionContextService(),
250
+ });
204
251
  const abortController = new AbortController();
205
252
  const resultPromise = manager.run({
206
253
  role: 'explorer',
@@ -212,12 +259,85 @@ test.serial('run() cancels a delegated provider run when the parent signal abort
212
259
  t.is(result.status, 'cancelled');
213
260
  t.true(result.error?.includes('aborted') ?? false);
214
261
  });
262
+ test.serial('explorer shell tool executes GREEN commands and blocks YELLOW and RED commands', async (t) => {
263
+ const settings = createMockSettings({
264
+ 'agent.model': 'mock-model',
265
+ 'agent.provider': 'mock-explorer-provider',
266
+ });
267
+ const manager = new SubagentManager({
268
+ logger: createMockLogger(),
269
+ settings,
270
+ sessionContextService: createSessionContextService(),
271
+ });
272
+ await manager.run({ role: 'explorer', task: 'inspect the workspace' });
273
+ t.is(explorerRunnerCalls.length, 1);
274
+ const agent = explorerRunnerCalls[0].agent;
275
+ const shell = getAgentTool(agent, 'shell');
276
+ t.truthy(shell);
277
+ t.is(await shell.needsApproval({}, { command: 'pwd' }), false);
278
+ const invokeShell = async (command) => shell.invoke({}, JSON.stringify({ command }), {});
279
+ const blockedPrefix = 'Error: command blocked - explorer can only run read-only (GREEN) shell commands. Command: ';
280
+ for (const command of ['pwd', 'ls', 'cat package.json', 'git status', 'git log --oneline']) {
281
+ const output = await invokeShell(command);
282
+ t.true(output.includes('exit 0'), `expected GREEN command to execute: ${command}`);
283
+ t.false(output.startsWith(blockedPrefix), `expected GREEN command to not be blocked: ${command}`);
284
+ }
285
+ for (const command of ['touch blocked.txt', 'npm test', 'unknown_tool_name', 'cat ../outside.txt']) {
286
+ const output = await invokeShell(command);
287
+ t.true(output.startsWith(blockedPrefix), `expected YELLOW command to be blocked: ${command}`);
288
+ t.true(output.includes(command), `blocked output should mention the command: ${command}`);
289
+ }
290
+ for (const command of ['rm -rf x', 'sudo ls']) {
291
+ const output = await invokeShell(command);
292
+ t.true(output.startsWith(blockedPrefix), `expected RED command to be blocked: ${command}`);
293
+ t.true(output.includes(command), `blocked output should mention the command: ${command}`);
294
+ }
295
+ });
296
+ test.serial('explorer shell tool blocks write-like shell commands without creating files in a temp workspace', async (t) => {
297
+ const tmpDir = fs.mkdtempSync(path.join('/tmp', 'term2-test-explorer-shell-block-'));
298
+ t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true }));
299
+ fs.writeFileSync(path.join(tmpDir, 'source.txt'), 'source content');
300
+ const settings = createMockSettings({
301
+ 'agent.model': 'mock-model',
302
+ 'agent.provider': 'mock-explorer-provider',
303
+ });
304
+ const manager = new SubagentManager({
305
+ logger: createMockLogger(),
306
+ settings,
307
+ sessionContextService: createSessionContextService(),
308
+ executionContext: {
309
+ getCwd: () => tmpDir,
310
+ isRemote: () => false,
311
+ getSSHService: () => undefined,
312
+ },
313
+ });
314
+ await manager.run({ role: 'explorer', task: 'inspect a temp workspace' });
315
+ const agent = explorerRunnerCalls[explorerRunnerCalls.length - 1].agent;
316
+ const shell = getAgentTool(agent, 'shell');
317
+ t.truthy(shell);
318
+ const blockedPrefix = 'Error: command blocked - explorer can only run read-only (GREEN) shell commands. Command: ';
319
+ const cases = [
320
+ { command: 'touch blocked-touch.txt', path: 'blocked-touch.txt' },
321
+ { command: 'echo marker > blocked-redirect.txt', path: 'blocked-redirect.txt' },
322
+ { command: 'cat source.txt > blocked-copy.txt', path: 'blocked-copy.txt' },
323
+ { command: 'printf marker | tee blocked-tee.txt', path: 'blocked-tee.txt' },
324
+ ];
325
+ for (const { command, path: relativePath } of cases) {
326
+ const output = await shell.invoke({}, JSON.stringify({ command }), {});
327
+ t.true(output.startsWith(blockedPrefix), `expected command to be blocked: ${command}`);
328
+ t.false(fs.existsSync(path.join(tmpDir, relativePath)), `expected no file to be created: ${relativePath}`);
329
+ }
330
+ });
215
331
  test.serial('run() with explorer role uses read-only tools only', async (t) => {
216
332
  const settings = createMockSettings({
217
333
  'agent.model': 'mock-model',
218
334
  'agent.provider': 'mock-explorer-provider',
219
335
  });
220
- const manager = new SubagentManager({ logger: createMockLogger(), settings });
336
+ const manager = new SubagentManager({
337
+ logger: createMockLogger(),
338
+ settings,
339
+ sessionContextService: createSessionContextService(),
340
+ });
221
341
  await manager.run({ role: 'explorer', task: 'find files' });
222
342
  t.is(explorerRunnerCalls.length, 1);
223
343
  const agent = explorerRunnerCalls[0].agent;
@@ -233,7 +353,7 @@ test.serial('run() with explorer role uses read-only tools only', async (t) => {
233
353
  // Explorer should NOT have web tools by default
234
354
  t.false(toolNames.includes('web_search'));
235
355
  t.false(toolNames.includes('web_fetch'));
236
- t.false(toolNames.includes('shell'));
356
+ t.true(toolNames.includes('shell'));
237
357
  });
238
358
  // ========== Researcher role ==========
239
359
  let researcherRunnerCalls = [];
@@ -268,7 +388,11 @@ test.serial('run() with researcher role includes web tools', async (t) => {
268
388
  'agent.model': 'mock-model',
269
389
  'agent.provider': 'mock-researcher-provider',
270
390
  });
271
- const manager = new SubagentManager({ logger: createMockLogger(), settings });
391
+ const manager = new SubagentManager({
392
+ logger: createMockLogger(),
393
+ settings,
394
+ sessionContextService: createSessionContextService(),
395
+ });
272
396
  await manager.run({ role: 'researcher', task: 'look up the latest TypeScript release' });
273
397
  t.is(researcherRunnerCalls.length, 1);
274
398
  const agent = researcherRunnerCalls[0].agent;
@@ -313,7 +437,11 @@ test.serial('run() with worker role includes write and shell tools for non-gpt m
313
437
  'agent.model': 'mock-model',
314
438
  'agent.provider': 'mock-worker-provider',
315
439
  });
316
- const manager = new SubagentManager({ logger: createMockLogger(), settings });
440
+ const manager = new SubagentManager({
441
+ logger: createMockLogger(),
442
+ settings,
443
+ sessionContextService: createSessionContextService(),
444
+ });
317
445
  await manager.run({ role: 'worker', task: 'update the README.md file' });
318
446
  t.is(workerRunnerCalls.length, 1);
319
447
  const agent = workerRunnerCalls[0].agent;
@@ -332,7 +460,11 @@ test.serial('run() with worker role includes write and shell tools for gpt model
332
460
  'agent.model': 'gpt-5',
333
461
  'agent.provider': 'mock-worker-provider',
334
462
  });
335
- const manager = new SubagentManager({ logger: createMockLogger(), settings });
463
+ const manager = new SubagentManager({
464
+ logger: createMockLogger(),
465
+ settings,
466
+ sessionContextService: createSessionContextService(),
467
+ });
336
468
  await manager.run({ role: 'worker', task: 'update the README.md file' });
337
469
  t.is(workerRunnerCalls.length, 1);
338
470
  const agent = workerRunnerCalls[0].agent;
@@ -703,6 +835,7 @@ test.serial('run() emits started, tool_started and completed events', async (t)
703
835
  const manager = new SubagentManager({
704
836
  logger: createMockLogger(),
705
837
  settings,
838
+ sessionContextService: createSessionContextService(),
706
839
  onEvent: (event) => events.push(event),
707
840
  });
708
841
  const result = await manager.run({ role: 'explorer', task: 'search the code' });
@@ -726,6 +859,7 @@ test.serial('run() emits a completed event even when the role is unknown', async
726
859
  const manager = new SubagentManager({
727
860
  logger: createMockLogger(),
728
861
  settings,
862
+ sessionContextService: createSessionContextService(),
729
863
  onEvent: (event) => events.push(event),
730
864
  });
731
865
  await manager.run({ role: 'definitely-not-a-role', task: 'x' });
@@ -743,7 +877,11 @@ test.serial('mentor base instructions come from the mentor role markdown', async
743
877
  'agent.mentorProvider': 'mock-mentor-manager',
744
878
  'app.mentorMode': false,
745
879
  });
746
- const manager = new SubagentManager({ logger: createMockLogger(), settings });
880
+ const manager = new SubagentManager({
881
+ logger: createMockLogger(),
882
+ settings,
883
+ sessionContextService: createSessionContextService(),
884
+ });
747
885
  await manager.run({ role: 'mentor', task: 'advise me' });
748
886
  t.is(mentorManagerRunnerCalls.length, 1);
749
887
  const instructions = mentorManagerRunnerCalls[0].agent.instructions;
@@ -785,7 +923,11 @@ test.serial('finalText is the assistant message after the last tool item', async
785
923
  'agent.model': 'mock-model',
786
924
  'agent.provider': 'mock-post-tool-provider',
787
925
  });
788
- const manager = new SubagentManager({ logger: createMockLogger(), settings });
926
+ const manager = new SubagentManager({
927
+ logger: createMockLogger(),
928
+ settings,
929
+ sessionContextService: createSessionContextService(),
930
+ });
789
931
  const result = await manager.run({ role: 'explorer', task: 'where is it' });
790
932
  t.is(result.finalText, 'Final answer: it is in foo.ts.');
791
933
  t.false(result.finalText.includes('Let me look into this first.'));
@@ -821,6 +963,7 @@ test.serial('worker shell tool executes safe command without triggering approval
821
963
  'agent.model': 'mock-model',
822
964
  'agent.provider': 'mock-worker-shell-safe-provider',
823
965
  }),
966
+ sessionContextService: createSessionContextService(),
824
967
  executionContext: {
825
968
  getCwd: () => tmpDir,
826
969
  isRemote: () => false,
@@ -862,6 +1005,7 @@ test.serial('worker shell tool blocks dangerous/destructive commands and returns
862
1005
  'agent.model': 'mock-model',
863
1006
  'agent.provider': 'mock-worker-shell-dangerous-provider',
864
1007
  }),
1008
+ sessionContextService: createSessionContextService(),
865
1009
  executionContext: {
866
1010
  getCwd: () => tmpDir,
867
1011
  isRemote: () => false,
@@ -906,6 +1050,7 @@ test.serial('worker shell tool allows YELLOW command when auto-approval evaluato
906
1050
  'agent.autoApproveModel': 'mock-auto-approve-model',
907
1051
  'agent.autoApproveProvider': 'mock-worker-shell-yellow-approved-provider',
908
1052
  }),
1053
+ sessionContextService: createSessionContextService(),
909
1054
  agentClient: {
910
1055
  chat: async (message) => {
911
1056
  chatCalls++;
@@ -956,6 +1101,7 @@ test.serial('worker shell tool blocks YELLOW command when auto-approval evaluato
956
1101
  'agent.autoApproveModel': 'mock-auto-approve-model',
957
1102
  'agent.autoApproveProvider': 'mock-worker-shell-yellow-rejected-provider',
958
1103
  }),
1104
+ sessionContextService: createSessionContextService(),
959
1105
  agentClient: {
960
1106
  chat: async () => {
961
1107
  chatCalls++;
@@ -995,7 +1141,11 @@ test.serial('run() extracts usage from error.state.usage when subagent run fails
995
1141
  'agent.model': 'mock-model',
996
1142
  'agent.provider': 'mock-failed-usage-provider',
997
1143
  });
998
- const manager = new SubagentManager({ logger: createMockLogger(), settings });
1144
+ const manager = new SubagentManager({
1145
+ logger: createMockLogger(),
1146
+ settings,
1147
+ sessionContextService: createSessionContextService(),
1148
+ });
999
1149
  const result = await manager.run({
1000
1150
  role: 'explorer',
1001
1151
  task: 'find files',
@@ -1043,6 +1193,7 @@ test.serial('run() retries on recoverable model error (hallucinated tool) and su
1043
1193
  'agent.provider': 'mock-retry-recoverable-provider',
1044
1194
  'agent.retryAttempts': 2,
1045
1195
  }),
1196
+ sessionContextService: createSessionContextService(),
1046
1197
  onEvent: (event) => events.push(event),
1047
1198
  });
1048
1199
  const result = await manager.run({ role: 'explorer', task: 'find all files' });
@@ -1078,6 +1229,7 @@ test.serial('run() exhausts retries on repeated recoverable model errors and ret
1078
1229
  'agent.provider': 'mock-retry-exhaust-provider',
1079
1230
  'agent.retryAttempts': 2,
1080
1231
  }),
1232
+ sessionContextService: createSessionContextService(),
1081
1233
  onEvent: (event) => events.push(event),
1082
1234
  });
1083
1235
  const result = await manager.run({ role: 'explorer', task: 'find all files' });
@@ -1110,6 +1262,7 @@ test.serial('run() does not retry on non-recoverable ModelBehaviorError', async
1110
1262
  'agent.provider': 'mock-no-retry-non-recoverable-provider',
1111
1263
  'agent.retryAttempts': 2,
1112
1264
  }),
1265
+ sessionContextService: createSessionContextService(),
1113
1266
  onEvent: (event) => events.push(event),
1114
1267
  });
1115
1268
  const result = await manager.run({ role: 'explorer', task: 'find all files' });
@@ -1139,6 +1292,7 @@ test.serial('run() aborted subagent returns cancelled status without model-error
1139
1292
  'agent.provider': 'mock-abort-no-retry-provider',
1140
1293
  'agent.retryAttempts': 2,
1141
1294
  }),
1295
+ sessionContextService: createSessionContextService(),
1142
1296
  onEvent: (event) => events.push(event),
1143
1297
  });
1144
1298
  const result = await manager.run({ role: 'explorer', task: 'find all files' });
@@ -1183,6 +1337,7 @@ test.serial('run() retries on transient upstream error via executeWithRetry', as
1183
1337
  'agent.provider': 'mock-transient-retry-provider',
1184
1338
  'agent.retryAttempts': 2,
1185
1339
  }),
1340
+ sessionContextService: createSessionContextService(),
1186
1341
  });
1187
1342
  const result = await manager.run({ role: 'explorer', task: 'find all files' });
1188
1343
  t.is(result.status, 'completed');
@@ -1218,6 +1373,7 @@ test.serial('run() does not retry worker after a mutating write tool was invoked
1218
1373
  'agent.provider': 'mock-write-then-crash-provider',
1219
1374
  'agent.retryAttempts': 2,
1220
1375
  }),
1376
+ sessionContextService: createSessionContextService(),
1221
1377
  executionContext: {
1222
1378
  getCwd: () => tmpDir,
1223
1379
  isRemote: () => false,
@@ -1259,6 +1415,7 @@ test.serial('run() retries read-only subagent (explorer) even after read tools w
1259
1415
  'agent.provider': 'mock-explorer-read-then-crash-provider',
1260
1416
  'agent.retryAttempts': 2,
1261
1417
  }),
1418
+ sessionContextService: createSessionContextService(),
1262
1419
  });
1263
1420
  const result = await manager.run({ role: 'explorer', task: 'search for something' });
1264
1421
  t.is(result.status, 'completed');
@@ -1288,6 +1445,7 @@ test.serial('corrective retry task for hallucination names the specific bad tool
1288
1445
  'agent.provider': 'mock-corrective-hallucination-provider',
1289
1446
  'agent.retryAttempts': 2,
1290
1447
  }),
1448
+ sessionContextService: createSessionContextService(),
1291
1449
  });
1292
1450
  await manager.run({ role: 'explorer', task: 'do something' });
1293
1451
  t.is(runInputs.length, 2);
@@ -1319,6 +1477,7 @@ test.serial('corrective retry task for behavior error instructs model to produce
1319
1477
  'agent.provider': 'mock-corrective-behavior-provider',
1320
1478
  'agent.retryAttempts': 2,
1321
1479
  }),
1480
+ sessionContextService: createSessionContextService(),
1322
1481
  });
1323
1482
  await manager.run({ role: 'explorer', task: 'do something' });
1324
1483
  t.is(runInputs.length, 2);
@@ -1326,4 +1485,376 @@ test.serial('corrective retry task for behavior error instructs model to produce
1326
1485
  t.true(retryInput.includes('final'), 'corrective prompt for behavior should instruct to produce a final answer');
1327
1486
  t.true(retryInput.includes('Do not call'), 'should tell model not to call more tools');
1328
1487
  });
1488
+ test.serial('subagent run injects warning into tool output when turns left <= 5', async (t) => {
1489
+ let executeOutput = null;
1490
+ registerProvider({
1491
+ id: 'mock-subagent-maxturns-provider',
1492
+ label: 'Mock Subagent MaxTurns Provider',
1493
+ createRunner: () => ({
1494
+ run: async (agent, _input, options) => {
1495
+ if (options.callModelInputFilter) {
1496
+ // Simulate 96 turns
1497
+ for (let i = 0; i < 96; i++) {
1498
+ await options.callModelInputFilter({
1499
+ modelData: { input: [] },
1500
+ agent,
1501
+ context: options.context,
1502
+ });
1503
+ }
1504
+ }
1505
+ // Execute a tool to see if the warning is injected
1506
+ const readFileTool = agent.tools.find((tool) => tool.name === 'read_file');
1507
+ if (readFileTool) {
1508
+ const mockRunContext = {
1509
+ context: options.context,
1510
+ };
1511
+ executeOutput = await readFileTool.invoke(mockRunContext, JSON.stringify({ path: 'package.json' }), {});
1512
+ }
1513
+ return {
1514
+ status: 'completed',
1515
+ finalOutput: 'done',
1516
+ history: [],
1517
+ messages: [],
1518
+ };
1519
+ },
1520
+ }),
1521
+ fetchModels: async () => [{ id: 'mock-model' }],
1522
+ });
1523
+ const manager = new SubagentManager({
1524
+ logger: createMockLogger(),
1525
+ settings: createMockSettings({
1526
+ 'agent.model': 'mock-model',
1527
+ 'agent.provider': 'mock-subagent-maxturns-provider',
1528
+ }),
1529
+ sessionContextService: createSessionContextService(),
1530
+ });
1531
+ await manager.run({ role: 'explorer', task: 'mock task' });
1532
+ t.truthy(executeOutput);
1533
+ t.true(executeOutput.includes('approaching the maximum turn limit'), 'should contain max turns warning');
1534
+ t.true(executeOutput.includes('4 turns left'), 'should indicate correct number of turns left');
1535
+ });
1536
+ test.serial('execution subagents select subagent-safe model-family prompts and append role instructions', async (t) => {
1537
+ let constructedAgentExplorer = null;
1538
+ let constructedAgentWorker = null;
1539
+ let constructedAgentResearcher = null;
1540
+ registerProvider({
1541
+ id: 'mock-prompt-test-provider-gpt-5-codex',
1542
+ label: 'Mock Prompt Test Provider GPT-5 Codex',
1543
+ createRunner: () => ({
1544
+ run: async (agent) => {
1545
+ constructedAgentExplorer = agent;
1546
+ return { status: 'completed', finalOutput: 'done', history: [], messages: [] };
1547
+ },
1548
+ }),
1549
+ fetchModels: async () => [{ id: 'gpt-5-codex' }],
1550
+ });
1551
+ registerProvider({
1552
+ id: 'mock-prompt-test-provider-claude-3-sonnet',
1553
+ label: 'Mock Prompt Test Provider Claude 3 Sonnet',
1554
+ createRunner: () => ({
1555
+ run: async (agent) => {
1556
+ constructedAgentWorker = agent;
1557
+ return { status: 'completed', finalOutput: 'done', history: [], messages: [] };
1558
+ },
1559
+ }),
1560
+ fetchModels: async () => [{ id: 'claude-3-sonnet' }],
1561
+ });
1562
+ registerProvider({
1563
+ id: 'mock-prompt-test-provider-gpt-5-modern',
1564
+ label: 'Mock Prompt Test Provider GPT-5 Modern',
1565
+ createRunner: () => ({
1566
+ run: async (agent) => {
1567
+ constructedAgentResearcher = agent;
1568
+ return { status: 'completed', finalOutput: 'done', history: [], messages: [] };
1569
+ },
1570
+ }),
1571
+ fetchModels: async () => [{ id: 'gpt-5' }],
1572
+ });
1573
+ // 1. Run explorer subagent with gpt-5-codex
1574
+ const managerExplorer = new SubagentManager({
1575
+ logger: createMockLogger(),
1576
+ settings: createMockSettings({
1577
+ 'agent.model': 'gpt-5-codex',
1578
+ 'agent.provider': 'mock-prompt-test-provider-gpt-5-codex',
1579
+ }),
1580
+ sessionContextService: createSessionContextService(),
1581
+ });
1582
+ await managerExplorer.run({ role: 'explorer', task: 'explorer task' });
1583
+ t.truthy(constructedAgentExplorer);
1584
+ t.true(constructedAgentExplorer.instructions.includes('nested Codex-family subagent'));
1585
+ t.true(constructedAgentExplorer.instructions.includes('You are an explorer subagent.'));
1586
+ t.true(constructedAgentExplorer.instructions.includes('## Worktree Hygiene'));
1587
+ t.true(constructedAgentExplorer.instructions.includes('## Available Tool Guidance'));
1588
+ const codexIdx = constructedAgentExplorer.instructions.indexOf('nested Codex-family subagent');
1589
+ const explorerIdx = constructedAgentExplorer.instructions.indexOf('You are an explorer subagent');
1590
+ t.true(codexIdx < explorerIdx, 'Model prompt must come before role prompt');
1591
+ // 2. Run worker subagent with claude-3-sonnet
1592
+ const managerWorker = new SubagentManager({
1593
+ logger: createMockLogger(),
1594
+ settings: createMockSettings({
1595
+ 'agent.model': 'claude-3-sonnet',
1596
+ 'agent.provider': 'mock-prompt-test-provider-claude-3-sonnet',
1597
+ }),
1598
+ sessionContextService: createSessionContextService(),
1599
+ });
1600
+ await managerWorker.run({ role: 'worker', task: 'worker task' });
1601
+ t.truthy(constructedAgentWorker);
1602
+ t.true(constructedAgentWorker.instructions.includes('nested Anthropic-family subagent'));
1603
+ t.true(constructedAgentWorker.instructions.includes('You are a worker subagent.'));
1604
+ const sonnetIdx = constructedAgentWorker.instructions.indexOf('nested Anthropic-family subagent');
1605
+ const workerIdx = constructedAgentWorker.instructions.indexOf('You are a worker subagent');
1606
+ t.true(sonnetIdx < workerIdx, 'Model prompt must come before role prompt');
1607
+ const managerResearcher = new SubagentManager({
1608
+ logger: createMockLogger(),
1609
+ settings: createMockSettings({
1610
+ 'agent.model': 'gpt-5',
1611
+ 'agent.provider': 'mock-prompt-test-provider-gpt-5-modern',
1612
+ }),
1613
+ sessionContextService: createSessionContextService(),
1614
+ });
1615
+ await managerResearcher.run({ role: 'researcher', task: 'research task' });
1616
+ t.truthy(constructedAgentResearcher);
1617
+ t.true(constructedAgentResearcher.instructions.includes('nested GPT-5-family subagent'));
1618
+ t.true(constructedAgentResearcher.instructions.includes('You are a researcher subagent.'));
1619
+ });
1620
+ test.serial('execution subagent prompts exclude top-level-only prompt content', async (t) => {
1621
+ let constructedAgent = null;
1622
+ registerProvider({
1623
+ id: 'mock-top-level-exclusion-provider',
1624
+ label: 'Mock Top Level Exclusion Provider',
1625
+ createRunner: () => ({
1626
+ run: async (agent) => {
1627
+ constructedAgent = agent;
1628
+ return { status: 'completed', finalOutput: 'done', history: [], messages: [] };
1629
+ },
1630
+ }),
1631
+ fetchModels: async () => [{ id: 'gpt-5-codex' }],
1632
+ });
1633
+ const manager = new SubagentManager({
1634
+ logger: createMockLogger(),
1635
+ settings: createMockSettings({
1636
+ 'agent.model': 'gpt-5-codex',
1637
+ 'agent.provider': 'mock-top-level-exclusion-provider',
1638
+ }),
1639
+ sessionContextService: createSessionContextService(),
1640
+ });
1641
+ await manager.run({ role: 'worker', task: 'worker task' });
1642
+ t.truthy(constructedAgent);
1643
+ t.false(constructedAgent.instructions.includes('commentary channel'));
1644
+ t.false(constructedAgent.instructions.includes('final channel'));
1645
+ t.false(constructedAgent.instructions.includes('Intermediary updates'));
1646
+ t.false(constructedAgent.instructions.includes('Plan Mode Workflow'));
1647
+ t.false(constructedAgent.instructions.includes('You are Codex, a coding agent based on GPT-5.'));
1648
+ });
1649
+ test.serial('mentor subagent is NOT affected by prompt profiles', async (t) => {
1650
+ let mentorAgent = null;
1651
+ registerProvider({
1652
+ id: 'mock-prompt-test-provider-mentor',
1653
+ label: 'Mock Prompt Test Provider Mentor',
1654
+ createRunner: () => ({
1655
+ run: async (agent) => {
1656
+ mentorAgent = agent;
1657
+ return { status: 'completed', finalOutput: 'done', history: [], messages: [] };
1658
+ },
1659
+ }),
1660
+ fetchModels: async () => [{ id: 'gpt-5-codex' }],
1661
+ });
1662
+ const manager = new SubagentManager({
1663
+ logger: createMockLogger(),
1664
+ settings: createMockSettings({
1665
+ 'agent.model': 'main-model',
1666
+ 'agent.provider': 'mock-prompt-test-provider-mentor',
1667
+ 'agent.mentorModel': 'gpt-5-codex',
1668
+ 'agent.mentorProvider': 'mock-prompt-test-provider-mentor',
1669
+ 'app.mentorMode': false,
1670
+ }),
1671
+ sessionContextService: createSessionContextService(),
1672
+ });
1673
+ await manager.run({ role: 'mentor', task: 'advise me' });
1674
+ t.truthy(mentorAgent);
1675
+ t.false(mentorAgent.instructions.includes('You are Codex, a coding agent based on GPT-5.'));
1676
+ t.false(mentorAgent.instructions.includes('nested Codex-family subagent'));
1677
+ t.false(mentorAgent.instructions.includes('## Available Tool Guidance'));
1678
+ t.false(mentorAgent.instructions.includes('## Worktree Hygiene'));
1679
+ t.true(mentorAgent.instructions.includes('You are a helpful mentor assistant.'));
1680
+ });
1681
+ test.serial('subagent tool definitions conditional registration for search tools', async (t) => {
1682
+ let workerAgentShellTrue = null;
1683
+ let workerAgentShellFalse = null;
1684
+ registerProvider({
1685
+ id: 'mock-tool-test-provider-shell-true',
1686
+ label: 'Mock Tool Test Provider Shell True',
1687
+ createRunner: () => ({
1688
+ run: async (agent) => {
1689
+ workerAgentShellTrue = agent;
1690
+ return { status: 'completed', finalOutput: 'done', history: [], messages: [] };
1691
+ },
1692
+ }),
1693
+ fetchModels: async () => [{ id: 'gpt-5' }],
1694
+ });
1695
+ registerProvider({
1696
+ id: 'mock-tool-test-provider-shell-false',
1697
+ label: 'Mock Tool Test Provider Shell False',
1698
+ createRunner: () => ({
1699
+ run: async (agent) => {
1700
+ workerAgentShellFalse = agent;
1701
+ return { status: 'completed', finalOutput: 'done', history: [], messages: [] };
1702
+ },
1703
+ }),
1704
+ fetchModels: async () => [{ id: 'gpt-4o' }],
1705
+ });
1706
+ // 1. Model: gpt-5 (searchViaShell is true by default), canRunShell: true (from worker.md)
1707
+ // Explorer/worker tools should NOT contain dedicated search tools: grep and find_files.
1708
+ const managerShellTrue = new SubagentManager({
1709
+ logger: createMockLogger(),
1710
+ settings: createMockSettings({
1711
+ 'agent.model': 'gpt-5',
1712
+ 'agent.provider': 'mock-tool-test-provider-shell-true',
1713
+ 'app.searchViaShell': 'auto',
1714
+ }),
1715
+ sessionContextService: createSessionContextService(),
1716
+ });
1717
+ await managerShellTrue.run({ role: 'worker', task: 'some task' });
1718
+ t.truthy(workerAgentShellTrue);
1719
+ const toolNamesShellTrue = workerAgentShellTrue.tools.map((tool) => tool.name);
1720
+ t.false(toolNamesShellTrue.includes('grep'), 'grep tool should be omitted when searchViaShell is active and canRunShell is true');
1721
+ t.false(toolNamesShellTrue.includes('find_files'), 'find_files tool should be omitted when searchViaShell is active and canRunShell is true');
1722
+ t.true(toolNamesShellTrue.includes('shell'), 'shell tool must be registered');
1723
+ t.true(workerAgentShellTrue.instructions.includes('Registered tools:'));
1724
+ t.true(workerAgentShellTrue.instructions.includes('use `shell` with commands like `rg`'));
1725
+ t.true(workerAgentShellTrue.instructions.includes('`fd` for file search'));
1726
+ t.false(workerAgentShellTrue.instructions.includes('Use `grep` to search'));
1727
+ t.false(workerAgentShellTrue.instructions.includes('Use `find_files` to locate'));
1728
+ t.false(workerAgentShellTrue.instructions.includes('For workspace search, use the dedicated search tools'));
1729
+ // 2. Model: gpt-4o (searchViaShell is false by default), canRunShell: true
1730
+ // Tools should include dedicated grep and find_files.
1731
+ const managerShellFalse = new SubagentManager({
1732
+ logger: createMockLogger(),
1733
+ settings: createMockSettings({
1734
+ 'agent.model': 'gpt-4o',
1735
+ 'agent.provider': 'mock-tool-test-provider-shell-false',
1736
+ 'app.searchViaShell': 'auto',
1737
+ }),
1738
+ sessionContextService: createSessionContextService(),
1739
+ });
1740
+ await managerShellFalse.run({ role: 'worker', task: 'some task' });
1741
+ t.truthy(workerAgentShellFalse);
1742
+ const toolNamesShellFalse = workerAgentShellFalse.tools.map((tool) => tool.name);
1743
+ t.true(toolNamesShellFalse.includes('grep'), 'grep tool should be registered when searchViaShell is inactive');
1744
+ t.true(toolNamesShellFalse.includes('find_files'), 'find_files tool should be registered when searchViaShell is inactive');
1745
+ t.true(toolNamesShellFalse.includes('shell'), 'shell tool must be registered');
1746
+ t.true(workerAgentShellFalse.instructions.includes('For workspace search, use the dedicated search tools'));
1747
+ t.true(workerAgentShellFalse.instructions.includes('`grep`'));
1748
+ t.true(workerAgentShellFalse.instructions.includes('`find_files`'));
1749
+ t.false(workerAgentShellFalse.instructions.includes('use `shell` with commands like `rg`'));
1750
+ // 3. Model: gpt-5 with searchViaShell explicitly disabled still keeps dedicated search tools.
1751
+ const managerShellOff = new SubagentManager({
1752
+ logger: createMockLogger(),
1753
+ settings: createMockSettings({
1754
+ 'agent.model': 'gpt-5',
1755
+ 'agent.provider': 'mock-tool-test-provider-shell-true',
1756
+ 'app.searchViaShell': 'off',
1757
+ }),
1758
+ sessionContextService: createSessionContextService(),
1759
+ });
1760
+ await managerShellOff.run({ role: 'worker', task: 'some task' });
1761
+ const toolNamesShellOff = workerAgentShellTrue.tools.map((tool) => tool.name);
1762
+ t.true(toolNamesShellOff.includes('grep'), 'grep tool should remain registered when searchViaShell is off');
1763
+ t.true(toolNamesShellOff.includes('find_files'), 'find_files tool should remain registered when searchViaShell is off');
1764
+ t.true(toolNamesShellOff.includes('shell'), 'shell tool must still be registered');
1765
+ t.true(workerAgentShellTrue.instructions.includes('For workspace search, use the dedicated search tools'));
1766
+ t.false(workerAgentShellTrue.instructions.includes('use `shell` with commands like `rg`'));
1767
+ });
1768
+ test.serial('explorer uses shell search when available and researcher keeps dedicated search tools', async (t) => {
1769
+ let explorerAgent = null;
1770
+ let researcherAgent = null;
1771
+ registerProvider({
1772
+ id: 'mock-tool-test-provider-explorer-shell',
1773
+ label: 'Mock Tool Test Provider Explorer Shell',
1774
+ createRunner: () => ({
1775
+ run: async (agent) => {
1776
+ explorerAgent = agent;
1777
+ return { status: 'completed', finalOutput: 'done', history: [], messages: [] };
1778
+ },
1779
+ }),
1780
+ fetchModels: async () => [{ id: 'gpt-5' }],
1781
+ });
1782
+ registerProvider({
1783
+ id: 'mock-tool-test-provider-researcher-dedicated',
1784
+ label: 'Mock Tool Test Provider Researcher Dedicated',
1785
+ createRunner: () => ({
1786
+ run: async (agent) => {
1787
+ researcherAgent = agent;
1788
+ return { status: 'completed', finalOutput: 'done', history: [], messages: [] };
1789
+ },
1790
+ }),
1791
+ fetchModels: async () => [{ id: 'gpt-5' }],
1792
+ });
1793
+ await new SubagentManager({
1794
+ logger: createMockLogger(),
1795
+ settings: createMockSettings({
1796
+ 'agent.model': 'gpt-5',
1797
+ 'agent.provider': 'mock-tool-test-provider-explorer-shell',
1798
+ 'app.searchViaShell': 'auto',
1799
+ }),
1800
+ sessionContextService: createSessionContextService(),
1801
+ }).run({ role: 'explorer', task: 'find files' });
1802
+ await new SubagentManager({
1803
+ logger: createMockLogger(),
1804
+ settings: createMockSettings({
1805
+ 'agent.model': 'gpt-5',
1806
+ 'agent.provider': 'mock-tool-test-provider-researcher-dedicated',
1807
+ 'app.searchViaShell': 'auto',
1808
+ }),
1809
+ sessionContextService: createSessionContextService(),
1810
+ }).run({ role: 'researcher', task: 'research files' });
1811
+ t.truthy(explorerAgent);
1812
+ let toolNames = explorerAgent.tools.map((tool) => tool.name);
1813
+ t.true(toolNames.includes('shell'));
1814
+ t.false(toolNames.includes('grep'));
1815
+ t.false(toolNames.includes('find_files'));
1816
+ t.true(explorerAgent.instructions.includes('For workspace search, use `shell` with commands like `rg`'));
1817
+ t.false(explorerAgent.instructions.includes('For workspace search, use the dedicated search tools'));
1818
+ t.truthy(researcherAgent);
1819
+ toolNames = researcherAgent.tools.map((tool) => tool.name);
1820
+ t.false(toolNames.includes('shell'));
1821
+ t.true(toolNames.includes('grep'));
1822
+ t.true(toolNames.includes('find_files'));
1823
+ t.true(researcherAgent.instructions.includes('For workspace search, use the dedicated search tools'));
1824
+ t.false(researcherAgent.instructions.includes('use `shell` with commands like `rg`'));
1825
+ });
1826
+ test.serial('remote execution disables code-context tools and guidance', async (t) => {
1827
+ let remoteAgent = null;
1828
+ registerProvider({
1829
+ id: 'mock-tool-test-provider-remote',
1830
+ label: 'Mock Tool Test Provider Remote',
1831
+ createRunner: () => ({
1832
+ run: async (agent) => {
1833
+ remoteAgent = agent;
1834
+ return { status: 'completed', finalOutput: 'done', history: [], messages: [] };
1835
+ },
1836
+ }),
1837
+ fetchModels: async () => [{ id: 'gpt-4o' }],
1838
+ });
1839
+ const manager = new SubagentManager({
1840
+ logger: createMockLogger(),
1841
+ settings: createMockSettings({
1842
+ 'agent.model': 'gpt-4o',
1843
+ 'agent.provider': 'mock-tool-test-provider-remote',
1844
+ }),
1845
+ executionContext: {
1846
+ getCwd: () => '/tmp/remote-workspace',
1847
+ isRemote: () => true,
1848
+ getSSHService: () => undefined,
1849
+ },
1850
+ sessionContextService: createSessionContextService(),
1851
+ });
1852
+ await manager.run({ role: 'explorer', task: 'inspect remote files' });
1853
+ t.truthy(remoteAgent);
1854
+ const toolNames = remoteAgent.tools.map((tool) => tool.name);
1855
+ t.false(toolNames.includes('read_code_outline'));
1856
+ t.false(toolNames.includes('code_context_search'));
1857
+ t.true(remoteAgent.instructions.includes('Code-context tools are not available in this run.'));
1858
+ t.false(remoteAgent.instructions.includes('For code structure and symbol context, use:'));
1859
+ });
1329
1860
  //# sourceMappingURL=subagent-manager.test.js.map