@within-7/minto 0.3.6 → 0.3.10

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 (238) hide show
  1. package/{cli.js → cli.cjs} +25 -23
  2. package/dist/commands/agents/AgentsCommand.js +459 -655
  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/export.js +673 -93
  13. package/dist/commands/export.js.map +2 -2
  14. package/dist/commands/language.js +110 -0
  15. package/dist/commands/language.js.map +7 -0
  16. package/dist/commands/mcp-interactive.js +419 -217
  17. package/dist/commands/mcp-interactive.js.map +2 -2
  18. package/dist/commands/model.js +415 -66
  19. package/dist/commands/model.js.map +2 -2
  20. package/dist/commands/new.js +56 -0
  21. package/dist/commands/new.js.map +7 -0
  22. package/dist/commands/permissions.js +75 -49
  23. package/dist/commands/permissions.js.map +2 -2
  24. package/dist/commands/plugin.js +882 -185
  25. package/dist/commands/plugin.js.map +3 -3
  26. package/dist/commands/resume.js +251 -16
  27. package/dist/commands/resume.js.map +2 -2
  28. package/dist/commands/sandbox.js +168 -70
  29. package/dist/commands/sandbox.js.map +2 -2
  30. package/dist/commands/sessions.js +224 -0
  31. package/dist/commands/sessions.js.map +7 -0
  32. package/dist/commands/setup.js +596 -109
  33. package/dist/commands/setup.js.map +2 -2
  34. package/dist/commands/stats.js +292 -0
  35. package/dist/commands/stats.js.map +7 -0
  36. package/dist/commands/status.js +75 -7
  37. package/dist/commands/status.js.map +2 -2
  38. package/dist/commands/undo.js +154 -180
  39. package/dist/commands/undo.js.map +2 -2
  40. package/dist/commands.js +6 -0
  41. package/dist/commands.js.map +2 -2
  42. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
  43. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
  44. package/dist/components/Config.js +9 -8
  45. package/dist/components/Config.js.map +2 -2
  46. package/dist/components/HeaderBar.js +2 -1
  47. package/dist/components/HeaderBar.js.map +2 -2
  48. package/dist/components/Help.js +166 -32
  49. package/dist/components/Help.js.map +2 -2
  50. package/dist/components/HotkeyHelpPanel.js +46 -44
  51. package/dist/components/HotkeyHelpPanel.js.map +2 -2
  52. package/dist/components/InfoPanel/InfoPanel.js +123 -0
  53. package/dist/components/InfoPanel/InfoPanel.js.map +7 -0
  54. package/dist/components/InfoPanel/index.js +5 -0
  55. package/dist/components/InfoPanel/index.js.map +7 -0
  56. package/dist/components/InfoPanel/types.js +1 -0
  57. package/dist/components/InfoPanel/types.js.map +7 -0
  58. package/dist/components/Logo.js +5 -2
  59. package/dist/components/Logo.js.map +2 -2
  60. package/dist/components/MCPServerApprovalDialog.js +6 -5
  61. package/dist/components/MCPServerApprovalDialog.js.map +2 -2
  62. package/dist/components/MCPServerMultiselectDialog.js +5 -4
  63. package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
  64. package/dist/components/MessageSelector.js +4 -3
  65. package/dist/components/MessageSelector.js.map +2 -2
  66. package/dist/components/ModelConfig.js +13 -12
  67. package/dist/components/ModelConfig.js.map +2 -2
  68. package/dist/components/ModelListManager.js +4 -3
  69. package/dist/components/ModelListManager.js.map +2 -2
  70. package/dist/components/ModelSelector/BrandTextInput.js +43 -0
  71. package/dist/components/ModelSelector/BrandTextInput.js.map +7 -0
  72. package/dist/components/ModelSelector/ModelSelector.js +419 -501
  73. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  74. package/dist/components/ModelSelector/WizardContainer.js +45 -0
  75. package/dist/components/ModelSelector/WizardContainer.js.map +7 -0
  76. package/dist/components/ModelSelector/index.js +1 -3
  77. package/dist/components/ModelSelector/index.js.map +2 -2
  78. package/dist/components/PromptInput.js +77 -44
  79. package/dist/components/PromptInput.js.map +2 -2
  80. package/dist/components/SensitiveFileWarning.js +12 -8
  81. package/dist/components/SensitiveFileWarning.js.map +2 -2
  82. package/dist/components/SimpleSelector/SimpleSelector.js +154 -0
  83. package/dist/components/SimpleSelector/SimpleSelector.js.map +7 -0
  84. package/dist/components/SimpleSelector/index.js +5 -0
  85. package/dist/components/SimpleSelector/index.js.map +7 -0
  86. package/dist/components/SimpleSelector/types.js +1 -0
  87. package/dist/components/SimpleSelector/types.js.map +7 -0
  88. package/dist/components/StatusOverlayContent.js +21 -0
  89. package/dist/components/StatusOverlayContent.js.map +7 -0
  90. package/dist/components/TabbedListView/ScrollableList.js +117 -0
  91. package/dist/components/TabbedListView/ScrollableList.js.map +7 -0
  92. package/dist/components/TabbedListView/SearchInput.js +23 -0
  93. package/dist/components/TabbedListView/SearchInput.js.map +7 -0
  94. package/dist/components/TabbedListView/TabBar.js +20 -0
  95. package/dist/components/TabbedListView/TabBar.js.map +7 -0
  96. package/dist/components/TabbedListView/TabbedListView.js +246 -0
  97. package/dist/components/TabbedListView/TabbedListView.js.map +7 -0
  98. package/dist/components/TabbedListView/index.js +11 -0
  99. package/dist/components/TabbedListView/index.js.map +7 -0
  100. package/dist/components/TabbedListView/types.js +1 -0
  101. package/dist/components/TabbedListView/types.js.map +7 -0
  102. package/dist/components/TodoChangeBlock.js +6 -5
  103. package/dist/components/TodoChangeBlock.js.map +3 -3
  104. package/dist/components/TodoPanel.js +6 -3
  105. package/dist/components/TodoPanel.js.map +3 -3
  106. package/dist/components/TrustDialog.js +6 -5
  107. package/dist/components/TrustDialog.js.map +2 -2
  108. package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js +2 -1
  109. package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js.map +2 -2
  110. package/dist/constants/macros.js +1 -1
  111. package/dist/constants/macros.js.map +1 -1
  112. package/dist/constants/product.js +2 -2
  113. package/dist/constants/product.js.map +1 -1
  114. package/dist/constants/prompts.js +17 -0
  115. package/dist/constants/prompts.js.map +2 -2
  116. package/dist/constants/toolInputExamples.js +5 -1
  117. package/dist/constants/toolInputExamples.js.map +2 -2
  118. package/dist/core/backupHook.js +29 -0
  119. package/dist/core/backupHook.js.map +7 -0
  120. package/dist/core/config/defaults.js +8 -2
  121. package/dist/core/config/defaults.js.map +2 -2
  122. package/dist/core/config/schema.js +14 -2
  123. package/dist/core/config/schema.js.map +2 -2
  124. package/dist/core/costTracker.js +0 -16
  125. package/dist/core/costTracker.js.map +2 -2
  126. package/dist/core/tokenStatsManager.js +5 -0
  127. package/dist/core/tokenStatsManager.js.map +2 -2
  128. package/dist/cost-tracker.js +0 -16
  129. package/dist/cost-tracker.js.map +2 -2
  130. package/dist/entrypoints/bootstrap.js +56 -0
  131. package/dist/entrypoints/bootstrap.js.map +7 -0
  132. package/dist/entrypoints/cli.js +164 -23
  133. package/dist/entrypoints/cli.js.map +3 -3
  134. package/dist/history.js +75 -15
  135. package/dist/history.js.map +2 -2
  136. package/dist/i18n/index.js +2 -2
  137. package/dist/i18n/index.js.map +2 -2
  138. package/dist/i18n/locales/en.js +582 -1
  139. package/dist/i18n/locales/en.js.map +2 -2
  140. package/dist/i18n/locales/zh-CN.js +582 -1
  141. package/dist/i18n/locales/zh-CN.js.map +2 -2
  142. package/dist/i18n/types.js.map +1 -1
  143. package/dist/index.js +1 -1
  144. package/dist/index.js.map +2 -2
  145. package/dist/messages.js +11 -0
  146. package/dist/messages.js.map +2 -2
  147. package/dist/permissions.js.map +2 -2
  148. package/dist/query.js +9 -0
  149. package/dist/query.js.map +2 -2
  150. package/dist/screens/REPL.js +45 -7
  151. package/dist/screens/REPL.js.map +2 -2
  152. package/dist/services/customCommands.js +44 -16
  153. package/dist/services/customCommands.js.map +2 -2
  154. package/dist/services/plugins/lspServers.js +1 -1
  155. package/dist/services/plugins/lspServers.js.map +2 -2
  156. package/dist/services/plugins/pluginRuntime.js +2 -1
  157. package/dist/services/plugins/pluginRuntime.js.map +2 -2
  158. package/dist/services/plugins/pluginValidation.js +10 -3
  159. package/dist/services/plugins/pluginValidation.js.map +2 -2
  160. package/dist/services/plugins/skillMarketplace.js +16 -8
  161. package/dist/services/plugins/skillMarketplace.js.map +2 -2
  162. package/dist/services/systemReminder.js +17 -6
  163. package/dist/services/systemReminder.js.map +2 -2
  164. package/dist/tools/FileEditTool/FileEditTool.js +7 -0
  165. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  166. package/dist/tools/FileWriteTool/FileWriteTool.js +7 -0
  167. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  168. package/dist/tools/MultiEditTool/MultiEditTool.js +7 -0
  169. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  170. package/dist/tools/NotebookEditTool/NotebookEditTool.js +2 -0
  171. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  172. package/dist/tools/TaskTool/TaskTool.js +179 -1
  173. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  174. package/dist/tools/TodoWriteTool/prompt.js +21 -0
  175. package/dist/tools/TodoWriteTool/prompt.js.map +2 -2
  176. package/dist/tools/URLFetcherTool/prompt.js +14 -9
  177. package/dist/tools/URLFetcherTool/prompt.js.map +2 -2
  178. package/dist/tools/WebSearchTool/prompt.js +12 -6
  179. package/dist/tools/WebSearchTool/prompt.js.map +2 -2
  180. package/dist/types/PermissionMode.js +30 -1
  181. package/dist/types/PermissionMode.js.map +2 -2
  182. package/dist/types/plugin.js +2 -4
  183. package/dist/types/plugin.js.map +2 -2
  184. package/dist/utils/agentHookExecutor.js +103 -0
  185. package/dist/utils/agentHookExecutor.js.map +7 -0
  186. package/dist/utils/agentLoader.js +272 -32
  187. package/dist/utils/agentLoader.js.map +2 -2
  188. package/dist/utils/agentMemory.js +134 -0
  189. package/dist/utils/agentMemory.js.map +7 -0
  190. package/dist/utils/claudeCodeSync.js +439 -0
  191. package/dist/utils/claudeCodeSync.js.map +7 -0
  192. package/dist/utils/config.js +52 -24
  193. package/dist/utils/config.js.map +2 -2
  194. package/dist/utils/configPaths.js +199 -0
  195. package/dist/utils/configPaths.js.map +7 -0
  196. package/dist/utils/execFileNoThrow.js +2 -1
  197. package/dist/utils/execFileNoThrow.js.map +2 -2
  198. package/dist/utils/historyManager.js +234 -0
  199. package/dist/utils/historyManager.js.map +7 -0
  200. package/dist/utils/marketplaceManager.js +80 -43
  201. package/dist/utils/marketplaceManager.js.map +2 -2
  202. package/dist/utils/messages.js +13 -8
  203. package/dist/utils/messages.js.map +2 -2
  204. package/dist/utils/migration/index.js +37 -0
  205. package/dist/utils/migration/index.js.map +7 -0
  206. package/dist/utils/migration/migrateHistory.js +273 -0
  207. package/dist/utils/migration/migrateHistory.js.map +7 -0
  208. package/dist/utils/migration/migrateTodos.js +323 -0
  209. package/dist/utils/migration/migrateTodos.js.map +7 -0
  210. package/dist/utils/pasteCache.js +309 -0
  211. package/dist/utils/pasteCache.js.map +7 -0
  212. package/dist/utils/pluginInstaller.js +34 -24
  213. package/dist/utils/pluginInstaller.js.map +2 -2
  214. package/dist/utils/pluginLoader.js +54 -28
  215. package/dist/utils/pluginLoader.js.map +2 -2
  216. package/dist/utils/repoFetcher.js +110 -0
  217. package/dist/utils/repoFetcher.js.map +7 -0
  218. package/dist/utils/sessionIndex.js +192 -0
  219. package/dist/utils/sessionIndex.js.map +7 -0
  220. package/dist/utils/sessionTracker.js +170 -0
  221. package/dist/utils/sessionTracker.js.map +7 -0
  222. package/dist/utils/skillLoader.js +103 -5
  223. package/dist/utils/skillLoader.js.map +2 -2
  224. package/dist/utils/stats.js +417 -0
  225. package/dist/utils/stats.js.map +7 -0
  226. package/dist/utils/stringSubstitution.js +106 -0
  227. package/dist/utils/stringSubstitution.js.map +7 -0
  228. package/dist/utils/teamConfig.js +156 -14
  229. package/dist/utils/teamConfig.js.map +2 -2
  230. package/dist/utils/terminal.js +1 -1
  231. package/dist/utils/terminal.js.map +2 -2
  232. package/dist/utils/todoStorage.js +51 -19
  233. package/dist/utils/todoStorage.js.map +2 -2
  234. package/dist/utils/tooling/safeRender.js.map +2 -2
  235. package/dist/version.js +2 -2
  236. package/dist/version.js.map +1 -1
  237. package/package.json +71 -28
  238. package/scripts/{postinstall.js → postinstall.cjs} +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/setup.tsx"],
4
- "sourcesContent": ["/**\n * Setup Command\n *\n * Initialize Minto with a team configuration from a remote URL or local file\n */\n\nimport React from 'react'\nimport { Text, Box } from 'ink'\nimport { SimpleSpinner } from '@components/Spinner'\nimport type { Command } from '@commands'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport {\n fetchTeamConfig,\n loadTeamConfigFromFile,\n applyTeamConfig,\n addMarketplaces,\n installPlugins,\n installRemoteAgents,\n installInlineAgents,\n installTeamHooks,\n type MergeStrategy,\n} from '@utils/teamConfig'\n\ntype SetupProps = {\n source: string // URL or file path\n strategy?: MergeStrategy\n installPlugins?: boolean\n onDone: (result?: string) => void\n}\n\ntype SetupState =\n | { stage: 'loading' }\n | { stage: 'applying' }\n | { stage: 'adding-marketplaces'; total: number }\n | { stage: 'installing-plugins'; total: number }\n | { stage: 'installing-agents'; total: number }\n | { stage: 'installing-hooks' }\n | {\n stage: 'success'\n modelsAdded: number\n mcpServersAdded: number\n settingsUpdated: string[]\n marketplacesAdded?: number\n pluginsInstalled?: number\n agentsInstalled?: number\n hooksInstalled?: boolean\n instructions?: string\n }\n | { stage: 'error'; message: string }\n\nexport function SetupComponent({\n source,\n strategy = 'merge',\n installPlugins: shouldInstallPlugins = true,\n onDone,\n}: SetupProps) {\n const [state, setState] = React.useState<SetupState>({ stage: 'loading' })\n\n React.useEffect(() => {\n async function init() {\n try {\n // Step 1: Load configuration\n setState({ stage: 'loading' })\n\n const teamConfig =\n source.startsWith('http://') || source.startsWith('https://')\n ? await fetchTeamConfig(source)\n : loadTeamConfigFromFile(source)\n\n // Step 2: Apply configuration\n setState({ stage: 'applying' })\n\n const result = applyTeamConfig(teamConfig, strategy)\n\n // Step 3: Add marketplaces (if configured)\n let marketplacesAdded = 0\n if (shouldInstallPlugins && teamConfig.plugins?.marketplaces) {\n const marketplaceCount = teamConfig.plugins.marketplaces.length\n setState({ stage: 'adding-marketplaces', total: marketplaceCount })\n\n const marketplaceResult = await addMarketplaces(\n teamConfig.plugins.marketplaces,\n )\n\n marketplacesAdded = marketplaceResult.added\n }\n\n // Step 4: Install plugins (if configured)\n let pluginsInstalled = 0\n if (shouldInstallPlugins && teamConfig.plugins?.install) {\n const pluginCount = teamConfig.plugins.install.length\n setState({ stage: 'installing-plugins', total: pluginCount })\n\n const pluginResult = await installPlugins(teamConfig.plugins.install)\n\n pluginsInstalled = pluginResult.installed\n }\n\n // Step 5: Install agents (if configured)\n let agentsInstalled = 0\n if (shouldInstallPlugins && teamConfig.agents) {\n const remoteCount = teamConfig.agents.remoteAgents?.length || 0\n const inlineCount = teamConfig.agents.inlineAgents?.length || 0\n const totalAgents = remoteCount + inlineCount\n\n if (totalAgents > 0) {\n setState({ stage: 'installing-agents', total: totalAgents })\n\n if (teamConfig.agents.remoteAgents) {\n const remoteResult = await installRemoteAgents(\n teamConfig.agents.remoteAgents,\n )\n agentsInstalled += remoteResult.installed\n }\n\n if (teamConfig.agents.inlineAgents) {\n const inlineResult = await installInlineAgents(\n teamConfig.agents.inlineAgents,\n )\n agentsInstalled += inlineResult.installed\n }\n }\n }\n\n // Step 6: Install hooks (if configured)\n let hooksInstalled = false\n if (shouldInstallPlugins && teamConfig.hooks) {\n setState({ stage: 'installing-hooks' })\n const hookResult = await installTeamHooks(teamConfig.hooks)\n hooksInstalled = hookResult.installed\n }\n\n // Success\n setState({\n stage: 'success',\n modelsAdded: result.modelsAdded,\n mcpServersAdded: result.mcpServersAdded,\n settingsUpdated: result.settingsUpdated,\n marketplacesAdded:\n marketplacesAdded > 0 ? marketplacesAdded : undefined,\n pluginsInstalled: pluginsInstalled > 0 ? pluginsInstalled : undefined,\n agentsInstalled: agentsInstalled > 0 ? agentsInstalled : undefined,\n hooksInstalled: hooksInstalled || undefined,\n instructions: teamConfig.postInstallInstructions,\n })\n\n // Notify parent component\n setTimeout(() => onDone('Configuration applied successfully'), 2000)\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error)\n setState({\n stage: 'error',\n message: errorMessage,\n })\n\n // Notify parent component of error\n setTimeout(() => onDone(), 2000)\n }\n }\n\n init()\n }, [source, strategy, shouldInstallPlugins, onDone])\n\n if (state.stage === 'loading') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Loading configuration from {source}...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'applying') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Applying configuration...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'adding-marketplaces') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Adding {state.total} marketplace\n {state.total !== 1 ? 's' : ''}...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'installing-plugins') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Installing {state.total} plugin\n {state.total !== 1 ? 's' : ''}...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'installing-agents') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Installing {state.total} agent\n {state.total !== 1 ? 's' : ''}...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'installing-hooks') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Installing hooks...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'error') {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"red\">\u2717 Initialization failed</Text>\n <Text color=\"red\">{state.message}</Text>\n </Box>\n )\n }\n\n // Success state\n return (\n <Box flexDirection=\"column\" paddingY={1}>\n <Text color=\"green\" bold>\n \u2713 Configuration applied successfully!\n </Text>\n\n <Box flexDirection=\"column\" paddingTop={1}>\n {state.modelsAdded > 0 && (\n <Text>\n \u2022 Added <Text color=\"cyan\">{state.modelsAdded}</Text> model profile\n {state.modelsAdded !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.mcpServersAdded > 0 && (\n <Text>\n \u2022 Added <Text color=\"cyan\">{state.mcpServersAdded}</Text> MCP server\n {state.mcpServersAdded !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.settingsUpdated.length > 0 && (\n <Text>\n \u2022 Updated <Text color=\"cyan\">{state.settingsUpdated.length}</Text>{' '}\n setting\n {state.settingsUpdated.length !== 1 ? 's' : ''}:{' '}\n {state.settingsUpdated.join(', ')}\n </Text>\n )}\n\n {state.marketplacesAdded !== undefined &&\n state.marketplacesAdded > 0 && (\n <Text>\n \u2022 Added <Text color=\"cyan\">{state.marketplacesAdded}</Text>{' '}\n marketplace\n {state.marketplacesAdded !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.pluginsInstalled !== undefined && state.pluginsInstalled > 0 && (\n <Text>\n \u2022 Installed <Text color=\"cyan\">{state.pluginsInstalled}</Text>{' '}\n plugin\n {state.pluginsInstalled !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.agentsInstalled !== undefined && state.agentsInstalled > 0 && (\n <Text>\n \u2022 Installed <Text color=\"cyan\">{state.agentsInstalled}</Text> agent\n {state.agentsInstalled !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.hooksInstalled && (\n <Text>\n \u2022 Installed <Text color=\"cyan\">hooks</Text> configuration\n </Text>\n )}\n </Box>\n\n {state.instructions && (\n <Box\n flexDirection=\"column\"\n paddingTop={1}\n borderStyle=\"round\"\n borderColor=\"yellow\"\n paddingX={1}\n >\n <Text color=\"yellow\" bold>\n \uD83D\uDCCB Next Steps:\n </Text>\n <Text>{state.instructions}</Text>\n </Box>\n )}\n\n <Box paddingTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n Run <Text color=\"cyan\">minto</Text> to start using your configured\n setup.\n </Text>\n </Box>\n </Box>\n )\n}\n\n// Command definition\nconst command = {\n type: 'local-jsx',\n name: 'setup',\n description: 'Initialize Minto with team configuration from a URL or file',\n isEnabled: true,\n isHidden: false,\n userFacingName() {\n return 'setup'\n },\n async call(onDone, _context) {\n // Parse arguments\n const args = process.argv.slice(2)\n const fromIndex = args.findIndex(arg => arg === '--from')\n const strategyIndex = args.findIndex(arg => arg === '--strategy')\n const noPluginsFlag = args.includes('--no-plugins')\n\n if (fromIndex === -1 || !args[fromIndex + 1]) {\n onDone()\n return (\n <Box flexDirection=\"column\">\n <Text color=\"red\">Error: --from parameter is required</Text>\n <Text>\n Usage: minto setup --from &lt;url|path&gt; [--strategy\n &lt;merge|replace|skip-existing&gt;] [--no-plugins]\n </Text>\n </Box>\n )\n }\n\n const source = args[fromIndex + 1]\n const strategy: MergeStrategy =\n strategyIndex !== -1 && args[strategyIndex + 1]\n ? (args[strategyIndex + 1] as MergeStrategy)\n : 'merge'\n const shouldInstallPlugins = !noPluginsFlag\n\n return (\n <SetupComponent\n source={source}\n strategy={strategy}\n installPlugins={shouldInstallPlugins}\n onDone={onDone}\n />\n )\n },\n} satisfies Command\n\nexport default command\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Setup Command\n *\n * Initialize Minto with a team configuration from a remote URL or local file.\n * Uses TabbedListView for configuration preview before applying.\n *\n * Supports scope-aware installation:\n * - userInstall/userAgents/userSkills/userCommands \u2192 ~/.minto/\n * - projectInstall/projectAgents/projectSkills/projectCommands \u2192 ./.minto/\n * - v1.0 compat: install/inlineAgents \u2192 ~/.minto/ (user scope)\n *\n * Flow: loading \u2192 preview (TabbedListView) \u2192 installing (statusOverlay) \u2192 done\n */\n\nimport React, { useState, useCallback, useMemo } from 'react'\nimport { Text, Box } from 'ink'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { SimpleSpinner } from '@components/Spinner'\nimport type { Command } from '@commands'\nimport { t } from '@i18n'\nimport { getCwd } from '@utils/state'\nimport { TabbedListView } from '@components/TabbedListView/TabbedListView'\nimport type {\n ListItem,\n TabDefinition,\n StatusOverlay,\n} from '@components/TabbedListView/types'\nimport {\n fetchTeamConfig,\n loadTeamConfigFromFile,\n applyTeamConfig,\n addMarketplaces,\n installPlugins,\n installRemoteAgents,\n installInlineAgents,\n installTeamHooks,\n installInlineSkills,\n installInlineCommands,\n type TeamConfig,\n type MergeStrategy,\n} from '@utils/teamConfig'\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype SetupPhase = 'loading' | 'preview' | 'installing'\n\ninterface SetupProps {\n source: string\n strategy?: MergeStrategy\n installPlugins?: boolean\n onDone: (result?: string) => void\n}\n\n// ============================================================================\n// Helper: count hooks in a TeamHooksConfig\n// ============================================================================\n\nfunction countHooks(hooks: TeamConfig['hooks']): number {\n if (!hooks) return 0\n return (\n (hooks.sessionStart?.length || 0) +\n (hooks.sessionEnd?.length || 0) +\n (hooks.userPromptSubmit?.length || 0) +\n (hooks.preToolUse?.length || 0) +\n (hooks.postToolUse?.length || 0)\n )\n}\n\n// ============================================================================\n// Preview Tab/Item builders\n// ============================================================================\n\nfunction buildTabs(config: TeamConfig): TabDefinition[] {\n const tabs: TabDefinition[] = [\n { id: 'overview', label: t('commands.setup.tabOverview') },\n ]\n\n if (config.models?.profiles && config.models.profiles.length > 0) {\n tabs.push({\n id: 'models',\n label: t('commands.setup.tabModels'),\n badge: config.models.profiles.length,\n })\n }\n\n if (config.mcpServers && Object.keys(config.mcpServers).length > 0) {\n tabs.push({\n id: 'mcp',\n label: t('commands.setup.tabMcp'),\n badge: Object.keys(config.mcpServers).length,\n })\n }\n\n // Plugins: count all variants\n const pluginCount =\n (config.plugins?.install?.length || 0) +\n (config.plugins?.userInstall?.length || 0) +\n (config.plugins?.projectInstall?.length || 0) +\n (config.plugins?.marketplaces?.length || 0)\n if (pluginCount > 0) {\n tabs.push({\n id: 'plugins',\n label: t('commands.setup.tabPlugins'),\n badge: pluginCount,\n })\n }\n\n // Agents: count all variants\n const agentCount =\n (config.agents?.remoteAgents?.length || 0) +\n (config.agents?.inlineAgents?.length || 0) +\n (config.agents?.userAgents?.length || 0) +\n (config.agents?.projectAgents?.length || 0)\n if (agentCount > 0) {\n tabs.push({\n id: 'agents',\n label: t('commands.setup.tabAgents'),\n badge: agentCount,\n })\n }\n\n // Skills\n const skillCount =\n (config.skills?.userSkills?.length || 0) +\n (config.skills?.projectSkills?.length || 0)\n if (skillCount > 0) {\n tabs.push({\n id: 'skills',\n label: t('commands.setup.tabSkills'),\n badge: skillCount,\n })\n }\n\n // Commands\n const commandCount =\n (config.commands?.userCommands?.length || 0) +\n (config.commands?.projectCommands?.length || 0)\n if (commandCount > 0) {\n tabs.push({\n id: 'commands',\n label: t('commands.setup.tabCommands'),\n badge: commandCount,\n })\n }\n\n // Hooks: count user + project hooks\n const hookCount = countHooks(config.hooks) + countHooks(config.projectHooks)\n if (hookCount > 0) {\n tabs.push({\n id: 'hooks',\n label: t('commands.setup.tabHooks'),\n badge: hookCount,\n })\n }\n\n if (config.settings && Object.keys(config.settings).length > 0) {\n tabs.push({\n id: 'settings',\n label: t('commands.setup.tabSettings'),\n badge: Object.keys(config.settings).length,\n })\n }\n\n return tabs\n}\n\nfunction buildItems(tabId: string, config: TeamConfig): ListItem[] {\n switch (tabId) {\n case 'overview': {\n const items: ListItem[] = [\n {\n id: 'name',\n label: config.name || 'Team Configuration',\n description: config.description,\n category: 'Info',\n },\n ]\n\n if (config.scope) {\n items.push({\n id: 'overview-scope',\n label: `Scope: ${config.scope}`,\n category: 'Info',\n })\n }\n\n const modelCount = config.models?.profiles?.length || 0\n if (modelCount > 0) {\n items.push({\n id: 'overview-models',\n label: `${modelCount} model profile${modelCount !== 1 ? 's' : ''}`,\n category: 'Summary',\n })\n }\n\n const mcpCount = config.mcpServers\n ? Object.keys(config.mcpServers).length\n : 0\n if (mcpCount > 0) {\n items.push({\n id: 'overview-mcp',\n label: `${mcpCount} MCP server${mcpCount !== 1 ? 's' : ''}`,\n category: 'Summary',\n })\n }\n\n const pluginCount =\n (config.plugins?.install?.length || 0) +\n (config.plugins?.userInstall?.length || 0) +\n (config.plugins?.projectInstall?.length || 0)\n if (pluginCount > 0) {\n items.push({\n id: 'overview-plugins',\n label: `${pluginCount} plugin${pluginCount !== 1 ? 's' : ''}`,\n category: 'Summary',\n })\n }\n\n const agentCount =\n (config.agents?.remoteAgents?.length || 0) +\n (config.agents?.inlineAgents?.length || 0) +\n (config.agents?.userAgents?.length || 0) +\n (config.agents?.projectAgents?.length || 0)\n if (agentCount > 0) {\n items.push({\n id: 'overview-agents',\n label: `${agentCount} agent${agentCount !== 1 ? 's' : ''}`,\n category: 'Summary',\n })\n }\n\n const skillCount =\n (config.skills?.userSkills?.length || 0) +\n (config.skills?.projectSkills?.length || 0)\n if (skillCount > 0) {\n items.push({\n id: 'overview-skills',\n label: `${skillCount} skill${skillCount !== 1 ? 's' : ''}`,\n category: 'Summary',\n })\n }\n\n const commandCount =\n (config.commands?.userCommands?.length || 0) +\n (config.commands?.projectCommands?.length || 0)\n if (commandCount > 0) {\n items.push({\n id: 'overview-commands',\n label: `${commandCount} command${commandCount !== 1 ? 's' : ''}`,\n category: 'Summary',\n })\n }\n\n return items\n }\n\n case 'models':\n return (config.models?.profiles || []).map((p, i) => ({\n id: `model-${i}`,\n label: p.name,\n description: `${p.provider} / ${p.modelName}`,\n status: p.isActive ? ('enabled' as const) : ('disabled' as const),\n }))\n\n case 'mcp':\n return Object.entries(config.mcpServers || {}).map(([name, server]) => ({\n id: `mcp-${name}`,\n label: name,\n description:\n server.type === 'sse'\n ? `SSE: ${server.url}`\n : `stdio: ${server.command}`,\n status:\n server.enabled !== false\n ? ('enabled' as const)\n : ('disabled' as const),\n }))\n\n case 'plugins': {\n const items: ListItem[] = []\n for (const mp of config.plugins?.marketplaces || []) {\n items.push({\n id: `mp-${mp}`,\n label: mp,\n description: 'Marketplace source',\n category: 'Marketplaces',\n })\n }\n // v1.0 compat\n for (const p of config.plugins?.install || []) {\n items.push({\n id: `plugin-${p}`,\n label: p,\n description: 'Plugin \u2192 User',\n category: 'User',\n })\n }\n for (const p of config.plugins?.userInstall || []) {\n items.push({\n id: `plugin-user-${p}`,\n label: p,\n description: 'Plugin \u2192 User',\n category: 'User',\n })\n }\n for (const p of config.plugins?.projectInstall || []) {\n items.push({\n id: `plugin-project-${p}`,\n label: p,\n description: 'Plugin \u2192 Project',\n category: 'Project',\n })\n }\n return items\n }\n\n case 'agents': {\n const items: ListItem[] = []\n for (const a of config.agents?.remoteAgents || []) {\n items.push({\n id: `remote-agent-${a}`,\n label: a,\n description: 'Remote agent URL',\n category: 'Remote',\n })\n }\n // v1.0 compat\n for (const a of config.agents?.inlineAgents || []) {\n items.push({\n id: `inline-agent-${a.name}`,\n label: a.name,\n description: a.description,\n category: 'User',\n })\n }\n for (const a of config.agents?.userAgents || []) {\n items.push({\n id: `user-agent-${a.name}`,\n label: a.name,\n description: a.description,\n category: 'User',\n })\n }\n for (const a of config.agents?.projectAgents || []) {\n items.push({\n id: `project-agent-${a.name}`,\n label: a.name,\n description: a.description,\n category: 'Project',\n })\n }\n return items\n }\n\n case 'skills': {\n const items: ListItem[] = []\n for (const s of config.skills?.userSkills || []) {\n items.push({\n id: `skill-user-${s.name}`,\n label: s.name,\n description: s.description,\n category: 'User',\n })\n }\n for (const s of config.skills?.projectSkills || []) {\n items.push({\n id: `skill-project-${s.name}`,\n label: s.name,\n description: s.description,\n category: 'Project',\n })\n }\n return items\n }\n\n case 'commands': {\n const items: ListItem[] = []\n for (const c of config.commands?.userCommands || []) {\n items.push({\n id: `cmd-user-${c.name}`,\n label: c.name,\n description: c.description,\n category: 'User',\n })\n }\n for (const c of config.commands?.projectCommands || []) {\n items.push({\n id: `cmd-project-${c.name}`,\n label: c.name,\n description: c.description,\n category: 'Project',\n })\n }\n return items\n }\n\n case 'hooks': {\n const items: ListItem[] = []\n const addHooks = (\n hookList: unknown[] | undefined,\n category: string,\n prefix: string,\n ) => {\n if (!hookList) return\n for (let i = 0; i < hookList.length; i++) {\n const h = hookList[i] as { type?: string; command?: string }\n items.push({\n id: `hook-${prefix}-${category}-${i}`,\n label: h.type || h.command || `Hook ${i + 1}`,\n description: h.command,\n category,\n })\n }\n }\n // User hooks\n if (config.hooks) {\n addHooks(config.hooks.sessionStart, 'User \u00B7 Session Start', 'user')\n addHooks(config.hooks.sessionEnd, 'User \u00B7 Session End', 'user')\n addHooks(\n config.hooks.userPromptSubmit,\n 'User \u00B7 User Prompt Submit',\n 'user',\n )\n addHooks(config.hooks.preToolUse, 'User \u00B7 Pre Tool Use', 'user')\n addHooks(config.hooks.postToolUse, 'User \u00B7 Post Tool Use', 'user')\n }\n // Project hooks\n if (config.projectHooks) {\n addHooks(\n config.projectHooks.sessionStart,\n 'Project \u00B7 Session Start',\n 'project',\n )\n addHooks(\n config.projectHooks.sessionEnd,\n 'Project \u00B7 Session End',\n 'project',\n )\n addHooks(\n config.projectHooks.userPromptSubmit,\n 'Project \u00B7 User Prompt Submit',\n 'project',\n )\n addHooks(\n config.projectHooks.preToolUse,\n 'Project \u00B7 Pre Tool Use',\n 'project',\n )\n addHooks(\n config.projectHooks.postToolUse,\n 'Project \u00B7 Post Tool Use',\n 'project',\n )\n }\n return items\n }\n\n case 'settings':\n return Object.entries(config.settings || {}).map(([key, value]) => ({\n id: `setting-${key}`,\n label: key,\n description: String(value),\n }))\n\n default:\n return []\n }\n}\n\n// ============================================================================\n// Install logic \u2014 scope-aware with v1.0 backward compatibility\n// ============================================================================\n\nasync function runInstall(\n config: TeamConfig,\n strategy: MergeStrategy,\n shouldInstallPlugins: boolean,\n onProgress: (message: string) => void,\n): Promise<string> {\n const cwd = getCwd()\n const home = homedir()\n const userDir = join(home, '.minto')\n const projectDir = join(cwd, '.minto')\n\n // Step 1: Apply configuration (settings/models/MCP \u2192 globalConfig)\n onProgress(t('commands.setup.applying'))\n const result = applyTeamConfig(config, strategy)\n\n const summary: string[] = []\n\n if (result.modelsAdded > 0) {\n summary.push(\n `${result.modelsAdded} model${result.modelsAdded !== 1 ? 's' : ''}`,\n )\n }\n if (result.mcpServersAdded > 0) {\n summary.push(\n `${result.mcpServersAdded} MCP server${result.mcpServersAdded !== 1 ? 's' : ''}`,\n )\n }\n if (result.settingsUpdated.length > 0) {\n summary.push(\n `${result.settingsUpdated.length} setting${result.settingsUpdated.length !== 1 ? 's' : ''}`,\n )\n }\n\n if (shouldInstallPlugins) {\n // Step 2: Marketplaces (always global)\n if (\n config.plugins?.marketplaces &&\n config.plugins.marketplaces.length > 0\n ) {\n onProgress(t('commands.setup.addingMarketplaces'))\n const mpResult = await addMarketplaces(config.plugins.marketplaces)\n if (mpResult.added > 0) {\n summary.push(\n `${mpResult.added} marketplace${mpResult.added !== 1 ? 's' : ''}`,\n )\n }\n }\n\n // Step 3: Plugins \u2014 scope-aware\n let pluginsInstalled = 0\n\n // v1.0 compat: install \u2192 user scope\n if (config.plugins?.install && config.plugins.install.length > 0) {\n onProgress(t('commands.setup.installingPlugins'))\n const r = await installPlugins(\n config.plugins.install,\n join(userDir, 'plugins'),\n )\n pluginsInstalled += r.installed\n }\n // User plugins\n if (config.plugins?.userInstall && config.plugins.userInstall.length > 0) {\n onProgress(t('commands.setup.installingPlugins'))\n const r = await installPlugins(\n config.plugins.userInstall,\n join(userDir, 'plugins'),\n )\n pluginsInstalled += r.installed\n }\n // Project plugins\n if (\n config.plugins?.projectInstall &&\n config.plugins.projectInstall.length > 0\n ) {\n onProgress(t('commands.setup.installingProjectPlugins'))\n const r = await installPlugins(\n config.plugins.projectInstall,\n join(projectDir, 'plugins'),\n )\n pluginsInstalled += r.installed\n }\n if (pluginsInstalled > 0) {\n summary.push(\n `${pluginsInstalled} plugin${pluginsInstalled !== 1 ? 's' : ''}`,\n )\n }\n\n // Step 4: Agents \u2014 scope-aware\n let agentsInstalled = 0\n\n if (config.agents) {\n if (config.agents.remoteAgents && config.agents.remoteAgents.length > 0) {\n onProgress(t('commands.setup.installingAgents'))\n const r = await installRemoteAgents(\n config.agents.remoteAgents,\n join(userDir, 'agents'),\n )\n agentsInstalled += r.installed\n }\n // v1.0 compat: inlineAgents \u2192 user scope\n if (config.agents.inlineAgents && config.agents.inlineAgents.length > 0) {\n onProgress(t('commands.setup.installingAgents'))\n const r = await installInlineAgents(\n config.agents.inlineAgents,\n join(userDir, 'agents'),\n )\n agentsInstalled += r.installed\n }\n // User agents\n if (config.agents.userAgents && config.agents.userAgents.length > 0) {\n onProgress(t('commands.setup.installingAgents'))\n const r = await installInlineAgents(\n config.agents.userAgents,\n join(userDir, 'agents'),\n )\n agentsInstalled += r.installed\n }\n // Project agents\n if (\n config.agents.projectAgents &&\n config.agents.projectAgents.length > 0\n ) {\n onProgress(t('commands.setup.installingAgents'))\n const r = await installInlineAgents(\n config.agents.projectAgents,\n join(projectDir, 'agents'),\n )\n agentsInstalled += r.installed\n }\n }\n if (agentsInstalled > 0) {\n summary.push(\n `${agentsInstalled} agent${agentsInstalled !== 1 ? 's' : ''}`,\n )\n }\n\n // Step 5: Skills \u2014 scope-aware\n let skillsInstalled = 0\n\n if (config.skills) {\n if (config.skills.userSkills && config.skills.userSkills.length > 0) {\n onProgress(t('commands.setup.installingSkills'))\n const r = await installInlineSkills(\n config.skills.userSkills,\n join(userDir, 'skills'),\n )\n skillsInstalled += r.installed\n }\n if (\n config.skills.projectSkills &&\n config.skills.projectSkills.length > 0\n ) {\n onProgress(t('commands.setup.installingSkills'))\n const r = await installInlineSkills(\n config.skills.projectSkills,\n join(projectDir, 'skills'),\n )\n skillsInstalled += r.installed\n }\n }\n if (skillsInstalled > 0) {\n summary.push(\n `${skillsInstalled} skill${skillsInstalled !== 1 ? 's' : ''}`,\n )\n }\n\n // Step 6: Commands \u2014 scope-aware\n let commandsInstalled = 0\n\n if (config.commands) {\n if (\n config.commands.userCommands &&\n config.commands.userCommands.length > 0\n ) {\n onProgress(t('commands.setup.installingCommands'))\n const r = await installInlineCommands(\n config.commands.userCommands,\n join(userDir, 'commands'),\n )\n commandsInstalled += r.installed\n }\n if (\n config.commands.projectCommands &&\n config.commands.projectCommands.length > 0\n ) {\n onProgress(t('commands.setup.installingCommands'))\n const r = await installInlineCommands(\n config.commands.projectCommands,\n join(projectDir, 'commands'),\n )\n commandsInstalled += r.installed\n }\n }\n if (commandsInstalled > 0) {\n summary.push(\n `${commandsInstalled} command${commandsInstalled !== 1 ? 's' : ''}`,\n )\n }\n\n // Step 7: Hooks \u2014 scope-aware\n let hooksInstalled = false\n\n if (config.hooks) {\n onProgress(t('commands.setup.installingHooks'))\n const r = await installTeamHooks(\n config.hooks,\n join(userDir, 'hooks.json'),\n )\n if (r.installed) hooksInstalled = true\n }\n if (config.projectHooks) {\n onProgress(t('commands.setup.installingHooks'))\n const r = await installTeamHooks(\n config.projectHooks,\n join(projectDir, 'hooks.json'),\n )\n if (r.installed) hooksInstalled = true\n }\n if (hooksInstalled) {\n summary.push('hooks')\n }\n }\n\n return summary.length > 0\n ? `${t('commands.setup.success')} (${summary.join(', ')})`\n : t('commands.setup.success')\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function SetupComponent({\n source,\n strategy = 'merge',\n installPlugins: shouldInstallPlugins = true,\n onDone,\n}: SetupProps) {\n const [phase, setPhase] = useState<SetupPhase>('loading')\n const [teamConfig, setTeamConfig] = useState<TeamConfig | null>(null)\n const [activeTab, setActiveTab] = useState('overview')\n const [statusOverlay, setStatusOverlay] = useState<StatusOverlay | null>(null)\n\n // Load configuration on mount\n React.useEffect(() => {\n async function load() {\n try {\n const config =\n source.startsWith('http://') || source.startsWith('https://')\n ? await fetchTeamConfig(source)\n : loadTeamConfigFromFile(source)\n\n setTeamConfig(config)\n setPhase('preview')\n } catch (error) {\n setTeamConfig(null)\n setPhase('preview')\n setStatusOverlay({\n type: 'error',\n message: `${t('commands.setup.failed')}: ${error instanceof Error ? error.message : String(error)}`,\n })\n }\n }\n load()\n }, [source])\n\n const tabs = useMemo(\n () =>\n teamConfig\n ? buildTabs(teamConfig)\n : [{ id: 'overview', label: t('commands.setup.tabOverview') }],\n [teamConfig],\n )\n\n const items = useMemo(\n () => (teamConfig ? buildItems(activeTab, teamConfig) : []),\n [teamConfig, activeTab],\n )\n\n const handleSelect = useCallback(async () => {\n if (!teamConfig || phase !== 'preview') return\n\n setPhase('installing')\n setStatusOverlay({\n type: 'loading',\n message: t('commands.setup.applying'),\n })\n\n try {\n const successMessage = await runInstall(\n teamConfig,\n strategy,\n shouldInstallPlugins,\n (message: string) => {\n setStatusOverlay({ type: 'loading', message })\n },\n )\n\n setStatusOverlay({\n type: 'success',\n message: successMessage,\n })\n } catch (error) {\n setStatusOverlay({\n type: 'error',\n message: `${t('commands.setup.failed')}: ${error instanceof Error ? error.message : String(error)}`,\n })\n }\n }, [teamConfig, phase, strategy, shouldInstallPlugins])\n\n const handleClose = useCallback(() => {\n onDone()\n }, [onDone])\n\n // Loading phase - simple spinner before TabbedListView\n if (phase === 'loading') {\n return (\n <Box>\n <SimpleSpinner />\n <Text color=\"cyan\"> {t('commands.setup.loading')}</Text>\n </Box>\n )\n }\n\n // Preview & Installing phases - both use TabbedListView\n return (\n <TabbedListView\n title={t('commands.setup.previewTitle')}\n tabs={tabs}\n activeTab={activeTab}\n onTabChange={setActiveTab}\n items={items}\n searchEnabled={false}\n onSelect={handleSelect}\n onClose={handleClose}\n footerHint={t('commands.setup.confirmHint')}\n statusOverlay={statusOverlay}\n statusDismissHint=\"Esc Close\"\n groupByCategory={\n activeTab === 'overview' ||\n activeTab === 'plugins' ||\n activeTab === 'agents' ||\n activeTab === 'skills' ||\n activeTab === 'commands' ||\n activeTab === 'hooks'\n }\n isActive={phase !== 'installing' || statusOverlay?.type !== 'loading'}\n />\n )\n}\n\n// ============================================================================\n// Command Export\n// ============================================================================\n\nconst command = {\n type: 'local-jsx',\n name: 'setup',\n description: t('commands.setup.description'),\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n userFacingName() {\n return 'setup'\n },\n async call(onDone, _context, commandArgs) {\n const argsString = commandArgs || process.argv.slice(2).join(' ')\n const args = argsString.split(/\\s+/).filter(Boolean)\n const fromIndex = args.findIndex(arg => arg === '--from')\n const strategyIndex = args.findIndex(arg => arg === '--strategy')\n const noPluginsFlag = args.includes('--no-plugins')\n\n if (fromIndex === -1 || !args[fromIndex + 1]) {\n onDone(\n `${t('commands.setup.errorMissingFrom')}\\n${t('commands.setup.errorUsage')}`,\n )\n return null\n }\n\n const source = args[fromIndex + 1]\n const setupStrategy: MergeStrategy =\n strategyIndex !== -1 && args[strategyIndex + 1]\n ? (args[strategyIndex + 1] as MergeStrategy)\n : 'merge'\n const shouldInstallPlugins = !noPluginsFlag\n\n return (\n <SetupComponent\n source={source}\n strategy={setupStrategy}\n installPlugins={shouldInstallPlugins}\n onDone={onDone}\n />\n )\n },\n} satisfies Command\n\nexport default command\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,292 @@
1
+ import React from "react";
2
+ import { t } from "../i18n/index.js";
3
+ import { BRAND_GRADIENT, SEMANTIC_COLORS } from "../constants/colors.js";
4
+ import {
5
+ getStats,
6
+ getTodayStats,
7
+ getStatsForDays,
8
+ getModelUsageStats,
9
+ getToolUsageStats
10
+ } from "../utils/stats.js";
11
+ import { InfoPanel } from "../components/InfoPanel/index.js";
12
+ function formatNumber(n) {
13
+ return n.toLocaleString();
14
+ }
15
+ function formatCompactNumber(n) {
16
+ if (n >= 1e6) return `${(n / 1e6).toFixed(1)}M`;
17
+ if (n >= 1e3) return `${(n / 1e3).toFixed(1)}K`;
18
+ return n.toString();
19
+ }
20
+ function formatCost(cost) {
21
+ if (cost < 0.01) return `$${cost.toFixed(4)}`;
22
+ return `$${cost.toFixed(2)}`;
23
+ }
24
+ function getTodayString() {
25
+ return (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
26
+ }
27
+ function safePercentage(value, total) {
28
+ if (total === 0) return 0;
29
+ return Math.round(value / total * 100);
30
+ }
31
+ function sumDailyStats(days) {
32
+ return days.reduce(
33
+ (acc, day) => ({
34
+ date: "",
35
+ messageCount: acc.messageCount + day.messageCount,
36
+ sessionCount: acc.sessionCount + day.sessionCount,
37
+ toolCallCount: acc.toolCallCount + day.toolCallCount,
38
+ tokensUsed: acc.tokensUsed + day.tokensUsed,
39
+ costEstimate: acc.costEstimate + day.costEstimate
40
+ }),
41
+ {
42
+ date: "",
43
+ messageCount: 0,
44
+ sessionCount: 0,
45
+ toolCallCount: 0,
46
+ tokensUsed: 0,
47
+ costEstimate: 0
48
+ }
49
+ );
50
+ }
51
+ function buildTodaySection(today, yesterday) {
52
+ const maxMsg = Math.max(
53
+ today?.messageCount ?? 0,
54
+ yesterday?.messageCount ?? 0,
55
+ 1
56
+ );
57
+ const maxSession = Math.max(
58
+ today?.sessionCount ?? 0,
59
+ yesterday?.sessionCount ?? 0,
60
+ 1
61
+ );
62
+ const maxTool = Math.max(
63
+ today?.toolCallCount ?? 0,
64
+ yesterday?.toolCallCount ?? 0,
65
+ 1
66
+ );
67
+ const maxToken = Math.max(
68
+ today?.tokensUsed ?? 0,
69
+ yesterday?.tokensUsed ?? 0,
70
+ 1
71
+ );
72
+ const msgDiff = today && yesterday ? today.messageCount - yesterday.messageCount : void 0;
73
+ const sessionDiff = today && yesterday ? today.sessionCount - yesterday.sessionCount : void 0;
74
+ const toolDiff = today && yesterday ? today.toolCallCount - yesterday.toolCallCount : void 0;
75
+ const tokenDiff = today && yesterday ? today.tokensUsed - yesterday.tokensUsed : void 0;
76
+ return {
77
+ title: `${t("commands.stats.today")} (${getTodayString()})`,
78
+ items: [
79
+ {
80
+ label: t("commands.stats.messages"),
81
+ value: formatNumber(today?.messageCount ?? 0),
82
+ progress: {
83
+ percent: safePercentage(today?.messageCount ?? 0, maxMsg * 1.2),
84
+ width: 20
85
+ },
86
+ delta: msgDiff !== void 0 ? { value: msgDiff, label: t("commands.stats.vsYesterday") } : void 0
87
+ },
88
+ {
89
+ label: t("commands.stats.sessions"),
90
+ value: formatNumber(today?.sessionCount ?? 0),
91
+ progress: {
92
+ percent: safePercentage(today?.sessionCount ?? 0, maxSession * 1.2),
93
+ width: 20
94
+ },
95
+ delta: sessionDiff !== void 0 ? { value: sessionDiff, label: t("commands.stats.vsYesterday") } : void 0
96
+ },
97
+ {
98
+ label: t("commands.stats.toolCalls"),
99
+ value: formatNumber(today?.toolCallCount ?? 0),
100
+ progress: {
101
+ percent: safePercentage(today?.toolCallCount ?? 0, maxTool * 1.2),
102
+ width: 20
103
+ },
104
+ delta: toolDiff !== void 0 ? { value: toolDiff, label: t("commands.stats.vsYesterday") } : void 0
105
+ },
106
+ {
107
+ label: t("commands.stats.tokens"),
108
+ value: formatNumber(today?.tokensUsed ?? 0),
109
+ progress: {
110
+ percent: safePercentage(today?.tokensUsed ?? 0, maxToken * 1.2),
111
+ width: 20
112
+ },
113
+ delta: tokenDiff !== void 0 ? { value: tokenDiff, label: t("commands.stats.vsYesterday") } : void 0
114
+ }
115
+ ]
116
+ };
117
+ }
118
+ function buildPeriodSection(title, stats) {
119
+ return {
120
+ title,
121
+ items: [
122
+ {
123
+ label: t("commands.stats.totalMessages"),
124
+ value: formatNumber(stats.messageCount)
125
+ },
126
+ {
127
+ label: t("commands.stats.totalSessions"),
128
+ value: formatNumber(stats.sessionCount)
129
+ },
130
+ {
131
+ label: t("commands.stats.totalTools"),
132
+ value: formatNumber(stats.toolCallCount)
133
+ },
134
+ {
135
+ label: t("commands.stats.estCost"),
136
+ value: formatCost(stats.costEstimate)
137
+ }
138
+ ]
139
+ };
140
+ }
141
+ function buildModelSection() {
142
+ const modelStats = getModelUsageStats();
143
+ if (modelStats.length === 0) return null;
144
+ const totalCalls = modelStats.reduce((sum, m) => sum + m.calls, 0);
145
+ const items = modelStats.slice(0, 5).map((model) => {
146
+ const percentage = safePercentage(model.calls, totalCalls);
147
+ const displayName = model.model.length > 14 ? model.model.slice(0, 11) + "..." : model.model;
148
+ return {
149
+ label: displayName,
150
+ value: `${formatNumber(model.calls)} ${t("commands.stats.calls")}`,
151
+ progress: {
152
+ percent: percentage,
153
+ width: 20,
154
+ color: BRAND_GRADIENT.MIDDLE
155
+ }
156
+ };
157
+ });
158
+ return { title: t("commands.stats.modelUsage"), items };
159
+ }
160
+ function buildToolSection() {
161
+ const toolStats = getToolUsageStats();
162
+ if (toolStats.length === 0) return null;
163
+ const items = toolStats.slice(0, 5).map((tool, index) => {
164
+ const successRate = safePercentage(tool.successCount, tool.calls);
165
+ const displayName = tool.toolName.length > 16 ? tool.toolName.slice(0, 13) + "..." : tool.toolName;
166
+ return {
167
+ label: `${index + 1}. ${displayName}`,
168
+ value: `${formatNumber(tool.calls)} ${t("commands.stats.calls")}${tool.errorCount > 0 ? ` (${successRate}% success)` : ""}`
169
+ };
170
+ });
171
+ return { title: t("commands.stats.topTools"), items };
172
+ }
173
+ function buildLifetimeSection() {
174
+ const stats = getStats();
175
+ return {
176
+ title: t("commands.stats.lifetime"),
177
+ items: [
178
+ {
179
+ label: t("commands.stats.totalMessages"),
180
+ value: formatNumber(stats.lifetime.totalMessages)
181
+ },
182
+ {
183
+ label: t("commands.stats.totalSessions"),
184
+ value: formatNumber(stats.lifetime.totalSessions)
185
+ },
186
+ {
187
+ label: t("commands.stats.totalTools"),
188
+ value: formatNumber(stats.lifetime.totalToolCalls)
189
+ },
190
+ {
191
+ label: t("commands.stats.tokens"),
192
+ value: formatCompactNumber(stats.lifetime.totalTokens)
193
+ },
194
+ {
195
+ label: t("commands.stats.estCost"),
196
+ value: formatCost(stats.lifetime.totalCost)
197
+ },
198
+ {
199
+ label: t("commands.stats.firstUsed"),
200
+ value: stats.lifetime.firstUsed.split("T")[0] || "",
201
+ valueColor: SEMANTIC_COLORS.dim
202
+ }
203
+ ]
204
+ };
205
+ }
206
+ function parseArgs(args) {
207
+ const trimmed = args.trim().toLowerCase();
208
+ return {
209
+ week: trimmed.includes("--week") || trimmed.includes("-w"),
210
+ month: trimmed.includes("--month") || trimmed.includes("-m"),
211
+ models: trimmed.includes("--models"),
212
+ tools: trimmed.includes("--tools")
213
+ };
214
+ }
215
+ const command = {
216
+ name: "stats",
217
+ description: t("commands.stats.description"),
218
+ isEnabled: true,
219
+ isHidden: false,
220
+ hidePromptInput: true,
221
+ type: "local-jsx",
222
+ userFacingName() {
223
+ return this.name;
224
+ },
225
+ async call(onDone, _context, args) {
226
+ const parsedArgs = parseArgs(args ?? "");
227
+ const stats = getStats();
228
+ const today = getTodayStats();
229
+ const hasData = stats.lifetime.totalMessages > 0 || stats.lifetime.totalSessions > 0;
230
+ if (!hasData) {
231
+ return /* @__PURE__ */ React.createElement(
232
+ InfoPanel,
233
+ {
234
+ title: t("commands.stats.title"),
235
+ sections: [
236
+ {
237
+ title: t("commands.stats.today"),
238
+ items: [
239
+ {
240
+ label: "",
241
+ value: t("commands.stats.noData"),
242
+ valueColor: SEMANTIC_COLORS.dim
243
+ }
244
+ ]
245
+ }
246
+ ],
247
+ onClose: onDone
248
+ }
249
+ );
250
+ }
251
+ const recentDays = getStatsForDays(2);
252
+ const yesterday = recentDays.length >= 2 ? recentDays[1] ?? null : null;
253
+ const weekStats = sumDailyStats(getStatsForDays(7));
254
+ const sections = [];
255
+ if (!parsedArgs.week && !parsedArgs.month) {
256
+ sections.push(buildTodaySection(today, yesterday));
257
+ }
258
+ if (parsedArgs.week || !parsedArgs.month) {
259
+ sections.push(buildPeriodSection(t("commands.stats.thisWeek"), weekStats));
260
+ }
261
+ if (parsedArgs.month) {
262
+ const monthStats = sumDailyStats(getStatsForDays(30));
263
+ sections.push(
264
+ buildPeriodSection(t("commands.stats.thisMonth"), monthStats)
265
+ );
266
+ }
267
+ if (parsedArgs.models || !parsedArgs.week && !parsedArgs.month && !parsedArgs.tools) {
268
+ const modelSection = buildModelSection();
269
+ if (modelSection) sections.push(modelSection);
270
+ }
271
+ if (parsedArgs.tools || !parsedArgs.week && !parsedArgs.month && !parsedArgs.models) {
272
+ const toolSection = buildToolSection();
273
+ if (toolSection) sections.push(toolSection);
274
+ }
275
+ if (!parsedArgs.week && !parsedArgs.month && !parsedArgs.models && !parsedArgs.tools) {
276
+ sections.push(buildLifetimeSection());
277
+ }
278
+ return /* @__PURE__ */ React.createElement(
279
+ InfoPanel,
280
+ {
281
+ title: t("commands.stats.title"),
282
+ sections,
283
+ onClose: onDone
284
+ }
285
+ );
286
+ }
287
+ };
288
+ var stats_default = command;
289
+ export {
290
+ stats_default as default
291
+ };
292
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/stats.tsx"],
4
+ "sourcesContent": ["/**\n * Stats Command\n *\n * Displays usage statistics using InfoPanel for consistent UI.\n *\n * Usage:\n * /stats - Show today's statistics and overview\n * /stats --week - Show this week's statistics\n * /stats --month - Show this month's statistics\n * /stats --models - Show model usage details\n * /stats --tools - Show tool usage details\n */\n\nimport React from 'react'\nimport type { Command } from '@commands'\nimport { t } from '@i18n'\nimport { BRAND_GRADIENT, SEMANTIC_COLORS } from '@constants/colors'\nimport {\n getStats,\n getTodayStats,\n getStatsForDays,\n getModelUsageStats,\n getToolUsageStats,\n type DailyActivity,\n} from '@utils/stats'\nimport { InfoPanel } from '@components/InfoPanel'\nimport type { InfoSection, InfoItem } from '@components/InfoPanel'\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction formatNumber(n: number): string {\n return n.toLocaleString()\n}\n\nfunction formatCompactNumber(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`\n return n.toString()\n}\n\nfunction formatCost(cost: number): string {\n if (cost < 0.01) return `$${cost.toFixed(4)}`\n return `$${cost.toFixed(2)}`\n}\n\nfunction getTodayString(): string {\n return new Date().toISOString().split('T')[0]!\n}\n\nfunction safePercentage(value: number, total: number): number {\n if (total === 0) return 0\n return Math.round((value / total) * 100)\n}\n\nfunction sumDailyStats(days: DailyActivity[]): DailyActivity {\n return days.reduce(\n (acc, day) => ({\n date: '',\n messageCount: acc.messageCount + day.messageCount,\n sessionCount: acc.sessionCount + day.sessionCount,\n toolCallCount: acc.toolCallCount + day.toolCallCount,\n tokensUsed: acc.tokensUsed + day.tokensUsed,\n costEstimate: acc.costEstimate + day.costEstimate,\n }),\n {\n date: '',\n messageCount: 0,\n sessionCount: 0,\n toolCallCount: 0,\n tokensUsed: 0,\n costEstimate: 0,\n },\n )\n}\n\n// ============================================================================\n// Section Builders\n// ============================================================================\n\nfunction buildTodaySection(\n today: DailyActivity | null,\n yesterday: DailyActivity | null,\n): InfoSection {\n const maxMsg = Math.max(\n today?.messageCount ?? 0,\n yesterday?.messageCount ?? 0,\n 1,\n )\n const maxSession = Math.max(\n today?.sessionCount ?? 0,\n yesterday?.sessionCount ?? 0,\n 1,\n )\n const maxTool = Math.max(\n today?.toolCallCount ?? 0,\n yesterday?.toolCallCount ?? 0,\n 1,\n )\n const maxToken = Math.max(\n today?.tokensUsed ?? 0,\n yesterday?.tokensUsed ?? 0,\n 1,\n )\n\n const msgDiff =\n today && yesterday ? today.messageCount - yesterday.messageCount : undefined\n const sessionDiff =\n today && yesterday ? today.sessionCount - yesterday.sessionCount : undefined\n const toolDiff =\n today && yesterday\n ? today.toolCallCount - yesterday.toolCallCount\n : undefined\n const tokenDiff =\n today && yesterday ? today.tokensUsed - yesterday.tokensUsed : undefined\n\n return {\n title: `${t('commands.stats.today')} (${getTodayString()})`,\n items: [\n {\n label: t('commands.stats.messages'),\n value: formatNumber(today?.messageCount ?? 0),\n progress: {\n percent: safePercentage(today?.messageCount ?? 0, maxMsg * 1.2),\n width: 20,\n },\n delta:\n msgDiff !== undefined\n ? { value: msgDiff, label: t('commands.stats.vsYesterday') }\n : undefined,\n },\n {\n label: t('commands.stats.sessions'),\n value: formatNumber(today?.sessionCount ?? 0),\n progress: {\n percent: safePercentage(today?.sessionCount ?? 0, maxSession * 1.2),\n width: 20,\n },\n delta:\n sessionDiff !== undefined\n ? { value: sessionDiff, label: t('commands.stats.vsYesterday') }\n : undefined,\n },\n {\n label: t('commands.stats.toolCalls'),\n value: formatNumber(today?.toolCallCount ?? 0),\n progress: {\n percent: safePercentage(today?.toolCallCount ?? 0, maxTool * 1.2),\n width: 20,\n },\n delta:\n toolDiff !== undefined\n ? { value: toolDiff, label: t('commands.stats.vsYesterday') }\n : undefined,\n },\n {\n label: t('commands.stats.tokens'),\n value: formatNumber(today?.tokensUsed ?? 0),\n progress: {\n percent: safePercentage(today?.tokensUsed ?? 0, maxToken * 1.2),\n width: 20,\n },\n delta:\n tokenDiff !== undefined\n ? { value: tokenDiff, label: t('commands.stats.vsYesterday') }\n : undefined,\n },\n ],\n }\n}\n\nfunction buildPeriodSection(title: string, stats: DailyActivity): InfoSection {\n return {\n title,\n items: [\n {\n label: t('commands.stats.totalMessages'),\n value: formatNumber(stats.messageCount),\n },\n {\n label: t('commands.stats.totalSessions'),\n value: formatNumber(stats.sessionCount),\n },\n {\n label: t('commands.stats.totalTools'),\n value: formatNumber(stats.toolCallCount),\n },\n {\n label: t('commands.stats.estCost'),\n value: formatCost(stats.costEstimate),\n },\n ],\n }\n}\n\nfunction buildModelSection(): InfoSection | null {\n const modelStats = getModelUsageStats()\n if (modelStats.length === 0) return null\n\n const totalCalls = modelStats.reduce((sum, m) => sum + m.calls, 0)\n const items: InfoItem[] = modelStats.slice(0, 5).map(model => {\n const percentage = safePercentage(model.calls, totalCalls)\n const displayName =\n model.model.length > 14 ? model.model.slice(0, 11) + '...' : model.model\n return {\n label: displayName,\n value: `${formatNumber(model.calls)} ${t('commands.stats.calls')}`,\n progress: {\n percent: percentage,\n width: 20,\n color: BRAND_GRADIENT.MIDDLE,\n },\n }\n })\n\n return { title: t('commands.stats.modelUsage'), items }\n}\n\nfunction buildToolSection(): InfoSection | null {\n const toolStats = getToolUsageStats()\n if (toolStats.length === 0) return null\n\n const items: InfoItem[] = toolStats.slice(0, 5).map((tool, index) => {\n const successRate = safePercentage(tool.successCount, tool.calls)\n const displayName =\n tool.toolName.length > 16\n ? tool.toolName.slice(0, 13) + '...'\n : tool.toolName\n return {\n label: `${index + 1}. ${displayName}`,\n value: `${formatNumber(tool.calls)} ${t('commands.stats.calls')}${tool.errorCount > 0 ? ` (${successRate}% success)` : ''}`,\n }\n })\n\n return { title: t('commands.stats.topTools'), items }\n}\n\nfunction buildLifetimeSection(): InfoSection {\n const stats = getStats()\n return {\n title: t('commands.stats.lifetime'),\n items: [\n {\n label: t('commands.stats.totalMessages'),\n value: formatNumber(stats.lifetime.totalMessages),\n },\n {\n label: t('commands.stats.totalSessions'),\n value: formatNumber(stats.lifetime.totalSessions),\n },\n {\n label: t('commands.stats.totalTools'),\n value: formatNumber(stats.lifetime.totalToolCalls),\n },\n {\n label: t('commands.stats.tokens'),\n value: formatCompactNumber(stats.lifetime.totalTokens),\n },\n {\n label: t('commands.stats.estCost'),\n value: formatCost(stats.lifetime.totalCost),\n },\n {\n label: t('commands.stats.firstUsed'),\n value: stats.lifetime.firstUsed.split('T')[0] || '',\n valueColor: SEMANTIC_COLORS.dim,\n },\n ],\n }\n}\n\n// ============================================================================\n// Command Definition\n// ============================================================================\n\ninterface ParsedArgs {\n week: boolean\n month: boolean\n models: boolean\n tools: boolean\n}\n\nfunction parseArgs(args: string): ParsedArgs {\n const trimmed = args.trim().toLowerCase()\n return {\n week: trimmed.includes('--week') || trimmed.includes('-w'),\n month: trimmed.includes('--month') || trimmed.includes('-m'),\n models: trimmed.includes('--models'),\n tools: trimmed.includes('--tools'),\n }\n}\n\nconst command: Command = {\n name: 'stats',\n description: t('commands.stats.description'),\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n type: 'local-jsx',\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone, _context, args) {\n const parsedArgs = parseArgs(args ?? '')\n const stats = getStats()\n const today = getTodayStats()\n\n const hasData =\n stats.lifetime.totalMessages > 0 || stats.lifetime.totalSessions > 0\n\n if (!hasData) {\n return (\n <InfoPanel\n title={t('commands.stats.title')}\n sections={[\n {\n title: t('commands.stats.today'),\n items: [\n {\n label: '',\n value: t('commands.stats.noData'),\n valueColor: SEMANTIC_COLORS.dim,\n },\n ],\n },\n ]}\n onClose={onDone}\n />\n )\n }\n\n const recentDays = getStatsForDays(2)\n const yesterday = recentDays.length >= 2 ? (recentDays[1] ?? null) : null\n const weekStats = sumDailyStats(getStatsForDays(7))\n\n const sections: InfoSection[] = []\n\n // Today's stats\n if (!parsedArgs.week && !parsedArgs.month) {\n sections.push(buildTodaySection(today, yesterday))\n }\n\n // Week stats\n if (parsedArgs.week || !parsedArgs.month) {\n sections.push(buildPeriodSection(t('commands.stats.thisWeek'), weekStats))\n }\n\n // Month stats\n if (parsedArgs.month) {\n const monthStats = sumDailyStats(getStatsForDays(30))\n sections.push(\n buildPeriodSection(t('commands.stats.thisMonth'), monthStats),\n )\n }\n\n // Model usage\n if (\n parsedArgs.models ||\n (!parsedArgs.week && !parsedArgs.month && !parsedArgs.tools)\n ) {\n const modelSection = buildModelSection()\n if (modelSection) sections.push(modelSection)\n }\n\n // Tool usage\n if (\n parsedArgs.tools ||\n (!parsedArgs.week && !parsedArgs.month && !parsedArgs.models)\n ) {\n const toolSection = buildToolSection()\n if (toolSection) sections.push(toolSection)\n }\n\n // Lifetime stats\n if (\n !parsedArgs.week &&\n !parsedArgs.month &&\n !parsedArgs.models &&\n !parsedArgs.tools\n ) {\n sections.push(buildLifetimeSection())\n }\n\n return (\n <InfoPanel\n title={t('commands.stats.title')}\n sections={sections}\n onClose={onDone}\n />\n )\n },\n}\n\nexport default command\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,12 +1,10 @@
1
1
  import React from "react";
2
- import { Box, Text } from "ink";
3
2
  import { getModelManager } from "../utils/model.js";
4
3
  import { getCwd } from "../utils/state.js";
5
4
  import { MACRO } from "../constants/macros.js";
6
5
  import { SEMANTIC_COLORS } from "../constants/colors.js";
7
- const StatusDisplay = ({ status }) => {
8
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: "cyan" }, "Minto Status")), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Version Info"), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Minto: "), /* @__PURE__ */ React.createElement(Text, { color: "green" }, "v", status.version)), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Node.js: "), /* @__PURE__ */ React.createElement(Text, null, status.nodeVersion)), status.bunVersion && /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Bun: "), /* @__PURE__ */ React.createElement(Text, null, status.bunVersion)), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Platform: "), /* @__PURE__ */ React.createElement(Text, null, status.platform)))), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Environment"), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "CWD: "), /* @__PURE__ */ React.createElement(Text, null, status.cwd)))), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Model Configuration"), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, flexDirection: "column" }, status.modelInfo ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Model: "), /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, status.modelInfo.name)), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Provider: "), /* @__PURE__ */ React.createElement(Text, null, status.modelInfo.provider)), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Context: "), /* @__PURE__ */ React.createElement(Text, null, (status.modelInfo.contextLength / 1e3).toFixed(0), "k tokens"))) : /* @__PURE__ */ React.createElement(Text, { color: "yellow" }, "No model configured"))), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "API Connection"), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Status: "), status.apiConnected ? /* @__PURE__ */ React.createElement(Text, { color: "green" }, "\u25CF Connected") : /* @__PURE__ */ React.createElement(Text, { color: "red" }, "\u25CB Not connected")))));
9
- };
6
+ import { InfoPanel } from "../components/InfoPanel/index.js";
7
+ import { t } from "../i18n/index.js";
10
8
  async function getStatusInfo() {
11
9
  let modelInfo = null;
12
10
  let apiConnected = false;
@@ -37,19 +35,89 @@ async function getStatusInfo() {
37
35
  apiConnected
38
36
  };
39
37
  }
38
+ function buildSections(status) {
39
+ const sections = [];
40
+ const versionItems = [
41
+ {
42
+ label: "Minto",
43
+ value: `v${status.version}`,
44
+ valueColor: SEMANTIC_COLORS.success
45
+ },
46
+ { label: "Node.js", value: status.nodeVersion }
47
+ ];
48
+ if (status.bunVersion) {
49
+ versionItems.push({ label: "Bun", value: status.bunVersion });
50
+ }
51
+ versionItems.push({ label: "Platform", value: status.platform });
52
+ sections.push({
53
+ title: t("commands.status.versionInfo"),
54
+ items: versionItems
55
+ });
56
+ sections.push({
57
+ title: t("commands.status.environment"),
58
+ items: [{ label: "CWD", value: status.cwd }]
59
+ });
60
+ if (status.modelInfo) {
61
+ sections.push({
62
+ title: t("commands.status.modelConfiguration"),
63
+ items: [
64
+ {
65
+ label: "Model",
66
+ value: status.modelInfo.name,
67
+ valueColor: SEMANTIC_COLORS.info
68
+ },
69
+ { label: "Provider", value: status.modelInfo.provider },
70
+ {
71
+ label: "Context",
72
+ value: `${(status.modelInfo.contextLength / 1e3).toFixed(0)}k tokens`
73
+ }
74
+ ]
75
+ });
76
+ } else {
77
+ sections.push({
78
+ title: t("commands.status.modelConfiguration"),
79
+ items: [
80
+ {
81
+ label: "Status",
82
+ value: t("commands.status.notConfigured"),
83
+ valueColor: "#FFB86C"
84
+ }
85
+ ]
86
+ });
87
+ }
88
+ sections.push({
89
+ title: t("commands.status.apiConnection"),
90
+ items: [
91
+ {
92
+ label: "Status",
93
+ value: status.apiConnected ? `\u25CF ${t("commands.status.connected")}` : `\u25CB ${t("commands.status.notConnected")}`,
94
+ valueColor: status.apiConnected ? SEMANTIC_COLORS.success : SEMANTIC_COLORS.error
95
+ }
96
+ ]
97
+ });
98
+ return sections;
99
+ }
40
100
  const command = {
41
101
  name: "status",
42
- description: "Display version and connection information",
102
+ description: t("commands.status.description"),
43
103
  isEnabled: true,
44
104
  isHidden: false,
105
+ hidePromptInput: true,
45
106
  type: "local-jsx",
46
107
  userFacingName() {
47
108
  return this.name;
48
109
  },
49
110
  async call(onDone) {
50
111
  const status = await getStatusInfo();
51
- setTimeout(() => onDone(), 100);
52
- return /* @__PURE__ */ React.createElement(StatusDisplay, { status });
112
+ const sections = buildSections(status);
113
+ return /* @__PURE__ */ React.createElement(
114
+ InfoPanel,
115
+ {
116
+ title: t("commands.status.title"),
117
+ sections,
118
+ onClose: onDone
119
+ }
120
+ );
53
121
  }
54
122
  };
55
123
  var status_default = command;