@within-7/minto 0.3.10 → 0.4.1
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/Tool.js.map +2 -2
- package/dist/commands/agents/AgentsCommand.js +2 -2
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/ctx_viz.js +1 -1
- package/dist/commands/effort.js +87 -0
- package/dist/commands/effort.js.map +7 -0
- package/dist/commands/export.js +19 -9
- package/dist/commands/export.js.map +2 -2
- package/dist/commands/ide.js +18 -0
- package/dist/commands/ide.js.map +7 -0
- package/dist/commands/mcp-interactive.js +14 -8
- package/dist/commands/mcp-interactive.js.map +2 -2
- package/dist/commands/memory.js +168 -0
- package/dist/commands/memory.js.map +7 -0
- package/dist/commands/model.js +45 -2
- package/dist/commands/model.js.map +2 -2
- package/dist/commands/outputStyle.js +64 -0
- package/dist/commands/outputStyle.js.map +7 -0
- package/dist/commands/plugin/utils.js +33 -1
- package/dist/commands/plugin/utils.js.map +2 -2
- package/dist/commands/plugin.js +10 -1
- package/dist/commands/plugin.js.map +2 -2
- package/dist/commands/refreshCommands.js +2 -0
- package/dist/commands/refreshCommands.js.map +2 -2
- package/dist/commands/review.js +51 -0
- package/dist/commands/review.js.map +7 -0
- package/dist/commands/terminalSetup.js +6 -0
- package/dist/commands/terminalSetup.js.map +2 -2
- package/dist/commands/undo.js +8 -0
- package/dist/commands/undo.js.map +2 -2
- package/dist/commands/vim.js +22 -0
- package/dist/commands/vim.js.map +7 -0
- package/dist/commands.js +12 -0
- package/dist/commands.js.map +2 -2
- package/dist/components/HighlightedCode.js +1 -0
- package/dist/components/HighlightedCode.js.map +2 -2
- package/dist/components/ModelSelector/ModelSelector.js +250 -143
- package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
- package/dist/components/PromptInput.js +21 -6
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/PulseLabel.js +44 -0
- package/dist/components/PulseLabel.js.map +7 -0
- package/dist/components/RequestStatusIndicator.js +1 -1
- package/dist/components/RequestStatusIndicator.js.map +1 -1
- package/dist/components/Spinner.js +12 -42
- package/dist/components/Spinner.js.map +3 -3
- package/dist/components/StartupStatus.js +57 -0
- package/dist/components/StartupStatus.js.map +7 -0
- package/dist/components/SubagentBlock.js +43 -6
- package/dist/components/SubagentBlock.js.map +2 -2
- package/dist/components/TabbedListView/TabBar.js +13 -8
- package/dist/components/TabbedListView/TabBar.js.map +2 -2
- package/dist/components/TabbedListView/TabbedListView.js +1 -1
- package/dist/components/TabbedListView/TabbedListView.js.map +2 -2
- package/dist/components/TodoPanel.js +1 -1
- package/dist/components/TodoPanel.js.map +1 -1
- package/dist/components/ToolUseLoader.js +5 -0
- package/dist/components/ToolUseLoader.js.map +2 -2
- package/dist/components/TrustDialog.js +0 -2
- package/dist/components/TrustDialog.js.map +2 -2
- package/dist/components/messages/TaskInModuleView.js +1 -1
- package/dist/components/messages/TaskInModuleView.js.map +2 -2
- package/dist/components/messages/TaskToolMessage.js +1 -1
- package/dist/components/messages/TaskToolMessage.js.map +2 -2
- package/dist/components/messages/UserPromptMessage.js +6 -1
- package/dist/components/messages/UserPromptMessage.js.map +2 -2
- package/dist/constants/modelCapabilities.js +103 -18
- package/dist/constants/modelCapabilities.js.map +2 -2
- package/dist/constants/product.js +2 -0
- package/dist/constants/product.js.map +2 -2
- package/dist/constants/prompts/agentPrompt.js +30 -0
- package/dist/constants/prompts/agentPrompt.js.map +7 -0
- package/dist/constants/prompts/codeConventions.js +27 -0
- package/dist/constants/prompts/codeConventions.js.map +7 -0
- package/dist/constants/prompts/doingTasks.js +15 -0
- package/dist/constants/prompts/doingTasks.js.map +7 -0
- package/dist/constants/prompts/envInfo.js +17 -0
- package/dist/constants/prompts/envInfo.js.map +7 -0
- package/dist/constants/prompts/executingWithCare.js +17 -0
- package/dist/constants/prompts/executingWithCare.js.map +7 -0
- package/dist/constants/prompts/identity.js +10 -0
- package/dist/constants/prompts/identity.js.map +7 -0
- package/dist/constants/prompts/index.js +78 -0
- package/dist/constants/prompts/index.js.map +7 -0
- package/dist/constants/prompts/taskManagement.js +60 -0
- package/dist/constants/prompts/taskManagement.js.map +7 -0
- package/dist/constants/prompts/toneAndStyle.js +62 -0
- package/dist/constants/prompts/toneAndStyle.js.map +7 -0
- package/dist/constants/prompts/toolUsagePolicy.js +38 -0
- package/dist/constants/prompts/toolUsagePolicy.js.map +7 -0
- package/dist/constants/prompts.js +5 -176
- package/dist/constants/prompts.js.map +2 -2
- package/dist/constants/providerRegistry.js +235 -0
- package/dist/constants/providerRegistry.js.map +7 -0
- package/dist/constants/providers.js +35 -0
- package/dist/constants/providers.js.map +7 -0
- package/dist/context/PermissionContext.js +0 -1
- package/dist/context/PermissionContext.js.map +2 -2
- package/dist/context.js +87 -31
- package/dist/context.js.map +2 -2
- package/dist/core/backupHook.js +2 -2
- package/dist/core/backupHook.js.map +2 -2
- package/dist/core/config/defaults.js +4 -1
- package/dist/core/config/defaults.js.map +2 -2
- package/dist/core/config/schema.js +7 -1
- package/dist/core/config/schema.js.map +2 -2
- package/dist/core/costTracker.js +18 -0
- package/dist/core/costTracker.js.map +2 -2
- package/dist/core/index.js +0 -1
- package/dist/core/index.js.map +2 -2
- package/dist/core/tokenStatsManager.js +22 -4
- package/dist/core/tokenStatsManager.js.map +2 -2
- package/dist/entrypoints/cli.js +65 -84
- package/dist/entrypoints/cli.js.map +2 -2
- package/dist/hooks/useAgentTokenStats.js +1 -1
- package/dist/hooks/useAgentTokenStats.js.map +2 -2
- package/dist/hooks/useAgentTranscripts.js +2 -1
- package/dist/hooks/useAgentTranscripts.js.map +2 -2
- package/dist/hooks/useBackgroundShells.js +29 -0
- package/dist/hooks/useBackgroundShells.js.map +7 -0
- package/dist/hooks/useCanUseTool.js +1 -1
- package/dist/hooks/useCanUseTool.js.map +2 -2
- package/dist/hooks/useDeferredLoading.js +64 -0
- package/dist/hooks/useDeferredLoading.js.map +7 -0
- package/dist/hooks/useHookStatus.js +1 -1
- package/dist/hooks/useHookStatus.js.map +2 -2
- package/dist/hooks/useSessionTracking.js +55 -0
- package/dist/hooks/useSessionTracking.js.map +7 -0
- package/dist/hooks/useTerminalSize.js +21 -0
- package/dist/hooks/useTerminalSize.js.map +2 -2
- package/dist/hooks/useTextInput.js +1 -0
- package/dist/hooks/useTextInput.js.map +2 -2
- package/dist/hooks/useUnifiedCompletion.js +3 -2
- package/dist/hooks/useUnifiedCompletion.js.map +2 -2
- package/dist/i18n/locales/en.js +8 -9
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.js +8 -9
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/i18n/types.js.map +1 -1
- package/dist/messages.js +41 -17
- package/dist/messages.js.map +2 -2
- package/dist/permissions.js +94 -1
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +27 -19
- package/dist/query.js.map +2 -2
- package/dist/screens/REPL.js +83 -74
- package/dist/screens/REPL.js.map +2 -2
- package/dist/services/adapters/responsesAPI.js +6 -0
- package/dist/services/adapters/responsesAPI.js.map +2 -2
- package/dist/services/agentTeams/index.js +35 -0
- package/dist/services/agentTeams/index.js.map +7 -0
- package/dist/services/agentTeams/mailbox.js +114 -0
- package/dist/services/agentTeams/mailbox.js.map +7 -0
- package/dist/services/agentTeams/teamManager.js +149 -0
- package/dist/services/agentTeams/teamManager.js.map +7 -0
- package/dist/services/agentTeams/teamTaskStore.js +114 -0
- package/dist/services/agentTeams/teamTaskStore.js.map +7 -0
- package/dist/services/agentTeams/teammateSpawner.js +80 -0
- package/dist/services/agentTeams/teammateSpawner.js.map +7 -0
- package/dist/services/checkpointManager.js +16 -3
- package/dist/services/checkpointManager.js.map +2 -2
- package/dist/services/claude.js +19 -1728
- package/dist/services/claude.js.map +3 -3
- package/dist/services/gpt5ConnectionTest.js +4 -2
- package/dist/services/gpt5ConnectionTest.js.map +2 -2
- package/dist/services/hookExecutor.js +411 -127
- package/dist/services/hookExecutor.js.map +2 -2
- package/dist/services/llm/anthropicProvider.js +807 -0
- package/dist/services/llm/anthropicProvider.js.map +7 -0
- package/dist/services/llm/dispatch.js +218 -0
- package/dist/services/llm/dispatch.js.map +7 -0
- package/dist/services/llm/index.js +44 -0
- package/dist/services/llm/index.js.map +7 -0
- package/dist/services/llm/mintoContext.js +69 -0
- package/dist/services/llm/mintoContext.js.map +7 -0
- package/dist/services/llm/openaiProvider.js +622 -0
- package/dist/services/llm/openaiProvider.js.map +7 -0
- package/dist/services/llm/types.js +157 -0
- package/dist/services/llm/types.js.map +7 -0
- package/dist/services/mcpClient.js +183 -33
- package/dist/services/mcpClient.js.map +2 -2
- package/dist/services/notifier.js +14 -0
- package/dist/services/notifier.js.map +2 -2
- package/dist/services/oauth.js +4 -2
- package/dist/services/oauth.js.map +2 -2
- package/dist/services/openai.js +66 -56
- package/dist/services/openai.js.map +3 -3
- package/dist/services/outputStyles.js +102 -21
- package/dist/services/outputStyles.js.map +2 -2
- package/dist/services/plugins/skillMarketplace.js +4 -1
- package/dist/services/plugins/skillMarketplace.js.map +2 -2
- package/dist/services/sentry.js +1 -1
- package/dist/services/sentry.js.map +2 -2
- package/dist/services/sessionMemory.js +16 -3
- package/dist/services/sessionMemory.js.map +2 -2
- package/dist/services/systemReminder.js +350 -3
- package/dist/services/systemReminder.js.map +2 -2
- package/dist/services/taskStore.js +19 -0
- package/dist/services/taskStore.js.map +2 -2
- package/dist/tools/ArchitectTool/ArchitectTool.js.map +1 -1
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +1 -1
- package/dist/tools/BashOutputTool/BashOutputTool.js.map +1 -1
- package/dist/tools/BashTool/BashTool.js +28 -0
- package/dist/tools/BashTool/BashTool.js.map +2 -2
- package/dist/tools/FileEditTool/FileEditTool.js +1 -1
- package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
- package/dist/tools/FileReadTool/FileReadTool.js +14 -0
- package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
- package/dist/tools/FileWriteTool/FileWriteTool.js +3 -1
- package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
- package/dist/tools/GlobTool/GlobTool.js.map +1 -1
- package/dist/tools/GrepTool/GrepTool.js.map +1 -1
- package/dist/tools/KillShellTool/KillShellTool.js.map +1 -1
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +2 -2
- package/dist/tools/LspTool/LspTool.js +11 -2
- package/dist/tools/LspTool/LspTool.js.map +2 -2
- package/dist/tools/MCPTool/MCPTool.js.map +1 -1
- package/dist/tools/MemoryReadTool/MemoryReadTool.js +2 -1
- package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +2 -1
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js.map +1 -1
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +1 -1
- package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +1 -1
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js +8 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js +2 -0
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
- package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +1 -1
- package/dist/tools/SlashCommandTool/SlashCommandTool.js +174 -18
- package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +3 -3
- package/dist/tools/TaskCreateTool/TaskCreateTool.js.map +1 -1
- package/dist/tools/TaskGetTool/TaskGetTool.js.map +1 -1
- package/dist/tools/TaskListTool/TaskListTool.js.map +1 -1
- package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +1 -1
- package/dist/tools/TaskStopTool/TaskStopTool.js.map +1 -1
- package/dist/tools/TaskTool/TaskTool.js +75 -5
- package/dist/tools/TaskTool/TaskTool.js.map +2 -2
- package/dist/tools/TaskTool/prompt.js +12 -6
- package/dist/tools/TaskTool/prompt.js.map +2 -2
- package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +1 -1
- package/dist/tools/ThinkTool/ThinkTool.js.map +1 -1
- package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +1 -1
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +1 -1
- package/dist/tools/WebSearchTool/WebSearchTool.js.map +1 -1
- package/dist/tools/WebSearchTool/searchProviders.js +2 -1
- package/dist/tools/WebSearchTool/searchProviders.js.map +2 -2
- package/dist/tools/lsTool/lsTool.js.map +2 -2
- package/dist/tools/lsTool/prompt.js.map +1 -1
- package/dist/tools.js +14 -3
- package/dist/tools.js.map +2 -2
- package/dist/types/PermissionMode.js +21 -1
- package/dist/types/PermissionMode.js.map +2 -2
- package/dist/types/agentTeams.js +1 -0
- package/dist/types/agentTeams.js.map +7 -0
- package/dist/types/hooks.js +8 -2
- package/dist/types/hooks.js.map +2 -2
- package/dist/types/plugin.js +1 -1
- package/dist/types/plugin.js.map +2 -2
- package/dist/utils/agentLoader.js +25 -3
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/animationManager.js +1 -1
- package/dist/utils/animationManager.js.map +2 -2
- package/dist/utils/ask.js +1 -1
- package/dist/utils/async.js +5 -1
- package/dist/utils/async.js.map +2 -2
- package/dist/utils/autoCompactCore.js +60 -0
- package/dist/utils/autoCompactCore.js.map +2 -2
- package/dist/utils/config.js +26 -128
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/configSchema.js +227 -0
- package/dist/utils/configSchema.js.map +7 -0
- package/dist/utils/debugLogger.js.map +2 -2
- package/dist/utils/env.js +4 -3
- package/dist/utils/env.js.map +2 -2
- package/dist/utils/envConfig.js +34 -0
- package/dist/utils/envConfig.js.map +3 -3
- package/dist/utils/gpt5.js +146 -0
- package/dist/utils/gpt5.js.map +7 -0
- package/dist/utils/hookManager.js +374 -140
- package/dist/utils/hookManager.js.map +2 -2
- package/dist/utils/markdown.js +47 -0
- package/dist/utils/markdown.js.map +2 -2
- package/dist/utils/memoizeWithTTL.js +25 -0
- package/dist/utils/memoizeWithTTL.js.map +7 -0
- package/dist/utils/model.js +34 -9
- package/dist/utils/model.js.map +2 -2
- package/dist/utils/pluginInstaller.js +34 -5
- package/dist/utils/pluginInstaller.js.map +2 -2
- package/dist/utils/pluginLoader.js +201 -32
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/safeFetch.js +45 -0
- package/dist/utils/safeFetch.js.map +7 -0
- package/dist/utils/skillLoader.js +59 -6
- package/dist/utils/skillLoader.js.map +2 -2
- package/dist/utils/streamingState.js +52 -0
- package/dist/utils/streamingState.js.map +7 -0
- package/dist/utils/style.js +6 -3
- package/dist/utils/style.js.map +2 -2
- package/dist/utils/teamConfig.js +9 -3
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/toolRiskClassification.js +0 -6
- package/dist/utils/toolRiskClassification.js.map +2 -2
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +7 -6
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/services/plugins/skillMarketplace.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Skill Marketplace Service\n *\n * Implements Claude Code CLI compatible marketplace functionality\n * for plugin/skill discovery and installation.\n *\n * Supports all Claude Code CLI source types:\n * - github: owner/repo format\n * - git: generic git URL\n * - url: HTTP/HTTPS URL to marketplace JSON\n * - npm: npm package name\n * - file: local file path\n * - directory: local directory path\n */\n\nimport { existsSync, readFileSync, mkdirSync, writeFileSync, rmSync } from 'fs'\nimport { join, resolve, isAbsolute } from 'path'\nimport { homedir } from 'os'\nimport { z } from 'zod'\nimport { execFileNoThrow } from '@utils/execFileNoThrow'\nimport { getCwd } from '@utils/state'\nimport type {\n SessionPlugin,\n PluginScope,\n InstalledSkillPlugin,\n} from '@minto-types/plugin'\n\n/**\n * Marketplace source types (Claude Code CLI compatible)\n */\nexport type MarketplaceSource =\n | { source: 'github'; repo: string; ref?: string; path?: string }\n | { source: 'git'; url: string; ref?: string; path?: string }\n | { source: 'url'; url: string; headers?: Record<string, string> }\n | { source: 'npm'; package: string; version?: string }\n | { source: 'file'; path: string }\n | { source: 'directory'; path: string }\n\n/**\n * Plugin entry schema in a marketplace manifest\n */\nconst PluginEntrySchema = z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n source: z.string().optional().default('./'),\n strict: z.boolean().optional(),\n skills: z.union([z.string(), z.array(z.string())]).optional(),\n commands: z.union([z.string(), z.array(z.string())]).optional(),\n agents: z.union([z.string(), z.array(z.string())]).optional(),\n hooks: z.union([z.string(), z.array(z.string())]).optional(),\n mcpServers: z.union([z.string(), z.array(z.string())]).optional(),\n})\n\n/**\n * Plugin entry type (inferred from schema)\n */\nexport type PluginEntry = z.infer<typeof PluginEntrySchema>\n\n/**\n * Marketplace manifest schema (Claude Code CLI compatible)\n */\nexport const MarketplaceManifestSchema = z.object({\n $schema: z.string().optional(),\n name: z.string().min(1),\n description: z.string().optional(),\n owner: z\n .object({\n name: z.string().optional(),\n email: z.string().email().optional(),\n })\n .optional(),\n metadata: z.record(z.unknown()).optional(),\n plugins: z.array(PluginEntrySchema),\n})\n\nexport type MarketplaceManifest = z.infer<typeof MarketplaceManifestSchema>\n\n/**\n * Registered marketplace in user config\n */\nexport interface RegisteredMarketplace {\n name: string\n source: MarketplaceSource\n manifest: MarketplaceManifest\n lastUpdated: Date\n enabled: boolean\n}\n\n/**\n * Marketplace error codes\n */\nexport enum MarketplaceErrorCode {\n MANIFEST_INVALID = 'MANIFEST_INVALID',\n MANIFEST_NOT_FOUND = 'MANIFEST_NOT_FOUND',\n NETWORK_ERROR = 'NETWORK_ERROR',\n GIT_ERROR = 'GIT_ERROR',\n NPM_ERROR = 'NPM_ERROR',\n ALREADY_REGISTERED = 'ALREADY_REGISTERED',\n NOT_REGISTERED = 'NOT_REGISTERED',\n PLUGIN_NOT_FOUND = 'PLUGIN_NOT_FOUND',\n INSTALLATION_FAILED = 'INSTALLATION_FAILED',\n}\n\n/**\n * Marketplace error class\n */\nexport class SkillMarketplaceError extends Error {\n constructor(\n message: string,\n public code: MarketplaceErrorCode,\n public marketplaceName?: string,\n public details?: unknown,\n ) {\n super(message)\n this.name = 'SkillMarketplaceError'\n }\n}\n\n/**\n * Get marketplace storage directory\n */\nfunction getMarketplaceDir(): string {\n const home = homedir()\n const dir = join(home, '.minto', 'marketplaces')\n\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n\n return dir\n}\n\n/**\n * Get installed plugins storage directory based on scope\n */\nfunction getInstalledPluginsDir(scope: PluginScope): string {\n const base =\n scope === 'user'\n ? join(homedir(), '.minto', 'plugins')\n : join(getCwd(), '.minto', 'plugins')\n\n if (!existsSync(base)) {\n mkdirSync(base, { recursive: true })\n }\n\n return base\n}\n\n/**\n * Get registry file path\n */\nfunction getRegistryPath(): string {\n return join(getMarketplaceDir(), 'registry.json')\n}\n\n/**\n * Get installed skills registry path\n */\nfunction getInstalledSkillsPath(): string {\n return join(getMarketplaceDir(), 'installed-skills.json')\n}\n\n/**\n * Load marketplace registry\n */\nfunction loadRegistry(): RegisteredMarketplace[] {\n const registryPath = getRegistryPath()\n\n if (!existsSync(registryPath)) {\n return []\n }\n\n try {\n const content = readFileSync(registryPath, 'utf-8')\n return JSON.parse(content)\n } catch {\n return []\n }\n}\n\n/**\n * Save marketplace registry\n */\nfunction saveRegistry(marketplaces: RegisteredMarketplace[]): void {\n const registryPath = getRegistryPath()\n writeFileSync(registryPath, JSON.stringify(marketplaces, null, 2), 'utf-8')\n}\n\n/**\n * Load installed skills registry\n */\nexport function loadInstalledSkills(): InstalledSkillPlugin[] {\n const path = getInstalledSkillsPath()\n\n if (!existsSync(path)) {\n return []\n }\n\n try {\n const content = readFileSync(path, 'utf-8')\n return JSON.parse(content)\n } catch {\n return []\n }\n}\n\n/**\n * Save installed skills registry\n */\nfunction saveInstalledSkills(skills: InstalledSkillPlugin[]): void {\n const path = getInstalledSkillsPath()\n writeFileSync(path, JSON.stringify(skills, null, 2), 'utf-8')\n}\n\n/**\n * Parse marketplace source from string\n */\nexport function parseMarketplaceSource(input: string): MarketplaceSource {\n // GitHub shorthand: owner/repo\n if (/^[\\w-]+\\/[\\w-]+$/.test(input)) {\n return { source: 'github', repo: input }\n }\n\n // GitHub URL\n if (input.includes('github.com')) {\n const match = input.match(/github\\.com[/:]([\\w-]+\\/[\\w-]+)/)\n if (match) {\n return { source: 'github', repo: match[1] }\n }\n }\n\n // NPM package (starts with @ or contains no slashes and not a URL)\n if (\n input.startsWith('@') ||\n (input.startsWith('npm:') && !input.includes('/'))\n ) {\n const pkg = input.replace(/^npm:/, '')\n return { source: 'npm', package: pkg }\n }\n\n // Git URL (http/https with .git or git://)\n if (\n input.startsWith('git://') ||\n (input.startsWith('http') && input.endsWith('.git'))\n ) {\n return { source: 'git', url: input }\n }\n\n // HTTP/HTTPS URL\n if (input.startsWith('http://') || input.startsWith('https://')) {\n return { source: 'url', url: input }\n }\n\n // File path (starts with .)\n if (input.startsWith('./') || input.startsWith('../')) {\n return { source: 'file', path: input }\n }\n\n // Directory (absolute path or relative)\n if (input.startsWith('/') || input.startsWith('~')) {\n return { source: 'directory', path: input }\n }\n\n // Default to directory\n return { source: 'directory', path: input }\n}\n\n/**\n * Fetch marketplace manifest from GitHub\n */\nasync function fetchGitHubMarketplace(\n repo: string,\n ref?: string,\n path?: string,\n): Promise<MarketplaceManifest> {\n const url = `https://github.com/${repo}.git`\n const tempDir = await cloneGitRepo(url, ref)\n\n try {\n const baseDir = path ? join(tempDir, path) : tempDir\n const manifestPath = resolveManifestPath(baseDir, 'marketplace.json')\n\n return loadManifestFromPath(manifestPath)\n } finally {\n // Clean up temp directory\n try {\n rmSync(tempDir, { recursive: true, force: true })\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n\n/**\n * Fetch marketplace manifest from git URL\n */\nasync function fetchGitMarketplace(\n url: string,\n ref?: string,\n path?: string,\n): Promise<MarketplaceManifest> {\n const tempDir = await cloneGitRepo(url, ref)\n\n try {\n const baseDir = path ? join(tempDir, path) : tempDir\n const manifestPath = resolveManifestPath(baseDir, 'marketplace.json')\n\n return loadManifestFromPath(manifestPath)\n } finally {\n try {\n rmSync(tempDir, { recursive: true, force: true })\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n\n/**\n * Fetch marketplace manifest from URL\n */\nasync function fetchUrlMarketplace(\n url: string,\n headers?: Record<string, string>,\n): Promise<MarketplaceManifest> {\n try {\n const response = await fetch(url, { headers })\n\n if (!response.ok) {\n throw new SkillMarketplaceError(\n `HTTP ${response.status}: ${response.statusText}`,\n MarketplaceErrorCode.NETWORK_ERROR,\n )\n }\n\n const data = await response.json()\n const parsed = MarketplaceManifestSchema.safeParse(data)\n\n if (!parsed.success) {\n throw new SkillMarketplaceError(\n `Invalid manifest: ${parsed.error.message}`,\n MarketplaceErrorCode.MANIFEST_INVALID,\n )\n }\n\n return parsed.data\n } catch (error) {\n if (error instanceof SkillMarketplaceError) throw error\n\n throw new SkillMarketplaceError(\n `Failed to fetch manifest from URL: ${error instanceof Error ? error.message : String(error)}`,\n MarketplaceErrorCode.NETWORK_ERROR,\n undefined,\n error,\n )\n }\n}\n\n/**\n * Fetch marketplace manifest from NPM\n */\nasync function fetchNpmMarketplace(\n packageName: string,\n version?: string,\n): Promise<MarketplaceManifest> {\n const tempDir = join(getMarketplaceDir(), 'temp', Date.now().toString())\n mkdirSync(tempDir, { recursive: true })\n\n try {\n const pkgSpec = version ? `${packageName}@${version}` : packageName\n const result = await execFileNoThrow('npm', [\n 'pack',\n pkgSpec,\n '--pack-destination',\n tempDir,\n ])\n\n if (result.code !== 0) {\n throw new SkillMarketplaceError(\n `NPM pack failed: ${result.stderr || result.stdout}`,\n MarketplaceErrorCode.NPM_ERROR,\n )\n }\n\n // Extract the tarball\n const tarballName = result.stdout.trim().split('\\n').pop() || ''\n const tarballPath = join(tempDir, tarballName)\n\n const extractResult = await execFileNoThrow('tar', [\n '-xzf',\n tarballPath,\n '-C',\n tempDir,\n ])\n if (extractResult.code !== 0) {\n throw new SkillMarketplaceError(\n `Failed to extract NPM package: ${extractResult.stderr}`,\n MarketplaceErrorCode.NPM_ERROR,\n )\n }\n\n // Look for marketplace manifest in package\n const manifestPath = resolveManifestPath(\n join(tempDir, 'package'),\n 'marketplace.json',\n )\n return loadManifestFromPath(manifestPath)\n } finally {\n try {\n rmSync(tempDir, { recursive: true, force: true })\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n\n/**\n * Load marketplace manifest from local file\n */\nfunction fetchFileMarketplace(filePath: string): MarketplaceManifest {\n const resolvedPath = isAbsolute(filePath)\n ? filePath\n : resolve(getCwd(), filePath)\n\n return loadManifestFromPath(resolvedPath)\n}\n\n/**\n * Load marketplace manifest from local directory\n */\nfunction fetchDirectoryMarketplace(dirPath: string): MarketplaceManifest {\n let resolvedPath = dirPath\n\n // Handle ~ expansion\n if (dirPath.startsWith('~')) {\n resolvedPath = join(homedir(), dirPath.slice(1))\n } else if (!isAbsolute(dirPath)) {\n resolvedPath = resolve(getCwd(), dirPath)\n }\n\n const manifestPath = resolveManifestPath(resolvedPath, 'marketplace.json')\n return loadManifestFromPath(manifestPath)\n}\n\n/**\n * Resolve manifest file path, checking .minto-plugin then .claude-plugin (legacy)\n */\nfunction resolveManifestPath(baseDir: string, filename: string): string {\n const mintoPath = join(baseDir, '.minto-plugin', filename)\n if (existsSync(mintoPath)) return mintoPath\n\n const claudePath = join(baseDir, '.claude-plugin', filename)\n if (existsSync(claudePath)) return claudePath\n\n // Return .minto-plugin path as default (will produce a clear error message)\n return mintoPath\n}\n\n/**\n * Load manifest from file path\n */\nfunction loadManifestFromPath(manifestPath: string): MarketplaceManifest {\n if (!existsSync(manifestPath)) {\n throw new SkillMarketplaceError(\n `Marketplace manifest not found at ${manifestPath}`,\n MarketplaceErrorCode.MANIFEST_NOT_FOUND,\n )\n }\n\n try {\n const content = readFileSync(manifestPath, 'utf-8')\n const data = JSON.parse(content)\n const parsed = MarketplaceManifestSchema.safeParse(data)\n\n if (!parsed.success) {\n throw new SkillMarketplaceError(\n `Invalid manifest: ${parsed.error.message}`,\n MarketplaceErrorCode.MANIFEST_INVALID,\n )\n }\n\n return parsed.data\n } catch (error) {\n if (error instanceof SkillMarketplaceError) throw error\n\n throw new SkillMarketplaceError(\n `Failed to load manifest: ${error instanceof Error ? error.message : String(error)}`,\n MarketplaceErrorCode.MANIFEST_INVALID,\n undefined,\n error,\n )\n }\n}\n\n/**\n * Clone git repository\n */\nasync function cloneGitRepo(url: string, ref?: string): Promise<string> {\n const tempDir = join(getMarketplaceDir(), 'temp', Date.now().toString())\n mkdirSync(tempDir, { recursive: true })\n\n try {\n const args = ['clone', '--depth', '1']\n\n if (ref) {\n args.push('--branch', ref)\n }\n\n args.push(url, tempDir)\n\n const result = await execFileNoThrow('git', args)\n\n if (result.code !== 0) {\n throw new SkillMarketplaceError(\n `Git clone failed: ${result.stderr || result.stdout}`,\n MarketplaceErrorCode.GIT_ERROR,\n )\n }\n\n return tempDir\n } catch (error) {\n try {\n rmSync(tempDir, { recursive: true, force: true })\n } catch {\n // Ignore cleanup errors\n }\n\n if (error instanceof SkillMarketplaceError) throw error\n\n throw new SkillMarketplaceError(\n `Git clone failed: ${error instanceof Error ? error.message : String(error)}`,\n MarketplaceErrorCode.GIT_ERROR,\n undefined,\n error,\n )\n }\n}\n\n/**\n * Fetch marketplace manifest based on source type\n */\nexport async function fetchMarketplaceManifest(\n source: MarketplaceSource,\n): Promise<MarketplaceManifest> {\n switch (source.source) {\n case 'github':\n return fetchGitHubMarketplace(source.repo, source.ref, source.path)\n case 'git':\n return fetchGitMarketplace(source.url, source.ref, source.path)\n case 'url':\n return fetchUrlMarketplace(source.url, source.headers)\n case 'npm':\n return fetchNpmMarketplace(source.package, source.version)\n case 'file':\n return fetchFileMarketplace(source.path)\n case 'directory':\n return fetchDirectoryMarketplace(source.path)\n default:\n throw new SkillMarketplaceError(\n `Unknown source type: ${(source as any).source}`,\n MarketplaceErrorCode.MANIFEST_INVALID,\n )\n }\n}\n\n/**\n * Add/register a marketplace\n */\nexport async function addMarketplace(\n input: string | MarketplaceSource,\n): Promise<RegisteredMarketplace> {\n const source =\n typeof input === 'string' ? parseMarketplaceSource(input) : input\n\n const manifest = await fetchMarketplaceManifest(source)\n\n // Check if already registered\n const registry = loadRegistry()\n if (registry.some(m => m.name === manifest.name)) {\n throw new SkillMarketplaceError(\n `Marketplace \"${manifest.name}\" is already registered`,\n MarketplaceErrorCode.ALREADY_REGISTERED,\n manifest.name,\n )\n }\n\n const registered: RegisteredMarketplace = {\n name: manifest.name,\n source,\n manifest,\n lastUpdated: new Date(),\n enabled: true,\n }\n\n registry.push(registered)\n saveRegistry(registry)\n\n return registered\n}\n\n/**\n * Remove a marketplace\n */\nexport function removeMarketplace(name: string): void {\n const registry = loadRegistry()\n const filtered = registry.filter(m => m.name !== name)\n\n if (filtered.length === registry.length) {\n throw new SkillMarketplaceError(\n `Marketplace \"${name}\" is not registered`,\n MarketplaceErrorCode.NOT_REGISTERED,\n name,\n )\n }\n\n saveRegistry(filtered)\n}\n\n/**\n * Update marketplace manifest\n */\nexport async function updateMarketplace(\n name: string,\n): Promise<RegisteredMarketplace> {\n const registry = loadRegistry()\n const marketplace = registry.find(m => m.name === name)\n\n if (!marketplace) {\n throw new SkillMarketplaceError(\n `Marketplace \"${name}\" is not registered`,\n MarketplaceErrorCode.NOT_REGISTERED,\n name,\n )\n }\n\n const manifest = await fetchMarketplaceManifest(marketplace.source)\n\n marketplace.manifest = manifest\n marketplace.lastUpdated = new Date()\n\n saveRegistry(registry)\n\n return marketplace\n}\n\n/**\n * List all registered marketplaces\n */\nexport function listMarketplaces(): RegisteredMarketplace[] {\n return loadRegistry()\n}\n\n/**\n * Get a specific marketplace\n */\nexport function getMarketplace(\n name: string,\n): RegisteredMarketplace | undefined {\n return loadRegistry().find(m => m.name === name)\n}\n\n/**\n * Find plugin in marketplaces\n */\nexport function findPlugin(\n pluginName: string,\n marketplaceName?: string,\n): { marketplace: RegisteredMarketplace; plugin: PluginEntry } | undefined {\n const registry = loadRegistry()\n\n if (marketplaceName) {\n const marketplace = registry.find(m => m.name === marketplaceName)\n if (!marketplace) return undefined\n\n const plugin = marketplace.manifest.plugins.find(p => p.name === pluginName)\n if (!plugin) return undefined\n\n return { marketplace, plugin }\n }\n\n for (const marketplace of registry) {\n if (!marketplace.enabled) continue\n\n const plugin = marketplace.manifest.plugins.find(p => p.name === pluginName)\n if (plugin) {\n return { marketplace, plugin }\n }\n }\n\n return undefined\n}\n\n/**\n * Install plugin from marketplace\n */\nexport async function installPlugin(\n pluginName: string,\n options: {\n marketplace?: string\n scope?: PluginScope\n force?: boolean\n } = {},\n): Promise<string> {\n const {\n marketplace: marketplaceName,\n scope = 'user',\n force = false,\n } = options\n\n const found = findPlugin(pluginName, marketplaceName)\n\n if (!found) {\n throw new SkillMarketplaceError(\n marketplaceName\n ? `Plugin \"${pluginName}\" not found in marketplace \"${marketplaceName}\"`\n : `Plugin \"${pluginName}\" not found in any marketplace`,\n MarketplaceErrorCode.PLUGIN_NOT_FOUND,\n )\n }\n\n const { marketplace, plugin } = found\n const installDir = join(getInstalledPluginsDir(scope), plugin.name)\n\n // Check if already installed\n if (existsSync(installDir) && !force) {\n throw new SkillMarketplaceError(\n `Plugin \"${pluginName}\" is already installed. Use --force to reinstall.`,\n MarketplaceErrorCode.ALREADY_REGISTERED,\n pluginName,\n )\n }\n\n // Remove existing if force\n if (existsSync(installDir) && force) {\n rmSync(installDir, { recursive: true, force: true })\n }\n\n // Create installation directory\n mkdirSync(installDir, { recursive: true })\n\n try {\n // Install based on marketplace source type and plugin source\n // For now, we'll use the marketplace manager's implementation\n // This will be enhanced in future iterations\n\n // Record installation\n const installed = loadInstalledSkills()\n const record: InstalledSkillPlugin = {\n plugin: plugin.name,\n marketplace: marketplace.name,\n scope,\n isEnabled: true,\n installedAt: new Date().toISOString(),\n pluginRoot: installDir,\n skills:\n typeof plugin.skills === 'string'\n ? [plugin.skills]\n : plugin.skills || [],\n commands:\n typeof plugin.commands === 'string'\n ? [plugin.commands]\n : plugin.commands || [],\n sourceMarketplacePath:\n marketplace.source.source === 'directory'\n ? (marketplace.source as { source: 'directory'; path: string }).path\n : marketplace.name,\n }\n\n // Remove existing record if present\n const filtered = installed.filter(\n i => !(i.plugin === plugin.name && i.scope === scope),\n )\n filtered.push(record)\n saveInstalledSkills(filtered)\n\n return installDir\n } catch (error) {\n // Clean up on failure\n try {\n rmSync(installDir, { recursive: true, force: true })\n } catch {\n // Ignore cleanup errors\n }\n\n throw new SkillMarketplaceError(\n `Failed to install plugin: ${error instanceof Error ? error.message : String(error)}`,\n MarketplaceErrorCode.INSTALLATION_FAILED,\n pluginName,\n error,\n )\n }\n}\n\n/**\n * Uninstall plugin\n */\nexport function uninstallPlugin(\n pluginName: string,\n scope: PluginScope = 'user',\n): void {\n const installed = loadInstalledSkills()\n const record = installed.find(\n i => i.plugin === pluginName && i.scope === scope,\n )\n\n if (!record) {\n throw new SkillMarketplaceError(\n `Plugin \"${pluginName}\" is not installed in ${scope} scope`,\n MarketplaceErrorCode.PLUGIN_NOT_FOUND,\n pluginName,\n )\n }\n\n // Remove plugin directory\n if (record.pluginRoot && existsSync(record.pluginRoot)) {\n rmSync(record.pluginRoot, { recursive: true, force: true })\n }\n\n // Update registry\n const filtered = installed.filter(\n i => !(i.plugin === pluginName && i.scope === scope),\n )\n saveInstalledSkills(filtered)\n}\n\n/**\n * Enable plugin\n */\nexport function enablePlugin(\n pluginName: string,\n scope: PluginScope = 'user',\n): void {\n const installed = loadInstalledSkills()\n const record = installed.find(\n i => i.plugin === pluginName && i.scope === scope,\n )\n\n if (!record) {\n throw new SkillMarketplaceError(\n `Plugin \"${pluginName}\" is not installed in ${scope} scope`,\n MarketplaceErrorCode.PLUGIN_NOT_FOUND,\n pluginName,\n )\n }\n\n record.isEnabled = true\n saveInstalledSkills(installed)\n}\n\n/**\n * Disable plugin\n */\nexport function disablePlugin(\n pluginName: string,\n scope: PluginScope = 'user',\n): void {\n const installed = loadInstalledSkills()\n const record = installed.find(\n i => i.plugin === pluginName && i.scope === scope,\n )\n\n if (!record) {\n throw new SkillMarketplaceError(\n `Plugin \"${pluginName}\" is not installed in ${scope} scope`,\n MarketplaceErrorCode.PLUGIN_NOT_FOUND,\n pluginName,\n )\n }\n\n record.isEnabled = false\n saveInstalledSkills(installed)\n}\n\n/**\n * List installed plugins\n */\nexport function listInstalledPlugins(\n scope?: PluginScope,\n): InstalledSkillPlugin[] {\n const installed = loadInstalledSkills()\n\n if (scope) {\n return installed.filter(i => i.scope === scope)\n }\n\n return installed\n}\n\n/**\n * Validate marketplace manifest\n */\nexport function validateMarketplaceManifest(data: unknown): {\n success: boolean\n data?: MarketplaceManifest\n error?: string\n} {\n const result = MarketplaceManifestSchema.safeParse(data)\n\n if (result.success) {\n return { success: true, data: result.data }\n }\n\n return { success: false, error: result.error.message }\n}\n\n/**\n * Validate plugin path (used for local validation)\n */\nexport function validatePluginPath(path: string): {\n isValid: boolean\n errors: string[]\n} {\n const errors: string[] = []\n\n const resolvedPath = isAbsolute(path) ? path : resolve(getCwd(), path)\n\n if (!existsSync(resolvedPath)) {\n errors.push(`Path does not exist: ${resolvedPath}`)\n return { isValid: false, errors }\n }\n\n // Check for plugin manifest (.minto-plugin, .claude-plugin, or root)\n const mintoManifest = join(resolvedPath, '.minto-plugin', 'plugin.json')\n const claudeManifest = join(resolvedPath, '.claude-plugin', 'plugin.json')\n const rootManifest = join(resolvedPath, 'plugin.json')\n\n if (\n !existsSync(mintoManifest) &&\n !existsSync(claudeManifest) &&\n !existsSync(rootManifest)\n ) {\n errors.push(\n 'No plugin manifest found. Expected .minto-plugin/plugin.json or plugin.json',\n )\n }\n\n return { isValid: errors.length === 0, errors }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * Skill Marketplace Service\n *\n * Implements Claude Code CLI compatible marketplace functionality\n * for plugin/skill discovery and installation.\n *\n * Supports all Claude Code CLI source types:\n * - github: owner/repo format\n * - git: generic git URL\n * - url: HTTP/HTTPS URL to marketplace JSON\n * - npm: npm package name\n * - file: local file path\n * - directory: local directory path\n */\n\nimport { existsSync, readFileSync, mkdirSync, writeFileSync, rmSync } from 'fs'\nimport { join, resolve, isAbsolute } from 'path'\nimport { homedir } from 'os'\nimport { z } from 'zod'\nimport { execFileNoThrow } from '@utils/execFileNoThrow'\nimport { getCwd } from '@utils/state'\nimport type {\n SessionPlugin,\n PluginScope,\n InstalledSkillPlugin,\n} from '@minto-types/plugin'\n\n/**\n * Marketplace source types (Claude Code CLI compatible)\n */\nexport type MarketplaceSource =\n | { source: 'github'; repo: string; ref?: string; path?: string }\n | { source: 'git'; url: string; ref?: string; path?: string }\n | { source: 'url'; url: string; headers?: Record<string, string> }\n | { source: 'npm'; package: string; version?: string }\n | { source: 'file'; path: string }\n | { source: 'directory'; path: string }\n\n/**\n * Plugin entry schema in a marketplace manifest\n */\nconst PluginEntrySchema = z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n source: z.string().optional().default('./'),\n strict: z.boolean().optional(),\n skills: z.union([z.string(), z.array(z.string())]).optional(),\n commands: z.union([z.string(), z.array(z.string())]).optional(),\n agents: z.union([z.string(), z.array(z.string())]).optional(),\n hooks: z.union([z.string(), z.array(z.string())]).optional(),\n mcpServers: z.union([z.string(), z.array(z.string())]).optional(),\n})\n\n/**\n * Plugin entry type (inferred from schema)\n */\nexport type PluginEntry = z.infer<typeof PluginEntrySchema>\n\n/**\n * Marketplace manifest schema (Claude Code CLI compatible)\n */\nexport const MarketplaceManifestSchema = z.object({\n $schema: z.string().optional(),\n name: z.string().min(1),\n description: z.string().optional(),\n owner: z\n .object({\n name: z.string().optional(),\n email: z.string().email().optional(),\n })\n .optional(),\n metadata: z.record(z.unknown()).optional(),\n plugins: z.array(PluginEntrySchema),\n})\n\nexport type MarketplaceManifest = z.infer<typeof MarketplaceManifestSchema>\n\n/**\n * Registered marketplace in user config\n */\nexport interface RegisteredMarketplace {\n name: string\n source: MarketplaceSource\n manifest: MarketplaceManifest\n lastUpdated: Date\n enabled: boolean\n}\n\n/**\n * Marketplace error codes\n */\nexport enum MarketplaceErrorCode {\n MANIFEST_INVALID = 'MANIFEST_INVALID',\n MANIFEST_NOT_FOUND = 'MANIFEST_NOT_FOUND',\n NETWORK_ERROR = 'NETWORK_ERROR',\n GIT_ERROR = 'GIT_ERROR',\n NPM_ERROR = 'NPM_ERROR',\n ALREADY_REGISTERED = 'ALREADY_REGISTERED',\n NOT_REGISTERED = 'NOT_REGISTERED',\n PLUGIN_NOT_FOUND = 'PLUGIN_NOT_FOUND',\n INSTALLATION_FAILED = 'INSTALLATION_FAILED',\n}\n\n/**\n * Marketplace error class\n */\nexport class SkillMarketplaceError extends Error {\n constructor(\n message: string,\n public code: MarketplaceErrorCode,\n public marketplaceName?: string,\n public details?: unknown,\n ) {\n super(message)\n this.name = 'SkillMarketplaceError'\n }\n}\n\n/**\n * Get marketplace storage directory\n */\nfunction getMarketplaceDir(): string {\n const home = homedir()\n const dir = join(home, '.minto', 'marketplaces')\n\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n\n return dir\n}\n\n/**\n * Get installed plugins storage directory based on scope\n */\nfunction getInstalledPluginsDir(scope: PluginScope): string {\n const base =\n scope === 'user'\n ? join(homedir(), '.minto', 'plugins')\n : join(getCwd(), '.minto', 'plugins')\n\n if (!existsSync(base)) {\n mkdirSync(base, { recursive: true })\n }\n\n return base\n}\n\n/**\n * Get registry file path\n */\nfunction getRegistryPath(): string {\n return join(getMarketplaceDir(), 'registry.json')\n}\n\n/**\n * Get installed skills registry path\n */\nfunction getInstalledSkillsPath(): string {\n return join(getMarketplaceDir(), 'installed-skills.json')\n}\n\n/**\n * Load marketplace registry\n */\nfunction loadRegistry(): RegisteredMarketplace[] {\n const registryPath = getRegistryPath()\n\n if (!existsSync(registryPath)) {\n return []\n }\n\n try {\n const content = readFileSync(registryPath, 'utf-8')\n return JSON.parse(content)\n } catch {\n return []\n }\n}\n\n/**\n * Save marketplace registry\n */\nfunction saveRegistry(marketplaces: RegisteredMarketplace[]): void {\n const registryPath = getRegistryPath()\n writeFileSync(registryPath, JSON.stringify(marketplaces, null, 2), 'utf-8')\n}\n\n/**\n * Load installed skills registry\n */\nexport function loadInstalledSkills(): InstalledSkillPlugin[] {\n const path = getInstalledSkillsPath()\n\n if (!existsSync(path)) {\n return []\n }\n\n try {\n const content = readFileSync(path, 'utf-8')\n return JSON.parse(content)\n } catch {\n return []\n }\n}\n\n/**\n * Save installed skills registry\n */\nfunction saveInstalledSkills(skills: InstalledSkillPlugin[]): void {\n const path = getInstalledSkillsPath()\n writeFileSync(path, JSON.stringify(skills, null, 2), 'utf-8')\n}\n\n/**\n * Parse marketplace source from string\n */\nexport function parseMarketplaceSource(input: string): MarketplaceSource {\n // GitHub shorthand: owner/repo\n if (/^[\\w-]+\\/[\\w-]+$/.test(input)) {\n return { source: 'github', repo: input }\n }\n\n // GitHub URL\n if (input.includes('github.com')) {\n const match = input.match(/github\\.com[/:]([\\w-]+\\/[\\w-]+)/)\n if (match) {\n return { source: 'github', repo: match[1] }\n }\n }\n\n // NPM package (starts with @ or contains no slashes and not a URL)\n if (\n input.startsWith('@') ||\n (input.startsWith('npm:') && !input.includes('/'))\n ) {\n const pkg = input.replace(/^npm:/, '')\n return { source: 'npm', package: pkg }\n }\n\n // Git URL (http/https with .git or git://)\n if (\n input.startsWith('git://') ||\n (input.startsWith('http') && input.endsWith('.git'))\n ) {\n return { source: 'git', url: input }\n }\n\n // HTTP/HTTPS URL\n if (input.startsWith('http://') || input.startsWith('https://')) {\n return { source: 'url', url: input }\n }\n\n // File path (starts with .)\n if (input.startsWith('./') || input.startsWith('../')) {\n return { source: 'file', path: input }\n }\n\n // Directory (absolute path or relative)\n if (input.startsWith('/') || input.startsWith('~')) {\n return { source: 'directory', path: input }\n }\n\n // Default to directory\n return { source: 'directory', path: input }\n}\n\n/**\n * Fetch marketplace manifest from GitHub\n */\nasync function fetchGitHubMarketplace(\n repo: string,\n ref?: string,\n path?: string,\n): Promise<MarketplaceManifest> {\n const url = `https://github.com/${repo}.git`\n const tempDir = await cloneGitRepo(url, ref)\n\n try {\n const baseDir = path ? join(tempDir, path) : tempDir\n const manifestPath = resolveManifestPath(baseDir, 'marketplace.json')\n\n return loadManifestFromPath(manifestPath)\n } finally {\n // Clean up temp directory\n try {\n rmSync(tempDir, { recursive: true, force: true })\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n\n/**\n * Fetch marketplace manifest from git URL\n */\nasync function fetchGitMarketplace(\n url: string,\n ref?: string,\n path?: string,\n): Promise<MarketplaceManifest> {\n const tempDir = await cloneGitRepo(url, ref)\n\n try {\n const baseDir = path ? join(tempDir, path) : tempDir\n const manifestPath = resolveManifestPath(baseDir, 'marketplace.json')\n\n return loadManifestFromPath(manifestPath)\n } finally {\n try {\n rmSync(tempDir, { recursive: true, force: true })\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n\n/**\n * Fetch marketplace manifest from URL\n */\nasync function fetchUrlMarketplace(\n url: string,\n headers?: Record<string, string>,\n): Promise<MarketplaceManifest> {\n try {\n const response = await fetch(url, {\n headers,\n signal: AbortSignal.timeout(30_000),\n })\n\n if (!response.ok) {\n throw new SkillMarketplaceError(\n `HTTP ${response.status}: ${response.statusText}`,\n MarketplaceErrorCode.NETWORK_ERROR,\n )\n }\n\n const data = await response.json()\n const parsed = MarketplaceManifestSchema.safeParse(data)\n\n if (!parsed.success) {\n throw new SkillMarketplaceError(\n `Invalid manifest: ${parsed.error.message}`,\n MarketplaceErrorCode.MANIFEST_INVALID,\n )\n }\n\n return parsed.data\n } catch (error) {\n if (error instanceof SkillMarketplaceError) throw error\n\n throw new SkillMarketplaceError(\n `Failed to fetch manifest from URL: ${error instanceof Error ? error.message : String(error)}`,\n MarketplaceErrorCode.NETWORK_ERROR,\n undefined,\n error,\n )\n }\n}\n\n/**\n * Fetch marketplace manifest from NPM\n */\nasync function fetchNpmMarketplace(\n packageName: string,\n version?: string,\n): Promise<MarketplaceManifest> {\n const tempDir = join(getMarketplaceDir(), 'temp', Date.now().toString())\n mkdirSync(tempDir, { recursive: true })\n\n try {\n const pkgSpec = version ? `${packageName}@${version}` : packageName\n const result = await execFileNoThrow('npm', [\n 'pack',\n pkgSpec,\n '--pack-destination',\n tempDir,\n ])\n\n if (result.code !== 0) {\n throw new SkillMarketplaceError(\n `NPM pack failed: ${result.stderr || result.stdout}`,\n MarketplaceErrorCode.NPM_ERROR,\n )\n }\n\n // Extract the tarball\n const tarballName = result.stdout.trim().split('\\n').pop() || ''\n const tarballPath = join(tempDir, tarballName)\n\n const extractResult = await execFileNoThrow('tar', [\n '-xzf',\n tarballPath,\n '-C',\n tempDir,\n ])\n if (extractResult.code !== 0) {\n throw new SkillMarketplaceError(\n `Failed to extract NPM package: ${extractResult.stderr}`,\n MarketplaceErrorCode.NPM_ERROR,\n )\n }\n\n // Look for marketplace manifest in package\n const manifestPath = resolveManifestPath(\n join(tempDir, 'package'),\n 'marketplace.json',\n )\n return loadManifestFromPath(manifestPath)\n } finally {\n try {\n rmSync(tempDir, { recursive: true, force: true })\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n\n/**\n * Load marketplace manifest from local file\n */\nfunction fetchFileMarketplace(filePath: string): MarketplaceManifest {\n const resolvedPath = isAbsolute(filePath)\n ? filePath\n : resolve(getCwd(), filePath)\n\n return loadManifestFromPath(resolvedPath)\n}\n\n/**\n * Load marketplace manifest from local directory\n */\nfunction fetchDirectoryMarketplace(dirPath: string): MarketplaceManifest {\n let resolvedPath = dirPath\n\n // Handle ~ expansion\n if (dirPath.startsWith('~')) {\n resolvedPath = join(homedir(), dirPath.slice(1))\n } else if (!isAbsolute(dirPath)) {\n resolvedPath = resolve(getCwd(), dirPath)\n }\n\n const manifestPath = resolveManifestPath(resolvedPath, 'marketplace.json')\n return loadManifestFromPath(manifestPath)\n}\n\n/**\n * Resolve manifest file path, checking .minto-plugin then .claude-plugin (legacy)\n */\nfunction resolveManifestPath(baseDir: string, filename: string): string {\n const mintoPath = join(baseDir, '.minto-plugin', filename)\n if (existsSync(mintoPath)) return mintoPath\n\n const claudePath = join(baseDir, '.claude-plugin', filename)\n if (existsSync(claudePath)) return claudePath\n\n // Return .minto-plugin path as default (will produce a clear error message)\n return mintoPath\n}\n\n/**\n * Load manifest from file path\n */\nfunction loadManifestFromPath(manifestPath: string): MarketplaceManifest {\n if (!existsSync(manifestPath)) {\n throw new SkillMarketplaceError(\n `Marketplace manifest not found at ${manifestPath}`,\n MarketplaceErrorCode.MANIFEST_NOT_FOUND,\n )\n }\n\n try {\n const content = readFileSync(manifestPath, 'utf-8')\n const data = JSON.parse(content)\n const parsed = MarketplaceManifestSchema.safeParse(data)\n\n if (!parsed.success) {\n throw new SkillMarketplaceError(\n `Invalid manifest: ${parsed.error.message}`,\n MarketplaceErrorCode.MANIFEST_INVALID,\n )\n }\n\n return parsed.data\n } catch (error) {\n if (error instanceof SkillMarketplaceError) throw error\n\n throw new SkillMarketplaceError(\n `Failed to load manifest: ${error instanceof Error ? error.message : String(error)}`,\n MarketplaceErrorCode.MANIFEST_INVALID,\n undefined,\n error,\n )\n }\n}\n\n/**\n * Clone git repository\n */\nasync function cloneGitRepo(url: string, ref?: string): Promise<string> {\n const tempDir = join(getMarketplaceDir(), 'temp', Date.now().toString())\n mkdirSync(tempDir, { recursive: true })\n\n try {\n const args = ['clone', '--depth', '1']\n\n if (ref) {\n args.push('--branch', ref)\n }\n\n args.push(url, tempDir)\n\n const result = await execFileNoThrow('git', args)\n\n if (result.code !== 0) {\n throw new SkillMarketplaceError(\n `Git clone failed: ${result.stderr || result.stdout}`,\n MarketplaceErrorCode.GIT_ERROR,\n )\n }\n\n return tempDir\n } catch (error) {\n try {\n rmSync(tempDir, { recursive: true, force: true })\n } catch {\n // Ignore cleanup errors\n }\n\n if (error instanceof SkillMarketplaceError) throw error\n\n throw new SkillMarketplaceError(\n `Git clone failed: ${error instanceof Error ? error.message : String(error)}`,\n MarketplaceErrorCode.GIT_ERROR,\n undefined,\n error,\n )\n }\n}\n\n/**\n * Fetch marketplace manifest based on source type\n */\nexport async function fetchMarketplaceManifest(\n source: MarketplaceSource,\n): Promise<MarketplaceManifest> {\n switch (source.source) {\n case 'github':\n return fetchGitHubMarketplace(source.repo, source.ref, source.path)\n case 'git':\n return fetchGitMarketplace(source.url, source.ref, source.path)\n case 'url':\n return fetchUrlMarketplace(source.url, source.headers)\n case 'npm':\n return fetchNpmMarketplace(source.package, source.version)\n case 'file':\n return fetchFileMarketplace(source.path)\n case 'directory':\n return fetchDirectoryMarketplace(source.path)\n default:\n throw new SkillMarketplaceError(\n `Unknown source type: ${(source as any).source}`,\n MarketplaceErrorCode.MANIFEST_INVALID,\n )\n }\n}\n\n/**\n * Add/register a marketplace\n */\nexport async function addMarketplace(\n input: string | MarketplaceSource,\n): Promise<RegisteredMarketplace> {\n const source =\n typeof input === 'string' ? parseMarketplaceSource(input) : input\n\n const manifest = await fetchMarketplaceManifest(source)\n\n // Check if already registered\n const registry = loadRegistry()\n if (registry.some(m => m.name === manifest.name)) {\n throw new SkillMarketplaceError(\n `Marketplace \"${manifest.name}\" is already registered`,\n MarketplaceErrorCode.ALREADY_REGISTERED,\n manifest.name,\n )\n }\n\n const registered: RegisteredMarketplace = {\n name: manifest.name,\n source,\n manifest,\n lastUpdated: new Date(),\n enabled: true,\n }\n\n registry.push(registered)\n saveRegistry(registry)\n\n return registered\n}\n\n/**\n * Remove a marketplace\n */\nexport function removeMarketplace(name: string): void {\n const registry = loadRegistry()\n const filtered = registry.filter(m => m.name !== name)\n\n if (filtered.length === registry.length) {\n throw new SkillMarketplaceError(\n `Marketplace \"${name}\" is not registered`,\n MarketplaceErrorCode.NOT_REGISTERED,\n name,\n )\n }\n\n saveRegistry(filtered)\n}\n\n/**\n * Update marketplace manifest\n */\nexport async function updateMarketplace(\n name: string,\n): Promise<RegisteredMarketplace> {\n const registry = loadRegistry()\n const marketplace = registry.find(m => m.name === name)\n\n if (!marketplace) {\n throw new SkillMarketplaceError(\n `Marketplace \"${name}\" is not registered`,\n MarketplaceErrorCode.NOT_REGISTERED,\n name,\n )\n }\n\n const manifest = await fetchMarketplaceManifest(marketplace.source)\n\n marketplace.manifest = manifest\n marketplace.lastUpdated = new Date()\n\n saveRegistry(registry)\n\n return marketplace\n}\n\n/**\n * List all registered marketplaces\n */\nexport function listMarketplaces(): RegisteredMarketplace[] {\n return loadRegistry()\n}\n\n/**\n * Get a specific marketplace\n */\nexport function getMarketplace(\n name: string,\n): RegisteredMarketplace | undefined {\n return loadRegistry().find(m => m.name === name)\n}\n\n/**\n * Find plugin in marketplaces\n */\nexport function findPlugin(\n pluginName: string,\n marketplaceName?: string,\n): { marketplace: RegisteredMarketplace; plugin: PluginEntry } | undefined {\n const registry = loadRegistry()\n\n if (marketplaceName) {\n const marketplace = registry.find(m => m.name === marketplaceName)\n if (!marketplace) return undefined\n\n const plugin = marketplace.manifest.plugins.find(p => p.name === pluginName)\n if (!plugin) return undefined\n\n return { marketplace, plugin }\n }\n\n for (const marketplace of registry) {\n if (!marketplace.enabled) continue\n\n const plugin = marketplace.manifest.plugins.find(p => p.name === pluginName)\n if (plugin) {\n return { marketplace, plugin }\n }\n }\n\n return undefined\n}\n\n/**\n * Install plugin from marketplace\n */\nexport async function installPlugin(\n pluginName: string,\n options: {\n marketplace?: string\n scope?: PluginScope\n force?: boolean\n } = {},\n): Promise<string> {\n const {\n marketplace: marketplaceName,\n scope = 'user',\n force = false,\n } = options\n\n const found = findPlugin(pluginName, marketplaceName)\n\n if (!found) {\n throw new SkillMarketplaceError(\n marketplaceName\n ? `Plugin \"${pluginName}\" not found in marketplace \"${marketplaceName}\"`\n : `Plugin \"${pluginName}\" not found in any marketplace`,\n MarketplaceErrorCode.PLUGIN_NOT_FOUND,\n )\n }\n\n const { marketplace, plugin } = found\n const installDir = join(getInstalledPluginsDir(scope), plugin.name)\n\n // Check if already installed\n if (existsSync(installDir) && !force) {\n throw new SkillMarketplaceError(\n `Plugin \"${pluginName}\" is already installed. Use --force to reinstall.`,\n MarketplaceErrorCode.ALREADY_REGISTERED,\n pluginName,\n )\n }\n\n // Remove existing if force\n if (existsSync(installDir) && force) {\n rmSync(installDir, { recursive: true, force: true })\n }\n\n // Create installation directory\n mkdirSync(installDir, { recursive: true })\n\n try {\n // Install based on marketplace source type and plugin source\n // For now, we'll use the marketplace manager's implementation\n // This will be enhanced in future iterations\n\n // Record installation\n const installed = loadInstalledSkills()\n const record: InstalledSkillPlugin = {\n plugin: plugin.name,\n marketplace: marketplace.name,\n scope,\n isEnabled: true,\n installedAt: new Date().toISOString(),\n pluginRoot: installDir,\n skills:\n typeof plugin.skills === 'string'\n ? [plugin.skills]\n : plugin.skills || [],\n commands:\n typeof plugin.commands === 'string'\n ? [plugin.commands]\n : plugin.commands || [],\n sourceMarketplacePath:\n marketplace.source.source === 'directory'\n ? (marketplace.source as { source: 'directory'; path: string }).path\n : marketplace.name,\n }\n\n // Remove existing record if present\n const filtered = installed.filter(\n i => !(i.plugin === plugin.name && i.scope === scope),\n )\n filtered.push(record)\n saveInstalledSkills(filtered)\n\n return installDir\n } catch (error) {\n // Clean up on failure\n try {\n rmSync(installDir, { recursive: true, force: true })\n } catch {\n // Ignore cleanup errors\n }\n\n throw new SkillMarketplaceError(\n `Failed to install plugin: ${error instanceof Error ? error.message : String(error)}`,\n MarketplaceErrorCode.INSTALLATION_FAILED,\n pluginName,\n error,\n )\n }\n}\n\n/**\n * Uninstall plugin\n */\nexport function uninstallPlugin(\n pluginName: string,\n scope: PluginScope = 'user',\n): void {\n const installed = loadInstalledSkills()\n const record = installed.find(\n i => i.plugin === pluginName && i.scope === scope,\n )\n\n if (!record) {\n throw new SkillMarketplaceError(\n `Plugin \"${pluginName}\" is not installed in ${scope} scope`,\n MarketplaceErrorCode.PLUGIN_NOT_FOUND,\n pluginName,\n )\n }\n\n // Remove plugin directory\n if (record.pluginRoot && existsSync(record.pluginRoot)) {\n rmSync(record.pluginRoot, { recursive: true, force: true })\n }\n\n // Update registry\n const filtered = installed.filter(\n i => !(i.plugin === pluginName && i.scope === scope),\n )\n saveInstalledSkills(filtered)\n}\n\n/**\n * Enable plugin\n */\nexport function enablePlugin(\n pluginName: string,\n scope: PluginScope = 'user',\n): void {\n const installed = loadInstalledSkills()\n const record = installed.find(\n i => i.plugin === pluginName && i.scope === scope,\n )\n\n if (!record) {\n throw new SkillMarketplaceError(\n `Plugin \"${pluginName}\" is not installed in ${scope} scope`,\n MarketplaceErrorCode.PLUGIN_NOT_FOUND,\n pluginName,\n )\n }\n\n record.isEnabled = true\n saveInstalledSkills(installed)\n}\n\n/**\n * Disable plugin\n */\nexport function disablePlugin(\n pluginName: string,\n scope: PluginScope = 'user',\n): void {\n const installed = loadInstalledSkills()\n const record = installed.find(\n i => i.plugin === pluginName && i.scope === scope,\n )\n\n if (!record) {\n throw new SkillMarketplaceError(\n `Plugin \"${pluginName}\" is not installed in ${scope} scope`,\n MarketplaceErrorCode.PLUGIN_NOT_FOUND,\n pluginName,\n )\n }\n\n record.isEnabled = false\n saveInstalledSkills(installed)\n}\n\n/**\n * List installed plugins\n */\nexport function listInstalledPlugins(\n scope?: PluginScope,\n): InstalledSkillPlugin[] {\n const installed = loadInstalledSkills()\n\n if (scope) {\n return installed.filter(i => i.scope === scope)\n }\n\n return installed\n}\n\n/**\n * Validate marketplace manifest\n */\nexport function validateMarketplaceManifest(data: unknown): {\n success: boolean\n data?: MarketplaceManifest\n error?: string\n} {\n const result = MarketplaceManifestSchema.safeParse(data)\n\n if (result.success) {\n return { success: true, data: result.data }\n }\n\n return { success: false, error: result.error.message }\n}\n\n/**\n * Validate plugin path (used for local validation)\n */\nexport function validatePluginPath(path: string): {\n isValid: boolean\n errors: string[]\n} {\n const errors: string[] = []\n\n const resolvedPath = isAbsolute(path) ? path : resolve(getCwd(), path)\n\n if (!existsSync(resolvedPath)) {\n errors.push(`Path does not exist: ${resolvedPath}`)\n return { isValid: false, errors }\n }\n\n // Check for plugin manifest (.minto-plugin, .claude-plugin, or root)\n const mintoManifest = join(resolvedPath, '.minto-plugin', 'plugin.json')\n const claudeManifest = join(resolvedPath, '.claude-plugin', 'plugin.json')\n const rootManifest = join(resolvedPath, 'plugin.json')\n\n if (\n !existsSync(mintoManifest) &&\n !existsSync(claudeManifest) &&\n !existsSync(rootManifest)\n ) {\n errors.push(\n 'No plugin manifest found. Expected .minto-plugin/plugin.json or plugin.json',\n )\n }\n\n return { isValid: errors.length === 0, errors }\n}\n"],
|
|
5
|
+
"mappings": "AAeA,SAAS,YAAY,cAAc,WAAW,eAAe,cAAc;AAC3E,SAAS,MAAM,SAAS,kBAAkB;AAC1C,SAAS,eAAe;AACxB,SAAS,SAAS;AAClB,SAAS,uBAAuB;AAChC,SAAS,cAAc;AAqBvB,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACjC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EAC1C,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC7B,QAAQ,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS;AAAA,EAC5D,UAAU,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS;AAAA,EAC9D,QAAQ,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS;AAAA,EAC5D,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS;AAAA,EAC3D,YAAY,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS;AAClE,CAAC;AAUM,MAAM,4BAA4B,EAAE,OAAO;AAAA,EAChD,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,OAAO,EACJ,OAAO;AAAA,IACN,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS;AAAA,EACrC,CAAC,EACA,SAAS;AAAA,EACZ,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACzC,SAAS,EAAE,MAAM,iBAAiB;AACpC,CAAC;AAkBM,IAAK,uBAAL,kBAAKA,0BAAL;AACL,EAAAA,sBAAA,sBAAmB;AACnB,EAAAA,sBAAA,wBAAqB;AACrB,EAAAA,sBAAA,mBAAgB;AAChB,EAAAA,sBAAA,eAAY;AACZ,EAAAA,sBAAA,eAAY;AACZ,EAAAA,sBAAA,wBAAqB;AACrB,EAAAA,sBAAA,oBAAiB;AACjB,EAAAA,sBAAA,sBAAmB;AACnB,EAAAA,sBAAA,yBAAsB;AATZ,SAAAA;AAAA,GAAA;AAeL,MAAM,8BAA8B,MAAM;AAAA,EAC/C,YACE,SACO,MACA,iBACA,SACP;AACA,UAAM,OAAO;AAJN;AACA;AACA;AAGP,SAAK,OAAO;AAAA,EACd;AACF;AAKA,SAAS,oBAA4B;AACnC,QAAM,OAAO,QAAQ;AACrB,QAAM,MAAM,KAAK,MAAM,UAAU,cAAc;AAE/C,MAAI,CAAC,WAAW,GAAG,GAAG;AACpB,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AAEA,SAAO;AACT;AAKA,SAAS,uBAAuB,OAA4B;AAC1D,QAAM,OACJ,UAAU,SACN,KAAK,QAAQ,GAAG,UAAU,SAAS,IACnC,KAAK,OAAO,GAAG,UAAU,SAAS;AAExC,MAAI,CAAC,WAAW,IAAI,GAAG;AACrB,cAAU,MAAM,EAAE,WAAW,KAAK,CAAC;AAAA,EACrC;AAEA,SAAO;AACT;AAKA,SAAS,kBAA0B;AACjC,SAAO,KAAK,kBAAkB,GAAG,eAAe;AAClD;AAKA,SAAS,yBAAiC;AACxC,SAAO,KAAK,kBAAkB,GAAG,uBAAuB;AAC1D;AAKA,SAAS,eAAwC;AAC/C,QAAM,eAAe,gBAAgB;AAErC,MAAI,CAAC,WAAW,YAAY,GAAG;AAC7B,WAAO,CAAC;AAAA,EACV;AAEA,MAAI;AACF,UAAM,UAAU,aAAa,cAAc,OAAO;AAClD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAKA,SAAS,aAAa,cAA6C;AACjE,QAAM,eAAe,gBAAgB;AACrC,gBAAc,cAAc,KAAK,UAAU,cAAc,MAAM,CAAC,GAAG,OAAO;AAC5E;AAKO,SAAS,sBAA8C;AAC5D,QAAM,OAAO,uBAAuB;AAEpC,MAAI,CAAC,WAAW,IAAI,GAAG;AACrB,WAAO,CAAC;AAAA,EACV;AAEA,MAAI;AACF,UAAM,UAAU,aAAa,MAAM,OAAO;AAC1C,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAKA,SAAS,oBAAoB,QAAsC;AACjE,QAAM,OAAO,uBAAuB;AACpC,gBAAc,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AAC9D;AAKO,SAAS,uBAAuB,OAAkC;AAEvE,MAAI,mBAAmB,KAAK,KAAK,GAAG;AAClC,WAAO,EAAE,QAAQ,UAAU,MAAM,MAAM;AAAA,EACzC;AAGA,MAAI,MAAM,SAAS,YAAY,GAAG;AAChC,UAAM,QAAQ,MAAM,MAAM,iCAAiC;AAC3D,QAAI,OAAO;AACT,aAAO,EAAE,QAAQ,UAAU,MAAM,MAAM,CAAC,EAAE;AAAA,IAC5C;AAAA,EACF;AAGA,MACE,MAAM,WAAW,GAAG,KACnB,MAAM,WAAW,MAAM,KAAK,CAAC,MAAM,SAAS,GAAG,GAChD;AACA,UAAM,MAAM,MAAM,QAAQ,SAAS,EAAE;AACrC,WAAO,EAAE,QAAQ,OAAO,SAAS,IAAI;AAAA,EACvC;AAGA,MACE,MAAM,WAAW,QAAQ,KACxB,MAAM,WAAW,MAAM,KAAK,MAAM,SAAS,MAAM,GAClD;AACA,WAAO,EAAE,QAAQ,OAAO,KAAK,MAAM;AAAA,EACrC;AAGA,MAAI,MAAM,WAAW,SAAS,KAAK,MAAM,WAAW,UAAU,GAAG;AAC/D,WAAO,EAAE,QAAQ,OAAO,KAAK,MAAM;AAAA,EACrC;AAGA,MAAI,MAAM,WAAW,IAAI,KAAK,MAAM,WAAW,KAAK,GAAG;AACrD,WAAO,EAAE,QAAQ,QAAQ,MAAM,MAAM;AAAA,EACvC;AAGA,MAAI,MAAM,WAAW,GAAG,KAAK,MAAM,WAAW,GAAG,GAAG;AAClD,WAAO,EAAE,QAAQ,aAAa,MAAM,MAAM;AAAA,EAC5C;AAGA,SAAO,EAAE,QAAQ,aAAa,MAAM,MAAM;AAC5C;AAKA,eAAe,uBACb,MACA,KACA,MAC8B;AAC9B,QAAM,MAAM,sBAAsB,IAAI;AACtC,QAAM,UAAU,MAAM,aAAa,KAAK,GAAG;AAE3C,MAAI;AACF,UAAM,UAAU,OAAO,KAAK,SAAS,IAAI,IAAI;AAC7C,UAAM,eAAe,oBAAoB,SAAS,kBAAkB;AAEpE,WAAO,qBAAqB,YAAY;AAAA,EAC1C,UAAE;AAEA,QAAI;AACF,aAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IAClD,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAKA,eAAe,oBACb,KACA,KACA,MAC8B;AAC9B,QAAM,UAAU,MAAM,aAAa,KAAK,GAAG;AAE3C,MAAI;AACF,UAAM,UAAU,OAAO,KAAK,SAAS,IAAI,IAAI;AAC7C,UAAM,eAAe,oBAAoB,SAAS,kBAAkB;AAEpE,WAAO,qBAAqB,YAAY;AAAA,EAC1C,UAAE;AACA,QAAI;AACF,aAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IAClD,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAKA,eAAe,oBACb,KACA,SAC8B;AAC9B,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC;AAAA,MACA,QAAQ,YAAY,QAAQ,GAAM;AAAA,IACpC,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,QAAQ,SAAS,MAAM,KAAK,SAAS,UAAU;AAAA,QAC/C;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAM,SAAS,0BAA0B,UAAU,IAAI;AAEvD,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI;AAAA,QACR,qBAAqB,OAAO,MAAM,OAAO;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,WAAO,OAAO;AAAA,EAChB,SAAS,OAAO;AACd,QAAI,iBAAiB,sBAAuB,OAAM;AAElD,UAAM,IAAI;AAAA,MACR,sCAAsC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAC5F;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAKA,eAAe,oBACb,aACA,SAC8B;AAC9B,QAAM,UAAU,KAAK,kBAAkB,GAAG,QAAQ,KAAK,IAAI,EAAE,SAAS,CAAC;AACvE,YAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAEtC,MAAI;AACF,UAAM,UAAU,UAAU,GAAG,WAAW,IAAI,OAAO,KAAK;AACxD,UAAM,SAAS,MAAM,gBAAgB,OAAO;AAAA,MAC1C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,OAAO,SAAS,GAAG;AACrB,YAAM,IAAI;AAAA,QACR,oBAAoB,OAAO,UAAU,OAAO,MAAM;AAAA,QAClD;AAAA,MACF;AAAA,IACF;AAGA,UAAM,cAAc,OAAO,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,IAAI,KAAK;AAC9D,UAAM,cAAc,KAAK,SAAS,WAAW;AAE7C,UAAM,gBAAgB,MAAM,gBAAgB,OAAO;AAAA,MACjD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,cAAc,SAAS,GAAG;AAC5B,YAAM,IAAI;AAAA,QACR,kCAAkC,cAAc,MAAM;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAGA,UAAM,eAAe;AAAA,MACnB,KAAK,SAAS,SAAS;AAAA,MACvB;AAAA,IACF;AACA,WAAO,qBAAqB,YAAY;AAAA,EAC1C,UAAE;AACA,QAAI;AACF,aAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IAClD,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAKA,SAAS,qBAAqB,UAAuC;AACnE,QAAM,eAAe,WAAW,QAAQ,IACpC,WACA,QAAQ,OAAO,GAAG,QAAQ;AAE9B,SAAO,qBAAqB,YAAY;AAC1C;AAKA,SAAS,0BAA0B,SAAsC;AACvE,MAAI,eAAe;AAGnB,MAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,mBAAe,KAAK,QAAQ,GAAG,QAAQ,MAAM,CAAC,CAAC;AAAA,EACjD,WAAW,CAAC,WAAW,OAAO,GAAG;AAC/B,mBAAe,QAAQ,OAAO,GAAG,OAAO;AAAA,EAC1C;AAEA,QAAM,eAAe,oBAAoB,cAAc,kBAAkB;AACzE,SAAO,qBAAqB,YAAY;AAC1C;AAKA,SAAS,oBAAoB,SAAiB,UAA0B;AACtE,QAAM,YAAY,KAAK,SAAS,iBAAiB,QAAQ;AACzD,MAAI,WAAW,SAAS,EAAG,QAAO;AAElC,QAAM,aAAa,KAAK,SAAS,kBAAkB,QAAQ;AAC3D,MAAI,WAAW,UAAU,EAAG,QAAO;AAGnC,SAAO;AACT;AAKA,SAAS,qBAAqB,cAA2C;AACvE,MAAI,CAAC,WAAW,YAAY,GAAG;AAC7B,UAAM,IAAI;AAAA,MACR,qCAAqC,YAAY;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAAU,aAAa,cAAc,OAAO;AAClD,UAAM,OAAO,KAAK,MAAM,OAAO;AAC/B,UAAM,SAAS,0BAA0B,UAAU,IAAI;AAEvD,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI;AAAA,QACR,qBAAqB,OAAO,MAAM,OAAO;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,WAAO,OAAO;AAAA,EAChB,SAAS,OAAO;AACd,QAAI,iBAAiB,sBAAuB,OAAM;AAElD,UAAM,IAAI;AAAA,MACR,4BAA4B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAClF;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAKA,eAAe,aAAa,KAAa,KAA+B;AACtE,QAAM,UAAU,KAAK,kBAAkB,GAAG,QAAQ,KAAK,IAAI,EAAE,SAAS,CAAC;AACvE,YAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAEtC,MAAI;AACF,UAAM,OAAO,CAAC,SAAS,WAAW,GAAG;AAErC,QAAI,KAAK;AACP,WAAK,KAAK,YAAY,GAAG;AAAA,IAC3B;AAEA,SAAK,KAAK,KAAK,OAAO;AAEtB,UAAM,SAAS,MAAM,gBAAgB,OAAO,IAAI;AAEhD,QAAI,OAAO,SAAS,GAAG;AACrB,YAAM,IAAI;AAAA,QACR,qBAAqB,OAAO,UAAU,OAAO,MAAM;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI;AACF,aAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IAClD,QAAQ;AAAA,IAER;AAEA,QAAI,iBAAiB,sBAAuB,OAAM;AAElD,UAAM,IAAI;AAAA,MACR,qBAAqB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAC3E;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAKA,eAAsB,yBACpB,QAC8B;AAC9B,UAAQ,OAAO,QAAQ;AAAA,IACrB,KAAK;AACH,aAAO,uBAAuB,OAAO,MAAM,OAAO,KAAK,OAAO,IAAI;AAAA,IACpE,KAAK;AACH,aAAO,oBAAoB,OAAO,KAAK,OAAO,KAAK,OAAO,IAAI;AAAA,IAChE,KAAK;AACH,aAAO,oBAAoB,OAAO,KAAK,OAAO,OAAO;AAAA,IACvD,KAAK;AACH,aAAO,oBAAoB,OAAO,SAAS,OAAO,OAAO;AAAA,IAC3D,KAAK;AACH,aAAO,qBAAqB,OAAO,IAAI;AAAA,IACzC,KAAK;AACH,aAAO,0BAA0B,OAAO,IAAI;AAAA,IAC9C;AACE,YAAM,IAAI;AAAA,QACR,wBAAyB,OAAe,MAAM;AAAA,QAC9C;AAAA,MACF;AAAA,EACJ;AACF;AAKA,eAAsB,eACpB,OACgC;AAChC,QAAM,SACJ,OAAO,UAAU,WAAW,uBAAuB,KAAK,IAAI;AAE9D,QAAM,WAAW,MAAM,yBAAyB,MAAM;AAGtD,QAAM,WAAW,aAAa;AAC9B,MAAI,SAAS,KAAK,OAAK,EAAE,SAAS,SAAS,IAAI,GAAG;AAChD,UAAM,IAAI;AAAA,MACR,gBAAgB,SAAS,IAAI;AAAA,MAC7B;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,aAAoC;AAAA,IACxC,MAAM,SAAS;AAAA,IACf;AAAA,IACA;AAAA,IACA,aAAa,oBAAI,KAAK;AAAA,IACtB,SAAS;AAAA,EACX;AAEA,WAAS,KAAK,UAAU;AACxB,eAAa,QAAQ;AAErB,SAAO;AACT;AAKO,SAAS,kBAAkB,MAAoB;AACpD,QAAM,WAAW,aAAa;AAC9B,QAAM,WAAW,SAAS,OAAO,OAAK,EAAE,SAAS,IAAI;AAErD,MAAI,SAAS,WAAW,SAAS,QAAQ;AACvC,UAAM,IAAI;AAAA,MACR,gBAAgB,IAAI;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,eAAa,QAAQ;AACvB;AAKA,eAAsB,kBACpB,MACgC;AAChC,QAAM,WAAW,aAAa;AAC9B,QAAM,cAAc,SAAS,KAAK,OAAK,EAAE,SAAS,IAAI;AAEtD,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI;AAAA,MACR,gBAAgB,IAAI;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,yBAAyB,YAAY,MAAM;AAElE,cAAY,WAAW;AACvB,cAAY,cAAc,oBAAI,KAAK;AAEnC,eAAa,QAAQ;AAErB,SAAO;AACT;AAKO,SAAS,mBAA4C;AAC1D,SAAO,aAAa;AACtB;AAKO,SAAS,eACd,MACmC;AACnC,SAAO,aAAa,EAAE,KAAK,OAAK,EAAE,SAAS,IAAI;AACjD;AAKO,SAAS,WACd,YACA,iBACyE;AACzE,QAAM,WAAW,aAAa;AAE9B,MAAI,iBAAiB;AACnB,UAAM,cAAc,SAAS,KAAK,OAAK,EAAE,SAAS,eAAe;AACjE,QAAI,CAAC,YAAa,QAAO;AAEzB,UAAM,SAAS,YAAY,SAAS,QAAQ,KAAK,OAAK,EAAE,SAAS,UAAU;AAC3E,QAAI,CAAC,OAAQ,QAAO;AAEpB,WAAO,EAAE,aAAa,OAAO;AAAA,EAC/B;AAEA,aAAW,eAAe,UAAU;AAClC,QAAI,CAAC,YAAY,QAAS;AAE1B,UAAM,SAAS,YAAY,SAAS,QAAQ,KAAK,OAAK,EAAE,SAAS,UAAU;AAC3E,QAAI,QAAQ;AACV,aAAO,EAAE,aAAa,OAAO;AAAA,IAC/B;AAAA,EACF;AAEA,SAAO;AACT;AAKA,eAAsB,cACpB,YACA,UAII,CAAC,GACY;AACjB,QAAM;AAAA,IACJ,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,IAAI;AAEJ,QAAM,QAAQ,WAAW,YAAY,eAAe;AAEpD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI;AAAA,MACR,kBACI,WAAW,UAAU,+BAA+B,eAAe,MACnE,WAAW,UAAU;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,aAAa,OAAO,IAAI;AAChC,QAAM,aAAa,KAAK,uBAAuB,KAAK,GAAG,OAAO,IAAI;AAGlE,MAAI,WAAW,UAAU,KAAK,CAAC,OAAO;AACpC,UAAM,IAAI;AAAA,MACR,WAAW,UAAU;AAAA,MACrB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,MAAI,WAAW,UAAU,KAAK,OAAO;AACnC,WAAO,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACrD;AAGA,YAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAEzC,MAAI;AAMF,UAAM,YAAY,oBAAoB;AACtC,UAAM,SAA+B;AAAA,MACnC,QAAQ,OAAO;AAAA,MACf,aAAa,YAAY;AAAA,MACzB;AAAA,MACA,WAAW;AAAA,MACX,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,YAAY;AAAA,MACZ,QACE,OAAO,OAAO,WAAW,WACrB,CAAC,OAAO,MAAM,IACd,OAAO,UAAU,CAAC;AAAA,MACxB,UACE,OAAO,OAAO,aAAa,WACvB,CAAC,OAAO,QAAQ,IAChB,OAAO,YAAY,CAAC;AAAA,MAC1B,uBACE,YAAY,OAAO,WAAW,cACzB,YAAY,OAAiD,OAC9D,YAAY;AAAA,IACpB;AAGA,UAAM,WAAW,UAAU;AAAA,MACzB,OAAK,EAAE,EAAE,WAAW,OAAO,QAAQ,EAAE,UAAU;AAAA,IACjD;AACA,aAAS,KAAK,MAAM;AACpB,wBAAoB,QAAQ;AAE5B,WAAO;AAAA,EACT,SAAS,OAAO;AAEd,QAAI;AACF,aAAO,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACrD,QAAQ;AAAA,IAER;AAEA,UAAM,IAAI;AAAA,MACR,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACnF;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,gBACd,YACA,QAAqB,QACf;AACN,QAAM,YAAY,oBAAoB;AACtC,QAAM,SAAS,UAAU;AAAA,IACvB,OAAK,EAAE,WAAW,cAAc,EAAE,UAAU;AAAA,EAC9C;AAEA,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR,WAAW,UAAU,yBAAyB,KAAK;AAAA,MACnD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,MAAI,OAAO,cAAc,WAAW,OAAO,UAAU,GAAG;AACtD,WAAO,OAAO,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EAC5D;AAGA,QAAM,WAAW,UAAU;AAAA,IACzB,OAAK,EAAE,EAAE,WAAW,cAAc,EAAE,UAAU;AAAA,EAChD;AACA,sBAAoB,QAAQ;AAC9B;AAKO,SAAS,aACd,YACA,QAAqB,QACf;AACN,QAAM,YAAY,oBAAoB;AACtC,QAAM,SAAS,UAAU;AAAA,IACvB,OAAK,EAAE,WAAW,cAAc,EAAE,UAAU;AAAA,EAC9C;AAEA,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR,WAAW,UAAU,yBAAyB,KAAK;AAAA,MACnD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,YAAY;AACnB,sBAAoB,SAAS;AAC/B;AAKO,SAAS,cACd,YACA,QAAqB,QACf;AACN,QAAM,YAAY,oBAAoB;AACtC,QAAM,SAAS,UAAU;AAAA,IACvB,OAAK,EAAE,WAAW,cAAc,EAAE,UAAU;AAAA,EAC9C;AAEA,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR,WAAW,UAAU,yBAAyB,KAAK;AAAA,MACnD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,YAAY;AACnB,sBAAoB,SAAS;AAC/B;AAKO,SAAS,qBACd,OACwB;AACxB,QAAM,YAAY,oBAAoB;AAEtC,MAAI,OAAO;AACT,WAAO,UAAU,OAAO,OAAK,EAAE,UAAU,KAAK;AAAA,EAChD;AAEA,SAAO;AACT;AAKO,SAAS,4BAA4B,MAI1C;AACA,QAAM,SAAS,0BAA0B,UAAU,IAAI;AAEvD,MAAI,OAAO,SAAS;AAClB,WAAO,EAAE,SAAS,MAAM,MAAM,OAAO,KAAK;AAAA,EAC5C;AAEA,SAAO,EAAE,SAAS,OAAO,OAAO,OAAO,MAAM,QAAQ;AACvD;AAKO,SAAS,mBAAmB,MAGjC;AACA,QAAM,SAAmB,CAAC;AAE1B,QAAM,eAAe,WAAW,IAAI,IAAI,OAAO,QAAQ,OAAO,GAAG,IAAI;AAErE,MAAI,CAAC,WAAW,YAAY,GAAG;AAC7B,WAAO,KAAK,wBAAwB,YAAY,EAAE;AAClD,WAAO,EAAE,SAAS,OAAO,OAAO;AAAA,EAClC;AAGA,QAAM,gBAAgB,KAAK,cAAc,iBAAiB,aAAa;AACvE,QAAM,iBAAiB,KAAK,cAAc,kBAAkB,aAAa;AACzE,QAAM,eAAe,KAAK,cAAc,aAAa;AAErD,MACE,CAAC,WAAW,aAAa,KACzB,CAAC,WAAW,cAAc,KAC1B,CAAC,WAAW,YAAY,GACxB;AACA,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,OAAO,WAAW,GAAG,OAAO;AAChD;",
|
|
6
6
|
"names": ["MarketplaceErrorCode"]
|
|
7
7
|
}
|
package/dist/services/sentry.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/services/sentry.ts"],
|
|
4
|
-
"sourcesContent": ["
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["/**\n * Sentry stub \u2014 Minto does not use Sentry error tracking.\n * These no-op exports satisfy import sites without adding a dependency.\n */\nexport function initSentry(): void {}\n\nexport async function captureException(_error: unknown): Promise<void> {}\n"],
|
|
5
|
+
"mappings": "AAIO,SAAS,aAAmB;AAAC;AAEpC,eAAsB,iBAAiB,QAAgC;AAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
import { join, resolve } from "path";
|
|
11
11
|
import { homedir } from "os";
|
|
12
12
|
import crypto from "crypto";
|
|
13
|
+
import { debug as debugLogger } from "../utils/debugLogger.js";
|
|
13
14
|
class SessionMemoryManager {
|
|
14
15
|
baseDir;
|
|
15
16
|
projectHash;
|
|
@@ -150,12 +151,20 @@ class SessionMemoryManager {
|
|
|
150
151
|
try {
|
|
151
152
|
const content = readFileSync(metadataPath, "utf-8");
|
|
152
153
|
sessions.push(JSON.parse(content));
|
|
153
|
-
} catch {
|
|
154
|
+
} catch (e) {
|
|
155
|
+
debugLogger.warn(
|
|
156
|
+
"SESSION_MEMORY",
|
|
157
|
+
`Skip invalid session metadata: ${e instanceof Error ? e.message : String(e)}`
|
|
158
|
+
);
|
|
154
159
|
}
|
|
155
160
|
}
|
|
156
161
|
}
|
|
157
162
|
}
|
|
158
|
-
} catch {
|
|
163
|
+
} catch (e) {
|
|
164
|
+
debugLogger.warn(
|
|
165
|
+
"SESSION_MEMORY",
|
|
166
|
+
`Cannot read session directory: ${e instanceof Error ? e.message : String(e)}`
|
|
167
|
+
);
|
|
159
168
|
}
|
|
160
169
|
return sessions.sort((a, b) => b.updatedAt - a.updatedAt);
|
|
161
170
|
}
|
|
@@ -200,7 +209,11 @@ class SessionMemoryManager {
|
|
|
200
209
|
this.deleteDirectory(sessionDir);
|
|
201
210
|
cleaned++;
|
|
202
211
|
}
|
|
203
|
-
} catch {
|
|
212
|
+
} catch (e) {
|
|
213
|
+
debugLogger.warn(
|
|
214
|
+
"SESSION_MEMORY",
|
|
215
|
+
`Failed to clean session: ${e instanceof Error ? e.message : String(e)}`
|
|
216
|
+
);
|
|
204
217
|
}
|
|
205
218
|
}
|
|
206
219
|
return cleaned;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/services/sessionMemory.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Session Memory Service\n *\n * Provides persistent session memory for context compression.\n * Stores compressed contexts, decisions, and session metadata.\n *\n * Storage structure:\n * ~/.minto/projects/\n * <project-hash>/\n * session-<uuid>/\n * session_memory.json # Compressed context\n * conversation.json # Full conversation (optional)\n * decisions.json # Key decisions\n * metadata.json # Session metadata\n */\n\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n readdirSync,\n unlinkSync,\n rmdirSync,\n} from 'fs'\nimport { join, resolve } from 'path'\nimport { homedir } from 'os'\nimport crypto from 'crypto'\nimport type { Message } from '@query'\nimport type {\n ExtractedDecision,\n ExtractedCodeChange,\n} from './intelligentCompactor'\n\n/**\n * Session metadata\n */\nexport interface SessionMetadata {\n sessionId: string\n projectPath: string\n projectHash: string\n createdAt: number\n updatedAt: number\n messageCount: number\n compressedAt?: number\n compressionRatio?: number\n focusArea?: string\n}\n\n/**\n * Session memory data\n */\nexport interface SessionMemoryData {\n summary: string\n decisions: ExtractedDecision[]\n codeChanges: ExtractedCodeChange[]\n toolUsageSummary: Record<string, number>\n focusAreas: string[]\n preservedContext: string[]\n}\n\n/**\n * Full session record\n */\nexport interface SessionRecord {\n metadata: SessionMetadata\n memory: SessionMemoryData\n messages?: Message[]\n}\n\n/**\n * Session Memory Manager\n */\nexport class SessionMemoryManager {\n private baseDir: string\n private projectHash: string\n private sessionId: string\n\n constructor(projectPath: string, sessionId?: string) {\n this.baseDir = join(homedir(), '.minto', 'projects')\n this.projectHash = this.hashPath(projectPath)\n this.sessionId = sessionId || crypto.randomUUID()\n this.ensureDirectories()\n }\n\n /**\n * Get the session ID\n */\n getSessionId(): string {\n return this.sessionId\n }\n\n /**\n * Get the project hash\n */\n getProjectHash(): string {\n return this.projectHash\n }\n\n /**\n * Save session memory\n */\n saveMemory(\n memory: SessionMemoryData,\n metadata?: Partial<SessionMetadata>,\n ): void {\n const sessionDir = this.getSessionDir()\n\n const fullMetadata: SessionMetadata = {\n sessionId: this.sessionId,\n projectPath: '', // Will be set by caller\n projectHash: this.projectHash,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n messageCount: 0,\n ...this.loadMetadata(),\n ...metadata,\n }\n\n // Save memory\n writeFileSync(\n join(sessionDir, 'session_memory.json'),\n JSON.stringify(memory, null, 2),\n )\n\n // Save metadata\n writeFileSync(\n join(sessionDir, 'metadata.json'),\n JSON.stringify(fullMetadata, null, 2),\n )\n\n // Save decisions separately for quick access\n if (memory.decisions.length > 0) {\n writeFileSync(\n join(sessionDir, 'decisions.json'),\n JSON.stringify(memory.decisions, null, 2),\n )\n }\n }\n\n /**\n * Save full conversation (optional, for debugging/recovery)\n */\n saveConversation(messages: Message[]): void {\n const sessionDir = this.getSessionDir()\n writeFileSync(\n join(sessionDir, 'conversation.json'),\n JSON.stringify(messages, null, 2),\n )\n\n // Update metadata\n const metadata = this.loadMetadata()\n if (metadata) {\n metadata.messageCount = messages.length\n metadata.updatedAt = Date.now()\n writeFileSync(\n join(sessionDir, 'metadata.json'),\n JSON.stringify(metadata, null, 2),\n )\n }\n }\n\n /**\n * Load session memory\n */\n loadMemory(): SessionMemoryData | null {\n const memoryPath = join(this.getSessionDir(), 'session_memory.json')\n if (!existsSync(memoryPath)) return null\n\n try {\n const content = readFileSync(memoryPath, 'utf-8')\n return JSON.parse(content) as SessionMemoryData\n } catch {\n return null\n }\n }\n\n /**\n * Load session metadata\n */\n loadMetadata(): SessionMetadata | null {\n const metadataPath = join(this.getSessionDir(), 'metadata.json')\n if (!existsSync(metadataPath)) return null\n\n try {\n const content = readFileSync(metadataPath, 'utf-8')\n return JSON.parse(content) as SessionMetadata\n } catch {\n return null\n }\n }\n\n /**\n * Load conversation history\n */\n loadConversation(): Message[] | null {\n const convoPath = join(this.getSessionDir(), 'conversation.json')\n if (!existsSync(convoPath)) return null\n\n try {\n const content = readFileSync(convoPath, 'utf-8')\n return JSON.parse(content) as Message[]\n } catch {\n return null\n }\n }\n\n /**\n * Load decisions from current or previous session\n */\n loadDecisions(): ExtractedDecision[] {\n const decisionsPath = join(this.getSessionDir(), 'decisions.json')\n if (!existsSync(decisionsPath)) return []\n\n try {\n const content = readFileSync(decisionsPath, 'utf-8')\n return JSON.parse(content) as ExtractedDecision[]\n } catch {\n return []\n }\n }\n\n /**\n * List all sessions for current project\n */\n listSessions(): SessionMetadata[] {\n const projectDir = this.getProjectDir()\n if (!existsSync(projectDir)) return []\n\n const sessions: SessionMetadata[] = []\n\n try {\n const entries = readdirSync(projectDir, { withFileTypes: true })\n for (const entry of entries) {\n if (entry.isDirectory() && entry.name.startsWith('session-')) {\n const metadataPath = join(projectDir, entry.name, 'metadata.json')\n if (existsSync(metadataPath)) {\n try {\n const content = readFileSync(metadataPath, 'utf-8')\n sessions.push(JSON.parse(content) as SessionMetadata)\n } catch {\n
|
|
5
|
-
"mappings": "AAgBA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,MAAM,eAAe;AAC9B,SAAS,eAAe;AACxB,OAAO,YAAY;
|
|
4
|
+
"sourcesContent": ["/**\n * Session Memory Service\n *\n * Provides persistent session memory for context compression.\n * Stores compressed contexts, decisions, and session metadata.\n *\n * Storage structure:\n * ~/.minto/projects/\n * <project-hash>/\n * session-<uuid>/\n * session_memory.json # Compressed context\n * conversation.json # Full conversation (optional)\n * decisions.json # Key decisions\n * metadata.json # Session metadata\n */\n\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n readdirSync,\n unlinkSync,\n rmdirSync,\n} from 'fs'\nimport { join, resolve } from 'path'\nimport { homedir } from 'os'\nimport crypto from 'crypto'\nimport { debug as debugLogger } from '@utils/debugLogger'\nimport type { Message } from '@query'\nimport type {\n ExtractedDecision,\n ExtractedCodeChange,\n} from './intelligentCompactor'\n\n/**\n * Session metadata\n */\nexport interface SessionMetadata {\n sessionId: string\n projectPath: string\n projectHash: string\n createdAt: number\n updatedAt: number\n messageCount: number\n compressedAt?: number\n compressionRatio?: number\n focusArea?: string\n}\n\n/**\n * Session memory data\n */\nexport interface SessionMemoryData {\n summary: string\n decisions: ExtractedDecision[]\n codeChanges: ExtractedCodeChange[]\n toolUsageSummary: Record<string, number>\n focusAreas: string[]\n preservedContext: string[]\n}\n\n/**\n * Full session record\n */\nexport interface SessionRecord {\n metadata: SessionMetadata\n memory: SessionMemoryData\n messages?: Message[]\n}\n\n/**\n * Session Memory Manager\n */\nexport class SessionMemoryManager {\n private baseDir: string\n private projectHash: string\n private sessionId: string\n\n constructor(projectPath: string, sessionId?: string) {\n this.baseDir = join(homedir(), '.minto', 'projects')\n this.projectHash = this.hashPath(projectPath)\n this.sessionId = sessionId || crypto.randomUUID()\n this.ensureDirectories()\n }\n\n /**\n * Get the session ID\n */\n getSessionId(): string {\n return this.sessionId\n }\n\n /**\n * Get the project hash\n */\n getProjectHash(): string {\n return this.projectHash\n }\n\n /**\n * Save session memory\n */\n saveMemory(\n memory: SessionMemoryData,\n metadata?: Partial<SessionMetadata>,\n ): void {\n const sessionDir = this.getSessionDir()\n\n const fullMetadata: SessionMetadata = {\n sessionId: this.sessionId,\n projectPath: '', // Will be set by caller\n projectHash: this.projectHash,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n messageCount: 0,\n ...this.loadMetadata(),\n ...metadata,\n }\n\n // Save memory\n writeFileSync(\n join(sessionDir, 'session_memory.json'),\n JSON.stringify(memory, null, 2),\n )\n\n // Save metadata\n writeFileSync(\n join(sessionDir, 'metadata.json'),\n JSON.stringify(fullMetadata, null, 2),\n )\n\n // Save decisions separately for quick access\n if (memory.decisions.length > 0) {\n writeFileSync(\n join(sessionDir, 'decisions.json'),\n JSON.stringify(memory.decisions, null, 2),\n )\n }\n }\n\n /**\n * Save full conversation (optional, for debugging/recovery)\n */\n saveConversation(messages: Message[]): void {\n const sessionDir = this.getSessionDir()\n writeFileSync(\n join(sessionDir, 'conversation.json'),\n JSON.stringify(messages, null, 2),\n )\n\n // Update metadata\n const metadata = this.loadMetadata()\n if (metadata) {\n metadata.messageCount = messages.length\n metadata.updatedAt = Date.now()\n writeFileSync(\n join(sessionDir, 'metadata.json'),\n JSON.stringify(metadata, null, 2),\n )\n }\n }\n\n /**\n * Load session memory\n */\n loadMemory(): SessionMemoryData | null {\n const memoryPath = join(this.getSessionDir(), 'session_memory.json')\n if (!existsSync(memoryPath)) return null\n\n try {\n const content = readFileSync(memoryPath, 'utf-8')\n return JSON.parse(content) as SessionMemoryData\n } catch {\n return null\n }\n }\n\n /**\n * Load session metadata\n */\n loadMetadata(): SessionMetadata | null {\n const metadataPath = join(this.getSessionDir(), 'metadata.json')\n if (!existsSync(metadataPath)) return null\n\n try {\n const content = readFileSync(metadataPath, 'utf-8')\n return JSON.parse(content) as SessionMetadata\n } catch {\n return null\n }\n }\n\n /**\n * Load conversation history\n */\n loadConversation(): Message[] | null {\n const convoPath = join(this.getSessionDir(), 'conversation.json')\n if (!existsSync(convoPath)) return null\n\n try {\n const content = readFileSync(convoPath, 'utf-8')\n return JSON.parse(content) as Message[]\n } catch {\n return null\n }\n }\n\n /**\n * Load decisions from current or previous session\n */\n loadDecisions(): ExtractedDecision[] {\n const decisionsPath = join(this.getSessionDir(), 'decisions.json')\n if (!existsSync(decisionsPath)) return []\n\n try {\n const content = readFileSync(decisionsPath, 'utf-8')\n return JSON.parse(content) as ExtractedDecision[]\n } catch {\n return []\n }\n }\n\n /**\n * List all sessions for current project\n */\n listSessions(): SessionMetadata[] {\n const projectDir = this.getProjectDir()\n if (!existsSync(projectDir)) return []\n\n const sessions: SessionMetadata[] = []\n\n try {\n const entries = readdirSync(projectDir, { withFileTypes: true })\n for (const entry of entries) {\n if (entry.isDirectory() && entry.name.startsWith('session-')) {\n const metadataPath = join(projectDir, entry.name, 'metadata.json')\n if (existsSync(metadataPath)) {\n try {\n const content = readFileSync(metadataPath, 'utf-8')\n sessions.push(JSON.parse(content) as SessionMetadata)\n } catch (e) {\n debugLogger.warn(\n 'SESSION_MEMORY',\n `Skip invalid session metadata: ${e instanceof Error ? e.message : String(e)}`,\n )\n }\n }\n }\n }\n } catch (e) {\n debugLogger.warn(\n 'SESSION_MEMORY',\n `Cannot read session directory: ${e instanceof Error ? e.message : String(e)}`,\n )\n }\n\n return sessions.sort((a, b) => b.updatedAt - a.updatedAt)\n }\n\n /**\n * Get the most recent session for current project\n */\n getMostRecentSession(): SessionRecord | null {\n const sessions = this.listSessions()\n if (sessions.length === 0) return null\n\n const mostRecent = sessions[0]\n if (!mostRecent) return null\n\n const tempManager = new SessionMemoryManager('', mostRecent.sessionId)\n // Hack to use the same project dir\n Object.assign(tempManager, { projectHash: this.projectHash })\n\n return {\n metadata: mostRecent,\n memory: tempManager.loadMemory() || {\n summary: '',\n decisions: [],\n codeChanges: [],\n toolUsageSummary: {},\n focusAreas: [],\n preservedContext: [],\n },\n messages: tempManager.loadConversation() || undefined,\n }\n }\n\n /**\n * Clean up old sessions (keep only N most recent)\n */\n cleanupOldSessions(keepCount: number = 5): number {\n const sessions = this.listSessions()\n let cleaned = 0\n\n if (sessions.length <= keepCount) return 0\n\n const toDelete = sessions.slice(keepCount)\n for (const session of toDelete) {\n try {\n const sessionDir = join(\n this.getProjectDir(),\n 'session-' + session.sessionId,\n )\n if (existsSync(sessionDir)) {\n // Simple recursive delete using fs\n this.deleteDirectory(sessionDir)\n cleaned++\n }\n } catch (e) {\n debugLogger.warn(\n 'SESSION_MEMORY',\n `Failed to clean session: ${e instanceof Error ? e.message : String(e)}`,\n )\n }\n }\n\n return cleaned\n }\n\n /**\n * Check if a session exists\n */\n sessionExists(): boolean {\n return existsSync(this.getSessionDir())\n }\n\n /**\n * Get session directory path\n */\n private getSessionDir(): string {\n return join(this.getProjectDir(), 'session-' + this.sessionId)\n }\n\n /**\n * Get project directory path\n */\n private getProjectDir(): string {\n return join(this.baseDir, this.projectHash)\n }\n\n /**\n * Ensure required directories exist\n */\n private ensureDirectories(): void {\n const sessionDir = this.getSessionDir()\n if (!existsSync(sessionDir)) {\n mkdirSync(sessionDir, { recursive: true })\n }\n }\n\n /**\n * Hash a path to create a safe directory name\n */\n private hashPath(path: string): string {\n const normalized = resolve(path).toLowerCase()\n return crypto\n .createHash('sha256')\n .update(normalized)\n .digest('hex')\n .slice(0, 16)\n }\n\n /**\n * Recursively delete a directory\n */\n private deleteDirectory(dirPath: string): void {\n if (!existsSync(dirPath)) return\n\n const entries = readdirSync(dirPath, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = join(dirPath, entry.name)\n if (entry.isDirectory()) {\n this.deleteDirectory(fullPath)\n } else {\n unlinkSync(fullPath)\n }\n }\n rmdirSync(dirPath)\n }\n}\n\n/**\n * Create a session memory manager for the current project\n */\nexport function createSessionMemory(\n projectPath: string,\n sessionId?: string,\n): SessionMemoryManager {\n return new SessionMemoryManager(projectPath, sessionId)\n}\n"],
|
|
5
|
+
"mappings": "AAgBA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,MAAM,eAAe;AAC9B,SAAS,eAAe;AACxB,OAAO,YAAY;AACnB,SAAS,SAAS,mBAAmB;AA8C9B,MAAM,qBAAqB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,aAAqB,WAAoB;AACnD,SAAK,UAAU,KAAK,QAAQ,GAAG,UAAU,UAAU;AACnD,SAAK,cAAc,KAAK,SAAS,WAAW;AAC5C,SAAK,YAAY,aAAa,OAAO,WAAW;AAChD,SAAK,kBAAkB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAuB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WACE,QACA,UACM;AACN,UAAM,aAAa,KAAK,cAAc;AAEtC,UAAM,eAAgC;AAAA,MACpC,WAAW,KAAK;AAAA,MAChB,aAAa;AAAA;AAAA,MACb,aAAa,KAAK;AAAA,MAClB,WAAW,KAAK,IAAI;AAAA,MACpB,WAAW,KAAK,IAAI;AAAA,MACpB,cAAc;AAAA,MACd,GAAG,KAAK,aAAa;AAAA,MACrB,GAAG;AAAA,IACL;AAGA;AAAA,MACE,KAAK,YAAY,qBAAqB;AAAA,MACtC,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,IAChC;AAGA;AAAA,MACE,KAAK,YAAY,eAAe;AAAA,MAChC,KAAK,UAAU,cAAc,MAAM,CAAC;AAAA,IACtC;AAGA,QAAI,OAAO,UAAU,SAAS,GAAG;AAC/B;AAAA,QACE,KAAK,YAAY,gBAAgB;AAAA,QACjC,KAAK,UAAU,OAAO,WAAW,MAAM,CAAC;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,UAA2B;AAC1C,UAAM,aAAa,KAAK,cAAc;AACtC;AAAA,MACE,KAAK,YAAY,mBAAmB;AAAA,MACpC,KAAK,UAAU,UAAU,MAAM,CAAC;AAAA,IAClC;AAGA,UAAM,WAAW,KAAK,aAAa;AACnC,QAAI,UAAU;AACZ,eAAS,eAAe,SAAS;AACjC,eAAS,YAAY,KAAK,IAAI;AAC9B;AAAA,QACE,KAAK,YAAY,eAAe;AAAA,QAChC,KAAK,UAAU,UAAU,MAAM,CAAC;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAuC;AACrC,UAAM,aAAa,KAAK,KAAK,cAAc,GAAG,qBAAqB;AACnE,QAAI,CAAC,WAAW,UAAU,EAAG,QAAO;AAEpC,QAAI;AACF,YAAM,UAAU,aAAa,YAAY,OAAO;AAChD,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAuC;AACrC,UAAM,eAAe,KAAK,KAAK,cAAc,GAAG,eAAe;AAC/D,QAAI,CAAC,WAAW,YAAY,EAAG,QAAO;AAEtC,QAAI;AACF,YAAM,UAAU,aAAa,cAAc,OAAO;AAClD,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAqC;AACnC,UAAM,YAAY,KAAK,KAAK,cAAc,GAAG,mBAAmB;AAChE,QAAI,CAAC,WAAW,SAAS,EAAG,QAAO;AAEnC,QAAI;AACF,YAAM,UAAU,aAAa,WAAW,OAAO;AAC/C,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAqC;AACnC,UAAM,gBAAgB,KAAK,KAAK,cAAc,GAAG,gBAAgB;AACjE,QAAI,CAAC,WAAW,aAAa,EAAG,QAAO,CAAC;AAExC,QAAI;AACF,YAAM,UAAU,aAAa,eAAe,OAAO;AACnD,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAkC;AAChC,UAAM,aAAa,KAAK,cAAc;AACtC,QAAI,CAAC,WAAW,UAAU,EAAG,QAAO,CAAC;AAErC,UAAM,WAA8B,CAAC;AAErC,QAAI;AACF,YAAM,UAAU,YAAY,YAAY,EAAE,eAAe,KAAK,CAAC;AAC/D,iBAAW,SAAS,SAAS;AAC3B,YAAI,MAAM,YAAY,KAAK,MAAM,KAAK,WAAW,UAAU,GAAG;AAC5D,gBAAM,eAAe,KAAK,YAAY,MAAM,MAAM,eAAe;AACjE,cAAI,WAAW,YAAY,GAAG;AAC5B,gBAAI;AACF,oBAAM,UAAU,aAAa,cAAc,OAAO;AAClD,uBAAS,KAAK,KAAK,MAAM,OAAO,CAAoB;AAAA,YACtD,SAAS,GAAG;AACV,0BAAY;AAAA,gBACV;AAAA,gBACA,kCAAkC,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,cAC9E;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,GAAG;AACV,kBAAY;AAAA,QACV;AAAA,QACA,kCAAkC,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,MAC9E;AAAA,IACF;AAEA,WAAO,SAAS,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,uBAA6C;AAC3C,UAAM,WAAW,KAAK,aAAa;AACnC,QAAI,SAAS,WAAW,EAAG,QAAO;AAElC,UAAM,aAAa,SAAS,CAAC;AAC7B,QAAI,CAAC,WAAY,QAAO;AAExB,UAAM,cAAc,IAAI,qBAAqB,IAAI,WAAW,SAAS;AAErE,WAAO,OAAO,aAAa,EAAE,aAAa,KAAK,YAAY,CAAC;AAE5D,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,YAAY,WAAW,KAAK;AAAA,QAClC,SAAS;AAAA,QACT,WAAW,CAAC;AAAA,QACZ,aAAa,CAAC;AAAA,QACd,kBAAkB,CAAC;AAAA,QACnB,YAAY,CAAC;AAAA,QACb,kBAAkB,CAAC;AAAA,MACrB;AAAA,MACA,UAAU,YAAY,iBAAiB,KAAK;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,YAAoB,GAAW;AAChD,UAAM,WAAW,KAAK,aAAa;AACnC,QAAI,UAAU;AAEd,QAAI,SAAS,UAAU,UAAW,QAAO;AAEzC,UAAM,WAAW,SAAS,MAAM,SAAS;AACzC,eAAW,WAAW,UAAU;AAC9B,UAAI;AACF,cAAM,aAAa;AAAA,UACjB,KAAK,cAAc;AAAA,UACnB,aAAa,QAAQ;AAAA,QACvB;AACA,YAAI,WAAW,UAAU,GAAG;AAE1B,eAAK,gBAAgB,UAAU;AAC/B;AAAA,QACF;AAAA,MACF,SAAS,GAAG;AACV,oBAAY;AAAA,UACV;AAAA,UACA,4BAA4B,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,QACxE;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAyB;AACvB,WAAO,WAAW,KAAK,cAAc,CAAC;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAwB;AAC9B,WAAO,KAAK,KAAK,cAAc,GAAG,aAAa,KAAK,SAAS;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAwB;AAC9B,WAAO,KAAK,KAAK,SAAS,KAAK,WAAW;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAA0B;AAChC,UAAM,aAAa,KAAK,cAAc;AACtC,QAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,gBAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,MAAsB;AACrC,UAAM,aAAa,QAAQ,IAAI,EAAE,YAAY;AAC7C,WAAO,OACJ,WAAW,QAAQ,EACnB,OAAO,UAAU,EACjB,OAAO,KAAK,EACZ,MAAM,GAAG,EAAE;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,SAAuB;AAC7C,QAAI,CAAC,WAAW,OAAO,EAAG;AAE1B,UAAM,UAAU,YAAY,SAAS,EAAE,eAAe,KAAK,CAAC;AAC5D,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAW,KAAK,SAAS,MAAM,IAAI;AACzC,UAAI,MAAM,YAAY,GAAG;AACvB,aAAK,gBAAgB,QAAQ;AAAA,MAC/B,OAAO;AACL,mBAAW,QAAQ;AAAA,MACrB;AAAA,IACF;AACA,cAAU,OAAO;AAAA,EACnB;AACF;AAKO,SAAS,oBACd,aACA,WACsB;AACtB,SAAO,IAAI,qBAAqB,aAAa,SAAS;AACxD;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|