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,63 @@
1
+ const DEFAULT_PROMPT_USE_CASE = "stylized-concept";
2
+ const STYLE_PRESET_LINES = {
3
+ "pixel-art-16bit": [
4
+ "Visual direction: classic 16-bit top-down RPG spritework.",
5
+ "Pixel treatment: strict pixel grid, no anti-aliasing, no sub-pixel rendering.",
6
+ "Shading: flat cel shading with limited color palette and clean dark outlines.",
7
+ "Composition constraints: centered subject, gameplay-ready silhouette, minimal empty margins.",
8
+ ],
9
+ "topdown-painterly-sci-fi": [
10
+ "Visual direction: stylized painterly top-down sci-fi game asset.",
11
+ "Readability: clear silhouette and value separation at gameplay scale.",
12
+ "Detail level: medium detail, avoid noisy microtexture.",
13
+ ],
14
+ };
15
+ export function normalizePromptSpec(spec) {
16
+ return {
17
+ primary: spec.primary.trim(),
18
+ useCase: spec.useCase?.trim() ?? DEFAULT_PROMPT_USE_CASE,
19
+ stylePreset: spec.stylePreset?.trim() ?? "",
20
+ scene: spec.scene?.trim() ?? "",
21
+ subject: spec.subject?.trim() ?? "",
22
+ style: spec.style?.trim() ?? "",
23
+ composition: spec.composition?.trim() ?? "",
24
+ lighting: spec.lighting?.trim() ?? "",
25
+ palette: spec.palette?.trim() ?? "",
26
+ materials: spec.materials?.trim() ?? "",
27
+ constraints: spec.constraints?.trim() ?? "",
28
+ negative: spec.negative?.trim() ?? "",
29
+ };
30
+ }
31
+ export function buildStructuredPrompt(promptSpec) {
32
+ const prompt = normalizePromptSpec(promptSpec);
33
+ if (!prompt.primary) {
34
+ throw new Error("promptSpec.primary is required for generation");
35
+ }
36
+ const presetLines = getStylePresetLines(prompt.stylePreset);
37
+ const lines = [
38
+ `Use case: ${prompt.useCase}`,
39
+ `Primary request: ${prompt.primary}`,
40
+ prompt.stylePreset ? `Style preset: ${prompt.stylePreset}` : "",
41
+ ...presetLines,
42
+ prompt.scene ? `Scene: ${prompt.scene}` : "",
43
+ prompt.subject ? `Subject: ${prompt.subject}` : "",
44
+ prompt.style ? `Style: ${prompt.style}` : "",
45
+ prompt.composition ? `Composition: ${prompt.composition}` : "",
46
+ prompt.lighting ? `Lighting: ${prompt.lighting}` : "",
47
+ prompt.palette ? `Palette: ${prompt.palette}` : "",
48
+ prompt.materials ? `Materials: ${prompt.materials}` : "",
49
+ prompt.constraints ? `Constraints: ${prompt.constraints}` : "",
50
+ prompt.negative ? `Avoid: ${prompt.negative}` : "",
51
+ ];
52
+ return lines.filter(Boolean).join("\n");
53
+ }
54
+ function getStylePresetLines(stylePreset) {
55
+ if (!stylePreset) {
56
+ return [];
57
+ }
58
+ if (stylePreset in STYLE_PRESET_LINES) {
59
+ return STYLE_PRESET_LINES[stylePreset];
60
+ }
61
+ return [];
62
+ }
63
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/providers/prompt.ts"],"names":[],"mappings":"AAEA,MAAM,uBAAuB,GAAG,kBAAkB,CAAC;AAEnD,MAAM,kBAAkB,GAAuC;IAC7D,iBAAiB,EAAE;QACjB,2DAA2D;QAC3D,+EAA+E;QAC/E,+EAA+E;QAC/E,8FAA8F;KAC/F;IACD,0BAA0B,EAAE;QAC1B,kEAAkE;QAClE,uEAAuE;QACvE,wDAAwD;KACzD;CACF,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,IAAgB;IAClD,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;QAC5B,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,uBAAuB;QACxD,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE;QAC3C,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE;QAC/B,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE;QACnC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE;QAC/B,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE;QAC3C,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE;QACrC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE;QACnC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;QACvC,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE;QAC3C,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE;KACtC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAAsB;IAC1D,MAAM,MAAM,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG;QACZ,aAAa,MAAM,CAAC,OAAO,EAAE;QAC7B,oBAAoB,MAAM,CAAC,OAAO,EAAE;QACpC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;QAC/D,GAAG,WAAW;QACd,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;QAC5C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;QAClD,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;QAC5C,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;QAC9D,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;QACrD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;QAClD,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE;QACxD,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;QAC9D,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;KACnD,CAAC;IAEF,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,mBAAmB,CAAC,WAA+B;IAC1D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,WAAW,IAAI,kBAAkB,EAAE,CAAC;QACtC,OAAO,kBAAkB,CAAC,WAA+B,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { type LocalDiffusionProviderOptions } from "./localDiffusion.js";
2
+ import { type NanoProviderOptions } from "./nano.js";
3
+ import { type OpenAIProviderOptions } from "./openai.js";
4
+ import { type GenerationProvider, type PlannedTarget, type ProviderName, type ProviderSelection } from "./types.js";
5
+ export interface ProviderRegistryOptions {
6
+ openai?: OpenAIProviderOptions;
7
+ nano?: NanoProviderOptions;
8
+ local?: LocalDiffusionProviderOptions;
9
+ }
10
+ export interface ProviderRegistry {
11
+ openai: GenerationProvider;
12
+ nano: GenerationProvider;
13
+ local: GenerationProvider;
14
+ }
15
+ export interface ProviderRoute {
16
+ primary: ProviderName;
17
+ fallbacks: ProviderName[];
18
+ }
19
+ export declare function createProviderRegistry(options?: ProviderRegistryOptions): ProviderRegistry;
20
+ export declare function getProvider(registry: ProviderRegistry, providerName: ProviderName): GenerationProvider;
21
+ export declare function resolveTargetProviderName(target: PlannedTarget, requestedProvider: ProviderSelection): ProviderName;
22
+ export declare function resolveTargetProviderRoute(target: PlannedTarget, requestedProvider: ProviderSelection): ProviderRoute;
23
+ export declare function resolveTargetProvider(registry: ProviderRegistry, target: PlannedTarget, requestedProvider: ProviderSelection): GenerationProvider;
24
+ export declare function parseProviderFlag(flagValue: string | undefined): ProviderSelection;
@@ -0,0 +1,92 @@
1
+ import { createLocalDiffusionProvider, } from "./localDiffusion.js";
2
+ import { createNanoProvider } from "./nano.js";
3
+ import { createOpenAIProvider } from "./openai.js";
4
+ import { isProviderName, parseProviderSelection, } from "./types.js";
5
+ export function createProviderRegistry(options = {}) {
6
+ const registry = {
7
+ openai: createOpenAIProvider(options.openai),
8
+ nano: createNanoProvider(options.nano),
9
+ local: createLocalDiffusionProvider(options.local),
10
+ };
11
+ assertProviderCapabilityParity(registry.openai);
12
+ assertProviderCapabilityParity(registry.nano);
13
+ assertProviderCapabilityParity(registry.local);
14
+ return registry;
15
+ }
16
+ export function getProvider(registry, providerName) {
17
+ return registry[providerName];
18
+ }
19
+ export function resolveTargetProviderName(target, requestedProvider) {
20
+ if (target.provider !== undefined) {
21
+ if (!isProviderName(target.provider)) {
22
+ throw new Error(`Target "${target.id}" has unsupported provider "${target.provider}".`);
23
+ }
24
+ return target.provider;
25
+ }
26
+ if (requestedProvider !== "auto") {
27
+ return requestedProvider;
28
+ }
29
+ return autoSelectProvider(target);
30
+ }
31
+ export function resolveTargetProviderRoute(target, requestedProvider) {
32
+ const primary = resolveTargetProviderName(target, requestedProvider);
33
+ const explicitProvider = target.provider !== undefined || requestedProvider !== "auto";
34
+ if (explicitProvider) {
35
+ const configuredFallbacks = (target.generationPolicy?.fallbackProviders ?? []).filter((provider) => isProviderName(provider) && provider !== primary);
36
+ return {
37
+ primary,
38
+ fallbacks: configuredFallbacks,
39
+ };
40
+ }
41
+ const autoFallbacks = [];
42
+ for (const candidate of ["openai", "nano", "local"]) {
43
+ if (candidate === primary)
44
+ continue;
45
+ autoFallbacks.push(candidate);
46
+ }
47
+ return {
48
+ primary,
49
+ fallbacks: autoFallbacks,
50
+ };
51
+ }
52
+ function autoSelectProvider(target) {
53
+ if (target.edit) {
54
+ return "local";
55
+ }
56
+ const background = target.generationPolicy?.background;
57
+ const alphaRequired = target.runtimeSpec?.alphaRequired === true || target.acceptance?.alpha === true;
58
+ if (background === "transparent" || alphaRequired) {
59
+ return "openai";
60
+ }
61
+ const requestedFormat = target.generationPolicy?.outputFormat?.toLowerCase();
62
+ if (requestedFormat === "jpeg" || requestedFormat === "jpg") {
63
+ return "nano";
64
+ }
65
+ return "openai";
66
+ }
67
+ export function resolveTargetProvider(registry, target, requestedProvider) {
68
+ const providerName = resolveTargetProviderName(target, requestedProvider);
69
+ return getProvider(registry, providerName);
70
+ }
71
+ export function parseProviderFlag(flagValue) {
72
+ return parseProviderSelection(flagValue);
73
+ }
74
+ function assertProviderCapabilityParity(provider) {
75
+ if (provider.capabilities.name !== provider.name) {
76
+ throw new Error(`Provider capability mismatch: capabilities.name="${provider.capabilities.name}" does not match provider "${provider.name}".`);
77
+ }
78
+ const checks = [
79
+ ["image-generation", true],
80
+ ["transparent-background", provider.capabilities.supportsTransparentBackground],
81
+ ["image-edits", provider.capabilities.supportsEdits],
82
+ ["multi-candidate", provider.capabilities.maxCandidates > 1],
83
+ ["controlnet", provider.capabilities.supportsControlNet],
84
+ ];
85
+ for (const [feature, expected] of checks) {
86
+ const actual = provider.supports(feature);
87
+ if (actual !== expected) {
88
+ throw new Error(`Provider capability mismatch for "${provider.name}": supports("${feature}")=${String(actual)} but capabilities declare ${String(expected)}.`);
89
+ }
90
+ }
91
+ }
92
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare const DEFAULT_PROVIDER_REQUEST_TIMEOUT_MS = 60000;
2
+ /** Maximum decoded image size (50 MB). */
3
+ export declare const MAX_DECODED_IMAGE_BYTES: number;
4
+ export declare function validateImageUrl(url: string, label: string): void;
5
+ export declare class ProviderRequestTimeoutError extends Error {
6
+ readonly timeoutMs: number;
7
+ constructor(timeoutMs: number);
8
+ }
9
+ export declare function normalizePositiveInteger(value: number | undefined, fallback: number): number;
10
+ export declare function normalizeNonNegativeInteger(value: number | undefined, fallback: number): number;
11
+ export declare function toOptionalPositiveInteger(value: number | undefined): number | undefined;
12
+ export declare function toOptionalNonNegativeInteger(value: number | undefined): number | undefined;
13
+ export declare function fetchWithTimeout(fetchImpl: typeof fetch, input: Parameters<typeof fetch>[0], init: RequestInit | undefined, timeoutMs: number): Promise<Response>;
14
+ export declare function parseTimeoutMs(value: string | undefined): number | undefined;
15
+ export declare function withCandidateSuffix(filePath: string, candidateNumber: number): string;
@@ -0,0 +1,101 @@
1
+ import path from "node:path";
2
+ export const DEFAULT_PROVIDER_REQUEST_TIMEOUT_MS = 60_000;
3
+ /** Maximum decoded image size (50 MB). */
4
+ export const MAX_DECODED_IMAGE_BYTES = 50 * 1024 * 1024;
5
+ const BLOCKED_HOSTNAME_PATTERNS = [
6
+ /^localhost$/i,
7
+ /^127\.0\.0\.1$/,
8
+ /^::1$/,
9
+ /^10\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,
10
+ /^172\.(1[6-9]|2\d|3[01])\.\d{1,3}\.\d{1,3}$/,
11
+ /^192\.168\.\d{1,3}\.\d{1,3}$/,
12
+ /^169\.254\.\d{1,3}\.\d{1,3}$/,
13
+ /^fc00:/i,
14
+ /^fe80:/i,
15
+ ];
16
+ export function validateImageUrl(url, label) {
17
+ const parsed = new URL(url);
18
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
19
+ throw new Error(`SSRF protection: ${label} URL "${url}" targets a blocked address.`);
20
+ }
21
+ for (const pattern of BLOCKED_HOSTNAME_PATTERNS) {
22
+ if (pattern.test(parsed.hostname)) {
23
+ throw new Error(`SSRF protection: ${label} URL "${url}" targets a blocked address.`);
24
+ }
25
+ }
26
+ }
27
+ export class ProviderRequestTimeoutError extends Error {
28
+ timeoutMs;
29
+ constructor(timeoutMs) {
30
+ super(`Request timed out after ${timeoutMs}ms.`);
31
+ this.name = "ProviderRequestTimeoutError";
32
+ this.timeoutMs = timeoutMs;
33
+ }
34
+ }
35
+ export function normalizePositiveInteger(value, fallback) {
36
+ if (typeof value === "number" && Number.isFinite(value) && value > 0) {
37
+ return Math.round(value);
38
+ }
39
+ return fallback;
40
+ }
41
+ export function normalizeNonNegativeInteger(value, fallback) {
42
+ if (typeof value === "number" && Number.isFinite(value) && value >= 0) {
43
+ return Math.round(value);
44
+ }
45
+ return fallback;
46
+ }
47
+ export function toOptionalPositiveInteger(value) {
48
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
49
+ return undefined;
50
+ }
51
+ return Math.round(value);
52
+ }
53
+ export function toOptionalNonNegativeInteger(value) {
54
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0) {
55
+ return undefined;
56
+ }
57
+ return Math.round(value);
58
+ }
59
+ export async function fetchWithTimeout(fetchImpl, input, init, timeoutMs) {
60
+ const normalizedTimeoutMs = normalizePositiveInteger(timeoutMs, DEFAULT_PROVIDER_REQUEST_TIMEOUT_MS);
61
+ const controller = new AbortController();
62
+ const timeout = setTimeout(() => {
63
+ controller.abort();
64
+ }, normalizedTimeoutMs);
65
+ try {
66
+ return await fetchImpl(input, {
67
+ ...init,
68
+ signal: controller.signal,
69
+ });
70
+ }
71
+ catch (error) {
72
+ if (isAbortError(error)) {
73
+ throw new ProviderRequestTimeoutError(normalizedTimeoutMs);
74
+ }
75
+ throw error;
76
+ }
77
+ finally {
78
+ clearTimeout(timeout);
79
+ }
80
+ }
81
+ function isAbortError(error) {
82
+ return error instanceof DOMException
83
+ ? error.name === "AbortError"
84
+ : error instanceof Error && error.name === "AbortError";
85
+ }
86
+ export function parseTimeoutMs(value) {
87
+ if (!value) {
88
+ return undefined;
89
+ }
90
+ const parsed = Number.parseInt(value.trim(), 10);
91
+ if (!Number.isFinite(parsed) || parsed <= 0) {
92
+ return undefined;
93
+ }
94
+ return parsed;
95
+ }
96
+ export function withCandidateSuffix(filePath, candidateNumber) {
97
+ const ext = path.extname(filePath);
98
+ const base = filePath.slice(0, filePath.length - ext.length);
99
+ return `${base}.candidate-${candidateNumber}${ext}`;
100
+ }
101
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/providers/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,mCAAmC,GAAG,MAAM,CAAC;AAE1D,0CAA0C;AAC1C,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAExD,MAAM,yBAAyB,GAAG;IAChC,cAAc;IACd,gBAAgB;IAChB,OAAO;IACP,iCAAiC;IACjC,6CAA6C;IAC7C,8BAA8B;IAC9B,8BAA8B;IAC9B,SAAS;IACT,SAAS;CACV,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,KAAa;IACzD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAE5B,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,SAAS,GAAG,8BAA8B,CAAC,CAAC;IACvF,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,yBAAyB,EAAE,CAAC;QAChD,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,SAAS,GAAG,8BAA8B,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IAC3C,SAAS,CAAS;IAE3B,YAAY,SAAiB;QAC3B,KAAK,CAAC,2BAA2B,SAAS,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAyB,EAAE,QAAgB;IAClF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACrE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAyB,EAAE,QAAgB;IACrF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACtE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAyB;IACjE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACvE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,KAAyB;IACpE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACtE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAAuB,EACvB,KAAkC,EAClC,IAA6B,EAC7B,SAAiB;IAEjB,MAAM,mBAAmB,GAAG,wBAAwB,CAClD,SAAS,EACT,mCAAmC,CACpC,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;QAC9B,UAAU,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC,EAAE,mBAAmB,CAAC,CAAC;IAExB,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,CAAC,KAAK,EAAE;YAC5B,GAAG,IAAI;YACP,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,2BAA2B,CAAC,mBAAmB,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,YAAY,YAAY;QAClC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY;QAC7B,CAAC,CAAC,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAyB;IACtD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC5C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,eAAuB;IAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7D,OAAO,GAAG,IAAI,cAAc,eAAe,GAAG,GAAG,EAAE,CAAC;AACtD,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type ProviderRegistryOptions } from "./registry.js";
2
+ interface RuntimeProviderConfig {
3
+ model?: unknown;
4
+ endpoint?: unknown;
5
+ timeoutMs?: unknown;
6
+ maxRetries?: unknown;
7
+ minDelayMs?: unknown;
8
+ defaultConcurrency?: unknown;
9
+ }
10
+ interface RuntimeLocalProviderConfig extends RuntimeProviderConfig {
11
+ baseUrl?: unknown;
12
+ }
13
+ interface RuntimeManifestProviders {
14
+ openai?: RuntimeProviderConfig;
15
+ nano?: RuntimeProviderConfig;
16
+ local?: RuntimeLocalProviderConfig;
17
+ }
18
+ export declare function resolveProviderRegistryOptions(manifestPath?: string, env?: NodeJS.ProcessEnv): Promise<ProviderRegistryOptions>;
19
+ export declare function buildProviderRegistryOptions(providers: RuntimeManifestProviders | undefined, env?: NodeJS.ProcessEnv): ProviderRegistryOptions;
20
+ export {};
@@ -0,0 +1,146 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { toOptionalNonNegativeInteger, toOptionalPositiveInteger } from "./runtime.js";
3
+ export async function resolveProviderRegistryOptions(manifestPath, env = process.env) {
4
+ const providers = await readManifestProviders(manifestPath);
5
+ return buildProviderRegistryOptions(providers, env);
6
+ }
7
+ export function buildProviderRegistryOptions(providers, env = process.env) {
8
+ const openaiEndpoint = firstDefinedString(env.LOOTFORGE_OPENAI_ENDPOINT, env.OPENAI_IMAGES_ENDPOINT, toNonEmptyString(providers?.openai?.endpoint));
9
+ const openaiEditsEndpoint = firstDefinedString(env.LOOTFORGE_OPENAI_EDITS_ENDPOINT, env.OPENAI_EDITS_ENDPOINT, deriveOpenAIEditsEndpoint(openaiEndpoint));
10
+ const openai = pickDefinedObject({
11
+ model: firstDefinedString(env.LOOTFORGE_OPENAI_MODEL, toNonEmptyString(providers?.openai?.model)),
12
+ endpoint: openaiEndpoint,
13
+ editsEndpoint: openaiEditsEndpoint,
14
+ timeoutMs: firstDefinedPositiveInteger(toOptionalPositiveInteger(parseIntegerEnv(env.LOOTFORGE_OPENAI_TIMEOUT_MS)), toOptionalPositiveInteger(parseIntegerEnv(env.OPENAI_TIMEOUT_MS)), toOptionalPositiveInteger(toNumber(providers?.openai?.timeoutMs))),
15
+ maxRetries: firstDefinedNonNegativeInteger(toOptionalNonNegativeInteger(parseIntegerEnv(env.LOOTFORGE_OPENAI_MAX_RETRIES)), toOptionalNonNegativeInteger(parseIntegerEnv(env.OPENAI_MAX_RETRIES)), toOptionalNonNegativeInteger(toNumber(providers?.openai?.maxRetries))),
16
+ minDelayMs: firstDefinedNonNegativeInteger(toOptionalNonNegativeInteger(parseIntegerEnv(env.LOOTFORGE_OPENAI_MIN_DELAY_MS)), toOptionalNonNegativeInteger(parseIntegerEnv(env.OPENAI_MIN_DELAY_MS)), toOptionalNonNegativeInteger(toNumber(providers?.openai?.minDelayMs))),
17
+ defaultConcurrency: firstDefinedPositiveInteger(toOptionalPositiveInteger(parseIntegerEnv(env.LOOTFORGE_OPENAI_DEFAULT_CONCURRENCY)), toOptionalPositiveInteger(parseIntegerEnv(env.OPENAI_DEFAULT_CONCURRENCY)), toOptionalPositiveInteger(toNumber(providers?.openai?.defaultConcurrency))),
18
+ });
19
+ const nano = pickDefinedObject({
20
+ model: firstDefinedString(env.LOOTFORGE_NANO_MODEL, toNonEmptyString(providers?.nano?.model)),
21
+ apiBase: firstDefinedString(env.LOOTFORGE_NANO_ENDPOINT, env.GEMINI_API_BASE, toNonEmptyString(providers?.nano?.endpoint)),
22
+ timeoutMs: firstDefinedPositiveInteger(toOptionalPositiveInteger(parseIntegerEnv(env.LOOTFORGE_NANO_TIMEOUT_MS)), toOptionalPositiveInteger(parseIntegerEnv(env.GEMINI_TIMEOUT_MS)), toOptionalPositiveInteger(toNumber(providers?.nano?.timeoutMs))),
23
+ maxRetries: firstDefinedNonNegativeInteger(toOptionalNonNegativeInteger(parseIntegerEnv(env.LOOTFORGE_NANO_MAX_RETRIES)), toOptionalNonNegativeInteger(parseIntegerEnv(env.GEMINI_MAX_RETRIES)), toOptionalNonNegativeInteger(toNumber(providers?.nano?.maxRetries))),
24
+ minDelayMs: firstDefinedNonNegativeInteger(toOptionalNonNegativeInteger(parseIntegerEnv(env.LOOTFORGE_NANO_MIN_DELAY_MS)), toOptionalNonNegativeInteger(parseIntegerEnv(env.GEMINI_MIN_DELAY_MS)), toOptionalNonNegativeInteger(toNumber(providers?.nano?.minDelayMs))),
25
+ defaultConcurrency: firstDefinedPositiveInteger(toOptionalPositiveInteger(parseIntegerEnv(env.LOOTFORGE_NANO_DEFAULT_CONCURRENCY)), toOptionalPositiveInteger(parseIntegerEnv(env.GEMINI_DEFAULT_CONCURRENCY)), toOptionalPositiveInteger(toNumber(providers?.nano?.defaultConcurrency))),
26
+ });
27
+ const local = pickDefinedObject({
28
+ model: firstDefinedString(env.LOOTFORGE_LOCAL_MODEL, toNonEmptyString(providers?.local?.model)),
29
+ baseUrl: firstDefinedString(env.LOOTFORGE_LOCAL_ENDPOINT, env.LOCAL_DIFFUSION_BASE_URL, toNonEmptyString(providers?.local?.baseUrl), toNonEmptyString(providers?.local?.endpoint)),
30
+ timeoutMs: firstDefinedPositiveInteger(toOptionalPositiveInteger(parseIntegerEnv(env.LOOTFORGE_LOCAL_TIMEOUT_MS)), toOptionalPositiveInteger(parseIntegerEnv(env.LOCAL_DIFFUSION_TIMEOUT_MS)), toOptionalPositiveInteger(toNumber(providers?.local?.timeoutMs))),
31
+ maxRetries: firstDefinedNonNegativeInteger(toOptionalNonNegativeInteger(parseIntegerEnv(env.LOOTFORGE_LOCAL_MAX_RETRIES)), toOptionalNonNegativeInteger(parseIntegerEnv(env.LOCAL_DIFFUSION_MAX_RETRIES)), toOptionalNonNegativeInteger(toNumber(providers?.local?.maxRetries))),
32
+ minDelayMs: firstDefinedNonNegativeInteger(toOptionalNonNegativeInteger(parseIntegerEnv(env.LOOTFORGE_LOCAL_MIN_DELAY_MS)), toOptionalNonNegativeInteger(parseIntegerEnv(env.LOCAL_DIFFUSION_MIN_DELAY_MS)), toOptionalNonNegativeInteger(toNumber(providers?.local?.minDelayMs))),
33
+ defaultConcurrency: firstDefinedPositiveInteger(toOptionalPositiveInteger(parseIntegerEnv(env.LOOTFORGE_LOCAL_DEFAULT_CONCURRENCY)), toOptionalPositiveInteger(parseIntegerEnv(env.LOCAL_DIFFUSION_DEFAULT_CONCURRENCY)), toOptionalPositiveInteger(toNumber(providers?.local?.defaultConcurrency))),
34
+ });
35
+ return pickDefinedObject({
36
+ openai,
37
+ nano,
38
+ local,
39
+ });
40
+ }
41
+ async function readManifestProviders(manifestPath) {
42
+ if (!manifestPath) {
43
+ return undefined;
44
+ }
45
+ try {
46
+ const raw = await readFile(manifestPath, "utf8");
47
+ const parsed = JSON.parse(raw);
48
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
49
+ if (!parsed || typeof parsed !== "object") {
50
+ return undefined;
51
+ }
52
+ return parsed.providers;
53
+ }
54
+ catch {
55
+ return undefined;
56
+ }
57
+ }
58
+ function deriveOpenAIEditsEndpoint(endpoint) {
59
+ if (!endpoint) {
60
+ return undefined;
61
+ }
62
+ if (/\/images\/edits\/?$/u.test(endpoint)) {
63
+ return endpoint.replace(/\/$/u, "");
64
+ }
65
+ if (/\/images\/generations\/?$/u.test(endpoint)) {
66
+ return endpoint.replace(/\/images\/generations\/?$/u, "/images/edits");
67
+ }
68
+ if (/\/images\/?$/u.test(endpoint)) {
69
+ return `${endpoint.replace(/\/$/u, "")}/edits`;
70
+ }
71
+ return undefined;
72
+ }
73
+ function parseIntegerEnv(value) {
74
+ if (typeof value !== "string") {
75
+ return undefined;
76
+ }
77
+ const trimmed = value.trim();
78
+ if (trimmed === "") {
79
+ return undefined;
80
+ }
81
+ const numeric = Number(trimmed);
82
+ if (!Number.isFinite(numeric)) {
83
+ return undefined;
84
+ }
85
+ return Math.round(numeric);
86
+ }
87
+ function toNonEmptyString(value) {
88
+ if (typeof value !== "string") {
89
+ return undefined;
90
+ }
91
+ const trimmed = value.trim();
92
+ return trimmed.length > 0 ? trimmed : undefined;
93
+ }
94
+ function toNumber(value) {
95
+ if (typeof value !== "number" || !Number.isFinite(value)) {
96
+ return undefined;
97
+ }
98
+ return value;
99
+ }
100
+ function firstDefinedString(...values) {
101
+ for (const value of values) {
102
+ if (typeof value !== "string") {
103
+ continue;
104
+ }
105
+ const trimmed = value.trim();
106
+ if (trimmed.length > 0) {
107
+ return trimmed;
108
+ }
109
+ }
110
+ return undefined;
111
+ }
112
+ function firstDefinedPositiveInteger(...values) {
113
+ for (const value of values) {
114
+ const normalized = toOptionalPositiveInteger(value);
115
+ if (typeof normalized === "number") {
116
+ return normalized;
117
+ }
118
+ }
119
+ return undefined;
120
+ }
121
+ function firstDefinedNonNegativeInteger(...values) {
122
+ for (const value of values) {
123
+ const normalized = toOptionalNonNegativeInteger(value);
124
+ if (typeof normalized === "number") {
125
+ return normalized;
126
+ }
127
+ }
128
+ return undefined;
129
+ }
130
+ function pickDefinedObject(obj) {
131
+ const out = {};
132
+ for (const [key, value] of Object.entries(obj)) {
133
+ if (value === undefined) {
134
+ continue;
135
+ }
136
+ if (value &&
137
+ typeof value === "object" &&
138
+ !Array.isArray(value) &&
139
+ Object.keys(value).length === 0) {
140
+ continue;
141
+ }
142
+ out[key] = value;
143
+ }
144
+ return out;
145
+ }
146
+ //# sourceMappingURL=runtimeConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtimeConfig.js","sourceRoot":"","sources":["../../src/providers/runtimeConfig.ts"],"names":[],"mappings":"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"}