@12ui/design 0.2.12 → 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 (203) hide show
  1. package/README.md +44 -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 +5 -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 +166 -54
  91. package/dist/cli-image-batch-command.js.map +1 -1
  92. package/dist/cli-image-batch-materialize.d.ts +27 -0
  93. package/dist/cli-image-batch-materialize.d.ts.map +1 -0
  94. package/dist/cli-image-batch-materialize.js +41 -0
  95. package/dist/cli-image-batch-materialize.js.map +1 -0
  96. package/dist/cli-image-batch-resume.d.ts +34 -0
  97. package/dist/cli-image-batch-resume.d.ts.map +1 -0
  98. package/dist/cli-image-batch-resume.js +175 -0
  99. package/dist/cli-image-batch-resume.js.map +1 -0
  100. package/dist/cli-image-command.d.ts.map +1 -1
  101. package/dist/cli-image-command.js +14 -2
  102. package/dist/cli-image-command.js.map +1 -1
  103. package/dist/cli-package-command.d.ts +18 -0
  104. package/dist/cli-package-command.d.ts.map +1 -0
  105. package/dist/cli-package-command.js +112 -0
  106. package/dist/cli-package-command.js.map +1 -0
  107. package/dist/cli-progress.d.ts +61 -0
  108. package/dist/cli-progress.d.ts.map +1 -1
  109. package/dist/cli-progress.js +53 -0
  110. package/dist/cli-progress.js.map +1 -1
  111. package/dist/cli-select-command.d.ts +12 -0
  112. package/dist/cli-select-command.d.ts.map +1 -0
  113. package/dist/cli-select-command.js +66 -0
  114. package/dist/cli-select-command.js.map +1 -0
  115. package/dist/cli.js +140 -7
  116. package/dist/cli.js.map +1 -1
  117. package/dist/create-identity.d.ts +25 -0
  118. package/dist/create-identity.d.ts.map +1 -0
  119. package/dist/create-identity.js +0 -0
  120. package/dist/create-identity.js.map +1 -0
  121. package/dist/draft-identity.d.ts +30 -0
  122. package/dist/draft-identity.d.ts.map +1 -0
  123. package/dist/draft-identity.js +0 -0
  124. package/dist/draft-identity.js.map +1 -0
  125. package/dist/draft-prompts.d.ts +35 -0
  126. package/dist/draft-prompts.d.ts.map +1 -0
  127. package/dist/draft-prompts.js +51 -0
  128. package/dist/draft-prompts.js.map +1 -0
  129. package/dist/draft-run.d.ts +32 -0
  130. package/dist/draft-run.d.ts.map +1 -0
  131. package/dist/draft-run.js +152 -0
  132. package/dist/draft-run.js.map +1 -0
  133. package/dist/draft-workspace.d.ts +90 -0
  134. package/dist/draft-workspace.d.ts.map +1 -0
  135. package/dist/draft-workspace.js +64 -0
  136. package/dist/draft-workspace.js.map +1 -0
  137. package/dist/image-batch-status.d.ts +42 -0
  138. package/dist/image-batch-status.d.ts.map +1 -0
  139. package/dist/image-batch-status.js +142 -0
  140. package/dist/image-batch-status.js.map +1 -0
  141. package/dist/image-dimensions.d.ts +12 -0
  142. package/dist/image-dimensions.d.ts.map +1 -0
  143. package/dist/image-dimensions.js +14 -0
  144. package/dist/image-dimensions.js.map +1 -0
  145. package/dist/image-generation-batch-attempt.d.ts +28 -0
  146. package/dist/image-generation-batch-attempt.d.ts.map +1 -0
  147. package/dist/image-generation-batch-attempt.js +48 -0
  148. package/dist/image-generation-batch-attempt.js.map +1 -0
  149. package/dist/image-generation-completion.d.ts +43 -0
  150. package/dist/image-generation-completion.d.ts.map +1 -0
  151. package/dist/image-generation-completion.js +54 -0
  152. package/dist/image-generation-completion.js.map +1 -0
  153. package/dist/image-generation-fs.d.ts +3 -0
  154. package/dist/image-generation-fs.d.ts.map +1 -0
  155. package/dist/image-generation-fs.js +23 -0
  156. package/dist/image-generation-fs.js.map +1 -0
  157. package/dist/image-generation-request.d.ts +13 -3
  158. package/dist/image-generation-request.d.ts.map +1 -1
  159. package/dist/image-generation-request.js +21 -19
  160. package/dist/image-generation-request.js.map +1 -1
  161. package/dist/image-generation-resume.d.ts +49 -0
  162. package/dist/image-generation-resume.d.ts.map +1 -0
  163. package/dist/image-generation-resume.js +96 -0
  164. package/dist/image-generation-resume.js.map +1 -0
  165. package/dist/image-generation-run.d.ts +11 -0
  166. package/dist/image-generation-run.d.ts.map +1 -1
  167. package/dist/image-generation-run.js +23 -9
  168. package/dist/image-generation-run.js.map +1 -1
  169. package/dist/image-generation-staging.d.ts +25 -0
  170. package/dist/image-generation-staging.d.ts.map +1 -0
  171. package/dist/image-generation-staging.js +80 -0
  172. package/dist/image-generation-staging.js.map +1 -0
  173. package/dist/index.d.ts +5 -0
  174. package/dist/index.d.ts.map +1 -1
  175. package/dist/index.js +4 -0
  176. package/dist/index.js.map +1 -1
  177. package/dist/legacy-skill-catalog.d.ts.map +1 -1
  178. package/dist/legacy-skill-catalog.js +133 -0
  179. package/dist/legacy-skill-catalog.js.map +1 -1
  180. package/dist/package-manifest-file.d.ts +21 -0
  181. package/dist/package-manifest-file.d.ts.map +1 -0
  182. package/dist/package-manifest-file.js +119 -0
  183. package/dist/package-manifest-file.js.map +1 -0
  184. package/dist/package-manifest-template.d.ts +23 -0
  185. package/dist/package-manifest-template.d.ts.map +1 -0
  186. package/dist/package-manifest-template.js +60 -0
  187. package/dist/package-manifest-template.js.map +1 -0
  188. package/dist/package-submission.d.ts +103 -0
  189. package/dist/package-submission.d.ts.map +1 -0
  190. package/dist/package-submission.js +173 -0
  191. package/dist/package-submission.js.map +1 -0
  192. package/dist/selection-record.d.ts +95 -0
  193. package/dist/selection-record.d.ts.map +1 -0
  194. package/dist/selection-record.js +121 -0
  195. package/dist/selection-record.js.map +1 -0
  196. package/package.json +1 -1
  197. package/skills/design/SKILL.md +55 -240
  198. package/skills/design-branch/SKILL.md +36 -116
  199. package/skills/design-convert/SKILL.md +62 -132
  200. package/skills/design-draft/SKILL.md +71 -135
  201. package/skills/design-search/SKILL.md +29 -78
  202. package/skills/design/references/continuation-contract.md +0 -60
  203. package/skills/design/references/selection-contract.md +0 -96
@@ -0,0 +1,74 @@
1
+ /**
2
+ * One page stacks into one tall source, so every viewport of it must share one
3
+ * width. Branch pages mix two origins that cannot agree on their own:
4
+ *
5
+ * - the CONTINUATION screens, drawn by the server on a canvas fixed by the
6
+ * run's aspect (`CREATE_ASPECT_SIZES`, 1536x1024 for landscape). The build
7
+ * claim accepts `source`, `concept`, `aspect`, `winner` and
8
+ * `referenceImage` and nothing else — there is no width parameter — so the
9
+ * server side of the page CANNOT be moved to meet the winner.
10
+ * - the WINNER, viewport 1 of the source page, which came from a local image
11
+ * provider or an upload and is whatever size that produced. Measured across
12
+ * the 0.2.14 harness pass: 1672x941, 864x1821, 853x1844, 1024x1536, and in
13
+ * one run 1536x1024 — the only run whose page could have converted.
14
+ *
15
+ * So the canonical width is the server's, read off the screens it actually
16
+ * produced, and the local image is the one that moves. That is a declared fact
17
+ * on both sides rather than a tuned guess: the width is measured from the
18
+ * delivered pixels the package validator will itself inspect.
19
+ *
20
+ * Only the width is reconciled. Heights differ on purpose — a page is a stack
21
+ * of viewports of different depths — so the resize preserves aspect ratio and
22
+ * the viewport simply becomes as tall as that width implies.
23
+ */
24
+ /** The joined page must still fit the LayerDoc canvas and source-pixel limits. */
25
+ export declare const MAX_JOINED_PAGE_SIDE = 10000;
26
+ export declare const MAX_JOINED_PAGE_PIXELS = 8000000;
27
+ export type ViewportImage = {
28
+ id: string;
29
+ bytes: Uint8Array;
30
+ mediaType: 'image/png' | 'image/jpeg' | 'image/webp';
31
+ width: number;
32
+ height: number;
33
+ /** True for a screen the server drew: it defines the page's canonical width. */
34
+ canonical: boolean;
35
+ };
36
+ export type NormalizedViewportImage = ViewportImage & {
37
+ sha256: string;
38
+ normalized: boolean;
39
+ original?: {
40
+ width: number;
41
+ height: number;
42
+ sha256: string;
43
+ bytes: number;
44
+ };
45
+ };
46
+ export declare const digestOf: (bytes: Uint8Array) => string;
47
+ /**
48
+ * The width every viewport of this page is reconciled to: the width the server
49
+ * drew its screens at. With no server screen on the page there is nothing to
50
+ * reconcile and the page keeps the width it already has.
51
+ */
52
+ export declare const canonicalPageWidth: (viewports: readonly ViewportImage[]) => number | null;
53
+ export type PageNormalization = {
54
+ canonicalWidth: number | null;
55
+ /** True when the page was narrowed below the server's canvas to fit a limit. */
56
+ fitted: boolean;
57
+ viewports: NormalizedViewportImage[];
58
+ /** Ids that were resized, for the run record and the report. */
59
+ normalizedIds: string[];
60
+ };
61
+ /**
62
+ * The widest the page may be and still join inside both limits.
63
+ *
64
+ * Every viewport scales with the page, so the joined height is `width * K`
65
+ * where K is the sum of the viewports' height/width ratios. That makes the
66
+ * pixel limit `width² * K <= P` and the side limit `width * K <= S`, both
67
+ * solvable directly. Shrinking the whole page keeps it convertible and keeps
68
+ * every viewport in proportion; refusing would hand back nothing, and a tall
69
+ * approved screen stacked over three continuations is a shape the harness
70
+ * actually produced (864x1821 over three 1536x1024 screens is 9.7M pixels).
71
+ */
72
+ export declare const widthThatFits: (requested: number, viewports: readonly ViewportImage[]) => number;
73
+ export declare const normalizePageViewports: (viewports: readonly ViewportImage[]) => Promise<PageNormalization>;
74
+ //# sourceMappingURL=branch-viewport-normalization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-viewport-normalization.d.ts","sourceRoot":"","sources":["../src/branch-viewport-normalization.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAC3C,eAAO,MAAM,sBAAsB,UAAY,CAAC;AAEhD,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,WAAW,GAAG,YAAY,GAAG,YAAY,CAAC;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,aAAa,GAAG;IACpD,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7E,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,OAAO,UAAU,KAAG,MAE5C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,WAAW,SAAS,aAAa,EAAE,KAAG,MAAM,GAAG,IAYjF,CAAC;AAoCF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gFAAgF;IAChF,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,uBAAuB,EAAE,CAAC;IACrC,gEAAgE;IAChE,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa,GACxB,WAAW,MAAM,EACjB,WAAW,SAAS,aAAa,EAAE,KAClC,MASF,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,WAAW,SAAS,aAAa,EAAE,KAClC,OAAO,CAAC,iBAAiB,CAuB3B,CAAC"}
@@ -0,0 +1,120 @@
1
+ import { createHash } from 'node:crypto';
2
+ import sharp from 'sharp';
3
+ import { readImageDimensions } from './image-dimensions.js';
4
+ /**
5
+ * One page stacks into one tall source, so every viewport of it must share one
6
+ * width. Branch pages mix two origins that cannot agree on their own:
7
+ *
8
+ * - the CONTINUATION screens, drawn by the server on a canvas fixed by the
9
+ * run's aspect (`CREATE_ASPECT_SIZES`, 1536x1024 for landscape). The build
10
+ * claim accepts `source`, `concept`, `aspect`, `winner` and
11
+ * `referenceImage` and nothing else — there is no width parameter — so the
12
+ * server side of the page CANNOT be moved to meet the winner.
13
+ * - the WINNER, viewport 1 of the source page, which came from a local image
14
+ * provider or an upload and is whatever size that produced. Measured across
15
+ * the 0.2.14 harness pass: 1672x941, 864x1821, 853x1844, 1024x1536, and in
16
+ * one run 1536x1024 — the only run whose page could have converted.
17
+ *
18
+ * So the canonical width is the server's, read off the screens it actually
19
+ * produced, and the local image is the one that moves. That is a declared fact
20
+ * on both sides rather than a tuned guess: the width is measured from the
21
+ * delivered pixels the package validator will itself inspect.
22
+ *
23
+ * Only the width is reconciled. Heights differ on purpose — a page is a stack
24
+ * of viewports of different depths — so the resize preserves aspect ratio and
25
+ * the viewport simply becomes as tall as that width implies.
26
+ */
27
+ /** The joined page must still fit the LayerDoc canvas and source-pixel limits. */
28
+ export const MAX_JOINED_PAGE_SIDE = 10_000;
29
+ export const MAX_JOINED_PAGE_PIXELS = 8_000_000;
30
+ export const digestOf = (bytes) => (createHash('sha256').update(bytes).digest('hex'));
31
+ /**
32
+ * The width every viewport of this page is reconciled to: the width the server
33
+ * drew its screens at. With no server screen on the page there is nothing to
34
+ * reconcile and the page keeps the width it already has.
35
+ */
36
+ export const canonicalPageWidth = (viewports) => {
37
+ const declared = viewports.filter((viewport) => viewport.canonical);
38
+ if (declared.length === 0)
39
+ return null;
40
+ const widths = new Set(declared.map((viewport) => viewport.width));
41
+ if (widths.size > 1) {
42
+ throw new Error(`The generated screens of this page disagree on their own width (${[...widths].sort().join(', ')}px).`
43
+ + ' That is a server-side contradiction, not something the client may resize around;'
44
+ + ' report the run id rather than reconciling it here.');
45
+ }
46
+ return declared[0].width;
47
+ };
48
+ const resizeToWidth = async (viewport, width) => {
49
+ const height = Math.max(1, Math.round(viewport.height * width / viewport.width));
50
+ const pipeline = sharp(viewport.bytes, { animated: false, failOn: 'warning' })
51
+ .autoOrient()
52
+ .resize({ width, height, fit: 'fill', kernel: sharp.kernel.lanczos3 });
53
+ const encoded = viewport.mediaType === 'image/jpeg'
54
+ ? pipeline.jpeg({ quality: 95 })
55
+ : viewport.mediaType === 'image/webp'
56
+ ? pipeline.webp({ quality: 95 })
57
+ : pipeline.png();
58
+ const bytes = new Uint8Array(await encoded.toBuffer());
59
+ const actual = await readImageDimensions(bytes);
60
+ if (actual.width !== width) {
61
+ throw new Error(`Viewport ${viewport.id} could not be normalized to ${width}px`);
62
+ }
63
+ return {
64
+ ...viewport,
65
+ bytes,
66
+ width: actual.width,
67
+ height: actual.height,
68
+ sha256: digestOf(bytes),
69
+ normalized: true,
70
+ original: {
71
+ width: viewport.width,
72
+ height: viewport.height,
73
+ sha256: digestOf(viewport.bytes),
74
+ bytes: viewport.bytes.byteLength,
75
+ },
76
+ };
77
+ };
78
+ /**
79
+ * The widest the page may be and still join inside both limits.
80
+ *
81
+ * Every viewport scales with the page, so the joined height is `width * K`
82
+ * where K is the sum of the viewports' height/width ratios. That makes the
83
+ * pixel limit `width² * K <= P` and the side limit `width * K <= S`, both
84
+ * solvable directly. Shrinking the whole page keeps it convertible and keeps
85
+ * every viewport in proportion; refusing would hand back nothing, and a tall
86
+ * approved screen stacked over three continuations is a shape the harness
87
+ * actually produced (864x1821 over three 1536x1024 screens is 9.7M pixels).
88
+ */
89
+ export const widthThatFits = (requested, viewports) => {
90
+ if (viewports.length < 2)
91
+ return requested;
92
+ const ratio = viewports.reduce((total, viewport) => total + viewport.height / viewport.width, 0);
93
+ if (ratio <= 0)
94
+ return requested;
95
+ return Math.max(1, Math.min(requested, Math.floor(Math.sqrt(MAX_JOINED_PAGE_PIXELS / ratio)), Math.floor(MAX_JOINED_PAGE_SIDE / ratio)));
96
+ };
97
+ export const normalizePageViewports = async (viewports) => {
98
+ const declared = canonicalPageWidth(viewports);
99
+ // With no server screen there is nothing to reconcile to, so the page keeps
100
+ // the width it has — but it must still fit, so the limit still applies.
101
+ const requested = declared ?? viewports[0]?.width ?? 0;
102
+ const canonicalWidth = widthThatFits(requested, viewports);
103
+ const resolved = await Promise.all(viewports.map(async (viewport) => {
104
+ if (canonicalWidth === 0 || viewport.width === canonicalWidth) {
105
+ return {
106
+ ...viewport,
107
+ sha256: digestOf(viewport.bytes),
108
+ normalized: false,
109
+ };
110
+ }
111
+ return resizeToWidth(viewport, canonicalWidth);
112
+ }));
113
+ return {
114
+ canonicalWidth: canonicalWidth === 0 ? null : canonicalWidth,
115
+ fitted: canonicalWidth < requested,
116
+ viewports: resolved,
117
+ normalizedIds: resolved.filter((viewport) => viewport.normalized).map((viewport) => viewport.id),
118
+ };
119
+ };
120
+ //# sourceMappingURL=branch-viewport-normalization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-viewport-normalization.js","sourceRoot":"","sources":["../src/branch-viewport-normalization.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli-arguments.d.ts","sourceRoot":"","sources":["../src/cli-arguments.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;AAYrD,eAAO,MAAM,iBAAiB,GAC5B,MAAM,MAAM,EAAE,KACb;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAqBtC,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,OAAO,QAAQ,EAAE,MAAM,MAAM,KAAG,MAAM,GAAG,SAGnE,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,OAAO,QAAQ,EAAE,MAAM,MAAM,KAAG,OAA+B,CAAC"}
1
+ {"version":3,"file":"cli-arguments.d.ts","sourceRoot":"","sources":["../src/cli-arguments.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;AAiBrD,eAAO,MAAM,iBAAiB,GAC5B,MAAM,MAAM,EAAE,KACb;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAqBtC,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,OAAO,QAAQ,EAAE,MAAM,MAAM,KAAG,MAAM,GAAG,SAGnE,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,OAAO,QAAQ,EAAE,MAAM,MAAM,KAAG,OAA+B,CAAC"}
@@ -1,11 +1,16 @@
1
+ // Every value-less flag must be listed here or the parser swallows the next
2
+ // token as its value.
1
3
  const booleanFlags = new Set([
2
4
  'detach',
5
+ 'dry-run',
3
6
  'force',
4
7
  'help',
5
8
  'json',
6
9
  'quiet',
10
+ 'resume',
7
11
  'skip-auth',
8
12
  'version',
13
+ 'wait',
9
14
  ]);
10
15
  export const parseCliArguments = (argv) => {
11
16
  const command = [];
@@ -1 +1 @@
1
- {"version":3,"file":"cli-arguments.js","sourceRoot":"","sources":["../src/cli-arguments.ts"],"names":[],"mappings":"AAEA,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,QAAQ;IACR,OAAO;IACP,MAAM;IACN,MAAM;IACN,OAAO;IACP,WAAW;IACX,SAAS;CACV,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,IAAc,EAC0B,EAAE;IAC1C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,IAAI,KAAK;gBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/B,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACjD,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YACnB,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,KAAK,IAAI,mBAAmB,CAAC,CAAC;QAClF,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACnB,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAe,EAAE,IAAY,EAAsB,EAAE;IAC9E,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAe,EAAE,IAAY,EAAW,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC"}
1
+ {"version":3,"file":"cli-arguments.js","sourceRoot":"","sources":["../src/cli-arguments.ts"],"names":[],"mappings":"AAEA,4EAA4E;AAC5E,sBAAsB;AACtB,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,QAAQ;IACR,SAAS;IACT,OAAO;IACP,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,WAAW;IACX,SAAS;IACT,MAAM;CACP,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,IAAc,EAC0B,EAAE;IAC1C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,IAAI,KAAK;gBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/B,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACjD,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YACnB,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,KAAK,IAAI,mBAAmB,CAAC,CAAC;QAClF,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACnB,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAe,EAAE,IAAY,EAAsB,EAAE;IAC9E,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAe,EAAE,IAAY,EAAW,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { type CliFlags } from './cli-arguments.js';
2
+ import { readConversionConfig } from './config.js';
3
+ import { TwelveUiBranchClient } from './branch-client.js';
4
+ import { TwelveUiConversionPackageClient } from './package-client.js';
5
+ export declare const BRANCH_USAGE = "Usage:\n 12ui branch execute --winner-run <crt-id> --winner-slot <slot>|--winner-image <file>\n --concept <text>|--concept-file <file> --scope page|site\n --out-dir <directory> [--convert html] [--convert-model fast|standard|pro]\n [--convert-quality standard|pro] [--source-conversion-id <id>]\n [--max-screens <n>] [--idempotency-key <key>] [--resume] [--dry-run]\n [--wait] [--quiet] [--origin <url>] [--api-key <key>]\n 12ui branch resume --out-dir <directory> [--quiet] [--origin <url>] [--api-key <key>]\n 12ui branch status --out-dir <directory> [--json] [--origin <url>] [--api-key <key>]";
6
+ /**
7
+ * `.12ui/site/.12ui/site/candidates/D.png` — measured in the harness pass, from
8
+ * an agent that resolved the run-directory convention against a cwd that was
9
+ * already inside it. The path is real, so nothing fails; the run just scatters.
10
+ * Say so once rather than refusing work over a cosmetic mistake.
11
+ */
12
+ export declare const nestedRunDirectoryWarning: (target: string) => string | null;
13
+ export type ResolvedBranchDirectory = {
14
+ /** Where this branch run's own records live. */
15
+ branchDir: string;
16
+ /** The draft run directory it belongs to, when there is one. */
17
+ runDir: string | null;
18
+ };
19
+ /**
20
+ * `12ui branch execute <run-dir>` takes the DRAFT run directory and keeps its
21
+ * own records in `<run-dir>/branch`, which is where the skill says the pages
22
+ * land. `--out-dir` stays an alias that names the branch directory outright,
23
+ * for a branch run with no draft behind it.
24
+ *
25
+ * `branch status` accepts either spelling: a directory that already holds
26
+ * branch records is one, and otherwise `<dir>/branch` is tried, so a caller who
27
+ * passes the run directory and one who passes the branch directory both get an
28
+ * answer instead of a lecture.
29
+ */
30
+ export declare const resolveBranchDirectory: (args: {
31
+ runDirArgument?: string;
32
+ outDirFlag?: string;
33
+ }) => Promise<ResolvedBranchDirectory>;
34
+ export declare const branchExecuteBanner: (args: {
35
+ scope: "page" | "site";
36
+ outDir: string;
37
+ convert: boolean;
38
+ }) => string;
39
+ export declare const runBranchCommand: (action: string | undefined, flags: CliFlags, dependencies?: {
40
+ readConfig?: typeof readConversionConfig;
41
+ createBranchClient?: (config: ReturnType<typeof readConversionConfig>) => TwelveUiBranchClient;
42
+ createPackageClient?: (config: ReturnType<typeof readConversionConfig>) => TwelveUiConversionPackageClient;
43
+ /** The positional `<run-dir>` from `12ui branch execute <run-dir>`. */
44
+ runDirArgument?: string;
45
+ }) => Promise<void>;
46
+ //# sourceMappingURL=cli-branch-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-branch-command.d.ts","sourceRoot":"","sources":["../src/cli-branch-command.ts"],"names":[],"mappings":"AAIA,OAAO,EAA2B,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAoD,MAAM,oBAAoB,CAAC;AAqB5G,OAAO,EAAE,+BAA+B,EAAE,MAAM,qBAAqB,CAAC;AAMtE,eAAO,MAAM,YAAY,usBAQ+D,CAAC;AAIzF;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,GAAI,QAAQ,MAAM,KAAG,MAAM,GAAG,IAOnE,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,GAAU,MAAM;IACjD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,KAAG,OAAO,CAAC,uBAAuB,CAuBlC,CAAC;AAgIF,eAAO,MAAM,mBAAmB,GAAI,MAAM;IACxC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB,KAAG,MAeH,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,MAAM,GAAG,SAAS,EAC1B,OAAO,QAAQ,EACf,eAAc;IACZ,UAAU,CAAC,EAAE,OAAO,oBAAoB,CAAC;IACzC,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC,KAAK,oBAAoB,CAAC;IAC/F,mBAAmB,CAAC,EAAE,CACpB,MAAM,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC,KAC5C,+BAA+B,CAAC;IACrC,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;CACpB,KACL,OAAO,CAAC,IAAI,CAwNd,CAAC"}