@within-7/minto 0.3.10 → 0.4.0

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 (306) hide show
  1. package/dist/Tool.js.map +2 -2
  2. package/dist/commands/agents/AgentsCommand.js +2 -2
  3. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  4. package/dist/commands/ctx_viz.js +1 -1
  5. package/dist/commands/effort.js +87 -0
  6. package/dist/commands/effort.js.map +7 -0
  7. package/dist/commands/export.js +19 -9
  8. package/dist/commands/export.js.map +2 -2
  9. package/dist/commands/ide.js +18 -0
  10. package/dist/commands/ide.js.map +7 -0
  11. package/dist/commands/mcp-interactive.js +14 -8
  12. package/dist/commands/mcp-interactive.js.map +2 -2
  13. package/dist/commands/memory.js +168 -0
  14. package/dist/commands/memory.js.map +7 -0
  15. package/dist/commands/model.js +45 -2
  16. package/dist/commands/model.js.map +2 -2
  17. package/dist/commands/outputStyle.js +64 -0
  18. package/dist/commands/outputStyle.js.map +7 -0
  19. package/dist/commands/plugin/utils.js +33 -1
  20. package/dist/commands/plugin/utils.js.map +2 -2
  21. package/dist/commands/plugin.js +10 -1
  22. package/dist/commands/plugin.js.map +2 -2
  23. package/dist/commands/refreshCommands.js +2 -0
  24. package/dist/commands/refreshCommands.js.map +2 -2
  25. package/dist/commands/review.js +51 -0
  26. package/dist/commands/review.js.map +7 -0
  27. package/dist/commands/terminalSetup.js +6 -0
  28. package/dist/commands/terminalSetup.js.map +2 -2
  29. package/dist/commands/undo.js +8 -0
  30. package/dist/commands/undo.js.map +2 -2
  31. package/dist/commands/vim.js +22 -0
  32. package/dist/commands/vim.js.map +7 -0
  33. package/dist/commands.js +12 -0
  34. package/dist/commands.js.map +2 -2
  35. package/dist/components/HighlightedCode.js +1 -0
  36. package/dist/components/HighlightedCode.js.map +2 -2
  37. package/dist/components/ModelSelector/ModelSelector.js +250 -143
  38. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  39. package/dist/components/PromptInput.js +21 -6
  40. package/dist/components/PromptInput.js.map +2 -2
  41. package/dist/components/PulseLabel.js +44 -0
  42. package/dist/components/PulseLabel.js.map +7 -0
  43. package/dist/components/RequestStatusIndicator.js +1 -1
  44. package/dist/components/RequestStatusIndicator.js.map +1 -1
  45. package/dist/components/Spinner.js +12 -42
  46. package/dist/components/Spinner.js.map +3 -3
  47. package/dist/components/StartupStatus.js +57 -0
  48. package/dist/components/StartupStatus.js.map +7 -0
  49. package/dist/components/SubagentBlock.js +43 -6
  50. package/dist/components/SubagentBlock.js.map +2 -2
  51. package/dist/components/TabbedListView/TabBar.js +13 -8
  52. package/dist/components/TabbedListView/TabBar.js.map +2 -2
  53. package/dist/components/TabbedListView/TabbedListView.js +1 -1
  54. package/dist/components/TabbedListView/TabbedListView.js.map +2 -2
  55. package/dist/components/TodoPanel.js +1 -1
  56. package/dist/components/TodoPanel.js.map +1 -1
  57. package/dist/components/ToolUseLoader.js +5 -0
  58. package/dist/components/ToolUseLoader.js.map +2 -2
  59. package/dist/components/TrustDialog.js +0 -2
  60. package/dist/components/TrustDialog.js.map +2 -2
  61. package/dist/components/messages/TaskInModuleView.js +1 -1
  62. package/dist/components/messages/TaskInModuleView.js.map +2 -2
  63. package/dist/components/messages/TaskToolMessage.js +1 -1
  64. package/dist/components/messages/TaskToolMessage.js.map +2 -2
  65. package/dist/components/messages/UserPromptMessage.js +6 -1
  66. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  67. package/dist/constants/modelCapabilities.js +103 -18
  68. package/dist/constants/modelCapabilities.js.map +2 -2
  69. package/dist/constants/product.js +2 -0
  70. package/dist/constants/product.js.map +2 -2
  71. package/dist/constants/prompts/agentPrompt.js +30 -0
  72. package/dist/constants/prompts/agentPrompt.js.map +7 -0
  73. package/dist/constants/prompts/codeConventions.js +27 -0
  74. package/dist/constants/prompts/codeConventions.js.map +7 -0
  75. package/dist/constants/prompts/doingTasks.js +15 -0
  76. package/dist/constants/prompts/doingTasks.js.map +7 -0
  77. package/dist/constants/prompts/envInfo.js +17 -0
  78. package/dist/constants/prompts/envInfo.js.map +7 -0
  79. package/dist/constants/prompts/executingWithCare.js +17 -0
  80. package/dist/constants/prompts/executingWithCare.js.map +7 -0
  81. package/dist/constants/prompts/identity.js +10 -0
  82. package/dist/constants/prompts/identity.js.map +7 -0
  83. package/dist/constants/prompts/index.js +78 -0
  84. package/dist/constants/prompts/index.js.map +7 -0
  85. package/dist/constants/prompts/taskManagement.js +60 -0
  86. package/dist/constants/prompts/taskManagement.js.map +7 -0
  87. package/dist/constants/prompts/toneAndStyle.js +62 -0
  88. package/dist/constants/prompts/toneAndStyle.js.map +7 -0
  89. package/dist/constants/prompts/toolUsagePolicy.js +38 -0
  90. package/dist/constants/prompts/toolUsagePolicy.js.map +7 -0
  91. package/dist/constants/prompts.js +5 -176
  92. package/dist/constants/prompts.js.map +2 -2
  93. package/dist/constants/providerRegistry.js +235 -0
  94. package/dist/constants/providerRegistry.js.map +7 -0
  95. package/dist/constants/providers.js +35 -0
  96. package/dist/constants/providers.js.map +7 -0
  97. package/dist/context/PermissionContext.js +0 -1
  98. package/dist/context/PermissionContext.js.map +2 -2
  99. package/dist/context.js +87 -31
  100. package/dist/context.js.map +2 -2
  101. package/dist/core/backupHook.js +2 -2
  102. package/dist/core/backupHook.js.map +2 -2
  103. package/dist/core/config/defaults.js +4 -1
  104. package/dist/core/config/defaults.js.map +2 -2
  105. package/dist/core/config/schema.js +7 -1
  106. package/dist/core/config/schema.js.map +2 -2
  107. package/dist/core/costTracker.js +18 -0
  108. package/dist/core/costTracker.js.map +2 -2
  109. package/dist/core/index.js +0 -1
  110. package/dist/core/index.js.map +2 -2
  111. package/dist/core/tokenStatsManager.js +22 -4
  112. package/dist/core/tokenStatsManager.js.map +2 -2
  113. package/dist/entrypoints/cli.js +65 -84
  114. package/dist/entrypoints/cli.js.map +2 -2
  115. package/dist/hooks/useAgentTokenStats.js +1 -1
  116. package/dist/hooks/useAgentTokenStats.js.map +2 -2
  117. package/dist/hooks/useAgentTranscripts.js +2 -1
  118. package/dist/hooks/useAgentTranscripts.js.map +2 -2
  119. package/dist/hooks/useBackgroundShells.js +29 -0
  120. package/dist/hooks/useBackgroundShells.js.map +7 -0
  121. package/dist/hooks/useCanUseTool.js +1 -1
  122. package/dist/hooks/useCanUseTool.js.map +2 -2
  123. package/dist/hooks/useDeferredLoading.js +64 -0
  124. package/dist/hooks/useDeferredLoading.js.map +7 -0
  125. package/dist/hooks/useHookStatus.js +1 -1
  126. package/dist/hooks/useHookStatus.js.map +2 -2
  127. package/dist/hooks/useSessionTracking.js +55 -0
  128. package/dist/hooks/useSessionTracking.js.map +7 -0
  129. package/dist/hooks/useTerminalSize.js +21 -0
  130. package/dist/hooks/useTerminalSize.js.map +2 -2
  131. package/dist/hooks/useTextInput.js +1 -0
  132. package/dist/hooks/useTextInput.js.map +2 -2
  133. package/dist/hooks/useUnifiedCompletion.js +3 -2
  134. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  135. package/dist/i18n/locales/en.js +8 -9
  136. package/dist/i18n/locales/en.js.map +2 -2
  137. package/dist/i18n/locales/zh-CN.js +8 -9
  138. package/dist/i18n/locales/zh-CN.js.map +2 -2
  139. package/dist/i18n/types.js.map +1 -1
  140. package/dist/messages.js +41 -17
  141. package/dist/messages.js.map +2 -2
  142. package/dist/permissions.js +94 -1
  143. package/dist/permissions.js.map +2 -2
  144. package/dist/query.js +27 -19
  145. package/dist/query.js.map +2 -2
  146. package/dist/screens/REPL.js +83 -74
  147. package/dist/screens/REPL.js.map +2 -2
  148. package/dist/services/adapters/responsesAPI.js +6 -0
  149. package/dist/services/adapters/responsesAPI.js.map +2 -2
  150. package/dist/services/agentTeams/index.js +35 -0
  151. package/dist/services/agentTeams/index.js.map +7 -0
  152. package/dist/services/agentTeams/mailbox.js +114 -0
  153. package/dist/services/agentTeams/mailbox.js.map +7 -0
  154. package/dist/services/agentTeams/teamManager.js +149 -0
  155. package/dist/services/agentTeams/teamManager.js.map +7 -0
  156. package/dist/services/agentTeams/teamTaskStore.js +114 -0
  157. package/dist/services/agentTeams/teamTaskStore.js.map +7 -0
  158. package/dist/services/agentTeams/teammateSpawner.js +80 -0
  159. package/dist/services/agentTeams/teammateSpawner.js.map +7 -0
  160. package/dist/services/checkpointManager.js +16 -3
  161. package/dist/services/checkpointManager.js.map +2 -2
  162. package/dist/services/claude.js +19 -1728
  163. package/dist/services/claude.js.map +3 -3
  164. package/dist/services/gpt5ConnectionTest.js +4 -2
  165. package/dist/services/gpt5ConnectionTest.js.map +2 -2
  166. package/dist/services/hookExecutor.js +411 -127
  167. package/dist/services/hookExecutor.js.map +2 -2
  168. package/dist/services/llm/anthropicProvider.js +807 -0
  169. package/dist/services/llm/anthropicProvider.js.map +7 -0
  170. package/dist/services/llm/dispatch.js +218 -0
  171. package/dist/services/llm/dispatch.js.map +7 -0
  172. package/dist/services/llm/index.js +44 -0
  173. package/dist/services/llm/index.js.map +7 -0
  174. package/dist/services/llm/mintoContext.js +69 -0
  175. package/dist/services/llm/mintoContext.js.map +7 -0
  176. package/dist/services/llm/openaiProvider.js +622 -0
  177. package/dist/services/llm/openaiProvider.js.map +7 -0
  178. package/dist/services/llm/types.js +157 -0
  179. package/dist/services/llm/types.js.map +7 -0
  180. package/dist/services/mcpClient.js +183 -33
  181. package/dist/services/mcpClient.js.map +2 -2
  182. package/dist/services/notifier.js +14 -0
  183. package/dist/services/notifier.js.map +2 -2
  184. package/dist/services/oauth.js +4 -2
  185. package/dist/services/oauth.js.map +2 -2
  186. package/dist/services/openai.js +66 -56
  187. package/dist/services/openai.js.map +3 -3
  188. package/dist/services/outputStyles.js +102 -21
  189. package/dist/services/outputStyles.js.map +2 -2
  190. package/dist/services/plugins/skillMarketplace.js +4 -1
  191. package/dist/services/plugins/skillMarketplace.js.map +2 -2
  192. package/dist/services/sentry.js +1 -1
  193. package/dist/services/sentry.js.map +2 -2
  194. package/dist/services/sessionMemory.js +16 -3
  195. package/dist/services/sessionMemory.js.map +2 -2
  196. package/dist/services/systemReminder.js +350 -3
  197. package/dist/services/systemReminder.js.map +2 -2
  198. package/dist/services/taskStore.js +19 -0
  199. package/dist/services/taskStore.js.map +2 -2
  200. package/dist/tools/ArchitectTool/ArchitectTool.js.map +1 -1
  201. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +1 -1
  202. package/dist/tools/BashOutputTool/BashOutputTool.js.map +1 -1
  203. package/dist/tools/BashTool/BashTool.js +28 -0
  204. package/dist/tools/BashTool/BashTool.js.map +2 -2
  205. package/dist/tools/FileEditTool/FileEditTool.js +1 -1
  206. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  207. package/dist/tools/FileReadTool/FileReadTool.js +14 -0
  208. package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
  209. package/dist/tools/FileWriteTool/FileWriteTool.js +3 -1
  210. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  211. package/dist/tools/GlobTool/GlobTool.js.map +1 -1
  212. package/dist/tools/GrepTool/GrepTool.js.map +1 -1
  213. package/dist/tools/KillShellTool/KillShellTool.js.map +1 -1
  214. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +2 -2
  215. package/dist/tools/LspTool/LspTool.js +11 -2
  216. package/dist/tools/LspTool/LspTool.js.map +2 -2
  217. package/dist/tools/MCPTool/MCPTool.js.map +1 -1
  218. package/dist/tools/MemoryReadTool/MemoryReadTool.js +2 -1
  219. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
  220. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +2 -1
  221. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
  222. package/dist/tools/MultiEditTool/MultiEditTool.js.map +1 -1
  223. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +1 -1
  224. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +1 -1
  225. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +8 -2
  226. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
  227. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +2 -0
  228. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
  229. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +1 -1
  230. package/dist/tools/SlashCommandTool/SlashCommandTool.js +174 -18
  231. package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +3 -3
  232. package/dist/tools/TaskCreateTool/TaskCreateTool.js.map +1 -1
  233. package/dist/tools/TaskGetTool/TaskGetTool.js.map +1 -1
  234. package/dist/tools/TaskListTool/TaskListTool.js.map +1 -1
  235. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +1 -1
  236. package/dist/tools/TaskStopTool/TaskStopTool.js.map +1 -1
  237. package/dist/tools/TaskTool/TaskTool.js +75 -5
  238. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  239. package/dist/tools/TaskTool/prompt.js +12 -6
  240. package/dist/tools/TaskTool/prompt.js.map +2 -2
  241. package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +1 -1
  242. package/dist/tools/ThinkTool/ThinkTool.js.map +1 -1
  243. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +1 -1
  244. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +1 -1
  245. package/dist/tools/WebSearchTool/WebSearchTool.js.map +1 -1
  246. package/dist/tools/WebSearchTool/searchProviders.js +2 -1
  247. package/dist/tools/WebSearchTool/searchProviders.js.map +2 -2
  248. package/dist/tools/lsTool/lsTool.js.map +2 -2
  249. package/dist/tools/lsTool/prompt.js.map +1 -1
  250. package/dist/tools.js +14 -3
  251. package/dist/tools.js.map +2 -2
  252. package/dist/types/PermissionMode.js +21 -1
  253. package/dist/types/PermissionMode.js.map +2 -2
  254. package/dist/types/agentTeams.js +1 -0
  255. package/dist/types/agentTeams.js.map +7 -0
  256. package/dist/types/hooks.js +8 -2
  257. package/dist/types/hooks.js.map +2 -2
  258. package/dist/types/plugin.js +1 -1
  259. package/dist/types/plugin.js.map +2 -2
  260. package/dist/utils/agentLoader.js +25 -3
  261. package/dist/utils/agentLoader.js.map +2 -2
  262. package/dist/utils/animationManager.js +1 -1
  263. package/dist/utils/animationManager.js.map +2 -2
  264. package/dist/utils/ask.js +1 -1
  265. package/dist/utils/async.js +5 -1
  266. package/dist/utils/async.js.map +2 -2
  267. package/dist/utils/autoCompactCore.js +60 -0
  268. package/dist/utils/autoCompactCore.js.map +2 -2
  269. package/dist/utils/config.js +26 -128
  270. package/dist/utils/config.js.map +2 -2
  271. package/dist/utils/configSchema.js +227 -0
  272. package/dist/utils/configSchema.js.map +7 -0
  273. package/dist/utils/debugLogger.js.map +2 -2
  274. package/dist/utils/env.js +4 -3
  275. package/dist/utils/env.js.map +2 -2
  276. package/dist/utils/envConfig.js +34 -0
  277. package/dist/utils/envConfig.js.map +3 -3
  278. package/dist/utils/gpt5.js +146 -0
  279. package/dist/utils/gpt5.js.map +7 -0
  280. package/dist/utils/hookManager.js +374 -140
  281. package/dist/utils/hookManager.js.map +2 -2
  282. package/dist/utils/markdown.js +47 -0
  283. package/dist/utils/markdown.js.map +2 -2
  284. package/dist/utils/memoizeWithTTL.js +25 -0
  285. package/dist/utils/memoizeWithTTL.js.map +7 -0
  286. package/dist/utils/model.js +34 -9
  287. package/dist/utils/model.js.map +2 -2
  288. package/dist/utils/pluginInstaller.js +34 -5
  289. package/dist/utils/pluginInstaller.js.map +2 -2
  290. package/dist/utils/pluginLoader.js +201 -32
  291. package/dist/utils/pluginLoader.js.map +2 -2
  292. package/dist/utils/safeFetch.js +45 -0
  293. package/dist/utils/safeFetch.js.map +7 -0
  294. package/dist/utils/skillLoader.js +59 -6
  295. package/dist/utils/skillLoader.js.map +2 -2
  296. package/dist/utils/streamingState.js +52 -0
  297. package/dist/utils/streamingState.js.map +7 -0
  298. package/dist/utils/style.js +6 -3
  299. package/dist/utils/style.js.map +2 -2
  300. package/dist/utils/teamConfig.js +9 -3
  301. package/dist/utils/teamConfig.js.map +2 -2
  302. package/dist/utils/toolRiskClassification.js +0 -6
  303. package/dist/utils/toolRiskClassification.js.map +2 -2
  304. package/dist/version.js +2 -2
  305. package/dist/version.js.map +1 -1
  306. package/package.json +2 -1
@@ -0,0 +1,622 @@
1
+ import { randomUUID } from "crypto";
2
+ import { nanoid } from "nanoid";
3
+ import { getToolDescriptionAsync } from "../../Tool.js";
4
+ import {
5
+ getGlobalConfig
6
+ } from "../../utils/config.js";
7
+ import { isGPT5ModelName as isGPT5Model } from "../../utils/config.js";
8
+ import {
9
+ createAssistantAPIErrorMessage,
10
+ normalizeContentFromAPI
11
+ } from "../../utils/messages.js";
12
+ import {
13
+ debug as debugLogger,
14
+ getCurrentRequest,
15
+ logLLMInteraction,
16
+ logSystemPromptConstruction
17
+ } from "../../utils/debugLogger.js";
18
+ import { getModelManager } from "../../utils/model.js";
19
+ import { zodToJsonSchema } from "zod-to-json-schema";
20
+ import { ModelAdapterFactory } from "../modelAdapterFactory.js";
21
+ import { getCLISyspromptPrefix } from "../../constants/prompts/index.js";
22
+ import { setStreamingState } from "../../utils/streamingState.js";
23
+ import {
24
+ getCompletionWithProfile,
25
+ getGPT5CompletionWithProfile
26
+ } from "../openai.js";
27
+ import { getReasoningEffort } from "../../utils/thinking.js";
28
+ import { addRetryEventToTranscript } from "../../utils/agentTranscripts.js";
29
+ import { generateMintoContext } from "./mintoContext.js";
30
+ import { splitSysPromptPrefix } from "./anthropicProvider.js";
31
+ 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
+ PROMPT_CACHING_ENABLED,
37
+ MAIN_QUERY_TEMPERATURE,
38
+ SONNET_COST_PER_MILLION_INPUT_TOKENS,
39
+ SONNET_COST_PER_MILLION_OUTPUT_TOKENS,
40
+ withRetry,
41
+ getMaxTokensFromProfile,
42
+ getModelInputTokenCostUSD,
43
+ getModelOutputTokenCostUSD,
44
+ addToTotalCost,
45
+ recordTokenUsage,
46
+ logError
47
+ } from "./types.js";
48
+ function convertAnthropicMessagesToOpenAIMessages(messages) {
49
+ const openaiMessages = [];
50
+ const toolResults = {};
51
+ for (const message of messages) {
52
+ let contentBlocks = [];
53
+ if (typeof message.message.content === "string") {
54
+ contentBlocks = [
55
+ {
56
+ type: "text",
57
+ text: message.message.content
58
+ }
59
+ ];
60
+ } else if (!Array.isArray(message.message.content)) {
61
+ contentBlocks = [message.message.content];
62
+ } else {
63
+ contentBlocks = message.message.content;
64
+ }
65
+ for (const block of contentBlocks) {
66
+ if (block.type === "text") {
67
+ openaiMessages.push({
68
+ role: message.message.role,
69
+ content: block.text
70
+ });
71
+ } else if (block.type === "tool_use") {
72
+ openaiMessages.push({
73
+ role: "assistant",
74
+ content: void 0,
75
+ tool_calls: [
76
+ {
77
+ type: "function",
78
+ function: {
79
+ name: block.name,
80
+ arguments: JSON.stringify(block.input)
81
+ },
82
+ id: block.id
83
+ }
84
+ ]
85
+ });
86
+ } else if (block.type === "tool_result") {
87
+ let toolContent = block.content;
88
+ if (typeof toolContent !== "string") {
89
+ toolContent = JSON.stringify(toolContent);
90
+ }
91
+ toolResults[block.tool_use_id] = {
92
+ role: "tool",
93
+ content: toolContent,
94
+ tool_call_id: block.tool_use_id
95
+ };
96
+ }
97
+ }
98
+ }
99
+ const finalMessages = [];
100
+ for (const message of openaiMessages) {
101
+ finalMessages.push(message);
102
+ if ("tool_calls" in message && message.tool_calls) {
103
+ for (const toolCall of message.tool_calls) {
104
+ if (toolResults[toolCall.id]) {
105
+ finalMessages.push(toolResults[toolCall.id]);
106
+ }
107
+ }
108
+ }
109
+ }
110
+ return finalMessages;
111
+ }
112
+ function messageReducer(previous, item) {
113
+ const reduce = (acc, delta) => {
114
+ acc = { ...acc };
115
+ for (const [key, value] of Object.entries(delta)) {
116
+ if (acc[key] === void 0 || acc[key] === null) {
117
+ acc[key] = value;
118
+ if (Array.isArray(acc[key])) {
119
+ for (const arr of acc[key]) {
120
+ delete arr.index;
121
+ }
122
+ }
123
+ } else if (typeof acc[key] === "string" && typeof value === "string") {
124
+ acc[key] += value;
125
+ } else if (typeof acc[key] === "number" && typeof value === "number") {
126
+ acc[key] = value;
127
+ } else if (Array.isArray(acc[key]) && Array.isArray(value)) {
128
+ const accArray = acc[key];
129
+ for (let i = 0; i < value.length; i++) {
130
+ const { index: rawIndex, ...chunkTool } = value[i];
131
+ const index = rawIndex ?? 0;
132
+ if (index - accArray.length > 1) {
133
+ throw new Error(
134
+ `Error: An array has an empty value when tool_calls are constructed. tool_calls: ${accArray}; tool: ${value}`
135
+ );
136
+ }
137
+ accArray[index] = reduce(accArray[index], chunkTool);
138
+ }
139
+ } else if (typeof acc[key] === "object" && typeof value === "object") {
140
+ acc[key] = reduce(acc[key], value);
141
+ }
142
+ }
143
+ return acc;
144
+ };
145
+ const choice = item.choices?.[0];
146
+ if (!choice) {
147
+ return previous;
148
+ }
149
+ return reduce(previous, choice.delta);
150
+ }
151
+ async function handleMessageStream(stream, signal) {
152
+ const streamStartTime = Date.now();
153
+ let ttftMs;
154
+ let chunkCount = 0;
155
+ let errorCount = 0;
156
+ debugLogger.api("OPENAI_STREAM_START", {
157
+ streamStartTime: String(streamStartTime)
158
+ });
159
+ let message = {};
160
+ let id, model, created, object, usage;
161
+ try {
162
+ for await (const chunk of stream) {
163
+ if (signal?.aborted) {
164
+ debugLogger.flow("OPENAI_STREAM_ABORTED", {
165
+ chunkCount,
166
+ timestamp: Date.now()
167
+ });
168
+ throw new Error("Request was cancelled");
169
+ }
170
+ chunkCount++;
171
+ try {
172
+ if (!id) {
173
+ id = chunk.id;
174
+ debugLogger.api("OPENAI_STREAM_ID_RECEIVED", {
175
+ id,
176
+ chunkNumber: String(chunkCount)
177
+ });
178
+ }
179
+ if (!model) {
180
+ model = chunk.model;
181
+ debugLogger.api("OPENAI_STREAM_MODEL_RECEIVED", {
182
+ model,
183
+ chunkNumber: String(chunkCount)
184
+ });
185
+ }
186
+ if (!created) {
187
+ created = chunk.created;
188
+ }
189
+ if (!object) {
190
+ object = chunk.object;
191
+ }
192
+ if (!usage && chunk.usage) {
193
+ usage = chunk.usage;
194
+ setStreamingState({
195
+ inputTokens: chunk.usage.prompt_tokens,
196
+ outputTokens: chunk.usage.completion_tokens
197
+ });
198
+ }
199
+ message = messageReducer(message, chunk);
200
+ if (chunk?.choices?.[0]?.delta?.content) {
201
+ if (!ttftMs) {
202
+ ttftMs = Date.now() - streamStartTime;
203
+ debugLogger.api("OPENAI_STREAM_FIRST_TOKEN", {
204
+ ttftMs: String(ttftMs),
205
+ chunkNumber: String(chunkCount)
206
+ });
207
+ }
208
+ }
209
+ } catch (chunkError) {
210
+ errorCount++;
211
+ debugLogger.error("OPENAI_STREAM_CHUNK_ERROR", {
212
+ chunkNumber: String(chunkCount),
213
+ errorMessage: chunkError instanceof Error ? chunkError.message : String(chunkError),
214
+ errorType: chunkError instanceof Error ? chunkError.constructor.name : typeof chunkError
215
+ });
216
+ }
217
+ }
218
+ debugLogger.api("OPENAI_STREAM_COMPLETE", {
219
+ totalChunks: String(chunkCount),
220
+ errorCount: String(errorCount),
221
+ totalDuration: String(Date.now() - streamStartTime),
222
+ ttftMs: String(ttftMs || 0),
223
+ finalMessageId: id || "undefined"
224
+ });
225
+ } catch (streamError) {
226
+ debugLogger.error("OPENAI_STREAM_FATAL_ERROR", {
227
+ totalChunks: String(chunkCount),
228
+ errorCount: String(errorCount),
229
+ errorMessage: streamError instanceof Error ? streamError.message : String(streamError),
230
+ errorType: streamError instanceof Error ? streamError.constructor.name : typeof streamError
231
+ });
232
+ throw streamError;
233
+ }
234
+ return {
235
+ id,
236
+ created,
237
+ model,
238
+ object,
239
+ choices: [
240
+ {
241
+ index: 0,
242
+ message,
243
+ finish_reason: "stop",
244
+ logprobs: void 0
245
+ }
246
+ ],
247
+ usage
248
+ };
249
+ }
250
+ function convertOpenAIResponseToAnthropic(response, _tools) {
251
+ let contentBlocks = [];
252
+ const message = response.choices?.[0]?.message;
253
+ if (!message) {
254
+ return {
255
+ role: "assistant",
256
+ content: [],
257
+ stop_reason: response.choices?.[0]?.finish_reason,
258
+ type: "message",
259
+ usage: response.usage
260
+ };
261
+ }
262
+ if (message?.tool_calls) {
263
+ for (const toolCall of message.tool_calls) {
264
+ const tool = toolCall.function;
265
+ const toolName = tool?.name;
266
+ let toolArgs = {};
267
+ let parseError = null;
268
+ try {
269
+ toolArgs = tool?.arguments ? JSON.parse(tool.arguments) : {};
270
+ } catch (e) {
271
+ parseError = e instanceof Error ? e.message : String(e);
272
+ debugLogger.warn("TOOL_ARGUMENTS_PARSE_ERROR", {
273
+ toolName,
274
+ rawArguments: tool?.arguments?.substring(0, 200),
275
+ errorMessage: parseError
276
+ });
277
+ }
278
+ if (parseError && Object.keys(toolArgs).length === 0) {
279
+ debugLogger.error("TOOL_CALL_EMPTY_ARGUMENTS", {
280
+ toolName,
281
+ parseError,
282
+ suggestion: "Model may have sent malformed JSON. The tool call will likely fail validation."
283
+ });
284
+ }
285
+ contentBlocks.push({
286
+ type: "tool_use",
287
+ input: toolArgs,
288
+ name: toolName,
289
+ id: toolCall.id?.length > 0 ? toolCall.id : nanoid()
290
+ });
291
+ }
292
+ }
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
+ if (message.content) {
308
+ contentBlocks.push({
309
+ type: "text",
310
+ text: message?.content,
311
+ citations: []
312
+ });
313
+ }
314
+ const finalMessage = {
315
+ role: "assistant",
316
+ content: contentBlocks,
317
+ stop_reason: response.choices?.[0]?.finish_reason,
318
+ type: "message",
319
+ usage: response.usage
320
+ };
321
+ return finalMessage;
322
+ }
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
+ async function queryOpenAI(messages, systemPrompt, maxThinkingTokens, tools, signal, options) {
347
+ const config = getGlobalConfig();
348
+ const modelManager = getModelManager();
349
+ const toolUseContext = options?.toolUseContext;
350
+ const modelProfile = options?.modelProfile || modelManager.getModel("main");
351
+ let model;
352
+ const currentRequest = getCurrentRequest();
353
+ debugLogger.api("MODEL_CONFIG_OPENAI", {
354
+ modelProfileFound: !!modelProfile,
355
+ modelProfileId: modelProfile?.modelName,
356
+ modelProfileName: modelProfile?.name,
357
+ modelProfileModelName: modelProfile?.modelName,
358
+ modelProfileProvider: modelProfile?.provider,
359
+ modelProfileBaseURL: modelProfile?.baseURL,
360
+ modelProfileApiKeyExists: !!modelProfile?.apiKey,
361
+ optionsModel: options?.model,
362
+ requestId: getCurrentRequest()?.id
363
+ });
364
+ if (modelProfile) {
365
+ model = modelProfile.modelName;
366
+ } else {
367
+ model = options?.model || modelProfile?.modelName || "";
368
+ }
369
+ if (options?.prependCLISysprompt) {
370
+ const [firstSyspromptBlock] = splitSysPromptPrefix(systemPrompt);
371
+ systemPrompt = [getCLISyspromptPrefix(), ...systemPrompt];
372
+ }
373
+ const system = splitSysPromptPrefix(systemPrompt).map(
374
+ (_) => ({
375
+ ...PROMPT_CACHING_ENABLED ? { cache_control: { type: "ephemeral" } } : {},
376
+ text: _,
377
+ type: "text"
378
+ })
379
+ );
380
+ const toolSchemas = await Promise.all(
381
+ tools.map(
382
+ async (_) => ({
383
+ type: "function",
384
+ function: {
385
+ name: _.name,
386
+ description: await getToolDescriptionAsync(_),
387
+ parameters: "inputJSONSchema" in _ && _.inputJSONSchema ? _.inputJSONSchema : zodToJsonSchema(_.inputSchema)
388
+ }
389
+ })
390
+ )
391
+ );
392
+ const openaiSystem = system.map(
393
+ (s) => ({
394
+ role: "system",
395
+ content: s.text
396
+ })
397
+ );
398
+ const openaiMessages = convertAnthropicMessagesToOpenAIMessages(messages);
399
+ const startIncludingRetries = Date.now();
400
+ logSystemPromptConstruction({
401
+ basePrompt: systemPrompt.join("\n"),
402
+ mintoContext: generateMintoContext() || "",
403
+ reminders: [],
404
+ finalPrompt: systemPrompt.join("\n")
405
+ });
406
+ let start = Date.now();
407
+ let attemptNumber = 0;
408
+ let response;
409
+ try {
410
+ response = await withRetry(
411
+ async (attempt) => {
412
+ attemptNumber = attempt;
413
+ start = Date.now();
414
+ const maxTokens = getMaxTokensFromProfile(modelProfile);
415
+ const isGPT5 = isGPT5Model(model);
416
+ const isReasoningModel = isGPT5 || model.startsWith("o3") || model.startsWith("o4-mini") || model === "o1" || model === "o1-mini" || model === "o1-preview";
417
+ const opts = {
418
+ model,
419
+ ...isGPT5 ? { max_completion_tokens: maxTokens } : { max_tokens: maxTokens },
420
+ messages: [...openaiSystem, ...openaiMessages],
421
+ // Reasoning models (GPT-5, o3, o4-mini) require temperature to be omitted
422
+ ...!isReasoningModel && { temperature: MAIN_QUERY_TEMPERATURE }
423
+ };
424
+ if (config.stream) {
425
+ ;
426
+ opts.stream = true;
427
+ opts.stream_options = {
428
+ include_usage: true
429
+ };
430
+ }
431
+ if (toolSchemas.length > 0) {
432
+ opts.tools = toolSchemas;
433
+ opts.tool_choice = "auto";
434
+ }
435
+ const reasoningEffort = await getReasoningEffort(modelProfile, messages);
436
+ if (reasoningEffort) {
437
+ opts.reasoning_effort = reasoningEffort;
438
+ }
439
+ if (modelProfile && modelProfile.modelName) {
440
+ debugLogger.api("USING_MODEL_PROFILE_PATH", {
441
+ modelProfileName: modelProfile.modelName,
442
+ modelName: modelProfile.modelName,
443
+ provider: modelProfile.provider,
444
+ baseURL: modelProfile.baseURL,
445
+ apiKeyExists: !!modelProfile.apiKey,
446
+ requestId: getCurrentRequest()?.id
447
+ });
448
+ const USE_NEW_ADAPTER_SYSTEM = process.env.USE_NEW_ADAPTERS !== "false";
449
+ if (USE_NEW_ADAPTER_SYSTEM) {
450
+ const adapter = ModelAdapterFactory.createAdapter(modelProfile);
451
+ const unifiedParams = {
452
+ messages: openaiMessages,
453
+ systemPrompt: openaiSystem.map((s) => s.content),
454
+ tools,
455
+ maxTokens: getMaxTokensFromProfile(modelProfile),
456
+ stream: config.stream,
457
+ reasoningEffort,
458
+ temperature: isGPT5Model(model) || model.startsWith("o3") || model.startsWith("o4-mini") ? void 0 : MAIN_QUERY_TEMPERATURE,
459
+ previousResponseId: toolUseContext?.responseState?.previousResponseId,
460
+ verbosity: "high"
461
+ // High verbosity for coding tasks
462
+ };
463
+ 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(
515
+ modelProfile,
516
+ opts,
517
+ 0,
518
+ 10,
519
+ signal
520
+ );
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;
532
+ }
533
+ } else {
534
+ const errorDetails = {
535
+ modelProfileExists: !!modelProfile,
536
+ modelProfileId: modelProfile?.modelName,
537
+ modelNameExists: !!modelProfile?.modelName,
538
+ requestedModel: model,
539
+ requestId: getCurrentRequest()?.id
540
+ };
541
+ debugLogger.error("NO_VALID_MODEL_PROFILE", errorDetails);
542
+ throw new Error(
543
+ `No valid ModelProfile available for model: ${model}. Please configure model through /model command. Debug: ${JSON.stringify(errorDetails)}`
544
+ );
545
+ }
546
+ },
547
+ {
548
+ signal,
549
+ onRetry: toolUseContext?.agentId ? ({ attempt, maxRetries, error, delayMs }) => {
550
+ addRetryEventToTranscript(toolUseContext.agentId, {
551
+ attempt,
552
+ maxRetries,
553
+ errorMessage: error.message,
554
+ delayMs
555
+ });
556
+ } : void 0
557
+ }
558
+ );
559
+ } catch (error) {
560
+ logError(error);
561
+ return getAssistantMessageFromError(error);
562
+ }
563
+ const durationMs = Date.now() - start;
564
+ const durationMsIncludingRetries = Date.now() - startIncludingRetries;
565
+ const inputTokens = response.usage?.prompt_tokens ?? 0;
566
+ const outputTokens = response.usage?.completion_tokens ?? 0;
567
+ 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);
572
+ addToTotalCost(costUSD, durationMsIncludingRetries);
573
+ recordTokenUsage(
574
+ {
575
+ inputTokens,
576
+ outputTokens,
577
+ cacheCreationTokens: cacheCreationInputTokens,
578
+ cacheReadTokens: cacheReadInputTokens
579
+ },
580
+ costUSD,
581
+ model,
582
+ toolUseContext ? {
583
+ agentId: toolUseContext.agentId,
584
+ toolUseId: toolUseContext.toolUseId,
585
+ model
586
+ } : void 0
587
+ );
588
+ logLLMInteraction({
589
+ systemPrompt: systemPrompt.join("\n"),
590
+ messages: [...openaiSystem, ...openaiMessages],
591
+ response,
592
+ usage: {
593
+ inputTokens,
594
+ outputTokens
595
+ },
596
+ timing: {
597
+ start,
598
+ end: Date.now()
599
+ },
600
+ apiFormat: "openai"
601
+ });
602
+ return {
603
+ message: {
604
+ ...response,
605
+ content: normalizeContentFromAPI(response.content),
606
+ usage: {
607
+ input_tokens: inputTokens,
608
+ output_tokens: outputTokens,
609
+ cache_read_input_tokens: cacheReadInputTokens,
610
+ cache_creation_input_tokens: 0
611
+ }
612
+ },
613
+ costUSD,
614
+ durationMs,
615
+ type: "assistant",
616
+ uuid: randomUUID()
617
+ };
618
+ }
619
+ export {
620
+ queryOpenAI
621
+ };
622
+ //# sourceMappingURL=openaiProvider.js.map