@12ui/design 0.2.13 → 0.2.15
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 +35 -9
- package/dist/bounded-concurrency.d.ts +13 -0
- package/dist/bounded-concurrency.d.ts.map +1 -0
- package/dist/bounded-concurrency.js +43 -0
- package/dist/bounded-concurrency.js.map +1 -0
- package/dist/branch-client.d.ts +155 -0
- package/dist/branch-client.d.ts.map +1 -0
- package/dist/branch-client.js +179 -0
- package/dist/branch-client.js.map +1 -0
- package/dist/branch-completion.d.ts +37 -0
- package/dist/branch-completion.d.ts.map +1 -0
- package/dist/branch-completion.js +137 -0
- package/dist/branch-completion.js.map +1 -0
- package/dist/branch-dispatch-loop.d.ts +84 -0
- package/dist/branch-dispatch-loop.d.ts.map +1 -0
- package/dist/branch-dispatch-loop.js +206 -0
- package/dist/branch-dispatch-loop.js.map +1 -0
- package/dist/branch-downloads.d.ts +53 -0
- package/dist/branch-downloads.d.ts.map +1 -0
- package/dist/branch-downloads.js +114 -0
- package/dist/branch-downloads.js.map +1 -0
- package/dist/branch-execution-types.d.ts +54 -0
- package/dist/branch-execution-types.d.ts.map +1 -0
- package/dist/branch-execution-types.js +2 -0
- package/dist/branch-execution-types.js.map +1 -0
- package/dist/branch-execution.d.ts +20 -0
- package/dist/branch-execution.d.ts.map +1 -0
- package/dist/branch-execution.js +380 -0
- package/dist/branch-execution.js.map +1 -0
- package/dist/branch-identity.d.ts +71 -0
- package/dist/branch-identity.d.ts.map +1 -0
- package/dist/branch-identity.js +72 -0
- package/dist/branch-identity.js.map +1 -0
- package/dist/branch-materialize.d.ts +33 -0
- package/dist/branch-materialize.d.ts.map +1 -0
- package/dist/branch-materialize.js +64 -0
- package/dist/branch-materialize.js.map +1 -0
- package/dist/branch-page-conversion.d.ts +127 -0
- package/dist/branch-page-conversion.d.ts.map +1 -0
- package/dist/branch-page-conversion.js +382 -0
- package/dist/branch-page-conversion.js.map +1 -0
- package/dist/branch-plan.d.ts +63 -0
- package/dist/branch-plan.d.ts.map +1 -0
- package/dist/branch-plan.js +95 -0
- package/dist/branch-plan.js.map +1 -0
- package/dist/branch-progress.d.ts +99 -0
- package/dist/branch-progress.d.ts.map +1 -0
- package/dist/branch-progress.js +188 -0
- package/dist/branch-progress.js.map +1 -0
- package/dist/branch-run-record.d.ts +164 -0
- package/dist/branch-run-record.d.ts.map +1 -0
- package/dist/branch-run-record.js +94 -0
- package/dist/branch-run-record.js.map +1 -0
- package/dist/branch-schedule.d.ts +74 -0
- package/dist/branch-schedule.d.ts.map +1 -0
- package/dist/branch-schedule.js +130 -0
- package/dist/branch-schedule.js.map +1 -0
- package/dist/branch-status.d.ts +11 -0
- package/dist/branch-status.d.ts.map +1 -0
- package/dist/branch-status.js +118 -0
- package/dist/branch-status.js.map +1 -0
- package/dist/branch-viewport-normalization.d.ts +74 -0
- package/dist/branch-viewport-normalization.d.ts.map +1 -0
- package/dist/branch-viewport-normalization.js +120 -0
- package/dist/branch-viewport-normalization.js.map +1 -0
- package/dist/cli-arguments.d.ts.map +1 -1
- package/dist/cli-arguments.js +5 -0
- package/dist/cli-arguments.js.map +1 -1
- package/dist/cli-branch-command.d.ts +55 -0
- package/dist/cli-branch-command.d.ts.map +1 -0
- package/dist/cli-branch-command.js +475 -0
- package/dist/cli-branch-command.js.map +1 -0
- package/dist/cli-capabilities.d.ts +51 -0
- package/dist/cli-capabilities.d.ts.map +1 -1
- package/dist/cli-capabilities.js +52 -1
- package/dist/cli-capabilities.js.map +1 -1
- package/dist/cli-create-command.d.ts +21 -0
- package/dist/cli-create-command.d.ts.map +1 -0
- package/dist/cli-create-command.js +319 -0
- package/dist/cli-create-command.js.map +1 -0
- package/dist/cli-detach.d.ts +62 -0
- package/dist/cli-detach.d.ts.map +1 -0
- package/dist/cli-detach.js +123 -0
- package/dist/cli-detach.js.map +1 -0
- package/dist/cli-draft-command.d.ts +63 -0
- package/dist/cli-draft-command.d.ts.map +1 -0
- package/dist/cli-draft-command.js +220 -0
- package/dist/cli-draft-command.js.map +1 -0
- package/dist/cli-export-command.d.ts.map +1 -1
- package/dist/cli-export-command.js +2 -3
- package/dist/cli-export-command.js.map +1 -1
- package/dist/cli-image-batch-command.d.ts +21 -0
- package/dist/cli-image-batch-command.d.ts.map +1 -1
- package/dist/cli-image-batch-command.js +65 -4
- package/dist/cli-image-batch-command.js.map +1 -1
- package/dist/cli-image-batch-resume.d.ts +7 -0
- package/dist/cli-image-batch-resume.d.ts.map +1 -1
- package/dist/cli-image-batch-resume.js +19 -2
- package/dist/cli-image-batch-resume.js.map +1 -1
- package/dist/cli-package-command.d.ts +29 -0
- package/dist/cli-package-command.d.ts.map +1 -0
- package/dist/cli-package-command.js +128 -0
- package/dist/cli-package-command.js.map +1 -0
- package/dist/cli-progress.d.ts +137 -0
- package/dist/cli-progress.d.ts.map +1 -1
- package/dist/cli-progress.js +156 -0
- package/dist/cli-progress.js.map +1 -1
- package/dist/cli-select-command.d.ts +12 -0
- package/dist/cli-select-command.d.ts.map +1 -0
- package/dist/cli-select-command.js +66 -0
- package/dist/cli-select-command.js.map +1 -0
- package/dist/cli.js +150 -7
- package/dist/cli.js.map +1 -1
- package/dist/conversion-receipt.d.ts +127 -0
- package/dist/conversion-receipt.d.ts.map +1 -0
- package/dist/conversion-receipt.js +184 -0
- package/dist/conversion-receipt.js.map +1 -0
- package/dist/create-identity.d.ts +25 -0
- package/dist/create-identity.d.ts.map +1 -0
- package/dist/create-identity.js +0 -0
- package/dist/create-identity.js.map +1 -0
- package/dist/draft-identity.d.ts +30 -0
- package/dist/draft-identity.d.ts.map +1 -0
- package/dist/draft-identity.js +0 -0
- package/dist/draft-identity.js.map +1 -0
- package/dist/draft-prompts.d.ts +35 -0
- package/dist/draft-prompts.d.ts.map +1 -0
- package/dist/draft-prompts.js +51 -0
- package/dist/draft-prompts.js.map +1 -0
- package/dist/draft-run.d.ts +32 -0
- package/dist/draft-run.d.ts.map +1 -0
- package/dist/draft-run.js +152 -0
- package/dist/draft-run.js.map +1 -0
- package/dist/draft-workspace.d.ts +90 -0
- package/dist/draft-workspace.d.ts.map +1 -0
- package/dist/draft-workspace.js +64 -0
- package/dist/draft-workspace.js.map +1 -0
- package/dist/image-batch-status.d.ts +42 -0
- package/dist/image-batch-status.d.ts.map +1 -0
- package/dist/image-batch-status.js +142 -0
- package/dist/image-batch-status.js.map +1 -0
- package/dist/image-dimensions.d.ts +12 -0
- package/dist/image-dimensions.d.ts.map +1 -0
- package/dist/image-dimensions.js +14 -0
- package/dist/image-dimensions.js.map +1 -0
- package/dist/image-generation-resume.d.ts +13 -0
- package/dist/image-generation-resume.d.ts.map +1 -1
- package/dist/image-generation-resume.js +13 -0
- package/dist/image-generation-resume.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/legacy-skill-catalog.d.ts.map +1 -1
- package/dist/legacy-skill-catalog.js +140 -0
- package/dist/legacy-skill-catalog.js.map +1 -1
- package/dist/package-client.d.ts +28 -0
- package/dist/package-client.d.ts.map +1 -1
- package/dist/package-client.js +21 -1
- package/dist/package-client.js.map +1 -1
- package/dist/package-manifest-file.d.ts +21 -0
- package/dist/package-manifest-file.d.ts.map +1 -0
- package/dist/package-manifest-file.js +119 -0
- package/dist/package-manifest-file.js.map +1 -0
- package/dist/package-manifest-template.d.ts +23 -0
- package/dist/package-manifest-template.d.ts.map +1 -0
- package/dist/package-manifest-template.js +60 -0
- package/dist/package-manifest-template.js.map +1 -0
- package/dist/package-source-refusal.d.ts +17 -0
- package/dist/package-source-refusal.d.ts.map +1 -0
- package/dist/package-source-refusal.js +61 -0
- package/dist/package-source-refusal.js.map +1 -0
- package/dist/package-submission.d.ts +134 -0
- package/dist/package-submission.d.ts.map +1 -0
- package/dist/package-submission.js +196 -0
- package/dist/package-submission.js.map +1 -0
- package/dist/selection-record.d.ts +95 -0
- package/dist/selection-record.d.ts.map +1 -0
- package/dist/selection-record.js +121 -0
- package/dist/selection-record.js.map +1 -0
- package/package.json +1 -1
- package/skills/design/SKILL.md +43 -266
- package/skills/design-branch/SKILL.md +37 -116
- package/skills/design-convert/SKILL.md +62 -148
- package/skills/design-draft/SKILL.md +71 -135
- package/skills/design-search/SKILL.md +29 -78
- package/skills/design/references/continuation-contract.md +0 -60
- package/skills/design/references/selection-contract.md +0 -112
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { stat } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { booleanFlag, stringFlag } from './cli-arguments.js';
|
|
4
|
+
import { readConversionConfig } from './config.js';
|
|
5
|
+
import { conversionPackageKey } from './branch-identity.js';
|
|
6
|
+
import { normalizeOptionalIdempotencyKey } from './idempotency-key.js';
|
|
7
|
+
import { TwelveUiConversionPackageClient } from './package-client.js';
|
|
8
|
+
import { readLocalPackageManifest } from './package-manifest-file.js';
|
|
9
|
+
import { PACKAGE_MANIFEST_TEMPLATE_NOTES, renderPackageManifestTemplate, } from './package-manifest-template.js';
|
|
10
|
+
import { PACKAGE_RESULT_FILENAME, submitConversionPackage, writePackageResultRecord, } from './package-submission.js';
|
|
11
|
+
import { createPackageProgressReporter, formatDuration, nextActionLine, } from './cli-progress.js';
|
|
12
|
+
/**
|
|
13
|
+
* `12ui convert package` — the ordered-viewport submission that had no CLI at
|
|
14
|
+
* all. Without it the terminal step of the branch path was the least supported
|
|
15
|
+
* operation in the product, and an agent that got that far fell back to
|
|
16
|
+
* per-image conversion, losing page order and stitching.
|
|
17
|
+
*/
|
|
18
|
+
export const PACKAGE_USAGE = 'Usage: 12ui convert package --manifest <package.json>'
|
|
19
|
+
+ ' --out-dir <directory> [--idempotency-key <key>] [--timeout-ms <ms>] [--wait] [--quiet]'
|
|
20
|
+
+ '\n 12ui convert package --template > package.json';
|
|
21
|
+
/** A multi-viewport page converts its viewports in parallel, then composes. */
|
|
22
|
+
export const PACKAGE_DURATION_SECONDS = 360;
|
|
23
|
+
const parseTimeoutMs = (value) => {
|
|
24
|
+
if (value === undefined)
|
|
25
|
+
return undefined;
|
|
26
|
+
const timeoutMs = Number(value);
|
|
27
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs < 1_000) {
|
|
28
|
+
throw new Error('--timeout-ms must be a number of at least 1000');
|
|
29
|
+
}
|
|
30
|
+
return Math.floor(timeoutMs);
|
|
31
|
+
};
|
|
32
|
+
const refuseExistingResult = async (outDir) => {
|
|
33
|
+
const existing = path.join(outDir, PACKAGE_RESULT_FILENAME);
|
|
34
|
+
try {
|
|
35
|
+
await stat(existing);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
if (error.code === 'ENOENT')
|
|
39
|
+
return;
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
throw new Error(`A package result already exists at ${existing}. It names the package id and every page's`
|
|
43
|
+
+ ' conversion id — read it back rather than submitting the same pages again, or choose a'
|
|
44
|
+
+ ' new --out-dir if you genuinely want another package.');
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* `12ui convert package --template` prints the starting manifest and returns
|
|
48
|
+
* before any config read or network call, so it works with no credentials.
|
|
49
|
+
* Guidance goes to stderr and only the JSON reaches stdout, which is what makes
|
|
50
|
+
* `--template > package.json` write a file that parses.
|
|
51
|
+
*
|
|
52
|
+
* Returns false when the caller did not ask for the template, so the dispatcher
|
|
53
|
+
* falls through to the real submission. This lives beside the command rather
|
|
54
|
+
* than inline in the dispatcher so the argv path is reachable from a test.
|
|
55
|
+
*/
|
|
56
|
+
export const runPackageTemplateCommand = (flags) => {
|
|
57
|
+
if (!booleanFlag(flags, 'template'))
|
|
58
|
+
return false;
|
|
59
|
+
process.stderr.write(`${PACKAGE_MANIFEST_TEMPLATE_NOTES}\n`);
|
|
60
|
+
process.stdout.write(renderPackageManifestTemplate());
|
|
61
|
+
return true;
|
|
62
|
+
};
|
|
63
|
+
export const runPackageCommand = async (flags, dependencies = {}) => {
|
|
64
|
+
const manifestFlag = stringFlag(flags, 'manifest')?.trim();
|
|
65
|
+
const outDirFlag = stringFlag(flags, 'out-dir')?.trim();
|
|
66
|
+
if (!manifestFlag || !outDirFlag)
|
|
67
|
+
throw new Error(PACKAGE_USAGE);
|
|
68
|
+
const manifestPath = path.resolve(manifestFlag);
|
|
69
|
+
const outDir = path.resolve(outDirFlag);
|
|
70
|
+
const quiet = booleanFlag(flags, 'quiet');
|
|
71
|
+
await refuseExistingResult(outDir);
|
|
72
|
+
const manifest = await readLocalPackageManifest(manifestPath);
|
|
73
|
+
const idempotencyKey = normalizeOptionalIdempotencyKey(stringFlag(flags, 'idempotency-key'), '--idempotency-key') ?? conversionPackageKey({
|
|
74
|
+
manifestSha256: manifest.manifestSha256,
|
|
75
|
+
output: manifest.output,
|
|
76
|
+
});
|
|
77
|
+
const config = (dependencies.readConfig ?? readConversionConfig)({
|
|
78
|
+
origin: stringFlag(flags, 'origin'),
|
|
79
|
+
apiKey: stringFlag(flags, 'api-key'),
|
|
80
|
+
});
|
|
81
|
+
const client = (dependencies.createClient ?? ((value) => (new TwelveUiConversionPackageClient(value))))(config);
|
|
82
|
+
const viewportCount = manifest.pages.reduce((total, page) => total + page.viewports.length, 0);
|
|
83
|
+
if (!quiet) {
|
|
84
|
+
process.stderr.write(`12ui convert package — ${manifest.pages.length} page(s), ${viewportCount} viewport(s)`
|
|
85
|
+
+ ` to ${manifest.output}; expect about ${formatDuration(PACKAGE_DURATION_SECONDS)}\n`);
|
|
86
|
+
}
|
|
87
|
+
const startedAt = Date.now();
|
|
88
|
+
const reportProgress = createPackageProgressReporter({
|
|
89
|
+
write: (line) => { process.stderr.write(`${line}\n`); },
|
|
90
|
+
elapsed: () => formatDuration((Date.now() - startedAt) / 1000),
|
|
91
|
+
});
|
|
92
|
+
const result = await submitConversionPackage({
|
|
93
|
+
client,
|
|
94
|
+
outDir,
|
|
95
|
+
submission: {
|
|
96
|
+
output: manifest.output,
|
|
97
|
+
...(manifest.model ? { model: manifest.model } : {}),
|
|
98
|
+
...(manifest.responsiveQuality ? { responsiveQuality: manifest.responsiveQuality } : {}),
|
|
99
|
+
pages: manifest.pages,
|
|
100
|
+
idempotencyKey,
|
|
101
|
+
},
|
|
102
|
+
...(parseTimeoutMs(stringFlag(flags, 'timeout-ms')) === undefined
|
|
103
|
+
? {}
|
|
104
|
+
: { timeoutMs: parseTimeoutMs(stringFlag(flags, 'timeout-ms')) }),
|
|
105
|
+
onSubmitted: quiet
|
|
106
|
+
? undefined
|
|
107
|
+
: (packageId) => {
|
|
108
|
+
process.stderr.write(`12ui convert package ${packageId} submitted.\n${nextActionLine({
|
|
109
|
+
what: 'A multi-viewport page conversion',
|
|
110
|
+
typicalSeconds: PACKAGE_DURATION_SECONDS,
|
|
111
|
+
statusCommand: `GET /api/v1/convert/package/${packageId}`,
|
|
112
|
+
waitHint: 'or leave this command running, which is what --wait already does by default',
|
|
113
|
+
})}\n`);
|
|
114
|
+
},
|
|
115
|
+
onProgress: quiet ? undefined : (event) => { reportProgress(undefined, event); },
|
|
116
|
+
});
|
|
117
|
+
const resultPath = await writePackageResultRecord(outDir, result);
|
|
118
|
+
const reported = { ...result, resultPath };
|
|
119
|
+
console.log(JSON.stringify({ manifestPath, outDir, ...reported }, null, 2));
|
|
120
|
+
const failed = reported.pages.filter((page) => page.status === 'failed');
|
|
121
|
+
if (failed.length > 0) {
|
|
122
|
+
throw new Error(`Package ${reported.packageId} converted ${reported.pages.length - failed.length} of`
|
|
123
|
+
+ ` ${reported.pages.length} page(s). Failed: ${failed.map((page) => page.id).join(', ')}.`
|
|
124
|
+
+ ` Evidence: ${resultPath}`);
|
|
125
|
+
}
|
|
126
|
+
return reported;
|
|
127
|
+
};
|
|
128
|
+
//# sourceMappingURL=cli-package-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-package-command.js","sourceRoot":"","sources":["../src/cli-package-command.ts"],"names":[],"mappings":"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"}
|
package/dist/cli-progress.d.ts
CHANGED
|
@@ -20,9 +20,146 @@ export declare const CONVERSION_DURATION_HINTS: {
|
|
|
20
20
|
readonly fused: 300;
|
|
21
21
|
};
|
|
22
22
|
export type ConversionDurationHintKind = keyof typeof CONVERSION_DURATION_HINTS;
|
|
23
|
+
/**
|
|
24
|
+
* Every long operation's typical wall time, in one place, so a status line, a
|
|
25
|
+
* skill sentence, and a capability document can never quote three different
|
|
26
|
+
* numbers for the same wait.
|
|
27
|
+
*/
|
|
28
|
+
export declare const OPERATION_DURATION_HINTS: {
|
|
29
|
+
/** One generated candidate from the local image provider. */
|
|
30
|
+
readonly imageCandidate: 90;
|
|
31
|
+
/** Four candidates, started concurrently. */
|
|
32
|
+
readonly imageBatch: 90;
|
|
33
|
+
/** The build claim: the planner runs inline and buys no image. */
|
|
34
|
+
readonly branchClaim: 15;
|
|
35
|
+
/** One branch screen. The server's own provider budget is 150 s. */
|
|
36
|
+
readonly branchScreen: 90;
|
|
37
|
+
readonly branchScreenBudget: 150;
|
|
38
|
+
/**
|
|
39
|
+
* The screen-generation phase of a whole run. Viewport chains run in parallel
|
|
40
|
+
* across pages, so it tracks the depth of ONE page's chain rather than the
|
|
41
|
+
* screen count: measured median 3m22 over 49 four-page runs.
|
|
42
|
+
*/
|
|
43
|
+
readonly branchScreenPhase: 202;
|
|
44
|
+
/** One branch page as one package. Measured median 2m10 over the same runs. */
|
|
45
|
+
readonly branchPackage: 130;
|
|
46
|
+
/** Downloads, the sentinel, and the final records. */
|
|
47
|
+
readonly branchFinalize: 15;
|
|
48
|
+
/**
|
|
49
|
+
* Whole runs, derived from the phases above by `branchRunEstimateSeconds` at
|
|
50
|
+
* the default page concurrency: one page for `--scope page`, four for
|
|
51
|
+
* `--scope site`. A test holds them to that derivation.
|
|
52
|
+
*/
|
|
53
|
+
readonly branchPage: 362;
|
|
54
|
+
readonly branchSite: 492;
|
|
55
|
+
/** One `12ui convert package` submission, whose page count is not known here. */
|
|
56
|
+
readonly package: 360;
|
|
57
|
+
/** image -> LayerDoc. Extraction plus materialization. */
|
|
58
|
+
readonly convert: 240;
|
|
59
|
+
/** A responsive HTML export run on its own, after the conversion finished. */
|
|
60
|
+
readonly export: 240;
|
|
61
|
+
/**
|
|
62
|
+
* Fused convert + export. The export's reference and anchor conversions run
|
|
63
|
+
* alongside the conversion, so the bundle costs about the slower half plus
|
|
64
|
+
* assembly rather than the sum of both.
|
|
65
|
+
*/
|
|
66
|
+
readonly fused: 300;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Three pages convert at a time. Each holds two or three viewport children on
|
|
70
|
+
* the server, so three pages sit just under the account's ~10 active
|
|
71
|
+
* conversions: a brief queue at the admission boundary is visible in the
|
|
72
|
+
* package's own published progress rather than looking like a stall. It lives
|
|
73
|
+
* beside the duration hints because the run estimate is a function of it.
|
|
74
|
+
*/
|
|
75
|
+
export declare const BRANCH_PAGE_CONCURRENCY_DEFAULT = 3;
|
|
76
|
+
/**
|
|
77
|
+
* A whole branch run, decomposed rather than guessed: the claim, the screen
|
|
78
|
+
* phase, the page conversions — which run `concurrency` at a time and start as
|
|
79
|
+
* each page's own screens land — and the records at the end.
|
|
80
|
+
*
|
|
81
|
+
* The floor is the run whose conversions all overlap generation except the last
|
|
82
|
+
* one; the ceiling is the run where none of them do. Quoting the pair is what
|
|
83
|
+
* keeps a caller from reading the slower half of a normal distribution as a
|
|
84
|
+
* stall.
|
|
85
|
+
*/
|
|
86
|
+
export declare const branchRunEstimateSeconds: (args: {
|
|
87
|
+
pages: number;
|
|
88
|
+
concurrency: number;
|
|
89
|
+
/** A run that stops at downloaded PNGs converts nothing. */
|
|
90
|
+
convert?: boolean;
|
|
91
|
+
}) => {
|
|
92
|
+
floor: number;
|
|
93
|
+
ceiling: number;
|
|
94
|
+
};
|
|
95
|
+
/** What `--scope site` plans in practice, for an estimate made before the plan. */
|
|
96
|
+
export declare const BRANCH_TYPICAL_SITE_PAGES = 4;
|
|
97
|
+
export type OperationDurationHintKind = keyof typeof OPERATION_DURATION_HINTS;
|
|
23
98
|
export declare const formatDuration: (seconds: number) => string;
|
|
24
99
|
export declare const durationHint: (kind: ConversionDurationHintKind) => string;
|
|
100
|
+
/**
|
|
101
|
+
* `45s elapsed, ~90s typical`. A bare elapsed time reads as a stall; the pair
|
|
102
|
+
* is what tells a caller the wait is still inside the expected envelope.
|
|
103
|
+
*/
|
|
104
|
+
export declare const elapsedAgainstTypical: (elapsedSeconds: number, typicalSeconds: number) => string;
|
|
105
|
+
/**
|
|
106
|
+
* THE mandatory closing line of any output that is not yet terminal.
|
|
107
|
+
*
|
|
108
|
+
* A poll surface that answers with bare absence is what makes a model conclude
|
|
109
|
+
* the process stalled and improvise around it. Every not-yet-done response ends
|
|
110
|
+
* by naming the typical duration, the exact command that narrates progress, and
|
|
111
|
+
* the blocking alternative — so the caller can sleep, schedule, or block
|
|
112
|
+
* according to what it can actually do.
|
|
113
|
+
*/
|
|
114
|
+
export declare const nextActionLine: (args: {
|
|
115
|
+
what: string;
|
|
116
|
+
typicalSeconds: number;
|
|
117
|
+
statusCommand: string;
|
|
118
|
+
checkAgainSeconds?: number;
|
|
119
|
+
waitHint?: string;
|
|
120
|
+
}) => string;
|
|
121
|
+
/** `3 complete, 2 generating, 4 waiting, 0 blocked` — zeros included on purpose. */
|
|
122
|
+
export declare const narrateCounts: (counts: readonly {
|
|
123
|
+
label: string;
|
|
124
|
+
count: number;
|
|
125
|
+
detail?: string;
|
|
126
|
+
}[]) => string;
|
|
127
|
+
export declare const secondsSince: (iso: string | undefined, now: number) => number | undefined;
|
|
25
128
|
export declare const stageLabel: (stage: string) => string;
|
|
129
|
+
export type PackageStageProgress = {
|
|
130
|
+
stage: string;
|
|
131
|
+
percent?: number;
|
|
132
|
+
completed?: number;
|
|
133
|
+
total?: number;
|
|
134
|
+
running?: number;
|
|
135
|
+
stageSince?: string;
|
|
136
|
+
pagesAvailable?: number;
|
|
137
|
+
};
|
|
138
|
+
/**
|
|
139
|
+
* `converting viewports 32% — 1 of 3 viewports, 2 running, 1m 20s in stage`.
|
|
140
|
+
*
|
|
141
|
+
* A percent alone is the number that stalls: a phase whose children each take
|
|
142
|
+
* minutes reports the same figure for minutes, and an agent polling it decides
|
|
143
|
+
* the run is wedged. The counts and the time in phase are facts that keep
|
|
144
|
+
* advancing while the percent does not. Every one of them is optional, because
|
|
145
|
+
* a server that predates them answers without them and a renderer that demanded
|
|
146
|
+
* them would print nothing at all.
|
|
147
|
+
*/
|
|
148
|
+
export declare const packageProgressLine: (progress: PackageStageProgress, now?: number) => string;
|
|
149
|
+
/**
|
|
150
|
+
* One writer for every package progress line, deduplicated per page.
|
|
151
|
+
*
|
|
152
|
+
* The poll revalidates every few seconds and mostly sees the same facts;
|
|
153
|
+
* repeating an unchanged line is how a stream stops reading as motion. When the
|
|
154
|
+
* server publishes its time in phase the line advances on its own, which is the
|
|
155
|
+
* point — a percent that has not moved is exactly when a caller needs to see
|
|
156
|
+
* that something still is.
|
|
157
|
+
*/
|
|
158
|
+
export declare const createPackageProgressReporter: (args: {
|
|
159
|
+
write: (line: string) => void;
|
|
160
|
+
elapsed: () => string;
|
|
161
|
+
now?: () => number;
|
|
162
|
+
}) => ((pageId: string | undefined, progress: PackageStageProgress) => void);
|
|
26
163
|
export type ProgressReporter = {
|
|
27
164
|
onProgress: (operation: ConversionOperation) => void;
|
|
28
165
|
/** Final line for a finished operation. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-progress.d.ts","sourceRoot":"","sources":["../src/cli-progress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB;IACpC,0DAA0D;;IAE1D,8EAA8E;;IAE9E;;;;OAIG;;CAEK,CAAC;AAEX,MAAM,MAAM,0BAA0B,GAAG,MAAM,OAAO,yBAAyB,CAAC;AAEhF,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,KAAG,MAMhD,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,MAAM,0BAA0B,KAAG,MAE/D,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-progress.d.ts","sourceRoot":"","sources":["../src/cli-progress.ts"],"names":[],"mappings":"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"}
|
package/dist/cli-progress.js
CHANGED
|
@@ -18,6 +18,74 @@ export const CONVERSION_DURATION_HINTS = {
|
|
|
18
18
|
*/
|
|
19
19
|
fused: 300,
|
|
20
20
|
};
|
|
21
|
+
/**
|
|
22
|
+
* Every long operation's typical wall time, in one place, so a status line, a
|
|
23
|
+
* skill sentence, and a capability document can never quote three different
|
|
24
|
+
* numbers for the same wait.
|
|
25
|
+
*/
|
|
26
|
+
export const OPERATION_DURATION_HINTS = {
|
|
27
|
+
...CONVERSION_DURATION_HINTS,
|
|
28
|
+
/** One generated candidate from the local image provider. */
|
|
29
|
+
imageCandidate: 90,
|
|
30
|
+
/** Four candidates, started concurrently. */
|
|
31
|
+
imageBatch: 90,
|
|
32
|
+
/** The build claim: the planner runs inline and buys no image. */
|
|
33
|
+
branchClaim: 15,
|
|
34
|
+
/** One branch screen. The server's own provider budget is 150 s. */
|
|
35
|
+
branchScreen: 90,
|
|
36
|
+
branchScreenBudget: 150,
|
|
37
|
+
/**
|
|
38
|
+
* The screen-generation phase of a whole run. Viewport chains run in parallel
|
|
39
|
+
* across pages, so it tracks the depth of ONE page's chain rather than the
|
|
40
|
+
* screen count: measured median 3m22 over 49 four-page runs.
|
|
41
|
+
*/
|
|
42
|
+
branchScreenPhase: 202,
|
|
43
|
+
/** One branch page as one package. Measured median 2m10 over the same runs. */
|
|
44
|
+
branchPackage: 130,
|
|
45
|
+
/** Downloads, the sentinel, and the final records. */
|
|
46
|
+
branchFinalize: 15,
|
|
47
|
+
/**
|
|
48
|
+
* Whole runs, derived from the phases above by `branchRunEstimateSeconds` at
|
|
49
|
+
* the default page concurrency: one page for `--scope page`, four for
|
|
50
|
+
* `--scope site`. A test holds them to that derivation.
|
|
51
|
+
*/
|
|
52
|
+
branchPage: 362,
|
|
53
|
+
branchSite: 492,
|
|
54
|
+
/** One `12ui convert package` submission, whose page count is not known here. */
|
|
55
|
+
package: 360,
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Three pages convert at a time. Each holds two or three viewport children on
|
|
59
|
+
* the server, so three pages sit just under the account's ~10 active
|
|
60
|
+
* conversions: a brief queue at the admission boundary is visible in the
|
|
61
|
+
* package's own published progress rather than looking like a stall. It lives
|
|
62
|
+
* beside the duration hints because the run estimate is a function of it.
|
|
63
|
+
*/
|
|
64
|
+
export const BRANCH_PAGE_CONCURRENCY_DEFAULT = 3;
|
|
65
|
+
/**
|
|
66
|
+
* A whole branch run, decomposed rather than guessed: the claim, the screen
|
|
67
|
+
* phase, the page conversions — which run `concurrency` at a time and start as
|
|
68
|
+
* each page's own screens land — and the records at the end.
|
|
69
|
+
*
|
|
70
|
+
* The floor is the run whose conversions all overlap generation except the last
|
|
71
|
+
* one; the ceiling is the run where none of them do. Quoting the pair is what
|
|
72
|
+
* keeps a caller from reading the slower half of a normal distribution as a
|
|
73
|
+
* stall.
|
|
74
|
+
*/
|
|
75
|
+
export const branchRunEstimateSeconds = (args) => {
|
|
76
|
+
const base = OPERATION_DURATION_HINTS.branchClaim
|
|
77
|
+
+ OPERATION_DURATION_HINTS.branchScreenPhase
|
|
78
|
+
+ OPERATION_DURATION_HINTS.branchFinalize;
|
|
79
|
+
if (args.convert === false)
|
|
80
|
+
return { floor: base, ceiling: base };
|
|
81
|
+
const waves = Math.max(1, Math.ceil(Math.max(1, args.pages) / Math.max(1, args.concurrency)));
|
|
82
|
+
return {
|
|
83
|
+
floor: base + OPERATION_DURATION_HINTS.branchPackage,
|
|
84
|
+
ceiling: base + waves * OPERATION_DURATION_HINTS.branchPackage,
|
|
85
|
+
};
|
|
86
|
+
};
|
|
87
|
+
/** What `--scope site` plans in practice, for an estimate made before the plan. */
|
|
88
|
+
export const BRANCH_TYPICAL_SITE_PAGES = 4;
|
|
21
89
|
export const formatDuration = (seconds) => {
|
|
22
90
|
const whole = Math.max(0, Math.round(seconds));
|
|
23
91
|
if (whole < 90)
|
|
@@ -27,6 +95,36 @@ export const formatDuration = (seconds) => {
|
|
|
27
95
|
return rest === 0 ? `${minutes}m` : `${minutes}m ${rest}s`;
|
|
28
96
|
};
|
|
29
97
|
export const durationHint = (kind) => (`expect about ${formatDuration(CONVERSION_DURATION_HINTS[kind])}`);
|
|
98
|
+
/**
|
|
99
|
+
* `45s elapsed, ~90s typical`. A bare elapsed time reads as a stall; the pair
|
|
100
|
+
* is what tells a caller the wait is still inside the expected envelope.
|
|
101
|
+
*/
|
|
102
|
+
export const elapsedAgainstTypical = (elapsedSeconds, typicalSeconds) => (`${formatDuration(elapsedSeconds)} elapsed, ~${formatDuration(typicalSeconds)} typical`);
|
|
103
|
+
/**
|
|
104
|
+
* THE mandatory closing line of any output that is not yet terminal.
|
|
105
|
+
*
|
|
106
|
+
* A poll surface that answers with bare absence is what makes a model conclude
|
|
107
|
+
* the process stalled and improvise around it. Every not-yet-done response ends
|
|
108
|
+
* by naming the typical duration, the exact command that narrates progress, and
|
|
109
|
+
* the blocking alternative — so the caller can sleep, schedule, or block
|
|
110
|
+
* according to what it can actually do.
|
|
111
|
+
*/
|
|
112
|
+
export const nextActionLine = (args) => {
|
|
113
|
+
const checkAgain = formatDuration(args.checkAgainSeconds ?? Math.max(30, Math.round(args.typicalSeconds / 3)));
|
|
114
|
+
const wait = args.waitHint ?? 'or re-run the command with --wait to block until it finishes';
|
|
115
|
+
return `${args.what} typically takes about ${formatDuration(args.typicalSeconds)}.`
|
|
116
|
+
+ ` Check again in ${checkAgain} with \`${args.statusCommand}\`, ${wait}.`;
|
|
117
|
+
};
|
|
118
|
+
/** `3 complete, 2 generating, 4 waiting, 0 blocked` — zeros included on purpose. */
|
|
119
|
+
export const narrateCounts = (counts) => counts
|
|
120
|
+
.map((entry) => `${entry.count} ${entry.label}${entry.detail ? ` (${entry.detail})` : ''}`)
|
|
121
|
+
.join(', ');
|
|
122
|
+
export const secondsSince = (iso, now) => {
|
|
123
|
+
if (!iso)
|
|
124
|
+
return undefined;
|
|
125
|
+
const started = Date.parse(iso);
|
|
126
|
+
return Number.isFinite(started) ? Math.max(0, (now - started) / 1000) : undefined;
|
|
127
|
+
};
|
|
30
128
|
/** Human-readable name for a pipeline stage, for progress lines. */
|
|
31
129
|
const STAGE_LABELS = {
|
|
32
130
|
queued: 'queued',
|
|
@@ -45,8 +143,66 @@ const STAGE_LABELS = {
|
|
|
45
143
|
static_export: 'rendering export',
|
|
46
144
|
project_export: 'building project',
|
|
47
145
|
publish: 'publishing',
|
|
146
|
+
// The package coordinator's own phases.
|
|
147
|
+
convert_viewports: 'converting viewports',
|
|
148
|
+
compose_pages: 'composing pages',
|
|
149
|
+
export_pages: 'exporting pages',
|
|
48
150
|
};
|
|
49
151
|
export const stageLabel = (stage) => STAGE_LABELS[stage] ?? stage;
|
|
152
|
+
/** What the current package phase counts. */
|
|
153
|
+
const STAGE_UNITS = {
|
|
154
|
+
convert_viewports: 'viewport',
|
|
155
|
+
compose_pages: 'page',
|
|
156
|
+
export_pages: 'page',
|
|
157
|
+
publish: 'page',
|
|
158
|
+
};
|
|
159
|
+
/**
|
|
160
|
+
* `converting viewports 32% — 1 of 3 viewports, 2 running, 1m 20s in stage`.
|
|
161
|
+
*
|
|
162
|
+
* A percent alone is the number that stalls: a phase whose children each take
|
|
163
|
+
* minutes reports the same figure for minutes, and an agent polling it decides
|
|
164
|
+
* the run is wedged. The counts and the time in phase are facts that keep
|
|
165
|
+
* advancing while the percent does not. Every one of them is optional, because
|
|
166
|
+
* a server that predates them answers without them and a renderer that demanded
|
|
167
|
+
* them would print nothing at all.
|
|
168
|
+
*/
|
|
169
|
+
export const packageProgressLine = (progress, now = Date.now()) => {
|
|
170
|
+
const head = progress.percent === undefined
|
|
171
|
+
? stageLabel(progress.stage)
|
|
172
|
+
: `${stageLabel(progress.stage)} ${progress.percent}%`;
|
|
173
|
+
const unit = STAGE_UNITS[progress.stage];
|
|
174
|
+
const facts = [];
|
|
175
|
+
if (progress.total !== undefined) {
|
|
176
|
+
facts.push(`${progress.completed ?? 0} of ${progress.total}${unit ? ` ${unit}${progress.total === 1 ? '' : 's'}` : ''}`);
|
|
177
|
+
}
|
|
178
|
+
if (progress.running !== undefined)
|
|
179
|
+
facts.push(`${progress.running} running`);
|
|
180
|
+
const inStage = secondsSince(progress.stageSince, now);
|
|
181
|
+
if (inStage !== undefined)
|
|
182
|
+
facts.push(`${formatDuration(inStage)} in stage`);
|
|
183
|
+
if (progress.pagesAvailable)
|
|
184
|
+
facts.push(`${progress.pagesAvailable} page(s) ready`);
|
|
185
|
+
return facts.length === 0 ? head : `${head} — ${facts.join(', ')}`;
|
|
186
|
+
};
|
|
187
|
+
/**
|
|
188
|
+
* One writer for every package progress line, deduplicated per page.
|
|
189
|
+
*
|
|
190
|
+
* The poll revalidates every few seconds and mostly sees the same facts;
|
|
191
|
+
* repeating an unchanged line is how a stream stops reading as motion. When the
|
|
192
|
+
* server publishes its time in phase the line advances on its own, which is the
|
|
193
|
+
* point — a percent that has not moved is exactly when a caller needs to see
|
|
194
|
+
* that something still is.
|
|
195
|
+
*/
|
|
196
|
+
export const createPackageProgressReporter = (args) => {
|
|
197
|
+
const last = new Map();
|
|
198
|
+
return (pageId, progress) => {
|
|
199
|
+
const line = packageProgressLine(progress, (args.now ?? Date.now)());
|
|
200
|
+
if (last.get(pageId ?? '') === line)
|
|
201
|
+
return;
|
|
202
|
+
last.set(pageId ?? '', line);
|
|
203
|
+
args.write(`[${args.elapsed()}] package${pageId ? ` ${pageId}` : ''}: ${line}`);
|
|
204
|
+
};
|
|
205
|
+
};
|
|
50
206
|
/**
|
|
51
207
|
* Streams stage progress to stderr, one line per distinct stage/percent.
|
|
52
208
|
*
|
package/dist/cli-progress.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-progress.js","sourceRoot":"","sources":["../src/cli-progress.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,0DAA0D;IAC1D,OAAO,EAAE,GAAG;IACZ,8EAA8E;IAC9E,MAAM,EAAE,GAAG;IACX;;;;OAIG;IACH,KAAK,EAAE,GAAG;CACF,CAAC;AAIX,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAe,EAAU,EAAE;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,GAAG,KAAK,GAAG,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;IACxB,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,IAAI,GAAG,CAAC;AAC7D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAgC,EAAU,EAAE,CAAC,CACxE,gBAAgB,cAAc,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,EAAE,CAClE,CAAC;AAEF,oEAAoE;AACpE,MAAM,YAAY,GAA2B;IAC3C,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,WAAW;IACpB,kBAAkB,EAAE,mBAAmB;IACvC,WAAW,EAAE,sBAAsB;IACnC,wEAAwE;IACxE,oEAAoE;IACpE,iBAAiB,EAAE,mBAAmB;IACtC,oBAAoB,EAAE,sBAAsB;IAC5C,YAAY,EAAE,uBAAuB;IACrC,IAAI,EAAE,eAAe;IACrB,oBAAoB,EAAE,kCAAkC;IACxD,kBAAkB,EAAE,+BAA+B;IACnD,kBAAkB,EAAE,eAAe;IACnC,aAAa,EAAE,kBAAkB;IACjC,cAAc,EAAE,kBAAkB;IAClC,OAAO,EAAE,YAAY;
|
|
1
|
+
{"version":3,"file":"cli-progress.js","sourceRoot":"","sources":["../src/cli-progress.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,0DAA0D;IAC1D,OAAO,EAAE,GAAG;IACZ,8EAA8E;IAC9E,MAAM,EAAE,GAAG;IACX;;;;OAIG;IACH,KAAK,EAAE,GAAG;CACF,CAAC;AAIX;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,GAAG,yBAAyB;IAC5B,6DAA6D;IAC7D,cAAc,EAAE,EAAE;IAClB,6CAA6C;IAC7C,UAAU,EAAE,EAAE;IACd,kEAAkE;IAClE,WAAW,EAAE,EAAE;IACf,oEAAoE;IACpE,YAAY,EAAE,EAAE;IAChB,kBAAkB,EAAE,GAAG;IACvB;;;;OAIG;IACH,iBAAiB,EAAE,GAAG;IACtB,+EAA+E;IAC/E,aAAa,EAAE,GAAG;IAClB,sDAAsD;IACtD,cAAc,EAAE,EAAE;IAClB;;;;OAIG;IACH,UAAU,EAAE,GAAG;IACf,UAAU,EAAE,GAAG;IACf,iFAAiF;IACjF,OAAO,EAAE,GAAG;CACJ,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAC;AAEjD;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,IAKxC,EAAsC,EAAE;IACvC,MAAM,IAAI,GAAG,wBAAwB,CAAC,WAAW;UAC7C,wBAAwB,CAAC,iBAAiB;UAC1C,wBAAwB,CAAC,cAAc,CAAC;IAC5C,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAClE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAC9F,OAAO;QACL,KAAK,EAAE,IAAI,GAAG,wBAAwB,CAAC,aAAa;QACpD,OAAO,EAAE,IAAI,GAAG,KAAK,GAAG,wBAAwB,CAAC,aAAa;KAC/D,CAAC;AACJ,CAAC,CAAC;AAEF,mFAAmF;AACnF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAI3C,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAe,EAAU,EAAE;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,GAAG,KAAK,GAAG,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;IACxB,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,IAAI,GAAG,CAAC;AAC7D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAgC,EAAU,EAAE,CAAC,CACxE,gBAAgB,cAAc,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,EAAE,CAClE,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,cAAsB,EACtB,cAAsB,EACd,EAAE,CAAC,CACX,GAAG,cAAc,CAAC,cAAc,CAAC,cAAc,cAAc,CAAC,cAAc,CAAC,UAAU,CACxF,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAM9B,EAAU,EAAE;IACX,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/G,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,IAAI,8DAA8D,CAAC;IAC7F,OAAO,GAAG,IAAI,CAAC,IAAI,0BAA0B,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG;UAC/E,mBAAmB,UAAU,WAAW,IAAI,CAAC,aAAa,OAAO,IAAI,GAAG,CAAC;AAC/E,CAAC,CAAC;AAEF,oFAAoF;AACpF,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,MAAoE,EAC5D,EAAE,CAAC,MAAM;KAChB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;KAC1F,IAAI,CAAC,IAAI,CAAC,CAAC;AAEd,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAuB,EAAE,GAAW,EAAsB,EAAE;IACvF,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACpF,CAAC,CAAC;AAEF,oEAAoE;AACpE,MAAM,YAAY,GAA2B;IAC3C,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,WAAW;IACpB,kBAAkB,EAAE,mBAAmB;IACvC,WAAW,EAAE,sBAAsB;IACnC,wEAAwE;IACxE,oEAAoE;IACpE,iBAAiB,EAAE,mBAAmB;IACtC,oBAAoB,EAAE,sBAAsB;IAC5C,YAAY,EAAE,uBAAuB;IACrC,IAAI,EAAE,eAAe;IACrB,oBAAoB,EAAE,kCAAkC;IACxD,kBAAkB,EAAE,+BAA+B;IACnD,kBAAkB,EAAE,eAAe;IACnC,aAAa,EAAE,kBAAkB;IACjC,cAAc,EAAE,kBAAkB;IAClC,OAAO,EAAE,YAAY;IACrB,wCAAwC;IACxC,iBAAiB,EAAE,sBAAsB;IACzC,aAAa,EAAE,iBAAiB;IAChC,YAAY,EAAE,iBAAiB;CAChC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;AAElF,6CAA6C;AAC7C,MAAM,WAAW,GAA2B;IAC1C,iBAAiB,EAAE,UAAU;IAC7B,aAAa,EAAE,MAAM;IACrB,YAAY,EAAE,MAAM;IACpB,OAAO,EAAE,MAAM;CAChB,CAAC;AAYF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,QAA8B,EAC9B,MAAc,IAAI,CAAC,GAAG,EAAE,EAChB,EAAE;IACV,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,KAAK,SAAS;QACzC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC5B,CAAC,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,OAAO,GAAG,CAAC;IACzD,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,SAAS,IAAI,CAAC,OAAO,QAAQ,CAAC,KAAK,GACxD,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,QAAQ,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,OAAO,UAAU,CAAC,CAAC;IAC9E,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACvD,IAAI,OAAO,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7E,IAAI,QAAQ,CAAC,cAAc;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,gBAAgB,CAAC,CAAC;IACpF,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACrE,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,IAI7C,EAA0E,EAAE;IAC3E,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,mBAAmB,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrE,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,KAAK,IAAI;YAAE,OAAO;QAC5C,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,YAAY,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAClF,CAAC,CAAC;AACJ,CAAC,CAAC;AAQF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,IAKtC,EAAoB,EAAE;IACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAC3C,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,MAAM,OAAO,GAAG,GAAW,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5F,OAAO;QACL,UAAU,EAAE,CAAC,SAAS,EAAE,EAAE;YACxB,IAAI,IAAI,CAAC,KAAK;gBAAE,OAAO;YACvB,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,KAAK,IAAI,SAAS,CAAC,MAAM,CAAC;YAC5D,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC;YAC5C,MAAM,IAAI,GAAG,OAAO,KAAK,SAAS;gBAChC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,KAAK,UAAU,CAAC,KAAK,CAAC,EAAE;gBACvC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,KAAK,UAAU,CAAC,KAAK,CAAC,IAAI,OAAO,GAAG,CAAC;YACtD,IAAI,IAAI,KAAK,IAAI;gBAAE,OAAO;YAC1B,IAAI,GAAG,IAAI,CAAC;YACZ,KAAK,CAAC,IAAI,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,EAAE,CAAC,SAAS,EAAE,EAAE;YAClB,IAAI,IAAI,CAAC,KAAK;gBAAE,OAAO;YACvB,KAAK,CAAC,IAAI,OAAO,EAAE,KAAK,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type CliFlags } from './cli-arguments.js';
|
|
2
|
+
/**
|
|
3
|
+
* `12ui select` — the choice, recorded.
|
|
4
|
+
*
|
|
5
|
+
* The judgement stays the model's: it has to look at four images and say which
|
|
6
|
+
* one and why. Assembling the evidence around that judgement does not, and used
|
|
7
|
+
* to be a contract the skill asked an agent to fill in from four other files by
|
|
8
|
+
* hand.
|
|
9
|
+
*/
|
|
10
|
+
export declare const SELECT_USAGE: string;
|
|
11
|
+
export declare const runSelectCommand: (runDirArgument: string | undefined, flags: CliFlags) => Promise<void>;
|
|
12
|
+
//# sourceMappingURL=cli-select-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-select-command.d.ts","sourceRoot":"","sources":["../src/cli-select-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAQ/D;;;;;;;GAOG;AAEH,eAAO,MAAM,YAAY,QAC4D,CAAC;AAWtF,eAAO,MAAM,gBAAgB,GAC3B,gBAAgB,MAAM,GAAG,SAAS,EAClC,OAAO,QAAQ,KACd,OAAO,CAAC,IAAI,CA8Cd,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { stringFlag } from './cli-arguments.js';
|
|
2
|
+
import { draftPaths, readDraftRecord } from './draft-workspace.js';
|
|
3
|
+
import { buildSelectionRecord, readSelectionRecord, writeSelectionRecord, } from './selection-record.js';
|
|
4
|
+
/**
|
|
5
|
+
* `12ui select` — the choice, recorded.
|
|
6
|
+
*
|
|
7
|
+
* The judgement stays the model's: it has to look at four images and say which
|
|
8
|
+
* one and why. Assembling the evidence around that judgement does not, and used
|
|
9
|
+
* to be a contract the skill asked an agent to fill in from four other files by
|
|
10
|
+
* hand.
|
|
11
|
+
*/
|
|
12
|
+
export const SELECT_USAGE = 'Usage: 12ui select <run-dir> --winner <id> --reason <text>'
|
|
13
|
+
+ ' [--recommended <id>] [--recommendation-source <text>] [--reject <id>=<reason>]';
|
|
14
|
+
/** `--reject B=too generic --reject C=illegible headline` */
|
|
15
|
+
const parseRejections = (flags) => {
|
|
16
|
+
const raw = stringFlag(flags, 'reject');
|
|
17
|
+
if (!raw)
|
|
18
|
+
return {};
|
|
19
|
+
const separator = raw.indexOf('=');
|
|
20
|
+
if (separator <= 0)
|
|
21
|
+
throw new Error('--reject must be <candidate-id>=<reason>');
|
|
22
|
+
return { [raw.slice(0, separator).trim()]: [raw.slice(separator + 1).trim()] };
|
|
23
|
+
};
|
|
24
|
+
export const runSelectCommand = async (runDirArgument, flags) => {
|
|
25
|
+
if (!runDirArgument)
|
|
26
|
+
throw new Error(SELECT_USAGE);
|
|
27
|
+
const winner = stringFlag(flags, 'winner')?.trim();
|
|
28
|
+
const reason = stringFlag(flags, 'reason')?.trim();
|
|
29
|
+
if (!winner || !reason)
|
|
30
|
+
throw new Error(SELECT_USAGE);
|
|
31
|
+
const paths = draftPaths(runDirArgument);
|
|
32
|
+
const draft = await readDraftRecord(paths.draftRecord);
|
|
33
|
+
if (!draft) {
|
|
34
|
+
throw new Error(`No draft run in ${paths.runDir} — there is nothing to select from, and nothing has failed.`
|
|
35
|
+
+ ' Start one with `12ui draft --query "<product, audience, surface, goal, personality>"`.');
|
|
36
|
+
}
|
|
37
|
+
const existing = await readSelectionRecord(paths.selection);
|
|
38
|
+
if (existing) {
|
|
39
|
+
throw new Error(`A selection already exists at ${paths.selection}: candidate ${existing.winner}. Read it`
|
|
40
|
+
+ ' rather than choosing again, or start a new draft to explore other directions.');
|
|
41
|
+
}
|
|
42
|
+
const recommended = stringFlag(flags, 'recommended')?.trim();
|
|
43
|
+
const record = await buildSelectionRecord({
|
|
44
|
+
draft,
|
|
45
|
+
winner,
|
|
46
|
+
reason,
|
|
47
|
+
recommendation: {
|
|
48
|
+
candidateId: recommended ?? null,
|
|
49
|
+
source: recommended ? stringFlag(flags, 'recommendation-source')?.trim() ?? 'run' : null,
|
|
50
|
+
},
|
|
51
|
+
rejectionReasons: parseRejections(flags),
|
|
52
|
+
});
|
|
53
|
+
await writeSelectionRecord(paths.selection, record);
|
|
54
|
+
console.log(JSON.stringify({
|
|
55
|
+
runDir: paths.runDir,
|
|
56
|
+
selection: paths.selection,
|
|
57
|
+
winner: record.winner,
|
|
58
|
+
winnerPath: record.candidates.find((candidate) => candidate.id === record.winner)?.path,
|
|
59
|
+
selectionSource: record.selectionSource,
|
|
60
|
+
nextAction: `Convert the winner alone with \`12ui convert ${paths.candidatesDir}/${record.winner}.png`
|
|
61
|
+
+ ' --export html`, or grow the whole surface with'
|
|
62
|
+
+ ` \`12ui branch execute ${paths.runDir} --concept "<what the rest must cover>"`
|
|
63
|
+
+ ' --scope page|site --convert html`.',
|
|
64
|
+
}, null, 2));
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=cli-select-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-select-command.js","sourceRoot":"","sources":["../src/cli-select-command.ts"],"names":[],"mappings":"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"}
|