overmind-mcp 2.8.52 → 2.9.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 (85) hide show
  1. package/dist/bridge/ScenarioLoader.d.ts +20 -1
  2. package/dist/bridge/ScenarioLoader.d.ts.map +1 -1
  3. package/dist/bridge/ScenarioLoader.js +42 -0
  4. package/dist/bridge/ScenarioLoader.js.map +1 -1
  5. package/dist/index.d.ts +4 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +3 -2
  8. package/dist/index.js.map +1 -1
  9. package/dist/lib/agent_lifecycle.d.ts +19 -0
  10. package/dist/lib/agent_lifecycle.d.ts.map +1 -1
  11. package/dist/lib/agent_lifecycle.js +92 -1
  12. package/dist/lib/agent_lifecycle.js.map +1 -1
  13. package/dist/lib/config.d.ts +21 -49
  14. package/dist/lib/config.d.ts.map +1 -1
  15. package/dist/lib/config.js +40 -94
  16. package/dist/lib/config.js.map +1 -1
  17. package/dist/lib/orchestration/dispatcher.d.ts +13 -0
  18. package/dist/lib/orchestration/dispatcher.d.ts.map +1 -1
  19. package/dist/lib/orchestration/dispatcher.js +100 -0
  20. package/dist/lib/orchestration/dispatcher.js.map +1 -1
  21. package/dist/lib/processRegistry.js +1 -1
  22. package/dist/lib/processRegistry.js.map +1 -1
  23. package/dist/lib/sessions.js +1 -1
  24. package/dist/lib/sessions.js.map +1 -1
  25. package/dist/services/AgentManager.d.ts +4 -4
  26. package/dist/services/AgentManager.d.ts.map +1 -1
  27. package/dist/services/AgentManager.js +151 -201
  28. package/dist/services/AgentManager.js.map +1 -1
  29. package/dist/services/HermesProfileManager.d.ts +106 -0
  30. package/dist/services/HermesProfileManager.d.ts.map +1 -0
  31. package/dist/services/HermesProfileManager.js +401 -0
  32. package/dist/services/HermesProfileManager.js.map +1 -0
  33. package/dist/services/HermesRunner.d.ts +53 -0
  34. package/dist/services/HermesRunner.d.ts.map +1 -0
  35. package/dist/services/HermesRunner.js +313 -0
  36. package/dist/services/HermesRunner.js.map +1 -0
  37. package/dist/services/KanbanAdapter.d.ts +135 -0
  38. package/dist/services/KanbanAdapter.d.ts.map +1 -0
  39. package/dist/services/KanbanAdapter.js +320 -0
  40. package/dist/services/KanbanAdapter.js.map +1 -0
  41. package/dist/tools/manage_agents.js +4 -4
  42. package/dist/tools/manage_agents.js.map +1 -1
  43. package/dist/tools/memory_store.d.ts +1 -1
  44. package/dist/tools/run_hermes.d.ts +1 -0
  45. package/dist/tools/run_hermes.d.ts.map +1 -1
  46. package/dist/tools/run_hermes.js +12 -6
  47. package/dist/tools/run_hermes.js.map +1 -1
  48. package/docs/MIGRATION_V3.1.md +143 -0
  49. package/docs/PLAN_MIGRATION_V3.md +339 -0
  50. package/package.json +2 -2
  51. package/scripts/migrate-to-profiles.mjs +205 -0
  52. package/dist/lib/orchestration/swarm.d.ts +0 -76
  53. package/dist/lib/orchestration/swarm.d.ts.map +0 -1
  54. package/dist/lib/orchestration/swarm.js +0 -241
  55. package/dist/lib/orchestration/swarm.js.map +0 -1
  56. package/dist/prompts/agent_prompts.d.ts +0 -2
  57. package/dist/prompts/agent_prompts.d.ts.map +0 -1
  58. package/dist/prompts/agent_prompts.js +0 -21
  59. package/dist/prompts/agent_prompts.js.map +0 -1
  60. package/dist/services/NousHermesRunner.d.ts +0 -83
  61. package/dist/services/NousHermesRunner.d.ts.map +0 -1
  62. package/dist/services/NousHermesRunner.js +0 -1241
  63. package/dist/services/NousHermesRunner.js.map +0 -1
  64. package/dist/services/hermes/binaryFinder.d.ts +0 -8
  65. package/dist/services/hermes/binaryFinder.d.ts.map +0 -1
  66. package/dist/services/hermes/binaryFinder.js +0 -92
  67. package/dist/services/hermes/binaryFinder.js.map +0 -1
  68. package/dist/services/hermes/configYamlFilter.d.ts +0 -12
  69. package/dist/services/hermes/configYamlFilter.d.ts.map +0 -1
  70. package/dist/services/hermes/configYamlFilter.js +0 -70
  71. package/dist/services/hermes/configYamlFilter.js.map +0 -1
  72. package/dist/services/hermes/providerConfig.d.ts +0 -19
  73. package/dist/services/hermes/providerConfig.d.ts.map +0 -1
  74. package/dist/services/hermes/providerConfig.js +0 -53
  75. package/dist/services/hermes/providerConfig.js.map +0 -1
  76. package/dist/services/hermesTokenResolver.d.ts +0 -74
  77. package/dist/services/hermesTokenResolver.d.ts.map +0 -1
  78. package/dist/services/hermesTokenResolver.js +0 -140
  79. package/dist/services/hermesTokenResolver.js.map +0 -1
  80. package/dist/tools/initialization_check.d.ts +0 -2
  81. package/dist/tools/initialization_check.d.ts.map +0 -1
  82. package/dist/tools/initialization_check.js +0 -23
  83. package/dist/tools/initialization_check.js.map +0 -1
  84. /package/bin/{launch.js → launch.cjs} +0 -0
  85. /package/dist/bin/{launch.js → launch.cjs} +0 -0
@@ -0,0 +1,106 @@
1
+ /**
2
+ * HermesProfileManager — Thin wrapper around `hermes profile` CLI.
3
+ *
4
+ * ╔════════════════════════════════════════════════════════════════════════╗
5
+ * ║ PURPOSE ║
6
+ * ║ ║
7
+ * ║ Replaces the old dual-layout (HERMES_HOME/agents/<name>/settings.json ║
8
+ * ║ vs .claude/settings_<name>.json) with the native Hermes profile system. ║
9
+ * ║ ║
10
+ * ║ Each Overmind Hermes agent = one Hermes profile: ║
11
+ * ║ ~/.hermes/profiles/<name>/ ║
12
+ * ║ ├── config.yaml (provider, model, mcp_servers) ║
13
+ * ║ ├── .env (credentials) ║
14
+ * ║ ├── SOUL.md (system prompt) ║
15
+ * ║ ├── memories/ (state.db — isolated) ║
16
+ * ║ ├── sessions/ (conversation history) ║
17
+ * ║ └── skills/ (procedural memory) ║
18
+ * ║ ║
19
+ * ║ All operations go through `hermes profile` CLI — no manual file ║
20
+ * ║ management, no HERMES_HOME guessing. ║
21
+ * ╚════════════════════════════════════════════════════════════════════════╝
22
+ */
23
+ export interface HermesProfileInfo {
24
+ name: string;
25
+ model: string;
26
+ gateway: string;
27
+ skills: number;
28
+ active: boolean;
29
+ }
30
+ export interface CreateProfileOptions {
31
+ name: string;
32
+ prompt: string;
33
+ model: string;
34
+ provider?: string;
35
+ credentials: Record<string, string>;
36
+ mcpServers?: string[];
37
+ description?: string;
38
+ }
39
+ export declare class HermesProfileManager {
40
+ /**
41
+ * Check if a Hermes profile exists.
42
+ */
43
+ static exists(name: string): boolean;
44
+ /**
45
+ * List all Hermes profiles.
46
+ */
47
+ static list(): Promise<HermesProfileInfo[]>;
48
+ /**
49
+ * Parse `hermes profile list` output into structured data.
50
+ *
51
+ * Output format:
52
+ * Profile Model Gateway Alias
53
+ * ─────────────── ─────────────────────────── ─────────── ───────────
54
+ * ◆default MiniMax-M3 stopped —
55
+ * testwrapper — stopped —
56
+ */
57
+ static parseProfileList(rawOutput: string): HermesProfileInfo[];
58
+ /**
59
+ * Create a new Hermes profile with all configuration.
60
+ *
61
+ * Steps:
62
+ * 1. hermes profile create <name> --no-alias --description "<desc>"
63
+ * 2. hermes -p <name> config set model.provider <provider>
64
+ * 3. hermes -p <name> config set model.model <model>
65
+ * 4. Write .env with credentials
66
+ * 5. Write SOUL.md with system prompt
67
+ * 6. Optionally set mcp_servers in config.yaml
68
+ */
69
+ static create(opts: CreateProfileOptions): Promise<{
70
+ profilePath: string;
71
+ soulPath: string;
72
+ }>;
73
+ /**
74
+ * Delete a Hermes profile permanently.
75
+ */
76
+ static delete(name: string): Promise<void>;
77
+ /**
78
+ * Get the filesystem path for a profile.
79
+ * v3.1: ~/.overmind/hermes/profiles/<name>/
80
+ */
81
+ static getProfilePath(name: string): Promise<string | null>;
82
+ /**
83
+ * Set MCP servers in a profile's config.yaml.
84
+ *
85
+ * Reads the workspace .mcp.json to get the actual server configs (URL, command, etc.)
86
+ * and writes them as proper YAML entries in the profile's config.yaml.
87
+ */
88
+ static setMcpServers(profileName: string, servers: string[], profilePath: string): Promise<void>;
89
+ /** Write profile.yaml (kanban description — OBLIGATOIRE) */
90
+ private static writeProfileYaml;
91
+ /** Write workspace.yaml (kind: scratch|persistent|shared) */
92
+ private static writeWorkspaceYaml;
93
+ /** Write README.md (role + contacts) */
94
+ private static writeReadme;
95
+ /**
96
+ * Update specific fields of an existing profile.
97
+ */
98
+ static update(name: string, updates: {
99
+ model?: string;
100
+ provider?: string;
101
+ credentials?: Record<string, string>;
102
+ prompt?: string;
103
+ mcpServers?: string[];
104
+ }): Promise<void>;
105
+ }
106
+ //# sourceMappingURL=HermesProfileManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HermesProfileManager.d.ts","sourceRoot":"","sources":["../../src/services/HermesProfileManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAaH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAoBD,qBAAa,oBAAoB;IAC/B;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAUpC;;OAEG;WACU,IAAI,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAUjD;;;;;;;;OAQG;IACH,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,EAAE;IAyB/D;;;;;;;;;;OAUG;WACU,MAAM,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAkEnG;;OAEG;WACU,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAahD;;;OAGG;WACU,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAoBjE;;;;;OAKG;WACU,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmFtG,4DAA4D;IAC5D,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAa/B,6DAA6D;IAC7D,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAUjC,wCAAwC;IACxC,OAAO,CAAC,MAAM,CAAC,WAAW;IAgB1B;;OAEG;WACU,MAAM,CACjB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,GACA,OAAO,CAAC,IAAI,CAAC;CAqDjB"}
@@ -0,0 +1,401 @@
1
+ /**
2
+ * HermesProfileManager — Thin wrapper around `hermes profile` CLI.
3
+ *
4
+ * ╔════════════════════════════════════════════════════════════════════════╗
5
+ * ║ PURPOSE ║
6
+ * ║ ║
7
+ * ║ Replaces the old dual-layout (HERMES_HOME/agents/<name>/settings.json ║
8
+ * ║ vs .claude/settings_<name>.json) with the native Hermes profile system. ║
9
+ * ║ ║
10
+ * ║ Each Overmind Hermes agent = one Hermes profile: ║
11
+ * ║ ~/.hermes/profiles/<name>/ ║
12
+ * ║ ├── config.yaml (provider, model, mcp_servers) ║
13
+ * ║ ├── .env (credentials) ║
14
+ * ║ ├── SOUL.md (system prompt) ║
15
+ * ║ ├── memories/ (state.db — isolated) ║
16
+ * ║ ├── sessions/ (conversation history) ║
17
+ * ║ └── skills/ (procedural memory) ║
18
+ * ║ ║
19
+ * ║ All operations go through `hermes profile` CLI — no manual file ║
20
+ * ║ management, no HERMES_HOME guessing. ║
21
+ * ╚════════════════════════════════════════════════════════════════════════╝
22
+ */
23
+ import { exec } from 'child_process';
24
+ import { promisify } from 'util';
25
+ import fs from 'fs';
26
+ import path from 'path';
27
+ import { rootLogger } from '../lib/logger.js';
28
+ const execAsync = promisify(exec);
29
+ const logger = rootLogger.child({ module: 'HermesProfileManager' });
30
+ const SAFE_NAME_RE = /^[a-zA-Z0-9_-]+$/;
31
+ /**
32
+ * Detect the Hermes provider name from a model string.
33
+ * Used when the caller doesn't specify --provider explicitly.
34
+ */
35
+ function detectProviderFromModel(model) {
36
+ const lower = model.toLowerCase();
37
+ if (lower.includes('minimax') || lower.includes('m3'))
38
+ return 'minimax-cn';
39
+ if (lower.includes('glm') || lower.includes('zai'))
40
+ return 'zai';
41
+ if (lower.includes('claude') || lower.includes('sonnet') || lower.includes('opus') || lower.includes('haiku'))
42
+ return 'anthropic';
43
+ if (lower.includes('gpt'))
44
+ return 'openai';
45
+ if (lower.includes('gemini'))
46
+ return 'gemini';
47
+ if (lower.includes('deepseek'))
48
+ return 'deepseek';
49
+ if (lower.includes('kimi') || lower.includes('moonshot'))
50
+ return 'kimi-coding';
51
+ if (lower.includes('qwen') || lower.includes('dashscope'))
52
+ return 'alibaba';
53
+ if (lower.includes('grok') || lower.includes('xai'))
54
+ return 'xai';
55
+ return 'openrouter'; // Safe default
56
+ }
57
+ export class HermesProfileManager {
58
+ /**
59
+ * Check if a Hermes profile exists.
60
+ */
61
+ static exists(name) {
62
+ if (!SAFE_NAME_RE.test(name))
63
+ return false;
64
+ try {
65
+ const { stdout } = require_execSync(`hermes profile list`);
66
+ return stdout.includes(name);
67
+ }
68
+ catch {
69
+ return false;
70
+ }
71
+ }
72
+ /**
73
+ * List all Hermes profiles.
74
+ */
75
+ static async list() {
76
+ try {
77
+ const { stdout } = await execAsync('hermes profile list');
78
+ return this.parseProfileList(stdout);
79
+ }
80
+ catch (e) {
81
+ logger.warn({ error: e }, 'Failed to list Hermes profiles');
82
+ return [];
83
+ }
84
+ }
85
+ /**
86
+ * Parse `hermes profile list` output into structured data.
87
+ *
88
+ * Output format:
89
+ * Profile Model Gateway Alias
90
+ * ─────────────── ─────────────────────────── ─────────── ───────────
91
+ * ◆default MiniMax-M3 stopped —
92
+ * testwrapper — stopped —
93
+ */
94
+ static parseProfileList(rawOutput) {
95
+ const lines = rawOutput.split(/\r?\n/);
96
+ const profiles = [];
97
+ for (const line of lines) {
98
+ // Match lines with profile data (skip header + separator)
99
+ // Active profile has ◆ prefix, others have leading space
100
+ const match = line.match(/^(◆|\s)\s*(\S+)\s+(.+?)\s{2,}(\S+)\s{2,}(\S+)/);
101
+ if (!match)
102
+ continue;
103
+ const active = match[1] === '◆';
104
+ const name = match[2];
105
+ const model = match[3].trim();
106
+ const gateway = match[4];
107
+ // Skills count is sometimes missing from the basic list output
108
+ // Skip header lines
109
+ if (name === 'Profile' || name.startsWith('─'))
110
+ continue;
111
+ profiles.push({ name, model, gateway, skills: 0, active });
112
+ }
113
+ return profiles;
114
+ }
115
+ /**
116
+ * Create a new Hermes profile with all configuration.
117
+ *
118
+ * Steps:
119
+ * 1. hermes profile create <name> --no-alias --description "<desc>"
120
+ * 2. hermes -p <name> config set model.provider <provider>
121
+ * 3. hermes -p <name> config set model.model <model>
122
+ * 4. Write .env with credentials
123
+ * 5. Write SOUL.md with system prompt
124
+ * 6. Optionally set mcp_servers in config.yaml
125
+ */
126
+ static async create(opts) {
127
+ const { name, prompt, model } = opts;
128
+ if (!SAFE_NAME_RE.test(name)) {
129
+ throw new Error(`Invalid profile name: '${name}'. Only [a-zA-Z0-9_-] allowed.`);
130
+ }
131
+ const provider = opts.provider || detectProviderFromModel(model);
132
+ const description = opts.description || `Overmind agent: ${name}`;
133
+ logger.info({ name, model, provider }, '[CREATE] Creating Hermes profile.');
134
+ // 1. Create profile (no-alias to avoid polluting PATH)
135
+ const createCmd = `hermes profile create "${name}" --no-alias --description "${description.replace(/"/g, '\\"')}"`;
136
+ try {
137
+ await execAsync(createCmd);
138
+ }
139
+ catch (e) {
140
+ // Profile might already exist — that's OK if it does
141
+ const msg = e instanceof Error ? e.message : String(e);
142
+ if (!msg.includes('already exists')) {
143
+ throw new Error(`Failed to create profile '${name}': ${msg}`);
144
+ }
145
+ logger.warn({ name }, '[CREATE] Profile already exists, will update configuration.');
146
+ }
147
+ // 2. Set provider + model in config.yaml
148
+ await execAsync(`hermes -p "${name}" config set model.provider "${provider}"`);
149
+ await execAsync(`hermes -p "${name}" config set model.model "${model}"`);
150
+ // 3. Get profile path
151
+ const profilePath = await this.getProfilePath(name);
152
+ if (!profilePath) {
153
+ throw new Error(`Could not resolve profile path for '${name}'`);
154
+ }
155
+ // 4. Write .env with credentials
156
+ const envPath = path.join(profilePath, '.env');
157
+ const envLines = ['# Overmind-managed credentials for Hermes profile'];
158
+ for (const [key, value] of Object.entries(opts.credentials)) {
159
+ envLines.push(`${key}=${value}`);
160
+ }
161
+ fs.writeFileSync(envPath, envLines.join('\n') + '\n', 'utf-8');
162
+ // 5. Write SOUL.md (system prompt)
163
+ const soulPath = path.join(profilePath, 'SOUL.md');
164
+ fs.writeFileSync(soulPath, prompt, 'utf-8');
165
+ // 6. Optionally set MCP servers
166
+ if (opts.mcpServers && opts.mcpServers.length > 0) {
167
+ await this.setMcpServers(name, opts.mcpServers, profilePath);
168
+ }
169
+ // 7. Generate profile.yaml (kanban routing — OBLIGATOIRE)
170
+ this.writeProfileYaml(profilePath, name, description, model);
171
+ // 8. Generate workspace.yaml
172
+ this.writeWorkspaceYaml(profilePath, 'persistent');
173
+ // 9. Generate README.md
174
+ this.writeReadme(profilePath, name, description);
175
+ logger.info({ name, profilePath }, '[CREATE] Profile created successfully.');
176
+ return { profilePath, soulPath };
177
+ }
178
+ /**
179
+ * Delete a Hermes profile permanently.
180
+ */
181
+ static async delete(name) {
182
+ if (!SAFE_NAME_RE.test(name)) {
183
+ throw new Error(`Invalid profile name: '${name}'`);
184
+ }
185
+ try {
186
+ await execAsync(`hermes profile delete "${name}" --yes`);
187
+ logger.info({ name }, '[DELETE] Profile deleted.');
188
+ }
189
+ catch (e) {
190
+ logger.warn({ name, error: e }, '[DELETE] Failed to delete profile.');
191
+ throw e;
192
+ }
193
+ }
194
+ /**
195
+ * Get the filesystem path for a profile.
196
+ * v3.1: ~/.overmind/hermes/profiles/<name>/
197
+ */
198
+ static async getProfilePath(name) {
199
+ try {
200
+ // 1. Canonical v3.1: ~/.overmind/hermes/profiles/<name>/
201
+ const overmindBase = process.env.LOCALAPPDATA || process.env.HOME || '';
202
+ const v31Path = process.platform === 'win32'
203
+ ? path.join(overmindBase, 'overmind', 'hermes', 'profiles', name)
204
+ : path.join(overmindBase, '.overmind', 'hermes', 'profiles', name);
205
+ if (fs.existsSync(v31Path))
206
+ return v31Path;
207
+ // 2. Native Hermes: ~/.hermes/profiles/<name>/
208
+ const nativePath = path.join(overmindBase, '.hermes', 'profiles', name);
209
+ if (fs.existsSync(nativePath))
210
+ return nativePath;
211
+ // 3. Return canonical v3.1 path even if it doesn't exist yet
212
+ return v31Path;
213
+ }
214
+ catch {
215
+ return null;
216
+ }
217
+ }
218
+ /**
219
+ * Set MCP servers in a profile's config.yaml.
220
+ *
221
+ * Reads the workspace .mcp.json to get the actual server configs (URL, command, etc.)
222
+ * and writes them as proper YAML entries in the profile's config.yaml.
223
+ */
224
+ static async setMcpServers(profileName, servers, profilePath) {
225
+ const configPath = path.join(profilePath, 'config.yaml');
226
+ // Read existing config or start fresh
227
+ let configContent = '';
228
+ try {
229
+ configContent = fs.readFileSync(configPath, 'utf-8');
230
+ }
231
+ catch {
232
+ configContent = '';
233
+ }
234
+ // Read the workspace .mcp.json to get actual server configs
235
+ const { getWorkspaceDir } = await import('../lib/config.js');
236
+ let mcpConfigs = {};
237
+ try {
238
+ const mcpJsonPath = path.join(getWorkspaceDir(), '.mcp.json');
239
+ const mcpContent = fs.readFileSync(mcpJsonPath, 'utf-8');
240
+ const parsed = JSON.parse(mcpContent);
241
+ mcpConfigs = parsed.mcpServers || parsed.mcp_servers || {};
242
+ }
243
+ catch {
244
+ logger.warn('[SET_MCP] Could not read workspace .mcp.json — MCP servers will not be configured.');
245
+ return;
246
+ }
247
+ // Build the mcp_servers YAML block
248
+ // Remove any existing mcp_servers section first
249
+ const lines = configContent.split(/\r?\n/);
250
+ const filtered = lines.filter((line, i) => {
251
+ // Remove existing mcp_servers block
252
+ if (line.match(/^mcp_servers:/))
253
+ return false;
254
+ // Check if we're inside an mcp_servers block (indented after mcp_servers:)
255
+ let inBlock = false;
256
+ for (let j = i - 1; j >= 0; j--) {
257
+ if (lines[j].match(/^mcp_servers:/)) {
258
+ // Check if current line is indented (part of the block)
259
+ if (line.match(/^\s/) && !line.match(/^\S/)) {
260
+ inBlock = true;
261
+ }
262
+ break;
263
+ }
264
+ // If we hit a non-indented non-empty line that's not mcp_servers, we're outside
265
+ if (lines[j].trim() && !lines[j].match(/^\s/))
266
+ break;
267
+ }
268
+ return !inBlock;
269
+ });
270
+ configContent = filtered.join('\n').replace(/\n{3,}/g, '\n\n').trimEnd();
271
+ // Add the mcp_servers block with real configs
272
+ const yamlLines = ['\n\nmcp_servers:'];
273
+ let added = 0;
274
+ for (const serverName of servers) {
275
+ const cfg = mcpConfigs[serverName];
276
+ if (cfg && cfg.url) {
277
+ yamlLines.push(` ${serverName}:`);
278
+ yamlLines.push(` url: ${cfg.url}`);
279
+ added++;
280
+ }
281
+ else if (cfg && cfg.command) {
282
+ yamlLines.push(` ${serverName}:`);
283
+ yamlLines.push(` command: ${cfg.command}`);
284
+ if (cfg.args && cfg.args.length > 0) {
285
+ yamlLines.push(` args:`);
286
+ for (const arg of cfg.args) {
287
+ yamlLines.push(` - ${arg}`);
288
+ }
289
+ }
290
+ added++;
291
+ }
292
+ else {
293
+ logger.warn({ serverName }, '[SET_MCP] Server not found in .mcp.json — skipping.');
294
+ }
295
+ }
296
+ if (added > 0) {
297
+ configContent += '\n' + yamlLines.join('\n') + '\n';
298
+ fs.writeFileSync(configPath, configContent, 'utf-8');
299
+ logger.info({ profileName, added }, '[SET_MCP] MCP servers configured in config.yaml.');
300
+ }
301
+ else {
302
+ logger.warn({ profileName }, '[SET_MCP] No MCP servers could be configured.');
303
+ }
304
+ }
305
+ // ─── v3.1 Profile Scaffolding ────────────────────────────────────────────
306
+ /** Write profile.yaml (kanban description — OBLIGATOIRE) */
307
+ static writeProfileYaml(profilePath, name, description, model) {
308
+ const yaml = [
309
+ '# Profile metadata — kanban routing (OBLIGATOIRE)',
310
+ `name: "${name}"`,
311
+ `description: "${description.replace(/"/g, '\\"')}"`,
312
+ `model: "${model}"`,
313
+ 'workspace: persistent',
314
+ `created: ${new Date().toISOString()}`,
315
+ '',
316
+ ].join('\n');
317
+ fs.writeFileSync(path.join(profilePath, 'profile.yaml'), yaml, 'utf-8');
318
+ }
319
+ /** Write workspace.yaml (kind: scratch|persistent|shared) */
320
+ static writeWorkspaceYaml(profilePath, kind) {
321
+ const yaml = [
322
+ `kind: ${kind}`,
323
+ `path: ${profilePath}`,
324
+ `gc_eligible: false`,
325
+ '',
326
+ ].join('\n');
327
+ fs.writeFileSync(path.join(profilePath, 'workspace.yaml'), yaml, 'utf-8');
328
+ }
329
+ /** Write README.md (role + contacts) */
330
+ static writeReadme(profilePath, name, description) {
331
+ const md = [
332
+ `# ${name}`,
333
+ '',
334
+ `**Role**: ${description}`,
335
+ '',
336
+ `**Owner**: overmind-mcp`,
337
+ `**Created**: ${new Date().toISOString()}`,
338
+ '',
339
+ '---',
340
+ 'Generated by overmind-mcp v3.1',
341
+ '',
342
+ ].join('\n');
343
+ fs.writeFileSync(path.join(profilePath, 'README.md'), md, 'utf-8');
344
+ }
345
+ /**
346
+ * Update specific fields of an existing profile.
347
+ */
348
+ static async update(name, updates) {
349
+ if (!SAFE_NAME_RE.test(name)) {
350
+ throw new Error(`Invalid profile name: '${name}'`);
351
+ }
352
+ const profilePath = await this.getProfilePath(name);
353
+ if (!profilePath || !fs.existsSync(profilePath)) {
354
+ throw new Error(`Profile '${name}' not found.`);
355
+ }
356
+ // Update model + provider
357
+ if (updates.model) {
358
+ const provider = updates.provider || detectProviderFromModel(updates.model);
359
+ await execAsync(`hermes -p "${name}" config set model.provider "${provider}"`);
360
+ await execAsync(`hermes -p "${name}" config set model.model "${updates.model}"`);
361
+ }
362
+ // Update credentials
363
+ if (updates.credentials) {
364
+ const envPath = path.join(profilePath, '.env');
365
+ let envContent = '';
366
+ try {
367
+ envContent = fs.readFileSync(envPath, 'utf-8');
368
+ }
369
+ catch {
370
+ envContent = '';
371
+ }
372
+ for (const [key, value] of Object.entries(updates.credentials)) {
373
+ // Replace existing key or append
374
+ const regex = new RegExp(`^${key}=.*$`, 'm');
375
+ if (regex.test(envContent)) {
376
+ envContent = envContent.replace(regex, `${key}=${value}`);
377
+ }
378
+ else {
379
+ envContent += `${key}=${value}\n`;
380
+ }
381
+ }
382
+ fs.writeFileSync(envPath, envContent, 'utf-8');
383
+ }
384
+ // Update SOUL.md
385
+ if (updates.prompt) {
386
+ const soulPath = path.join(profilePath, 'SOUL.md');
387
+ fs.writeFileSync(soulPath, updates.prompt, 'utf-8');
388
+ }
389
+ // Update MCP servers
390
+ if (updates.mcpServers) {
391
+ await this.setMcpServers(name, updates.mcpServers, profilePath);
392
+ }
393
+ logger.info({ name, updates: Object.keys(updates) }, '[UPDATE] Profile updated.');
394
+ }
395
+ }
396
+ // ─── Inline helpers (avoid circular imports) ──────────────────────────────────
397
+ function require_execSync(cmd) {
398
+ const { execSync } = require('child_process');
399
+ return { stdout: execSync(cmd, { encoding: 'utf-8', timeout: 10000 }) };
400
+ }
401
+ //# sourceMappingURL=HermesProfileManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HermesProfileManager.js","sourceRoot":"","sources":["../../src/services/HermesProfileManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * HermesRunner — Thin wrapper around the native Hermes Agent CLI.
3
+ *
4
+ * ╔════════════════════════════════════════════════════════════════════════╗
5
+ * ║ ARCHITECTURE (v3.0 — Refactored) ║
6
+ * ║ ║
7
+ * ║ This runner replaces the 1391-line NousHermesRunner. It does NOT: ║
8
+ * ║ - Resolve tokens (Hermes .env per-profile does that) ║
9
+ * ║ - Detect providers (Hermes config.yaml does that) ║
10
+ * ║ - Manage HERMES_HOME custom paths (Hermes ~/.hermes native) ║
11
+ * ║ - Filter config.yaml (1 config per profile now) ║
12
+ * ║ - Find the hermes binary (it's in PATH) ║
13
+ * ║ ║
14
+ * ║ It DOES: ║
15
+ * ║ - Spawn: hermes -p <profile> chat -q "<prompt>" -Q --yolo ║
16
+ * ║ - Capture stdout (response) + stderr (session_id + diagnostics) ║
17
+ * ║ - Handle timeout + abort signal ║
18
+ * ║ - Register with agent_lifecycle + processRegistry (UI parity) ║
19
+ * ║ ║
20
+ * ║ Profile management is handled by AgentManager via: ║
21
+ * ║ hermes profile create / delete / list / show ║
22
+ * ║ ║
23
+ * ║ Session resume is handled by: ║
24
+ * ║ hermes -p <name> chat -q "<prompt>" --resume <sessionId> ║
25
+ * ╚════════════════════════════════════════════════════════════════════════╝
26
+ */
27
+ export interface RunAgentOptions {
28
+ prompt: string;
29
+ agentName?: string;
30
+ sessionId?: string;
31
+ autoResume?: boolean;
32
+ cwd?: string;
33
+ configPath?: string;
34
+ silent?: boolean;
35
+ model?: string;
36
+ provider?: string;
37
+ signal?: AbortSignal;
38
+ }
39
+ export interface RunAgentResult {
40
+ result: string;
41
+ sessionId?: string;
42
+ error?: string;
43
+ rawOutput?: string;
44
+ model?: string;
45
+ }
46
+ export declare class HermesRunner {
47
+ private timeoutMs;
48
+ private MAX_BUF;
49
+ constructor();
50
+ runAgent(options: RunAgentOptions): Promise<RunAgentResult>;
51
+ private runAgentInternal;
52
+ }
53
+ //# sourceMappingURL=HermesRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HermesRunner.d.ts","sourceRoot":"","sources":["../../src/services/HermesRunner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAsBH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAkCD,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAoB;;IAM7B,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;YA6CnD,gBAAgB;CAiP/B"}