agent-hitch 0.2.7 → 0.2.8

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 (287) hide show
  1. package/README.md +16 -2
  2. package/README.zh-CN.md +14 -2
  3. package/dist/bin/hitch.js +25 -3
  4. package/dist/bin/hitch.js.map +1 -1
  5. package/dist/scripts/canary-benchmark.js +54 -0
  6. package/dist/scripts/canary-benchmark.js.map +1 -0
  7. package/dist/scripts/canary-eval-scheduler-throughput.js +47 -0
  8. package/dist/scripts/canary-eval-scheduler-throughput.js.map +1 -0
  9. package/dist/scripts/check-architecture.js +3 -2
  10. package/dist/scripts/check-architecture.js.map +1 -1
  11. package/dist/src/adapters/catalog.js +2 -1
  12. package/dist/src/adapters/catalog.js.map +1 -1
  13. package/dist/src/adapters/providers/codex-auth.js +29 -0
  14. package/dist/src/adapters/providers/codex-auth.js.map +1 -0
  15. package/dist/src/adapters/providers/codex.js +23 -6
  16. package/dist/src/adapters/providers/codex.js.map +1 -1
  17. package/dist/src/adapters/providers/model-call.js +26 -0
  18. package/dist/src/adapters/providers/model-call.js.map +1 -0
  19. package/dist/src/artifacts/index.js +1 -1
  20. package/dist/src/artifacts/index.js.map +1 -1
  21. package/dist/src/artifacts/preparer.js +7 -2
  22. package/dist/src/artifacts/preparer.js.map +1 -1
  23. package/dist/src/backends/harbor/agent-budget.js +31 -0
  24. package/dist/src/backends/harbor/agent-budget.js.map +1 -0
  25. package/dist/src/backends/harbor/backend.js +6 -4
  26. package/dist/src/backends/harbor/backend.js.map +1 -1
  27. package/dist/src/backends/harbor/index.js +1 -0
  28. package/dist/src/backends/harbor/index.js.map +1 -1
  29. package/dist/src/backends/harbor/regrade.js +77 -0
  30. package/dist/src/backends/harbor/regrade.js.map +1 -0
  31. package/dist/src/backends/index.js +1 -0
  32. package/dist/src/backends/index.js.map +1 -1
  33. package/dist/src/benchmarks/index.js +3 -0
  34. package/dist/src/benchmarks/index.js.map +1 -0
  35. package/dist/src/benchmarks/loader.js +271 -0
  36. package/dist/src/benchmarks/loader.js.map +1 -0
  37. package/dist/src/benchmarks/metrics.js +16 -0
  38. package/dist/src/benchmarks/metrics.js.map +1 -0
  39. package/dist/src/benchmarks/toml.js +13 -0
  40. package/dist/src/benchmarks/toml.js.map +1 -0
  41. package/dist/src/benchmarks/validation.js +242 -0
  42. package/dist/src/benchmarks/validation.js.map +1 -0
  43. package/dist/src/cli/arguments.js +6 -4
  44. package/dist/src/cli/arguments.js.map +1 -1
  45. package/dist/src/cli/commands/benchmark.js +22 -0
  46. package/dist/src/cli/commands/benchmark.js.map +1 -0
  47. package/dist/src/cli/commands/capabilities.js +18 -0
  48. package/dist/src/cli/commands/capabilities.js.map +1 -0
  49. package/dist/src/cli/commands/eval.js +15 -3
  50. package/dist/src/cli/commands/eval.js.map +1 -1
  51. package/dist/src/cli/commands/run.js +37 -15
  52. package/dist/src/cli/commands/run.js.map +1 -1
  53. package/dist/src/cli/commands/trajectory.js +96 -5
  54. package/dist/src/cli/commands/trajectory.js.map +1 -1
  55. package/dist/src/cli/commands/verifier.js +36 -0
  56. package/dist/src/cli/commands/verifier.js.map +1 -0
  57. package/dist/src/cli/main.js +6 -0
  58. package/dist/src/cli/main.js.map +1 -1
  59. package/dist/src/cli/output.js +14 -2
  60. package/dist/src/cli/output.js.map +1 -1
  61. package/dist/src/control-plane/eval-control-work.js +5 -0
  62. package/dist/src/control-plane/eval-control-work.js.map +1 -1
  63. package/dist/src/control-plane/eval-scheduler.js +4 -1
  64. package/dist/src/control-plane/eval-scheduler.js.map +1 -1
  65. package/dist/src/control-plane/index.js +1 -1
  66. package/dist/src/control-plane/index.js.map +1 -1
  67. package/dist/src/control-plane/remote-result-transport.js +3 -0
  68. package/dist/src/control-plane/remote-result-transport.js.map +1 -1
  69. package/dist/src/control-plane/remote-work-coordinator.js +1 -0
  70. package/dist/src/control-plane/remote-work-coordinator.js.map +1 -1
  71. package/dist/src/control-plane/remote-work-item.js +62 -0
  72. package/dist/src/control-plane/remote-work-item.js.map +1 -0
  73. package/dist/src/control-plane/remote-work-recovery.js +44 -5
  74. package/dist/src/control-plane/remote-work-recovery.js.map +1 -1
  75. package/dist/src/control-plane/remote-worker-protocol.js +2 -23
  76. package/dist/src/control-plane/remote-worker-protocol.js.map +1 -1
  77. package/dist/src/control-plane/rerun-scheduler.js +51 -14
  78. package/dist/src/control-plane/rerun-scheduler.js.map +1 -1
  79. package/dist/src/control-plane/rerun-submission.js +10 -4
  80. package/dist/src/control-plane/rerun-submission.js.map +1 -1
  81. package/dist/src/control-plane/work-admission.js +2 -0
  82. package/dist/src/control-plane/work-admission.js.map +1 -1
  83. package/dist/src/control-plane/work-dispatcher.js +9 -1
  84. package/dist/src/control-plane/work-dispatcher.js.map +1 -1
  85. package/dist/src/controller-runtime/hash.js +7 -2
  86. package/dist/src/controller-runtime/hash.js.map +1 -1
  87. package/dist/src/daemon/auth.js +5 -0
  88. package/dist/src/daemon/auth.js.map +1 -1
  89. package/dist/src/domain/benchmarks.js +2 -0
  90. package/dist/src/domain/benchmarks.js.map +1 -0
  91. package/dist/src/domain/index.js +4 -0
  92. package/dist/src/domain/index.js.map +1 -1
  93. package/dist/src/domain/runs.js.map +1 -1
  94. package/dist/src/domain/validation.js +11 -4
  95. package/dist/src/domain/validation.js.map +1 -1
  96. package/dist/src/domain/verifier-evidence-validation.js +214 -0
  97. package/dist/src/domain/verifier-evidence-validation.js.map +1 -0
  98. package/dist/src/domain/verifier-evidence.js +3 -0
  99. package/dist/src/domain/verifier-evidence.js.map +1 -0
  100. package/dist/src/domain/verifier-score-contract.js +232 -0
  101. package/dist/src/domain/verifier-score-contract.js.map +1 -0
  102. package/dist/src/evals/benchmark-adapter-manifest.js +219 -0
  103. package/dist/src/evals/benchmark-adapter-manifest.js.map +1 -0
  104. package/dist/src/evals/benchmark-candidate.js +36 -0
  105. package/dist/src/evals/benchmark-candidate.js.map +1 -0
  106. package/dist/src/evals/benchmark-run.js +166 -0
  107. package/dist/src/evals/benchmark-run.js.map +1 -0
  108. package/dist/src/evals/collect-only-rerun.js +2 -1
  109. package/dist/src/evals/collect-only-rerun.js.map +1 -1
  110. package/dist/src/evals/directory.js +1 -1
  111. package/dist/src/evals/directory.js.map +1 -1
  112. package/dist/src/evals/duration-estimator.js +126 -0
  113. package/dist/src/evals/duration-estimator.js.map +1 -0
  114. package/dist/src/evals/eval-lifecycle-events.js +13 -0
  115. package/dist/src/evals/eval-lifecycle-events.js.map +1 -1
  116. package/dist/src/evals/eval-logical-plan.js +51 -0
  117. package/dist/src/evals/eval-logical-plan.js.map +1 -0
  118. package/dist/src/evals/eval-result-builder.js +81 -0
  119. package/dist/src/evals/eval-result-builder.js.map +1 -0
  120. package/dist/src/evals/evolution-baseline.js +191 -0
  121. package/dist/src/evals/evolution-baseline.js.map +1 -0
  122. package/dist/src/evals/execution-plan.js +39 -3
  123. package/dist/src/evals/execution-plan.js.map +1 -1
  124. package/dist/src/evals/failure-classifier.js +61 -0
  125. package/dist/src/evals/failure-classifier.js.map +1 -0
  126. package/dist/src/evals/harbor-artifact-builder.js +6 -2
  127. package/dist/src/evals/harbor-artifact-builder.js.map +1 -1
  128. package/dist/src/evals/harbor-bridge-error.js +41 -1
  129. package/dist/src/evals/harbor-bridge-error.js.map +1 -1
  130. package/dist/src/evals/harbor-node-runtime.js +146 -0
  131. package/dist/src/evals/harbor-node-runtime.js.map +1 -0
  132. package/dist/src/evals/index.js +15 -0
  133. package/dist/src/evals/index.js.map +1 -1
  134. package/dist/src/evals/infrastructure-retry.js +109 -22
  135. package/dist/src/evals/infrastructure-retry.js.map +1 -1
  136. package/dist/src/evals/native-phase-evidence.js +440 -0
  137. package/dist/src/evals/native-phase-evidence.js.map +1 -0
  138. package/dist/src/evals/physical-retry-work.js +31 -0
  139. package/dist/src/evals/physical-retry-work.js.map +1 -0
  140. package/dist/src/evals/planned-execution-support.js +22 -10
  141. package/dist/src/evals/planned-execution-support.js.map +1 -1
  142. package/dist/src/evals/planned-execution.js +120 -112
  143. package/dist/src/evals/planned-execution.js.map +1 -1
  144. package/dist/src/evals/planned-progress-publisher.js +62 -0
  145. package/dist/src/evals/planned-progress-publisher.js.map +1 -0
  146. package/dist/src/evals/planned-retry-execution.js +174 -0
  147. package/dist/src/evals/planned-retry-execution.js.map +1 -0
  148. package/dist/src/evals/planned-retry-lifecycle.js +4 -2
  149. package/dist/src/evals/planned-retry-lifecycle.js.map +1 -1
  150. package/dist/src/evals/preparation-rerun.js +225 -0
  151. package/dist/src/evals/preparation-rerun.js.map +1 -0
  152. package/dist/src/evals/progress.js +48 -8
  153. package/dist/src/evals/progress.js.map +1 -1
  154. package/dist/src/evals/recovery.js +54 -4
  155. package/dist/src/evals/recovery.js.map +1 -1
  156. package/dist/src/evals/regrade-evidence.js +77 -0
  157. package/dist/src/evals/regrade-evidence.js.map +1 -0
  158. package/dist/src/evals/remote-infrastructure-retry.js +84 -18
  159. package/dist/src/evals/remote-infrastructure-retry.js.map +1 -1
  160. package/dist/src/evals/request.js +21 -3
  161. package/dist/src/evals/request.js.map +1 -1
  162. package/dist/src/evals/rerun-inputs.js +19 -0
  163. package/dist/src/evals/rerun-inputs.js.map +1 -1
  164. package/dist/src/evals/rerun-types.js +2 -6
  165. package/dist/src/evals/rerun-types.js.map +1 -1
  166. package/dist/src/evals/rerun.js +27 -20
  167. package/dist/src/evals/rerun.js.map +1 -1
  168. package/dist/src/evals/result-helpers.js +13 -0
  169. package/dist/src/evals/result-helpers.js.map +1 -1
  170. package/dist/src/evals/retry-backoff.js +20 -0
  171. package/dist/src/evals/retry-backoff.js.map +1 -0
  172. package/dist/src/evals/retry-state.js +195 -0
  173. package/dist/src/evals/retry-state.js.map +1 -0
  174. package/dist/src/evals/scheduler-metrics.js +95 -0
  175. package/dist/src/evals/scheduler-metrics.js.map +1 -0
  176. package/dist/src/evals/scheduler-trace-replay.js +107 -0
  177. package/dist/src/evals/scheduler-trace-replay.js.map +1 -0
  178. package/dist/src/evals/service.js +87 -138
  179. package/dist/src/evals/service.js.map +1 -1
  180. package/dist/src/evals/trial-import.js +47 -50
  181. package/dist/src/evals/trial-import.js.map +1 -1
  182. package/dist/src/evals/trial-publication-recovery.js +45 -5
  183. package/dist/src/evals/trial-publication-recovery.js.map +1 -1
  184. package/dist/src/evals/trial-reference-validation.js +49 -0
  185. package/dist/src/evals/trial-reference-validation.js.map +1 -0
  186. package/dist/src/evals/verifier-artifacts.js +317 -0
  187. package/dist/src/evals/verifier-artifacts.js.map +1 -0
  188. package/dist/src/evals/verifier-eligibility.js +25 -0
  189. package/dist/src/evals/verifier-eligibility.js.map +1 -0
  190. package/dist/src/evals/verifier-only-rerun.js +210 -0
  191. package/dist/src/evals/verifier-only-rerun.js.map +1 -0
  192. package/dist/src/evals/verifier-runtime.js +61 -0
  193. package/dist/src/evals/verifier-runtime.js.map +1 -0
  194. package/dist/src/evals/verifier-score-artifacts.js +119 -0
  195. package/dist/src/evals/verifier-score-artifacts.js.map +1 -0
  196. package/dist/src/foundation/contained-file.js +85 -0
  197. package/dist/src/foundation/contained-file.js.map +1 -0
  198. package/dist/src/foundation/credential-redaction.js +26 -1
  199. package/dist/src/foundation/credential-redaction.js.map +1 -1
  200. package/dist/src/foundation/fs.js +2 -1
  201. package/dist/src/foundation/fs.js.map +1 -1
  202. package/dist/src/foundation/index.js +2 -1
  203. package/dist/src/foundation/index.js.map +1 -1
  204. package/dist/src/runs/adapter-process.js +12 -0
  205. package/dist/src/runs/adapter-process.js.map +1 -0
  206. package/dist/src/runs/executor.js +24 -30
  207. package/dist/src/runs/executor.js.map +1 -1
  208. package/dist/src/runs/finalizer.js +17 -0
  209. package/dist/src/runs/finalizer.js.map +1 -1
  210. package/dist/src/runs/index.js +5 -0
  211. package/dist/src/runs/index.js.map +1 -1
  212. package/dist/src/runs/phase-bundle.js +86 -0
  213. package/dist/src/runs/phase-bundle.js.map +1 -0
  214. package/dist/src/runs/phase-cancellation.js +107 -0
  215. package/dist/src/runs/phase-cancellation.js.map +1 -0
  216. package/dist/src/runs/phase-group.js +113 -0
  217. package/dist/src/runs/phase-group.js.map +1 -0
  218. package/dist/src/runs/query.js +1 -1
  219. package/dist/src/runs/query.js.map +1 -1
  220. package/dist/src/runs/records.js +3 -0
  221. package/dist/src/runs/records.js.map +1 -1
  222. package/dist/src/runs/request.js +4 -2
  223. package/dist/src/runs/request.js.map +1 -1
  224. package/dist/src/runs/verifier-evidence-redaction.js +61 -0
  225. package/dist/src/runs/verifier-evidence-redaction.js.map +1 -0
  226. package/dist/src/runs/verifier-evidence.js +459 -0
  227. package/dist/src/runs/verifier-evidence.js.map +1 -0
  228. package/dist/src/runs/verifier-structured-evidence.js +83 -0
  229. package/dist/src/runs/verifier-structured-evidence.js.map +1 -0
  230. package/dist/src/trajectories/analysis.js +288 -0
  231. package/dist/src/trajectories/analysis.js.map +1 -0
  232. package/dist/src/trajectories/chunk-projection.js +148 -0
  233. package/dist/src/trajectories/chunk-projection.js.map +1 -0
  234. package/dist/src/trajectories/content-projection.js +389 -0
  235. package/dist/src/trajectories/content-projection.js.map +1 -0
  236. package/dist/src/trajectories/dsh-chunk-contract.js +176 -0
  237. package/dist/src/trajectories/dsh-chunk-contract.js.map +1 -0
  238. package/dist/src/trajectories/dsh-contract.js +284 -0
  239. package/dist/src/trajectories/dsh-contract.js.map +1 -0
  240. package/dist/src/trajectories/events-chunk-drill.js +95 -0
  241. package/dist/src/trajectories/events-chunk-drill.js.map +1 -0
  242. package/dist/src/trajectories/events-page.js +367 -0
  243. package/dist/src/trajectories/events-page.js.map +1 -0
  244. package/dist/src/trajectories/index.js +3 -0
  245. package/dist/src/trajectories/index.js.map +1 -1
  246. package/dist/src/trajectories/request-attempt.js +47 -0
  247. package/dist/src/trajectories/request-attempt.js.map +1 -0
  248. package/dist/src/trajectories/stream-reader.js +311 -0
  249. package/dist/src/trajectories/stream-reader.js.map +1 -0
  250. package/dist/src/trajectories/surface-fold.js +126 -0
  251. package/dist/src/trajectories/surface-fold.js.map +1 -0
  252. package/dist/src/workers/remote-harbor-worker.js +3 -0
  253. package/dist/src/workers/remote-harbor-worker.js.map +1 -1
  254. package/docs/schemas/benchmark-hook-request-v1.schema.json +65 -0
  255. package/docs/schemas/benchmark-hook-response-v1.schema.json +75 -0
  256. package/docs/schemas/benchmark-hook-v1.schema.json +33 -0
  257. package/docs/schemas/benchmark-lock-v1.schema.json +351 -0
  258. package/docs/schemas/benchmark-metric-v1.schema.json +37 -0
  259. package/docs/schemas/benchmark-package-v1.schema.json +167 -0
  260. package/docs/schemas/benchmark-phase-group.schema.json +41 -0
  261. package/docs/schemas/benchmark-profile-v1.schema.json +141 -0
  262. package/docs/schemas/benchmark-task-v1.schema.json +384 -0
  263. package/docs/schemas/benchmark-tool-result-v1.schema.json +30 -0
  264. package/docs/schemas/error.schema.json +22 -0
  265. package/docs/schemas/eval-progress.schema.json +1 -15
  266. package/docs/schemas/eval-rerun-result.schema.json +6 -1
  267. package/docs/schemas/eval-rerun-submission.schema.json +3 -1
  268. package/docs/schemas/eval-result.schema.json +1 -15
  269. package/docs/schemas/eval-trial-publication.schema.json +1 -25
  270. package/docs/schemas/eval-trial-reference.schema.json +129 -0
  271. package/docs/schemas/regrade-assessment-reference.schema.json +11 -0
  272. package/docs/schemas/run-context.schema.json +15 -0
  273. package/docs/schemas/run-manifest.schema.json +4 -0
  274. package/docs/schemas/run-request.schema.json +4 -0
  275. package/docs/schemas/trajectory-analysis.schema.json +258 -0
  276. package/docs/schemas/trajectory-events-page.schema.json +40 -0
  277. package/docs/schemas/verifier-assessment.schema.json +77 -0
  278. package/docs/schemas/verifier-evidence.schema.json +276 -0
  279. package/integrations/harbor/hitch_benchmark.py +252 -0
  280. package/integrations/harbor/hitch_candidate_recycle.py +262 -0
  281. package/integrations/harbor/hitch_harbor_agent.py +541 -43
  282. package/integrations/harbor/hitch_harbor_environment.py +138 -0
  283. package/integrations/harbor/hitch_harbor_verifier.py +60 -2
  284. package/integrations/harbor/hitch_phase_supervisor.py +452 -0
  285. package/integrations/harbor/hitch_tool_client.mjs +91 -0
  286. package/integrations/model-call/cli.js +57 -0
  287. package/package.json +17 -6
@@ -0,0 +1,389 @@
1
+ import { createHash } from "node:crypto";
2
+ import { PROVIDER_ENVIRONMENT_NAMES, credentialValuesFromEnv, isSensitiveFieldName, redactCredentialText, } from "../foundation/index.js";
3
+ const REDACTION_OVERLAP_BYTES = 64 * 1024;
4
+ const UNIX_HOST_PATH = /(^|[\s"'`=:([\]{}<>])\/(?!\/)[A-Za-z0-9._~!$&()+,;@%:-]+(?:\/[A-Za-z0-9._~!$&()+,;=@%:-]+)*/gm;
5
+ const WINDOWS_HOST_PATH = /\b[A-Za-z]:\\(?:[^\\\s"'\`<>|]+\\)*[^\\\s"'\`<>|]*/g;
6
+ const UNC_HOST_PATH = /\\\\[^\\\s"'\`<>|]+\\[^\\\s"'\`<>|]+(?:\\[^\\\s"'\`<>|]+)*/g;
7
+ const WINDOWS_FORWARD_PATH = /\b[A-Za-z]:\/(?:[^/\s"'`<>|]+\/)*[^/\s"'`<>|]*/g;
8
+ const FORWARD_UNC_PATH = /(^|[\s"'`=([\]{}<>])\/\/[A-Za-z0-9._~!$&()+,;=@%:-]+(?:\/[A-Za-z0-9._~!$&()+,;=@%:-]+)+/gm;
9
+ const FILE_URI_PATH = /\bfile:\/\/(?:\/(?:[A-Za-z]:\/)?|[A-Za-z0-9._~-]+\/)[^\s"'`<>]+/gi;
10
+ /** Return the public field-path segment for a key, or null when the key itself must be redacted. */
11
+ export function fieldSegmentForKey(value, credentialValues, pathValues) {
12
+ if (isSensitiveFieldName(value))
13
+ return null;
14
+ if (redactText(value, credentialValues, pathValues).text !== value)
15
+ return null;
16
+ return safeFieldSegment(value);
17
+ }
18
+ /** Event types are echoed in counts, filters, pages, and cursors, so they must be safe without rewriting. */
19
+ export function isPublicEventType(value, credentialValues, pathValues) {
20
+ return value.length > 0 && value.length <= 1_024
21
+ && !isSensitiveFieldName(value)
22
+ && redactText(value, credentialValues, pathValues).text === value;
23
+ }
24
+ export function defaultCredentialValues(env = process.env) {
25
+ return credentialValuesFromEnv(PROVIDER_ENVIRONMENT_NAMES, env);
26
+ }
27
+ /** Redact every JSON key/value and replace individually large strings with verifiable excerpts. */
28
+ export function projectBoundedJson(value, context, field = "value") {
29
+ if (typeof value === "string")
30
+ return projectString(value, context, field);
31
+ if (Array.isArray(value)) {
32
+ return projectArray(value, context, field);
33
+ }
34
+ if (value && typeof value === "object") {
35
+ return projectObject(value, context, field);
36
+ }
37
+ return value;
38
+ }
39
+ function projectArray(value, context, field) {
40
+ const sink = new JsonEvidenceSink(context.previewBytes, context.tailBytes);
41
+ let result = [];
42
+ sink.append("[");
43
+ value.forEach((entry, index) => {
44
+ if (index > 0)
45
+ sink.append(",");
46
+ const projected = projectBoundedJson(entry, context, `${field}.${index}`);
47
+ walkJson(projected, (token) => sink.append(token));
48
+ result?.push(projected);
49
+ if (sink.byteCount > context.maxInlineBytes)
50
+ result = undefined;
51
+ });
52
+ sink.append("]");
53
+ return result && sink.byteCount <= context.maxInlineBytes
54
+ ? result
55
+ : sink.excerpt({ run_id: context.runId, seq: context.seq, field });
56
+ }
57
+ function projectObject(value, context, field) {
58
+ const sink = new JsonEvidenceSink(context.previewBytes, context.tailBytes);
59
+ let result = {};
60
+ let redactedKeyIndex = 0;
61
+ sink.append("{");
62
+ let index = 0;
63
+ for (const rawKey of Object.keys(value)) {
64
+ const entry = value[rawKey];
65
+ if (index > 0)
66
+ sink.append(",");
67
+ let key;
68
+ let projected;
69
+ if (isSensitiveFieldName(rawKey)) {
70
+ redactedKeyIndex += 1;
71
+ increment(context.redactions, "sensitive-field-v1");
72
+ key = `[REDACTED_FIELD_${redactedKeyIndex}]`;
73
+ projected = "[REDACTED]";
74
+ }
75
+ else {
76
+ const keyRedaction = redactText(rawKey, context.credentialValues, context.pathValues);
77
+ mergeRedactionCounts(context.redactions, keyRedaction.redactions);
78
+ if (keyRedaction.text !== rawKey) {
79
+ redactedKeyIndex += 1;
80
+ key = `[REDACTED_KEY_${redactedKeyIndex}]`;
81
+ }
82
+ else {
83
+ key = rawKey;
84
+ }
85
+ projected = projectBoundedJson(entry, context, `${field}.${safeFieldSegment(key)}`);
86
+ }
87
+ sink.append(JSON.stringify(key));
88
+ sink.append(":");
89
+ walkJson(projected, (token) => sink.append(token));
90
+ if (result)
91
+ defineJsonProperty(result, key, projected);
92
+ if (sink.byteCount > context.maxInlineBytes)
93
+ result = undefined;
94
+ index += 1;
95
+ }
96
+ sink.append("}");
97
+ return result && sink.byteCount <= context.maxInlineBytes
98
+ ? result
99
+ : sink.excerpt({ run_id: context.runId, seq: context.seq, field });
100
+ }
101
+ export function mergeRedactionCounts(target, entries) {
102
+ if (Array.isArray(entries)) {
103
+ for (const entry of entries)
104
+ target.set(entry.rule_id, (target.get(entry.rule_id) ?? 0) + entry.count);
105
+ return;
106
+ }
107
+ for (const [rule, count] of entries)
108
+ target.set(rule, (target.get(rule) ?? 0) + count);
109
+ }
110
+ export function redactionEntries(redactions) {
111
+ return [...redactions.entries()]
112
+ .sort(([left], [right]) => left.localeCompare(right))
113
+ .map(([rule_id, count]) => ({ rule_id, count }));
114
+ }
115
+ /**
116
+ * Bounded text fold which redacts before hashing or retaining excerpts. A
117
+ * delimiter-aware overlap keeps credentials and host paths split across input
118
+ * chunks in the same redaction window.
119
+ */
120
+ export class BoundedTextAccumulator {
121
+ previewLimit;
122
+ tailLimit;
123
+ credentialValues;
124
+ pathValues;
125
+ redactions;
126
+ hash = createHash("sha256");
127
+ preview = "";
128
+ tail = "";
129
+ byteCount = 0;
130
+ pending = "";
131
+ finalized = false;
132
+ suppressOversizedToken = false;
133
+ constructor(previewLimit, tailLimit, credentialValues, pathValues, redactions) {
134
+ this.previewLimit = previewLimit;
135
+ this.tailLimit = tailLimit;
136
+ this.credentialValues = credentialValues;
137
+ this.pathValues = pathValues;
138
+ this.redactions = redactions;
139
+ }
140
+ append(value) {
141
+ if (this.finalized)
142
+ throw new Error("bounded text accumulator is already finalized");
143
+ if (this.suppressOversizedToken) {
144
+ const newline = value.search(/[\r\n]/);
145
+ if (newline < 0)
146
+ return;
147
+ this.suppressOversizedToken = false;
148
+ this.pending += value.slice(newline);
149
+ }
150
+ else {
151
+ this.pending += value;
152
+ }
153
+ this.flushSafePrefix();
154
+ }
155
+ excerpt(input) {
156
+ if (!this.finalized) {
157
+ this.commitRedacted(this.pending);
158
+ this.pending = "";
159
+ this.finalized = true;
160
+ }
161
+ return {
162
+ preview: this.preview,
163
+ ...(this.byteCount > this.previewLimit && this.tail.length > 0 ? { tail: this.tail } : {}),
164
+ bytes: this.byteCount,
165
+ sha256: `sha256:${this.hash.digest("hex")}`,
166
+ truncated: this.byteCount > Buffer.byteLength(this.preview),
167
+ source: { run_id: input.runId, seq: input.seq, field: input.field },
168
+ };
169
+ }
170
+ flushSafePrefix() {
171
+ while (Buffer.byteLength(this.pending) > REDACTION_OVERLAP_BYTES * 2) {
172
+ const target = utf8Prefix(this.pending, Buffer.byteLength(this.pending) - REDACTION_OVERLAP_BYTES).length;
173
+ let split = target;
174
+ while (split > 0 && !/[\r\n]/.test(this.pending[split - 1]))
175
+ split -= 1;
176
+ if (split === 0) {
177
+ increment(this.redactions, "oversized-token-v1");
178
+ this.commit("[REDACTED_OVERSIZED_TOKEN]");
179
+ this.pending = "";
180
+ this.suppressOversizedToken = true;
181
+ return;
182
+ }
183
+ for (const credential of this.credentialValues) {
184
+ const start = this.pending.lastIndexOf(credential, split);
185
+ if (start >= 0 && start < split && start + credential.length > split)
186
+ split = start;
187
+ }
188
+ const prefix = this.pending.slice(0, split);
189
+ this.pending = this.pending.slice(split);
190
+ this.commitRedacted(prefix);
191
+ }
192
+ }
193
+ commitRedacted(value) {
194
+ const redacted = redactText(value, this.credentialValues, this.pathValues);
195
+ mergeRedactionCounts(this.redactions, redacted.redactions);
196
+ this.commit(redacted.text);
197
+ }
198
+ commit(value) {
199
+ const bytes = Buffer.byteLength(value);
200
+ this.byteCount += bytes;
201
+ this.hash.update(value);
202
+ if (Buffer.byteLength(this.preview) < this.previewLimit) {
203
+ this.preview += utf8Prefix(value, this.previewLimit - Buffer.byteLength(this.preview));
204
+ }
205
+ this.tail = utf8Suffix(`${this.tail}${value}`, this.tailLimit);
206
+ }
207
+ }
208
+ /** Produce a bounded excerpt of already-redacted JSON without materializing the complete serialization. */
209
+ export function serializedJsonExcerpt(value, source, previewBytes, tailBytes) {
210
+ const sink = new JsonEvidenceSink(previewBytes, tailBytes);
211
+ walkJson(value, (token) => sink.append(token));
212
+ return sink.excerpt(source);
213
+ }
214
+ function projectString(value, context, field) {
215
+ const redacted = redactText(value, context.credentialValues, context.pathValues);
216
+ mergeRedactionCounts(context.redactions, redacted.redactions);
217
+ const bytes = Buffer.byteLength(redacted.text);
218
+ if (bytes <= context.maxInlineBytes)
219
+ return redacted.text;
220
+ return {
221
+ preview: utf8Prefix(redacted.text, context.previewBytes),
222
+ ...(context.tailBytes > 0 ? { tail: utf8Suffix(redacted.text, context.tailBytes) } : {}),
223
+ bytes,
224
+ sha256: `sha256:${createHash("sha256").update(redacted.text).digest("hex")}`,
225
+ truncated: true,
226
+ source: { run_id: context.runId, seq: context.seq, field },
227
+ };
228
+ }
229
+ export function sensitivePathValues(sourcePath) {
230
+ const marker = `${pathSeparator()}trajectory${pathSeparator()}`;
231
+ const markerIndex = sourcePath.lastIndexOf(marker);
232
+ const runDirectory = markerIndex >= 0 ? sourcePath.slice(0, markerIndex) : "";
233
+ return [...new Set([sourcePath, runDirectory].filter((entry) => entry.length > 1))]
234
+ .sort((left, right) => right.length - left.length || left.localeCompare(right));
235
+ }
236
+ function redactText(value, credentialValues, pathValues) {
237
+ const redacted = redactCredentialText(value, credentialValues);
238
+ let text = redacted.text;
239
+ let pathCount = 0;
240
+ for (const sensitive of pathValues) {
241
+ if (!text.includes(sensitive))
242
+ continue;
243
+ const parts = text.split(sensitive);
244
+ pathCount += parts.length - 1;
245
+ text = parts.join("[REDACTED_PATH]");
246
+ }
247
+ text = text.replace(FILE_URI_PATH, () => {
248
+ pathCount += 1;
249
+ return "[REDACTED_PATH]";
250
+ });
251
+ text = text.replace(WINDOWS_FORWARD_PATH, () => {
252
+ pathCount += 1;
253
+ return "[REDACTED_PATH]";
254
+ });
255
+ text = text.replace(FORWARD_UNC_PATH, (_match, prefix) => {
256
+ pathCount += 1;
257
+ return `${prefix}[REDACTED_PATH]`;
258
+ });
259
+ text = text.replace(UNIX_HOST_PATH, (_match, prefix) => {
260
+ pathCount += 1;
261
+ return `${prefix}[REDACTED_PATH]`;
262
+ });
263
+ for (const pattern of [WINDOWS_HOST_PATH, UNC_HOST_PATH]) {
264
+ text = text.replace(pattern, () => {
265
+ pathCount += 1;
266
+ return "[REDACTED_PATH]";
267
+ });
268
+ }
269
+ if (pathCount > 0)
270
+ redacted.redactions.set("host-path-v1", pathCount);
271
+ return { text, redactions: redacted.redactions };
272
+ }
273
+ class JsonEvidenceSink {
274
+ previewLimit;
275
+ tailLimit;
276
+ hash = createHash("sha256");
277
+ preview = "";
278
+ tail = "";
279
+ bytes = 0;
280
+ constructor(previewLimit, tailLimit) {
281
+ this.previewLimit = previewLimit;
282
+ this.tailLimit = tailLimit;
283
+ }
284
+ get byteCount() {
285
+ return this.bytes;
286
+ }
287
+ append(token) {
288
+ this.hash.update(token);
289
+ this.bytes += Buffer.byteLength(token);
290
+ if (Buffer.byteLength(this.preview) < this.previewLimit) {
291
+ this.preview += utf8Prefix(token, this.previewLimit - Buffer.byteLength(this.preview));
292
+ }
293
+ this.tail = utf8Suffix(`${this.tail}${token}`, this.tailLimit);
294
+ }
295
+ excerpt(source) {
296
+ return {
297
+ preview: this.preview,
298
+ ...(this.bytes > this.previewLimit && this.tail.length > 0 ? { tail: this.tail } : {}),
299
+ bytes: this.bytes,
300
+ sha256: `sha256:${this.hash.digest("hex")}`,
301
+ truncated: this.bytes > Buffer.byteLength(this.preview),
302
+ source,
303
+ };
304
+ }
305
+ }
306
+ function walkJson(value, emit) {
307
+ if (value === null || typeof value === "boolean" || typeof value === "number" || typeof value === "string") {
308
+ emit(JSON.stringify(value));
309
+ return;
310
+ }
311
+ if (Array.isArray(value)) {
312
+ emit("[");
313
+ value.forEach((entry, index) => {
314
+ if (index > 0)
315
+ emit(",");
316
+ walkJson(entry, emit);
317
+ });
318
+ emit("]");
319
+ return;
320
+ }
321
+ if (value && typeof value === "object") {
322
+ emit("{");
323
+ Object.entries(value).forEach(([key, entry], index) => {
324
+ if (index > 0)
325
+ emit(",");
326
+ emit(JSON.stringify(key));
327
+ emit(":");
328
+ walkJson(entry, emit);
329
+ });
330
+ emit("}");
331
+ return;
332
+ }
333
+ throw new TypeError("projected value is not JSON serializable");
334
+ }
335
+ function defineJsonProperty(target, key, value) {
336
+ Object.defineProperty(target, key, { value, enumerable: true, configurable: true, writable: true });
337
+ }
338
+ function safeFieldSegment(value) {
339
+ return /^[A-Za-z0-9_-]+$/.test(value) ? value : `[field:${createHash("sha256").update(value).digest("hex").slice(0, 12)}]`;
340
+ }
341
+ function increment(map, key) {
342
+ map.set(key, (map.get(key) ?? 0) + 1);
343
+ }
344
+ function pathSeparator() {
345
+ return process.platform === "win32" ? "\\" : "/";
346
+ }
347
+ function utf8Prefix(value, maxBytes) {
348
+ if (maxBytes <= 0)
349
+ return "";
350
+ if (Buffer.byteLength(value) <= maxBytes)
351
+ return value;
352
+ let low = 0;
353
+ let high = value.length;
354
+ while (low < high) {
355
+ const middle = Math.ceil((low + high) / 2);
356
+ if (Buffer.byteLength(value.slice(0, middle)) <= maxBytes)
357
+ low = middle;
358
+ else
359
+ high = middle - 1;
360
+ }
361
+ if (low > 0 && isHighSurrogate(value.charCodeAt(low - 1)))
362
+ low -= 1;
363
+ return value.slice(0, low);
364
+ }
365
+ function utf8Suffix(value, maxBytes) {
366
+ if (maxBytes <= 0)
367
+ return "";
368
+ if (Buffer.byteLength(value) <= maxBytes)
369
+ return value;
370
+ let low = 0;
371
+ let high = value.length;
372
+ while (low < high) {
373
+ const middle = Math.floor((low + high) / 2);
374
+ if (Buffer.byteLength(value.slice(middle)) <= maxBytes)
375
+ high = middle;
376
+ else
377
+ low = middle + 1;
378
+ }
379
+ if (low < value.length && isLowSurrogate(value.charCodeAt(low)))
380
+ low += 1;
381
+ return value.slice(low);
382
+ }
383
+ function isHighSurrogate(code) {
384
+ return code >= 0xd800 && code <= 0xdbff;
385
+ }
386
+ function isLowSurrogate(code) {
387
+ return code >= 0xdc00 && code <= 0xdfff;
388
+ }
389
+ //# sourceMappingURL=content-projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-projection.js","sourceRoot":"","sources":["../../../src/trajectories/content-projection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,176 @@
1
+ const CHUNK_TYPES = new Set([
2
+ "block-start",
3
+ "text-delta",
4
+ "reasoning-delta",
5
+ "tool-call-delta",
6
+ "block-end",
7
+ "usage",
8
+ "finish",
9
+ ]);
10
+ /** Validate one DSH model stream while allowing EOF to preserve interrupted evidence. */
11
+ export class IncrementalChunkInvariant {
12
+ openBlocks = new Map();
13
+ usageSeen = false;
14
+ finished = false;
15
+ seen = false;
16
+ accept(value) {
17
+ const chunk = record(value, "assistant/chunk chunk");
18
+ const type = nonEmptyString(chunk.type, "assistant/chunk type");
19
+ if (!CHUNK_TYPES.has(type))
20
+ throw new Error("assistant/chunk has an unsupported type");
21
+ if (this.finished)
22
+ throw new Error("assistant/chunk emitted data after terminal finish");
23
+ this.seen = true;
24
+ switch (type) {
25
+ case "block-start": {
26
+ const index = chunkIndex(chunk, type);
27
+ const blockType = nonEmptyString(chunk.blockType, "block-start blockType");
28
+ if (this.openBlocks.has(index))
29
+ throw new Error(`assistant/chunk repeated block-start index ${index}`);
30
+ this.openBlocks.set(index, { type: blockType });
31
+ break;
32
+ }
33
+ case "text-delta":
34
+ case "reasoning-delta": {
35
+ const expected = type === "text-delta" ? "text" : "reasoning";
36
+ requireOpenBlock(this.openBlocks, chunkIndex(chunk, type), expected);
37
+ if (typeof chunk.text !== "string")
38
+ throw new Error(`${type} text must be a string`);
39
+ break;
40
+ }
41
+ case "tool-call-delta": {
42
+ const index = chunkIndex(chunk, type);
43
+ if (typeof chunk.id !== "string")
44
+ throw new Error("tool-call-delta id must be a string");
45
+ const open = requireOpenBlock(this.openBlocks, index, "tool-call");
46
+ if (open.toolCallId === undefined)
47
+ open.toolCallId = chunk.id;
48
+ else if (open.toolCallId !== chunk.id)
49
+ throw new Error("tool-call-delta id changed within an open block");
50
+ if (chunk.name !== undefined && typeof chunk.name !== "string") {
51
+ throw new Error("tool-call-delta name must be a string");
52
+ }
53
+ if (typeof chunk.argumentsDelta !== "string") {
54
+ throw new Error("tool-call-delta argumentsDelta must be a string");
55
+ }
56
+ break;
57
+ }
58
+ case "block-end": {
59
+ const index = chunkIndex(chunk, type);
60
+ const block = validateContentBlock(chunk.block, "block-end block");
61
+ const open = requireOpenBlock(this.openBlocks, index, block.type);
62
+ if (block.type === "tool-call" && open.toolCallId !== undefined && block.id !== open.toolCallId) {
63
+ throw new Error("block-end tool-call id does not match its deltas");
64
+ }
65
+ this.openBlocks.delete(index);
66
+ break;
67
+ }
68
+ case "usage":
69
+ if (this.usageSeen)
70
+ throw new Error("assistant/chunk emitted usage more than once");
71
+ validateUsage(chunk.usage);
72
+ this.usageSeen = true;
73
+ break;
74
+ case "finish": {
75
+ const reason = validateFinishReason(chunk.reason);
76
+ if (this.openBlocks.size > 0 && reason !== "error" && reason !== "aborted") {
77
+ throw new Error(`assistant/chunk finished with ${this.openBlocks.size} open block(s)`);
78
+ }
79
+ this.finished = true;
80
+ break;
81
+ }
82
+ }
83
+ }
84
+ assertReadyForMessage() {
85
+ if (this.seen && !this.finished)
86
+ throw new Error("assistant/message precedes terminal finish chunk");
87
+ }
88
+ assertReadyForRetry() {
89
+ if (this.seen && !this.finished)
90
+ throw new Error("llm/retry-started precedes terminal finish chunk");
91
+ }
92
+ }
93
+ export function validateContentBlock(value, label) {
94
+ const block = record(value, label);
95
+ const type = nonEmptyString(block.type, `${label}.type`);
96
+ switch (type) {
97
+ case "text":
98
+ case "reasoning":
99
+ if (typeof block.text !== "string")
100
+ throw new Error(`${label}.text must be a string`);
101
+ break;
102
+ case "tool-call":
103
+ if (typeof block.id !== "string" || typeof block.name !== "string" || typeof block.arguments !== "string") {
104
+ throw new Error(`${label} tool-call fields are invalid`);
105
+ }
106
+ break;
107
+ case "tool-result":
108
+ if (typeof block.toolCallId !== "string" || !Array.isArray(block.content)) {
109
+ throw new Error(`${label} tool-result fields are invalid`);
110
+ }
111
+ if (block.isError !== undefined && typeof block.isError !== "boolean") {
112
+ throw new Error(`${label}.isError must be a boolean`);
113
+ }
114
+ block.content.forEach((entry, index) => validateContentBlock(entry, `${label}.content[${index}]`));
115
+ break;
116
+ case "image":
117
+ record(block.attachment, `${label}.attachment`);
118
+ break;
119
+ }
120
+ return block;
121
+ }
122
+ function validateUsage(value) {
123
+ const usage = record(value, "usage chunk usage");
124
+ tokenCount(usage.inputTokens, "usage.inputTokens");
125
+ tokenCount(usage.outputTokens, "usage.outputTokens");
126
+ for (const key of ["cacheReadTokens", "cacheWriteTokens", "reasoningTokens"]) {
127
+ if (usage[key] !== undefined)
128
+ tokenCount(usage[key], `usage.${key}`);
129
+ }
130
+ }
131
+ function validateFinishReason(value) {
132
+ const reason = record(value, "finish chunk reason");
133
+ const kind = nonEmptyString(reason.kind, "finish chunk reason.kind");
134
+ if (kind === "error" || kind === "aborted") {
135
+ const failure = record(reason.failure, `finish chunk ${kind} failure`);
136
+ nonEmptyString(failure.message, `finish chunk ${kind} failure.message`);
137
+ nonEmptyString(failure.code, `finish chunk ${kind} failure.code`);
138
+ if (failure.status !== undefined)
139
+ tokenCount(failure.status, `finish chunk ${kind} failure.status`);
140
+ if (failure.providerRetryAfterMs !== undefined) {
141
+ tokenCount(failure.providerRetryAfterMs, `finish chunk ${kind} failure.providerRetryAfterMs`);
142
+ }
143
+ if (failure.requestId !== undefined && typeof failure.requestId !== "string") {
144
+ throw new Error(`finish chunk ${kind} failure.requestId must be a string`);
145
+ }
146
+ }
147
+ return kind;
148
+ }
149
+ function chunkIndex(chunk, type) {
150
+ if (!Number.isSafeInteger(chunk.index) || chunk.index < 0) {
151
+ throw new Error(`${type} index must be a non-negative safe integer`);
152
+ }
153
+ return chunk.index;
154
+ }
155
+ function requireOpenBlock(open, index, expected) {
156
+ const actual = open.get(index);
157
+ if (actual?.type !== expected) {
158
+ throw new Error(`assistant/chunk at index ${index} does not match its open block`);
159
+ }
160
+ return actual;
161
+ }
162
+ function tokenCount(value, label) {
163
+ if (!Number.isSafeInteger(value) || value < 0)
164
+ throw new Error(`${label} must be a non-negative safe integer`);
165
+ }
166
+ function record(value, label) {
167
+ if (!value || typeof value !== "object" || Array.isArray(value))
168
+ throw new Error(`${label} must be an object`);
169
+ return value;
170
+ }
171
+ function nonEmptyString(value, label) {
172
+ if (typeof value !== "string" || value.length === 0)
173
+ throw new Error(`${label} must be a non-empty string`);
174
+ return value;
175
+ }
176
+ //# sourceMappingURL=dsh-chunk-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsh-chunk-contract.js","sourceRoot":"","sources":["../../../src/trajectories/dsh-chunk-contract.ts"],"names":[],"mappings":"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"}