lootforge 0.3.0

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 (243) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/README.md +764 -0
  3. package/bin/lootforge.js +28 -0
  4. package/dist/benchmarks/coarseToFineCost.d.ts +21 -0
  5. package/dist/benchmarks/coarseToFineCost.js +49 -0
  6. package/dist/benchmarks/coarseToFineCost.js.map +1 -0
  7. package/dist/checks/boundaryMetrics.d.ts +12 -0
  8. package/dist/checks/boundaryMetrics.js +102 -0
  9. package/dist/checks/boundaryMetrics.js.map +1 -0
  10. package/dist/checks/candidateScore.d.ts +11 -0
  11. package/dist/checks/candidateScore.js +462 -0
  12. package/dist/checks/candidateScore.js.map +1 -0
  13. package/dist/checks/commandParser.d.ts +5 -0
  14. package/dist/checks/commandParser.js +99 -0
  15. package/dist/checks/commandParser.js.map +1 -0
  16. package/dist/checks/consistencyOutliers.d.ts +42 -0
  17. package/dist/checks/consistencyOutliers.js +156 -0
  18. package/dist/checks/consistencyOutliers.js.map +1 -0
  19. package/dist/checks/imageAcceptance.d.ts +67 -0
  20. package/dist/checks/imageAcceptance.js +967 -0
  21. package/dist/checks/imageAcceptance.js.map +1 -0
  22. package/dist/checks/packInvariants.d.ts +56 -0
  23. package/dist/checks/packInvariants.js +1064 -0
  24. package/dist/checks/packInvariants.js.map +1 -0
  25. package/dist/checks/softAdapters.d.ts +25 -0
  26. package/dist/checks/softAdapters.js +275 -0
  27. package/dist/checks/softAdapters.js.map +1 -0
  28. package/dist/checks/vlmGate.d.ts +8 -0
  29. package/dist/checks/vlmGate.js +200 -0
  30. package/dist/checks/vlmGate.js.map +1 -0
  31. package/dist/cli/commands/atlas.d.ts +5 -0
  32. package/dist/cli/commands/atlas.js +18 -0
  33. package/dist/cli/commands/atlas.js.map +1 -0
  34. package/dist/cli/commands/eval.d.ts +6 -0
  35. package/dist/cli/commands/eval.js +23 -0
  36. package/dist/cli/commands/eval.js.map +1 -0
  37. package/dist/cli/commands/generate.d.ts +18 -0
  38. package/dist/cli/commands/generate.js +66 -0
  39. package/dist/cli/commands/generate.js.map +1 -0
  40. package/dist/cli/commands/init.d.ts +15 -0
  41. package/dist/cli/commands/init.js +146 -0
  42. package/dist/cli/commands/init.js.map +1 -0
  43. package/dist/cli/commands/package.d.ts +6 -0
  44. package/dist/cli/commands/package.js +27 -0
  45. package/dist/cli/commands/package.js.map +1 -0
  46. package/dist/cli/commands/plan.d.ts +16 -0
  47. package/dist/cli/commands/plan.js +49 -0
  48. package/dist/cli/commands/plan.js.map +1 -0
  49. package/dist/cli/commands/process.d.ts +14 -0
  50. package/dist/cli/commands/process.js +29 -0
  51. package/dist/cli/commands/process.js.map +1 -0
  52. package/dist/cli/commands/regenerate.d.ts +29 -0
  53. package/dist/cli/commands/regenerate.js +244 -0
  54. package/dist/cli/commands/regenerate.js.map +1 -0
  55. package/dist/cli/commands/review.d.ts +5 -0
  56. package/dist/cli/commands/review.js +18 -0
  57. package/dist/cli/commands/review.js.map +1 -0
  58. package/dist/cli/commands/select.d.ts +6 -0
  59. package/dist/cli/commands/select.js +21 -0
  60. package/dist/cli/commands/select.js.map +1 -0
  61. package/dist/cli/commands/serve.d.ts +16 -0
  62. package/dist/cli/commands/serve.js +100 -0
  63. package/dist/cli/commands/serve.js.map +1 -0
  64. package/dist/cli/commands/validate.d.ts +17 -0
  65. package/dist/cli/commands/validate.js +108 -0
  66. package/dist/cli/commands/validate.js.map +1 -0
  67. package/dist/cli/index.d.ts +1 -0
  68. package/dist/cli/index.js +157 -0
  69. package/dist/cli/index.js.map +1 -0
  70. package/dist/cli/parseArgs.d.ts +3 -0
  71. package/dist/cli/parseArgs.js +37 -0
  72. package/dist/cli/parseArgs.js.map +1 -0
  73. package/dist/contracts/stageArtifacts.d.ts +4031 -0
  74. package/dist/contracts/stageArtifacts.js +663 -0
  75. package/dist/contracts/stageArtifacts.js.map +1 -0
  76. package/dist/manifest/load.d.ts +3 -0
  77. package/dist/manifest/load.js +50 -0
  78. package/dist/manifest/load.js.map +1 -0
  79. package/dist/manifest/normalize-palette.d.ts +17 -0
  80. package/dist/manifest/normalize-palette.js +235 -0
  81. package/dist/manifest/normalize-palette.js.map +1 -0
  82. package/dist/manifest/normalize-policy.d.ts +48 -0
  83. package/dist/manifest/normalize-policy.js +239 -0
  84. package/dist/manifest/normalize-policy.js.map +1 -0
  85. package/dist/manifest/normalize-prompt.d.ts +14 -0
  86. package/dist/manifest/normalize-prompt.js +73 -0
  87. package/dist/manifest/normalize-prompt.js.map +1 -0
  88. package/dist/manifest/normalize-target.d.ts +49 -0
  89. package/dist/manifest/normalize-target.js +542 -0
  90. package/dist/manifest/normalize-target.js.map +1 -0
  91. package/dist/manifest/schema.d.ts +7570 -0
  92. package/dist/manifest/schema.js +373 -0
  93. package/dist/manifest/schema.js.map +1 -0
  94. package/dist/manifest/semantic-validation.d.ts +4 -0
  95. package/dist/manifest/semantic-validation.js +526 -0
  96. package/dist/manifest/semantic-validation.js.map +1 -0
  97. package/dist/manifest/types.d.ts +263 -0
  98. package/dist/manifest/types.js +2 -0
  99. package/dist/manifest/types.js.map +1 -0
  100. package/dist/manifest/validate.d.ts +12 -0
  101. package/dist/manifest/validate.js +221 -0
  102. package/dist/manifest/validate.js.map +1 -0
  103. package/dist/output/assetPackManifest.d.ts +19 -0
  104. package/dist/output/assetPackManifest.js +20 -0
  105. package/dist/output/assetPackManifest.js.map +1 -0
  106. package/dist/output/catalog.d.ts +60 -0
  107. package/dist/output/catalog.js +107 -0
  108. package/dist/output/catalog.js.map +1 -0
  109. package/dist/output/contactSheet.d.ts +13 -0
  110. package/dist/output/contactSheet.js +124 -0
  111. package/dist/output/contactSheet.js.map +1 -0
  112. package/dist/output/phaserManifest.d.ts +8 -0
  113. package/dist/output/phaserManifest.js +25 -0
  114. package/dist/output/phaserManifest.js.map +1 -0
  115. package/dist/output/pixiManifest.d.ts +8 -0
  116. package/dist/output/pixiManifest.js +37 -0
  117. package/dist/output/pixiManifest.js.map +1 -0
  118. package/dist/output/provenance.d.ts +121 -0
  119. package/dist/output/provenance.js +10 -0
  120. package/dist/output/provenance.js.map +1 -0
  121. package/dist/output/runtimeManifests.d.ts +21 -0
  122. package/dist/output/runtimeManifests.js +82 -0
  123. package/dist/output/runtimeManifests.js.map +1 -0
  124. package/dist/output/unityImportManifest.d.ts +10 -0
  125. package/dist/output/unityImportManifest.js +58 -0
  126. package/dist/output/unityImportManifest.js.map +1 -0
  127. package/dist/output/zip.d.ts +5 -0
  128. package/dist/output/zip.js +68 -0
  129. package/dist/output/zip.js.map +1 -0
  130. package/dist/pipeline/atlas.d.ts +33 -0
  131. package/dist/pipeline/atlas.js +286 -0
  132. package/dist/pipeline/atlas.js.map +1 -0
  133. package/dist/pipeline/eval.d.ts +104 -0
  134. package/dist/pipeline/eval.js +246 -0
  135. package/dist/pipeline/eval.js.map +1 -0
  136. package/dist/pipeline/generate.d.ts +44 -0
  137. package/dist/pipeline/generate.js +1088 -0
  138. package/dist/pipeline/generate.js.map +1 -0
  139. package/dist/pipeline/package.d.ts +18 -0
  140. package/dist/pipeline/package.js +218 -0
  141. package/dist/pipeline/package.js.map +1 -0
  142. package/dist/pipeline/process.d.ts +15 -0
  143. package/dist/pipeline/process.js +776 -0
  144. package/dist/pipeline/process.js.map +1 -0
  145. package/dist/pipeline/review.d.ts +10 -0
  146. package/dist/pipeline/review.js +341 -0
  147. package/dist/pipeline/review.js.map +1 -0
  148. package/dist/pipeline/seamHeal.d.ts +2 -0
  149. package/dist/pipeline/seamHeal.js +70 -0
  150. package/dist/pipeline/seamHeal.js.map +1 -0
  151. package/dist/pipeline/select.d.ts +39 -0
  152. package/dist/pipeline/select.js +79 -0
  153. package/dist/pipeline/select.js.map +1 -0
  154. package/dist/providers/job.d.ts +29 -0
  155. package/dist/providers/job.js +113 -0
  156. package/dist/providers/job.js.map +1 -0
  157. package/dist/providers/localDiffusion.d.ts +28 -0
  158. package/dist/providers/localDiffusion.js +235 -0
  159. package/dist/providers/localDiffusion.js.map +1 -0
  160. package/dist/providers/nano.d.ts +36 -0
  161. package/dist/providers/nano.js +402 -0
  162. package/dist/providers/nano.js.map +1 -0
  163. package/dist/providers/openai.d.ts +37 -0
  164. package/dist/providers/openai.js +378 -0
  165. package/dist/providers/openai.js.map +1 -0
  166. package/dist/providers/policy.d.ts +9 -0
  167. package/dist/providers/policy.js +192 -0
  168. package/dist/providers/policy.js.map +1 -0
  169. package/dist/providers/prompt.d.ts +3 -0
  170. package/dist/providers/prompt.js +63 -0
  171. package/dist/providers/prompt.js.map +1 -0
  172. package/dist/providers/registry.d.ts +24 -0
  173. package/dist/providers/registry.js +92 -0
  174. package/dist/providers/registry.js.map +1 -0
  175. package/dist/providers/runtime.d.ts +15 -0
  176. package/dist/providers/runtime.js +101 -0
  177. package/dist/providers/runtime.js.map +1 -0
  178. package/dist/providers/runtimeConfig.d.ts +20 -0
  179. package/dist/providers/runtimeConfig.js +146 -0
  180. package/dist/providers/runtimeConfig.js.map +1 -0
  181. package/dist/providers/types-core.d.ts +514 -0
  182. package/dist/providers/types-core.js +60 -0
  183. package/dist/providers/types-core.js.map +1 -0
  184. package/dist/providers/types.d.ts +4 -0
  185. package/dist/providers/types.js +5 -0
  186. package/dist/providers/types.js.map +1 -0
  187. package/dist/service/generationRequest.d.ts +58 -0
  188. package/dist/service/generationRequest.js +203 -0
  189. package/dist/service/generationRequest.js.map +1 -0
  190. package/dist/service/providerCapabilities.d.ts +40 -0
  191. package/dist/service/providerCapabilities.js +114 -0
  192. package/dist/service/providerCapabilities.js.map +1 -0
  193. package/dist/service/server.d.ts +31 -0
  194. package/dist/service/server.js +774 -0
  195. package/dist/service/server.js.map +1 -0
  196. package/dist/shared/errors.d.ts +13 -0
  197. package/dist/shared/errors.js +24 -0
  198. package/dist/shared/errors.js.map +1 -0
  199. package/dist/shared/fs.d.ts +6 -0
  200. package/dist/shared/fs.js +30 -0
  201. package/dist/shared/fs.js.map +1 -0
  202. package/dist/shared/image.d.ts +25 -0
  203. package/dist/shared/image.js +136 -0
  204. package/dist/shared/image.js.map +1 -0
  205. package/dist/shared/paths.d.ts +30 -0
  206. package/dist/shared/paths.js +103 -0
  207. package/dist/shared/paths.js.map +1 -0
  208. package/dist/shared/schemas.d.ts +209 -0
  209. package/dist/shared/schemas.js +93 -0
  210. package/dist/shared/schemas.js.map +1 -0
  211. package/dist/shared/typeGuards.d.ts +1 -0
  212. package/dist/shared/typeGuards.js +4 -0
  213. package/dist/shared/typeGuards.js.map +1 -0
  214. package/dist/shared/zod.d.ts +1 -0
  215. package/dist/shared/zod.js +14 -0
  216. package/dist/shared/zod.js.map +1 -0
  217. package/dist/showcase/format.d.ts +9 -0
  218. package/dist/showcase/format.js +61 -0
  219. package/dist/showcase/format.js.map +1 -0
  220. package/dist/showcase/panelRenderer.d.ts +59 -0
  221. package/dist/showcase/panelRenderer.js +294 -0
  222. package/dist/showcase/panelRenderer.js.map +1 -0
  223. package/dist/showcase/releaseConfig.d.ts +233 -0
  224. package/dist/showcase/releaseConfig.js +75 -0
  225. package/dist/showcase/releaseConfig.js.map +1 -0
  226. package/dist/showcase/releaseEvidence.d.ts +25 -0
  227. package/dist/showcase/releaseEvidence.js +540 -0
  228. package/dist/showcase/releaseEvidence.js.map +1 -0
  229. package/dist/showcase/releaseEvidenceSchema.d.ts +1611 -0
  230. package/dist/showcase/releaseEvidenceSchema.js +165 -0
  231. package/dist/showcase/releaseEvidenceSchema.js.map +1 -0
  232. package/dist/showcase/scenarioRenderer.d.ts +19 -0
  233. package/dist/showcase/scenarioRenderer.js +488 -0
  234. package/dist/showcase/scenarioRenderer.js.map +1 -0
  235. package/docs/ADAPTER_CONTRACT.md +141 -0
  236. package/docs/ENGINE_TARGETING.md +86 -0
  237. package/docs/MANIFEST_POLICY_COVERAGE.md +130 -0
  238. package/docs/RELEASE_WORKFLOW.md +117 -0
  239. package/docs/ROADMAP.md +411 -0
  240. package/docs/ROADMAP_ISSUES.md +244 -0
  241. package/docs/SERVICE_MODE.md +137 -0
  242. package/docs/manifest-schema.md +254 -0
  243. package/package.json +70 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/pipeline/select.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { type NormalizedGenerationPolicy, type NormalizedOutputFormat, type PlannedTarget, type ProviderJob, type ProviderName, type ProviderSelection } from "./types-core.js";
2
+ export declare function stableSerialize(value: unknown): string;
3
+ export declare function sha256Hex(value: string): string;
4
+ export interface DeterministicJobIdParams {
5
+ provider: ProviderName;
6
+ targetId: string;
7
+ targetOut: string;
8
+ prompt: string;
9
+ model: string;
10
+ inputHash: string;
11
+ size: string;
12
+ quality: string;
13
+ background: string;
14
+ outputFormat: NormalizedOutputFormat;
15
+ candidateCount: number;
16
+ }
17
+ export declare function createDeterministicJobId(params: DeterministicJobIdParams): string;
18
+ export declare function createInputHash(target: PlannedTarget, policyOverride?: Partial<NormalizedGenerationPolicy>): string;
19
+ export declare function parseProviderSelection(value: string | undefined): ProviderSelection;
20
+ export interface CreateJobParams {
21
+ provider: ProviderName;
22
+ target: PlannedTarget;
23
+ model: string;
24
+ imagesDir: string;
25
+ defaults?: {
26
+ maxRetries?: number;
27
+ };
28
+ }
29
+ export declare function createProviderJob(params: CreateJobParams): ProviderJob;
@@ -0,0 +1,113 @@
1
+ import { createHash } from "node:crypto";
2
+ import { getTargetGenerationPolicy, isProviderName, normalizeGenerationPolicyForProvider, } from "./policy.js";
3
+ import { buildStructuredPrompt } from "./prompt.js";
4
+ import { resolvePathWithinDir } from "../shared/paths.js";
5
+ const DEFAULT_MAX_RETRIES = 1;
6
+ export function stableSerialize(value) {
7
+ if (value === null || typeof value !== "object") {
8
+ return JSON.stringify(value);
9
+ }
10
+ if (Array.isArray(value)) {
11
+ return `[${value.map((entry) => stableSerialize(entry)).join(",")}]`;
12
+ }
13
+ const objectValue = value;
14
+ const keys = Object.keys(objectValue).sort();
15
+ const body = keys
16
+ .map((key) => `${JSON.stringify(key)}:${stableSerialize(objectValue[key])}`)
17
+ .join(",");
18
+ return `{${body}}`;
19
+ }
20
+ export function sha256Hex(value) {
21
+ return createHash("sha256").update(value).digest("hex");
22
+ }
23
+ export function createDeterministicJobId(params) {
24
+ const source = stableSerialize({
25
+ provider: params.provider,
26
+ targetId: params.targetId,
27
+ targetOut: params.targetOut,
28
+ prompt: params.prompt,
29
+ model: params.model,
30
+ inputHash: params.inputHash,
31
+ size: params.size,
32
+ quality: params.quality,
33
+ background: params.background,
34
+ outputFormat: params.outputFormat,
35
+ candidateCount: params.candidateCount,
36
+ });
37
+ return sha256Hex(source);
38
+ }
39
+ export function createInputHash(target, policyOverride) {
40
+ const generationPolicy = {
41
+ ...(target.generationPolicy ?? {}),
42
+ ...(policyOverride ?? {}),
43
+ };
44
+ return sha256Hex(stableSerialize({
45
+ ...target,
46
+ generationPolicy,
47
+ }));
48
+ }
49
+ export function parseProviderSelection(value) {
50
+ if (!value || value === "auto")
51
+ return "auto";
52
+ if (isProviderName(value))
53
+ return value;
54
+ throw new Error(`Unsupported provider "${value}". Use openai, nano, local, or auto.`);
55
+ }
56
+ export function createProviderJob(params) {
57
+ const prompt = buildStructuredPrompt(params.target.promptSpec);
58
+ const basePolicy = getTargetGenerationPolicy(params.target);
59
+ const normalized = normalizeGenerationPolicyForProvider(params.provider, basePolicy);
60
+ const policyErrors = normalized.issues.filter((issue) => issue.level === "error");
61
+ if (policyErrors.length > 0) {
62
+ throw new Error(`Provider policy normalization failed for target "${params.target.id}": ${policyErrors
63
+ .map((issue) => issue.message)
64
+ .join(" ")}`);
65
+ }
66
+ const inputHash = createInputHash(params.target, normalized.policy);
67
+ const id = createDeterministicJobId({
68
+ provider: params.provider,
69
+ targetId: params.target.id,
70
+ targetOut: params.target.out,
71
+ prompt,
72
+ model: params.model,
73
+ inputHash,
74
+ size: normalized.policy.size,
75
+ quality: normalized.policy.quality,
76
+ background: normalized.policy.background,
77
+ outputFormat: normalized.policy.outputFormat,
78
+ candidateCount: normalized.policy.candidates,
79
+ });
80
+ return {
81
+ id,
82
+ provider: params.provider,
83
+ model: params.model,
84
+ targetId: params.target.id,
85
+ targetOut: params.target.out,
86
+ prompt,
87
+ outPath: resolvePathWithinDir(params.imagesDir, params.target.out, `provider output for target "${params.target.id}"`),
88
+ inputHash,
89
+ size: normalized.policy.size,
90
+ quality: normalized.policy.quality,
91
+ background: normalized.policy.background,
92
+ outputFormat: normalized.policy.outputFormat,
93
+ candidateCount: normalized.policy.candidates,
94
+ maxRetries: firstNonNegativeInteger(normalized.policy.maxRetries, params.defaults?.maxRetries, DEFAULT_MAX_RETRIES),
95
+ fallbackProviders: normalized.policy.fallbackProviders,
96
+ providerConcurrency: normalized.policy.providerConcurrency,
97
+ rateLimitPerMinute: normalized.policy.rateLimitPerMinute,
98
+ target: params.target,
99
+ };
100
+ }
101
+ function firstNonNegativeInteger(...values) {
102
+ for (const value of values) {
103
+ if (typeof value !== "number" || !Number.isFinite(value)) {
104
+ continue;
105
+ }
106
+ const rounded = Math.round(value);
107
+ if (rounded >= 0) {
108
+ return rounded;
109
+ }
110
+ }
111
+ return DEFAULT_MAX_RETRIES;
112
+ }
113
+ //# sourceMappingURL=job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job.js","sourceRoot":"","sources":["../../src/providers/job.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type GenerationProvider, type PlannedTarget, type ProviderCapabilities, ProviderError, type ProviderFeature, type ProviderJob, type ProviderPrepareContext, type ProviderRunContext, type ProviderRunResult } from "./types.js";
2
+ export declare const DEFAULT_LOCAL_MODEL = "sdxl-controlnet";
3
+ export interface LocalDiffusionProviderOptions {
4
+ model?: string;
5
+ baseUrl?: string;
6
+ timeoutMs?: number;
7
+ maxRetries?: number;
8
+ minDelayMs?: number;
9
+ defaultConcurrency?: number;
10
+ }
11
+ export declare class LocalDiffusionProvider implements GenerationProvider {
12
+ readonly name: "local";
13
+ readonly capabilities: ProviderCapabilities;
14
+ private readonly model;
15
+ private readonly baseUrl;
16
+ private readonly timeoutMs;
17
+ private readonly maxRetries?;
18
+ constructor(options?: LocalDiffusionProviderOptions);
19
+ prepareJobs(targets: PlannedTarget[], ctx: ProviderPrepareContext): ProviderJob[];
20
+ supports(feature: ProviderFeature): boolean;
21
+ normalizeError(error: unknown): ProviderError;
22
+ runJob(job: ProviderJob, ctx: ProviderRunContext): Promise<ProviderRunResult>;
23
+ private toControlPayload;
24
+ private resolveControlInputPath;
25
+ private resolveImageBytes;
26
+ private requestWithTimeout;
27
+ }
28
+ export declare function createLocalDiffusionProvider(options?: LocalDiffusionProviderOptions): LocalDiffusionProvider;
@@ -0,0 +1,235 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { DEFAULT_PROVIDER_REQUEST_TIMEOUT_MS, fetchWithTimeout, MAX_DECODED_IMAGE_BYTES, normalizeNonNegativeInteger, normalizePositiveInteger, ProviderRequestTimeoutError, toOptionalNonNegativeInteger, validateImageUrl, withCandidateSuffix, } from "./runtime.js";
4
+ import { createProviderJob, nowIso, ProviderError, PROVIDER_CAPABILITIES, } from "./types.js";
5
+ import { resolvePathWithinRoot } from "../shared/paths.js";
6
+ export const DEFAULT_LOCAL_MODEL = "sdxl-controlnet";
7
+ const DEFAULT_LOCAL_BASE_URL = "http://127.0.0.1:8188";
8
+ export class LocalDiffusionProvider {
9
+ name = "local";
10
+ capabilities;
11
+ model;
12
+ baseUrl;
13
+ timeoutMs;
14
+ maxRetries;
15
+ constructor(options = {}) {
16
+ const defaults = PROVIDER_CAPABILITIES.local;
17
+ this.capabilities = {
18
+ ...defaults,
19
+ defaultConcurrency: normalizePositiveInteger(options.defaultConcurrency, defaults.defaultConcurrency),
20
+ minDelayMs: normalizeNonNegativeInteger(options.minDelayMs, defaults.minDelayMs),
21
+ };
22
+ this.model = options.model ?? DEFAULT_LOCAL_MODEL;
23
+ this.baseUrl =
24
+ options.baseUrl ?? process.env.LOCAL_DIFFUSION_BASE_URL ?? DEFAULT_LOCAL_BASE_URL;
25
+ this.timeoutMs = normalizePositiveInteger(options.timeoutMs, DEFAULT_PROVIDER_REQUEST_TIMEOUT_MS);
26
+ this.maxRetries = toOptionalNonNegativeInteger(options.maxRetries);
27
+ }
28
+ prepareJobs(targets, ctx) {
29
+ return targets.map((target) => createProviderJob({
30
+ provider: this.name,
31
+ target,
32
+ model: target.model ?? this.model,
33
+ imagesDir: ctx.imagesDir,
34
+ defaults: {
35
+ maxRetries: this.maxRetries,
36
+ },
37
+ }));
38
+ }
39
+ supports(feature) {
40
+ if (feature === "image-generation")
41
+ return true;
42
+ if (feature === "transparent-background")
43
+ return true;
44
+ if (feature === "image-edits")
45
+ return true;
46
+ if (feature === "multi-candidate")
47
+ return true;
48
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
49
+ if (feature === "controlnet")
50
+ return true;
51
+ return false;
52
+ }
53
+ normalizeError(error) {
54
+ if (error instanceof ProviderError && error.provider === this.name) {
55
+ return error;
56
+ }
57
+ if (error instanceof Error) {
58
+ return new ProviderError({
59
+ provider: this.name,
60
+ code: "local_diffusion_failed",
61
+ message: error.message,
62
+ cause: error,
63
+ actionable: "Check LOCAL_DIFFUSION_BASE_URL and service health, then retry generation.",
64
+ });
65
+ }
66
+ return new ProviderError({
67
+ provider: this.name,
68
+ code: "local_diffusion_failed",
69
+ message: "Local diffusion provider failed with a non-error throwable.",
70
+ cause: error,
71
+ actionable: "Check local diffusion service health and request payload compatibility.",
72
+ });
73
+ }
74
+ async runJob(job, ctx) {
75
+ const startedAt = nowIso(ctx.now);
76
+ const fetchImpl = ctx.fetchImpl ?? globalThis.fetch;
77
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
78
+ if (!fetchImpl) {
79
+ throw new ProviderError({
80
+ provider: this.name,
81
+ code: "missing_fetch",
82
+ message: "Global fetch is unavailable for Local Diffusion provider.",
83
+ actionable: "Use Node.js 18+ or pass a fetch implementation in the run context.",
84
+ });
85
+ }
86
+ try {
87
+ const response = await this.requestWithTimeout(fetchImpl, `${this.baseUrl.replace(/\/$/, "")}/generate`, {
88
+ method: "POST",
89
+ headers: {
90
+ "Content-Type": "application/json",
91
+ },
92
+ body: JSON.stringify({
93
+ model: job.model,
94
+ prompt: job.prompt,
95
+ size: job.size,
96
+ quality: job.quality,
97
+ background: job.background,
98
+ output_format: job.outputFormat,
99
+ candidates: job.candidateCount,
100
+ control: this.toControlPayload(job.target.edit?.inputs, ctx.outDir, job.targetId),
101
+ }),
102
+ });
103
+ if (!response.ok) {
104
+ throw new ProviderError({
105
+ provider: this.name,
106
+ code: "local_diffusion_http_error",
107
+ status: response.status,
108
+ message: `Local diffusion request failed with status ${response.status}.`,
109
+ actionable: "Check local diffusion API compatibility and service logs.",
110
+ cause: await response.text(),
111
+ });
112
+ }
113
+ const payload = (await response.json());
114
+ const images = payload.images ?? [];
115
+ if (images.length === 0) {
116
+ throw new ProviderError({
117
+ provider: this.name,
118
+ code: "local_diffusion_missing_image",
119
+ message: "Local diffusion response did not include generated images.",
120
+ });
121
+ }
122
+ const outputs = [];
123
+ for (let index = 0; index < Math.max(job.candidateCount, 1); index += 1) {
124
+ const image = images[index] ?? images[0];
125
+ const bytes = await this.resolveImageBytes(image, fetchImpl);
126
+ const outputPath = index === 0 ? job.outPath : withCandidateSuffix(job.outPath, index + 1);
127
+ await mkdir(path.dirname(outputPath), { recursive: true });
128
+ await writeFile(outputPath, bytes);
129
+ outputs.push({ outputPath, bytesWritten: bytes.byteLength });
130
+ }
131
+ return {
132
+ jobId: job.id,
133
+ provider: this.name,
134
+ model: job.model,
135
+ targetId: job.targetId,
136
+ prompt: job.prompt,
137
+ outputPath: outputs[0].outputPath,
138
+ bytesWritten: outputs[0].bytesWritten,
139
+ inputHash: job.inputHash,
140
+ startedAt,
141
+ finishedAt: nowIso(ctx.now),
142
+ candidateOutputs: outputs,
143
+ };
144
+ }
145
+ catch (error) {
146
+ throw this.normalizeError(error);
147
+ }
148
+ }
149
+ toControlPayload(inputs, outDir, targetId) {
150
+ if (!inputs || inputs.length === 0) {
151
+ return undefined;
152
+ }
153
+ return inputs.map((input) => ({
154
+ path: this.resolveControlInputPath(input.path, outDir, targetId),
155
+ role: input.role ?? "reference",
156
+ fidelity: input.fidelity ?? "medium",
157
+ }));
158
+ }
159
+ resolveControlInputPath(inputPath, outDir, targetId) {
160
+ try {
161
+ return resolvePathWithinRoot(outDir, inputPath, `local control input path for target "${targetId}"`);
162
+ }
163
+ catch (error) {
164
+ throw new ProviderError({
165
+ provider: this.name,
166
+ code: "local_diffusion_unsafe_control_path",
167
+ message: `Unsafe local control input path "${inputPath}" for target "${targetId}".`,
168
+ actionable: `Control input paths must stay within the output root (${path.resolve(outDir)}).`,
169
+ cause: error,
170
+ });
171
+ }
172
+ }
173
+ async resolveImageBytes(imageData, fetchImpl) {
174
+ if (typeof imageData.b64_json === "string" && imageData.b64_json.length > 0) {
175
+ const buffer = Buffer.from(imageData.b64_json, "base64");
176
+ if (buffer.byteLength > MAX_DECODED_IMAGE_BYTES) {
177
+ throw new ProviderError({
178
+ provider: this.name,
179
+ code: "local_diffusion_image_too_large",
180
+ message: `Decoded image exceeds ${MAX_DECODED_IMAGE_BYTES} byte safety limit.`,
181
+ actionable: "Configure local diffusion to output smaller images.",
182
+ });
183
+ }
184
+ return buffer;
185
+ }
186
+ if (typeof imageData.url === "string" && imageData.url.length > 0) {
187
+ validateImageUrl(imageData.url, "local diffusion image download");
188
+ const imageResponse = await this.requestWithTimeout(fetchImpl, imageData.url);
189
+ if (!imageResponse.ok) {
190
+ throw new ProviderError({
191
+ provider: this.name,
192
+ code: "local_diffusion_image_download_failed",
193
+ status: imageResponse.status,
194
+ message: `Local diffusion image download failed with status ${imageResponse.status}.`,
195
+ });
196
+ }
197
+ const buffer = Buffer.from(await imageResponse.arrayBuffer());
198
+ if (buffer.byteLength > MAX_DECODED_IMAGE_BYTES) {
199
+ throw new ProviderError({
200
+ provider: this.name,
201
+ code: "local_diffusion_image_too_large",
202
+ message: `Decoded image exceeds ${MAX_DECODED_IMAGE_BYTES} byte safety limit.`,
203
+ actionable: "Configure local diffusion to output smaller images.",
204
+ });
205
+ }
206
+ return buffer;
207
+ }
208
+ throw new ProviderError({
209
+ provider: this.name,
210
+ code: "local_diffusion_missing_image",
211
+ message: "Local diffusion image payload contained neither b64_json nor url fields.",
212
+ });
213
+ }
214
+ async requestWithTimeout(fetchImpl, input, init) {
215
+ try {
216
+ return await fetchWithTimeout(fetchImpl, input, init, this.timeoutMs);
217
+ }
218
+ catch (error) {
219
+ if (error instanceof ProviderRequestTimeoutError) {
220
+ throw new ProviderError({
221
+ provider: this.name,
222
+ code: "local_diffusion_request_timeout",
223
+ message: `Local diffusion request timed out after ${error.timeoutMs}ms.`,
224
+ actionable: "Increase providers.local.timeoutMs or LOOTFORGE_LOCAL_TIMEOUT_MS and retry.",
225
+ cause: error,
226
+ });
227
+ }
228
+ throw error;
229
+ }
230
+ }
231
+ }
232
+ export function createLocalDiffusionProvider(options = {}) {
233
+ return new LocalDiffusionProvider(options);
234
+ }
235
+ //# sourceMappingURL=localDiffusion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localDiffusion.js","sourceRoot":"","sources":["../../src/providers/localDiffusion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACL,mCAAmC,EACnC,gBAAgB,EAChB,uBAAuB,EACvB,2BAA2B,EAC3B,wBAAwB,EACxB,2BAA2B,EAC3B,4BAA4B,EAC5B,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,iBAAiB,EAEjB,MAAM,EAIN,aAAa,EAMb,qBAAqB,GAEtB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,CAAC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AACrD,MAAM,sBAAsB,GAAG,uBAAuB,CAAC;AAkBvD,MAAM,OAAO,sBAAsB;IACxB,IAAI,GAAG,OAAgB,CAAC;IACxB,YAAY,CAAuB;IAE3B,KAAK,CAAS;IACd,OAAO,CAAS;IAChB,SAAS,CAAS;IAClB,UAAU,CAAU;IAErC,YAAY,UAAyC,EAAE;QACrD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,CAAC;QAC7C,IAAI,CAAC,YAAY,GAAG;YAClB,GAAG,QAAQ;YACX,kBAAkB,EAAE,wBAAwB,CAC1C,OAAO,CAAC,kBAAkB,EAC1B,QAAQ,CAAC,kBAAkB,CAC5B;YACD,UAAU,EAAE,2BAA2B,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;SACjF,CAAC;QACF,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,mBAAmB,CAAC;QAClD,IAAI,CAAC,OAAO;YACV,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,sBAAsB,CAAC;QACpF,IAAI,CAAC,SAAS,GAAG,wBAAwB,CACvC,OAAO,CAAC,SAAS,EACjB,mCAAmC,CACpC,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,4BAA4B,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrE,CAAC;IAED,WAAW,CAAC,OAAwB,EAAE,GAA2B;QAC/D,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAC5B,iBAAiB,CAAC;YAChB,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,MAAM;YACN,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK;YACjC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,QAAQ,EAAE;gBACR,UAAU,EAAE,IAAI,CAAC,UAAU;aAC5B;SACF,CAAC,CACH,CAAC;IACJ,CAAC;IAED,QAAQ,CAAC,OAAwB;QAC/B,IAAI,OAAO,KAAK,kBAAkB;YAAE,OAAO,IAAI,CAAC;QAChD,IAAI,OAAO,KAAK,wBAAwB;YAAE,OAAO,IAAI,CAAC;QACtD,IAAI,OAAO,KAAK,aAAa;YAAE,OAAO,IAAI,CAAC;QAC3C,IAAI,OAAO,KAAK,iBAAiB;YAAE,OAAO,IAAI,CAAC;QAC/C,uEAAuE;QACvE,IAAI,OAAO,KAAK,YAAY;YAAE,OAAO,IAAI,CAAC;QAC1C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,cAAc,CAAC,KAAc;QAC3B,IAAI,KAAK,YAAY,aAAa,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YACnE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,IAAI,aAAa,CAAC;gBACvB,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,IAAI,EAAE,wBAAwB;gBAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,2EAA2E;aACxF,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,aAAa,CAAC;YACvB,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE,6DAA6D;YACtE,KAAK,EAAE,KAAK;YACZ,UAAU,EAAE,yEAAyE;SACtF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAgB,EAAE,GAAuB;QACpD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,UAAU,CAAC,KAAK,CAAC;QAEpD,uEAAuE;QACvE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,aAAa,CAAC;gBACtB,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,2DAA2D;gBACpE,UAAU,EAAE,oEAAoE;aACjF,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAC5C,SAAS,EACT,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,EAC7C;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,UAAU,EAAE,GAAG,CAAC,UAAU;oBAC1B,aAAa,EAAE,GAAG,CAAC,YAAY;oBAC/B,UAAU,EAAE,GAAG,CAAC,cAAc;oBAC9B,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC;iBAClF,CAAC;aACH,CACF,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,aAAa,CAAC;oBACtB,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,IAAI,EAAE,4BAA4B;oBAClC,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,OAAO,EAAE,8CAA8C,QAAQ,CAAC,MAAM,GAAG;oBACzE,UAAU,EAAE,2DAA2D;oBACvE,KAAK,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE;iBAC7B,CAAC,CAAC;YACL,CAAC;YAED,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAuB,CAAC;YAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;YACpC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,MAAM,IAAI,aAAa,CAAC;oBACtB,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,IAAI,EAAE,+BAA+B;oBACrC,OAAO,EAAE,4DAA4D;iBACtE,CAAC,CAAC;YACL,CAAC;YAED,MAAM,OAAO,GAA8B,EAAE,CAAC;YAC9C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;gBACxE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;gBACzC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;gBAC7D,MAAM,UAAU,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC3F,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC3D,MAAM,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;YAC/D,CAAC;YAED,OAAO;gBACL,KAAK,EAAE,GAAG,CAAC,EAAE;gBACb,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU;gBACjC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY;gBACrC,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,SAAS;gBACT,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;gBAC3B,gBAAgB,EAAE,OAAO;aAC1B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAEO,gBAAgB,CACtB,MAAqC,EACrC,MAAc,EACd,QAAgB;QAEhB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC5B,IAAI,EAAE,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC;YAChE,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,WAAW;YAC/B,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,QAAQ;SACrC,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,uBAAuB,CAAC,SAAiB,EAAE,MAAc,EAAE,QAAgB;QACjF,IAAI,CAAC;YACH,OAAO,qBAAqB,CAC1B,MAAM,EACN,SAAS,EACT,wCAAwC,QAAQ,GAAG,CACpD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,aAAa,CAAC;gBACtB,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,IAAI,EAAE,qCAAqC;gBAC3C,OAAO,EAAE,oCAAoC,SAAS,iBAAiB,QAAQ,IAAI;gBACnF,UAAU,EAAE,yDAAyD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI;gBAC7F,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAC7B,SAA8C,EAC9C,SAAuB;QAEvB,IAAI,OAAO,SAAS,CAAC,QAAQ,KAAK,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5E,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACzD,IAAI,MAAM,CAAC,UAAU,GAAG,uBAAuB,EAAE,CAAC;gBAChD,MAAM,IAAI,aAAa,CAAC;oBACtB,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,IAAI,EAAE,iCAAiC;oBACvC,OAAO,EAAE,yBAAyB,uBAAuB,qBAAqB;oBAC9E,UAAU,EAAE,qDAAqD;iBAClE,CAAC,CAAC;YACL,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,OAAO,SAAS,CAAC,GAAG,KAAK,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClE,gBAAgB,CAAC,SAAS,CAAC,GAAG,EAAE,gCAAgC,CAAC,CAAC;YAClE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;YAC9E,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;gBACtB,MAAM,IAAI,aAAa,CAAC;oBACtB,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,IAAI,EAAE,uCAAuC;oBAC7C,MAAM,EAAE,aAAa,CAAC,MAAM;oBAC5B,OAAO,EAAE,qDAAqD,aAAa,CAAC,MAAM,GAAG;iBACtF,CAAC,CAAC;YACL,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC;YAC9D,IAAI,MAAM,CAAC,UAAU,GAAG,uBAAuB,EAAE,CAAC;gBAChD,MAAM,IAAI,aAAa,CAAC;oBACtB,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,IAAI,EAAE,iCAAiC;oBACvC,OAAO,EAAE,yBAAyB,uBAAuB,qBAAqB;oBAC9E,UAAU,EAAE,qDAAqD;iBAClE,CAAC,CAAC;YACL,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,IAAI,aAAa,CAAC;YACtB,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,IAAI,EAAE,+BAA+B;YACrC,OAAO,EAAE,0EAA0E;SACpF,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAC9B,SAAuB,EACvB,KAAkC,EAClC,IAAkB;QAElB,IAAI,CAAC;YACH,OAAO,MAAM,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACxE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,2BAA2B,EAAE,CAAC;gBACjD,MAAM,IAAI,aAAa,CAAC;oBACtB,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,IAAI,EAAE,iCAAiC;oBACvC,OAAO,EAAE,2CAA2C,KAAK,CAAC,SAAS,KAAK;oBACxE,UAAU,EAAE,6EAA6E;oBACzF,KAAK,EAAE,KAAK;iBACb,CAAC,CAAC;YACL,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,4BAA4B,CAC1C,UAAyC,EAAE;IAE3C,OAAO,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { type GenerationProvider, type PlannedTarget, type ProviderCapabilities, ProviderError, type ProviderFeature, type ProviderJob, type ProviderPrepareContext, type ProviderRunContext, type ProviderRunResult } from "./types.js";
2
+ export declare const DEFAULT_NANO_MODEL = "gemini-2.5-flash-image";
3
+ export interface NanoProviderOptions {
4
+ model?: string;
5
+ apiBase?: string;
6
+ supportsEdits?: boolean;
7
+ timeoutMs?: number;
8
+ maxRetries?: number;
9
+ minDelayMs?: number;
10
+ defaultConcurrency?: number;
11
+ }
12
+ export declare class NanoProvider implements GenerationProvider {
13
+ readonly name: "nano";
14
+ readonly capabilities: ProviderCapabilities;
15
+ private readonly model;
16
+ private readonly apiBase;
17
+ private readonly timeoutMs;
18
+ private readonly maxRetries?;
19
+ constructor(options?: NanoProviderOptions);
20
+ prepareJobs(targets: PlannedTarget[], ctx: ProviderPrepareContext): ProviderJob[];
21
+ supports(feature: ProviderFeature): boolean;
22
+ normalizeError(error: unknown): ProviderError;
23
+ runJob(job: ProviderJob, ctx: ProviderRunContext): Promise<ProviderRunResult>;
24
+ private shouldUseEdits;
25
+ private buildTextRequestPayload;
26
+ private buildEditRequestPayload;
27
+ private buildEditPrompt;
28
+ private extractPromptText;
29
+ private describeEditInput;
30
+ private resolveEditInputPath;
31
+ private readEditInputBytes;
32
+ private mimeTypeForPath;
33
+ private findInlineImage;
34
+ private requestWithTimeout;
35
+ }
36
+ export declare function createNanoProvider(options?: NanoProviderOptions): NanoProvider;