@within-7/minto 0.4.0 → 0.4.2

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 (391) hide show
  1. package/dist/Tool.js +7 -0
  2. package/dist/Tool.js.map +2 -2
  3. package/dist/commands/agents/AgentsCommand.js +1 -1
  4. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  5. package/dist/commands/agents/constants.js +2 -2
  6. package/dist/commands/agents/constants.js.map +2 -2
  7. package/dist/commands/clear.js +4 -3
  8. package/dist/commands/clear.js.map +2 -2
  9. package/dist/commands/compact.js +2 -2
  10. package/dist/commands/compact.js.map +1 -1
  11. package/dist/commands/context.js +3 -1
  12. package/dist/commands/context.js.map +2 -2
  13. package/dist/commands/login.js +128 -0
  14. package/dist/commands/login.js.map +7 -0
  15. package/dist/commands/memory.js +33 -82
  16. package/dist/commands/memory.js.map +2 -2
  17. package/dist/commands/quit.js +3 -1
  18. package/dist/commands/quit.js.map +2 -2
  19. package/dist/commands/resume.js +39 -239
  20. package/dist/commands/resume.js.map +2 -2
  21. package/dist/commands/tasks.js +1 -1
  22. package/dist/commands/tasks.js.map +2 -2
  23. package/dist/commands/terminalSetup.js +6 -2
  24. package/dist/commands/terminalSetup.js.map +2 -2
  25. package/dist/commands.js +2 -0
  26. package/dist/commands.js.map +2 -2
  27. package/dist/components/AgentDetailView.js +126 -0
  28. package/dist/components/AgentDetailView.js.map +7 -0
  29. package/dist/components/AgentThinkingBlock.js +1 -1
  30. package/dist/components/AgentThinkingBlock.js.map +2 -2
  31. package/dist/components/AgentViewBanner.js +22 -0
  32. package/dist/components/AgentViewBanner.js.map +7 -0
  33. package/dist/components/HeaderBar.js +1 -1
  34. package/dist/components/HeaderBar.js.map +2 -2
  35. package/dist/components/Help.js +8 -1
  36. package/dist/components/Help.js.map +2 -2
  37. package/dist/components/HotkeyHelpPanel.js +26 -8
  38. package/dist/components/HotkeyHelpPanel.js.map +2 -2
  39. package/dist/components/IdleNotificationBar.js +10 -0
  40. package/dist/components/IdleNotificationBar.js.map +7 -0
  41. package/dist/components/ModelSelector/ModelSelector.js +55 -20
  42. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  43. package/dist/components/PromptInput.js +186 -115
  44. package/dist/components/PromptInput.js.map +2 -2
  45. package/dist/components/RewindPanel.js +272 -0
  46. package/dist/components/RewindPanel.js.map +7 -0
  47. package/dist/components/Spinner.js +10 -21
  48. package/dist/components/Spinner.js.map +2 -2
  49. package/dist/components/StreamingTextPreview.js +29 -0
  50. package/dist/components/StreamingTextPreview.js.map +7 -0
  51. package/dist/components/SubagentBlock.js +3 -2
  52. package/dist/components/SubagentBlock.js.map +2 -2
  53. package/dist/components/SubagentProgress.js +4 -4
  54. package/dist/components/SubagentProgress.js.map +2 -2
  55. package/dist/components/TabbedListView/SearchInput.js +1 -1
  56. package/dist/components/TabbedListView/SearchInput.js.map +2 -2
  57. package/dist/components/TabbedListView/TabbedListView.js +87 -41
  58. package/dist/components/TabbedListView/TabbedListView.js.map +2 -2
  59. package/dist/components/TaskCard.js +4 -4
  60. package/dist/components/TaskCard.js.map +2 -2
  61. package/dist/components/TeamMemberPanel.js +107 -0
  62. package/dist/components/TeamMemberPanel.js.map +7 -0
  63. package/dist/components/ThinkingSelector.js +84 -0
  64. package/dist/components/ThinkingSelector.js.map +7 -0
  65. package/dist/components/TitledDivider.js +26 -0
  66. package/dist/components/TitledDivider.js.map +7 -0
  67. package/dist/components/TodoPanel.js +31 -30
  68. package/dist/components/TodoPanel.js.map +2 -2
  69. package/dist/components/TokenWarning.js +28 -7
  70. package/dist/components/TokenWarning.js.map +2 -2
  71. package/dist/components/messages/AssistantTextMessage.js +5 -2
  72. package/dist/components/messages/AssistantTextMessage.js.map +2 -2
  73. package/dist/components/messages/AssistantToolUseMessage.js +9 -1
  74. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  75. package/dist/components/messages/DefaultToolResultFallback.js +11 -0
  76. package/dist/components/messages/DefaultToolResultFallback.js.map +7 -0
  77. package/dist/components/messages/ParallelTasksGroupView.js +14 -6
  78. package/dist/components/messages/ParallelTasksGroupView.js.map +2 -2
  79. package/dist/components/messages/TaskInModuleView.js +27 -27
  80. package/dist/components/messages/TaskInModuleView.js.map +2 -2
  81. package/dist/components/messages/UserGuidanceMessage.js +26 -0
  82. package/dist/components/messages/UserGuidanceMessage.js.map +7 -0
  83. package/dist/components/messages/UserPromptMessage.js +2 -1
  84. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  85. package/dist/components/messages/UserTeamNotificationMessage.js +91 -0
  86. package/dist/components/messages/UserTeamNotificationMessage.js.map +7 -0
  87. package/dist/components/messages/UserTextMessage.js +8 -0
  88. package/dist/components/messages/UserTextMessage.js.map +2 -2
  89. package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js +4 -2
  90. package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js.map +2 -2
  91. package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js +18 -1
  92. package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js.map +2 -2
  93. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +12 -1
  94. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
  95. package/dist/components/permissions/PermissionRequest.js +4 -0
  96. package/dist/components/permissions/PermissionRequest.js.map +2 -2
  97. package/dist/components/permissions/PlanApprovalRequest.js +164 -0
  98. package/dist/components/permissions/PlanApprovalRequest.js.map +7 -0
  99. package/dist/constants/agentTeams.js +17 -0
  100. package/dist/constants/agentTeams.js.map +7 -0
  101. package/dist/constants/macros.js +2 -1
  102. package/dist/constants/macros.js.map +2 -2
  103. package/dist/constants/prompts/agentPrompt.js +1 -0
  104. package/dist/constants/prompts/agentPrompt.js.map +2 -2
  105. package/dist/constants/prompts/autoMemory.js +39 -0
  106. package/dist/constants/prompts/autoMemory.js.map +7 -0
  107. package/dist/constants/prompts/codeConventions.js +1 -13
  108. package/dist/constants/prompts/codeConventions.js.map +2 -2
  109. package/dist/constants/prompts/doingTasks.js +21 -2
  110. package/dist/constants/prompts/doingTasks.js.map +2 -2
  111. package/dist/constants/prompts/envInfo.js +6 -7
  112. package/dist/constants/prompts/envInfo.js.map +2 -2
  113. package/dist/constants/prompts/index.js +27 -5
  114. package/dist/constants/prompts/index.js.map +2 -2
  115. package/dist/constants/prompts/taskManagement.js +2 -43
  116. package/dist/constants/prompts/taskManagement.js.map +2 -2
  117. package/dist/constants/prompts/teamOverlays.js +50 -0
  118. package/dist/constants/prompts/teamOverlays.js.map +7 -0
  119. package/dist/constants/prompts/toneAndStyle.js +4 -29
  120. package/dist/constants/prompts/toneAndStyle.js.map +2 -2
  121. package/dist/constants/prompts/toolUsagePolicy.js +7 -22
  122. package/dist/constants/prompts/toolUsagePolicy.js.map +2 -2
  123. package/dist/constants/toolInputExamples.js +2 -2
  124. package/dist/constants/toolInputExamples.js.map +2 -2
  125. package/dist/context.js +39 -6
  126. package/dist/context.js.map +2 -2
  127. package/dist/core/backupManager.js +1 -1
  128. package/dist/core/backupManager.js.map +2 -2
  129. package/dist/core/permissions/rules/planModeRule.js +1 -1
  130. package/dist/core/permissions/rules/planModeRule.js.map +1 -1
  131. package/dist/core/permissions/rules/safeModeRule.js +1 -1
  132. package/dist/core/permissions/rules/safeModeRule.js.map +1 -1
  133. package/dist/engine/AgentEngine.js +902 -0
  134. package/dist/engine/AgentEngine.js.map +7 -0
  135. package/dist/engine/EngineRegistry.js +89 -0
  136. package/dist/engine/EngineRegistry.js.map +7 -0
  137. package/dist/engine/foregroundAdapter.js +191 -0
  138. package/dist/engine/foregroundAdapter.js.map +7 -0
  139. package/dist/engine/index.js +15 -0
  140. package/dist/engine/index.js.map +7 -0
  141. package/dist/engine/types.js +1 -0
  142. package/dist/engine/types.js.map +7 -0
  143. package/dist/entrypoints/cli.js +410 -79
  144. package/dist/entrypoints/cli.js.map +3 -3
  145. package/dist/hooks/useAgentEngine.js +129 -0
  146. package/dist/hooks/useAgentEngine.js.map +7 -0
  147. package/dist/hooks/useAgentTokenStats.js +0 -16
  148. package/dist/hooks/useAgentTokenStats.js.map +2 -2
  149. package/dist/hooks/useCanUseTool.js +47 -2
  150. package/dist/hooks/useCanUseTool.js.map +2 -2
  151. package/dist/hooks/useDeferredLoading.js +4 -1
  152. package/dist/hooks/useDeferredLoading.js.map +2 -2
  153. package/dist/hooks/useIdleNotifications.js +66 -0
  154. package/dist/hooks/useIdleNotifications.js.map +7 -0
  155. package/dist/hooks/useSessionTracking.js +9 -7
  156. package/dist/hooks/useSessionTracking.js.map +2 -2
  157. package/dist/hooks/useTeamMembers.js +51 -0
  158. package/dist/hooks/useTeamMembers.js.map +7 -0
  159. package/dist/i18n/locales/en.js +77 -12
  160. package/dist/i18n/locales/en.js.map +2 -2
  161. package/dist/i18n/locales/zh-CN.js +77 -12
  162. package/dist/i18n/locales/zh-CN.js.map +2 -2
  163. package/dist/i18n/types.js.map +1 -1
  164. package/dist/messages.js.map +2 -2
  165. package/dist/permissions.js +113 -7
  166. package/dist/permissions.js.map +2 -2
  167. package/dist/query.js +135 -37
  168. package/dist/query.js.map +2 -2
  169. package/dist/screens/REPL.js +504 -361
  170. package/dist/screens/REPL.js.map +3 -3
  171. package/dist/screens/ResumeConversation.js +199 -14
  172. package/dist/screens/ResumeConversation.js.map +2 -2
  173. package/dist/services/adapters/base.js.map +1 -1
  174. package/dist/services/agentTeams/backends/headless.js +108 -0
  175. package/dist/services/agentTeams/backends/headless.js.map +7 -0
  176. package/dist/services/agentTeams/backends/inProcess.js +102 -0
  177. package/dist/services/agentTeams/backends/inProcess.js.map +7 -0
  178. package/dist/services/agentTeams/backends/resolver.js +18 -0
  179. package/dist/services/agentTeams/backends/resolver.js.map +7 -0
  180. package/dist/services/agentTeams/backends/tmux.js +168 -0
  181. package/dist/services/agentTeams/backends/tmux.js.map +7 -0
  182. package/dist/services/agentTeams/backends/types.js +1 -0
  183. package/dist/services/agentTeams/backends/types.js.map +7 -0
  184. package/dist/services/agentTeams/heartbeat.js +88 -0
  185. package/dist/services/agentTeams/heartbeat.js.map +7 -0
  186. package/dist/services/agentTeams/index.js +42 -2
  187. package/dist/services/agentTeams/index.js.map +2 -2
  188. package/dist/services/agentTeams/injectionChannel.js +105 -0
  189. package/dist/services/agentTeams/injectionChannel.js.map +7 -0
  190. package/dist/services/agentTeams/mailbox.js +410 -30
  191. package/dist/services/agentTeams/mailbox.js.map +2 -2
  192. package/dist/services/agentTeams/messageFormatter.js +80 -0
  193. package/dist/services/agentTeams/messageFormatter.js.map +7 -0
  194. package/dist/services/agentTeams/permissionDelegation.js +71 -0
  195. package/dist/services/agentTeams/permissionDelegation.js.map +7 -0
  196. package/dist/services/agentTeams/teamEvents.js +45 -0
  197. package/dist/services/agentTeams/teamEvents.js.map +7 -0
  198. package/dist/services/agentTeams/teamManager.js +251 -34
  199. package/dist/services/agentTeams/teamManager.js.map +2 -2
  200. package/dist/services/agentTeams/teamTaskStore.js +290 -61
  201. package/dist/services/agentTeams/teamTaskStore.js.map +2 -2
  202. package/dist/services/agentTeams/teammateSpawner.js +99 -18
  203. package/dist/services/agentTeams/teammateSpawner.js.map +2 -2
  204. package/dist/services/hookExecutor.js +51 -8
  205. package/dist/services/hookExecutor.js.map +2 -2
  206. package/dist/services/llm/anthropicProvider.js +56 -59
  207. package/dist/services/llm/anthropicProvider.js.map +2 -2
  208. package/dist/services/llm/dispatch.js +24 -5
  209. package/dist/services/llm/dispatch.js.map +2 -2
  210. package/dist/services/llm/openaiProvider.js +115 -136
  211. package/dist/services/llm/openaiProvider.js.map +3 -3
  212. package/dist/services/llm/types.js +89 -15
  213. package/dist/services/llm/types.js.map +2 -2
  214. package/dist/services/mcpClient.js +80 -4
  215. package/dist/services/mcpClient.js.map +2 -2
  216. package/dist/services/mintoAuth.js +299 -0
  217. package/dist/services/mintoAuth.js.map +7 -0
  218. package/dist/services/oauth.js +3 -3
  219. package/dist/services/oauth.js.map +2 -2
  220. package/dist/services/openai.js +91 -20
  221. package/dist/services/openai.js.map +2 -2
  222. package/dist/services/plugins/pluginRuntime.js +11 -5
  223. package/dist/services/plugins/pluginRuntime.js.map +2 -2
  224. package/dist/services/plugins/pluginValidation.js +4 -2
  225. package/dist/services/plugins/pluginValidation.js.map +2 -2
  226. package/dist/services/sandbox/sandboxController.js +11 -3
  227. package/dist/services/sandbox/sandboxController.js.map +2 -2
  228. package/dist/services/sessionMemoryInjector.js +77 -0
  229. package/dist/services/sessionMemoryInjector.js.map +7 -0
  230. package/dist/services/systemReminder.js +130 -8
  231. package/dist/services/systemReminder.js.map +2 -2
  232. package/dist/services/taskStore.js +199 -8
  233. package/dist/services/taskStore.js.map +3 -3
  234. package/dist/services/topicDetector.js +169 -0
  235. package/dist/services/topicDetector.js.map +7 -0
  236. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +0 -13
  237. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  238. package/dist/tools/BashTool/BashTool.js +51 -28
  239. package/dist/tools/BashTool/BashTool.js.map +2 -2
  240. package/dist/tools/BashTool/prompt.js +95 -118
  241. package/dist/tools/BashTool/prompt.js.map +2 -2
  242. package/dist/tools/BashTool/utils.js +39 -1
  243. package/dist/tools/BashTool/utils.js.map +2 -2
  244. package/dist/tools/EnterWorktreeTool/EnterWorktreeTool.js +121 -0
  245. package/dist/tools/EnterWorktreeTool/EnterWorktreeTool.js.map +7 -0
  246. package/dist/tools/EnterWorktreeTool/prompt.js +22 -0
  247. package/dist/tools/EnterWorktreeTool/prompt.js.map +7 -0
  248. package/dist/tools/FileEditTool/FileEditTool.js +9 -4
  249. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  250. package/dist/tools/FileEditTool/prompt.js +3 -7
  251. package/dist/tools/FileEditTool/prompt.js.map +2 -2
  252. package/dist/tools/FileReadTool/FileReadTool.js +125 -3
  253. package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
  254. package/dist/tools/FileReadTool/prompt.js +1 -2
  255. package/dist/tools/FileReadTool/prompt.js.map +2 -2
  256. package/dist/tools/FileWriteTool/prompt.js +3 -5
  257. package/dist/tools/FileWriteTool/prompt.js.map +2 -2
  258. package/dist/tools/GlobTool/GlobTool.js +3 -2
  259. package/dist/tools/GlobTool/GlobTool.js.map +2 -2
  260. package/dist/tools/GrepTool/GrepTool.js +16 -5
  261. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  262. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +2 -2
  263. package/dist/tools/MCPSearchTool/MCPSearchTool.js +172 -0
  264. package/dist/tools/MCPSearchTool/MCPSearchTool.js.map +7 -0
  265. package/dist/tools/MCPSearchTool/prompt.js +77 -0
  266. package/dist/tools/MCPSearchTool/prompt.js.map +7 -0
  267. package/dist/tools/MultiEditTool/prompt.js +4 -7
  268. package/dist/tools/MultiEditTool/prompt.js.map +2 -2
  269. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +12 -8
  270. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
  271. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +54 -1
  272. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
  273. package/dist/tools/PlanModeTool/prompt.js +23 -74
  274. package/dist/tools/PlanModeTool/prompt.js.map +2 -2
  275. package/dist/tools/SendMessageTool/SendMessageTool.js +341 -0
  276. package/dist/tools/SendMessageTool/SendMessageTool.js.map +7 -0
  277. package/dist/tools/SendMessageTool/prompt.js +44 -0
  278. package/dist/tools/SendMessageTool/prompt.js.map +7 -0
  279. package/dist/tools/TaskCreateTool/prompt.js +15 -4
  280. package/dist/tools/TaskCreateTool/prompt.js.map +2 -2
  281. package/dist/tools/TaskListTool/prompt.js +18 -3
  282. package/dist/tools/TaskListTool/prompt.js.map +2 -2
  283. package/dist/tools/TaskOutputTool/prompt.js +4 -3
  284. package/dist/tools/TaskOutputTool/prompt.js.map +2 -2
  285. package/dist/tools/TaskTool/TaskTool.js +762 -98
  286. package/dist/tools/TaskTool/TaskTool.js.map +3 -3
  287. package/dist/tools/TaskTool/constants.js +8 -2
  288. package/dist/tools/TaskTool/constants.js.map +2 -2
  289. package/dist/tools/TaskTool/prompt.js +74 -70
  290. package/dist/tools/TaskTool/prompt.js.map +2 -2
  291. package/dist/tools/TaskUpdateTool/TaskUpdateTool.js +15 -1
  292. package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +2 -2
  293. package/dist/tools/TeamCreateTool/TeamCreateTool.js +129 -0
  294. package/dist/tools/TeamCreateTool/TeamCreateTool.js.map +7 -0
  295. package/dist/tools/TeamCreateTool/prompt.js +58 -0
  296. package/dist/tools/TeamCreateTool/prompt.js.map +7 -0
  297. package/dist/tools/TeamDeleteTool/TeamDeleteTool.js +151 -0
  298. package/dist/tools/TeamDeleteTool/TeamDeleteTool.js.map +7 -0
  299. package/dist/tools/TeamDeleteTool/prompt.js +16 -0
  300. package/dist/tools/TeamDeleteTool/prompt.js.map +7 -0
  301. package/dist/tools/URLFetcherTool/URLFetcherTool.js +106 -15
  302. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
  303. package/dist/tools/URLFetcherTool/prompt.js +3 -2
  304. package/dist/tools/URLFetcherTool/prompt.js.map +2 -2
  305. package/dist/tools/WebSearchTool/WebSearchTool.js +2 -1
  306. package/dist/tools/WebSearchTool/WebSearchTool.js.map +2 -2
  307. package/dist/tools/WebSearchTool/prompt.js +5 -4
  308. package/dist/tools/WebSearchTool/prompt.js.map +2 -2
  309. package/dist/tools.js +100 -20
  310. package/dist/tools.js.map +2 -2
  311. package/dist/types/PermissionMode.js +35 -6
  312. package/dist/types/PermissionMode.js.map +2 -2
  313. package/dist/types/hooks.js +2 -0
  314. package/dist/types/hooks.js.map +2 -2
  315. package/dist/types/plugin.js +2 -0
  316. package/dist/types/plugin.js.map +3 -3
  317. package/dist/utils/CircuitBreaker.js +15 -9
  318. package/dist/utils/CircuitBreaker.js.map +2 -2
  319. package/dist/utils/agentLoader.js +249 -112
  320. package/dist/utils/agentLoader.js.map +2 -2
  321. package/dist/utils/animationManager.js +40 -3
  322. package/dist/utils/animationManager.js.map +2 -2
  323. package/dist/utils/ask.js +7 -6
  324. package/dist/utils/ask.js.map +2 -2
  325. package/dist/utils/atomicWrite.js +23 -0
  326. package/dist/utils/atomicWrite.js.map +7 -0
  327. package/dist/utils/autoCompactCore.js +73 -56
  328. package/dist/utils/autoCompactCore.js.map +2 -2
  329. package/dist/utils/autoMemoryPaths.js +89 -0
  330. package/dist/utils/autoMemoryPaths.js.map +7 -0
  331. package/dist/utils/config.js +63 -38
  332. package/dist/utils/config.js.map +2 -2
  333. package/dist/utils/configSchema.js +13 -8
  334. package/dist/utils/configSchema.js.map +2 -2
  335. package/dist/utils/credentials/index.js +14 -0
  336. package/dist/utils/credentials/index.js.map +2 -2
  337. package/dist/utils/dualPath.js +24 -0
  338. package/dist/utils/dualPath.js.map +7 -0
  339. package/dist/utils/exit.js +66 -7
  340. package/dist/utils/exit.js.map +2 -2
  341. package/dist/utils/externalEditor.js +155 -0
  342. package/dist/utils/externalEditor.js.map +7 -0
  343. package/dist/utils/fileLock.js +67 -0
  344. package/dist/utils/fileLock.js.map +7 -0
  345. package/dist/utils/format.js +24 -14
  346. package/dist/utils/format.js.map +2 -2
  347. package/dist/utils/globalErrorHandler.js +5 -96
  348. package/dist/utils/globalErrorHandler.js.map +3 -3
  349. package/dist/utils/groupHandlers/parallelTasksHandler.js +5 -3
  350. package/dist/utils/groupHandlers/parallelTasksHandler.js.map +2 -2
  351. package/dist/utils/groupHandlers/taskHandler.js +2 -2
  352. package/dist/utils/groupHandlers/taskHandler.js.map +2 -2
  353. package/dist/utils/hookManager.js +64 -6
  354. package/dist/utils/hookManager.js.map +2 -2
  355. package/dist/utils/log.js +6 -2
  356. package/dist/utils/log.js.map +2 -2
  357. package/dist/utils/markdown.js +237 -19
  358. package/dist/utils/markdown.js.map +2 -2
  359. package/dist/utils/messageContextManager.js +18 -5
  360. package/dist/utils/messageContextManager.js.map +2 -2
  361. package/dist/utils/messageGroupManager.js +1 -1
  362. package/dist/utils/messageGroupManager.js.map +2 -2
  363. package/dist/utils/messages.js +104 -46
  364. package/dist/utils/messages.js.map +2 -2
  365. package/dist/utils/model.js +2 -2
  366. package/dist/utils/model.js.map +2 -2
  367. package/dist/utils/pasteCache.js +8 -4
  368. package/dist/utils/pasteCache.js.map +2 -2
  369. package/dist/utils/pluginLoader.js +18 -0
  370. package/dist/utils/pluginLoader.js.map +2 -2
  371. package/dist/utils/secureKeyStorage.js +36 -7
  372. package/dist/utils/secureKeyStorage.js.map +2 -2
  373. package/dist/utils/simpleMode.js +7 -0
  374. package/dist/utils/simpleMode.js.map +7 -0
  375. package/dist/utils/streamingState.js +11 -1
  376. package/dist/utils/streamingState.js.map +2 -2
  377. package/dist/utils/taskDisplayUtils.js +2 -1
  378. package/dist/utils/taskDisplayUtils.js.map +2 -2
  379. package/dist/utils/teamConfig.js +2 -2
  380. package/dist/utils/teamConfig.js.map +2 -2
  381. package/dist/utils/thinking.js +6 -2
  382. package/dist/utils/thinking.js.map +3 -3
  383. package/dist/utils/tokenProgress.js +55 -0
  384. package/dist/utils/tokenProgress.js.map +7 -0
  385. package/dist/utils/toolRiskClassification.js +26 -17
  386. package/dist/utils/toolRiskClassification.js.map +2 -2
  387. package/dist/utils/tooling/toolError.js +12 -0
  388. package/dist/utils/tooling/toolError.js.map +7 -0
  389. package/dist/version.js +2 -2
  390. package/dist/version.js.map +1 -1
  391. package/package.json +10 -8
@@ -3,17 +3,15 @@ import Anthropic from "@anthropic-ai/sdk";
3
3
  import { AnthropicBedrock } from "@anthropic-ai/bedrock-sdk";
4
4
  import { AnthropicVertex } from "@anthropic-ai/vertex-sdk";
5
5
  import chalk from "chalk";
6
- import { nanoid } from "nanoid";
6
+ import { randomUUID } from "crypto";
7
7
  import "dotenv/config";
8
8
  import { getToolDescriptionAsync } from "../../Tool.js";
9
9
  import {
10
10
  getAnthropicApiKey,
11
- getGlobalConfig
11
+ getGlobalConfig,
12
+ resolveApiKey
12
13
  } from "../../utils/config.js";
13
14
  import { USER_AGENT } from "../../utils/http.js";
14
- import {
15
- createAssistantAPIErrorMessage
16
- } from "../../utils/messages.js";
17
15
  import {
18
16
  debug as debugLogger,
19
17
  getCurrentRequest,
@@ -25,26 +23,29 @@ import { USE_BEDROCK, USE_VERTEX, getVertexRegionForModel } from "../../utils/mo
25
23
  import { zodToJsonSchema } from "zod-to-json-schema";
26
24
  import { getCLISyspromptPrefix } from "../../constants/prompts/index.js";
27
25
  import { setStreamingState, getStreamingState } from "../../utils/streamingState.js";
26
+ import {
27
+ beginTokenTracking,
28
+ addPreparedChars,
29
+ addReceivedChars,
30
+ setFinalTokens
31
+ } from "../../utils/tokenProgress.js";
28
32
  import { addRetryEventToTranscript } from "../../utils/agentTranscripts.js";
29
33
  import { generateMintoContext } from "./mintoContext.js";
30
34
  import {
31
- API_ERROR_MESSAGE_PREFIX,
32
- PROMPT_TOO_LONG_ERROR_MESSAGE,
33
- CREDIT_BALANCE_TOO_LOW_ERROR_MESSAGE,
34
- INVALID_API_KEY_ERROR_MESSAGE,
35
35
  PROMPT_CACHING_ENABLED,
36
36
  MAIN_QUERY_TEMPERATURE,
37
37
  getMetadata,
38
38
  withRetry,
39
39
  getMaxTokensFromProfile,
40
- getModelInputTokenCostUSD,
41
- getModelOutputTokenCostUSD,
40
+ calculateCostUSD,
41
+ getAssistantMessageFromError,
42
42
  addToTotalCost,
43
43
  recordTokenUsage,
44
44
  logError
45
45
  } from "./types.js";
46
46
  let anthropicClient = null;
47
- function getAnthropicClient(model, overrideProfile) {
47
+ let lastClientProvider;
48
+ async function getAnthropicClient(model, overrideProfile) {
48
49
  const config = getGlobalConfig();
49
50
  const provider = config.primaryProvider;
50
51
  if (overrideProfile) {
@@ -52,8 +53,9 @@ function getAnthropicClient(model, overrideProfile) {
52
53
  "x-app": "cli",
53
54
  "User-Agent": USER_AGENT
54
55
  };
56
+ const resolvedOverrideKey = await resolveApiKey(overrideProfile) ?? overrideProfile.apiKey ?? "";
55
57
  return new Anthropic({
56
- apiKey: overrideProfile.apiKey || "",
58
+ apiKey: resolvedOverrideKey,
57
59
  dangerouslyAllowBrowser: true,
58
60
  maxRetries: 0,
59
61
  timeout: parseInt(process.env.API_TIMEOUT_MS || String(60 * 1e3), 10),
@@ -61,7 +63,7 @@ function getAnthropicClient(model, overrideProfile) {
61
63
  ...overrideProfile.baseURL && { baseURL: overrideProfile.baseURL }
62
64
  });
63
65
  }
64
- if (anthropicClient && provider) {
66
+ if (anthropicClient && provider && provider !== lastClientProvider) {
65
67
  anthropicClient = null;
66
68
  }
67
69
  if (anthropicClient) {
@@ -84,6 +86,7 @@ function getAnthropicClient(model, overrideProfile) {
84
86
  if (USE_BEDROCK) {
85
87
  const client = new AnthropicBedrock(ARGS);
86
88
  anthropicClient = client;
89
+ lastClientProvider = "bedrock";
87
90
  return client;
88
91
  }
89
92
  if (USE_VERTEX) {
@@ -93,6 +96,7 @@ function getAnthropicClient(model, overrideProfile) {
93
96
  };
94
97
  const client = new AnthropicVertex(vertexArgs);
95
98
  anthropicClient = client;
99
+ lastClientProvider = "vertex";
96
100
  return client;
97
101
  }
98
102
  const modelManager = getModelManager();
@@ -100,7 +104,7 @@ function getAnthropicClient(model, overrideProfile) {
100
104
  let apiKey;
101
105
  let baseURL;
102
106
  if (modelProfile) {
103
- apiKey = modelProfile.apiKey || "";
107
+ apiKey = await resolveApiKey(modelProfile) ?? modelProfile.apiKey ?? "";
104
108
  baseURL = modelProfile.baseURL;
105
109
  } else {
106
110
  apiKey = getAnthropicApiKey();
@@ -121,10 +125,12 @@ function getAnthropicClient(model, overrideProfile) {
121
125
  // Use baseURL directly, SDK will handle API versioning
122
126
  };
123
127
  anthropicClient = new Anthropic(clientConfig);
128
+ lastClientProvider = provider ?? void 0;
124
129
  return anthropicClient;
125
130
  }
126
131
  function resetAnthropicClient() {
127
132
  anthropicClient = null;
133
+ lastClientProvider = void 0;
128
134
  }
129
135
  async function fetchAnthropicModels(baseURL, apiKey) {
130
136
  try {
@@ -350,33 +356,11 @@ function addCacheBreakpoints(messages) {
350
356
  return msg.type === "user" ? userMessageToMessageParam(msg, index > messages.length - 3) : assistantMessageToMessageParam(msg, index > messages.length - 3);
351
357
  });
352
358
  }
353
- function getAssistantMessageFromError(error) {
354
- if (error instanceof Error && error.message.includes("prompt is too long")) {
355
- return createAssistantAPIErrorMessage(PROMPT_TOO_LONG_ERROR_MESSAGE);
356
- }
357
- if (error instanceof Error && error.message.includes("Your credit balance is too low")) {
358
- return createAssistantAPIErrorMessage(CREDIT_BALANCE_TOO_LOW_ERROR_MESSAGE);
359
- }
360
- if (error instanceof Error && error.message.toLowerCase().includes("x-api-key")) {
361
- return createAssistantAPIErrorMessage(INVALID_API_KEY_ERROR_MESSAGE);
362
- }
363
- if (error instanceof Error) {
364
- if (process.env.NODE_ENV === "development") {
365
- debugLogger.error("ANTHROPIC_API_ERROR", {
366
- message: error.message,
367
- stack: error.stack
368
- });
369
- }
370
- return createAssistantAPIErrorMessage(
371
- `${API_ERROR_MESSAGE_PREFIX}: ${error.message}`
372
- );
373
- }
374
- return createAssistantAPIErrorMessage(API_ERROR_MESSAGE_PREFIX);
375
- }
376
359
  async function queryAnthropicNative(messages, systemPrompt, maxThinkingTokens, tools, signal, options) {
377
360
  const config = getGlobalConfig();
378
361
  const modelManager = getModelManager();
379
362
  const toolUseContext = options?.toolUseContext;
363
+ beginTokenTracking();
380
364
  const modelProfile = options?.modelProfile || modelManager.getModel("main");
381
365
  let anthropic;
382
366
  let model;
@@ -396,8 +380,9 @@ async function queryAnthropicNative(messages, systemPrompt, maxThinkingTokens, t
396
380
  model = modelProfile.modelName;
397
381
  provider = modelProfile.provider || config.primaryProvider || "anthropic";
398
382
  if (modelProfile.provider === "anthropic" || modelProfile.provider === "bigdream" || modelProfile.provider === "opendev") {
383
+ const resolvedApiKey = await resolveApiKey(modelProfile) ?? modelProfile.apiKey ?? "";
399
384
  const clientConfig = {
400
- apiKey: modelProfile.apiKey,
385
+ apiKey: resolvedApiKey,
401
386
  dangerouslyAllowBrowser: true,
402
387
  maxRetries: 0,
403
388
  timeout: parseInt(process.env.API_TIMEOUT_MS || String(60 * 1e3), 10),
@@ -411,7 +396,7 @@ async function queryAnthropicNative(messages, systemPrompt, maxThinkingTokens, t
411
396
  }
412
397
  anthropic = new Anthropic(clientConfig);
413
398
  } else {
414
- anthropic = getAnthropicClient(model);
399
+ anthropic = await getAnthropicClient(model);
415
400
  }
416
401
  } else {
417
402
  const errorDetails = {
@@ -426,7 +411,6 @@ async function queryAnthropicNative(messages, systemPrompt, maxThinkingTokens, t
426
411
  );
427
412
  }
428
413
  if (options?.prependCLISysprompt) {
429
- const [firstSyspromptBlock] = splitSysPromptPrefix(systemPrompt);
430
414
  systemPrompt = [getCLISyspromptPrefix(), ...systemPrompt];
431
415
  }
432
416
  const system = splitSysPromptPrefix(systemPrompt).map(
@@ -435,17 +419,21 @@ async function queryAnthropicNative(messages, systemPrompt, maxThinkingTokens, t
435
419
  type: "text"
436
420
  })
437
421
  );
422
+ addPreparedChars(JSON.stringify(system).length);
438
423
  const toolSchemas = await Promise.all(
439
- tools.map(
440
- async (tool) => ({
424
+ tools.map(async (tool) => {
425
+ const schema = {
441
426
  name: tool.name,
442
427
  description: await getToolDescriptionAsync(tool),
443
428
  input_schema: "inputJSONSchema" in tool && tool.inputJSONSchema ? tool.inputJSONSchema : zodToJsonSchema(tool.inputSchema)
444
- })
445
- )
429
+ };
430
+ addPreparedChars(JSON.stringify(schema).length);
431
+ return schema;
432
+ })
446
433
  );
447
434
  const anthropicMessages = addCacheBreakpoints(messages);
448
435
  const { systemBlocks: processedSystem, messageParams: processedMessages } = applyCacheControlWithLimits(system, anthropicMessages);
436
+ addPreparedChars(JSON.stringify(processedMessages).length);
449
437
  const startIncludingRetries = Date.now();
450
438
  logSystemPromptConstruction({
451
439
  basePrompt: systemPrompt.join("\n"),
@@ -525,10 +513,10 @@ async function queryAnthropicNative(messages, systemPrompt, maxThinkingTokens, t
525
513
  ...event.message,
526
514
  content: []
527
515
  };
528
- setStreamingState({
529
- inputTokens: event.message.usage?.input_tokens,
530
- receivedChars: 0
531
- });
516
+ if (event.message.usage?.input_tokens) {
517
+ setFinalTokens({ input: event.message.usage.input_tokens });
518
+ }
519
+ setStreamingState({ receivedChars: 0 });
532
520
  break;
533
521
  case "content_block_start":
534
522
  contentBlocks[event.index] = { ...event.content_block };
@@ -563,9 +551,11 @@ async function queryAnthropicNative(messages, systemPrompt, maxThinkingTokens, t
563
551
  }
564
552
  if (event.delta.type === "text_delta") {
565
553
  contentBlocks[blockIndex].text += event.delta.text;
566
- const currentState = getStreamingState();
554
+ addReceivedChars(event.delta.text.length);
555
+ const prevText = getStreamingState().streamingText || "";
567
556
  setStreamingState({
568
- receivedChars: (currentState.receivedChars || 0) + event.delta.text.length
557
+ streamingText: prevText + event.delta.text,
558
+ phase: "generating"
569
559
  });
570
560
  } else if (event.delta.type === "input_json_delta") {
571
561
  const currentBuffer = inputJSONBuffers.get(blockIndex) || "";
@@ -574,12 +564,16 @@ async function queryAnthropicNative(messages, systemPrompt, maxThinkingTokens, t
574
564
  currentBuffer + event.delta.partial_json
575
565
  );
576
566
  } else if (event.delta.type === "thinking_delta") {
567
+ const thinkingChunk = event.delta.thinking || "";
577
568
  const currentThinking = contentBlocks[blockIndex].thinking || "";
578
- const updatedThinking = currentThinking + (event.delta.thinking || "");
569
+ const updatedThinking = currentThinking + thinkingChunk;
579
570
  contentBlocks[blockIndex] = {
580
571
  ...contentBlocks[blockIndex],
581
572
  thinking: updatedThinking
582
573
  };
574
+ if (thinkingChunk.length > 0) {
575
+ addReceivedChars(thinkingChunk.length);
576
+ }
583
577
  setStreamingState({
584
578
  phase: "deep_thinking",
585
579
  tokenCount: updatedThinking.length,
@@ -598,9 +592,7 @@ async function queryAnthropicNative(messages, systemPrompt, maxThinkingTokens, t
598
592
  stopSequence = event.delta.stop_sequence;
599
593
  if (event.usage) {
600
594
  usage = { ...usage, ...event.usage };
601
- setStreamingState({
602
- outputTokens: event.usage.output_tokens
603
- });
595
+ setFinalTokens({ output: event.usage.output_tokens });
604
596
  }
605
597
  break;
606
598
  case "content_block_stop":
@@ -700,7 +692,6 @@ async function queryAnthropicNative(messages, systemPrompt, maxThinkingTokens, t
700
692
  debugLogger.api("ANTHROPIC_API_CALL_SUCCESS", {
701
693
  content: response.content
702
694
  });
703
- const ttftMs = start - Date.now();
704
695
  const durationMs = Date.now() - startIncludingRetries;
705
696
  const content = response.content.map((block) => {
706
697
  if (block.type === "text") {
@@ -743,7 +734,7 @@ async function queryAnthropicNative(messages, systemPrompt, maxThinkingTokens, t
743
734
  usage: response.usage
744
735
  },
745
736
  type: "assistant",
746
- uuid: nanoid(),
737
+ uuid: randomUUID(),
747
738
  durationMs,
748
739
  costUSD: 0,
749
740
  // Will be calculated below
@@ -771,7 +762,13 @@ async function queryAnthropicNative(messages, systemPrompt, maxThinkingTokens, t
771
762
  const outputTokens = response.usage.output_tokens;
772
763
  const cacheCreationInputTokens = response.usage.cache_creation_input_tokens ?? 0;
773
764
  const cacheReadInputTokens = response.usage.cache_read_input_tokens ?? 0;
774
- const costUSD = inputTokens / 1e6 * getModelInputTokenCostUSD(model) + outputTokens / 1e6 * getModelOutputTokenCostUSD(model) + cacheCreationInputTokens / 1e6 * getModelInputTokenCostUSD(model) + cacheReadInputTokens / 1e6 * (getModelInputTokenCostUSD(model) * 0.1);
765
+ const costUSD = calculateCostUSD({
766
+ model,
767
+ inputTokens,
768
+ outputTokens,
769
+ cacheReadTokens: cacheReadInputTokens,
770
+ cacheCreationTokens: cacheCreationInputTokens
771
+ });
775
772
  assistantMessage.costUSD = costUSD;
776
773
  addToTotalCost(costUSD, durationMs);
777
774
  recordTokenUsage(
@@ -791,7 +788,7 @@ async function queryAnthropicNative(messages, systemPrompt, maxThinkingTokens, t
791
788
  );
792
789
  return assistantMessage;
793
790
  } catch (error) {
794
- return getAssistantMessageFromError(error);
791
+ return getAssistantMessageFromError(error, "ANTHROPIC");
795
792
  }
796
793
  }
797
794
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/services/llm/anthropicProvider.ts"],
4
- "sourcesContent": ["/**\n * Anthropic provider \u2014 client management, API verification, cache control,\n * and the native Anthropic streaming/non-streaming query path.\n */\nimport '@anthropic-ai/sdk/shims/node'\nimport Anthropic from '@anthropic-ai/sdk'\nimport { AnthropicBedrock } from '@anthropic-ai/bedrock-sdk'\nimport { AnthropicVertex } from '@anthropic-ai/vertex-sdk'\nimport chalk from 'chalk'\nimport { nanoid } from 'nanoid'\nimport { UUID } from 'crypto'\nimport 'dotenv/config'\n\nimport type { AssistantMessage, UserMessage } from '@query'\nimport { Tool, getToolDescriptionAsync } from '@tool'\nimport type { ToolUseContext } from '@tool'\nimport {\n getAnthropicApiKey,\n getGlobalConfig,\n ModelProfile,\n} from '@utils/config'\nimport { USER_AGENT } from '@utils/http'\nimport {\n createAssistantAPIErrorMessage,\n normalizeContentFromAPI,\n} from '@utils/messages'\nimport {\n debug as debugLogger,\n getCurrentRequest,\n logLLMInteraction,\n logSystemPromptConstruction,\n} from '@utils/debugLogger'\nimport { getModelManager } from '@utils/model'\nimport { USE_BEDROCK, USE_VERTEX, getVertexRegionForModel } from '@utils/model'\nimport { zodToJsonSchema } from 'zod-to-json-schema'\nimport { getCLISyspromptPrefix } from '@constants/prompts'\nimport { ContentBlock } from '@anthropic-ai/sdk/resources/messages/messages'\nimport type {\n MessageParam,\n TextBlockParam,\n} from '@anthropic-ai/sdk/resources/index.mjs'\nimport { setStreamingState, getStreamingState } from '@utils/streamingState'\nimport type { ThinkingMetadata } from '@minto-types/thinking'\nimport { addRetryEventToTranscript } from '@utils/agentTranscripts'\nimport type { TokenTrackingContext } from '@core/tokenStats'\n\nimport { generateMintoContext } from './mintoContext'\nimport {\n API_ERROR_MESSAGE_PREFIX,\n PROMPT_TOO_LONG_ERROR_MESSAGE,\n CREDIT_BALANCE_TOO_LOW_ERROR_MESSAGE,\n INVALID_API_KEY_ERROR_MESSAGE,\n PROMPT_CACHING_ENABLED,\n MAIN_QUERY_TEMPERATURE,\n getMetadata,\n withRetry,\n getMaxTokensFromProfile,\n getModelInputTokenCostUSD,\n getModelOutputTokenCostUSD,\n addToTotalCost,\n recordTokenUsage,\n logError,\n} from './types'\n\n// \u2500\u2500 Anthropic client management \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nlet anthropicClient: Anthropic | AnthropicBedrock | AnthropicVertex | null =\n null\n\n/**\n * Get the Anthropic client, creating it if it doesn't exist\n */\nexport function getAnthropicClient(\n model?: string,\n overrideProfile?: ModelProfile | null,\n): Anthropic | AnthropicBedrock | AnthropicVertex {\n const config = getGlobalConfig()\n const provider = config.primaryProvider\n\n // If an override profile is provided, always create a fresh client\n // to use the correct API key and baseURL for sub-agents\n if (overrideProfile) {\n const overrideHeaders: { [key: string]: string } = {\n 'x-app': 'cli',\n 'User-Agent': USER_AGENT,\n }\n return new Anthropic({\n apiKey: overrideProfile.apiKey || '',\n dangerouslyAllowBrowser: true,\n maxRetries: 0,\n timeout: parseInt(process.env.API_TIMEOUT_MS || String(60 * 1000), 10),\n defaultHeaders: overrideHeaders,\n ...(overrideProfile.baseURL && { baseURL: overrideProfile.baseURL }),\n })\n }\n\n // Reset client if provider has changed to ensure correct configuration\n if (anthropicClient && provider) {\n // Always recreate client for provider-specific configurations\n anthropicClient = null\n }\n\n if (anthropicClient) {\n return anthropicClient\n }\n\n const region = getVertexRegionForModel(model)\n\n const defaultHeaders: { [key: string]: string } = {\n 'x-app': 'cli',\n 'User-Agent': USER_AGENT,\n }\n if (process.env.ANTHROPIC_AUTH_TOKEN) {\n defaultHeaders['Authorization'] =\n `Bearer ${process.env.ANTHROPIC_AUTH_TOKEN}`\n }\n\n const ARGS = {\n defaultHeaders,\n maxRetries: 0, // Disabled auto-retry in favor of manual implementation\n timeout: parseInt(process.env.API_TIMEOUT_MS || String(60 * 1000), 10),\n }\n if (USE_BEDROCK) {\n const client = new AnthropicBedrock(ARGS)\n anthropicClient = client\n return client\n }\n if (USE_VERTEX) {\n const vertexArgs = {\n ...ARGS,\n region: region || process.env.CLOUD_ML_REGION || 'us-east5',\n }\n const client = new AnthropicVertex(vertexArgs)\n anthropicClient = client\n return client\n }\n\n // Get appropriate API key and baseURL from ModelProfile\n const modelManager = getModelManager()\n const modelProfile = modelManager.getModel('main')\n\n let apiKey: string\n let baseURL: string | undefined\n\n if (modelProfile) {\n apiKey = modelProfile.apiKey || ''\n baseURL = modelProfile.baseURL\n } else {\n // Fallback to default anthropic if no ModelProfile\n apiKey = getAnthropicApiKey()\n baseURL = undefined\n }\n\n if (process.env.USER_TYPE === 'ant' && !apiKey && provider === 'anthropic') {\n console.error(\n chalk.red(\n '[ANT-ONLY] Please set the ANTHROPIC_API_KEY environment variable to use the CLI. To create a new key, go to https://console.anthropic.com/settings/keys.',\n ),\n )\n }\n\n // Create client with custom baseURL for BigDream/OpenDev\n // Anthropic SDK will append the appropriate paths (like /v1/messages)\n const clientConfig = {\n apiKey,\n dangerouslyAllowBrowser: true,\n ...ARGS,\n ...(baseURL && { baseURL }), // Use baseURL directly, SDK will handle API versioning\n }\n\n anthropicClient = new Anthropic(clientConfig)\n return anthropicClient\n}\n\n/**\n * Reset the Anthropic client to null, forcing a new client to be created on next use\n */\nexport function resetAnthropicClient(): void {\n anthropicClient = null\n}\n\n// \u2500\u2500 API verification \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Fetch available models from Anthropic API\n */\nexport async function fetchAnthropicModels(\n baseURL: string,\n apiKey: string,\n): Promise<any[]> {\n try {\n // Use provided baseURL or default to official Anthropic API\n const modelsURL = baseURL\n ? `${baseURL.replace(/\\/+$/, '')}/v1/models`\n : 'https://api.anthropic.com/v1/models'\n\n const response = await fetch(modelsURL, {\n method: 'GET',\n headers: {\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n 'User-Agent': USER_AGENT,\n },\n signal: AbortSignal.timeout(30_000),\n })\n\n if (!response.ok) {\n // Provide user-friendly error messages based on status code\n if (response.status === 401) {\n throw new Error(\n 'Invalid API key. Please check your Anthropic API key and try again.',\n )\n } else if (response.status === 403) {\n throw new Error(\n 'API key does not have permission to access models. Please check your API key permissions.',\n )\n } else if (response.status === 429) {\n throw new Error(\n 'Too many requests. Please wait a moment and try again.',\n )\n } else if (response.status >= 500) {\n throw new Error(\n 'Anthropic service is temporarily unavailable. Please try again later.',\n )\n } else {\n throw new Error(\n `Unable to connect to Anthropic API (${response.status}). Please check your internet connection and API key.`,\n )\n }\n }\n\n const data = await response.json()\n return data.data || []\n } catch (error) {\n // If it's already our custom error, pass it through\n if (\n (error instanceof Error && error.message.includes('API key')) ||\n (error instanceof Error && error.message.includes('Anthropic'))\n ) {\n throw error\n }\n\n // For network errors or other issues\n logError(error)\n throw new Error(\n 'Unable to connect to Anthropic API. Please check your internet connection and try again.',\n )\n }\n}\n\nexport async function verifyApiKey(\n apiKey: string,\n baseURL?: string,\n provider?: string,\n): Promise<boolean> {\n if (!apiKey) {\n return false\n }\n\n // For non-Anthropic providers, use OpenAI-compatible verification\n if (provider && provider !== 'anthropic') {\n try {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n }\n\n if (!baseURL) {\n debugLogger.warn('API_VERIFY', {\n error: 'No baseURL provided for non-Anthropic provider',\n })\n return false\n }\n\n const modelsURL = `${baseURL.replace(/\\/+$/, '')}/models`\n\n const response = await fetch(modelsURL, {\n method: 'GET',\n headers,\n signal: AbortSignal.timeout(30_000),\n })\n\n return response.ok\n } catch (error) {\n debugLogger.warn('API_VERIFY', {\n error: 'non-Anthropic provider verification failed',\n details: String(error),\n })\n return false\n }\n }\n\n // For Anthropic and Anthropic-compatible APIs\n const clientConfig: any = {\n apiKey,\n dangerouslyAllowBrowser: true,\n maxRetries: 3,\n defaultHeaders: {\n 'User-Agent': USER_AGENT,\n },\n }\n\n // Only add baseURL for true Anthropic-compatible APIs\n if (\n baseURL &&\n (provider === 'anthropic' ||\n provider === 'bigdream' ||\n provider === 'opendev')\n ) {\n clientConfig.baseURL = baseURL\n }\n\n const anthropic = new Anthropic(clientConfig)\n\n try {\n await withRetry(\n async () => {\n const model = 'claude-sonnet-4-20250514'\n const messages: MessageParam[] = [{ role: 'user', content: 'test' }]\n await anthropic.messages.create({\n model,\n max_tokens: 1000, // Simple test token limit for API verification\n messages,\n temperature: 0,\n metadata: getMetadata(),\n })\n return true\n },\n { maxRetries: 2 }, // Use fewer retries for API key verification\n )\n return true\n } catch (error) {\n logError(error)\n // Check for authentication error\n if (\n error instanceof Error &&\n error.message.includes(\n '{\"type\":\"error\",\"error\":{\"type\":\"authentication_error\",\"message\":\"invalid x-api-key\"}}',\n )\n ) {\n return false\n }\n throw error\n }\n}\n\n// \u2500\u2500 Cache management \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Manage cache control to ensure it doesn't exceed Claude's 4 cache block limit\n */\nfunction applyCacheControlWithLimits(\n systemBlocks: TextBlockParam[],\n messageParams: MessageParam[],\n): { systemBlocks: TextBlockParam[]; messageParams: MessageParam[] } {\n if (!PROMPT_CACHING_ENABLED) {\n return { systemBlocks, messageParams }\n }\n\n const maxCacheBlocks = 4\n let usedCacheBlocks = 0\n\n // 1. Prioritize adding cache to system prompts (highest priority)\n const processedSystemBlocks = systemBlocks.map((block, _index) => {\n if (usedCacheBlocks < maxCacheBlocks && block.text.length > 1000) {\n usedCacheBlocks++\n return {\n ...block,\n cache_control: { type: 'ephemeral' as const },\n }\n }\n const { cache_control, ...blockWithoutCache } = block\n return blockWithoutCache\n })\n\n // 2. Add cache to message content based on priority\n const processedMessageParams = messageParams.map((message, messageIndex) => {\n if (Array.isArray(message.content)) {\n const processedContent = message.content.map(\n (contentBlock, blockIndex) => {\n // Determine whether this content block should be cached\n const shouldCache =\n usedCacheBlocks < maxCacheBlocks &&\n contentBlock.type === 'text' &&\n typeof contentBlock.text === 'string' &&\n // Long documents (over 2000 characters)\n (contentBlock.text.length > 2000 ||\n // Last content block of the last message (may be important context)\n (messageIndex === messageParams.length - 1 &&\n blockIndex === message.content.length - 1 &&\n contentBlock.text.length > 500))\n\n if (shouldCache) {\n usedCacheBlocks++\n return {\n ...contentBlock,\n cache_control: { type: 'ephemeral' as const },\n }\n }\n\n // Remove existing cache_control\n const { cache_control, ...blockWithoutCache } = contentBlock as any\n return blockWithoutCache\n },\n )\n\n return {\n ...message,\n content: processedContent,\n }\n }\n\n return message\n })\n\n return {\n systemBlocks: processedSystemBlocks,\n messageParams: processedMessageParams,\n }\n}\n\nexport function userMessageToMessageParam(\n message: UserMessage,\n addCache = false,\n): MessageParam {\n if (addCache) {\n if (typeof message.message.content === 'string') {\n return {\n role: 'user',\n content: [\n {\n type: 'text',\n text: message.message.content,\n },\n ],\n }\n } else {\n return {\n role: 'user',\n content: message.message.content.map(_ => ({ ..._ })),\n }\n }\n }\n return {\n role: 'user',\n content: message.message.content,\n }\n}\n\nexport function assistantMessageToMessageParam(\n message: AssistantMessage,\n addCache = false,\n): MessageParam {\n if (addCache) {\n if (typeof message.message.content === 'string') {\n return {\n role: 'assistant',\n content: [\n {\n type: 'text',\n text: message.message.content,\n },\n ],\n }\n } else {\n return {\n role: 'assistant',\n content: message.message.content.map(_ => ({ ..._ })),\n }\n }\n }\n return {\n role: 'assistant',\n content: message.message.content,\n }\n}\n\nexport function splitSysPromptPrefix(systemPrompt: string[]): string[] {\n // split out the first block of the system prompt as the \"prefix\" for API\n const systemPromptFirstBlock = systemPrompt[0] || ''\n const systemPromptRest = systemPrompt.slice(1)\n return [systemPromptFirstBlock, systemPromptRest.join('\\n')].filter(Boolean)\n}\n\nfunction addCacheBreakpoints(\n messages: (UserMessage | AssistantMessage)[],\n): MessageParam[] {\n return messages.map((msg, index) => {\n return msg.type === 'user'\n ? userMessageToMessageParam(msg, index > messages.length - 3)\n : assistantMessageToMessageParam(msg, index > messages.length - 3)\n })\n}\n\n// \u2500\u2500 Error helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction getAssistantMessageFromError(error: unknown): AssistantMessage {\n if (error instanceof Error && error.message.includes('prompt is too long')) {\n return createAssistantAPIErrorMessage(PROMPT_TOO_LONG_ERROR_MESSAGE)\n }\n if (\n error instanceof Error &&\n error.message.includes('Your credit balance is too low')\n ) {\n return createAssistantAPIErrorMessage(CREDIT_BALANCE_TOO_LOW_ERROR_MESSAGE)\n }\n if (\n error instanceof Error &&\n error.message.toLowerCase().includes('x-api-key')\n ) {\n return createAssistantAPIErrorMessage(INVALID_API_KEY_ERROR_MESSAGE)\n }\n if (error instanceof Error) {\n if (process.env.NODE_ENV === 'development') {\n debugLogger.error('ANTHROPIC_API_ERROR', {\n message: error.message,\n stack: error.stack,\n })\n }\n return createAssistantAPIErrorMessage(\n `${API_ERROR_MESSAGE_PREFIX}: ${error.message}`,\n )\n }\n return createAssistantAPIErrorMessage(API_ERROR_MESSAGE_PREFIX)\n}\n\n// \u2500\u2500 queryAnthropicNative \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport async function queryAnthropicNative(\n messages: (UserMessage | AssistantMessage)[],\n systemPrompt: string[],\n maxThinkingTokens: number,\n tools: Tool[],\n signal: AbortSignal,\n options?: {\n safeMode: boolean\n model: string\n prependCLISysprompt: boolean\n modelProfile?: ModelProfile | null\n toolUseContext?: ToolUseContext\n },\n): Promise<AssistantMessage> {\n const config = getGlobalConfig()\n const modelManager = getModelManager()\n const toolUseContext = options?.toolUseContext\n\n const modelProfile = options?.modelProfile || modelManager.getModel('main')\n let anthropic: Anthropic | AnthropicBedrock | AnthropicVertex\n let model: string\n let provider: string\n\n debugLogger.api('MODEL_CONFIG_ANTHROPIC', {\n modelProfileFound: !!modelProfile,\n modelProfileId: modelProfile?.modelName,\n modelProfileName: modelProfile?.name,\n modelProfileModelName: modelProfile?.modelName,\n modelProfileProvider: modelProfile?.provider,\n modelProfileBaseURL: modelProfile?.baseURL,\n modelProfileApiKeyExists: !!modelProfile?.apiKey,\n optionsModel: options?.model,\n requestId: getCurrentRequest()?.id,\n })\n\n if (modelProfile) {\n model = modelProfile.modelName\n provider = modelProfile.provider || config.primaryProvider || 'anthropic'\n\n if (\n modelProfile.provider === 'anthropic' ||\n modelProfile.provider === 'bigdream' ||\n modelProfile.provider === 'opendev'\n ) {\n const clientConfig: any = {\n apiKey: modelProfile.apiKey,\n dangerouslyAllowBrowser: true,\n maxRetries: 0,\n timeout: parseInt(process.env.API_TIMEOUT_MS || String(60 * 1000), 10),\n defaultHeaders: {\n 'x-app': 'cli',\n 'User-Agent': USER_AGENT,\n },\n }\n\n if (modelProfile.baseURL) {\n clientConfig.baseURL = modelProfile.baseURL\n }\n\n anthropic = new Anthropic(clientConfig)\n } else {\n anthropic = getAnthropicClient(model)\n }\n } else {\n const errorDetails = {\n modelProfileExists: !!modelProfile,\n modelProfileModelName: modelProfile?.modelName,\n requestedModel: options?.model,\n requestId: getCurrentRequest()?.id,\n }\n debugLogger.error('ANTHROPIC_FALLBACK_ERROR', errorDetails)\n throw new Error(\n `No valid ModelProfile available for Anthropic provider. Please configure model through /model command. Debug: ${JSON.stringify(errorDetails)}`,\n )\n }\n\n // Prepend system prompt block for easy API identification\n if (options?.prependCLISysprompt) {\n const [firstSyspromptBlock] = splitSysPromptPrefix(systemPrompt)\n systemPrompt = [getCLISyspromptPrefix(), ...systemPrompt]\n }\n\n const system: TextBlockParam[] = splitSysPromptPrefix(systemPrompt).map(\n _ => ({\n text: _,\n type: 'text',\n }),\n )\n\n const toolSchemas = await Promise.all(\n tools.map(\n async tool =>\n ({\n name: tool.name,\n description: await getToolDescriptionAsync(tool),\n input_schema:\n 'inputJSONSchema' in tool && tool.inputJSONSchema\n ? tool.inputJSONSchema\n : zodToJsonSchema(tool.inputSchema),\n }) as unknown as Anthropic.Beta.Messages.BetaTool,\n ),\n )\n\n const anthropicMessages = addCacheBreakpoints(messages)\n\n const { systemBlocks: processedSystem, messageParams: processedMessages } =\n applyCacheControlWithLimits(system, anthropicMessages)\n const startIncludingRetries = Date.now()\n\n logSystemPromptConstruction({\n basePrompt: systemPrompt.join('\\n'),\n mintoContext: generateMintoContext() || '',\n reminders: [],\n finalPrompt: systemPrompt.join('\\n'),\n })\n\n let start = Date.now()\n let attemptNumber = 0\n let response\n\n try {\n response = await withRetry(\n async attempt => {\n attemptNumber = attempt\n start = Date.now()\n\n const params: Anthropic.Beta.Messages.MessageCreateParams = {\n model,\n max_tokens: getMaxTokensFromProfile(modelProfile),\n messages: processedMessages,\n system: processedSystem,\n tools: toolSchemas.length > 0 ? toolSchemas : undefined,\n tool_choice: toolSchemas.length > 0 ? { type: 'auto' } : undefined,\n }\n\n if (maxThinkingTokens > 0) {\n ;(params as any).extra_headers = {\n 'anthropic-beta': 'max-tokens-3-5-sonnet-2024-07-15',\n }\n ;(params as any).thinking = { max_tokens: maxThinkingTokens }\n }\n\n debugLogger.api('ANTHROPIC_API_CALL_START_STREAMING', {\n endpoint: modelProfile?.baseURL || 'DEFAULT_ANTHROPIC',\n model,\n provider,\n apiKeyConfigured: !!modelProfile?.apiKey,\n apiKeyPrefix: modelProfile?.apiKey\n ? modelProfile.apiKey.substring(0, 8)\n : null,\n maxTokens: params.max_tokens,\n temperature: MAIN_QUERY_TEMPERATURE,\n params: params,\n messageCount: params.messages?.length || 0,\n streamMode: true,\n toolsCount: toolSchemas.length,\n thinkingTokens: maxThinkingTokens,\n timestamp: new Date().toISOString(),\n modelProfileId: modelProfile?.modelName,\n modelProfileName: modelProfile?.name,\n })\n\n if (config.stream) {\n const stream = await anthropic.beta.messages.create(\n {\n ...params,\n stream: true,\n },\n {\n signal: signal,\n },\n )\n\n let finalResponse: any | null = null\n let messageStartEvent: any = null\n const contentBlocks: any[] = []\n const inputJSONBuffers = new Map<number, string>()\n let usage: any = null\n let stopReason: string | null = null\n let stopSequence: string | null = null\n\n for await (const event of stream) {\n if (signal.aborted) {\n debugLogger.flow('STREAM_ABORTED', {\n eventType: event.type,\n timestamp: Date.now(),\n })\n throw new Error('Request was cancelled')\n }\n\n switch (event.type) {\n case 'message_start':\n messageStartEvent = event\n finalResponse = {\n ...event.message,\n content: [],\n }\n setStreamingState({\n inputTokens: event.message.usage?.input_tokens,\n receivedChars: 0,\n })\n break\n\n case 'content_block_start':\n contentBlocks[event.index] = { ...event.content_block }\n if (event.content_block.type === 'tool_use') {\n inputJSONBuffers.set(event.index, '')\n }\n if (event.content_block.type === 'thinking') {\n const thinkingStartTime = Date.now()\n setStreamingState({\n phase: 'deep_thinking',\n tokenCount: 0,\n thinkingMaxTokens: maxThinkingTokens,\n thinkingStartTime,\n })\n debugLogger.flow('THINKING_BLOCK_START', {\n index: event.index,\n maxTokens: maxThinkingTokens,\n startTime: thinkingStartTime,\n })\n }\n break\n\n case 'content_block_delta':\n const blockIndex = event.index\n\n if (!contentBlocks[blockIndex]) {\n contentBlocks[blockIndex] = {\n type:\n event.delta.type === 'text_delta' ? 'text' : 'tool_use',\n text: event.delta.type === 'text_delta' ? '' : undefined,\n }\n if (event.delta.type === 'input_json_delta') {\n inputJSONBuffers.set(blockIndex, '')\n }\n }\n\n if (event.delta.type === 'text_delta') {\n contentBlocks[blockIndex].text += event.delta.text\n const currentState = getStreamingState()\n setStreamingState({\n receivedChars:\n (currentState.receivedChars || 0) +\n event.delta.text.length,\n })\n } else if (event.delta.type === 'input_json_delta') {\n const currentBuffer = inputJSONBuffers.get(blockIndex) || ''\n inputJSONBuffers.set(\n blockIndex,\n currentBuffer + event.delta.partial_json,\n )\n }\n // Handle thinking_delta events to update token count\n else if (event.delta.type === 'thinking_delta') {\n const currentThinking =\n contentBlocks[blockIndex].thinking || ''\n const updatedThinking =\n currentThinking + (event.delta.thinking || '')\n contentBlocks[blockIndex] = {\n ...contentBlocks[blockIndex],\n thinking: updatedThinking,\n }\n\n setStreamingState({\n phase: 'deep_thinking',\n tokenCount: updatedThinking.length,\n thinkingMaxTokens: maxThinkingTokens,\n })\n\n debugLogger.trace('THINKING_DELTA', {\n index: blockIndex,\n tokenCount: updatedThinking.length,\n })\n }\n break\n\n case 'message_delta':\n if (event.delta.stop_reason)\n stopReason = event.delta.stop_reason\n if (event.delta.stop_sequence)\n stopSequence = event.delta.stop_sequence\n if (event.usage) {\n usage = { ...usage, ...event.usage }\n setStreamingState({\n outputTokens: event.usage.output_tokens,\n })\n }\n break\n\n case 'content_block_stop':\n const stopIndex = event.index\n const block = contentBlocks[stopIndex]\n\n if (block?.type === 'thinking') {\n const streamState = getStreamingState()\n const thinkingDurationMs = streamState.thinkingStartTime\n ? Date.now() - streamState.thinkingStartTime\n : 0\n setStreamingState({\n phase: 'generating',\n thinkingDurationMs,\n })\n debugLogger.flow('THINKING_BLOCK_COMPLETE', {\n index: stopIndex,\n finalTokenCount: block.thinking?.length || 0,\n durationMs: thinkingDurationMs,\n })\n }\n\n if (\n block?.type === 'tool_use' &&\n inputJSONBuffers.has(stopIndex)\n ) {\n const jsonStr = inputJSONBuffers.get(stopIndex)\n if (jsonStr) {\n try {\n block.input = JSON.parse(jsonStr)\n } catch (error) {\n const errorMsg =\n error instanceof Error ? error.message : String(error)\n debugLogger.error('JSON_PARSE_ERROR', {\n blockIndex: stopIndex,\n jsonStr:\n jsonStr.length > 500\n ? jsonStr.slice(0, 500) + '...'\n : jsonStr,\n error: errorMsg,\n })\n block.input = {\n __parse_error__: true,\n __error_message__: `JSON parse failed: ${errorMsg}`,\n __raw_json_preview__:\n jsonStr.length > 200\n ? jsonStr.slice(0, 200) + '...'\n : jsonStr,\n }\n }\n inputJSONBuffers.delete(stopIndex)\n }\n }\n break\n\n case 'message_stop':\n inputJSONBuffers.clear()\n break\n }\n\n if (event.type === 'message_stop') {\n break\n }\n }\n\n if (!finalResponse || !messageStartEvent) {\n throw new Error('Stream ended without proper message structure')\n }\n\n // Construct the final response\n finalResponse = {\n ...messageStartEvent.message,\n content: contentBlocks.filter(Boolean),\n stop_reason: stopReason,\n stop_sequence: stopSequence,\n usage: {\n ...messageStartEvent.message.usage,\n ...usage,\n },\n }\n\n return finalResponse\n } else {\n debugLogger.api('ANTHROPIC_API_CALL_START_NON_STREAMING', {\n endpoint: modelProfile?.baseURL || 'DEFAULT_ANTHROPIC',\n model,\n provider,\n apiKeyConfigured: !!modelProfile?.apiKey,\n apiKeyPrefix: modelProfile?.apiKey\n ? modelProfile.apiKey.substring(0, 8)\n : null,\n maxTokens: params.max_tokens,\n temperature: MAIN_QUERY_TEMPERATURE,\n messageCount: params.messages?.length || 0,\n streamMode: false,\n toolsCount: toolSchemas.length,\n thinkingTokens: maxThinkingTokens,\n timestamp: new Date().toISOString(),\n modelProfileId: modelProfile?.modelName,\n modelProfileName: modelProfile?.name,\n })\n\n return await anthropic.beta.messages.create(params, {\n signal: signal,\n })\n }\n },\n {\n signal,\n onRetry: toolUseContext?.agentId\n ? ({ attempt, maxRetries, error, delayMs }) => {\n addRetryEventToTranscript(toolUseContext.agentId!, {\n attempt,\n maxRetries,\n errorMessage: error.message,\n delayMs,\n })\n }\n : undefined,\n },\n )\n\n debugLogger.api('ANTHROPIC_API_CALL_SUCCESS', {\n content: response.content,\n })\n\n const ttftMs = start - Date.now()\n const durationMs = Date.now() - startIncludingRetries\n\n const content = response.content.map((block: ContentBlock) => {\n if (block.type === 'text') {\n return {\n type: 'text' as const,\n text: block.text,\n }\n } else if (block.type === 'tool_use') {\n return {\n type: 'tool_use' as const,\n id: block.id,\n name: block.name,\n input: block.input,\n }\n }\n return block\n })\n\n // Build thinking metadata if thinking blocks are present\n const thinkingBlocks = content.filter(\n (block): block is ContentBlock & { type: 'thinking'; thinking: string } =>\n block.type === 'thinking',\n )\n const streamState = getStreamingState()\n const thinkingMetadata: ThinkingMetadata | undefined =\n thinkingBlocks.length > 0\n ? {\n charCount: thinkingBlocks.reduce(\n (sum, b) => sum + (b.thinking?.length || 0),\n 0,\n ),\n durationMs: streamState.thinkingDurationMs || 0,\n startTime: streamState.thinkingStartTime || Date.now(),\n isComplete: true,\n }\n : undefined\n\n const assistantMessage: AssistantMessage = {\n message: {\n id: response.id,\n content,\n model: response.model,\n role: 'assistant',\n stop_reason: response.stop_reason,\n stop_sequence: response.stop_sequence,\n type: 'message',\n usage: response.usage,\n },\n type: 'assistant',\n uuid: nanoid() as UUID,\n durationMs,\n costUSD: 0, // Will be calculated below\n thinkingMetadata,\n }\n\n const systemMessages = system.map(block => ({\n role: 'system',\n content: block.text,\n }))\n\n logLLMInteraction({\n systemPrompt: systemPrompt.join('\\n'),\n messages: [...systemMessages, ...anthropicMessages],\n response: response,\n usage: response.usage\n ? {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n }\n : undefined,\n timing: {\n start: start,\n end: Date.now(),\n },\n apiFormat: 'anthropic',\n })\n\n // Calculate cost using native Anthropic usage data\n const inputTokens = response.usage.input_tokens\n const outputTokens = response.usage.output_tokens\n const cacheCreationInputTokens =\n response.usage.cache_creation_input_tokens ?? 0\n const cacheReadInputTokens = response.usage.cache_read_input_tokens ?? 0\n\n const costUSD =\n (inputTokens / 1_000_000) * getModelInputTokenCostUSD(model) +\n (outputTokens / 1_000_000) * getModelOutputTokenCostUSD(model) +\n (cacheCreationInputTokens / 1_000_000) *\n getModelInputTokenCostUSD(model) +\n (cacheReadInputTokens / 1_000_000) *\n (getModelInputTokenCostUSD(model) * 0.1) // Cache reads are 10% of input cost\n\n assistantMessage.costUSD = costUSD\n addToTotalCost(costUSD, durationMs)\n\n // Record token usage to unified stats manager\n recordTokenUsage(\n {\n inputTokens,\n outputTokens,\n cacheCreationTokens: cacheCreationInputTokens,\n cacheReadTokens: cacheReadInputTokens,\n },\n costUSD,\n model,\n toolUseContext\n ? ({\n agentId: toolUseContext.agentId,\n toolUseId: toolUseContext.toolUseId,\n model,\n } as TokenTrackingContext)\n : undefined,\n )\n\n return assistantMessage\n } catch (error) {\n return getAssistantMessageFromError(error)\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Anthropic provider \u2014 client management, API verification, cache control,\n * and the native Anthropic streaming/non-streaming query path.\n */\nimport '@anthropic-ai/sdk/shims/node'\nimport Anthropic from '@anthropic-ai/sdk'\nimport { AnthropicBedrock } from '@anthropic-ai/bedrock-sdk'\nimport { AnthropicVertex } from '@anthropic-ai/vertex-sdk'\nimport chalk from 'chalk'\nimport { randomUUID, UUID } from 'crypto'\nimport 'dotenv/config'\n\nimport type { AssistantMessage, UserMessage } from '@query'\nimport { Tool, getToolDescriptionAsync } from '@tool'\nimport type { ToolUseContext } from '@tool'\nimport {\n getAnthropicApiKey,\n getGlobalConfig,\n ModelProfile,\n resolveApiKey,\n} from '@utils/config'\nimport { USER_AGENT } from '@utils/http'\nimport { normalizeContentFromAPI } from '@utils/messages'\nimport {\n debug as debugLogger,\n getCurrentRequest,\n logLLMInteraction,\n logSystemPromptConstruction,\n} from '@utils/debugLogger'\nimport { getModelManager } from '@utils/model'\nimport { USE_BEDROCK, USE_VERTEX, getVertexRegionForModel } from '@utils/model'\nimport { zodToJsonSchema } from 'zod-to-json-schema'\nimport { getCLISyspromptPrefix } from '@constants/prompts'\nimport { ContentBlock } from '@anthropic-ai/sdk/resources/messages/messages'\nimport type {\n MessageParam,\n TextBlockParam,\n} from '@anthropic-ai/sdk/resources/index.mjs'\nimport { setStreamingState, getStreamingState } from '@utils/streamingState'\nimport {\n beginTokenTracking,\n addPreparedChars,\n addReceivedChars,\n setFinalTokens,\n} from '@utils/tokenProgress'\nimport type { ThinkingMetadata } from '@minto-types/thinking'\nimport { addRetryEventToTranscript } from '@utils/agentTranscripts'\nimport type { TokenTrackingContext } from '@core/tokenStats'\n\nimport { generateMintoContext } from './mintoContext'\nimport {\n PROMPT_CACHING_ENABLED,\n MAIN_QUERY_TEMPERATURE,\n getMetadata,\n withRetry,\n getMaxTokensFromProfile,\n calculateCostUSD,\n getAssistantMessageFromError,\n addToTotalCost,\n recordTokenUsage,\n logError,\n} from './types'\n\n// \u2500\u2500 Anthropic client management \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nlet anthropicClient: Anthropic | AnthropicBedrock | AnthropicVertex | null =\n null\nlet lastClientProvider: string | undefined\n\n/**\n * Get the Anthropic client, creating it if it doesn't exist\n */\nexport async function getAnthropicClient(\n model?: string,\n overrideProfile?: ModelProfile | null,\n): Promise<Anthropic | AnthropicBedrock | AnthropicVertex> {\n const config = getGlobalConfig()\n const provider = config.primaryProvider\n\n // If an override profile is provided, always create a fresh client\n // to use the correct API key and baseURL for sub-agents\n if (overrideProfile) {\n const overrideHeaders: { [key: string]: string } = {\n 'x-app': 'cli',\n 'User-Agent': USER_AGENT,\n }\n const resolvedOverrideKey =\n (await resolveApiKey(overrideProfile)) ?? overrideProfile.apiKey ?? ''\n return new Anthropic({\n apiKey: resolvedOverrideKey,\n dangerouslyAllowBrowser: true,\n maxRetries: 0,\n timeout: parseInt(process.env.API_TIMEOUT_MS || String(60 * 1000), 10),\n defaultHeaders: overrideHeaders,\n ...(overrideProfile.baseURL && { baseURL: overrideProfile.baseURL }),\n })\n }\n\n // Reset client only if provider has actually changed\n if (anthropicClient && provider && provider !== lastClientProvider) {\n anthropicClient = null\n }\n\n if (anthropicClient) {\n return anthropicClient\n }\n\n const region = getVertexRegionForModel(model)\n\n const defaultHeaders: { [key: string]: string } = {\n 'x-app': 'cli',\n 'User-Agent': USER_AGENT,\n }\n if (process.env.ANTHROPIC_AUTH_TOKEN) {\n defaultHeaders['Authorization'] =\n `Bearer ${process.env.ANTHROPIC_AUTH_TOKEN}`\n }\n\n const ARGS = {\n defaultHeaders,\n maxRetries: 0, // Disabled auto-retry in favor of manual implementation\n timeout: parseInt(process.env.API_TIMEOUT_MS || String(60 * 1000), 10),\n }\n if (USE_BEDROCK) {\n const client = new AnthropicBedrock(ARGS)\n anthropicClient = client\n lastClientProvider = 'bedrock'\n return client\n }\n if (USE_VERTEX) {\n const vertexArgs = {\n ...ARGS,\n region: region || process.env.CLOUD_ML_REGION || 'us-east5',\n }\n const client = new AnthropicVertex(vertexArgs)\n anthropicClient = client\n lastClientProvider = 'vertex'\n return client\n }\n\n // Get appropriate API key and baseURL from ModelProfile\n const modelManager = getModelManager()\n const modelProfile = modelManager.getModel('main')\n\n let apiKey: string\n let baseURL: string | undefined\n\n if (modelProfile) {\n apiKey = (await resolveApiKey(modelProfile)) ?? modelProfile.apiKey ?? ''\n baseURL = modelProfile.baseURL\n } else {\n // Fallback to default anthropic if no ModelProfile\n apiKey = getAnthropicApiKey()\n baseURL = undefined\n }\n\n if (process.env.USER_TYPE === 'ant' && !apiKey && provider === 'anthropic') {\n console.error(\n chalk.red(\n '[ANT-ONLY] Please set the ANTHROPIC_API_KEY environment variable to use the CLI. To create a new key, go to https://console.anthropic.com/settings/keys.',\n ),\n )\n }\n\n // Create client with custom baseURL for BigDream/OpenDev\n // Anthropic SDK will append the appropriate paths (like /v1/messages)\n const clientConfig = {\n apiKey,\n dangerouslyAllowBrowser: true,\n ...ARGS,\n ...(baseURL && { baseURL }), // Use baseURL directly, SDK will handle API versioning\n }\n\n anthropicClient = new Anthropic(clientConfig)\n lastClientProvider = provider ?? undefined\n return anthropicClient\n}\n\n/**\n * Reset the Anthropic client to null, forcing a new client to be created on next use\n */\nexport function resetAnthropicClient(): void {\n anthropicClient = null\n lastClientProvider = undefined\n}\n\n// \u2500\u2500 API verification \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Fetch available models from Anthropic API\n */\nexport async function fetchAnthropicModels(\n baseURL: string,\n apiKey: string,\n): Promise<any[]> {\n try {\n // Use provided baseURL or default to official Anthropic API\n const modelsURL = baseURL\n ? `${baseURL.replace(/\\/+$/, '')}/v1/models`\n : 'https://api.anthropic.com/v1/models'\n\n const response = await fetch(modelsURL, {\n method: 'GET',\n headers: {\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n 'User-Agent': USER_AGENT,\n },\n signal: AbortSignal.timeout(30_000),\n })\n\n if (!response.ok) {\n // Provide user-friendly error messages based on status code\n if (response.status === 401) {\n throw new Error(\n 'Invalid API key. Please check your Anthropic API key and try again.',\n )\n } else if (response.status === 403) {\n throw new Error(\n 'API key does not have permission to access models. Please check your API key permissions.',\n )\n } else if (response.status === 429) {\n throw new Error(\n 'Too many requests. Please wait a moment and try again.',\n )\n } else if (response.status >= 500) {\n throw new Error(\n 'Anthropic service is temporarily unavailable. Please try again later.',\n )\n } else {\n throw new Error(\n `Unable to connect to Anthropic API (${response.status}). Please check your internet connection and API key.`,\n )\n }\n }\n\n const data = await response.json()\n return data.data || []\n } catch (error) {\n // If it's already our custom error, pass it through\n if (\n (error instanceof Error && error.message.includes('API key')) ||\n (error instanceof Error && error.message.includes('Anthropic'))\n ) {\n throw error\n }\n\n // For network errors or other issues\n logError(error)\n throw new Error(\n 'Unable to connect to Anthropic API. Please check your internet connection and try again.',\n )\n }\n}\n\nexport async function verifyApiKey(\n apiKey: string,\n baseURL?: string,\n provider?: string,\n): Promise<boolean> {\n if (!apiKey) {\n return false\n }\n\n // For non-Anthropic providers, use OpenAI-compatible verification\n if (provider && provider !== 'anthropic') {\n try {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n }\n\n if (!baseURL) {\n debugLogger.warn('API_VERIFY', {\n error: 'No baseURL provided for non-Anthropic provider',\n })\n return false\n }\n\n const modelsURL = `${baseURL.replace(/\\/+$/, '')}/models`\n\n const response = await fetch(modelsURL, {\n method: 'GET',\n headers,\n signal: AbortSignal.timeout(30_000),\n })\n\n return response.ok\n } catch (error) {\n debugLogger.warn('API_VERIFY', {\n error: 'non-Anthropic provider verification failed',\n details: String(error),\n })\n return false\n }\n }\n\n // For Anthropic and Anthropic-compatible APIs\n const clientConfig: any = {\n apiKey,\n dangerouslyAllowBrowser: true,\n maxRetries: 3,\n defaultHeaders: {\n 'User-Agent': USER_AGENT,\n },\n }\n\n // Only add baseURL for true Anthropic-compatible APIs\n if (\n baseURL &&\n (provider === 'anthropic' ||\n provider === 'bigdream' ||\n provider === 'opendev')\n ) {\n clientConfig.baseURL = baseURL\n }\n\n const anthropic = new Anthropic(clientConfig)\n\n try {\n await withRetry(\n async () => {\n const model = 'claude-sonnet-4-20250514'\n const messages: MessageParam[] = [{ role: 'user', content: 'test' }]\n await anthropic.messages.create({\n model,\n max_tokens: 1000, // Simple test token limit for API verification\n messages,\n temperature: 0,\n metadata: getMetadata(),\n })\n return true\n },\n { maxRetries: 2 }, // Use fewer retries for API key verification\n )\n return true\n } catch (error) {\n logError(error)\n // Check for authentication error\n if (\n error instanceof Error &&\n error.message.includes(\n '{\"type\":\"error\",\"error\":{\"type\":\"authentication_error\",\"message\":\"invalid x-api-key\"}}',\n )\n ) {\n return false\n }\n throw error\n }\n}\n\n// \u2500\u2500 Cache management \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Manage cache control to ensure it doesn't exceed Claude's 4 cache block limit\n */\nfunction applyCacheControlWithLimits(\n systemBlocks: TextBlockParam[],\n messageParams: MessageParam[],\n): { systemBlocks: TextBlockParam[]; messageParams: MessageParam[] } {\n if (!PROMPT_CACHING_ENABLED) {\n return { systemBlocks, messageParams }\n }\n\n const maxCacheBlocks = 4\n let usedCacheBlocks = 0\n\n // 1. Prioritize adding cache to system prompts (highest priority)\n const processedSystemBlocks = systemBlocks.map((block, _index) => {\n if (usedCacheBlocks < maxCacheBlocks && block.text.length > 1000) {\n usedCacheBlocks++\n return {\n ...block,\n cache_control: { type: 'ephemeral' as const },\n }\n }\n const { cache_control, ...blockWithoutCache } = block\n return blockWithoutCache\n })\n\n // 2. Add cache to message content based on priority\n const processedMessageParams = messageParams.map((message, messageIndex) => {\n if (Array.isArray(message.content)) {\n const processedContent = message.content.map(\n (contentBlock, blockIndex) => {\n // Determine whether this content block should be cached\n const shouldCache =\n usedCacheBlocks < maxCacheBlocks &&\n contentBlock.type === 'text' &&\n typeof contentBlock.text === 'string' &&\n // Long documents (over 2000 characters)\n (contentBlock.text.length > 2000 ||\n // Last content block of the last message (may be important context)\n (messageIndex === messageParams.length - 1 &&\n blockIndex === message.content.length - 1 &&\n contentBlock.text.length > 500))\n\n if (shouldCache) {\n usedCacheBlocks++\n return {\n ...contentBlock,\n cache_control: { type: 'ephemeral' as const },\n }\n }\n\n // Remove existing cache_control\n const { cache_control, ...blockWithoutCache } = contentBlock as any\n return blockWithoutCache\n },\n )\n\n return {\n ...message,\n content: processedContent,\n }\n }\n\n return message\n })\n\n return {\n systemBlocks: processedSystemBlocks,\n messageParams: processedMessageParams,\n }\n}\n\nexport function userMessageToMessageParam(\n message: UserMessage,\n addCache = false,\n): MessageParam {\n if (addCache) {\n if (typeof message.message.content === 'string') {\n return {\n role: 'user',\n content: [\n {\n type: 'text',\n text: message.message.content,\n },\n ],\n }\n } else {\n return {\n role: 'user',\n content: message.message.content.map(_ => ({ ..._ })),\n }\n }\n }\n return {\n role: 'user',\n content: message.message.content,\n }\n}\n\nexport function assistantMessageToMessageParam(\n message: AssistantMessage,\n addCache = false,\n): MessageParam {\n if (addCache) {\n if (typeof message.message.content === 'string') {\n return {\n role: 'assistant',\n content: [\n {\n type: 'text',\n text: message.message.content,\n },\n ],\n }\n } else {\n return {\n role: 'assistant',\n content: message.message.content.map(_ => ({ ..._ })),\n }\n }\n }\n return {\n role: 'assistant',\n content: message.message.content,\n }\n}\n\nexport function splitSysPromptPrefix(systemPrompt: string[]): string[] {\n // split out the first block of the system prompt as the \"prefix\" for API\n const systemPromptFirstBlock = systemPrompt[0] || ''\n const systemPromptRest = systemPrompt.slice(1)\n return [systemPromptFirstBlock, systemPromptRest.join('\\n')].filter(Boolean)\n}\n\nfunction addCacheBreakpoints(\n messages: (UserMessage | AssistantMessage)[],\n): MessageParam[] {\n return messages.map((msg, index) => {\n return msg.type === 'user'\n ? userMessageToMessageParam(msg, index > messages.length - 3)\n : assistantMessageToMessageParam(msg, index > messages.length - 3)\n })\n}\n\n// Error helpers: uses shared getAssistantMessageFromError from types.ts\n\n// \u2500\u2500 queryAnthropicNative \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport async function queryAnthropicNative(\n messages: (UserMessage | AssistantMessage)[],\n systemPrompt: string[],\n maxThinkingTokens: number,\n tools: Tool[],\n signal: AbortSignal,\n options?: {\n safeMode: boolean\n model: string\n prependCLISysprompt: boolean\n modelProfile?: ModelProfile | null\n toolUseContext?: ToolUseContext\n },\n): Promise<AssistantMessage> {\n const config = getGlobalConfig()\n const modelManager = getModelManager()\n const toolUseContext = options?.toolUseContext\n\n beginTokenTracking()\n\n const modelProfile = options?.modelProfile || modelManager.getModel('main')\n let anthropic: Anthropic | AnthropicBedrock | AnthropicVertex\n let model: string\n let provider: string\n\n debugLogger.api('MODEL_CONFIG_ANTHROPIC', {\n modelProfileFound: !!modelProfile,\n modelProfileId: modelProfile?.modelName,\n modelProfileName: modelProfile?.name,\n modelProfileModelName: modelProfile?.modelName,\n modelProfileProvider: modelProfile?.provider,\n modelProfileBaseURL: modelProfile?.baseURL,\n modelProfileApiKeyExists: !!modelProfile?.apiKey,\n optionsModel: options?.model,\n requestId: getCurrentRequest()?.id,\n })\n\n if (modelProfile) {\n model = modelProfile.modelName\n provider = modelProfile.provider || config.primaryProvider || 'anthropic'\n\n if (\n modelProfile.provider === 'anthropic' ||\n modelProfile.provider === 'bigdream' ||\n modelProfile.provider === 'opendev'\n ) {\n const resolvedApiKey =\n (await resolveApiKey(modelProfile)) ?? modelProfile.apiKey ?? ''\n const clientConfig: any = {\n apiKey: resolvedApiKey,\n dangerouslyAllowBrowser: true,\n maxRetries: 0,\n timeout: parseInt(process.env.API_TIMEOUT_MS || String(60 * 1000), 10),\n defaultHeaders: {\n 'x-app': 'cli',\n 'User-Agent': USER_AGENT,\n },\n }\n\n if (modelProfile.baseURL) {\n clientConfig.baseURL = modelProfile.baseURL\n }\n\n anthropic = new Anthropic(clientConfig)\n } else {\n anthropic = await getAnthropicClient(model)\n }\n } else {\n const errorDetails = {\n modelProfileExists: !!modelProfile,\n modelProfileModelName: modelProfile?.modelName,\n requestedModel: options?.model,\n requestId: getCurrentRequest()?.id,\n }\n debugLogger.error('ANTHROPIC_FALLBACK_ERROR', errorDetails)\n throw new Error(\n `No valid ModelProfile available for Anthropic provider. Please configure model through /model command. Debug: ${JSON.stringify(errorDetails)}`,\n )\n }\n\n // Prepend system prompt block for easy API identification\n if (options?.prependCLISysprompt) {\n systemPrompt = [getCLISyspromptPrefix(), ...systemPrompt]\n }\n\n const system: TextBlockParam[] = splitSysPromptPrefix(systemPrompt).map(\n _ => ({\n text: _,\n type: 'text',\n }),\n )\n\n // Track system prompt preparation progress\n addPreparedChars(JSON.stringify(system).length)\n\n const toolSchemas = await Promise.all(\n tools.map(async tool => {\n const schema = {\n name: tool.name,\n description: await getToolDescriptionAsync(tool),\n input_schema:\n 'inputJSONSchema' in tool && tool.inputJSONSchema\n ? tool.inputJSONSchema\n : zodToJsonSchema(tool.inputSchema),\n } as unknown as Anthropic.Beta.Messages.BetaTool\n addPreparedChars(JSON.stringify(schema).length)\n return schema\n }),\n )\n\n const anthropicMessages = addCacheBreakpoints(messages)\n\n const { systemBlocks: processedSystem, messageParams: processedMessages } =\n applyCacheControlWithLimits(system, anthropicMessages)\n\n // Track message preparation progress (final stage)\n addPreparedChars(JSON.stringify(processedMessages).length)\n\n const startIncludingRetries = Date.now()\n\n logSystemPromptConstruction({\n basePrompt: systemPrompt.join('\\n'),\n mintoContext: generateMintoContext() || '',\n reminders: [],\n finalPrompt: systemPrompt.join('\\n'),\n })\n\n let start = Date.now()\n let attemptNumber = 0\n let response\n\n try {\n response = await withRetry(\n async attempt => {\n attemptNumber = attempt\n start = Date.now()\n\n const params: Anthropic.Beta.Messages.MessageCreateParams = {\n model,\n max_tokens: getMaxTokensFromProfile(modelProfile),\n messages: processedMessages,\n system: processedSystem,\n tools: toolSchemas.length > 0 ? toolSchemas : undefined,\n tool_choice: toolSchemas.length > 0 ? { type: 'auto' } : undefined,\n }\n\n if (maxThinkingTokens > 0) {\n ;(params as any).extra_headers = {\n 'anthropic-beta': 'max-tokens-3-5-sonnet-2024-07-15',\n }\n ;(params as any).thinking = { max_tokens: maxThinkingTokens }\n }\n\n debugLogger.api('ANTHROPIC_API_CALL_START_STREAMING', {\n endpoint: modelProfile?.baseURL || 'DEFAULT_ANTHROPIC',\n model,\n provider,\n apiKeyConfigured: !!modelProfile?.apiKey,\n apiKeyPrefix: modelProfile?.apiKey\n ? modelProfile.apiKey.substring(0, 8)\n : null,\n maxTokens: params.max_tokens,\n temperature: MAIN_QUERY_TEMPERATURE,\n params: params,\n messageCount: params.messages?.length || 0,\n streamMode: true,\n toolsCount: toolSchemas.length,\n thinkingTokens: maxThinkingTokens,\n timestamp: new Date().toISOString(),\n modelProfileId: modelProfile?.modelName,\n modelProfileName: modelProfile?.name,\n })\n\n if (config.stream) {\n const stream = await anthropic.beta.messages.create(\n {\n ...params,\n stream: true,\n },\n {\n signal: signal,\n },\n )\n\n let finalResponse: any | null = null\n let messageStartEvent: any = null\n const contentBlocks: any[] = []\n const inputJSONBuffers = new Map<number, string>()\n let usage: any = null\n let stopReason: string | null = null\n let stopSequence: string | null = null\n\n for await (const event of stream) {\n if (signal.aborted) {\n debugLogger.flow('STREAM_ABORTED', {\n eventType: event.type,\n timestamp: Date.now(),\n })\n throw new Error('Request was cancelled')\n }\n\n switch (event.type) {\n case 'message_start':\n messageStartEvent = event\n finalResponse = {\n ...event.message,\n content: [],\n }\n if (event.message.usage?.input_tokens) {\n setFinalTokens({ input: event.message.usage.input_tokens })\n }\n setStreamingState({ receivedChars: 0 })\n break\n\n case 'content_block_start':\n contentBlocks[event.index] = { ...event.content_block }\n if (event.content_block.type === 'tool_use') {\n inputJSONBuffers.set(event.index, '')\n }\n if (event.content_block.type === 'thinking') {\n const thinkingStartTime = Date.now()\n setStreamingState({\n phase: 'deep_thinking',\n tokenCount: 0,\n thinkingMaxTokens: maxThinkingTokens,\n thinkingStartTime,\n })\n debugLogger.flow('THINKING_BLOCK_START', {\n index: event.index,\n maxTokens: maxThinkingTokens,\n startTime: thinkingStartTime,\n })\n }\n break\n\n case 'content_block_delta':\n const blockIndex = event.index\n\n if (!contentBlocks[blockIndex]) {\n contentBlocks[blockIndex] = {\n type:\n event.delta.type === 'text_delta' ? 'text' : 'tool_use',\n text: event.delta.type === 'text_delta' ? '' : undefined,\n }\n if (event.delta.type === 'input_json_delta') {\n inputJSONBuffers.set(blockIndex, '')\n }\n }\n\n if (event.delta.type === 'text_delta') {\n contentBlocks[blockIndex].text += event.delta.text\n addReceivedChars(event.delta.text.length)\n // Append to streaming text buffer for typewriter preview\n const prevText = getStreamingState().streamingText || ''\n setStreamingState({\n streamingText: prevText + event.delta.text,\n phase: 'generating',\n })\n } else if (event.delta.type === 'input_json_delta') {\n const currentBuffer = inputJSONBuffers.get(blockIndex) || ''\n inputJSONBuffers.set(\n blockIndex,\n currentBuffer + event.delta.partial_json,\n )\n }\n // Handle thinking_delta events to update token count\n else if (event.delta.type === 'thinking_delta') {\n const thinkingChunk = event.delta.thinking || ''\n const currentThinking =\n contentBlocks[blockIndex].thinking || ''\n const updatedThinking = currentThinking + thinkingChunk\n contentBlocks[blockIndex] = {\n ...contentBlocks[blockIndex],\n thinking: updatedThinking,\n }\n\n // Count thinking chars as received so \u2191 token count grows during thinking\n if (thinkingChunk.length > 0) {\n addReceivedChars(thinkingChunk.length)\n }\n\n setStreamingState({\n phase: 'deep_thinking',\n tokenCount: updatedThinking.length,\n thinkingMaxTokens: maxThinkingTokens,\n })\n\n debugLogger.trace('THINKING_DELTA', {\n index: blockIndex,\n tokenCount: updatedThinking.length,\n })\n }\n break\n\n case 'message_delta':\n if (event.delta.stop_reason)\n stopReason = event.delta.stop_reason\n if (event.delta.stop_sequence)\n stopSequence = event.delta.stop_sequence\n if (event.usage) {\n usage = { ...usage, ...event.usage }\n setFinalTokens({ output: event.usage.output_tokens })\n }\n break\n\n case 'content_block_stop':\n const stopIndex = event.index\n const block = contentBlocks[stopIndex]\n\n if (block?.type === 'thinking') {\n const streamState = getStreamingState()\n const thinkingDurationMs = streamState.thinkingStartTime\n ? Date.now() - streamState.thinkingStartTime\n : 0\n setStreamingState({\n phase: 'generating',\n thinkingDurationMs,\n })\n debugLogger.flow('THINKING_BLOCK_COMPLETE', {\n index: stopIndex,\n finalTokenCount: block.thinking?.length || 0,\n durationMs: thinkingDurationMs,\n })\n }\n\n if (\n block?.type === 'tool_use' &&\n inputJSONBuffers.has(stopIndex)\n ) {\n const jsonStr = inputJSONBuffers.get(stopIndex)\n if (jsonStr) {\n try {\n block.input = JSON.parse(jsonStr)\n } catch (error) {\n const errorMsg =\n error instanceof Error ? error.message : String(error)\n debugLogger.error('JSON_PARSE_ERROR', {\n blockIndex: stopIndex,\n jsonStr:\n jsonStr.length > 500\n ? jsonStr.slice(0, 500) + '...'\n : jsonStr,\n error: errorMsg,\n })\n block.input = {\n __parse_error__: true,\n __error_message__: `JSON parse failed: ${errorMsg}`,\n __raw_json_preview__:\n jsonStr.length > 200\n ? jsonStr.slice(0, 200) + '...'\n : jsonStr,\n }\n }\n inputJSONBuffers.delete(stopIndex)\n }\n }\n break\n\n case 'message_stop':\n inputJSONBuffers.clear()\n break\n }\n\n if (event.type === 'message_stop') {\n break\n }\n }\n\n if (!finalResponse || !messageStartEvent) {\n throw new Error('Stream ended without proper message structure')\n }\n\n // Construct the final response\n finalResponse = {\n ...messageStartEvent.message,\n content: contentBlocks.filter(Boolean),\n stop_reason: stopReason,\n stop_sequence: stopSequence,\n usage: {\n ...messageStartEvent.message.usage,\n ...usage,\n },\n }\n\n return finalResponse\n } else {\n debugLogger.api('ANTHROPIC_API_CALL_START_NON_STREAMING', {\n endpoint: modelProfile?.baseURL || 'DEFAULT_ANTHROPIC',\n model,\n provider,\n apiKeyConfigured: !!modelProfile?.apiKey,\n apiKeyPrefix: modelProfile?.apiKey\n ? modelProfile.apiKey.substring(0, 8)\n : null,\n maxTokens: params.max_tokens,\n temperature: MAIN_QUERY_TEMPERATURE,\n messageCount: params.messages?.length || 0,\n streamMode: false,\n toolsCount: toolSchemas.length,\n thinkingTokens: maxThinkingTokens,\n timestamp: new Date().toISOString(),\n modelProfileId: modelProfile?.modelName,\n modelProfileName: modelProfile?.name,\n })\n\n return await anthropic.beta.messages.create(params, {\n signal: signal,\n })\n }\n },\n {\n signal,\n onRetry: toolUseContext?.agentId\n ? ({ attempt, maxRetries, error, delayMs }) => {\n addRetryEventToTranscript(toolUseContext.agentId!, {\n attempt,\n maxRetries,\n errorMessage: error.message,\n delayMs,\n })\n }\n : undefined,\n },\n )\n\n debugLogger.api('ANTHROPIC_API_CALL_SUCCESS', {\n content: response.content,\n })\n\n const durationMs = Date.now() - startIncludingRetries\n\n const content = response.content.map((block: ContentBlock) => {\n if (block.type === 'text') {\n return {\n type: 'text' as const,\n text: block.text,\n }\n } else if (block.type === 'tool_use') {\n return {\n type: 'tool_use' as const,\n id: block.id,\n name: block.name,\n input: block.input,\n }\n }\n return block\n })\n\n // Build thinking metadata if thinking blocks are present\n const thinkingBlocks = content.filter(\n (block): block is ContentBlock & { type: 'thinking'; thinking: string } =>\n block.type === 'thinking',\n )\n const streamState = getStreamingState()\n const thinkingMetadata: ThinkingMetadata | undefined =\n thinkingBlocks.length > 0\n ? {\n charCount: thinkingBlocks.reduce(\n (sum, b) => sum + (b.thinking?.length || 0),\n 0,\n ),\n durationMs: streamState.thinkingDurationMs || 0,\n startTime: streamState.thinkingStartTime || Date.now(),\n isComplete: true,\n }\n : undefined\n\n const assistantMessage: AssistantMessage = {\n message: {\n id: response.id,\n content,\n model: response.model,\n role: 'assistant',\n stop_reason: response.stop_reason,\n stop_sequence: response.stop_sequence,\n type: 'message',\n usage: response.usage,\n },\n type: 'assistant',\n uuid: randomUUID(),\n durationMs,\n costUSD: 0, // Will be calculated below\n thinkingMetadata,\n }\n\n const systemMessages = system.map(block => ({\n role: 'system',\n content: block.text,\n }))\n\n logLLMInteraction({\n systemPrompt: systemPrompt.join('\\n'),\n messages: [...systemMessages, ...anthropicMessages],\n response: response,\n usage: response.usage\n ? {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n }\n : undefined,\n timing: {\n start: start,\n end: Date.now(),\n },\n apiFormat: 'anthropic',\n })\n\n // Calculate cost using native Anthropic usage data\n const inputTokens = response.usage.input_tokens\n const outputTokens = response.usage.output_tokens\n const cacheCreationInputTokens =\n response.usage.cache_creation_input_tokens ?? 0\n const cacheReadInputTokens = response.usage.cache_read_input_tokens ?? 0\n\n const costUSD = calculateCostUSD({\n model,\n inputTokens,\n outputTokens,\n cacheReadTokens: cacheReadInputTokens,\n cacheCreationTokens: cacheCreationInputTokens,\n })\n\n assistantMessage.costUSD = costUSD\n addToTotalCost(costUSD, durationMs)\n\n // Record token usage to unified stats manager\n recordTokenUsage(\n {\n inputTokens,\n outputTokens,\n cacheCreationTokens: cacheCreationInputTokens,\n cacheReadTokens: cacheReadInputTokens,\n },\n costUSD,\n model,\n toolUseContext\n ? ({\n agentId: toolUseContext.agentId,\n toolUseId: toolUseContext.toolUseId,\n model,\n } as TokenTrackingContext)\n : undefined,\n )\n\n return assistantMessage\n } catch (error) {\n return getAssistantMessageFromError(error, 'ANTHROPIC')\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["streamState"]
7
7
  }
@@ -1,7 +1,5 @@
1
1
  import { randomUUID } from "crypto";
2
- import {
3
- getGlobalConfig
4
- } from "../../utils/config.js";
2
+ import { getGlobalConfig } from "../../utils/config.js";
5
3
  import { isGPT5ModelName as isGPT5Model } from "../../utils/config.js";
6
4
  import {
7
5
  debug as debugLogger,
@@ -11,8 +9,13 @@ import {
11
9
  } from "../../utils/debugLogger.js";
12
10
  import { getModelManager } from "../../utils/model.js";
13
11
  import { withVCR } from "../vcr.js";
14
- import { responseStateManager, getConversationId } from "../responseStateManager.js";
12
+ import {
13
+ responseStateManager,
14
+ getConversationId
15
+ } from "../responseStateManager.js";
15
16
  import { generateSystemReminders } from "../systemReminder.js";
17
+ import { getSessionMemoryBlock } from "../sessionMemoryInjector.js";
18
+ import { isAutoMemoryEnabled, readMemoryMd } from "../../utils/autoMemoryPaths.js";
16
19
  import { generateMintoContext } from "./mintoContext.js";
17
20
  import { queryAnthropicNative } from "./anthropicProvider.js";
18
21
  import { queryOpenAI } from "./openaiProvider.js";
@@ -42,7 +45,9 @@ async function queryLLM(messages, systemPrompt, maxThinkingTokens, tools, signal
42
45
  inputParam: options.model,
43
46
  resolvedModelName: resolvedModel,
44
47
  provider: modelProfile.provider,
45
- isPointer: ["main", "task", "reasoning", "quick"].includes(options.model),
48
+ isPointer: ["main", "task", "reasoning", "quick", "compact"].includes(
49
+ options.model
50
+ ),
46
51
  hasResponseState: !!toolUseContext?.responseState,
47
52
  conversationId: toolUseContext?.responseState?.conversationId,
48
53
  requestId: getCurrentRequest()?.id
@@ -121,6 +126,20 @@ function formatSystemPromptWithContext(systemPrompt, context, agentId) {
121
126
  enhancedPrompt.push(...persistencePrompts);
122
127
  }
123
128
  const hasContext = Object.entries(context).length > 0;
129
+ const sessionMemoryBlock = getSessionMemoryBlock();
130
+ if (sessionMemoryBlock) {
131
+ enhancedPrompt.push(sessionMemoryBlock);
132
+ }
133
+ if (isAutoMemoryEnabled()) {
134
+ const memoryContent = readMemoryMd();
135
+ if (memoryContent) {
136
+ enhancedPrompt.push(`
137
+ # Auto Memory
138
+
139
+ ${memoryContent}
140
+ `);
141
+ }
142
+ }
124
143
  if (hasContext) {
125
144
  const mintoContext = generateMintoContext();
126
145
  if (mintoContext) {