@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.
- package/README.md +35 -9
- 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 +43 -0
- package/dist/branch-downloads.d.ts.map +1 -0
- package/dist/branch-downloads.js +94 -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 +18 -0
- package/dist/branch-execution.d.ts.map +1 -0
- package/dist/branch-execution.js +261 -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 +22 -0
- package/dist/branch-materialize.d.ts.map +1 -0
- package/dist/branch-materialize.js +47 -0
- package/dist/branch-materialize.js.map +1 -0
- package/dist/branch-page-conversion.d.ts +39 -0
- package/dist/branch-page-conversion.d.ts.map +1 -0
- package/dist/branch-page-conversion.js +206 -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 +75 -0
- package/dist/branch-progress.d.ts.map +1 -0
- package/dist/branch-progress.js +159 -0
- package/dist/branch-progress.js.map +1 -0
- package/dist/branch-run-record.d.ts +153 -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 +115 -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 +4 -0
- package/dist/cli-arguments.js.map +1 -1
- package/dist/cli-branch-command.d.ts +46 -0
- package/dist/cli-branch-command.d.ts.map +1 -0
- package/dist/cli-branch-command.js +426 -0
- package/dist/cli-branch-command.js.map +1 -0
- package/dist/cli-capabilities.d.ts +28 -0
- package/dist/cli-capabilities.d.ts.map +1 -1
- package/dist/cli-capabilities.js +29 -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 +18 -0
- package/dist/cli-package-command.d.ts.map +1 -0
- package/dist/cli-package-command.js +112 -0
- package/dist/cli-package-command.js.map +1 -0
- package/dist/cli-progress.d.ts +61 -0
- package/dist/cli-progress.d.ts.map +1 -1
- package/dist/cli-progress.js +53 -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 +140 -7
- package/dist/cli.js.map +1 -1
- 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 +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/legacy-skill-catalog.d.ts.map +1 -1
- package/dist/legacy-skill-catalog.js +115 -0
- package/dist/legacy-skill-catalog.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-submission.d.ts +103 -0
- package/dist/package-submission.d.ts.map +1 -0
- package/dist/package-submission.js +173 -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 +40 -266
- package/skills/design-branch/SKILL.md +36 -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,261 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { BranchApiError, } from './branch-client.js';
|
|
3
|
+
import { branchConceptDigest, branchRunKey } from './branch-identity.js';
|
|
4
|
+
import { buildCompletion, terminalFailure } from './branch-completion.js';
|
|
5
|
+
import { materializeRun } from './branch-materialize.js';
|
|
6
|
+
import { convertBranchPages } from './branch-page-conversion.js';
|
|
7
|
+
import { applyBranchEnvelope, normalizeBranchPlan } from './branch-plan.js';
|
|
8
|
+
import { branchProgressPath, branchProgressScreens, writeBranchProgress, } from './branch-progress.js';
|
|
9
|
+
import { runBranchDispatch, } from './branch-dispatch-loop.js';
|
|
10
|
+
import { BRANCH_ATTEMPT_FILENAME, BRANCH_PAGES_DIRECTORY, BRANCH_SCREENS_DIRECTORY, branchAttemptPath, branchCompletionPath, branchPlanPath, readBranchAttempt, readBranchCompletion, writeBranchAttempt, writeBranchCompletion, writeBranchPlanRecord, } from './branch-run-record.js';
|
|
11
|
+
/**
|
|
12
|
+
* The whole branch choreography as one deterministic sequence: claim, plan,
|
|
13
|
+
* dependency-ordered dispatch, ordered download, per-page package conversion,
|
|
14
|
+
* sentinel. Everything mechanical lives here so the model's job collapses to
|
|
15
|
+
* choosing the winner, writing the concept, and picking the scope.
|
|
16
|
+
*/
|
|
17
|
+
const BUILD_PLAN_RETRIES = 3;
|
|
18
|
+
export const deriveBranchRunKey = (inputs) => (inputs.idempotencyKey ?? branchRunKey({
|
|
19
|
+
winner: inputs.winner.kind === 'run'
|
|
20
|
+
? { runId: inputs.winner.runId, slot: inputs.winner.slot }
|
|
21
|
+
: { imageSha256: inputs.winner.sha256 },
|
|
22
|
+
concept: inputs.concept,
|
|
23
|
+
scope: inputs.scope,
|
|
24
|
+
}));
|
|
25
|
+
const claimBuildRun = async (args) => {
|
|
26
|
+
let lastError;
|
|
27
|
+
for (let attempt = 1; attempt <= BUILD_PLAN_RETRIES; attempt += 1) {
|
|
28
|
+
try {
|
|
29
|
+
return await args.client.startBuildRun({
|
|
30
|
+
concept: args.inputs.concept,
|
|
31
|
+
...(args.inputs.aspect ? { aspect: args.inputs.aspect } : {}),
|
|
32
|
+
...(args.inputs.winner.kind === 'run'
|
|
33
|
+
? { winner: { createRunId: args.inputs.winner.runId, slot: args.inputs.winner.slot } }
|
|
34
|
+
: {
|
|
35
|
+
referenceImage: {
|
|
36
|
+
data: Buffer.from(args.inputs.winner.bytes).toString('base64'),
|
|
37
|
+
mediaType: args.inputs.winner.mediaType,
|
|
38
|
+
sha256: args.inputs.winner.sha256,
|
|
39
|
+
},
|
|
40
|
+
}),
|
|
41
|
+
}, args.runKey, args.signal);
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
lastError = error;
|
|
45
|
+
// Planning failed before any image spend, so the same key may replay.
|
|
46
|
+
const retryable = error instanceof BranchApiError && error.code === 'build_plan_failed';
|
|
47
|
+
if (!retryable || attempt === BUILD_PLAN_RETRIES)
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
throw lastError;
|
|
52
|
+
};
|
|
53
|
+
export const executeBranchRun = async (args) => {
|
|
54
|
+
const emit = args.onEvent ?? (() => undefined);
|
|
55
|
+
const { inputs } = args;
|
|
56
|
+
const outDir = path.resolve(inputs.outDir);
|
|
57
|
+
const attemptFile = branchAttemptPath(outDir);
|
|
58
|
+
const completionFile = branchCompletionPath(outDir);
|
|
59
|
+
const screensDirectory = path.join(outDir, BRANCH_SCREENS_DIRECTORY);
|
|
60
|
+
const pagesDirectory = path.join(outDir, BRANCH_PAGES_DIRECTORY);
|
|
61
|
+
const runKey = deriveBranchRunKey(inputs);
|
|
62
|
+
const startedAt = new Date().toISOString();
|
|
63
|
+
const progressFile = branchProgressPath(outDir);
|
|
64
|
+
// Progress writes are serialized AND coalesced: the file is the one thing
|
|
65
|
+
// another session polls, so it must never be observed half-written, and a
|
|
66
|
+
// fast loop must not queue an unbounded backlog of stale snapshots. Only the
|
|
67
|
+
// newest pending snapshot is ever written.
|
|
68
|
+
let pendingProgress = null;
|
|
69
|
+
let progressWrites = Promise.resolve();
|
|
70
|
+
let progressWriting = false;
|
|
71
|
+
const drainProgress = () => {
|
|
72
|
+
if (progressWriting || !pendingProgress)
|
|
73
|
+
return;
|
|
74
|
+
progressWriting = true;
|
|
75
|
+
const record = pendingProgress;
|
|
76
|
+
pendingProgress = null;
|
|
77
|
+
progressWrites = writeBranchProgress(progressFile, record)
|
|
78
|
+
.catch(() => undefined)
|
|
79
|
+
.finally(() => {
|
|
80
|
+
progressWriting = false;
|
|
81
|
+
drainProgress();
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
const publishProgress = (phase, runId, screens) => {
|
|
85
|
+
emit({ kind: 'progress', phase, screens });
|
|
86
|
+
pendingProgress = {
|
|
87
|
+
version: 1,
|
|
88
|
+
runId,
|
|
89
|
+
phase,
|
|
90
|
+
startedAt,
|
|
91
|
+
updatedAt: new Date().toISOString(),
|
|
92
|
+
screens,
|
|
93
|
+
};
|
|
94
|
+
drainProgress();
|
|
95
|
+
};
|
|
96
|
+
const finished = await readBranchCompletion(completionFile);
|
|
97
|
+
if (finished) {
|
|
98
|
+
throw new Error(`This branch run already completed: ${completionFile} names run ${finished.runId},`
|
|
99
|
+
+ ` ${finished.succeededCount} succeeded screen(s), and every page's conversion. Read it`
|
|
100
|
+
+ ' rather than running the branch again, or choose a new --out-dir to start a new run.');
|
|
101
|
+
}
|
|
102
|
+
const existing = await readBranchAttempt(attemptFile);
|
|
103
|
+
if (existing && !args.resume) {
|
|
104
|
+
throw new Error(`Branch attempt evidence already exists at ${attemptFile} for run`
|
|
105
|
+
+ ` ${existing.runId ?? '(unclaimed)'}. Re-run the identical command with --resume to`
|
|
106
|
+
+ ' continue it: a resume replays every settled screen for free and re-dispatches only'
|
|
107
|
+
+ ' what is still pending. It can never buy a screen twice.');
|
|
108
|
+
}
|
|
109
|
+
if (!existing && args.resume) {
|
|
110
|
+
// Never started, so nothing failed. This answers in a different register
|
|
111
|
+
// from a recovery report on purpose: a caller told "0 recovered" about work
|
|
112
|
+
// it never asked for concludes the service is broken and gives up.
|
|
113
|
+
throw new Error(`This branch run has never been started — there is nothing to resume, and nothing has`
|
|
114
|
+
+ ` failed. There is no ${BRANCH_ATTEMPT_FILENAME} in ${outDir}. Run the same command`
|
|
115
|
+
+ ' without --resume to start it; it blocks for the whole run and streams progress.');
|
|
116
|
+
}
|
|
117
|
+
if (existing && existing.runKey !== runKey) {
|
|
118
|
+
throw new Error(`Refusing to resume: ${outDir} holds run key ${existing.runKey} but these inputs derive`
|
|
119
|
+
+ ` ${runKey}. A resume must replay the same winner, concept, and scope.`);
|
|
120
|
+
}
|
|
121
|
+
const attempt = existing ?? {
|
|
122
|
+
version: 1,
|
|
123
|
+
status: 'claiming',
|
|
124
|
+
runKey,
|
|
125
|
+
origin: args.origin,
|
|
126
|
+
scope: inputs.scope,
|
|
127
|
+
concept: inputs.concept,
|
|
128
|
+
conceptSha256: branchConceptDigest(inputs.concept),
|
|
129
|
+
winner: inputs.winner.kind === 'run'
|
|
130
|
+
? { kind: 'run', runId: inputs.winner.runId, slot: inputs.winner.slot }
|
|
131
|
+
: {
|
|
132
|
+
kind: 'image',
|
|
133
|
+
imagePath: inputs.winner.imagePath,
|
|
134
|
+
sha256: inputs.winner.sha256,
|
|
135
|
+
mediaType: inputs.winner.mediaType,
|
|
136
|
+
},
|
|
137
|
+
...(inputs.aspect ? { aspect: inputs.aspect } : {}),
|
|
138
|
+
...(inputs.maxScreens === undefined ? {} : { maxScreens: inputs.maxScreens }),
|
|
139
|
+
...(inputs.convert
|
|
140
|
+
? {
|
|
141
|
+
convert: {
|
|
142
|
+
output: inputs.convert.output,
|
|
143
|
+
model: inputs.convert.model ?? 'standard',
|
|
144
|
+
...(inputs.convert.responsiveQuality
|
|
145
|
+
? { responsiveQuality: inputs.convert.responsiveQuality }
|
|
146
|
+
: {}),
|
|
147
|
+
},
|
|
148
|
+
}
|
|
149
|
+
: {}),
|
|
150
|
+
...(inputs.convert?.sourceConversionId
|
|
151
|
+
? { sourceConversionId: inputs.convert.sourceConversionId }
|
|
152
|
+
: {}),
|
|
153
|
+
createdAt: startedAt,
|
|
154
|
+
};
|
|
155
|
+
if (existing) {
|
|
156
|
+
attempt.resumedAt = [...(attempt.resumedAt ?? []), startedAt];
|
|
157
|
+
await writeBranchAttempt(attemptFile, attempt);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
await writeBranchAttempt(attemptFile, attempt, true);
|
|
161
|
+
}
|
|
162
|
+
emit({ kind: 'phase', phase: 'claim', detail: 'planning the screens (10-20s, buys no image)' });
|
|
163
|
+
const envelope = attempt.runId
|
|
164
|
+
? await args.branchClient.getRun(attempt.runId, args.signal)
|
|
165
|
+
: await claimBuildRun({
|
|
166
|
+
client: args.branchClient,
|
|
167
|
+
inputs,
|
|
168
|
+
runKey,
|
|
169
|
+
...(args.signal ? { signal: args.signal } : {}),
|
|
170
|
+
});
|
|
171
|
+
attempt.runId = envelope.id;
|
|
172
|
+
attempt.status = 'dispatching';
|
|
173
|
+
await writeBranchAttempt(attemptFile, attempt);
|
|
174
|
+
let plan = normalizeBranchPlan(envelope, {
|
|
175
|
+
scope: inputs.scope,
|
|
176
|
+
...(inputs.maxScreens === undefined ? {} : { maxScreens: inputs.maxScreens }),
|
|
177
|
+
});
|
|
178
|
+
await writeBranchPlanRecord(branchPlanPath(outDir), plan);
|
|
179
|
+
emit({
|
|
180
|
+
kind: 'phase',
|
|
181
|
+
phase: 'plan',
|
|
182
|
+
detail: `${plan.pages.length} page(s), ${plan.screens.length} screen(s) to generate`,
|
|
183
|
+
});
|
|
184
|
+
let stopped = null;
|
|
185
|
+
publishProgress('dispatching', envelope.id, branchProgressScreens(plan, {}));
|
|
186
|
+
if (plan.screens.length > 0) {
|
|
187
|
+
const dispatched = await runBranchDispatch({
|
|
188
|
+
client: args.branchClient,
|
|
189
|
+
plan,
|
|
190
|
+
onEvent: emit,
|
|
191
|
+
onSnapshot: (snapshot) => publishProgress('dispatching', envelope.id, branchProgressScreens(snapshot.plan, snapshot.dispatchedAt)),
|
|
192
|
+
...(args.signal ? { signal: args.signal } : {}),
|
|
193
|
+
...(args.dispatch ?? {}),
|
|
194
|
+
});
|
|
195
|
+
plan = dispatched.plan;
|
|
196
|
+
stopped = dispatched.stopped;
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
plan = applyBranchEnvelope(plan, envelope);
|
|
200
|
+
}
|
|
201
|
+
attempt.status = 'downloading';
|
|
202
|
+
publishProgress('downloading', envelope.id, branchProgressScreens(plan, {}));
|
|
203
|
+
await writeBranchAttempt(attemptFile, attempt);
|
|
204
|
+
const { screens, winner } = await materializeRun({
|
|
205
|
+
client: args.branchClient,
|
|
206
|
+
plan,
|
|
207
|
+
inputs,
|
|
208
|
+
screensDirectory,
|
|
209
|
+
needsWinner: Boolean(inputs.convert) && plan.pages.some((page) => page.startsFromWinner),
|
|
210
|
+
...(args.signal ? { signal: args.signal } : {}),
|
|
211
|
+
});
|
|
212
|
+
emit({ kind: 'phase', phase: 'download', detail: `${screens.size} screen(s) on disk` });
|
|
213
|
+
const conversions = new Map();
|
|
214
|
+
if (inputs.convert && !stopped) {
|
|
215
|
+
attempt.status = 'converting';
|
|
216
|
+
publishProgress('converting', envelope.id, branchProgressScreens(plan, {}));
|
|
217
|
+
await writeBranchAttempt(attemptFile, attempt);
|
|
218
|
+
if (!args.packageClient)
|
|
219
|
+
throw new Error('A conversion package client is required for --convert');
|
|
220
|
+
emit({ kind: 'phase', phase: 'convert', detail: 'one package conversion per whole page' });
|
|
221
|
+
const converted = await convertBranchPages({
|
|
222
|
+
client: args.packageClient,
|
|
223
|
+
plan,
|
|
224
|
+
screens,
|
|
225
|
+
settings: inputs.convert,
|
|
226
|
+
pagesDirectory,
|
|
227
|
+
...(winner ? { winner } : {}),
|
|
228
|
+
...(args.packageTimeoutMs === undefined ? {} : { timeoutMs: args.packageTimeoutMs }),
|
|
229
|
+
onProgress: (pageId, progress) => emit({ kind: 'package', pageId, progress }),
|
|
230
|
+
...(args.signal ? { signal: args.signal } : {}),
|
|
231
|
+
});
|
|
232
|
+
for (const [pageId, conversion] of converted)
|
|
233
|
+
conversions.set(pageId, conversion);
|
|
234
|
+
}
|
|
235
|
+
const completion = buildCompletion({
|
|
236
|
+
plan,
|
|
237
|
+
inputs,
|
|
238
|
+
runKey,
|
|
239
|
+
origin: args.origin,
|
|
240
|
+
outDir,
|
|
241
|
+
attemptFile,
|
|
242
|
+
startedAt,
|
|
243
|
+
screens,
|
|
244
|
+
...(winner ? { winner } : {}),
|
|
245
|
+
conversions,
|
|
246
|
+
stopped,
|
|
247
|
+
});
|
|
248
|
+
publishProgress('terminal', envelope.id, branchProgressScreens(plan, {}));
|
|
249
|
+
await progressWrites;
|
|
250
|
+
await writeBranchCompletion(completionFile, completion);
|
|
251
|
+
attempt.status = completion.status;
|
|
252
|
+
attempt.completedAt = completion.completedAt;
|
|
253
|
+
attempt.completionPath = completionFile;
|
|
254
|
+
await writeBranchAttempt(attemptFile, attempt);
|
|
255
|
+
return {
|
|
256
|
+
completion,
|
|
257
|
+
completionPath: completionFile,
|
|
258
|
+
failure: terminalFailure({ completion, stopped, completionFile, convert: Boolean(inputs.convert) }),
|
|
259
|
+
};
|
|
260
|
+
};
|
|
261
|
+
//# sourceMappingURL=branch-execution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-execution.js","sourceRoot":"","sources":["../src/branch-execution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every identity a branch run needs, derived from its inputs rather than
|
|
3
|
+
* authored. Free-text keys are load-bearing in both directions here: the same
|
|
4
|
+
* key with a changed body wedges the claim with `409 idempotency_conflict`, and
|
|
5
|
+
* a NEW key on a settled slot buys another image. Deriving them removes both
|
|
6
|
+
* failure modes from the agent's hands.
|
|
7
|
+
*
|
|
8
|
+
* Digests are truncated because `Idempotency-Key` is capped at 128 printable
|
|
9
|
+
* characters and a run id alone is 44 of them. 16 hex characters is 64 bits of
|
|
10
|
+
* collision resistance over inputs that are already scoped by run id, which is
|
|
11
|
+
* far more than the number of runs any account will ever hold.
|
|
12
|
+
*/
|
|
13
|
+
export declare const BRANCH_WORKFLOW_REVISION = "branch-execute-v1";
|
|
14
|
+
export type BranchScope = 'page' | 'site';
|
|
15
|
+
export declare const branchConceptDigest: (concept: string) => string;
|
|
16
|
+
/**
|
|
17
|
+
* Same inputs -> same run, so an interrupted claim replays instead of starting
|
|
18
|
+
* a second one. A changed concept is a different design problem and therefore a
|
|
19
|
+
* different run, so it derives a new key rather than wedging the old one.
|
|
20
|
+
*/
|
|
21
|
+
export declare const branchRunKey: (args: {
|
|
22
|
+
winner: {
|
|
23
|
+
runId: string;
|
|
24
|
+
slot: string;
|
|
25
|
+
} | {
|
|
26
|
+
imageSha256: string;
|
|
27
|
+
};
|
|
28
|
+
concept: string;
|
|
29
|
+
scope: BranchScope;
|
|
30
|
+
}) => string;
|
|
31
|
+
/**
|
|
32
|
+
* The ONLY keyed dispatch. Automatic dispatch is unkeyed so every replay is
|
|
33
|
+
* free; a redraw is an explicit request for one further paid attempt and needs
|
|
34
|
+
* a key the settled slot has never seen.
|
|
35
|
+
*/
|
|
36
|
+
export declare const branchRedrawKey: (args: {
|
|
37
|
+
runId: string;
|
|
38
|
+
slot: string;
|
|
39
|
+
attempt: number;
|
|
40
|
+
}) => string;
|
|
41
|
+
/**
|
|
42
|
+
* Stable under retry and distinct per page. Keying on the ordered viewport
|
|
43
|
+
* hashes means a resumed run that downloaded the same bytes replays the same
|
|
44
|
+
* package rather than buying a second one, while a redrawn screen produces a
|
|
45
|
+
* genuinely different page and therefore a genuinely different key.
|
|
46
|
+
*/
|
|
47
|
+
export declare const branchPackageKey: (args: {
|
|
48
|
+
runId: string;
|
|
49
|
+
pageIndex: number;
|
|
50
|
+
viewportSha256s: readonly string[];
|
|
51
|
+
output: string;
|
|
52
|
+
model?: string;
|
|
53
|
+
responsiveQuality?: string;
|
|
54
|
+
}) => string;
|
|
55
|
+
/** Standalone `convert package` runs derive from the manifest they were given. */
|
|
56
|
+
export declare const conversionPackageKey: (args: {
|
|
57
|
+
manifestSha256: string;
|
|
58
|
+
output: string;
|
|
59
|
+
}) => string;
|
|
60
|
+
/**
|
|
61
|
+
* Standalone `export` runs derive from the conversion they re-render. The
|
|
62
|
+
* export command appends the output and a digest of the request body to this
|
|
63
|
+
* base, so the base only has to pin the source: exporting the same conversion
|
|
64
|
+
* to the same format twice is the same paid work and must replay rather than
|
|
65
|
+
* buy it again, while a different format or profile lands on a different key
|
|
66
|
+
* through the suffix.
|
|
67
|
+
*/
|
|
68
|
+
export declare const conversionExportKey: (args: {
|
|
69
|
+
sourceConversionId: string;
|
|
70
|
+
}) => string;
|
|
71
|
+
//# sourceMappingURL=branch-identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-identity.d.ts","sourceRoot":"","sources":["../src/branch-identity.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,wBAAwB,sBAAsB,CAAC;AAE5D,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;AAM1C,eAAO,MAAM,mBAAmB,GAAI,SAAS,MAAM,KAAG,MAErD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,MAAM;IACjC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,WAAW,CAAC;CACpB,KAAG,MAYH,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAAI,MAAM;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,KAAG,MAAoE,CAAC;AAEzE;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,MAAM;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,KAAG,MAaO,CAAC;AAEZ,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,GAAI,MAAM;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB,KAAG,MAAiF,CAAC;AAEtF;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,GAAI,MAAM;IACxC,kBAAkB,EAAE,MAAM,CAAC;CAC5B,KAAG,MAAwD,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
/**
|
|
3
|
+
* Every identity a branch run needs, derived from its inputs rather than
|
|
4
|
+
* authored. Free-text keys are load-bearing in both directions here: the same
|
|
5
|
+
* key with a changed body wedges the claim with `409 idempotency_conflict`, and
|
|
6
|
+
* a NEW key on a settled slot buys another image. Deriving them removes both
|
|
7
|
+
* failure modes from the agent's hands.
|
|
8
|
+
*
|
|
9
|
+
* Digests are truncated because `Idempotency-Key` is capped at 128 printable
|
|
10
|
+
* characters and a run id alone is 44 of them. 16 hex characters is 64 bits of
|
|
11
|
+
* collision resistance over inputs that are already scoped by run id, which is
|
|
12
|
+
* far more than the number of runs any account will ever hold.
|
|
13
|
+
*/
|
|
14
|
+
export const BRANCH_WORKFLOW_REVISION = 'branch-execute-v1';
|
|
15
|
+
const shortDigest = (value, characters = 16) => (createHash('sha256').update(value).digest('hex').slice(0, characters));
|
|
16
|
+
export const branchConceptDigest = (concept) => (createHash('sha256').update(concept).digest('hex'));
|
|
17
|
+
/**
|
|
18
|
+
* Same inputs -> same run, so an interrupted claim replays instead of starting
|
|
19
|
+
* a second one. A changed concept is a different design problem and therefore a
|
|
20
|
+
* different run, so it derives a new key rather than wedging the old one.
|
|
21
|
+
*/
|
|
22
|
+
export const branchRunKey = (args) => {
|
|
23
|
+
const origin = 'runId' in args.winner
|
|
24
|
+
? `${args.winner.runId}:${args.winner.slot}`
|
|
25
|
+
: `img-${args.winner.imageSha256.slice(0, 32)}:-`;
|
|
26
|
+
return [
|
|
27
|
+
'branch',
|
|
28
|
+
'v1',
|
|
29
|
+
origin,
|
|
30
|
+
shortDigest(args.concept),
|
|
31
|
+
args.scope,
|
|
32
|
+
BRANCH_WORKFLOW_REVISION,
|
|
33
|
+
].join(':');
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* The ONLY keyed dispatch. Automatic dispatch is unkeyed so every replay is
|
|
37
|
+
* free; a redraw is an explicit request for one further paid attempt and needs
|
|
38
|
+
* a key the settled slot has never seen.
|
|
39
|
+
*/
|
|
40
|
+
export const branchRedrawKey = (args) => `branch-screen:${args.runId}:${args.slot}:${args.attempt}`;
|
|
41
|
+
/**
|
|
42
|
+
* Stable under retry and distinct per page. Keying on the ordered viewport
|
|
43
|
+
* hashes means a resumed run that downloaded the same bytes replays the same
|
|
44
|
+
* package rather than buying a second one, while a redrawn screen produces a
|
|
45
|
+
* genuinely different page and therefore a genuinely different key.
|
|
46
|
+
*/
|
|
47
|
+
export const branchPackageKey = (args) => [
|
|
48
|
+
'branch-package',
|
|
49
|
+
'v1',
|
|
50
|
+
args.runId,
|
|
51
|
+
String(args.pageIndex),
|
|
52
|
+
shortDigest(args.viewportSha256s.join('.'), 32),
|
|
53
|
+
args.output,
|
|
54
|
+
// Everything that changes the request body has to be in the key. Model and
|
|
55
|
+
// quality are body fields, so leaving them out turns a deliberate change of
|
|
56
|
+
// model into `409 idempotency_conflict` on a page that was never bought —
|
|
57
|
+
// measured against production while smoke-testing this command.
|
|
58
|
+
args.model ?? 'standard',
|
|
59
|
+
args.responsiveQuality ?? 'default',
|
|
60
|
+
].join(':');
|
|
61
|
+
/** Standalone `convert package` runs derive from the manifest they were given. */
|
|
62
|
+
export const conversionPackageKey = (args) => `convert-package:v1:${args.manifestSha256.slice(0, 32)}:${args.output}`;
|
|
63
|
+
/**
|
|
64
|
+
* Standalone `export` runs derive from the conversion they re-render. The
|
|
65
|
+
* export command appends the output and a digest of the request body to this
|
|
66
|
+
* base, so the base only has to pin the source: exporting the same conversion
|
|
67
|
+
* to the same format twice is the same paid work and must replay rather than
|
|
68
|
+
* buy it again, while a different format or profile lands on a different key
|
|
69
|
+
* through the suffix.
|
|
70
|
+
*/
|
|
71
|
+
export const conversionExportKey = (args) => `convert-export:v1:${args.sourceConversionId}`;
|
|
72
|
+
//# sourceMappingURL=branch-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-identity.js","sourceRoot":"","sources":["../src/branch-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;;;;;;;GAWG;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,mBAAmB,CAAC;AAI5D,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,UAAU,GAAG,EAAE,EAAU,EAAE,CAAC,CAC9D,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CACtE,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,CAC9D,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACnD,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAI5B,EAAU,EAAE;IACX,MAAM,MAAM,GAAG,OAAO,IAAI,IAAI,CAAC,MAAM;QACnC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QAC5C,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;IACpD,OAAO;QACL,QAAQ;QACR,IAAI;QACJ,MAAM;QACN,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;QACzB,IAAI,CAAC,KAAK;QACV,wBAAwB;KACzB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAI/B,EAAU,EAAE,CAAC,iBAAiB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;AAEzE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAOhC,EAAU,EAAE,CAAC;IACZ,gBAAgB;IAChB,IAAI;IACJ,IAAI,CAAC,KAAK;IACV,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;IACtB,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IAC/C,IAAI,CAAC,MAAM;IACX,2EAA2E;IAC3E,4EAA4E;IAC5E,0EAA0E;IAC1E,gEAAgE;IAChE,IAAI,CAAC,KAAK,IAAI,UAAU;IACxB,IAAI,CAAC,iBAAiB,IAAI,SAAS;CACpC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,kFAAkF;AAClF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,IAGpC,EAAU,EAAE,CAAC,sBAAsB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;AAEtF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAEnC,EAAU,EAAE,CAAC,qBAAqB,IAAI,CAAC,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { TwelveUiBranchClient } from './branch-client.js';
|
|
2
|
+
import { type BranchDownloadedScreen } from './branch-downloads.js';
|
|
3
|
+
import type { BranchExecutionInputs } from './branch-execution-types.js';
|
|
4
|
+
import type { BranchNormalizedPlan } from './branch-plan.js';
|
|
5
|
+
/**
|
|
6
|
+
* Delivery. Every screen the run bought is staged first and moved into place in
|
|
7
|
+
* ONE atomic pass, so `screens/` goes from empty to complete and a caller can
|
|
8
|
+
* never mistake a half-written run for a failed one. Bytes already on disk were
|
|
9
|
+
* already paid for, which is what makes a resume free.
|
|
10
|
+
*/
|
|
11
|
+
export declare const materializeRun: (args: {
|
|
12
|
+
client: TwelveUiBranchClient;
|
|
13
|
+
plan: BranchNormalizedPlan;
|
|
14
|
+
inputs: BranchExecutionInputs;
|
|
15
|
+
screensDirectory: string;
|
|
16
|
+
needsWinner: boolean;
|
|
17
|
+
signal?: AbortSignal;
|
|
18
|
+
}) => Promise<{
|
|
19
|
+
screens: Map<string, BranchDownloadedScreen>;
|
|
20
|
+
winner?: BranchDownloadedScreen;
|
|
21
|
+
}>;
|
|
22
|
+
//# sourceMappingURL=branch-materialize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-materialize.d.ts","sourceRoot":"","sources":["../src/branch-materialize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAKL,KAAK,sBAAsB,EAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7D;;;;;GAKG;AAEH,eAAO,MAAM,cAAc,GAAU,MAAM;IACzC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,IAAI,EAAE,oBAAoB,CAAC;IAC3B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,KAAG,OAAO,CAAC;IAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,sBAAsB,CAAA;CAAE,CA4C5F,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { materializeBranchScreens, readMaterializedScreen, stageBranchScreen, stageBranchScreenBytes, } from './branch-downloads.js';
|
|
2
|
+
/**
|
|
3
|
+
* Delivery. Every screen the run bought is staged first and moved into place in
|
|
4
|
+
* ONE atomic pass, so `screens/` goes from empty to complete and a caller can
|
|
5
|
+
* never mistake a half-written run for a failed one. Bytes already on disk were
|
|
6
|
+
* already paid for, which is what makes a resume free.
|
|
7
|
+
*/
|
|
8
|
+
export const materializeRun = async (args) => {
|
|
9
|
+
const screens = new Map();
|
|
10
|
+
const staged = [];
|
|
11
|
+
const succeeded = args.plan.screens.filter((screen) => screen.status === 'succeeded');
|
|
12
|
+
for (const screen of succeeded) {
|
|
13
|
+
// Bytes already on disk were already paid for and already delivered.
|
|
14
|
+
const materialized = await readMaterializedScreen(args.screensDirectory, screen.slot);
|
|
15
|
+
if (materialized) {
|
|
16
|
+
screens.set(screen.slot, materialized);
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
screens.set(screen.slot, await stageBranchScreen({
|
|
20
|
+
client: args.client,
|
|
21
|
+
runId: args.plan.runId,
|
|
22
|
+
slot: screen.slot,
|
|
23
|
+
screensDirectory: args.screensDirectory,
|
|
24
|
+
...(args.signal ? { signal: args.signal } : {}),
|
|
25
|
+
}));
|
|
26
|
+
staged.push(screen.slot);
|
|
27
|
+
}
|
|
28
|
+
let winner;
|
|
29
|
+
if (args.needsWinner) {
|
|
30
|
+
winner = await readMaterializedScreen(args.screensDirectory, 'winner') ?? undefined;
|
|
31
|
+
if (!winner) {
|
|
32
|
+
const bytes = args.inputs.winner.kind === 'image'
|
|
33
|
+
? args.inputs.winner.bytes
|
|
34
|
+
: (await args.client.downloadScreen(args.inputs.winner.runId, args.inputs.winner.slot, args.signal)).bytes;
|
|
35
|
+
winner = await stageBranchScreenBytes({
|
|
36
|
+
screensDirectory: args.screensDirectory,
|
|
37
|
+
slot: 'winner',
|
|
38
|
+
bytes,
|
|
39
|
+
});
|
|
40
|
+
staged.push('winner');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// One atomic pass: the screens directory goes from empty to complete.
|
|
44
|
+
await materializeBranchScreens(args.screensDirectory, staged);
|
|
45
|
+
return { screens, ...(winner ? { winner } : {}) };
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=branch-materialize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-materialize.js","sourceRoot":"","sources":["../src/branch-materialize.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wBAAwB,EACxB,sBAAsB,EACtB,iBAAiB,EACjB,sBAAsB,GAEvB,MAAM,uBAAuB,CAAC;AAI/B;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,IAOpC,EAA8F,EAAE;IAC/F,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkC,CAAC;IAC1D,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;IACtF,KAAK,MAAM,MAAM,IAAI,SAAS,EAAE,CAAC;QAC/B,qEAAqE;QACrE,MAAM,YAAY,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACtF,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YACvC,SAAS;QACX,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,iBAAiB,CAAC;YAC/C,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;YACtB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChD,CAAC,CAAC,CAAC;QACJ,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,MAA0C,CAAC;IAC/C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,IAAI,SAAS,CAAC;QACpF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO;gBAC/C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK;gBAC1B,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CACjC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EACxB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EACvB,IAAI,CAAC,MAAM,CACZ,CAAC,CAAC,KAAK,CAAC;YACX,MAAM,GAAG,MAAM,sBAAsB,CAAC;gBACpC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,IAAI,EAAE,QAAQ;gBACd,KAAK;aACN,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,MAAM,wBAAwB,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC9D,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACpD,CAAC,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ConversionModel } from './conversion-models.js';
|
|
2
|
+
import type { ResponsiveConversionQuality } from './responsive-quality.js';
|
|
3
|
+
import type { BranchDownloadedScreen } from './branch-downloads.js';
|
|
4
|
+
import type { BranchNormalizedPlan } from './branch-plan.js';
|
|
5
|
+
import type { BranchCompletionPage } from './branch-run-record.js';
|
|
6
|
+
import type { TwelveUiConversionPackageClient } from './package-client.js';
|
|
7
|
+
import { type PackageProgressEvent } from './package-submission.js';
|
|
8
|
+
/**
|
|
9
|
+
* The terminal step: ordered viewports of ONE page become ONE package
|
|
10
|
+
* conversion. Viewport 1 of the source page is the approved winner — the
|
|
11
|
+
* server never generates it — so the package is what makes the winner and its
|
|
12
|
+
* continuations one document instead of a pile of separately converted images.
|
|
13
|
+
*
|
|
14
|
+
* A page with a hole in it is parked, not converted: stitching an incomplete
|
|
15
|
+
* page would silently ship a page that is missing a section. Its siblings still
|
|
16
|
+
* convert, because one failed screen must not cost the pages that are whole.
|
|
17
|
+
*/
|
|
18
|
+
export type BranchConversionSettings = {
|
|
19
|
+
output: 'html';
|
|
20
|
+
model?: ConversionModel;
|
|
21
|
+
responsiveQuality?: ResponsiveConversionQuality;
|
|
22
|
+
/** Reuse of an existing succeeded conversion of the winner's exact bytes. */
|
|
23
|
+
sourceConversionId?: string;
|
|
24
|
+
};
|
|
25
|
+
export declare const WINNER_VIEWPORT_ID = "winner";
|
|
26
|
+
type PageConversion = NonNullable<BranchCompletionPage['conversion']>;
|
|
27
|
+
export declare const convertBranchPages: (args: {
|
|
28
|
+
client: TwelveUiConversionPackageClient;
|
|
29
|
+
plan: BranchNormalizedPlan;
|
|
30
|
+
screens: ReadonlyMap<string, BranchDownloadedScreen>;
|
|
31
|
+
winner?: BranchDownloadedScreen;
|
|
32
|
+
settings: BranchConversionSettings;
|
|
33
|
+
pagesDirectory: string;
|
|
34
|
+
timeoutMs?: number;
|
|
35
|
+
onProgress?: (pageId: string, event: PackageProgressEvent) => void;
|
|
36
|
+
signal?: AbortSignal;
|
|
37
|
+
}) => Promise<Map<string, PageConversion>>;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=branch-page-conversion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-page-conversion.d.ts","sourceRoot":"","sources":["../src/branch-page-conversion.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAE3E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,qBAAqB,CAAC;AAM3E,OAAO,EAGL,KAAK,oBAAoB,EAE1B,MAAM,yBAAyB,CAAC;AAEjC;;;;;;;;;GASG;AAEH,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,iBAAiB,CAAC,EAAE,2BAA2B,CAAC;IAChD,6EAA6E;IAC7E,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAE3C,KAAK,cAAc,GAAG,WAAW,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC,CAAC;AActE,eAAO,MAAM,kBAAkB,GAAU,MAAM;IAC7C,MAAM,EAAE,+BAA+B,CAAC;IACxC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACrD,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,QAAQ,EAAE,wBAAwB,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACnE,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,KAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAkMtC,CAAC"}
|