@cat-factory/local-server 0.15.0 → 0.16.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/dist/LocalContainerRunnerTransport.d.ts +97 -9
- package/dist/LocalContainerRunnerTransport.d.ts.map +1 -1
- package/dist/LocalContainerRunnerTransport.js +355 -93
- package/dist/LocalContainerRunnerTransport.js.map +1 -1
- package/dist/LocalProcessRunnerTransport.d.ts +63 -0
- package/dist/LocalProcessRunnerTransport.d.ts.map +1 -0
- package/dist/LocalProcessRunnerTransport.js +188 -0
- package/dist/LocalProcessRunnerTransport.js.map +1 -0
- package/dist/NativeRoutingRunnerTransport.d.ts +20 -0
- package/dist/NativeRoutingRunnerTransport.d.ts.map +1 -0
- package/dist/NativeRoutingRunnerTransport.js +50 -0
- package/dist/NativeRoutingRunnerTransport.js.map +1 -0
- package/dist/container.d.ts +13 -0
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +165 -22
- package/dist/container.js.map +1 -1
- package/dist/harnessHttp.d.ts +58 -0
- package/dist/harnessHttp.d.ts.map +1 -0
- package/dist/harnessHttp.js +95 -0
- package/dist/harnessHttp.js.map +1 -0
- package/dist/runtimes/appleContainerRuntime.d.ts +3 -0
- package/dist/runtimes/appleContainerRuntime.d.ts.map +1 -1
- package/dist/runtimes/appleContainerRuntime.js +8 -1
- package/dist/runtimes/appleContainerRuntime.js.map +1 -1
- package/dist/runtimes/containerRuntime.d.ts +30 -1
- package/dist/runtimes/containerRuntime.d.ts.map +1 -1
- package/dist/runtimes/containerRuntime.js +5 -0
- package/dist/runtimes/containerRuntime.js.map +1 -1
- package/dist/runtimes/dockerRuntime.d.ts +4 -0
- package/dist/runtimes/dockerRuntime.d.ts.map +1 -1
- package/dist/runtimes/dockerRuntime.js +21 -2
- package/dist/runtimes/dockerRuntime.js.map +1 -1
- package/dist/runtimes/index.d.ts.map +1 -1
- package/dist/runtimes/index.js +1 -0
- package/dist/runtimes/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +4 -14
- package/dist/server.js.map +1 -1
- package/package.json +9 -8
|
@@ -2,43 +2,36 @@ import { execFile } from 'node:child_process';
|
|
|
2
2
|
import { randomBytes } from 'node:crypto';
|
|
3
3
|
import { promisify } from 'node:util';
|
|
4
4
|
import { resolveDockerResources } from '@cat-factory/contracts';
|
|
5
|
+
import { EVICTION_ERROR, delay, harnessHealthy, pollHarnessJob, postHarnessJob, waitForHarnessHealth, } from './harnessHttp.js';
|
|
5
6
|
import { createRuntimeAdapter, DockerRuntimeAdapter, } from './runtimes/index.js';
|
|
6
7
|
const execFileAsync = promisify(execFile);
|
|
7
|
-
// The local-mode runner backend: each RUN gets its OWN local container — the SAME
|
|
8
|
-
// executor-harness image the Cloudflare Worker runs per-run Containers from — which
|
|
9
|
-
// hosts that run's whole sequence of step jobs. It is the local analogue of
|
|
10
|
-
// `CloudflareContainerTransport` (a per-run Cloudflare Container) and of
|
|
11
|
-
// `RunnerPoolTransport` (an org's self-hosted pool): the ContainerAgentExecutor drives
|
|
12
|
-
// all three identically through the `RunnerTransport` port, addressed by a
|
|
13
|
-
// {@link RunnerJobRef} — the run id (which container) plus the per-step job id.
|
|
14
|
-
//
|
|
15
|
-
// HOW it talks to the runtime is delegated to a {@link ContainerRuntimeAdapter}, so this
|
|
16
|
-
// transport supports Docker, Podman, OrbStack, Colima (the Docker-CLI adapter) and
|
|
17
|
-
// Apple's `container` (its own adapter, VM-per-container, connect-by-IP) without forking.
|
|
18
|
-
// This class owns only the runtime-agnostic lifecycle: start a container per RUN, cache
|
|
19
|
-
// its endpoint, re-attach the run's later steps to it, poll the harness over HTTP, and
|
|
20
|
-
// reap it. The harness reaches this service's LLM proxy at the runtime's host alias and
|
|
21
|
-
// clones/pushes to github.com directly with the per-job token in the request body.
|
|
22
|
-
// The failed-poll error the engine classifies as a container eviction (matched by
|
|
23
|
-
// orchestration `isContainerEvictionError`, also used by the bootstrap flow). A
|
|
24
|
-
// vanished/exited local container maps to it so the run stops and the stale-run
|
|
25
|
-
// sweeper can re-drive it — mirroring the Worker transport's 404 mapping.
|
|
26
|
-
const EVICTION_ERROR = 'Job not found (container evicted or crashed)';
|
|
27
|
-
const SECRET_HEADER = 'x-harness-secret';
|
|
28
|
-
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
29
8
|
export class LocalContainerRunnerTransport {
|
|
30
9
|
adapter;
|
|
31
10
|
image;
|
|
32
11
|
sharedSecret;
|
|
33
12
|
network;
|
|
13
|
+
// Mutable: the warm-pool sizing + checkout env are re-read live via `applySettings` when
|
|
14
|
+
// the DB-backed local-mode settings change, so an edit takes effect without a restart.
|
|
34
15
|
extraEnv;
|
|
35
16
|
exec;
|
|
36
17
|
fetchImpl;
|
|
37
18
|
readyTimeoutMs;
|
|
38
19
|
requestTimeoutMs;
|
|
39
20
|
privilegedTestJobs;
|
|
21
|
+
poolSize;
|
|
22
|
+
poolMax;
|
|
23
|
+
poolMinWarm;
|
|
24
|
+
poolIdleTtlMs;
|
|
40
25
|
/** runId → resolved container handle, to spare a CLI lookup on the hot poll path. */
|
|
41
26
|
cache = new Map();
|
|
27
|
+
/** Warm-pool members (only used when pooling is enabled). Leased in-process by run id. */
|
|
28
|
+
members = [];
|
|
29
|
+
/**
|
|
30
|
+
* Members whose container start is in flight (started but not yet pushed to `members`).
|
|
31
|
+
* Counted toward the cap so concurrent cold-starts can't all read a low `members.length`
|
|
32
|
+
* and overshoot `poolMax`.
|
|
33
|
+
*/
|
|
34
|
+
pendingStarts = 0;
|
|
42
35
|
constructor(options) {
|
|
43
36
|
this.adapter =
|
|
44
37
|
options.adapter ??
|
|
@@ -48,6 +41,7 @@ export class LocalContainerRunnerTransport {
|
|
|
48
41
|
hostAlias: 'host.docker.internal',
|
|
49
42
|
addHostGateway: true,
|
|
50
43
|
localDind: true,
|
|
44
|
+
pooling: true,
|
|
51
45
|
});
|
|
52
46
|
this.image = options.image;
|
|
53
47
|
this.sharedSecret = options.sharedSecret ?? randomBytes(24).toString('hex');
|
|
@@ -60,12 +54,78 @@ export class LocalContainerRunnerTransport {
|
|
|
60
54
|
this.readyTimeoutMs = options.readyTimeoutMs ?? 60_000;
|
|
61
55
|
this.requestTimeoutMs = options.requestTimeoutMs ?? 30_000;
|
|
62
56
|
this.privilegedTestJobs = options.privilegedTestJobs ?? true;
|
|
57
|
+
this.poolSize = 0;
|
|
58
|
+
this.poolMax = 0;
|
|
59
|
+
this.poolMinWarm = 0;
|
|
60
|
+
this.poolIdleTtlMs = 600_000;
|
|
61
|
+
this.configurePool(options);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Set the warm-pool sizing fields from (defaulting) options. Shared by the constructor
|
|
65
|
+
* and {@link applySettings} so the clamps live in one place.
|
|
66
|
+
*/
|
|
67
|
+
configurePool(opts) {
|
|
68
|
+
this.poolSize = Math.max(0, Math.floor(opts.poolSize ?? 0));
|
|
69
|
+
this.poolMax = Math.max(this.poolSize, Math.floor(opts.poolMax ?? this.poolSize));
|
|
70
|
+
// Clamp the pre-warm count to `poolSize` (the max IDLE members kept), NOT `poolMax`:
|
|
71
|
+
// `trimIdle` reaps idle members beyond `poolSize` on every release, so a minWarm above
|
|
72
|
+
// poolSize would be pre-warmed at boot only to be torn down after the first run —
|
|
73
|
+
// silently violating the warm floor. Keeping minWarm <= poolSize makes the floor hold.
|
|
74
|
+
this.poolMinWarm = Math.max(0, Math.min(Math.floor(opts.poolMinWarm ?? 0), this.poolSize));
|
|
75
|
+
this.poolIdleTtlMs = Math.max(0, Math.floor(opts.poolIdleTtlMs ?? 600_000));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Re-read the DB-backed local-mode settings into the ALREADY-BUILT transport so an edit
|
|
79
|
+
* in the settings panel takes effect WITHOUT a restart (the serving transport is built
|
|
80
|
+
* once and cached). Warm-pool sizing is applied live — `trimIdle` reaps idle members
|
|
81
|
+
* beyond the new `poolSize` and (when pooling is enabled) `prewarmPool` tops back up to
|
|
82
|
+
* `minWarm`; the checkout env applies to containers STARTED after this call. In-flight
|
|
83
|
+
* runs are never stranded: poll/release/dispatch route a run to the backend it ALREADY
|
|
84
|
+
* holds (a leased member or a per-run container), independent of the current pool mode,
|
|
85
|
+
* so even toggling pooling on/off mid-flight is safe.
|
|
86
|
+
*/
|
|
87
|
+
applySettings(settings) {
|
|
88
|
+
this.configurePool({
|
|
89
|
+
poolSize: settings?.pool?.size,
|
|
90
|
+
poolMax: settings?.pool?.max ?? undefined,
|
|
91
|
+
poolMinWarm: settings?.pool?.minWarm,
|
|
92
|
+
poolIdleTtlMs: settings?.pool?.idleTtlMs,
|
|
93
|
+
});
|
|
94
|
+
this.extraEnv = checkoutExtraEnv(settings);
|
|
95
|
+
void this.reconcilePool().catch(() => { });
|
|
96
|
+
}
|
|
97
|
+
/** Bring the warm set in line with the current sizing: trim excess idle, then re-warm. */
|
|
98
|
+
async reconcilePool() {
|
|
99
|
+
await this.trimIdle();
|
|
100
|
+
if (this.poolingEnabled)
|
|
101
|
+
await this.prewarmPool();
|
|
63
102
|
}
|
|
64
103
|
/** The runtime's capabilities (e.g. whether local Docker-in-Docker testing is possible). */
|
|
65
104
|
get capabilities() {
|
|
66
105
|
return this.adapter.capabilities;
|
|
67
106
|
}
|
|
107
|
+
/** Whether the warm pool is active (a size is configured AND the runtime supports it). */
|
|
108
|
+
get poolingEnabled() {
|
|
109
|
+
return this.poolSize > 0 && this.adapter.capabilities.pooling;
|
|
110
|
+
}
|
|
111
|
+
/** Whether a pool member is currently leased to this run (in-process lease state). */
|
|
112
|
+
hasLeasedMember(runId) {
|
|
113
|
+
return this.members.some((m) => m.leasedTo === runId);
|
|
114
|
+
}
|
|
68
115
|
async dispatch(ref, spec, kind = 'agent', options) {
|
|
116
|
+
// Route a run to the backend it ALREADY holds, regardless of the CURRENT pool mode
|
|
117
|
+
// (settings can flip pooling on/off live): a leased pool member re-attaches to the
|
|
118
|
+
// pool; an existing per-run container stays per-run. Only a BRAND-NEW run picks its
|
|
119
|
+
// mode from `poolingEnabled` — so a live resize never strands an in-flight run.
|
|
120
|
+
if (this.hasLeasedMember(ref.runId))
|
|
121
|
+
return this.dispatchPooled(ref, spec, kind);
|
|
122
|
+
if (this.cache.has(ref.runId))
|
|
123
|
+
return this.dispatchPerRun(ref, spec, kind, options);
|
|
124
|
+
if (this.poolingEnabled)
|
|
125
|
+
return this.dispatchPooled(ref, spec, kind);
|
|
126
|
+
return this.dispatchPerRun(ref, spec, kind, options);
|
|
127
|
+
}
|
|
128
|
+
async dispatchPerRun(ref, spec, kind, options) {
|
|
69
129
|
// The container is per-RUN: a run's first step starts it, later steps re-attach to
|
|
70
130
|
// it (resolved by the run id), and the harness keys each step's job by the per-step
|
|
71
131
|
// `ref.jobId` carried in the spec body.
|
|
@@ -101,55 +161,42 @@ export class LocalContainerRunnerTransport {
|
|
|
101
161
|
// POST the job to the single harness endpoint, with the kind in the body. Idempotent:
|
|
102
162
|
// re-attaching to an already-running container re-POSTs, which the harness's per-id
|
|
103
163
|
// registry treats as a re-attach.
|
|
104
|
-
|
|
105
|
-
method: 'POST',
|
|
106
|
-
headers: { 'content-type': 'application/json', [SECRET_HEADER]: this.sharedSecret },
|
|
107
|
-
body: JSON.stringify({ ...spec, kind }),
|
|
108
|
-
signal: AbortSignal.timeout(this.requestTimeoutMs),
|
|
109
|
-
});
|
|
110
|
-
if (!res.ok) {
|
|
111
|
-
throw new Error(`Local container dispatch failed (HTTP ${res.status}): ${await safeText(res)}`);
|
|
112
|
-
}
|
|
164
|
+
await this.postJob(resolved, { ...spec, kind });
|
|
113
165
|
}
|
|
114
166
|
async poll(ref) {
|
|
167
|
+
if (this.hasLeasedMember(ref.runId))
|
|
168
|
+
return this.pollPooled(ref);
|
|
115
169
|
const resolved = await this.resolve(ref.runId);
|
|
116
170
|
// No container for this run at all → it was evicted/reaped (or never started).
|
|
117
171
|
if (!resolved)
|
|
118
172
|
return { state: 'failed', error: EVICTION_ERROR };
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
if (!(await this.adapter.isRunning(this.exec, resolved.containerId))) {
|
|
173
|
+
// Address the per-RUN container, but read the per-step job by its own id. A connection
|
|
174
|
+
// error confirms-or-denies an eviction via the runtime; a confirmed-dead container
|
|
175
|
+
// clears the cache so the next dispatch starts fresh.
|
|
176
|
+
return pollHarnessJob({
|
|
177
|
+
fetchImpl: this.fetchImpl,
|
|
178
|
+
endpoint: resolved,
|
|
179
|
+
jobId: ref.jobId,
|
|
180
|
+
secret: this.sharedSecret,
|
|
181
|
+
timeoutMs: this.requestTimeoutMs,
|
|
182
|
+
label: 'Local container',
|
|
183
|
+
isDead: async () => {
|
|
184
|
+
if (await this.adapter.isRunning(this.exec, resolved.containerId))
|
|
185
|
+
return false;
|
|
133
186
|
this.cache.delete(ref.runId);
|
|
134
|
-
return
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
}
|
|
138
|
-
// The container is up but the harness no longer knows this job id (it was reaped
|
|
139
|
-
// after completion, or the container was recreated): treat as an eviction.
|
|
140
|
-
if (res.status === 404)
|
|
141
|
-
return { state: 'failed', error: EVICTION_ERROR };
|
|
142
|
-
if (!res.ok) {
|
|
143
|
-
throw new Error(`Local container job poll failed (HTTP ${res.status}): ${await safeText(res)}`);
|
|
144
|
-
}
|
|
145
|
-
return (await res.json());
|
|
187
|
+
return true;
|
|
188
|
+
},
|
|
189
|
+
});
|
|
146
190
|
}
|
|
147
191
|
/**
|
|
148
192
|
* Reclaim the per-RUN container now rather than leaving it idle — this tears down the
|
|
149
193
|
* whole run's container (and with it any step still running in it). Best-effort and
|
|
150
|
-
* idempotent: removing an already-gone container is a no-op.
|
|
194
|
+
* idempotent: removing an already-gone container is a no-op. A run that holds a pool
|
|
195
|
+
* member instead RETURNS it to the pool (or removes a transient/over-capacity one).
|
|
151
196
|
*/
|
|
152
197
|
async release(ref) {
|
|
198
|
+
if (this.hasLeasedMember(ref.runId))
|
|
199
|
+
return this.releasePooled(ref);
|
|
153
200
|
const containerId = this.cache.get(ref.runId)?.containerId ?? (await this.adapter.find(this.exec, ref.runId));
|
|
154
201
|
this.cache.delete(ref.runId);
|
|
155
202
|
if (!containerId)
|
|
@@ -159,15 +206,209 @@ export class LocalContainerRunnerTransport {
|
|
|
159
206
|
/**
|
|
160
207
|
* Reap exited per-run containers this transport manages — orphans a crash or hard
|
|
161
208
|
* kill left behind (release() never ran for them). Best-effort; returns the count
|
|
162
|
-
* removed. Call once at boot, before any job is in flight.
|
|
209
|
+
* removed. Call once at boot, before any job is in flight. When pooling is enabled it
|
|
210
|
+
* ALSO drains pool members orphaned by a previous process (their in-process lease state
|
|
211
|
+
* died with it, so they can't be safely re-leased) and pre-warms the configured minimum.
|
|
163
212
|
*/
|
|
164
213
|
async reapExited() {
|
|
165
|
-
|
|
214
|
+
const reaped = await this.adapter.reapExited(this.exec);
|
|
215
|
+
if (this.poolingEnabled) {
|
|
216
|
+
await this.drainPoolOrphans();
|
|
217
|
+
await this.prewarmPool();
|
|
218
|
+
}
|
|
219
|
+
return reaped;
|
|
166
220
|
}
|
|
167
|
-
// ---
|
|
168
|
-
|
|
169
|
-
|
|
221
|
+
// --- warm pool ----------------------------------------------------------
|
|
222
|
+
async dispatchPooled(ref, spec, kind) {
|
|
223
|
+
const repoKey = repoKeyOf(spec);
|
|
224
|
+
// Later steps of the same run re-attach to the member it already holds (idempotent).
|
|
225
|
+
let member = this.members.find((m) => m.leasedTo === ref.runId);
|
|
226
|
+
if (!member)
|
|
227
|
+
member = await this.acquireMember(ref.runId, repoKey);
|
|
228
|
+
if (repoKey)
|
|
229
|
+
member.repo = repoKey;
|
|
230
|
+
// Tell the harness to reuse its per-repo checkout (clean-sweep + fetch + switch branch)
|
|
231
|
+
// rather than clone fresh — the whole point of repo-affinity pooling.
|
|
232
|
+
await this.postJob(member, { ...spec, kind, persistentCheckout: true });
|
|
233
|
+
}
|
|
234
|
+
/** POST a job body to a harness, throwing on a non-OK response. */
|
|
235
|
+
postJob(endpoint, body) {
|
|
236
|
+
return postHarnessJob({
|
|
237
|
+
fetchImpl: this.fetchImpl,
|
|
238
|
+
endpoint,
|
|
239
|
+
secret: this.sharedSecret,
|
|
240
|
+
body,
|
|
241
|
+
timeoutMs: this.requestTimeoutMs,
|
|
242
|
+
label: 'Local container',
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
async pollPooled(ref) {
|
|
246
|
+
const member = this.members.find((m) => m.leasedTo === ref.runId);
|
|
247
|
+
if (!member)
|
|
248
|
+
return { state: 'failed', error: EVICTION_ERROR };
|
|
249
|
+
// The member died mid-run: drop it from the pool so it isn't re-leased, and report an
|
|
250
|
+
// eviction so the stale-run sweeper re-drives (a retry leases a healthy member and the
|
|
251
|
+
// harness's persistent checkout resumes the work branch). A 404 with the member still
|
|
252
|
+
// healthy keeps it leased for a re-dispatch (handled inside pollHarnessJob).
|
|
253
|
+
return pollHarnessJob({
|
|
254
|
+
fetchImpl: this.fetchImpl,
|
|
255
|
+
endpoint: member,
|
|
256
|
+
jobId: ref.jobId,
|
|
257
|
+
secret: this.sharedSecret,
|
|
258
|
+
timeoutMs: this.requestTimeoutMs,
|
|
259
|
+
label: 'Local container',
|
|
260
|
+
isDead: async () => {
|
|
261
|
+
if (await this.adapter.isRunning(this.exec, member.containerId))
|
|
262
|
+
return false;
|
|
263
|
+
this.dropMember(member);
|
|
264
|
+
return true;
|
|
265
|
+
},
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
async releasePooled(ref) {
|
|
269
|
+
const member = this.members.find((m) => m.leasedTo === ref.runId);
|
|
270
|
+
if (!member)
|
|
271
|
+
return;
|
|
272
|
+
member.leasedTo = undefined;
|
|
273
|
+
// An over-capacity (transient) member is torn down; a pooled one returns to the warm
|
|
274
|
+
// set with an idle-eviction timer, and we trim any idle excess beyond `poolSize`.
|
|
275
|
+
if (member.transient) {
|
|
276
|
+
this.dropMember(member);
|
|
277
|
+
await this.adapter.remove(this.exec, member.containerId);
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
this.scheduleIdleEviction(member);
|
|
281
|
+
await this.trimIdle();
|
|
282
|
+
}
|
|
283
|
+
/** Lease a member for `runId`, preferring repo affinity, starting one if needed. */
|
|
284
|
+
async acquireMember(runId, repoKey) {
|
|
285
|
+
// Prefer an idle member already holding this repo (fastest: fetch + switch branch),
|
|
286
|
+
// then any idle member, replacing any that turns out to be unhealthy.
|
|
287
|
+
for (;;) {
|
|
288
|
+
const idle = (repoKey ? this.members.find((m) => !m.leasedTo && m.repo === repoKey) : undefined) ??
|
|
289
|
+
this.members.find((m) => !m.leasedTo);
|
|
290
|
+
if (!idle)
|
|
291
|
+
break;
|
|
292
|
+
// CLAIM the member synchronously, BEFORE the `await` below, so a concurrent
|
|
293
|
+
// acquireMember can't `find` the same idle member and double-lease it (two runs
|
|
294
|
+
// sharing one container + checkout). If it turns out unhealthy we release the claim.
|
|
295
|
+
idle.leasedTo = runId;
|
|
296
|
+
this.clearIdleEviction(idle);
|
|
297
|
+
if (await harnessHealthy(this.fetchImpl, idle, this.requestTimeoutMs))
|
|
298
|
+
return idle;
|
|
299
|
+
// Unhealthy idle member → remove and try the next candidate.
|
|
300
|
+
this.dropMember(idle);
|
|
301
|
+
await this.adapter.remove(this.exec, idle.containerId);
|
|
302
|
+
}
|
|
303
|
+
// No idle member: start a new one. Within the cap it's a pooled member; beyond the cap
|
|
304
|
+
// it's a transient member torn down on release (so a burst never blocks). Count in-flight
|
|
305
|
+
// starts toward the cap so concurrent cold-starts can't all see a low count and overshoot.
|
|
306
|
+
const transient = this.members.length + this.pendingStarts >= this.poolMax;
|
|
307
|
+
this.pendingStarts++;
|
|
308
|
+
let member;
|
|
309
|
+
try {
|
|
310
|
+
member = await this.startMember(transient);
|
|
311
|
+
}
|
|
312
|
+
finally {
|
|
313
|
+
this.pendingStarts--;
|
|
314
|
+
}
|
|
315
|
+
member.leasedTo = runId;
|
|
316
|
+
return member;
|
|
317
|
+
}
|
|
318
|
+
/** Start a fresh pool member container and wait for it to be healthy. */
|
|
319
|
+
async startMember(transient) {
|
|
320
|
+
const id = `pool-${randomBytes(6).toString('hex')}`;
|
|
321
|
+
const containerId = await this.adapter.run(this.exec, {
|
|
322
|
+
runId: id,
|
|
323
|
+
image: this.image,
|
|
324
|
+
sharedSecret: this.sharedSecret,
|
|
325
|
+
// Pooled members are reused across runs (incl. Tester runs), so they run privileged
|
|
326
|
+
// when the runtime supports DinD — the same rule as a per-run container. Per-run
|
|
327
|
+
// instance sizing is NOT applied to a reused member (it keeps host defaults).
|
|
328
|
+
privileged: this.privilegedTestJobs,
|
|
329
|
+
network: this.network,
|
|
330
|
+
env: this.extraEnv,
|
|
331
|
+
pool: true,
|
|
332
|
+
});
|
|
333
|
+
const endpoint = await this.waitForEndpoint(containerId);
|
|
334
|
+
await this.waitForHealth(endpoint);
|
|
335
|
+
const member = { id, containerId, transient, ...endpoint };
|
|
336
|
+
this.members.push(member);
|
|
337
|
+
return member;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Pre-warm IDLE members up to `poolMinWarm`. The deficit counts only currently-idle
|
|
341
|
+
* members (plus in-flight starts), NOT leased ones: counting leased members would
|
|
342
|
+
* under-warm the idle floor whenever this runs while runs are in flight (e.g. a live
|
|
343
|
+
* `applySettings`/`reconcilePool` mid-run), leaving the next runs to cold-start. The
|
|
344
|
+
* missing members are started CONCURRENTLY — one at a time would stack each container's
|
|
345
|
+
* full boot+health latency, delaying pool readiness by ~deficit×. Best-effort: a member
|
|
346
|
+
* that fails to start is skipped (the pool then fills the rest on demand).
|
|
347
|
+
*/
|
|
348
|
+
async prewarmPool() {
|
|
349
|
+
const idle = this.members.filter((m) => !m.leasedTo).length;
|
|
350
|
+
const deficit = this.poolMinWarm - idle - this.pendingStarts;
|
|
351
|
+
if (deficit <= 0)
|
|
352
|
+
return;
|
|
353
|
+
await Promise.all(Array.from({ length: deficit }, async () => {
|
|
354
|
+
try {
|
|
355
|
+
this.scheduleIdleEviction(await this.startMember(false));
|
|
356
|
+
}
|
|
357
|
+
catch {
|
|
358
|
+
// a failed pre-warm is logged-and-skipped; the pool fills on demand
|
|
359
|
+
}
|
|
360
|
+
}));
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Remove every pool member the runtime reports from a PREVIOUS process — their
|
|
364
|
+
* in-process lease state died with that process, so they can't be safely re-leased.
|
|
365
|
+
* Best-effort and idempotent.
|
|
366
|
+
*/
|
|
367
|
+
async drainPoolOrphans() {
|
|
368
|
+
const ids = await this.adapter.listPoolMembers(this.exec).catch(() => []);
|
|
369
|
+
for (const containerId of ids) {
|
|
370
|
+
await this.adapter.remove(this.exec, containerId).catch(() => undefined);
|
|
371
|
+
}
|
|
170
372
|
}
|
|
373
|
+
/** Remove idle members beyond `poolSize` (oldest first) so the warm set stays bounded. */
|
|
374
|
+
async trimIdle() {
|
|
375
|
+
const idle = this.members.filter((m) => !m.leasedTo);
|
|
376
|
+
let excess = idle.length - this.poolSize;
|
|
377
|
+
for (const member of idle) {
|
|
378
|
+
if (excess <= 0)
|
|
379
|
+
break;
|
|
380
|
+
this.dropMember(member);
|
|
381
|
+
await this.adapter.remove(this.exec, member.containerId);
|
|
382
|
+
excess--;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
scheduleIdleEviction(member) {
|
|
386
|
+
this.clearIdleEviction(member);
|
|
387
|
+
if (this.poolIdleTtlMs <= 0)
|
|
388
|
+
return;
|
|
389
|
+
member.idleTimer = setTimeout(() => {
|
|
390
|
+
// Only evict if still idle when the timer fires.
|
|
391
|
+
if (member.leasedTo)
|
|
392
|
+
return;
|
|
393
|
+
this.dropMember(member);
|
|
394
|
+
void this.adapter.remove(this.exec, member.containerId).catch(() => undefined);
|
|
395
|
+
}, this.poolIdleTtlMs);
|
|
396
|
+
member.idleTimer.unref?.();
|
|
397
|
+
}
|
|
398
|
+
clearIdleEviction(member) {
|
|
399
|
+
if (member.idleTimer) {
|
|
400
|
+
clearTimeout(member.idleTimer);
|
|
401
|
+
member.idleTimer = undefined;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
/** Drop a member from the in-process pool (does NOT remove the container). */
|
|
405
|
+
dropMember(member) {
|
|
406
|
+
this.clearIdleEviction(member);
|
|
407
|
+
const i = this.members.indexOf(member);
|
|
408
|
+
if (i !== -1)
|
|
409
|
+
this.members.splice(i, 1);
|
|
410
|
+
}
|
|
411
|
+
// --- internals ----------------------------------------------------------
|
|
171
412
|
/** The container handle for a run from the cache, else rediscovered via the runtime. */
|
|
172
413
|
async resolve(runId) {
|
|
173
414
|
const cached = this.cache.get(runId);
|
|
@@ -195,47 +436,57 @@ export class LocalContainerRunnerTransport {
|
|
|
195
436
|
await delay(250);
|
|
196
437
|
}
|
|
197
438
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
if (res.ok)
|
|
207
|
-
return;
|
|
208
|
-
}
|
|
209
|
-
catch {
|
|
210
|
-
// not up yet
|
|
211
|
-
}
|
|
212
|
-
if (Date.now() >= deadline) {
|
|
213
|
-
throw new Error(`Timed out waiting for the harness at ${endpoint.host}:${endpoint.port} to become healthy`);
|
|
214
|
-
}
|
|
215
|
-
await delay(300);
|
|
216
|
-
}
|
|
439
|
+
waitForHealth(endpoint) {
|
|
440
|
+
return waitForHarnessHealth({
|
|
441
|
+
fetchImpl: this.fetchImpl,
|
|
442
|
+
endpoint,
|
|
443
|
+
readyTimeoutMs: this.readyTimeoutMs,
|
|
444
|
+
requestTimeoutMs: this.requestTimeoutMs,
|
|
445
|
+
timeoutError: `Timed out waiting for the harness at ${endpoint.host}:${endpoint.port} to become healthy`,
|
|
446
|
+
});
|
|
217
447
|
}
|
|
218
448
|
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
449
|
+
/**
|
|
450
|
+
* The harness `-e` env carrying the per-repo checkout-reuse knobs (consumed INSIDE the
|
|
451
|
+
* container). Absent fields ⇒ the harness uses its built-in defaults (/workspace, the
|
|
452
|
+
* default keep set). Shared by the initial build and the live `applySettings` re-read.
|
|
453
|
+
*/
|
|
454
|
+
function checkoutExtraEnv(settings) {
|
|
455
|
+
const checkout = settings?.checkout;
|
|
456
|
+
const env = {};
|
|
457
|
+
if (checkout?.workspaceRoot)
|
|
458
|
+
env.HARNESS_WORKSPACE_ROOT = checkout.workspaceRoot;
|
|
459
|
+
if (checkout?.cleanKeep && checkout.cleanKeep.length > 0) {
|
|
460
|
+
env.HARNESS_CLEAN_KEEP = checkout.cleanKeep.join(',');
|
|
225
461
|
}
|
|
462
|
+
return env;
|
|
463
|
+
}
|
|
464
|
+
/** The `owner/name` repo-affinity key from a dispatched job spec, when present. */
|
|
465
|
+
function repoKeyOf(spec) {
|
|
466
|
+
const repo = spec.repo;
|
|
467
|
+
if (typeof repo !== 'object' || repo === null)
|
|
468
|
+
return undefined;
|
|
469
|
+
const { owner, name } = repo;
|
|
470
|
+
if (typeof owner !== 'string' || typeof name !== 'string' || !owner || !name)
|
|
471
|
+
return undefined;
|
|
472
|
+
return `${owner}/${name}`;
|
|
226
473
|
}
|
|
227
474
|
/**
|
|
228
|
-
* Build a {@link LocalContainerRunnerTransport} from the process environment
|
|
229
|
-
*
|
|
230
|
-
* `
|
|
231
|
-
*
|
|
475
|
+
* Build a {@link LocalContainerRunnerTransport} from the process environment plus the
|
|
476
|
+
* DB-stored local-mode {@link LocalSettings} (warm-pool sizing + per-repo checkout reuse —
|
|
477
|
+
* these REPLACED the old `LOCAL_POOL_*` / `HARNESS_*` env vars; edit them in the local-mode
|
|
478
|
+
* settings panel). The image ref (`LOCAL_HARNESS_IMAGE`) is required; the runtime adapter is
|
|
479
|
+
* selected by `LOCAL_CONTAINER_RUNTIME` (docker | podman | orbstack | colima | apple).
|
|
480
|
+
* `settings` omitted ⇒ pooling off + harness defaults (e.g. an early boot-reap call).
|
|
232
481
|
*/
|
|
233
|
-
export function createLocalContainerTransportFromEnv(env) {
|
|
482
|
+
export function createLocalContainerTransportFromEnv(env, settings) {
|
|
234
483
|
const image = env.LOCAL_HARNESS_IMAGE?.trim();
|
|
235
484
|
if (!image) {
|
|
236
485
|
throw new Error('LOCAL_HARNESS_IMAGE is required for local mode: set it to the executor-harness image ref ' +
|
|
237
486
|
'(a GHCR pull or a tag built from backend/internal/executor-harness/Dockerfile).');
|
|
238
487
|
}
|
|
488
|
+
const pool = settings?.pool;
|
|
489
|
+
const extraEnv = checkoutExtraEnv(settings);
|
|
239
490
|
return new LocalContainerRunnerTransport({
|
|
240
491
|
image,
|
|
241
492
|
adapter: createRuntimeAdapter(env),
|
|
@@ -245,6 +496,17 @@ export function createLocalContainerTransportFromEnv(env) {
|
|
|
245
496
|
// which needs a privileged job container. Set to `false` for runtimes that run
|
|
246
497
|
// nested containers without it (e.g. rootless Podman).
|
|
247
498
|
privilegedTestJobs: env.LOCAL_DOCKER_PRIVILEGED_TEST_JOBS?.trim() !== 'false',
|
|
499
|
+
...(Object.keys(extraEnv).length > 0 ? { env: extraEnv } : {}),
|
|
500
|
+
// Warm pool (opt-in via the settings panel): keep idle harness containers ready and
|
|
501
|
+
// re-lease them with repo-affinity checkout reuse. size 0 keeps the per-run behaviour.
|
|
502
|
+
...(pool
|
|
503
|
+
? {
|
|
504
|
+
poolSize: pool.size,
|
|
505
|
+
poolMinWarm: pool.minWarm,
|
|
506
|
+
...(pool.max != null ? { poolMax: pool.max } : {}),
|
|
507
|
+
poolIdleTtlMs: pool.idleTtlMs,
|
|
508
|
+
}
|
|
509
|
+
: {}),
|
|
248
510
|
});
|
|
249
511
|
}
|
|
250
512
|
//# sourceMappingURL=LocalContainerRunnerTransport.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocalContainerRunnerTransport.js","sourceRoot":"","sources":["../src/LocalContainerRunnerTransport.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LocalContainerRunnerTransport.js","sourceRoot":"","sources":["../src/LocalContainerRunnerTransport.ts"],"names":[],"mappings":"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"}
|