@12ui/design 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/README.md +484 -0
  2. package/dist/artifact-materializer.d.ts +17 -0
  3. package/dist/artifact-materializer.d.ts.map +1 -0
  4. package/dist/artifact-materializer.js +66 -0
  5. package/dist/artifact-materializer.js.map +1 -0
  6. package/dist/cli-arguments.d.ts +8 -0
  7. package/dist/cli-arguments.d.ts.map +1 -0
  8. package/dist/cli-arguments.js +39 -0
  9. package/dist/cli-arguments.js.map +1 -0
  10. package/dist/cli-auth-command.d.ts +3 -0
  11. package/dist/cli-auth-command.d.ts.map +1 -0
  12. package/dist/cli-auth-command.js +100 -0
  13. package/dist/cli-auth-command.js.map +1 -0
  14. package/dist/cli-corpus-command.d.ts +12 -0
  15. package/dist/cli-corpus-command.d.ts.map +1 -0
  16. package/dist/cli-corpus-command.js +120 -0
  17. package/dist/cli-corpus-command.js.map +1 -0
  18. package/dist/cli-corpus-evidence.d.ts +17 -0
  19. package/dist/cli-corpus-evidence.d.ts.map +1 -0
  20. package/dist/cli-corpus-evidence.js +150 -0
  21. package/dist/cli-corpus-evidence.js.map +1 -0
  22. package/dist/cli-corpus-reference-downloads.d.ts +8 -0
  23. package/dist/cli-corpus-reference-downloads.d.ts.map +1 -0
  24. package/dist/cli-corpus-reference-downloads.js +111 -0
  25. package/dist/cli-corpus-reference-downloads.js.map +1 -0
  26. package/dist/cli-corpus-reference-receipts.d.ts +36 -0
  27. package/dist/cli-corpus-reference-receipts.d.ts.map +1 -0
  28. package/dist/cli-corpus-reference-receipts.js +137 -0
  29. package/dist/cli-corpus-reference-receipts.js.map +1 -0
  30. package/dist/cli-corpus-run.d.ts +17 -0
  31. package/dist/cli-corpus-run.d.ts.map +1 -0
  32. package/dist/cli-corpus-run.js +94 -0
  33. package/dist/cli-corpus-run.js.map +1 -0
  34. package/dist/cli-corpus-types.d.ts +52 -0
  35. package/dist/cli-corpus-types.d.ts.map +1 -0
  36. package/dist/cli-corpus-types.js +6 -0
  37. package/dist/cli-corpus-types.js.map +1 -0
  38. package/dist/cli-export-command.d.ts +3 -0
  39. package/dist/cli-export-command.d.ts.map +1 -0
  40. package/dist/cli-export-command.js +234 -0
  41. package/dist/cli-export-command.js.map +1 -0
  42. package/dist/cli-image-command.d.ts +8 -0
  43. package/dist/cli-image-command.d.ts.map +1 -0
  44. package/dist/cli-image-command.js +193 -0
  45. package/dist/cli-image-command.js.map +1 -0
  46. package/dist/cli-persistence.d.ts +25 -0
  47. package/dist/cli-persistence.d.ts.map +1 -0
  48. package/dist/cli-persistence.js +253 -0
  49. package/dist/cli-persistence.js.map +1 -0
  50. package/dist/cli-skill-command.d.ts +9 -0
  51. package/dist/cli-skill-command.d.ts.map +1 -0
  52. package/dist/cli-skill-command.js +215 -0
  53. package/dist/cli-skill-command.js.map +1 -0
  54. package/dist/cli.d.ts +3 -0
  55. package/dist/cli.d.ts.map +1 -0
  56. package/dist/cli.js +272 -0
  57. package/dist/cli.js.map +1 -0
  58. package/dist/codex-skill-config.d.ts +3 -0
  59. package/dist/codex-skill-config.d.ts.map +1 -0
  60. package/dist/codex-skill-config.js +83 -0
  61. package/dist/codex-skill-config.js.map +1 -0
  62. package/dist/config.d.ts +7 -0
  63. package/dist/config.d.ts.map +1 -0
  64. package/dist/config.js +34 -0
  65. package/dist/config.js.map +1 -0
  66. package/dist/conversion-client.d.ts +264 -0
  67. package/dist/conversion-client.d.ts.map +1 -0
  68. package/dist/conversion-client.js +445 -0
  69. package/dist/conversion-client.js.map +1 -0
  70. package/dist/conversion-models.d.ts +4 -0
  71. package/dist/conversion-models.d.ts.map +1 -0
  72. package/dist/conversion-models.js +3 -0
  73. package/dist/conversion-models.js.map +1 -0
  74. package/dist/conversion-outputs.d.ts +118 -0
  75. package/dist/conversion-outputs.d.ts.map +1 -0
  76. package/dist/conversion-outputs.js +84 -0
  77. package/dist/conversion-outputs.js.map +1 -0
  78. package/dist/conversion-problems.d.ts +3 -0
  79. package/dist/conversion-problems.d.ts.map +1 -0
  80. package/dist/conversion-problems.js +21 -0
  81. package/dist/conversion-problems.js.map +1 -0
  82. package/dist/corpus-client.d.ts +171 -0
  83. package/dist/corpus-client.d.ts.map +1 -0
  84. package/dist/corpus-client.js +85 -0
  85. package/dist/corpus-client.js.map +1 -0
  86. package/dist/credential-setup.d.ts +27 -0
  87. package/dist/credential-setup.d.ts.map +1 -0
  88. package/dist/credential-setup.js +242 -0
  89. package/dist/credential-setup.js.map +1 -0
  90. package/dist/credential-store.d.ts +12 -0
  91. package/dist/credential-store.d.ts.map +1 -0
  92. package/dist/credential-store.js +103 -0
  93. package/dist/credential-store.js.map +1 -0
  94. package/dist/idempotency-key.d.ts +2 -0
  95. package/dist/idempotency-key.d.ts.map +1 -0
  96. package/dist/idempotency-key.js +19 -0
  97. package/dist/idempotency-key.js.map +1 -0
  98. package/dist/image-generation-evidence.d.ts +26 -0
  99. package/dist/image-generation-evidence.d.ts.map +1 -0
  100. package/dist/image-generation-evidence.js +28 -0
  101. package/dist/image-generation-evidence.js.map +1 -0
  102. package/dist/image-output-width.d.ts +11 -0
  103. package/dist/image-output-width.d.ts.map +1 -0
  104. package/dist/image-output-width.js +55 -0
  105. package/dist/image-output-width.js.map +1 -0
  106. package/dist/image-provider-preflight.d.ts +21 -0
  107. package/dist/image-provider-preflight.d.ts.map +1 -0
  108. package/dist/image-provider-preflight.js +184 -0
  109. package/dist/image-provider-preflight.js.map +1 -0
  110. package/dist/index.d.ts +13 -0
  111. package/dist/index.d.ts.map +1 -0
  112. package/dist/index.js +13 -0
  113. package/dist/index.js.map +1 -0
  114. package/dist/legacy-codex-cleanup.d.ts +11 -0
  115. package/dist/legacy-codex-cleanup.d.ts.map +1 -0
  116. package/dist/legacy-codex-cleanup.js +147 -0
  117. package/dist/legacy-codex-cleanup.js.map +1 -0
  118. package/dist/legacy-skill-catalog.d.ts +5 -0
  119. package/dist/legacy-skill-catalog.d.ts.map +1 -0
  120. package/dist/legacy-skill-catalog.js +123 -0
  121. package/dist/legacy-skill-catalog.js.map +1 -0
  122. package/dist/local-conversion-input.d.ts +21 -0
  123. package/dist/local-conversion-input.d.ts.map +1 -0
  124. package/dist/local-conversion-input.js +54 -0
  125. package/dist/local-conversion-input.js.map +1 -0
  126. package/dist/login-auth.d.ts +63 -0
  127. package/dist/login-auth.d.ts.map +1 -0
  128. package/dist/login-auth.js +282 -0
  129. package/dist/login-auth.js.map +1 -0
  130. package/dist/package-client.d.ts +147 -0
  131. package/dist/package-client.d.ts.map +1 -0
  132. package/dist/package-client.js +119 -0
  133. package/dist/package-client.js.map +1 -0
  134. package/dist/project-profiles.d.ts +45 -0
  135. package/dist/project-profiles.d.ts.map +1 -0
  136. package/dist/project-profiles.js +162 -0
  137. package/dist/project-profiles.js.map +1 -0
  138. package/dist/responsive-quality.d.ts +26 -0
  139. package/dist/responsive-quality.d.ts.map +1 -0
  140. package/dist/responsive-quality.js +68 -0
  141. package/dist/responsive-quality.js.map +1 -0
  142. package/dist/server.d.ts +6 -0
  143. package/dist/server.d.ts.map +1 -0
  144. package/dist/server.js +173 -0
  145. package/dist/server.js.map +1 -0
  146. package/dist/skill-installer.d.ts +51 -0
  147. package/dist/skill-installer.d.ts.map +1 -0
  148. package/dist/skill-installer.js +328 -0
  149. package/dist/skill-installer.js.map +1 -0
  150. package/package.json +53 -0
  151. package/skills/design/SKILL.md +156 -0
  152. package/skills/design/agents/openai.yaml +6 -0
  153. package/skills/design/references/selection-contract.md +44 -0
  154. package/skills/design-convert/SKILL.md +118 -0
  155. package/skills/design-convert/agents/openai.yaml +6 -0
  156. package/skills/design-search/SKILL.md +86 -0
  157. package/skills/design-search/agents/openai.yaml +6 -0
@@ -0,0 +1,137 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { link, readFile, unlink, writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { REFERENCE_RECEIPT_DIRECTORY, } from './cli-corpus-types.js';
5
+ const isErrno = (error, code) => (error instanceof Error && 'code' in error && error.code === code);
6
+ const readOptional = async (file) => {
7
+ try {
8
+ return await readFile(file);
9
+ }
10
+ catch (error) {
11
+ if (isErrno(error, 'ENOENT'))
12
+ return null;
13
+ throw error;
14
+ }
15
+ };
16
+ const parseJson = (bytes, file) => {
17
+ let value;
18
+ try {
19
+ value = JSON.parse(new TextDecoder().decode(bytes));
20
+ }
21
+ catch (error) {
22
+ throw new Error(`Corpus reference provenance is invalid: ${file}`, { cause: error });
23
+ }
24
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
25
+ throw new Error(`Corpus reference provenance is invalid: ${file}`);
26
+ }
27
+ return value;
28
+ };
29
+ // Write to a unique inode first, then hard-link it into the final name. The
30
+ // final path therefore appears fully formed or not at all, and link() refuses
31
+ // to replace evidence that another process or user already placed there.
32
+ const atomicExclusiveWrite = async (target, bytes) => {
33
+ const temporary = `${target}.pending-${randomUUID()}`;
34
+ await writeFile(temporary, bytes, { flag: 'wx' });
35
+ try {
36
+ await link(temporary, target);
37
+ }
38
+ finally {
39
+ await unlink(temporary).catch((error) => {
40
+ if (!isErrno(error, 'ENOENT'))
41
+ throw error;
42
+ });
43
+ }
44
+ };
45
+ export const referenceReceiptPaths = (outDir, item, index) => {
46
+ const stem = `${String(index + 1).padStart(2, '0')}-${item.id}`;
47
+ return {
48
+ image: path.join(outDir, `${stem}.webp`),
49
+ intent: path.join(outDir, REFERENCE_RECEIPT_DIRECTORY, `${stem}.intent.json`),
50
+ receipt: path.join(outDir, REFERENCE_RECEIPT_DIRECTORY, `${stem}.json`),
51
+ };
52
+ };
53
+ const expectedIntent = (paths, item, index) => ({
54
+ ordinal: index + 1,
55
+ id: item.id,
56
+ file: path.basename(paths.image),
57
+ });
58
+ const parseIntent = (bytes, file, expected) => {
59
+ const value = parseJson(bytes, file);
60
+ if (value.version !== 1
61
+ || value.ordinal !== expected.ordinal
62
+ || value.id !== expected.id
63
+ || value.file !== expected.file
64
+ || typeof value.nonce !== 'string'
65
+ || !/^[0-9a-f-]{36}$/u.test(value.nonce)) {
66
+ throw new Error(`Corpus reference download intent is invalid: ${file}`);
67
+ }
68
+ return value;
69
+ };
70
+ const parseReceipt = (bytes, file, intent) => {
71
+ const value = parseJson(bytes, file);
72
+ if (value.version !== 1
73
+ || value.ordinal !== intent.ordinal
74
+ || value.id !== intent.id
75
+ || value.file !== intent.file
76
+ || value.intentNonce !== intent.nonce
77
+ || typeof value.sha256 !== 'string'
78
+ || !/^[a-f0-9]{64}$/u.test(value.sha256)
79
+ || !Number.isSafeInteger(value.bytes)
80
+ || !Number.isSafeInteger(value.width)
81
+ || !Number.isSafeInteger(value.height)) {
82
+ throw new Error(`Corpus reference receipt is invalid: ${file}`);
83
+ }
84
+ return value;
85
+ };
86
+ export const loadReferenceProvenance = async (paths, item, index) => {
87
+ const [intentBytes, receiptBytes] = await Promise.all([
88
+ readOptional(paths.intent),
89
+ readOptional(paths.receipt),
90
+ ]);
91
+ if (!intentBytes && receiptBytes) {
92
+ throw new Error(`Corpus reference ${item.id} has a digest receipt without its download intent;`
93
+ + ' refusing ambiguous evidence');
94
+ }
95
+ const intent = intentBytes
96
+ ? parseIntent(intentBytes, paths.intent, expectedIntent(paths, item, index))
97
+ : null;
98
+ const receipt = receiptBytes && intent
99
+ ? parseReceipt(receiptBytes, paths.receipt, intent)
100
+ : null;
101
+ return { intent, receipt };
102
+ };
103
+ export const ensureReferenceDownloadIntent = async (paths, item, index, existing) => {
104
+ if (existing)
105
+ return existing;
106
+ const intent = {
107
+ version: 1,
108
+ ...expectedIntent(paths, item, index),
109
+ nonce: randomUUID(),
110
+ };
111
+ await atomicExclusiveWrite(paths.intent, `${JSON.stringify(intent, null, 2)}\n`);
112
+ return intent;
113
+ };
114
+ export const writeReferenceReceipt = async (paths, intent, reference) => {
115
+ const receipt = {
116
+ version: 1,
117
+ ordinal: reference.ordinal,
118
+ id: reference.id,
119
+ file: path.basename(reference.file),
120
+ intentNonce: intent.nonce,
121
+ sha256: reference.sha256,
122
+ bytes: reference.bytes,
123
+ width: reference.width,
124
+ height: reference.height,
125
+ };
126
+ await atomicExclusiveWrite(paths.receipt, `${JSON.stringify(receipt, null, 2)}\n`);
127
+ return receipt;
128
+ };
129
+ export const publishReferenceImage = async (paths, bytes) => await atomicExclusiveWrite(paths.image, bytes);
130
+ export const receiptMatchesReference = (receipt, reference) => (receipt.ordinal === reference.ordinal
131
+ && receipt.id === reference.id
132
+ && receipt.file === path.basename(reference.file)
133
+ && receipt.sha256 === reference.sha256
134
+ && receipt.bytes === reference.bytes
135
+ && receipt.width === reference.width
136
+ && receipt.height === reference.height);
137
+ //# sourceMappingURL=cli-corpus-reference-receipts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-corpus-reference-receipts.js","sourceRoot":"","sources":["../src/cli-corpus-reference-receipts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { CorpusInspirationRequest } from './corpus-client.js';
2
+ import type { CorpusInspirationManifest, InspirationClient } from './cli-corpus-types.js';
3
+ export declare const downloadCorpusInspiration: (args: {
4
+ client: InspirationClient;
5
+ request: CorpusInspirationRequest;
6
+ outDir: string;
7
+ origin: string;
8
+ idempotencyKey?: string;
9
+ now?: () => Date;
10
+ }) => Promise<CorpusInspirationManifest>;
11
+ export declare const resumeCorpusInspiration: (args: {
12
+ client: InspirationClient;
13
+ outDir: string;
14
+ origin: string;
15
+ now?: () => Date;
16
+ }) => Promise<CorpusInspirationManifest>;
17
+ //# sourceMappingURL=cli-corpus-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-corpus-run.d.ts","sourceRoot":"","sources":["../src/cli-corpus-run.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,wBAAwB,EAEzB,MAAM,oBAAoB,CAAC;AAa5B,OAAO,KAAK,EAEV,yBAAyB,EAEzB,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAG/B,eAAO,MAAM,yBAAyB,GAAU,MAAM;IACpD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,OAAO,EAAE,wBAAwB,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB,KAAG,OAAO,CAAC,yBAAyB,CAmDpC,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAU,MAAM;IAClD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB,KAAG,OAAO,CAAC,yBAAyB,CA+CpC,CAAC"}
@@ -0,0 +1,94 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { mkdir } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { CORPUS_QUERY_IDEMPOTENCY_REVISION } from './corpus-client.js';
5
+ import { assertAttemptMatchesEvidence, assertInspirationRunIncomplete, readInspirationAttempt, readOptionalInspirationEvidence, validateInspirationSet, writeInspirationAttempt, writeInspirationEvidence, writeInspirationManifest, } from './cli-corpus-evidence.js';
6
+ import { completeReferenceDownloads } from './cli-corpus-reference-downloads.js';
7
+ import { normalizeOptionalIdempotencyKey } from './idempotency-key.js';
8
+ export const downloadCorpusInspiration = async (args) => {
9
+ const outDir = path.resolve(args.outDir);
10
+ const origin = new URL(args.origin).origin;
11
+ const status = await args.client.status();
12
+ if (status.queryIdempotencyRevision !== CORPUS_QUERY_IDEMPOTENCY_REVISION) {
13
+ throw new Error(`12UI Worker at ${origin} does not support ${CORPUS_QUERY_IDEMPOTENCY_REVISION};`
14
+ + ' refusing a paid corpus request');
15
+ }
16
+ await mkdir(path.dirname(outDir), { recursive: true });
17
+ await mkdir(outDir);
18
+ const idempotencyKey = normalizeOptionalIdempotencyKey(args.idempotencyKey ?? `corpus-inspire:${randomUUID()}`, 'idempotencyKey');
19
+ if (!idempotencyKey)
20
+ throw new TypeError('idempotencyKey is required');
21
+ const attempt = {
22
+ version: 1,
23
+ createdAt: (args.now ?? (() => new Date()))().toISOString(),
24
+ origin,
25
+ idempotencyKey,
26
+ request: args.request,
27
+ };
28
+ await writeInspirationAttempt(outDir, attempt);
29
+ let response;
30
+ try {
31
+ response = await args.client.inspire(args.request, { idempotencyKey });
32
+ }
33
+ catch (error) {
34
+ throw new Error(`Corpus inspiration response is ambiguous; the stable attempt is in ${outDir}.`
35
+ + ` Resume with "12ui corpus resume --out-dir ${outDir} --origin ${origin}".`, { cause: error });
36
+ }
37
+ const evidence = {
38
+ version: 1,
39
+ request: args.request,
40
+ response,
41
+ };
42
+ await writeInspirationEvidence(outDir, evidence);
43
+ validateInspirationSet(evidence, outDir);
44
+ const references = await completeReferenceDownloads({
45
+ client: args.client,
46
+ evidence,
47
+ outDir,
48
+ origin,
49
+ });
50
+ return await writeInspirationManifest({ attempt, evidence, references, outDir, now: args.now });
51
+ };
52
+ export const resumeCorpusInspiration = async (args) => {
53
+ const outDir = path.resolve(args.outDir);
54
+ const origin = new URL(args.origin).origin;
55
+ const status = await args.client.status();
56
+ if (status.queryIdempotencyRevision !== CORPUS_QUERY_IDEMPOTENCY_REVISION) {
57
+ throw new Error(`12UI Worker at ${origin} does not support ${CORPUS_QUERY_IDEMPOTENCY_REVISION};`
58
+ + ' refusing corpus resume');
59
+ }
60
+ await assertInspirationRunIncomplete(outDir);
61
+ const attempt = await readInspirationAttempt(outDir);
62
+ if (attempt.origin !== origin) {
63
+ throw new Error(`Corpus inspiration attempt belongs to ${attempt.origin}; refusing resume against ${origin}`);
64
+ }
65
+ let evidence = await readOptionalInspirationEvidence(outDir);
66
+ if (!evidence) {
67
+ let response;
68
+ try {
69
+ response = await args.client.inspire(attempt.request, {
70
+ idempotencyKey: attempt.idempotencyKey,
71
+ });
72
+ }
73
+ catch (error) {
74
+ throw new Error(`Corpus inspiration response remains ambiguous; retry`
75
+ + ` "12ui corpus resume --out-dir ${outDir} --origin ${origin}".`, { cause: error });
76
+ }
77
+ evidence = {
78
+ version: 1,
79
+ request: attempt.request,
80
+ response,
81
+ };
82
+ await writeInspirationEvidence(outDir, evidence);
83
+ }
84
+ assertAttemptMatchesEvidence(attempt, evidence);
85
+ validateInspirationSet(evidence, outDir);
86
+ const references = await completeReferenceDownloads({
87
+ client: args.client,
88
+ evidence,
89
+ outDir,
90
+ origin,
91
+ });
92
+ return await writeInspirationManifest({ attempt, evidence, references, outDir, now: args.now });
93
+ };
94
+ //# sourceMappingURL=cli-corpus-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-corpus-run.js","sourceRoot":"","sources":["../src/cli-corpus-run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { CorpusAspect, CorpusInspirationRequest, CorpusInspirationResponse, TwelveUiCorpusClient } from './corpus-client.js';
2
+ export declare const CORPUS_USAGE_NOTICE = "These are AI generated screens for reference only. Free to use, no warranty.";
3
+ export declare const INSPIRATION_EVIDENCE_FILE = "inspire-evidence.json";
4
+ export declare const INSPIRATION_ATTEMPT_FILE = "inspire-attempt.json";
5
+ export declare const INSPIRATION_MANIFEST_FILE = "manifest.json";
6
+ export declare const REFERENCE_RECEIPT_DIRECTORY = ".reference-receipts";
7
+ export type InspirationClient = Pick<TwelveUiCorpusClient, 'status' | 'inspire' | 'download'>;
8
+ export type ReferenceClient = Pick<TwelveUiCorpusClient, 'download'>;
9
+ export type CorpusInspirationAttempt = {
10
+ version: 1;
11
+ createdAt: string;
12
+ origin: string;
13
+ idempotencyKey: string;
14
+ request: CorpusInspirationRequest;
15
+ };
16
+ export type CorpusInspirationEvidence = {
17
+ version: 1;
18
+ request: CorpusInspirationRequest;
19
+ response: CorpusInspirationResponse;
20
+ };
21
+ export type DownloadedCorpusReference = {
22
+ ordinal: number;
23
+ id: string;
24
+ role: 'core' | 'stretch';
25
+ arm: string;
26
+ aspect: CorpusAspect;
27
+ file: string;
28
+ sha256: string;
29
+ bytes: number;
30
+ width: number;
31
+ height: number;
32
+ };
33
+ export type CorpusInspirationManifest = {
34
+ version: 1;
35
+ createdAt: string;
36
+ origin: string;
37
+ idempotencyKey: string;
38
+ notice: typeof CORPUS_USAGE_NOTICE;
39
+ request: CorpusInspirationRequest;
40
+ response: {
41
+ setId: string;
42
+ query: string;
43
+ seed: number;
44
+ k: number;
45
+ poolSize: number;
46
+ coverage: number;
47
+ truncated: boolean;
48
+ weightsSource: CorpusInspirationResponse['weightsSource'];
49
+ };
50
+ references: DownloadedCorpusReference[];
51
+ };
52
+ //# sourceMappingURL=cli-corpus-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-corpus-types.d.ts","sourceRoot":"","sources":["../src/cli-corpus-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,mBAAmB,iFACgD,CAAC;AAEjF,eAAO,MAAM,yBAAyB,0BAA0B,CAAC;AACjE,eAAO,MAAM,wBAAwB,yBAAyB,CAAC;AAC/D,eAAO,MAAM,yBAAyB,kBAAkB,CAAC;AACzD,eAAO,MAAM,2BAA2B,wBAAwB,CAAC;AAEjE,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC,CAAC;AAC9F,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;AAErE,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,wBAAwB,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,wBAAwB,CAAC;IAClC,QAAQ,EAAE,yBAAyB,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,OAAO,mBAAmB,CAAC;IACnC,OAAO,EAAE,wBAAwB,CAAC;IAClC,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,CAAC,EAAE,MAAM,CAAC;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,OAAO,CAAC;QACnB,aAAa,EAAE,yBAAyB,CAAC,eAAe,CAAC,CAAC;KAC3D,CAAC;IACF,UAAU,EAAE,yBAAyB,EAAE,CAAC;CACzC,CAAC"}
@@ -0,0 +1,6 @@
1
+ export const CORPUS_USAGE_NOTICE = 'These are AI generated screens for reference only. Free to use, no warranty.';
2
+ export const INSPIRATION_EVIDENCE_FILE = 'inspire-evidence.json';
3
+ export const INSPIRATION_ATTEMPT_FILE = 'inspire-attempt.json';
4
+ export const INSPIRATION_MANIFEST_FILE = 'manifest.json';
5
+ export const REFERENCE_RECEIPT_DIRECTORY = '.reference-receipts';
6
+ //# sourceMappingURL=cli-corpus-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-corpus-types.js","sourceRoot":"","sources":["../src/cli-corpus-types.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,mBAAmB,GAC9B,8EAA8E,CAAC;AAEjF,MAAM,CAAC,MAAM,yBAAyB,GAAG,uBAAuB,CAAC;AACjE,MAAM,CAAC,MAAM,wBAAwB,GAAG,sBAAsB,CAAC;AAC/D,MAAM,CAAC,MAAM,yBAAyB,GAAG,eAAe,CAAC;AACzD,MAAM,CAAC,MAAM,2BAA2B,GAAG,qBAAqB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type CliFlags } from './cli-arguments.js';
2
+ export declare const runExportCommand: (sourceConversionId: string | undefined, flags: CliFlags) => Promise<void>;
3
+ //# sourceMappingURL=cli-export-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-export-command.d.ts","sourceRoot":"","sources":["../src/cli-export-command.ts"],"names":[],"mappings":"AAQA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AA4N/D,eAAO,MAAM,gBAAgB,GAC3B,oBAAoB,MAAM,GAAG,SAAS,EACtC,OAAO,QAAQ,KACd,OAAO,CAAC,IAAI,CAyFd,CAAC"}
@@ -0,0 +1,234 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { materializeConversionArtifacts, } from './artifact-materializer.js';
5
+ import { stringFlag } from './cli-arguments.js';
6
+ import { TwelveUiConversionClient, } from './conversion-client.js';
7
+ import { CONVERSION_OUTPUT_FILENAME_SUFFIXES, isConversionOutput, } from './conversion-outputs.js';
8
+ import { readConversionConfig } from './config.js';
9
+ import { normalizeOptionalIdempotencyKey } from './idempotency-key.js';
10
+ import { parseConversionOutputProfile, } from './project-profiles.js';
11
+ import { isResponsiveConversionQuality, } from './responsive-quality.js';
12
+ const sha256 = (bytes) => (createHash('sha256').update(bytes).digest('hex'));
13
+ const parseOutputs = (value) => {
14
+ if (!value?.trim())
15
+ throw new Error('--output is required');
16
+ const outputs = value.split(',').map((entry) => entry.trim()).filter(Boolean);
17
+ if (outputs.length === 0)
18
+ throw new Error('--output is required');
19
+ const invalid = outputs.filter((output) => !isConversionOutput(output));
20
+ if (invalid.length > 0)
21
+ throw new Error(`Unsupported export output: ${invalid.join(', ')}`);
22
+ return [...new Set(outputs)];
23
+ };
24
+ const readProfile = async (output, value) => {
25
+ if (!value?.trim()) {
26
+ throw new Error(`${output === 'web_project' ? '--web-profile' : '--app-profile'} is required`
27
+ + ` when exporting ${output}`);
28
+ }
29
+ const trimmed = value.trim();
30
+ const source = trimmed.startsWith('{')
31
+ ? trimmed
32
+ : await readFile(path.resolve(trimmed.startsWith('@') ? trimmed.slice(1) : trimmed), 'utf8');
33
+ let parsed;
34
+ try {
35
+ parsed = JSON.parse(source);
36
+ }
37
+ catch (error) {
38
+ throw new Error(`Invalid ${output} profile JSON: ${error instanceof Error ? error.message : String(error)}`);
39
+ }
40
+ return parseConversionOutputProfile(output, parsed);
41
+ };
42
+ const outputIdempotencyKey = (base, output, requestShapeSha256) => {
43
+ const suffix = `${output}:${requestShapeSha256.slice(0, 32)}`;
44
+ return `${base.slice(0, 128 - suffix.length - 1)}:${suffix}`;
45
+ };
46
+ const prepareExportPlan = (args) => {
47
+ const requestShape = args.output === 'html'
48
+ ? {
49
+ output: args.output,
50
+ responsiveQuality: args.responsiveQuality,
51
+ }
52
+ : args.output === 'web_project' || args.output === 'app_project'
53
+ ? {
54
+ output: args.output,
55
+ profile: args.profile,
56
+ }
57
+ : {
58
+ output: args.output,
59
+ };
60
+ const requestShapeSha256 = sha256(Buffer.from(JSON.stringify(requestShape)));
61
+ return {
62
+ output: args.output,
63
+ request: {
64
+ idempotencyKey: args.output === 'layerdoc'
65
+ ? null
66
+ : outputIdempotencyKey(args.idempotencyKey, args.output, requestShapeSha256),
67
+ requestShapeSha256,
68
+ ...(args.output === 'html'
69
+ ? { responsiveQuality: args.responsiveQuality }
70
+ : {}),
71
+ ...(args.output === 'web_project' || args.output === 'app_project'
72
+ ? { profile: args.profile }
73
+ : {}),
74
+ },
75
+ };
76
+ };
77
+ const waitForSuccess = async (client, operation, timeoutMs) => {
78
+ if (operation.status === 'succeeded')
79
+ return operation;
80
+ return client.waitForConversion(operation.id, {
81
+ expiresAt: operation.expires_at,
82
+ timeoutMs,
83
+ });
84
+ };
85
+ const exportOne = async (args) => {
86
+ const outFile = path.join(args.outDir, args.plan.output === 'html'
87
+ ? 'export.responsive.html'
88
+ : args.plan.output === 'html_fixed'
89
+ ? 'export.fixed.html'
90
+ : `export.${CONVERSION_OUTPUT_FILENAME_SUFFIXES[args.plan.output]}`);
91
+ if (args.plan.output === 'layerdoc') {
92
+ await writeFile(outFile, args.baseLayerDoc, { flag: 'wx' });
93
+ return {
94
+ output: args.plan.output,
95
+ conversionId: args.source.id,
96
+ outFile,
97
+ artifactManifest: null,
98
+ request: args.plan.request,
99
+ };
100
+ }
101
+ const shared = {
102
+ output: args.plan.output,
103
+ idempotencyKey: args.plan.request.idempotencyKey,
104
+ waitSeconds: 20,
105
+ };
106
+ const input = args.plan.output === 'html'
107
+ ? {
108
+ sourceConversionId: args.source.id,
109
+ output: 'html',
110
+ responsiveQuality: args.plan.request.responsiveQuality,
111
+ idempotencyKey: shared.idempotencyKey,
112
+ waitSeconds: shared.waitSeconds,
113
+ }
114
+ : args.plan.output === 'web_project'
115
+ ? {
116
+ layerdoc: args.baseLayerDoc,
117
+ filename: `${args.source.id}.layerdoc.json`,
118
+ output: 'web_project',
119
+ profile: args.plan.request.profile,
120
+ idempotencyKey: shared.idempotencyKey,
121
+ waitSeconds: shared.waitSeconds,
122
+ }
123
+ : args.plan.output === 'app_project'
124
+ ? {
125
+ layerdoc: args.baseLayerDoc,
126
+ filename: `${args.source.id}.layerdoc.json`,
127
+ output: 'app_project',
128
+ profile: args.plan.request.profile,
129
+ idempotencyKey: shared.idempotencyKey,
130
+ waitSeconds: shared.waitSeconds,
131
+ }
132
+ : {
133
+ layerdoc: args.baseLayerDoc,
134
+ filename: `${args.source.id}.layerdoc.json`,
135
+ output: args.plan.output,
136
+ idempotencyKey: shared.idempotencyKey,
137
+ waitSeconds: shared.waitSeconds,
138
+ };
139
+ const completed = await waitForSuccess(args.client, await args.client.createConversion(input), args.timeoutMs);
140
+ const downloaded = await args.client.downloadResult(completed.id, args.plan.output);
141
+ await writeFile(outFile, downloaded.bytes, { flag: 'wx' });
142
+ return {
143
+ output: args.plan.output,
144
+ conversionId: completed.id,
145
+ outFile,
146
+ artifactManifest: await materializeConversionArtifacts(args.client, completed, outFile),
147
+ request: args.plan.request,
148
+ };
149
+ };
150
+ export const runExportCommand = async (sourceConversionId, flags) => {
151
+ const sourceId = sourceConversionId?.trim();
152
+ if (!sourceId)
153
+ throw new Error('Usage: 12ui export <source-conversion-id> --output <formats>');
154
+ const outputs = parseOutputs(stringFlag(flags, 'output'));
155
+ const outDirValue = stringFlag(flags, 'out-dir');
156
+ if (!outDirValue)
157
+ throw new Error('--out-dir is required');
158
+ const outDir = path.resolve(outDirValue);
159
+ const idempotencyKey = normalizeOptionalIdempotencyKey(stringFlag(flags, 'idempotency-key'), '--idempotency-key');
160
+ if (!idempotencyKey)
161
+ throw new Error('--idempotency-key is required');
162
+ const responsiveValue = stringFlag(flags, 'responsive-quality') ?? 'standard';
163
+ if (!isResponsiveConversionQuality(responsiveValue)) {
164
+ throw new Error('--responsive-quality must be standard or pro');
165
+ }
166
+ const [webProfile, appProfile] = await Promise.all([
167
+ outputs.includes('web_project')
168
+ ? readProfile('web_project', stringFlag(flags, 'web-profile'))
169
+ : undefined,
170
+ outputs.includes('app_project')
171
+ ? readProfile('app_project', stringFlag(flags, 'app-profile'))
172
+ : undefined,
173
+ ]);
174
+ const client = new TwelveUiConversionClient(readConversionConfig({
175
+ origin: stringFlag(flags, 'origin'),
176
+ apiKey: stringFlag(flags, 'api-key'),
177
+ }));
178
+ const source = await client.getConversion(sourceId);
179
+ if (source.status !== 'succeeded' || source.output !== 'layerdoc') {
180
+ throw new Error(`Source conversion ${sourceId} must be a successful layerdoc conversion;`
181
+ + ` found ${source.status} ${source.output}`);
182
+ }
183
+ const baseLayerDoc = (await client.downloadResult(source.id, 'layerdoc')).bytes;
184
+ await mkdir(outDir, { recursive: false });
185
+ const timeoutValue = stringFlag(flags, 'timeout-ms');
186
+ const timeoutMs = timeoutValue === undefined ? undefined : Number(timeoutValue);
187
+ if (timeoutMs !== undefined && (!Number.isFinite(timeoutMs) || timeoutMs < 1_000)) {
188
+ throw new Error('--timeout-ms must be a number of at least 1000');
189
+ }
190
+ const plans = outputs.map((output) => prepareExportPlan({
191
+ idempotencyKey,
192
+ output,
193
+ profile: output === 'web_project' ? webProfile : output === 'app_project' ? appProfile : undefined,
194
+ responsiveQuality: responsiveValue,
195
+ }));
196
+ const preparedAt = new Date().toISOString();
197
+ const settled = await Promise.allSettled(plans.map((plan) => exportOne({
198
+ baseLayerDoc,
199
+ client,
200
+ outDir,
201
+ plan,
202
+ source,
203
+ timeoutMs,
204
+ })));
205
+ const results = settled.flatMap((result) => result.status === 'fulfilled' ? [result.value] : []);
206
+ const failures = settled.flatMap((result, index) => result.status === 'rejected'
207
+ ? [{
208
+ output: plans[index].output,
209
+ request: plans[index].request,
210
+ error: result.reason instanceof Error ? result.reason.message : String(result.reason),
211
+ }]
212
+ : []);
213
+ const manifestPath = path.join(outDir, 'export-manifest.json');
214
+ await writeFile(manifestPath, `${JSON.stringify({
215
+ schemaVersion: 2,
216
+ sourceConversionId: source.id,
217
+ sourceLayerDocSha256: sha256(baseLayerDoc),
218
+ idempotencyKey,
219
+ preparedAt,
220
+ completedAt: new Date().toISOString(),
221
+ results,
222
+ failures,
223
+ }, null, 2)}\n`, { flag: 'wx' });
224
+ if (failures.length > 0) {
225
+ throw new Error(`One or more exports failed without redispatch: ${failures.map((failure) => (`${failure.output}: ${failure.error}`)).join('; ')}. Evidence: ${manifestPath}`);
226
+ }
227
+ console.log(JSON.stringify({
228
+ sourceConversionId: source.id,
229
+ sourceLayerDocSha256: sha256(baseLayerDoc),
230
+ manifestPath,
231
+ results,
232
+ }, null, 2));
233
+ };
234
+ //# sourceMappingURL=cli-export-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-export-command.js","sourceRoot":"","sources":["../src/cli-export-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { ensembleImage } from '@just-every/ensemble';
2
+ import { type CliFlags } from './cli-arguments.js';
3
+ import { preflightImageProvider } from './image-provider-preflight.js';
4
+ export declare const runImageCommand: (action: string | undefined, flags: CliFlags, dependencies?: {
5
+ generate?: typeof ensembleImage;
6
+ preflight?: typeof preflightImageProvider;
7
+ }) => Promise<void>;
8
+ //# sourceMappingURL=cli-image-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-image-command.d.ts","sourceRoot":"","sources":["../src/cli-image-command.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAM/D,OAAO,EAGL,sBAAsB,EACvB,MAAM,+BAA+B,CAAC;AAgEvC,eAAO,MAAM,eAAe,GAC1B,QAAQ,MAAM,GAAG,SAAS,EAC1B,OAAO,QAAQ,EACf,eAAc;IACZ,QAAQ,CAAC,EAAE,OAAO,aAAa,CAAC;IAChC,SAAS,CAAC,EAAE,OAAO,sBAAsB,CAAC;CACtC,KACL,OAAO,CAAC,IAAI,CA8Id,CAAC"}