agent-hitch 0.2.0 → 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.
Files changed (263) hide show
  1. package/README.md +16 -10
  2. package/README.zh-CN.md +13 -8
  3. package/dist/bin/hitch.js +1 -1
  4. package/dist/bin/hitch.js.map +1 -1
  5. package/dist/scripts/check-architecture.js +159 -0
  6. package/dist/scripts/check-architecture.js.map +1 -0
  7. package/dist/scripts/check-release.js +1 -1
  8. package/dist/scripts/check-release.js.map +1 -1
  9. package/dist/src/adapters/catalog.js +55 -0
  10. package/dist/src/adapters/catalog.js.map +1 -0
  11. package/dist/src/adapters/contract.js +2 -0
  12. package/dist/src/adapters/contract.js.map +1 -0
  13. package/dist/src/adapters/discovery.js +22 -0
  14. package/dist/src/adapters/discovery.js.map +1 -0
  15. package/dist/src/adapters/index.js +3 -0
  16. package/dist/src/adapters/index.js.map +1 -0
  17. package/dist/src/adapters/providers/claude.js +69 -0
  18. package/dist/src/adapters/providers/claude.js.map +1 -0
  19. package/dist/src/adapters/providers/codex.js +74 -0
  20. package/dist/src/adapters/providers/codex.js.map +1 -0
  21. package/dist/src/adapters/providers/deepseek.js +51 -0
  22. package/dist/src/adapters/providers/deepseek.js.map +1 -0
  23. package/dist/src/adapters/providers/opencode.js +73 -0
  24. package/dist/src/adapters/providers/opencode.js.map +1 -0
  25. package/dist/src/adapters/providers/pi.js +82 -0
  26. package/dist/src/adapters/providers/pi.js.map +1 -0
  27. package/dist/src/adapters/providers/shared.js +82 -0
  28. package/dist/src/adapters/providers/shared.js.map +1 -0
  29. package/dist/src/artifacts/index.js +3 -0
  30. package/dist/src/artifacts/index.js.map +1 -0
  31. package/dist/src/artifacts/integrity.js +188 -0
  32. package/dist/src/artifacts/integrity.js.map +1 -0
  33. package/dist/src/artifacts/preparer.js +379 -0
  34. package/dist/src/artifacts/preparer.js.map +1 -0
  35. package/dist/src/artifacts/store.js +87 -0
  36. package/dist/src/artifacts/store.js.map +1 -0
  37. package/dist/src/artifacts/types.js +2 -0
  38. package/dist/src/artifacts/types.js.map +1 -0
  39. package/dist/src/backends/contract.js +2 -0
  40. package/dist/src/backends/contract.js.map +1 -0
  41. package/dist/src/{harbor-backend.js → backends/harbor/backend.js} +39 -14
  42. package/dist/src/backends/harbor/backend.js.map +1 -0
  43. package/dist/src/backends/harbor/index.js +4 -0
  44. package/dist/src/backends/harbor/index.js.map +1 -0
  45. package/dist/src/backends/harbor/local-git-transport.js +447 -0
  46. package/dist/src/backends/harbor/local-git-transport.js.map +1 -0
  47. package/dist/src/{eval-tools.js → backends/harbor/tools.js} +2 -6
  48. package/dist/src/backends/harbor/tools.js.map +1 -0
  49. package/dist/src/backends/index.js +4 -0
  50. package/dist/src/backends/index.js.map +1 -0
  51. package/dist/src/cli/arguments.js +123 -0
  52. package/dist/src/cli/arguments.js.map +1 -0
  53. package/dist/src/cli/commands/compare.js +55 -0
  54. package/dist/src/cli/commands/compare.js.map +1 -0
  55. package/dist/src/cli/commands/daemon.js +106 -0
  56. package/dist/src/cli/commands/daemon.js.map +1 -0
  57. package/dist/src/cli/commands/eval.js +126 -0
  58. package/dist/src/cli/commands/eval.js.map +1 -0
  59. package/dist/src/cli/commands/feedback.js +84 -0
  60. package/dist/src/cli/commands/feedback.js.map +1 -0
  61. package/dist/src/cli/commands/inspect.js +20 -0
  62. package/dist/src/cli/commands/inspect.js.map +1 -0
  63. package/dist/src/cli/commands/list.js +17 -0
  64. package/dist/src/cli/commands/list.js.map +1 -0
  65. package/dist/src/cli/commands/prepare.js +21 -0
  66. package/dist/src/cli/commands/prepare.js.map +1 -0
  67. package/dist/src/cli/commands/resolve.js +17 -0
  68. package/dist/src/cli/commands/resolve.js.map +1 -0
  69. package/dist/src/cli/commands/run.js +83 -0
  70. package/dist/src/cli/commands/run.js.map +1 -0
  71. package/dist/src/cli/commands/runs.js +45 -0
  72. package/dist/src/cli/commands/runs.js.map +1 -0
  73. package/dist/src/cli/commands/trajectory.js +31 -0
  74. package/dist/src/cli/commands/trajectory.js.map +1 -0
  75. package/dist/src/cli/commands/workspace.js +44 -0
  76. package/dist/src/cli/commands/workspace.js.map +1 -0
  77. package/dist/src/cli/index.js +2 -0
  78. package/dist/src/cli/index.js.map +1 -0
  79. package/dist/src/cli/main.js +48 -0
  80. package/dist/src/cli/main.js.map +1 -0
  81. package/dist/src/cli/output.js +96 -0
  82. package/dist/src/cli/output.js.map +1 -0
  83. package/dist/src/controller-runtime/index.js +3 -0
  84. package/dist/src/controller-runtime/index.js.map +1 -0
  85. package/dist/src/controller-runtime/store.js +2 -7
  86. package/dist/src/controller-runtime/store.js.map +1 -1
  87. package/dist/src/daemon/auth.js +108 -0
  88. package/dist/src/daemon/auth.js.map +1 -0
  89. package/dist/src/daemon/client.js +76 -0
  90. package/dist/src/daemon/client.js.map +1 -0
  91. package/dist/src/daemon/index.js +5 -0
  92. package/dist/src/daemon/index.js.map +1 -0
  93. package/dist/src/daemon/launcher.js +24 -0
  94. package/dist/src/daemon/launcher.js.map +1 -0
  95. package/dist/src/{scheduler.js → daemon/scheduler.js} +6 -7
  96. package/dist/src/daemon/scheduler.js.map +1 -0
  97. package/dist/src/{daemon.js → daemon/server.js} +10 -155
  98. package/dist/src/daemon/server.js.map +1 -0
  99. package/dist/src/domain/artifacts.js +2 -0
  100. package/dist/src/domain/artifacts.js.map +1 -0
  101. package/dist/src/domain/controller-runtime.js +2 -0
  102. package/dist/src/domain/controller-runtime.js.map +1 -0
  103. package/dist/src/domain/eval-records.js +2 -0
  104. package/dist/src/domain/eval-records.js.map +1 -0
  105. package/dist/src/domain/evals.js +2 -0
  106. package/dist/src/domain/evals.js.map +1 -0
  107. package/dist/src/domain/feedback.js +2 -0
  108. package/dist/src/domain/feedback.js.map +1 -0
  109. package/dist/src/domain/{types.js → ids.js} +1 -1
  110. package/dist/src/domain/ids.js.map +1 -0
  111. package/dist/src/domain/index.js +11 -0
  112. package/dist/src/domain/index.js.map +1 -0
  113. package/dist/src/domain/revisions.js +2 -0
  114. package/dist/src/domain/revisions.js.map +1 -0
  115. package/dist/src/domain/runs.js +3 -0
  116. package/dist/src/domain/runs.js.map +1 -0
  117. package/dist/src/domain/trajectories.js +2 -0
  118. package/dist/src/domain/trajectories.js.map +1 -0
  119. package/dist/src/domain/{validate.js → validation.js} +194 -5
  120. package/dist/src/domain/validation.js.map +1 -0
  121. package/dist/src/domain/workspaces.js +2 -0
  122. package/dist/src/domain/workspaces.js.map +1 -0
  123. package/dist/src/evals/events.js +67 -0
  124. package/dist/src/evals/events.js.map +1 -0
  125. package/dist/src/evals/index.js +5 -0
  126. package/dist/src/evals/index.js.map +1 -0
  127. package/dist/src/evals/records.js +55 -0
  128. package/dist/src/evals/records.js.map +1 -0
  129. package/dist/src/evals/request.js +109 -0
  130. package/dist/src/evals/request.js.map +1 -0
  131. package/dist/src/evals/service.js +227 -0
  132. package/dist/src/evals/service.js.map +1 -0
  133. package/dist/src/evals/trial-import.js +394 -0
  134. package/dist/src/evals/trial-import.js.map +1 -0
  135. package/dist/src/feedback/index.js +2 -0
  136. package/dist/src/feedback/index.js.map +1 -0
  137. package/dist/src/feedback/service.js +3 -4
  138. package/dist/src/feedback/service.js.map +1 -1
  139. package/dist/src/{config.js → foundation/config.js} +1 -0
  140. package/dist/src/foundation/config.js.map +1 -0
  141. package/dist/src/foundation/errors.js.map +1 -0
  142. package/dist/src/foundation/executable.js +135 -0
  143. package/dist/src/foundation/executable.js.map +1 -0
  144. package/dist/src/foundation/fs.js.map +1 -0
  145. package/dist/src/foundation/hash.js +24 -0
  146. package/dist/src/foundation/hash.js.map +1 -0
  147. package/dist/src/foundation/index.js +11 -0
  148. package/dist/src/foundation/index.js.map +1 -0
  149. package/dist/src/foundation/line-stream.js.map +1 -0
  150. package/dist/src/foundation/locks.js +114 -0
  151. package/dist/src/foundation/locks.js.map +1 -0
  152. package/dist/src/{package-root.js → foundation/package-root.js} +3 -2
  153. package/dist/src/foundation/package-root.js.map +1 -0
  154. package/dist/src/foundation/process.js.map +1 -0
  155. package/dist/src/revisions/index.js +4 -0
  156. package/dist/src/revisions/index.js.map +1 -0
  157. package/dist/src/{harness-reference.js → revisions/reference.js} +16 -2
  158. package/dist/src/revisions/reference.js.map +1 -0
  159. package/dist/src/revisions/resolver.js +25 -0
  160. package/dist/src/revisions/resolver.js.map +1 -0
  161. package/dist/src/revisions/sources/git.js +180 -0
  162. package/dist/src/revisions/sources/git.js.map +1 -0
  163. package/dist/src/revisions/sources/installed.js +45 -0
  164. package/dist/src/revisions/sources/installed.js.map +1 -0
  165. package/dist/src/revisions/sources/npm.js +97 -0
  166. package/dist/src/revisions/sources/npm.js.map +1 -0
  167. package/dist/src/runs/compare.js +132 -0
  168. package/dist/src/runs/compare.js.map +1 -0
  169. package/dist/src/{events.js → runs/events.js} +1 -2
  170. package/dist/src/runs/events.js.map +1 -0
  171. package/dist/src/{engine.js → runs/executor.js} +166 -151
  172. package/dist/src/runs/executor.js.map +1 -0
  173. package/dist/src/runs/finalizer.js +22 -0
  174. package/dist/src/runs/finalizer.js.map +1 -0
  175. package/dist/src/runs/identity.js +35 -0
  176. package/dist/src/runs/identity.js.map +1 -0
  177. package/dist/src/runs/index.js +11 -0
  178. package/dist/src/runs/index.js.map +1 -0
  179. package/dist/src/runs/manifest.js +70 -0
  180. package/dist/src/runs/manifest.js.map +1 -0
  181. package/dist/src/runs/outcome.js +49 -0
  182. package/dist/src/runs/outcome.js.map +1 -0
  183. package/dist/src/runs/query.js +104 -0
  184. package/dist/src/runs/query.js.map +1 -0
  185. package/dist/src/runs/queued.js +54 -0
  186. package/dist/src/runs/queued.js.map +1 -0
  187. package/dist/src/runs/records.js +288 -0
  188. package/dist/src/runs/records.js.map +1 -0
  189. package/dist/src/runs/request.js +169 -0
  190. package/dist/src/runs/request.js.map +1 -0
  191. package/dist/src/trajectories/format.js +1 -1
  192. package/dist/src/trajectories/format.js.map +1 -1
  193. package/dist/src/trajectories/index.js +7 -0
  194. package/dist/src/trajectories/index.js.map +1 -0
  195. package/dist/src/trajectories/projector.js +1 -1
  196. package/dist/src/trajectories/projector.js.map +1 -1
  197. package/dist/src/trajectories/provider-capture.js +133 -0
  198. package/dist/src/trajectories/provider-capture.js.map +1 -0
  199. package/dist/src/trajectories/providers/deepseek.js +179 -0
  200. package/dist/src/trajectories/providers/deepseek.js.map +1 -0
  201. package/dist/src/trajectories/store.js +148 -8
  202. package/dist/src/trajectories/store.js.map +1 -1
  203. package/dist/src/workspaces/copy.js +142 -0
  204. package/dist/src/workspaces/copy.js.map +1 -0
  205. package/dist/src/workspaces/digest.js +47 -0
  206. package/dist/src/workspaces/digest.js.map +1 -0
  207. package/dist/src/workspaces/git.js +164 -0
  208. package/dist/src/workspaces/git.js.map +1 -0
  209. package/dist/src/workspaces/index.js +6 -0
  210. package/dist/src/workspaces/index.js.map +1 -0
  211. package/dist/src/workspaces/lifecycle.js +313 -0
  212. package/dist/src/workspaces/lifecycle.js.map +1 -0
  213. package/dist/src/workspaces/planner.js +80 -0
  214. package/dist/src/workspaces/planner.js.map +1 -0
  215. package/dist/src/workspaces/store.js +25 -0
  216. package/dist/src/workspaces/store.js.map +1 -0
  217. package/dist/src/workspaces/types.js +4 -0
  218. package/dist/src/workspaces/types.js.map +1 -0
  219. package/dist/src/workspaces/utils.js +56 -0
  220. package/dist/src/workspaces/utils.js.map +1 -0
  221. package/docs/schemas/eval-request.schema.json +2 -0
  222. package/docs/schemas/eval-result.schema.json +36 -1
  223. package/docs/schemas/local-git-transport-manifest.schema.json +34 -0
  224. package/docs/schemas/result.schema.json +9 -0
  225. package/docs/schemas/run-context.schema.json +39 -0
  226. package/docs/schemas/run-manifest.schema.json +81 -0
  227. package/docs/schemas/run-request.schema.json +16 -1
  228. package/docs/schemas/trajectory-ref.schema.json +66 -23
  229. package/integrations/harbor/hitch_harbor_agent.py +375 -1
  230. package/package.json +21 -3
  231. package/dist/src/adapters.js +0 -461
  232. package/dist/src/adapters.js.map +0 -1
  233. package/dist/src/artifacts.js +0 -1081
  234. package/dist/src/artifacts.js.map +0 -1
  235. package/dist/src/cli.js +0 -699
  236. package/dist/src/cli.js.map +0 -1
  237. package/dist/src/config.js.map +0 -1
  238. package/dist/src/daemon.js.map +0 -1
  239. package/dist/src/domain/types.js.map +0 -1
  240. package/dist/src/domain/validate.js.map +0 -1
  241. package/dist/src/engine.js.map +0 -1
  242. package/dist/src/errors.js.map +0 -1
  243. package/dist/src/eval-tools.js.map +0 -1
  244. package/dist/src/evals.js +0 -313
  245. package/dist/src/evals.js.map +0 -1
  246. package/dist/src/events.js.map +0 -1
  247. package/dist/src/fs.js.map +0 -1
  248. package/dist/src/harbor-backend.js.map +0 -1
  249. package/dist/src/harness-reference.js.map +0 -1
  250. package/dist/src/line-stream.js.map +0 -1
  251. package/dist/src/locks.js +0 -38
  252. package/dist/src/locks.js.map +0 -1
  253. package/dist/src/package-root.js.map +0 -1
  254. package/dist/src/process.js.map +0 -1
  255. package/dist/src/registry.js +0 -81
  256. package/dist/src/registry.js.map +0 -1
  257. package/dist/src/scheduler.js.map +0 -1
  258. package/dist/src/workspaces.js +0 -858
  259. package/dist/src/workspaces.js.map +0 -1
  260. /package/dist/src/{errors.js → foundation/errors.js} +0 -0
  261. /package/dist/src/{fs.js → foundation/fs.js} +0 -0
  262. /package/dist/src/{line-stream.js → foundation/line-stream.js} +0 -0
  263. /package/dist/src/{process.js → foundation/process.js} +0 -0
@@ -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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"}
@@ -0,0 +1,87 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { constants } from "node:fs";
3
+ import { access, rename, rm } from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { SCHEMA_VERSION, atomicWriteJSON, ensureDir, readJSON, withFileLock } from "../foundation/index.js";
6
+ import { artifactInvocation, artifactMatches } from "./integrity.js";
7
+ const RECIPE_VERSION = "1";
8
+ export function artifactManifest(resolved, adapter, artifactId, entrypoint, toolchain, extra = {}) {
9
+ return {
10
+ schema_version: SCHEMA_VERSION,
11
+ artifact_id: artifactId,
12
+ harness_id: resolved.harness_id,
13
+ revision_identity: resolved.identity,
14
+ source_type: resolved.source.type,
15
+ adapter: adapter.id,
16
+ adapter_version: RECIPE_VERSION,
17
+ recipe_version: RECIPE_VERSION,
18
+ platform: `${process.platform}-${process.arch}`,
19
+ entrypoint,
20
+ toolchain,
21
+ resolved_revision: resolved,
22
+ ...extra,
23
+ prepared_at: new Date().toISOString(),
24
+ };
25
+ }
26
+ export async function promoteArtifact(paths, staging, manifest, preparationKey) {
27
+ await ensureDir(paths.artifacts);
28
+ const artifactDirectory = path.join(paths.artifacts, manifest.artifact_id.replace("sha256:", ""));
29
+ try {
30
+ await rename(staging, artifactDirectory);
31
+ }
32
+ catch (error) {
33
+ if (!["EEXIST", "ENOTEMPTY"].includes(error?.code || ""))
34
+ throw error;
35
+ const existing = await readJSON(path.join(artifactDirectory, "artifact.json"), null);
36
+ const valid = existing?.artifact_id === manifest.artifact_id
37
+ && await artifactMatches(artifactDirectory, existing);
38
+ if (!valid) {
39
+ const quarantine = path.join(paths.temporary, `invalid-${manifest.artifact_id.replace("sha256:", "")}-${randomBytes(6).toString("hex")}`);
40
+ await rename(artifactDirectory, quarantine);
41
+ try {
42
+ await rename(staging, artifactDirectory);
43
+ }
44
+ catch (promotionError) {
45
+ await rename(quarantine, artifactDirectory).catch(() => { });
46
+ throw promotionError;
47
+ }
48
+ await rm(quarantine, { recursive: true, force: true });
49
+ }
50
+ else {
51
+ await rm(staging, { recursive: true, force: true });
52
+ }
53
+ }
54
+ await atomicWriteJSON(path.join(paths.artifactIndex, `${preparationKey.replace("sha256:", "")}.json`), {
55
+ schema_version: SCHEMA_VERSION,
56
+ preparation_key: preparationKey,
57
+ artifact_id: manifest.artifact_id,
58
+ });
59
+ return {
60
+ ...manifest,
61
+ ...artifactInvocation(manifest, artifactDirectory),
62
+ cache_hit: false,
63
+ };
64
+ }
65
+ export async function readCachedArtifact(paths, preparationKey, expectedRevisionIdentity) {
66
+ const index = await readJSON(path.join(paths.artifactIndex, `${preparationKey.replace("sha256:", "")}.json`), null);
67
+ if (!index?.artifact_id)
68
+ return null;
69
+ const directory = path.join(paths.artifacts, index.artifact_id.replace("sha256:", ""));
70
+ const manifest = await readJSON(path.join(directory, "artifact.json"), null);
71
+ if (!manifest || manifest.artifact_id !== index.artifact_id || manifest.revision_identity !== expectedRevisionIdentity)
72
+ return null;
73
+ const executable = path.join(directory, manifest.entrypoint);
74
+ try {
75
+ await access(executable, manifest.launcher === "node" ? constants.R_OK : constants.X_OK);
76
+ if (!await artifactMatches(directory, manifest))
77
+ return null;
78
+ }
79
+ catch {
80
+ return null;
81
+ }
82
+ return { ...manifest, ...artifactInvocation(manifest, directory), cache_hit: true };
83
+ }
84
+ export async function withArtifactLock(paths, key, operation, options = {}) {
85
+ return withFileLock(paths.artifactLocks, key, operation, options);
86
+ }
87
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/artifacts/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/artifacts/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../../src/backends/contract.ts"],"names":[],"mappings":""}
@@ -2,15 +2,10 @@ import { spawn } from "node:child_process";
2
2
  import { createWriteStream } from "node:fs";
3
3
  import { readdir, stat } from "node:fs/promises";
4
4
  import path from "node:path";
5
- import { HitchError, invalidInput } from "./errors.js";
6
- import { atomicWriteJSON, ensureDir, readJSON } from "./fs.js";
7
- import { consumeLines } from "./line-stream.js";
8
- import { terminateProcess } from "./process.js";
9
- import { detectVersion, fingerprintExecutable } from "./registry.js";
10
- import { HARBOR_CREDENTIAL_ENV, locateHarbor } from "./eval-tools.js";
11
- import { packageRoot } from "./package-root.js";
5
+ import { HitchError, atomicWriteJSON, consumeLines, detectVersion, ensureDir, fingerprintExecutable, invalidInput, packageRoot, readJSON, sha256JSON, terminateProcess } from "../../foundation/index.js";
6
+ import { HARBOR_CREDENTIAL_ENV, locateHarbor } from "./tools.js";
12
7
  const BRIDGE_DIRECTORY = path.join(packageRoot(), "integrations", "harbor");
13
- export async function runHarborBackend({ evalDirectory, request, root, resolvedRevision, runtimeDirectory, runtimeId, env = process.env, harborExecutable, signal, emit = () => { }, }) {
8
+ export async function runHarborBackend({ evalId, evalDirectory, request, root, resolvedRevision, runtimeDirectory, runtimeId, localTransport, env = process.env, harborExecutable, signal, emit = () => { }, }) {
14
9
  const backendDirectory = await ensureDir(path.join(evalDirectory, "harbor"));
15
10
  const executable = await discoverHarbor(harborExecutable, root, env);
16
11
  const version = await detectVersion(executable, ["--version"]);
@@ -20,10 +15,12 @@ export async function runHarborBackend({ evalDirectory, request, root, resolvedR
20
15
  const jobDirectory = path.join(backendDirectory, jobName);
21
16
  const resultPath = path.join(jobDirectory, "result.json");
22
17
  const config = await buildHarborJobConfig({
18
+ evalId,
23
19
  request,
24
20
  resolvedRevision,
25
21
  runtimeDirectory,
26
22
  runtimeId,
23
+ localTransport,
27
24
  backendDirectory,
28
25
  jobName,
29
26
  env,
@@ -53,12 +50,13 @@ export async function runHarborBackend({ evalDirectory, request, root, resolvedR
53
50
  executable,
54
51
  version: version || null,
55
52
  identity,
56
- config_path: configPath,
57
- result_path: rawResult ? resultPath : null,
58
- stdout_path: path.join(backendDirectory, "stdout.log"),
59
- stderr_path: path.join(backendDirectory, "stderr.log"),
53
+ config_path: path.relative(evalDirectory, configPath).split(path.sep).join("/"),
54
+ result_path: rawResult ? path.relative(evalDirectory, resultPath).split(path.sep).join("/") : null,
55
+ stdout_path: path.relative(evalDirectory, path.join(backendDirectory, "stdout.log")).split(path.sep).join("/"),
56
+ stderr_path: path.relative(evalDirectory, path.join(backendDirectory, "stderr.log")).split(path.sep).join("/"),
60
57
  process_exit_code: invocation.code,
61
58
  signal: invocation.signal,
59
+ job_directory: path.relative(evalDirectory, jobDirectory).split(path.sep).join("/"),
62
60
  },
63
61
  rawResult,
64
62
  summary: rawResult ? normalizeHarborResult(rawResult) : null,
@@ -86,7 +84,7 @@ async function attachTrialResults(jobDirectory, jobResult) {
86
84
  }
87
85
  return { ...jobResult, trial_results: trialResults };
88
86
  }
89
- export async function buildHarborJobConfig({ request, resolvedRevision, runtimeDirectory, runtimeId, backendDirectory, jobName = "job", env = process.env, }) {
87
+ export async function buildHarborJobConfig({ evalId, request, resolvedRevision, runtimeDirectory, runtimeId, localTransport, backendDirectory, jobName = "job", env = process.env, }) {
90
88
  const timeoutSeconds = request.timeout_ms > 0 ? Math.ceil(request.timeout_ms / 1_000) : null;
91
89
  const setupTimeoutSeconds = request.setup_timeout_ms > 0 ? Math.ceil(request.setup_timeout_ms / 1_000) : null;
92
90
  const agent = {
@@ -94,6 +92,17 @@ export async function buildHarborJobConfig({ request, resolvedRevision, runtimeD
94
92
  model_name: request.model || null,
95
93
  kwargs: {
96
94
  candidate_id: "candidate-1",
95
+ ...(evalId ? {
96
+ eval_id: evalId,
97
+ benchmark_id: request.benchmark_id,
98
+ benchmark_revision: request.benchmark_revision,
99
+ verifier_identity: sha256JSON({
100
+ backend: "harbor",
101
+ benchmark_id: request.benchmark_id,
102
+ benchmark_revision: request.benchmark_revision,
103
+ verifier: "dataset",
104
+ }),
105
+ } : {}),
97
106
  harness_ref: lockedHarnessRef(resolvedRevision),
98
107
  revision_identity: resolvedRevision.identity,
99
108
  // The bridge consumes the shared compiled runtime cache. The local
@@ -101,6 +110,22 @@ export async function buildHarborJobConfig({ request, resolvedRevision, runtimeD
101
110
  // (spec §4.2); `runtime_id` records the exact execution payload.
102
111
  hitch_runtime_dir: runtimeDirectory,
103
112
  ...(runtimeId ? { controller_runtime_id: runtimeId } : {}),
113
+ ...(localTransport ? {
114
+ local_source_transport: {
115
+ kind: localTransport.manifest.kind,
116
+ manifest_path: localTransport.manifestPath,
117
+ payload_path: localTransport.payloadPath,
118
+ locked_resolution_path: localTransport.resolutionPath,
119
+ harness_id: localTransport.manifest.harness_id,
120
+ resolution_identity: localTransport.manifest.resolution_identity,
121
+ commit: localTransport.manifest.commit,
122
+ tree: localTransport.manifest.tree,
123
+ payload_sha256: localTransport.manifest.payload_sha256,
124
+ payload_bytes: localTransport.manifest.payload_bytes,
125
+ object_count: localTransport.manifest.object_count,
126
+ file_count: localTransport.manifest.file_count,
127
+ },
128
+ } : {}),
104
129
  hitch_timeout_ms: request.timeout_ms,
105
130
  agent_args: request.agent_args,
106
131
  workdir: "/app",
@@ -277,4 +302,4 @@ function closeWriteStream(stream) {
277
302
  function compact(value) {
278
303
  return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined && entry !== null));
279
304
  }
280
- //# sourceMappingURL=harbor-backend.js.map
305
+ //# sourceMappingURL=backend.js.map