agent-hitch 0.2.13 → 0.2.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/benchmark-packages/automationbench/RESOURCES.md +27 -0
  2. package/benchmark-packages/automationbench/resources.mjs +86 -0
  3. package/benchmark-packages/shared-tree/README.md +14 -0
  4. package/benchmark-packages/shared-tree/import.mjs +39 -0
  5. package/dist/scripts/canary-automation-resources.js +86 -0
  6. package/dist/scripts/canary-automation-resources.js.map +1 -0
  7. package/dist/scripts/canary-resource-empty-daemon.js +195 -0
  8. package/dist/scripts/canary-resource-empty-daemon.js.map +1 -0
  9. package/dist/scripts/canary-resources.js +89 -0
  10. package/dist/scripts/canary-resources.js.map +1 -0
  11. package/dist/scripts/check-architecture.js +6 -5
  12. package/dist/scripts/check-architecture.js.map +1 -1
  13. package/dist/scripts/resource-space-sampler.js +83 -0
  14. package/dist/scripts/resource-space-sampler.js.map +1 -0
  15. package/dist/src/backends/harbor/backend.js +5 -1
  16. package/dist/src/backends/harbor/backend.js.map +1 -1
  17. package/dist/src/backends/harbor/resource-admission.js +23 -0
  18. package/dist/src/backends/harbor/resource-admission.js.map +1 -0
  19. package/dist/src/cli/commands/resources.js +23 -0
  20. package/dist/src/cli/commands/resources.js.map +1 -0
  21. package/dist/src/cli/main.js +2 -0
  22. package/dist/src/cli/main.js.map +1 -1
  23. package/dist/src/control-plane/remote-offer-contract.js +11 -2
  24. package/dist/src/control-plane/remote-offer-contract.js.map +1 -1
  25. package/dist/src/control-plane/remote-result-transport.js +10 -0
  26. package/dist/src/control-plane/remote-result-transport.js.map +1 -1
  27. package/dist/src/control-plane/remote-work-coordinator.js +4 -1
  28. package/dist/src/control-plane/remote-work-coordinator.js.map +1 -1
  29. package/dist/src/control-plane/remote-work-inputs.js +16 -4
  30. package/dist/src/control-plane/remote-work-inputs.js.map +1 -1
  31. package/dist/src/control-plane/remote-worker-client.js +22 -0
  32. package/dist/src/control-plane/remote-worker-client.js.map +1 -1
  33. package/dist/src/control-plane/remote-worker-codecs.js +1 -1
  34. package/dist/src/control-plane/remote-worker-codecs.js.map +1 -1
  35. package/dist/src/control-plane/remote-worker-protocol.js +12 -2
  36. package/dist/src/control-plane/remote-worker-protocol.js.map +1 -1
  37. package/dist/src/control-plane/remote-worker-runner.js +1 -1
  38. package/dist/src/control-plane/remote-worker-runner.js.map +1 -1
  39. package/dist/src/control-plane/remote-workers.js +2 -1
  40. package/dist/src/control-plane/remote-workers.js.map +1 -1
  41. package/dist/src/evals/benchmark-adapter-manifest.js +4 -0
  42. package/dist/src/evals/benchmark-adapter-manifest.js.map +1 -1
  43. package/dist/src/evals/benchmark-candidate.js +11 -3
  44. package/dist/src/evals/benchmark-candidate.js.map +1 -1
  45. package/dist/src/evals/eval-result-builder.js +22 -1
  46. package/dist/src/evals/eval-result-builder.js.map +1 -1
  47. package/dist/src/evals/index.js +1 -0
  48. package/dist/src/evals/index.js.map +1 -1
  49. package/dist/src/evals/planned-execution.js +5 -14
  50. package/dist/src/evals/planned-execution.js.map +1 -1
  51. package/dist/src/evals/request.js +9 -0
  52. package/dist/src/evals/request.js.map +1 -1
  53. package/dist/src/evals/resource-eval-lifecycle.js +31 -0
  54. package/dist/src/evals/resource-eval-lifecycle.js.map +1 -0
  55. package/dist/src/evals/resource-legacy-export.js +57 -0
  56. package/dist/src/evals/resource-legacy-export.js.map +1 -0
  57. package/dist/src/evals/service.js +5 -20
  58. package/dist/src/evals/service.js.map +1 -1
  59. package/dist/src/evals/task-resources.js +12 -4
  60. package/dist/src/evals/task-resources.js.map +1 -1
  61. package/dist/src/evals/trial-bundle-files.js +81 -0
  62. package/dist/src/evals/trial-bundle-files.js.map +1 -0
  63. package/dist/src/evals/trial-import.js +7 -78
  64. package/dist/src/evals/trial-import.js.map +1 -1
  65. package/dist/src/foundation/durable-json.js +33 -0
  66. package/dist/src/foundation/durable-json.js.map +1 -0
  67. package/dist/src/foundation/index.js +2 -0
  68. package/dist/src/foundation/index.js.map +1 -1
  69. package/dist/src/foundation/resource-image-references.js +52 -0
  70. package/dist/src/foundation/resource-image-references.js.map +1 -0
  71. package/dist/src/images/gc.js +2 -2
  72. package/dist/src/images/gc.js.map +1 -1
  73. package/dist/src/images/registry.js +27 -2
  74. package/dist/src/images/registry.js.map +1 -1
  75. package/dist/src/resources/api.js +207 -0
  76. package/dist/src/resources/api.js.map +1 -0
  77. package/dist/src/resources/bundle.js +117 -0
  78. package/dist/src/resources/bundle.js.map +1 -0
  79. package/dist/src/resources/evidence.js +93 -0
  80. package/dist/src/resources/evidence.js.map +1 -0
  81. package/dist/src/resources/gc.js +123 -0
  82. package/dist/src/resources/gc.js.map +1 -0
  83. package/dist/src/resources/index.js +14 -0
  84. package/dist/src/resources/index.js.map +1 -0
  85. package/dist/src/resources/materialize.js +143 -0
  86. package/dist/src/resources/materialize.js.map +1 -0
  87. package/dist/src/resources/object-store.js +191 -0
  88. package/dist/src/resources/object-store.js.map +1 -0
  89. package/dist/src/resources/oci-layer-validation.js +202 -0
  90. package/dist/src/resources/oci-layer-validation.js.map +1 -0
  91. package/dist/src/resources/oci-provider.js +101 -0
  92. package/dist/src/resources/oci-provider.js.map +1 -0
  93. package/dist/src/resources/oci-registry-bundle.js +253 -0
  94. package/dist/src/resources/oci-registry-bundle.js.map +1 -0
  95. package/dist/src/resources/protocol.js +222 -0
  96. package/dist/src/resources/protocol.js.map +1 -0
  97. package/dist/src/resources/result-retention.js +93 -0
  98. package/dist/src/resources/result-retention.js.map +1 -0
  99. package/dist/src/resources/role-context.js +54 -0
  100. package/dist/src/resources/role-context.js.map +1 -0
  101. package/dist/src/resources/stats.js +36 -0
  102. package/dist/src/resources/stats.js.map +1 -0
  103. package/dist/src/resources/store.js +310 -0
  104. package/dist/src/resources/store.js.map +1 -0
  105. package/dist/src/resources/tasks.js +153 -0
  106. package/dist/src/resources/tasks.js.map +1 -0
  107. package/dist/src/resources/transfer.js +162 -0
  108. package/dist/src/resources/transfer.js.map +1 -0
  109. package/dist/src/resources/views.js +130 -0
  110. package/dist/src/resources/views.js.map +1 -0
  111. package/dist/src/workers/remote-harbor-work-spec.js +9 -3
  112. package/dist/src/workers/remote-harbor-work-spec.js.map +1 -1
  113. package/dist/src/workers/remote-harbor-worker.js +24 -9
  114. package/dist/src/workers/remote-harbor-worker.js.map +1 -1
  115. package/docs/resource-storage.zh-CN.md +95 -0
  116. package/docs/schemas/execution-provider-status.schema.json +20 -0
  117. package/docs/schemas/hitch-resource-dataset-v2.schema.json +590 -0
  118. package/docs/schemas/hitch-resource-lock-v1.schema.json +341 -0
  119. package/docs/schemas/hitch-resource-plan-v1.schema.json +423 -0
  120. package/docs/schemas/hitch-resource-selection-v1.schema.json +608 -0
  121. package/docs/schemas/hitch-tree-v1.schema.json +75 -0
  122. package/docs/schemas/remote-harbor-work-spec.schema.json +47 -3
  123. package/docs/schemas/remote-work-offer.schema.json +2 -1
  124. package/docs/schemas/remote-worker-registration.schema.json +20 -0
  125. package/package.json +9 -3
  126. package/test-contracts/hitch-resources-v1.json +197 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/resources/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ import { copyFile, lstat, mkdir, readFile, readdir, statfs } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { canonical, identity, natural, object, parseStrictJson, sha } from "./protocol.js";
4
+ import { fileClosure } from "./gc.js";
5
+ import { parseResourceTask, preflightResourceTask, taskClosureLock } from "./tasks.js";
6
+ const MAX_PROOF_BYTES = 32 * 1024 ** 2;
7
+ /** Only newly derived descriptor bytes travel back with the result. Input data
8
+ * already exists at the controller and must not be re-embedded in its envelope. */
9
+ export async function exportResourceResultProof(store, plan, allDigests, directory) {
10
+ const source = new Set(await fileClosure(store, Object.values(taskClosureLock(plan.task).resources)));
11
+ const proof = [];
12
+ let total = 0;
13
+ for (const digest of allDigests.filter(d => !source.has(d)).sort()) {
14
+ const size = await store.objects.verify(digest);
15
+ total += size;
16
+ if (total > MAX_PROOF_BYTES)
17
+ throw new Error("resource result proof byte budget exceeded");
18
+ proof.push({ digest, size });
19
+ }
20
+ const output = path.join(directory, "resource-proof");
21
+ await mkdir(output);
22
+ const space = await statfs(output, { bigint: true });
23
+ if (space.bavail * space.bsize < BigInt(total) + BigInt(store.objects.budget.minFreeBytes))
24
+ throw new Error("resource result proof free-space reserve exceeded");
25
+ for (const item of proof)
26
+ await copyFile(store.objects.objectPath(item.digest), path.join(output, item.digest.slice(7)));
27
+ return proof;
28
+ }
29
+ /** Restore/pin the worker's materialization proof before publishing its result.
30
+ * The original task is selected by controller admission, never by the worker. */
31
+ export async function retainResourceResult(input) {
32
+ if (!/^run_[a-f0-9]{32}$/.test(input.runId))
33
+ throw new Error("invalid resource result run identity");
34
+ const file = path.join(input.directory, "resource.execution.json"), info = await lstat(file);
35
+ if (!info.isFile() || info.size > 16 * 1024 ** 2)
36
+ throw new Error("resource result evidence missing or oversized");
37
+ const value = object(parseStrictJson(await readFile(file, "utf8")), ["protocol", "plan", "materialized_task_digest", "materializedTree", "images", "observed", "materialization", "proofObjects"]);
38
+ const plan = object(value.plan, ["protocol", "resolver", "backend", "platform", "task", "digest"]);
39
+ const task = parseResourceTask(plan.task), owner = `run:${input.runId}`;
40
+ if (value.protocol !== "hitch-resource-execution@1" || canonical(task) !== canonical(input.task))
41
+ throw new Error("remote resource result task differs from admission");
42
+ const checked = await preflightResourceTask(input.store, input.task, { owner: `${owner}:admission`, generation: 1, platform: String(plan.platform) });
43
+ if (canonical(plan) !== canonical(checked.plan))
44
+ throw new Error("remote resource result plan differs from admission");
45
+ const tree = object(value.materializedTree, ["kind", "format", "manifestDigest"]);
46
+ if (tree.kind !== "tree" || tree.format !== "hitch-tree@1" || value.materialized_task_digest !== identity("hitch-materialized-task@1", tree))
47
+ throw new Error("remote materialization proof identity mismatch");
48
+ const materializedTree = { kind: "tree", format: "hitch-tree@1", manifestDigest: sha(tree.manifestDigest) };
49
+ if (!Array.isArray(value.images) || !Array.isArray(value.observed) || !Array.isArray(value.proofObjects))
50
+ throw new Error("incomplete resource result evidence");
51
+ const images = value.images.map(item => {
52
+ const image = object(item, ["resource", "imageId", "configDigest", "manifestDigest", "platform", "reference"]);
53
+ const expected = checked.closure.images.find(i => i.resource === image.resource);
54
+ if (!expected || image.configDigest !== expected.configDigest || image.manifestDigest !== expected.manifestDigest || image.platform !== expected.platform)
55
+ throw new Error("remote result OCI base differs from admission");
56
+ return image;
57
+ });
58
+ if (canonical(images.map(i => i.resource).sort()) !== canonical(checked.closure.images.map(i => i.resource).sort()))
59
+ throw new Error("incomplete resource result OCI closure");
60
+ const observed = value.observed.map(item => object(item, ["consumer", "configDigest", "platform", "baseConfigs"]));
61
+ if (input.requireObserved)
62
+ for (const binding of task.lock.bindings.filter(b => b.use === "environment-image")) {
63
+ const expected = checked.closure.images.find(i => i.resource === binding.resource);
64
+ if (!observed.some(o => canonical(o.consumer) === canonical(binding.consumer) && o.platform === checked.plan.platform
65
+ && Array.isArray(o.baseConfigs) && o.baseConfigs.includes(expected.configDigest)
66
+ && input.execution.observed.containers.some(c => c.image_config_digest === o.configDigest)))
67
+ throw new Error("remote result lacks observed resource role evidence");
68
+ }
69
+ const proof = value.proofObjects.map(item => { const v = object(item, ["digest", "size"]); return { digest: sha(v.digest), size: natural(v.size) }; });
70
+ if (proof.length > input.store.objects.budget.maxFiles || proof.reduce((n, p) => n + p.size, 0) > MAX_PROOF_BYTES
71
+ || canonical(proof.map(p => p.digest)) !== canonical([...new Set(proof.map(p => p.digest))].sort()))
72
+ throw new Error("resource proof inventory or budget invalid");
73
+ const proofDirectory = path.join(input.directory, "resource-proof");
74
+ if (!(await lstat(proofDirectory)).isDirectory() || canonical((await readdir(proofDirectory)).sort()) !== canonical(proof.map(p => p.digest.slice(7))))
75
+ throw new Error("resource proof file inventory mismatch");
76
+ for (const item of proof)
77
+ await input.store.objects.verify(item.digest, item.size, path.join(proofDirectory, item.digest.slice(7)));
78
+ const leases = [];
79
+ for (const item of proof) {
80
+ const imported = await input.store.import(path.join(proofDirectory, item.digest.slice(7)), "blob", `${owner}:proof`);
81
+ leases.push(imported.leaseId);
82
+ if (imported.resource.kind !== "blob" || imported.resource.digest !== item.digest)
83
+ throw new Error("resource proof changed during import");
84
+ }
85
+ const source = taskClosureLock(task);
86
+ const root = await input.store.pin({ owner, generation: 1, purpose: "sealed-run", lock: { ...source, resources: { ...source.resources, "hitch-materialized-task": materializedTree } } });
87
+ const base = new Set(checked.closure.objectDigests), actualDelta = root.closure.objectDigests.filter(d => !base.has(d)).sort();
88
+ if (canonical(actualDelta) !== canonical(proof.map(p => p.digest)))
89
+ throw new Error("resource proof has missing or extraneous objects");
90
+ for (const lease of leases)
91
+ await input.store.finishLease(lease, "ended");
92
+ }
93
+ //# sourceMappingURL=result-retention.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-retention.js","sourceRoot":"","sources":["../../../src/resources/result-retention.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { lstat, readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { parse as parseToml } from "smol-toml";
4
+ import { canonical, object, parseStrictJson } from "./protocol.js";
5
+ export const roleDirectory = (consumer) => consumer.role === "candidate" ? "environment/candidate" : consumer.role === "verifier" ? "tests" : `environment/services/${consumer.serviceId}`;
6
+ export async function validateRoleContexts(directory, bindings, platform, images) {
7
+ // Package-native phase supervision has its own evidence/replay contract.
8
+ // This backend cannot silently bypass it by treating its descriptor as a
9
+ // normal resource task. A future backend must version that integration.
10
+ if (await lstat(path.join(directory, ".hitch-benchmark.json")).catch(e => { if (e.code !== "ENOENT")
11
+ throw e; return undefined; }))
12
+ throw new Error("resource role-context backend does not support Package-native phase descriptors");
13
+ const task = parseToml(await readFile(path.join(directory, "task.toml"), "utf8"));
14
+ if (task.verifier?.environment_mode !== "separate")
15
+ throw new Error("resource tasks require a separate verifier environment");
16
+ const compose = object(parseStrictJson(await readFile(path.join(directory, "environment/docker-compose.yaml"), "utf8")), ["services", "networks", "volumes"]);
17
+ const services = compose.services;
18
+ if (!services || typeof services !== "object" || !services.main)
19
+ throw new Error("resource tasks require an explicit candidate Compose service");
20
+ for (const [id, service] of Object.entries(services)) {
21
+ if (!service || typeof service !== "object" || service.platform !== platform)
22
+ throw new Error("resource service platform mismatch");
23
+ object(service, ["platform", "build", "command", "entrypoint", "environment", "networks", "depends_on", "healthcheck", "working_dir", "init", "user", "ports", "expose"]);
24
+ const consumer = id === "main" ? { role: "candidate" } : { role: "service", serviceId: id };
25
+ const expected = id === "main" ? "candidate" : `services/${id}`;
26
+ const build = object(service.build, ["context", "dockerfile"]);
27
+ if (build.context !== expected && build.context !== `./${expected}` || build.dockerfile !== "Dockerfile")
28
+ throw new Error("resource task build context crosses role boundary");
29
+ if (service.volumes !== undefined)
30
+ throw new Error("resource task host/volume mounts require an explicitly supported backend capability");
31
+ await checkBases(consumer);
32
+ }
33
+ await checkBases({ role: "verifier" });
34
+ for (const binding of bindings)
35
+ if (binding.consumer.role === "service" && !services[binding.consumer.serviceId])
36
+ throw new Error("resource binding references an absent service");
37
+ async function checkBases(consumer) {
38
+ const text = await readFile(path.join(directory, roleDirectory(consumer), "Dockerfile"), "utf8");
39
+ const bases = [...text.matchAll(/^FROM\s+(\S+)(?:\s+AS\s+\S+)?\s*$/gim)].map(m => m[1]);
40
+ if (/^\s*(?:ADD\s|RUN\s+(?!--network=none\s)|COPY\s+--from|#\s*syntax=)/gim.test(text) || /--mount[=\s]/i.test(text))
41
+ throw new Error("resource Dockerfile has undeclared external build inputs");
42
+ const assigned = bindings.filter(b => canonical(b.consumer) === canonical(consumer) && b.use === "environment-image");
43
+ for (const binding of assigned) {
44
+ if (binding.use === "environment-image" && binding.slot !== "build-base")
45
+ throw new Error("role-context backend requires explicit build-base image bindings");
46
+ const image = images.find(i => i.resource === binding.resource);
47
+ if (!image || !bases.some(base => base.endsWith(`@${image.reference.split('@')[1]}`)))
48
+ throw new Error("resource image binding does not match role Dockerfile");
49
+ }
50
+ if (!bases.length || bases.some(base => !/@sha256:[a-f0-9]{64}$/.test(base) || !images.some(image => base.endsWith(`@${image.reference.split('@')[1]}`) && assigned.some(b => b.resource === image.resource))))
51
+ throw new Error("resource Dockerfile bases must use immutable digests");
52
+ }
53
+ }
54
+ //# sourceMappingURL=role-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-context.js","sourceRoot":"","sources":["../../../src/resources/role-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { lstat, readdir } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { validateLease, validateRoot } from "./store.js";
4
+ export async function resourceStorageStats(store) {
5
+ return store.locked(async () => {
6
+ const scopes = {};
7
+ for (const scope of ["objects", "oci-manifests", "descriptor-views", "view-quarantine", "quarantine", "workspaces", "staging", "workspace-records", "roots", "leases", "transactions"]) {
8
+ const result = { files: 0, logicalBytes: 0, allocatedBlockBytes: 0 };
9
+ const visit = async (file) => {
10
+ const info = await lstat(file).catch(e => { if (e.code !== "ENOENT")
11
+ throw e; return undefined; });
12
+ if (!info)
13
+ return;
14
+ if (info.isDirectory())
15
+ for (const name of await readdir(file))
16
+ await visit(path.join(file, name));
17
+ else if (info.isFile()) {
18
+ result.files++;
19
+ result.logicalBytes += info.size;
20
+ result.allocatedBlockBytes += info.blocks * 512;
21
+ }
22
+ else
23
+ throw new Error("resource store contains an unsafe entry; accounting stopped");
24
+ };
25
+ await visit(path.join(store.directory, scope));
26
+ scopes[scope] = result;
27
+ }
28
+ const roots = await store.records("roots"), leases = await store.records("leases");
29
+ roots.forEach(validateRoot);
30
+ leases.forEach(validateLease);
31
+ return { protocol: "hitch-resource-storage@1", scopes, roots: roots.map(r => ({ owner: r.owner, generation: r.generation, state: r.state, purpose: r.purpose })),
32
+ leases: leases.filter(l => l.state !== "released").map(l => ({ id: l.id, owner: l.owner, state: l.state, purpose: l.purpose })),
33
+ physicalAccounting: "allocated blocks may overlap under CoW; no exclusive-byte or saved-byte claim", externalScopes: ["source dataset/projections", "OCI image layers", "BuildKit cache", "sealed run evidence"] };
34
+ });
35
+ }
36
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/resources/stats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,310 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { AsyncLocalStorage } from "node:async_hooks";
3
+ import { lstat, mkdir, readFile, readdir, rm } from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { durableWriteJSON as atomicWriteJSON, removeResourceImageFence, withEnvironmentImageReferenceLock, withFileLock, writeResourceImageFence } from "../foundation/index.js";
6
+ import { ObjectStore, limits } from "./object-store.js";
7
+ import { canonical, hash, identity, natural, object, parseResourceLock, parseStrictJson, sha } from "./protocol.js";
8
+ export class ResourceStore {
9
+ root;
10
+ options;
11
+ admissionImages = new AsyncLocalStorage();
12
+ objects;
13
+ directory;
14
+ constructor(root, options = {}) {
15
+ this.root = root;
16
+ this.options = options;
17
+ if (options.images && options.images.protocol !== "hitch-oci-provider@1")
18
+ throw new TypeError("unsupported OCI provider protocol");
19
+ this.objects = new ObjectStore(path.resolve(root), limits(options.limits));
20
+ this.directory = this.objects.directory;
21
+ }
22
+ admission(operation) { return this.admissionImages.run(new Map(), operation); }
23
+ async locked(operation, signal) {
24
+ await mkdir(this.directory, { recursive: true });
25
+ if (!(await lstat(this.directory)).isDirectory())
26
+ throw new Error("resource store must be a directory");
27
+ return withFileLock(path.join(this.root, "locks", "benchmark-resources"), "global", operation, { signal, timeoutCode: "resource_store_locked" });
28
+ }
29
+ async importImageArchive(lease, resource, source, signal) {
30
+ await this.locked(() => withEnvironmentImageReferenceLock(this.root, async () => {
31
+ if (!this.options.images?.importArchive)
32
+ throw new Error("OCI archive import unsupported");
33
+ await writeResourceImageFence(this.root, { protocol: "hitch-resource-image-fence@1", owner: `lease:${lease.id}`, state: "preparing", imageIds: lease.imageIds });
34
+ await this.options.images.importArchive(resource, source, signal, { maxExpandedBytes: this.objects.budget.maxTotalBytes, maxFiles: this.objects.budget.maxFiles });
35
+ const resolved = await this.options.images.resolve(resource, signal);
36
+ lease.imageIds = [...new Set([...lease.imageIds, resolved.imageId])].sort();
37
+ await atomicWriteJSON(this.recordPath("leases", lease.id), lease);
38
+ await writeResourceImageFence(this.root, { protocol: "hitch-resource-image-fence@1", owner: `lease:${lease.id}`, state: "active", imageIds: lease.imageIds });
39
+ }), signal);
40
+ }
41
+ recordPath(kind, key) { return path.join(this.directory, kind, `${hash(key).slice(7)}.json`); }
42
+ async readRecord(kind, key) {
43
+ try {
44
+ const file = this.recordPath(kind, key);
45
+ if (!(await lstat(file)).isFile())
46
+ throw new TypeError("resource record must be a regular file");
47
+ return parseStrictJson(await readFile(file, "utf8"));
48
+ }
49
+ catch (error) {
50
+ if (error.code === "ENOENT")
51
+ return undefined;
52
+ throw error;
53
+ }
54
+ }
55
+ async records(kind) {
56
+ const dir = path.join(this.directory, kind);
57
+ const files = await readdir(dir).catch((e) => { if (e.code !== "ENOENT")
58
+ throw e; return []; });
59
+ return Promise.all(files.map(async (file) => {
60
+ if (!/^[a-f0-9]{64}\.json$/.test(file) || !(await lstat(path.join(dir, file))).isFile())
61
+ throw new TypeError("invalid resource record filename");
62
+ const value = parseStrictJson(await readFile(path.join(dir, file), "utf8"));
63
+ const key = kind === "roots" ? value.owner : value.id;
64
+ if (typeof key !== "string" || file !== `${hash(key).slice(7)}.json`)
65
+ throw new TypeError("resource record address mismatch");
66
+ return value;
67
+ }));
68
+ }
69
+ async beginLease(owner, purpose) {
70
+ validateOwner(owner);
71
+ const lease = { protocol: "hitch-resource-lease@1", id: randomUUID(), owner, purpose, state: "active", objectDigests: [], imageIds: [], createdAt: new Date().toISOString() };
72
+ await atomicWriteJSON(this.recordPath("leases", lease.id), lease);
73
+ return lease;
74
+ }
75
+ async protect(lease, digest) {
76
+ if (!lease.objectDigests.includes(digest)) {
77
+ lease.objectDigests.push(digest);
78
+ lease.objectDigests.sort();
79
+ await atomicWriteJSON(this.recordPath("leases", lease.id), lease);
80
+ }
81
+ }
82
+ async import(source, kind, owner, signal) {
83
+ return this.locked(async () => {
84
+ const lease = await this.beginLease(owner, "import"), staging = path.join(this.directory, "staging", lease.id);
85
+ await atomicWriteJSON(this.recordPath("transactions", lease.id), { protocol: "hitch-resource-transaction@1", id: lease.id, owner, state: "importing" });
86
+ await mkdir(staging, { recursive: true });
87
+ try {
88
+ const result = kind === "blob" ? await this.objects.importFile(source, staging, d => this.protect(lease, d), signal)
89
+ : await this.objects.importTree(source, staging, d => this.protect(lease, d), signal);
90
+ await atomicWriteJSON(this.recordPath("transactions", lease.id), { protocol: "hitch-resource-transaction@1", id: lease.id, owner, state: "imported", resource: result.resource });
91
+ return { ...result, leaseId: lease.id, logicalBytes: "logicalBytes" in result ? result.logicalBytes : result.resource.size };
92
+ }
93
+ catch (error) {
94
+ lease.state = "released";
95
+ await atomicWriteJSON(this.recordPath("leases", lease.id), lease);
96
+ await atomicWriteJSON(this.recordPath("transactions", lease.id), { protocol: "hitch-resource-transaction@1", id: lease.id, owner, state: "failed" });
97
+ throw error;
98
+ }
99
+ finally {
100
+ await rm(staging, { recursive: true, force: true });
101
+ }
102
+ }, signal);
103
+ }
104
+ /** Caller holds the store lock; no content trust is cached across admissions. */
105
+ async closure(lock, lease, signal) {
106
+ const parsed = parseResourceLock(lock), objectDigests = new Set(), images = [];
107
+ let logicalBytes = 0, files = 0;
108
+ for (const resource of Object.values(parsed.resources)) {
109
+ signal?.throwIfAborted();
110
+ if (resource.kind === "oci-image")
111
+ continue;
112
+ const digest = resource.kind === "blob" ? resource.digest : resource.manifestDigest;
113
+ await this.protect(lease, digest);
114
+ await restoreObject(this, digest);
115
+ await this.objects.verify(digest, resource.kind === "blob" ? resource.size : undefined);
116
+ objectDigests.add(digest);
117
+ if (resource.kind === "blob") {
118
+ logicalBytes += resource.size;
119
+ files++;
120
+ }
121
+ else {
122
+ const tree = await this.objects.readTree(digest);
123
+ files += tree.entries.length;
124
+ for (const entry of tree.entries)
125
+ if (entry.kind === "file") {
126
+ await this.protect(lease, entry.digest);
127
+ await restoreObject(this, entry.digest);
128
+ await this.objects.verify(entry.digest, entry.size);
129
+ objectDigests.add(entry.digest);
130
+ logicalBytes += entry.size;
131
+ }
132
+ }
133
+ if (logicalBytes > this.objects.budget.maxTotalBytes || files > this.objects.budget.maxFiles)
134
+ throw new Error("resource closure budget exceeded");
135
+ }
136
+ const oci = Object.entries(parsed.resources).filter((entry) => entry[1].kind === "oci-image");
137
+ if (oci.length) {
138
+ if (!this.options.images)
139
+ throw new Error("OCI resource provider unavailable");
140
+ await withEnvironmentImageReferenceLock(this.root, async () => {
141
+ await writeResourceImageFence(this.root, { protocol: "hitch-resource-image-fence@1", owner: `lease:${lease.id}`, state: "preparing", imageIds: lease.imageIds });
142
+ const resolved = this.admissionImages.getStore() ?? new Map();
143
+ for (const [id, resource] of oci) {
144
+ const key = canonical(resource), value = resolved.get(key) ?? await this.options.images.resolve(resource, signal);
145
+ resolved.set(key, value);
146
+ if (sha(value.manifestDigest) !== resource.manifestDigest || value.platform !== resource.platform || !value.reference.endsWith(`@${resource.manifestDigest}`))
147
+ throw new Error("OCI resource identity mismatch");
148
+ sha(value.configDigest);
149
+ sha(value.imageId);
150
+ images.push({ resource: id, ...value });
151
+ }
152
+ lease.imageIds = [...new Set(images.map(i => i.imageId))].sort();
153
+ await atomicWriteJSON(this.recordPath("leases", lease.id), lease);
154
+ await writeResourceImageFence(this.root, { protocol: "hitch-resource-image-fence@1", owner: `lease:${lease.id}`, state: "active", imageIds: lease.imageIds });
155
+ });
156
+ }
157
+ const content = { protocol: "hitch-resource-closure@1", resources: parsed.resources, objectDigests: [...objectDigests].sort() };
158
+ // Locations and local provider IDs are evidence, not closure identity.
159
+ return { ...content, images, logicalBytes, digest: identity(content.protocol, content) };
160
+ }
161
+ async acquire(owner, lock, purpose = "preflight", signal) {
162
+ const parsed = parseResourceLock(lock);
163
+ return this.locked(async () => { const lease = await this.beginLease(owner, purpose); return { lease, closure: await this.closure(parsed, lease, signal) }; }, signal);
164
+ }
165
+ async pin(input, signal) {
166
+ validateOwner(input.owner);
167
+ generation(input.generation);
168
+ validateOwner(input.purpose);
169
+ const lock = parseResourceLock(input.lock);
170
+ return this.locked(async () => {
171
+ const previous = await this.readRecord("roots", input.owner);
172
+ if (previous) {
173
+ validateRoot(previous);
174
+ if (previous.owner !== input.owner)
175
+ throw new Error("resource owner address mismatch");
176
+ if (previous.generation > input.generation || previous.generation === input.generation && previous.state === "released")
177
+ throw new Error("resource owner generation has been released or superseded");
178
+ if (previous.state === "active" && (previous.generation !== input.generation || canonical(previous.lock) !== canonical(lock) || previous.purpose !== input.purpose))
179
+ throw new Error("active owner generation cannot be replaced");
180
+ }
181
+ const lease = await this.beginLease(input.owner, "preflight"), closure = await this.closure(lock, lease, signal);
182
+ const record = { protocol: "hitch-resource-root@1", owner: input.owner, generation: input.generation, purpose: input.purpose, state: "active", lock, closure };
183
+ await withEnvironmentImageReferenceLock(this.root, async () => {
184
+ await writeResourceImageFence(this.root, { protocol: "hitch-resource-image-fence@1", owner: `root:${input.owner}:${input.generation}`, state: "active", imageIds: lease.imageIds });
185
+ await atomicWriteJSON(this.recordPath("roots", input.owner), record);
186
+ });
187
+ await this.finishLeaseLocked(lease);
188
+ return record;
189
+ }, signal);
190
+ }
191
+ async release(owner, expectedGeneration) {
192
+ validateOwner(owner);
193
+ generation(expectedGeneration);
194
+ await this.locked(async () => {
195
+ const record = await this.readRecord("roots", owner);
196
+ if (!record)
197
+ throw new Error("resource owner is missing");
198
+ validateRoot(record);
199
+ if (record.owner !== owner)
200
+ throw new Error("resource owner address mismatch");
201
+ if (record.generation !== expectedGeneration)
202
+ throw new Error("stale resource owner generation");
203
+ // Persist tombstone first. An interrupted release may retain an extra image fence.
204
+ record.state = "released";
205
+ await atomicWriteJSON(this.recordPath("roots", owner), record);
206
+ await withEnvironmentImageReferenceLock(this.root, () => removeResourceImageFence(this.root, `root:${owner}:${expectedGeneration}`));
207
+ });
208
+ }
209
+ async finishLease(id, confirmation) {
210
+ if (!["ended", "unknown"].includes(confirmation))
211
+ throw new TypeError("explicit lease end or unknown confirmation required");
212
+ await this.locked(async () => {
213
+ const lease = await this.readRecord("leases", id);
214
+ if (!lease)
215
+ throw new Error("resource lease missing");
216
+ validateLease(lease);
217
+ if (lease.id !== id)
218
+ throw new Error("resource lease address mismatch");
219
+ if (confirmation === "unknown") {
220
+ if (lease.state !== "released") {
221
+ lease.state = "unknown";
222
+ await atomicWriteJSON(this.recordPath("leases", id), lease);
223
+ }
224
+ }
225
+ else {
226
+ // The same lock excludes a live importer. Only its UUID staging is
227
+ // owned here; unfamiliar directories and execution workspaces remain.
228
+ if (lease.purpose === "import") {
229
+ const staging = path.join(this.directory, "staging", id);
230
+ const info = await lstat(staging).catch(e => { if (e.code !== "ENOENT")
231
+ throw e; return undefined; });
232
+ if (info && !info.isDirectory())
233
+ throw new Error("unsafe import staging ownership");
234
+ await rm(staging, { recursive: true, force: true });
235
+ const transaction = await this.readRecord("transactions", id);
236
+ if (transaction) {
237
+ if (transaction.protocol !== "hitch-resource-transaction@1" || transaction.id !== id || transaction.owner !== lease.owner)
238
+ throw new Error("import transaction ownership mismatch");
239
+ await atomicWriteJSON(this.recordPath("transactions", id), { ...transaction, state: "ended" });
240
+ }
241
+ }
242
+ await this.finishLeaseLocked(lease);
243
+ }
244
+ });
245
+ }
246
+ async finishLeaseLocked(lease) {
247
+ lease.state = "released";
248
+ await atomicWriteJSON(this.recordPath("leases", lease.id), lease);
249
+ await withEnvironmentImageReferenceLock(this.root, () => removeResourceImageFence(this.root, `lease:${lease.id}`));
250
+ }
251
+ }
252
+ export function validateOwner(value) {
253
+ if (typeof value !== "string" || !value || value.length > 512 || /[\x00-\x1f]/.test(value))
254
+ throw new TypeError("invalid resource owner or purpose");
255
+ }
256
+ function generation(value) { if (natural(value) < 1)
257
+ throw new TypeError("resource generation must be positive"); }
258
+ export function validateLease(value) {
259
+ object(value, ["protocol", "id", "owner", "purpose", "state", "objectDigests", "imageIds", "createdAt"]);
260
+ if (value.protocol !== "hitch-resource-lease@1" || !/^[0-9a-f-]{36}$/.test(value.id) || !["import", "preflight", "execution", "export"].includes(value.purpose) || !["active", "unknown", "released"].includes(value.state) || !Number.isFinite(Date.parse(value.createdAt)))
261
+ throw new TypeError("invalid resource lease");
262
+ validateOwner(value.owner);
263
+ if (!Array.isArray(value.objectDigests) || !Array.isArray(value.imageIds))
264
+ throw new TypeError("invalid lease closure");
265
+ value.objectDigests.forEach(sha);
266
+ value.imageIds.forEach(sha);
267
+ }
268
+ export function validateRoot(value) {
269
+ object(value, ["protocol", "owner", "generation", "purpose", "state", "lock", "closure"]);
270
+ if (value.protocol !== "hitch-resource-root@1" || !["active", "released"].includes(value.state))
271
+ throw new TypeError("invalid resource root");
272
+ validateOwner(value.owner);
273
+ validateOwner(value.purpose);
274
+ generation(value.generation);
275
+ parseResourceLock(value.lock);
276
+ const c = value.closure;
277
+ object(c, ["protocol", "resources", "objectDigests", "images", "digest", "logicalBytes"]);
278
+ if (c.protocol !== "hitch-resource-closure@1" || canonical(c.resources) !== canonical(value.lock.resources) || !Array.isArray(c.objectDigests) || !Array.isArray(c.images)
279
+ || identity(c.protocol, { protocol: c.protocol, resources: c.resources, objectDigests: c.objectDigests }) !== c.digest)
280
+ throw new TypeError("invalid root closure");
281
+ c.objectDigests.forEach(sha);
282
+ natural(c.logicalBytes);
283
+ const expected = Object.entries(value.lock.resources).filter(([, r]) => r.kind === "oci-image").map(([id]) => id).sort();
284
+ if (canonical(c.images.map(i => i.resource).sort()) !== canonical(expected))
285
+ throw new TypeError("root OCI closure is incomplete");
286
+ for (const image of c.images) {
287
+ object(image, ["resource", "imageId", "configDigest", "manifestDigest", "platform", "reference"]);
288
+ const resource = value.lock.resources[image.resource];
289
+ if (resource?.kind !== "oci-image" || image.manifestDigest !== resource.manifestDigest || image.platform !== resource.platform || typeof image.reference !== "string" || !image.reference.endsWith(`@${resource.manifestDigest}`))
290
+ throw new TypeError("invalid root OCI identity");
291
+ sha(image.imageId);
292
+ sha(image.configDigest);
293
+ }
294
+ }
295
+ export async function restoreObject(store, digest) {
296
+ const { rename } = await import("node:fs/promises");
297
+ const objectFile = store.objects.objectPath(digest), quarantined = path.join(store.directory, "quarantine", digest.slice(7));
298
+ try {
299
+ await lstat(objectFile);
300
+ }
301
+ catch (e) {
302
+ if (e.code !== "ENOENT")
303
+ throw e;
304
+ await mkdir(path.dirname(objectFile), { recursive: true });
305
+ await store.objects.verify(digest, undefined, quarantined);
306
+ await rename(quarantined, objectFile); // Missing content fails; never pins a dangling ref.
307
+ await rm(path.join(store.directory, "quarantine-index", `${digest.slice(7)}.json`), { force: true });
308
+ }
309
+ }
310
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/resources/store.ts"],"names":[],"mappings":"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"}