openpond-sdk 0.12.5 → 0.12.7

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 (157) hide show
  1. package/TASKSETS.md +13 -0
  2. package/TRAINING_PROTOCOL.md +25 -0
  3. package/dist/advanced-refiner-evaluations.js +7 -7
  4. package/dist/candidate-evaluations.js +6 -6
  5. package/dist/{chunk-EJZ7HOIS.js → chunk-2XLKMZH5.js} +485 -251
  6. package/dist/chunk-2XLKMZH5.js.map +1 -0
  7. package/dist/{chunk-CAMLCKSF.js → chunk-3SIGXGAE.js} +132 -87
  8. package/dist/chunk-3SIGXGAE.js.map +1 -0
  9. package/dist/{chunk-T3MFWGMX.js → chunk-3VGTVZHL.js} +3 -3
  10. package/dist/{chunk-O54KGALH.js → chunk-5T76GARR.js} +2 -2
  11. package/dist/{chunk-WQFU635Q.js → chunk-ATVQQCYN.js} +8 -4
  12. package/dist/chunk-ATVQQCYN.js.map +1 -0
  13. package/dist/{chunk-MJELLVQP.js → chunk-B2MKB7NB.js} +2 -2
  14. package/dist/{chunk-H4NTJFEE.js → chunk-D3WOJTUY.js} +3 -2
  15. package/dist/{chunk-H4NTJFEE.js.map → chunk-D3WOJTUY.js.map} +1 -1
  16. package/dist/{chunk-F4GITADW.js → chunk-ETFWUMEJ.js} +2 -2
  17. package/dist/{chunk-6KKM2XRR.js → chunk-FPA3AVCP.js} +35 -6
  18. package/dist/chunk-FPA3AVCP.js.map +1 -0
  19. package/dist/{chunk-QFBSNSUL.js → chunk-HRJKDHHG.js} +6 -4
  20. package/dist/chunk-HRJKDHHG.js.map +1 -0
  21. package/dist/{chunk-6GQ3GIAP.js → chunk-HRZLFJXX.js} +3 -3
  22. package/dist/{chunk-BJ5MKLWH.js → chunk-KD6MM67B.js} +6 -6
  23. package/dist/{chunk-RE426Q7Y.js → chunk-LIMTJR3A.js} +3 -3
  24. package/dist/{chunk-ZFYI4P6C.js → chunk-ONGOAEY6.js} +14 -2
  25. package/dist/chunk-ONGOAEY6.js.map +1 -0
  26. package/dist/{chunk-FLNWE5ZA.js → chunk-QDYHSJT5.js} +22 -8
  27. package/dist/chunk-QDYHSJT5.js.map +1 -0
  28. package/dist/{chunk-GWGDWZVN.js → chunk-RDL6QIQO.js} +2 -2
  29. package/dist/{chunk-BGNPKYBJ.js → chunk-S2IASCGW.js} +3 -3
  30. package/dist/{chunk-KKL6OICH.js → chunk-SER76PQ7.js} +2 -2
  31. package/dist/{chunk-6MFFKAU6.js → chunk-SMHZT6RM.js} +2 -2
  32. package/dist/{chunk-BYNVSWIQ.js → chunk-SQBYHWZU.js} +2 -2
  33. package/dist/{chunk-6Y67YHVH.js → chunk-VBVFE33M.js} +5 -5
  34. package/dist/{chunk-DBKCSQVH.js → chunk-VQGTYGZH.js} +2 -2
  35. package/dist/{chunk-25L5IXHA.js → chunk-VTAGUWXH.js} +2 -2
  36. package/dist/{chunk-HOOHJCE7.js → chunk-XF3JR72U.js} +3 -3
  37. package/dist/{chunk-VZPNRPXL.js → chunk-Y3I7SN5W.js} +61 -35
  38. package/dist/chunk-Y3I7SN5W.js.map +1 -0
  39. package/dist/{chunk-XACJ63U4.js → chunk-Z4XGSEKC.js} +577 -249
  40. package/dist/chunk-Z4XGSEKC.js.map +1 -0
  41. package/dist/{chunk-AUNNXJQE.js → chunk-ZGZLN4LH.js} +2 -2
  42. package/dist/connected-evidence.js +14 -14
  43. package/dist/dataset-workspaces.js +14 -14
  44. package/dist/experiment-evaluation-schedules.js +18 -18
  45. package/dist/experiment-improvements.js +7 -7
  46. package/dist/experiments.js +17 -17
  47. package/dist/index.js +34 -33
  48. package/dist/index.js.map +1 -1
  49. package/dist/learning.js +113 -9
  50. package/dist/learning.js.map +1 -1
  51. package/dist/model-projects.js +1 -1
  52. package/dist/model-starter-attempts.js +2 -2
  53. package/dist/model-starter-catalog.js +9 -9
  54. package/dist/model-starters.js +13 -9
  55. package/dist/model-taskset-runs.js +3 -3
  56. package/dist/post-training.js +6 -6
  57. package/dist/taskset-drafts.js +12 -12
  58. package/dist/taskset-packages.js +15 -15
  59. package/dist/training-bundle.js +81 -19
  60. package/dist/training-bundle.js.map +1 -1
  61. package/dist/training.js +39 -7
  62. package/dist/types/packages/cloud/src/sandbox/sandbox-instance-client.d.ts.map +1 -1
  63. package/dist/types/packages/cloud/src/sandbox/url.d.ts +3 -1
  64. package/dist/types/packages/cloud/src/sandbox/url.d.ts.map +1 -1
  65. package/dist/types/packages/sdk/src/connected-evidence-client.d.ts +4 -0
  66. package/dist/types/packages/sdk/src/connected-evidence-client.d.ts.map +1 -1
  67. package/dist/types/packages/sdk/src/dataset-preparation-workspace.d.ts +2 -0
  68. package/dist/types/packages/sdk/src/dataset-preparation-workspace.d.ts.map +1 -1
  69. package/dist/types/packages/sdk/src/dataset-workspace-client.d.ts +14 -0
  70. package/dist/types/packages/sdk/src/dataset-workspace-client.d.ts.map +1 -1
  71. package/dist/types/packages/sdk/src/dataset-workspace-contracts.d.ts +4 -0
  72. package/dist/types/packages/sdk/src/dataset-workspace-contracts.d.ts.map +1 -1
  73. package/dist/types/packages/sdk/src/dataset-workspace-operations.d.ts +4 -0
  74. package/dist/types/packages/sdk/src/dataset-workspace-operations.d.ts.map +1 -1
  75. package/dist/types/packages/sdk/src/learning-client.d.ts +1 -0
  76. package/dist/types/packages/sdk/src/learning-client.d.ts.map +1 -1
  77. package/dist/types/packages/sdk/src/learning-correction-metrics.d.ts +358 -0
  78. package/dist/types/packages/sdk/src/learning-correction-metrics.d.ts.map +1 -0
  79. package/dist/types/packages/sdk/src/learning.d.ts +1 -0
  80. package/dist/types/packages/sdk/src/learning.d.ts.map +1 -1
  81. package/dist/types/packages/sdk/src/managed-training-preparation.d.ts +24 -0
  82. package/dist/types/packages/sdk/src/managed-training-preparation.d.ts.map +1 -1
  83. package/dist/types/packages/sdk/src/model-learning-policy.d.ts +16 -0
  84. package/dist/types/packages/sdk/src/model-learning-policy.d.ts.map +1 -1
  85. package/dist/types/packages/sdk/src/model-projects.d.ts +172 -0
  86. package/dist/types/packages/sdk/src/model-projects.d.ts.map +1 -1
  87. package/dist/types/packages/sdk/src/model-starters.d.ts +84 -1
  88. package/dist/types/packages/sdk/src/model-starters.d.ts.map +1 -1
  89. package/dist/types/packages/sdk/src/model-taskset-runs.d.ts +28 -28
  90. package/dist/types/packages/sdk/src/model-training-defaults.d.ts +14 -0
  91. package/dist/types/packages/sdk/src/model-training-defaults.d.ts.map +1 -1
  92. package/dist/types/packages/sdk/src/post-training.d.ts +46 -0
  93. package/dist/types/packages/sdk/src/post-training.d.ts.map +1 -1
  94. package/dist/types/packages/sdk/src/taskset-authored-files.d.ts.map +1 -1
  95. package/dist/types/packages/sdk/src/taskset-authored-portable-release.d.ts.map +1 -1
  96. package/dist/types/packages/sdk/src/taskset-draft-api-contracts.d.ts +4 -0
  97. package/dist/types/packages/sdk/src/taskset-draft-api-contracts.d.ts.map +1 -1
  98. package/dist/types/packages/sdk/src/taskset-draft-client.d.ts +141 -120
  99. package/dist/types/packages/sdk/src/taskset-draft-client.d.ts.map +1 -1
  100. package/dist/types/packages/sdk/src/taskset-draft-document.d.ts +4 -0
  101. package/dist/types/packages/sdk/src/taskset-draft-document.d.ts.map +1 -1
  102. package/dist/types/packages/sdk/src/taskset-draft-source.d.ts +4 -0
  103. package/dist/types/packages/sdk/src/taskset-draft-source.d.ts.map +1 -1
  104. package/dist/types/packages/sdk/src/taskset-draft-workspace.d.ts +4 -0
  105. package/dist/types/packages/sdk/src/taskset-draft-workspace.d.ts.map +1 -1
  106. package/dist/types/packages/sdk/src/taskset-package-client.d.ts +51 -0
  107. package/dist/types/packages/sdk/src/taskset-package-client.d.ts.map +1 -1
  108. package/dist/types/packages/sdk/src/taskset-package-contracts.d.ts.map +1 -1
  109. package/dist/types/packages/sdk/src/taskset-package-projection.d.ts.map +1 -1
  110. package/dist/types/packages/sdk/src/training-bundle.d.ts.map +1 -1
  111. package/dist/types/packages/sdk/src/training-compute-selection.d.ts +52 -0
  112. package/dist/types/packages/sdk/src/training-compute-selection.d.ts.map +1 -0
  113. package/dist/types/packages/sdk/src/training-estimates.d.ts +1069 -0
  114. package/dist/types/packages/sdk/src/training-estimates.d.ts.map +1 -0
  115. package/dist/types/packages/sdk/src/training-learning-batch.d.ts +40 -40
  116. package/dist/types/packages/sdk/src/training-physical-placement.d.ts +16 -0
  117. package/dist/types/packages/sdk/src/training-physical-placement.d.ts.map +1 -0
  118. package/dist/types/packages/sdk/src/training-preparations.d.ts +248 -0
  119. package/dist/types/packages/sdk/src/training-preparations.d.ts.map +1 -1
  120. package/dist/types/packages/sdk/src/training-qualification-preparation.d.ts +20 -0
  121. package/dist/types/packages/sdk/src/training-qualification-preparation.d.ts.map +1 -1
  122. package/dist/types/packages/sdk/src/training-queue.d.ts +24 -0
  123. package/dist/types/packages/sdk/src/training-queue.d.ts.map +1 -0
  124. package/dist/types/packages/sdk/src/training-recipe-binding.d.ts.map +1 -1
  125. package/dist/types/packages/sdk/src/training-recovery.d.ts +85 -0
  126. package/dist/types/packages/sdk/src/training-recovery.d.ts.map +1 -0
  127. package/dist/types/packages/sdk/src/training-verifier-assets.d.ts +7 -0
  128. package/dist/types/packages/sdk/src/training-verifier-assets.d.ts.map +1 -0
  129. package/dist/types/packages/sdk/src/training.d.ts +599 -0
  130. package/dist/types/packages/sdk/src/training.d.ts.map +1 -1
  131. package/package.json +3 -3
  132. package/dist/chunk-6KKM2XRR.js.map +0 -1
  133. package/dist/chunk-CAMLCKSF.js.map +0 -1
  134. package/dist/chunk-EJZ7HOIS.js.map +0 -1
  135. package/dist/chunk-FLNWE5ZA.js.map +0 -1
  136. package/dist/chunk-QFBSNSUL.js.map +0 -1
  137. package/dist/chunk-VZPNRPXL.js.map +0 -1
  138. package/dist/chunk-WQFU635Q.js.map +0 -1
  139. package/dist/chunk-XACJ63U4.js.map +0 -1
  140. package/dist/chunk-ZFYI4P6C.js.map +0 -1
  141. /package/dist/{chunk-T3MFWGMX.js.map → chunk-3VGTVZHL.js.map} +0 -0
  142. /package/dist/{chunk-O54KGALH.js.map → chunk-5T76GARR.js.map} +0 -0
  143. /package/dist/{chunk-MJELLVQP.js.map → chunk-B2MKB7NB.js.map} +0 -0
  144. /package/dist/{chunk-F4GITADW.js.map → chunk-ETFWUMEJ.js.map} +0 -0
  145. /package/dist/{chunk-6GQ3GIAP.js.map → chunk-HRZLFJXX.js.map} +0 -0
  146. /package/dist/{chunk-BJ5MKLWH.js.map → chunk-KD6MM67B.js.map} +0 -0
  147. /package/dist/{chunk-RE426Q7Y.js.map → chunk-LIMTJR3A.js.map} +0 -0
  148. /package/dist/{chunk-GWGDWZVN.js.map → chunk-RDL6QIQO.js.map} +0 -0
  149. /package/dist/{chunk-BGNPKYBJ.js.map → chunk-S2IASCGW.js.map} +0 -0
  150. /package/dist/{chunk-KKL6OICH.js.map → chunk-SER76PQ7.js.map} +0 -0
  151. /package/dist/{chunk-6MFFKAU6.js.map → chunk-SMHZT6RM.js.map} +0 -0
  152. /package/dist/{chunk-BYNVSWIQ.js.map → chunk-SQBYHWZU.js.map} +0 -0
  153. /package/dist/{chunk-6Y67YHVH.js.map → chunk-VBVFE33M.js.map} +0 -0
  154. /package/dist/{chunk-DBKCSQVH.js.map → chunk-VQGTYGZH.js.map} +0 -0
  155. /package/dist/{chunk-25L5IXHA.js.map → chunk-VTAGUWXH.js.map} +0 -0
  156. /package/dist/{chunk-HOOHJCE7.js.map → chunk-XF3JR72U.js.map} +0 -0
  157. /package/dist/{chunk-AUNNXJQE.js.map → chunk-ZGZLN4LH.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  TrainingHandoffOriginSchema,
3
3
  createPostTrainingClient
4
- } from "./chunk-RE426Q7Y.js";
4
+ } from "./chunk-LIMTJR3A.js";
5
5
  import {
6
6
  validateHarnessPolicySourcePackage,
7
7
  validateHarnessSourcePackage
@@ -16,10 +16,13 @@ import {
16
16
  TRAINING_API_RESPONSE_MAX_BYTES,
17
17
  TRAINING_INPUT_ARTIFACT_MAX_BYTES,
18
18
  TRAINING_JOB_SUBMISSION_MAX_BYTES,
19
+ TrainingEstimateReviewSchema,
20
+ TrainingGpuCatalogSchema,
21
+ TrainingGpuSelectionSchema,
19
22
  assertCanonicalPayloadSize,
20
23
  canonicalSha256,
21
24
  parseBoundedJson
22
- } from "./chunk-CAMLCKSF.js";
25
+ } from "./chunk-3SIGXGAE.js";
23
26
  import {
24
27
  ImmutableReleaseRefSchema
25
28
  } from "./chunk-H3JZ3P5T.js";
@@ -77,41 +80,123 @@ function createTrainingAcceptanceClient(request) {
77
80
  }
78
81
 
79
82
  // src/training.ts
80
- import { z as z8 } from "zod";
83
+ import { z as z12 } from "zod";
81
84
 
82
- // src/training-preparations.ts
85
+ // src/training-recovery.ts
83
86
  import { z as z2 } from "zod";
84
- var Id2 = z2.string().trim().min(1).max(191);
85
- var Hash = z2.string().regex(/^[a-f0-9]{64}$/);
86
- var TrainingPreparationRequestSchema = z2.object({
87
- schemaVersion: z2.literal("openpond.trainingPreparationRequest.v1"),
87
+ var id = z2.string().trim().min(1).max(191);
88
+ var hash = z2.string().regex(/^[a-f0-9]{64}$/);
89
+ var ApprovalBodySchema = z2.object({
90
+ schemaVersion: z2.literal("openpond.checkpointRecoveryResourceApproval.v1"),
91
+ ownerUserId: id,
92
+ teamId: id,
93
+ sourceJobId: id,
94
+ sourceJobVersion: z2.number().int().positive(),
95
+ sourceInputManifestSha256: hash,
96
+ checkpointId: id,
97
+ adapterSha256: hash,
98
+ resumeSha256: hash,
99
+ idempotencyKey: z2.string().trim().min(16).max(191),
100
+ approvedAt: z2.iso.datetime({ offset: true }),
101
+ maximumSpendUsd: z2.number().positive().finite().max(30).refine(
102
+ (value) => Number(value.toFixed(6)) === value,
103
+ "Recovery spend must use whole microdollars"
104
+ ),
105
+ maximumGpuSeconds: z2.number().int().positive().max(21600),
106
+ maximumWallSeconds: z2.number().int().positive().max(21600)
107
+ }).strict();
108
+ var TrainingCheckpointRecoveryResourceApprovalSchema = ApprovalBodySchema.extend({
109
+ approvalHash: hash
110
+ }).strict().superRefine((value, context) => {
111
+ if (value.maximumGpuSeconds > value.maximumWallSeconds)
112
+ context.addIssue({
113
+ code: "custom",
114
+ path: ["maximumGpuSeconds"],
115
+ message: "Recovery GPU duration exceeds its wall"
116
+ });
117
+ });
118
+ async function createTrainingCheckpointRecoveryResourceApproval(input) {
119
+ const body = ApprovalBodySchema.parse(input);
120
+ return TrainingCheckpointRecoveryResourceApprovalSchema.parse({
121
+ ...body,
122
+ approvalHash: await canonicalSha256(body)
123
+ });
124
+ }
125
+ var TrainingCheckpointRecoveryRequestSchema = z2.object({
126
+ resourceApproval: TrainingCheckpointRecoveryResourceApprovalSchema.optional(),
127
+ mode: z2.literal("evaluation_only").optional(),
128
+ evaluationGpuType: z2.enum(["NVIDIA A100 80GB PCIe", "NVIDIA A100-SXM4-80GB", "NVIDIA H100 80GB HBM3"]).optional(),
129
+ expectedVersion: z2.number().int().positive(),
130
+ checkpointId: id,
131
+ idempotencyKey: z2.string().trim().min(16).max(191),
132
+ maximumSpendUsd: z2.number().positive().finite(),
133
+ maximumWallSeconds: z2.number().int().positive().max(21600)
134
+ }).strict().superRefine((value, context) => {
135
+ if (value.evaluationGpuType && value.mode !== "evaluation_only")
136
+ context.addIssue({
137
+ code: "custom",
138
+ path: ["evaluationGpuType"],
139
+ message: "GPU substitution requires explicit evaluation-only recovery"
140
+ });
141
+ const a = value.resourceApproval;
142
+ if (a && (a.sourceJobVersion !== value.expectedVersion || a.checkpointId !== value.checkpointId || a.idempotencyKey !== value.idempotencyKey || a.maximumSpendUsd !== value.maximumSpendUsd || a.maximumWallSeconds !== value.maximumWallSeconds))
143
+ context.addIssue({
144
+ code: "custom",
145
+ path: ["resourceApproval"],
146
+ message: "Recovery resource approval does not match its request"
147
+ });
148
+ });
149
+
150
+ // src/training-physical-placement.ts
151
+ import { z as z3 } from "zod";
152
+ var TrainingPhysicalPlacementSchema = z3.object({
153
+ mode: z3.literal("reuse_only"),
154
+ physicalWorkerId: z3.string().trim().min(1).max(191),
155
+ providerPodId: z3.string().trim().min(1).max(191),
156
+ workerImageDigest: z3.string().regex(/^sha256:[a-f0-9]{64}$/),
157
+ baseProfileSha256: z3.string().regex(/^[a-f0-9]{64}$/),
158
+ gpuType: z3.string().trim().min(1).max(200),
159
+ sourceJobId: z3.string().trim().min(1).max(191),
160
+ sourceInputManifestSha256: z3.string().regex(/^[a-f0-9]{64}$/),
161
+ ownerTeamId: z3.string().trim().min(1).max(191),
162
+ deadlineAt: z3.string().datetime({ offset: true })
163
+ }).strict();
164
+
165
+ // src/training-preparations.ts
166
+ import { z as z4 } from "zod";
167
+ var Id2 = z4.string().trim().min(1).max(191);
168
+ var Hash = z4.string().regex(/^[a-f0-9]{64}$/);
169
+ var TrainingPreparationRequestSchema = z4.object({
170
+ schemaVersion: z4.literal("openpond.trainingPreparationRequest.v1"),
88
171
  teamId: Id2,
89
172
  operationId: Id2,
90
173
  projectId: Id2.nullable(),
91
- configuration: z2.object({ id: Id2, expectedRevision: z2.number().int().positive(), expectedEtag: Hash }).strict(),
174
+ configuration: z4.object({ id: Id2, expectedRevision: z4.number().int().positive(), expectedEtag: Hash }).strict(),
92
175
  origin: TrainingHandoffOriginSchema.optional(),
93
176
  batch: ModelProjectVersionedRefSchema,
94
- name: z2.string().trim().min(1).max(191),
95
- maximumSpendUsd: z2.number().finite().positive().max(1e6)
177
+ name: z4.string().trim().min(1).max(191),
178
+ maximumSpendUsd: z4.number().finite().positive().max(1e6),
179
+ gpuSelection: TrainingGpuSelectionSchema.optional(),
180
+ physicalPlacement: TrainingPhysicalPlacementSchema.optional()
96
181
  }).strict();
97
- var TrainingPreparationPlanContentSchema = z2.object({
98
- schemaVersion: z2.literal("openpond.trainingPreparationPlan.v1"),
182
+ var TrainingPreparationPlanContentSchema = z4.object({
183
+ schemaVersion: z4.literal("openpond.trainingPreparationPlan.v1"),
99
184
  id: Id2,
100
185
  creatorUserId: Id2,
101
186
  request: TrainingPreparationRequestSchema,
102
187
  requestHash: Hash,
103
- source: z2.lazy(() => TrainingJobSourceSchema),
188
+ source: z4.lazy(() => TrainingJobSourceSchema),
104
189
  submissionHash: Hash,
105
- createdAt: z2.string().datetime({ offset: true })
190
+ createdAt: z4.string().datetime({ offset: true })
106
191
  }).strict();
107
192
  var TrainingPreparationPlanSchema = TrainingPreparationPlanContentSchema.extend({
108
193
  contentHash: Hash
109
194
  }).strict();
110
- var TrainingPreparationReceiptSchema = z2.object({
111
- schemaVersion: z2.literal("openpond.trainingPreparationReceipt.v1"),
195
+ var TrainingPreparationReceiptSchema = z4.object({
196
+ schemaVersion: z4.literal("openpond.trainingPreparationReceipt.v1"),
112
197
  plan: TrainingPreparationPlanSchema,
113
- revision: z2.number().int().positive(),
114
- state: z2.enum(["prepared", "submitted", "cancelled"]),
198
+ revision: z4.number().int().positive(),
199
+ state: z4.enum(["prepared", "submitted", "cancelled"]),
115
200
  jobId: Id2.nullable()
116
201
  }).strict().superRefine((value, context) => {
117
202
  if (value.state === "submitted" !== Boolean(value.jobId))
@@ -121,21 +206,22 @@ var TrainingPreparationReceiptSchema = z2.object({
121
206
  message: "Only submitted preparations identify a job."
122
207
  });
123
208
  });
124
- var TrainingPreparationControlSchema = z2.object({
209
+ var TrainingPreparationControlSchema = z4.object({
125
210
  teamId: Id2,
126
211
  planHash: Hash,
127
- expectedRevision: z2.number().int().positive()
212
+ expectedRevision: z4.number().int().positive(),
213
+ estimateReview: TrainingEstimateReviewSchema.optional()
128
214
  }).strict();
129
- var TrainingPreparationListQuerySchema = z2.object({
215
+ var TrainingPreparationListQuerySchema = z4.object({
130
216
  projectId: Id2.optional(),
131
- state: z2.enum(["prepared", "submitted", "cancelled"]).optional(),
217
+ state: z4.enum(["prepared", "submitted", "cancelled"]).optional(),
132
218
  afterId: Id2.optional(),
133
- limit: z2.number().int().min(1).max(100).default(25)
219
+ limit: z4.number().int().min(1).max(100).default(25)
134
220
  }).strict();
135
- var TrainingPreparationPageSchema = z2.object({
136
- schemaVersion: z2.literal("openpond.trainingPreparationPage.v1"),
221
+ var TrainingPreparationPageSchema = z4.object({
222
+ schemaVersion: z4.literal("openpond.trainingPreparationPage.v1"),
137
223
  teamId: Id2,
138
- items: z2.array(TrainingPreparationReceiptSchema).max(100),
224
+ items: z4.array(TrainingPreparationReceiptSchema).max(100),
139
225
  nextCursor: Id2.nullable()
140
226
  }).strict();
141
227
  async function parseAndVerifyTrainingPreparationReceipt(value) {
@@ -150,9 +236,9 @@ async function parseAndVerifyTrainingPreparationReceipt(value) {
150
236
  return receipt;
151
237
  }
152
238
  function createTrainingPreparationClient(request) {
153
- async function read(value, teamId, id) {
239
+ async function read(value, teamId, id2) {
154
240
  const receipt = await parseAndVerifyTrainingPreparationReceipt(value);
155
- if (receipt.plan.request.teamId !== teamId || id && receipt.plan.id !== id)
241
+ if (receipt.plan.request.teamId !== teamId || id2 && receipt.plan.id !== id2)
156
242
  throw new OpenPondProtocolError(
157
243
  "training_preparation_scope_mismatch",
158
244
  "The training preparation belongs to a different workspace or request."
@@ -205,22 +291,22 @@ function createTrainingPreparationClient(request) {
205
291
  );
206
292
  return receipt;
207
293
  },
208
- async getPreparation(teamId, id) {
294
+ async getPreparation(teamId, id2) {
209
295
  return read(
210
- await request(`/v1/training/preparations/${encodeURIComponent(Id2.parse(id))}`),
296
+ await request(`/v1/training/preparations/${encodeURIComponent(Id2.parse(id2))}`),
211
297
  Id2.parse(teamId),
212
- id
298
+ id2
213
299
  );
214
300
  },
215
- async startPreparation(id, input) {
301
+ async startPreparation(id2, input) {
216
302
  const parsed = TrainingPreparationControlSchema.parse(input);
217
303
  const receipt = await read(
218
- await request(`/v1/training/preparations/${encodeURIComponent(Id2.parse(id))}/start`, {
304
+ await request(`/v1/training/preparations/${encodeURIComponent(Id2.parse(id2))}/start`, {
219
305
  method: "POST",
220
306
  body: JSON.stringify(parsed)
221
307
  }),
222
308
  parsed.teamId,
223
- id
309
+ id2
224
310
  );
225
311
  if (receipt.plan.contentHash !== parsed.planHash || receipt.state !== "submitted")
226
312
  throw new OpenPondProtocolError(
@@ -229,15 +315,15 @@ function createTrainingPreparationClient(request) {
229
315
  );
230
316
  return receipt;
231
317
  },
232
- async cancelPreparation(id, input) {
318
+ async cancelPreparation(id2, input) {
233
319
  const parsed = TrainingPreparationControlSchema.parse(input);
234
320
  const receipt = await read(
235
- await request(`/v1/training/preparations/${encodeURIComponent(Id2.parse(id))}/cancel`, {
321
+ await request(`/v1/training/preparations/${encodeURIComponent(Id2.parse(id2))}/cancel`, {
236
322
  method: "POST",
237
323
  body: JSON.stringify(parsed)
238
324
  }),
239
325
  parsed.teamId,
240
- id
326
+ id2
241
327
  );
242
328
  if (receipt.plan.contentHash !== parsed.planHash || receipt.state !== "cancelled")
243
329
  throw new OpenPondProtocolError(
@@ -249,13 +335,184 @@ function createTrainingPreparationClient(request) {
249
335
  };
250
336
  }
251
337
 
338
+ // src/training-estimates.ts
339
+ import { z as z5 } from "zod";
340
+ var Id3 = z5.string().trim().min(1).max(191);
341
+ var Hash2 = z5.string().regex(/^[a-f0-9]{64}$/);
342
+ var Timestamp = z5.string().datetime({ offset: true });
343
+ var NonNegative = z5.number().finite().nonnegative();
344
+ var TrainingEstimateSourceSchema = z5.discriminatedUnion("kind", [
345
+ z5.object({ kind: z5.literal("preparation"), id: Id3, planHash: Hash2, expectedRevision: z5.number().int().positive() }).strict(),
346
+ z5.object({
347
+ kind: z5.literal("configuration"),
348
+ id: Id3,
349
+ expectedRevision: z5.number().int().positive(),
350
+ expectedEtag: Hash2,
351
+ batch: ModelProjectVersionedRefSchema.nullable().default(null)
352
+ }).strict(),
353
+ z5.object({ kind: z5.literal("submission"), submission: z5.lazy(() => TrainingJobSubmissionSchema) }).strict()
354
+ ]);
355
+ var TrainingEstimateRequestSchema = z5.object({
356
+ schemaVersion: z5.literal("openpond.trainingEstimateRequest.v1"),
357
+ teamId: Id3,
358
+ source: TrainingEstimateSourceSchema,
359
+ gpuSelection: TrainingGpuSelectionSchema.optional()
360
+ }).strict();
361
+ var PlanningRange = z5.object({ low: NonNegative, high: NonNegative }).strict().refine((value) => value.high >= value.low, "Planning range must be ordered");
362
+ var TrainingEstimateComponentSchema = z5.object({
363
+ phase: z5.enum([
364
+ "startup",
365
+ "baseline_evaluation",
366
+ "rollouts",
367
+ "optimization",
368
+ "checkpointing",
369
+ "backbone_materialization",
370
+ "final_evaluation",
371
+ "publication",
372
+ "cleanup",
373
+ "retention"
374
+ ]),
375
+ resource: z5.enum(["gpu", "cpu", "judge", "storage", "network"]),
376
+ expectedUsd: NonNegative.nullable(),
377
+ expectedSeconds: NonNegative.nullable(),
378
+ planningRangeUsd: PlanningRange.nullable(),
379
+ evidence: z5.enum(["measured", "configured_rate", "unavailable"]),
380
+ reason: z5.string().trim().min(1).max(1e3).nullable()
381
+ }).strict();
382
+ function trainingEstimateSourceIdentity(source) {
383
+ if (source.kind === "submission") return {
384
+ kind: source.kind,
385
+ id: source.submission.idempotencyKey,
386
+ contentHash: source.submission.contentHash,
387
+ revision: null
388
+ };
389
+ if (source.kind === "preparation") return {
390
+ kind: source.kind,
391
+ id: source.id,
392
+ contentHash: source.planHash,
393
+ revision: source.expectedRevision
394
+ };
395
+ return { kind: source.kind, id: source.id, contentHash: source.expectedEtag, revision: source.expectedRevision };
396
+ }
397
+ var TrainingEstimateSchema = z5.object({
398
+ schemaVersion: z5.literal("openpond.trainingEstimate.v1"),
399
+ id: Id3,
400
+ teamId: Id3,
401
+ requestHash: Hash2,
402
+ inputHash: Hash2,
403
+ source: z5.object({
404
+ kind: z5.enum(["preparation", "configuration", "submission"]),
405
+ id: Id3,
406
+ contentHash: Hash2,
407
+ revision: z5.number().int().positive().nullable()
408
+ }).strict(),
409
+ status: z5.enum(["available", "partial", "insufficient_evidence"]),
410
+ currency: z5.literal("USD"),
411
+ createdAt: Timestamp,
412
+ expiresAt: Timestamp,
413
+ estimatorVersion: Id3,
414
+ runtimeVersion: Id3,
415
+ pricing: z5.object({ version: Id3, quoteExpiresAt: Timestamp.nullable() }).strict(),
416
+ gpu: z5.object({
417
+ requested: TrainingGpuSelectionSchema,
418
+ resolved: z5.object({ availabilityId: Id3, gpuType: z5.string().min(1).max(256), gpuCount: z5.literal(1) }).strict().nullable(),
419
+ customerHourlyUsd: NonNegative.nullable(),
420
+ availability: z5.enum(["available", "limited", "unavailable", "unknown"])
421
+ }).strict(),
422
+ configuration: z5.object({
423
+ modelId: Id3,
424
+ modelRevision: z5.string().min(1).max(256),
425
+ method: Id3,
426
+ loraRank: z5.number().int().positive().nullable(),
427
+ adapterMode: z5.enum(["residual_append", "shared", "sequential_merge"]).nullable(),
428
+ groups: z5.number().int().nonnegative().nullable(),
429
+ rolloutConcurrency: z5.number().int().positive().nullable(),
430
+ maxOutputTokens: z5.number().int().positive().nullable(),
431
+ trainingRows: z5.number().int().nonnegative().nullable(),
432
+ evaluationRows: z5.number().int().nonnegative().nullable(),
433
+ retentionDays: z5.number().int().positive().nullable(),
434
+ approvedMaximumUsd: NonNegative.nullable()
435
+ }).strict(),
436
+ cost: z5.object({
437
+ expectedUsd: NonNegative.nullable(),
438
+ planningRangeUsd: PlanningRange.nullable(),
439
+ knownMinimumUsd: NonNegative,
440
+ recommendedMaximumUsd: NonNegative.nullable(),
441
+ minimumCleanupReserveUsd: NonNegative.nullable(),
442
+ components: z5.array(TrainingEstimateComponentSchema).max(50)
443
+ }).strict(),
444
+ executionSeconds: z5.object({ expected: NonNegative.nullable(), planningRange: PlanningRange.nullable() }).strict(),
445
+ queueWaitSeconds: z5.object({ expected: NonNegative, planningRange: PlanningRange.nullable() }).strict().nullable(),
446
+ calibration: z5.object({
447
+ version: Id3,
448
+ cohortHash: Hash2,
449
+ completedSamples: z5.number().int().nonnegative(),
450
+ partialSamples: z5.number().int().nonnegative(),
451
+ scope: z5.enum(["workspace", "authorized_aggregate"])
452
+ }).strict(),
453
+ assumptions: z5.array(z5.string().trim().min(1).max(1e3)).max(50),
454
+ unknowns: z5.array(z5.string().trim().min(1).max(1e3)).max(50),
455
+ review: TrainingEstimateReviewSchema
456
+ }).strict().superRefine((estimate, context) => {
457
+ if (estimate.review.estimateId !== estimate.id || estimate.review.inputHash !== estimate.inputHash || estimate.review.requestHash !== estimate.requestHash || estimate.review.pricingVersion !== estimate.pricing.version || estimate.review.expiresAt !== estimate.expiresAt) {
458
+ context.addIssue({ code: "custom", path: ["review"], message: "Estimate review identity differs from the estimate" });
459
+ }
460
+ if (Date.parse(estimate.expiresAt) <= Date.parse(estimate.createdAt)) {
461
+ context.addIssue({ code: "custom", path: ["expiresAt"], message: "Estimate must expire after its creation" });
462
+ }
463
+ if (estimate.status === "available" && (estimate.cost.expectedUsd === null || estimate.executionSeconds.expected === null || estimate.unknowns.length > 0)) {
464
+ context.addIssue({ code: "custom", path: ["status"], message: "An available estimate requires complete cost and duration coverage" });
465
+ }
466
+ if (estimate.gpu.requested.mode === "manual" && estimate.gpu.resolved && (estimate.gpu.requested.availabilityId !== estimate.gpu.resolved.availabilityId || estimate.gpu.requested.gpuType !== estimate.gpu.resolved.gpuType)) {
467
+ context.addIssue({ code: "custom", path: ["gpu"], message: "An explicit GPU offering cannot be substituted" });
468
+ }
469
+ });
470
+ function createTrainingEstimateClient(request) {
471
+ return {
472
+ async estimate(input) {
473
+ const parsed = TrainingEstimateRequestSchema.parse(input);
474
+ if (parsed.source.kind === "submission") await parseAndVerifyTrainingJobSubmission(parsed.source.submission);
475
+ const result = TrainingEstimateSchema.parse(await request("/v1/training/estimates", {
476
+ method: "POST",
477
+ body: JSON.stringify(parsed)
478
+ }));
479
+ if (result.teamId !== parsed.teamId || result.requestHash !== await canonicalSha256(parsed) || await canonicalSha256(result.source) !== await canonicalSha256(trainingEstimateSourceIdentity(parsed.source)) || parsed.gpuSelection && await canonicalSha256(result.gpu.requested) !== await canonicalSha256(parsed.gpuSelection)) {
480
+ throw new OpenPondProtocolError("training_estimate_scope_mismatch", "The estimate does not match the requested workspace and exact configuration.");
481
+ }
482
+ return result;
483
+ }
484
+ };
485
+ }
486
+
487
+ // src/training-queue.ts
488
+ import { z as z6 } from "zod";
489
+ var Timestamp2 = z6.string().datetime({ offset: true });
490
+ var TrainingQueueStatusSchema = z6.object({
491
+ ticketId: z6.string().trim().min(1).max(191),
492
+ ticketNumber: z6.number().int().positive().max(Number.MAX_SAFE_INTEGER),
493
+ label: z6.literal("Waiting for resources"),
494
+ position: z6.number().int().positive().nullable(),
495
+ positionScope: z6.literal("compatible_fair_queue"),
496
+ enqueuedAt: Timestamp2,
497
+ asOf: Timestamp2,
498
+ estimate: z6.object({
499
+ revision: z6.number().int().nonnegative(),
500
+ estimatedStartAt: Timestamp2,
501
+ expiresAt: Timestamp2,
502
+ evidence: z6.enum(["observed_capacity", "measured_bootstrap", "scheduled_release"])
503
+ }).strict().nullable()
504
+ }).strict().superRefine((value, context) => {
505
+ if (value.estimate && Date.parse(value.estimate.expiresAt) <= Date.parse(value.asOf))
506
+ context.addIssue({ code: "custom", path: ["estimate"], message: "An expired queue forecast must be returned as unavailable" });
507
+ });
508
+
252
509
  // src/training-harness-sources.ts
253
- import { z as z3 } from "zod";
254
- var TrainingHarnessSourcePublicationSchema = z3.object({
255
- schemaVersion: z3.literal("openpond.trainingHarnessSourcePublication.v1"),
510
+ import { z as z7 } from "zod";
511
+ var TrainingHarnessSourcePublicationSchema = z7.object({
512
+ schemaVersion: z7.literal("openpond.trainingHarnessSourcePublication.v1"),
256
513
  harnessRelease: ImmutableReleaseRefSchema,
257
- sourcePackageHash: z3.string().regex(/^[a-f0-9]{64}$/),
258
- sizeBytes: z3.number().int().positive().max(TRAINING_INPUT_ARTIFACT_MAX_BYTES)
514
+ sourcePackageHash: z7.string().regex(/^[a-f0-9]{64}$/),
515
+ sizeBytes: z7.number().int().positive().max(TRAINING_INPUT_ARTIFACT_MAX_BYTES)
259
516
  }).strict();
260
517
  function createTrainingHarnessSourceClient(request) {
261
518
  const route = (reference) => {
@@ -288,28 +545,28 @@ function validateSource(value, reference) {
288
545
  }
289
546
 
290
547
  // src/training-candidate-decisions.ts
291
- import { z as z4 } from "zod";
292
- var IdSchema = /* @__PURE__ */ (() => z4.string().trim().min(1).max(500))();
293
- var HashSchema = /* @__PURE__ */ (() => z4.string().regex(/^[a-f0-9]{64}$/))();
294
- var TrainingCandidateDecisionRequestSchema = /* @__PURE__ */ (() => z4.object({
295
- schemaVersion: z4.literal("openpond.trainingCandidateDecisionRequest.v1"),
548
+ import { z as z8 } from "zod";
549
+ var IdSchema = /* @__PURE__ */ (() => z8.string().trim().min(1).max(500))();
550
+ var HashSchema = /* @__PURE__ */ (() => z8.string().regex(/^[a-f0-9]{64}$/))();
551
+ var TrainingCandidateDecisionRequestSchema = /* @__PURE__ */ (() => z8.object({
552
+ schemaVersion: z8.literal("openpond.trainingCandidateDecisionRequest.v1"),
296
553
  teamId: IdSchema,
297
554
  jobId: IdSchema,
298
555
  artifact: ModelProjectImmutableRefSchema,
299
556
  evaluation: ModelProjectImmutableRefSchema,
300
557
  executionReceipt: ModelProjectImmutableRefSchema,
301
- decision: z4.enum(["accepted", "rejected"]),
302
- reason: z4.string().trim().min(1).max(5e3),
558
+ decision: z8.enum(["accepted", "rejected"]),
559
+ reason: z8.string().trim().min(1).max(5e3),
303
560
  idempotencyKey: IdSchema,
304
561
  expectedDecision: ModelProjectImmutableRefSchema.nullable()
305
562
  }).strict())();
306
- var TrainingCandidateDecisionSchema = /* @__PURE__ */ (() => z4.object({
307
- schemaVersion: z4.literal("openpond.trainingCandidateDecision.v1"),
563
+ var TrainingCandidateDecisionSchema = /* @__PURE__ */ (() => z8.object({
564
+ schemaVersion: z8.literal("openpond.trainingCandidateDecision.v1"),
308
565
  id: IdSchema,
309
566
  request: TrainingCandidateDecisionRequestSchema,
310
- revision: z4.number().int().positive(),
311
- actor: z4.object({ userId: IdSchema, kind: z4.enum(["user", "api_key", "agent_delegate"]), id: IdSchema }).strict(),
312
- decidedAt: z4.string().datetime({ offset: true }),
567
+ revision: z8.number().int().positive(),
568
+ actor: z8.object({ userId: IdSchema, kind: z8.enum(["user", "api_key", "agent_delegate"]), id: IdSchema }).strict(),
569
+ decidedAt: z8.string().datetime({ offset: true }),
313
570
  contentHash: HashSchema
314
571
  }).strict().superRefine((value, context) => {
315
572
  if (value.revision === 1 !== (value.request.expectedDecision === null)) {
@@ -346,7 +603,7 @@ function createTrainingCandidateDecisionClient(request) {
346
603
  IdSchema.parse(target.teamId);
347
604
  const reference = options.decision ? ModelProjectImmutableRefSchema.parse(options.decision) : void 0;
348
605
  const query = reference ? `?decisionId=${encodeURIComponent(reference.id)}` : "";
349
- const response = z4.object({ decision: z4.unknown().nullable() }).strict().parse(await request(`${route(target)}${query}`));
606
+ const response = z8.object({ decision: z8.unknown().nullable() }).strict().parse(await request(`${route(target)}${query}`));
350
607
  if (response.decision === null && !reference) return null;
351
608
  const decision = await parseAndVerifyTrainingCandidateDecision(response.decision, target);
352
609
  if (reference && (decision.id !== reference.id || decision.contentHash !== reference.contentHash)) {
@@ -363,38 +620,38 @@ function createTrainingCandidateDecisionClient(request) {
363
620
  }
364
621
 
365
622
  // src/training-evaluation-results.ts
366
- import { z as z5 } from "zod";
367
- var IdSchema2 = /* @__PURE__ */ (() => z5.string().trim().min(1).max(500))();
368
- var HashSchema2 = /* @__PURE__ */ (() => z5.string().regex(/^[a-f0-9]{64}$/))();
369
- var TrainingEvaluationTaskResultSchema = /* @__PURE__ */ (() => z5.object({
623
+ import { z as z9 } from "zod";
624
+ var IdSchema2 = /* @__PURE__ */ (() => z9.string().trim().min(1).max(500))();
625
+ var HashSchema2 = /* @__PURE__ */ (() => z9.string().regex(/^[a-f0-9]{64}$/))();
626
+ var TrainingEvaluationTaskResultSchema = /* @__PURE__ */ (() => z9.object({
370
627
  taskId: IdSchema2,
371
628
  taskSha256: HashSchema2,
372
629
  resultSha256: HashSchema2,
373
- input: z5.object({
374
- instruction: z5.string().max(1e6),
375
- context: z5.record(z5.string(), z5.unknown())
630
+ input: z9.object({
631
+ instruction: z9.string().max(1e6),
632
+ context: z9.record(z9.string(), z9.unknown())
376
633
  }).strict(),
377
- output: z5.string().max(1e6),
634
+ output: z9.string().max(1e6),
378
635
  outputSha256: HashSchema2,
379
- score: z5.number().finite().min(0).max(1),
380
- evidence: z5.object({
381
- kind: z5.enum(["worker_command", "hosted_trace", "local_trace"]),
636
+ score: z9.number().finite().min(0).max(1),
637
+ evidence: z9.object({
638
+ kind: z9.enum(["worker_command", "hosted_trace", "local_trace"]),
382
639
  id: IdSchema2
383
640
  }).strict()
384
641
  }).strict())();
385
- var TrainingEvaluationTaskPageSchema = /* @__PURE__ */ (() => z5.object({
386
- schemaVersion: z5.literal("openpond.trainingEvaluationTaskPage.v1"),
642
+ var TrainingEvaluationTaskPageSchema = /* @__PURE__ */ (() => z9.object({
643
+ schemaVersion: z9.literal("openpond.trainingEvaluationTaskPage.v1"),
387
644
  jobId: IdSchema2,
388
645
  teamId: IdSchema2,
389
646
  evaluation: ModelProjectImmutableRefSchema,
390
- kind: z5.enum(["baseline", "candidate"]),
391
- policyVersion: z5.number().int().nonnegative(),
647
+ kind: z9.enum(["baseline", "candidate"]),
648
+ policyVersion: z9.number().int().nonnegative(),
392
649
  taskset: ModelProjectVersionedRefSchema,
393
650
  panelSha256: HashSchema2,
394
- offset: z5.number().int().nonnegative(),
395
- total: z5.number().int().min(1).max(1e4),
396
- tasks: z5.array(TrainingEvaluationTaskResultSchema).min(1).max(100),
397
- nextCursor: z5.string().regex(/^[1-9]\d*$/).nullable(),
651
+ offset: z9.number().int().nonnegative(),
652
+ total: z9.number().int().min(1).max(1e4),
653
+ tasks: z9.array(TrainingEvaluationTaskResultSchema).min(1).max(100),
654
+ nextCursor: z9.string().regex(/^[1-9]\d*$/).nullable(),
398
655
  contentHash: HashSchema2
399
656
  }).strict().superRefine((page, context) => {
400
657
  const end = page.offset + page.tasks.length;
@@ -429,12 +686,12 @@ async function parseAndVerifyTrainingEvaluationTaskPage(value, expected) {
429
686
  }
430
687
 
431
688
  // src/training-grading-plan.ts
432
- import { z as z6 } from "zod";
689
+ import { z as z10 } from "zod";
433
690
  import { compileBoundGraders, RewardBindingSchema, RewardReleaseSchema } from "@openpond/evals/rewards";
434
- var GradersSchema = z6.array(z6.object({ id: z6.string().trim().min(1) }).catchall(z6.unknown())).min(1).max(1e3);
435
- var RewardExecutionSchema = z6.object({
691
+ var GradersSchema = z10.array(z10.object({ id: z10.string().trim().min(1) }).catchall(z10.unknown())).min(1).max(1e3);
692
+ var RewardExecutionSchema = z10.object({
436
693
  binding: RewardBindingSchema,
437
- rewards: z6.array(RewardReleaseSchema).min(1).max(100)
694
+ rewards: z10.array(RewardReleaseSchema).min(1).max(100)
438
695
  }).strict();
439
696
  async function deterministicTrainingRewardSource(input) {
440
697
  const execution = input.rewardExecution ? RewardExecutionSchema.parse(input.rewardExecution) : null;
@@ -442,32 +699,32 @@ async function deterministicTrainingRewardSource(input) {
442
699
  if (new Set(graders.map((grader) => grader.id)).size !== graders.length) {
443
700
  throw new Error("Training grader identities must be unique.");
444
701
  }
445
- const hash = await canonicalSha256({ schemaVersion: "openpond.trainingGraderSet.v1", graders });
702
+ const hash2 = await canonicalSha256({ schemaVersion: "openpond.trainingGraderSet.v1", graders });
446
703
  return {
447
704
  kind: "deterministic",
448
- grader: { id: `training-graders-${hash.slice(0, 32)}`, contentHash: hash },
705
+ grader: { id: `training-graders-${hash2.slice(0, 32)}`, contentHash: hash2 },
449
706
  composer: execution ? { id: execution.binding.id, contentHash: execution.binding.contentHash } : null
450
707
  };
451
708
  }
452
709
 
453
710
  // src/training-evaluation-source.ts
454
- import { z as z7 } from "zod";
711
+ import { z as z11 } from "zod";
455
712
  var TRAINING_EVALUATION_SOURCE_PATH = "evaluation-source.json";
456
- var TaskIdentitySchema = z7.object({
457
- id: z7.string().trim().min(1),
458
- clusterKey: z7.string().trim().min(1),
459
- split: z7.enum(["train", "validation", "frozen_eval"])
713
+ var TaskIdentitySchema = z11.object({
714
+ id: z11.string().trim().min(1),
715
+ clusterKey: z11.string().trim().min(1),
716
+ split: z11.enum(["train", "validation", "frozen_eval"])
460
717
  }).passthrough();
461
- var TrainingEvaluationSourceSchema = z7.object({
462
- schemaVersion: z7.literal("openpond.trainingEvaluationSource.v1"),
718
+ var TrainingEvaluationSourceSchema = z11.object({
719
+ schemaVersion: z11.literal("openpond.trainingEvaluationSource.v1"),
463
720
  taskset: ModelProjectVersionedRefSchema,
464
- tasks: z7.array(TaskIdentitySchema).min(1).max(1e4),
465
- assets: z7.array(z7.object({
466
- path: z7.string().trim().min(1).max(2e3),
467
- sha256: z7.string().regex(/^[a-f0-9]{64}$/),
468
- sizeBytes: z7.number().int().nonnegative(),
469
- encoding: z7.literal("base64"),
470
- content: z7.string().max(32 * 1024 * 1024)
721
+ tasks: z11.array(TaskIdentitySchema).min(1).max(1e4),
722
+ assets: z11.array(z11.object({
723
+ path: z11.string().trim().min(1).max(2e3),
724
+ sha256: z11.string().regex(/^[a-f0-9]{64}$/),
725
+ sizeBytes: z11.number().int().nonnegative(),
726
+ encoding: z11.literal("base64"),
727
+ content: z11.string().max(32 * 1024 * 1024)
471
728
  }).strict()).max(1e4)
472
729
  }).strict().superRefine((source, context) => {
473
730
  const ids = /* @__PURE__ */ new Set();
@@ -478,8 +735,8 @@ var TrainingEvaluationSourceSchema = z7.object({
478
735
  });
479
736
  });
480
737
  function assertTrainingEvaluationIsolation(trainingTasks, evaluationTasks) {
481
- const training = z7.array(TaskIdentitySchema).min(1).max(1e4).parse(trainingTasks);
482
- const evaluation = z7.array(TaskIdentitySchema).min(1).max(1e4).parse(evaluationTasks);
738
+ const training = z11.array(TaskIdentitySchema).min(1).max(1e4).parse(trainingTasks);
739
+ const evaluation = z11.array(TaskIdentitySchema).min(1).max(1e4).parse(evaluationTasks);
483
740
  const trainIds = /* @__PURE__ */ new Set();
484
741
  const trainFamilies = /* @__PURE__ */ new Set();
485
742
  for (const task of training) {
@@ -500,29 +757,29 @@ function assertTrainingEvaluationIsolation(trainingTasks, evaluationTasks) {
500
757
  }
501
758
  async function trainingEvaluationSourceRef(input) {
502
759
  const source = TrainingEvaluationSourceSchema.parse(input);
503
- const hash = await canonicalSha256(source);
504
- return { taskset: source.taskset, dataset: { id: `training-evaluation-${hash.slice(0, 32)}`, contentHash: hash } };
760
+ const hash2 = await canonicalSha256(source);
761
+ return { taskset: source.taskset, dataset: { id: `training-evaluation-${hash2.slice(0, 32)}`, contentHash: hash2 } };
505
762
  }
506
763
 
507
764
  // src/training.ts
508
- var IdSchema3 = z8.string().trim().min(1).max(500);
509
- var HashSchema3 = z8.string().regex(/^[a-f0-9]{64}$/);
510
- var TimestampSchema = z8.string().datetime({ offset: true });
511
- var TrainingInputArtifactUploadSchema = z8.object({
512
- schemaVersion: z8.literal("openpond.trainingInputArtifactUpload.v2"),
513
- kind: z8.enum(["portable_training_bundle", "reward_model_dataset"]),
514
- idempotencyKey: z8.string().trim().min(1).max(500),
765
+ var IdSchema3 = z12.string().trim().min(1).max(500);
766
+ var HashSchema3 = z12.string().regex(/^[a-f0-9]{64}$/);
767
+ var TimestampSchema = z12.string().datetime({ offset: true });
768
+ var TrainingInputArtifactUploadSchema = z12.object({
769
+ schemaVersion: z12.literal("openpond.trainingInputArtifactUpload.v2"),
770
+ kind: z12.enum(["portable_training_bundle", "reward_model_dataset"]),
771
+ idempotencyKey: z12.string().trim().min(1).max(500),
515
772
  sourceManifest: ModelProjectImmutableRefSchema,
516
- payload: z8.unknown(),
773
+ payload: z12.unknown(),
517
774
  contentHash: HashSchema3
518
775
  }).strict();
519
- var TrainingInputArtifactSchema = z8.object({
520
- schemaVersion: z8.literal("openpond.trainingInputArtifact.v2"),
521
- kind: z8.enum(["portable_training_bundle", "reward_model_dataset"]),
776
+ var TrainingInputArtifactSchema = z12.object({
777
+ schemaVersion: z12.literal("openpond.trainingInputArtifact.v2"),
778
+ kind: z12.enum(["portable_training_bundle", "reward_model_dataset"]),
522
779
  sourceManifest: ModelProjectImmutableRefSchema,
523
- artifactRef: z8.string().trim().min(1).max(2e3),
780
+ artifactRef: z12.string().trim().min(1).max(2e3),
524
781
  contentHash: HashSchema3,
525
- sizeBytes: z8.number().int().positive(),
782
+ sizeBytes: z12.number().int().positive(),
526
783
  createdAt: TimestampSchema
527
784
  }).strict();
528
785
  async function trainingInputArtifactUploadHash(upload) {
@@ -541,8 +798,8 @@ async function parseAndVerifyTrainingInputArtifactUpload(value) {
541
798
  }
542
799
  return parsed;
543
800
  }
544
- var TrainingJobKindSchema = z8.enum(["reward_model_train", "policy_optimize"]);
545
- var TrainingJobStateSchema = z8.enum([
801
+ var TrainingJobKindSchema = z12.enum(["reward_model_train", "policy_optimize"]);
802
+ var TrainingJobStateSchema = z12.enum([
546
803
  "queued",
547
804
  "admitting",
548
805
  "provisioning",
@@ -553,53 +810,53 @@ var TrainingJobStateSchema = z8.enum([
553
810
  "failed",
554
811
  "cancelled"
555
812
  ]);
556
- var TrainingCapabilityRequirementSchema = z8.object({
813
+ var TrainingCapabilityRequirementSchema = z12.object({
557
814
  id: IdSchema3,
558
- version: z8.string().trim().min(1).max(200).nullable().default(null),
559
- required: z8.boolean().default(true)
815
+ version: z12.string().trim().min(1).max(200).nullable().default(null),
816
+ required: z12.boolean().default(true)
560
817
  }).strict();
561
- var TrainingJobSourceSchema = z8.object({
818
+ var TrainingJobSourceSchema = z12.object({
562
819
  origin: TrainingHandoffOriginSchema.optional(),
563
- modelProject: z8.object({
820
+ modelProject: z12.object({
564
821
  id: IdSchema3,
565
822
  portableProjectId: IdSchema3,
566
- revision: z8.number().int().positive(),
823
+ revision: z12.number().int().positive(),
567
824
  contentHash: HashSchema3
568
825
  }).strict(),
569
826
  harnessRunManifest: ModelProjectImmutableRefSchema,
570
827
  harnessRelease: ModelProjectImmutableRefSchema,
571
828
  taskset: ModelProjectVersionedRefSchema,
572
829
  tasksetRelease: ModelProjectImmutableRefSchema,
573
- evaluation: z8.object({
830
+ evaluation: z12.object({
574
831
  taskset: ModelProjectVersionedRefSchema,
575
832
  dataset: ModelProjectImmutableRefSchema
576
833
  }).strict().nullable().optional(),
577
834
  dataset: ModelProjectImmutableRefSchema,
578
- evidenceSets: z8.array(ModelProjectImmutableRefSchema).max(1e4)
835
+ evidenceSets: z12.array(ModelProjectImmutableRefSchema).max(1e4)
579
836
  }).strict();
580
- var RewardModelTrainingRequestSchema = z8.object({
581
- kind: z8.literal("reward_model_train"),
837
+ var RewardModelTrainingRequestSchema = z12.object({
838
+ kind: z12.literal("reward_model_train"),
582
839
  baseModel: ModelProjectBaseModelSchema,
583
840
  preferenceDatasetRelease: ModelProjectImmutableRefSchema,
584
841
  processorRelease: ModelProjectImmutableRefSchema,
585
- recipe: z8.object({
586
- schemaVersion: z8.literal("openpond.rewardModelRecipe.v1"),
587
- method: z8.literal("reward_model"),
588
- parameterization: z8.literal("lora_with_scalar_head")
589
- }).catchall(z8.unknown())
842
+ recipe: z12.object({
843
+ schemaVersion: z12.literal("openpond.rewardModelRecipe.v1"),
844
+ method: z12.literal("reward_model"),
845
+ parameterization: z12.literal("lora_with_scalar_head")
846
+ }).catchall(z12.unknown())
590
847
  }).strict();
591
- var DeterministicRewardSourceSchema = z8.object({
592
- kind: z8.literal("deterministic"),
848
+ var DeterministicRewardSourceSchema = z12.object({
849
+ kind: z12.literal("deterministic"),
593
850
  grader: ModelProjectImmutableRefSchema,
594
851
  composer: ModelProjectImmutableRefSchema.nullable().default(null)
595
852
  }).strict();
596
- var LearnedRewardSourceSchema = z8.object({
597
- kind: z8.literal("learned_reward"),
853
+ var LearnedRewardSourceSchema = z12.object({
854
+ kind: z12.literal("learned_reward"),
598
855
  rewardModelVersion: ModelProjectImmutableRefSchema,
599
856
  qualificationReport: ModelProjectImmutableRefSchema.nullable().default(null),
600
- evaluationReferences: z8.array(ModelProjectImmutableRefSchema).max(1e3).default([]),
601
- scorerArtifact: z8.object({
602
- artifactRef: z8.string().trim().min(1).max(2e3),
857
+ evaluationReferences: z12.array(ModelProjectImmutableRefSchema).max(1e3).default([]),
858
+ scorerArtifact: z12.object({
859
+ artifactRef: z12.string().trim().min(1).max(2e3),
603
860
  contentHash: HashSchema3,
604
861
  executionReceipt: ModelProjectImmutableRefSchema
605
862
  }).strict(),
@@ -607,49 +864,54 @@ var LearnedRewardSourceSchema = z8.object({
607
864
  rewardComposerRelease: ModelProjectImmutableRefSchema
608
865
  }).strict();
609
866
  var TrainingQualificationBaseModelSchema = ModelProjectBaseModelSchema.extend({
610
- revision: z8.string().regex(/^[a-f0-9]{40,64}$/),
611
- tokenizerRevision: z8.string().regex(/^[a-f0-9]{40,64}$/),
867
+ revision: z12.string().regex(/^[a-f0-9]{40,64}$/),
868
+ tokenizerRevision: z12.string().regex(/^[a-f0-9]{40,64}$/),
612
869
  chatTemplateHash: HashSchema3
613
870
  }).strict();
614
- var PolicyOptimizationRequestSchema = z8.object({
615
- kind: z8.literal("policy_optimize"),
871
+ var PolicyOptimizationRequestSchema = z12.object({
872
+ kind: z12.literal("policy_optimize"),
616
873
  /** Collect and grade one original-learner group without optimizer work. */
617
- executionMode: z8.literal("qualification").optional(),
874
+ executionMode: z12.literal("qualification").optional(),
618
875
  baseModel: ModelProjectBaseModelSchema,
619
876
  recipe: ModelProjectRecipeDocumentSchema,
620
- rewardSource: z8.discriminatedUnion("kind", [
877
+ rewardSource: z12.discriminatedUnion("kind", [
621
878
  DeterministicRewardSourceSchema,
622
879
  LearnedRewardSourceSchema
623
880
  ]),
624
881
  resumeFrom: ModelProjectImmutableRefSchema.nullable().default(null)
625
882
  }).strict();
626
- var TrainingJobRequestSchema = z8.discriminatedUnion("kind", [
883
+ var TrainingJobRequestSchema = z12.discriminatedUnion("kind", [
627
884
  RewardModelTrainingRequestSchema,
628
885
  PolicyOptimizationRequestSchema
629
886
  ]);
630
- var TrainingJobApprovalSchema = z8.object({
887
+ var TrainingJobApprovalSchema = z12.object({
631
888
  approvalHash: HashSchema3,
632
889
  approvedAt: TimestampSchema,
633
- exportApproved: z8.boolean(),
634
- maximumSpendUsd: z8.number().nonnegative(),
635
- retentionDays: z8.number().int().nonnegative().nullable(),
636
- region: z8.string().trim().min(1).max(200).nullable().default(null)
890
+ exportApproved: z12.boolean(),
891
+ maximumSpendUsd: z12.number().nonnegative(),
892
+ retentionDays: z12.number().int().nonnegative().nullable(),
893
+ region: z12.string().trim().min(1).max(200).nullable().default(null)
637
894
  }).strict();
638
- var TrainingJobSubmissionSchema = z8.object({
639
- schemaVersion: z8.literal("openpond.trainingJobSubmission.v2"),
640
- idempotencyKey: z8.string().trim().min(1).max(500),
641
- name: z8.string().trim().min(1).max(200),
895
+ var TrainingJobSubmissionSchema = z12.object({
896
+ schemaVersion: z12.literal("openpond.trainingJobSubmission.v2"),
897
+ idempotencyKey: z12.string().trim().min(1).max(500),
898
+ name: z12.string().trim().min(1).max(200),
642
899
  source: TrainingJobSourceSchema,
643
900
  job: TrainingJobRequestSchema,
644
- requestedCapabilities: z8.array(TrainingCapabilityRequirementSchema).max(1e3),
645
- placementObjective: z8.enum(["fast", "balanced", "economical"]),
646
- budget: z8.object({
647
- maximumSpendUsd: z8.number().nonnegative(),
648
- maximumWallSeconds: z8.number().int().positive()
901
+ requestedCapabilities: z12.array(TrainingCapabilityRequirementSchema).max(1e3),
902
+ placementObjective: z12.enum(["fast", "balanced", "economical"]),
903
+ gpuSelection: TrainingGpuSelectionSchema.optional(),
904
+ physicalPlacement: TrainingPhysicalPlacementSchema.optional(),
905
+ budget: z12.object({
906
+ maximumSpendUsd: z12.number().nonnegative(),
907
+ maximumWallSeconds: z12.number().int().positive()
649
908
  }).strict(),
650
909
  approval: TrainingJobApprovalSchema,
651
910
  contentHash: HashSchema3
652
911
  }).strict().superRefine((submission, context) => {
912
+ if (submission.physicalPlacement && (submission.job.kind !== "policy_optimize" || submission.job.resumeFrom || submission.job.executionMode || submission.job.recipe.continuation !== void 0)) {
913
+ context.addIssue({ code: "custom", path: ["physicalPlacement"], message: "Reuse-only placement requires fresh-base policy training without continuation." });
914
+ }
653
915
  if (submission.job.kind === "policy_optimize" && submission.job.executionMode === "qualification") {
654
916
  const job = submission.job;
655
917
  if (!TrainingQualificationBaseModelSchema.safeParse(job.baseModel).success) {
@@ -694,87 +956,99 @@ async function parseAndVerifyTrainingJobSubmission(value) {
694
956
  }
695
957
  return parsed;
696
958
  }
697
- var TrainingJobSchema = z8.object({
698
- schemaVersion: z8.literal("openpond.trainingJob.v2"),
959
+ var TrainingJobRecoverySchema = z12.object({
960
+ resourceApproval: TrainingCheckpointRecoveryResourceApprovalSchema.optional(),
961
+ mode: z12.literal("evaluation_only").optional(),
962
+ trainingWorkloadComplete: z12.boolean().optional(),
963
+ sourceJobId: IdSchema3,
964
+ checkpointId: IdSchema3,
965
+ policyVersion: z12.number().int().positive(),
966
+ completedGroups: z12.number().int().positive(),
967
+ optimizerMode: z12.literal("continue")
968
+ }).strict();
969
+ var TrainingJobSchema = z12.object({
970
+ schemaVersion: z12.literal("openpond.trainingJob.v2"),
699
971
  id: IdSchema3,
700
972
  teamId: IdSchema3,
701
973
  kind: TrainingJobKindSchema,
702
- executionMode: z8.literal("qualification").optional(),
974
+ executionMode: z12.literal("qualification").optional(),
975
+ recovery: TrainingJobRecoverySchema.optional(),
703
976
  modelProjectId: IdSchema3,
704
977
  portableProjectId: IdSchema3,
705
- sourceProjectRevision: z8.number().int().positive(),
978
+ sourceProjectRevision: z12.number().int().positive(),
706
979
  submissionHash: HashSchema3,
707
980
  state: TrainingJobStateSchema,
708
- phase: z8.string().trim().min(1).max(200),
709
- version: z8.number().int().nonnegative(),
710
- progress: z8.number().min(0).max(1),
711
- rolloutProgress: z8.object({
712
- groupsCompleted: z8.number().int().nonnegative(),
713
- groupsTarget: z8.number().int().nonnegative(),
714
- optimizerUpdatesApplied: z8.number().int().nonnegative(),
715
- optimizerUpdatesSkipped: z8.number().int().nonnegative()
981
+ queue: TrainingQueueStatusSchema.optional(),
982
+ phase: z12.string().trim().min(1).max(200),
983
+ version: z12.number().int().nonnegative(),
984
+ progress: z12.number().min(0).max(1),
985
+ rolloutProgress: z12.object({
986
+ groupsCompleted: z12.number().int().nonnegative(),
987
+ groupsTarget: z12.number().int().nonnegative(),
988
+ optimizerUpdatesApplied: z12.number().int().nonnegative(),
989
+ optimizerUpdatesSkipped: z12.number().int().nonnegative()
716
990
  }).strict(),
717
- accruedSpendUsd: z8.number().nonnegative(),
718
- terminalReason: z8.string().trim().min(1).max(5e3).nullable(),
991
+ accruedSpendUsd: z12.number().nonnegative(),
992
+ terminalReason: z12.string().trim().min(1).max(5e3).nullable(),
719
993
  createdAt: TimestampSchema,
720
994
  updatedAt: TimestampSchema,
721
995
  completedAt: TimestampSchema.nullable()
722
996
  }).strict();
723
- var TrainingJobPageSchema = z8.object({
724
- schemaVersion: z8.literal("openpond.trainingJobPage.v2"),
725
- jobs: z8.array(TrainingJobSchema).max(1e3),
726
- nextCursor: z8.string().trim().min(1).max(2e3).nullable()
997
+ var TrainingJobPageSchema = z12.object({
998
+ schemaVersion: z12.literal("openpond.trainingJobPage.v2"),
999
+ jobs: z12.array(TrainingJobSchema).max(1e3),
1000
+ nextCursor: z12.string().trim().min(1).max(2e3).nullable()
727
1001
  }).strict();
728
- var TrainingJobEventSchema = z8.object({
729
- schemaVersion: z8.literal("openpond.trainingJobEvent.v2"),
1002
+ var TrainingJobEventSchema = z12.object({
1003
+ schemaVersion: z12.literal("openpond.trainingJobEvent.v2"),
730
1004
  id: IdSchema3,
731
1005
  jobId: IdSchema3,
732
- sequence: z8.number().int().nonnegative(),
1006
+ sequence: z12.number().int().nonnegative(),
733
1007
  type: IdSchema3,
734
- phase: z8.string().trim().min(1).max(200),
735
- message: z8.string().trim().min(1).max(5e3).nullable(),
736
- data: z8.record(z8.string(), z8.unknown()).default({}),
1008
+ phase: z12.string().trim().min(1).max(200),
1009
+ message: z12.string().trim().min(1).max(5e3).nullable(),
1010
+ data: z12.record(z12.string(), z12.unknown()).default({}),
737
1011
  createdAt: TimestampSchema
738
1012
  }).strict();
739
- var TrainingJobLogSchema = z8.object({
740
- schemaVersion: z8.literal("openpond.trainingJobLog.v2"),
1013
+ var TrainingJobLogSchema = z12.object({
1014
+ schemaVersion: z12.literal("openpond.trainingJobLog.v2"),
741
1015
  jobId: IdSchema3,
742
- sequence: z8.number().int().nonnegative(),
743
- level: z8.enum(["debug", "info", "warning", "error"]),
744
- message: z8.string().max(2e4),
1016
+ sequence: z12.number().int().nonnegative(),
1017
+ level: z12.enum(["debug", "info", "warning", "error"]),
1018
+ message: z12.string().max(2e4),
745
1019
  createdAt: TimestampSchema
746
1020
  }).strict();
747
- var TrainingJobControlRequestSchema = z8.object({ expectedVersion: z8.number().int().nonnegative() }).strict();
748
- var TrainingJobOutputSchema = z8.object({
749
- schemaVersion: z8.literal("openpond.trainingJobOutput.v2"),
1021
+ var TrainingJobControlRequestSchema = z12.object({ expectedVersion: z12.number().int().nonnegative() }).strict();
1022
+ var TrainingJobOutputSchema = z12.object({
1023
+ schemaVersion: z12.literal("openpond.trainingJobOutput.v2"),
750
1024
  id: IdSchema3,
751
1025
  jobId: IdSchema3,
752
- kind: z8.enum(["checkpoint", "adapter", "scorer", "metrics", "evaluation", "trace", "receipt"]),
753
- artifactRef: z8.string().trim().min(1).max(2e3),
1026
+ kind: z12.enum(["checkpoint", "adapter", "scorer", "metrics", "evaluation", "trace", "receipt"]),
1027
+ artifactRef: z12.string().trim().min(1).max(2e3),
754
1028
  contentHash: HashSchema3,
755
- sizeBytes: z8.number().int().nonnegative(),
756
- metadata: z8.record(z8.string(), z8.unknown()).default({}),
1029
+ sizeBytes: z12.number().int().nonnegative(),
1030
+ metadata: z12.record(z12.string(), z12.unknown()).default({}),
757
1031
  createdAt: TimestampSchema
758
1032
  }).strict();
759
- var TrainingQualificationEvidenceSchema = z8.object({
760
- schemaVersion: z8.literal("openpond.trainingQualificationEvidence.v1"),
1033
+ var TrainingQualificationEvidenceSchema = z12.object({
1034
+ schemaVersion: z12.literal("openpond.trainingQualificationEvidence.v1"),
761
1035
  baseModel: TrainingQualificationBaseModelSchema,
762
1036
  group: ModelProjectImmutableRefSchema,
763
- rolloutReceipts: z8.array(ModelProjectImmutableRefSchema).min(1).max(1e3),
1037
+ rolloutReceipts: z12.array(ModelProjectImmutableRefSchema).min(1).max(1e3),
764
1038
  rewardEvidenceHash: HashSchema3,
765
- groupsCompleted: z8.literal(1),
766
- optimizerUpdatesApplied: z8.literal(0),
767
- optimizerUpdatesSkipped: z8.literal(0),
768
- trainingStepsCreated: z8.literal(0),
769
- checkpointsCreated: z8.literal(0),
770
- artifactsCreated: z8.literal(0)
1039
+ groupsCompleted: z12.literal(1),
1040
+ optimizerUpdatesApplied: z12.literal(0),
1041
+ optimizerUpdatesSkipped: z12.literal(0),
1042
+ trainingStepsCreated: z12.literal(0),
1043
+ checkpointsCreated: z12.literal(0),
1044
+ artifactsCreated: z12.literal(0)
771
1045
  }).strict().superRefine((evidence, context) => {
772
1046
  if (new Set(evidence.rolloutReceipts.map((receipt) => receipt.id)).size !== evidence.rolloutReceipts.length) {
773
1047
  context.addIssue({ code: "custom", path: ["rolloutReceipts"], message: "Qualification rollout receipt identities must be unique." });
774
1048
  }
775
1049
  });
776
- var TrainingExecutionReceiptSchema = z8.object({
777
- schemaVersion: z8.literal("openpond.trainingExecutionReceipt.v2"),
1050
+ var TrainingExecutionReceiptSchema = z12.object({
1051
+ schemaVersion: z12.literal("openpond.trainingExecutionReceipt.v2"),
778
1052
  id: IdSchema3,
779
1053
  teamId: IdSchema3,
780
1054
  jobId: IdSchema3,
@@ -783,15 +1057,15 @@ var TrainingExecutionReceiptSchema = z8.object({
783
1057
  recipeHash: HashSchema3,
784
1058
  capabilityHash: HashSchema3,
785
1059
  runtimeRelease: ModelProjectImmutableRefSchema,
786
- inputs: z8.array(ModelProjectImmutableRefSchema).max(1e4),
787
- outputs: z8.array(ModelProjectImmutableRefSchema).max(1e4),
788
- spendUsd: z8.number().nonnegative(),
789
- durationSeconds: z8.number().nonnegative(),
790
- cleanupComplete: z8.boolean(),
1060
+ inputs: z12.array(ModelProjectImmutableRefSchema).max(1e4),
1061
+ outputs: z12.array(ModelProjectImmutableRefSchema).max(1e4),
1062
+ spendUsd: z12.number().nonnegative(),
1063
+ durationSeconds: z12.number().nonnegative(),
1064
+ cleanupComplete: z12.boolean(),
791
1065
  qualification: TrainingQualificationEvidenceSchema.optional(),
792
1066
  issuer: IdSchema3,
793
1067
  issuedAt: TimestampSchema,
794
- signature: z8.string().trim().min(1).max(1e4).nullable()
1068
+ signature: z12.string().trim().min(1).max(1e4).nullable()
795
1069
  }).strict();
796
1070
  async function trainingExecutionReceiptHash(receipt) {
797
1071
  return canonicalSha256(TrainingExecutionReceiptSchema.parse(receipt));
@@ -846,18 +1120,18 @@ async function assertTrainingQualificationReceipt(receipt, expected) {
846
1120
  throw new OpenPondProtocolError("qualification_updated_artifact", "Qualification must not publish trained artifacts or checkpoints.");
847
1121
  }
848
1122
  }
849
- var TrainingJobOutputsSchema = z8.object({
850
- schemaVersion: z8.literal("openpond.trainingJobOutputs.v2"),
851
- outputs: z8.array(TrainingJobOutputSchema).max(1e4),
1123
+ var TrainingJobOutputsSchema = z12.object({
1124
+ schemaVersion: z12.literal("openpond.trainingJobOutputs.v2"),
1125
+ outputs: z12.array(TrainingJobOutputSchema).max(1e4),
852
1126
  receipt: TrainingExecutionReceiptSchema.nullable()
853
1127
  }).strict();
854
- var TrainingApiErrorSchema = z8.object({
855
- schemaVersion: z8.literal("openpond.trainingApiError.v2"),
856
- code: z8.string().trim().min(1).max(200),
857
- message: z8.string().trim().min(1).max(5e3),
858
- retryable: z8.boolean().default(false),
859
- requestId: z8.string().trim().min(1).max(500).nullable().default(null),
860
- details: z8.record(z8.string(), z8.unknown()).default({})
1128
+ var TrainingApiErrorSchema = z12.object({
1129
+ schemaVersion: z12.literal("openpond.trainingApiError.v2"),
1130
+ code: z12.string().trim().min(1).max(200),
1131
+ message: z12.string().trim().min(1).max(5e3),
1132
+ retryable: z12.boolean().default(false),
1133
+ requestId: z12.string().trim().min(1).max(500).nullable().default(null),
1134
+ details: z12.record(z12.string(), z12.unknown()).default({})
861
1135
  }).strict();
862
1136
  var OpenPondTrainingApiError = class extends Error {
863
1137
  status;
@@ -875,31 +1149,56 @@ var OpenPondTrainingApiError = class extends Error {
875
1149
  this.details = error.details;
876
1150
  }
877
1151
  };
878
- var TrainingCapabilitiesSchema = z8.object({
879
- schemaVersion: z8.literal("openpond.trainingCapabilities.v2"),
1152
+ var TrainingPolicyLoraCapabilitiesSchema = z12.object({
1153
+ workerImageDigest: z12.string().regex(/^sha256:[a-f0-9]{64}$/),
1154
+ envelopeRank: z12.number().int().positive().max(256),
1155
+ supportedRanks: z12.array(z12.number().int().positive().max(256)).max(256),
1156
+ qualification: z12.object({ evidenceRef: z12.string().min(1), evidenceSha256: HashSchema3 }).strict().nullable(),
1157
+ continuation: z12.object({
1158
+ sharedRequiresSameRank: z12.literal(true),
1159
+ mergedRequiresSameRank: z12.literal(true),
1160
+ residualAppendRequiresFreeCapacity: z12.literal(true),
1161
+ stageOptimizer: z12.literal("reset"),
1162
+ interruptedRecoveryOptimizer: z12.literal("restore")
1163
+ }).strict()
1164
+ }).strict().superRefine((value, context) => {
1165
+ if (new Set(value.supportedRanks).size !== value.supportedRanks.length || value.supportedRanks.some((rank) => rank > value.envelopeRank))
1166
+ context.addIssue({ code: "custom", path: ["supportedRanks"], message: "Supported ranks must be unique and fit the physical adapter envelope." });
1167
+ if (value.supportedRanks.length && !value.qualification)
1168
+ context.addIssue({ code: "custom", path: ["qualification"], message: "Advertised ranks require immutable image qualification evidence." });
1169
+ });
1170
+ function supportsTrainingPolicyLoraRank(capabilities, rank, continuation) {
1171
+ if (!capabilities.supportedRanks.includes(rank)) return false;
1172
+ if (!continuation) return true;
1173
+ return continuation.mode === "residual_append" ? continuation.parentEnabledRank + rank <= capabilities.envelopeRank : continuation.parentEnabledRank === rank;
1174
+ }
1175
+ var TrainingCapabilitiesSchema = z12.object({
1176
+ schemaVersion: z12.literal("openpond.trainingCapabilities.v2"),
880
1177
  capabilityHash: HashSchema3,
881
- jobKinds: z8.array(TrainingJobKindSchema),
882
- methods: z8.array(z8.string().trim().min(1).max(200)),
883
- executionModes: z8.array(z8.enum(["training", "qualification"])).optional(),
884
- structuredOutputs: z8.object({
885
- capability: z8.literal("work.structured-output.v1"),
1178
+ jobKinds: z12.array(TrainingJobKindSchema),
1179
+ methods: z12.array(z12.string().trim().min(1).max(200)),
1180
+ executionModes: z12.array(z12.enum(["training", "qualification"])).optional(),
1181
+ policyLora: TrainingPolicyLoraCapabilitiesSchema.optional(),
1182
+ structuredOutputs: z12.object({
1183
+ capability: z12.literal("work.structured-output.v1"),
886
1184
  harnessRuntimeHash: HashSchema3,
887
1185
  workHarnessHash: HashSchema3,
888
1186
  schemaHash: HashSchema3,
889
1187
  artifactHash: HashSchema3,
890
- invalidDataRejected: z8.literal(true),
891
- invalidBytesRejected: z8.literal(true)
1188
+ invalidDataRejected: z12.literal(true),
1189
+ invalidBytesRejected: z12.literal(true)
892
1190
  }).strict().optional(),
893
- placements: z8.array(z8.enum(["local", "remote", "colocated", "provider_native"])),
894
- controls: z8.object({
895
- cancel: z8.boolean(),
896
- stopAfterGroup: z8.boolean(),
897
- resumeFromCheckpoint: z8.boolean()
1191
+ placements: z12.array(z12.enum(["local", "remote", "colocated", "provider_native"])),
1192
+ controls: z12.object({
1193
+ cancel: z12.boolean(),
1194
+ stopAfterGroup: z12.boolean(),
1195
+ resumeFromCheckpoint: z12.boolean()
898
1196
  }).strict(),
899
- limits: z8.object({
900
- maximumSpendUsd: z8.number().nonnegative(),
901
- maximumWallSeconds: z8.number().int().positive(),
902
- maximumArtifactBytes: z8.number().int().positive()
1197
+ estimates: z12.object({ schemaVersion: z12.literal("openpond.trainingEstimate.v1") }).strict().optional(),
1198
+ limits: z12.object({
1199
+ maximumSpendUsd: z12.number().nonnegative(),
1200
+ maximumWallSeconds: z12.number().int().positive(),
1201
+ maximumArtifactBytes: z12.number().int().positive()
903
1202
  }).strict(),
904
1203
  checkedAt: TimestampSchema,
905
1204
  expiresAt: TimestampSchema
@@ -953,6 +1252,7 @@ function createTrainingClient(input) {
953
1252
  return {
954
1253
  postTraining: createPostTrainingClient({ request }),
955
1254
  ...createTrainingPreparationClient(request),
1255
+ ...createTrainingEstimateClient(request),
956
1256
  ...createTrainingAcceptanceClient(request),
957
1257
  ...createTrainingHarnessSourceClient(request),
958
1258
  ...createTrainingCandidateDecisionClient(request),
@@ -961,6 +1261,9 @@ function createTrainingClient(input) {
961
1261
  unwrapObject(await request("/v1/training/capabilities"), "capabilities")
962
1262
  );
963
1263
  },
1264
+ async gpuCatalog() {
1265
+ return TrainingGpuCatalogSchema.parse(unwrapObject(await request("/v1/training/gpu-catalog"), "catalog"));
1266
+ },
964
1267
  async stageArtifact(upload) {
965
1268
  const parsed = await parseAndVerifyTrainingInputArtifactUpload(upload);
966
1269
  return TrainingInputArtifactSchema.parse(
@@ -991,10 +1294,10 @@ function createTrainingClient(input) {
991
1294
  parameters.set("modelProjectId", IdSchema3.parse(options.modelProjectId));
992
1295
  }
993
1296
  if (options.cursor) {
994
- parameters.set("cursor", z8.string().trim().min(1).max(2e3).parse(options.cursor));
1297
+ parameters.set("cursor", z12.string().trim().min(1).max(2e3).parse(options.cursor));
995
1298
  }
996
1299
  if (options.limit !== void 0) {
997
- parameters.set("limit", String(z8.number().int().min(1).max(1e3).parse(options.limit)));
1300
+ parameters.set("limit", String(z12.number().int().min(1).max(1e3).parse(options.limit)));
998
1301
  }
999
1302
  const query = parameters.size > 0 ? `?${parameters.toString()}` : "";
1000
1303
  return TrainingJobPageSchema.parse(await request(`/v1/training/jobs${query}`));
@@ -1031,8 +1334,20 @@ function createTrainingClient(input) {
1031
1334
  )
1032
1335
  );
1033
1336
  },
1337
+ async recoverCheckpoint(jobId, input2) {
1338
+ const recovery = TrainingCheckpointRecoveryRequestSchema.parse(input2);
1339
+ if (recovery.resourceApproval) {
1340
+ const { approvalHash, ...body } = recovery.resourceApproval;
1341
+ if (body.sourceJobId !== jobId || await canonicalSha256(body) !== approvalHash)
1342
+ throw new OpenPondProtocolError("content_hash_mismatch", "Recovery resource approval does not bind this source request.");
1343
+ }
1344
+ return TrainingJobSchema.parse(unwrapObject(await request(
1345
+ `/v1/training/jobs/${encodeURIComponent(IdSchema3.parse(jobId))}/recover`,
1346
+ { method: "POST", body: JSON.stringify(recovery) }
1347
+ ), "job"));
1348
+ },
1034
1349
  async events(jobId) {
1035
- return z8.array(TrainingJobEventSchema).parse(
1350
+ return z12.array(TrainingJobEventSchema).parse(
1036
1351
  unwrapObject(
1037
1352
  await request(`/v1/training/jobs/${encodeURIComponent(IdSchema3.parse(jobId))}/events`),
1038
1353
  "events"
@@ -1045,24 +1360,24 @@ function createTrainingClient(input) {
1045
1360
  );
1046
1361
  },
1047
1362
  async evaluationTasks(jobId, evaluation, options = {}) {
1048
- const id = IdSchema3.parse(jobId);
1363
+ const id2 = IdSchema3.parse(jobId);
1049
1364
  const reference = ModelProjectImmutableRefSchema.parse(evaluation);
1050
1365
  const parameters = new URLSearchParams();
1051
- const cursor = options.cursor === void 0 ? void 0 : z8.string().regex(/^[1-9]\d*$/).parse(options.cursor);
1052
- const offset = cursor === void 0 ? 0 : z8.number().int().min(1).max(9999).parse(Number(cursor));
1366
+ const cursor = options.cursor === void 0 ? void 0 : z12.string().regex(/^[1-9]\d*$/).parse(options.cursor);
1367
+ const offset = cursor === void 0 ? 0 : z12.number().int().min(1).max(9999).parse(Number(cursor));
1053
1368
  if (cursor !== void 0) parameters.set("cursor", cursor);
1054
1369
  if (options.limit !== void 0)
1055
- parameters.set("limit", String(z8.number().int().min(1).max(100).parse(options.limit)));
1370
+ parameters.set("limit", String(z12.number().int().min(1).max(100).parse(options.limit)));
1056
1371
  const query = parameters.size ? `?${parameters.toString()}` : "";
1057
1372
  return parseAndVerifyTrainingEvaluationTaskPage(
1058
1373
  await request(
1059
- `/v1/training/jobs/${encodeURIComponent(id)}/evaluations/${encodeURIComponent(reference.id)}/tasks${query}`
1374
+ `/v1/training/jobs/${encodeURIComponent(id2)}/evaluations/${encodeURIComponent(reference.id)}/tasks${query}`
1060
1375
  ),
1061
- { jobId: id, evaluation: reference, offset }
1376
+ { jobId: id2, evaluation: reference, offset }
1062
1377
  );
1063
1378
  },
1064
1379
  async logs(jobId) {
1065
- return z8.array(TrainingJobLogSchema).max(1e5).parse(
1380
+ return z12.array(TrainingJobLogSchema).max(1e5).parse(
1066
1381
  unwrapObject(
1067
1382
  await request(`/v1/training/jobs/${encodeURIComponent(IdSchema3.parse(jobId))}/logs`),
1068
1383
  "logs"
@@ -1101,6 +1416,10 @@ export {
1101
1416
  TrainingAcceptanceGroupSummarySchema,
1102
1417
  TrainingAcceptanceGroupPageSchema,
1103
1418
  TrainingAcceptanceGroupQuerySchema,
1419
+ TrainingCheckpointRecoveryResourceApprovalSchema,
1420
+ createTrainingCheckpointRecoveryResourceApproval,
1421
+ TrainingCheckpointRecoveryRequestSchema,
1422
+ TrainingPhysicalPlacementSchema,
1104
1423
  TrainingPreparationRequestSchema,
1105
1424
  TrainingPreparationPlanContentSchema,
1106
1425
  TrainingPreparationPlanSchema,
@@ -1109,6 +1428,12 @@ export {
1109
1428
  TrainingPreparationListQuerySchema,
1110
1429
  TrainingPreparationPageSchema,
1111
1430
  parseAndVerifyTrainingPreparationReceipt,
1431
+ TrainingEstimateSourceSchema,
1432
+ TrainingEstimateRequestSchema,
1433
+ TrainingEstimateComponentSchema,
1434
+ trainingEstimateSourceIdentity,
1435
+ TrainingEstimateSchema,
1436
+ TrainingQueueStatusSchema,
1112
1437
  TrainingHarnessSourcePublicationSchema,
1113
1438
  TrainingCandidateDecisionRequestSchema,
1114
1439
  TrainingCandidateDecisionSchema,
@@ -1139,6 +1464,7 @@ export {
1139
1464
  TrainingJobSubmissionSchema,
1140
1465
  trainingJobSubmissionHash,
1141
1466
  parseAndVerifyTrainingJobSubmission,
1467
+ TrainingJobRecoverySchema,
1142
1468
  TrainingJobSchema,
1143
1469
  TrainingJobPageSchema,
1144
1470
  TrainingJobEventSchema,
@@ -1153,7 +1479,9 @@ export {
1153
1479
  TrainingJobOutputsSchema,
1154
1480
  TrainingApiErrorSchema,
1155
1481
  OpenPondTrainingApiError,
1482
+ TrainingPolicyLoraCapabilitiesSchema,
1483
+ supportsTrainingPolicyLoraRank,
1156
1484
  TrainingCapabilitiesSchema,
1157
1485
  createTrainingClient
1158
1486
  };
1159
- //# sourceMappingURL=chunk-XACJ63U4.js.map
1487
+ //# sourceMappingURL=chunk-Z4XGSEKC.js.map