@within-7/minto 0.1.7 → 0.2.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 (481) hide show
  1. package/cli.js +155 -37
  2. package/dist/Tool.js +38 -0
  3. package/dist/Tool.js.map +3 -3
  4. package/dist/commands/agents/AgentsCommand.js +52 -26
  5. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  6. package/dist/commands/agents/constants.js +1 -1
  7. package/dist/commands/agents/constants.js.map +1 -1
  8. package/dist/commands/agents/index.js +1 -1
  9. package/dist/commands/bug.js +74 -7
  10. package/dist/commands/bug.js.map +3 -3
  11. package/dist/commands/clear.js +3 -0
  12. package/dist/commands/clear.js.map +2 -2
  13. package/dist/commands/compact.js +37 -0
  14. package/dist/commands/compact.js.map +2 -2
  15. package/dist/commands/context.js +84 -0
  16. package/dist/commands/context.js.map +7 -0
  17. package/dist/commands/ctx_viz.js +18 -10
  18. package/dist/commands/ctx_viz.js.map +2 -2
  19. package/dist/commands/doctor.js +158 -12
  20. package/dist/commands/doctor.js.map +2 -2
  21. package/dist/commands/export.js +156 -0
  22. package/dist/commands/export.js.map +7 -0
  23. package/dist/commands/mcp-interactive.js +21 -12
  24. package/dist/commands/mcp-interactive.js.map +2 -2
  25. package/dist/commands/model.js +6 -5
  26. package/dist/commands/model.js.map +2 -2
  27. package/dist/commands/permissions.js +86 -0
  28. package/dist/commands/permissions.js.map +7 -0
  29. package/dist/commands/quit.js +3 -1
  30. package/dist/commands/quit.js.map +2 -2
  31. package/dist/commands/sandbox.js +104 -0
  32. package/dist/commands/sandbox.js.map +7 -0
  33. package/dist/commands/status.js +58 -0
  34. package/dist/commands/status.js.map +7 -0
  35. package/dist/commands/tasks.js +108 -0
  36. package/dist/commands/tasks.js.map +7 -0
  37. package/dist/commands/todos.js +123 -0
  38. package/dist/commands/todos.js.map +7 -0
  39. package/dist/commands.js +20 -2
  40. package/dist/commands.js.map +2 -2
  41. package/dist/components/AgentThinkingBlock.js +10 -18
  42. package/dist/components/AgentThinkingBlock.js.map +2 -2
  43. package/dist/components/BackgroundTasksPanel.js +78 -29
  44. package/dist/components/BackgroundTasksPanel.js.map +2 -2
  45. package/dist/components/BashStreamingProgress.js +24 -0
  46. package/dist/components/BashStreamingProgress.js.map +7 -0
  47. package/dist/components/CollapsibleHint.js +14 -0
  48. package/dist/components/CollapsibleHint.js.map +7 -0
  49. package/dist/components/FileEditToolUpdatedMessage.js +1 -1
  50. package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
  51. package/dist/components/HotkeyHelpPanel.js +137 -0
  52. package/dist/components/HotkeyHelpPanel.js.map +7 -0
  53. package/dist/components/Logo.js +5 -5
  54. package/dist/components/Logo.js.map +2 -2
  55. package/dist/components/Message.js +23 -7
  56. package/dist/components/Message.js.map +3 -3
  57. package/dist/components/ModelConfig.js +16 -3
  58. package/dist/components/ModelConfig.js.map +2 -2
  59. package/dist/components/ModelListManager.js +3 -3
  60. package/dist/components/ModelListManager.js.map +2 -2
  61. package/dist/components/ModelSelector/ModelSelector.js +1 -1
  62. package/dist/components/Onboarding.js +19 -14
  63. package/dist/components/Onboarding.js.map +2 -2
  64. package/dist/components/ProgressBar.js +74 -0
  65. package/dist/components/ProgressBar.js.map +7 -0
  66. package/dist/components/PromptInput.js +156 -46
  67. package/dist/components/PromptInput.js.map +2 -2
  68. package/dist/components/RequestStatusIndicator.js +194 -0
  69. package/dist/components/RequestStatusIndicator.js.map +7 -0
  70. package/dist/components/Spinner.js +92 -27
  71. package/dist/components/Spinner.js.map +2 -2
  72. package/dist/components/SpinnerSymbol.js +21 -27
  73. package/dist/components/SpinnerSymbol.js.map +2 -2
  74. package/dist/components/StreamingBashOutput.js +9 -8
  75. package/dist/components/StreamingBashOutput.js.map +2 -2
  76. package/dist/components/SubagentBlock.js +1 -1
  77. package/dist/components/SubagentBlock.js.map +1 -1
  78. package/dist/components/SubagentProgress.js +10 -11
  79. package/dist/components/SubagentProgress.js.map +2 -2
  80. package/dist/components/TaskCard.js +16 -13
  81. package/dist/components/TaskCard.js.map +2 -2
  82. package/dist/components/TodoChangeBlock.js +1 -1
  83. package/dist/components/TodoChangeBlock.js.map +2 -2
  84. package/dist/components/TodoPanel.js +120 -29
  85. package/dist/components/TodoPanel.js.map +3 -3
  86. package/dist/components/TokenCounter.js +74 -0
  87. package/dist/components/TokenCounter.js.map +7 -0
  88. package/dist/components/TokenWarning.js +2 -1
  89. package/dist/components/TokenWarning.js.map +2 -2
  90. package/dist/components/TreeConnector.js +25 -0
  91. package/dist/components/TreeConnector.js.map +7 -0
  92. package/dist/components/TurnCompletionIndicator.js +18 -0
  93. package/dist/components/TurnCompletionIndicator.js.map +7 -0
  94. package/dist/components/messages/AssistantTextMessage.js +5 -2
  95. package/dist/components/messages/AssistantTextMessage.js.map +2 -2
  96. package/dist/components/messages/AssistantThinkingMessage.js +18 -3
  97. package/dist/components/messages/AssistantThinkingMessage.js.map +2 -2
  98. package/dist/components/messages/AssistantToolUseMessage.js +11 -8
  99. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  100. package/dist/components/messages/GroupRenderer.js +53 -0
  101. package/dist/components/messages/GroupRenderer.js.map +7 -0
  102. package/dist/components/messages/NestedTasksPreview.js +12 -0
  103. package/dist/components/messages/NestedTasksPreview.js.map +7 -0
  104. package/dist/components/messages/ParallelTasksGroupView.js +92 -0
  105. package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
  106. package/dist/components/messages/TaskInModuleView.js +198 -0
  107. package/dist/components/messages/TaskInModuleView.js.map +7 -0
  108. package/dist/components/messages/TaskOutputContent.js +53 -0
  109. package/dist/components/messages/TaskOutputContent.js.map +7 -0
  110. package/dist/components/messages/UserPromptMessage.js +1 -1
  111. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  112. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +2 -3
  113. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
  114. package/dist/components/permissions/FallbackPermissionRequest.js +4 -4
  115. package/dist/components/permissions/FallbackPermissionRequest.js.map +2 -2
  116. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +4 -4
  117. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +2 -2
  118. package/dist/constants/colors.js +48 -0
  119. package/dist/constants/colors.js.map +2 -2
  120. package/dist/constants/formatRules.js +102 -0
  121. package/dist/constants/formatRules.js.map +7 -0
  122. package/dist/constants/prompts.js +12 -34
  123. package/dist/constants/prompts.js.map +2 -2
  124. package/dist/constants/symbols.js +64 -6
  125. package/dist/constants/symbols.js.map +2 -2
  126. package/dist/constants/timing.js +5 -0
  127. package/dist/constants/timing.js.map +2 -2
  128. package/dist/core/config/defaults.js +84 -0
  129. package/dist/core/config/defaults.js.map +7 -0
  130. package/dist/core/config/index.js +111 -0
  131. package/dist/core/config/index.js.map +7 -0
  132. package/dist/core/config/loader.js +221 -0
  133. package/dist/core/config/loader.js.map +7 -0
  134. package/dist/core/config/migrations.js +128 -0
  135. package/dist/core/config/migrations.js.map +7 -0
  136. package/dist/core/config/schema.js +178 -0
  137. package/dist/core/config/schema.js.map +7 -0
  138. package/dist/core/costTracker.js +138 -0
  139. package/dist/core/costTracker.js.map +7 -0
  140. package/dist/core/index.js +5 -0
  141. package/dist/core/index.js.map +7 -0
  142. package/dist/core/permissions/auditLog.js +204 -0
  143. package/dist/core/permissions/auditLog.js.map +7 -0
  144. package/dist/core/permissions/engine/index.js +3 -0
  145. package/dist/core/permissions/engine/index.js.map +7 -0
  146. package/dist/core/permissions/engine/permissionEngine.js +106 -0
  147. package/dist/core/permissions/engine/permissionEngine.js.map +7 -0
  148. package/dist/core/permissions/engine/types.js +1 -0
  149. package/dist/core/permissions/engine/types.js.map +7 -0
  150. package/dist/core/permissions/index.js +84 -0
  151. package/dist/core/permissions/index.js.map +7 -0
  152. package/dist/core/permissions/ruleEngine.js +259 -0
  153. package/dist/core/permissions/ruleEngine.js.map +7 -0
  154. package/dist/core/permissions/rules/allowedToolsRule.js +62 -0
  155. package/dist/core/permissions/rules/allowedToolsRule.js.map +7 -0
  156. package/dist/core/permissions/rules/autoEscalationRule.js +291 -0
  157. package/dist/core/permissions/rules/autoEscalationRule.js.map +7 -0
  158. package/dist/core/permissions/rules/index.js +46 -0
  159. package/dist/core/permissions/rules/index.js.map +7 -0
  160. package/dist/core/permissions/rules/planModeRule.js +55 -0
  161. package/dist/core/permissions/rules/planModeRule.js.map +7 -0
  162. package/dist/core/permissions/rules/projectBoundaryRule.js +168 -0
  163. package/dist/core/permissions/rules/projectBoundaryRule.js.map +7 -0
  164. package/dist/core/permissions/rules/safeModeRule.js +65 -0
  165. package/dist/core/permissions/rules/safeModeRule.js.map +7 -0
  166. package/dist/core/permissions/rules/sensitivePathsRule.js +340 -0
  167. package/dist/core/permissions/rules/sensitivePathsRule.js.map +7 -0
  168. package/dist/core/permissions/types.js +127 -0
  169. package/dist/core/permissions/types.js.map +7 -0
  170. package/dist/core/tools/executor.js +143 -0
  171. package/dist/core/tools/executor.js.map +7 -0
  172. package/dist/core/tools/index.js +15 -0
  173. package/dist/core/tools/index.js.map +7 -0
  174. package/dist/core/tools/registry.js +183 -0
  175. package/dist/core/tools/registry.js.map +7 -0
  176. package/dist/core/tools/types.js +1 -0
  177. package/dist/core/tools/types.js.map +7 -0
  178. package/dist/cost-tracker.js +23 -15
  179. package/dist/cost-tracker.js.map +2 -2
  180. package/dist/entrypoints/cli.js +43 -43
  181. package/dist/entrypoints/cli.js.map +2 -2
  182. package/dist/entrypoints/mcp.js +12 -4
  183. package/dist/entrypoints/mcp.js.map +2 -2
  184. package/dist/history.js +14 -3
  185. package/dist/history.js.map +2 -2
  186. package/dist/hooks/useAgentTranscripts.js +116 -0
  187. package/dist/hooks/useAgentTranscripts.js.map +7 -0
  188. package/dist/hooks/useAnimationSync.js +53 -0
  189. package/dist/hooks/useAnimationSync.js.map +7 -0
  190. package/dist/hooks/useArrowKeyHistory.js +4 -2
  191. package/dist/hooks/useArrowKeyHistory.js.map +2 -2
  192. package/dist/hooks/useCanUseTool.js +3 -1
  193. package/dist/hooks/useCanUseTool.js.map +2 -2
  194. package/dist/hooks/useCancelRequest.js +4 -1
  195. package/dist/hooks/useCancelRequest.js.map +2 -2
  196. package/dist/hooks/useExitOnCtrlCD.js +9 -5
  197. package/dist/hooks/useExitOnCtrlCD.js.map +2 -2
  198. package/dist/hooks/useHookStatus.js +40 -0
  199. package/dist/hooks/useHookStatus.js.map +7 -0
  200. package/dist/hooks/useLogMessages.js +17 -1
  201. package/dist/hooks/useLogMessages.js.map +2 -2
  202. package/dist/hooks/useMessageGroups.js +43 -0
  203. package/dist/hooks/useMessageGroups.js.map +7 -0
  204. package/dist/hooks/useTerminalSize.js +62 -6
  205. package/dist/hooks/useTerminalSize.js.map +2 -2
  206. package/dist/hooks/useUnifiedCompletion.js +69 -0
  207. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  208. package/dist/i18n/index.js +109 -0
  209. package/dist/i18n/index.js.map +7 -0
  210. package/dist/i18n/locales/en.js +347 -0
  211. package/dist/i18n/locales/en.js.map +7 -0
  212. package/dist/i18n/locales/index.js +7 -0
  213. package/dist/i18n/locales/index.js.map +7 -0
  214. package/dist/i18n/locales/zh-CN.js +347 -0
  215. package/dist/i18n/locales/zh-CN.js.map +7 -0
  216. package/dist/i18n/types.js +8 -0
  217. package/dist/i18n/types.js.map +7 -0
  218. package/dist/query.js +175 -17
  219. package/dist/query.js.map +3 -3
  220. package/dist/screens/REPL.js +501 -192
  221. package/dist/screens/REPL.js.map +3 -3
  222. package/dist/services/adapters/chatCompletions.js +3 -1
  223. package/dist/services/adapters/chatCompletions.js.map +2 -2
  224. package/dist/services/adapters/messageNormalizer.js +354 -0
  225. package/dist/services/adapters/messageNormalizer.js.map +7 -0
  226. package/dist/services/adapters/responsesAPI.js +6 -3
  227. package/dist/services/adapters/responsesAPI.js.map +2 -2
  228. package/dist/services/checkpointManager.js +386 -0
  229. package/dist/services/checkpointManager.js.map +7 -0
  230. package/dist/services/claude.js +138 -11
  231. package/dist/services/claude.js.map +3 -3
  232. package/dist/services/compressionService.js +50 -1
  233. package/dist/services/compressionService.js.map +2 -2
  234. package/dist/services/contextMonitor.js +162 -0
  235. package/dist/services/contextMonitor.js.map +7 -0
  236. package/dist/services/customCommands.js +60 -41
  237. package/dist/services/customCommands.js.map +2 -2
  238. package/dist/services/hookExecutor.js +173 -1
  239. package/dist/services/hookExecutor.js.map +2 -2
  240. package/dist/services/intelligentCompactor.js +281 -0
  241. package/dist/services/intelligentCompactor.js.map +7 -0
  242. package/dist/services/lspConfig.js +109 -0
  243. package/dist/services/lspConfig.js.map +7 -0
  244. package/dist/services/mcpClient.js +273 -34
  245. package/dist/services/mcpClient.js.map +2 -2
  246. package/dist/services/modelOrchestrator.js +310 -0
  247. package/dist/services/modelOrchestrator.js.map +7 -0
  248. package/dist/services/openai.js +8 -1
  249. package/dist/services/openai.js.map +2 -2
  250. package/dist/services/outputStyles.js +138 -0
  251. package/dist/services/outputStyles.js.map +7 -0
  252. package/dist/services/plugins/index.js +5 -0
  253. package/dist/services/plugins/index.js.map +7 -0
  254. package/dist/services/plugins/lspServers.js +188 -0
  255. package/dist/services/plugins/lspServers.js.map +7 -0
  256. package/dist/services/plugins/pluginRuntime.js +229 -0
  257. package/dist/services/plugins/pluginRuntime.js.map +7 -0
  258. package/dist/services/plugins/pluginValidation.js +219 -0
  259. package/dist/services/plugins/pluginValidation.js.map +7 -0
  260. package/dist/services/plugins/skillMarketplace.js +556 -0
  261. package/dist/services/plugins/skillMarketplace.js.map +7 -0
  262. package/dist/services/responseStateManager.js +37 -3
  263. package/dist/services/responseStateManager.js.map +2 -2
  264. package/dist/services/sandbox/filesystemBoundary.js +300 -0
  265. package/dist/services/sandbox/filesystemBoundary.js.map +7 -0
  266. package/dist/services/sandbox/index.js +14 -0
  267. package/dist/services/sandbox/index.js.map +7 -0
  268. package/dist/services/sandbox/networkProxy.js +293 -0
  269. package/dist/services/sandbox/networkProxy.js.map +7 -0
  270. package/dist/services/sandbox/sandboxController.js +574 -0
  271. package/dist/services/sandbox/sandboxController.js.map +7 -0
  272. package/dist/services/sandbox/types.js +50 -0
  273. package/dist/services/sandbox/types.js.map +7 -0
  274. package/dist/services/sessionMemory.js +266 -0
  275. package/dist/services/sessionMemory.js.map +7 -0
  276. package/dist/services/taskRouter.js +324 -0
  277. package/dist/services/taskRouter.js.map +7 -0
  278. package/dist/tools/ArchitectTool/ArchitectTool.js +7 -1
  279. package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
  280. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +3 -0
  281. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  282. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
  283. package/dist/tools/BaseTool.js +72 -0
  284. package/dist/tools/BaseTool.js.map +7 -0
  285. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
  286. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
  287. package/dist/tools/BashTool/BashTool.js +60 -3
  288. package/dist/tools/BashTool/BashTool.js.map +2 -2
  289. package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
  290. package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
  291. package/dist/tools/BashTool/OutputLine.js +54 -0
  292. package/dist/tools/BashTool/OutputLine.js.map +2 -2
  293. package/dist/tools/BashTool/prompt.js +192 -3
  294. package/dist/tools/BashTool/prompt.js.map +2 -2
  295. package/dist/tools/FileEditTool/FileEditTool.js +29 -4
  296. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  297. package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
  298. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  299. package/dist/tools/GlobTool/GlobTool.js +4 -2
  300. package/dist/tools/GlobTool/GlobTool.js.map +2 -2
  301. package/dist/tools/GrepTool/GrepTool.js +36 -7
  302. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  303. package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
  304. package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
  305. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
  306. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
  307. package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
  308. package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
  309. package/dist/tools/LspTool/LspTool.js +664 -0
  310. package/dist/tools/LspTool/LspTool.js.map +7 -0
  311. package/dist/tools/LspTool/prompt.js +27 -0
  312. package/dist/tools/LspTool/prompt.js.map +7 -0
  313. package/dist/tools/MCPTool/MCPTool.js +9 -1
  314. package/dist/tools/MCPTool/MCPTool.js.map +2 -2
  315. package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
  316. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
  317. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
  318. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
  319. package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
  320. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  321. package/dist/tools/NotebookEditTool/NotebookEditTool.js +5 -1
  322. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  323. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
  324. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +74 -0
  325. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
  326. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +108 -0
  327. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
  328. package/dist/tools/PlanModeTool/prompt.js +94 -0
  329. package/dist/tools/PlanModeTool/prompt.js.map +7 -0
  330. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
  331. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
  332. package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
  333. package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
  334. package/dist/tools/SkillTool/SkillTool.js +6 -1
  335. package/dist/tools/SkillTool/SkillTool.js.map +2 -2
  336. package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
  337. package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
  338. package/dist/tools/SlashCommandTool/prompt.js +35 -0
  339. package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
  340. package/dist/tools/TaskOutputTool/TaskOutputTool.js +189 -0
  341. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
  342. package/dist/tools/TaskOutputTool/prompt.js +15 -0
  343. package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
  344. package/dist/tools/TaskTool/TaskTool.js +302 -104
  345. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  346. package/dist/tools/TaskTool/prompt.js.map +2 -2
  347. package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -77
  348. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
  349. package/dist/tools/URLFetcherTool/URLFetcherTool.js +4 -1
  350. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
  351. package/dist/tools/URLFetcherTool/cache.js +55 -8
  352. package/dist/tools/URLFetcherTool/cache.js.map +2 -2
  353. package/dist/tools.js +31 -2
  354. package/dist/tools.js.map +2 -2
  355. package/dist/types/hooks.js +4 -0
  356. package/dist/types/hooks.js.map +2 -2
  357. package/dist/types/marketplace.js.map +2 -2
  358. package/dist/types/messageGroup.js +36 -0
  359. package/dist/types/messageGroup.js.map +7 -0
  360. package/dist/types/plugin.js.map +2 -2
  361. package/dist/types/thinking.js +1 -0
  362. package/dist/types/thinking.js.map +7 -0
  363. package/dist/utils/BackgroundShellManager.js +136 -39
  364. package/dist/utils/BackgroundShellManager.js.map +2 -2
  365. package/dist/utils/MessageBatchBuffer.js +102 -0
  366. package/dist/utils/MessageBatchBuffer.js.map +7 -0
  367. package/dist/utils/PersistentShell.js +151 -1
  368. package/dist/utils/PersistentShell.js.map +2 -2
  369. package/dist/utils/agentLoader.js +1 -23
  370. package/dist/utils/agentLoader.js.map +2 -2
  371. package/dist/utils/agentTranscripts.js +641 -0
  372. package/dist/utils/agentTranscripts.js.map +7 -0
  373. package/dist/utils/animationManager.js +213 -0
  374. package/dist/utils/animationManager.js.map +7 -0
  375. package/dist/utils/animationSync.js +110 -0
  376. package/dist/utils/animationSync.js.map +7 -0
  377. package/dist/utils/asyncFile.js +215 -0
  378. package/dist/utils/asyncFile.js.map +7 -0
  379. package/dist/utils/backgroundAgentManager.js +231 -0
  380. package/dist/utils/backgroundAgentManager.js.map +7 -0
  381. package/dist/utils/config.js +63 -7
  382. package/dist/utils/config.js.map +2 -2
  383. package/dist/utils/conversationRecovery.js +19 -0
  384. package/dist/utils/conversationRecovery.js.map +2 -2
  385. package/dist/utils/exit.js +73 -0
  386. package/dist/utils/exit.js.map +7 -0
  387. package/dist/utils/format.js +73 -5
  388. package/dist/utils/format.js.map +2 -2
  389. package/dist/utils/generators.js +76 -6
  390. package/dist/utils/generators.js.map +2 -2
  391. package/dist/utils/globalErrorHandler.js +149 -0
  392. package/dist/utils/globalErrorHandler.js.map +7 -0
  393. package/dist/utils/groupHandlers/index.js +8 -0
  394. package/dist/utils/groupHandlers/index.js.map +7 -0
  395. package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
  396. package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
  397. package/dist/utils/groupHandlers/taskHandler.js +104 -0
  398. package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
  399. package/dist/utils/groupHandlers/types.js +1 -0
  400. package/dist/utils/groupHandlers/types.js.map +7 -0
  401. package/dist/utils/logRotation.js +224 -0
  402. package/dist/utils/logRotation.js.map +7 -0
  403. package/dist/utils/marketplaceManager.js +3 -5
  404. package/dist/utils/marketplaceManager.js.map +2 -2
  405. package/dist/utils/memSafety.js +264 -0
  406. package/dist/utils/memSafety.js.map +7 -0
  407. package/dist/utils/messageGroupManager.js +274 -0
  408. package/dist/utils/messageGroupManager.js.map +7 -0
  409. package/dist/utils/messages.js +13 -4
  410. package/dist/utils/messages.js.map +2 -2
  411. package/dist/utils/model.js +119 -15
  412. package/dist/utils/model.js.map +3 -3
  413. package/dist/utils/permissions/filesystem.js +157 -5
  414. package/dist/utils/permissions/filesystem.js.map +2 -2
  415. package/dist/utils/plan/planMode.js +143 -0
  416. package/dist/utils/plan/planMode.js.map +7 -0
  417. package/dist/utils/pluginLoader.js +17 -21
  418. package/dist/utils/pluginLoader.js.map +2 -2
  419. package/dist/utils/ripgrep.js +55 -2
  420. package/dist/utils/ripgrep.js.map +2 -2
  421. package/dist/utils/sanitizeInput.js +32 -0
  422. package/dist/utils/sanitizeInput.js.map +7 -0
  423. package/dist/utils/secureKeyStorage.js +312 -0
  424. package/dist/utils/secureKeyStorage.js.map +7 -0
  425. package/dist/utils/session/sessionPlugins.js +67 -0
  426. package/dist/utils/session/sessionPlugins.js.map +7 -0
  427. package/dist/utils/taskDisplayUtils.js +257 -0
  428. package/dist/utils/taskDisplayUtils.js.map +7 -0
  429. package/dist/utils/teamConfig.js +2 -1
  430. package/dist/utils/teamConfig.js.map +2 -2
  431. package/dist/utils/todoStorage.js +92 -2
  432. package/dist/utils/todoStorage.js.map +2 -2
  433. package/dist/utils/toolTimeout.js +136 -0
  434. package/dist/utils/toolTimeout.js.map +7 -0
  435. package/dist/utils/tooling/safeRender.js +115 -0
  436. package/dist/utils/tooling/safeRender.js.map +7 -0
  437. package/dist/utils/userFriendlyError.js +346 -0
  438. package/dist/utils/userFriendlyError.js.map +7 -0
  439. package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
  440. package/dist/version.js +2 -2
  441. package/dist/version.js.map +1 -1
  442. package/package.json +14 -4
  443. package/scripts/postinstall.js +128 -38
  444. package/dist/commands/agents.js +0 -2086
  445. package/dist/commands/agents.js.map +0 -7
  446. package/dist/commands/build.js +0 -74
  447. package/dist/commands/build.js.map +0 -7
  448. package/dist/commands/compression.js +0 -57
  449. package/dist/commands/compression.js.map +0 -7
  450. package/dist/commands/listen.js +0 -37
  451. package/dist/commands/listen.js.map +0 -7
  452. package/dist/commands/login.js +0 -37
  453. package/dist/commands/login.js.map +0 -7
  454. package/dist/commands/logout.js +0 -33
  455. package/dist/commands/logout.js.map +0 -7
  456. package/dist/commands/mcp.js +0 -40
  457. package/dist/commands/mcp.js.map +0 -7
  458. package/dist/commands/mcp_refresh.js +0 -40
  459. package/dist/commands/mcp_refresh.js.map +0 -7
  460. package/dist/commands/modelstatus.js +0 -21
  461. package/dist/commands/modelstatus.js.map +0 -7
  462. package/dist/commands/onboarding.js +0 -36
  463. package/dist/commands/onboarding.js.map +0 -7
  464. package/dist/commands/plugin-interactive.js +0 -446
  465. package/dist/commands/plugin-interactive.js.map +0 -7
  466. package/dist/commands/pr_comments.js +0 -61
  467. package/dist/commands/pr_comments.js.map +0 -7
  468. package/dist/commands/release-notes.js +0 -30
  469. package/dist/commands/release-notes.js.map +0 -7
  470. package/dist/commands/review.js +0 -51
  471. package/dist/commands/review.js.map +0 -7
  472. package/dist/components/Bug.js +0 -147
  473. package/dist/components/Bug.js.map +0 -7
  474. package/dist/components/ModelSelector.js +0 -2062
  475. package/dist/components/ModelSelector.js.map +0 -7
  476. package/dist/components/ModelStatusDisplay.js +0 -87
  477. package/dist/components/ModelStatusDisplay.js.map +0 -7
  478. package/dist/entrypoints/cli-wrapper.js +0 -61
  479. package/dist/entrypoints/cli-wrapper.js.map +0 -7
  480. package/dist/screens/Doctor.js +0 -22
  481. package/dist/screens/Doctor.js.map +0 -7
@@ -0,0 +1,310 @@
1
+ import { randomUUID } from "crypto";
2
+ import { getModelManager } from "../utils/model.js";
3
+ import { queryModel as queryModelService } from "./claude.js";
4
+ function extractTextFromMessage(message) {
5
+ const content = message.message.content;
6
+ if (typeof content === "string") {
7
+ return content;
8
+ }
9
+ if (Array.isArray(content)) {
10
+ return content.filter(
11
+ (block) => block.type === "text"
12
+ ).map((block) => block.text).join("\n");
13
+ }
14
+ return "";
15
+ }
16
+ function createUserMessage(prompt) {
17
+ return {
18
+ message: { role: "user", content: prompt },
19
+ type: "user",
20
+ uuid: randomUUID()
21
+ };
22
+ }
23
+ class ModelOrchestrator {
24
+ modelManager = getModelManager();
25
+ /**
26
+ * Execute task with multi-model collaboration
27
+ */
28
+ async execute(task, config) {
29
+ const startTime = Date.now();
30
+ switch (config.mode) {
31
+ case "sequential":
32
+ return this.executeSequential(task, config, startTime);
33
+ case "parallel":
34
+ return this.executeParallel(task, config, startTime);
35
+ case "debate":
36
+ return this.executeDebate(task, config, startTime);
37
+ case "consensus":
38
+ return this.executeConsensus(task, config, startTime);
39
+ default:
40
+ throw new Error(`Unknown collaboration mode: ${config.mode}`);
41
+ }
42
+ }
43
+ /**
44
+ * Query a single model with a prompt
45
+ */
46
+ async querySingleModel(modelName, prompt) {
47
+ const startTime = Date.now();
48
+ try {
49
+ const profile = this.modelManager.resolveModel(modelName);
50
+ if (!profile) {
51
+ return {
52
+ model: modelName,
53
+ response: "",
54
+ success: false,
55
+ error: `Model not found: ${modelName}`,
56
+ latencyMs: Date.now() - startTime
57
+ };
58
+ }
59
+ const messages = [
60
+ createUserMessage(prompt)
61
+ ];
62
+ const response = await queryModelService("main", messages, [], void 0);
63
+ const responseText = extractTextFromMessage(response);
64
+ return {
65
+ model: modelName,
66
+ response: responseText,
67
+ success: true,
68
+ latencyMs: Date.now() - startTime
69
+ };
70
+ } catch (error) {
71
+ return {
72
+ model: modelName,
73
+ response: "",
74
+ success: false,
75
+ error: error instanceof Error ? error.message : String(error),
76
+ latencyMs: Date.now() - startTime
77
+ };
78
+ }
79
+ }
80
+ /**
81
+ * Sequential mode: Chain responses through models
82
+ * A → B → C (each model refines the previous output)
83
+ */
84
+ async executeSequential(task, config, startTime) {
85
+ const results = [];
86
+ let currentPrompt = task;
87
+ let finalResponse = "";
88
+ for (const modelName of config.models) {
89
+ const result = await this.querySingleModel(modelName, currentPrompt);
90
+ results.push(result);
91
+ if (!result.success) {
92
+ if (config.strategy?.fallback) {
93
+ const fallbackResult = await this.querySingleModel(
94
+ config.strategy.fallback,
95
+ currentPrompt
96
+ );
97
+ results.push(fallbackResult);
98
+ if (fallbackResult.success) {
99
+ currentPrompt = `Previous response: ${fallbackResult.response}
100
+
101
+ Please review and improve.`;
102
+ finalResponse = fallbackResult.response;
103
+ continue;
104
+ }
105
+ }
106
+ break;
107
+ }
108
+ currentPrompt = `Previous analysis:
109
+ ${result.response}
110
+
111
+ Please review and enhance this analysis.`;
112
+ finalResponse = result.response;
113
+ }
114
+ return {
115
+ mode: "sequential",
116
+ models: config.models,
117
+ finalResponse,
118
+ individualResults: results,
119
+ metadata: {
120
+ totalLatencyMs: Date.now() - startTime,
121
+ totalTokensUsed: this.sumTokens(results),
122
+ iterations: results.length
123
+ }
124
+ };
125
+ }
126
+ /**
127
+ * Parallel mode: Query all models simultaneously
128
+ * A + B + C (gather multiple perspectives)
129
+ */
130
+ async executeParallel(task, config, startTime) {
131
+ const results = await Promise.all(
132
+ config.models.map((model) => this.querySingleModel(model, task))
133
+ );
134
+ const successfulResults = results.filter((r) => r.success);
135
+ const finalResponse = this.mergeParallelResults(successfulResults);
136
+ return {
137
+ mode: "parallel",
138
+ models: config.models,
139
+ finalResponse,
140
+ individualResults: results,
141
+ metadata: {
142
+ totalLatencyMs: Date.now() - startTime,
143
+ totalTokensUsed: this.sumTokens(results)
144
+ }
145
+ };
146
+ }
147
+ /**
148
+ * Debate mode: Models review each other's work
149
+ * A proposes → B critiques → A refines
150
+ */
151
+ async executeDebate(task, config, startTime) {
152
+ const maxIterations = config.strategy?.maxIterations ?? 2;
153
+ const [modelA, modelB] = config.models;
154
+ if (!modelA || !modelB) {
155
+ throw new Error("Debate mode requires at least 2 models");
156
+ }
157
+ const results = [];
158
+ let currentProposal = "";
159
+ const proposalResult = await this.querySingleModel(modelA, task);
160
+ results.push(proposalResult);
161
+ if (!proposalResult.success) {
162
+ return {
163
+ mode: "debate",
164
+ models: config.models,
165
+ finalResponse: "",
166
+ individualResults: results,
167
+ metadata: {
168
+ totalLatencyMs: Date.now() - startTime,
169
+ iterations: 1
170
+ }
171
+ };
172
+ }
173
+ currentProposal = proposalResult.response;
174
+ for (let i = 0; i < maxIterations; i++) {
175
+ const critiquePrompt = `Review the following response and provide constructive feedback:
176
+
177
+ ${currentProposal}
178
+
179
+ Original task: ${task}`;
180
+ const critiqueResult = await this.querySingleModel(modelB, critiquePrompt);
181
+ results.push(critiqueResult);
182
+ if (!critiqueResult.success) break;
183
+ const refinePrompt = `Original task: ${task}
184
+
185
+ Your previous response:
186
+ ${currentProposal}
187
+
188
+ Feedback received:
189
+ ${critiqueResult.response}
190
+
191
+ Please improve your response addressing the feedback.`;
192
+ const refineResult = await this.querySingleModel(modelA, refinePrompt);
193
+ results.push(refineResult);
194
+ if (!refineResult.success) break;
195
+ currentProposal = refineResult.response;
196
+ }
197
+ return {
198
+ mode: "debate",
199
+ models: config.models,
200
+ finalResponse: currentProposal,
201
+ individualResults: results,
202
+ metadata: {
203
+ totalLatencyMs: Date.now() - startTime,
204
+ totalTokensUsed: this.sumTokens(results),
205
+ iterations: Math.ceil(results.length / 2)
206
+ }
207
+ };
208
+ }
209
+ /**
210
+ * Consensus mode: Models vote and merge best ideas
211
+ */
212
+ async executeConsensus(task, config, startTime) {
213
+ const results = await Promise.all(
214
+ config.models.map((model) => this.querySingleModel(model, task))
215
+ );
216
+ const successfulResults = results.filter((r) => r.success);
217
+ if (successfulResults.length === 0) {
218
+ return {
219
+ mode: "consensus",
220
+ models: config.models,
221
+ finalResponse: "",
222
+ individualResults: results,
223
+ metadata: {
224
+ totalLatencyMs: Date.now() - startTime,
225
+ consensusReached: false
226
+ }
227
+ };
228
+ }
229
+ const synthesisModel = config.models[0];
230
+ const responseSummary = successfulResults.map((r, i) => `Response ${i + 1} (${r.model}):
231
+ ${r.response}`).join("\n\n---\n\n");
232
+ const consensusPrompt = `You are tasked with finding the consensus among multiple AI responses.
233
+
234
+ Original task: ${task}
235
+
236
+ Here are the different responses:
237
+
238
+ ${responseSummary}
239
+
240
+ Please synthesize these responses into a single, comprehensive answer that:
241
+ 1. Identifies common themes and agreements
242
+ 2. Resolves any contradictions by choosing the most well-reasoned position
243
+ 3. Combines the best elements from each response
244
+ 4. Presents a unified, coherent answer
245
+
246
+ Synthesized response:`;
247
+ const consensusResult = await this.querySingleModel(
248
+ synthesisModel,
249
+ consensusPrompt
250
+ );
251
+ results.push(consensusResult);
252
+ return {
253
+ mode: "consensus",
254
+ models: config.models,
255
+ finalResponse: consensusResult.success ? consensusResult.response : successfulResults[0].response,
256
+ individualResults: results,
257
+ metadata: {
258
+ totalLatencyMs: Date.now() - startTime,
259
+ totalTokensUsed: this.sumTokens(results),
260
+ consensusReached: consensusResult.success
261
+ }
262
+ };
263
+ }
264
+ /**
265
+ * Merge parallel results into a combined response
266
+ */
267
+ mergeParallelResults(results) {
268
+ if (results.length === 0) return "";
269
+ if (results.length === 1) return results[0].response;
270
+ const formattedResponses = results.map((r, i) => `## Perspective ${i + 1} (${r.model})
271
+
272
+ ${r.response}`).join("\n\n---\n\n");
273
+ return `# Multi-Model Analysis
274
+
275
+ The following perspectives were gathered from ${results.length} different models:
276
+
277
+ ${formattedResponses}
278
+
279
+ ---
280
+
281
+ *Note: These are independent analyses. Consider synthesizing the best elements from each perspective.*`;
282
+ }
283
+ /**
284
+ * Sum token usage across results
285
+ */
286
+ sumTokens(results) {
287
+ const tokensUsed = results.filter((r) => r.tokenUsage).map((r) => (r.tokenUsage?.input || 0) + (r.tokenUsage?.output || 0));
288
+ return tokensUsed.length > 0 ? tokensUsed.reduce((a, b) => a + b, 0) : void 0;
289
+ }
290
+ }
291
+ let orchestratorInstance = null;
292
+ function getModelOrchestrator() {
293
+ if (!orchestratorInstance) {
294
+ orchestratorInstance = new ModelOrchestrator();
295
+ }
296
+ return orchestratorInstance;
297
+ }
298
+ function resetModelOrchestrator() {
299
+ orchestratorInstance = null;
300
+ }
301
+ async function orchestrate(task, config) {
302
+ return getModelOrchestrator().execute(task, config);
303
+ }
304
+ export {
305
+ ModelOrchestrator,
306
+ getModelOrchestrator,
307
+ orchestrate,
308
+ resetModelOrchestrator
309
+ };
310
+ //# sourceMappingURL=modelOrchestrator.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/services/modelOrchestrator.ts"],
4
+ "sourcesContent": ["/**\n * Model Orchestrator\n *\n * Enables multi-model collaboration with different modes:\n * - Sequential: Chain of thought through multiple models\n * - Parallel: Multiple perspectives from different models\n * - Debate: Adversarial review between models\n * - Consensus: Best of both through voting\n */\n\nimport { randomUUID } from 'crypto'\nimport { getModelManager } from '@utils/model'\nimport { queryModel as queryModelService } from './claude'\nimport type { AssistantMessage, UserMessage } from '@query'\n\n/**\n * Collaboration mode for multi-model tasks\n */\nexport type CollaborationMode =\n | 'sequential'\n | 'parallel'\n | 'debate'\n | 'consensus'\n\n/**\n * Model collaboration configuration\n */\nexport interface ModelCollaborationConfig {\n /** Collaboration mode */\n mode: CollaborationMode\n /** Models to use (by name or profile) */\n models: string[]\n /** Collaboration strategy */\n strategy?: {\n /** Task type to model mapping */\n taskRouting?: Record<string, string>\n /** Fallback model on failure */\n fallback?: string\n /** Consensus threshold (0-1) */\n voteThreshold?: number\n /** Maximum iterations for debate mode */\n maxIterations?: number\n }\n}\n\n/**\n * Result from a single model query\n */\nexport interface ModelQueryResult {\n model: string\n response: string\n success: boolean\n error?: string\n latencyMs: number\n tokenUsage?: {\n input: number\n output: number\n }\n}\n\n/**\n * Combined result from orchestrated query\n */\nexport interface OrchestratedResult {\n mode: CollaborationMode\n models: string[]\n finalResponse: string\n individualResults: ModelQueryResult[]\n metadata: {\n totalLatencyMs: number\n totalTokensUsed?: number\n iterations?: number\n consensusReached?: boolean\n }\n}\n\n/**\n * Extract text content from an AssistantMessage\n */\nfunction extractTextFromMessage(message: AssistantMessage): string {\n const content = message.message.content\n if (typeof content === 'string') {\n return content\n }\n if (Array.isArray(content)) {\n return content\n .filter(\n (block): block is { type: 'text'; text: string } =>\n block.type === 'text',\n )\n .map(block => block.text)\n .join('\\n')\n }\n return ''\n}\n\n/**\n * Create a user message for the query\n */\nfunction createUserMessage(prompt: string): UserMessage {\n return {\n message: { role: 'user', content: prompt },\n type: 'user',\n uuid: randomUUID(),\n }\n}\n\n/**\n * Model Orchestrator for multi-model collaboration\n */\nexport class ModelOrchestrator {\n private modelManager = getModelManager()\n\n /**\n * Execute task with multi-model collaboration\n */\n async execute(\n task: string,\n config: ModelCollaborationConfig,\n ): Promise<OrchestratedResult> {\n const startTime = Date.now()\n\n switch (config.mode) {\n case 'sequential':\n return this.executeSequential(task, config, startTime)\n case 'parallel':\n return this.executeParallel(task, config, startTime)\n case 'debate':\n return this.executeDebate(task, config, startTime)\n case 'consensus':\n return this.executeConsensus(task, config, startTime)\n default:\n throw new Error(`Unknown collaboration mode: ${config.mode}`)\n }\n }\n\n /**\n * Query a single model with a prompt\n */\n private async querySingleModel(\n modelName: string,\n prompt: string,\n ): Promise<ModelQueryResult> {\n const startTime = Date.now()\n\n try {\n const profile = this.modelManager.resolveModel(modelName)\n if (!profile) {\n return {\n model: modelName,\n response: '',\n success: false,\n error: `Model not found: ${modelName}`,\n latencyMs: Date.now() - startTime,\n }\n }\n\n // Create messages array for the query\n const messages: (UserMessage | AssistantMessage)[] = [\n createUserMessage(prompt),\n ]\n\n // Query using 'main' pointer - the actual model is determined by config\n // For orchestration, we use the main model pointer\n const response = await queryModelService('main', messages, [], undefined)\n const responseText = extractTextFromMessage(response)\n\n return {\n model: modelName,\n response: responseText,\n success: true,\n latencyMs: Date.now() - startTime,\n }\n } catch (error) {\n return {\n model: modelName,\n response: '',\n success: false,\n error: error instanceof Error ? error.message : String(error),\n latencyMs: Date.now() - startTime,\n }\n }\n }\n\n /**\n * Sequential mode: Chain responses through models\n * A \u2192 B \u2192 C (each model refines the previous output)\n */\n private async executeSequential(\n task: string,\n config: ModelCollaborationConfig,\n startTime: number,\n ): Promise<OrchestratedResult> {\n const results: ModelQueryResult[] = []\n let currentPrompt = task\n let finalResponse = ''\n\n for (const modelName of config.models) {\n const result = await this.querySingleModel(modelName, currentPrompt)\n results.push(result)\n\n if (!result.success) {\n // Try fallback if available\n if (config.strategy?.fallback) {\n const fallbackResult = await this.querySingleModel(\n config.strategy.fallback,\n currentPrompt,\n )\n results.push(fallbackResult)\n if (fallbackResult.success) {\n currentPrompt = `Previous response: ${fallbackResult.response}\\n\\nPlease review and improve.`\n finalResponse = fallbackResult.response\n continue\n }\n }\n break\n }\n\n // Use this response as context for next model\n currentPrompt = `Previous analysis:\\n${result.response}\\n\\nPlease review and enhance this analysis.`\n finalResponse = result.response\n }\n\n return {\n mode: 'sequential',\n models: config.models,\n finalResponse,\n individualResults: results,\n metadata: {\n totalLatencyMs: Date.now() - startTime,\n totalTokensUsed: this.sumTokens(results),\n iterations: results.length,\n },\n }\n }\n\n /**\n * Parallel mode: Query all models simultaneously\n * A + B + C (gather multiple perspectives)\n */\n private async executeParallel(\n task: string,\n config: ModelCollaborationConfig,\n startTime: number,\n ): Promise<OrchestratedResult> {\n const results = await Promise.all(\n config.models.map(model => this.querySingleModel(model, task)),\n )\n\n const successfulResults = results.filter(r => r.success)\n const finalResponse = this.mergeParallelResults(successfulResults)\n\n return {\n mode: 'parallel',\n models: config.models,\n finalResponse,\n individualResults: results,\n metadata: {\n totalLatencyMs: Date.now() - startTime,\n totalTokensUsed: this.sumTokens(results),\n },\n }\n }\n\n /**\n * Debate mode: Models review each other's work\n * A proposes \u2192 B critiques \u2192 A refines\n */\n private async executeDebate(\n task: string,\n config: ModelCollaborationConfig,\n startTime: number,\n ): Promise<OrchestratedResult> {\n const maxIterations = config.strategy?.maxIterations ?? 2\n const [modelA, modelB] = config.models\n\n if (!modelA || !modelB) {\n throw new Error('Debate mode requires at least 2 models')\n }\n\n const results: ModelQueryResult[] = []\n let currentProposal = ''\n\n // Initial proposal from Model A\n const proposalResult = await this.querySingleModel(modelA, task)\n results.push(proposalResult)\n\n if (!proposalResult.success) {\n return {\n mode: 'debate',\n models: config.models,\n finalResponse: '',\n individualResults: results,\n metadata: {\n totalLatencyMs: Date.now() - startTime,\n iterations: 1,\n },\n }\n }\n\n currentProposal = proposalResult.response\n\n // Debate iterations\n for (let i = 0; i < maxIterations; i++) {\n // Model B critiques\n const critiquePrompt = `Review the following response and provide constructive feedback:\\n\\n${currentProposal}\\n\\nOriginal task: ${task}`\n const critiqueResult = await this.querySingleModel(modelB, critiquePrompt)\n results.push(critiqueResult)\n\n if (!critiqueResult.success) break\n\n // Model A refines based on critique\n const refinePrompt = `Original task: ${task}\\n\\nYour previous response:\\n${currentProposal}\\n\\nFeedback received:\\n${critiqueResult.response}\\n\\nPlease improve your response addressing the feedback.`\n const refineResult = await this.querySingleModel(modelA, refinePrompt)\n results.push(refineResult)\n\n if (!refineResult.success) break\n\n currentProposal = refineResult.response\n }\n\n return {\n mode: 'debate',\n models: config.models,\n finalResponse: currentProposal,\n individualResults: results,\n metadata: {\n totalLatencyMs: Date.now() - startTime,\n totalTokensUsed: this.sumTokens(results),\n iterations: Math.ceil(results.length / 2),\n },\n }\n }\n\n /**\n * Consensus mode: Models vote and merge best ideas\n */\n private async executeConsensus(\n task: string,\n config: ModelCollaborationConfig,\n startTime: number,\n ): Promise<OrchestratedResult> {\n // Get responses from all models\n const results = await Promise.all(\n config.models.map(model => this.querySingleModel(model, task)),\n )\n\n const successfulResults = results.filter(r => r.success)\n\n if (successfulResults.length === 0) {\n return {\n mode: 'consensus',\n models: config.models,\n finalResponse: '',\n individualResults: results,\n metadata: {\n totalLatencyMs: Date.now() - startTime,\n consensusReached: false,\n },\n }\n }\n\n // Use a model to synthesize and find consensus\n const synthesisModel = config.models[0]!\n const responseSummary = successfulResults\n .map((r, i) => `Response ${i + 1} (${r.model}):\\n${r.response}`)\n .join('\\n\\n---\\n\\n')\n\n const consensusPrompt = `You are tasked with finding the consensus among multiple AI responses.\n\nOriginal task: ${task}\n\nHere are the different responses:\n\n${responseSummary}\n\nPlease synthesize these responses into a single, comprehensive answer that:\n1. Identifies common themes and agreements\n2. Resolves any contradictions by choosing the most well-reasoned position\n3. Combines the best elements from each response\n4. Presents a unified, coherent answer\n\nSynthesized response:`\n\n const consensusResult = await this.querySingleModel(\n synthesisModel,\n consensusPrompt,\n )\n results.push(consensusResult)\n\n return {\n mode: 'consensus',\n models: config.models,\n finalResponse: consensusResult.success\n ? consensusResult.response\n : successfulResults[0]!.response,\n individualResults: results,\n metadata: {\n totalLatencyMs: Date.now() - startTime,\n totalTokensUsed: this.sumTokens(results),\n consensusReached: consensusResult.success,\n },\n }\n }\n\n /**\n * Merge parallel results into a combined response\n */\n private mergeParallelResults(results: ModelQueryResult[]): string {\n if (results.length === 0) return ''\n if (results.length === 1) return results[0]!.response\n\n // Format all responses for presentation\n const formattedResponses = results\n .map((r, i) => `## Perspective ${i + 1} (${r.model})\\n\\n${r.response}`)\n .join('\\n\\n---\\n\\n')\n\n return `# Multi-Model Analysis\n\nThe following perspectives were gathered from ${results.length} different models:\n\n${formattedResponses}\n\n---\n\n*Note: These are independent analyses. Consider synthesizing the best elements from each perspective.*`\n }\n\n /**\n * Sum token usage across results\n */\n private sumTokens(results: ModelQueryResult[]): number | undefined {\n const tokensUsed = results\n .filter(r => r.tokenUsage)\n .map(r => (r.tokenUsage?.input || 0) + (r.tokenUsage?.output || 0))\n\n return tokensUsed.length > 0\n ? tokensUsed.reduce((a, b) => a + b, 0)\n : undefined\n }\n}\n\n// Singleton instance\nlet orchestratorInstance: ModelOrchestrator | null = null\n\n/**\n * Get the model orchestrator instance\n */\nexport function getModelOrchestrator(): ModelOrchestrator {\n if (!orchestratorInstance) {\n orchestratorInstance = new ModelOrchestrator()\n }\n return orchestratorInstance\n}\n\n/**\n * Reset the orchestrator instance (useful for testing)\n */\nexport function resetModelOrchestrator(): void {\n orchestratorInstance = null\n}\n\n/**\n * Execute a multi-model collaboration task\n */\nexport async function orchestrate(\n task: string,\n config: ModelCollaborationConfig,\n): Promise<OrchestratedResult> {\n return getModelOrchestrator().execute(task, config)\n}\n"],
5
+ "mappings": "AAUA,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,cAAc,yBAAyB;AAmEhD,SAAS,uBAAuB,SAAmC;AACjE,QAAM,UAAU,QAAQ,QAAQ;AAChC,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,WAAO,QACJ;AAAA,MACC,CAAC,UACC,MAAM,SAAS;AAAA,IACnB,EACC,IAAI,WAAS,MAAM,IAAI,EACvB,KAAK,IAAI;AAAA,EACd;AACA,SAAO;AACT;AAKA,SAAS,kBAAkB,QAA6B;AACtD,SAAO;AAAA,IACL,SAAS,EAAE,MAAM,QAAQ,SAAS,OAAO;AAAA,IACzC,MAAM;AAAA,IACN,MAAM,WAAW;AAAA,EACnB;AACF;AAKO,MAAM,kBAAkB;AAAA,EACrB,eAAe,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAKvC,MAAM,QACJ,MACA,QAC6B;AAC7B,UAAM,YAAY,KAAK,IAAI;AAE3B,YAAQ,OAAO,MAAM;AAAA,MACnB,KAAK;AACH,eAAO,KAAK,kBAAkB,MAAM,QAAQ,SAAS;AAAA,MACvD,KAAK;AACH,eAAO,KAAK,gBAAgB,MAAM,QAAQ,SAAS;AAAA,MACrD,KAAK;AACH,eAAO,KAAK,cAAc,MAAM,QAAQ,SAAS;AAAA,MACnD,KAAK;AACH,eAAO,KAAK,iBAAiB,MAAM,QAAQ,SAAS;AAAA,MACtD;AACE,cAAM,IAAI,MAAM,+BAA+B,OAAO,IAAI,EAAE;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBACZ,WACA,QAC2B;AAC3B,UAAM,YAAY,KAAK,IAAI;AAE3B,QAAI;AACF,YAAM,UAAU,KAAK,aAAa,aAAa,SAAS;AACxD,UAAI,CAAC,SAAS;AACZ,eAAO;AAAA,UACL,OAAO;AAAA,UACP,UAAU;AAAA,UACV,SAAS;AAAA,UACT,OAAO,oBAAoB,SAAS;AAAA,UACpC,WAAW,KAAK,IAAI,IAAI;AAAA,QAC1B;AAAA,MACF;AAGA,YAAM,WAA+C;AAAA,QACnD,kBAAkB,MAAM;AAAA,MAC1B;AAIA,YAAM,WAAW,MAAM,kBAAkB,QAAQ,UAAU,CAAC,GAAG,MAAS;AACxE,YAAM,eAAe,uBAAuB,QAAQ;AAEpD,aAAO;AAAA,QACL,OAAO;AAAA,QACP,UAAU;AAAA,QACV,SAAS;AAAA,QACT,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,OAAO;AAAA,QACP,UAAU;AAAA,QACV,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC5D,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,kBACZ,MACA,QACA,WAC6B;AAC7B,UAAM,UAA8B,CAAC;AACrC,QAAI,gBAAgB;AACpB,QAAI,gBAAgB;AAEpB,eAAW,aAAa,OAAO,QAAQ;AACrC,YAAM,SAAS,MAAM,KAAK,iBAAiB,WAAW,aAAa;AACnE,cAAQ,KAAK,MAAM;AAEnB,UAAI,CAAC,OAAO,SAAS;AAEnB,YAAI,OAAO,UAAU,UAAU;AAC7B,gBAAM,iBAAiB,MAAM,KAAK;AAAA,YAChC,OAAO,SAAS;AAAA,YAChB;AAAA,UACF;AACA,kBAAQ,KAAK,cAAc;AAC3B,cAAI,eAAe,SAAS;AAC1B,4BAAgB,sBAAsB,eAAe,QAAQ;AAAA;AAAA;AAC7D,4BAAgB,eAAe;AAC/B;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF;AAGA,sBAAgB;AAAA,EAAuB,OAAO,QAAQ;AAAA;AAAA;AACtD,sBAAgB,OAAO;AAAA,IACzB;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,OAAO;AAAA,MACf;AAAA,MACA,mBAAmB;AAAA,MACnB,UAAU;AAAA,QACR,gBAAgB,KAAK,IAAI,IAAI;AAAA,QAC7B,iBAAiB,KAAK,UAAU,OAAO;AAAA,QACvC,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,gBACZ,MACA,QACA,WAC6B;AAC7B,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC5B,OAAO,OAAO,IAAI,WAAS,KAAK,iBAAiB,OAAO,IAAI,CAAC;AAAA,IAC/D;AAEA,UAAM,oBAAoB,QAAQ,OAAO,OAAK,EAAE,OAAO;AACvD,UAAM,gBAAgB,KAAK,qBAAqB,iBAAiB;AAEjE,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,OAAO;AAAA,MACf;AAAA,MACA,mBAAmB;AAAA,MACnB,UAAU;AAAA,QACR,gBAAgB,KAAK,IAAI,IAAI;AAAA,QAC7B,iBAAiB,KAAK,UAAU,OAAO;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,cACZ,MACA,QACA,WAC6B;AAC7B,UAAM,gBAAgB,OAAO,UAAU,iBAAiB;AACxD,UAAM,CAAC,QAAQ,MAAM,IAAI,OAAO;AAEhC,QAAI,CAAC,UAAU,CAAC,QAAQ;AACtB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AAEA,UAAM,UAA8B,CAAC;AACrC,QAAI,kBAAkB;AAGtB,UAAM,iBAAiB,MAAM,KAAK,iBAAiB,QAAQ,IAAI;AAC/D,YAAQ,KAAK,cAAc;AAE3B,QAAI,CAAC,eAAe,SAAS;AAC3B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,OAAO;AAAA,QACf,eAAe;AAAA,QACf,mBAAmB;AAAA,QACnB,UAAU;AAAA,UACR,gBAAgB,KAAK,IAAI,IAAI;AAAA,UAC7B,YAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAEA,sBAAkB,eAAe;AAGjC,aAAS,IAAI,GAAG,IAAI,eAAe,KAAK;AAEtC,YAAM,iBAAiB;AAAA;AAAA,EAAuE,eAAe;AAAA;AAAA,iBAAsB,IAAI;AACvI,YAAM,iBAAiB,MAAM,KAAK,iBAAiB,QAAQ,cAAc;AACzE,cAAQ,KAAK,cAAc;AAE3B,UAAI,CAAC,eAAe,QAAS;AAG7B,YAAM,eAAe,kBAAkB,IAAI;AAAA;AAAA;AAAA,EAAgC,eAAe;AAAA;AAAA;AAAA,EAA2B,eAAe,QAAQ;AAAA;AAAA;AAC5I,YAAM,eAAe,MAAM,KAAK,iBAAiB,QAAQ,YAAY;AACrE,cAAQ,KAAK,YAAY;AAEzB,UAAI,CAAC,aAAa,QAAS;AAE3B,wBAAkB,aAAa;AAAA,IACjC;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,OAAO;AAAA,MACf,eAAe;AAAA,MACf,mBAAmB;AAAA,MACnB,UAAU;AAAA,QACR,gBAAgB,KAAK,IAAI,IAAI;AAAA,QAC7B,iBAAiB,KAAK,UAAU,OAAO;AAAA,QACvC,YAAY,KAAK,KAAK,QAAQ,SAAS,CAAC;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBACZ,MACA,QACA,WAC6B;AAE7B,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC5B,OAAO,OAAO,IAAI,WAAS,KAAK,iBAAiB,OAAO,IAAI,CAAC;AAAA,IAC/D;AAEA,UAAM,oBAAoB,QAAQ,OAAO,OAAK,EAAE,OAAO;AAEvD,QAAI,kBAAkB,WAAW,GAAG;AAClC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,OAAO;AAAA,QACf,eAAe;AAAA,QACf,mBAAmB;AAAA,QACnB,UAAU;AAAA,UACR,gBAAgB,KAAK,IAAI,IAAI;AAAA,UAC7B,kBAAkB;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAGA,UAAM,iBAAiB,OAAO,OAAO,CAAC;AACtC,UAAM,kBAAkB,kBACrB,IAAI,CAAC,GAAG,MAAM,YAAY,IAAI,CAAC,KAAK,EAAE,KAAK;AAAA,EAAO,EAAE,QAAQ,EAAE,EAC9D,KAAK,aAAa;AAErB,UAAM,kBAAkB;AAAA;AAAA,iBAEX,IAAI;AAAA;AAAA;AAAA;AAAA,EAInB,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUb,UAAM,kBAAkB,MAAM,KAAK;AAAA,MACjC;AAAA,MACA;AAAA,IACF;AACA,YAAQ,KAAK,eAAe;AAE5B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,OAAO;AAAA,MACf,eAAe,gBAAgB,UAC3B,gBAAgB,WAChB,kBAAkB,CAAC,EAAG;AAAA,MAC1B,mBAAmB;AAAA,MACnB,UAAU;AAAA,QACR,gBAAgB,KAAK,IAAI,IAAI;AAAA,QAC7B,iBAAiB,KAAK,UAAU,OAAO;AAAA,QACvC,kBAAkB,gBAAgB;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,SAAqC;AAChE,QAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,QAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,CAAC,EAAG;AAG7C,UAAM,qBAAqB,QACxB,IAAI,CAAC,GAAG,MAAM,kBAAkB,IAAI,CAAC,KAAK,EAAE,KAAK;AAAA;AAAA,EAAQ,EAAE,QAAQ,EAAE,EACrE,KAAK,aAAa;AAErB,WAAO;AAAA;AAAA,gDAEqC,QAAQ,MAAM;AAAA;AAAA,EAE5D,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKlB;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,SAAiD;AACjE,UAAM,aAAa,QAChB,OAAO,OAAK,EAAE,UAAU,EACxB,IAAI,QAAM,EAAE,YAAY,SAAS,MAAM,EAAE,YAAY,UAAU,EAAE;AAEpE,WAAO,WAAW,SAAS,IACvB,WAAW,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IACpC;AAAA,EACN;AACF;AAGA,IAAI,uBAAiD;AAK9C,SAAS,uBAA0C;AACxD,MAAI,CAAC,sBAAsB;AACzB,2BAAuB,IAAI,kBAAkB;AAAA,EAC/C;AACA,SAAO;AACT;AAKO,SAAS,yBAA+B;AAC7C,yBAAuB;AACzB;AAKA,eAAsB,YACpB,MACA,QAC6B;AAC7B,SAAO,qBAAqB,EAAE,QAAQ,MAAM,MAAM;AACpD;",
6
+ "names": []
7
+ }
@@ -8,6 +8,9 @@ import {
8
8
  } from "../utils/debugLogger.js";
9
9
  import { logError } from "../utils/log.js";
10
10
  import { abortableDelay, DEFAULT_RETRY_CONFIG } from "../utils/async.js";
11
+ import {
12
+ UserFriendlyError
13
+ } from "../utils/userFriendlyError.js";
11
14
  const RETRY_CONFIG = {
12
15
  ...DEFAULT_RETRY_CONFIG
13
16
  };
@@ -638,7 +641,11 @@ async function getCompletionWithProfile(modelProfile, opts, attempt = 0, maxAtte
638
641
  // 🔧 Pass AbortSignal to recursive call
639
642
  );
640
643
  }
641
- throw error;
644
+ throw new UserFriendlyError(error, {
645
+ operation: "API request",
646
+ model: opts.model,
647
+ endpoint: modelProfile.baseURL
648
+ });
642
649
  }
643
650
  }
644
651
  function createStreamProcessor(stream, signal) {