@within-7/minto 0.3.9 → 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/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 +19 -46
- package/dist/commands/language.js.map +2 -2
- 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/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 +1 -1
- package/dist/commands/resume.js.map +1 -1
- package/dist/commands/sandbox.js +168 -70
- package/dist/commands/sandbox.js.map +2 -2
- package/dist/commands/setup.js +593 -107
- package/dist/commands/setup.js.map +2 -2
- package/dist/commands/stats.js +188 -131
- package/dist/commands/stats.js.map +2 -2
- package/dist/commands/status.js +75 -13
- package/dist/commands/status.js.map +2 -2
- package/dist/commands/undo.js +138 -174
- package/dist/commands/undo.js.map +2 -2
- package/dist/commands.js.map +1 -1
- package/dist/components/Help.js +165 -32
- package/dist/components/Help.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/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 +5 -5
- package/dist/components/PromptInput.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 +31 -5
- package/dist/components/TabbedListView/ScrollableList.js.map +2 -2
- package/dist/components/TabbedListView/TabbedListView.js +122 -47
- package/dist/components/TabbedListView/TabbedListView.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/cost-tracker.js +0 -16
- package/dist/cost-tracker.js.map +2 -2
- package/dist/entrypoints/bootstrap.js +3 -1
- package/dist/entrypoints/bootstrap.js.map +2 -2
- package/dist/entrypoints/cli.js +32 -0
- package/dist/entrypoints/cli.js.map +2 -2
- package/dist/i18n/locales/en.js +300 -1
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.js +301 -2
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/i18n/types.js.map +1 -1
- package/dist/services/customCommands.js +30 -8
- 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 +9 -6
- package/dist/tools/TaskTool/TaskTool.js.map +2 -2
- package/dist/types/PermissionMode.js.map +1 -1
- package/dist/types/plugin.js +2 -4
- package/dist/types/plugin.js.map +2 -2
- package/dist/utils/agentHookExecutor.js +1 -4
- package/dist/utils/agentHookExecutor.js.map +2 -2
- package/dist/utils/agentLoader.js +67 -13
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/agentMemory.js.map +2 -2
- package/dist/utils/claudeCodeSync.js +439 -0
- package/dist/utils/claudeCodeSync.js.map +7 -0
- package/dist/utils/config.js +1 -23
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/execFileNoThrow.js +2 -1
- package/dist/utils/execFileNoThrow.js.map +2 -2
- package/dist/utils/marketplaceManager.js +80 -43
- package/dist/utils/marketplaceManager.js.map +2 -2
- package/dist/utils/messages.js +2 -2
- package/dist/utils/messages.js.map +2 -2
- package/dist/utils/pluginInstaller.js +34 -24
- package/dist/utils/pluginInstaller.js.map +2 -2
- package/dist/utils/pluginLoader.js +48 -25
- 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/skillLoader.js +18 -6
- package/dist/utils/skillLoader.js.map +2 -2
- package/dist/utils/stringSubstitution.js +4 -5
- package/dist/utils/stringSubstitution.js.map +2 -2
- package/dist/utils/teamConfig.js +153 -13
- 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/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +6 -6
|
@@ -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, commandArgs) {\n // Parse arguments from either slash command args or process.argv (CLI mode)\n // Slash command: /setup --from <url> passes args as commandArgs\n // CLI mode: minto setup --from <url> uses process.argv\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 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": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/commands/stats.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { Box, Text, useInput } from "ink";
|
|
3
2
|
import { t } from "../i18n/index.js";
|
|
4
3
|
import { BRAND_GRADIENT, SEMANTIC_COLORS } from "../constants/colors.js";
|
|
5
4
|
import {
|
|
@@ -9,29 +8,17 @@ import {
|
|
|
9
8
|
getModelUsageStats,
|
|
10
9
|
getToolUsageStats
|
|
11
10
|
} from "../utils/stats.js";
|
|
12
|
-
import {
|
|
13
|
-
function renderProgressBar(value, max, width = 40) {
|
|
14
|
-
if (max === 0) return "\u2591".repeat(width);
|
|
15
|
-
const filled = Math.min(Math.round(value / max * width), width);
|
|
16
|
-
const empty = width - filled;
|
|
17
|
-
return "\u2588".repeat(filled) + "\u2591".repeat(empty);
|
|
18
|
-
}
|
|
11
|
+
import { InfoPanel } from "../components/InfoPanel/index.js";
|
|
19
12
|
function formatNumber(n) {
|
|
20
13
|
return n.toLocaleString();
|
|
21
14
|
}
|
|
22
15
|
function formatCompactNumber(n) {
|
|
23
|
-
if (n >= 1e6) {
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
if (n >= 1e3) {
|
|
27
|
-
return `${(n / 1e3).toFixed(1)}K`;
|
|
28
|
-
}
|
|
16
|
+
if (n >= 1e6) return `${(n / 1e6).toFixed(1)}M`;
|
|
17
|
+
if (n >= 1e3) return `${(n / 1e3).toFixed(1)}K`;
|
|
29
18
|
return n.toString();
|
|
30
19
|
}
|
|
31
20
|
function formatCost(cost) {
|
|
32
|
-
if (cost < 0.01) {
|
|
33
|
-
return `$${cost.toFixed(4)}`;
|
|
34
|
-
}
|
|
21
|
+
if (cost < 0.01) return `$${cost.toFixed(4)}`;
|
|
35
22
|
return `$${cost.toFixed(2)}`;
|
|
36
23
|
}
|
|
37
24
|
function getTodayString() {
|
|
@@ -61,64 +48,7 @@ function sumDailyStats(days) {
|
|
|
61
48
|
}
|
|
62
49
|
);
|
|
63
50
|
}
|
|
64
|
-
function
|
|
65
|
-
label,
|
|
66
|
-
value,
|
|
67
|
-
max,
|
|
68
|
-
barWidth = 20,
|
|
69
|
-
comparison,
|
|
70
|
-
suffix
|
|
71
|
-
}) {
|
|
72
|
-
const bar = renderProgressBar(value, max, barWidth);
|
|
73
|
-
const formattedValue = formatNumber(value);
|
|
74
|
-
const paddedLabel = label.padEnd(12);
|
|
75
|
-
const paddedValue = formattedValue.padStart(8);
|
|
76
|
-
return /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, paddedLabel), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, paddedValue), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " "), /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.START }, bar), comparison !== void 0 && comparison !== 0 && /* @__PURE__ */ React.createElement(
|
|
77
|
-
Text,
|
|
78
|
-
{
|
|
79
|
-
color: comparison > 0 ? SEMANTIC_COLORS.success : SEMANTIC_COLORS.error
|
|
80
|
-
},
|
|
81
|
-
" ",
|
|
82
|
-
"(",
|
|
83
|
-
comparison > 0 ? "+" : "",
|
|
84
|
-
comparison,
|
|
85
|
-
" ",
|
|
86
|
-
t("commands.stats.vsYesterday"),
|
|
87
|
-
")"
|
|
88
|
-
), suffix && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", suffix));
|
|
89
|
-
}
|
|
90
|
-
function ModelRow({ model, totalCalls, barWidth = 40 }) {
|
|
91
|
-
const percentage = safePercentage(model.calls, totalCalls);
|
|
92
|
-
const bar = renderProgressBar(model.calls, totalCalls, barWidth);
|
|
93
|
-
const displayName = model.model.length > 14 ? model.model.slice(0, 11) + "..." : model.model;
|
|
94
|
-
return /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, displayName.padEnd(14)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, String(percentage).padStart(3), "%"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " "), /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.MIDDLE }, bar), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "(", formatNumber(model.calls), " ", t("commands.stats.calls"), ")"));
|
|
95
|
-
}
|
|
96
|
-
function ToolRow({ tool, rank }) {
|
|
97
|
-
const successRate = safePercentage(tool.successCount, tool.calls);
|
|
98
|
-
const displayName = tool.toolName.length > 16 ? tool.toolName.slice(0, 13) + "..." : tool.toolName;
|
|
99
|
-
return /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, String(rank).padStart(2), ". "), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, displayName.padEnd(16)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, formatNumber(tool.calls).padStart(6)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", t("commands.stats.calls")), tool.errorCount > 0 && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.error }, " (", successRate, "% success)"));
|
|
100
|
-
}
|
|
101
|
-
function StatsDisplay({
|
|
102
|
-
stats,
|
|
103
|
-
today,
|
|
104
|
-
yesterday,
|
|
105
|
-
weekStats,
|
|
106
|
-
showWeek,
|
|
107
|
-
showMonth,
|
|
108
|
-
showModels,
|
|
109
|
-
showTools,
|
|
110
|
-
onClose
|
|
111
|
-
}) {
|
|
112
|
-
useInput((_, key) => {
|
|
113
|
-
if (key.return || key.escape) onClose();
|
|
114
|
-
});
|
|
115
|
-
const modelStats = getModelUsageStats();
|
|
116
|
-
const toolStats = getToolUsageStats();
|
|
117
|
-
const totalModelCalls = modelStats.reduce((sum, m) => sum + m.calls, 0);
|
|
118
|
-
const msgDiff = today && yesterday ? today.messageCount - yesterday.messageCount : void 0;
|
|
119
|
-
const sessionDiff = today && yesterday ? today.sessionCount - yesterday.sessionCount : void 0;
|
|
120
|
-
const toolDiff = today && yesterday ? today.toolCallCount - yesterday.toolCallCount : void 0;
|
|
121
|
-
const tokenDiff = today && yesterday ? today.tokensUsed - yesterday.tokensUsed : void 0;
|
|
51
|
+
function buildTodaySection(today, yesterday) {
|
|
122
52
|
const maxMsg = Math.max(
|
|
123
53
|
today?.messageCount ?? 0,
|
|
124
54
|
yesterday?.messageCount ?? 0,
|
|
@@ -139,53 +69,139 @@ function StatsDisplay({
|
|
|
139
69
|
yesterday?.tokensUsed ?? 0,
|
|
140
70
|
1
|
|
141
71
|
);
|
|
142
|
-
const
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
return
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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
|
+
};
|
|
189
205
|
}
|
|
190
206
|
function parseArgs(args) {
|
|
191
207
|
const trimmed = args.trim().toLowerCase();
|
|
@@ -201,6 +217,7 @@ const command = {
|
|
|
201
217
|
description: t("commands.stats.description"),
|
|
202
218
|
isEnabled: true,
|
|
203
219
|
isHidden: false,
|
|
220
|
+
hidePromptInput: true,
|
|
204
221
|
type: "local-jsx",
|
|
205
222
|
userFacingName() {
|
|
206
223
|
return this.name;
|
|
@@ -209,20 +226,60 @@ const command = {
|
|
|
209
226
|
const parsedArgs = parseArgs(args ?? "");
|
|
210
227
|
const stats = getStats();
|
|
211
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
|
+
}
|
|
212
251
|
const recentDays = getStatsForDays(2);
|
|
213
252
|
const yesterday = recentDays.length >= 2 ? recentDays[1] ?? null : null;
|
|
214
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
|
+
}
|
|
215
278
|
return /* @__PURE__ */ React.createElement(
|
|
216
|
-
|
|
279
|
+
InfoPanel,
|
|
217
280
|
{
|
|
218
|
-
stats,
|
|
219
|
-
|
|
220
|
-
yesterday,
|
|
221
|
-
weekStats,
|
|
222
|
-
showWeek: parsedArgs.week,
|
|
223
|
-
showMonth: parsedArgs.month,
|
|
224
|
-
showModels: parsedArgs.models,
|
|
225
|
-
showTools: parsedArgs.tools,
|
|
281
|
+
title: t("commands.stats.title"),
|
|
282
|
+
sections,
|
|
226
283
|
onClose: onDone
|
|
227
284
|
}
|
|
228
285
|
);
|