overmind-mcp 2.6.1 → 2.8.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.
- package/.mcp.json.example +41 -21
- package/README.md +179 -187
- package/bin/README.md +44 -34
- package/bin/install-overmind-windows.bat +56 -12
- package/dist/bin/cli.js +115 -24
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/overmind-client.d.ts +77 -0
- package/dist/bin/overmind-client.d.ts.map +1 -0
- package/dist/bin/overmind-client.js +221 -0
- package/dist/bin/overmind-client.js.map +1 -0
- package/dist/lib/agent_lifecycle.d.ts +91 -0
- package/dist/lib/agent_lifecycle.d.ts.map +1 -0
- package/dist/lib/agent_lifecycle.js +155 -0
- package/dist/lib/agent_lifecycle.js.map +1 -0
- package/dist/lib/config.d.ts +5 -26
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +33 -12
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/envUtils.d.ts +1 -1
- package/dist/lib/envUtils.d.ts.map +1 -1
- package/dist/lib/envUtils.js +11 -4
- package/dist/lib/envUtils.js.map +1 -1
- package/dist/lib/loadEnv.d.ts.map +1 -1
- package/dist/lib/loadEnv.js +9 -4
- package/dist/lib/loadEnv.js.map +1 -1
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +20 -4
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/orchestration/dispatcher.d.ts.map +1 -1
- package/dist/lib/orchestration/dispatcher.js +10 -1
- package/dist/lib/orchestration/dispatcher.js.map +1 -1
- package/dist/lib/orchestration/swarm.d.ts +1 -0
- package/dist/lib/orchestration/swarm.d.ts.map +1 -1
- package/dist/lib/orchestration/swarm.js +11 -9
- package/dist/lib/orchestration/swarm.js.map +1 -1
- package/dist/lib/processRegistry.d.ts +2 -50
- package/dist/lib/processRegistry.d.ts.map +1 -1
- package/dist/lib/processRegistry.js +191 -286
- package/dist/lib/processRegistry.js.map +1 -1
- package/dist/memory/MemoryFactory.d.ts.map +1 -1
- package/dist/memory/MemoryFactory.js +2 -1
- package/dist/memory/MemoryFactory.js.map +1 -1
- package/dist/memory/PostgresMemoryProvider.d.ts +1 -0
- package/dist/memory/PostgresMemoryProvider.d.ts.map +1 -1
- package/dist/memory/PostgresMemoryProvider.js +22 -3
- package/dist/memory/PostgresMemoryProvider.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +84 -80
- package/dist/server.js.map +1 -1
- package/dist/services/AgentManager.d.ts +1 -0
- package/dist/services/AgentManager.d.ts.map +1 -1
- package/dist/services/AgentManager.js +27 -1
- package/dist/services/AgentManager.js.map +1 -1
- package/dist/services/ClaudeRunner.d.ts +0 -12
- package/dist/services/ClaudeRunner.d.ts.map +1 -1
- package/dist/services/ClaudeRunner.js +26 -132
- package/dist/services/ClaudeRunner.js.map +1 -1
- package/dist/services/ClineRunner.d.ts.map +1 -1
- package/dist/services/ClineRunner.js +16 -7
- package/dist/services/ClineRunner.js.map +1 -1
- package/dist/services/GeminiRunner.d.ts.map +1 -1
- package/dist/services/GeminiRunner.js +13 -6
- package/dist/services/GeminiRunner.js.map +1 -1
- package/dist/services/KiloRunner.d.ts.map +1 -1
- package/dist/services/KiloRunner.js +7 -4
- package/dist/services/KiloRunner.js.map +1 -1
- package/dist/services/NousHermesRunner.d.ts +4 -0
- package/dist/services/NousHermesRunner.d.ts.map +1 -1
- package/dist/services/NousHermesRunner.js +131 -34
- package/dist/services/NousHermesRunner.js.map +1 -1
- package/dist/services/OpenClawRunner.d.ts.map +1 -1
- package/dist/services/OpenClawRunner.js +16 -7
- package/dist/services/OpenClawRunner.js.map +1 -1
- package/dist/services/OpenCodeRunner.d.ts.map +1 -1
- package/dist/services/OpenCodeRunner.js +16 -7
- package/dist/services/OpenCodeRunner.js.map +1 -1
- package/dist/services/PromptManager.d.ts.map +1 -1
- package/dist/services/PromptManager.js +4 -0
- package/dist/services/PromptManager.js.map +1 -1
- package/dist/services/QwenCliRunner.d.ts.map +1 -1
- package/dist/services/QwenCliRunner.js +16 -7
- package/dist/services/QwenCliRunner.js.map +1 -1
- package/dist/tools/agent_control.d.ts +2 -69
- package/dist/tools/agent_control.d.ts.map +1 -1
- package/dist/tools/agent_control.js +191 -275
- package/dist/tools/agent_control.js.map +1 -1
- package/dist/tools/config_example.d.ts +2 -2
- package/dist/tools/config_example.d.ts.map +1 -1
- package/dist/tools/config_example.js +2 -4
- package/dist/tools/config_example.js.map +1 -1
- package/dist/tools/create_agent.d.ts.map +1 -1
- package/dist/tools/create_agent.js +11 -0
- package/dist/tools/create_agent.js.map +1 -1
- package/dist/tools/manage_agents.d.ts.map +1 -1
- package/dist/tools/manage_agents.js +3 -2
- package/dist/tools/manage_agents.js.map +1 -1
- package/dist/tools/memory_store.d.ts +1 -1
- package/dist/tools/run_agent.d.ts +1 -2
- package/dist/tools/run_agent.d.ts.map +1 -1
- package/dist/tools/run_agent.js +1 -13
- package/dist/tools/run_agent.js.map +1 -1
- package/dist/tools/run_agent_cli.d.ts +4 -10
- package/dist/tools/run_agent_cli.d.ts.map +1 -1
- package/dist/tools/run_agent_cli.js +11 -91
- package/dist/tools/run_agent_cli.js.map +1 -1
- package/dist/tools/run_agents_parallel.d.ts +1 -2
- package/dist/tools/run_agents_parallel.d.ts.map +1 -1
- package/dist/tools/run_claude.d.ts +0 -1
- package/dist/tools/run_claude.d.ts.map +1 -1
- package/dist/tools/run_claude.js +1 -9
- package/dist/tools/run_claude.js.map +1 -1
- package/dist/tools/run_hermes.d.ts +1 -0
- package/dist/tools/run_hermes.d.ts.map +1 -1
- package/dist/tools/run_hermes.js +4 -3
- package/dist/tools/run_hermes.js.map +1 -1
- package/docs/agent-http-tutorial.md +527 -0
- package/package.json +114 -112
- package/scripts/postgres-manager.mjs +0 -0
- package/scripts/setup.mjs +0 -0
- package/scripts/uninstall.mjs +0 -0
|
@@ -1,349 +1,265 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Read the last N bytes of a log file. Returns empty string on any error
|
|
7
|
-
* (file missing, permission denied, etc.) — callers gracefully fall back to
|
|
8
|
-
* `entry.outputBuffer`.
|
|
9
|
-
*/
|
|
10
|
-
async function readLogTail(logFile, maxBytes = LOG_TAIL_BYTES) {
|
|
11
|
-
try {
|
|
12
|
-
const handle = await fs.open(logFile, 'r');
|
|
13
|
-
try {
|
|
14
|
-
const stat = await handle.stat();
|
|
15
|
-
const size = stat.size;
|
|
16
|
-
const readLen = Math.min(size, maxBytes);
|
|
17
|
-
const offset = size - readLen;
|
|
18
|
-
const buf = Buffer.alloc(readLen);
|
|
19
|
-
await handle.read(buf, 0, readLen, offset);
|
|
20
|
-
return buf.toString('utf-8');
|
|
21
|
-
}
|
|
22
|
-
finally {
|
|
23
|
-
await handle.close();
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
catch {
|
|
27
|
-
return '';
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Returns the effective output for an entry: log file tail for detached agents,
|
|
32
|
-
* `outputBuffer` for attached agents. Detached agents have empty buffers because
|
|
33
|
-
* their stdout/stderr go directly to disk (parent has no pipe to drain).
|
|
34
|
-
*/
|
|
35
|
-
async function getEffectiveOutput(entry) {
|
|
36
|
-
if (entry.logFile) {
|
|
37
|
-
const tail = await readLogTail(entry.logFile);
|
|
38
|
-
if (tail)
|
|
39
|
-
return tail;
|
|
40
|
-
}
|
|
41
|
-
return entry.outputBuffer || '';
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* agent_control — Outil MCP unifié pour contrôler le cycle de vie des agents OverMind
|
|
45
|
-
* ================================================================================
|
|
46
|
-
*
|
|
47
|
-
* Cet outil remplace les 4 outils individuels précédents :
|
|
48
|
-
* - get_agent_status → action: "status"
|
|
49
|
-
* - stream_agent_output → action: "stream"
|
|
50
|
-
* - kill_agent → action: "kill"
|
|
51
|
-
* - wait_agent → action: "wait"
|
|
52
|
-
*
|
|
53
|
-
* L'UNIFICATION est intentionnelle :
|
|
54
|
-
* - Un seul appel MCP pour la toolbox du client (pas 4 imports)
|
|
55
|
-
* - Cohérence des paramètres (agentName, runner, config communs)
|
|
56
|
-
* - Comportement déterministe : chaque action a une sémantique claire
|
|
57
|
-
* - Debugging simplifié : une seule source de vérité
|
|
58
|
-
*
|
|
59
|
-
* ─── SÉMANTIQUE DES ACTIONS ──────────────────────────────────────────────────
|
|
60
|
-
*
|
|
61
|
-
* status ─── Lecture pure, zero side-effect
|
|
62
|
-
* → Retourne l'état courant du process (pid, status, sessionId, outputBuffer)
|
|
63
|
-
* → NE MODIFIE PAS le registry (pas de mise à jour de timestamps artificiels)
|
|
64
|
-
* → Use-case : dashboard, polling léger, diagnostic
|
|
65
|
-
*
|
|
66
|
-
* stream ─── Lecture + indicateur de complétude
|
|
67
|
-
* → Retourne outputBuffer ET un flag isComplete
|
|
68
|
-
* → Use-case : récupérer la sortie en temps réel sans savoir si c'est fini
|
|
69
|
-
* → Option sinceTimestamp pour ne récupérer que le增量 (si implémenté)
|
|
70
|
-
*
|
|
71
|
-
* kill ─── Action destructive, irréversible
|
|
72
|
-
* → Tue le process tree via taskkill /F /T (Windows) ou kill -9 (Unix)
|
|
73
|
-
* → Met à jour le status → 'failed' dans le registry
|
|
74
|
-
* → Use-case : abort d'urgence, kill-switch
|
|
75
|
-
*
|
|
76
|
-
* wait ─── Blocage async avec polling
|
|
77
|
-
* → Poll toutes les 1s jusqu'à status !== 'running' ou timeout
|
|
78
|
-
* → Retourne le résultat final (outputBuffer ou erreur)
|
|
79
|
-
* → Use-case : synchronisation dans un workflow d'orchestration
|
|
80
|
-
*
|
|
81
|
-
* ─── ÉTATS DU PROCESS ─────────────────────────────────────────────────────────
|
|
82
|
-
*
|
|
83
|
-
* running → Process actif, PID valide, output en cours d'accumulation
|
|
84
|
-
* done → Process terminé avec code 0, outputBuffer gelé
|
|
85
|
-
* failed → Process terminé avec erreur (exit code != 0 ou crash)
|
|
86
|
-
* orphaned → Parent mort mais child tourne encore (detecté via isPidAlive)
|
|
87
|
-
*
|
|
88
|
-
* ─── ERREURS COMMUNES ─────────────────────────────────────────────────────────
|
|
89
|
-
*
|
|
90
|
-
* AGENT_NOT_FOUND → Agent absent du registry (jamais lancé ou déjà nettoyé)
|
|
91
|
-
* AGENT_NOT_RUNNING → Action "kill" sur un agent déjà terminé
|
|
92
|
-
* KILL_FAILED → taskkill/kill a échoué (pas assez de permissions, etc.)
|
|
93
|
-
* WAIT_TIMEOUT → Action "wait" a atteint le timeout sans terminaison
|
|
94
|
-
* ORPHANED_PROCESS → Status 'orphaned' détecté (process zombie)
|
|
95
|
-
*
|
|
96
|
-
* ─── EXEMPLES ─────────────────────────────────────────────────────────────────
|
|
97
|
-
*
|
|
98
|
-
* // Vérifier si un agent tourne encore
|
|
99
|
-
* agent_control({ agentName: "sniper_analyst", runner: "kilo", action: "status" })
|
|
100
|
-
*
|
|
101
|
-
* // Récupérer la sortie sans bloquer
|
|
102
|
-
* agent_control({ agentName: "sniper_analyst", runner: "kilo", action: "stream" })
|
|
103
|
-
*
|
|
104
|
-
* // Forcer l'arrêt d'un agent
|
|
105
|
-
* agent_control({ agentName: "sniper_analyst", runner: "kilo", action: "kill" })
|
|
106
|
-
*
|
|
107
|
-
* // Attendre la fin d'un agent (max 5 min)
|
|
108
|
-
* agent_control({ agentName: "sniper_analyst", runner: "kilo", action: "wait", timeoutMs: 300000 })
|
|
109
|
-
*/
|
|
110
|
-
// ─── SCHÉMA ZOD ────────────────────────────────────────────────────────────────
|
|
2
|
+
import { getProcessStatus, killAgent } from '../lib/processRegistry.js';
|
|
3
|
+
import { getLiveAgent, getLiveAgentByPid, } from '../lib/agent_lifecycle.js';
|
|
4
|
+
// ─── Schema + Types ──────────────────────────────────────────────────────────
|
|
111
5
|
export const agentControlSchema = z
|
|
112
6
|
.object({
|
|
113
|
-
agentName: z.string().describe(
|
|
7
|
+
agentName: z.string().describe("Nom unique de l'agent à contrôler"),
|
|
114
8
|
runner: z
|
|
115
9
|
.enum(['claude', 'gemini', 'kilo', 'qwencli', 'openclaw', 'cline', 'opencode', 'hermes'])
|
|
116
10
|
.optional()
|
|
117
|
-
.describe("Type de runner
|
|
118
|
-
config: z
|
|
119
|
-
.string()
|
|
120
|
-
.optional()
|
|
121
|
-
.describe('Chemin racine Overmind (dossier contenant .claude/)'),
|
|
11
|
+
.describe("Type de runner (optionnel — déduit si omis)"),
|
|
12
|
+
config: z.string().optional().describe('Chemin racine Overmind'),
|
|
122
13
|
action: z
|
|
123
14
|
.enum(['status', 'stream', 'kill', 'wait'])
|
|
124
|
-
.describe('
|
|
125
|
-
'
|
|
126
|
-
'
|
|
127
|
-
'
|
|
128
|
-
' wait — Bloquer jusqu\'à terminaison naturelle (max timeoutMs)'),
|
|
15
|
+
.describe('status — état courant (pid, status, sessionId, output)\n' +
|
|
16
|
+
'stream — output en temps réel + isComplete\n' +
|
|
17
|
+
'kill — arrêt forcé du process tree\n' +
|
|
18
|
+
'wait — bloque jusquà terminaison (max timeoutMs)'),
|
|
129
19
|
timeoutMs: z
|
|
130
20
|
.number()
|
|
21
|
+
.int()
|
|
22
|
+
.min(1000)
|
|
23
|
+
.max(3600000)
|
|
131
24
|
.optional()
|
|
132
25
|
.default(900000)
|
|
133
|
-
.describe('Timeout
|
|
134
|
-
sinceTimestamp: z
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
26
|
+
.describe('Timeout wait en ms (défaut: 900s, max: 1h)'),
|
|
27
|
+
sinceTimestamp: z.number().optional().describe('Pour stream: output après ce timestamp'),
|
|
28
|
+
});
|
|
29
|
+
/** Try in-memory first (fast), fall back to disk registry */
|
|
30
|
+
async function resolveAgent(agentName, runner) {
|
|
31
|
+
const live = getLiveAgent(agentName, runner);
|
|
32
|
+
if (live)
|
|
33
|
+
return { live, disk: null };
|
|
34
|
+
const disk = await getProcessStatus(agentName, runner);
|
|
35
|
+
return { live: null, disk };
|
|
36
|
+
}
|
|
37
|
+
// ─── Formatting ───────────────────────────────────────────────────────────────
|
|
38
|
+
function formatAgent(view, action) {
|
|
142
39
|
const lines = [];
|
|
143
|
-
|
|
144
|
-
lines.push(`**
|
|
145
|
-
lines.push(`**
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
40
|
+
const runningFor = view.startedAt ? `${Date.now() - view.startedAt}ms` : '?';
|
|
41
|
+
lines.push(`**Agent:** ${view.agentName}`);
|
|
42
|
+
lines.push(`**Runner:** ${view.runner || 'inconnu'}`);
|
|
43
|
+
lines.push(`**Status:** ${view.status}`);
|
|
44
|
+
lines.push(`**Running:** ${runningFor}`);
|
|
45
|
+
if (view.pid)
|
|
46
|
+
lines.push(`**PID:** ${view.pid}`);
|
|
47
|
+
if (view.sessionId)
|
|
48
|
+
lines.push(`**Session:** ${view.sessionId}`);
|
|
49
|
+
if (view.exitCode !== null)
|
|
50
|
+
lines.push(`**Exit Code:** ${view.exitCode}`);
|
|
51
|
+
if (view.lastOutputAt) {
|
|
52
|
+
lines.push(`**Last Output:** ${new Date(view.lastOutputAt).toISOString()}`);
|
|
155
53
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
if (entry.logFile)
|
|
160
|
-
lines.push(`**Log File:** ${entry.logFile}`);
|
|
161
|
-
if (output.length > 0) {
|
|
162
|
-
lines.push(`\n**Output (${output.length} chars):**`);
|
|
163
|
-
// On limite l'output dans le rapport à 2000 derniers caractères
|
|
164
|
-
const preview = output.slice(-2000);
|
|
54
|
+
const bufLen = view.outputBuffer.length;
|
|
55
|
+
if (bufLen > 0) {
|
|
56
|
+
lines.push(`\n**Output (${bufLen} chars):**`);
|
|
165
57
|
lines.push('```');
|
|
166
|
-
lines.push(
|
|
58
|
+
lines.push(view.outputBuffer.slice(-2000));
|
|
167
59
|
lines.push('```');
|
|
168
60
|
}
|
|
169
61
|
else {
|
|
170
|
-
lines.push('\n_(output vide
|
|
62
|
+
lines.push('\n_(output vide)_');
|
|
171
63
|
}
|
|
172
64
|
return lines.join('\n');
|
|
173
65
|
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
66
|
+
// ─── Actions ───────────────────────────────────────────────────────────────────
|
|
67
|
+
/** STATUS — zero side-effect read */
|
|
68
|
+
async function doStatus(agentName, runner) {
|
|
69
|
+
const { live, disk } = await resolveAgent(agentName, runner);
|
|
70
|
+
if (!live && !disk) {
|
|
178
71
|
return {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
code: 'AGENT_NOT_FOUND',
|
|
72
|
+
content: [{ type: 'text', text: `Agent "${agentName}" non trouvé.` }],
|
|
73
|
+
isError: true,
|
|
182
74
|
};
|
|
183
75
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
76
|
+
const view = live
|
|
77
|
+
? {
|
|
78
|
+
agentName: live.agentName,
|
|
79
|
+
runner: live.runner,
|
|
80
|
+
status: live.status,
|
|
81
|
+
pid: live.pid,
|
|
82
|
+
sessionId: live.sessionId,
|
|
83
|
+
exitCode: live.exitCode,
|
|
84
|
+
outputBuffer: live.outputBuffer,
|
|
85
|
+
startedAt: live.startedAt,
|
|
86
|
+
lastOutputAt: live.lastOutputAt,
|
|
87
|
+
}
|
|
88
|
+
: {
|
|
89
|
+
agentName: disk.agentName,
|
|
90
|
+
runner: disk.runner,
|
|
91
|
+
status: disk.status,
|
|
92
|
+
pid: disk.pid,
|
|
93
|
+
sessionId: disk.id,
|
|
94
|
+
exitCode: disk.exitCode ?? null,
|
|
95
|
+
outputBuffer: '', // disk entry has no outputBuffer
|
|
96
|
+
startedAt: disk.ts,
|
|
97
|
+
lastOutputAt: disk.lastOutputAt ?? disk.ts,
|
|
98
|
+
};
|
|
99
|
+
const isZombie = view.status === 'running' && view.pid && !getLiveAgentByPid(view.pid);
|
|
194
100
|
return {
|
|
195
|
-
content: [{ type: 'text', text:
|
|
196
|
-
isError,
|
|
101
|
+
content: [{ type: 'text', text: formatAgent(view, 'status') }],
|
|
102
|
+
isError: !!isZombie,
|
|
197
103
|
};
|
|
198
104
|
}
|
|
199
|
-
/**
|
|
200
|
-
async function doStream(agentName, runner,
|
|
201
|
-
const
|
|
202
|
-
if (
|
|
203
|
-
return {
|
|
105
|
+
/** STREAM — read + completeness flag */
|
|
106
|
+
async function doStream(agentName, runner, sinceTimestamp) {
|
|
107
|
+
const { live, disk } = await resolveAgent(agentName, runner);
|
|
108
|
+
if (!live && !disk) {
|
|
109
|
+
return {
|
|
110
|
+
content: [{ type: 'text', text: `Agent "${agentName}" non trouvé.` }],
|
|
111
|
+
isError: true,
|
|
112
|
+
};
|
|
204
113
|
}
|
|
205
|
-
const isComplete =
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
const output =
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
// Pour l'instant on retourne tout l'outputBuffer. La filtering precise
|
|
213
|
-
// nécéssite d'ajouter un tableau de chunks avec timestamps dans ProcessEntry.
|
|
114
|
+
const isComplete = live
|
|
115
|
+
? live.status !== 'running'
|
|
116
|
+
: disk.status !== 'running';
|
|
117
|
+
const output = live ? live.outputBuffer : '';
|
|
118
|
+
if (sinceTimestamp && live) {
|
|
119
|
+
// Ring buffer doesn't support per-chunk timestamps — best-effort: return last 2000
|
|
120
|
+
void sinceTimestamp;
|
|
214
121
|
}
|
|
122
|
+
const view = live
|
|
123
|
+
? {
|
|
124
|
+
agentName: live.agentName,
|
|
125
|
+
runner: live.runner,
|
|
126
|
+
status: live.status,
|
|
127
|
+
pid: live.pid,
|
|
128
|
+
sessionId: live.sessionId,
|
|
129
|
+
exitCode: live.exitCode,
|
|
130
|
+
outputBuffer: output,
|
|
131
|
+
startedAt: live.startedAt,
|
|
132
|
+
lastOutputAt: live.lastOutputAt,
|
|
133
|
+
}
|
|
134
|
+
: {
|
|
135
|
+
agentName: disk.agentName,
|
|
136
|
+
runner: disk.runner,
|
|
137
|
+
status: disk.status,
|
|
138
|
+
pid: disk.pid,
|
|
139
|
+
sessionId: disk.id,
|
|
140
|
+
exitCode: disk.exitCode ?? null,
|
|
141
|
+
outputBuffer: '',
|
|
142
|
+
startedAt: disk.ts,
|
|
143
|
+
lastOutputAt: disk.lastOutputAt ?? disk.ts,
|
|
144
|
+
};
|
|
215
145
|
const lines = [];
|
|
216
|
-
lines.push(`**Agent:** ${
|
|
217
|
-
lines.push(`**Status:** ${
|
|
218
|
-
if (resolved.detached)
|
|
219
|
-
lines.push(`**Mode:** detached`);
|
|
146
|
+
lines.push(`**Agent:** ${view.agentName}`);
|
|
147
|
+
lines.push(`**Status:** ${view.status}`);
|
|
220
148
|
lines.push(`**isComplete:** ${isComplete}`);
|
|
221
|
-
if (
|
|
222
|
-
lines.push(`**PID:** ${
|
|
223
|
-
if (
|
|
224
|
-
lines.push(`**Last Output At:** ${new Date(
|
|
225
|
-
}
|
|
226
|
-
if (resolved.logFile)
|
|
227
|
-
lines.push(`**Log File:** ${resolved.logFile}`);
|
|
149
|
+
if (view.pid)
|
|
150
|
+
lines.push(`**PID:** ${view.pid}`);
|
|
151
|
+
if (view.lastOutputAt)
|
|
152
|
+
lines.push(`**Last Output At:** ${new Date(view.lastOutputAt).toISOString()}`);
|
|
228
153
|
lines.push(`\n**Output (${output.length} chars):**`);
|
|
229
154
|
lines.push('```');
|
|
230
|
-
lines.push(output || '(no output yet)');
|
|
155
|
+
lines.push(output.slice(-2000) || '(no output yet)');
|
|
231
156
|
lines.push('```');
|
|
232
157
|
return {
|
|
233
158
|
content: [{ type: 'text', text: lines.join('\n') }],
|
|
234
|
-
isError:
|
|
159
|
+
isError: isComplete && view.status === 'failed',
|
|
235
160
|
};
|
|
236
161
|
}
|
|
237
|
-
/**
|
|
238
|
-
async function doKill(agentName, runner
|
|
239
|
-
const
|
|
240
|
-
if ('
|
|
241
|
-
|
|
242
|
-
}
|
|
243
|
-
if (resolved.status !== 'running') {
|
|
244
|
-
return {
|
|
245
|
-
content: [
|
|
246
|
-
{
|
|
247
|
-
type: 'text',
|
|
248
|
-
text: `Agent "${agentName}" n'est pas en cours d'exécution (status: ${resolved.status}). ` +
|
|
249
|
-
`Impossible de tuer un agent déjà terminé.`,
|
|
250
|
-
},
|
|
251
|
-
],
|
|
252
|
-
isError: true,
|
|
253
|
-
};
|
|
254
|
-
}
|
|
255
|
-
const killResult = await killAgent(agentName, runner, configPath);
|
|
256
|
-
if (!killResult.killed) {
|
|
162
|
+
/** KILL — force termination */
|
|
163
|
+
async function doKill(agentName, runner) {
|
|
164
|
+
const { live } = await resolveAgent(agentName, runner);
|
|
165
|
+
if (!live || live.status !== 'running') {
|
|
166
|
+
const disk = await getProcessStatus(agentName, runner);
|
|
257
167
|
return {
|
|
258
168
|
content: [
|
|
259
169
|
{
|
|
260
170
|
type: 'text',
|
|
261
|
-
text:
|
|
262
|
-
`
|
|
263
|
-
`
|
|
171
|
+
text: disk
|
|
172
|
+
? `Agent "${agentName}" nest plus en cours (status: ${disk.status}).`
|
|
173
|
+
: `Agent "${agentName}" non trouvé.`,
|
|
264
174
|
},
|
|
265
175
|
],
|
|
266
176
|
isError: true,
|
|
267
177
|
};
|
|
268
178
|
}
|
|
179
|
+
const pid = live.pid;
|
|
180
|
+
const result = await killAgent(agentName, runner);
|
|
269
181
|
return {
|
|
270
182
|
content: [
|
|
271
183
|
{
|
|
272
184
|
type: 'text',
|
|
273
|
-
text:
|
|
274
|
-
`
|
|
185
|
+
text: result.killed
|
|
186
|
+
? `Agent "${agentName}" tué (PID: ${pid}).`
|
|
187
|
+
: `Échec du kill pour "${agentName}".`,
|
|
275
188
|
},
|
|
276
189
|
],
|
|
190
|
+
isError: !result.killed,
|
|
277
191
|
};
|
|
278
192
|
}
|
|
279
|
-
/**
|
|
280
|
-
async function doWait(agentName, runner,
|
|
281
|
-
const
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
if (resolved.status === 'done') {
|
|
193
|
+
/** WAIT — block until completion, using AbortController when available */
|
|
194
|
+
async function doWait(agentName, runner, timeoutMs) {
|
|
195
|
+
const live = getLiveAgent(agentName, runner);
|
|
196
|
+
// Fast path: agent already done
|
|
197
|
+
if (live) {
|
|
198
|
+
if (live.status !== 'running') {
|
|
286
199
|
return {
|
|
287
|
-
content: [{ type: 'text', text:
|
|
200
|
+
content: [{ type: 'text', text: live.outputBuffer || `Agent terminé (${live.status}).` }],
|
|
201
|
+
isError: live.status === 'failed' || live.status === 'orphaned',
|
|
288
202
|
};
|
|
289
203
|
}
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
204
|
+
// Use AbortController if available (instant wake on kill/status change)
|
|
205
|
+
if (live.abortController) {
|
|
206
|
+
try {
|
|
207
|
+
await Promise.race([
|
|
208
|
+
new Promise((_, reject) => {
|
|
209
|
+
live.abortController.signal.addEventListener('abort', () => reject(new Error('done')));
|
|
210
|
+
}),
|
|
211
|
+
new Promise((r) => setTimeout(r, timeoutMs)),
|
|
212
|
+
]);
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
// Aborted — agent finished
|
|
216
|
+
}
|
|
217
|
+
// Re-read state after wake
|
|
218
|
+
const updated = getLiveAgent(agentName, runner);
|
|
219
|
+
if (updated) {
|
|
220
|
+
return {
|
|
221
|
+
content: [{ type: 'text', text: updated.outputBuffer || `Agent terminé (${updated.status}).` }],
|
|
222
|
+
isError: updated.status === 'failed' || updated.status === 'orphaned',
|
|
223
|
+
};
|
|
224
|
+
}
|
|
305
225
|
}
|
|
306
|
-
|
|
307
|
-
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
// Fallback: disk polling
|
|
229
|
+
const disk = await getProcessStatus(agentName, runner);
|
|
230
|
+
if (!disk || disk.status !== 'running') {
|
|
231
|
+
return {
|
|
232
|
+
content: [{ type: 'text', text: disk ? `Agent terminé (${disk.status}).` : `Agent non trouvé.` }],
|
|
233
|
+
isError: true,
|
|
234
|
+
};
|
|
308
235
|
}
|
|
309
236
|
}
|
|
310
|
-
//
|
|
237
|
+
// Polling fallback (disk or no AbortController)
|
|
238
|
+
const start = Date.now();
|
|
239
|
+
const pollInterval = 1000;
|
|
311
240
|
while (Date.now() - start < timeoutMs) {
|
|
312
241
|
await new Promise((r) => setTimeout(r, pollInterval));
|
|
313
|
-
const
|
|
314
|
-
if ('
|
|
315
|
-
return {
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
242
|
+
const current = getLiveAgent(agentName, runner);
|
|
243
|
+
if (!current || current.status !== 'running') {
|
|
244
|
+
return {
|
|
245
|
+
content: [{ type: 'text', text: current?.outputBuffer || 'Agent terminé.' }],
|
|
246
|
+
isError: current?.status === 'failed' || current?.status === 'orphaned' || !current,
|
|
247
|
+
};
|
|
319
248
|
}
|
|
320
|
-
// Status still 'running' — continue polling
|
|
321
249
|
}
|
|
322
|
-
// Timeout atteint
|
|
323
250
|
return {
|
|
324
|
-
content: [
|
|
325
|
-
{
|
|
326
|
-
type: 'text',
|
|
327
|
-
text: `Timeout de ${timeoutMs}ms atteint. ` +
|
|
328
|
-
`L'agent "${agentName}" est toujours en cours d'exécution (status: running). ` +
|
|
329
|
-
`Utilisez action="kill" pour forcer l'arrêt ou augmentez timeoutMs.`,
|
|
330
|
-
},
|
|
331
|
-
],
|
|
251
|
+
content: [{ type: 'text', text: `Timeout ${timeoutMs}ms atteint. Agent toujours en cours.` }],
|
|
332
252
|
isError: true,
|
|
333
253
|
};
|
|
334
254
|
}
|
|
335
|
-
// ───
|
|
255
|
+
// ─── Main entry point ─────────────────────────────────────────────────────────
|
|
336
256
|
export async function agentControl(args) {
|
|
337
|
-
const { agentName, runner,
|
|
257
|
+
const { agentName, runner, action, timeoutMs, sinceTimestamp } = args;
|
|
338
258
|
switch (action) {
|
|
339
|
-
case 'status':
|
|
340
|
-
|
|
341
|
-
case '
|
|
342
|
-
|
|
343
|
-
case 'kill':
|
|
344
|
-
return doKill(agentName, runner, configPath);
|
|
345
|
-
case 'wait':
|
|
346
|
-
return doWait(agentName, runner, configPath, timeoutMs ?? 900000);
|
|
259
|
+
case 'status': return doStatus(agentName, runner);
|
|
260
|
+
case 'stream': return doStream(agentName, runner, sinceTimestamp);
|
|
261
|
+
case 'kill': return doKill(agentName, runner);
|
|
262
|
+
case 'wait': return doWait(agentName, runner, timeoutMs ?? 900000);
|
|
347
263
|
}
|
|
348
264
|
}
|
|
349
265
|
//# sourceMappingURL=agent_control.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent_control.js","sourceRoot":"","sources":["../../src/tools/agent_control.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"agent_control.js","sourceRoot":"","sources":["../../src/tools/agent_control.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,11 +4,11 @@ export declare const configExampleSchema: z.ZodObject<{
|
|
|
4
4
|
ilmu: "ilmu";
|
|
5
5
|
glm: "glm";
|
|
6
6
|
minimax: "minimax";
|
|
7
|
-
openrouter: "openrouter";
|
|
8
7
|
overmind: "overmind";
|
|
8
|
+
openrouter: "openrouter";
|
|
9
9
|
minimaxi: "minimaxi";
|
|
10
10
|
}>;
|
|
11
|
-
}, z.core.$
|
|
11
|
+
}, z.core.$strip>;
|
|
12
12
|
export declare function configExample(args: z.infer<typeof configExampleSchema>): Promise<{
|
|
13
13
|
content: {
|
|
14
14
|
type: "text";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config_example.d.ts","sourceRoot":"","sources":["../../src/tools/config_example.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,mBAAmB;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"config_example.d.ts","sourceRoot":"","sources":["../../src/tools/config_example.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,mBAAmB;;;;;;;;;iBAI9B,CAAC;AAEH,wBAAsB,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC;;;;;GA4Q5E"}
|