@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.
Files changed (110) hide show
  1. package/SKILL.md +1 -1
  2. package/dist/atomic-file-replace.d.ts +21 -0
  3. package/dist/atomic-file-replace.d.ts.map +1 -0
  4. package/dist/atomic-file-replace.js +48 -0
  5. package/dist/atomic-file-replace.js.map +1 -0
  6. package/dist/cli-conversion-derivation.d.ts +14 -1
  7. package/dist/cli-conversion-derivation.d.ts.map +1 -1
  8. package/dist/cli-conversion-derivation.js +12 -5
  9. package/dist/cli-conversion-derivation.js.map +1 -1
  10. package/dist/cli-convert-command.d.ts.map +1 -1
  11. package/dist/cli-convert-command.js +13 -4
  12. package/dist/cli-convert-command.js.map +1 -1
  13. package/dist/cli-draft-command.d.ts +7 -0
  14. package/dist/cli-draft-command.d.ts.map +1 -1
  15. package/dist/cli-draft-command.js +21 -8
  16. package/dist/cli-draft-command.js.map +1 -1
  17. package/dist/cli-help/design.js +2 -2
  18. package/dist/cli-help/design.js.map +1 -1
  19. package/dist/cli-improve-command.d.ts.map +1 -1
  20. package/dist/cli-improve-command.js +36 -3
  21. package/dist/cli-improve-command.js.map +1 -1
  22. package/dist/cli-redesign-command.d.ts.map +1 -1
  23. package/dist/cli-redesign-command.js +177 -138
  24. package/dist/cli-redesign-command.js.map +1 -1
  25. package/dist/conversion-client.d.ts +48 -10
  26. package/dist/conversion-client.d.ts.map +1 -1
  27. package/dist/conversion-client.js +92 -20
  28. package/dist/conversion-client.js.map +1 -1
  29. package/dist/corpus-client.d.ts +5 -0
  30. package/dist/corpus-client.d.ts.map +1 -1
  31. package/dist/corpus-client.js +14 -1
  32. package/dist/corpus-client.js.map +1 -1
  33. package/dist/draft-identity.d.ts +7 -0
  34. package/dist/draft-identity.d.ts.map +1 -1
  35. package/dist/draft-identity.js +4 -0
  36. package/dist/draft-identity.js.map +1 -1
  37. package/dist/draft-run.d.ts +7 -0
  38. package/dist/draft-run.d.ts.map +1 -1
  39. package/dist/draft-run.js +8 -0
  40. package/dist/draft-run.js.map +1 -1
  41. package/dist/draft-workspace.d.ts +4 -0
  42. package/dist/draft-workspace.d.ts.map +1 -1
  43. package/dist/draft-workspace.js.map +1 -1
  44. package/dist/hosted-draft-identity.d.ts +10 -0
  45. package/dist/hosted-draft-identity.d.ts.map +1 -1
  46. package/dist/hosted-draft-identity.js +7 -0
  47. package/dist/hosted-draft-identity.js.map +1 -1
  48. package/dist/hosted-draft-run.d.ts +15 -0
  49. package/dist/hosted-draft-run.d.ts.map +1 -1
  50. package/dist/hosted-draft-run.js +27 -0
  51. package/dist/hosted-draft-run.js.map +1 -1
  52. package/dist/improve-conversion-stage.d.ts.map +1 -1
  53. package/dist/improve-conversion-stage.js +8 -4
  54. package/dist/improve-conversion-stage.js.map +1 -1
  55. package/dist/improve-convert-resilience.d.ts +1 -0
  56. package/dist/improve-convert-resilience.d.ts.map +1 -1
  57. package/dist/improve-convert-resilience.js +22 -4
  58. package/dist/improve-convert-resilience.js.map +1 -1
  59. package/dist/improve-core/improve-concept.d.ts +5 -1
  60. package/dist/improve-core/improve-concept.d.ts.map +1 -1
  61. package/dist/improve-core/improve-concept.js +11 -6
  62. package/dist/improve-core/improve-concept.js.map +1 -1
  63. package/dist/redesign-branch-adoption.d.ts +29 -0
  64. package/dist/redesign-branch-adoption.d.ts.map +1 -0
  65. package/dist/redesign-branch-adoption.js +183 -0
  66. package/dist/redesign-branch-adoption.js.map +1 -0
  67. package/dist/redesign-branch-identity.d.ts +23 -0
  68. package/dist/redesign-branch-identity.d.ts.map +1 -0
  69. package/dist/redesign-branch-identity.js +27 -0
  70. package/dist/redesign-branch-identity.js.map +1 -0
  71. package/dist/redesign-branch-record-verification.d.ts +51 -0
  72. package/dist/redesign-branch-record-verification.d.ts.map +1 -0
  73. package/dist/redesign-branch-record-verification.js +127 -0
  74. package/dist/redesign-branch-record-verification.js.map +1 -0
  75. package/dist/redesign-branch-stage.d.ts +17 -0
  76. package/dist/redesign-branch-stage.d.ts.map +1 -0
  77. package/dist/redesign-branch-stage.js +218 -0
  78. package/dist/redesign-branch-stage.js.map +1 -0
  79. package/dist/redesign-page-candidates.d.ts +40 -0
  80. package/dist/redesign-page-candidates.d.ts.map +1 -0
  81. package/dist/redesign-page-candidates.js +131 -0
  82. package/dist/redesign-page-candidates.js.map +1 -0
  83. package/dist/redesign-page-ownership.d.ts +36 -0
  84. package/dist/redesign-page-ownership.d.ts.map +1 -0
  85. package/dist/redesign-page-ownership.js +174 -0
  86. package/dist/redesign-page-ownership.js.map +1 -0
  87. package/dist/redesign-plan-identity.d.ts +3 -1
  88. package/dist/redesign-plan-identity.d.ts.map +1 -1
  89. package/dist/redesign-plan-identity.js +4 -1
  90. package/dist/redesign-plan-identity.js.map +1 -1
  91. package/dist/redesign-plan.d.ts.map +1 -1
  92. package/dist/redesign-plan.js +12 -6
  93. package/dist/redesign-plan.js.map +1 -1
  94. package/dist/redesign-record-validation.d.ts +4 -0
  95. package/dist/redesign-record-validation.d.ts.map +1 -0
  96. package/dist/redesign-record-validation.js +210 -0
  97. package/dist/redesign-record-validation.js.map +1 -0
  98. package/dist/redesign-workspace.d.ts +30 -5
  99. package/dist/redesign-workspace.d.ts.map +1 -1
  100. package/dist/redesign-workspace.js +52 -7
  101. package/dist/redesign-workspace.js.map +1 -1
  102. package/dist/run-journal.d.ts +3 -1
  103. package/dist/run-journal.d.ts.map +1 -1
  104. package/dist/run-journal.js +7 -1
  105. package/dist/run-journal.js.map +1 -1
  106. package/dist/spend-run-filter.d.ts.map +1 -1
  107. package/dist/spend-run-filter.js +3 -1
  108. package/dist/spend-run-filter.js.map +1 -1
  109. package/open-design.json +2 -2
  110. 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"}