@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/mcp-interactive.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * Interactive MCP Server Management UI\n *\n * Complete interactive interface for MCP server management with navigation\n */\n\nimport React, { useState, useEffect, useCallback } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { Select } from '@components/CustomSelect/select'\nimport { getTheme } from '@utils/theme'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport { Command } from '@commands'\nimport {\n listMCPServers,\n getClients,\n refreshMCPConnections,\n getMcpServer,\n addMcpServer,\n removeMcpServer,\n type ScopedMcpServerConfig,\n} from '@services/mcpClient'\nimport { SimpleSpinner } from '@components/Spinner'\nimport {\n getCurrentProjectConfig,\n saveCurrentProjectConfig,\n} from '@utils/config'\n\n// =============================================================================\n// Types\n// =============================================================================\n\ntype Screen = 'main-menu' | 'server-list' | 'server-details'\n\ntype NavigationState = {\n screen: Screen\n serverName?: string\n}\n\ntype ServerStatus = {\n name: string\n status: 'connected' | 'failed'\n config: ScopedMcpServerConfig\n}\n\n// =============================================================================\n// Main Menu\n// =============================================================================\n\nconst MainMenu: React.FC<{\n onNavigate: (state: NavigationState) => void\n onExit: () => void\n isActive?: boolean\n}> = ({ onNavigate, onExit, isActive = true }) => {\n const theme = getTheme()\n\n const options = [\n { label: '\uD83D\uDCCB View all MCP servers', value: 'list' },\n { label: '\uD83D\uDD04 Refresh connections', value: 'refresh' },\n ]\n\n // Only listen when this component is active\n useInput(\n (input, key) => {\n if (key.escape) onExit()\n },\n { isActive },\n )\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.primary}\n padding={1}\n >\n <Box marginBottom={1}>\n <Text bold color={theme.primary}>\n MCP Server Manager\n </Text>\n </Box>\n\n <Select\n options={options}\n onChange={value => {\n if (value === 'list') onNavigate({ screen: 'server-list' })\n else if (value === 'refresh') {\n refreshMCPConnections()\n onNavigate({ screen: 'server-list' })\n }\n }}\n />\n\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>ESC</Text> to exit\n </Text>\n </Box>\n </Box>\n )\n}\n\n// =============================================================================\n// Server List\n// =============================================================================\n\nconst ServerList: React.FC<{\n onNavigate: (state: NavigationState) => void\n onBack: () => void\n isActive?: boolean\n}> = ({ onNavigate, onBack, isActive = true }) => {\n const theme = getTheme()\n const [loading, setLoading] = useState(true)\n const [servers, setServers] = useState<ServerStatus[]>([])\n\n useEffect(() => {\n const loadServers = async () => {\n const serverConfigs = listMCPServers()\n const clients = await getClients()\n\n const serverStatuses: ServerStatus[] = Object.entries(serverConfigs).map(\n ([name, _]) => {\n const client = clients.find(c => c.name === name)\n const config = getMcpServer(name)!\n return {\n name,\n status: client?.type === 'connected' ? 'connected' : 'failed',\n config,\n }\n },\n )\n\n setServers(serverStatuses)\n setLoading(false)\n }\n\n loadServers()\n }, [])\n\n // Memoize the onChange handler to prevent infinite re-renders\n const handleServerSelect = useCallback(\n (serverName: string) => {\n onNavigate({ screen: 'server-details', serverName })\n },\n [onNavigate],\n )\n\n // Only listen when this component is active\n useInput(\n (input, key) => {\n if (key.escape) onBack()\n },\n { isActive },\n )\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <SimpleSpinner label=\"Loading MCP servers...\" />\n </Box>\n )\n }\n\n if (servers.length === 0) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text>No MCP servers configured.</Text>\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>ESC</Text> to go back\n </Text>\n </Box>\n </Box>\n )\n }\n\n const options = servers.map(server => {\n const statusIcon = server.status === 'connected' ? '\u2713' : '\u2717'\n const statusColor =\n server.status === 'connected' ? theme.success : theme.error\n return {\n label: (\n <Text>\n <Text color={statusColor}>{statusIcon}</Text> {server.name}{' '}\n <Text color={SEMANTIC_COLORS.dim}>({server.config.scope})</Text>\n </Text>\n ),\n value: server.name,\n }\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.primary}\n padding={1}\n >\n <Box marginBottom={1}>\n <Text bold color={theme.primary}>\n MCP Servers\n </Text>\n </Box>\n\n <Select options={options} onChange={handleServerSelect} />\n\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>ESC</Text> to go back\n </Text>\n </Box>\n </Box>\n )\n}\n\n// =============================================================================\n// Server Details\n// =============================================================================\n\nconst ServerDetails: React.FC<{\n serverName: string\n onBack: () => void\n onRefresh: () => void\n isActive?: boolean\n}> = ({ serverName, onBack, onRefresh, isActive = true }) => {\n const theme = getTheme()\n const [loading, setLoading] = useState(true)\n const [server, setServer] = useState<ServerStatus | null>(null)\n const [toggling, setToggling] = useState(false)\n\n useEffect(() => {\n const loadServer = async () => {\n const config = getMcpServer(serverName)\n if (!config) {\n onBack()\n return\n }\n\n const clients = await getClients()\n const client = clients.find(c => c.name === serverName)\n\n setServer({\n name: serverName,\n status: client?.type === 'connected' ? 'connected' : 'failed',\n config,\n })\n setLoading(false)\n }\n\n loadServer()\n }, [serverName])\n\n const toggleEnabled = async () => {\n if (!server) return\n\n setToggling(true)\n\n // Get current project config\n const projectConfig = getCurrentProjectConfig()\n const currentServer = projectConfig.mcpServers?.[serverName]\n\n if (currentServer) {\n // Toggle in project config\n const newEnabled = !(currentServer.enabled ?? true)\n await saveCurrentProjectConfig({\n ...projectConfig,\n mcpServers: {\n ...projectConfig.mcpServers,\n [serverName]: {\n ...currentServer,\n enabled: newEnabled,\n },\n },\n })\n } else {\n // Server is from global or mcprc, copy to project and disable\n const serverConfig = getMcpServer(serverName)\n if (serverConfig) {\n await saveCurrentProjectConfig({\n ...projectConfig,\n mcpServers: {\n ...projectConfig.mcpServers,\n [serverName]: {\n ...serverConfig,\n enabled: false,\n },\n },\n })\n }\n }\n\n setToggling(false)\n refreshMCPConnections()\n onRefresh()\n }\n\n // Only listen when this component is active\n useInput(\n (input, key) => {\n if (key.escape) onBack()\n },\n { isActive },\n )\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <SimpleSpinner label=\"Loading server details...\" />\n </Box>\n )\n }\n\n if (!server) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color={theme.error}>Server not found</Text>\n </Box>\n )\n }\n\n const isEnabled = 'enabled' in server.config ? server.config.enabled : true\n const statusColor =\n server.status === 'connected' ? theme.success : theme.error\n const enabledColor = isEnabled ? theme.success : theme.error\n\n const options = [\n {\n label: isEnabled ? '\uD83D\uDD34 Disable server' : '\uD83D\uDFE2 Enable server',\n value: 'toggle',\n },\n { label: '\uD83D\uDD04 Refresh connection', value: 'refresh' },\n { label: '\u2190 Back to list', value: 'back' },\n ]\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.primary}\n padding={1}\n >\n <Box marginBottom={1}>\n <Text bold color={theme.primary}>\n {server.name}\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text>\n Status: <Text color={statusColor}>{server.status}</Text>\n </Text>\n <Text>\n Enabled: <Text color={enabledColor}>{isEnabled ? 'Yes' : 'No'}</Text>\n </Text>\n <Text>\n Scope: <Text color={SEMANTIC_COLORS.dim}>{server.config.scope}</Text>\n </Text>\n <Text>\n Type: <Text color={SEMANTIC_COLORS.dim}>{server.config.type}</Text>\n </Text>\n </Box>\n\n {toggling ? (\n <SimpleSpinner label=\"Toggling server...\" />\n ) : (\n <Select\n options={options}\n onChange={value => {\n if (value === 'toggle') toggleEnabled()\n else if (value === 'refresh') {\n refreshMCPConnections()\n onRefresh()\n } else if (value === 'back') onBack()\n }}\n />\n )}\n\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>ESC</Text> to go back\n </Text>\n </Box>\n </Box>\n )\n}\n\n// =============================================================================\n// Main Interactive Component\n// =============================================================================\n\nconst MCPInteractive: React.FC<{\n onDone: (result?: string) => void\n}> = ({ onDone }) => {\n const [navState, setNavState] = useState<NavigationState>({\n screen: 'main-menu',\n })\n\n const handleNavigate = (state: NavigationState) => {\n setNavState(state)\n }\n\n const handleBack = () => {\n if (navState.screen === 'server-details') {\n setNavState({ screen: 'server-list' })\n } else {\n setNavState({ screen: 'main-menu' })\n }\n }\n\n const handleRefresh = () => {\n // Reload current screen\n setNavState({ ...navState })\n }\n\n switch (navState.screen) {\n case 'main-menu':\n return <MainMenu onNavigate={handleNavigate} onExit={() => onDone()} />\n\n case 'server-list':\n return <ServerList onNavigate={handleNavigate} onBack={handleBack} />\n\n case 'server-details':\n return (\n <ServerDetails\n serverName={navState.serverName!}\n onBack={handleBack}\n onRefresh={handleRefresh}\n />\n )\n\n default:\n return <Text>Unknown screen</Text>\n }\n}\n\n// =============================================================================\n// Command Definition\n// =============================================================================\n\nconst mcpInteractive = {\n type: 'local-jsx',\n name: 'mcp',\n description: 'Interactive MCP server management',\n isEnabled: true,\n isHidden: false,\n async call(onDone: (result?: string) => void) {\n return <MCPInteractive onDone={onDone} />\n },\n userFacingName() {\n return 'mcp'\n },\n} satisfies Command\n\nexport default mcpInteractive\n"],
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["/**\n * Interactive MCP Server Management UI\n *\n * Uses TabbedListView for consistent UI matching /agents and /plugins.\n *\n * Phase flow:\n * main \u2192 (select server) \u2192 server-actions \u2192 (toggle|delete|back)\n * \u2193\n * confirm-delete \u2192 main\n * main \u2192 (Add Server) \u2192 add-name \u2192 add-command \u2192 main\n * main \u2192 (Refresh All) \u2192 main\n */\n\nimport React, { useState, useEffect, useCallback, useMemo } from 'react'\nimport { Command } from '@commands'\nimport {\n listMCPServers,\n getClients,\n refreshMCPConnections,\n getMcpServer,\n addMcpServer,\n removeMcpServer,\n type ScopedMcpServerConfig,\n} from '@services/mcpClient'\nimport {\n getCurrentProjectConfig,\n saveCurrentProjectConfig,\n} from '@utils/config'\nimport { TabbedListView } from '@components/TabbedListView/TabbedListView'\nimport type {\n ListItem,\n TabDefinition,\n StatusOverlay,\n} from '@components/TabbedListView/types'\nimport { t } from '@i18n'\n\n// =============================================================================\n// Types\n// =============================================================================\n\ntype ServerStatus = {\n name: string\n status: 'connected' | 'failed'\n config: ScopedMcpServerConfig\n}\n\ntype MCPPhase =\n | { type: 'main' }\n | { type: 'server-actions'; serverName: string; scope: string }\n | { type: 'confirm-delete'; serverName: string; scope: string }\n | { type: 'add-name' }\n | { type: 'add-command'; name: string }\n\n// Special item IDs for action entries in the list\nconst ID_ADD_SERVER = '__add__'\nconst ID_REFRESH_ALL = '__refresh__'\nconst ID_TOGGLE = '__toggle__'\nconst ID_DELETE = '__delete__'\nconst ID_BACK = '__back__'\nconst ID_CONFIRM_YES = '__yes__'\nconst ID_CONFIRM_NO = '__no__'\n\n// =============================================================================\n// Main Interactive Component\n// =============================================================================\n\nconst MCPInteractive: React.FC<{\n onDone: (result?: string) => void\n}> = ({ onDone }) => {\n const [phase, setPhase] = useState<MCPPhase>({ type: 'main' })\n const [activeTab, setActiveTab] = useState('all')\n const [searchQuery, setSearchQuery] = useState('')\n const [statusOverlay, setStatusOverlay] = useState<StatusOverlay | null>(null)\n const [servers, setServers] = useState<ServerStatus[]>([])\n const [loading, setLoading] = useState(true)\n\n // Load servers\n const loadServers = useCallback(async () => {\n try {\n const serverConfigs = listMCPServers()\n const clients = await getClients()\n\n const serverStatuses: ServerStatus[] = Object.entries(serverConfigs).map(\n ([name, _]) => {\n const client = clients.find(c => c.name === name)\n const config = getMcpServer(name)!\n return {\n name,\n status: client?.type === 'connected' ? 'connected' : 'failed',\n config,\n }\n },\n )\n\n setServers(serverStatuses)\n } catch {\n setServers([])\n }\n }, [])\n\n // Initial load\n useEffect(() => {\n setLoading(true)\n loadServers().finally(() => setLoading(false))\n }, [loadServers])\n\n // Reload on return to main\n useEffect(() => {\n if (phase.type === 'main') {\n loadServers()\n setSearchQuery('')\n }\n }, [phase, loadServers])\n\n // \u2500\u2500\u2500 Actions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const toggleServer = useCallback(\n async (serverName: string) => {\n setStatusOverlay({\n type: 'loading',\n message: t('commands.mcp.toggling'),\n })\n try {\n const projectConfig = getCurrentProjectConfig()\n const currentServer = projectConfig.mcpServers?.[serverName]\n\n if (currentServer) {\n const newEnabled = !(currentServer.enabled ?? true)\n await saveCurrentProjectConfig({\n ...projectConfig,\n mcpServers: {\n ...projectConfig.mcpServers,\n [serverName]: { ...currentServer, enabled: newEnabled },\n },\n })\n } else {\n const serverConfig = getMcpServer(serverName)\n if (serverConfig) {\n await saveCurrentProjectConfig({\n ...projectConfig,\n mcpServers: {\n ...projectConfig.mcpServers,\n [serverName]: { ...serverConfig, enabled: false },\n },\n })\n }\n }\n\n refreshMCPConnections()\n await loadServers()\n setStatusOverlay({\n type: 'success',\n message: t('commands.mcp.toggleSuccess'),\n })\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n setStatusOverlay({ type: 'error', message: msg })\n }\n },\n [loadServers],\n )\n\n const deleteServer = useCallback(\n async (serverName: string, scope: string) => {\n setStatusOverlay({\n type: 'loading',\n message: t('commands.mcp.deleting'),\n })\n try {\n removeMcpServer(serverName, scope as 'project' | 'global')\n refreshMCPConnections()\n await loadServers()\n setStatusOverlay({\n type: 'success',\n message: t('commands.mcp.deleteSuccess'),\n })\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n setStatusOverlay({ type: 'error', message: msg })\n }\n },\n [loadServers],\n )\n\n const addNewServer = useCallback(\n async (name: string, commandOrUrl: string) => {\n setStatusOverlay({\n type: 'loading',\n message: t('commands.mcp.adding'),\n })\n try {\n if (\n commandOrUrl.startsWith('http://') ||\n commandOrUrl.startsWith('https://')\n ) {\n addMcpServer(name, { type: 'sse', url: commandOrUrl }, 'project')\n } else {\n const parts = commandOrUrl.split(/\\s+/)\n const command = parts[0]\n const args = parts.slice(1)\n addMcpServer(\n name,\n { type: 'stdio', command, args: args.length > 0 ? args : [] },\n 'project',\n )\n }\n refreshMCPConnections()\n await loadServers()\n setStatusOverlay({\n type: 'success',\n message: t('commands.mcp.addSuccess'),\n })\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n setStatusOverlay({\n type: 'error',\n message: `${t('commands.mcp.addFailed')}: ${msg}`,\n })\n }\n },\n [loadServers],\n )\n\n const refreshAll = useCallback(async () => {\n setStatusOverlay({\n type: 'loading',\n message: t('commands.mcp.refreshing'),\n })\n try {\n refreshMCPConnections()\n await loadServers()\n setStatusOverlay({\n type: 'success',\n message: t('commands.mcp.refreshSuccess'),\n })\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n setStatusOverlay({ type: 'error', message: msg })\n }\n }, [loadServers])\n\n // \u2500\u2500\u2500 Build tabs, items, title based on phase \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const { tabs, items, title, footerHint, searchEnabled, searchPlaceholder } =\n useMemo(() => {\n switch (phase.type) {\n case 'main': {\n const projectCount = servers.filter(\n s => s.config.scope === 'project',\n ).length\n const globalCount = servers.filter(\n s => s.config.scope === 'global',\n ).length\n\n const mainTabs: TabDefinition[] = [\n {\n id: 'all',\n label: t('commands.mcp.tabAll'),\n badge: servers.length,\n },\n {\n id: 'project',\n label: t('commands.mcp.tabProject'),\n badge: projectCount,\n },\n {\n id: 'global',\n label: t('commands.mcp.tabGlobal'),\n badge: globalCount,\n },\n ]\n\n // Filter servers by active tab\n const filtered =\n activeTab === 'all'\n ? servers\n : servers.filter(s => s.config.scope === activeTab)\n\n const mainItems: ListItem[] = filtered.map(server => {\n const isEnabled =\n 'enabled' in server.config ? server.config.enabled : true\n return {\n id: server.name,\n label: server.name,\n description: `${server.config.scope} \u00B7 ${server.config.type}`,\n status: !isEnabled\n ? 'disabled'\n : server.status === 'connected'\n ? 'enabled'\n : 'error',\n data: { type: 'server', server },\n }\n })\n\n // Action entries at the bottom\n mainItems.push({\n id: ID_ADD_SERVER,\n label: `+ ${t('commands.mcp.addServer')}`,\n data: { type: 'action' },\n })\n mainItems.push({\n id: ID_REFRESH_ALL,\n label: `\u21BB ${t('commands.mcp.refreshAll')}`,\n data: { type: 'action' },\n })\n\n return {\n tabs: mainTabs,\n items: mainItems,\n title: t('commands.mcp.title'),\n footerHint:\n '\u2191\u2193 Navigate \u00B7 Enter Select \u00B7 Tab Switch \u00B7 / Search \u00B7 Esc Exit',\n searchEnabled: true,\n searchPlaceholder: undefined,\n }\n }\n\n case 'server-actions': {\n const server = servers.find(s => s.name === phase.serverName)\n const isEnabled = server\n ? 'enabled' in server.config\n ? server.config.enabled\n : true\n : true\n\n const actionItems: ListItem[] = [\n {\n id: ID_TOGGLE,\n label: isEnabled\n ? t('commands.mcp.disable')\n : t('commands.mcp.enable'),\n },\n { id: ID_DELETE, label: t('commands.mcp.deleteServer') },\n { id: ID_BACK, label: `\u2190 ${t('commands.mcp.back')}` },\n ]\n\n return {\n tabs: [\n { id: 'actions', label: t('commands.mcp.actions') },\n ] as TabDefinition[],\n items: actionItems,\n title: phase.serverName,\n footerHint: '\u2191\u2193 Navigate \u00B7 Enter Select \u00B7 Esc Back',\n searchEnabled: false,\n searchPlaceholder: undefined,\n }\n }\n\n case 'confirm-delete': {\n const confirmItems: ListItem[] = [\n { id: ID_CONFIRM_YES, label: t('commands.mcp.confirmYes') },\n { id: ID_CONFIRM_NO, label: t('commands.mcp.confirmNo') },\n ]\n\n return {\n tabs: [\n { id: 'actions', label: t('commands.mcp.actions') },\n ] as TabDefinition[],\n items: confirmItems,\n title: t('commands.mcp.confirmDeleteTitle').replace(\n '{name}',\n phase.serverName,\n ),\n footerHint: '\u2191\u2193 Navigate \u00B7 Enter Select \u00B7 Esc Back',\n searchEnabled: false,\n searchPlaceholder: undefined,\n }\n }\n\n case 'add-name': {\n return {\n tabs: [\n { id: 'add', label: t('commands.mcp.addServer') },\n ] as TabDefinition[],\n items: [] as ListItem[],\n title: t('commands.mcp.addServer'),\n footerHint: t('commands.mcp.addFooterHint'),\n searchEnabled: true,\n searchPlaceholder: t('commands.mcp.addNamePlaceholder'),\n }\n }\n\n case 'add-command': {\n const exampleItems: ListItem[] = [\n {\n id: 'example-stdio',\n label: 'npx -y @modelcontextprotocol/server-xxx',\n description: 'stdio command',\n },\n {\n id: 'example-sse',\n label: 'https://example.com/mcp/sse',\n description: 'SSE endpoint',\n },\n ]\n\n return {\n tabs: [\n { id: 'add', label: t('commands.mcp.addServer') },\n ] as TabDefinition[],\n items: exampleItems,\n title: `${t('commands.mcp.addServer')}: ${phase.name}`,\n footerHint: t('commands.mcp.addCommandFooterHint'),\n searchEnabled: true,\n searchPlaceholder: t('commands.mcp.addCommandPlaceholder'),\n }\n }\n }\n }, [phase, activeTab, servers])\n\n // \u2500\u2500\u2500 Handle tab change \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const handleTabChange = useCallback((tabId: string) => {\n setActiveTab(tabId)\n setSearchQuery('')\n }, [])\n\n // \u2500\u2500\u2500 Handle status overlay dismiss \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const handleStatusDismiss = useCallback(() => {\n setStatusOverlay(null)\n setPhase({ type: 'main' })\n }, [])\n\n // \u2500\u2500\u2500 Handle ESC / back navigation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const handleBack = useCallback(() => {\n if (statusOverlay && statusOverlay.type !== 'loading') {\n handleStatusDismiss()\n return\n }\n switch (phase.type) {\n case 'main':\n onDone()\n break\n case 'server-actions':\n setPhase({ type: 'main' })\n setSearchQuery('')\n break\n case 'confirm-delete':\n setPhase({\n type: 'server-actions',\n serverName: phase.serverName,\n scope: phase.scope,\n })\n break\n case 'add-name':\n case 'add-command':\n setPhase({ type: 'main' })\n setSearchQuery('')\n break\n }\n }, [phase, statusOverlay, onDone, handleStatusDismiss])\n\n const handleClose = useCallback(() => {\n if (statusOverlay && statusOverlay.type !== 'loading') {\n handleStatusDismiss()\n return\n }\n if (phase.type === 'main') {\n onDone()\n } else {\n setPhase({ type: 'main' })\n setSearchQuery('')\n }\n }, [phase, statusOverlay, onDone, handleStatusDismiss])\n\n // \u2500\u2500\u2500 Handle search submit (for add-name / add-command) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const handleSearchSubmit = useCallback(\n async (query: string) => {\n if (!query.trim()) return\n\n if (phase.type === 'add-name') {\n setPhase({ type: 'add-command', name: query.trim() })\n setSearchQuery('')\n return\n }\n\n if (phase.type === 'add-command') {\n await addNewServer(phase.name, query.trim())\n setSearchQuery('')\n }\n },\n [phase, addNewServer],\n )\n\n // \u2500\u2500\u2500 Handle item selection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const handleSelect = useCallback(\n async (item: ListItem) => {\n switch (phase.type) {\n case 'main': {\n if (item.id === ID_ADD_SERVER) {\n setPhase({ type: 'add-name' })\n setSearchQuery('')\n return\n }\n if (item.id === ID_REFRESH_ALL) {\n await refreshAll()\n return\n }\n // Server selected \u2014 go to actions\n const data = item.data as { type: string; server?: ServerStatus }\n if (data.type === 'server' && data.server) {\n setPhase({\n type: 'server-actions',\n serverName: data.server.name,\n scope: data.server.config.scope,\n })\n }\n break\n }\n\n case 'server-actions': {\n if (item.id === ID_BACK) {\n setPhase({ type: 'main' })\n return\n }\n if (item.id === ID_TOGGLE) {\n await toggleServer(phase.serverName)\n return\n }\n if (item.id === ID_DELETE) {\n setPhase({\n type: 'confirm-delete',\n serverName: phase.serverName,\n scope: phase.scope,\n })\n }\n break\n }\n\n case 'confirm-delete': {\n if (item.id === ID_CONFIRM_YES) {\n await deleteServer(phase.serverName, phase.scope)\n } else {\n // No \u2014 back to actions\n setPhase({\n type: 'server-actions',\n serverName: phase.serverName,\n scope: phase.scope,\n })\n }\n break\n }\n\n case 'add-command': {\n // Clicking an example copies label to search\n setSearchQuery(item.label)\n break\n }\n }\n },\n [phase, refreshAll, toggleServer, deleteServer],\n )\n\n // \u2500\u2500\u2500 Determine current tab for rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const currentTab =\n phase.type === 'main'\n ? activeTab\n : phase.type === 'server-actions' || phase.type === 'confirm-delete'\n ? 'actions'\n : 'add'\n\n // \u2500\u2500\u2500 Determine if search submit is needed \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const needsSearchSubmit =\n phase.type === 'add-name' || phase.type === 'add-command'\n\n return (\n <TabbedListView\n title={title}\n tabs={tabs}\n activeTab={currentTab}\n onTabChange={handleTabChange}\n items={items}\n searchEnabled={searchEnabled}\n searchPlaceholder={searchPlaceholder}\n searchQuery={searchQuery}\n onSearchChange={setSearchQuery}\n onSearchSubmit={needsSearchSubmit ? handleSearchSubmit : undefined}\n onSelect={handleSelect}\n onClose={handleClose}\n onBack={handleBack}\n statusOverlay={statusOverlay}\n footerHint={footerHint}\n groupByCategory={false}\n isLoading={loading}\n emptyText={t('commands.mcp.noServers')}\n statusDismissHint=\"Enter Continue \u00B7 Esc Back\"\n />\n )\n}\n\n// =============================================================================\n// Command Definition\n// =============================================================================\n\nconst mcpInteractive = {\n type: 'local-jsx',\n name: 'mcp',\n description: t('commands.mcp.description'),\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n async call(onDone: (result?: string) => void) {\n return <MCPInteractive onDone={onDone} />\n },\n userFacingName() {\n return 'mcp'\n },\n} satisfies Command\n\nexport default mcpInteractive\n"],
|
|
5
|
+
"mappings": "AAaA,OAAO,SAAS,UAAU,WAAW,aAAa,eAAe;AAEjE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,sBAAsB;AAM/B,SAAS,SAAS;AAoBlB,MAAM,gBAAgB;AACtB,MAAM,iBAAiB;AACvB,MAAM,YAAY;AAClB,MAAM,YAAY;AAClB,MAAM,UAAU;AAChB,MAAM,iBAAiB;AACvB,MAAM,gBAAgB;AAMtB,MAAM,iBAED,CAAC,EAAE,OAAO,MAAM;AACnB,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAmB,EAAE,MAAM,OAAO,CAAC;AAC7D,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,EAAE;AACjD,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAA+B,IAAI;AAC7E,QAAM,CAAC,SAAS,UAAU,IAAI,SAAyB,CAAC,CAAC;AACzD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAG3C,QAAM,cAAc,YAAY,YAAY;AAC1C,QAAI;AACF,YAAM,gBAAgB,eAAe;AACrC,YAAM,UAAU,MAAM,WAAW;AAEjC,YAAM,iBAAiC,OAAO,QAAQ,aAAa,EAAE;AAAA,QACnE,CAAC,CAAC,MAAM,CAAC,MAAM;AACb,gBAAM,SAAS,QAAQ,KAAK,OAAK,EAAE,SAAS,IAAI;AAChD,gBAAM,SAAS,aAAa,IAAI;AAChC,iBAAO;AAAA,YACL;AAAA,YACA,QAAQ,QAAQ,SAAS,cAAc,cAAc;AAAA,YACrD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,iBAAW,cAAc;AAAA,IAC3B,QAAQ;AACN,iBAAW,CAAC,CAAC;AAAA,IACf;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,YAAU,MAAM;AACd,eAAW,IAAI;AACf,gBAAY,EAAE,QAAQ,MAAM,WAAW,KAAK,CAAC;AAAA,EAC/C,GAAG,CAAC,WAAW,CAAC;AAGhB,YAAU,MAAM;AACd,QAAI,MAAM,SAAS,QAAQ;AACzB,kBAAY;AACZ,qBAAe,EAAE;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,OAAO,WAAW,CAAC;AAIvB,QAAM,eAAe;AAAA,IACnB,OAAO,eAAuB;AAC5B,uBAAiB;AAAA,QACf,MAAM;AAAA,QACN,SAAS,EAAE,uBAAuB;AAAA,MACpC,CAAC;AACD,UAAI;AACF,cAAM,gBAAgB,wBAAwB;AAC9C,cAAM,gBAAgB,cAAc,aAAa,UAAU;AAE3D,YAAI,eAAe;AACjB,gBAAM,aAAa,EAAE,cAAc,WAAW;AAC9C,gBAAM,yBAAyB;AAAA,YAC7B,GAAG;AAAA,YACH,YAAY;AAAA,cACV,GAAG,cAAc;AAAA,cACjB,CAAC,UAAU,GAAG,EAAE,GAAG,eAAe,SAAS,WAAW;AAAA,YACxD;AAAA,UACF,CAAC;AAAA,QACH,OAAO;AACL,gBAAM,eAAe,aAAa,UAAU;AAC5C,cAAI,cAAc;AAChB,kBAAM,yBAAyB;AAAA,cAC7B,GAAG;AAAA,cACH,YAAY;AAAA,gBACV,GAAG,cAAc;AAAA,gBACjB,CAAC,UAAU,GAAG,EAAE,GAAG,cAAc,SAAS,MAAM;AAAA,cAClD;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAEA,8BAAsB;AACtB,cAAM,YAAY;AAClB,yBAAiB;AAAA,UACf,MAAM;AAAA,UACN,SAAS,EAAE,4BAA4B;AAAA,QACzC,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,cAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,yBAAiB,EAAE,MAAM,SAAS,SAAS,IAAI,CAAC;AAAA,MAClD;AAAA,IACF;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,eAAe;AAAA,IACnB,OAAO,YAAoB,UAAkB;AAC3C,uBAAiB;AAAA,QACf,MAAM;AAAA,QACN,SAAS,EAAE,uBAAuB;AAAA,MACpC,CAAC;AACD,UAAI;AACF,wBAAgB,YAAY,KAA6B;AACzD,8BAAsB;AACtB,cAAM,YAAY;AAClB,yBAAiB;AAAA,UACf,MAAM;AAAA,UACN,SAAS,EAAE,4BAA4B;AAAA,QACzC,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,cAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,yBAAiB,EAAE,MAAM,SAAS,SAAS,IAAI,CAAC;AAAA,MAClD;AAAA,IACF;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,eAAe;AAAA,IACnB,OAAO,MAAc,iBAAyB;AAC5C,uBAAiB;AAAA,QACf,MAAM;AAAA,QACN,SAAS,EAAE,qBAAqB;AAAA,MAClC,CAAC;AACD,UAAI;AACF,YACE,aAAa,WAAW,SAAS,KACjC,aAAa,WAAW,UAAU,GAClC;AACA,uBAAa,MAAM,EAAE,MAAM,OAAO,KAAK,aAAa,GAAG,SAAS;AAAA,QAClE,OAAO;AACL,gBAAM,QAAQ,aAAa,MAAM,KAAK;AACtC,gBAAM,UAAU,MAAM,CAAC;AACvB,gBAAM,OAAO,MAAM,MAAM,CAAC;AAC1B;AAAA,YACE;AAAA,YACA,EAAE,MAAM,SAAS,SAAS,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,EAAE;AAAA,YAC5D;AAAA,UACF;AAAA,QACF;AACA,8BAAsB;AACtB,cAAM,YAAY;AAClB,yBAAiB;AAAA,UACf,MAAM;AAAA,UACN,SAAS,EAAE,yBAAyB;AAAA,QACtC,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,cAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,yBAAiB;AAAA,UACf,MAAM;AAAA,UACN,SAAS,GAAG,EAAE,wBAAwB,CAAC,KAAK,GAAG;AAAA,QACjD,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,aAAa,YAAY,YAAY;AACzC,qBAAiB;AAAA,MACf,MAAM;AAAA,MACN,SAAS,EAAE,yBAAyB;AAAA,IACtC,CAAC;AACD,QAAI;AACF,4BAAsB;AACtB,YAAM,YAAY;AAClB,uBAAiB;AAAA,QACf,MAAM;AAAA,QACN,SAAS,EAAE,6BAA6B;AAAA,MAC1C,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,uBAAiB,EAAE,MAAM,SAAS,SAAS,IAAI,CAAC;AAAA,IAClD;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAIhB,QAAM,EAAE,MAAM,OAAO,OAAO,YAAY,eAAe,kBAAkB,IACvE,QAAQ,MAAM;AACZ,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK,QAAQ;AACX,cAAM,eAAe,QAAQ;AAAA,UAC3B,OAAK,EAAE,OAAO,UAAU;AAAA,QAC1B,EAAE;AACF,cAAM,cAAc,QAAQ;AAAA,UAC1B,OAAK,EAAE,OAAO,UAAU;AAAA,QAC1B,EAAE;AAEF,cAAM,WAA4B;AAAA,UAChC;AAAA,YACE,IAAI;AAAA,YACJ,OAAO,EAAE,qBAAqB;AAAA,YAC9B,OAAO,QAAQ;AAAA,UACjB;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,OAAO,EAAE,yBAAyB;AAAA,YAClC,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,OAAO,EAAE,wBAAwB;AAAA,YACjC,OAAO;AAAA,UACT;AAAA,QACF;AAGA,cAAM,WACJ,cAAc,QACV,UACA,QAAQ,OAAO,OAAK,EAAE,OAAO,UAAU,SAAS;AAEtD,cAAM,YAAwB,SAAS,IAAI,YAAU;AACnD,gBAAM,YACJ,aAAa,OAAO,SAAS,OAAO,OAAO,UAAU;AACvD,iBAAO;AAAA,YACL,IAAI,OAAO;AAAA,YACX,OAAO,OAAO;AAAA,YACd,aAAa,GAAG,OAAO,OAAO,KAAK,SAAM,OAAO,OAAO,IAAI;AAAA,YAC3D,QAAQ,CAAC,YACL,aACA,OAAO,WAAW,cAChB,YACA;AAAA,YACN,MAAM,EAAE,MAAM,UAAU,OAAO;AAAA,UACjC;AAAA,QACF,CAAC;AAGD,kBAAU,KAAK;AAAA,UACb,IAAI;AAAA,UACJ,OAAO,KAAK,EAAE,wBAAwB,CAAC;AAAA,UACvC,MAAM,EAAE,MAAM,SAAS;AAAA,QACzB,CAAC;AACD,kBAAU,KAAK;AAAA,UACb,IAAI;AAAA,UACJ,OAAO,UAAK,EAAE,yBAAyB,CAAC;AAAA,UACxC,MAAM,EAAE,MAAM,SAAS;AAAA,QACzB,CAAC;AAED,eAAO;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO,EAAE,oBAAoB;AAAA,UAC7B,YACE;AAAA,UACF,eAAe;AAAA,UACf,mBAAmB;AAAA,QACrB;AAAA,MACF;AAAA,MAEA,KAAK,kBAAkB;AACrB,cAAM,SAAS,QAAQ,KAAK,OAAK,EAAE,SAAS,MAAM,UAAU;AAC5D,cAAM,YAAY,SACd,aAAa,OAAO,SAClB,OAAO,OAAO,UACd,OACF;AAEJ,cAAM,cAA0B;AAAA,UAC9B;AAAA,YACE,IAAI;AAAA,YACJ,OAAO,YACH,EAAE,sBAAsB,IACxB,EAAE,qBAAqB;AAAA,UAC7B;AAAA,UACA,EAAE,IAAI,WAAW,OAAO,EAAE,2BAA2B,EAAE;AAAA,UACvD,EAAE,IAAI,SAAS,OAAO,UAAK,EAAE,mBAAmB,CAAC,GAAG;AAAA,QACtD;AAEA,eAAO;AAAA,UACL,MAAM;AAAA,YACJ,EAAE,IAAI,WAAW,OAAO,EAAE,sBAAsB,EAAE;AAAA,UACpD;AAAA,UACA,OAAO;AAAA,UACP,OAAO,MAAM;AAAA,UACb,YAAY;AAAA,UACZ,eAAe;AAAA,UACf,mBAAmB;AAAA,QACrB;AAAA,MACF;AAAA,MAEA,KAAK,kBAAkB;AACrB,cAAM,eAA2B;AAAA,UAC/B,EAAE,IAAI,gBAAgB,OAAO,EAAE,yBAAyB,EAAE;AAAA,UAC1D,EAAE,IAAI,eAAe,OAAO,EAAE,wBAAwB,EAAE;AAAA,QAC1D;AAEA,eAAO;AAAA,UACL,MAAM;AAAA,YACJ,EAAE,IAAI,WAAW,OAAO,EAAE,sBAAsB,EAAE;AAAA,UACpD;AAAA,UACA,OAAO;AAAA,UACP,OAAO,EAAE,iCAAiC,EAAE;AAAA,YAC1C;AAAA,YACA,MAAM;AAAA,UACR;AAAA,UACA,YAAY;AAAA,UACZ,eAAe;AAAA,UACf,mBAAmB;AAAA,QACrB;AAAA,MACF;AAAA,MAEA,KAAK,YAAY;AACf,eAAO;AAAA,UACL,MAAM;AAAA,YACJ,EAAE,IAAI,OAAO,OAAO,EAAE,wBAAwB,EAAE;AAAA,UAClD;AAAA,UACA,OAAO,CAAC;AAAA,UACR,OAAO,EAAE,wBAAwB;AAAA,UACjC,YAAY,EAAE,4BAA4B;AAAA,UAC1C,eAAe;AAAA,UACf,mBAAmB,EAAE,iCAAiC;AAAA,QACxD;AAAA,MACF;AAAA,MAEA,KAAK,eAAe;AAClB,cAAM,eAA2B;AAAA,UAC/B;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,QACF;AAEA,eAAO;AAAA,UACL,MAAM;AAAA,YACJ,EAAE,IAAI,OAAO,OAAO,EAAE,wBAAwB,EAAE;AAAA,UAClD;AAAA,UACA,OAAO;AAAA,UACP,OAAO,GAAG,EAAE,wBAAwB,CAAC,KAAK,MAAM,IAAI;AAAA,UACpD,YAAY,EAAE,mCAAmC;AAAA,UACjD,eAAe;AAAA,UACf,mBAAmB,EAAE,oCAAoC;AAAA,QAC3D;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAO,WAAW,OAAO,CAAC;AAIhC,QAAM,kBAAkB,YAAY,CAAC,UAAkB;AACrD,iBAAa,KAAK;AAClB,mBAAe,EAAE;AAAA,EACnB,GAAG,CAAC,CAAC;AAIL,QAAM,sBAAsB,YAAY,MAAM;AAC5C,qBAAiB,IAAI;AACrB,aAAS,EAAE,MAAM,OAAO,CAAC;AAAA,EAC3B,GAAG,CAAC,CAAC;AAIL,QAAM,aAAa,YAAY,MAAM;AACnC,QAAI,iBAAiB,cAAc,SAAS,WAAW;AACrD,0BAAoB;AACpB;AAAA,IACF;AACA,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AACH,iBAAS,EAAE,MAAM,OAAO,CAAC;AACzB,uBAAe,EAAE;AACjB;AAAA,MACF,KAAK;AACH,iBAAS;AAAA,UACP,MAAM;AAAA,UACN,YAAY,MAAM;AAAA,UAClB,OAAO,MAAM;AAAA,QACf,CAAC;AACD;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,iBAAS,EAAE,MAAM,OAAO,CAAC;AACzB,uBAAe,EAAE;AACjB;AAAA,IACJ;AAAA,EACF,GAAG,CAAC,OAAO,eAAe,QAAQ,mBAAmB,CAAC;AAEtD,QAAM,cAAc,YAAY,MAAM;AACpC,QAAI,iBAAiB,cAAc,SAAS,WAAW;AACrD,0BAAoB;AACpB;AAAA,IACF;AACA,QAAI,MAAM,SAAS,QAAQ;AACzB,aAAO;AAAA,IACT,OAAO;AACL,eAAS,EAAE,MAAM,OAAO,CAAC;AACzB,qBAAe,EAAE;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,OAAO,eAAe,QAAQ,mBAAmB,CAAC;AAItD,QAAM,qBAAqB;AAAA,IACzB,OAAO,UAAkB;AACvB,UAAI,CAAC,MAAM,KAAK,EAAG;AAEnB,UAAI,MAAM,SAAS,YAAY;AAC7B,iBAAS,EAAE,MAAM,eAAe,MAAM,MAAM,KAAK,EAAE,CAAC;AACpD,uBAAe,EAAE;AACjB;AAAA,MACF;AAEA,UAAI,MAAM,SAAS,eAAe;AAChC,cAAM,aAAa,MAAM,MAAM,MAAM,KAAK,CAAC;AAC3C,uBAAe,EAAE;AAAA,MACnB;AAAA,IACF;AAAA,IACA,CAAC,OAAO,YAAY;AAAA,EACtB;AAIA,QAAM,eAAe;AAAA,IACnB,OAAO,SAAmB;AACxB,cAAQ,MAAM,MAAM;AAAA,QAClB,KAAK,QAAQ;AACX,cAAI,KAAK,OAAO,eAAe;AAC7B,qBAAS,EAAE,MAAM,WAAW,CAAC;AAC7B,2BAAe,EAAE;AACjB;AAAA,UACF;AACA,cAAI,KAAK,OAAO,gBAAgB;AAC9B,kBAAM,WAAW;AACjB;AAAA,UACF;AAEA,gBAAM,OAAO,KAAK;AAClB,cAAI,KAAK,SAAS,YAAY,KAAK,QAAQ;AACzC,qBAAS;AAAA,cACP,MAAM;AAAA,cACN,YAAY,KAAK,OAAO;AAAA,cACxB,OAAO,KAAK,OAAO,OAAO;AAAA,YAC5B,CAAC;AAAA,UACH;AACA;AAAA,QACF;AAAA,QAEA,KAAK,kBAAkB;AACrB,cAAI,KAAK,OAAO,SAAS;AACvB,qBAAS,EAAE,MAAM,OAAO,CAAC;AACzB;AAAA,UACF;AACA,cAAI,KAAK,OAAO,WAAW;AACzB,kBAAM,aAAa,MAAM,UAAU;AACnC;AAAA,UACF;AACA,cAAI,KAAK,OAAO,WAAW;AACzB,qBAAS;AAAA,cACP,MAAM;AAAA,cACN,YAAY,MAAM;AAAA,cAClB,OAAO,MAAM;AAAA,YACf,CAAC;AAAA,UACH;AACA;AAAA,QACF;AAAA,QAEA,KAAK,kBAAkB;AACrB,cAAI,KAAK,OAAO,gBAAgB;AAC9B,kBAAM,aAAa,MAAM,YAAY,MAAM,KAAK;AAAA,UAClD,OAAO;AAEL,qBAAS;AAAA,cACP,MAAM;AAAA,cACN,YAAY,MAAM;AAAA,cAClB,OAAO,MAAM;AAAA,YACf,CAAC;AAAA,UACH;AACA;AAAA,QACF;AAAA,QAEA,KAAK,eAAe;AAElB,yBAAe,KAAK,KAAK;AACzB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,OAAO,YAAY,cAAc,YAAY;AAAA,EAChD;AAIA,QAAM,aACJ,MAAM,SAAS,SACX,YACA,MAAM,SAAS,oBAAoB,MAAM,SAAS,mBAChD,YACA;AAIR,QAAM,oBACJ,MAAM,SAAS,cAAc,MAAM,SAAS;AAE9C,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,MAChB,gBAAgB,oBAAoB,qBAAqB;AAAA,MACzD,UAAU;AAAA,MACV,SAAS;AAAA,MACT,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,WAAW,EAAE,wBAAwB;AAAA,MACrC,mBAAkB;AAAA;AAAA,EACpB;AAEJ;AAMA,MAAM,iBAAiB;AAAA,EACrB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aAAa,EAAE,0BAA0B;AAAA,EACzC,WAAW;AAAA,EACX,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,MAAM,KAAK,QAAmC;AAC5C,WAAO,oCAAC,kBAAe,QAAgB;AAAA,EACzC;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AACF;AAEA,IAAO,0BAAQ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|