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.
Files changed (263) hide show
  1. package/README.md +235 -132
  2. package/README.zh-CN.md +335 -0
  3. package/dist/bin/hitch.js +9 -0
  4. package/dist/bin/hitch.js.map +1 -0
  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 +25 -0
  8. package/dist/scripts/check-release.js.map +1 -0
  9. package/dist/scripts/check-syntax.js +32 -0
  10. package/dist/scripts/check-syntax.js.map +1 -0
  11. package/dist/src/adapters/catalog.js +55 -0
  12. package/dist/src/adapters/catalog.js.map +1 -0
  13. package/dist/src/adapters/contract.js +2 -0
  14. package/dist/src/adapters/contract.js.map +1 -0
  15. package/dist/src/adapters/discovery.js +22 -0
  16. package/dist/src/adapters/discovery.js.map +1 -0
  17. package/dist/src/adapters/index.js +3 -0
  18. package/dist/src/adapters/index.js.map +1 -0
  19. package/dist/src/adapters/providers/claude.js +69 -0
  20. package/dist/src/adapters/providers/claude.js.map +1 -0
  21. package/dist/src/adapters/providers/codex.js +74 -0
  22. package/dist/src/adapters/providers/codex.js.map +1 -0
  23. package/dist/src/adapters/providers/deepseek.js +51 -0
  24. package/dist/src/adapters/providers/deepseek.js.map +1 -0
  25. package/dist/src/adapters/providers/opencode.js +73 -0
  26. package/dist/src/adapters/providers/opencode.js.map +1 -0
  27. package/dist/src/adapters/providers/pi.js +82 -0
  28. package/dist/src/adapters/providers/pi.js.map +1 -0
  29. package/dist/src/adapters/providers/shared.js +82 -0
  30. package/dist/src/adapters/providers/shared.js.map +1 -0
  31. package/dist/src/artifacts/index.js +3 -0
  32. package/dist/src/artifacts/index.js.map +1 -0
  33. package/dist/src/artifacts/integrity.js +188 -0
  34. package/dist/src/artifacts/integrity.js.map +1 -0
  35. package/dist/src/artifacts/preparer.js +379 -0
  36. package/dist/src/artifacts/preparer.js.map +1 -0
  37. package/dist/src/artifacts/store.js +87 -0
  38. package/dist/src/artifacts/store.js.map +1 -0
  39. package/dist/src/artifacts/types.js +2 -0
  40. package/dist/src/artifacts/types.js.map +1 -0
  41. package/dist/src/backends/contract.js +2 -0
  42. package/dist/src/backends/contract.js.map +1 -0
  43. package/dist/src/backends/harbor/backend.js +305 -0
  44. package/dist/src/backends/harbor/backend.js.map +1 -0
  45. package/dist/src/backends/harbor/index.js +4 -0
  46. package/dist/src/backends/harbor/index.js.map +1 -0
  47. package/dist/src/backends/harbor/local-git-transport.js +447 -0
  48. package/dist/src/backends/harbor/local-git-transport.js.map +1 -0
  49. package/dist/src/backends/harbor/tools.js +314 -0
  50. package/dist/src/backends/harbor/tools.js.map +1 -0
  51. package/dist/src/backends/index.js +4 -0
  52. package/dist/src/backends/index.js.map +1 -0
  53. package/dist/src/cli/arguments.js +123 -0
  54. package/dist/src/cli/arguments.js.map +1 -0
  55. package/dist/src/cli/commands/compare.js +55 -0
  56. package/dist/src/cli/commands/compare.js.map +1 -0
  57. package/dist/src/cli/commands/daemon.js +106 -0
  58. package/dist/src/cli/commands/daemon.js.map +1 -0
  59. package/dist/src/cli/commands/eval.js +126 -0
  60. package/dist/src/cli/commands/eval.js.map +1 -0
  61. package/dist/src/cli/commands/feedback.js +84 -0
  62. package/dist/src/cli/commands/feedback.js.map +1 -0
  63. package/dist/src/cli/commands/inspect.js +20 -0
  64. package/dist/src/cli/commands/inspect.js.map +1 -0
  65. package/dist/src/cli/commands/list.js +17 -0
  66. package/dist/src/cli/commands/list.js.map +1 -0
  67. package/dist/src/cli/commands/prepare.js +21 -0
  68. package/dist/src/cli/commands/prepare.js.map +1 -0
  69. package/dist/src/cli/commands/resolve.js +17 -0
  70. package/dist/src/cli/commands/resolve.js.map +1 -0
  71. package/dist/src/cli/commands/run.js +83 -0
  72. package/dist/src/cli/commands/run.js.map +1 -0
  73. package/dist/src/cli/commands/runs.js +45 -0
  74. package/dist/src/cli/commands/runs.js.map +1 -0
  75. package/dist/src/cli/commands/trajectory.js +31 -0
  76. package/dist/src/cli/commands/trajectory.js.map +1 -0
  77. package/dist/src/cli/commands/workspace.js +44 -0
  78. package/dist/src/cli/commands/workspace.js.map +1 -0
  79. package/dist/src/cli/index.js +2 -0
  80. package/dist/src/cli/index.js.map +1 -0
  81. package/dist/src/cli/main.js +48 -0
  82. package/dist/src/cli/main.js.map +1 -0
  83. package/dist/src/cli/output.js +96 -0
  84. package/dist/src/cli/output.js.map +1 -0
  85. package/dist/src/controller-runtime/hash.js +353 -0
  86. package/dist/src/controller-runtime/hash.js.map +1 -0
  87. package/dist/src/controller-runtime/index.js +3 -0
  88. package/dist/src/controller-runtime/index.js.map +1 -0
  89. package/dist/src/controller-runtime/store.js +318 -0
  90. package/dist/src/controller-runtime/store.js.map +1 -0
  91. package/dist/src/daemon/auth.js +108 -0
  92. package/dist/src/daemon/auth.js.map +1 -0
  93. package/dist/src/daemon/client.js +76 -0
  94. package/dist/src/daemon/client.js.map +1 -0
  95. package/dist/src/daemon/index.js +5 -0
  96. package/dist/src/daemon/index.js.map +1 -0
  97. package/dist/src/daemon/launcher.js +24 -0
  98. package/dist/src/daemon/launcher.js.map +1 -0
  99. package/dist/src/daemon/scheduler.js +161 -0
  100. package/dist/src/daemon/scheduler.js.map +1 -0
  101. package/dist/src/daemon/server.js +316 -0
  102. package/dist/src/daemon/server.js.map +1 -0
  103. package/dist/src/domain/artifacts.js +2 -0
  104. package/dist/src/domain/artifacts.js.map +1 -0
  105. package/dist/src/domain/controller-runtime.js +2 -0
  106. package/dist/src/domain/controller-runtime.js.map +1 -0
  107. package/dist/src/domain/eval-records.js +2 -0
  108. package/dist/src/domain/eval-records.js.map +1 -0
  109. package/dist/src/domain/evals.js +2 -0
  110. package/dist/src/domain/evals.js.map +1 -0
  111. package/dist/src/domain/feedback.js +2 -0
  112. package/dist/src/domain/feedback.js.map +1 -0
  113. package/dist/src/domain/ids.js +10 -0
  114. package/dist/src/domain/ids.js.map +1 -0
  115. package/dist/src/domain/index.js +11 -0
  116. package/dist/src/domain/index.js.map +1 -0
  117. package/dist/src/domain/revisions.js +2 -0
  118. package/dist/src/domain/revisions.js.map +1 -0
  119. package/dist/src/domain/runs.js +3 -0
  120. package/dist/src/domain/runs.js.map +1 -0
  121. package/dist/src/domain/trajectories.js +2 -0
  122. package/dist/src/domain/trajectories.js.map +1 -0
  123. package/dist/src/domain/validation.js +429 -0
  124. package/dist/src/domain/validation.js.map +1 -0
  125. package/dist/src/domain/workspaces.js +2 -0
  126. package/dist/src/domain/workspaces.js.map +1 -0
  127. package/dist/src/evals/events.js +67 -0
  128. package/dist/src/evals/events.js.map +1 -0
  129. package/dist/src/evals/index.js +5 -0
  130. package/dist/src/evals/index.js.map +1 -0
  131. package/dist/src/evals/records.js +55 -0
  132. package/dist/src/evals/records.js.map +1 -0
  133. package/dist/src/evals/request.js +109 -0
  134. package/dist/src/evals/request.js.map +1 -0
  135. package/dist/src/evals/service.js +227 -0
  136. package/dist/src/evals/service.js.map +1 -0
  137. package/dist/src/evals/trial-import.js +394 -0
  138. package/dist/src/evals/trial-import.js.map +1 -0
  139. package/dist/src/feedback/index.js +2 -0
  140. package/dist/src/feedback/index.js.map +1 -0
  141. package/dist/src/feedback/service.js +314 -0
  142. package/dist/src/feedback/service.js.map +1 -0
  143. package/dist/src/foundation/config.js +54 -0
  144. package/dist/src/foundation/config.js.map +1 -0
  145. package/dist/src/foundation/errors.js +14 -0
  146. package/dist/src/foundation/errors.js.map +1 -0
  147. package/dist/src/foundation/executable.js +135 -0
  148. package/dist/src/foundation/executable.js.map +1 -0
  149. package/dist/src/foundation/fs.js +45 -0
  150. package/dist/src/foundation/fs.js.map +1 -0
  151. package/dist/src/foundation/hash.js +24 -0
  152. package/dist/src/foundation/hash.js.map +1 -0
  153. package/dist/src/foundation/index.js +11 -0
  154. package/dist/src/foundation/index.js.map +1 -0
  155. package/dist/src/foundation/line-stream.js +20 -0
  156. package/dist/src/foundation/line-stream.js.map +1 -0
  157. package/dist/src/foundation/locks.js +114 -0
  158. package/dist/src/foundation/locks.js.map +1 -0
  159. package/dist/src/foundation/package-root.js +41 -0
  160. package/dist/src/foundation/package-root.js.map +1 -0
  161. package/dist/src/foundation/process.js +50 -0
  162. package/dist/src/foundation/process.js.map +1 -0
  163. package/dist/src/revisions/index.js +4 -0
  164. package/dist/src/revisions/index.js.map +1 -0
  165. package/dist/src/revisions/reference.js +97 -0
  166. package/dist/src/revisions/reference.js.map +1 -0
  167. package/dist/src/revisions/resolver.js +25 -0
  168. package/dist/src/revisions/resolver.js.map +1 -0
  169. package/dist/src/revisions/sources/git.js +180 -0
  170. package/dist/src/revisions/sources/git.js.map +1 -0
  171. package/dist/src/revisions/sources/installed.js +45 -0
  172. package/dist/src/revisions/sources/installed.js.map +1 -0
  173. package/dist/src/revisions/sources/npm.js +97 -0
  174. package/dist/src/revisions/sources/npm.js.map +1 -0
  175. package/dist/src/runs/compare.js +132 -0
  176. package/dist/src/runs/compare.js.map +1 -0
  177. package/dist/src/runs/events.js +79 -0
  178. package/dist/src/runs/events.js.map +1 -0
  179. package/dist/src/runs/executor.js +480 -0
  180. package/dist/src/runs/executor.js.map +1 -0
  181. package/dist/src/runs/finalizer.js +22 -0
  182. package/dist/src/runs/finalizer.js.map +1 -0
  183. package/dist/src/runs/identity.js +35 -0
  184. package/dist/src/runs/identity.js.map +1 -0
  185. package/dist/src/runs/index.js +11 -0
  186. package/dist/src/runs/index.js.map +1 -0
  187. package/dist/src/runs/manifest.js +70 -0
  188. package/dist/src/runs/manifest.js.map +1 -0
  189. package/dist/src/runs/outcome.js +49 -0
  190. package/dist/src/runs/outcome.js.map +1 -0
  191. package/dist/src/runs/query.js +104 -0
  192. package/dist/src/runs/query.js.map +1 -0
  193. package/dist/src/runs/queued.js +54 -0
  194. package/dist/src/runs/queued.js.map +1 -0
  195. package/dist/src/runs/records.js +288 -0
  196. package/dist/src/runs/records.js.map +1 -0
  197. package/dist/src/runs/request.js +169 -0
  198. package/dist/src/runs/request.js.map +1 -0
  199. package/dist/src/trajectories/contract.js +17 -0
  200. package/dist/src/trajectories/contract.js.map +1 -0
  201. package/dist/src/trajectories/format.js +127 -0
  202. package/dist/src/trajectories/format.js.map +1 -0
  203. package/dist/src/trajectories/index.js +7 -0
  204. package/dist/src/trajectories/index.js.map +1 -0
  205. package/dist/src/trajectories/projector.js +385 -0
  206. package/dist/src/trajectories/projector.js.map +1 -0
  207. package/dist/src/trajectories/provider-capture.js +133 -0
  208. package/dist/src/trajectories/provider-capture.js.map +1 -0
  209. package/dist/src/trajectories/providers/deepseek.js +179 -0
  210. package/dist/src/trajectories/providers/deepseek.js.map +1 -0
  211. package/dist/src/trajectories/store.js +421 -0
  212. package/dist/src/trajectories/store.js.map +1 -0
  213. package/dist/src/workspaces/copy.js +142 -0
  214. package/dist/src/workspaces/copy.js.map +1 -0
  215. package/dist/src/workspaces/digest.js +47 -0
  216. package/dist/src/workspaces/digest.js.map +1 -0
  217. package/dist/src/workspaces/git.js +164 -0
  218. package/dist/src/workspaces/git.js.map +1 -0
  219. package/dist/src/workspaces/index.js +6 -0
  220. package/dist/src/workspaces/index.js.map +1 -0
  221. package/dist/src/workspaces/lifecycle.js +313 -0
  222. package/dist/src/workspaces/lifecycle.js.map +1 -0
  223. package/dist/src/workspaces/planner.js +80 -0
  224. package/dist/src/workspaces/planner.js.map +1 -0
  225. package/dist/src/workspaces/store.js +25 -0
  226. package/dist/src/workspaces/store.js.map +1 -0
  227. package/dist/src/workspaces/types.js +4 -0
  228. package/dist/src/workspaces/types.js.map +1 -0
  229. package/dist/src/workspaces/utils.js +56 -0
  230. package/dist/src/workspaces/utils.js.map +1 -0
  231. package/docs/schemas/controller-runtime-manifest.schema.json +57 -0
  232. package/docs/schemas/controller-runtime-ref.schema.json +16 -0
  233. package/docs/schemas/eval-request.schema.json +2 -0
  234. package/docs/schemas/eval-result.schema.json +36 -1
  235. package/docs/schemas/local-git-transport-manifest.schema.json +34 -0
  236. package/docs/schemas/message-feedback.schema.json +37 -0
  237. package/docs/schemas/result.schema.json +9 -0
  238. package/docs/schemas/run-context.schema.json +39 -0
  239. package/docs/schemas/run-manifest.schema.json +81 -0
  240. package/docs/schemas/run-request.schema.json +16 -1
  241. package/docs/schemas/trajectory-ref.schema.json +73 -0
  242. package/integrations/harbor/hitch_harbor_agent.py +551 -5
  243. package/package.json +37 -11
  244. package/bin/hitch.js +0 -9
  245. package/src/adapters.js +0 -435
  246. package/src/artifacts.js +0 -949
  247. package/src/cli.js +0 -505
  248. package/src/config.js +0 -51
  249. package/src/daemon.js +0 -416
  250. package/src/engine.js +0 -400
  251. package/src/errors.js +0 -12
  252. package/src/eval-tools.js +0 -334
  253. package/src/evals.js +0 -276
  254. package/src/events.js +0 -69
  255. package/src/fs.js +0 -43
  256. package/src/harbor-backend.js +0 -285
  257. package/src/harness-reference.js +0 -78
  258. package/src/line-stream.js +0 -17
  259. package/src/locks.js +0 -33
  260. package/src/process.js +0 -49
  261. package/src/registry.js +0 -84
  262. package/src/scheduler.js +0 -156
  263. package/src/workspaces.js +0 -893
@@ -0,0 +1,429 @@
1
+ /**
2
+ * Runtime validators for external JSON, provider events, CLI input, and
3
+ * process output. Values enter as `unknown` and are narrowed here before any
4
+ * domain code touches them (spec §8.2).
5
+ *
6
+ * Pure functions only — no CLI, daemon, backend, or filesystem imports.
7
+ */
8
+ const SHA256_PATTERN = /^sha256:[0-9a-f]{64}$/;
9
+ export function asSha256(value, label = "value") {
10
+ const digest = asString(value, label);
11
+ if (!SHA256_PATTERN.test(digest))
12
+ throw new TypeError(`${label} must be a sha256 digest`);
13
+ return digest;
14
+ }
15
+ function assertExactFields(record, allowed, label) {
16
+ const allowedSet = new Set(allowed);
17
+ const unexpected = Object.keys(record).find((field) => !allowedSet.has(field));
18
+ if (unexpected)
19
+ throw new TypeError(`${label} has unknown field: ${unexpected}`);
20
+ }
21
+ function nonEmptyString(value, label) {
22
+ const result = asString(value, label);
23
+ if (!result.trim())
24
+ throw new TypeError(`${label} must be a non-empty string`);
25
+ return result;
26
+ }
27
+ /** Validate a run context before a run directory or agent process is created. */
28
+ export function validateRunContext(value = { kind: "ad_hoc" }) {
29
+ const record = asRecord(value, "run context");
30
+ const kind = asString(record.kind, "run context kind");
31
+ if (kind === "ad_hoc") {
32
+ assertExactFields(record, ["kind"], "ad_hoc context");
33
+ return { kind };
34
+ }
35
+ if (kind === "seed_task") {
36
+ assertExactFields(record, [
37
+ "kind", "seed_task_id", "seed_task_digest", "seed_set_id",
38
+ "seed_set_revision", "iteration_id",
39
+ ], "seed_task context");
40
+ const context = {
41
+ kind,
42
+ seed_task_id: nonEmptyString(record.seed_task_id, "seed_task_id"),
43
+ seed_task_digest: asSha256(record.seed_task_digest, "seed_task_digest"),
44
+ };
45
+ const seedSetId = asOptionalString(record.seed_set_id, "seed_set_id");
46
+ if (seedSetId !== undefined)
47
+ context.seed_set_id = nonEmptyString(seedSetId, "seed_set_id");
48
+ const seedSetRevision = asOptionalString(record.seed_set_revision, "seed_set_revision");
49
+ if (seedSetRevision !== undefined)
50
+ context.seed_set_revision = nonEmptyString(seedSetRevision, "seed_set_revision");
51
+ const iterationId = asOptionalString(record.iteration_id, "iteration_id");
52
+ if (iterationId !== undefined)
53
+ context.iteration_id = nonEmptyString(iterationId, "iteration_id");
54
+ return context;
55
+ }
56
+ if (kind === "benchmark_task") {
57
+ assertExactFields(record, [
58
+ "kind", "benchmark_id", "benchmark_revision", "task_id",
59
+ "task_digest", "verifier_identity",
60
+ ], "benchmark_task context");
61
+ const revision = nonEmptyString(record.benchmark_revision, "benchmark_revision");
62
+ if (revision.toLowerCase() === "latest") {
63
+ throw new TypeError("benchmark_revision must be immutable and cannot be 'latest'");
64
+ }
65
+ return {
66
+ kind,
67
+ benchmark_id: nonEmptyString(record.benchmark_id, "benchmark_id"),
68
+ benchmark_revision: revision,
69
+ task_id: nonEmptyString(record.task_id, "task_id"),
70
+ task_digest: asSha256(record.task_digest, "task_digest"),
71
+ verifier_identity: asSha256(record.verifier_identity, "verifier_identity"),
72
+ };
73
+ }
74
+ throw new TypeError(`invalid run context kind: ${kind}`);
75
+ }
76
+ export function validateEvalRunParent(value) {
77
+ const record = asRecord(value, "run parent");
78
+ assertExactFields(record, ["kind", "eval_id", "trial_id", "attempt"], "run parent");
79
+ if (record.kind !== "eval")
80
+ throw new TypeError("run parent kind must be 'eval'");
81
+ const attempt = asInteger(record.attempt, "parent attempt");
82
+ if (attempt <= 0)
83
+ throw new TypeError("parent attempt must be positive");
84
+ return {
85
+ kind: "eval",
86
+ eval_id: nonEmptyString(record.eval_id, "parent eval_id"),
87
+ trial_id: nonEmptyString(record.trial_id, "parent trial_id"),
88
+ attempt,
89
+ };
90
+ }
91
+ export function validateRunObservation(value) {
92
+ const record = asRecord(value, "run observation");
93
+ assertExactFields(record, ["status", "reward", "verifier_result_ref", "invalid_reason"], "run observation");
94
+ if (record.status !== "valid" && record.status !== "invalid") {
95
+ throw new TypeError("run observation status must be 'valid' or 'invalid'");
96
+ }
97
+ const observation = { status: record.status };
98
+ if (record.reward !== undefined)
99
+ observation.reward = asNumber(record.reward, "observation reward");
100
+ if (record.verifier_result_ref !== undefined) {
101
+ observation.verifier_result_ref = validateRelativePath(record.verifier_result_ref, "verifier_result_ref");
102
+ }
103
+ if (record.invalid_reason !== undefined)
104
+ observation.invalid_reason = nonEmptyString(record.invalid_reason, "invalid_reason");
105
+ if (observation.status === "valid") {
106
+ if (observation.reward === undefined)
107
+ throw new TypeError("valid observation must include reward");
108
+ if (!observation.verifier_result_ref)
109
+ throw new TypeError("valid observation must include verifier_result_ref");
110
+ if (observation.invalid_reason !== undefined)
111
+ throw new TypeError("valid observation must not include invalid_reason");
112
+ }
113
+ else {
114
+ if (!observation.invalid_reason)
115
+ throw new TypeError("invalid observation must include invalid_reason");
116
+ if (observation.reward !== undefined)
117
+ throw new TypeError("invalid observation must not include reward");
118
+ }
119
+ return observation;
120
+ }
121
+ export function validateRelativePath(value, label = "path") {
122
+ const candidate = nonEmptyString(value, label);
123
+ if (candidate.includes("\\")
124
+ || candidate.startsWith("/")
125
+ || candidate.split("/").some((segment) => segment === ".." || segment === "." || segment === "")) {
126
+ throw new TypeError(`${label} must be a normalized relative path`);
127
+ }
128
+ return candidate;
129
+ }
130
+ export function isRecord(value) {
131
+ return typeof value === "object" && value !== null && !Array.isArray(value);
132
+ }
133
+ export function asRecord(value, label = "value") {
134
+ if (!isRecord(value))
135
+ throw new TypeError(`${label} must be a JSON object`);
136
+ return value;
137
+ }
138
+ export function asString(value, label = "value") {
139
+ if (typeof value !== "string")
140
+ throw new TypeError(`${label} must be a string`);
141
+ return value;
142
+ }
143
+ export function asOptionalString(value, label = "value") {
144
+ if (value === undefined)
145
+ return undefined;
146
+ return asString(value, label);
147
+ }
148
+ export function asNumber(value, label = "value") {
149
+ if (typeof value !== "number" || !Number.isFinite(value))
150
+ throw new TypeError(`${label} must be a finite number`);
151
+ return value;
152
+ }
153
+ export function asInteger(value, label = "value") {
154
+ const number = asNumber(value, label);
155
+ if (!Number.isSafeInteger(number))
156
+ throw new TypeError(`${label} must be a safe integer`);
157
+ return number;
158
+ }
159
+ export function asBoolean(value, label = "value") {
160
+ if (typeof value !== "boolean")
161
+ throw new TypeError(`${label} must be a boolean`);
162
+ return value;
163
+ }
164
+ export function asArray(value, label = "value") {
165
+ if (!Array.isArray(value))
166
+ throw new TypeError(`${label} must be an array`);
167
+ return value;
168
+ }
169
+ /** Non-negative safe-integer Unix epoch milliseconds. */
170
+ export function asEpochMillis(value, label = "value") {
171
+ const number = asInteger(value, label);
172
+ if (number < 0)
173
+ throw new TypeError(`${label} must be a non-negative epoch millisecond value`);
174
+ return number;
175
+ }
176
+ export function validateSessionHeaderLine(value) {
177
+ const record = asRecord(value, "session header line");
178
+ if (record.type !== "session")
179
+ throw new TypeError("session header line must have type 'session'");
180
+ const version = asInteger(record.version, "session header version");
181
+ if (version !== 0)
182
+ throw new TypeError(`unsupported session format version: ${version}`);
183
+ const id = asString(record.id, "session id");
184
+ const createdAt = asEpochMillis(record.createdAt, "session createdAt");
185
+ const delegationDepth = asInteger(record.delegationDepth, "delegationDepth");
186
+ if (delegationDepth < 0)
187
+ throw new TypeError("delegationDepth must be non-negative");
188
+ const header = {
189
+ type: "session",
190
+ version,
191
+ id,
192
+ createdAt,
193
+ delegationDepth,
194
+ };
195
+ const cwd = asOptionalString(record.cwd, "session cwd");
196
+ if (cwd !== undefined)
197
+ header.cwd = cwd;
198
+ const parentSession = asOptionalString(record.parentSession, "parentSession");
199
+ if (parentSession !== undefined)
200
+ header.parentSession = parentSession;
201
+ const seedLength = record.seedLength === undefined ? undefined : asInteger(record.seedLength, "seedLength");
202
+ if (seedLength !== undefined)
203
+ header.seedLength = seedLength;
204
+ if (record.origin !== undefined) {
205
+ if (record.origin !== "subagent")
206
+ throw new TypeError("origin must be 'subagent'");
207
+ header.origin = "subagent";
208
+ }
209
+ const agentPreset = asOptionalString(record.agentPreset, "agentPreset");
210
+ if (agentPreset !== undefined)
211
+ header.agentPreset = agentPreset;
212
+ return header;
213
+ }
214
+ export function validateSessionEvent(value) {
215
+ const record = asRecord(value, "session event");
216
+ const type = asString(record.type, "event type");
217
+ const seq = asInteger(record.seq, "event seq");
218
+ if (seq < 0)
219
+ throw new TypeError("event seq must be non-negative");
220
+ const time = asEpochMillis(record.time, "event time");
221
+ if (!("data" in record) || !isRecord(record.data)) {
222
+ throw new TypeError("event data must be a JSON object");
223
+ }
224
+ const event = { type, seq, time, data: record.data };
225
+ if (record.ignorable === true)
226
+ event.ignorable = true;
227
+ if (record.sourceEventSeqs !== undefined) {
228
+ event.sourceEventSeqs = asArray(record.sourceEventSeqs, "sourceEventSeqs").map((item) => asInteger(item, "sourceEventSeq"));
229
+ }
230
+ if (record.surfaceOp !== undefined) {
231
+ if (record.surfaceOp === "append") {
232
+ event.surfaceOp = "append";
233
+ }
234
+ else {
235
+ const op = asRecord(record.surfaceOp, "surfaceOp");
236
+ if (op.op !== "replace")
237
+ throw new TypeError("surfaceOp must be 'append' or { op: 'replace' }");
238
+ event.surfaceOp = { op: "replace", start: asInteger(op.start, "surfaceOp.start"), end: asInteger(op.end, "surfaceOp.end") };
239
+ }
240
+ }
241
+ return event;
242
+ }
243
+ export function validateTrajectoryRef(value) {
244
+ const record = asRecord(value, "trajectory ref");
245
+ if (record.schema_version === "2")
246
+ return validateTrajectoryRefV2(record);
247
+ if (record.schema_version !== "1")
248
+ throw new TypeError("trajectory ref schema_version must be '1' or '2'");
249
+ const format = asRecord(record.format, "trajectory format");
250
+ if (format.family !== "dsh-session")
251
+ throw new TypeError("trajectory format family must be 'dsh-session'");
252
+ if (format.version !== 0)
253
+ throw new TypeError("trajectory format version must be 0");
254
+ if (format.compression !== "none")
255
+ throw new TypeError("trajectory compression must be 'none'");
256
+ if (format.pack_chunks !== false)
257
+ throw new TypeError("trajectory pack_chunks must be false");
258
+ const contractCommit = asString(format.contract_commit, "contract_commit");
259
+ const fidelity = asString(record.fidelity, "fidelity");
260
+ if (fidelity !== "native" && fidelity !== "normalized" && fidelity !== "minimal") {
261
+ throw new TypeError(`invalid trajectory fidelity: ${fidelity}`);
262
+ }
263
+ const ref = {
264
+ schema_version: "1",
265
+ run_id: asString(record.run_id, "run_id"),
266
+ session_id: asString(record.session_id, "session_id"),
267
+ format: {
268
+ family: "dsh-session",
269
+ version: 0,
270
+ contract_commit: contractCommit,
271
+ compression: "none",
272
+ pack_chunks: false,
273
+ },
274
+ fidelity,
275
+ path: asString(record.path, "path"),
276
+ };
277
+ const providerSessionId = asOptionalString(record.provider_session_id, "provider_session_id");
278
+ if (providerSessionId !== undefined)
279
+ ref.provider_session_id = providerSessionId;
280
+ const sha256 = asOptionalString(record.sha256, "sha256");
281
+ if (sha256 !== undefined) {
282
+ ref.sha256 = asSha256(sha256, "trajectory sha256");
283
+ }
284
+ return ref;
285
+ }
286
+ function validateTrajectoryRefV2(record) {
287
+ assertExactFields(record, [
288
+ "schema_version", "run_id", "fidelity", "provider", "provider_session_id", "files", "redactions",
289
+ ], "trajectory ref V2");
290
+ const fidelity = asString(record.fidelity, "trajectory fidelity");
291
+ if (fidelity !== "provider_native" && fidelity !== "normalized" && fidelity !== "minimal") {
292
+ throw new TypeError(`invalid trajectory fidelity: ${fidelity}`);
293
+ }
294
+ const files = asArray(record.files, "trajectory files").map((entry, index) => {
295
+ const file = asRecord(entry, `trajectory file ${index}`);
296
+ assertExactFields(file, ["role", "path", "media_type", "sha256", "bytes"], `trajectory file ${index}`);
297
+ const role = asString(file.role, `trajectory file ${index} role`);
298
+ if (!["provider_events", "provider_transcript", "provider_artifact", "canonical_session"].includes(role)) {
299
+ throw new TypeError(`invalid trajectory file role: ${role}`);
300
+ }
301
+ const bytes = asInteger(file.bytes, `trajectory file ${index} bytes`);
302
+ if (bytes < 0)
303
+ throw new TypeError(`trajectory file ${index} bytes must be non-negative`);
304
+ return {
305
+ role: role,
306
+ path: validateRelativePath(file.path, `trajectory file ${index} path`),
307
+ media_type: nonEmptyString(file.media_type, `trajectory file ${index} media_type`),
308
+ sha256: asSha256(file.sha256, `trajectory file ${index} sha256`),
309
+ bytes,
310
+ };
311
+ });
312
+ if (files.length === 0)
313
+ throw new TypeError("trajectory files must not be empty");
314
+ if (files.filter((file) => file.role === "canonical_session").length !== 1) {
315
+ throw new TypeError("trajectory files must include exactly one canonical_session");
316
+ }
317
+ if (new Set(files.map((file) => file.path)).size !== files.length) {
318
+ throw new TypeError("trajectory file paths must be unique");
319
+ }
320
+ if (fidelity === "provider_native" && !files.some((file) => file.role.startsWith("provider_"))) {
321
+ throw new TypeError("provider_native trajectory must include a provider file");
322
+ }
323
+ const runId = nonEmptyString(record.run_id, "trajectory run_id");
324
+ if (!/^run_[a-f0-9]{32}$/.test(runId))
325
+ throw new TypeError(`invalid trajectory run_id: ${runId}`);
326
+ const result = {
327
+ schema_version: "2",
328
+ run_id: runId,
329
+ fidelity,
330
+ files,
331
+ };
332
+ const provider = asOptionalString(record.provider, "trajectory provider");
333
+ if (provider !== undefined)
334
+ result.provider = nonEmptyString(provider, "trajectory provider");
335
+ const providerSessionId = asOptionalString(record.provider_session_id, "provider_session_id");
336
+ if (providerSessionId !== undefined)
337
+ result.provider_session_id = nonEmptyString(providerSessionId, "provider_session_id");
338
+ if (record.redactions !== undefined) {
339
+ result.redactions = asArray(record.redactions, "trajectory redactions").map((entry, index) => {
340
+ const redaction = asRecord(entry, `trajectory redaction ${index}`);
341
+ assertExactFields(redaction, ["rule_id", "count"], `trajectory redaction ${index}`);
342
+ const count = asInteger(redaction.count, `trajectory redaction ${index} count`);
343
+ if (count <= 0)
344
+ throw new TypeError(`trajectory redaction ${index} count must be positive`);
345
+ return { rule_id: nonEmptyString(redaction.rule_id, `trajectory redaction ${index} rule_id`), count };
346
+ });
347
+ if (new Set(result.redactions.map((redaction) => redaction.rule_id)).size !== result.redactions.length) {
348
+ throw new TypeError("trajectory redaction rule_id values must be unique");
349
+ }
350
+ }
351
+ return result;
352
+ }
353
+ export function validateMessageFeedbackItem(value) {
354
+ const record = asRecord(value, "feedback item");
355
+ const rating = asString(record.rating, "rating");
356
+ if (rating !== "positive" && rating !== "negative")
357
+ throw new TypeError("rating must be 'positive' or 'negative'");
358
+ const version = asString(record.version, "version");
359
+ const item = {
360
+ messageId: asString(record.messageId, "messageId"),
361
+ rating,
362
+ version,
363
+ createdAt: asEpochMillis(record.createdAt, "createdAt"),
364
+ updatedAt: asEpochMillis(record.updatedAt, "updatedAt"),
365
+ };
366
+ const note = asOptionalString(record.note, "note");
367
+ if (note !== undefined)
368
+ item.note = note;
369
+ return item;
370
+ }
371
+ export function validateMessageFeedbackRow(value) {
372
+ const record = asRecord(value, "feedback row");
373
+ const session = asRecord(record.session, "feedback session");
374
+ const row = {
375
+ session: { createdAt: asEpochMillis(session.createdAt, "session.createdAt") },
376
+ items: asArray(record.items, "items").map((item) => validateMessageFeedbackItem(item)),
377
+ };
378
+ const sessionId = asOptionalString(session.sessionId, "session.sessionId");
379
+ if (sessionId !== undefined)
380
+ row.session.sessionId = sessionId;
381
+ const cwd = asOptionalString(session.cwd, "session.cwd");
382
+ if (cwd !== undefined)
383
+ row.session.cwd = cwd;
384
+ return row;
385
+ }
386
+ export function validateControllerRuntimeManifest(value) {
387
+ const record = asRecord(value, "controller runtime manifest");
388
+ if (record.schema_version !== "2")
389
+ throw new TypeError("controller runtime manifest schema_version must be '2'");
390
+ const runtimeId = asString(record.runtime_id, "runtime_id");
391
+ if (!/^sha256:[0-9a-f]{64}$/.test(runtimeId))
392
+ throw new TypeError("runtime_id must be a sha256 digest");
393
+ if (record.node_range !== ">=22")
394
+ throw new TypeError("node_range must be '>=22'");
395
+ const createdAt = asString(record.created_at, "created_at");
396
+ const entrypoints = asRecord(record.entrypoints, "entrypoints");
397
+ const cli = asRecord(entrypoints.cli, "entrypoints.cli");
398
+ const cliPath = asString(cli.path, "entrypoints.cli.path");
399
+ if (!cliPath || cliPath.includes("\\") || cliPath.startsWith("/") || cliPath.startsWith("..")) {
400
+ throw new TypeError(`invalid entrypoint path: ${cliPath}`);
401
+ }
402
+ if (cli.launcher !== "node")
403
+ throw new TypeError("entrypoints.cli.launcher must be 'node'");
404
+ const files = asArray(record.files, "files").map((entry) => {
405
+ const file = asRecord(entry, "runtime file");
406
+ const pathValue = asString(file.path, "file path");
407
+ if (!pathValue || pathValue.includes("\\") || pathValue.startsWith("/") || pathValue.startsWith("..")) {
408
+ throw new TypeError(`invalid runtime file path: ${pathValue}`);
409
+ }
410
+ const digest = asString(file.sha256, "file sha256");
411
+ if (!/^sha256:[0-9a-f]{64}$/.test(digest))
412
+ throw new TypeError("file sha256 must be a sha256 digest");
413
+ return {
414
+ path: pathValue,
415
+ size: asInteger(file.size, "file size"),
416
+ executable: asBoolean(file.executable, "file executable"),
417
+ sha256: digest,
418
+ };
419
+ });
420
+ return {
421
+ schema_version: "2",
422
+ runtime_id: runtimeId,
423
+ node_range: ">=22",
424
+ entrypoints: { cli: { path: cliPath, launcher: "node" } },
425
+ files,
426
+ created_at: createdAt,
427
+ };
428
+ }
429
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/domain/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=workspaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaces.js","sourceRoot":"","sources":["../../../src/domain/workspaces.ts"],"names":[],"mappings":""}
@@ -0,0 +1,67 @@
1
+ import { createWriteStream } from "node:fs";
2
+ import path from "node:path";
3
+ import { SCHEMA_VERSION, ensureDir } from "../foundation/index.js";
4
+ export class EvalEventSink {
5
+ path;
6
+ evalId;
7
+ onEvent;
8
+ sequence = 0;
9
+ pending = Promise.resolve();
10
+ stream;
11
+ streamError;
12
+ constructor(evalDirectory, evalId, onEvent = () => { }) {
13
+ this.path = path.join(evalDirectory, "events.jsonl");
14
+ this.evalId = evalId;
15
+ this.onEvent = onEvent || (() => { });
16
+ }
17
+ async open() {
18
+ await ensureDir(path.dirname(this.path));
19
+ this.stream = createWriteStream(this.path, { flags: "a", mode: 0o600 });
20
+ this.stream.on("error", (error) => { this.streamError ||= error; });
21
+ }
22
+ emit(event) {
23
+ const framed = {
24
+ schema_version: SCHEMA_VERSION,
25
+ sequence: ++this.sequence,
26
+ timestamp: new Date().toISOString(),
27
+ eval_id: this.evalId,
28
+ ...event,
29
+ };
30
+ this.pending = this.pending.then(() => writeChunk(this.stream, `${JSON.stringify(framed)}\n`));
31
+ try {
32
+ this.onEvent(framed);
33
+ }
34
+ catch { /* Observers cannot break eval persistence. */ }
35
+ return framed;
36
+ }
37
+ async close() {
38
+ let failure;
39
+ try {
40
+ await this.pending;
41
+ }
42
+ catch (error) {
43
+ failure = error;
44
+ }
45
+ try {
46
+ await closeStream(this.stream);
47
+ }
48
+ catch (error) {
49
+ failure ||= error;
50
+ }
51
+ failure ||= this.streamError;
52
+ if (failure)
53
+ throw failure;
54
+ }
55
+ }
56
+ function writeChunk(stream, chunk) {
57
+ return new Promise((resolve, reject) => stream.write(chunk, (error) => error ? reject(error) : resolve()));
58
+ }
59
+ function closeStream(stream) {
60
+ if (!stream)
61
+ return Promise.resolve();
62
+ return new Promise((resolve, reject) => {
63
+ stream.once("error", reject);
64
+ stream.end(resolve);
65
+ });
66
+ }
67
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/evals/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { DEFAULT_EVAL_SETUP_TIMEOUT_MS, DEFAULT_EVAL_TIMEOUT_MS, newEvalId, resolveBenchmarkReference, validateEvalRequest } from "./request.js";
2
+ export { runEval } from "./service.js";
3
+ export { inspectEval, listEvals } from "./records.js";
4
+ export { importEvalTrialRuns, validateEvalTrialReferences } from "./trial-import.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/evals/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,uBAAuB,EAAE,SAAS,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGjJ,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { readdir } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { inspectEvalRuntimeKind } from "../controller-runtime/index.js";
4
+ import { HitchError, SCHEMA_VERSION, invalidInput, readJSON, statePaths } from "../foundation/index.js";
5
+ export async function listEvals({ root }) {
6
+ const directory = statePaths(root).evals;
7
+ let entries;
8
+ try {
9
+ entries = await readdir(directory, { withFileTypes: true });
10
+ }
11
+ catch (error) {
12
+ if (error?.code === "ENOENT")
13
+ return [];
14
+ throw error;
15
+ }
16
+ const evals = [];
17
+ for (const entry of entries) {
18
+ if (!entry.isDirectory() || !entry.name.startsWith("eval_"))
19
+ continue;
20
+ const result = await readJSON(path.join(directory, entry.name, "result.json"), null).catch(() => null);
21
+ const request = await readJSON(path.join(directory, entry.name, "request.json"), null).catch(() => null);
22
+ if (!result && !request)
23
+ continue;
24
+ evals.push({
25
+ eval_id: entry.name,
26
+ status: result?.status || "running",
27
+ backend: result?.backend?.name || request?.backend || null,
28
+ dataset: result?.dataset || request?.dataset || null,
29
+ harness_ref: result?.candidate?.harness_ref || request?.harness_ref || null,
30
+ primary_reward: result?.summary?.primary_reward ?? null,
31
+ started_at: result?.started_at || null,
32
+ completed_at: result?.completed_at || null,
33
+ });
34
+ }
35
+ return evals.sort((left, right) => String(right.started_at || right.eval_id).localeCompare(String(left.started_at || left.eval_id)));
36
+ }
37
+ export async function inspectEval(evalId, { root }) {
38
+ if (typeof evalId !== "string" || !/^eval_[a-f0-9]{32}$/.test(evalId))
39
+ throw invalidInput(`invalid eval ID: ${evalId}`);
40
+ const directory = path.join(statePaths(root).evals, evalId);
41
+ const request = await readJSON(path.join(directory, "request.json"), null);
42
+ if (!request)
43
+ throw new HitchError(`eval not found: ${evalId}`, { code: "eval_not_found", exitCode: 3 });
44
+ return {
45
+ schema_version: SCHEMA_VERSION,
46
+ eval_id: evalId,
47
+ directory,
48
+ request,
49
+ resolution: await readJSON(path.join(directory, "resolution.json"), null),
50
+ plan: await readJSON(path.join(directory, "plan.json"), null),
51
+ result: await readJSON(path.join(directory, "result.json"), null),
52
+ runtime_storage: await inspectEvalRuntimeKind(directory),
53
+ };
54
+ }
55
+ //# sourceMappingURL=records.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records.js","sourceRoot":"","sources":["../../../src/evals/records.ts"],"names":[],"mappings":"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"}