@within-7/minto 0.3.9 → 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 (383) hide show
  1. package/dist/Tool.js.map +2 -2
  2. package/dist/commands/agents/AgentsCommand.js +461 -657
  3. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  4. package/dist/commands/agents/types.js +1 -0
  5. package/dist/commands/agents/types.js.map +2 -2
  6. package/dist/commands/agents/utils/fileOperations.js +96 -36
  7. package/dist/commands/agents/utils/fileOperations.js.map +3 -3
  8. package/dist/commands/agents/utils/index.js +3 -1
  9. package/dist/commands/agents/utils/index.js.map +2 -2
  10. package/dist/commands/context.js +54 -23
  11. package/dist/commands/context.js.map +2 -2
  12. package/dist/commands/ctx_viz.js +1 -1
  13. package/dist/commands/effort.js +87 -0
  14. package/dist/commands/effort.js.map +7 -0
  15. package/dist/commands/export.js +684 -94
  16. package/dist/commands/export.js.map +2 -2
  17. package/dist/commands/ide.js +18 -0
  18. package/dist/commands/ide.js.map +7 -0
  19. package/dist/commands/language.js +19 -46
  20. package/dist/commands/language.js.map +2 -2
  21. package/dist/commands/mcp-interactive.js +425 -217
  22. package/dist/commands/mcp-interactive.js.map +2 -2
  23. package/dist/commands/memory.js +168 -0
  24. package/dist/commands/memory.js.map +7 -0
  25. package/dist/commands/model.js +457 -65
  26. package/dist/commands/model.js.map +2 -2
  27. package/dist/commands/outputStyle.js +64 -0
  28. package/dist/commands/outputStyle.js.map +7 -0
  29. package/dist/commands/permissions.js +75 -49
  30. package/dist/commands/permissions.js.map +2 -2
  31. package/dist/commands/plugin/utils.js +33 -1
  32. package/dist/commands/plugin/utils.js.map +2 -2
  33. package/dist/commands/plugin.js +891 -185
  34. package/dist/commands/plugin.js.map +3 -3
  35. package/dist/commands/refreshCommands.js +2 -0
  36. package/dist/commands/refreshCommands.js.map +2 -2
  37. package/dist/commands/resume.js +1 -1
  38. package/dist/commands/resume.js.map +1 -1
  39. package/dist/commands/review.js +51 -0
  40. package/dist/commands/review.js.map +7 -0
  41. package/dist/commands/sandbox.js +168 -70
  42. package/dist/commands/sandbox.js.map +2 -2
  43. package/dist/commands/setup.js +593 -107
  44. package/dist/commands/setup.js.map +2 -2
  45. package/dist/commands/stats.js +188 -131
  46. package/dist/commands/stats.js.map +2 -2
  47. package/dist/commands/status.js +75 -13
  48. package/dist/commands/status.js.map +2 -2
  49. package/dist/commands/terminalSetup.js +6 -0
  50. package/dist/commands/terminalSetup.js.map +2 -2
  51. package/dist/commands/undo.js +146 -174
  52. package/dist/commands/undo.js.map +2 -2
  53. package/dist/commands/vim.js +22 -0
  54. package/dist/commands/vim.js.map +7 -0
  55. package/dist/commands.js +12 -0
  56. package/dist/commands.js.map +2 -2
  57. package/dist/components/Help.js +165 -32
  58. package/dist/components/Help.js.map +2 -2
  59. package/dist/components/HighlightedCode.js +1 -0
  60. package/dist/components/HighlightedCode.js.map +2 -2
  61. package/dist/components/InfoPanel/InfoPanel.js +123 -0
  62. package/dist/components/InfoPanel/InfoPanel.js.map +7 -0
  63. package/dist/components/InfoPanel/index.js +5 -0
  64. package/dist/components/InfoPanel/index.js.map +7 -0
  65. package/dist/components/InfoPanel/types.js +1 -0
  66. package/dist/components/InfoPanel/types.js.map +7 -0
  67. package/dist/components/ModelSelector/BrandTextInput.js +43 -0
  68. package/dist/components/ModelSelector/BrandTextInput.js.map +7 -0
  69. package/dist/components/ModelSelector/ModelSelector.js +590 -565
  70. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  71. package/dist/components/ModelSelector/WizardContainer.js +45 -0
  72. package/dist/components/ModelSelector/WizardContainer.js.map +7 -0
  73. package/dist/components/ModelSelector/index.js +1 -3
  74. package/dist/components/ModelSelector/index.js.map +2 -2
  75. package/dist/components/PromptInput.js +26 -11
  76. package/dist/components/PromptInput.js.map +2 -2
  77. package/dist/components/PulseLabel.js +44 -0
  78. package/dist/components/PulseLabel.js.map +7 -0
  79. package/dist/components/RequestStatusIndicator.js +1 -1
  80. package/dist/components/RequestStatusIndicator.js.map +1 -1
  81. package/dist/components/SimpleSelector/SimpleSelector.js +154 -0
  82. package/dist/components/SimpleSelector/SimpleSelector.js.map +7 -0
  83. package/dist/components/SimpleSelector/index.js +5 -0
  84. package/dist/components/SimpleSelector/index.js.map +7 -0
  85. package/dist/components/SimpleSelector/types.js +1 -0
  86. package/dist/components/SimpleSelector/types.js.map +7 -0
  87. package/dist/components/Spinner.js +12 -42
  88. package/dist/components/Spinner.js.map +3 -3
  89. package/dist/components/StartupStatus.js +57 -0
  90. package/dist/components/StartupStatus.js.map +7 -0
  91. package/dist/components/StatusOverlayContent.js +21 -0
  92. package/dist/components/StatusOverlayContent.js.map +7 -0
  93. package/dist/components/SubagentBlock.js +43 -6
  94. package/dist/components/SubagentBlock.js.map +2 -2
  95. package/dist/components/TabbedListView/ScrollableList.js +31 -5
  96. package/dist/components/TabbedListView/ScrollableList.js.map +2 -2
  97. package/dist/components/TabbedListView/TabBar.js +13 -8
  98. package/dist/components/TabbedListView/TabBar.js.map +2 -2
  99. package/dist/components/TabbedListView/TabbedListView.js +123 -48
  100. package/dist/components/TabbedListView/TabbedListView.js.map +2 -2
  101. package/dist/components/TodoPanel.js +1 -1
  102. package/dist/components/TodoPanel.js.map +1 -1
  103. package/dist/components/ToolUseLoader.js +5 -0
  104. package/dist/components/ToolUseLoader.js.map +2 -2
  105. package/dist/components/TrustDialog.js +0 -2
  106. package/dist/components/TrustDialog.js.map +2 -2
  107. package/dist/components/messages/TaskInModuleView.js +1 -1
  108. package/dist/components/messages/TaskInModuleView.js.map +2 -2
  109. package/dist/components/messages/TaskToolMessage.js +1 -1
  110. package/dist/components/messages/TaskToolMessage.js.map +2 -2
  111. package/dist/components/messages/UserPromptMessage.js +6 -1
  112. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  113. package/dist/constants/modelCapabilities.js +103 -18
  114. package/dist/constants/modelCapabilities.js.map +2 -2
  115. package/dist/constants/product.js +2 -0
  116. package/dist/constants/product.js.map +2 -2
  117. package/dist/constants/prompts/agentPrompt.js +30 -0
  118. package/dist/constants/prompts/agentPrompt.js.map +7 -0
  119. package/dist/constants/prompts/codeConventions.js +27 -0
  120. package/dist/constants/prompts/codeConventions.js.map +7 -0
  121. package/dist/constants/prompts/doingTasks.js +15 -0
  122. package/dist/constants/prompts/doingTasks.js.map +7 -0
  123. package/dist/constants/prompts/envInfo.js +17 -0
  124. package/dist/constants/prompts/envInfo.js.map +7 -0
  125. package/dist/constants/prompts/executingWithCare.js +17 -0
  126. package/dist/constants/prompts/executingWithCare.js.map +7 -0
  127. package/dist/constants/prompts/identity.js +10 -0
  128. package/dist/constants/prompts/identity.js.map +7 -0
  129. package/dist/constants/prompts/index.js +78 -0
  130. package/dist/constants/prompts/index.js.map +7 -0
  131. package/dist/constants/prompts/taskManagement.js +60 -0
  132. package/dist/constants/prompts/taskManagement.js.map +7 -0
  133. package/dist/constants/prompts/toneAndStyle.js +62 -0
  134. package/dist/constants/prompts/toneAndStyle.js.map +7 -0
  135. package/dist/constants/prompts/toolUsagePolicy.js +38 -0
  136. package/dist/constants/prompts/toolUsagePolicy.js.map +7 -0
  137. package/dist/constants/prompts.js +5 -176
  138. package/dist/constants/prompts.js.map +2 -2
  139. package/dist/constants/providerRegistry.js +235 -0
  140. package/dist/constants/providerRegistry.js.map +7 -0
  141. package/dist/constants/providers.js +35 -0
  142. package/dist/constants/providers.js.map +7 -0
  143. package/dist/context/PermissionContext.js +0 -1
  144. package/dist/context/PermissionContext.js.map +2 -2
  145. package/dist/context.js +87 -31
  146. package/dist/context.js.map +2 -2
  147. package/dist/core/backupHook.js +29 -0
  148. package/dist/core/backupHook.js.map +7 -0
  149. package/dist/core/config/defaults.js +11 -2
  150. package/dist/core/config/defaults.js.map +2 -2
  151. package/dist/core/config/schema.js +21 -3
  152. package/dist/core/config/schema.js.map +2 -2
  153. package/dist/core/costTracker.js +18 -16
  154. package/dist/core/costTracker.js.map +2 -2
  155. package/dist/core/index.js +0 -1
  156. package/dist/core/index.js.map +2 -2
  157. package/dist/core/tokenStatsManager.js +22 -4
  158. package/dist/core/tokenStatsManager.js.map +2 -2
  159. package/dist/cost-tracker.js +0 -16
  160. package/dist/cost-tracker.js.map +2 -2
  161. package/dist/entrypoints/bootstrap.js +3 -1
  162. package/dist/entrypoints/bootstrap.js.map +2 -2
  163. package/dist/entrypoints/cli.js +81 -68
  164. package/dist/entrypoints/cli.js.map +2 -2
  165. package/dist/hooks/useAgentTokenStats.js +1 -1
  166. package/dist/hooks/useAgentTokenStats.js.map +2 -2
  167. package/dist/hooks/useAgentTranscripts.js +2 -1
  168. package/dist/hooks/useAgentTranscripts.js.map +2 -2
  169. package/dist/hooks/useBackgroundShells.js +29 -0
  170. package/dist/hooks/useBackgroundShells.js.map +7 -0
  171. package/dist/hooks/useCanUseTool.js +1 -1
  172. package/dist/hooks/useCanUseTool.js.map +2 -2
  173. package/dist/hooks/useDeferredLoading.js +64 -0
  174. package/dist/hooks/useDeferredLoading.js.map +7 -0
  175. package/dist/hooks/useHookStatus.js +1 -1
  176. package/dist/hooks/useHookStatus.js.map +2 -2
  177. package/dist/hooks/useSessionTracking.js +55 -0
  178. package/dist/hooks/useSessionTracking.js.map +7 -0
  179. package/dist/hooks/useTerminalSize.js +21 -0
  180. package/dist/hooks/useTerminalSize.js.map +2 -2
  181. package/dist/hooks/useTextInput.js +1 -0
  182. package/dist/hooks/useTextInput.js.map +2 -2
  183. package/dist/hooks/useUnifiedCompletion.js +3 -2
  184. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  185. package/dist/i18n/locales/en.js +299 -1
  186. package/dist/i18n/locales/en.js.map +2 -2
  187. package/dist/i18n/locales/zh-CN.js +300 -2
  188. package/dist/i18n/locales/zh-CN.js.map +2 -2
  189. package/dist/i18n/types.js.map +1 -1
  190. package/dist/messages.js +41 -17
  191. package/dist/messages.js.map +2 -2
  192. package/dist/permissions.js +94 -1
  193. package/dist/permissions.js.map +2 -2
  194. package/dist/query.js +27 -19
  195. package/dist/query.js.map +2 -2
  196. package/dist/screens/REPL.js +83 -74
  197. package/dist/screens/REPL.js.map +2 -2
  198. package/dist/services/adapters/responsesAPI.js +6 -0
  199. package/dist/services/adapters/responsesAPI.js.map +2 -2
  200. package/dist/services/agentTeams/index.js +35 -0
  201. package/dist/services/agentTeams/index.js.map +7 -0
  202. package/dist/services/agentTeams/mailbox.js +114 -0
  203. package/dist/services/agentTeams/mailbox.js.map +7 -0
  204. package/dist/services/agentTeams/teamManager.js +149 -0
  205. package/dist/services/agentTeams/teamManager.js.map +7 -0
  206. package/dist/services/agentTeams/teamTaskStore.js +114 -0
  207. package/dist/services/agentTeams/teamTaskStore.js.map +7 -0
  208. package/dist/services/agentTeams/teammateSpawner.js +80 -0
  209. package/dist/services/agentTeams/teammateSpawner.js.map +7 -0
  210. package/dist/services/checkpointManager.js +16 -3
  211. package/dist/services/checkpointManager.js.map +2 -2
  212. package/dist/services/claude.js +19 -1728
  213. package/dist/services/claude.js.map +3 -3
  214. package/dist/services/customCommands.js +30 -8
  215. package/dist/services/customCommands.js.map +2 -2
  216. package/dist/services/gpt5ConnectionTest.js +4 -2
  217. package/dist/services/gpt5ConnectionTest.js.map +2 -2
  218. package/dist/services/hookExecutor.js +411 -127
  219. package/dist/services/hookExecutor.js.map +2 -2
  220. package/dist/services/llm/anthropicProvider.js +807 -0
  221. package/dist/services/llm/anthropicProvider.js.map +7 -0
  222. package/dist/services/llm/dispatch.js +218 -0
  223. package/dist/services/llm/dispatch.js.map +7 -0
  224. package/dist/services/llm/index.js +44 -0
  225. package/dist/services/llm/index.js.map +7 -0
  226. package/dist/services/llm/mintoContext.js +69 -0
  227. package/dist/services/llm/mintoContext.js.map +7 -0
  228. package/dist/services/llm/openaiProvider.js +622 -0
  229. package/dist/services/llm/openaiProvider.js.map +7 -0
  230. package/dist/services/llm/types.js +157 -0
  231. package/dist/services/llm/types.js.map +7 -0
  232. package/dist/services/mcpClient.js +183 -33
  233. package/dist/services/mcpClient.js.map +2 -2
  234. package/dist/services/notifier.js +14 -0
  235. package/dist/services/notifier.js.map +2 -2
  236. package/dist/services/oauth.js +4 -2
  237. package/dist/services/oauth.js.map +2 -2
  238. package/dist/services/openai.js +66 -56
  239. package/dist/services/openai.js.map +3 -3
  240. package/dist/services/outputStyles.js +102 -21
  241. package/dist/services/outputStyles.js.map +2 -2
  242. package/dist/services/plugins/lspServers.js +1 -1
  243. package/dist/services/plugins/lspServers.js.map +2 -2
  244. package/dist/services/plugins/pluginRuntime.js +2 -1
  245. package/dist/services/plugins/pluginRuntime.js.map +2 -2
  246. package/dist/services/plugins/pluginValidation.js +10 -3
  247. package/dist/services/plugins/pluginValidation.js.map +2 -2
  248. package/dist/services/plugins/skillMarketplace.js +20 -9
  249. package/dist/services/plugins/skillMarketplace.js.map +2 -2
  250. package/dist/services/sentry.js +1 -1
  251. package/dist/services/sentry.js.map +2 -2
  252. package/dist/services/sessionMemory.js +16 -3
  253. package/dist/services/sessionMemory.js.map +2 -2
  254. package/dist/services/systemReminder.js +367 -9
  255. package/dist/services/systemReminder.js.map +2 -2
  256. package/dist/services/taskStore.js +19 -0
  257. package/dist/services/taskStore.js.map +2 -2
  258. package/dist/tools/ArchitectTool/ArchitectTool.js.map +1 -1
  259. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +1 -1
  260. package/dist/tools/BashOutputTool/BashOutputTool.js.map +1 -1
  261. package/dist/tools/BashTool/BashTool.js +28 -0
  262. package/dist/tools/BashTool/BashTool.js.map +2 -2
  263. package/dist/tools/FileEditTool/FileEditTool.js +8 -1
  264. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  265. package/dist/tools/FileReadTool/FileReadTool.js +14 -0
  266. package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
  267. package/dist/tools/FileWriteTool/FileWriteTool.js +10 -1
  268. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  269. package/dist/tools/GlobTool/GlobTool.js.map +1 -1
  270. package/dist/tools/GrepTool/GrepTool.js.map +1 -1
  271. package/dist/tools/KillShellTool/KillShellTool.js.map +1 -1
  272. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +2 -2
  273. package/dist/tools/LspTool/LspTool.js +11 -2
  274. package/dist/tools/LspTool/LspTool.js.map +2 -2
  275. package/dist/tools/MCPTool/MCPTool.js.map +1 -1
  276. package/dist/tools/MemoryReadTool/MemoryReadTool.js +2 -1
  277. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
  278. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +2 -1
  279. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
  280. package/dist/tools/MultiEditTool/MultiEditTool.js +7 -0
  281. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  282. package/dist/tools/NotebookEditTool/NotebookEditTool.js +2 -0
  283. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  284. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +1 -1
  285. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +8 -2
  286. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
  287. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +2 -0
  288. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
  289. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +1 -1
  290. package/dist/tools/SlashCommandTool/SlashCommandTool.js +174 -18
  291. package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +3 -3
  292. package/dist/tools/TaskCreateTool/TaskCreateTool.js.map +1 -1
  293. package/dist/tools/TaskGetTool/TaskGetTool.js.map +1 -1
  294. package/dist/tools/TaskListTool/TaskListTool.js.map +1 -1
  295. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +1 -1
  296. package/dist/tools/TaskStopTool/TaskStopTool.js.map +1 -1
  297. package/dist/tools/TaskTool/TaskTool.js +84 -11
  298. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  299. package/dist/tools/TaskTool/prompt.js +12 -6
  300. package/dist/tools/TaskTool/prompt.js.map +2 -2
  301. package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +1 -1
  302. package/dist/tools/ThinkTool/ThinkTool.js.map +1 -1
  303. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +1 -1
  304. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +1 -1
  305. package/dist/tools/WebSearchTool/WebSearchTool.js.map +1 -1
  306. package/dist/tools/WebSearchTool/searchProviders.js +2 -1
  307. package/dist/tools/WebSearchTool/searchProviders.js.map +2 -2
  308. package/dist/tools/lsTool/lsTool.js.map +2 -2
  309. package/dist/tools/lsTool/prompt.js.map +1 -1
  310. package/dist/tools.js +14 -3
  311. package/dist/tools.js.map +2 -2
  312. package/dist/types/PermissionMode.js +21 -1
  313. package/dist/types/PermissionMode.js.map +2 -2
  314. package/dist/types/agentTeams.js +1 -0
  315. package/dist/types/agentTeams.js.map +7 -0
  316. package/dist/types/hooks.js +8 -2
  317. package/dist/types/hooks.js.map +2 -2
  318. package/dist/types/plugin.js +3 -5
  319. package/dist/types/plugin.js.map +2 -2
  320. package/dist/utils/agentHookExecutor.js +1 -4
  321. package/dist/utils/agentHookExecutor.js.map +2 -2
  322. package/dist/utils/agentLoader.js +91 -15
  323. package/dist/utils/agentLoader.js.map +2 -2
  324. package/dist/utils/agentMemory.js.map +2 -2
  325. package/dist/utils/animationManager.js +1 -1
  326. package/dist/utils/animationManager.js.map +2 -2
  327. package/dist/utils/ask.js +1 -1
  328. package/dist/utils/async.js +5 -1
  329. package/dist/utils/async.js.map +2 -2
  330. package/dist/utils/autoCompactCore.js +60 -0
  331. package/dist/utils/autoCompactCore.js.map +2 -2
  332. package/dist/utils/claudeCodeSync.js +439 -0
  333. package/dist/utils/claudeCodeSync.js.map +7 -0
  334. package/dist/utils/config.js +27 -151
  335. package/dist/utils/config.js.map +2 -2
  336. package/dist/utils/configSchema.js +227 -0
  337. package/dist/utils/configSchema.js.map +7 -0
  338. package/dist/utils/debugLogger.js.map +2 -2
  339. package/dist/utils/env.js +4 -3
  340. package/dist/utils/env.js.map +2 -2
  341. package/dist/utils/envConfig.js +34 -0
  342. package/dist/utils/envConfig.js.map +3 -3
  343. package/dist/utils/execFileNoThrow.js +2 -1
  344. package/dist/utils/execFileNoThrow.js.map +2 -2
  345. package/dist/utils/gpt5.js +146 -0
  346. package/dist/utils/gpt5.js.map +7 -0
  347. package/dist/utils/hookManager.js +374 -140
  348. package/dist/utils/hookManager.js.map +2 -2
  349. package/dist/utils/markdown.js +47 -0
  350. package/dist/utils/markdown.js.map +2 -2
  351. package/dist/utils/marketplaceManager.js +80 -43
  352. package/dist/utils/marketplaceManager.js.map +2 -2
  353. package/dist/utils/memoizeWithTTL.js +25 -0
  354. package/dist/utils/memoizeWithTTL.js.map +7 -0
  355. package/dist/utils/messages.js +2 -2
  356. package/dist/utils/messages.js.map +2 -2
  357. package/dist/utils/model.js +34 -9
  358. package/dist/utils/model.js.map +2 -2
  359. package/dist/utils/pluginInstaller.js +68 -29
  360. package/dist/utils/pluginInstaller.js.map +2 -2
  361. package/dist/utils/pluginLoader.js +249 -57
  362. package/dist/utils/pluginLoader.js.map +2 -2
  363. package/dist/utils/repoFetcher.js +110 -0
  364. package/dist/utils/repoFetcher.js.map +7 -0
  365. package/dist/utils/safeFetch.js +45 -0
  366. package/dist/utils/safeFetch.js.map +7 -0
  367. package/dist/utils/skillLoader.js +77 -12
  368. package/dist/utils/skillLoader.js.map +2 -2
  369. package/dist/utils/streamingState.js +52 -0
  370. package/dist/utils/streamingState.js.map +7 -0
  371. package/dist/utils/stringSubstitution.js +4 -5
  372. package/dist/utils/stringSubstitution.js.map +2 -2
  373. package/dist/utils/style.js +6 -3
  374. package/dist/utils/style.js.map +2 -2
  375. package/dist/utils/teamConfig.js +162 -16
  376. package/dist/utils/teamConfig.js.map +2 -2
  377. package/dist/utils/terminal.js +1 -1
  378. package/dist/utils/terminal.js.map +2 -2
  379. package/dist/utils/toolRiskClassification.js +0 -6
  380. package/dist/utils/toolRiskClassification.js.map +2 -2
  381. package/dist/version.js +2 -2
  382. package/dist/version.js.map +1 -1
  383. package/package.json +7 -6
@@ -1,87 +1,478 @@
1
- import React, { useState } from "react";
2
- import { Box, Text, useInput } from "ink";
3
- import { ModelConfig } from "../components/ModelConfig.js";
1
+ import React, { useState, useMemo, useCallback } from "react";
2
+ import { SimpleSelector } from "../components/SimpleSelector/index.js";
3
+ import { ModelSelector } from "../components/ModelSelector/index.js";
4
4
  import { enableConfigs } from "../utils/config.js";
5
+ import {
6
+ setModelPointer,
7
+ getGlobalConfig
8
+ } from "../utils/config.js";
9
+ import { getModelManager, reloadModelManager } from "../utils/model.js";
5
10
  import { triggerModelConfigChange } from "../messages.js";
6
- import { getModelManager } from "../utils/model.js";
7
- import { getTheme } from "../utils/theme.js";
8
- import { useExitOnCtrlCD } from "../hooks/useExitOnCtrlCD.js";
9
- import { SEMANTIC_COLORS } from "../constants/colors.js";
11
+ import { t } from "../i18n/index.js";
12
+ const ID_MANAGE_LIBRARY = "__manage_library__";
13
+ const ID_ADD_NEW = "__add_new__";
14
+ const ID_CLEAR = "__clear__";
15
+ const ID_EDIT = "__edit__";
16
+ const ID_DELETE = "__delete__";
17
+ const ID_BACK = "__back__";
18
+ const ID_CONFIRM_YES = "__yes__";
19
+ const ID_CONFIRM_NO = "__no__";
20
+ const POINTER_TYPES = [
21
+ "main",
22
+ "task",
23
+ "reasoning",
24
+ "quick",
25
+ "compact"
26
+ ];
27
+ const POINTER_LABELS = {
28
+ main: "Main",
29
+ task: "Task",
30
+ reasoning: "Reasoning",
31
+ quick: "Quick",
32
+ compact: "Compact"
33
+ };
34
+ function getPointerDescription(pointer) {
35
+ const key = `ui.modelConfig.${pointer}Description`;
36
+ return t(key);
37
+ }
10
38
  function ModelCommand({ onClose, abortController }) {
11
- const [mode, setMode] = useState("status");
12
- const theme = getTheme();
13
- const exitState = useExitOnCtrlCD(onClose);
14
- useInput(
15
- (input, key) => {
16
- if (key.return || input === "c" || input === "C") {
17
- enableConfigs();
18
- abortController?.abort?.();
19
- setMode("config");
20
- } else if (key.escape) {
21
- onClose();
22
- }
39
+ const [phase, setPhase] = useState({ type: "main" });
40
+ const [statusOverlay, setStatusOverlay] = useState(null);
41
+ const [refreshKey, setRefreshKey] = useState(0);
42
+ const refreshModels = useCallback(() => {
43
+ reloadModelManager();
44
+ triggerModelConfigChange();
45
+ setRefreshKey((prev) => prev + 1);
46
+ }, []);
47
+ const showSuccessAndGo = useCallback(
48
+ (message, nextPhase) => {
49
+ setStatusOverlay({ type: "success", message });
50
+ setTimeout(() => {
51
+ setStatusOverlay(null);
52
+ setPhase(nextPhase);
53
+ }, 800);
23
54
  },
24
- { isActive: mode === "status" }
55
+ []
25
56
  );
26
- if (mode === "config") {
57
+ if (phase.type === "main") {
58
+ return /* @__PURE__ */ React.createElement(
59
+ MainPhase,
60
+ {
61
+ refreshKey,
62
+ statusOverlay,
63
+ onSelectPointer: (pointer) => setPhase({ type: "assign", pointer }),
64
+ onManageLibrary: () => setPhase({ type: "library" }),
65
+ onClose
66
+ }
67
+ );
68
+ }
69
+ if (phase.type === "assign") {
27
70
  return /* @__PURE__ */ React.createElement(
28
- ModelConfig,
71
+ AssignPhase,
29
72
  {
30
- onClose: () => {
31
- import("../utils/model.js").then(({ reloadModelManager }) => {
32
- reloadModelManager();
33
- triggerModelConfigChange();
34
- setMode("status");
73
+ pointer: phase.pointer,
74
+ refreshKey,
75
+ statusOverlay,
76
+ onAssign: (pointer, modelName) => {
77
+ setModelPointer(pointer, modelName);
78
+ refreshModels();
79
+ showSuccessAndGo(
80
+ t("commands.model.pointerUpdated").replace(
81
+ "{pointer}",
82
+ POINTER_LABELS[pointer]
83
+ ),
84
+ { type: "main" }
85
+ );
86
+ },
87
+ onClear: (pointer) => {
88
+ setModelPointer(pointer, "");
89
+ refreshModels();
90
+ showSuccessAndGo(
91
+ t("commands.model.pointerCleared").replace(
92
+ "{pointer}",
93
+ POINTER_LABELS[pointer]
94
+ ),
95
+ { type: "main" }
96
+ );
97
+ },
98
+ onClose: () => setPhase({ type: "main" })
99
+ }
100
+ );
101
+ }
102
+ if (phase.type === "library") {
103
+ return /* @__PURE__ */ React.createElement(
104
+ LibraryPhase,
105
+ {
106
+ refreshKey,
107
+ statusOverlay,
108
+ onSelectModel: (modelName, modelLabel) => setPhase({ type: "model-actions", modelName, modelLabel }),
109
+ onAddNew: () => {
110
+ enableConfigs();
111
+ abortController?.abort?.();
112
+ setPhase({ type: "add-model" });
113
+ },
114
+ onClose: () => setPhase({ type: "main" })
115
+ }
116
+ );
117
+ }
118
+ if (phase.type === "model-actions") {
119
+ return /* @__PURE__ */ React.createElement(
120
+ ModelActionsPhase,
121
+ {
122
+ modelName: phase.modelName,
123
+ modelLabel: phase.modelLabel,
124
+ onEdit: () => {
125
+ enableConfigs();
126
+ abortController?.abort?.();
127
+ setPhase({
128
+ type: "edit-model",
129
+ modelName: phase.modelName,
130
+ modelLabel: phase.modelLabel
35
131
  });
36
- }
132
+ },
133
+ onDelete: () => setPhase({
134
+ type: "confirm-delete",
135
+ modelName: phase.modelName,
136
+ modelLabel: phase.modelLabel
137
+ }),
138
+ onClose: () => setPhase({ type: "library" })
37
139
  }
38
140
  );
39
141
  }
40
- try {
41
- const modelManager = getModelManager();
42
- const pointers = ["main", "task", "reasoning", "quick", "compact"];
142
+ if (phase.type === "confirm-delete") {
43
143
  return /* @__PURE__ */ React.createElement(
44
- Box,
144
+ ConfirmDeletePhase,
45
145
  {
46
- flexDirection: "column",
47
- borderStyle: "round",
48
- borderColor: theme.secondaryBorder,
49
- paddingX: 2,
50
- paddingY: 1
51
- },
52
- /* @__PURE__ */ React.createElement(Text, { bold: true }, "\u{1F4CA} Model Status", " ", exitState.pending ? `(press ${exitState.keyName} again to exit)` : ""),
53
- /* @__PURE__ */ React.createElement(Text, null, " "),
54
- pointers.map((pointer) => {
55
- try {
56
- const model2 = modelManager.getModel(pointer);
57
- if (model2 && model2.name && model2.provider) {
58
- return /* @__PURE__ */ React.createElement(Box, { key: pointer }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.minto }, pointer.toUpperCase().padEnd(10)), " ", "\u2192 ", model2.name, " ", /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "(", model2.provider, ", ", model2.modelName || "unknown", ")")));
59
- } else {
60
- return /* @__PURE__ */ React.createElement(Box, { key: pointer }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.minto }, pointer.toUpperCase().padEnd(10)), " ", "\u2192 ", /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Not configured")));
146
+ modelName: phase.modelName,
147
+ modelLabel: phase.modelLabel,
148
+ statusOverlay,
149
+ onConfirm: () => {
150
+ try {
151
+ const modelManager = getModelManager();
152
+ modelManager.removeModel(phase.modelName);
153
+ refreshModels();
154
+ showSuccessAndGo(t("commands.model.modelDeleted"), {
155
+ type: "library"
156
+ });
157
+ } catch {
158
+ setStatusOverlay({
159
+ type: "error",
160
+ message: t("commands.model.deleteFailed")
161
+ });
162
+ setTimeout(() => {
163
+ setStatusOverlay(null);
164
+ setPhase({
165
+ type: "model-actions",
166
+ modelName: phase.modelName,
167
+ modelLabel: phase.modelLabel
168
+ });
169
+ }, 1500);
61
170
  }
62
- } catch {
63
- return /* @__PURE__ */ React.createElement(Box, { key: pointer }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.minto }, pointer.toUpperCase().padEnd(10)), " ", "\u2192 ", /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Error")));
64
- }
65
- }),
66
- /* @__PURE__ */ React.createElement(Text, null, " "),
67
- /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "Enter"), " or ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "C"), " to configure models"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "Esc"), " to close"))
171
+ },
172
+ onCancel: () => setPhase({
173
+ type: "model-actions",
174
+ modelName: phase.modelName,
175
+ modelLabel: phase.modelLabel
176
+ })
177
+ }
178
+ );
179
+ }
180
+ if (phase.type === "add-model") {
181
+ return /* @__PURE__ */ React.createElement(
182
+ ModelSelector,
183
+ {
184
+ onDone: () => {
185
+ refreshModels();
186
+ setPhase({ type: "library" });
187
+ },
188
+ onCancel: () => setPhase({ type: "library" }),
189
+ skipModelType: true,
190
+ isOnboarding: false,
191
+ abortController: new AbortController()
192
+ }
68
193
  );
69
- } catch (error) {
194
+ }
195
+ if (phase.type === "edit-model") {
196
+ const modelManager = getModelManager();
197
+ const profile = modelManager.getAvailableModels().find((m) => m.modelName === phase.modelName);
198
+ if (!profile) {
199
+ setPhase({ type: "library" });
200
+ return null;
201
+ }
70
202
  return /* @__PURE__ */ React.createElement(
71
- Box,
203
+ ModelSelector,
72
204
  {
73
- flexDirection: "column",
74
- borderStyle: "round",
75
- borderColor: theme.error,
76
- paddingX: 2,
77
- paddingY: 1
78
- },
79
- /* @__PURE__ */ React.createElement(Text, { bold: true }, "\u{1F4CA} Model Status Error"),
80
- /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Error reading model status: ", String(error)),
81
- /* @__PURE__ */ React.createElement(Text, null, " "),
82
- /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "Enter"), " to configure models")
205
+ onDone: () => {
206
+ refreshModels();
207
+ setPhase({ type: "library" });
208
+ },
209
+ onCancel: () => setPhase({
210
+ type: "model-actions",
211
+ modelName: phase.modelName,
212
+ modelLabel: phase.modelLabel
213
+ }),
214
+ skipModelType: true,
215
+ isOnboarding: false,
216
+ abortController: new AbortController(),
217
+ editingModel: profile
218
+ }
83
219
  );
84
220
  }
221
+ return null;
222
+ }
223
+ function MainPhase({
224
+ refreshKey,
225
+ statusOverlay,
226
+ onSelectPointer,
227
+ onManageLibrary,
228
+ onClose
229
+ }) {
230
+ const items = useMemo(() => {
231
+ const config = getGlobalConfig();
232
+ const modelManager = getModelManager();
233
+ const models = modelManager.getAvailableModels();
234
+ const pointerItems = POINTER_TYPES.map((pointer) => {
235
+ const assignedModelName = config.modelPointers?.[pointer] || "";
236
+ const model2 = models.find((m) => m.modelName === assignedModelName);
237
+ const description = model2 ? `${model2.name} (${model2.provider})` : getPointerDescription(pointer);
238
+ return {
239
+ id: pointer,
240
+ label: POINTER_LABELS[pointer],
241
+ description,
242
+ category: t("commands.model.pointersCategory"),
243
+ statusIcon: model2 ? "\u2713" : void 0,
244
+ statusColor: model2 ? "#4EBA65" : void 0
245
+ };
246
+ });
247
+ const actionItems = [
248
+ {
249
+ id: ID_MANAGE_LIBRARY,
250
+ label: t("commands.model.modelLibrary"),
251
+ description: t("commands.model.modelLibrarySubtitle"),
252
+ category: t("commands.model.actionsCategory")
253
+ }
254
+ ];
255
+ return [...pointerItems, ...actionItems];
256
+ }, [refreshKey]);
257
+ const handleSelect = useCallback(
258
+ (item) => {
259
+ if (item.id === ID_MANAGE_LIBRARY) {
260
+ onManageLibrary();
261
+ } else {
262
+ onSelectPointer(item.id);
263
+ }
264
+ },
265
+ [onSelectPointer, onManageLibrary]
266
+ );
267
+ return /* @__PURE__ */ React.createElement(
268
+ SimpleSelector,
269
+ {
270
+ title: t("commands.model.title"),
271
+ items,
272
+ onSelect: handleSelect,
273
+ onClose,
274
+ groupByCategory: true,
275
+ statusOverlay
276
+ }
277
+ );
278
+ }
279
+ function AssignPhase({
280
+ pointer,
281
+ refreshKey,
282
+ statusOverlay,
283
+ onAssign,
284
+ onClear,
285
+ onClose
286
+ }) {
287
+ const items = useMemo(() => {
288
+ const config = getGlobalConfig();
289
+ const modelManager = getModelManager();
290
+ const models = modelManager.getAvailableModels();
291
+ const currentAssignment = config.modelPointers?.[pointer] || "";
292
+ const modelItems = models.map((model2) => ({
293
+ id: model2.modelName,
294
+ label: model2.name,
295
+ description: `${model2.provider}: ${model2.modelName}`,
296
+ isCurrent: model2.modelName === currentAssignment
297
+ }));
298
+ if (currentAssignment) {
299
+ modelItems.push({
300
+ id: ID_CLEAR,
301
+ label: t("commands.model.clearAssignment"),
302
+ statusIcon: "\u2715",
303
+ statusColor: "#FF6B80"
304
+ });
305
+ }
306
+ return modelItems;
307
+ }, [pointer, refreshKey]);
308
+ const handleSelect = useCallback(
309
+ (item) => {
310
+ if (item.id === ID_CLEAR) {
311
+ onClear(pointer);
312
+ } else {
313
+ onAssign(pointer, item.id);
314
+ }
315
+ },
316
+ [pointer, onAssign, onClear]
317
+ );
318
+ return /* @__PURE__ */ React.createElement(
319
+ SimpleSelector,
320
+ {
321
+ title: t("commands.model.selectModel").replace(
322
+ "{pointer}",
323
+ POINTER_LABELS[pointer]
324
+ ),
325
+ items,
326
+ onSelect: handleSelect,
327
+ onClose,
328
+ statusOverlay
329
+ }
330
+ );
331
+ }
332
+ function LibraryPhase({
333
+ refreshKey,
334
+ statusOverlay,
335
+ onSelectModel,
336
+ onAddNew,
337
+ onClose
338
+ }) {
339
+ const items = useMemo(() => {
340
+ const config = getGlobalConfig();
341
+ const modelManager = getModelManager();
342
+ const models = modelManager.getAvailableModels();
343
+ const modelItems = models.map((model2) => {
344
+ const usedBy = [];
345
+ POINTER_TYPES.forEach((p) => {
346
+ if (config.modelPointers?.[p] === model2.modelName) {
347
+ usedBy.push(POINTER_LABELS[p]);
348
+ }
349
+ });
350
+ const usageDesc = usedBy.length > 0 ? `[${usedBy.join(", ")}]` : "";
351
+ return {
352
+ id: model2.modelName,
353
+ label: model2.name,
354
+ description: `${model2.provider}${usageDesc ? " " + usageDesc : ""}`,
355
+ statusIcon: usedBy.length > 0 ? "\u2713" : void 0,
356
+ statusColor: usedBy.length > 0 ? "#4EBA65" : void 0,
357
+ data: { modelLabel: model2.name }
358
+ };
359
+ });
360
+ modelItems.push({
361
+ id: ID_ADD_NEW,
362
+ label: t("commands.model.addNewModel")
363
+ });
364
+ return modelItems;
365
+ }, [refreshKey]);
366
+ const handleSelect = useCallback(
367
+ (item) => {
368
+ if (item.id === ID_ADD_NEW) {
369
+ onAddNew();
370
+ } else {
371
+ const data = item.data;
372
+ onSelectModel(item.id, data?.modelLabel || item.label);
373
+ }
374
+ },
375
+ [onSelectModel, onAddNew]
376
+ );
377
+ return /* @__PURE__ */ React.createElement(
378
+ SimpleSelector,
379
+ {
380
+ title: t("commands.model.modelLibrary"),
381
+ subtitle: t("commands.model.modelLibrarySubtitle"),
382
+ items,
383
+ onSelect: handleSelect,
384
+ onClose,
385
+ statusOverlay
386
+ }
387
+ );
388
+ }
389
+ function ModelActionsPhase({
390
+ modelName,
391
+ modelLabel,
392
+ onEdit,
393
+ onDelete,
394
+ onClose
395
+ }) {
396
+ const items = [
397
+ {
398
+ id: ID_EDIT,
399
+ label: t("commands.model.editModel")
400
+ },
401
+ {
402
+ id: ID_DELETE,
403
+ label: t("common.delete"),
404
+ statusIcon: "\u2715",
405
+ statusColor: "#FF6B80"
406
+ },
407
+ {
408
+ id: ID_BACK,
409
+ label: t("common.back")
410
+ }
411
+ ];
412
+ const handleSelect = useCallback(
413
+ (item) => {
414
+ if (item.id === ID_EDIT) {
415
+ onEdit();
416
+ } else if (item.id === ID_DELETE) {
417
+ onDelete();
418
+ } else {
419
+ onClose();
420
+ }
421
+ },
422
+ [onEdit, onDelete, onClose]
423
+ );
424
+ return /* @__PURE__ */ React.createElement(
425
+ SimpleSelector,
426
+ {
427
+ title: t("commands.model.modelActions").replace("{model}", modelLabel),
428
+ items,
429
+ onSelect: handleSelect,
430
+ onClose
431
+ }
432
+ );
433
+ }
434
+ function ConfirmDeletePhase({
435
+ modelName,
436
+ modelLabel,
437
+ statusOverlay,
438
+ onConfirm,
439
+ onCancel
440
+ }) {
441
+ const items = [
442
+ {
443
+ id: ID_CONFIRM_YES,
444
+ label: t("commands.model.confirmDeleteYes"),
445
+ statusIcon: "\u2715",
446
+ statusColor: "#FF6B80"
447
+ },
448
+ {
449
+ id: ID_CONFIRM_NO,
450
+ label: t("commands.model.confirmDeleteNo")
451
+ }
452
+ ];
453
+ const handleSelect = useCallback(
454
+ (item) => {
455
+ if (item.id === ID_CONFIRM_YES) {
456
+ onConfirm();
457
+ } else {
458
+ onCancel();
459
+ }
460
+ },
461
+ [onConfirm, onCancel]
462
+ );
463
+ return /* @__PURE__ */ React.createElement(
464
+ SimpleSelector,
465
+ {
466
+ title: t("commands.model.confirmDeleteTitle").replace(
467
+ "{model}",
468
+ modelLabel
469
+ ),
470
+ items,
471
+ onSelect: handleSelect,
472
+ onClose: onCancel,
473
+ statusOverlay
474
+ }
475
+ );
85
476
  }
86
477
  const model = {
87
478
  name: "model",
@@ -89,6 +480,7 @@ const model = {
89
480
  aliases: ["ms", "modelstatus", "model-status"],
90
481
  isEnabled: true,
91
482
  isHidden: false,
483
+ hidePromptInput: true,
92
484
  type: "local-jsx",
93
485
  userFacingName() {
94
486
  return "model";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/model.tsx"],
4
- "sourcesContent": ["import React, { useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { ModelConfig } from '@components/ModelConfig'\nimport { enableConfigs } from '@utils/config'\nimport { triggerModelConfigChange } from '@messages'\nimport { getModelManager } from '@utils/model'\nimport { getTheme } from '@utils/theme'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\nimport type { Command } from '@commands'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\ntype Props = {\n onClose: () => void\n abortController?: AbortController\n}\n\n/**\n * Combined Model Command - Shows status and provides configuration\n *\n * This merges the functionality of /model and /modelstatus into a single command.\n * First shows current model status, then allows entering configuration mode.\n */\nfunction ModelCommand({ onClose, abortController }: Props): React.ReactNode {\n const [mode, setMode] = useState<'status' | 'config'>('status')\n const theme = getTheme()\n const exitState = useExitOnCtrlCD(onClose)\n\n // Only listen for input when in status mode\n // When in config mode, ModelConfig handles its own input\n useInput(\n (input, key) => {\n if (key.return || input === 'c' || input === 'C') {\n enableConfigs()\n abortController?.abort?.()\n setMode('config')\n } else if (key.escape) {\n onClose()\n }\n },\n { isActive: mode === 'status' },\n )\n\n if (mode === 'config') {\n return (\n <ModelConfig\n onClose={() => {\n import('@utils/model').then(({ reloadModelManager }) => {\n reloadModelManager()\n triggerModelConfigChange()\n // Return to status mode instead of exiting completely\n setMode('status')\n })\n }}\n />\n )\n }\n\n // Status mode - show current model configuration\n try {\n const modelManager = getModelManager()\n const pointers = ['main', 'task', 'reasoning', 'quick', 'compact'] as const\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n \uD83D\uDCCA Model Status{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Text> </Text>\n\n {pointers.map(pointer => {\n try {\n const model = modelManager.getModel(pointer)\n if (model && model.name && model.provider) {\n return (\n <Box key={pointer}>\n <Text>\n <Text bold color={theme.minto}>\n {pointer.toUpperCase().padEnd(10)}\n </Text>{' '}\n \u2192 {model.name}{' '}\n <Text color={theme.secondaryText}>\n ({model.provider}, {model.modelName || 'unknown'})\n </Text>\n </Text>\n </Box>\n )\n } else {\n return (\n <Box key={pointer}>\n <Text>\n <Text bold color={theme.minto}>\n {pointer.toUpperCase().padEnd(10)}\n </Text>{' '}\n \u2192 <Text color={theme.error}>Not configured</Text>\n </Text>\n </Box>\n )\n }\n } catch {\n return (\n <Box key={pointer}>\n <Text>\n <Text bold color={theme.minto}>\n {pointer.toUpperCase().padEnd(10)}\n </Text>{' '}\n \u2192 <Text color={theme.error}>Error</Text>\n </Text>\n </Box>\n )\n }\n })}\n\n <Text> </Text>\n <Box flexDirection=\"column\">\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>Enter</Text> or <Text bold>C</Text> to configure\n models\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>Esc</Text> to close\n </Text>\n </Box>\n </Box>\n )\n } catch (error) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\uD83D\uDCCA Model Status Error</Text>\n <Text color={theme.error}>\n Error reading model status: {String(error)}\n </Text>\n <Text> </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>Enter</Text> to configure models\n </Text>\n </Box>\n )\n }\n}\n\nconst model: Command = {\n name: 'model',\n description: 'View model status and configure AI provider settings',\n aliases: ['ms', 'modelstatus', 'model-status'],\n isEnabled: true,\n isHidden: false,\n type: 'local-jsx',\n userFacingName() {\n return 'model'\n },\n async call(onDone, context) {\n const { abortController } = context || {}\n return <ModelCommand onClose={onDone} abortController={abortController} />\n },\n}\n\nexport default model\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Model Command\n *\n * Interactive model configuration using SimpleSelector phase state machine.\n *\n * Phase flow:\n * main \u2192 (select pointer) \u2192 assign \u2192 (select model) \u2192 main\n * main \u2192 (Manage Library) \u2192 library \u2192 (select model) \u2192 model-actions\n * \u2193\n * confirm-delete \u2192 library\n * library \u2192 (+ Add New) \u2192 add-model \u2192 library\n */\n\nimport React, { useState, useMemo, useCallback } from 'react'\nimport { SimpleSelector } from '@components/SimpleSelector'\nimport type { SelectorItem, StatusOverlay } from '@components/SimpleSelector'\nimport { ModelSelector } from '@components/ModelSelector'\nimport { enableConfigs } from '@utils/config'\nimport {\n ModelPointerType,\n setModelPointer,\n getGlobalConfig,\n} from '@utils/config'\nimport { getModelManager, reloadModelManager } from '@utils/model'\nimport { triggerModelConfigChange } from '@messages'\nimport { t } from '@i18n'\nimport type { Command } from '@commands'\n\n// =============================================================================\n// Types\n// =============================================================================\n\ntype ModelPhase =\n | { type: 'main' }\n | { type: 'assign'; pointer: ModelPointerType }\n | { type: 'library' }\n | { type: 'model-actions'; modelName: string; modelLabel: string }\n | { type: 'confirm-delete'; modelName: string; modelLabel: string }\n | { type: 'add-model' }\n | { type: 'edit-model'; modelName: string; modelLabel: string }\n\n// Special item IDs\nconst ID_MANAGE_LIBRARY = '__manage_library__'\nconst ID_ADD_NEW = '__add_new__'\nconst ID_CLEAR = '__clear__'\nconst ID_EDIT = '__edit__'\nconst ID_DELETE = '__delete__'\nconst ID_BACK = '__back__'\nconst ID_CONFIRM_YES = '__yes__'\nconst ID_CONFIRM_NO = '__no__'\n\nconst POINTER_TYPES: ModelPointerType[] = [\n 'main',\n 'task',\n 'reasoning',\n 'quick',\n 'compact',\n]\n\nconst POINTER_LABELS: Record<ModelPointerType, string> = {\n main: 'Main',\n task: 'Task',\n reasoning: 'Reasoning',\n quick: 'Quick',\n compact: 'Compact',\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nfunction getPointerDescription(pointer: ModelPointerType): string {\n const key = `ui.modelConfig.${pointer}Description` as const\n return t(key)\n}\n\n// =============================================================================\n// Main Component\n// =============================================================================\n\ntype Props = {\n onClose: () => void\n abortController?: AbortController\n}\n\nfunction ModelCommand({ onClose, abortController }: Props): React.ReactNode {\n const [phase, setPhase] = useState<ModelPhase>({ type: 'main' })\n const [statusOverlay, setStatusOverlay] = useState<StatusOverlay | null>(null)\n const [refreshKey, setRefreshKey] = useState(0)\n\n // Reload models and trigger config change\n const refreshModels = useCallback(() => {\n reloadModelManager()\n triggerModelConfigChange()\n setRefreshKey(prev => prev + 1)\n }, [])\n\n // Show a temporary success overlay then transition\n const showSuccessAndGo = useCallback(\n (message: string, nextPhase: ModelPhase) => {\n setStatusOverlay({ type: 'success', message })\n setTimeout(() => {\n setStatusOverlay(null)\n setPhase(nextPhase)\n }, 800)\n },\n [],\n )\n\n // \u2500\u2500\u2500 Phase: main \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (phase.type === 'main') {\n return (\n <MainPhase\n refreshKey={refreshKey}\n statusOverlay={statusOverlay}\n onSelectPointer={pointer => setPhase({ type: 'assign', pointer })}\n onManageLibrary={() => setPhase({ type: 'library' })}\n onClose={onClose}\n />\n )\n }\n\n // \u2500\u2500\u2500 Phase: assign \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (phase.type === 'assign') {\n return (\n <AssignPhase\n pointer={phase.pointer}\n refreshKey={refreshKey}\n statusOverlay={statusOverlay}\n onAssign={(pointer, modelName) => {\n setModelPointer(pointer, modelName)\n refreshModels()\n showSuccessAndGo(\n t('commands.model.pointerUpdated').replace(\n '{pointer}',\n POINTER_LABELS[pointer],\n ),\n { type: 'main' },\n )\n }}\n onClear={pointer => {\n setModelPointer(pointer, '')\n refreshModels()\n showSuccessAndGo(\n t('commands.model.pointerCleared').replace(\n '{pointer}',\n POINTER_LABELS[pointer],\n ),\n { type: 'main' },\n )\n }}\n onClose={() => setPhase({ type: 'main' })}\n />\n )\n }\n\n // \u2500\u2500\u2500 Phase: library \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (phase.type === 'library') {\n return (\n <LibraryPhase\n refreshKey={refreshKey}\n statusOverlay={statusOverlay}\n onSelectModel={(modelName, modelLabel) =>\n setPhase({ type: 'model-actions', modelName, modelLabel })\n }\n onAddNew={() => {\n enableConfigs()\n abortController?.abort?.()\n setPhase({ type: 'add-model' })\n }}\n onClose={() => setPhase({ type: 'main' })}\n />\n )\n }\n\n // \u2500\u2500\u2500 Phase: model-actions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (phase.type === 'model-actions') {\n return (\n <ModelActionsPhase\n modelName={phase.modelName}\n modelLabel={phase.modelLabel}\n onEdit={() => {\n enableConfigs()\n abortController?.abort?.()\n setPhase({\n type: 'edit-model',\n modelName: phase.modelName,\n modelLabel: phase.modelLabel,\n })\n }}\n onDelete={() =>\n setPhase({\n type: 'confirm-delete',\n modelName: phase.modelName,\n modelLabel: phase.modelLabel,\n })\n }\n onClose={() => setPhase({ type: 'library' })}\n />\n )\n }\n\n // \u2500\u2500\u2500 Phase: confirm-delete \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (phase.type === 'confirm-delete') {\n return (\n <ConfirmDeletePhase\n modelName={phase.modelName}\n modelLabel={phase.modelLabel}\n statusOverlay={statusOverlay}\n onConfirm={() => {\n try {\n const modelManager = getModelManager()\n modelManager.removeModel(phase.modelName)\n refreshModels()\n showSuccessAndGo(t('commands.model.modelDeleted'), {\n type: 'library',\n })\n } catch {\n setStatusOverlay({\n type: 'error',\n message: t('commands.model.deleteFailed'),\n })\n setTimeout(() => {\n setStatusOverlay(null)\n setPhase({\n type: 'model-actions',\n modelName: phase.modelName,\n modelLabel: phase.modelLabel,\n })\n }, 1500)\n }\n }}\n onCancel={() =>\n setPhase({\n type: 'model-actions',\n modelName: phase.modelName,\n modelLabel: phase.modelLabel,\n })\n }\n />\n )\n }\n\n // \u2500\u2500\u2500 Phase: add-model \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (phase.type === 'add-model') {\n return (\n <ModelSelector\n onDone={() => {\n refreshModels()\n setPhase({ type: 'library' })\n }}\n onCancel={() => setPhase({ type: 'library' })}\n skipModelType={true}\n isOnboarding={false}\n abortController={new AbortController()}\n />\n )\n }\n\n // \u2500\u2500\u2500 Phase: edit-model \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (phase.type === 'edit-model') {\n const modelManager = getModelManager()\n const profile = modelManager\n .getAvailableModels()\n .find(m => m.modelName === phase.modelName)\n if (!profile) {\n // Model not found, go back to library\n setPhase({ type: 'library' })\n return null\n }\n return (\n <ModelSelector\n onDone={() => {\n refreshModels()\n setPhase({ type: 'library' })\n }}\n onCancel={() =>\n setPhase({\n type: 'model-actions',\n modelName: phase.modelName,\n modelLabel: phase.modelLabel,\n })\n }\n skipModelType={true}\n isOnboarding={false}\n abortController={new AbortController()}\n editingModel={profile}\n />\n )\n }\n\n // Fallback (shouldn't happen)\n return null\n}\n\n// =============================================================================\n// Phase Components\n// =============================================================================\n\nfunction MainPhase({\n refreshKey,\n statusOverlay,\n onSelectPointer,\n onManageLibrary,\n onClose,\n}: {\n refreshKey: number\n statusOverlay: StatusOverlay | null\n onSelectPointer: (pointer: ModelPointerType) => void\n onManageLibrary: () => void\n onClose: () => void\n}) {\n const items = useMemo((): SelectorItem[] => {\n const config = getGlobalConfig()\n const modelManager = getModelManager()\n const models = modelManager.getAvailableModels()\n\n const pointerItems: SelectorItem[] = POINTER_TYPES.map(pointer => {\n const assignedModelName = config.modelPointers?.[pointer] || ''\n const model = models.find(m => m.modelName === assignedModelName)\n const description = model\n ? `${model.name} (${model.provider})`\n : getPointerDescription(pointer)\n\n return {\n id: pointer,\n label: POINTER_LABELS[pointer],\n description,\n category: t('commands.model.pointersCategory'),\n statusIcon: model ? '\\u2713' : undefined,\n statusColor: model ? '#4EBA65' : undefined,\n }\n })\n\n const actionItems: SelectorItem[] = [\n {\n id: ID_MANAGE_LIBRARY,\n label: t('commands.model.modelLibrary'),\n description: t('commands.model.modelLibrarySubtitle'),\n category: t('commands.model.actionsCategory'),\n },\n ]\n\n return [...pointerItems, ...actionItems]\n }, [refreshKey])\n\n const handleSelect = useCallback(\n (item: SelectorItem) => {\n if (item.id === ID_MANAGE_LIBRARY) {\n onManageLibrary()\n } else {\n onSelectPointer(item.id as ModelPointerType)\n }\n },\n [onSelectPointer, onManageLibrary],\n )\n\n return (\n <SimpleSelector\n title={t('commands.model.title')}\n items={items}\n onSelect={handleSelect}\n onClose={onClose}\n groupByCategory={true}\n statusOverlay={statusOverlay}\n />\n )\n}\n\nfunction AssignPhase({\n pointer,\n refreshKey,\n statusOverlay,\n onAssign,\n onClear,\n onClose,\n}: {\n pointer: ModelPointerType\n refreshKey: number\n statusOverlay: StatusOverlay | null\n onAssign: (pointer: ModelPointerType, modelName: string) => void\n onClear: (pointer: ModelPointerType) => void\n onClose: () => void\n}) {\n const items = useMemo((): SelectorItem[] => {\n const config = getGlobalConfig()\n const modelManager = getModelManager()\n const models = modelManager.getAvailableModels()\n const currentAssignment = config.modelPointers?.[pointer] || ''\n\n const modelItems: SelectorItem[] = models.map(model => ({\n id: model.modelName,\n label: model.name,\n description: `${model.provider}: ${model.modelName}`,\n isCurrent: model.modelName === currentAssignment,\n }))\n\n // Add \"Clear Assignment\" option if there's a current assignment\n if (currentAssignment) {\n modelItems.push({\n id: ID_CLEAR,\n label: t('commands.model.clearAssignment'),\n statusIcon: '\\u2715',\n statusColor: '#FF6B80',\n })\n }\n\n return modelItems\n }, [pointer, refreshKey])\n\n const handleSelect = useCallback(\n (item: SelectorItem) => {\n if (item.id === ID_CLEAR) {\n onClear(pointer)\n } else {\n onAssign(pointer, item.id)\n }\n },\n [pointer, onAssign, onClear],\n )\n\n return (\n <SimpleSelector\n title={t('commands.model.selectModel').replace(\n '{pointer}',\n POINTER_LABELS[pointer],\n )}\n items={items}\n onSelect={handleSelect}\n onClose={onClose}\n statusOverlay={statusOverlay}\n />\n )\n}\n\nfunction LibraryPhase({\n refreshKey,\n statusOverlay,\n onSelectModel,\n onAddNew,\n onClose,\n}: {\n refreshKey: number\n statusOverlay: StatusOverlay | null\n onSelectModel: (modelName: string, modelLabel: string) => void\n onAddNew: () => void\n onClose: () => void\n}) {\n const items = useMemo((): SelectorItem[] => {\n const config = getGlobalConfig()\n const modelManager = getModelManager()\n const models = modelManager.getAvailableModels()\n\n const modelItems: SelectorItem[] = models.map(model => {\n // Find which pointers use this model\n const usedBy: string[] = []\n POINTER_TYPES.forEach(p => {\n if (config.modelPointers?.[p] === model.modelName) {\n usedBy.push(POINTER_LABELS[p])\n }\n })\n const usageDesc = usedBy.length > 0 ? `[${usedBy.join(', ')}]` : ''\n\n return {\n id: model.modelName,\n label: model.name,\n description: `${model.provider}${usageDesc ? ' ' + usageDesc : ''}`,\n statusIcon: usedBy.length > 0 ? '\\u2713' : undefined,\n statusColor: usedBy.length > 0 ? '#4EBA65' : undefined,\n data: { modelLabel: model.name },\n }\n })\n\n modelItems.push({\n id: ID_ADD_NEW,\n label: t('commands.model.addNewModel'),\n })\n\n return modelItems\n }, [refreshKey])\n\n const handleSelect = useCallback(\n (item: SelectorItem) => {\n if (item.id === ID_ADD_NEW) {\n onAddNew()\n } else {\n const data = item.data as { modelLabel: string } | undefined\n onSelectModel(item.id, data?.modelLabel || item.label)\n }\n },\n [onSelectModel, onAddNew],\n )\n\n return (\n <SimpleSelector\n title={t('commands.model.modelLibrary')}\n subtitle={t('commands.model.modelLibrarySubtitle')}\n items={items}\n onSelect={handleSelect}\n onClose={onClose}\n statusOverlay={statusOverlay}\n />\n )\n}\n\nfunction ModelActionsPhase({\n modelName,\n modelLabel,\n onEdit,\n onDelete,\n onClose,\n}: {\n modelName: string\n modelLabel: string\n onEdit: () => void\n onDelete: () => void\n onClose: () => void\n}) {\n const items: SelectorItem[] = [\n {\n id: ID_EDIT,\n label: t('commands.model.editModel'),\n },\n {\n id: ID_DELETE,\n label: t('common.delete'),\n statusIcon: '\\u2715',\n statusColor: '#FF6B80',\n },\n {\n id: ID_BACK,\n label: t('common.back'),\n },\n ]\n\n const handleSelect = useCallback(\n (item: SelectorItem) => {\n if (item.id === ID_EDIT) {\n onEdit()\n } else if (item.id === ID_DELETE) {\n onDelete()\n } else {\n onClose()\n }\n },\n [onEdit, onDelete, onClose],\n )\n\n return (\n <SimpleSelector\n title={t('commands.model.modelActions').replace('{model}', modelLabel)}\n items={items}\n onSelect={handleSelect}\n onClose={onClose}\n />\n )\n}\n\nfunction ConfirmDeletePhase({\n modelName,\n modelLabel,\n statusOverlay,\n onConfirm,\n onCancel,\n}: {\n modelName: string\n modelLabel: string\n statusOverlay: StatusOverlay | null\n onConfirm: () => void\n onCancel: () => void\n}) {\n const items: SelectorItem[] = [\n {\n id: ID_CONFIRM_YES,\n label: t('commands.model.confirmDeleteYes'),\n statusIcon: '\\u2715',\n statusColor: '#FF6B80',\n },\n {\n id: ID_CONFIRM_NO,\n label: t('commands.model.confirmDeleteNo'),\n },\n ]\n\n const handleSelect = useCallback(\n (item: SelectorItem) => {\n if (item.id === ID_CONFIRM_YES) {\n onConfirm()\n } else {\n onCancel()\n }\n },\n [onConfirm, onCancel],\n )\n\n return (\n <SimpleSelector\n title={t('commands.model.confirmDeleteTitle').replace(\n '{model}',\n modelLabel,\n )}\n items={items}\n onSelect={handleSelect}\n onClose={onCancel}\n statusOverlay={statusOverlay}\n />\n )\n}\n\n// =============================================================================\n// Command Export\n// =============================================================================\n\nconst model: Command = {\n name: 'model',\n description: 'View model status and configure AI provider settings',\n aliases: ['ms', 'modelstatus', 'model-status'],\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n type: 'local-jsx',\n userFacingName() {\n return 'model'\n },\n async call(onDone, context) {\n const { abortController } = context || {}\n return <ModelCommand onClose={onDone} abortController={abortController} />\n },\n}\n\nexport default model\n"],
5
+ "mappings": "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",
6
6
  "names": ["model"]
7
7
  }