@within-7/minto 0.3.10 → 0.4.0

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 +2 -1
@@ -5,6 +5,7 @@ import {
5
5
  } from "./config.js";
6
6
  import { debug as debugLogger } from "./debugLogger.js";
7
7
  import { safeParseJSON } from "./json.js";
8
+ import { ensureProxyBypass, hasSystemProxy } from "./envConfig.js";
8
9
  function interpolateEnvVars(value) {
9
10
  return value.replace(/\$\{([^}]+)\}/g, (match, varName) => {
10
11
  const envValue = process.env[varName.trim()];
@@ -58,18 +59,21 @@ function convertTeamMcpConfig(teamConfig) {
58
59
  enabled: teamConfig.enabled ?? true
59
60
  };
60
61
  }
62
+ const env = teamConfig.env ? ensureProxyBypass(interpolateEnvVarsInObject(teamConfig.env)) : hasSystemProxy() ? { no_proxy: "*", NO_PROXY: "*" } : void 0;
61
63
  return {
62
64
  type: "stdio",
63
65
  command: interpolateEnvVars(teamConfig.command || ""),
64
66
  args: (teamConfig.args || []).map((arg) => interpolateEnvVars(arg)),
65
- env: teamConfig.env ? interpolateEnvVarsInObject(teamConfig.env) : void 0,
67
+ env,
66
68
  enabled: teamConfig.enabled ?? true
67
69
  };
68
70
  }
69
71
  async function fetchTeamConfig(url) {
70
72
  debugLogger.state("TEAM_CONFIG_FETCH_START", { url });
71
73
  try {
72
- const response = await fetch(url);
74
+ const response = await fetch(url, {
75
+ signal: AbortSignal.timeout(3e4)
76
+ });
73
77
  if (!response.ok) {
74
78
  throw new Error(
75
79
  `Failed to fetch config: ${response.status} ${response.statusText}`
@@ -331,7 +335,9 @@ async function installRemoteAgents(agentUrls, targetDir) {
331
335
  for (const url of agentUrls) {
332
336
  try {
333
337
  debugLogger.state("TEAM_CONFIG_DOWNLOAD_AGENT", { url });
334
- const response = await fetch(url);
338
+ const response = await fetch(url, {
339
+ signal: AbortSignal.timeout(3e4)
340
+ });
335
341
  if (!response.ok) {
336
342
  throw new Error(`HTTP ${response.status}: ${response.statusText}`);
337
343
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/teamConfig.ts"],
4
- "sourcesContent": ["/**\n * Team Configuration System\n *\n * Enables teams to share a unified Minto configuration via remote URLs.\n * Supports environment variable interpolation and flexible configuration merging.\n */\n\nimport { existsSync, readFileSync } from 'fs'\nimport {\n getGlobalConfig,\n saveGlobalConfig,\n ModelProfile,\n ModelPointers,\n McpServerConfig,\n ProviderType,\n} from './config'\nimport { debug as debugLogger } from './debugLogger'\nimport { safeParseJSON } from './json'\n\n/**\n * Scope for team config export/import\n */\nexport type TeamConfigScope = 'user' | 'project' | 'all'\n\n/**\n * Standalone skill configuration for team config\n */\nexport type TeamSkillConfig = {\n name: string\n description: string\n content: string // markdown body\n argumentHint?: string\n disableModelInvocation?: boolean\n userInvocable?: boolean\n allowedTools?: string[]\n model?: string\n context?: string\n agent?: string\n}\n\n/**\n * Standalone command configuration for team config\n */\nexport type TeamCommandConfig = {\n name: string\n description?: string\n content: string // markdown body\n aliases?: string[]\n enabled?: boolean\n hidden?: boolean\n progressMessage?: string\n argNames?: string[]\n allowedTools?: string[]\n}\n\n/**\n * Team configuration schema\n * Represents a shareable configuration template for teams\n */\nexport type TeamConfig = {\n version: '1.0'\n name: string // Configuration name (e.g., \"Acme Inc. Default Config\")\n description?: string // Optional description\n scope?: TeamConfigScope // Scope that was used during export\n\n // Model Configuration\n models?: {\n profiles?: TeamModelProfile[]\n pointers?: Partial<ModelPointers> // Default model pointers\n defaultModel?: string // Default model name\n }\n\n // MCP Server Configuration\n mcpServers?: Record<string, TeamMcpServerConfig>\n\n // Plugin Marketplace Configuration\n plugins?: {\n // Plugin marketplace URLs (marketplace.json)\n marketplaces?: string[]\n // Specific plugins to install from marketplaces\n install?: string[] // v1.0 compat: no scope, defaults to user\n userInstall?: string[] // User-scope plugins\n projectInstall?: string[] // Project-scope plugins\n }\n\n // Global Settings\n settings?: {\n theme?: 'dark' | 'light'\n verbose?: boolean\n compressionMode?: 'business' | 'code'\n thinking?: boolean\n proxy?: string\n stream?: boolean\n // \u65B0\u589E\u8BBE\u7F6E\u9879\n language?: 'en' | 'zh-CN'\n safetyMode?: 'yolo' | 'smart' | 'strict' | 'free'\n skipOnboarding?: boolean // \u8DF3\u8FC7\u5165\u95E8\u6D41\u7A0B\n }\n\n // Agent \u914D\u7F6E\uFF08\u5185\u8054\u6216\u8FDC\u7A0B URL\uFF09\n agents?: {\n // \u8FDC\u7A0B agent \u6587\u4EF6 URL \u5217\u8868\n remoteAgents?: string[]\n // \u5185\u8054 agent \u5B9A\u4E49\n inlineAgents?: TeamAgentConfig[] // v1.0 compat: no scope, defaults to user\n userAgents?: TeamAgentConfig[]\n projectAgents?: TeamAgentConfig[]\n }\n\n // Skill \u914D\u7F6E\uFF08standalone skills\uFF09\n skills?: {\n userSkills?: TeamSkillConfig[]\n projectSkills?: TeamSkillConfig[]\n }\n\n // Command \u914D\u7F6E\uFF08standalone commands\uFF09\n commands?: {\n userCommands?: TeamCommandConfig[]\n projectCommands?: TeamCommandConfig[]\n }\n\n // Hook \u914D\u7F6E\n hooks?: TeamHooksConfig // User-scope hooks\n projectHooks?: TeamHooksConfig // Project-scope hooks\n\n // Instructions for users\n postInstallInstructions?: string\n}\n\n/**\n * Model profile template with environment variable support\n */\nexport type TeamModelProfile = {\n name: string\n provider: ProviderType\n modelName: string\n baseURL?: string\n apiKey: string // Can be env var like \"${ANTHROPIC_API_KEY}\"\n maxTokens: number\n contextLength: number\n reasoningEffort?: 'low' | 'medium' | 'high' | 'minimal'\n isActive?: boolean\n}\n\n/**\n * Inline agent configuration for team config\n */\nexport type TeamAgentConfig = {\n name: string // Agent identifier (e.g., \"research-analyst\")\n description: string // When to use this agent\n tools: string[] | '*' // Tool permissions\n systemPrompt: string // System prompt content\n model?: string // Optional model override\n color?: string // Optional UI color\n}\n\n/**\n * Hook configuration for team config\n */\nexport type TeamHooksConfig = {\n // Session lifecycle hooks\n sessionStart?: TeamHookDefinition[]\n sessionEnd?: TeamHookDefinition[]\n // User input hooks\n userPromptSubmit?: TeamHookDefinition[]\n // Tool lifecycle hooks\n preToolUse?: TeamToolHook[]\n postToolUse?: TeamToolHook[]\n}\n\nexport type TeamHookDefinition = {\n type: 'command' | 'prompt'\n command?: string\n prompt?: string\n timeout?: number\n description?: string\n}\n\nexport type TeamToolHook = {\n matcher: string // Tool name regex or \"*\"\n hooks: TeamHookDefinition[]\n}\n\n/**\n * MCP server config with env var support\n */\nexport type TeamMcpServerConfig = {\n type?: 'stdio' | 'sse'\n command?: string // For stdio\n args?: string[] // For stdio, supports env vars like \"${HOME}/.local/bin/mcp-server\"\n url?: string // For SSE\n env?: Record<string, string> // Env vars, supports interpolation\n enabled?: boolean\n}\n\n/**\n * Interpolate environment variables in a string\n * Supports ${VAR_NAME} syntax\n */\nexport function interpolateEnvVars(value: string): string {\n return value.replace(/\\$\\{([^}]+)\\}/g, (match, varName) => {\n const envValue = process.env[varName.trim()]\n if (envValue === undefined) {\n debugLogger.warn('ENV_VAR_NOT_FOUND', {\n varName,\n original: match,\n })\n // Keep the placeholder if env var not found\n return match\n }\n return envValue\n })\n}\n\n/**\n * Recursively interpolate env vars in an object\n */\nexport function interpolateEnvVarsInObject<T>(obj: T): T {\n if (typeof obj === 'string') {\n return interpolateEnvVars(obj) as T\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => interpolateEnvVarsInObject(item)) as T\n }\n\n if (obj && typeof obj === 'object') {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj)) {\n result[key] = interpolateEnvVarsInObject(value)\n }\n return result as T\n }\n\n return obj\n}\n\n/**\n * Convert team model profile to runtime model profile\n */\nexport function convertTeamModelProfile(\n teamProfile: TeamModelProfile,\n): ModelProfile {\n const now = Date.now()\n\n return {\n name: teamProfile.name,\n provider: teamProfile.provider,\n modelName: teamProfile.modelName,\n baseURL: teamProfile.baseURL,\n apiKey: interpolateEnvVars(teamProfile.apiKey),\n maxTokens: teamProfile.maxTokens,\n contextLength: teamProfile.contextLength,\n reasoningEffort: teamProfile.reasoningEffort,\n isActive: teamProfile.isActive ?? true,\n createdAt: now,\n lastUsed: now,\n }\n}\n\n/**\n * Convert team MCP config to runtime MCP config\n */\nexport function convertTeamMcpConfig(\n teamConfig: TeamMcpServerConfig,\n): McpServerConfig {\n if (teamConfig.type === 'sse') {\n return {\n type: 'sse',\n url: interpolateEnvVars(teamConfig.url || ''),\n enabled: teamConfig.enabled ?? true,\n }\n }\n\n // Default to stdio\n return {\n type: 'stdio',\n command: interpolateEnvVars(teamConfig.command || ''),\n args: (teamConfig.args || []).map(arg => interpolateEnvVars(arg)),\n env: teamConfig.env\n ? interpolateEnvVarsInObject(teamConfig.env)\n : undefined,\n enabled: teamConfig.enabled ?? true,\n }\n}\n\n/**\n * Fetch team configuration from a URL\n */\nexport async function fetchTeamConfig(url: string): Promise<TeamConfig> {\n debugLogger.state('TEAM_CONFIG_FETCH_START', { url })\n\n try {\n const response = await fetch(url)\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch config: ${response.status} ${response.statusText}`,\n )\n }\n\n const configText = await response.text()\n const config = JSON.parse(configText) as TeamConfig\n\n // Validate version\n if (config.version !== '1.0') {\n throw new Error(\n `Unsupported config version: ${config.version}. Expected 1.0`,\n )\n }\n\n debugLogger.state('TEAM_CONFIG_FETCH_SUCCESS', {\n url,\n configName: config.name,\n hasModels: !!config.models,\n hasMcpServers: !!config.mcpServers,\n })\n\n return config\n } catch (error) {\n debugLogger.error('TEAM_CONFIG_FETCH_ERROR', {\n url,\n error: error instanceof Error ? error.message : String(error),\n })\n throw error\n }\n}\n\n/**\n * Load team configuration from a local file\n */\nexport function loadTeamConfigFromFile(filePath: string): TeamConfig {\n debugLogger.state('TEAM_CONFIG_LOAD_FILE', { filePath })\n\n if (!existsSync(filePath)) {\n throw new Error(`Configuration file not found: ${filePath}`)\n }\n\n try {\n const configText = readFileSync(filePath, 'utf-8')\n const config = safeParseJSON(configText) as TeamConfig\n\n if (!config) {\n throw new Error('Invalid JSON in configuration file')\n }\n\n if (config.version !== '1.0') {\n throw new Error(\n `Unsupported config version: ${config.version}. Expected 1.0`,\n )\n }\n\n debugLogger.state('TEAM_CONFIG_LOAD_FILE_SUCCESS', {\n filePath,\n configName: config.name,\n })\n\n return config\n } catch (error) {\n debugLogger.error('TEAM_CONFIG_LOAD_FILE_ERROR', {\n filePath,\n error: error instanceof Error ? error.message : String(error),\n })\n throw error\n }\n}\n\n/**\n * Merge strategy for configuration\n */\nexport type MergeStrategy = 'replace' | 'merge' | 'skip-existing'\n\n/**\n * Apply team configuration to global config\n */\nexport function applyTeamConfig(\n teamConfig: TeamConfig,\n strategy: MergeStrategy = 'merge',\n): {\n applied: boolean\n modelsAdded: number\n mcpServersAdded: number\n settingsUpdated: string[]\n} {\n debugLogger.state('TEAM_CONFIG_APPLY_START', {\n configName: teamConfig.name,\n strategy,\n })\n\n const globalConfig = getGlobalConfig()\n let modelsAdded = 0\n let mcpServersAdded = 0\n const settingsUpdated: string[] = []\n\n // Apply model profiles\n if (teamConfig.models?.profiles) {\n const existingProfiles = globalConfig.modelProfiles || []\n const existingModelNames = new Set(existingProfiles.map(p => p.modelName))\n\n for (const teamProfile of teamConfig.models.profiles) {\n const runtimeProfile = convertTeamModelProfile(teamProfile)\n\n if (\n strategy === 'skip-existing' &&\n existingModelNames.has(runtimeProfile.modelName)\n ) {\n debugLogger.state('TEAM_CONFIG_SKIP_MODEL', {\n modelName: runtimeProfile.modelName,\n reason: 'already_exists',\n })\n continue\n }\n\n if (strategy === 'replace') {\n // Remove existing profile with same modelName\n const index = existingProfiles.findIndex(\n p => p.modelName === runtimeProfile.modelName,\n )\n if (index !== -1) {\n existingProfiles.splice(index, 1)\n }\n }\n\n existingProfiles.push(runtimeProfile)\n modelsAdded++\n\n debugLogger.state('TEAM_CONFIG_ADD_MODEL', {\n modelName: runtimeProfile.modelName,\n provider: runtimeProfile.provider,\n })\n }\n\n globalConfig.modelProfiles = existingProfiles\n }\n\n // Apply model pointers\n if (teamConfig.models?.pointers) {\n globalConfig.modelPointers = {\n ...(globalConfig.modelPointers || {\n main: '',\n task: '',\n reasoning: '',\n quick: '',\n compact: '',\n }),\n ...teamConfig.models.pointers,\n }\n settingsUpdated.push('modelPointers')\n }\n\n // Apply default model\n if (teamConfig.models?.defaultModel) {\n globalConfig.defaultModelName = teamConfig.models.defaultModel\n settingsUpdated.push('defaultModelName')\n }\n\n // Apply MCP servers\n if (teamConfig.mcpServers) {\n const existingMcpServers = globalConfig.mcpServers || {}\n const existingServerNames = new Set(Object.keys(existingMcpServers))\n\n for (const [serverName, teamMcpConfig] of Object.entries(\n teamConfig.mcpServers,\n )) {\n if (strategy === 'skip-existing' && existingServerNames.has(serverName)) {\n debugLogger.state('TEAM_CONFIG_SKIP_MCP', {\n serverName,\n reason: 'already_exists',\n })\n continue\n }\n\n const runtimeMcpConfig = convertTeamMcpConfig(teamMcpConfig)\n existingMcpServers[serverName] = runtimeMcpConfig\n mcpServersAdded++\n\n debugLogger.state('TEAM_CONFIG_ADD_MCP', {\n serverName,\n type: runtimeMcpConfig.type || 'stdio',\n })\n }\n\n globalConfig.mcpServers = existingMcpServers\n }\n\n // Apply global settings\n if (teamConfig.settings) {\n const { settings } = teamConfig\n\n if (settings.theme !== undefined) {\n globalConfig.theme = settings.theme\n settingsUpdated.push('theme')\n }\n\n if (settings.verbose !== undefined) {\n globalConfig.verbose = settings.verbose\n settingsUpdated.push('verbose')\n }\n\n if (settings.compressionMode !== undefined) {\n globalConfig.compressionMode = settings.compressionMode\n settingsUpdated.push('compressionMode')\n }\n\n if (settings.thinking !== undefined) {\n globalConfig.thinking = settings.thinking\n settingsUpdated.push('thinking')\n }\n\n if (settings.proxy !== undefined) {\n globalConfig.proxy = settings.proxy\n settingsUpdated.push('proxy')\n }\n\n if (settings.stream !== undefined) {\n globalConfig.stream = settings.stream\n settingsUpdated.push('stream')\n }\n\n if (settings.language !== undefined) {\n globalConfig.language = settings.language\n settingsUpdated.push('language')\n }\n\n if (settings.safetyMode !== undefined) {\n globalConfig.safetyMode = settings.safetyMode\n settingsUpdated.push('safetyMode')\n }\n\n if (settings.skipOnboarding) {\n globalConfig.hasCompletedOnboarding = true\n settingsUpdated.push('hasCompletedOnboarding')\n }\n }\n\n // Save updated config\n saveGlobalConfig(globalConfig)\n\n debugLogger.state('TEAM_CONFIG_APPLY_SUCCESS', {\n configName: teamConfig.name,\n modelsAdded,\n mcpServersAdded,\n settingsUpdated: settingsUpdated.join(', '),\n })\n\n return {\n applied: true,\n modelsAdded,\n mcpServersAdded,\n settingsUpdated,\n }\n}\n\n/**\n * Add marketplaces from URLs\n */\nexport async function addMarketplaces(\n marketplaceUrls: string[],\n): Promise<{ added: number; failed: number; errors: string[] }> {\n let added = 0\n let failed = 0\n const errors: string[] = []\n\n // Import marketplace manager\n const { addMarketplace } = await import('./marketplaceManager')\n\n for (const url of marketplaceUrls) {\n try {\n debugLogger.state('TEAM_CONFIG_ADD_MARKETPLACE', { url })\n\n await addMarketplace(url)\n added++\n\n debugLogger.state('TEAM_CONFIG_ADD_MARKETPLACE_SUCCESS', { url })\n } catch (error) {\n failed++\n const errorMsg = error instanceof Error ? error.message : String(error)\n errors.push(`${url}: ${errorMsg}`)\n\n debugLogger.error('TEAM_CONFIG_ADD_MARKETPLACE_ERROR', {\n url,\n error: errorMsg,\n })\n }\n }\n\n return { added, failed, errors }\n}\n\n/**\n * Install plugins from marketplaces\n */\nexport async function installPlugins(\n pluginNames: string[],\n targetDir?: string,\n): Promise<{ installed: number; failed: number; errors: string[] }> {\n let installed = 0\n let failed = 0\n const errors: string[] = []\n\n // Import marketplace manager and path utilities\n const { installPluginFromMarketplace } = await import('./marketplaceManager')\n const { join } = await import('path')\n const { homedir } = await import('os')\n\n // Default target: ~/.minto/plugins\n const installDir = targetDir || join(homedir(), '.minto', 'plugins')\n\n for (const pluginSpec of pluginNames) {\n // Parse name@marketplace format (e.g., \"backend-development@claude-code-workflows\")\n const atIndex = pluginSpec.indexOf('@')\n const pluginName =\n atIndex !== -1 ? pluginSpec.slice(0, atIndex) : pluginSpec\n const marketplaceName =\n atIndex !== -1 ? pluginSpec.slice(atIndex + 1) : undefined\n\n try {\n debugLogger.state('TEAM_CONFIG_INSTALL_PLUGIN', {\n pluginName,\n marketplace: marketplaceName,\n targetDir: installDir,\n })\n\n await installPluginFromMarketplace(\n pluginName,\n marketplaceName,\n join(installDir, pluginName),\n )\n\n installed++\n debugLogger.state('TEAM_CONFIG_INSTALL_PLUGIN_SUCCESS', { pluginName })\n } catch (error) {\n failed++\n const errorMsg = error instanceof Error ? error.message : String(error)\n errors.push(`${pluginName}: ${errorMsg}`)\n\n debugLogger.error('TEAM_CONFIG_INSTALL_PLUGIN_ERROR', {\n pluginName,\n error: errorMsg,\n })\n }\n }\n\n return { installed, failed, errors }\n}\n\n/**\n * Download and install remote agents\n */\nexport async function installRemoteAgents(\n agentUrls: string[],\n targetDir?: string,\n): Promise<{ installed: number; failed: number; errors: string[] }> {\n let installed = 0\n let failed = 0\n const errors: string[] = []\n\n const { join } = await import('path')\n const { homedir } = await import('os')\n const { writeFileSync, mkdirSync, existsSync } = await import('fs')\n\n // Target: specified dir or ~/.minto/agents\n const agentsDir = targetDir || join(homedir(), '.minto', 'agents')\n if (!existsSync(agentsDir)) {\n mkdirSync(agentsDir, { recursive: true })\n }\n\n for (const url of agentUrls) {\n try {\n debugLogger.state('TEAM_CONFIG_DOWNLOAD_AGENT', { url })\n\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const content = await response.text()\n\n // Extract filename from URL\n const filename = url.split('/').pop() || 'agent.md'\n const targetPath = join(agentsDir, filename)\n\n writeFileSync(targetPath, content, 'utf-8')\n installed++\n\n debugLogger.state('TEAM_CONFIG_DOWNLOAD_AGENT_SUCCESS', {\n url,\n targetPath,\n })\n } catch (error) {\n failed++\n const errorMsg = error instanceof Error ? error.message : String(error)\n errors.push(`${url}: ${errorMsg}`)\n\n debugLogger.error('TEAM_CONFIG_DOWNLOAD_AGENT_ERROR', {\n url,\n error: errorMsg,\n })\n }\n }\n\n return { installed, failed, errors }\n}\n\n/**\n * Install inline agents from team config\n */\nexport async function installInlineAgents(\n agents: TeamAgentConfig[],\n targetDir?: string,\n): Promise<{ installed: number; failed: number; errors: string[] }> {\n let installed = 0\n let failed = 0\n const errors: string[] = []\n\n const { join } = await import('path')\n const { homedir } = await import('os')\n const { writeFileSync, mkdirSync, existsSync } = await import('fs')\n\n // Target: specified dir or ~/.minto/agents\n const agentsDir = targetDir || join(homedir(), '.minto', 'agents')\n if (!existsSync(agentsDir)) {\n mkdirSync(agentsDir, { recursive: true })\n }\n\n for (const agent of agents) {\n try {\n debugLogger.state('TEAM_CONFIG_INSTALL_INLINE_AGENT', {\n name: agent.name,\n })\n\n // Generate agent markdown file\n const tools = agent.tools === '*' ? '*' : JSON.stringify(agent.tools)\n\n const content = `---\nname: ${agent.name}\ndescription: \"${agent.description.replace(/\"/g, '\\\\\"')}\"\ntools: ${tools}${agent.model ? `\\nmodel_name: ${agent.model}` : ''}${agent.color ? `\\ncolor: \"${agent.color}\"` : ''}\n---\n\n${agent.systemPrompt}\n`\n\n const filename = `${agent.name}.md`\n const targetPath = join(agentsDir, filename)\n\n writeFileSync(targetPath, content, 'utf-8')\n installed++\n\n debugLogger.state('TEAM_CONFIG_INSTALL_INLINE_AGENT_SUCCESS', {\n name: agent.name,\n targetPath,\n })\n } catch (error) {\n failed++\n const errorMsg = error instanceof Error ? error.message : String(error)\n errors.push(`${agent.name}: ${errorMsg}`)\n\n debugLogger.error('TEAM_CONFIG_INSTALL_INLINE_AGENT_ERROR', {\n name: agent.name,\n error: errorMsg,\n })\n }\n }\n\n return { installed, failed, errors }\n}\n\n/**\n * Install hooks from team config\n */\nexport async function installTeamHooks(\n hooks: TeamHooksConfig,\n targetPath?: string,\n): Promise<{ installed: boolean; error?: string }> {\n const { join, dirname } = await import('path')\n const { homedir } = await import('os')\n const { writeFileSync, mkdirSync, existsSync, readFileSync } = await import(\n 'fs'\n )\n\n try {\n debugLogger.state('TEAM_CONFIG_INSTALL_HOOKS', {})\n\n // Target: specified path or ~/.minto/hooks.json\n const hooksPath = targetPath || join(homedir(), '.minto', 'hooks.json')\n const hooksDir = dirname(hooksPath)\n if (!existsSync(hooksDir)) {\n mkdirSync(hooksDir, { recursive: true })\n }\n\n // Convert TeamHooksConfig to standard hooks format\n const hooksConfig: Record<string, unknown> = {\n description: 'Team-configured hooks',\n hooks: {} as Record<string, unknown>,\n }\n\n const hooksObj = hooksConfig.hooks as Record<string, unknown>\n\n if (hooks.sessionStart) {\n hooksObj.SessionStart = [{ matcher: '*', hooks: hooks.sessionStart }]\n }\n if (hooks.sessionEnd) {\n hooksObj.SessionEnd = [{ matcher: '*', hooks: hooks.sessionEnd }]\n }\n if (hooks.userPromptSubmit) {\n hooksObj.UserPromptSubmit = [\n { matcher: '*', hooks: hooks.userPromptSubmit },\n ]\n }\n if (hooks.preToolUse) {\n hooksObj.PreToolUse = hooks.preToolUse\n }\n if (hooks.postToolUse) {\n hooksObj.PostToolUse = hooks.postToolUse\n }\n\n // Merge with existing hooks if present\n if (existsSync(hooksPath)) {\n try {\n const existingContent = readFileSync(hooksPath, 'utf-8')\n const existingHooks = JSON.parse(existingContent)\n // Deep merge\n for (const [event, matchers] of Object.entries(hooksObj)) {\n if (existingHooks.hooks?.[event]) {\n existingHooks.hooks[event] = [\n ...existingHooks.hooks[event],\n ...(matchers as unknown[]),\n ]\n } else {\n existingHooks.hooks = existingHooks.hooks || {}\n existingHooks.hooks[event] = matchers\n }\n }\n hooksConfig.hooks = existingHooks.hooks\n } catch {\n // If parsing fails, overwrite\n }\n }\n\n writeFileSync(hooksPath, JSON.stringify(hooksConfig, null, 2), 'utf-8')\n\n debugLogger.state('TEAM_CONFIG_INSTALL_HOOKS_SUCCESS', { hooksPath })\n\n return { installed: true }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n debugLogger.error('TEAM_CONFIG_INSTALL_HOOKS_ERROR', { error: errorMsg })\n return { installed: false, error: errorMsg }\n }\n}\n\n/**\n * Install standalone skills from team config\n */\nexport async function installInlineSkills(\n skills: TeamSkillConfig[],\n targetDir?: string,\n): Promise<{ installed: number; failed: number; errors: string[] }> {\n let installed = 0\n let failed = 0\n const errors: string[] = []\n\n const { join } = await import('path')\n const { homedir } = await import('os')\n const { writeFileSync, mkdirSync, existsSync } = await import('fs')\n\n // Target: specified dir or ~/.minto/skills\n const skillsDir = targetDir || join(homedir(), '.minto', 'skills')\n if (!existsSync(skillsDir)) {\n mkdirSync(skillsDir, { recursive: true })\n }\n\n for (const skill of skills) {\n try {\n debugLogger.state('TEAM_CONFIG_INSTALL_SKILL', { name: skill.name })\n\n // Build frontmatter\n const frontmatterLines: string[] = [\n `name: ${skill.name}`,\n `description: \"${skill.description.replace(/\"/g, '\\\\\"')}\"`,\n ]\n if (skill.argumentHint) {\n frontmatterLines.push(`argument-hint: \"${skill.argumentHint}\"`)\n }\n if (skill.disableModelInvocation !== undefined) {\n frontmatterLines.push(\n `disable-model-invocation: ${skill.disableModelInvocation}`,\n )\n }\n if (skill.userInvocable !== undefined) {\n frontmatterLines.push(`user-invocable: ${skill.userInvocable}`)\n }\n if (skill.allowedTools && skill.allowedTools.length > 0) {\n frontmatterLines.push(\n `allowed-tools: ${JSON.stringify(skill.allowedTools)}`,\n )\n }\n if (skill.model) {\n frontmatterLines.push(`model: ${skill.model}`)\n }\n if (skill.context) {\n frontmatterLines.push(`context: \"${skill.context}\"`)\n }\n if (skill.agent) {\n frontmatterLines.push(`agent: \"${skill.agent}\"`)\n }\n\n const content = `---\\n${frontmatterLines.join('\\n')}\\n---\\n\\n${skill.content}\\n`\n\n const filename = `${skill.name}.md`\n const targetPath = join(skillsDir, filename)\n\n writeFileSync(targetPath, content, 'utf-8')\n installed++\n\n debugLogger.state('TEAM_CONFIG_INSTALL_SKILL_SUCCESS', {\n name: skill.name,\n targetPath,\n })\n } catch (error) {\n failed++\n const errorMsg = error instanceof Error ? error.message : String(error)\n errors.push(`${skill.name}: ${errorMsg}`)\n\n debugLogger.error('TEAM_CONFIG_INSTALL_SKILL_ERROR', {\n name: skill.name,\n error: errorMsg,\n })\n }\n }\n\n return { installed, failed, errors }\n}\n\n/**\n * Install standalone commands from team config\n */\nexport async function installInlineCommands(\n commands: TeamCommandConfig[],\n targetDir?: string,\n): Promise<{ installed: number; failed: number; errors: string[] }> {\n let installed = 0\n let failed = 0\n const errors: string[] = []\n\n const { join } = await import('path')\n const { homedir } = await import('os')\n const { writeFileSync, mkdirSync, existsSync } = await import('fs')\n\n // Target: specified dir or ~/.minto/commands\n const commandsDir = targetDir || join(homedir(), '.minto', 'commands')\n if (!existsSync(commandsDir)) {\n mkdirSync(commandsDir, { recursive: true })\n }\n\n for (const cmd of commands) {\n try {\n debugLogger.state('TEAM_CONFIG_INSTALL_COMMAND', { name: cmd.name })\n\n // Build frontmatter\n const frontmatterLines: string[] = [`name: ${cmd.name}`]\n if (cmd.description) {\n frontmatterLines.push(\n `description: \"${cmd.description.replace(/\"/g, '\\\\\"')}\"`,\n )\n }\n if (cmd.aliases && cmd.aliases.length > 0) {\n frontmatterLines.push(`aliases: ${JSON.stringify(cmd.aliases)}`)\n }\n if (cmd.enabled !== undefined) {\n frontmatterLines.push(`enabled: ${cmd.enabled}`)\n }\n if (cmd.hidden !== undefined) {\n frontmatterLines.push(`hidden: ${cmd.hidden}`)\n }\n if (cmd.progressMessage) {\n frontmatterLines.push(`progressMessage: \"${cmd.progressMessage}\"`)\n }\n if (cmd.argNames && cmd.argNames.length > 0) {\n frontmatterLines.push(`argNames: ${JSON.stringify(cmd.argNames)}`)\n }\n if (cmd.allowedTools && cmd.allowedTools.length > 0) {\n frontmatterLines.push(\n `allowed-tools: ${JSON.stringify(cmd.allowedTools)}`,\n )\n }\n\n const content = `---\\n${frontmatterLines.join('\\n')}\\n---\\n\\n${cmd.content}\\n`\n\n const filename = `${cmd.name}.md`\n const targetPath = join(commandsDir, filename)\n\n writeFileSync(targetPath, content, 'utf-8')\n installed++\n\n debugLogger.state('TEAM_CONFIG_INSTALL_COMMAND_SUCCESS', {\n name: cmd.name,\n targetPath,\n })\n } catch (error) {\n failed++\n const errorMsg = error instanceof Error ? error.message : String(error)\n errors.push(`${cmd.name}: ${errorMsg}`)\n\n debugLogger.error('TEAM_CONFIG_INSTALL_COMMAND_ERROR', {\n name: cmd.name,\n error: errorMsg,\n })\n }\n }\n\n return { installed, failed, errors }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Team Configuration System\n *\n * Enables teams to share a unified Minto configuration via remote URLs.\n * Supports environment variable interpolation and flexible configuration merging.\n */\n\nimport { existsSync, readFileSync } from 'fs'\nimport {\n getGlobalConfig,\n saveGlobalConfig,\n ModelProfile,\n ModelPointers,\n McpServerConfig,\n ProviderType,\n} from './config'\nimport { debug as debugLogger } from './debugLogger'\nimport { safeParseJSON } from './json'\nimport { ensureProxyBypass, hasSystemProxy } from './envConfig'\n\n/**\n * Scope for team config export/import\n */\nexport type TeamConfigScope = 'user' | 'project' | 'all'\n\n/**\n * Standalone skill configuration for team config\n */\nexport type TeamSkillConfig = {\n name: string\n description: string\n content: string // markdown body\n argumentHint?: string\n disableModelInvocation?: boolean\n userInvocable?: boolean\n allowedTools?: string[]\n model?: string\n context?: string\n agent?: string\n}\n\n/**\n * Standalone command configuration for team config\n */\nexport type TeamCommandConfig = {\n name: string\n description?: string\n content: string // markdown body\n aliases?: string[]\n enabled?: boolean\n hidden?: boolean\n progressMessage?: string\n argNames?: string[]\n allowedTools?: string[]\n}\n\n/**\n * Team configuration schema\n * Represents a shareable configuration template for teams\n */\nexport type TeamConfig = {\n version: '1.0'\n name: string // Configuration name (e.g., \"Acme Inc. Default Config\")\n description?: string // Optional description\n scope?: TeamConfigScope // Scope that was used during export\n\n // Model Configuration\n models?: {\n profiles?: TeamModelProfile[]\n pointers?: Partial<ModelPointers> // Default model pointers\n defaultModel?: string // Default model name\n }\n\n // MCP Server Configuration\n mcpServers?: Record<string, TeamMcpServerConfig>\n\n // Plugin Marketplace Configuration\n plugins?: {\n // Plugin marketplace URLs (marketplace.json)\n marketplaces?: string[]\n // Specific plugins to install from marketplaces\n install?: string[] // v1.0 compat: no scope, defaults to user\n userInstall?: string[] // User-scope plugins\n projectInstall?: string[] // Project-scope plugins\n }\n\n // Global Settings\n settings?: {\n theme?: 'dark' | 'light'\n verbose?: boolean\n compressionMode?: 'business' | 'code'\n thinking?: boolean\n proxy?: string\n stream?: boolean\n // \u65B0\u589E\u8BBE\u7F6E\u9879\n language?: 'en' | 'zh-CN'\n safetyMode?: 'yolo' | 'smart' | 'strict' | 'free'\n skipOnboarding?: boolean // \u8DF3\u8FC7\u5165\u95E8\u6D41\u7A0B\n }\n\n // Agent \u914D\u7F6E\uFF08\u5185\u8054\u6216\u8FDC\u7A0B URL\uFF09\n agents?: {\n // \u8FDC\u7A0B agent \u6587\u4EF6 URL \u5217\u8868\n remoteAgents?: string[]\n // \u5185\u8054 agent \u5B9A\u4E49\n inlineAgents?: TeamAgentConfig[] // v1.0 compat: no scope, defaults to user\n userAgents?: TeamAgentConfig[]\n projectAgents?: TeamAgentConfig[]\n }\n\n // Skill \u914D\u7F6E\uFF08standalone skills\uFF09\n skills?: {\n userSkills?: TeamSkillConfig[]\n projectSkills?: TeamSkillConfig[]\n }\n\n // Command \u914D\u7F6E\uFF08standalone commands\uFF09\n commands?: {\n userCommands?: TeamCommandConfig[]\n projectCommands?: TeamCommandConfig[]\n }\n\n // Hook \u914D\u7F6E\n hooks?: TeamHooksConfig // User-scope hooks\n projectHooks?: TeamHooksConfig // Project-scope hooks\n\n // Instructions for users\n postInstallInstructions?: string\n}\n\n/**\n * Model profile template with environment variable support\n */\nexport type TeamModelProfile = {\n name: string\n provider: ProviderType\n modelName: string\n baseURL?: string\n apiKey: string // Can be env var like \"${ANTHROPIC_API_KEY}\"\n maxTokens: number\n contextLength: number\n reasoningEffort?: 'low' | 'medium' | 'high' | 'minimal'\n isActive?: boolean\n}\n\n/**\n * Inline agent configuration for team config\n */\nexport type TeamAgentConfig = {\n name: string // Agent identifier (e.g., \"research-analyst\")\n description: string // When to use this agent\n tools: string[] | '*' // Tool permissions\n systemPrompt: string // System prompt content\n model?: string // Optional model override\n color?: string // Optional UI color\n}\n\n/**\n * Hook configuration for team config\n */\nexport type TeamHooksConfig = {\n // Session lifecycle hooks\n sessionStart?: TeamHookDefinition[]\n sessionEnd?: TeamHookDefinition[]\n // User input hooks\n userPromptSubmit?: TeamHookDefinition[]\n // Tool lifecycle hooks\n preToolUse?: TeamToolHook[]\n postToolUse?: TeamToolHook[]\n}\n\nexport type TeamHookDefinition = {\n type: 'command' | 'prompt'\n command?: string\n prompt?: string\n timeout?: number\n description?: string\n}\n\nexport type TeamToolHook = {\n matcher: string // Tool name regex or \"*\"\n hooks: TeamHookDefinition[]\n}\n\n/**\n * MCP server config with env var support\n */\nexport type TeamMcpServerConfig = {\n type?: 'stdio' | 'sse'\n command?: string // For stdio\n args?: string[] // For stdio, supports env vars like \"${HOME}/.local/bin/mcp-server\"\n url?: string // For SSE\n env?: Record<string, string> // Env vars, supports interpolation\n enabled?: boolean\n}\n\n/**\n * Interpolate environment variables in a string\n * Supports ${VAR_NAME} syntax\n */\nexport function interpolateEnvVars(value: string): string {\n return value.replace(/\\$\\{([^}]+)\\}/g, (match, varName) => {\n const envValue = process.env[varName.trim()]\n if (envValue === undefined) {\n debugLogger.warn('ENV_VAR_NOT_FOUND', {\n varName,\n original: match,\n })\n // Keep the placeholder if env var not found\n return match\n }\n return envValue\n })\n}\n\n/**\n * Recursively interpolate env vars in an object\n */\nexport function interpolateEnvVarsInObject<T>(obj: T): T {\n if (typeof obj === 'string') {\n return interpolateEnvVars(obj) as T\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => interpolateEnvVarsInObject(item)) as T\n }\n\n if (obj && typeof obj === 'object') {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj)) {\n result[key] = interpolateEnvVarsInObject(value)\n }\n return result as T\n }\n\n return obj\n}\n\n/**\n * Convert team model profile to runtime model profile\n */\nexport function convertTeamModelProfile(\n teamProfile: TeamModelProfile,\n): ModelProfile {\n const now = Date.now()\n\n return {\n name: teamProfile.name,\n provider: teamProfile.provider,\n modelName: teamProfile.modelName,\n baseURL: teamProfile.baseURL,\n apiKey: interpolateEnvVars(teamProfile.apiKey),\n maxTokens: teamProfile.maxTokens,\n contextLength: teamProfile.contextLength,\n reasoningEffort: teamProfile.reasoningEffort,\n isActive: teamProfile.isActive ?? true,\n createdAt: now,\n lastUsed: now,\n }\n}\n\n/**\n * Convert team MCP config to runtime MCP config\n */\nexport function convertTeamMcpConfig(\n teamConfig: TeamMcpServerConfig,\n): McpServerConfig {\n if (teamConfig.type === 'sse') {\n return {\n type: 'sse',\n url: interpolateEnvVars(teamConfig.url || ''),\n enabled: teamConfig.enabled ?? true,\n }\n }\n\n // Default to stdio \u2014 auto-inject proxy bypass if system has proxy configured\n const env = teamConfig.env\n ? ensureProxyBypass(interpolateEnvVarsInObject(teamConfig.env))\n : hasSystemProxy()\n ? { no_proxy: '*', NO_PROXY: '*' }\n : undefined\n\n return {\n type: 'stdio',\n command: interpolateEnvVars(teamConfig.command || ''),\n args: (teamConfig.args || []).map(arg => interpolateEnvVars(arg)),\n env,\n enabled: teamConfig.enabled ?? true,\n }\n}\n\n/**\n * Fetch team configuration from a URL\n */\nexport async function fetchTeamConfig(url: string): Promise<TeamConfig> {\n debugLogger.state('TEAM_CONFIG_FETCH_START', { url })\n\n try {\n const response = await fetch(url, {\n signal: AbortSignal.timeout(30_000),\n })\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch config: ${response.status} ${response.statusText}`,\n )\n }\n\n const configText = await response.text()\n const config = JSON.parse(configText) as TeamConfig\n\n // Validate version\n if (config.version !== '1.0') {\n throw new Error(\n `Unsupported config version: ${config.version}. Expected 1.0`,\n )\n }\n\n debugLogger.state('TEAM_CONFIG_FETCH_SUCCESS', {\n url,\n configName: config.name,\n hasModels: !!config.models,\n hasMcpServers: !!config.mcpServers,\n })\n\n return config\n } catch (error) {\n debugLogger.error('TEAM_CONFIG_FETCH_ERROR', {\n url,\n error: error instanceof Error ? error.message : String(error),\n })\n throw error\n }\n}\n\n/**\n * Load team configuration from a local file\n */\nexport function loadTeamConfigFromFile(filePath: string): TeamConfig {\n debugLogger.state('TEAM_CONFIG_LOAD_FILE', { filePath })\n\n if (!existsSync(filePath)) {\n throw new Error(`Configuration file not found: ${filePath}`)\n }\n\n try {\n const configText = readFileSync(filePath, 'utf-8')\n const config = safeParseJSON(configText) as TeamConfig\n\n if (!config) {\n throw new Error('Invalid JSON in configuration file')\n }\n\n if (config.version !== '1.0') {\n throw new Error(\n `Unsupported config version: ${config.version}. Expected 1.0`,\n )\n }\n\n debugLogger.state('TEAM_CONFIG_LOAD_FILE_SUCCESS', {\n filePath,\n configName: config.name,\n })\n\n return config\n } catch (error) {\n debugLogger.error('TEAM_CONFIG_LOAD_FILE_ERROR', {\n filePath,\n error: error instanceof Error ? error.message : String(error),\n })\n throw error\n }\n}\n\n/**\n * Merge strategy for configuration\n */\nexport type MergeStrategy = 'replace' | 'merge' | 'skip-existing'\n\n/**\n * Apply team configuration to global config\n */\nexport function applyTeamConfig(\n teamConfig: TeamConfig,\n strategy: MergeStrategy = 'merge',\n): {\n applied: boolean\n modelsAdded: number\n mcpServersAdded: number\n settingsUpdated: string[]\n} {\n debugLogger.state('TEAM_CONFIG_APPLY_START', {\n configName: teamConfig.name,\n strategy,\n })\n\n const globalConfig = getGlobalConfig()\n let modelsAdded = 0\n let mcpServersAdded = 0\n const settingsUpdated: string[] = []\n\n // Apply model profiles\n if (teamConfig.models?.profiles) {\n const existingProfiles = globalConfig.modelProfiles || []\n const existingModelNames = new Set(existingProfiles.map(p => p.modelName))\n\n for (const teamProfile of teamConfig.models.profiles) {\n const runtimeProfile = convertTeamModelProfile(teamProfile)\n\n if (\n strategy === 'skip-existing' &&\n existingModelNames.has(runtimeProfile.modelName)\n ) {\n debugLogger.state('TEAM_CONFIG_SKIP_MODEL', {\n modelName: runtimeProfile.modelName,\n reason: 'already_exists',\n })\n continue\n }\n\n if (strategy === 'replace') {\n // Remove existing profile with same modelName\n const index = existingProfiles.findIndex(\n p => p.modelName === runtimeProfile.modelName,\n )\n if (index !== -1) {\n existingProfiles.splice(index, 1)\n }\n }\n\n existingProfiles.push(runtimeProfile)\n modelsAdded++\n\n debugLogger.state('TEAM_CONFIG_ADD_MODEL', {\n modelName: runtimeProfile.modelName,\n provider: runtimeProfile.provider,\n })\n }\n\n globalConfig.modelProfiles = existingProfiles\n }\n\n // Apply model pointers\n if (teamConfig.models?.pointers) {\n globalConfig.modelPointers = {\n ...(globalConfig.modelPointers || {\n main: '',\n task: '',\n reasoning: '',\n quick: '',\n compact: '',\n }),\n ...teamConfig.models.pointers,\n }\n settingsUpdated.push('modelPointers')\n }\n\n // Apply default model\n if (teamConfig.models?.defaultModel) {\n globalConfig.defaultModelName = teamConfig.models.defaultModel\n settingsUpdated.push('defaultModelName')\n }\n\n // Apply MCP servers\n if (teamConfig.mcpServers) {\n const existingMcpServers = globalConfig.mcpServers || {}\n const existingServerNames = new Set(Object.keys(existingMcpServers))\n\n for (const [serverName, teamMcpConfig] of Object.entries(\n teamConfig.mcpServers,\n )) {\n if (strategy === 'skip-existing' && existingServerNames.has(serverName)) {\n debugLogger.state('TEAM_CONFIG_SKIP_MCP', {\n serverName,\n reason: 'already_exists',\n })\n continue\n }\n\n const runtimeMcpConfig = convertTeamMcpConfig(teamMcpConfig)\n existingMcpServers[serverName] = runtimeMcpConfig\n mcpServersAdded++\n\n debugLogger.state('TEAM_CONFIG_ADD_MCP', {\n serverName,\n type: runtimeMcpConfig.type || 'stdio',\n })\n }\n\n globalConfig.mcpServers = existingMcpServers\n }\n\n // Apply global settings\n if (teamConfig.settings) {\n const { settings } = teamConfig\n\n if (settings.theme !== undefined) {\n globalConfig.theme = settings.theme\n settingsUpdated.push('theme')\n }\n\n if (settings.verbose !== undefined) {\n globalConfig.verbose = settings.verbose\n settingsUpdated.push('verbose')\n }\n\n if (settings.compressionMode !== undefined) {\n globalConfig.compressionMode = settings.compressionMode\n settingsUpdated.push('compressionMode')\n }\n\n if (settings.thinking !== undefined) {\n globalConfig.thinking = settings.thinking\n settingsUpdated.push('thinking')\n }\n\n if (settings.proxy !== undefined) {\n globalConfig.proxy = settings.proxy\n settingsUpdated.push('proxy')\n }\n\n if (settings.stream !== undefined) {\n globalConfig.stream = settings.stream\n settingsUpdated.push('stream')\n }\n\n if (settings.language !== undefined) {\n globalConfig.language = settings.language\n settingsUpdated.push('language')\n }\n\n if (settings.safetyMode !== undefined) {\n globalConfig.safetyMode = settings.safetyMode\n settingsUpdated.push('safetyMode')\n }\n\n if (settings.skipOnboarding) {\n globalConfig.hasCompletedOnboarding = true\n settingsUpdated.push('hasCompletedOnboarding')\n }\n }\n\n // Save updated config\n saveGlobalConfig(globalConfig)\n\n debugLogger.state('TEAM_CONFIG_APPLY_SUCCESS', {\n configName: teamConfig.name,\n modelsAdded,\n mcpServersAdded,\n settingsUpdated: settingsUpdated.join(', '),\n })\n\n return {\n applied: true,\n modelsAdded,\n mcpServersAdded,\n settingsUpdated,\n }\n}\n\n/**\n * Add marketplaces from URLs\n */\nexport async function addMarketplaces(\n marketplaceUrls: string[],\n): Promise<{ added: number; failed: number; errors: string[] }> {\n let added = 0\n let failed = 0\n const errors: string[] = []\n\n // Import marketplace manager\n const { addMarketplace } = await import('./marketplaceManager')\n\n for (const url of marketplaceUrls) {\n try {\n debugLogger.state('TEAM_CONFIG_ADD_MARKETPLACE', { url })\n\n await addMarketplace(url)\n added++\n\n debugLogger.state('TEAM_CONFIG_ADD_MARKETPLACE_SUCCESS', { url })\n } catch (error) {\n failed++\n const errorMsg = error instanceof Error ? error.message : String(error)\n errors.push(`${url}: ${errorMsg}`)\n\n debugLogger.error('TEAM_CONFIG_ADD_MARKETPLACE_ERROR', {\n url,\n error: errorMsg,\n })\n }\n }\n\n return { added, failed, errors }\n}\n\n/**\n * Install plugins from marketplaces\n */\nexport async function installPlugins(\n pluginNames: string[],\n targetDir?: string,\n): Promise<{ installed: number; failed: number; errors: string[] }> {\n let installed = 0\n let failed = 0\n const errors: string[] = []\n\n // Import marketplace manager and path utilities\n const { installPluginFromMarketplace } = await import('./marketplaceManager')\n const { join } = await import('path')\n const { homedir } = await import('os')\n\n // Default target: ~/.minto/plugins\n const installDir = targetDir || join(homedir(), '.minto', 'plugins')\n\n for (const pluginSpec of pluginNames) {\n // Parse name@marketplace format (e.g., \"backend-development@claude-code-workflows\")\n const atIndex = pluginSpec.indexOf('@')\n const pluginName =\n atIndex !== -1 ? pluginSpec.slice(0, atIndex) : pluginSpec\n const marketplaceName =\n atIndex !== -1 ? pluginSpec.slice(atIndex + 1) : undefined\n\n try {\n debugLogger.state('TEAM_CONFIG_INSTALL_PLUGIN', {\n pluginName,\n marketplace: marketplaceName,\n targetDir: installDir,\n })\n\n await installPluginFromMarketplace(\n pluginName,\n marketplaceName,\n join(installDir, pluginName),\n )\n\n installed++\n debugLogger.state('TEAM_CONFIG_INSTALL_PLUGIN_SUCCESS', { pluginName })\n } catch (error) {\n failed++\n const errorMsg = error instanceof Error ? error.message : String(error)\n errors.push(`${pluginName}: ${errorMsg}`)\n\n debugLogger.error('TEAM_CONFIG_INSTALL_PLUGIN_ERROR', {\n pluginName,\n error: errorMsg,\n })\n }\n }\n\n return { installed, failed, errors }\n}\n\n/**\n * Download and install remote agents\n */\nexport async function installRemoteAgents(\n agentUrls: string[],\n targetDir?: string,\n): Promise<{ installed: number; failed: number; errors: string[] }> {\n let installed = 0\n let failed = 0\n const errors: string[] = []\n\n const { join } = await import('path')\n const { homedir } = await import('os')\n const { writeFileSync, mkdirSync, existsSync } = await import('fs')\n\n // Target: specified dir or ~/.minto/agents\n const agentsDir = targetDir || join(homedir(), '.minto', 'agents')\n if (!existsSync(agentsDir)) {\n mkdirSync(agentsDir, { recursive: true })\n }\n\n for (const url of agentUrls) {\n try {\n debugLogger.state('TEAM_CONFIG_DOWNLOAD_AGENT', { url })\n\n const response = await fetch(url, {\n signal: AbortSignal.timeout(30_000),\n })\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const content = await response.text()\n\n // Extract filename from URL\n const filename = url.split('/').pop() || 'agent.md'\n const targetPath = join(agentsDir, filename)\n\n writeFileSync(targetPath, content, 'utf-8')\n installed++\n\n debugLogger.state('TEAM_CONFIG_DOWNLOAD_AGENT_SUCCESS', {\n url,\n targetPath,\n })\n } catch (error) {\n failed++\n const errorMsg = error instanceof Error ? error.message : String(error)\n errors.push(`${url}: ${errorMsg}`)\n\n debugLogger.error('TEAM_CONFIG_DOWNLOAD_AGENT_ERROR', {\n url,\n error: errorMsg,\n })\n }\n }\n\n return { installed, failed, errors }\n}\n\n/**\n * Install inline agents from team config\n */\nexport async function installInlineAgents(\n agents: TeamAgentConfig[],\n targetDir?: string,\n): Promise<{ installed: number; failed: number; errors: string[] }> {\n let installed = 0\n let failed = 0\n const errors: string[] = []\n\n const { join } = await import('path')\n const { homedir } = await import('os')\n const { writeFileSync, mkdirSync, existsSync } = await import('fs')\n\n // Target: specified dir or ~/.minto/agents\n const agentsDir = targetDir || join(homedir(), '.minto', 'agents')\n if (!existsSync(agentsDir)) {\n mkdirSync(agentsDir, { recursive: true })\n }\n\n for (const agent of agents) {\n try {\n debugLogger.state('TEAM_CONFIG_INSTALL_INLINE_AGENT', {\n name: agent.name,\n })\n\n // Generate agent markdown file\n const tools = agent.tools === '*' ? '*' : JSON.stringify(agent.tools)\n\n const content = `---\nname: ${agent.name}\ndescription: \"${agent.description.replace(/\"/g, '\\\\\"')}\"\ntools: ${tools}${agent.model ? `\\nmodel_name: ${agent.model}` : ''}${agent.color ? `\\ncolor: \"${agent.color}\"` : ''}\n---\n\n${agent.systemPrompt}\n`\n\n const filename = `${agent.name}.md`\n const targetPath = join(agentsDir, filename)\n\n writeFileSync(targetPath, content, 'utf-8')\n installed++\n\n debugLogger.state('TEAM_CONFIG_INSTALL_INLINE_AGENT_SUCCESS', {\n name: agent.name,\n targetPath,\n })\n } catch (error) {\n failed++\n const errorMsg = error instanceof Error ? error.message : String(error)\n errors.push(`${agent.name}: ${errorMsg}`)\n\n debugLogger.error('TEAM_CONFIG_INSTALL_INLINE_AGENT_ERROR', {\n name: agent.name,\n error: errorMsg,\n })\n }\n }\n\n return { installed, failed, errors }\n}\n\n/**\n * Install hooks from team config\n */\nexport async function installTeamHooks(\n hooks: TeamHooksConfig,\n targetPath?: string,\n): Promise<{ installed: boolean; error?: string }> {\n const { join, dirname } = await import('path')\n const { homedir } = await import('os')\n const { writeFileSync, mkdirSync, existsSync, readFileSync } = await import(\n 'fs'\n )\n\n try {\n debugLogger.state('TEAM_CONFIG_INSTALL_HOOKS', {})\n\n // Target: specified path or ~/.minto/hooks.json\n const hooksPath = targetPath || join(homedir(), '.minto', 'hooks.json')\n const hooksDir = dirname(hooksPath)\n if (!existsSync(hooksDir)) {\n mkdirSync(hooksDir, { recursive: true })\n }\n\n // Convert TeamHooksConfig to standard hooks format\n const hooksConfig: Record<string, unknown> = {\n description: 'Team-configured hooks',\n hooks: {} as Record<string, unknown>,\n }\n\n const hooksObj = hooksConfig.hooks as Record<string, unknown>\n\n if (hooks.sessionStart) {\n hooksObj.SessionStart = [{ matcher: '*', hooks: hooks.sessionStart }]\n }\n if (hooks.sessionEnd) {\n hooksObj.SessionEnd = [{ matcher: '*', hooks: hooks.sessionEnd }]\n }\n if (hooks.userPromptSubmit) {\n hooksObj.UserPromptSubmit = [\n { matcher: '*', hooks: hooks.userPromptSubmit },\n ]\n }\n if (hooks.preToolUse) {\n hooksObj.PreToolUse = hooks.preToolUse\n }\n if (hooks.postToolUse) {\n hooksObj.PostToolUse = hooks.postToolUse\n }\n\n // Merge with existing hooks if present\n if (existsSync(hooksPath)) {\n try {\n const existingContent = readFileSync(hooksPath, 'utf-8')\n const existingHooks = JSON.parse(existingContent)\n // Deep merge\n for (const [event, matchers] of Object.entries(hooksObj)) {\n if (existingHooks.hooks?.[event]) {\n existingHooks.hooks[event] = [\n ...existingHooks.hooks[event],\n ...(matchers as unknown[]),\n ]\n } else {\n existingHooks.hooks = existingHooks.hooks || {}\n existingHooks.hooks[event] = matchers\n }\n }\n hooksConfig.hooks = existingHooks.hooks\n } catch {\n // If parsing fails, overwrite\n }\n }\n\n writeFileSync(hooksPath, JSON.stringify(hooksConfig, null, 2), 'utf-8')\n\n debugLogger.state('TEAM_CONFIG_INSTALL_HOOKS_SUCCESS', { hooksPath })\n\n return { installed: true }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n debugLogger.error('TEAM_CONFIG_INSTALL_HOOKS_ERROR', { error: errorMsg })\n return { installed: false, error: errorMsg }\n }\n}\n\n/**\n * Install standalone skills from team config\n */\nexport async function installInlineSkills(\n skills: TeamSkillConfig[],\n targetDir?: string,\n): Promise<{ installed: number; failed: number; errors: string[] }> {\n let installed = 0\n let failed = 0\n const errors: string[] = []\n\n const { join } = await import('path')\n const { homedir } = await import('os')\n const { writeFileSync, mkdirSync, existsSync } = await import('fs')\n\n // Target: specified dir or ~/.minto/skills\n const skillsDir = targetDir || join(homedir(), '.minto', 'skills')\n if (!existsSync(skillsDir)) {\n mkdirSync(skillsDir, { recursive: true })\n }\n\n for (const skill of skills) {\n try {\n debugLogger.state('TEAM_CONFIG_INSTALL_SKILL', { name: skill.name })\n\n // Build frontmatter\n const frontmatterLines: string[] = [\n `name: ${skill.name}`,\n `description: \"${skill.description.replace(/\"/g, '\\\\\"')}\"`,\n ]\n if (skill.argumentHint) {\n frontmatterLines.push(`argument-hint: \"${skill.argumentHint}\"`)\n }\n if (skill.disableModelInvocation !== undefined) {\n frontmatterLines.push(\n `disable-model-invocation: ${skill.disableModelInvocation}`,\n )\n }\n if (skill.userInvocable !== undefined) {\n frontmatterLines.push(`user-invocable: ${skill.userInvocable}`)\n }\n if (skill.allowedTools && skill.allowedTools.length > 0) {\n frontmatterLines.push(\n `allowed-tools: ${JSON.stringify(skill.allowedTools)}`,\n )\n }\n if (skill.model) {\n frontmatterLines.push(`model: ${skill.model}`)\n }\n if (skill.context) {\n frontmatterLines.push(`context: \"${skill.context}\"`)\n }\n if (skill.agent) {\n frontmatterLines.push(`agent: \"${skill.agent}\"`)\n }\n\n const content = `---\\n${frontmatterLines.join('\\n')}\\n---\\n\\n${skill.content}\\n`\n\n const filename = `${skill.name}.md`\n const targetPath = join(skillsDir, filename)\n\n writeFileSync(targetPath, content, 'utf-8')\n installed++\n\n debugLogger.state('TEAM_CONFIG_INSTALL_SKILL_SUCCESS', {\n name: skill.name,\n targetPath,\n })\n } catch (error) {\n failed++\n const errorMsg = error instanceof Error ? error.message : String(error)\n errors.push(`${skill.name}: ${errorMsg}`)\n\n debugLogger.error('TEAM_CONFIG_INSTALL_SKILL_ERROR', {\n name: skill.name,\n error: errorMsg,\n })\n }\n }\n\n return { installed, failed, errors }\n}\n\n/**\n * Install standalone commands from team config\n */\nexport async function installInlineCommands(\n commands: TeamCommandConfig[],\n targetDir?: string,\n): Promise<{ installed: number; failed: number; errors: string[] }> {\n let installed = 0\n let failed = 0\n const errors: string[] = []\n\n const { join } = await import('path')\n const { homedir } = await import('os')\n const { writeFileSync, mkdirSync, existsSync } = await import('fs')\n\n // Target: specified dir or ~/.minto/commands\n const commandsDir = targetDir || join(homedir(), '.minto', 'commands')\n if (!existsSync(commandsDir)) {\n mkdirSync(commandsDir, { recursive: true })\n }\n\n for (const cmd of commands) {\n try {\n debugLogger.state('TEAM_CONFIG_INSTALL_COMMAND', { name: cmd.name })\n\n // Build frontmatter\n const frontmatterLines: string[] = [`name: ${cmd.name}`]\n if (cmd.description) {\n frontmatterLines.push(\n `description: \"${cmd.description.replace(/\"/g, '\\\\\"')}\"`,\n )\n }\n if (cmd.aliases && cmd.aliases.length > 0) {\n frontmatterLines.push(`aliases: ${JSON.stringify(cmd.aliases)}`)\n }\n if (cmd.enabled !== undefined) {\n frontmatterLines.push(`enabled: ${cmd.enabled}`)\n }\n if (cmd.hidden !== undefined) {\n frontmatterLines.push(`hidden: ${cmd.hidden}`)\n }\n if (cmd.progressMessage) {\n frontmatterLines.push(`progressMessage: \"${cmd.progressMessage}\"`)\n }\n if (cmd.argNames && cmd.argNames.length > 0) {\n frontmatterLines.push(`argNames: ${JSON.stringify(cmd.argNames)}`)\n }\n if (cmd.allowedTools && cmd.allowedTools.length > 0) {\n frontmatterLines.push(\n `allowed-tools: ${JSON.stringify(cmd.allowedTools)}`,\n )\n }\n\n const content = `---\\n${frontmatterLines.join('\\n')}\\n---\\n\\n${cmd.content}\\n`\n\n const filename = `${cmd.name}.md`\n const targetPath = join(commandsDir, filename)\n\n writeFileSync(targetPath, content, 'utf-8')\n installed++\n\n debugLogger.state('TEAM_CONFIG_INSTALL_COMMAND_SUCCESS', {\n name: cmd.name,\n targetPath,\n })\n } catch (error) {\n failed++\n const errorMsg = error instanceof Error ? error.message : String(error)\n errors.push(`${cmd.name}: ${errorMsg}`)\n\n debugLogger.error('TEAM_CONFIG_INSTALL_COMMAND_ERROR', {\n name: cmd.name,\n error: errorMsg,\n })\n }\n }\n\n return { installed, failed, errors }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["existsSync", "readFileSync"]
7
7
  }
@@ -93,12 +93,6 @@ const SAFE_BASH_PATTERNS = [
93
93
  /^docker-compose\s+(ps|logs|config|up|down|build|pull|restart)/i,
94
94
  // Kubernetes (read-only)
95
95
  /^kubectl\s+(get|describe|logs|explain|version|config|cluster-info)/i,
96
- // Environment and shell
97
- /^env$/i,
98
- /^printenv/i,
99
- /^export\s/i,
100
- /^source\s/i,
101
- /^\.\s/i,
102
96
  // Process viewing
103
97
  /^ps(\s|$)/i,
104
98
  /^top$/i,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/toolRiskClassification.ts"],
4
- "sourcesContent": ["/**\n * Tool Risk Classification System\n *\n * Classifies tools into three risk levels for the Smart Safety Mode:\n * - safe: Read-only operations, no side effects\n * - monitored: Has side effects but reversible/low risk\n * - dangerous: Potentially destructive, requires confirmation\n */\n\nexport type RiskLevel = 'safe' | 'monitored' | 'dangerous'\n\n/**\n * Default risk levels for each tool type\n */\nexport const TOOL_RISK_LEVELS: Record<string, RiskLevel> = {\n // \uD83D\uDFE2 Safe layer: Read-only, no side effects\n Read: 'safe',\n Glob: 'safe',\n Grep: 'safe',\n LS: 'safe',\n WebSearch: 'safe',\n WebFetch: 'safe',\n Think: 'safe',\n AskUserQuestion: 'safe',\n MemoryRead: 'safe',\n NotebookRead: 'safe',\n TaskOutput: 'safe',\n EnterPlanMode: 'safe',\n ExitPlanMode: 'safe',\n TaskList: 'safe',\n TaskGet: 'safe',\n Skill: 'safe',\n\n // \uD83D\uDFE1 Monitored layer: Has side effects but reversible/low risk\n Edit: 'monitored',\n Write: 'monitored',\n NotebookEdit: 'monitored',\n MemoryWrite: 'monitored',\n TodoWrite: 'monitored',\n Task: 'monitored',\n TaskCreate: 'monitored',\n TaskUpdate: 'monitored',\n TaskStop: 'monitored',\n\n // \uD83D\uDD34 Dangerous layer: Requires confirmation (Bash handled separately)\n Bash: 'dangerous',\n MCPTool: 'dangerous',\n}\n\n/**\n * Safe Bash command patterns - automatically allowed even in Smart/Strict mode\n * These patterns match common development commands that are low-risk\n */\nexport const SAFE_BASH_PATTERNS: RegExp[] = [\n // Git - all common operations\n /^git\\s+(status|diff|log|branch|show|remote|fetch|pull|push|commit|add|checkout|merge|rebase|stash|tag|clone|init|config|rev-parse|symbolic-ref)/i,\n\n // File viewing (read-only)\n /^ls(\\s|$)/i,\n /^cat\\s/i,\n /^head\\s/i,\n /^tail\\s/i,\n /^pwd$/i,\n /^echo\\s/i,\n /^which\\s/i,\n /^tree(\\s|$)/i,\n /^date$/i,\n /^whoami$/i,\n /^find\\s/i,\n /^wc\\s/i,\n /^grep\\s/i,\n /^rg\\s/i,\n /^less\\s/i,\n /^more\\s/i,\n /^file\\s/i,\n /^stat\\s/i,\n /^du\\s/i,\n /^df\\s/i,\n\n // Package managers - common development operations\n /^npm\\s+(install|i|ci|run|test|start|build|list|ls|outdated|view|info|init|publish|pack|version|audit|dedupe)/i,\n /^npx\\s/i,\n /^bun\\s+(install|i|add|remove|run|test|build|pm|create|init|link|unlink|update|outdated)/i,\n /^bunx\\s/i,\n /^yarn\\s+(install|add|remove|run|test|build|init|create|link|unlink|upgrade|outdated)/i,\n /^pnpm\\s+(install|i|add|remove|run|test|build|init|create|link|unlink|update|outdated)/i,\n /^pip\\s+(install|list|show|freeze|check)/i,\n /^pip3\\s+(install|list|show|freeze|check)/i,\n /^poetry\\s+(install|add|remove|run|build|init|check|show)/i,\n /^cargo\\s+(build|run|test|check|clippy|fmt|doc|bench|new|init|add|remove)/i,\n /^go\\s+(build|run|test|get|mod|fmt|vet|generate)/i,\n /^composer\\s+(install|require|remove|update|dump-autoload)/i,\n /^gem\\s+(install|list|update)/i,\n /^bundle\\s+(install|exec|update)/i,\n\n // Version queries\n /^(node|npm|bun|yarn|pnpm|python|python3|pip|pip3|cargo|rustc|go|java|ruby|php)\\s+(--version|-v|-V)$/i,\n /^(node|npm|bun|yarn|pnpm|python|python3|pip|pip3|cargo|rustc|go|java|ruby|php)\\s+-version$/i,\n\n // Build and test tools\n /^make(\\s|$)/i,\n /^cmake\\s/i,\n /^ninja(\\s|$)/i,\n /^pytest(\\s|$)/i,\n /^jest(\\s|$)/i,\n /^vitest(\\s|$)/i,\n /^mocha(\\s|$)/i,\n /^ava(\\s|$)/i,\n /^tape(\\s|$)/i,\n /^tap(\\s|$)/i,\n /^tsc(\\s|$)/i,\n /^eslint(\\s|$)/i,\n /^prettier(\\s|$)/i,\n /^biome(\\s|$)/i,\n\n // Docker (read-only and common operations)\n /^docker\\s+(ps|images|logs|inspect|version|info|stats|top|port|diff)/i,\n /^docker\\s+(build|run|exec|pull|push|start|stop|restart)/i,\n /^docker-compose\\s+(ps|logs|config|up|down|build|pull|restart)/i,\n\n // Kubernetes (read-only)\n /^kubectl\\s+(get|describe|logs|explain|version|config|cluster-info)/i,\n\n // Environment and shell\n /^env$/i,\n /^printenv/i,\n /^export\\s/i,\n /^source\\s/i,\n /^\\.\\s/i,\n\n // Process viewing\n /^ps(\\s|$)/i,\n /^top$/i,\n /^htop$/i,\n\n // Network diagnostics (read-only)\n /^ping\\s/i,\n /^traceroute\\s/i,\n /^dig\\s/i,\n /^nslookup\\s/i,\n /^host\\s/i,\n /^ifconfig$/i,\n /^ip\\s+(addr|link|route)/i,\n\n // Archive viewing\n /^tar\\s+(-t|--list)/i,\n /^unzip\\s+-l/i,\n /^zipinfo\\s/i,\n\n // Text processing\n /^sort(\\s|$)/i,\n /^uniq(\\s|$)/i,\n /^cut(\\s|$)/i,\n /^awk\\s/i,\n /^sed\\s/i,\n /^tr\\s/i,\n /^diff\\s/i,\n /^md5sum\\s/i,\n /^sha256sum\\s/i,\n\n // Directory operations (safe)\n /^mkdir\\s/i,\n /^touch\\s/i,\n /^cp\\s/i,\n /^mv\\s/i,\n]\n\n/**\n * Dangerous Bash command patterns - always require confirmation\n * These patterns match potentially destructive commands\n */\nexport const DANGEROUS_BASH_PATTERNS: RegExp[] = [\n // File deletion\n /\\brm\\s/i,\n /\\brmdir\\s/i,\n /\\bunlink\\s/i,\n\n // Privilege escalation\n /\\bsudo\\s/i,\n /\\bsu\\s/i,\n /\\bdoas\\s/i,\n /\\bpkexec\\s/i,\n\n // Permission changes\n /\\bchmod\\s/i,\n /\\bchown\\s/i,\n /\\bchgrp\\s/i,\n\n // Disk operations\n /\\bmkfs\\b/i,\n /\\bfdisk\\s/i,\n /\\bparted\\s/i,\n /\\bdd\\s+if=/i,\n /\\bshred\\s/i,\n\n // System control\n /\\bsystemctl\\s/i,\n /\\bservice\\s/i,\n /\\breboot\\b/i,\n /\\bshutdown\\s/i,\n /\\bhalt\\b/i,\n /\\bpoweroff\\b/i,\n\n // Dangerous redirections\n />\\s*\\/(?!tmp|dev\\/null)/i, // Redirect to root paths (except /tmp and /dev/null)\n />\\s*~\\//i, // Redirect to home directory paths\n\n // Shell execution from network\n /\\|\\s*(bash|sh|zsh|fish)/i,\n /curl.*\\|\\s*(bash|sh)/i,\n /wget.*\\|\\s*(bash|sh)/i,\n\n // Environment destruction\n /\\bkillall\\s/i,\n /\\bpkill\\s/i,\n /kill\\s+-9/i,\n\n // Network dangerous\n /\\bnc\\s+-l/i, // netcat listen mode\n /\\biptables\\s/i,\n /\\bufw\\s/i,\n\n // Crontab\n /\\bcrontab\\s+-r/i,\n\n // Git destructive\n /\\bgit\\s+(reset\\s+--hard|clean\\s+-f|push\\s+--force|push\\s+-f)/i,\n]\n\n/**\n * Classify a Bash command into a risk level\n *\n * @param command The bash command to classify\n * @returns The risk level of the command\n */\nexport function classifyBashCommand(command: string): RiskLevel {\n // Trim and normalize whitespace\n const normalizedCommand = command.trim().replace(/\\s+/g, ' ')\n\n // Check dangerous patterns first (higher priority)\n if (DANGEROUS_BASH_PATTERNS.some(p => p.test(normalizedCommand))) {\n return 'dangerous'\n }\n\n // Check safe patterns\n if (SAFE_BASH_PATTERNS.some(p => p.test(normalizedCommand))) {\n return 'safe'\n }\n\n // Default to monitored (allows in Smart mode, asks in Strict mode)\n return 'monitored'\n}\n\n/**\n * Get the risk level for a tool\n *\n * @param toolName The name of the tool\n * @param input Optional tool input for command-specific classification\n * @returns The risk level of the tool\n */\nexport function getToolRiskLevel(\n toolName: string,\n input?: { command?: string },\n): RiskLevel {\n // Special handling for Bash commands\n if (toolName === 'Bash' && input?.command) {\n return classifyBashCommand(input.command)\n }\n\n // Look up in the static table\n return TOOL_RISK_LEVELS[toolName] ?? 'dangerous'\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Tool Risk Classification System\n *\n * Classifies tools into three risk levels for the Smart Safety Mode:\n * - safe: Read-only operations, no side effects\n * - monitored: Has side effects but reversible/low risk\n * - dangerous: Potentially destructive, requires confirmation\n */\n\nexport type RiskLevel = 'safe' | 'monitored' | 'dangerous'\n\n/**\n * Default risk levels for each tool type\n */\nexport const TOOL_RISK_LEVELS: Record<string, RiskLevel> = {\n // \uD83D\uDFE2 Safe layer: Read-only, no side effects\n Read: 'safe',\n Glob: 'safe',\n Grep: 'safe',\n LS: 'safe',\n WebSearch: 'safe',\n WebFetch: 'safe',\n Think: 'safe',\n AskUserQuestion: 'safe',\n MemoryRead: 'safe',\n NotebookRead: 'safe',\n TaskOutput: 'safe',\n EnterPlanMode: 'safe',\n ExitPlanMode: 'safe',\n TaskList: 'safe',\n TaskGet: 'safe',\n Skill: 'safe',\n\n // \uD83D\uDFE1 Monitored layer: Has side effects but reversible/low risk\n Edit: 'monitored',\n Write: 'monitored',\n NotebookEdit: 'monitored',\n MemoryWrite: 'monitored',\n TodoWrite: 'monitored',\n Task: 'monitored',\n TaskCreate: 'monitored',\n TaskUpdate: 'monitored',\n TaskStop: 'monitored',\n\n // \uD83D\uDD34 Dangerous layer: Requires confirmation (Bash handled separately)\n Bash: 'dangerous',\n MCPTool: 'dangerous',\n}\n\n/**\n * Safe Bash command patterns - automatically allowed even in Smart/Strict mode\n * These patterns match common development commands that are low-risk\n */\nexport const SAFE_BASH_PATTERNS: RegExp[] = [\n // Git - all common operations\n /^git\\s+(status|diff|log|branch|show|remote|fetch|pull|push|commit|add|checkout|merge|rebase|stash|tag|clone|init|config|rev-parse|symbolic-ref)/i,\n\n // File viewing (read-only)\n /^ls(\\s|$)/i,\n /^cat\\s/i,\n /^head\\s/i,\n /^tail\\s/i,\n /^pwd$/i,\n /^echo\\s/i,\n /^which\\s/i,\n /^tree(\\s|$)/i,\n /^date$/i,\n /^whoami$/i,\n /^find\\s/i,\n /^wc\\s/i,\n /^grep\\s/i,\n /^rg\\s/i,\n /^less\\s/i,\n /^more\\s/i,\n /^file\\s/i,\n /^stat\\s/i,\n /^du\\s/i,\n /^df\\s/i,\n\n // Package managers - common development operations\n /^npm\\s+(install|i|ci|run|test|start|build|list|ls|outdated|view|info|init|publish|pack|version|audit|dedupe)/i,\n /^npx\\s/i,\n /^bun\\s+(install|i|add|remove|run|test|build|pm|create|init|link|unlink|update|outdated)/i,\n /^bunx\\s/i,\n /^yarn\\s+(install|add|remove|run|test|build|init|create|link|unlink|upgrade|outdated)/i,\n /^pnpm\\s+(install|i|add|remove|run|test|build|init|create|link|unlink|update|outdated)/i,\n /^pip\\s+(install|list|show|freeze|check)/i,\n /^pip3\\s+(install|list|show|freeze|check)/i,\n /^poetry\\s+(install|add|remove|run|build|init|check|show)/i,\n /^cargo\\s+(build|run|test|check|clippy|fmt|doc|bench|new|init|add|remove)/i,\n /^go\\s+(build|run|test|get|mod|fmt|vet|generate)/i,\n /^composer\\s+(install|require|remove|update|dump-autoload)/i,\n /^gem\\s+(install|list|update)/i,\n /^bundle\\s+(install|exec|update)/i,\n\n // Version queries\n /^(node|npm|bun|yarn|pnpm|python|python3|pip|pip3|cargo|rustc|go|java|ruby|php)\\s+(--version|-v|-V)$/i,\n /^(node|npm|bun|yarn|pnpm|python|python3|pip|pip3|cargo|rustc|go|java|ruby|php)\\s+-version$/i,\n\n // Build and test tools\n /^make(\\s|$)/i,\n /^cmake\\s/i,\n /^ninja(\\s|$)/i,\n /^pytest(\\s|$)/i,\n /^jest(\\s|$)/i,\n /^vitest(\\s|$)/i,\n /^mocha(\\s|$)/i,\n /^ava(\\s|$)/i,\n /^tape(\\s|$)/i,\n /^tap(\\s|$)/i,\n /^tsc(\\s|$)/i,\n /^eslint(\\s|$)/i,\n /^prettier(\\s|$)/i,\n /^biome(\\s|$)/i,\n\n // Docker (read-only and common operations)\n /^docker\\s+(ps|images|logs|inspect|version|info|stats|top|port|diff)/i,\n /^docker\\s+(build|run|exec|pull|push|start|stop|restart)/i,\n /^docker-compose\\s+(ps|logs|config|up|down|build|pull|restart)/i,\n\n // Kubernetes (read-only)\n /^kubectl\\s+(get|describe|logs|explain|version|config|cluster-info)/i,\n\n // Process viewing\n /^ps(\\s|$)/i,\n /^top$/i,\n /^htop$/i,\n\n // Network diagnostics (read-only)\n /^ping\\s/i,\n /^traceroute\\s/i,\n /^dig\\s/i,\n /^nslookup\\s/i,\n /^host\\s/i,\n /^ifconfig$/i,\n /^ip\\s+(addr|link|route)/i,\n\n // Archive viewing\n /^tar\\s+(-t|--list)/i,\n /^unzip\\s+-l/i,\n /^zipinfo\\s/i,\n\n // Text processing\n /^sort(\\s|$)/i,\n /^uniq(\\s|$)/i,\n /^cut(\\s|$)/i,\n /^awk\\s/i,\n /^sed\\s/i,\n /^tr\\s/i,\n /^diff\\s/i,\n /^md5sum\\s/i,\n /^sha256sum\\s/i,\n\n // Directory operations (safe)\n /^mkdir\\s/i,\n /^touch\\s/i,\n /^cp\\s/i,\n /^mv\\s/i,\n]\n\n/**\n * Dangerous Bash command patterns - always require confirmation\n * These patterns match potentially destructive commands\n */\nexport const DANGEROUS_BASH_PATTERNS: RegExp[] = [\n // File deletion\n /\\brm\\s/i,\n /\\brmdir\\s/i,\n /\\bunlink\\s/i,\n\n // Privilege escalation\n /\\bsudo\\s/i,\n /\\bsu\\s/i,\n /\\bdoas\\s/i,\n /\\bpkexec\\s/i,\n\n // Permission changes\n /\\bchmod\\s/i,\n /\\bchown\\s/i,\n /\\bchgrp\\s/i,\n\n // Disk operations\n /\\bmkfs\\b/i,\n /\\bfdisk\\s/i,\n /\\bparted\\s/i,\n /\\bdd\\s+if=/i,\n /\\bshred\\s/i,\n\n // System control\n /\\bsystemctl\\s/i,\n /\\bservice\\s/i,\n /\\breboot\\b/i,\n /\\bshutdown\\s/i,\n /\\bhalt\\b/i,\n /\\bpoweroff\\b/i,\n\n // Dangerous redirections\n />\\s*\\/(?!tmp|dev\\/null)/i, // Redirect to root paths (except /tmp and /dev/null)\n />\\s*~\\//i, // Redirect to home directory paths\n\n // Shell execution from network\n /\\|\\s*(bash|sh|zsh|fish)/i,\n /curl.*\\|\\s*(bash|sh)/i,\n /wget.*\\|\\s*(bash|sh)/i,\n\n // Environment destruction\n /\\bkillall\\s/i,\n /\\bpkill\\s/i,\n /kill\\s+-9/i,\n\n // Network dangerous\n /\\bnc\\s+-l/i, // netcat listen mode\n /\\biptables\\s/i,\n /\\bufw\\s/i,\n\n // Crontab\n /\\bcrontab\\s+-r/i,\n\n // Git destructive\n /\\bgit\\s+(reset\\s+--hard|clean\\s+-f|push\\s+--force|push\\s+-f)/i,\n]\n\n/**\n * Classify a Bash command into a risk level\n *\n * @param command The bash command to classify\n * @returns The risk level of the command\n */\nexport function classifyBashCommand(command: string): RiskLevel {\n // Trim and normalize whitespace\n const normalizedCommand = command.trim().replace(/\\s+/g, ' ')\n\n // Check dangerous patterns first (higher priority)\n if (DANGEROUS_BASH_PATTERNS.some(p => p.test(normalizedCommand))) {\n return 'dangerous'\n }\n\n // Check safe patterns\n if (SAFE_BASH_PATTERNS.some(p => p.test(normalizedCommand))) {\n return 'safe'\n }\n\n // Default to monitored (allows in Smart mode, asks in Strict mode)\n return 'monitored'\n}\n\n/**\n * Get the risk level for a tool\n *\n * @param toolName The name of the tool\n * @param input Optional tool input for command-specific classification\n * @returns The risk level of the tool\n */\nexport function getToolRiskLevel(\n toolName: string,\n input?: { command?: string },\n): RiskLevel {\n // Special handling for Bash commands\n if (toolName === 'Bash' && input?.command) {\n return classifyBashCommand(input.command)\n }\n\n // Look up in the static table\n return TOOL_RISK_LEVELS[toolName] ?? 'dangerous'\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/dist/version.js CHANGED
@@ -1,5 +1,5 @@
1
- const VERSION = "0.3.10";
2
- const BUILD_DATE = "2026-02-11T00:33:37.162Z";
1
+ const VERSION = "0.4.0";
2
+ const BUILD_DATE = "2026-02-23T23:08:13.062Z";
3
3
  export {
4
4
  BUILD_DATE,
5
5
  VERSION
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/version.ts"],
4
- "sourcesContent": ["/**\n * Application version\n * This file is auto-generated during build process\n */\n\nexport const VERSION = '0.3.10'\nexport const BUILD_DATE = '2026-02-11T00:33:37.162Z'\n"],
4
+ "sourcesContent": ["/**\n * Application version\n * This file is auto-generated during build process\n */\n\nexport const VERSION = '0.4.0'\nexport const BUILD_DATE = '2026-02-23T23:08:13.062Z'\n"],
5
5
  "mappings": "AAKO,MAAM,UAAU;AAChB,MAAM,aAAa;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@within-7/minto",
3
- "version": "0.3.10",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "description": "AI-powered strategic research and planning assistant",
6
6
  "author": "Lib <within-7>",
@@ -60,6 +60,7 @@
60
60
  "test": "bun test",
61
61
  "test:watch": "bun test --watch",
62
62
  "typecheck": "tsc --noEmit",
63
+ "typecheck:strict": "tsc --noEmit -p tsconfig.strict.json",
63
64
  "lint": "prettier --check \"src/**/*.{ts,tsx,js,jsx,json}\"",
64
65
  "format": "prettier --write \"src/**/*.{ts,tsx,js,jsx,json}\"",
65
66
  "prepublishOnly": "node scripts/build.mjs && node scripts/prepublish-check.cjs",