openpond-sdk 0.3.3 → 0.4.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 (124) hide show
  1. package/TASKSETS.md +55 -0
  2. package/dist/actions-local.js +67 -118
  3. package/dist/actions-local.js.map +4 -4
  4. package/dist/actions.js +4 -92
  5. package/dist/actions.js.map +4 -4
  6. package/dist/chunk-27ETSPHQ.js +83 -0
  7. package/dist/chunk-27ETSPHQ.js.map +7 -0
  8. package/dist/chunk-5PRP457R.js +477 -0
  9. package/dist/chunk-5PRP457R.js.map +7 -0
  10. package/dist/chunk-65D4C7HP.js +273 -0
  11. package/dist/chunk-65D4C7HP.js.map +7 -0
  12. package/dist/chunk-747CMU2Y.js +222 -0
  13. package/dist/chunk-747CMU2Y.js.map +7 -0
  14. package/dist/chunk-7O5X7DBU.js +80 -0
  15. package/dist/chunk-7O5X7DBU.js.map +7 -0
  16. package/dist/chunk-A4ZDOZKP.js +115 -0
  17. package/dist/chunk-A4ZDOZKP.js.map +7 -0
  18. package/dist/chunk-APHPXQEA.js +155 -0
  19. package/dist/chunk-APHPXQEA.js.map +7 -0
  20. package/dist/chunk-AVW35YOH.js +574 -0
  21. package/dist/chunk-AVW35YOH.js.map +7 -0
  22. package/dist/chunk-AZUCY3E5.js +2395 -0
  23. package/dist/chunk-AZUCY3E5.js.map +7 -0
  24. package/dist/chunk-IVEXCIHO.js +1373 -0
  25. package/dist/chunk-IVEXCIHO.js.map +7 -0
  26. package/dist/chunk-K5ZCYOZO.js +49 -0
  27. package/dist/chunk-K5ZCYOZO.js.map +7 -0
  28. package/dist/chunk-LLHE4BOD.js +220 -0
  29. package/dist/chunk-LLHE4BOD.js.map +7 -0
  30. package/dist/chunk-LXXQVGQY.js +1 -0
  31. package/dist/chunk-LXXQVGQY.js.map +7 -0
  32. package/dist/chunk-P27DQ65Z.js +138 -0
  33. package/dist/chunk-P27DQ65Z.js.map +7 -0
  34. package/dist/chunk-QLEJOCQX.js +72 -0
  35. package/dist/chunk-QLEJOCQX.js.map +7 -0
  36. package/dist/chunk-S7I45WJQ.js +57 -0
  37. package/dist/chunk-S7I45WJQ.js.map +7 -0
  38. package/dist/chunk-ZPCK222K.js +586 -0
  39. package/dist/chunk-ZPCK222K.js.map +7 -0
  40. package/dist/index.js +33 -2488
  41. package/dist/index.js.map +4 -4
  42. package/dist/learning.js +16 -2042
  43. package/dist/learning.js.map +4 -4
  44. package/dist/model-batch-review.js +5 -42
  45. package/dist/model-batch-review.js.map +3 -3
  46. package/dist/model-projects.js +29 -430
  47. package/dist/model-projects.js.map +3 -3
  48. package/dist/model-starter-attempts.js +53 -310
  49. package/dist/model-starter-attempts.js.map +4 -4
  50. package/dist/model-starter-catalog.js +17 -460
  51. package/dist/model-starter-catalog.js.map +4 -4
  52. package/dist/model-starters.js +32 -709
  53. package/dist/model-starters.js.map +4 -4
  54. package/dist/model-taskset-authoring.js +11 -44
  55. package/dist/model-taskset-authoring.js.map +3 -3
  56. package/dist/profile-actions.js +4 -211
  57. package/dist/profile-actions.js.map +3 -3
  58. package/dist/project-actions.js +4 -224
  59. package/dist/project-actions.js.map +3 -3
  60. package/dist/refiner.js +14 -554
  61. package/dist/refiner.js.map +4 -4
  62. package/dist/taskset-catalog.js +9 -104
  63. package/dist/taskset-catalog.js.map +3 -3
  64. package/dist/taskset-drafts.js +465 -0
  65. package/dist/taskset-drafts.js.map +7 -0
  66. package/dist/taskset-packages.js +946 -3089
  67. package/dist/taskset-packages.js.map +4 -4
  68. package/dist/training.js +43 -822
  69. package/dist/training.js.map +4 -4
  70. package/dist/types/packages/sdk/src/index.d.ts +3 -3
  71. package/dist/types/packages/sdk/src/index.d.ts.map +1 -1
  72. package/dist/types/packages/sdk/src/learning-client.d.ts +130 -0
  73. package/dist/types/packages/sdk/src/learning-client.d.ts.map +1 -0
  74. package/dist/types/packages/sdk/src/learning.d.ts +1 -129
  75. package/dist/types/packages/sdk/src/learning.d.ts.map +1 -1
  76. package/dist/types/packages/sdk/src/taskset-authored-contracts.d.ts +1170 -0
  77. package/dist/types/packages/sdk/src/taskset-authored-contracts.d.ts.map +1 -0
  78. package/dist/types/packages/sdk/src/taskset-authored-files.d.ts +560 -0
  79. package/dist/types/packages/sdk/src/taskset-authored-files.d.ts.map +1 -0
  80. package/dist/types/packages/sdk/src/taskset-authored-portable-release.d.ts +92 -0
  81. package/dist/types/packages/sdk/src/taskset-authored-portable-release.d.ts.map +1 -0
  82. package/dist/types/packages/sdk/src/taskset-authored-tool-environment.d.ts +15 -0
  83. package/dist/types/packages/sdk/src/taskset-authored-tool-environment.d.ts.map +1 -0
  84. package/dist/types/packages/sdk/src/taskset-authored-validation.d.ts +18 -0
  85. package/dist/types/packages/sdk/src/taskset-authored-validation.d.ts.map +1 -0
  86. package/dist/types/packages/sdk/src/taskset-draft-api-contracts.d.ts +1681 -0
  87. package/dist/types/packages/sdk/src/taskset-draft-api-contracts.d.ts.map +1 -0
  88. package/dist/types/packages/sdk/src/taskset-draft-authoring.d.ts +19 -0
  89. package/dist/types/packages/sdk/src/taskset-draft-authoring.d.ts.map +1 -0
  90. package/dist/types/packages/sdk/src/taskset-draft-client.d.ts +2713 -0
  91. package/dist/types/packages/sdk/src/taskset-draft-client.d.ts.map +1 -0
  92. package/dist/types/packages/sdk/src/taskset-draft-core.d.ts +1000 -0
  93. package/dist/types/packages/sdk/src/taskset-draft-core.d.ts.map +1 -0
  94. package/dist/types/packages/sdk/src/taskset-draft-dataset-artifacts.d.ts +429 -0
  95. package/dist/types/packages/sdk/src/taskset-draft-dataset-artifacts.d.ts.map +1 -0
  96. package/dist/types/packages/sdk/src/taskset-draft-dataset-sources.d.ts +284 -0
  97. package/dist/types/packages/sdk/src/taskset-draft-dataset-sources.d.ts.map +1 -0
  98. package/dist/types/packages/sdk/src/taskset-draft-document.d.ts +846 -0
  99. package/dist/types/packages/sdk/src/taskset-draft-document.d.ts.map +1 -0
  100. package/dist/types/packages/sdk/src/taskset-draft-files.d.ts +8 -0
  101. package/dist/types/packages/sdk/src/taskset-draft-files.d.ts.map +1 -0
  102. package/dist/types/packages/sdk/src/taskset-draft-harness-actions.d.ts +28 -0
  103. package/dist/types/packages/sdk/src/taskset-draft-harness-actions.d.ts.map +1 -0
  104. package/dist/types/packages/sdk/src/taskset-draft-manifests.d.ts +8 -0
  105. package/dist/types/packages/sdk/src/taskset-draft-manifests.d.ts.map +1 -0
  106. package/dist/types/packages/sdk/src/taskset-draft-package-compiler.d.ts +967 -0
  107. package/dist/types/packages/sdk/src/taskset-draft-package-compiler.d.ts.map +1 -0
  108. package/dist/types/packages/sdk/src/taskset-draft-publication.d.ts +10 -0
  109. package/dist/types/packages/sdk/src/taskset-draft-publication.d.ts.map +1 -0
  110. package/dist/types/packages/sdk/src/taskset-draft-source.d.ts +1297 -0
  111. package/dist/types/packages/sdk/src/taskset-draft-source.d.ts.map +1 -0
  112. package/dist/types/packages/sdk/src/taskset-draft-workspace.d.ts +1597 -0
  113. package/dist/types/packages/sdk/src/taskset-draft-workspace.d.ts.map +1 -0
  114. package/dist/types/packages/sdk/src/taskset-drafts.d.ts +16 -0
  115. package/dist/types/packages/sdk/src/taskset-drafts.d.ts.map +1 -0
  116. package/dist/types/packages/sdk/src/taskset-package-grader-projection.d.ts +64 -0
  117. package/dist/types/packages/sdk/src/taskset-package-grader-projection.d.ts.map +1 -0
  118. package/dist/types/packages/sdk/src/taskset-package-projection.d.ts +1514 -0
  119. package/dist/types/packages/sdk/src/taskset-package-projection.d.ts.map +1 -0
  120. package/dist/types/packages/sdk/src/taskset-packages.d.ts +6 -0
  121. package/dist/types/packages/sdk/src/taskset-packages.d.ts.map +1 -1
  122. package/dist/workflows.js +4 -221
  123. package/dist/workflows.js.map +3 -3
  124. package/package.json +5 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/model-starters.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\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, ModelProjectTrainingMethodSchema, ModelProjectVersionedRefSchema } 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 { ModelTasksetDerivationSchema, ModelTasksetPackageSchema, deriveModelTaskset, validateModelTasksetPackage, type ModelTasksetPackage } from \"./model-taskset-derivation.js\";\nexport { ModelTasksetExecutionResourcesSchema, createModelTasksetExecutionResourcesAsset, modelTasksetExecutionResourcesAssetId, resolveModelTasksetExecutionResourcesAsset } from \"./model-taskset-resources.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}).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"],
5
+ "mappings": ";;;;;;;;;;;;AAAA,SAAS,SAAS;AAClB,SAAS,sBAAsB,4BAA4B;AAC3D,SAAS,yBAAyB,sBAAsB,aAAa,iBAAiB,2BAA2B;AACjH,SAAS,qBAAqB,qBAAqB,2BAA2B;AAC9E,SAAS,uBAAuB,yBAAyB;AAUzD,IAAM,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AACjD,IAAM,YAAY;AAGX,IAAM,4BAA4B,EAAE,OAAO;AAAA,EAChD,eAAe,EAAE,QAAQ,0BAA0B;AAAA,EACnD,IAAI;AAAA,EACJ,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACpC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACtC,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAK;AAAA,EAC/C,UAAU,EAAE,KAAK,CAAC,cAAc,WAAW,cAAc,aAAa,UAAU,WAAW,gBAAgB,CAAC;AAAA,EAC5G,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,SAAS,EAAE,MAAM,SAAS,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAC1C,QAAQ,EAAE,MAAM,SAAS,EAAE,IAAI,GAAK;AAAA,EACpC,gBAAgB,EAAE,MAAM,QAAQ,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EAC9C,eAAe;AAAA,EACf,kBAAkB,EAAE,MAAM,gCAAgC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACxE,eAAe;AAAA,EACf,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,GAAG,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,GAAG,mBAAmB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAK,EAAE,CAAC,EAAE,OAAO;AAAA;AAAA;AAAA,EAG1J,UAAU,EAAE,OAAO,EAAE,kBAAkB,UAAU,SAAS,GAAG,UAAU,UAAU,SAAS,GAAG,UAAU,UAAU,SAAS,GAAG,YAAY,UAAU,SAAS,EAAE,CAAC,EAAE,OAAO;AAC1K,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,SAAS,YAAY;AAC5C,MAAI,CAAC,QAAQ,iBAAiB,SAAS,QAAQ,aAAa,EAAG,SAAQ,SAAS,EAAE,MAAM,UAAU,MAAM,CAAC,eAAe,GAAG,SAAS,uDAAuD,CAAC;AAC5L,aAAW,SAAS,CAAC,WAAW,QAAQ,GAAY;AAClD,QAAI,IAAI,IAAI,QAAQ,KAAK,EAAE,IAAI,SAAO,IAAI,EAAE,CAAC,EAAE,SAAS,QAAQ,KAAK,EAAE,OAAQ,SAAQ,SAAS,EAAE,MAAM,UAAU,MAAM,CAAC,KAAK,GAAG,SAAS,wCAAwC,CAAC;AAAA,EACrL;AACA,MAAI,IAAI,IAAI,QAAQ,cAAc,EAAE,SAAS,QAAQ,eAAe,OAAQ,SAAQ,SAAS,EAAE,MAAM,UAAU,MAAM,CAAC,gBAAgB,GAAG,SAAS,gCAAgC,CAAC;AACrL,CAAC;AACM,IAAM,qBAAqB,0BAA0B,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,gBAAgB,EAAE,CAAC;AAKnH,IAAM,6BAA6B,EAAE,OAAO;AAAA,EACjD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,SAAS,EAAE,MAAM,mBAAmB,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACpD,QAAQ,EAAE,MAAM,uBAAuB,EAAE,IAAI,GAAK;AAAA,EAClD,WAAW,4BAA4B,SAAS;AAClD,CAAC,EAAE,OAAO;AAKH,IAAM,kCAAkC,EAAE,OAAO;AAAA,EACtD,eAAe,EAAE,QAAQ,uCAAuC;AAAA,EAChE,aAAa,EAAE,QAAQ,gBAAgB;AAAA,EACvC,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAAG,YAAY,EAAE,IAAI,SAAS;AAAA,EAC1E,qBAAqB,EAAE,OAAO,EAAE,MAAM,gBAAgB;AAAA,EACtD,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAK;AAC1C,CAAC,EAAE,OAAO;AACH,SAAS,+BAA+B,OAAqC;AAClF,QAAM,EAAE,aAAa,cAAc,GAAG,QAAQ,IAAI,MAAM;AACxD,QAAM,EAAE,aAAa,cAAc,GAAG,QAAQ,IAAI,MAAM;AACxD,QAAM,EAAE,aAAa,gBAAgB,GAAG,WAAW,IAAI,QAAQ;AAC/D,QAAM,WAAW,EAAE,GAAG,QAAQ,SAAS;AACvC,QAAM,YAAY,SAAS;AAC3B,MAAI,aAAa,OAAO,cAAc,YAAY,CAAC,MAAM,QAAQ,SAAS,GAAG;AAC3E,UAAM,EAAE,eAAe,SAAS,GAAG,QAAQ,IAAI;AAC/C,aAAS,mBAAmB;AAAA,EAC9B;AAEA,SAAO,oBAAoB,EAAE,GAAG,OAAO,SAAS,EAAE,GAAG,SAAS,SAAS,WAAW,GAAG,SAAS,EAAE,GAAG,SAAS,SAAS,EAAE,CAAC,EAAE;AAC5H;AAIO,IAAM,mCAAmC,EAAE,OAAO;AAAA,EACvD,WAAW;AAAA,EACX,SAAS;AAAA,EACT,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACtC,SAAS;AAAA,EACT,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,kBAAkB,UAAU,SAAS,EAAE,SAAS;AAClD,CAAC,EAAE,OAAO;AACH,IAAM,oCAAoC,iCAAiC,OAAO;AAAA,EACvF,eAAe,EAAE,QAAQ,kCAAkC;AAAA,EAC3D,aAAa;AACf,CAAC,EAAE,OAAO;AAGH,SAAS,iCAAiC,OAA6C;AAC5F,wBAAsB,OAAO,KAAK,IAAI;AACtC,SAAO,kCAAkC,MAAM,KAAK;AACtD;AAKA,eAAsB,kCACpB,OACsC;AACtC,wBAAsB,OAAO,KAAK,IAAI;AACtC,QAAM,SAAS,iCAAiC,MAAM,KAAK;AAC3D,SAAO,iCAAiC;AAAA,IACtC,GAAG;AAAA,IACH,eAAe;AAAA,IACf,aAAa,iBAAiB,MAAM,gBAAgB,MAAM,CAAC;AAAA,EAC7D,CAAC;AACH;AAIO,SAAS,6BAA6B,OAAgB,cAAuB;AAClF,QAAM,UAAU,iCAAiC,KAAK;AACtD,QAAM,WAAW,6BAA6B,YAAY;AAC1D,MAAI,CAAC,gBAAgB,QAAQ,SAAS,YAAY,SAAS,OAAO,CAAC,EAAG,OAAM,IAAI,MAAM,2DAA2D;AACjJ,MAAI,CAAC,SAAS,QAAQ,iBAAiB,SAAS,QAAQ,MAAM,EAAG,OAAM,IAAI,MAAM,gEAAgE;AACjJ,SAAO,EAAE,SAAS,SAAS;AAC7B;AAIO,SAAS,oBAAoB,OAAgB;AAClD,QAAM,EAAE,SAAS,SAAS,gBAAgB,eAAe,QAAQ,IAAI,6BAA6B,KAAK;AACvG,SAAO;AAAA,IACL;AAAA,IACA,aAAa,eAAe;AAAA,IAC5B,cAAc,eAAe;AAAA,IAC7B,QAAQ;AAAA,MACN,MAAM,cAAc;AAAA,MACpB,aAAa,cAAc;AAAA,MAC3B,QAAQ,cAAc,QAAQ,IAAI,YAAU;AAC1C,cAAM,SAAS,QAAQ,KAAK,CAAAA,YAAU,gBAAgB,OAAO,QAAQ,YAAYA,OAAM,CAAC,CAAC;AACzF,eAAO,EAAE,MAAM,OAAO,MAAM,aAAa,OAAO,aAAa,MAAM,OAAO,eAAe,MAAM,MAAM,OAAO,MAAM,QAAQ,OAAO,QAAQ,UAAU,OAAO,UAAU,UAAU,OAAO,SAAS;AAAA,MAChM,CAAC;AAAA,IACH;AAAA,IACA,OAAO,QAAQ,eAAe,IAAI,QAAM;AACtC,YAAM,OAAO,QAAQ,MAAM,KAAK,CAAAC,UAAQA,MAAK,OAAO,EAAE;AACtD,aAAO,EAAE,IAAI,KAAK,IAAI,OAAO,KAAK,OAAO,sBAAsB,KAAK,qBAAqB;AAAA,IAC3F,CAAC;AAAA,IACD,QAAQ;AAAA,MACN,OAAO,QAAQ,MAAM,OAAO,UAAQ,KAAK,UAAU,OAAO,EAAE;AAAA,MAC5D,YAAY,QAAQ,MAAM,OAAO,UAAQ,KAAK,UAAU,YAAY,EAAE;AAAA,MACtE,kBAAkB,QAAQ,MAAM,OAAO,UAAQ,KAAK,UAAU,aAAa,EAAE;AAAA,IAC/E;AAAA,EACF;AACF;AAIO,SAAS,6BAA6B,OAAsC;AACjF,wBAAsB,OAAO,KAAK,OAAO,IAAI;AAC7C,QAAM,WAAW,2BAA2B,MAAM,KAAK;AACvD,QAAM,EAAE,SAAS,SAAS,gBAAgB,eAAe,SAAS,OAAO,IAAI;AAC7E,QAAM,YAAY,QAAQ,SAAS;AACnC,MAAI,aAAa,OAAO,cAAc,YAAY,CAAC,MAAM,QAAQ,SAAS,KAAK,mBAAmB,WAAW;AAC3G,UAAM,SAAS,gCAAgC,MAAM,UAAU,aAAa;AAC5E,QAAI,OAAO,wBAAwB,+BAA+B,QAAQ,EAAG,OAAM,IAAI,MAAM,6DAA6D;AAAA,EAC5J;AACA,QAAM,YAAY,CAAC,SAAS,SAAS,gBAAgB,eAAe,GAAG,SAAS,GAAG,MAAM;AACzF,aAAW,YAAY,WAAW;AAChC,UAAM,EAAE,aAAa,GAAG,QAAQ,IAAI;AACpC,QAAI,oBAAoB,OAAO,EAAE,gBAAgB,YAAa,OAAM,IAAI,MAAM,sCAAsC,SAAS,EAAE,GAAG;AAAA,EACpI;AACA,uBAAqB,OAAO;AAC5B,gCAA8B,SAAS,WAAW,SAAS,MAAM;AACjE,WAAS,MAAM,UAAqC,UAAiE;AACnH,QAAI,CAAC,gBAAgB,UAAU,YAAY,QAAQ,CAAC,EAAG,OAAM,IAAI,MAAM,gCAAgC,SAAS,EAAE,GAAG;AAAA,EACvH;AACA,QAAM,QAAQ,SAAS,OAAO;AAC9B,QAAM,QAAQ,gBAAgB,cAAc;AAC5C,QAAM,QAAQ,eAAe,aAAa;AAC1C,QAAM,eAAe,eAAe,aAAa;AACjD,MAAI,cAAc,UAAW,OAAM,IAAI,MAAM,wFAAwF;AACrI,QAAM,EAAE,QAAQ,aAAa,oBAAoB,OAAO,cAAc,mBAAmB,IAAI;AAC7F,QAAM,YAAY,EAAE,QAAQ,aAAa,GAAI,qBAAqB,EAAE,mBAAmB,IAAI,CAAC,GAAI,OAAO,cAAc,GAAI,qBAAqB,EAAE,mBAAmB,IAAI,CAAC,EAAG;AAC3K,MAAI,oBAAoB,SAAS,EAAE,gBAAgB,oBAAoB,eAAe,SAAS,EAAE,YAAa,OAAM,IAAI,MAAM,yDAAyD;AACvL,MAAI,oBAAoB,EAAE,SAAS,QAAQ,QAAQ,CAAC,EAAE,gBAAgB,oBAAoB,EAAE,SAAS,oBAAoB,eAAe,OAAO,EAAE,CAAC,EAAE,YAAa,OAAM,IAAI,MAAM,4DAA4D;AAC7O,aAAW,CAAC,YAAY,MAAM,KAAK,CAAC,CAAC,QAAQ,SAAS,OAAO,GAAG,CAAC,QAAQ,QAAQ,MAAM,CAAC,GAAY;AAClG,QAAI,WAAW,WAAW,OAAO,UAAU,IAAI,IAAI,OAAO,IAAI,cAAY,SAAS,EAAE,CAAC,EAAE,SAAS,OAAO,OAAQ,OAAM,IAAI,MAAM,wCAAwC;AACxK,eAAW,OAAO,YAAY;AAC5B,YAAM,WAAW,OAAO,KAAK,CAAAC,WAASA,OAAM,OAAO,IAAI,EAAE;AACzD,UAAI,CAAC,SAAU,OAAM,IAAI,MAAM,kCAAkC,IAAI,EAAE,GAAG;AAC1E,YAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF;AACA,aAAW,UAAU,cAAc,SAAS;AAC1C,UAAM,SAAS,QAAQ,KAAK,CAAAF,YAAUA,QAAO,OAAO,OAAO,OAAO,EAAE;AACpE,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,8BAA8B,OAAO,OAAO,EAAE,GAAG;AAC9E,UAAM,OAAO,QAAQ,MAAM;AAAA,EAC7B;AACA,aAAW,UAAU,SAAS;AAC5B,UAAM,iBAAiB,OAAO;AAC9B,UAAM,aAAa;AAAA,MAAC,GAAG,OAAO;AAAA,MAC5B,GAAI,iBAAiB,iBAAiB,CAAC,eAAe,WAAW,IAAI,CAAC;AAAA,MACtE,GAAI,eAAe,iBAAiB,CAAC,eAAe,SAAS,IAAI,CAAC;AAAA,MAClE,GAAI,mBAAmB,iBAAiB,CAAC,eAAe,aAAa,IAAI,CAAC;AAAA,IAC5E;AACA,eAAW,OAAO,YAAY;AAC5B,YAAM,QAAQ,OAAO,KAAK,CAAAG,WAASA,OAAM,OAAO,IAAI,EAAE;AACtD,UAAI,CAAC,SAAS,oBAAoB,MAAM,KAAK,EAAE,gBAAgB,oBAAoB,GAAG,EAAE,YAAa,OAAM,IAAI,MAAM,gDAAgD,IAAI,EAAE,GAAG;AAC9K,UAAI,IAAI,eAAe,SAAU,OAAM,IAAI,MAAM,+DAA+D,IAAI,EAAE,GAAG;AAAA,IAC3H;AAAA,EACF;AACA,MAAI,IAAI,IAAI,QAAQ,MAAM,IAAI,UAAQ,KAAK,EAAE,CAAC,EAAE,SAAS,QAAQ,MAAM,OAAQ,OAAM,IAAI,MAAM,yCAAyC;AACxI,QAAM,cAAc,oBAAI,IAAoB;AAC5C,aAAW,QAAQ,QAAQ,OAAO;AAChC,QAAI,KAAK,qBAAqB,iBAAiB,eAAe,aAAc,OAAM,IAAI,MAAM,gEAAgE,KAAK,EAAE,GAAG;AACtK,UAAM,YAAY,oBAAoB,EAAE,OAAO,KAAK,OAAO,SAAS,KAAK,qBAAqB,CAAC,EAAE;AACjG,UAAM,aAAa,YAAY,IAAI,SAAS;AAC5C,QAAI,cAAc,eAAe,KAAK,MAAO,OAAM,IAAI,MAAM,kDAAkD;AAC/G,gBAAY,IAAI,WAAW,KAAK,KAAK;AACrC,QAAI,CAAC,kBAAkB,eAAe,aAAa,KAAK,KAAK,EAAE,MAAO,OAAM,IAAI,MAAM,iDAAiD,KAAK,EAAE,GAAG;AACjJ,QAAI,KAAK,mBAAmB,QAAQ,CAAC,kBAAkB,eAAe,cAAc,KAAK,cAAc,EAAE,MAAO,OAAM,IAAI,MAAM,sDAAsD,KAAK,EAAE,GAAG;AAAA,EAClM;AACA,aAAW,MAAM,QAAQ,gBAAgB;AACvC,UAAM,OAAO,QAAQ,MAAM,KAAK,CAAAF,UAAQA,MAAK,OAAO,EAAE;AACtD,QAAI,CAAC,QAAQ,KAAK,UAAU,cAAe,OAAM,IAAI,MAAM,wCAAwC,EAAE,GAAG;AAAA,EAC1G;AACA,SAAO;AACT;",
6
+ "names": ["reward", "task", "value", "asset"]
7
+ }
@@ -0,0 +1,80 @@
1
+ import {
2
+ apiFetch,
3
+ readApiJson
4
+ } from "./chunk-APHPXQEA.js";
5
+
6
+ // src/workflows.ts
7
+ import { randomUUID } from "node:crypto";
8
+ var OpenPondWorkflowsClient = class {
9
+ #apiKey;
10
+ #apiBaseUrl;
11
+ constructor(input) {
12
+ this.#apiKey = input.apiKey;
13
+ this.#apiBaseUrl = input.apiBaseUrl.replace(/\/+$/, "");
14
+ }
15
+ async list(options = {}) {
16
+ return this.#request("", "List Workflows", {
17
+ signal: options.signal
18
+ });
19
+ }
20
+ async create(input, options = {}) {
21
+ return this.#request("", "Create Workflow", {
22
+ method: "POST",
23
+ body: JSON.stringify({
24
+ ...input,
25
+ clientRequestId: input.clientRequestId?.trim() || randomUUID()
26
+ }),
27
+ signal: options.signal
28
+ });
29
+ }
30
+ async update(scheduleId, input, options = {}) {
31
+ return this.#request(
32
+ `/schedules/${encodeURIComponent(requiredId(scheduleId, "scheduleId"))}`,
33
+ "Update Workflow",
34
+ {
35
+ method: "PATCH",
36
+ body: JSON.stringify(input),
37
+ signal: options.signal
38
+ }
39
+ );
40
+ }
41
+ async delete(scheduleId, options = {}) {
42
+ return this.#request(
43
+ `/schedules/${encodeURIComponent(requiredId(scheduleId, "scheduleId"))}`,
44
+ "Delete Workflow",
45
+ { method: "DELETE", signal: options.signal }
46
+ );
47
+ }
48
+ async runNow(scheduleId, input = {}, options = {}) {
49
+ return this.#request(
50
+ `/schedules/${encodeURIComponent(requiredId(scheduleId, "scheduleId"))}/run`,
51
+ "Run Workflow",
52
+ {
53
+ method: "POST",
54
+ body: JSON.stringify({
55
+ clientRequestId: input.clientRequestId?.trim() || randomUUID()
56
+ }),
57
+ signal: options.signal
58
+ }
59
+ );
60
+ }
61
+ async #request(suffix, label, options = {}) {
62
+ const response = await apiFetch(
63
+ this.#apiBaseUrl,
64
+ this.#apiKey,
65
+ `/v1/saved-work${suffix}`,
66
+ options
67
+ );
68
+ return readApiJson(response, label);
69
+ }
70
+ };
71
+ function requiredId(value, label) {
72
+ const normalized = value.trim();
73
+ if (!normalized) throw new Error(`${label} is required`);
74
+ return normalized;
75
+ }
76
+
77
+ export {
78
+ OpenPondWorkflowsClient
79
+ };
80
+ //# sourceMappingURL=chunk-7O5X7DBU.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/workflows.ts"],
4
+ "sourcesContent": ["import { randomUUID } from \"node:crypto\";\n\nimport { apiFetch, readApiJson } from \"@openpond/cloud/api/core\";\n\nexport type OpenPondWorkflowWeekday =\n | \"sunday\"\n | \"monday\"\n | \"tuesday\"\n | \"wednesday\"\n | \"thursday\"\n | \"friday\"\n | \"saturday\";\n\nexport type OpenPondWorkflowRecurrence = {\n version: 1;\n kind: \"once\" | \"daily\" | \"weekdays\" | \"weekly\" | \"monthly\";\n timeZone: string;\n startDate: string;\n localTime: string;\n weekdays?: OpenPondWorkflowWeekday[];\n dayOfMonth?: number;\n end:\n | { kind: \"never\" }\n | { kind: \"on_date\"; date: string }\n | { kind: \"after_occurrences\"; occurrences: number };\n};\n\nexport type OpenPondWorkflowSchedule = {\n id: string;\n expression: string | null;\n timeZone: string;\n recurrence: OpenPondWorkflowRecurrence | null;\n configurationVersion: number;\n enabled: boolean;\n nextRunAt: string | null;\n lastTriggeredAt: string | null;\n delivery: Record<string, unknown>;\n};\n\nexport type OpenPondWorkflowDefinition = {\n id: string;\n definitionKey: string;\n version: number;\n name: string;\n prompt: string;\n modelId: string;\n schedules: OpenPondWorkflowSchedule[];\n};\n\nexport type OpenPondWorkflowRun = {\n id: string;\n definitionId: string;\n scheduleId: string | null;\n definitionName: string;\n definitionVersion: number;\n conversationId: string;\n triggerKind: \"manual\" | \"schedule\" | \"webhook\" | \"retry\";\n status: string;\n notificationStatus: string;\n deliveryStatus: string;\n deliveryError: string | null;\n createdAt: string;\n};\n\nexport type OpenPondWorkflowCatalog = {\n definitions: OpenPondWorkflowDefinition[];\n runs: OpenPondWorkflowRun[];\n asOf: string;\n};\n\nexport type OpenPondWorkflowCreateInput = {\n clientRequestId?: string;\n sourceTurnId?: string | null;\n name: string;\n prompt: string;\n recurrence: OpenPondWorkflowRecurrence;\n modelId?: string;\n enabled?: boolean;\n target?:\n | { kind: \"prompt\" }\n | {\n kind: \"external_callback\";\n callbackUrl: string;\n externalReference: string;\n };\n};\n\nexport type OpenPondWorkflowCreateResult = {\n created: boolean;\n definitionId: string;\n scheduleId: string;\n name: string;\n enabled: boolean;\n nextRunAt: string | null;\n recurrence: OpenPondWorkflowRecurrence | null;\n timeZone: string;\n};\n\nexport type OpenPondWorkflowUpdateInput =\n | { enabled: boolean }\n | {\n name: string;\n prompt: string;\n recurrence: OpenPondWorkflowRecurrence;\n };\n\nexport type OpenPondWorkflowUpdateResult = {\n definitionId?: string;\n schedule: {\n id: string;\n enabled: boolean;\n nextRunAt: string | null;\n };\n};\n\nexport type OpenPondWorkflowDeleteResult = {\n schedule: {\n id: string;\n archived: true;\n };\n};\n\nexport type OpenPondWorkflowRunNowResult = {\n runId: string;\n conversationId: string;\n};\n\nexport type OpenPondWorkflowRequestOptions = {\n signal?: AbortSignal;\n};\n\ntype WorkflowsClientInput = {\n apiKey: string;\n apiBaseUrl: string;\n};\n\nexport class OpenPondWorkflowsClient {\n readonly #apiKey: string;\n readonly #apiBaseUrl: string;\n\n constructor(input: WorkflowsClientInput) {\n this.#apiKey = input.apiKey;\n this.#apiBaseUrl = input.apiBaseUrl.replace(/\\/+$/, \"\");\n }\n\n async list(\n options: OpenPondWorkflowRequestOptions = {},\n ): Promise<OpenPondWorkflowCatalog> {\n return this.#request<OpenPondWorkflowCatalog>(\"\", \"List Workflows\", {\n signal: options.signal,\n });\n }\n\n async create(\n input: OpenPondWorkflowCreateInput,\n options: OpenPondWorkflowRequestOptions = {},\n ): Promise<OpenPondWorkflowCreateResult> {\n return this.#request<OpenPondWorkflowCreateResult>(\"\", \"Create Workflow\", {\n method: \"POST\",\n body: JSON.stringify({\n ...input,\n clientRequestId: input.clientRequestId?.trim() || randomUUID(),\n }),\n signal: options.signal,\n });\n }\n\n async update(\n scheduleId: string,\n input: OpenPondWorkflowUpdateInput,\n options: OpenPondWorkflowRequestOptions = {},\n ): Promise<OpenPondWorkflowUpdateResult> {\n return this.#request<OpenPondWorkflowUpdateResult>(\n `/schedules/${encodeURIComponent(requiredId(scheduleId, \"scheduleId\"))}`,\n \"Update Workflow\",\n {\n method: \"PATCH\",\n body: JSON.stringify(input),\n signal: options.signal,\n },\n );\n }\n\n async delete(\n scheduleId: string,\n options: OpenPondWorkflowRequestOptions = {},\n ): Promise<OpenPondWorkflowDeleteResult> {\n return this.#request<OpenPondWorkflowDeleteResult>(\n `/schedules/${encodeURIComponent(requiredId(scheduleId, \"scheduleId\"))}`,\n \"Delete Workflow\",\n { method: \"DELETE\", signal: options.signal },\n );\n }\n\n async runNow(\n scheduleId: string,\n input: { clientRequestId?: string } = {},\n options: OpenPondWorkflowRequestOptions = {},\n ): Promise<OpenPondWorkflowRunNowResult> {\n return this.#request<OpenPondWorkflowRunNowResult>(\n `/schedules/${encodeURIComponent(requiredId(scheduleId, \"scheduleId\"))}/run`,\n \"Run Workflow\",\n {\n method: \"POST\",\n body: JSON.stringify({\n clientRequestId: input.clientRequestId?.trim() || randomUUID(),\n }),\n signal: options.signal,\n },\n );\n }\n\n async #request<T>(\n suffix: string,\n label: string,\n options: RequestInit = {},\n ): Promise<T> {\n const response = await apiFetch(\n this.#apiBaseUrl,\n this.#apiKey,\n `/v1/saved-work${suffix}`,\n options,\n );\n return readApiJson<T>(response, label);\n }\n}\n\nfunction requiredId(value: string, label: string): string {\n const normalized = value.trim();\n if (!normalized) throw new Error(`${label} is required`);\n return normalized;\n}\n"],
5
+ "mappings": ";;;;;;AAAA,SAAS,kBAAkB;AAwIpB,IAAM,0BAAN,MAA8B;AAAA,EAC1B;AAAA,EACA;AAAA,EAET,YAAY,OAA6B;AACvC,SAAK,UAAU,MAAM;AACrB,SAAK,cAAc,MAAM,WAAW,QAAQ,QAAQ,EAAE;AAAA,EACxD;AAAA,EAEA,MAAM,KACJ,UAA0C,CAAC,GACT;AAClC,WAAO,KAAK,SAAkC,IAAI,kBAAkB;AAAA,MAClE,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OACJ,OACA,UAA0C,CAAC,GACJ;AACvC,WAAO,KAAK,SAAuC,IAAI,mBAAmB;AAAA,MACxE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QACnB,GAAG;AAAA,QACH,iBAAiB,MAAM,iBAAiB,KAAK,KAAK,WAAW;AAAA,MAC/D,CAAC;AAAA,MACD,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OACJ,YACA,OACA,UAA0C,CAAC,GACJ;AACvC,WAAO,KAAK;AAAA,MACV,cAAc,mBAAmB,WAAW,YAAY,YAAY,CAAC,CAAC;AAAA,MACtE;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,KAAK;AAAA,QAC1B,QAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OACJ,YACA,UAA0C,CAAC,GACJ;AACvC,WAAO,KAAK;AAAA,MACV,cAAc,mBAAmB,WAAW,YAAY,YAAY,CAAC,CAAC;AAAA,MACtE;AAAA,MACA,EAAE,QAAQ,UAAU,QAAQ,QAAQ,OAAO;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,MAAM,OACJ,YACA,QAAsC,CAAC,GACvC,UAA0C,CAAC,GACJ;AACvC,WAAO,KAAK;AAAA,MACV,cAAc,mBAAmB,WAAW,YAAY,YAAY,CAAC,CAAC;AAAA,MACtE;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU;AAAA,UACnB,iBAAiB,MAAM,iBAAiB,KAAK,KAAK,WAAW;AAAA,QAC/D,CAAC;AAAA,QACD,QAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SACJ,QACA,OACA,UAAuB,CAAC,GACZ;AACZ,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,iBAAiB,MAAM;AAAA,MACvB;AAAA,IACF;AACA,WAAO,YAAe,UAAU,KAAK;AAAA,EACvC;AACF;AAEA,SAAS,WAAW,OAAe,OAAuB;AACxD,QAAM,aAAa,MAAM,KAAK;AAC9B,MAAI,CAAC,WAAY,OAAM,IAAI,MAAM,GAAG,KAAK,cAAc;AACvD,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,115 @@
1
+ // src/taskset-catalog.ts
2
+ import { z } from "zod";
3
+ var IdSchema = z.string().trim().min(1).max(500);
4
+ var HashSchema = z.string().regex(/^[a-f0-9]{64}$/);
5
+ var TasksetCatalogReleaseRefSchema = z.object({ id: IdSchema, revision: z.number().int().positive(), contentHash: HashSchema }).strict();
6
+ var HostedTasksetSummarySchema = z.object({
7
+ schemaVersion: z.literal("openpond.hostedTasksetSummary.v1"),
8
+ id: IdSchema,
9
+ teamId: IdSchema,
10
+ release: TasksetCatalogReleaseRefSchema,
11
+ name: z.string().min(1).max(500),
12
+ description: z.string().max(2e4),
13
+ taskCount: z.number().int().nonnegative(),
14
+ buildIntent: z.string().min(1).max(100),
15
+ methodHint: z.string().min(1).max(100).nullable(),
16
+ packageBytes: z.number().int().nonnegative().nullable(),
17
+ storedBytes: z.number().int().nonnegative().nullable(),
18
+ createdAt: z.string().datetime({ offset: true })
19
+ }).strict();
20
+ var TasksetCatalogQuerySchema = z.object({
21
+ afterId: IdSchema.optional(),
22
+ limit: z.number().int().min(1).max(100).default(30),
23
+ modelProjectId: IdSchema.optional()
24
+ }).strict();
25
+ var TasksetCatalogPageSchema = z.object({
26
+ items: z.array(HostedTasksetSummarySchema).max(100),
27
+ nextCursor: IdSchema.nullable()
28
+ }).strict();
29
+ var TasksetCatalogErrorSchema = z.object({
30
+ code: z.string().min(1),
31
+ message: z.string().min(1)
32
+ }).strict();
33
+ var OpenPondTasksetCatalogError = class extends Error {
34
+ constructor(status, code, message) {
35
+ super(message);
36
+ this.status = status;
37
+ this.code = code;
38
+ this.name = "OpenPondTasksetCatalogError";
39
+ }
40
+ status;
41
+ code;
42
+ };
43
+ var OpenPondTasksetCatalogClient = class {
44
+ #options;
45
+ constructor(options) {
46
+ if (!options.apiKey.trim() || !options.teamId.trim()) throw new Error("Taskset API key and workspace are required.");
47
+ const url = new URL(options.baseUrl);
48
+ if (!["http:", "https:"].includes(url.protocol) || url.username || url.password || url.search || url.hash) throw new Error("Taskset base URL must be an HTTP(S) endpoint without credentials, query, or fragment.");
49
+ this.#options = { ...options, baseUrl: url.toString().replace(/\/+$/, "") };
50
+ }
51
+ async list(query = {}, options = {}) {
52
+ const parsed = TasksetCatalogQuerySchema.parse(query);
53
+ const search = new URLSearchParams({ limit: String(parsed.limit) });
54
+ if (parsed.afterId) search.set("afterId", parsed.afterId);
55
+ if (parsed.modelProjectId) search.set("modelProjectId", parsed.modelProjectId);
56
+ const page = TasksetCatalogPageSchema.parse(await this.#request(`?${search}`, options.signal));
57
+ if (page.items.length > parsed.limit || page.items.some((item) => item.teamId !== this.#options.teamId)) throw new OpenPondTasksetCatalogError(502, "catalog_scope_mismatch", "Taskset inventory did not match the requested workspace or page size.");
58
+ return page;
59
+ }
60
+ async get(id, options = {}) {
61
+ const parsed = IdSchema.parse(id);
62
+ const item = HostedTasksetSummarySchema.parse(await this.#request(`/${encodeURIComponent(parsed)}`, options.signal));
63
+ if (item.id !== parsed || item.teamId !== this.#options.teamId) throw new OpenPondTasksetCatalogError(502, "catalog_identity_mismatch", "Taskset metadata did not match the requested identity.");
64
+ return item;
65
+ }
66
+ /** Resolve a saved portable reference without scanning inventory pages. */
67
+ async resolve(release, options = {}) {
68
+ const parsed = TasksetCatalogReleaseRefSchema.parse(release);
69
+ const item = HostedTasksetSummarySchema.parse(await this.#request(`/releases/${encodeURIComponent(parsed.id)}/${parsed.revision}/${parsed.contentHash}`, options.signal));
70
+ if (item.teamId !== this.#options.teamId || item.release.id !== parsed.id || item.release.revision !== parsed.revision || item.release.contentHash !== parsed.contentHash) throw new OpenPondTasksetCatalogError(502, "catalog_release_mismatch", "Taskset metadata did not match the requested immutable release.");
71
+ return item;
72
+ }
73
+ async #request(path, signal) {
74
+ const response = await (this.#options.fetch ?? globalThis.fetch)(`${this.#options.baseUrl}/v1/taskset-catalog${path}`, {
75
+ headers: { Authorization: `Bearer ${this.#options.apiKey}`, "X-OpenPond-Team-Id": this.#options.teamId, Accept: "application/json" },
76
+ signal,
77
+ redirect: "error"
78
+ });
79
+ const reader = response.body?.getReader();
80
+ if (!reader) throw new OpenPondTasksetCatalogError(response.status, "empty_response", "Taskset catalog response was empty.");
81
+ const decoder = new TextDecoder();
82
+ let bytes = 0;
83
+ let text = "";
84
+ try {
85
+ while (true) {
86
+ const chunk = await reader.read();
87
+ if (chunk.done) break;
88
+ bytes += chunk.value.byteLength;
89
+ if (bytes > 4194304) throw new OpenPondTasksetCatalogError(response.status, "response_too_large", "Taskset catalog response exceeded 4 MiB.");
90
+ text += decoder.decode(chunk.value, { stream: true });
91
+ }
92
+ text += decoder.decode();
93
+ } finally {
94
+ await reader.cancel();
95
+ reader.releaseLock();
96
+ }
97
+ const payload = JSON.parse(text);
98
+ if (!response.ok) {
99
+ const error = TasksetCatalogErrorSchema.safeParse(payload);
100
+ throw new OpenPondTasksetCatalogError(response.status, error.success ? error.data.code : "invalid_error_response", error.success ? error.data.message : `Taskset catalog request failed (${response.status}).`);
101
+ }
102
+ return payload;
103
+ }
104
+ };
105
+
106
+ export {
107
+ TasksetCatalogReleaseRefSchema,
108
+ HostedTasksetSummarySchema,
109
+ TasksetCatalogQuerySchema,
110
+ TasksetCatalogPageSchema,
111
+ TasksetCatalogErrorSchema,
112
+ OpenPondTasksetCatalogError,
113
+ OpenPondTasksetCatalogClient
114
+ };
115
+ //# sourceMappingURL=chunk-A4ZDOZKP.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/taskset-catalog.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\n\nconst IdSchema = z.string().trim().min(1).max(500);\nconst HashSchema = z.string().regex(/^[a-f0-9]{64}$/);\nexport const TasksetCatalogReleaseRefSchema = z.object({ id: IdSchema, revision: z.number().int().positive(), contentHash: HashSchema }).strict();\n\n/** Inventory metadata only. Task rows, evaluator source, and object locations\n * are resolved separately by an authorized package operation. */\nexport const HostedTasksetSummarySchema = z.object({\n schemaVersion: z.literal(\"openpond.hostedTasksetSummary.v1\"),\n id: IdSchema,\n teamId: IdSchema,\n release: TasksetCatalogReleaseRefSchema,\n name: z.string().min(1).max(500),\n description: z.string().max(20_000),\n taskCount: z.number().int().nonnegative(),\n buildIntent: z.string().min(1).max(100),\n methodHint: z.string().min(1).max(100).nullable(),\n packageBytes: z.number().int().nonnegative().nullable(),\n storedBytes: z.number().int().nonnegative().nullable(),\n createdAt: z.string().datetime({ offset: true }),\n}).strict();\nexport const TasksetCatalogQuerySchema = z.object({\n afterId: IdSchema.optional(),\n limit: z.number().int().min(1).max(100).default(30),\n modelProjectId: IdSchema.optional(),\n}).strict();\nexport const TasksetCatalogPageSchema = z.object({\n items: z.array(HostedTasksetSummarySchema).max(100),\n nextCursor: IdSchema.nullable(),\n}).strict();\nexport const TasksetCatalogErrorSchema = z.object({\n code: z.string().min(1),\n message: z.string().min(1),\n}).strict();\nexport type HostedTasksetSummary = z.infer<typeof HostedTasksetSummarySchema>;\nexport type TasksetCatalogPage = z.infer<typeof TasksetCatalogPageSchema>;\n\nexport class OpenPondTasksetCatalogError extends Error {\n constructor(readonly status: number, readonly code: string, message: string) {\n super(message);\n this.name = \"OpenPondTasksetCatalogError\";\n }\n}\n\nexport interface TasksetCatalogClientOptions {\n baseUrl: string;\n apiKey: string;\n teamId: string;\n fetch?: typeof globalThis.fetch;\n}\n\nexport class OpenPondTasksetCatalogClient {\n readonly #options: TasksetCatalogClientOptions;\n constructor(options: TasksetCatalogClientOptions) {\n if (!options.apiKey.trim() || !options.teamId.trim()) throw new Error(\"Taskset API key and workspace are required.\");\n const url = new URL(options.baseUrl);\n if (![\"http:\", \"https:\"].includes(url.protocol) || url.username || url.password || url.search || url.hash) throw new Error(\"Taskset base URL must be an HTTP(S) endpoint without credentials, query, or fragment.\");\n this.#options = { ...options, baseUrl: url.toString().replace(/\\/+$/, \"\") };\n }\n\n async list(query: z.input<typeof TasksetCatalogQuerySchema> = {}, options: { signal?: AbortSignal } = {}): Promise<TasksetCatalogPage> {\n const parsed = TasksetCatalogQuerySchema.parse(query);\n const search = new URLSearchParams({ limit: String(parsed.limit) });\n if (parsed.afterId) search.set(\"afterId\", parsed.afterId);\n if (parsed.modelProjectId) search.set(\"modelProjectId\", parsed.modelProjectId);\n const page = TasksetCatalogPageSchema.parse(await this.#request(`?${search}`, options.signal));\n if (page.items.length > parsed.limit || page.items.some((item) => item.teamId !== this.#options.teamId)) throw new OpenPondTasksetCatalogError(502, \"catalog_scope_mismatch\", \"Taskset inventory did not match the requested workspace or page size.\");\n return page;\n }\n\n async get(id: string, options: { signal?: AbortSignal } = {}): Promise<HostedTasksetSummary> {\n const parsed = IdSchema.parse(id);\n const item = HostedTasksetSummarySchema.parse(await this.#request(`/${encodeURIComponent(parsed)}`, options.signal));\n if (item.id !== parsed || item.teamId !== this.#options.teamId) throw new OpenPondTasksetCatalogError(502, \"catalog_identity_mismatch\", \"Taskset metadata did not match the requested identity.\");\n return item;\n }\n\n /** Resolve a saved portable reference without scanning inventory pages. */\n async resolve(release: z.infer<typeof TasksetCatalogReleaseRefSchema>, options: { signal?: AbortSignal } = {}): Promise<HostedTasksetSummary> {\n const parsed = TasksetCatalogReleaseRefSchema.parse(release);\n const item = HostedTasksetSummarySchema.parse(await this.#request(`/releases/${encodeURIComponent(parsed.id)}/${parsed.revision}/${parsed.contentHash}`, options.signal));\n if (item.teamId !== this.#options.teamId || item.release.id !== parsed.id || item.release.revision !== parsed.revision || item.release.contentHash !== parsed.contentHash) throw new OpenPondTasksetCatalogError(502, \"catalog_release_mismatch\", \"Taskset metadata did not match the requested immutable release.\");\n return item;\n }\n\n async #request(path: string, signal?: AbortSignal): Promise<unknown> {\n const response = await (this.#options.fetch ?? globalThis.fetch)(`${this.#options.baseUrl}/v1/taskset-catalog${path}`, {\n headers: { Authorization: `Bearer ${this.#options.apiKey}`, \"X-OpenPond-Team-Id\": this.#options.teamId, Accept: \"application/json\" },\n signal, redirect: \"error\",\n });\n const reader = response.body?.getReader();\n if (!reader) throw new OpenPondTasksetCatalogError(response.status, \"empty_response\", \"Taskset catalog response was empty.\");\n const decoder = new TextDecoder();\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 > 4_194_304) throw new OpenPondTasksetCatalogError(response.status, \"response_too_large\", \"Taskset catalog response exceeded 4 MiB.\");\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 = TasksetCatalogErrorSchema.safeParse(payload);\n throw new OpenPondTasksetCatalogError(response.status, error.success ? error.data.code : \"invalid_error_response\", error.success ? error.data.message : `Taskset catalog request failed (${response.status}).`);\n }\n return payload;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,155 @@
1
+ // ../cloud/dist/api/core.js
2
+ var DEFAULT_API_TIMEOUT_MS = 3e4;
3
+ var DEFAULT_API_RESPONSE_BYTES = 8 * 1024 * 1024;
4
+ var LONG_STREAM_API_OPTIONS = { timeoutMs: 15 * 60 * 1e3, maxResponseBytes: 64 * 1024 * 1024 };
5
+ var ApiTimeoutError = class extends Error {
6
+ timeoutMs;
7
+ requestUrl;
8
+ code = "OPENPOND_API_TIMEOUT";
9
+ constructor(timeoutMs, requestUrl) {
10
+ super(`API request timed out after ${timeoutMs}ms: ${requestUrl}`);
11
+ this.timeoutMs = timeoutMs;
12
+ this.requestUrl = requestUrl;
13
+ this.name = "ApiTimeoutError";
14
+ }
15
+ };
16
+ var ApiResponseTooLargeError = class extends Error {
17
+ maximumBytes;
18
+ requestUrl;
19
+ code = "OPENPOND_API_RESPONSE_TOO_LARGE";
20
+ constructor(maximumBytes, requestUrl) {
21
+ super(`API response exceeded ${maximumBytes} bytes: ${requestUrl}`);
22
+ this.maximumBytes = maximumBytes;
23
+ this.requestUrl = requestUrl;
24
+ this.name = "ApiResponseTooLargeError";
25
+ }
26
+ };
27
+ var OpenPondApiError = class extends Error {
28
+ status;
29
+ apiMessage;
30
+ code;
31
+ constructor(status, errorCode, label, apiMessage = null) {
32
+ const detail = apiMessage || errorCode;
33
+ super(`${label} failed: ${status}${detail ? ` ${detail}` : ""}`);
34
+ this.status = status;
35
+ this.apiMessage = apiMessage;
36
+ this.name = "OpenPondApiError";
37
+ this.code = errorCode || "OPENPOND_API_ERROR";
38
+ }
39
+ };
40
+ async function apiFetch(baseUrl, token, requestPath, options = {}) {
41
+ const { timeoutMs = DEFAULT_API_TIMEOUT_MS, maxResponseBytes = DEFAULT_API_RESPONSE_BYTES, ...init } = options;
42
+ const requestUrl = `${baseUrl}${requestPath}`;
43
+ const headers = new Headers(init.headers);
44
+ headers.set("Content-Type", "application/json");
45
+ const apiKey = process.env.OPENPOND_API_KEY;
46
+ const trimmedToken = token?.trim() || "";
47
+ const tokenIsApiKey = trimmedToken.startsWith("opk_");
48
+ const effectiveApiKey = apiKey || (tokenIsApiKey ? trimmedToken : null);
49
+ if (effectiveApiKey && !headers.has("openpond-api-key"))
50
+ headers.set("openpond-api-key", effectiveApiKey);
51
+ if (token) {
52
+ headers.set("Authorization", tokenIsApiKey ? `ApiKey ${trimmedToken}` : `Bearer ${token}`);
53
+ } else if (apiKey && !headers.has("Authorization")) {
54
+ headers.set("Authorization", `ApiKey ${apiKey}`);
55
+ }
56
+ const timeoutController = new AbortController();
57
+ const timeoutError = new ApiTimeoutError(timeoutMs, requestUrl);
58
+ const timer = timeoutMs > 0 ? setTimeout(() => timeoutController.abort(timeoutError), timeoutMs) : null;
59
+ timer?.unref?.();
60
+ const signal = composedSignal(init.signal, timeoutController.signal, timeoutMs);
61
+ const cleanup = () => {
62
+ if (timer)
63
+ clearTimeout(timer);
64
+ };
65
+ try {
66
+ const response = await fetch(requestUrl, { ...init, headers, signal });
67
+ return boundedResponse(response, {
68
+ cleanup,
69
+ maximumBytes: maxResponseBytes,
70
+ requestUrl,
71
+ timeoutController,
72
+ timeoutError
73
+ });
74
+ } catch (error) {
75
+ cleanup();
76
+ if (timeoutController.signal.aborted)
77
+ throw timeoutError;
78
+ throw error;
79
+ }
80
+ }
81
+ async function readApiJson(response, label) {
82
+ let payload;
83
+ try {
84
+ const text = await response.text();
85
+ payload = text ? JSON.parse(text) : {};
86
+ } catch (error) {
87
+ if (error instanceof ApiTimeoutError || error instanceof ApiResponseTooLargeError)
88
+ throw error;
89
+ payload = {};
90
+ }
91
+ if (!response.ok) {
92
+ const errorCode = typeof payload.error === "string" ? payload.error : null;
93
+ const apiMessage = typeof payload.message === "string" ? payload.message : null;
94
+ throw new OpenPondApiError(response.status, errorCode, label, apiMessage);
95
+ }
96
+ return payload;
97
+ }
98
+ function boundedResponse(response, input) {
99
+ if (!response.body) {
100
+ input.cleanup();
101
+ return response;
102
+ }
103
+ const contentLength = Number(response.headers.get("content-length"));
104
+ if (input.maximumBytes > 0 && Number.isFinite(contentLength) && contentLength > input.maximumBytes) {
105
+ input.cleanup();
106
+ void response.body.cancel();
107
+ throw new ApiResponseTooLargeError(input.maximumBytes, input.requestUrl);
108
+ }
109
+ const reader = response.body.getReader();
110
+ let receivedBytes = 0;
111
+ const body = new ReadableStream({
112
+ async pull(controller) {
113
+ try {
114
+ const result = await reader.read();
115
+ if (result.done) {
116
+ input.cleanup();
117
+ controller.close();
118
+ return;
119
+ }
120
+ receivedBytes += result.value.byteLength;
121
+ if (input.maximumBytes > 0 && receivedBytes > input.maximumBytes) {
122
+ input.cleanup();
123
+ await reader.cancel();
124
+ controller.error(new ApiResponseTooLargeError(input.maximumBytes, input.requestUrl));
125
+ return;
126
+ }
127
+ controller.enqueue(result.value);
128
+ } catch (error) {
129
+ input.cleanup();
130
+ controller.error(input.timeoutController.signal.aborted ? input.timeoutError : error);
131
+ }
132
+ },
133
+ async cancel(reason) {
134
+ input.cleanup();
135
+ await reader.cancel(reason);
136
+ }
137
+ });
138
+ return new Response(body, {
139
+ headers: response.headers,
140
+ status: response.status,
141
+ statusText: response.statusText
142
+ });
143
+ }
144
+ function composedSignal(callerSignal, timeoutSignal, timeoutMs) {
145
+ if (timeoutMs <= 0)
146
+ return callerSignal ?? void 0;
147
+ return callerSignal ? AbortSignal.any([callerSignal, timeoutSignal]) : timeoutSignal;
148
+ }
149
+
150
+ export {
151
+ OpenPondApiError,
152
+ apiFetch,
153
+ readApiJson
154
+ };
155
+ //# sourceMappingURL=chunk-APHPXQEA.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../cloud/src/api/core.ts"],
4
+ "sourcesContent": ["const 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 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, ...init } = options;\n const requestUrl = `${baseUrl}${requestPath}`;\n const headers = new Headers(init.headers);\n headers.set(\"Content-Type\", \"application/json\");\n const apiKey = process.env.OPENPOND_API_KEY;\n const trimmedToken = token?.trim() || \"\";\n const tokenIsApiKey = 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"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }