harness-dispatch 0.5.0 → 0.6.1
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 +177 -0
- package/README.md +5 -2
- package/config.default.yaml +10 -1
- package/dist/bin.d.ts.map +1 -1
- package/dist/bin.js +3 -176
- package/dist/bin.js.map +1 -1
- package/dist/config/protocol.d.ts.map +1 -1
- package/dist/config/protocol.js +10 -2
- package/dist/config/protocol.js.map +1 -1
- 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.js +1 -1
- package/dist/config/validation.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +92 -173
- 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 +201 -0
- package/dist/configure-yaml.js.map +1 -0
- 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.map +1 -1
- package/dist/dispatchers/generic-cli.js +22 -2
- 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 +18 -0
- package/dist/dispatchers/openai-compatible.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 +57 -35
- package/dist/dispatchers/shared/stream-subprocess.js.map +1 -1
- 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 -11
- package/dist/http/server.d.ts.map +1 -1
- package/dist/http/server.js +26 -232
- 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/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 +113 -123
- package/dist/jobs.d.ts.map +1 -1
- package/dist/jobs.js +314 -309
- package/dist/jobs.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 +15 -59
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +63 -239
- package/dist/mcp/tools.js.map +1 -1
- package/dist/quota.d.ts +19 -1
- package/dist/quota.d.ts.map +1 -1
- package/dist/quota.js +39 -4
- package/dist/quota.js.map +1 -1
- package/dist/router.d.ts +4 -0
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +8 -0
- package/dist/router.js.map +1 -1
- package/dist/status.d.ts +13 -0
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +6 -0
- package/dist/status.js.map +1 -1
- package/dist/types.d.ts +51 -0
- package/dist/types.d.ts.map +1 -1
- 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 +1 -0
- package/dist/workspaces.d.ts.map +1 -1
- package/dist/workspaces.js +67 -15
- package/dist/workspaces.js.map +1 -1
- package/package.json +5 -4
- 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
package/dist/jobs.d.ts
CHANGED
|
@@ -10,121 +10,13 @@
|
|
|
10
10
|
* by the unit-test suite, which injects fake dispatchers a separate
|
|
11
11
|
* process could not see).
|
|
12
12
|
*/
|
|
13
|
-
import type {
|
|
14
|
-
import
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
export
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Earlier jobs whose results this one should be able to see.
|
|
22
|
-
*
|
|
23
|
-
* A delegate previously received a prompt and a file list and nothing else,
|
|
24
|
-
* so a second delegated step could not see what the first produced. The only
|
|
25
|
-
* way to chain work was for the orchestrator to read job A's output into its
|
|
26
|
-
* OWN context and re-summarise it into job B's prompt — spending exactly the
|
|
27
|
-
* context that delegating was meant to save, and losing detail in the
|
|
28
|
-
* retelling.
|
|
29
|
-
*
|
|
30
|
-
* Naming the prior jobs instead moves that transfer into the tool: their
|
|
31
|
-
* prompts and outputs are rendered into B's prompt directly, at full
|
|
32
|
-
* fidelity, without passing through the orchestrator.
|
|
33
|
-
*/
|
|
34
|
-
contextJobs?: string[];
|
|
35
|
-
files?: string[];
|
|
36
|
-
workingDir?: string;
|
|
37
|
-
hints?: RouteHints;
|
|
38
|
-
workspacePolicy?: WorkspacePolicy;
|
|
39
|
-
service?: string;
|
|
40
|
-
/**
|
|
41
|
-
* Live dispatcher-event tap, used by the `dispatch` tool to forward MCP
|
|
42
|
-
* progress notifications during its inline grace window. Never serialized
|
|
43
|
-
* (the manifest lists its fields explicitly), never awaited, and a throw
|
|
44
|
-
* here must not fail the job.
|
|
45
|
-
*/
|
|
46
|
-
onEvent?: (event: DispatcherEvent) => void;
|
|
47
|
-
}
|
|
48
|
-
export interface JobStatus {
|
|
49
|
-
jobId: string;
|
|
50
|
-
/**
|
|
51
|
-
* "orphaned" is never written to disk — it's computed on read: a job
|
|
52
|
-
* whose status file says "running" but whose heartbeat (updatedAt) has
|
|
53
|
-
* gone stale means the server process that owned the background run
|
|
54
|
-
* exited (session restart, crash) and the run died with it. Reporting it
|
|
55
|
-
* as still "running" forever is a lie that makes callers poll a corpse.
|
|
56
|
-
*/
|
|
57
|
-
status: "queued" | "running" | "completed" | "failed" | "orphaned";
|
|
58
|
-
createdAt: string;
|
|
59
|
-
updatedAt: string;
|
|
60
|
-
jobDir: string;
|
|
61
|
-
service?: string;
|
|
62
|
-
route?: string;
|
|
63
|
-
success?: boolean;
|
|
64
|
-
/** Bounded copy — full text in output/stderr.log. */
|
|
65
|
-
error?: string;
|
|
66
|
-
/**
|
|
67
|
-
* END-TO-END milliseconds for the run: routing, workspace preparation and
|
|
68
|
-
* any workspace-lock wait included. Deliberately NOT the same number as
|
|
69
|
-
* result.durationMs, which times the harness attempt alone — one job
|
|
70
|
-
* legitimately reports 116ms there and 15s here when it queued behind a
|
|
71
|
-
* shared_locked workspace. Both are real; they answer different questions.
|
|
72
|
-
*/
|
|
73
|
-
durationMs?: number;
|
|
74
|
-
/** Suggested seconds to wait before polling action=get again. */
|
|
75
|
-
nextPollSeconds?: number;
|
|
76
|
-
/** Agent-facing guidance on how to collect the result. */
|
|
77
|
-
instructions?: string;
|
|
78
|
-
/** Set when workingDir was omitted and defaulted to the router's own cwd. */
|
|
79
|
-
warning?: string;
|
|
80
|
-
/**
|
|
81
|
-
* Queued because the machine is at `max_concurrent_runs`, NOT because its
|
|
82
|
-
* owner died. Load-bearing for orphan detection: a slot-queued job has no
|
|
83
|
-
* process heartbeating for it, so without this flag the 90s staleness rule
|
|
84
|
-
* would report a job that is merely waiting its turn as a dead one.
|
|
85
|
-
* Cleared the moment a slot frees and its runner is spawned.
|
|
86
|
-
*/
|
|
87
|
-
slotQueued?: true;
|
|
88
|
-
}
|
|
89
|
-
export interface JobManifest {
|
|
90
|
-
jobId: string;
|
|
91
|
-
createdAt: string;
|
|
92
|
-
workingDir: string;
|
|
93
|
-
promptPath: string;
|
|
94
|
-
files: Array<{
|
|
95
|
-
originalPath: string;
|
|
96
|
-
snapshotPath?: string;
|
|
97
|
-
sizeBytes?: number;
|
|
98
|
-
error?: string;
|
|
99
|
-
}>;
|
|
100
|
-
hints?: RouteHints;
|
|
101
|
-
workspacePolicy?: WorkspacePolicy;
|
|
102
|
-
service?: string;
|
|
103
|
-
/** Set when workingDir was omitted and defaulted to the router's own cwd. */
|
|
104
|
-
warning?: string;
|
|
105
|
-
}
|
|
106
|
-
export interface JobResultPayload {
|
|
107
|
-
jobId: string;
|
|
108
|
-
result: DispatchResult;
|
|
109
|
-
decision: RoutingDecision | null;
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Config-driven retention (`retention: { jobs_days: N }` in config.yaml) —
|
|
113
|
-
* set at runtime bootstrap and on every hot reload. Precedence:
|
|
114
|
-
* HARNESS_DISPATCH_JOB_MAX_AGE_MS env > config > 7-day default.
|
|
115
|
-
*/
|
|
116
|
-
export declare function setJobRetentionDays(days: number | undefined): void;
|
|
117
|
-
export interface StartedJob {
|
|
118
|
-
status: JobStatus;
|
|
119
|
-
/**
|
|
120
|
-
* Resolves once the run has reached a terminal state on disk (result.json
|
|
121
|
-
* or a failed/orphaned status). Never rejects. In detached mode this is a
|
|
122
|
-
* disk watcher on the job directory — the run itself lives in a separate
|
|
123
|
-
* job-runner process; in in-process mode (HARNESS_DISPATCH_INPROC_JOBS=1,
|
|
124
|
-
* used by unit tests with injected fakes) it is the runJob promise itself.
|
|
125
|
-
*/
|
|
126
|
-
completion: Promise<void>;
|
|
127
|
-
}
|
|
13
|
+
import type { RouterConfig } from "./types.js";
|
|
14
|
+
import { buildContextPreamble } from "./jobs/context.js";
|
|
15
|
+
import { setJobRetentionDays } from "./jobs/store.js";
|
|
16
|
+
import type { JobDeps, JobManifest, JobResultPayload, JobStatus, StartedJob, StartJobInput } from "./jobs/types.js";
|
|
17
|
+
export { buildContextPreamble };
|
|
18
|
+
export { setJobRetentionDays };
|
|
19
|
+
export type { JobDeps, JobManifest, JobResultPayload, JobStatus, StartedJob, StartJobInput };
|
|
128
20
|
/**
|
|
129
21
|
* Rebuild a job's input from its on-disk bundle and execute it. This is the
|
|
130
22
|
* detached runner's whole job; the manifest deliberately carries everything
|
|
@@ -133,6 +25,31 @@ export interface StartedJob {
|
|
|
133
25
|
* created.
|
|
134
26
|
*/
|
|
135
27
|
export declare function executeJobDir(deps: JobDeps, jobDir: string): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Occupied slots: jobs actually executing right now. Counts `running` (and
|
|
30
|
+
* plain `queued` — a runner spawned but not yet started) only while the
|
|
31
|
+
* heartbeat is fresh, so a crashed runner's slot is reclaimed by the same
|
|
32
|
+
* ORPHAN_THRESHOLD_MS rule that already frees its status. Slot-queued jobs
|
|
33
|
+
* are waiting for a slot, not holding one.
|
|
34
|
+
*/
|
|
35
|
+
/**
|
|
36
|
+
* What one run of a route costs against the concurrency budget.
|
|
37
|
+
*
|
|
38
|
+
* Unknown routes count as a full 1.0 on purpose. A job that has not been
|
|
39
|
+
* routed yet (no forced `service`) has no weight to look up, and this bound
|
|
40
|
+
* exists because a measured burst of 13 concurrent CLIs exhausted memory —
|
|
41
|
+
* so the safe assumption for "might be anything" is "might be heavy".
|
|
42
|
+
*/
|
|
43
|
+
export declare function resourceWeightFor(status: JobStatus, config: RouterConfig | undefined): number;
|
|
44
|
+
/**
|
|
45
|
+
* Capacity currently in use, as a weighted sum rather than a job count.
|
|
46
|
+
*
|
|
47
|
+
* With every weight at 1.0 this is exactly the old count, so an existing
|
|
48
|
+
* `max_concurrent_runs` keeps its previous meaning.
|
|
49
|
+
*/
|
|
50
|
+
export declare function activeCapacity(statuses: Array<{
|
|
51
|
+
status: JobStatus;
|
|
52
|
+
}>, config: RouterConfig | undefined): number;
|
|
136
53
|
/**
|
|
137
54
|
* How many supervisor PROCESSES may exist, regardless of how many jobs run.
|
|
138
55
|
*
|
|
@@ -185,14 +102,6 @@ export declare function runSupervisor(deps: JobDeps, supervisorId?: string): Pro
|
|
|
185
102
|
* job keeps its jobId and its artifacts either way, so nothing is lost.
|
|
186
103
|
*/
|
|
187
104
|
export declare function drainSlotQueue(config: RouterConfig | undefined, configPath: string | undefined): Promise<void>;
|
|
188
|
-
/**
|
|
189
|
-
* Render earlier jobs' prompts and results as a prompt preamble.
|
|
190
|
-
*
|
|
191
|
-
* Unknown or unfinished jobs are reported inline rather than skipped silently:
|
|
192
|
-
* a delegate told "here is what came before" while a step is quietly missing
|
|
193
|
-
* would reason from an incomplete picture and never know.
|
|
194
|
-
*/
|
|
195
|
-
export declare function buildContextPreamble(contextJobs: string[]): Promise<string>;
|
|
196
105
|
export declare function startAsyncJob(deps: JobDeps, input: StartJobInput): Promise<JobStatus>;
|
|
197
106
|
export declare function startAsyncJobTracked(deps: JobDeps, input: StartJobInput): Promise<StartedJob>;
|
|
198
107
|
export declare function getAsyncJob(jobId: string): Promise<{
|
|
@@ -203,4 +112,85 @@ export declare function getAsyncJob(jobId: string): Promise<{
|
|
|
203
112
|
partialOutput?: string;
|
|
204
113
|
}>;
|
|
205
114
|
export declare function listAsyncJobs(): Promise<JobStatus[]>;
|
|
115
|
+
/** What a cancel request actually did — the caller needs to tell these apart. */
|
|
116
|
+
export interface CancelOutcome {
|
|
117
|
+
jobId: string;
|
|
118
|
+
/**
|
|
119
|
+
* `cancelled` — it was queued and never started; stopped outright.
|
|
120
|
+
* `cancelling` — it is running; teardown requested and lands shortly.
|
|
121
|
+
* `already_finished` — it had already reached a terminal state; nothing done.
|
|
122
|
+
*/
|
|
123
|
+
outcome: "cancelled" | "cancelling" | "already_finished";
|
|
124
|
+
status: JobStatus["status"];
|
|
125
|
+
message: string;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Ask a job to stop.
|
|
129
|
+
*
|
|
130
|
+
* Cancellation cannot be a signal here: jobs run inside POOLED supervisors,
|
|
131
|
+
* and the only pid recorded against a job belongs to a process that is also
|
|
132
|
+
* running other jobs, so signalling it would cancel work nobody asked to
|
|
133
|
+
* cancel. Instead this writes a marker the run itself honours — it drops out
|
|
134
|
+
* of its event stream, which triggers the dispatcher's teardown (killTree on
|
|
135
|
+
* the agent CLI and its children) and releases the workspace lock through the
|
|
136
|
+
* same path a normal finish uses.
|
|
137
|
+
*
|
|
138
|
+
* Two consequences worth stating plainly, because a caller who assumes
|
|
139
|
+
* otherwise will be surprised:
|
|
140
|
+
*
|
|
141
|
+
* 1. It is not instantaneous. A running job stops within about a second;
|
|
142
|
+
* `cancelling` means requested, not done. Poll job_status to see it land.
|
|
143
|
+
* 2. Work already done is NOT undone. A cancelled agent may have already
|
|
144
|
+
* edited files in the workspace, and those edits stay. Cancelling stops
|
|
145
|
+
* further work; it is not a rollback.
|
|
146
|
+
*
|
|
147
|
+
* A cancelled run is deliberately not recorded as a failure: the route's
|
|
148
|
+
* circuit breaker and failure count never see it, because the caller changing
|
|
149
|
+
* their mind says nothing about whether the route works.
|
|
150
|
+
*/
|
|
151
|
+
export declare function cancelJob(jobId: string, reason?: string): Promise<CancelOutcome>;
|
|
152
|
+
/**
|
|
153
|
+
* Inspect or resolve the isolated workspace a finished job left behind.
|
|
154
|
+
*
|
|
155
|
+
* Looks the job up the same way job_status does, then hands off to
|
|
156
|
+
* workspace-resolve.ts. Kept here so the caller only ever needs a jobId —
|
|
157
|
+
* where the workspace lives, and which policy produced it, are details
|
|
158
|
+
* recorded in the job's own result.
|
|
159
|
+
*/
|
|
160
|
+
export declare function resolveJobWorkspace(jobId: string, action: "diff" | "apply" | "discard", opts?: {
|
|
161
|
+
force?: boolean;
|
|
162
|
+
}): Promise<unknown>;
|
|
163
|
+
export interface RetryOutcome {
|
|
164
|
+
jobId: string;
|
|
165
|
+
retryOf: string;
|
|
166
|
+
service?: string;
|
|
167
|
+
reusedFrom: {
|
|
168
|
+
prompt: boolean;
|
|
169
|
+
files: number;
|
|
170
|
+
workingDir: string;
|
|
171
|
+
};
|
|
172
|
+
message: string;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Run a finished job's task again.
|
|
176
|
+
*
|
|
177
|
+
* The last verb missing from the job lifecycle: you could start work, watch
|
|
178
|
+
* it, stop it, and resolve its workspace — but if it failed, reproducing it
|
|
179
|
+
* meant reconstructing the prompt, the file list, the working directory and
|
|
180
|
+
* the hints by hand, from a job record that already holds all four. The
|
|
181
|
+
* machinery to execute a job bundle existed (executeJobDir) and simply was
|
|
182
|
+
* not reachable from outside.
|
|
183
|
+
*
|
|
184
|
+
* The prompt is taken from prompt.md, which is the FROZEN prompt — including
|
|
185
|
+
* any context preamble the original dispatch rendered in. A retry therefore
|
|
186
|
+
* reproduces what the delegate actually saw, not what the caller typed.
|
|
187
|
+
*
|
|
188
|
+
* `service` retargets the attempt, which is the common case rather than an
|
|
189
|
+
* afterthought: the reason a run failed is often the route, not the task
|
|
190
|
+
* ("codex hit its usage limit — try claude"). Omit it to reuse the original
|
|
191
|
+
* route, or to let the router pick again if the original had none.
|
|
192
|
+
*/
|
|
193
|
+
export declare function retryJob(jobId: string, deps: JobDeps, opts?: {
|
|
194
|
+
service?: string;
|
|
195
|
+
}): Promise<RetryOutcome>;
|
|
206
196
|
//# sourceMappingURL=jobs.d.ts.map
|
package/dist/jobs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"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"}
|