harness-dispatch 0.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/LICENSE +21 -0
- package/README.md +582 -0
- package/config.default.yaml +397 -0
- package/data/coding_benchmarks.json +431 -0
- package/dist/auth.d.ts +9 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +73 -0
- package/dist/auth.js.map +1 -0
- package/dist/billing.d.ts +7 -0
- package/dist/billing.d.ts.map +1 -0
- package/dist/billing.js +201 -0
- package/dist/billing.js.map +1 -0
- package/dist/bin.d.ts +6 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +488 -0
- package/dist/bin.js.map +1 -0
- package/dist/breaker-store.d.ts +31 -0
- package/dist/breaker-store.d.ts.map +1 -0
- package/dist/breaker-store.js +103 -0
- package/dist/breaker-store.js.map +1 -0
- package/dist/circuit-breaker.d.ts +47 -0
- package/dist/circuit-breaker.d.ts.map +1 -0
- package/dist/circuit-breaker.js +102 -0
- package/dist/circuit-breaker.js.map +1 -0
- package/dist/config.d.ts +48 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +1248 -0
- package/dist/config.js.map +1 -0
- package/dist/dashboard/live.d.ts +49 -0
- package/dist/dashboard/live.d.ts.map +1 -0
- package/dist/dashboard/live.js +149 -0
- package/dist/dashboard/live.js.map +1 -0
- package/dist/dispatch-log.d.ts +46 -0
- package/dist/dispatch-log.d.ts.map +1 -0
- package/dist/dispatch-log.js +89 -0
- package/dist/dispatch-log.js.map +1 -0
- package/dist/dispatchers/base.d.ts +55 -0
- package/dist/dispatchers/base.d.ts.map +1 -0
- package/dist/dispatchers/base.js +80 -0
- package/dist/dispatchers/base.js.map +1 -0
- package/dist/dispatchers/generic-cli.d.ts +30 -0
- package/dist/dispatchers/generic-cli.d.ts.map +1 -0
- package/dist/dispatchers/generic-cli.js +471 -0
- package/dist/dispatchers/generic-cli.js.map +1 -0
- package/dist/dispatchers/openai-compatible.d.ts +57 -0
- package/dist/dispatchers/openai-compatible.d.ts.map +1 -0
- package/dist/dispatchers/openai-compatible.js +662 -0
- package/dist/dispatchers/openai-compatible.js.map +1 -0
- package/dist/dispatchers/shared/kill-tree.d.ts +21 -0
- package/dist/dispatchers/shared/kill-tree.d.ts.map +1 -0
- package/dist/dispatchers/shared/kill-tree.js +35 -0
- package/dist/dispatchers/shared/kill-tree.js.map +1 -0
- package/dist/dispatchers/shared/rate-limit-headers.d.ts +22 -0
- package/dist/dispatchers/shared/rate-limit-headers.d.ts.map +1 -0
- package/dist/dispatchers/shared/rate-limit-headers.js +124 -0
- package/dist/dispatchers/shared/rate-limit-headers.js.map +1 -0
- package/dist/dispatchers/shared/stream-subprocess.d.ts +53 -0
- package/dist/dispatchers/shared/stream-subprocess.d.ts.map +1 -0
- package/dist/dispatchers/shared/stream-subprocess.js +274 -0
- package/dist/dispatchers/shared/stream-subprocess.js.map +1 -0
- package/dist/dispatchers/shared/subprocess.d.ts +25 -0
- package/dist/dispatchers/shared/subprocess.d.ts.map +1 -0
- package/dist/dispatchers/shared/subprocess.js +110 -0
- package/dist/dispatchers/shared/subprocess.js.map +1 -0
- package/dist/dispatchers/shared/which-available.d.ts +2 -0
- package/dist/dispatchers/shared/which-available.d.ts.map +1 -0
- package/dist/dispatchers/shared/which-available.js +8 -0
- package/dist/dispatchers/shared/which-available.js.map +1 -0
- package/dist/dispatchers/shared/windows-cmd.d.ts +38 -0
- package/dist/dispatchers/shared/windows-cmd.d.ts.map +1 -0
- package/dist/dispatchers/shared/windows-cmd.js +91 -0
- package/dist/dispatchers/shared/windows-cmd.js.map +1 -0
- package/dist/http/server.d.ts +15 -0
- package/dist/http/server.d.ts.map +1 -0
- package/dist/http/server.js +495 -0
- package/dist/http/server.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/job-runner.d.ts +19 -0
- package/dist/job-runner.d.ts.map +1 -0
- package/dist/job-runner.js +42 -0
- package/dist/job-runner.js.map +1 -0
- package/dist/jobs.d.ts +116 -0
- package/dist/jobs.d.ts.map +1 -0
- package/dist/jobs.js +542 -0
- package/dist/jobs.js.map +1 -0
- package/dist/leaderboard.d.ts +62 -0
- package/dist/leaderboard.d.ts.map +1 -0
- package/dist/leaderboard.js +287 -0
- package/dist/leaderboard.js.map +1 -0
- package/dist/mcp/config-hot-reload.d.ts +64 -0
- package/dist/mcp/config-hot-reload.d.ts.map +1 -0
- package/dist/mcp/config-hot-reload.js +144 -0
- package/dist/mcp/config-hot-reload.js.map +1 -0
- package/dist/mcp/dispatcher-factory.d.ts +20 -0
- package/dist/mcp/dispatcher-factory.d.ts.map +1 -0
- package/dist/mcp/dispatcher-factory.js +30 -0
- package/dist/mcp/dispatcher-factory.js.map +1 -0
- package/dist/mcp/resources.d.ts +8 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +45 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/server.d.ts +36 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +80 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +171 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +658 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/observability/index.d.ts +52 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +111 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/spans.d.ts +47 -0
- package/dist/observability/spans.d.ts.map +1 -0
- package/dist/observability/spans.js +72 -0
- package/dist/observability/spans.js.map +1 -0
- package/dist/quota.d.ts +91 -0
- package/dist/quota.d.ts.map +1 -0
- package/dist/quota.js +331 -0
- package/dist/quota.js.map +1 -0
- package/dist/route-policy.d.ts +24 -0
- package/dist/route-policy.d.ts.map +1 -0
- package/dist/route-policy.js +92 -0
- package/dist/route-policy.js.map +1 -0
- package/dist/router.d.ts +162 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +878 -0
- package/dist/router.js.map +1 -0
- package/dist/safety.d.ts +7 -0
- package/dist/safety.d.ts.map +1 -0
- package/dist/safety.js +33 -0
- package/dist/safety.js.map +1 -0
- package/dist/status.d.ts +100 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +228 -0
- package/dist/status.js.map +1 -0
- package/dist/types.d.ts +402 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +13 -0
- package/dist/version.js.map +1 -0
- package/dist/working-dir.d.ts +15 -0
- package/dist/working-dir.d.ts.map +1 -0
- package/dist/working-dir.js +22 -0
- package/dist/working-dir.js.map +1 -0
- package/dist/workspaces.d.ts +19 -0
- package/dist/workspaces.d.ts.map +1 -0
- package/dist/workspaces.js +352 -0
- package/dist/workspaces.js.map +1 -0
- package/package.json +96 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detached job runner — the process a `dispatch` background run actually
|
|
3
|
+
* lives in, so the run survives the MCP server that started it.
|
|
4
|
+
*
|
|
5
|
+
* Field incident that motivated this (2026-07-24): background runs used to
|
|
6
|
+
* execute inside the server process; a session restart killed the server
|
|
7
|
+
* and every in-flight run died with it, leaving status files frozen at
|
|
8
|
+
* "running". Now the server only *starts* this process (detached, unref'd)
|
|
9
|
+
* and watches the job directory; the run itself owes the server nothing.
|
|
10
|
+
* Orphan detection (jobs.ts heartbeat) remains the safety net for the rare
|
|
11
|
+
* case this runner itself dies.
|
|
12
|
+
*
|
|
13
|
+
* Usage: node dist/job-runner.js <jobDir>
|
|
14
|
+
* Config: HARNESS_DISPATCH_CONFIG (set by the spawning server so the run
|
|
15
|
+
* bootstraps against the same config file), else ./config.yaml if present,
|
|
16
|
+
* else auto-detect — mirroring bin.ts's resolution.
|
|
17
|
+
*/
|
|
18
|
+
import { existsSync } from "node:fs";
|
|
19
|
+
import { bootstrapRuntime, RuntimeHolder } from "./mcp/config-hot-reload.js";
|
|
20
|
+
import { executeJobDir } from "./jobs.js";
|
|
21
|
+
async function main() {
|
|
22
|
+
const jobDir = process.argv[2];
|
|
23
|
+
if (!jobDir) {
|
|
24
|
+
console.error("usage: job-runner <jobDir>");
|
|
25
|
+
process.exit(2);
|
|
26
|
+
}
|
|
27
|
+
const configPath = process.env.HARNESS_DISPATCH_CONFIG ??
|
|
28
|
+
(existsSync("config.yaml") ? "config.yaml" : undefined);
|
|
29
|
+
const state = await bootstrapRuntime(configPath !== undefined ? { configPath } : {});
|
|
30
|
+
await executeJobDir({ holder: new RuntimeHolder(state) }, jobDir);
|
|
31
|
+
// executeJobDir never throws (runJob writes failures to the job dir), but
|
|
32
|
+
// dispatcher/OTEL handles can keep the loop alive — exit deliberately.
|
|
33
|
+
process.exit(0);
|
|
34
|
+
}
|
|
35
|
+
main().catch((err) => {
|
|
36
|
+
// Last-resort: bootstrap itself failed (bad config, missing deps). The
|
|
37
|
+
// job dir still holds only the frozen "queued/running" status, which the
|
|
38
|
+
// heartbeat-staleness check will surface as orphaned.
|
|
39
|
+
console.error(`harness-dispatch job-runner: fatal: ${err instanceof Error ? err.message : String(err)}`);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=job-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-runner.js","sourceRoot":"","sources":["../src/job-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,UAAU,GACd,OAAO,CAAC,GAAG,CAAC,uBAAuB;QACnC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAClC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAC/C,CAAC;IACF,MAAM,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAClE,0EAA0E;IAC1E,uEAAuE;IACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,uEAAuE;IACvE,yEAAyE;IACzE,sDAAsD;IACtD,OAAO,CAAC,KAAK,CACX,uCAAuC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC1F,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/jobs.d.ts
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Async job bundle support.
|
|
3
|
+
*
|
|
4
|
+
* `dispatch` returns quickly after creating a reproducible bundle on disk,
|
|
5
|
+
* then the run executes in a DETACHED job-runner process (job-runner.ts) —
|
|
6
|
+
* not inside the MCP server — so a server restart, session reconnect, or
|
|
7
|
+
* client timeout never kills an in-flight run. The server (and any later
|
|
8
|
+
* server instance) reads progress and results back from the job directory.
|
|
9
|
+
* Set HARNESS_DISPATCH_INPROC_JOBS=1 to run jobs in-process instead (used
|
|
10
|
+
* by the unit-test suite, which injects fake dispatchers a separate
|
|
11
|
+
* process could not see).
|
|
12
|
+
*/
|
|
13
|
+
import type { RuntimeHolder } from "./mcp/config-hot-reload.js";
|
|
14
|
+
import type { DispatchResult, DispatcherEvent, RouteHints, RoutingDecision, WorkspacePolicy } from "./types.js";
|
|
15
|
+
export interface JobDeps {
|
|
16
|
+
holder: RuntimeHolder;
|
|
17
|
+
}
|
|
18
|
+
export interface StartJobInput {
|
|
19
|
+
prompt: string;
|
|
20
|
+
files?: string[];
|
|
21
|
+
workingDir?: string;
|
|
22
|
+
hints?: RouteHints;
|
|
23
|
+
workspacePolicy?: WorkspacePolicy;
|
|
24
|
+
service?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Live dispatcher-event tap, used by the `dispatch` tool to forward MCP
|
|
27
|
+
* progress notifications during its inline grace window. Never serialized
|
|
28
|
+
* (the manifest lists its fields explicitly), never awaited, and a throw
|
|
29
|
+
* here must not fail the job.
|
|
30
|
+
*/
|
|
31
|
+
onEvent?: (event: DispatcherEvent) => void;
|
|
32
|
+
}
|
|
33
|
+
export interface JobStatus {
|
|
34
|
+
jobId: string;
|
|
35
|
+
/**
|
|
36
|
+
* "orphaned" is never written to disk — it's computed on read: a job
|
|
37
|
+
* whose status file says "running" but whose heartbeat (updatedAt) has
|
|
38
|
+
* gone stale means the server process that owned the background run
|
|
39
|
+
* exited (session restart, crash) and the run died with it. Reporting it
|
|
40
|
+
* as still "running" forever is a lie that makes callers poll a corpse.
|
|
41
|
+
*/
|
|
42
|
+
status: "queued" | "running" | "completed" | "failed" | "orphaned";
|
|
43
|
+
createdAt: string;
|
|
44
|
+
updatedAt: string;
|
|
45
|
+
jobDir: string;
|
|
46
|
+
service?: string;
|
|
47
|
+
route?: string;
|
|
48
|
+
success?: boolean;
|
|
49
|
+
/** Bounded copy — full text in output/stderr.log. */
|
|
50
|
+
error?: string;
|
|
51
|
+
durationMs?: number;
|
|
52
|
+
/** Suggested seconds to wait before polling action=get again. */
|
|
53
|
+
nextPollSeconds?: number;
|
|
54
|
+
/** Agent-facing guidance on how to collect the result. */
|
|
55
|
+
instructions?: string;
|
|
56
|
+
/** Set when workingDir was omitted and defaulted to the router's own cwd. */
|
|
57
|
+
warning?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface JobManifest {
|
|
60
|
+
jobId: string;
|
|
61
|
+
createdAt: string;
|
|
62
|
+
workingDir: string;
|
|
63
|
+
promptPath: string;
|
|
64
|
+
files: Array<{
|
|
65
|
+
originalPath: string;
|
|
66
|
+
snapshotPath?: string;
|
|
67
|
+
sizeBytes?: number;
|
|
68
|
+
error?: string;
|
|
69
|
+
}>;
|
|
70
|
+
hints?: RouteHints;
|
|
71
|
+
workspacePolicy?: WorkspacePolicy;
|
|
72
|
+
service?: string;
|
|
73
|
+
/** Set when workingDir was omitted and defaulted to the router's own cwd. */
|
|
74
|
+
warning?: string;
|
|
75
|
+
}
|
|
76
|
+
export interface JobResultPayload {
|
|
77
|
+
jobId: string;
|
|
78
|
+
result: DispatchResult;
|
|
79
|
+
decision: RoutingDecision | null;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Config-driven retention (`retention: { jobs_days: N }` in config.yaml) —
|
|
83
|
+
* set at runtime bootstrap and on every hot reload. Precedence:
|
|
84
|
+
* HARNESS_DISPATCH_JOB_MAX_AGE_MS env > config > 7-day default.
|
|
85
|
+
*/
|
|
86
|
+
export declare function setJobRetentionDays(days: number | undefined): void;
|
|
87
|
+
export interface StartedJob {
|
|
88
|
+
status: JobStatus;
|
|
89
|
+
/**
|
|
90
|
+
* Resolves once the run has reached a terminal state on disk (result.json
|
|
91
|
+
* or a failed/orphaned status). Never rejects. In detached mode this is a
|
|
92
|
+
* disk watcher on the job directory — the run itself lives in a separate
|
|
93
|
+
* job-runner process; in in-process mode (HARNESS_DISPATCH_INPROC_JOBS=1,
|
|
94
|
+
* used by unit tests with injected fakes) it is the runJob promise itself.
|
|
95
|
+
*/
|
|
96
|
+
completion: Promise<void>;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Rebuild a job's input from its on-disk bundle and execute it. This is the
|
|
100
|
+
* detached runner's whole job; the manifest deliberately carries everything
|
|
101
|
+
* a run needs (prompt path, resolved workingDir, hints, service) precisely
|
|
102
|
+
* so execution can happen in a process that wasn't there when the job was
|
|
103
|
+
* created.
|
|
104
|
+
*/
|
|
105
|
+
export declare function executeJobDir(deps: JobDeps, jobDir: string): Promise<void>;
|
|
106
|
+
export declare function startAsyncJob(deps: JobDeps, input: StartJobInput): Promise<JobStatus>;
|
|
107
|
+
export declare function startAsyncJobTracked(deps: JobDeps, input: StartJobInput): Promise<StartedJob>;
|
|
108
|
+
export declare function getAsyncJob(jobId: string): Promise<{
|
|
109
|
+
manifest: JobManifest;
|
|
110
|
+
status: JobStatus;
|
|
111
|
+
result?: JobResultPayload;
|
|
112
|
+
/** Tail of live stdout/stderr while the job is still running. */
|
|
113
|
+
partialOutput?: string;
|
|
114
|
+
}>;
|
|
115
|
+
export declare function listAsyncJobs(): Promise<JobStatus[]>;
|
|
116
|
+
//# sourceMappingURL=jobs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"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"}
|