openpond-sdk 0.0.12 → 0.0.14

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 (46) hide show
  1. package/README.md +31 -0
  2. package/TRAINING_PROTOCOL.md +78 -0
  3. package/dist/actions-local.js +34 -14551
  4. package/dist/actions-local.js.map +4 -4
  5. package/dist/actions.js +12 -14530
  6. package/dist/actions.js.map +4 -4
  7. package/dist/index.js +582 -29
  8. package/dist/index.js.map +4 -4
  9. package/dist/model-projects.js +348 -0
  10. package/dist/model-projects.js.map +7 -0
  11. package/dist/profile-actions.js +1 -20
  12. package/dist/profile-actions.js.map +3 -3
  13. package/dist/project-actions.js +1 -20
  14. package/dist/project-actions.js.map +3 -3
  15. package/dist/refiner.js +568 -0
  16. package/dist/refiner.js.map +7 -0
  17. package/dist/training.js +691 -0
  18. package/dist/training.js.map +7 -0
  19. package/dist/types/packages/cloud/src/api/core.d.ts.map +1 -1
  20. package/dist/types/packages/cloud/src/hosted-chat.d.ts +20 -0
  21. package/dist/types/packages/cloud/src/hosted-chat.d.ts.map +1 -1
  22. package/dist/types/packages/cloud/src/sandbox/client-handles.d.ts +2 -1
  23. package/dist/types/packages/cloud/src/sandbox/client-handles.d.ts.map +1 -1
  24. package/dist/types/packages/cloud/src/sandbox/client.d.ts +3 -1
  25. package/dist/types/packages/cloud/src/sandbox/client.d.ts.map +1 -1
  26. package/dist/types/packages/cloud/src/sandbox/types/org-project-agent.d.ts +13 -0
  27. package/dist/types/packages/cloud/src/sandbox/types/org-project-agent.d.ts.map +1 -1
  28. package/dist/types/packages/sdk/src/index.d.ts +1 -0
  29. package/dist/types/packages/sdk/src/index.d.ts.map +1 -1
  30. package/dist/types/packages/sdk/src/model-projects.d.ts +820 -0
  31. package/dist/types/packages/sdk/src/model-projects.d.ts.map +1 -0
  32. package/dist/types/packages/sdk/src/protocol.d.ts +25 -0
  33. package/dist/types/packages/sdk/src/protocol.d.ts.map +1 -0
  34. package/dist/types/packages/sdk/src/refiner.d.ts +6 -0
  35. package/dist/types/packages/sdk/src/refiner.d.ts.map +1 -0
  36. package/dist/types/packages/sdk/src/training.d.ts +859 -0
  37. package/dist/types/packages/sdk/src/training.d.ts.map +1 -0
  38. package/dist/types/packages/sdk/src/types.d.ts +1 -1
  39. package/dist/types/packages/sdk/src/types.d.ts.map +1 -1
  40. package/dist/workflows.js +1 -20
  41. package/dist/workflows.js.map +3 -3
  42. package/fixtures/training/v2/policy-optimize.unknown-field.invalid.json +10 -0
  43. package/fixtures/training/v2/policy-optimize.valid.json +84 -0
  44. package/package.json +20 -4
  45. package/dist/types/packages/cloud/src/api/vercel-protection.d.ts +0 -2
  46. package/dist/types/packages/cloud/src/api/vercel-protection.d.ts.map +0 -1
@@ -0,0 +1,348 @@
1
+ // src/model-projects.ts
2
+ import { z } from "zod";
3
+
4
+ // src/protocol.ts
5
+ var OPENPOND_MODEL_PROJECT_MEDIA_TYPE = "application/vnd.openpond.model-project+json;version=2";
6
+ var MODEL_PROJECT_SYNC_MAX_BYTES = 524288;
7
+ var MODEL_PROJECT_API_RESPONSE_MAX_BYTES = 8388608;
8
+ var OpenPondProtocolError = class extends Error {
9
+ code;
10
+ constructor(code, message) {
11
+ super(message);
12
+ this.name = "OpenPondProtocolError";
13
+ this.code = code;
14
+ }
15
+ };
16
+ function canonicalJson(value) {
17
+ return JSON.stringify(normalizeCanonicalJson(value));
18
+ }
19
+ function canonicalJsonByteLength(value) {
20
+ return new TextEncoder().encode(canonicalJson(value)).byteLength;
21
+ }
22
+ function assertCanonicalPayloadSize(value, maximumBytes, label) {
23
+ const actualBytes = canonicalJsonByteLength(value);
24
+ if (actualBytes > maximumBytes) {
25
+ throw new OpenPondProtocolError(
26
+ "payload_too_large",
27
+ `${label} is ${actualBytes} bytes; the maximum is ${maximumBytes} bytes.`
28
+ );
29
+ }
30
+ }
31
+ function parseBoundedJson(text, maximumBytes, label) {
32
+ const actualBytes = new TextEncoder().encode(text).byteLength;
33
+ if (actualBytes > maximumBytes) {
34
+ throw new OpenPondProtocolError(
35
+ "response_too_large",
36
+ `${label} is ${actualBytes} bytes; the maximum is ${maximumBytes} bytes.`
37
+ );
38
+ }
39
+ try {
40
+ return JSON.parse(text);
41
+ } catch {
42
+ throw new OpenPondProtocolError(
43
+ "invalid_json",
44
+ `${label} was not valid JSON.`
45
+ );
46
+ }
47
+ }
48
+ function normalizeCanonicalJson(value) {
49
+ if (value === null || typeof value === "string" || typeof value === "boolean") {
50
+ return value;
51
+ }
52
+ if (typeof value === "number") {
53
+ if (!Number.isFinite(value)) {
54
+ throw new OpenPondProtocolError(
55
+ "non_json_value",
56
+ "Canonical JSON cannot contain a non-finite number."
57
+ );
58
+ }
59
+ return Object.is(value, -0) ? 0 : value;
60
+ }
61
+ if (Array.isArray(value)) {
62
+ return value.map((entry) => normalizeCanonicalJson(entry));
63
+ }
64
+ if (typeof value === "object") {
65
+ const prototype = Object.getPrototypeOf(value);
66
+ if (prototype !== Object.prototype && prototype !== null) {
67
+ throw new OpenPondProtocolError(
68
+ "non_json_value",
69
+ "Canonical JSON accepts only plain objects."
70
+ );
71
+ }
72
+ const result = {};
73
+ for (const key of Object.keys(value).sort()) {
74
+ const entry = value[key];
75
+ if (entry === void 0 || typeof entry === "function" || typeof entry === "symbol") {
76
+ throw new OpenPondProtocolError(
77
+ "non_json_value",
78
+ `Canonical JSON cannot contain ${typeof entry} at ${key}.`
79
+ );
80
+ }
81
+ result[key] = normalizeCanonicalJson(entry);
82
+ }
83
+ return result;
84
+ }
85
+ throw new OpenPondProtocolError(
86
+ "non_json_value",
87
+ `Canonical JSON cannot contain ${typeof value}.`
88
+ );
89
+ }
90
+
91
+ // src/model-projects.ts
92
+ var IdSchema = z.string().trim().min(1).max(500);
93
+ var HashSchema = z.string().regex(/^[a-f0-9]{64}$/);
94
+ var TimestampSchema = z.string().datetime({ offset: true });
95
+ var ModelProjectImmutableRefSchema = z.object({
96
+ id: IdSchema,
97
+ contentHash: HashSchema
98
+ }).strict();
99
+ var ModelProjectVersionedRefSchema = ModelProjectImmutableRefSchema.extend({
100
+ revision: z.number().int().positive()
101
+ }).strict();
102
+ var ModelProjectBaseModelSchema = z.object({
103
+ schemaVersion: z.literal("openpond.baseModelPreference.v1"),
104
+ modelId: IdSchema,
105
+ revision: z.string().trim().min(1).max(256).nullable(),
106
+ tokenizerRevision: z.string().trim().min(1).max(256).nullable(),
107
+ chatTemplateHash: z.string().trim().min(8).max(256).nullable(),
108
+ modelAssetId: IdSchema.nullable(),
109
+ source: z.enum(["managed", "local", "builtin"])
110
+ }).strict();
111
+ var ModelProjectTrainingMethodSchema = z.enum([
112
+ "sft",
113
+ "dpo",
114
+ "grpo",
115
+ "ppo",
116
+ "sdft",
117
+ "opd",
118
+ "opsd",
119
+ "sdpo"
120
+ ]);
121
+ var ModelProjectRecipeDocumentSchema = z.object({
122
+ schemaVersion: z.string().regex(/^openpond\.[A-Za-z0-9]+Recipe\.v\d+$/),
123
+ method: ModelProjectTrainingMethodSchema,
124
+ parameterization: z.enum(["lora", "full"])
125
+ }).catchall(z.unknown());
126
+ var ModelProjectTrainingSetupSchema = z.object({
127
+ tasksetRef: ModelProjectVersionedRefSchema.nullable().default(null),
128
+ tasksetRelease: ModelProjectImmutableRefSchema.nullable().default(null),
129
+ harnessRelease: ModelProjectImmutableRefSchema.nullable().default(null),
130
+ baseModel: ModelProjectBaseModelSchema.nullable().default(null),
131
+ method: ModelProjectTrainingMethodSchema.nullable().default(null),
132
+ destinationId: IdSchema.nullable().default(null),
133
+ managedRolloutPlacement: z.enum(["local", "remote"]).default("remote"),
134
+ runPreset: z.enum(["small", "standard", "custom", "small_experiment"]).nullable().default(null),
135
+ recipe: ModelProjectRecipeDocumentSchema.nullable().default(null),
136
+ preferredMaximumSpendUsd: z.number().nonnegative().nullable().default(null),
137
+ preferredRetentionDays: z.number().int().nonnegative().nullable().default(null)
138
+ }).strict();
139
+ var HostedModelProjectLinkSchema = z.object({
140
+ schemaVersion: z.literal("openpond.hostedModelProjectLink.v1"),
141
+ teamId: IdSchema,
142
+ projectId: IdSchema,
143
+ portableProjectId: IdSchema,
144
+ revision: z.number().int().positive(),
145
+ etag: HashSchema,
146
+ syncedSourceRevision: z.number().int().positive(),
147
+ syncedAt: TimestampSchema,
148
+ tasksets: z.array(
149
+ z.object({
150
+ localTasksetId: IdSchema,
151
+ releaseId: IdSchema,
152
+ releaseRevision: z.number().int().positive(),
153
+ releaseHash: HashSchema,
154
+ hostedTasksetId: IdSchema,
155
+ syncedAt: TimestampSchema
156
+ }).strict()
157
+ ).max(1e4).default([])
158
+ }).strict();
159
+ var ModelProjectTasksetSyncSchema = z.object({
160
+ localTasksetId: IdSchema,
161
+ releaseId: IdSchema,
162
+ releaseRevision: z.number().int().positive(),
163
+ releaseHash: HashSchema,
164
+ state: z.enum(["syncing", "synced", "sync_failed"]),
165
+ hostedTasksetId: IdSchema.nullable().default(null),
166
+ lastAttemptAt: TimestampSchema,
167
+ syncedAt: TimestampSchema.nullable().default(null),
168
+ lastError: z.string().trim().min(1).max(5e3).nullable().default(null)
169
+ }).strict();
170
+ var ModelProjectSchema = z.object({
171
+ schemaVersion: z.literal("openpond.modelProject.v2"),
172
+ id: IdSchema,
173
+ profileId: IdSchema,
174
+ revision: z.number().int().positive().default(1),
175
+ name: z.string().trim().min(1).max(200),
176
+ objective: z.string().trim().max(5e3).nullable(),
177
+ defaultBaseModel: ModelProjectBaseModelSchema.nullable(),
178
+ defaultDestinationId: IdSchema.nullable(),
179
+ trainingSetup: ModelProjectTrainingSetupSchema,
180
+ hosted: HostedModelProjectLinkSchema.nullable().default(null),
181
+ tasksetSyncs: z.array(ModelProjectTasksetSyncSchema).max(1e4).default([]),
182
+ createdAt: TimestampSchema,
183
+ updatedAt: TimestampSchema
184
+ }).strict();
185
+ var HostedModelProjectSyncSchema = z.object({
186
+ schemaVersion: z.literal("openpond.hostedModelProjectSync.v2"),
187
+ portableProjectId: IdSchema,
188
+ name: z.string().trim().min(1).max(200),
189
+ objective: z.string().trim().max(5e3).nullable(),
190
+ defaultBaseModel: ModelProjectBaseModelSchema.nullable(),
191
+ defaultDestinationId: IdSchema.nullable(),
192
+ trainingSetup: ModelProjectTrainingSetupSchema,
193
+ sourceRevision: z.number().int().positive(),
194
+ sourceUpdatedAt: TimestampSchema,
195
+ expectedEtag: HashSchema.nullable().default(null)
196
+ }).strict();
197
+ var HostedModelProjectSummarySchema = z.object({
198
+ id: IdSchema,
199
+ teamId: IdSchema,
200
+ portableProjectId: IdSchema,
201
+ name: z.string().trim().min(1).max(200),
202
+ objective: z.string().trim().max(5e3).nullable(),
203
+ defaultBaseModel: ModelProjectBaseModelSchema.nullable(),
204
+ defaultDestinationId: IdSchema.nullable(),
205
+ trainingSetup: ModelProjectTrainingSetupSchema,
206
+ sourceRevision: z.number().int().positive(),
207
+ sourceUpdatedAt: TimestampSchema,
208
+ revision: z.number().int().positive(),
209
+ etag: HashSchema,
210
+ createdAt: TimestampSchema,
211
+ updatedAt: TimestampSchema
212
+ }).strict();
213
+ var ModelProjectResourceSummarySchema = z.object({
214
+ kind: z.enum([
215
+ "taskset_release",
216
+ "harness_release",
217
+ "dataset_release",
218
+ "evidence_set",
219
+ "model_version",
220
+ "reward_model_version",
221
+ "evaluation_receipt"
222
+ ]),
223
+ ref: ModelProjectImmutableRefSchema,
224
+ role: z.string().trim().min(1).max(200).nullable().default(null),
225
+ updatedAt: TimestampSchema
226
+ }).strict();
227
+ var HostedModelProjectDetailSchema = z.object({
228
+ project: HostedModelProjectSummarySchema,
229
+ resources: z.array(ModelProjectResourceSummarySchema).max(1e4),
230
+ jobCount: z.number().int().nonnegative(),
231
+ latestJobIds: z.array(IdSchema).max(100)
232
+ }).strict();
233
+ var ModelProjectApiErrorSchema = z.object({
234
+ schemaVersion: z.literal("openpond.modelProjectApiError.v2"),
235
+ code: z.string().trim().min(1).max(200),
236
+ message: z.string().trim().min(1).max(5e3),
237
+ retryable: z.boolean().default(false),
238
+ requestId: z.string().trim().min(1).max(500).nullable().default(null),
239
+ details: z.record(z.string(), z.unknown()).default({})
240
+ }).strict();
241
+ var OpenPondModelProjectApiError = class extends Error {
242
+ status;
243
+ code;
244
+ retryable;
245
+ requestId;
246
+ details;
247
+ constructor(status, error) {
248
+ super(error.message);
249
+ this.name = "OpenPondModelProjectApiError";
250
+ this.status = status;
251
+ this.code = error.code;
252
+ this.retryable = error.retryable;
253
+ this.requestId = error.requestId;
254
+ this.details = error.details;
255
+ }
256
+ };
257
+ function headersRecord(headers) {
258
+ const result = {};
259
+ new Headers(headers).forEach((value, key) => {
260
+ result[key] = value;
261
+ });
262
+ return result;
263
+ }
264
+ function createModelProjectsClient(input) {
265
+ const fetchImpl = input.fetch ?? fetch;
266
+ const baseUrl = input.baseUrl.replace(/\/$/, "");
267
+ async function request(pathname, init) {
268
+ const configuredHeaders = typeof input.headers === "function" ? await input.headers() : input.headers ?? {};
269
+ const response = await fetchImpl(`${baseUrl}${pathname}`, {
270
+ ...init,
271
+ headers: {
272
+ accept: OPENPOND_MODEL_PROJECT_MEDIA_TYPE,
273
+ ...init?.body ? { "content-type": OPENPOND_MODEL_PROJECT_MEDIA_TYPE } : {},
274
+ ...headersRecord(configuredHeaders),
275
+ ...headersRecord(init?.headers)
276
+ }
277
+ });
278
+ const body = parseBoundedJson(
279
+ await response.text(),
280
+ MODEL_PROJECT_API_RESPONSE_MAX_BYTES,
281
+ "Model Project API response"
282
+ );
283
+ if (!response.ok) {
284
+ const parsed = ModelProjectApiErrorSchema.safeParse(body);
285
+ if (parsed.success) {
286
+ throw new OpenPondModelProjectApiError(response.status, parsed.data);
287
+ }
288
+ throw new OpenPondProtocolError(
289
+ "invalid_error_response",
290
+ `Model Project request failed with HTTP ${response.status} and an invalid error envelope.`
291
+ );
292
+ }
293
+ return body;
294
+ }
295
+ return {
296
+ async upsert(project) {
297
+ assertCanonicalPayloadSize(
298
+ project,
299
+ MODEL_PROJECT_SYNC_MAX_BYTES,
300
+ "Model Project sync"
301
+ );
302
+ const parsed = HostedModelProjectSyncSchema.parse(project);
303
+ const body = await request(
304
+ `/v1/model-projects/${encodeURIComponent(parsed.portableProjectId)}`,
305
+ { method: "PUT", body: JSON.stringify(parsed) }
306
+ );
307
+ return HostedModelProjectSummarySchema.parse(
308
+ unwrapObject(body, "project")
309
+ );
310
+ },
311
+ async list() {
312
+ const body = await request("/v1/model-projects");
313
+ return z.array(HostedModelProjectSummarySchema).parse(unwrapObject(body, "projects"));
314
+ },
315
+ async get(projectId) {
316
+ const body = await request(
317
+ `/v1/model-projects/${encodeURIComponent(IdSchema.parse(projectId))}`
318
+ );
319
+ return HostedModelProjectDetailSchema.parse(body);
320
+ }
321
+ };
322
+ }
323
+ function unwrapObject(value, key) {
324
+ if (!value || typeof value !== "object" || Array.isArray(value)) return value;
325
+ return key in value ? value[key] : value;
326
+ }
327
+ export {
328
+ HostedModelProjectDetailSchema,
329
+ HostedModelProjectLinkSchema,
330
+ HostedModelProjectSummarySchema,
331
+ HostedModelProjectSyncSchema,
332
+ MODEL_PROJECT_API_RESPONSE_MAX_BYTES,
333
+ MODEL_PROJECT_SYNC_MAX_BYTES,
334
+ ModelProjectApiErrorSchema,
335
+ ModelProjectBaseModelSchema,
336
+ ModelProjectImmutableRefSchema,
337
+ ModelProjectRecipeDocumentSchema,
338
+ ModelProjectResourceSummarySchema,
339
+ ModelProjectSchema,
340
+ ModelProjectTasksetSyncSchema,
341
+ ModelProjectTrainingMethodSchema,
342
+ ModelProjectTrainingSetupSchema,
343
+ ModelProjectVersionedRefSchema,
344
+ OPENPOND_MODEL_PROJECT_MEDIA_TYPE,
345
+ OpenPondModelProjectApiError,
346
+ createModelProjectsClient
347
+ };
348
+ //# sourceMappingURL=model-projects.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/model-projects.ts", "../src/protocol.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\n\nimport {\n MODEL_PROJECT_API_RESPONSE_MAX_BYTES,\n MODEL_PROJECT_SYNC_MAX_BYTES,\n OPENPOND_MODEL_PROJECT_MEDIA_TYPE,\n OpenPondProtocolError,\n assertCanonicalPayloadSize,\n parseBoundedJson,\n} from \"./protocol.js\";\n\nexport {\n MODEL_PROJECT_API_RESPONSE_MAX_BYTES,\n MODEL_PROJECT_SYNC_MAX_BYTES,\n OPENPOND_MODEL_PROJECT_MEDIA_TYPE,\n} from \"./protocol.js\";\n\nconst IdSchema = z.string().trim().min(1).max(500);\nconst HashSchema = z.string().regex(/^[a-f0-9]{64}$/);\nconst TimestampSchema = z.string().datetime({ offset: true });\n\nexport const ModelProjectImmutableRefSchema = z\n .object({\n id: IdSchema,\n contentHash: HashSchema,\n })\n .strict();\n\nexport const ModelProjectVersionedRefSchema =\n ModelProjectImmutableRefSchema.extend({\n revision: z.number().int().positive(),\n }).strict();\n\nexport const ModelProjectBaseModelSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.baseModelPreference.v1\"),\n modelId: IdSchema,\n revision: z.string().trim().min(1).max(256).nullable(),\n tokenizerRevision: z.string().trim().min(1).max(256).nullable(),\n chatTemplateHash: z.string().trim().min(8).max(256).nullable(),\n modelAssetId: IdSchema.nullable(),\n source: z.enum([\"managed\", \"local\", \"builtin\"]),\n })\n .strict();\n\nexport const ModelProjectTrainingMethodSchema = z.enum([\n \"sft\",\n \"dpo\",\n \"grpo\",\n \"ppo\",\n \"sdft\",\n \"opd\",\n \"opsd\",\n \"sdpo\",\n]);\n\n/**\n * A versioned recipe document stored while a Project is still mutable.\n * The training endpoint validates the selected recipe version in full before\n * accepting an immutable Job; Project sync preserves newer recipe fields.\n */\nexport const ModelProjectRecipeDocumentSchema = z\n .object({\n schemaVersion: z.string().regex(/^openpond\\.[A-Za-z0-9]+Recipe\\.v\\d+$/),\n method: ModelProjectTrainingMethodSchema,\n parameterization: z.enum([\"lora\", \"full\"]),\n })\n .catchall(z.unknown());\n\nexport const ModelProjectTrainingSetupSchema = z\n .object({\n tasksetRef: ModelProjectVersionedRefSchema.nullable().default(null),\n tasksetRelease: ModelProjectImmutableRefSchema.nullable().default(null),\n harnessRelease: ModelProjectImmutableRefSchema.nullable().default(null),\n baseModel: ModelProjectBaseModelSchema.nullable().default(null),\n method: ModelProjectTrainingMethodSchema.nullable().default(null),\n destinationId: IdSchema.nullable().default(null),\n managedRolloutPlacement: z\n .enum([\"local\", \"remote\"])\n .default(\"remote\"),\n runPreset: z\n .enum([\"small\", \"standard\", \"custom\", \"small_experiment\"])\n .nullable()\n .default(null),\n recipe: ModelProjectRecipeDocumentSchema.nullable().default(null),\n preferredMaximumSpendUsd: z.number().nonnegative().nullable().default(null),\n preferredRetentionDays: z\n .number()\n .int()\n .nonnegative()\n .nullable()\n .default(null),\n })\n .strict();\n\nexport const HostedModelProjectLinkSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.hostedModelProjectLink.v1\"),\n teamId: IdSchema,\n projectId: IdSchema,\n portableProjectId: IdSchema,\n revision: z.number().int().positive(),\n etag: HashSchema,\n syncedSourceRevision: z.number().int().positive(),\n syncedAt: TimestampSchema,\n tasksets: z\n .array(\n z\n .object({\n localTasksetId: IdSchema,\n releaseId: IdSchema,\n releaseRevision: z.number().int().positive(),\n releaseHash: HashSchema,\n hostedTasksetId: IdSchema,\n syncedAt: TimestampSchema,\n })\n .strict(),\n )\n .max(10_000)\n .default([]),\n })\n .strict();\n\nexport const ModelProjectTasksetSyncSchema = z\n .object({\n localTasksetId: IdSchema,\n releaseId: IdSchema,\n releaseRevision: z.number().int().positive(),\n releaseHash: HashSchema,\n state: z.enum([\"syncing\", \"synced\", \"sync_failed\"]),\n hostedTasksetId: IdSchema.nullable().default(null),\n lastAttemptAt: TimestampSchema,\n syncedAt: TimestampSchema.nullable().default(null),\n lastError: z.string().trim().min(1).max(5_000).nullable().default(null),\n })\n .strict();\n\nexport const ModelProjectSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.modelProject.v2\"),\n id: IdSchema,\n profileId: IdSchema,\n revision: z.number().int().positive().default(1),\n name: z.string().trim().min(1).max(200),\n objective: z.string().trim().max(5_000).nullable(),\n defaultBaseModel: ModelProjectBaseModelSchema.nullable(),\n defaultDestinationId: IdSchema.nullable(),\n trainingSetup: ModelProjectTrainingSetupSchema,\n hosted: HostedModelProjectLinkSchema.nullable().default(null),\n tasksetSyncs: z\n .array(ModelProjectTasksetSyncSchema)\n .max(10_000)\n .default([]),\n createdAt: TimestampSchema,\n updatedAt: TimestampSchema,\n })\n .strict();\n\nexport const HostedModelProjectSyncSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.hostedModelProjectSync.v2\"),\n portableProjectId: IdSchema,\n name: z.string().trim().min(1).max(200),\n objective: z.string().trim().max(5_000).nullable(),\n defaultBaseModel: ModelProjectBaseModelSchema.nullable(),\n defaultDestinationId: IdSchema.nullable(),\n trainingSetup: ModelProjectTrainingSetupSchema,\n sourceRevision: z.number().int().positive(),\n sourceUpdatedAt: TimestampSchema,\n expectedEtag: HashSchema.nullable().default(null),\n })\n .strict();\n\nexport const HostedModelProjectSummarySchema = z\n .object({\n id: IdSchema,\n teamId: IdSchema,\n portableProjectId: IdSchema,\n name: z.string().trim().min(1).max(200),\n objective: z.string().trim().max(5_000).nullable(),\n defaultBaseModel: ModelProjectBaseModelSchema.nullable(),\n defaultDestinationId: IdSchema.nullable(),\n trainingSetup: ModelProjectTrainingSetupSchema,\n sourceRevision: z.number().int().positive(),\n sourceUpdatedAt: TimestampSchema,\n revision: z.number().int().positive(),\n etag: HashSchema,\n createdAt: TimestampSchema,\n updatedAt: TimestampSchema,\n })\n .strict();\n\nexport const ModelProjectResourceSummarySchema = z\n .object({\n kind: z.enum([\n \"taskset_release\",\n \"harness_release\",\n \"dataset_release\",\n \"evidence_set\",\n \"model_version\",\n \"reward_model_version\",\n \"evaluation_receipt\",\n ]),\n ref: ModelProjectImmutableRefSchema,\n role: z.string().trim().min(1).max(200).nullable().default(null),\n updatedAt: TimestampSchema,\n })\n .strict();\n\nexport const HostedModelProjectDetailSchema = z\n .object({\n project: HostedModelProjectSummarySchema,\n resources: z.array(ModelProjectResourceSummarySchema).max(10_000),\n jobCount: z.number().int().nonnegative(),\n latestJobIds: z.array(IdSchema).max(100),\n })\n .strict();\n\nexport const ModelProjectApiErrorSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.modelProjectApiError.v2\"),\n code: z.string().trim().min(1).max(200),\n message: z.string().trim().min(1).max(5_000),\n retryable: z.boolean().default(false),\n requestId: z.string().trim().min(1).max(500).nullable().default(null),\n details: z.record(z.string(), z.unknown()).default({}),\n })\n .strict();\n\nexport class OpenPondModelProjectApiError extends Error {\n readonly status: number;\n readonly code: string;\n readonly retryable: boolean;\n readonly requestId: string | null;\n readonly details: Record<string, unknown>;\n\n constructor(status: number, error: z.infer<typeof ModelProjectApiErrorSchema>) {\n super(error.message);\n this.name = \"OpenPondModelProjectApiError\";\n this.status = status;\n this.code = error.code;\n this.retryable = error.retryable;\n this.requestId = error.requestId;\n this.details = error.details;\n }\n}\n\nexport type ModelProject = z.infer<typeof ModelProjectSchema>;\nexport type ModelProjectTrainingSetup = z.infer<\n typeof ModelProjectTrainingSetupSchema\n>;\nexport type HostedModelProjectSync = z.infer<\n typeof HostedModelProjectSyncSchema\n>;\nexport type HostedModelProjectSummary = z.infer<\n typeof HostedModelProjectSummarySchema\n>;\nexport type HostedModelProjectDetail = z.infer<\n typeof HostedModelProjectDetailSchema\n>;\n\ntype ModelProjectsFetch = typeof fetch;\n\nfunction headersRecord(headers: HeadersInit | undefined): Record<string, string> {\n const result: Record<string, string> = {};\n new Headers(headers).forEach((value, key) => {\n result[key] = value;\n });\n return result;\n}\n\nexport function createModelProjectsClient(input: {\n baseUrl: string;\n fetch?: ModelProjectsFetch;\n headers?: HeadersInit | (() => HeadersInit | Promise<HeadersInit>);\n}) {\n const fetchImpl = input.fetch ?? fetch;\n const baseUrl = input.baseUrl.replace(/\\/$/, \"\");\n\n async function request(pathname: string, init?: RequestInit): Promise<unknown> {\n const configuredHeaders =\n typeof input.headers === \"function\"\n ? await input.headers()\n : (input.headers ?? {});\n const response = await fetchImpl(`${baseUrl}${pathname}`, {\n ...init,\n headers: {\n accept: OPENPOND_MODEL_PROJECT_MEDIA_TYPE,\n ...(init?.body\n ? { \"content-type\": OPENPOND_MODEL_PROJECT_MEDIA_TYPE }\n : {}),\n ...headersRecord(configuredHeaders),\n ...headersRecord(init?.headers),\n },\n });\n const body = parseBoundedJson(\n await response.text(),\n MODEL_PROJECT_API_RESPONSE_MAX_BYTES,\n \"Model Project API response\",\n );\n if (!response.ok) {\n const parsed = ModelProjectApiErrorSchema.safeParse(body);\n if (parsed.success) {\n throw new OpenPondModelProjectApiError(response.status, parsed.data);\n }\n throw new OpenPondProtocolError(\n \"invalid_error_response\",\n `Model Project request failed with HTTP ${response.status} and an invalid error envelope.`,\n );\n }\n return body;\n }\n\n return {\n async upsert(project: HostedModelProjectSync) {\n assertCanonicalPayloadSize(\n project,\n MODEL_PROJECT_SYNC_MAX_BYTES,\n \"Model Project sync\",\n );\n const parsed = HostedModelProjectSyncSchema.parse(project);\n const body = await request(\n `/v1/model-projects/${encodeURIComponent(parsed.portableProjectId)}`,\n { method: \"PUT\", body: JSON.stringify(parsed) },\n );\n return HostedModelProjectSummarySchema.parse(\n unwrapObject(body, \"project\"),\n );\n },\n async list() {\n const body = await request(\"/v1/model-projects\");\n return z\n .array(HostedModelProjectSummarySchema)\n .parse(unwrapObject(body, \"projects\"));\n },\n async get(projectId: string) {\n const body = await request(\n `/v1/model-projects/${encodeURIComponent(IdSchema.parse(projectId))}`,\n );\n return HostedModelProjectDetailSchema.parse(body);\n },\n };\n}\n\nfunction unwrapObject(value: unknown, key: string): unknown {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return value;\n return key in value ? (value as Record<string, unknown>)[key] : value;\n}\n", "export type CanonicalJsonValue =\n | null\n | boolean\n | number\n | string\n | CanonicalJsonValue[]\n | { [key: string]: CanonicalJsonValue };\n\nexport const OPENPOND_TRAINING_PROTOCOL_MAJOR = 2 as const;\nexport const OPENPOND_TRAINING_MEDIA_TYPE =\n \"application/vnd.openpond.training+json;version=2\" as const;\nexport const OPENPOND_MODEL_PROJECT_MEDIA_TYPE =\n \"application/vnd.openpond.model-project+json;version=2\" as const;\n\nexport const TRAINING_JOB_SUBMISSION_MAX_BYTES = 1_048_576;\nexport const TRAINING_API_RESPONSE_MAX_BYTES = 8_388_608;\nexport const MODEL_PROJECT_SYNC_MAX_BYTES = 524_288;\nexport const MODEL_PROJECT_API_RESPONSE_MAX_BYTES = 8_388_608;\n\nexport class OpenPondProtocolError extends Error {\n readonly code: string;\n\n constructor(code: string, message: string) {\n super(message);\n this.name = \"OpenPondProtocolError\";\n this.code = code;\n }\n}\n\n/**\n * Deterministic JSON used for content-addressed OpenPond protocol objects.\n * Object keys are sorted by Unicode code point, arrays retain their authored\n * order, and non-JSON/non-finite values are rejected rather than coerced.\n */\nexport function canonicalJson(value: unknown): string {\n return JSON.stringify(normalizeCanonicalJson(value));\n}\n\nexport function canonicalJsonByteLength(value: unknown): number {\n return new TextEncoder().encode(canonicalJson(value)).byteLength;\n}\n\nexport async function canonicalSha256(value: unknown): Promise<string> {\n const bytes = new TextEncoder().encode(canonicalJson(value));\n const digest = await globalThis.crypto.subtle.digest(\"SHA-256\", bytes);\n return Array.from(new Uint8Array(digest), (byte) =>\n byte.toString(16).padStart(2, \"0\"),\n ).join(\"\");\n}\n\nexport function assertCanonicalPayloadSize(\n value: unknown,\n maximumBytes: number,\n label: string,\n): void {\n const actualBytes = canonicalJsonByteLength(value);\n if (actualBytes > maximumBytes) {\n throw new OpenPondProtocolError(\n \"payload_too_large\",\n `${label} is ${actualBytes} bytes; the maximum is ${maximumBytes} bytes.`,\n );\n }\n}\n\nexport function parseBoundedJson(\n text: string,\n maximumBytes: number,\n label: string,\n): unknown {\n const actualBytes = new TextEncoder().encode(text).byteLength;\n if (actualBytes > maximumBytes) {\n throw new OpenPondProtocolError(\n \"response_too_large\",\n `${label} is ${actualBytes} bytes; the maximum is ${maximumBytes} bytes.`,\n );\n }\n try {\n return JSON.parse(text) as unknown;\n } catch {\n throw new OpenPondProtocolError(\n \"invalid_json\",\n `${label} was not valid JSON.`,\n );\n }\n}\n\nfunction normalizeCanonicalJson(value: unknown): CanonicalJsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new OpenPondProtocolError(\n \"non_json_value\",\n \"Canonical JSON cannot contain a non-finite number.\",\n );\n }\n return Object.is(value, -0) ? 0 : value;\n }\n if (Array.isArray(value)) {\n return value.map((entry) => normalizeCanonicalJson(entry));\n }\n if (typeof value === \"object\") {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n throw new OpenPondProtocolError(\n \"non_json_value\",\n \"Canonical JSON accepts only plain objects.\",\n );\n }\n const result: Record<string, CanonicalJsonValue> = {};\n for (const key of Object.keys(value as Record<string, unknown>).sort()) {\n const entry = (value as Record<string, unknown>)[key];\n if (entry === undefined || typeof entry === \"function\" || typeof entry === \"symbol\") {\n throw new OpenPondProtocolError(\n \"non_json_value\",\n `Canonical JSON cannot contain ${typeof entry} at ${key}.`,\n );\n }\n result[key] = normalizeCanonicalJson(entry);\n }\n return result;\n }\n throw new OpenPondProtocolError(\n \"non_json_value\",\n `Canonical JSON cannot contain ${typeof value}.`,\n );\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,22 +1,3 @@
1
- // ../cloud/dist/api/vercel-protection.js
2
- var VERCEL_PROTECTION_BYPASS_HEADER = "x-vercel-protection-bypass";
3
- function withVercelProtectionBypass(requestUrl, inputHeaders, env = typeof process === "undefined" ? {} : process.env) {
4
- const headers = new Headers(inputHeaders);
5
- const secret = env.VERCEL_AUTOMATION_BYPASS_SECRET?.trim();
6
- if (!secret || !isOpenPondStagingUrl(requestUrl))
7
- return headers;
8
- headers.set(VERCEL_PROTECTION_BYPASS_HEADER, secret);
9
- return headers;
10
- }
11
- function isOpenPondStagingUrl(requestUrl) {
12
- try {
13
- const hostname = new URL(requestUrl).hostname.toLowerCase();
14
- return hostname === "staging.openpond.ai" || hostname === "staging-api.openpond.ai" || hostname.endsWith(".staging-api.openpond.ai");
15
- } catch {
16
- return false;
17
- }
18
- }
19
-
20
1
  // ../cloud/dist/api/core.js
21
2
  var DEFAULT_API_TIMEOUT_MS = 3e4;
22
3
  var DEFAULT_API_RESPONSE_BYTES = 8 * 1024 * 1024;
@@ -59,7 +40,7 @@ var OpenPondApiError = class extends Error {
59
40
  async function apiFetch(baseUrl, token, requestPath, options = {}) {
60
41
  const { timeoutMs = DEFAULT_API_TIMEOUT_MS, maxResponseBytes = DEFAULT_API_RESPONSE_BYTES, ...init } = options;
61
42
  const requestUrl = `${baseUrl}${requestPath}`;
62
- const headers = withVercelProtectionBypass(requestUrl, init.headers);
43
+ const headers = new Headers(init.headers);
63
44
  headers.set("Content-Type", "application/json");
64
45
  const apiKey = process.env.OPENPOND_API_KEY;
65
46
  const trimmedToken = token?.trim() || "";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../cloud/src/api/vercel-protection.ts", "../../cloud/src/api/core.ts", "../src/profile-actions.ts"],
4
- "sourcesContent": ["const VERCEL_PROTECTION_BYPASS_HEADER = \"x-vercel-protection-bypass\";\n\nexport function withVercelProtectionBypass(\n requestUrl: string,\n inputHeaders?: HeadersInit,\n env: Record<string, string | undefined> =\n typeof process === \"undefined\" ? {} : process.env,\n): Headers {\n const headers = new Headers(inputHeaders);\n const secret = env.VERCEL_AUTOMATION_BYPASS_SECRET?.trim();\n if (!secret || !isOpenPondStagingUrl(requestUrl)) return headers;\n headers.set(VERCEL_PROTECTION_BYPASS_HEADER, secret);\n return headers;\n}\n\nfunction isOpenPondStagingUrl(requestUrl: string): boolean {\n try {\n const hostname = new URL(requestUrl).hostname.toLowerCase();\n return (\n hostname === \"staging.openpond.ai\" ||\n hostname === \"staging-api.openpond.ai\" ||\n hostname.endsWith(\".staging-api.openpond.ai\")\n );\n } catch {\n return false;\n }\n}\n", "import { withVercelProtectionBypass } from \"./vercel-protection.js\";\n\nconst DEFAULT_API_TIMEOUT_MS = 30_000;\nconst DEFAULT_API_RESPONSE_BYTES = 8 * 1024 * 1024;\nexport const LONG_STREAM_API_OPTIONS = { timeoutMs: 15 * 60 * 1000, maxResponseBytes: 64 * 1024 * 1024 } as const;\n\nexport type ApiFetchOptions = RequestInit & {\n 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 = withVercelProtectionBypass(requestUrl, 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", "import { apiFetch, readApiJson } from \"@openpond/cloud/api/core\";\n\nexport type OpenPondProfileActionSetupRequirement = {\n kind: string;\n key: string;\n label: string | null;\n required: boolean;\n status: string;\n warning: string | null;\n};\n\nexport type OpenPondProfileActionCatalogEntry = {\n /** Stable action key. This is the only action selector accepted by follow-up invocation APIs. */\n key: string;\n agentId: string;\n agentName: string;\n agentSlug: string;\n actionId: string;\n actionLabel: string;\n description: string;\n inputSchema: Record<string, unknown>;\n invokesModel: boolean;\n approvalPolicy: {\n required: boolean;\n risk: \"read\" | \"write\" | \"destructive\";\n };\n setupStatus: \"ready\" | \"setup_required\";\n setupRequirements: OpenPondProfileActionSetupRequirement[];\n requiredCapabilities: string[];\n};\n\nexport type OpenPondProfileActionCatalog = {\n profileId: string;\n profileName: string;\n /** Opaque source/action contract version used to reject catalog drift at invocation time. */\n catalogVersion: string;\n sourceCommitSha: string | null;\n actions: OpenPondProfileActionCatalogEntry[];\n};\n\nexport type OpenPondProfileActionInvocation<TOutput = Record<string, unknown>> = {\n run: {\n id: string;\n status: string;\n conversationId: string | null;\n resultJson: TOutput | null;\n };\n};\n\n/** A short-lived capability granted by the calling product for one Profile Action run. */\nexport type OpenPondExternalCapabilityLease = {\n provider: string;\n capabilities: string[];\n proxyUrl: string;\n bearerToken: string;\n expiresAt?: string;\n resourcePolicy?: Record<string, unknown>;\n};\n\ntype ProfileActionsClientInput = {\n apiKey: string;\n apiBaseUrl: string;\n};\n\nexport class OpenPondProfileActionsClient {\n readonly #apiKey: string;\n readonly #apiBaseUrl: string;\n\n constructor(input: ProfileActionsClientInput) {\n this.#apiKey = input.apiKey;\n this.#apiBaseUrl = input.apiBaseUrl.replace(/\\/+$/, \"\");\n }\n\n async catalog(input: {\n teamId: string;\n profileId?: string;\n profileName?: string;\n }): Promise<OpenPondProfileActionCatalog> {\n const teamId = requiredValue(input.teamId, \"teamId\");\n const search = new URLSearchParams({ teamId });\n if (input.profileId?.trim()) search.set(\"profileId\", input.profileId.trim());\n if (input.profileName?.trim()) {\n search.set(\"profileName\", input.profileName.trim());\n }\n const response = await apiFetch(\n this.#apiBaseUrl,\n this.#apiKey,\n `/v1/profile/actions?${search.toString()}`,\n );\n return (\n await readApiJson<{ catalog: OpenPondProfileActionCatalog }>(\n response,\n \"Get Profile Action catalog\",\n )\n ).catalog;\n }\n\n async run<TOutput = Record<string, unknown>>(input: {\n teamId: string;\n actionKey: string;\n profileId?: string;\n profileName?: string;\n value?: Record<string, unknown>;\n conversationId?: string | null;\n createConversation?: boolean;\n conversationTitle?: string | null;\n idempotencyKey: string;\n catalogVersion: string;\n externalCapabilityLeases?: OpenPondExternalCapabilityLease[];\n }): Promise<OpenPondProfileActionInvocation<TOutput>> {\n const teamId = requiredValue(input.teamId, \"teamId\");\n const actionKey = requiredValue(input.actionKey, \"actionKey\");\n const idempotencyKey = requiredValue(input.idempotencyKey, \"idempotencyKey\");\n const catalogVersion = requiredValue(input.catalogVersion, \"catalogVersion\");\n const response = await apiFetch(\n this.#apiBaseUrl,\n this.#apiKey,\n `/v1/profile/actions/run?${new URLSearchParams({ teamId }).toString()}`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n ...(input.profileId?.trim() ? { profileId: input.profileId.trim() } : {}),\n ...(input.profileName?.trim() ? { profileName: input.profileName.trim() } : {}),\n actionKey,\n value: input.value ?? {},\n conversationId: input.conversationId ?? null,\n createConversation: input.createConversation,\n conversationTitle: input.conversationTitle ?? null,\n idempotencyKey,\n catalogVersion,\n externalCapabilityLeases: input.externalCapabilityLeases,\n }),\n },\n );\n return readApiJson<OpenPondProfileActionInvocation<TOutput>>(\n response,\n \"Run Profile Action\",\n );\n }\n}\n\nfunction requiredValue(value: string, name: string): string {\n const normalized = value.trim();\n if (!normalized) throw new Error(`${name} is required`);\n return normalized;\n}\n"],
5
- "mappings": "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",
3
+ "sources": ["../../cloud/src/api/core.ts", "../src/profile-actions.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", "import { apiFetch, readApiJson } from \"@openpond/cloud/api/core\";\n\nexport type OpenPondProfileActionSetupRequirement = {\n kind: string;\n key: string;\n label: string | null;\n required: boolean;\n status: string;\n warning: string | null;\n};\n\nexport type OpenPondProfileActionCatalogEntry = {\n /** Stable action key. This is the only action selector accepted by follow-up invocation APIs. */\n key: string;\n agentId: string;\n agentName: string;\n agentSlug: string;\n actionId: string;\n actionLabel: string;\n description: string;\n inputSchema: Record<string, unknown>;\n invokesModel: boolean;\n approvalPolicy: {\n required: boolean;\n risk: \"read\" | \"write\" | \"destructive\";\n };\n setupStatus: \"ready\" | \"setup_required\";\n setupRequirements: OpenPondProfileActionSetupRequirement[];\n requiredCapabilities: string[];\n};\n\nexport type OpenPondProfileActionCatalog = {\n profileId: string;\n profileName: string;\n /** Opaque source/action contract version used to reject catalog drift at invocation time. */\n catalogVersion: string;\n sourceCommitSha: string | null;\n actions: OpenPondProfileActionCatalogEntry[];\n};\n\nexport type OpenPondProfileActionInvocation<TOutput = Record<string, unknown>> = {\n run: {\n id: string;\n status: string;\n conversationId: string | null;\n resultJson: TOutput | null;\n };\n};\n\n/** A short-lived capability granted by the calling product for one Profile Action run. */\nexport type OpenPondExternalCapabilityLease = {\n provider: string;\n capabilities: string[];\n proxyUrl: string;\n bearerToken: string;\n expiresAt?: string;\n resourcePolicy?: Record<string, unknown>;\n};\n\ntype ProfileActionsClientInput = {\n apiKey: string;\n apiBaseUrl: string;\n};\n\nexport class OpenPondProfileActionsClient {\n readonly #apiKey: string;\n readonly #apiBaseUrl: string;\n\n constructor(input: ProfileActionsClientInput) {\n this.#apiKey = input.apiKey;\n this.#apiBaseUrl = input.apiBaseUrl.replace(/\\/+$/, \"\");\n }\n\n async catalog(input: {\n teamId: string;\n profileId?: string;\n profileName?: string;\n }): Promise<OpenPondProfileActionCatalog> {\n const teamId = requiredValue(input.teamId, \"teamId\");\n const search = new URLSearchParams({ teamId });\n if (input.profileId?.trim()) search.set(\"profileId\", input.profileId.trim());\n if (input.profileName?.trim()) {\n search.set(\"profileName\", input.profileName.trim());\n }\n const response = await apiFetch(\n this.#apiBaseUrl,\n this.#apiKey,\n `/v1/profile/actions?${search.toString()}`,\n );\n return (\n await readApiJson<{ catalog: OpenPondProfileActionCatalog }>(\n response,\n \"Get Profile Action catalog\",\n )\n ).catalog;\n }\n\n async run<TOutput = Record<string, unknown>>(input: {\n teamId: string;\n actionKey: string;\n profileId?: string;\n profileName?: string;\n value?: Record<string, unknown>;\n conversationId?: string | null;\n createConversation?: boolean;\n conversationTitle?: string | null;\n idempotencyKey: string;\n catalogVersion: string;\n externalCapabilityLeases?: OpenPondExternalCapabilityLease[];\n }): Promise<OpenPondProfileActionInvocation<TOutput>> {\n const teamId = requiredValue(input.teamId, \"teamId\");\n const actionKey = requiredValue(input.actionKey, \"actionKey\");\n const idempotencyKey = requiredValue(input.idempotencyKey, \"idempotencyKey\");\n const catalogVersion = requiredValue(input.catalogVersion, \"catalogVersion\");\n const response = await apiFetch(\n this.#apiBaseUrl,\n this.#apiKey,\n `/v1/profile/actions/run?${new URLSearchParams({ teamId }).toString()}`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n ...(input.profileId?.trim() ? { profileId: input.profileId.trim() } : {}),\n ...(input.profileName?.trim() ? { profileName: input.profileName.trim() } : {}),\n actionKey,\n value: input.value ?? {},\n conversationId: input.conversationId ?? null,\n createConversation: input.createConversation,\n conversationTitle: input.conversationTitle ?? null,\n idempotencyKey,\n catalogVersion,\n externalCapabilityLeases: input.externalCapabilityLeases,\n }),\n },\n );\n return readApiJson<OpenPondProfileActionInvocation<TOutput>>(\n response,\n \"Run Profile Action\",\n );\n }\n}\n\nfunction requiredValue(value: string, name: string): string {\n const normalized = value.trim();\n if (!normalized) throw new Error(`${name} is required`);\n return normalized;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,25 +1,6 @@
1
1
  // src/project-actions.ts
2
2
  import { promises as fs } from "node:fs";
3
3
 
4
- // ../cloud/dist/api/vercel-protection.js
5
- var VERCEL_PROTECTION_BYPASS_HEADER = "x-vercel-protection-bypass";
6
- function withVercelProtectionBypass(requestUrl, inputHeaders, env = typeof process === "undefined" ? {} : process.env) {
7
- const headers = new Headers(inputHeaders);
8
- const secret = env.VERCEL_AUTOMATION_BYPASS_SECRET?.trim();
9
- if (!secret || !isOpenPondStagingUrl(requestUrl))
10
- return headers;
11
- headers.set(VERCEL_PROTECTION_BYPASS_HEADER, secret);
12
- return headers;
13
- }
14
- function isOpenPondStagingUrl(requestUrl) {
15
- try {
16
- const hostname = new URL(requestUrl).hostname.toLowerCase();
17
- return hostname === "staging.openpond.ai" || hostname === "staging-api.openpond.ai" || hostname.endsWith(".staging-api.openpond.ai");
18
- } catch {
19
- return false;
20
- }
21
- }
22
-
23
4
  // ../cloud/dist/api/core.js
24
5
  var DEFAULT_API_TIMEOUT_MS = 3e4;
25
6
  var DEFAULT_API_RESPONSE_BYTES = 8 * 1024 * 1024;
@@ -62,7 +43,7 @@ var OpenPondApiError = class extends Error {
62
43
  async function apiFetch(baseUrl, token, requestPath, options = {}) {
63
44
  const { timeoutMs = DEFAULT_API_TIMEOUT_MS, maxResponseBytes = DEFAULT_API_RESPONSE_BYTES, ...init } = options;
64
45
  const requestUrl = `${baseUrl}${requestPath}`;
65
- const headers = withVercelProtectionBypass(requestUrl, init.headers);
46
+ const headers = new Headers(init.headers);
66
47
  headers.set("Content-Type", "application/json");
67
48
  const apiKey = process.env.OPENPOND_API_KEY;
68
49
  const trimmedToken = token?.trim() || "";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/project-actions.ts", "../../cloud/src/api/vercel-protection.ts", "../../cloud/src/api/core.ts"],
4
- "sourcesContent": ["import { promises as fs } from \"node:fs\";\n\nimport { apiFetch, readApiJson } from \"@openpond/cloud/api/core\";\n\nimport type { ProjectActionBuildResult, ProjectActionRegistry } from \"../../actions/src/types.js\";\n\nexport type ProjectActionRelease = {\n id: string;\n projectId: string;\n sourceCommitSha: string;\n bundleHash: string;\n registryHash: string;\n status: string;\n createdAt: string;\n};\n\nexport type HostedProjectActionCatalog = {\n releaseId: string;\n sourceCommitSha: string;\n bundleHash: string;\n registryHash: string;\n registry: ProjectActionRegistry;\n};\n\nexport type ProjectActionInvocation<TOutput = Record<string, unknown>> = {\n id: string;\n releaseId: string;\n projectId: string;\n actionId: string;\n status: \"running\" | \"succeeded\" | \"failed\";\n resultJson: TOutput;\n traceJson: Record<string, unknown>[];\n outputJson: Record<string, unknown>[];\n failureCode?: string | null;\n failureMessage?: string | null;\n};\n\ntype ProjectActionClientInput = {\n apiKey: string;\n apiBaseUrl: string;\n};\n\nexport class OpenPondProjectActionsClient {\n readonly #apiKey: string;\n readonly #apiBaseUrl: string;\n\n constructor(input: ProjectActionClientInput) {\n this.#apiKey = input.apiKey;\n this.#apiBaseUrl = input.apiBaseUrl.replace(/\\/+$/, \"\");\n }\n\n async list(input: { projectId: string; teamId: string }): Promise<ProjectActionRelease[]> {\n const response = await apiFetch(\n this.#apiBaseUrl,\n this.#apiKey,\n projectActionPath(input.projectId, \"releases\", input.teamId),\n );\n return (await readApiJson<{ releases: ProjectActionRelease[] }>(response, \"List Project Action releases\")).releases;\n }\n\n async catalog(input: { projectId: string; teamId: string }): Promise<HostedProjectActionCatalog> {\n const response = await apiFetch(\n this.#apiBaseUrl,\n this.#apiKey,\n projectActionPath(input.projectId, \"catalog\", input.teamId),\n );\n return (await readApiJson<{ catalog: HostedProjectActionCatalog }>(response, \"Get Project Action catalog\")).catalog;\n }\n\n async publish(input: {\n projectId: string;\n teamId: string;\n sourceRef: string;\n sourceCommitSha: string;\n build: ProjectActionBuildResult;\n metadata?: Record<string, unknown>;\n }): Promise<ProjectActionRelease> {\n const [bundle, runner] = await Promise.all([\n fs.readFile(input.build.bundlePath),\n fs.readFile(input.build.runnerPath),\n ]);\n const response = await apiFetch(\n this.#apiBaseUrl,\n this.#apiKey,\n projectActionPath(input.projectId, \"releases\", input.teamId),\n {\n method: \"POST\",\n body: JSON.stringify({\n sourceRef: input.sourceRef,\n sourceCommitSha: input.sourceCommitSha,\n bundleBase64: bundle.toString(\"base64\"),\n runnerBase64: runner.toString(\"base64\"),\n registry: input.build.registry,\n manifest: input.build.manifest,\n metadata: input.metadata,\n }),\n },\n );\n return (await readApiJson<{ release: ProjectActionRelease }>(response, \"Publish Project Actions\")).release;\n }\n\n async run<TOutput = Record<string, unknown>>(input: {\n projectId: string;\n teamId: string;\n actionId: string;\n value?: Record<string, unknown>;\n releaseId?: string;\n idempotencyKey?: string;\n callerType?: \"sdk\" | \"work\" | \"scheduled_work\" | \"website\" | \"internal\";\n callerId?: string;\n signal?: AbortSignal;\n }): Promise<ProjectActionInvocation<TOutput>> {\n const response = await apiFetch(\n this.#apiBaseUrl,\n this.#apiKey,\n projectActionPath(input.projectId, `actions/${encodeURIComponent(input.actionId)}`, input.teamId),\n {\n method: \"POST\",\n body: JSON.stringify({\n input: input.value ?? {},\n releaseId: input.releaseId,\n idempotencyKey: input.idempotencyKey,\n callerType: input.callerType ?? \"sdk\",\n callerId: input.callerId,\n }),\n signal: input.signal,\n timeoutMs: 15 * 60 * 1000,\n },\n );\n return (await readApiJson<{ invocation: ProjectActionInvocation<TOutput> }>(response, \"Run Project Action\")).invocation;\n }\n}\n\nfunction projectActionPath(projectId: string, suffix: string, teamId: string): string {\n return `/v1/project-actions/${encodeURIComponent(projectId)}/${suffix}?teamId=${encodeURIComponent(teamId)}`;\n}\n", "const VERCEL_PROTECTION_BYPASS_HEADER = \"x-vercel-protection-bypass\";\n\nexport function withVercelProtectionBypass(\n requestUrl: string,\n inputHeaders?: HeadersInit,\n env: Record<string, string | undefined> =\n typeof process === \"undefined\" ? {} : process.env,\n): Headers {\n const headers = new Headers(inputHeaders);\n const secret = env.VERCEL_AUTOMATION_BYPASS_SECRET?.trim();\n if (!secret || !isOpenPondStagingUrl(requestUrl)) return headers;\n headers.set(VERCEL_PROTECTION_BYPASS_HEADER, secret);\n return headers;\n}\n\nfunction isOpenPondStagingUrl(requestUrl: string): boolean {\n try {\n const hostname = new URL(requestUrl).hostname.toLowerCase();\n return (\n hostname === \"staging.openpond.ai\" ||\n hostname === \"staging-api.openpond.ai\" ||\n hostname.endsWith(\".staging-api.openpond.ai\")\n );\n } catch {\n return false;\n }\n}\n", "import { withVercelProtectionBypass } from \"./vercel-protection.js\";\n\nconst DEFAULT_API_TIMEOUT_MS = 30_000;\nconst DEFAULT_API_RESPONSE_BYTES = 8 * 1024 * 1024;\nexport const LONG_STREAM_API_OPTIONS = { timeoutMs: 15 * 60 * 1000, maxResponseBytes: 64 * 1024 * 1024 } as const;\n\nexport type ApiFetchOptions = RequestInit & {\n 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 = withVercelProtectionBypass(requestUrl, 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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",
3
+ "sources": ["../src/project-actions.ts", "../../cloud/src/api/core.ts"],
4
+ "sourcesContent": ["import { promises as fs } from \"node:fs\";\n\nimport { apiFetch, readApiJson } from \"@openpond/cloud/api/core\";\n\nimport type { ProjectActionBuildResult, ProjectActionRegistry } from \"../../actions/src/types.js\";\n\nexport type ProjectActionRelease = {\n id: string;\n projectId: string;\n sourceCommitSha: string;\n bundleHash: string;\n registryHash: string;\n status: string;\n createdAt: string;\n};\n\nexport type HostedProjectActionCatalog = {\n releaseId: string;\n sourceCommitSha: string;\n bundleHash: string;\n registryHash: string;\n registry: ProjectActionRegistry;\n};\n\nexport type ProjectActionInvocation<TOutput = Record<string, unknown>> = {\n id: string;\n releaseId: string;\n projectId: string;\n actionId: string;\n status: \"running\" | \"succeeded\" | \"failed\";\n resultJson: TOutput;\n traceJson: Record<string, unknown>[];\n outputJson: Record<string, unknown>[];\n failureCode?: string | null;\n failureMessage?: string | null;\n};\n\ntype ProjectActionClientInput = {\n apiKey: string;\n apiBaseUrl: string;\n};\n\nexport class OpenPondProjectActionsClient {\n readonly #apiKey: string;\n readonly #apiBaseUrl: string;\n\n constructor(input: ProjectActionClientInput) {\n this.#apiKey = input.apiKey;\n this.#apiBaseUrl = input.apiBaseUrl.replace(/\\/+$/, \"\");\n }\n\n async list(input: { projectId: string; teamId: string }): Promise<ProjectActionRelease[]> {\n const response = await apiFetch(\n this.#apiBaseUrl,\n this.#apiKey,\n projectActionPath(input.projectId, \"releases\", input.teamId),\n );\n return (await readApiJson<{ releases: ProjectActionRelease[] }>(response, \"List Project Action releases\")).releases;\n }\n\n async catalog(input: { projectId: string; teamId: string }): Promise<HostedProjectActionCatalog> {\n const response = await apiFetch(\n this.#apiBaseUrl,\n this.#apiKey,\n projectActionPath(input.projectId, \"catalog\", input.teamId),\n );\n return (await readApiJson<{ catalog: HostedProjectActionCatalog }>(response, \"Get Project Action catalog\")).catalog;\n }\n\n async publish(input: {\n projectId: string;\n teamId: string;\n sourceRef: string;\n sourceCommitSha: string;\n build: ProjectActionBuildResult;\n metadata?: Record<string, unknown>;\n }): Promise<ProjectActionRelease> {\n const [bundle, runner] = await Promise.all([\n fs.readFile(input.build.bundlePath),\n fs.readFile(input.build.runnerPath),\n ]);\n const response = await apiFetch(\n this.#apiBaseUrl,\n this.#apiKey,\n projectActionPath(input.projectId, \"releases\", input.teamId),\n {\n method: \"POST\",\n body: JSON.stringify({\n sourceRef: input.sourceRef,\n sourceCommitSha: input.sourceCommitSha,\n bundleBase64: bundle.toString(\"base64\"),\n runnerBase64: runner.toString(\"base64\"),\n registry: input.build.registry,\n manifest: input.build.manifest,\n metadata: input.metadata,\n }),\n },\n );\n return (await readApiJson<{ release: ProjectActionRelease }>(response, \"Publish Project Actions\")).release;\n }\n\n async run<TOutput = Record<string, unknown>>(input: {\n projectId: string;\n teamId: string;\n actionId: string;\n value?: Record<string, unknown>;\n releaseId?: string;\n idempotencyKey?: string;\n callerType?: \"sdk\" | \"work\" | \"scheduled_work\" | \"website\" | \"internal\";\n callerId?: string;\n signal?: AbortSignal;\n }): Promise<ProjectActionInvocation<TOutput>> {\n const response = await apiFetch(\n this.#apiBaseUrl,\n this.#apiKey,\n projectActionPath(input.projectId, `actions/${encodeURIComponent(input.actionId)}`, input.teamId),\n {\n method: \"POST\",\n body: JSON.stringify({\n input: input.value ?? {},\n releaseId: input.releaseId,\n idempotencyKey: input.idempotencyKey,\n callerType: input.callerType ?? \"sdk\",\n callerId: input.callerId,\n }),\n signal: input.signal,\n timeoutMs: 15 * 60 * 1000,\n },\n );\n return (await readApiJson<{ invocation: ProjectActionInvocation<TOutput> }>(response, \"Run Project Action\")).invocation;\n }\n}\n\nfunction projectActionPath(projectId: string, suffix: string, teamId: string): string {\n return `/v1/project-actions/${encodeURIComponent(projectId)}/${suffix}?teamId=${encodeURIComponent(teamId)}`;\n}\n", "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
6
  "names": []
7
7
  }