@12ui/design 0.2.16 → 0.2.17
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.
- package/README.md +22 -0
- package/dist/branch-client.d.ts +6 -1
- package/dist/branch-client.d.ts.map +1 -1
- package/dist/branch-client.js +6 -1
- package/dist/branch-client.js.map +1 -1
- package/dist/branch-status.d.ts.map +1 -1
- package/dist/branch-status.js +3 -2
- package/dist/branch-status.js.map +1 -1
- package/dist/branch-winner.d.ts +31 -0
- package/dist/branch-winner.d.ts.map +1 -0
- package/dist/branch-winner.js +121 -0
- package/dist/branch-winner.js.map +1 -0
- package/dist/cli-arguments.d.ts +1 -0
- package/dist/cli-arguments.d.ts.map +1 -1
- package/dist/cli-arguments.js +4 -3
- package/dist/cli-arguments.js.map +1 -1
- package/dist/cli-branch-command.d.ts +3 -0
- package/dist/cli-branch-command.d.ts.map +1 -1
- package/dist/cli-branch-command.js +66 -98
- package/dist/cli-branch-command.js.map +1 -1
- package/dist/cli-capabilities.d.ts +18 -0
- package/dist/cli-capabilities.d.ts.map +1 -1
- package/dist/cli-capabilities.js +23 -0
- package/dist/cli-capabilities.js.map +1 -1
- package/dist/cli-convert-command.d.ts +10 -0
- package/dist/cli-convert-command.d.ts.map +1 -0
- package/dist/cli-convert-command.js +307 -0
- package/dist/cli-convert-command.js.map +1 -0
- package/dist/cli-corpus-command.d.ts +6 -1
- package/dist/cli-corpus-command.d.ts.map +1 -1
- package/dist/cli-corpus-command.js +17 -21
- package/dist/cli-corpus-command.js.map +1 -1
- package/dist/cli-create-command.d.ts +5 -1
- package/dist/cli-create-command.d.ts.map +1 -1
- package/dist/cli-create-command.js +28 -12
- package/dist/cli-create-command.js.map +1 -1
- package/dist/cli-detach.d.ts.map +1 -1
- package/dist/cli-detach.js +10 -2
- package/dist/cli-detach.js.map +1 -1
- package/dist/cli-draft-command.d.ts +7 -0
- package/dist/cli-draft-command.d.ts.map +1 -1
- package/dist/cli-draft-command.js +6 -4
- package/dist/cli-draft-command.js.map +1 -1
- package/dist/cli-export-command.d.ts +24 -1
- package/dist/cli-export-command.d.ts.map +1 -1
- package/dist/cli-export-command.js +6 -3
- package/dist/cli-export-command.js.map +1 -1
- package/dist/cli-image-batch-command.d.ts +8 -2
- package/dist/cli-image-batch-command.d.ts.map +1 -1
- package/dist/cli-image-batch-command.js +15 -11
- package/dist/cli-image-batch-command.js.map +1 -1
- package/dist/cli-image-batch-resume.d.ts +3 -1
- package/dist/cli-image-batch-resume.d.ts.map +1 -1
- package/dist/cli-image-batch-resume.js +1 -0
- package/dist/cli-image-batch-resume.js.map +1 -1
- package/dist/cli-image-command.d.ts +3 -1
- package/dist/cli-image-command.d.ts.map +1 -1
- package/dist/cli-image-command.js +4 -2
- package/dist/cli-image-command.js.map +1 -1
- package/dist/cli-package-command.d.ts.map +1 -1
- package/dist/cli-package-command.js +4 -3
- package/dist/cli-package-command.js.map +1 -1
- package/dist/cli-refusal.d.ts +20 -0
- package/dist/cli-refusal.d.ts.map +1 -0
- package/dist/cli-refusal.js +29 -0
- package/dist/cli-refusal.js.map +1 -0
- package/dist/cli-run.d.ts +4 -0
- package/dist/cli-run.d.ts.map +1 -0
- package/dist/cli-run.js +215 -0
- package/dist/cli-run.js.map +1 -0
- package/dist/cli-select-command.d.ts +6 -1
- package/dist/cli-select-command.d.ts.map +1 -1
- package/dist/cli-select-command.js +9 -7
- package/dist/cli-select-command.js.map +1 -1
- package/dist/cli-usage.d.ts +17 -0
- package/dist/cli-usage.d.ts.map +1 -0
- package/dist/cli-usage.js +69 -0
- package/dist/cli-usage.js.map +1 -0
- package/dist/cli-version.d.ts +2 -0
- package/dist/cli-version.d.ts.map +1 -0
- package/dist/cli-version.js +8 -0
- package/dist/cli-version.js.map +1 -0
- package/dist/cli.js +9 -491
- package/dist/cli.js.map +1 -1
- package/dist/concept-input.d.ts +34 -0
- package/dist/concept-input.d.ts.map +1 -0
- package/dist/concept-input.js +41 -0
- package/dist/concept-input.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/package-client.d.ts +13 -0
- package/dist/package-client.d.ts.map +1 -1
- package/dist/package-client.js +32 -0
- package/dist/package-client.js.map +1 -1
- package/dist/run-journal-commands.d.ts +54 -0
- package/dist/run-journal-commands.d.ts.map +1 -0
- package/dist/run-journal-commands.js +258 -0
- package/dist/run-journal-commands.js.map +1 -0
- package/dist/run-journal.d.ts +231 -0
- package/dist/run-journal.d.ts.map +1 -0
- package/dist/run-journal.js +453 -0
- package/dist/run-journal.js.map +1 -0
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,498 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { readFile, writeFile } from 'node:fs/promises';
|
|
3
|
-
import path from 'node:path';
|
|
4
2
|
import { fileURLToPath } from 'node:url';
|
|
5
|
-
import {
|
|
6
|
-
import { booleanFlag, parseCliArguments, stringFlag, } from './cli-arguments.js';
|
|
7
|
-
import { runAuthCommand } from './cli-auth-command.js';
|
|
8
|
-
import { runBranchCommand } from './cli-branch-command.js';
|
|
9
|
-
import { CLI_CAPABILITIES } from './cli-capabilities.js';
|
|
10
|
-
import { runCliCommand } from './cli-cli-command.js';
|
|
11
|
-
import { runCorpusCommand } from './cli-corpus-command.js';
|
|
12
|
-
import { runExportCommand } from './cli-export-command.js';
|
|
13
|
-
import { runImageBatchCommand, runImageBatchStatusCommand, } from './cli-image-batch-command.js';
|
|
14
|
-
import { runImageCommand } from './cli-image-command.js';
|
|
15
|
-
import { runCreateCommand } from './cli-create-command.js';
|
|
16
|
-
import { runPackageCommand, runPackageTemplateCommand } from './cli-package-command.js';
|
|
17
|
-
import { runSkillCommand } from './cli-skill-command.js';
|
|
18
|
-
import { isConversionModel } from './conversion-models.js';
|
|
19
|
-
import { TwelveUiConversionClient, } from './conversion-client.js';
|
|
20
|
-
import { detachBranchRun, detachImageBatch } from './cli-detach.js';
|
|
21
|
-
import { runDraftCommand, runDraftStatusCommand } from './cli-draft-command.js';
|
|
22
|
-
import { runSelectCommand } from './cli-select-command.js';
|
|
23
|
-
import { resolveBranchDirectory } from './cli-branch-command.js';
|
|
24
|
-
import { CONVERSION_DURATION_HINTS, OPERATION_DURATION_HINTS, createProgressReporter, durationHint, nextActionLine, } from './cli-progress.js';
|
|
25
|
-
import { CONVERSION_OUTPUTS, isConversionOutput } from './conversion-outputs.js';
|
|
26
|
-
import { recordConvertedImageReceipt } from './conversion-receipt.js';
|
|
27
|
-
import { readConversionConfig } from './config.js';
|
|
28
|
-
import { classifyLocalConversionInput, createInputForLocalFile, defaultConversionOutputPath, } from './local-conversion-input.js';
|
|
29
|
-
import { normalizeImageOutputWidth, parseImageOutputWidth, } from './image-output-width.js';
|
|
30
|
-
import { normalizeOptionalIdempotencyKey } from './idempotency-key.js';
|
|
31
|
-
import { isProjectConversionOutput, parseConversionOutputProfile, } from './project-profiles.js';
|
|
32
|
-
import { isResponsiveConversionQuality, RESPONSIVE_CONVERSION_QUALITIES, } from './responsive-quality.js';
|
|
33
|
-
import { startMcpServer } from './server.js';
|
|
34
|
-
const usage = (exitCode = 1) => {
|
|
35
|
-
const outputs = CONVERSION_OUTPUTS.join('|');
|
|
36
|
-
console.error(`Usage:
|
|
37
|
-
12ui auth login [--api-key <personal-key>] [--login-origin <url>] [--key-name <name>]
|
|
38
|
-
12ui auth status [--login-origin <url>] [--json]
|
|
39
|
-
12ui auth logout [--login-origin <url>]
|
|
40
|
-
12ui cli install
|
|
41
|
-
12ui cli status [--json]
|
|
42
|
-
12ui skill install [--skill design|design-search|design-draft|design-branch|design-convert] [--client codex|claude-code|grok|cursor|antigravity|copilot] [--home <client-home>] [--api-key <key>] [--login-origin <url>] [--key-name <name>] [--force] [--skip-auth]
|
|
43
|
-
12ui skill status [--skill design|design-search|design-draft|design-branch|design-convert] [--client codex|claude-code|grok|cursor|antigravity|copilot] [--home <client-home>] [--json]
|
|
44
|
-
12ui skill print --skill design|design-search|design-draft|design-branch|design-convert
|
|
45
|
-
12ui skill remove [--skill design|design-search|design-draft|design-branch|design-convert] [--client codex|claude-code|grok|cursor|antigravity|copilot] [--home <client-home>]
|
|
46
|
-
12ui corpus inspire --query <text>|--query-file <file> --out-dir <directory> [--mode direct|balanced|adventurer] [--count <1-48>] [--reference-image <png|jpeg|webp>] [--idempotency-key <key>] [--origin <url>] [--api-key <key>]
|
|
47
|
-
12ui corpus resume --out-dir <directory> [--origin <url>] [--api-key <key>]
|
|
48
|
-
12ui image generate --prompt <text>|--prompt-file <file> --reference <file> --out <file.png> [--aspect landscape|portrait|square] [--reference-mode inspiration|preserve-structure] [--provider auto|codex|openai] --project-root <directory> --idempotency-key <key>
|
|
49
|
-
12ui draft --query <text> [--redesign-source <png>] [--mode exploratory|reskin] [--aspect landscape|portrait|square] [--provider auto|codex|openai] [--project-root <directory>] [--wait] [--quiet] [--origin <url>] [--api-key <key>]
|
|
50
|
-
12ui draft status <run-dir> [--json]
|
|
51
|
-
12ui select <run-dir> --winner <id> --reason <text> [--recommended <id>] [--recommendation-source <text>] [--reject <id>=<reason>]
|
|
52
|
-
12ui create claim --concept <text>|--concept-file <file> --candidates <json>|@<file> [--aspect landscape|portrait|square] [--mode inspiration|preserve-structure] [--reference-image <png|jpeg|webp>] [--idempotency-key <key>] [--origin <url>] [--api-key <key>]
|
|
53
|
-
12ui create dispatch <run-id> [--slot <a,b,...>] [--quiet] [--origin <url>] [--api-key <key>]
|
|
54
|
-
12ui create status <run-id> [--json] [--origin <url>] [--api-key <key>]
|
|
55
|
-
12ui create download <run-id> --out-dir <directory> [--slot <a,b,...>] [--origin <url>] [--api-key <key>]
|
|
56
|
-
12ui image generate-batch --manifest <batch.json> [--resume] [--wait] [--quiet]
|
|
57
|
-
12ui image batch-status --manifest <batch.json> [--json]
|
|
58
|
-
12ui branch execute <run-dir> --concept <text>|--concept-file <file> --scope page|site [--convert html] [--convert-model fast|standard|pro] [--convert-quality standard|pro] [--winner-image <file>|--winner-run <crt-id> --winner-slot <slot>] [--source-conversion-id <id>] [--max-screens <n>] [--page-concurrency <n>] [--idempotency-key <key>] [--out-dir <directory>] [--resume] [--dry-run] [--wait] [--quiet] [--origin <url>] [--api-key <key>]
|
|
59
|
-
12ui branch resume <run-dir> [--quiet] [--origin <url>] [--api-key <key>]
|
|
60
|
-
12ui branch status <run-dir> [--json] [--origin <url>] [--api-key <key>]
|
|
61
|
-
12ui capabilities [--json]
|
|
62
|
-
12ui convert <image.png|jpg|webp|layerdoc.json> --output ${outputs} [--model fast|standard|pro] [--width <px>] [--export html] [--export-quality standard|pro] [--export-out <file>] [--responsive-quality standard|pro] [--profile <json|file>] [--out <file>] [--detach] [--quiet] [--timeout-ms <ms>] [--idempotency-key <key>] [--origin <url>] [--api-key <key>]
|
|
63
|
-
12ui convert package --manifest <package.json> --out-dir <directory> [--idempotency-key <key>] [--timeout-ms <ms>] [--wait] [--quiet] [--origin <url>] [--api-key <key>]
|
|
64
|
-
12ui convert package --template
|
|
65
|
-
12ui export <source-conversion-id> --output <comma-separated-formats> --out-dir <directory> [--idempotency-key <key>] [--responsive-quality standard|pro] [--web-profile <json|file>] [--app-profile <json|file>] [--timeout-ms <ms>] [--origin <url>] [--api-key <key>]
|
|
66
|
-
12ui resume <conversion-id> --output ${outputs} --out <file> [--timeout-ms <ms>] [--origin <url>] [--api-key <key>]
|
|
67
|
-
12ui mcp [--origin <url>] [--api-key <key>]
|
|
68
|
-
12ui --version
|
|
69
|
-
|
|
70
|
-
--export html converts and exports responsive HTML in ONE blocking command; the
|
|
71
|
-
export runs alongside the conversion, so the pair finishes in about the time of
|
|
72
|
-
the conversion alone (~5m) instead of ~8m. Progress goes to stderr; --quiet
|
|
73
|
-
silences it.
|
|
74
|
-
|
|
75
|
-
\`branch execute\`, \`branch resume\` and \`image generate-batch\` START the work and
|
|
76
|
-
return: the run continues in its own process group and survives the shell that
|
|
77
|
-
launched it. Follow it with \`12ui branch status --out-dir <dir>\` or
|
|
78
|
-
\`12ui image batch-status --manifest <file>\`; both always report what is moving
|
|
79
|
-
and what to do next. Add --wait to block in this shell instead. Never list an
|
|
80
|
-
output directory to decide whether work is still running.
|
|
81
|
-
|
|
82
|
-
Omit --client to discover and target every supported CLI installation.`);
|
|
83
|
-
process.exit(exitCode);
|
|
84
|
-
};
|
|
85
|
-
/** This file, as the worker re-executes it. */
|
|
86
|
-
const CLI_PATH = fileURLToPath(import.meta.url);
|
|
3
|
+
import { runCli } from './cli-run.js';
|
|
87
4
|
/**
|
|
88
|
-
*
|
|
89
|
-
*
|
|
5
|
+
* The executable entry point, and nothing else.
|
|
6
|
+
*
|
|
7
|
+
* The dispatcher lives in `cli-run.ts` so a test can drive the real command
|
|
8
|
+
* surface in-process. This file exists to supply the one thing only the
|
|
9
|
+
* executable knows: its own path, which the detached workers re-execute.
|
|
90
10
|
*/
|
|
91
|
-
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
return undefined;
|
|
95
|
-
const timeoutMs = Number(value);
|
|
96
|
-
if (!Number.isFinite(timeoutMs) || timeoutMs < 1_000) {
|
|
97
|
-
throw new Error('--timeout-ms must be a number of at least 1000');
|
|
98
|
-
}
|
|
99
|
-
return Math.floor(timeoutMs);
|
|
100
|
-
};
|
|
101
|
-
const parseProjectProfileFlag = async (output, value) => {
|
|
102
|
-
if (!isProjectConversionOutput(output)) {
|
|
103
|
-
if (value !== undefined)
|
|
104
|
-
throw new Error('--profile is only valid for project outputs');
|
|
105
|
-
return undefined;
|
|
106
|
-
}
|
|
107
|
-
if (!value?.trim())
|
|
108
|
-
throw new Error(`--profile is required for ${output}`);
|
|
109
|
-
const trimmed = value.trim();
|
|
110
|
-
const source = trimmed.startsWith('{')
|
|
111
|
-
? trimmed
|
|
112
|
-
: await readFile(path.resolve(trimmed.startsWith('@') ? trimmed.slice(1) : trimmed), 'utf8');
|
|
113
|
-
let parsed;
|
|
114
|
-
try {
|
|
115
|
-
parsed = JSON.parse(source);
|
|
116
|
-
}
|
|
117
|
-
catch (error) {
|
|
118
|
-
throw new Error(`--profile must contain valid JSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
119
|
-
}
|
|
120
|
-
return parseConversionOutputProfile(output, parsed);
|
|
121
|
-
};
|
|
122
|
-
const downloadCompletedConversion = async (args) => {
|
|
123
|
-
const downloaded = await args.client.downloadResult(args.operation.id, args.output);
|
|
124
|
-
await writeFile(args.outFile, downloaded.bytes);
|
|
125
|
-
const artifactManifest = await materializeConversionArtifacts(args.client, args.operation, args.outFile);
|
|
126
|
-
return {
|
|
127
|
-
id: args.operation.id,
|
|
128
|
-
output: args.output,
|
|
129
|
-
outFile: args.outFile,
|
|
130
|
-
artifactManifest,
|
|
131
|
-
};
|
|
132
|
-
};
|
|
133
|
-
const writeCompletedConversion = async (args) => {
|
|
134
|
-
console.log(JSON.stringify(await downloadCompletedConversion(args), null, 2));
|
|
135
|
-
};
|
|
136
|
-
const printCapabilities = () => {
|
|
137
|
-
console.log(JSON.stringify(CLI_CAPABILITIES, null, 2));
|
|
138
|
-
};
|
|
139
|
-
const printVersion = async () => {
|
|
140
|
-
const packageJson = JSON.parse(await readFile(new URL('../package.json', import.meta.url), 'utf8'));
|
|
141
|
-
if (typeof packageJson.version !== 'string')
|
|
142
|
-
throw new Error('Invalid package version');
|
|
143
|
-
console.log(packageJson.version);
|
|
144
|
-
};
|
|
145
|
-
const runConversionCommand = async (command, flags) => {
|
|
146
|
-
const verb = command[0];
|
|
147
|
-
// The hosted candidate API as commands: claim, dispatch, status, download.
|
|
148
|
-
if (verb === 'create') {
|
|
149
|
-
await runCreateCommand(command, flags);
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
// Ordered viewports of one page are ONE package conversion, not N converts.
|
|
153
|
-
if (verb === 'convert' && command[1] === 'package') {
|
|
154
|
-
if (runPackageTemplateCommand(flags))
|
|
155
|
-
return;
|
|
156
|
-
await runPackageCommand(flags);
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
const config = readConversionConfig({
|
|
160
|
-
origin: stringFlag(flags, 'origin'),
|
|
161
|
-
apiKey: stringFlag(flags, 'api-key'),
|
|
162
|
-
});
|
|
163
|
-
if (verb === 'mcp') {
|
|
164
|
-
await startMcpServer({ config });
|
|
165
|
-
return;
|
|
166
|
-
}
|
|
167
|
-
// `12ui convert <image> --export html` is the whole command for a single
|
|
168
|
-
// screen. The export is derived from a LayerDoc conversion, so asking for the
|
|
169
|
-
// output as well is asking the caller to restate the only value it can have.
|
|
170
|
-
const outputValue = stringFlag(flags, 'output')
|
|
171
|
-
?? (stringFlag(flags, 'export') !== undefined ? 'layerdoc' : undefined);
|
|
172
|
-
const output = isConversionOutput(outputValue) ? outputValue : usage();
|
|
173
|
-
const client = new TwelveUiConversionClient(config);
|
|
174
|
-
const timeoutMs = parseTimeoutMs(stringFlag(flags, 'timeout-ms'));
|
|
175
|
-
if (verb === 'resume') {
|
|
176
|
-
if (stringFlag(flags, 'profile') !== undefined
|
|
177
|
-
|| stringFlag(flags, 'model') !== undefined
|
|
178
|
-
|| stringFlag(flags, 'width') !== undefined
|
|
179
|
-
|| stringFlag(flags, 'responsive-quality') !== undefined
|
|
180
|
-
|| booleanFlag(flags, 'detach')) {
|
|
181
|
-
throw new Error('--profile, --model, --width, --responsive-quality, and --detach are not accepted by resume');
|
|
182
|
-
}
|
|
183
|
-
const conversionId = command[1]?.trim();
|
|
184
|
-
const outFile = stringFlag(flags, 'out');
|
|
185
|
-
if (!conversionId)
|
|
186
|
-
usage();
|
|
187
|
-
const resolvedOutFile = outFile ? path.resolve(outFile) : usage();
|
|
188
|
-
const current = await client.getConversion(conversionId);
|
|
189
|
-
if (current.output !== output) {
|
|
190
|
-
throw new Error(`Conversion ${conversionId} produces ${current.output}, not ${output}`);
|
|
191
|
-
}
|
|
192
|
-
const completed = current.status === 'succeeded'
|
|
193
|
-
? current
|
|
194
|
-
: await client.waitForConversion(current.id, {
|
|
195
|
-
expiresAt: current.expires_at,
|
|
196
|
-
timeoutMs,
|
|
197
|
-
});
|
|
198
|
-
await writeCompletedConversion({
|
|
199
|
-
client,
|
|
200
|
-
operation: completed,
|
|
201
|
-
output,
|
|
202
|
-
outFile: resolvedOutFile,
|
|
203
|
-
});
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
if (verb !== 'convert' || !command[1])
|
|
207
|
-
usage();
|
|
208
|
-
const modelValue = stringFlag(flags, 'model');
|
|
209
|
-
const model = modelValue === undefined
|
|
210
|
-
? undefined
|
|
211
|
-
: isConversionModel(modelValue)
|
|
212
|
-
? modelValue
|
|
213
|
-
: usage();
|
|
214
|
-
const responsiveValue = stringFlag(flags, 'responsive-quality');
|
|
215
|
-
if (responsiveValue !== undefined && !isResponsiveConversionQuality(responsiveValue)) {
|
|
216
|
-
throw new Error(`--responsive-quality must be one of: ${RESPONSIVE_CONVERSION_QUALITIES.join(', ')}`);
|
|
217
|
-
}
|
|
218
|
-
const profile = await parseProjectProfileFlag(output, stringFlag(flags, 'profile'));
|
|
219
|
-
const inputPath = path.resolve(command[1]);
|
|
220
|
-
const localInput = classifyLocalConversionInput(inputPath);
|
|
221
|
-
const outputWidth = parseImageOutputWidth(stringFlag(flags, 'width'));
|
|
222
|
-
if (outputWidth !== undefined && localInput.kind === 'layerdoc') {
|
|
223
|
-
throw new Error('--width is only valid for image input');
|
|
224
|
-
}
|
|
225
|
-
const sourceBytes = new Uint8Array(await readFile(inputPath));
|
|
226
|
-
const inputBytes = outputWidth !== undefined && localInput.kind === 'image'
|
|
227
|
-
? await normalizeImageOutputWidth({
|
|
228
|
-
bytes: sourceBytes,
|
|
229
|
-
mediaType: localInput.mediaType,
|
|
230
|
-
width: outputWidth,
|
|
231
|
-
})
|
|
232
|
-
: sourceBytes;
|
|
233
|
-
const input = createInputForLocalFile({
|
|
234
|
-
bytes: inputBytes,
|
|
235
|
-
filePath: inputPath,
|
|
236
|
-
output,
|
|
237
|
-
...(profile ? { profile } : {}),
|
|
238
|
-
});
|
|
239
|
-
const idempotencyKey = normalizeOptionalIdempotencyKey(stringFlag(flags, 'idempotency-key'), '--idempotency-key');
|
|
240
|
-
if (input.layerdoc !== undefined && model)
|
|
241
|
-
throw new Error('--model is only valid for image input');
|
|
242
|
-
if (input.layerdoc !== undefined && responsiveValue) {
|
|
243
|
-
throw new Error('--responsive-quality with LayerDoc input requires the SDK source-conversion workflow');
|
|
244
|
-
}
|
|
245
|
-
if (responsiveValue && output !== 'html') {
|
|
246
|
-
throw new Error('--responsive-quality is only valid with --output html');
|
|
247
|
-
}
|
|
248
|
-
// --export asks for the responsive HTML export to run ALONGSIDE the
|
|
249
|
-
// conversion in one blocking command, instead of the create-then-export
|
|
250
|
-
// choreography that costs the two runs back to back.
|
|
251
|
-
const exportValue = stringFlag(flags, 'export');
|
|
252
|
-
if (exportValue !== undefined && exportValue !== 'html') {
|
|
253
|
-
throw new Error('--export must be html');
|
|
254
|
-
}
|
|
255
|
-
const exportQualityValue = stringFlag(flags, 'export-quality');
|
|
256
|
-
if (exportQualityValue !== undefined && !isResponsiveConversionQuality(exportQualityValue)) {
|
|
257
|
-
throw new Error(`--export-quality must be one of: ${RESPONSIVE_CONVERSION_QUALITIES.join(', ')}`);
|
|
258
|
-
}
|
|
259
|
-
if (exportQualityValue !== undefined && exportValue === undefined) {
|
|
260
|
-
throw new Error('--export-quality requires --export html');
|
|
261
|
-
}
|
|
262
|
-
const exportOutValue = stringFlag(flags, 'export-out');
|
|
263
|
-
if (exportOutValue !== undefined && exportValue === undefined) {
|
|
264
|
-
throw new Error('--export-out requires --export html');
|
|
265
|
-
}
|
|
266
|
-
if (exportValue !== undefined) {
|
|
267
|
-
if (input.layerdoc !== undefined)
|
|
268
|
-
throw new Error('--export requires image input');
|
|
269
|
-
if (output !== 'layerdoc')
|
|
270
|
-
throw new Error('--export requires --output layerdoc');
|
|
271
|
-
}
|
|
272
|
-
const exportHtml = exportValue === 'html'
|
|
273
|
-
? { ...(exportQualityValue ? { responsiveQuality: exportQualityValue } : {}) }
|
|
274
|
-
: undefined;
|
|
275
|
-
const conversionInput = input.layerdoc !== undefined
|
|
276
|
-
? input
|
|
277
|
-
: {
|
|
278
|
-
...input,
|
|
279
|
-
...(model ? { model } : {}),
|
|
280
|
-
...(responsiveValue ? { responsiveQuality: responsiveValue } : {}),
|
|
281
|
-
...(exportHtml ? { exportHtml } : {}),
|
|
282
|
-
};
|
|
283
|
-
const detach = booleanFlag(flags, 'detach');
|
|
284
|
-
const quiet = booleanFlag(flags, 'quiet');
|
|
285
|
-
const created = await client.createConversion({
|
|
286
|
-
...conversionInput,
|
|
287
|
-
...(idempotencyKey ? { idempotencyKey } : {}),
|
|
288
|
-
waitSeconds: detach ? 0 : 20,
|
|
289
|
-
});
|
|
290
|
-
if (detach) {
|
|
291
|
-
const resumeCommand = `12ui resume ${created.id} --output ${output} --out <file>`;
|
|
292
|
-
console.log(JSON.stringify({
|
|
293
|
-
id: created.id,
|
|
294
|
-
status: created.status,
|
|
295
|
-
output: created.output,
|
|
296
|
-
...(created.export ? { export: created.export } : {}),
|
|
297
|
-
expiresAt: created.expires_at,
|
|
298
|
-
// A detached operation is the one case with nothing streaming, so the
|
|
299
|
-
// response has to say how long it takes and how to collect it.
|
|
300
|
-
nextAction: nextActionLine({
|
|
301
|
-
what: 'A conversion',
|
|
302
|
-
typicalSeconds: CONVERSION_DURATION_HINTS[created.export ? 'fused' : 'convert'],
|
|
303
|
-
statusCommand: resumeCommand,
|
|
304
|
-
waitHint: 'which blocks until it finishes and writes the result',
|
|
305
|
-
}),
|
|
306
|
-
}, null, 2));
|
|
307
|
-
return;
|
|
308
|
-
}
|
|
309
|
-
const exportOperationId = created.export?.conversion_id ?? null;
|
|
310
|
-
if (!quiet) {
|
|
311
|
-
process.stderr.write(`12ui convert ${created.id}${exportOperationId ? ` (+ export ${exportOperationId})` : ''}`
|
|
312
|
-
+ ` — ${durationHint(exportOperationId ? 'fused' : 'convert')}\n`
|
|
313
|
-
+ `${nextActionLine({
|
|
314
|
-
what: 'A conversion',
|
|
315
|
-
typicalSeconds: CONVERSION_DURATION_HINTS[exportOperationId ? 'fused' : 'convert'],
|
|
316
|
-
statusCommand: `12ui resume ${created.id} --output ${output} --out <file>`,
|
|
317
|
-
waitHint: 'or leave this command running, which is what --wait already does by default',
|
|
318
|
-
})}\n`);
|
|
319
|
-
}
|
|
320
|
-
const reporter = createProgressReporter({ label: 'convert', quiet });
|
|
321
|
-
let operation;
|
|
322
|
-
try {
|
|
323
|
-
operation = created.status === 'succeeded'
|
|
324
|
-
? created
|
|
325
|
-
: await client.waitForConversion(created.id, {
|
|
326
|
-
expiresAt: created.expires_at,
|
|
327
|
-
timeoutMs,
|
|
328
|
-
onProgress: reporter.onProgress,
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
catch (error) {
|
|
332
|
-
const detail = error instanceof Error ? error.message : String(error);
|
|
333
|
-
throw new Error(`Conversion ${created.id} failed: ${detail}`, { cause: error });
|
|
334
|
-
}
|
|
335
|
-
reporter.done(operation);
|
|
336
|
-
// The proof that pairs these exact bytes with the conversion just bought, so
|
|
337
|
-
// a later `12ui branch execute` from the same image attaches it instead of
|
|
338
|
-
// buying viewport 1 of its source page a second time. It goes to the per-user
|
|
339
|
-
// store rather than beside the image, so it is found from every copy of those
|
|
340
|
-
// bytes. Best effort by design: a store that refuses the write costs a later
|
|
341
|
-
// conversion and nothing else.
|
|
342
|
-
if (input.layerdoc === undefined) {
|
|
343
|
-
await recordConvertedImageReceipt({
|
|
344
|
-
bytes: inputBytes,
|
|
345
|
-
operation,
|
|
346
|
-
...(quiet ? {} : { warn: (message) => process.stderr.write(`${message}\n`) }),
|
|
347
|
-
});
|
|
348
|
-
}
|
|
349
|
-
const outFile = path.resolve(stringFlag(flags, 'out') || defaultConversionOutputPath(inputPath, output));
|
|
350
|
-
const result = await downloadCompletedConversion({ client, operation, output, outFile });
|
|
351
|
-
if (!exportOperationId) {
|
|
352
|
-
console.log(JSON.stringify(result, null, 2));
|
|
353
|
-
return;
|
|
354
|
-
}
|
|
355
|
-
// The conversion is already on disk. An export that fails or is still
|
|
356
|
-
// running after the budget must not take it back: the two halves are
|
|
357
|
-
// separate operations and the conversion is the authoritative answer for its
|
|
358
|
-
// own half.
|
|
359
|
-
const exportReporter = createProgressReporter({ label: 'export', quiet });
|
|
360
|
-
const exportOutFile = path.resolve(exportOutValue || defaultConversionOutputPath(inputPath, 'html'));
|
|
361
|
-
let exportResult = null;
|
|
362
|
-
let exportError = null;
|
|
363
|
-
try {
|
|
364
|
-
const exportOperation = await client.waitForConversion(exportOperationId, {
|
|
365
|
-
expiresAt: created.expires_at,
|
|
366
|
-
timeoutMs,
|
|
367
|
-
onProgress: exportReporter.onProgress,
|
|
368
|
-
});
|
|
369
|
-
exportReporter.done(exportOperation);
|
|
370
|
-
exportResult = await downloadCompletedConversion({
|
|
371
|
-
client,
|
|
372
|
-
operation: exportOperation,
|
|
373
|
-
output: 'html',
|
|
374
|
-
outFile: exportOutFile,
|
|
375
|
-
});
|
|
376
|
-
}
|
|
377
|
-
catch (error) {
|
|
378
|
-
exportError = error instanceof Error ? error.message : String(error);
|
|
379
|
-
}
|
|
380
|
-
console.log(JSON.stringify({
|
|
381
|
-
...result,
|
|
382
|
-
export: exportResult
|
|
383
|
-
? { ...exportResult, status: 'succeeded' }
|
|
384
|
-
: { id: exportOperationId, output: 'html', status: 'failed', error: exportError },
|
|
385
|
-
}, null, 2));
|
|
386
|
-
if (!exportResult) {
|
|
387
|
-
throw new Error(`Conversion ${created.id} succeeded and was written to ${outFile}, but its responsive HTML`
|
|
388
|
-
+ ` export ${exportOperationId} did not: ${exportError}`);
|
|
389
|
-
}
|
|
390
|
-
};
|
|
391
|
-
const main = async () => {
|
|
392
|
-
const { command, flags } = parseCliArguments(process.argv.slice(2));
|
|
393
|
-
if (booleanFlag(flags, 'help'))
|
|
394
|
-
usage(0);
|
|
395
|
-
if (booleanFlag(flags, 'version') || command[0] === 'version') {
|
|
396
|
-
await printVersion();
|
|
397
|
-
return;
|
|
398
|
-
}
|
|
399
|
-
if (command[0] === 'skill') {
|
|
400
|
-
await runSkillCommand(command[1], flags);
|
|
401
|
-
return;
|
|
402
|
-
}
|
|
403
|
-
if (command[0] === 'auth') {
|
|
404
|
-
await runAuthCommand(command[1], flags);
|
|
405
|
-
return;
|
|
406
|
-
}
|
|
407
|
-
if (command[0] === 'cli') {
|
|
408
|
-
await runCliCommand(command[1], flags);
|
|
409
|
-
return;
|
|
410
|
-
}
|
|
411
|
-
if (command[0] === 'corpus') {
|
|
412
|
-
await runCorpusCommand(command[1], flags);
|
|
413
|
-
return;
|
|
414
|
-
}
|
|
415
|
-
if (command[0] === 'image') {
|
|
416
|
-
if (command[1] === 'generate-batch') {
|
|
417
|
-
if (detaches(flags)) {
|
|
418
|
-
const manifest = stringFlag(flags, 'manifest')?.trim();
|
|
419
|
-
if (!manifest)
|
|
420
|
-
throw new Error('--manifest is required');
|
|
421
|
-
console.log(JSON.stringify(await detachImageBatch({
|
|
422
|
-
cliPath: CLI_PATH,
|
|
423
|
-
argv: process.argv.slice(2),
|
|
424
|
-
manifestPath: path.resolve(manifest),
|
|
425
|
-
typicalSeconds: OPERATION_DURATION_HINTS.imageBatch,
|
|
426
|
-
}), null, 2));
|
|
427
|
-
return;
|
|
428
|
-
}
|
|
429
|
-
await runImageBatchCommand(flags);
|
|
430
|
-
}
|
|
431
|
-
else if (command[1] === 'batch-status')
|
|
432
|
-
await runImageBatchStatusCommand(flags);
|
|
433
|
-
else
|
|
434
|
-
await runImageCommand(command[1], flags);
|
|
435
|
-
return;
|
|
436
|
-
}
|
|
437
|
-
if (command[0] === 'draft') {
|
|
438
|
-
if (command[1] === 'status') {
|
|
439
|
-
console.log(JSON.stringify(await runDraftStatusCommand(command[2], flags), null, 2));
|
|
440
|
-
return;
|
|
441
|
-
}
|
|
442
|
-
await runDraftCommand(flags, {
|
|
443
|
-
generate: async ({ manifestPath, detach }) => {
|
|
444
|
-
if (!detach)
|
|
445
|
-
return runImageBatchCommand({ ...flags, manifest: manifestPath });
|
|
446
|
-
return console.log(JSON.stringify(await detachImageBatch({
|
|
447
|
-
cliPath: CLI_PATH,
|
|
448
|
-
argv: ['image', 'generate-batch', '--manifest', manifestPath],
|
|
449
|
-
manifestPath,
|
|
450
|
-
typicalSeconds: OPERATION_DURATION_HINTS.imageBatch,
|
|
451
|
-
}), null, 2));
|
|
452
|
-
},
|
|
453
|
-
});
|
|
454
|
-
return;
|
|
455
|
-
}
|
|
456
|
-
if (command[0] === 'select') {
|
|
457
|
-
await runSelectCommand(command[1], flags);
|
|
458
|
-
return;
|
|
459
|
-
}
|
|
460
|
-
if (command[0] === 'branch') {
|
|
461
|
-
// `branch execute <run-dir>` — the directory `12ui draft` printed.
|
|
462
|
-
const runDirArgument = command[2]?.trim();
|
|
463
|
-
if ((command[1] === 'execute' || command[1] === 'resume') && detaches(flags)) {
|
|
464
|
-
const resolved = await resolveBranchDirectory({
|
|
465
|
-
...(stringFlag(flags, 'out-dir')?.trim()
|
|
466
|
-
? { outDirFlag: stringFlag(flags, 'out-dir').trim() }
|
|
467
|
-
: {}),
|
|
468
|
-
...(runDirArgument ? { runDirArgument } : {}),
|
|
469
|
-
});
|
|
470
|
-
console.log(JSON.stringify(await detachBranchRun({
|
|
471
|
-
cliPath: CLI_PATH,
|
|
472
|
-
argv: process.argv.slice(2),
|
|
473
|
-
outDir: resolved.branchDir,
|
|
474
|
-
typicalSeconds: stringFlag(flags, 'scope') === 'site'
|
|
475
|
-
? OPERATION_DURATION_HINTS.branchSite
|
|
476
|
-
: OPERATION_DURATION_HINTS.branchPage,
|
|
477
|
-
}), null, 2));
|
|
478
|
-
return;
|
|
479
|
-
}
|
|
480
|
-
await runBranchCommand(command[1], flags, {
|
|
481
|
-
...(runDirArgument ? { runDirArgument } : {}),
|
|
482
|
-
});
|
|
483
|
-
return;
|
|
484
|
-
}
|
|
485
|
-
if (command[0] === 'export') {
|
|
486
|
-
await runExportCommand(command[1], flags);
|
|
487
|
-
return;
|
|
488
|
-
}
|
|
489
|
-
if (command[0] === 'capabilities') {
|
|
490
|
-
printCapabilities();
|
|
491
|
-
return;
|
|
492
|
-
}
|
|
493
|
-
await runConversionCommand(command, flags);
|
|
494
|
-
};
|
|
495
|
-
main().catch((error) => {
|
|
11
|
+
/** This file, as the worker re-executes it. */
|
|
12
|
+
const CLI_PATH = fileURLToPath(import.meta.url);
|
|
13
|
+
runCli(process.argv.slice(2), { cliPath: CLI_PATH }).catch((error) => {
|
|
496
14
|
console.error(error instanceof Error ? error.message : String(error));
|
|
497
15
|
process.exitCode = 1;
|
|
498
16
|
});
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC;;;;;;GAMG;AAEH,+CAA+C;AAC/C,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEhD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACnE,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One place decides what a concept may be, because the service decides it once.
|
|
3
|
+
*
|
|
4
|
+
* `cleanText` in `workers/api/src/create/validation.ts` collapses every run of
|
|
5
|
+
* whitespace to a single space, trims, and then counts CODE POINTS. Over the
|
|
6
|
+
* limit is rejected with a 400; it is never truncated. Both `POST /api/v1/create`
|
|
7
|
+
* and the same route's `source: "build"` claim (what `12ui branch execute`
|
|
8
|
+
* calls) measure it that way, and the build claim spends a metered plan call
|
|
9
|
+
* the moment it is accepted.
|
|
10
|
+
*
|
|
11
|
+
* The CLI has to measure it identically in both directions. Counting the raw
|
|
12
|
+
* text would refuse a wrapped `--concept-file` the service would have taken,
|
|
13
|
+
* and not counting it at all is how `12ui create claim` used to put an
|
|
14
|
+
* over-length brief on the wire and learn the limit from a 400 (2026-08-12).
|
|
15
|
+
*/
|
|
16
|
+
export declare const MAX_CONCEPT_CHARACTERS = 600;
|
|
17
|
+
/** Exactly the service's normalization, so client and server count one string. */
|
|
18
|
+
export declare const normalizeConceptText: (value: string) => string;
|
|
19
|
+
/** Code points, not UTF-16 units: one emoji is one character to the service. */
|
|
20
|
+
export declare const conceptCharacterCount: (value: string) => number;
|
|
21
|
+
export type ConceptInput = {
|
|
22
|
+
/** Raw text, straight from `--concept` or a `--concept-file` read. */
|
|
23
|
+
value: string;
|
|
24
|
+
/** How to name the flag pair in a refusal, e.g. `--concept`. */
|
|
25
|
+
flag: string;
|
|
26
|
+
/** One clause naming where the cut detail belongs instead. */
|
|
27
|
+
trimHint: string;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Normalize and measure before anything is sent. Returns the exact text the
|
|
31
|
+
* caller should submit, so what was measured is what goes on the wire.
|
|
32
|
+
*/
|
|
33
|
+
export declare const readConceptValue: (input: ConceptInput) => string;
|
|
34
|
+
//# sourceMappingURL=concept-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concept-input.d.ts","sourceRoot":"","sources":["../src/concept-input.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,GAAI,OAAO,MAAM,KAAG,MAA4C,CAAC;AAElG,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,GAAI,OAAO,MAAM,KAAG,MAA2B,CAAC;AAElF,MAAM,MAAM,YAAY,GAAG;IACzB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,OAAO,YAAY,KAAG,MAetD,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One place decides what a concept may be, because the service decides it once.
|
|
3
|
+
*
|
|
4
|
+
* `cleanText` in `workers/api/src/create/validation.ts` collapses every run of
|
|
5
|
+
* whitespace to a single space, trims, and then counts CODE POINTS. Over the
|
|
6
|
+
* limit is rejected with a 400; it is never truncated. Both `POST /api/v1/create`
|
|
7
|
+
* and the same route's `source: "build"` claim (what `12ui branch execute`
|
|
8
|
+
* calls) measure it that way, and the build claim spends a metered plan call
|
|
9
|
+
* the moment it is accepted.
|
|
10
|
+
*
|
|
11
|
+
* The CLI has to measure it identically in both directions. Counting the raw
|
|
12
|
+
* text would refuse a wrapped `--concept-file` the service would have taken,
|
|
13
|
+
* and not counting it at all is how `12ui create claim` used to put an
|
|
14
|
+
* over-length brief on the wire and learn the limit from a 400 (2026-08-12).
|
|
15
|
+
*/
|
|
16
|
+
export const MAX_CONCEPT_CHARACTERS = 600;
|
|
17
|
+
/** Exactly the service's normalization, so client and server count one string. */
|
|
18
|
+
export const normalizeConceptText = (value) => value.replace(/\s+/gu, ' ').trim();
|
|
19
|
+
/** Code points, not UTF-16 units: one emoji is one character to the service. */
|
|
20
|
+
export const conceptCharacterCount = (value) => [...value].length;
|
|
21
|
+
/**
|
|
22
|
+
* Normalize and measure before anything is sent. Returns the exact text the
|
|
23
|
+
* caller should submit, so what was measured is what goes on the wire.
|
|
24
|
+
*/
|
|
25
|
+
export const readConceptValue = (input) => {
|
|
26
|
+
const concept = normalizeConceptText(input.value);
|
|
27
|
+
if (!concept)
|
|
28
|
+
throw new Error(`${input.flag} must not be empty`);
|
|
29
|
+
const length = conceptCharacterCount(concept);
|
|
30
|
+
if (length <= MAX_CONCEPT_CHARACTERS)
|
|
31
|
+
return concept;
|
|
32
|
+
// The raw count is what the caller can see in their editor. Name the counted
|
|
33
|
+
// one when they differ, or the refusal looks like it is off by the newlines.
|
|
34
|
+
const measured = length === conceptCharacterCount(input.value)
|
|
35
|
+
? `${length} characters`
|
|
36
|
+
: `${length} characters once its whitespace collapses`;
|
|
37
|
+
throw new Error(`${input.flag} is ${measured}; the limit is ${MAX_CONCEPT_CHARACTERS}.`
|
|
38
|
+
+ ` Trim ${length - MAX_CONCEPT_CHARACTERS}. ${input.trimHint}`
|
|
39
|
+
+ ' Nothing was sent and nothing was bought.');
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=concept-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concept-input.js","sourceRoot":"","sources":["../src/concept-input.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAE1C,kFAAkF;AAClF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAElG,gFAAgF;AAChF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC;AAWlF;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAmB,EAAU,EAAE;IAC9D,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,oBAAoB,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,MAAM,IAAI,sBAAsB;QAAE,OAAO,OAAO,CAAC;IACrD,6EAA6E;IAC7E,6EAA6E;IAC7E,MAAM,QAAQ,GAAG,MAAM,KAAK,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC;QAC5D,CAAC,CAAC,GAAG,MAAM,aAAa;QACxB,CAAC,CAAC,GAAG,MAAM,2CAA2C,CAAC;IACzD,MAAM,IAAI,KAAK,CACb,GAAG,KAAK,CAAC,IAAI,OAAO,QAAQ,kBAAkB,sBAAsB,GAAG;UACrE,SAAS,MAAM,GAAG,sBAAsB,KAAK,KAAK,CAAC,QAAQ,EAAE;UAC7D,2CAA2C,CAC9C,CAAC;AACJ,CAAC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -14,5 +14,11 @@ export { BRANCH_WORKFLOW_REVISION, branchPackageKey, branchRedrawKey, branchRunK
|
|
|
14
14
|
export { type BranchCompletion, type BranchCompletionPage, type BranchCompletionScreen, } from './branch-run-record.js';
|
|
15
15
|
export { assertPackagePageWidths, buildConversionPackageRequest, submitConversionPackage, type PackagePageInput, type PackageSubmission, type PackageSubmissionResult, type PackageViewportInput, } from './package-submission.js';
|
|
16
16
|
export { startMcpServer, type McpServerOptions } from './server.js';
|
|
17
|
+
export { CliRefusal, isCliRefusal } from './cli-refusal.js';
|
|
18
|
+
/**
|
|
19
|
+
* The run journal, for whatever reads a workspace back: the parsing half is
|
|
20
|
+
* exported so a consumer never re-derives the schema from the file.
|
|
21
|
+
*/
|
|
22
|
+
export { RUN_JOURNAL_FILENAME, RUN_JOURNAL_MAX_LINE_BYTES, RUN_JOURNAL_VERSION, parseRunJournal, parseRunJournalLine, readRunJournal, runJournalPath, type RunJournalEntry, type RunJournalEventKind, type RunJournalLineResult, type RunJournalOutcome, type RunJournalReadResult, } from './run-journal.js';
|
|
17
23
|
export { CORPUS_IMAGE_SIZES, CORPUS_QUERY_IDEMPOTENCY_REVISION, INSPIRATION_MODES, MAX_CORPUS_REFERENCE_IMAGE_BYTES, TwelveUiCorpusClient, type CorpusAspect, type CorpusClientOptions, type CorpusImageSize, type CorpusInspirationItem, type CorpusInspirationRequest, type CorpusInspirationResponse, type CorpusQuality, type CorpusReference, type CorpusReferenceImageInput, type CorpusReferenceImageMediaType, type InspirationMode, type CorpusStatus, type CorpusTrack, } from './corpus-client.js';
|
|
18
24
|
//# sourceMappingURL=index.d.ts.map
|