@qduc/term2 0.7.2 → 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 (469) 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.map +1 -1
  8. package/dist/app.js +57 -12
  9. package/dist/app.js.map +1 -1
  10. package/dist/cli.integration.test.js +60 -4
  11. package/dist/cli.integration.test.js.map +1 -1
  12. package/dist/cli.js +33 -2
  13. package/dist/cli.js.map +1 -1
  14. package/dist/components/ApprovalPrompt.ask-user.test.d.ts +2 -0
  15. package/dist/components/ApprovalPrompt.ask-user.test.d.ts.map +1 -0
  16. package/dist/components/ApprovalPrompt.ask-user.test.js +108 -0
  17. package/dist/components/ApprovalPrompt.ask-user.test.js.map +1 -0
  18. package/dist/components/ApprovalPrompt.d.ts +4 -4
  19. package/dist/components/ApprovalPrompt.d.ts.map +1 -1
  20. package/dist/components/ApprovalPrompt.js +76 -13
  21. package/dist/components/ApprovalPrompt.js.map +1 -1
  22. package/dist/components/BottomArea.d.ts +7 -2
  23. package/dist/components/BottomArea.d.ts.map +1 -1
  24. package/dist/components/BottomArea.js +11 -6
  25. package/dist/components/BottomArea.js.map +1 -1
  26. package/dist/components/BottomArea.test.js +4 -3
  27. package/dist/components/BottomArea.test.js.map +1 -1
  28. package/dist/components/Common/MenuContainer.d.ts +3 -2
  29. package/dist/components/Common/MenuContainer.d.ts.map +1 -1
  30. package/dist/components/Common/MenuContainer.js +14 -2
  31. package/dist/components/Common/MenuContainer.js.map +1 -1
  32. package/dist/components/Common/MenuContainer.test.d.ts +2 -0
  33. package/dist/components/Common/MenuContainer.test.d.ts.map +1 -0
  34. package/dist/components/Common/MenuContainer.test.js +66 -0
  35. package/dist/components/Common/MenuContainer.test.js.map +1 -0
  36. package/dist/components/Input/PopupManager.d.ts +14 -0
  37. package/dist/components/Input/PopupManager.d.ts.map +1 -1
  38. package/dist/components/Input/PopupManager.js +6 -4
  39. package/dist/components/Input/PopupManager.js.map +1 -1
  40. package/dist/components/Input/popup-props.d.ts +3 -1
  41. package/dist/components/Input/popup-props.d.ts.map +1 -1
  42. package/dist/components/Input/popup-props.js +12 -1
  43. package/dist/components/Input/popup-props.js.map +1 -1
  44. package/dist/components/Input/popup-props.test.js +9 -0
  45. package/dist/components/Input/popup-props.test.js.map +1 -1
  46. package/dist/components/InputBox.d.ts +7 -0
  47. package/dist/components/InputBox.d.ts.map +1 -1
  48. package/dist/components/InputBox.js +81 -30
  49. package/dist/components/InputBox.js.map +1 -1
  50. package/dist/components/InputBox.test.js +133 -10
  51. package/dist/components/InputBox.test.js.map +1 -1
  52. package/dist/components/LargeUncachedConfirmationPrompt.d.ts +2 -1
  53. package/dist/components/LargeUncachedConfirmationPrompt.d.ts.map +1 -1
  54. package/dist/components/LargeUncachedConfirmationPrompt.js +8 -3
  55. package/dist/components/LargeUncachedConfirmationPrompt.js.map +1 -1
  56. package/dist/components/LargeUncachedConfirmationPrompt.test.js +5 -4
  57. package/dist/components/LargeUncachedConfirmationPrompt.test.js.map +1 -1
  58. package/dist/components/MessageList.d.ts +2 -1
  59. package/dist/components/MessageList.d.ts.map +1 -1
  60. package/dist/components/MessageList.js +6 -1
  61. package/dist/components/MessageList.js.map +1 -1
  62. package/dist/components/MessageList.test.js +26 -0
  63. package/dist/components/MessageList.test.js.map +1 -1
  64. package/dist/components/PathSelectionMenu.d.ts +1 -0
  65. package/dist/components/PathSelectionMenu.d.ts.map +1 -1
  66. package/dist/components/PathSelectionMenu.js +11 -9
  67. package/dist/components/PathSelectionMenu.js.map +1 -1
  68. package/dist/components/PathSelectionMenu.test.d.ts +2 -0
  69. package/dist/components/PathSelectionMenu.test.d.ts.map +1 -0
  70. package/dist/components/PathSelectionMenu.test.js +17 -0
  71. package/dist/components/PathSelectionMenu.test.js.map +1 -0
  72. package/dist/components/ProviderSelectionMenu.d.ts +15 -0
  73. package/dist/components/ProviderSelectionMenu.d.ts.map +1 -0
  74. package/dist/components/ProviderSelectionMenu.js +172 -0
  75. package/dist/components/ProviderSelectionMenu.js.map +1 -0
  76. package/dist/components/ProviderSelectionMenu.test.d.ts +2 -0
  77. package/dist/components/ProviderSelectionMenu.test.d.ts.map +1 -0
  78. package/dist/components/ProviderSelectionMenu.test.js +97 -0
  79. package/dist/components/ProviderSelectionMenu.test.js.map +1 -0
  80. package/dist/components/SettingsValueSelectionMenu.d.ts +2 -1
  81. package/dist/components/SettingsValueSelectionMenu.d.ts.map +1 -1
  82. package/dist/components/SettingsValueSelectionMenu.js +12 -6
  83. package/dist/components/SettingsValueSelectionMenu.js.map +1 -1
  84. package/dist/components/StatusBar.d.ts +1 -0
  85. package/dist/components/StatusBar.d.ts.map +1 -1
  86. package/dist/components/StatusBar.js +3 -2
  87. package/dist/components/StatusBar.js.map +1 -1
  88. package/dist/components/StatusBar.test.js +11 -0
  89. package/dist/components/StatusBar.test.js.map +1 -1
  90. package/dist/context/InputContext.d.ts +1 -1
  91. package/dist/context/InputContext.d.ts.map +1 -1
  92. package/dist/context/InputContext.js.map +1 -1
  93. package/dist/hooks/use-app-commands.d.ts +2 -1
  94. package/dist/hooks/use-app-commands.d.ts.map +1 -1
  95. package/dist/hooks/use-app-commands.js +11 -2
  96. package/dist/hooks/use-app-commands.js.map +1 -1
  97. package/dist/hooks/use-app-commands.test.js +2 -0
  98. package/dist/hooks/use-app-commands.test.js.map +1 -1
  99. package/dist/hooks/use-conversation.clear.test.js +31 -0
  100. package/dist/hooks/use-conversation.clear.test.js.map +1 -1
  101. package/dist/hooks/use-conversation.d.ts +4 -1
  102. package/dist/hooks/use-conversation.d.ts.map +1 -1
  103. package/dist/hooks/use-conversation.js +18 -2
  104. package/dist/hooks/use-conversation.js.map +1 -1
  105. package/dist/hooks/use-escape-key.d.ts +12 -3
  106. package/dist/hooks/use-escape-key.d.ts.map +1 -1
  107. package/dist/hooks/use-escape-key.js +25 -11
  108. package/dist/hooks/use-escape-key.js.map +1 -1
  109. package/dist/hooks/use-escape-key.test.js +154 -14
  110. package/dist/hooks/use-escape-key.test.js.map +1 -1
  111. package/dist/hooks/use-mode-handlers.d.ts +13 -1
  112. package/dist/hooks/use-mode-handlers.d.ts.map +1 -1
  113. package/dist/hooks/use-mode-handlers.js +22 -1
  114. package/dist/hooks/use-mode-handlers.js.map +1 -1
  115. package/dist/hooks/use-mode-handlers.test.d.ts +2 -0
  116. package/dist/hooks/use-mode-handlers.test.d.ts.map +1 -0
  117. package/dist/hooks/use-mode-handlers.test.js +119 -0
  118. package/dist/hooks/use-mode-handlers.test.js.map +1 -0
  119. package/dist/hooks/use-path-completion.d.ts +10 -3
  120. package/dist/hooks/use-path-completion.d.ts.map +1 -1
  121. package/dist/hooks/use-path-completion.js +53 -9
  122. package/dist/hooks/use-path-completion.js.map +1 -1
  123. package/dist/hooks/use-path-completion.test.js +61 -49
  124. package/dist/hooks/use-path-completion.test.js.map +1 -1
  125. package/dist/hooks/use-provider-selection.d.ts +60 -0
  126. package/dist/hooks/use-provider-selection.d.ts.map +1 -0
  127. package/dist/hooks/use-provider-selection.js +767 -0
  128. package/dist/hooks/use-provider-selection.js.map +1 -0
  129. package/dist/hooks/use-provider-selection.test.d.ts +2 -0
  130. package/dist/hooks/use-provider-selection.test.d.ts.map +1 -0
  131. package/dist/hooks/use-provider-selection.test.js +793 -0
  132. package/dist/hooks/use-provider-selection.test.js.map +1 -0
  133. package/dist/hooks/use-runtime-settings.d.ts.map +1 -1
  134. package/dist/hooks/use-runtime-settings.js +2 -2
  135. package/dist/hooks/use-runtime-settings.js.map +1 -1
  136. package/dist/hooks/use-selection.d.ts +3 -1
  137. package/dist/hooks/use-selection.d.ts.map +1 -1
  138. package/dist/hooks/use-selection.js +115 -24
  139. package/dist/hooks/use-selection.js.map +1 -1
  140. package/dist/hooks/use-selection.test.js +96 -2
  141. package/dist/hooks/use-selection.test.js.map +1 -1
  142. package/dist/hooks/use-settings-value-completion.d.ts +3 -0
  143. package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
  144. package/dist/hooks/use-settings-value-completion.js +140 -18
  145. package/dist/hooks/use-settings-value-completion.js.map +1 -1
  146. package/dist/hooks/use-settings-value-completion.test.js +71 -1
  147. package/dist/hooks/use-settings-value-completion.test.js.map +1 -1
  148. package/dist/hooks/use-trigger-detection.d.ts +4 -2
  149. package/dist/hooks/use-trigger-detection.d.ts.map +1 -1
  150. package/dist/hooks/use-trigger-detection.js +42 -8
  151. package/dist/hooks/use-trigger-detection.js.map +1 -1
  152. package/dist/hooks/use-trigger-detection.test.js +2 -1
  153. package/dist/hooks/use-trigger-detection.test.js.map +1 -1
  154. package/dist/lib/openai-agent-client.chat.test.js +8 -0
  155. package/dist/lib/openai-agent-client.chat.test.js.map +1 -1
  156. package/dist/lib/openai-agent-client.d.ts +11 -6
  157. package/dist/lib/openai-agent-client.d.ts.map +1 -1
  158. package/dist/lib/openai-agent-client.js +199 -15
  159. package/dist/lib/openai-agent-client.js.map +1 -1
  160. package/dist/lib/openai-agent-client.public-methods.test.js +326 -23
  161. package/dist/lib/openai-agent-client.public-methods.test.js.map +1 -1
  162. package/dist/lib/openai-agent-client.test.js +62 -0
  163. package/dist/lib/openai-agent-client.test.js.map +1 -1
  164. package/dist/lib/tool-invoke.d.ts +27 -0
  165. package/dist/lib/tool-invoke.d.ts.map +1 -1
  166. package/dist/lib/tool-invoke.js +124 -95
  167. package/dist/lib/tool-invoke.js.map +1 -1
  168. package/dist/lib/tool-invoke.test.js +84 -22
  169. package/dist/lib/tool-invoke.test.js.map +1 -1
  170. package/dist/non-interactive.d.ts +2 -1
  171. package/dist/non-interactive.d.ts.map +1 -1
  172. package/dist/non-interactive.js +10 -2
  173. package/dist/non-interactive.js.map +1 -1
  174. package/dist/prompts/orchestrator.md +27 -41
  175. package/dist/prompts/plan-mode-info.md +2 -0
  176. package/dist/prompts/prompt-constructor.d.ts.map +1 -1
  177. package/dist/prompts/prompt-constructor.js +8 -0
  178. package/dist/prompts/prompt-constructor.js.map +1 -1
  179. package/dist/prompts/prompt-constructor.test.js +13 -0
  180. package/dist/prompts/prompt-constructor.test.js.map +1 -1
  181. package/dist/prompts/prompt-constructor.test.ts +16 -0
  182. package/dist/prompts/prompt-constructor.ts +10 -0
  183. package/dist/prompts/subagent-delegation.d.ts.map +1 -1
  184. package/dist/prompts/subagent-delegation.js +17 -1
  185. package/dist/prompts/subagent-delegation.js.map +1 -1
  186. package/dist/prompts/subagent-delegation.test.js +21 -0
  187. package/dist/prompts/subagent-delegation.test.js.map +1 -1
  188. package/dist/prompts/subagent-delegation.test.ts +26 -0
  189. package/dist/prompts/subagent-delegation.ts +17 -1
  190. package/dist/prompts/subagents/base-anthropic.md +3 -0
  191. package/dist/prompts/subagents/base-codex.md +3 -0
  192. package/dist/prompts/subagents/base-gpt-5-modern.md +3 -0
  193. package/dist/prompts/subagents/base-simple.md +3 -0
  194. package/dist/prompts/subagents/explorer.md +8 -10
  195. package/dist/prompts/subagents/researcher.md +2 -1
  196. package/dist/prompts/subagents/worker.md +12 -3
  197. package/dist/prompts/subagents/worktree-hygiene.md +6 -0
  198. package/dist/providers/ai-sdk-anthropic.provider.d.ts +4 -1
  199. package/dist/providers/ai-sdk-anthropic.provider.d.ts.map +1 -1
  200. package/dist/providers/ai-sdk-anthropic.provider.js +65 -22
  201. package/dist/providers/ai-sdk-anthropic.provider.js.map +1 -1
  202. package/dist/providers/ai-sdk-anthropic.provider.test.js +24 -1
  203. package/dist/providers/ai-sdk-anthropic.provider.test.js.map +1 -1
  204. package/dist/providers/anthropic-middleware.d.ts +25 -0
  205. package/dist/providers/anthropic-middleware.d.ts.map +1 -0
  206. package/dist/providers/anthropic-middleware.js +32 -0
  207. package/dist/providers/anthropic-middleware.js.map +1 -0
  208. package/dist/providers/anthropic-middleware.test.d.ts +2 -0
  209. package/dist/providers/anthropic-middleware.test.d.ts.map +1 -0
  210. package/dist/providers/anthropic-middleware.test.js +142 -0
  211. package/dist/providers/anthropic-middleware.test.js.map +1 -0
  212. package/dist/providers/codex-responses-model.d.ts.map +1 -1
  213. package/dist/providers/codex-responses-model.js +47 -30
  214. package/dist/providers/codex-responses-model.js.map +1 -1
  215. package/dist/providers/codex-responses-model.test.js +31 -0
  216. package/dist/providers/codex-responses-model.test.js.map +1 -1
  217. package/dist/providers/codex.provider.d.ts.map +1 -1
  218. package/dist/providers/codex.provider.js +16 -9
  219. package/dist/providers/codex.provider.js.map +1 -1
  220. package/dist/providers/codex.provider.test.js +2 -1
  221. package/dist/providers/codex.provider.test.js.map +1 -1
  222. package/dist/providers/custom-provider-adapter.test.js +6 -2
  223. package/dist/providers/custom-provider-adapter.test.js.map +1 -1
  224. package/dist/providers/fallback-responses-model.d.ts +3 -1
  225. package/dist/providers/fallback-responses-model.d.ts.map +1 -1
  226. package/dist/providers/fallback-responses-model.js +22 -3
  227. package/dist/providers/fallback-responses-model.js.map +1 -1
  228. package/dist/providers/fallback-responses-model.test.js +36 -8
  229. package/dist/providers/fallback-responses-model.test.js.map +1 -1
  230. package/dist/providers/fetch/composer.d.ts +1 -0
  231. package/dist/providers/fetch/composer.d.ts.map +1 -1
  232. package/dist/providers/fetch/composer.js +1 -0
  233. package/dist/providers/fetch/composer.js.map +1 -1
  234. package/dist/providers/fetch/composer.test.js +58 -17
  235. package/dist/providers/fetch/composer.test.js.map +1 -1
  236. package/dist/providers/fetch/logging-middleware.d.ts +3 -2
  237. package/dist/providers/fetch/logging-middleware.d.ts.map +1 -1
  238. package/dist/providers/fetch/logging-middleware.js +5 -2
  239. package/dist/providers/fetch/logging-middleware.js.map +1 -1
  240. package/dist/providers/openai-compatible-lazy.d.ts.map +1 -1
  241. package/dist/providers/openai-compatible-lazy.js +2 -1
  242. package/dist/providers/openai-compatible-lazy.js.map +1 -1
  243. package/dist/providers/openai-compatible-middleware.d.ts +5 -2
  244. package/dist/providers/openai-compatible-middleware.d.ts.map +1 -1
  245. package/dist/providers/openai-compatible-middleware.js +8 -11
  246. package/dist/providers/openai-compatible-middleware.js.map +1 -1
  247. package/dist/providers/openai-compatible.provider.d.ts +5 -1
  248. package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
  249. package/dist/providers/openai-compatible.provider.js +59 -37
  250. package/dist/providers/openai-compatible.provider.js.map +1 -1
  251. package/dist/providers/openai-compatible.provider.test.js +67 -3
  252. package/dist/providers/openai-compatible.provider.test.js.map +1 -1
  253. package/dist/providers/openai.provider.d.ts +8 -1
  254. package/dist/providers/openai.provider.d.ts.map +1 -1
  255. package/dist/providers/openai.provider.js +43 -10
  256. package/dist/providers/openai.provider.js.map +1 -1
  257. package/dist/providers/openai.provider.test.js +53 -16
  258. package/dist/providers/openai.provider.test.js.map +1 -1
  259. package/dist/providers/opencode-routing.d.ts +4 -0
  260. package/dist/providers/opencode-routing.d.ts.map +1 -0
  261. package/dist/providers/opencode-routing.js +14 -0
  262. package/dist/providers/opencode-routing.js.map +1 -0
  263. package/dist/providers/opencode-session.d.ts +19 -0
  264. package/dist/providers/opencode-session.d.ts.map +1 -0
  265. package/dist/providers/opencode-session.js +76 -0
  266. package/dist/providers/opencode-session.js.map +1 -0
  267. package/dist/providers/opencode.provider.d.ts +0 -8
  268. package/dist/providers/opencode.provider.d.ts.map +1 -1
  269. package/dist/providers/opencode.provider.js +0 -32
  270. package/dist/providers/opencode.provider.js.map +1 -1
  271. package/dist/providers/opencode.provider.test.d.ts +2 -0
  272. package/dist/providers/opencode.provider.test.d.ts.map +1 -0
  273. package/dist/providers/opencode.provider.test.js +186 -0
  274. package/dist/providers/opencode.provider.test.js.map +1 -0
  275. package/dist/providers/openrouter.provider.createRunner.test.js +5 -0
  276. package/dist/providers/openrouter.provider.createRunner.test.js.map +1 -1
  277. package/dist/providers/openrouter.provider.d.ts.map +1 -1
  278. package/dist/providers/openrouter.provider.js +8 -4
  279. package/dist/providers/openrouter.provider.js.map +1 -1
  280. package/dist/providers/registry.d.ts +3 -0
  281. package/dist/providers/registry.d.ts.map +1 -1
  282. package/dist/providers/registry.js.map +1 -1
  283. package/dist/providers/registry.test.js +1 -0
  284. package/dist/providers/registry.test.js.map +1 -1
  285. package/dist/scripts/eval-auto-approval/runner.js +4 -0
  286. package/dist/scripts/eval-auto-approval/runner.js.map +1 -1
  287. package/dist/services/conversation-integration.test.js +8 -4
  288. package/dist/services/conversation-integration.test.js.map +1 -1
  289. package/dist/services/conversation-persistence.test.js +7 -0
  290. package/dist/services/conversation-persistence.test.js.map +1 -1
  291. package/dist/services/conversation-replay.d.ts.map +1 -1
  292. package/dist/services/conversation-replay.js +95 -4
  293. package/dist/services/conversation-replay.js.map +1 -1
  294. package/dist/services/conversation-replay.test.js +312 -0
  295. package/dist/services/conversation-replay.test.js.map +1 -1
  296. package/dist/services/conversation-result-builder.test.js +9 -0
  297. package/dist/services/conversation-result-builder.test.js.map +1 -1
  298. package/dist/services/conversation-service.d.ts +3 -1
  299. package/dist/services/conversation-service.d.ts.map +1 -1
  300. package/dist/services/conversation-service.js +3 -0
  301. package/dist/services/conversation-service.js.map +1 -1
  302. package/dist/services/conversation-session-reasoning.test.js +5 -1
  303. package/dist/services/conversation-session-reasoning.test.js.map +1 -1
  304. package/dist/services/conversation-session.auto-approval.test.js +25 -1
  305. package/dist/services/conversation-session.auto-approval.test.js.map +1 -1
  306. package/dist/services/conversation-session.d.ts +7 -2
  307. package/dist/services/conversation-session.d.ts.map +1 -1
  308. package/dist/services/conversation-session.js +70 -45
  309. package/dist/services/conversation-session.js.map +1 -1
  310. package/dist/services/file-service.d.ts +20 -4
  311. package/dist/services/file-service.d.ts.map +1 -1
  312. package/dist/services/file-service.js +111 -52
  313. package/dist/services/file-service.js.map +1 -1
  314. package/dist/services/file-service.test.d.ts +2 -0
  315. package/dist/services/file-service.test.d.ts.map +1 -0
  316. package/dist/services/file-service.test.js +60 -0
  317. package/dist/services/file-service.test.js.map +1 -0
  318. package/dist/services/logging-service.d.ts +0 -3
  319. package/dist/services/logging-service.d.ts.map +1 -1
  320. package/dist/services/logging-service.js +12 -8
  321. package/dist/services/logging-service.js.map +1 -1
  322. package/dist/services/mode-notices.d.ts +4 -5
  323. package/dist/services/mode-notices.d.ts.map +1 -1
  324. package/dist/services/mode-notices.js +4 -5
  325. package/dist/services/mode-notices.js.map +1 -1
  326. package/dist/services/notification-service.d.ts +31 -11
  327. package/dist/services/notification-service.d.ts.map +1 -1
  328. package/dist/services/notification-service.js +88 -40
  329. package/dist/services/notification-service.js.map +1 -1
  330. package/dist/services/notification-service.test.js +135 -62
  331. package/dist/services/notification-service.test.js.map +1 -1
  332. package/dist/services/provider-traffic.d.ts +8 -9
  333. package/dist/services/provider-traffic.d.ts.map +1 -1
  334. package/dist/services/provider-traffic.js +24 -12
  335. package/dist/services/provider-traffic.js.map +1 -1
  336. package/dist/services/provider-traffic.test.js +51 -1
  337. package/dist/services/provider-traffic.test.js.map +1 -1
  338. package/dist/services/service-interfaces.d.ts +12 -16
  339. package/dist/services/service-interfaces.d.ts.map +1 -1
  340. package/dist/services/session-context-service.d.ts +8 -0
  341. package/dist/services/session-context-service.d.ts.map +1 -0
  342. package/dist/services/session-context-service.js +19 -0
  343. package/dist/services/session-context-service.js.map +1 -0
  344. package/dist/services/session-context-service.test.d.ts +2 -0
  345. package/dist/services/session-context-service.test.d.ts.map +1 -0
  346. package/dist/services/session-context-service.test.js +38 -0
  347. package/dist/services/session-context-service.test.js.map +1 -0
  348. package/dist/services/settings-env.d.ts.map +1 -1
  349. package/dist/services/settings-env.js +4 -1
  350. package/dist/services/settings-env.js.map +1 -1
  351. package/dist/services/settings-persistence.d.ts.map +1 -1
  352. package/dist/services/settings-persistence.js +0 -1
  353. package/dist/services/settings-persistence.js.map +1 -1
  354. package/dist/services/settings-persistence.test.js +2 -2
  355. package/dist/services/settings-persistence.test.js.map +1 -1
  356. package/dist/services/settings-schema.d.ts +9 -0
  357. package/dist/services/settings-schema.d.ts.map +1 -1
  358. package/dist/services/settings-schema.js +15 -4
  359. package/dist/services/settings-schema.js.map +1 -1
  360. package/dist/services/settings-service.d.ts +8 -0
  361. package/dist/services/settings-service.d.ts.map +1 -1
  362. package/dist/services/settings-service.js +58 -21
  363. package/dist/services/settings-service.js.map +1 -1
  364. package/dist/services/shell-auto-approval-evaluator.d.ts +3 -2
  365. package/dist/services/shell-auto-approval-evaluator.d.ts.map +1 -1
  366. package/dist/services/shell-auto-approval-evaluator.js +3 -3
  367. package/dist/services/shell-auto-approval-evaluator.js.map +1 -1
  368. package/dist/services/shell-auto-approval-evaluator.test.js +20 -0
  369. package/dist/services/shell-auto-approval-evaluator.test.js.map +1 -1
  370. package/dist/services/shell-auto-approval-resolver.d.ts +2 -1
  371. package/dist/services/shell-auto-approval-resolver.d.ts.map +1 -1
  372. package/dist/services/shell-auto-approval-resolver.js +2 -0
  373. package/dist/services/shell-auto-approval-resolver.js.map +1 -1
  374. package/dist/services/shell-auto-approval-resolver.test.js +10 -0
  375. package/dist/services/shell-auto-approval-resolver.test.js.map +1 -1
  376. package/dist/services/subagents/subagent-manager.d.ts +2 -1
  377. package/dist/services/subagents/subagent-manager.d.ts.map +1 -1
  378. package/dist/services/subagents/subagent-manager.js +182 -13
  379. package/dist/services/subagents/subagent-manager.js.map +1 -1
  380. package/dist/services/subagents/subagent-manager.test.js +548 -17
  381. package/dist/services/subagents/subagent-manager.test.js.map +1 -1
  382. package/dist/tools/apply-patch.d.ts.map +1 -1
  383. package/dist/tools/apply-patch.js +2 -2
  384. package/dist/tools/apply-patch.js.map +1 -1
  385. package/dist/tools/ask-user-constants.d.ts +7 -0
  386. package/dist/tools/ask-user-constants.d.ts.map +1 -0
  387. package/dist/tools/ask-user-constants.js +7 -0
  388. package/dist/tools/ask-user-constants.js.map +1 -0
  389. package/dist/tools/ask-user.d.ts +11 -0
  390. package/dist/tools/ask-user.d.ts.map +1 -0
  391. package/dist/tools/ask-user.js +56 -0
  392. package/dist/tools/ask-user.js.map +1 -0
  393. package/dist/tools/ask-user.test.d.ts +2 -0
  394. package/dist/tools/ask-user.test.d.ts.map +1 -0
  395. package/dist/tools/ask-user.test.js +129 -0
  396. package/dist/tools/ask-user.test.js.map +1 -0
  397. package/dist/tools/format-helpers.d.ts +13 -0
  398. package/dist/tools/format-helpers.d.ts.map +1 -1
  399. package/dist/tools/format-helpers.js +34 -0
  400. package/dist/tools/format-helpers.js.map +1 -1
  401. package/dist/tools/format-helpers.test.d.ts +2 -0
  402. package/dist/tools/format-helpers.test.d.ts.map +1 -0
  403. package/dist/tools/format-helpers.test.js +51 -0
  404. package/dist/tools/format-helpers.test.js.map +1 -0
  405. package/dist/tools/search-replace.d.ts.map +1 -1
  406. package/dist/tools/search-replace.js +2 -2
  407. package/dist/tools/search-replace.js.map +1 -1
  408. package/dist/tools/tool-names.d.ts +1 -0
  409. package/dist/tools/tool-names.d.ts.map +1 -1
  410. package/dist/tools/tool-names.js +1 -0
  411. package/dist/tools/tool-names.js.map +1 -1
  412. package/dist/utils/command-safety/_scratch-classify.test.d.ts +2 -0
  413. package/dist/utils/command-safety/_scratch-classify.test.d.ts.map +1 -0
  414. package/dist/utils/command-safety/_scratch-classify.test.js +22 -0
  415. package/dist/utils/command-safety/_scratch-classify.test.js.map +1 -0
  416. package/dist/utils/command-safety/constants.d.ts.map +1 -1
  417. package/dist/utils/command-safety/constants.js +21 -0
  418. package/dist/utils/command-safety/constants.js.map +1 -1
  419. package/dist/utils/command-safety/handlers/git-handler.d.ts.map +1 -1
  420. package/dist/utils/command-safety/handlers/git-handler.js +28 -2
  421. package/dist/utils/command-safety/handlers/git-handler.js.map +1 -1
  422. package/dist/utils/command-safety/path-analysis.d.ts.map +1 -1
  423. package/dist/utils/command-safety/path-analysis.js +6 -0
  424. package/dist/utils/command-safety/path-analysis.js.map +1 -1
  425. package/dist/utils/command-safety/scratch-classify.test.d.ts +2 -0
  426. package/dist/utils/command-safety/scratch-classify.test.d.ts.map +1 -0
  427. package/dist/utils/command-safety/scratch-classify.test.js +22 -0
  428. package/dist/utils/command-safety/scratch-classify.test.js.map +1 -0
  429. package/dist/utils/command-safety/scratch-tally.test.d.ts +2 -0
  430. package/dist/utils/command-safety/scratch-tally.test.d.ts.map +1 -0
  431. package/dist/utils/command-safety/scratch-tally.test.js +68 -0
  432. package/dist/utils/command-safety/scratch-tally.test.js.map +1 -0
  433. package/dist/utils/command-safety.evaluator-false-positives.test.d.ts +2 -0
  434. package/dist/utils/command-safety.evaluator-false-positives.test.d.ts.map +1 -0
  435. package/dist/utils/command-safety.evaluator-false-positives.test.js +72 -0
  436. package/dist/utils/command-safety.evaluator-false-positives.test.js.map +1 -0
  437. package/dist/utils/header-sanitizer.d.ts +2 -0
  438. package/dist/utils/header-sanitizer.d.ts.map +1 -0
  439. package/dist/utils/header-sanitizer.js +38 -0
  440. package/dist/utils/header-sanitizer.js.map +1 -0
  441. package/dist/utils/header-sanitizer.test.d.ts +2 -0
  442. package/dist/utils/header-sanitizer.test.d.ts.map +1 -0
  443. package/dist/utils/header-sanitizer.test.js +56 -0
  444. package/dist/utils/header-sanitizer.test.js.map +1 -0
  445. package/dist/utils/home-directory-start-guard.d.ts +10 -0
  446. package/dist/utils/home-directory-start-guard.d.ts.map +1 -0
  447. package/dist/utils/home-directory-start-guard.js +20 -0
  448. package/dist/utils/home-directory-start-guard.js.map +1 -0
  449. package/dist/utils/home-directory-start-guard.test.d.ts +2 -0
  450. package/dist/utils/home-directory-start-guard.test.d.ts.map +1 -0
  451. package/dist/utils/home-directory-start-guard.test.js +40 -0
  452. package/dist/utils/home-directory-start-guard.test.js.map +1 -0
  453. package/dist/utils/inject-warning-into-tool-output.d.ts +2 -0
  454. package/dist/utils/inject-warning-into-tool-output.d.ts.map +1 -0
  455. package/dist/utils/inject-warning-into-tool-output.js +66 -0
  456. package/dist/utils/inject-warning-into-tool-output.js.map +1 -0
  457. package/dist/utils/provider-traffic-extractor.d.ts +1 -0
  458. package/dist/utils/provider-traffic-extractor.d.ts.map +1 -1
  459. package/dist/utils/provider-traffic-extractor.js +1 -0
  460. package/dist/utils/provider-traffic-extractor.js.map +1 -1
  461. package/dist/utils/provider-traffic-extractor.test.js +2 -0
  462. package/dist/utils/provider-traffic-extractor.test.js.map +1 -1
  463. package/dist/utils/token-usage.d.ts +3 -1
  464. package/dist/utils/token-usage.d.ts.map +1 -1
  465. package/dist/utils/token-usage.js +7 -2
  466. package/dist/utils/token-usage.js.map +1 -1
  467. package/dist/utils/token-usage.test.js +15 -0
  468. package/dist/utils/token-usage.test.js.map +1 -1
  469. package/package.json +1 -1
@@ -22,3 +22,29 @@ test('getSubagentDelegationAddendum includes self-service fallback when orchestr
22
22
 
23
23
  t.true(result.includes('just do it yourself'));
24
24
  });
25
+
26
+ test('orchestrator mode includes safe coordination guidance', (t) => {
27
+ const result = getSubagentDelegationAddendum({ orchestratorMode: true });
28
+ t.true(result.includes('safe coordination over maximum parallelism'));
29
+ });
30
+
31
+ test('orchestrator mode includes coupled or multi-worker language', (t) => {
32
+ const result = getSubagentDelegationAddendum({ orchestratorMode: true });
33
+ t.true(result.includes('coupled or multi-worker'));
34
+ });
35
+
36
+ test('orchestrator mode includes ownership language', (t) => {
37
+ const result = getSubagentDelegationAddendum({ orchestratorMode: true });
38
+ t.true(result.includes('Which worker owns'));
39
+ });
40
+
41
+ test('orchestrator mode says not to over-process simple single-worker tasks', (t) => {
42
+ const result = getSubagentDelegationAddendum({ orchestratorMode: true });
43
+ t.true(result.includes('Do not over-process'));
44
+ });
45
+
46
+ test('non-orchestrator mode does not include coordination checklist', (t) => {
47
+ const result = getSubagentDelegationAddendum({ orchestratorMode: false });
48
+ t.false(result.includes('coupled or multi-worker'));
49
+ t.false(result.includes('Coordination checklist'));
50
+ });
@@ -21,7 +21,23 @@ You have a \`run_subagent\` tool. A subagent runs in its own context and returns
21
21
  orchestratorMode
22
22
  ? `
23
23
 
24
- In Orchestrator mode, answer directly only when no tool-backed work is needed. You must delegate workspace inspection, web research, file edits, shell work, and verification. For interactive back-and-forth with the user, respond directly. Only delegate once the next concrete unit of work is clear.`
24
+ In Orchestrator mode, answer directly only when no tool-backed work is needed. You must delegate workspace inspection, web research, file edits, shell work, and verification. For interactive back-and-forth with the user, respond directly. Only delegate once the next concrete unit of work is clear.
25
+
26
+ **Coordination principles** — default to safe coordination over maximum parallelism:
27
+
28
+ **Coordination checklist for coupled or multi-worker implementation:**
29
+
30
+ For coupled or multi-worker implementation, identify before delegating:
31
+ - Shared files or likely conflict points
32
+ - Contracts/APIs/schemas/state flows that must remain stable
33
+ - Which worker owns which files or modules
34
+ - Files workers should treat as read-only, if relevant
35
+ - Validation each worker should run
36
+ - Stop conditions where a worker should report instead of guessing
37
+
38
+ Include ownership and scope details naturally in each worker's task text — no rigid format required.
39
+
40
+ Do not over-process simple single-worker tasks. A clear task, bounded scope, and validation command are enough.`
25
41
  : `
26
42
 
27
43
  Otherwise, just do it yourself — especially when the task needs mid-flight course-correction, user back-and-forth, fuzzy judgment, or is the user's actual deliverable they expect to watch.`
@@ -0,0 +1,3 @@
1
+ You are a nested Anthropic-family subagent working on a bounded task from a parent agent.
2
+
3
+ Prioritize accurate synthesis, careful tool use, and concise reporting. Use the provided task and environment as your source of truth, and do not assume tools or context that are not explicitly available.
@@ -0,0 +1,3 @@
1
+ You are a nested Codex-family subagent working on a bounded software engineering task from a parent agent.
2
+
3
+ Be direct, inspect before acting, prefer small verifiable changes, and return a concise result that clearly states what was found or changed. Use only the tools made available for this nested run.
@@ -0,0 +1,3 @@
1
+ You are a nested GPT-5-family subagent working on a bounded software engineering task from a parent agent.
2
+
3
+ Use concise reasoning, gather only the context needed, act within the assigned scope, and return a result that is easy for the parent agent to use. Use only the tools made available for this nested run.
@@ -0,0 +1,3 @@
1
+ You are a nested subagent working on a bounded task from a parent agent.
2
+
3
+ Focus on the assigned task, use the available tools deliberately, and return a concise result that the parent agent can act on. Do not assume access to context that was not provided in the task or environment section.
@@ -1,12 +1,12 @@
1
1
  ---
2
2
  name: Explorer
3
- description: read-only workspace access. Use for locating files and answering codebase questions.
3
+ description: read-only workspace access with safe shell commands. Use for locating files, answering codebase questions, and checking workspace state.
4
4
  model: inherit
5
5
  provider: inherit
6
6
  canRead: true
7
7
  canWrite: false
8
8
  canSearchWeb: false
9
- canRunShell: false
9
+ canRunShell: true
10
10
  maxTurns: 100
11
11
  ---
12
12
 
@@ -14,22 +14,20 @@ You are an explorer subagent. Your job is to locate relevant files, summarize st
14
14
 
15
15
  ## Capabilities
16
16
 
17
- You have read-only access to the workspace. You cannot modify files, run shell commands, or access the web.
17
+ You have read-only access to the workspace and may run safe read-only shell commands for inspection. You cannot modify files, run state-changing commands, or access the web.
18
18
 
19
19
  ## Instructions
20
20
 
21
- - Use `read_file` to read file contents.
22
- - Use `grep` to search for symbols, patterns, or text in files.
23
- - Use `find_files` to locate files by name or glob pattern.
24
- - Use `read_code_outline` for a compact structural overview of a file.
25
- - Use `code_context_search` to find declarations or related files for a symbol.
21
+ - Use only tools listed in the Available Tool Guidance section. If a tool is not listed there, it is not available.
22
+ - Use available read, search, code-context, and shell tools to understand the workspace before answering.
26
23
 
27
24
  ## Approach
28
25
 
29
26
  1. Start with targeted searches to locate relevant files.
30
27
  2. Read only the files necessary to answer the question.
31
- 3. Provide specific file paths and line numbers in your answer when relevant.
32
- 4. Report what you found, not what you looked at.
28
+ 3. Use safe shell commands only when they help with inspection or locating code.
29
+ 4. Provide specific file paths and line numbers in your answer when relevant.
30
+ 5. Report what you found, not what you looked at.
33
31
 
34
32
  ## Final Report
35
33
 
@@ -20,7 +20,8 @@ You have access to web search and web fetch tools, and read-only access to the w
20
20
 
21
21
  - Use `web_search` to find relevant external documentation, articles, or information.
22
22
  - Use `web_fetch` to retrieve the content of specific URLs.
23
- - Use `read_file`, `grep`, `find_files`, `read_code_outline`, and `code_context_search` to read workspace files when relevant.
23
+ - Use only tools listed in the Available Tool Guidance section. If a tool is not listed there, it is not available.
24
+ - Use available read, search, and code-context tools to inspect workspace files when relevant.
24
25
 
25
26
  ## Approach
26
27
 
@@ -18,11 +18,17 @@ You have read and write access to the workspace (within the assigned write bound
18
18
 
19
19
  ## Instructions
20
20
 
21
- - Use `read_file`, `grep`, `find_files`, `read_code_outline`, and `code_context_search` to understand the code before editing.
22
- - Use `apply_patch`, `search_replace`, or `create_file` to make the requested changes.
21
+ - Use only tools listed in the Available Tool Guidance section. If a tool is not listed there, it is not available.
22
+ - Use available read, search, and code-context tools to understand the code before editing.
23
+ - Use available write tools to make the requested changes.
23
24
  - Read relevant files before editing them.
24
25
  - Keep edits limited to the assigned scope. Do not broaden the task.
25
- - Do not revert or overwrite changes that appear to have been made by another agent or external process.
26
+
27
+ ## Scope discipline
28
+
29
+ - If the parent names editable, read-only, or forbidden files in the task, obey those boundaries strictly.
30
+ - If needed work falls outside the assigned scope, **stop and report** rather than broadening the task yourself.
31
+ - Treat the task scope as a contract. When in doubt about whether a change is in scope, report the ambiguity and wait for guidance.
26
32
 
27
33
  ## Write Policy
28
34
 
@@ -35,6 +41,9 @@ You have read and write access to the workspace (within the assigned write bound
35
41
  After completing the task, return a concise report that includes:
36
42
  - A summary of what was changed and why
37
43
  - Every file that was created or modified (full relative paths)
44
+ - The exact validation command you ran and its result (pass/fail)
38
45
  - Any issues encountered or assumptions made
46
+ - Any scope conflicts: work you identified as needed but that fell outside your assigned scope
39
47
 
40
48
  Do not include implementation details that are already visible in the diff.
49
+ Do not claim work you did not do.
@@ -0,0 +1,6 @@
1
+ ## Worktree Hygiene
2
+
3
+ - Preserve unrelated user work. Never revert, overwrite, or remove unrelated changes.
4
+ - Read-only roles treat dirty files as the current source of truth and never modify files.
5
+ - Worker roles must inspect dirty state before edits when practical and avoid unrelated dirty files.
6
+ - Worker roles should run relevant validation when practical and report any validation that could not be run.
@@ -1,6 +1,8 @@
1
1
  import { type AnthropicProviderSettings } from '@ai-sdk/anthropic';
2
2
  import { type ModelProvider, type Model } from '@openai/agents-core';
3
- export declare function addAnthropicPromptCachingToMessages(messages: any[], modelId?: string): any[];
3
+ export type AnthropicPromptCachingPredicate = (modelId: string) => boolean;
4
+ export declare function addAnthropicPromptCachingToMessages(messages: any[], modelId?: string, shouldApplyPromptCaching?: AnthropicPromptCachingPredicate): any[];
5
+ export declare function getMaxOutputTokens(modelId: string): number;
4
6
  export type AiSdkAnthropicConfig = Pick<AnthropicProviderSettings, 'baseURL' | 'apiKey' | 'authToken' | 'headers' | 'fetch' | 'name'>;
5
7
  export type AiSdkAnthropicProviderFactory = (options: AiSdkAnthropicConfig) => (modelId: string) => any;
6
8
  export declare class AiSdkAnthropicProvider implements ModelProvider {
@@ -9,6 +11,7 @@ export declare class AiSdkAnthropicProvider implements ModelProvider {
9
11
  defaultModel: string;
10
12
  resolveConfig: () => AiSdkAnthropicConfig;
11
13
  createProvider?: AiSdkAnthropicProviderFactory;
14
+ shouldApplyPromptCaching?: AnthropicPromptCachingPredicate;
12
15
  });
13
16
  getModel(modelName?: string): Promise<Model> | Model;
14
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ai-sdk-anthropic.provider.d.ts","sourceRoot":"","sources":["../../source/providers/ai-sdk-anthropic.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAEpF,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAarE,wBAAgB,mCAAmC,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,GAAG,EAAE,CA0C5F;AA6BD,MAAM,MAAM,oBAAoB,GAAG,IAAI,CACrC,yBAAyB,EACzB,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAClE,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG,CAAC,OAAO,EAAE,oBAAoB,KAAK,CAAC,OAAO,EAAE,MAAM,KAAK,GAAG,CAAC;AAExG,qBAAa,sBAAuB,YAAW,aAAa;;gBAK9C,IAAI,EAAE;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,oBAAoB,CAAC;QAC1C,cAAc,CAAC,EAAE,6BAA6B,CAAC;KAChD;IAMD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK;CAOrD"}
1
+ {"version":3,"file":"ai-sdk-anthropic.provider.d.ts","sourceRoot":"","sources":["../../source/providers/ai-sdk-anthropic.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAEpF,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAQrE,MAAM,MAAM,+BAA+B,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;AAO3E,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,GAAG,EAAE,EACf,OAAO,CAAC,EAAE,MAAM,EAChB,wBAAwB,GAAE,+BAAwE,GACjG,GAAG,EAAE,CA0CP;AAgDD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAK1D;AAuBD,MAAM,MAAM,oBAAoB,GAAG,IAAI,CACrC,yBAAyB,EACzB,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAClE,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG,CAAC,OAAO,EAAE,oBAAoB,KAAK,CAAC,OAAO,EAAE,MAAM,KAAK,GAAG,CAAC;AAExG,qBAAa,sBAAuB,YAAW,aAAa;;gBAM9C,IAAI,EAAE;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,oBAAoB,CAAC;QAC1C,cAAc,CAAC,EAAE,6BAA6B,CAAC;QAC/C,wBAAwB,CAAC,EAAE,+BAA+B,CAAC;KAC5D;IAOD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK;CAYrD"}
@@ -1,12 +1,12 @@
1
1
  import { createAnthropic } from '@ai-sdk/anthropic';
2
2
  import { wrapLanguageModel } from 'ai';
3
3
  import { adaptAiSdkModelForAgents } from './ai-sdk-agents-adapter.js';
4
- function isAnthropicModel(modelId) {
4
+ function defaultAnthropicPromptCachingPredicate(modelId) {
5
5
  const lowerModelId = modelId.toLowerCase();
6
6
  return lowerModelId.includes('anthropic') || lowerModelId.includes('claude');
7
7
  }
8
- export function addAnthropicPromptCachingToMessages(messages, modelId) {
9
- if (!Array.isArray(messages) || messages.length === 0 || !modelId || !isAnthropicModel(modelId)) {
8
+ export function addAnthropicPromptCachingToMessages(messages, modelId, shouldApplyPromptCaching = defaultAnthropicPromptCachingPredicate) {
9
+ if (!Array.isArray(messages) || messages.length === 0 || !modelId || !shouldApplyPromptCaching(modelId)) {
10
10
  return messages;
11
11
  }
12
12
  const next = messages.map((message) => ({ ...message }));
@@ -42,42 +42,85 @@ export function addAnthropicPromptCachingToMessages(messages, modelId) {
42
42
  }
43
43
  return next;
44
44
  }
45
- const anthropicPromptCachingMiddleware = {
46
- specificationVersion: 'v3',
47
- transformParams: ({ params, model }) => {
48
- const input = params;
49
- if (!Array.isArray(input?.messages) && !Array.isArray(input?.prompt)) {
50
- return input;
51
- }
52
- const modelId = typeof model === 'string' ? model : model?.modelId;
53
- return {
54
- ...input,
55
- ...(Array.isArray(input.messages)
56
- ? { messages: addAnthropicPromptCachingToMessages(input.messages, modelId) }
57
- : {}),
58
- ...(Array.isArray(input.prompt) ? { prompt: addAnthropicPromptCachingToMessages(input.prompt, modelId) } : {}),
59
- };
60
- },
45
+ function createAnthropicPromptCachingMiddleware(shouldApplyPromptCaching) {
46
+ return {
47
+ specificationVersion: 'v3',
48
+ transformParams: ({ params, model }) => {
49
+ const input = params;
50
+ if (!Array.isArray(input?.messages) && !Array.isArray(input?.prompt)) {
51
+ return input;
52
+ }
53
+ const modelId = typeof model === 'string' ? model : model?.modelId;
54
+ return {
55
+ ...input,
56
+ ...(Array.isArray(input.messages)
57
+ ? { messages: addAnthropicPromptCachingToMessages(input.messages, modelId, shouldApplyPromptCaching) }
58
+ : {}),
59
+ ...(Array.isArray(input.prompt)
60
+ ? { prompt: addAnthropicPromptCachingToMessages(input.prompt, modelId, shouldApplyPromptCaching) }
61
+ : {}),
62
+ };
63
+ },
64
+ };
65
+ }
66
+ const MAX_OUTPUT_TOKENS_MAP = {
67
+ 'minimax-m3': 131072,
68
+ 'qwen3.5-plus': 65536,
69
+ 'mimo-v2-omni': 128000,
70
+ 'kimi-k2.6': 65536,
71
+ 'qwen3.7-max': 65536,
72
+ 'qwen3.6-plus': 65536,
73
+ 'minimax-m2.7': 131072,
74
+ 'deepseek-v4-flash': 384000,
75
+ 'glm-5': 32768,
76
+ 'minimax-m2.5': 65536,
77
+ 'mimo-v2-pro': 128000,
78
+ 'qwen3.7-plus': 65536,
79
+ 'mimo-v2.5': 128000,
80
+ 'deepseek-v4-pro': 384000,
81
+ 'kimi-k2.5': 65536,
82
+ 'glm-5.1': 32768,
83
+ 'mimo-v2.5-pro': 128000,
61
84
  };
62
- function withAnthropicPromptCaching(model) {
85
+ export function getMaxOutputTokens(modelId) {
86
+ const defaultLimit = 65536;
87
+ if (!modelId)
88
+ return defaultLimit;
89
+ const key = modelId.split('/').pop()?.toLowerCase() ?? '';
90
+ return MAX_OUTPUT_TOKENS_MAP[key] ?? defaultLimit;
91
+ }
92
+ function withAnthropicPromptCaching(model, shouldApplyPromptCaching, modelId) {
93
+ const maxOutputTokens = getMaxOutputTokens(modelId);
63
94
  return wrapLanguageModel({
64
95
  model: model,
65
- middleware: anthropicPromptCachingMiddleware,
96
+ middleware: [
97
+ {
98
+ specificationVersion: 'v3',
99
+ transformParams: async ({ params }) => ({
100
+ ...params,
101
+ maxOutputTokens,
102
+ }),
103
+ },
104
+ createAnthropicPromptCachingMiddleware(shouldApplyPromptCaching),
105
+ ],
66
106
  });
67
107
  }
68
108
  export class AiSdkAnthropicProvider {
69
109
  #defaultModel;
70
110
  #resolveConfig;
71
111
  #createProvider;
112
+ #shouldApplyPromptCaching;
72
113
  constructor(deps) {
73
114
  this.#defaultModel = deps.defaultModel;
74
115
  this.#resolveConfig = deps.resolveConfig;
75
116
  this.#createProvider = deps.createProvider ?? createAnthropic;
117
+ this.#shouldApplyPromptCaching = deps.shouldApplyPromptCaching ?? defaultAnthropicPromptCachingPredicate;
76
118
  }
77
119
  getModel(modelName) {
78
120
  const config = this.#resolveConfig();
79
121
  const provider = this.#createProvider(config);
80
- const model = withAnthropicPromptCaching(provider(modelName || this.#defaultModel));
122
+ const resolvedModelName = modelName || this.#defaultModel;
123
+ const model = withAnthropicPromptCaching(provider(resolvedModelName), this.#shouldApplyPromptCaching, resolvedModelName);
81
124
  return adaptAiSdkModelForAgents(model, undefined, 'anthropic');
82
125
  }
83
126
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ai-sdk-anthropic.provider.js","sourceRoot":"","sources":["../../source/providers/ai-sdk-anthropic.provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai-sdk-anthropic.provider.js","sourceRoot":"","sources":["../../source/providers/ai-sdk-anthropic.provider.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import test from 'ava';
2
- import { addAnthropicPromptCachingToMessages, AiSdkAnthropicProvider } from './ai-sdk-anthropic.provider.js';
2
+ import { addAnthropicPromptCachingToMessages, AiSdkAnthropicProvider, getMaxOutputTokens, } from './ai-sdk-anthropic.provider.js';
3
3
  test('addAnthropicPromptCachingToMessages adds cacheControl to the last Anthropic message only', (t) => {
4
4
  const messages = [
5
5
  { role: 'system', content: 'system' },
@@ -73,6 +73,20 @@ test('addAnthropicPromptCachingToMessages leaves non-Anthropic models unchanged'
73
73
  const result = addAnthropicPromptCachingToMessages(messages, 'gpt-4.1');
74
74
  t.is(result, messages);
75
75
  });
76
+ test('addAnthropicPromptCachingToMessages leaves qwen models unchanged by default', (t) => {
77
+ const messages = [{ role: 'user', content: 'hello' }];
78
+ const result = addAnthropicPromptCachingToMessages(messages, 'qwen3-coder');
79
+ t.is(result, messages);
80
+ });
81
+ test('addAnthropicPromptCachingToMessages supports provider-specific caching predicates', (t) => {
82
+ const messages = [{ role: 'user', content: 'hello' }];
83
+ const result = addAnthropicPromptCachingToMessages(messages, 'qwen3-coder', (modelId) => modelId.includes('qwen'));
84
+ t.deepEqual(result[0].providerOptions, {
85
+ anthropic: {
86
+ cacheControl: { type: 'ephemeral' },
87
+ },
88
+ });
89
+ });
76
90
  test('AiSdkAnthropicProvider can be instantiated for Anthropic models', (t) => {
77
91
  const provider = new AiSdkAnthropicProvider({
78
92
  defaultModel: 'claude-sonnet-4-5',
@@ -84,4 +98,13 @@ test('AiSdkAnthropicProvider can be instantiated for Anthropic models', (t) => {
84
98
  });
85
99
  t.truthy(provider);
86
100
  });
101
+ test('getMaxOutputTokens maps models correctly and defaults to 65536', (t) => {
102
+ t.is(getMaxOutputTokens('minimax-m3'), 131072);
103
+ t.is(getMaxOutputTokens('qwen3.5-plus'), 65536);
104
+ t.is(getMaxOutputTokens('deepseek-v4-flash'), 384000);
105
+ t.is(getMaxOutputTokens('glm-5.1'), 32768);
106
+ t.is(getMaxOutputTokens('anthropic/mimo-v2-omni'), 128000);
107
+ t.is(getMaxOutputTokens('unknown-model'), 65536);
108
+ t.is(getMaxOutputTokens(''), 65536);
109
+ });
87
110
  //# sourceMappingURL=ai-sdk-anthropic.provider.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai-sdk-anthropic.provider.test.js","sourceRoot":"","sources":["../../source/providers/ai-sdk-anthropic.provider.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai-sdk-anthropic.provider.test.js","sourceRoot":"","sources":["../../source/providers/ai-sdk-anthropic.provider.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { ISessionContextService } from '../services/service-interfaces.js';
2
+ import type { FetchMiddleware } from './fetch/compose.js';
3
+ /**
4
+ * Creates a fetch middleware for Anthropic-compatible provider requests.
5
+ *
6
+ * The only transform this middleware performs is injecting an
7
+ * `x-opencode-session` header when the provider targets opencode.ai,
8
+ * using the same opencode-specific logic as `createOpenAICompatibleMiddleware`.
9
+ *
10
+ * Prompt caching is NOT handled here — the {@link AiSdkAnthropicProvider} already
11
+ * manages it via the AI SDK `anthropicPromptCachingMiddleware` in
12
+ * `ai-sdk-anthropic.provider.ts`, which operates at the correct layer.
13
+ *
14
+ * @param providerType - Provider type (e.g. `'anthropic'`, `'opencode'`).
15
+ * @param baseUrl - Base URL used for opencode host detection.
16
+ * @param sessionContextService - Optional session context service used to derive
17
+ * a stable opencode session identifier.
18
+ * @param fallbackSessionIdOverride - Optional explicit session ID override
19
+ * (takes precedence over traffic context).
20
+ */
21
+ export declare function createAnthropicMiddleware(providerType: string, baseUrl?: string, options?: {
22
+ sessionContextService?: ISessionContextService;
23
+ fallbackSessionIdOverride?: string;
24
+ }): FetchMiddleware;
25
+ //# sourceMappingURL=anthropic-middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-middleware.d.ts","sourceRoot":"","sources":["../../source/providers/anthropic-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IACR,qBAAqB,CAAC,EAAE,sBAAsB,CAAC;IAC/C,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACpC,GACA,eAAe,CAajB"}
@@ -0,0 +1,32 @@
1
+ import { createOpencodeSessionInjector } from './opencode-session.js';
2
+ /**
3
+ * Creates a fetch middleware for Anthropic-compatible provider requests.
4
+ *
5
+ * The only transform this middleware performs is injecting an
6
+ * `x-opencode-session` header when the provider targets opencode.ai,
7
+ * using the same opencode-specific logic as `createOpenAICompatibleMiddleware`.
8
+ *
9
+ * Prompt caching is NOT handled here — the {@link AiSdkAnthropicProvider} already
10
+ * manages it via the AI SDK `anthropicPromptCachingMiddleware` in
11
+ * `ai-sdk-anthropic.provider.ts`, which operates at the correct layer.
12
+ *
13
+ * @param providerType - Provider type (e.g. `'anthropic'`, `'opencode'`).
14
+ * @param baseUrl - Base URL used for opencode host detection.
15
+ * @param sessionContextService - Optional session context service used to derive
16
+ * a stable opencode session identifier.
17
+ * @param fallbackSessionIdOverride - Optional explicit session ID override
18
+ * (takes precedence over traffic context).
19
+ */
20
+ export function createAnthropicMiddleware(providerType, baseUrl, options) {
21
+ const injectSession = createOpencodeSessionInjector({ type: providerType, baseUrl }, options);
22
+ return async (ctx, next) => {
23
+ if (injectSession) {
24
+ const newInit = injectSession(ctx.init ?? {});
25
+ if (newInit) {
26
+ return next({ url: ctx.url, init: newInit });
27
+ }
28
+ }
29
+ return next(ctx);
30
+ };
31
+ }
32
+ //# sourceMappingURL=anthropic-middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-middleware.js","sourceRoot":"","sources":["../../source/providers/anthropic-middleware.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAEtE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,yBAAyB,CACvC,YAAoB,EACpB,OAAgB,EAChB,OAGC;IAED,MAAM,aAAa,GAAG,6BAA6B,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;IAE9F,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACzB,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAC9C,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=anthropic-middleware.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-middleware.test.d.ts","sourceRoot":"","sources":["../../source/providers/anthropic-middleware.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,142 @@
1
+ import test from 'ava';
2
+ import { composeFetch } from './fetch/compose.js';
3
+ import { createAnthropicMiddleware } from './anthropic-middleware.js';
4
+ function makeCapturingFetch(captured) {
5
+ return async (input, init) => {
6
+ const headers = {};
7
+ const rawHeaders = init?.headers;
8
+ if (rawHeaders) {
9
+ if (typeof rawHeaders.forEach === 'function') {
10
+ rawHeaders.forEach((v, k) => {
11
+ headers[k.toLowerCase()] = String(v);
12
+ });
13
+ }
14
+ else {
15
+ for (const [k, v] of Object.entries(rawHeaders)) {
16
+ headers[k.toLowerCase()] = String(v);
17
+ }
18
+ }
19
+ }
20
+ captured.push({
21
+ url: typeof input === 'string' ? input : String(input),
22
+ body: typeof init?.body === 'string' ? JSON.parse(init.body) : init?.body ?? null,
23
+ headers,
24
+ });
25
+ return new Response(JSON.stringify({ ok: true }), { status: 200 });
26
+ };
27
+ }
28
+ test('adds x-opencode-session header for opencode provider', async (t) => {
29
+ const captured = [];
30
+ const middleware = createAnthropicMiddleware('opencode', 'https://opencode.ai/v1');
31
+ const composed = composeFetch(makeCapturingFetch(captured), [middleware]);
32
+ await composed('https://opencode.ai/v1/messages', {
33
+ method: 'POST',
34
+ body: JSON.stringify({ model: 'claude-sonnet-4-5', messages: [{ role: 'user', content: 'Hello' }] }),
35
+ });
36
+ t.is(captured.length, 1);
37
+ t.truthy(captured[0].headers['x-opencode-session']);
38
+ t.regex(captured[0].headers['x-opencode-session'], /^ses_[0-9a-f]{12}[0-9a-zA-Z]{14}$/);
39
+ t.is(captured[0].headers['x-opencode-session'].length, 30);
40
+ });
41
+ test('does not add x-opencode-session for non-opencode provider', async (t) => {
42
+ const captured = [];
43
+ const middleware = createAnthropicMiddleware('anthropic', 'https://api.anthropic.com');
44
+ const composed = composeFetch(makeCapturingFetch(captured), [middleware]);
45
+ await composed('https://api.anthropic.com/v1/messages', {
46
+ method: 'POST',
47
+ body: JSON.stringify({ model: 'claude-sonnet-4-5', messages: [{ role: 'user', content: 'Hello' }] }),
48
+ });
49
+ t.is(captured.length, 1);
50
+ t.falsy(captured[0].headers['x-opencode-session']);
51
+ });
52
+ test('opencode detection is case-insensitive', async (t) => {
53
+ const captured = [];
54
+ const middleware = createAnthropicMiddleware('anthropic', 'https://OPENCODE.AI/v1');
55
+ const composed = composeFetch(makeCapturingFetch(captured), [middleware]);
56
+ await composed('https://OPENCODE.AI/v1/messages', {
57
+ method: 'POST',
58
+ body: JSON.stringify({ model: 'claude-sonnet-4-5', messages: [{ role: 'user', content: 'Hello' }] }),
59
+ });
60
+ t.is(captured.length, 1);
61
+ t.truthy(captured[0].headers['x-opencode-session']);
62
+ });
63
+ test('session ID is stable across requests in same session', async (t) => {
64
+ const captured = [];
65
+ const middleware = createAnthropicMiddleware('opencode', 'https://opencode.ai/v1');
66
+ const composed = composeFetch(makeCapturingFetch(captured), [middleware]);
67
+ const send = () => composed('https://opencode.ai/v1/messages', {
68
+ method: 'POST',
69
+ body: JSON.stringify({ model: 'claude-sonnet-4-5', messages: [{ role: 'user', content: 'Hello' }] }),
70
+ });
71
+ await send();
72
+ const firstSessionId = captured[0].headers['x-opencode-session'];
73
+ await send();
74
+ t.is(captured[1].headers['x-opencode-session'], firstSessionId);
75
+ });
76
+ test('opencode type derived from providerType alone', async (t) => {
77
+ const captured = [];
78
+ const middleware = createAnthropicMiddleware('opencode');
79
+ const composed = composeFetch(makeCapturingFetch(captured), [middleware]);
80
+ await composed('https://any-host/v1/messages', {
81
+ method: 'POST',
82
+ body: JSON.stringify({ model: 'claude-sonnet-4-5', messages: [{ role: 'user', content: 'Hello' }] }),
83
+ });
84
+ t.is(captured.length, 1);
85
+ t.truthy(captured[0].headers['x-opencode-session']);
86
+ });
87
+ test('session ID uses fallbackSessionIdOverride when provided', async (t) => {
88
+ const captured = [];
89
+ const middleware = createAnthropicMiddleware('opencode', 'https://opencode.ai/v1', {
90
+ fallbackSessionIdOverride: 'ses_123456789012abcABC0abcABC0ab',
91
+ });
92
+ const composed = composeFetch(makeCapturingFetch(captured), [middleware]);
93
+ await composed('https://opencode.ai/v1/messages', {
94
+ method: 'POST',
95
+ body: JSON.stringify({ model: 'claude-sonnet-4-5', messages: [{ role: 'user', content: 'Hello' }] }),
96
+ });
97
+ t.is(captured[0].headers['x-opencode-session'], 'ses_123456789012abcABC0abcABC0ab');
98
+ });
99
+ test('does not modify the request body', async (t) => {
100
+ const captured = [];
101
+ const middleware = createAnthropicMiddleware('opencode', 'https://opencode.ai/v1');
102
+ const composed = composeFetch(makeCapturingFetch(captured), [middleware]);
103
+ const bodyPayload = {
104
+ model: 'claude-sonnet-4-5',
105
+ max_tokens: 1024,
106
+ temperature: 0.7,
107
+ system: 'You are a test bot.',
108
+ messages: [{ role: 'user', content: 'Hello' }],
109
+ };
110
+ await composed('https://opencode.ai/v1/messages', {
111
+ method: 'POST',
112
+ body: JSON.stringify(bodyPayload),
113
+ });
114
+ t.deepEqual(captured[0].body, bodyPayload);
115
+ });
116
+ test('preserves existing headers when adding opencode session header', async (t) => {
117
+ const captured = [];
118
+ const middleware = createAnthropicMiddleware('opencode');
119
+ const composed = composeFetch(makeCapturingFetch(captured), [middleware]);
120
+ await composed('https://opencode.ai/v1/messages', {
121
+ method: 'POST',
122
+ headers: { 'anthropic-version': '2023-06-01', 'x-api-key': 'sk-test' },
123
+ body: JSON.stringify({ model: 'claude-sonnet-4-5', messages: [{ role: 'user', content: 'Hello' }] }),
124
+ });
125
+ t.is(captured[0].headers['anthropic-version'], '2023-06-01');
126
+ t.is(captured[0].headers['x-api-key'], 'sk-test');
127
+ t.truthy(captured[0].headers['x-opencode-session']);
128
+ });
129
+ test('passes through non-JSON bodies unchanged', async (t) => {
130
+ const captured = [];
131
+ const middleware = createAnthropicMiddleware('opencode', 'https://opencode.ai/v1');
132
+ const composed = composeFetch(makeCapturingFetch(captured), [middleware]);
133
+ await composed('https://opencode.ai/v1/messages', {
134
+ method: 'POST',
135
+ headers: { 'Content-Type': 'application/octet-stream' },
136
+ body: new Uint8Array([1, 2, 3]),
137
+ });
138
+ t.is(captured.length, 1);
139
+ t.true(captured[0].body instanceof Uint8Array);
140
+ t.truthy(captured[0].headers['x-opencode-session'], 'opencode header should still be added');
141
+ });
142
+ //# sourceMappingURL=anthropic-middleware.test.js.map