@zhixuan92/multi-model-agent 3.0.1 → 3.1.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/README.md +7 -3
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +76 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/info.d.ts +22 -0
- package/dist/cli/info.d.ts.map +1 -0
- package/dist/cli/info.js +100 -0
- package/dist/cli/info.js.map +1 -0
- package/dist/cli/install-skill.d.ts.map +1 -1
- package/dist/cli/install-skill.js +44 -39
- package/dist/cli/install-skill.js.map +1 -1
- package/dist/cli/logs.d.ts +15 -0
- package/dist/cli/logs.d.ts.map +1 -0
- package/dist/cli/logs.js +102 -0
- package/dist/cli/logs.js.map +1 -0
- package/dist/cli/serve.d.ts +0 -17
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +117 -2
- package/dist/cli/serve.js.map +1 -1
- package/dist/cli/update-skills.d.ts +16 -0
- package/dist/cli/update-skills.d.ts.map +1 -0
- package/dist/cli/update-skills.js +127 -0
- package/dist/cli/update-skills.js.map +1 -0
- package/dist/http/async-dispatch.d.ts.map +1 -1
- package/dist/http/async-dispatch.js +17 -0
- package/dist/http/async-dispatch.js.map +1 -1
- package/dist/http/execution-context.d.ts.map +1 -1
- package/dist/http/execution-context.js +34 -1
- package/dist/http/execution-context.js.map +1 -1
- package/dist/http/handlers/control/batch.d.ts +8 -10
- package/dist/http/handlers/control/batch.d.ts.map +1 -1
- package/dist/http/handlers/control/batch.js +55 -49
- package/dist/http/handlers/control/batch.js.map +1 -1
- package/dist/http/handlers/introspection/health.d.ts +9 -8
- package/dist/http/handlers/introspection/health.d.ts.map +1 -1
- package/dist/http/handlers/introspection/health.js +13 -9
- package/dist/http/handlers/introspection/health.js.map +1 -1
- package/dist/http/server.js +4 -5
- package/dist/http/server.js.map +1 -1
- package/dist/install/manifest.d.ts +8 -4
- package/dist/install/manifest.d.ts.map +1 -1
- package/dist/install/manifest.js +76 -18
- package/dist/install/manifest.js.map +1 -1
- package/dist/skills/_shared/polling.md +50 -23
- package/dist/skills/mma-audit/SKILL.md +12 -3
- package/dist/skills/mma-clarifications/SKILL.md +13 -5
- package/dist/skills/mma-context-blocks/SKILL.md +13 -4
- package/dist/skills/mma-debug/SKILL.md +12 -3
- package/dist/skills/mma-delegate/SKILL.md +13 -3
- package/dist/skills/mma-execute-plan/SKILL.md +13 -3
- package/dist/skills/mma-retry/SKILL.md +11 -3
- package/dist/skills/mma-review/SKILL.md +11 -3
- package/dist/skills/mma-verify/SKILL.md +10 -3
- package/dist/skills/multi-model-agent/SKILL.md +23 -6
- package/package.json +7 -4
- package/scripts/postinstall.js +36 -0
package/dist/cli/logs.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* logs.ts — `mmagent logs` subcommand.
|
|
3
|
+
*
|
|
4
|
+
* Tails the diagnostic log file for today (mmagent-YYYY-MM-DD.jsonl). Supports
|
|
5
|
+
* --follow for tail-F semantics and --batch=<id> to filter to a single batch.
|
|
6
|
+
*
|
|
7
|
+
* Exit codes:
|
|
8
|
+
* 0 — success (including "no log file found" cases so scripts don't break)
|
|
9
|
+
* 1 — reserved for future use
|
|
10
|
+
*/
|
|
11
|
+
import * as os from 'node:os';
|
|
12
|
+
import * as path from 'node:path';
|
|
13
|
+
import * as fs from 'node:fs';
|
|
14
|
+
function todayUtc() {
|
|
15
|
+
return new Date().toISOString().slice(0, 10);
|
|
16
|
+
}
|
|
17
|
+
function resolveLogPath(config, homeDir) {
|
|
18
|
+
const dir = config.diagnostics?.logDir ?? path.join(homeDir, '.multi-model', 'logs');
|
|
19
|
+
return path.join(dir, `mmagent-${todayUtc()}.jsonl`);
|
|
20
|
+
}
|
|
21
|
+
function matchesBatch(line, batchId) {
|
|
22
|
+
return line.includes(`"batchId":"${batchId}"`);
|
|
23
|
+
}
|
|
24
|
+
export async function runLogs(deps) {
|
|
25
|
+
const stdout = deps.stdout ?? process.stdout.write.bind(process.stdout);
|
|
26
|
+
const stderr = deps.stderr ?? process.stderr.write.bind(process.stderr);
|
|
27
|
+
const homeDir = deps.homeDir ?? os.homedir();
|
|
28
|
+
const follow = deps.follow ?? false;
|
|
29
|
+
const pollMs = deps.pollMs ?? 300;
|
|
30
|
+
const waitForLogMs = deps.waitForLogMs ?? 30_000;
|
|
31
|
+
if (!deps.config.diagnostics?.log) {
|
|
32
|
+
stderr(`mmagent logs: diagnostics.log is false in config; set it to true to capture new events.\n`);
|
|
33
|
+
}
|
|
34
|
+
const logPath = resolveLogPath(deps.config, homeDir);
|
|
35
|
+
if (!fs.existsSync(logPath)) {
|
|
36
|
+
if (!follow) {
|
|
37
|
+
stderr(`mmagent logs: no log file at ${logPath}. Start the server with diagnostics.log: true and try again.\n`);
|
|
38
|
+
return 0;
|
|
39
|
+
}
|
|
40
|
+
const deadline = Date.now() + waitForLogMs;
|
|
41
|
+
while (!fs.existsSync(logPath) && Date.now() < deadline) {
|
|
42
|
+
await new Promise((r) => setTimeout(r, pollMs));
|
|
43
|
+
}
|
|
44
|
+
if (!fs.existsSync(logPath)) {
|
|
45
|
+
stderr(`mmagent logs: no log file appeared within ${Math.floor(waitForLogMs / 1000)}s at ${logPath}.\n`);
|
|
46
|
+
return 0;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Emit existing content (optionally batch-filtered).
|
|
50
|
+
let offset = 0;
|
|
51
|
+
try {
|
|
52
|
+
const existing = fs.readFileSync(logPath, 'utf8');
|
|
53
|
+
for (const line of existing.split('\n')) {
|
|
54
|
+
if (line.length === 0)
|
|
55
|
+
continue;
|
|
56
|
+
if (deps.batchId && !matchesBatch(line, deps.batchId))
|
|
57
|
+
continue;
|
|
58
|
+
stdout(line + '\n');
|
|
59
|
+
}
|
|
60
|
+
offset = existing.length;
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
stderr(`mmagent logs: cannot read ${logPath}: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
64
|
+
return 0;
|
|
65
|
+
}
|
|
66
|
+
if (!follow)
|
|
67
|
+
return 0;
|
|
68
|
+
// Tail — poll for new content appended after `offset`.
|
|
69
|
+
let buf = '';
|
|
70
|
+
while (true) {
|
|
71
|
+
await new Promise((r) => setTimeout(r, pollMs));
|
|
72
|
+
let stat;
|
|
73
|
+
try {
|
|
74
|
+
stat = fs.statSync(logPath);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (stat.size <= offset)
|
|
80
|
+
continue;
|
|
81
|
+
const fd = fs.openSync(logPath, 'r');
|
|
82
|
+
try {
|
|
83
|
+
const chunk = Buffer.alloc(stat.size - offset);
|
|
84
|
+
fs.readSync(fd, chunk, 0, chunk.length, offset);
|
|
85
|
+
buf += chunk.toString('utf8');
|
|
86
|
+
offset = stat.size;
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
fs.closeSync(fd);
|
|
90
|
+
}
|
|
91
|
+
const lines = buf.split('\n');
|
|
92
|
+
buf = lines.pop() ?? ''; // keep any trailing partial line for the next iteration
|
|
93
|
+
for (const line of lines) {
|
|
94
|
+
if (line.length === 0)
|
|
95
|
+
continue;
|
|
96
|
+
if (deps.batchId && !matchesBatch(line, deps.batchId))
|
|
97
|
+
continue;
|
|
98
|
+
stdout(line + '\n');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/cli/logs.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/serve.d.ts
CHANGED
|
@@ -1,20 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* serve.ts — starts the HTTP server and manages its signal lifecycle.
|
|
3
|
-
*
|
|
4
|
-
* This module owns the complete serve lifecycle: starting the HTTP server,
|
|
5
|
-
* registering SIGTERM/SIGINT handlers, draining in-flight requests, and
|
|
6
|
-
* cleanly exiting the process. The CLI entry point (cli/index.ts) delegates
|
|
7
|
-
* to this module and does not manage signals directly.
|
|
8
|
-
*
|
|
9
|
-
* Usage (library):
|
|
10
|
-
* const handle = await startServe(config);
|
|
11
|
-
* // server is running on handle.port
|
|
12
|
-
* await handle.stop(); // graceful shutdown; no process.exit
|
|
13
|
-
*
|
|
14
|
-
* Usage (CLI):
|
|
15
|
-
* mmagent serve [--config <path>]
|
|
16
|
-
* // this module owns signal handling and process.exit
|
|
17
|
-
*/
|
|
18
1
|
import type { MultiModelConfig } from '@zhixuan92/multi-model-agent-core';
|
|
19
2
|
/** A running server handle returned by startServe(). */
|
|
20
3
|
export interface ServeHandle {
|
package/dist/cli/serve.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAyE1E,wDAAwD;AACxD,MAAM,WAAW,WAAW;IAC1B,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAYD;;;;;;;;;;;;GAYG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,gBAAgB,EACxB,IAAI,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAkC,GACzD,OAAO,CAAC,WAAW,CAAC,CA4EtB"}
|
package/dist/cli/serve.js
CHANGED
|
@@ -1,4 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* serve.ts — starts the HTTP server and manages its signal lifecycle.
|
|
3
|
+
*
|
|
4
|
+
* This module owns the complete serve lifecycle: starting the HTTP server,
|
|
5
|
+
* registering SIGTERM/SIGINT handlers, draining in-flight requests, and
|
|
6
|
+
* cleanly exiting the process. The CLI entry point (cli/index.ts) delegates
|
|
7
|
+
* to this module and does not manage signals directly.
|
|
8
|
+
*
|
|
9
|
+
* Usage (library):
|
|
10
|
+
* const handle = await startServe(config);
|
|
11
|
+
* // server is running on handle.port
|
|
12
|
+
* await handle.stop(); // graceful shutdown; no process.exit
|
|
13
|
+
*
|
|
14
|
+
* Usage (CLI):
|
|
15
|
+
* mmagent serve [--config <path>]
|
|
16
|
+
* // this module owns signal handling and process.exit
|
|
17
|
+
*/
|
|
18
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
19
|
+
import * as path from 'node:path';
|
|
20
|
+
import * as fs from 'node:fs';
|
|
21
|
+
import { fileURLToPath } from 'node:url';
|
|
22
|
+
import { collectInlineApiKeyOffenders, loadAuthToken } from '@zhixuan92/multi-model-agent-core';
|
|
1
23
|
import { startServer } from '../http/server.js';
|
|
24
|
+
import { runUpdateSkills } from './update-skills.js';
|
|
25
|
+
import { listEntries, FutureManifestError } from '../install/manifest.js';
|
|
26
|
+
import { readSkillContent } from './install-skill.js';
|
|
27
|
+
import matter from 'gray-matter';
|
|
28
|
+
function isSkillBehind(entryName, entrySkillVersion) {
|
|
29
|
+
const src = readSkillContent(entryName);
|
|
30
|
+
if (src === null)
|
|
31
|
+
return false; // missing; update-skills handles removal separately
|
|
32
|
+
try {
|
|
33
|
+
const parsed = matter(src);
|
|
34
|
+
const v = parsed.data['version'];
|
|
35
|
+
return typeof v === 'string' && v !== entrySkillVersion;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function maybeAutoUpdateSkills(config, stderr) {
|
|
42
|
+
let entries;
|
|
43
|
+
try {
|
|
44
|
+
entries = listEntries();
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
if (err instanceof FutureManifestError) {
|
|
48
|
+
stderr(`[mmagent] warning: ${err.message}; skipping skill auto-update\n`);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
return; // best-effort — never let manifest IO issues block serve
|
|
52
|
+
}
|
|
53
|
+
const behind = entries.filter((e) => isSkillBehind(e.name, e.skillVersion));
|
|
54
|
+
if (behind.length === 0)
|
|
55
|
+
return;
|
|
56
|
+
if (!config.server.autoUpdateSkills) {
|
|
57
|
+
stderr(`[mmagent] ${behind.length} skill(s) out of date: ${behind.map((e) => e.name).join(', ')}. ` +
|
|
58
|
+
`Run 'mmagent update-skills' to refresh (or set server.autoUpdateSkills=true in config).\n`);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const deadlineMs = 5000;
|
|
62
|
+
try {
|
|
63
|
+
await Promise.race([
|
|
64
|
+
runUpdateSkills({ silent: true, bestEffort: true }),
|
|
65
|
+
new Promise((resolve) => setTimeout(() => resolve(), deadlineMs)),
|
|
66
|
+
]);
|
|
67
|
+
process.stdout.write(`[mmagent] auto-updated ${behind.length} skill(s)\n`);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// bestEffort swallows inside; extra safety here.
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function readServerVersion() {
|
|
74
|
+
try {
|
|
75
|
+
const thisDir = path.dirname(fileURLToPath(import.meta.url));
|
|
76
|
+
const pkgPath = path.join(thisDir, '..', '..', 'package.json');
|
|
77
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
78
|
+
return pkg.version ?? '0.0.0';
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return '0.0.0';
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function envVarHint(agentName) {
|
|
85
|
+
return `${agentName.toUpperCase().replace(/[^A-Z0-9]/g, '_')}_API_KEY`;
|
|
86
|
+
}
|
|
2
87
|
/**
|
|
3
88
|
* Shared signal-state used to deduplicate shutdown if two signals arrive
|
|
4
89
|
* before stop() resolves.
|
|
@@ -21,8 +106,23 @@ let onSigint;
|
|
|
21
106
|
* Exposed so tests can suppress actual exits.
|
|
22
107
|
*/
|
|
23
108
|
export async function startServe(config, exit = process.exit.bind(process)) {
|
|
24
|
-
const running = await startServer(config);
|
|
25
109
|
const stderr = process.stderr.write.bind(process.stderr);
|
|
110
|
+
// Auto-update installed skills before bind (bounded 5s; never blocks indefinitely).
|
|
111
|
+
await maybeAutoUpdateSkills(config, stderr);
|
|
112
|
+
const running = await startServer({ server: config.server });
|
|
113
|
+
// Fire once at serve startup. Lives here (not in loadConfigFromFile) so
|
|
114
|
+
// print-token / info / status don't re-emit the same warning repeatedly.
|
|
115
|
+
const inlineOffenders = collectInlineApiKeyOffenders(config);
|
|
116
|
+
if (inlineOffenders.length > 0) {
|
|
117
|
+
const firstHint = envVarHint(inlineOffenders[0]);
|
|
118
|
+
stderr(`[mmagent] WARNING: inline apiKey in config for agent(s): ${inlineOffenders.join(', ')}.\n` +
|
|
119
|
+
` Fix:\n` +
|
|
120
|
+
` export ${firstHint}='<your-key>'\n` +
|
|
121
|
+
` # then in config.json, replace\n` +
|
|
122
|
+
` # "apiKey": "..."\n` +
|
|
123
|
+
` # with\n` +
|
|
124
|
+
` # "apiKeyEnv": "${firstHint}"\n`);
|
|
125
|
+
}
|
|
26
126
|
const cleanupSignal = (sig) => {
|
|
27
127
|
if (stopInFlight)
|
|
28
128
|
return;
|
|
@@ -44,7 +144,22 @@ export async function startServe(config, exit = process.exit.bind(process)) {
|
|
|
44
144
|
// Print the actual bound address so operators see what the kernel assigned
|
|
45
145
|
// (useful when port=0 selects an ephemeral port).
|
|
46
146
|
const host = running.serverAddress ?? config.server.bind;
|
|
47
|
-
|
|
147
|
+
// Emit a single structured startup line before the "listening" line.
|
|
148
|
+
// Fingerprint the auth token (first 8 hex of sha256) so operators can verify
|
|
149
|
+
// the running instance matches what their clients are using, without ever
|
|
150
|
+
// revealing the token. bootId discriminates successive startups from the same pid.
|
|
151
|
+
try {
|
|
152
|
+
const token = loadAuthToken({ tokenFile: config.server.auth.tokenFile });
|
|
153
|
+
const fp = createHash('sha256').update(token).digest('hex').slice(0, 8);
|
|
154
|
+
const bootId = randomUUID();
|
|
155
|
+
const version = readServerVersion();
|
|
156
|
+
process.stdout.write(`[mmagent] started | version=${version} | bind=${host}:${running.port} | pid=${process.pid} | token=${fp} | boot=${bootId}\n`);
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// Token load shouldn't fail here (startServer already validated it), but
|
|
160
|
+
// if it does, skip the startup line rather than crash the server.
|
|
161
|
+
}
|
|
162
|
+
process.stdout.write(`[mmagent] listening on ${host}:${running.port}\n`);
|
|
48
163
|
return {
|
|
49
164
|
port: running.port,
|
|
50
165
|
stop: async () => {
|
package/dist/cli/serve.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface UpdateSkillsDeps {
|
|
2
|
+
homeDir?: string;
|
|
3
|
+
skillsRoot?: string;
|
|
4
|
+
dryRun?: boolean;
|
|
5
|
+
json?: boolean;
|
|
6
|
+
/** Exit silently with code 0 if no manifest exists. Used by postinstall. */
|
|
7
|
+
ifExists?: boolean;
|
|
8
|
+
/** Suppress normal stdout logging (errors still go to stderr). */
|
|
9
|
+
silent?: boolean;
|
|
10
|
+
/** Swallow any thrown error and exit 0. Used by postinstall. */
|
|
11
|
+
bestEffort?: boolean;
|
|
12
|
+
stdout?: (s: string) => boolean;
|
|
13
|
+
stderr?: (s: string) => boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function runUpdateSkills(deps?: UpdateSkillsDeps): Promise<number>;
|
|
16
|
+
//# sourceMappingURL=update-skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-skills.d.ts","sourceRoot":"","sources":["../../src/cli/update-skills.ts"],"names":[],"mappings":"AAoCA,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kEAAkE;IAClE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gEAAgE;IAChE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAChC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;CACjC;AAsBD,wBAAsB,eAAe,CAAC,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CA0FlF"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* update-skills.ts — `mmagent update-skills` subcommand.
|
|
3
|
+
*
|
|
4
|
+
* Iterates over every entry in the install manifest and re-copies the
|
|
5
|
+
* shipped SKILL.md for that skill to each of its installed targets,
|
|
6
|
+
* updating `skillVersion` from the current bundle. Skills that have
|
|
7
|
+
* disappeared from the bundle since a previous install are removed from
|
|
8
|
+
* every target and dropped from the manifest.
|
|
9
|
+
*
|
|
10
|
+
* Exit codes:
|
|
11
|
+
* 0 — success (possibly with no manifest entries)
|
|
12
|
+
* 1 — one or more targets failed to update
|
|
13
|
+
* 2 — manifest was written by a newer mmagent (FutureManifestError)
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* mmagent update-skills [--dry-run] [--json] [--if-exists] [--silent] [--best-effort]
|
|
17
|
+
*/
|
|
18
|
+
import * as os from 'node:os';
|
|
19
|
+
import * as path from 'node:path';
|
|
20
|
+
import * as fs from 'node:fs';
|
|
21
|
+
import matter from 'gray-matter';
|
|
22
|
+
import { FutureManifestError, listEntries, removeEntry, appendEntry, } from '../install/manifest.js';
|
|
23
|
+
import { readSkillContent, writeSkillToClient, removeSkillFromClient, getSkillsRoot, } from './install-skill.js';
|
|
24
|
+
function versionFromSkillContent(content) {
|
|
25
|
+
try {
|
|
26
|
+
const parsed = matter(content);
|
|
27
|
+
const v = parsed.data['version'];
|
|
28
|
+
return typeof v === 'string' && v.length > 0 ? v : 'unknown';
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return 'unknown';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function manifestPresent(homeDir) {
|
|
35
|
+
return fs.existsSync(path.join(homeDir, '.multi-model', 'install-manifest.json'));
|
|
36
|
+
}
|
|
37
|
+
export async function runUpdateSkills(deps = {}) {
|
|
38
|
+
const stdout = deps.stdout ?? process.stdout.write.bind(process.stdout);
|
|
39
|
+
const stderr = deps.stderr ?? process.stderr.write.bind(process.stderr);
|
|
40
|
+
const homeDir = deps.homeDir ?? os.homedir();
|
|
41
|
+
const skillsRoot = getSkillsRoot(deps.skillsRoot);
|
|
42
|
+
const dryRun = deps.dryRun ?? false;
|
|
43
|
+
const json = deps.json ?? false;
|
|
44
|
+
const silent = deps.silent ?? false;
|
|
45
|
+
const bestEffort = deps.bestEffort ?? false;
|
|
46
|
+
const logInfo = silent ? (_) => true : stdout;
|
|
47
|
+
if (deps.ifExists && !manifestPresent(homeDir)) {
|
|
48
|
+
return 0;
|
|
49
|
+
}
|
|
50
|
+
let entries;
|
|
51
|
+
try {
|
|
52
|
+
entries = listEntries(homeDir);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
if (err instanceof FutureManifestError) {
|
|
56
|
+
stderr(`mmagent update-skills: ${err.message}\n`);
|
|
57
|
+
return bestEffort ? 0 : 2;
|
|
58
|
+
}
|
|
59
|
+
if (bestEffort)
|
|
60
|
+
return 0;
|
|
61
|
+
throw err;
|
|
62
|
+
}
|
|
63
|
+
const summary = { updated: [], removed: [], errors: [] };
|
|
64
|
+
for (const entry of entries) {
|
|
65
|
+
const content = readSkillContent(entry.name, skillsRoot);
|
|
66
|
+
if (content === null) {
|
|
67
|
+
// Skill has been removed from the shipped bundle — remove from every
|
|
68
|
+
// target and drop the manifest entry.
|
|
69
|
+
if (!dryRun) {
|
|
70
|
+
for (const target of entry.targets) {
|
|
71
|
+
try {
|
|
72
|
+
removeSkillFromClient(entry.name, target, homeDir);
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
summary.errors.push({
|
|
76
|
+
skill: entry.name,
|
|
77
|
+
target,
|
|
78
|
+
reason: err instanceof Error ? err.message : String(err),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
removeEntry(entry.name, [], homeDir);
|
|
83
|
+
}
|
|
84
|
+
summary.removed.push(entry.name);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const newSkillVersion = versionFromSkillContent(content);
|
|
88
|
+
for (const target of entry.targets) {
|
|
89
|
+
if (dryRun) {
|
|
90
|
+
logInfo(`Would update: ${entry.name} → ${target} (${entry.skillVersion} → ${newSkillVersion})\n`);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
writeSkillToClient(entry.name, content, target, homeDir, skillsRoot, newSkillVersion);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
summary.errors.push({
|
|
98
|
+
skill: entry.name,
|
|
99
|
+
target,
|
|
100
|
+
reason: err instanceof Error ? err.message : String(err),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (!dryRun) {
|
|
105
|
+
appendEntry(entry.name, newSkillVersion, entry.targets, homeDir);
|
|
106
|
+
}
|
|
107
|
+
summary.updated.push(entry.name);
|
|
108
|
+
}
|
|
109
|
+
if (json) {
|
|
110
|
+
stdout(JSON.stringify(summary) + '\n');
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
for (const name of summary.updated)
|
|
114
|
+
logInfo(`Updated: ${name}\n`);
|
|
115
|
+
for (const name of summary.removed)
|
|
116
|
+
logInfo(`Removed: ${name} (no longer shipped)\n`);
|
|
117
|
+
for (const e of summary.errors)
|
|
118
|
+
stderr(`error: ${e.skill} → ${e.target}: ${e.reason}\n`);
|
|
119
|
+
if (!silent)
|
|
120
|
+
logInfo(`Manifest updated (${summary.updated.length} updated, ${summary.removed.length} removed, ${summary.errors.length} errors).\n`);
|
|
121
|
+
}
|
|
122
|
+
if (summary.errors.length > 0) {
|
|
123
|
+
return bestEffort ? 0 : 1;
|
|
124
|
+
}
|
|
125
|
+
return 0;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=update-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-skills.js","sourceRoot":"","sources":["../../src/cli/update-skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,WAAW,EACX,WAAW,GAGZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,aAAa,GACd,MAAM,oBAAoB,CAAC;AAuB5B,SAAS,uBAAuB,CAAC,OAAe;IAC9C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,uBAAuB,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAyB,EAAE;IAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IAC7C,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IAEtD,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/C,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,OAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,mBAAmB,EAAE,CAAC;YACvC,MAAM,CAAC,0BAA0B,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;YAClD,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,UAAU;YAAE,OAAO,CAAC,CAAC;QACzB,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAkB,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAExE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAEzD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,qEAAqE;YACrE,sCAAsC;YACtC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;oBACnC,IAAI,CAAC;wBACH,qBAAqB,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;oBACrD,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;4BAClB,KAAK,EAAE,KAAK,CAAC,IAAI;4BACjB,MAAM;4BACN,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;yBACzD,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBACD,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,SAAS;QACX,CAAC;QAED,MAAM,eAAe,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAEzD,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACnC,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,iBAAiB,KAAK,CAAC,IAAI,MAAM,MAAM,KAAK,KAAK,CAAC,YAAY,MAAM,eAAe,KAAK,CAAC,CAAC;gBAClG,SAAS;YACX,CAAC;YACD,IAAI,CAAC;gBACH,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;YACxF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;oBAClB,KAAK,EAAE,KAAK,CAAC,IAAI;oBACjB,MAAM;oBACN,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACzD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACzC,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC;QAClE,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO,CAAC,YAAY,IAAI,wBAAwB,CAAC,CAAC;QACtF,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM;YAAE,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QACzF,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,qBAAqB,OAAO,CAAC,OAAO,CAAC,MAAM,aAAa,OAAO,CAAC,OAAO,CAAC,MAAM,aAAa,OAAO,CAAC,MAAM,CAAC,MAAM,aAAa,CAAC,CAAC;IACtJ,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async-dispatch.d.ts","sourceRoot":"","sources":["../../src/http/async-dispatch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACvF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mDAAmD,CAAC;AAC1F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,MAAM,WAAW,oBAAoB,CAAC,OAAO;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B,IAAI,EAAE,WAAW,CAAC;IAClB;;;OAGG;IACH,QAAQ,EAAE,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACxE;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,OAAO,EACnC,IAAI,EAAE,oBAAoB,CAAC,OAAO,CAAC,GAClC,mBAAmB,
|
|
1
|
+
{"version":3,"file":"async-dispatch.d.ts","sourceRoot":"","sources":["../../src/http/async-dispatch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACvF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mDAAmD,CAAC;AAC1F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,MAAM,WAAW,oBAAoB,CAAC,OAAO;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B,IAAI,EAAE,WAAW,CAAC;IAClB;;;OAGG;IACH,QAAQ,EAAE,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACxE;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,OAAO,EACnC,IAAI,EAAE,oBAAoB,CAAC,OAAO,CAAC,GAClC,mBAAmB,CA0DrB"}
|
|
@@ -28,11 +28,21 @@ export function asyncDispatch(opts) {
|
|
|
28
28
|
// Build execution context for this batch
|
|
29
29
|
const ctx = buildExecutionContext(deps, projectContext, batchId);
|
|
30
30
|
// Schedule executor asynchronously — do not await here
|
|
31
|
+
const startedAtMs = Date.now();
|
|
31
32
|
setImmediate(() => {
|
|
32
33
|
void (async () => {
|
|
33
34
|
try {
|
|
35
|
+
deps.logger.taskStarted({ batchId, taskIndex: 0 });
|
|
34
36
|
const result = await opts.executor(ctx, batchId);
|
|
35
37
|
batchRegistry.complete(batchId, result);
|
|
38
|
+
const resultObj = result;
|
|
39
|
+
const taskCount = Array.isArray(resultObj?.results) ? resultObj.results.length : 0;
|
|
40
|
+
deps.logger.batchCompleted({
|
|
41
|
+
batchId,
|
|
42
|
+
tool,
|
|
43
|
+
durationMs: Date.now() - startedAtMs,
|
|
44
|
+
taskCount,
|
|
45
|
+
});
|
|
36
46
|
}
|
|
37
47
|
catch (err) {
|
|
38
48
|
const message = err instanceof Error ? err.message : String(err);
|
|
@@ -42,6 +52,13 @@ export function asyncDispatch(opts) {
|
|
|
42
52
|
message,
|
|
43
53
|
...(stack !== undefined && { stack }),
|
|
44
54
|
});
|
|
55
|
+
deps.logger.batchFailed({
|
|
56
|
+
batchId,
|
|
57
|
+
tool,
|
|
58
|
+
durationMs: Date.now() - startedAtMs,
|
|
59
|
+
errorCode: 'executor_error',
|
|
60
|
+
errorMessage: message,
|
|
61
|
+
});
|
|
45
62
|
}
|
|
46
63
|
})();
|
|
47
64
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async-dispatch.js","sourceRoot":"","sources":["../../src/http/async-dispatch.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAqB/D;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAmC;IAEnC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAEjF,yDAAyD;IACzD,aAAa,CAAC,QAAQ,CAAC;QACrB,OAAO;QACP,UAAU;QACV,IAAI;QACJ,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE;QAC1B,QAAQ;QACR,cAAc,EAAE,KAAK;KACtB,CAAC,CAAC;IAEH,yCAAyC;IACzC,MAAM,GAAG,GAAG,qBAAqB,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAEjE,uDAAuD;IACvD,YAAY,CAAC,GAAG,EAAE;QAChB,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;gBACjD,aAAa,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"async-dispatch.js","sourceRoot":"","sources":["../../src/http/async-dispatch.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAqB/D;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAmC;IAEnC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAEjF,yDAAyD;IACzD,aAAa,CAAC,QAAQ,CAAC;QACrB,OAAO;QACP,UAAU;QACV,IAAI;QACJ,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE;QAC1B,QAAQ;QACR,cAAc,EAAE,KAAK;KACtB,CAAC,CAAC;IAEH,yCAAyC;IACzC,MAAM,GAAG,GAAG,qBAAqB,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAEjE,uDAAuD;IACvD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/B,YAAY,CAAC,GAAG,EAAE;QAChB,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,IAAI,CAAC;gBACH,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;gBACnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;gBACjD,aAAa,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACxC,MAAM,SAAS,GAAG,MAA6C,CAAC;gBAChE,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnF,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;oBACzB,OAAO;oBACP,IAAI;oBACJ,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW;oBACpC,SAAS;iBACV,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC3D,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE;oBAC1B,IAAI,EAAE,gBAAgB;oBACtB,OAAO;oBACP,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,CAAC;iBACtC,CAAC,CAAC;gBACH,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;oBACtB,OAAO;oBACP,IAAI;oBACJ,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW;oBACpC,SAAS,EAAE,gBAAgB;oBAC3B,YAAY,EAAE,OAAO;iBACtB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,OAAO;QACP,SAAS,EAAE,UAAU,OAAO,EAAE;KAC/B,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-context.d.ts","sourceRoot":"","sources":["../../src/http/execution-context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"execution-context.d.ts","sourceRoot":"","sources":["../../src/http/execution-context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAqB,MAAM,mCAAmC,CAAC;AAC3F,OAAO,KAAK,EAAE,gBAAgB,EAAyB,MAAM,mDAAmD,CAAC;AACjH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,WAAW,EACjB,EAAE,EAAE,cAAc,EAClB,OAAO,EAAE,MAAM,GACd,gBAAgB,CAsDlB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// packages/server/src/http/execution-context.ts
|
|
2
|
-
import { createProvider } from '@zhixuan92/multi-model-agent-core';
|
|
2
|
+
import { createProvider, composeRunningHeadline } from '@zhixuan92/multi-model-agent-core';
|
|
3
3
|
/**
|
|
4
4
|
* Builds the ExecutionContext passed to every executor.
|
|
5
5
|
*
|
|
@@ -11,6 +11,37 @@ import { createProvider } from '@zhixuan92/multi-model-agent-core';
|
|
|
11
11
|
* by the POST /batch/:id/clarify handler (Phase 7).
|
|
12
12
|
*/
|
|
13
13
|
export function buildExecutionContext(deps, pc, batchId) {
|
|
14
|
+
const recordHeartbeat = (tick) => {
|
|
15
|
+
const effectiveBatchId = tick.batchId || batchId;
|
|
16
|
+
const entry = deps.batchRegistry.get(effectiveBatchId);
|
|
17
|
+
if (!entry)
|
|
18
|
+
return;
|
|
19
|
+
entry.lastHeartbeatAt = Date.now();
|
|
20
|
+
const headline = composeRunningHeadline({
|
|
21
|
+
tasksTotal: entry.tasksTotal ?? 1,
|
|
22
|
+
tasksStarted: entry.tasksStarted ?? 0,
|
|
23
|
+
tasksCompleted: entry.tasksCompleted ?? 0,
|
|
24
|
+
startedAt: entry.startedAt,
|
|
25
|
+
nowMs: Date.now(),
|
|
26
|
+
lastHeartbeatAt: entry.lastHeartbeatAt,
|
|
27
|
+
running: entry.running ?? [],
|
|
28
|
+
});
|
|
29
|
+
deps.batchRegistry.updateRunningHeadline(effectiveBatchId, headline);
|
|
30
|
+
deps.logger.taskHeartbeat({
|
|
31
|
+
batchId: effectiveBatchId,
|
|
32
|
+
taskIndex: 0,
|
|
33
|
+
elapsedMs: tick.elapsedMs,
|
|
34
|
+
stage: tick.stage,
|
|
35
|
+
});
|
|
36
|
+
if (tick.phaseChange !== undefined) {
|
|
37
|
+
deps.logger.taskPhaseChange({
|
|
38
|
+
batchId: effectiveBatchId,
|
|
39
|
+
taskIndex: 0,
|
|
40
|
+
fromStage: tick.phaseChange.from,
|
|
41
|
+
toStage: tick.phaseChange.to,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
};
|
|
14
45
|
return {
|
|
15
46
|
projectContext: pc,
|
|
16
47
|
config: deps.config,
|
|
@@ -19,6 +50,8 @@ export function buildExecutionContext(deps, pc, batchId) {
|
|
|
19
50
|
providerFactory: (profile) => createProvider(profile, deps.config),
|
|
20
51
|
parentModel: process.env['PARENT_MODEL_NAME'],
|
|
21
52
|
onProgress: undefined,
|
|
53
|
+
batchId,
|
|
54
|
+
recordHeartbeat,
|
|
22
55
|
awaitClarification: async (proposal) => {
|
|
23
56
|
return new Promise((resolve) => {
|
|
24
57
|
const entry = deps.batchRegistry.get(batchId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-context.js","sourceRoot":"","sources":["../../src/http/execution-context.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"execution-context.js","sourceRoot":"","sources":["../../src/http/execution-context.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAK3F;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAiB,EACjB,EAAkB,EAClB,OAAe;IAEf,MAAM,eAAe,GAAG,CAAC,IAAuB,EAAE,EAAE;QAClD,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,sBAAsB,CAAC;YACtC,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,CAAC;YACjC,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC;YACrC,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,CAAC;YACzC,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE;YACjB,eAAe,EAAE,KAAK,CAAC,eAAe;YACtC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE;SAC7B,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;YACxB,OAAO,EAAE,gBAAgB;YACzB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;gBAC1B,OAAO,EAAE,gBAAgB;gBACzB,SAAS,EAAE,CAAC;gBACZ,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI;gBAChC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE;aAC7B,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,cAAc,EAAE,EAAE;QAClB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,iBAAiB,EAAE,EAAE,CAAC,aAAa;QACnC,eAAe,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,cAAc,CAAC,OAAiC,EAAE,IAAI,CAAC,MAAM,CAAC;QACpG,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAC7C,UAAU,EAAE,SAAS;QACrB,OAAO;QACP,eAAe;QACf,kBAAkB,EAAE,KAAK,EAAE,QAA+B,EAAE,EAAE;YAC5D,OAAO,IAAI,OAAO,CAA6B,CAAC,OAAO,EAAE,EAAE;gBACzD,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC9C,IAAI,KAAK,EAAE,CAAC;oBACV,0EAA0E;oBAC1E,6CAA6C;oBAC7C,KAAK,CAAC,oBAAoB,GAAG,CAAC,cAAsB,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;gBACvF,CAAC;gBACD,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;YAC5E,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,19 +1,17 @@
|
|
|
1
1
|
import type { RawHandler } from '../../router.js';
|
|
2
|
-
import type
|
|
2
|
+
import { type BatchRegistry } from '@zhixuan92/multi-model-agent-core';
|
|
3
3
|
export interface BatchHandlerDeps {
|
|
4
4
|
batchRegistry: BatchRegistry;
|
|
5
5
|
}
|
|
6
6
|
/**
|
|
7
|
-
* GET /batch/:batchId — poll
|
|
8
|
-
* Optional ?taskIndex=N query param slices a single task result from a
|
|
9
|
-
* complete batch.
|
|
7
|
+
* GET /batch/:batchId — poll a batch.
|
|
10
8
|
*
|
|
11
|
-
*
|
|
12
|
-
* pending
|
|
13
|
-
* awaiting_clarification → 200
|
|
14
|
-
* complete
|
|
15
|
-
*
|
|
16
|
-
*
|
|
9
|
+
* Status split (Theme 7):
|
|
10
|
+
* - pending → 202 text/plain — body is the runningHeadline
|
|
11
|
+
* - awaiting_clarification → 200 JSON uniform 7-field envelope with proposedInterpretation populated
|
|
12
|
+
* - complete/failed/expired → 200 JSON uniform 7-field envelope
|
|
13
|
+
*
|
|
14
|
+
* Optional ?taskIndex=N slices `results` on a complete envelope.
|
|
17
15
|
*
|
|
18
16
|
* Errors:
|
|
19
17
|
* unknown batchId → 404 not_found
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../../../src/http/handlers/control/batch.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../../../src/http/handlers/control/batch.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAEtF,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,UAAU,CA6FpE"}
|