@12ui/design 0.2.13 → 0.2.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/README.md +35 -9
  2. package/dist/branch-client.d.ts +155 -0
  3. package/dist/branch-client.d.ts.map +1 -0
  4. package/dist/branch-client.js +179 -0
  5. package/dist/branch-client.js.map +1 -0
  6. package/dist/branch-completion.d.ts +37 -0
  7. package/dist/branch-completion.d.ts.map +1 -0
  8. package/dist/branch-completion.js +137 -0
  9. package/dist/branch-completion.js.map +1 -0
  10. package/dist/branch-dispatch-loop.d.ts +84 -0
  11. package/dist/branch-dispatch-loop.d.ts.map +1 -0
  12. package/dist/branch-dispatch-loop.js +206 -0
  13. package/dist/branch-dispatch-loop.js.map +1 -0
  14. package/dist/branch-downloads.d.ts +43 -0
  15. package/dist/branch-downloads.d.ts.map +1 -0
  16. package/dist/branch-downloads.js +94 -0
  17. package/dist/branch-downloads.js.map +1 -0
  18. package/dist/branch-execution-types.d.ts +54 -0
  19. package/dist/branch-execution-types.d.ts.map +1 -0
  20. package/dist/branch-execution-types.js +2 -0
  21. package/dist/branch-execution-types.js.map +1 -0
  22. package/dist/branch-execution.d.ts +18 -0
  23. package/dist/branch-execution.d.ts.map +1 -0
  24. package/dist/branch-execution.js +261 -0
  25. package/dist/branch-execution.js.map +1 -0
  26. package/dist/branch-identity.d.ts +71 -0
  27. package/dist/branch-identity.d.ts.map +1 -0
  28. package/dist/branch-identity.js +72 -0
  29. package/dist/branch-identity.js.map +1 -0
  30. package/dist/branch-materialize.d.ts +22 -0
  31. package/dist/branch-materialize.d.ts.map +1 -0
  32. package/dist/branch-materialize.js +47 -0
  33. package/dist/branch-materialize.js.map +1 -0
  34. package/dist/branch-page-conversion.d.ts +39 -0
  35. package/dist/branch-page-conversion.d.ts.map +1 -0
  36. package/dist/branch-page-conversion.js +206 -0
  37. package/dist/branch-page-conversion.js.map +1 -0
  38. package/dist/branch-plan.d.ts +63 -0
  39. package/dist/branch-plan.d.ts.map +1 -0
  40. package/dist/branch-plan.js +95 -0
  41. package/dist/branch-plan.js.map +1 -0
  42. package/dist/branch-progress.d.ts +75 -0
  43. package/dist/branch-progress.d.ts.map +1 -0
  44. package/dist/branch-progress.js +159 -0
  45. package/dist/branch-progress.js.map +1 -0
  46. package/dist/branch-run-record.d.ts +153 -0
  47. package/dist/branch-run-record.d.ts.map +1 -0
  48. package/dist/branch-run-record.js +94 -0
  49. package/dist/branch-run-record.js.map +1 -0
  50. package/dist/branch-schedule.d.ts +74 -0
  51. package/dist/branch-schedule.d.ts.map +1 -0
  52. package/dist/branch-schedule.js +130 -0
  53. package/dist/branch-schedule.js.map +1 -0
  54. package/dist/branch-status.d.ts +11 -0
  55. package/dist/branch-status.d.ts.map +1 -0
  56. package/dist/branch-status.js +115 -0
  57. package/dist/branch-status.js.map +1 -0
  58. package/dist/branch-viewport-normalization.d.ts +74 -0
  59. package/dist/branch-viewport-normalization.d.ts.map +1 -0
  60. package/dist/branch-viewport-normalization.js +120 -0
  61. package/dist/branch-viewport-normalization.js.map +1 -0
  62. package/dist/cli-arguments.d.ts.map +1 -1
  63. package/dist/cli-arguments.js +4 -0
  64. package/dist/cli-arguments.js.map +1 -1
  65. package/dist/cli-branch-command.d.ts +46 -0
  66. package/dist/cli-branch-command.d.ts.map +1 -0
  67. package/dist/cli-branch-command.js +426 -0
  68. package/dist/cli-branch-command.js.map +1 -0
  69. package/dist/cli-capabilities.d.ts +28 -0
  70. package/dist/cli-capabilities.d.ts.map +1 -1
  71. package/dist/cli-capabilities.js +29 -1
  72. package/dist/cli-capabilities.js.map +1 -1
  73. package/dist/cli-create-command.d.ts +21 -0
  74. package/dist/cli-create-command.d.ts.map +1 -0
  75. package/dist/cli-create-command.js +319 -0
  76. package/dist/cli-create-command.js.map +1 -0
  77. package/dist/cli-detach.d.ts +62 -0
  78. package/dist/cli-detach.d.ts.map +1 -0
  79. package/dist/cli-detach.js +123 -0
  80. package/dist/cli-detach.js.map +1 -0
  81. package/dist/cli-draft-command.d.ts +63 -0
  82. package/dist/cli-draft-command.d.ts.map +1 -0
  83. package/dist/cli-draft-command.js +220 -0
  84. package/dist/cli-draft-command.js.map +1 -0
  85. package/dist/cli-export-command.d.ts.map +1 -1
  86. package/dist/cli-export-command.js +2 -3
  87. package/dist/cli-export-command.js.map +1 -1
  88. package/dist/cli-image-batch-command.d.ts +21 -0
  89. package/dist/cli-image-batch-command.d.ts.map +1 -1
  90. package/dist/cli-image-batch-command.js +65 -4
  91. package/dist/cli-image-batch-command.js.map +1 -1
  92. package/dist/cli-image-batch-resume.d.ts +7 -0
  93. package/dist/cli-image-batch-resume.d.ts.map +1 -1
  94. package/dist/cli-image-batch-resume.js +19 -2
  95. package/dist/cli-image-batch-resume.js.map +1 -1
  96. package/dist/cli-package-command.d.ts +18 -0
  97. package/dist/cli-package-command.d.ts.map +1 -0
  98. package/dist/cli-package-command.js +112 -0
  99. package/dist/cli-package-command.js.map +1 -0
  100. package/dist/cli-progress.d.ts +61 -0
  101. package/dist/cli-progress.d.ts.map +1 -1
  102. package/dist/cli-progress.js +53 -0
  103. package/dist/cli-progress.js.map +1 -1
  104. package/dist/cli-select-command.d.ts +12 -0
  105. package/dist/cli-select-command.d.ts.map +1 -0
  106. package/dist/cli-select-command.js +66 -0
  107. package/dist/cli-select-command.js.map +1 -0
  108. package/dist/cli.js +140 -7
  109. package/dist/cli.js.map +1 -1
  110. package/dist/create-identity.d.ts +25 -0
  111. package/dist/create-identity.d.ts.map +1 -0
  112. package/dist/create-identity.js +0 -0
  113. package/dist/create-identity.js.map +1 -0
  114. package/dist/draft-identity.d.ts +30 -0
  115. package/dist/draft-identity.d.ts.map +1 -0
  116. package/dist/draft-identity.js +0 -0
  117. package/dist/draft-identity.js.map +1 -0
  118. package/dist/draft-prompts.d.ts +35 -0
  119. package/dist/draft-prompts.d.ts.map +1 -0
  120. package/dist/draft-prompts.js +51 -0
  121. package/dist/draft-prompts.js.map +1 -0
  122. package/dist/draft-run.d.ts +32 -0
  123. package/dist/draft-run.d.ts.map +1 -0
  124. package/dist/draft-run.js +152 -0
  125. package/dist/draft-run.js.map +1 -0
  126. package/dist/draft-workspace.d.ts +90 -0
  127. package/dist/draft-workspace.d.ts.map +1 -0
  128. package/dist/draft-workspace.js +64 -0
  129. package/dist/draft-workspace.js.map +1 -0
  130. package/dist/image-batch-status.d.ts +42 -0
  131. package/dist/image-batch-status.d.ts.map +1 -0
  132. package/dist/image-batch-status.js +142 -0
  133. package/dist/image-batch-status.js.map +1 -0
  134. package/dist/image-dimensions.d.ts +12 -0
  135. package/dist/image-dimensions.d.ts.map +1 -0
  136. package/dist/image-dimensions.js +14 -0
  137. package/dist/image-dimensions.js.map +1 -0
  138. package/dist/image-generation-resume.d.ts +13 -0
  139. package/dist/image-generation-resume.d.ts.map +1 -1
  140. package/dist/image-generation-resume.js +13 -0
  141. package/dist/image-generation-resume.js.map +1 -1
  142. package/dist/index.d.ts +5 -0
  143. package/dist/index.d.ts.map +1 -1
  144. package/dist/index.js +4 -0
  145. package/dist/index.js.map +1 -1
  146. package/dist/legacy-skill-catalog.d.ts.map +1 -1
  147. package/dist/legacy-skill-catalog.js +115 -0
  148. package/dist/legacy-skill-catalog.js.map +1 -1
  149. package/dist/package-manifest-file.d.ts +21 -0
  150. package/dist/package-manifest-file.d.ts.map +1 -0
  151. package/dist/package-manifest-file.js +119 -0
  152. package/dist/package-manifest-file.js.map +1 -0
  153. package/dist/package-manifest-template.d.ts +23 -0
  154. package/dist/package-manifest-template.d.ts.map +1 -0
  155. package/dist/package-manifest-template.js +60 -0
  156. package/dist/package-manifest-template.js.map +1 -0
  157. package/dist/package-submission.d.ts +103 -0
  158. package/dist/package-submission.d.ts.map +1 -0
  159. package/dist/package-submission.js +173 -0
  160. package/dist/package-submission.js.map +1 -0
  161. package/dist/selection-record.d.ts +95 -0
  162. package/dist/selection-record.d.ts.map +1 -0
  163. package/dist/selection-record.js +121 -0
  164. package/dist/selection-record.js.map +1 -0
  165. package/package.json +1 -1
  166. package/skills/design/SKILL.md +40 -266
  167. package/skills/design-branch/SKILL.md +36 -116
  168. package/skills/design-convert/SKILL.md +62 -148
  169. package/skills/design-draft/SKILL.md +71 -135
  170. package/skills/design-search/SKILL.md +29 -78
  171. package/skills/design/references/continuation-contract.md +0 -60
  172. package/skills/design/references/selection-contract.md +0 -112
@@ -0,0 +1,261 @@
1
+ import path from 'node:path';
2
+ import { BranchApiError, } from './branch-client.js';
3
+ import { branchConceptDigest, branchRunKey } from './branch-identity.js';
4
+ import { buildCompletion, terminalFailure } from './branch-completion.js';
5
+ import { materializeRun } from './branch-materialize.js';
6
+ import { convertBranchPages } from './branch-page-conversion.js';
7
+ import { applyBranchEnvelope, normalizeBranchPlan } from './branch-plan.js';
8
+ import { branchProgressPath, branchProgressScreens, writeBranchProgress, } from './branch-progress.js';
9
+ import { runBranchDispatch, } from './branch-dispatch-loop.js';
10
+ import { BRANCH_ATTEMPT_FILENAME, BRANCH_PAGES_DIRECTORY, BRANCH_SCREENS_DIRECTORY, branchAttemptPath, branchCompletionPath, branchPlanPath, readBranchAttempt, readBranchCompletion, writeBranchAttempt, writeBranchCompletion, writeBranchPlanRecord, } from './branch-run-record.js';
11
+ /**
12
+ * The whole branch choreography as one deterministic sequence: claim, plan,
13
+ * dependency-ordered dispatch, ordered download, per-page package conversion,
14
+ * sentinel. Everything mechanical lives here so the model's job collapses to
15
+ * choosing the winner, writing the concept, and picking the scope.
16
+ */
17
+ const BUILD_PLAN_RETRIES = 3;
18
+ export const deriveBranchRunKey = (inputs) => (inputs.idempotencyKey ?? branchRunKey({
19
+ winner: inputs.winner.kind === 'run'
20
+ ? { runId: inputs.winner.runId, slot: inputs.winner.slot }
21
+ : { imageSha256: inputs.winner.sha256 },
22
+ concept: inputs.concept,
23
+ scope: inputs.scope,
24
+ }));
25
+ const claimBuildRun = async (args) => {
26
+ let lastError;
27
+ for (let attempt = 1; attempt <= BUILD_PLAN_RETRIES; attempt += 1) {
28
+ try {
29
+ return await args.client.startBuildRun({
30
+ concept: args.inputs.concept,
31
+ ...(args.inputs.aspect ? { aspect: args.inputs.aspect } : {}),
32
+ ...(args.inputs.winner.kind === 'run'
33
+ ? { winner: { createRunId: args.inputs.winner.runId, slot: args.inputs.winner.slot } }
34
+ : {
35
+ referenceImage: {
36
+ data: Buffer.from(args.inputs.winner.bytes).toString('base64'),
37
+ mediaType: args.inputs.winner.mediaType,
38
+ sha256: args.inputs.winner.sha256,
39
+ },
40
+ }),
41
+ }, args.runKey, args.signal);
42
+ }
43
+ catch (error) {
44
+ lastError = error;
45
+ // Planning failed before any image spend, so the same key may replay.
46
+ const retryable = error instanceof BranchApiError && error.code === 'build_plan_failed';
47
+ if (!retryable || attempt === BUILD_PLAN_RETRIES)
48
+ throw error;
49
+ }
50
+ }
51
+ throw lastError;
52
+ };
53
+ export const executeBranchRun = async (args) => {
54
+ const emit = args.onEvent ?? (() => undefined);
55
+ const { inputs } = args;
56
+ const outDir = path.resolve(inputs.outDir);
57
+ const attemptFile = branchAttemptPath(outDir);
58
+ const completionFile = branchCompletionPath(outDir);
59
+ const screensDirectory = path.join(outDir, BRANCH_SCREENS_DIRECTORY);
60
+ const pagesDirectory = path.join(outDir, BRANCH_PAGES_DIRECTORY);
61
+ const runKey = deriveBranchRunKey(inputs);
62
+ const startedAt = new Date().toISOString();
63
+ const progressFile = branchProgressPath(outDir);
64
+ // Progress writes are serialized AND coalesced: the file is the one thing
65
+ // another session polls, so it must never be observed half-written, and a
66
+ // fast loop must not queue an unbounded backlog of stale snapshots. Only the
67
+ // newest pending snapshot is ever written.
68
+ let pendingProgress = null;
69
+ let progressWrites = Promise.resolve();
70
+ let progressWriting = false;
71
+ const drainProgress = () => {
72
+ if (progressWriting || !pendingProgress)
73
+ return;
74
+ progressWriting = true;
75
+ const record = pendingProgress;
76
+ pendingProgress = null;
77
+ progressWrites = writeBranchProgress(progressFile, record)
78
+ .catch(() => undefined)
79
+ .finally(() => {
80
+ progressWriting = false;
81
+ drainProgress();
82
+ });
83
+ };
84
+ const publishProgress = (phase, runId, screens) => {
85
+ emit({ kind: 'progress', phase, screens });
86
+ pendingProgress = {
87
+ version: 1,
88
+ runId,
89
+ phase,
90
+ startedAt,
91
+ updatedAt: new Date().toISOString(),
92
+ screens,
93
+ };
94
+ drainProgress();
95
+ };
96
+ const finished = await readBranchCompletion(completionFile);
97
+ if (finished) {
98
+ throw new Error(`This branch run already completed: ${completionFile} names run ${finished.runId},`
99
+ + ` ${finished.succeededCount} succeeded screen(s), and every page's conversion. Read it`
100
+ + ' rather than running the branch again, or choose a new --out-dir to start a new run.');
101
+ }
102
+ const existing = await readBranchAttempt(attemptFile);
103
+ if (existing && !args.resume) {
104
+ throw new Error(`Branch attempt evidence already exists at ${attemptFile} for run`
105
+ + ` ${existing.runId ?? '(unclaimed)'}. Re-run the identical command with --resume to`
106
+ + ' continue it: a resume replays every settled screen for free and re-dispatches only'
107
+ + ' what is still pending. It can never buy a screen twice.');
108
+ }
109
+ if (!existing && args.resume) {
110
+ // Never started, so nothing failed. This answers in a different register
111
+ // from a recovery report on purpose: a caller told "0 recovered" about work
112
+ // it never asked for concludes the service is broken and gives up.
113
+ throw new Error(`This branch run has never been started — there is nothing to resume, and nothing has`
114
+ + ` failed. There is no ${BRANCH_ATTEMPT_FILENAME} in ${outDir}. Run the same command`
115
+ + ' without --resume to start it; it blocks for the whole run and streams progress.');
116
+ }
117
+ if (existing && existing.runKey !== runKey) {
118
+ throw new Error(`Refusing to resume: ${outDir} holds run key ${existing.runKey} but these inputs derive`
119
+ + ` ${runKey}. A resume must replay the same winner, concept, and scope.`);
120
+ }
121
+ const attempt = existing ?? {
122
+ version: 1,
123
+ status: 'claiming',
124
+ runKey,
125
+ origin: args.origin,
126
+ scope: inputs.scope,
127
+ concept: inputs.concept,
128
+ conceptSha256: branchConceptDigest(inputs.concept),
129
+ winner: inputs.winner.kind === 'run'
130
+ ? { kind: 'run', runId: inputs.winner.runId, slot: inputs.winner.slot }
131
+ : {
132
+ kind: 'image',
133
+ imagePath: inputs.winner.imagePath,
134
+ sha256: inputs.winner.sha256,
135
+ mediaType: inputs.winner.mediaType,
136
+ },
137
+ ...(inputs.aspect ? { aspect: inputs.aspect } : {}),
138
+ ...(inputs.maxScreens === undefined ? {} : { maxScreens: inputs.maxScreens }),
139
+ ...(inputs.convert
140
+ ? {
141
+ convert: {
142
+ output: inputs.convert.output,
143
+ model: inputs.convert.model ?? 'standard',
144
+ ...(inputs.convert.responsiveQuality
145
+ ? { responsiveQuality: inputs.convert.responsiveQuality }
146
+ : {}),
147
+ },
148
+ }
149
+ : {}),
150
+ ...(inputs.convert?.sourceConversionId
151
+ ? { sourceConversionId: inputs.convert.sourceConversionId }
152
+ : {}),
153
+ createdAt: startedAt,
154
+ };
155
+ if (existing) {
156
+ attempt.resumedAt = [...(attempt.resumedAt ?? []), startedAt];
157
+ await writeBranchAttempt(attemptFile, attempt);
158
+ }
159
+ else {
160
+ await writeBranchAttempt(attemptFile, attempt, true);
161
+ }
162
+ emit({ kind: 'phase', phase: 'claim', detail: 'planning the screens (10-20s, buys no image)' });
163
+ const envelope = attempt.runId
164
+ ? await args.branchClient.getRun(attempt.runId, args.signal)
165
+ : await claimBuildRun({
166
+ client: args.branchClient,
167
+ inputs,
168
+ runKey,
169
+ ...(args.signal ? { signal: args.signal } : {}),
170
+ });
171
+ attempt.runId = envelope.id;
172
+ attempt.status = 'dispatching';
173
+ await writeBranchAttempt(attemptFile, attempt);
174
+ let plan = normalizeBranchPlan(envelope, {
175
+ scope: inputs.scope,
176
+ ...(inputs.maxScreens === undefined ? {} : { maxScreens: inputs.maxScreens }),
177
+ });
178
+ await writeBranchPlanRecord(branchPlanPath(outDir), plan);
179
+ emit({
180
+ kind: 'phase',
181
+ phase: 'plan',
182
+ detail: `${plan.pages.length} page(s), ${plan.screens.length} screen(s) to generate`,
183
+ });
184
+ let stopped = null;
185
+ publishProgress('dispatching', envelope.id, branchProgressScreens(plan, {}));
186
+ if (plan.screens.length > 0) {
187
+ const dispatched = await runBranchDispatch({
188
+ client: args.branchClient,
189
+ plan,
190
+ onEvent: emit,
191
+ onSnapshot: (snapshot) => publishProgress('dispatching', envelope.id, branchProgressScreens(snapshot.plan, snapshot.dispatchedAt)),
192
+ ...(args.signal ? { signal: args.signal } : {}),
193
+ ...(args.dispatch ?? {}),
194
+ });
195
+ plan = dispatched.plan;
196
+ stopped = dispatched.stopped;
197
+ }
198
+ else {
199
+ plan = applyBranchEnvelope(plan, envelope);
200
+ }
201
+ attempt.status = 'downloading';
202
+ publishProgress('downloading', envelope.id, branchProgressScreens(plan, {}));
203
+ await writeBranchAttempt(attemptFile, attempt);
204
+ const { screens, winner } = await materializeRun({
205
+ client: args.branchClient,
206
+ plan,
207
+ inputs,
208
+ screensDirectory,
209
+ needsWinner: Boolean(inputs.convert) && plan.pages.some((page) => page.startsFromWinner),
210
+ ...(args.signal ? { signal: args.signal } : {}),
211
+ });
212
+ emit({ kind: 'phase', phase: 'download', detail: `${screens.size} screen(s) on disk` });
213
+ const conversions = new Map();
214
+ if (inputs.convert && !stopped) {
215
+ attempt.status = 'converting';
216
+ publishProgress('converting', envelope.id, branchProgressScreens(plan, {}));
217
+ await writeBranchAttempt(attemptFile, attempt);
218
+ if (!args.packageClient)
219
+ throw new Error('A conversion package client is required for --convert');
220
+ emit({ kind: 'phase', phase: 'convert', detail: 'one package conversion per whole page' });
221
+ const converted = await convertBranchPages({
222
+ client: args.packageClient,
223
+ plan,
224
+ screens,
225
+ settings: inputs.convert,
226
+ pagesDirectory,
227
+ ...(winner ? { winner } : {}),
228
+ ...(args.packageTimeoutMs === undefined ? {} : { timeoutMs: args.packageTimeoutMs }),
229
+ onProgress: (pageId, progress) => emit({ kind: 'package', pageId, progress }),
230
+ ...(args.signal ? { signal: args.signal } : {}),
231
+ });
232
+ for (const [pageId, conversion] of converted)
233
+ conversions.set(pageId, conversion);
234
+ }
235
+ const completion = buildCompletion({
236
+ plan,
237
+ inputs,
238
+ runKey,
239
+ origin: args.origin,
240
+ outDir,
241
+ attemptFile,
242
+ startedAt,
243
+ screens,
244
+ ...(winner ? { winner } : {}),
245
+ conversions,
246
+ stopped,
247
+ });
248
+ publishProgress('terminal', envelope.id, branchProgressScreens(plan, {}));
249
+ await progressWrites;
250
+ await writeBranchCompletion(completionFile, completion);
251
+ attempt.status = completion.status;
252
+ attempt.completedAt = completion.completedAt;
253
+ attempt.completionPath = completionFile;
254
+ await writeBranchAttempt(attemptFile, attempt);
255
+ return {
256
+ completion,
257
+ completionPath: completionFile,
258
+ failure: terminalFailure({ completion, stopped, completionFile, convert: Boolean(inputs.convert) }),
259
+ };
260
+ };
261
+ //# sourceMappingURL=branch-execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-execution.js","sourceRoot":"","sources":["../src/branch-execution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Every identity a branch run needs, derived from its inputs rather than
3
+ * authored. Free-text keys are load-bearing in both directions here: the same
4
+ * key with a changed body wedges the claim with `409 idempotency_conflict`, and
5
+ * a NEW key on a settled slot buys another image. Deriving them removes both
6
+ * failure modes from the agent's hands.
7
+ *
8
+ * Digests are truncated because `Idempotency-Key` is capped at 128 printable
9
+ * characters and a run id alone is 44 of them. 16 hex characters is 64 bits of
10
+ * collision resistance over inputs that are already scoped by run id, which is
11
+ * far more than the number of runs any account will ever hold.
12
+ */
13
+ export declare const BRANCH_WORKFLOW_REVISION = "branch-execute-v1";
14
+ export type BranchScope = 'page' | 'site';
15
+ export declare const branchConceptDigest: (concept: string) => string;
16
+ /**
17
+ * Same inputs -> same run, so an interrupted claim replays instead of starting
18
+ * a second one. A changed concept is a different design problem and therefore a
19
+ * different run, so it derives a new key rather than wedging the old one.
20
+ */
21
+ export declare const branchRunKey: (args: {
22
+ winner: {
23
+ runId: string;
24
+ slot: string;
25
+ } | {
26
+ imageSha256: string;
27
+ };
28
+ concept: string;
29
+ scope: BranchScope;
30
+ }) => string;
31
+ /**
32
+ * The ONLY keyed dispatch. Automatic dispatch is unkeyed so every replay is
33
+ * free; a redraw is an explicit request for one further paid attempt and needs
34
+ * a key the settled slot has never seen.
35
+ */
36
+ export declare const branchRedrawKey: (args: {
37
+ runId: string;
38
+ slot: string;
39
+ attempt: number;
40
+ }) => string;
41
+ /**
42
+ * Stable under retry and distinct per page. Keying on the ordered viewport
43
+ * hashes means a resumed run that downloaded the same bytes replays the same
44
+ * package rather than buying a second one, while a redrawn screen produces a
45
+ * genuinely different page and therefore a genuinely different key.
46
+ */
47
+ export declare const branchPackageKey: (args: {
48
+ runId: string;
49
+ pageIndex: number;
50
+ viewportSha256s: readonly string[];
51
+ output: string;
52
+ model?: string;
53
+ responsiveQuality?: string;
54
+ }) => string;
55
+ /** Standalone `convert package` runs derive from the manifest they were given. */
56
+ export declare const conversionPackageKey: (args: {
57
+ manifestSha256: string;
58
+ output: string;
59
+ }) => string;
60
+ /**
61
+ * Standalone `export` runs derive from the conversion they re-render. The
62
+ * export command appends the output and a digest of the request body to this
63
+ * base, so the base only has to pin the source: exporting the same conversion
64
+ * to the same format twice is the same paid work and must replay rather than
65
+ * buy it again, while a different format or profile lands on a different key
66
+ * through the suffix.
67
+ */
68
+ export declare const conversionExportKey: (args: {
69
+ sourceConversionId: string;
70
+ }) => string;
71
+ //# sourceMappingURL=branch-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-identity.d.ts","sourceRoot":"","sources":["../src/branch-identity.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,wBAAwB,sBAAsB,CAAC;AAE5D,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;AAM1C,eAAO,MAAM,mBAAmB,GAAI,SAAS,MAAM,KAAG,MAErD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,MAAM;IACjC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,WAAW,CAAC;CACpB,KAAG,MAYH,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAAI,MAAM;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,KAAG,MAAoE,CAAC;AAEzE;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,MAAM;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,KAAG,MAaO,CAAC;AAEZ,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,GAAI,MAAM;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB,KAAG,MAAiF,CAAC;AAEtF;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,GAAI,MAAM;IACxC,kBAAkB,EAAE,MAAM,CAAC;CAC5B,KAAG,MAAwD,CAAC"}
@@ -0,0 +1,72 @@
1
+ import { createHash } from 'node:crypto';
2
+ /**
3
+ * Every identity a branch run needs, derived from its inputs rather than
4
+ * authored. Free-text keys are load-bearing in both directions here: the same
5
+ * key with a changed body wedges the claim with `409 idempotency_conflict`, and
6
+ * a NEW key on a settled slot buys another image. Deriving them removes both
7
+ * failure modes from the agent's hands.
8
+ *
9
+ * Digests are truncated because `Idempotency-Key` is capped at 128 printable
10
+ * characters and a run id alone is 44 of them. 16 hex characters is 64 bits of
11
+ * collision resistance over inputs that are already scoped by run id, which is
12
+ * far more than the number of runs any account will ever hold.
13
+ */
14
+ export const BRANCH_WORKFLOW_REVISION = 'branch-execute-v1';
15
+ const shortDigest = (value, characters = 16) => (createHash('sha256').update(value).digest('hex').slice(0, characters));
16
+ export const branchConceptDigest = (concept) => (createHash('sha256').update(concept).digest('hex'));
17
+ /**
18
+ * Same inputs -> same run, so an interrupted claim replays instead of starting
19
+ * a second one. A changed concept is a different design problem and therefore a
20
+ * different run, so it derives a new key rather than wedging the old one.
21
+ */
22
+ export const branchRunKey = (args) => {
23
+ const origin = 'runId' in args.winner
24
+ ? `${args.winner.runId}:${args.winner.slot}`
25
+ : `img-${args.winner.imageSha256.slice(0, 32)}:-`;
26
+ return [
27
+ 'branch',
28
+ 'v1',
29
+ origin,
30
+ shortDigest(args.concept),
31
+ args.scope,
32
+ BRANCH_WORKFLOW_REVISION,
33
+ ].join(':');
34
+ };
35
+ /**
36
+ * The ONLY keyed dispatch. Automatic dispatch is unkeyed so every replay is
37
+ * free; a redraw is an explicit request for one further paid attempt and needs
38
+ * a key the settled slot has never seen.
39
+ */
40
+ export const branchRedrawKey = (args) => `branch-screen:${args.runId}:${args.slot}:${args.attempt}`;
41
+ /**
42
+ * Stable under retry and distinct per page. Keying on the ordered viewport
43
+ * hashes means a resumed run that downloaded the same bytes replays the same
44
+ * package rather than buying a second one, while a redrawn screen produces a
45
+ * genuinely different page and therefore a genuinely different key.
46
+ */
47
+ export const branchPackageKey = (args) => [
48
+ 'branch-package',
49
+ 'v1',
50
+ args.runId,
51
+ String(args.pageIndex),
52
+ shortDigest(args.viewportSha256s.join('.'), 32),
53
+ args.output,
54
+ // Everything that changes the request body has to be in the key. Model and
55
+ // quality are body fields, so leaving them out turns a deliberate change of
56
+ // model into `409 idempotency_conflict` on a page that was never bought —
57
+ // measured against production while smoke-testing this command.
58
+ args.model ?? 'standard',
59
+ args.responsiveQuality ?? 'default',
60
+ ].join(':');
61
+ /** Standalone `convert package` runs derive from the manifest they were given. */
62
+ export const conversionPackageKey = (args) => `convert-package:v1:${args.manifestSha256.slice(0, 32)}:${args.output}`;
63
+ /**
64
+ * Standalone `export` runs derive from the conversion they re-render. The
65
+ * export command appends the output and a digest of the request body to this
66
+ * base, so the base only has to pin the source: exporting the same conversion
67
+ * to the same format twice is the same paid work and must replay rather than
68
+ * buy it again, while a different format or profile lands on a different key
69
+ * through the suffix.
70
+ */
71
+ export const conversionExportKey = (args) => `convert-export:v1:${args.sourceConversionId}`;
72
+ //# sourceMappingURL=branch-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-identity.js","sourceRoot":"","sources":["../src/branch-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;;;;;;;GAWG;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,mBAAmB,CAAC;AAI5D,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,UAAU,GAAG,EAAE,EAAU,EAAE,CAAC,CAC9D,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CACtE,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,CAC9D,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACnD,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAI5B,EAAU,EAAE;IACX,MAAM,MAAM,GAAG,OAAO,IAAI,IAAI,CAAC,MAAM;QACnC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QAC5C,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;IACpD,OAAO;QACL,QAAQ;QACR,IAAI;QACJ,MAAM;QACN,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;QACzB,IAAI,CAAC,KAAK;QACV,wBAAwB;KACzB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAI/B,EAAU,EAAE,CAAC,iBAAiB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;AAEzE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAOhC,EAAU,EAAE,CAAC;IACZ,gBAAgB;IAChB,IAAI;IACJ,IAAI,CAAC,KAAK;IACV,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;IACtB,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IAC/C,IAAI,CAAC,MAAM;IACX,2EAA2E;IAC3E,4EAA4E;IAC5E,0EAA0E;IAC1E,gEAAgE;IAChE,IAAI,CAAC,KAAK,IAAI,UAAU;IACxB,IAAI,CAAC,iBAAiB,IAAI,SAAS;CACpC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,kFAAkF;AAClF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,IAGpC,EAAU,EAAE,CAAC,sBAAsB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;AAEtF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAEnC,EAAU,EAAE,CAAC,qBAAqB,IAAI,CAAC,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { TwelveUiBranchClient } from './branch-client.js';
2
+ import { type BranchDownloadedScreen } from './branch-downloads.js';
3
+ import type { BranchExecutionInputs } from './branch-execution-types.js';
4
+ import type { BranchNormalizedPlan } from './branch-plan.js';
5
+ /**
6
+ * Delivery. Every screen the run bought is staged first and moved into place in
7
+ * ONE atomic pass, so `screens/` goes from empty to complete and a caller can
8
+ * never mistake a half-written run for a failed one. Bytes already on disk were
9
+ * already paid for, which is what makes a resume free.
10
+ */
11
+ export declare const materializeRun: (args: {
12
+ client: TwelveUiBranchClient;
13
+ plan: BranchNormalizedPlan;
14
+ inputs: BranchExecutionInputs;
15
+ screensDirectory: string;
16
+ needsWinner: boolean;
17
+ signal?: AbortSignal;
18
+ }) => Promise<{
19
+ screens: Map<string, BranchDownloadedScreen>;
20
+ winner?: BranchDownloadedScreen;
21
+ }>;
22
+ //# sourceMappingURL=branch-materialize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-materialize.d.ts","sourceRoot":"","sources":["../src/branch-materialize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAKL,KAAK,sBAAsB,EAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7D;;;;;GAKG;AAEH,eAAO,MAAM,cAAc,GAAU,MAAM;IACzC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,IAAI,EAAE,oBAAoB,CAAC;IAC3B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,KAAG,OAAO,CAAC;IAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,sBAAsB,CAAA;CAAE,CA4C5F,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { materializeBranchScreens, readMaterializedScreen, stageBranchScreen, stageBranchScreenBytes, } from './branch-downloads.js';
2
+ /**
3
+ * Delivery. Every screen the run bought is staged first and moved into place in
4
+ * ONE atomic pass, so `screens/` goes from empty to complete and a caller can
5
+ * never mistake a half-written run for a failed one. Bytes already on disk were
6
+ * already paid for, which is what makes a resume free.
7
+ */
8
+ export const materializeRun = async (args) => {
9
+ const screens = new Map();
10
+ const staged = [];
11
+ const succeeded = args.plan.screens.filter((screen) => screen.status === 'succeeded');
12
+ for (const screen of succeeded) {
13
+ // Bytes already on disk were already paid for and already delivered.
14
+ const materialized = await readMaterializedScreen(args.screensDirectory, screen.slot);
15
+ if (materialized) {
16
+ screens.set(screen.slot, materialized);
17
+ continue;
18
+ }
19
+ screens.set(screen.slot, await stageBranchScreen({
20
+ client: args.client,
21
+ runId: args.plan.runId,
22
+ slot: screen.slot,
23
+ screensDirectory: args.screensDirectory,
24
+ ...(args.signal ? { signal: args.signal } : {}),
25
+ }));
26
+ staged.push(screen.slot);
27
+ }
28
+ let winner;
29
+ if (args.needsWinner) {
30
+ winner = await readMaterializedScreen(args.screensDirectory, 'winner') ?? undefined;
31
+ if (!winner) {
32
+ const bytes = args.inputs.winner.kind === 'image'
33
+ ? args.inputs.winner.bytes
34
+ : (await args.client.downloadScreen(args.inputs.winner.runId, args.inputs.winner.slot, args.signal)).bytes;
35
+ winner = await stageBranchScreenBytes({
36
+ screensDirectory: args.screensDirectory,
37
+ slot: 'winner',
38
+ bytes,
39
+ });
40
+ staged.push('winner');
41
+ }
42
+ }
43
+ // One atomic pass: the screens directory goes from empty to complete.
44
+ await materializeBranchScreens(args.screensDirectory, staged);
45
+ return { screens, ...(winner ? { winner } : {}) };
46
+ };
47
+ //# sourceMappingURL=branch-materialize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-materialize.js","sourceRoot":"","sources":["../src/branch-materialize.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wBAAwB,EACxB,sBAAsB,EACtB,iBAAiB,EACjB,sBAAsB,GAEvB,MAAM,uBAAuB,CAAC;AAI/B;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,IAOpC,EAA8F,EAAE;IAC/F,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkC,CAAC;IAC1D,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;IACtF,KAAK,MAAM,MAAM,IAAI,SAAS,EAAE,CAAC;QAC/B,qEAAqE;QACrE,MAAM,YAAY,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACtF,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YACvC,SAAS;QACX,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,iBAAiB,CAAC;YAC/C,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;YACtB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChD,CAAC,CAAC,CAAC;QACJ,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,MAA0C,CAAC;IAC/C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,IAAI,SAAS,CAAC;QACpF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO;gBAC/C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK;gBAC1B,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CACjC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EACxB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EACvB,IAAI,CAAC,MAAM,CACZ,CAAC,CAAC,KAAK,CAAC;YACX,MAAM,GAAG,MAAM,sBAAsB,CAAC;gBACpC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,IAAI,EAAE,QAAQ;gBACd,KAAK;aACN,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,MAAM,wBAAwB,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC9D,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACpD,CAAC,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { ConversionModel } from './conversion-models.js';
2
+ import type { ResponsiveConversionQuality } from './responsive-quality.js';
3
+ import type { BranchDownloadedScreen } from './branch-downloads.js';
4
+ import type { BranchNormalizedPlan } from './branch-plan.js';
5
+ import type { BranchCompletionPage } from './branch-run-record.js';
6
+ import type { TwelveUiConversionPackageClient } from './package-client.js';
7
+ import { type PackageProgressEvent } from './package-submission.js';
8
+ /**
9
+ * The terminal step: ordered viewports of ONE page become ONE package
10
+ * conversion. Viewport 1 of the source page is the approved winner — the
11
+ * server never generates it — so the package is what makes the winner and its
12
+ * continuations one document instead of a pile of separately converted images.
13
+ *
14
+ * A page with a hole in it is parked, not converted: stitching an incomplete
15
+ * page would silently ship a page that is missing a section. Its siblings still
16
+ * convert, because one failed screen must not cost the pages that are whole.
17
+ */
18
+ export type BranchConversionSettings = {
19
+ output: 'html';
20
+ model?: ConversionModel;
21
+ responsiveQuality?: ResponsiveConversionQuality;
22
+ /** Reuse of an existing succeeded conversion of the winner's exact bytes. */
23
+ sourceConversionId?: string;
24
+ };
25
+ export declare const WINNER_VIEWPORT_ID = "winner";
26
+ type PageConversion = NonNullable<BranchCompletionPage['conversion']>;
27
+ export declare const convertBranchPages: (args: {
28
+ client: TwelveUiConversionPackageClient;
29
+ plan: BranchNormalizedPlan;
30
+ screens: ReadonlyMap<string, BranchDownloadedScreen>;
31
+ winner?: BranchDownloadedScreen;
32
+ settings: BranchConversionSettings;
33
+ pagesDirectory: string;
34
+ timeoutMs?: number;
35
+ onProgress?: (pageId: string, event: PackageProgressEvent) => void;
36
+ signal?: AbortSignal;
37
+ }) => Promise<Map<string, PageConversion>>;
38
+ export {};
39
+ //# sourceMappingURL=branch-page-conversion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-page-conversion.d.ts","sourceRoot":"","sources":["../src/branch-page-conversion.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAE3E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,qBAAqB,CAAC;AAM3E,OAAO,EAGL,KAAK,oBAAoB,EAE1B,MAAM,yBAAyB,CAAC;AAEjC;;;;;;;;;GASG;AAEH,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,iBAAiB,CAAC,EAAE,2BAA2B,CAAC;IAChD,6EAA6E;IAC7E,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAE3C,KAAK,cAAc,GAAG,WAAW,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC,CAAC;AActE,eAAO,MAAM,kBAAkB,GAAU,MAAM;IAC7C,MAAM,EAAE,+BAA+B,CAAC;IACxC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACrD,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,QAAQ,EAAE,wBAAwB,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACnE,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,KAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAkMtC,CAAC"}