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,542 @@
1
+ import path from "node:path";
2
+ import { normalizeSeamHealPolicy, normalizeWrapGridPolicy, resolveTargetPalettePolicy, } from "./normalize-palette.js";
3
+ import { resolvePostProcess, toNormalizedGenerationPolicy } from "./normalize-policy.js";
4
+ import { DEFAULT_STYLE_USE_CASE, mergeStyleKitPrompt, normalizePromptSpec, normalizePromptSpecFromTarget, } from "./normalize-prompt.js";
5
+ import { buildStructuredPrompt, normalizeGenerationPolicyForProvider } from "../providers/types.js";
6
+ import { RAW_RELATIVE_DIR, normalizeManifestAssetPath, normalizeTargetOutPath, } from "../shared/paths.js";
7
+ export const SCORE_WEIGHT_KEYS = [
8
+ "readability",
9
+ "fileSize",
10
+ "consistency",
11
+ "clip",
12
+ "lpips",
13
+ "ssim",
14
+ ];
15
+ export const DEFAULT_KIND_SCORE_WEIGHT_PRESETS = {
16
+ sprite: {
17
+ readability: 1.15,
18
+ fileSize: 0.85,
19
+ consistency: 1.2,
20
+ clip: 1.15,
21
+ lpips: 1.05,
22
+ ssim: 1.05,
23
+ },
24
+ tile: {
25
+ readability: 0.95,
26
+ fileSize: 0.95,
27
+ consistency: 1.35,
28
+ clip: 1.05,
29
+ lpips: 1.2,
30
+ ssim: 1.2,
31
+ },
32
+ background: {
33
+ readability: 1.2,
34
+ fileSize: 0.8,
35
+ consistency: 0.9,
36
+ clip: 1.1,
37
+ lpips: 0.95,
38
+ ssim: 0.95,
39
+ },
40
+ effect: {
41
+ readability: 1.25,
42
+ fileSize: 0.85,
43
+ consistency: 0.85,
44
+ clip: 1.1,
45
+ lpips: 0.9,
46
+ ssim: 0.9,
47
+ },
48
+ spritesheet: {
49
+ readability: 1.1,
50
+ fileSize: 0.9,
51
+ consistency: 1.35,
52
+ clip: 1.1,
53
+ lpips: 1.2,
54
+ ssim: 1.2,
55
+ },
56
+ };
57
+ export function normalizeOptionalManifestAssetPath(value, label) {
58
+ if (!value) {
59
+ return undefined;
60
+ }
61
+ try {
62
+ return normalizeManifestAssetPath(value);
63
+ }
64
+ catch (error) {
65
+ throw new Error(`${label} has invalid asset path "${value}": ${error instanceof Error ? error.message : String(error)}`);
66
+ }
67
+ }
68
+ export function normalizeManifestAssetPathList(values, label) {
69
+ const normalized = [];
70
+ for (const [index, value] of values.entries()) {
71
+ const itemLabel = `${label}[${index}]`;
72
+ const entry = normalizeOptionalManifestAssetPath(value, itemLabel);
73
+ if (entry) {
74
+ normalized.push(entry);
75
+ }
76
+ }
77
+ return normalized;
78
+ }
79
+ export function normalizeTargetKindForScoring(kind) {
80
+ const normalizedKind = kind.trim().toLowerCase();
81
+ if (normalizedKind === "sprite" ||
82
+ normalizedKind === "tile" ||
83
+ normalizedKind === "background" ||
84
+ normalizedKind === "effect" ||
85
+ normalizedKind === "spritesheet") {
86
+ return normalizedKind;
87
+ }
88
+ return undefined;
89
+ }
90
+ export function mergeScoreWeights(scoreWeights, overrides) {
91
+ if (!overrides) {
92
+ return;
93
+ }
94
+ for (const key of SCORE_WEIGHT_KEYS) {
95
+ const value = overrides[key];
96
+ if (typeof value === "number" && Number.isFinite(value)) {
97
+ scoreWeights[key] = value;
98
+ }
99
+ }
100
+ }
101
+ export function resolveTargetScoring(params) {
102
+ const kind = normalizeTargetKindForScoring(params.target.kind);
103
+ const profileId = params.target.scoringProfile ?? params.target.evaluationProfileId;
104
+ const profile = profileId ? params.scoringProfileById.get(profileId) : undefined;
105
+ const scoreWeights = {};
106
+ if (kind) {
107
+ mergeScoreWeights(scoreWeights, DEFAULT_KIND_SCORE_WEIGHT_PRESETS[kind]);
108
+ }
109
+ if (profile?.scoreWeights) {
110
+ mergeScoreWeights(scoreWeights, profile.scoreWeights);
111
+ }
112
+ if (kind && profile?.kindScoreWeights?.[kind]) {
113
+ mergeScoreWeights(scoreWeights, profile.kindScoreWeights[kind]);
114
+ }
115
+ if (!profile && params.evalProfile.scoreWeights) {
116
+ mergeScoreWeights(scoreWeights, params.evalProfile.scoreWeights);
117
+ }
118
+ return {
119
+ ...(profileId ? { profileId } : {}),
120
+ ...(Object.keys(scoreWeights).length > 0 ? { scoreWeights } : {}),
121
+ };
122
+ }
123
+ export function normalizeTargetForGeneration(params) {
124
+ const id = params.idOverride ?? params.target.id.trim();
125
+ const rawOut = params.outOverride ?? params.target.out;
126
+ let out;
127
+ try {
128
+ out = normalizeTargetOutPath(rawOut);
129
+ }
130
+ catch (error) {
131
+ throw new Error(`Target "${id}" has invalid output path "${rawOut}": ${error instanceof Error ? error.message : String(error)}`);
132
+ }
133
+ const provider = params.target.provider ?? params.defaultProvider;
134
+ const model = resolveTargetModel(params.manifest, params.target, provider);
135
+ const atlasGroup = params.target.atlasGroup?.trim() ?? null;
136
+ const promptSpec = params.promptOverride ??
137
+ mergeStyleKitPrompt({
138
+ promptSpec: normalizePromptSpecFromTarget(params.target),
139
+ styleKit: params.styleKit,
140
+ consistencyGroupId: params.target.consistencyGroup,
141
+ consistencyGroup: params.consistencyGroup,
142
+ rulesContent: params.styleKitRulesContent?.rules,
143
+ negativeRulesContent: params.styleKitRulesContent?.negativeRules,
144
+ paletteColors: params.styleKitPaletteDefault?.colors,
145
+ });
146
+ const normalizedPolicy = normalizeGenerationPolicyForProvider(provider, toNormalizedGenerationPolicy(params.target));
147
+ const policyErrors = normalizedPolicy.issues.filter((issue) => issue.level === "error");
148
+ if (policyErrors.length > 0) {
149
+ throw new Error(`Invalid generation policy for target "${params.target.id}": ${policyErrors
150
+ .map((issue) => issue.message)
151
+ .join(" ")}`);
152
+ }
153
+ const acceptance = {
154
+ ...(params.target.acceptance?.size ? { size: params.target.acceptance.size.trim() } : {}),
155
+ alpha: params.target.acceptance?.alpha ?? params.evalProfile.hardGates?.requireAlpha ?? false,
156
+ maxFileSizeKB: params.target.acceptance?.maxFileSizeKB ?? params.evalProfile.hardGates?.maxFileSizeKB,
157
+ };
158
+ const palette = resolveTargetPalettePolicy(params.target, params.styleKitPaletteDefault);
159
+ const seamHeal = normalizeSeamHealPolicy(params.target, params.evalProfile);
160
+ const wrapGrid = normalizeWrapGridPolicy(params.target, params.evalProfile);
161
+ const styleReferenceImages = normalizeManifestAssetPathList(params.styleKit.styleReferenceImages ?? [], `styleKit "${params.styleKit.id}" styleReferenceImages`);
162
+ const loraPath = normalizeOptionalManifestAssetPath(params.styleKit.loraPath, `styleKit "${params.styleKit.id}" loraPath`);
163
+ const controlImage = normalizeOptionalManifestAssetPath(params.target.controlImage, `target "${id}" controlImage`);
164
+ const scoring = resolveTargetScoring({
165
+ target: params.target,
166
+ evalProfile: params.evalProfile,
167
+ scoringProfileById: params.scoringProfileById,
168
+ });
169
+ const consistencyGroupScoring = resolveConsistencyGroupScoring(params.evalProfile);
170
+ const visualStylePolicy = normalizeVisualStylePolicy(params.styleKit.visualPolicy);
171
+ const dependsOn = mergeOrchestrationTargetRefs(params.template?.dependsOn, params.target.dependsOn);
172
+ const explicitStyleReferenceFrom = mergeOrchestrationTargetRefs(params.template?.styleReferenceFrom, params.target.styleReferenceFrom);
173
+ const styleReferenceFrom = explicitStyleReferenceFrom.length > 0 ? explicitStyleReferenceFrom : dependsOn;
174
+ const normalized = {
175
+ id,
176
+ kind: params.target.kind.trim(),
177
+ out,
178
+ ...(params.target.templateId ? { templateId: params.target.templateId } : {}),
179
+ ...(dependsOn.length > 0 ? { dependsOn } : {}),
180
+ ...(styleReferenceFrom.length > 0 ? { styleReferenceFrom } : {}),
181
+ atlasGroup,
182
+ styleKitId: params.target.styleKitId,
183
+ ...(styleReferenceImages.length > 0 ? { styleReferenceImages } : {}),
184
+ ...(loraPath ? { loraPath } : {}),
185
+ ...(typeof params.styleKit.loraStrength === "number"
186
+ ? { loraStrength: params.styleKit.loraStrength }
187
+ : {}),
188
+ ...(visualStylePolicy ? { visualStylePolicy } : {}),
189
+ consistencyGroup: params.target.consistencyGroup,
190
+ ...(consistencyGroupScoring ? { consistencyGroupScoring } : {}),
191
+ generationMode: params.target.generationMode ?? "text",
192
+ evaluationProfileId: params.target.evaluationProfileId,
193
+ ...(scoring.profileId ? { scoringProfile: scoring.profileId } : {}),
194
+ ...(controlImage ? { controlImage } : {}),
195
+ ...(params.target.controlMode ? { controlMode: params.target.controlMode } : {}),
196
+ ...(params.target.facing ? { facing: params.target.facing } : {}),
197
+ ...(scoring.scoreWeights ? { scoreWeights: scoring.scoreWeights } : {}),
198
+ tileable: params.target.tileable,
199
+ seamThreshold: params.target.seamThreshold ?? params.evalProfile.hardGates?.seamThreshold,
200
+ seamStripPx: params.target.seamStripPx ?? params.evalProfile.hardGates?.seamStripPx,
201
+ alphaHaloRiskMax: params.evalProfile.hardGates?.alphaHaloRiskMax,
202
+ alphaStrayNoiseMax: params.evalProfile.hardGates?.alphaStrayNoiseMax,
203
+ alphaEdgeSharpnessMin: params.evalProfile.hardGates?.alphaEdgeSharpnessMin,
204
+ mattingHiddenRgbLeakMax: params.evalProfile.hardGates?.mattingHiddenRgbLeakMax,
205
+ mattingMaskConsistencyMin: params.evalProfile.hardGates?.mattingMaskConsistencyMin,
206
+ mattingSemiTransparencyRatioMax: params.evalProfile.hardGates?.mattingSemiTransparencyRatioMax,
207
+ packTextureBudgetMB: params.evalProfile.hardGates?.packTextureBudgetMB,
208
+ spritesheetSilhouetteDriftMax: params.evalProfile.hardGates?.spritesheetSilhouetteDriftMax,
209
+ spritesheetAnchorDriftMax: params.evalProfile.hardGates?.spritesheetAnchorDriftMax,
210
+ spritesheetIdentityDriftMax: params.evalProfile.hardGates?.spritesheetIdentityDriftMax,
211
+ spritesheetPoseDriftMax: params.evalProfile.hardGates?.spritesheetPoseDriftMax,
212
+ spritesheetWalkLowerBodyMotionMin: params.evalProfile.hardGates?.spritesheetWalkLowerBodyMotionMin,
213
+ spritesheetWalkFootMotionMin: params.evalProfile.hardGates?.spritesheetWalkFootMotionMin,
214
+ spritesheetWalkFootToUpperMotionRatioMin: params.evalProfile.hardGates?.spritesheetWalkFootToUpperMotionRatioMin,
215
+ ...(seamHeal ? { seamHeal } : {}),
216
+ ...(wrapGrid ? { wrapGrid } : {}),
217
+ ...(palette ? { palette } : {}),
218
+ acceptance,
219
+ runtimeSpec: {
220
+ ...(typeof params.target.runtimeSpec?.alphaRequired === "boolean"
221
+ ? { alphaRequired: params.target.runtimeSpec.alphaRequired }
222
+ : {}),
223
+ ...(typeof params.target.runtimeSpec?.previewWidth === "number"
224
+ ? { previewWidth: params.target.runtimeSpec.previewWidth }
225
+ : {}),
226
+ ...(typeof params.target.runtimeSpec?.previewHeight === "number"
227
+ ? { previewHeight: params.target.runtimeSpec.previewHeight }
228
+ : {}),
229
+ ...(typeof params.target.runtimeSpec?.anchorX === "number"
230
+ ? { anchorX: params.target.runtimeSpec.anchorX }
231
+ : {}),
232
+ ...(typeof params.target.runtimeSpec?.anchorY === "number"
233
+ ? { anchorY: params.target.runtimeSpec.anchorY }
234
+ : {}),
235
+ },
236
+ provider,
237
+ promptSpec,
238
+ generationPolicy: normalizedPolicy.policy,
239
+ postProcess: resolvePostProcess(params.target, palette),
240
+ ...(params.target.edit ? { edit: params.target.edit } : {}),
241
+ ...(params.target.auxiliaryMaps ? { auxiliaryMaps: params.target.auxiliaryMaps } : {}),
242
+ ...(params.spritesheet ? { spritesheet: params.spritesheet } : {}),
243
+ ...(params.generationDisabled ? { generationDisabled: true } : {}),
244
+ ...(params.catalogDisabled ? { catalogDisabled: true } : {}),
245
+ };
246
+ if (model) {
247
+ normalized.model = model;
248
+ }
249
+ return normalized;
250
+ }
251
+ function resolveConsistencyGroupScoring(evalProfile) {
252
+ const warningThreshold = evalProfile.consistencyGroupScoring?.warningThreshold;
253
+ const penaltyThreshold = evalProfile.consistencyGroupScoring?.penaltyThreshold;
254
+ const penaltyWeight = evalProfile.consistencyGroupScoring?.penaltyWeight;
255
+ if (typeof warningThreshold !== "number" &&
256
+ typeof penaltyThreshold !== "number" &&
257
+ typeof penaltyWeight !== "number") {
258
+ return undefined;
259
+ }
260
+ return {
261
+ ...(typeof warningThreshold === "number" ? { warningThreshold } : {}),
262
+ ...(typeof penaltyThreshold === "number" ? { penaltyThreshold } : {}),
263
+ ...(typeof penaltyWeight === "number" ? { penaltyWeight } : {}),
264
+ };
265
+ }
266
+ function normalizeVisualStylePolicy(visualPolicy) {
267
+ if (!visualPolicy) {
268
+ return undefined;
269
+ }
270
+ const normalized = {
271
+ ...(typeof visualPolicy.lineContrastMin === "number"
272
+ ? { lineContrastMin: Math.max(0, Math.min(1, visualPolicy.lineContrastMin)) }
273
+ : {}),
274
+ ...(typeof visualPolicy.shadingBandCountMax === "number"
275
+ ? { shadingBandCountMax: Math.max(1, Math.round(visualPolicy.shadingBandCountMax)) }
276
+ : {}),
277
+ ...(typeof visualPolicy.uiRectilinearityMin === "number"
278
+ ? { uiRectilinearityMin: Math.max(0, Math.min(1, visualPolicy.uiRectilinearityMin)) }
279
+ : {}),
280
+ };
281
+ return Object.keys(normalized).length > 0 ? normalized : undefined;
282
+ }
283
+ function resolveFrameHint(animationName, frameIndex) {
284
+ if (animationName === "walk") {
285
+ // 3-frame walk cycle: contact A -> passing -> contact B -> (loops)
286
+ if (frameIndex === 0)
287
+ return "Right-facing side profile. LEFT leg planted clearly forward with heel down, RIGHT leg extended behind on the toe. Torso, head, and hips lean slightly forward toward screen-right to show forward travel. Shield tucked close to the torso and sword held clear of the legs so both boots remain readable. Full body visible from plume to boots with empty space beneath the feet.";
288
+ if (frameIndex === 1)
289
+ return "Right-facing side profile passing pose. RIGHT knee lifted and swinging forward past the LEFT leg, LEFT foot planted flat under the hips and carrying all weight. The RIGHT leg is the only lifted leg in this frame; the LEFT leg must stay planted. Torso, head, and hips lean slightly forward toward screen-right so this reads as locomotion rather than a marching knee lift. Body at tallest height, both boots visible, no limb hidden behind the shield.";
290
+ if (frameIndex === 2)
291
+ return "Right-facing side profile. RIGHT leg planted clearly forward with heel down, LEFT leg extended behind on the toe. Torso, head, and hips lean slightly forward toward screen-right to show forward travel. Shield tucked close to the torso and sword held clear of the legs so both boots remain readable. Full body visible from plume to boots with empty space beneath the feet.";
292
+ if (frameIndex % 2 === 1)
293
+ return "Right-facing side profile passing position with the stepping leg swinging forward past the planted leg and both feet clearly readable.";
294
+ return "Right-facing side profile contact position with the leading foot flat on the ground and the trailing foot pushing off behind.";
295
+ }
296
+ if (animationName === "idle") {
297
+ if (frameIndex === 0)
298
+ return "Standing upright in relaxed ready stance, weight evenly distributed.";
299
+ if (frameIndex === 1)
300
+ return "Subtle breathing shift: shoulders slightly raised, body shifted slightly to one side compared to frame 1.";
301
+ }
302
+ return `${animationName} frame ${frameIndex + 1}`;
303
+ }
304
+ function resolveAnimationStripDirectives(animationName) {
305
+ if (animationName !== "walk") {
306
+ return [];
307
+ }
308
+ return [
309
+ "CRITICAL WALK CYCLE: the sequence must clearly read as a walk cycle, not an idle pose variation.",
310
+ "All frames must face the SAME direction across the strip; never mirror, flip, or turn the character toward the camera.",
311
+ "Use a right-facing side-profile read with at most a slight three-quarter turn; never front-face the character.",
312
+ "The shield and sword must stay clear of the legs and feet so the stepping motion remains obvious.",
313
+ "Show a clear contact -> passing -> contact rhythm with distinct heel/toe placement and visible negative space between the legs.",
314
+ "Every frame should carry a subtle forward travel lean from ankles through head; avoid upright marching or idle weight-shift poses.",
315
+ "For a 3-frame walk, the middle frame is a passing step: the trailing RIGHT leg swings forward while the LEFT leg stays planted under the body.",
316
+ "Keep the camera pulled back enough that the full body fits inside every cell with padding around the boots, plume, weapon, and shield.",
317
+ "If the output background is opaque, use one flat dark navy background across the full strip. If transparency is supported, keep it fully transparent. Never add white or gray backing cards, gradients, or scenery.",
318
+ ];
319
+ }
320
+ export function expandSpritesheetTarget(params) {
321
+ const normalizedSheetOut = normalizeTargetOutPath(params.target.out);
322
+ const outExt = path.extname(normalizedSheetOut) || ".png";
323
+ const outBase = path.basename(normalizedSheetOut, outExt);
324
+ const frameTargets = [];
325
+ const animations = [];
326
+ const entries = Object.entries(params.target.animations ?? {}).sort((a, b) => a[0].localeCompare(b[0]));
327
+ const defaultSheetPrompt = mergeStyleKitPrompt({
328
+ promptSpec: entries.length > 0
329
+ ? normalizePromptSpec(entries[0][1].prompt)
330
+ : {
331
+ primary: `Spritesheet base for ${params.target.id}`,
332
+ useCase: DEFAULT_STYLE_USE_CASE,
333
+ },
334
+ styleKit: params.styleKit,
335
+ consistencyGroupId: params.target.consistencyGroup,
336
+ consistencyGroup: params.consistencyGroup,
337
+ rulesContent: params.styleKitRulesContent?.rules,
338
+ negativeRulesContent: params.styleKitRulesContent?.negativeRules,
339
+ paletteColors: params.styleKitPaletteDefault?.colors,
340
+ });
341
+ for (const [animationName, animation] of entries) {
342
+ animations.push({
343
+ name: animationName,
344
+ count: animation.count,
345
+ fps: animation.fps,
346
+ loop: animation.loop,
347
+ facing: animation.facing ?? params.target.facing,
348
+ pivot: animation.pivot,
349
+ });
350
+ // Collect output paths and pose hints for all frames up front so the
351
+ // strip target (frame 0) can reference them.
352
+ const frameOutputPaths = [];
353
+ const frameHints = [];
354
+ for (let i = 0; i < animation.count; i += 1) {
355
+ frameOutputPaths.push(path.posix.join("__frames", params.target.id, `${outBase}__${animationName}_${String(i).padStart(2, "0")}${outExt}`));
356
+ frameHints.push(resolveFrameHint(animationName, i));
357
+ }
358
+ // gpt-image-1 sizes: 1024x1024, 1536x1024, 1024x1536
359
+ // For N frames in a horizontal strip: pick the widest size that gives
360
+ // >= 512px per frame. 2 frames → 1024x1024, 3 frames → 1536x1024.
361
+ const stripSize = animation.count <= 2 ? "1024x1024" : "1536x1024";
362
+ for (let frameIndex = 0; frameIndex < animation.count; frameIndex += 1) {
363
+ const frameId = `${params.target.id}.${animationName}.${frameIndex}`;
364
+ const frameOut = frameOutputPaths[frameIndex];
365
+ const framePrompt = mergeStyleKitPrompt({
366
+ promptSpec: normalizePromptSpec(animation.prompt),
367
+ styleKit: params.styleKit,
368
+ consistencyGroupId: params.target.consistencyGroup,
369
+ consistencyGroup: params.consistencyGroup,
370
+ rulesContent: params.styleKitRulesContent?.rules,
371
+ negativeRulesContent: params.styleKitRulesContent?.negativeRules,
372
+ paletteColors: params.styleKitPaletteDefault?.colors,
373
+ });
374
+ const isStripTarget = frameIndex === 0;
375
+ if (isStripTarget) {
376
+ // Frame 0 is the "strip target": it generates a single wide image
377
+ // containing ALL frames for this animation, then the pipeline slices
378
+ // it into individual frame files. This ensures consistent lighting,
379
+ // colors, and proportions across every frame.
380
+ const poseLines = frameHints.map((hint, i) => `Frame ${i + 1}${animation.count <= 3 ? ` (${["left", "center", "right"][i]} third)` : ""}: ${hint.trim()}`);
381
+ framePrompt.primary = [
382
+ framePrompt.primary,
383
+ `Generate a HORIZONTAL SPRITESHEET STRIP with exactly ${animation.count} ${animationName} cycle frames arranged left to right.`,
384
+ ...poseLines,
385
+ ...resolveAnimationStripDirectives(animationName),
386
+ `Each frame occupies exactly 1/${animation.count} of the image width.`,
387
+ "CRITICAL: Each character must be FULLY CONTAINED within its cell -- no body part, weapon, or shield may cross into an adjacent cell.",
388
+ "Center each character within its cell and leave empty padding at the left and right edges.",
389
+ "All frames must share identical character proportions, camera angle, lighting, and colors.",
390
+ "Do NOT add borders, dividers, labels, background scenery, or contrasting background cards behind individual frames.",
391
+ ].join(" ");
392
+ }
393
+ else {
394
+ // Frames 1-N are placeholders; their files come from strip slicing.
395
+ framePrompt.primary = [
396
+ framePrompt.primary,
397
+ `Animation frame ${frameIndex + 1} of ${animation.count} for ${animationName}.`,
398
+ frameHints[frameIndex],
399
+ ].join(" ");
400
+ }
401
+ const frameTarget = normalizeTargetForGeneration({
402
+ manifest: params.manifest,
403
+ target: params.target,
404
+ template: params.template,
405
+ defaultProvider: params.defaultProvider,
406
+ styleKit: params.styleKit,
407
+ styleKitPaletteDefault: params.styleKitPaletteDefault,
408
+ consistencyGroup: params.consistencyGroup,
409
+ evalProfile: params.evalProfile,
410
+ scoringProfileById: params.scoringProfileById,
411
+ promptOverride: framePrompt,
412
+ idOverride: frameId,
413
+ outOverride: frameOut,
414
+ spritesheet: {
415
+ sheetTargetId: params.target.id,
416
+ animationName,
417
+ facing: animation.facing ?? params.target.facing,
418
+ frameIndex,
419
+ frameCount: animation.count,
420
+ fps: animation.fps,
421
+ loop: animation.loop,
422
+ pivot: animation.pivot,
423
+ ...(isStripTarget
424
+ ? { stripGeneration: { frameCount: animation.count, frameOutputPaths } }
425
+ : {}),
426
+ },
427
+ catalogDisabled: true,
428
+ // Frames 1-N get their files from strip slicing, not generation.
429
+ generationDisabled: !isStripTarget,
430
+ });
431
+ // Frame 0 (strip target): override size to the wider strip format
432
+ // and set up edit-first with the style reference seed.
433
+ if (isStripTarget) {
434
+ if (frameTarget.generationPolicy) {
435
+ frameTarget.generationPolicy = {
436
+ ...frameTarget.generationPolicy,
437
+ size: stripSize,
438
+ // Strip generates a single image, not multiple candidates
439
+ candidates: 1,
440
+ };
441
+ }
442
+ const styleRefTargetIds = mergeOrchestrationTargetRefs(params.template?.styleReferenceFrom, params.target.styleReferenceFrom);
443
+ const styleRefInputs = [];
444
+ for (const refTargetId of styleRefTargetIds) {
445
+ const refTarget = params.manifest.targets.find((t) => t.id === refTargetId);
446
+ if (refTarget) {
447
+ const refRawPath = path.join(RAW_RELATIVE_DIR, normalizeTargetOutPath(refTarget.out));
448
+ styleRefInputs.push({ path: refRawPath, role: "reference", fidelity: "high" });
449
+ }
450
+ }
451
+ if (styleRefInputs.length > 0) {
452
+ const poseLines = frameHints.map((hint, i) => `Frame ${i + 1}: ${hint.trim()}.`);
453
+ frameTarget.generationMode = "edit-first";
454
+ frameTarget.edit = {
455
+ mode: "iterate",
456
+ instruction: [
457
+ `Based on this reference character, create a horizontal spritesheet strip with ${animation.count} ${animationName} cycle frames arranged left to right.`,
458
+ ...poseLines,
459
+ ...resolveAnimationStripDirectives(animationName),
460
+ "Match the character's armor, helmet, weapon, shield, color palette, art style, and proportions from the reference.",
461
+ `Each frame must occupy exactly 1/${animation.count} of the image width.`,
462
+ "CRITICAL: Each character must be FULLY CONTAINED within its cell -- no body part, weapon, or shield may cross into an adjacent cell. Center each character within its cell with empty padding at the edges.",
463
+ "Consistent lighting, brightness, colors, and character scale across all frames. No borders, dividers, labels, scenery, or contrasting backing cards behind the character.",
464
+ ].join(" "),
465
+ preserveComposition: false,
466
+ inputs: styleRefInputs,
467
+ };
468
+ }
469
+ }
470
+ frameTargets.push(frameTarget);
471
+ }
472
+ }
473
+ const sheetTarget = normalizeTargetForGeneration({
474
+ manifest: params.manifest,
475
+ target: params.target,
476
+ template: params.template,
477
+ defaultProvider: params.defaultProvider,
478
+ styleKit: params.styleKit,
479
+ styleKitPaletteDefault: params.styleKitPaletteDefault,
480
+ consistencyGroup: params.consistencyGroup,
481
+ evalProfile: params.evalProfile,
482
+ scoringProfileById: params.scoringProfileById,
483
+ promptOverride: defaultSheetPrompt,
484
+ generationDisabled: true,
485
+ spritesheet: {
486
+ sheetTargetId: params.target.id,
487
+ isSheet: true,
488
+ animations,
489
+ },
490
+ });
491
+ return [...frameTargets, sheetTarget];
492
+ }
493
+ function mergeOrchestrationTargetRefs(templateRefs, targetRefs) {
494
+ const merged = [
495
+ ...normalizeOrchestrationTargetRefs(templateRefs),
496
+ ...normalizeOrchestrationTargetRefs(targetRefs),
497
+ ];
498
+ const deduped = [];
499
+ const seen = new Set();
500
+ for (const targetId of merged) {
501
+ if (seen.has(targetId)) {
502
+ continue;
503
+ }
504
+ seen.add(targetId);
505
+ deduped.push(targetId);
506
+ }
507
+ return deduped;
508
+ }
509
+ function normalizeOrchestrationTargetRefs(refs) {
510
+ if (!Array.isArray(refs)) {
511
+ return [];
512
+ }
513
+ return refs.map((targetId) => targetId.trim()).filter(Boolean);
514
+ }
515
+ export function resolveTargetModel(manifest, target, provider) {
516
+ if (target.model?.trim()) {
517
+ return target.model.trim();
518
+ }
519
+ if (provider === "openai") {
520
+ return manifest.providers.openai?.model?.trim();
521
+ }
522
+ if (provider === "nano") {
523
+ return manifest.providers.nano?.model?.trim();
524
+ }
525
+ return manifest.providers.local?.model?.trim();
526
+ }
527
+ export function toProviderJobSpec(target, provider) {
528
+ return {
529
+ targetId: target.id,
530
+ out: target.out,
531
+ provider,
532
+ model: target.model,
533
+ prompt: buildStructuredPrompt(target.promptSpec),
534
+ promptSpec: target.promptSpec,
535
+ generationPolicy: target.generationPolicy ?? {},
536
+ postProcess: target.postProcess,
537
+ styleKitId: target.styleKitId,
538
+ consistencyGroup: target.consistencyGroup,
539
+ evaluationProfileId: target.evaluationProfileId,
540
+ };
541
+ }
542
+ //# sourceMappingURL=normalize-target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-target.js","sourceRoot":"","sources":["../../src/manifest/normalize-target.ts"],"names":[],"mappings":"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"}