@12ui/design 0.2.13 → 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 (188) hide show
  1. package/README.md +35 -9
  2. package/dist/bounded-concurrency.d.ts +13 -0
  3. package/dist/bounded-concurrency.d.ts.map +1 -0
  4. package/dist/bounded-concurrency.js +43 -0
  5. package/dist/bounded-concurrency.js.map +1 -0
  6. package/dist/branch-client.d.ts +155 -0
  7. package/dist/branch-client.d.ts.map +1 -0
  8. package/dist/branch-client.js +179 -0
  9. package/dist/branch-client.js.map +1 -0
  10. package/dist/branch-completion.d.ts +37 -0
  11. package/dist/branch-completion.d.ts.map +1 -0
  12. package/dist/branch-completion.js +137 -0
  13. package/dist/branch-completion.js.map +1 -0
  14. package/dist/branch-dispatch-loop.d.ts +84 -0
  15. package/dist/branch-dispatch-loop.d.ts.map +1 -0
  16. package/dist/branch-dispatch-loop.js +206 -0
  17. package/dist/branch-dispatch-loop.js.map +1 -0
  18. package/dist/branch-downloads.d.ts +53 -0
  19. package/dist/branch-downloads.d.ts.map +1 -0
  20. package/dist/branch-downloads.js +114 -0
  21. package/dist/branch-downloads.js.map +1 -0
  22. package/dist/branch-execution-types.d.ts +54 -0
  23. package/dist/branch-execution-types.d.ts.map +1 -0
  24. package/dist/branch-execution-types.js +2 -0
  25. package/dist/branch-execution-types.js.map +1 -0
  26. package/dist/branch-execution.d.ts +20 -0
  27. package/dist/branch-execution.d.ts.map +1 -0
  28. package/dist/branch-execution.js +380 -0
  29. package/dist/branch-execution.js.map +1 -0
  30. package/dist/branch-identity.d.ts +71 -0
  31. package/dist/branch-identity.d.ts.map +1 -0
  32. package/dist/branch-identity.js +72 -0
  33. package/dist/branch-identity.js.map +1 -0
  34. package/dist/branch-materialize.d.ts +33 -0
  35. package/dist/branch-materialize.d.ts.map +1 -0
  36. package/dist/branch-materialize.js +64 -0
  37. package/dist/branch-materialize.js.map +1 -0
  38. package/dist/branch-page-conversion.d.ts +127 -0
  39. package/dist/branch-page-conversion.d.ts.map +1 -0
  40. package/dist/branch-page-conversion.js +382 -0
  41. package/dist/branch-page-conversion.js.map +1 -0
  42. package/dist/branch-plan.d.ts +63 -0
  43. package/dist/branch-plan.d.ts.map +1 -0
  44. package/dist/branch-plan.js +95 -0
  45. package/dist/branch-plan.js.map +1 -0
  46. package/dist/branch-progress.d.ts +99 -0
  47. package/dist/branch-progress.d.ts.map +1 -0
  48. package/dist/branch-progress.js +188 -0
  49. package/dist/branch-progress.js.map +1 -0
  50. package/dist/branch-run-record.d.ts +164 -0
  51. package/dist/branch-run-record.d.ts.map +1 -0
  52. package/dist/branch-run-record.js +94 -0
  53. package/dist/branch-run-record.js.map +1 -0
  54. package/dist/branch-schedule.d.ts +74 -0
  55. package/dist/branch-schedule.d.ts.map +1 -0
  56. package/dist/branch-schedule.js +130 -0
  57. package/dist/branch-schedule.js.map +1 -0
  58. package/dist/branch-status.d.ts +11 -0
  59. package/dist/branch-status.d.ts.map +1 -0
  60. package/dist/branch-status.js +118 -0
  61. package/dist/branch-status.js.map +1 -0
  62. package/dist/branch-viewport-normalization.d.ts +74 -0
  63. package/dist/branch-viewport-normalization.d.ts.map +1 -0
  64. package/dist/branch-viewport-normalization.js +120 -0
  65. package/dist/branch-viewport-normalization.js.map +1 -0
  66. package/dist/cli-arguments.d.ts.map +1 -1
  67. package/dist/cli-arguments.js +5 -0
  68. package/dist/cli-arguments.js.map +1 -1
  69. package/dist/cli-branch-command.d.ts +55 -0
  70. package/dist/cli-branch-command.d.ts.map +1 -0
  71. package/dist/cli-branch-command.js +475 -0
  72. package/dist/cli-branch-command.js.map +1 -0
  73. package/dist/cli-capabilities.d.ts +51 -0
  74. package/dist/cli-capabilities.d.ts.map +1 -1
  75. package/dist/cli-capabilities.js +52 -1
  76. package/dist/cli-capabilities.js.map +1 -1
  77. package/dist/cli-create-command.d.ts +21 -0
  78. package/dist/cli-create-command.d.ts.map +1 -0
  79. package/dist/cli-create-command.js +319 -0
  80. package/dist/cli-create-command.js.map +1 -0
  81. package/dist/cli-detach.d.ts +62 -0
  82. package/dist/cli-detach.d.ts.map +1 -0
  83. package/dist/cli-detach.js +123 -0
  84. package/dist/cli-detach.js.map +1 -0
  85. package/dist/cli-draft-command.d.ts +63 -0
  86. package/dist/cli-draft-command.d.ts.map +1 -0
  87. package/dist/cli-draft-command.js +220 -0
  88. package/dist/cli-draft-command.js.map +1 -0
  89. package/dist/cli-export-command.d.ts.map +1 -1
  90. package/dist/cli-export-command.js +2 -3
  91. package/dist/cli-export-command.js.map +1 -1
  92. package/dist/cli-image-batch-command.d.ts +21 -0
  93. package/dist/cli-image-batch-command.d.ts.map +1 -1
  94. package/dist/cli-image-batch-command.js +65 -4
  95. package/dist/cli-image-batch-command.js.map +1 -1
  96. package/dist/cli-image-batch-resume.d.ts +7 -0
  97. package/dist/cli-image-batch-resume.d.ts.map +1 -1
  98. package/dist/cli-image-batch-resume.js +19 -2
  99. package/dist/cli-image-batch-resume.js.map +1 -1
  100. package/dist/cli-package-command.d.ts +29 -0
  101. package/dist/cli-package-command.d.ts.map +1 -0
  102. package/dist/cli-package-command.js +128 -0
  103. package/dist/cli-package-command.js.map +1 -0
  104. package/dist/cli-progress.d.ts +137 -0
  105. package/dist/cli-progress.d.ts.map +1 -1
  106. package/dist/cli-progress.js +156 -0
  107. package/dist/cli-progress.js.map +1 -1
  108. package/dist/cli-select-command.d.ts +12 -0
  109. package/dist/cli-select-command.d.ts.map +1 -0
  110. package/dist/cli-select-command.js +66 -0
  111. package/dist/cli-select-command.js.map +1 -0
  112. package/dist/cli.js +150 -7
  113. package/dist/cli.js.map +1 -1
  114. package/dist/conversion-receipt.d.ts +127 -0
  115. package/dist/conversion-receipt.d.ts.map +1 -0
  116. package/dist/conversion-receipt.js +184 -0
  117. package/dist/conversion-receipt.js.map +1 -0
  118. package/dist/create-identity.d.ts +25 -0
  119. package/dist/create-identity.d.ts.map +1 -0
  120. package/dist/create-identity.js +0 -0
  121. package/dist/create-identity.js.map +1 -0
  122. package/dist/draft-identity.d.ts +30 -0
  123. package/dist/draft-identity.d.ts.map +1 -0
  124. package/dist/draft-identity.js +0 -0
  125. package/dist/draft-identity.js.map +1 -0
  126. package/dist/draft-prompts.d.ts +35 -0
  127. package/dist/draft-prompts.d.ts.map +1 -0
  128. package/dist/draft-prompts.js +51 -0
  129. package/dist/draft-prompts.js.map +1 -0
  130. package/dist/draft-run.d.ts +32 -0
  131. package/dist/draft-run.d.ts.map +1 -0
  132. package/dist/draft-run.js +152 -0
  133. package/dist/draft-run.js.map +1 -0
  134. package/dist/draft-workspace.d.ts +90 -0
  135. package/dist/draft-workspace.d.ts.map +1 -0
  136. package/dist/draft-workspace.js +64 -0
  137. package/dist/draft-workspace.js.map +1 -0
  138. package/dist/image-batch-status.d.ts +42 -0
  139. package/dist/image-batch-status.d.ts.map +1 -0
  140. package/dist/image-batch-status.js +142 -0
  141. package/dist/image-batch-status.js.map +1 -0
  142. package/dist/image-dimensions.d.ts +12 -0
  143. package/dist/image-dimensions.d.ts.map +1 -0
  144. package/dist/image-dimensions.js +14 -0
  145. package/dist/image-dimensions.js.map +1 -0
  146. package/dist/image-generation-resume.d.ts +13 -0
  147. package/dist/image-generation-resume.d.ts.map +1 -1
  148. package/dist/image-generation-resume.js +13 -0
  149. package/dist/image-generation-resume.js.map +1 -1
  150. package/dist/index.d.ts +6 -1
  151. package/dist/index.d.ts.map +1 -1
  152. package/dist/index.js +5 -1
  153. package/dist/index.js.map +1 -1
  154. package/dist/legacy-skill-catalog.d.ts.map +1 -1
  155. package/dist/legacy-skill-catalog.js +140 -0
  156. package/dist/legacy-skill-catalog.js.map +1 -1
  157. package/dist/package-client.d.ts +28 -0
  158. package/dist/package-client.d.ts.map +1 -1
  159. package/dist/package-client.js +21 -1
  160. package/dist/package-client.js.map +1 -1
  161. package/dist/package-manifest-file.d.ts +21 -0
  162. package/dist/package-manifest-file.d.ts.map +1 -0
  163. package/dist/package-manifest-file.js +119 -0
  164. package/dist/package-manifest-file.js.map +1 -0
  165. package/dist/package-manifest-template.d.ts +23 -0
  166. package/dist/package-manifest-template.d.ts.map +1 -0
  167. package/dist/package-manifest-template.js +60 -0
  168. package/dist/package-manifest-template.js.map +1 -0
  169. package/dist/package-source-refusal.d.ts +17 -0
  170. package/dist/package-source-refusal.d.ts.map +1 -0
  171. package/dist/package-source-refusal.js +61 -0
  172. package/dist/package-source-refusal.js.map +1 -0
  173. package/dist/package-submission.d.ts +134 -0
  174. package/dist/package-submission.d.ts.map +1 -0
  175. package/dist/package-submission.js +196 -0
  176. package/dist/package-submission.js.map +1 -0
  177. package/dist/selection-record.d.ts +95 -0
  178. package/dist/selection-record.d.ts.map +1 -0
  179. package/dist/selection-record.js +121 -0
  180. package/dist/selection-record.js.map +1 -0
  181. package/package.json +1 -1
  182. package/skills/design/SKILL.md +43 -266
  183. package/skills/design-branch/SKILL.md +37 -116
  184. package/skills/design-convert/SKILL.md +62 -148
  185. package/skills/design-draft/SKILL.md +71 -135
  186. package/skills/design-search/SKILL.md +29 -78
  187. package/skills/design/references/continuation-contract.md +0 -60
  188. package/skills/design/references/selection-contract.md +0 -112
@@ -0,0 +1,475 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { readFile, stat } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { booleanFlag, stringFlag } from './cli-arguments.js';
5
+ import { readConversionConfig } from './config.js';
6
+ import { TwelveUiBranchClient, BRANCH_MAX_CONCEPT_CHARACTERS } from './branch-client.js';
7
+ import { deriveBranchRunKey, executeBranchRun } from './branch-execution.js';
8
+ import { readBranchStatus } from './branch-status.js';
9
+ import { BRANCH_ATTEMPT_FILENAME, BRANCH_COMPLETION_FILENAME, branchAttemptPath, readBranchAttempt, } from './branch-run-record.js';
10
+ import { BRANCH_PROGRESS_FILENAME } from './branch-progress.js';
11
+ import { DRAFT_BRANCH_DIRECTORY, draftPaths } from './draft-workspace.js';
12
+ import { readSelectionRecord } from './selection-record.js';
13
+ import { BRANCH_PAGE_CONCURRENCY_DEFAULT, BRANCH_TYPICAL_SITE_PAGES, OPERATION_DURATION_HINTS, branchRunEstimateSeconds, createPackageProgressReporter, formatDuration, narrateCounts, nextActionLine, } from './cli-progress.js';
14
+ import { isConversionModel } from './conversion-models.js';
15
+ import { classifyLocalConversionInput } from './local-conversion-input.js';
16
+ import { normalizeOptionalIdempotencyKey } from './idempotency-key.js';
17
+ import { TwelveUiConversionPackageClient } from './package-client.js';
18
+ import { isResponsiveConversionQuality, } from './responsive-quality.js';
19
+ export const BRANCH_USAGE = `Usage:
20
+ 12ui branch execute --winner-run <crt-id> --winner-slot <slot>|--winner-image <file>
21
+ --concept <text>|--concept-file <file> --scope page|site
22
+ --out-dir <directory> [--convert html] [--convert-model fast|standard|pro]
23
+ [--convert-quality standard|pro] [--source-conversion-id <id>]
24
+ [--max-screens <n>] [--page-concurrency <n>] [--idempotency-key <key>]
25
+ [--resume] [--dry-run] [--wait] [--quiet] [--origin <url>] [--api-key <key>]
26
+ 12ui branch resume --out-dir <directory> [--quiet] [--origin <url>] [--api-key <key>]
27
+ 12ui branch status --out-dir <directory> [--json] [--origin <url>] [--api-key <key>]`;
28
+ const HEARTBEAT_MS = 15_000;
29
+ /**
30
+ * `.12ui/site/.12ui/site/candidates/D.png` — measured in the harness pass, from
31
+ * an agent that resolved the run-directory convention against a cwd that was
32
+ * already inside it. The path is real, so nothing fails; the run just scatters.
33
+ * Say so once rather than refusing work over a cosmetic mistake.
34
+ */
35
+ export const nestedRunDirectoryWarning = (target) => {
36
+ const segments = path.resolve(target).split(path.sep);
37
+ const first = segments.indexOf('.12ui');
38
+ if (first < 0 || !segments.includes('.12ui', first + 1))
39
+ return null;
40
+ return `${target} nests one run directory inside another. That path is valid, so this run`
41
+ + ' continues, but the convention is a single `.12ui/<short-slug>/` at the root of the'
42
+ + ' working directory — check the run directory you meant before the next command.';
43
+ };
44
+ /**
45
+ * `12ui branch execute <run-dir>` takes the DRAFT run directory and keeps its
46
+ * own records in `<run-dir>/branch`, which is where the skill says the pages
47
+ * land. `--out-dir` stays an alias that names the branch directory outright,
48
+ * for a branch run with no draft behind it.
49
+ *
50
+ * `branch status` accepts either spelling: a directory that already holds
51
+ * branch records is one, and otherwise `<dir>/branch` is tried, so a caller who
52
+ * passes the run directory and one who passes the branch directory both get an
53
+ * answer instead of a lecture.
54
+ */
55
+ export const resolveBranchDirectory = async (args) => {
56
+ if (args.outDirFlag)
57
+ return { branchDir: path.resolve(args.outDirFlag), runDir: null };
58
+ if (!args.runDirArgument) {
59
+ throw new Error('A run directory is required: `12ui branch execute <run-dir>` (the directory `12ui draft`'
60
+ + ' printed), or `--out-dir <directory>` to name the branch directory outright.');
61
+ }
62
+ const given = path.resolve(args.runDirArgument);
63
+ const holdsBranchRecords = await Promise.all([
64
+ BRANCH_ATTEMPT_FILENAME,
65
+ BRANCH_COMPLETION_FILENAME,
66
+ BRANCH_PROGRESS_FILENAME,
67
+ ].map(async (name) => {
68
+ try {
69
+ await stat(path.join(given, name));
70
+ return true;
71
+ }
72
+ catch {
73
+ return false;
74
+ }
75
+ }));
76
+ if (holdsBranchRecords.some(Boolean))
77
+ return { branchDir: given, runDir: null };
78
+ return { branchDir: path.join(given, DRAFT_BRANCH_DIRECTORY), runDir: given };
79
+ };
80
+ const warnOnNestedRunDirectory = (targets) => {
81
+ for (const target of targets) {
82
+ if (!target)
83
+ continue;
84
+ const warning = nestedRunDirectoryWarning(target);
85
+ if (warning)
86
+ process.stderr.write(`${warning}\n`);
87
+ }
88
+ };
89
+ const readConcept = async (flags) => {
90
+ const inline = stringFlag(flags, 'concept')?.trim();
91
+ const file = stringFlag(flags, 'concept-file')?.trim();
92
+ if (Boolean(inline) === Boolean(file)) {
93
+ throw new Error('Provide exactly one --concept or --concept-file');
94
+ }
95
+ const value = (inline ?? (await readFile(path.resolve(file), 'utf8')))
96
+ .replace(/\s+/gu, ' ')
97
+ .trim();
98
+ if (!value)
99
+ throw new Error('--concept must not be empty');
100
+ if ([...value].length > BRANCH_MAX_CONCEPT_CHARACTERS) {
101
+ throw new Error(`--concept must be at most ${BRANCH_MAX_CONCEPT_CHARACTERS} characters`);
102
+ }
103
+ return value;
104
+ };
105
+ const imageWinner = async (imagePath) => {
106
+ const classified = classifyLocalConversionInput(imagePath);
107
+ if (classified.kind !== 'image')
108
+ throw new Error('The winner must be a PNG, JPEG, or WebP');
109
+ const bytes = new Uint8Array(await readFile(imagePath));
110
+ return {
111
+ kind: 'image',
112
+ imagePath,
113
+ bytes,
114
+ mediaType: classified.mediaType,
115
+ sha256: createHash('sha256').update(bytes).digest('hex'),
116
+ };
117
+ };
118
+ /**
119
+ * The winner the run already recorded. `12ui select` wrote which candidate was
120
+ * chosen and why, so `branch execute <run-dir>` should not make the caller say
121
+ * it again — restating a decision is how the two records drift apart.
122
+ */
123
+ const winnerFromSelection = async (runDir) => {
124
+ const paths = draftPaths(runDir);
125
+ const selection = await readSelectionRecord(paths.selection);
126
+ if (!selection)
127
+ return null;
128
+ const chosen = selection.candidates.find((candidate) => candidate.id === selection.winner);
129
+ if (!chosen?.path)
130
+ return null;
131
+ return imageWinner(chosen.path);
132
+ };
133
+ const readWinner = async (flags) => {
134
+ const runId = stringFlag(flags, 'winner-run')?.trim();
135
+ const slot = stringFlag(flags, 'winner-slot')?.trim();
136
+ const image = stringFlag(flags, 'winner-image')?.trim();
137
+ if (Boolean(image) === Boolean(runId)) {
138
+ throw new Error('A branch run starts from exactly one of --winner-run/--winner-slot or --winner-image');
139
+ }
140
+ if (runId) {
141
+ if (!slot)
142
+ throw new Error('--winner-run requires --winner-slot');
143
+ if (!/^crt-[a-f0-9]{40}$/u.test(runId))
144
+ throw new Error('--winner-run must be a crt- run id');
145
+ if (!/^[a-z]{1,2}$/u.test(slot))
146
+ throw new Error('--winner-slot must be a candidate slot such as a');
147
+ return { kind: 'run', runId, slot };
148
+ }
149
+ const imagePath = path.resolve(image);
150
+ const classified = classifyLocalConversionInput(imagePath);
151
+ if (classified.kind !== 'image')
152
+ throw new Error('--winner-image must be a PNG, JPEG, or WebP');
153
+ const bytes = new Uint8Array(await readFile(imagePath));
154
+ return {
155
+ kind: 'image',
156
+ imagePath,
157
+ bytes,
158
+ mediaType: classified.mediaType,
159
+ sha256: createHash('sha256').update(bytes).digest('hex'),
160
+ };
161
+ };
162
+ const readConvert = (flags) => {
163
+ const convert = stringFlag(flags, 'convert')?.trim();
164
+ const model = stringFlag(flags, 'convert-model')?.trim();
165
+ const quality = stringFlag(flags, 'convert-quality')?.trim();
166
+ const sourceConversionId = stringFlag(flags, 'source-conversion-id')?.trim();
167
+ if (convert === undefined) {
168
+ if (model || quality || sourceConversionId) {
169
+ throw new Error('--convert-model, --convert-quality, and --source-conversion-id require --convert html');
170
+ }
171
+ return undefined;
172
+ }
173
+ if (convert !== 'html')
174
+ throw new Error('--convert must be html');
175
+ if (model !== undefined && !isConversionModel(model)) {
176
+ throw new Error('--convert-model must be fast, standard, or pro');
177
+ }
178
+ if (quality !== undefined && !isResponsiveConversionQuality(quality)) {
179
+ throw new Error('--convert-quality must be standard or pro');
180
+ }
181
+ return {
182
+ output: 'html',
183
+ ...(model ? { model: model } : {}),
184
+ ...(quality ? { responsiveQuality: quality } : {}),
185
+ ...(sourceConversionId ? { sourceConversionId } : {}),
186
+ };
187
+ };
188
+ const readScope = (flags) => {
189
+ const scope = stringFlag(flags, 'scope')?.trim();
190
+ if (scope !== 'page' && scope !== 'site') {
191
+ throw new Error('--scope must be page (grow the approved screen into its whole page) or site (trunk plus'
192
+ + ' the planned sibling pages)');
193
+ }
194
+ return scope;
195
+ };
196
+ const readMaxScreens = (flags) => {
197
+ const value = stringFlag(flags, 'max-screens');
198
+ if (value === undefined)
199
+ return undefined;
200
+ const parsed = Number(value);
201
+ if (!Number.isSafeInteger(parsed) || parsed < 1)
202
+ throw new Error('--max-screens must be a positive integer');
203
+ return parsed;
204
+ };
205
+ const plannedPages = (scope) => (scope === 'page' ? 1 : BRANCH_TYPICAL_SITE_PAGES);
206
+ const runEstimate = (args) => branchRunEstimateSeconds({
207
+ pages: plannedPages(args.scope),
208
+ concurrency: args.concurrency,
209
+ convert: args.convert,
210
+ });
211
+ /**
212
+ * The opening line is the only estimate a caller has before anything moves, so
213
+ * it is derived from the run's phases rather than asserted. Pages now convert as
214
+ * their own screens land and several at a time, which is why the old sentence —
215
+ * one package per page, serial, ~20m for a site — would now overstate a normal
216
+ * run by roughly a factor of two, and an overstated wait is what makes a caller
217
+ * abandon a run that is on time.
218
+ */
219
+ export const branchExecuteBanner = (args) => {
220
+ const concurrency = args.concurrency ?? BRANCH_PAGE_CONCURRENCY_DEFAULT;
221
+ const exact = runEstimate({ scope: args.scope, convert: args.convert, concurrency });
222
+ // An estimate quoted to the second reads as a promise. The machine-readable
223
+ // figure stays exact in `--dry-run`; the sentence rounds to the minute.
224
+ const minutes = (seconds) => Math.max(60, Math.round(seconds / 60) * 60);
225
+ const estimate = { floor: minutes(exact.floor), ceiling: minutes(exact.ceiling) };
226
+ const pages = plannedPages(args.scope);
227
+ return [
228
+ `12ui branch execute — scope ${args.scope}, blocking until the whole run finishes.`,
229
+ `Claim and plan ~${formatDuration(OPERATION_DURATION_HINTS.branchClaim)} (buys no image), then`
230
+ + ` each screen ~${formatDuration(OPERATION_DURATION_HINTS.branchScreen)}`
231
+ + ` (server budget ${formatDuration(OPERATION_DURATION_HINTS.branchScreenBudget)})`
232
+ + `${args.convert
233
+ ? `, then each page converts as its own screens land, up to ${concurrency} at a time`
234
+ + ` ~${formatDuration(OPERATION_DURATION_HINTS.branchPackage)} each`
235
+ + ` — about ${estimate.floor === estimate.ceiling
236
+ ? formatDuration(estimate.ceiling)
237
+ : `${formatDuration(estimate.floor)} to ${formatDuration(estimate.ceiling)}`}`
238
+ + `${args.scope === 'page' ? ' for one page' : ` for a ${pages}-page site`}`
239
+ : ''}.`,
240
+ nextActionLine({
241
+ what: `A --scope ${args.scope} run`,
242
+ typicalSeconds: estimate.ceiling,
243
+ statusCommand: `12ui branch status --out-dir ${args.outDir}`,
244
+ waitHint: 'or leave this command running, which is what --wait already does by default',
245
+ }),
246
+ ].join('\n');
247
+ };
248
+ const readPageConcurrency = (flags) => {
249
+ const value = stringFlag(flags, 'page-concurrency');
250
+ if (value === undefined)
251
+ return undefined;
252
+ const parsed = Number(value);
253
+ if (!Number.isSafeInteger(parsed) || parsed < 1 || parsed > 10) {
254
+ // Ten is the account's active-conversion cap, so more than that only queues.
255
+ throw new Error('--page-concurrency must be an integer between 1 and 10');
256
+ }
257
+ return parsed;
258
+ };
259
+ export const runBranchCommand = async (action, flags, dependencies = {}) => {
260
+ if (action !== 'execute' && action !== 'resume' && action !== 'status') {
261
+ throw new Error(BRANCH_USAGE);
262
+ }
263
+ const outDirFlag = stringFlag(flags, 'out-dir')?.trim();
264
+ const resolvedDirectory = await resolveBranchDirectory({
265
+ ...(outDirFlag ? { outDirFlag } : {}),
266
+ ...(dependencies.runDirArgument ? { runDirArgument: dependencies.runDirArgument } : {}),
267
+ });
268
+ const outDir = resolvedDirectory.branchDir;
269
+ warnOnNestedRunDirectory([
270
+ outDirFlag ?? dependencies.runDirArgument,
271
+ stringFlag(flags, 'winner-image'),
272
+ ]);
273
+ const readConfig = dependencies.readConfig ?? readConversionConfig;
274
+ if (action === 'status') {
275
+ let config = null;
276
+ try {
277
+ config = readConfig({
278
+ origin: stringFlag(flags, 'origin'),
279
+ apiKey: stringFlag(flags, 'api-key'),
280
+ });
281
+ }
282
+ catch {
283
+ // A status read works offline; it just cannot refresh from the service.
284
+ }
285
+ const client = config
286
+ ? (dependencies.createBranchClient ?? ((value) => new TwelveUiBranchClient(value)))(config)
287
+ : null;
288
+ const report = await readBranchStatus({
289
+ outDir,
290
+ ...(client ? { refresh: async (runId) => client.getRun(runId) } : {}),
291
+ });
292
+ console.log(JSON.stringify(report, null, 2));
293
+ return;
294
+ }
295
+ const quiet = booleanFlag(flags, 'quiet');
296
+ const resume = action === 'resume' || booleanFlag(flags, 'resume');
297
+ const pageConcurrency = readPageConcurrency(flags) ?? BRANCH_PAGE_CONCURRENCY_DEFAULT;
298
+ let inputs;
299
+ if (action === 'resume') {
300
+ const attempt = await readBranchAttempt(branchAttemptPath(outDir));
301
+ if (!attempt) {
302
+ throw new Error(`This branch run has never been started — there is nothing to resume, and nothing has`
303
+ + ` failed. There is no branch attempt at ${branchAttemptPath(outDir)}. Start it with`
304
+ + ' `12ui branch execute --winner-run <crt-id> --winner-slot <slot> --concept <text>'
305
+ + ' --scope page|site --out-dir <directory>`.');
306
+ }
307
+ const recorded = attempt.winner;
308
+ let winner;
309
+ if (recorded.kind === 'run') {
310
+ winner = { kind: 'run', runId: recorded.runId, slot: recorded.slot };
311
+ }
312
+ else {
313
+ const bytes = new Uint8Array(await readFile(recorded.imagePath));
314
+ const sha256 = createHash('sha256').update(bytes).digest('hex');
315
+ if (sha256 !== recorded.sha256) {
316
+ throw new Error(`Refusing to resume: ${recorded.imagePath} no longer holds the starting design this run`
317
+ + ` branched from (${recorded.sha256} then, ${sha256} now).`);
318
+ }
319
+ winner = { kind: 'image', imagePath: recorded.imagePath, bytes, mediaType: recorded.mediaType, sha256 };
320
+ }
321
+ inputs = {
322
+ outDir,
323
+ scope: attempt.scope,
324
+ concept: attempt.concept,
325
+ winner,
326
+ ...(attempt.aspect ? { aspect: attempt.aspect } : {}),
327
+ ...(attempt.maxScreens === undefined ? {} : { maxScreens: attempt.maxScreens }),
328
+ ...(attempt.convert
329
+ ? {
330
+ convert: {
331
+ output: 'html',
332
+ model: attempt.convert.model,
333
+ ...(attempt.convert.responsiveQuality
334
+ ? { responsiveQuality: attempt.convert.responsiveQuality }
335
+ : {}),
336
+ ...(attempt.sourceConversionId ? { sourceConversionId: attempt.sourceConversionId } : {}),
337
+ },
338
+ }
339
+ : {}),
340
+ idempotencyKey: attempt.runKey,
341
+ };
342
+ }
343
+ else {
344
+ const aspect = stringFlag(flags, 'aspect')?.trim();
345
+ if (aspect !== undefined && !['landscape', 'portrait', 'square'].includes(aspect)) {
346
+ throw new Error('--aspect must be landscape, portrait, or square');
347
+ }
348
+ const named = stringFlag(flags, 'winner-run') ?? stringFlag(flags, 'winner-image');
349
+ const recorded = named || !resolvedDirectory.runDir
350
+ ? null
351
+ : await winnerFromSelection(resolvedDirectory.runDir);
352
+ if (!named && !recorded && resolvedDirectory.runDir) {
353
+ throw new Error(`No winner is recorded in ${resolvedDirectory.runDir}. Choose one first with`
354
+ + ` \`12ui select ${resolvedDirectory.runDir} --winner <id> --reason "<why>"\`, or name a`
355
+ + ' starting design with --winner-image or --winner-run/--winner-slot.');
356
+ }
357
+ inputs = {
358
+ outDir,
359
+ scope: readScope(flags),
360
+ concept: await readConcept(flags),
361
+ winner: recorded ?? await readWinner(flags),
362
+ ...(aspect ? { aspect: aspect } : {}),
363
+ ...(readMaxScreens(flags) === undefined ? {} : { maxScreens: readMaxScreens(flags) }),
364
+ ...(readConvert(flags) ? { convert: readConvert(flags) } : {}),
365
+ ...(normalizeOptionalIdempotencyKey(stringFlag(flags, 'idempotency-key'), '--idempotency-key')
366
+ ? { idempotencyKey: normalizeOptionalIdempotencyKey(stringFlag(flags, 'idempotency-key')) }
367
+ : {}),
368
+ };
369
+ }
370
+ const config = readConfig({
371
+ origin: stringFlag(flags, 'origin'),
372
+ apiKey: stringFlag(flags, 'api-key'),
373
+ });
374
+ if (booleanFlag(flags, 'dry-run')) {
375
+ console.log(JSON.stringify({
376
+ dryRun: true,
377
+ outDir,
378
+ origin: config.origin,
379
+ scope: inputs.scope,
380
+ concept: inputs.concept,
381
+ winner: inputs.winner.kind === 'run'
382
+ ? { kind: 'run', runId: inputs.winner.runId, slot: inputs.winner.slot }
383
+ : { kind: 'image', imagePath: inputs.winner.imagePath, sha256: inputs.winner.sha256 },
384
+ runKey: deriveBranchRunKey(inputs),
385
+ convert: inputs.convert ?? null,
386
+ ...(inputs.maxScreens === undefined ? {} : { maxScreens: inputs.maxScreens }),
387
+ pageConcurrency,
388
+ typicalSeconds: runEstimate({
389
+ scope: inputs.scope,
390
+ convert: Boolean(inputs.convert),
391
+ concurrency: pageConcurrency,
392
+ }).ceiling,
393
+ note: 'Nothing was claimed, dispatched, or bought.',
394
+ }, null, 2));
395
+ return;
396
+ }
397
+ const branchClient = (dependencies.createBranchClient ?? ((value) => (new TwelveUiBranchClient(value))))(config);
398
+ const packageClient = (dependencies.createPackageClient ?? ((value) => (new TwelveUiConversionPackageClient(value))))(config);
399
+ const startedAt = Date.now();
400
+ const write = (line) => {
401
+ if (!quiet)
402
+ process.stderr.write(`${line}\n`);
403
+ };
404
+ if (!quiet) {
405
+ write(branchExecuteBanner({
406
+ scope: inputs.scope,
407
+ outDir,
408
+ convert: Boolean(inputs.convert),
409
+ concurrency: pageConcurrency,
410
+ }));
411
+ }
412
+ let lastHeartbeat = 0;
413
+ const elapsed = () => formatDuration((Date.now() - startedAt) / 1000);
414
+ const reportPackage = createPackageProgressReporter({ write, elapsed });
415
+ const result = await executeBranchRun({
416
+ branchClient,
417
+ packageClient,
418
+ inputs,
419
+ origin: config.origin,
420
+ resume,
421
+ pageConcurrency,
422
+ onEvent: (event) => {
423
+ if (quiet)
424
+ return;
425
+ if (event.kind === 'progress') {
426
+ // A heartbeat even when nothing changed: silence is what a caller reads
427
+ // as a stall.
428
+ if (Date.now() - lastHeartbeat < HEARTBEAT_MS)
429
+ return;
430
+ lastHeartbeat = Date.now();
431
+ const counts = event.screens.reduce((totals, screen) => ({
432
+ ...totals,
433
+ [screen.status]: (totals[screen.status] ?? 0) + 1,
434
+ }), {});
435
+ write(`[${elapsed()}] ${event.phase}: ${narrateCounts([
436
+ { label: 'complete', count: counts.succeeded ?? 0 },
437
+ { label: 'generating', count: counts.dispatched ?? 0 },
438
+ { label: 'waiting on dependencies', count: counts.pending ?? 0 },
439
+ { label: 'blocked', count: counts.blocked ?? 0 },
440
+ { label: 'failed', count: counts.failed ?? 0 },
441
+ ])}`);
442
+ return;
443
+ }
444
+ if (event.kind === 'phase') {
445
+ write(`[${elapsed()}] ${event.phase}${event.detail ? `: ${event.detail}` : ''}`);
446
+ return;
447
+ }
448
+ if (event.kind === 'package') {
449
+ reportPackage(event.pageId, event.progress);
450
+ return;
451
+ }
452
+ if (event.kind === 'blocked') {
453
+ write(`[${elapsed()}] screen ${event.slot}: blocked — ${event.waitingOn} failed, so this screen`
454
+ + ' can never run. It is terminal, not pending.');
455
+ return;
456
+ }
457
+ if (event.kind === 'failed') {
458
+ write(`[${elapsed()}] screen ${event.slot}: failed (${event.code})`);
459
+ return;
460
+ }
461
+ if (event.kind === 'succeeded' || event.kind === 'dispatched' || event.kind === 'held' || event.kind === 'in-flight') {
462
+ write(`[${elapsed()}] screen ${event.slot}: ${event.kind}`);
463
+ return;
464
+ }
465
+ write(`[${elapsed()}] stopped: ${event.code} — ${event.message}`);
466
+ },
467
+ });
468
+ console.log(JSON.stringify({
469
+ completionPath: result.completionPath,
470
+ ...result.completion,
471
+ }, null, 2));
472
+ if (result.failure)
473
+ throw result.failure;
474
+ };
475
+ //# sourceMappingURL=cli-branch-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-branch-command.js","sourceRoot":"","sources":["../src/cli-branch-command.ts"],"names":[],"mappings":"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"}
@@ -21,6 +21,57 @@ export declare const CLI_CAPABILITIES: {
21
21
  readonly convert: 240;
22
22
  readonly export: 240;
23
23
  readonly convertWithExport: 300;
24
+ readonly imageBatch: 90;
25
+ readonly branchClaim: 15;
26
+ readonly branchScreen: 90;
27
+ readonly branchPageRun: 362;
28
+ readonly branchSiteRun: 492;
29
+ readonly conversionPackage: 360;
30
+ };
31
+ /**
32
+ * Long commands block. While one runs, these read-only surfaces report what
33
+ * is moving and what to do next; a caller must never infer progress from a
34
+ * directory listing.
35
+ */
36
+ readonly statusCommands: {
37
+ readonly branch: "12ui branch status --out-dir <directory>";
38
+ readonly imageBatch: "12ui image batch-status --manifest <batch.json>";
39
+ };
40
+ /**
41
+ * The only file a conversion leaves outside its requested output, and the one
42
+ * thing that keeps the common flow — convert the approved design, then branch
43
+ * from it — from buying that design's LayerDoc twice.
44
+ */
45
+ readonly conversionReceipt: {
46
+ readonly file: "<converted-image>.conversion.json";
47
+ readonly writtenBy: readonly ["12ui convert (image input, --output layerdoc)", "12ui branch execute --convert"];
48
+ readonly readBy: "12ui branch execute --convert";
49
+ /** Reuse requires every one of these to match the bytes about to be sent. */
50
+ readonly proves: readonly ["sha256", "conversionId", "model", "expiresAt"];
51
+ readonly bestEffort: true;
52
+ };
53
+ /** Ordered viewports of one continuous page: ONE conversion, not N. */
54
+ readonly conversionPackage: {
55
+ readonly command: "12ui convert package --manifest <package.json> --out-dir <directory>";
56
+ readonly endpoint: "/api/v1/convert/package";
57
+ readonly sourceConversionReuse: "sourceConversionId";
58
+ readonly expectedSeconds: 360;
59
+ };
60
+ readonly branch: {
61
+ readonly command: "12ui branch execute";
62
+ readonly scopes: readonly ["page", "site"];
63
+ readonly completionSentinel: "branch.complete.json";
64
+ readonly endpoint: "/api/v1/create";
65
+ /**
66
+ * A page's package depends on its own screens and nothing else, so pages
67
+ * convert as they become whole and several at a time.
68
+ */
69
+ readonly pageConcurrency: {
70
+ readonly flag: "--page-concurrency";
71
+ readonly default: 3;
72
+ readonly maximum: 10;
73
+ };
74
+ readonly expectedSecondsPerPage: 130;
24
75
  };
25
76
  readonly projectProfileSchema: {
26
77
  readonly required: readonly ["version", "framework", "styling", "language", "packaging"];
@@ -1 +1 @@
1
- {"version":3,"file":"cli-capabilities.d.ts","sourceRoot":"","sources":["../src/cli-capabilities.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCnB,CAAC"}
1
+ {"version":3,"file":"cli-capabilities.d.ts","sourceRoot":"","sources":["../src/cli-capabilities.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAsC3B;;;;OAIG;;;;;IAKH;;;;OAIG;;;;;QAKD,6EAA6E;;;;IAI/E,uEAAuE;;;;;;;;;;;;QAYrE;;;WAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAaG,CAAC"}
@@ -1,4 +1,4 @@
1
- import { CONVERSION_DURATION_HINTS } from './cli-progress.js';
1
+ import { BRANCH_PAGE_CONCURRENCY_DEFAULT, CONVERSION_DURATION_HINTS, OPERATION_DURATION_HINTS, } from './cli-progress.js';
2
2
  import { CONVERSION_MODELS } from './conversion-models.js';
3
3
  import { CONVERSION_OUTPUT_MEDIA_TYPES, CONVERSION_OUTPUTS, } from './conversion-outputs.js';
4
4
  import { MAX_IMAGE_OUTPUT_WIDTH } from './image-output-width.js';
@@ -34,6 +34,57 @@ export const CLI_CAPABILITIES = {
34
34
  convert: CONVERSION_DURATION_HINTS.convert,
35
35
  export: CONVERSION_DURATION_HINTS.export,
36
36
  convertWithExport: CONVERSION_DURATION_HINTS.fused,
37
+ imageBatch: OPERATION_DURATION_HINTS.imageBatch,
38
+ branchClaim: OPERATION_DURATION_HINTS.branchClaim,
39
+ branchScreen: OPERATION_DURATION_HINTS.branchScreen,
40
+ branchPageRun: OPERATION_DURATION_HINTS.branchPage,
41
+ branchSiteRun: OPERATION_DURATION_HINTS.branchSite,
42
+ conversionPackage: OPERATION_DURATION_HINTS.package,
43
+ },
44
+ /**
45
+ * Long commands block. While one runs, these read-only surfaces report what
46
+ * is moving and what to do next; a caller must never infer progress from a
47
+ * directory listing.
48
+ */
49
+ statusCommands: {
50
+ branch: '12ui branch status --out-dir <directory>',
51
+ imageBatch: '12ui image batch-status --manifest <batch.json>',
52
+ },
53
+ /**
54
+ * The only file a conversion leaves outside its requested output, and the one
55
+ * thing that keeps the common flow — convert the approved design, then branch
56
+ * from it — from buying that design's LayerDoc twice.
57
+ */
58
+ conversionReceipt: {
59
+ file: '<converted-image>.conversion.json',
60
+ writtenBy: ['12ui convert (image input, --output layerdoc)', '12ui branch execute --convert'],
61
+ readBy: '12ui branch execute --convert',
62
+ /** Reuse requires every one of these to match the bytes about to be sent. */
63
+ proves: ['sha256', 'conversionId', 'model', 'expiresAt'],
64
+ bestEffort: true,
65
+ },
66
+ /** Ordered viewports of one continuous page: ONE conversion, not N. */
67
+ conversionPackage: {
68
+ command: '12ui convert package --manifest <package.json> --out-dir <directory>',
69
+ endpoint: '/api/v1/convert/package',
70
+ sourceConversionReuse: 'sourceConversionId',
71
+ expectedSeconds: OPERATION_DURATION_HINTS.package,
72
+ },
73
+ branch: {
74
+ command: '12ui branch execute',
75
+ scopes: ['page', 'site'],
76
+ completionSentinel: 'branch.complete.json',
77
+ endpoint: '/api/v1/create',
78
+ /**
79
+ * A page's package depends on its own screens and nothing else, so pages
80
+ * convert as they become whole and several at a time.
81
+ */
82
+ pageConcurrency: {
83
+ flag: '--page-concurrency',
84
+ default: BRANCH_PAGE_CONCURRENCY_DEFAULT,
85
+ maximum: 10,
86
+ },
87
+ expectedSecondsPerPage: OPERATION_DURATION_HINTS.branchPackage,
37
88
  },
38
89
  projectProfileSchema: PROJECT_PROFILE_SCHEMA,
39
90
  projectProfiles: {
@@ -1 +1 @@
1
- {"version":3,"file":"cli-capabilities.js","sourceRoot":"","sources":["../src/cli-capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EACL,6BAA6B,EAC7B,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EACL,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAE1E,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM,EAAE;QACN,WAAW;QACX,YAAY;QACZ,YAAY;QACZ,6BAA6B,CAAC,QAAQ;KACvC;IACD,OAAO,EAAE,kBAAkB;IAC3B,WAAW,EAAE,iBAAiB;IAC9B,gBAAgB,EAAE;QAChB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,sBAAsB;QAC/B,WAAW,EAAE,uFAAuF;KACrG;IACD,mBAAmB,EAAE,+BAA+B;IACpD,WAAW,EAAE;QACX,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,CAAC,MAAM,CAAC;QAChB,WAAW,EAAE,kBAAkB;QAC/B,OAAO,EAAE,cAAc;QACvB,WAAW,EACT,yFAAyF;cACvF,uFAAuF;cACvF,yEAAyE;QAC7E,eAAe,EAAE,yBAAyB,CAAC,KAAK;KACjD;IACD,eAAe,EAAE;QACf,OAAO,EAAE,yBAAyB,CAAC,OAAO;QAC1C,MAAM,EAAE,yBAAyB,CAAC,MAAM;QACxC,iBAAiB,EAAE,yBAAyB,CAAC,KAAK;KACnD;IACD,oBAAoB,EAAE,sBAAsB;IAC5C,eAAe,EAAE;QACf,WAAW,EAAE,wBAAwB;QACrC,WAAW,EAAE,wBAAwB;KACtC;CACO,CAAC"}
1
+ {"version":3,"file":"cli-capabilities.js","sourceRoot":"","sources":["../src/cli-capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,EAC/B,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EACL,6BAA6B,EAC7B,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EACL,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAE1E,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM,EAAE;QACN,WAAW;QACX,YAAY;QACZ,YAAY;QACZ,6BAA6B,CAAC,QAAQ;KACvC;IACD,OAAO,EAAE,kBAAkB;IAC3B,WAAW,EAAE,iBAAiB;IAC9B,gBAAgB,EAAE;QAChB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,sBAAsB;QAC/B,WAAW,EAAE,uFAAuF;KACrG;IACD,mBAAmB,EAAE,+BAA+B;IACpD,WAAW,EAAE;QACX,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,CAAC,MAAM,CAAC;QAChB,WAAW,EAAE,kBAAkB;QAC/B,OAAO,EAAE,cAAc;QACvB,WAAW,EACT,yFAAyF;cACvF,uFAAuF;cACvF,yEAAyE;QAC7E,eAAe,EAAE,yBAAyB,CAAC,KAAK;KACjD;IACD,eAAe,EAAE;QACf,OAAO,EAAE,yBAAyB,CAAC,OAAO;QAC1C,MAAM,EAAE,yBAAyB,CAAC,MAAM;QACxC,iBAAiB,EAAE,yBAAyB,CAAC,KAAK;QAClD,UAAU,EAAE,wBAAwB,CAAC,UAAU;QAC/C,WAAW,EAAE,wBAAwB,CAAC,WAAW;QACjD,YAAY,EAAE,wBAAwB,CAAC,YAAY;QACnD,aAAa,EAAE,wBAAwB,CAAC,UAAU;QAClD,aAAa,EAAE,wBAAwB,CAAC,UAAU;QAClD,iBAAiB,EAAE,wBAAwB,CAAC,OAAO;KACpD;IACD;;;;OAIG;IACH,cAAc,EAAE;QACd,MAAM,EAAE,0CAA0C;QAClD,UAAU,EAAE,iDAAiD;KAC9D;IACD;;;;OAIG;IACH,iBAAiB,EAAE;QACjB,IAAI,EAAE,mCAAmC;QACzC,SAAS,EAAE,CAAC,+CAA+C,EAAE,+BAA+B,CAAC;QAC7F,MAAM,EAAE,+BAA+B;QACvC,6EAA6E;QAC7E,MAAM,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,CAAC;QACxD,UAAU,EAAE,IAAI;KACjB;IACD,uEAAuE;IACvE,iBAAiB,EAAE;QACjB,OAAO,EAAE,sEAAsE;QAC/E,QAAQ,EAAE,yBAAyB;QACnC,qBAAqB,EAAE,oBAAoB;QAC3C,eAAe,EAAE,wBAAwB,CAAC,OAAO;KAClD;IACD,MAAM,EAAE;QACN,OAAO,EAAE,qBAAqB;QAC9B,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,kBAAkB,EAAE,sBAAsB;QAC1C,QAAQ,EAAE,gBAAgB;QAC1B;;;WAGG;QACH,eAAe,EAAE;YACf,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,+BAA+B;YACxC,OAAO,EAAE,EAAE;SACZ;QACD,sBAAsB,EAAE,wBAAwB,CAAC,aAAa;KAC/D;IACD,oBAAoB,EAAE,sBAAsB;IAC5C,eAAe,EAAE;QACf,WAAW,EAAE,wBAAwB;QACrC,WAAW,EAAE,wBAAwB;KACtC;CACO,CAAC"}