@12ui/design 0.2.12 → 0.2.13

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 (54) hide show
  1. package/README.md +9 -0
  2. package/dist/cli-arguments.d.ts.map +1 -1
  3. package/dist/cli-arguments.js +1 -0
  4. package/dist/cli-arguments.js.map +1 -1
  5. package/dist/cli-image-batch-command.d.ts.map +1 -1
  6. package/dist/cli-image-batch-command.js +104 -53
  7. package/dist/cli-image-batch-command.js.map +1 -1
  8. package/dist/cli-image-batch-materialize.d.ts +27 -0
  9. package/dist/cli-image-batch-materialize.d.ts.map +1 -0
  10. package/dist/cli-image-batch-materialize.js +41 -0
  11. package/dist/cli-image-batch-materialize.js.map +1 -0
  12. package/dist/cli-image-batch-resume.d.ts +27 -0
  13. package/dist/cli-image-batch-resume.d.ts.map +1 -0
  14. package/dist/cli-image-batch-resume.js +158 -0
  15. package/dist/cli-image-batch-resume.js.map +1 -0
  16. package/dist/cli-image-command.d.ts.map +1 -1
  17. package/dist/cli-image-command.js +14 -2
  18. package/dist/cli-image-command.js.map +1 -1
  19. package/dist/cli.js +1 -1
  20. package/dist/image-generation-batch-attempt.d.ts +28 -0
  21. package/dist/image-generation-batch-attempt.d.ts.map +1 -0
  22. package/dist/image-generation-batch-attempt.js +48 -0
  23. package/dist/image-generation-batch-attempt.js.map +1 -0
  24. package/dist/image-generation-completion.d.ts +43 -0
  25. package/dist/image-generation-completion.d.ts.map +1 -0
  26. package/dist/image-generation-completion.js +54 -0
  27. package/dist/image-generation-completion.js.map +1 -0
  28. package/dist/image-generation-fs.d.ts +3 -0
  29. package/dist/image-generation-fs.d.ts.map +1 -0
  30. package/dist/image-generation-fs.js +23 -0
  31. package/dist/image-generation-fs.js.map +1 -0
  32. package/dist/image-generation-request.d.ts +13 -3
  33. package/dist/image-generation-request.d.ts.map +1 -1
  34. package/dist/image-generation-request.js +21 -19
  35. package/dist/image-generation-request.js.map +1 -1
  36. package/dist/image-generation-resume.d.ts +36 -0
  37. package/dist/image-generation-resume.d.ts.map +1 -0
  38. package/dist/image-generation-resume.js +83 -0
  39. package/dist/image-generation-resume.js.map +1 -0
  40. package/dist/image-generation-run.d.ts +11 -0
  41. package/dist/image-generation-run.d.ts.map +1 -1
  42. package/dist/image-generation-run.js +23 -9
  43. package/dist/image-generation-run.js.map +1 -1
  44. package/dist/image-generation-staging.d.ts +25 -0
  45. package/dist/image-generation-staging.d.ts.map +1 -0
  46. package/dist/image-generation-staging.js +80 -0
  47. package/dist/image-generation-staging.js.map +1 -0
  48. package/dist/legacy-skill-catalog.d.ts.map +1 -1
  49. package/dist/legacy-skill-catalog.js +18 -0
  50. package/dist/legacy-skill-catalog.js.map +1 -1
  51. package/package.json +1 -1
  52. package/skills/design/SKILL.md +49 -8
  53. package/skills/design/references/selection-contract.md +16 -0
  54. package/skills/design-convert/SKILL.md +17 -1
@@ -1 +1 @@
1
- {"version":3,"file":"cli-image-command.js","sourceRoot":"","sources":["../src/cli-image-command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-image-command.js","sourceRoot":"","sources":["../src/cli-image-command.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -37,7 +37,7 @@ const usage = (exitCode = 1) => {
37
37
  12ui corpus inspire --query <text>|--query-file <file> --out-dir <directory> [--mode direct|balanced|adventurer] [--count <1-48>] [--reference-image <png|jpeg|webp>] [--idempotency-key <key>] [--origin <url>] [--api-key <key>]
38
38
  12ui corpus resume --out-dir <directory> [--origin <url>] [--api-key <key>]
39
39
  12ui image generate --prompt <text>|--prompt-file <file> --reference <file> --out <file.png> [--aspect landscape|portrait|square] [--reference-mode inspiration|preserve-structure] [--provider auto|codex|openai] --project-root <directory> --idempotency-key <key>
40
- 12ui image generate-batch --manifest <batch.json>
40
+ 12ui image generate-batch --manifest <batch.json> [--resume]
41
41
  12ui capabilities [--json]
42
42
  12ui convert <image.png|jpg|webp|layerdoc.json> --output ${outputs} [--model fast|standard|pro] [--width <px>] [--export html] [--export-quality standard|pro] [--export-out <file>] [--responsive-quality standard|pro] [--profile <json|file>] [--out <file>] [--detach] [--quiet] [--timeout-ms <ms>] [--idempotency-key <key>] [--origin <url>] [--api-key <key>]
43
43
  12ui export <source-conversion-id> --output <comma-separated-formats> --out-dir <directory> --idempotency-key <key> [--responsive-quality standard|pro] [--web-profile <json|file>] [--app-profile <json|file>] [--timeout-ms <ms>] [--origin <url>] [--api-key <key>]
@@ -0,0 +1,28 @@
1
+ import type { ImageGenerationResult } from './image-generation-run.js';
2
+ import type { ImageGenerationBatchAccounting } from './image-generation-usage.js';
3
+ import type { ImageProviderPreflight } from './image-provider-preflight.js';
4
+ export type ImageBatchAttempt = {
5
+ version: 2;
6
+ status: 'prepared' | 'dispatched' | 'succeeded' | 'failed';
7
+ manifestPath: string;
8
+ manifestSha256: string;
9
+ projectRoot: string;
10
+ requestedProvider: 'auto' | 'codex' | 'openai';
11
+ provider: ImageProviderPreflight['provider'];
12
+ model: ImageProviderPreflight['model'];
13
+ referenceMode: 'inspiration' | 'preserve-structure';
14
+ candidateIds: string[];
15
+ candidateAttemptFiles: string[];
16
+ preparedAt: string;
17
+ dispatchedAt?: string;
18
+ completedAt?: string;
19
+ completionPath?: string;
20
+ resumedAt?: string[];
21
+ results?: ImageGenerationResult[];
22
+ accounting?: ImageGenerationBatchAccounting;
23
+ errors?: string[];
24
+ };
25
+ export declare const imageBatchAttemptPath: (manifestPath: string) => string;
26
+ export declare const writeBatchAttempt: (file: string, attempt: ImageBatchAttempt, exclusive?: boolean) => Promise<void>;
27
+ export declare const readBatchAttempt: (file: string) => Promise<ImageBatchAttempt | undefined>;
28
+ //# sourceMappingURL=image-generation-batch-attempt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-generation-batch-attempt.d.ts","sourceRoot":"","sources":["../src/image-generation-batch-attempt.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAE5E,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3D,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC/C,QAAQ,EAAE,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAC7C,KAAK,EAAE,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACvC,aAAa,EAAE,aAAa,GAAG,oBAAoB,CAAC;IACpD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAClC,UAAU,CAAC,EAAE,8BAA8B,CAAC;IAC5C,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,cAAc,MAAM,KAAG,MAE5D,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,MAAM,MAAM,EACZ,SAAS,iBAAiB,EAC1B,mBAAiB,KAChB,OAAO,CAAC,IAAI,CAqBd,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,MAAM,MAAM,KACX,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAevC,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ export const imageBatchAttemptPath = (manifestPath) => (`${manifestPath}.attempt.json`);
5
+ export const writeBatchAttempt = async (file, attempt, exclusive = false) => {
6
+ await mkdir(path.dirname(file), { recursive: true });
7
+ if (exclusive) {
8
+ await writeFile(file, `${JSON.stringify(attempt, null, 2)}\n`, {
9
+ encoding: 'utf8',
10
+ flag: 'wx',
11
+ mode: 0o600,
12
+ });
13
+ return;
14
+ }
15
+ const temporary = `${file}.${randomUUID()}.tmp`;
16
+ try {
17
+ await writeFile(temporary, `${JSON.stringify(attempt, null, 2)}\n`, {
18
+ encoding: 'utf8',
19
+ flag: 'wx',
20
+ mode: 0o600,
21
+ });
22
+ await rename(temporary, file);
23
+ }
24
+ finally {
25
+ await rm(temporary, { force: true });
26
+ }
27
+ };
28
+ export const readBatchAttempt = async (file) => {
29
+ let source;
30
+ try {
31
+ source = await readFile(file, 'utf8');
32
+ }
33
+ catch (error) {
34
+ if (error.code === 'ENOENT')
35
+ return undefined;
36
+ throw error;
37
+ }
38
+ try {
39
+ const value = JSON.parse(source);
40
+ if (typeof value !== 'object' || value === null)
41
+ return undefined;
42
+ return value;
43
+ }
44
+ catch {
45
+ return undefined;
46
+ }
47
+ };
48
+ //# sourceMappingURL=image-generation-batch-attempt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-generation-batch-attempt.js","sourceRoot":"","sources":["../src/image-generation-batch-attempt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,IAAI,MAAM,WAAW,CAAC;AA4B7B,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,YAAoB,EAAU,EAAE,CAAC,CACrE,GAAG,YAAY,eAAe,CAC/B,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,IAAY,EACZ,OAA0B,EAC1B,SAAS,GAAG,KAAK,EACF,EAAE;IACjB,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YAC7D,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,UAAU,EAAE,MAAM,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YAClE,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EACnC,IAAY,EAC4B,EAAE;IAC1C,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACzE,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAY,CAAC;QAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,SAAS,CAAC;QAClE,OAAO,KAA0B,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * The one file a caller may poll. It appears exactly once, only when the batch
3
+ * has reached a terminal state, and it names every candidate's status and
4
+ * sha256 — so "has generation finished?" stops being a guess made by listing a
5
+ * directory that is still being written.
6
+ */
7
+ export declare const IMAGE_BATCH_COMPLETION_FILENAME = "generation.complete.json";
8
+ export type ImageBatchCompletionCandidate = {
9
+ id: string;
10
+ status: 'succeeded' | 'failed' | 'missing';
11
+ outputPath: string;
12
+ attemptFile: string;
13
+ sha256?: string;
14
+ bytes?: number;
15
+ idempotencyKey?: string;
16
+ error?: string;
17
+ };
18
+ export type ImageBatchCompletion = {
19
+ version: 1;
20
+ status: 'succeeded' | 'failed';
21
+ manifestPath: string;
22
+ manifestSha256: string;
23
+ batchAttemptFile: string;
24
+ provider: string;
25
+ model: string;
26
+ resumed: boolean;
27
+ completedAt: string;
28
+ candidateCount: number;
29
+ succeededCount: number;
30
+ failedCount: number;
31
+ candidates: ImageBatchCompletionCandidate[];
32
+ };
33
+ export declare const imageBatchCompletionPath: (args: {
34
+ manifestPath: string;
35
+ outputPaths: readonly string[];
36
+ }) => string;
37
+ export declare const summarizeImageBatchCandidates: (candidates: readonly {
38
+ id: string;
39
+ outputPath: string;
40
+ idempotencyKey?: string;
41
+ }[]) => Promise<ImageBatchCompletionCandidate[]>;
42
+ export declare const writeImageBatchCompletion: (file: string, completion: ImageBatchCompletion) => Promise<void>;
43
+ //# sourceMappingURL=image-generation-completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-generation-completion.d.ts","sourceRoot":"","sources":["../src/image-generation-completion.ts"],"names":[],"mappings":"AAQA;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B,6BAA6B,CAAC;AAE1E,MAAM,MAAM,6BAA6B,GAAG;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,6BAA6B,EAAE,CAAC;CAC7C,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,MAAM;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC,KAAG,MAKH,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,YAAY,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,KACjF,OAAO,CAAC,6BAA6B,EAAE,CAkBvC,CAAC;AAEJ,eAAO,MAAM,yBAAyB,GACpC,MAAM,MAAM,EACZ,YAAY,oBAAoB,KAC/B,OAAO,CAAC,IAAI,CAad,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { mkdir, rename, rm, writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { imageAttemptPath } from './image-generation-evidence.js';
5
+ import { imageGenerationFileBytes, imageGenerationPathExists } from './image-generation-fs.js';
6
+ import { readImageGenerationAttemptFile } from './image-generation-staging.js';
7
+ /**
8
+ * The one file a caller may poll. It appears exactly once, only when the batch
9
+ * has reached a terminal state, and it names every candidate's status and
10
+ * sha256 — so "has generation finished?" stops being a guess made by listing a
11
+ * directory that is still being written.
12
+ */
13
+ export const IMAGE_BATCH_COMPLETION_FILENAME = 'generation.complete.json';
14
+ export const imageBatchCompletionPath = (args) => {
15
+ const directories = new Set(args.outputPaths.map((outputPath) => path.dirname(outputPath)));
16
+ const [only] = [...directories];
17
+ const base = directories.size === 1 && only ? only : path.dirname(args.manifestPath);
18
+ return path.join(base, IMAGE_BATCH_COMPLETION_FILENAME);
19
+ };
20
+ export const summarizeImageBatchCandidates = async (candidates) => Promise.all(candidates.map(async (candidate) => {
21
+ const attemptFile = imageAttemptPath(candidate.outputPath);
22
+ const [attempt, outputExists, bytes] = await Promise.all([
23
+ readImageGenerationAttemptFile(attemptFile),
24
+ imageGenerationPathExists(candidate.outputPath),
25
+ imageGenerationFileBytes(candidate.outputPath),
26
+ ]);
27
+ const succeeded = outputExists && attempt?.status === 'succeeded';
28
+ return {
29
+ id: candidate.id,
30
+ status: succeeded ? 'succeeded' : attempt?.status === 'failed' ? 'failed' : 'missing',
31
+ outputPath: candidate.outputPath,
32
+ attemptFile,
33
+ ...(attempt?.outputSha256 ? { sha256: attempt.outputSha256 } : {}),
34
+ ...(bytes === undefined ? {} : { bytes }),
35
+ ...(candidate.idempotencyKey ? { idempotencyKey: candidate.idempotencyKey } : {}),
36
+ ...(attempt?.error ? { error: attempt.error } : {}),
37
+ };
38
+ }));
39
+ export const writeImageBatchCompletion = async (file, completion) => {
40
+ await mkdir(path.dirname(file), { recursive: true });
41
+ const temporary = `${file}.${randomUUID()}.tmp`;
42
+ try {
43
+ await writeFile(temporary, `${JSON.stringify(completion, null, 2)}\n`, {
44
+ encoding: 'utf8',
45
+ flag: 'wx',
46
+ mode: 0o600,
47
+ });
48
+ await rename(temporary, file);
49
+ }
50
+ finally {
51
+ await rm(temporary, { force: true });
52
+ }
53
+ };
54
+ //# sourceMappingURL=image-generation-completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-generation-completion.js","sourceRoot":"","sources":["../src/image-generation-completion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const imageGenerationPathExists: (target: string) => Promise<boolean>;
2
+ export declare const imageGenerationFileBytes: (target: string) => Promise<number | undefined>;
3
+ //# sourceMappingURL=image-generation-fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-generation-fs.d.ts","sourceRoot":"","sources":["../src/image-generation-fs.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,yBAAyB,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC,OAAO,CAQ/E,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAOzF,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { lstat } from 'node:fs/promises';
2
+ export const imageGenerationPathExists = async (target) => {
3
+ try {
4
+ await lstat(target);
5
+ return true;
6
+ }
7
+ catch (error) {
8
+ if (error.code === 'ENOENT')
9
+ return false;
10
+ throw error;
11
+ }
12
+ };
13
+ export const imageGenerationFileBytes = async (target) => {
14
+ try {
15
+ return (await lstat(target)).size;
16
+ }
17
+ catch (error) {
18
+ if (error.code === 'ENOENT')
19
+ return undefined;
20
+ throw error;
21
+ }
22
+ };
23
+ //# sourceMappingURL=image-generation-fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-generation-fs.js","sourceRoot":"","sources":["../src/image-generation-fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,EAAE,MAAc,EAAoB,EAAE;IAClF,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACrE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,EAAE,MAAc,EAA+B,EAAE;IAC5F,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACzE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import type { ImageGenerationAttempt } from './image-generation-evidence.js';
2
+ import { type ImageGenerationStagedPaths } from './image-generation-staging.js';
2
3
  import type { ImageGenerationProvider } from './image-provider-preflight.js';
4
+ export { imageGenerationPathExists } from './image-generation-fs.js';
3
5
  export declare const IMAGE_GENERATION_ASPECTS: readonly ["landscape", "portrait", "square"];
4
6
  export type ImageGenerationAspect = (typeof IMAGE_GENERATION_ASPECTS)[number];
5
7
  export declare const IMAGE_GENERATION_REFERENCE_MODES: readonly ["inspiration", "preserve-structure"];
@@ -19,7 +21,7 @@ export type ImageGenerationRequest = {
19
21
  referenceMode: ImageGenerationReferenceMode;
20
22
  idempotencyKey: string;
21
23
  };
22
- export type PreparedImageGenerationRequest = ImageGenerationRequest & {
24
+ export type PreparedImageGenerationRequest = ImageGenerationRequest & ImageGenerationStagedPaths & {
23
25
  attemptFile: string;
24
26
  promptSha256: string;
25
27
  reference: {
@@ -28,6 +30,14 @@ export type PreparedImageGenerationRequest = ImageGenerationRequest & {
28
30
  dataUrl: string;
29
31
  };
30
32
  };
31
- export declare const imageGenerationPathExists: (target: string) => Promise<boolean>;
32
- export declare const prepareImageGenerationRequest: (request: ImageGenerationRequest) => Promise<PreparedImageGenerationRequest>;
33
+ export declare const prepareImageGenerationRequest: (request: ImageGenerationRequest, options?: {
34
+ /**
35
+ * `dispatch` refuses whenever any evidence of a previous attempt exists,
36
+ * which is what keeps a plain re-run from buying the same candidate twice.
37
+ * `resume` skips those refusals because the resume planner has already
38
+ * classified this candidate from that same evidence and proved either that
39
+ * nothing was billed or that the provider will honour the recorded key.
40
+ */
41
+ mode?: "dispatch" | "resume";
42
+ }) => Promise<PreparedImageGenerationRequest>;
33
43
  //# sourceMappingURL=image-generation-request.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"image-generation-request.d.ts","sourceRoot":"","sources":["../src/image-generation-request.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAG7E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAE7E,eAAO,MAAM,wBAAwB,8CAA+C,CAAC;AACrF,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAC9E,eAAO,MAAM,gCAAgC,gDAAiD,CAAC;AAC/F,MAAM,MAAM,4BAA4B,GAAG,CAAC,OAAO,gCAAgC,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7F,eAAO,MAAM,uBAAuB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,qBAGjE,CAAC;AAEF,eAAO,MAAM,8BAA8B,GACzC,OAAO,OAAO,KACb,KAAK,IAAI,4BAGX,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,OAAO,UAAU,GAAG,MAAM,KAAG,MAElE,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,sBAAsB,CAAC,cAAc,CAAC,CAAC;IACrD,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,uBAAuB,CAAC;IAClC,MAAM,EAAE,qBAAqB,CAAC;IAC9B,aAAa,EAAE,4BAA4B,CAAC;IAC5C,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG,sBAAsB,GAAG;IACpE,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC,OAAO,CAQ/E,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,SAAS,sBAAsB,KAC9B,OAAO,CAAC,8BAA8B,CA0BxC,CAAC"}
1
+ {"version":3,"file":"image-generation-request.d.ts","sourceRoot":"","sources":["../src/image-generation-request.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAI7E,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAE7E,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAErE,eAAO,MAAM,wBAAwB,8CAA+C,CAAC;AACrF,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAC9E,eAAO,MAAM,gCAAgC,gDAAiD,CAAC;AAC/F,MAAM,MAAM,4BAA4B,GAAG,CAAC,OAAO,gCAAgC,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7F,eAAO,MAAM,uBAAuB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,qBAGjE,CAAC;AAEF,eAAO,MAAM,8BAA8B,GACzC,OAAO,OAAO,KACb,KAAK,IAAI,4BAGX,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,OAAO,UAAU,GAAG,MAAM,KAAG,MAElE,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,sBAAsB,CAAC,cAAc,CAAC,CAAC;IACrD,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,uBAAuB,CAAC;IAClC,MAAM,EAAE,qBAAqB,CAAC;IAC9B,aAAa,EAAE,4BAA4B,CAAC;IAC5C,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG,sBAAsB,GAAG,0BAA0B,GAAG;IACjG,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,SAAS,sBAAsB,EAC/B,UAAS;IACP;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;CACzB,KACL,OAAO,CAAC,8BAA8B,CAsCxC,CAAC"}
@@ -1,8 +1,11 @@
1
1
  import { createHash } from 'node:crypto';
2
- import { lstat, mkdir, readFile } from 'node:fs/promises';
2
+ import { mkdir, readFile } from 'node:fs/promises';
3
3
  import path from 'node:path';
4
4
  import { imageAttemptPath } from './image-generation-evidence.js';
5
+ import { imageGenerationPathExists } from './image-generation-fs.js';
5
6
  import { referenceImageDataUrl } from './image-generation-output.js';
7
+ import { ensureImageGenerationStaging, imageGenerationStagedPaths, } from './image-generation-staging.js';
8
+ export { imageGenerationPathExists } from './image-generation-fs.js';
6
9
  export const IMAGE_GENERATION_ASPECTS = ['landscape', 'portrait', 'square'];
7
10
  export const IMAGE_GENERATION_REFERENCE_MODES = ['inspiration', 'preserve-structure'];
8
11
  export const isImageGenerationAspect = (value) => (typeof value === 'string'
@@ -10,33 +13,32 @@ export const isImageGenerationAspect = (value) => (typeof value === 'string'
10
13
  export const isImageGenerationReferenceMode = (value) => (typeof value === 'string'
11
14
  && IMAGE_GENERATION_REFERENCE_MODES.includes(value));
12
15
  export const imageGenerationSha256 = (value) => (createHash('sha256').update(value).digest('hex'));
13
- export const imageGenerationPathExists = async (target) => {
14
- try {
15
- await lstat(target);
16
- return true;
17
- }
18
- catch (error) {
19
- if (error.code === 'ENOENT')
20
- return false;
21
- throw error;
22
- }
23
- };
24
- export const prepareImageGenerationRequest = async (request) => {
16
+ export const prepareImageGenerationRequest = async (request, options = {}) => {
25
17
  if (path.extname(request.outputPath).toLowerCase() !== '.png') {
26
18
  throw new Error('Image output must end in .png because image generation always writes PNG bytes');
27
19
  }
28
20
  const attemptFile = imageAttemptPath(request.outputPath);
29
- if (await imageGenerationPathExists(request.outputPath)) {
30
- throw new Error(`Refusing to dispatch because output already exists at ${request.outputPath}`);
31
- }
32
- if (await imageGenerationPathExists(attemptFile)) {
33
- throw new Error(`Image attempt evidence already exists at ${attemptFile}. Refusing to redispatch an`
34
- + ' ambiguous or completed request; inspect it and use a new output/idempotency key.');
21
+ const staged = imageGenerationStagedPaths(request.outputPath);
22
+ if (options.mode !== 'resume') {
23
+ if (await imageGenerationPathExists(request.outputPath)) {
24
+ throw new Error(`Refusing to dispatch because output already exists at ${request.outputPath}`);
25
+ }
26
+ if (await imageGenerationPathExists(attemptFile)) {
27
+ throw new Error(`Image attempt evidence already exists at ${attemptFile}. Refusing to redispatch an`
28
+ + ' ambiguous or completed request; inspect it and use a new output/idempotency key.');
29
+ }
30
+ if (await imageGenerationPathExists(staged.stagedAttemptFile)) {
31
+ throw new Error(`Image attempt evidence already exists at ${staged.stagedAttemptFile}. Refusing to`
32
+ + ' redispatch an ambiguous or in-flight request; inspect it and either resume the batch'
33
+ + ' or use a new output/idempotency key.');
34
+ }
35
35
  }
36
36
  await mkdir(path.dirname(request.outputPath), { recursive: true });
37
+ await ensureImageGenerationStaging(request.outputPath);
37
38
  const referenceBytes = new Uint8Array(await readFile(request.referencePath));
38
39
  return {
39
40
  ...request,
41
+ ...staged,
40
42
  attemptFile,
41
43
  promptSha256: imageGenerationSha256(request.prompt),
42
44
  reference: {
@@ -1 +1 @@
1
- {"version":3,"file":"image-generation-request.js","sourceRoot":"","sources":["../src/image-generation-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAGrE,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,CAAU,CAAC;AAErF,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,aAAa,EAAE,oBAAoB,CAAU,CAAC;AAG/F,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,KAAc,EAAkC,EAAE,CAAC,CACzF,OAAO,KAAK,KAAK,QAAQ;OACrB,wBAA8C,CAAC,QAAQ,CAAC,KAAK,CAAC,CACnE,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAC5C,KAAc,EACyB,EAAE,CAAC,CAC1C,OAAO,KAAK,KAAK,QAAQ;OACrB,gCAAsD,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC3E,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAA0B,EAAU,EAAE,CAAC,CAC3E,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACjD,CAAC;AAyBF,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,EAAE,MAAc,EAAoB,EAAE;IAClF,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACrE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,6BAA6B,GAAG,KAAK,EAChD,OAA+B,EACU,EAAE;IAC3C,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAC;IACpG,CAAC;IACD,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACzD,IAAI,MAAM,yBAAyB,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,yDAAyD,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,IAAI,MAAM,yBAAyB,CAAC,WAAW,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CACb,4CAA4C,WAAW,6BAA6B;cAClF,mFAAmF,CACtF,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,MAAM,cAAc,GAAG,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;IAC7E,OAAO;QACL,GAAG,OAAO;QACV,WAAW;QACX,YAAY,EAAE,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC;QACnD,SAAS,EAAE;YACT,IAAI,EAAE,OAAO,CAAC,aAAa;YAC3B,MAAM,EAAE,qBAAqB,CAAC,cAAc,CAAC;YAC7C,OAAO,EAAE,MAAM,qBAAqB,CAAC,cAAc,EAAE,OAAO,CAAC,aAAa,CAAC;SAC5E;KACF,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"image-generation-request.js","sourceRoot":"","sources":["../src/image-generation-request.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { type ImageGenerationAttempt } from './image-generation-evidence.js';
2
+ /**
3
+ * What a resume is allowed to do with one candidate, decided only from durable
4
+ * evidence. The single invariant every disposition serves: a resume may finish
5
+ * delivering work that was already bought, and may start work that provably was
6
+ * not, but it may never buy the same candidate twice.
7
+ */
8
+ export type ImageGenerationResumeDisposition =
9
+ /** PNG and evidence are already in their destination. Nothing to do, nothing to buy. */
10
+ 'materialized'
11
+ /** The paid bytes are already on disk in staging. Move them into place; no provider call. */
12
+ | 'stageable'
13
+ /** Provably unbilled, or billed under a key the provider itself deduplicates. */
14
+ | 'redispatchable'
15
+ /** Billed and lost, with no free way to ask for it again. Refuse rather than re-buy. */
16
+ | 'unrecoverable';
17
+ export type ImageGenerationResumeState = {
18
+ candidateId?: string;
19
+ outputPath: string;
20
+ attemptFile: string;
21
+ disposition: ImageGenerationResumeDisposition;
22
+ reason: string;
23
+ attempt?: ImageGenerationAttempt;
24
+ };
25
+ export declare const classifyImageGenerationResume: (args: {
26
+ outputPath: string;
27
+ candidateId?: string;
28
+ }) => Promise<ImageGenerationResumeState>;
29
+ export declare const resumeStateSummary: (states: readonly ImageGenerationResumeState[]) => {
30
+ materialized: number;
31
+ stageable: number;
32
+ redispatchable: number;
33
+ unrecoverable: number;
34
+ };
35
+ export declare const describeResumeState: (state: ImageGenerationResumeState) => string;
36
+ //# sourceMappingURL=image-generation-resume.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-generation-resume.d.ts","sourceRoot":"","sources":["../src/image-generation-resume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAO/F;;;;;GAKG;AACH,MAAM,MAAM,gCAAgC;AAC1C,wFAAwF;AACtF,cAAc;AAChB,6FAA6F;GAC3F,WAAW;AACb,iFAAiF;GAC/E,gBAAgB;AAClB,wFAAwF;GACtF,eAAe,CAAC;AAEpB,MAAM,MAAM,0BAA0B,GAAG;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,gCAAgC,CAAC;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,sBAAsB,CAAC;CAClC,CAAC;AAEF,eAAO,MAAM,6BAA6B,GAAU,MAAM;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,KAAG,OAAO,CAAC,0BAA0B,CAuErC,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,QAAQ,SAAS,0BAA0B,EAAE,KAAG;IACjF,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CAMtB,CAAC;AAEH,eAAO,MAAM,mBAAmB,GAAI,OAAO,0BAA0B,KAAG,MAEvE,CAAC"}
@@ -0,0 +1,83 @@
1
+ import { imageAttemptPath } from './image-generation-evidence.js';
2
+ import { imageGenerationPathExists } from './image-generation-fs.js';
3
+ import { imageGenerationStagedPaths, readImageGenerationAttemptFile, } from './image-generation-staging.js';
4
+ export const classifyImageGenerationResume = async (args) => {
5
+ const attemptFile = imageAttemptPath(args.outputPath);
6
+ const staged = imageGenerationStagedPaths(args.outputPath);
7
+ const [outputExists, stagedOutputExists, finalAttempt, stagedAttempt] = await Promise.all([
8
+ imageGenerationPathExists(args.outputPath),
9
+ imageGenerationPathExists(staged.stagedOutputPath),
10
+ readImageGenerationAttemptFile(attemptFile),
11
+ readImageGenerationAttemptFile(staged.stagedAttemptFile),
12
+ ]);
13
+ const attempt = stagedAttempt ?? finalAttempt;
14
+ const base = {
15
+ ...(args.candidateId ? { candidateId: args.candidateId } : {}),
16
+ outputPath: args.outputPath,
17
+ attemptFile,
18
+ ...(attempt ? { attempt } : {}),
19
+ };
20
+ const stagingRemnant = stagedOutputExists || stagedAttempt !== undefined;
21
+ if (outputExists && finalAttempt && !stagingRemnant) {
22
+ return {
23
+ ...base,
24
+ disposition: 'materialized',
25
+ reason: 'the candidate and its evidence are already in place',
26
+ };
27
+ }
28
+ // Bytes on disk mean the call was already paid for and only delivery is
29
+ // outstanding — either the PNG is still staged, or it landed and its ledger
30
+ // entry did not.
31
+ if (stagedOutputExists || (outputExists && stagingRemnant)) {
32
+ return {
33
+ ...base,
34
+ disposition: 'stageable',
35
+ reason: 'the generated image is already on disk and only needs moving into place',
36
+ };
37
+ }
38
+ if (!attempt) {
39
+ return {
40
+ ...base,
41
+ disposition: 'redispatchable',
42
+ reason: 'no attempt evidence exists, so no provider call was ever reserved for it',
43
+ };
44
+ }
45
+ if (!attempt.providerStartedAt) {
46
+ return {
47
+ ...base,
48
+ disposition: 'redispatchable',
49
+ reason: 'the provider call was never started, so nothing was billed for it',
50
+ };
51
+ }
52
+ if (attempt.status === 'failed') {
53
+ return {
54
+ ...base,
55
+ disposition: 'unrecoverable',
56
+ reason: `the provider call failed after dispatch (${attempt.error ?? 'no recorded error'});`
57
+ + ' repeating it would be a second paid call',
58
+ };
59
+ }
60
+ if (attempt.providerIdempotencyEnforced) {
61
+ return {
62
+ ...base,
63
+ disposition: 'redispatchable',
64
+ reason: 'the provider enforces idempotency on the recorded key, so re-requesting the same'
65
+ + ' identity returns the same result without a second charge',
66
+ };
67
+ }
68
+ return {
69
+ ...base,
70
+ disposition: 'unrecoverable',
71
+ reason: `the ${attempt.provider} call was dispatched and its result was lost, and that provider`
72
+ + ' does not enforce idempotency on the recorded key, so re-requesting it would be a second'
73
+ + ' paid call; give this candidate a new output path and idempotency key to buy it again',
74
+ };
75
+ };
76
+ export const resumeStateSummary = (states) => ({
77
+ materialized: states.filter((state) => state.disposition === 'materialized').length,
78
+ stageable: states.filter((state) => state.disposition === 'stageable').length,
79
+ redispatchable: states.filter((state) => state.disposition === 'redispatchable').length,
80
+ unrecoverable: states.filter((state) => state.disposition === 'unrecoverable').length,
81
+ });
82
+ export const describeResumeState = (state) => (`${state.candidateId ?? state.outputPath}: ${state.disposition} — ${state.reason}`);
83
+ //# sourceMappingURL=image-generation-resume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-generation-resume.js","sourceRoot":"","sources":["../src/image-generation-resume.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,7 @@ export type ImageGenerationResult = {
18
18
  model: ImageGenerationAttempt['model'];
19
19
  outputPath: string;
20
20
  outputSha256: string;
21
+ outputBytes: number;
21
22
  attemptFile: string;
22
23
  providerStartedAt: string;
23
24
  completedAt: string;
@@ -29,6 +30,16 @@ export declare const reserveImageGeneration: (args: {
29
30
  batch?: ImageGenerationAttempt["batch"];
30
31
  dependencies?: ImageGenerationDependencies;
31
32
  }) => Promise<ReservedImageGeneration>;
33
+ /**
34
+ * Re-enter an existing candidate identity without minting a new ledger entry.
35
+ * The caller must already have proved, from that entry, that redispatching it
36
+ * cannot double-spend.
37
+ */
38
+ export declare const resumeReservedImageGeneration: (args: {
39
+ request: PreparedImageGenerationRequest;
40
+ preflight: ImageProviderPreflight;
41
+ attempt: ImageGenerationAttempt;
42
+ }) => ReservedImageGeneration;
32
43
  export declare const markImageGenerationDispatched: (reserved: ReservedImageGeneration, dependencies?: ImageGenerationDependencies) => Promise<void>;
33
44
  export declare const failImageGenerationBeforeDispatch: (reserved: ReservedImageGeneration, error: string, dependencies?: ImageGenerationDependencies) => Promise<void>;
34
45
  export declare const dispatchImageGeneration: (reserved: ReservedImageGeneration, dependencies?: ImageGenerationDependencies) => Promise<ImageGenerationResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"image-generation-run.d.ts","sourceRoot":"","sources":["../src/image-generation-run.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,aAAa,EAGd,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,gCAAgC,CAAC;AAMxC,OAAO,EAEL,KAAK,8BAA8B,EACpC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAGL,KAAK,4BAA4B,EAClC,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAE5E,MAAM,MAAM,2BAA2B,GAAG;IACxC,QAAQ,CAAC,EAAE,OAAO,aAAa,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,8BAA8B,CAAC;IACxC,SAAS,EAAE,sBAAsB,CAAC;IAClC,OAAO,EAAE,sBAAsB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAC7C,KAAK,EAAE,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,4BAA4B,CAAC;CACrC,CAAC;AAMF,eAAO,MAAM,sBAAsB,GAAU,MAAM;IACjD,OAAO,EAAE,8BAA8B,CAAC;IACxC,SAAS,EAAE,sBAAsB,CAAC;IAClC,KAAK,CAAC,EAAE,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACxC,YAAY,CAAC,EAAE,2BAA2B,CAAC;CAC5C,KAAG,OAAO,CAAC,uBAAuB,CAmClC,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,UAAU,uBAAuB,EACjC,eAAc,2BAAgC,KAC7C,OAAO,CAAC,IAAI,CAId,CAAC;AAEF,eAAO,MAAM,iCAAiC,GAC5C,UAAU,uBAAuB,EACjC,OAAO,MAAM,EACb,eAAc,2BAAgC,KAC7C,OAAO,CAAC,IAAI,CAKd,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,UAAU,uBAAuB,EACjC,eAAc,2BAAgC,KAC7C,OAAO,CAAC,qBAAqB,CA6F/B,CAAC"}
1
+ {"version":3,"file":"image-generation-run.d.ts","sourceRoot":"","sources":["../src/image-generation-run.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,aAAa,EAGd,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,gCAAgC,CAAC;AAMxC,OAAO,EAEL,KAAK,8BAA8B,EACpC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAGL,KAAK,4BAA4B,EAClC,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAE5E,MAAM,MAAM,2BAA2B,GAAG;IACxC,QAAQ,CAAC,EAAE,OAAO,aAAa,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,8BAA8B,CAAC;IACxC,SAAS,EAAE,sBAAsB,CAAC;IAClC,OAAO,EAAE,sBAAsB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAC7C,KAAK,EAAE,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,4BAA4B,CAAC;CACrC,CAAC;AAMF,eAAO,MAAM,sBAAsB,GAAU,MAAM;IACjD,OAAO,EAAE,8BAA8B,CAAC;IACxC,SAAS,EAAE,sBAAsB,CAAC;IAClC,KAAK,CAAC,EAAE,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACxC,YAAY,CAAC,EAAE,2BAA2B,CAAC;CAC5C,KAAG,OAAO,CAAC,uBAAuB,CAmClC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,GAAI,MAAM;IAClD,OAAO,EAAE,8BAA8B,CAAC;IACxC,SAAS,EAAE,sBAAsB,CAAC;IAClC,OAAO,EAAE,sBAAsB,CAAC;CACjC,KAAG,uBAIF,CAAC;AAEH,eAAO,MAAM,6BAA6B,GACxC,UAAU,uBAAuB,EACjC,eAAc,2BAAgC,KAC7C,OAAO,CAAC,IAAI,CAId,CAAC;AAEF,eAAO,MAAM,iCAAiC,GAC5C,UAAU,uBAAuB,EACjC,OAAO,MAAM,EACb,eAAc,2BAAgC,KAC7C,OAAO,CAAC,IAAI,CAKd,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,UAAU,uBAAuB,EACjC,eAAc,2BAAgC,KAC7C,OAAO,CAAC,qBAAqB,CAiG/B,CAAC"}