openpond-sdk 0.12.19 → 0.12.21

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 (64) hide show
  1. package/OPENTELEMETRY.md +85 -0
  2. package/README.md +4 -0
  3. package/TASK_INGESTION.md +135 -0
  4. package/dist/advanced-refiner-evaluations.js +2 -2
  5. package/dist/{chunk-RN5MK7NH.js → chunk-6EZAGTZG.js} +4 -4
  6. package/dist/{chunk-3MDNVNBM.js → chunk-BNBPKCIR.js} +6 -6
  7. package/dist/{chunk-EBB36D5X.js → chunk-LEVXD73U.js} +5 -3
  8. package/dist/chunk-LEVXD73U.js.map +1 -0
  9. package/dist/chunk-NZRGRUYG.js +140 -0
  10. package/dist/chunk-NZRGRUYG.js.map +1 -0
  11. package/dist/{chunk-JMXFHO2W.js → chunk-QCRNQMN4.js} +2 -2
  12. package/dist/{chunk-RT7SQHO4.js → chunk-SP7DQEQM.js} +2 -2
  13. package/dist/{chunk-UVQENVTW.js → chunk-YV6PPDXZ.js} +25 -4
  14. package/dist/chunk-YV6PPDXZ.js.map +1 -0
  15. package/dist/connected-evidence.js +3 -3
  16. package/dist/dataset-workspaces.js +125 -36
  17. package/dist/dataset-workspaces.js.map +1 -1
  18. package/dist/experiment-evaluation-schedules.js +5 -5
  19. package/dist/experiments.js +5 -5
  20. package/dist/index.js +51 -36
  21. package/dist/index.js.map +1 -1
  22. package/dist/model-starter-catalog.js +2 -2
  23. package/dist/model-starters.js +2 -2
  24. package/dist/opentelemetry.js +92 -0
  25. package/dist/opentelemetry.js.map +1 -0
  26. package/dist/taskset-drafts.js +1 -1
  27. package/dist/taskset-packages.js +13 -13
  28. package/dist/training-bundle.js +12 -12
  29. package/dist/training.js +15 -11
  30. package/dist/training.js.map +1 -1
  31. package/dist/types/packages/sdk/src/dataset-task-ingestion.d.ts +86 -0
  32. package/dist/types/packages/sdk/src/dataset-task-ingestion.d.ts.map +1 -0
  33. package/dist/types/packages/sdk/src/dataset-workspace-client.d.ts +152 -140
  34. package/dist/types/packages/sdk/src/dataset-workspace-client.d.ts.map +1 -1
  35. package/dist/types/packages/sdk/src/dataset-workspaces.d.ts +1 -0
  36. package/dist/types/packages/sdk/src/dataset-workspaces.d.ts.map +1 -1
  37. package/dist/types/packages/sdk/src/experiment-client.d.ts +77 -77
  38. package/dist/types/packages/sdk/src/experiment-evaluation-schedules.d.ts +216 -216
  39. package/dist/types/packages/sdk/src/index.d.ts +4 -0
  40. package/dist/types/packages/sdk/src/index.d.ts.map +1 -1
  41. package/dist/types/packages/sdk/src/managed-decision-executions.d.ts +339 -339
  42. package/dist/types/packages/sdk/src/model-taskset-runs.d.ts +216 -216
  43. package/dist/types/packages/sdk/src/opentelemetry.d.ts +39 -0
  44. package/dist/types/packages/sdk/src/opentelemetry.d.ts.map +1 -0
  45. package/dist/types/packages/sdk/src/taskset-draft-client.d.ts +120 -120
  46. package/dist/types/packages/sdk/src/taskset-draft-source.d.ts +20 -20
  47. package/dist/types/packages/sdk/src/training-job-contracts.d.ts +18 -0
  48. package/dist/types/packages/sdk/src/training-job-contracts.d.ts.map +1 -1
  49. package/dist/types/packages/sdk/src/training-qualification-preparation.d.ts +25 -25
  50. package/dist/types/packages/sdk/src/training-supervised.d.ts +25 -2
  51. package/dist/types/packages/sdk/src/training-supervised.d.ts.map +1 -1
  52. package/dist/types/packages/sdk/src/training.d.ts +4480 -4462
  53. package/dist/types/packages/sdk/src/training.d.ts.map +1 -1
  54. package/dist/types/packages/sdk/src/types.d.ts +2 -0
  55. package/dist/types/packages/sdk/src/types.d.ts.map +1 -1
  56. package/fixtures/python-foundation/operation-matrix.json +17 -0
  57. package/fixtures/python-foundation/schemas.json +5941 -5001
  58. package/package.json +18 -3
  59. package/dist/chunk-EBB36D5X.js.map +0 -1
  60. package/dist/chunk-UVQENVTW.js.map +0 -1
  61. /package/dist/{chunk-RN5MK7NH.js.map → chunk-6EZAGTZG.js.map} +0 -0
  62. /package/dist/{chunk-3MDNVNBM.js.map → chunk-BNBPKCIR.js.map} +0 -0
  63. /package/dist/{chunk-JMXFHO2W.js.map → chunk-QCRNQMN4.js.map} +0 -0
  64. /package/dist/{chunk-RT7SQHO4.js.map → chunk-SP7DQEQM.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/dataset-task-ingestion.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { assertBoundedTaskJson } from \"@openpond/evals/task-schema\";\nimport { readBoundedJsonResponse } from \"./protocol.js\";\n\nconst Id = z.string().trim().min(1).max(240);\nexport const DatasetTaskInputSchema = z\n .object({\n name: z.string().trim().min(1).max(300),\n input: z.record(z.string(), z.unknown()),\n expectedOutput: z.record(z.string(), z.unknown()).nullable().default(null),\n split: z.enum([\"train\", \"validation\", \"frozen_eval\"]).default(\"validation\"),\n source: z\n .object({\n kind: z.string().trim().min(1).max(100),\n eventId: Id.optional(),\n label: z.string().trim().min(1).max(300).optional(),\n occurredAt: z.iso.datetime().optional(),\n })\n .strict()\n .optional(),\n tags: z.array(Id).max(100).default([]),\n })\n .strict();\nexport const DatasetTaskAppendRequestSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.datasetTaskAppend.v1\"),\n operationId: Id,\n task: DatasetTaskInputSchema,\n })\n .strict();\nexport const DatasetTaskAppendReceiptSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.datasetTaskReceipt.v1\"),\n teamId: Id,\n datasetId: z.string().trim().min(1).max(240),\n taskId: Id,\n operationId: Id,\n receivedAt: z.iso.datetime(),\n revision: z.number().int().positive(),\n state: z.literal(\"saved\"),\n trainingUseAuthorized: z.literal(false),\n })\n .strict();\nexport type DatasetTaskInput = z.input<typeof DatasetTaskInputSchema>;\nexport type DatasetTaskAppendReceipt = z.infer<typeof DatasetTaskAppendReceiptSchema>;\nexport type AddTaskOptions = { idempotencyKey?: string; signal?: AbortSignal };\nexport type DatasetTaskClientOptions = {\n apiKey: string;\n baseUrl: string;\n teamId: string;\n fetch?: typeof fetch;\n};\n\nexport class DatasetTaskIngestionError extends Error {\n readonly outcomeUnknown: boolean;\n constructor(\n message: string,\n readonly status: number,\n readonly code: string,\n readonly operationId: string,\n ) {\n super(message);\n this.name = \"DatasetTaskIngestionError\";\n this.outcomeUnknown = status === 0 || status >= 500 || code === \"dataset_task_receipt_invalid\";\n }\n}\n\n/** A bounded append, independent of complete workspace downloads or replacement. */\nexport async function addDatasetTask(\n config: DatasetTaskClientOptions,\n datasetId: string,\n task: DatasetTaskInput,\n options: AddTaskOptions = {},\n): Promise<DatasetTaskAppendReceipt> {\n const url = new URL(config.baseUrl);\n if (\n ![\"http:\", \"https:\"].includes(url.protocol) ||\n url.username ||\n url.password ||\n url.search ||\n url.hash ||\n url.pathname !== \"/\"\n )\n throw new Error(\"A clean API origin is required.\");\n const teamId = Id.parse(config.teamId);\n if (!config.apiKey.trim()) throw new Error(\"An OpenPond API key is required.\");\n const id = z.string().trim().min(1).max(240).parse(datasetId);\n const request = DatasetTaskAppendRequestSchema.parse({\n schemaVersion: \"openpond.datasetTaskAppend.v1\",\n operationId: options.idempotencyKey ?? crypto.randomUUID(),\n task,\n });\n assertBoundedTaskJson(request, 128 * 1024);\n let response: Response;\n try {\n response = await (config.fetch ?? fetch)(\n `${url.origin}/v1/dataset-workspaces/${encodeURIComponent(id)}/tasks`,\n {\n method: \"POST\",\n redirect: \"error\",\n signal: options.signal,\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n \"X-OpenPond-Team-Id\": teamId,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(request),\n },\n );\n } catch {\n throw new DatasetTaskIngestionError(\n \"Task delivery could not be confirmed. Retry with the same operation ID.\",\n 0,\n \"dataset_task_outcome_unknown\",\n request.operationId,\n );\n }\n let raw: unknown;\n try {\n raw = await readBoundedJsonResponse(response, 64 * 1024, \"Dataset task receipt\");\n } catch {\n throw new DatasetTaskIngestionError(\n \"Task delivery returned an invalid receipt. Retain the same operation ID before retrying.\",\n response.status,\n \"dataset_task_receipt_invalid\",\n request.operationId,\n );\n }\n if (!response.ok) {\n const error = z\n .object({ message: z.string().optional(), code: z.string().optional() })\n .passthrough()\n .safeParse(raw);\n throw new DatasetTaskIngestionError(\n error.success ? (error.data.message ?? \"Task submission failed.\") : \"Task submission failed.\",\n response.status,\n error.success\n ? (error.data.code ?? \"dataset_task_request_failed\")\n : \"dataset_task_request_failed\",\n request.operationId,\n );\n }\n const parsed = DatasetTaskAppendReceiptSchema.safeParse(raw);\n if (!parsed.success)\n throw new DatasetTaskIngestionError(\n \"Task delivery returned an invalid receipt.\",\n response.status,\n \"dataset_task_receipt_invalid\",\n request.operationId,\n );\n const receipt = parsed.data;\n if (\n receipt.teamId !== teamId ||\n receipt.datasetId !== id ||\n receipt.operationId !== request.operationId\n )\n throw new DatasetTaskIngestionError(\n \"Dataset task receipt identity mismatch.\",\n response.status,\n \"dataset_task_receipt_invalid\",\n request.operationId,\n );\n return receipt;\n}\n\n/** Bind credentials and destination once; the returned addTask has no global state. */\nexport function createTaskAdder(config: DatasetTaskClientOptions & { datasetId: string }) {\n const { datasetId, ...connection } = config;\n return (task: DatasetTaskInput, options?: AddTaskOptions) =>\n addDatasetTask(connection, datasetId, task, options);\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ManagedSftRecipeSchema
3
- } from "./chunk-UVQENVTW.js";
3
+ } from "./chunk-YV6PPDXZ.js";
4
4
  import {
5
5
  ModelStarterExecutionSchema,
6
6
  validateModelStarterExecution,
@@ -443,4 +443,4 @@ export {
443
443
  previewModelStarter,
444
444
  validateResolvedModelStarter
445
445
  };
446
- //# sourceMappingURL=chunk-JMXFHO2W.js.map
446
+ //# sourceMappingURL=chunk-QCRNQMN4.js.map
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-GPQLBVQC.js";
10
10
  import {
11
11
  AuthoredTasksetFileInventorySchema
12
- } from "./chunk-3MDNVNBM.js";
12
+ } from "./chunk-BNBPKCIR.js";
13
13
  import {
14
14
  configuredTasksetDraftFiles,
15
15
  createTasksetDraftWorkspace,
@@ -698,4 +698,4 @@ export {
698
698
  prepareTasksetDraftSource,
699
699
  materializeTasksetDraftWorkspace
700
700
  };
701
- //# sourceMappingURL=chunk-RT7SQHO4.js.map
701
+ //# sourceMappingURL=chunk-SP7DQEQM.js.map
@@ -54,8 +54,8 @@ var ManagedSftRecipeSchema = SftRecipeSchema.safeExtend({
54
54
  }),
55
55
  optimizer: SftRecipeSchema.shape.optimizer.safeExtend({
56
56
  learningRate: z.number().positive().max(1e-3),
57
- epochs: z.number().positive().max(10),
58
- maxSteps: z.number().int().min(1).max(128),
57
+ epochs: z.number().positive().max(20),
58
+ maxSteps: z.number().int().min(1).max(400),
59
59
  batchSize: z.number().int().min(1).max(32),
60
60
  gradientAccumulationSteps: z.number().int().min(1).max(32),
61
61
  seed: z.number().int().min(-(2 ** 31)).max(2 ** 31 - 1)
@@ -77,9 +77,30 @@ var ManagedSftRecipeSchema = SftRecipeSchema.safeExtend({
77
77
  message: "Adapter target modules must be unique."
78
78
  });
79
79
  });
80
+ var TrainingSftImageCapabilitiesSchema = z.object({
81
+ schemaVersion: z.literal("openpond.managedSftImageSupport.v2"),
82
+ workerImageDigest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
83
+ workerSourceReleaseSha256: z.string().regex(/^[a-f0-9]{64}$/),
84
+ baseModel: SftRecipeSchema.shape.baseModel,
85
+ gpuCount: z.literal(1),
86
+ supportedRanks: z.array(z.number().int().min(1).max(64)).min(1).max(64),
87
+ maxSequenceLength: z.number().int().min(2).max(8192),
88
+ maxEpochs: z.number().positive().max(20),
89
+ maxOptimizerSteps: z.number().int().min(1).max(400),
90
+ evidenceRef: z.string().trim().min(1).max(2048),
91
+ evidenceSha256: z.string().regex(/^[a-f0-9]{64}$/)
92
+ }).strict().superRefine((value, context) => {
93
+ if (new Set(value.supportedRanks).size !== value.supportedRanks.length)
94
+ context.addIssue({ code: "custom", path: ["supportedRanks"], message: "Supported ranks must be unique." });
95
+ });
96
+ function supportsTrainingSftRecipe(image, recipe) {
97
+ return image.baseModel.id === recipe.baseModel.id && image.baseModel.revision === recipe.baseModel.revision && image.baseModel.tokenizerRevision === recipe.baseModel.tokenizerRevision && image.baseModel.chatTemplateHash === recipe.baseModel.chatTemplateHash && image.supportedRanks.includes(recipe.lora.rank) && recipe.dataset.maxSequenceLength <= image.maxSequenceLength && recipe.optimizer.epochs <= image.maxEpochs && recipe.optimizer.maxSteps <= image.maxOptimizerSteps;
98
+ }
80
99
 
81
100
  export {
82
101
  SftRecipeSchema,
83
- ManagedSftRecipeSchema
102
+ ManagedSftRecipeSchema,
103
+ TrainingSftImageCapabilitiesSchema,
104
+ supportsTrainingSftRecipe
84
105
  };
85
- //# sourceMappingURL=chunk-UVQENVTW.js.map
106
+ //# sourceMappingURL=chunk-YV6PPDXZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/training-supervised.ts"],"sourcesContent":["import { z } from \"zod\";\n\nconst Id = z.string().trim().min(1).max(240);\nconst Hash = z.string().trim().min(8).max(256);\n\n/** Shared recipe for the public API, local workbench, and managed executor.\n * Supervised training has no rollout-group, reward, or relative-loss settings.\n */\nexport const SftRecipeSchema = z.object({\n schemaVersion: z.literal(\"openpond.sftRecipe.v1\"),\n method: z.literal(\"sft\"),\n parameterization: z.literal(\"lora\"),\n baseModel: z.object({\n id: Id,\n revision: z.string().trim().min(1).max(256),\n tokenizerRevision: z.string().trim().min(1).max(256),\n chatTemplateHash: Hash,\n }),\n dataset: z.object({\n trainSplit: z.literal(\"train\"),\n validationSplit: z.enum([\"validation\", \"frozen_eval\"]),\n completionOnly: z.boolean(),\n maxSequenceLength: z.number().int().positive().max(32_768),\n maxExamples: z.number().int().positive().max(100_000).default(1_000),\n selectionStrategy: z.literal(\"stable_hash_top_n\").default(\"stable_hash_top_n\"),\n selectionSeed: z.number().int().default(17),\n }),\n lora: z.object({\n rank: z.number().int().positive().max(256),\n alpha: z.number().positive().max(1_024),\n dropout: z.number().min(0).max(1),\n targetModules: z.array(Id).min(1).max(100),\n }),\n optimizer: z.object({\n learningRate: z.number().positive(),\n epochs: z.number().positive().max(100),\n maxSteps: z.number().int().positive().max(1_000_000),\n batchSize: z.number().int().positive().max(10_000),\n gradientAccumulationSteps: z.number().int().positive().max(10_000),\n seed: z.number().int(),\n }),\n resourceLimits: z.object({\n cpuThreads: z.number().int().positive().max(256),\n memoryBytes: z.number().int().positive(),\n wallTimeMs: z.number().int().positive(),\n }),\n});\nexport type SftRecipe = z.infer<typeof SftRecipeSchema>;\n\n/** Managed authoring ceiling. An immutable worker's advertised SFT envelope\n * may be smaller and must also admit the recipe before paid execution.\n */\nexport const ManagedSftRecipeSchema = SftRecipeSchema.safeExtend({\n dataset: SftRecipeSchema.shape.dataset.safeExtend({\n completionOnly: z.literal(true),\n maxSequenceLength: z.number().int().min(2).max(8192),\n maxExamples: z.number().int().min(1).max(1000).default(1000),\n }),\n lora: SftRecipeSchema.shape.lora.safeExtend({\n rank: z.number().int().min(1).max(64),\n dropout: z.number().min(0).lt(1),\n targetModules: z\n .array(z.enum([\"q_proj\", \"k_proj\", \"v_proj\", \"o_proj\", \"gate_proj\", \"up_proj\", \"down_proj\"]))\n .min(1)\n .max(7),\n }),\n optimizer: SftRecipeSchema.shape.optimizer.safeExtend({\n learningRate: z.number().positive().max(0.001),\n epochs: z.number().positive().max(20),\n maxSteps: z.number().int().min(1).max(400),\n batchSize: z.number().int().min(1).max(32),\n gradientAccumulationSteps: z.number().int().min(1).max(32),\n seed: z\n .number()\n .int()\n .min(-(2 ** 31))\n .max(2 ** 31 - 1),\n }),\n resourceLimits: SftRecipeSchema.shape.resourceLimits.safeExtend({\n wallTimeMs: z.number().int().min(1000).max(21_600_000),\n }),\n}).superRefine((recipe, context) => {\n if (recipe.optimizer.batchSize * recipe.optimizer.gradientAccumulationSteps > 32)\n context.addIssue({\n code: \"custom\",\n path: [\"optimizer\"],\n message: \"Managed SFT supports at most 32 accumulated examples.\",\n });\n if (new Set(recipe.lora.targetModules).size !== recipe.lora.targetModules.length)\n context.addIssue({\n code: \"custom\",\n path: [\"lora\", \"targetModules\"],\n message: \"Adapter target modules must be unique.\",\n });\n});\n\n/** Image-specific support, rather than the broad managed authoring ceiling.\n * Receipt identity belongs to the server's reviewed immutable-image registry.\n */\nexport const TrainingSftImageCapabilitiesSchema = z.object({\n schemaVersion: z.literal(\"openpond.managedSftImageSupport.v2\"),\n workerImageDigest: z.string().regex(/^sha256:[a-f0-9]{64}$/),\n workerSourceReleaseSha256: z.string().regex(/^[a-f0-9]{64}$/),\n baseModel: SftRecipeSchema.shape.baseModel,\n gpuCount: z.literal(1),\n supportedRanks: z.array(z.number().int().min(1).max(64)).min(1).max(64),\n maxSequenceLength: z.number().int().min(2).max(8192),\n maxEpochs: z.number().positive().max(20),\n maxOptimizerSteps: z.number().int().min(1).max(400),\n evidenceRef: z.string().trim().min(1).max(2048),\n evidenceSha256: z.string().regex(/^[a-f0-9]{64}$/),\n}).strict().superRefine((value, context) => {\n if (new Set(value.supportedRanks).size !== value.supportedRanks.length)\n context.addIssue({code: \"custom\", path: [\"supportedRanks\"], message: \"Supported ranks must be unique.\"});\n});\nexport type TrainingSftImageCapabilities = z.infer<typeof TrainingSftImageCapabilitiesSchema>;\n\nexport function supportsTrainingSftRecipe(\n image: TrainingSftImageCapabilities,\n recipe: SftRecipe,\n): boolean {\n return image.baseModel.id === recipe.baseModel.id &&\n image.baseModel.revision === recipe.baseModel.revision &&\n image.baseModel.tokenizerRevision === recipe.baseModel.tokenizerRevision &&\n image.baseModel.chatTemplateHash === recipe.baseModel.chatTemplateHash &&\n image.supportedRanks.includes(recipe.lora.rank) &&\n recipe.dataset.maxSequenceLength <= image.maxSequenceLength &&\n recipe.optimizer.epochs <= image.maxEpochs &&\n recipe.optimizer.maxSteps <= image.maxOptimizerSteps;\n}\n"],"mappings":"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","names":[]}
@@ -49,15 +49,15 @@ import {
49
49
  ConnectedStartingAssetsRequestSchema,
50
50
  verifyConnectedStartingAssetsReceipt
51
51
  } from "./chunk-AG6UJ3DI.js";
52
- import "./chunk-3MDNVNBM.js";
53
- import "./chunk-GWXJSBWR.js";
52
+ import "./chunk-BNBPKCIR.js";
54
53
  import "./chunk-Q4RGCEOI.js";
54
+ import "./chunk-GWXJSBWR.js";
55
55
  import "./chunk-GCUWJUUM.js";
56
56
  import {
57
57
  ConnectedDatasetSourceRefSchema
58
58
  } from "./chunk-ZQ6QTYRE.js";
59
- import "./chunk-Z252BNAZ.js";
60
59
  import "./chunk-TK3DXH7A.js";
60
+ import "./chunk-Z252BNAZ.js";
61
61
  import "./chunk-H3367ISL.js";
62
62
  import "./chunk-O6FKHAWN.js";
63
63
  import "./chunk-QTNYXOJW.js";
@@ -1,6 +1,14 @@
1
1
  import {
2
2
  TaskDesignProposalSchema
3
3
  } from "./chunk-QIGMNB6M.js";
4
+ import {
5
+ DatasetTaskAppendReceiptSchema,
6
+ DatasetTaskAppendRequestSchema,
7
+ DatasetTaskIngestionError,
8
+ DatasetTaskInputSchema,
9
+ addDatasetTask,
10
+ createTaskAdder
11
+ } from "./chunk-NZRGRUYG.js";
4
12
  import {
5
13
  ConnectedCaseRefSchema,
6
14
  ConnectedStartingAssetSchema,
@@ -15,8 +23,7 @@ import {
15
23
  } from "./chunk-AG6UJ3DI.js";
16
24
  import {
17
25
  compileTasksetDraftWorkspace
18
- } from "./chunk-3MDNVNBM.js";
19
- import "./chunk-GWXJSBWR.js";
26
+ } from "./chunk-BNBPKCIR.js";
20
27
  import {
21
28
  createTasksetDraftFile,
22
29
  createTasksetDraftWorkspace,
@@ -24,6 +31,7 @@ import {
24
31
  decodeTasksetDraftWorkspaceFile,
25
32
  validateTasksetDraftWorkspace
26
33
  } from "./chunk-Q4RGCEOI.js";
34
+ import "./chunk-GWXJSBWR.js";
27
35
  import {
28
36
  TasksetDraftSchema,
29
37
  createTasksetDraft
@@ -34,10 +42,10 @@ import {
34
42
  TasksetEnvironmentContractSchema,
35
43
  TasksetSourceRefSchema
36
44
  } from "./chunk-ZQ6QTYRE.js";
45
+ import "./chunk-TK3DXH7A.js";
37
46
  import {
38
47
  TasksetCatalogReleaseRefSchema
39
48
  } from "./chunk-Z252BNAZ.js";
40
- import "./chunk-TK3DXH7A.js";
41
49
  import "./chunk-H3367ISL.js";
42
50
  import "./chunk-QTNYXOJW.js";
43
51
  import {
@@ -754,89 +762,163 @@ var OpenPondDatasetWorkspaceClient = class {
754
762
  constructor(options) {
755
763
  this.options = options;
756
764
  const url = new URL(options.baseUrl);
757
- if (!["http:", "https:"].includes(url.protocol) || url.username || url.password || url.search || url.hash || !options.apiKey.trim() || !options.teamId.trim()) throw new Error("A clean API origin and workspace credentials are required.");
765
+ if (!["http:", "https:"].includes(url.protocol) || url.username || url.password || url.search || url.hash || !options.apiKey.trim() || !options.teamId.trim())
766
+ throw new Error("A clean API origin and workspace credentials are required.");
758
767
  this.baseUrl = url.toString().replace(/\/+$/, "");
759
768
  this.preparations = new OpenPondDatasetPreparationClient(options);
760
769
  }
761
770
  options;
762
771
  baseUrl;
763
772
  preparations;
773
+ async addTask(id, task, options) {
774
+ return addDatasetTask(this.options, id, task, options);
775
+ }
764
776
  async list(options = {}) {
765
777
  const { signal, ...input } = options;
766
778
  const query = DatasetWorkspaceListQuerySchema.parse(input);
767
- const params = new URLSearchParams(Object.entries(query).filter(([, value]) => value !== void 0).map(([key, value]) => [key, String(value)]));
768
- const result = DatasetWorkspaceListSchema.parse(await this.request(`?${params}`, "GET", void 0, signal));
769
- if (result.teamId !== this.options.teamId || result.datasets.length > query.limit || new Set(result.datasets.map((item) => item.id)).size !== result.datasets.length) throw new Error("Dataset list workspace/page mismatch.");
779
+ const params = new URLSearchParams(
780
+ Object.entries(query).filter(([, value]) => value !== void 0).map(([key, value]) => [key, String(value)])
781
+ );
782
+ const result = DatasetWorkspaceListSchema.parse(
783
+ await this.request(`?${params}`, "GET", void 0, signal)
784
+ );
785
+ if (result.teamId !== this.options.teamId || result.datasets.length > query.limit || new Set(result.datasets.map((item) => item.id)).size !== result.datasets.length)
786
+ throw new Error("Dataset list workspace/page mismatch.");
770
787
  return result;
771
788
  }
772
789
  async get(id, signal) {
773
- return this.readback(await this.request(`/${encodeURIComponent(id)}`, "GET", void 0, signal), id);
790
+ return this.readback(
791
+ await this.request(`/${encodeURIComponent(id)}`, "GET", void 0, signal),
792
+ id
793
+ );
774
794
  }
775
795
  /** Recover only this actor's retained operation; base bytes allow adapters to
776
796
  * reconstruct and verify the identical original CAS request before replay. */
777
797
  async operationResult(operationId, options) {
778
798
  const kind = DatasetWorkspaceOperationKindSchema.parse(options.kind);
779
- const params = new URLSearchParams({ kind, ...options.datasetId ? { datasetId: options.datasetId } : {} });
780
- const raw = await this.request(`/operations/${encodeURIComponent(operationId)}?${params}`, "GET", void 0, options.signal, 132 * 1024 * 1024);
799
+ const params = new URLSearchParams({
800
+ kind,
801
+ ...options.datasetId ? { datasetId: options.datasetId } : {}
802
+ });
803
+ const raw = await this.request(
804
+ `/operations/${encodeURIComponent(operationId)}?${params}`,
805
+ "GET",
806
+ void 0,
807
+ options.signal,
808
+ 132 * 1024 * 1024
809
+ );
781
810
  if (raw === null) return null;
782
811
  const value = DatasetWorkspaceOperationResultSchema.parse(raw);
783
812
  this.readback(value.receipt, value.receipt.datasetId);
784
813
  if (value.base) this.readback(value.base, value.receipt.datasetId);
785
- if (value.operationId !== operationId || value.kind !== kind || options.datasetId && value.receipt.datasetId !== options.datasetId || options.requestHash && value.requestHash !== options.requestHash) throw new Error("Dataset operation recovery identity/request mismatch.");
814
+ if (value.operationId !== operationId || value.kind !== kind || options.datasetId && value.receipt.datasetId !== options.datasetId || options.requestHash && value.requestHash !== options.requestHash)
815
+ throw new Error("Dataset operation recovery identity/request mismatch.");
786
816
  return value;
787
817
  }
788
818
  async beginVersion(id, input, signal) {
789
819
  const request = DatasetWorkspaceBeginVersionSchema.parse(input);
790
- const result = this.readback(await this.request(`/${encodeURIComponent(id)}/begin-version`, "POST", request, signal), id);
791
- if (result.revision !== request.expectedRevision + 1 || result.workspace.draft.status !== "draft" || !result.publication || !result.workspace.draft.publishedTasksetRef) throw new Error("Editable version receipt mismatch.");
820
+ const result = this.readback(
821
+ await this.request(`/${encodeURIComponent(id)}/begin-version`, "POST", request, signal),
822
+ id
823
+ );
824
+ if (result.revision !== request.expectedRevision + 1 || result.workspace.draft.status !== "draft" || !result.publication || !result.workspace.draft.publishedTasksetRef)
825
+ throw new Error("Editable version receipt mismatch.");
792
826
  return result;
793
827
  }
794
828
  async versions(id, options = {}) {
795
- const query = new URLSearchParams(options.beforeRevision === void 0 ? {} : { beforeRevision: String(options.beforeRevision) });
796
- const result = DatasetWorkspaceVersionsSchema.parse(await this.request(`/${encodeURIComponent(id)}/versions?${query}`, "GET", void 0, options.signal));
797
- if (result.teamId !== this.options.teamId || result.datasetId !== id || result.items.some((item, index) => index > 0 && item.workspaceRevision >= result.items[index - 1].workspaceRevision || options.beforeRevision !== void 0 && item.workspaceRevision >= options.beforeRevision)) throw new Error("Dataset version history scope/order mismatch.");
829
+ const query = new URLSearchParams(
830
+ options.beforeRevision === void 0 ? {} : { beforeRevision: String(options.beforeRevision) }
831
+ );
832
+ const result = DatasetWorkspaceVersionsSchema.parse(
833
+ await this.request(
834
+ `/${encodeURIComponent(id)}/versions?${query}`,
835
+ "GET",
836
+ void 0,
837
+ options.signal
838
+ )
839
+ );
840
+ if (result.teamId !== this.options.teamId || result.datasetId !== id || result.items.some(
841
+ (item, index) => index > 0 && item.workspaceRevision >= result.items[index - 1].workspaceRevision || options.beforeRevision !== void 0 && item.workspaceRevision >= options.beforeRevision
842
+ ))
843
+ throw new Error("Dataset version history scope/order mismatch.");
798
844
  return result;
799
845
  }
800
846
  async version(id, workspaceRevision, signal) {
801
- const result = this.readback(await this.request(`/${encodeURIComponent(id)}/versions/${workspaceRevision}`, "GET", void 0, signal), id);
802
- if (result.revision !== workspaceRevision || result.workspace.draft.status !== "published") throw new Error("Dataset immutable version mismatch.");
847
+ const result = this.readback(
848
+ await this.request(
849
+ `/${encodeURIComponent(id)}/versions/${workspaceRevision}`,
850
+ "GET",
851
+ void 0,
852
+ signal
853
+ ),
854
+ id
855
+ );
856
+ if (result.revision !== workspaceRevision || result.workspace.draft.status !== "published")
857
+ throw new Error("Dataset immutable version mismatch.");
803
858
  return result;
804
859
  }
805
860
  async save(input, signal) {
806
861
  const request = DatasetWorkspaceWriteSchema.parse(input);
807
862
  const workspace = validateTasksetDraftWorkspace(request.workspace);
808
- if (workspace.draft.profileId !== this.options.teamId || workspace.draft.revision !== request.expectedRevision + 1) throw new Error("Dataset write scope or revision mismatch.");
809
- const result = this.readback(await this.request(`/${encodeURIComponent(workspace.draft.id)}`, "PUT", request, signal), workspace.draft.id);
810
- if (request.originProjectId && result.originProjectId !== request.originProjectId) throw new Error("Dataset origin Project mismatch.");
811
- if (request.ownerScope && result.ownerScope !== request.ownerScope) throw new Error("Dataset owner scope mismatch.");
812
- if (result.workspace.contentHash !== workspace.contentHash) throw new Error("Dataset write receipt differs from the saved bytes.");
863
+ if (workspace.draft.profileId !== this.options.teamId || workspace.draft.revision !== request.expectedRevision + 1)
864
+ throw new Error("Dataset write scope or revision mismatch.");
865
+ const result = this.readback(
866
+ await this.request(`/${encodeURIComponent(workspace.draft.id)}`, "PUT", request, signal),
867
+ workspace.draft.id
868
+ );
869
+ if (request.originProjectId && result.originProjectId !== request.originProjectId)
870
+ throw new Error("Dataset origin Project mismatch.");
871
+ if (request.ownerScope && result.ownerScope !== request.ownerScope)
872
+ throw new Error("Dataset owner scope mismatch.");
873
+ if (result.workspace.contentHash !== workspace.contentHash)
874
+ throw new Error("Dataset write receipt differs from the saved bytes.");
813
875
  return result;
814
876
  }
815
877
  async validate(id, expectedRevision, signal) {
816
- const result = DatasetWorkspaceValidationSchema.parse(await this.request(`/${encodeURIComponent(id)}/validate`, "POST", { expectedRevision }, signal));
817
- if (result.teamId !== this.options.teamId || result.datasetId !== id || result.revision !== expectedRevision) throw new Error("Dataset validation receipt mismatch.");
878
+ const result = DatasetWorkspaceValidationSchema.parse(
879
+ await this.request(
880
+ `/${encodeURIComponent(id)}/validate`,
881
+ "POST",
882
+ { expectedRevision },
883
+ signal
884
+ )
885
+ );
886
+ if (result.teamId !== this.options.teamId || result.datasetId !== id || result.revision !== expectedRevision)
887
+ throw new Error("Dataset validation receipt mismatch.");
818
888
  return result;
819
889
  }
820
890
  async publish(id, input, signal) {
821
891
  const request = DatasetWorkspacePublishSchema.parse(input);
822
- const result = this.readback(await this.request(`/${encodeURIComponent(id)}/publish`, "POST", request, signal), id);
823
- if (result.revision !== request.expectedRevision + 1 || result.workspace.draft.status !== "published" || result.publication?.packageHash !== request.packageHash) throw new Error("Dataset publication receipt mismatch.");
892
+ const result = this.readback(
893
+ await this.request(`/${encodeURIComponent(id)}/publish`, "POST", request, signal),
894
+ id
895
+ );
896
+ if (result.revision !== request.expectedRevision + 1 || result.workspace.draft.status !== "published" || result.publication?.packageHash !== request.packageHash)
897
+ throw new Error("Dataset publication receipt mismatch.");
824
898
  return result;
825
899
  }
826
900
  readback(value, id) {
827
901
  const result = DatasetWorkspaceReceiptSchema.parse(value);
828
902
  validateTasksetDraftWorkspace(result.workspace);
829
- if (result.datasetId !== id || result.teamId !== this.options.teamId) throw new Error("Dataset identity mismatch.");
903
+ if (result.datasetId !== id || result.teamId !== this.options.teamId)
904
+ throw new Error("Dataset identity mismatch.");
830
905
  return result;
831
906
  }
832
907
  async request(path, method, body, signal, maxResponseBytes) {
833
- const response = await (this.options.fetch ?? fetch)(`${this.baseUrl}/v1/dataset-workspaces${path}`, {
834
- method,
835
- signal,
836
- redirect: "error",
837
- headers: { Authorization: `Bearer ${this.options.apiKey}`, "X-OpenPond-Team-Id": this.options.teamId, "Content-Type": "application/json" },
838
- ...body === void 0 ? {} : { body: JSON.stringify(body) }
839
- });
908
+ const response = await (this.options.fetch ?? fetch)(
909
+ `${this.baseUrl}/v1/dataset-workspaces${path}`,
910
+ {
911
+ method,
912
+ signal,
913
+ redirect: "error",
914
+ headers: {
915
+ Authorization: `Bearer ${this.options.apiKey}`,
916
+ "X-OpenPond-Team-Id": this.options.teamId,
917
+ "Content-Type": "application/json"
918
+ },
919
+ ...body === void 0 ? {} : { body: JSON.stringify(body) }
920
+ }
921
+ );
840
922
  if (!response.ok) throw new Error(`Dataset request failed (${response.status}).`);
841
923
  if (maxResponseBytes !== void 0) {
842
924
  if (!response.body) throw new Error("Dataset response is empty.");
@@ -847,7 +929,8 @@ var OpenPondDatasetWorkspaceClient = class {
847
929
  const part = await reader.read();
848
930
  if (part.done) break;
849
931
  length += part.value.byteLength;
850
- if (length > maxResponseBytes) throw new Error("Dataset recovery exceeds its bounded response.");
932
+ if (length > maxResponseBytes)
933
+ throw new Error("Dataset recovery exceeds its bounded response.");
851
934
  chunks.push(part.value);
852
935
  }
853
936
  } finally {
@@ -1360,6 +1443,10 @@ export {
1360
1443
  DatasetPreparationStageSchema,
1361
1444
  DatasetPreparationStatusSchema,
1362
1445
  DatasetPreparationTaskClassSchema,
1446
+ DatasetTaskAppendReceiptSchema,
1447
+ DatasetTaskAppendRequestSchema,
1448
+ DatasetTaskIngestionError,
1449
+ DatasetTaskInputSchema,
1363
1450
  DatasetWorkspaceBeginVersionSchema,
1364
1451
  DatasetWorkspaceListQuerySchema,
1365
1452
  DatasetWorkspaceListSchema,
@@ -1381,10 +1468,12 @@ export {
1381
1468
  PreparedTaskProvenanceSchema,
1382
1469
  PreparedTaskQualificationSchema,
1383
1470
  PreparedWitnessAdjudicationSchema,
1471
+ addDatasetTask,
1384
1472
  assemblePreparedTaskWorkspaces,
1385
1473
  compileTasksetDraftWorkspace,
1386
1474
  connectedStartingAssetReference,
1387
1475
  createPreparedTaskAuthoringWorkspace,
1476
+ createTaskAdder,
1388
1477
  parseConnectedStartingAssetReference,
1389
1478
  preparedRepositoryEnvironment,
1390
1479
  reconcilePreparationSourceCoverage