@cat-factory/local-server 0.14.2 → 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/config.d.ts.map +1 -1
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -1
- package/dist/container.d.ts +13 -0
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +244 -17
- 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
package/dist/container.js
CHANGED
|
@@ -1,15 +1,31 @@
|
|
|
1
|
-
import { DrizzleGitHubInstallationRepository, buildNodeContainer, loadNodeConfig, } from '@cat-factory/node-server';
|
|
1
|
+
import { CryptoIdGenerator, DrizzleGitHubInstallationRepository, DrizzleLocalSettingsRepository, DrizzleRunnerPoolConnectionRepository, ProvisioningLogRecorder, SystemClock, buildNodeContainer, buildNodeResolveTransport, createDrizzleRepositories, loadNodeConfig, withProvisioningLog, } from '@cat-factory/node-server';
|
|
2
|
+
import { ConflictError } from '@cat-factory/kernel';
|
|
3
|
+
import { WorkspaceSettingsService } from '@cat-factory/orchestration';
|
|
4
|
+
import { logger } from '@cat-factory/server';
|
|
5
|
+
import { LocalSettingsService } from '@cat-factory/integrations';
|
|
6
|
+
import { NativeRoutingRunnerTransport } from './NativeRoutingRunnerTransport.js';
|
|
2
7
|
import { applyLocalDefaults } from './config.js';
|
|
3
8
|
import { createLocalGitHubClient, fetchPatAccount, githubPatCreationUrl } from './github.js';
|
|
4
9
|
import { AutoProvisioningInstallationRepository } from './installations.js';
|
|
5
10
|
import { createLocalContainerTransportFromEnv, } from './LocalContainerRunnerTransport.js';
|
|
11
|
+
import { createLocalProcessTransportFromEnv, } from './LocalProcessRunnerTransport.js';
|
|
6
12
|
import { createRuntimeAdapter } from './runtimes/index.js';
|
|
7
13
|
// The local-mode composition root. It is intentionally thin: the ENTIRE Drizzle/
|
|
8
14
|
// Postgres persistence, pg-boss durable execution, gateways and model provisioning
|
|
9
|
-
// come from `buildNodeContainer` unchanged. Local mode only swaps the
|
|
10
|
-
//
|
|
11
|
-
// - the runner backend → a per-run local container
|
|
12
|
-
// Docker/Podman/OrbStack/Colima/Apple `container
|
|
15
|
+
// come from `buildNodeContainer` unchanged. Local mode only swaps the differentiators
|
|
16
|
+
// behind the seams `buildNodeContainer` exposes:
|
|
17
|
+
// - the runner backend → host Docker by default (a per-run local container,
|
|
18
|
+
// LocalContainerRunnerTransport, Docker/Podman/OrbStack/Colima/Apple `container`,
|
|
19
|
+
// with the warm pool + per-repo checkout reuse configured from the DB local-mode
|
|
20
|
+
// settings), but PER WORKSPACE it can be delegated to the workspace's registered
|
|
21
|
+
// self-hosted runner pool (the `delegateAgentsToRunnerPool` setting) — the
|
|
22
|
+
// local-vs-external opt-in. The Tester's environment is the symmetric opt-in
|
|
23
|
+
// (`delegateTestEnvToProvider`, wired below as the tester fallback default), so a
|
|
24
|
+
// developer runs everything locally by default but can flip either concern to an
|
|
25
|
+
// external service from the UI;
|
|
26
|
+
// - optional NATIVE execution: run agents as a host process driving the developer's own
|
|
27
|
+
// installed `claude` / `codex` CLI (ambient login), bypassing Docker for the steps that
|
|
28
|
+
// use that login (`LOCAL_NATIVE_AGENTS`); everything else still runs in a container;
|
|
13
29
|
// - the push/clone token → a static GitHub PAT (`GITHUB_PAT`) instead of a GitHub
|
|
14
30
|
// App installation token.
|
|
15
31
|
// Repo resolution is unchanged: the executor still resolves a block's repo from the
|
|
@@ -27,9 +43,18 @@ export function buildLocalContainer(options) {
|
|
|
27
43
|
// ON: the Node loader only enables it for a configured GitHub App, but local mode reaches
|
|
28
44
|
// GitHub through the PAT-backed client, so the read/link endpoints (connection, available
|
|
29
45
|
// repos, "add from existing repo") should be served the same way.
|
|
46
|
+
// Native local execution (opt-in): run agents as a host process driving the developer's
|
|
47
|
+
// OWN installed `claude` / `codex` CLI (ambient login), bypassing Docker. The env is the
|
|
48
|
+
// ALLOW-LIST of subscription harnesses to run natively (`claude-code,codex`); parsed into
|
|
49
|
+
// a harness set so the executor flags `ambientAuth` ONLY for a listed harness whose vendor
|
|
50
|
+
// is that CLI's native vendor (Claude/Codex), and the personal-credential gate skips just
|
|
51
|
+
// those vendors. Default off — the container path is unchanged.
|
|
52
|
+
const nativeHarnesses = parseNativeHarnesses(env.LOCAL_NATIVE_AGENTS);
|
|
53
|
+
const nativeAgents = nativeHarnesses.length > 0;
|
|
30
54
|
const config = {
|
|
31
55
|
...base,
|
|
32
56
|
...(pat ? { github: { ...base.github, enabled: true } } : {}),
|
|
57
|
+
...(nativeAgents ? { nativeAmbientAuth: nativeHarnesses } : {}),
|
|
33
58
|
localMode: {
|
|
34
59
|
enabled: true,
|
|
35
60
|
...(pat ? {} : { githubPatSetupUrl: githubPatCreationUrl() }),
|
|
@@ -45,29 +70,181 @@ export function buildLocalContainer(options) {
|
|
|
45
70
|
const githubInstallationRepository = pat && options.db
|
|
46
71
|
? new AutoProvisioningInstallationRepository(new DrizzleGitHubInstallationRepository(options.db), resolveAccount)
|
|
47
72
|
: undefined;
|
|
48
|
-
//
|
|
49
|
-
//
|
|
50
|
-
//
|
|
73
|
+
// One shared persistence set + clock/idGenerator, reused by the per-workspace transport
|
|
74
|
+
// chooser below AND threaded into `buildNodeContainer` (which would otherwise build its
|
|
75
|
+
// own) so the chooser reads the same workspace settings the rest of the engine does.
|
|
76
|
+
const clock = new SystemClock();
|
|
77
|
+
const idGenerator = new CryptoIdGenerator();
|
|
78
|
+
const repos = options.repos ?? createDrizzleRepositories(options.db, clock);
|
|
79
|
+
const wsSettings = new WorkspaceSettingsService({
|
|
80
|
+
workspaceSettingsRepository: repos.workspaceSettingsRepository,
|
|
81
|
+
workspaceRepository: repos.workspaceRepository,
|
|
82
|
+
});
|
|
83
|
+
// The local container transport is constructed LAZILY on first dispatch, so the service
|
|
84
|
+
// still boots to serve the board (and inline kinds) when LOCAL_HARNESS_IMAGE is unset —
|
|
85
|
+
// only repo-operating container kinds then fail, loudly and with a clear message,
|
|
51
86
|
// mirroring how the Node facade treats a missing runner backend.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
87
|
+
//
|
|
88
|
+
// Native mode does NOT blanket-route every dispatch to the host process: a host process
|
|
89
|
+
// has no sandbox, so only the steps that actually use the developer's ambient CLI login
|
|
90
|
+
// (flagged `ambientAuth` by the executor) run there. Everything else — a proxy/`pi` model,
|
|
91
|
+
// or a non-native vendor reusing the claude-code harness — still runs in a per-run
|
|
92
|
+
// container (built lazily, so a Claude/Codex-only native deployment never needs an image;
|
|
93
|
+
// a proxy step without one fails loudly there). See NativeRoutingRunnerTransport.
|
|
94
|
+
// Local-mode operational settings (warm-pool sizing + per-repo checkout reuse) live in
|
|
95
|
+
// the DB as a per-deployment singleton, edited through the dedicated local-mode settings
|
|
96
|
+
// panel — they REPLACED the old LOCAL_POOL_* / HARNESS_* env vars. Built here so the
|
|
97
|
+
// serving transport resolves its pool config from it and the local-settings controller
|
|
98
|
+
// can read/write it. Requires the Drizzle db (always present for the local service).
|
|
99
|
+
// The serving container transport is built once, lazily, reading its pool + checkout
|
|
100
|
+
// config from the DB settings (not env). The promise is cached so every dispatch — and
|
|
101
|
+
// the native router's container leg — reuses the same instance (and its in-process pool).
|
|
102
|
+
// A settings edit is applied LIVE to this instance (see the service's `onChange` below),
|
|
103
|
+
// so the panel takes effect without a restart.
|
|
104
|
+
let containerTransport;
|
|
105
|
+
const localSettingsService = options.db
|
|
106
|
+
? new LocalSettingsService({
|
|
107
|
+
localSettingsRepository: new DrizzleLocalSettingsRepository(options.db),
|
|
108
|
+
clock: { now: () => Date.now() },
|
|
109
|
+
// Apply an edit to the already-built serving transport so the warm-pool + checkout
|
|
110
|
+
// config takes effect WITHOUT a restart. No-op until the transport is built (the
|
|
111
|
+
// next build reads the fresh settings anyway); a still-failing build is swallowed
|
|
112
|
+
// (a later dispatch surfaces the real problem with a clearer message).
|
|
113
|
+
onChange: async (settings) => {
|
|
114
|
+
if (!containerTransport)
|
|
115
|
+
return;
|
|
116
|
+
try {
|
|
117
|
+
;
|
|
118
|
+
(await containerTransport).applySettings(settings);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// transport build is still failing — nothing to reconfigure yet
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
})
|
|
125
|
+
: undefined;
|
|
126
|
+
const buildServingTransport = async () => {
|
|
127
|
+
const settings = await localSettingsService?.resolve();
|
|
128
|
+
const transport = createLocalContainerTransportFromEnv(env, settings);
|
|
129
|
+
// Boot housekeeping on the SERVING instance: reap exited per-run containers, drain
|
|
130
|
+
// pool members orphaned by a previous process, and pre-warm to poolMinWarm. Best
|
|
131
|
+
// -effort — if the container runtime is down this throws, but a later dispatch then
|
|
132
|
+
// fails loudly with a clearer message, so swallow it here.
|
|
133
|
+
await transport.reapExited().catch((err) => {
|
|
134
|
+
logger.warn({ err: err instanceof Error ? err.message : String(err) }, 'local mode: could not reap / pre-warm job containers at startup');
|
|
135
|
+
});
|
|
136
|
+
return transport;
|
|
137
|
+
};
|
|
138
|
+
const resolveContainerTransport = () => {
|
|
139
|
+
if (!containerTransport) {
|
|
140
|
+
containerTransport = buildServingTransport();
|
|
141
|
+
// Don't let a transient build failure (e.g. a DB blip resolving the settings) poison
|
|
142
|
+
// every future dispatch: drop the cached promise on rejection so the next call retries.
|
|
143
|
+
containerTransport.catch(() => {
|
|
144
|
+
containerTransport = undefined;
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
return containerTransport;
|
|
148
|
+
};
|
|
149
|
+
// The local-agents resolver: in native mode the per-job router (only ambient-CLI steps go
|
|
150
|
+
// to the host process, the rest to a container), otherwise the warm-pool container
|
|
151
|
+
// transport directly.
|
|
152
|
+
let routed;
|
|
153
|
+
const localAgentsResolve = () => {
|
|
154
|
+
if (nativeAgents) {
|
|
155
|
+
if (!routed) {
|
|
156
|
+
let proc;
|
|
157
|
+
routed = new NativeRoutingRunnerTransport(() => (proc ??= createLocalProcessTransportFromEnv(env)), resolveContainerTransport);
|
|
158
|
+
}
|
|
159
|
+
return Promise.resolve(routed);
|
|
160
|
+
}
|
|
161
|
+
return resolveContainerTransport();
|
|
56
162
|
};
|
|
163
|
+
// Eagerly kick off the serving transport's boot housekeeping (reap + pre-warm) when an
|
|
164
|
+
// image is configured, so a warm pool is ready before the first run rather than warming
|
|
165
|
+
// on first dispatch. Skipped without an image (the board still boots; only container
|
|
166
|
+
// kinds fail, loudly). Fire-and-forget: dispatch reuses the same cached promise.
|
|
167
|
+
if (env.LOCAL_HARNESS_IMAGE?.trim())
|
|
168
|
+
void resolveContainerTransport().catch(() => { });
|
|
169
|
+
// The runner-pool resolver (the external opt-in target). In local mode `runners` is
|
|
170
|
+
// enabled (it keys off ENCRYPTION_KEY, which `applyLocalDefaults` always sets), so this
|
|
171
|
+
// is non-null and a workspace can register a pool via the API; a native adapter injected
|
|
172
|
+
// through `options.runnerPoolProvider` drives the actual dispatch. The connection repo is
|
|
173
|
+
// also held for the start-time guard's cheap "is a pool registered?" existence check.
|
|
174
|
+
const runnerPoolConnectionRepository = new DrizzleRunnerPoolConnectionRepository(options.db);
|
|
175
|
+
const poolResolve = buildNodeResolveTransport(config, runnerPoolConnectionRepository, repos.workspaceRepository, clock, options.runnerPoolProvider);
|
|
176
|
+
// Per-branch provisioning-log tagging: the per-run local container logs under the
|
|
177
|
+
// `container` subsystem, the runner pool under `runner-pool`, so the logs drawer filters
|
|
178
|
+
// each correctly. We wrap each branch here and tell `buildNodeContainer` not to re-wrap
|
|
179
|
+
// (its single-subsystem wrap can't tell which branch a per-workspace chooser took).
|
|
180
|
+
const recorder = new ProvisioningLogRecorder({
|
|
181
|
+
repository: repos.provisioningLogRepository,
|
|
182
|
+
idGenerator,
|
|
183
|
+
clock,
|
|
184
|
+
});
|
|
185
|
+
const wrappedLocal = withProvisioningLog(localAgentsResolve, recorder, 'container');
|
|
186
|
+
const wrappedPool = poolResolve ? withProvisioningLog(poolResolve, recorder, 'runner-pool') : null;
|
|
187
|
+
// The local-vs-external agents opt-in: dispatch to the registered runner pool when the
|
|
188
|
+
// workspace opts in (and one is wrapped), else to host Docker (the warm-pool / native
|
|
189
|
+
// local backend). The pool branch's own throw surfaces a clean "register a pool" message
|
|
190
|
+
// when delegation is on but none exists.
|
|
191
|
+
const resolveTransport = async (workspaceId) => {
|
|
192
|
+
const delegate = !!workspaceId && (await wsSettings.get(workspaceId)).delegateAgentsToRunnerPool;
|
|
193
|
+
if (delegate && wrappedPool)
|
|
194
|
+
return wrappedPool(workspaceId);
|
|
195
|
+
return wrappedLocal(workspaceId);
|
|
196
|
+
};
|
|
197
|
+
// Start-time guard: refuse a run up front when the workspace delegates agents to a pool
|
|
198
|
+
// that isn't registered, so the human gets a clean 409 (an actionable message) instead of
|
|
199
|
+
// a mid-run dispatch failure. No-op when delegation is off. We throw a ConflictError for
|
|
200
|
+
// BOTH negative cases — the integration being disabled AND no pool registered for the
|
|
201
|
+
// workspace — rather than letting the pool resolver's plain Error escape (the error
|
|
202
|
+
// handler maps a non-DomainError to an opaque 500 with the message suppressed). The
|
|
203
|
+
// existence check uses `getByWorkspace` directly, so it neither decrypts the pool secrets
|
|
204
|
+
// nor builds a transport that the actual dispatch resolve would only build again.
|
|
205
|
+
const assertAgentBackendConfigured = async (workspaceId) => {
|
|
206
|
+
if (!(await wsSettings.get(workspaceId)).delegateAgentsToRunnerPool)
|
|
207
|
+
return;
|
|
208
|
+
if (!wrappedPool) {
|
|
209
|
+
throw new ConflictError('This workspace delegates container agents to a self-hosted runner pool, but the ' +
|
|
210
|
+
'runner-pool integration is not enabled on this deployment.', 'agent_backend_unconfigured');
|
|
211
|
+
}
|
|
212
|
+
if (!(await runnerPoolConnectionRepository.getByWorkspace(workspaceId))) {
|
|
213
|
+
throw new ConflictError('This workspace delegates container agents to a self-hosted runner pool, but none ' +
|
|
214
|
+
'is registered. Register one (Settings → Self-hosted runner pool) or turn ' +
|
|
215
|
+
'delegation off to run agents on host Docker, before starting.', 'agent_backend_unconfigured');
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
// The two tester-environment resolvers (used identically by the start gate and the
|
|
219
|
+
// agent-context materialisation): the local-mode default is `local` (host Docker / DinD),
|
|
220
|
+
// flipping to `ephemeral` only when the workspace opts into its environment provider; and
|
|
221
|
+
// when it opts in, the provider becomes REQUIRED so an `ephemeral` run with none connected
|
|
222
|
+
// is refused at start.
|
|
223
|
+
const resolveTesterFallbackDefault = async (workspaceId) => (await wsSettings.get(workspaceId)).delegateTestEnvToProvider ? 'ephemeral' : 'local';
|
|
224
|
+
const resolveRequireEnvironmentProvider = async (workspaceId) => (await wsSettings.get(workspaceId)).delegateTestEnvToProvider;
|
|
57
225
|
// The selected runtime decides whether the Tester's LOCAL docker-compose infra (run
|
|
58
226
|
// via Docker-in-Docker) is possible: Docker/Podman/OrbStack/Colima can nest a daemon,
|
|
59
227
|
// Apple `container` (one VM per container) cannot. Surface that capability to the
|
|
60
228
|
// engine so it refuses a local-infra Tester run on an incapable runtime ("limited
|
|
61
229
|
// mode") instead of dispatching a job that can't stand its dependencies up. Building
|
|
62
230
|
// the adapter is pure (no IO), so this is cheap even though the transport stays lazy.
|
|
63
|
-
|
|
64
|
-
|
|
231
|
+
// Native mode runs agents on the host with no per-run Docker container; the Tester's
|
|
232
|
+
// local docker-compose infra (host compose with per-run project names) is a later phase,
|
|
233
|
+
// so it's reported unsupported for now (the engine steers to "limited mode"). The
|
|
234
|
+
// container path keeps the runtime's real Docker-in-Docker capability.
|
|
235
|
+
const localTestInfraSupported = nativeAgents
|
|
236
|
+
? false
|
|
237
|
+
: createRuntimeAdapter(env).capabilities.localDind;
|
|
238
|
+
const container = buildNodeContainer({
|
|
65
239
|
...options,
|
|
66
240
|
env,
|
|
67
241
|
config,
|
|
68
|
-
|
|
69
|
-
//
|
|
242
|
+
repos,
|
|
243
|
+
// The per-workspace chooser (host Docker / native local vs the runner pool). Pre-wrapped
|
|
244
|
+
// with the correct provisioning-log subsystem per branch, so tell buildNodeContainer not
|
|
245
|
+
// to re-wrap with a single subsystem tag.
|
|
70
246
|
resolveTransport,
|
|
247
|
+
skipProvisioningLogWrap: true,
|
|
71
248
|
// Authenticate git with the developer's PAT when present. Absent → the executor
|
|
72
249
|
// falls back to the GitHub App path (and is null without it), so container kinds
|
|
73
250
|
// fail loudly rather than silently mis-running.
|
|
@@ -81,14 +258,64 @@ export function buildLocalContainer(options) {
|
|
|
81
258
|
// connected with no manual connect step.
|
|
82
259
|
...(githubInstallationRepository ? { githubInstallationRepository } : {}),
|
|
83
260
|
overrides: {
|
|
261
|
+
// The local-mode infrastructure-delegation opt-ins (per workspace). Listed BEFORE
|
|
262
|
+
// `...options.overrides` so a caller (the cross-runtime conformance harness) can pin
|
|
263
|
+
// the facade-NEUTRAL `ephemeral` tester default for the shared assertions — the local
|
|
264
|
+
// `local` default is a facade-specific behavior covered by its own tests.
|
|
265
|
+
resolveTesterFallbackDefault,
|
|
266
|
+
resolveRequireEnvironmentProvider,
|
|
267
|
+
assertAgentBackendConfigured,
|
|
84
268
|
...options.overrides,
|
|
85
269
|
// The local PAT carries `workflow` scope (the creation URL pre-selects it), so the
|
|
86
270
|
// connection isn't missing workflows: write — report it granted to suppress the
|
|
87
271
|
// advisory banner. (The App-permissions probe this normally uses needs an app JWT.)
|
|
88
272
|
...(pat ? { workflowsGranted: async () => true } : {}),
|
|
89
|
-
// Gate the Tester's local-infra mode on the runtime's Docker-in-Docker support
|
|
273
|
+
// Gate the Tester's local-infra mode on the runtime's Docker-in-Docker support
|
|
274
|
+
// (local-authoritative — after the overrides so a deployment can't accidentally
|
|
275
|
+
// claim DinD support the runtime doesn't have).
|
|
90
276
|
localTestInfraSupported,
|
|
91
277
|
},
|
|
92
278
|
});
|
|
279
|
+
// Surface the local-mode settings service so the dedicated local-settings panel can
|
|
280
|
+
// read/write the warm-pool + checkout config (the controller 503s when this is absent,
|
|
281
|
+
// which is the case on every non-local facade).
|
|
282
|
+
return localSettingsService
|
|
283
|
+
? { ...container, localSettings: { service: localSettingsService } }
|
|
284
|
+
: container;
|
|
285
|
+
}
|
|
286
|
+
/** Values that explicitly DISABLE native mode (so `LOCAL_NATIVE_AGENTS=false` means off). */
|
|
287
|
+
const NATIVE_OFF_VALUES = new Set(['false', '0', 'off', 'no', 'none', 'disabled']);
|
|
288
|
+
/** Affirmative values that enable BOTH native harnesses without naming one. */
|
|
289
|
+
const NATIVE_ALL_VALUES = new Set(['true', '1', 'on', 'yes', 'all', 'both']);
|
|
290
|
+
/**
|
|
291
|
+
* Parse `LOCAL_NATIVE_AGENTS` into the set of subscription harnesses to run natively. The
|
|
292
|
+
* documented form is a comma-separated list of harness ids (`claude-code,codex`); `claude`
|
|
293
|
+
* is accepted as an alias for `claude-code`. Blank/unset OR an explicit off value
|
|
294
|
+
* (`false`/`0`/`off`/`no`/`none`/`disabled`) ⇒ off (`[]`) — so disabling native mode never
|
|
295
|
+
* accidentally enables it. An affirmative value naming no harness (`true`/`1`/`on`/…) ⇒ BOTH
|
|
296
|
+
* native harnesses. Only `claude-code` / `codex` are ever native; any other unrecognised
|
|
297
|
+
* token is ignored. A value with neither a recognised harness nor an affirmative keyword
|
|
298
|
+
* (e.g. a typo) ⇒ off, so an unintelligible setting fails safe rather than enabling an
|
|
299
|
+
* unsandboxed, unmetered mode.
|
|
300
|
+
*/
|
|
301
|
+
export function parseNativeHarnesses(raw) {
|
|
302
|
+
const trimmed = raw?.trim().toLowerCase();
|
|
303
|
+
if (!trimmed || NATIVE_OFF_VALUES.has(trimmed))
|
|
304
|
+
return [];
|
|
305
|
+
const out = new Set();
|
|
306
|
+
let affirmative = false;
|
|
307
|
+
for (const token of trimmed.split(',').map((s) => s.trim())) {
|
|
308
|
+
if (token === 'claude-code' || token === 'claude')
|
|
309
|
+
out.add('claude-code');
|
|
310
|
+
else if (token === 'codex')
|
|
311
|
+
out.add('codex');
|
|
312
|
+
else if (NATIVE_ALL_VALUES.has(token))
|
|
313
|
+
affirmative = true;
|
|
314
|
+
}
|
|
315
|
+
if (out.size > 0)
|
|
316
|
+
return [...out];
|
|
317
|
+
// No harness named: enable both ONLY for an explicit affirmative keyword; anything else
|
|
318
|
+
// unrecognised stays off (fail-safe — see the doc comment).
|
|
319
|
+
return affirmative ? ['claude-code', 'codex'] : [];
|
|
93
320
|
}
|
|
94
321
|
//# sourceMappingURL=container.js.map
|
package/dist/container.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.js","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mCAAmC,EACnC,kBAAkB,EAClB,cAAc,
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,mCAAmC,EACnC,8BAA8B,EAC9B,qCAAqC,EACrC,uBAAuB,EACvB,WAAW,EACX,kBAAkB,EAClB,yBAAyB,EACzB,yBAAyB,EACzB,cAAc,EACd,mBAAmB,GACpB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAA;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAG5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAEhE,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAA;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAC5F,OAAO,EAAE,sCAAsC,EAAmB,MAAM,oBAAoB,CAAA;AAC5F,OAAO,EAEL,oCAAoC,GACrC,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EAEL,kCAAkC,GACnC,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE1D,iFAAiF;AACjF,mFAAmF;AACnF,sFAAsF;AACtF,iDAAiD;AACjD,8EAA8E;AAC9E,sFAAsF;AACtF,qFAAqF;AACrF,qFAAqF;AACrF,+EAA+E;AAC/E,iFAAiF;AACjF,sFAAsF;AACtF,qFAAqF;AACrF,oCAAoC;AACpC,0FAA0F;AAC1F,4FAA4F;AAC5F,yFAAyF;AACzF,oFAAoF;AACpF,8BAA8B;AAC9B,oFAAoF;AACpF,mFAAmF;AACnF,8EAA8E;AAC9E,sFAAsF;AACtF,sCAAsC;AAEtC,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAC/D,MAAM,GAAG,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,CAAA;IAC1D,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAA;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC,GAAG,CAAC,CAAA;IAClD,uFAAuF;IACvF,wFAAwF;IACxF,wFAAwF;IACxF,0FAA0F;IAC1F,0FAA0F;IAC1F,kEAAkE;IAClE,wFAAwF;IACxF,yFAAyF;IACzF,0FAA0F;IAC1F,2FAA2F;IAC3F,0FAA0F;IAC1F,gEAAgE;IAChE,MAAM,eAAe,GAAG,oBAAoB,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;IACrE,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,CAAA;IAC/C,MAAM,MAAM,GAAc;QACxB,GAAG,IAAI;QACP,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,SAAS,EAAE;YACT,OAAO,EAAE,IAAI;YACb,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,EAAE,CAAC;SAC9D;KACF,CAAA;IAED,uFAAuF;IACvF,yFAAyF;IACzF,wFAAwF;IACxF,iFAAiF;IACjF,2CAA2C;IAC3C,IAAI,cAA+C,CAAA;IACnD,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,CAAC,cAAc,KAAK,eAAe,CAAC,GAAG,CAAC,CAAC,CAAA;IACtE,MAAM,4BAA4B,GAChC,GAAG,IAAI,OAAO,CAAC,EAAE;QACf,CAAC,CAAC,IAAI,sCAAsC,CACxC,IAAI,mCAAmC,CAAC,OAAO,CAAC,EAAE,CAAC,EACnD,cAAc,CACf;QACH,CAAC,CAAC,SAAS,CAAA;IAEf,wFAAwF;IACxF,wFAAwF;IACxF,qFAAqF;IACrF,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAA;IAC/B,MAAM,WAAW,GAAG,IAAI,iBAAiB,EAAE,CAAA;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,yBAAyB,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;IAC3E,MAAM,UAAU,GAAG,IAAI,wBAAwB,CAAC;QAC9C,2BAA2B,EAAE,KAAK,CAAC,2BAA2B;QAC9D,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;KAC/C,CAAC,CAAA;IAEF,wFAAwF;IACxF,wFAAwF;IACxF,kFAAkF;IAClF,iEAAiE;IACjE,EAAE;IACF,wFAAwF;IACxF,wFAAwF;IACxF,2FAA2F;IAC3F,mFAAmF;IACnF,0FAA0F;IAC1F,kFAAkF;IAClF,uFAAuF;IACvF,yFAAyF;IACzF,qFAAqF;IACrF,uFAAuF;IACvF,qFAAqF;IACrF,qFAAqF;IACrF,uFAAuF;IACvF,0FAA0F;IAC1F,yFAAyF;IACzF,+CAA+C;IAC/C,IAAI,kBAAsE,CAAA;IAE1E,MAAM,oBAAoB,GAAG,OAAO,CAAC,EAAE;QACrC,CAAC,CAAC,IAAI,oBAAoB,CAAC;YACvB,uBAAuB,EAAE,IAAI,8BAA8B,CAAC,OAAO,CAAC,EAAE,CAAC;YACvE,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE;YAChC,mFAAmF;YACnF,iFAAiF;YACjF,kFAAkF;YAClF,uEAAuE;YACvE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;gBAC3B,IAAI,CAAC,kBAAkB;oBAAE,OAAM;gBAC/B,IAAI,CAAC;oBACH,CAAC;oBAAA,CAAC,MAAM,kBAAkB,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;gBACrD,CAAC;gBAAC,MAAM,CAAC;oBACP,gEAAgE;gBAClE,CAAC;YACH,CAAC;SACF,CAAC;QACJ,CAAC,CAAC,SAAS,CAAA;IACb,MAAM,qBAAqB,GAAG,KAAK,IAA4C,EAAE;QAC/E,MAAM,QAAQ,GAAG,MAAM,oBAAoB,EAAE,OAAO,EAAE,CAAA;QACtD,MAAM,SAAS,GAAG,oCAAoC,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;QACrE,mFAAmF;QACnF,iFAAiF;QACjF,oFAAoF;QACpF,2DAA2D;QAC3D,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACzC,MAAM,CAAC,IAAI,CACT,EAAE,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACzD,iEAAiE,CAClE,CAAA;QACH,CAAC,CAAC,CAAA;QACF,OAAO,SAAS,CAAA;IAClB,CAAC,CAAA;IACD,MAAM,yBAAyB,GAAG,GAA2C,EAAE;QAC7E,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,kBAAkB,GAAG,qBAAqB,EAAE,CAAA;YAC5C,qFAAqF;YACrF,wFAAwF;YACxF,kBAAkB,CAAC,KAAK,CAAC,GAAG,EAAE;gBAC5B,kBAAkB,GAAG,SAAS,CAAA;YAChC,CAAC,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,kBAAkB,CAAA;IAC3B,CAAC,CAAA;IAED,0FAA0F;IAC1F,mFAAmF;IACnF,sBAAsB;IACtB,IAAI,MAAmC,CAAA;IACvC,MAAM,kBAAkB,GAA2B,GAAG,EAAE;QACtD,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,IAAI,IAA6C,CAAA;gBACjD,MAAM,GAAG,IAAI,4BAA4B,CACvC,GAAG,EAAE,CAAC,CAAC,IAAI,KAAK,kCAAkC,CAAC,GAAG,CAAC,CAAC,EACxD,yBAAyB,CAC1B,CAAA;YACH,CAAC;YACD,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAChC,CAAC;QACD,OAAO,yBAAyB,EAAE,CAAA;IACpC,CAAC,CAAA;IAED,uFAAuF;IACvF,wFAAwF;IACxF,qFAAqF;IACrF,iFAAiF;IACjF,IAAI,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE;QAAE,KAAK,yBAAyB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAErF,oFAAoF;IACpF,wFAAwF;IACxF,yFAAyF;IACzF,0FAA0F;IAC1F,sFAAsF;IACtF,MAAM,8BAA8B,GAAG,IAAI,qCAAqC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC5F,MAAM,WAAW,GAAG,yBAAyB,CAC3C,MAAM,EACN,8BAA8B,EAC9B,KAAK,CAAC,mBAAmB,EACzB,KAAK,EACL,OAAO,CAAC,kBAAkB,CAC3B,CAAA;IAED,kFAAkF;IAClF,yFAAyF;IACzF,wFAAwF;IACxF,oFAAoF;IACpF,MAAM,QAAQ,GAAG,IAAI,uBAAuB,CAAC;QAC3C,UAAU,EAAE,KAAK,CAAC,yBAAyB;QAC3C,WAAW;QACX,KAAK;KACN,CAAC,CAAA;IACF,MAAM,YAAY,GAAG,mBAAmB,CAAC,kBAAkB,EAAE,QAAQ,EAAE,WAAW,CAAE,CAAA;IACpF,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,mBAAmB,CAAC,WAAW,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAElG,uFAAuF;IACvF,sFAAsF;IACtF,yFAAyF;IACzF,yCAAyC;IACzC,MAAM,gBAAgB,GAA2B,KAAK,EAAE,WAAW,EAAE,EAAE;QACrE,MAAM,QAAQ,GAAG,CAAC,CAAC,WAAW,IAAI,CAAC,MAAM,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,0BAA0B,CAAA;QAChG,IAAI,QAAQ,IAAI,WAAW;YAAE,OAAO,WAAW,CAAC,WAAW,CAAC,CAAA;QAC5D,OAAO,YAAY,CAAC,WAAW,CAAC,CAAA;IAClC,CAAC,CAAA;IAED,wFAAwF;IACxF,0FAA0F;IAC1F,yFAAyF;IACzF,sFAAsF;IACtF,oFAAoF;IACpF,oFAAoF;IACpF,0FAA0F;IAC1F,kFAAkF;IAClF,MAAM,4BAA4B,GAAG,KAAK,EAAE,WAAmB,EAAiB,EAAE;QAChF,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,0BAA0B;YAAE,OAAM;QAC3E,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,aAAa,CACrB,kFAAkF;gBAChF,4DAA4D,EAC9D,4BAA4B,CAC7B,CAAA;QACH,CAAC;QACD,IAAI,CAAC,CAAC,MAAM,8BAA8B,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;YACxE,MAAM,IAAI,aAAa,CACrB,mFAAmF;gBACjF,2EAA2E;gBAC3E,+DAA+D,EACjE,4BAA4B,CAC7B,CAAA;QACH,CAAC;IACH,CAAC,CAAA;IAED,mFAAmF;IACnF,0FAA0F;IAC1F,0FAA0F;IAC1F,2FAA2F;IAC3F,uBAAuB;IACvB,MAAM,4BAA4B,GAAG,KAAK,EACxC,WAAmB,EACa,EAAE,CAClC,CAAC,MAAM,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAA;IACvF,MAAM,iCAAiC,GAAG,KAAK,EAAE,WAAmB,EAAoB,EAAE,CACxF,CAAC,MAAM,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,yBAAyB,CAAA;IAE/D,oFAAoF;IACpF,sFAAsF;IACtF,kFAAkF;IAClF,kFAAkF;IAClF,qFAAqF;IACrF,sFAAsF;IACtF,qFAAqF;IACrF,yFAAyF;IACzF,kFAAkF;IAClF,uEAAuE;IACvE,MAAM,uBAAuB,GAAG,YAAY;QAC1C,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,SAAS,CAAA;IAEpD,MAAM,SAAS,GAAG,kBAAkB,CAAC;QACnC,GAAG,OAAO;QACV,GAAG;QACH,MAAM;QACN,KAAK;QACL,yFAAyF;QACzF,yFAAyF;QACzF,0CAA0C;QAC1C,gBAAgB;QAChB,uBAAuB,EAAE,IAAI;QAC7B,gFAAgF;QAChF,iFAAiF;QACjF,gDAAgD;QAChD,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,mFAAmF;QACnF,sFAAsF;QACtF,sFAAsF;QACtF,4CAA4C;QAC5C,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,uBAAuB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,qFAAqF;QACrF,yCAAyC;QACzC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC,EAAE,4BAA4B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,SAAS,EAAE;YACT,kFAAkF;YAClF,qFAAqF;YACrF,sFAAsF;YACtF,0EAA0E;YAC1E,4BAA4B;YAC5B,iCAAiC;YACjC,4BAA4B;YAC5B,GAAG,OAAO,CAAC,SAAS;YACpB,mFAAmF;YACnF,gFAAgF;YAChF,oFAAoF;YACpF,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,EAAE,gBAAgB,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,EAAuC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5F,+EAA+E;YAC/E,gFAAgF;YAChF,gDAAgD;YAChD,uBAAuB;SACY;KACtC,CAAC,CAAA;IAEF,oFAAoF;IACpF,uFAAuF;IACvF,gDAAgD;IAChD,OAAO,oBAAoB;QACzB,CAAC,CAAC,EAAE,GAAG,SAAS,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,oBAAoB,EAAE,EAAE;QACpE,CAAC,CAAC,SAAS,CAAA;AACf,CAAC;AAED,6FAA6F;AAC7F,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;AAClF,+EAA+E;AAC/E,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;AAE5E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAuB;IAC1D,MAAM,OAAO,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACzC,IAAI,CAAC,OAAO,IAAI,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAA;IACzD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAe,CAAA;IAClC,IAAI,WAAW,GAAG,KAAK,CAAA;IACvB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC5D,IAAI,KAAK,KAAK,aAAa,IAAI,KAAK,KAAK,QAAQ;YAAE,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;aACpE,IAAI,KAAK,KAAK,OAAO;YAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;aACvC,IAAI,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,WAAW,GAAG,IAAI,CAAA;IAC3D,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,GAAG,CAAC,CAAA;IACjC,wFAAwF;IACxF,4DAA4D;IAC5D,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AACpD,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { RunnerJobView } from '@cat-factory/kernel';
|
|
2
|
+
/**
|
|
3
|
+
* The failed-poll error the engine classifies as a container eviction (matched by
|
|
4
|
+
* orchestration `isContainerEvictionError`, also used by the bootstrap flow). A
|
|
5
|
+
* vanished/exited harness maps to it so the run stops and the stale-run sweeper can
|
|
6
|
+
* re-drive it — mirroring the Worker transport's 404 mapping.
|
|
7
|
+
*/
|
|
8
|
+
export declare const EVICTION_ERROR = "Job not found (container evicted or crashed)";
|
|
9
|
+
/** The shared-secret header sent on every harness call. */
|
|
10
|
+
export declare const SECRET_HEADER = "x-harness-secret";
|
|
11
|
+
/** Where a harness instance is reachable. */
|
|
12
|
+
export interface HarnessEndpoint {
|
|
13
|
+
host: string;
|
|
14
|
+
port: number;
|
|
15
|
+
}
|
|
16
|
+
export declare const harnessUrl: (endpoint: HarnessEndpoint, path: string) => string;
|
|
17
|
+
export declare const delay: (ms: number) => Promise<void>;
|
|
18
|
+
/** A bounded, never-throwing read of a response body for an error message. */
|
|
19
|
+
export declare function safeText(res: Response): Promise<string>;
|
|
20
|
+
/** POST a job body to the harness `/jobs`, throwing a `<label>`-prefixed error on non-OK. */
|
|
21
|
+
export declare function postHarnessJob(opts: {
|
|
22
|
+
fetchImpl: typeof fetch;
|
|
23
|
+
endpoint: HarnessEndpoint;
|
|
24
|
+
secret: string;
|
|
25
|
+
body: Record<string, unknown>;
|
|
26
|
+
timeoutMs: number;
|
|
27
|
+
label: string;
|
|
28
|
+
}): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* GET a harness job view by id. A 404 (job unknown/reaped, or the harness was recreated)
|
|
31
|
+
* maps to an eviction view; a connection error consults `isDead` — true ⇒ eviction (the
|
|
32
|
+
* backend is gone), false ⇒ rethrow the transient error so the caller retries. Any other
|
|
33
|
+
* non-OK status throws a `<label>`-prefixed error. `isDead` is also where the caller
|
|
34
|
+
* performs its own cleanup (drop a dead pool member / clear a stale cache entry).
|
|
35
|
+
*/
|
|
36
|
+
export declare function pollHarnessJob(opts: {
|
|
37
|
+
fetchImpl: typeof fetch;
|
|
38
|
+
endpoint: HarnessEndpoint;
|
|
39
|
+
jobId: string;
|
|
40
|
+
secret: string;
|
|
41
|
+
timeoutMs: number;
|
|
42
|
+
label: string;
|
|
43
|
+
isDead: () => boolean | Promise<boolean>;
|
|
44
|
+
}): Promise<RunnerJobView>;
|
|
45
|
+
/** A single quick `/health` probe (no retry); false on any error/non-OK. */
|
|
46
|
+
export declare function harnessHealthy(fetchImpl: typeof fetch, endpoint: HarnessEndpoint, requestTimeoutMs: number): Promise<boolean>;
|
|
47
|
+
/** Poll `/health` until OK or the deadline, throwing on timeout (or if `isDead` fires). */
|
|
48
|
+
export declare function waitForHarnessHealth(opts: {
|
|
49
|
+
fetchImpl: typeof fetch;
|
|
50
|
+
endpoint: HarnessEndpoint;
|
|
51
|
+
readyTimeoutMs: number;
|
|
52
|
+
requestTimeoutMs: number;
|
|
53
|
+
intervalMs?: number;
|
|
54
|
+
isDead?: () => boolean;
|
|
55
|
+
deadError?: string;
|
|
56
|
+
timeoutError: string;
|
|
57
|
+
}): Promise<void>;
|
|
58
|
+
//# sourceMappingURL=harnessHttp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harnessHttp.d.ts","sourceRoot":"","sources":["../src/harnessHttp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAUxD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,iDAAiD,CAAA;AAE5E,2DAA2D;AAC3D,eAAO,MAAM,aAAa,qBAAqB,CAAA;AAE/C,6CAA6C;AAC7C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,eAAO,MAAM,UAAU,aAAc,eAAe,QAAQ,MAAM,KAAG,MAClB,CAAA;AAEnD,eAAO,MAAM,KAAK,OAAQ,MAAM,KAAG,OAAO,CAAC,IAAI,CACU,CAAA;AAEzD,8EAA8E;AAC9E,wBAAsB,QAAQ,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAM7D;AAED,6FAA6F;AAC7F,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,SAAS,EAAE,OAAO,KAAK,CAAA;IACvB,QAAQ,EAAE,eAAe,CAAA;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;CACd,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,SAAS,EAAE,OAAO,KAAK,CAAA;IACvB,QAAQ,EAAE,eAAe,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACzC,GAAG,OAAO,CAAC,aAAa,CAAC,CAoBzB;AAED,4EAA4E;AAC5E,wBAAsB,cAAc,CAClC,SAAS,EAAE,OAAO,KAAK,EACvB,QAAQ,EAAE,eAAe,EACzB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,OAAO,CAAC,CAUlB;AAED,2FAA2F;AAC3F,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,SAAS,EAAE,OAAO,KAAK,CAAA;IACvB,QAAQ,EAAE,eAAe,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB,gBAAgB,EAAE,MAAM,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,OAAO,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;CACrB,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhB"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// Shared HTTP plumbing for talking to an executor-harness instance over its `/jobs` +
|
|
2
|
+
// `/health` API. Both local runner transports — the per-run/pooled CONTAINER transport
|
|
3
|
+
// (LocalContainerRunnerTransport) and the native HOST-PROCESS transport
|
|
4
|
+
// (LocalProcessRunnerTransport) — speak the identical protocol, so it lives here ONCE
|
|
5
|
+
// rather than being copied between them: a protocol change (a header, the request shape,
|
|
6
|
+
// or the eviction-marker string orchestration's `isContainerEvictionError` matches) is
|
|
7
|
+
// then made in a single place instead of silently drifting per transport.
|
|
8
|
+
/**
|
|
9
|
+
* The failed-poll error the engine classifies as a container eviction (matched by
|
|
10
|
+
* orchestration `isContainerEvictionError`, also used by the bootstrap flow). A
|
|
11
|
+
* vanished/exited harness maps to it so the run stops and the stale-run sweeper can
|
|
12
|
+
* re-drive it — mirroring the Worker transport's 404 mapping.
|
|
13
|
+
*/
|
|
14
|
+
export const EVICTION_ERROR = 'Job not found (container evicted or crashed)';
|
|
15
|
+
/** The shared-secret header sent on every harness call. */
|
|
16
|
+
export const SECRET_HEADER = 'x-harness-secret';
|
|
17
|
+
export const harnessUrl = (endpoint, path) => `http://${endpoint.host}:${endpoint.port}${path}`;
|
|
18
|
+
export const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
19
|
+
/** A bounded, never-throwing read of a response body for an error message. */
|
|
20
|
+
export async function safeText(res) {
|
|
21
|
+
try {
|
|
22
|
+
return (await res.text()).slice(0, 500);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return '(no body)';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** POST a job body to the harness `/jobs`, throwing a `<label>`-prefixed error on non-OK. */
|
|
29
|
+
export async function postHarnessJob(opts) {
|
|
30
|
+
const res = await opts.fetchImpl(harnessUrl(opts.endpoint, '/jobs'), {
|
|
31
|
+
method: 'POST',
|
|
32
|
+
headers: { 'content-type': 'application/json', [SECRET_HEADER]: opts.secret },
|
|
33
|
+
body: JSON.stringify(opts.body),
|
|
34
|
+
signal: AbortSignal.timeout(opts.timeoutMs),
|
|
35
|
+
});
|
|
36
|
+
if (!res.ok) {
|
|
37
|
+
throw new Error(`${opts.label} dispatch failed (HTTP ${res.status}): ${await safeText(res)}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* GET a harness job view by id. A 404 (job unknown/reaped, or the harness was recreated)
|
|
42
|
+
* maps to an eviction view; a connection error consults `isDead` — true ⇒ eviction (the
|
|
43
|
+
* backend is gone), false ⇒ rethrow the transient error so the caller retries. Any other
|
|
44
|
+
* non-OK status throws a `<label>`-prefixed error. `isDead` is also where the caller
|
|
45
|
+
* performs its own cleanup (drop a dead pool member / clear a stale cache entry).
|
|
46
|
+
*/
|
|
47
|
+
export async function pollHarnessJob(opts) {
|
|
48
|
+
let res;
|
|
49
|
+
try {
|
|
50
|
+
res = await opts.fetchImpl(harnessUrl(opts.endpoint, `/jobs/${encodeURIComponent(opts.jobId)}`), {
|
|
51
|
+
method: 'GET',
|
|
52
|
+
headers: { [SECRET_HEADER]: opts.secret },
|
|
53
|
+
signal: AbortSignal.timeout(opts.timeoutMs),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
if (await opts.isDead())
|
|
58
|
+
return { state: 'failed', error: EVICTION_ERROR };
|
|
59
|
+
throw err;
|
|
60
|
+
}
|
|
61
|
+
if (res.status === 404)
|
|
62
|
+
return { state: 'failed', error: EVICTION_ERROR };
|
|
63
|
+
if (!res.ok) {
|
|
64
|
+
throw new Error(`${opts.label} job poll failed (HTTP ${res.status}): ${await safeText(res)}`);
|
|
65
|
+
}
|
|
66
|
+
return (await res.json());
|
|
67
|
+
}
|
|
68
|
+
/** A single quick `/health` probe (no retry); false on any error/non-OK. */
|
|
69
|
+
export async function harnessHealthy(fetchImpl, endpoint, requestTimeoutMs) {
|
|
70
|
+
try {
|
|
71
|
+
const res = await fetchImpl(harnessUrl(endpoint, '/health'), {
|
|
72
|
+
method: 'GET',
|
|
73
|
+
signal: AbortSignal.timeout(Math.min(requestTimeoutMs, 5_000)),
|
|
74
|
+
});
|
|
75
|
+
return res.ok;
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** Poll `/health` until OK or the deadline, throwing on timeout (or if `isDead` fires). */
|
|
82
|
+
export async function waitForHarnessHealth(opts) {
|
|
83
|
+
const deadline = Date.now() + opts.readyTimeoutMs;
|
|
84
|
+
for (;;) {
|
|
85
|
+
if (opts.isDead?.()) {
|
|
86
|
+
throw new Error(opts.deadError ?? 'the harness exited before becoming healthy');
|
|
87
|
+
}
|
|
88
|
+
if (await harnessHealthy(opts.fetchImpl, opts.endpoint, opts.requestTimeoutMs))
|
|
89
|
+
return;
|
|
90
|
+
if (Date.now() >= deadline)
|
|
91
|
+
throw new Error(opts.timeoutError);
|
|
92
|
+
await delay(opts.intervalMs ?? 300);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=harnessHttp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harnessHttp.js","sourceRoot":"","sources":["../src/harnessHttp.ts"],"names":[],"mappings":"AAEA,sFAAsF;AACtF,uFAAuF;AACvF,wEAAwE;AACxE,sFAAsF;AACtF,yFAAyF;AACzF,uFAAuF;AACvF,0EAA0E;AAE1E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,8CAA8C,CAAA;AAE5E,2DAA2D;AAC3D,MAAM,CAAC,MAAM,aAAa,GAAG,kBAAkB,CAAA;AAQ/C,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,QAAyB,EAAE,IAAY,EAAU,EAAE,CAC5E,UAAU,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,GAAG,IAAI,EAAE,CAAA;AAEnD,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CACjD,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAEzD,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAa;IAC1C,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,WAAW,CAAA;IACpB,CAAC;AACH,CAAC;AAED,6FAA6F;AAC7F,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAOpC;IACC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE;QACnE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE;QAC7E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;KAC5C,CAAC,CAAA;IACF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,0BAA0B,GAAG,CAAC,MAAM,MAAM,MAAM,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC/F,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAQpC;IACC,IAAI,GAAa,CAAA;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CACxB,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EACpE;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE;YACzC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;SAC5C,CACF,CAAA;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE;YAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,CAAA;QAC1E,MAAM,GAAG,CAAA;IACX,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,CAAA;IACzE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,0BAA0B,GAAG,CAAC,MAAM,MAAM,MAAM,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC/F,CAAC;IACD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAkB,CAAA;AAC5C,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAAuB,EACvB,QAAyB,EACzB,gBAAwB;IAExB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE;YAC3D,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;SAC/D,CAAC,CAAA;QACF,OAAO,GAAG,CAAC,EAAE,CAAA;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,2FAA2F;AAC3F,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAS1C;IACC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,CAAA;IACjD,SAAS,CAAC;QACR,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,4CAA4C,CAAC,CAAA;QACjF,CAAC;QACD,IAAI,MAAM,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,CAAC;YAAE,OAAM;QACtF,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAC9D,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,CAAA;IACrC,CAAC;AACH,CAAC"}
|
|
@@ -5,6 +5,7 @@ export declare class AppleContainerRuntimeAdapter implements ContainerRuntimeAda
|
|
|
5
5
|
readonly hostAlias: string;
|
|
6
6
|
readonly capabilities: {
|
|
7
7
|
localDind: boolean;
|
|
8
|
+
pooling: boolean;
|
|
8
9
|
};
|
|
9
10
|
constructor(options: {
|
|
10
11
|
binary?: string;
|
|
@@ -17,5 +18,7 @@ export declare class AppleContainerRuntimeAdapter implements ContainerRuntimeAda
|
|
|
17
18
|
remove(exec: ContainerExec, containerId: string): Promise<void>;
|
|
18
19
|
removeRun(exec: ContainerExec, runId: string): Promise<void>;
|
|
19
20
|
reapExited(exec: ContainerExec): Promise<number>;
|
|
21
|
+
/** Apple `container` doesn't support the warm pool (see capabilities.pooling=false). */
|
|
22
|
+
listPoolMembers(): Promise<string[]>;
|
|
20
23
|
}
|
|
21
24
|
//# sourceMappingURL=appleContainerRuntime.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appleContainerRuntime.d.ts","sourceRoot":"","sources":["../../src/runtimes/appleContainerRuntime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAE5B,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAA;AA0H9B,qBAAa,4BAA6B,YAAW,uBAAuB;IAC1E,QAAQ,CAAC,EAAE,EAAG,OAAO,CAAS;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"appleContainerRuntime.d.ts","sourceRoot":"","sources":["../../src/runtimes/appleContainerRuntime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAE5B,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAA;AA0H9B,qBAAa,4BAA6B,YAAW,uBAAuB;IAC1E,QAAQ,CAAC,EAAE,EAAG,OAAO,CAAS;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAI1B,QAAQ,CAAC,YAAY;QAAK,SAAS;QAAS,OAAO;MAAS;IAE5D,YAAY,OAAO,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAG1D;IAEK,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBtE;IAEK,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAQ1E;IAEK,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAI/F;IAEK,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAM1E;IAEK,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpE;IAEK,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjE;IAEK,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAYrD;IAED,wFAAwF;IAClF,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAEzC;CACF"}
|
|
@@ -118,7 +118,10 @@ export class AppleContainerRuntimeAdapter {
|
|
|
118
118
|
id = 'apple';
|
|
119
119
|
binary;
|
|
120
120
|
hostAlias;
|
|
121
|
-
|
|
121
|
+
// One-VM-per-container with a deterministic-name identity: no Docker-in-Docker, and the
|
|
122
|
+
// warm pool isn't supported (re-leasing a name-keyed VM is messy) — so the transport
|
|
123
|
+
// keeps the per-run path here even when a pool size is configured.
|
|
124
|
+
capabilities = { localDind: false, pooling: false };
|
|
122
125
|
constructor(options) {
|
|
123
126
|
this.binary = options.binary ?? 'container';
|
|
124
127
|
this.hostAlias = options.hostAlias;
|
|
@@ -187,5 +190,9 @@ export class AppleContainerRuntimeAdapter {
|
|
|
187
190
|
}
|
|
188
191
|
return rows.length;
|
|
189
192
|
}
|
|
193
|
+
/** Apple `container` doesn't support the warm pool (see capabilities.pooling=false). */
|
|
194
|
+
async listPoolMembers() {
|
|
195
|
+
return [];
|
|
196
|
+
}
|
|
190
197
|
}
|
|
191
198
|
//# sourceMappingURL=appleContainerRuntime.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appleContainerRuntime.js","sourceRoot":"","sources":["../../src/runtimes/appleContainerRuntime.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"appleContainerRuntime.js","sourceRoot":"","sources":["../../src/runtimes/appleContainerRuntime.ts"],"names":[],"mappings":"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"}
|