openpond-sdk 0.12.9 → 0.12.11

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 (150) hide show
  1. package/README.md +2 -0
  2. package/TRAINING_PROTOCOL.md +40 -0
  3. package/dist/advanced-refiner-evaluations.js +8 -7
  4. package/dist/candidate-evaluations.js +7 -6
  5. package/dist/{chunk-TWJYL5YF.js → chunk-2LVR24GU.js} +5 -5
  6. package/dist/{chunk-MRUDFIB6.js → chunk-7BYLH47N.js} +6 -4
  7. package/dist/{chunk-MRUDFIB6.js.map → chunk-7BYLH47N.js.map} +1 -1
  8. package/dist/chunk-B3ZHJ2KK.js +152 -0
  9. package/dist/chunk-B3ZHJ2KK.js.map +1 -0
  10. package/dist/{chunk-D3WOJTUY.js → chunk-C3TS766N.js} +24 -87
  11. package/dist/chunk-C3TS766N.js.map +1 -0
  12. package/dist/{chunk-WYR3MZHU.js → chunk-C4W2MEFP.js} +2 -2
  13. package/dist/{chunk-GGG6H4MK.js → chunk-CNREFTAV.js} +2 -2
  14. package/dist/chunk-EZME7DV4.js +161 -0
  15. package/dist/chunk-EZME7DV4.js.map +1 -0
  16. package/dist/{chunk-IOZCYSJ6.js → chunk-GHPCQXG5.js} +2 -2
  17. package/dist/{chunk-EYMZQML2.js → chunk-GJRXJL6G.js} +525 -484
  18. package/dist/chunk-GJRXJL6G.js.map +1 -0
  19. package/dist/chunk-GX6KMHW2.js +108 -0
  20. package/dist/chunk-GX6KMHW2.js.map +1 -0
  21. package/dist/{chunk-BWFG46HX.js → chunk-HAQPGTQ4.js} +2 -2
  22. package/dist/{chunk-RFKZSSLB.js → chunk-IFBCLRBM.js} +5 -3
  23. package/dist/{chunk-RFKZSSLB.js.map → chunk-IFBCLRBM.js.map} +1 -1
  24. package/dist/chunk-IZ26ZCGU.js +65 -0
  25. package/dist/chunk-IZ26ZCGU.js.map +1 -0
  26. package/dist/{chunk-EEZ5YHJQ.js → chunk-JBYFD3QS.js} +3 -3
  27. package/dist/{chunk-U4QIGSP5.js → chunk-JDQVAG3R.js} +3 -3
  28. package/dist/{chunk-UWM2ZPGS.js → chunk-K54BDIKL.js} +3 -3
  29. package/dist/{chunk-QVLJFJBU.js → chunk-KOJC3TH4.js} +6 -6
  30. package/dist/{chunk-YP5DXGGC.js → chunk-LHHHJIDR.js} +2 -2
  31. package/dist/{chunk-UMK6DH75.js → chunk-NKF5NIML.js} +7 -5
  32. package/dist/{chunk-UMK6DH75.js.map → chunk-NKF5NIML.js.map} +1 -1
  33. package/dist/{chunk-LUFOAMN5.js → chunk-O3NOGKMT.js} +2 -2
  34. package/dist/{chunk-GZSQIOAH.js → chunk-ORYA2G7S.js} +6 -6
  35. package/dist/{chunk-XL44IXBO.js → chunk-RIN6Z56W.js} +5 -5
  36. package/dist/{chunk-CJDEVI3T.js → chunk-RLW4Y5ZV.js} +5 -3
  37. package/dist/{chunk-CJDEVI3T.js.map → chunk-RLW4Y5ZV.js.map} +1 -1
  38. package/dist/{chunk-QHCY4MBG.js → chunk-TLSP5JKG.js} +2 -2
  39. package/dist/chunk-U2KGUAIS.js +18 -0
  40. package/dist/chunk-U2KGUAIS.js.map +1 -0
  41. package/dist/{chunk-YSEYPMQ3.js → chunk-UOV2LEXS.js} +12 -154
  42. package/dist/chunk-UOV2LEXS.js.map +1 -0
  43. package/dist/{chunk-CZXN63A4.js → chunk-UWY5PUHR.js} +2 -2
  44. package/dist/{chunk-HYCHLMP7.js → chunk-XMVSQIK4.js} +2 -2
  45. package/dist/{chunk-TZREEZ4C.js → chunk-XRBM6PBD.js} +9 -9
  46. package/dist/{chunk-MGFI4226.js → chunk-YIGFQWZV.js} +3 -3
  47. package/dist/{chunk-EWRWGFKD.js → chunk-ZYDDHHZZ.js} +6 -4
  48. package/dist/{chunk-EWRWGFKD.js.map → chunk-ZYDDHHZZ.js.map} +1 -1
  49. package/dist/connected-evidence.js +18 -15
  50. package/dist/dataset-workspaces.js +21 -18
  51. package/dist/dataset-workspaces.js.map +1 -1
  52. package/dist/errors.js +13 -0
  53. package/dist/errors.js.map +1 -0
  54. package/dist/experiment-evaluation-schedules.js +22 -19
  55. package/dist/experiment-improvements.js +9 -8
  56. package/dist/experiments.js +22 -19
  57. package/dist/index.js +64 -58
  58. package/dist/index.js.map +1 -1
  59. package/dist/learning.js +9 -5
  60. package/dist/learning.js.map +1 -1
  61. package/dist/model-projects.js +6 -4
  62. package/dist/model-starter-attempts.js +3 -2
  63. package/dist/model-starter-catalog.js +13 -10
  64. package/dist/model-starter-catalog.js.map +1 -1
  65. package/dist/model-starters.js +13 -10
  66. package/dist/model-taskset-runs.js +5 -4
  67. package/dist/model-taskset-runs.js.map +1 -1
  68. package/dist/post-training.js +7 -6
  69. package/dist/taskset-drafts.js +17 -14
  70. package/dist/taskset-drafts.js.map +1 -1
  71. package/dist/taskset-packages.js +24 -21
  72. package/dist/tool-learning-local-store.js +355 -0
  73. package/dist/tool-learning-local-store.js.map +1 -0
  74. package/dist/tool-learning.js +414 -0
  75. package/dist/tool-learning.js.map +1 -0
  76. package/dist/training-bundle.js +31 -16
  77. package/dist/training-bundle.js.map +1 -1
  78. package/dist/training-hardware.js +23 -0
  79. package/dist/training-hardware.js.map +1 -0
  80. package/dist/training.js +31 -13
  81. package/dist/types/packages/sdk/src/connected-evidence-client.d.ts +40 -40
  82. package/dist/types/packages/sdk/src/dataset-preparation-workspace.d.ts +20 -20
  83. package/dist/types/packages/sdk/src/errors.d.ts +3 -0
  84. package/dist/types/packages/sdk/src/errors.d.ts.map +1 -0
  85. package/dist/types/packages/sdk/src/experiment-client.d.ts +636 -636
  86. package/dist/types/packages/sdk/src/experiment-improvement-client.d.ts +1622 -1622
  87. package/dist/types/packages/sdk/src/experiment-run-details.d.ts +54 -54
  88. package/dist/types/packages/sdk/src/learning-client.d.ts +1 -6
  89. package/dist/types/packages/sdk/src/learning-client.d.ts.map +1 -1
  90. package/dist/types/packages/sdk/src/learning-error.d.ts +7 -0
  91. package/dist/types/packages/sdk/src/learning-error.d.ts.map +1 -0
  92. package/dist/types/packages/sdk/src/managed-training-preparation.d.ts +2 -0
  93. package/dist/types/packages/sdk/src/managed-training-preparation.d.ts.map +1 -1
  94. package/dist/types/packages/sdk/src/model-projects.d.ts +24 -0
  95. package/dist/types/packages/sdk/src/model-projects.d.ts.map +1 -1
  96. package/dist/types/packages/sdk/src/model-starters.d.ts +6 -0
  97. package/dist/types/packages/sdk/src/model-starters.d.ts.map +1 -1
  98. package/dist/types/packages/sdk/src/post-training.d.ts +58 -54
  99. package/dist/types/packages/sdk/src/post-training.d.ts.map +1 -1
  100. package/dist/types/packages/sdk/src/taskset-authored-files.d.ts +20 -20
  101. package/dist/types/packages/sdk/src/taskset-draft-client.d.ts +2 -0
  102. package/dist/types/packages/sdk/src/taskset-draft-client.d.ts.map +1 -1
  103. package/dist/types/packages/sdk/src/taskset-package-client.d.ts +6 -0
  104. package/dist/types/packages/sdk/src/taskset-package-client.d.ts.map +1 -1
  105. package/dist/types/packages/sdk/src/taskset-package-projection.d.ts +20 -20
  106. package/dist/types/packages/sdk/src/tool-learning-client.d.ts +1217 -0
  107. package/dist/types/packages/sdk/src/tool-learning-client.d.ts.map +1 -0
  108. package/dist/types/packages/sdk/src/tool-learning-local-store.d.ts +140 -0
  109. package/dist/types/packages/sdk/src/tool-learning-local-store.d.ts.map +1 -0
  110. package/dist/types/packages/sdk/src/tool-learning.d.ts +4 -0
  111. package/dist/types/packages/sdk/src/tool-learning.d.ts.map +1 -0
  112. package/dist/types/packages/sdk/src/training-compute-selection.d.ts +2 -0
  113. package/dist/types/packages/sdk/src/training-compute-selection.d.ts.map +1 -1
  114. package/dist/types/packages/sdk/src/training-estimates.d.ts +9 -1
  115. package/dist/types/packages/sdk/src/training-estimates.d.ts.map +1 -1
  116. package/dist/types/packages/sdk/src/training-hardware.d.ts +886 -0
  117. package/dist/types/packages/sdk/src/training-hardware.d.ts.map +1 -0
  118. package/dist/types/packages/sdk/src/training-learning-batch.d.ts +40 -40
  119. package/dist/types/packages/sdk/src/training-preparations.d.ts +22 -0
  120. package/dist/types/packages/sdk/src/training-preparations.d.ts.map +1 -1
  121. package/dist/types/packages/sdk/src/training-qualification-preparation.d.ts +2 -0
  122. package/dist/types/packages/sdk/src/training-qualification-preparation.d.ts.map +1 -1
  123. package/dist/types/packages/sdk/src/training-supervised.d.ts +101 -0
  124. package/dist/types/packages/sdk/src/training-supervised.d.ts.map +1 -0
  125. package/dist/types/packages/sdk/src/training-transport.d.ts +24 -0
  126. package/dist/types/packages/sdk/src/training-transport.d.ts.map +1 -0
  127. package/dist/types/packages/sdk/src/training.d.ts +34 -16
  128. package/dist/types/packages/sdk/src/training.d.ts.map +1 -1
  129. package/package.json +18 -2
  130. package/dist/chunk-D3WOJTUY.js.map +0 -1
  131. package/dist/chunk-EYMZQML2.js.map +0 -1
  132. package/dist/chunk-YSEYPMQ3.js.map +0 -1
  133. /package/dist/{chunk-TWJYL5YF.js.map → chunk-2LVR24GU.js.map} +0 -0
  134. /package/dist/{chunk-WYR3MZHU.js.map → chunk-C4W2MEFP.js.map} +0 -0
  135. /package/dist/{chunk-GGG6H4MK.js.map → chunk-CNREFTAV.js.map} +0 -0
  136. /package/dist/{chunk-IOZCYSJ6.js.map → chunk-GHPCQXG5.js.map} +0 -0
  137. /package/dist/{chunk-BWFG46HX.js.map → chunk-HAQPGTQ4.js.map} +0 -0
  138. /package/dist/{chunk-EEZ5YHJQ.js.map → chunk-JBYFD3QS.js.map} +0 -0
  139. /package/dist/{chunk-U4QIGSP5.js.map → chunk-JDQVAG3R.js.map} +0 -0
  140. /package/dist/{chunk-UWM2ZPGS.js.map → chunk-K54BDIKL.js.map} +0 -0
  141. /package/dist/{chunk-QVLJFJBU.js.map → chunk-KOJC3TH4.js.map} +0 -0
  142. /package/dist/{chunk-YP5DXGGC.js.map → chunk-LHHHJIDR.js.map} +0 -0
  143. /package/dist/{chunk-LUFOAMN5.js.map → chunk-O3NOGKMT.js.map} +0 -0
  144. /package/dist/{chunk-GZSQIOAH.js.map → chunk-ORYA2G7S.js.map} +0 -0
  145. /package/dist/{chunk-XL44IXBO.js.map → chunk-RIN6Z56W.js.map} +0 -0
  146. /package/dist/{chunk-QHCY4MBG.js.map → chunk-TLSP5JKG.js.map} +0 -0
  147. /package/dist/{chunk-CZXN63A4.js.map → chunk-UWY5PUHR.js.map} +0 -0
  148. /package/dist/{chunk-HYCHLMP7.js.map → chunk-XMVSQIK4.js.map} +0 -0
  149. /package/dist/{chunk-TZREEZ4C.js.map → chunk-XRBM6PBD.js.map} +0 -0
  150. /package/dist/{chunk-MGFI4226.js.map → chunk-YIGFQWZV.js.map} +0 -0
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # `openpond-sdk`
2
2
 
3
+ See [tool learning](./TOOL_LEARNING.md) for scoped tool capture, private recovery evidence, and metered specialist consultation.
4
+
3
5
  See [task evidence and learning](./LEARNING.md) for reusable Rewards, task-format publication, SDK/HTTP intake, grading, review and approved batches.
4
6
 
5
7
  The OpenPond SDK is the server-side TypeScript client for running agentic work in OpenPond sandboxes. It gives Node.js applications, Next.js route handlers, workers, and backend services a small API for creating sandboxes, executing commands, managing files and runtimes, and running a model/tool loop in an isolated workspace.
@@ -288,3 +288,43 @@ CLI: `openpond training hosted-recover recovery.json --team-id <id> --home <conf
288
288
  Managed Work reconciles a transient or lost policy HTTP response inside its current guest using the identical delivery, turn, seed, messages and tool body. The native gateway reads the existing command result for that identity; a response retry does not add a policy sample or replay already-executed Work tools. The signed native retry allowance is shared across the case and the original execution deadline remains binding. Successful Work timing evidence includes `policyHttpRetries`.
289
289
 
290
290
  The native runner does not restart a whole stateful Work process to recover a policy HTTP failure. Exhausted retries, authentication/custody failures and first-call budget exhaustion still fail the attempt; no response, reward or optimizer update is fabricated. Other execution kinds keep their established process-retry behavior.
291
+
292
+ ## Supervised recipes and reviewed targets
293
+
294
+ `SftRecipeSchema` and `ManagedSftRecipeSchema` from `openpond-sdk/training` describe
295
+ supervised LoRA updates with pinned model/tokenizer identity, completion-only
296
+ masking, dataset selection, epochs/steps, batch accumulation, and resource limits.
297
+ The workbench consumes the same recipe schema. SFT does not use GRPO rollout
298
+ counts, relative advantages, or reward-loss parameters. Initial managed SFT
299
+ requests require a fresh single-GPU run without cross-job continuation or
300
+ rollout-only qualification. A deterministic held-out grader remains evaluation
301
+ configuration; it is not the supervised optimizer objective.
302
+
303
+ `prepareManagedTrainingSubmission` requires a fully materialized approved recipe
304
+ and requests `managed_training.sft@1` for SFT. A deployed backend must explicitly
305
+ support that capability before accepting work; schema availability is not a claim
306
+ that a particular deployment or worker image has qualified SFT. Collection and
307
+ publication do not authorize optimizer execution. Approved targets, an independent
308
+ held-out population, funding, exact artifact custody, and execution permission
309
+ remain separate boundaries.
310
+
311
+ ## Tool episode protocol
312
+
313
+ `openpond-sdk/tool-learning` re-exports the portable bounded episode, scoped
314
+ installation, manifest, and recovery-consultation schemas from
315
+ `@openpond/evals/tool-learning`. Integration and learned capability entries carry
316
+ different qualification receipts. A learned entry requires training, evaluation,
317
+ adapter, and activation references; newly captured errors cannot promote it.
318
+ Operational unavailability is distinct from a model's `proceed` response, and a
319
+ response must match the request's operation, installation, action, context,
320
+ manifest, capability, and model identity.
321
+
322
+ The separate `openpond-sdk/tool-learning/node` entry exports
323
+ `ToolLearningLocalStore`, a private bounded SQLite queue for an explicitly selected
324
+ OpenPond home. It records installation scope and capture policy, rejects conflicting
325
+ event identities, bounds pending evidence, records dropped/expired counts, and
326
+ removes queued events only for exact installation/event/content-hash acknowledgements.
327
+ It performs no authentication, network upload, tool execution, training, or model
328
+ activation. Callers must verify authentic durable hosted receipts before
329
+ acknowledging delivery. Import the portable entry in browser code; the Node queue
330
+ is a separate runtime capability.
@@ -12,17 +12,18 @@ import {
12
12
  sealAdvancedRefinerEvaluationPin,
13
13
  sealAdvancedRefinerReviewReceipt,
14
14
  verifyAdvancedRefinerEvaluationPin
15
- } from "./chunk-CZXN63A4.js";
16
- import "./chunk-LUFOAMN5.js";
15
+ } from "./chunk-UWY5PUHR.js";
16
+ import "./chunk-O3NOGKMT.js";
17
17
  import "./chunk-3B5KSH3V.js";
18
18
  import "./chunk-H3367ISL.js";
19
- import "./chunk-YP5DXGGC.js";
19
+ import "./chunk-LHHHJIDR.js";
20
20
  import "./chunk-O6FKHAWN.js";
21
- import "./chunk-WYR3MZHU.js";
22
- import "./chunk-EWRWGFKD.js";
23
- import "./chunk-CJDEVI3T.js";
24
- import "./chunk-YSEYPMQ3.js";
21
+ import "./chunk-C4W2MEFP.js";
22
+ import "./chunk-ZYDDHHZZ.js";
23
+ import "./chunk-RLW4Y5ZV.js";
24
+ import "./chunk-UOV2LEXS.js";
25
25
  import "./chunk-CL3IOOVL.js";
26
+ import "./chunk-B3ZHJ2KK.js";
26
27
  import "./chunk-H3JZ3P5T.js";
27
28
  import "./chunk-YLJ4XMA6.js";
28
29
  export {
@@ -5,13 +5,14 @@ import {
5
5
  CandidateEvaluationPreparationSchema,
6
6
  CandidateEvaluationRequestSchema,
7
7
  createCandidateEvaluationClient
8
- } from "./chunk-GGG6H4MK.js";
9
- import "./chunk-UWM2ZPGS.js";
10
- import "./chunk-WYR3MZHU.js";
11
- import "./chunk-EWRWGFKD.js";
12
- import "./chunk-CJDEVI3T.js";
13
- import "./chunk-YSEYPMQ3.js";
8
+ } from "./chunk-CNREFTAV.js";
9
+ import "./chunk-K54BDIKL.js";
10
+ import "./chunk-C4W2MEFP.js";
11
+ import "./chunk-ZYDDHHZZ.js";
12
+ import "./chunk-RLW4Y5ZV.js";
13
+ import "./chunk-UOV2LEXS.js";
14
14
  import "./chunk-CL3IOOVL.js";
15
+ import "./chunk-B3ZHJ2KK.js";
15
16
  import "./chunk-H3JZ3P5T.js";
16
17
  import "./chunk-YLJ4XMA6.js";
17
18
  export {
@@ -6,14 +6,14 @@ import {
6
6
  ExperimentImprovementTestRecipeSchema,
7
7
  verifyExperimentImprovementHumanOptions,
8
8
  verifyExperimentImprovementState
9
- } from "./chunk-LUFOAMN5.js";
9
+ } from "./chunk-O3NOGKMT.js";
10
+ import {
11
+ fetchConnectedJson
12
+ } from "./chunk-O6FKHAWN.js";
10
13
  import {
11
14
  HarnessPolicySourcePackageSchema,
12
15
  validateHarnessPolicySourcePackage
13
16
  } from "./chunk-Q4TKI2MV.js";
14
- import {
15
- fetchConnectedJson
16
- } from "./chunk-O6FKHAWN.js";
17
17
  import {
18
18
  ImmutableReleaseRefSchema,
19
19
  contentHash,
@@ -157,4 +157,4 @@ export {
157
157
  HostedProfileCandidateCommandSchema,
158
158
  ExperimentImprovementClient
159
159
  };
160
- //# sourceMappingURL=chunk-TWJYL5YF.js.map
160
+ //# sourceMappingURL=chunk-2LVR24GU.js.map
@@ -1,11 +1,13 @@
1
1
  import {
2
2
  RunExperimentSchema
3
- } from "./chunk-UWM2ZPGS.js";
3
+ } from "./chunk-K54BDIKL.js";
4
+ import {
5
+ HostedModelProjectSummarySchema
6
+ } from "./chunk-UOV2LEXS.js";
4
7
  import {
5
- HostedModelProjectSummarySchema,
6
8
  OpenPondProtocolError,
7
9
  canonicalSha256
8
- } from "./chunk-YSEYPMQ3.js";
10
+ } from "./chunk-B3ZHJ2KK.js";
9
11
  import {
10
12
  contentHash
11
13
  } from "./chunk-H3JZ3P5T.js";
@@ -293,4 +295,4 @@ export {
293
295
  HostedTrainingPolicyControlSchema,
294
296
  TrainingHandoffOriginSchema2 as TrainingHandoffOriginSchema
295
297
  };
296
- //# sourceMappingURL=chunk-MRUDFIB6.js.map
298
+ //# sourceMappingURL=chunk-7BYLH47N.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/post-training.ts"],"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 // These public evaluation routes consume ordinary JSON, independently of\n // the versioned Training V2 job routes used by the parent factory.\n const headers = { accept: \"application/json\", \"content-type\": \"application/json\" };\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 headers,\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), { headers }), 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\", headers, 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"],"mappings":"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","names":["TrainingHandoffOriginSchema"]}
1
+ {"version":3,"sources":["../src/post-training.ts"],"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 // These public evaluation routes consume ordinary JSON, independently of\n // the versioned Training V2 job routes used by the parent factory.\n const headers = { accept: \"application/json\", \"content-type\": \"application/json\" };\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 headers,\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), { headers }), 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\", headers, 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"],"mappings":"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","names":["TrainingHandoffOriginSchema"]}
@@ -0,0 +1,152 @@
1
+ // src/protocol.ts
2
+ var OPENPOND_TRAINING_PROTOCOL_MAJOR = 2;
3
+ var OPENPOND_TRAINING_MEDIA_TYPE = "application/vnd.openpond.training+json;version=2";
4
+ var OPENPOND_MODEL_PROJECT_MEDIA_TYPE = "application/vnd.openpond.model-project+json;version=2";
5
+ var TRAINING_JOB_SUBMISSION_MAX_BYTES = 1048576;
6
+ var TRAINING_INPUT_ARTIFACT_MAX_BYTES = 67108864;
7
+ var TRAINING_API_RESPONSE_MAX_BYTES = 8388608;
8
+ var MODEL_PROJECT_SYNC_MAX_BYTES = 524288;
9
+ var MODEL_PROJECT_API_RESPONSE_MAX_BYTES = 8388608;
10
+ var OpenPondProtocolError = class extends Error {
11
+ code;
12
+ constructor(code, message) {
13
+ super(message);
14
+ this.name = "OpenPondProtocolError";
15
+ this.code = code;
16
+ }
17
+ };
18
+ function canonicalJson(value) {
19
+ return JSON.stringify(normalizeCanonicalJson(value));
20
+ }
21
+ function canonicalJsonByteLength(value) {
22
+ return new TextEncoder().encode(canonicalJson(value)).byteLength;
23
+ }
24
+ async function canonicalSha256(value) {
25
+ const bytes = new TextEncoder().encode(canonicalJson(value));
26
+ const digest = await globalThis.crypto.subtle.digest("SHA-256", bytes);
27
+ return Array.from(
28
+ new Uint8Array(digest),
29
+ (byte) => byte.toString(16).padStart(2, "0")
30
+ ).join("");
31
+ }
32
+ function assertCanonicalPayloadSize(value, maximumBytes, label) {
33
+ const actualBytes = canonicalJsonByteLength(value);
34
+ if (actualBytes > maximumBytes) {
35
+ throw new OpenPondProtocolError(
36
+ "payload_too_large",
37
+ `${label} is ${actualBytes} bytes; the maximum is ${maximumBytes} bytes.`
38
+ );
39
+ }
40
+ }
41
+ function parseBoundedJson(text, maximumBytes, label) {
42
+ const actualBytes = new TextEncoder().encode(text).byteLength;
43
+ if (actualBytes > maximumBytes) {
44
+ throw new OpenPondProtocolError(
45
+ "response_too_large",
46
+ `${label} is ${actualBytes} bytes; the maximum is ${maximumBytes} bytes.`
47
+ );
48
+ }
49
+ try {
50
+ return JSON.parse(text);
51
+ } catch {
52
+ throw new OpenPondProtocolError(
53
+ "invalid_json",
54
+ `${label} was not valid JSON.`
55
+ );
56
+ }
57
+ }
58
+ async function readBoundedJsonResponse(response, maximumBytes, label) {
59
+ const reader = response.body?.getReader();
60
+ if (!reader) return parseBoundedJson("", maximumBytes, label);
61
+ const decoder = new TextDecoder();
62
+ let bytes = 0;
63
+ let text = "";
64
+ try {
65
+ for (; ; ) {
66
+ const chunk = await reader.read();
67
+ if (chunk.done) break;
68
+ bytes += chunk.value.byteLength;
69
+ if (bytes > maximumBytes) {
70
+ throw new OpenPondProtocolError(
71
+ "response_too_large",
72
+ `${label} exceeds the maximum of ${maximumBytes} bytes.`
73
+ );
74
+ }
75
+ text += decoder.decode(chunk.value, { stream: true });
76
+ }
77
+ text += decoder.decode();
78
+ return parseBoundedJson(text, maximumBytes, label);
79
+ } catch (error) {
80
+ try {
81
+ await reader.cancel();
82
+ } catch {
83
+ }
84
+ throw error;
85
+ } finally {
86
+ try {
87
+ reader.releaseLock();
88
+ } catch {
89
+ }
90
+ }
91
+ }
92
+ function normalizeCanonicalJson(value) {
93
+ if (value === null || typeof value === "string" || typeof value === "boolean") {
94
+ return value;
95
+ }
96
+ if (typeof value === "number") {
97
+ if (!Number.isFinite(value)) {
98
+ throw new OpenPondProtocolError(
99
+ "non_json_value",
100
+ "Canonical JSON cannot contain a non-finite number."
101
+ );
102
+ }
103
+ return Object.is(value, -0) ? 0 : value;
104
+ }
105
+ if (Array.isArray(value)) {
106
+ return value.map((entry) => normalizeCanonicalJson(entry));
107
+ }
108
+ if (typeof value === "object") {
109
+ const prototype = Object.getPrototypeOf(value);
110
+ if (prototype !== Object.prototype && prototype !== null) {
111
+ throw new OpenPondProtocolError(
112
+ "non_json_value",
113
+ "Canonical JSON accepts only plain objects."
114
+ );
115
+ }
116
+ const result = /* @__PURE__ */ Object.create(null);
117
+ for (const key of Object.keys(value).sort()) {
118
+ const entry = value[key];
119
+ if (entry === void 0 || typeof entry === "function" || typeof entry === "symbol") {
120
+ throw new OpenPondProtocolError(
121
+ "non_json_value",
122
+ `Canonical JSON cannot contain ${typeof entry} at ${key}.`
123
+ );
124
+ }
125
+ result[key] = normalizeCanonicalJson(entry);
126
+ }
127
+ return result;
128
+ }
129
+ throw new OpenPondProtocolError(
130
+ "non_json_value",
131
+ `Canonical JSON cannot contain ${typeof value}.`
132
+ );
133
+ }
134
+
135
+ export {
136
+ OPENPOND_TRAINING_PROTOCOL_MAJOR,
137
+ OPENPOND_TRAINING_MEDIA_TYPE,
138
+ OPENPOND_MODEL_PROJECT_MEDIA_TYPE,
139
+ TRAINING_JOB_SUBMISSION_MAX_BYTES,
140
+ TRAINING_INPUT_ARTIFACT_MAX_BYTES,
141
+ TRAINING_API_RESPONSE_MAX_BYTES,
142
+ MODEL_PROJECT_SYNC_MAX_BYTES,
143
+ MODEL_PROJECT_API_RESPONSE_MAX_BYTES,
144
+ OpenPondProtocolError,
145
+ canonicalJson,
146
+ canonicalJsonByteLength,
147
+ canonicalSha256,
148
+ assertCanonicalPayloadSize,
149
+ parseBoundedJson,
150
+ readBoundedJsonResponse
151
+ };
152
+ //# sourceMappingURL=chunk-B3ZHJ2KK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/protocol.ts"],"sourcesContent":["export type CanonicalJsonValue =\n | null\n | boolean\n | number\n | string\n | CanonicalJsonValue[]\n | { [key: string]: CanonicalJsonValue };\n\nexport const OPENPOND_TRAINING_PROTOCOL_MAJOR = 2 as const;\nexport const OPENPOND_TRAINING_MEDIA_TYPE =\n \"application/vnd.openpond.training+json;version=2\" as const;\nexport const OPENPOND_MODEL_PROJECT_MEDIA_TYPE =\n \"application/vnd.openpond.model-project+json;version=2\" as const;\n\nexport const TRAINING_JOB_SUBMISSION_MAX_BYTES = 1_048_576;\nexport const TRAINING_INPUT_ARTIFACT_MAX_BYTES = 67_108_864;\nexport const TRAINING_API_RESPONSE_MAX_BYTES = 8_388_608;\nexport const MODEL_PROJECT_SYNC_MAX_BYTES = 524_288;\nexport const MODEL_PROJECT_API_RESPONSE_MAX_BYTES = 8_388_608;\n\nexport class OpenPondProtocolError extends Error {\n readonly code: string;\n\n constructor(code: string, message: string) {\n super(message);\n this.name = \"OpenPondProtocolError\";\n this.code = code;\n }\n}\n\n/**\n * Deterministic JSON used for content-addressed OpenPond protocol objects.\n * Object keys are sorted by Unicode code point, arrays retain their authored\n * order, and non-JSON/non-finite values are rejected rather than coerced.\n */\nexport function canonicalJson(value: unknown): string {\n return JSON.stringify(normalizeCanonicalJson(value));\n}\n\nexport function canonicalJsonByteLength(value: unknown): number {\n return new TextEncoder().encode(canonicalJson(value)).byteLength;\n}\n\nexport async function canonicalSha256(value: unknown): Promise<string> {\n const bytes = new TextEncoder().encode(canonicalJson(value));\n const digest = await globalThis.crypto.subtle.digest(\"SHA-256\", bytes);\n return Array.from(new Uint8Array(digest), (byte) =>\n byte.toString(16).padStart(2, \"0\"),\n ).join(\"\");\n}\n\nexport function assertCanonicalPayloadSize(\n value: unknown,\n maximumBytes: number,\n label: string,\n): void {\n const actualBytes = canonicalJsonByteLength(value);\n if (actualBytes > maximumBytes) {\n throw new OpenPondProtocolError(\n \"payload_too_large\",\n `${label} is ${actualBytes} bytes; the maximum is ${maximumBytes} bytes.`,\n );\n }\n}\n\nexport function parseBoundedJson(\n text: string,\n maximumBytes: number,\n label: string,\n): unknown {\n const actualBytes = new TextEncoder().encode(text).byteLength;\n if (actualBytes > maximumBytes) {\n throw new OpenPondProtocolError(\n \"response_too_large\",\n `${label} is ${actualBytes} bytes; the maximum is ${maximumBytes} bytes.`,\n );\n }\n try {\n return JSON.parse(text) as unknown;\n } catch {\n throw new OpenPondProtocolError(\n \"invalid_json\",\n `${label} was not valid JSON.`,\n );\n }\n}\n\n/** Bound the wire body while consuming it, before allocating the complete JSON\n * string. Reader cleanup must never replace the original transport/JSON error. */\nexport async function readBoundedJsonResponse(\n response: Response,\n maximumBytes: number,\n label: string,\n): Promise<unknown> {\n const reader = response.body?.getReader();\n if (!reader) return parseBoundedJson(\"\", maximumBytes, label);\n const decoder = new TextDecoder();\n let bytes = 0;\n let text = \"\";\n try {\n for (;;) {\n const chunk = await reader.read();\n if (chunk.done) break;\n bytes += chunk.value.byteLength;\n if (bytes > maximumBytes) {\n throw new OpenPondProtocolError(\n \"response_too_large\",\n `${label} exceeds the maximum of ${maximumBytes} bytes.`,\n );\n }\n text += decoder.decode(chunk.value, { stream: true });\n }\n text += decoder.decode();\n return parseBoundedJson(text, maximumBytes, label);\n } catch (error) {\n try { await reader.cancel(); } catch { /* Preserve the primary failure. */ }\n throw error;\n } finally {\n try { reader.releaseLock(); } catch { /* Never mask a transport/parse failure. */ }\n }\n}\n\nfunction normalizeCanonicalJson(value: unknown): CanonicalJsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new OpenPondProtocolError(\n \"non_json_value\",\n \"Canonical JSON cannot contain a non-finite number.\",\n );\n }\n return Object.is(value, -0) ? 0 : value;\n }\n if (Array.isArray(value)) {\n return value.map((entry) => normalizeCanonicalJson(entry));\n }\n if (typeof value === \"object\") {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n throw new OpenPondProtocolError(\n \"non_json_value\",\n \"Canonical JSON accepts only plain objects.\",\n );\n }\n const result: Record<string, CanonicalJsonValue> = Object.create(null);\n for (const key of Object.keys(value as Record<string, unknown>).sort()) {\n const entry = (value as Record<string, unknown>)[key];\n if (entry === undefined || typeof entry === \"function\" || typeof entry === \"symbol\") {\n throw new OpenPondProtocolError(\n \"non_json_value\",\n `Canonical JSON cannot contain ${typeof entry} at ${key}.`,\n );\n }\n result[key] = normalizeCanonicalJson(entry);\n }\n return result;\n }\n throw new OpenPondProtocolError(\n \"non_json_value\",\n `Canonical JSON cannot contain ${typeof value}.`,\n );\n}\n"],"mappings":"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","names":[]}
@@ -1,58 +1,17 @@
1
1
  import {
2
- ReleaseIdSchema
3
- } from "./chunk-H3JZ3P5T.js";
4
-
5
- // src/learning-credentials.ts
6
- import { z } from "zod";
7
- import { LearningRevisionRefSchema } from "@openpond/evals/learning";
8
- import { TaskSplitSchema } from "@openpond/evals/tasksets";
9
- var LearningSourceCredentialSchema = z.object({
10
- id: ReleaseIdSchema,
11
- scope: ReleaseIdSchema,
12
- sourceId: ReleaseIdSchema,
13
- name: z.string().trim().min(1).max(100),
14
- keyPrefix: z.string().min(1).max(100),
15
- createdAt: z.iso.datetime(),
16
- expiresAt: z.iso.datetime(),
17
- revokedAt: z.iso.datetime().nullable()
18
- }).strict();
19
- var LearningSourceCredentialSecretSchema = z.string().regex(/^opk_key_[A-Za-z0-9]{16}_[A-Za-z0-9]{48}$/);
20
- var LearningSourceCredentialRequestSchema = z.discriminatedUnion("action", [
21
- z.object({ action: z.literal("create"), scope: ReleaseIdSchema, sourceId: ReleaseIdSchema, name: z.string().trim().min(1).max(100), expiresAt: z.iso.datetime(), operationId: ReleaseIdSchema, apiKey: LearningSourceCredentialSecretSchema }).strict(),
22
- z.object({ action: z.literal("list"), scope: ReleaseIdSchema, sourceId: ReleaseIdSchema, afterId: ReleaseIdSchema.optional(), limit: z.number().int().min(1).max(100).default(30) }).strict(),
23
- z.object({ action: z.literal("revoke"), scope: ReleaseIdSchema, sourceId: ReleaseIdSchema, id: ReleaseIdSchema }).strict()
24
- ]);
25
- var LearningSourceCredentialCreatedSchema = z.object({ credential: LearningSourceCredentialSchema, apiKey: LearningSourceCredentialSecretSchema }).strict();
26
- var LearningSourceCredentialPageSchema = z.object({ items: z.array(LearningSourceCredentialSchema).max(100), nextCursor: ReleaseIdSchema.nullable() }).strict();
27
- var LearningSourceConfigurationRequestSchema = z.object({ scope: ReleaseIdSchema, sourceId: ReleaseIdSchema }).strict();
28
- var LearningSourceConfigurationSchema = z.object({
29
- scope: ReleaseIdSchema,
30
- source: LearningRevisionRefSchema,
31
- taskDefinition: LearningRevisionRefSchema,
32
- enabled: z.boolean(),
33
- allowedSplits: z.array(TaskSplitSchema).min(1).max(4)
34
- }).strict();
35
- function createSourceCredentialRequest(input) {
36
- return { ...input, operationId: crypto.randomUUID(), apiKey: `opk_key_${randomToken(16)}_${randomToken(48)}` };
37
- }
38
- function randomToken(length) {
39
- const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
40
- let value = "";
41
- while (value.length < length) {
42
- for (const byte of crypto.getRandomValues(new Uint8Array(64))) {
43
- if (byte < 248) value += alphabet[byte % 62];
44
- if (value.length === length) return value;
45
- }
46
- }
47
- return value;
48
- }
49
- function assertLearningCredentialExpiry(expiresAt, now) {
50
- const expires = Date.parse(z.iso.datetime().parse(expiresAt));
51
- if (expires <= now.getTime() || expires > now.getTime() + 90 * 24 * 60 * 60 * 1e3) throw new Error("Source credentials must expire within 90 days.");
52
- }
2
+ OpenPondLearningError
3
+ } from "./chunk-U2KGUAIS.js";
4
+ import {
5
+ LearningSourceConfigurationRequestSchema,
6
+ LearningSourceConfigurationSchema,
7
+ LearningSourceCredentialCreatedSchema,
8
+ LearningSourceCredentialPageSchema,
9
+ LearningSourceCredentialRequestSchema,
10
+ LearningSourceCredentialSchema
11
+ } from "./chunk-IZ26ZCGU.js";
53
12
 
54
13
  // src/learning-client.ts
55
- import { z as z2 } from "zod";
14
+ import { z } from "zod";
56
15
  import {
57
16
  LearningCommandRequestSchema,
58
17
  LearningOperationResultSchema,
@@ -65,30 +24,18 @@ import {
65
24
  learningResourceSchemas
66
25
  } from "@openpond/evals/learning";
67
26
  import { assertBoundedTaskJson } from "@openpond/evals/task-schema";
68
- var LearningBatchPublicationSchema = z2.object({
69
- batchId: z2.string().trim().min(1).max(500),
70
- modelProjectId: z2.string().trim().min(1).max(500)
27
+ var LearningBatchPublicationSchema = z.object({
28
+ batchId: z.string().trim().min(1).max(500),
29
+ modelProjectId: z.string().trim().min(1).max(500)
71
30
  }).strict();
72
- var LearningBatchPublicationResultSchema = z2.object({
73
- batchId: z2.string().min(1),
74
- projectId: z2.string().min(1),
75
- tasksetId: z2.string().min(1),
76
- releaseId: z2.string().min(1),
77
- revision: z2.number().int().positive(),
78
- contentHash: z2.string().regex(/^[a-f0-9]{64}$/)
31
+ var LearningBatchPublicationResultSchema = z.object({
32
+ batchId: z.string().min(1),
33
+ projectId: z.string().min(1),
34
+ tasksetId: z.string().min(1),
35
+ releaseId: z.string().min(1),
36
+ revision: z.number().int().positive(),
37
+ contentHash: z.string().regex(/^[a-f0-9]{64}$/)
79
38
  }).strict();
80
- var OpenPondLearningError = class extends Error {
81
- constructor(status, code, message, details) {
82
- super(message);
83
- this.status = status;
84
- this.code = code;
85
- this.details = details;
86
- this.name = "OpenPondLearningError";
87
- }
88
- status;
89
- code;
90
- details;
91
- };
92
39
  var OpenPondLearningClient = class {
93
40
  #options;
94
41
  constructor(options) {
@@ -167,7 +114,7 @@ var OpenPondLearningClient = class {
167
114
  }
168
115
  async list(kind, query = {}, options = {}) {
169
116
  const request = LearningReadRequestSchema.parse({ action: "list", scope: this.#options.scope, kind, ...query });
170
- return z2.object({ items: z2.array(learningResourceSchemas[kind]).max(100), nextCursor: z2.string().nullable() }).strict().parse(await this.#request("read", request, options));
117
+ return z.object({ items: z.array(learningResourceSchemas[kind]).max(100), nextCursor: z.string().nullable() }).strict().parse(await this.#request("read", request, options));
171
118
  }
172
119
  /** Hosted publication only: stores an immutable package and attaches it, without starting training. */
173
120
  async publishBatch(input, options = {}) {
@@ -187,7 +134,7 @@ var OpenPondLearningClient = class {
187
134
  });
188
135
  const payload = await readBoundedLearningResponse(response);
189
136
  if (!response.ok) {
190
- const error = z2.object({ code: z2.string().optional(), error: z2.string().optional() }).passthrough().safeParse(payload);
137
+ const error = z.object({ code: z.string().optional(), error: z.string().optional() }).passthrough().safeParse(payload);
191
138
  throw new OpenPondLearningError(response.status, error.success ? error.data.code ?? "learning_request_failed" : "learning_request_failed", error.success ? error.data.error ?? `Learning request failed (${response.status}).` : `Learning request failed (${response.status}).`, payload);
192
139
  }
193
140
  return payload;
@@ -219,19 +166,9 @@ async function readBoundedLearningResponse(response) {
219
166
  }
220
167
 
221
168
  export {
222
- LearningSourceCredentialSchema,
223
- LearningSourceCredentialSecretSchema,
224
- LearningSourceCredentialRequestSchema,
225
- LearningSourceCredentialCreatedSchema,
226
- LearningSourceCredentialPageSchema,
227
- LearningSourceConfigurationRequestSchema,
228
- LearningSourceConfigurationSchema,
229
- createSourceCredentialRequest,
230
- assertLearningCredentialExpiry,
231
169
  LearningBatchPublicationSchema,
232
170
  LearningBatchPublicationResultSchema,
233
- OpenPondLearningError,
234
171
  OpenPondLearningClient,
235
172
  readBoundedLearningResponse
236
173
  };
237
- //# sourceMappingURL=chunk-D3WOJTUY.js.map
174
+ //# sourceMappingURL=chunk-C3TS766N.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/learning-client.ts"],"sourcesContent":["import { OpenPondLearningError } from \"./learning-error.js\";\nexport { OpenPondLearningError } from \"./learning-error.js\";\nimport { z } from \"zod\";\nimport {\n LearningCommandRequestSchema, LearningOperationResultSchema, LearningReadRequestSchema,\n TaskEvidenceInspectionResultSchema, sameLearningRef, type LearningRevisionRef,\n LearningPolicyInspectionResultSchema,\n LearningTaskQueueInspectionSchema,\n assertLearningRequestJson,\n learningResourceSchemas, type LearningCommand, type LearningOperationResult,\n type LearningResourceFor, type LearningResourceKind, type LearningResourcePage,\n type LearningResourceQuery, type TaskExampleSubmission, type TaskFeedbackSubmission,\n} from \"@openpond/evals/learning\";\nimport { assertBoundedTaskJson } from \"@openpond/evals/task-schema\";\nimport { LearningSourceCredentialSchema, LearningSourceCredentialRequestSchema, LearningSourceCredentialCreatedSchema, LearningSourceCredentialPageSchema, LearningSourceConfigurationRequestSchema, LearningSourceConfigurationSchema, type LearningSourceCredentialRequest } from \"./learning-credentials.js\";\n\nexport interface OpenPondLearningClientOptions {\n apiKey: string;\n baseUrl: string;\n /** Local profile or hosted team scope. The server checks the credential's ownership. */\n scope: string;\n fetch?: typeof globalThis.fetch;\n}\nexport interface LearningRequestOptions { signal?: AbortSignal }\nexport const LearningBatchPublicationSchema = z.object({\n batchId: z.string().trim().min(1).max(500), modelProjectId: z.string().trim().min(1).max(500),\n}).strict();\nexport const LearningBatchPublicationResultSchema = z.object({\n batchId: z.string().min(1), projectId: z.string().min(1), tasksetId: z.string().min(1),\n releaseId: z.string().min(1), revision: z.number().int().positive(), contentHash: z.string().regex(/^[a-f0-9]{64}$/),\n}).strict();\n/** The same portable commands are sent to the local and hosted execution owner. */\nexport class OpenPondLearningClient {\n readonly #options: OpenPondLearningClientOptions;\n constructor(options: OpenPondLearningClientOptions) {\n if (!options.apiKey.trim() || !options.scope.trim()) throw new Error(\"Learning API key and scope are required.\");\n const url = new URL(options.baseUrl);\n if (![\"http:\", \"https:\"].includes(url.protocol) || url.username || url.password || url.search || url.hash) throw new Error(\"Learning base URL must be an HTTP(S) endpoint without credentials, query, or fragment.\");\n this.#options = { ...options, baseUrl: url.toString().replace(/\\/+$/, \"\") };\n }\n\n async command(command: LearningCommand, options: LearningRequestOptions = {}): Promise<LearningOperationResult> {\n assertLearningRequestJson(command);\n const request = LearningCommandRequestSchema.parse({ scope: this.#options.scope, command });\n const result = LearningOperationResultSchema.parse(await this.#request(\"commands\", request, options));\n if (result.operationId !== command.operationId) throw new OpenPondLearningError(502, \"operation_identity_mismatch\", \"Learning response did not match the submitted operation.\", null);\n return result;\n }\n\n submitExample(example: TaskExampleSubmission, options: LearningRequestOptions = {}) {\n return this.command({ action: \"submit_example\", operationId: example.idempotencyKey, example }, options);\n }\n\n submitFeedback(feedback: TaskFeedbackSubmission, options: LearningRequestOptions = {}) {\n return this.command({ action: \"submit_feedback\", operationId: feedback.idempotencyKey, feedback }, options);\n }\n\n async get<K extends LearningResourceKind>(kind: K, id: string, revision?: number, options: LearningRequestOptions = {}): Promise<LearningResourceFor<K>> {\n const request = LearningReadRequestSchema.parse({ action: \"get\", scope: this.#options.scope, kind, id, ...(revision === undefined ? {} : { revision }) });\n return learningResourceSchemas[kind].parse(await this.#request(\"read\", request, options)) as LearningResourceFor<K>;\n }\n\n async inspectEvidence(evidence: LearningRevisionRef, options: LearningRequestOptions = {}) {\n const request = LearningReadRequestSchema.parse({ action: \"inspect_evidence\", scope: this.#options.scope, evidence });\n const result = TaskEvidenceInspectionResultSchema.parse(await this.#request(\"read\", request, options));\n if (!sameLearningRef(result.evidence, evidence)) throw new OpenPondLearningError(502, \"evidence_identity_mismatch\", \"Inspection did not match the requested evidence release.\", null);\n return result;\n }\n\n /** Read current shared eligibility and budget without reserving or launching work. */\n async inspectTaskQueue(modelProjectId: string | null = null, options: LearningRequestOptions = {}) {\n const request = LearningReadRequestSchema.parse({ action: \"inspect_task_queue\", scope: this.#options.scope, modelProjectId });\n const result = LearningTaskQueueInspectionSchema.parse(await this.#request(\"read\", request, options));\n if (result.modelProjectId !== modelProjectId) throw new OpenPondLearningError(502, \"model_identity_mismatch\", \"Task queue did not match the requested Model.\", null);\n return result;\n }\n\n /** Read current shared eligibility and budget without reserving or launching work. */\n async inspectPolicy(policy: LearningRevisionRef, options: LearningRequestOptions = {}) {\n const request = LearningReadRequestSchema.parse({ action: \"inspect_policy\", scope: this.#options.scope, policy });\n const result = LearningPolicyInspectionResultSchema.parse(await this.#request(\"read\", request, options));\n if (!sameLearningRef(result.policy, policy)) throw new OpenPondLearningError(502, \"policy_identity_mismatch\", \"Inspection did not match the requested policy release.\", null);\n return result;\n }\n\n /** Prepare once with createSourceCredentialRequest and reuse it for retries. */\n async createSourceCredential(input: Omit<Extract<LearningSourceCredentialRequest, { action: \"create\" }>, \"action\" | \"scope\">, options: LearningRequestOptions = {}) {\n const request = LearningSourceCredentialRequestSchema.parse({ ...input, action: \"create\", scope: this.#options.scope });\n const result = LearningSourceCredentialCreatedSchema.parse(await this.#request(\"credentials\", request, options));\n this.#assertCredentialScope(result.credential, input.sourceId);\n if (result.apiKey !== input.apiKey || !input.apiKey.startsWith(`${result.credential.keyPrefix}_`)) throw new OpenPondLearningError(502, \"credential_identity_mismatch\", \"Credential response did not match the prepared credential.\", null);\n return result;\n }\n\n async listSourceCredentials(sourceId: string, query: { afterId?: string; limit?: number } = {}, options: LearningRequestOptions = {}) {\n const request = LearningSourceCredentialRequestSchema.parse({ ...query, action: \"list\", scope: this.#options.scope, sourceId });\n const result = LearningSourceCredentialPageSchema.parse(await this.#request(\"credentials\", request, options));\n if (result.items.length > (query.limit ?? 30)) throw new OpenPondLearningError(502, \"credential_page_invalid\", \"Credential response exceeded the requested page size.\", null);\n for (const item of result.items) this.#assertCredentialScope(item, sourceId);\n return result;\n }\n\n async revokeSourceCredential(sourceId: string, id: string, options: LearningRequestOptions = {}) {\n const request = LearningSourceCredentialRequestSchema.parse({ action: \"revoke\", scope: this.#options.scope, sourceId, id });\n const result = LearningSourceCredentialSchema.parse(await this.#request(\"credentials\", request, options));\n this.#assertCredentialScope(result, sourceId);\n if (result.id !== id || result.revokedAt === null) throw new OpenPondLearningError(502, \"credential_revocation_mismatch\", \"Credential revocation did not match the requested credential.\", null);\n return result;\n }\n\n async sourceConfiguration(sourceId: string, options: LearningRequestOptions = {}) {\n const request = LearningSourceConfigurationRequestSchema.parse({ scope: this.#options.scope, sourceId });\n const result = LearningSourceConfigurationSchema.parse(await this.#request(\"source-config\", request, options));\n if (result.scope !== this.#options.scope || result.source.id !== sourceId) throw new OpenPondLearningError(502, \"source_identity_mismatch\", \"Source configuration did not match the requested source.\", null);\n return result;\n }\n\n #assertCredentialScope(value: { scope: string; sourceId: string }, sourceId: string) {\n if (value.scope !== this.#options.scope || value.sourceId !== sourceId) throw new OpenPondLearningError(502, \"credential_scope_mismatch\", \"Credential response did not match the requested source.\", null);\n }\n\n async list<K extends LearningResourceKind>(kind: K, query: Partial<LearningResourceQuery> = {}, options: LearningRequestOptions = {}): Promise<LearningResourcePage<K>> {\n const request = LearningReadRequestSchema.parse({ action: \"list\", scope: this.#options.scope, kind, ...query });\n return z.object({ items: z.array(learningResourceSchemas[kind]).max(100), nextCursor: z.string().nullable() }).strict().parse(await this.#request(\"read\", request, options)) as LearningResourcePage<K>;\n }\n\n /** Hosted publication only: stores an immutable package and attaches it, without starting training. */\n async publishBatch(input: z.infer<typeof LearningBatchPublicationSchema>, options: LearningRequestOptions = {}) {\n const request = LearningBatchPublicationSchema.parse(input);\n const result = LearningBatchPublicationResultSchema.parse(await this.#request(\"publish-batch\", { ...request, scope: this.#options.scope }, options));\n if (result.batchId !== request.batchId) throw new OpenPondLearningError(502, \"batch_identity_mismatch\", \"Published batch response did not match the requested batch.\", null);\n return result;\n }\n\n async #request(endpoint: \"commands\" | \"read\" | \"publish-batch\" | \"credentials\" | \"source-config\", body: unknown, options: LearningRequestOptions): Promise<unknown> {\n assertBoundedTaskJson(body, 16_777_216);\n const response = await (this.#options.fetch ?? globalThis.fetch)(`${this.#options.baseUrl}/v1/learning/${endpoint}`, {\n method: \"POST\", headers: { Authorization: `Bearer ${this.#options.apiKey}`, \"Content-Type\": \"application/json\", Accept: \"application/json\", \"X-OpenPond-Team-Id\": this.#options.scope }, body: JSON.stringify(body), signal: options.signal,\n redirect: \"error\",\n });\n const payload = await readBoundedLearningResponse(response);\n if (!response.ok) {\n const error = z.object({ code: z.string().optional(), error: z.string().optional() }).passthrough().safeParse(payload);\n throw new OpenPondLearningError(response.status, error.success ? error.data.code ?? \"learning_request_failed\" : \"learning_request_failed\", error.success ? error.data.error ?? `Learning request failed (${response.status}).` : `Learning request failed (${response.status}).`, payload);\n }\n return payload;\n }\n}\n\nexport async function readBoundedLearningResponse(response: Response): Promise<unknown> {\n const maximumBytes = 16_777_216;\n const reader = response.body?.getReader();\n if (!reader) throw new OpenPondLearningError(response.status, \"empty_response\", \"Learning response was empty.\", null);\n const decoder = new TextDecoder();\n let bytes = 0;\n let text = \"\";\n try {\n while (true) {\n const next = await reader.read();\n if (next.done) break;\n bytes += next.value.byteLength;\n if (bytes > maximumBytes) throw new OpenPondLearningError(response.status, \"response_too_large\", \"Learning response exceeded 16 MiB; request a smaller page.\", null);\n text += decoder.decode(next.value, { stream: true });\n }\n text += decoder.decode();\n const value: unknown = JSON.parse(text);\n assertBoundedTaskJson(value, maximumBytes);\n return value;\n } finally {\n await reader.cancel();\n reader.releaseLock();\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  HarnessExperimentPolicySchema,
3
3
  ModelTasksetRunRequestSchema
4
- } from "./chunk-EWRWGFKD.js";
4
+ } from "./chunk-ZYDDHHZZ.js";
5
5
  import {
6
6
  contentHash
7
7
  } from "./chunk-H3JZ3P5T.js";
@@ -172,4 +172,4 @@ export {
172
172
  verifyExperimentDefinition,
173
173
  experimentDefinitionRef
174
174
  };
175
- //# sourceMappingURL=chunk-WYR3MZHU.js.map
175
+ //# sourceMappingURL=chunk-C4W2MEFP.js.map