@12ui/design 0.2.14 → 0.2.15

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 (77) hide show
  1. package/dist/bounded-concurrency.d.ts +13 -0
  2. package/dist/bounded-concurrency.d.ts.map +1 -0
  3. package/dist/bounded-concurrency.js +43 -0
  4. package/dist/bounded-concurrency.js.map +1 -0
  5. package/dist/branch-downloads.d.ts +10 -0
  6. package/dist/branch-downloads.d.ts.map +1 -1
  7. package/dist/branch-downloads.js +20 -0
  8. package/dist/branch-downloads.js.map +1 -1
  9. package/dist/branch-execution.d.ts +2 -0
  10. package/dist/branch-execution.d.ts.map +1 -1
  11. package/dist/branch-execution.js +157 -38
  12. package/dist/branch-execution.js.map +1 -1
  13. package/dist/branch-materialize.d.ts +23 -12
  14. package/dist/branch-materialize.d.ts.map +1 -1
  15. package/dist/branch-materialize.js +55 -38
  16. package/dist/branch-materialize.js.map +1 -1
  17. package/dist/branch-page-conversion.d.ts +93 -5
  18. package/dist/branch-page-conversion.d.ts.map +1 -1
  19. package/dist/branch-page-conversion.js +356 -180
  20. package/dist/branch-page-conversion.js.map +1 -1
  21. package/dist/branch-progress.d.ts +24 -0
  22. package/dist/branch-progress.d.ts.map +1 -1
  23. package/dist/branch-progress.js +35 -6
  24. package/dist/branch-progress.js.map +1 -1
  25. package/dist/branch-run-record.d.ts +11 -0
  26. package/dist/branch-run-record.d.ts.map +1 -1
  27. package/dist/branch-run-record.js.map +1 -1
  28. package/dist/branch-status.d.ts.map +1 -1
  29. package/dist/branch-status.js +3 -0
  30. package/dist/branch-status.js.map +1 -1
  31. package/dist/cli-arguments.d.ts.map +1 -1
  32. package/dist/cli-arguments.js +1 -0
  33. package/dist/cli-arguments.js.map +1 -1
  34. package/dist/cli-branch-command.d.ts +10 -1
  35. package/dist/cli-branch-command.d.ts.map +1 -1
  36. package/dist/cli-branch-command.js +60 -11
  37. package/dist/cli-branch-command.js.map +1 -1
  38. package/dist/cli-capabilities.d.ts +25 -2
  39. package/dist/cli-capabilities.d.ts.map +1 -1
  40. package/dist/cli-capabilities.js +24 -1
  41. package/dist/cli-capabilities.js.map +1 -1
  42. package/dist/cli-package-command.d.ts +11 -0
  43. package/dist/cli-package-command.d.ts.map +1 -1
  44. package/dist/cli-package-command.js +24 -8
  45. package/dist/cli-package-command.js.map +1 -1
  46. package/dist/cli-progress.d.ts +81 -5
  47. package/dist/cli-progress.d.ts.map +1 -1
  48. package/dist/cli-progress.js +108 -5
  49. package/dist/cli-progress.js.map +1 -1
  50. package/dist/cli.js +17 -7
  51. package/dist/cli.js.map +1 -1
  52. package/dist/conversion-receipt.d.ts +127 -0
  53. package/dist/conversion-receipt.d.ts.map +1 -0
  54. package/dist/conversion-receipt.js +184 -0
  55. package/dist/conversion-receipt.js.map +1 -0
  56. package/dist/index.d.ts +1 -1
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +1 -1
  59. package/dist/index.js.map +1 -1
  60. package/dist/legacy-skill-catalog.d.ts.map +1 -1
  61. package/dist/legacy-skill-catalog.js +25 -0
  62. package/dist/legacy-skill-catalog.js.map +1 -1
  63. package/dist/package-client.d.ts +28 -0
  64. package/dist/package-client.d.ts.map +1 -1
  65. package/dist/package-client.js +21 -1
  66. package/dist/package-client.js.map +1 -1
  67. package/dist/package-source-refusal.d.ts +17 -0
  68. package/dist/package-source-refusal.d.ts.map +1 -0
  69. package/dist/package-source-refusal.js +61 -0
  70. package/dist/package-source-refusal.js.map +1 -0
  71. package/dist/package-submission.d.ts +31 -0
  72. package/dist/package-submission.d.ts.map +1 -1
  73. package/dist/package-submission.js +30 -7
  74. package/dist/package-submission.js.map +1 -1
  75. package/package.json +1 -1
  76. package/skills/design/SKILL.md +4 -1
  77. package/skills/design-branch/SKILL.md +3 -2
@@ -1,206 +1,382 @@
1
- import { readFile } from 'node:fs/promises';
2
1
  import { branchPackageKey } from './branch-identity.js';
2
+ import { BRANCH_PAGE_CONCURRENCY_DEFAULT } from './cli-progress.js';
3
+ import { createConcurrencyLimiter } from './bounded-concurrency.js';
4
+ import { readBranchScreenBytes } from './branch-downloads.js';
5
+ import { reusableConversionId, } from './conversion-receipt.js';
3
6
  import { normalizePageViewports, } from './branch-viewport-normalization.js';
7
+ import { isSourceConversionRefusal, sourceConversionRefusalViewportId, } from './package-source-refusal.js';
4
8
  import { submitConversionPackage, } from './package-submission.js';
5
9
  export const WINNER_VIEWPORT_ID = 'winner';
6
- const readScreenBytes = async (screen) => (new Uint8Array(await readFile(screen.path)));
10
+ export const DEFAULT_PACKAGE_MODEL = 'standard';
7
11
  const orderedViewports = (plan, page) => plan.screens
8
12
  .filter((screen) => page.slots.includes(screen.slot))
9
13
  .sort((left, right) => left.viewportOrdinal - right.viewportOrdinal)
10
14
  .map((screen) => ({ slot: screen.slot, ordinal: screen.viewportOrdinal }));
11
- export const convertBranchPages = async (args) => {
12
- const conversions = new Map();
13
- for (const page of args.plan.pages) {
14
- const planned = orderedViewports(args.plan, page);
15
- const missing = planned.filter((viewport) => !args.screens.has(viewport.slot));
16
- if (missing.length > 0) {
17
- conversions.set(page.id, {
18
- status: 'skipped',
19
- reason: `Page ${page.id} is missing screen(s) ${missing.map((entry) => entry.slot).join(', ')},`
20
- + ' so its viewports do not stack into a whole page. The screens that did land are on'
21
- + ' disk; redraw the gap and re-run with --resume before converting this page.',
22
- });
23
- continue;
24
- }
25
- // Collect the page's pixels first, tagging which side declares the width.
26
- const sources = [];
27
- if (page.startsFromWinner) {
28
- if (!args.winner) {
29
- conversions.set(page.id, {
30
- status: 'skipped',
31
- reason: `Page ${page.id} starts from the approved screen, whose bytes are not available`
32
- + ' locally, so viewport 1 of the page is missing.',
33
- });
34
- continue;
35
- }
36
- const bytes = await readScreenBytes(args.winner);
37
- sources.push({
38
- ordinal: 1,
39
- path: args.winner.path,
40
- input: {
41
- id: WINNER_VIEWPORT_ID,
42
- bytes,
43
- mediaType: 'image/png',
44
- width: args.winner.width,
45
- height: args.winner.height,
46
- // The winner came from somewhere else; it is the side that moves.
47
- canonical: false,
48
- },
49
- });
50
- }
51
- for (const viewport of planned) {
52
- const screen = args.screens.get(viewport.slot);
53
- sources.push({
15
+ /**
16
+ * The reuse claim, gated on proof rather than on intent.
17
+ *
18
+ * A normalized winner is no longer the bytes any earlier conversion was
19
+ * admitted with, so a declared `--source-conversion-id` would assert a digest
20
+ * the server will disprove and turn a convertible page into a failed one. A
21
+ * receipt is keyed on the bytes actually submitted, so it survives
22
+ * normalization — the same approved design reconciled to the same server canvas
23
+ * produces the same bytes — and it is only honoured on an exact digest match.
24
+ */
25
+ export const winnerReuseConversionId = (args) => {
26
+ if (args.settings.sourceConversionId && !args.normalized)
27
+ return args.settings.sourceConversionId;
28
+ return reusableConversionId({
29
+ receipts: args.receipts,
30
+ sha256: args.submittedSha256,
31
+ model: args.model,
32
+ boughtBy: args.runId,
33
+ });
34
+ };
35
+ /**
36
+ * The same page, with the attachment the server just disproved dropped.
37
+ *
38
+ * A reuse claim is proved against durable evidence BEFORE the package row
39
+ * exists, so its refusal costs nothing and leaves nothing behind: the identical
40
+ * request without the attachment is a first admission, not a second one. The
41
+ * page's key is derived from the run, the page, and the ordered digests of the
42
+ * bytes being submitted (`branchPackageKey`) — never from the attachment — so
43
+ * the retry replays under the SAME key and the reuse stays what it always was:
44
+ * an optimisation over bytes the page is carrying anyway.
45
+ *
46
+ * Null when the failure is not that refusal, or names no attachment this page
47
+ * actually sent. Then there is nothing a retry would change, and the page
48
+ * settles failed exactly as it did before.
49
+ */
50
+ const withoutRefusedAttachment = (viewports, error) => {
51
+ if (!isSourceConversionRefusal(error))
52
+ return null;
53
+ const attached = viewports.filter((viewport) => viewport.sourceConversionId);
54
+ const named = sourceConversionRefusalViewportId(error);
55
+ const refused = named === null
56
+ ? attached
57
+ : attached.filter((viewport) => viewport.id === named);
58
+ // A refusal naming a viewport that carried no attachment is a contract this
59
+ // client does not recognise; dropping every attachment is then the only
60
+ // reading that can still be right.
61
+ const dropped = refused.length > 0 ? refused : attached;
62
+ if (dropped.length === 0)
63
+ return null;
64
+ const dropping = new Set(dropped.map((viewport) => viewport.id));
65
+ return {
66
+ viewports: viewports.map((viewport) => (dropping.has(viewport.id)
67
+ // Rebuilt without the claim, and with the bytes it was always carrying.
68
+ ? {
69
+ id: viewport.id,
54
70
  ordinal: viewport.ordinal,
55
- path: screen.path,
56
- input: {
57
- id: viewport.slot,
58
- bytes: await readScreenBytes(screen),
59
- mediaType: 'image/png',
60
- width: screen.width,
61
- height: screen.height,
62
- // Drawn by the server on the run's fixed canvas: this is the width.
63
- canonical: true,
64
- },
65
- });
66
- }
67
- let normalization;
68
- try {
69
- normalization = await normalizePageViewports(sources.map((entry) => entry.input));
70
- }
71
- catch (error) {
72
- conversions.set(page.id, {
73
- status: 'failed',
74
- output: args.settings.output,
75
- error: error instanceof Error ? error.message : String(error),
76
- });
77
- continue;
78
- }
79
- const normalizedById = new Map(normalization.viewports.map((entry) => [entry.id, entry]));
80
- const viewports = sources.map((entry) => {
81
- const resolved = normalizedById.get(entry.input.id);
82
- // A normalized winner is no longer the bytes any earlier conversion was
83
- // admitted with, so the reuse claim would be false. Buy it instead of
84
- // asserting a digest the server will disprove.
85
- const reuse = entry.input.id === WINNER_VIEWPORT_ID
86
- && args.settings.sourceConversionId
87
- && !resolved.normalized;
71
+ imagePath: viewport.imagePath,
72
+ bytes: viewport.bytes,
73
+ mediaType: viewport.mediaType,
74
+ }
75
+ : viewport)),
76
+ disproven: dropped.map((viewport) => ({
77
+ viewportId: viewport.id,
78
+ conversionId: viewport.sourceConversionId,
79
+ detail: error.message,
80
+ })),
81
+ };
82
+ };
83
+ export const convertBranchPage = async (args) => {
84
+ const { page } = args;
85
+ const planned = orderedViewports(args.plan, page);
86
+ const missing = planned.filter((viewport) => !args.screens.has(viewport.slot));
87
+ if (missing.length > 0) {
88
+ return {
89
+ status: 'skipped',
90
+ reason: `Page ${page.id} is missing screen(s) ${missing.map((entry) => entry.slot).join(', ')},`
91
+ + ' so its viewports do not stack into a whole page. The screens that did land are on'
92
+ + ' disk; redraw the gap and re-run with --resume before converting this page.',
93
+ };
94
+ }
95
+ // Collect the page's pixels first, tagging which side declares the width.
96
+ const sources = [];
97
+ if (page.startsFromWinner) {
98
+ if (!args.winner) {
88
99
  return {
89
- id: entry.input.id,
90
- ordinal: entry.ordinal,
91
- imagePath: entry.path,
92
- bytes: resolved.bytes,
93
- mediaType: resolved.mediaType,
94
- ...(reuse ? { sourceConversionId: args.settings.sourceConversionId } : {}),
95
- };
96
- });
97
- if (viewports.length === 0) {
98
- conversions.set(page.id, {
99
100
  status: 'skipped',
100
- reason: `Page ${page.id} has no viewport to convert.`,
101
- });
102
- continue;
103
- }
104
- if (viewports.length === 1 && page.startsFromWinner) {
105
- conversions.set(page.id, {
106
- status: 'skipped',
107
- reason: 'The approved screen already is the whole page — the server planned no'
108
- + ' continuations for it. Convert it on its own with'
109
- + ' `12ui convert <winner> --output layerdoc --export html`.',
110
- });
111
- continue;
101
+ reason: `Page ${page.id} starts from the approved screen, whose bytes are not available`
102
+ + ' locally, so viewport 1 of the page is missing.',
103
+ };
112
104
  }
113
- const input = {
114
- id: page.id,
115
- ordinal: page.index,
116
- kind: page.kind,
117
- ...(page.title ? { title: page.title } : {}),
118
- ...(page.purpose ? { purpose: page.purpose } : {}),
119
- viewports,
105
+ sources.push({
106
+ ordinal: 1,
107
+ path: args.winner.path,
108
+ input: {
109
+ id: WINNER_VIEWPORT_ID,
110
+ bytes: await readBranchScreenBytes(args.winner),
111
+ mediaType: 'image/png',
112
+ width: args.winner.width,
113
+ height: args.winner.height,
114
+ // The winner came from somewhere else; it is the side that moves.
115
+ canonical: false,
116
+ },
117
+ });
118
+ }
119
+ for (const viewport of planned) {
120
+ const screen = args.screens.get(viewport.slot);
121
+ sources.push({
122
+ ordinal: viewport.ordinal,
123
+ path: screen.path,
124
+ input: {
125
+ id: viewport.slot,
126
+ bytes: await readBranchScreenBytes(screen),
127
+ mediaType: 'image/png',
128
+ width: screen.width,
129
+ height: screen.height,
130
+ // Drawn by the server on the run's fixed canvas: this is the width.
131
+ canonical: true,
132
+ },
133
+ });
134
+ }
135
+ const model = args.settings.model ?? DEFAULT_PACKAGE_MODEL;
136
+ let normalization;
137
+ try {
138
+ normalization = await normalizePageViewports(sources.map((entry) => entry.input));
139
+ }
140
+ catch (error) {
141
+ return {
142
+ status: 'failed',
143
+ output: args.settings.output,
144
+ error: error instanceof Error ? error.message : String(error),
145
+ };
146
+ }
147
+ const normalizedById = new Map(normalization.viewports.map((entry) => [entry.id, entry]));
148
+ const viewports = sources.map((entry) => {
149
+ const resolved = normalizedById.get(entry.input.id);
150
+ const reuse = entry.input.id === WINNER_VIEWPORT_ID
151
+ ? winnerReuseConversionId({
152
+ settings: args.settings,
153
+ submittedSha256: resolved.sha256,
154
+ normalized: resolved.normalized,
155
+ receipts: args.winnerReceipts ?? [],
156
+ runId: args.plan.runId,
157
+ model,
158
+ })
159
+ : undefined;
160
+ return {
161
+ id: entry.input.id,
162
+ ordinal: entry.ordinal,
163
+ imagePath: entry.path,
164
+ bytes: resolved.bytes,
165
+ mediaType: resolved.mediaType,
166
+ ...(reuse ? { sourceConversionId: reuse } : {}),
167
+ };
168
+ });
169
+ if (viewports.length === 0) {
170
+ return { status: 'skipped', reason: `Page ${page.id} has no viewport to convert.` };
171
+ }
172
+ if (viewports.length === 1 && page.startsFromWinner) {
173
+ return {
174
+ status: 'skipped',
175
+ reason: 'The approved screen already is the whole page — the server planned no'
176
+ + ' continuations for it. Convert it on its own with'
177
+ + ' `12ui convert <winner> --output layerdoc --export html`.',
120
178
  };
121
- // Keyed on the bytes actually submitted, so a retry after normalization
122
- // replays the same package instead of buying the page again.
123
- const idempotencyKey = branchPackageKey({
124
- runId: args.plan.runId,
125
- pageIndex: page.index,
126
- viewportSha256s: viewports.map((viewport) => normalizedById.get(viewport.id).sha256),
179
+ }
180
+ // The page's identity. Its viewports travel per submission instead, because a
181
+ // disproven attachment changes them and nothing else about the page.
182
+ const input = {
183
+ id: page.id,
184
+ ordinal: page.index,
185
+ kind: page.kind,
186
+ ...(page.title ? { title: page.title } : {}),
187
+ ...(page.purpose ? { purpose: page.purpose } : {}),
188
+ };
189
+ // Keyed on the bytes actually submitted, so a retry after normalization
190
+ // replays the same package instead of buying the page again.
191
+ const idempotencyKey = branchPackageKey({
192
+ runId: args.plan.runId,
193
+ pageIndex: page.index,
194
+ viewportSha256s: viewports.map((viewport) => normalizedById.get(viewport.id).sha256),
195
+ output: args.settings.output,
196
+ ...(args.settings.model ? { model: args.settings.model } : {}),
197
+ ...(args.settings.responsiveQuality
198
+ ? { responsiveQuality: args.settings.responsiveQuality }
199
+ : {}),
200
+ });
201
+ const normalizedRecord = normalization.viewports
202
+ .filter((viewport) => viewport.normalized)
203
+ .map((viewport) => ({
204
+ id: viewport.id,
205
+ fromWidth: viewport.original.width,
206
+ fromHeight: viewport.original.height,
207
+ fromSha256: viewport.original.sha256,
208
+ toWidth: viewport.width,
209
+ toHeight: viewport.height,
210
+ toSha256: viewport.sha256,
211
+ }));
212
+ const normalizationRecord = {
213
+ ...(normalization.canonicalWidth === null
214
+ ? {}
215
+ : { canonicalWidth: normalization.canonicalWidth }),
216
+ ...(normalizedRecord.length > 0 ? { normalizedViewports: normalizedRecord } : {}),
217
+ };
218
+ const disproven = [];
219
+ const disproofRecord = () => (disproven.length > 0 ? { disprovenReuse: disproven } : {});
220
+ // The reconciliation is a fact about what was submitted, so it belongs in
221
+ // the record whether or not the submission was accepted — a failed page
222
+ // is exactly when an operator needs to know what the bytes were.
223
+ const failedPage = (error) => ({
224
+ status: 'failed',
225
+ idempotencyKey,
226
+ output: args.settings.output,
227
+ ...normalizationRecord,
228
+ ...disproofRecord(),
229
+ error: error instanceof Error ? error.message : String(error),
230
+ });
231
+ // Whether a package row exists yet. An attachment is proved at admission,
232
+ // before anything durable is created, so only a failure with no admitted
233
+ // package can be that refusal — and only then can the same key carry a
234
+ // different body without being a `409 idempotency_conflict`.
235
+ let admitted = false;
236
+ const submit = async (submitted) => await submitConversionPackage({
237
+ client: args.client,
238
+ outDir: args.pagesDirectory,
239
+ submission: {
127
240
  output: args.settings.output,
128
241
  ...(args.settings.model ? { model: args.settings.model } : {}),
129
242
  ...(args.settings.responsiveQuality
130
243
  ? { responsiveQuality: args.settings.responsiveQuality }
131
244
  : {}),
245
+ pages: [{ ...input, viewports: [...submitted] }],
246
+ idempotencyKey,
247
+ },
248
+ onSubmitted: () => { admitted = true; },
249
+ ...(args.timeoutMs === undefined ? {} : { timeoutMs: args.timeoutMs }),
250
+ ...(args.onProgress ? { onProgress: args.onProgress } : {}),
251
+ ...(args.signal ? { signal: args.signal } : {}),
252
+ });
253
+ let result;
254
+ try {
255
+ result = await submit(viewports);
256
+ }
257
+ catch (error) {
258
+ // A disproven reuse costs one retry of the same page, never the page: its
259
+ // other screens are already paid for by the time anything could refuse it.
260
+ const retry = admitted ? null : withoutRefusedAttachment(viewports, error);
261
+ if (!retry)
262
+ return failedPage(error);
263
+ disproven.push(...retry.disproven);
264
+ for (const entry of retry.disproven)
265
+ args.onReuseDisproven?.(entry);
266
+ try {
267
+ result = await submit(retry.viewports);
268
+ }
269
+ catch (retryError) {
270
+ return failedPage(retryError);
271
+ }
272
+ }
273
+ const converted = result.pages[0];
274
+ const winnerChild = converted?.viewports?.find((viewport) => (viewport.id === WINNER_VIEWPORT_ID
275
+ && viewport.status === 'succeeded'
276
+ && viewport.conversionId));
277
+ if (winnerChild?.conversionId && result.expiresAt) {
278
+ args.onWinnerConversion?.({
279
+ sha256: normalizedById.get(WINNER_VIEWPORT_ID).sha256,
280
+ conversionId: winnerChild.conversionId,
281
+ model,
282
+ expiresAt: result.expiresAt,
132
283
  });
133
- const normalizedRecord = normalization.viewports
134
- .filter((viewport) => viewport.normalized)
135
- .map((viewport) => ({
136
- id: viewport.id,
137
- fromWidth: viewport.original.width,
138
- fromHeight: viewport.original.height,
139
- fromSha256: viewport.original.sha256,
140
- toWidth: viewport.width,
141
- toHeight: viewport.height,
142
- toSha256: viewport.sha256,
143
- }));
144
- const normalizationRecord = {
145
- ...(normalization.canonicalWidth === null
146
- ? {}
147
- : { canonicalWidth: normalization.canonicalWidth }),
148
- ...(normalizedRecord.length > 0 ? { normalizedViewports: normalizedRecord } : {}),
284
+ }
285
+ return converted?.status === 'succeeded'
286
+ ? {
287
+ status: 'succeeded',
288
+ packageId: result.packageId,
289
+ idempotencyKey,
290
+ output: args.settings.output,
291
+ ...normalizationRecord,
292
+ ...disproofRecord(),
293
+ ...(converted.conversionId ? { conversionId: converted.conversionId } : {}),
294
+ ...(converted.outFile ? { outFile: converted.outFile } : {}),
295
+ ...(converted.sha256 ? { sha256: converted.sha256 } : {}),
296
+ ...(converted.bytes === undefined ? {} : { bytes: converted.bytes }),
297
+ }
298
+ : {
299
+ status: 'failed',
300
+ packageId: result.packageId,
301
+ idempotencyKey,
302
+ output: args.settings.output,
303
+ ...normalizationRecord,
304
+ ...disproofRecord(),
305
+ error: converted?.error ?? `Package ${result.packageId} produced no page.`,
149
306
  };
150
- try {
151
- const result = await submitConversionPackage({
152
- client: args.client,
153
- outDir: args.pagesDirectory,
154
- submission: {
155
- output: args.settings.output,
156
- ...(args.settings.model ? { model: args.settings.model } : {}),
157
- ...(args.settings.responsiveQuality
158
- ? { responsiveQuality: args.settings.responsiveQuality }
307
+ };
308
+ /**
309
+ * Every page settles, whatever happens to any one of them. A page whose own
310
+ * bytes could not even be delivered is recorded as a failed conversion rather
311
+ * than thrown: a throw would abandon the sibling packages already running,
312
+ * which are paid work whose results would then never reach the sentinel.
313
+ */
314
+ const settlePageConversion = async (args) => {
315
+ try {
316
+ return await convertBranchPage(args);
317
+ }
318
+ catch (error) {
319
+ return {
320
+ status: 'failed',
321
+ output: args.settings.output,
322
+ error: error instanceof Error ? error.message : String(error),
323
+ };
324
+ }
325
+ };
326
+ /**
327
+ * The one owner of "which pages are converting, and how many at once".
328
+ *
329
+ * Pages are handed in as they become eligible rather than all at the end, so a
330
+ * page whose screens landed in the first wave is already converting while the
331
+ * rest of the run is still generating. `prepare` runs inside the page's own
332
+ * slot, which is what keeps a delivery for a page that has not started from
333
+ * competing with the packages that are already paid for.
334
+ */
335
+ export const createBranchPageConversions = (args) => {
336
+ const limiter = createConcurrencyLimiter(args.concurrency ?? BRANCH_PAGE_CONCURRENCY_DEFAULT);
337
+ const conversions = new Map();
338
+ const enqueued = new Map();
339
+ return {
340
+ start: (plan, page) => {
341
+ if (enqueued.has(page.id))
342
+ return;
343
+ enqueued.set(page.id, limiter(async () => {
344
+ const prepared = await args.prepare(page, plan);
345
+ conversions.set(page.id, await settlePageConversion({
346
+ client: args.client,
347
+ plan,
348
+ page,
349
+ screens: prepared.screens,
350
+ settings: args.settings,
351
+ pagesDirectory: args.pagesDirectory,
352
+ ...(prepared.winner ? { winner: prepared.winner } : {}),
353
+ ...(args.timeoutMs === undefined ? {} : { timeoutMs: args.timeoutMs }),
354
+ ...(args.winnerReceipts ? { winnerReceipts: args.winnerReceipts } : {}),
355
+ ...(args.onProgress
356
+ ? { onProgress: (event) => args.onProgress(page.id, event) }
159
357
  : {}),
160
- pages: [input],
161
- idempotencyKey,
162
- },
163
- ...(args.timeoutMs === undefined ? {} : { timeoutMs: args.timeoutMs }),
164
- ...(args.onProgress
165
- ? { onProgress: (event) => args.onProgress(page.id, event) }
166
- : {}),
167
- ...(args.signal ? { signal: args.signal } : {}),
168
- });
169
- const converted = result.pages[0];
170
- conversions.set(page.id, converted?.status === 'succeeded'
171
- ? {
172
- status: 'succeeded',
173
- packageId: result.packageId,
174
- idempotencyKey,
175
- output: args.settings.output,
176
- ...normalizationRecord,
177
- ...(converted.conversionId ? { conversionId: converted.conversionId } : {}),
178
- ...(converted.outFile ? { outFile: converted.outFile } : {}),
179
- ...(converted.sha256 ? { sha256: converted.sha256 } : {}),
180
- ...(converted.bytes === undefined ? {} : { bytes: converted.bytes }),
181
- }
182
- : {
358
+ ...(args.onWinnerConversion ? { onWinnerConversion: args.onWinnerConversion } : {}),
359
+ ...(args.onReuseDisproven ? { onReuseDisproven: args.onReuseDisproven } : {}),
360
+ ...(args.signal ? { signal: args.signal } : {}),
361
+ }));
362
+ }).catch((error) => {
363
+ conversions.set(page.id, {
183
364
  status: 'failed',
184
- packageId: result.packageId,
185
- idempotencyKey,
186
365
  output: args.settings.output,
187
- ...normalizationRecord,
188
- error: converted?.error ?? `Package ${result.packageId} produced no page.`,
366
+ error: error instanceof Error ? error.message : String(error),
189
367
  });
190
- }
191
- catch (error) {
192
- // The reconciliation is a fact about what was submitted, so it belongs in
193
- // the record whether or not the submission was accepted a failed page
194
- // is exactly when an operator needs to know what the bytes were.
195
- conversions.set(page.id, {
196
- status: 'failed',
197
- idempotencyKey,
198
- output: args.settings.output,
199
- ...normalizationRecord,
200
- error: error instanceof Error ? error.message : String(error),
201
- });
202
- }
203
- }
204
- return conversions;
368
+ }));
369
+ },
370
+ settled: async () => {
371
+ // Draining can itself enqueue: a page becomes eligible while an earlier
372
+ // one is still in flight. Keep draining until nothing new arrived.
373
+ let counted = -1;
374
+ while (enqueued.size !== counted) {
375
+ counted = enqueued.size;
376
+ await Promise.all([...enqueued.values()]);
377
+ }
378
+ return conversions;
379
+ },
380
+ };
205
381
  };
206
382
  //# sourceMappingURL=branch-page-conversion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"branch-page-conversion.js","sourceRoot":"","sources":["../src/branch-page-conversion.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"branch-page-conversion.js","sourceRoot":"","sources":["../src/branch-page-conversion.ts"],"names":[],"mappings":"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"}