@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.
Files changed (306) hide show
  1. package/dist/Tool.js.map +2 -2
  2. package/dist/commands/agents/AgentsCommand.js +2 -2
  3. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  4. package/dist/commands/ctx_viz.js +1 -1
  5. package/dist/commands/effort.js +87 -0
  6. package/dist/commands/effort.js.map +7 -0
  7. package/dist/commands/export.js +19 -9
  8. package/dist/commands/export.js.map +2 -2
  9. package/dist/commands/ide.js +18 -0
  10. package/dist/commands/ide.js.map +7 -0
  11. package/dist/commands/mcp-interactive.js +14 -8
  12. package/dist/commands/mcp-interactive.js.map +2 -2
  13. package/dist/commands/memory.js +168 -0
  14. package/dist/commands/memory.js.map +7 -0
  15. package/dist/commands/model.js +45 -2
  16. package/dist/commands/model.js.map +2 -2
  17. package/dist/commands/outputStyle.js +64 -0
  18. package/dist/commands/outputStyle.js.map +7 -0
  19. package/dist/commands/plugin/utils.js +33 -1
  20. package/dist/commands/plugin/utils.js.map +2 -2
  21. package/dist/commands/plugin.js +10 -1
  22. package/dist/commands/plugin.js.map +2 -2
  23. package/dist/commands/refreshCommands.js +2 -0
  24. package/dist/commands/refreshCommands.js.map +2 -2
  25. package/dist/commands/review.js +51 -0
  26. package/dist/commands/review.js.map +7 -0
  27. package/dist/commands/terminalSetup.js +6 -0
  28. package/dist/commands/terminalSetup.js.map +2 -2
  29. package/dist/commands/undo.js +8 -0
  30. package/dist/commands/undo.js.map +2 -2
  31. package/dist/commands/vim.js +22 -0
  32. package/dist/commands/vim.js.map +7 -0
  33. package/dist/commands.js +12 -0
  34. package/dist/commands.js.map +2 -2
  35. package/dist/components/HighlightedCode.js +1 -0
  36. package/dist/components/HighlightedCode.js.map +2 -2
  37. package/dist/components/ModelSelector/ModelSelector.js +250 -143
  38. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  39. package/dist/components/PromptInput.js +21 -6
  40. package/dist/components/PromptInput.js.map +2 -2
  41. package/dist/components/PulseLabel.js +44 -0
  42. package/dist/components/PulseLabel.js.map +7 -0
  43. package/dist/components/RequestStatusIndicator.js +1 -1
  44. package/dist/components/RequestStatusIndicator.js.map +1 -1
  45. package/dist/components/Spinner.js +12 -42
  46. package/dist/components/Spinner.js.map +3 -3
  47. package/dist/components/StartupStatus.js +57 -0
  48. package/dist/components/StartupStatus.js.map +7 -0
  49. package/dist/components/SubagentBlock.js +43 -6
  50. package/dist/components/SubagentBlock.js.map +2 -2
  51. package/dist/components/TabbedListView/TabBar.js +13 -8
  52. package/dist/components/TabbedListView/TabBar.js.map +2 -2
  53. package/dist/components/TabbedListView/TabbedListView.js +1 -1
  54. package/dist/components/TabbedListView/TabbedListView.js.map +2 -2
  55. package/dist/components/TodoPanel.js +1 -1
  56. package/dist/components/TodoPanel.js.map +1 -1
  57. package/dist/components/ToolUseLoader.js +5 -0
  58. package/dist/components/ToolUseLoader.js.map +2 -2
  59. package/dist/components/TrustDialog.js +0 -2
  60. package/dist/components/TrustDialog.js.map +2 -2
  61. package/dist/components/messages/TaskInModuleView.js +1 -1
  62. package/dist/components/messages/TaskInModuleView.js.map +2 -2
  63. package/dist/components/messages/TaskToolMessage.js +1 -1
  64. package/dist/components/messages/TaskToolMessage.js.map +2 -2
  65. package/dist/components/messages/UserPromptMessage.js +6 -1
  66. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  67. package/dist/constants/modelCapabilities.js +103 -18
  68. package/dist/constants/modelCapabilities.js.map +2 -2
  69. package/dist/constants/product.js +2 -0
  70. package/dist/constants/product.js.map +2 -2
  71. package/dist/constants/prompts/agentPrompt.js +30 -0
  72. package/dist/constants/prompts/agentPrompt.js.map +7 -0
  73. package/dist/constants/prompts/codeConventions.js +27 -0
  74. package/dist/constants/prompts/codeConventions.js.map +7 -0
  75. package/dist/constants/prompts/doingTasks.js +15 -0
  76. package/dist/constants/prompts/doingTasks.js.map +7 -0
  77. package/dist/constants/prompts/envInfo.js +17 -0
  78. package/dist/constants/prompts/envInfo.js.map +7 -0
  79. package/dist/constants/prompts/executingWithCare.js +17 -0
  80. package/dist/constants/prompts/executingWithCare.js.map +7 -0
  81. package/dist/constants/prompts/identity.js +10 -0
  82. package/dist/constants/prompts/identity.js.map +7 -0
  83. package/dist/constants/prompts/index.js +78 -0
  84. package/dist/constants/prompts/index.js.map +7 -0
  85. package/dist/constants/prompts/taskManagement.js +60 -0
  86. package/dist/constants/prompts/taskManagement.js.map +7 -0
  87. package/dist/constants/prompts/toneAndStyle.js +62 -0
  88. package/dist/constants/prompts/toneAndStyle.js.map +7 -0
  89. package/dist/constants/prompts/toolUsagePolicy.js +38 -0
  90. package/dist/constants/prompts/toolUsagePolicy.js.map +7 -0
  91. package/dist/constants/prompts.js +5 -176
  92. package/dist/constants/prompts.js.map +2 -2
  93. package/dist/constants/providerRegistry.js +235 -0
  94. package/dist/constants/providerRegistry.js.map +7 -0
  95. package/dist/constants/providers.js +35 -0
  96. package/dist/constants/providers.js.map +7 -0
  97. package/dist/context/PermissionContext.js +0 -1
  98. package/dist/context/PermissionContext.js.map +2 -2
  99. package/dist/context.js +87 -31
  100. package/dist/context.js.map +2 -2
  101. package/dist/core/backupHook.js +2 -2
  102. package/dist/core/backupHook.js.map +2 -2
  103. package/dist/core/config/defaults.js +4 -1
  104. package/dist/core/config/defaults.js.map +2 -2
  105. package/dist/core/config/schema.js +7 -1
  106. package/dist/core/config/schema.js.map +2 -2
  107. package/dist/core/costTracker.js +18 -0
  108. package/dist/core/costTracker.js.map +2 -2
  109. package/dist/core/index.js +0 -1
  110. package/dist/core/index.js.map +2 -2
  111. package/dist/core/tokenStatsManager.js +22 -4
  112. package/dist/core/tokenStatsManager.js.map +2 -2
  113. package/dist/entrypoints/cli.js +65 -84
  114. package/dist/entrypoints/cli.js.map +2 -2
  115. package/dist/hooks/useAgentTokenStats.js +1 -1
  116. package/dist/hooks/useAgentTokenStats.js.map +2 -2
  117. package/dist/hooks/useAgentTranscripts.js +2 -1
  118. package/dist/hooks/useAgentTranscripts.js.map +2 -2
  119. package/dist/hooks/useBackgroundShells.js +29 -0
  120. package/dist/hooks/useBackgroundShells.js.map +7 -0
  121. package/dist/hooks/useCanUseTool.js +1 -1
  122. package/dist/hooks/useCanUseTool.js.map +2 -2
  123. package/dist/hooks/useDeferredLoading.js +64 -0
  124. package/dist/hooks/useDeferredLoading.js.map +7 -0
  125. package/dist/hooks/useHookStatus.js +1 -1
  126. package/dist/hooks/useHookStatus.js.map +2 -2
  127. package/dist/hooks/useSessionTracking.js +55 -0
  128. package/dist/hooks/useSessionTracking.js.map +7 -0
  129. package/dist/hooks/useTerminalSize.js +21 -0
  130. package/dist/hooks/useTerminalSize.js.map +2 -2
  131. package/dist/hooks/useTextInput.js +1 -0
  132. package/dist/hooks/useTextInput.js.map +2 -2
  133. package/dist/hooks/useUnifiedCompletion.js +3 -2
  134. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  135. package/dist/i18n/locales/en.js +8 -9
  136. package/dist/i18n/locales/en.js.map +2 -2
  137. package/dist/i18n/locales/zh-CN.js +8 -9
  138. package/dist/i18n/locales/zh-CN.js.map +2 -2
  139. package/dist/i18n/types.js.map +1 -1
  140. package/dist/messages.js +41 -17
  141. package/dist/messages.js.map +2 -2
  142. package/dist/permissions.js +94 -1
  143. package/dist/permissions.js.map +2 -2
  144. package/dist/query.js +27 -19
  145. package/dist/query.js.map +2 -2
  146. package/dist/screens/REPL.js +83 -74
  147. package/dist/screens/REPL.js.map +2 -2
  148. package/dist/services/adapters/responsesAPI.js +6 -0
  149. package/dist/services/adapters/responsesAPI.js.map +2 -2
  150. package/dist/services/agentTeams/index.js +35 -0
  151. package/dist/services/agentTeams/index.js.map +7 -0
  152. package/dist/services/agentTeams/mailbox.js +114 -0
  153. package/dist/services/agentTeams/mailbox.js.map +7 -0
  154. package/dist/services/agentTeams/teamManager.js +149 -0
  155. package/dist/services/agentTeams/teamManager.js.map +7 -0
  156. package/dist/services/agentTeams/teamTaskStore.js +114 -0
  157. package/dist/services/agentTeams/teamTaskStore.js.map +7 -0
  158. package/dist/services/agentTeams/teammateSpawner.js +80 -0
  159. package/dist/services/agentTeams/teammateSpawner.js.map +7 -0
  160. package/dist/services/checkpointManager.js +16 -3
  161. package/dist/services/checkpointManager.js.map +2 -2
  162. package/dist/services/claude.js +19 -1728
  163. package/dist/services/claude.js.map +3 -3
  164. package/dist/services/gpt5ConnectionTest.js +4 -2
  165. package/dist/services/gpt5ConnectionTest.js.map +2 -2
  166. package/dist/services/hookExecutor.js +411 -127
  167. package/dist/services/hookExecutor.js.map +2 -2
  168. package/dist/services/llm/anthropicProvider.js +807 -0
  169. package/dist/services/llm/anthropicProvider.js.map +7 -0
  170. package/dist/services/llm/dispatch.js +218 -0
  171. package/dist/services/llm/dispatch.js.map +7 -0
  172. package/dist/services/llm/index.js +44 -0
  173. package/dist/services/llm/index.js.map +7 -0
  174. package/dist/services/llm/mintoContext.js +69 -0
  175. package/dist/services/llm/mintoContext.js.map +7 -0
  176. package/dist/services/llm/openaiProvider.js +622 -0
  177. package/dist/services/llm/openaiProvider.js.map +7 -0
  178. package/dist/services/llm/types.js +157 -0
  179. package/dist/services/llm/types.js.map +7 -0
  180. package/dist/services/mcpClient.js +183 -33
  181. package/dist/services/mcpClient.js.map +2 -2
  182. package/dist/services/notifier.js +14 -0
  183. package/dist/services/notifier.js.map +2 -2
  184. package/dist/services/oauth.js +4 -2
  185. package/dist/services/oauth.js.map +2 -2
  186. package/dist/services/openai.js +66 -56
  187. package/dist/services/openai.js.map +3 -3
  188. package/dist/services/outputStyles.js +102 -21
  189. package/dist/services/outputStyles.js.map +2 -2
  190. package/dist/services/plugins/skillMarketplace.js +4 -1
  191. package/dist/services/plugins/skillMarketplace.js.map +2 -2
  192. package/dist/services/sentry.js +1 -1
  193. package/dist/services/sentry.js.map +2 -2
  194. package/dist/services/sessionMemory.js +16 -3
  195. package/dist/services/sessionMemory.js.map +2 -2
  196. package/dist/services/systemReminder.js +350 -3
  197. package/dist/services/systemReminder.js.map +2 -2
  198. package/dist/services/taskStore.js +19 -0
  199. package/dist/services/taskStore.js.map +2 -2
  200. package/dist/tools/ArchitectTool/ArchitectTool.js.map +1 -1
  201. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +1 -1
  202. package/dist/tools/BashOutputTool/BashOutputTool.js.map +1 -1
  203. package/dist/tools/BashTool/BashTool.js +28 -0
  204. package/dist/tools/BashTool/BashTool.js.map +2 -2
  205. package/dist/tools/FileEditTool/FileEditTool.js +1 -1
  206. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  207. package/dist/tools/FileReadTool/FileReadTool.js +14 -0
  208. package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
  209. package/dist/tools/FileWriteTool/FileWriteTool.js +3 -1
  210. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  211. package/dist/tools/GlobTool/GlobTool.js.map +1 -1
  212. package/dist/tools/GrepTool/GrepTool.js.map +1 -1
  213. package/dist/tools/KillShellTool/KillShellTool.js.map +1 -1
  214. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +2 -2
  215. package/dist/tools/LspTool/LspTool.js +11 -2
  216. package/dist/tools/LspTool/LspTool.js.map +2 -2
  217. package/dist/tools/MCPTool/MCPTool.js.map +1 -1
  218. package/dist/tools/MemoryReadTool/MemoryReadTool.js +2 -1
  219. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
  220. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +2 -1
  221. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
  222. package/dist/tools/MultiEditTool/MultiEditTool.js.map +1 -1
  223. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +1 -1
  224. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +1 -1
  225. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +8 -2
  226. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
  227. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +2 -0
  228. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
  229. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +1 -1
  230. package/dist/tools/SlashCommandTool/SlashCommandTool.js +174 -18
  231. package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +3 -3
  232. package/dist/tools/TaskCreateTool/TaskCreateTool.js.map +1 -1
  233. package/dist/tools/TaskGetTool/TaskGetTool.js.map +1 -1
  234. package/dist/tools/TaskListTool/TaskListTool.js.map +1 -1
  235. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +1 -1
  236. package/dist/tools/TaskStopTool/TaskStopTool.js.map +1 -1
  237. package/dist/tools/TaskTool/TaskTool.js +75 -5
  238. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  239. package/dist/tools/TaskTool/prompt.js +12 -6
  240. package/dist/tools/TaskTool/prompt.js.map +2 -2
  241. package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +1 -1
  242. package/dist/tools/ThinkTool/ThinkTool.js.map +1 -1
  243. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +1 -1
  244. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +1 -1
  245. package/dist/tools/WebSearchTool/WebSearchTool.js.map +1 -1
  246. package/dist/tools/WebSearchTool/searchProviders.js +2 -1
  247. package/dist/tools/WebSearchTool/searchProviders.js.map +2 -2
  248. package/dist/tools/lsTool/lsTool.js.map +2 -2
  249. package/dist/tools/lsTool/prompt.js.map +1 -1
  250. package/dist/tools.js +14 -3
  251. package/dist/tools.js.map +2 -2
  252. package/dist/types/PermissionMode.js +21 -1
  253. package/dist/types/PermissionMode.js.map +2 -2
  254. package/dist/types/agentTeams.js +1 -0
  255. package/dist/types/agentTeams.js.map +7 -0
  256. package/dist/types/hooks.js +8 -2
  257. package/dist/types/hooks.js.map +2 -2
  258. package/dist/types/plugin.js +1 -1
  259. package/dist/types/plugin.js.map +2 -2
  260. package/dist/utils/agentLoader.js +25 -3
  261. package/dist/utils/agentLoader.js.map +2 -2
  262. package/dist/utils/animationManager.js +1 -1
  263. package/dist/utils/animationManager.js.map +2 -2
  264. package/dist/utils/ask.js +1 -1
  265. package/dist/utils/async.js +5 -1
  266. package/dist/utils/async.js.map +2 -2
  267. package/dist/utils/autoCompactCore.js +60 -0
  268. package/dist/utils/autoCompactCore.js.map +2 -2
  269. package/dist/utils/config.js +26 -128
  270. package/dist/utils/config.js.map +2 -2
  271. package/dist/utils/configSchema.js +227 -0
  272. package/dist/utils/configSchema.js.map +7 -0
  273. package/dist/utils/debugLogger.js.map +2 -2
  274. package/dist/utils/env.js +4 -3
  275. package/dist/utils/env.js.map +2 -2
  276. package/dist/utils/envConfig.js +34 -0
  277. package/dist/utils/envConfig.js.map +3 -3
  278. package/dist/utils/gpt5.js +146 -0
  279. package/dist/utils/gpt5.js.map +7 -0
  280. package/dist/utils/hookManager.js +374 -140
  281. package/dist/utils/hookManager.js.map +2 -2
  282. package/dist/utils/markdown.js +47 -0
  283. package/dist/utils/markdown.js.map +2 -2
  284. package/dist/utils/memoizeWithTTL.js +25 -0
  285. package/dist/utils/memoizeWithTTL.js.map +7 -0
  286. package/dist/utils/model.js +34 -9
  287. package/dist/utils/model.js.map +2 -2
  288. package/dist/utils/pluginInstaller.js +34 -5
  289. package/dist/utils/pluginInstaller.js.map +2 -2
  290. package/dist/utils/pluginLoader.js +201 -32
  291. package/dist/utils/pluginLoader.js.map +2 -2
  292. package/dist/utils/safeFetch.js +45 -0
  293. package/dist/utils/safeFetch.js.map +7 -0
  294. package/dist/utils/skillLoader.js +59 -6
  295. package/dist/utils/skillLoader.js.map +2 -2
  296. package/dist/utils/streamingState.js +52 -0
  297. package/dist/utils/streamingState.js.map +7 -0
  298. package/dist/utils/style.js +6 -3
  299. package/dist/utils/style.js.map +2 -2
  300. package/dist/utils/teamConfig.js +9 -3
  301. package/dist/utils/teamConfig.js.map +2 -2
  302. package/dist/utils/toolRiskClassification.js +0 -6
  303. package/dist/utils/toolRiskClassification.js.map +2 -2
  304. package/dist/version.js +2 -2
  305. package/dist/version.js.map +1 -1
  306. package/package.json +7 -6
@@ -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
+ }
@@ -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 { loadGlobalConfig, loadProjectConfig } from "../core/config/index.js";
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 isSecret = key.toLowerCase().includes("key") || key.toLowerCase().includes("secret") || key.toLowerCase().includes("token") || key.toLowerCase().includes("password");
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 = loadGlobalConfig();
345
- const projectConfig = loadProjectConfig(cwd);
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 = loadGlobalConfig();
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 = loadProjectConfig(cwd);
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 = loadGlobalConfig();
484
- const projectConfig = loadProjectConfig(cwd);
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) => {