@zhixuan92/multi-model-agent 4.9.0 → 5.0.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/bin/mmagent.mjs +47 -0
- package/package.json +19 -57
- package/postinstall.mjs +8 -0
- package/LICENSE +0 -21
- package/README.md +0 -306
- package/dist/cli/index.d.ts +0 -62
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -345
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/info.d.ts +0 -22
- package/dist/cli/info.d.ts.map +0 -1
- package/dist/cli/info.js +0 -100
- package/dist/cli/info.js.map +0 -1
- package/dist/cli/logs.d.ts +0 -15
- package/dist/cli/logs.d.ts.map +0 -1
- package/dist/cli/logs.js +0 -102
- package/dist/cli/logs.js.map +0 -1
- package/dist/cli/print-token.d.ts +0 -18
- package/dist/cli/print-token.d.ts.map +0 -1
- package/dist/cli/print-token.js +0 -60
- package/dist/cli/print-token.js.map +0 -1
- package/dist/cli/serve.d.ts +0 -28
- package/dist/cli/serve.d.ts.map +0 -1
- package/dist/cli/serve.js +0 -405
- package/dist/cli/serve.js.map +0 -1
- package/dist/cli/status.d.ts +0 -49
- package/dist/cli/status.d.ts.map +0 -1
- package/dist/cli/status.js +0 -155
- package/dist/cli/status.js.map +0 -1
- package/dist/cli/sync-skills.d.ts +0 -58
- package/dist/cli/sync-skills.d.ts.map +0 -1
- package/dist/cli/sync-skills.js +0 -266
- package/dist/cli/sync-skills.js.map +0 -1
- package/dist/cli/telemetry.d.ts +0 -10
- package/dist/cli/telemetry.d.ts.map +0 -1
- package/dist/cli/telemetry.js +0 -161
- package/dist/cli/telemetry.js.map +0 -1
- package/dist/cli/toggle.d.ts +0 -26
- package/dist/cli/toggle.d.ts.map +0 -1
- package/dist/cli/toggle.js +0 -185
- package/dist/cli/toggle.js.map +0 -1
- package/dist/http/async-dispatch.d.ts +0 -44
- package/dist/http/async-dispatch.d.ts.map +0 -1
- package/dist/http/async-dispatch.js +0 -175
- package/dist/http/async-dispatch.js.map +0 -1
- package/dist/http/auth.d.ts +0 -20
- package/dist/http/auth.d.ts.map +0 -1
- package/dist/http/auth.js +0 -56
- package/dist/http/auth.js.map +0 -1
- package/dist/http/canonicalize-file-paths.d.ts +0 -8
- package/dist/http/canonicalize-file-paths.d.ts.map +0 -1
- package/dist/http/canonicalize-file-paths.js +0 -43
- package/dist/http/canonicalize-file-paths.js.map +0 -1
- package/dist/http/cwd-validator.d.ts +0 -11
- package/dist/http/cwd-validator.d.ts.map +0 -1
- package/dist/http/cwd-validator.js +0 -130
- package/dist/http/cwd-validator.js.map +0 -1
- package/dist/http/errors.d.ts +0 -4
- package/dist/http/errors.d.ts.map +0 -1
- package/dist/http/errors.js +0 -9
- package/dist/http/errors.js.map +0 -1
- package/dist/http/execution-context.d.ts +0 -18
- package/dist/http/execution-context.d.ts.map +0 -1
- package/dist/http/execution-context.js +0 -61
- package/dist/http/execution-context.js.map +0 -1
- package/dist/http/handler-deps.d.ts +0 -19
- package/dist/http/handler-deps.d.ts.map +0 -1
- package/dist/http/handler-deps.js +0 -2
- package/dist/http/handler-deps.js.map +0 -1
- package/dist/http/handlers/control/batch-slice.d.ts +0 -4
- package/dist/http/handlers/control/batch-slice.d.ts.map +0 -1
- package/dist/http/handlers/control/batch-slice.js +0 -40
- package/dist/http/handlers/control/batch-slice.js.map +0 -1
- package/dist/http/handlers/control/batch.d.ts +0 -23
- package/dist/http/handlers/control/batch.d.ts.map +0 -1
- package/dist/http/handlers/control/batch.js +0 -332
- package/dist/http/handlers/control/batch.js.map +0 -1
- package/dist/http/handlers/control/context-blocks.d.ts +0 -22
- package/dist/http/handlers/control/context-blocks.d.ts.map +0 -1
- package/dist/http/handlers/control/context-blocks.js +0 -111
- package/dist/http/handlers/control/context-blocks.js.map +0 -1
- package/dist/http/handlers/introspection/health.d.ts +0 -20
- package/dist/http/handlers/introspection/health.d.ts.map +0 -1
- package/dist/http/handlers/introspection/health.js +0 -18
- package/dist/http/handlers/introspection/health.js.map +0 -1
- package/dist/http/handlers/introspection/status.d.ts +0 -26
- package/dist/http/handlers/introspection/status.d.ts.map +0 -1
- package/dist/http/handlers/introspection/status.js +0 -136
- package/dist/http/handlers/introspection/status.js.map +0 -1
- package/dist/http/handlers/tools/audit.d.ts +0 -4
- package/dist/http/handlers/tools/audit.d.ts.map +0 -1
- package/dist/http/handlers/tools/audit.js +0 -43
- package/dist/http/handlers/tools/audit.js.map +0 -1
- package/dist/http/handlers/tools/debug.d.ts +0 -4
- package/dist/http/handlers/tools/debug.d.ts.map +0 -1
- package/dist/http/handlers/tools/debug.js +0 -43
- package/dist/http/handlers/tools/debug.js.map +0 -1
- package/dist/http/handlers/tools/delegate.d.ts +0 -4
- package/dist/http/handlers/tools/delegate.d.ts.map +0 -1
- package/dist/http/handlers/tools/delegate.js +0 -43
- package/dist/http/handlers/tools/delegate.js.map +0 -1
- package/dist/http/handlers/tools/execute-plan.d.ts +0 -4
- package/dist/http/handlers/tools/execute-plan.d.ts.map +0 -1
- package/dist/http/handlers/tools/execute-plan.js +0 -45
- package/dist/http/handlers/tools/execute-plan.js.map +0 -1
- package/dist/http/handlers/tools/investigate.d.ts +0 -4
- package/dist/http/handlers/tools/investigate.d.ts.map +0 -1
- package/dist/http/handlers/tools/investigate.js +0 -64
- package/dist/http/handlers/tools/investigate.js.map +0 -1
- package/dist/http/handlers/tools/journal-recall.d.ts +0 -4
- package/dist/http/handlers/tools/journal-recall.d.ts.map +0 -1
- package/dist/http/handlers/tools/journal-recall.js +0 -40
- package/dist/http/handlers/tools/journal-recall.js.map +0 -1
- package/dist/http/handlers/tools/journal-record.d.ts +0 -4
- package/dist/http/handlers/tools/journal-record.d.ts.map +0 -1
- package/dist/http/handlers/tools/journal-record.js +0 -35
- package/dist/http/handlers/tools/journal-record.js.map +0 -1
- package/dist/http/handlers/tools/research.d.ts +0 -4
- package/dist/http/handlers/tools/research.d.ts.map +0 -1
- package/dist/http/handlers/tools/research.js +0 -64
- package/dist/http/handlers/tools/research.js.map +0 -1
- package/dist/http/handlers/tools/retry.d.ts +0 -4
- package/dist/http/handlers/tools/retry.d.ts.map +0 -1
- package/dist/http/handlers/tools/retry.js +0 -73
- package/dist/http/handlers/tools/retry.js.map +0 -1
- package/dist/http/handlers/tools/review.d.ts +0 -4
- package/dist/http/handlers/tools/review.d.ts.map +0 -1
- package/dist/http/handlers/tools/review.js +0 -43
- package/dist/http/handlers/tools/review.js.map +0 -1
- package/dist/http/middleware/body-reader.d.ts +0 -16
- package/dist/http/middleware/body-reader.d.ts.map +0 -1
- package/dist/http/middleware/body-reader.js +0 -44
- package/dist/http/middleware/body-reader.js.map +0 -1
- package/dist/http/middleware/caller-identity.d.ts +0 -16
- package/dist/http/middleware/caller-identity.d.ts.map +0 -1
- package/dist/http/middleware/caller-identity.js +0 -16
- package/dist/http/middleware/caller-identity.js.map +0 -1
- package/dist/http/middleware/decompress.d.ts +0 -14
- package/dist/http/middleware/decompress.d.ts.map +0 -1
- package/dist/http/middleware/decompress.js +0 -51
- package/dist/http/middleware/decompress.js.map +0 -1
- package/dist/http/project-registry.d.ts +0 -54
- package/dist/http/project-registry.d.ts.map +0 -1
- package/dist/http/project-registry.js +0 -130
- package/dist/http/project-registry.js.map +0 -1
- package/dist/http/request-observability.d.ts +0 -8
- package/dist/http/request-observability.d.ts.map +0 -1
- package/dist/http/request-observability.js +0 -20
- package/dist/http/request-observability.js.map +0 -1
- package/dist/http/request-pipeline.d.ts +0 -16
- package/dist/http/request-pipeline.d.ts.map +0 -1
- package/dist/http/request-pipeline.js +0 -144
- package/dist/http/request-pipeline.js.map +0 -1
- package/dist/http/server.d.ts +0 -17
- package/dist/http/server.d.ts.map +0 -1
- package/dist/http/server.js +0 -300
- package/dist/http/server.js.map +0 -1
- package/dist/http/types.d.ts +0 -20
- package/dist/http/types.d.ts.map +0 -1
- package/dist/http/types.js +0 -2
- package/dist/http/types.js.map +0 -1
- package/dist/skill-install/disabled-state.d.ts +0 -35
- package/dist/skill-install/disabled-state.d.ts.map +0 -1
- package/dist/skill-install/disabled-state.js +0 -96
- package/dist/skill-install/disabled-state.js.map +0 -1
- package/dist/skill-install/discover.d.ts +0 -29
- package/dist/skill-install/discover.d.ts.map +0 -1
- package/dist/skill-install/discover.js +0 -104
- package/dist/skill-install/discover.js.map +0 -1
- package/dist/skill-install/include-utils.d.ts +0 -27
- package/dist/skill-install/include-utils.d.ts.map +0 -1
- package/dist/skill-install/include-utils.js +0 -90
- package/dist/skill-install/include-utils.js.map +0 -1
- package/dist/skill-install/manifest.d.ts +0 -82
- package/dist/skill-install/manifest.d.ts.map +0 -1
- package/dist/skill-install/manifest.js +0 -215
- package/dist/skill-install/manifest.js.map +0 -1
- package/dist/skill-install/skill-installer-common.d.ts +0 -26
- package/dist/skill-install/skill-installer-common.d.ts.map +0 -1
- package/dist/skill-install/skill-installer-common.js +0 -139
- package/dist/skill-install/skill-installer-common.js.map +0 -1
- package/dist/skill-install/skill-installers/claude-code.d.ts +0 -43
- package/dist/skill-install/skill-installers/claude-code.d.ts.map +0 -1
- package/dist/skill-install/skill-installers/claude-code.js +0 -65
- package/dist/skill-install/skill-installers/claude-code.js.map +0 -1
- package/dist/skill-install/skill-installers/codex-cli.d.ts +0 -27
- package/dist/skill-install/skill-installers/codex-cli.d.ts.map +0 -1
- package/dist/skill-install/skill-installers/codex-cli.js +0 -84
- package/dist/skill-install/skill-installers/codex-cli.js.map +0 -1
- package/dist/skill-install/skill-installers/cursor.d.ts +0 -72
- package/dist/skill-install/skill-installers/cursor.d.ts.map +0 -1
- package/dist/skill-install/skill-installers/cursor.js +0 -81
- package/dist/skill-install/skill-installers/cursor.js.map +0 -1
- package/dist/skill-install/skill-installers/gemini-cli.d.ts +0 -50
- package/dist/skill-install/skill-installers/gemini-cli.d.ts.map +0 -1
- package/dist/skill-install/skill-installers/gemini-cli.js +0 -72
- package/dist/skill-install/skill-installers/gemini-cli.js.map +0 -1
- package/dist/skill-install/skill-manifest-sync.d.ts +0 -11
- package/dist/skill-install/skill-manifest-sync.d.ts.map +0 -1
- package/dist/skill-install/skill-manifest-sync.js +0 -65
- package/dist/skill-install/skill-manifest-sync.js.map +0 -1
- package/dist/skills/_shared/auth.md +0 -41
- package/dist/skills/_shared/error-handling.md +0 -31
- package/dist/skills/_shared/polling.md +0 -88
- package/dist/skills/_shared/response-shape.md +0 -55
- package/dist/skills/_shared/review-policy.md +0 -15
- package/dist/skills/mma-audit/SKILL.md +0 -270
- package/dist/skills/mma-context-blocks/SKILL.md +0 -148
- package/dist/skills/mma-debug/SKILL.md +0 -208
- package/dist/skills/mma-delegate/SKILL.md +0 -216
- package/dist/skills/mma-execute-plan/SKILL.md +0 -214
- package/dist/skills/mma-explore/SKILL.md +0 -190
- package/dist/skills/mma-investigate/SKILL.md +0 -258
- package/dist/skills/mma-journal-recall/SKILL.md +0 -242
- package/dist/skills/mma-journal-record/SKILL.md +0 -189
- package/dist/skills/mma-research/SKILL.md +0 -223
- package/dist/skills/mma-retry/SKILL.md +0 -221
- package/dist/skills/mma-review/SKILL.md +0 -209
- package/dist/skills/multi-model-agent/SKILL.md +0 -206
- package/dist/telemetry/consent.d.ts +0 -4
- package/dist/telemetry/consent.d.ts.map +0 -1
- package/dist/telemetry/consent.js +0 -40
- package/dist/telemetry/consent.js.map +0 -1
- package/dist/telemetry/flusher.d.ts +0 -19
- package/dist/telemetry/flusher.d.ts.map +0 -1
- package/dist/telemetry/flusher.js +0 -277
- package/dist/telemetry/flusher.js.map +0 -1
- package/dist/telemetry/generation.d.ts +0 -9
- package/dist/telemetry/generation.d.ts.map +0 -1
- package/dist/telemetry/generation.js +0 -33
- package/dist/telemetry/generation.js.map +0 -1
- package/dist/telemetry/identity.d.ts +0 -9
- package/dist/telemetry/identity.d.ts.map +0 -1
- package/dist/telemetry/identity.js +0 -35
- package/dist/telemetry/identity.js.map +0 -1
- package/dist/telemetry/install-id.d.ts +0 -13
- package/dist/telemetry/install-id.d.ts.map +0 -1
- package/dist/telemetry/install-id.js +0 -49
- package/dist/telemetry/install-id.js.map +0 -1
- package/dist/telemetry/install-meta.d.ts +0 -10
- package/dist/telemetry/install-meta.d.ts.map +0 -1
- package/dist/telemetry/install-meta.js +0 -15
- package/dist/telemetry/install-meta.js.map +0 -1
- package/dist/telemetry/queue.d.ts +0 -35
- package/dist/telemetry/queue.d.ts.map +0 -1
- package/dist/telemetry/queue.js +0 -287
- package/dist/telemetry/queue.js.map +0 -1
- package/dist/telemetry/recorder.d.ts +0 -39
- package/dist/telemetry/recorder.d.ts.map +0 -1
- package/dist/telemetry/recorder.js +0 -173
- package/dist/telemetry/recorder.js.map +0 -1
- package/scripts/postinstall.js +0 -36
package/dist/http/auth.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Load or generate the bearer token from a file path.
|
|
3
|
-
* Respects the MMAGENT_AUTH_TOKEN env override via coreLoadAuthToken when the
|
|
4
|
-
* file already exists. Falls back to generating a new token if the file does not exist.
|
|
5
|
-
*/
|
|
6
|
-
export declare function loadToken(tokenPath: string): string;
|
|
7
|
-
/**
|
|
8
|
-
* Validate an Authorization header value (including "Bearer " prefix).
|
|
9
|
-
* Uses crypto.timingSafeEqual to prevent timing attacks.
|
|
10
|
-
*
|
|
11
|
-
* Returns { ok: true } on success.
|
|
12
|
-
* Returns { ok: false, reason } on failure without leaking which check failed.
|
|
13
|
-
*/
|
|
14
|
-
export declare function validateAuthHeader(header: string | undefined, expected: string): {
|
|
15
|
-
ok: true;
|
|
16
|
-
} | {
|
|
17
|
-
ok: false;
|
|
18
|
-
reason: 'missing' | 'malformed' | 'mismatch';
|
|
19
|
-
};
|
|
20
|
-
//# sourceMappingURL=auth.d.ts.map
|
package/dist/http/auth.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/http/auth.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAkBnD;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,QAAQ,EAAE,MAAM,GACf;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,CAAA;CAAE,CAU5E"}
|
package/dist/http/auth.js
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import * as fs from 'node:fs';
|
|
2
|
-
import * as path from 'node:path';
|
|
3
|
-
import * as os from 'node:os';
|
|
4
|
-
import { randomBytes, timingSafeEqual } from 'node:crypto';
|
|
5
|
-
import { loadAuthToken as coreLoadAuthToken } from '@zhixuan92/multi-model-agent-core';
|
|
6
|
-
function expandHome(p) {
|
|
7
|
-
if (p.startsWith('~/'))
|
|
8
|
-
return path.join(os.homedir(), p.slice(2));
|
|
9
|
-
return p;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Load or generate the bearer token from a file path.
|
|
13
|
-
* Respects the MMAGENT_AUTH_TOKEN env override via coreLoadAuthToken when the
|
|
14
|
-
* file already exists. Falls back to generating a new token if the file does not exist.
|
|
15
|
-
*/
|
|
16
|
-
export function loadToken(tokenPath) {
|
|
17
|
-
const resolved = expandHome(tokenPath);
|
|
18
|
-
if (fs.existsSync(resolved)) {
|
|
19
|
-
const stat = fs.statSync(resolved);
|
|
20
|
-
// Warn (do not fail) if the existing file has group/other read/write bits set.
|
|
21
|
-
if ((stat.mode & 0o077) !== 0) {
|
|
22
|
-
process.stderr.write(`[multi-model-agent] warning: token file ${resolved} has insecure permissions (mode ${(stat.mode & 0o777).toString(8)}); recommend 'chmod 0600 ${resolved}'\n`);
|
|
23
|
-
}
|
|
24
|
-
// Use core's loadAuthToken so the MMAGENT_AUTH_TOKEN env override is respected.
|
|
25
|
-
return coreLoadAuthToken({ tokenFile: resolved });
|
|
26
|
-
}
|
|
27
|
-
const dir = path.dirname(resolved);
|
|
28
|
-
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
29
|
-
const token = randomBytes(32).toString('base64url');
|
|
30
|
-
fs.writeFileSync(resolved, token + '\n', { mode: 0o600 });
|
|
31
|
-
return token;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Validate an Authorization header value (including "Bearer " prefix).
|
|
35
|
-
* Uses crypto.timingSafeEqual to prevent timing attacks.
|
|
36
|
-
*
|
|
37
|
-
* Returns { ok: true } on success.
|
|
38
|
-
* Returns { ok: false, reason } on failure without leaking which check failed.
|
|
39
|
-
*/
|
|
40
|
-
export function validateAuthHeader(header, expected) {
|
|
41
|
-
if (!header)
|
|
42
|
-
return { ok: false, reason: 'missing' };
|
|
43
|
-
const parts = header.split(/\s+/);
|
|
44
|
-
if (parts.length !== 2)
|
|
45
|
-
return { ok: false, reason: 'malformed' };
|
|
46
|
-
if (parts[0].toLowerCase() !== 'bearer')
|
|
47
|
-
return { ok: false, reason: 'malformed' };
|
|
48
|
-
const presented = Buffer.from(parts[1]);
|
|
49
|
-
const expectedBuf = Buffer.from(expected);
|
|
50
|
-
if (presented.length !== expectedBuf.length)
|
|
51
|
-
return { ok: false, reason: 'mismatch' };
|
|
52
|
-
if (!timingSafeEqual(presented, expectedBuf))
|
|
53
|
-
return { ok: false, reason: 'mismatch' };
|
|
54
|
-
return { ok: true };
|
|
55
|
-
}
|
|
56
|
-
//# sourceMappingURL=auth.js.map
|
package/dist/http/auth.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/http/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export type CanonicalizeResult = string[] | {
|
|
2
|
-
error: 'invalid_request';
|
|
3
|
-
fieldErrors: {
|
|
4
|
-
filePaths: string[];
|
|
5
|
-
};
|
|
6
|
-
};
|
|
7
|
-
export declare function canonicalizeFilePaths(rawPaths: string[], cwd: string): CanonicalizeResult;
|
|
8
|
-
//# sourceMappingURL=canonicalize-file-paths.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"canonicalize-file-paths.d.ts","sourceRoot":"","sources":["../../src/http/canonicalize-file-paths.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,kBAAkB,GAC1B,MAAM,EAAE,GACR;IAAE,KAAK,EAAE,iBAAiB,CAAC;IAAC,WAAW,EAAE;QAAE,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;CAAE,CAAC;AAEvE,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAoCzF"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { realpathSync, existsSync } from 'node:fs';
|
|
2
|
-
import * as path from 'node:path';
|
|
3
|
-
export function canonicalizeFilePaths(rawPaths, cwd) {
|
|
4
|
-
const realCwd = realpathSync(cwd);
|
|
5
|
-
const accepted = [];
|
|
6
|
-
const offenders = [];
|
|
7
|
-
for (const raw of rawPaths) {
|
|
8
|
-
const resolved = path.isAbsolute(raw) ? path.normalize(raw) : path.resolve(realCwd, raw);
|
|
9
|
-
let cursor = resolved;
|
|
10
|
-
while (!existsSync(cursor) && path.dirname(cursor) !== cursor) {
|
|
11
|
-
cursor = path.dirname(cursor);
|
|
12
|
-
}
|
|
13
|
-
let realAncestor;
|
|
14
|
-
try {
|
|
15
|
-
realAncestor = realpathSync(cursor);
|
|
16
|
-
}
|
|
17
|
-
catch {
|
|
18
|
-
offenders.push(raw);
|
|
19
|
-
continue;
|
|
20
|
-
}
|
|
21
|
-
const suffix = path.relative(cursor, resolved);
|
|
22
|
-
const candidate = suffix ? path.normalize(path.join(realAncestor, suffix)) : realAncestor;
|
|
23
|
-
const rel = path.relative(realCwd, candidate);
|
|
24
|
-
const inside = rel === '' || (!rel.startsWith('..' + path.sep) && rel !== '..' && !path.isAbsolute(rel));
|
|
25
|
-
if (!inside) {
|
|
26
|
-
offenders.push(raw);
|
|
27
|
-
continue;
|
|
28
|
-
}
|
|
29
|
-
accepted.push(candidate);
|
|
30
|
-
}
|
|
31
|
-
if (offenders.length > 0) {
|
|
32
|
-
return { error: 'invalid_request', fieldErrors: { filePaths: offenders } };
|
|
33
|
-
}
|
|
34
|
-
const seen = new Set();
|
|
35
|
-
const dedup = [];
|
|
36
|
-
for (const p of accepted)
|
|
37
|
-
if (!seen.has(p)) {
|
|
38
|
-
seen.add(p);
|
|
39
|
-
dedup.push(p);
|
|
40
|
-
}
|
|
41
|
-
return dedup;
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=canonicalize-file-paths.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"canonicalize-file-paths.js","sourceRoot":"","sources":["../../src/http/canonicalize-file-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAMlC,MAAM,UAAU,qBAAqB,CAAC,QAAkB,EAAE,GAAW;IACnE,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACzF,IAAI,MAAM,GAAG,QAAQ,CAAC;QACtB,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,MAAM,EAAE,CAAC;YAC9D,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,YAAoB,CAAC;QACzB,IAAI,CAAC;YACH,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;QAC1F,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACzG,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,SAAS;QACX,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC;IAC7E,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,QAAQ;QAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;IAC3E,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export type CwdValidationError = 'missing_cwd' | 'invalid_cwd' | 'cwd_not_dir' | 'forbidden_cwd';
|
|
2
|
-
export type CwdValidationResult = {
|
|
3
|
-
ok: true;
|
|
4
|
-
canonicalCwd: string;
|
|
5
|
-
} | {
|
|
6
|
-
ok: false;
|
|
7
|
-
error: CwdValidationError;
|
|
8
|
-
message: string;
|
|
9
|
-
};
|
|
10
|
-
export declare function validateCwd(cwd: string | undefined): CwdValidationResult;
|
|
11
|
-
//# sourceMappingURL=cwd-validator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cwd-validator.d.ts","sourceRoot":"","sources":["../../src/http/cwd-validator.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG,aAAa,GAAG,aAAa,GAAG,eAAe,CAAC;AAEjG,MAAM,MAAM,mBAAmB,GAC3B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAiF9D,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,mBAAmB,CA8CxE"}
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
// Request-time validator for the HTTP `cwd` query param: existence, absolute path,
|
|
2
|
-
// directory check, symlink-escape detection. Distinct from `core/identity/cwd-validator.ts`,
|
|
3
|
-
// which is the substrate-level path-confinement guard used inside tool calls.
|
|
4
|
-
import * as fs from 'node:fs';
|
|
5
|
-
import * as path from 'node:path';
|
|
6
|
-
const SEP = path.sep;
|
|
7
|
-
/**
|
|
8
|
-
* Walk each path component and check if any symlink points outside its
|
|
9
|
-
* containing parent directory (symlink escape). Returns true if a symlink
|
|
10
|
-
* escape is detected.
|
|
11
|
-
*
|
|
12
|
-
* Algorithm: build the path incrementally. At each component that is a symlink,
|
|
13
|
-
* canonicalize both the parent directory and the symlink's resolved target via
|
|
14
|
-
* realpathSync, then verify that the resolved target is a descendant of the
|
|
15
|
-
* canonical parent. This handles macOS-style double-indirection (e.g. /var →
|
|
16
|
-
* /private/var) without false positives.
|
|
17
|
-
*/
|
|
18
|
-
function hasSymlinkEscape(cwd) {
|
|
19
|
-
const parts = cwd.split(SEP).filter(Boolean); // ['a','b','c'] for /a/b/c
|
|
20
|
-
// We track the "logical" accumulated path (not yet canonicalized) so lstat
|
|
21
|
-
// finds the right inode even when earlier symlinks changed the real prefix.
|
|
22
|
-
// We will resolve it when we need to compare.
|
|
23
|
-
let logicalAccum = SEP;
|
|
24
|
-
for (const part of parts) {
|
|
25
|
-
const logicalCurrent = path.join(logicalAccum, part);
|
|
26
|
-
// Resolve logicalAccum to its canonical form so lstat finds the right path.
|
|
27
|
-
let canonAccum;
|
|
28
|
-
try {
|
|
29
|
-
canonAccum = fs.realpathSync(logicalAccum);
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
return false;
|
|
33
|
-
}
|
|
34
|
-
const canonCurrent = path.join(canonAccum, part);
|
|
35
|
-
let lstat;
|
|
36
|
-
try {
|
|
37
|
-
lstat = fs.lstatSync(canonCurrent);
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
// Path doesn't exist — validateCwd will catch this
|
|
41
|
-
return false;
|
|
42
|
-
}
|
|
43
|
-
if (lstat.isSymbolicLink()) {
|
|
44
|
-
let target;
|
|
45
|
-
try {
|
|
46
|
-
target = fs.readlinkSync(canonCurrent);
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
return false;
|
|
50
|
-
}
|
|
51
|
-
// Resolve target relative to the canonical parent directory of the symlink.
|
|
52
|
-
const resolvedTarget = path.isAbsolute(target)
|
|
53
|
-
? target
|
|
54
|
-
: path.resolve(canonAccum, target);
|
|
55
|
-
// Canonicalize the resolved target and the parent dir for stable comparison.
|
|
56
|
-
let canonResolvedTarget;
|
|
57
|
-
try {
|
|
58
|
-
canonResolvedTarget = fs.realpathSync(resolvedTarget);
|
|
59
|
-
}
|
|
60
|
-
catch {
|
|
61
|
-
// Target doesn't exist — validateCwd will catch this
|
|
62
|
-
return false;
|
|
63
|
-
}
|
|
64
|
-
// The parent dir that should "contain" this symlink is canonAccum.
|
|
65
|
-
const parentWithSep = canonAccum.endsWith(SEP) ? canonAccum : canonAccum + SEP;
|
|
66
|
-
const resolvedWithSep = canonResolvedTarget.endsWith(SEP)
|
|
67
|
-
? canonResolvedTarget
|
|
68
|
-
: canonResolvedTarget + SEP;
|
|
69
|
-
if (!resolvedWithSep.startsWith(parentWithSep)) {
|
|
70
|
-
// Symlink escapes its parent directory
|
|
71
|
-
return true;
|
|
72
|
-
}
|
|
73
|
-
logicalAccum = resolvedTarget;
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
logicalAccum = logicalCurrent;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
return false;
|
|
80
|
-
}
|
|
81
|
-
export function validateCwd(cwd) {
|
|
82
|
-
if (!cwd)
|
|
83
|
-
return { ok: false, error: 'missing_cwd', message: "required query param 'cwd' not provided" };
|
|
84
|
-
if (!path.isAbsolute(cwd))
|
|
85
|
-
return { ok: false, error: 'invalid_cwd', message: `cwd must be absolute: ${cwd}` };
|
|
86
|
-
// A4a.1 §3a step 2: reject the stale-sibling pattern. Prior Claude Code
|
|
87
|
-
// test runs leave directories under /tmp/claude/G--<project>-<slug>;
|
|
88
|
-
// routing tasks at them produces confused write attribution (worker
|
|
89
|
-
// memory: feedback_mma_worker_sandbox_topic_tracker). Prefix-match only
|
|
90
|
-
// — `/home/user/projects/G--my-app` is legitimate.
|
|
91
|
-
if (cwd.startsWith('/tmp/claude/G--') || cwd.startsWith('/private/tmp/claude/G--')) {
|
|
92
|
-
return {
|
|
93
|
-
ok: false,
|
|
94
|
-
error: 'forbidden_cwd',
|
|
95
|
-
message: `cwd matches the stale-sibling pattern '/tmp/claude/G--*' (likely contamination from prior Claude Code test runs). Run 'rm -rf /tmp/claude/G--*' to clean up, or pass a real project cwd.`,
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
let canonical;
|
|
99
|
-
try {
|
|
100
|
-
canonical = fs.realpathSync(cwd);
|
|
101
|
-
}
|
|
102
|
-
catch (err) {
|
|
103
|
-
const code = err.code;
|
|
104
|
-
if (code === 'ENOENT')
|
|
105
|
-
return { ok: false, error: 'cwd_not_dir', message: `cwd does not exist: ${cwd}` };
|
|
106
|
-
if (code === 'EACCES' || code === 'EPERM')
|
|
107
|
-
return { ok: false, error: 'cwd_not_dir', message: `cwd is not accessible (permission denied): ${cwd}` };
|
|
108
|
-
return { ok: false, error: 'cwd_not_dir', message: `cwd cannot be resolved (${code ?? 'unknown error'}): ${cwd}` };
|
|
109
|
-
}
|
|
110
|
-
let stat;
|
|
111
|
-
try {
|
|
112
|
-
stat = fs.statSync(canonical);
|
|
113
|
-
}
|
|
114
|
-
catch {
|
|
115
|
-
return { ok: false, error: 'cwd_not_dir', message: `cwd realpath is not accessible: ${cwd} → ${canonical}` };
|
|
116
|
-
}
|
|
117
|
-
if (!stat.isDirectory())
|
|
118
|
-
return { ok: false, error: 'cwd_not_dir', message: `cwd is not a directory: ${cwd}` };
|
|
119
|
-
// ── Symlink-escape check ──────────────────────────────────────────────────
|
|
120
|
-
// Detect symlinks whose target escapes the containing parent directory.
|
|
121
|
-
if (hasSymlinkEscape(cwd)) {
|
|
122
|
-
return {
|
|
123
|
-
ok: false,
|
|
124
|
-
error: 'forbidden_cwd',
|
|
125
|
-
message: `cwd contains a symlink that escapes its parent directory: ${cwd}`,
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
return { ok: true, canonicalCwd: canonical };
|
|
129
|
-
}
|
|
130
|
-
//# sourceMappingURL=cwd-validator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cwd-validator.js","sourceRoot":"","sources":["../../src/http/cwd-validator.ts"],"names":[],"mappings":"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"}
|
package/dist/http/errors.d.ts
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import type { ServerResponse } from 'node:http';
|
|
2
|
-
export declare function sendError(res: ServerResponse, status: number, code: string, message: string, details?: unknown): void;
|
|
3
|
-
export declare function sendJson(res: ServerResponse, status: number, body: unknown): void;
|
|
4
|
-
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/http/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,wBAAgB,SAAS,CACvB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,OAAO,GAChB,IAAI,CAGN;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAGjF"}
|
package/dist/http/errors.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export function sendError(res, status, code, message, details) {
|
|
2
|
-
res.writeHead(status, { 'content-type': 'application/json' });
|
|
3
|
-
res.end(JSON.stringify({ error: { code, message, ...(details !== undefined ? { details } : {}) } }));
|
|
4
|
-
}
|
|
5
|
-
export function sendJson(res, status, body) {
|
|
6
|
-
res.writeHead(status, { 'content-type': 'application/json' });
|
|
7
|
-
res.end(JSON.stringify(body));
|
|
8
|
-
}
|
|
9
|
-
//# sourceMappingURL=errors.js.map
|
package/dist/http/errors.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/http/errors.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,SAAS,CACvB,GAAmB,EACnB,MAAc,EACd,IAAY,EACZ,OAAe,EACf,OAAiB;IAEjB,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC9D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AACvG,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAa;IACzE,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC9D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { ExecutionContext } from '@zhixuan92/multi-model-agent-core';
|
|
2
|
-
import type { TaskEnvelopeStore } from '@zhixuan92/multi-model-agent-core/events/task-envelope';
|
|
3
|
-
import type { HandlerDeps } from './handler-deps.js';
|
|
4
|
-
import type { ProjectContext } from '@zhixuan92/multi-model-agent-core';
|
|
5
|
-
/**
|
|
6
|
-
* Builds a canonical ExecutionContext for the async-dispatch → executor path.
|
|
7
|
-
*
|
|
8
|
-
* The canonical type carries lifecycle-specific required fields (task, timing,
|
|
9
|
-
* stall, etc.) that aren't applicable in the server→executor code path. We
|
|
10
|
-
* cast through `as ExecutionContext` because the executors only access the
|
|
11
|
-
* subset of fields populated here. Phase B/E will migrate executors into the
|
|
12
|
-
* full lifecycle, after which this shim can be deleted.
|
|
13
|
-
*/
|
|
14
|
-
export declare function buildExecutionContext(deps: HandlerDeps, pc: ProjectContext, batchId: string, envelope: TaskEnvelopeStore, route?: string, caller?: {
|
|
15
|
-
client: string;
|
|
16
|
-
mainModel?: string | null;
|
|
17
|
-
}): ExecutionContext;
|
|
18
|
-
//# sourceMappingURL=execution-context.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"execution-context.d.ts","sourceRoot":"","sources":["../../src/http/execution-context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wDAAwD,CAAC;AAChG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAGxE;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,WAAW,EACjB,EAAE,EAAE,cAAc,EAClB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACrD,gBAAgB,CAkDlB"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { getRecorder } from '../telemetry/recorder.js';
|
|
2
|
-
/**
|
|
3
|
-
* Builds a canonical ExecutionContext for the async-dispatch → executor path.
|
|
4
|
-
*
|
|
5
|
-
* The canonical type carries lifecycle-specific required fields (task, timing,
|
|
6
|
-
* stall, etc.) that aren't applicable in the server→executor code path. We
|
|
7
|
-
* cast through `as ExecutionContext` because the executors only access the
|
|
8
|
-
* subset of fields populated here. Phase B/E will migrate executors into the
|
|
9
|
-
* full lifecycle, after which this shim can be deleted.
|
|
10
|
-
*/
|
|
11
|
-
export function buildExecutionContext(deps, pc, batchId, envelope, route, caller) {
|
|
12
|
-
const recordHeartbeat = (tick) => {
|
|
13
|
-
const effectiveBatchId = tick.batchId || batchId;
|
|
14
|
-
const entry = deps.batchRegistry.get(effectiveBatchId);
|
|
15
|
-
if (!entry)
|
|
16
|
-
return;
|
|
17
|
-
entry.lastHeartbeatAt = Date.now();
|
|
18
|
-
entry.running = [{ worker: tick.provider, turn: Math.max(1, tick.stageIndex) }];
|
|
19
|
-
// Record heartbeat to envelope — this triggers snapshot push with recomputed headline
|
|
20
|
-
envelope.recordHeartbeat({ stallIdleMs: 0 });
|
|
21
|
-
};
|
|
22
|
-
let recorder;
|
|
23
|
-
try {
|
|
24
|
-
recorder = getRecorder();
|
|
25
|
-
}
|
|
26
|
-
catch {
|
|
27
|
-
// Recorder not initialized — telemetry disabled
|
|
28
|
-
}
|
|
29
|
-
const now = Date.now();
|
|
30
|
-
return {
|
|
31
|
-
config: deps.config,
|
|
32
|
-
bus: deps.bus,
|
|
33
|
-
// Per-request X-MMA-Main-Model header is the only source. Enforced at
|
|
34
|
-
// the request-pipeline boundary (4.0.3+); by the time we reach this
|
|
35
|
-
// builder, caller.mainModel is guaranteed non-null for tool routes.
|
|
36
|
-
mainModel: caller?.mainModel ?? null,
|
|
37
|
-
route: route ?? '',
|
|
38
|
-
client: caller?.client ?? 'other',
|
|
39
|
-
batchId,
|
|
40
|
-
recordHeartbeat,
|
|
41
|
-
recorder,
|
|
42
|
-
projectContext: pc,
|
|
43
|
-
contextBlockStore: pc.contextBlocks,
|
|
44
|
-
// Thread the BatchRegistry so task-runner can attach this ctx for
|
|
45
|
-
// shutdown-drain visibility into in-flight tasks.
|
|
46
|
-
batchRegistry: deps.batchRegistry,
|
|
47
|
-
task: { prompt: '' },
|
|
48
|
-
taskIndex: 0,
|
|
49
|
-
cwd: pc.cwd,
|
|
50
|
-
assignedTier: 'standard',
|
|
51
|
-
implementerProvider: undefined,
|
|
52
|
-
providers: {},
|
|
53
|
-
timing: { startMs: now, timeoutMs: 0, deadlineMs: 0, stallTimeoutMs: 0 },
|
|
54
|
-
stall: { controller: new AbortController(), lastEventAtMs: now, fired: false },
|
|
55
|
-
implementerToolMode: undefined,
|
|
56
|
-
heartbeat: undefined,
|
|
57
|
-
outputTargets: [],
|
|
58
|
-
envelope,
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=execution-context.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"execution-context.js","sourceRoot":"","sources":["../../src/http/execution-context.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAiB,EACjB,EAAkB,EAClB,OAAe,EACf,QAA2B,EAC3B,KAAc,EACd,MAAsD;IAEtD,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,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAChF,sFAAsF;QACtF,QAAQ,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC;IAEF,IAAI,QAAkD,CAAC;IACvD,IAAI,CAAC;QACH,QAAQ,GAAG,WAAW,EAA6C,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,gDAAgD;IAClD,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,sEAAsE;QACtE,oEAAoE;QACpE,oEAAoE;QACpE,SAAS,EAAE,MAAM,EAAE,SAAS,IAAI,IAAI;QACpC,KAAK,EAAE,KAAK,IAAI,EAAE;QAClB,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,OAAO;QACjC,OAAO;QACP,eAAe;QACf,QAAQ;QACR,cAAc,EAAE,EAAE;QAClB,iBAAiB,EAAE,EAAE,CAAC,aAAa;QACnC,kEAAkE;QAClE,kDAAkD;QAClD,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACpB,SAAS,EAAE,CAAC;QACZ,GAAG,EAAE,EAAE,CAAC,GAAG;QACX,YAAY,EAAE,UAAU;QACxB,mBAAmB,EAAE,SAAS;QAC9B,SAAS,EAAE,EAAE;QACb,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE;QACxE,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,eAAe,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE;QAC9E,mBAAmB,EAAE,SAAS;QAC9B,SAAS,EAAE,SAAS;QACpB,aAAa,EAAE,EAAE;QACjB,QAAQ;KACsB,CAAC;AACnC,CAAC"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { MultiModelConfig } from '@zhixuan92/multi-model-agent-core';
|
|
2
|
-
import type { EnvelopeBus } from '@zhixuan92/multi-model-agent-core/events/envelope-bus';
|
|
3
|
-
import type { LogWriter } from '@zhixuan92/multi-model-agent-core/events/log-writer';
|
|
4
|
-
import type { ProjectRegistry } from './project-registry.js';
|
|
5
|
-
import type { BatchRegistry } from '@zhixuan92/multi-model-agent-core';
|
|
6
|
-
/**
|
|
7
|
-
* Dependencies injected into every handler factory at server startup.
|
|
8
|
-
* Built once; passed to buildDelegateHandler, buildAuditHandler, etc.
|
|
9
|
-
*/
|
|
10
|
-
export interface HandlerDeps {
|
|
11
|
-
/** Full multi-model config (agents + defaults). May be undefined in unit tests. */
|
|
12
|
-
config: MultiModelConfig;
|
|
13
|
-
logWriter: LogWriter;
|
|
14
|
-
/** EnvelopeBus for structured observability — emits envelope snapshots and plain log entries. */
|
|
15
|
-
bus: EnvelopeBus;
|
|
16
|
-
projectRegistry: ProjectRegistry;
|
|
17
|
-
batchRegistry: BatchRegistry;
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=handler-deps.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handler-deps.d.ts","sourceRoot":"","sources":["../../src/http/handler-deps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uDAAuD,CAAC;AACzF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qDAAqD,CAAC;AACrF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAEvE;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,mFAAmF;IACnF,MAAM,EAAE,gBAAgB,CAAC;IACzB,SAAS,EAAE,SAAS,CAAC;IACrB,iGAAiG;IACjG,GAAG,EAAE,WAAW,CAAC;IACjB,eAAe,EAAE,eAAe,CAAC;IACjC,aAAa,EAAE,aAAa,CAAC;CAC9B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handler-deps.js","sourceRoot":"","sources":["../../src/http/handler-deps.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"batch-slice.d.ts","sourceRoot":"","sources":["../../../../src/http/handlers/control/batch-slice.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAOjD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CAyCpE"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { sendError, sendJson } from '../../errors.js';
|
|
3
|
-
const inputSchema = z.object({
|
|
4
|
-
batchId: z.string(),
|
|
5
|
-
taskIndex: z.number().int().nonnegative(),
|
|
6
|
-
});
|
|
7
|
-
export function buildBatchSliceHandler(deps) {
|
|
8
|
-
return async (_req, res, _params, ctx) => {
|
|
9
|
-
const parsed = inputSchema.safeParse(ctx.body);
|
|
10
|
-
if (!parsed.success) {
|
|
11
|
-
sendError(res, 400, 'invalid_request', 'Request body validation failed', {
|
|
12
|
-
fieldErrors: parsed.error.flatten(),
|
|
13
|
-
});
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
const input = parsed.data;
|
|
17
|
-
const cwd = ctx.cwd;
|
|
18
|
-
const reserveResult = deps.projectRegistry.reserveProject(cwd);
|
|
19
|
-
if (!reserveResult.ok) {
|
|
20
|
-
sendError(res, 503, reserveResult.error, reserveResult.message);
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
const pc = reserveResult.projectContext;
|
|
24
|
-
pc.lastActivityAt = Date.now();
|
|
25
|
-
deps.projectRegistry.cancelReservation(cwd);
|
|
26
|
-
// T4: use the registry/delegate batchId directly as the cache key.
|
|
27
|
-
const entry = pc.batchCache.get(input.batchId);
|
|
28
|
-
if (!entry) {
|
|
29
|
-
sendError(res, 404, 'not_found', `Batch ${input.batchId} not found`);
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
const results = entry.results;
|
|
33
|
-
if (!Array.isArray(results) || input.taskIndex >= results.length) {
|
|
34
|
-
sendError(res, 404, 'unknown_task_index', `taskIndex ${input.taskIndex} is out of range (batch has ${Array.isArray(results) ? results.length : 0} result(s))`);
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
sendJson(res, 200, { batchId: input.batchId, result: results[input.taskIndex] });
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
//# sourceMappingURL=batch-slice.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"batch-slice.js","sourceRoot":"","sources":["../../../../src/http/handlers/control/batch-slice.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAItD,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;CAC1C,CAAC,CAAC;AAEH,MAAM,UAAU,sBAAsB,CAAC,IAAiB;IACtD,OAAO,KAAK,EAAE,IAAqB,EAAE,GAAmB,EAAE,OAA+B,EAAE,GAAG,EAAE,EAAE;QAChG,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,EAAE,gCAAgC,EAAE;gBACvE,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;aACpC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;QAC1B,MAAM,GAAG,GAAG,GAAG,CAAC,GAAI,CAAC;QACrB,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC/D,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;YACtB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QACD,MAAM,EAAE,GAAG,aAAa,CAAC,cAAc,CAAC;QACxC,EAAE,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/B,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAE5C,mEAAmE;QACnE,MAAM,KAAK,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACjE,SAAS,CACP,GAAG,EACH,GAAG,EACH,oBAAoB,EACpB,aAAa,KAAK,CAAC,SAAS,+BAA+B,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CACpH,CAAC;YACF,OAAO;QACT,CAAC;QAED,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type { RawHandler } from '../../types.js';
|
|
2
|
-
import { type BatchRegistry } from '@zhixuan92/multi-model-agent-core';
|
|
3
|
-
import type { TaskEnvelope } from '@zhixuan92/multi-model-agent-core/events/task-envelope';
|
|
4
|
-
export interface BatchHandlerDeps {
|
|
5
|
-
batchRegistry: BatchRegistry;
|
|
6
|
-
}
|
|
7
|
-
export declare function envelopeToPublicResult(env: TaskEnvelope): any;
|
|
8
|
-
/**
|
|
9
|
-
* GET /batch/:batchId — poll a batch.
|
|
10
|
-
*
|
|
11
|
-
* Status split (Theme 7):
|
|
12
|
-
* - pending → 202 text/plain — body is the runningHeadline
|
|
13
|
-
* - complete/failed/expired → 200 JSON uniform 7-field envelope
|
|
14
|
-
*
|
|
15
|
-
* Optional ?taskIndex=N slices `results` on a complete envelope.
|
|
16
|
-
*
|
|
17
|
-
* Errors:
|
|
18
|
-
* unknown batchId → 404 not_found
|
|
19
|
-
* non-numeric taskIndex → 400 invalid_task_index
|
|
20
|
-
* taskIndex ≥ results.len → 404 unknown_task_index
|
|
21
|
-
*/
|
|
22
|
-
export declare function buildBatchHandler(deps: BatchHandlerDeps): RawHandler;
|
|
23
|
-
//# sourceMappingURL=batch.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../../../src/http/handlers/control/batch.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAiB,KAAK,aAAa,EAAiB,MAAM,mCAAmC,CAAC;AACrG,OAAO,KAAK,EAAE,YAAY,EAAqB,MAAM,wDAAwD,CAAC;AAE9G,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,aAAa,CAAC;CAC9B;AAGD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,YAAY,OAgEvD;AAqBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,UAAU,CAwQpE"}
|