agent-hitch 0.2.0 → 0.2.2
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 +88 -250
- package/README.zh-CN.md +84 -230
- package/dist/bin/hitch.js +1 -1
- package/dist/bin/hitch.js.map +1 -1
- package/dist/scripts/check-architecture.js +159 -0
- package/dist/scripts/check-architecture.js.map +1 -0
- package/dist/scripts/check-release.js +1 -1
- package/dist/scripts/check-release.js.map +1 -1
- package/dist/src/adapters/catalog.js +55 -0
- package/dist/src/adapters/catalog.js.map +1 -0
- package/dist/src/adapters/contract.js +2 -0
- package/dist/src/adapters/contract.js.map +1 -0
- package/dist/src/adapters/discovery.js +22 -0
- package/dist/src/adapters/discovery.js.map +1 -0
- package/dist/src/adapters/index.js +3 -0
- package/dist/src/adapters/index.js.map +1 -0
- package/dist/src/adapters/providers/claude.js +69 -0
- package/dist/src/adapters/providers/claude.js.map +1 -0
- package/dist/src/adapters/providers/codex.js +74 -0
- package/dist/src/adapters/providers/codex.js.map +1 -0
- package/dist/src/adapters/providers/deepseek.js +51 -0
- package/dist/src/adapters/providers/deepseek.js.map +1 -0
- package/dist/src/adapters/providers/opencode.js +73 -0
- package/dist/src/adapters/providers/opencode.js.map +1 -0
- package/dist/src/adapters/providers/pi.js +82 -0
- package/dist/src/adapters/providers/pi.js.map +1 -0
- package/dist/src/adapters/providers/shared.js +82 -0
- package/dist/src/adapters/providers/shared.js.map +1 -0
- package/dist/src/artifacts/handoff.js +12 -0
- package/dist/src/artifacts/handoff.js.map +1 -0
- package/dist/src/artifacts/index.js +5 -0
- package/dist/src/artifacts/index.js.map +1 -0
- package/dist/src/artifacts/integrity.js +188 -0
- package/dist/src/artifacts/integrity.js.map +1 -0
- package/dist/src/artifacts/preparer.js +379 -0
- package/dist/src/artifacts/preparer.js.map +1 -0
- package/dist/src/artifacts/store.js +157 -0
- package/dist/src/artifacts/store.js.map +1 -0
- package/dist/src/artifacts/types.js +2 -0
- package/dist/src/artifacts/types.js.map +1 -0
- package/dist/src/backends/contract.js +2 -0
- package/dist/src/backends/contract.js.map +1 -0
- package/dist/src/{harbor-backend.js → backends/harbor/backend.js} +52 -14
- package/dist/src/backends/harbor/backend.js.map +1 -0
- package/dist/src/backends/harbor/index.js +4 -0
- package/dist/src/backends/harbor/index.js.map +1 -0
- package/dist/src/backends/harbor/local-git-transport.js +447 -0
- package/dist/src/backends/harbor/local-git-transport.js.map +1 -0
- package/dist/src/{eval-tools.js → backends/harbor/tools.js} +2 -6
- package/dist/src/backends/harbor/tools.js.map +1 -0
- package/dist/src/backends/index.js +4 -0
- package/dist/src/backends/index.js.map +1 -0
- package/dist/src/cli/arguments.js +123 -0
- package/dist/src/cli/arguments.js.map +1 -0
- package/dist/src/cli/commands/compare.js +55 -0
- package/dist/src/cli/commands/compare.js.map +1 -0
- package/dist/src/cli/commands/daemon.js +106 -0
- package/dist/src/cli/commands/daemon.js.map +1 -0
- package/dist/src/cli/commands/eval.js +126 -0
- package/dist/src/cli/commands/eval.js.map +1 -0
- package/dist/src/cli/commands/feedback.js +84 -0
- package/dist/src/cli/commands/feedback.js.map +1 -0
- package/dist/src/cli/commands/inspect.js +20 -0
- package/dist/src/cli/commands/inspect.js.map +1 -0
- package/dist/src/cli/commands/list.js +17 -0
- package/dist/src/cli/commands/list.js.map +1 -0
- package/dist/src/cli/commands/prepare.js +21 -0
- package/dist/src/cli/commands/prepare.js.map +1 -0
- package/dist/src/cli/commands/resolve.js +17 -0
- package/dist/src/cli/commands/resolve.js.map +1 -0
- package/dist/src/cli/commands/run.js +145 -0
- package/dist/src/cli/commands/run.js.map +1 -0
- package/dist/src/cli/commands/runs.js +45 -0
- package/dist/src/cli/commands/runs.js.map +1 -0
- package/dist/src/cli/commands/trajectory.js +31 -0
- package/dist/src/cli/commands/trajectory.js.map +1 -0
- package/dist/src/cli/commands/workspace.js +44 -0
- package/dist/src/cli/commands/workspace.js.map +1 -0
- package/dist/src/cli/index.js +2 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/main.js +48 -0
- package/dist/src/cli/main.js.map +1 -0
- package/dist/src/cli/output.js +96 -0
- package/dist/src/cli/output.js.map +1 -0
- package/dist/src/controller-runtime/index.js +3 -0
- package/dist/src/controller-runtime/index.js.map +1 -0
- package/dist/src/controller-runtime/store.js +2 -7
- package/dist/src/controller-runtime/store.js.map +1 -1
- package/dist/src/daemon/auth.js +108 -0
- package/dist/src/daemon/auth.js.map +1 -0
- package/dist/src/daemon/client.js +76 -0
- package/dist/src/daemon/client.js.map +1 -0
- package/dist/src/daemon/index.js +5 -0
- package/dist/src/daemon/index.js.map +1 -0
- package/dist/src/daemon/launcher.js +24 -0
- package/dist/src/daemon/launcher.js.map +1 -0
- package/dist/src/{scheduler.js → daemon/scheduler.js} +6 -7
- package/dist/src/daemon/scheduler.js.map +1 -0
- package/dist/src/{daemon.js → daemon/server.js} +10 -155
- package/dist/src/daemon/server.js.map +1 -0
- package/dist/src/domain/artifacts.js +2 -0
- package/dist/src/domain/artifacts.js.map +1 -0
- package/dist/src/domain/controller-runtime.js +2 -0
- package/dist/src/domain/controller-runtime.js.map +1 -0
- package/dist/src/domain/eval-records.js +2 -0
- package/dist/src/domain/eval-records.js.map +1 -0
- package/dist/src/domain/evals.js +2 -0
- package/dist/src/domain/evals.js.map +1 -0
- package/dist/src/domain/feedback.js +2 -0
- package/dist/src/domain/feedback.js.map +1 -0
- package/dist/src/domain/{types.js → ids.js} +1 -1
- package/dist/src/domain/ids.js.map +1 -0
- package/dist/src/domain/index.js +11 -0
- package/dist/src/domain/index.js.map +1 -0
- package/dist/src/domain/revisions.js +2 -0
- package/dist/src/domain/revisions.js.map +1 -0
- package/dist/src/domain/runs.js +3 -0
- package/dist/src/domain/runs.js.map +1 -0
- package/dist/src/domain/trajectories.js +2 -0
- package/dist/src/domain/trajectories.js.map +1 -0
- package/dist/src/domain/{validate.js → validation.js} +194 -5
- package/dist/src/domain/validation.js.map +1 -0
- package/dist/src/domain/workspaces.js +2 -0
- package/dist/src/domain/workspaces.js.map +1 -0
- package/dist/src/evals/events.js +67 -0
- package/dist/src/evals/events.js.map +1 -0
- package/dist/src/evals/index.js +5 -0
- package/dist/src/evals/index.js.map +1 -0
- package/dist/src/evals/records.js +55 -0
- package/dist/src/evals/records.js.map +1 -0
- package/dist/src/evals/request.js +109 -0
- package/dist/src/evals/request.js.map +1 -0
- package/dist/src/evals/service.js +280 -0
- package/dist/src/evals/service.js.map +1 -0
- package/dist/src/evals/trial-import.js +394 -0
- package/dist/src/evals/trial-import.js.map +1 -0
- package/dist/src/feedback/index.js +2 -0
- package/dist/src/feedback/index.js.map +1 -0
- package/dist/src/feedback/service.js +3 -4
- package/dist/src/feedback/service.js.map +1 -1
- package/dist/src/{config.js → foundation/config.js} +1 -0
- package/dist/src/foundation/config.js.map +1 -0
- package/dist/src/foundation/errors.js.map +1 -0
- package/dist/src/foundation/executable.js +135 -0
- package/dist/src/foundation/executable.js.map +1 -0
- package/dist/src/foundation/fs.js.map +1 -0
- package/dist/src/foundation/hash.js +24 -0
- package/dist/src/foundation/hash.js.map +1 -0
- package/dist/src/foundation/index.js +11 -0
- package/dist/src/foundation/index.js.map +1 -0
- package/dist/src/foundation/line-stream.js.map +1 -0
- package/dist/src/foundation/locks.js +114 -0
- package/dist/src/foundation/locks.js.map +1 -0
- package/dist/src/{package-root.js → foundation/package-root.js} +3 -2
- package/dist/src/foundation/package-root.js.map +1 -0
- package/dist/src/foundation/process.js.map +1 -0
- package/dist/src/revisions/index.js +4 -0
- package/dist/src/revisions/index.js.map +1 -0
- package/dist/src/{harness-reference.js → revisions/reference.js} +16 -2
- package/dist/src/revisions/reference.js.map +1 -0
- package/dist/src/revisions/resolver.js +25 -0
- package/dist/src/revisions/resolver.js.map +1 -0
- package/dist/src/revisions/sources/git.js +180 -0
- package/dist/src/revisions/sources/git.js.map +1 -0
- package/dist/src/revisions/sources/installed.js +45 -0
- package/dist/src/revisions/sources/installed.js.map +1 -0
- package/dist/src/revisions/sources/npm.js +97 -0
- package/dist/src/revisions/sources/npm.js.map +1 -0
- package/dist/src/runs/compare.js +132 -0
- package/dist/src/runs/compare.js.map +1 -0
- package/dist/src/{events.js → runs/events.js} +1 -2
- package/dist/src/runs/events.js.map +1 -0
- package/dist/src/{engine.js → runs/executor.js} +172 -151
- package/dist/src/runs/executor.js.map +1 -0
- package/dist/src/runs/finalizer.js +22 -0
- package/dist/src/runs/finalizer.js.map +1 -0
- package/dist/src/runs/identity.js +35 -0
- package/dist/src/runs/identity.js.map +1 -0
- package/dist/src/runs/index.js +11 -0
- package/dist/src/runs/index.js.map +1 -0
- package/dist/src/runs/manifest.js +70 -0
- package/dist/src/runs/manifest.js.map +1 -0
- package/dist/src/runs/outcome.js +49 -0
- package/dist/src/runs/outcome.js.map +1 -0
- package/dist/src/runs/query.js +104 -0
- package/dist/src/runs/query.js.map +1 -0
- package/dist/src/runs/queued.js +54 -0
- package/dist/src/runs/queued.js.map +1 -0
- package/dist/src/runs/records.js +288 -0
- package/dist/src/runs/records.js.map +1 -0
- package/dist/src/runs/request.js +169 -0
- package/dist/src/runs/request.js.map +1 -0
- package/dist/src/trajectories/format.js +1 -1
- package/dist/src/trajectories/format.js.map +1 -1
- package/dist/src/trajectories/index.js +7 -0
- package/dist/src/trajectories/index.js.map +1 -0
- package/dist/src/trajectories/projector.js +1 -1
- package/dist/src/trajectories/projector.js.map +1 -1
- package/dist/src/trajectories/provider-capture.js +133 -0
- package/dist/src/trajectories/provider-capture.js.map +1 -0
- package/dist/src/trajectories/providers/deepseek.js +179 -0
- package/dist/src/trajectories/providers/deepseek.js.map +1 -0
- package/dist/src/trajectories/store.js +148 -8
- package/dist/src/trajectories/store.js.map +1 -1
- package/dist/src/workspaces/copy.js +142 -0
- package/dist/src/workspaces/copy.js.map +1 -0
- package/dist/src/workspaces/digest.js +47 -0
- package/dist/src/workspaces/digest.js.map +1 -0
- package/dist/src/workspaces/git.js +164 -0
- package/dist/src/workspaces/git.js.map +1 -0
- package/dist/src/workspaces/index.js +6 -0
- package/dist/src/workspaces/index.js.map +1 -0
- package/dist/src/workspaces/lifecycle.js +313 -0
- package/dist/src/workspaces/lifecycle.js.map +1 -0
- package/dist/src/workspaces/planner.js +80 -0
- package/dist/src/workspaces/planner.js.map +1 -0
- package/dist/src/workspaces/store.js +25 -0
- package/dist/src/workspaces/store.js.map +1 -0
- package/dist/src/workspaces/types.js +4 -0
- package/dist/src/workspaces/types.js.map +1 -0
- package/dist/src/workspaces/utils.js +56 -0
- package/dist/src/workspaces/utils.js.map +1 -0
- package/docs/schemas/eval-request.schema.json +2 -0
- package/docs/schemas/eval-result.schema.json +50 -1
- package/docs/schemas/local-git-transport-manifest.schema.json +34 -0
- package/docs/schemas/result.schema.json +9 -0
- package/docs/schemas/run-context.schema.json +39 -0
- package/docs/schemas/run-manifest.schema.json +81 -0
- package/docs/schemas/run-request.schema.json +16 -1
- package/docs/schemas/trajectory-ref.schema.json +66 -23
- package/integrations/harbor/hitch_harbor_agent.py +482 -10
- package/package.json +21 -3
- package/dist/src/adapters.js +0 -461
- package/dist/src/adapters.js.map +0 -1
- package/dist/src/artifacts.js +0 -1081
- package/dist/src/artifacts.js.map +0 -1
- package/dist/src/cli.js +0 -699
- package/dist/src/cli.js.map +0 -1
- package/dist/src/config.js.map +0 -1
- package/dist/src/daemon.js.map +0 -1
- package/dist/src/domain/types.js.map +0 -1
- package/dist/src/domain/validate.js.map +0 -1
- package/dist/src/engine.js.map +0 -1
- package/dist/src/errors.js.map +0 -1
- package/dist/src/eval-tools.js.map +0 -1
- package/dist/src/evals.js +0 -313
- package/dist/src/evals.js.map +0 -1
- package/dist/src/events.js.map +0 -1
- package/dist/src/fs.js.map +0 -1
- package/dist/src/harbor-backend.js.map +0 -1
- package/dist/src/harness-reference.js.map +0 -1
- package/dist/src/line-stream.js.map +0 -1
- package/dist/src/locks.js +0 -38
- package/dist/src/locks.js.map +0 -1
- package/dist/src/package-root.js.map +0 -1
- package/dist/src/process.js.map +0 -1
- package/dist/src/registry.js +0 -81
- package/dist/src/registry.js.map +0 -1
- package/dist/src/scheduler.js.map +0 -1
- package/dist/src/workspaces.js +0 -858
- package/dist/src/workspaces.js.map +0 -1
- /package/dist/src/{errors.js → foundation/errors.js} +0 -0
- /package/dist/src/{fs.js → foundation/fs.js} +0 -0
- /package/dist/src/{line-stream.js → foundation/line-stream.js} +0 -0
- /package/dist/src/{process.js → foundation/process.js} +0 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { constants, createReadStream } from "node:fs";
|
|
3
|
+
import { access, lstat, readFile, readdir, readlink, stat } from "node:fs/promises";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { HitchError, digest, fingerprintExecutable } from "../foundation/index.js";
|
|
6
|
+
export async function npmPackageEntrypoint(directory, packageName, binName, nodeModulesDirectory = "node_modules") {
|
|
7
|
+
const packageDirectory = path.join(directory, nodeModulesDirectory, ...packageName.split("/"));
|
|
8
|
+
let metadata;
|
|
9
|
+
try {
|
|
10
|
+
metadata = JSON.parse(await readFile(path.join(packageDirectory, "package.json"), "utf8"));
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
throw new HitchError(`installed package has no readable package.json: ${packageName}`, {
|
|
14
|
+
code: "artifact_invalid",
|
|
15
|
+
exitCode: 5,
|
|
16
|
+
cause: error,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
const binTarget = typeof metadata.bin === "string" ? metadata.bin : metadata.bin?.[binName];
|
|
20
|
+
if (typeof binTarget !== "string" || !binTarget) {
|
|
21
|
+
throw new HitchError(`installed package does not declare the ${binName} executable: ${packageName}`, {
|
|
22
|
+
code: "artifact_invalid",
|
|
23
|
+
exitCode: 5,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
const absolute = path.resolve(packageDirectory, binTarget);
|
|
27
|
+
if (absolute !== packageDirectory && !absolute.startsWith(`${packageDirectory}${path.sep}`)) {
|
|
28
|
+
throw new HitchError(`package executable escapes its installation directory: ${packageName}`, {
|
|
29
|
+
code: "artifact_invalid",
|
|
30
|
+
exitCode: 5,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return path.relative(directory, absolute);
|
|
34
|
+
}
|
|
35
|
+
export function entrypointLauncher(entrypoint) {
|
|
36
|
+
return /\.(?:cjs|mjs|js)$/i.test(entrypoint) ? "node" : "direct";
|
|
37
|
+
}
|
|
38
|
+
export function artifactInvocation(manifest, directory) {
|
|
39
|
+
const entrypoint = path.join(directory, manifest.entrypoint);
|
|
40
|
+
return manifest.launcher === "node"
|
|
41
|
+
? { executable: process.execPath, entrypoint_args: [entrypoint] }
|
|
42
|
+
: { executable: entrypoint, entrypoint_args: [] };
|
|
43
|
+
}
|
|
44
|
+
export async function assertEntrypoint(file, launcher, reference) {
|
|
45
|
+
try {
|
|
46
|
+
await access(file, launcher === "node" ? constants.R_OK : constants.X_OK);
|
|
47
|
+
const info = await stat(file);
|
|
48
|
+
if (!info.isFile())
|
|
49
|
+
throw new Error("entrypoint is not a file");
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
throw new HitchError(`prepared artifact has no executable entrypoint for ${reference}: ${file}`, {
|
|
53
|
+
code: "artifact_invalid",
|
|
54
|
+
exitCode: 5,
|
|
55
|
+
cause: error,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export async function optionalFileDigest(file) {
|
|
60
|
+
try {
|
|
61
|
+
return `sha256:${createHash("sha256").update(await readFile(file)).digest("hex")}`;
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
if (error?.code === "ENOENT")
|
|
65
|
+
return null;
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export async function assertNpmResolution(directory, resolved) {
|
|
70
|
+
let lock;
|
|
71
|
+
try {
|
|
72
|
+
lock = JSON.parse(await readFile(path.join(directory, "package-lock.json"), "utf8"));
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
throw new HitchError(`npm did not produce a readable dependency lock for ${resolved.canonical_ref}`, {
|
|
76
|
+
code: "artifact_invalid",
|
|
77
|
+
exitCode: 5,
|
|
78
|
+
cause: error,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
const packageName = resolved.source.package;
|
|
82
|
+
const installed = packageName ? lock.packages?.[`node_modules/${packageName}`] : undefined;
|
|
83
|
+
if (installed?.version !== resolved.revision.version || installed?.integrity !== resolved.source.integrity) {
|
|
84
|
+
throw new HitchError(`installed package integrity does not match the resolution for ${resolved.canonical_ref}`, {
|
|
85
|
+
code: "artifact_integrity_mismatch",
|
|
86
|
+
exitCode: 5,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export async function assertGlobalNpmResolution(directory, resolved) {
|
|
91
|
+
const packageName = resolved.source.package;
|
|
92
|
+
let metadata;
|
|
93
|
+
try {
|
|
94
|
+
metadata = JSON.parse(await readFile(path.join(directory, "lib", "node_modules", ...(packageName || "").split("/"), "package.json"), "utf8"));
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
throw new HitchError(`npm did not produce a readable global package for ${resolved.canonical_ref}`, {
|
|
98
|
+
code: "artifact_invalid",
|
|
99
|
+
exitCode: 5,
|
|
100
|
+
cause: error,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
if (metadata.name !== packageName || metadata.version !== resolved.revision.version) {
|
|
104
|
+
throw new HitchError(`installed package version does not match the resolution for ${resolved.canonical_ref}`, {
|
|
105
|
+
code: "artifact_integrity_mismatch",
|
|
106
|
+
exitCode: 5,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
export async function sourceLockIdentity(directory) {
|
|
111
|
+
const candidates = ["package-lock.json", "npm-shrinkwrap.json", "pnpm-lock.yaml", "bun.lock", path.join("codex-rs", "Cargo.lock")];
|
|
112
|
+
const locks = {};
|
|
113
|
+
for (const candidate of candidates) {
|
|
114
|
+
const identity = await optionalFileDigest(path.join(directory, candidate));
|
|
115
|
+
if (identity)
|
|
116
|
+
locks[candidate] = identity;
|
|
117
|
+
}
|
|
118
|
+
return Object.keys(locks).length > 0 ? digest(locks) : null;
|
|
119
|
+
}
|
|
120
|
+
export async function executableMatches(executable, identity) {
|
|
121
|
+
try {
|
|
122
|
+
return await fingerprintExecutable(executable) === identity;
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
export async function artifactMatches(directory, manifest) {
|
|
129
|
+
if (!manifest?.entrypoint || !manifest.entrypoint_integrity || !manifest.artifact_integrity)
|
|
130
|
+
return false;
|
|
131
|
+
const root = path.resolve(directory);
|
|
132
|
+
const executable = path.resolve(root, manifest.entrypoint);
|
|
133
|
+
if (executable !== root && !executable.startsWith(`${root}${path.sep}`))
|
|
134
|
+
return false;
|
|
135
|
+
if (!await executableMatches(executable, manifest.entrypoint_integrity))
|
|
136
|
+
return false;
|
|
137
|
+
try {
|
|
138
|
+
return await artifactDirectoryIntegrity(directory) === manifest.artifact_integrity;
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export async function artifactDirectoryIntegrity(directory) {
|
|
145
|
+
const root = path.resolve(directory);
|
|
146
|
+
const hash = createHash("sha256");
|
|
147
|
+
await digestArtifactDirectory(hash, root, root, "", true);
|
|
148
|
+
return `sha256:${hash.digest("hex")}`;
|
|
149
|
+
}
|
|
150
|
+
async function digestArtifactDirectory(hash, root, directory, relative, topLevel) {
|
|
151
|
+
const entries = await readdir(directory);
|
|
152
|
+
entries.sort();
|
|
153
|
+
for (const name of entries) {
|
|
154
|
+
if (topLevel && name === "artifact.json")
|
|
155
|
+
continue;
|
|
156
|
+
const absolute = path.join(directory, name);
|
|
157
|
+
const childRelative = relative ? path.join(relative, name) : name;
|
|
158
|
+
const info = await lstat(absolute);
|
|
159
|
+
if (info.isDirectory()) {
|
|
160
|
+
hash.update(`d\0${childRelative}\0${info.mode & 0o7777}\0`);
|
|
161
|
+
await digestArtifactDirectory(hash, root, absolute, childRelative, false);
|
|
162
|
+
}
|
|
163
|
+
else if (info.isFile()) {
|
|
164
|
+
hash.update(`f\0${childRelative}\0${info.mode & 0o7777}\0${info.size}\0`);
|
|
165
|
+
for await (const chunk of createReadStream(absolute))
|
|
166
|
+
hash.update(chunk);
|
|
167
|
+
hash.update("\0");
|
|
168
|
+
}
|
|
169
|
+
else if (info.isSymbolicLink()) {
|
|
170
|
+
const target = await readlink(absolute);
|
|
171
|
+
const resolvedTarget = path.resolve(path.dirname(absolute), target);
|
|
172
|
+
if (resolvedTarget !== root && !resolvedTarget.startsWith(`${root}${path.sep}`)) {
|
|
173
|
+
throw new HitchError(`artifact symlink escapes its installation directory: ${absolute}`, {
|
|
174
|
+
code: "artifact_invalid",
|
|
175
|
+
exitCode: 5,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
hash.update(`l\0${childRelative}\0${target}\0`);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
throw new HitchError(`unsupported special file in prepared artifact: ${absolute}`, {
|
|
182
|
+
code: "artifact_invalid",
|
|
183
|
+
exitCode: 5,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=integrity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrity.js","sourceRoot":"","sources":["../../../src/artifacts/integrity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { chmod, lstat, readdir, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { getAdapter } from "../adapters/index.js";
|
|
5
|
+
import { SCHEMA_VERSION, HitchError, atomicWriteJSON, commandExecutable, commandVersion, detectVersion, digest, ensureDir, fingerprintExecutable, readJSON, runCommand, statePaths } from "../foundation/index.js";
|
|
6
|
+
import { gitCacheDirectory } from "../revisions/index.js";
|
|
7
|
+
import { artifactDirectoryIntegrity, artifactInvocation, artifactMatches, assertEntrypoint, assertGlobalNpmResolution, assertNpmResolution, entrypointLauncher, npmPackageEntrypoint, optionalFileDigest, sourceLockIdentity } from "./integrity.js";
|
|
8
|
+
import { artifactManifest, promoteArtifact, readCachedArtifact, withArtifactLock } from "./store.js";
|
|
9
|
+
const RECIPE_VERSION = "1";
|
|
10
|
+
export async function prepareHarness(resolved, { root, env = process.env, signal, verifiedLocalGitSource } = {}) {
|
|
11
|
+
if (!resolved || typeof resolved !== "object" || !resolved.identity) {
|
|
12
|
+
throw new HitchError("resolved revision is required", { code: "invalid_resolution", exitCode: 2 });
|
|
13
|
+
}
|
|
14
|
+
const adapter = getAdapter(resolved.harness_id);
|
|
15
|
+
if (resolved.source.type === "installed")
|
|
16
|
+
return prepareInstalled(resolved, adapter);
|
|
17
|
+
if (!root)
|
|
18
|
+
throw new HitchError("a Hitch state root is required to prepare managed revisions");
|
|
19
|
+
const source = adapter.revision_sources?.[resolved.selector.type];
|
|
20
|
+
if (!source) {
|
|
21
|
+
throw new HitchError(`${resolved.harness_id} does not support ${resolved.selector.type} revisions`, {
|
|
22
|
+
code: "revision_selector_unsupported",
|
|
23
|
+
exitCode: 10,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
const paths = statePaths(root);
|
|
27
|
+
if (verifiedLocalGitSource)
|
|
28
|
+
await assertVerifiedLocalGitSource(resolved, verifiedLocalGitSource, env, signal);
|
|
29
|
+
const preparationKey = digest({
|
|
30
|
+
revision_identity: resolved.identity,
|
|
31
|
+
recipe_version: RECIPE_VERSION,
|
|
32
|
+
recipe: recipeIdentity(source),
|
|
33
|
+
platform: process.platform,
|
|
34
|
+
architecture: process.arch,
|
|
35
|
+
node: process.versions.node,
|
|
36
|
+
});
|
|
37
|
+
return withArtifactLock(paths, preparationKey, async () => {
|
|
38
|
+
const cached = await readCachedArtifact(paths, preparationKey, resolved.identity);
|
|
39
|
+
if (cached)
|
|
40
|
+
return { ...cached, cache_hit: true };
|
|
41
|
+
return resolved.source.type === "npm"
|
|
42
|
+
? prepareNpmArtifact(resolved, adapter, source, paths, preparationKey, env, signal)
|
|
43
|
+
: prepareGitArtifact(resolved, adapter, source, paths, preparationKey, env, signal, verifiedLocalGitSource?.directory);
|
|
44
|
+
}, { ...(signal ? { signal } : {}) });
|
|
45
|
+
}
|
|
46
|
+
export async function listPreparedArtifacts(harnessId, { root } = {}) {
|
|
47
|
+
if (!root)
|
|
48
|
+
throw new HitchError("a Hitch state root is required to list prepared artifacts");
|
|
49
|
+
const directory = statePaths(root).artifacts;
|
|
50
|
+
let entries;
|
|
51
|
+
try {
|
|
52
|
+
entries = await readdir(directory, { withFileTypes: true });
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
if (error?.code === "ENOENT")
|
|
56
|
+
return [];
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
const artifacts = [];
|
|
60
|
+
for (const entry of entries) {
|
|
61
|
+
if (!entry.isDirectory())
|
|
62
|
+
continue;
|
|
63
|
+
const manifest = await readJSON(path.join(directory, entry.name, "artifact.json"), null).catch(() => null);
|
|
64
|
+
if (!manifest || manifest.harness_id !== harnessId)
|
|
65
|
+
continue;
|
|
66
|
+
const artifactDirectory = path.join(directory, entry.name);
|
|
67
|
+
const ready = await artifactMatches(artifactDirectory, manifest);
|
|
68
|
+
artifacts.push({ ...manifest, status: ready ? "ready" : "invalid" });
|
|
69
|
+
}
|
|
70
|
+
return artifacts.sort((left, right) => String(right.prepared_at || "").localeCompare(String(left.prepared_at || "")));
|
|
71
|
+
}
|
|
72
|
+
async function prepareInstalled(resolved, adapter) {
|
|
73
|
+
const executable = resolved.source.executable;
|
|
74
|
+
if (!executable) {
|
|
75
|
+
throw new HitchError("installed resolution is missing its executable", { code: "artifact_integrity_mismatch", exitCode: 5 });
|
|
76
|
+
}
|
|
77
|
+
let currentIdentity;
|
|
78
|
+
try {
|
|
79
|
+
currentIdentity = await fingerprintExecutable(executable);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
throw new HitchError(`installed harness is no longer readable: ${executable}`, {
|
|
83
|
+
code: "artifact_integrity_mismatch",
|
|
84
|
+
exitCode: 5,
|
|
85
|
+
cause: error,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
if (currentIdentity !== resolved.source.integrity) {
|
|
89
|
+
throw new HitchError(`installed harness changed after resolution: ${executable}`, {
|
|
90
|
+
code: "artifact_integrity_mismatch",
|
|
91
|
+
exitCode: 5,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
schema_version: SCHEMA_VERSION,
|
|
96
|
+
artifact_id: digest({ revision_identity: resolved.identity, recipe_version: RECIPE_VERSION }),
|
|
97
|
+
harness_id: resolved.harness_id,
|
|
98
|
+
revision_identity: resolved.identity,
|
|
99
|
+
source_type: "installed",
|
|
100
|
+
adapter: adapter.id,
|
|
101
|
+
adapter_version: RECIPE_VERSION,
|
|
102
|
+
recipe_version: RECIPE_VERSION,
|
|
103
|
+
platform: `${process.platform}-${process.arch}`,
|
|
104
|
+
entrypoint: executable,
|
|
105
|
+
launcher: "direct",
|
|
106
|
+
entrypoint_integrity: currentIdentity,
|
|
107
|
+
artifact_integrity: currentIdentity,
|
|
108
|
+
toolchain: { node: process.version },
|
|
109
|
+
resolved_revision: resolved,
|
|
110
|
+
executable,
|
|
111
|
+
entrypoint_args: [],
|
|
112
|
+
observed_version: resolved.revision.version,
|
|
113
|
+
external: true,
|
|
114
|
+
cache_hit: true,
|
|
115
|
+
prepared_at: resolved.resolved_at,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
async function prepareNpmArtifact(resolved, adapter, source, paths, preparationKey, env, signal) {
|
|
119
|
+
const staging = await newStagingDirectory(paths, resolved.harness_id);
|
|
120
|
+
try {
|
|
121
|
+
const npm = commandExecutable("npm", env);
|
|
122
|
+
const tarball = resolved.source.tarball;
|
|
123
|
+
if (!tarball)
|
|
124
|
+
throw new HitchError("npm resolution is missing its tarball", { code: "prepare_failed", exitCode: 5 });
|
|
125
|
+
const installMode = source.install_mode || "project";
|
|
126
|
+
let nodeModulesDirectory = "node_modules";
|
|
127
|
+
let lockIdentity;
|
|
128
|
+
if (installMode === "global") {
|
|
129
|
+
const packedTarball = await packResolvedNpmTarball(npm, staging, resolved, env, signal);
|
|
130
|
+
try {
|
|
131
|
+
await runCommand(npm, ["install", "--global", "--prefix", staging, "--no-audit", "--no-fund", packedTarball], {
|
|
132
|
+
env,
|
|
133
|
+
signal,
|
|
134
|
+
failureCode: "prepare_failed",
|
|
135
|
+
failureExitCode: 5,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
finally {
|
|
139
|
+
await rm(packedTarball, { force: true });
|
|
140
|
+
}
|
|
141
|
+
nodeModulesDirectory = path.join("lib", "node_modules");
|
|
142
|
+
await assertGlobalNpmResolution(staging, resolved);
|
|
143
|
+
lockIdentity = digest({
|
|
144
|
+
package: resolved.source.package,
|
|
145
|
+
version: resolved.revision.version,
|
|
146
|
+
integrity: resolved.source.integrity,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
await writeFile(path.join(staging, "package.json"), `${JSON.stringify({ private: true })}\n`, { mode: 0o600 });
|
|
151
|
+
await runCommand(npm, ["install", "--no-audit", "--no-fund", "--save-exact", tarball], {
|
|
152
|
+
cwd: staging,
|
|
153
|
+
env,
|
|
154
|
+
signal,
|
|
155
|
+
failureCode: "prepare_failed",
|
|
156
|
+
failureExitCode: 5,
|
|
157
|
+
});
|
|
158
|
+
await assertNpmResolution(staging, resolved);
|
|
159
|
+
lockIdentity = await optionalFileDigest(path.join(staging, "package-lock.json"));
|
|
160
|
+
}
|
|
161
|
+
const packageName = resolved.source.package;
|
|
162
|
+
if (!packageName)
|
|
163
|
+
throw new HitchError("npm resolution is missing its package name", { code: "prepare_failed", exitCode: 5 });
|
|
164
|
+
const binName = source.bin;
|
|
165
|
+
if (!binName)
|
|
166
|
+
throw new HitchError("npm revision source is missing its bin name", { code: "prepare_failed", exitCode: 5 });
|
|
167
|
+
const entrypoint = await npmPackageEntrypoint(staging, packageName, binName, nodeModulesDirectory);
|
|
168
|
+
const stagedExecutable = path.join(staging, entrypoint);
|
|
169
|
+
await assertEntrypoint(stagedExecutable, entrypointLauncher(entrypoint), resolved.canonical_ref);
|
|
170
|
+
const toolchain = { node: process.version, npm: await commandVersion(npm, env, signal) };
|
|
171
|
+
const launcher = entrypointLauncher(entrypoint);
|
|
172
|
+
const invocation = artifactInvocation({ entrypoint, launcher }, staging);
|
|
173
|
+
const observedVersion = await detectVersion(invocation.executable, [...invocation.entrypoint_args, ...adapter.version_args]);
|
|
174
|
+
throwIfAborted(signal);
|
|
175
|
+
assertObservedVersion(observedVersion, resolved.revision.version || "", resolved.canonical_ref);
|
|
176
|
+
const entrypointIntegrity = await fingerprintExecutable(stagedExecutable);
|
|
177
|
+
const artifactIntegrity = await artifactDirectoryIntegrity(staging);
|
|
178
|
+
const artifactId = digest({
|
|
179
|
+
preparation_key: preparationKey,
|
|
180
|
+
dependency_lock: lockIdentity,
|
|
181
|
+
toolchain,
|
|
182
|
+
artifact_integrity: artifactIntegrity,
|
|
183
|
+
});
|
|
184
|
+
const manifest = artifactManifest(resolved, adapter, artifactId, entrypoint, toolchain, {
|
|
185
|
+
dependency_lock: lockIdentity,
|
|
186
|
+
artifact_integrity: artifactIntegrity,
|
|
187
|
+
});
|
|
188
|
+
manifest.launcher = launcher;
|
|
189
|
+
manifest.observed_version = observedVersion || null;
|
|
190
|
+
manifest.entrypoint_integrity = entrypointIntegrity;
|
|
191
|
+
await atomicWriteJSON(path.join(staging, "artifact.json"), manifest);
|
|
192
|
+
return promoteArtifact(paths, staging, manifest, preparationKey);
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
await rm(staging, { recursive: true, force: true });
|
|
196
|
+
throw normalizePreparationError(error, resolved.canonical_ref);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
async function prepareGitArtifact(resolved, adapter, source, paths, preparationKey, env, signal, verifiedSourceDirectory) {
|
|
200
|
+
const staging = await newStagingDirectory(paths, resolved.harness_id);
|
|
201
|
+
const sourceDirectory = path.join(staging, "source");
|
|
202
|
+
try {
|
|
203
|
+
const git = commandExecutable("git", env);
|
|
204
|
+
const sourceRepository = verifiedSourceDirectory || gitCacheDirectory(paths, resolved.source.url || "");
|
|
205
|
+
await runCommand(git, ["clone", "--no-hardlinks", "--no-checkout", sourceRepository, sourceDirectory], {
|
|
206
|
+
env,
|
|
207
|
+
signal,
|
|
208
|
+
failureCode: "prepare_failed",
|
|
209
|
+
failureExitCode: 5,
|
|
210
|
+
});
|
|
211
|
+
await runCommand(git, ["-C", sourceDirectory, "checkout", "--detach", resolved.revision.commit], {
|
|
212
|
+
env,
|
|
213
|
+
signal,
|
|
214
|
+
failureCode: "prepare_failed",
|
|
215
|
+
failureExitCode: 5,
|
|
216
|
+
});
|
|
217
|
+
const toolchain = { node: process.version };
|
|
218
|
+
for (const command of source.commands || []) {
|
|
219
|
+
const executable = commandExecutable(command.executable, env);
|
|
220
|
+
toolchain[command.executable] ||= await commandVersion(executable, env, signal);
|
|
221
|
+
await runCommand(executable, command.args || [], {
|
|
222
|
+
cwd: path.resolve(sourceDirectory, command.cwd || "."),
|
|
223
|
+
env,
|
|
224
|
+
signal,
|
|
225
|
+
failureCode: "prepare_failed",
|
|
226
|
+
failureExitCode: 5,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
const entrypoint = path.join("source", source.entrypoint || "");
|
|
230
|
+
const stagedExecutable = path.join(staging, entrypoint);
|
|
231
|
+
if (stagedExecutable.endsWith(".js"))
|
|
232
|
+
await chmod(stagedExecutable, 0o755).catch(() => { });
|
|
233
|
+
await assertEntrypoint(stagedExecutable, entrypointLauncher(entrypoint), resolved.canonical_ref);
|
|
234
|
+
const lockIdentity = await sourceLockIdentity(sourceDirectory);
|
|
235
|
+
await rm(path.join(sourceDirectory, ".git"), { recursive: true, force: true });
|
|
236
|
+
const launcher = entrypointLauncher(entrypoint);
|
|
237
|
+
const invocation = artifactInvocation({ entrypoint, launcher }, staging);
|
|
238
|
+
const observedVersion = await detectVersion(invocation.executable, [...invocation.entrypoint_args, ...adapter.version_args]);
|
|
239
|
+
throwIfAborted(signal);
|
|
240
|
+
const entrypointIntegrity = await fingerprintExecutable(stagedExecutable);
|
|
241
|
+
const artifactIntegrity = await artifactDirectoryIntegrity(staging);
|
|
242
|
+
const artifactId = digest({
|
|
243
|
+
preparation_key: preparationKey,
|
|
244
|
+
dependency_lock: lockIdentity,
|
|
245
|
+
toolchain,
|
|
246
|
+
artifact_integrity: artifactIntegrity,
|
|
247
|
+
});
|
|
248
|
+
const manifest = artifactManifest(resolved, adapter, artifactId, entrypoint, toolchain, {
|
|
249
|
+
dependency_lock: lockIdentity,
|
|
250
|
+
artifact_integrity: artifactIntegrity,
|
|
251
|
+
});
|
|
252
|
+
manifest.launcher = launcher;
|
|
253
|
+
manifest.observed_version = observedVersion || null;
|
|
254
|
+
manifest.entrypoint_integrity = entrypointIntegrity;
|
|
255
|
+
await atomicWriteJSON(path.join(staging, "artifact.json"), manifest);
|
|
256
|
+
return promoteArtifact(paths, staging, manifest, preparationKey);
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
await rm(staging, { recursive: true, force: true });
|
|
260
|
+
throw normalizePreparationError(error, resolved.canonical_ref);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
async function assertVerifiedLocalGitSource(resolved, verified, env, signal) {
|
|
264
|
+
if (resolved.source.type !== "git" || resolved.source.registered !== false || resolved.revision.type !== "commit") {
|
|
265
|
+
throw new HitchError("verified local Git source cannot be used with this resolution", { code: "local_source_integrity_mismatch", exitCode: 12 });
|
|
266
|
+
}
|
|
267
|
+
if (verified.resolutionIdentity !== resolved.identity || verified.commit !== resolved.revision.commit) {
|
|
268
|
+
throw new HitchError("verified local Git source does not match the locked resolution", { code: "local_source_integrity_mismatch", exitCode: 12 });
|
|
269
|
+
}
|
|
270
|
+
const info = await lstat(verified.directory).catch(() => null);
|
|
271
|
+
if (!info?.isDirectory() || info.isSymbolicLink()) {
|
|
272
|
+
throw new HitchError("verified local Git source is not a directory", { code: "local_source_integrity_mismatch", exitCode: 12 });
|
|
273
|
+
}
|
|
274
|
+
const git = commandExecutable("git", env);
|
|
275
|
+
const commitResult = await runCommand(git, ["-C", verified.directory, "rev-parse", "--verify", `${verified.commit}^{commit}`], {
|
|
276
|
+
env,
|
|
277
|
+
signal,
|
|
278
|
+
failureCode: "local_source_integrity_mismatch",
|
|
279
|
+
failureExitCode: 12,
|
|
280
|
+
});
|
|
281
|
+
const treeResult = await runCommand(git, ["-C", verified.directory, "rev-parse", "--verify", `${verified.commit}^{tree}`], {
|
|
282
|
+
env,
|
|
283
|
+
signal,
|
|
284
|
+
failureCode: "local_source_integrity_mismatch",
|
|
285
|
+
failureExitCode: 12,
|
|
286
|
+
});
|
|
287
|
+
if (commitResult.stdout.trim().toLowerCase() !== verified.commit || treeResult.stdout.trim().toLowerCase() !== verified.tree) {
|
|
288
|
+
throw new HitchError("verified local Git source commit or tree changed", { code: "local_source_integrity_mismatch", exitCode: 12 });
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
function recipeIdentity(source) {
|
|
292
|
+
return {
|
|
293
|
+
type: source.type,
|
|
294
|
+
package: source.package,
|
|
295
|
+
packages: source.packages,
|
|
296
|
+
bin: source.bin,
|
|
297
|
+
install_mode: source.install_mode,
|
|
298
|
+
url: source.url,
|
|
299
|
+
commands: source.commands,
|
|
300
|
+
entrypoint: source.entrypoint,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
async function newStagingDirectory(paths, harnessId) {
|
|
304
|
+
await ensureDir(paths.temporary);
|
|
305
|
+
const directory = path.join(paths.temporary, `${harnessId}-${process.pid}-${Date.now()}-${randomBytes(6).toString("hex")}`);
|
|
306
|
+
await ensureDir(directory);
|
|
307
|
+
return directory;
|
|
308
|
+
}
|
|
309
|
+
async function packResolvedNpmTarball(npm, directory, resolved, env, signal) {
|
|
310
|
+
const tarball = resolved.source.tarball;
|
|
311
|
+
if (!tarball)
|
|
312
|
+
throw new HitchError("npm resolution is missing its tarball", { code: "prepare_failed", exitCode: 5 });
|
|
313
|
+
const result = await runCommand(npm, ["pack", "--json", "--pack-destination", directory, tarball], {
|
|
314
|
+
env,
|
|
315
|
+
signal,
|
|
316
|
+
failureCode: "prepare_failed",
|
|
317
|
+
failureExitCode: 5,
|
|
318
|
+
});
|
|
319
|
+
let packed;
|
|
320
|
+
try {
|
|
321
|
+
const records = JSON.parse(result.stdout);
|
|
322
|
+
if (Array.isArray(records) && records.length === 1)
|
|
323
|
+
packed = records[0];
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
// The validation error below includes the resolved reference without exposing npm output.
|
|
327
|
+
}
|
|
328
|
+
const filename = packed?.filename;
|
|
329
|
+
if (packed?.name !== resolved.source.package
|
|
330
|
+
|| packed?.version !== resolved.revision.version
|
|
331
|
+
|| packed?.integrity !== resolved.source.integrity
|
|
332
|
+
|| typeof filename !== "string"
|
|
333
|
+
|| !filename
|
|
334
|
+
|| path.basename(filename) !== filename) {
|
|
335
|
+
throw new HitchError(`packed package integrity does not match the resolution for ${resolved.canonical_ref}`, {
|
|
336
|
+
code: "artifact_integrity_mismatch",
|
|
337
|
+
exitCode: 5,
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
const archive = path.join(directory, filename);
|
|
341
|
+
try {
|
|
342
|
+
if (!(await lstat(archive)).isFile())
|
|
343
|
+
throw new Error("packed archive is not a file");
|
|
344
|
+
}
|
|
345
|
+
catch (error) {
|
|
346
|
+
throw new HitchError(`npm did not produce a readable package archive for ${resolved.canonical_ref}`, {
|
|
347
|
+
code: "artifact_invalid",
|
|
348
|
+
exitCode: 5,
|
|
349
|
+
cause: error,
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
return archive;
|
|
353
|
+
}
|
|
354
|
+
function normalizePreparationError(error, reference) {
|
|
355
|
+
if (error instanceof HitchError)
|
|
356
|
+
return error;
|
|
357
|
+
return new HitchError(`failed to prepare ${reference}: ${error?.message || String(error)}`, {
|
|
358
|
+
code: "prepare_failed",
|
|
359
|
+
exitCode: 5,
|
|
360
|
+
cause: error,
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
function throwIfAborted(signal) {
|
|
364
|
+
if (signal?.aborted)
|
|
365
|
+
throw cancelledError();
|
|
366
|
+
}
|
|
367
|
+
function cancelledError() {
|
|
368
|
+
return new HitchError("harness preparation cancelled", { code: "cancelled", exitCode: 9 });
|
|
369
|
+
}
|
|
370
|
+
function assertObservedVersion(observed, expected, reference) {
|
|
371
|
+
const escaped = expected.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
372
|
+
if (!observed || !new RegExp(`(?:^|\\s)v?${escaped}(?:\\s|$)`).test(observed)) {
|
|
373
|
+
throw new HitchError(`prepared artifact for ${reference} reported ${observed || "no version"}; expected ${expected}`, {
|
|
374
|
+
code: "artifact_invalid",
|
|
375
|
+
exitCode: 5,
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
//# sourceMappingURL=preparer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preparer.js","sourceRoot":"","sources":["../../../src/artifacts/preparer.ts"],"names":[],"mappings":"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"}
|