@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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/services/llm/dispatch.ts"],
4
- "sourcesContent": ["/**\n * LLM dispatch \u2014 routes queries to the appropriate provider (Anthropic or OpenAI).\n */\nimport { randomUUID } from 'crypto'\n\nimport type { AssistantMessage, UserMessage } from '@query'\nimport { Tool } from '@tool'\nimport type { ToolUseContext } from '@tool'\nimport {\n getGlobalConfig,\n ModelProfile,\n} from '@utils/config'\nimport { isGPT5ModelName as isGPT5Model } from '@utils/config'\nimport {\n debug as debugLogger,\n markPhase,\n getCurrentRequest,\n logErrorWithDiagnosis,\n} from '@utils/debugLogger'\nimport { getModelManager } from '@utils/model'\nimport { withVCR } from '../vcr'\nimport { responseStateManager, getConversationId } from '../responseStateManager'\nimport { generateSystemReminders } from '../systemReminder'\n\nimport { generateMintoContext } from './mintoContext'\nimport { queryAnthropicNative } from './anthropicProvider'\nimport { queryOpenAI } from './openaiProvider'\n\n// \u2500\u2500 queryLLM \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\u2500\u2500\u2500\u2500\u2500\n\nexport async function queryLLM(\n messages: (UserMessage | AssistantMessage)[],\n systemPrompt: string[],\n maxThinkingTokens: number,\n tools: Tool[],\n signal: AbortSignal,\n options: {\n safeMode: boolean\n model: string | import('@utils/config').ModelPointerType\n prependCLISysprompt: boolean\n toolUseContext?: ToolUseContext\n },\n): Promise<AssistantMessage> {\n const modelManager = getModelManager()\n const modelResolution = modelManager.resolveModelWithInfo(options.model)\n\n if (!modelResolution.success || !modelResolution.profile) {\n throw new Error(\n modelResolution.error || `Failed to resolve model: ${options.model}`,\n )\n }\n\n const modelProfile = modelResolution.profile\n const resolvedModel = modelProfile.modelName\n\n // Initialize response state if toolUseContext is provided\n const toolUseContext = options.toolUseContext\n if (toolUseContext && !toolUseContext.responseState) {\n const conversationId = getConversationId(\n toolUseContext.agentId,\n toolUseContext.messageId,\n )\n const previousResponseId =\n responseStateManager.getPreviousResponseId(conversationId)\n\n toolUseContext.responseState = {\n previousResponseId,\n conversationId,\n }\n }\n\n debugLogger.api('MODEL_RESOLVED', {\n inputParam: options.model,\n resolvedModelName: resolvedModel,\n provider: modelProfile.provider,\n isPointer: ['main', 'task', 'reasoning', 'quick'].includes(options.model),\n hasResponseState: !!toolUseContext?.responseState,\n conversationId: toolUseContext?.responseState?.conversationId,\n requestId: getCurrentRequest()?.id,\n })\n\n const currentRequest = getCurrentRequest()\n debugLogger.api('LLM_REQUEST_START', {\n messageCount: messages.length,\n systemPromptLength: systemPrompt.join(' ').length,\n toolCount: tools.length,\n model: resolvedModel,\n originalModelParam: options.model,\n requestId: getCurrentRequest()?.id,\n })\n\n markPhase('LLM_CALL')\n\n try {\n const result = await withVCR(messages, () =>\n queryLLMWithPromptCaching(\n messages,\n systemPrompt,\n maxThinkingTokens,\n tools,\n signal,\n { ...options, model: resolvedModel, modelProfile, toolUseContext },\n ),\n )\n\n debugLogger.api('LLM_REQUEST_SUCCESS', {\n costUSD: result.costUSD,\n durationMs: result.durationMs,\n responseLength: result.message.content?.length || 0,\n requestId: getCurrentRequest()?.id,\n })\n\n // Update response state for GPT-5 Responses API continuation\n if (toolUseContext?.responseState?.conversationId && result.responseId) {\n responseStateManager.setPreviousResponseId(\n toolUseContext.responseState.conversationId,\n result.responseId,\n )\n\n debugLogger.api('RESPONSE_STATE_UPDATED', {\n conversationId: toolUseContext.responseState.conversationId,\n responseId: result.responseId,\n requestId: getCurrentRequest()?.id,\n })\n }\n\n return result\n } catch (error) {\n logErrorWithDiagnosis(\n error,\n {\n messageCount: messages.length,\n systemPromptLength: systemPrompt.join(' ').length,\n model: options.model,\n toolCount: tools.length,\n phase: 'LLM_CALL',\n },\n currentRequest?.id,\n )\n\n throw error\n }\n}\n\n// \u2500\u2500 formatSystemPromptWithContext \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 function formatSystemPromptWithContext(\n systemPrompt: string[],\n context: { [k: string]: string },\n agentId?: string,\n): { systemPrompt: string[]; reminders: string } {\n const enhancedPrompt = [...systemPrompt]\n let reminders = ''\n\n // Step 0: Add GPT-5 Agent persistence support for coding tasks\n const modelManager = getModelManager()\n const modelProfile = modelManager.getModel('main')\n if (modelProfile && isGPT5Model(modelProfile.modelName)) {\n const persistencePrompts = [\n '\\n# Agent Persistence for Long-Running Coding Tasks',\n 'You are working on a coding project that may involve multiple steps and iterations. Please maintain context and continuity throughout the session:',\n '- Remember architectural decisions and design patterns established earlier',\n '- Keep track of file modifications and their relationships',\n '- Maintain awareness of the overall project structure and goals',\n '- Reference previous implementations when making related changes',\n '- Ensure consistency with existing code style and conventions',\n '- Build incrementally on previous work rather than starting from scratch',\n ]\n enhancedPrompt.push(...persistencePrompts)\n }\n\n const hasContext = Object.entries(context).length > 0\n\n if (hasContext) {\n const mintoContext = generateMintoContext()\n if (mintoContext) {\n enhancedPrompt.push('\\n---\\n# \u9879\u76EE\u4E0A\u4E0B\u6587\\n')\n enhancedPrompt.push(mintoContext)\n enhancedPrompt.push('\\n---\\n')\n }\n\n const reminderMessages = generateSystemReminders(hasContext, agentId)\n if (reminderMessages.length > 0) {\n reminders = reminderMessages.map(r => r.content).join('\\n') + '\\n'\n }\n\n enhancedPrompt.push(\n `\\nAs you answer the user's questions, you can use the following context:\\n`,\n )\n\n const filteredContext = Object.fromEntries(\n Object.entries(context).filter(\n ([key]) => key !== 'projectDocs' && key !== 'userDocs',\n ),\n )\n\n enhancedPrompt.push(\n ...Object.entries(filteredContext).map(\n ([key, value]) => `<context name=\"${key}\">${value}</context>`,\n ),\n )\n }\n\n return { systemPrompt: enhancedPrompt, reminders }\n}\n\n// \u2500\u2500 queryLLMWithPromptCaching (internal dispatcher) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function queryLLMWithPromptCaching(\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 provider: string\n\n if (modelProfile) {\n provider = modelProfile.provider || config.primaryProvider || 'anthropic'\n } else {\n provider = config.primaryProvider || 'anthropic'\n }\n\n // Use native Anthropic SDK for Anthropic and some Anthropic-compatible providers\n if (\n provider === 'anthropic' ||\n provider === 'bigdream' ||\n provider === 'opendev'\n ) {\n return queryAnthropicNative(\n messages,\n systemPrompt,\n maxThinkingTokens,\n tools,\n signal,\n { ...options, modelProfile, toolUseContext },\n )\n }\n\n // Use OpenAI-compatible interface for all other providers\n return queryOpenAI(messages, systemPrompt, maxThinkingTokens, tools, signal, {\n ...options,\n modelProfile,\n toolUseContext,\n })\n}\n\n// \u2500\u2500 Convenience query functions \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 queryModel(\n modelPointer: import('@utils/config').ModelPointerType,\n messages: (UserMessage | AssistantMessage)[],\n systemPrompt: string[] = [],\n signal?: AbortSignal,\n): Promise<AssistantMessage> {\n return queryLLM(\n messages,\n systemPrompt,\n 0, // maxThinkingTokens\n [], // tools\n signal || new AbortController().signal,\n {\n safeMode: false,\n model: modelPointer,\n prependCLISysprompt: true,\n },\n )\n}\n\nexport async function queryQuick({\n systemPrompt = [],\n userPrompt,\n assistantPrompt,\n enablePromptCaching = false,\n signal,\n}: {\n systemPrompt?: string[]\n userPrompt: string\n assistantPrompt?: string\n enablePromptCaching?: boolean\n signal?: AbortSignal\n}): Promise<AssistantMessage> {\n const messages = [\n {\n message: { role: 'user', content: userPrompt },\n type: 'user',\n uuid: randomUUID(),\n },\n ] as (UserMessage | AssistantMessage)[]\n\n return queryModel('quick', messages, systemPrompt, signal)\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * LLM dispatch \u2014 routes queries to the appropriate provider (Anthropic or OpenAI).\n */\nimport { randomUUID } from 'crypto'\n\nimport type { AssistantMessage, UserMessage } from '@query'\nimport { Tool } from '@tool'\nimport type { ToolUseContext } from '@tool'\nimport { getGlobalConfig, ModelProfile } from '@utils/config'\nimport { isGPT5ModelName as isGPT5Model } from '@utils/config'\nimport {\n debug as debugLogger,\n markPhase,\n getCurrentRequest,\n logErrorWithDiagnosis,\n} from '@utils/debugLogger'\nimport { getModelManager } from '@utils/model'\nimport { withVCR } from '../vcr'\nimport {\n responseStateManager,\n getConversationId,\n} from '../responseStateManager'\nimport { generateSystemReminders } from '../systemReminder'\nimport { getSessionMemoryBlock } from '../sessionMemoryInjector'\n\nimport { isAutoMemoryEnabled, readMemoryMd } from '@utils/autoMemoryPaths'\nimport { generateMintoContext } from './mintoContext'\nimport { queryAnthropicNative } from './anthropicProvider'\nimport { queryOpenAI } from './openaiProvider'\n\n// \u2500\u2500 queryLLM \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\u2500\u2500\u2500\u2500\u2500\n\nexport async function queryLLM(\n messages: (UserMessage | AssistantMessage)[],\n systemPrompt: string[],\n maxThinkingTokens: number,\n tools: Tool[],\n signal: AbortSignal,\n options: {\n safeMode: boolean\n model: string | import('@utils/config').ModelPointerType\n prependCLISysprompt: boolean\n toolUseContext?: ToolUseContext\n },\n): Promise<AssistantMessage> {\n const modelManager = getModelManager()\n const modelResolution = modelManager.resolveModelWithInfo(options.model)\n\n if (!modelResolution.success || !modelResolution.profile) {\n throw new Error(\n modelResolution.error || `Failed to resolve model: ${options.model}`,\n )\n }\n\n const modelProfile = modelResolution.profile\n const resolvedModel = modelProfile.modelName\n\n // Initialize response state if toolUseContext is provided\n const toolUseContext = options.toolUseContext\n if (toolUseContext && !toolUseContext.responseState) {\n const conversationId = getConversationId(\n toolUseContext.agentId,\n toolUseContext.messageId,\n )\n const previousResponseId =\n responseStateManager.getPreviousResponseId(conversationId)\n\n toolUseContext.responseState = {\n previousResponseId,\n conversationId,\n }\n }\n\n debugLogger.api('MODEL_RESOLVED', {\n inputParam: options.model,\n resolvedModelName: resolvedModel,\n provider: modelProfile.provider,\n isPointer: ['main', 'task', 'reasoning', 'quick', 'compact'].includes(\n options.model,\n ),\n hasResponseState: !!toolUseContext?.responseState,\n conversationId: toolUseContext?.responseState?.conversationId,\n requestId: getCurrentRequest()?.id,\n })\n\n const currentRequest = getCurrentRequest()\n debugLogger.api('LLM_REQUEST_START', {\n messageCount: messages.length,\n systemPromptLength: systemPrompt.join(' ').length,\n toolCount: tools.length,\n model: resolvedModel,\n originalModelParam: options.model,\n requestId: getCurrentRequest()?.id,\n })\n\n markPhase('LLM_CALL')\n\n try {\n const result = await withVCR(messages, () =>\n queryLLMWithPromptCaching(\n messages,\n systemPrompt,\n maxThinkingTokens,\n tools,\n signal,\n { ...options, model: resolvedModel, modelProfile, toolUseContext },\n ),\n )\n\n debugLogger.api('LLM_REQUEST_SUCCESS', {\n costUSD: result.costUSD,\n durationMs: result.durationMs,\n responseLength: result.message.content?.length || 0,\n requestId: getCurrentRequest()?.id,\n })\n\n // Update response state for GPT-5 Responses API continuation\n if (toolUseContext?.responseState?.conversationId && result.responseId) {\n responseStateManager.setPreviousResponseId(\n toolUseContext.responseState.conversationId,\n result.responseId,\n )\n\n debugLogger.api('RESPONSE_STATE_UPDATED', {\n conversationId: toolUseContext.responseState.conversationId,\n responseId: result.responseId,\n requestId: getCurrentRequest()?.id,\n })\n }\n\n return result\n } catch (error) {\n logErrorWithDiagnosis(\n error,\n {\n messageCount: messages.length,\n systemPromptLength: systemPrompt.join(' ').length,\n model: options.model,\n toolCount: tools.length,\n phase: 'LLM_CALL',\n },\n currentRequest?.id,\n )\n\n throw error\n }\n}\n\n// \u2500\u2500 formatSystemPromptWithContext \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 function formatSystemPromptWithContext(\n systemPrompt: string[],\n context: { [k: string]: string },\n agentId?: string,\n): { systemPrompt: string[]; reminders: string } {\n const enhancedPrompt = [...systemPrompt]\n let reminders = ''\n\n // Step 0: Add GPT-5 Agent persistence support for coding tasks\n const modelManager = getModelManager()\n const modelProfile = modelManager.getModel('main')\n if (modelProfile && isGPT5Model(modelProfile.modelName)) {\n const persistencePrompts = [\n '\\n# Agent Persistence for Long-Running Coding Tasks',\n 'You are working on a coding project that may involve multiple steps and iterations. Please maintain context and continuity throughout the session:',\n '- Remember architectural decisions and design patterns established earlier',\n '- Keep track of file modifications and their relationships',\n '- Maintain awareness of the overall project structure and goals',\n '- Reference previous implementations when making related changes',\n '- Ensure consistency with existing code style and conventions',\n '- Build incrementally on previous work rather than starting from scratch',\n ]\n enhancedPrompt.push(...persistencePrompts)\n }\n\n const hasContext = Object.entries(context).length > 0\n\n // Inject session memory from previous sessions (if enabled)\n const sessionMemoryBlock = getSessionMemoryBlock()\n if (sessionMemoryBlock) {\n enhancedPrompt.push(sessionMemoryBlock)\n }\n\n // Inject MEMORY.md from per-project auto memory directory (CC-compatible)\n if (isAutoMemoryEnabled()) {\n const memoryContent = readMemoryMd()\n if (memoryContent) {\n enhancedPrompt.push(`\\n# Auto Memory\\n\\n${memoryContent}\\n`)\n }\n }\n\n if (hasContext) {\n const mintoContext = generateMintoContext()\n if (mintoContext) {\n enhancedPrompt.push('\\n---\\n# \u9879\u76EE\u4E0A\u4E0B\u6587\\n')\n enhancedPrompt.push(mintoContext)\n enhancedPrompt.push('\\n---\\n')\n }\n\n const reminderMessages = generateSystemReminders(hasContext, agentId)\n if (reminderMessages.length > 0) {\n reminders = reminderMessages.map(r => r.content).join('\\n') + '\\n'\n }\n\n enhancedPrompt.push(\n `\\nAs you answer the user's questions, you can use the following context:\\n`,\n )\n\n const filteredContext = Object.fromEntries(\n Object.entries(context).filter(\n ([key]) => key !== 'projectDocs' && key !== 'userDocs',\n ),\n )\n\n enhancedPrompt.push(\n ...Object.entries(filteredContext).map(\n ([key, value]) => `<context name=\"${key}\">${value}</context>`,\n ),\n )\n }\n\n return { systemPrompt: enhancedPrompt, reminders }\n}\n\n// \u2500\u2500 queryLLMWithPromptCaching (internal dispatcher) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function queryLLMWithPromptCaching(\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 provider: string\n\n if (modelProfile) {\n provider = modelProfile.provider || config.primaryProvider || 'anthropic'\n } else {\n provider = config.primaryProvider || 'anthropic'\n }\n\n // Use native Anthropic SDK for Anthropic and some Anthropic-compatible providers\n if (\n provider === 'anthropic' ||\n provider === 'bigdream' ||\n provider === 'opendev'\n ) {\n return queryAnthropicNative(\n messages,\n systemPrompt,\n maxThinkingTokens,\n tools,\n signal,\n { ...options, modelProfile, toolUseContext },\n )\n }\n\n // Use OpenAI-compatible interface for all other providers\n return queryOpenAI(messages, systemPrompt, maxThinkingTokens, tools, signal, {\n ...options,\n modelProfile,\n toolUseContext,\n })\n}\n\n// \u2500\u2500 Convenience query functions \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 queryModel(\n modelPointer: import('@utils/config').ModelPointerType,\n messages: (UserMessage | AssistantMessage)[],\n systemPrompt: string[] = [],\n signal?: AbortSignal,\n): Promise<AssistantMessage> {\n return queryLLM(\n messages,\n systemPrompt,\n 0, // maxThinkingTokens\n [], // tools\n signal || new AbortController().signal,\n {\n safeMode: false,\n model: modelPointer,\n prependCLISysprompt: true,\n },\n )\n}\n\nexport async function queryQuick({\n systemPrompt = [],\n userPrompt,\n assistantPrompt,\n enablePromptCaching = false,\n signal,\n}: {\n systemPrompt?: string[]\n userPrompt: string\n assistantPrompt?: string\n enablePromptCaching?: boolean\n signal?: AbortSignal\n}): Promise<AssistantMessage> {\n const messages = [\n {\n message: { role: 'user', content: userPrompt },\n type: 'user',\n uuid: randomUUID(),\n },\n ] as (UserMessage | AssistantMessage)[]\n\n return queryModel('quick', messages, systemPrompt, signal)\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,14 +1,9 @@
1
1
  import { randomUUID } from "crypto";
2
2
  import { nanoid } from "nanoid";
3
3
  import { getToolDescriptionAsync } from "../../Tool.js";
4
- import {
5
- getGlobalConfig
6
- } from "../../utils/config.js";
4
+ import { getGlobalConfig } from "../../utils/config.js";
7
5
  import { isGPT5ModelName as isGPT5Model } from "../../utils/config.js";
8
- import {
9
- createAssistantAPIErrorMessage,
10
- normalizeContentFromAPI
11
- } from "../../utils/messages.js";
6
+ import { normalizeContentFromAPI } from "../../utils/messages.js";
12
7
  import {
13
8
  debug as debugLogger,
14
9
  getCurrentRequest,
@@ -19,7 +14,13 @@ import { getModelManager } from "../../utils/model.js";
19
14
  import { zodToJsonSchema } from "zod-to-json-schema";
20
15
  import { ModelAdapterFactory } from "../modelAdapterFactory.js";
21
16
  import { getCLISyspromptPrefix } from "../../constants/prompts/index.js";
22
- import { setStreamingState } from "../../utils/streamingState.js";
17
+ import { setStreamingState, getStreamingState } from "../../utils/streamingState.js";
18
+ import {
19
+ beginTokenTracking,
20
+ addPreparedChars,
21
+ addReceivedChars,
22
+ setFinalTokens
23
+ } from "../../utils/tokenProgress.js";
23
24
  import {
24
25
  getCompletionWithProfile,
25
26
  getGPT5CompletionWithProfile
@@ -29,18 +30,12 @@ import { addRetryEventToTranscript } from "../../utils/agentTranscripts.js";
29
30
  import { generateMintoContext } from "./mintoContext.js";
30
31
  import { splitSysPromptPrefix } from "./anthropicProvider.js";
31
32
  import {
32
- API_ERROR_MESSAGE_PREFIX,
33
- PROMPT_TOO_LONG_ERROR_MESSAGE,
34
- CREDIT_BALANCE_TOO_LOW_ERROR_MESSAGE,
35
- INVALID_API_KEY_ERROR_MESSAGE,
36
33
  PROMPT_CACHING_ENABLED,
37
34
  MAIN_QUERY_TEMPERATURE,
38
- SONNET_COST_PER_MILLION_INPUT_TOKENS,
39
- SONNET_COST_PER_MILLION_OUTPUT_TOKENS,
40
35
  withRetry,
41
36
  getMaxTokensFromProfile,
42
- getModelInputTokenCostUSD,
43
- getModelOutputTokenCostUSD,
37
+ calculateCostUSD,
38
+ getAssistantMessageFromError,
44
39
  addToTotalCost,
45
40
  recordTokenUsage,
46
41
  logError
@@ -150,6 +145,7 @@ function messageReducer(previous, item) {
150
145
  }
151
146
  async function handleMessageStream(stream, signal) {
152
147
  const streamStartTime = Date.now();
148
+ setStreamingState({ receivedChars: 0 });
153
149
  let ttftMs;
154
150
  let chunkCount = 0;
155
151
  let errorCount = 0;
@@ -191,13 +187,20 @@ async function handleMessageStream(stream, signal) {
191
187
  }
192
188
  if (!usage && chunk.usage) {
193
189
  usage = chunk.usage;
194
- setStreamingState({
195
- inputTokens: chunk.usage.prompt_tokens,
196
- outputTokens: chunk.usage.completion_tokens
190
+ setFinalTokens({
191
+ input: chunk.usage.prompt_tokens,
192
+ output: chunk.usage.completion_tokens
197
193
  });
198
194
  }
199
195
  message = messageReducer(message, chunk);
200
196
  if (chunk?.choices?.[0]?.delta?.content) {
197
+ const textChunk = chunk.choices[0].delta.content;
198
+ addReceivedChars(textChunk.length);
199
+ const prevText = getStreamingState().streamingText || "";
200
+ setStreamingState({
201
+ streamingText: prevText + textChunk,
202
+ phase: "generating"
203
+ });
201
204
  if (!ttftMs) {
202
205
  ttftMs = Date.now() - streamStartTime;
203
206
  debugLogger.api("OPENAI_STREAM_FIRST_TOKEN", {
@@ -290,20 +293,6 @@ function convertOpenAIResponseToAnthropic(response, _tools) {
290
293
  });
291
294
  }
292
295
  }
293
- if (message.reasoning) {
294
- contentBlocks.push({
295
- type: "thinking",
296
- thinking: message.reasoning,
297
- signature: ""
298
- });
299
- }
300
- if (message.reasoning_content) {
301
- contentBlocks.push({
302
- type: "thinking",
303
- thinking: message.reasoning_content,
304
- signature: ""
305
- });
306
- }
307
296
  if (message.content) {
308
297
  contentBlocks.push({
309
298
  type: "text",
@@ -320,33 +309,11 @@ function convertOpenAIResponseToAnthropic(response, _tools) {
320
309
  };
321
310
  return finalMessage;
322
311
  }
323
- function getAssistantMessageFromError(error) {
324
- if (error instanceof Error && error.message.includes("prompt is too long")) {
325
- return createAssistantAPIErrorMessage(PROMPT_TOO_LONG_ERROR_MESSAGE);
326
- }
327
- if (error instanceof Error && error.message.includes("Your credit balance is too low")) {
328
- return createAssistantAPIErrorMessage(CREDIT_BALANCE_TOO_LOW_ERROR_MESSAGE);
329
- }
330
- if (error instanceof Error && error.message.toLowerCase().includes("x-api-key")) {
331
- return createAssistantAPIErrorMessage(INVALID_API_KEY_ERROR_MESSAGE);
332
- }
333
- if (error instanceof Error) {
334
- if (process.env.NODE_ENV === "development") {
335
- debugLogger.error("OPENAI_API_ERROR", {
336
- message: error.message,
337
- stack: error.stack
338
- });
339
- }
340
- return createAssistantAPIErrorMessage(
341
- `${API_ERROR_MESSAGE_PREFIX}: ${error.message}`
342
- );
343
- }
344
- return createAssistantAPIErrorMessage(API_ERROR_MESSAGE_PREFIX);
345
- }
346
312
  async function queryOpenAI(messages, systemPrompt, maxThinkingTokens, tools, signal, options) {
347
313
  const config = getGlobalConfig();
348
314
  const modelManager = getModelManager();
349
315
  const toolUseContext = options?.toolUseContext;
316
+ beginTokenTracking();
350
317
  const modelProfile = options?.modelProfile || modelManager.getModel("main");
351
318
  let model;
352
319
  const currentRequest = getCurrentRequest();
@@ -367,7 +334,6 @@ async function queryOpenAI(messages, systemPrompt, maxThinkingTokens, tools, sig
367
334
  model = options?.model || modelProfile?.modelName || "";
368
335
  }
369
336
  if (options?.prependCLISysprompt) {
370
- const [firstSyspromptBlock] = splitSysPromptPrefix(systemPrompt);
371
337
  systemPrompt = [getCLISyspromptPrefix(), ...systemPrompt];
372
338
  }
373
339
  const system = splitSysPromptPrefix(systemPrompt).map(
@@ -377,17 +343,20 @@ async function queryOpenAI(messages, systemPrompt, maxThinkingTokens, tools, sig
377
343
  type: "text"
378
344
  })
379
345
  );
346
+ addPreparedChars(JSON.stringify(system).length);
380
347
  const toolSchemas = await Promise.all(
381
- tools.map(
382
- async (_) => ({
348
+ tools.map(async (_) => {
349
+ const schema = {
383
350
  type: "function",
384
351
  function: {
385
352
  name: _.name,
386
353
  description: await getToolDescriptionAsync(_),
387
354
  parameters: "inputJSONSchema" in _ && _.inputJSONSchema ? _.inputJSONSchema : zodToJsonSchema(_.inputSchema)
388
355
  }
389
- })
390
- )
356
+ };
357
+ addPreparedChars(JSON.stringify(schema).length);
358
+ return schema;
359
+ })
391
360
  );
392
361
  const openaiSystem = system.map(
393
362
  (s) => ({
@@ -396,6 +365,7 @@ async function queryOpenAI(messages, systemPrompt, maxThinkingTokens, tools, sig
396
365
  })
397
366
  );
398
367
  const openaiMessages = convertAnthropicMessagesToOpenAIMessages(messages);
368
+ addPreparedChars(JSON.stringify(openaiMessages).length);
399
369
  const startIncludingRetries = Date.now();
400
370
  logSystemPromptConstruction({
401
371
  basePrompt: systemPrompt.join("\n"),
@@ -432,7 +402,7 @@ async function queryOpenAI(messages, systemPrompt, maxThinkingTokens, tools, sig
432
402
  opts.tools = toolSchemas;
433
403
  opts.tool_choice = "auto";
434
404
  }
435
- const reasoningEffort = await getReasoningEffort(modelProfile, messages);
405
+ const reasoningEffort = isReasoningModel ? await getReasoningEffort(modelProfile, messages) : void 0;
436
406
  if (reasoningEffort) {
437
407
  opts.reasoning_effort = reasoningEffort;
438
408
  }
@@ -445,12 +415,11 @@ async function queryOpenAI(messages, systemPrompt, maxThinkingTokens, tools, sig
445
415
  apiKeyExists: !!modelProfile.apiKey,
446
416
  requestId: getCurrentRequest()?.id
447
417
  });
448
- const USE_NEW_ADAPTER_SYSTEM = process.env.USE_NEW_ADAPTERS !== "false";
449
- if (USE_NEW_ADAPTER_SYSTEM) {
418
+ if (ModelAdapterFactory.shouldUseResponsesAPI(modelProfile)) {
450
419
  const adapter = ModelAdapterFactory.createAdapter(modelProfile);
451
420
  const unifiedParams = {
452
421
  messages: openaiMessages,
453
- systemPrompt: openaiSystem.map((s) => s.content),
422
+ systemPrompt: openaiSystem.map((s2) => s2.content),
454
423
  tools,
455
424
  maxTokens: getMaxTokensFromProfile(modelProfile),
456
425
  stream: config.stream,
@@ -458,78 +427,84 @@ async function queryOpenAI(messages, systemPrompt, maxThinkingTokens, tools, sig
458
427
  temperature: isGPT5Model(model) || model.startsWith("o3") || model.startsWith("o4-mini") ? void 0 : MAIN_QUERY_TEMPERATURE,
459
428
  previousResponseId: toolUseContext?.responseState?.previousResponseId,
460
429
  verbosity: "high"
461
- // High verbosity for coding tasks
462
430
  };
463
431
  const request = adapter.createRequest(unifiedParams);
464
- if (ModelAdapterFactory.shouldUseResponsesAPI(modelProfile)) {
465
- const { callGPT5ResponsesAPI } = await import("../openai.js");
466
- const response2 = await callGPT5ResponsesAPI(
467
- modelProfile,
468
- request,
469
- signal
470
- );
471
- const unifiedResponse = adapter.parseResponse(response2);
472
- const apiMessage = {
473
- role: "assistant",
474
- content: unifiedResponse.content,
475
- tool_calls: unifiedResponse.toolCalls,
476
- usage: {
477
- prompt_tokens: unifiedResponse.usage.promptTokens,
478
- completion_tokens: unifiedResponse.usage.completionTokens
479
- }
480
- };
481
- const assistantMsg = {
482
- type: "assistant",
483
- message: apiMessage,
484
- costUSD: 0,
485
- // Will be calculated later
486
- durationMs: Date.now() - start,
487
- uuid: `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
488
- responseId: unifiedResponse.responseId
489
- // For state management
490
- };
491
- return assistantMsg;
492
- } else {
493
- const s = await getCompletionWithProfile(
494
- modelProfile,
495
- request,
496
- 0,
497
- 10,
498
- signal
499
- );
500
- let finalResponse;
501
- if (config.stream) {
502
- finalResponse = await handleMessageStream(
503
- s,
504
- signal
505
- );
506
- } else {
507
- finalResponse = s;
508
- }
509
- const r = convertOpenAIResponseToAnthropic(finalResponse, tools);
510
- return r;
511
- }
512
- } else {
513
- const completionFunction = isGPT5Model(modelProfile.modelName) ? getGPT5CompletionWithProfile : getCompletionWithProfile;
514
- const s = await completionFunction(
432
+ const { callGPT5ResponsesAPI } = await import("../openai.js");
433
+ const response2 = await callGPT5ResponsesAPI(
515
434
  modelProfile,
516
- opts,
517
- 0,
518
- 10,
435
+ request,
519
436
  signal
520
437
  );
521
- let finalResponse;
522
- if (opts.stream) {
523
- finalResponse = await handleMessageStream(
524
- s,
525
- signal
526
- );
527
- } else {
528
- finalResponse = s;
529
- }
530
- const r = convertOpenAIResponseToAnthropic(finalResponse, tools);
531
- return r;
438
+ const unifiedResponse = adapter.parseResponse(response2);
439
+ const apiMessage = {
440
+ role: "assistant",
441
+ content: unifiedResponse.content,
442
+ tool_calls: unifiedResponse.toolCalls,
443
+ usage: {
444
+ prompt_tokens: unifiedResponse.usage.promptTokens,
445
+ completion_tokens: unifiedResponse.usage.completionTokens
446
+ }
447
+ };
448
+ const respDurationMs = Date.now() - start;
449
+ const respInputTokens = unifiedResponse.usage.promptTokens;
450
+ const respOutputTokens = unifiedResponse.usage.completionTokens;
451
+ const respCostUSD = calculateCostUSD({
452
+ model,
453
+ inputTokens: respInputTokens,
454
+ outputTokens: respOutputTokens,
455
+ cacheReadTokens: 0,
456
+ cacheCreationTokens: 0
457
+ });
458
+ addToTotalCost(respCostUSD, respDurationMs);
459
+ recordTokenUsage(
460
+ {
461
+ inputTokens: respInputTokens,
462
+ outputTokens: respOutputTokens,
463
+ cacheCreationTokens: 0,
464
+ cacheReadTokens: 0
465
+ },
466
+ respCostUSD,
467
+ model,
468
+ toolUseContext ? {
469
+ agentId: toolUseContext.agentId,
470
+ toolUseId: toolUseContext.toolUseId,
471
+ model
472
+ } : void 0
473
+ );
474
+ logLLMInteraction({
475
+ systemPrompt: systemPrompt.join("\n"),
476
+ messages: [...openaiSystem, ...openaiMessages],
477
+ response: apiMessage,
478
+ usage: {
479
+ inputTokens: respInputTokens,
480
+ outputTokens: respOutputTokens
481
+ },
482
+ timing: { start, end: Date.now() },
483
+ apiFormat: "openai"
484
+ });
485
+ const assistantMsg = {
486
+ type: "assistant",
487
+ message: apiMessage,
488
+ costUSD: respCostUSD,
489
+ durationMs: respDurationMs,
490
+ uuid: randomUUID(),
491
+ responseId: unifiedResponse.responseId
492
+ };
493
+ return assistantMsg;
532
494
  }
495
+ const completionFunction = isGPT5Model(modelProfile.modelName) ? getGPT5CompletionWithProfile : getCompletionWithProfile;
496
+ const s = await completionFunction(modelProfile, opts, 0, 10, signal);
497
+ let finalResponse;
498
+ if (opts.stream) {
499
+ finalResponse = await handleMessageStream(
500
+ s,
501
+ signal
502
+ );
503
+ } else {
504
+ finalResponse = s;
505
+ }
506
+ const r = convertOpenAIResponseToAnthropic(finalResponse, tools);
507
+ return r;
533
508
  } else {
534
509
  const errorDetails = {
535
510
  modelProfileExists: !!modelProfile,
@@ -558,17 +533,21 @@ async function queryOpenAI(messages, systemPrompt, maxThinkingTokens, tools, sig
558
533
  );
559
534
  } catch (error) {
560
535
  logError(error);
561
- return getAssistantMessageFromError(error);
536
+ return getAssistantMessageFromError(error, "OPENAI");
562
537
  }
563
538
  const durationMs = Date.now() - start;
564
539
  const durationMsIncludingRetries = Date.now() - startIncludingRetries;
565
540
  const inputTokens = response.usage?.prompt_tokens ?? 0;
566
541
  const outputTokens = response.usage?.completion_tokens ?? 0;
567
542
  const cacheReadInputTokens = response.usage?.prompt_token_details?.cached_tokens ?? 0;
568
- const cacheCreationInputTokens = response.usage?.prompt_token_details?.cached_tokens ?? 0;
569
- const inputCostPerMillion = getModelInputTokenCostUSD(model) * 1e6;
570
- const outputCostPerMillion = getModelOutputTokenCostUSD(model) * 1e6;
571
- const costUSD = inputTokens / 1e6 * (inputCostPerMillion || SONNET_COST_PER_MILLION_INPUT_TOKENS) + outputTokens / 1e6 * (outputCostPerMillion || SONNET_COST_PER_MILLION_OUTPUT_TOKENS) + cacheReadInputTokens / 1e6 * (inputCostPerMillion || SONNET_COST_PER_MILLION_INPUT_TOKENS) * 0.1 + cacheCreationInputTokens / 1e6 * (inputCostPerMillion || SONNET_COST_PER_MILLION_INPUT_TOKENS);
543
+ const cacheCreationInputTokens = 0;
544
+ const costUSD = calculateCostUSD({
545
+ model,
546
+ inputTokens,
547
+ outputTokens,
548
+ cacheReadTokens: cacheReadInputTokens,
549
+ cacheCreationTokens: cacheCreationInputTokens
550
+ });
572
551
  addToTotalCost(costUSD, durationMsIncludingRetries);
573
552
  recordTokenUsage(
574
553
  {