run402 2.1.0 → 2.3.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.
package/README.md CHANGED
@@ -143,6 +143,17 @@ run402 deploy apply --manifest run402.deploy.json # manifest uses secrets.requ
143
143
 
144
144
  Secret values are write-only. `list` returns keys and timestamps only; deploy manifests should declare dependencies with `secrets.require` and never contain values.
145
145
 
146
+ ### Jobs
147
+
148
+ ```bash
149
+ run402 jobs submit --file job.json --project prj_...
150
+ run402 jobs get job_abc123 --project prj_...
151
+ run402 jobs logs job_abc123 --project prj_... --tail 100
152
+ run402 jobs cancel job_abc123 --project prj_...
153
+ ```
154
+
155
+ Jobs are fixed platform-managed runners, not arbitrary Docker execution. Submit the gateway-shaped JSON request (`job_type`, `input["input.json"]`, `max_cost_usd_micros`) and the CLI handles the required idempotency header through the SDK.
156
+
146
157
  ### Email
147
158
 
148
159
  ```bash
package/cli.mjs CHANGED
@@ -27,6 +27,7 @@ Commands:
27
27
  projects Manage projects (provision, list, query, inspect, delete)
28
28
  deploy Unified deploy operations (requires active tier)
29
29
  ci Link GitHub Actions OIDC deploy bindings
30
+ jobs Submit and inspect fixed platform-managed jobs
30
31
  functions Manage serverless functions (deploy, invoke, logs, list, delete)
31
32
  secrets Manage project secrets (set, list, delete)
32
33
  assets Direct-to-S3 asset storage (put, get, ls, rm, sign, diagnose) — up to 5 TiB
@@ -52,6 +53,7 @@ Examples:
52
53
  run402 allowance create
53
54
  run402 allowance fund
54
55
  run402 deploy apply --manifest app.json
56
+ run402 jobs submit --file job.json
55
57
  run402 projects list
56
58
  run402 projects sql <project_id> "SELECT * FROM users LIMIT 5"
57
59
  run402 functions deploy <project_id> my-fn --file handler.ts
@@ -129,6 +131,11 @@ switch (cmd) {
129
131
  await run(sub, rest);
130
132
  break;
131
133
  }
134
+ case "jobs": {
135
+ const { run } = await import("./lib/jobs.mjs");
136
+ await run(sub, rest);
137
+ break;
138
+ }
132
139
  case "functions": {
133
140
  const { run } = await import("./lib/functions.mjs");
134
141
  await run(sub, rest);
package/lib/jobs.mjs ADDED
@@ -0,0 +1,308 @@
1
+ import { readFileSync } from "node:fs";
2
+
3
+ import { getSdk } from "./sdk.mjs";
4
+ import { resolveProjectId } from "./config.mjs";
5
+ import { reportSdkError, fail } from "./sdk-errors.mjs";
6
+ import {
7
+ assertKnownFlags,
8
+ flagValue,
9
+ normalizeArgv,
10
+ parseIntegerFlag,
11
+ requirePositionalCount,
12
+ validateRegularFile,
13
+ } from "./argparse.mjs";
14
+
15
+ const HELP = `run402 jobs — Submit and inspect fixed platform-managed jobs
16
+
17
+ Usage:
18
+ run402 jobs <subcommand> [args...] [options]
19
+
20
+ Subcommands:
21
+ submit --file <path>|--stdin Submit a managed job request
22
+ get <job_id> Get a job run
23
+ logs <job_id> Read job logs
24
+ cancel <job_id> Cancel a queued or running job
25
+
26
+ Examples:
27
+ run402 jobs submit --file job.json
28
+ cat job.json | run402 jobs submit --stdin --project prj_abc123
29
+ run402 jobs get job_abc123
30
+ run402 jobs logs job_abc123 --tail 100
31
+ run402 jobs cancel job_abc123
32
+
33
+ Notes:
34
+ - --project defaults to the active project from 'run402 projects use'
35
+ - Submit requests must match the gateway jobs API shape
36
+ `;
37
+
38
+ const SUB_HELP = {
39
+ submit: `run402 jobs submit — Submit a managed job request
40
+
41
+ Usage:
42
+ run402 jobs submit --file <path> [--project <id>]
43
+ run402 jobs submit --stdin [--project <id>]
44
+
45
+ Options:
46
+ --file <path> Read the JSON submit request from a file
47
+ --stdin Read the JSON submit request from stdin
48
+ --project <id> Project ID (defaults to the active project)
49
+
50
+ Example request:
51
+ {
52
+ "job_type": "kysigned.fflonk_prove.v0_17_0",
53
+ "input": { "input.json": {} },
54
+ "max_cost_usd_micros": 50000
55
+ }
56
+ `,
57
+ get: `run402 jobs get — Get a managed job run
58
+
59
+ Usage:
60
+ run402 jobs get <job_id> [--project <id>]
61
+
62
+ Options:
63
+ --project <id> Project ID (defaults to the active project)
64
+ `,
65
+ logs: `run402 jobs logs — Read managed job logs
66
+
67
+ Usage:
68
+ run402 jobs logs <job_id> [--project <id>] [--tail <n>] [--since <epoch_ms>]
69
+
70
+ Options:
71
+ --project <id> Project ID (defaults to the active project)
72
+ --tail <n> Maximum entries to return (gateway max: 1000)
73
+ --since <ms> Only include logs at or after this epoch millisecond timestamp
74
+ `,
75
+ cancel: `run402 jobs cancel — Cancel a managed job run
76
+
77
+ Usage:
78
+ run402 jobs cancel <job_id> [--project <id>]
79
+
80
+ Options:
81
+ --project <id> Project ID (defaults to the active project)
82
+ `,
83
+ };
84
+
85
+ const PROJECT_FLAGS = ["--project"];
86
+
87
+ function parseJsonRequest(raw, source) {
88
+ let parsed;
89
+ try {
90
+ parsed = JSON.parse(raw);
91
+ } catch (err) {
92
+ fail({
93
+ code: "BAD_JSON",
94
+ message: `${source} is not valid JSON`,
95
+ details: {
96
+ source,
97
+ parse_error: err instanceof Error ? err.message : String(err),
98
+ },
99
+ });
100
+ }
101
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
102
+ fail({
103
+ code: "BAD_JSON",
104
+ message: `${source} must contain a JSON object`,
105
+ details: { source },
106
+ });
107
+ }
108
+ return parsed;
109
+ }
110
+
111
+ async function readStdinText() {
112
+ if (process.stdin?.isTTY) {
113
+ fail({
114
+ code: "BAD_USAGE",
115
+ message: "Missing JSON request on stdin.",
116
+ hint: "Pipe a job request JSON object, or use --file <path>.",
117
+ });
118
+ }
119
+ const chunks = [];
120
+ for await (const chunk of process.stdin) {
121
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));
122
+ }
123
+ if (chunks.length === 0) {
124
+ fail({
125
+ code: "BAD_USAGE",
126
+ message: "Missing JSON request on stdin.",
127
+ hint: "Pipe a job request JSON object, or use --file <path>.",
128
+ });
129
+ }
130
+ return Buffer.concat(chunks).toString("utf-8");
131
+ }
132
+
133
+ async function readSubmitRequest(args) {
134
+ const file = flagValue(args, "--file");
135
+ const stdin = args.includes("--stdin");
136
+ if (file && stdin) {
137
+ fail({
138
+ code: "BAD_USAGE",
139
+ message: "Provide exactly one request source.",
140
+ hint: "Use either --file <path> or --stdin.",
141
+ });
142
+ }
143
+ if (!file && !stdin) {
144
+ fail({
145
+ code: "BAD_USAGE",
146
+ message: "Missing job request source.",
147
+ hint: "Use --file <path> or --stdin.",
148
+ });
149
+ }
150
+ if (file) {
151
+ validateRegularFile(file, "--file");
152
+ return parseJsonRequest(readFileSync(file, "utf-8"), file);
153
+ }
154
+ return parseJsonRequest(await readStdinText(), "stdin");
155
+ }
156
+
157
+ async function submit(args = []) {
158
+ const parsed = normalizeArgv(args);
159
+ const valueFlags = ["--file", "--project"];
160
+ assertKnownFlags(parsed, ["--file", "--stdin", "--project", "--help", "-h"], valueFlags);
161
+ requirePositionalCount(parsed, valueFlags, {
162
+ max: 0,
163
+ command: "run402 jobs submit",
164
+ });
165
+ const projectId = resolveProjectId(flagValue(parsed, "--project"));
166
+ const request = await readSubmitRequest(parsed);
167
+
168
+ try {
169
+ const result = await getSdk().jobs.submit(projectId, request);
170
+ console.log(JSON.stringify(result, null, 2));
171
+ } catch (err) {
172
+ reportSdkError(err);
173
+ }
174
+ }
175
+
176
+ async function get(jobId, args = []) {
177
+ const parsed = normalizeArgv(args);
178
+ assertKnownFlags(parsed, ["--project", "--help", "-h"], PROJECT_FLAGS);
179
+ if (!jobId) {
180
+ fail({
181
+ code: "BAD_USAGE",
182
+ message: "Missing job_id.",
183
+ hint: "Use `run402 jobs get <job_id>`.",
184
+ });
185
+ }
186
+ requirePositionalCount(parsed, PROJECT_FLAGS, {
187
+ max: 0,
188
+ command: "run402 jobs get <job_id>",
189
+ });
190
+ const projectId = resolveProjectId(flagValue(parsed, "--project"));
191
+
192
+ try {
193
+ const result = await getSdk().jobs.get(projectId, jobId);
194
+ console.log(JSON.stringify(result, null, 2));
195
+ } catch (err) {
196
+ reportSdkError(err);
197
+ }
198
+ }
199
+
200
+ async function logs(jobId, args = []) {
201
+ const parsed = normalizeArgv(args);
202
+ const valueFlags = ["--project", "--tail", "--since"];
203
+ assertKnownFlags(parsed, ["--project", "--tail", "--since", "--help", "-h"], valueFlags);
204
+ if (!jobId) {
205
+ fail({
206
+ code: "BAD_USAGE",
207
+ message: "Missing job_id.",
208
+ hint: "Use `run402 jobs logs <job_id>`.",
209
+ });
210
+ }
211
+ requirePositionalCount(parsed, valueFlags, {
212
+ max: 0,
213
+ command: "run402 jobs logs <job_id>",
214
+ });
215
+ const projectId = resolveProjectId(flagValue(parsed, "--project"));
216
+ const opts = {};
217
+ const tail = flagValue(parsed, "--tail");
218
+ const since = flagValue(parsed, "--since");
219
+ if (tail !== null) opts.tail = parseIntegerFlag("--tail", tail, { min: 1, max: 1000 });
220
+ if (since !== null) opts.since = parseIntegerFlag("--since", since, { min: 0 });
221
+
222
+ try {
223
+ const result = await getSdk().jobs.logs(projectId, jobId, opts);
224
+ console.log(JSON.stringify(result, null, 2));
225
+ } catch (err) {
226
+ reportSdkError(err);
227
+ }
228
+ }
229
+
230
+ async function cancel(jobId, args = []) {
231
+ const parsed = normalizeArgv(args);
232
+ assertKnownFlags(parsed, ["--project", "--help", "-h"], PROJECT_FLAGS);
233
+ if (!jobId) {
234
+ fail({
235
+ code: "BAD_USAGE",
236
+ message: "Missing job_id.",
237
+ hint: "Use `run402 jobs cancel <job_id>`.",
238
+ });
239
+ }
240
+ requirePositionalCount(parsed, PROJECT_FLAGS, {
241
+ max: 0,
242
+ command: "run402 jobs cancel <job_id>",
243
+ });
244
+ const projectId = resolveProjectId(flagValue(parsed, "--project"));
245
+
246
+ try {
247
+ const result = await getSdk().jobs.cancel(projectId, jobId);
248
+ console.log(JSON.stringify(result, null, 2));
249
+ } catch (err) {
250
+ reportSdkError(err);
251
+ }
252
+ }
253
+
254
+ function splitJobIdArg(args = [], valueFlags = []) {
255
+ const flagsWithValues = new Set(valueFlags);
256
+ for (let i = 0; i < args.length; i += 1) {
257
+ const arg = args[i];
258
+ if (flagsWithValues.has(arg)) {
259
+ i += 1;
260
+ continue;
261
+ }
262
+ if (typeof arg === "string" && arg.startsWith("-")) continue;
263
+ return {
264
+ jobId: arg,
265
+ rest: [...args.slice(0, i), ...args.slice(i + 1)],
266
+ };
267
+ }
268
+ return { jobId: undefined, rest: args };
269
+ }
270
+
271
+ export async function run(sub, args = []) {
272
+ if (!sub || sub === "--help" || sub === "-h") {
273
+ console.log(HELP);
274
+ process.exit(0);
275
+ }
276
+ if (Array.isArray(args) && (args.includes("--help") || args.includes("-h"))) {
277
+ console.log(SUB_HELP[sub] || HELP);
278
+ process.exit(0);
279
+ }
280
+
281
+ switch (sub) {
282
+ case "submit":
283
+ await submit(args);
284
+ break;
285
+ case "get": {
286
+ const parsed = normalizeArgv(args);
287
+ const { jobId, rest } = splitJobIdArg(parsed, PROJECT_FLAGS);
288
+ await get(jobId, rest);
289
+ break;
290
+ }
291
+ case "logs": {
292
+ const parsed = normalizeArgv(args);
293
+ const { jobId, rest } = splitJobIdArg(parsed, ["--project", "--tail", "--since"]);
294
+ await logs(jobId, rest);
295
+ break;
296
+ }
297
+ case "cancel": {
298
+ const parsed = normalizeArgv(args);
299
+ const { jobId, rest } = splitJobIdArg(parsed, PROJECT_FLAGS);
300
+ await cancel(jobId, rest);
301
+ break;
302
+ }
303
+ default:
304
+ console.error(`Unknown subcommand: ${sub}\n`);
305
+ console.log(HELP);
306
+ process.exit(1);
307
+ }
308
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "run402",
3
- "version": "2.1.0",
3
+ "version": "2.3.0",
4
4
  "description": "CLI for Run402 — provision Postgres databases, deploy static sites, generate images, and manage wallets via x402 and MPP micropayments.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -26,6 +26,7 @@ import { Contracts } from "./namespaces/contracts.js";
26
26
  import { Admin } from "./namespaces/admin.js";
27
27
  import { Deploy } from "./namespaces/deploy.js";
28
28
  import { Ci } from "./namespaces/ci.js";
29
+ import { Jobs } from "./namespaces/jobs.js";
29
30
  import type { ContentSource, FileSet } from "./namespaces/deploy.types.js";
30
31
  import { ScopedRun402 } from "./scoped.js";
31
32
  export interface Run402Options {
@@ -70,6 +71,7 @@ export declare class Run402 {
70
71
  */
71
72
  readonly _applyEngine: Deploy;
72
73
  readonly ci: Ci;
74
+ readonly jobs: Jobs;
73
75
  constructor(opts: Run402Options);
74
76
  /**
75
77
  * Return a project-scoped sub-client where every project-id-bearing namespace
@@ -151,6 +153,7 @@ export type { ByteReader } from "./namespaces/deploy.js";
151
153
  export type * from "./namespaces/domains.js";
152
154
  export type * from "./namespaces/email.js";
153
155
  export type * from "./namespaces/functions.types.js";
156
+ export type * from "./namespaces/jobs.js";
154
157
  export type * from "./namespaces/projects.types.js";
155
158
  export type * from "./namespaces/secrets.js";
156
159
  export type * from "./namespaces/sender-domain.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,WAAW,EAAE,mBAAmB,CAAC;IACjC;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,qBAAa,MAAM;;IACjB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IAChB,QAAQ,CAAC,KAAK,EAAG,EAAE,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB;;;;;;OAMG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IAChB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;gBAIR,IAAI,EAAE,aAAa;IA8D/B;;;;;;;;;;;;;;;;OAgBG;IACG,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAsBjD;;;;;;;;;;;OAWG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAIpD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,OAAO,CAEpE;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAElD;AAED,OAAO,EACL,WAAW,EACX,eAAe,EACf,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,UAAU,EACV,cAAc,EACd,YAAY,EACZ,aAAa,EACb,sBAAsB,EACtB,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,mBAAmB,YAAY,CAAC;AAChC,mBAAmB,kBAAkB,CAAC;AACtC,mBAAmB,aAAa,CAAC;AACjC,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,mBAAmB,qBAAqB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EACL,8BAA8B,EAC9B,kBAAkB,EAClB,yBAAyB,EACzB,uBAAuB,EACvB,wBAAwB,EACxB,6BAA6B,EAC7B,+BAA+B,EAC/B,qBAAqB,GACtB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,EAAE,EACF,WAAW,EACX,wBAAwB,EACxB,0BAA0B,EAC1B,8BAA8B,EAC9B,qBAAqB,EACrB,4BAA4B,EAC5B,sBAAsB,EACtB,4BAA4B,EAC5B,0BAA0B,EAC1B,sBAAsB,EACtB,2BAA2B,EAC3B,eAAe,EACf,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,mBAAmB,uBAAuB,CAAC;AAC3C,mBAAmB,oBAAoB,CAAC;AACxC,mBAAmB,2BAA2B,CAAC;AAC/C,mBAAmB,sBAAsB,CAAC;AAC1C,mBAAmB,sBAAsB,CAAC;AAC1C,mBAAmB,yBAAyB,CAAC;AAC7C,mBAAmB,8BAA8B,CAAC;AAClD,mBAAmB,0BAA0B,CAAC;AAC9C,mBAAmB,2BAA2B,CAAC;AAC/C,mBAAmB,8BAA8B,CAAC;AAClD,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,mBAAmB,yBAAyB,CAAC;AAC7C,mBAAmB,uBAAuB,CAAC;AAC3C,mBAAmB,iCAAiC,CAAC;AACrD,mBAAmB,sBAAsB,CAAC;AAC1C,mBAAmB,gCAAgC,CAAC;AACpD,mBAAmB,yBAAyB,CAAC;AAC7C,mBAAmB,+BAA+B,CAAC;AACnD,mBAAmB,yBAAyB,CAAC;AAC7C,mBAAmB,uBAAuB,CAAC;AAC3C,mBAAmB,4BAA4B,CAAC;AAChD,mBAAmB,sBAAsB,CAAC"}
package/sdk/dist/index.js CHANGED
@@ -26,6 +26,7 @@ import { Contracts } from "./namespaces/contracts.js";
26
26
  import { Admin } from "./namespaces/admin.js";
27
27
  import { Deploy } from "./namespaces/deploy.js";
28
28
  import { Ci } from "./namespaces/ci.js";
29
+ import { Jobs } from "./namespaces/jobs.js";
29
30
  import { ScopedRun402 } from "./scoped.js";
30
31
  import { LocalError } from "./errors.js";
31
32
  export class Run402 {
@@ -57,6 +58,7 @@ export class Run402 {
57
58
  */
58
59
  _applyEngine;
59
60
  ci;
61
+ jobs;
60
62
  #client;
61
63
  constructor(opts) {
62
64
  if (!opts || typeof opts !== "object") {
@@ -103,6 +105,7 @@ export class Run402 {
103
105
  this.admin = new Admin(client);
104
106
  this._applyEngine = new Deploy(client);
105
107
  this.ci = new Ci(client);
108
+ this.jobs = new Jobs(client);
106
109
  }
107
110
  /**
108
111
  * Return a project-scoped sub-client where every project-id-bearing namespace
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAkC,MAAM,aAAa,CAAC;AAE1E,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAezC,MAAM,OAAO,MAAM;IACR,QAAQ,CAAW;IACnB,MAAM,CAAS;IACf,SAAS,CAAY;IACrB,OAAO,CAAU;IACjB,UAAU,CAAa;IACvB,OAAO,CAAU;IACjB,KAAK,CAAQ;IACb,OAAO,CAAU;IACjB,IAAI,CAAO;IACX,SAAS,CAAY;IACrB,EAAE,CAAK;IACP,KAAK,CAAM;IACX,IAAI,CAAO;IACX,YAAY,CAAe;IAC3B,OAAO,CAAU;IACjB,IAAI,CAAO;IACX,KAAK,CAAQ;IACb,SAAS,CAAY;IACrB,KAAK,CAAQ;IACtB;;;;;;OAMG;IACM,YAAY,CAAS;IACrB,EAAE,CAAK;IACP,IAAI,CAAO;IAEX,OAAO,CAAS;IAEzB,YAAY,IAAmB;QAC7B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtC,MAAM,IAAI,UAAU,CAClB,mCAAmC,EACnC,qBAAqB,CACtB,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACtD,MAAM,IAAI,UAAU,CAClB,mDAAmD,EACnD,qBAAqB,CACtB,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,UAAU,CAClB,gKAAgK,EAChK,qBAAqB,CACtB,CAAC;QACJ,CAAC;QACD,IACE,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,KAAK,UAAU;YAC9C,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,KAAK,UAAU,EACjD,CAAC;YACD,MAAM,IAAI,UAAU,CAClB,+EAA+E,EAC/E,qBAAqB,CACtB,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAiB;YAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;YACtD,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;QACF,MAAM,MAAM,GAAW,WAAW,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;QACzB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE;YACnC,KAAK,EAAE,IAAI,CAAC,EAAE;YACd,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,CAAC,OAAO,CAAC,EAAW;QACvB,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,gBAAgB,CAAC;YACzD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,UAAU,CAClB,yIAAyI,EACzI,2BAA2B,CAC5B,CAAC;YACJ,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAC3D,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,UAAU,CAClB,yIAAyI,EACzI,2BAA2B,CAC5B,CAAC;YACJ,CAAC;YACD,UAAU,GAAG,MAAM,CAAC;QACtB,CAAC;QACD,OAAO,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC1D,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,UAAU,CAAC,EAAU;QACzB,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;CACF;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,KAAK,CAAC,MAAqC;IACzD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,IAAmB;IACxC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,OAAO,EACL,WAAW,EACX,eAAe,EACf,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,UAAU,EACV,cAAc,EACd,YAAY,EACZ,aAAa,EACb,sBAAsB,EACtB,aAAa,GACd,MAAM,aAAa,CAAC;AAOrB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAIvC,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EACL,8BAA8B,EAC9B,kBAAkB,EAClB,yBAAyB,EACzB,uBAAuB,EACvB,wBAAwB,EACxB,6BAA6B,EAC7B,+BAA+B,EAC/B,qBAAqB,GACtB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,EAAE,EACF,WAAW,EACX,wBAAwB,EACxB,0BAA0B,EAC1B,8BAA8B,EAC9B,qBAAqB,EACrB,4BAA4B,EAC5B,sBAAsB,EACtB,4BAA4B,EAC5B,0BAA0B,EAC1B,sBAAsB,EACtB,2BAA2B,EAC3B,eAAe,EACf,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/namespaces/assets.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,KAAK,EAGV,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,cAAc,EACd,aAAa,EACb,aAAa,EACb,eAAe,EACf,cAAc,EACd,yBAAyB,EACzB,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAiQ3B,qBAAa,MAAM;IACL,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAE3C;;;;;;;;;;OAUG;IACG,GAAG,CACP,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,aAAa,EACrB,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,aAAa,CAAC;IA+FzB;;;;;;;OAOG;IACG,iBAAiB,CACrB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,oBAAoB,CAAC;IAShC;;OAEG;IACG,gBAAgB,CACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,sBAAsB,CAAC;IAQlC;;OAEG;IACG,qBAAqB,CACzB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,yBAA8B,EACrC,MAAM,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO,GACpC,OAAO,CAAC,wBAAwB,CAAC;IAQpC;;;;;;;;;;;;;;;;;;;OAmBG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAchF;;;;;;;;;;;;;;;;;OAiBG;IACG,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,mBAAmB,CAAC;IA6C/B;;;;;;;OAOG;IACG,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAuB5D,oDAAoD;IAC9C,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,CAAC;IAwB5E,+DAA+D;IACzD,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcvD,6FAA6F;IACvF,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC;CAwBhG"}
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/namespaces/assets.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,KAAK,EAGV,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,cAAc,EACd,aAAa,EACb,aAAa,EACb,eAAe,EACf,cAAc,EACd,yBAAyB,EACzB,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAoY3B,qBAAa,MAAM;IACL,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAE3C;;;;;;;;;;OAUG;IACG,GAAG,CACP,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,aAAa,EACrB,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,aAAa,CAAC;IAiHzB;;;;;;;OAOG;IACG,iBAAiB,CACrB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,oBAAoB,CAAC;IAShC;;OAEG;IACG,gBAAgB,CACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,sBAAsB,CAAC;IAQlC;;OAEG;IACG,qBAAqB,CACzB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,yBAA8B,EACrC,MAAM,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO,GACpC,OAAO,CAAC,wBAAwB,CAAC;IAQpC;;;;;;;;;;;;;;;;;;;OAmBG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAchF;;;;;;;;;;;;;;;;;OAiBG;IACG,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,mBAAmB,CAAC;IA6C/B;;;;;;;OAOG;IACG,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAuB5D,oDAAoD;IAC9C,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,CAAC;IAwB5E,+DAA+D;IACzD,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcvD,6FAA6F;IACvF,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC;CAwBhG"}
@@ -140,6 +140,26 @@ function buildAssetRef(resp, contentType) {
140
140
  }
141
141
  return { url: cdnUrl, sri };
142
142
  }
143
+ // v1.49+ image-variant convenience computation. The gateway signals
144
+ // "this is an image" by populating `variant_spec_version` (always) or
145
+ // `width_px` (always for image MIMEs, even sub-320). For non-images both
146
+ // are absent. We thread this signal into `thumbUrl` / `displayUrl` so
147
+ // TypeScript narrows correctly: non-image refs return `undefined` from
148
+ // both getters and a picker can't accidentally `<img src={pdfRef.thumbUrl}>`.
149
+ const isImage = resp.variant_spec_version !== undefined || resp.width_px !== undefined;
150
+ // Source dimensions are display-oriented (gateway runs EXIF auto-rotate).
151
+ const widthPx = resp.width_px;
152
+ const heightPx = resp.height_px;
153
+ const variants = resp.variants;
154
+ // For non-HEIC images, gateway sets display_url === cdn_url. For HEIC it
155
+ // points to the JPEG transcode. For sub-320 images that have no `variants`,
156
+ // display_url is still populated.
157
+ const displayUrl = isImage
158
+ ? resp.display_url ?? resp.cdn_url ?? undefined
159
+ : undefined;
160
+ const thumbUrl = isImage
161
+ ? variants?.thumb?.cdn_url ?? displayUrl
162
+ : undefined;
143
163
  return {
144
164
  key: resp.key,
145
165
  size_bytes: resp.size_bytes,
@@ -158,6 +178,22 @@ function buildAssetRef(resp, contentType) {
158
178
  contentDigest,
159
179
  cacheKind,
160
180
  cdn,
181
+ // v1.49+ image-variant fields. Only set when present on the wire — we
182
+ // intentionally omit (vs. setting to `undefined` explicitly) so the
183
+ // shape is byte-identical to pre-v1.49 for non-images.
184
+ ...(resp.width_px !== undefined ? { width_px: resp.width_px } : {}),
185
+ ...(resp.height_px !== undefined ? { height_px: resp.height_px } : {}),
186
+ ...(resp.blurhash !== undefined ? { blurhash: resp.blurhash } : {}),
187
+ ...(resp.variant_spec_version !== undefined
188
+ ? { variant_spec_version: resp.variant_spec_version }
189
+ : {}),
190
+ ...(resp.display_url !== undefined ? { display_url: resp.display_url } : {}),
191
+ ...(resp.display_immutable_url !== undefined
192
+ ? { display_immutable_url: resp.display_immutable_url }
193
+ : {}),
194
+ ...(variants !== undefined ? { variants } : {}),
195
+ ...(thumbUrl !== undefined ? { thumbUrl } : {}),
196
+ ...(displayUrl !== undefined ? { displayUrl } : {}),
161
197
  scriptTag(opts) {
162
198
  // Default `defer: true` — modern best practice. Defer prevents
163
199
  // render-blocking when placed in <head> and is a no-op when placed
@@ -205,9 +241,82 @@ function buildAssetRef(resp, contentType) {
205
241
  // so it's still stable across re-deploys. Agents who need
206
242
  // byte-level integrity for images should verify Content-Digest
207
243
  // server-side.
208
- const { url } = requireImmutable("imgTag");
244
+ //
245
+ // v1.49+ HEIC handling: when the source is HEIC/HEIF, `cdn_url`
246
+ // serves the original (unrenderable) HEIC bytes and `display_url`
247
+ // serves a generated JPEG transcode. We default `<img src>` to
248
+ // `display_url ?? cdn_url` so HEIC uploads render without the
249
+ // caller knowing about it. For non-HEIC images `display_url ===
250
+ // cdn_url`, so this is a no-op there.
251
+ const { url: immutableCdnUrl } = requireImmutable("imgTag");
252
+ const src = displayUrl ?? immutableCdnUrl;
209
253
  const a = alt ?? "";
210
- return `<img src="${escapeHtmlAttr(url)}" alt="${escapeHtmlAttr(a)}" loading="lazy" decoding="async">`;
254
+ const attrs = [`src="${escapeHtmlAttr(src)}"`, `alt="${escapeHtmlAttr(a)}"`];
255
+ // v1.49+ width/height emission. When both dimensions are known
256
+ // the browser reserves layout space and avoids Cumulative Layout
257
+ // Shift. Skip silently when either is missing (non-image, sub-320
258
+ // pre-v1.49 source, etc.) — `imgTag` never errors on absence.
259
+ if (widthPx !== undefined && heightPx !== undefined) {
260
+ attrs.push(`width="${widthPx}"`);
261
+ attrs.push(`height="${heightPx}"`);
262
+ }
263
+ attrs.push(`loading="lazy"`, `decoding="async"`);
264
+ return `<img ${attrs.join(" ")}>`;
265
+ },
266
+ imgTagWithSrcSet(opts) {
267
+ // Hard guard #1: opts.sizes must be a non-empty string. Without
268
+ // it, browsers conservatively download the largest candidate in
269
+ // srcset (defeating the variant set). Default-to-100vw would be
270
+ // wrong for any grid layout, so we throw and force the caller to
271
+ // think about sizes once instead of shipping a silent footgun.
272
+ if (!opts ||
273
+ typeof opts.sizes !== "string" ||
274
+ opts.sizes.trim() === "") {
275
+ throw new LocalError(`imgTagWithSrcSet requires opts.sizes (e.g. '(max-width: 800px) 100vw, 1920px') — browsers over-fetch the largest srcset candidate without it.`, "rendering responsive image");
276
+ }
277
+ // Hard guard #2: variants must include all three WebP sizes.
278
+ // Non-image refs, sub-320 images, and pre-v1.49 uploads land here
279
+ // with `variants` undefined or missing one of the three. Silent
280
+ // fallback would render a busted layout (no srcset, no responsive
281
+ // benefit) with no diagnostic, so we throw and tell the caller to
282
+ // use `imgTag()` instead.
283
+ const thumb = variants?.thumb;
284
+ const medium = variants?.medium;
285
+ const large = variants?.large;
286
+ if (!thumb || !medium || !large) {
287
+ throw new LocalError(`imgTagWithSrcSet called on an AssetRef without variants. Variants are generated only for image MIMEs ≥320×320 against a v1.49+ gateway. Use imgTag() instead for non-image refs, sub-320 images, or older gateway responses.`, "rendering responsive image");
288
+ }
289
+ // The <img> fallback must use display_url for HEIC sources
290
+ // (browsers can't render HEIC bytes). For non-HEIC images
291
+ // display_url === cdn_url. cdnUrl from the AssetRef widening is
292
+ // the immutable form; here we prefer display_url which the
293
+ // gateway already pinned to the right variant.
294
+ const fallbackSrc = displayUrl ?? cdnUrl ?? "";
295
+ const altAttr = `alt="${escapeHtmlAttr(opts.alt ?? "")}"`;
296
+ const loadingAttr = `loading="${opts.loading === "eager" ? "eager" : "lazy"}"`;
297
+ const srcset = [
298
+ `${thumb.cdn_url} ${thumb.width_px}w`,
299
+ `${medium.cdn_url} ${medium.width_px}w`,
300
+ `${large.cdn_url} ${large.width_px}w`,
301
+ ].join(", ");
302
+ const sizes = opts.sizes;
303
+ const imgAttrs = [
304
+ `src="${escapeHtmlAttr(fallbackSrc)}"`,
305
+ altAttr,
306
+ ];
307
+ // AVIF deferred from v1: <picture> picks sources by type
308
+ // precedence, not best size. A single 1920w AVIF would be picked
309
+ // for thumbnails by AVIF-capable browsers, defeating the variant
310
+ // set. AVIF, if it returns, will land at all three sizes or via
311
+ // a dedicated imgTagHero() helper.
312
+ if (widthPx !== undefined && heightPx !== undefined) {
313
+ imgAttrs.push(`width="${widthPx}"`);
314
+ imgAttrs.push(`height="${heightPx}"`);
315
+ }
316
+ imgAttrs.push(loadingAttr, `decoding="async"`);
317
+ const sourceLine = `<source type="image/webp" srcset="${escapeHtmlAttr(srcset)}" sizes="${escapeHtmlAttr(sizes)}">`;
318
+ const imgLine = `<img ${imgAttrs.join(" ")}>`;
319
+ return `<picture>${sourceLine}${imgLine}</picture>`;
211
320
  },
212
321
  };
213
322
  }
@@ -292,6 +401,11 @@ export class Assets {
292
401
  // Widen AssetManifestEntry → BlobPutResult (AssetRef shape with
293
402
  // scriptTag/linkTag/imgTag emitters). The integrity fields and CDN
294
403
  // envelope are derived from the same SHA the gateway resolved.
404
+ // v1.49+: image-variant fields (width_px/height_px/blurhash/variants/
405
+ // display_url/display_immutable_url/variant_spec_version) are
406
+ // threaded through `AssetManifestEntry` by
407
+ // `buildAssetManifestFromPlanEntries` in deploy.ts. They're optional
408
+ // and absent for non-image MIMEs.
295
409
  const sha = entry.sha256;
296
410
  const completion = {
297
411
  key: entry.key,
@@ -304,6 +418,19 @@ export class Assets {
304
418
  cdn_url: entry.cdn_url,
305
419
  cdn_immutable_url: entry.cdn_immutable_url,
306
420
  immutable_suffix: null,
421
+ // v1.49+ image-variant pass-through. Only set when present so the
422
+ // shape stays bytewise-identical to pre-v1.49 for non-images.
423
+ ...(entry.width_px !== undefined ? { width_px: entry.width_px } : {}),
424
+ ...(entry.height_px !== undefined ? { height_px: entry.height_px } : {}),
425
+ ...(entry.blurhash !== undefined ? { blurhash: entry.blurhash } : {}),
426
+ ...(entry.variant_spec_version !== undefined
427
+ ? { variant_spec_version: entry.variant_spec_version }
428
+ : {}),
429
+ ...(entry.display_url !== undefined ? { display_url: entry.display_url } : {}),
430
+ ...(entry.display_immutable_url !== undefined
431
+ ? { display_immutable_url: entry.display_immutable_url }
432
+ : {}),
433
+ ...(entry.variants !== undefined ? { variants: entry.variants } : {}),
307
434
  };
308
435
  return buildAssetRef(completion, contentType);
309
436
  }