openpond-sdk 0.9.8 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/README.md +18 -17
  2. package/dist/{chunk-4HZORGK3.js → chunk-2ZJRG3KL.js} +13 -4
  3. package/dist/chunk-2ZJRG3KL.js.map +7 -0
  4. package/dist/{chunk-YYJ4T4U4.js → chunk-7B44TQZD.js} +2 -2
  5. package/dist/{chunk-KYCQ7LZ4.js → chunk-DSGGM2ME.js} +2 -2
  6. package/dist/chunk-DSGGM2ME.js.map +7 -0
  7. package/dist/{chunk-3HV3G6DG.js → chunk-I2YM3UY4.js} +2 -2
  8. package/dist/{chunk-6D4JIOOC.js → chunk-I3TQTXKB.js} +2 -2
  9. package/dist/{chunk-WOPM32SE.js → chunk-JA3KFK3U.js} +7 -1
  10. package/dist/chunk-JA3KFK3U.js.map +7 -0
  11. package/dist/{chunk-A4ZDOZKP.js → chunk-K3JCP4FO.js} +11 -5
  12. package/dist/chunk-K3JCP4FO.js.map +7 -0
  13. package/dist/{chunk-TQ5ASK7D.js → chunk-PJ2VLNJF.js} +21 -3
  14. package/dist/chunk-PJ2VLNJF.js.map +7 -0
  15. package/dist/chunk-PRRUBH2B.js +314 -0
  16. package/dist/chunk-PRRUBH2B.js.map +7 -0
  17. package/dist/{chunk-BGXWHDYM.js → chunk-W5TXWVFS.js} +9 -2
  18. package/dist/chunk-W5TXWVFS.js.map +7 -0
  19. package/dist/dataset-workspaces.js +14 -10
  20. package/dist/dataset-workspaces.js.map +2 -2
  21. package/dist/experiments.js +71 -58
  22. package/dist/experiments.js.map +4 -4
  23. package/dist/index.js +4 -4
  24. package/dist/learning.js +8 -0
  25. package/dist/learning.js.map +3 -3
  26. package/dist/model-starter-attempts.js +1 -1
  27. package/dist/model-starter-catalog.js +2 -2
  28. package/dist/model-starters.js +8 -4
  29. package/dist/model-taskset-runs.js +2 -2
  30. package/dist/taskset-catalog.js +1 -1
  31. package/dist/taskset-drafts.js +3 -3
  32. package/dist/taskset-packages.js +8 -6
  33. package/dist/taskset-packages.js.map +1 -1
  34. package/dist/training-bundle.js +2 -2
  35. package/dist/training-projects.js +2 -0
  36. package/dist/training-projects.js.map +2 -2
  37. package/dist/types/packages/sdk/src/dataset-grader-selection.d.ts +24 -0
  38. package/dist/types/packages/sdk/src/dataset-grader-selection.d.ts.map +1 -0
  39. package/dist/types/packages/sdk/src/dataset-population.d.ts +1 -0
  40. package/dist/types/packages/sdk/src/dataset-population.d.ts.map +1 -1
  41. package/dist/types/packages/sdk/src/dataset-workspace-client.d.ts +2 -4
  42. package/dist/types/packages/sdk/src/dataset-workspace-client.d.ts.map +1 -1
  43. package/dist/types/packages/sdk/src/dataset-workspace-contracts.d.ts +11 -0
  44. package/dist/types/packages/sdk/src/dataset-workspace-contracts.d.ts.map +1 -1
  45. package/dist/types/packages/sdk/src/experiment-client.d.ts +904 -502
  46. package/dist/types/packages/sdk/src/experiment-client.d.ts.map +1 -1
  47. package/dist/types/packages/sdk/src/experiment-contracts.d.ts +51 -2
  48. package/dist/types/packages/sdk/src/experiment-contracts.d.ts.map +1 -1
  49. package/dist/types/packages/sdk/src/experiment-execution-selection.d.ts +58 -0
  50. package/dist/types/packages/sdk/src/experiment-execution-selection.d.ts.map +1 -0
  51. package/dist/types/packages/sdk/src/experiment-harness-catalog.d.ts +24 -0
  52. package/dist/types/packages/sdk/src/experiment-harness-catalog.d.ts.map +1 -0
  53. package/dist/types/packages/sdk/src/experiment-run-contracts.d.ts +121 -0
  54. package/dist/types/packages/sdk/src/experiment-run-contracts.d.ts.map +1 -0
  55. package/dist/types/packages/sdk/src/experiment-run-details.d.ts +724 -0
  56. package/dist/types/packages/sdk/src/experiment-run-details.d.ts.map +1 -0
  57. package/dist/types/packages/sdk/src/experiment-scoring-contracts.d.ts +2 -0
  58. package/dist/types/packages/sdk/src/experiment-scoring-contracts.d.ts.map +1 -1
  59. package/dist/types/packages/sdk/src/experiments.d.ts +5 -1
  60. package/dist/types/packages/sdk/src/experiments.d.ts.map +1 -1
  61. package/dist/types/packages/sdk/src/grader-feedback-key.d.ts +3 -0
  62. package/dist/types/packages/sdk/src/grader-feedback-key.d.ts.map +1 -0
  63. package/dist/types/packages/sdk/src/learning.d.ts +1 -0
  64. package/dist/types/packages/sdk/src/learning.d.ts.map +1 -1
  65. package/dist/types/packages/sdk/src/model-starter-attempts.d.ts +156 -0
  66. package/dist/types/packages/sdk/src/model-starter-attempts.d.ts.map +1 -1
  67. package/dist/types/packages/sdk/src/model-starter-execution.d.ts +1 -0
  68. package/dist/types/packages/sdk/src/model-starter-execution.d.ts.map +1 -1
  69. package/dist/types/packages/sdk/src/model-starters.d.ts +1 -0
  70. package/dist/types/packages/sdk/src/model-starters.d.ts.map +1 -1
  71. package/dist/types/packages/sdk/src/model-taskset-runs-contracts.d.ts +44 -0
  72. package/dist/types/packages/sdk/src/model-taskset-runs-contracts.d.ts.map +1 -1
  73. package/dist/types/packages/sdk/src/model-taskset-runs.d.ts +44 -0
  74. package/dist/types/packages/sdk/src/model-taskset-runs.d.ts.map +1 -1
  75. package/dist/types/packages/sdk/src/taskset-catalog.d.ts +7 -0
  76. package/dist/types/packages/sdk/src/taskset-catalog.d.ts.map +1 -1
  77. package/dist/types/packages/sdk/src/taskset-package-client.d.ts +1468 -0
  78. package/dist/types/packages/sdk/src/taskset-package-client.d.ts.map +1 -1
  79. package/dist/types/packages/sdk/src/training-project-client.d.ts +56 -4
  80. package/dist/types/packages/sdk/src/training-project-client.d.ts.map +1 -1
  81. package/dist/types/packages/sdk/src/training-project-contracts.d.ts +71 -6
  82. package/dist/types/packages/sdk/src/training-project-contracts.d.ts.map +1 -1
  83. package/package.json +2 -2
  84. package/dist/chunk-4HZORGK3.js.map +0 -7
  85. package/dist/chunk-A4ZDOZKP.js.map +0 -7
  86. package/dist/chunk-BGXWHDYM.js.map +0 -7
  87. package/dist/chunk-KYCQ7LZ4.js.map +0 -7
  88. package/dist/chunk-RXKIOOFZ.js +0 -256
  89. package/dist/chunk-RXKIOOFZ.js.map +0 -7
  90. package/dist/chunk-TQ5ASK7D.js.map +0 -7
  91. package/dist/chunk-WOPM32SE.js.map +0 -7
  92. package/dist/types/packages/sdk/src/experiment-history.d.ts +0 -266
  93. package/dist/types/packages/sdk/src/experiment-history.d.ts.map +0 -1
  94. /package/dist/{chunk-YYJ4T4U4.js.map → chunk-7B44TQZD.js.map} +0 -0
  95. /package/dist/{chunk-3HV3G6DG.js.map → chunk-I2YM3UY4.js.map} +0 -0
  96. /package/dist/{chunk-6D4JIOOC.js.map → chunk-I3TQTXKB.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/taskset-package-client.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\nimport { TasksetCatalogReleaseRefSchema } from \"./taskset-catalog.js\";\nimport { MAX_TASKSET_PACKAGE_BYTES, TasksetPackageSchema, tasksetPackageRewardBinding, validateTasksetPackage, type TasksetPackage } from \"./taskset-package-contracts.js\";\nimport { HostedModelProjectSummarySchema, HostedModelProjectSyncSchema, HostedModelProjectTrainingSetupSchema } from \"./model-projects.js\";\nimport { contentHash } from \"@openpond/harness\";\nimport { learningRef } from \"@openpond/evals/learning\";\n\nconst IdSchema = z.string().trim().min(1).max(500);\nconst HashSchema = z.string().regex(/^[a-f0-9]{64}$/);\n/** Configuration and package selection share one hosted commit. Package-owned\n * references cannot accidentally contain a Desktop-local content hash. */\nexport const TasksetPackageModelConfigurationSchema = HostedModelProjectSyncSchema.pick({\n portableProjectId: true, name: true, objective: true, defaultBaseModel: true, defaultDestinationId: true,\n sourceRevision: true, sourceUpdatedAt: true,\n}).extend({ trainingSetup: HostedModelProjectTrainingSetupSchema.omit({ tasksetRef: true, rewardBindingRef: true, tasksetRelease: true }) }).strict();\nexport const TasksetPackagePublicationSchema = z.object({\n schemaVersion: z.literal(\"openpond.tasksetPackagePublication.v1\"),\n operationId: IdSchema, modelProjectId: IdSchema, expectedProjectEtag: HashSchema.nullable(),\n name: z.string().trim().min(1).max(200), description: z.string().max(5_000),\n buildIntent: z.enum([\"demonstrations\", \"preferences\", \"verifiable_reward\", \"rubric\", \"discovery\"]),\n methodHint: z.enum([\"sft\", \"dpo\", \"grpo\", \"ppo\"]).nullable(), package: TasksetPackageSchema,\n modelConfiguration: TasksetPackageModelConfigurationSchema.optional(),\n evaluationPackage: TasksetPackageSchema.optional(),\n selection: z.enum([\"select\", \"attach\"]).optional(),\n}).strict().refine(value => value.selection !== \"attach\" || value.modelConfiguration === undefined, \"Attachment-only publication cannot replace Model configuration.\")\n .refine(value => !value.evaluationPackage || (value.modelConfiguration !== undefined\n && value.modelConfiguration.trainingSetup.evaluationTasksetRef != null\n && contentHash(value.modelConfiguration.trainingSetup.evaluationTasksetRef) === contentHash(learningRef(value.evaluationPackage.taskset))),\n \"Evaluation package must match the selected immutable evaluation in Model configuration.\");\nexport const TasksetPackageReceiptSchema = z.object({\n schemaVersion: z.literal(\"openpond.tasksetPackageReceipt.v1\"),\n teamId: IdSchema, modelProjectId: IdSchema, operationId: IdSchema,\n taskset: TasksetCatalogReleaseRefSchema, packageHash: HashSchema,\n hostedTasksetId: IdSchema, projectEtag: HashSchema,\n project: HostedModelProjectSummarySchema.optional(),\n selection: z.enum([\"select\", \"attach\"]).optional(),\n evaluation: z.object({ taskset: TasksetCatalogReleaseRefSchema, packageHash: HashSchema, hostedTasksetId: IdSchema }).strict().optional(),\n}).strict();\nexport const TasksetPackageReadbackSchema = z.object({\n schemaVersion: z.literal(\"openpond.tasksetPackageReadback.v1\"),\n teamId: IdSchema, modelProjectId: IdSchema, package: TasksetPackageSchema,\n}).strict();\nexport const TasksetReleasePackageReadbackSchema=z.object({\n schemaVersion:z.literal(\"openpond.tasksetReleasePackageReadback.v1\"),\n teamId:IdSchema,release:TasksetCatalogReleaseRefSchema,package:TasksetPackageSchema,\n}).strict();\nexport type TasksetPackagePublication = z.infer<typeof TasksetPackagePublicationSchema>;\nexport type TasksetPackageReceipt = z.infer<typeof TasksetPackageReceiptSchema>;\nexport type TasksetPackageModelConfiguration = z.infer<typeof TasksetPackageModelConfigurationSchema>;\n\nexport class OpenPondTasksetPackageError extends Error {\n constructor(readonly status: number, readonly code: string, message: string) { super(message); this.name = \"OpenPondTasksetPackageError\"; }\n}\n\n/** Private package operations are explicitly scoped to an authorized Model.\n * Catalog inventory remains metadata-only and never calls this client itself. */\nexport class OpenPondTasksetPackageClient {\n readonly #options: { baseUrl: string; apiKey: string; teamId: string; fetch?: typeof globalThis.fetch };\n constructor(options: { baseUrl: string; apiKey: string; teamId: string; fetch?: typeof globalThis.fetch }) {\n const url = new URL(options.baseUrl);\n if (![\"http:\", \"https:\"].includes(url.protocol) || url.username || url.password || url.search || url.hash || !options.apiKey.trim() || !options.teamId.trim()) throw new Error(\"Taskset package client requires a clean HTTP(S) endpoint and workspace credentials.\");\n this.#options = { ...options, baseUrl: url.toString().replace(/\\/+$/, \"\") };\n }\n\n async publish(input: TasksetPackagePublication, options: { signal?: AbortSignal } = {}): Promise<TasksetPackageReceipt> {\n const request = TasksetPackagePublicationSchema.parse(input);\n validateTasksetPackage(request.package);\n if (request.evaluationPackage) validateTasksetPackage(request.evaluationPackage);\n const receipt = TasksetPackageReceiptSchema.parse(await this.#request(\"\", \"POST\", request, options.signal));\n const release = request.package.taskset;\n if (receipt.teamId !== this.#options.teamId || receipt.modelProjectId !== request.modelProjectId || receipt.operationId !== request.operationId\n || receipt.packageHash !== request.package.contentHash || receipt.taskset.id !== release.id || receipt.taskset.revision !== release.revision || receipt.taskset.contentHash !== release.contentHash) {\n throw new OpenPondTasksetPackageError(502, \"package_receipt_mismatch\", \"Taskset publication receipt did not match the requested package and owner.\");\n }\n if (request.selection !== undefined && receipt.selection !== request.selection) throw new OpenPondTasksetPackageError(502, \"package_receipt_mismatch\", \"Taskset publication did not retain its selection mode.\");\n if (request.evaluationPackage && (!receipt.evaluation\n || receipt.evaluation.packageHash !== request.evaluationPackage.contentHash\n || contentHash(receipt.evaluation.taskset) !== contentHash(learningRef(request.evaluationPackage.taskset)))) {\n throw new OpenPondTasksetPackageError(502, \"package_receipt_mismatch\", \"Taskset publication did not retain the complete selected evaluation package.\");\n }\n if (request.selection === \"attach\" && receipt.projectEtag !== request.expectedProjectEtag) throw new OpenPondTasksetPackageError(502, \"package_receipt_mismatch\", \"Attaching a historical Taskset changed the Model configuration.\");\n if (request.modelConfiguration) {\n const expected = request.modelConfiguration;\n const project = receipt.project;\n const binding = tasksetPackageRewardBinding(request.package);\n const setup = HostedModelProjectTrainingSetupSchema.parse({ ...expected.trainingSetup, tasksetRef: learningRef(release),\n rewardBindingRef: binding ? learningRef(binding) : null,\n tasksetRelease: null });\n if (!project || project.teamId !== this.#options.teamId || project.etag !== receipt.projectEtag\n || ![project.id, project.portableProjectId].includes(request.modelProjectId)\n || project.portableProjectId !== expected.portableProjectId || project.name !== expected.name || project.objective !== expected.objective\n || project.sourceRevision !== expected.sourceRevision || Date.parse(project.sourceUpdatedAt) !== Date.parse(expected.sourceUpdatedAt)\n || contentHash(project.defaultBaseModel) !== contentHash(expected.defaultBaseModel) || project.defaultDestinationId !== expected.defaultDestinationId\n || contentHash(project.trainingSetup) !== contentHash(setup)) {\n throw new OpenPondTasksetPackageError(502, \"package_receipt_mismatch\", \"Taskset publication did not retain the requested Model configuration.\");\n }\n }\n return receipt;\n }\n\n /** Owner-authorized independent Dataset transfer. Callers retain private\n * bytes at the evaluator/server boundary, never in a policy-facing picker. */\n async getByRelease(reference:z.infer<typeof TasksetCatalogReleaseRefSchema>,options:{signal?:AbortSignal;expectedPackageHash?:string}={}):Promise<TasksetPackage> {\n const ref=TasksetCatalogReleaseRefSchema.parse(reference);\n const expectedPackageHash=options.expectedPackageHash===undefined?undefined:HashSchema.parse(options.expectedPackageHash);\n const response=TasksetReleasePackageReadbackSchema.parse(await this.#request(`/releases/${encodeURIComponent(ref.id)}/${ref.revision}/${ref.contentHash}/package`,\"GET\",undefined,options.signal));\n const value=validateTasksetPackage(response.package),release={id:value.taskset.id,revision:value.taskset.revision,contentHash:value.taskset.contentHash};\n if(response.teamId!==this.#options.teamId||contentHash(response.release)!==contentHash(ref)||contentHash(release)!==contentHash(ref)\n ||expectedPackageHash!==undefined&&value.contentHash!==expectedPackageHash)\n throw new OpenPondTasksetPackageError(502,\"package_readback_mismatch\",\"Independent Dataset package differs from the requested workspace or exact release.\");\n return value;\n }\n\n async get(modelProjectId: string, reference: z.infer<typeof TasksetCatalogReleaseRefSchema>, options: { signal?: AbortSignal; expectedPackageHash?: string } = {}): Promise<TasksetPackage> {\n const project = IdSchema.parse(modelProjectId);\n const ref = TasksetCatalogReleaseRefSchema.parse(reference);\n const expectedPackageHash = options.expectedPackageHash === undefined ? undefined : HashSchema.parse(options.expectedPackageHash);\n const response = TasksetPackageReadbackSchema.parse(await this.#request(`/${encodeURIComponent(project)}/${encodeURIComponent(ref.id)}/${ref.revision}/${ref.contentHash}`, \"GET\", undefined, options.signal));\n const taskset = response.package.taskset;\n if (response.teamId !== this.#options.teamId || response.modelProjectId !== project || taskset.id !== ref.id || taskset.revision !== ref.revision || taskset.contentHash !== ref.contentHash) throw new OpenPondTasksetPackageError(502, \"package_readback_mismatch\", \"Taskset package did not match the requested release and owner.\");\n if (expectedPackageHash !== undefined && response.package.contentHash !== expectedPackageHash) throw new OpenPondTasksetPackageError(502, \"package_readback_mismatch\", \"Taskset package did not match the saved publication receipt.\");\n return validateTasksetPackage(response.package);\n }\n\n async #request(path: string, method: string, body: unknown, signal?: AbortSignal): Promise<unknown> {\n const serialized = body === undefined ? undefined : JSON.stringify(body);\n if (serialized && new TextEncoder().encode(serialized).byteLength > MAX_TASKSET_PACKAGE_BYTES) throw new OpenPondTasksetPackageError(413, \"package_too_large\", \"Taskset publication exceeds the 64 MiB envelope.\");\n const response = await (this.#options.fetch ?? globalThis.fetch)(`${this.#options.baseUrl}/v1/taskset-packages${path}`, {\n method, headers: { Authorization: `Bearer ${this.#options.apiKey}`, \"X-OpenPond-Team-Id\": this.#options.teamId, Accept: \"application/json\", ...(serialized ? { \"Content-Type\": \"application/json\" } : {}) },\n body: serialized, signal, redirect: \"error\",\n });\n const reader = response.body?.getReader();\n if (!reader) throw new OpenPondTasksetPackageError(response.status, \"empty_response\", \"Taskset package response was empty.\");\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n let bytes = 0;\n let text = \"\";\n try {\n while (true) {\n const chunk = await reader.read();\n if (chunk.done) break;\n bytes += chunk.value.byteLength;\n if (bytes > MAX_TASKSET_PACKAGE_BYTES) throw new OpenPondTasksetPackageError(413, \"package_too_large\", \"Taskset response exceeds the 64 MiB envelope.\");\n text += decoder.decode(chunk.value, { stream: true });\n }\n text += decoder.decode();\n } finally { await reader.cancel(); reader.releaseLock(); }\n const payload: unknown = JSON.parse(text);\n if (!response.ok) {\n const error = z.object({ code: z.string(), message: z.string() }).safeParse(payload);\n throw new OpenPondTasksetPackageError(response.status, error.success ? error.data.code : \"package_request_failed\", error.success ? error.data.message : `Taskset package request failed (${response.status}).`);\n }\n return payload;\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA,SAAS,SAAS;AAKlB,SAAS,mBAAmB;AAE5B,IAAM,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AACjD,IAAM,aAAa,EAAE,OAAO,EAAE,MAAM,gBAAgB;AAG7C,IAAM,yCAAyC,6BAA6B,KAAK;AAAA,EACtF,mBAAmB;AAAA,EAAM,MAAM;AAAA,EAAM,WAAW;AAAA,EAAM,kBAAkB;AAAA,EAAM,sBAAsB;AAAA,EACpG,gBAAgB;AAAA,EAAM,iBAAiB;AACzC,CAAC,EAAE,OAAO,EAAE,eAAe,sCAAsC,KAAK,EAAE,YAAY,MAAM,kBAAkB,MAAM,gBAAgB,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO;AAC7I,IAAM,kCAAkC,EAAE,OAAO;AAAA,EACtD,eAAe,EAAE,QAAQ,uCAAuC;AAAA,EAChE,aAAa;AAAA,EAAU,gBAAgB;AAAA,EAAU,qBAAqB,WAAW,SAAS;AAAA,EAC1F,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAAG,aAAa,EAAE,OAAO,EAAE,IAAI,GAAK;AAAA,EAC1E,aAAa,EAAE,KAAK,CAAC,kBAAkB,eAAe,qBAAqB,UAAU,WAAW,CAAC;AAAA,EACjG,YAAY,EAAE,KAAK,CAAC,OAAO,OAAO,QAAQ,KAAK,CAAC,EAAE,SAAS;AAAA,EAAG,SAAS;AAAA,EACvE,oBAAoB,uCAAuC,SAAS;AAAA,EACpE,mBAAmB,qBAAqB,SAAS;AAAA,EACjD,WAAW,EAAE,KAAK,CAAC,UAAU,QAAQ,CAAC,EAAE,SAAS;AACnD,CAAC,EAAE,OAAO,EAAE,OAAO,WAAS,MAAM,cAAc,YAAY,MAAM,uBAAuB,QAAW,iEAAiE,EAClK;AAAA,EAAO,WAAS,CAAC,MAAM,qBAAsB,MAAM,uBAAuB,UACtE,MAAM,mBAAmB,cAAc,wBAAwB,QAC/D,YAAY,MAAM,mBAAmB,cAAc,oBAAoB,MAAM,YAAY,YAAY,MAAM,kBAAkB,OAAO,CAAC;AAAA,EAC1I;AAAyF;AACpF,IAAM,8BAA8B,EAAE,OAAO;AAAA,EAClD,eAAe,EAAE,QAAQ,mCAAmC;AAAA,EAC5D,QAAQ;AAAA,EAAU,gBAAgB;AAAA,EAAU,aAAa;AAAA,EACzD,SAAS;AAAA,EAAgC,aAAa;AAAA,EACtD,iBAAiB;AAAA,EAAU,aAAa;AAAA,EACxC,SAAS,gCAAgC,SAAS;AAAA,EAClD,WAAW,EAAE,KAAK,CAAC,UAAU,QAAQ,CAAC,EAAE,SAAS;AAAA,EACjD,YAAY,EAAE,OAAO,EAAE,SAAS,gCAAgC,aAAa,YAAY,iBAAiB,SAAS,CAAC,EAAE,OAAO,EAAE,SAAS;AAC1I,CAAC,EAAE,OAAO;AACH,IAAM,+BAA+B,EAAE,OAAO;AAAA,EACnD,eAAe,EAAE,QAAQ,oCAAoC;AAAA,EAC7D,QAAQ;AAAA,EAAU,gBAAgB;AAAA,EAAU,SAAS;AACvD,CAAC,EAAE,OAAO;AACH,IAAM,sCAAoC,EAAE,OAAO;AAAA,EACxD,eAAc,EAAE,QAAQ,2CAA2C;AAAA,EACnE,QAAO;AAAA,EAAS,SAAQ;AAAA,EAA+B,SAAQ;AACjE,CAAC,EAAE,OAAO;AAKH,IAAM,8BAAN,cAA0C,MAAM;AAAA,EACrD,YAAqB,QAAyB,MAAc,SAAiB;AAAE,UAAM,OAAO;AAAvE;AAAyB;AAAiD,SAAK,OAAO;AAAA,EAA+B;AAAA,EAArH;AAAA,EAAyB;AAChD;AAIO,IAAM,+BAAN,MAAmC;AAAA,EAC/B;AAAA,EACT,YAAY,SAA+F;AACzG,UAAM,MAAM,IAAI,IAAI,QAAQ,OAAO;AACnC,QAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,SAAS,IAAI,QAAQ,KAAK,IAAI,YAAY,IAAI,YAAY,IAAI,UAAU,IAAI,QAAQ,CAAC,QAAQ,OAAO,KAAK,KAAK,CAAC,QAAQ,OAAO,KAAK,EAAG,OAAM,IAAI,MAAM,qFAAqF;AACpQ,SAAK,WAAW,EAAE,GAAG,SAAS,SAAS,IAAI,SAAS,EAAE,QAAQ,QAAQ,EAAE,EAAE;AAAA,EAC5E;AAAA,EAEA,MAAM,QAAQ,OAAkC,UAAoC,CAAC,GAAmC;AACtH,UAAM,UAAU,gCAAgC,MAAM,KAAK;AAC3D,2BAAuB,QAAQ,OAAO;AACtC,QAAI,QAAQ,kBAAmB,wBAAuB,QAAQ,iBAAiB;AAC/E,UAAM,UAAU,4BAA4B,MAAM,MAAM,KAAK,SAAS,IAAI,QAAQ,SAAS,QAAQ,MAAM,CAAC;AAC1G,UAAM,UAAU,QAAQ,QAAQ;AAChC,QAAI,QAAQ,WAAW,KAAK,SAAS,UAAU,QAAQ,mBAAmB,QAAQ,kBAAkB,QAAQ,gBAAgB,QAAQ,eAC/H,QAAQ,gBAAgB,QAAQ,QAAQ,eAAe,QAAQ,QAAQ,OAAO,QAAQ,MAAM,QAAQ,QAAQ,aAAa,QAAQ,YAAY,QAAQ,QAAQ,gBAAgB,QAAQ,aAAa;AACrM,YAAM,IAAI,4BAA4B,KAAK,4BAA4B,4EAA4E;AAAA,IACrJ;AACA,QAAI,QAAQ,cAAc,UAAa,QAAQ,cAAc,QAAQ,UAAW,OAAM,IAAI,4BAA4B,KAAK,4BAA4B,wDAAwD;AAC/M,QAAI,QAAQ,sBAAsB,CAAC,QAAQ,cACtC,QAAQ,WAAW,gBAAgB,QAAQ,kBAAkB,eAC7D,YAAY,QAAQ,WAAW,OAAO,MAAM,YAAY,YAAY,QAAQ,kBAAkB,OAAO,CAAC,IAAI;AAC7G,YAAM,IAAI,4BAA4B,KAAK,4BAA4B,8EAA8E;AAAA,IACvJ;AACA,QAAI,QAAQ,cAAc,YAAY,QAAQ,gBAAgB,QAAQ,oBAAqB,OAAM,IAAI,4BAA4B,KAAK,4BAA4B,iEAAiE;AACnO,QAAI,QAAQ,oBAAoB;AAC9B,YAAM,WAAW,QAAQ;AACzB,YAAM,UAAU,QAAQ;AACxB,YAAM,UAAU,4BAA4B,QAAQ,OAAO;AAC3D,YAAM,QAAQ,sCAAsC,MAAM;AAAA,QAAE,GAAG,SAAS;AAAA,QAAe,YAAY,YAAY,OAAO;AAAA,QACpH,kBAAkB,UAAU,YAAY,OAAO,IAAI;AAAA,QACnD,gBAAgB;AAAA,MAAK,CAAC;AACxB,UAAI,CAAC,WAAW,QAAQ,WAAW,KAAK,SAAS,UAAU,QAAQ,SAAS,QAAQ,eAC/E,CAAC,CAAC,QAAQ,IAAI,QAAQ,iBAAiB,EAAE,SAAS,QAAQ,cAAc,KACxE,QAAQ,sBAAsB,SAAS,qBAAqB,QAAQ,SAAS,SAAS,QAAQ,QAAQ,cAAc,SAAS,aAC7H,QAAQ,mBAAmB,SAAS,kBAAkB,KAAK,MAAM,QAAQ,eAAe,MAAM,KAAK,MAAM,SAAS,eAAe,KACjI,YAAY,QAAQ,gBAAgB,MAAM,YAAY,SAAS,gBAAgB,KAAK,QAAQ,yBAAyB,SAAS,wBAC9H,YAAY,QAAQ,aAAa,MAAM,YAAY,KAAK,GAAG;AAC9D,cAAM,IAAI,4BAA4B,KAAK,4BAA4B,uEAAuE;AAAA,MAChJ;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA,EAIA,MAAM,aAAa,WAAyD,UAA0D,CAAC,GAA2B;AAChK,UAAM,MAAI,+BAA+B,MAAM,SAAS;AACxD,UAAM,sBAAoB,QAAQ,wBAAsB,SAAU,SAAU,WAAW,MAAM,QAAQ,mBAAmB;AACxH,UAAM,WAAS,oCAAoC,MAAM,MAAM,KAAK,SAAS,aAAa,mBAAmB,IAAI,EAAE,CAAC,IAAI,IAAI,QAAQ,IAAI,IAAI,WAAW,YAAW,OAAM,QAAU,QAAQ,MAAM,CAAC;AACjM,UAAM,QAAM,uBAAuB,SAAS,OAAO,GAAE,UAAQ,EAAC,IAAG,MAAM,QAAQ,IAAG,UAAS,MAAM,QAAQ,UAAS,aAAY,MAAM,QAAQ,YAAW;AACvJ,QAAG,SAAS,WAAS,KAAK,SAAS,UAAQ,YAAY,SAAS,OAAO,MAAI,YAAY,GAAG,KAAG,YAAY,OAAO,MAAI,YAAY,GAAG,KAC/H,wBAAsB,UAAW,MAAM,gBAAc;AACvD,YAAM,IAAI,4BAA4B,KAAI,6BAA4B,oFAAoF;AAC5J,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,gBAAwB,WAA2D,UAAkE,CAAC,GAA4B;AAC1L,UAAM,UAAU,SAAS,MAAM,cAAc;AAC7C,UAAM,MAAM,+BAA+B,MAAM,SAAS;AAC1D,UAAM,sBAAsB,QAAQ,wBAAwB,SAAY,SAAY,WAAW,MAAM,QAAQ,mBAAmB;AAChI,UAAM,WAAW,6BAA6B,MAAM,MAAM,KAAK,SAAS,IAAI,mBAAmB,OAAO,CAAC,IAAI,mBAAmB,IAAI,EAAE,CAAC,IAAI,IAAI,QAAQ,IAAI,IAAI,WAAW,IAAI,OAAO,QAAW,QAAQ,MAAM,CAAC;AAC7M,UAAM,UAAU,SAAS,QAAQ;AACjC,QAAI,SAAS,WAAW,KAAK,SAAS,UAAU,SAAS,mBAAmB,WAAW,QAAQ,OAAO,IAAI,MAAM,QAAQ,aAAa,IAAI,YAAY,QAAQ,gBAAgB,IAAI,YAAa,OAAM,IAAI,4BAA4B,KAAK,6BAA6B,gEAAgE;AACtU,QAAI,wBAAwB,UAAa,SAAS,QAAQ,gBAAgB,oBAAqB,OAAM,IAAI,4BAA4B,KAAK,6BAA6B,8DAA8D;AACrO,WAAO,uBAAuB,SAAS,OAAO;AAAA,EAChD;AAAA,EAEA,MAAM,SAAS,MAAc,QAAgB,MAAe,QAAwC;AAClG,UAAM,aAAa,SAAS,SAAY,SAAY,KAAK,UAAU,IAAI;AACvE,QAAI,cAAc,IAAI,YAAY,EAAE,OAAO,UAAU,EAAE,aAAa,0BAA2B,OAAM,IAAI,4BAA4B,KAAK,qBAAqB,kDAAkD;AACjN,UAAM,WAAW,OAAO,KAAK,SAAS,SAAS,WAAW,OAAO,GAAG,KAAK,SAAS,OAAO,uBAAuB,IAAI,IAAI;AAAA,MACtH;AAAA,MAAQ,SAAS,EAAE,eAAe,UAAU,KAAK,SAAS,MAAM,IAAI,sBAAsB,KAAK,SAAS,QAAQ,QAAQ,oBAAoB,GAAI,aAAa,EAAE,gBAAgB,mBAAmB,IAAI,CAAC,EAAG;AAAA,MAC1M,MAAM;AAAA,MAAY;AAAA,MAAQ,UAAU;AAAA,IACtC,CAAC;AACD,UAAM,SAAS,SAAS,MAAM,UAAU;AACxC,QAAI,CAAC,OAAQ,OAAM,IAAI,4BAA4B,SAAS,QAAQ,kBAAkB,qCAAqC;AAC3H,UAAM,UAAU,IAAI,YAAY,SAAS,EAAE,OAAO,KAAK,CAAC;AACxD,QAAI,QAAQ;AACZ,QAAI,OAAO;AACX,QAAI;AACF,aAAO,MAAM;AACX,cAAM,QAAQ,MAAM,OAAO,KAAK;AAChC,YAAI,MAAM,KAAM;AAChB,iBAAS,MAAM,MAAM;AACrB,YAAI,QAAQ,0BAA2B,OAAM,IAAI,4BAA4B,KAAK,qBAAqB,+CAA+C;AACtJ,gBAAQ,QAAQ,OAAO,MAAM,OAAO,EAAE,QAAQ,KAAK,CAAC;AAAA,MACtD;AACA,cAAQ,QAAQ,OAAO;AAAA,IACzB,UAAE;AAAU,YAAM,OAAO,OAAO;AAAG,aAAO,YAAY;AAAA,IAAG;AACzD,UAAM,UAAmB,KAAK,MAAM,IAAI;AACxC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,OAAO;AACnF,YAAM,IAAI,4BAA4B,SAAS,QAAQ,MAAM,UAAU,MAAM,KAAK,OAAO,0BAA0B,MAAM,UAAU,MAAM,KAAK,UAAU,mCAAmC,SAAS,MAAM,IAAI;AAAA,IAChN;AACA,WAAO;AAAA,EACT;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,314 @@
1
+ import {
2
+ ExperimentExecutionContextSchema,
3
+ ExperimentFieldMappingsSchema,
4
+ ExperimentGraderPinSchema,
5
+ ExperimentGraderSelectionSchema,
6
+ ExperimentListQuerySchema,
7
+ PrepareHarnessExperimentSchema,
8
+ PreparedHarnessExperimentSchema
9
+ } from "./chunk-2ZJRG3KL.js";
10
+ import {
11
+ ModelTasksetRunDetailsSchema,
12
+ ModelTasksetRunRequestSchema,
13
+ verifyHarnessExperimentManifest,
14
+ verifyModelTasksetRunDetails
15
+ } from "./chunk-7B44TQZD.js";
16
+ import {
17
+ ImmutableReleaseRefSchema,
18
+ contentHash
19
+ } from "./chunk-QUOW6URQ.js";
20
+
21
+ // src/experiment-run-contracts.ts
22
+ import { z } from "zod";
23
+ var Id = z.string().trim().min(1).max(200);
24
+ var RunExperimentSchema = z.object({
25
+ operationId: Id,
26
+ request: ModelTasksetRunRequestSchema,
27
+ maximumCostUsd: z.number().finite().positive().max(1e4),
28
+ graders: z.array(ExperimentGraderSelectionSchema).min(1).max(100).optional(),
29
+ sourceExperimentId: Id.optional()
30
+ }).strict().superRefine((value, context) => {
31
+ if (!value.request.name)
32
+ context.addIssue({ code: "custom", path: ["request", "name"], message: "Name this Experiment before starting it." });
33
+ if (value.operationId !== value.request.operationId)
34
+ context.addIssue({ code: "custom", path: ["request", "operationId"], message: "Use one operation identity for this Experiment." });
35
+ if (Math.round(value.maximumCostUsd * 1e6) < 1)
36
+ context.addIssue({ code: "custom", path: ["maximumCostUsd"], message: "The spending cap must be at least $0.000001." });
37
+ if (value.graders && new Set(value.graders.map((grader) => grader.id)).size !== value.graders.length)
38
+ context.addIssue({ code: "custom", path: ["graders"], message: "Select each grader once." });
39
+ });
40
+
41
+ // src/experiment-run-details.ts
42
+ import { z as z2 } from "zod";
43
+ var Hash = z2.string().regex(/^[a-f0-9]{64}$/);
44
+ var ConfigurationContent = z2.object({
45
+ request: ModelTasksetRunRequestSchema,
46
+ maximumCostUsd: z2.number().finite().positive().max(1e4),
47
+ graders: z2.array(ExperimentGraderPinSchema).min(1).max(100),
48
+ admissionRequestHash: Hash.optional(),
49
+ sourceExperimentId: z2.string().trim().min(1).max(200).optional()
50
+ }).strict();
51
+ var ExperimentRunConfigurationSchema = ConfigurationContent.extend({ configurationHash: Hash }).strict();
52
+ var ExperimentRunDetailsSchema = ModelTasksetRunDetailsSchema.extend({ configuration: ExperimentRunConfigurationSchema }).strict();
53
+ function experimentConfigurationRequest(request) {
54
+ return request.policy.kind === "hosted_harness" ? { ...request, population: request.population.map(({ receiptId: _id, ...member }) => member) } : request;
55
+ }
56
+ function experimentRunConfigurationHash(value) {
57
+ const content = ConfigurationContent.parse(value);
58
+ return contentHash({ ...content, request: experimentConfigurationRequest(content.request) });
59
+ }
60
+ async function verifyExperimentRunDetails(value) {
61
+ const parsed = ExperimentRunDetailsSchema.parse(value);
62
+ const { configuration, ...rawDetails } = parsed;
63
+ const details = await verifyModelTasksetRunDetails(rawDetails);
64
+ const { configurationHash, ...content } = configuration;
65
+ if (configurationHash !== experimentRunConfigurationHash(content) || contentHash(experimentConfigurationRequest(configuration.request)) !== contentHash(experimentConfigurationRequest(details.request)) || configuration.maximumCostUsd !== details.manifest.limits.maximumSpendUsd)
66
+ throw new Error("Experiment configuration differs from its retained run.");
67
+ if (details.manifest.metadata.experimentDefinition === null) {
68
+ const context = ExperimentExecutionContextSchema.parse({
69
+ definition: null,
70
+ configurationHash: configuration.configurationHash,
71
+ maximumCostUsd: configuration.maximumCostUsd,
72
+ graders: configuration.graders,
73
+ ...configuration.admissionRequestHash ? { admissionRequestHash: configuration.admissionRequestHash } : {},
74
+ ...configuration.sourceExperimentId ? { sourceExperimentId: configuration.sourceExperimentId } : {}
75
+ });
76
+ if (details.manifest.metadata.experimentConfigurationHash !== contentHash(context))
77
+ throw new Error("Experiment configuration differs from its admitted manifest.");
78
+ }
79
+ return { ...details, configuration };
80
+ }
81
+
82
+ // src/experiment-scoring-contracts.ts
83
+ import { z as z3 } from "zod";
84
+ import { RewardReleaseRefSchema } from "@openpond/evals/rewards";
85
+ var Id2 = z3.string().trim().min(1).max(200);
86
+ var ExperimentScoringRequestSchema = z3.object({
87
+ operationId: Id2,
88
+ execution: ImmutableReleaseRefSchema,
89
+ graders: z3.array(RewardReleaseRefSchema).min(1).max(100),
90
+ maximumCostUsd: z3.number().finite().min(1e-6).max(1e4),
91
+ mappings: z3.array(z3.object({ graderId: Id2, fields: ExperimentFieldMappingsSchema }).strict()).max(100).optional()
92
+ }).strict().superRefine((value, context) => {
93
+ if (new Set(value.graders.map((grader) => grader.id)).size !== value.graders.length)
94
+ context.addIssue({ code: "custom", path: ["graders"], message: "Select each grader once." });
95
+ if (value.mappings && (new Set(value.mappings.map((mapping) => mapping.graderId)).size !== value.mappings.length || value.mappings.some((mapping) => !value.graders.some((grader) => grader.id === mapping.graderId))))
96
+ context.addIssue({ code: "custom", path: ["mappings"], message: "Map each selected grader at most once." });
97
+ });
98
+ var ScoringPassContent = z3.object({
99
+ schemaVersion: z3.literal("openpond.experimentScoringPass.v1"),
100
+ id: Id2,
101
+ teamId: Id2,
102
+ revision: z3.number().int().positive(),
103
+ request: ExperimentScoringRequestSchema,
104
+ graders: z3.array(ExperimentGraderPinSchema).min(1).max(100),
105
+ status: z3.enum(["queued", "running", "cancelling", "completed", "failed", "cancelled"]),
106
+ totalCount: z3.number().int().min(1).max(1e4),
107
+ counts: z3.object({
108
+ pending: z3.number().int().nonnegative(),
109
+ running: z3.number().int().nonnegative(),
110
+ scored: z3.number().int().nonnegative(),
111
+ unavailable: z3.number().int().nonnegative(),
112
+ failed: z3.number().int().nonnegative(),
113
+ cancelled: z3.number().int().nonnegative()
114
+ }).strict(),
115
+ resultAvailable: z3.boolean(),
116
+ createdAt: z3.iso.datetime(),
117
+ startedAt: z3.iso.datetime().nullable(),
118
+ completedAt: z3.iso.datetime().nullable(),
119
+ error: z3.object({ code: Id2, message: z3.string().max(2e3) }).strict().nullable()
120
+ }).strict();
121
+ var ExperimentScoringPassSchema = ScoringPassContent.extend({ contentHash: z3.string().regex(/^[a-f0-9]{64}$/) });
122
+ function verifyExperimentScoringPass(value) {
123
+ const pass = ExperimentScoringPassSchema.parse(value);
124
+ const { contentHash: actual, ...content } = pass;
125
+ if (contentHash(content) !== actual || Object.values(pass.counts).reduce((sum, count) => sum + count, 0) !== pass.totalCount)
126
+ throw new Error("Scoring pass integrity or population accounting failed.");
127
+ const terminal = ["completed", "failed", "cancelled"].includes(pass.status);
128
+ if (terminal && (!pass.completedAt || pass.counts.pending || pass.counts.running) || !terminal && (pass.completedAt !== null || pass.resultAvailable) || pass.status === "completed" && !pass.resultAvailable)
129
+ throw new Error("Scoring pass lifecycle differs from its retained result.");
130
+ if (pass.graders.length !== pass.request.graders.length || new Set(pass.graders.map((grader) => grader.feedbackKey)).size !== pass.graders.length || pass.graders.some((grader, index) => contentHash(grader.release) !== contentHash(pass.request.graders[index]) || contentHash(grader.mappings ?? []) !== contentHash(pass.request.mappings?.find((mapping) => mapping.graderId === grader.release?.id)?.fields ?? [])))
131
+ throw new Error("Scoring pass graders differ from their exact admission.");
132
+ return pass;
133
+ }
134
+
135
+ // src/experiment-harness-catalog.ts
136
+ import { z as z4 } from "zod";
137
+ import { StandaloneHarnessExperimentSourceSchema } from "@openpond/evals/experiments";
138
+ var ExperimentHarnessCatalogSchema = z4.object({
139
+ teamId: z4.string().trim().min(1).max(240),
140
+ items: z4.array(
141
+ z4.object({
142
+ name: z4.string().trim().min(1).max(500),
143
+ source: StandaloneHarnessExperimentSourceSchema,
144
+ ready: z4.boolean(),
145
+ reason: z4.string().min(1).max(2e3).nullable()
146
+ }).strict()
147
+ ).max(8),
148
+ nextCursor: z4.string().min(1).max(8192).nullable()
149
+ }).strict();
150
+
151
+ // src/experiment-client.ts
152
+ import { z as z5 } from "zod";
153
+ import { compareExperiments, verifyExperimentEvidence } from "@openpond/evals/experiments";
154
+ var Id3 = z5.string().trim().min(1).max(200);
155
+ var OpenPondExperimentError = class extends Error {
156
+ constructor(status, code, message) {
157
+ super(message);
158
+ this.status = status;
159
+ this.code = code;
160
+ this.name = "OpenPondExperimentError";
161
+ }
162
+ status;
163
+ code;
164
+ };
165
+ var OpenPondExperimentsClient = class {
166
+ constructor(options) {
167
+ this.options = options;
168
+ const url = new URL(options.baseUrl);
169
+ if (!["http:", "https:"].includes(url.protocol) || url.username || url.password || url.search || url.hash || !options.apiKey.trim() || !options.teamId.trim())
170
+ throw new Error("A clean API origin and workspace credentials are required.");
171
+ this.baseUrl = url.toString().replace(/\/+$/, "");
172
+ }
173
+ options;
174
+ baseUrl;
175
+ /** Discover released workspace Harnesses independently of Project targets. */
176
+ async harnessSources(options = {}) {
177
+ const cursor = options.cursor === void 0 ? void 0 : z5.string().min(1).max(8192).parse(options.cursor);
178
+ const query = new URLSearchParams(cursor ? { cursor } : {});
179
+ const page = ExperimentHarnessCatalogSchema.parse(await this.request(`/harness-sources?${query}`, "GET", void 0, options.signal));
180
+ if (page.teamId !== this.options.teamId || new Set(page.items.map((item) => contentHash(item.source))).size !== page.items.length || page.nextCursor !== null && page.nextCursor === cursor || page.items.some((item) => item.ready !== (item.reason === null)))
181
+ throw new Error("Harness catalog differs from its workspace, readiness or continuation.");
182
+ return page;
183
+ }
184
+ /** Resolves a released target without saving a definition or dispatching it. */
185
+ async prepareHarness(value, signal) {
186
+ const request = PrepareHarnessExperimentSchema.parse(value);
187
+ const result = PreparedHarnessExperimentSchema.parse(await this.request("/harness-setup", "POST", request, signal));
188
+ verifyHarnessExperimentManifest(result.request, result.manifest);
189
+ const policy = result.request.policy;
190
+ if (result.request.teamId !== this.options.teamId || result.request.operationId !== request.operationId || policy.kind !== "hosted_harness" || policy.profileRepositoryId !== request.profileRepositoryId || policy.source.definitionId !== request.definitionId || policy.modelId !== request.modelId || policy.reasoningEffort !== request.reasoningEffort || result.maximumCostUsd !== request.maximumCostUsd || result.manifest.limits.maximumSpendUsd !== request.maximumCostUsd)
191
+ throw new Error("Harness preparation differs from its requested scope or configuration.");
192
+ return result;
193
+ }
194
+ async run(value, signal) {
195
+ const request = RunExperimentSchema.parse(value);
196
+ if (request.request.teamId !== this.options.teamId) throw new Error("Experiment workspace mismatch.");
197
+ const result = await this.details(await this.request("", "POST", request, signal));
198
+ if (contentHash(experimentConfigurationRequest(result.request)) !== contentHash(experimentConfigurationRequest(request.request)) || result.configuration.maximumCostUsd !== request.maximumCostUsd || result.configuration.sourceExperimentId !== request.sourceExperimentId || result.configuration.admissionRequestHash !== contentHash(request))
199
+ throw new Error("Experiment admission differs from its submitted configuration.");
200
+ if (request.graders && contentHash(request.graders) !== contentHash(result.configuration.graders.map((grader) => ({
201
+ id: grader.id,
202
+ version: grader.version,
203
+ contentHash: grader.contentHash,
204
+ mappings: grader.mappings ?? []
205
+ })))) throw new Error("Experiment admission differs from its selected graders or mappings.");
206
+ return result;
207
+ }
208
+ async get(id, options = {}) {
209
+ return this.details(await this.request(`/${encodeURIComponent(Id3.parse(id))}`, "GET", void 0, options.signal), id);
210
+ }
211
+ async list(value = {}, signal) {
212
+ const query = ExperimentListQuerySchema.parse(value);
213
+ const params = new URLSearchParams(Object.entries(query).filter(([, value2]) => value2 !== void 0).map(([key, value2]) => [key, String(value2)]));
214
+ const page = z5.object({ items: z5.array(z5.unknown()).max(100), nextCursor: Id3.nullable() }).strict().parse(await this.request(`?${params}`, "GET", void 0, signal));
215
+ const items = await Promise.all(page.items.map((value2) => this.details(value2)));
216
+ if (items.length > query.limit || new Set(items.map((item) => item.summary.id)).size !== items.length || page.nextCursor !== null && page.nextCursor !== items.at(-1)?.summary.id || items.some((item) => query.projectId && item.request.project?.id !== query.projectId || query.datasetHash && item.request.taskset.contentHash !== query.datasetHash || query.status && item.summary.status !== query.status))
217
+ throw new Error("Experiment page differs from its selected scope.");
218
+ return { items, nextCursor: page.nextCursor };
219
+ }
220
+ async result(executionId, signal) {
221
+ const value = z5.object({ executionId: Id3, passId: Id3.nullable(), manifest: z5.unknown(), result: z5.unknown() }).strict().parse(await this.request(`/${encodeURIComponent(Id3.parse(executionId))}/result`, "GET", void 0, signal));
222
+ const evidence = verifyExperimentEvidence(value);
223
+ if (value.executionId !== executionId || evidence.manifest.teamId !== this.options.teamId || evidence.manifest.lineage?.execution.id !== executionId || evidence.manifest.lineage.scoringPassId !== value.passId) throw new Error("Experiment result identity mismatch.");
224
+ return { ...evidence, executionId, passId: value.passId };
225
+ }
226
+ async cancel(id, signal) {
227
+ return this.details(await this.request(`/${encodeURIComponent(Id3.parse(id))}/cancel`, "POST", {}, signal), id);
228
+ }
229
+ /** Duplicate uses the original run snapshot; edits are submitted with run(). */
230
+ async duplicate(id, operationId, signal) {
231
+ const result = await this.details(await this.request(`/${encodeURIComponent(Id3.parse(id))}/duplicate`, "POST", { operationId: Id3.parse(operationId) }, signal));
232
+ if (result.request.operationId !== operationId || result.configuration.sourceExperimentId !== id || result.summary.id === id)
233
+ throw new Error("Duplicate Experiment admission differs from its source or operation.");
234
+ return result;
235
+ }
236
+ async score(value, signal) {
237
+ const request = ExperimentScoringRequestSchema.parse(value);
238
+ const pass = this.pass(await this.request(`/${encodeURIComponent(request.execution.id)}/scoring-passes`, "POST", request, signal));
239
+ if (contentHash(pass.request) !== contentHash(request)) throw new Error("Scoring admission differs from its submitted inputs.");
240
+ return pass;
241
+ }
242
+ async scoringPass(id, signal) {
243
+ return this.pass(await this.request(`/scoring-passes/${encodeURIComponent(Id3.parse(id))}`, "GET", void 0, signal), id);
244
+ }
245
+ async scoringPasses(executionId, options = {}) {
246
+ const params = new URLSearchParams(options.afterId ? { afterId: Id3.parse(options.afterId) } : {});
247
+ const page = z5.object({ items: z5.array(z5.unknown()).max(30), nextCursor: Id3.nullable() }).strict().parse(
248
+ await this.request(`/${encodeURIComponent(Id3.parse(executionId))}/scoring-passes?${params}`, "GET", void 0, options.signal)
249
+ );
250
+ const items = page.items.map((value) => this.pass(value));
251
+ if (items.some((item) => item.request.execution.id !== executionId) || new Set(items.map((item) => item.id)).size !== items.length)
252
+ throw new Error("Scoring pass page differs from its execution ownership.");
253
+ return { items, nextCursor: page.nextCursor };
254
+ }
255
+ async cancelScoringPass(id, signal) {
256
+ return this.pass(await this.request(`/scoring-passes/${encodeURIComponent(Id3.parse(id))}/cancel`, "POST", {}, signal), id);
257
+ }
258
+ async scoringResult(id, signal) {
259
+ const value = z5.object({ executionId: Id3, passId: Id3, manifest: z5.unknown(), result: z5.unknown() }).strict().parse(
260
+ await this.request(`/scoring-passes/${encodeURIComponent(Id3.parse(id))}/result`, "GET", void 0, signal)
261
+ );
262
+ const evidence = verifyExperimentEvidence(value);
263
+ if (value.passId !== id || evidence.manifest.teamId !== this.options.teamId || evidence.manifest.id !== id || evidence.manifest.lineage?.execution.id !== value.executionId || evidence.manifest.lineage.scoringPassId !== id)
264
+ throw new Error("Scoring result identity mismatch.");
265
+ return { ...evidence, executionId: value.executionId, passId: id };
266
+ }
267
+ async compare(baselineId, candidateId, signal) {
268
+ const read = (id) => id.startsWith("score_") ? this.scoringResult(id, signal) : this.result(id, signal);
269
+ const [baseline, candidate] = await Promise.all([read(baselineId), read(candidateId)]);
270
+ return { baseline, candidate, comparison: compareExperiments(baseline, candidate) };
271
+ }
272
+ async details(value, id) {
273
+ const result = await verifyExperimentRunDetails(value);
274
+ if (result.summary.teamId !== this.options.teamId || id && result.summary.id !== id)
275
+ throw new Error("Experiment identity mismatch.");
276
+ return result;
277
+ }
278
+ pass(value, id) {
279
+ const pass = verifyExperimentScoringPass(value);
280
+ if (pass.teamId !== this.options.teamId || id && pass.id !== id) throw new Error("Scoring pass identity mismatch.");
281
+ return pass;
282
+ }
283
+ async request(path, method, body, signal) {
284
+ const response = await (this.options.fetch ?? fetch)(`${this.baseUrl}/v1/experiments${path}`, {
285
+ method,
286
+ signal,
287
+ redirect: "error",
288
+ headers: { Authorization: `Bearer ${this.options.apiKey}`, "X-OpenPond-Team-Id": this.options.teamId, "Content-Type": "application/json", Accept: "application/json" },
289
+ ...body === void 0 ? {} : { body: JSON.stringify(body) }
290
+ });
291
+ const value = await response.json();
292
+ if (!response.ok) {
293
+ const parsed = z5.object({ code: z5.string(), message: z5.string() }).safeParse(value);
294
+ throw new OpenPondExperimentError(response.status, parsed.success ? parsed.data.code : "experiment_request_failed", parsed.success ? parsed.data.message : "Experiment request failed.");
295
+ }
296
+ return value;
297
+ }
298
+ };
299
+
300
+ export {
301
+ RunExperimentSchema,
302
+ ExperimentRunConfigurationSchema,
303
+ ExperimentRunDetailsSchema,
304
+ experimentConfigurationRequest,
305
+ experimentRunConfigurationHash,
306
+ verifyExperimentRunDetails,
307
+ ExperimentScoringRequestSchema,
308
+ ExperimentScoringPassSchema,
309
+ verifyExperimentScoringPass,
310
+ ExperimentHarnessCatalogSchema,
311
+ OpenPondExperimentError,
312
+ OpenPondExperimentsClient
313
+ };
314
+ //# sourceMappingURL=chunk-PRRUBH2B.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/experiment-run-contracts.ts", "../src/experiment-run-details.ts", "../src/experiment-scoring-contracts.ts", "../src/experiment-harness-catalog.ts", "../src/experiment-client.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\nimport { ModelTasksetRunRequestSchema } from \"./model-taskset-runs-contracts.js\";\nimport { ExperimentGraderSelectionSchema } from \"./experiment-contracts.js\";\n\nconst Id = z.string().trim().min(1).max(200);\n\n/** One reviewed configuration admits one Experiment. A transport retry reuses\n * its operation identity; Duplicate and edit submits a new operation. */\nexport const RunExperimentSchema = z.object({\n operationId: Id,\n request: ModelTasksetRunRequestSchema,\n maximumCostUsd: z.number().finite().positive().max(10_000),\n graders: z.array(ExperimentGraderSelectionSchema).min(1).max(100).optional(),\n sourceExperimentId: Id.optional(),\n}).strict().superRefine((value, context) => {\n if (!value.request.name)\n context.addIssue({ code: \"custom\", path: [\"request\", \"name\"], message: \"Name this Experiment before starting it.\" });\n if (value.operationId !== value.request.operationId)\n context.addIssue({ code: \"custom\", path: [\"request\", \"operationId\"], message: \"Use one operation identity for this Experiment.\" });\n if (Math.round(value.maximumCostUsd * 1_000_000) < 1)\n context.addIssue({ code: \"custom\", path: [\"maximumCostUsd\"], message: \"The spending cap must be at least $0.000001.\" });\n if (value.graders && new Set(value.graders.map(grader => grader.id)).size !== value.graders.length)\n context.addIssue({ code: \"custom\", path: [\"graders\"], message: \"Select each grader once.\" });\n});\nexport type RunExperiment = z.infer<typeof RunExperimentSchema>;\n", "import { z } from \"zod\";\nimport { contentHash } from \"@openpond/harness\";\nimport { ExperimentExecutionContextSchema, ExperimentGraderPinSchema } from \"./experiment-contracts.js\";\nimport { ModelTasksetRunDetailsSchema, ModelTasksetRunRequestSchema, verifyModelTasksetRunDetails, type ModelTasksetRunRequest } from \"./model-taskset-runs-contracts.js\";\n\nconst Hash = z.string().regex(/^[a-f0-9]{64}$/);\nconst ConfigurationContent = z.object({\n request: ModelTasksetRunRequestSchema,\n maximumCostUsd: z.number().finite().positive().max(10_000),\n graders: z.array(ExperimentGraderPinSchema).min(1).max(100),\n admissionRequestHash: Hash.optional(),\n sourceExperimentId: z.string().trim().min(1).max(200).optional(),\n}).strict();\nexport const ExperimentRunConfigurationSchema = ConfigurationContent.extend({configurationHash:Hash}).strict();\nexport type ExperimentRunConfiguration = z.infer<typeof ExperimentRunConfigurationSchema>;\nexport const ExperimentRunDetailsSchema = ModelTasksetRunDetailsSchema.extend({configuration:ExperimentRunConfigurationSchema}).strict();\nexport type ExperimentRunDetails = z.infer<typeof ExperimentRunDetailsSchema>;\n\n/** Native preparation assigns new receipt IDs while retaining the selected\n * task/seed population. Other runtimes seal their submitted IDs exactly. */\nexport function experimentConfigurationRequest(request: ModelTasksetRunRequest) {\n return request.policy.kind === \"hosted_harness\"\n ? {...request,population:request.population.map(({receiptId:_id,...member})=>member)}\n : request;\n}\nexport function experimentRunConfigurationHash(value: z.input<typeof ConfigurationContent>): string {\n const content = ConfigurationContent.parse(value);\n return contentHash({...content,request:experimentConfigurationRequest(content.request)});\n}\nexport async function verifyExperimentRunDetails(value: unknown): Promise<ExperimentRunDetails> {\n const parsed = ExperimentRunDetailsSchema.parse(value);\n const {configuration,...rawDetails} = parsed;\n const details = await verifyModelTasksetRunDetails(rawDetails);\n const {configurationHash,...content} = configuration;\n if (configurationHash !== experimentRunConfigurationHash(content)\n || contentHash(experimentConfigurationRequest(configuration.request)) !== contentHash(experimentConfigurationRequest(details.request))\n || configuration.maximumCostUsd !== details.manifest.limits.maximumSpendUsd)\n throw new Error(\"Experiment configuration differs from its retained run.\");\n if (details.manifest.metadata.experimentDefinition === null) {\n const context = ExperimentExecutionContextSchema.parse({\n definition:null, configurationHash:configuration.configurationHash,\n maximumCostUsd:configuration.maximumCostUsd,graders:configuration.graders,\n ...(configuration.admissionRequestHash ? {admissionRequestHash:configuration.admissionRequestHash} : {}),\n ...(configuration.sourceExperimentId ? {sourceExperimentId:configuration.sourceExperimentId} : {}),\n });\n if (details.manifest.metadata.experimentConfigurationHash !== contentHash(context))\n throw new Error(\"Experiment configuration differs from its admitted manifest.\");\n }\n return {...details,configuration};\n}\n", "import { z } from \"zod\";\nimport { contentHash, ImmutableReleaseRefSchema } from \"@openpond/harness\";\nimport { RewardReleaseRefSchema } from \"@openpond/evals/rewards\";\nimport { ExperimentGraderPinSchema } from \"./experiment-contracts.js\";\nimport { ExperimentFieldMappingsSchema } from \"./experiment-field-mappings.js\";\n\nconst Id = z.string().trim().min(1).max(200);\nexport const ExperimentScoringRequestSchema = z.object({\n operationId: Id,\n execution: ImmutableReleaseRefSchema,\n graders: z.array(RewardReleaseRefSchema).min(1).max(100),\n maximumCostUsd: z.number().finite().min(0.000001).max(10_000),\n mappings: z.array(z.object({ graderId: Id, fields: ExperimentFieldMappingsSchema }).strict()).max(100).optional(),\n}).strict().superRefine((value, context) => {\n if (new Set(value.graders.map(grader => grader.id)).size !== value.graders.length)\n context.addIssue({ code: \"custom\", path: [\"graders\"], message: \"Select each grader once.\" });\n if (value.mappings && (new Set(value.mappings.map(mapping => mapping.graderId)).size !== value.mappings.length\n || value.mappings.some(mapping => !value.graders.some(grader => grader.id === mapping.graderId))))\n context.addIssue({ code: \"custom\", path: [\"mappings\"], message: \"Map each selected grader at most once.\" });\n});\nexport type ExperimentScoringRequest = z.infer<typeof ExperimentScoringRequestSchema>;\n\nconst ScoringPassContent = z.object({\n schemaVersion: z.literal(\"openpond.experimentScoringPass.v1\"),\n id: Id, teamId: Id, revision: z.number().int().positive(),\n request: ExperimentScoringRequestSchema,\n graders: z.array(ExperimentGraderPinSchema).min(1).max(100),\n status: z.enum([\"queued\", \"running\", \"cancelling\", \"completed\", \"failed\", \"cancelled\"]),\n totalCount: z.number().int().min(1).max(10_000),\n counts: z.object({ pending: z.number().int().nonnegative(), running: z.number().int().nonnegative(),\n scored: z.number().int().nonnegative(), unavailable: z.number().int().nonnegative(),\n failed: z.number().int().nonnegative(), cancelled: z.number().int().nonnegative() }).strict(),\n resultAvailable: z.boolean(), createdAt: z.iso.datetime(), startedAt: z.iso.datetime().nullable(),\n completedAt: z.iso.datetime().nullable(),\n error: z.object({ code: Id, message: z.string().max(2_000) }).strict().nullable(),\n}).strict();\nexport const ExperimentScoringPassSchema = ScoringPassContent.extend({ contentHash: z.string().regex(/^[a-f0-9]{64}$/) });\nexport type ExperimentScoringPass = z.infer<typeof ExperimentScoringPassSchema>;\n\n/** A pass grades owned output and carries no model-execution authority. */\nexport function verifyExperimentScoringPass(value: unknown) {\n const pass = ExperimentScoringPassSchema.parse(value);\n const { contentHash: actual, ...content } = pass;\n if (contentHash(content) !== actual || Object.values(pass.counts).reduce((sum, count) => sum + count, 0) !== pass.totalCount)\n throw new Error(\"Scoring pass integrity or population accounting failed.\");\n const terminal = [\"completed\", \"failed\", \"cancelled\"].includes(pass.status);\n if (terminal && (!pass.completedAt || pass.counts.pending || pass.counts.running)\n || !terminal && (pass.completedAt !== null || pass.resultAvailable)\n || pass.status === \"completed\" && !pass.resultAvailable)\n throw new Error(\"Scoring pass lifecycle differs from its retained result.\");\n if (pass.graders.length !== pass.request.graders.length || new Set(pass.graders.map(grader => grader.feedbackKey)).size !== pass.graders.length\n || pass.graders.some((grader, index) => contentHash(grader.release) !== contentHash(pass.request.graders[index]!)\n || contentHash(grader.mappings ?? []) !== contentHash(pass.request.mappings?.find(mapping => mapping.graderId === grader.release?.id)?.fields ?? [])))\n throw new Error(\"Scoring pass graders differ from their exact admission.\");\n return pass;\n}\n", "import { z } from \"zod\";\nimport { StandaloneHarnessExperimentSourceSchema } from \"@openpond/evals/experiments\";\n\n/** Catalog projections carry immutable pins and readiness, never source bytes. */\nexport const ExperimentHarnessCatalogSchema = z\n .object({\n teamId: z.string().trim().min(1).max(240),\n items: z\n .array(\n z\n .object({\n name: z.string().trim().min(1).max(500),\n source: StandaloneHarnessExperimentSourceSchema,\n ready: z.boolean(),\n reason: z.string().min(1).max(2000).nullable(),\n })\n .strict(),\n )\n .max(8),\n nextCursor: z.string().min(1).max(8192).nullable(),\n })\n .strict();\nexport type ExperimentHarnessCatalog = z.infer<typeof ExperimentHarnessCatalogSchema>;\n", "import { z } from \"zod\";\nimport { contentHash } from \"@openpond/harness\";\nimport { compareExperiments, verifyExperimentEvidence } from \"@openpond/evals/experiments\";\nimport { ExperimentListQuerySchema } from \"./experiment-contracts.js\";\nimport { RunExperimentSchema } from \"./experiment-run-contracts.js\";\nimport { experimentConfigurationRequest, verifyExperimentRunDetails } from \"./experiment-run-details.js\";\nimport { PrepareHarnessExperimentSchema, PreparedHarnessExperimentSchema } from \"./experiment-contracts.js\";\nimport { verifyHarnessExperimentManifest } from \"./model-taskset-runs-contracts.js\";\nimport { ExperimentScoringRequestSchema, verifyExperimentScoringPass, type ExperimentScoringRequest } from \"./experiment-scoring-contracts.js\";\nimport { ExperimentHarnessCatalogSchema } from \"./experiment-harness-catalog.js\";\n\nconst Id = z.string().trim().min(1).max(200);\nexport class OpenPondExperimentError extends Error {\n constructor(readonly status: number, readonly code: string, message: string) { super(message); this.name = \"OpenPondExperimentError\"; }\n}\n\n/** One Experiment is one run with its immutable configuration and results. */\nexport class OpenPondExperimentsClient {\n private readonly baseUrl: string;\n constructor(private readonly options: { baseUrl: string; apiKey: string; teamId: string; fetch?: typeof fetch }) {\n const url = new URL(options.baseUrl);\n if (![\"http:\", \"https:\"].includes(url.protocol) || url.username || url.password || url.search || url.hash || !options.apiKey.trim() || !options.teamId.trim())\n throw new Error(\"A clean API origin and workspace credentials are required.\");\n this.baseUrl = url.toString().replace(/\\/+$/, \"\");\n }\n /** Discover released workspace Harnesses independently of Project targets. */\n async harnessSources(options: {cursor?: string; signal?: AbortSignal} = {}) {\n const cursor = options.cursor === undefined ? undefined : z.string().min(1).max(8192).parse(options.cursor);\n const query = new URLSearchParams(cursor ? {cursor} : {});\n const page = ExperimentHarnessCatalogSchema.parse(await this.request(`/harness-sources?${query}`,\"GET\",undefined,options.signal));\n if (page.teamId !== this.options.teamId\n || new Set(page.items.map(item=>contentHash(item.source))).size !== page.items.length\n || page.nextCursor !== null && page.nextCursor === cursor\n || page.items.some(item=>item.ready !== (item.reason === null)))\n throw new Error(\"Harness catalog differs from its workspace, readiness or continuation.\");\n return page;\n }\n /** Resolves a released target without saving a definition or dispatching it. */\n async prepareHarness(value: z.input<typeof PrepareHarnessExperimentSchema>, signal?: AbortSignal) {\n const request = PrepareHarnessExperimentSchema.parse(value);\n const result = PreparedHarnessExperimentSchema.parse(await this.request(\"/harness-setup\", \"POST\", request, signal));\n verifyHarnessExperimentManifest(result.request, result.manifest);\n const policy = result.request.policy;\n if (result.request.teamId !== this.options.teamId || result.request.operationId !== request.operationId\n || policy.kind !== \"hosted_harness\" || policy.profileRepositoryId !== request.profileRepositoryId\n || policy.source.definitionId !== request.definitionId || policy.modelId !== request.modelId\n || policy.reasoningEffort !== request.reasoningEffort || result.maximumCostUsd !== request.maximumCostUsd\n || result.manifest.limits.maximumSpendUsd !== request.maximumCostUsd)\n throw new Error(\"Harness preparation differs from its requested scope or configuration.\");\n return result;\n }\n async run(value: z.input<typeof RunExperimentSchema>, signal?: AbortSignal) {\n const request = RunExperimentSchema.parse(value);\n if (request.request.teamId !== this.options.teamId) throw new Error(\"Experiment workspace mismatch.\");\n const result = await this.details(await this.request(\"\", \"POST\", request, signal));\n if (contentHash(experimentConfigurationRequest(result.request)) !== contentHash(experimentConfigurationRequest(request.request))\n || result.configuration.maximumCostUsd !== request.maximumCostUsd\n || result.configuration.sourceExperimentId !== request.sourceExperimentId\n || result.configuration.admissionRequestHash !== contentHash(request))\n throw new Error(\"Experiment admission differs from its submitted configuration.\");\n if (request.graders && contentHash(request.graders) !== contentHash(result.configuration.graders.map(grader => ({\n id:grader.id,version:grader.version,contentHash:grader.contentHash,mappings:grader.mappings ?? [],\n })))) throw new Error(\"Experiment admission differs from its selected graders or mappings.\");\n return result;\n }\n async get(id: string, options: {signal?: AbortSignal} = {}) {\n return this.details(await this.request(`/${encodeURIComponent(Id.parse(id))}`, \"GET\", undefined, options.signal), id);\n }\n async list(value: z.input<typeof ExperimentListQuerySchema> = {}, signal?: AbortSignal) {\n const query = ExperimentListQuerySchema.parse(value);\n const params = new URLSearchParams(Object.entries(query).filter(([,value])=>value!==undefined).map(([key,value])=>[key,String(value)]));\n const page = z.object({items:z.array(z.unknown()).max(100),nextCursor:Id.nullable()}).strict().parse(await this.request(`?${params}`,\"GET\",undefined,signal));\n const items = await Promise.all(page.items.map(value=>this.details(value)));\n if (items.length > query.limit || new Set(items.map(item=>item.summary.id)).size !== items.length\n || page.nextCursor !== null && page.nextCursor !== items.at(-1)?.summary.id\n || items.some(item => query.projectId && item.request.project?.id !== query.projectId\n || query.datasetHash && item.request.taskset.contentHash !== query.datasetHash\n || query.status && item.summary.status !== query.status))\n throw new Error(\"Experiment page differs from its selected scope.\");\n return {items,nextCursor:page.nextCursor};\n }\n async result(executionId: string, signal?: AbortSignal) {\n const value = z.object({ executionId: Id, passId: Id.nullable(), manifest: z.unknown(), result: z.unknown() }).strict()\n .parse(await this.request(`/${encodeURIComponent(Id.parse(executionId))}/result`, \"GET\", undefined, signal));\n const evidence = verifyExperimentEvidence(value);\n if (value.executionId !== executionId || evidence.manifest.teamId !== this.options.teamId\n || evidence.manifest.lineage?.execution.id !== executionId\n || evidence.manifest.lineage.scoringPassId !== value.passId) throw new Error(\"Experiment result identity mismatch.\");\n return { ...evidence, executionId, passId: value.passId };\n }\n async cancel(id: string, signal?: AbortSignal) {\n return this.details(await this.request(`/${encodeURIComponent(Id.parse(id))}/cancel`, \"POST\", {}, signal), id);\n }\n /** Duplicate uses the original run snapshot; edits are submitted with run(). */\n async duplicate(id: string, operationId: string, signal?: AbortSignal) {\n const result = await this.details(await this.request(`/${encodeURIComponent(Id.parse(id))}/duplicate`, \"POST\", {operationId:Id.parse(operationId)}, signal));\n if (result.request.operationId !== operationId || result.configuration.sourceExperimentId !== id || result.summary.id === id)\n throw new Error(\"Duplicate Experiment admission differs from its source or operation.\");\n return result;\n }\n async score(value: ExperimentScoringRequest, signal?: AbortSignal) {\n const request = ExperimentScoringRequestSchema.parse(value);\n const pass = this.pass(await this.request(`/${encodeURIComponent(request.execution.id)}/scoring-passes`, \"POST\", request, signal));\n if (contentHash(pass.request) !== contentHash(request)) throw new Error(\"Scoring admission differs from its submitted inputs.\");\n return pass;\n }\n async scoringPass(id: string, signal?: AbortSignal) {\n return this.pass(await this.request(`/scoring-passes/${encodeURIComponent(Id.parse(id))}`, \"GET\", undefined, signal), id);\n }\n async scoringPasses(executionId: string, options: { afterId?: string; signal?: AbortSignal } = {}) {\n const params = new URLSearchParams(options.afterId ? { afterId: Id.parse(options.afterId) } : {});\n const page = z.object({ items: z.array(z.unknown()).max(30), nextCursor: Id.nullable() }).strict().parse(\n await this.request(`/${encodeURIComponent(Id.parse(executionId))}/scoring-passes?${params}`, \"GET\", undefined, options.signal));\n const items = page.items.map(value => this.pass(value));\n if (items.some(item => item.request.execution.id !== executionId) || new Set(items.map(item => item.id)).size !== items.length)\n throw new Error(\"Scoring pass page differs from its execution ownership.\");\n return { items, nextCursor: page.nextCursor };\n }\n async cancelScoringPass(id: string, signal?: AbortSignal) {\n return this.pass(await this.request(`/scoring-passes/${encodeURIComponent(Id.parse(id))}/cancel`, \"POST\", {}, signal), id);\n }\n async scoringResult(id: string, signal?: AbortSignal) {\n const value = z.object({ executionId: Id, passId: Id, manifest: z.unknown(), result: z.unknown() }).strict().parse(\n await this.request(`/scoring-passes/${encodeURIComponent(Id.parse(id))}/result`, \"GET\", undefined, signal));\n const evidence = verifyExperimentEvidence(value);\n if (value.passId !== id || evidence.manifest.teamId !== this.options.teamId || evidence.manifest.id !== id\n || evidence.manifest.lineage?.execution.id !== value.executionId || evidence.manifest.lineage.scoringPassId !== id)\n throw new Error(\"Scoring result identity mismatch.\");\n return { ...evidence, executionId: value.executionId, passId: id };\n }\n async compare(baselineId: string, candidateId: string, signal?: AbortSignal) {\n const read = (id: string) => id.startsWith(\"score_\") ? this.scoringResult(id, signal) : this.result(id, signal);\n const [baseline, candidate] = await Promise.all([read(baselineId), read(candidateId)]);\n return { baseline, candidate, comparison: compareExperiments(baseline, candidate) };\n }\n private async details(value: unknown, id?: string) {\n const result = await verifyExperimentRunDetails(value);\n if (result.summary.teamId !== this.options.teamId || id && result.summary.id !== id)\n throw new Error(\"Experiment identity mismatch.\");\n return result;\n }\n private pass(value: unknown, id?: string) {\n const pass = verifyExperimentScoringPass(value);\n if (pass.teamId !== this.options.teamId || id && pass.id !== id) throw new Error(\"Scoring pass identity mismatch.\");\n return pass;\n }\n private async request(path: string, method: string, body?: unknown, signal?: AbortSignal): Promise<unknown> {\n const response = await (this.options.fetch ?? fetch)(`${this.baseUrl}/v1/experiments${path}`, {\n method, signal, redirect: \"error\", headers: { Authorization: `Bearer ${this.options.apiKey}`, \"X-OpenPond-Team-Id\": this.options.teamId, \"Content-Type\": \"application/json\", Accept: \"application/json\" },\n ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n });\n const value = await response.json();\n if (!response.ok) {\n const parsed = z.object({ code: z.string(), message: z.string() }).safeParse(value);\n throw new OpenPondExperimentError(response.status, parsed.success ? parsed.data.code : \"experiment_request_failed\", parsed.success ? parsed.data.message : \"Experiment request failed.\");\n }\n return value;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["z", "z", "z", "Id", "z", "z", "z", "Id", "z", "value"]
7
+ }
@@ -62,10 +62,11 @@ var ExperimentAttemptGradeSchema = z2.object({
62
62
  });
63
63
 
64
64
  // src/model-starter-attempts.ts
65
+ import { StandaloneHarnessExperimentSourceSchema, NativeHarnessExperimentEvidenceSchema } from "@openpond/evals/experiments";
65
66
  var IdSchema = z3.string().trim().min(1).max(200);
66
67
  var HashSchema = z3.string().regex(/^[a-f0-9]{64}$/);
67
68
  var ModelStarterAttemptPolicySchema = z3.discriminatedUnion("kind", [
68
- z3.object({ kind: z3.literal("hosted_chat"), modelId: IdSchema, messages: EvaluationMessagesSchema.optional(), maxOutputTokens: z3.number().int().min(1).max(4096).default(1024), temperature: z3.number().min(0).max(2).default(0), topP: z3.number().gt(0).max(1).default(1) }).strict(),
69
+ z3.object({ kind: z3.literal("hosted_chat"), modelId: IdSchema, harness: StandaloneHarnessExperimentSourceSchema.optional(), messages: EvaluationMessagesSchema.optional(), maxOutputTokens: z3.number().int().min(1).max(4096).default(1024), temperature: z3.number().min(0).max(2).default(0), topP: z3.number().gt(0).max(1).default(1) }).strict(),
69
70
  z3.object({ kind: z3.literal("fixture"), fixtureId: IdSchema }).strict()
70
71
  ]);
71
72
  var ModelStarterAttemptRequestSchema = z3.object({
@@ -124,9 +125,15 @@ var ModelStarterAttemptResultSchema = z3.object({
124
125
  grade: TaskGradeSchema2.nullable().optional(),
125
126
  experimentGrade: ExperimentAttemptGradeSchema.nullable().optional(),
126
127
  environment: z3.object({ status: z3.enum(["completed", "budget_exhausted", "cancelled", "timed_out", "policy_failure", "environment_failure"]), collected: z3.boolean(), definition: ModelProjectVersionedRefSchema, initialStateHash: HashSchema.nullable(), finalStateHash: HashSchema.nullable(), attemptHash: HashSchema }).strict(),
128
+ native: NativeHarnessExperimentEvidenceSchema.optional(),
127
129
  providerRequestIds: z3.array(IdSchema).max(1001),
128
130
  contentHash: HashSchema
129
131
  }).strict().superRefine((value, context) => {
132
+ const source = value.attempt.request.policy.kind === "hosted_chat" ? value.attempt.request.policy.harness : void 0;
133
+ if (Boolean(source) !== Boolean(value.native))
134
+ context.addIssue({ code: "custom", path: ["native"], message: "Standalone Harness results require their exact native evidence." });
135
+ if (value.native && (!source || contentHash(source) !== contentHash(value.native.source) || value.native.modelConfigurationHash !== value.attempt.policySnapshot?.configurationHash || value.environment.initialStateHash !== null || value.environment.finalStateHash !== null || value.environment.status === "completed" && (!value.environment.collected || value.output === null || value.native.partialOutputAvailable || value.native.outputHash !== contentHash(value.output))))
136
+ context.addIssue({ code: "custom", path: ["native"], message: "Native evidence differs from the admitted source, model or output." });
130
137
  if (value.experimentGrade) {
131
138
  if (value.grade || value.composition) context.addIssue({ code: "custom", message: "Selected Experiment grading cannot claim another grade population." });
132
139
  if (!["completed", "failed"].includes(value.attempt.status) || !value.attempt.resultAvailable || value.attempt.score !== value.experimentGrade.score || value.attempt.gradingStatus !== value.experimentGrade.gradingStatus || value.attempt.passed !== (value.experimentGrade.score === null ? null : value.experimentGrade.passed))
@@ -238,4 +245,4 @@ export {
238
245
  OpenPondModelStarterAttemptError,
239
246
  OpenPondModelStarterAttemptsClient
240
247
  };
241
- //# sourceMappingURL=chunk-BGXWHDYM.js.map
248
+ //# sourceMappingURL=chunk-W5TXWVFS.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/model-starter-attempts.ts", "../src/evaluation-project-context.ts", "../src/experiment-grading-contracts.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\nimport { EvaluationProjectContextSchema, EvaluationMessagesSchema } from \"./evaluation-project-context.js\";\nexport { EvaluationProjectContextSchema, EvaluationMessagesSchema, type EvaluationProjectContext } from \"./evaluation-project-context.js\";\nimport { RewardCompositionSchema } from \"@openpond/evals/rewards\";\nimport { TaskGradeSchema } from \"@openpond/evals/graders\";\nimport { TaskSplitSchema } from \"@openpond/evals/tasksets\";\nimport { ExperimentAttemptGradeSchema } from \"./experiment-grading-contracts.js\";\nimport { ModelProjectVersionedRefSchema } from \"./model-projects.js\";\nimport { canonicalJson, canonicalSha256 } from \"./protocol.js\";\nimport { StandaloneHarnessExperimentSourceSchema, NativeHarnessExperimentEvidenceSchema } from \"@openpond/evals/experiments\";\nimport { contentHash } from \"@openpond/harness\";\n\nconst IdSchema = z.string().trim().min(1).max(200);\nconst HashSchema = z.string().regex(/^[a-f0-9]{64}$/);\nexport const ModelStarterAttemptPolicySchema = z.discriminatedUnion(\"kind\", [\n z.object({ kind: z.literal(\"hosted_chat\"), modelId: IdSchema, harness: StandaloneHarnessExperimentSourceSchema.optional(), messages: EvaluationMessagesSchema.optional(), maxOutputTokens: z.number().int().min(1).max(4_096).default(1_024), temperature: z.number().min(0).max(2).default(0), topP: z.number().gt(0).max(1).default(1) }).strict(),\n z.object({ kind: z.literal(\"fixture\"), fixtureId: IdSchema }).strict(),\n]);\n/** The server resolves task input, private state, verifier and fixture script.\n * A caller can select releases, but cannot submit replacement execution bytes. */\nexport const ModelStarterAttemptRequestSchema = z.object({\n schemaVersion: z.literal(\"openpond.modelStarterAttemptRequest.v1\"),\n operationId: IdSchema, teamId: IdSchema, modelProjectId: IdSchema.nullable(),\n project: EvaluationProjectContextSchema.optional(),\n taskset: ModelProjectVersionedRefSchema, taskId: IdSchema,\n environmentSeed: z.number().int().min(0).max(2_147_483_647).default(0),\n policy: ModelStarterAttemptPolicySchema,\n}).strict();\nexport type ModelStarterAttemptRequest = z.infer<typeof ModelStarterAttemptRequestSchema>;\nexport const ModelStarterAttemptChoicesQuerySchema = z.object({ modelProjectId: IdSchema.nullable(), taskset: ModelProjectVersionedRefSchema, afterTaskId: IdSchema.optional(), limit: z.number().int().min(1).max(100).default(25) }).strict();\nexport const ModelStarterAttemptChoicesSchema = z.object({\n modelProjectId: IdSchema.nullable(), taskset: ModelProjectVersionedRefSchema, available: z.boolean(), unavailableReason: z.string().max(1_000).nullable(),\n models: z.array(z.object({ id: IdSchema, name: z.string().max(500) }).strict()).max(200),\n tasks: z.array(z.object({ id: IdSchema, split: TaskSplitSchema, inputPreview: z.string().max(500), fixtures: z.array(z.object({ id: IdSchema, label: z.string().max(200) }).strict()).max(1_000) }).strict()).max(100),\n nextCursor: IdSchema.nullable(),\n}).strict();\nexport const ModelStarterAttemptSummarySchema = z.object({\n schemaVersion: z.literal(\"openpond.modelStarterAttemptSummary.v1\"),\n id: IdSchema, revision: z.number().int().positive(), request: ModelStarterAttemptRequestSchema,\n status: z.enum([\"queued\", \"running\", \"cancelling\", \"completed\", \"failed\", \"cancelled\"]),\n policySnapshot: z.object({ modelId: IdSchema, provider: IdSchema, upstreamModelId: z.string().min(1).max(500), configurationHash: HashSchema }).strict().nullable(),\n createdAt: z.iso.datetime(), startedAt: z.iso.datetime().nullable(), completedAt: z.iso.datetime().nullable(),\n cleanupComplete: z.boolean(), resultAvailable: z.boolean(), score: z.number().min(0).max(1).nullable(),\n gradingStatus: z.enum([\"not_started\", \"scored\", \"unscorable\", \"not_configured\"]).default(\"not_started\"),\n passed: z.boolean().nullable(), outputPreview: z.string().max(500).nullable(),\n error: z.object({ code: IdSchema, message: z.string().max(2_000) }).strict().nullable(),\n}).strict().superRefine((value, context) => {\n if ((value.request.policy.kind === \"fixture\") !== (value.policySnapshot === null)) context.addIssue({ code: \"custom\", path: [\"policySnapshot\"], message: \"Fixture execution must not claim a model identity.\" });\n if (value.status === \"completed\" && (!value.cleanupComplete || !value.resultAvailable || !value.completedAt)) context.addIssue({ code: \"custom\", message: \"Completed attempts require retained results and confirmed cleanup.\" });\n});\nexport type ModelStarterAttemptSummary = z.infer<typeof ModelStarterAttemptSummarySchema>;\nexport const ModelStarterAttemptListQuerySchema = z.object({ modelProjectId: IdSchema, afterId: IdSchema.optional(), limit: z.number().int().min(1).max(100).default(25) }).strict();\nexport const ModelStarterAttemptPageSchema = z.object({ items: z.array(ModelStarterAttemptSummarySchema).max(100), nextCursor: IdSchema.nullable() }).strict();\nexport const ModelStarterAttemptResultSchema = z.object({\n schemaVersion: z.literal(\"openpond.modelStarterAttemptResult.v1\"),\n attempt: ModelStarterAttemptSummarySchema,\n output: z.string().max(1_048_576).nullable(),\n // Only model-facing messages, never the private environment snapshot.\n messages: z.array(z.record(z.string(), z.unknown())).max(4_002),\n composition: RewardCompositionSchema.nullable(),\n // Ordinary Tasksets have no Reward binding. Absence preserves the hash of\n // already retained v1 results; new producers explicitly return null or a grade.\n grade: TaskGradeSchema.nullable().optional(),\n experimentGrade: ExperimentAttemptGradeSchema.nullable().optional(),\n environment: z.object({ status: z.enum([\"completed\", \"budget_exhausted\", \"cancelled\", \"timed_out\", \"policy_failure\", \"environment_failure\"]), collected: z.boolean(), definition: ModelProjectVersionedRefSchema, initialStateHash: HashSchema.nullable(), finalStateHash: HashSchema.nullable(), attemptHash: HashSchema }).strict(),\n native: NativeHarnessExperimentEvidenceSchema.optional(),\n providerRequestIds: z.array(IdSchema).max(1_001),\n contentHash: HashSchema,\n}).strict().superRefine((value, context) => {\n const source = value.attempt.request.policy.kind === \"hosted_chat\" ? value.attempt.request.policy.harness : undefined;\n if (Boolean(source) !== Boolean(value.native))\n context.addIssue({ code: \"custom\", path: [\"native\"], message: \"Standalone Harness results require their exact native evidence.\" });\n if (value.native && (!source || contentHash(source) !== contentHash(value.native.source)\n || value.native.modelConfigurationHash !== value.attempt.policySnapshot?.configurationHash\n || value.environment.initialStateHash !== null || value.environment.finalStateHash !== null\n || (value.environment.status === \"completed\" && (!value.environment.collected || value.output === null\n || value.native.partialOutputAvailable || value.native.outputHash !== contentHash(value.output)))))\n context.addIssue({ code: \"custom\", path: [\"native\"], message: \"Native evidence differs from the admitted source, model or output.\" });\n if (value.experimentGrade) {\n if (value.grade || value.composition) context.addIssue({ code: \"custom\", message: \"Selected Experiment grading cannot claim another grade population.\" });\n if (![\"completed\", \"failed\"].includes(value.attempt.status) || !value.attempt.resultAvailable || value.attempt.score !== value.experimentGrade.score\n || value.attempt.gradingStatus !== value.experimentGrade.gradingStatus || value.attempt.passed !== (value.experimentGrade.score === null ? null : value.experimentGrade.passed))\n context.addIssue({ code: \"custom\", message: \"Experiment grading differs from its retained attempt summary.\" });\n }\n if (!value.grade) return;\n if (value.composition) context.addIssue({ code: \"custom\", path: [\"grade\"], message: \"An ordinary grade cannot also claim a Reward composition.\" });\n if (![\"completed\", \"failed\"].includes(value.attempt.status) || !value.attempt.resultAvailable || value.attempt.score !== value.grade.score || value.attempt.gradingStatus !== value.grade.gradingStatus || value.attempt.passed !== (value.grade.score === null ? null : value.grade.passed)) context.addIssue({ code: \"custom\", path: [\"grade\"], message: \"Ordinary grade differs from its terminal attempt summary.\" });\n});\nexport type ModelStarterAttemptResult = z.infer<typeof ModelStarterAttemptResultSchema>;\n\nexport class OpenPondModelStarterAttemptError extends Error {\n constructor(readonly status: number, readonly code: string, message: string) { super(message); this.name = \"OpenPondModelStarterAttemptError\"; }\n}\n\nexport class OpenPondModelStarterAttemptsClient {\n readonly #options: { baseUrl: string; apiKey: string; teamId: string; fetch?: typeof globalThis.fetch };\n constructor(options: { baseUrl: string; apiKey: string; teamId: string; fetch?: typeof globalThis.fetch }) {\n const url = new URL(options.baseUrl);\n if (!options.apiKey.trim() || !options.teamId.trim() || ![\"https:\", \"http:\"].includes(url.protocol) || url.username || url.password || url.search || url.hash) throw new Error(\"Starter attempts require an HTTP(S) endpoint and workspace credentials.\");\n this.#options = { ...options, baseUrl: url.toString().replace(/\\/+$/, \"\") };\n }\n async create(value: z.input<typeof ModelStarterAttemptRequestSchema>, options: { signal?: AbortSignal } = {}) {\n const request = ModelStarterAttemptRequestSchema.parse(value);\n if (request.teamId !== this.#options.teamId) throw new Error(\"Attempt belongs to another workspace.\");\n const result = this.#summary(await this.#request(\"\", \"POST\", request, options.signal));\n if (canonicalJson(result.request) !== canonicalJson(request)) throw new OpenPondModelStarterAttemptError(502, \"attempt_request_mismatch\", \"Attempt receipt differs from the submitted request.\");\n return result;\n }\n async get(id: string, options: { signal?: AbortSignal } = {}) { return this.#summary(await this.#request(`/${encodeURIComponent(IdSchema.parse(id))}`, \"GET\", undefined, options.signal), id); }\n async choices(value: z.input<typeof ModelStarterAttemptChoicesQuerySchema>, options: { signal?: AbortSignal } = {}) {\n const query = ModelStarterAttemptChoicesQuerySchema.parse(value);\n const params = new URLSearchParams({ ...(query.modelProjectId ? { modelProjectId: query.modelProjectId } : {}), tasksetId: query.taskset.id, revision: String(query.taskset.revision), contentHash: query.taskset.contentHash, limit: String(query.limit) });\n if (query.afterTaskId) params.set(\"afterTaskId\", query.afterTaskId);\n const result = ModelStarterAttemptChoicesSchema.parse(await this.#request(`/choices?${params}`, \"GET\", undefined, options.signal));\n if (result.modelProjectId !== query.modelProjectId || canonicalJson(result.taskset) !== canonicalJson(query.taskset) || result.tasks.length > query.limit || new Set(result.tasks.map(task => task.id)).size !== result.tasks.length) throw new OpenPondModelStarterAttemptError(502, \"attempt_choices_mismatch\", \"Attempt choices differ from the selected model or Taskset.\");\n return result;\n }\n async cancel(id: string, options: { signal?: AbortSignal } = {}) { return this.#summary(await this.#request(`/${encodeURIComponent(IdSchema.parse(id))}/cancel`, \"POST\", undefined, options.signal), id); }\n async result(id: string, options: { signal?: AbortSignal } = {}) {\n const value = ModelStarterAttemptResultSchema.parse(await this.#request(`/${encodeURIComponent(IdSchema.parse(id))}/result`, \"GET\", undefined, options.signal));\n this.#summary(value.attempt, id);\n const { contentHash, ...content } = value;\n if (!value.attempt.resultAvailable || await canonicalSha256(content) !== contentHash) throw new OpenPondModelStarterAttemptError(502, \"attempt_result_integrity\", \"Attempt result integrity failed.\");\n return value;\n }\n async list(value: z.input<typeof ModelStarterAttemptListQuerySchema>, options: { signal?: AbortSignal } = {}) {\n const query = ModelStarterAttemptListQuerySchema.parse(value);\n const params = new URLSearchParams({ modelProjectId: query.modelProjectId, limit: String(query.limit) });\n if (query.afterId) params.set(\"afterId\", query.afterId);\n const page = ModelStarterAttemptPageSchema.parse(await this.#request(`?${params}`, \"GET\", undefined, options.signal));\n if (page.items.length > query.limit || new Set(page.items.map(item => item.id)).size !== page.items.length || page.items.some(item => this.#summary(item).request.modelProjectId !== query.modelProjectId)) throw new OpenPondModelStarterAttemptError(502, \"attempt_page_mismatch\", \"Attempt page differs from the selected model.\");\n return page;\n }\n #summary(value: unknown, id?: string): ModelStarterAttemptSummary {\n const result = ModelStarterAttemptSummarySchema.parse(value);\n if (result.request.teamId !== this.#options.teamId || (id && result.id !== id)) throw new OpenPondModelStarterAttemptError(502, \"attempt_identity_mismatch\", \"Attempt receipt belongs to another identity or workspace.\");\n return result;\n }\n async #request(path: string, method: string, body: unknown, signal?: AbortSignal): Promise<unknown> {\n const response = await (this.#options.fetch ?? globalThis.fetch)(`${this.#options.baseUrl}/v1/model-starter-attempts${path}`, { method, headers: { Authorization: `Bearer ${this.#options.apiKey}`, \"X-OpenPond-Team-Id\": this.#options.teamId, \"Content-Type\": \"application/json\", Accept: \"application/json\" }, ...(body === undefined ? {} : { body: JSON.stringify(body) }), signal, redirect: \"error\" });\n const reader = response.body?.getReader();\n if (!reader) throw new OpenPondModelStarterAttemptError(response.status, \"attempt_empty_response\", \"Attempt response was empty.\");\n let bytes = 0; let text = \"\"; const decoder = new TextDecoder();\n try {\n while (true) {\n const chunk = await reader.read(); if (chunk.done) break;\n bytes += chunk.value.byteLength;\n if (bytes > 16_777_216) throw new OpenPondModelStarterAttemptError(502, \"attempt_response_too_large\", \"Attempt response exceeded its byte limit.\");\n text += decoder.decode(chunk.value, { stream: true });\n }\n text += decoder.decode();\n } finally { await reader.cancel(); reader.releaseLock(); }\n const value: unknown = JSON.parse(text);\n if (!response.ok) {\n const error = z.object({ code: IdSchema, message: z.string().max(2_000) }).safeParse(value);\n throw new OpenPondModelStarterAttemptError(response.status, error.success ? error.data.code : \"attempt_request_failed\", error.success ? error.data.message : \"Attempt request failed.\");\n }\n return value;\n }\n}\n", "import { z } from \"zod\";\n\n/** The selected Project revision is retained independently of model artifacts.\n * Hosts resolve and authorize this reference before admitting execution. */\nexport const EvaluationProjectContextSchema = z.object({\n id: z.string().trim().min(1).max(240),\n revision: z.number().int().positive(),\n contentHash: z.string().regex(/^[a-f0-9]{64}$/),\n targetId: z.string().trim().min(1).max(240).nullable(),\n}).strict();\nexport type EvaluationProjectContext = z.infer<typeof EvaluationProjectContextSchema>;\n\nexport const EvaluationMessagesSchema = z.array(z.object({\n role: z.enum([\"system\", \"user\", \"assistant\"]),\n content: z.string().max(100_000),\n}).strict()).max(100).superRefine((messages, context) => {\n if (messages.reduce((total, message) => total + message.content.length, 0) > 100_000)\n context.addIssue({ code: \"custom\", message: \"Evaluation prompt exceeds 100,000 characters.\" });\n});\n", "import { z } from \"zod\";\nimport { FailureClassSchema, contentHash } from \"@openpond/harness\";\nimport { TaskGradeSchema } from \"@openpond/evals/graders\";\n\nexport const ExperimentAttemptGradeSchema = z.object({\n schemaVersion: z.literal(\"openpond.experimentAttemptGrade.v1\"), selectionHash: z.string().regex(/^[a-f0-9]{64}$/),\n grades: z.array(TaskGradeSchema).min(1).max(100), score: z.number().min(0).max(1).nullable(),\n passed: z.boolean(), rewardEligible: z.boolean(), gradingStatus: z.enum([\"scored\", \"unscorable\", \"not_configured\"]),\n failureClass: FailureClassSchema.nullable(), contentHash: z.string().regex(/^[a-f0-9]{64}$/),\n}).strict().superRefine((grade, context) => {\n const { contentHash: actual, ...body } = grade;\n if (contentHash(body) !== actual) context.addIssue({ code: \"custom\", message: \"Experiment grading integrity failed.\" });\n const components = grade.grades.flatMap(value => value.components);\n if (components.length !== grade.grades.length || new Set(components.map(component => component.graderId)).size !== components.length)\n context.addIssue({ code: \"custom\", message: \"Each selected criterion requires exactly one distinct grader result.\" });\n for (const item of grade.grades) {\n const { contentHash: itemHash, ...itemBody } = item;\n if (contentHash(itemBody) !== itemHash) context.addIssue({ code: \"custom\", message: \"A retained criterion changed.\" });\n for (const component of item.components) {\n const { contentHash: componentHash, ...componentBody } = component;\n if (contentHash(componentBody) !== componentHash) context.addIssue({ code: \"custom\", message: \"A retained grader result changed.\" });\n }\n }\n});\nexport type ExperimentAttemptGrade = z.infer<typeof ExperimentAttemptGradeSchema>;\n"],
5
+ "mappings": "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",
6
+ "names": ["z", "TaskGradeSchema", "z", "z", "z", "TaskGradeSchema", "contentHash"]
7
+ }