agent-hitch 0.1.1 → 0.2.1
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 +235 -132
- package/README.zh-CN.md +335 -0
- package/dist/bin/hitch.js +9 -0
- package/dist/bin/hitch.js.map +1 -0
- package/dist/scripts/check-architecture.js +159 -0
- package/dist/scripts/check-architecture.js.map +1 -0
- package/dist/scripts/check-release.js +25 -0
- package/dist/scripts/check-release.js.map +1 -0
- package/dist/scripts/check-syntax.js +32 -0
- package/dist/scripts/check-syntax.js.map +1 -0
- 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/index.js +3 -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 +87 -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/backends/harbor/backend.js +305 -0
- 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/backends/harbor/tools.js +314 -0
- 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 +83 -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/hash.js +353 -0
- package/dist/src/controller-runtime/hash.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 +318 -0
- package/dist/src/controller-runtime/store.js.map +1 -0
- 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/daemon/scheduler.js +161 -0
- package/dist/src/daemon/scheduler.js.map +1 -0
- package/dist/src/daemon/server.js +316 -0
- 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/ids.js +10 -0
- 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/validation.js +429 -0
- 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 +227 -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 +314 -0
- package/dist/src/feedback/service.js.map +1 -0
- package/dist/src/foundation/config.js +54 -0
- package/dist/src/foundation/config.js.map +1 -0
- package/dist/src/foundation/errors.js +14 -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 +45 -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 +20 -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/foundation/package-root.js +41 -0
- package/dist/src/foundation/package-root.js.map +1 -0
- package/dist/src/foundation/process.js +50 -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/revisions/reference.js +97 -0
- 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/runs/events.js +79 -0
- package/dist/src/runs/events.js.map +1 -0
- package/dist/src/runs/executor.js +480 -0
- 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/contract.js +17 -0
- package/dist/src/trajectories/contract.js.map +1 -0
- package/dist/src/trajectories/format.js +127 -0
- package/dist/src/trajectories/format.js.map +1 -0
- package/dist/src/trajectories/index.js +7 -0
- package/dist/src/trajectories/index.js.map +1 -0
- package/dist/src/trajectories/projector.js +385 -0
- package/dist/src/trajectories/projector.js.map +1 -0
- 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 +421 -0
- package/dist/src/trajectories/store.js.map +1 -0
- 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/controller-runtime-manifest.schema.json +57 -0
- package/docs/schemas/controller-runtime-ref.schema.json +16 -0
- package/docs/schemas/eval-request.schema.json +2 -0
- package/docs/schemas/eval-result.schema.json +36 -1
- package/docs/schemas/local-git-transport-manifest.schema.json +34 -0
- package/docs/schemas/message-feedback.schema.json +37 -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 +73 -0
- package/integrations/harbor/hitch_harbor_agent.py +551 -5
- package/package.json +37 -11
- package/bin/hitch.js +0 -9
- package/src/adapters.js +0 -435
- package/src/artifacts.js +0 -949
- package/src/cli.js +0 -505
- package/src/config.js +0 -51
- package/src/daemon.js +0 -416
- package/src/engine.js +0 -400
- package/src/errors.js +0 -12
- package/src/eval-tools.js +0 -334
- package/src/evals.js +0 -276
- package/src/events.js +0 -69
- package/src/fs.js +0 -43
- package/src/harbor-backend.js +0 -285
- package/src/harness-reference.js +0 -78
- package/src/line-stream.js +0 -17
- package/src/locks.js +0 -33
- package/src/process.js +0 -49
- package/src/registry.js +0 -84
- package/src/scheduler.js +0 -156
- package/src/workspaces.js +0 -893
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
2
|
+
import { createReadStream, createWriteStream } from "node:fs";
|
|
3
|
+
import { chmod, lstat, mkdir, mkdtemp, rename, rm, stat } from "node:fs/promises";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { spawn } from "node:child_process";
|
|
6
|
+
import { HitchError, atomicWriteJSON, readJSON, terminateProcess } from "../../foundation/index.js";
|
|
7
|
+
export const LOCAL_GIT_TRANSPORT_SCHEMA_VERSION = "1";
|
|
8
|
+
export const LOCAL_GIT_TRANSPORT_PAYLOAD = "payload.pack";
|
|
9
|
+
export const LOCAL_GIT_TRANSPORT_MANIFEST = "manifest.json";
|
|
10
|
+
export const DEFAULT_LOCAL_GIT_TRANSPORT_LIMITS = {
|
|
11
|
+
maxPayloadBytes: 512 * 1024 * 1024,
|
|
12
|
+
maxObjects: 100_000,
|
|
13
|
+
maxFiles: 50_000,
|
|
14
|
+
maxFileBytes: 64 * 1024 * 1024,
|
|
15
|
+
};
|
|
16
|
+
export function localGitTransportLimitsFromEnv(env = process.env) {
|
|
17
|
+
return {
|
|
18
|
+
maxPayloadBytes: limit(env.HITCH_LOCAL_GIT_MAX_BYTES, DEFAULT_LOCAL_GIT_TRANSPORT_LIMITS.maxPayloadBytes, "HITCH_LOCAL_GIT_MAX_BYTES"),
|
|
19
|
+
maxObjects: limit(env.HITCH_LOCAL_GIT_MAX_OBJECTS, DEFAULT_LOCAL_GIT_TRANSPORT_LIMITS.maxObjects, "HITCH_LOCAL_GIT_MAX_OBJECTS"),
|
|
20
|
+
maxFiles: limit(env.HITCH_LOCAL_GIT_MAX_FILES, DEFAULT_LOCAL_GIT_TRANSPORT_LIMITS.maxFiles, "HITCH_LOCAL_GIT_MAX_FILES"),
|
|
21
|
+
maxFileBytes: limit(env.HITCH_LOCAL_GIT_MAX_FILE_BYTES, DEFAULT_LOCAL_GIT_TRANSPORT_LIMITS.maxFileBytes, "HITCH_LOCAL_GIT_MAX_FILE_BYTES"),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export async function buildLocalGitTransport({ evalDirectory, resolvedRevision, sourceDirectory, env = process.env, limits = localGitTransportLimitsFromEnv(env), signal, }) {
|
|
25
|
+
assertEligibleResolution(resolvedRevision);
|
|
26
|
+
throwIfAborted(signal);
|
|
27
|
+
const commit = resolvedRevision.revision.commit;
|
|
28
|
+
const git = env.HITCH_GIT_PATH?.trim() || "git";
|
|
29
|
+
const destination = path.join(evalDirectory, "local-source");
|
|
30
|
+
const temporary = path.join(evalDirectory, `.local-source-${process.pid}-${randomBytes(6).toString("hex")}.tmp`);
|
|
31
|
+
try {
|
|
32
|
+
await mkdir(temporary, { recursive: false, mode: 0o700 });
|
|
33
|
+
const observedCommit = (await runGit(git, sourceDirectory, ["rev-parse", `${commit}^{commit}`], env, signal)).trim();
|
|
34
|
+
if (observedCommit !== commit) {
|
|
35
|
+
throw integrityError(`source resolved ${commit} as ${observedCommit || "no commit"}`);
|
|
36
|
+
}
|
|
37
|
+
const tree = (await runGit(git, sourceDirectory, ["rev-parse", `${commit}^{tree}`], env, signal)).trim();
|
|
38
|
+
if (!objectIdPattern(commit).test(tree))
|
|
39
|
+
throw integrityError("source returned an invalid root tree OID");
|
|
40
|
+
const listing = await runGit(git, sourceDirectory, ["ls-tree", "-r", "-t", "-z", "--full-tree", commit], env, signal, 64 * 1024 * 1024);
|
|
41
|
+
const objectIds = new Set([commit, tree]);
|
|
42
|
+
let fileCount = 0;
|
|
43
|
+
for (const entry of listing.split("\0")) {
|
|
44
|
+
if (!entry)
|
|
45
|
+
continue;
|
|
46
|
+
const match = entry.match(/^([0-7]{6}) (blob|tree|commit) ([0-9a-f]{40}|[0-9a-f]{64})\t/);
|
|
47
|
+
if (!match)
|
|
48
|
+
throw transportError("Git returned a malformed tree entry");
|
|
49
|
+
const [, mode, type, oid] = match;
|
|
50
|
+
if (type === "blob" || type === "tree")
|
|
51
|
+
objectIds.add(oid);
|
|
52
|
+
if (type === "blob" || mode === "160000")
|
|
53
|
+
fileCount += 1;
|
|
54
|
+
if (fileCount > limits.maxFiles)
|
|
55
|
+
throw transportError(`local Git source exceeds the file limit (${limits.maxFiles})`);
|
|
56
|
+
}
|
|
57
|
+
if (objectIds.size > limits.maxObjects) {
|
|
58
|
+
throw transportError(`local Git source exceeds the object limit (${limits.maxObjects})`);
|
|
59
|
+
}
|
|
60
|
+
const sortedObjectIds = [...objectIds].sort();
|
|
61
|
+
const batch = await runGit(git, sourceDirectory, ["cat-file", `--batch-check=%(objectname) %(objecttype) %(objectsize)`], env, signal, 32 * 1024 * 1024, `${sortedObjectIds.join("\n")}\n`);
|
|
62
|
+
const checked = batch.trim().split("\n").filter(Boolean);
|
|
63
|
+
if (checked.length !== sortedObjectIds.length)
|
|
64
|
+
throw transportError("Git object inventory was incomplete");
|
|
65
|
+
for (const line of checked) {
|
|
66
|
+
const match = line.match(/^([0-9a-f]{40}|[0-9a-f]{64}) (blob|tree|commit) (\d+)$/);
|
|
67
|
+
if (!match)
|
|
68
|
+
throw transportError("Git returned malformed object metadata");
|
|
69
|
+
if (match[2] === "blob" && Number(match[3]) > limits.maxFileBytes) {
|
|
70
|
+
throw transportError(`local Git source contains a blob larger than the single-file limit (${limits.maxFileBytes} bytes)`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const payloadPath = path.join(temporary, LOCAL_GIT_TRANSPORT_PAYLOAD);
|
|
74
|
+
await writePack(git, sourceDirectory, sortedObjectIds, payloadPath, env, limits.maxPayloadBytes, signal);
|
|
75
|
+
const payloadInfo = await stat(payloadPath);
|
|
76
|
+
const payloadSha256 = await sha256File(payloadPath);
|
|
77
|
+
const manifest = {
|
|
78
|
+
schema_version: "1",
|
|
79
|
+
kind: "local-git-commit",
|
|
80
|
+
harness_id: resolvedRevision.harness_id,
|
|
81
|
+
resolution_identity: resolvedRevision.identity,
|
|
82
|
+
commit,
|
|
83
|
+
tree,
|
|
84
|
+
payload_sha256: payloadSha256,
|
|
85
|
+
payload_bytes: payloadInfo.size,
|
|
86
|
+
object_count: sortedObjectIds.length,
|
|
87
|
+
file_count: fileCount,
|
|
88
|
+
created_at: new Date().toISOString(),
|
|
89
|
+
};
|
|
90
|
+
validateLocalGitTransportManifest(manifest, limits);
|
|
91
|
+
await atomicWriteJSON(path.join(temporary, LOCAL_GIT_TRANSPORT_MANIFEST), manifest, 0o600);
|
|
92
|
+
await atomicWriteJSON(path.join(temporary, "resolution.json"), resolvedRevision, 0o600);
|
|
93
|
+
await verifyPackContents({ git, packPath: payloadPath, manifest, env, temporaryRoot: temporary, ...(signal ? { signal } : {}) });
|
|
94
|
+
await chmod(payloadPath, 0o600);
|
|
95
|
+
await chmod(temporary, 0o700);
|
|
96
|
+
await rename(temporary, destination);
|
|
97
|
+
return {
|
|
98
|
+
directory: destination,
|
|
99
|
+
manifestPath: path.join(destination, LOCAL_GIT_TRANSPORT_MANIFEST),
|
|
100
|
+
payloadPath: path.join(destination, LOCAL_GIT_TRANSPORT_PAYLOAD),
|
|
101
|
+
resolutionPath: path.join(destination, "resolution.json"),
|
|
102
|
+
manifest,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
await rm(temporary, { recursive: true, force: true }).catch(() => { });
|
|
107
|
+
if (signal?.aborted)
|
|
108
|
+
throw new HitchError("local Git transport was cancelled", { code: "cancelled", exitCode: 9 });
|
|
109
|
+
if (error instanceof HitchError)
|
|
110
|
+
throw error;
|
|
111
|
+
throw transportError(error?.message || String(error), error);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
export async function verifyLocalGitTransport(use, { expected, limits = DEFAULT_LOCAL_GIT_TRANSPORT_LIMITS, env = process.env, signal } = {}) {
|
|
115
|
+
const manifestInfo = await regularFile(use.manifestPath, "local Git transport manifest");
|
|
116
|
+
if (manifestInfo.size > 64 * 1024)
|
|
117
|
+
throw integrityError("transport manifest exceeds 64 KiB");
|
|
118
|
+
let manifest;
|
|
119
|
+
try {
|
|
120
|
+
manifest = validateLocalGitTransportManifest(await readJSON(use.manifestPath), limits);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
throw integrityError(`transport manifest is invalid: ${error?.message || String(error)}`, error);
|
|
124
|
+
}
|
|
125
|
+
if (expected) {
|
|
126
|
+
if (manifest.harness_id !== expected.harnessId)
|
|
127
|
+
throw integrityError("transport harness id does not match the locked resolution");
|
|
128
|
+
if (manifest.resolution_identity !== expected.resolutionIdentity)
|
|
129
|
+
throw integrityError("transport resolution identity does not match the locked resolution");
|
|
130
|
+
if (manifest.commit !== expected.commit)
|
|
131
|
+
throw integrityError("transport commit does not match the locked resolution");
|
|
132
|
+
}
|
|
133
|
+
const payloadInfo = await regularFile(use.payloadPath, "local Git transport payload");
|
|
134
|
+
if (payloadInfo.size !== manifest.payload_bytes)
|
|
135
|
+
throw integrityError("transport payload size does not match its manifest");
|
|
136
|
+
if (payloadInfo.size > limits.maxPayloadBytes)
|
|
137
|
+
throw integrityError("transport payload exceeds the configured size limit");
|
|
138
|
+
const digest = await sha256File(use.payloadPath);
|
|
139
|
+
if (digest !== manifest.payload_sha256)
|
|
140
|
+
throw integrityError("transport payload digest does not match its manifest");
|
|
141
|
+
const verificationRoot = await mkdtemp(path.join(path.dirname(use.payloadPath), ".verify-"));
|
|
142
|
+
try {
|
|
143
|
+
const git = env.HITCH_GIT_PATH?.trim() || "git";
|
|
144
|
+
try {
|
|
145
|
+
await verifyPackContents({
|
|
146
|
+
git,
|
|
147
|
+
packPath: use.payloadPath,
|
|
148
|
+
manifest,
|
|
149
|
+
env,
|
|
150
|
+
temporaryRoot: verificationRoot,
|
|
151
|
+
...(signal ? { signal } : {}),
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
if (error?.code === "cancelled")
|
|
156
|
+
throw error;
|
|
157
|
+
if (error?.code === "local_source_integrity_mismatch")
|
|
158
|
+
throw error;
|
|
159
|
+
throw integrityError(`transport pack is invalid: ${error?.message || String(error)}`, error);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
await rm(verificationRoot, { recursive: true, force: true });
|
|
164
|
+
}
|
|
165
|
+
return manifest;
|
|
166
|
+
}
|
|
167
|
+
export function validateLocalGitTransportManifest(value, limits = DEFAULT_LOCAL_GIT_TRANSPORT_LIMITS) {
|
|
168
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
169
|
+
throw new TypeError("local Git transport manifest must be an object");
|
|
170
|
+
const record = value;
|
|
171
|
+
const allowed = new Set([
|
|
172
|
+
"schema_version", "kind", "harness_id", "resolution_identity", "commit", "tree",
|
|
173
|
+
"payload_sha256", "payload_bytes", "object_count", "file_count", "created_at",
|
|
174
|
+
]);
|
|
175
|
+
const unexpected = Object.keys(record).find((key) => !allowed.has(key));
|
|
176
|
+
if (unexpected)
|
|
177
|
+
throw new TypeError(`unknown local Git transport manifest field: ${unexpected}`);
|
|
178
|
+
if (record.schema_version !== LOCAL_GIT_TRANSPORT_SCHEMA_VERSION)
|
|
179
|
+
throw new TypeError("local Git transport schema_version must be '1'");
|
|
180
|
+
if (record.kind !== "local-git-commit")
|
|
181
|
+
throw new TypeError("local Git transport kind must be 'local-git-commit'");
|
|
182
|
+
if (typeof record.harness_id !== "string" || !/^[a-z][a-z0-9-]*$/.test(record.harness_id))
|
|
183
|
+
throw new TypeError("local Git transport harness_id is invalid");
|
|
184
|
+
if (typeof record.resolution_identity !== "string" || !/^sha256:[0-9a-f]{64}$/.test(record.resolution_identity))
|
|
185
|
+
throw new TypeError("local Git transport resolution_identity is invalid");
|
|
186
|
+
if (typeof record.commit !== "string" || !/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/.test(record.commit))
|
|
187
|
+
throw new TypeError("local Git transport commit must be a full lowercase OID");
|
|
188
|
+
if (typeof record.tree !== "string" || !objectIdPattern(record.commit).test(record.tree))
|
|
189
|
+
throw new TypeError("local Git transport tree must use the commit object format");
|
|
190
|
+
if (typeof record.payload_sha256 !== "string" || !/^sha256:[0-9a-f]{64}$/.test(record.payload_sha256))
|
|
191
|
+
throw new TypeError("local Git transport payload_sha256 is invalid");
|
|
192
|
+
const payloadBytes = boundedInteger(record.payload_bytes, "payload_bytes", limits.maxPayloadBytes);
|
|
193
|
+
const objectCount = boundedInteger(record.object_count, "object_count", limits.maxObjects);
|
|
194
|
+
const fileCount = boundedInteger(record.file_count, "file_count", limits.maxFiles);
|
|
195
|
+
if (typeof record.created_at !== "string" || !record.created_at || !Number.isFinite(Date.parse(record.created_at)))
|
|
196
|
+
throw new TypeError("local Git transport created_at must be an ISO date-time");
|
|
197
|
+
return {
|
|
198
|
+
schema_version: "1",
|
|
199
|
+
kind: "local-git-commit",
|
|
200
|
+
harness_id: record.harness_id,
|
|
201
|
+
resolution_identity: record.resolution_identity,
|
|
202
|
+
commit: record.commit,
|
|
203
|
+
tree: record.tree,
|
|
204
|
+
payload_sha256: record.payload_sha256,
|
|
205
|
+
payload_bytes: payloadBytes,
|
|
206
|
+
object_count: objectCount,
|
|
207
|
+
file_count: fileCount,
|
|
208
|
+
created_at: record.created_at,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
export async function verifyMaterializedLocalGitSource({ directory, manifest, resolution, env = process.env, signal, }) {
|
|
212
|
+
assertEligibleResolution(resolution);
|
|
213
|
+
if (resolution.harness_id !== manifest.harness_id || resolution.identity !== manifest.resolution_identity || resolution.revision.commit !== manifest.commit) {
|
|
214
|
+
throw integrityError("materialized source proof does not match the locked resolution");
|
|
215
|
+
}
|
|
216
|
+
const info = await lstat(directory).catch(() => null);
|
|
217
|
+
if (!info?.isDirectory() || info.isSymbolicLink())
|
|
218
|
+
throw integrityError("materialized local Git source is not a directory");
|
|
219
|
+
const git = env.HITCH_GIT_PATH?.trim() || "git";
|
|
220
|
+
const commit = (await runGit(git, directory, ["rev-parse", `${manifest.commit}^{commit}`], env, signal)).trim();
|
|
221
|
+
const tree = (await runGit(git, directory, ["rev-parse", `${manifest.commit}^{tree}`], env, signal)).trim();
|
|
222
|
+
if (commit !== manifest.commit)
|
|
223
|
+
throw integrityError("materialized source commit does not match the transport manifest");
|
|
224
|
+
if (tree !== manifest.tree)
|
|
225
|
+
throw integrityError("materialized source tree does not match the transport manifest");
|
|
226
|
+
return {
|
|
227
|
+
directory,
|
|
228
|
+
commit,
|
|
229
|
+
tree,
|
|
230
|
+
resolutionIdentity: resolution.identity,
|
|
231
|
+
payloadSha256: manifest.payload_sha256,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
async function verifyPackContents({ git, packPath, manifest, env, signal, temporaryRoot }) {
|
|
235
|
+
const repository = path.join(temporaryRoot, "verify.git");
|
|
236
|
+
await runGit(git, temporaryRoot, ["init", "--bare", repository], env, signal);
|
|
237
|
+
await runGitFromFile(git, repository, ["index-pack", "--stdin"], packPath, env, signal);
|
|
238
|
+
const commit = (await runGit(git, repository, ["rev-parse", `${manifest.commit}^{commit}`], env, signal)).trim();
|
|
239
|
+
const tree = (await runGit(git, repository, ["rev-parse", `${manifest.commit}^{tree}`], env, signal)).trim();
|
|
240
|
+
if (commit !== manifest.commit || tree !== manifest.tree)
|
|
241
|
+
throw integrityError("created pack does not contain the locked commit and tree");
|
|
242
|
+
await rm(repository, { recursive: true, force: true });
|
|
243
|
+
}
|
|
244
|
+
async function writePack(git, repository, objectIds, target, env, maxBytes, signal) {
|
|
245
|
+
throwIfAborted(signal);
|
|
246
|
+
await new Promise((resolve, reject) => {
|
|
247
|
+
const child = spawn(git, ["-c", "pack.threads=1", "-C", repository, "pack-objects", "--stdout"], {
|
|
248
|
+
env: safeGitEnv(env),
|
|
249
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
250
|
+
});
|
|
251
|
+
const output = createWriteStream(target, { flags: "wx", mode: 0o600 });
|
|
252
|
+
let stderr = "";
|
|
253
|
+
let bytes = 0;
|
|
254
|
+
let exceeded = false;
|
|
255
|
+
let settled = false;
|
|
256
|
+
const finish = (error) => {
|
|
257
|
+
if (settled)
|
|
258
|
+
return;
|
|
259
|
+
settled = true;
|
|
260
|
+
signal?.removeEventListener("abort", abort);
|
|
261
|
+
output.end(() => error ? reject(error) : resolve());
|
|
262
|
+
};
|
|
263
|
+
const abort = () => terminateProcess(child).catch(() => { });
|
|
264
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
265
|
+
child.stderr.on("data", (chunk) => { stderr = `${stderr}${chunk.toString("utf8")}`.slice(-8192); });
|
|
266
|
+
child.stdout.on("data", (chunk) => {
|
|
267
|
+
bytes += chunk.length;
|
|
268
|
+
if (bytes > maxBytes) {
|
|
269
|
+
exceeded = true;
|
|
270
|
+
terminateProcess(child).catch(() => { });
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
if (!output.write(chunk))
|
|
274
|
+
child.stdout.pause(), output.once("drain", () => child.stdout.resume());
|
|
275
|
+
});
|
|
276
|
+
child.once("error", (error) => finish(transportError(`failed to start Git pack creation: ${error.message}`, error)));
|
|
277
|
+
output.once("error", (error) => {
|
|
278
|
+
terminateProcess(child).catch(() => { });
|
|
279
|
+
finish(transportError(`failed to write Git transport pack: ${error.message}`, error));
|
|
280
|
+
});
|
|
281
|
+
child.once("close", (code) => {
|
|
282
|
+
if (signal?.aborted)
|
|
283
|
+
return finish(new HitchError("local Git transport was cancelled", { code: "cancelled", exitCode: 9 }));
|
|
284
|
+
if (exceeded)
|
|
285
|
+
return finish(transportError(`local Git transport exceeds the payload limit (${maxBytes} bytes)`));
|
|
286
|
+
if (code !== 0)
|
|
287
|
+
return finish(transportError(`Git pack creation failed${stderr.trim() ? `: ${stderr.trim()}` : ""}`));
|
|
288
|
+
finish();
|
|
289
|
+
});
|
|
290
|
+
child.stdin.end(`${objectIds.join("\n")}\n`);
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
async function runGit(git, repository, args, env, signal, maxOutput = 8 * 1024 * 1024, input) {
|
|
294
|
+
throwIfAborted(signal);
|
|
295
|
+
return new Promise((resolve, reject) => {
|
|
296
|
+
const hasInput = input !== undefined;
|
|
297
|
+
const child = spawn(git, ["-C", repository, ...args], {
|
|
298
|
+
env: safeGitEnv(env),
|
|
299
|
+
stdio: [hasInput ? "pipe" : "ignore", "pipe", "pipe"],
|
|
300
|
+
});
|
|
301
|
+
let stdout = Buffer.alloc(0);
|
|
302
|
+
let stderr = "";
|
|
303
|
+
let exceeded = false;
|
|
304
|
+
let inputError;
|
|
305
|
+
let settled = false;
|
|
306
|
+
const abort = () => terminateProcess(child).catch(() => { });
|
|
307
|
+
const finish = (error) => {
|
|
308
|
+
if (settled)
|
|
309
|
+
return;
|
|
310
|
+
settled = true;
|
|
311
|
+
signal?.removeEventListener("abort", abort);
|
|
312
|
+
if (error)
|
|
313
|
+
reject(error);
|
|
314
|
+
else
|
|
315
|
+
resolve(stdout.toString("utf8"));
|
|
316
|
+
};
|
|
317
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
318
|
+
child.stdout.on("data", (chunk) => {
|
|
319
|
+
if (stdout.length + chunk.length > maxOutput) {
|
|
320
|
+
exceeded = true;
|
|
321
|
+
terminateProcess(child).catch(() => { });
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
stdout = Buffer.concat([stdout, chunk]);
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
child.stderr.on("data", (chunk) => { stderr = `${stderr}${chunk.toString("utf8")}`.slice(-8192); });
|
|
328
|
+
child.once("error", (error) => {
|
|
329
|
+
finish(transportError(`failed to start Git: ${error.message}`, error));
|
|
330
|
+
});
|
|
331
|
+
child.once("close", (code) => {
|
|
332
|
+
if (signal?.aborted)
|
|
333
|
+
return finish(new HitchError("local Git transport was cancelled", { code: "cancelled", exitCode: 9 }));
|
|
334
|
+
if (exceeded)
|
|
335
|
+
return finish(transportError(`Git output exceeded ${maxOutput} bytes`));
|
|
336
|
+
if (code !== 0)
|
|
337
|
+
return finish(transportError(`Git ${args[0]} failed${stderr.trim() ? `: ${stderr.trim()}` : ""}`));
|
|
338
|
+
if (inputError)
|
|
339
|
+
return finish(transportError(`failed to write Git input: ${inputError.message}`, inputError));
|
|
340
|
+
finish();
|
|
341
|
+
});
|
|
342
|
+
if (hasInput) {
|
|
343
|
+
if (!child.stdin) {
|
|
344
|
+
terminateProcess(child).catch(() => { });
|
|
345
|
+
finish(transportError("failed to open Git input"));
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
child.stdin.once("error", (error) => { inputError = error; });
|
|
349
|
+
child.stdin.end(input);
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
async function runGitFromFile(git, repository, args, inputFile, env, signal) {
|
|
354
|
+
throwIfAborted(signal);
|
|
355
|
+
await new Promise((resolve, reject) => {
|
|
356
|
+
const child = spawn(git, ["-C", repository, ...args], { env: safeGitEnv(env), stdio: ["pipe", "ignore", "pipe"] });
|
|
357
|
+
const input = createReadStream(inputFile);
|
|
358
|
+
let stderr = "";
|
|
359
|
+
let inputError;
|
|
360
|
+
let settled = false;
|
|
361
|
+
const abort = () => terminateProcess(child).catch(() => { });
|
|
362
|
+
const finish = (error) => {
|
|
363
|
+
if (settled)
|
|
364
|
+
return;
|
|
365
|
+
settled = true;
|
|
366
|
+
signal?.removeEventListener("abort", abort);
|
|
367
|
+
input.destroy();
|
|
368
|
+
if (error)
|
|
369
|
+
reject(error);
|
|
370
|
+
else
|
|
371
|
+
resolve();
|
|
372
|
+
};
|
|
373
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
374
|
+
input.once("error", (error) => {
|
|
375
|
+
inputError = error;
|
|
376
|
+
terminateProcess(child).catch(() => { });
|
|
377
|
+
});
|
|
378
|
+
child.stdin.once("error", (error) => { inputError = error; });
|
|
379
|
+
child.stderr.on("data", (chunk) => { stderr = `${stderr}${chunk.toString("utf8")}`.slice(-8192); });
|
|
380
|
+
child.once("error", (error) => finish(integrityError(`failed to start Git pack verification: ${error.message}`, error)));
|
|
381
|
+
child.once("close", (code) => {
|
|
382
|
+
if (signal?.aborted)
|
|
383
|
+
return finish(new HitchError("local Git transport was cancelled", { code: "cancelled", exitCode: 9 }));
|
|
384
|
+
if (code !== 0)
|
|
385
|
+
return finish(integrityError(`Git pack verification failed${stderr.trim() ? `: ${stderr.trim()}` : ""}`));
|
|
386
|
+
if (inputError)
|
|
387
|
+
return finish(integrityError(`failed to stream Git pack input: ${inputError.message}`, inputError));
|
|
388
|
+
finish();
|
|
389
|
+
});
|
|
390
|
+
input.pipe(child.stdin);
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
async function sha256File(file) {
|
|
394
|
+
const hash = createHash("sha256");
|
|
395
|
+
for await (const chunk of createReadStream(file))
|
|
396
|
+
hash.update(chunk);
|
|
397
|
+
return `sha256:${hash.digest("hex")}`;
|
|
398
|
+
}
|
|
399
|
+
async function regularFile(file, label) {
|
|
400
|
+
const info = await lstat(file).catch((error) => { throw integrityError(`${label} is missing`, error); });
|
|
401
|
+
if (!info.isFile() || info.isSymbolicLink())
|
|
402
|
+
throw integrityError(`${label} must be a regular file`);
|
|
403
|
+
return info;
|
|
404
|
+
}
|
|
405
|
+
function safeGitEnv(env) {
|
|
406
|
+
return { ...env, GIT_CONFIG_NOSYSTEM: "1", GIT_CONFIG_GLOBAL: "/dev/null", GIT_OPTIONAL_LOCKS: "0" };
|
|
407
|
+
}
|
|
408
|
+
function assertEligibleResolution(resolution) {
|
|
409
|
+
if (resolution?.source?.type !== "git" || resolution.source.registered !== false || resolution.revision?.type !== "commit") {
|
|
410
|
+
throw transportError("local Git transport requires an explicit local Git commit resolution");
|
|
411
|
+
}
|
|
412
|
+
const commit = resolution.revision.commit;
|
|
413
|
+
if (typeof commit !== "string" || !/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/.test(commit)) {
|
|
414
|
+
throw transportError("local Git transport requires a full lowercase commit OID");
|
|
415
|
+
}
|
|
416
|
+
if (!/^sha256:[0-9a-f]{64}$/.test(resolution.identity || ""))
|
|
417
|
+
throw transportError("local Git transport resolution identity is invalid");
|
|
418
|
+
}
|
|
419
|
+
function boundedInteger(value, name, maximum) {
|
|
420
|
+
if (!Number.isSafeInteger(value) || value < 0)
|
|
421
|
+
throw new TypeError(`local Git transport ${name} must be a non-negative integer`);
|
|
422
|
+
if (value > maximum)
|
|
423
|
+
throw new TypeError(`local Git transport ${name} exceeds the configured limit (${maximum})`);
|
|
424
|
+
return value;
|
|
425
|
+
}
|
|
426
|
+
function objectIdPattern(commit) {
|
|
427
|
+
return commit.length === 64 ? /^[0-9a-f]{64}$/ : /^[0-9a-f]{40}$/;
|
|
428
|
+
}
|
|
429
|
+
function limit(value, fallback, name) {
|
|
430
|
+
if (value === undefined || value === "")
|
|
431
|
+
return fallback;
|
|
432
|
+
const parsed = Number(value);
|
|
433
|
+
if (!Number.isSafeInteger(parsed) || parsed <= 0)
|
|
434
|
+
throw transportError(`${name} must be a positive integer`);
|
|
435
|
+
return parsed;
|
|
436
|
+
}
|
|
437
|
+
function throwIfAborted(signal) {
|
|
438
|
+
if (signal?.aborted)
|
|
439
|
+
throw new HitchError("local Git transport was cancelled", { code: "cancelled", exitCode: 9 });
|
|
440
|
+
}
|
|
441
|
+
function transportError(message, cause) {
|
|
442
|
+
return new HitchError(`local Git transport failed: ${message}`, { code: "local_source_transport_failed", exitCode: 12, ...(cause ? { cause } : {}) });
|
|
443
|
+
}
|
|
444
|
+
function integrityError(message, cause) {
|
|
445
|
+
return new HitchError(`local Git transport integrity mismatch: ${message}`, { code: "local_source_integrity_mismatch", exitCode: 12, ...(cause ? { cause } : {}) });
|
|
446
|
+
}
|
|
447
|
+
//# sourceMappingURL=local-git-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-git-transport.js","sourceRoot":"","sources":["../../../../src/backends/harbor/local-git-transport.ts"],"names":[],"mappings":"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"}
|