openpond-sdk 0.12.15 → 0.12.17

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 (38) hide show
  1. package/dist/{chunk-FBZTDDRC.js → chunk-C5LW5IFH.js} +2 -2
  2. package/dist/{chunk-WM3U4RPZ.js → chunk-JMXFHO2W.js} +40 -9
  3. package/dist/chunk-JMXFHO2W.js.map +1 -0
  4. package/dist/{chunk-HJ2AIAKX.js → chunk-QJCCNBMZ.js} +11 -1
  5. package/dist/chunk-QJCCNBMZ.js.map +1 -0
  6. package/dist/{chunk-L6EJX2VQ.js → chunk-VQ34VXAZ.js} +2 -2
  7. package/dist/{chunk-3DWPLYFJ.js → chunk-ZDOGI6PB.js} +2 -2
  8. package/dist/index.js +17 -10
  9. package/dist/index.js.map +1 -1
  10. package/dist/model-starter-catalog.js +1 -1
  11. package/dist/model-starters.js +1 -1
  12. package/dist/profile-actions.js +2 -2
  13. package/dist/project-actions.js +2 -2
  14. package/dist/types/packages/cloud/src/api/client-context.d.ts +5 -0
  15. package/dist/types/packages/cloud/src/api/client-context.d.ts.map +1 -0
  16. package/dist/types/packages/cloud/src/api/core.d.ts.map +1 -1
  17. package/dist/types/packages/cloud/src/sandbox/runtime-handle.d.ts +3 -5
  18. package/dist/types/packages/cloud/src/sandbox/runtime-handle.d.ts.map +1 -1
  19. package/dist/types/packages/cloud/src/sandbox/sandbox-instance-client.d.ts +11 -5
  20. package/dist/types/packages/cloud/src/sandbox/sandbox-instance-client.d.ts.map +1 -1
  21. package/dist/types/packages/cloud/src/sandbox/smoke.d.ts.map +1 -1
  22. package/dist/types/packages/cloud/src/sandbox/types/billing.d.ts +53 -0
  23. package/dist/types/packages/cloud/src/sandbox/types/billing.d.ts.map +1 -1
  24. package/dist/types/packages/cloud/src/sandbox/types/responses.d.ts +11 -1
  25. package/dist/types/packages/cloud/src/sandbox/types/responses.d.ts.map +1 -1
  26. package/dist/types/packages/cloud/src/sandbox/types/snapshots.d.ts +52 -3
  27. package/dist/types/packages/cloud/src/sandbox/types/snapshots.d.ts.map +1 -1
  28. package/dist/types/packages/sdk/src/model-supervised-training-defaults.d.ts +1 -1
  29. package/dist/types/packages/sdk/src/model-supervised-training-defaults.d.ts.map +1 -1
  30. package/dist/types/packages/sdk/src/model-training-defaults.d.ts +1 -1
  31. package/dist/types/packages/sdk/src/model-training-defaults.d.ts.map +1 -1
  32. package/dist/workflows.js +2 -2
  33. package/package.json +1 -1
  34. package/dist/chunk-HJ2AIAKX.js.map +0 -1
  35. package/dist/chunk-WM3U4RPZ.js.map +0 -1
  36. /package/dist/{chunk-FBZTDDRC.js.map → chunk-C5LW5IFH.js.map} +0 -0
  37. /package/dist/{chunk-L6EJX2VQ.js.map → chunk-VQ34VXAZ.js.map} +0 -0
  38. /package/dist/{chunk-3DWPLYFJ.js.map → chunk-ZDOGI6PB.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  apiFetch,
3
3
  readApiJson
4
- } from "./chunk-HJ2AIAKX.js";
4
+ } from "./chunk-QJCCNBMZ.js";
5
5
 
6
6
  // src/workflows.ts
7
7
  import { randomUUID } from "node:crypto";
@@ -77,4 +77,4 @@ function requiredId(value, label) {
77
77
  export {
78
78
  OpenPondWorkflowsClient
79
79
  };
80
- //# sourceMappingURL=chunk-FBZTDDRC.js.map
80
+ //# sourceMappingURL=chunk-C5LW5IFH.js.map
@@ -36,8 +36,39 @@ import { compileBoundGraders } from "@openpond/evals/rewards";
36
36
 
37
37
  // src/model-supervised-training-defaults.ts
38
38
  var fields = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : {};
39
- function createSupervisedTrainingRecipeDefaults(saved) {
39
+ var denseSources = [
40
+ {
41
+ id: "Qwen/Qwen3.5-4B",
42
+ revision: "851bf6e806efd8d0a36b00ddf55e13ccb7b8cd0a",
43
+ chatTemplateHash: "a4aee8afcf2e0711942cf848899be66016f8d14a889ff9ede07bca099c28f715",
44
+ rank: 16,
45
+ memoryBytes: 24e9
46
+ },
47
+ {
48
+ id: "Qwen/Qwen3.5-9B",
49
+ revision: "c202236235762e1c871ad0ccb60c8ee5ba337b9a",
50
+ chatTemplateHash: "a4aee8afcf2e0711942cf848899be66016f8d14a889ff9ede07bca099c28f715",
51
+ rank: 16,
52
+ memoryBytes: 48e9
53
+ },
54
+ {
55
+ id: "Qwen/Qwen3.8-27B",
56
+ revision: "1d4bf0f2ff6012fd82039f2fa52739d0dd7c60c0",
57
+ chatTemplateHash: "c3cf9e34abf4f9e36c2d72165aa9c132d3e2a725b6c2586aaa3a8af9d7a81041",
58
+ rank: 8,
59
+ memoryBytes: 8e10
60
+ }
61
+ ];
62
+ function createSupervisedTrainingRecipeDefaults(saved, baseModel) {
40
63
  const source = saved?.method === "sft" ? saved : void 0;
64
+ const base = baseModel ? {
65
+ id: baseModel.modelId,
66
+ revision: baseModel.revision,
67
+ tokenizerRevision: baseModel.tokenizerRevision,
68
+ chatTemplateHash: baseModel.chatTemplateHash
69
+ } : fields(source?.baseModel);
70
+ const dense = denseSources.find((candidate) => candidate.id === base.id && candidate.revision === base.revision && candidate.revision === base.tokenizerRevision && candidate.chatTemplateHash === base.chatTemplateHash);
71
+ const rank = dense?.rank ?? 16;
41
72
  return {
42
73
  schemaVersion: "openpond.sftRecipe.v1",
43
74
  method: "sft",
@@ -51,10 +82,10 @@ function createSupervisedTrainingRecipeDefaults(saved) {
51
82
  ...fields(source?.dataset)
52
83
  },
53
84
  lora: {
54
- rank: 16,
55
- alpha: 32,
85
+ rank,
86
+ alpha: rank * 2,
56
87
  dropout: 0,
57
- targetModules: ["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
88
+ targetModules: dense ? ["down_proj", "gate_proj", "up_proj"] : ["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
58
89
  ...fields(source?.lora)
59
90
  },
60
91
  optimizer: {
@@ -68,7 +99,7 @@ function createSupervisedTrainingRecipeDefaults(saved) {
68
99
  },
69
100
  resourceLimits: {
70
101
  cpuThreads: 4,
71
- memoryBytes: 48 * 1024 ** 3,
102
+ memoryBytes: dense?.memoryBytes ?? 48 * 1024 ** 3,
72
103
  wallTimeMs: 60 * 60 * 1e3,
73
104
  ...fields(source?.resourceLimits)
74
105
  }
@@ -79,8 +110,8 @@ function createSupervisedTrainingRecipeDefaults(saved) {
79
110
  function fields2(value) {
80
111
  return value && typeof value === "object" && !Array.isArray(value) ? value : {};
81
112
  }
82
- function createModelTrainingRecipeDefaults(saved, method = saved?.method === "sft" ? "sft" : "grpo") {
83
- if (method === "sft") return createSupervisedTrainingRecipeDefaults(saved);
113
+ function createModelTrainingRecipeDefaults(saved, method = saved?.method === "sft" ? "sft" : "grpo", baseModel) {
114
+ if (method === "sft") return createSupervisedTrainingRecipeDefaults(saved, baseModel);
84
115
  const grpo = saved?.method === "grpo" ? saved : void 0;
85
116
  const defaults = {
86
117
  schemaVersion: "openpond.rftRecipe.v1",
@@ -137,7 +168,7 @@ function prepareModelTrainingDefaults(input) {
137
168
  if (setup.recipe && setup.recipe.method !== "sft" || !base?.revision || !base.tokenizerRevision || !base.chatTemplateHash) return setup;
138
169
  const training2 = source.taskset.tasks.filter((task) => task.split === "train");
139
170
  if (!training2.length) return setup;
140
- const recipe2 = createSupervisedTrainingRecipeDefaults(setup.recipe);
171
+ const recipe2 = createSupervisedTrainingRecipeDefaults(setup.recipe, base);
141
172
  const dataset = fields2(recipe2.dataset);
142
173
  const sameEvaluation = setup.evaluationTasksetRef?.id === setup.tasksetRef?.id && setup.evaluationTasksetRef?.contentHash === setup.tasksetRef?.contentHash;
143
174
  if (!dataset.validationSplit && !sameEvaluation)
@@ -412,4 +443,4 @@ export {
412
443
  previewModelStarter,
413
444
  validateResolvedModelStarter
414
445
  };
415
- //# sourceMappingURL=chunk-WM3U4RPZ.js.map
446
+ //# sourceMappingURL=chunk-JMXFHO2W.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/model-starters.ts","../src/model-training-defaults.ts","../src/model-supervised-training-defaults.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { ModelInitialLearningSchema } from \"./model-learning-intent.js\";\nimport { TasksetReleaseSchema, assertTasksetRelease } from \"@openpond/evals/tasksets\";\nimport { LearningTextAssetSchema, TaskDefinitionSchema, learningRef, sameLearningRef, sealLearningContent } from \"@openpond/evals/learning\";\nimport { RewardBindingSchema, RewardReleaseSchema, compileBoundGraders } from \"@openpond/evals/rewards\";\nimport { assertBoundedTaskJson, validateTaskValue } from \"@openpond/evals/task-schema\";\n\nimport { ModelProjectBaseModelSchema, ModelProjectRecipeDocumentSchema, ModelProjectTrainingMethodSchema, ModelProjectVersionedRefSchema, ModelProjectTrainingSetupSchema } from \"./model-projects.js\";\nimport { canonicalSha256 } from \"./protocol.js\";\nimport { ModelStarterExecutionSchema, validateModelStarterExecution } from \"./model-starter-execution.js\";\n\nexport { ModelStarterExecutionSchema, ModelStarterEnvironmentAttemptSchema, verifyModelStarterEnvironmentAttempt, ModelStarterToolFixtureScriptSchema, createModelStarterExecutionAsset, modelStarterExecutionAssetId, resolveModelStarterExecutionAsset, type ModelStarterExecution, type ModelStarterExecutionContext } from \"./model-starter-execution.js\";\nexport { NativeHarnessExperimentAttemptSchema, verifyNativeHarnessExperimentAttempt, type NativeHarnessExperimentAttempt } from \"./model-starter-execution.js\";\nexport { ModelTasksetDerivationSchema, ModelTasksetPackageSchema, deriveModelTaskset, validateModelTasksetPackage, type ModelTasksetPackage } from \"./model-taskset-derivation.js\";\nexport { ModelTasksetExecutionResourcesSchema, createModelTasksetExecutionResourcesAsset, modelTasksetExecutionResourcesAssetId, resolveModelTasksetExecutionResourcesAsset } from \"./model-taskset-resources.js\";\nexport { prepareModelTrainingDefaults, createModelTrainingRecipeDefaults, rebindModelTrainingRecipe } from \"./model-training-defaults.js\";\n\nconst IdSchema = z.string().trim().min(1).max(500);\nconst RefSchema = ModelProjectVersionedRefSchema;\n\n/** Catalog records contain references and previews, never the private task rows. */\nexport const ModelStarterContentSchema = z.object({\n schemaVersion: z.literal(\"openpond.modelStarter.v1\"),\n id: IdSchema,\n revision: z.number().int().positive(),\n name: z.string().trim().min(1).max(200),\n description: z.string().trim().min(1).max(2_000),\n category: z.enum([\"extraction\", \"support\", \"operations\", \"knowledge\", \"coding\", \"writing\", \"classification\"]),\n taskset: RefSchema,\n taskDefinition: RefSchema,\n rewardBinding: RefSchema,\n rewards: z.array(RefSchema).min(1).max(100),\n assets: z.array(RefSchema).max(1_000),\n previewTaskIds: z.array(IdSchema).min(1).max(8),\n startingModel: ModelProjectBaseModelSchema,\n supportedMethods: z.array(ModelProjectTrainingMethodSchema).min(1).max(8),\n defaultMethod: ModelProjectTrainingMethodSchema,\n provenance: z.object({ author: z.string().min(1).max(200), license: z.string().min(1).max(200), sourceDescription: z.string().min(1).max(2_000) }).strict(),\n // These are references to real results. Package publication does not create\n // evidence, qualify a starter, or enable continuous learning.\n evidence: z.object({ verifierFixtures: RefSchema.nullable(), baseline: RefSchema.nullable(), training: RefSchema.nullable(), evaluation: RefSchema.nullable() }).strict(),\n}).strict().superRefine((starter, context) => {\n if (!starter.supportedMethods.includes(starter.defaultMethod)) context.addIssue({ code: \"custom\", path: [\"defaultMethod\"], message: \"The default method must be supported by the package.\" });\n for (const field of [\"rewards\", \"assets\"] as const) {\n if (new Set(starter[field].map(ref => ref.id)).size !== starter[field].length) context.addIssue({ code: \"custom\", path: [field], message: \"Dependency identities must be unique.\" });\n }\n if (new Set(starter.previewTaskIds).size !== starter.previewTaskIds.length) context.addIssue({ code: \"custom\", path: [\"previewTaskIds\"], message: \"Preview tasks must be unique.\" });\n});\nexport const ModelStarterSchema = ModelStarterContentSchema.safeExtend({ contentHash: z.string().regex(/^[a-f0-9]{64}$/) });\nexport type ModelStarter = z.infer<typeof ModelStarterSchema>;\n\n/** A resolved small package, obtained separately from catalog discovery.\n * Large Tasksets remain manifest/shard resources; they are not list payloads. */\nexport const ResolvedModelStarterSchema = z.object({\n starter: ModelStarterSchema,\n taskset: TasksetReleaseSchema,\n taskDefinition: TaskDefinitionSchema,\n rewardBinding: RewardBindingSchema,\n rewards: z.array(RewardReleaseSchema).min(1).max(100),\n assets: z.array(LearningTextAssetSchema).max(1_000),\n execution: ModelStarterExecutionSchema.optional(),\n}).strict();\nexport type ResolvedModelStarter = z.infer<typeof ResolvedModelStarterSchema>;\n\n/** Publisher attestation for original synthetic contact data, never a caller\n * override for arbitrary imports or for a failed secret scan. */\nexport const ModelStarterPrivacyReviewSchema = z.object({\n schemaVersion: z.literal(\"openpond.modelStarterPrivacyReview.v1\"),\n disposition: z.literal(\"synthetic_only\"),\n reviewedBy: z.string().trim().min(1).max(500), reviewedAt: z.iso.datetime(),\n reviewedContentHash: z.string().regex(/^[a-f0-9]{64}$/),\n note: z.string().trim().min(1).max(2_000),\n}).strict();\nexport function modelStarterPrivacyContentHash(value: ResolvedModelStarter): string {\n const { contentHash: _starterHash, ...starter } = value.starter;\n const { contentHash: _tasksetHash, ...taskset } = value.taskset;\n const { contentHash: _referenceHash, ...tasksetRef } = starter.taskset;\n const metadata = { ...taskset.metadata };\n const authoring = metadata.starterAuthoring;\n if (authoring && typeof authoring === \"object\" && !Array.isArray(authoring)) {\n const { privacyReview: _review, ...content } = authoring as Record<string, unknown>;\n metadata.starterAuthoring = content;\n }\n // Exclude only the attestation and hashes that contain that attestation.\n return sealLearningContent({ ...value, starter: { ...starter, taskset: tasksetRef }, taskset: { ...taskset, metadata } }).contentHash;\n}\n\n/** Final creation intent. The server resolves package bytes from its catalog;\n * callers cannot supply executable resources or qualification receipts here. */\nexport const ModelStarterCreationIntentSchema = z.object({\n profileId: IdSchema,\n modelId: IdSchema,\n name: z.string().trim().min(1).max(200),\n starter: RefSchema,\n startingModel: ModelProjectBaseModelSchema,\n method: ModelProjectTrainingMethodSchema,\n rewardBindingRef: RefSchema.nullable().optional(),\n recipe: ModelProjectRecipeDocumentSchema.nullable().optional(),\n managedGpuSelection: ModelProjectTrainingSetupSchema.shape.managedGpuSelection,\n continuationAdapterMode: ModelProjectTrainingSetupSchema.shape.continuationAdapterMode,\n learning: ModelInitialLearningSchema.optional(),\n}).strict();\nexport const ModelStarterCreationRequestSchema = ModelStarterCreationIntentSchema.extend({\n schemaVersion: z.literal(\"openpond.modelStarterCreation.v1\"),\n operationId: IdSchema,\n}).strict();\nexport type ModelStarterCreationRequest = z.infer<typeof ModelStarterCreationRequestSchema>;\n\nexport function parseModelStarterCreationRequest(value: unknown): ModelStarterCreationRequest {\n assertBoundedTaskJson(value, 64 * 1024);\n return ModelStarterCreationRequestSchema.parse(value);\n}\n\n/** Prepare once on final confirmation and retain across uncertain transport\n * outcomes. The server must bind operationId to the complete original intent\n * and atomically commit resources, model configuration and the retry receipt. */\nexport async function createModelStarterCreationRequest(\n value: z.input<typeof ModelStarterCreationIntentSchema>,\n): Promise<ModelStarterCreationRequest> {\n assertBoundedTaskJson(value, 64 * 1024);\n const intent = ModelStarterCreationIntentSchema.parse(value);\n return parseModelStarterCreationRequest({\n ...intent,\n schemaVersion: \"openpond.modelStarterCreation.v1\",\n operationId: `model-starter:${await canonicalSha256(intent)}`,\n });\n}\n\n/** Scope authorization belongs to the API. This validates the final intent\n * against the exact trusted package before any user resources are written. */\nexport function validateModelStarterCreation(value: unknown, packageValue: unknown) {\n const request = parseModelStarterCreationRequest(value);\n const resolved = validateResolvedModelStarter(packageValue);\n if (!sameLearningRef(request.starter, learningRef(resolved.starter))) throw new Error(\"Starter creation references a different package revision.\");\n if (!resolved.starter.supportedMethods.includes(request.method)) throw new Error(\"The selected training method is not supported by this starter.\");\n return { request, resolved };\n}\n\n/** Explicit projection keeps frozen examples, expected outputs, privileged\n * context and verifier source out of read-only model-facing previews. */\nexport function previewModelStarter(value: unknown) {\n const { starter, taskset, taskDefinition, rewardBinding, rewards } = validateResolvedModelStarter(value);\n return {\n starter,\n inputSchema: taskDefinition.inputSchema,\n outputSchema: taskDefinition.outputSchema,\n reward: {\n name: rewardBinding.name,\n description: rewardBinding.description,\n checks: rewardBinding.sources.map(source => {\n const reward = rewards.find(reward => sameLearningRef(source.reward, learningRef(reward)))!;\n return { name: reward.name, description: reward.description, kind: reward.implementation.kind, role: source.role, weight: source.weight, required: source.required, hardGate: source.hardGate };\n }),\n },\n tasks: starter.previewTaskIds.map(id => {\n const task = taskset.tasks.find(task => task.id === id)!;\n return { id: task.id, input: task.input, policyVisibleContext: task.policyVisibleContext };\n }),\n counts: {\n train: taskset.tasks.filter(task => task.split === \"train\").length,\n validation: taskset.tasks.filter(task => task.split === \"validation\").length,\n frozenEvaluation: taskset.tasks.filter(task => task.split === \"frozen_eval\").length,\n },\n };\n}\n\n/** Verify the dependency graph before creating user-owned configuration.\n * A matching outer hash alone cannot authorize substituted private graders. */\nexport function validateResolvedModelStarter(value: unknown): ResolvedModelStarter {\n assertBoundedTaskJson(value, 16 * 1024 * 1024);\n const resolved = ResolvedModelStarterSchema.parse(value);\n const { starter, taskset, taskDefinition, rewardBinding, rewards, assets } = resolved;\n const authoring = taskset.metadata.starterAuthoring;\n if (authoring && typeof authoring === \"object\" && !Array.isArray(authoring) && \"privacyReview\" in authoring) {\n const review = ModelStarterPrivacyReviewSchema.parse(authoring.privacyReview);\n if (review.reviewedContentHash !== modelStarterPrivacyContentHash(resolved)) throw new Error(\"Starter privacy review differs from the published contents.\");\n }\n const resources = [starter, taskset, taskDefinition, rewardBinding, ...rewards, ...assets];\n for (const resource of resources) {\n const { contentHash, ...content } = resource;\n if (sealLearningContent(content).contentHash !== contentHash) throw new Error(`Starter resource integrity failed: ${resource.id}.`);\n }\n assertTasksetRelease(taskset);\n validateModelStarterExecution(resolved.execution, taskset, assets);\n function exact(expected: z.infer<typeof RefSchema>, resource: { id: string; revision: number; contentHash: string }) {\n if (!sameLearningRef(expected, learningRef(resource))) throw new Error(`Starter dependency mismatch: ${expected.id}.`);\n }\n exact(starter.taskset, taskset);\n exact(starter.taskDefinition, taskDefinition);\n exact(starter.rewardBinding, rewardBinding);\n exact(taskDefinition.rewardBinding, rewardBinding);\n if (rewardBinding.recipeRef) throw new Error(\"Starter binding recipes must be resolved into a standalone binding before publication.\");\n const { policy, environment, environmentRelease, tools, capabilities, verifierSetRelease } = taskset;\n const execution = { policy, environment, ...(environmentRelease ? { environmentRelease } : {}), tools, capabilities, ...(verifierSetRelease ? { verifierSetRelease } : {}) };\n if (sealLearningContent(execution).contentHash !== sealLearningContent(taskDefinition.execution).contentHash) throw new Error(\"Starter execution context differs from its task format.\");\n if (sealLearningContent({ graders: taskset.graders }).contentHash !== sealLearningContent({ graders: compileBoundGraders(rewardBinding, rewards) }).contentHash) throw new Error(\"Starter executable graders differ from its Reward binding.\");\n for (const [references, values] of [[starter.rewards, rewards], [starter.assets, assets]] as const) {\n if (references.length !== values.length || new Set(values.map(resource => resource.id)).size !== values.length) throw new Error(\"Starter dependency inventory mismatch.\");\n for (const ref of references) {\n const resource = values.find(value => value.id === ref.id);\n if (!resource) throw new Error(`Starter dependency is missing: ${ref.id}.`);\n exact(ref, resource);\n }\n }\n for (const source of rewardBinding.sources) {\n const reward = rewards.find(reward => reward.id === source.reward.id);\n if (!reward) throw new Error(`Starter Reward is missing: ${source.reward.id}.`);\n exact(source.reward, reward);\n }\n for (const reward of rewards) {\n const implementation = reward.implementation;\n const references = [...reward.assets,\n ...(\"verifierRef\" in implementation ? [implementation.verifierRef] : []),\n ...(\"rubricRef\" in implementation ? [implementation.rubricRef] : []),\n ...(\"inputContract\" in implementation ? [implementation.inputContract] : []),\n ];\n for (const ref of references) {\n const asset = assets.find(asset => asset.id === ref.id);\n if (!asset || sealLearningContent(asset.asset).contentHash !== sealLearningContent(ref).contentHash) throw new Error(`Starter Reward source is missing or changed: ${ref.id}.`);\n if (ref.visibility === \"policy\") throw new Error(`Starter Reward source must remain private to its evaluator: ${ref.id}.`);\n }\n }\n if (new Set(taskset.tasks.map(task => task.id)).size !== taskset.tasks.length) throw new Error(\"Starter task identities must be unique.\");\n const inputSplits = new Map<string, string>();\n for (const task of taskset.tasks) {\n if (task.policyVisibleContext.instructions !== taskDefinition.instructions) throw new Error(`Starter task does not carry its declared model instructions: ${task.id}.`);\n const inputHash = sealLearningContent({ input: task.input, context: task.policyVisibleContext }).contentHash;\n const priorSplit = inputSplits.get(inputHash);\n if (priorSplit && priorSplit !== task.split) throw new Error(\"Starter policy input appears in multiple splits.\");\n inputSplits.set(inputHash, task.split);\n if (!validateTaskValue(taskDefinition.inputSchema, task.input).valid) throw new Error(`Starter task input does not match its format: ${task.id}.`);\n if (task.expectedOutput !== null && !validateTaskValue(taskDefinition.outputSchema, task.expectedOutput).valid) throw new Error(`Starter expected output does not match its format: ${task.id}.`);\n }\n for (const id of starter.previewTaskIds) {\n const task = taskset.tasks.find(task => task.id === id);\n if (!task || task.split === \"frozen_eval\") throw new Error(`Starter preview task is unavailable: ${id}.`);\n }\n return resolved;\n}\n","import { contentHash } from \"@openpond/harness\";\nimport { compileBoundGraders } from \"@openpond/evals/rewards\";\nimport { validateModelTasksetPackage } from \"./model-taskset-derivation.js\";\nimport { ModelProjectTrainingSetupSchema, type ModelProjectTrainingSetup } from \"./model-projects.js\";\nimport { createSupervisedTrainingRecipeDefaults } from \"./model-supervised-training-defaults.js\";\nimport { ManagedSftRecipeSchema } from \"./training-supervised.js\";\n\nfunction fields(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, unknown> : {};\n}\n\n/** Editable method-specific defaults exist before tasks/base/grader are bound.\n * This draft never authorizes execution; package preparation binds those inputs. */\nexport function createModelTrainingRecipeDefaults(\n saved?: ModelProjectTrainingSetup[\"recipe\"],\n method: \"grpo\" | \"sft\" = saved?.method === \"sft\" ? \"sft\" : \"grpo\",\n baseModel?: ModelProjectTrainingSetup[\"baseModel\"],\n): NonNullable<ModelProjectTrainingSetup[\"recipe\"]> {\n if (method === \"sft\") return createSupervisedTrainingRecipeDefaults(saved, baseModel);\n const grpo = saved?.method === \"grpo\" ? saved : undefined;\n const defaults = {\n schemaVersion: \"openpond.rftRecipe.v1\", method: \"grpo\" as const, parameterization: \"lora\" as const,\n lora: { rank: 2 },\n rollout: { groupSize: 8, concurrency: 4, maxOutputTokens: 1_024, temperature: 0.8, topP: 0.95, seed: 17 },\n optimizer: { learningRate: 0.0001, maxSteps: 8, clipRange: 0.2, iterations: 2,\n microbatchSize: 1, gradientAccumulationSteps: 8, advantageEpsilon: 1e-8,\n adamw: { name: \"adamw\", weightDecay: 0, beta1: 0.9, beta2: 0.999, epsilon: 1e-8 } },\n loss: { method: \"grpo\", klBeta: 0.01 },\n resourceLimits: { wallTimeMs: 66 * 60 * 1_000, maxRollouts: 64, maxPayloadBytes: 1_000_000 },\n policyOptimization: null,\n };\n return {\n ...defaults, ...grpo,\n lora: { ...defaults.lora, ...fields(grpo?.lora) },\n rollout: { ...defaults.rollout, ...fields(grpo?.rollout) },\n optimizer: { ...defaults.optimizer, ...fields(grpo?.optimizer),\n adamw: { ...defaults.optimizer.adamw, ...fields(fields(grpo?.optimizer).adamw) } },\n loss: { ...defaults.loss, ...fields(grpo?.loss) },\n resourceLimits: { ...defaults.resourceLimits, ...fields(grpo?.resourceLimits) },\n };\n}\n\n/** Changing source inputs invalidates only their bindings, preserving the\n * caller's optimizer, rollout, adapter, loss and budget settings. */\nexport function rebindModelTrainingRecipe(saved: ModelProjectTrainingSetup[\"recipe\"]) {\n const { baseModel: _base, reward: _reward, policyOptimization: _compiled, ...recipe } = createModelTrainingRecipeDefaults(saved);\n // Split names and the derived source population belong to the new package.\n // Retain authoring controls such as prompt length/selection strategy.\n const { trainSplit: _train, validationSplit: _validation, maxExamples: _population, ...dataset } = fields(recipe.dataset);\n return recipe.method === \"sft\"\n ? { ...recipe, dataset: { ...dataset, ...(_validation ? { validationSplit: _validation } : {}) } }\n : { ...recipe, dataset, policyOptimization: null };\n}\nimport { validateTasksetPackage } from \"./taskset-package-contracts.js\";\n\n/** Saved defaults do not authorize execution. The Run review still owns the\n * budget, runtime admission and exact training/evaluation population checks. */\nexport function prepareModelTrainingDefaults(input: {\n setup: ModelProjectTrainingSetup;\n package: unknown;\n}): ModelProjectTrainingSetup {\n const setup = ModelProjectTrainingSetupSchema.parse(input.setup);\n const portable = typeof input.package === \"object\" && input.package !== null\n && \"schemaVersion\" in input.package && input.package.schemaVersion === \"openpond.tasksetPackage.v1\"\n ? validateTasksetPackage(input.package) : null;\n const bound = portable ? null : validateModelTasksetPackage(input.package);\n const source = portable ?? bound!;\n const ref = setup.tasksetRef;\n const selected = ref && ref.revision === source.taskset.revision && (portable\n ? (ref.id === portable.taskset.id && ref.contentHash === portable.taskset.contentHash)\n || (ref.id === portable.taskset.metadata.sourceTasksetId && ref.contentHash === portable.taskset.metadata.sourceTasksetHash)\n : ref.id === source.taskset.id);\n if (!selected) return setup;\n if (!setup.evaluationTasksetRef && source.taskset.tasks.some(task => task.split === \"frozen_eval\" || task.split === \"validation\")) {\n setup.evaluationTasksetRef = setup.tasksetRef;\n }\n const base = setup.baseModel;\n if (setup.method === \"sft\") {\n if ((setup.recipe && setup.recipe.method !== \"sft\") || !base?.revision\n || !base.tokenizerRevision || !base.chatTemplateHash) return setup;\n const training = source.taskset.tasks.filter(task => task.split === \"train\");\n if (!training.length) return setup;\n const recipe = createSupervisedTrainingRecipeDefaults(setup.recipe, base);\n const dataset = fields(recipe.dataset);\n const sameEvaluation = setup.evaluationTasksetRef?.id === setup.tasksetRef?.id\n && setup.evaluationTasksetRef?.contentHash === setup.tasksetRef?.contentHash;\n if (!dataset.validationSplit && !sameEvaluation)\n throw new Error(\"Choose the optimizer validation split from the selected evaluation dataset.\");\n return ModelProjectTrainingSetupSchema.parse({\n ...setup,\n recipe: ManagedSftRecipeSchema.parse({\n ...recipe,\n baseModel: { id: base.modelId, revision: base.revision,\n tokenizerRevision: base.tokenizerRevision, chatTemplateHash: base.chatTemplateHash },\n dataset: { ...dataset, trainSplit: \"train\",\n validationSplit: dataset.validationSplit ?? (source.taskset.tasks.some(task => task.split === \"frozen_eval\") ? \"frozen_eval\" : \"validation\"),\n maxExamples: typeof dataset.maxExamples === \"number\" ? Math.min(dataset.maxExamples, training.length) : Math.min(1_000, training.length) },\n }),\n });\n }\n if (setup.method !== \"grpo\" || (setup.recipe && setup.recipe.method !== \"grpo\") || !base?.revision\n || !base.tokenizerRevision || !base.chatTemplateHash) return setup;\n // Existing bound recipes retain their exact explicit settings and the\n // compiler's absent-field semantics. Only an unbound authoring draft needs\n // package-derived defaults; source changes explicitly invalidate bindings.\n if (setup.recipe?.baseModel && setup.recipe.reward && setup.recipe.dataset) return setup;\n const training = source.taskset.tasks.filter(task => task.split === \"train\");\n const graders = portable ? portable.taskset.graders : compileBoundGraders(bound!.rewardBinding, bound!.rewards);\n const grader = graders.find(candidate => candidate.rewardEligible && candidate.weight > 0);\n const environment = portable?.environment ?? bound?.executionResources?.environment ?? bound?.execution?.environment;\n if (!training.length || !grader || !environment) return setup;\n const recipe = createModelTrainingRecipeDefaults(setup.recipe);\n return ModelProjectTrainingSetupSchema.parse({\n ...setup,\n recipe: {\n ...recipe,\n baseModel: { id: base.modelId, revision: base.revision,\n tokenizerRevision: base.tokenizerRevision, chatTemplateHash: base.chatTemplateHash },\n dataset: { trainSplit: \"train\", validationSplit: source.taskset.tasks.some(task => task.split === \"frozen_eval\") ? \"frozen_eval\" : \"validation\",\n maxPromptTokens: 4_096, maxExamples: Math.min(1_000, training.length), selectionStrategy: \"stable_hash_top_n\", ...fields(recipe.dataset) },\n rollout: { maxTurns: source.taskset.environment.kind === \"text\" ? 1 : 15, ...fields(recipe.rollout) },\n reward: { graderId: grader.id, graderHash: contentHash(graders),\n environmentId: environment.id, environmentVersion: String(environment.revision),\n toolContractHash: contentHash(source.taskset.tools), learnedPreference: fields(recipe.reward).learnedPreference ?? null },\n },\n });\n}\n","import type { ModelProjectTrainingSetup } from \"./model-projects.js\";\n\ntype Recipe = NonNullable<ModelProjectTrainingSetup[\"recipe\"]>;\nconst fields = (value: unknown): Record<string, unknown> =>\n value && typeof value === \"object\" && !Array.isArray(value)\n ? value as Record<string, unknown> : {};\n\n// Exact-source authoring settings only. Availability is determined by the\n// connected service when preparing a run, never by these editable defaults.\nconst denseSources = [\n { id: \"Qwen/Qwen3.5-4B\", revision: \"851bf6e806efd8d0a36b00ddf55e13ccb7b8cd0a\",\n chatTemplateHash: \"a4aee8afcf2e0711942cf848899be66016f8d14a889ff9ede07bca099c28f715\", rank: 16, memoryBytes: 24_000_000_000 },\n { id: \"Qwen/Qwen3.5-9B\", revision: \"c202236235762e1c871ad0ccb60c8ee5ba337b9a\",\n chatTemplateHash: \"a4aee8afcf2e0711942cf848899be66016f8d14a889ff9ede07bca099c28f715\", rank: 16, memoryBytes: 48_000_000_000 },\n { id: \"Qwen/Qwen3.8-27B\", revision: \"1d4bf0f2ff6012fd82039f2fa52739d0dd7c60c0\",\n chatTemplateHash: \"c3cf9e34abf4f9e36c2d72165aa9c132d3e2a725b6c2586aaa3a8af9d7a81041\", rank: 8, memoryBytes: 80_000_000_000 },\n] as const;\n\n/** An editable draft, without invented model or dataset bindings. Execution\n * still requires ManagedSftRecipeSchema and authoritative supervised admission. */\nexport function createSupervisedTrainingRecipeDefaults(\n saved?: ModelProjectTrainingSetup[\"recipe\"],\n baseModel?: ModelProjectTrainingSetup[\"baseModel\"],\n): Recipe {\n const source = saved?.method === \"sft\" ? saved : undefined;\n const base = baseModel ? { id: baseModel.modelId, revision: baseModel.revision,\n tokenizerRevision: baseModel.tokenizerRevision, chatTemplateHash: baseModel.chatTemplateHash } : fields(source?.baseModel);\n const dense = denseSources.find(candidate => candidate.id === base.id && candidate.revision === base.revision\n && candidate.revision === base.tokenizerRevision && candidate.chatTemplateHash === base.chatTemplateHash);\n const rank = dense?.rank ?? 16;\n return {\n schemaVersion: \"openpond.sftRecipe.v1\", method: \"sft\", parameterization: \"lora\",\n ...(source?.baseModel ? { baseModel: source.baseModel } : {}),\n dataset: {\n completionOnly: true, maxSequenceLength: 8_192,\n selectionStrategy: \"stable_hash_top_n\", selectionSeed: 17,\n ...fields(source?.dataset),\n },\n lora: {\n rank, alpha: rank * 2, dropout: 0,\n targetModules: dense ? [\"down_proj\", \"gate_proj\", \"up_proj\"]\n : [\"q_proj\", \"k_proj\", \"v_proj\", \"o_proj\", \"gate_proj\", \"up_proj\", \"down_proj\"],\n ...fields(source?.lora),\n },\n optimizer: {\n learningRate: 0.0001, epochs: 3, maxSteps: 30,\n batchSize: 1, gradientAccumulationSteps: 1, seed: 17,\n ...fields(source?.optimizer),\n },\n resourceLimits: {\n cpuThreads: 4, memoryBytes: dense?.memoryBytes ?? 48 * 1024 ** 3, wallTimeMs: 60 * 60 * 1_000,\n ...fields(source?.resourceLimits),\n },\n };\n}\n"],"mappings":"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","names":["compileBoundGraders","fields","training","recipe","reward","task","contentHash","compileBoundGraders","value","asset"]}
@@ -1,3 +1,10 @@
1
+ // ../cloud/dist/api/client-context.js
2
+ import { AsyncLocalStorage } from "node:async_hooks";
3
+ var clientIdentity = new AsyncLocalStorage();
4
+ function apiClientIdentity() {
5
+ return clientIdentity.getStore();
6
+ }
7
+
1
8
  // ../cloud/dist/api/core.js
2
9
  var DEFAULT_API_TIMEOUT_MS = 3e4;
3
10
  var DEFAULT_API_RESPONSE_BYTES = 8 * 1024 * 1024;
@@ -41,6 +48,9 @@ async function apiFetch(baseUrl, token, requestPath, options = {}) {
41
48
  const { timeoutMs = DEFAULT_API_TIMEOUT_MS, maxResponseBytes = DEFAULT_API_RESPONSE_BYTES, explicitBearerAuth = false, ...init } = options;
42
49
  const requestUrl = `${baseUrl}${requestPath}`;
43
50
  const headers = new Headers(init.headers);
51
+ const clientIdentity2 = apiClientIdentity();
52
+ if (clientIdentity2 && !explicitBearerAuth)
53
+ headers.set("x-openpond-client", clientIdentity2);
44
54
  headers.set("Content-Type", "application/json");
45
55
  const apiKey = !explicitBearerAuth ? process.env.OPENPOND_API_KEY : void 0;
46
56
  const trimmedToken = token?.trim() || "";
@@ -152,4 +162,4 @@ export {
152
162
  apiFetch,
153
163
  readApiJson
154
164
  };
155
- //# sourceMappingURL=chunk-HJ2AIAKX.js.map
165
+ //# sourceMappingURL=chunk-QJCCNBMZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../cloud/src/api/client-context.ts","../../cloud/src/api/core.ts"],"sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\n\nconst clientIdentity = new AsyncLocalStorage<string>();\n\n/** Identify a caller within this async operation without changing global fetch\n * or propagating CLI identity to separately launched desktop/server processes. */\nexport function withApiClientIdentity<T>(identity: string, operation: () => T): T {\n return clientIdentity.run(identity, operation);\n}\n\nexport function apiClientIdentity(): string | undefined {\n return clientIdentity.getStore();\n}\n","import { apiClientIdentity } from \"./client-context.js\";\n\nconst DEFAULT_API_TIMEOUT_MS = 30_000;\nconst DEFAULT_API_RESPONSE_BYTES = 8 * 1024 * 1024;\nexport const LONG_STREAM_API_OPTIONS = { timeoutMs: 15 * 60 * 1000, maxResponseBytes: 64 * 1024 * 1024 } as const;\n\nexport type ApiFetchOptions = RequestInit & {\n /** Generic services always use their explicit bearer token, regardless of prefix. */\n explicitBearerAuth?: boolean;\n timeoutMs?: number;\n maxResponseBytes?: number;\n};\n\nexport class ApiTimeoutError extends Error {\n readonly code = \"OPENPOND_API_TIMEOUT\";\n\n constructor(readonly timeoutMs: number, readonly requestUrl: string) {\n super(`API request timed out after ${timeoutMs}ms: ${requestUrl}`);\n this.name = \"ApiTimeoutError\";\n }\n}\n\nexport class ApiResponseTooLargeError extends Error {\n readonly code = \"OPENPOND_API_RESPONSE_TOO_LARGE\";\n\n constructor(readonly maximumBytes: number, readonly requestUrl: string) {\n super(`API response exceeded ${maximumBytes} bytes: ${requestUrl}`);\n this.name = \"ApiResponseTooLargeError\";\n }\n}\n\nexport class OpenPondApiError extends Error {\n readonly code: string;\n\n constructor(\n readonly status: number,\n errorCode: string | null,\n label: string,\n readonly apiMessage: string | null = null,\n ) {\n const detail = apiMessage || errorCode;\n super(`${label} failed: ${status}${detail ? ` ${detail}` : \"\"}`);\n this.name = \"OpenPondApiError\";\n this.code = errorCode || \"OPENPOND_API_ERROR\";\n }\n}\n\nexport async function apiFetch(\n baseUrl: string,\n token: string | null,\n requestPath: string,\n options: ApiFetchOptions = {},\n): Promise<Response> {\n const { timeoutMs = DEFAULT_API_TIMEOUT_MS, maxResponseBytes = DEFAULT_API_RESPONSE_BYTES, explicitBearerAuth = false, ...init } = options;\n const requestUrl = `${baseUrl}${requestPath}`;\n const headers = new Headers(init.headers);\n const clientIdentity = apiClientIdentity();\n if (clientIdentity && !explicitBearerAuth) headers.set(\"x-openpond-client\", clientIdentity);\n headers.set(\"Content-Type\", \"application/json\");\n const apiKey = !explicitBearerAuth ? process.env.OPENPOND_API_KEY : undefined;\n const trimmedToken = token?.trim() || \"\";\n const tokenIsApiKey = !explicitBearerAuth && trimmedToken.startsWith(\"opk_\");\n const effectiveApiKey = apiKey || (tokenIsApiKey ? trimmedToken : null);\n if (effectiveApiKey && !headers.has(\"openpond-api-key\")) headers.set(\"openpond-api-key\", effectiveApiKey);\n if (token) {\n headers.set(\"Authorization\", tokenIsApiKey ? `ApiKey ${trimmedToken}` : `Bearer ${token}`);\n } else if (apiKey && !headers.has(\"Authorization\")) {\n headers.set(\"Authorization\", `ApiKey ${apiKey}`);\n }\n\n const timeoutController = new AbortController();\n const timeoutError = new ApiTimeoutError(timeoutMs, requestUrl);\n const timer = timeoutMs > 0\n ? setTimeout(() => timeoutController.abort(timeoutError), timeoutMs)\n : null;\n timer?.unref?.();\n const signal = composedSignal(init.signal, timeoutController.signal, timeoutMs);\n const cleanup = () => {\n if (timer) clearTimeout(timer);\n };\n\n try {\n const response = await fetch(requestUrl, { ...init, headers, signal });\n return boundedResponse(response, {\n cleanup,\n maximumBytes: maxResponseBytes,\n requestUrl,\n timeoutController,\n timeoutError,\n });\n } catch (error) {\n cleanup();\n if (timeoutController.signal.aborted) throw timeoutError;\n throw error;\n }\n}\n\nexport async function readApiJson<T>(response: Response, label: string): Promise<T> {\n let payload: T & { error?: unknown; message?: unknown };\n try {\n const text = await response.text();\n payload = (text ? JSON.parse(text) : {}) as T & { error?: unknown; message?: unknown };\n } catch (error) {\n if (error instanceof ApiTimeoutError || error instanceof ApiResponseTooLargeError) throw error;\n payload = {} as T & { error?: unknown; message?: unknown };\n }\n if (!response.ok) {\n const errorCode = typeof payload.error === \"string\" ? payload.error : null;\n const apiMessage =\n typeof payload.message === \"string\" ? payload.message : null;\n throw new OpenPondApiError(response.status, errorCode, label, apiMessage);\n }\n return payload as T;\n}\n\nfunction boundedResponse(\n response: Response,\n input: {\n cleanup: () => void;\n maximumBytes: number;\n requestUrl: string;\n timeoutController: AbortController;\n timeoutError: ApiTimeoutError;\n },\n): Response {\n if (!response.body) {\n input.cleanup();\n return response;\n }\n const contentLength = Number(response.headers.get(\"content-length\"));\n if (input.maximumBytes > 0 && Number.isFinite(contentLength) && contentLength > input.maximumBytes) {\n input.cleanup();\n void response.body.cancel();\n throw new ApiResponseTooLargeError(input.maximumBytes, input.requestUrl);\n }\n\n const reader = response.body.getReader();\n let receivedBytes = 0;\n const body = new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const result = await reader.read();\n if (result.done) {\n input.cleanup();\n controller.close();\n return;\n }\n receivedBytes += result.value.byteLength;\n if (input.maximumBytes > 0 && receivedBytes > input.maximumBytes) {\n input.cleanup();\n await reader.cancel();\n controller.error(new ApiResponseTooLargeError(input.maximumBytes, input.requestUrl));\n return;\n }\n controller.enqueue(result.value);\n } catch (error) {\n input.cleanup();\n controller.error(input.timeoutController.signal.aborted ? input.timeoutError : error);\n }\n },\n async cancel(reason) {\n input.cleanup();\n await reader.cancel(reason);\n },\n });\n return new Response(body, {\n headers: response.headers,\n status: response.status,\n statusText: response.statusText,\n });\n}\n\nfunction composedSignal(\n callerSignal: AbortSignal | null | undefined,\n timeoutSignal: AbortSignal,\n timeoutMs: number,\n): AbortSignal | undefined {\n if (timeoutMs <= 0) return callerSignal ?? undefined;\n return callerSignal ? AbortSignal.any([callerSignal, timeoutSignal]) : timeoutSignal;\n}\n"],"mappings":"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","names":["clientIdentity"]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  apiFetch,
3
3
  readApiJson
4
- } from "./chunk-HJ2AIAKX.js";
4
+ } from "./chunk-QJCCNBMZ.js";
5
5
 
6
6
  // src/project-actions.ts
7
7
  import { promises as fs } from "node:fs";
@@ -80,4 +80,4 @@ function projectActionPath(projectId, suffix, teamId) {
80
80
  export {
81
81
  OpenPondProjectActionsClient
82
82
  };
83
- //# sourceMappingURL=chunk-L6EJX2VQ.js.map
83
+ //# sourceMappingURL=chunk-VQ34VXAZ.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  apiFetch,
3
3
  readApiJson
4
- } from "./chunk-HJ2AIAKX.js";
4
+ } from "./chunk-QJCCNBMZ.js";
5
5
 
6
6
  // src/profile-actions.ts
7
7
  var OpenPondProfileActionsClient = class {
@@ -69,4 +69,4 @@ function requiredValue(value, name) {
69
69
  export {
70
70
  OpenPondProfileActionsClient
71
71
  };
72
- //# sourceMappingURL=chunk-3DWPLYFJ.js.map
72
+ //# sourceMappingURL=chunk-ZDOGI6PB.js.map
package/dist/index.js CHANGED
@@ -6,18 +6,18 @@ import {
6
6
  } from "./chunk-U2KGUAIS.js";
7
7
  import {
8
8
  OpenPondProjectActionsClient
9
- } from "./chunk-L6EJX2VQ.js";
9
+ } from "./chunk-VQ34VXAZ.js";
10
10
  import {
11
11
  OpenPondProfileActionsClient
12
- } from "./chunk-3DWPLYFJ.js";
12
+ } from "./chunk-ZDOGI6PB.js";
13
13
  import {
14
14
  OpenPondWorkflowsClient
15
- } from "./chunk-FBZTDDRC.js";
15
+ } from "./chunk-C5LW5IFH.js";
16
16
  import {
17
17
  OpenPondApiError,
18
18
  apiFetch,
19
19
  readApiJson
20
- } from "./chunk-HJ2AIAKX.js";
20
+ } from "./chunk-QJCCNBMZ.js";
21
21
  import {
22
22
  DEFAULT_REFINER_REVIEW_PROFILE,
23
23
  REFINER_CORE_VERSION,
@@ -486,7 +486,7 @@ async function runSandboxSmoke(client, options = {}) {
486
486
  }
487
487
  }
488
488
  });
489
- const snapshot = snapshotResponse.snapshot ?? (await waitForSnapshotReady(client, sandbox.id, snapshotResponse.snapshotJob?.snapshotId)).snapshot;
489
+ const { snapshot } = await waitForSnapshotReady(client, sandbox.id, snapshotResponse.snapshotJob.snapshotId);
490
490
  snapshotId = snapshot.id;
491
491
  if (snapshot.state !== "ready") {
492
492
  throw new Error(`expected ready snapshot, got ${snapshot.state}`);
@@ -997,12 +997,14 @@ var OpenPondSandboxInstanceClient = class {
997
997
  start(sandboxId, options = {}) {
998
998
  return this.request(`/${encodeURIComponent(sandboxId)}/start`, {
999
999
  method: "POST",
1000
- headers: asyncRequestHeaders(options)
1000
+ headers: asyncRequestHeaders(options),
1001
+ ...options.restore ? { body: JSON.stringify({ restore: options.restore }) } : {}
1001
1002
  });
1002
1003
  }
1003
- restore(sandboxId) {
1004
+ restore(sandboxId, input) {
1004
1005
  return this.request(`/${encodeURIComponent(sandboxId)}/restore`, {
1005
- method: "POST"
1006
+ method: "POST",
1007
+ ...input ? { body: JSON.stringify(input) } : {}
1006
1008
  });
1007
1009
  }
1008
1010
  delete(sandboxId, options = {}) {
@@ -1060,8 +1062,13 @@ var OpenPondSandboxInstanceClient = class {
1060
1062
  body: JSON.stringify(input)
1061
1063
  });
1062
1064
  }
1063
- billing(sandboxId) {
1064
- return this.request(`/${encodeURIComponent(sandboxId)}/billing`);
1065
+ billing(sandboxId, input) {
1066
+ const query = new URLSearchParams();
1067
+ if (input) {
1068
+ query.set("snapshotRetentionTtlSeconds", String(input.snapshotRetentionTtlSeconds));
1069
+ query.set("snapshotRetentionClass", input.snapshotRetentionClass);
1070
+ }
1071
+ return this.request(`/${encodeURIComponent(sandboxId)}/billing${query.size ? `?${query}` : ""}`);
1065
1072
  }
1066
1073
  pricing() {
1067
1074
  return this.request("/pricing");