@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.
Files changed (39) hide show
  1. package/dist/LocalContainerRunnerTransport.d.ts +97 -9
  2. package/dist/LocalContainerRunnerTransport.d.ts.map +1 -1
  3. package/dist/LocalContainerRunnerTransport.js +355 -93
  4. package/dist/LocalContainerRunnerTransport.js.map +1 -1
  5. package/dist/LocalProcessRunnerTransport.d.ts +63 -0
  6. package/dist/LocalProcessRunnerTransport.d.ts.map +1 -0
  7. package/dist/LocalProcessRunnerTransport.js +188 -0
  8. package/dist/LocalProcessRunnerTransport.js.map +1 -0
  9. package/dist/NativeRoutingRunnerTransport.d.ts +20 -0
  10. package/dist/NativeRoutingRunnerTransport.d.ts.map +1 -0
  11. package/dist/NativeRoutingRunnerTransport.js +50 -0
  12. package/dist/NativeRoutingRunnerTransport.js.map +1 -0
  13. package/dist/container.d.ts +13 -0
  14. package/dist/container.d.ts.map +1 -1
  15. package/dist/container.js +165 -22
  16. package/dist/container.js.map +1 -1
  17. package/dist/harnessHttp.d.ts +58 -0
  18. package/dist/harnessHttp.d.ts.map +1 -0
  19. package/dist/harnessHttp.js +95 -0
  20. package/dist/harnessHttp.js.map +1 -0
  21. package/dist/runtimes/appleContainerRuntime.d.ts +3 -0
  22. package/dist/runtimes/appleContainerRuntime.d.ts.map +1 -1
  23. package/dist/runtimes/appleContainerRuntime.js +8 -1
  24. package/dist/runtimes/appleContainerRuntime.js.map +1 -1
  25. package/dist/runtimes/containerRuntime.d.ts +30 -1
  26. package/dist/runtimes/containerRuntime.d.ts.map +1 -1
  27. package/dist/runtimes/containerRuntime.js +5 -0
  28. package/dist/runtimes/containerRuntime.js.map +1 -1
  29. package/dist/runtimes/dockerRuntime.d.ts +4 -0
  30. package/dist/runtimes/dockerRuntime.d.ts.map +1 -1
  31. package/dist/runtimes/dockerRuntime.js +21 -2
  32. package/dist/runtimes/dockerRuntime.js.map +1 -1
  33. package/dist/runtimes/index.d.ts.map +1 -1
  34. package/dist/runtimes/index.js +1 -0
  35. package/dist/runtimes/index.js.map +1 -1
  36. package/dist/server.d.ts.map +1 -1
  37. package/dist/server.js +4 -14
  38. package/dist/server.js.map +1 -1
  39. 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
- const res = await this.fetchImpl(this.url(resolved, '/jobs'), {
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
- let res;
120
- try {
121
- // Address the per-RUN container, but read the per-step job by its own id.
122
- res = await this.fetchImpl(this.url(resolved, `/jobs/${encodeURIComponent(ref.jobId)}`), {
123
- method: 'GET',
124
- headers: { [SECRET_HEADER]: this.sharedSecret },
125
- signal: AbortSignal.timeout(this.requestTimeoutMs),
126
- });
127
- }
128
- catch (err) {
129
- // Connection refused / DNS gone: the container most likely exited. Confirm via
130
- // the runtime — if it is no longer running, report an eviction so the run stops;
131
- // otherwise surface the transient error so the caller can retry.
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 { state: 'failed', error: EVICTION_ERROR };
135
- }
136
- throw err;
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
- return this.adapter.reapExited(this.exec);
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
- // --- internals ----------------------------------------------------------
168
- url(endpoint, path) {
169
- return `http://${endpoint.host}:${endpoint.port}${path}`;
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
- async waitForHealth(endpoint) {
199
- const deadline = Date.now() + this.readyTimeoutMs;
200
- for (;;) {
201
- try {
202
- const res = await this.fetchImpl(this.url(endpoint, '/health'), {
203
- method: 'GET',
204
- signal: AbortSignal.timeout(Math.min(this.requestTimeoutMs, 5_000)),
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
- async function safeText(res) {
220
- try {
221
- return (await res.text()).slice(0, 500);
222
- }
223
- catch {
224
- return '(no body)';
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. The image
229
- * ref (`LOCAL_HARNESS_IMAGE`) is required; the runtime adapter is selected by
230
- * `LOCAL_CONTAINER_RUNTIME` (docker | podman | orbstack | colima | apple); everything
231
- * else has sane local defaults.
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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"}