openpond-sdk 0.9.9 → 0.11.0

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 (253) hide show
  1. package/README.md +18 -17
  2. package/dist/advanced-refiner-evaluations.js +42 -0
  3. package/dist/advanced-refiner-evaluations.js.map +7 -0
  4. package/dist/candidate-evaluations.js +25 -0
  5. package/dist/candidate-evaluations.js.map +7 -0
  6. package/dist/{chunk-BGXWHDYM.js → chunk-2JKV5OJO.js} +95 -59
  7. package/dist/chunk-2JKV5OJO.js.map +7 -0
  8. package/dist/{chunk-4HZORGK3.js → chunk-2NSNBED7.js} +18 -5
  9. package/dist/chunk-2NSNBED7.js.map +7 -0
  10. package/dist/chunk-5RZAPZWI.js +445 -0
  11. package/dist/chunk-5RZAPZWI.js.map +7 -0
  12. package/dist/{chunk-JCPLAIZL.js → chunk-5U25KAJM.js} +106 -76
  13. package/dist/chunk-5U25KAJM.js.map +7 -0
  14. package/dist/chunk-7Q7I6FAT.js +139 -0
  15. package/dist/chunk-7Q7I6FAT.js.map +7 -0
  16. package/dist/chunk-A64VYVXN.js +64 -0
  17. package/dist/chunk-A64VYVXN.js.map +7 -0
  18. package/dist/{chunk-DT7FRNIZ.js → chunk-CSWVE3E6.js} +2 -2
  19. package/dist/chunk-DJWHN7NU.js +394 -0
  20. package/dist/chunk-DJWHN7NU.js.map +7 -0
  21. package/dist/{chunk-KYCQ7LZ4.js → chunk-DSGGM2ME.js} +2 -2
  22. package/dist/chunk-DSGGM2ME.js.map +7 -0
  23. package/dist/chunk-GDJRGRHA.js +144 -0
  24. package/dist/chunk-GDJRGRHA.js.map +7 -0
  25. package/dist/chunk-HOAYWW33.js +587 -0
  26. package/dist/chunk-HOAYWW33.js.map +7 -0
  27. package/dist/{chunk-Y4NGWGTA.js → chunk-I2MBVOVX.js} +265 -264
  28. package/dist/chunk-I2MBVOVX.js.map +7 -0
  29. package/dist/{chunk-6D4JIOOC.js → chunk-IXBSFJCX.js} +5 -5
  30. package/dist/{chunk-WOPM32SE.js → chunk-JA3KFK3U.js} +7 -1
  31. package/dist/chunk-JA3KFK3U.js.map +7 -0
  32. package/dist/chunk-JMQ4HBWP.js +160 -0
  33. package/dist/chunk-JMQ4HBWP.js.map +7 -0
  34. package/dist/chunk-KQWCXW3A.js +294 -0
  35. package/dist/chunk-KQWCXW3A.js.map +7 -0
  36. package/dist/{chunk-3HV3G6DG.js → chunk-NHCGOFQW.js} +3 -3
  37. package/dist/{chunk-XMKEFQ62.js → chunk-PJ2VLNJF.js} +20 -2
  38. package/dist/chunk-PJ2VLNJF.js.map +7 -0
  39. package/dist/{chunk-32H2EJRA.js → chunk-R3M6BIOK.js} +2 -2
  40. package/dist/chunk-SLS3GFPG.js +125 -0
  41. package/dist/chunk-SLS3GFPG.js.map +7 -0
  42. package/dist/chunk-SVU4RZ4K.js +70 -0
  43. package/dist/chunk-SVU4RZ4K.js.map +7 -0
  44. package/dist/chunk-T4APHDES.js +74 -0
  45. package/dist/chunk-T4APHDES.js.map +7 -0
  46. package/dist/chunk-VC5OV5AS.js +174 -0
  47. package/dist/chunk-VC5OV5AS.js.map +7 -0
  48. package/dist/{chunk-YYJ4T4U4.js → chunk-WX22WN33.js} +13 -7
  49. package/dist/chunk-WX22WN33.js.map +7 -0
  50. package/dist/chunk-XEUOJ5WF.js +31 -0
  51. package/dist/chunk-XEUOJ5WF.js.map +7 -0
  52. package/dist/{chunk-LGEF4S5I.js → chunk-XJDWHTH5.js} +390 -362
  53. package/dist/chunk-XJDWHTH5.js.map +7 -0
  54. package/dist/chunk-YCQVVFE5.js +37 -0
  55. package/dist/chunk-YCQVVFE5.js.map +7 -0
  56. package/dist/chunk-ZVJU5CJ5.js +267 -0
  57. package/dist/chunk-ZVJU5CJ5.js.map +7 -0
  58. package/dist/connected-evidence.js +81 -0
  59. package/dist/connected-evidence.js.map +7 -0
  60. package/dist/dataset-workspaces.js +45 -80
  61. package/dist/dataset-workspaces.js.map +4 -4
  62. package/dist/experiment-evaluation-schedules.js +48 -0
  63. package/dist/experiment-evaluation-schedules.js.map +7 -0
  64. package/dist/experiment-improvements.js +52 -0
  65. package/dist/experiment-improvements.js.map +7 -0
  66. package/dist/experiments.js +63 -124
  67. package/dist/experiments.js.map +4 -4
  68. package/dist/human-review.js +13 -0
  69. package/dist/human-review.js.map +7 -0
  70. package/dist/index.js +208 -17
  71. package/dist/index.js.map +2 -2
  72. package/dist/learning.js +1 -1
  73. package/dist/model-starter-attempts.js +2 -2
  74. package/dist/model-starter-catalog.js +9 -4
  75. package/dist/model-starter-catalog.js.map +1 -1
  76. package/dist/model-starters.js +15 -6
  77. package/dist/model-taskset-runs.js +3 -3
  78. package/dist/post-training.js +47 -0
  79. package/dist/post-training.js.map +7 -0
  80. package/dist/taskset-drafts.js +13 -6
  81. package/dist/taskset-drafts.js.map +2 -2
  82. package/dist/taskset-packages.js +31 -559
  83. package/dist/taskset-packages.js.map +4 -4
  84. package/dist/training-bundle.js +59 -18
  85. package/dist/training-bundle.js.map +2 -2
  86. package/dist/training-projects.js +3 -1
  87. package/dist/training-projects.js.map +2 -2
  88. package/dist/training.js +7 -2
  89. package/dist/types/packages/sdk/src/advanced-refiner-evaluations.d.ts +2673 -0
  90. package/dist/types/packages/sdk/src/advanced-refiner-evaluations.d.ts.map +1 -0
  91. package/dist/types/packages/sdk/src/candidate-evaluation-client.d.ts +1079 -0
  92. package/dist/types/packages/sdk/src/candidate-evaluation-client.d.ts.map +1 -0
  93. package/dist/types/packages/sdk/src/candidate-evaluations.d.ts +845 -0
  94. package/dist/types/packages/sdk/src/candidate-evaluations.d.ts.map +1 -0
  95. package/dist/types/packages/sdk/src/claude-code-runtime.d.ts +51 -0
  96. package/dist/types/packages/sdk/src/claude-code-runtime.d.ts.map +1 -0
  97. package/dist/types/packages/sdk/src/connected-dataset-publication.d.ts +15 -0
  98. package/dist/types/packages/sdk/src/connected-dataset-publication.d.ts.map +1 -0
  99. package/dist/types/packages/sdk/src/connected-dataset-source.d.ts +48 -0
  100. package/dist/types/packages/sdk/src/connected-dataset-source.d.ts.map +1 -0
  101. package/dist/types/packages/sdk/src/connected-evidence-client.d.ts +2460 -0
  102. package/dist/types/packages/sdk/src/connected-evidence-client.d.ts.map +1 -0
  103. package/dist/types/packages/sdk/src/connected-evidence-contracts.d.ts +215 -0
  104. package/dist/types/packages/sdk/src/connected-evidence-contracts.d.ts.map +1 -0
  105. package/dist/types/packages/sdk/src/connected-evidence-http.d.ts +6 -0
  106. package/dist/types/packages/sdk/src/connected-evidence-http.d.ts.map +1 -0
  107. package/dist/types/packages/sdk/src/connected-evidence.d.ts +6 -0
  108. package/dist/types/packages/sdk/src/connected-evidence.d.ts.map +1 -0
  109. package/dist/types/packages/sdk/src/connected-recorded-execution.d.ts +690 -0
  110. package/dist/types/packages/sdk/src/connected-recorded-execution.d.ts.map +1 -0
  111. package/dist/types/packages/sdk/src/dataset-population.d.ts +1 -0
  112. package/dist/types/packages/sdk/src/dataset-population.d.ts.map +1 -1
  113. package/dist/types/packages/sdk/src/dataset-workspace-client.d.ts +771 -120
  114. package/dist/types/packages/sdk/src/dataset-workspace-client.d.ts.map +1 -1
  115. package/dist/types/packages/sdk/src/dataset-workspace-contracts.d.ts +278 -38
  116. package/dist/types/packages/sdk/src/dataset-workspace-contracts.d.ts.map +1 -1
  117. package/dist/types/packages/sdk/src/dataset-workspace-operations.d.ts +280 -40
  118. package/dist/types/packages/sdk/src/dataset-workspace-operations.d.ts.map +1 -1
  119. package/dist/types/packages/sdk/src/evaluation-coordination-http.d.ts +17 -0
  120. package/dist/types/packages/sdk/src/evaluation-coordination-http.d.ts.map +1 -0
  121. package/dist/types/packages/sdk/src/experiment-client.d.ts +4353 -490
  122. package/dist/types/packages/sdk/src/experiment-client.d.ts.map +1 -1
  123. package/dist/types/packages/sdk/src/experiment-contracts.d.ts +1067 -2
  124. package/dist/types/packages/sdk/src/experiment-contracts.d.ts.map +1 -1
  125. package/dist/types/packages/sdk/src/experiment-evaluation-schedules.d.ts +2780 -0
  126. package/dist/types/packages/sdk/src/experiment-evaluation-schedules.d.ts.map +1 -0
  127. package/dist/types/packages/sdk/src/experiment-execution-selection.d.ts +58 -0
  128. package/dist/types/packages/sdk/src/experiment-execution-selection.d.ts.map +1 -0
  129. package/dist/types/packages/sdk/src/experiment-grading-contracts.d.ts +8 -0
  130. package/dist/types/packages/sdk/src/experiment-grading-contracts.d.ts.map +1 -1
  131. package/dist/types/packages/sdk/src/experiment-harness-catalog.d.ts +24 -0
  132. package/dist/types/packages/sdk/src/experiment-harness-catalog.d.ts.map +1 -0
  133. package/dist/types/packages/sdk/src/experiment-improvement-client.d.ts +5724 -0
  134. package/dist/types/packages/sdk/src/experiment-improvement-client.d.ts.map +1 -0
  135. package/dist/types/packages/sdk/src/experiment-improvement-contracts.d.ts +13024 -0
  136. package/dist/types/packages/sdk/src/experiment-improvement-contracts.d.ts.map +1 -0
  137. package/dist/types/packages/sdk/src/experiment-improvement-hosted-adoption.d.ts +1361 -0
  138. package/dist/types/packages/sdk/src/experiment-improvement-hosted-adoption.d.ts.map +1 -0
  139. package/dist/types/packages/sdk/src/experiment-improvements.d.ts +4 -0
  140. package/dist/types/packages/sdk/src/experiment-improvements.d.ts.map +1 -0
  141. package/dist/types/packages/sdk/src/experiment-run-contracts.d.ts +383 -0
  142. package/dist/types/packages/sdk/src/experiment-run-contracts.d.ts.map +1 -0
  143. package/dist/types/packages/sdk/src/experiment-run-details.d.ts +2111 -0
  144. package/dist/types/packages/sdk/src/experiment-run-details.d.ts.map +1 -0
  145. package/dist/types/packages/sdk/src/experiment-scoring-contracts.d.ts +7 -2
  146. package/dist/types/packages/sdk/src/experiment-scoring-contracts.d.ts.map +1 -1
  147. package/dist/types/packages/sdk/src/experiments.d.ts +7 -1
  148. package/dist/types/packages/sdk/src/experiments.d.ts.map +1 -1
  149. package/dist/types/packages/sdk/src/grader-inspection.d.ts +307 -5
  150. package/dist/types/packages/sdk/src/grader-inspection.d.ts.map +1 -1
  151. package/dist/types/packages/sdk/src/harness-experiment-policy.d.ts +238 -0
  152. package/dist/types/packages/sdk/src/harness-experiment-policy.d.ts.map +1 -1
  153. package/dist/types/packages/sdk/src/human-review-client.d.ts +1267 -0
  154. package/dist/types/packages/sdk/src/human-review-client.d.ts.map +1 -0
  155. package/dist/types/packages/sdk/src/human-review.d.ts +3 -0
  156. package/dist/types/packages/sdk/src/human-review.d.ts.map +1 -0
  157. package/dist/types/packages/sdk/src/index.d.ts +10 -0
  158. package/dist/types/packages/sdk/src/index.d.ts.map +1 -1
  159. package/dist/types/packages/sdk/src/managed-training-preparation.d.ts +181 -0
  160. package/dist/types/packages/sdk/src/managed-training-preparation.d.ts.map +1 -1
  161. package/dist/types/packages/sdk/src/model-batch-review-contracts.d.ts +20 -4
  162. package/dist/types/packages/sdk/src/model-batch-review-contracts.d.ts.map +1 -1
  163. package/dist/types/packages/sdk/src/model-batch-review-preparation.d.ts +79 -5
  164. package/dist/types/packages/sdk/src/model-batch-review-preparation.d.ts.map +1 -1
  165. package/dist/types/packages/sdk/src/model-batch-review.d.ts +15 -13
  166. package/dist/types/packages/sdk/src/model-batch-review.d.ts.map +1 -1
  167. package/dist/types/packages/sdk/src/model-learning-policy.d.ts +359 -1
  168. package/dist/types/packages/sdk/src/model-learning-policy.d.ts.map +1 -1
  169. package/dist/types/packages/sdk/src/model-starter-attempts.d.ts +444 -19
  170. package/dist/types/packages/sdk/src/model-starter-attempts.d.ts.map +1 -1
  171. package/dist/types/packages/sdk/src/model-starter-catalog.d.ts +234 -12
  172. package/dist/types/packages/sdk/src/model-starter-catalog.d.ts.map +1 -1
  173. package/dist/types/packages/sdk/src/model-starter-execution.d.ts +79 -1
  174. package/dist/types/packages/sdk/src/model-starter-execution.d.ts.map +1 -1
  175. package/dist/types/packages/sdk/src/model-starters.d.ts +467 -13
  176. package/dist/types/packages/sdk/src/model-starters.d.ts.map +1 -1
  177. package/dist/types/packages/sdk/src/model-taskset-derivation.d.ts +312 -4
  178. package/dist/types/packages/sdk/src/model-taskset-derivation.d.ts.map +1 -1
  179. package/dist/types/packages/sdk/src/model-taskset-resources.d.ts +78 -1
  180. package/dist/types/packages/sdk/src/model-taskset-resources.d.ts.map +1 -1
  181. package/dist/types/packages/sdk/src/model-taskset-runs-contracts.d.ts +1326 -4
  182. package/dist/types/packages/sdk/src/model-taskset-runs-contracts.d.ts.map +1 -1
  183. package/dist/types/packages/sdk/src/model-taskset-runs.d.ts +1329 -5
  184. package/dist/types/packages/sdk/src/model-taskset-runs.d.ts.map +1 -1
  185. package/dist/types/packages/sdk/src/post-training.d.ts +3518 -0
  186. package/dist/types/packages/sdk/src/post-training.d.ts.map +1 -0
  187. package/dist/types/packages/sdk/src/profile-evaluation-discovery.d.ts +1127 -0
  188. package/dist/types/packages/sdk/src/profile-evaluation-discovery.d.ts.map +1 -0
  189. package/dist/types/packages/sdk/src/profile-external-dataset-package.d.ts +1369 -0
  190. package/dist/types/packages/sdk/src/profile-external-dataset-package.d.ts.map +1 -0
  191. package/dist/types/packages/sdk/src/taskset-authored-contracts.d.ts +142 -22
  192. package/dist/types/packages/sdk/src/taskset-authored-contracts.d.ts.map +1 -1
  193. package/dist/types/packages/sdk/src/taskset-authored-files.d.ts +111 -18
  194. package/dist/types/packages/sdk/src/taskset-authored-files.d.ts.map +1 -1
  195. package/dist/types/packages/sdk/src/taskset-draft-api-contracts.d.ts +278 -38
  196. package/dist/types/packages/sdk/src/taskset-draft-api-contracts.d.ts.map +1 -1
  197. package/dist/types/packages/sdk/src/taskset-draft-client.d.ts +661 -103
  198. package/dist/types/packages/sdk/src/taskset-draft-client.d.ts.map +1 -1
  199. package/dist/types/packages/sdk/src/taskset-draft-core.d.ts +217 -20
  200. package/dist/types/packages/sdk/src/taskset-draft-core.d.ts.map +1 -1
  201. package/dist/types/packages/sdk/src/taskset-draft-dataset-artifacts.d.ts +12 -12
  202. package/dist/types/packages/sdk/src/taskset-draft-dataset-sources.d.ts +17 -17
  203. package/dist/types/packages/sdk/src/taskset-draft-document.d.ts +140 -20
  204. package/dist/types/packages/sdk/src/taskset-draft-document.d.ts.map +1 -1
  205. package/dist/types/packages/sdk/src/taskset-draft-package-compiler.d.ts +638 -42
  206. package/dist/types/packages/sdk/src/taskset-draft-package-compiler.d.ts.map +1 -1
  207. package/dist/types/packages/sdk/src/taskset-draft-source.d.ts +249 -36
  208. package/dist/types/packages/sdk/src/taskset-draft-source.d.ts.map +1 -1
  209. package/dist/types/packages/sdk/src/taskset-draft-workspace.d.ts +278 -38
  210. package/dist/types/packages/sdk/src/taskset-draft-workspace.d.ts.map +1 -1
  211. package/dist/types/packages/sdk/src/taskset-drafts.d.ts +1 -0
  212. package/dist/types/packages/sdk/src/taskset-drafts.d.ts.map +1 -1
  213. package/dist/types/packages/sdk/src/taskset-package-client.d.ts +2805 -41
  214. package/dist/types/packages/sdk/src/taskset-package-client.d.ts.map +1 -1
  215. package/dist/types/packages/sdk/src/taskset-package-contracts.d.ts +660 -12
  216. package/dist/types/packages/sdk/src/taskset-package-contracts.d.ts.map +1 -1
  217. package/dist/types/packages/sdk/src/taskset-package-grader-projection.d.ts +77 -3
  218. package/dist/types/packages/sdk/src/taskset-package-grader-projection.d.ts.map +1 -1
  219. package/dist/types/packages/sdk/src/taskset-package-learning.d.ts +29 -11
  220. package/dist/types/packages/sdk/src/taskset-package-learning.d.ts.map +1 -1
  221. package/dist/types/packages/sdk/src/taskset-package-projection.d.ts +430 -39
  222. package/dist/types/packages/sdk/src/taskset-package-projection.d.ts.map +1 -1
  223. package/dist/types/packages/sdk/src/training-acceptance.d.ts +10 -10
  224. package/dist/types/packages/sdk/src/training-candidate-decisions.d.ts +2 -2
  225. package/dist/types/packages/sdk/src/training-evaluation-results.d.ts +1 -1
  226. package/dist/types/packages/sdk/src/training-learning-batch.d.ts +376 -42
  227. package/dist/types/packages/sdk/src/training-learning-batch.d.ts.map +1 -1
  228. package/dist/types/packages/sdk/src/training-preparations.d.ts +3930 -0
  229. package/dist/types/packages/sdk/src/training-preparations.d.ts.map +1 -1
  230. package/dist/types/packages/sdk/src/training-project-client.d.ts +828 -8
  231. package/dist/types/packages/sdk/src/training-project-client.d.ts.map +1 -1
  232. package/dist/types/packages/sdk/src/training-project-contracts.d.ts +1226 -11
  233. package/dist/types/packages/sdk/src/training-project-contracts.d.ts.map +1 -1
  234. package/dist/types/packages/sdk/src/training.d.ts +2655 -24
  235. package/dist/types/packages/sdk/src/training.d.ts.map +1 -1
  236. package/package.json +30 -2
  237. package/dist/chunk-4HZORGK3.js.map +0 -7
  238. package/dist/chunk-4JRSH2TT.js +0 -256
  239. package/dist/chunk-4JRSH2TT.js.map +0 -7
  240. package/dist/chunk-BGXWHDYM.js.map +0 -7
  241. package/dist/chunk-JCPLAIZL.js.map +0 -7
  242. package/dist/chunk-KYCQ7LZ4.js.map +0 -7
  243. package/dist/chunk-LGEF4S5I.js.map +0 -7
  244. package/dist/chunk-WOPM32SE.js.map +0 -7
  245. package/dist/chunk-XMKEFQ62.js.map +0 -7
  246. package/dist/chunk-Y4NGWGTA.js.map +0 -7
  247. package/dist/chunk-YYJ4T4U4.js.map +0 -7
  248. package/dist/types/packages/sdk/src/experiment-history.d.ts +0 -266
  249. package/dist/types/packages/sdk/src/experiment-history.d.ts.map +0 -1
  250. /package/dist/{chunk-DT7FRNIZ.js.map → chunk-CSWVE3E6.js.map} +0 -0
  251. /package/dist/{chunk-6D4JIOOC.js.map → chunk-IXBSFJCX.js.map} +0 -0
  252. /package/dist/{chunk-3HV3G6DG.js.map → chunk-NHCGOFQW.js.map} +0 -0
  253. /package/dist/{chunk-32H2EJRA.js.map → chunk-R3M6BIOK.js.map} +0 -0
@@ -0,0 +1,294 @@
1
+ import {
2
+ RunExperimentSchema
3
+ } from "./chunk-XEUOJ5WF.js";
4
+ import {
5
+ HostedModelProjectSummarySchema,
6
+ OpenPondProtocolError,
7
+ canonicalSha256
8
+ } from "./chunk-TCHAWJMB.js";
9
+ import {
10
+ contentHash
11
+ } from "./chunk-QUOW6URQ.js";
12
+
13
+ // src/post-training.ts
14
+ import { z } from "zod";
15
+ import {
16
+ LearningSourceSchema,
17
+ TaskBatchSchema,
18
+ TaskDefinitionSchema,
19
+ LearningPolicySchema,
20
+ LearningPolicyInspectionResultSchema,
21
+ LearningIterationSchema
22
+ } from "@openpond/evals/learning";
23
+ import { AcceptancePlanSchema } from "@openpond/evals/learning";
24
+ import { TrainingHandoffOriginSchema } from "@openpond/evals/learning";
25
+ import { TrainingHandoffOriginSchema as TrainingHandoffOriginSchema2 } from "@openpond/evals/learning";
26
+ var Id = z.string().trim().min(1).max(200);
27
+ var Hash = z.string().regex(/^[a-f0-9]{64}$/);
28
+ var Ref = z.object({ id: Id, contentHash: Hash }).strict();
29
+ var TrainingHandoffContextSchema = z.object({
30
+ available: z.boolean(),
31
+ reason: z.string().max(1e3).nullable(),
32
+ origin: TrainingHandoffOriginSchema.nullable()
33
+ }).strict();
34
+ var PostTrainingAttachmentSchema = z.object({
35
+ schemaVersion: z.literal("openpond.postTrainingAttachment.v1"),
36
+ binding: z.object({
37
+ kind: z.enum(["preparation", "policy"]),
38
+ id: Id,
39
+ revision: z.number().int().positive(),
40
+ contentHash: Hash
41
+ }).strict(),
42
+ projectId: Id.nullable(),
43
+ automatic: z.boolean(),
44
+ maximumSpendUsd: z.number().finite().positive().max(1e4),
45
+ experiments: z.array(z.object({ id: Id, configuration: RunExperimentSchema }).strict()).min(1).max(20),
46
+ acceptancePlan: AcceptancePlanSchema.nullable()
47
+ }).strict().superRefine((value, ctx) => {
48
+ if (new Set(value.experiments.map((item) => item.id)).size !== value.experiments.length)
49
+ ctx.addIssue({ code: "custom", message: "Attach each evaluation once." });
50
+ if (value.experiments.reduce((sum, item) => sum + item.configuration.maximumCostUsd, 0) > value.maximumSpendUsd + 1e-9)
51
+ ctx.addIssue({
52
+ code: "custom",
53
+ message: "Attached evaluation budgets exceed the total approved budget."
54
+ });
55
+ if (value.experiments.some(
56
+ (item) => (item.configuration.request.project?.id ?? null) !== value.projectId
57
+ ))
58
+ ctx.addIssue({
59
+ code: "custom",
60
+ message: "Attached experiments must use the training Project."
61
+ });
62
+ if (value.acceptancePlan) {
63
+ const checked = new Set(value.acceptancePlan.checks.map((c) => c.id));
64
+ if (value.acceptancePlan.checks.some((c) => !value.experiments.some((m) => m.id === c.id)))
65
+ ctx.addIssue({
66
+ code: "custom",
67
+ message: "Select the frozen Experiment for each acceptance check."
68
+ });
69
+ const committed = value.acceptancePlan.maximumSpendUsd + value.experiments.filter((m) => !checked.has(m.id)).reduce((sum, m) => sum + m.configuration.maximumCostUsd, 0);
70
+ if (committed > value.maximumSpendUsd + 1e-9)
71
+ ctx.addIssue({
72
+ code: "custom",
73
+ message: "Paired acceptance and diagnostic ceilings exceed the approved evaluation budget."
74
+ });
75
+ }
76
+ });
77
+ function postTrainingRecipe(configuration) {
78
+ const {
79
+ modelId: _model,
80
+ candidate: _candidate,
81
+ ...settings
82
+ } = configuration.request.policy.kind === "fixture" ? { modelId: null, candidate: null, ...configuration.request.policy } : configuration.request.policy;
83
+ void _model;
84
+ void _candidate;
85
+ if ("modelConfigurationHash" in settings)
86
+ delete settings.modelConfigurationHash;
87
+ return {
88
+ dataset: {
89
+ id: configuration.request.taskset.id,
90
+ contentHash: configuration.request.taskset.contentHash
91
+ },
92
+ populationHash: contentHash(
93
+ configuration.request.population.map((m) => ({
94
+ caseId: m.taskId,
95
+ seed: m.seed,
96
+ fixtureId: m.fixtureId
97
+ }))
98
+ ),
99
+ executionHash: contentHash({ settings, graders: configuration.graders ?? null })
100
+ };
101
+ }
102
+ var PostTrainingQualificationSchema = z.object({
103
+ baseline: Ref,
104
+ checks: z.array(
105
+ z.object({
106
+ id: Id,
107
+ sourceRunId: Id,
108
+ sourceManifestHash: Hash,
109
+ targetConfigurationHash: Hash,
110
+ executionHash: Hash,
111
+ populationHash: Hash,
112
+ evaluator: Ref,
113
+ feedbackKey: Id,
114
+ output: z.enum(["boolean", "score"]),
115
+ unit: z.string().min(1).max(80)
116
+ }).strict()
117
+ ).min(1).max(100)
118
+ }).strict();
119
+ var PostTrainingStateSchema = z.enum([
120
+ "waiting_for_training",
121
+ "ready",
122
+ "preparing",
123
+ "queued",
124
+ "running",
125
+ "cleaning",
126
+ "completed",
127
+ "failed",
128
+ "blocked",
129
+ "cancelled",
130
+ "budget_exhausted"
131
+ ]);
132
+ var PostTrainingSummarySchema = z.object({
133
+ schemaVersion: z.literal("openpond.postTrainingSummary.v1"),
134
+ id: Id,
135
+ teamId: Id,
136
+ jobId: Id,
137
+ revision: z.number().int().positive(),
138
+ planHash: Hash,
139
+ automatic: z.boolean(),
140
+ candidate: Ref.nullable(),
141
+ state: PostTrainingStateSchema,
142
+ total: z.number().int().positive(),
143
+ completed: z.number().int().nonnegative(),
144
+ failed: z.number().int().nonnegative(),
145
+ requiredOutcome: z.enum(["none", "pending", "passed", "failed", "blocked"]),
146
+ reason: z.string().max(500).nullable(),
147
+ groupId: Id.nullable(),
148
+ experimentIds: z.array(Id).max(20),
149
+ updatedAt: z.iso.datetime()
150
+ }).strict().superRefine((value, ctx) => {
151
+ if (value.completed + value.failed > value.total)
152
+ ctx.addIssue({ code: "custom", message: "Evaluation totals are inconsistent." });
153
+ if (["preparing", "queued", "running", "cleaning", "completed"].includes(value.state) && !value.candidate)
154
+ ctx.addIssue({
155
+ code: "custom",
156
+ message: "Evaluation execution requires the exact trained candidate."
157
+ });
158
+ });
159
+ var PostTrainingControlSchema = z.object({ operationId: Id, expectedRevision: z.number().int().positive(), planHash: Hash }).strict();
160
+ var AttachPostTrainingSchema = z.object({ operationId: Id, attachment: PostTrainingAttachmentSchema }).strict();
161
+ var PostTrainingPlanSchema = z.object({
162
+ id: Id,
163
+ teamId: Id,
164
+ ownerUserId: Id,
165
+ attachment: PostTrainingAttachmentSchema,
166
+ qualification: PostTrainingQualificationSchema.nullable(),
167
+ contentHash: Hash,
168
+ createdAt: z.iso.datetime()
169
+ }).strict();
170
+ function verifyPostTrainingPlan(raw) {
171
+ const plan = PostTrainingPlanSchema.parse(raw);
172
+ if (plan.contentHash !== contentHash({ attachment: plan.attachment, qualification: plan.qualification }))
173
+ throw new Error("The retained evaluation attachment or qualification changed.");
174
+ return plan;
175
+ }
176
+ function postTrainingActive(summary) {
177
+ return Boolean(summary && ["preparing", "queued", "running", "cleaning"].includes(summary.state));
178
+ }
179
+ function createPostTrainingClient(input) {
180
+ const { request } = input;
181
+ const path = (jobId) => `/v1/training/jobs/${encodeURIComponent(Id.parse(jobId))}/post-training`;
182
+ async function read(raw, teamId, jobId) {
183
+ if (raw === null) return null;
184
+ const value = PostTrainingSummarySchema.parse(raw);
185
+ if (value.teamId !== teamId || value.jobId !== jobId)
186
+ throw new OpenPondProtocolError(
187
+ "post_training_scope_mismatch",
188
+ "The evaluation summary belongs to another run or workspace."
189
+ );
190
+ return value;
191
+ }
192
+ return {
193
+ async attach(teamId, raw) {
194
+ const body = AttachPostTrainingSchema.parse(raw);
195
+ const value = verifyPostTrainingPlan(
196
+ await request("/v1/training/post-training-plans", {
197
+ method: "POST",
198
+ body: JSON.stringify(body)
199
+ })
200
+ );
201
+ if (value.teamId !== teamId || await canonicalSha256(value.attachment) !== await canonicalSha256(body.attachment))
202
+ throw new OpenPondProtocolError(
203
+ "post_training_plan_mismatch",
204
+ "The retained attachment differs from the reviewed plan."
205
+ );
206
+ return value;
207
+ },
208
+ async get(teamId, jobId) {
209
+ return read(await request(path(jobId)), teamId, jobId);
210
+ },
211
+ async control(teamId, jobId, action, raw) {
212
+ const body = PostTrainingControlSchema.parse(raw);
213
+ const value = await read(
214
+ await request(`${path(jobId)}/${action}`, { method: "POST", body: JSON.stringify(body) }),
215
+ teamId,
216
+ jobId
217
+ );
218
+ if (!value || value.planHash !== body.planHash)
219
+ throw new OpenPondProtocolError(
220
+ "post_training_control_mismatch",
221
+ "Evaluation control did not retain the approved plan."
222
+ );
223
+ return value;
224
+ }
225
+ };
226
+ }
227
+ var HostedTrainingSetupCatalogSchema = z.object({
228
+ teamId: Id,
229
+ actorId: Id,
230
+ projectId: Id.nullable(),
231
+ configuration: HostedModelProjectSummarySchema,
232
+ batches: z.array(TaskBatchSchema).max(1e4),
233
+ sources: z.array(LearningSourceSchema).max(1e4),
234
+ definitions: z.array(TaskDefinitionSchema).max(1e4),
235
+ experiments: z.array(
236
+ z.object({
237
+ id: Id,
238
+ name: z.string().max(500),
239
+ configuration: RunExperimentSchema,
240
+ graders: z.array(z.object({ feedbackKey: Id, name: z.string().max(500), ref: Ref }).strict()).max(100)
241
+ }).strict()
242
+ ).max(1e4)
243
+ }).strict();
244
+ var HostedTrainingSetupActionSchema = z.enum([
245
+ "prepare",
246
+ "start",
247
+ "cancel",
248
+ "publish",
249
+ "attach"
250
+ ]);
251
+ var HostedTrainingPolicyDetailSchema = z.object({
252
+ teamId: Id,
253
+ actorId: Id,
254
+ configuration: HostedModelProjectSummarySchema,
255
+ policy: LearningPolicySchema,
256
+ inspection: LearningPolicyInspectionResultSchema,
257
+ iterations: z.array(
258
+ z.object({
259
+ iteration: LearningIterationSchema,
260
+ evals: PostTrainingSummarySchema.nullable()
261
+ }).strict()
262
+ ).max(100),
263
+ nextCursor: Id.nullable()
264
+ }).strict();
265
+ var HostedTrainingPolicyControlSchema = z.object({
266
+ id: Id,
267
+ expectedRevision: z.number().int().positive(),
268
+ policyHash: Hash,
269
+ operationId: Id,
270
+ action: z.enum(["pause", "resume", "reserve", "cancel-iteration", "retry-iteration"]),
271
+ iterationId: Id.optional(),
272
+ iterationRevision: z.number().int().positive().optional()
273
+ }).strict();
274
+
275
+ export {
276
+ TrainingHandoffContextSchema,
277
+ PostTrainingAttachmentSchema,
278
+ postTrainingRecipe,
279
+ PostTrainingQualificationSchema,
280
+ PostTrainingStateSchema,
281
+ PostTrainingSummarySchema,
282
+ PostTrainingControlSchema,
283
+ AttachPostTrainingSchema,
284
+ PostTrainingPlanSchema,
285
+ verifyPostTrainingPlan,
286
+ postTrainingActive,
287
+ createPostTrainingClient,
288
+ HostedTrainingSetupCatalogSchema,
289
+ HostedTrainingSetupActionSchema,
290
+ HostedTrainingPolicyDetailSchema,
291
+ HostedTrainingPolicyControlSchema,
292
+ TrainingHandoffOriginSchema2 as TrainingHandoffOriginSchema
293
+ };
294
+ //# sourceMappingURL=chunk-KQWCXW3A.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/post-training.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\nimport { contentHash } from \"@openpond/harness\";\nimport {\n LearningSourceSchema,\n TaskBatchSchema,\n TaskDefinitionSchema,\n LearningPolicySchema,\n LearningPolicyInspectionResultSchema,\n LearningIterationSchema,\n} from \"@openpond/evals/learning\";\nimport { HostedModelProjectSummarySchema } from \"./model-projects.js\";\nimport { AcceptancePlanSchema } from \"@openpond/evals/learning\";\nimport { TrainingHandoffOriginSchema } from \"@openpond/evals/learning\";\nexport { TrainingHandoffOriginSchema, type TrainingHandoffOrigin } from \"@openpond/evals/learning\";\nimport { RunExperimentSchema } from \"./experiment-run-contracts.js\";\nimport { canonicalSha256, OpenPondProtocolError } from \"./protocol.js\";\n\nconst Id = z.string().trim().min(1).max(200);\nconst Hash = z.string().regex(/^[a-f0-9]{64}$/);\nconst Ref = z.object({ id: Id, contentHash: Hash }).strict();\nexport const TrainingHandoffContextSchema = z\n .object({\n available: z.boolean(),\n reason: z.string().max(1000).nullable(),\n origin: TrainingHandoffOriginSchema.nullable(),\n })\n .strict();\nexport type TrainingHandoffContext = z.infer<typeof TrainingHandoffContextSchema>;\nexport const PostTrainingAttachmentSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.postTrainingAttachment.v1\"),\n binding: z\n .object({\n kind: z.enum([\"preparation\", \"policy\"]),\n id: Id,\n revision: z.number().int().positive(),\n contentHash: Hash,\n })\n .strict(),\n projectId: Id.nullable(),\n automatic: z.boolean(),\n maximumSpendUsd: z.number().finite().positive().max(10_000),\n experiments: z\n .array(z.object({ id: Id, configuration: RunExperimentSchema }).strict())\n .min(1)\n .max(20),\n acceptancePlan: AcceptancePlanSchema.nullable(),\n })\n .strict()\n .superRefine((value, ctx) => {\n if (new Set(value.experiments.map((item) => item.id)).size !== value.experiments.length)\n ctx.addIssue({ code: \"custom\", message: \"Attach each evaluation once.\" });\n if (\n value.experiments.reduce((sum, item) => sum + item.configuration.maximumCostUsd, 0) >\n value.maximumSpendUsd + 1e-9\n )\n ctx.addIssue({\n code: \"custom\",\n message: \"Attached evaluation budgets exceed the total approved budget.\",\n });\n if (\n value.experiments.some(\n (item) => (item.configuration.request.project?.id ?? null) !== value.projectId,\n )\n )\n ctx.addIssue({\n code: \"custom\",\n message: \"Attached experiments must use the training Project.\",\n });\n if (value.acceptancePlan) {\n const checked = new Set(value.acceptancePlan.checks.map((c) => c.id));\n if (value.acceptancePlan.checks.some((c) => !value.experiments.some((m) => m.id === c.id)))\n ctx.addIssue({\n code: \"custom\",\n message: \"Select the frozen Experiment for each acceptance check.\",\n });\n const committed =\n value.acceptancePlan.maximumSpendUsd +\n value.experiments\n .filter((m) => !checked.has(m.id))\n .reduce((sum, m) => sum + m.configuration.maximumCostUsd, 0);\n if (committed > value.maximumSpendUsd + 1e-9)\n ctx.addIssue({\n code: \"custom\",\n message:\n \"Paired acceptance and diagnostic ceilings exceed the approved evaluation budget.\",\n });\n }\n });\nexport type PostTrainingAttachment = z.infer<typeof PostTrainingAttachmentSchema>;\n/** Target-independent recipe pins keep the paired baseline/candidate check on\n * the same released data, case order, settings and graders. */\nexport function postTrainingRecipe(\n configuration: PostTrainingAttachment[\"experiments\"][number][\"configuration\"],\n) {\n const {\n modelId: _model,\n candidate: _candidate,\n ...settings\n } = configuration.request.policy.kind === \"fixture\"\n ? { modelId: null, candidate: null, ...configuration.request.policy }\n : configuration.request.policy;\n void _model;\n void _candidate;\n if (\"modelConfigurationHash\" in settings)\n delete (settings as { modelConfigurationHash?: string }).modelConfigurationHash;\n return {\n dataset: {\n id: configuration.request.taskset.id,\n contentHash: configuration.request.taskset.contentHash,\n },\n populationHash: contentHash(\n configuration.request.population.map((m) => ({\n caseId: m.taskId,\n seed: m.seed,\n fixtureId: m.fixtureId,\n })),\n ),\n executionHash: contentHash({ settings, graders: configuration.graders ?? null }),\n };\n}\nexport const PostTrainingQualificationSchema = z\n .object({\n baseline: Ref,\n checks: z\n .array(\n z\n .object({\n id: Id,\n sourceRunId: Id,\n sourceManifestHash: Hash,\n targetConfigurationHash: Hash,\n executionHash: Hash,\n populationHash: Hash,\n evaluator: Ref,\n feedbackKey: Id,\n output: z.enum([\"boolean\", \"score\"]),\n unit: z.string().min(1).max(80),\n })\n .strict(),\n )\n .min(1)\n .max(100),\n })\n .strict();\nexport const PostTrainingStateSchema = z.enum([\n \"waiting_for_training\",\n \"ready\",\n \"preparing\",\n \"queued\",\n \"running\",\n \"cleaning\",\n \"completed\",\n \"failed\",\n \"blocked\",\n \"cancelled\",\n \"budget_exhausted\",\n]);\nexport const PostTrainingSummarySchema = z\n .object({\n schemaVersion: z.literal(\"openpond.postTrainingSummary.v1\"),\n id: Id,\n teamId: Id,\n jobId: Id,\n revision: z.number().int().positive(),\n planHash: Hash,\n automatic: z.boolean(),\n candidate: Ref.nullable(),\n state: PostTrainingStateSchema,\n total: z.number().int().positive(),\n completed: z.number().int().nonnegative(),\n failed: z.number().int().nonnegative(),\n requiredOutcome: z.enum([\"none\", \"pending\", \"passed\", \"failed\", \"blocked\"]),\n reason: z.string().max(500).nullable(),\n groupId: Id.nullable(),\n experimentIds: z.array(Id).max(20),\n updatedAt: z.iso.datetime(),\n })\n .strict()\n .superRefine((value, ctx) => {\n if (value.completed + value.failed > value.total)\n ctx.addIssue({ code: \"custom\", message: \"Evaluation totals are inconsistent.\" });\n if (\n [\"preparing\", \"queued\", \"running\", \"cleaning\", \"completed\"].includes(value.state) &&\n !value.candidate\n )\n ctx.addIssue({\n code: \"custom\",\n message: \"Evaluation execution requires the exact trained candidate.\",\n });\n });\nexport type PostTrainingSummary = z.infer<typeof PostTrainingSummarySchema>;\nexport const PostTrainingControlSchema = z\n .object({ operationId: Id, expectedRevision: z.number().int().positive(), planHash: Hash })\n .strict();\nexport const AttachPostTrainingSchema = z\n .object({ operationId: Id, attachment: PostTrainingAttachmentSchema })\n .strict();\nexport const PostTrainingPlanSchema = z\n .object({\n id: Id,\n teamId: Id,\n ownerUserId: Id,\n attachment: PostTrainingAttachmentSchema,\n qualification: PostTrainingQualificationSchema.nullable(),\n contentHash: Hash,\n createdAt: z.iso.datetime(),\n })\n .strict();\nexport type PostTrainingPlan = z.infer<typeof PostTrainingPlanSchema>;\nexport function verifyPostTrainingPlan(raw: unknown): PostTrainingPlan {\n const plan = PostTrainingPlanSchema.parse(raw);\n if (\n plan.contentHash !==\n contentHash({ attachment: plan.attachment, qualification: plan.qualification })\n )\n throw new Error(\"The retained evaluation attachment or qualification changed.\");\n return plan;\n}\nexport function postTrainingActive(summary: PostTrainingSummary | null | undefined) {\n return Boolean(summary && [\"preparing\", \"queued\", \"running\", \"cleaning\"].includes(summary.state));\n}\n\n/** Read/setup are configuration-only. Manual start authorizes exactly the\n * retained candidate, plan and revision. A retry never launches training. */\nexport function createPostTrainingClient(input: {\n request: (path: string, init?: RequestInit) => Promise<unknown>;\n}) {\n const { request } = input;\n const path = (jobId: string) =>\n `/v1/training/jobs/${encodeURIComponent(Id.parse(jobId))}/post-training`;\n async function read(raw: unknown, teamId: string, jobId: string) {\n if (raw === null) return null;\n const value = PostTrainingSummarySchema.parse(raw);\n if (value.teamId !== teamId || value.jobId !== jobId)\n throw new OpenPondProtocolError(\n \"post_training_scope_mismatch\",\n \"The evaluation summary belongs to another run or workspace.\",\n );\n return value;\n }\n return {\n async attach(teamId: string, raw: z.input<typeof AttachPostTrainingSchema>) {\n const body = AttachPostTrainingSchema.parse(raw);\n const value = verifyPostTrainingPlan(\n await request(\"/v1/training/post-training-plans\", {\n method: \"POST\",\n body: JSON.stringify(body),\n }),\n );\n if (\n value.teamId !== teamId ||\n (await canonicalSha256(value.attachment)) !== (await canonicalSha256(body.attachment))\n )\n throw new OpenPondProtocolError(\n \"post_training_plan_mismatch\",\n \"The retained attachment differs from the reviewed plan.\",\n );\n return value;\n },\n async get(teamId: string, jobId: string) {\n return read(await request(path(jobId)), teamId, jobId);\n },\n async control(\n teamId: string,\n jobId: string,\n action: \"start\" | \"retry\" | \"cancel\",\n raw: z.input<typeof PostTrainingControlSchema>,\n ) {\n const body = PostTrainingControlSchema.parse(raw);\n const value = await read(\n await request(`${path(jobId)}/${action}`, { method: \"POST\", body: JSON.stringify(body) }),\n teamId,\n jobId,\n );\n if (!value || value.planHash !== body.planHash)\n throw new OpenPondProtocolError(\n \"post_training_control_mismatch\",\n \"Evaluation control did not retain the approved plan.\",\n );\n return value;\n },\n };\n}\n\nexport const HostedTrainingSetupCatalogSchema = z\n .object({\n teamId: Id,\n actorId: Id,\n projectId: Id.nullable(),\n configuration: HostedModelProjectSummarySchema,\n batches: z.array(TaskBatchSchema).max(10_000),\n sources: z.array(LearningSourceSchema).max(10_000),\n definitions: z.array(TaskDefinitionSchema).max(10_000),\n experiments: z\n .array(\n z\n .object({\n id: Id,\n name: z.string().max(500),\n configuration: RunExperimentSchema,\n graders: z\n .array(z.object({ feedbackKey: Id, name: z.string().max(500), ref: Ref }).strict())\n .max(100),\n })\n .strict(),\n )\n .max(10_000),\n })\n .strict();\nexport type HostedTrainingSetupCatalog = z.infer<typeof HostedTrainingSetupCatalogSchema>;\n\nexport const HostedTrainingSetupActionSchema = z.enum([\n \"prepare\",\n \"start\",\n \"cancel\",\n \"publish\",\n \"attach\",\n]);\nexport type HostedTrainingSetupAction = z.infer<typeof HostedTrainingSetupActionSchema>;\n\nexport const HostedTrainingPolicyDetailSchema = z\n .object({\n teamId: Id,\n actorId: Id,\n configuration: HostedModelProjectSummarySchema,\n policy: LearningPolicySchema,\n inspection: LearningPolicyInspectionResultSchema,\n iterations: z\n .array(\n z\n .object({\n iteration: LearningIterationSchema,\n evals: PostTrainingSummarySchema.nullable(),\n })\n .strict(),\n )\n .max(100),\n nextCursor: Id.nullable(),\n })\n .strict();\nexport const HostedTrainingPolicyControlSchema = z\n .object({\n id: Id,\n expectedRevision: z.number().int().positive(),\n policyHash: Hash,\n operationId: Id,\n action: z.enum([\"pause\", \"resume\", \"reserve\", \"cancel-iteration\", \"retry-iteration\"]),\n iterationId: Id.optional(),\n iterationRevision: z.number().int().positive().optional(),\n })\n .strict();\nexport type HostedTrainingPolicyControl = z.infer<typeof HostedTrainingPolicyControlSchema>;\n"],
5
+ "mappings": "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",
6
+ "names": ["TrainingHandoffOriginSchema"]
7
+ }
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  GraderSpecSchema
3
- } from "./chunk-LGEF4S5I.js";
3
+ } from "./chunk-XJDWHTH5.js";
4
4
  import {
5
5
  decodeTasksetPackageFile
6
- } from "./chunk-WOPM32SE.js";
6
+ } from "./chunk-JA3KFK3U.js";
7
7
 
8
8
  // src/taskset-package-grader-projection.ts
9
9
  import { compileBoundGraders, resolveBoundRewards } from "@openpond/evals/rewards";
@@ -92,4 +92,4 @@ export {
92
92
  projectLearningBatchGraders,
93
93
  learningVerifierModule
94
94
  };
95
- //# sourceMappingURL=chunk-3HV3G6DG.js.map
95
+ //# sourceMappingURL=chunk-NHCGOFQW.js.map
@@ -6,7 +6,7 @@ import {
6
6
  TasksetPackageSchema,
7
7
  tasksetPackageRewardBinding,
8
8
  validateTasksetPackage
9
- } from "./chunk-WOPM32SE.js";
9
+ } from "./chunk-JA3KFK3U.js";
10
10
  import {
11
11
  HostedModelProjectSummarySchema,
12
12
  HostedModelProjectSyncSchema,
@@ -66,6 +66,12 @@ var TasksetPackageReadbackSchema = z.object({
66
66
  modelProjectId: IdSchema,
67
67
  package: TasksetPackageSchema
68
68
  }).strict();
69
+ var TasksetReleasePackageReadbackSchema = z.object({
70
+ schemaVersion: z.literal("openpond.tasksetReleasePackageReadback.v1"),
71
+ teamId: IdSchema,
72
+ release: TasksetCatalogReleaseRefSchema,
73
+ package: TasksetPackageSchema
74
+ }).strict();
69
75
  var OpenPondTasksetPackageError = class extends Error {
70
76
  constructor(status, code, message) {
71
77
  super(message);
@@ -113,6 +119,17 @@ var OpenPondTasksetPackageClient = class {
113
119
  }
114
120
  return receipt;
115
121
  }
122
+ /** Owner-authorized independent Dataset transfer. Callers retain private
123
+ * bytes at the evaluator/server boundary, never in a policy-facing picker. */
124
+ async getByRelease(reference, options = {}) {
125
+ const ref = TasksetCatalogReleaseRefSchema.parse(reference);
126
+ const expectedPackageHash = options.expectedPackageHash === void 0 ? void 0 : HashSchema.parse(options.expectedPackageHash);
127
+ const response = TasksetReleasePackageReadbackSchema.parse(await this.#request(`/releases/${encodeURIComponent(ref.id)}/${ref.revision}/${ref.contentHash}/package`, "GET", void 0, options.signal));
128
+ const value = validateTasksetPackage(response.package), release = { id: value.taskset.id, revision: value.taskset.revision, contentHash: value.taskset.contentHash };
129
+ if (response.teamId !== this.#options.teamId || contentHash(response.release) !== contentHash(ref) || contentHash(release) !== contentHash(ref) || expectedPackageHash !== void 0 && value.contentHash !== expectedPackageHash)
130
+ throw new OpenPondTasksetPackageError(502, "package_readback_mismatch", "Independent Dataset package differs from the requested workspace or exact release.");
131
+ return value;
132
+ }
116
133
  async get(modelProjectId, reference, options = {}) {
117
134
  const project = IdSchema.parse(modelProjectId);
118
135
  const ref = TasksetCatalogReleaseRefSchema.parse(reference);
@@ -165,7 +182,8 @@ export {
165
182
  TasksetPackagePublicationSchema,
166
183
  TasksetPackageReceiptSchema,
167
184
  TasksetPackageReadbackSchema,
185
+ TasksetReleasePackageReadbackSchema,
168
186
  OpenPondTasksetPackageError,
169
187
  OpenPondTasksetPackageClient
170
188
  };
171
- //# sourceMappingURL=chunk-XMKEFQ62.js.map
189
+ //# sourceMappingURL=chunk-PJ2VLNJF.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/taskset-package-client.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\nimport { TasksetCatalogReleaseRefSchema } from \"./taskset-catalog.js\";\nimport { MAX_TASKSET_PACKAGE_BYTES, TasksetPackageSchema, tasksetPackageRewardBinding, validateTasksetPackage, type TasksetPackage } from \"./taskset-package-contracts.js\";\nimport { HostedModelProjectSummarySchema, HostedModelProjectSyncSchema, HostedModelProjectTrainingSetupSchema } from \"./model-projects.js\";\nimport { contentHash } from \"@openpond/harness\";\nimport { learningRef } from \"@openpond/evals/learning\";\n\nconst IdSchema = z.string().trim().min(1).max(500);\nconst HashSchema = z.string().regex(/^[a-f0-9]{64}$/);\n/** Configuration and package selection share one hosted commit. Package-owned\n * references cannot accidentally contain a Desktop-local content hash. */\nexport const TasksetPackageModelConfigurationSchema = HostedModelProjectSyncSchema.pick({\n portableProjectId: true, name: true, objective: true, defaultBaseModel: true, defaultDestinationId: true,\n sourceRevision: true, sourceUpdatedAt: true,\n}).extend({ trainingSetup: HostedModelProjectTrainingSetupSchema.omit({ tasksetRef: true, rewardBindingRef: true, tasksetRelease: true }) }).strict();\nexport const TasksetPackagePublicationSchema = z.object({\n schemaVersion: z.literal(\"openpond.tasksetPackagePublication.v1\"),\n operationId: IdSchema, modelProjectId: IdSchema, expectedProjectEtag: HashSchema.nullable(),\n name: z.string().trim().min(1).max(200), description: z.string().max(5_000),\n buildIntent: z.enum([\"demonstrations\", \"preferences\", \"verifiable_reward\", \"rubric\", \"discovery\"]),\n methodHint: z.enum([\"sft\", \"dpo\", \"grpo\", \"ppo\"]).nullable(), package: TasksetPackageSchema,\n modelConfiguration: TasksetPackageModelConfigurationSchema.optional(),\n evaluationPackage: TasksetPackageSchema.optional(),\n selection: z.enum([\"select\", \"attach\"]).optional(),\n}).strict().refine(value => value.selection !== \"attach\" || value.modelConfiguration === undefined, \"Attachment-only publication cannot replace Model configuration.\")\n .refine(value => !value.evaluationPackage || (value.modelConfiguration !== undefined\n && value.modelConfiguration.trainingSetup.evaluationTasksetRef != null\n && contentHash(value.modelConfiguration.trainingSetup.evaluationTasksetRef) === contentHash(learningRef(value.evaluationPackage.taskset))),\n \"Evaluation package must match the selected immutable evaluation in Model configuration.\");\nexport const TasksetPackageReceiptSchema = z.object({\n schemaVersion: z.literal(\"openpond.tasksetPackageReceipt.v1\"),\n teamId: IdSchema, modelProjectId: IdSchema, operationId: IdSchema,\n taskset: TasksetCatalogReleaseRefSchema, packageHash: HashSchema,\n hostedTasksetId: IdSchema, projectEtag: HashSchema,\n project: HostedModelProjectSummarySchema.optional(),\n selection: z.enum([\"select\", \"attach\"]).optional(),\n evaluation: z.object({ taskset: TasksetCatalogReleaseRefSchema, packageHash: HashSchema, hostedTasksetId: IdSchema }).strict().optional(),\n}).strict();\nexport const TasksetPackageReadbackSchema = z.object({\n schemaVersion: z.literal(\"openpond.tasksetPackageReadback.v1\"),\n teamId: IdSchema, modelProjectId: IdSchema, package: TasksetPackageSchema,\n}).strict();\nexport const TasksetReleasePackageReadbackSchema=z.object({\n schemaVersion:z.literal(\"openpond.tasksetReleasePackageReadback.v1\"),\n teamId:IdSchema,release:TasksetCatalogReleaseRefSchema,package:TasksetPackageSchema,\n}).strict();\nexport type TasksetPackagePublication = z.infer<typeof TasksetPackagePublicationSchema>;\nexport type TasksetPackageReceipt = z.infer<typeof TasksetPackageReceiptSchema>;\nexport type TasksetPackageModelConfiguration = z.infer<typeof TasksetPackageModelConfigurationSchema>;\n\nexport class OpenPondTasksetPackageError extends Error {\n constructor(readonly status: number, readonly code: string, message: string) { super(message); this.name = \"OpenPondTasksetPackageError\"; }\n}\n\n/** Private package operations are explicitly scoped to an authorized Model.\n * Catalog inventory remains metadata-only and never calls this client itself. */\nexport class OpenPondTasksetPackageClient {\n readonly #options: { baseUrl: string; apiKey: string; teamId: string; fetch?: typeof globalThis.fetch };\n constructor(options: { baseUrl: string; apiKey: string; teamId: string; fetch?: typeof globalThis.fetch }) {\n const url = new URL(options.baseUrl);\n if (![\"http:\", \"https:\"].includes(url.protocol) || url.username || url.password || url.search || url.hash || !options.apiKey.trim() || !options.teamId.trim()) throw new Error(\"Taskset package client requires a clean HTTP(S) endpoint and workspace credentials.\");\n this.#options = { ...options, baseUrl: url.toString().replace(/\\/+$/, \"\") };\n }\n\n async publish(input: TasksetPackagePublication, options: { signal?: AbortSignal } = {}): Promise<TasksetPackageReceipt> {\n const request = TasksetPackagePublicationSchema.parse(input);\n validateTasksetPackage(request.package);\n if (request.evaluationPackage) validateTasksetPackage(request.evaluationPackage);\n const receipt = TasksetPackageReceiptSchema.parse(await this.#request(\"\", \"POST\", request, options.signal));\n const release = request.package.taskset;\n if (receipt.teamId !== this.#options.teamId || receipt.modelProjectId !== request.modelProjectId || receipt.operationId !== request.operationId\n || receipt.packageHash !== request.package.contentHash || receipt.taskset.id !== release.id || receipt.taskset.revision !== release.revision || receipt.taskset.contentHash !== release.contentHash) {\n throw new OpenPondTasksetPackageError(502, \"package_receipt_mismatch\", \"Taskset publication receipt did not match the requested package and owner.\");\n }\n if (request.selection !== undefined && receipt.selection !== request.selection) throw new OpenPondTasksetPackageError(502, \"package_receipt_mismatch\", \"Taskset publication did not retain its selection mode.\");\n if (request.evaluationPackage && (!receipt.evaluation\n || receipt.evaluation.packageHash !== request.evaluationPackage.contentHash\n || contentHash(receipt.evaluation.taskset) !== contentHash(learningRef(request.evaluationPackage.taskset)))) {\n throw new OpenPondTasksetPackageError(502, \"package_receipt_mismatch\", \"Taskset publication did not retain the complete selected evaluation package.\");\n }\n if (request.selection === \"attach\" && receipt.projectEtag !== request.expectedProjectEtag) throw new OpenPondTasksetPackageError(502, \"package_receipt_mismatch\", \"Attaching a historical Taskset changed the Model configuration.\");\n if (request.modelConfiguration) {\n const expected = request.modelConfiguration;\n const project = receipt.project;\n const binding = tasksetPackageRewardBinding(request.package);\n const setup = HostedModelProjectTrainingSetupSchema.parse({ ...expected.trainingSetup, tasksetRef: learningRef(release),\n rewardBindingRef: binding ? learningRef(binding) : null,\n tasksetRelease: null });\n if (!project || project.teamId !== this.#options.teamId || project.etag !== receipt.projectEtag\n || ![project.id, project.portableProjectId].includes(request.modelProjectId)\n || project.portableProjectId !== expected.portableProjectId || project.name !== expected.name || project.objective !== expected.objective\n || project.sourceRevision !== expected.sourceRevision || Date.parse(project.sourceUpdatedAt) !== Date.parse(expected.sourceUpdatedAt)\n || contentHash(project.defaultBaseModel) !== contentHash(expected.defaultBaseModel) || project.defaultDestinationId !== expected.defaultDestinationId\n || contentHash(project.trainingSetup) !== contentHash(setup)) {\n throw new OpenPondTasksetPackageError(502, \"package_receipt_mismatch\", \"Taskset publication did not retain the requested Model configuration.\");\n }\n }\n return receipt;\n }\n\n /** Owner-authorized independent Dataset transfer. Callers retain private\n * bytes at the evaluator/server boundary, never in a policy-facing picker. */\n async getByRelease(reference:z.infer<typeof TasksetCatalogReleaseRefSchema>,options:{signal?:AbortSignal;expectedPackageHash?:string}={}):Promise<TasksetPackage> {\n const ref=TasksetCatalogReleaseRefSchema.parse(reference);\n const expectedPackageHash=options.expectedPackageHash===undefined?undefined:HashSchema.parse(options.expectedPackageHash);\n const response=TasksetReleasePackageReadbackSchema.parse(await this.#request(`/releases/${encodeURIComponent(ref.id)}/${ref.revision}/${ref.contentHash}/package`,\"GET\",undefined,options.signal));\n const value=validateTasksetPackage(response.package),release={id:value.taskset.id,revision:value.taskset.revision,contentHash:value.taskset.contentHash};\n if(response.teamId!==this.#options.teamId||contentHash(response.release)!==contentHash(ref)||contentHash(release)!==contentHash(ref)\n ||expectedPackageHash!==undefined&&value.contentHash!==expectedPackageHash)\n throw new OpenPondTasksetPackageError(502,\"package_readback_mismatch\",\"Independent Dataset package differs from the requested workspace or exact release.\");\n return value;\n }\n\n async get(modelProjectId: string, reference: z.infer<typeof TasksetCatalogReleaseRefSchema>, options: { signal?: AbortSignal; expectedPackageHash?: string } = {}): Promise<TasksetPackage> {\n const project = IdSchema.parse(modelProjectId);\n const ref = TasksetCatalogReleaseRefSchema.parse(reference);\n const expectedPackageHash = options.expectedPackageHash === undefined ? undefined : HashSchema.parse(options.expectedPackageHash);\n const response = TasksetPackageReadbackSchema.parse(await this.#request(`/${encodeURIComponent(project)}/${encodeURIComponent(ref.id)}/${ref.revision}/${ref.contentHash}`, \"GET\", undefined, options.signal));\n const taskset = response.package.taskset;\n if (response.teamId !== this.#options.teamId || response.modelProjectId !== project || taskset.id !== ref.id || taskset.revision !== ref.revision || taskset.contentHash !== ref.contentHash) throw new OpenPondTasksetPackageError(502, \"package_readback_mismatch\", \"Taskset package did not match the requested release and owner.\");\n if (expectedPackageHash !== undefined && response.package.contentHash !== expectedPackageHash) throw new OpenPondTasksetPackageError(502, \"package_readback_mismatch\", \"Taskset package did not match the saved publication receipt.\");\n return validateTasksetPackage(response.package);\n }\n\n async #request(path: string, method: string, body: unknown, signal?: AbortSignal): Promise<unknown> {\n const serialized = body === undefined ? undefined : JSON.stringify(body);\n if (serialized && new TextEncoder().encode(serialized).byteLength > MAX_TASKSET_PACKAGE_BYTES) throw new OpenPondTasksetPackageError(413, \"package_too_large\", \"Taskset publication exceeds the 64 MiB envelope.\");\n const response = await (this.#options.fetch ?? globalThis.fetch)(`${this.#options.baseUrl}/v1/taskset-packages${path}`, {\n method, headers: { Authorization: `Bearer ${this.#options.apiKey}`, \"X-OpenPond-Team-Id\": this.#options.teamId, Accept: \"application/json\", ...(serialized ? { \"Content-Type\": \"application/json\" } : {}) },\n body: serialized, signal, redirect: \"error\",\n });\n const reader = response.body?.getReader();\n if (!reader) throw new OpenPondTasksetPackageError(response.status, \"empty_response\", \"Taskset package response was empty.\");\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n let bytes = 0;\n let text = \"\";\n try {\n while (true) {\n const chunk = await reader.read();\n if (chunk.done) break;\n bytes += chunk.value.byteLength;\n if (bytes > MAX_TASKSET_PACKAGE_BYTES) throw new OpenPondTasksetPackageError(413, \"package_too_large\", \"Taskset response exceeds the 64 MiB envelope.\");\n text += decoder.decode(chunk.value, { stream: true });\n }\n text += decoder.decode();\n } finally { await reader.cancel(); reader.releaseLock(); }\n const payload: unknown = JSON.parse(text);\n if (!response.ok) {\n const error = z.object({ code: z.string(), message: z.string() }).safeParse(payload);\n throw new OpenPondTasksetPackageError(response.status, error.success ? error.data.code : \"package_request_failed\", error.success ? error.data.message : `Taskset package request failed (${response.status}).`);\n }\n return payload;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -14,7 +14,7 @@ import {
14
14
  TasksetSourceRefSchema,
15
15
  computeTasksetHash,
16
16
  validateTaskset
17
- } from "./chunk-LGEF4S5I.js";
17
+ } from "./chunk-XJDWHTH5.js";
18
18
  import {
19
19
  ModelTasksetDraftPreparationSchema,
20
20
  TasksetDraftFileContentSchema,
@@ -753,4 +753,4 @@ export {
753
753
  tasksetDraftFromTaskset,
754
754
  publishTasksetDraft
755
755
  };
756
- //# sourceMappingURL=chunk-32H2EJRA.js.map
756
+ //# sourceMappingURL=chunk-R3M6BIOK.js.map
@@ -0,0 +1,125 @@
1
+ import {
2
+ contentHash
3
+ } from "./chunk-QUOW6URQ.js";
4
+
5
+ // src/human-review.ts
6
+ export * from "@openpond/evals/human-review";
7
+
8
+ // src/human-review-client.ts
9
+ import { z } from "zod";
10
+ import { HumanReviewTransportSchema, HumanInspectionSchema, HumanEvidenceSchema, HumanFormSchema, HumanResultViewSchema, HumanReviewViewSchema, HumanInboxSchema } from "@openpond/evals/human-review";
11
+ var HumanReviewClientError = class extends Error {
12
+ constructor(status, code, message) {
13
+ super(message);
14
+ this.status = status;
15
+ this.code = code;
16
+ this.name = "HumanReviewClientError";
17
+ }
18
+ status;
19
+ code;
20
+ };
21
+ var OpenPondHumanReviewClient = class {
22
+ options;
23
+ constructor(options) {
24
+ const url = new URL(options.baseUrl);
25
+ if (!["http:", "https:"].includes(url.protocol) || url.username || url.password || url.hash || url.search || !options.apiKey.trim() || !options.scope.trim() || options.scope !== options.scope.trim() || /[\r\n]/.test(options.scope)) throw new Error("Use a scoped key and a plain HTTP(S) API endpoint.");
26
+ this.options = { ...options, baseUrl: url.toString().replace(/\/+$/, "") };
27
+ }
28
+ async command(command, signal) {
29
+ const result = HumanReviewViewSchema.parse(await this.request({ endpoint: "command", scope: this.options.scope, command }, signal));
30
+ const revisionMatches = command.action === "cancel" ? result.status === "cancelled" && result.revision >= command.expectedRevision + 1 : result.revision === command.expectedRevision + 1;
31
+ if (result.id !== command.id || result.scope !== this.options.scope || !revisionMatches) throw new HumanReviewClientError(502, "human_response_identity_mismatch", "Review response differs from the submitted operation.");
32
+ return result;
33
+ }
34
+ async get(id, revision, signal) {
35
+ const result = HumanReviewViewSchema.parse(await this.request({ endpoint: "get", scope: this.options.scope, id, ...revision ? { revision } : {} }, signal));
36
+ if (result.id !== id || result.scope !== this.options.scope || revision !== void 0 && result.revision !== revision) throw new HumanReviewClientError(502, "human_response_identity_mismatch", "Review response differs from the requested identity.");
37
+ return result;
38
+ }
39
+ async inbox(query, signal) {
40
+ const result = HumanInboxSchema.parse(await this.request({ ...query, endpoint: "inbox", scope: this.options.scope }, signal));
41
+ if (result.items.some((r) => r.scope !== this.options.scope || query.projectId && r.projectId !== query.projectId)) throw new HumanReviewClientError(502, "human_inbox_scope_mismatch", "Inbox response differs from the authorized scope.");
42
+ return result;
43
+ }
44
+ async snapshot(input, signal) {
45
+ return z.object({ evidence: HumanEvidenceSchema, form: HumanFormSchema }).strict().parse(await this.request({ ...input, endpoint: "snapshot", scope: this.options.scope }, signal));
46
+ }
47
+ async taskSnapshot(input, signal) {
48
+ return z.object({ evidence: HumanEvidenceSchema, form: HumanFormSchema }).strict().parse(await this.request({ ...input, endpoint: "snapshot_tasks", scope: this.options.scope }, signal));
49
+ }
50
+ async inspect(id, signal, options) {
51
+ const result = HumanInspectionSchema.parse(await this.request({ endpoint: "inspect", scope: this.options.scope, id, ...options }, signal));
52
+ if (result.some((row) => row.reviewId !== id)) throw new HumanReviewClientError(502, "human_inspection_identity_mismatch", "Inspection differs from selected review.");
53
+ return result;
54
+ }
55
+ async results(executionId, selection, signal) {
56
+ return HumanResultViewSchema.parse(await this.request({ endpoint: "results", scope: this.options.scope, executionId, ...selection ? { selection } : {} }, signal));
57
+ }
58
+ async members(signal) {
59
+ return z.array(z.object({ userId: z.string(), name: z.string().nullable(), email: z.string().nullable(), role: z.string() }).strict()).parse(await this.request({ endpoint: "members", scope: this.options.scope }, signal));
60
+ }
61
+ async request(raw, signal) {
62
+ const body = HumanReviewTransportSchema.parse(raw);
63
+ if (body.scope !== this.options.scope) throw new HumanReviewClientError(403, "human_scope_denied", "Request differs from the scoped client workspace.");
64
+ const serialized = JSON.stringify(body);
65
+ if (new TextEncoder().encode(serialized).byteLength > 1048576) throw new HumanReviewClientError(422, "human_request_too_large", "Review request exceeds its bounded transport.");
66
+ const response = await (this.options.fetch ?? globalThis.fetch)(`${this.options.baseUrl}/v1/human-review`, { method: "POST", headers: { authorization: `Bearer ${this.options.apiKey}`, "content-type": "application/json", "x-openpond-team-id": this.options.scope }, body: serialized, signal, redirect: "error" });
67
+ const reader = response.body?.getReader(), chunks = [];
68
+ let size = 0;
69
+ if (reader) {
70
+ try {
71
+ while (true) {
72
+ const part = await reader.read();
73
+ if (part.done) break;
74
+ size += part.value.byteLength;
75
+ if (size > 8388608) {
76
+ await reader.cancel();
77
+ throw new HumanReviewClientError(502, "human_response_too_large", "Review response exceeds its bounded transport.");
78
+ }
79
+ chunks.push(part.value);
80
+ }
81
+ } finally {
82
+ reader.releaseLock();
83
+ }
84
+ }
85
+ const bytes = new Uint8Array(size);
86
+ let offset = 0;
87
+ for (const chunk of chunks) {
88
+ bytes.set(chunk, offset);
89
+ offset += chunk.byteLength;
90
+ }
91
+ let data;
92
+ try {
93
+ data = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
94
+ } catch {
95
+ throw new HumanReviewClientError(502, "human_response_invalid", "Review response is not valid JSON.");
96
+ }
97
+ if (!response.ok) {
98
+ const failure = z.object({ code: z.string().optional(), error: z.string().optional() }).passthrough().safeParse(data);
99
+ throw new HumanReviewClientError(response.status, failure.success ? failure.data.code ?? "human_request_failed" : "human_request_failed", failure.success ? failure.data.error ?? "Review request failed." : "Review request failed.");
100
+ }
101
+ if (body.endpoint === "results") {
102
+ const result = HumanResultViewSchema.parse(data), { contentHash: hash, ...content } = result;
103
+ if (result.executionId !== body.executionId || contentHash(content) !== hash || body.selection !== void 0 && contentHash(result.selection) !== contentHash(body.selection)) throw new HumanReviewClientError(502, "human_result_identity_mismatch", "Human results differ from the exact retained execution or selected reviews.");
104
+ }
105
+ if (body.endpoint === "snapshot" || body.endpoint === "publish_evidence") {
106
+ const result = z.object({ evidence: HumanEvidenceSchema, form: HumanFormSchema }).strict().parse(data);
107
+ if (result.evidence.graderBinding.id !== body.graderId || result.evidence.attempts.length !== body.selections.length || result.evidence.attempts.some((a, i) => a.experimentId !== body.selections[i].executionId || a.attemptId !== body.selections[i].receiptId)) throw new HumanReviewClientError(502, "human_snapshot_identity_mismatch", "Review snapshot differs from selected retained evidence.");
108
+ }
109
+ if (body.endpoint === "publish_local") {
110
+ const result = z.object({ evidence: HumanEvidenceSchema, form: HumanFormSchema }).strict().parse(data);
111
+ if (!result.evidence.publication || result.evidence.attempts.length !== body.evidence.attempts.length || result.evidence.attempts.some((attempt, index) => attempt.localSource?.kind !== "owner_attested_local" || attempt.experimentId !== body.evidence.attempts[index].executionId || attempt.attemptId !== body.evidence.attempts[index].receiptId || attempt.localSource.retainedAttemptHash !== body.evidence.attempts[index].origin.retainedAttemptHash)) throw new HumanReviewClientError(502, "human_publication_identity_mismatch", "Published review differs from the exact local-origin export.");
112
+ }
113
+ if (body.endpoint === "snapshot_tasks") {
114
+ const result = z.object({ evidence: HumanEvidenceSchema, form: HumanFormSchema }).strict().parse(data);
115
+ if (result.evidence.graderBinding.id !== body.graderId || contentHash(result.evidence.dataset) !== contentHash(body.dataset) || (body.taskIds !== void 0 && contentHash(result.evidence.taskIds) !== contentHash(body.taskIds) || !result.evidence.taskIds?.length || new Set(result.evidence.taskIds).size !== result.evidence.taskIds.length)) throw new HumanReviewClientError(502, "human_snapshot_identity_mismatch", "Task snapshot differs from the selected exact tasks.");
116
+ }
117
+ return data;
118
+ }
119
+ };
120
+
121
+ export {
122
+ HumanReviewClientError,
123
+ OpenPondHumanReviewClient
124
+ };
125
+ //# sourceMappingURL=chunk-SLS3GFPG.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/human-review.ts", "../src/human-review-client.ts"],
4
+ "sourcesContent": ["export * from \"@openpond/evals/human-review\";\nexport * from \"./human-review-client.js\";\n", "import {contentHash} from \"@openpond/harness\";\nimport { z } from \"zod\";\nimport { HumanReviewTransportSchema,HumanInspectionSchema,HumanEvidenceSchema,HumanFormSchema,HumanResultViewSchema, HumanReviewViewSchema, HumanInboxSchema, type HumanReviewCommand, type HumanReviewRequest, type HumanReviewTransportRequest } from \"@openpond/evals/human-review\";\nexport class HumanReviewClientError extends Error { constructor(readonly status: number, readonly code: string, message: string) { super(message); this.name = \"HumanReviewClientError\"; } }\nexport class OpenPondHumanReviewClient {\n readonly options: { baseUrl: string; apiKey: string; scope: string; fetch?: typeof globalThis.fetch };\n constructor(options: OpenPondHumanReviewClient[\"options\"]) {\n const url = new URL(options.baseUrl);\n if (![\"http:\", \"https:\"].includes(url.protocol) || url.username || url.password || url.hash || url.search || !options.apiKey.trim() || !options.scope.trim() || options.scope !== options.scope.trim() || /[\\r\\n]/.test(options.scope)) throw new Error(\"Use a scoped key and a plain HTTP(S) API endpoint.\");\n this.options = { ...options, baseUrl: url.toString().replace(/\\/+$/, \"\") };\n }\n async command(command: HumanReviewCommand, signal?: AbortSignal) {\n const result = HumanReviewViewSchema.parse(await this.request({ endpoint: \"command\", scope: this.options.scope, command }, signal));\n const revisionMatches = command.action === \"cancel\"\n ? result.status === \"cancelled\" && result.revision >= command.expectedRevision + 1\n : result.revision === command.expectedRevision + 1;\n if (result.id !== command.id || result.scope !== this.options.scope || !revisionMatches) throw new HumanReviewClientError(502, \"human_response_identity_mismatch\", \"Review response differs from the submitted operation.\");\n return result;\n }\n async get(id: string, revision?: number, signal?: AbortSignal) {\n const result = HumanReviewViewSchema.parse(await this.request({ endpoint: \"get\", scope: this.options.scope, id, ...(revision ? { revision } : {}) }, signal));\n if (result.id !== id || result.scope !== this.options.scope || revision !== undefined && result.revision !== revision) throw new HumanReviewClientError(502, \"human_response_identity_mismatch\", \"Review response differs from the requested identity.\");\n return result;\n }\n async inbox(query: Omit<Extract<HumanReviewRequest, { endpoint: \"inbox\" }>, \"endpoint\" | \"scope\">, signal?: AbortSignal) {\n const result = HumanInboxSchema.parse(await this.request({ ...query, endpoint: \"inbox\", scope: this.options.scope }, signal));\n if (result.items.some(r => r.scope !== this.options.scope || query.projectId && r.projectId !== query.projectId)) throw new HumanReviewClientError(502, \"human_inbox_scope_mismatch\", \"Inbox response differs from the authorized scope.\");\n return result;\n }\n async snapshot(input:Omit<Extract<HumanReviewTransportRequest,{endpoint:\"snapshot\"}>,\"endpoint\"|\"scope\">,signal?:AbortSignal) {return z.object({evidence:HumanEvidenceSchema,form:HumanFormSchema}).strict().parse(await this.request({...input,endpoint:\"snapshot\",scope:this.options.scope},signal));}\n async taskSnapshot(input:Omit<Extract<HumanReviewTransportRequest,{endpoint:\"snapshot_tasks\"}>,\"endpoint\"|\"scope\">,signal?:AbortSignal) {return z.object({evidence:HumanEvidenceSchema,form:HumanFormSchema}).strict().parse(await this.request({...input,endpoint:\"snapshot_tasks\",scope:this.options.scope},signal));}\n async inspect(id:string,signal?:AbortSignal,options?:{slot?:number;afterId?:string}) {const result=HumanInspectionSchema.parse(await this.request({endpoint:\"inspect\",scope:this.options.scope,id,...options},signal));if(result.some(row=>row.reviewId!==id))throw new HumanReviewClientError(502,\"human_inspection_identity_mismatch\",\"Inspection differs from selected review.\");return result;}\n async results(executionId:string,selection?:Extract<HumanReviewTransportRequest,{endpoint:\"results\"}>[\"selection\"],signal?:AbortSignal) {\n return HumanResultViewSchema.parse(await this.request({endpoint:\"results\",scope:this.options.scope,executionId,...(selection?{selection}:{})},signal));\n }\n async members(signal?:AbortSignal) {return z.array(z.object({userId:z.string(),name:z.string().nullable(),email:z.string().nullable(),role:z.string()}).strict()).parse(await this.request({endpoint:\"members\",scope:this.options.scope},signal));}\n async request(raw: HumanReviewTransportRequest, signal?: AbortSignal) {\n const body = HumanReviewTransportSchema.parse(raw);\n if(body.scope!==this.options.scope)throw new HumanReviewClientError(403,\"human_scope_denied\",\"Request differs from the scoped client workspace.\");\n const serialized=JSON.stringify(body);if(new TextEncoder().encode(serialized).byteLength>1048576)throw new HumanReviewClientError(422,\"human_request_too_large\",\"Review request exceeds its bounded transport.\");\n const response = await (this.options.fetch ?? globalThis.fetch)(`${this.options.baseUrl}/v1/human-review`, { method: \"POST\", headers: { authorization: `Bearer ${this.options.apiKey}`, \"content-type\": \"application/json\", \"x-openpond-team-id\": this.options.scope }, body: serialized, signal,redirect:\"error\" });\n const reader=response.body?.getReader(),chunks:Uint8Array[]=[];let size=0;\n if(reader){try{while(true){const part=await reader.read();if(part.done)break;size+=part.value.byteLength;if(size>8388608){await reader.cancel();throw new HumanReviewClientError(502,\"human_response_too_large\",\"Review response exceeds its bounded transport.\");}chunks.push(part.value);}}finally{reader.releaseLock();}}\n const bytes=new Uint8Array(size);let offset=0;for(const chunk of chunks){bytes.set(chunk,offset);offset+=chunk.byteLength;}\n let data:unknown;try{data=JSON.parse(new TextDecoder(\"utf-8\",{fatal:true}).decode(bytes));}catch{throw new HumanReviewClientError(502,\"human_response_invalid\",\"Review response is not valid JSON.\");}\n if (!response.ok) { const failure = z.object({ code: z.string().optional(), error: z.string().optional() }).passthrough().safeParse(data); throw new HumanReviewClientError(response.status, failure.success ? failure.data.code ?? \"human_request_failed\" : \"human_request_failed\", failure.success ? failure.data.error ?? \"Review request failed.\" : \"Review request failed.\"); }\n if(body.endpoint===\"results\"){\n const result=HumanResultViewSchema.parse(data),{contentHash:hash,...content}=result;\n if(result.executionId!==body.executionId||contentHash(content)!==hash||body.selection!==undefined&&contentHash(result.selection)!==contentHash(body.selection))throw new HumanReviewClientError(502,\"human_result_identity_mismatch\",\"Human results differ from the exact retained execution or selected reviews.\");\n }\n if(body.endpoint===\"snapshot\"||body.endpoint===\"publish_evidence\"){const result=z.object({evidence:HumanEvidenceSchema,form:HumanFormSchema}).strict().parse(data);if(result.evidence.graderBinding.id!==body.graderId||result.evidence.attempts.length!==body.selections.length||result.evidence.attempts.some((a,i)=>a.experimentId!==body.selections[i]!.executionId||a.attemptId!==body.selections[i]!.receiptId))throw new HumanReviewClientError(502,\"human_snapshot_identity_mismatch\",\"Review snapshot differs from selected retained evidence.\");}\n if(body.endpoint===\"publish_local\"){const result=z.object({evidence:HumanEvidenceSchema,form:HumanFormSchema}).strict().parse(data);if(!result.evidence.publication||result.evidence.attempts.length!==body.evidence.attempts.length||result.evidence.attempts.some((attempt,index)=>attempt.localSource?.kind!==\"owner_attested_local\"||attempt.experimentId!==body.evidence.attempts[index]!.executionId||attempt.attemptId!==body.evidence.attempts[index]!.receiptId||attempt.localSource.retainedAttemptHash!==body.evidence.attempts[index]!.origin.retainedAttemptHash))throw new HumanReviewClientError(502,\"human_publication_identity_mismatch\",\"Published review differs from the exact local-origin export.\");}\n if(body.endpoint===\"snapshot_tasks\"){const result=z.object({evidence:HumanEvidenceSchema,form:HumanFormSchema}).strict().parse(data);if(result.evidence.graderBinding.id!==body.graderId||contentHash(result.evidence.dataset)!==contentHash(body.dataset)||(body.taskIds!==undefined&&contentHash(result.evidence.taskIds)!==contentHash(body.taskIds)||!result.evidence.taskIds?.length||new Set(result.evidence.taskIds).size!==result.evidence.taskIds.length))throw new HumanReviewClientError(502,\"human_snapshot_identity_mismatch\",\"Task snapshot differs from the selected exact tasks.\");}\n return data;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }