@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
package/dist/commands/ctx_viz.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getToolDescriptionAsync } from "../Tool.js";
|
|
2
2
|
import Table from "cli-table3";
|
|
3
|
-
import { getSystemPrompt } from "../constants/prompts.js";
|
|
3
|
+
import { getSystemPrompt } from "../constants/prompts/index.js";
|
|
4
4
|
import { getContext } from "../context.js";
|
|
5
5
|
import { zodToJsonSchema } from "zod-to-json-schema";
|
|
6
6
|
import { getMessagesGetter } from "../messages.js";
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import React, { useMemo, useCallback } from "react";
|
|
2
|
+
import { SimpleSelector } from "../components/SimpleSelector/index.js";
|
|
3
|
+
import { getModelManager, reloadModelManager } from "../utils/model.js";
|
|
4
|
+
const EFFORT_CONFIG = {
|
|
5
|
+
low: {
|
|
6
|
+
reasoningEffort: "low",
|
|
7
|
+
maxThinkingTokens: 0,
|
|
8
|
+
description: "Fast responses, minimal reasoning"
|
|
9
|
+
},
|
|
10
|
+
medium: {
|
|
11
|
+
reasoningEffort: "medium",
|
|
12
|
+
maxThinkingTokens: 4e3,
|
|
13
|
+
description: "Balanced speed and depth"
|
|
14
|
+
},
|
|
15
|
+
high: {
|
|
16
|
+
reasoningEffort: "high",
|
|
17
|
+
maxThinkingTokens: 1e4,
|
|
18
|
+
description: "Deep reasoning for complex tasks"
|
|
19
|
+
},
|
|
20
|
+
max: {
|
|
21
|
+
reasoningEffort: "high",
|
|
22
|
+
maxThinkingTokens: 32767,
|
|
23
|
+
description: "Maximum reasoning depth"
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
function EffortSelector({
|
|
27
|
+
onClose
|
|
28
|
+
}) {
|
|
29
|
+
const items = useMemo(() => {
|
|
30
|
+
const modelManager = getModelManager();
|
|
31
|
+
const mainModel = modelManager.getModel("main");
|
|
32
|
+
const currentEffort = mainModel?.reasoningEffort || "medium";
|
|
33
|
+
return Object.entries(EFFORT_CONFIG).map(([level, config]) => ({
|
|
34
|
+
id: level,
|
|
35
|
+
label: level.charAt(0).toUpperCase() + level.slice(1),
|
|
36
|
+
description: config.description,
|
|
37
|
+
isCurrent: level === currentEffort || level === "medium" && !currentEffort
|
|
38
|
+
}));
|
|
39
|
+
}, []);
|
|
40
|
+
const handleSelect = useCallback(
|
|
41
|
+
(item) => {
|
|
42
|
+
const level = item.id;
|
|
43
|
+
const config = EFFORT_CONFIG[level];
|
|
44
|
+
try {
|
|
45
|
+
const modelManager = getModelManager();
|
|
46
|
+
const mainModelName = modelManager.getModelName("main");
|
|
47
|
+
if (mainModelName) {
|
|
48
|
+
modelManager.updateModel(mainModelName, {
|
|
49
|
+
reasoningEffort: config.reasoningEffort
|
|
50
|
+
});
|
|
51
|
+
reloadModelManager();
|
|
52
|
+
}
|
|
53
|
+
} catch {
|
|
54
|
+
}
|
|
55
|
+
onClose(`Reasoning effort set to ${level} (${config.description})`);
|
|
56
|
+
},
|
|
57
|
+
[onClose]
|
|
58
|
+
);
|
|
59
|
+
return /* @__PURE__ */ React.createElement(
|
|
60
|
+
SimpleSelector,
|
|
61
|
+
{
|
|
62
|
+
title: "Reasoning Effort",
|
|
63
|
+
items,
|
|
64
|
+
onSelect: handleSelect,
|
|
65
|
+
onClose: () => onClose()
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
const effort = {
|
|
70
|
+
name: "effort",
|
|
71
|
+
description: "Set reasoning effort level",
|
|
72
|
+
isEnabled: true,
|
|
73
|
+
isHidden: false,
|
|
74
|
+
hidePromptInput: true,
|
|
75
|
+
type: "local-jsx",
|
|
76
|
+
userFacingName() {
|
|
77
|
+
return "effort";
|
|
78
|
+
},
|
|
79
|
+
async call(onDone) {
|
|
80
|
+
return /* @__PURE__ */ React.createElement(EffortSelector, { onClose: onDone });
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
var effort_default = effort;
|
|
84
|
+
export {
|
|
85
|
+
effort_default as default
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=effort.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/commands/effort.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * /effort command\n *\n * Interactive reasoning depth selector.\n * Maps effort levels to reasoningEffort + maxThinkingTokens.\n */\n\nimport React, { useMemo, useCallback } from 'react'\nimport { SimpleSelector } from '@components/SimpleSelector'\nimport type { SelectorItem } from '@components/SimpleSelector'\nimport { getModelManager, reloadModelManager } from '@utils/model'\nimport type { Command } from '../commands'\n\ntype EffortLevel = 'low' | 'medium' | 'high' | 'max'\n\nconst EFFORT_CONFIG: Record<\n EffortLevel,\n {\n reasoningEffort: 'low' | 'medium' | 'high'\n maxThinkingTokens: number\n description: string\n }\n> = {\n low: {\n reasoningEffort: 'low',\n maxThinkingTokens: 0,\n description: 'Fast responses, minimal reasoning',\n },\n medium: {\n reasoningEffort: 'medium',\n maxThinkingTokens: 4000,\n description: 'Balanced speed and depth',\n },\n high: {\n reasoningEffort: 'high',\n maxThinkingTokens: 10000,\n description: 'Deep reasoning for complex tasks',\n },\n max: {\n reasoningEffort: 'high',\n maxThinkingTokens: 32767,\n description: 'Maximum reasoning depth',\n },\n}\n\nfunction EffortSelector({\n onClose,\n}: {\n onClose: (result?: string) => void\n}): React.ReactNode {\n const items = useMemo((): SelectorItem[] => {\n const modelManager = getModelManager()\n const mainModel = modelManager.getModel('main')\n const currentEffort = mainModel?.reasoningEffort || 'medium'\n\n return (\n Object.entries(EFFORT_CONFIG) as [\n EffortLevel,\n (typeof EFFORT_CONFIG)[EffortLevel],\n ][]\n ).map(([level, config]) => ({\n id: level,\n label: level.charAt(0).toUpperCase() + level.slice(1),\n description: config.description,\n isCurrent:\n level === currentEffort || (level === 'medium' && !currentEffort),\n }))\n }, [])\n\n const handleSelect = useCallback(\n (item: SelectorItem) => {\n const level = item.id as EffortLevel\n const config = EFFORT_CONFIG[level]\n\n try {\n const modelManager = getModelManager()\n const mainModelName = modelManager.getModelName('main')\n\n if (mainModelName) {\n modelManager.updateModel(mainModelName, {\n reasoningEffort: config.reasoningEffort,\n })\n reloadModelManager()\n }\n } catch {\n // Model update not available\n }\n\n onClose(`Reasoning effort set to ${level} (${config.description})`)\n },\n [onClose],\n )\n\n return (\n <SimpleSelector\n title=\"Reasoning Effort\"\n items={items}\n onSelect={handleSelect}\n onClose={() => onClose()}\n />\n )\n}\n\nconst effort: Command = {\n name: 'effort',\n description: 'Set reasoning effort level',\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n type: 'local-jsx',\n userFacingName() {\n return 'effort'\n },\n async call(onDone) {\n return <EffortSelector onClose={onDone} />\n },\n}\n\nexport default effort\n"],
|
|
5
|
+
"mappings": "AAOA,OAAO,SAAS,SAAS,mBAAmB;AAC5C,SAAS,sBAAsB;AAE/B,SAAS,iBAAiB,0BAA0B;AAKpD,MAAM,gBAOF;AAAA,EACF,KAAK;AAAA,IACH,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,IACnB,aAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,IACnB,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,IACnB,aAAa;AAAA,EACf;AAAA,EACA,KAAK;AAAA,IACH,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,IACnB,aAAa;AAAA,EACf;AACF;AAEA,SAAS,eAAe;AAAA,EACtB;AACF,GAEoB;AAClB,QAAM,QAAQ,QAAQ,MAAsB;AAC1C,UAAM,eAAe,gBAAgB;AACrC,UAAM,YAAY,aAAa,SAAS,MAAM;AAC9C,UAAM,gBAAgB,WAAW,mBAAmB;AAEpD,WACE,OAAO,QAAQ,aAAa,EAI5B,IAAI,CAAC,CAAC,OAAO,MAAM,OAAO;AAAA,MAC1B,IAAI;AAAA,MACJ,OAAO,MAAM,OAAO,CAAC,EAAE,YAAY,IAAI,MAAM,MAAM,CAAC;AAAA,MACpD,aAAa,OAAO;AAAA,MACpB,WACE,UAAU,iBAAkB,UAAU,YAAY,CAAC;AAAA,IACvD,EAAE;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe;AAAA,IACnB,CAAC,SAAuB;AACtB,YAAM,QAAQ,KAAK;AACnB,YAAM,SAAS,cAAc,KAAK;AAElC,UAAI;AACF,cAAM,eAAe,gBAAgB;AACrC,cAAM,gBAAgB,aAAa,aAAa,MAAM;AAEtD,YAAI,eAAe;AACjB,uBAAa,YAAY,eAAe;AAAA,YACtC,iBAAiB,OAAO;AAAA,UAC1B,CAAC;AACD,6BAAmB;AAAA,QACrB;AAAA,MACF,QAAQ;AAAA,MAER;AAEA,cAAQ,2BAA2B,KAAK,KAAK,OAAO,WAAW,GAAG;AAAA,IACpE;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN;AAAA,MACA,UAAU;AAAA,MACV,SAAS,MAAM,QAAQ;AAAA;AAAA,EACzB;AAEJ;AAEA,MAAM,SAAkB;AAAA,EACtB,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,KAAK,QAAQ;AACjB,WAAO,oCAAC,kBAAe,SAAS,QAAQ;AAAA,EAC1C;AACF;AAEA,IAAO,iBAAQ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/commands/export.js
CHANGED
|
@@ -5,7 +5,7 @@ import { join } from "path";
|
|
|
5
5
|
import { homedir } from "os";
|
|
6
6
|
import { getMessagesGetter } from "../messages.js";
|
|
7
7
|
import { getCwd } from "../utils/state.js";
|
|
8
|
-
import {
|
|
8
|
+
import { getGlobalConfig, getCurrentProjectConfig } from "../utils/config.js";
|
|
9
9
|
import { t } from "../i18n/index.js";
|
|
10
10
|
import { listMarketplaces } from "../utils/marketplaceManager.js";
|
|
11
11
|
import { loadAllPlugins } from "../utils/pluginLoader.js";
|
|
@@ -312,6 +312,16 @@ function getMarketplaceUrls() {
|
|
|
312
312
|
}
|
|
313
313
|
return urls;
|
|
314
314
|
}
|
|
315
|
+
const PROXY_ENV_KEYS = /* @__PURE__ */ new Set([
|
|
316
|
+
"no_proxy",
|
|
317
|
+
"NO_PROXY",
|
|
318
|
+
"http_proxy",
|
|
319
|
+
"HTTP_PROXY",
|
|
320
|
+
"https_proxy",
|
|
321
|
+
"HTTPS_PROXY",
|
|
322
|
+
"ALL_PROXY",
|
|
323
|
+
"all_proxy"
|
|
324
|
+
]);
|
|
315
325
|
function buildMcpServersConfig(mcpServers, usePlaceholders) {
|
|
316
326
|
const result = {};
|
|
317
327
|
for (const [name, server] of Object.entries(mcpServers)) {
|
|
@@ -324,7 +334,8 @@ function buildMcpServersConfig(mcpServers, usePlaceholders) {
|
|
|
324
334
|
} else {
|
|
325
335
|
const env = server.env ? usePlaceholders ? Object.fromEntries(
|
|
326
336
|
Object.entries(server.env).map(([key, value]) => {
|
|
327
|
-
const
|
|
337
|
+
const isProxyKey = PROXY_ENV_KEYS.has(key);
|
|
338
|
+
const isSecret = !isProxyKey && (key.toLowerCase().includes("key") || key.toLowerCase().includes("secret") || key.toLowerCase().includes("token") || key.toLowerCase().includes("password"));
|
|
328
339
|
return [key, isSecret ? `\${${key}}` : value];
|
|
329
340
|
})
|
|
330
341
|
) : server.env : void 0;
|
|
@@ -341,8 +352,8 @@ function buildMcpServersConfig(mcpServers, usePlaceholders) {
|
|
|
341
352
|
}
|
|
342
353
|
async function buildTeamConfig(scope, usePlaceholders) {
|
|
343
354
|
const cwd = getCwd();
|
|
344
|
-
const globalConfig =
|
|
345
|
-
const projectConfig =
|
|
355
|
+
const globalConfig = getGlobalConfig();
|
|
356
|
+
const projectConfig = getCurrentProjectConfig();
|
|
346
357
|
const scopeLabel = scope === "user" ? "User Configuration" : scope === "project" ? `Project: ${cwd.split("/").pop()}` : `All: ${cwd.split("/").pop()}`;
|
|
347
358
|
const config = {
|
|
348
359
|
version: "1.0",
|
|
@@ -465,23 +476,22 @@ async function buildTeamConfig(scope, usePlaceholders) {
|
|
|
465
476
|
return config;
|
|
466
477
|
}
|
|
467
478
|
async function exportRuntimeConfig(scope) {
|
|
468
|
-
const cwd = getCwd();
|
|
469
479
|
const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
|
|
470
480
|
if (scope === "user") {
|
|
471
|
-
const globalConfig =
|
|
481
|
+
const globalConfig = getGlobalConfig();
|
|
472
482
|
return {
|
|
473
483
|
content: JSON.stringify({ global: globalConfig }, null, 2),
|
|
474
484
|
filename: `minto-config-user-${timestamp}.json`
|
|
475
485
|
};
|
|
476
486
|
} else if (scope === "project") {
|
|
477
|
-
const projectConfig =
|
|
487
|
+
const projectConfig = getCurrentProjectConfig();
|
|
478
488
|
return {
|
|
479
489
|
content: JSON.stringify({ project: projectConfig }, null, 2),
|
|
480
490
|
filename: `minto-config-project-${timestamp}.json`
|
|
481
491
|
};
|
|
482
492
|
} else {
|
|
483
|
-
const globalConfig =
|
|
484
|
-
const projectConfig =
|
|
493
|
+
const globalConfig = getGlobalConfig();
|
|
494
|
+
const projectConfig = getCurrentProjectConfig();
|
|
485
495
|
return {
|
|
486
496
|
content: JSON.stringify(
|
|
487
497
|
{ global: globalConfig, project: projectConfig },
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/export.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * Export Command\n *\n * Export configuration, team templates, or conversation data.\n * Uses TabbedListView with flat tab-based selection for consistent UX.\n *\n * Supports three scopes:\n * - user: ~/.minto/ config only\n * - project: ./.minto/ config only\n * - all: both user and project config combined\n */\n\nimport React, { useState, useCallback, useMemo } from 'react'\nimport { writeFile, readFile } from 'fs/promises'\nimport { existsSync, readdirSync } from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport type { Command } from '@commands'\nimport { getMessagesGetter } from '@messages'\nimport { getCwd } from '@utils/state'\nimport { loadGlobalConfig, loadProjectConfig } from '../core/config'\nimport { t } from '@i18n'\nimport { listMarketplaces } from '@utils/marketplaceManager'\nimport { loadAllPlugins } from '@utils/pluginLoader'\nimport { loadAllSkills } from '@utils/skillLoader'\nimport { loadCustomCommands } from '@services/customCommands'\nimport { TabbedListView } from '@components/TabbedListView/TabbedListView'\nimport type {\n ListItem,\n TabDefinition,\n StatusOverlay,\n} from '@components/TabbedListView/types'\nimport type {\n TeamConfig,\n TeamConfigScope,\n TeamAgentConfig,\n TeamHooksConfig,\n TeamSkillConfig,\n TeamCommandConfig,\n} from '@utils/teamConfig'\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype ExportCategory = 'runtime' | 'team' | 'conversation' | 'summary'\ntype SensitiveHandling = 'include' | 'placeholder'\n\ninterface ExportItemData {\n category: ExportCategory\n scope: TeamConfigScope\n sensitive: SensitiveHandling\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Generate a markdown summary of the conversation\n */\nfunction generateSummary(messages: unknown[]): string {\n const lines: string[] = [\n '# Minto Session Summary',\n '',\n `Generated: ${new Date().toISOString()}`,\n '',\n '## Conversation Overview',\n '',\n `Total messages: ${messages.length}`,\n '',\n '## Message Summary',\n '',\n ]\n\n for (const msg of messages) {\n const m = msg as { role?: string; content?: unknown }\n if (!m.role) continue\n\n const role = m.role === 'user' ? '\uD83D\uDC64 User' : '\uD83E\uDD16 Assistant'\n\n if (typeof m.content === 'string') {\n const preview = m.content.slice(0, 200).replace(/\\n/g, ' ')\n lines.push(`### ${role}`)\n lines.push('')\n lines.push(`> ${preview}${m.content.length > 200 ? '...' : ''}`)\n lines.push('')\n } else if (Array.isArray(m.content)) {\n lines.push(`### ${role}`)\n lines.push('')\n for (const block of m.content) {\n if (block.type === 'text') {\n const preview = String(block.text || '')\n .slice(0, 200)\n .replace(/\\n/g, ' ')\n lines.push(\n `> ${preview}${String(block.text || '').length > 200 ? '...' : ''}`,\n )\n } else if (block.type === 'tool_use') {\n lines.push(`- Tool: \\`${block.name}\\``)\n } else if (block.type === 'tool_result') {\n lines.push(`- Tool result received`)\n }\n }\n lines.push('')\n }\n }\n\n return lines.join('\\n')\n}\n\n/**\n * Parse a hooks.json file into TeamHooksConfig\n */\nfunction parseHooksFile(content: string): TeamHooksConfig | null {\n try {\n const parsed = JSON.parse(content)\n\n if (!parsed.hooks) {\n return null\n }\n\n const result: TeamHooksConfig = {}\n\n if (parsed.hooks.SessionStart) {\n result.sessionStart = parsed.hooks.SessionStart.flatMap(\n (m: { hooks?: unknown[] }) => m.hooks || [],\n )\n }\n if (parsed.hooks.SessionEnd) {\n result.sessionEnd = parsed.hooks.SessionEnd.flatMap(\n (m: { hooks?: unknown[] }) => m.hooks || [],\n )\n }\n if (parsed.hooks.UserPromptSubmit) {\n result.userPromptSubmit = parsed.hooks.UserPromptSubmit.flatMap(\n (m: { hooks?: unknown[] }) => m.hooks || [],\n )\n }\n if (parsed.hooks.PreToolUse) {\n result.preToolUse = parsed.hooks.PreToolUse\n }\n if (parsed.hooks.PostToolUse) {\n result.postToolUse = parsed.hooks.PostToolUse\n }\n\n return result\n } catch {\n return null\n }\n}\n\n/**\n * Load hooks configuration by scope\n */\nasync function loadHooksConfigByScope(scope: TeamConfigScope): Promise<{\n userHooks: TeamHooksConfig | null\n projectHooks: TeamHooksConfig | null\n}> {\n let userHooks: TeamHooksConfig | null = null\n let projectHooks: TeamHooksConfig | null = null\n\n if (scope === 'user' || scope === 'all') {\n const mintoPath = join(homedir(), '.minto', 'hooks.json')\n const claudePath = join(homedir(), '.claude', 'hooks.json')\n const hooksPath = existsSync(mintoPath)\n ? mintoPath\n : existsSync(claudePath)\n ? claudePath\n : null\n\n if (hooksPath) {\n try {\n const content = await readFile(hooksPath, 'utf-8')\n userHooks = parseHooksFile(content)\n } catch {\n // ignore\n }\n }\n }\n\n if (scope === 'project' || scope === 'all') {\n const cwd = getCwd()\n const mintoPath = join(cwd, '.minto', 'hooks.json')\n const claudePath = join(cwd, '.claude', 'hooks.json')\n const hooksPath = existsSync(mintoPath)\n ? mintoPath\n : existsSync(claudePath)\n ? claudePath\n : null\n\n if (hooksPath) {\n try {\n const content = await readFile(hooksPath, 'utf-8')\n projectHooks = parseHooksFile(content)\n } catch {\n // ignore\n }\n }\n }\n\n return { userHooks, projectHooks }\n}\n\n/**\n * Parse an agent markdown file into TeamAgentConfig\n */\nfunction parseAgentFile(content: string): TeamAgentConfig | null {\n const frontmatterMatch = content.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/)\n\n if (!frontmatterMatch) return null\n\n const frontmatter = frontmatterMatch[1]\n const body = frontmatterMatch[2].trim()\n\n const nameMatch = frontmatter.match(/^name:\\s*(.+)$/m)\n const descMatch = frontmatter.match(/^description:\\s*\"?([^\"\\n]+)\"?$/m)\n const toolsMatch = frontmatter.match(/^tools:\\s*(.+)$/m)\n const modelMatch = frontmatter.match(/^model_name:\\s*(.+)$/m)\n const colorMatch = frontmatter.match(/^color:\\s*\"?([^\"\\n]+)\"?$/m)\n\n if (!nameMatch || !descMatch) return null\n\n let tools: string[] | '*' = '*'\n if (toolsMatch) {\n const toolsValue = toolsMatch[1].trim()\n if (toolsValue === '*') {\n tools = '*'\n } else {\n try {\n tools = JSON.parse(toolsValue)\n } catch {\n tools = '*'\n }\n }\n }\n\n return {\n name: nameMatch[1].trim(),\n description: descMatch[1].trim(),\n tools,\n systemPrompt: body,\n model: modelMatch ? modelMatch[1].trim() : undefined,\n color: colorMatch ? colorMatch[1].trim() : undefined,\n }\n}\n\n/**\n * Scan a directory for agent .md files and parse them\n */\nasync function scanAgentsDir(\n agentsDir: string,\n): Promise<Map<string, TeamAgentConfig>> {\n const agentMap = new Map<string, TeamAgentConfig>()\n\n if (!existsSync(agentsDir)) return agentMap\n\n try {\n const files = readdirSync(agentsDir)\n\n for (const file of files) {\n if (!file.endsWith('.md')) continue\n\n const filePath = join(agentsDir, file)\n const content = await readFile(filePath, 'utf-8')\n const agent = parseAgentFile(content)\n if (agent) {\n agentMap.set(agent.name, agent)\n }\n }\n } catch {\n // Ignore errors\n }\n\n return agentMap\n}\n\n/**\n * Load agents by scope\n * .minto agents take precedence over .claude agents with the same name\n */\nasync function loadAgentsConfigByScope(scope: TeamConfigScope): Promise<{\n userAgents: TeamAgentConfig[]\n projectAgents: TeamAgentConfig[]\n}> {\n const userAgentMap = new Map<string, TeamAgentConfig>()\n const projectAgentMap = new Map<string, TeamAgentConfig>()\n\n if (scope === 'user' || scope === 'all') {\n // .claude first, then .minto overrides\n const claudeAgents = await scanAgentsDir(\n join(homedir(), '.claude', 'agents'),\n )\n const mintoAgents = await scanAgentsDir(join(homedir(), '.minto', 'agents'))\n\n for (const [name, agent] of claudeAgents) {\n userAgentMap.set(name, agent)\n }\n for (const [name, agent] of mintoAgents) {\n userAgentMap.set(name, agent)\n }\n }\n\n if (scope === 'project' || scope === 'all') {\n const cwd = getCwd()\n const claudeAgents = await scanAgentsDir(join(cwd, '.claude', 'agents'))\n const mintoAgents = await scanAgentsDir(join(cwd, '.minto', 'agents'))\n\n for (const [name, agent] of claudeAgents) {\n projectAgentMap.set(name, agent)\n }\n for (const [name, agent] of mintoAgents) {\n projectAgentMap.set(name, agent)\n }\n }\n\n return {\n userAgents: Array.from(userAgentMap.values()),\n projectAgents: Array.from(projectAgentMap.values()),\n }\n}\n\n/**\n * Determine plugin scope from its location path\n */\nfunction getPluginScope(location: string): 'user' | 'project' {\n const cwd = getCwd()\n if (\n location.startsWith(join(cwd, '.minto')) ||\n location.startsWith(join(cwd, '.claude'))\n ) {\n return 'project'\n }\n return 'user'\n}\n\n/**\n * Get installed plugin source strings by scope using loadAllPlugins()\n */\nasync function getInstalledPluginSourcesByScope(\n scope: TeamConfigScope,\n): Promise<{ userPlugins: string[]; projectPlugins: string[] }> {\n const plugins = loadAllPlugins()\n const userPlugins: string[] = []\n const projectPlugins: string[] = []\n\n for (const plugin of plugins) {\n const pluginScope = getPluginScope(plugin.location)\n\n // Skip plugins not in the requested scope\n if (scope === 'user' && pluginScope !== 'user') continue\n if (scope === 'project' && pluginScope !== 'project') continue\n\n // Build plugin source string from metadata\n const metaPath = join(plugin.location, '.marketplace-meta.json')\n let pluginName: string\n if (existsSync(metaPath)) {\n try {\n const content = await readFile(metaPath, 'utf-8')\n const meta = JSON.parse(content)\n pluginName =\n meta.plugin && meta.marketplace\n ? `${meta.plugin}@${meta.marketplace}`\n : meta.plugin || plugin.name\n } catch {\n pluginName = plugin.name\n }\n } else {\n pluginName = plugin.name\n }\n\n if (pluginScope === 'user') {\n userPlugins.push(pluginName)\n } else {\n projectPlugins.push(pluginName)\n }\n }\n\n return { userPlugins, projectPlugins }\n}\n\n/**\n * Load standalone skills by scope\n */\nfunction loadStandaloneSkillsByScope(scope: TeamConfigScope): {\n userSkills: TeamSkillConfig[]\n projectSkills: TeamSkillConfig[]\n} {\n const allSkills = loadAllSkills()\n const userSkills: TeamSkillConfig[] = []\n const projectSkills: TeamSkillConfig[] = []\n\n for (const skill of allSkills) {\n // Only export standalone skills (not plugin-provided)\n if (skill.pluginName !== 'standalone') continue\n\n const teamSkill: TeamSkillConfig = {\n name: skill.name,\n description: skill.config.description,\n content: skill.config.content || '',\n argumentHint: skill.config.argumentHint,\n disableModelInvocation: skill.config.disableModelInvocation,\n userInvocable: skill.config.userInvocable,\n allowedTools: skill.config.allowedTools,\n model: skill.config.model,\n context: skill.config.context,\n agent: skill.config.agent,\n }\n\n if (skill.source === 'user' && (scope === 'user' || scope === 'all')) {\n userSkills.push(teamSkill)\n } else if (\n skill.source === 'project' &&\n (scope === 'project' || scope === 'all')\n ) {\n projectSkills.push(teamSkill)\n }\n }\n\n return { userSkills, projectSkills }\n}\n\n/**\n * Load standalone commands by scope\n */\nasync function loadStandaloneCommandsByScope(scope: TeamConfigScope): Promise<{\n userCommands: TeamCommandConfig[]\n projectCommands: TeamCommandConfig[]\n}> {\n const allCommands = await loadCustomCommands()\n const userCommands: TeamCommandConfig[] = []\n const projectCommands: TeamCommandConfig[] = []\n\n for (const cmd of allCommands) {\n // Skip plugin commands - they're installed via plugin install\n if (cmd.name.startsWith('plugin:')) continue\n\n const teamCmd: TeamCommandConfig = {\n name: cmd.name,\n description: cmd.description,\n content: '', // Will be populated from getPromptForCommand\n aliases: cmd.aliases,\n enabled: cmd.isEnabled,\n hidden: cmd.isHidden,\n progressMessage: cmd.progressMessage,\n argNames: cmd.argNames,\n }\n\n // Get the raw content by calling getPromptForCommand with empty args\n try {\n const messages = await cmd.getPromptForCommand('')\n if (messages.length > 0) {\n const firstMsg = messages[0]\n if (typeof firstMsg.content === 'string') {\n teamCmd.content = firstMsg.content\n }\n }\n } catch {\n // If content extraction fails, skip this command\n continue\n }\n\n if (cmd.scope === 'user' && (scope === 'user' || scope === 'all')) {\n userCommands.push(teamCmd)\n } else if (\n cmd.scope === 'project' &&\n (scope === 'project' || scope === 'all')\n ) {\n projectCommands.push(teamCmd)\n }\n }\n\n return { userCommands, projectCommands }\n}\n\n/**\n * Get marketplace URLs from registry\n */\nfunction getMarketplaceUrls(): string[] {\n const marketplaces = listMarketplaces()\n const urls: string[] = []\n\n for (const mp of marketplaces) {\n if (mp.source.type === 'github') {\n urls.push(`https://github.com/${mp.source.repo}.git`)\n } else if (mp.source.type === 'url') {\n urls.push(mp.source.url)\n } else if (mp.source.type === 'local') {\n urls.push(mp.source.path)\n }\n }\n\n return urls\n}\n\n/**\n * Build MCP server config for export, with optional placeholder handling\n */\nfunction buildMcpServersConfig(\n mcpServers: Record<string, any>,\n usePlaceholders: boolean,\n): Record<string, any> {\n const result: Record<string, any> = {}\n\n for (const [name, server] of Object.entries(mcpServers)) {\n if (server.type === 'sse') {\n result[name] = {\n type: 'sse',\n url: server.url,\n enabled: server.enabled,\n }\n } else {\n const env = server.env\n ? usePlaceholders\n ? Object.fromEntries(\n Object.entries(server.env).map(([key, value]) => {\n const isSecret =\n key.toLowerCase().includes('key') ||\n key.toLowerCase().includes('secret') ||\n key.toLowerCase().includes('token') ||\n key.toLowerCase().includes('password')\n return [key, isSecret ? `\\${${key}}` : value]\n }),\n )\n : server.env\n : undefined\n result[name] = {\n type: 'stdio',\n command: server.command,\n args: server.args,\n env,\n enabled: server.enabled,\n }\n }\n }\n\n return result\n}\n\n/**\n * Build team configuration for export\n */\nasync function buildTeamConfig(\n scope: TeamConfigScope,\n usePlaceholders: boolean,\n): Promise<TeamConfig> {\n const cwd = getCwd()\n const globalConfig = loadGlobalConfig()\n const projectConfig = loadProjectConfig(cwd)\n\n const scopeLabel =\n scope === 'user'\n ? 'User Configuration'\n : scope === 'project'\n ? `Project: ${cwd.split('/').pop()}`\n : `All: ${cwd.split('/').pop()}`\n\n const config: TeamConfig = {\n version: '1.0',\n name: scopeLabel,\n description: `Exported from Minto on ${new Date().toISOString()}`,\n scope,\n }\n\n // Models configuration \u2014 user-level only (not project)\n if (scope !== 'project') {\n if (globalConfig.modelProfiles && globalConfig.modelProfiles.length > 0) {\n config.models = {\n profiles: globalConfig.modelProfiles.map(profile => ({\n name: profile.name,\n provider: profile.provider,\n modelName: profile.modelName,\n baseURL: profile.baseURL,\n apiKey: usePlaceholders\n ? `\\${${profile.provider.toUpperCase()}_API_KEY}`\n : profile.apiKey,\n maxTokens: profile.maxTokens,\n contextLength: profile.contextLength,\n reasoningEffort: profile.reasoningEffort,\n isActive: profile.isActive,\n })),\n pointers: globalConfig.modelPointers,\n defaultModel: globalConfig.defaultModelName,\n }\n }\n }\n\n // MCP Servers configuration \u2014 scope-aware\n if (scope === 'user') {\n if (\n globalConfig.mcpServers &&\n Object.keys(globalConfig.mcpServers).length > 0\n ) {\n config.mcpServers = buildMcpServersConfig(\n globalConfig.mcpServers,\n usePlaceholders,\n )\n }\n } else if (scope === 'project') {\n if (\n projectConfig.mcpServers &&\n Object.keys(projectConfig.mcpServers).length > 0\n ) {\n config.mcpServers = buildMcpServersConfig(\n projectConfig.mcpServers,\n usePlaceholders,\n )\n }\n } else {\n // all: merge both\n const merged = {\n ...globalConfig.mcpServers,\n ...projectConfig.mcpServers,\n }\n if (Object.keys(merged).length > 0) {\n config.mcpServers = buildMcpServersConfig(merged, usePlaceholders)\n }\n }\n\n // Plugins configuration \u2014 scope-aware\n const marketplaceUrls = getMarketplaceUrls()\n const { userPlugins, projectPlugins } =\n await getInstalledPluginSourcesByScope(scope)\n\n if (\n marketplaceUrls.length > 0 ||\n userPlugins.length > 0 ||\n projectPlugins.length > 0\n ) {\n config.plugins = {}\n if (marketplaceUrls.length > 0) {\n config.plugins.marketplaces = marketplaceUrls\n }\n if (userPlugins.length > 0) {\n config.plugins.userInstall = userPlugins\n }\n if (projectPlugins.length > 0) {\n config.plugins.projectInstall = projectPlugins\n }\n }\n\n // Agents configuration \u2014 scope-aware\n const { userAgents, projectAgents } = await loadAgentsConfigByScope(scope)\n if (userAgents.length > 0 || projectAgents.length > 0) {\n config.agents = {}\n if (userAgents.length > 0) {\n config.agents.userAgents = userAgents\n }\n if (projectAgents.length > 0) {\n config.agents.projectAgents = projectAgents\n }\n }\n\n // Skills configuration \u2014 scope-aware\n const { userSkills, projectSkills } = loadStandaloneSkillsByScope(scope)\n if (userSkills.length > 0 || projectSkills.length > 0) {\n config.skills = {}\n if (userSkills.length > 0) {\n config.skills.userSkills = userSkills\n }\n if (projectSkills.length > 0) {\n config.skills.projectSkills = projectSkills\n }\n }\n\n // Commands configuration \u2014 scope-aware\n const { userCommands, projectCommands } =\n await loadStandaloneCommandsByScope(scope)\n if (userCommands.length > 0 || projectCommands.length > 0) {\n config.commands = {}\n if (userCommands.length > 0) {\n config.commands.userCommands = userCommands\n }\n if (projectCommands.length > 0) {\n config.commands.projectCommands = projectCommands\n }\n }\n\n // Hooks configuration \u2014 scope-aware\n const { userHooks, projectHooks } = await loadHooksConfigByScope(scope)\n if (userHooks) {\n config.hooks = userHooks\n }\n if (projectHooks) {\n config.projectHooks = projectHooks\n }\n\n // Settings \u2014 user-level only (not project)\n if (scope !== 'project') {\n config.settings = {\n theme: globalConfig.theme as 'dark' | 'light',\n verbose: globalConfig.verbose,\n compressionMode: globalConfig.compressionMode,\n thinking: globalConfig.thinking,\n proxy: globalConfig.proxy,\n stream: globalConfig.stream,\n language: globalConfig.language,\n safetyMode: globalConfig.safetyMode,\n skipOnboarding: globalConfig.hasCompletedOnboarding,\n }\n }\n\n // Post-install instructions (only when using placeholders)\n if (usePlaceholders) {\n config.postInstallInstructions = `\n1. Set environment variables for API keys (e.g., ANTHROPIC_API_KEY, OPENAI_API_KEY)\n2. Run 'minto' to start using your configured setup\n`.trim()\n }\n\n return config\n}\n\n/**\n * Export runtime configuration\n */\nasync function exportRuntimeConfig(\n scope: TeamConfigScope,\n): Promise<{ content: string; filename: string }> {\n const cwd = getCwd()\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-')\n\n if (scope === 'user') {\n const globalConfig = loadGlobalConfig()\n return {\n content: JSON.stringify({ global: globalConfig }, null, 2),\n filename: `minto-config-user-${timestamp}.json`,\n }\n } else if (scope === 'project') {\n const projectConfig = loadProjectConfig(cwd)\n return {\n content: JSON.stringify({ project: projectConfig }, null, 2),\n filename: `minto-config-project-${timestamp}.json`,\n }\n } else {\n const globalConfig = loadGlobalConfig()\n const projectConfig = loadProjectConfig(cwd)\n return {\n content: JSON.stringify(\n { global: globalConfig, project: projectConfig },\n null,\n 2,\n ),\n filename: `minto-config-all-${timestamp}.json`,\n }\n }\n}\n\n/**\n * Export team template\n */\nasync function exportTeamTemplate(\n scope: TeamConfigScope,\n usePlaceholders: boolean,\n): Promise<{ content: string; filename: string }> {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-')\n const teamConfig = await buildTeamConfig(scope, usePlaceholders)\n\n return {\n content: JSON.stringify(teamConfig, null, 2),\n filename: `minto-team-${scope}-${timestamp}.json`,\n }\n}\n\n// ============================================================================\n// Tab & Item Definitions\n// ============================================================================\n\nconst EXPORT_TABS: TabDefinition[] = [\n { id: 'team', label: t('commands.export.typeTeam') },\n { id: 'runtime', label: t('commands.export.typeRuntime') },\n { id: 'conversation', label: t('commands.export.typeConversation') },\n { id: 'summary', label: t('commands.export.typeSummary') },\n]\n\nfunction getItemsForTab(tabId: string): ListItem[] {\n switch (tabId) {\n case 'team':\n return [\n {\n id: 'team-user-include',\n label: t('commands.export.itemTeamUserInclude'),\n description: t('commands.export.scopeUserDesc'),\n data: {\n category: 'team',\n scope: 'user',\n sensitive: 'include',\n } as ExportItemData,\n },\n {\n id: 'team-user-placeholder',\n label: t('commands.export.itemTeamUserPlaceholder'),\n description: t('commands.export.scopeUserDesc'),\n data: {\n category: 'team',\n scope: 'user',\n sensitive: 'placeholder',\n } as ExportItemData,\n },\n {\n id: 'team-project-include',\n label: t('commands.export.itemTeamProjectInclude'),\n description: t('commands.export.scopeProjectDesc'),\n data: {\n category: 'team',\n scope: 'project',\n sensitive: 'include',\n } as ExportItemData,\n },\n {\n id: 'team-project-placeholder',\n label: t('commands.export.itemTeamProjectPlaceholder'),\n description: t('commands.export.scopeProjectDesc'),\n data: {\n category: 'team',\n scope: 'project',\n sensitive: 'placeholder',\n } as ExportItemData,\n },\n {\n id: 'team-all-include',\n label: t('commands.export.itemTeamAllInclude'),\n description: t('commands.export.scopeAllDesc'),\n data: {\n category: 'team',\n scope: 'all',\n sensitive: 'include',\n } as ExportItemData,\n },\n {\n id: 'team-all-placeholder',\n label: t('commands.export.itemTeamAllPlaceholder'),\n description: t('commands.export.scopeAllDesc'),\n data: {\n category: 'team',\n scope: 'all',\n sensitive: 'placeholder',\n } as ExportItemData,\n },\n ]\n case 'runtime':\n return [\n {\n id: 'runtime-user',\n label: t('commands.export.itemRuntimeUser'),\n description: t('commands.export.scopeUserDesc'),\n data: {\n category: 'runtime',\n scope: 'user',\n sensitive: 'include',\n } as ExportItemData,\n },\n {\n id: 'runtime-project',\n label: t('commands.export.itemRuntimeProject'),\n description: t('commands.export.scopeProjectDesc'),\n data: {\n category: 'runtime',\n scope: 'project',\n sensitive: 'include',\n } as ExportItemData,\n },\n {\n id: 'runtime-all',\n label: t('commands.export.itemRuntimeAll'),\n description: t('commands.export.scopeAllDesc'),\n data: {\n category: 'runtime',\n scope: 'all',\n sensitive: 'include',\n } as ExportItemData,\n },\n ]\n case 'conversation':\n return [\n {\n id: 'conversation',\n label: t('commands.export.itemConversation'),\n description: t('commands.export.typeConversationDesc'),\n data: {\n category: 'conversation',\n scope: 'user',\n sensitive: 'include',\n } as ExportItemData,\n },\n ]\n case 'summary':\n return [\n {\n id: 'summary',\n label: t('commands.export.itemSummary'),\n description: t('commands.export.typeSummaryDesc'),\n data: {\n category: 'summary',\n scope: 'user',\n sensitive: 'include',\n } as ExportItemData,\n },\n ]\n default:\n return []\n }\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\ninterface ExportMenuProps {\n onDone: (result?: string) => void\n}\n\nconst ExportMenu = ({ onDone }: ExportMenuProps) => {\n const [activeTab, setActiveTab] = useState('team')\n const [statusOverlay, setStatusOverlay] = useState<StatusOverlay | null>(null)\n const [searchQuery, setSearchQuery] = useState('')\n\n const items = useMemo(() => getItemsForTab(activeTab), [activeTab])\n\n const handleSelect = useCallback(async (item: ListItem) => {\n const data = item.data as ExportItemData\n\n setStatusOverlay({\n type: 'loading',\n message: t('commands.export.exporting'),\n })\n\n try {\n const cwd = getCwd()\n let filename: string\n let content: string\n\n switch (data.category) {\n case 'conversation': {\n const messages = getMessagesGetter()()\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-')\n filename = `minto-conversation-${timestamp}.json`\n content = JSON.stringify(messages, null, 2)\n break\n }\n case 'summary': {\n const messages = getMessagesGetter()()\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-')\n filename = `minto-summary-${timestamp}.md`\n content = generateSummary(messages)\n break\n }\n case 'runtime': {\n const result = await exportRuntimeConfig(data.scope)\n filename = result.filename\n content = result.content\n break\n }\n case 'team': {\n const usePlaceholders = data.sensitive === 'placeholder'\n const result = await exportTeamTemplate(data.scope, usePlaceholders)\n filename = result.filename\n content = result.content\n break\n }\n }\n\n const filepath = join(cwd, filename)\n await writeFile(filepath, content, 'utf-8')\n\n setStatusOverlay({\n type: 'success',\n message: `${t('commands.export.success')} ${filename}`,\n })\n } catch (error) {\n setStatusOverlay({\n type: 'error',\n message: `${t('commands.export.failed')}: ${error instanceof Error ? error.message : String(error)}`,\n })\n }\n }, [])\n\n const handleClose = useCallback(() => {\n onDone()\n }, [onDone])\n\n return (\n <TabbedListView\n title={t('commands.export.title')}\n tabs={EXPORT_TABS}\n activeTab={activeTab}\n onTabChange={tab => {\n setActiveTab(tab)\n setSearchQuery('')\n }}\n items={items}\n searchEnabled={false}\n searchQuery={searchQuery}\n onSearchChange={setSearchQuery}\n onSelect={handleSelect}\n onClose={handleClose}\n footerHint={t('commands.export.footerHint')}\n statusOverlay={statusOverlay}\n statusDismissHint=\"Esc Close\"\n />\n )\n}\n\n// ============================================================================\n// Command Export\n// ============================================================================\n\nconst command: Command = {\n name: 'export',\n description: t('commands.export.description'),\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n type: 'local-jsx',\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone) {\n return <ExportMenu onDone={onDone} />\n },\n}\n\nexport default command\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * Export Command\n *\n * Export configuration, team templates, or conversation data.\n * Uses TabbedListView with flat tab-based selection for consistent UX.\n *\n * Supports three scopes:\n * - user: ~/.minto/ config only\n * - project: ./.minto/ config only\n * - all: both user and project config combined\n */\n\nimport React, { useState, useCallback, useMemo } from 'react'\nimport { writeFile, readFile } from 'fs/promises'\nimport { existsSync, readdirSync } from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport type { Command } from '@commands'\nimport { getMessagesGetter } from '@messages'\nimport { getCwd } from '@utils/state'\nimport { getGlobalConfig, getCurrentProjectConfig } from '@utils/config'\nimport { t } from '@i18n'\nimport { listMarketplaces } from '@utils/marketplaceManager'\nimport { loadAllPlugins } from '@utils/pluginLoader'\nimport { loadAllSkills } from '@utils/skillLoader'\nimport { loadCustomCommands } from '@services/customCommands'\nimport { TabbedListView } from '@components/TabbedListView/TabbedListView'\nimport type {\n ListItem,\n TabDefinition,\n StatusOverlay,\n} from '@components/TabbedListView/types'\nimport type {\n TeamConfig,\n TeamConfigScope,\n TeamAgentConfig,\n TeamHooksConfig,\n TeamSkillConfig,\n TeamCommandConfig,\n} from '@utils/teamConfig'\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype ExportCategory = 'runtime' | 'team' | 'conversation' | 'summary'\ntype SensitiveHandling = 'include' | 'placeholder'\n\ninterface ExportItemData {\n category: ExportCategory\n scope: TeamConfigScope\n sensitive: SensitiveHandling\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Generate a markdown summary of the conversation\n */\nfunction generateSummary(messages: unknown[]): string {\n const lines: string[] = [\n '# Minto Session Summary',\n '',\n `Generated: ${new Date().toISOString()}`,\n '',\n '## Conversation Overview',\n '',\n `Total messages: ${messages.length}`,\n '',\n '## Message Summary',\n '',\n ]\n\n for (const msg of messages) {\n const m = msg as { role?: string; content?: unknown }\n if (!m.role) continue\n\n const role = m.role === 'user' ? '\uD83D\uDC64 User' : '\uD83E\uDD16 Assistant'\n\n if (typeof m.content === 'string') {\n const preview = m.content.slice(0, 200).replace(/\\n/g, ' ')\n lines.push(`### ${role}`)\n lines.push('')\n lines.push(`> ${preview}${m.content.length > 200 ? '...' : ''}`)\n lines.push('')\n } else if (Array.isArray(m.content)) {\n lines.push(`### ${role}`)\n lines.push('')\n for (const block of m.content) {\n if (block.type === 'text') {\n const preview = String(block.text || '')\n .slice(0, 200)\n .replace(/\\n/g, ' ')\n lines.push(\n `> ${preview}${String(block.text || '').length > 200 ? '...' : ''}`,\n )\n } else if (block.type === 'tool_use') {\n lines.push(`- Tool: \\`${block.name}\\``)\n } else if (block.type === 'tool_result') {\n lines.push(`- Tool result received`)\n }\n }\n lines.push('')\n }\n }\n\n return lines.join('\\n')\n}\n\n/**\n * Parse a hooks.json file into TeamHooksConfig\n */\nfunction parseHooksFile(content: string): TeamHooksConfig | null {\n try {\n const parsed = JSON.parse(content)\n\n if (!parsed.hooks) {\n return null\n }\n\n const result: TeamHooksConfig = {}\n\n if (parsed.hooks.SessionStart) {\n result.sessionStart = parsed.hooks.SessionStart.flatMap(\n (m: { hooks?: unknown[] }) => m.hooks || [],\n )\n }\n if (parsed.hooks.SessionEnd) {\n result.sessionEnd = parsed.hooks.SessionEnd.flatMap(\n (m: { hooks?: unknown[] }) => m.hooks || [],\n )\n }\n if (parsed.hooks.UserPromptSubmit) {\n result.userPromptSubmit = parsed.hooks.UserPromptSubmit.flatMap(\n (m: { hooks?: unknown[] }) => m.hooks || [],\n )\n }\n if (parsed.hooks.PreToolUse) {\n result.preToolUse = parsed.hooks.PreToolUse\n }\n if (parsed.hooks.PostToolUse) {\n result.postToolUse = parsed.hooks.PostToolUse\n }\n\n return result\n } catch {\n return null\n }\n}\n\n/**\n * Load hooks configuration by scope\n */\nasync function loadHooksConfigByScope(scope: TeamConfigScope): Promise<{\n userHooks: TeamHooksConfig | null\n projectHooks: TeamHooksConfig | null\n}> {\n let userHooks: TeamHooksConfig | null = null\n let projectHooks: TeamHooksConfig | null = null\n\n if (scope === 'user' || scope === 'all') {\n const mintoPath = join(homedir(), '.minto', 'hooks.json')\n const claudePath = join(homedir(), '.claude', 'hooks.json')\n const hooksPath = existsSync(mintoPath)\n ? mintoPath\n : existsSync(claudePath)\n ? claudePath\n : null\n\n if (hooksPath) {\n try {\n const content = await readFile(hooksPath, 'utf-8')\n userHooks = parseHooksFile(content)\n } catch {\n // ignore\n }\n }\n }\n\n if (scope === 'project' || scope === 'all') {\n const cwd = getCwd()\n const mintoPath = join(cwd, '.minto', 'hooks.json')\n const claudePath = join(cwd, '.claude', 'hooks.json')\n const hooksPath = existsSync(mintoPath)\n ? mintoPath\n : existsSync(claudePath)\n ? claudePath\n : null\n\n if (hooksPath) {\n try {\n const content = await readFile(hooksPath, 'utf-8')\n projectHooks = parseHooksFile(content)\n } catch {\n // ignore\n }\n }\n }\n\n return { userHooks, projectHooks }\n}\n\n/**\n * Parse an agent markdown file into TeamAgentConfig\n */\nfunction parseAgentFile(content: string): TeamAgentConfig | null {\n const frontmatterMatch = content.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/)\n\n if (!frontmatterMatch) return null\n\n const frontmatter = frontmatterMatch[1]\n const body = frontmatterMatch[2].trim()\n\n const nameMatch = frontmatter.match(/^name:\\s*(.+)$/m)\n const descMatch = frontmatter.match(/^description:\\s*\"?([^\"\\n]+)\"?$/m)\n const toolsMatch = frontmatter.match(/^tools:\\s*(.+)$/m)\n const modelMatch = frontmatter.match(/^model_name:\\s*(.+)$/m)\n const colorMatch = frontmatter.match(/^color:\\s*\"?([^\"\\n]+)\"?$/m)\n\n if (!nameMatch || !descMatch) return null\n\n let tools: string[] | '*' = '*'\n if (toolsMatch) {\n const toolsValue = toolsMatch[1].trim()\n if (toolsValue === '*') {\n tools = '*'\n } else {\n try {\n tools = JSON.parse(toolsValue)\n } catch {\n tools = '*'\n }\n }\n }\n\n return {\n name: nameMatch[1].trim(),\n description: descMatch[1].trim(),\n tools,\n systemPrompt: body,\n model: modelMatch ? modelMatch[1].trim() : undefined,\n color: colorMatch ? colorMatch[1].trim() : undefined,\n }\n}\n\n/**\n * Scan a directory for agent .md files and parse them\n */\nasync function scanAgentsDir(\n agentsDir: string,\n): Promise<Map<string, TeamAgentConfig>> {\n const agentMap = new Map<string, TeamAgentConfig>()\n\n if (!existsSync(agentsDir)) return agentMap\n\n try {\n const files = readdirSync(agentsDir)\n\n for (const file of files) {\n if (!file.endsWith('.md')) continue\n\n const filePath = join(agentsDir, file)\n const content = await readFile(filePath, 'utf-8')\n const agent = parseAgentFile(content)\n if (agent) {\n agentMap.set(agent.name, agent)\n }\n }\n } catch {\n // Ignore errors\n }\n\n return agentMap\n}\n\n/**\n * Load agents by scope\n * .minto agents take precedence over .claude agents with the same name\n */\nasync function loadAgentsConfigByScope(scope: TeamConfigScope): Promise<{\n userAgents: TeamAgentConfig[]\n projectAgents: TeamAgentConfig[]\n}> {\n const userAgentMap = new Map<string, TeamAgentConfig>()\n const projectAgentMap = new Map<string, TeamAgentConfig>()\n\n if (scope === 'user' || scope === 'all') {\n // .claude first, then .minto overrides\n const claudeAgents = await scanAgentsDir(\n join(homedir(), '.claude', 'agents'),\n )\n const mintoAgents = await scanAgentsDir(join(homedir(), '.minto', 'agents'))\n\n for (const [name, agent] of claudeAgents) {\n userAgentMap.set(name, agent)\n }\n for (const [name, agent] of mintoAgents) {\n userAgentMap.set(name, agent)\n }\n }\n\n if (scope === 'project' || scope === 'all') {\n const cwd = getCwd()\n const claudeAgents = await scanAgentsDir(join(cwd, '.claude', 'agents'))\n const mintoAgents = await scanAgentsDir(join(cwd, '.minto', 'agents'))\n\n for (const [name, agent] of claudeAgents) {\n projectAgentMap.set(name, agent)\n }\n for (const [name, agent] of mintoAgents) {\n projectAgentMap.set(name, agent)\n }\n }\n\n return {\n userAgents: Array.from(userAgentMap.values()),\n projectAgents: Array.from(projectAgentMap.values()),\n }\n}\n\n/**\n * Determine plugin scope from its location path\n */\nfunction getPluginScope(location: string): 'user' | 'project' {\n const cwd = getCwd()\n if (\n location.startsWith(join(cwd, '.minto')) ||\n location.startsWith(join(cwd, '.claude'))\n ) {\n return 'project'\n }\n return 'user'\n}\n\n/**\n * Get installed plugin source strings by scope using loadAllPlugins()\n */\nasync function getInstalledPluginSourcesByScope(\n scope: TeamConfigScope,\n): Promise<{ userPlugins: string[]; projectPlugins: string[] }> {\n const plugins = loadAllPlugins()\n const userPlugins: string[] = []\n const projectPlugins: string[] = []\n\n for (const plugin of plugins) {\n const pluginScope = getPluginScope(plugin.location)\n\n // Skip plugins not in the requested scope\n if (scope === 'user' && pluginScope !== 'user') continue\n if (scope === 'project' && pluginScope !== 'project') continue\n\n // Build plugin source string from metadata\n const metaPath = join(plugin.location, '.marketplace-meta.json')\n let pluginName: string\n if (existsSync(metaPath)) {\n try {\n const content = await readFile(metaPath, 'utf-8')\n const meta = JSON.parse(content)\n pluginName =\n meta.plugin && meta.marketplace\n ? `${meta.plugin}@${meta.marketplace}`\n : meta.plugin || plugin.name\n } catch {\n pluginName = plugin.name\n }\n } else {\n pluginName = plugin.name\n }\n\n if (pluginScope === 'user') {\n userPlugins.push(pluginName)\n } else {\n projectPlugins.push(pluginName)\n }\n }\n\n return { userPlugins, projectPlugins }\n}\n\n/**\n * Load standalone skills by scope\n */\nfunction loadStandaloneSkillsByScope(scope: TeamConfigScope): {\n userSkills: TeamSkillConfig[]\n projectSkills: TeamSkillConfig[]\n} {\n const allSkills = loadAllSkills()\n const userSkills: TeamSkillConfig[] = []\n const projectSkills: TeamSkillConfig[] = []\n\n for (const skill of allSkills) {\n // Only export standalone skills (not plugin-provided)\n if (skill.pluginName !== 'standalone') continue\n\n const teamSkill: TeamSkillConfig = {\n name: skill.name,\n description: skill.config.description,\n content: skill.config.content || '',\n argumentHint: skill.config.argumentHint,\n disableModelInvocation: skill.config.disableModelInvocation,\n userInvocable: skill.config.userInvocable,\n allowedTools: skill.config.allowedTools,\n model: skill.config.model,\n context: skill.config.context,\n agent: skill.config.agent,\n }\n\n if (skill.source === 'user' && (scope === 'user' || scope === 'all')) {\n userSkills.push(teamSkill)\n } else if (\n skill.source === 'project' &&\n (scope === 'project' || scope === 'all')\n ) {\n projectSkills.push(teamSkill)\n }\n }\n\n return { userSkills, projectSkills }\n}\n\n/**\n * Load standalone commands by scope\n */\nasync function loadStandaloneCommandsByScope(scope: TeamConfigScope): Promise<{\n userCommands: TeamCommandConfig[]\n projectCommands: TeamCommandConfig[]\n}> {\n const allCommands = await loadCustomCommands()\n const userCommands: TeamCommandConfig[] = []\n const projectCommands: TeamCommandConfig[] = []\n\n for (const cmd of allCommands) {\n // Skip plugin commands - they're installed via plugin install\n if (cmd.name.startsWith('plugin:')) continue\n\n const teamCmd: TeamCommandConfig = {\n name: cmd.name,\n description: cmd.description,\n content: '', // Will be populated from getPromptForCommand\n aliases: cmd.aliases,\n enabled: cmd.isEnabled,\n hidden: cmd.isHidden,\n progressMessage: cmd.progressMessage,\n argNames: cmd.argNames,\n }\n\n // Get the raw content by calling getPromptForCommand with empty args\n try {\n const messages = await cmd.getPromptForCommand('')\n if (messages.length > 0) {\n const firstMsg = messages[0]\n if (typeof firstMsg.content === 'string') {\n teamCmd.content = firstMsg.content\n }\n }\n } catch {\n // If content extraction fails, skip this command\n continue\n }\n\n if (cmd.scope === 'user' && (scope === 'user' || scope === 'all')) {\n userCommands.push(teamCmd)\n } else if (\n cmd.scope === 'project' &&\n (scope === 'project' || scope === 'all')\n ) {\n projectCommands.push(teamCmd)\n }\n }\n\n return { userCommands, projectCommands }\n}\n\n/**\n * Get marketplace URLs from registry\n */\nfunction getMarketplaceUrls(): string[] {\n const marketplaces = listMarketplaces()\n const urls: string[] = []\n\n for (const mp of marketplaces) {\n if (mp.source.type === 'github') {\n urls.push(`https://github.com/${mp.source.repo}.git`)\n } else if (mp.source.type === 'url') {\n urls.push(mp.source.url)\n } else if (mp.source.type === 'local') {\n urls.push(mp.source.path)\n }\n }\n\n return urls\n}\n\n/**\n * Build MCP server config for export, with optional placeholder handling\n */\nconst PROXY_ENV_KEYS = new Set([\n 'no_proxy',\n 'NO_PROXY',\n 'http_proxy',\n 'HTTP_PROXY',\n 'https_proxy',\n 'HTTPS_PROXY',\n 'ALL_PROXY',\n 'all_proxy',\n])\n\nfunction buildMcpServersConfig(\n mcpServers: Record<string, any>,\n usePlaceholders: boolean,\n): Record<string, any> {\n const result: Record<string, any> = {}\n\n for (const [name, server] of Object.entries(mcpServers)) {\n if (server.type === 'sse') {\n result[name] = {\n type: 'sse',\n url: server.url,\n enabled: server.enabled,\n }\n } else {\n const env = server.env\n ? usePlaceholders\n ? Object.fromEntries(\n Object.entries(server.env).map(([key, value]) => {\n const isProxyKey = PROXY_ENV_KEYS.has(key)\n const isSecret =\n !isProxyKey &&\n (key.toLowerCase().includes('key') ||\n key.toLowerCase().includes('secret') ||\n key.toLowerCase().includes('token') ||\n key.toLowerCase().includes('password'))\n return [key, isSecret ? `\\${${key}}` : value]\n }),\n )\n : server.env\n : undefined\n result[name] = {\n type: 'stdio',\n command: server.command,\n args: server.args,\n env,\n enabled: server.enabled,\n }\n }\n }\n\n return result\n}\n\n/**\n * Build team configuration for export\n */\nasync function buildTeamConfig(\n scope: TeamConfigScope,\n usePlaceholders: boolean,\n): Promise<TeamConfig> {\n const cwd = getCwd()\n const globalConfig = getGlobalConfig()\n const projectConfig = getCurrentProjectConfig()\n\n const scopeLabel =\n scope === 'user'\n ? 'User Configuration'\n : scope === 'project'\n ? `Project: ${cwd.split('/').pop()}`\n : `All: ${cwd.split('/').pop()}`\n\n const config: TeamConfig = {\n version: '1.0',\n name: scopeLabel,\n description: `Exported from Minto on ${new Date().toISOString()}`,\n scope,\n }\n\n // Models configuration \u2014 user-level only (not project)\n if (scope !== 'project') {\n if (globalConfig.modelProfiles && globalConfig.modelProfiles.length > 0) {\n config.models = {\n profiles: globalConfig.modelProfiles.map(profile => ({\n name: profile.name,\n provider: profile.provider,\n modelName: profile.modelName,\n baseURL: profile.baseURL,\n apiKey: usePlaceholders\n ? `\\${${profile.provider.toUpperCase()}_API_KEY}`\n : profile.apiKey,\n maxTokens: profile.maxTokens,\n contextLength: profile.contextLength,\n reasoningEffort: profile.reasoningEffort,\n isActive: profile.isActive,\n })),\n pointers: globalConfig.modelPointers,\n defaultModel: globalConfig.defaultModelName,\n }\n }\n }\n\n // MCP Servers configuration \u2014 scope-aware\n if (scope === 'user') {\n if (\n globalConfig.mcpServers &&\n Object.keys(globalConfig.mcpServers).length > 0\n ) {\n config.mcpServers = buildMcpServersConfig(\n globalConfig.mcpServers,\n usePlaceholders,\n )\n }\n } else if (scope === 'project') {\n if (\n projectConfig.mcpServers &&\n Object.keys(projectConfig.mcpServers).length > 0\n ) {\n config.mcpServers = buildMcpServersConfig(\n projectConfig.mcpServers,\n usePlaceholders,\n )\n }\n } else {\n // all: merge both\n const merged = {\n ...globalConfig.mcpServers,\n ...projectConfig.mcpServers,\n }\n if (Object.keys(merged).length > 0) {\n config.mcpServers = buildMcpServersConfig(merged, usePlaceholders)\n }\n }\n\n // Plugins configuration \u2014 scope-aware\n const marketplaceUrls = getMarketplaceUrls()\n const { userPlugins, projectPlugins } =\n await getInstalledPluginSourcesByScope(scope)\n\n if (\n marketplaceUrls.length > 0 ||\n userPlugins.length > 0 ||\n projectPlugins.length > 0\n ) {\n config.plugins = {}\n if (marketplaceUrls.length > 0) {\n config.plugins.marketplaces = marketplaceUrls\n }\n if (userPlugins.length > 0) {\n config.plugins.userInstall = userPlugins\n }\n if (projectPlugins.length > 0) {\n config.plugins.projectInstall = projectPlugins\n }\n }\n\n // Agents configuration \u2014 scope-aware\n const { userAgents, projectAgents } = await loadAgentsConfigByScope(scope)\n if (userAgents.length > 0 || projectAgents.length > 0) {\n config.agents = {}\n if (userAgents.length > 0) {\n config.agents.userAgents = userAgents\n }\n if (projectAgents.length > 0) {\n config.agents.projectAgents = projectAgents\n }\n }\n\n // Skills configuration \u2014 scope-aware\n const { userSkills, projectSkills } = loadStandaloneSkillsByScope(scope)\n if (userSkills.length > 0 || projectSkills.length > 0) {\n config.skills = {}\n if (userSkills.length > 0) {\n config.skills.userSkills = userSkills\n }\n if (projectSkills.length > 0) {\n config.skills.projectSkills = projectSkills\n }\n }\n\n // Commands configuration \u2014 scope-aware\n const { userCommands, projectCommands } =\n await loadStandaloneCommandsByScope(scope)\n if (userCommands.length > 0 || projectCommands.length > 0) {\n config.commands = {}\n if (userCommands.length > 0) {\n config.commands.userCommands = userCommands\n }\n if (projectCommands.length > 0) {\n config.commands.projectCommands = projectCommands\n }\n }\n\n // Hooks configuration \u2014 scope-aware\n const { userHooks, projectHooks } = await loadHooksConfigByScope(scope)\n if (userHooks) {\n config.hooks = userHooks\n }\n if (projectHooks) {\n config.projectHooks = projectHooks\n }\n\n // Settings \u2014 user-level only (not project)\n if (scope !== 'project') {\n config.settings = {\n theme: globalConfig.theme as 'dark' | 'light',\n verbose: globalConfig.verbose,\n compressionMode: globalConfig.compressionMode,\n thinking: globalConfig.thinking,\n proxy: globalConfig.proxy,\n stream: globalConfig.stream,\n language: globalConfig.language,\n safetyMode: globalConfig.safetyMode,\n skipOnboarding: globalConfig.hasCompletedOnboarding,\n }\n }\n\n // Post-install instructions (only when using placeholders)\n if (usePlaceholders) {\n config.postInstallInstructions = `\n1. Set environment variables for API keys (e.g., ANTHROPIC_API_KEY, OPENAI_API_KEY)\n2. Run 'minto' to start using your configured setup\n`.trim()\n }\n\n return config\n}\n\n/**\n * Export runtime configuration\n */\nasync function exportRuntimeConfig(\n scope: TeamConfigScope,\n): Promise<{ content: string; filename: string }> {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-')\n\n if (scope === 'user') {\n const globalConfig = getGlobalConfig()\n return {\n content: JSON.stringify({ global: globalConfig }, null, 2),\n filename: `minto-config-user-${timestamp}.json`,\n }\n } else if (scope === 'project') {\n const projectConfig = getCurrentProjectConfig()\n return {\n content: JSON.stringify({ project: projectConfig }, null, 2),\n filename: `minto-config-project-${timestamp}.json`,\n }\n } else {\n const globalConfig = getGlobalConfig()\n const projectConfig = getCurrentProjectConfig()\n return {\n content: JSON.stringify(\n { global: globalConfig, project: projectConfig },\n null,\n 2,\n ),\n filename: `minto-config-all-${timestamp}.json`,\n }\n }\n}\n\n/**\n * Export team template\n */\nasync function exportTeamTemplate(\n scope: TeamConfigScope,\n usePlaceholders: boolean,\n): Promise<{ content: string; filename: string }> {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-')\n const teamConfig = await buildTeamConfig(scope, usePlaceholders)\n\n return {\n content: JSON.stringify(teamConfig, null, 2),\n filename: `minto-team-${scope}-${timestamp}.json`,\n }\n}\n\n// ============================================================================\n// Tab & Item Definitions\n// ============================================================================\n\nconst EXPORT_TABS: TabDefinition[] = [\n { id: 'team', label: t('commands.export.typeTeam') },\n { id: 'runtime', label: t('commands.export.typeRuntime') },\n { id: 'conversation', label: t('commands.export.typeConversation') },\n { id: 'summary', label: t('commands.export.typeSummary') },\n]\n\nfunction getItemsForTab(tabId: string): ListItem[] {\n switch (tabId) {\n case 'team':\n return [\n {\n id: 'team-user-include',\n label: t('commands.export.itemTeamUserInclude'),\n description: t('commands.export.scopeUserDesc'),\n data: {\n category: 'team',\n scope: 'user',\n sensitive: 'include',\n } as ExportItemData,\n },\n {\n id: 'team-user-placeholder',\n label: t('commands.export.itemTeamUserPlaceholder'),\n description: t('commands.export.scopeUserDesc'),\n data: {\n category: 'team',\n scope: 'user',\n sensitive: 'placeholder',\n } as ExportItemData,\n },\n {\n id: 'team-project-include',\n label: t('commands.export.itemTeamProjectInclude'),\n description: t('commands.export.scopeProjectDesc'),\n data: {\n category: 'team',\n scope: 'project',\n sensitive: 'include',\n } as ExportItemData,\n },\n {\n id: 'team-project-placeholder',\n label: t('commands.export.itemTeamProjectPlaceholder'),\n description: t('commands.export.scopeProjectDesc'),\n data: {\n category: 'team',\n scope: 'project',\n sensitive: 'placeholder',\n } as ExportItemData,\n },\n {\n id: 'team-all-include',\n label: t('commands.export.itemTeamAllInclude'),\n description: t('commands.export.scopeAllDesc'),\n data: {\n category: 'team',\n scope: 'all',\n sensitive: 'include',\n } as ExportItemData,\n },\n {\n id: 'team-all-placeholder',\n label: t('commands.export.itemTeamAllPlaceholder'),\n description: t('commands.export.scopeAllDesc'),\n data: {\n category: 'team',\n scope: 'all',\n sensitive: 'placeholder',\n } as ExportItemData,\n },\n ]\n case 'runtime':\n return [\n {\n id: 'runtime-user',\n label: t('commands.export.itemRuntimeUser'),\n description: t('commands.export.scopeUserDesc'),\n data: {\n category: 'runtime',\n scope: 'user',\n sensitive: 'include',\n } as ExportItemData,\n },\n {\n id: 'runtime-project',\n label: t('commands.export.itemRuntimeProject'),\n description: t('commands.export.scopeProjectDesc'),\n data: {\n category: 'runtime',\n scope: 'project',\n sensitive: 'include',\n } as ExportItemData,\n },\n {\n id: 'runtime-all',\n label: t('commands.export.itemRuntimeAll'),\n description: t('commands.export.scopeAllDesc'),\n data: {\n category: 'runtime',\n scope: 'all',\n sensitive: 'include',\n } as ExportItemData,\n },\n ]\n case 'conversation':\n return [\n {\n id: 'conversation',\n label: t('commands.export.itemConversation'),\n description: t('commands.export.typeConversationDesc'),\n data: {\n category: 'conversation',\n scope: 'user',\n sensitive: 'include',\n } as ExportItemData,\n },\n ]\n case 'summary':\n return [\n {\n id: 'summary',\n label: t('commands.export.itemSummary'),\n description: t('commands.export.typeSummaryDesc'),\n data: {\n category: 'summary',\n scope: 'user',\n sensitive: 'include',\n } as ExportItemData,\n },\n ]\n default:\n return []\n }\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\ninterface ExportMenuProps {\n onDone: (result?: string) => void\n}\n\nconst ExportMenu = ({ onDone }: ExportMenuProps) => {\n const [activeTab, setActiveTab] = useState('team')\n const [statusOverlay, setStatusOverlay] = useState<StatusOverlay | null>(null)\n const [searchQuery, setSearchQuery] = useState('')\n\n const items = useMemo(() => getItemsForTab(activeTab), [activeTab])\n\n const handleSelect = useCallback(async (item: ListItem) => {\n const data = item.data as ExportItemData\n\n setStatusOverlay({\n type: 'loading',\n message: t('commands.export.exporting'),\n })\n\n try {\n const cwd = getCwd()\n let filename: string\n let content: string\n\n switch (data.category) {\n case 'conversation': {\n const messages = getMessagesGetter()()\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-')\n filename = `minto-conversation-${timestamp}.json`\n content = JSON.stringify(messages, null, 2)\n break\n }\n case 'summary': {\n const messages = getMessagesGetter()()\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-')\n filename = `minto-summary-${timestamp}.md`\n content = generateSummary(messages)\n break\n }\n case 'runtime': {\n const result = await exportRuntimeConfig(data.scope)\n filename = result.filename\n content = result.content\n break\n }\n case 'team': {\n const usePlaceholders = data.sensitive === 'placeholder'\n const result = await exportTeamTemplate(data.scope, usePlaceholders)\n filename = result.filename\n content = result.content\n break\n }\n }\n\n const filepath = join(cwd, filename)\n await writeFile(filepath, content, 'utf-8')\n\n setStatusOverlay({\n type: 'success',\n message: `${t('commands.export.success')} ${filename}`,\n })\n } catch (error) {\n setStatusOverlay({\n type: 'error',\n message: `${t('commands.export.failed')}: ${error instanceof Error ? error.message : String(error)}`,\n })\n }\n }, [])\n\n const handleClose = useCallback(() => {\n onDone()\n }, [onDone])\n\n return (\n <TabbedListView\n title={t('commands.export.title')}\n tabs={EXPORT_TABS}\n activeTab={activeTab}\n onTabChange={tab => {\n setActiveTab(tab)\n setSearchQuery('')\n }}\n items={items}\n searchEnabled={false}\n searchQuery={searchQuery}\n onSearchChange={setSearchQuery}\n onSelect={handleSelect}\n onClose={handleClose}\n footerHint={t('commands.export.footerHint')}\n statusOverlay={statusOverlay}\n statusDismissHint=\"Esc Close\"\n />\n )\n}\n\n// ============================================================================\n// Command Export\n// ============================================================================\n\nconst command: Command = {\n name: 'export',\n description: t('commands.export.description'),\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n type: 'local-jsx',\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone) {\n return <ExportMenu onDone={onDone} />\n },\n}\n\nexport default command\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const ide = {
|
|
2
|
+
name: "ide",
|
|
3
|
+
description: "IDE integration information",
|
|
4
|
+
isEnabled: true,
|
|
5
|
+
isHidden: false,
|
|
6
|
+
type: "local",
|
|
7
|
+
userFacingName() {
|
|
8
|
+
return "ide";
|
|
9
|
+
},
|
|
10
|
+
async call() {
|
|
11
|
+
return "Minto is designed to work with AiTer. Launch AiTer to use the integrated development environment.";
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
var ide_default = ide;
|
|
15
|
+
export {
|
|
16
|
+
ide_default as default
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=ide.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/commands/ide.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * /ide command (stub)\n *\n * Informs user about IDE integration with AiTer.\n */\n\nimport type { Command } from '../commands'\n\nconst ide: Command = {\n name: 'ide',\n description: 'IDE integration information',\n isEnabled: true,\n isHidden: false,\n type: 'local',\n userFacingName() {\n return 'ide'\n },\n async call() {\n return 'Minto is designed to work with AiTer. Launch AiTer to use the integrated development environment.'\n },\n}\n\nexport default ide\n"],
|
|
5
|
+
"mappings": "AAQA,MAAM,MAAe;AAAA,EACnB,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,MAAM;AAAA,EACN,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,OAAO;AACX,WAAO;AAAA,EACT;AACF;AAEA,IAAO,cAAQ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -87,7 +87,7 @@ const MCPInteractive = ({ onDone }) => {
|
|
|
87
87
|
});
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
|
-
refreshMCPConnections();
|
|
90
|
+
await refreshMCPConnections();
|
|
91
91
|
await loadServers();
|
|
92
92
|
setStatusOverlay({
|
|
93
93
|
type: "success",
|
|
@@ -108,7 +108,7 @@ const MCPInteractive = ({ onDone }) => {
|
|
|
108
108
|
});
|
|
109
109
|
try {
|
|
110
110
|
removeMcpServer(serverName, scope);
|
|
111
|
-
refreshMCPConnections();
|
|
111
|
+
await refreshMCPConnections();
|
|
112
112
|
await loadServers();
|
|
113
113
|
setStatusOverlay({
|
|
114
114
|
type: "success",
|
|
@@ -140,7 +140,7 @@ const MCPInteractive = ({ onDone }) => {
|
|
|
140
140
|
"project"
|
|
141
141
|
);
|
|
142
142
|
}
|
|
143
|
-
refreshMCPConnections();
|
|
143
|
+
await refreshMCPConnections();
|
|
144
144
|
await loadServers();
|
|
145
145
|
setStatusOverlay({
|
|
146
146
|
type: "success",
|
|
@@ -162,12 +162,9 @@ const MCPInteractive = ({ onDone }) => {
|
|
|
162
162
|
message: t("commands.mcp.refreshing")
|
|
163
163
|
});
|
|
164
164
|
try {
|
|
165
|
-
refreshMCPConnections();
|
|
165
|
+
await refreshMCPConnections();
|
|
166
166
|
await loadServers();
|
|
167
|
-
setStatusOverlay(
|
|
168
|
-
type: "success",
|
|
169
|
-
message: t("commands.mcp.refreshSuccess")
|
|
170
|
-
});
|
|
167
|
+
setStatusOverlay(null);
|
|
171
168
|
} catch (err) {
|
|
172
169
|
const msg = err instanceof Error ? err.message : String(err);
|
|
173
170
|
setStatusOverlay({ type: "error", message: msg });
|
|
@@ -306,6 +303,15 @@ const MCPInteractive = ({ onDone }) => {
|
|
|
306
303
|
searchPlaceholder: t("commands.mcp.addCommandPlaceholder")
|
|
307
304
|
};
|
|
308
305
|
}
|
|
306
|
+
default:
|
|
307
|
+
return {
|
|
308
|
+
tabs: [],
|
|
309
|
+
items: [],
|
|
310
|
+
title: "",
|
|
311
|
+
footerHint: "",
|
|
312
|
+
searchEnabled: false,
|
|
313
|
+
searchPlaceholder: void 0
|
|
314
|
+
};
|
|
309
315
|
}
|
|
310
316
|
}, [phase, activeTab, servers]);
|
|
311
317
|
const handleTabChange = useCallback((tabId) => {
|