@outerlayer/cli 0.34.0-next.20261026214534 → 0.34.0-next.20261026230708
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/README.md +12 -4
- package/dist/{build-BBWAD5LR.js → build-M4UYZAFH.js} +3 -2
- package/dist/{build-disk-TGLM5XK7.js → build-disk-ZDVSSHO2.js} +3 -2
- package/dist/build-info.json +1 -1
- package/dist/{builder-FD53GTWL.js → builder-IORYS76D.js} +2 -1
- package/dist/{check-FOWN6M3C.js → check-V66LZDNK.js} +15 -14
- package/dist/{chunk-T2HH7IHT.js → chunk-63A6NUEZ.js} +1 -1
- package/dist/{chunk-3HJMY3H5.js → chunk-6NXBXWOP.js} +1 -1
- package/dist/{chunk-3PUOHONX.js → chunk-DFBY6LX3.js} +6 -5
- package/dist/{chunk-RNMCFAYH.js → chunk-F5H3LVHR.js} +2 -2
- package/dist/chunk-HDLON3RJ.js +274 -0
- package/dist/{chunk-FVF2LMVG.js → chunk-IZVDQXTC.js} +9 -9
- package/dist/{chunk-LY62UHRR.js → chunk-JZLMFYFM.js} +1 -1
- package/dist/{chunk-XYLHSCLR.js → chunk-KOZ6IBEI.js} +8 -279
- package/dist/{chunk-K3ACC2CV.js → chunk-MIRCFK4X.js} +2 -33
- package/dist/{chunk-5ZBVKRDK.js → chunk-PN7RMFPP.js} +2 -2
- package/dist/{chunk-BQQPDBSF.js → chunk-Q3L5AC75.js} +2 -2
- package/dist/{chunk-2GDKM2O4.js → chunk-T6HSNQAT.js} +4 -4
- package/dist/{chunk-KR2TIRNQ.js → chunk-T7HUNNJ2.js} +30 -16
- package/dist/{chunk-JKLSQOYO.js → chunk-TGBST2QL.js} +11 -7
- package/dist/{chunk-3NCWHEGM.js → chunk-TLIZ7FY4.js} +2 -2
- package/dist/{chunk-XHZBLIB2.js → chunk-XDJ376OP.js} +7 -1
- package/dist/{chunk-ZADRW2V2.js → chunk-XLJXO4QC.js} +4 -4
- package/dist/{cli-3RDQSLYI.js → cli-HQWQEHXJ.js} +79 -44
- package/dist/{command-C5YKBTK4.js → command-TONUMZ2A.js} +8 -7
- package/dist/{config-EBT5VYPX.js → config-4K6OG2SZ.js} +4 -3
- package/dist/{container-start-RLX2PL3C.js → container-start-R74IO7CI.js} +12 -11
- package/dist/demo-record-cmd-7HJ5C7KM.js +208 -0
- package/dist/{demo-voice-cmd-DF6C7EST.js → demo-voice-cmd-MBK3BGHZ.js} +1 -2
- package/dist/{docker-CP656XNO.js → docker-XWQM4F7B.js} +2 -1
- package/dist/{doctor-EQIAHHZD.js → doctor-SF4GAWAO.js} +9 -8
- package/dist/{emit-demo-cmd-YKTL6XWP.js → emit-demo-cmd-6VTA5BSJ.js} +1 -2
- package/dist/{find-unit-O6WL6UIW.js → find-unit-I4GWKY4T.js} +6 -5
- package/dist/{host-checks-V25YUP4Q.js → host-checks-FKLQST3J.js} +10 -9
- package/dist/index.js +1 -1
- package/dist/{init-KO3FT2XP.js → init-3MO5WCU3.js} +8 -7
- package/dist/{init-YYZ7B4ZD.js → init-TDLUTI6F.js} +8 -7
- package/dist/{init-cmd-D3BDS7KY.js → init-cmd-MQ5R35O2.js} +1 -1
- package/dist/{loop-UVONXWXB.js → loop-NNNDBFAS.js} +14 -13
- package/dist/{machine-2BI76JZO.js → machine-GCW2GGI2.js} +8 -7
- package/dist/recorder.cjs +916 -0
- package/dist/{runner-env-QN4BLTVZ.js → runner-env-LVVLUHY2.js} +6 -5
- package/dist/{runner-identity-53I4UTVY.js → runner-identity-73F2IWBT.js} +2 -1
- package/dist/{runner-key-JKXJWGGY.js → runner-key-ASPZ7TQH.js} +8 -7
- package/dist/{status-YCQHAY45.js → status-35Z3TW42.js} +10 -9
- package/dist/{update-steps-MC3IUHW7.js → update-steps-ZTNIK7LA.js} +11 -10
- package/dist/{work-claim-cmd-O54L5DSL.js → work-claim-cmd-QPYCZUMI.js} +4 -3
- package/dist/{work-proofs-cmd-LIXV252G.js → work-proofs-cmd-56EY7O45.js} +1 -1
- package/dist/{work-proofs-record-MCSA56F5.js → work-proofs-record-SPGI47OS.js} +2 -3
- package/package.json +5 -4
- package/skill-pack/maintained/outerlayer-amend/SKILL.md +2 -2
- package/skill-pack/maintained/outerlayer-build/references/evidence.md +12 -11
- package/skill-pack/maintained/outerlayer-evidence/SKILL.md +6 -6
- package/skill-pack/maintained/outerlayer-evidence/references/demo.md +12 -11
package/README.md
CHANGED
|
@@ -233,7 +233,8 @@ content:
|
|
|
233
233
|
login`. The tools layer also downloads the pinned `gh` and `tini` releases
|
|
234
234
|
from GitHub, a pinned static `ffmpeg` build from GitHub, and the narration
|
|
235
235
|
voice pack from Hugging Face and the npm registry, checking each against a
|
|
236
|
-
digest.
|
|
236
|
+
digest. It also installs the CLI's pinned Playwright release from the npm
|
|
237
|
+
registry, with no browser. The image build runs outside
|
|
237
238
|
any work item and sends nothing to your factory. `outerlayer runner start`
|
|
238
239
|
builds each build's image the same way, before the build starts. That image
|
|
239
240
|
build uses the host's network: the build's tunnel does not carry it, and
|
|
@@ -404,8 +405,8 @@ content:
|
|
|
404
405
|
- **`outerlayer emit demo <manifest>`** first reads the item's recorded
|
|
405
406
|
criteria (`GET /v1/work-items/{number}`) to check the chapters' criterion
|
|
406
407
|
ids. With `--replaces <record id>`, it also reads the item's newest demo record
|
|
407
|
-
(`GET /v1/work-items/{number}/demo`) before it uploads anything. It
|
|
408
|
-
|
|
408
|
+
(`GET /v1/work-items/{number}/demo`) before it uploads anything. It edits a
|
|
409
|
+
recorded video once, keeping only the beats, and emits it as one video artifact. It then emits a video
|
|
409
410
|
artifact for each chapter with the same bytes and a time range in that video,
|
|
410
411
|
followed by the manifest as the demo record. A chapter's screenshot frame is
|
|
411
412
|
emitted as a screenshot artifact after its clip. A recording over 8 MiB falls
|
|
@@ -415,6 +416,12 @@ content:
|
|
|
415
416
|
400 MB, from huggingface.co and registry.npmjs.org into
|
|
416
417
|
`~/.outerlayer/voice/`. It checks each file against a pinned sha256 and sends
|
|
417
418
|
nothing to either host. `--no-narration` downloads nothing.
|
|
419
|
+
- **`outerlayer demo record <file>`** sends nothing itself. It runs your demo
|
|
420
|
+
script in a local Chromium, through the Playwright release the CLI depends
|
|
421
|
+
on, and the browser opens only the pages the script opens. With the voice
|
|
422
|
+
on, it speaks each line on your machine, and the first time it may download
|
|
423
|
+
the voice pack as `outerlayer emit demo` does. `--no-voice` downloads
|
|
424
|
+
nothing.
|
|
418
425
|
- **`outerlayer emit <name>`** sends one check's outcome for a work item.
|
|
419
426
|
Run from inside a session, it sends only when that session carries a
|
|
420
427
|
launch record — the session's own content may not leave by a second
|
|
@@ -512,7 +519,8 @@ before it gives up.
|
|
|
512
519
|
| `outerlayer context emit [--check]` | Compile `.outerlayer/` into each configured target tool's native files (targets come from `.outerlayer/config.json`). `--check` computes outputs and diffs against disk without writing (CI mode). Bare `outerlayer emit` with no name still compiles, with a deprecation warning. |
|
|
513
520
|
| `outerlayer hooks wrap` / `outerlayer hooks unwrap` | Auto-wrap (or undo wrapping) `PreToolUse`/`PostToolUse` hooks for execution evidence — one spawn per firing. |
|
|
514
521
|
| `outerlayer emit artifact <file> --caption <text> [--for <criterion-id>] [--pr <n>]` | Upload a proof artifact — screenshot, recording, report, or log — with its caption. Inside a recorded session it spools locally and ships on the next `sync`; otherwise it uploads immediately, anchored to a pull request or the current checkout. `--replaces` retires artifacts an earlier run uploaded. A JUnit XML file bound with `--for` proves a criterion that declares `test` proof; `--test <name[=path:line]>` binds only the named tests. |
|
|
515
|
-
| `outerlayer
|
|
522
|
+
| `outerlayer demo record <file> [--config <file> --project <name>] [--base-url <url>] [--output-dir <dir>] [--no-voice]` | Record a demo script with the recorder and the Playwright release the CLI carries; the repository installs nothing. The script imports `test` and `expect` from `@outerlayer/playwright`. Prints the manifest's path. Exit 1 means the demo's test failed; its manifest is written all the same. |
|
|
523
|
+
| `outerlayer emit demo <manifest> [--compare <manifest>] [--no-narration] [--item <n>] [--pr <n>] [--replaces <record id>]` | Turn a recorded video and its manifest (written by the recorder that `outerlayer demo record` runs) into a narrated demo: one WebM clip for each chapter, emitted as a video artifact. A chapter whose checks all passed is bound to its criterion. A chapter of a version 4 manifest may hold a screenshot frame, which its test marked with `demo.screenshot()`. The frame is stored as a screenshot of the chapter's criterion only when that criterion declares `screenshot` and every check passed; otherwise the command says why it stored none. The manifest is emitted as the demo record, with the test file a version 3 or 4 manifest names. With `--replaces <record id>`, the new demo retires the item's old demo. With `--compare`, a second run's stills are compared with the first run's, and each chapter reads `yes`, `no` or `not checked`. Needs `ffmpeg` and `ffprobe`, and `espeak-ng` unless `--no-narration`. Exit 1 means a chapter had a failed check. |
|
|
516
524
|
| `outerlayer emit <name> --result <pass\|fail> [--link <url>] [--body <text>\|--body-file <path>] --item <number>` | Record one named check's outcome on a work item. A check that ran carries the run URL as its proof (`--link`); a judgment you are making yourself carries one sentence (`--body`, or `--body-file` to read it from a file — `-` reads standard input). A `fail` needs at least one of the two; a `pass` needs neither. `--item` names the work item by the number printed when the item was created — always required, in or out of a recorded session; a session records checks on its own item like any other, stored as the session's, but cannot clear a person's fail. Prints the recorded check's id. Who recorded it comes from your API key, never from what you send. |
|
|
517
525
|
| `outerlayer work comment --item <n> [--criterion <id>] --body <text> [--artifact <id>] [--pass\|--fail\|--attach\|--ready]` | Post one comment on a work item's general thread, or on one acceptance criterion's own thread with `--criterion`. `--pass`/`--fail` need a person's own credential and apply to the whole item, so they work on the general thread only and the gateway refuses them with `--criterion`; `--attach` makes the named artifact that criterion's current proof; `--ready` hands a thread back to a person. The detected session id rides along automatically, only ever narrowing what the comment may do. |
|
|
518
526
|
| `outerlayer work stop --item <n> [--note <text>]` | Ask the host that holds the item's build to end it. The host reads the request at its next heartbeat and ends the build with outcome `stopped`, so the build may run a little longer. The item is not built again until a new build request. Needs `work.update`. Exits 1 when no host build is running for the item. |
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
export { KEY_PREFIX, TAG_HOST, buildRepositoryImage, metadataFromLabels, prepareImageBuild, writeRecord } from './chunk-
|
|
4
|
-
|
|
3
|
+
export { KEY_PREFIX, TAG_HOST, buildRepositoryImage, metadataFromLabels, prepareImageBuild, writeRecord } from './chunk-XDJ376OP.js';
|
|
4
|
+
import './chunk-KOZ6IBEI.js';
|
|
5
5
|
import './chunk-4UPET3R7.js';
|
|
6
|
+
export { RecipeError } from './chunk-HDLON3RJ.js';
|
|
6
7
|
import './chunk-LQHCNXPK.js';
|
|
7
8
|
import './chunk-JBJTC3UU.js';
|
|
8
9
|
import './chunk-L5VHGRQE.js';
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
export { DEFAULT_BUILD_DISK, DEFAULT_CACHE_DISK, DOCKER_CACHE_MS, allocatedBytes, checkDiskFit, realBuildDiskProbe, runDocker, volumeBytes } from './chunk-
|
|
4
|
-
import './chunk-
|
|
3
|
+
export { DEFAULT_BUILD_DISK, DEFAULT_CACHE_DISK, DOCKER_CACHE_MS, allocatedBytes, checkDiskFit, realBuildDiskProbe, runDocker, volumeBytes } from './chunk-6NXBXWOP.js';
|
|
4
|
+
import './chunk-KOZ6IBEI.js';
|
|
5
5
|
import './chunk-4UPET3R7.js';
|
|
6
|
+
import './chunk-HDLON3RJ.js';
|
|
6
7
|
import './chunk-L5VHGRQE.js';
|
|
7
8
|
import './chunk-OOD5NDQA.js';
|
|
8
9
|
import './chunk-DINRXUQA.js';
|
package/dist/build-info.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"id":"2026-10-
|
|
1
|
+
{"id":"2026-10-26T23:08:41.174Z+58e3fae","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
export { MIN_BUILDX_VERSION, builderName, builderSpec, buildxState, ensureBuilder, ensureFailureCount, isOutOfMemory, proxyEnvironment, trackImageBuild } from './chunk-
|
|
3
|
+
export { MIN_BUILDX_VERSION, builderName, builderSpec, buildxState, ensureBuilder, ensureFailureCount, isOutOfMemory, proxyEnvironment, trackImageBuild } from './chunk-KOZ6IBEI.js';
|
|
4
4
|
import './chunk-4UPET3R7.js';
|
|
5
|
+
import './chunk-HDLON3RJ.js';
|
|
5
6
|
import './chunk-L5VHGRQE.js';
|
|
6
7
|
import './chunk-OOD5NDQA.js';
|
|
7
8
|
import './chunk-DINRXUQA.js';
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
import { probeCredentials } from './chunk-
|
|
3
|
+
import { probeCredentials } from './chunk-IZVDQXTC.js';
|
|
4
4
|
import './chunk-3JVYMD4G.js';
|
|
5
|
-
import './chunk-
|
|
5
|
+
import './chunk-F5H3LVHR.js';
|
|
6
6
|
import './chunk-E7R2GIAW.js';
|
|
7
7
|
import './chunk-MH6QLXUO.js';
|
|
8
8
|
import './chunk-HOUFCUMH.js';
|
|
9
|
-
import './chunk-
|
|
9
|
+
import './chunk-PN7RMFPP.js';
|
|
10
10
|
import './chunk-TS3EFB7S.js';
|
|
11
|
-
import './chunk-
|
|
12
|
-
import './chunk-ZVB57WI6.js';
|
|
11
|
+
import './chunk-TGBST2QL.js';
|
|
13
12
|
import './chunk-6CK2OC4Q.js';
|
|
13
|
+
import './chunk-ZVB57WI6.js';
|
|
14
14
|
import './chunk-P3NPTFLF.js';
|
|
15
15
|
import './chunk-I3LTIAOR.js';
|
|
16
16
|
import './chunk-WBTPI5MP.js';
|
|
@@ -18,26 +18,27 @@ import './chunk-QRJIBTNQ.js';
|
|
|
18
18
|
import './chunk-7DK2FOZ4.js';
|
|
19
19
|
import './chunk-ESVW4MJY.js';
|
|
20
20
|
import './chunk-CFFVCI2I.js';
|
|
21
|
-
import { managedProblems, managedFactsOf } from './chunk-
|
|
21
|
+
import { managedProblems, managedFactsOf } from './chunk-XLJXO4QC.js';
|
|
22
22
|
import './chunk-YL3RWW7X.js';
|
|
23
23
|
import './chunk-TBT347UY.js';
|
|
24
|
-
import { findServiceUnit } from './chunk-
|
|
24
|
+
import { findServiceUnit } from './chunk-JZLMFYFM.js';
|
|
25
25
|
import './chunk-TZMDRHWB.js';
|
|
26
|
-
import { placeholderQueues, placeholderProblem, permissionModeProblems, permissionModeProblem, HELPER_ENV, helperSocketPath, probeHelper, needsClaudeCredential, claudeCredentialCheck, claimPermissionProblem, formerSkillQueues, formerSkillProblem } from './chunk-
|
|
26
|
+
import { placeholderQueues, placeholderProblem, permissionModeProblems, permissionModeProblem, HELPER_ENV, helperSocketPath, probeHelper, needsClaudeCredential, claudeCredentialCheck, claimPermissionProblem, formerSkillQueues, formerSkillProblem } from './chunk-DFBY6LX3.js';
|
|
27
27
|
import './chunk-2PGI6RDE.js';
|
|
28
|
-
import './chunk-
|
|
28
|
+
import './chunk-XDJ376OP.js';
|
|
29
29
|
import './chunk-OGFGZQA3.js';
|
|
30
30
|
import './chunk-3VZTNXK5.js';
|
|
31
31
|
import './chunk-6KFJIU73.js';
|
|
32
32
|
import './chunk-77VBS2RT.js';
|
|
33
33
|
import './chunk-SDELQEG4.js';
|
|
34
34
|
import './chunk-TQMI335S.js';
|
|
35
|
-
import './chunk-
|
|
36
|
-
import './chunk-
|
|
37
|
-
import { loadRunnerConfig, RunnerConfigError, checkHooks } from './chunk-
|
|
38
|
-
import './chunk-
|
|
39
|
-
import './chunk-
|
|
35
|
+
import './chunk-63A6NUEZ.js';
|
|
36
|
+
import './chunk-TLIZ7FY4.js';
|
|
37
|
+
import { loadRunnerConfig, RunnerConfigError, checkHooks } from './chunk-Q3L5AC75.js';
|
|
38
|
+
import './chunk-6NXBXWOP.js';
|
|
39
|
+
import './chunk-KOZ6IBEI.js';
|
|
40
40
|
import './chunk-4UPET3R7.js';
|
|
41
|
+
import './chunk-HDLON3RJ.js';
|
|
41
42
|
import './chunk-LQHCNXPK.js';
|
|
42
43
|
import './chunk-JBJTC3UU.js';
|
|
43
44
|
import './chunk-KT4CN6OU.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
import { DEFAULT_UNIT_NAME } from './chunk-
|
|
3
|
+
import { DEFAULT_UNIT_NAME } from './chunk-TLIZ7FY4.js';
|
|
4
4
|
import { RUNNER_FILE_MODE } from './chunk-GJ4KBHBD.js';
|
|
5
5
|
import { claudeEnvPath, withoutCredentialLines, parseRunnerEnv } from './chunk-SDAEXUIX.js';
|
|
6
6
|
import { existsSync, readFileSync, writeFileSync, renameSync, rmSync } from 'fs';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
import { parseSize, BUILD_LABEL, RUNNER_LABEL, runnerLabelValue } from './chunk-
|
|
3
|
+
import { parseSize, BUILD_LABEL, RUNNER_LABEL, runnerLabelValue } from './chunk-KOZ6IBEI.js';
|
|
4
4
|
import { buildsDir, rootfsDir, runnerDir, imagesDir, builderCacheDiskPath } from './chunk-GJ4KBHBD.js';
|
|
5
5
|
import { spawnSync } from 'child_process';
|
|
6
6
|
import { statfsSync, statSync, existsSync, readdirSync } from 'fs';
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
3
|
import { sha256OfFile, downloadPinned, VoiceDownloadError } from './chunk-2PGI6RDE.js';
|
|
4
|
-
import { readDefaultBranchHead, cloneRepository, buildRepositoryImage, prepareImageBuild, KEY_PREFIX, FETCHED_DIR, toolsDockerfile, TAG_HOST, metadataFromLabels, writeRecord, FETCHED_FFMPEG, FETCHED_GH, FETCHED_TINI, FETCHED_VOICE_DIR } from './chunk-
|
|
4
|
+
import { readDefaultBranchHead, cloneRepository, buildRepositoryImage, prepareImageBuild, KEY_PREFIX, FETCHED_DIR, toolsDockerfile, TAG_HOST, metadataFromLabels, writeRecord, FETCHED_FFMPEG, FETCHED_GH, FETCHED_TINI, FETCHED_VOICE_DIR } from './chunk-XDJ376OP.js';
|
|
5
5
|
import { currentCliBuild } from './chunk-OGFGZQA3.js';
|
|
6
6
|
import { runExec, execCapture, waitForAgent } from './chunk-3VZTNXK5.js';
|
|
7
7
|
import { GUEST_CID, linkVsockSockets } from './chunk-6KFJIU73.js';
|
|
8
8
|
import { retrySend, describeCallFailure, keepStagedContext, controlPlaneTokenFailure, refusalCode, resolveGoverningSource, prefetchGovernedContext, removeStagedContext, stageGovernedContext, pinnedSourceOf, commandWithShim, shimScript, WORKFLOW_PERMISSION_REASON } from './chunk-77VBS2RT.js';
|
|
9
9
|
import { runnerImageVersion } from './chunk-SDELQEG4.js';
|
|
10
|
-
import { hasStoredCredential, AGENT_COMMANDS, storeClaudeCredential, credentialFromStdin, isAgentName } from './chunk-
|
|
11
|
-
import { runnerCredentialProblem, builtinKind, allowHostProblem, hostAllowed } from './chunk-
|
|
12
|
-
import { formatBytes, allocatedBytes } from './chunk-
|
|
13
|
-
import { createDockerHost, builderSpec,
|
|
10
|
+
import { hasStoredCredential, AGENT_COMMANDS, storeClaudeCredential, credentialFromStdin, isAgentName } from './chunk-63A6NUEZ.js';
|
|
11
|
+
import { runnerCredentialProblem, builtinKind, allowHostProblem, hostAllowed } from './chunk-Q3L5AC75.js';
|
|
12
|
+
import { formatBytes, allocatedBytes } from './chunk-6NXBXWOP.js';
|
|
13
|
+
import { createDockerHost, builderSpec, runnerLabelValue, RUNNER_LABEL, BUILD_LABEL, prepareRunArgs, containerRunArgs, HASH_ARGV, parseProgramHash, JUDGE_PROGRAM, containerExecArgs, childEnvironment, readDu, JUDGE_DIR, MAX_ITEMS_BYTES, JUDGE_ITEMS, MAX_REPORT_BYTES, JUDGE_REPORT, spawnRun } from './chunk-KOZ6IBEI.js';
|
|
14
14
|
import { firecrackerArch, MICROVM_ARCHES, FIRECRACKER_VERSION, hostHelperPinned, CLAUDE_CODE_VERSION, builderDiskPinned, guestAssetsPinned, GUEST_HELPER_SHA256, GUEST_ASSETS_BASE_URL, GUEST_KERNEL_SHA256, JAILER_BINARY_SHA256, FIRECRACKER_BINARY_SHA256, FIRECRACKER_SHA256, GUEST_ASSETS_VERSION, BUILDER_DISK_VERSION, FFMPEG_STATIC, FFMPEG_BUILD_TAG, GH_SHA256, GH_VERSION, TINI_SHA256, TINI_VERSION, VOICE_PACK_FILES, BUILDER_DISK_SHA256, BUILDER_DISK_BASE_URL, DEFAULT_BASE_IMAGE } from './chunk-4UPET3R7.js';
|
|
15
|
+
import { RecipeError, DOCKER_FEATURE, writeSanitizedRecipe, classifyProperties } from './chunk-HDLON3RJ.js';
|
|
15
16
|
import { startTimeOf, isSameProcess } from './chunk-JBJTC3UU.js';
|
|
16
17
|
import { postJson, WorkCommandError, getJson } from './chunk-QABXXQ67.js';
|
|
17
18
|
import { sanitizeTerminal } from './chunk-IXPH4EXK.js';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
import { scrubReason, stripTerminalControls } from './chunk-
|
|
4
|
-
import { checkFit, RUNNER_RESERVE_BYTES } from './chunk-
|
|
3
|
+
import { scrubReason, stripTerminalControls } from './chunk-TGBST2QL.js';
|
|
4
|
+
import { checkFit, RUNNER_RESERVE_BYTES } from './chunk-TLIZ7FY4.js';
|
|
5
5
|
import { RunnerAlreadyRunningError, readPidFile } from './chunk-LQHCNXPK.js';
|
|
6
6
|
import { isSameProcess } from './chunk-JBJTC3UU.js';
|
|
7
7
|
import { isSignatureRefusal, postJson } from './chunk-QABXXQ67.js';
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import { existsSync, readdirSync, readFileSync, lstatSync, realpathSync, writeFileSync } from 'fs';
|
|
4
|
+
import { join, resolve, relative, dirname, sep, basename } from 'path';
|
|
5
|
+
import { createRequire as createRequire$1 } from 'module';
|
|
6
|
+
import { fileURLToPath } from 'url';
|
|
7
|
+
|
|
8
|
+
createRequire(import.meta.url);
|
|
9
|
+
|
|
10
|
+
// src/runner/image/properties.ts
|
|
11
|
+
var LIFECYCLE = ["onCreateCommand", "updateContentCommand", "postCreateCommand", "postStartCommand"];
|
|
12
|
+
var HONOURED = ["image", "build", "features", "containerEnv", "remoteUser", ...LIFECYCLE];
|
|
13
|
+
var IGNORED_BUILD_KEYS = ["options"];
|
|
14
|
+
var HOST_REFERENCE = /\$\{(?:localEnv|env)[:}]/;
|
|
15
|
+
var DROP = /* @__PURE__ */ Symbol("drop");
|
|
16
|
+
function isHonoured(property) {
|
|
17
|
+
return HONOURED.includes(property);
|
|
18
|
+
}
|
|
19
|
+
function isObject(value) {
|
|
20
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
21
|
+
}
|
|
22
|
+
function featureName(id) {
|
|
23
|
+
const slash = id.lastIndexOf("/");
|
|
24
|
+
const cut = id.slice(slash + 1).search(/[:@]/);
|
|
25
|
+
return cut === -1 ? id : id.slice(0, slash + 1 + cut);
|
|
26
|
+
}
|
|
27
|
+
var DOCKER_FEATURE = "ghcr.io/devcontainers/features/docker-in-docker";
|
|
28
|
+
function asksForDocker(recipe, metadata) {
|
|
29
|
+
const isDocker = (id) => featureName(id) === DOCKER_FEATURE;
|
|
30
|
+
if (isObject(recipe.features) && Object.keys(recipe.features).some(isDocker)) return true;
|
|
31
|
+
return metadata.some((entry) => typeof entry.id === "string" && isDocker(entry.id));
|
|
32
|
+
}
|
|
33
|
+
function sameValue(a, b) {
|
|
34
|
+
return JSON.stringify(a) === JSON.stringify(b);
|
|
35
|
+
}
|
|
36
|
+
function isFilesOwnEntry(entry, recipe) {
|
|
37
|
+
if (typeof entry.id === "string") return false;
|
|
38
|
+
const keys = Object.keys(entry);
|
|
39
|
+
return keys.length > 0 && keys.every((key) => key in recipe && sameValue(entry[key], recipe[key]));
|
|
40
|
+
}
|
|
41
|
+
function withoutHostReferences(value, path, dropped) {
|
|
42
|
+
if (typeof value === "string") {
|
|
43
|
+
if (!HOST_REFERENCE.test(value)) return value;
|
|
44
|
+
dropped.push(path);
|
|
45
|
+
return DROP;
|
|
46
|
+
}
|
|
47
|
+
if (Array.isArray(value)) {
|
|
48
|
+
if (!HOST_REFERENCE.test(JSON.stringify(value))) return value;
|
|
49
|
+
dropped.push(path);
|
|
50
|
+
return DROP;
|
|
51
|
+
}
|
|
52
|
+
if (isObject(value)) {
|
|
53
|
+
const kept = {};
|
|
54
|
+
for (const [key, item] of Object.entries(value)) {
|
|
55
|
+
if (HOST_REFERENCE.test(key)) {
|
|
56
|
+
dropped.push(`${path}.${key}`);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const clean = withoutHostReferences(item, `${path}.${key}`, dropped);
|
|
60
|
+
if (clean !== DROP) kept[key] = clean;
|
|
61
|
+
}
|
|
62
|
+
return kept;
|
|
63
|
+
}
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
function honouredWithoutHostReferences(entry) {
|
|
67
|
+
const kept = {};
|
|
68
|
+
const dropped = [];
|
|
69
|
+
for (const property of HONOURED) {
|
|
70
|
+
if (!(property in entry)) continue;
|
|
71
|
+
const value = entry[property];
|
|
72
|
+
const clean = withoutHostReferences(
|
|
73
|
+
property === "build" && isObject(value) ? withoutIgnoredBuildKeys(value) : value,
|
|
74
|
+
property,
|
|
75
|
+
dropped
|
|
76
|
+
);
|
|
77
|
+
if (clean !== DROP) kept[property] = clean;
|
|
78
|
+
}
|
|
79
|
+
return { kept, dropped };
|
|
80
|
+
}
|
|
81
|
+
function withoutIgnoredBuildKeys(build) {
|
|
82
|
+
return Object.fromEntries(Object.entries(build).filter(([key]) => !IGNORED_BUILD_KEYS.includes(key)));
|
|
83
|
+
}
|
|
84
|
+
function ignoredIn(entry, source) {
|
|
85
|
+
const found = [];
|
|
86
|
+
for (const property of Object.keys(entry)) {
|
|
87
|
+
if (property === "id" || property.startsWith("$") || isHonoured(property)) continue;
|
|
88
|
+
found.push({ property, source });
|
|
89
|
+
}
|
|
90
|
+
if (isObject(entry.build)) {
|
|
91
|
+
for (const key of IGNORED_BUILD_KEYS) {
|
|
92
|
+
if (key in entry.build) found.push({ property: `build.${key}`, source });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
for (const property of honouredWithoutHostReferences(entry).dropped) found.push({ property, source });
|
|
96
|
+
return found;
|
|
97
|
+
}
|
|
98
|
+
function emptyApply() {
|
|
99
|
+
return { containerEnv: {}, lifecycle: { onCreateCommand: [], updateContentCommand: [], postCreateCommand: [], postStartCommand: [] } };
|
|
100
|
+
}
|
|
101
|
+
function applyEntry(apply, raw, source) {
|
|
102
|
+
const entry = honouredWithoutHostReferences(raw).kept;
|
|
103
|
+
if (typeof entry.remoteUser === "string") apply.remoteUser = entry.remoteUser;
|
|
104
|
+
if (isObject(entry.containerEnv)) {
|
|
105
|
+
for (const [key, value] of Object.entries(entry.containerEnv)) {
|
|
106
|
+
if (typeof value === "string") apply.containerEnv[key] = value;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
for (const name of LIFECYCLE) {
|
|
110
|
+
if (entry[name] !== void 0) apply.lifecycle[name].push({ source, command: entry[name] });
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
function classifyProperties(recipe, metadata) {
|
|
114
|
+
const ignored = ignoredIn(recipe, "file");
|
|
115
|
+
const apply = emptyApply();
|
|
116
|
+
let fileApplied = false;
|
|
117
|
+
const sanitized = sanitizeRecipe(recipe);
|
|
118
|
+
for (const entry of metadata) {
|
|
119
|
+
if (isFilesOwnEntry(entry, sanitized)) {
|
|
120
|
+
applyEntry(apply, entry, "file");
|
|
121
|
+
fileApplied = true;
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
const source = typeof entry.id === "string" ? `feature ${featureName(entry.id)}` : "image label";
|
|
125
|
+
ignored.push(...ignoredIn(entry, source));
|
|
126
|
+
applyEntry(apply, entry, source);
|
|
127
|
+
}
|
|
128
|
+
if (!fileApplied) applyEntry(apply, recipe, "file");
|
|
129
|
+
return { docker: asksForDocker(recipe, metadata), honoured: HONOURED.filter((property) => property in recipe), ignored, apply };
|
|
130
|
+
}
|
|
131
|
+
function sanitizeRecipe(recipe) {
|
|
132
|
+
return honouredWithoutHostReferences(recipe).kept;
|
|
133
|
+
}
|
|
134
|
+
var RecipeError = class extends Error {
|
|
135
|
+
constructor(code, message, logPath) {
|
|
136
|
+
super(message);
|
|
137
|
+
this.code = code;
|
|
138
|
+
this.logPath = logPath;
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
var DIR_RECIPE = ".devcontainer/devcontainer.json";
|
|
142
|
+
var ROOT_RECIPE = ".devcontainer.json";
|
|
143
|
+
function locateRecipe(checkoutDir) {
|
|
144
|
+
if (existsSync(join(checkoutDir, DIR_RECIPE))) return { kind: "file", path: DIR_RECIPE };
|
|
145
|
+
if (existsSync(join(checkoutDir, ROOT_RECIPE))) return { kind: "file", path: ROOT_RECIPE };
|
|
146
|
+
const named = namedConfigurations(checkoutDir);
|
|
147
|
+
if (named.length > 0) {
|
|
148
|
+
throw new RecipeError(
|
|
149
|
+
"recipe_ambiguous",
|
|
150
|
+
`the repository has only named devcontainer configurations (${named.join(", ")}); add ${DIR_RECIPE} so the runner knows which to build`
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
return { kind: "default" };
|
|
154
|
+
}
|
|
155
|
+
function namedConfigurations(checkoutDir) {
|
|
156
|
+
const dir = join(checkoutDir, ".devcontainer");
|
|
157
|
+
if (!existsSync(dir)) return [];
|
|
158
|
+
return readdirSync(dir).sort().map((entry) => `.devcontainer/${entry}/devcontainer.json`).filter((path) => existsSync(join(checkoutDir, path)));
|
|
159
|
+
}
|
|
160
|
+
var COMMENTS = /("(?:[^"\\]|\\.)*")|\/\/[^\n]*|\/\*[\s\S]*?(?:\*\/|$)/g;
|
|
161
|
+
var TRAILING_COMMAS = /("(?:[^"\\]|\\.)*")|,(\s*[}\]])/g;
|
|
162
|
+
function parseJsonc(text) {
|
|
163
|
+
const withoutComments = text.replace(COMMENTS, (_match, str) => str ?? "");
|
|
164
|
+
return JSON.parse(withoutComments.replace(TRAILING_COMMAS, (_match, str, close) => str ?? close ?? ""));
|
|
165
|
+
}
|
|
166
|
+
function readRecipe(checkoutDir, location) {
|
|
167
|
+
if (location.kind === "default") return {};
|
|
168
|
+
const parsed = parseJsonc(readFileSync(join(checkoutDir, location.path), "utf8"));
|
|
169
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
170
|
+
throw new Error(`${location.path} is not a JSON object`);
|
|
171
|
+
}
|
|
172
|
+
return parsed;
|
|
173
|
+
}
|
|
174
|
+
function within(dir, path) {
|
|
175
|
+
const rel = relative(dir, path);
|
|
176
|
+
return rel !== ".." && !rel.startsWith(`..${sep}`);
|
|
177
|
+
}
|
|
178
|
+
function realish(path) {
|
|
179
|
+
let existing = path;
|
|
180
|
+
let rest = "";
|
|
181
|
+
while (!existsSync(existing)) {
|
|
182
|
+
rest = join(basename(existing), rest);
|
|
183
|
+
existing = dirname(existing);
|
|
184
|
+
}
|
|
185
|
+
return join(realpathSync(existing), rest);
|
|
186
|
+
}
|
|
187
|
+
function assertBuildable(checkoutDir, location, recipe) {
|
|
188
|
+
if (location.kind === "default") return;
|
|
189
|
+
const devcontainerDir = join(checkoutDir, ".devcontainer");
|
|
190
|
+
if (existsSync(devcontainerDir) && lstatSync(devcontainerDir).isSymbolicLink()) {
|
|
191
|
+
throw new RecipeError(
|
|
192
|
+
"recipe_context_outside",
|
|
193
|
+
".devcontainer is a symbolic link, so the build could read files outside the repository; commit a real directory"
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
if (recipe.dockerComposeFile !== void 0) {
|
|
197
|
+
throw new RecipeError(
|
|
198
|
+
"recipe_needs_docker",
|
|
199
|
+
"the recipe uses dockerComposeFile; its services need Docker, which a container build does not have"
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
const build = recipe.build;
|
|
203
|
+
if (typeof build !== "object" || build === null) return;
|
|
204
|
+
const { dockerfile, context } = build;
|
|
205
|
+
const base = resolve(checkoutDir, location.path, "..");
|
|
206
|
+
const allowed = join(realpathSync(checkoutDir), ".devcontainer");
|
|
207
|
+
const contextPath = resolve(base, typeof context === "string" ? context : ".");
|
|
208
|
+
const paths = [contextPath];
|
|
209
|
+
if (typeof dockerfile === "string") paths.push(resolve(base, dockerfile));
|
|
210
|
+
for (const path of paths) {
|
|
211
|
+
if (!within(devcontainerDir, path) || !within(allowed, realish(path))) {
|
|
212
|
+
throw new RecipeError(
|
|
213
|
+
"recipe_context_outside",
|
|
214
|
+
`the recipe's build reads ${relative(checkoutDir, path) || "."}, outside .devcontainer/; move the build files into .devcontainer/`
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
function writeSanitizedRecipe(checkoutDir, location, recipe) {
|
|
220
|
+
if (location.kind === "default") throw new Error("the default image has no recipe to sanitize");
|
|
221
|
+
const path = location.path === ROOT_RECIPE ? join(checkoutDir, ".outerlayer-recipe.json") : join(checkoutDir, ".devcontainer", SANITIZED_NAME);
|
|
222
|
+
writeFileSync(path, `${JSON.stringify(sanitizeRecipe(recipe), null, 2)}
|
|
223
|
+
`);
|
|
224
|
+
return path;
|
|
225
|
+
}
|
|
226
|
+
var SANITIZED_NAME = "outerlayer-recipe.json";
|
|
227
|
+
var PACKAGE = "@devcontainers/cli";
|
|
228
|
+
function buildRootFromDist(moduleDir = dirname(fileURLToPath(import.meta.url))) {
|
|
229
|
+
try {
|
|
230
|
+
const info = JSON.parse(readFileSync(join(moduleDir, "build-info.json"), "utf8"));
|
|
231
|
+
return typeof info.root === "string" ? info.root : void 0;
|
|
232
|
+
} catch {
|
|
233
|
+
return void 0;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
function resolveDevcontainerCli(opts = {}) {
|
|
237
|
+
const resolve2 = opts.resolve ?? createRequire$1(import.meta.url).resolve;
|
|
238
|
+
try {
|
|
239
|
+
const bin = join(dirname(resolve2(`${PACKAGE}/package.json`)), "devcontainer.js");
|
|
240
|
+
if (existsSync(bin)) return { command: process.execPath, args: [bin] };
|
|
241
|
+
} catch {
|
|
242
|
+
}
|
|
243
|
+
const buildRoot = opts.buildRoot ?? buildRootFromDist();
|
|
244
|
+
const fallback = buildRoot === void 0 ? void 0 : join(buildRoot, "node_modules", PACKAGE);
|
|
245
|
+
if (fallback !== void 0 && existsSync(join(fallback, "devcontainer.js"))) {
|
|
246
|
+
return { command: process.execPath, args: [join(fallback, "devcontainer.js")] };
|
|
247
|
+
}
|
|
248
|
+
throw new RecipeError(
|
|
249
|
+
"devcontainer_cli_missing",
|
|
250
|
+
`the devcontainer CLI is not installed: looked beside this package and in ${fallback ?? "the checkout this build came from (unknown)"}. Run yarn install in that checkout.`
|
|
251
|
+
);
|
|
252
|
+
}
|
|
253
|
+
function devcontainerBuildInvocation(cli, req) {
|
|
254
|
+
return {
|
|
255
|
+
command: cli.command,
|
|
256
|
+
args: [
|
|
257
|
+
...cli.args,
|
|
258
|
+
"build",
|
|
259
|
+
"--workspace-folder",
|
|
260
|
+
req.workspace,
|
|
261
|
+
"--config",
|
|
262
|
+
req.config,
|
|
263
|
+
"--image-name",
|
|
264
|
+
req.imageName,
|
|
265
|
+
...Object.entries(req.labels).flatMap(([key, value]) => ["--label", `${key}=${value}`]),
|
|
266
|
+
"--log-format",
|
|
267
|
+
"text",
|
|
268
|
+
// Written as an OCI layout instead of loaded into Docker: the runner's builder cannot read Docker's image store, so the next layer starts FROM the layout.
|
|
269
|
+
...req.layoutOut === void 0 ? [] : ["--output", `type=oci,dest=${req.layoutOut},tar=false`]
|
|
270
|
+
]
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
export { DOCKER_FEATURE, RecipeError, SANITIZED_NAME, assertBuildable, buildRootFromDist, classifyProperties, devcontainerBuildInvocation, locateRecipe, readRecipe, resolveDevcontainerCli, writeSanitizedRecipe };
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
3
|
import { decideInstalledSwitch } from './chunk-3JVYMD4G.js';
|
|
4
|
-
import { reportFailedStart, fitImageBuildMemory } from './chunk-
|
|
4
|
+
import { reportFailedStart, fitImageBuildMemory } from './chunk-F5H3LVHR.js';
|
|
5
5
|
import { fetchVersionMeta, npmVersion, npmSupportsProvenance, fetchTarballDigest, fetchProvenance, installVersion, auditSignatures } from './chunk-E7R2GIAW.js';
|
|
6
6
|
import { RUNNER_PROTOCOL } from './chunk-MH6QLXUO.js';
|
|
7
7
|
import { writePendingUpdate } from './chunk-HOUFCUMH.js';
|
|
8
|
-
import { renderUpdateSteps } from './chunk-
|
|
8
|
+
import { renderUpdateSteps } from './chunk-PN7RMFPP.js';
|
|
9
9
|
import { readHousekeepingRecord, writeHousekeepingRecord } from './chunk-TS3EFB7S.js';
|
|
10
|
-
import { releaseLease, isUnfinished, setStage, jobEnv, runHook, describeHookEnd, provisionMicroVm, deliverCommitHooks, provisionProcess, readProvisionOut, workdirProblem, MICROVM_COMMAND_DIR, commandLogOffset, startMicroVmCommand, microVmCommandLine, runCommand, startSender, finishJob, sampleGuest, foldSample, isContainerTracked, isMicroVmTracked, probeMicroVmCommand, probeCommand, appendCommandLog, judgeProbe, EXIT_CODE_FILE, isTracked, isGroupAlive, outcomeFromExitCode, isTimedOut, readCpuUsec, isIdle, stopOrphanedMicroVms, unfinishedJobs, listUnreadableJobs, listAdoptableJobs, retryFailedReleases, recoverLostJobs, GUEST_USAGE_INTERVAL_MS, hookLimitsFor, AttemptLogBook, microVmOomKills, needsRenew, renewLease, RENEW_INTERVAL_SECONDS, listTrackedJobs, restartSender, serveLease, vmAlive, writeGuestGhConfig, ALREADY_RELEASED, inTeardown } from './chunk-
|
|
10
|
+
import { releaseLease, isUnfinished, setStage, jobEnv, runHook, describeHookEnd, provisionMicroVm, deliverCommitHooks, provisionProcess, readProvisionOut, workdirProblem, MICROVM_COMMAND_DIR, commandLogOffset, startMicroVmCommand, microVmCommandLine, runCommand, startSender, finishJob, sampleGuest, foldSample, isContainerTracked, isMicroVmTracked, probeMicroVmCommand, probeCommand, appendCommandLog, judgeProbe, EXIT_CODE_FILE, isTracked, isGroupAlive, outcomeFromExitCode, isTimedOut, readCpuUsec, isIdle, stopOrphanedMicroVms, unfinishedJobs, listUnreadableJobs, listAdoptableJobs, retryFailedReleases, recoverLostJobs, GUEST_USAGE_INTERVAL_MS, hookLimitsFor, AttemptLogBook, microVmOomKills, needsRenew, renewLease, RENEW_INTERVAL_SECONDS, listTrackedJobs, restartSender, serveLease, vmAlive, writeGuestGhConfig, ALREADY_RELEASED, inTeardown } from './chunk-TGBST2QL.js';
|
|
11
11
|
import { JOB_STATE_FORMAT, readsJobState, jobStateFormatOf } from './chunk-ZVB57WI6.js';
|
|
12
|
-
import { realBlockedProbes, checkBlockedWithSlots, largeBuildMemoryBytes, LARGE_BUILD_DISK_BYTES, checkManagedRoom, sliceMemoryOf } from './chunk-
|
|
12
|
+
import { realBlockedProbes, checkBlockedWithSlots, largeBuildMemoryBytes, LARGE_BUILD_DISK_BYTES, checkManagedRoom, sliceMemoryOf } from './chunk-XLJXO4QC.js';
|
|
13
13
|
import { writeMarker, readMarker, currentVersion, removeMarker, isInLayout, startedThroughCurrent, entryIn, versionDir, switchCurrent, cleanVersions, stagingDir } from './chunk-YL3RWW7X.js';
|
|
14
14
|
import { RepoFilter } from './chunk-TBT347UY.js';
|
|
15
|
-
import { leaseTimeLeftMs, createContainerRuntime, withTunnelLog, LEASE_SECONDS, attemptNote, fetchManagedClaudeKey, holdManagedClaudeKey, fetchManagedBuildSettings, holdManagedBuildSettings, needsBuildSkill, provisionContainer, leaseExpiresAtMs, deliverContainerHooks, provisionEnvironment, resolveHostBuild, listenOnBroker, hostEnvironment, deliverExecMaven, runWithSpawn, hostCommandEnvironment, lifecycleSteps, execArgv, lifecycleFailureReason, decideHostBuildSkill, prepareBranch, currentSkillCommand, formerSkillProblem, containerCommandExec, execCommandLine, startHostServices, setUpRunnerCgroup, sweepImageBuilders, measureDisk, parseCpuList, ensureTunnel, keepGhConfigCurrent, filesAreCopied, managedBuildSettingsFor, ADOPTED_FETCH_RETRY_WINDOW_MS, gitRemoteFor, startServicesFor, createLeaseChannel } from './chunk-
|
|
15
|
+
import { leaseTimeLeftMs, createContainerRuntime, withTunnelLog, LEASE_SECONDS, attemptNote, fetchManagedClaudeKey, holdManagedClaudeKey, fetchManagedBuildSettings, holdManagedBuildSettings, needsBuildSkill, provisionContainer, leaseExpiresAtMs, deliverContainerHooks, provisionEnvironment, resolveHostBuild, listenOnBroker, hostEnvironment, deliverExecMaven, runWithSpawn, hostCommandEnvironment, lifecycleSteps, execArgv, lifecycleFailureReason, decideHostBuildSkill, prepareBranch, currentSkillCommand, formerSkillProblem, containerCommandExec, execCommandLine, startHostServices, setUpRunnerCgroup, sweepImageBuilders, measureDisk, parseCpuList, ensureTunnel, keepGhConfigCurrent, filesAreCopied, managedBuildSettingsFor, ADOPTED_FETCH_RETRY_WINDOW_MS, gitRemoteFor, startServicesFor, createLeaseChannel } from './chunk-DFBY6LX3.js';
|
|
16
16
|
import { describeCallFailure, retrySend, shortClaim, relativeToRunner, formatDuration, resolveGoverningSource, BuildTokens, classifyRefusal, refusalCode, createRunnerLog, formatClock } from './chunk-77VBS2RT.js';
|
|
17
17
|
import { imageTag, writeUpdateStatus, pullInstruction, tagToPull } from './chunk-SDELQEG4.js';
|
|
18
18
|
import { isVersion, compareVersions, satisfiesRange } from './chunk-TQMI335S.js';
|
|
19
|
-
import { isBuiltinContainer, isBuiltinVm, isBuiltinProcess, loadRunnerConfig, checkHooks, builtinKind, keepsHostBuilder, DEFAULT_UPDATE_MAX_WAIT_HOURS } from './chunk-
|
|
20
|
-
import { freeBytes, formatBytes, allocatedBytes, volumeBytes } from './chunk-
|
|
21
|
-
import { writeJobFile, ensureRunnerIdentity, identityDockerFor, readJobFile, exceedsDisk, builderName, runnerLabelValue, ensureFailureCount, builderSpec, ensureBuilder, spawnRun, RUNNER_LABEL, BUILD_LABEL, readJobFileChecked } from './chunk-
|
|
19
|
+
import { isBuiltinContainer, isBuiltinVm, isBuiltinProcess, loadRunnerConfig, checkHooks, builtinKind, keepsHostBuilder, DEFAULT_UPDATE_MAX_WAIT_HOURS } from './chunk-Q3L5AC75.js';
|
|
20
|
+
import { freeBytes, formatBytes, allocatedBytes, volumeBytes } from './chunk-6NXBXWOP.js';
|
|
21
|
+
import { writeJobFile, ensureRunnerIdentity, identityDockerFor, readJobFile, exceedsDisk, builderName, runnerLabelValue, ensureFailureCount, builderSpec, ensureBuilder, spawnRun, RUNNER_LABEL, BUILD_LABEL, readJobFileChecked } from './chunk-KOZ6IBEI.js';
|
|
22
22
|
import { claimPidFile, writePidFile, readPidFile, releasePidFile } from './chunk-LQHCNXPK.js';
|
|
23
23
|
import { startTimeOf, isSameProcess } from './chunk-JBJTC3UU.js';
|
|
24
24
|
import { isSignatureRefusal, WorkCommandError, getJson, postJson } from './chunk-QABXXQ67.js';
|
|
@@ -3279,7 +3279,7 @@ async function startRunner(configPath, deps, startup) {
|
|
|
3279
3279
|
check: update.check ? () => update.check(configPath) : async () => {
|
|
3280
3280
|
const held = heldClaudeCredential();
|
|
3281
3281
|
const env = held === void 0 ? process.env : { ...process.env, [held.variable]: held.value };
|
|
3282
|
-
return (await import('./check-
|
|
3282
|
+
return (await import('./check-V66LZDNK.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl, env });
|
|
3283
3283
|
},
|
|
3284
3284
|
now: () => (deps.now ?? (() => /* @__PURE__ */ new Date()))().getTime(),
|
|
3285
3285
|
log
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
import { escapeUnitPath, UNIT_MARKER, DEFAULT_UNIT_NAME } from './chunk-
|
|
3
|
+
import { escapeUnitPath, UNIT_MARKER, DEFAULT_UNIT_NAME } from './chunk-TLIZ7FY4.js';
|
|
4
4
|
import { inspectService, realInspectProbes } from './chunk-SDAEXUIX.js';
|
|
5
5
|
import { realpathSync, readFileSync, readdirSync } from 'fs';
|
|
6
6
|
import { resolve, dirname, join } from 'path';
|