@12ui/design 0.2.58 → 0.2.59
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/SKILL.md +1 -1
- package/dist/atomic-file-replace.d.ts +21 -0
- package/dist/atomic-file-replace.d.ts.map +1 -0
- package/dist/atomic-file-replace.js +48 -0
- package/dist/atomic-file-replace.js.map +1 -0
- package/dist/cli-conversion-derivation.d.ts +14 -1
- package/dist/cli-conversion-derivation.d.ts.map +1 -1
- package/dist/cli-conversion-derivation.js +12 -5
- package/dist/cli-conversion-derivation.js.map +1 -1
- package/dist/cli-convert-command.d.ts.map +1 -1
- package/dist/cli-convert-command.js +13 -4
- package/dist/cli-convert-command.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 +21 -8
- package/dist/cli-draft-command.js.map +1 -1
- package/dist/cli-help/design.js +2 -2
- package/dist/cli-help/design.js.map +1 -1
- package/dist/cli-redesign-command.d.ts.map +1 -1
- package/dist/cli-redesign-command.js +177 -138
- package/dist/cli-redesign-command.js.map +1 -1
- package/dist/conversion-client.d.ts +48 -10
- package/dist/conversion-client.d.ts.map +1 -1
- package/dist/conversion-client.js +92 -20
- package/dist/conversion-client.js.map +1 -1
- package/dist/draft-identity.d.ts +7 -0
- package/dist/draft-identity.d.ts.map +1 -1
- package/dist/draft-identity.js +4 -0
- package/dist/draft-identity.js.map +1 -1
- package/dist/draft-run.d.ts +7 -0
- package/dist/draft-run.d.ts.map +1 -1
- package/dist/draft-run.js +8 -0
- package/dist/draft-run.js.map +1 -1
- package/dist/draft-workspace.d.ts +4 -0
- package/dist/draft-workspace.d.ts.map +1 -1
- package/dist/draft-workspace.js.map +1 -1
- package/dist/hosted-draft-identity.d.ts +10 -0
- package/dist/hosted-draft-identity.d.ts.map +1 -1
- package/dist/hosted-draft-identity.js +7 -0
- package/dist/hosted-draft-identity.js.map +1 -1
- package/dist/hosted-draft-run.d.ts +15 -0
- package/dist/hosted-draft-run.d.ts.map +1 -1
- package/dist/hosted-draft-run.js +27 -0
- package/dist/hosted-draft-run.js.map +1 -1
- package/dist/improve-core/improve-concept.d.ts +5 -1
- package/dist/improve-core/improve-concept.d.ts.map +1 -1
- package/dist/improve-core/improve-concept.js +11 -6
- package/dist/improve-core/improve-concept.js.map +1 -1
- package/dist/redesign-branch-adoption.d.ts +29 -0
- package/dist/redesign-branch-adoption.d.ts.map +1 -0
- package/dist/redesign-branch-adoption.js +183 -0
- package/dist/redesign-branch-adoption.js.map +1 -0
- package/dist/redesign-branch-identity.d.ts +23 -0
- package/dist/redesign-branch-identity.d.ts.map +1 -0
- package/dist/redesign-branch-identity.js +27 -0
- package/dist/redesign-branch-identity.js.map +1 -0
- package/dist/redesign-branch-record-verification.d.ts +51 -0
- package/dist/redesign-branch-record-verification.d.ts.map +1 -0
- package/dist/redesign-branch-record-verification.js +127 -0
- package/dist/redesign-branch-record-verification.js.map +1 -0
- package/dist/redesign-branch-stage.d.ts +17 -0
- package/dist/redesign-branch-stage.d.ts.map +1 -0
- package/dist/redesign-branch-stage.js +218 -0
- package/dist/redesign-branch-stage.js.map +1 -0
- package/dist/redesign-page-candidates.d.ts +40 -0
- package/dist/redesign-page-candidates.d.ts.map +1 -0
- package/dist/redesign-page-candidates.js +131 -0
- package/dist/redesign-page-candidates.js.map +1 -0
- package/dist/redesign-page-ownership.d.ts +36 -0
- package/dist/redesign-page-ownership.d.ts.map +1 -0
- package/dist/redesign-page-ownership.js +174 -0
- package/dist/redesign-page-ownership.js.map +1 -0
- package/dist/redesign-plan-identity.d.ts +3 -1
- package/dist/redesign-plan-identity.d.ts.map +1 -1
- package/dist/redesign-plan-identity.js +4 -1
- package/dist/redesign-plan-identity.js.map +1 -1
- package/dist/redesign-plan.d.ts.map +1 -1
- package/dist/redesign-plan.js +12 -6
- package/dist/redesign-plan.js.map +1 -1
- package/dist/redesign-record-validation.d.ts +4 -0
- package/dist/redesign-record-validation.d.ts.map +1 -0
- package/dist/redesign-record-validation.js +210 -0
- package/dist/redesign-record-validation.js.map +1 -0
- package/dist/redesign-workspace.d.ts +30 -5
- package/dist/redesign-workspace.d.ts.map +1 -1
- package/dist/redesign-workspace.js +52 -7
- package/dist/redesign-workspace.js.map +1 -1
- package/dist/run-journal.d.ts +3 -1
- package/dist/run-journal.d.ts.map +1 -1
- package/dist/run-journal.js +7 -1
- package/dist/run-journal.js.map +1 -1
- package/dist/spend-run-filter.d.ts.map +1 -1
- package/dist/spend-run-filter.js +3 -1
- package/dist/spend-run-filter.js.map +1 -1
- package/open-design.json +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { RedesignPaths, RedesignRecord } from './redesign-workspace.js';
|
|
2
|
+
/** Generation zero retains the directory and key layout claimed before redraw. */
|
|
3
|
+
export declare const redesignBranchGeneration: (record: Pick<RedesignRecord, "redrawGeneration">) => number;
|
|
4
|
+
/**
|
|
5
|
+
* A redraw never enters an old child directory: it may contain either a
|
|
6
|
+
* terminal completion or a pre-spend attempt record that must remain evidence
|
|
7
|
+
* for the generation that created it.
|
|
8
|
+
*/
|
|
9
|
+
export declare const redesignBranchPageDirectory: (args: {
|
|
10
|
+
paths: RedesignPaths;
|
|
11
|
+
record: Pick<RedesignRecord, "redrawGeneration">;
|
|
12
|
+
pageId: string;
|
|
13
|
+
}) => string;
|
|
14
|
+
/**
|
|
15
|
+
* The omitted generation term gives old primary branch keys byte-for-byte
|
|
16
|
+
* continuity. A positive generation is a new paid branch identity.
|
|
17
|
+
*/
|
|
18
|
+
export declare const redesignBranchIdempotencyKey: (args: {
|
|
19
|
+
createdAt: string;
|
|
20
|
+
redrawGeneration?: number;
|
|
21
|
+
pageId: string;
|
|
22
|
+
}) => string;
|
|
23
|
+
//# sourceMappingURL=redesign-branch-identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redesign-branch-identity.d.ts","sourceRoot":"","sources":["../src/redesign-branch-identity.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE7E,kFAAkF;AAClF,eAAO,MAAM,wBAAwB,GAAI,QAAQ,IAAI,CAAC,cAAc,EAAE,kBAAkB,CAAC,KAAG,MAE3F,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,GAAI,MAAM;IAChD,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IACjD,MAAM,EAAE,MAAM,CAAC;CAChB,KAAG,MAKH,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,4BAA4B,GAAI,MAAM;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB,KAAG,MAMH,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
/** Generation zero retains the directory and key layout claimed before redraw. */
|
|
4
|
+
export const redesignBranchGeneration = (record) => (record.redrawGeneration ?? 0);
|
|
5
|
+
/**
|
|
6
|
+
* A redraw never enters an old child directory: it may contain either a
|
|
7
|
+
* terminal completion or a pre-spend attempt record that must remain evidence
|
|
8
|
+
* for the generation that created it.
|
|
9
|
+
*/
|
|
10
|
+
export const redesignBranchPageDirectory = (args) => {
|
|
11
|
+
const generation = redesignBranchGeneration(args.record);
|
|
12
|
+
return generation === 0
|
|
13
|
+
? path.join(args.paths.branchDir, args.pageId)
|
|
14
|
+
: path.join(args.paths.branchDir, `redraw-${generation}`, args.pageId);
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* The omitted generation term gives old primary branch keys byte-for-byte
|
|
18
|
+
* continuity. A positive generation is a new paid branch identity.
|
|
19
|
+
*/
|
|
20
|
+
export const redesignBranchIdempotencyKey = (args) => {
|
|
21
|
+
const generation = args.redrawGeneration ?? 0;
|
|
22
|
+
const source = generation === 0
|
|
23
|
+
? `${args.createdAt}\u0000${args.pageId}`
|
|
24
|
+
: `${args.createdAt}\u0000${args.pageId}\u0000redraw-generation:${generation}`;
|
|
25
|
+
return `redesign-branch:v2:${createHash('sha256').update(source).digest('hex')}`;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=redesign-branch-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redesign-branch-identity.js","sourceRoot":"","sources":["../src/redesign-branch-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,kFAAkF;AAClF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,MAAgD,EAAU,EAAE,CAAC,CACpG,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAC7B,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,IAI3C,EAAU,EAAE;IACX,MAAM,UAAU,GAAG,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzD,OAAO,UAAU,KAAK,CAAC;QACrB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC;QAC9C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,UAAU,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;AAC3E,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,IAI5C,EAAU,EAAE;IACX,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,UAAU,KAAK,CAAC;QAC7B,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,SAAS,IAAI,CAAC,MAAM,EAAE;QACzC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,SAAS,IAAI,CAAC,MAAM,2BAA2B,UAAU,EAAE,CAAC;IACjF,OAAO,sBAAsB,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACnF,CAAC,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type BranchAttempt } from './branch-run-record.js';
|
|
2
|
+
import type { BranchWinnerInput } from './branch-execution-types.js';
|
|
3
|
+
import { type AdoptedRedesignBranch } from './redesign-branch-adoption.js';
|
|
4
|
+
import { type VerifiedRedesignPageBranchInput } from './redesign-page-ownership.js';
|
|
5
|
+
import type { RedesignCapturedPageRecord, RedesignRecord } from './redesign-workspace.js';
|
|
6
|
+
/** A parent branch row is a pointer, never proof that its child settled. */
|
|
7
|
+
export declare class InvalidRedesignBranchRecordError extends Error {
|
|
8
|
+
constructor(pageId: string, detail: string);
|
|
9
|
+
}
|
|
10
|
+
/** A resumable child is durable input, not a hint for the executor to reinterpret. */
|
|
11
|
+
export declare class InvalidRedesignBranchAttemptError extends Error {
|
|
12
|
+
constructor(branchDir: string, detail: string);
|
|
13
|
+
}
|
|
14
|
+
export type VerifiedRedesignBranchPage = {
|
|
15
|
+
input: VerifiedRedesignPageBranchInput;
|
|
16
|
+
/** Present when redesign.json already claimed this page as done. */
|
|
17
|
+
recorded: boolean;
|
|
18
|
+
/** Present only when this generation's exact child completion exists. */
|
|
19
|
+
adopted?: AdoptedRedesignBranch;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Check a persisted, non-terminal native BranchAttempt against the exact
|
|
23
|
+
* verified page candidate before the executor gets a chance to resume it.
|
|
24
|
+
* Redesign's page idempotency key deliberately names the page/generation, not
|
|
25
|
+
* the candidate bytes, so this comparison must not be deferred to the native
|
|
26
|
+
* run-key check.
|
|
27
|
+
*/
|
|
28
|
+
export declare const verifyResumableRedesignBranchAttempt: (args: {
|
|
29
|
+
attempt: BranchAttempt;
|
|
30
|
+
attemptPath: string;
|
|
31
|
+
branchDir: string;
|
|
32
|
+
input: VerifiedRedesignPageBranchInput;
|
|
33
|
+
winner: BranchWinnerInput;
|
|
34
|
+
runKey: string;
|
|
35
|
+
concept: string;
|
|
36
|
+
origin: string;
|
|
37
|
+
maxScreens: number;
|
|
38
|
+
conversionModel: string;
|
|
39
|
+
}) => void;
|
|
40
|
+
/**
|
|
41
|
+
* Verify every capture input first, then make a persisted parent row earn its
|
|
42
|
+
* `done` state from the child sentinel it names. This runs before dispatch and
|
|
43
|
+
* before polish, so shape-valid JSON cannot skip immutable-artifact checks.
|
|
44
|
+
*/
|
|
45
|
+
export declare const verifyRedesignBranchPages: (args: {
|
|
46
|
+
record: RedesignRecord;
|
|
47
|
+
pages: readonly RedesignCapturedPageRecord[];
|
|
48
|
+
branchDirectory: (page: RedesignCapturedPageRecord) => string;
|
|
49
|
+
branchConcept: (page: RedesignCapturedPageRecord) => string;
|
|
50
|
+
}) => Promise<VerifiedRedesignBranchPage[]>;
|
|
51
|
+
//# sourceMappingURL=redesign-branch-record-verification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redesign-branch-record-verification.d.ts","sourceRoot":"","sources":["../src/redesign-branch-record-verification.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEL,KAAK,+BAA+B,EACrC,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EACV,0BAA0B,EAC1B,cAAc,EACf,MAAM,yBAAyB,CAAC;AAEjC,4EAA4E;AAC5E,qBAAa,gCAAiC,SAAQ,KAAK;gBAC7C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAI3C;AAED,sFAAsF;AACtF,qBAAa,iCAAkC,SAAQ,KAAK;gBAC9C,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAI9C;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,KAAK,EAAE,+BAA+B,CAAC;IACvC,oEAAoE;IACpE,QAAQ,EAAE,OAAO,CAAC;IAClB,yEAAyE;IACzE,OAAO,CAAC,EAAE,qBAAqB,CAAC;CACjC,CAAC;AAeF;;;;;;GAMG;AACH,eAAO,MAAM,oCAAoC,GAAI,MAAM;IACzD,OAAO,EAAE,aAAa,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,+BAA+B,CAAC;IACvC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;CACzB,KAAG,IA8DH,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,GAAU,MAAM;IACpD,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,SAAS,0BAA0B,EAAE,CAAC;IAC7C,eAAe,EAAE,CAAC,IAAI,EAAE,0BAA0B,KAAK,MAAM,CAAC;IAC9D,aAAa,EAAE,CAAC,IAAI,EAAE,0BAA0B,KAAK,MAAM,CAAC;CAC7D,KAAG,OAAO,CAAC,0BAA0B,EAAE,CA4CvC,CAAC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { branchConceptDigest } from './branch-identity.js';
|
|
3
|
+
import { branchAttemptPath, branchCompletionPath, } from './branch-run-record.js';
|
|
4
|
+
import { adoptCompletedRedesignBranch, } from './redesign-branch-adoption.js';
|
|
5
|
+
import { verifyRedesignPageBranchInputs, } from './redesign-page-ownership.js';
|
|
6
|
+
/** A parent branch row is a pointer, never proof that its child settled. */
|
|
7
|
+
export class InvalidRedesignBranchRecordError extends Error {
|
|
8
|
+
constructor(pageId, detail) {
|
|
9
|
+
super(`Redesign branch page ${pageId} is invalid: ${detail}`);
|
|
10
|
+
this.name = 'InvalidRedesignBranchRecordError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/** A resumable child is durable input, not a hint for the executor to reinterpret. */
|
|
14
|
+
export class InvalidRedesignBranchAttemptError extends Error {
|
|
15
|
+
constructor(branchDir, detail) {
|
|
16
|
+
super(`Redesign branch attempt in ${branchDir} is invalid: ${detail}`);
|
|
17
|
+
this.name = 'InvalidRedesignBranchAttemptError';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const samePath = (left, right) => path.resolve(left) === path.resolve(right);
|
|
21
|
+
const isResumableAttemptStatus = (value) => (value === 'claiming'
|
|
22
|
+
|| value === 'dispatching'
|
|
23
|
+
|| value === 'downloading'
|
|
24
|
+
|| value === 'converting');
|
|
25
|
+
const isImageWinner = (winner) => winner.kind === 'image';
|
|
26
|
+
/**
|
|
27
|
+
* Check a persisted, non-terminal native BranchAttempt against the exact
|
|
28
|
+
* verified page candidate before the executor gets a chance to resume it.
|
|
29
|
+
* Redesign's page idempotency key deliberately names the page/generation, not
|
|
30
|
+
* the candidate bytes, so this comparison must not be deferred to the native
|
|
31
|
+
* run-key check.
|
|
32
|
+
*/
|
|
33
|
+
export const verifyResumableRedesignBranchAttempt = (args) => {
|
|
34
|
+
const { attempt, winner } = args;
|
|
35
|
+
if (!isImageWinner(winner)) {
|
|
36
|
+
throw new InvalidRedesignBranchAttemptError(args.branchDir, 'redesign page branches require an image winner');
|
|
37
|
+
}
|
|
38
|
+
const recordedWinner = attempt.winner;
|
|
39
|
+
const winnerMatches = !!recordedWinner
|
|
40
|
+
&& typeof recordedWinner === 'object'
|
|
41
|
+
&& recordedWinner.kind === 'image'
|
|
42
|
+
&& samePath(recordedWinner.imagePath, args.input.winner.path)
|
|
43
|
+
&& samePath(recordedWinner.imagePath, winner.imagePath)
|
|
44
|
+
&& recordedWinner.sha256 === args.input.winner.sha256
|
|
45
|
+
&& recordedWinner.sha256 === winner.sha256
|
|
46
|
+
&& recordedWinner.mediaType === winner.mediaType
|
|
47
|
+
&& (recordedWinner.width === undefined || recordedWinner.width === winner.width)
|
|
48
|
+
&& (recordedWinner.height === undefined || recordedWinner.height === winner.height);
|
|
49
|
+
const canvas = attempt.generationCanvas;
|
|
50
|
+
const canvasMatches = !!canvas && (!!canvas
|
|
51
|
+
&& typeof canvas === 'object'
|
|
52
|
+
&& !!canvas.winner
|
|
53
|
+
&& typeof canvas.winner === 'object'
|
|
54
|
+
&& canvas.provenance === 'inherited-from-winner'
|
|
55
|
+
&& canvas.winner.width === winner.width
|
|
56
|
+
&& canvas.winner.height === winner.height
|
|
57
|
+
&& canvas.declaredAspect === undefined);
|
|
58
|
+
const convert = attempt.convert;
|
|
59
|
+
if (!samePath(args.attemptPath, branchAttemptPath(args.branchDir))
|
|
60
|
+
|| attempt.version !== 1
|
|
61
|
+
|| !isResumableAttemptStatus(attempt.status)
|
|
62
|
+
|| typeof attempt.runKey !== 'string'
|
|
63
|
+
|| attempt.runKey !== args.runKey
|
|
64
|
+
|| typeof attempt.origin !== 'string'
|
|
65
|
+
|| attempt.origin !== args.origin
|
|
66
|
+
|| attempt.scope !== 'page'
|
|
67
|
+
|| typeof attempt.concept !== 'string'
|
|
68
|
+
|| attempt.concept !== args.concept
|
|
69
|
+
|| typeof attempt.conceptSha256 !== 'string'
|
|
70
|
+
|| attempt.conceptSha256 !== branchConceptDigest(args.concept)
|
|
71
|
+
|| !winnerMatches
|
|
72
|
+
|| !canvasMatches
|
|
73
|
+
|| attempt.aspect !== undefined
|
|
74
|
+
|| attempt.maxScreens !== args.maxScreens
|
|
75
|
+
|| !convert
|
|
76
|
+
|| convert.output !== 'html'
|
|
77
|
+
|| convert.model !== args.conversionModel
|
|
78
|
+
|| convert.responsiveQuality !== undefined
|
|
79
|
+
|| attempt.sourceConversionId !== undefined
|
|
80
|
+
|| attempt.prototype !== undefined
|
|
81
|
+
|| attempt.polish !== undefined
|
|
82
|
+
|| attempt.completionPath !== undefined
|
|
83
|
+
|| attempt.completedAt !== undefined
|
|
84
|
+
|| typeof attempt.createdAt !== 'string'
|
|
85
|
+
|| attempt.createdAt.length === 0) {
|
|
86
|
+
throw new InvalidRedesignBranchAttemptError(args.branchDir, 'it does not bind to this page directory, owned selected candidate, and fixed branch inputs');
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Verify every capture input first, then make a persisted parent row earn its
|
|
91
|
+
* `done` state from the child sentinel it names. This runs before dispatch and
|
|
92
|
+
* before polish, so shape-valid JSON cannot skip immutable-artifact checks.
|
|
93
|
+
*/
|
|
94
|
+
export const verifyRedesignBranchPages = async (args) => {
|
|
95
|
+
const inputs = await verifyRedesignPageBranchInputs({ record: args.record, pages: args.pages });
|
|
96
|
+
const parentByPageId = new Map((args.record.branch?.pages ?? []).map((page) => [page.pageId, page]));
|
|
97
|
+
return Promise.all(inputs.map(async (input) => {
|
|
98
|
+
const branchDir = path.resolve(args.branchDirectory(input.page));
|
|
99
|
+
const parent = parentByPageId.get(input.page.id);
|
|
100
|
+
if (parent) {
|
|
101
|
+
const expectedCompletion = branchCompletionPath(branchDir);
|
|
102
|
+
if (!samePath(parent.branchDir, branchDir) || !samePath(parent.completionPath, expectedCompletion)) {
|
|
103
|
+
throw new InvalidRedesignBranchRecordError(input.page.id, 'parent branchDir or completionPath does not name this generation\'s exact child artifacts');
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const adopted = await adoptCompletedRedesignBranch({
|
|
107
|
+
branchDir,
|
|
108
|
+
concept: args.branchConcept(input.page),
|
|
109
|
+
input,
|
|
110
|
+
});
|
|
111
|
+
if (!parent)
|
|
112
|
+
return { input, recorded: false, ...(adopted ? { adopted } : {}) };
|
|
113
|
+
if (!adopted) {
|
|
114
|
+
throw new InvalidRedesignBranchRecordError(input.page.id, 'parent says done but its exact branch.complete.json is absent');
|
|
115
|
+
}
|
|
116
|
+
const child = adopted.page;
|
|
117
|
+
if (parent.pageId !== child.pageId
|
|
118
|
+
|| !samePath(parent.branchDir, child.branchDir)
|
|
119
|
+
|| parent.runId !== child.runId
|
|
120
|
+
|| parent.status !== child.status
|
|
121
|
+
|| !samePath(parent.completionPath, child.completionPath)) {
|
|
122
|
+
throw new InvalidRedesignBranchRecordError(input.page.id, 'parent row contradicts its exact branch.complete.json');
|
|
123
|
+
}
|
|
124
|
+
return { input, recorded: true, adopted };
|
|
125
|
+
}));
|
|
126
|
+
};
|
|
127
|
+
//# sourceMappingURL=redesign-branch-record-verification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redesign-branch-record-verification.js","sourceRoot":"","sources":["../src/redesign-branch-record-verification.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { readConversionConfig } from './config.js';
|
|
2
|
+
import type { ConversionModel } from './conversion-models.js';
|
|
3
|
+
import { type RedesignPaths, type RedesignRecord } from './redesign-workspace.js';
|
|
4
|
+
import type { RedesignCommandDependencies } from './cli-redesign-command.js';
|
|
5
|
+
type BranchStageDependencies = Pick<RedesignCommandDependencies, 'createBranchClient' | 'createHostedClient' | 'createPackageClient' | 'createPrototypeLabelClient' | 'executeBranch' | 'runPrototype'>;
|
|
6
|
+
/** Execute or adopt one exact child per captured page, never a shared winner. */
|
|
7
|
+
export declare const runRedesignBranchStage: (args: {
|
|
8
|
+
record: RedesignRecord;
|
|
9
|
+
paths: RedesignPaths;
|
|
10
|
+
direction: string;
|
|
11
|
+
maxScreens: number;
|
|
12
|
+
conversionModel: ConversionModel;
|
|
13
|
+
config: ReturnType<typeof readConversionConfig>;
|
|
14
|
+
dependencies: BranchStageDependencies;
|
|
15
|
+
}) => Promise<RedesignRecord>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=redesign-branch-stage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redesign-branch-stage.d.ts","sourceRoot":"","sources":["../src/redesign-branch-stage.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAmB9D,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAE7E,KAAK,uBAAuB,GAAG,IAAI,CAAC,2BAA2B,EAC3D,oBAAoB,GACpB,oBAAoB,GACpB,qBAAqB,GACrB,4BAA4B,GAC5B,eAAe,GACf,cAAc,CACjB,CAAC;AAgDF,iFAAiF;AACjF,eAAO,MAAM,sBAAsB,GAAU,MAAM;IACjD,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,eAAe,CAAC;IACjC,MAAM,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;IAChD,YAAY,EAAE,uBAAuB,CAAC;CACvC,KAAG,OAAO,CAAC,cAAc,CA2KzB,CAAC"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { stat } from 'node:fs/promises';
|
|
2
|
+
import { TwelveUiBranchClient } from './branch-client.js';
|
|
3
|
+
import { createConcurrencyLimiter } from './bounded-concurrency.js';
|
|
4
|
+
import { executeBranchRun } from './branch-execution.js';
|
|
5
|
+
import { branchAttemptPath, readBranchAttempt } from './branch-run-record.js';
|
|
6
|
+
import { imageWinner } from './branch-winner.js';
|
|
7
|
+
import { CliRefusal } from './cli-refusal.js';
|
|
8
|
+
import { prepareOutputDirectory } from './cli-output-paths.js';
|
|
9
|
+
import { BRANCH_PAGE_CONCURRENCY_DEFAULT } from './cli-progress.js';
|
|
10
|
+
import { readConceptValue } from './concept-input.js';
|
|
11
|
+
import { TwelveUiConversionPackageClient } from './package-client.js';
|
|
12
|
+
import { TwelveUiPrototypeLabelClient } from './prototype-label-client.js';
|
|
13
|
+
import { runPrototypePoststep } from './prototype-poststep.js';
|
|
14
|
+
import { InvalidRedesignBranchArtifactError, } from './redesign-branch-adoption.js';
|
|
15
|
+
import { redesignBranchIdempotencyKey, redesignBranchPageDirectory, } from './redesign-branch-identity.js';
|
|
16
|
+
import { InvalidRedesignBranchAttemptError, InvalidRedesignBranchRecordError, verifyResumableRedesignBranchAttempt, verifyRedesignBranchPages, } from './redesign-branch-record-verification.js';
|
|
17
|
+
import { InvalidRedesignPageOwnershipError } from './redesign-page-ownership.js';
|
|
18
|
+
import { writeRedesignRecord, } from './redesign-workspace.js';
|
|
19
|
+
const branchConcept = (direction, page) => readConceptValue({
|
|
20
|
+
value: `${direction} Rebuild the page at ${page.url}.`,
|
|
21
|
+
flag: '--direction',
|
|
22
|
+
trimHint: 'Shorten the direction; each page URL is appended automatically.',
|
|
23
|
+
});
|
|
24
|
+
const branchRefusal = (error) => {
|
|
25
|
+
if (error instanceof InvalidRedesignPageOwnershipError) {
|
|
26
|
+
throw new CliRefusal(`${error.message} Refusing branch dispatch.`, 'redesign_page_ownership_invalid', { cause: error });
|
|
27
|
+
}
|
|
28
|
+
if (error instanceof InvalidRedesignBranchArtifactError
|
|
29
|
+
|| error instanceof InvalidRedesignBranchRecordError
|
|
30
|
+
|| error instanceof InvalidRedesignBranchAttemptError) {
|
|
31
|
+
throw new CliRefusal(`${error.message} Refusing branch dispatch.`, 'redesign_branch_artifact_invalid', { cause: error });
|
|
32
|
+
}
|
|
33
|
+
throw error;
|
|
34
|
+
};
|
|
35
|
+
const recordAdoptedPages = async (args) => {
|
|
36
|
+
const added = new Map(args.entries
|
|
37
|
+
.filter((entry) => !entry.recorded && entry.adopted)
|
|
38
|
+
.map((entry) => [entry.input.page.id, entry.adopted.page]));
|
|
39
|
+
if (added.size === 0)
|
|
40
|
+
return args.record;
|
|
41
|
+
const existing = new Map((args.record.branch?.pages ?? []).map((page) => [page.pageId, page]));
|
|
42
|
+
for (const [pageId, page] of added)
|
|
43
|
+
existing.set(pageId, page);
|
|
44
|
+
const pages = args.record.capture.pages.flatMap((page) => {
|
|
45
|
+
const settled = existing.get(page.id);
|
|
46
|
+
return settled ? [settled] : [];
|
|
47
|
+
});
|
|
48
|
+
const record = { ...args.record, branch: { pages } };
|
|
49
|
+
await writeRedesignRecord(args.paths.record, record);
|
|
50
|
+
return record;
|
|
51
|
+
};
|
|
52
|
+
/** Execute or adopt one exact child per captured page, never a shared winner. */
|
|
53
|
+
export const runRedesignBranchStage = async (args) => {
|
|
54
|
+
if (!args.record.capture)
|
|
55
|
+
throw new Error('Cannot branch before capture has run');
|
|
56
|
+
if (!args.record.pick)
|
|
57
|
+
throw new Error('Cannot branch before pick has run');
|
|
58
|
+
const capture = args.record.capture;
|
|
59
|
+
let preflight;
|
|
60
|
+
try {
|
|
61
|
+
preflight = await verifyRedesignBranchPages({
|
|
62
|
+
record: args.record,
|
|
63
|
+
pages: capture.pages,
|
|
64
|
+
branchDirectory: (page) => redesignBranchPageDirectory({
|
|
65
|
+
paths: args.paths,
|
|
66
|
+
record: args.record,
|
|
67
|
+
pageId: page.id,
|
|
68
|
+
}),
|
|
69
|
+
branchConcept: (page) => branchConcept(args.direction, page),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
return branchRefusal(error);
|
|
74
|
+
}
|
|
75
|
+
// A completed child failed under native branch semantics. Persist a newly
|
|
76
|
+
// found child for truthful resume/spend evidence, then stop before either a
|
|
77
|
+
// sibling dispatch or polish can hide that failure.
|
|
78
|
+
const adoptedFailure = preflight.find((entry) => entry.adopted?.failure)?.adopted?.failure;
|
|
79
|
+
if (adoptedFailure) {
|
|
80
|
+
await recordAdoptedPages({ record: args.record, paths: args.paths, entries: preflight });
|
|
81
|
+
throw adoptedFailure;
|
|
82
|
+
}
|
|
83
|
+
const remaining = preflight.filter((entry) => !entry.recorded);
|
|
84
|
+
if (remaining.length === 0)
|
|
85
|
+
return args.record;
|
|
86
|
+
// Prove every resume target before the first sibling can dispatch. A
|
|
87
|
+
// redesign key is intentionally page/generation-scoped, so an old attempt
|
|
88
|
+
// with that key can still name a different picked candidate.
|
|
89
|
+
const prepared = await Promise.all(remaining.map(async (entry) => {
|
|
90
|
+
const branchDir = redesignBranchPageDirectory({
|
|
91
|
+
paths: args.paths,
|
|
92
|
+
record: args.record,
|
|
93
|
+
pageId: entry.input.page.id,
|
|
94
|
+
});
|
|
95
|
+
const winner = await imageWinner(entry.input.winner.path, `The picked candidate for ${entry.input.page.id}`);
|
|
96
|
+
if (winner.kind !== 'image'
|
|
97
|
+
|| winner.sha256 !== entry.input.winner.sha256
|
|
98
|
+
|| winner.bytes.byteLength !== entry.input.winner.bytes) {
|
|
99
|
+
throw new CliRefusal(`The picked candidate for ${entry.input.page.id} no longer matches its durable materialized digest.`, 'redesign_page_pick_changed');
|
|
100
|
+
}
|
|
101
|
+
const runKey = redesignBranchIdempotencyKey({
|
|
102
|
+
createdAt: args.record.createdAt,
|
|
103
|
+
...(args.record.redrawGeneration ? { redrawGeneration: args.record.redrawGeneration } : {}),
|
|
104
|
+
pageId: entry.input.page.id,
|
|
105
|
+
});
|
|
106
|
+
const attemptPath = branchAttemptPath(branchDir);
|
|
107
|
+
const attempt = await readBranchAttempt(attemptPath);
|
|
108
|
+
if (!attempt && !entry.adopted) {
|
|
109
|
+
const exists = await stat(attemptPath)
|
|
110
|
+
.then(() => true)
|
|
111
|
+
.catch((error) => {
|
|
112
|
+
if (error.code === 'ENOENT')
|
|
113
|
+
return false;
|
|
114
|
+
throw error;
|
|
115
|
+
});
|
|
116
|
+
if (exists) {
|
|
117
|
+
return branchRefusal(new InvalidRedesignBranchAttemptError(branchDir, 'branch.attempt.json is not a readable native attempt record'));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (attempt && !entry.adopted) {
|
|
121
|
+
try {
|
|
122
|
+
verifyResumableRedesignBranchAttempt({
|
|
123
|
+
attempt,
|
|
124
|
+
attemptPath,
|
|
125
|
+
branchDir,
|
|
126
|
+
input: entry.input,
|
|
127
|
+
winner,
|
|
128
|
+
runKey,
|
|
129
|
+
concept: branchConcept(args.direction, entry.input.page),
|
|
130
|
+
origin: args.config.origin,
|
|
131
|
+
maxScreens: args.maxScreens,
|
|
132
|
+
conversionModel: args.conversionModel,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
return branchRefusal(error);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return { entry, branchDir, winner, attempt };
|
|
140
|
+
}));
|
|
141
|
+
const branchClient = (args.dependencies.createBranchClient
|
|
142
|
+
?? args.dependencies.createHostedClient
|
|
143
|
+
?? ((value) => new TwelveUiBranchClient(value)))(args.config);
|
|
144
|
+
const packageClient = (args.dependencies.createPackageClient
|
|
145
|
+
?? ((value) => new TwelveUiConversionPackageClient(value)))(args.config);
|
|
146
|
+
const limiter = createConcurrencyLimiter(BRANCH_PAGE_CONCURRENCY_DEFAULT);
|
|
147
|
+
const completed = await Promise.all(prepared.map(({ entry, branchDir, winner, attempt }) => limiter(async () => {
|
|
148
|
+
const labelClient = (args.dependencies.createPrototypeLabelClient
|
|
149
|
+
?? ((value) => new TwelveUiPrototypeLabelClient(value)))(args.config);
|
|
150
|
+
if (entry.adopted) {
|
|
151
|
+
await (args.dependencies.runPrototype ?? runPrototypePoststep)({
|
|
152
|
+
branchDir,
|
|
153
|
+
resume: true,
|
|
154
|
+
labelClient,
|
|
155
|
+
});
|
|
156
|
+
return { page: entry.adopted.page, failure: entry.adopted.failure };
|
|
157
|
+
}
|
|
158
|
+
await prepareOutputDirectory(branchDir);
|
|
159
|
+
const result = await (args.dependencies.executeBranch ?? executeBranchRun)({
|
|
160
|
+
branchClient,
|
|
161
|
+
packageClient,
|
|
162
|
+
inputs: {
|
|
163
|
+
outDir: branchDir,
|
|
164
|
+
scope: 'page',
|
|
165
|
+
concept: branchConcept(args.direction, entry.input.page),
|
|
166
|
+
idempotencyKey: redesignBranchIdempotencyKey({
|
|
167
|
+
createdAt: args.record.createdAt,
|
|
168
|
+
...(args.record.redrawGeneration ? { redrawGeneration: args.record.redrawGeneration } : {}),
|
|
169
|
+
pageId: entry.input.page.id,
|
|
170
|
+
}),
|
|
171
|
+
winner,
|
|
172
|
+
maxScreens: args.maxScreens,
|
|
173
|
+
convert: { output: 'html', model: args.conversionModel },
|
|
174
|
+
},
|
|
175
|
+
origin: args.config.origin,
|
|
176
|
+
resume: Boolean(attempt),
|
|
177
|
+
// The outer limiter owns redesign page fan-out. Each child has one page.
|
|
178
|
+
pageConcurrency: 1,
|
|
179
|
+
});
|
|
180
|
+
await (args.dependencies.runPrototype ?? runPrototypePoststep)({ branchDir, labelClient });
|
|
181
|
+
return {
|
|
182
|
+
page: {
|
|
183
|
+
pageId: entry.input.page.id,
|
|
184
|
+
branchDir,
|
|
185
|
+
runId: result.completion.runId,
|
|
186
|
+
status: result.completion.status,
|
|
187
|
+
completionPath: result.completionPath,
|
|
188
|
+
},
|
|
189
|
+
failure: result.failure,
|
|
190
|
+
};
|
|
191
|
+
})));
|
|
192
|
+
// Child work is parallel; redesign.json remains one capture-order writer.
|
|
193
|
+
const settled = new Map((args.record.branch?.pages ?? []).map((page) => [page.pageId, page]));
|
|
194
|
+
const completedByPageId = new Map(completed.map((entry) => [entry.page.pageId, entry]));
|
|
195
|
+
let record = args.record;
|
|
196
|
+
let failure = null;
|
|
197
|
+
for (const page of capture.pages) {
|
|
198
|
+
const completedPage = completedByPageId.get(page.id);
|
|
199
|
+
if (!completedPage)
|
|
200
|
+
continue;
|
|
201
|
+
settled.set(page.id, completedPage.page);
|
|
202
|
+
record = {
|
|
203
|
+
...record,
|
|
204
|
+
branch: {
|
|
205
|
+
pages: capture.pages.flatMap((capturedPage) => {
|
|
206
|
+
const child = settled.get(capturedPage.id);
|
|
207
|
+
return child ? [child] : [];
|
|
208
|
+
}),
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
await writeRedesignRecord(args.paths.record, record);
|
|
212
|
+
failure ??= completedPage.failure;
|
|
213
|
+
}
|
|
214
|
+
if (failure)
|
|
215
|
+
throw failure;
|
|
216
|
+
return record;
|
|
217
|
+
};
|
|
218
|
+
//# sourceMappingURL=redesign-branch-stage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redesign-branch-stage.js","sourceRoot":"","sources":["../src/redesign-branch-stage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { RedesignCapturedPageRecord, RedesignDraftPageRecord, RedesignPickPageRecord, RedesignRecord } from './redesign-workspace.js';
|
|
2
|
+
/**
|
|
3
|
+
* Per-page candidate ownership for `12ui redesign`.
|
|
4
|
+
*
|
|
5
|
+
* Capture already knows each page's route and screenshot. Draft and pick must
|
|
6
|
+
* use those facts: a shared homepage winner is not a design for a later
|
|
7
|
+
* captured page. This module is the one place that decides which pages still
|
|
8
|
+
* need their own draw, how that draw is identified, and that a missing pick
|
|
9
|
+
* is a failure rather than a silent reuse of another page's candidate.
|
|
10
|
+
*/
|
|
11
|
+
export declare const redesignPrimaryPage: (pages: readonly RedesignCapturedPageRecord[]) => RedesignCapturedPageRecord;
|
|
12
|
+
export declare const isRedesignPrimaryPage: (pages: readonly RedesignCapturedPageRecord[], pageId: string) => boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Primary pages keep the hosted plan concept so an ordinary one-page redesign
|
|
15
|
+
* claims the same draft it always did. Every other page appends its captured
|
|
16
|
+
* route so the image prompt, and therefore the purchase, is page-specific.
|
|
17
|
+
*/
|
|
18
|
+
export declare const redesignPageDraftConcept: (args: {
|
|
19
|
+
planConcept: string;
|
|
20
|
+
page: RedesignCapturedPageRecord;
|
|
21
|
+
primary: RedesignCapturedPageRecord;
|
|
22
|
+
}) => string;
|
|
23
|
+
/**
|
|
24
|
+
* Paid-identity extra for a non-primary page. Omitted on the primary so keys
|
|
25
|
+
* claimed before per-page drafts existed still replay (CLAUDE.md item 3).
|
|
26
|
+
*/
|
|
27
|
+
export declare const redesignPageDraftRoute: (args: {
|
|
28
|
+
page: RedesignCapturedPageRecord;
|
|
29
|
+
primary: RedesignCapturedPageRecord;
|
|
30
|
+
}) => string | undefined;
|
|
31
|
+
export declare const recordedDraftPages: (record: RedesignRecord) => RedesignDraftPageRecord[];
|
|
32
|
+
export declare const recordedPickPages: (record: RedesignRecord) => RedesignPickPageRecord[];
|
|
33
|
+
export declare const recordedDraftRunIds: (record: RedesignRecord) => string[];
|
|
34
|
+
export declare const pagesNeedingDraft: (record: RedesignRecord) => RedesignCapturedPageRecord[];
|
|
35
|
+
export declare const pagesNeedingPick: (record: RedesignRecord) => RedesignCapturedPageRecord[];
|
|
36
|
+
export declare const draftForPage: (record: RedesignRecord, pageId: string) => RedesignDraftPageRecord;
|
|
37
|
+
export declare const pickForPage: (record: RedesignRecord, pageId: string) => RedesignPickPageRecord;
|
|
38
|
+
export declare const withDraftPages: (pages: readonly RedesignDraftPageRecord[], primaryPageId: string) => NonNullable<RedesignRecord["draft"]>;
|
|
39
|
+
export declare const withPickPages: (pages: readonly RedesignPickPageRecord[], primaryPageId: string) => NonNullable<RedesignRecord["pick"]>;
|
|
40
|
+
//# sourceMappingURL=redesign-page-candidates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redesign-page-candidates.d.ts","sourceRoot":"","sources":["../src/redesign-page-candidates.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,0BAA0B,EAC1B,uBAAuB,EACvB,sBAAsB,EACtB,cAAc,EACf,MAAM,yBAAyB,CAAC;AAEjC;;;;;;;;GAQG;AAEH,eAAO,MAAM,mBAAmB,GAC9B,OAAO,SAAS,0BAA0B,EAAE,KAC3C,0BAIF,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,OAAO,SAAS,0BAA0B,EAAE,EAC5C,QAAQ,MAAM,KACb,OAAkC,CAAC;AAEtC;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,GAAI,MAAM;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,0BAA0B,CAAC;IACjC,OAAO,EAAE,0BAA0B,CAAC;CACrC,KAAG,MAOH,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,MAAM;IAC3C,IAAI,EAAE,0BAA0B,CAAC;IACjC,OAAO,EAAE,0BAA0B,CAAC;CACrC,KAAG,MAAM,GAAG,SAEZ,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,QAAQ,cAAc,KAAG,uBAAuB,EAgBlF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,QAAQ,cAAc,KAAG,sBAAsB,EAmBhF,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,QAAQ,cAAc,KAAG,MAAM,EAIlE,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,QAAQ,cAAc,KAAG,0BAA0B,EAGpF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,QAAQ,cAAc,KAAG,0BAA0B,EAGnF,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,QAAQ,cAAc,EACtB,QAAQ,MAAM,KACb,uBAQF,CAAC;AAEF,eAAO,MAAM,WAAW,GACtB,QAAQ,cAAc,EACtB,QAAQ,MAAM,KACb,sBAQF,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,OAAO,SAAS,uBAAuB,EAAE,EACzC,eAAe,MAAM,KACpB,WAAW,CAAC,cAAc,CAAC,OAAO,CAAC,CAQrC,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,OAAO,SAAS,sBAAsB,EAAE,EACxC,eAAe,MAAM,KACpB,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,CASpC,CAAC"}
|