@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.
- package/{cli.js → cli.cjs} +25 -23
- package/dist/commands/agents/AgentsCommand.js +459 -655
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/agents/types.js +1 -0
- package/dist/commands/agents/types.js.map +2 -2
- package/dist/commands/agents/utils/fileOperations.js +96 -36
- package/dist/commands/agents/utils/fileOperations.js.map +3 -3
- package/dist/commands/agents/utils/index.js +3 -1
- package/dist/commands/agents/utils/index.js.map +2 -2
- package/dist/commands/context.js +54 -23
- package/dist/commands/context.js.map +2 -2
- package/dist/commands/export.js +673 -93
- package/dist/commands/export.js.map +2 -2
- package/dist/commands/language.js +110 -0
- package/dist/commands/language.js.map +7 -0
- package/dist/commands/mcp-interactive.js +419 -217
- package/dist/commands/mcp-interactive.js.map +2 -2
- package/dist/commands/model.js +415 -66
- package/dist/commands/model.js.map +2 -2
- package/dist/commands/new.js +56 -0
- package/dist/commands/new.js.map +7 -0
- package/dist/commands/permissions.js +75 -49
- package/dist/commands/permissions.js.map +2 -2
- package/dist/commands/plugin.js +882 -185
- package/dist/commands/plugin.js.map +3 -3
- package/dist/commands/resume.js +251 -16
- package/dist/commands/resume.js.map +2 -2
- package/dist/commands/sandbox.js +168 -70
- package/dist/commands/sandbox.js.map +2 -2
- package/dist/commands/sessions.js +224 -0
- package/dist/commands/sessions.js.map +7 -0
- package/dist/commands/setup.js +596 -109
- package/dist/commands/setup.js.map +2 -2
- package/dist/commands/stats.js +292 -0
- package/dist/commands/stats.js.map +7 -0
- package/dist/commands/status.js +75 -7
- package/dist/commands/status.js.map +2 -2
- package/dist/commands/undo.js +154 -180
- package/dist/commands/undo.js.map +2 -2
- package/dist/commands.js +6 -0
- package/dist/commands.js.map +2 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
- package/dist/components/Config.js +9 -8
- package/dist/components/Config.js.map +2 -2
- package/dist/components/HeaderBar.js +2 -1
- package/dist/components/HeaderBar.js.map +2 -2
- package/dist/components/Help.js +166 -32
- package/dist/components/Help.js.map +2 -2
- package/dist/components/HotkeyHelpPanel.js +46 -44
- package/dist/components/HotkeyHelpPanel.js.map +2 -2
- package/dist/components/InfoPanel/InfoPanel.js +123 -0
- package/dist/components/InfoPanel/InfoPanel.js.map +7 -0
- package/dist/components/InfoPanel/index.js +5 -0
- package/dist/components/InfoPanel/index.js.map +7 -0
- package/dist/components/InfoPanel/types.js +1 -0
- package/dist/components/InfoPanel/types.js.map +7 -0
- package/dist/components/Logo.js +5 -2
- package/dist/components/Logo.js.map +2 -2
- package/dist/components/MCPServerApprovalDialog.js +6 -5
- package/dist/components/MCPServerApprovalDialog.js.map +2 -2
- package/dist/components/MCPServerMultiselectDialog.js +5 -4
- package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
- package/dist/components/MessageSelector.js +4 -3
- package/dist/components/MessageSelector.js.map +2 -2
- package/dist/components/ModelConfig.js +13 -12
- package/dist/components/ModelConfig.js.map +2 -2
- package/dist/components/ModelListManager.js +4 -3
- package/dist/components/ModelListManager.js.map +2 -2
- package/dist/components/ModelSelector/BrandTextInput.js +43 -0
- package/dist/components/ModelSelector/BrandTextInput.js.map +7 -0
- package/dist/components/ModelSelector/ModelSelector.js +419 -501
- package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
- package/dist/components/ModelSelector/WizardContainer.js +45 -0
- package/dist/components/ModelSelector/WizardContainer.js.map +7 -0
- package/dist/components/ModelSelector/index.js +1 -3
- package/dist/components/ModelSelector/index.js.map +2 -2
- package/dist/components/PromptInput.js +77 -44
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/SensitiveFileWarning.js +12 -8
- package/dist/components/SensitiveFileWarning.js.map +2 -2
- package/dist/components/SimpleSelector/SimpleSelector.js +154 -0
- package/dist/components/SimpleSelector/SimpleSelector.js.map +7 -0
- package/dist/components/SimpleSelector/index.js +5 -0
- package/dist/components/SimpleSelector/index.js.map +7 -0
- package/dist/components/SimpleSelector/types.js +1 -0
- package/dist/components/SimpleSelector/types.js.map +7 -0
- package/dist/components/StatusOverlayContent.js +21 -0
- package/dist/components/StatusOverlayContent.js.map +7 -0
- package/dist/components/TabbedListView/ScrollableList.js +117 -0
- package/dist/components/TabbedListView/ScrollableList.js.map +7 -0
- package/dist/components/TabbedListView/SearchInput.js +23 -0
- package/dist/components/TabbedListView/SearchInput.js.map +7 -0
- package/dist/components/TabbedListView/TabBar.js +20 -0
- package/dist/components/TabbedListView/TabBar.js.map +7 -0
- package/dist/components/TabbedListView/TabbedListView.js +246 -0
- package/dist/components/TabbedListView/TabbedListView.js.map +7 -0
- package/dist/components/TabbedListView/index.js +11 -0
- package/dist/components/TabbedListView/index.js.map +7 -0
- package/dist/components/TabbedListView/types.js +1 -0
- package/dist/components/TabbedListView/types.js.map +7 -0
- package/dist/components/TodoChangeBlock.js +6 -5
- package/dist/components/TodoChangeBlock.js.map +3 -3
- package/dist/components/TodoPanel.js +6 -3
- package/dist/components/TodoPanel.js.map +3 -3
- package/dist/components/TrustDialog.js +6 -5
- package/dist/components/TrustDialog.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js +2 -1
- package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js.map +2 -2
- package/dist/constants/macros.js +1 -1
- package/dist/constants/macros.js.map +1 -1
- package/dist/constants/product.js +2 -2
- package/dist/constants/product.js.map +1 -1
- package/dist/constants/prompts.js +17 -0
- package/dist/constants/prompts.js.map +2 -2
- package/dist/constants/toolInputExamples.js +5 -1
- package/dist/constants/toolInputExamples.js.map +2 -2
- package/dist/core/backupHook.js +29 -0
- package/dist/core/backupHook.js.map +7 -0
- package/dist/core/config/defaults.js +8 -2
- package/dist/core/config/defaults.js.map +2 -2
- package/dist/core/config/schema.js +14 -2
- package/dist/core/config/schema.js.map +2 -2
- package/dist/core/costTracker.js +0 -16
- package/dist/core/costTracker.js.map +2 -2
- package/dist/core/tokenStatsManager.js +5 -0
- package/dist/core/tokenStatsManager.js.map +2 -2
- package/dist/cost-tracker.js +0 -16
- package/dist/cost-tracker.js.map +2 -2
- package/dist/entrypoints/bootstrap.js +56 -0
- package/dist/entrypoints/bootstrap.js.map +7 -0
- package/dist/entrypoints/cli.js +164 -23
- package/dist/entrypoints/cli.js.map +3 -3
- package/dist/history.js +75 -15
- package/dist/history.js.map +2 -2
- package/dist/i18n/index.js +2 -2
- package/dist/i18n/index.js.map +2 -2
- package/dist/i18n/locales/en.js +582 -1
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.js +582 -1
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/i18n/types.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +2 -2
- package/dist/messages.js +11 -0
- package/dist/messages.js.map +2 -2
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +9 -0
- package/dist/query.js.map +2 -2
- package/dist/screens/REPL.js +45 -7
- package/dist/screens/REPL.js.map +2 -2
- package/dist/services/customCommands.js +44 -16
- package/dist/services/customCommands.js.map +2 -2
- package/dist/services/plugins/lspServers.js +1 -1
- package/dist/services/plugins/lspServers.js.map +2 -2
- package/dist/services/plugins/pluginRuntime.js +2 -1
- package/dist/services/plugins/pluginRuntime.js.map +2 -2
- package/dist/services/plugins/pluginValidation.js +10 -3
- package/dist/services/plugins/pluginValidation.js.map +2 -2
- package/dist/services/plugins/skillMarketplace.js +16 -8
- package/dist/services/plugins/skillMarketplace.js.map +2 -2
- package/dist/services/systemReminder.js +17 -6
- package/dist/services/systemReminder.js.map +2 -2
- package/dist/tools/FileEditTool/FileEditTool.js +7 -0
- package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
- package/dist/tools/FileWriteTool/FileWriteTool.js +7 -0
- package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js +7 -0
- package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
- package/dist/tools/NotebookEditTool/NotebookEditTool.js +2 -0
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
- package/dist/tools/TaskTool/TaskTool.js +179 -1
- package/dist/tools/TaskTool/TaskTool.js.map +2 -2
- package/dist/tools/TodoWriteTool/prompt.js +21 -0
- package/dist/tools/TodoWriteTool/prompt.js.map +2 -2
- package/dist/tools/URLFetcherTool/prompt.js +14 -9
- package/dist/tools/URLFetcherTool/prompt.js.map +2 -2
- package/dist/tools/WebSearchTool/prompt.js +12 -6
- package/dist/tools/WebSearchTool/prompt.js.map +2 -2
- package/dist/types/PermissionMode.js +30 -1
- package/dist/types/PermissionMode.js.map +2 -2
- package/dist/types/plugin.js +2 -4
- package/dist/types/plugin.js.map +2 -2
- package/dist/utils/agentHookExecutor.js +103 -0
- package/dist/utils/agentHookExecutor.js.map +7 -0
- package/dist/utils/agentLoader.js +272 -32
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/agentMemory.js +134 -0
- package/dist/utils/agentMemory.js.map +7 -0
- package/dist/utils/claudeCodeSync.js +439 -0
- package/dist/utils/claudeCodeSync.js.map +7 -0
- package/dist/utils/config.js +52 -24
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/configPaths.js +199 -0
- package/dist/utils/configPaths.js.map +7 -0
- package/dist/utils/execFileNoThrow.js +2 -1
- package/dist/utils/execFileNoThrow.js.map +2 -2
- package/dist/utils/historyManager.js +234 -0
- package/dist/utils/historyManager.js.map +7 -0
- package/dist/utils/marketplaceManager.js +80 -43
- package/dist/utils/marketplaceManager.js.map +2 -2
- package/dist/utils/messages.js +13 -8
- package/dist/utils/messages.js.map +2 -2
- package/dist/utils/migration/index.js +37 -0
- package/dist/utils/migration/index.js.map +7 -0
- package/dist/utils/migration/migrateHistory.js +273 -0
- package/dist/utils/migration/migrateHistory.js.map +7 -0
- package/dist/utils/migration/migrateTodos.js +323 -0
- package/dist/utils/migration/migrateTodos.js.map +7 -0
- package/dist/utils/pasteCache.js +309 -0
- package/dist/utils/pasteCache.js.map +7 -0
- package/dist/utils/pluginInstaller.js +34 -24
- package/dist/utils/pluginInstaller.js.map +2 -2
- package/dist/utils/pluginLoader.js +54 -28
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/repoFetcher.js +110 -0
- package/dist/utils/repoFetcher.js.map +7 -0
- package/dist/utils/sessionIndex.js +192 -0
- package/dist/utils/sessionIndex.js.map +7 -0
- package/dist/utils/sessionTracker.js +170 -0
- package/dist/utils/sessionTracker.js.map +7 -0
- package/dist/utils/skillLoader.js +103 -5
- package/dist/utils/skillLoader.js.map +2 -2
- package/dist/utils/stats.js +417 -0
- package/dist/utils/stats.js.map +7 -0
- package/dist/utils/stringSubstitution.js +106 -0
- package/dist/utils/stringSubstitution.js.map +7 -0
- package/dist/utils/teamConfig.js +156 -14
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/terminal.js +1 -1
- package/dist/utils/terminal.js.map +2 -2
- package/dist/utils/todoStorage.js +51 -19
- package/dist/utils/todoStorage.js.map +2 -2
- package/dist/utils/tooling/safeRender.js.map +2 -2
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +71 -28
- 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 <url|path> [--strategy\n <merge|replace|skip-existing>] [--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": "AAcA,OAAO,SAAS,UAAU,aAAa,eAAe;AACtD,SAAS,MAAM,WAAW;AAC1B,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,SAAS,qBAAqB;AAE9B,SAAS,SAAS;AAClB,SAAS,cAAc;AACvB,SAAS,sBAAsB;AAM/B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AAmBP,SAAS,WAAW,OAAoC;AACtD,MAAI,CAAC,MAAO,QAAO;AACnB,UACG,MAAM,cAAc,UAAU,MAC9B,MAAM,YAAY,UAAU,MAC5B,MAAM,kBAAkB,UAAU,MAClC,MAAM,YAAY,UAAU,MAC5B,MAAM,aAAa,UAAU;AAElC;AAMA,SAAS,UAAU,QAAqC;AACtD,QAAM,OAAwB;AAAA,IAC5B,EAAE,IAAI,YAAY,OAAO,EAAE,4BAA4B,EAAE;AAAA,EAC3D;AAEA,MAAI,OAAO,QAAQ,YAAY,OAAO,OAAO,SAAS,SAAS,GAAG;AAChE,SAAK,KAAK;AAAA,MACR,IAAI;AAAA,MACJ,OAAO,EAAE,0BAA0B;AAAA,MACnC,OAAO,OAAO,OAAO,SAAS;AAAA,IAChC,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,cAAc,OAAO,KAAK,OAAO,UAAU,EAAE,SAAS,GAAG;AAClE,SAAK,KAAK;AAAA,MACR,IAAI;AAAA,MACJ,OAAO,EAAE,uBAAuB;AAAA,MAChC,OAAO,OAAO,KAAK,OAAO,UAAU,EAAE;AAAA,IACxC,CAAC;AAAA,EACH;AAGA,QAAM,eACH,OAAO,SAAS,SAAS,UAAU,MACnC,OAAO,SAAS,aAAa,UAAU,MACvC,OAAO,SAAS,gBAAgB,UAAU,MAC1C,OAAO,SAAS,cAAc,UAAU;AAC3C,MAAI,cAAc,GAAG;AACnB,SAAK,KAAK;AAAA,MACR,IAAI;AAAA,MACJ,OAAO,EAAE,2BAA2B;AAAA,MACpC,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAGA,QAAM,cACH,OAAO,QAAQ,cAAc,UAAU,MACvC,OAAO,QAAQ,cAAc,UAAU,MACvC,OAAO,QAAQ,YAAY,UAAU,MACrC,OAAO,QAAQ,eAAe,UAAU;AAC3C,MAAI,aAAa,GAAG;AAClB,SAAK,KAAK;AAAA,MACR,IAAI;AAAA,MACJ,OAAO,EAAE,0BAA0B;AAAA,MACnC,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAGA,QAAM,cACH,OAAO,QAAQ,YAAY,UAAU,MACrC,OAAO,QAAQ,eAAe,UAAU;AAC3C,MAAI,aAAa,GAAG;AAClB,SAAK,KAAK;AAAA,MACR,IAAI;AAAA,MACJ,OAAO,EAAE,0BAA0B;AAAA,MACnC,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAGA,QAAM,gBACH,OAAO,UAAU,cAAc,UAAU,MACzC,OAAO,UAAU,iBAAiB,UAAU;AAC/C,MAAI,eAAe,GAAG;AACpB,SAAK,KAAK;AAAA,MACR,IAAI;AAAA,MACJ,OAAO,EAAE,4BAA4B;AAAA,MACrC,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAGA,QAAM,YAAY,WAAW,OAAO,KAAK,IAAI,WAAW,OAAO,YAAY;AAC3E,MAAI,YAAY,GAAG;AACjB,SAAK,KAAK;AAAA,MACR,IAAI;AAAA,MACJ,OAAO,EAAE,yBAAyB;AAAA,MAClC,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,YAAY,OAAO,KAAK,OAAO,QAAQ,EAAE,SAAS,GAAG;AAC9D,SAAK,KAAK;AAAA,MACR,IAAI;AAAA,MACJ,OAAO,EAAE,4BAA4B;AAAA,MACrC,OAAO,OAAO,KAAK,OAAO,QAAQ,EAAE;AAAA,IACtC,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,OAAe,QAAgC;AACjE,UAAQ,OAAO;AAAA,IACb,KAAK,YAAY;AACf,YAAM,QAAoB;AAAA,QACxB;AAAA,UACE,IAAI;AAAA,UACJ,OAAO,OAAO,QAAQ;AAAA,UACtB,aAAa,OAAO;AAAA,UACpB,UAAU;AAAA,QACZ;AAAA,MACF;AAEA,UAAI,OAAO,OAAO;AAChB,cAAM,KAAK;AAAA,UACT,IAAI;AAAA,UACJ,OAAO,UAAU,OAAO,KAAK;AAAA,UAC7B,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAEA,YAAM,aAAa,OAAO,QAAQ,UAAU,UAAU;AACtD,UAAI,aAAa,GAAG;AAClB,cAAM,KAAK;AAAA,UACT,IAAI;AAAA,UACJ,OAAO,GAAG,UAAU,iBAAiB,eAAe,IAAI,MAAM,EAAE;AAAA,UAChE,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAEA,YAAM,WAAW,OAAO,aACpB,OAAO,KAAK,OAAO,UAAU,EAAE,SAC/B;AACJ,UAAI,WAAW,GAAG;AAChB,cAAM,KAAK;AAAA,UACT,IAAI;AAAA,UACJ,OAAO,GAAG,QAAQ,cAAc,aAAa,IAAI,MAAM,EAAE;AAAA,UACzD,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAEA,YAAM,eACH,OAAO,SAAS,SAAS,UAAU,MACnC,OAAO,SAAS,aAAa,UAAU,MACvC,OAAO,SAAS,gBAAgB,UAAU;AAC7C,UAAI,cAAc,GAAG;AACnB,cAAM,KAAK;AAAA,UACT,IAAI;AAAA,UACJ,OAAO,GAAG,WAAW,UAAU,gBAAgB,IAAI,MAAM,EAAE;AAAA,UAC3D,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAEA,YAAM,cACH,OAAO,QAAQ,cAAc,UAAU,MACvC,OAAO,QAAQ,cAAc,UAAU,MACvC,OAAO,QAAQ,YAAY,UAAU,MACrC,OAAO,QAAQ,eAAe,UAAU;AAC3C,UAAI,aAAa,GAAG;AAClB,cAAM,KAAK;AAAA,UACT,IAAI;AAAA,UACJ,OAAO,GAAG,UAAU,SAAS,eAAe,IAAI,MAAM,EAAE;AAAA,UACxD,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAEA,YAAM,cACH,OAAO,QAAQ,YAAY,UAAU,MACrC,OAAO,QAAQ,eAAe,UAAU;AAC3C,UAAI,aAAa,GAAG;AAClB,cAAM,KAAK;AAAA,UACT,IAAI;AAAA,UACJ,OAAO,GAAG,UAAU,SAAS,eAAe,IAAI,MAAM,EAAE;AAAA,UACxD,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAEA,YAAM,gBACH,OAAO,UAAU,cAAc,UAAU,MACzC,OAAO,UAAU,iBAAiB,UAAU;AAC/C,UAAI,eAAe,GAAG;AACpB,cAAM,KAAK;AAAA,UACT,IAAI;AAAA,UACJ,OAAO,GAAG,YAAY,WAAW,iBAAiB,IAAI,MAAM,EAAE;AAAA,UAC9D,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAEA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK;AACH,cAAQ,OAAO,QAAQ,YAAY,CAAC,GAAG,IAAI,CAAC,GAAG,OAAO;AAAA,QACpD,IAAI,SAAS,CAAC;AAAA,QACd,OAAO,EAAE;AAAA,QACT,aAAa,GAAG,EAAE,QAAQ,MAAM,EAAE,SAAS;AAAA,QAC3C,QAAQ,EAAE,WAAY,YAAuB;AAAA,MAC/C,EAAE;AAAA,IAEJ,KAAK;AACH,aAAO,OAAO,QAAQ,OAAO,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,MAAM,OAAO;AAAA,QACtE,IAAI,OAAO,IAAI;AAAA,QACf,OAAO;AAAA,QACP,aACE,OAAO,SAAS,QACZ,QAAQ,OAAO,GAAG,KAClB,UAAU,OAAO,OAAO;AAAA,QAC9B,QACE,OAAO,YAAY,QACd,YACA;AAAA,MACT,EAAE;AAAA,IAEJ,KAAK,WAAW;AACd,YAAM,QAAoB,CAAC;AAC3B,iBAAW,MAAM,OAAO,SAAS,gBAAgB,CAAC,GAAG;AACnD,cAAM,KAAK;AAAA,UACT,IAAI,MAAM,EAAE;AAAA,UACZ,OAAO;AAAA,UACP,aAAa;AAAA,UACb,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAEA,iBAAW,KAAK,OAAO,SAAS,WAAW,CAAC,GAAG;AAC7C,cAAM,KAAK;AAAA,UACT,IAAI,UAAU,CAAC;AAAA,UACf,OAAO;AAAA,UACP,aAAa;AAAA,UACb,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AACA,iBAAW,KAAK,OAAO,SAAS,eAAe,CAAC,GAAG;AACjD,cAAM,KAAK;AAAA,UACT,IAAI,eAAe,CAAC;AAAA,UACpB,OAAO;AAAA,UACP,aAAa;AAAA,UACb,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AACA,iBAAW,KAAK,OAAO,SAAS,kBAAkB,CAAC,GAAG;AACpD,cAAM,KAAK;AAAA,UACT,IAAI,kBAAkB,CAAC;AAAA,UACvB,OAAO;AAAA,UACP,aAAa;AAAA,UACb,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,UAAU;AACb,YAAM,QAAoB,CAAC;AAC3B,iBAAW,KAAK,OAAO,QAAQ,gBAAgB,CAAC,GAAG;AACjD,cAAM,KAAK;AAAA,UACT,IAAI,gBAAgB,CAAC;AAAA,UACrB,OAAO;AAAA,UACP,aAAa;AAAA,UACb,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAEA,iBAAW,KAAK,OAAO,QAAQ,gBAAgB,CAAC,GAAG;AACjD,cAAM,KAAK;AAAA,UACT,IAAI,gBAAgB,EAAE,IAAI;AAAA,UAC1B,OAAO,EAAE;AAAA,UACT,aAAa,EAAE;AAAA,UACf,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AACA,iBAAW,KAAK,OAAO,QAAQ,cAAc,CAAC,GAAG;AAC/C,cAAM,KAAK;AAAA,UACT,IAAI,cAAc,EAAE,IAAI;AAAA,UACxB,OAAO,EAAE;AAAA,UACT,aAAa,EAAE;AAAA,UACf,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AACA,iBAAW,KAAK,OAAO,QAAQ,iBAAiB,CAAC,GAAG;AAClD,cAAM,KAAK;AAAA,UACT,IAAI,iBAAiB,EAAE,IAAI;AAAA,UAC3B,OAAO,EAAE;AAAA,UACT,aAAa,EAAE;AAAA,UACf,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,UAAU;AACb,YAAM,QAAoB,CAAC;AAC3B,iBAAW,KAAK,OAAO,QAAQ,cAAc,CAAC,GAAG;AAC/C,cAAM,KAAK;AAAA,UACT,IAAI,cAAc,EAAE,IAAI;AAAA,UACxB,OAAO,EAAE;AAAA,UACT,aAAa,EAAE;AAAA,UACf,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AACA,iBAAW,KAAK,OAAO,QAAQ,iBAAiB,CAAC,GAAG;AAClD,cAAM,KAAK;AAAA,UACT,IAAI,iBAAiB,EAAE,IAAI;AAAA,UAC3B,OAAO,EAAE;AAAA,UACT,aAAa,EAAE;AAAA,UACf,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,YAAY;AACf,YAAM,QAAoB,CAAC;AAC3B,iBAAW,KAAK,OAAO,UAAU,gBAAgB,CAAC,GAAG;AACnD,cAAM,KAAK;AAAA,UACT,IAAI,YAAY,EAAE,IAAI;AAAA,UACtB,OAAO,EAAE;AAAA,UACT,aAAa,EAAE;AAAA,UACf,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AACA,iBAAW,KAAK,OAAO,UAAU,mBAAmB,CAAC,GAAG;AACtD,cAAM,KAAK;AAAA,UACT,IAAI,eAAe,EAAE,IAAI;AAAA,UACzB,OAAO,EAAE;AAAA,UACT,aAAa,EAAE;AAAA,UACf,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,SAAS;AACZ,YAAM,QAAoB,CAAC;AAC3B,YAAM,WAAW,CACf,UACA,UACA,WACG;AACH,YAAI,CAAC,SAAU;AACf,iBAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,gBAAM,IAAI,SAAS,CAAC;AACpB,gBAAM,KAAK;AAAA,YACT,IAAI,QAAQ,MAAM,IAAI,QAAQ,IAAI,CAAC;AAAA,YACnC,OAAO,EAAE,QAAQ,EAAE,WAAW,QAAQ,IAAI,CAAC;AAAA,YAC3C,aAAa,EAAE;AAAA,YACf;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,OAAO,OAAO;AAChB,iBAAS,OAAO,MAAM,cAAc,2BAAwB,MAAM;AAClE,iBAAS,OAAO,MAAM,YAAY,yBAAsB,MAAM;AAC9D;AAAA,UACE,OAAO,MAAM;AAAA,UACb;AAAA,UACA;AAAA,QACF;AACA,iBAAS,OAAO,MAAM,YAAY,0BAAuB,MAAM;AAC/D,iBAAS,OAAO,MAAM,aAAa,2BAAwB,MAAM;AAAA,MACnE;AAEA,UAAI,OAAO,cAAc;AACvB;AAAA,UACE,OAAO,aAAa;AAAA,UACpB;AAAA,UACA;AAAA,QACF;AACA;AAAA,UACE,OAAO,aAAa;AAAA,UACpB;AAAA,UACA;AAAA,QACF;AACA;AAAA,UACE,OAAO,aAAa;AAAA,UACpB;AAAA,UACA;AAAA,QACF;AACA;AAAA,UACE,OAAO,aAAa;AAAA,UACpB;AAAA,UACA;AAAA,QACF;AACA;AAAA,UACE,OAAO,aAAa;AAAA,UACpB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK;AACH,aAAO,OAAO,QAAQ,OAAO,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,QAClE,IAAI,WAAW,GAAG;AAAA,QAClB,OAAO;AAAA,QACP,aAAa,OAAO,KAAK;AAAA,MAC3B,EAAE;AAAA,IAEJ;AACE,aAAO,CAAC;AAAA,EACZ;AACF;AAMA,eAAe,WACb,QACA,UACA,sBACA,YACiB;AACjB,QAAM,MAAM,OAAO;AACnB,QAAM,OAAO,QAAQ;AACrB,QAAM,UAAU,KAAK,MAAM,QAAQ;AACnC,QAAM,aAAa,KAAK,KAAK,QAAQ;AAGrC,aAAW,EAAE,yBAAyB,CAAC;AACvC,QAAM,SAAS,gBAAgB,QAAQ,QAAQ;AAE/C,QAAM,UAAoB,CAAC;AAE3B,MAAI,OAAO,cAAc,GAAG;AAC1B,YAAQ;AAAA,MACN,GAAG,OAAO,WAAW,SAAS,OAAO,gBAAgB,IAAI,MAAM,EAAE;AAAA,IACnE;AAAA,EACF;AACA,MAAI,OAAO,kBAAkB,GAAG;AAC9B,YAAQ;AAAA,MACN,GAAG,OAAO,eAAe,cAAc,OAAO,oBAAoB,IAAI,MAAM,EAAE;AAAA,IAChF;AAAA,EACF;AACA,MAAI,OAAO,gBAAgB,SAAS,GAAG;AACrC,YAAQ;AAAA,MACN,GAAG,OAAO,gBAAgB,MAAM,WAAW,OAAO,gBAAgB,WAAW,IAAI,MAAM,EAAE;AAAA,IAC3F;AAAA,EACF;AAEA,MAAI,sBAAsB;AAExB,QACE,OAAO,SAAS,gBAChB,OAAO,QAAQ,aAAa,SAAS,GACrC;AACA,iBAAW,EAAE,mCAAmC,CAAC;AACjD,YAAM,WAAW,MAAM,gBAAgB,OAAO,QAAQ,YAAY;AAClE,UAAI,SAAS,QAAQ,GAAG;AACtB,gBAAQ;AAAA,UACN,GAAG,SAAS,KAAK,eAAe,SAAS,UAAU,IAAI,MAAM,EAAE;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAGA,QAAI,mBAAmB;AAGvB,QAAI,OAAO,SAAS,WAAW,OAAO,QAAQ,QAAQ,SAAS,GAAG;AAChE,iBAAW,EAAE,kCAAkC,CAAC;AAChD,YAAM,IAAI,MAAM;AAAA,QACd,OAAO,QAAQ;AAAA,QACf,KAAK,SAAS,SAAS;AAAA,MACzB;AACA,0BAAoB,EAAE;AAAA,IACxB;AAEA,QAAI,OAAO,SAAS,eAAe,OAAO,QAAQ,YAAY,SAAS,GAAG;AACxE,iBAAW,EAAE,kCAAkC,CAAC;AAChD,YAAM,IAAI,MAAM;AAAA,QACd,OAAO,QAAQ;AAAA,QACf,KAAK,SAAS,SAAS;AAAA,MACzB;AACA,0BAAoB,EAAE;AAAA,IACxB;AAEA,QACE,OAAO,SAAS,kBAChB,OAAO,QAAQ,eAAe,SAAS,GACvC;AACA,iBAAW,EAAE,yCAAyC,CAAC;AACvD,YAAM,IAAI,MAAM;AAAA,QACd,OAAO,QAAQ;AAAA,QACf,KAAK,YAAY,SAAS;AAAA,MAC5B;AACA,0BAAoB,EAAE;AAAA,IACxB;AACA,QAAI,mBAAmB,GAAG;AACxB,cAAQ;AAAA,QACN,GAAG,gBAAgB,UAAU,qBAAqB,IAAI,MAAM,EAAE;AAAA,MAChE;AAAA,IACF;AAGA,QAAI,kBAAkB;AAEtB,QAAI,OAAO,QAAQ;AACjB,UAAI,OAAO,OAAO,gBAAgB,OAAO,OAAO,aAAa,SAAS,GAAG;AACvE,mBAAW,EAAE,iCAAiC,CAAC;AAC/C,cAAM,IAAI,MAAM;AAAA,UACd,OAAO,OAAO;AAAA,UACd,KAAK,SAAS,QAAQ;AAAA,QACxB;AACA,2BAAmB,EAAE;AAAA,MACvB;AAEA,UAAI,OAAO,OAAO,gBAAgB,OAAO,OAAO,aAAa,SAAS,GAAG;AACvE,mBAAW,EAAE,iCAAiC,CAAC;AAC/C,cAAM,IAAI,MAAM;AAAA,UACd,OAAO,OAAO;AAAA,UACd,KAAK,SAAS,QAAQ;AAAA,QACxB;AACA,2BAAmB,EAAE;AAAA,MACvB;AAEA,UAAI,OAAO,OAAO,cAAc,OAAO,OAAO,WAAW,SAAS,GAAG;AACnE,mBAAW,EAAE,iCAAiC,CAAC;AAC/C,cAAM,IAAI,MAAM;AAAA,UACd,OAAO,OAAO;AAAA,UACd,KAAK,SAAS,QAAQ;AAAA,QACxB;AACA,2BAAmB,EAAE;AAAA,MACvB;AAEA,UACE,OAAO,OAAO,iBACd,OAAO,OAAO,cAAc,SAAS,GACrC;AACA,mBAAW,EAAE,iCAAiC,CAAC;AAC/C,cAAM,IAAI,MAAM;AAAA,UACd,OAAO,OAAO;AAAA,UACd,KAAK,YAAY,QAAQ;AAAA,QAC3B;AACA,2BAAmB,EAAE;AAAA,MACvB;AAAA,IACF;AACA,QAAI,kBAAkB,GAAG;AACvB,cAAQ;AAAA,QACN,GAAG,eAAe,SAAS,oBAAoB,IAAI,MAAM,EAAE;AAAA,MAC7D;AAAA,IACF;AAGA,QAAI,kBAAkB;AAEtB,QAAI,OAAO,QAAQ;AACjB,UAAI,OAAO,OAAO,cAAc,OAAO,OAAO,WAAW,SAAS,GAAG;AACnE,mBAAW,EAAE,iCAAiC,CAAC;AAC/C,cAAM,IAAI,MAAM;AAAA,UACd,OAAO,OAAO;AAAA,UACd,KAAK,SAAS,QAAQ;AAAA,QACxB;AACA,2BAAmB,EAAE;AAAA,MACvB;AACA,UACE,OAAO,OAAO,iBACd,OAAO,OAAO,cAAc,SAAS,GACrC;AACA,mBAAW,EAAE,iCAAiC,CAAC;AAC/C,cAAM,IAAI,MAAM;AAAA,UACd,OAAO,OAAO;AAAA,UACd,KAAK,YAAY,QAAQ;AAAA,QAC3B;AACA,2BAAmB,EAAE;AAAA,MACvB;AAAA,IACF;AACA,QAAI,kBAAkB,GAAG;AACvB,cAAQ;AAAA,QACN,GAAG,eAAe,SAAS,oBAAoB,IAAI,MAAM,EAAE;AAAA,MAC7D;AAAA,IACF;AAGA,QAAI,oBAAoB;AAExB,QAAI,OAAO,UAAU;AACnB,UACE,OAAO,SAAS,gBAChB,OAAO,SAAS,aAAa,SAAS,GACtC;AACA,mBAAW,EAAE,mCAAmC,CAAC;AACjD,cAAM,IAAI,MAAM;AAAA,UACd,OAAO,SAAS;AAAA,UAChB,KAAK,SAAS,UAAU;AAAA,QAC1B;AACA,6BAAqB,EAAE;AAAA,MACzB;AACA,UACE,OAAO,SAAS,mBAChB,OAAO,SAAS,gBAAgB,SAAS,GACzC;AACA,mBAAW,EAAE,mCAAmC,CAAC;AACjD,cAAM,IAAI,MAAM;AAAA,UACd,OAAO,SAAS;AAAA,UAChB,KAAK,YAAY,UAAU;AAAA,QAC7B;AACA,6BAAqB,EAAE;AAAA,MACzB;AAAA,IACF;AACA,QAAI,oBAAoB,GAAG;AACzB,cAAQ;AAAA,QACN,GAAG,iBAAiB,WAAW,sBAAsB,IAAI,MAAM,EAAE;AAAA,MACnE;AAAA,IACF;AAGA,QAAI,iBAAiB;AAErB,QAAI,OAAO,OAAO;AAChB,iBAAW,EAAE,gCAAgC,CAAC;AAC9C,YAAM,IAAI,MAAM;AAAA,QACd,OAAO;AAAA,QACP,KAAK,SAAS,YAAY;AAAA,MAC5B;AACA,UAAI,EAAE,UAAW,kBAAiB;AAAA,IACpC;AACA,QAAI,OAAO,cAAc;AACvB,iBAAW,EAAE,gCAAgC,CAAC;AAC9C,YAAM,IAAI,MAAM;AAAA,QACd,OAAO;AAAA,QACP,KAAK,YAAY,YAAY;AAAA,MAC/B;AACA,UAAI,EAAE,UAAW,kBAAiB;AAAA,IACpC;AACA,QAAI,gBAAgB;AAClB,cAAQ,KAAK,OAAO;AAAA,IACtB;AAAA,EACF;AAEA,SAAO,QAAQ,SAAS,IACpB,GAAG,EAAE,wBAAwB,CAAC,KAAK,QAAQ,KAAK,IAAI,CAAC,MACrD,EAAE,wBAAwB;AAChC;AAMO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,WAAW;AAAA,EACX,gBAAgB,uBAAuB;AAAA,EACvC;AACF,GAAe;AACb,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAqB,SAAS;AACxD,QAAM,CAAC,YAAY,aAAa,IAAI,SAA4B,IAAI;AACpE,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,UAAU;AACrD,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAA+B,IAAI;AAG7E,QAAM,UAAU,MAAM;AACpB,mBAAe,OAAO;AACpB,UAAI;AACF,cAAM,SACJ,OAAO,WAAW,SAAS,KAAK,OAAO,WAAW,UAAU,IACxD,MAAM,gBAAgB,MAAM,IAC5B,uBAAuB,MAAM;AAEnC,sBAAc,MAAM;AACpB,iBAAS,SAAS;AAAA,MACpB,SAAS,OAAO;AACd,sBAAc,IAAI;AAClB,iBAAS,SAAS;AAClB,yBAAiB;AAAA,UACf,MAAM;AAAA,UACN,SAAS,GAAG,EAAE,uBAAuB,CAAC,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACnG,CAAC;AAAA,MACH;AAAA,IACF;AACA,SAAK;AAAA,EACP,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,OAAO;AAAA,IACX,MACE,aACI,UAAU,UAAU,IACpB,CAAC,EAAE,IAAI,YAAY,OAAO,EAAE,4BAA4B,EAAE,CAAC;AAAA,IACjE,CAAC,UAAU;AAAA,EACb;AAEA,QAAM,QAAQ;AAAA,IACZ,MAAO,aAAa,WAAW,WAAW,UAAU,IAAI,CAAC;AAAA,IACzD,CAAC,YAAY,SAAS;AAAA,EACxB;AAEA,QAAM,eAAe,YAAY,YAAY;AAC3C,QAAI,CAAC,cAAc,UAAU,UAAW;AAExC,aAAS,YAAY;AACrB,qBAAiB;AAAA,MACf,MAAM;AAAA,MACN,SAAS,EAAE,yBAAyB;AAAA,IACtC,CAAC;AAED,QAAI;AACF,YAAM,iBAAiB,MAAM;AAAA,QAC3B;AAAA,QACA;AAAA,QACA;AAAA,QACA,CAAC,YAAoB;AACnB,2BAAiB,EAAE,MAAM,WAAW,QAAQ,CAAC;AAAA,QAC/C;AAAA,MACF;AAEA,uBAAiB;AAAA,QACf,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH,SAAS,OAAO;AACd,uBAAiB;AAAA,QACf,MAAM;AAAA,QACN,SAAS,GAAG,EAAE,uBAAuB,CAAC,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACnG,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,YAAY,OAAO,UAAU,oBAAoB,CAAC;AAEtD,QAAM,cAAc,YAAY,MAAM;AACpC,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,CAAC;AAGX,MAAI,UAAU,WAAW;AACvB,WACE,oCAAC,WACC,oCAAC,mBAAc,GACf,oCAAC,QAAK,OAAM,UAAO,KAAE,EAAE,wBAAwB,CAAE,CACnD;AAAA,EAEJ;AAGA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,6BAA6B;AAAA,MACtC;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb;AAAA,MACA,eAAe;AAAA,MACf,UAAU;AAAA,MACV,SAAS;AAAA,MACT,YAAY,EAAE,4BAA4B;AAAA,MAC1C;AAAA,MACA,mBAAkB;AAAA,MAClB,iBACE,cAAc,cACd,cAAc,aACd,cAAc,YACd,cAAc,YACd,cAAc,cACd,cAAc;AAAA,MAEhB,UAAU,UAAU,gBAAgB,eAAe,SAAS;AAAA;AAAA,EAC9D;AAEJ;AAMA,MAAM,UAAU;AAAA,EACd,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aAAa,EAAE,4BAA4B;AAAA,EAC3C,WAAW;AAAA,EACX,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,KAAK,QAAQ,UAAU,aAAa;AACxC,UAAM,aAAa,eAAe,QAAQ,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG;AAChE,UAAM,OAAO,WAAW,MAAM,KAAK,EAAE,OAAO,OAAO;AACnD,UAAM,YAAY,KAAK,UAAU,SAAO,QAAQ,QAAQ;AACxD,UAAM,gBAAgB,KAAK,UAAU,SAAO,QAAQ,YAAY;AAChE,UAAM,gBAAgB,KAAK,SAAS,cAAc;AAElD,QAAI,cAAc,MAAM,CAAC,KAAK,YAAY,CAAC,GAAG;AAC5C;AAAA,QACE,GAAG,EAAE,iCAAiC,CAAC;AAAA,EAAK,EAAE,2BAA2B,CAAC;AAAA,MAC5E;AACA,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,KAAK,YAAY,CAAC;AACjC,UAAM,gBACJ,kBAAkB,MAAM,KAAK,gBAAgB,CAAC,IACzC,KAAK,gBAAgB,CAAC,IACvB;AACN,UAAM,uBAAuB,CAAC;AAE9B,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,UAAU;AAAA,QACV,gBAAgB;AAAA,QAChB;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,IAAO,gBAAQ;",
|
|
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
|
+
}
|
package/dist/commands/status.js
CHANGED
|
@@ -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
|
-
|
|
8
|
-
|
|
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: "
|
|
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
|
-
|
|
52
|
-
return /* @__PURE__ */ React.createElement(
|
|
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;
|