@zhixuan92/multi-model-agent 3.0.2 → 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.
Files changed (56) hide show
  1. package/README.md +7 -3
  2. package/dist/cli/index.d.ts.map +1 -1
  3. package/dist/cli/index.js +72 -2
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/cli/info.d.ts +22 -0
  6. package/dist/cli/info.d.ts.map +1 -0
  7. package/dist/cli/info.js +100 -0
  8. package/dist/cli/info.js.map +1 -0
  9. package/dist/cli/install-skill.d.ts.map +1 -1
  10. package/dist/cli/install-skill.js +44 -39
  11. package/dist/cli/install-skill.js.map +1 -1
  12. package/dist/cli/logs.d.ts +15 -0
  13. package/dist/cli/logs.d.ts.map +1 -0
  14. package/dist/cli/logs.js +102 -0
  15. package/dist/cli/logs.js.map +1 -0
  16. package/dist/cli/serve.d.ts +0 -17
  17. package/dist/cli/serve.d.ts.map +1 -1
  18. package/dist/cli/serve.js +117 -2
  19. package/dist/cli/serve.js.map +1 -1
  20. package/dist/cli/update-skills.d.ts +16 -0
  21. package/dist/cli/update-skills.d.ts.map +1 -0
  22. package/dist/cli/update-skills.js +127 -0
  23. package/dist/cli/update-skills.js.map +1 -0
  24. package/dist/http/async-dispatch.d.ts.map +1 -1
  25. package/dist/http/async-dispatch.js +17 -0
  26. package/dist/http/async-dispatch.js.map +1 -1
  27. package/dist/http/execution-context.d.ts.map +1 -1
  28. package/dist/http/execution-context.js +34 -1
  29. package/dist/http/execution-context.js.map +1 -1
  30. package/dist/http/handlers/control/batch.d.ts +8 -10
  31. package/dist/http/handlers/control/batch.d.ts.map +1 -1
  32. package/dist/http/handlers/control/batch.js +55 -49
  33. package/dist/http/handlers/control/batch.js.map +1 -1
  34. package/dist/http/handlers/introspection/health.d.ts +9 -8
  35. package/dist/http/handlers/introspection/health.d.ts.map +1 -1
  36. package/dist/http/handlers/introspection/health.js +13 -9
  37. package/dist/http/handlers/introspection/health.js.map +1 -1
  38. package/dist/http/server.js +4 -5
  39. package/dist/http/server.js.map +1 -1
  40. package/dist/install/manifest.d.ts +8 -4
  41. package/dist/install/manifest.d.ts.map +1 -1
  42. package/dist/install/manifest.js +76 -18
  43. package/dist/install/manifest.js.map +1 -1
  44. package/dist/skills/_shared/polling.md +50 -23
  45. package/dist/skills/mma-audit/SKILL.md +12 -3
  46. package/dist/skills/mma-clarifications/SKILL.md +13 -5
  47. package/dist/skills/mma-context-blocks/SKILL.md +13 -4
  48. package/dist/skills/mma-debug/SKILL.md +12 -3
  49. package/dist/skills/mma-delegate/SKILL.md +13 -3
  50. package/dist/skills/mma-execute-plan/SKILL.md +13 -3
  51. package/dist/skills/mma-retry/SKILL.md +11 -3
  52. package/dist/skills/mma-review/SKILL.md +11 -3
  53. package/dist/skills/mma-verify/SKILL.md +10 -3
  54. package/dist/skills/multi-model-agent/SKILL.md +23 -6
  55. package/package.json +7 -4
  56. package/scripts/postinstall.js +36 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/cli/logs.ts"],"names":[],"mappings":"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"}
@@ -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 {
@@ -1 +1 @@
1
- {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAG1E,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,CAuCtB"}
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
- stderr(`[mmagent] listening on ${host}:${running.port}\n`);
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 () => {
@@ -1 +1 @@
1
- {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAchD;;;GAGG;AACH,IAAI,YAAY,GAAG,KAAK,CAAC;AAEzB,uEAAuE;AACvE,IAAI,SAAmC,CAAC;AACxC,IAAI,QAAkC,CAAC;AAEvC;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAwB,EACxB,OAAgC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IAE1D,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,MAA2C,CAAC,CAAC;IAE/E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAEzD,MAAM,aAAa,GAAG,CAAC,GAAyB,EAAE,EAAE;QAClD,IAAI,YAAY;YAAE,OAAO;QACzB,YAAY,GAAG,IAAI,CAAC;QACpB,MAAM,CAAC,sBAAsB,GAAG,oCAAoC,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACxD,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,CAAC,8BAA8B,GAAG,IAAI,CAAC,CAAC;YAC9C,IAAI,CAAC,CAAC,CAAC,CAAC;QACV,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,6EAA6E;IAC7E,2EAA2E;IAC3E,0EAA0E;IAC1E,SAAS,GAAG,GAAG,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAC3C,QAAQ,GAAG,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACzC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEjC,2EAA2E;IAC3E,kDAAkD;IAClD,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;IACzD,MAAM,CAAC,0BAA0B,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;IAE3D,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,mEAAmE;YACnE,4CAA4C;YAC5C,IAAI,SAAS;gBAAE,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACjD,IAAI,QAAQ;gBAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC9C,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC"}
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":"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"}
@@ -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,CAyCrB"}
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;YAC1C,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;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
+ {"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,EAAE,MAAM,mCAAmC,CAAC;AACxE,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,CAqBlB"}
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;AAKnE;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAiB,EACjB,EAAkB,EAClB,OAAe;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,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
+ {"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 { BatchRegistry } from '@zhixuan92/multi-model-agent-core';
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 the current state of a batch.
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
- * State mapping:
12
- * pending 200 { state, startedAt }
13
- * awaiting_clarification → 200 { state, proposedInterpretation }
14
- * complete → 200 { state, result } (or sliced if taskIndex given)
15
- * failed → 200 { state, error }
16
- * expired → 200 { state: 'expired' }
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,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAEvE,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,UAAU,CAiFpE"}
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"}