@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,319 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { booleanFlag, stringFlag } from './cli-arguments.js';
5
+ import { formatDuration, nextActionLine } from './cli-progress.js';
6
+ import { readConversionConfig } from './config.js';
7
+ import { TwelveUiBranchClient, } from './branch-client.js';
8
+ import { createRunKey } from './create-identity.js';
9
+ import { normalizeOptionalIdempotencyKey } from './idempotency-key.js';
10
+ /**
11
+ * `12ui create` — the hosted candidate API as commands instead of curl.
12
+ *
13
+ * `12ui draft` covers the ordinary explore step end to end. This family exists
14
+ * for the runs draft does not shape: more than four slots, a direction per
15
+ * slot, a corpus reference per slot. Every subcommand maps to one call the
16
+ * design-draft skill used to spell out as a `curl` invocation, and the claim
17
+ * derives its own `Idempotency-Key` so the caller never mints one.
18
+ */
19
+ export const CREATE_USAGE = 'Usage:\n'
20
+ + ' 12ui create claim --concept <text>|--concept-file <file> --candidates <json>|@<file>\n'
21
+ + ' [--aspect landscape|portrait|square] [--mode inspiration|preserve-structure]\n'
22
+ + ' [--reference-image <png|jpeg|webp>] [--idempotency-key <key>] [--json]\n'
23
+ + ' 12ui create dispatch <run-id> [--slot <a,b,...>] [--quiet]\n'
24
+ + ' 12ui create status <run-id> [--json]\n'
25
+ + ' 12ui create download <run-id> --out-dir <directory> [--slot <a,b,...>]';
26
+ /** One image, generated by the same provider path a draft candidate uses. */
27
+ export const CREATE_CANDIDATE_DURATION_SECONDS = 150;
28
+ const MEDIA_TYPES = {
29
+ '.png': 'image/png',
30
+ '.jpg': 'image/jpeg',
31
+ '.jpeg': 'image/jpeg',
32
+ '.webp': 'image/webp',
33
+ };
34
+ const parseAspect = (flags) => {
35
+ const aspect = stringFlag(flags, 'aspect')?.trim();
36
+ if (aspect === undefined)
37
+ return undefined;
38
+ if (aspect === 'landscape' || aspect === 'portrait' || aspect === 'square')
39
+ return aspect;
40
+ throw new Error('--aspect must be landscape, portrait, or square');
41
+ };
42
+ const parseMode = (flags) => {
43
+ const mode = stringFlag(flags, 'mode')?.trim();
44
+ if (mode === undefined)
45
+ return undefined;
46
+ if (mode === 'inspiration' || mode === 'preserve-structure')
47
+ return mode;
48
+ throw new Error('--mode must be inspiration or preserve-structure');
49
+ };
50
+ const readConcept = async (flags) => {
51
+ const inline = stringFlag(flags, 'concept')?.trim();
52
+ const file = stringFlag(flags, 'concept-file')?.trim();
53
+ if (inline && file)
54
+ throw new Error('Pass --concept or --concept-file, not both');
55
+ const concept = inline ?? (file ? (await readFile(path.resolve(file), 'utf8')).trim() : '');
56
+ if (!concept)
57
+ throw new Error('--concept or --concept-file is required');
58
+ return concept;
59
+ };
60
+ /**
61
+ * The spec is JSON because it is a list of records; accepting `@file` keeps a
62
+ * 96-slot run out of the shell's argument list.
63
+ */
64
+ export const parseCandidateSpec = (value) => {
65
+ let parsed;
66
+ try {
67
+ parsed = JSON.parse(value);
68
+ }
69
+ catch (error) {
70
+ throw new Error(`--candidates must be JSON: ${error instanceof Error ? error.message : String(error)}`);
71
+ }
72
+ if (!Array.isArray(parsed) || parsed.length === 0) {
73
+ throw new Error('--candidates must be a non-empty JSON array');
74
+ }
75
+ const slots = new Set();
76
+ return parsed.map((entry, index) => {
77
+ if (!entry || typeof entry !== 'object' || Array.isArray(entry)) {
78
+ throw new Error(`--candidates[${index}] must be a JSON object`);
79
+ }
80
+ const candidate = entry;
81
+ const slot = typeof candidate.slot === 'string' ? candidate.slot.trim() : '';
82
+ if (!slot)
83
+ throw new Error(`--candidates[${index}].slot is required`);
84
+ if (slots.has(slot))
85
+ throw new Error(`--candidates declares slot ${slot} twice`);
86
+ slots.add(slot);
87
+ if (candidate.referenceId !== undefined && candidate.useReferenceImage === true) {
88
+ throw new Error(`--candidates[${index}] uses either referenceId or useReferenceImage, not both`);
89
+ }
90
+ return {
91
+ slot,
92
+ ...(typeof candidate.direction === 'string' && candidate.direction.trim()
93
+ ? { direction: candidate.direction.trim() }
94
+ : {}),
95
+ ...(typeof candidate.referenceId === 'string' && candidate.referenceId.trim()
96
+ ? { referenceId: candidate.referenceId.trim() }
97
+ : {}),
98
+ ...(candidate.useReferenceImage === true ? { useReferenceImage: true } : {}),
99
+ };
100
+ });
101
+ };
102
+ const readCandidates = async (flags) => {
103
+ const value = stringFlag(flags, 'candidates')?.trim();
104
+ if (!value)
105
+ throw new Error('--candidates is required');
106
+ const source = value.startsWith('@')
107
+ ? await readFile(path.resolve(value.slice(1)), 'utf8')
108
+ : value;
109
+ return parseCandidateSpec(source);
110
+ };
111
+ const readReferenceImage = async (flags) => {
112
+ const value = stringFlag(flags, 'reference-image')?.trim();
113
+ if (!value)
114
+ return undefined;
115
+ const filePath = path.resolve(value);
116
+ const mediaType = MEDIA_TYPES[path.extname(filePath).toLowerCase()];
117
+ if (!mediaType)
118
+ throw new Error('--reference-image must be a PNG, JPEG, or WebP file');
119
+ const bytes = await readFile(filePath);
120
+ return {
121
+ data: bytes.toString('base64'),
122
+ mediaType,
123
+ sha256: createHash('sha256').update(bytes).digest('hex'),
124
+ };
125
+ };
126
+ const selectedSlots = (flags, run) => {
127
+ const value = stringFlag(flags, 'slot')?.trim();
128
+ if (!value)
129
+ return run.candidates.map((candidate) => candidate.slot);
130
+ const requested = value.split(',').map((slot) => slot.trim()).filter(Boolean);
131
+ const known = new Set(run.candidates.map((candidate) => candidate.slot));
132
+ const unknown = requested.filter((slot) => !known.has(slot));
133
+ if (unknown.length > 0) {
134
+ throw new Error(`Run ${run.id} has no slot ${unknown.join(', ')}`);
135
+ }
136
+ return requested;
137
+ };
138
+ const summarize = (run) => {
139
+ const counts = { pending: 0, dispatched: 0, succeeded: 0, failed: 0 };
140
+ for (const candidate of run.candidates)
141
+ counts[candidate.status] += 1;
142
+ return counts;
143
+ };
144
+ const client = (flags) => new TwelveUiBranchClient(readConversionConfig({
145
+ origin: stringFlag(flags, 'origin'),
146
+ apiKey: stringFlag(flags, 'api-key'),
147
+ }));
148
+ const runClaim = async (flags) => {
149
+ const concept = await readConcept(flags);
150
+ const candidates = await readCandidates(flags);
151
+ const aspect = parseAspect(flags);
152
+ const mode = parseMode(flags);
153
+ const referenceImage = await readReferenceImage(flags);
154
+ if (candidates.some((candidate) => candidate.useReferenceImage) && !referenceImage) {
155
+ throw new Error('useReferenceImage requires --reference-image');
156
+ }
157
+ const idempotencyKey = normalizeOptionalIdempotencyKey(stringFlag(flags, 'idempotency-key'), '--idempotency-key') ?? createRunKey({
158
+ concept,
159
+ aspect: aspect ?? 'landscape',
160
+ ...(mode ? { mode } : {}),
161
+ candidates,
162
+ ...(referenceImage ? { referenceImageSha256: referenceImage.sha256 } : {}),
163
+ });
164
+ const run = await client(flags).startCreateRun({
165
+ concept,
166
+ ...(aspect ? { aspect } : {}),
167
+ ...(mode ? { mode } : {}),
168
+ candidates,
169
+ ...(referenceImage ? { referenceImage } : {}),
170
+ }, idempotencyKey);
171
+ console.log(JSON.stringify({
172
+ id: run.id,
173
+ aspect: run.aspect,
174
+ idempotencyKey,
175
+ candidates: run.candidates.map((candidate) => ({
176
+ slot: candidate.slot,
177
+ status: candidate.status,
178
+ ...(candidate.direction ? { direction: candidate.direction } : {}),
179
+ })),
180
+ // Claiming buys nothing, so the reply has to say what does.
181
+ nextAction: `Nothing is generating yet. Run: 12ui create dispatch ${run.id}`,
182
+ }, null, 2));
183
+ };
184
+ const runDispatch = async (runId, flags) => {
185
+ const api = client(flags);
186
+ const quiet = booleanFlag(flags, 'quiet');
187
+ const claimed = await api.getRun(runId);
188
+ const slots = selectedSlots(flags, claimed).filter((slot) => {
189
+ const candidate = claimed.candidates.find((entry) => entry.slot === slot);
190
+ return candidate?.status !== 'succeeded';
191
+ });
192
+ if (slots.length === 0) {
193
+ console.log(JSON.stringify({
194
+ id: claimed.id,
195
+ dispatched: [],
196
+ counts: summarize(claimed),
197
+ nextAction: `Every requested slot has already settled. Read them with:`
198
+ + ` 12ui create download ${claimed.id} --out-dir <directory>`,
199
+ }, null, 2));
200
+ return;
201
+ }
202
+ const startedAt = Date.now();
203
+ if (!quiet) {
204
+ process.stderr.write(`12ui create dispatch — ${slots.length} slot(s) on run ${claimed.id};`
205
+ + ` expect about ${formatDuration(CREATE_CANDIDATE_DURATION_SECONDS)} each, all concurrent.\n`
206
+ // The dispatch blocks on the server, so a shell that cuts it looks like
207
+ // failure and is not one: generation continues and the slot is already
208
+ // paid for. Say so here rather than let the caller re-buy the run.
209
+ + `If this command is interrupted the images keep generating; `
210
+ + `\`12ui create status ${claimed.id}\` shows them and nothing is bought twice.\n`);
211
+ }
212
+ // Each dispatch blocks on its own image, so they go together; one settled
213
+ // failure must not cancel the siblings that are still generating.
214
+ const settled = await Promise.allSettled(slots.map((slot) => api.dispatchScreen(claimed.id, slot)));
215
+ const failures = settled.flatMap((result, index) => (result.status === 'rejected'
216
+ ? [{
217
+ slot: slots[index],
218
+ error: result.reason instanceof Error ? result.reason.message : String(result.reason),
219
+ }]
220
+ : []));
221
+ const finished = await api.getRun(claimed.id);
222
+ if (!quiet) {
223
+ process.stderr.write(`[${formatDuration((Date.now() - startedAt) / 1000)}] create: dispatch returned\n`);
224
+ }
225
+ console.log(JSON.stringify({
226
+ id: finished.id,
227
+ dispatched: slots,
228
+ counts: summarize(finished),
229
+ ...(failures.length > 0 ? { failures } : {}),
230
+ candidates: finished.candidates.map((candidate) => ({
231
+ slot: candidate.slot,
232
+ status: candidate.status,
233
+ ...(candidate.error ? { error: candidate.error } : {}),
234
+ })),
235
+ nextAction: `12ui create download ${finished.id} --out-dir <directory>`,
236
+ }, null, 2));
237
+ if (failures.length > 0) {
238
+ throw new Error(`Dispatch failed for ${failures.map((failure) => `${failure.slot}: ${failure.error}`).join('; ')}`);
239
+ }
240
+ };
241
+ const runStatus = async (runId, flags) => {
242
+ const run = await client(flags).getRun(runId);
243
+ const counts = summarize(run);
244
+ const settled = counts.succeeded + counts.failed;
245
+ console.log(JSON.stringify({
246
+ id: run.id,
247
+ aspect: run.aspect,
248
+ ...(run.expiresAt ? { expiresAt: run.expiresAt } : {}),
249
+ counts,
250
+ candidates: run.candidates.map((candidate) => ({
251
+ slot: candidate.slot,
252
+ status: candidate.status,
253
+ ...(candidate.error ? { error: candidate.error } : {}),
254
+ })),
255
+ // Progress every time, and a specific next move rather than "wait".
256
+ nextAction: settled === run.candidates.length
257
+ ? `All ${run.candidates.length} candidate(s) settled. 12ui create download ${run.id} --out-dir <directory>`
258
+ : nextActionLine({
259
+ what: `${settled} of ${run.candidates.length} candidate(s) settled; generation`,
260
+ typicalSeconds: CREATE_CANDIDATE_DURATION_SECONDS,
261
+ statusCommand: `12ui create status ${run.id}`,
262
+ waitHint: 'and download whatever has settled at any point',
263
+ }),
264
+ }, null, 2));
265
+ };
266
+ const runDownload = async (runId, flags) => {
267
+ const outDirValue = stringFlag(flags, 'out-dir')?.trim();
268
+ if (!outDirValue)
269
+ throw new Error('--out-dir is required');
270
+ const outDir = path.resolve(outDirValue);
271
+ const api = client(flags);
272
+ const run = await api.getRun(runId);
273
+ await mkdir(outDir, { recursive: true });
274
+ const wanted = new Set(selectedSlots(flags, run));
275
+ const downloadable = run.candidates.filter((candidate) => (wanted.has(candidate.slot) && candidate.status === 'succeeded'));
276
+ const files = await Promise.all(downloadable.map(async (candidate) => {
277
+ const image = await api.downloadScreen(run.id, candidate.slot);
278
+ const file = path.join(outDir, `${candidate.slot}.png`);
279
+ await writeFile(file, image.bytes);
280
+ return { slot: candidate.slot, file, sha256: image.sha256, bytes: image.bytes.byteLength };
281
+ }));
282
+ const unsettled = run.candidates.filter((candidate) => (wanted.has(candidate.slot) && candidate.status !== 'succeeded'));
283
+ console.log(JSON.stringify({
284
+ id: run.id,
285
+ outDir,
286
+ files,
287
+ ...(unsettled.length > 0
288
+ ? {
289
+ skipped: unsettled.map((candidate) => ({
290
+ slot: candidate.slot,
291
+ status: candidate.status,
292
+ ...(candidate.error ? { error: candidate.error } : {}),
293
+ })),
294
+ }
295
+ : {}),
296
+ // A winner does not need re-uploading; naming the run keeps the bytes.
297
+ nextAction: files.length > 0
298
+ ? `12ui branch execute <run-dir> --winner-run ${run.id} --winner-slot <slot>`
299
+ + ' --concept "<what the rest of the surface must cover>" --scope page|site'
300
+ : `No candidate has settled yet. 12ui create status ${run.id}`,
301
+ }, null, 2));
302
+ };
303
+ export const runCreateCommand = async (command, flags) => {
304
+ const subcommand = command[1];
305
+ const runId = command[2]?.trim();
306
+ if (subcommand === 'claim')
307
+ return runClaim(flags);
308
+ if (subcommand === 'dispatch' || subcommand === 'status' || subcommand === 'download') {
309
+ if (!runId)
310
+ throw new Error(CREATE_USAGE);
311
+ if (subcommand === 'dispatch')
312
+ return runDispatch(runId, flags);
313
+ if (subcommand === 'status')
314
+ return runStatus(runId, flags);
315
+ return runDownload(runId, flags);
316
+ }
317
+ throw new Error(CREATE_USAGE);
318
+ };
319
+ //# sourceMappingURL=cli-create-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-create-command.js","sourceRoot":"","sources":["../src/cli-create-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { spawn } from 'node:child_process';
2
+ /**
3
+ * Long commands start the work and return; they do not hold the shell.
4
+ *
5
+ * MEASURED in the 0.2.14 harness pass: the agent's shell cut every blocking
6
+ * `branch execute` (10-25 minutes) and most `generate-batch` dispatches (~90 s)
7
+ * before they finished, and each cut run was read as a failure and hand-authored
8
+ * around. A tool that cannot be waited on is a tool that does not work, so the
9
+ * dispatch now forks a detached worker, proves it started, and hands back the
10
+ * status command. `--wait` opts back into blocking for a human at a terminal.
11
+ *
12
+ * The worker is the same binary with `--wait` appended, in its own process
13
+ * group with its output on a log file, so nothing that kills the parent's group
14
+ * reaches paid work that is already in flight.
15
+ */
16
+ export type DetachedWork = {
17
+ /** Human name for the work, used in the narration. */
18
+ label: string;
19
+ /** Appearing on disk proves the worker got far enough to own the run. */
20
+ startedFile: string;
21
+ /** Preferred over `startedFile` when it carries the run identity. */
22
+ identityFile?: string;
23
+ logFile: string;
24
+ statusCommand: string;
25
+ typicalSeconds: number;
26
+ /** How long to wait for proof of start before reporting anyway. */
27
+ startTimeoutMs?: number;
28
+ };
29
+ export type DetachedRunReport = {
30
+ detached: true;
31
+ pid: number | null;
32
+ started: boolean;
33
+ runId?: string;
34
+ logFile: string;
35
+ statusCommand: string;
36
+ nextAction: string;
37
+ };
38
+ export declare const spawnDetachedRun: (args: {
39
+ cliPath: string;
40
+ argv: readonly string[];
41
+ work: DetachedWork;
42
+ spawnImpl?: typeof spawn;
43
+ pollIntervalMs?: number;
44
+ write?: (line: string) => void;
45
+ }) => Promise<DetachedRunReport>;
46
+ /** `12ui branch execute|resume` without `--wait`. */
47
+ export declare const detachBranchRun: (args: {
48
+ cliPath: string;
49
+ argv: readonly string[];
50
+ outDir: string;
51
+ typicalSeconds: number;
52
+ spawnImpl?: typeof spawn;
53
+ }) => Promise<DetachedRunReport>;
54
+ /** `12ui image generate-batch` without `--wait`. */
55
+ export declare const detachImageBatch: (args: {
56
+ cliPath: string;
57
+ argv: readonly string[];
58
+ manifestPath: string;
59
+ typicalSeconds: number;
60
+ spawnImpl?: typeof spawn;
61
+ }) => Promise<DetachedRunReport>;
62
+ //# sourceMappingURL=cli-detach.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-detach.d.ts","sourceRoot":"","sources":["../src/cli-detach.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAM9D;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,YAAY,GAAG;IACzB,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,IAAI,CAAC;IACf,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAuBF,eAAO,MAAM,gBAAgB,GAAU,MAAM;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC,KAAG,OAAO,CAAC,iBAAiB,CA4E5B,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,eAAe,GAAU,MAAM;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,KAAG,OAAO,CAAC,iBAAiB,CAe3B,CAAC;AAEH,oDAAoD;AACpD,eAAO,MAAM,gBAAgB,GAAU,MAAM;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,KAAG,OAAO,CAAC,iBAAiB,CAY3B,CAAC"}
@@ -0,0 +1,123 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { mkdir, open, readFile, stat } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { nextActionLine } from './cli-progress.js';
5
+ const readJson = async (file) => {
6
+ try {
7
+ return JSON.parse(await readFile(file, 'utf8'));
8
+ }
9
+ catch {
10
+ return null;
11
+ }
12
+ };
13
+ const exists = async (file) => {
14
+ try {
15
+ await stat(file);
16
+ return true;
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ };
22
+ const delay = async (milliseconds) => (new Promise((resolve) => { setTimeout(resolve, milliseconds); }));
23
+ export const spawnDetachedRun = async (args) => {
24
+ const write = args.write ?? ((line) => { process.stderr.write(`${line}\n`); });
25
+ const { work } = args;
26
+ // The run directory does not exist yet on a first run: the worker creates it.
27
+ await mkdir(path.dirname(work.logFile), { recursive: true });
28
+ const logHandle = await open(work.logFile, 'a');
29
+ const child = (args.spawnImpl ?? spawn)(process.execPath, [args.cliPath, ...args.argv, '--wait'], {
30
+ cwd: process.cwd(),
31
+ detached: true,
32
+ stdio: ['ignore', logHandle.fd, logHandle.fd],
33
+ env: process.env,
34
+ });
35
+ let exitCode = null;
36
+ child.on('exit', (code) => { exitCode = code ?? 0; });
37
+ child.on('error', () => { exitCode = -1; });
38
+ const deadline = Date.now() + (work.startTimeoutMs ?? 30_000);
39
+ const identityFile = work.identityFile ?? work.startedFile;
40
+ let identity = null;
41
+ let started = false;
42
+ while (Date.now() < deadline) {
43
+ identity = await readJson(identityFile);
44
+ if (identity?.runId) {
45
+ started = true;
46
+ break;
47
+ }
48
+ if (await exists(work.startedFile)) {
49
+ // Proof of start is enough to hand back control. The run id is reported
50
+ // when it is already there and never waited for — the status command
51
+ // works from the directory alone, and waiting on it would reintroduce
52
+ // exactly the blocking this exists to remove.
53
+ identity = await readJson(identityFile);
54
+ started = true;
55
+ break;
56
+ }
57
+ if (exitCode !== null)
58
+ break;
59
+ await delay(args.pollIntervalMs ?? 250);
60
+ }
61
+ await logHandle.close();
62
+ if (!started && exitCode !== null && exitCode !== 0) {
63
+ // The worker refused before it owned anything — a bad flag, an existing
64
+ // attempt. That belongs in front of the caller, not buried in a log file.
65
+ const log = await readFile(work.logFile, 'utf8').catch(() => '');
66
+ child.unref();
67
+ throw new Error(log.trim().split('\n').slice(-6).join('\n')
68
+ || `${work.label} exited ${exitCode} before it started. Log: ${work.logFile}`);
69
+ }
70
+ child.unref();
71
+ const runId = typeof identity?.runId === 'string' ? identity.runId : undefined;
72
+ const nextAction = nextActionLine({
73
+ what: `A ${work.label}`,
74
+ typicalSeconds: work.typicalSeconds,
75
+ statusCommand: work.statusCommand,
76
+ waitHint: 'or re-run with --wait to block in this shell instead',
77
+ });
78
+ write(`${work.label} started${runId ? ` (${runId})` : ''} in the background`
79
+ + `${child.pid ? `, pid ${child.pid}` : ''}. It keeps running after this command returns.`
80
+ + `\n${nextAction}`
81
+ + `\nOutput: ${work.logFile}`);
82
+ return {
83
+ detached: true,
84
+ pid: child.pid ?? null,
85
+ started,
86
+ ...(runId ? { runId } : {}),
87
+ logFile: work.logFile,
88
+ statusCommand: work.statusCommand,
89
+ nextAction,
90
+ };
91
+ };
92
+ /** `12ui branch execute|resume` without `--wait`. */
93
+ export const detachBranchRun = async (args) => spawnDetachedRun({
94
+ cliPath: args.cliPath,
95
+ argv: args.argv,
96
+ ...(args.spawnImpl ? { spawnImpl: args.spawnImpl } : {}),
97
+ work: {
98
+ label: 'branch run',
99
+ startedFile: path.join(args.outDir, 'branch.attempt.json'),
100
+ // The progress record carries the run id, which appears once the claim
101
+ // lands (10-20s) — worth waiting for so the report names the run.
102
+ identityFile: path.join(args.outDir, 'branch.progress.json'),
103
+ logFile: path.join(args.outDir, 'branch.log'),
104
+ statusCommand: `12ui branch status --out-dir ${args.outDir}`,
105
+ typicalSeconds: args.typicalSeconds,
106
+ startTimeoutMs: 40_000,
107
+ },
108
+ });
109
+ /** `12ui image generate-batch` without `--wait`. */
110
+ export const detachImageBatch = async (args) => spawnDetachedRun({
111
+ cliPath: args.cliPath,
112
+ argv: args.argv,
113
+ ...(args.spawnImpl ? { spawnImpl: args.spawnImpl } : {}),
114
+ work: {
115
+ label: 'image batch',
116
+ startedFile: `${args.manifestPath}.attempt.json`,
117
+ logFile: path.join(path.dirname(args.manifestPath), 'generate-batch.log'),
118
+ statusCommand: `12ui image batch-status --manifest ${args.manifestPath}`,
119
+ typicalSeconds: args.typicalSeconds,
120
+ startTimeoutMs: 20_000,
121
+ },
122
+ });
123
+ //# sourceMappingURL=cli-detach.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-detach.js","sourceRoot":"","sources":["../src/cli-detach.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import { type CliFlags } from './cli-arguments.js';
2
+ import { readConversionConfig } from './config.js';
3
+ import { TwelveUiCorpusClient } from './corpus-client.js';
4
+ /**
5
+ * `12ui draft` — the whole explore step as one command.
6
+ *
7
+ * The caller supplies the design problem. Everything else — where the run
8
+ * lives, which references steer which candidate, how the keys are derived,
9
+ * when the batch is done — is the CLI's, because each of those was previously
10
+ * a paragraph of prose that a model could and did paraphrase away.
11
+ */
12
+ export declare const DRAFT_USAGE: string;
13
+ export type DraftPrepared = {
14
+ runDir: string;
15
+ manifestPath: string;
16
+ candidateCount: number;
17
+ nextAction: string;
18
+ };
19
+ /**
20
+ * Prepare the run: create the directory, buy one corpus search, write the
21
+ * generation manifest. Dispatching the images is the caller's next move, so
22
+ * this stays testable without a provider.
23
+ */
24
+ export declare const prepareDraftCommand: (flags: CliFlags, dependencies?: {
25
+ readConfig?: typeof readConversionConfig;
26
+ createClient?: (config: ReturnType<typeof readConversionConfig>) => TwelveUiCorpusClient;
27
+ workspaceRoot?: string;
28
+ write?: (line: string) => void;
29
+ }) => Promise<DraftPrepared>;
30
+ export type DraftStatusReport = {
31
+ runDir: string;
32
+ query?: string;
33
+ phase: 'searching' | 'generating' | 'ready' | 'selected';
34
+ complete: boolean;
35
+ candidates: {
36
+ id: string;
37
+ status: string;
38
+ path: string;
39
+ }[];
40
+ winner?: string;
41
+ narrative: string;
42
+ nextAction?: string;
43
+ };
44
+ export declare const runDraftStatusCommand: (runDirArgument: string | undefined, _flags: CliFlags) => Promise<DraftStatusReport>;
45
+ export declare const draftBanner: (prepared: DraftPrepared) => string;
46
+ export declare const draftDetachRequested: (flags: CliFlags) => boolean;
47
+ /**
48
+ * The whole explore step. Prepare (one paid corpus search), then hand the
49
+ * generation to `image generate-batch` — detached by default, because an
50
+ * agent's shell cannot hold 90 seconds and a cut dispatch reads as a failure.
51
+ */
52
+ export declare const runDraftCommand: (flags: CliFlags, dependencies: {
53
+ readConfig?: typeof readConversionConfig;
54
+ createClient?: (config: ReturnType<typeof readConversionConfig>) => TwelveUiCorpusClient;
55
+ workspaceRoot?: string;
56
+ write?: (line: string) => void;
57
+ /** Injected by the CLI entry: how the candidates actually get generated. */
58
+ generate: (args: {
59
+ manifestPath: string;
60
+ detach: boolean;
61
+ }) => Promise<unknown>;
62
+ }) => Promise<DraftPrepared>;
63
+ //# sourceMappingURL=cli-draft-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-draft-command.d.ts","sourceRoot":"","sources":["../src/cli-draft-command.ts"],"names":[],"mappings":"AAIA,OAAO,EAA2B,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAM5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAW1D;;;;;;;GAOG;AAEH,eAAO,MAAM,WAAW,QAIoB,CAAC;AA2B7C,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAC9B,OAAO,QAAQ,EACf,eAAc;IACZ,UAAU,CAAC,EAAE,OAAO,oBAAoB,CAAC;IACzC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC,KAAK,oBAAoB,CAAC;IACzF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3B,KACL,OAAO,CAAC,aAAa,CAoDvB,CAAC;AAoBF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,GAAG,YAAY,GAAG,OAAO,GAAG,UAAU,CAAC;IACzD,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,gBAAgB,MAAM,GAAG,SAAS,EAClC,QAAQ,QAAQ,KACf,OAAO,CAAC,iBAAiB,CA4E3B,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,UAAU,aAAa,KAAG,MAGrD,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,OAAO,QAAQ,KAAG,OAAsC,CAAC;AAE9F;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAC1B,OAAO,QAAQ,EACf,cAAc;IACZ,UAAU,CAAC,EAAE,OAAO,oBAAoB,CAAC;IACzC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC,KAAK,oBAAoB,CAAC;IACzF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,4EAA4E;IAC5E,QAAQ,EAAE,CAAC,IAAI,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACjF,KACA,OAAO,CAAC,aAAa,CASvB,CAAC"}