@12ui/design 0.2.58 → 0.2.60
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-improve-command.d.ts.map +1 -1
- package/dist/cli-improve-command.js +36 -3
- package/dist/cli-improve-command.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/corpus-client.d.ts +5 -0
- package/dist/corpus-client.d.ts.map +1 -1
- package/dist/corpus-client.js +14 -1
- package/dist/corpus-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-conversion-stage.d.ts.map +1 -1
- package/dist/improve-conversion-stage.js +8 -4
- package/dist/improve-conversion-stage.js.map +1 -1
- package/dist/improve-convert-resilience.d.ts +1 -0
- package/dist/improve-convert-resilience.d.ts.map +1 -1
- package/dist/improve-convert-resilience.js +22 -4
- package/dist/improve-convert-resilience.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,183 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { BRANCH_COMPLETION_FILENAME, } from './branch-run-record.js';
|
|
5
|
+
import { terminalFailure } from './branch-completion.js';
|
|
6
|
+
import { resolvePrototypeBranchContract } from './prototype-branch-contract.js';
|
|
7
|
+
import { PROTOTYPE_DIRECTORY, PROTOTYPE_MANIFEST_FILENAME, } from './prototype-runner.js';
|
|
8
|
+
import { readPrototypeRunRecord, resolvePrototypeRunRecord, } from './prototype-run-record.js';
|
|
9
|
+
import { PROTOTYPE_PIPELINE_REVISION } from './prototype-revision.js';
|
|
10
|
+
/**
|
|
11
|
+
* A completed child branch may outlive an interrupted redesign parent. This
|
|
12
|
+
* module accepts only a child whose durable branch and optional prototype
|
|
13
|
+
* artifacts still prove the exact page input before the parent adopts it.
|
|
14
|
+
*/
|
|
15
|
+
export class InvalidRedesignBranchArtifactError extends Error {
|
|
16
|
+
constructor(branchDir, detail) {
|
|
17
|
+
super(`Completed branch artifacts in ${branchDir} are invalid: ${detail}`);
|
|
18
|
+
this.name = 'InvalidRedesignBranchArtifactError';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const isRecord = (value) => (!!value && typeof value === 'object' && !Array.isArray(value));
|
|
22
|
+
const nonEmptyString = (value) => (typeof value === 'string' && value.length > 0);
|
|
23
|
+
const isValidWinner = (winner) => (!!winner
|
|
24
|
+
&& typeof winner.path === 'string'
|
|
25
|
+
&& typeof winner.sha256 === 'string'
|
|
26
|
+
&& Number.isInteger(winner.bytes)
|
|
27
|
+
&& winner.bytes >= 0);
|
|
28
|
+
const fileExists = async (file) => {
|
|
29
|
+
try {
|
|
30
|
+
await stat(file);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
if (error.code === 'ENOENT')
|
|
35
|
+
return false;
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const readCompletion = async (args) => {
|
|
40
|
+
let raw;
|
|
41
|
+
try {
|
|
42
|
+
raw = await readFile(args.completionPath, 'utf8');
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (error.code === 'ENOENT')
|
|
46
|
+
return undefined;
|
|
47
|
+
throw new InvalidRedesignBranchArtifactError(args.branchDir, `${BRANCH_COMPLETION_FILENAME} is unreadable (${error.code ?? 'unknown error'})`);
|
|
48
|
+
}
|
|
49
|
+
let value;
|
|
50
|
+
try {
|
|
51
|
+
value = JSON.parse(raw);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
throw new InvalidRedesignBranchArtifactError(args.branchDir, `${BRANCH_COMPLETION_FILENAME} is not JSON`);
|
|
55
|
+
}
|
|
56
|
+
if (!isRecord(value)
|
|
57
|
+
|| value.version !== 1
|
|
58
|
+
|| (value.status !== 'succeeded' && value.status !== 'partial' && value.status !== 'failed')
|
|
59
|
+
|| !nonEmptyString(value.runId)
|
|
60
|
+
|| !nonEmptyString(value.runKey)
|
|
61
|
+
|| !nonEmptyString(value.concept)
|
|
62
|
+
|| !nonEmptyString(value.conceptSha256)
|
|
63
|
+
|| value.scope !== 'page'
|
|
64
|
+
|| !nonEmptyString(value.outDir)
|
|
65
|
+
|| !Array.isArray(value.pages)) {
|
|
66
|
+
throw new InvalidRedesignBranchArtifactError(args.branchDir, `${BRANCH_COMPLETION_FILENAME} has no complete terminal page-run identity`);
|
|
67
|
+
}
|
|
68
|
+
return value;
|
|
69
|
+
};
|
|
70
|
+
const readPrototypeManifest = async (args) => {
|
|
71
|
+
let value;
|
|
72
|
+
try {
|
|
73
|
+
value = JSON.parse(await readFile(args.manifestPath, 'utf8'));
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
throw new InvalidRedesignBranchArtifactError(args.branchDir, 'prototype manifest is unreadable or not JSON');
|
|
77
|
+
}
|
|
78
|
+
const source = isRecord(value) ? value.source : undefined;
|
|
79
|
+
if (!isRecord(value)
|
|
80
|
+
|| value.revision !== PROTOTYPE_PIPELINE_REVISION
|
|
81
|
+
|| !isRecord(source)
|
|
82
|
+
|| !nonEmptyString(source.branchDir)
|
|
83
|
+
|| !nonEmptyString(source.runId)
|
|
84
|
+
|| path.resolve(source.branchDir) !== args.branchDir
|
|
85
|
+
|| source.runId !== args.runId) {
|
|
86
|
+
throw new InvalidRedesignBranchArtifactError(args.branchDir, 'prototype manifest does not bind to this branch directory and run ID');
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
const validatePrototypeArtifact = async (args) => {
|
|
90
|
+
const contract = await resolvePrototypeBranchContract({ branchDir: args.branchDir });
|
|
91
|
+
if (contract.mode === 'skip' && contract.reason === 'prototype_navigation_unreconciled') {
|
|
92
|
+
throw new InvalidRedesignBranchArtifactError(args.branchDir, contract.detail);
|
|
93
|
+
}
|
|
94
|
+
if (args.completion.status === 'succeeded' && contract.mode !== 'complete') {
|
|
95
|
+
throw new InvalidRedesignBranchArtifactError(args.branchDir, 'a succeeded completion does not reconcile to complete prototype inputs');
|
|
96
|
+
}
|
|
97
|
+
let prototypeRecord;
|
|
98
|
+
try {
|
|
99
|
+
prototypeRecord = await readPrototypeRunRecord(args.branchDir);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
throw new InvalidRedesignBranchArtifactError(args.branchDir, error instanceof Error ? error.message : String(error));
|
|
103
|
+
}
|
|
104
|
+
if (prototypeRecord && prototypeRecord.runId !== args.completion.runId) {
|
|
105
|
+
throw new InvalidRedesignBranchArtifactError(args.branchDir, 'prototype status run ID differs from completion');
|
|
106
|
+
}
|
|
107
|
+
if (prototypeRecord?.status === 'skipped' && contract.mode !== 'skip') {
|
|
108
|
+
throw new InvalidRedesignBranchArtifactError(args.branchDir, 'prototype is skipped even though its branch inputs are reconciled');
|
|
109
|
+
}
|
|
110
|
+
if (prototypeRecord?.status === 'succeeded' && contract.mode === 'skip') {
|
|
111
|
+
throw new InvalidRedesignBranchArtifactError(args.branchDir, 'prototype succeeded despite unreconciled branch inputs');
|
|
112
|
+
}
|
|
113
|
+
const legacyManifest = path.join(args.branchDir, PROTOTYPE_DIRECTORY, PROTOTYPE_MANIFEST_FILENAME);
|
|
114
|
+
const hasManifest = await fileExists(legacyManifest);
|
|
115
|
+
const terminalPrototype = prototypeRecord?.status === 'succeeded' || prototypeRecord?.status === 'skipped';
|
|
116
|
+
if (!terminalPrototype && !hasManifest)
|
|
117
|
+
return;
|
|
118
|
+
const resolution = await resolvePrototypeRunRecord({
|
|
119
|
+
branchDir: args.branchDir,
|
|
120
|
+
inputDigest: contract.inputDigest,
|
|
121
|
+
legacyManifestPath: legacyManifest,
|
|
122
|
+
});
|
|
123
|
+
if (resolution.action !== 'settled') {
|
|
124
|
+
throw new InvalidRedesignBranchArtifactError(args.branchDir, `prototype output cannot be adopted (${resolution.reason})`);
|
|
125
|
+
}
|
|
126
|
+
if (resolution.manifestPath) {
|
|
127
|
+
await readPrototypeManifest({
|
|
128
|
+
branchDir: args.branchDir,
|
|
129
|
+
manifestPath: resolution.manifestPath,
|
|
130
|
+
runId: args.completion.runId,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* Return a reconstructible parent page entry when a terminal child sentinel is
|
|
136
|
+
* already present. Absence is normal and means the caller must start/resume
|
|
137
|
+
* the child; any present but contradictory sentinel is a hard refusal.
|
|
138
|
+
*/
|
|
139
|
+
export const adoptCompletedRedesignBranch = async (args) => {
|
|
140
|
+
const branchDir = path.resolve(args.branchDir);
|
|
141
|
+
const completionPath = path.join(branchDir, BRANCH_COMPLETION_FILENAME);
|
|
142
|
+
const completion = await readCompletion({ branchDir, completionPath });
|
|
143
|
+
if (!completion)
|
|
144
|
+
return undefined;
|
|
145
|
+
const expectedConceptSha256 = createHash('sha256').update(args.concept).digest('hex');
|
|
146
|
+
const winner = completion.winner;
|
|
147
|
+
if (path.resolve(completion.outDir) !== branchDir
|
|
148
|
+
|| completion.concept !== args.concept
|
|
149
|
+
|| completion.conceptSha256 !== expectedConceptSha256
|
|
150
|
+
|| !isValidWinner(winner)
|
|
151
|
+
|| path.resolve(winner.path) !== path.resolve(args.input.winner.path)
|
|
152
|
+
|| winner.sha256 !== args.input.winner.sha256
|
|
153
|
+
|| winner.bytes !== args.input.winner.bytes) {
|
|
154
|
+
throw new InvalidRedesignBranchArtifactError(branchDir, `${BRANCH_COMPLETION_FILENAME} does not bind to this page's concept and owned selected candidate`);
|
|
155
|
+
}
|
|
156
|
+
await validatePrototypeArtifact({ branchDir, completion });
|
|
157
|
+
const failure = terminalFailure({
|
|
158
|
+
completion,
|
|
159
|
+
stopped: null,
|
|
160
|
+
completionFile: completionPath,
|
|
161
|
+
// Redesign always invokes page branch with --convert html. The completion
|
|
162
|
+
// is therefore evaluated under the same terminal rules as executeBranchRun.
|
|
163
|
+
convert: true,
|
|
164
|
+
});
|
|
165
|
+
if (completion.status === 'failed' && !failure) {
|
|
166
|
+
throw new InvalidRedesignBranchArtifactError(branchDir, 'failed completion does not carry a native terminal failure condition');
|
|
167
|
+
}
|
|
168
|
+
if (completion.status === 'succeeded' && failure) {
|
|
169
|
+
throw new InvalidRedesignBranchArtifactError(branchDir, 'succeeded completion carries a native terminal failure condition');
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
completion,
|
|
173
|
+
page: {
|
|
174
|
+
pageId: args.input.page.id,
|
|
175
|
+
branchDir,
|
|
176
|
+
runId: completion.runId,
|
|
177
|
+
status: completion.status,
|
|
178
|
+
completionPath,
|
|
179
|
+
},
|
|
180
|
+
failure,
|
|
181
|
+
};
|
|
182
|
+
};
|
|
183
|
+
//# sourceMappingURL=redesign-branch-adoption.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redesign-branch-adoption.js","sourceRoot":"","sources":["../src/redesign-branch-adoption.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|