@zhixuan92/multi-model-agent 3.2.0 → 3.4.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 +62 -33
- package/dist/http/canonicalize-file-paths.d.ts +8 -0
- package/dist/http/canonicalize-file-paths.d.ts.map +1 -0
- package/dist/http/canonicalize-file-paths.js +43 -0
- package/dist/http/canonicalize-file-paths.js.map +1 -0
- package/dist/http/execution-context.d.ts.map +1 -1
- package/dist/http/execution-context.js +0 -14
- package/dist/http/execution-context.js.map +1 -1
- package/dist/http/handlers/control/batch-slice.d.ts +4 -0
- package/dist/http/handlers/control/batch-slice.d.ts.map +1 -0
- package/dist/http/handlers/control/batch-slice.js +40 -0
- package/dist/http/handlers/control/batch-slice.js.map +1 -0
- package/dist/http/handlers/control/retry.d.ts +4 -0
- package/dist/http/handlers/control/retry.d.ts.map +1 -0
- package/dist/http/handlers/control/retry.js +60 -0
- package/dist/http/handlers/control/retry.js.map +1 -0
- package/dist/http/handlers/tools/audit.d.ts.map +1 -1
- package/dist/http/handlers/tools/audit.js +2 -0
- package/dist/http/handlers/tools/audit.js.map +1 -1
- package/dist/http/handlers/tools/debug.d.ts.map +1 -1
- package/dist/http/handlers/tools/debug.js +2 -0
- package/dist/http/handlers/tools/debug.js.map +1 -1
- package/dist/http/handlers/tools/delegate.d.ts.map +1 -1
- package/dist/http/handlers/tools/delegate.js +2 -0
- package/dist/http/handlers/tools/delegate.js.map +1 -1
- package/dist/http/handlers/tools/execute-plan.d.ts.map +1 -1
- package/dist/http/handlers/tools/execute-plan.js +2 -0
- package/dist/http/handlers/tools/execute-plan.js.map +1 -1
- package/dist/http/handlers/tools/investigate.d.ts +4 -0
- package/dist/http/handlers/tools/investigate.d.ts.map +1 -0
- package/dist/http/handlers/tools/investigate.js +81 -0
- package/dist/http/handlers/tools/investigate.js.map +1 -0
- package/dist/http/handlers/tools/review.d.ts.map +1 -1
- package/dist/http/handlers/tools/review.js +2 -0
- package/dist/http/handlers/tools/review.js.map +1 -1
- package/dist/http/handlers/tools/verify.d.ts.map +1 -1
- package/dist/http/handlers/tools/verify.js +2 -0
- package/dist/http/handlers/tools/verify.js.map +1 -1
- package/dist/http/request-observability.d.ts +9 -0
- package/dist/http/request-observability.d.ts.map +1 -0
- package/dist/http/request-observability.js +36 -0
- package/dist/http/request-observability.js.map +1 -0
- package/dist/http/server.d.ts.map +1 -1
- package/dist/http/server.js +52 -11
- package/dist/http/server.js.map +1 -1
- package/dist/install/discover.d.ts +1 -1
- package/dist/install/discover.d.ts.map +1 -1
- package/dist/install/discover.js +1 -0
- package/dist/install/discover.js.map +1 -1
- package/dist/openapi.d.ts.map +1 -1
- package/dist/openapi.js +6 -0
- package/dist/openapi.js.map +1 -1
- package/dist/skills/_shared/verify-and-review.md +12 -0
- package/dist/skills/mma-audit/SKILL.md +45 -18
- package/dist/skills/mma-clarifications/SKILL.md +73 -29
- package/dist/skills/mma-context-blocks/SKILL.md +56 -24
- package/dist/skills/mma-debug/SKILL.md +54 -22
- package/dist/skills/mma-delegate/SKILL.md +59 -21
- package/dist/skills/mma-execute-plan/SKILL.md +56 -24
- package/dist/skills/mma-investigate/SKILL.md +137 -0
- package/dist/skills/mma-retry/SKILL.md +65 -22
- package/dist/skills/mma-review/SKILL.md +49 -20
- package/dist/skills/mma-verify/SKILL.md +49 -18
- package/dist/skills/multi-model-agent/SKILL.md +84 -46
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -12,36 +12,34 @@ Local HTTP service for delegating tool-using work to sub-agents on different LLM
|
|
|
12
12
|
- **Structural quality.** Implementation and review run on different agents — different training data, different blind spots. Cross-agent review catches what self-review can't.
|
|
13
13
|
- **Client-agnostic.** One daemon serves Claude Code, Gemini CLI, Codex CLI, and Cursor via installable skills. The daemon outlives any individual client session.
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
---
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
npm i -g @zhixuan92/multi-model-agent
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
Requires Node >= 22.
|
|
22
|
-
|
|
23
|
-
## Run
|
|
17
|
+
## Quick start
|
|
24
18
|
|
|
25
19
|
```bash
|
|
26
|
-
|
|
27
|
-
|
|
20
|
+
# 1. install
|
|
21
|
+
npm i -g @zhixuan92/multi-model-agent # requires Node ≥ 22
|
|
28
22
|
|
|
29
|
-
|
|
23
|
+
# 2. write a config (~/.multi-model/config.json) — see Configuration below
|
|
30
24
|
|
|
31
|
-
|
|
25
|
+
# 3. start the daemon
|
|
26
|
+
mmagent serve # 127.0.0.1:7337 by default
|
|
32
27
|
|
|
33
|
-
|
|
34
|
-
mmagent install-skill
|
|
35
|
-
mmagent install-skill --target=claude-code
|
|
36
|
-
|
|
37
|
-
|
|
28
|
+
# 4. install skills for your AI client (auto-detect or pick a target)
|
|
29
|
+
mmagent install-skill # all detected clients
|
|
30
|
+
mmagent install-skill --target=claude-code # or gemini / codex / cursor
|
|
31
|
+
|
|
32
|
+
# 5. verify
|
|
33
|
+
curl -s http://localhost:7337/health # → {"ok":true,"version":"3.4.0",...}
|
|
38
34
|
```
|
|
39
35
|
|
|
40
|
-
Skills are thin adapters that point
|
|
36
|
+
Skills are thin adapters that point your AI client at the running daemon. Once installed, the client has the full tool set with no further setup.
|
|
37
|
+
|
|
38
|
+
For a long-running background install, use a user service ([macOS launchd / Linux systemd templates](./scripts/README.md)).
|
|
41
39
|
|
|
42
|
-
##
|
|
40
|
+
## Configuration
|
|
43
41
|
|
|
44
|
-
Config file: `~/.multi-model/config.json`
|
|
42
|
+
Config file: `~/.multi-model/config.json`. Lookup order: `--config <path>` → `$MMAGENT_CONFIG` → `<cwd>/.multi-model-agent.json` → `~/.multi-model/config.json`.
|
|
45
43
|
|
|
46
44
|
```json
|
|
47
45
|
{
|
|
@@ -64,13 +62,11 @@ Config file: `~/.multi-model/config.json`
|
|
|
64
62
|
|
|
65
63
|
Agent types: `claude`, `codex`, `openai-compatible`. Any OpenAI-compatible endpoint works (MiniMax, DeepSeek, Groq, Together, local vLLM) — set `baseUrl` and either `apiKey` or `apiKeyEnv`.
|
|
66
64
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
The auth token is generated on first `mmagent serve`. Retrieve it with `mmagent print-token`, or set `MMAGENT_AUTH_TOKEN` in your environment to override the file.
|
|
65
|
+
The auth token is generated on first `mmagent serve`. Retrieve it with `mmagent print-token`, or set `MMAGENT_AUTH_TOKEN` to override the file.
|
|
70
66
|
|
|
71
67
|
## REST API
|
|
72
68
|
|
|
73
|
-
|
|
69
|
+
15 endpoints. All tool endpoints are async: they return `202 { batchId, statusUrl }` immediately and the executor runs in the background. Poll `GET /batch/:id` for the terminal envelope.
|
|
74
70
|
|
|
75
71
|
| Endpoint | Purpose |
|
|
76
72
|
|---|---|
|
|
@@ -81,6 +77,7 @@ The daemon exposes 14 public endpoints. All tool endpoints are async: they retur
|
|
|
81
77
|
| `POST /debug?cwd=<abs>` | Debug a failure with a hypothesis |
|
|
82
78
|
| `POST /execute-plan?cwd=<abs>` | Implement from a plan file |
|
|
83
79
|
| `POST /retry?cwd=<abs>` | Re-run specific tasks from a previous batch |
|
|
80
|
+
| `POST /investigate?cwd=<abs>` | Codebase Q&A — structured answer with file:line citations + confidence |
|
|
84
81
|
| `GET /batch/:id[?taskIndex=N]` | Poll a batch: `202 text/plain` (pending; body is the running headline) or `200 application/json` (terminal; uniform 7-field envelope). `?taskIndex=N` slices on complete state. |
|
|
85
82
|
| `POST /context-blocks?cwd=<abs>` | Register a reusable context block |
|
|
86
83
|
| `DELETE /context-blocks/:id?cwd=<abs>` | Delete a context block |
|
|
@@ -94,14 +91,13 @@ All tool endpoints require bearer auth: `Authorization: Bearer <token>`.
|
|
|
94
91
|
## Operator commands
|
|
95
92
|
|
|
96
93
|
```bash
|
|
97
|
-
mmagent serve [--verbose] [--log]
|
|
98
|
-
mmagent info
|
|
99
|
-
mmagent status [--json]
|
|
100
|
-
mmagent logs
|
|
101
|
-
mmagent print-token
|
|
102
|
-
mmagent install-skill
|
|
103
|
-
mmagent
|
|
104
|
-
mmagent update-skills [--dry-run] [--json] # refresh installed skills from the shipped bundle
|
|
94
|
+
mmagent serve [--verbose] [--log] # start daemon (--verbose → stderr events; --log → JSONL to ~/.multi-model/logs/)
|
|
95
|
+
mmagent info [--json] # cliVersion, bind/port, token fingerprint, daemon identity (offline)
|
|
96
|
+
mmagent status [--json] # health + stats from a running daemon
|
|
97
|
+
mmagent logs [--follow] [--batch=<id>] # tail today's diagnostic log
|
|
98
|
+
mmagent print-token # print the current auth token
|
|
99
|
+
mmagent install-skill [--target=<client>] [--all-targets] [--uninstall] # default installs all shipped skills
|
|
100
|
+
mmagent update-skills [--dry-run] [--json] # refresh installed skills after upgrade
|
|
105
101
|
```
|
|
106
102
|
|
|
107
103
|
## Shipped skills
|
|
@@ -110,7 +106,7 @@ Skills are Markdown prompts that tell your AI client when and how to call each e
|
|
|
110
106
|
|
|
111
107
|
| Skill | Target endpoint |
|
|
112
108
|
|---|---|
|
|
113
|
-
| `multi-model-agent` | Overview + skill map |
|
|
109
|
+
| `multi-model-agent` | Overview + skill map (read first to pick the right `mma-*` skill) |
|
|
114
110
|
| `mma-delegate` | `POST /delegate` |
|
|
115
111
|
| `mma-audit` | `POST /audit` |
|
|
116
112
|
| `mma-review` | `POST /review` |
|
|
@@ -118,9 +114,42 @@ Skills are Markdown prompts that tell your AI client when and how to call each e
|
|
|
118
114
|
| `mma-debug` | `POST /debug` |
|
|
119
115
|
| `mma-execute-plan` | `POST /execute-plan` |
|
|
120
116
|
| `mma-retry` | `POST /retry` |
|
|
117
|
+
| `mma-investigate` | `POST /investigate` |
|
|
121
118
|
| `mma-context-blocks` | `POST/DELETE /context-blocks` |
|
|
122
119
|
| `mma-clarifications` | `POST /clarifications/confirm` |
|
|
123
120
|
|
|
121
|
+
## Operations
|
|
122
|
+
|
|
123
|
+
### Upgrading
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
npm install -g @zhixuan92/multi-model-agent@latest
|
|
127
|
+
pkill -f "mmagent serve" # stop the running daemon
|
|
128
|
+
mmagent update-skills # refresh installed skills
|
|
129
|
+
# next AI-client session respawns the daemon via the skill preflight
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
A drift warning prints on `mmagent serve` if installed skills are older than the daemon.
|
|
133
|
+
|
|
134
|
+
### Verbose mode
|
|
135
|
+
|
|
136
|
+
Enable per-run via `mmagent serve --verbose --log`, or persist in config:
|
|
137
|
+
|
|
138
|
+
```json
|
|
139
|
+
{ "diagnostics": { "log": true, "verbose": true } }
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
JSONL goes to `~/.multi-model/logs/mmagent-<date>.jsonl`. Large request bodies (over 16 KB UTF-8) spill to `~/.multi-model/logs/requests/<batchId>.json`. **Note:** request bodies may include prompts and file paths — disable `verbose` for production servers handling sensitive data.
|
|
143
|
+
|
|
144
|
+
### Troubleshooting
|
|
145
|
+
|
|
146
|
+
| Symptom | Fix |
|
|
147
|
+
|---|---|
|
|
148
|
+
| Port 7337 already in use | `lsof -nP -i :7337` → kill the stale process |
|
|
149
|
+
| Daemon stale after upgrade | `pkill -f "mmagent serve"`; preflight respawns |
|
|
150
|
+
| Skill version mismatch | `mmagent update-skills` and restart your client |
|
|
151
|
+
| `401 unauthorized` from a skill | `export MMAGENT_AUTH_TOKEN=$(mmagent print-token)` |
|
|
152
|
+
|
|
124
153
|
## Architecture at a glance
|
|
125
154
|
|
|
126
155
|
`mmagent serve` runs a loopback HTTP server. Each tool call dispatches to a labor agent (standard or complex), runs a cross-agent review cycle, and returns a structured report. Tasks run in parallel; each has a cost ceiling and wall-clock timeout.
|
|
@@ -0,0 +1,8 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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 +1 @@
|
|
|
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;AAE3F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mDAAmD,CAAC;AAC1F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,WAAW,EACjB,EAAE,EAAE,cAAc,EAClB,OAAO,EAAE,MAAM,GACd,gBAAgB,
|
|
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;AAE3F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mDAAmD,CAAC;AAC1F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,WAAW,EACjB,EAAE,EAAE,cAAc,EAClB,OAAO,EAAE,MAAM,GACd,gBAAgB,CAsClB"}
|
|
@@ -36,20 +36,6 @@ export function buildExecutionContext(deps, pc, batchId) {
|
|
|
36
36
|
running: entry.running,
|
|
37
37
|
});
|
|
38
38
|
deps.batchRegistry.updateRunningHeadline(effectiveBatchId, headline);
|
|
39
|
-
deps.logger.taskHeartbeat({
|
|
40
|
-
batchId: effectiveBatchId,
|
|
41
|
-
taskIndex: 0,
|
|
42
|
-
elapsedMs: tick.elapsedMs,
|
|
43
|
-
stage: tick.stage,
|
|
44
|
-
});
|
|
45
|
-
if (tick.phaseChange !== undefined) {
|
|
46
|
-
deps.logger.taskPhaseChange({
|
|
47
|
-
batchId: effectiveBatchId,
|
|
48
|
-
taskIndex: 0,
|
|
49
|
-
fromStage: tick.phaseChange.from,
|
|
50
|
-
toStage: tick.phaseChange.to,
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
39
|
};
|
|
54
40
|
return buildCoreExecutionContext({
|
|
55
41
|
projectContext: pc,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-context.js","sourceRoot":"","sources":["../../src/http/execution-context.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAE3E,OAAO,EAAE,qBAAqB,IAAI,yBAAyB,EAAE,MAAM,+DAA+D,CAAC;AAInI;;;;;;GAMG;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,6DAA6D;QAC7D,mEAAmE;QACnE,6DAA6D;QAC7D,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,kEAAkE;QAClE,kEAAkE;QAClE,mEAAmE;QACnE,iDAAiD;QACjD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,UAAU,IAAI,CAAC;YAC9B,CAAC,CAAC,IAAI,CAAC,QAAQ;YACf,CAAC,CAAC,sBAAsB,CAAC;gBACrB,UAAU;gBACV,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC;gBACrC,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,CAAC;gBACzC,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE;gBACjB,eAAe,EAAE,KAAK,CAAC,eAAe;gBACtC,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;QACP,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"execution-context.js","sourceRoot":"","sources":["../../src/http/execution-context.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAE3E,OAAO,EAAE,qBAAqB,IAAI,yBAAyB,EAAE,MAAM,+DAA+D,CAAC;AAInI;;;;;;GAMG;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,6DAA6D;QAC7D,mEAAmE;QACnE,6DAA6D;QAC7D,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,kEAAkE;QAClE,kEAAkE;QAClE,mEAAmE;QACnE,iDAAiD;QACjD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,UAAU,IAAI,CAAC;YAC9B,CAAC,CAAC,IAAI,CAAC,QAAQ;YACf,CAAC,CAAC,sBAAsB,CAAC;gBACrB,UAAU;gBACV,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC;gBACrC,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,CAAC;gBACzC,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE;gBACjB,eAAe,EAAE,KAAK,CAAC,eAAe;gBACtC,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;QACP,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;IACvE,CAAC,CAAC;IAEF,OAAO,yBAAyB,CAAC;QAC/B,cAAc,EAAE,EAAE;QAClB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,iBAAiB,EAAE,EAAE,CAAC,aAAa;QACnC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAC7C,OAAO;QACP,eAAe;KAChB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
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,iBAAiB,CAAC;AAOlD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CAyCpE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../../src/http/handlers/control/retry.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAgBlD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CA+C/D"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import * as retry from '@zhixuan92/multi-model-agent-core/tool-schemas/retry';
|
|
2
|
+
import { executeRetry } from '@zhixuan92/multi-model-agent-core/executors/retry';
|
|
3
|
+
import { sendError, sendJson } from '../../errors.js';
|
|
4
|
+
import { asyncDispatch } from '../../async-dispatch.js';
|
|
5
|
+
/** Same inject-defaults logic as delegate — fills harness fields from config. */
|
|
6
|
+
function makeInjectDefaults(config, cwd) {
|
|
7
|
+
return (tasks) => tasks.map(t => ({
|
|
8
|
+
...t,
|
|
9
|
+
cwd: t.cwd ?? cwd,
|
|
10
|
+
tools: t.tools ?? config.defaults?.tools ?? 'full',
|
|
11
|
+
timeoutMs: t.timeoutMs ?? config.defaults?.timeoutMs ?? 1_800_000,
|
|
12
|
+
maxCostUSD: t.maxCostUSD ?? config.defaults?.maxCostUSD ?? 10,
|
|
13
|
+
sandboxPolicy: t.sandboxPolicy ?? config.defaults?.sandboxPolicy ?? 'cwd-only',
|
|
14
|
+
parentModel: t.parentModel ?? config.defaults?.parentModel ?? process.env['PARENT_MODEL_NAME'],
|
|
15
|
+
}));
|
|
16
|
+
}
|
|
17
|
+
export function buildRetryHandler(deps) {
|
|
18
|
+
return async (_req, res, _params, ctx) => {
|
|
19
|
+
const parsed = retry.inputSchema.safeParse(ctx.body);
|
|
20
|
+
if (!parsed.success) {
|
|
21
|
+
sendError(res, 400, 'invalid_request', 'Request body validation failed', {
|
|
22
|
+
fieldErrors: parsed.error.flatten(),
|
|
23
|
+
});
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const input = parsed.data;
|
|
27
|
+
const cwd = ctx.cwd;
|
|
28
|
+
const reserveResult = deps.projectRegistry.reserveProject(cwd);
|
|
29
|
+
if (!reserveResult.ok) {
|
|
30
|
+
sendError(res, 503, reserveResult.error, reserveResult.message);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const pc = reserveResult.projectContext;
|
|
34
|
+
pc.lastActivityAt = Date.now();
|
|
35
|
+
deps.projectRegistry.cancelReservation(cwd);
|
|
36
|
+
// T4: the protocol exposes one batchId namespace. Validate the exact
|
|
37
|
+
// registry/delegate id directly in the per-project cache; do not remap via
|
|
38
|
+
// a terminal envelope's embedded batchId.
|
|
39
|
+
const entry = pc.batchCache.get(input.batchId);
|
|
40
|
+
if (!entry) {
|
|
41
|
+
sendError(res, 404, 'not_found', `Batch ${input.batchId} not found`);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const { batchId, statusUrl } = asyncDispatch({
|
|
45
|
+
tool: 'retry',
|
|
46
|
+
projectCwd: cwd,
|
|
47
|
+
blockIds: [],
|
|
48
|
+
batchRegistry: deps.batchRegistry,
|
|
49
|
+
projectContext: pc,
|
|
50
|
+
deps,
|
|
51
|
+
executor: async (executionCtx) => {
|
|
52
|
+
return executeRetry(executionCtx, input, {
|
|
53
|
+
injectDefaults: makeInjectDefaults(deps.config, cwd),
|
|
54
|
+
});
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
sendJson(res, 202, { batchId, statusUrl });
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../../src/http/handlers/control/retry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,sDAAsD,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,mDAAmD,CAAC;AAEjF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAIxD,iFAAiF;AACjF,SAAS,kBAAkB,CAAC,MAAwB,EAAE,GAAW;IAC/D,OAAO,CAAC,KAAiB,EAAE,EAAE,CAC3B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACd,GAAG,CAAC;QACJ,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG;QACjB,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,KAAK,IAAI,MAAM;QAClD,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,QAAQ,EAAE,SAAS,IAAI,SAAS;QACjE,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,EAAE,UAAU,IAAI,EAAE;QAC7D,aAAa,EAAE,CAAC,CAAC,aAAa,IAAI,MAAM,CAAC,QAAQ,EAAE,aAAa,IAAI,UAAU;QAC9E,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,MAAM,CAAC,QAAQ,EAAE,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;KAC/F,CAAC,CAAC,CAAC;AACR,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAiB;IACjD,OAAO,KAAK,EAAE,IAAqB,EAAE,GAAmB,EAAE,OAA+B,EAAE,GAAG,EAAE,EAAE;QAChG,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrD,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;QAErB,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,qEAAqE;QACrE,2EAA2E;QAC3E,0CAA0C;QAC1C,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,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,aAAa,CAAC;YAC3C,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,GAAG;YACf,QAAQ,EAAE,EAAE;YACZ,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,cAAc,EAAE,EAAE;YAClB,IAAI;YACJ,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE;gBAC/B,OAAO,YAAY,CAAC,YAAY,EAAE,KAAK,EAAE;oBACvC,cAAc,EAAE,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;iBACrD,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;QAEH,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../../src/http/handlers/tools/audit.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../../src/http/handlers/tools/audit.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CAuC/D"}
|
|
@@ -2,6 +2,7 @@ import * as audit from '@zhixuan92/multi-model-agent-core/tool-schemas/audit';
|
|
|
2
2
|
import { executeAudit } from '@zhixuan92/multi-model-agent-core/executors/audit';
|
|
3
3
|
import { sendError, sendJson } from '../../errors.js';
|
|
4
4
|
import { asyncDispatch } from '../../async-dispatch.js';
|
|
5
|
+
import { emitRequestReceived } from '../../request-observability.js';
|
|
5
6
|
export function buildAuditHandler(deps) {
|
|
6
7
|
return async (_req, res, _params, ctx) => {
|
|
7
8
|
const parsed = audit.inputSchema.safeParse(ctx.body);
|
|
@@ -33,6 +34,7 @@ export function buildAuditHandler(deps) {
|
|
|
33
34
|
return executeAudit(executionCtx, input);
|
|
34
35
|
},
|
|
35
36
|
});
|
|
37
|
+
await emitRequestReceived({ config: deps.config, batchId, route: _req.url ?? '', parsed: input });
|
|
36
38
|
sendJson(res, 202, { batchId, statusUrl });
|
|
37
39
|
};
|
|
38
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../../src/http/handlers/tools/audit.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,sDAAsD,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,mDAAmD,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../../src/http/handlers/tools/audit.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,sDAAsD,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,mDAAmD,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAGrE,MAAM,UAAU,iBAAiB,CAAC,IAAiB;IACjD,OAAO,KAAK,EAAE,IAAqB,EAAE,GAAmB,EAAE,OAA+B,EAAE,GAAG,EAAE,EAAE;QAChG,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrD,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;QAErB,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,MAAM,QAAQ,GAAG,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC;QAC7C,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,aAAa,CAAC;YAC3C,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,GAAG;YACf,QAAQ;YACR,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,cAAc,EAAE,EAAE;YAClB,IAAI;YACJ,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE;gBAC/B,OAAO,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YAC3C,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,mBAAmB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAElG,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../../../src/http/handlers/tools/debug.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../../../src/http/handlers/tools/debug.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CAuC/D"}
|
|
@@ -2,6 +2,7 @@ import * as debug from '@zhixuan92/multi-model-agent-core/tool-schemas/debug';
|
|
|
2
2
|
import { executeDebug } from '@zhixuan92/multi-model-agent-core/executors/debug';
|
|
3
3
|
import { sendError, sendJson } from '../../errors.js';
|
|
4
4
|
import { asyncDispatch } from '../../async-dispatch.js';
|
|
5
|
+
import { emitRequestReceived } from '../../request-observability.js';
|
|
5
6
|
export function buildDebugHandler(deps) {
|
|
6
7
|
return async (_req, res, _params, ctx) => {
|
|
7
8
|
const parsed = debug.inputSchema.safeParse(ctx.body);
|
|
@@ -33,6 +34,7 @@ export function buildDebugHandler(deps) {
|
|
|
33
34
|
return executeDebug(executionCtx, input);
|
|
34
35
|
},
|
|
35
36
|
});
|
|
37
|
+
await emitRequestReceived({ config: deps.config, batchId, route: _req.url ?? '', parsed: input });
|
|
36
38
|
sendJson(res, 202, { batchId, statusUrl });
|
|
37
39
|
};
|
|
38
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../../../src/http/handlers/tools/debug.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,sDAAsD,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,mDAAmD,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../../../src/http/handlers/tools/debug.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,sDAAsD,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,mDAAmD,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAGrE,MAAM,UAAU,iBAAiB,CAAC,IAAiB;IACjD,OAAO,KAAK,EAAE,IAAqB,EAAE,GAAmB,EAAE,OAA+B,EAAE,GAAG,EAAE,EAAE;QAChG,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrD,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;QAErB,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,MAAM,QAAQ,GAAG,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC;QAC7C,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,aAAa,CAAC;YAC3C,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,GAAG;YACf,QAAQ;YACR,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,cAAc,EAAE,EAAE;YAClB,IAAI;YACJ,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE;gBAC/B,OAAO,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YAC3C,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,mBAAmB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAElG,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delegate.d.ts","sourceRoot":"","sources":["../../../../src/http/handlers/tools/delegate.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"delegate.d.ts","sourceRoot":"","sources":["../../../../src/http/handlers/tools/delegate.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAgBlD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CA6ClE"}
|
|
@@ -2,6 +2,7 @@ import * as delegate from '@zhixuan92/multi-model-agent-core/tool-schemas/delega
|
|
|
2
2
|
import { executeDelegate } from '@zhixuan92/multi-model-agent-core/executors/delegate';
|
|
3
3
|
import { sendError, sendJson } from '../../errors.js';
|
|
4
4
|
import { asyncDispatch } from '../../async-dispatch.js';
|
|
5
|
+
import { emitRequestReceived } from '../../request-observability.js';
|
|
5
6
|
/** Builds injectDefaults for delegate/retry — fills harness-level TaskSpec fields from config. */
|
|
6
7
|
function makeInjectDefaults(config, cwd) {
|
|
7
8
|
return (tasks) => tasks.map(t => ({
|
|
@@ -51,6 +52,7 @@ export function buildDelegateHandler(deps) {
|
|
|
51
52
|
});
|
|
52
53
|
},
|
|
53
54
|
});
|
|
55
|
+
await emitRequestReceived({ config: deps.config, batchId, route: _req.url ?? '', parsed: input });
|
|
54
56
|
sendJson(res, 202, { batchId, statusUrl });
|
|
55
57
|
};
|
|
56
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delegate.js","sourceRoot":"","sources":["../../../../src/http/handlers/tools/delegate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,MAAM,yDAAyD,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,sDAAsD,CAAC;AAEvF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"delegate.js","sourceRoot":"","sources":["../../../../src/http/handlers/tools/delegate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute-plan.d.ts","sourceRoot":"","sources":["../../../../src/http/handlers/tools/execute-plan.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"execute-plan.d.ts","sourceRoot":"","sources":["../../../../src/http/handlers/tools/execute-plan.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CAuCrE"}
|
|
@@ -2,6 +2,7 @@ import * as executePlan from '@zhixuan92/multi-model-agent-core/tool-schemas/exe
|
|
|
2
2
|
import { executeExecutePlan } from '@zhixuan92/multi-model-agent-core/executors/execute-plan';
|
|
3
3
|
import { sendError, sendJson } from '../../errors.js';
|
|
4
4
|
import { asyncDispatch } from '../../async-dispatch.js';
|
|
5
|
+
import { emitRequestReceived } from '../../request-observability.js';
|
|
5
6
|
export function buildExecutePlanHandler(deps) {
|
|
6
7
|
return async (_req, res, _params, ctx) => {
|
|
7
8
|
const parsed = executePlan.inputSchema.safeParse(ctx.body);
|
|
@@ -33,6 +34,7 @@ export function buildExecutePlanHandler(deps) {
|
|
|
33
34
|
return executeExecutePlan(executionCtx, input);
|
|
34
35
|
},
|
|
35
36
|
});
|
|
37
|
+
await emitRequestReceived({ config: deps.config, batchId, route: _req.url ?? '', parsed: input });
|
|
36
38
|
sendJson(res, 202, { batchId, statusUrl });
|
|
37
39
|
};
|
|
38
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute-plan.js","sourceRoot":"","sources":["../../../../src/http/handlers/tools/execute-plan.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,WAAW,MAAM,6DAA6D,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,0DAA0D,CAAC;AAC9F,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"execute-plan.js","sourceRoot":"","sources":["../../../../src/http/handlers/tools/execute-plan.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,WAAW,MAAM,6DAA6D,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,0DAA0D,CAAC;AAC9F,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAGrE,MAAM,UAAU,uBAAuB,CAAC,IAAiB;IACvD,OAAO,KAAK,EAAE,IAAqB,EAAE,GAAmB,EAAE,OAA+B,EAAE,GAAG,EAAE,EAAE;QAChG,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3D,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;QAErB,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,MAAM,QAAQ,GAAG,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC;QAC7C,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,aAAa,CAAC;YAC3C,IAAI,EAAE,cAAc;YACpB,UAAU,EAAE,GAAG;YACf,QAAQ;YACR,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,cAAc,EAAE,EAAE;YAClB,IAAI;YACJ,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE;gBAC/B,OAAO,kBAAkB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YACjD,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,mBAAmB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAElG,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"investigate.d.ts","sourceRoot":"","sources":["../../../../src/http/handlers/tools/investigate.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGlD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CA2ErE"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// packages/server/src/http/handlers/tools/investigate.ts
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { realpathSync } from 'node:fs';
|
|
4
|
+
import * as investigate from '@zhixuan92/multi-model-agent-core/tool-schemas/investigate';
|
|
5
|
+
import { executeInvestigate } from '@zhixuan92/multi-model-agent-core/executors/investigate';
|
|
6
|
+
import { sendError, sendJson } from '../../errors.js';
|
|
7
|
+
import { asyncDispatch } from '../../async-dispatch.js';
|
|
8
|
+
import { emitRequestReceived } from '../../request-observability.js';
|
|
9
|
+
import { canonicalizeFilePaths } from '../../canonicalize-file-paths.js';
|
|
10
|
+
export function buildInvestigateHandler(deps) {
|
|
11
|
+
return async (req, res, _params, ctx) => {
|
|
12
|
+
// Step 1: schema.
|
|
13
|
+
const parsed = investigate.inputSchema.safeParse(ctx.body);
|
|
14
|
+
if (!parsed.success) {
|
|
15
|
+
sendError(res, 400, 'invalid_request', 'Request body validation failed', {
|
|
16
|
+
fieldErrors: parsed.error.flatten(),
|
|
17
|
+
});
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const input = parsed.data;
|
|
21
|
+
const cwd = ctx.cwd;
|
|
22
|
+
// Step 2: reservation lifecycle (mirrors audit.ts; reservation is just a cwd-validity gate).
|
|
23
|
+
const reserveResult = deps.projectRegistry.reserveProject(cwd);
|
|
24
|
+
if (!reserveResult.ok) {
|
|
25
|
+
sendError(res, 503, reserveResult.error, reserveResult.message);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const pc = reserveResult.projectContext;
|
|
29
|
+
pc.lastActivityAt = Date.now();
|
|
30
|
+
deps.projectRegistry.cancelReservation(cwd);
|
|
31
|
+
// Step 3: synchronously resolve context blocks.
|
|
32
|
+
const blockIds = input.contextBlockIds ?? [];
|
|
33
|
+
const resolvedContextBlocks = [];
|
|
34
|
+
const missingBlocks = [];
|
|
35
|
+
for (const id of blockIds) {
|
|
36
|
+
const content = pc.contextBlocks.get(id);
|
|
37
|
+
if (content === undefined) {
|
|
38
|
+
missingBlocks.push(id);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
resolvedContextBlocks.push({ id, content });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (missingBlocks.length > 0) {
|
|
45
|
+
sendError(res, 400, 'context_block_not_found', 'one or more context block IDs do not exist', { missingBlocks });
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
// Step 4: synchronously canonicalize filePaths.
|
|
49
|
+
const rawPaths = input.filePaths ?? [];
|
|
50
|
+
const canonResult = canonicalizeFilePaths(rawPaths, cwd);
|
|
51
|
+
if (!Array.isArray(canonResult)) {
|
|
52
|
+
sendError(res, 400, 'invalid_request', 'one or more filePaths escape cwd', { fieldErrors: canonResult.fieldErrors });
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const canonicalizedFilePaths = canonResult;
|
|
56
|
+
// Step 5: precompute relative-for-prompt paths so the compiler stays pure.
|
|
57
|
+
const realCwd = realpathSync(cwd);
|
|
58
|
+
const relativeFilePathsForPrompt = canonicalizedFilePaths.map(p => {
|
|
59
|
+
const rel = path.relative(realCwd, p);
|
|
60
|
+
return rel === '' ? '.' : rel;
|
|
61
|
+
});
|
|
62
|
+
// Step 6: dispatch.
|
|
63
|
+
const { batchId, statusUrl } = asyncDispatch({
|
|
64
|
+
tool: 'investigate',
|
|
65
|
+
projectCwd: cwd,
|
|
66
|
+
blockIds,
|
|
67
|
+
batchRegistry: deps.batchRegistry,
|
|
68
|
+
projectContext: pc,
|
|
69
|
+
deps,
|
|
70
|
+
executor: async (executionCtx) => executeInvestigate(executionCtx, {
|
|
71
|
+
input,
|
|
72
|
+
resolvedContextBlocks,
|
|
73
|
+
canonicalizedFilePaths,
|
|
74
|
+
relativeFilePathsForPrompt,
|
|
75
|
+
}),
|
|
76
|
+
});
|
|
77
|
+
await emitRequestReceived({ config: deps.config, batchId, route: req.url ?? '', parsed: input });
|
|
78
|
+
sendJson(res, 202, { batchId, statusUrl });
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=investigate.js.map
|