harness-dispatch 0.4.0 → 0.6.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/CHANGELOG.md +152 -0
- package/README.md +232 -87
- package/config.default.yaml +416 -397
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +2 -2
- package/dist/auth.js.map +1 -1
- package/dist/billing.d.ts +35 -4
- package/dist/billing.d.ts.map +1 -1
- package/dist/billing.js +48 -17
- package/dist/billing.js.map +1 -1
- package/dist/bin.d.ts.map +1 -1
- package/dist/bin.js +147 -91
- package/dist/bin.js.map +1 -1
- package/dist/breaker-store.d.ts +60 -9
- package/dist/breaker-store.d.ts.map +1 -1
- package/dist/breaker-store.js +246 -50
- package/dist/breaker-store.js.map +1 -1
- package/dist/circuit-breaker.d.ts +35 -0
- package/dist/circuit-breaker.d.ts.map +1 -1
- package/dist/circuit-breaker.js +68 -11
- package/dist/circuit-breaker.js.map +1 -1
- package/dist/config/coercions.d.ts +31 -0
- package/dist/config/coercions.d.ts.map +1 -0
- package/dist/config/coercions.js +169 -0
- package/dist/config/coercions.js.map +1 -0
- package/dist/config/env-interpolation.d.ts +36 -0
- package/dist/config/env-interpolation.d.ts.map +1 -0
- package/dist/config/env-interpolation.js +73 -0
- package/dist/config/env-interpolation.js.map +1 -0
- package/dist/config/protocol.d.ts +51 -0
- package/dist/config/protocol.d.ts.map +1 -0
- package/dist/config/protocol.js +300 -0
- package/dist/config/protocol.js.map +1 -0
- package/dist/config/route-fields.d.ts +72 -0
- package/dist/config/route-fields.d.ts.map +1 -0
- package/dist/config/route-fields.js +128 -0
- package/dist/config/route-fields.js.map +1 -0
- package/dist/config/validation.d.ts +72 -0
- package/dist/config/validation.d.ts.map +1 -0
- package/dist/config/validation.js +189 -0
- package/dist/config/validation.js.map +1 -0
- package/dist/config.d.ts +19 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +214 -635
- package/dist/config.js.map +1 -1
- package/dist/configure-yaml.d.ts +23 -0
- package/dist/configure-yaml.d.ts.map +1 -0
- package/dist/configure-yaml.js +193 -0
- package/dist/configure-yaml.js.map +1 -0
- package/dist/dispatch-log.d.ts.map +1 -1
- package/dist/dispatch-log.js +2 -3
- package/dist/dispatch-log.js.map +1 -1
- package/dist/dispatchers/base.d.ts +3 -0
- package/dist/dispatchers/base.d.ts.map +1 -1
- package/dist/dispatchers/base.js.map +1 -1
- package/dist/dispatchers/generic-cli.d.ts +15 -1
- package/dist/dispatchers/generic-cli.d.ts.map +1 -1
- package/dist/dispatchers/generic-cli.js +69 -5
- package/dist/dispatchers/generic-cli.js.map +1 -1
- package/dist/dispatchers/openai-compatible.d.ts.map +1 -1
- package/dist/dispatchers/openai-compatible.js +70 -2
- package/dist/dispatchers/openai-compatible.js.map +1 -1
- package/dist/dispatchers/shared/kill-tree.d.ts +17 -4
- package/dist/dispatchers/shared/kill-tree.d.ts.map +1 -1
- package/dist/dispatchers/shared/kill-tree.js +28 -4
- package/dist/dispatchers/shared/kill-tree.js.map +1 -1
- package/dist/dispatchers/shared/rate-limit-headers.d.ts +17 -0
- package/dist/dispatchers/shared/rate-limit-headers.d.ts.map +1 -1
- package/dist/dispatchers/shared/rate-limit-headers.js +27 -0
- package/dist/dispatchers/shared/rate-limit-headers.js.map +1 -1
- package/dist/dispatchers/shared/stream-subprocess.d.ts +11 -0
- package/dist/dispatchers/shared/stream-subprocess.d.ts.map +1 -1
- package/dist/dispatchers/shared/stream-subprocess.js +62 -35
- package/dist/dispatchers/shared/stream-subprocess.js.map +1 -1
- package/dist/dispatchers/shared/subprocess.d.ts.map +1 -1
- package/dist/dispatchers/shared/subprocess.js +3 -0
- package/dist/dispatchers/shared/subprocess.js.map +1 -1
- package/dist/dispatchers/shared/which-available.d.ts.map +1 -1
- package/dist/dispatchers/shared/which-available.js +16 -2
- package/dist/dispatchers/shared/which-available.js.map +1 -1
- package/dist/file-lock.d.ts +17 -0
- package/dist/file-lock.d.ts.map +1 -0
- package/dist/file-lock.js +143 -0
- package/dist/file-lock.js.map +1 -0
- package/dist/http/parse.d.ts +64 -0
- package/dist/http/parse.d.ts.map +1 -0
- package/dist/http/parse.js +230 -0
- package/dist/http/parse.js.map +1 -0
- package/dist/http/server.d.ts +2 -0
- package/dist/http/server.d.ts.map +1 -1
- package/dist/http/server.js +249 -286
- package/dist/http/server.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/job-runner.js +23 -5
- package/dist/job-runner.js.map +1 -1
- package/dist/jobs/context.d.ts +17 -0
- package/dist/jobs/context.d.ts.map +1 -0
- package/dist/jobs/context.js +84 -0
- package/dist/jobs/context.js.map +1 -0
- package/dist/jobs/store.d.ts +80 -0
- package/dist/jobs/store.d.ts.map +1 -0
- package/dist/jobs/store.js +279 -0
- package/dist/jobs/store.js.map +1 -0
- package/dist/jobs/types.d.ts +135 -0
- package/dist/jobs/types.d.ts.map +1 -0
- package/dist/jobs/types.js +11 -0
- package/dist/jobs/types.js.map +1 -0
- package/dist/jobs.d.ts +165 -85
- package/dist/jobs.d.ts.map +1 -1
- package/dist/jobs.js +824 -208
- package/dist/jobs.js.map +1 -1
- package/dist/leaderboard.d.ts +24 -1
- package/dist/leaderboard.d.ts.map +1 -1
- package/dist/leaderboard.js +94 -2
- package/dist/leaderboard.js.map +1 -1
- package/dist/mcp/config-hot-reload.d.ts.map +1 -1
- package/dist/mcp/config-hot-reload.js +1 -1
- package/dist/mcp/config-hot-reload.js.map +1 -1
- package/dist/mcp/dispatcher-factory.d.ts +16 -1
- package/dist/mcp/dispatcher-factory.d.ts.map +1 -1
- package/dist/mcp/dispatcher-factory.js +41 -3
- package/dist/mcp/dispatcher-factory.js.map +1 -1
- package/dist/mcp/tool-schemas.d.ts +194 -0
- package/dist/mcp/tool-schemas.d.ts.map +1 -0
- package/dist/mcp/tool-schemas.js +311 -0
- package/dist/mcp/tool-schemas.js.map +1 -0
- package/dist/mcp/tools.d.ts +26 -51
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +122 -151
- package/dist/mcp/tools.js.map +1 -1
- package/dist/observability/index.d.ts +16 -3
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js +23 -7
- package/dist/observability/index.js.map +1 -1
- package/dist/observability/spans.d.ts.map +1 -1
- package/dist/observability/spans.js +4 -1
- package/dist/observability/spans.js.map +1 -1
- package/dist/quota.d.ts +106 -22
- package/dist/quota.d.ts.map +1 -1
- package/dist/quota.js +198 -58
- package/dist/quota.js.map +1 -1
- package/dist/route-policy.d.ts.map +1 -1
- package/dist/route-policy.js +13 -3
- package/dist/route-policy.js.map +1 -1
- package/dist/router.d.ts +29 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +102 -40
- package/dist/router.js.map +1 -1
- package/dist/safety.d.ts.map +1 -1
- package/dist/safety.js +11 -2
- package/dist/safety.js.map +1 -1
- package/dist/state-dir.d.ts +17 -0
- package/dist/state-dir.d.ts.map +1 -0
- package/dist/state-dir.js +21 -0
- package/dist/state-dir.js.map +1 -0
- package/dist/status.d.ts +49 -0
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +67 -4
- package/dist/status.js.map +1 -1
- package/dist/types.d.ts +74 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/working-dir.d.ts +13 -0
- package/dist/working-dir.d.ts.map +1 -1
- package/dist/working-dir.js +27 -0
- package/dist/working-dir.js.map +1 -1
- package/dist/workspace-lock.d.ts +40 -0
- package/dist/workspace-lock.d.ts.map +1 -0
- package/dist/workspace-lock.js +258 -0
- package/dist/workspace-lock.js.map +1 -0
- package/dist/workspace-resolve.d.ts +98 -0
- package/dist/workspace-resolve.d.ts.map +1 -0
- package/dist/workspace-resolve.js +382 -0
- package/dist/workspace-resolve.js.map +1 -0
- package/dist/workspaces.d.ts +16 -0
- package/dist/workspaces.d.ts.map +1 -1
- package/dist/workspaces.js +166 -22
- package/dist/workspaces.js.map +1 -1
- package/package.json +99 -96
- package/dist/dashboard/live.d.ts +0 -49
- package/dist/dashboard/live.d.ts.map +0 -1
- package/dist/dashboard/live.js +0 -149
- package/dist/dashboard/live.js.map +0 -1
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The MCP input contract: what the three tools accept, and what they refuse.
|
|
3
|
+
*
|
|
4
|
+
* Split out of tools.ts, which had grown to 1040 lines mixing the contract
|
|
5
|
+
* with the handlers that run after it. This half earns its own file rather
|
|
6
|
+
* than merely being long: these schemas ARE the safety boundary. The SDK
|
|
7
|
+
* validates arguments against them BEFORE any handler runs, so a key absent
|
|
8
|
+
* here is a key silently stripped — which is exactly how a top-level
|
|
9
|
+
* `safetyProfile` once ran a dispatch with more access than the caller
|
|
10
|
+
* asked for. Being able to read the whole accepted surface, and every
|
|
11
|
+
* deliberate refusal, in one place is the point.
|
|
12
|
+
*/
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
export declare const taskTypeSchema: z.ZodEnum<{
|
|
15
|
+
execute: "execute";
|
|
16
|
+
plan: "plan";
|
|
17
|
+
review: "review";
|
|
18
|
+
local: "local";
|
|
19
|
+
}>;
|
|
20
|
+
export declare const safetyProfileSchema: z.ZodEnum<{
|
|
21
|
+
read_only: "read_only";
|
|
22
|
+
workspace_edit: "workspace_edit";
|
|
23
|
+
full_auto: "full_auto";
|
|
24
|
+
}>;
|
|
25
|
+
export declare const workspacePolicySchema: z.ZodEnum<{
|
|
26
|
+
shared: "shared";
|
|
27
|
+
shared_locked: "shared_locked";
|
|
28
|
+
git_worktree: "git_worktree";
|
|
29
|
+
copy: "copy";
|
|
30
|
+
}>;
|
|
31
|
+
export declare const routePolicySchema: z.ZodEnum<{
|
|
32
|
+
standard: "standard";
|
|
33
|
+
local_only: "local_only";
|
|
34
|
+
approval_required: "approval_required";
|
|
35
|
+
blocked: "blocked";
|
|
36
|
+
}>;
|
|
37
|
+
export declare const publicHintsSchema: z.ZodObject<{
|
|
38
|
+
model: z.ZodOptional<z.ZodString>;
|
|
39
|
+
taskType: z.ZodOptional<z.ZodEnum<{
|
|
40
|
+
execute: "execute";
|
|
41
|
+
plan: "plan";
|
|
42
|
+
review: "review";
|
|
43
|
+
local: "local";
|
|
44
|
+
}>>;
|
|
45
|
+
preferLargeContext: z.ZodOptional<z.ZodBoolean>;
|
|
46
|
+
safetyProfile: z.ZodOptional<z.ZodEnum<{
|
|
47
|
+
read_only: "read_only";
|
|
48
|
+
workspace_edit: "workspace_edit";
|
|
49
|
+
full_auto: "full_auto";
|
|
50
|
+
}>>;
|
|
51
|
+
workspacePolicy: z.ZodOptional<z.ZodEnum<{
|
|
52
|
+
shared: "shared";
|
|
53
|
+
shared_locked: "shared_locked";
|
|
54
|
+
git_worktree: "git_worktree";
|
|
55
|
+
copy: "copy";
|
|
56
|
+
}>>;
|
|
57
|
+
routePolicy: z.ZodOptional<z.ZodEnum<{
|
|
58
|
+
standard: "standard";
|
|
59
|
+
local_only: "local_only";
|
|
60
|
+
approval_required: "approval_required";
|
|
61
|
+
blocked: "blocked";
|
|
62
|
+
}>>;
|
|
63
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
64
|
+
}, z.core.$strict>;
|
|
65
|
+
export declare const workingDirDescription: string;
|
|
66
|
+
/** Inline grace window: how long `dispatch` waits for the background run before returning a pollable jobId instead of the full result. */
|
|
67
|
+
export declare const DEFAULT_GRACE_SECONDS = 25;
|
|
68
|
+
/**
|
|
69
|
+
* Cap on `files` per dispatch.
|
|
70
|
+
*
|
|
71
|
+
* Not a performance limit — each entry's parent directory becomes an
|
|
72
|
+
* `--add-dir` grant on CLI routes (generic-cli.ts includedDirectories ->
|
|
73
|
+
* {{file_dirs}}), so an unbounded list is an unbounded set of directories
|
|
74
|
+
* handed to a coding agent. 64 is far above any real prompt and low enough
|
|
75
|
+
* that a runaway caller is stopped at the boundary rather than at the CLI.
|
|
76
|
+
*/
|
|
77
|
+
/** The only jobId shape jobs.ts produces; shared by both tools. */
|
|
78
|
+
export declare const JOB_ID_RE: RegExp;
|
|
79
|
+
export declare const MAX_CONTEXT_FILES = 64;
|
|
80
|
+
/**
|
|
81
|
+
* Cap on prior jobs referenced by one dispatch.
|
|
82
|
+
*
|
|
83
|
+
* Each one costs a disk read and a slice of the delegate's context window.
|
|
84
|
+
* jobs.ts caps the rendered TEXT as well; this bounds the work done to produce
|
|
85
|
+
* it, so a caller naming hundreds of jobs is stopped at the boundary rather
|
|
86
|
+
* than after the reads.
|
|
87
|
+
*/
|
|
88
|
+
export declare const MAX_CONTEXT_JOBS = 16;
|
|
89
|
+
export declare const misplacedTopLevelKeys: {
|
|
90
|
+
safetyProfile: z.ZodOptional<z.ZodNever>;
|
|
91
|
+
routePolicy: z.ZodOptional<z.ZodNever>;
|
|
92
|
+
taskType: z.ZodOptional<z.ZodNever>;
|
|
93
|
+
preferLargeContext: z.ZodOptional<z.ZodNever>;
|
|
94
|
+
timeoutMs: z.ZodOptional<z.ZodNever>;
|
|
95
|
+
model: z.ZodOptional<z.ZodNever>;
|
|
96
|
+
escalate: z.ZodOptional<z.ZodNever>;
|
|
97
|
+
};
|
|
98
|
+
export declare const dispatchInputShape: {
|
|
99
|
+
readonly models: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
100
|
+
readonly service: z.ZodOptional<z.ZodString>;
|
|
101
|
+
readonly graceSeconds: z.ZodOptional<z.ZodNumber>;
|
|
102
|
+
readonly safetyProfile: z.ZodOptional<z.ZodNever>;
|
|
103
|
+
readonly routePolicy: z.ZodOptional<z.ZodNever>;
|
|
104
|
+
readonly taskType: z.ZodOptional<z.ZodNever>;
|
|
105
|
+
readonly preferLargeContext: z.ZodOptional<z.ZodNever>;
|
|
106
|
+
readonly timeoutMs: z.ZodOptional<z.ZodNever>;
|
|
107
|
+
readonly model: z.ZodOptional<z.ZodNever>;
|
|
108
|
+
readonly escalate: z.ZodOptional<z.ZodNever>;
|
|
109
|
+
readonly prompt: z.ZodString;
|
|
110
|
+
readonly mode: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
111
|
+
single: "single";
|
|
112
|
+
fanout: "fanout";
|
|
113
|
+
}>>>;
|
|
114
|
+
readonly contextJobs: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
115
|
+
readonly files: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
116
|
+
readonly workingDir: z.ZodOptional<z.ZodString>;
|
|
117
|
+
readonly workspacePolicy: z.ZodOptional<z.ZodEnum<{
|
|
118
|
+
shared: "shared";
|
|
119
|
+
shared_locked: "shared_locked";
|
|
120
|
+
git_worktree: "git_worktree";
|
|
121
|
+
copy: "copy";
|
|
122
|
+
}>>;
|
|
123
|
+
readonly hints: z.ZodOptional<z.ZodObject<{
|
|
124
|
+
model: z.ZodOptional<z.ZodString>;
|
|
125
|
+
taskType: z.ZodOptional<z.ZodEnum<{
|
|
126
|
+
execute: "execute";
|
|
127
|
+
plan: "plan";
|
|
128
|
+
review: "review";
|
|
129
|
+
local: "local";
|
|
130
|
+
}>>;
|
|
131
|
+
preferLargeContext: z.ZodOptional<z.ZodBoolean>;
|
|
132
|
+
safetyProfile: z.ZodOptional<z.ZodEnum<{
|
|
133
|
+
read_only: "read_only";
|
|
134
|
+
workspace_edit: "workspace_edit";
|
|
135
|
+
full_auto: "full_auto";
|
|
136
|
+
}>>;
|
|
137
|
+
workspacePolicy: z.ZodOptional<z.ZodEnum<{
|
|
138
|
+
shared: "shared";
|
|
139
|
+
shared_locked: "shared_locked";
|
|
140
|
+
git_worktree: "git_worktree";
|
|
141
|
+
copy: "copy";
|
|
142
|
+
}>>;
|
|
143
|
+
routePolicy: z.ZodOptional<z.ZodEnum<{
|
|
144
|
+
standard: "standard";
|
|
145
|
+
local_only: "local_only";
|
|
146
|
+
approval_required: "approval_required";
|
|
147
|
+
blocked: "blocked";
|
|
148
|
+
}>>;
|
|
149
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
150
|
+
}, z.core.$strict>>;
|
|
151
|
+
};
|
|
152
|
+
export declare const jobStatusInputShape: {
|
|
153
|
+
readonly jobId: z.ZodOptional<z.ZodString>;
|
|
154
|
+
};
|
|
155
|
+
export declare const usageInputShape: {
|
|
156
|
+
listModels: z.ZodOptional<z.ZodString>;
|
|
157
|
+
};
|
|
158
|
+
/**
|
|
159
|
+
* `cancel_job` takes the jobId and, optionally, why.
|
|
160
|
+
*
|
|
161
|
+
* The reason is not decoration: a cancelled run's status carries it, so
|
|
162
|
+
* whoever finds the job later — often a different agent, or the same one
|
|
163
|
+
* after a restart — learns it was stopped on purpose rather than that it
|
|
164
|
+
* mysteriously died.
|
|
165
|
+
*/
|
|
166
|
+
export declare const cancelJobInputShape: {
|
|
167
|
+
readonly jobId: z.ZodString;
|
|
168
|
+
readonly reason: z.ZodOptional<z.ZodString>;
|
|
169
|
+
};
|
|
170
|
+
/**
|
|
171
|
+
* `workspace` — inspect or resolve the isolated result of a finished job.
|
|
172
|
+
*
|
|
173
|
+
* One tool with an action rather than three tools, because all three operate
|
|
174
|
+
* on the SAME object (one job's workspace) with the same parameters. That is
|
|
175
|
+
* the opposite of the dispatch/job_status split, where one tool covering both
|
|
176
|
+
* "start work" and "check work" needed runtime guards against
|
|
177
|
+
* mutually-exclusive params — a sign the boundary was wrong. Here the actions
|
|
178
|
+
* are three verbs on one noun, and nothing is mutually exclusive.
|
|
179
|
+
*/
|
|
180
|
+
export declare const workspaceInputShape: {
|
|
181
|
+
readonly jobId: z.ZodString;
|
|
182
|
+
readonly action: z.ZodEnum<{
|
|
183
|
+
diff: "diff";
|
|
184
|
+
apply: "apply";
|
|
185
|
+
discard: "discard";
|
|
186
|
+
}>;
|
|
187
|
+
readonly force: z.ZodOptional<z.ZodBoolean>;
|
|
188
|
+
};
|
|
189
|
+
/** `retry_job` — run a finished job's task again, optionally on another route. */
|
|
190
|
+
export declare const retryJobInputShape: {
|
|
191
|
+
readonly jobId: z.ZodString;
|
|
192
|
+
readonly service: z.ZodOptional<z.ZodString>;
|
|
193
|
+
};
|
|
194
|
+
//# sourceMappingURL=tool-schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-schemas.d.ts","sourceRoot":"","sources":["../../src/mcp/tool-schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,cAAc;;;;;EAAiD,CAAC;AAC7E,eAAO,MAAM,mBAAmB;;;;EAAuD,CAAC;AACxF,eAAO,MAAM,qBAAqB;;;;;EAA8D,CAAC;AACjG,eAAO,MAAM,iBAAiB;;;;;EAAqE,CAAC;AAEpG,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA2EM,CAAC;AAErC,eAAO,MAAM,qBAAqB,QAG0B,CAAC;AAE7D,0IAA0I;AAC1I,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC;;;;;;;;GAQG;AACH,mEAAmE;AACnE,eAAO,MAAM,SAAS,QAA0B,CAAC;AAEjD,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAuCnC,eAAO,MAAM,qBAAqB;;;;;;;;CAejC,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuFrB,CAAC;AAEX,eAAO,MAAM,mBAAmB;;CAUtB,CAAC;AAEX,eAAO,MAAM,eAAe;;CAc3B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB;;;CAatB,CAAC;AAEX;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;CAoBtB,CAAC;AAEX,kFAAkF;AAClF,eAAO,MAAM,kBAAkB;;;CAarB,CAAC"}
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The MCP input contract: what the three tools accept, and what they refuse.
|
|
3
|
+
*
|
|
4
|
+
* Split out of tools.ts, which had grown to 1040 lines mixing the contract
|
|
5
|
+
* with the handlers that run after it. This half earns its own file rather
|
|
6
|
+
* than merely being long: these schemas ARE the safety boundary. The SDK
|
|
7
|
+
* validates arguments against them BEFORE any handler runs, so a key absent
|
|
8
|
+
* here is a key silently stripped — which is exactly how a top-level
|
|
9
|
+
* `safetyProfile` once ran a dispatch with more access than the caller
|
|
10
|
+
* asked for. Being able to read the whole accepted surface, and every
|
|
11
|
+
* deliberate refusal, in one place is the point.
|
|
12
|
+
*/
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
export const taskTypeSchema = z.enum(["execute", "plan", "review", "local"]);
|
|
15
|
+
export const safetyProfileSchema = z.enum(["read_only", "workspace_edit", "full_auto"]);
|
|
16
|
+
export const workspacePolicySchema = z.enum(["shared", "shared_locked", "copy", "git_worktree"]);
|
|
17
|
+
export const routePolicySchema = z.enum(["standard", "local_only", "approval_required", "blocked"]);
|
|
18
|
+
export const publicHintsSchema = z
|
|
19
|
+
.object({
|
|
20
|
+
model: z
|
|
21
|
+
.string()
|
|
22
|
+
.optional()
|
|
23
|
+
.describe("Preferred route or model name (e.g. a route id like 'codex' or a model like " +
|
|
24
|
+
"'gpt-5.6-sol'). Routes that statically declare this model get a scoring " +
|
|
25
|
+
"boost; the model is ALWAYS passed to the harness as an override either way, " +
|
|
26
|
+
"even on a route that doesn't recognize it — NOT validated, so an unfamiliar " +
|
|
27
|
+
"or misspelled name can still fail at dispatch time if the harness doesn't " +
|
|
28
|
+
"support it. Check the response's routing.modelHintMatched: true means the " +
|
|
29
|
+
"picked route actually declares this model; false means it was forwarded " +
|
|
30
|
+
"blind and you should treat the result with more suspicion (or check why). " +
|
|
31
|
+
"Call the `usage` tool first to see valid route ids, their default models, " +
|
|
32
|
+
"and a modelHint per route pointing to where that harness's real model " +
|
|
33
|
+
"catalog is documented (or how to list it) — use it to pick correctly up " +
|
|
34
|
+
"front or self-correct after an unfamiliar-model failure. In fanout mode " +
|
|
35
|
+
"this field is ignored entirely — use `models` (top-level, not under " +
|
|
36
|
+
"hints) to select fanout candidates instead."),
|
|
37
|
+
taskType: taskTypeSchema
|
|
38
|
+
.optional()
|
|
39
|
+
.describe("Kind of work: 'execute' (write/modify code, run commands), 'plan' " +
|
|
40
|
+
"(architecture/design, no edits), 'review' (critique code, no edits), 'local' " +
|
|
41
|
+
"(trivial/mechanical — prefers free local endpoints). ALWAYS set this: when " +
|
|
42
|
+
"omitted, per-task capability weighting and model escalation are disabled and " +
|
|
43
|
+
"routing quality degrades."),
|
|
44
|
+
preferLargeContext: z
|
|
45
|
+
.boolean()
|
|
46
|
+
.optional()
|
|
47
|
+
.describe("Boost routes with very large context windows (for huge-codebase reads)."),
|
|
48
|
+
safetyProfile: safetyProfileSchema
|
|
49
|
+
.optional()
|
|
50
|
+
.describe("Maximum permission the routed harness may use: 'read_only' (inspect only — use " +
|
|
51
|
+
"for review/plan), 'workspace_edit' (default; may edit files in workingDir), " +
|
|
52
|
+
"'full_auto' (unrestricted shell — only when explicitly needed). Routes that " +
|
|
53
|
+
"cannot honor the requested profile are skipped."),
|
|
54
|
+
workspacePolicy: workspacePolicySchema.optional().describe("Workspace execution policy."),
|
|
55
|
+
routePolicy: routePolicySchema
|
|
56
|
+
.optional()
|
|
57
|
+
.describe("Operational routing policy: 'standard' (default), 'local_only' (never leave the " +
|
|
58
|
+
"machine), 'approval_required' (BLOCKS non-local routes — it is a restriction, " +
|
|
59
|
+
"not an approval grant), 'blocked' (dry-run: block everything)."),
|
|
60
|
+
timeoutMs: z
|
|
61
|
+
.number()
|
|
62
|
+
.int()
|
|
63
|
+
.positive()
|
|
64
|
+
.optional()
|
|
65
|
+
.describe("Override the background run's hard ceiling (milliseconds). Every dispatch " +
|
|
66
|
+
"runs as a background job with a generous 60-minute default meant to catch a " +
|
|
67
|
+
"genuinely hung process, not to cap a slow-but-healthy run — raise this for " +
|
|
68
|
+
"a task you expect to run past an hour. This changes when the harness itself " +
|
|
69
|
+
"gives up, not how long the inline grace window waits (that's `graceSeconds`)."),
|
|
70
|
+
})
|
|
71
|
+
// STRICT, and this is a safety control, not tidiness.
|
|
72
|
+
//
|
|
73
|
+
// zod drops unknown keys by default. The same setting is spelled
|
|
74
|
+
// `safety_profile` in config.yaml and `safetyProfile` here, so the obvious
|
|
75
|
+
// slip was silently discarded — `hints: { safety_profile: "read_only" }` ran
|
|
76
|
+
// a full_auto route at full_auto, while the correctly-spelled key refused
|
|
77
|
+
// it. A caller asking to be restricted got no restriction and no warning.
|
|
78
|
+
//
|
|
79
|
+
// config.ts already treats this class as a root cause (it warns on ANY
|
|
80
|
+
// unrecognised route key). This is the same fix at the MCP boundary, which
|
|
81
|
+
// PRODUCT.md calls the actual product surface.
|
|
82
|
+
.strict()
|
|
83
|
+
.describe("Public routing hints.");
|
|
84
|
+
export const workingDirDescription = "Absolute path to the project the task is about. EFFECTIVELY REQUIRED: when omitted, " +
|
|
85
|
+
"the task runs in the router server's own working directory — almost never the " +
|
|
86
|
+
"project you mean. Always pass the caller's project root.";
|
|
87
|
+
/** Inline grace window: how long `dispatch` waits for the background run before returning a pollable jobId instead of the full result. */
|
|
88
|
+
export const DEFAULT_GRACE_SECONDS = 25;
|
|
89
|
+
/**
|
|
90
|
+
* Cap on `files` per dispatch.
|
|
91
|
+
*
|
|
92
|
+
* Not a performance limit — each entry's parent directory becomes an
|
|
93
|
+
* `--add-dir` grant on CLI routes (generic-cli.ts includedDirectories ->
|
|
94
|
+
* {{file_dirs}}), so an unbounded list is an unbounded set of directories
|
|
95
|
+
* handed to a coding agent. 64 is far above any real prompt and low enough
|
|
96
|
+
* that a runaway caller is stopped at the boundary rather than at the CLI.
|
|
97
|
+
*/
|
|
98
|
+
/** The only jobId shape jobs.ts produces; shared by both tools. */
|
|
99
|
+
export const JOB_ID_RE = /^job-\d+-[0-9a-f]{8}$/;
|
|
100
|
+
export const MAX_CONTEXT_FILES = 64;
|
|
101
|
+
/**
|
|
102
|
+
* Cap on prior jobs referenced by one dispatch.
|
|
103
|
+
*
|
|
104
|
+
* Each one costs a disk read and a slice of the delegate's context window.
|
|
105
|
+
* jobs.ts caps the rendered TEXT as well; this bounds the work done to produce
|
|
106
|
+
* it, so a caller naming hundreds of jobs is stopped at the boundary rather
|
|
107
|
+
* than after the reads.
|
|
108
|
+
*/
|
|
109
|
+
export const MAX_CONTEXT_JOBS = 16;
|
|
110
|
+
/**
|
|
111
|
+
* Keys that mean nothing at the top level, trapped IN THE SCHEMA.
|
|
112
|
+
*
|
|
113
|
+
* `hints` is .strict(), so `hints: { safety_profile: ... }` is rejected — but
|
|
114
|
+
* the OUTER object was still permissive, so moving the same key up one level
|
|
115
|
+
* made it vanish silently instead:
|
|
116
|
+
*
|
|
117
|
+
* hints.safetyProfile = read_only -> honoured
|
|
118
|
+
* TOP-LEVEL safetyProfile = read_only -> dropped, ran with write access
|
|
119
|
+
*
|
|
120
|
+
* WHY SCHEMA FIELDS AND NOT A GUARD FUNCTION. The MCP SDK validates arguments
|
|
121
|
+
* against this shape in strip mode BEFORE the registered handler runs, so no
|
|
122
|
+
* code inside a handler can ever see a misplaced key — it is already gone. A
|
|
123
|
+
* previous version of this trap was a guard function, and it guarded a path
|
|
124
|
+
* nothing shipped: the registered tools stripped the key silently while only
|
|
125
|
+
* the test-only entry point rejected it. z.never() fields make the SDK's own
|
|
126
|
+
* validation throw the guidance message on every surface that parses this
|
|
127
|
+
* shape, and advertise as {"not":{}} in the tool's JSON schema, so a client
|
|
128
|
+
* reading the schema sees the key as unacceptable rather than merely absent.
|
|
129
|
+
*
|
|
130
|
+
* Full .strict() on the outer object is deliberately NOT used: MCP clients may
|
|
131
|
+
* attach their own fields (_meta and similar) and rejecting those would break
|
|
132
|
+
* legitimate callers. Naming the specific misplaced keys closes the trap
|
|
133
|
+
* without guessing at what else may legitimately arrive.
|
|
134
|
+
*/
|
|
135
|
+
function misplacedKeyTrap(message) {
|
|
136
|
+
return z.never({ error: message }).optional().describe(message);
|
|
137
|
+
}
|
|
138
|
+
function hintKeyTrap(key) {
|
|
139
|
+
return misplacedKeyTrap(`${key} belongs inside \`hints\`, not at the top level — e.g. hints: { ${key}: ... }. ` +
|
|
140
|
+
`At the top level it does nothing, which for a safety setting means the dispatch ` +
|
|
141
|
+
`runs with MORE access than you asked for.`);
|
|
142
|
+
}
|
|
143
|
+
export const misplacedTopLevelKeys = {
|
|
144
|
+
safetyProfile: hintKeyTrap("safetyProfile"),
|
|
145
|
+
routePolicy: hintKeyTrap("routePolicy"),
|
|
146
|
+
taskType: hintKeyTrap("taskType"),
|
|
147
|
+
preferLargeContext: hintKeyTrap("preferLargeContext"),
|
|
148
|
+
timeoutMs: hintKeyTrap("timeoutMs"),
|
|
149
|
+
model: misplacedKeyTrap("model belongs inside `hints` for single mode — hints: { model: ... }. " +
|
|
150
|
+
"In fanout mode use the top-level `models` array instead. At the top " +
|
|
151
|
+
"level it does nothing."),
|
|
152
|
+
escalate: misplacedKeyTrap("escalate is not a dispatch field — escalation is configured per route in " +
|
|
153
|
+
"config.yaml (escalate_model / escalate_on), not per call."),
|
|
154
|
+
};
|
|
155
|
+
export const dispatchInputShape = {
|
|
156
|
+
prompt: z
|
|
157
|
+
.string()
|
|
158
|
+
// Rejected here rather than at the harness. An empty prompt used to reach
|
|
159
|
+
// a real CLI, which spawned, failed with its own usage message, and left a
|
|
160
|
+
// consumed route call behind — a wasted dispatch for something the schema
|
|
161
|
+
// can refuse for free.
|
|
162
|
+
.min(1, "prompt must not be empty")
|
|
163
|
+
// A NUL byte passed the schema and failed deep inside cross-spawn with
|
|
164
|
+
// "The argument 'args[2]' must be a string without null bytes" — caught,
|
|
165
|
+
// never a crash, and correctly not charged to the route's failure count,
|
|
166
|
+
// but a raw Node internal message where a boundary rejection belongs.
|
|
167
|
+
.refine((v) => !v.includes("\u0000"), "prompt must not contain NUL bytes")
|
|
168
|
+
.describe("The coding task or question. Every dispatch starts as a background job " +
|
|
169
|
+
"immediately; if it finishes within the grace window you get the full result " +
|
|
170
|
+
"inline, otherwise you get a jobId — check on it with the `job_status` tool. " +
|
|
171
|
+
"Either way nothing is ever lost to a timeout."),
|
|
172
|
+
mode: z
|
|
173
|
+
.enum(["single", "fanout"])
|
|
174
|
+
.optional()
|
|
175
|
+
.default("single")
|
|
176
|
+
.describe("'single' routes to the one best-fit harness. 'fanout' runs the prompt on " +
|
|
177
|
+
"MULTIPLE routes in parallel for independent perspectives — without `models` it " +
|
|
178
|
+
"hits every eligible route and consumes quota on each; prefer passing an " +
|
|
179
|
+
"explicit `models` list. Write-capable fanout requires workspacePolicy 'copy' " +
|
|
180
|
+
"or 'git_worktree'. Fanout results that outlive the grace window each return " +
|
|
181
|
+
"their own jobId to poll individually."),
|
|
182
|
+
contextJobs: z
|
|
183
|
+
.array(z.string().regex(JOB_ID_RE, "must look like job-<timestamp>-<8 hex chars>"))
|
|
184
|
+
.max(MAX_CONTEXT_JOBS)
|
|
185
|
+
.optional()
|
|
186
|
+
.describe("jobIds of earlier dispatches whose results this one should build on. Their " +
|
|
187
|
+
"prompts and outputs are rendered into this prompt directly, so a follow-up " +
|
|
188
|
+
"step can see what came before WITHOUT you reading it into your own context " +
|
|
189
|
+
"and re-summarising it. Use this to chain delegated work."),
|
|
190
|
+
files: z
|
|
191
|
+
.array(z.string())
|
|
192
|
+
.max(MAX_CONTEXT_FILES)
|
|
193
|
+
.optional()
|
|
194
|
+
.describe(`Absolute file paths to snapshot and include as context (max ` +
|
|
195
|
+
`${MAX_CONTEXT_FILES}). A path outside workingDir is still sent, but ` +
|
|
196
|
+
`for CLI routes its PARENT DIRECTORY is also granted to the agent via ` +
|
|
197
|
+
`--add-dir, so it escapes an isolated workspace — the response carries ` +
|
|
198
|
+
`a warning naming the directories when that happens.`),
|
|
199
|
+
workingDir: z.string().optional().describe(workingDirDescription),
|
|
200
|
+
workspacePolicy: workspacePolicySchema.optional().describe("Workspace execution policy."),
|
|
201
|
+
hints: publicHintsSchema.optional(),
|
|
202
|
+
...misplacedTopLevelKeys,
|
|
203
|
+
models: z
|
|
204
|
+
.array(z.string())
|
|
205
|
+
.optional()
|
|
206
|
+
.describe("Route ids or model names to fan out to (fanout mode only). This is the ONLY " +
|
|
207
|
+
"field that narrows which routes fanout hits — `hints.model` is ignored " +
|
|
208
|
+
"entirely in fanout mode (not used for selection, not forwarded to any " +
|
|
209
|
+
"dispatch); it only does anything in single mode. Get valid ids from the " +
|
|
210
|
+
"`usage` tool."),
|
|
211
|
+
service: z
|
|
212
|
+
.string()
|
|
213
|
+
.optional()
|
|
214
|
+
.describe("Optional explicit route id to run (e.g. 'codex', 'cursor', 'local_inference' — " +
|
|
215
|
+
"see the `usage` tool for valid ids). Omit to let the router pick. Single " +
|
|
216
|
+
"mode only — incompatible with mode='fanout' (use `models` there)."),
|
|
217
|
+
graceSeconds: z
|
|
218
|
+
.number()
|
|
219
|
+
.int()
|
|
220
|
+
.min(0)
|
|
221
|
+
.max(600)
|
|
222
|
+
.optional()
|
|
223
|
+
.describe(`Seconds to wait for the run inline before returning a pollable jobId (default ` +
|
|
224
|
+
`${DEFAULT_GRACE_SECONDS}). 0 returns the jobId immediately (pure async). ` +
|
|
225
|
+
`Raising it past your MCP client's own request timeout buys nothing — the run ` +
|
|
226
|
+
`continues in the background either way and the result stays collectible via ` +
|
|
227
|
+
`\`job_status\`, so a client timeout on this call loses nothing but the inline reply.`),
|
|
228
|
+
};
|
|
229
|
+
export const jobStatusInputShape = {
|
|
230
|
+
jobId: z
|
|
231
|
+
.string()
|
|
232
|
+
.regex(JOB_ID_RE, "jobId must look like job-<timestamp>-<8 hex chars>")
|
|
233
|
+
.optional()
|
|
234
|
+
.describe("Check a previously started dispatch: returns partialOutput while running and " +
|
|
235
|
+
"the full result once completed or failed. Omit to list every known background " +
|
|
236
|
+
"dispatch instead."),
|
|
237
|
+
};
|
|
238
|
+
export const usageInputShape = {
|
|
239
|
+
listModels: z
|
|
240
|
+
.string()
|
|
241
|
+
.optional()
|
|
242
|
+
.describe("Route id of an OpenAI-compatible endpoint (e.g. an entry from `endpoints:` " +
|
|
243
|
+
"like nvidia_nim or ollama). If the route declares a `models:` list in " +
|
|
244
|
+
"config, that operator-curated list is returned as-is — declaring it is " +
|
|
245
|
+
"how you override live discovery (e.g. to pin specific ids, or the " +
|
|
246
|
+
"endpoint's /models listing is noisy/untrustworthy). Otherwise fetches the " +
|
|
247
|
+
"endpoint's live GET /models catalog server-side — the API key never " +
|
|
248
|
+
"leaves the router. Either way, results come back under `liveModels`. CLI " +
|
|
249
|
+
"harness routes don't support this; use their modelHint instead."),
|
|
250
|
+
};
|
|
251
|
+
/**
|
|
252
|
+
* `cancel_job` takes the jobId and, optionally, why.
|
|
253
|
+
*
|
|
254
|
+
* The reason is not decoration: a cancelled run's status carries it, so
|
|
255
|
+
* whoever finds the job later — often a different agent, or the same one
|
|
256
|
+
* after a restart — learns it was stopped on purpose rather than that it
|
|
257
|
+
* mysteriously died.
|
|
258
|
+
*/
|
|
259
|
+
export const cancelJobInputShape = {
|
|
260
|
+
jobId: z
|
|
261
|
+
.string()
|
|
262
|
+
.regex(JOB_ID_RE, "must look like job-<timestamp>-<8 hex chars>")
|
|
263
|
+
.describe("The jobId returned by `dispatch`."),
|
|
264
|
+
reason: z
|
|
265
|
+
.string()
|
|
266
|
+
.max(500)
|
|
267
|
+
.optional()
|
|
268
|
+
.describe("Why it is being cancelled, recorded on the job so a later reader knows " +
|
|
269
|
+
"it was stopped deliberately (e.g. 'superseded by job-...', 'wrong directory')."),
|
|
270
|
+
};
|
|
271
|
+
/**
|
|
272
|
+
* `workspace` — inspect or resolve the isolated result of a finished job.
|
|
273
|
+
*
|
|
274
|
+
* One tool with an action rather than three tools, because all three operate
|
|
275
|
+
* on the SAME object (one job's workspace) with the same parameters. That is
|
|
276
|
+
* the opposite of the dispatch/job_status split, where one tool covering both
|
|
277
|
+
* "start work" and "check work" needed runtime guards against
|
|
278
|
+
* mutually-exclusive params — a sign the boundary was wrong. Here the actions
|
|
279
|
+
* are three verbs on one noun, and nothing is mutually exclusive.
|
|
280
|
+
*/
|
|
281
|
+
export const workspaceInputShape = {
|
|
282
|
+
jobId: z
|
|
283
|
+
.string()
|
|
284
|
+
.regex(JOB_ID_RE, "must look like job-<timestamp>-<8 hex chars>")
|
|
285
|
+
.describe("A finished job that ran with workspacePolicy 'copy' or 'git_worktree'."),
|
|
286
|
+
action: z
|
|
287
|
+
.enum(["diff", "apply", "discard"])
|
|
288
|
+
.describe("'diff' returns the actual patch of what the agent changed (and writes it to " +
|
|
289
|
+
"the job directory). 'apply' applies that patch to the ORIGINAL project. " +
|
|
290
|
+
"'discard' deletes the isolated workspace, leaving the project untouched."),
|
|
291
|
+
force: z
|
|
292
|
+
.boolean()
|
|
293
|
+
.optional()
|
|
294
|
+
.describe("apply only: apply even when the target project has uncommitted changes. " +
|
|
295
|
+
"Off by default because the patch was built against a clean base, so " +
|
|
296
|
+
"applying over newer work can conflict with or overwrite it."),
|
|
297
|
+
};
|
|
298
|
+
/** `retry_job` — run a finished job's task again, optionally on another route. */
|
|
299
|
+
export const retryJobInputShape = {
|
|
300
|
+
jobId: z
|
|
301
|
+
.string()
|
|
302
|
+
.regex(JOB_ID_RE, "must look like job-<timestamp>-<8 hex chars>")
|
|
303
|
+
.describe("The finished job whose task should be attempted again."),
|
|
304
|
+
service: z
|
|
305
|
+
.string()
|
|
306
|
+
.optional()
|
|
307
|
+
.describe("Route the retry somewhere else (e.g. the original hit its usage limit). " +
|
|
308
|
+
"Omit to reuse the original route, or to let the router pick again if it " +
|
|
309
|
+
"had none. Get valid ids from `usage`."),
|
|
310
|
+
};
|
|
311
|
+
//# sourceMappingURL=tool-schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-schemas.js","sourceRoot":"","sources":["../../src/mcp/tool-schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAC7E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC,CAAC;AACxF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;AACjG,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,YAAY,EAAE,mBAAmB,EAAE,SAAS,CAAC,CAAC,CAAC;AAEpG,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC;KAC/B,MAAM,CAAC;IACN,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,8EAA8E;QAC5E,0EAA0E;QAC1E,8EAA8E;QAC9E,8EAA8E;QAC9E,4EAA4E;QAC5E,4EAA4E;QAC5E,0EAA0E;QAC1E,4EAA4E;QAC5E,4EAA4E;QAC5E,wEAAwE;QACxE,0EAA0E;QAC1E,0EAA0E;QAC1E,sEAAsE;QACtE,6CAA6C,CAChD;IACH,QAAQ,EAAE,cAAc;SACrB,QAAQ,EAAE;SACV,QAAQ,CACP,oEAAoE;QAClE,+EAA+E;QAC/E,6EAA6E;QAC7E,+EAA+E;QAC/E,2BAA2B,CAC9B;IACH,kBAAkB,EAAE,CAAC;SAClB,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,yEAAyE,CAAC;IACtF,aAAa,EAAE,mBAAmB;SAC/B,QAAQ,EAAE;SACV,QAAQ,CACP,iFAAiF;QAC/E,8EAA8E;QAC9E,8EAA8E;QAC9E,iDAAiD,CACpD;IACH,eAAe,EAAE,qBAAqB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IACzF,WAAW,EAAE,iBAAiB;SAC3B,QAAQ,EAAE;SACV,QAAQ,CACP,kFAAkF;QAChF,gFAAgF;QAChF,gEAAgE,CACnE;IACH,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,QAAQ,EAAE;SACV,QAAQ,CACP,4EAA4E;QAC1E,8EAA8E;QAC9E,6EAA6E;QAC7E,8EAA8E;QAC9E,+EAA+E,CAClF;CACJ,CAAC;IACF,sDAAsD;IACtD,EAAE;IACF,iEAAiE;IACjE,2EAA2E;IAC3E,6EAA6E;IAC7E,0EAA0E;IAC1E,0EAA0E;IAC1E,EAAE;IACF,uEAAuE;IACvE,2EAA2E;IAC3E,+CAA+C;KAC9C,MAAM,EAAE;KACR,QAAQ,CAAC,uBAAuB,CAAC,CAAC;AAErC,MAAM,CAAC,MAAM,qBAAqB,GAChC,sFAAsF;IACtF,gFAAgF;IAChF,0DAA0D,CAAC;AAE7D,0IAA0I;AAC1I,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAExC;;;;;;;;GAQG;AACH,mEAAmE;AACnE,MAAM,CAAC,MAAM,SAAS,GAAG,uBAAuB,CAAC;AAEjD,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEpC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAEnC;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,gBAAgB,CACrB,GAAG,GAAG,mEAAmE,GAAG,WAAW;QACrF,kFAAkF;QAClF,2CAA2C,CAC9C,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,aAAa,EAAE,WAAW,CAAC,eAAe,CAAC;IAC3C,WAAW,EAAE,WAAW,CAAC,aAAa,CAAC;IACvC,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC;IACjC,kBAAkB,EAAE,WAAW,CAAC,oBAAoB,CAAC;IACrD,SAAS,EAAE,WAAW,CAAC,WAAW,CAAC;IACnC,KAAK,EAAE,gBAAgB,CACrB,wEAAwE;QACtE,sEAAsE;QACtE,wBAAwB,CAC3B;IACD,QAAQ,EAAE,gBAAgB,CACxB,2EAA2E;QACzE,2DAA2D,CAC9D;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;QACT,0EAA0E;QAC1E,2EAA2E;QAC3E,0EAA0E;QAC1E,uBAAuB;SACtB,GAAG,CAAC,CAAC,EAAE,0BAA0B,CAAC;QACnC,uEAAuE;QACvE,yEAAyE;QACzE,yEAAyE;QACzE,sEAAsE;SACrE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,mCAAmC,CAAC;SACzE,QAAQ,CACP,yEAAyE;QACvE,8EAA8E;QAC9E,8EAA8E;QAC9E,+CAA+C,CAClD;IACH,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;SAC1B,QAAQ,EAAE;SACV,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CACP,2EAA2E;QACzE,iFAAiF;QACjF,0EAA0E;QAC1E,+EAA+E;QAC/E,8EAA8E;QAC9E,uCAAuC,CAC1C;IACH,WAAW,EAAE,CAAC;SACX,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,8CAA8C,CAAC,CAAC;SAClF,GAAG,CAAC,gBAAgB,CAAC;SACrB,QAAQ,EAAE;SACV,QAAQ,CACP,6EAA6E;QAC3E,6EAA6E;QAC7E,6EAA6E;QAC7E,0DAA0D,CAC7D;IACH,KAAK,EAAE,CAAC;SACL,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,GAAG,CAAC,iBAAiB,CAAC;SACtB,QAAQ,EAAE;SACV,QAAQ,CACP,8DAA8D;QAC5D,GAAG,iBAAiB,kDAAkD;QACtE,uEAAuE;QACvE,wEAAwE;QACxE,qDAAqD,CACxD;IACH,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IACjE,eAAe,EAAE,qBAAqB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IACzF,KAAK,EAAE,iBAAiB,CAAC,QAAQ,EAAE;IACnC,GAAG,qBAAqB;IACxB,MAAM,EAAE,CAAC;SACN,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,QAAQ,EAAE;SACV,QAAQ,CACP,8EAA8E;QAC5E,yEAAyE;QACzE,wEAAwE;QACxE,0EAA0E;QAC1E,eAAe,CAClB;IACH,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,iFAAiF;QAC/E,2EAA2E;QAC3E,mEAAmE,CACtE;IACH,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,gFAAgF;QAC9E,GAAG,qBAAqB,mDAAmD;QAC3E,+EAA+E;QAC/E,8EAA8E;QAC9E,sFAAsF,CACzF;CACK,CAAC;AAEX,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,KAAK,CAAC,SAAS,EAAE,oDAAoD,CAAC;SACtE,QAAQ,EAAE;SACV,QAAQ,CACP,+EAA+E;QAC7E,gFAAgF;QAChF,mBAAmB,CACtB;CACK,CAAC;AAEX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,6EAA6E;QAC3E,wEAAwE;QACxE,yEAAyE;QACzE,oEAAoE;QACpE,4EAA4E;QAC5E,sEAAsE;QACtE,2EAA2E;QAC3E,iEAAiE,CACpE;CACJ,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,KAAK,CAAC,SAAS,EAAE,8CAA8C,CAAC;SAChE,QAAQ,CAAC,mCAAmC,CAAC;IAChD,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,yEAAyE;QACvE,gFAAgF,CACnF;CACK,CAAC;AAEX;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,KAAK,CAAC,SAAS,EAAE,8CAA8C,CAAC;SAChE,QAAQ,CAAC,wEAAwE,CAAC;IACrF,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;SAClC,QAAQ,CACP,8EAA8E;QAC5E,0EAA0E;QAC1E,0EAA0E,CAC7E;IACH,KAAK,EAAE,CAAC;SACL,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,0EAA0E;QACxE,sEAAsE;QACtE,6DAA6D,CAChE;CACK,CAAC;AAEX,kFAAkF;AAClF,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,KAAK,CAAC,SAAS,EAAE,8CAA8C,CAAC;SAChE,QAAQ,CAAC,wDAAwD,CAAC;IACrE,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,0EAA0E;QACxE,0EAA0E;QAC1E,uCAAuC,CAC1C;CACK,CAAC"}
|
package/dist/mcp/tools.d.ts
CHANGED
|
@@ -17,56 +17,19 @@ import { z } from "zod";
|
|
|
17
17
|
import type { RouteSkip, TaskType, WorkspaceRun } from "../types.js";
|
|
18
18
|
import type { RuntimeHolder, ConfigHotReloader } from "./config-hot-reload.js";
|
|
19
19
|
import { type JobStatus } from "../jobs.js";
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}>>;
|
|
34
|
-
readonly hints: z.ZodOptional<z.ZodObject<{
|
|
35
|
-
model: z.ZodOptional<z.ZodString>;
|
|
36
|
-
taskType: z.ZodOptional<z.ZodEnum<{
|
|
37
|
-
execute: "execute";
|
|
38
|
-
plan: "plan";
|
|
39
|
-
review: "review";
|
|
40
|
-
local: "local";
|
|
41
|
-
}>>;
|
|
42
|
-
preferLargeContext: z.ZodOptional<z.ZodBoolean>;
|
|
43
|
-
safetyProfile: z.ZodOptional<z.ZodEnum<{
|
|
44
|
-
read_only: "read_only";
|
|
45
|
-
workspace_edit: "workspace_edit";
|
|
46
|
-
full_auto: "full_auto";
|
|
47
|
-
}>>;
|
|
48
|
-
workspacePolicy: z.ZodOptional<z.ZodEnum<{
|
|
49
|
-
shared: "shared";
|
|
50
|
-
shared_locked: "shared_locked";
|
|
51
|
-
git_worktree: "git_worktree";
|
|
52
|
-
copy: "copy";
|
|
53
|
-
}>>;
|
|
54
|
-
routePolicy: z.ZodOptional<z.ZodEnum<{
|
|
55
|
-
standard: "standard";
|
|
56
|
-
local_only: "local_only";
|
|
57
|
-
approval_required: "approval_required";
|
|
58
|
-
blocked: "blocked";
|
|
59
|
-
}>>;
|
|
60
|
-
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
61
|
-
}, z.core.$strip>>;
|
|
62
|
-
readonly models: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
63
|
-
readonly service: z.ZodOptional<z.ZodString>;
|
|
64
|
-
readonly graceSeconds: z.ZodOptional<z.ZodNumber>;
|
|
65
|
-
};
|
|
66
|
-
declare const jobStatusInputShape: {
|
|
67
|
-
readonly jobId: z.ZodOptional<z.ZodString>;
|
|
68
|
-
};
|
|
69
|
-
export declare const TOOL_NAMES: readonly ["dispatch", "job_status", "usage"];
|
|
20
|
+
import { dispatchInputShape, jobStatusInputShape } from "./tool-schemas.js";
|
|
21
|
+
/**
|
|
22
|
+
* Exactly the shape jobs.ts:679 generates: `job-${Date.now()}-${8 hex}`.
|
|
23
|
+
*
|
|
24
|
+
* The schema was a bare z.string() and getAsyncJob does
|
|
25
|
+
* `path.join(jobsRoot(), jobId)` with no validation, so a caller could read
|
|
26
|
+
* manifest.json / status.json from anywhere on disk by passing `../..`
|
|
27
|
+
* segments. Constrained to three filenames, but an MCP server's threat model
|
|
28
|
+
* is "the calling agent may be steered by injected content", not "the caller
|
|
29
|
+
* is trustworthy" — validating the format is a one-liner and removes the
|
|
30
|
+
* question entirely.
|
|
31
|
+
*/
|
|
32
|
+
export declare const TOOL_NAMES: readonly ["dispatch", "job_status", "cancel_job", "retry_job", "workspace", "usage"];
|
|
70
33
|
export interface RouteResponse {
|
|
71
34
|
success: boolean;
|
|
72
35
|
output: string;
|
|
@@ -160,6 +123,19 @@ export interface ToolExtra {
|
|
|
160
123
|
sendNotification?: (notification: ServerNotification) => Promise<void>;
|
|
161
124
|
}
|
|
162
125
|
export declare function handleDispatch(deps: ToolDeps, input: z.infer<z.ZodObject<typeof dispatchInputShape>>, extra?: ToolExtra): Promise<unknown>;
|
|
126
|
+
export declare function handleCancelJob(args: {
|
|
127
|
+
jobId: string;
|
|
128
|
+
reason?: string | undefined;
|
|
129
|
+
}): Promise<import("../jobs.js").CancelOutcome>;
|
|
130
|
+
export declare function handleRetryJob(deps: ToolDeps, args: {
|
|
131
|
+
jobId: string;
|
|
132
|
+
service?: string | undefined;
|
|
133
|
+
}): Promise<import("../jobs.js").RetryOutcome>;
|
|
134
|
+
export declare function handleWorkspace(args: {
|
|
135
|
+
jobId: string;
|
|
136
|
+
action: "diff" | "apply" | "discard";
|
|
137
|
+
force?: boolean | undefined;
|
|
138
|
+
}): Promise<unknown>;
|
|
163
139
|
export declare function handleJobStatus(input: z.infer<z.ZodObject<typeof jobStatusInputShape>>): Promise<unknown>;
|
|
164
140
|
export declare function registerTools(server: McpServer, deps: ToolDeps): void;
|
|
165
141
|
export type InvokeResult = {
|
|
@@ -167,5 +143,4 @@ export type InvokeResult = {
|
|
|
167
143
|
data: unknown;
|
|
168
144
|
};
|
|
169
145
|
export declare function invokeTool(name: string, args: unknown, deps: ToolDeps): Promise<InvokeResult>;
|
|
170
|
-
export {};
|
|
171
146
|
//# sourceMappingURL=tools.d.ts.map
|
package/dist/mcp/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAkB,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAC7F,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAKV,SAAS,EACT,QAAQ,EAER,YAAY,EACb,MAAM,aAAa,CAAC;AAIrB,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE/E,OAAO,
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
|