@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,131 @@
|
|
|
1
|
+
import { readConceptValue } from './concept-input.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 const redesignPrimaryPage = (pages) => {
|
|
12
|
+
const homepage = pages[0];
|
|
13
|
+
if (!homepage)
|
|
14
|
+
throw new Error('Capture recorded no pages');
|
|
15
|
+
return homepage;
|
|
16
|
+
};
|
|
17
|
+
export const isRedesignPrimaryPage = (pages, pageId) => pages[0]?.id === pageId;
|
|
18
|
+
/**
|
|
19
|
+
* Primary pages keep the hosted plan concept so an ordinary one-page redesign
|
|
20
|
+
* claims the same draft it always did. Every other page appends its captured
|
|
21
|
+
* route so the image prompt, and therefore the purchase, is page-specific.
|
|
22
|
+
*/
|
|
23
|
+
export const redesignPageDraftConcept = (args) => {
|
|
24
|
+
if (args.page.id === args.primary.id)
|
|
25
|
+
return args.planConcept;
|
|
26
|
+
return readConceptValue({
|
|
27
|
+
value: `${args.planConcept} Rebuild the captured page at ${args.page.url}.`,
|
|
28
|
+
flag: '--direction',
|
|
29
|
+
trimHint: 'Shorten the direction; each page URL is appended automatically.',
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Paid-identity extra for a non-primary page. Omitted on the primary so keys
|
|
34
|
+
* claimed before per-page drafts existed still replay (CLAUDE.md item 3).
|
|
35
|
+
*/
|
|
36
|
+
export const redesignPageDraftRoute = (args) => (args.page.id === args.primary.id ? undefined : args.page.url);
|
|
37
|
+
export const recordedDraftPages = (record) => {
|
|
38
|
+
if (!record.draft)
|
|
39
|
+
return [];
|
|
40
|
+
const primaryId = record.capture?.pages[0]?.id;
|
|
41
|
+
if (!primaryId)
|
|
42
|
+
return [];
|
|
43
|
+
const primary = {
|
|
44
|
+
pageId: primaryId,
|
|
45
|
+
runDir: record.draft.runDir,
|
|
46
|
+
runId: record.draft.runId,
|
|
47
|
+
};
|
|
48
|
+
if (!record.draft.pages || record.draft.pages.length === 0)
|
|
49
|
+
return [primary];
|
|
50
|
+
const recordedPrimary = record.draft.pages.find((page) => page.pageId === primaryId);
|
|
51
|
+
if (!recordedPrimary)
|
|
52
|
+
return [primary, ...record.draft.pages];
|
|
53
|
+
if (recordedPrimary.runDir !== primary.runDir || recordedPrimary.runId !== primary.runId) {
|
|
54
|
+
throw new Error('Recorded primary draft does not match the durable top-level draft');
|
|
55
|
+
}
|
|
56
|
+
return [...record.draft.pages];
|
|
57
|
+
};
|
|
58
|
+
export const recordedPickPages = (record) => {
|
|
59
|
+
if (!record.pick)
|
|
60
|
+
return [];
|
|
61
|
+
const primaryId = record.capture?.pages[0]?.id;
|
|
62
|
+
if (!primaryId)
|
|
63
|
+
return [];
|
|
64
|
+
const primary = {
|
|
65
|
+
pageId: primaryId,
|
|
66
|
+
slot: record.pick.slot,
|
|
67
|
+
imagePath: record.pick.imagePath,
|
|
68
|
+
sha256: record.pick.sha256,
|
|
69
|
+
};
|
|
70
|
+
if (!record.pick.pages || record.pick.pages.length === 0)
|
|
71
|
+
return [primary];
|
|
72
|
+
const recordedPrimary = record.pick.pages.find((page) => page.pageId === primaryId);
|
|
73
|
+
if (!recordedPrimary)
|
|
74
|
+
return [primary, ...record.pick.pages];
|
|
75
|
+
if (recordedPrimary.slot !== primary.slot
|
|
76
|
+
|| recordedPrimary.imagePath !== primary.imagePath
|
|
77
|
+
|| recordedPrimary.sha256 !== primary.sha256) {
|
|
78
|
+
throw new Error('Recorded primary pick does not match the durable top-level pick');
|
|
79
|
+
}
|
|
80
|
+
return [...record.pick.pages];
|
|
81
|
+
};
|
|
82
|
+
export const recordedDraftRunIds = (record) => {
|
|
83
|
+
const pages = recordedDraftPages(record);
|
|
84
|
+
if (pages.length > 0)
|
|
85
|
+
return pages.map((page) => page.runId);
|
|
86
|
+
return record.draft ? [record.draft.runId] : [];
|
|
87
|
+
};
|
|
88
|
+
export const pagesNeedingDraft = (record) => {
|
|
89
|
+
const done = new Set(recordedDraftPages(record).map((page) => page.pageId));
|
|
90
|
+
return (record.capture?.pages ?? []).filter((page) => !done.has(page.id));
|
|
91
|
+
};
|
|
92
|
+
export const pagesNeedingPick = (record) => {
|
|
93
|
+
const done = new Set(recordedPickPages(record).map((page) => page.pageId));
|
|
94
|
+
return (record.capture?.pages ?? []).filter((page) => !done.has(page.id));
|
|
95
|
+
};
|
|
96
|
+
export const draftForPage = (record, pageId) => {
|
|
97
|
+
const found = recordedDraftPages(record).find((page) => page.pageId === pageId);
|
|
98
|
+
if (!found) {
|
|
99
|
+
throw new Error(`Captured page ${pageId} has no page-specific draft; re-run from draft so it can buy its own candidates.`);
|
|
100
|
+
}
|
|
101
|
+
return found;
|
|
102
|
+
};
|
|
103
|
+
export const pickForPage = (record, pageId) => {
|
|
104
|
+
const found = recordedPickPages(record).find((page) => page.pageId === pageId);
|
|
105
|
+
if (!found) {
|
|
106
|
+
throw new Error(`Captured page ${pageId} has no page-specific pick; refusing to reuse another page's winner.`);
|
|
107
|
+
}
|
|
108
|
+
return found;
|
|
109
|
+
};
|
|
110
|
+
export const withDraftPages = (pages, primaryPageId) => {
|
|
111
|
+
const primary = pages.find((page) => page.pageId === primaryPageId) ?? pages[0];
|
|
112
|
+
if (!primary)
|
|
113
|
+
throw new Error('Cannot record a draft with no pages');
|
|
114
|
+
return {
|
|
115
|
+
runDir: primary.runDir,
|
|
116
|
+
runId: primary.runId,
|
|
117
|
+
pages: [...pages],
|
|
118
|
+
};
|
|
119
|
+
};
|
|
120
|
+
export const withPickPages = (pages, primaryPageId) => {
|
|
121
|
+
const primary = pages.find((page) => page.pageId === primaryPageId) ?? pages[0];
|
|
122
|
+
if (!primary)
|
|
123
|
+
throw new Error('Cannot record a pick with no pages');
|
|
124
|
+
return {
|
|
125
|
+
slot: primary.slot,
|
|
126
|
+
imagePath: primary.imagePath,
|
|
127
|
+
sha256: primary.sha256,
|
|
128
|
+
pages: [...pages],
|
|
129
|
+
};
|
|
130
|
+
};
|
|
131
|
+
//# sourceMappingURL=redesign-page-candidates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redesign-page-candidates.js","sourceRoot":"","sources":["../src/redesign-page-candidates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { RedesignCapturedPageRecord, RedesignDraftPageRecord, RedesignPickPageRecord, RedesignRecord } from './redesign-workspace.js';
|
|
2
|
+
/**
|
|
3
|
+
* Durable proof that a branch page owns its selected draft. Parent records
|
|
4
|
+
* name file locations for navigation, but those mutable paths are never the
|
|
5
|
+
* identity: the route, capture digest, hosted run ID, completion run ID, and
|
|
6
|
+
* materialized candidate digest must all agree before branch can claim work.
|
|
7
|
+
*/
|
|
8
|
+
export declare class InvalidRedesignPageOwnershipError extends Error {
|
|
9
|
+
constructor(pageId: string, detail: string);
|
|
10
|
+
}
|
|
11
|
+
export type VerifiedRedesignPageBranchInput = {
|
|
12
|
+
page: RedesignCapturedPageRecord;
|
|
13
|
+
draft: RedesignDraftPageRecord;
|
|
14
|
+
pick: RedesignPickPageRecord;
|
|
15
|
+
/**
|
|
16
|
+
* The exact DraftCandidateRecord.outputPath, proven owned and read from disk
|
|
17
|
+
* in this verification pass. Child branch artifacts must bind to this value,
|
|
18
|
+
* never merely to a digest that another page could also name.
|
|
19
|
+
*/
|
|
20
|
+
winner: {
|
|
21
|
+
path: string;
|
|
22
|
+
sha256: string;
|
|
23
|
+
bytes: number;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
/** Validate one page's draft, completion, and selected materialized candidate. */
|
|
27
|
+
export declare const verifyRedesignPageBranchInput: (args: {
|
|
28
|
+
record: RedesignRecord;
|
|
29
|
+
page: RedesignCapturedPageRecord;
|
|
30
|
+
}) => Promise<VerifiedRedesignPageBranchInput>;
|
|
31
|
+
/** Validate every pending branch input before any page is allowed to dispatch. */
|
|
32
|
+
export declare const verifyRedesignPageBranchInputs: (args: {
|
|
33
|
+
record: RedesignRecord;
|
|
34
|
+
pages: readonly RedesignCapturedPageRecord[];
|
|
35
|
+
}) => Promise<VerifiedRedesignPageBranchInput[]>;
|
|
36
|
+
//# sourceMappingURL=redesign-page-ownership.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redesign-page-ownership.d.ts","sourceRoot":"","sources":["../src/redesign-page-ownership.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,0BAA0B,EAC1B,uBAAuB,EACvB,sBAAsB,EACtB,cAAc,EACf,MAAM,yBAAyB,CAAC;AAEjC;;;;;GAKG;AAEH,qBAAa,iCAAkC,SAAQ,KAAK;gBAC9C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAI3C;AAED,MAAM,MAAM,+BAA+B,GAAG;IAC5C,IAAI,EAAE,0BAA0B,CAAC;IACjC,KAAK,EAAE,uBAAuB,CAAC;IAC/B,IAAI,EAAE,sBAAsB,CAAC;IAC7B;;;;OAIG;IACH,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACzD,CAAC;AAiGF,kFAAkF;AAClF,eAAO,MAAM,6BAA6B,GAAU,MAAM;IACxD,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,0BAA0B,CAAC;CAClC,KAAG,OAAO,CAAC,+BAA+B,CAqG1C,CAAC;AAEF,kFAAkF;AAClF,eAAO,MAAM,8BAA8B,GAAU,MAAM;IACzD,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,SAAS,0BAA0B,EAAE,CAAC;CAC9C,KAAG,OAAO,CAAC,+BAA+B,EAAE,CAE5C,CAAC"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { readFile, realpath } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { draftForPage, pickForPage, redesignPrimaryPage } from './redesign-page-candidates.js';
|
|
5
|
+
import { draftPaths } from './draft-workspace.js';
|
|
6
|
+
/**
|
|
7
|
+
* Durable proof that a branch page owns its selected draft. Parent records
|
|
8
|
+
* name file locations for navigation, but those mutable paths are never the
|
|
9
|
+
* identity: the route, capture digest, hosted run ID, completion run ID, and
|
|
10
|
+
* materialized candidate digest must all agree before branch can claim work.
|
|
11
|
+
*/
|
|
12
|
+
export class InvalidRedesignPageOwnershipError extends Error {
|
|
13
|
+
constructor(pageId, detail) {
|
|
14
|
+
super(`Redesign page ${pageId} has invalid draft ownership: ${detail}`);
|
|
15
|
+
this.name = 'InvalidRedesignPageOwnershipError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const samePath = (left, right) => path.resolve(left) === path.resolve(right);
|
|
19
|
+
const insideDirectory = (file, directory) => {
|
|
20
|
+
const relative = path.relative(path.resolve(directory), path.resolve(file));
|
|
21
|
+
return relative !== '' && !relative.startsWith(`..${path.sep}`) && relative !== '..' && !path.isAbsolute(relative);
|
|
22
|
+
};
|
|
23
|
+
const isRecord = (value) => (!!value && typeof value === 'object' && !Array.isArray(value));
|
|
24
|
+
const readJson = async (file, pageId, label) => {
|
|
25
|
+
let raw;
|
|
26
|
+
try {
|
|
27
|
+
raw = await readFile(file, 'utf8');
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
throw new InvalidRedesignPageOwnershipError(pageId, `${label} is unreadable at ${file} (${error.code ?? 'unknown error'})`);
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
return JSON.parse(raw);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
throw new InvalidRedesignPageOwnershipError(pageId, `${label} is not JSON at ${file}`);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const validDraftRecord = (value) => (isRecord(value)
|
|
40
|
+
&& typeof value.runDir === 'string'
|
|
41
|
+
&& isRecord(value.redesignSource)
|
|
42
|
+
&& typeof value.redesignSource.path === 'string'
|
|
43
|
+
&& typeof value.redesignSource.sha256 === 'string'
|
|
44
|
+
&& isRecord(value.hosted)
|
|
45
|
+
&& typeof value.hosted.runId === 'string'
|
|
46
|
+
&& Array.isArray(value.hosted.candidates));
|
|
47
|
+
const validDraftCompletion = (value) => (isRecord(value)
|
|
48
|
+
&& typeof value.runId === 'string'
|
|
49
|
+
&& Array.isArray(value.candidates));
|
|
50
|
+
const materializedCandidateDigest = async (args) => {
|
|
51
|
+
let bytes;
|
|
52
|
+
try {
|
|
53
|
+
bytes = await readFile(args.file);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
throw new InvalidRedesignPageOwnershipError(args.pageId, `selected DraftCandidateRecord.outputPath is unreadable at ${args.file}`
|
|
57
|
+
+ ` (${error.code ?? 'unknown error'})`);
|
|
58
|
+
}
|
|
59
|
+
return { sha256: createHash('sha256').update(bytes).digest('hex'), bytes: bytes.byteLength };
|
|
60
|
+
};
|
|
61
|
+
const assertOwnedCandidatePath = async (args) => {
|
|
62
|
+
if (!insideDirectory(args.candidatePath, args.candidatesDirectory)) {
|
|
63
|
+
throw new InvalidRedesignPageOwnershipError(args.pageId, 'selected DraftCandidateRecord.outputPath is outside its owning child draft candidates directory');
|
|
64
|
+
}
|
|
65
|
+
let resolvedCandidate;
|
|
66
|
+
let resolvedDirectory;
|
|
67
|
+
try {
|
|
68
|
+
[resolvedCandidate, resolvedDirectory] = await Promise.all([
|
|
69
|
+
realpath(args.candidatePath),
|
|
70
|
+
realpath(args.candidatesDirectory),
|
|
71
|
+
]);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
throw new InvalidRedesignPageOwnershipError(args.pageId, `selected DraftCandidateRecord.outputPath cannot resolve inside its owning child draft directory`
|
|
75
|
+
+ ` (${error.code ?? 'unknown error'})`);
|
|
76
|
+
}
|
|
77
|
+
if (!insideDirectory(resolvedCandidate, resolvedDirectory)) {
|
|
78
|
+
throw new InvalidRedesignPageOwnershipError(args.pageId, 'selected DraftCandidateRecord.outputPath resolves outside its owning child draft candidates directory');
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
/** Validate one page's draft, completion, and selected materialized candidate. */
|
|
82
|
+
export const verifyRedesignPageBranchInput = async (args) => {
|
|
83
|
+
const primary = redesignPrimaryPage(args.record.capture?.pages ?? []);
|
|
84
|
+
const pageId = args.page.id;
|
|
85
|
+
let draft;
|
|
86
|
+
let pick;
|
|
87
|
+
try {
|
|
88
|
+
draft = draftForPage(args.record, pageId);
|
|
89
|
+
pick = pickForPage(args.record, pageId);
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
throw new InvalidRedesignPageOwnershipError(pageId, error instanceof Error ? error.message : String(error));
|
|
93
|
+
}
|
|
94
|
+
const paths = draftPaths(draft.runDir);
|
|
95
|
+
const draftRecord = await readJson(paths.draftRecord, pageId, 'draft record');
|
|
96
|
+
if (!validDraftRecord(draftRecord)) {
|
|
97
|
+
throw new InvalidRedesignPageOwnershipError(pageId, 'draft record has no complete hosted/source identity');
|
|
98
|
+
}
|
|
99
|
+
if (!samePath(draftRecord.runDir, draft.runDir)) {
|
|
100
|
+
throw new InvalidRedesignPageOwnershipError(pageId, 'draft record runDir differs from parent draft entry');
|
|
101
|
+
}
|
|
102
|
+
if (draftRecord.hosted.runId !== draft.runId) {
|
|
103
|
+
throw new InvalidRedesignPageOwnershipError(pageId, 'draft record hosted run ID differs from parent draft entry');
|
|
104
|
+
}
|
|
105
|
+
const source = draftRecord.redesignSource;
|
|
106
|
+
if (!source) {
|
|
107
|
+
throw new InvalidRedesignPageOwnershipError(pageId, 'draft record has no redesign source');
|
|
108
|
+
}
|
|
109
|
+
if (source.sha256 !== args.page.sha256) {
|
|
110
|
+
throw new InvalidRedesignPageOwnershipError(pageId, 'draft source digest differs from captured page');
|
|
111
|
+
}
|
|
112
|
+
if (!samePath(source.path, args.page.path)) {
|
|
113
|
+
throw new InvalidRedesignPageOwnershipError(pageId, 'draft source path differs from captured page');
|
|
114
|
+
}
|
|
115
|
+
if (args.page.id !== primary.id && draftRecord.pageRoute !== args.page.url) {
|
|
116
|
+
throw new InvalidRedesignPageOwnershipError(pageId, 'non-primary draft route differs from captured page URL');
|
|
117
|
+
}
|
|
118
|
+
if (args.page.id === primary.id && draftRecord.pageRoute !== undefined
|
|
119
|
+
&& draftRecord.pageRoute !== args.page.url) {
|
|
120
|
+
throw new InvalidRedesignPageOwnershipError(pageId, 'primary draft route differs from captured page URL');
|
|
121
|
+
}
|
|
122
|
+
const candidate = draftRecord.hosted.candidates.find((entry) => (isRecord(entry)
|
|
123
|
+
&& entry.id === pick.slot
|
|
124
|
+
&& typeof entry.slot === 'string'
|
|
125
|
+
&& typeof entry.outputPath === 'string'));
|
|
126
|
+
if (!candidate || typeof candidate.slot !== 'string' || typeof candidate.outputPath !== 'string') {
|
|
127
|
+
throw new InvalidRedesignPageOwnershipError(pageId, 'selected slot is absent from the draft run');
|
|
128
|
+
}
|
|
129
|
+
await assertOwnedCandidatePath({
|
|
130
|
+
pageId,
|
|
131
|
+
candidatePath: candidate.outputPath,
|
|
132
|
+
candidatesDirectory: paths.candidatesDir,
|
|
133
|
+
});
|
|
134
|
+
const completion = await readJson(paths.completion, pageId, 'draft completion');
|
|
135
|
+
if (!validDraftCompletion(completion)) {
|
|
136
|
+
throw new InvalidRedesignPageOwnershipError(pageId, 'draft completion has no run ID or candidates');
|
|
137
|
+
}
|
|
138
|
+
if (completion.runId !== draft.runId) {
|
|
139
|
+
throw new InvalidRedesignPageOwnershipError(pageId, 'draft completion run ID differs from parent draft entry');
|
|
140
|
+
}
|
|
141
|
+
const materialized = completion.candidates.find((entry) => (isRecord(entry)
|
|
142
|
+
&& entry.slot === candidate.slot
|
|
143
|
+
&& typeof entry.path === 'string'
|
|
144
|
+
&& typeof entry.sha256 === 'string'
|
|
145
|
+
&& typeof entry.bytes === 'number'
|
|
146
|
+
&& Number.isInteger(entry.bytes)
|
|
147
|
+
&& entry.bytes >= 0));
|
|
148
|
+
if (!materialized) {
|
|
149
|
+
throw new InvalidRedesignPageOwnershipError(pageId, 'selected draft candidate is not materialized');
|
|
150
|
+
}
|
|
151
|
+
if (!samePath(materialized.path, candidate.outputPath)
|
|
152
|
+
|| !samePath(pick.imagePath, candidate.outputPath)
|
|
153
|
+
|| materialized.sha256 !== pick.sha256) {
|
|
154
|
+
throw new InvalidRedesignPageOwnershipError(pageId, 'parent pick or completion differs from this draft run\'s selected DraftCandidateRecord.outputPath');
|
|
155
|
+
}
|
|
156
|
+
const onDisk = await materializedCandidateDigest({ file: candidate.outputPath, pageId });
|
|
157
|
+
if (onDisk.sha256 !== materialized.sha256 || onDisk.sha256 !== pick.sha256
|
|
158
|
+
|| onDisk.bytes !== materialized.bytes) {
|
|
159
|
+
throw new InvalidRedesignPageOwnershipError(pageId, 'selected DraftCandidateRecord.outputPath digest or byte count differs from its completion/pick proof');
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
page: args.page,
|
|
163
|
+
draft,
|
|
164
|
+
pick,
|
|
165
|
+
winner: {
|
|
166
|
+
path: candidate.outputPath,
|
|
167
|
+
sha256: onDisk.sha256,
|
|
168
|
+
bytes: onDisk.bytes,
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
};
|
|
172
|
+
/** Validate every pending branch input before any page is allowed to dispatch. */
|
|
173
|
+
export const verifyRedesignPageBranchInputs = async (args) => Promise.all(args.pages.map((page) => verifyRedesignPageBranchInput({ record: args.record, page })));
|
|
174
|
+
//# sourceMappingURL=redesign-page-ownership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redesign-page-ownership.js","sourceRoot":"","sources":["../src/redesign-page-ownership.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,5 +4,7 @@ import type { HostedRedesignPlanRequest } from './redesign-plan-client.js';
|
|
|
4
4
|
* capture facts it may use, so an interrupted request can replay without
|
|
5
5
|
* deriving a new direction plan or silently moving to changed page evidence.
|
|
6
6
|
*/
|
|
7
|
-
export declare const redesignPlanIdempotencyKey: (request: HostedRedesignPlanRequest
|
|
7
|
+
export declare const redesignPlanIdempotencyKey: (request: HostedRedesignPlanRequest, options?: {
|
|
8
|
+
redrawGeneration?: number;
|
|
9
|
+
}) => string;
|
|
8
10
|
//# sourceMappingURL=redesign-plan-identity.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redesign-plan-identity.d.ts","sourceRoot":"","sources":["../src/redesign-plan-identity.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAE3E;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,
|
|
1
|
+
{"version":3,"file":"redesign-plan-identity.d.ts","sourceRoot":"","sources":["../src/redesign-plan-identity.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAE3E;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,GACrC,SAAS,yBAAyB,EAClC,UAAS;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAO,KAC1C,MAUF,CAAC"}
|
|
@@ -4,11 +4,14 @@ import { createHash } from 'node:crypto';
|
|
|
4
4
|
* capture facts it may use, so an interrupted request can replay without
|
|
5
5
|
* deriving a new direction plan or silently moving to changed page evidence.
|
|
6
6
|
*/
|
|
7
|
-
export const redesignPlanIdempotencyKey = (request) => {
|
|
7
|
+
export const redesignPlanIdempotencyKey = (request, options = {}) => {
|
|
8
8
|
const digest = createHash('sha256').update(JSON.stringify({
|
|
9
9
|
direction: request.direction,
|
|
10
10
|
capture: request.capture ?? null,
|
|
11
11
|
referenceImageAttached: request.referenceImageAttached,
|
|
12
|
+
...(options.redrawGeneration && options.redrawGeneration > 0
|
|
13
|
+
? { redrawGeneration: options.redrawGeneration }
|
|
14
|
+
: {}),
|
|
12
15
|
})).digest('hex');
|
|
13
16
|
return `redesign-plan:v1:${digest}`;
|
|
14
17
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redesign-plan-identity.js","sourceRoot":"","sources":["../src/redesign-plan-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,
|
|
1
|
+
{"version":3,"file":"redesign-plan-identity.js","sourceRoot":"","sources":["../src/redesign-plan-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,OAAkC,EAClC,UAAyC,EAAE,EACnC,EAAE;IACV,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;QACxD,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;QAChC,sBAAsB,EAAE,OAAO,CAAC,sBAAsB;QACtD,GAAG,CAAC,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,GAAG,CAAC;YAC1D,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE;YAChD,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClB,OAAO,oBAAoB,MAAM,EAAE,CAAC;AACtC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redesign-plan.d.ts","sourceRoot":"","sources":["../src/redesign-plan.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAgC7D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,eAAe,CAAC;IACjC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,MAAM;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,eAAe,CAAC;CAClC,KAAG,
|
|
1
|
+
{"version":3,"file":"redesign-plan.d.ts","sourceRoot":"","sources":["../src/redesign-plan.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAgC7D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,eAAe,CAAC;IACjC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,MAAM;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,eAAe,CAAC;CAClC,KAAG,YA+EH,CAAC"}
|
package/dist/redesign-plan.js
CHANGED
|
@@ -50,16 +50,18 @@ export const buildRedesignPlan = (args) => {
|
|
|
50
50
|
{
|
|
51
51
|
stage: 'draft',
|
|
52
52
|
paid: true,
|
|
53
|
-
wouldBuy: `${args.
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
wouldBuy: `${args.pageCount} hosted draft draw(s) of ${args.candidateCount} candidate(s) each,`
|
|
54
|
+
+ ' one captured reference image per page',
|
|
55
|
+
typicalSeconds: OPERATION_DURATION_HINTS.hostedDraftCandidate
|
|
56
|
+
* Math.ceil(args.pageCount / BRANCH_PAGE_CONCURRENCY_DEFAULT),
|
|
57
|
+
plannedCostUsd: usd(args.pageCount * (CORPUS_SEARCH_CEILING_USD
|
|
56
58
|
+ DRAFT_DIRECTIONS_CEILING_USD
|
|
57
|
-
+ args.candidateCount * DRAFT_CANDIDATE_PRICE_USD),
|
|
59
|
+
+ args.candidateCount * DRAFT_CANDIDATE_PRICE_USD)),
|
|
58
60
|
},
|
|
59
61
|
{
|
|
60
62
|
stage: 'pick',
|
|
61
63
|
paid: false,
|
|
62
|
-
wouldBuy: 'nothing — selects one already-generated candidate by --slot',
|
|
64
|
+
wouldBuy: 'nothing — selects one already-generated candidate by --slot on every page\'s draw',
|
|
63
65
|
typicalSeconds: 1,
|
|
64
66
|
plannedCostUsd: 0,
|
|
65
67
|
},
|
|
@@ -68,7 +70,11 @@ export const buildRedesignPlan = (args) => {
|
|
|
68
70
|
paid: true,
|
|
69
71
|
wouldBuy: `${args.pageCount} branch execute run(s) (scope page, --convert html --prototype),`
|
|
70
72
|
+ ` capped at ${args.maxScreens} generated continuation screen(s) per captured page`,
|
|
71
|
-
|
|
73
|
+
// Per-page branch children use the same bounded outer concurrency as
|
|
74
|
+
// draft. Reporting serial wall time here made a three-page dry run look
|
|
75
|
+
// three times slower than the command can actually execute.
|
|
76
|
+
typicalSeconds: branchEstimate.ceiling
|
|
77
|
+
* Math.ceil(args.pageCount / BRANCH_PAGE_CONCURRENCY_DEFAULT),
|
|
72
78
|
plannedCostUsd: usd(args.pageCount * (BRANCH_PLAN_CEILING_USD
|
|
73
79
|
+ args.maxScreens * BRANCH_IMAGE_CEILING_USD
|
|
74
80
|
+ (args.maxScreens + 1) * CONVERSION_PRICE_USD[args.conversionModel]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redesign-plan.js","sourceRoot":"","sources":["../src/redesign-plan.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,EAC/B,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAI3B;;;;;;;;;;GAUG;AAEH,MAAM,yBAAyB,GAAG,MAAM,CAAC;AACzC,0EAA0E;AAC1E,MAAM,mCAAmC,GAAG,IAAI,CAAC;AACjD,iFAAiF;AACjF,MAAM,4BAA4B,GAAG,IAAI,CAAC;AAC1C,MAAM,yBAAyB,GAAG,IAAI,CAAC;AACvC,0EAA0E;AAC1E,MAAM,wBAAwB,GAAG,GAAG,CAAC;AACrC,MAAM,uBAAuB,GAAG,IAAI,CAAC;AACrC,MAAM,oBAAoB,GAAoC;IAC5D,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,IAAI;IACd,GAAG,EAAE,GAAG;CACT,CAAC;AACF,MAAM,2BAA2B,GAAG,IAAI,CAAC;AAEzC,MAAM,GAAG,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAuBhE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAOjC,EAAgB,EAAE;IACjB,MAAM,cAAc,GAAG,wBAAwB,CAAC;QAC9C,KAAK,EAAE,CAAC;QACR,WAAW,EAAE,+BAA+B;QAC5C,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IACH,MAAM,MAAM,GAAwB;QAClC;YACE,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,mBAAmB,IAAI,CAAC,SAAS,iDAAiD;YAC5F,cAAc,EAAE,IAAI,CAAC,SAAS,GAAG,CAAC;YAClC,cAAc,EAAE,CAAC;SAClB;QACD;YACE,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,0EAA0E;YACpF,cAAc,EAAE,wBAAwB,CAAC,qBAAqB;YAC9D,cAAc,EAAE,mCAAmC;SACpD;QACD;YACE,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,GAAG,IAAI,CAAC,cAAc,
|
|
1
|
+
{"version":3,"file":"redesign-plan.js","sourceRoot":"","sources":["../src/redesign-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { RedesignRecord } from './redesign-workspace.js';
|
|
2
|
+
/** Validate every field used to resume or attribute spend before projecting it. */
|
|
3
|
+
export declare const assertValidRedesignRecord: (value: unknown) => asserts value is RedesignRecord;
|
|
4
|
+
//# sourceMappingURL=redesign-record-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redesign-record-validation.d.ts","sourceRoot":"","sources":["../src/redesign-record-validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAoL9D,mFAAmF;AACnF,eAAO,MAAM,yBAAyB,EAAE,CACtC,KAAK,EAAE,OAAO,KACX,OAAO,CAAC,KAAK,IAAI,cAqCrB,CAAC"}
|