@within-7/minto 0.3.3 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/setup.js +40 -2
- package/dist/commands/setup.js.map +2 -2
- package/dist/hooks/useAgentTokenStats.js +1 -1
- package/dist/services/claude.js +1 -1
- package/dist/utils/teamConfig.js +160 -0
- package/dist/utils/teamConfig.js.map +3 -3
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +6 -6
package/dist/commands/setup.js
CHANGED
|
@@ -7,7 +7,10 @@ import {
|
|
|
7
7
|
loadTeamConfigFromFile,
|
|
8
8
|
applyTeamConfig,
|
|
9
9
|
addMarketplaces,
|
|
10
|
-
installPlugins
|
|
10
|
+
installPlugins,
|
|
11
|
+
installRemoteAgents,
|
|
12
|
+
installInlineAgents,
|
|
13
|
+
installTeamHooks
|
|
11
14
|
} from "../utils/teamConfig.js";
|
|
12
15
|
function SetupComponent({
|
|
13
16
|
source,
|
|
@@ -39,6 +42,33 @@ function SetupComponent({
|
|
|
39
42
|
const pluginResult = await installPlugins(teamConfig.plugins.install);
|
|
40
43
|
pluginsInstalled = pluginResult.installed;
|
|
41
44
|
}
|
|
45
|
+
let agentsInstalled = 0;
|
|
46
|
+
if (shouldInstallPlugins && teamConfig.agents) {
|
|
47
|
+
const remoteCount = teamConfig.agents.remoteAgents?.length || 0;
|
|
48
|
+
const inlineCount = teamConfig.agents.inlineAgents?.length || 0;
|
|
49
|
+
const totalAgents = remoteCount + inlineCount;
|
|
50
|
+
if (totalAgents > 0) {
|
|
51
|
+
setState({ stage: "installing-agents", total: totalAgents });
|
|
52
|
+
if (teamConfig.agents.remoteAgents) {
|
|
53
|
+
const remoteResult = await installRemoteAgents(
|
|
54
|
+
teamConfig.agents.remoteAgents
|
|
55
|
+
);
|
|
56
|
+
agentsInstalled += remoteResult.installed;
|
|
57
|
+
}
|
|
58
|
+
if (teamConfig.agents.inlineAgents) {
|
|
59
|
+
const inlineResult = await installInlineAgents(
|
|
60
|
+
teamConfig.agents.inlineAgents
|
|
61
|
+
);
|
|
62
|
+
agentsInstalled += inlineResult.installed;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
let hooksInstalled = false;
|
|
67
|
+
if (shouldInstallPlugins && teamConfig.hooks) {
|
|
68
|
+
setState({ stage: "installing-hooks" });
|
|
69
|
+
const hookResult = await installTeamHooks(teamConfig.hooks);
|
|
70
|
+
hooksInstalled = hookResult.installed;
|
|
71
|
+
}
|
|
42
72
|
setState({
|
|
43
73
|
stage: "success",
|
|
44
74
|
modelsAdded: result.modelsAdded,
|
|
@@ -46,6 +76,8 @@ function SetupComponent({
|
|
|
46
76
|
settingsUpdated: result.settingsUpdated,
|
|
47
77
|
marketplacesAdded: marketplacesAdded > 0 ? marketplacesAdded : void 0,
|
|
48
78
|
pluginsInstalled: pluginsInstalled > 0 ? pluginsInstalled : void 0,
|
|
79
|
+
agentsInstalled: agentsInstalled > 0 ? agentsInstalled : void 0,
|
|
80
|
+
hooksInstalled: hooksInstalled || void 0,
|
|
49
81
|
instructions: teamConfig.postInstallInstructions
|
|
50
82
|
});
|
|
51
83
|
setTimeout(() => onDone("Configuration applied successfully"), 2e3);
|
|
@@ -72,10 +104,16 @@ function SetupComponent({
|
|
|
72
104
|
if (state.stage === "installing-plugins") {
|
|
73
105
|
return /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, /* @__PURE__ */ React.createElement(SimpleSpinner, null), " Installing ", state.total, " plugin", state.total !== 1 ? "s" : "", "..."));
|
|
74
106
|
}
|
|
107
|
+
if (state.stage === "installing-agents") {
|
|
108
|
+
return /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, /* @__PURE__ */ React.createElement(SimpleSpinner, null), " Installing ", state.total, " agent", state.total !== 1 ? "s" : "", "..."));
|
|
109
|
+
}
|
|
110
|
+
if (state.stage === "installing-hooks") {
|
|
111
|
+
return /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, /* @__PURE__ */ React.createElement(SimpleSpinner, null), " Installing hooks..."));
|
|
112
|
+
}
|
|
75
113
|
if (state.stage === "error") {
|
|
76
114
|
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: "red" }, "\u2717 Initialization failed"), /* @__PURE__ */ React.createElement(Text, { color: "red" }, state.message));
|
|
77
115
|
}
|
|
78
|
-
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingY: 1 }, /* @__PURE__ */ React.createElement(Text, { color: "green", bold: true }, "\u2713 Configuration applied successfully!"), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingTop: 1 }, state.modelsAdded > 0 && /* @__PURE__ */ React.createElement(Text, null, "\u2022 Added ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, state.modelsAdded), " model profile", state.modelsAdded !== 1 ? "s" : ""), state.mcpServersAdded > 0 && /* @__PURE__ */ React.createElement(Text, null, "\u2022 Added ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, state.mcpServersAdded), " MCP server", state.mcpServersAdded !== 1 ? "s" : ""), state.settingsUpdated.length > 0 && /* @__PURE__ */ React.createElement(Text, null, "\u2022 Updated ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, state.settingsUpdated.length), " ", "setting", state.settingsUpdated.length !== 1 ? "s" : "", ":", " ", state.settingsUpdated.join(", ")), state.marketplacesAdded !== void 0 && state.marketplacesAdded > 0 && /* @__PURE__ */ React.createElement(Text, null, "\u2022 Added ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, state.marketplacesAdded), " ", "marketplace", state.marketplacesAdded !== 1 ? "s" : ""), state.pluginsInstalled !== void 0 && state.pluginsInstalled > 0 && /* @__PURE__ */ React.createElement(Text, null, "\u2022 Installed ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, state.pluginsInstalled), " ", "plugin", state.pluginsInstalled !== 1 ? "s" : "")), state.instructions && /* @__PURE__ */ React.createElement(
|
|
116
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingY: 1 }, /* @__PURE__ */ React.createElement(Text, { color: "green", bold: true }, "\u2713 Configuration applied successfully!"), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingTop: 1 }, state.modelsAdded > 0 && /* @__PURE__ */ React.createElement(Text, null, "\u2022 Added ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, state.modelsAdded), " model profile", state.modelsAdded !== 1 ? "s" : ""), state.mcpServersAdded > 0 && /* @__PURE__ */ React.createElement(Text, null, "\u2022 Added ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, state.mcpServersAdded), " MCP server", state.mcpServersAdded !== 1 ? "s" : ""), state.settingsUpdated.length > 0 && /* @__PURE__ */ React.createElement(Text, null, "\u2022 Updated ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, state.settingsUpdated.length), " ", "setting", state.settingsUpdated.length !== 1 ? "s" : "", ":", " ", state.settingsUpdated.join(", ")), state.marketplacesAdded !== void 0 && state.marketplacesAdded > 0 && /* @__PURE__ */ React.createElement(Text, null, "\u2022 Added ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, state.marketplacesAdded), " ", "marketplace", state.marketplacesAdded !== 1 ? "s" : ""), state.pluginsInstalled !== void 0 && state.pluginsInstalled > 0 && /* @__PURE__ */ React.createElement(Text, null, "\u2022 Installed ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, state.pluginsInstalled), " ", "plugin", state.pluginsInstalled !== 1 ? "s" : ""), state.agentsInstalled !== void 0 && state.agentsInstalled > 0 && /* @__PURE__ */ React.createElement(Text, null, "\u2022 Installed ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, state.agentsInstalled), " agent", state.agentsInstalled !== 1 ? "s" : ""), state.hooksInstalled && /* @__PURE__ */ React.createElement(Text, null, "\u2022 Installed ", /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, "hooks"), " configuration")), state.instructions && /* @__PURE__ */ React.createElement(
|
|
79
117
|
Box,
|
|
80
118
|
{
|
|
81
119
|
flexDirection: "column",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/setup.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * Setup Command\n *\n * Initialize Minto with a team configuration from a remote URL or local file\n */\n\nimport React from 'react'\nimport { Text, Box } from 'ink'\nimport { SimpleSpinner } from '@components/Spinner'\nimport type { Command } from '@commands'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport {\n fetchTeamConfig,\n loadTeamConfigFromFile,\n applyTeamConfig,\n addMarketplaces,\n installPlugins,\n type MergeStrategy,\n} from '@utils/teamConfig'\n\ntype SetupProps = {\n source: string // URL or file path\n strategy?: MergeStrategy\n installPlugins?: boolean\n onDone: (result?: string) => void\n}\n\ntype SetupState =\n | { stage: 'loading' }\n | { stage: 'applying' }\n | { stage: 'adding-marketplaces'; total: number }\n | { stage: 'installing-plugins'; total: number }\n | {\n stage: 'success'\n modelsAdded: number\n mcpServersAdded: number\n settingsUpdated: string[]\n marketplacesAdded?: number\n pluginsInstalled?: number\n instructions?: string\n }\n | { stage: 'error'; message: string }\n\nexport function SetupComponent({\n source,\n strategy = 'merge',\n installPlugins: shouldInstallPlugins = true,\n onDone,\n}: SetupProps) {\n const [state, setState] = React.useState<SetupState>({ stage: 'loading' })\n\n React.useEffect(() => {\n async function init() {\n try {\n // Step 1: Load configuration\n setState({ stage: 'loading' })\n\n const teamConfig =\n source.startsWith('http://') || source.startsWith('https://')\n ? await fetchTeamConfig(source)\n : loadTeamConfigFromFile(source)\n\n // Step 2: Apply configuration\n setState({ stage: 'applying' })\n\n const result = applyTeamConfig(teamConfig, strategy)\n\n // Step 3: Add marketplaces (if configured)\n let marketplacesAdded = 0\n if (shouldInstallPlugins && teamConfig.plugins?.marketplaces) {\n const marketplaceCount = teamConfig.plugins.marketplaces.length\n setState({ stage: 'adding-marketplaces', total: marketplaceCount })\n\n const marketplaceResult = await addMarketplaces(\n teamConfig.plugins.marketplaces,\n )\n\n marketplacesAdded = marketplaceResult.added\n }\n\n // Step 4: Install plugins (if configured)\n let pluginsInstalled = 0\n if (shouldInstallPlugins && teamConfig.plugins?.install) {\n const pluginCount = teamConfig.plugins.install.length\n setState({ stage: 'installing-plugins', total: pluginCount })\n\n const pluginResult = await installPlugins(teamConfig.plugins.install)\n\n pluginsInstalled = pluginResult.installed\n }\n\n // Success\n setState({\n stage: 'success',\n modelsAdded: result.modelsAdded,\n mcpServersAdded: result.mcpServersAdded,\n settingsUpdated: result.settingsUpdated,\n marketplacesAdded:\n marketplacesAdded > 0 ? marketplacesAdded : undefined,\n pluginsInstalled: pluginsInstalled > 0 ? pluginsInstalled : undefined,\n instructions: teamConfig.postInstallInstructions,\n })\n\n // Notify parent component\n setTimeout(() => onDone('Configuration applied successfully'), 2000)\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error)\n setState({\n stage: 'error',\n message: errorMessage,\n })\n\n // Notify parent component of error\n setTimeout(() => onDone(), 2000)\n }\n }\n\n init()\n }, [source, strategy, shouldInstallPlugins, onDone])\n\n if (state.stage === 'loading') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Loading configuration from {source}...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'applying') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Applying configuration...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'adding-marketplaces') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Adding {state.total} marketplace\n {state.total !== 1 ? 's' : ''}...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'installing-plugins') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Installing {state.total} plugin\n {state.total !== 1 ? 's' : ''}...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'error') {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"red\">\u2717 Initialization failed</Text>\n <Text color=\"red\">{state.message}</Text>\n </Box>\n )\n }\n\n // Success state\n return (\n <Box flexDirection=\"column\" paddingY={1}>\n <Text color=\"green\" bold>\n \u2713 Configuration applied successfully!\n </Text>\n\n <Box flexDirection=\"column\" paddingTop={1}>\n {state.modelsAdded > 0 && (\n <Text>\n \u2022 Added <Text color=\"cyan\">{state.modelsAdded}</Text> model profile\n {state.modelsAdded !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.mcpServersAdded > 0 && (\n <Text>\n \u2022 Added <Text color=\"cyan\">{state.mcpServersAdded}</Text> MCP server\n {state.mcpServersAdded !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.settingsUpdated.length > 0 && (\n <Text>\n \u2022 Updated <Text color=\"cyan\">{state.settingsUpdated.length}</Text>{' '}\n setting\n {state.settingsUpdated.length !== 1 ? 's' : ''}:{' '}\n {state.settingsUpdated.join(', ')}\n </Text>\n )}\n\n {state.marketplacesAdded !== undefined &&\n state.marketplacesAdded > 0 && (\n <Text>\n \u2022 Added <Text color=\"cyan\">{state.marketplacesAdded}</Text>{' '}\n marketplace\n {state.marketplacesAdded !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.pluginsInstalled !== undefined && state.pluginsInstalled > 0 && (\n <Text>\n \u2022 Installed <Text color=\"cyan\">{state.pluginsInstalled}</Text>{' '}\n plugin\n {state.pluginsInstalled !== 1 ? 's' : ''}\n </Text>\n )}\n </Box>\n\n {state.instructions && (\n <Box\n flexDirection=\"column\"\n paddingTop={1}\n borderStyle=\"round\"\n borderColor=\"yellow\"\n paddingX={1}\n >\n <Text color=\"yellow\" bold>\n \uD83D\uDCCB Next Steps:\n </Text>\n <Text>{state.instructions}</Text>\n </Box>\n )}\n\n <Box paddingTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n Run <Text color=\"cyan\">minto</Text> to start using your configured\n setup.\n </Text>\n </Box>\n </Box>\n )\n}\n\n// Command definition\nconst command = {\n type: 'local-jsx',\n name: 'setup',\n description: 'Initialize Minto with team configuration from a URL or file',\n isEnabled: true,\n isHidden: false,\n userFacingName() {\n return 'setup'\n },\n async call(onDone, _context) {\n // Parse arguments\n const args = process.argv.slice(2)\n const fromIndex = args.findIndex(arg => arg === '--from')\n const strategyIndex = args.findIndex(arg => arg === '--strategy')\n const noPluginsFlag = args.includes('--no-plugins')\n\n if (fromIndex === -1 || !args[fromIndex + 1]) {\n onDone()\n return (\n <Box flexDirection=\"column\">\n <Text color=\"red\">Error: --from parameter is required</Text>\n <Text>\n Usage: minto setup --from <url|path> [--strategy\n <merge|replace|skip-existing>] [--no-plugins]\n </Text>\n </Box>\n )\n }\n\n const source = args[fromIndex + 1]\n const strategy: MergeStrategy =\n strategyIndex !== -1 && args[strategyIndex + 1]\n ? (args[strategyIndex + 1] as MergeStrategy)\n : 'merge'\n const shouldInstallPlugins = !noPluginsFlag\n\n return (\n <SetupComponent\n source={source}\n strategy={strategy}\n installPlugins={shouldInstallPlugins}\n onDone={onDone}\n />\n )\n },\n} satisfies Command\n\nexport default command\n"],
|
|
5
|
-
"mappings": "AAMA,OAAO,WAAW;AAClB,SAAS,MAAM,WAAW;AAC1B,SAAS,qBAAqB;AAE9B,SAAS,uBAAuB;AAChC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;
|
|
4
|
+
"sourcesContent": ["/**\n * Setup Command\n *\n * Initialize Minto with a team configuration from a remote URL or local file\n */\n\nimport React from 'react'\nimport { Text, Box } from 'ink'\nimport { SimpleSpinner } from '@components/Spinner'\nimport type { Command } from '@commands'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport {\n fetchTeamConfig,\n loadTeamConfigFromFile,\n applyTeamConfig,\n addMarketplaces,\n installPlugins,\n installRemoteAgents,\n installInlineAgents,\n installTeamHooks,\n type MergeStrategy,\n} from '@utils/teamConfig'\n\ntype SetupProps = {\n source: string // URL or file path\n strategy?: MergeStrategy\n installPlugins?: boolean\n onDone: (result?: string) => void\n}\n\ntype SetupState =\n | { stage: 'loading' }\n | { stage: 'applying' }\n | { stage: 'adding-marketplaces'; total: number }\n | { stage: 'installing-plugins'; total: number }\n | { stage: 'installing-agents'; total: number }\n | { stage: 'installing-hooks' }\n | {\n stage: 'success'\n modelsAdded: number\n mcpServersAdded: number\n settingsUpdated: string[]\n marketplacesAdded?: number\n pluginsInstalled?: number\n agentsInstalled?: number\n hooksInstalled?: boolean\n instructions?: string\n }\n | { stage: 'error'; message: string }\n\nexport function SetupComponent({\n source,\n strategy = 'merge',\n installPlugins: shouldInstallPlugins = true,\n onDone,\n}: SetupProps) {\n const [state, setState] = React.useState<SetupState>({ stage: 'loading' })\n\n React.useEffect(() => {\n async function init() {\n try {\n // Step 1: Load configuration\n setState({ stage: 'loading' })\n\n const teamConfig =\n source.startsWith('http://') || source.startsWith('https://')\n ? await fetchTeamConfig(source)\n : loadTeamConfigFromFile(source)\n\n // Step 2: Apply configuration\n setState({ stage: 'applying' })\n\n const result = applyTeamConfig(teamConfig, strategy)\n\n // Step 3: Add marketplaces (if configured)\n let marketplacesAdded = 0\n if (shouldInstallPlugins && teamConfig.plugins?.marketplaces) {\n const marketplaceCount = teamConfig.plugins.marketplaces.length\n setState({ stage: 'adding-marketplaces', total: marketplaceCount })\n\n const marketplaceResult = await addMarketplaces(\n teamConfig.plugins.marketplaces,\n )\n\n marketplacesAdded = marketplaceResult.added\n }\n\n // Step 4: Install plugins (if configured)\n let pluginsInstalled = 0\n if (shouldInstallPlugins && teamConfig.plugins?.install) {\n const pluginCount = teamConfig.plugins.install.length\n setState({ stage: 'installing-plugins', total: pluginCount })\n\n const pluginResult = await installPlugins(teamConfig.plugins.install)\n\n pluginsInstalled = pluginResult.installed\n }\n\n // Step 5: Install agents (if configured)\n let agentsInstalled = 0\n if (shouldInstallPlugins && teamConfig.agents) {\n const remoteCount = teamConfig.agents.remoteAgents?.length || 0\n const inlineCount = teamConfig.agents.inlineAgents?.length || 0\n const totalAgents = remoteCount + inlineCount\n\n if (totalAgents > 0) {\n setState({ stage: 'installing-agents', total: totalAgents })\n\n if (teamConfig.agents.remoteAgents) {\n const remoteResult = await installRemoteAgents(\n teamConfig.agents.remoteAgents,\n )\n agentsInstalled += remoteResult.installed\n }\n\n if (teamConfig.agents.inlineAgents) {\n const inlineResult = await installInlineAgents(\n teamConfig.agents.inlineAgents,\n )\n agentsInstalled += inlineResult.installed\n }\n }\n }\n\n // Step 6: Install hooks (if configured)\n let hooksInstalled = false\n if (shouldInstallPlugins && teamConfig.hooks) {\n setState({ stage: 'installing-hooks' })\n const hookResult = await installTeamHooks(teamConfig.hooks)\n hooksInstalled = hookResult.installed\n }\n\n // Success\n setState({\n stage: 'success',\n modelsAdded: result.modelsAdded,\n mcpServersAdded: result.mcpServersAdded,\n settingsUpdated: result.settingsUpdated,\n marketplacesAdded:\n marketplacesAdded > 0 ? marketplacesAdded : undefined,\n pluginsInstalled: pluginsInstalled > 0 ? pluginsInstalled : undefined,\n agentsInstalled: agentsInstalled > 0 ? agentsInstalled : undefined,\n hooksInstalled: hooksInstalled || undefined,\n instructions: teamConfig.postInstallInstructions,\n })\n\n // Notify parent component\n setTimeout(() => onDone('Configuration applied successfully'), 2000)\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error)\n setState({\n stage: 'error',\n message: errorMessage,\n })\n\n // Notify parent component of error\n setTimeout(() => onDone(), 2000)\n }\n }\n\n init()\n }, [source, strategy, shouldInstallPlugins, onDone])\n\n if (state.stage === 'loading') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Loading configuration from {source}...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'applying') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Applying configuration...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'adding-marketplaces') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Adding {state.total} marketplace\n {state.total !== 1 ? 's' : ''}...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'installing-plugins') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Installing {state.total} plugin\n {state.total !== 1 ? 's' : ''}...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'installing-agents') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Installing {state.total} agent\n {state.total !== 1 ? 's' : ''}...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'installing-hooks') {\n return (\n <Box>\n <Text color=\"cyan\">\n <SimpleSpinner /> Installing hooks...\n </Text>\n </Box>\n )\n }\n\n if (state.stage === 'error') {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"red\">\u2717 Initialization failed</Text>\n <Text color=\"red\">{state.message}</Text>\n </Box>\n )\n }\n\n // Success state\n return (\n <Box flexDirection=\"column\" paddingY={1}>\n <Text color=\"green\" bold>\n \u2713 Configuration applied successfully!\n </Text>\n\n <Box flexDirection=\"column\" paddingTop={1}>\n {state.modelsAdded > 0 && (\n <Text>\n \u2022 Added <Text color=\"cyan\">{state.modelsAdded}</Text> model profile\n {state.modelsAdded !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.mcpServersAdded > 0 && (\n <Text>\n \u2022 Added <Text color=\"cyan\">{state.mcpServersAdded}</Text> MCP server\n {state.mcpServersAdded !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.settingsUpdated.length > 0 && (\n <Text>\n \u2022 Updated <Text color=\"cyan\">{state.settingsUpdated.length}</Text>{' '}\n setting\n {state.settingsUpdated.length !== 1 ? 's' : ''}:{' '}\n {state.settingsUpdated.join(', ')}\n </Text>\n )}\n\n {state.marketplacesAdded !== undefined &&\n state.marketplacesAdded > 0 && (\n <Text>\n \u2022 Added <Text color=\"cyan\">{state.marketplacesAdded}</Text>{' '}\n marketplace\n {state.marketplacesAdded !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.pluginsInstalled !== undefined && state.pluginsInstalled > 0 && (\n <Text>\n \u2022 Installed <Text color=\"cyan\">{state.pluginsInstalled}</Text>{' '}\n plugin\n {state.pluginsInstalled !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.agentsInstalled !== undefined && state.agentsInstalled > 0 && (\n <Text>\n \u2022 Installed <Text color=\"cyan\">{state.agentsInstalled}</Text> agent\n {state.agentsInstalled !== 1 ? 's' : ''}\n </Text>\n )}\n\n {state.hooksInstalled && (\n <Text>\n \u2022 Installed <Text color=\"cyan\">hooks</Text> configuration\n </Text>\n )}\n </Box>\n\n {state.instructions && (\n <Box\n flexDirection=\"column\"\n paddingTop={1}\n borderStyle=\"round\"\n borderColor=\"yellow\"\n paddingX={1}\n >\n <Text color=\"yellow\" bold>\n \uD83D\uDCCB Next Steps:\n </Text>\n <Text>{state.instructions}</Text>\n </Box>\n )}\n\n <Box paddingTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n Run <Text color=\"cyan\">minto</Text> to start using your configured\n setup.\n </Text>\n </Box>\n </Box>\n )\n}\n\n// Command definition\nconst command = {\n type: 'local-jsx',\n name: 'setup',\n description: 'Initialize Minto with team configuration from a URL or file',\n isEnabled: true,\n isHidden: false,\n userFacingName() {\n return 'setup'\n },\n async call(onDone, _context) {\n // Parse arguments\n const args = process.argv.slice(2)\n const fromIndex = args.findIndex(arg => arg === '--from')\n const strategyIndex = args.findIndex(arg => arg === '--strategy')\n const noPluginsFlag = args.includes('--no-plugins')\n\n if (fromIndex === -1 || !args[fromIndex + 1]) {\n onDone()\n return (\n <Box flexDirection=\"column\">\n <Text color=\"red\">Error: --from parameter is required</Text>\n <Text>\n Usage: minto setup --from <url|path> [--strategy\n <merge|replace|skip-existing>] [--no-plugins]\n </Text>\n </Box>\n )\n }\n\n const source = args[fromIndex + 1]\n const strategy: MergeStrategy =\n strategyIndex !== -1 && args[strategyIndex + 1]\n ? (args[strategyIndex + 1] as MergeStrategy)\n : 'merge'\n const shouldInstallPlugins = !noPluginsFlag\n\n return (\n <SetupComponent\n source={source}\n strategy={strategy}\n installPlugins={shouldInstallPlugins}\n onDone={onDone}\n />\n )\n },\n} satisfies Command\n\nexport default command\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useState, useEffect } from "react";
|
|
2
|
-
import { tokenStatsManager } from "
|
|
2
|
+
import { tokenStatsManager } from "../core/tokenStatsManager.js";
|
|
3
3
|
function useAgentTokenStats(agentId) {
|
|
4
4
|
const [stats, setStats] = useState(() => {
|
|
5
5
|
if (!agentId) return null;
|
package/dist/services/claude.js
CHANGED
|
@@ -6,7 +6,7 @@ import chalk from "chalk";
|
|
|
6
6
|
import { randomUUID } from "crypto";
|
|
7
7
|
import "dotenv/config";
|
|
8
8
|
import { addToTotalCost } from "../cost-tracker.js";
|
|
9
|
-
import { recordTokenUsage } from "
|
|
9
|
+
import { recordTokenUsage } from "../core/tokenStatsManager.js";
|
|
10
10
|
import models from "../constants/models.js";
|
|
11
11
|
import { getToolDescriptionAsync } from "../Tool.js";
|
|
12
12
|
import {
|
package/dist/utils/teamConfig.js
CHANGED
|
@@ -230,6 +230,18 @@ function applyTeamConfig(teamConfig, strategy = "merge") {
|
|
|
230
230
|
globalConfig.stream = settings.stream;
|
|
231
231
|
settingsUpdated.push("stream");
|
|
232
232
|
}
|
|
233
|
+
if (settings.language !== void 0) {
|
|
234
|
+
globalConfig.language = settings.language;
|
|
235
|
+
settingsUpdated.push("language");
|
|
236
|
+
}
|
|
237
|
+
if (settings.safetyMode !== void 0) {
|
|
238
|
+
globalConfig.safetyMode = settings.safetyMode;
|
|
239
|
+
settingsUpdated.push("safetyMode");
|
|
240
|
+
}
|
|
241
|
+
if (settings.skipOnboarding) {
|
|
242
|
+
globalConfig.hasCompletedOnboarding = true;
|
|
243
|
+
settingsUpdated.push("hasCompletedOnboarding");
|
|
244
|
+
}
|
|
233
245
|
}
|
|
234
246
|
saveGlobalConfig(globalConfig);
|
|
235
247
|
debugLogger.state("TEAM_CONFIG_APPLY_SUCCESS", {
|
|
@@ -302,13 +314,161 @@ async function installPlugins(pluginNames, targetDir) {
|
|
|
302
314
|
}
|
|
303
315
|
return { installed, failed, errors };
|
|
304
316
|
}
|
|
317
|
+
async function installRemoteAgents(agentUrls) {
|
|
318
|
+
let installed = 0;
|
|
319
|
+
let failed = 0;
|
|
320
|
+
const errors = [];
|
|
321
|
+
const { join } = await import("path");
|
|
322
|
+
const { homedir } = await import("os");
|
|
323
|
+
const { writeFileSync, mkdirSync, existsSync: existsSync2 } = await import("fs");
|
|
324
|
+
const agentsDir = join(homedir(), ".minto", "agents");
|
|
325
|
+
if (!existsSync2(agentsDir)) {
|
|
326
|
+
mkdirSync(agentsDir, { recursive: true });
|
|
327
|
+
}
|
|
328
|
+
for (const url of agentUrls) {
|
|
329
|
+
try {
|
|
330
|
+
debugLogger.state("TEAM_CONFIG_DOWNLOAD_AGENT", { url });
|
|
331
|
+
const response = await fetch(url);
|
|
332
|
+
if (!response.ok) {
|
|
333
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
334
|
+
}
|
|
335
|
+
const content = await response.text();
|
|
336
|
+
const filename = url.split("/").pop() || "agent.md";
|
|
337
|
+
const targetPath = join(agentsDir, filename);
|
|
338
|
+
writeFileSync(targetPath, content, "utf-8");
|
|
339
|
+
installed++;
|
|
340
|
+
debugLogger.state("TEAM_CONFIG_DOWNLOAD_AGENT_SUCCESS", {
|
|
341
|
+
url,
|
|
342
|
+
targetPath
|
|
343
|
+
});
|
|
344
|
+
} catch (error) {
|
|
345
|
+
failed++;
|
|
346
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
347
|
+
errors.push(`${url}: ${errorMsg}`);
|
|
348
|
+
debugLogger.error("TEAM_CONFIG_DOWNLOAD_AGENT_ERROR", {
|
|
349
|
+
url,
|
|
350
|
+
error: errorMsg
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
return { installed, failed, errors };
|
|
355
|
+
}
|
|
356
|
+
async function installInlineAgents(agents) {
|
|
357
|
+
let installed = 0;
|
|
358
|
+
let failed = 0;
|
|
359
|
+
const errors = [];
|
|
360
|
+
const { join } = await import("path");
|
|
361
|
+
const { homedir } = await import("os");
|
|
362
|
+
const { writeFileSync, mkdirSync, existsSync: existsSync2 } = await import("fs");
|
|
363
|
+
const agentsDir = join(homedir(), ".minto", "agents");
|
|
364
|
+
if (!existsSync2(agentsDir)) {
|
|
365
|
+
mkdirSync(agentsDir, { recursive: true });
|
|
366
|
+
}
|
|
367
|
+
for (const agent of agents) {
|
|
368
|
+
try {
|
|
369
|
+
debugLogger.state("TEAM_CONFIG_INSTALL_INLINE_AGENT", { name: agent.name });
|
|
370
|
+
const tools = agent.tools === "*" ? "*" : JSON.stringify(agent.tools);
|
|
371
|
+
const content = `---
|
|
372
|
+
name: ${agent.name}
|
|
373
|
+
description: "${agent.description.replace(/"/g, '\\"')}"
|
|
374
|
+
tools: ${tools}${agent.model ? `
|
|
375
|
+
model_name: ${agent.model}` : ""}${agent.color ? `
|
|
376
|
+
color: "${agent.color}"` : ""}
|
|
377
|
+
---
|
|
378
|
+
|
|
379
|
+
${agent.systemPrompt}
|
|
380
|
+
`;
|
|
381
|
+
const filename = `${agent.name}.md`;
|
|
382
|
+
const targetPath = join(agentsDir, filename);
|
|
383
|
+
writeFileSync(targetPath, content, "utf-8");
|
|
384
|
+
installed++;
|
|
385
|
+
debugLogger.state("TEAM_CONFIG_INSTALL_INLINE_AGENT_SUCCESS", {
|
|
386
|
+
name: agent.name,
|
|
387
|
+
targetPath
|
|
388
|
+
});
|
|
389
|
+
} catch (error) {
|
|
390
|
+
failed++;
|
|
391
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
392
|
+
errors.push(`${agent.name}: ${errorMsg}`);
|
|
393
|
+
debugLogger.error("TEAM_CONFIG_INSTALL_INLINE_AGENT_ERROR", {
|
|
394
|
+
name: agent.name,
|
|
395
|
+
error: errorMsg
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
return { installed, failed, errors };
|
|
400
|
+
}
|
|
401
|
+
async function installTeamHooks(hooks) {
|
|
402
|
+
const { join } = await import("path");
|
|
403
|
+
const { homedir } = await import("os");
|
|
404
|
+
const { writeFileSync, mkdirSync, existsSync: existsSync2, readFileSync: readFileSync2 } = await import("fs");
|
|
405
|
+
try {
|
|
406
|
+
debugLogger.state("TEAM_CONFIG_INSTALL_HOOKS", {});
|
|
407
|
+
const mintoDir = join(homedir(), ".minto");
|
|
408
|
+
if (!existsSync2(mintoDir)) {
|
|
409
|
+
mkdirSync(mintoDir, { recursive: true });
|
|
410
|
+
}
|
|
411
|
+
const hooksPath = join(mintoDir, "hooks.json");
|
|
412
|
+
const hooksConfig = {
|
|
413
|
+
description: "Team-configured hooks",
|
|
414
|
+
hooks: {}
|
|
415
|
+
};
|
|
416
|
+
const hooksObj = hooksConfig.hooks;
|
|
417
|
+
if (hooks.sessionStart) {
|
|
418
|
+
hooksObj.SessionStart = [{ matcher: "*", hooks: hooks.sessionStart }];
|
|
419
|
+
}
|
|
420
|
+
if (hooks.sessionEnd) {
|
|
421
|
+
hooksObj.SessionEnd = [{ matcher: "*", hooks: hooks.sessionEnd }];
|
|
422
|
+
}
|
|
423
|
+
if (hooks.userPromptSubmit) {
|
|
424
|
+
hooksObj.UserPromptSubmit = [
|
|
425
|
+
{ matcher: "*", hooks: hooks.userPromptSubmit }
|
|
426
|
+
];
|
|
427
|
+
}
|
|
428
|
+
if (hooks.preToolUse) {
|
|
429
|
+
hooksObj.PreToolUse = hooks.preToolUse;
|
|
430
|
+
}
|
|
431
|
+
if (hooks.postToolUse) {
|
|
432
|
+
hooksObj.PostToolUse = hooks.postToolUse;
|
|
433
|
+
}
|
|
434
|
+
if (existsSync2(hooksPath)) {
|
|
435
|
+
try {
|
|
436
|
+
const existingContent = readFileSync2(hooksPath, "utf-8");
|
|
437
|
+
const existingHooks = JSON.parse(existingContent);
|
|
438
|
+
for (const [event, matchers] of Object.entries(hooksObj)) {
|
|
439
|
+
if (existingHooks.hooks?.[event]) {
|
|
440
|
+
existingHooks.hooks[event] = [
|
|
441
|
+
...existingHooks.hooks[event],
|
|
442
|
+
...matchers
|
|
443
|
+
];
|
|
444
|
+
} else {
|
|
445
|
+
existingHooks.hooks = existingHooks.hooks || {};
|
|
446
|
+
existingHooks.hooks[event] = matchers;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
hooksConfig.hooks = existingHooks.hooks;
|
|
450
|
+
} catch {
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
writeFileSync(hooksPath, JSON.stringify(hooksConfig, null, 2), "utf-8");
|
|
454
|
+
debugLogger.state("TEAM_CONFIG_INSTALL_HOOKS_SUCCESS", { hooksPath });
|
|
455
|
+
return { installed: true };
|
|
456
|
+
} catch (error) {
|
|
457
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
458
|
+
debugLogger.error("TEAM_CONFIG_INSTALL_HOOKS_ERROR", { error: errorMsg });
|
|
459
|
+
return { installed: false, error: errorMsg };
|
|
460
|
+
}
|
|
461
|
+
}
|
|
305
462
|
export {
|
|
306
463
|
addMarketplaces,
|
|
307
464
|
applyTeamConfig,
|
|
308
465
|
convertTeamMcpConfig,
|
|
309
466
|
convertTeamModelProfile,
|
|
310
467
|
fetchTeamConfig,
|
|
468
|
+
installInlineAgents,
|
|
311
469
|
installPlugins,
|
|
470
|
+
installRemoteAgents,
|
|
471
|
+
installTeamHooks,
|
|
312
472
|
interpolateEnvVars,
|
|
313
473
|
interpolateEnvVarsInObject,
|
|
314
474
|
loadTeamConfigFromFile
|
|
@@ -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 * 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\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[] // Plugin names to install\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 }\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 * 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\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 pluginName of pluginNames) {\n try {\n debugLogger.state('TEAM_CONFIG_INSTALL_PLUGIN', {\n pluginName,\n targetDir: installDir,\n })\n\n await installPluginFromMarketplace(\n pluginName,\n undefined, // Search all marketplaces\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"],
|
|
5
|
-
"mappings": "AAOA,SAAS,YAAY,oBAAoB;AACzC;AAAA,EACE;AAAA,EACA;AAAA,OAKK;AACP,SAAS,SAAS,mBAAmB;AACrC,SAAS,qBAAqB;
|
|
6
|
-
"names": []
|
|
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 * 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\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[] // Plugin names to install\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[]\n }\n\n // Hook \u914D\u7F6E\n hooks?: TeamHooksConfig\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 pluginName of pluginNames) {\n try {\n debugLogger.state('TEAM_CONFIG_INSTALL_PLUGIN', {\n pluginName,\n targetDir: installDir,\n })\n\n await installPluginFromMarketplace(\n pluginName,\n undefined, // Search all marketplaces\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): 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: ~/.minto/agents\n const agentsDir = 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): 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: ~/.minto/agents\n const agentsDir = 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', { name: agent.name })\n\n // Generate agent markdown file\n const tools =\n 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): Promise<{ installed: boolean; error?: string }> {\n const { join } = 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: ~/.minto/hooks.json\n const mintoDir = join(homedir(), '.minto')\n if (!existsSync(mintoDir)) {\n mkdirSync(mintoDir, { recursive: true })\n }\n\n const hooksPath = join(mintoDir, 'hooks.json')\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"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["existsSync", "readFileSync"]
|
|
7
7
|
}
|
package/dist/version.js
CHANGED
package/dist/version.js.map
CHANGED
|
@@ -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.
|
|
4
|
+
"sourcesContent": ["/**\n * Application version\n * This file is auto-generated during build process\n */\n\nexport const VERSION = '0.3.5'\nexport const BUILD_DATE = '2026-02-03T09:16:59.096Z'\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.
|
|
3
|
+
"version": "0.3.5",
|
|
4
4
|
"description": "AI-powered strategic research and planning assistant",
|
|
5
5
|
"author": "Lib <within-7>",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -39,11 +39,11 @@
|
|
|
39
39
|
"release:dry-run": "node scripts/release-full.js --dry-run"
|
|
40
40
|
},
|
|
41
41
|
"optionalDependencies": {
|
|
42
|
-
"@within-7/minto-darwin-arm64": "0.3.
|
|
43
|
-
"@within-7/minto-darwin-x64": "0.3.
|
|
44
|
-
"@within-7/minto-linux-arm64": "0.3.
|
|
45
|
-
"@within-7/minto-linux-x64": "0.3.
|
|
46
|
-
"@within-7/minto-win32-x64": "0.3.
|
|
42
|
+
"@within-7/minto-darwin-arm64": "0.3.4",
|
|
43
|
+
"@within-7/minto-darwin-x64": "0.3.4",
|
|
44
|
+
"@within-7/minto-linux-arm64": "0.3.4",
|
|
45
|
+
"@within-7/minto-linux-x64": "0.3.4",
|
|
46
|
+
"@within-7/minto-win32-x64": "0.3.4"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
49
|
"@anthropic-ai/bedrock-sdk": "^0.12.6",
|