@djangocfg/imgai 1.0.3 → 1.0.5

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.
package/README.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # @djangocfg/imgai
2
2
 
3
+ > AI-powered image generation and optimization CLI for Next.js projects using OpenAI DALL-E and Claude Vision
4
+
5
+ [![npm version](https://img.shields.io/npm/v/@djangocfg/imgai.svg)](https://www.npmjs.com/package/@djangocfg/imgai)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
7
+
8
+ **Part of [DjangoCFG](https://djangocfg.com)** — a modern Django framework for building production-ready SaaS applications. All `@djangocfg/*` packages are designed to work together, providing type-safe configuration, real-time features, and beautiful admin interfaces out of the box.
9
+
10
+ ---
11
+
3
12
  AI-powered image generation & management for Next.js projects.
4
13
 
5
14
  ## Features
@@ -182,6 +191,14 @@ OPENAI_API_KEY=sk-... # Required for image generation
182
191
  ANTHROPIC_API_KEY=sk-ant-... # Optional for prompt enhancement with Claude
183
192
  ```
184
193
 
194
+ ## Documentation
195
+
196
+ Full documentation available at [djangocfg.com](https://djangocfg.com)
197
+
198
+ ## Contributing
199
+
200
+ Issues and pull requests are welcome at [GitHub](https://github.com/markolofsen/django-cfg)
201
+
185
202
  ## License
186
203
 
187
- MIT
204
+ MIT - see [LICENSE](./LICENSE) for details
package/dist/cli/bin.cjs CHANGED
@@ -146,7 +146,8 @@ Given a description, create:
146
146
  2. A descriptive filename (lowercase, hyphens, max 30 chars)
147
147
  3. A short caption (max 50 words)
148
148
 
149
- ${this.config.style ? `Style guide: ${this.config.style}` : ""}
149
+ ${this.config.prefix ? `Style prefix: ${this.config.prefix}` : ""}
150
+ ${this.config.suffix ? `Style suffix: ${this.config.suffix}` : ""}
150
151
 
151
152
  Return ONLY valid JSON: {"prompt": "...", "filename": "...", "caption": "..."}`;
152
153
  const userPrompt = context ? `Description: ${basePrompt}
@@ -193,6 +194,7 @@ ${userPrompt}` }
193
194
  n: 1,
194
195
  size: this.config.size,
195
196
  quality: this.config.quality,
197
+ style: this.config.dalleStyle || "natural",
196
198
  response_format: "b64_json"
197
199
  });
198
200
  const imageData = response.data?.[0]?.b64_json;
@@ -251,10 +253,15 @@ ${userPrompt}` }
251
253
  };
252
254
  }
253
255
  buildPrompt(basePrompt) {
254
- if (this.config.style) {
255
- return `${this.config.style}. ${basePrompt}`;
256
+ const parts = [];
257
+ if (this.config.prefix) {
258
+ parts.push(this.config.prefix);
256
259
  }
257
- return basePrompt;
260
+ parts.push(basePrompt);
261
+ if (this.config.suffix) {
262
+ parts.push(this.config.suffix);
263
+ }
264
+ return parts.join(" ");
258
265
  }
259
266
  generateFilename(prompt) {
260
267
  return prompt.toLowerCase().replace(/[^a-z0-9\s]/g, "").replace(/\s+/g, "-").substring(0, 30);
@@ -841,9 +848,14 @@ var ImageAICLI = class {
841
848
  console.log(chalk__default.default.gray(` Format: ${this.config.resize.format}`));
842
849
  console.log(chalk__default.default.gray(` Quality: ${this.config.resize.quality}`));
843
850
  }
844
- if (this.config.style) {
845
- console.log(chalk__default.default.cyan("\n Style:"));
846
- console.log(chalk__default.default.gray(` ${this.config.style.substring(0, 100)}...`));
851
+ if (this.config.prefix || this.config.suffix) {
852
+ console.log(chalk__default.default.cyan("\n Prompt Modifiers:"));
853
+ if (this.config.prefix) {
854
+ console.log(chalk__default.default.gray(` Prefix: ${this.config.prefix.substring(0, 60)}...`));
855
+ }
856
+ if (this.config.suffix) {
857
+ console.log(chalk__default.default.gray(` Suffix: ${this.config.suffix.substring(0, 60)}...`));
858
+ }
847
859
  }
848
860
  }
849
861
  // ──────────────────────────────────────────────────────────────────────────
@@ -874,7 +886,9 @@ function createConfig(options) {
874
886
  anthropicApiKey: process.env.ANTHROPIC_API_KEY,
875
887
  size: options.size || "1792x1024",
876
888
  quality: options.quality || "standard",
877
- style: options.style,
889
+ dalleStyle: options.dalleStyle || "natural",
890
+ prefix: options.prefix,
891
+ suffix: options.suffix,
878
892
  outputDir: options.output || "public/static/images",
879
893
  projectRoot,
880
894
  srcDir: "src",
@@ -895,7 +909,7 @@ program.command("interactive", { isDefault: true }).alias("i").description("Star
895
909
  const cli = new ImageAICLI(config);
896
910
  await cli.interactive();
897
911
  });
898
- program.command("generate <prompt>").alias("g").description("Generate image from prompt").option("-f, --filename <name>", "Output filename").option("-c, --category <name>", "Category/folder", "general").option("-r, --root <path>", "Project root directory").option("-o, --output <path>", "Output directory", "public/static/images").option("--size <size>", "Image size (1024x1024, 1792x1024, 1024x1792)", "1792x1024").option("--quality <quality>", "Image quality (standard, hd)", "standard").option("--style <style>", "Style prefix for prompts").option("--resize", "Enable resize").option("--width <pixels>", "Resize width", parseInt).option("--height <pixels>", "Resize height", parseInt).option("--format <format>", "Output format (webp, jpeg, png, avif)", "webp").action(async (prompt, options) => {
912
+ program.command("generate <prompt>").alias("g").description("Generate image from prompt").option("-f, --filename <name>", "Output filename").option("-c, --category <name>", "Category/folder", "general").option("-r, --root <path>", "Project root directory").option("-o, --output <path>", "Output directory", "public/static/images").option("--size <size>", "Image size (1024x1024, 1792x1024, 1024x1792)", "1792x1024").option("--quality <quality>", "Image quality (standard, hd)", "standard").option("--dalle-style <style>", "DALL-E style (vivid, natural)", "natural").option("--prefix <text>", "Text to prepend to prompt").option("--suffix <text>", "Text to append to prompt").option("--resize", "Enable resize").option("--width <pixels>", "Resize width", parseInt).option("--height <pixels>", "Resize height", parseInt).option("--format <format>", "Output format (webp, jpeg, png, avif)", "webp").action(async (prompt, options) => {
899
913
  const config = createConfig(options);
900
914
  const generator = new ImageGenerator(config);
901
915
  const spinner = ora__default.default("Generating image...").start();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/generator.ts","../../src/scanner/index.ts","../../src/config/generator.ts","../../src/cli/index.ts","../../src/cli/bin.ts"],"names":["OpenAI","Anthropic","path","fs","sharp","glob","inquirer","chalk","ora","__filename","fileURLToPath","__dirname","dotenv","Command"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBO,IAAM,iBAAN,MAAqB;AAAA,EAClB,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EAER,YAAY,MAAA,EAAgB;AAC1B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,EAC3B;AAAA,EAEQ,mBAAA,GAA4B;AAClC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,YAAA,IAAgB,QAAQ,GAAA,CAAI,cAAA;AAC1D,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,eAAA,IAAmB,QAAQ,GAAA,CAAI,iBAAA;AAEhE,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAA,CAAK,SAAS,IAAIA,uBAAA,CAAO,EAAE,MAAA,EAAQ,WAAW,CAAA;AAAA,IAChD;AAEA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAA,CAAK,YAAY,IAAIC,0BAAA,CAAU,EAAE,MAAA,EAAQ,cAAc,CAAA;AAAA,IACzD;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,aAAa,QAAA,EAAU;AACrD,MAAA,MAAM,IAAI,MAAM,6EAA6E,CAAA;AAAA,IAC/F;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAS,OAAA,EAAqD;AAClE,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AAEF,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,MAAM,CAAA;AAGlD,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,kBAAA,CAAmB,UAAU,CAAA;AAG1D,MAAA,MAAM,WAAW,OAAA,CAAQ,QAAA,IAAY,IAAA,CAAK,gBAAA,CAAiB,QAAQ,MAAM,CAAA;AACzE,MAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,SAAA;AAGrC,MAAA,MAAM,YAAYC,sBAAA,CAAK,IAAA;AAAA,QACrB,KAAK,MAAA,CAAO,WAAA;AAAA,QACZ,KAAK,MAAA,CAAO,SAAA;AAAA,QACZ;AAAA,OACF;AACA,MAAA,MAAMC,mBAAA,CAAG,UAAU,SAAS,CAAA;AAG5B,MAAA,MAAM,eAAeD,sBAAA,CAAK,IAAA,CAAK,SAAA,EAAW,CAAA,EAAG,QAAQ,CAAA,IAAA,CAAM,CAAA;AAC3D,MAAA,MAAMC,oBAAG,SAAA,CAAU,YAAA,EAAc,OAAO,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAC,CAAA;AAGjE,MAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,MAAA;AACpD,MAAA,IAAI,SAAA,GAAY,YAAA;AAEhB,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,SAAA,GAAY,MAAM,IAAA,CAAK,WAAA,CAAY,YAAA,EAAc,aAAa,CAAA;AAE9D,QAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,UAAA,MAAMA,mBAAA,CAAG,OAAO,YAAY,CAAA;AAAA,QAC9B;AAAA,MACF;AAGA,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,YAAA,CAAa,WAAW,QAAQ,CAAA;AAG7D,MAAA,SAAA,CAAU,QAAA,GAAW;AAAA,QACnB,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,OAAA,EAAS,QAAQ,QAAA,EAAU,OAAA;AAAA,QAC3B,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,QAAA;AAAA,QACA,WAAA,sBAAiB,IAAA,EAAK;AAAA,QACtB,KAAA,EAAO;AAAA,OACT;AAEA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE9B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,SAAA,EAAW,SAAA;AAAA,QACX,UAAU,SAAA,CAAU,GAAA;AAAA,QACpB,SAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAAA,QAChD,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,OACzB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAc,OAAA,EAAqD;AACvE,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,UAA8B,EAAC;AACrC,IAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,IAAe,CAAA;AAC3C,IAAA,MAAM,YAAA,GAAe,QAAQ,YAAA,IAAgB,GAAA;AAG7C,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,QAAQ,KAAA,CAAM,MAAA,EAAQ,KAAK,WAAA,EAAa;AAC1D,MAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,IAAI,WAAW,CAAA;AAEpD,MAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,GAAA,CAAI,OAAO,IAAA,KAAS;AAC9C,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS;AAAA,UACjC,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,UAAU,IAAA,CAAK;AAAA,SAChB,CAAA;AACD,QAAA,OAAO,MAAA;AAAA,MACT,CAAC,CAAA;AAED,MAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AAEpD,MAAA,KAAA,MAAW,UAAU,YAAA,EAAc;AACjC,QAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AACnB,QAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,UAAA,OAAA,CAAQ,WAAW,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,KAAA,CAAM,QAAQ,MAAM,CAAA;AAAA,QACjE;AAAA,MACF;AAGA,MAAA,IAAI,CAAA,GAAI,WAAA,GAAc,OAAA,CAAQ,KAAA,CAAM,MAAA,EAAQ;AAC1C,QAAA,MAAM,IAAA,CAAK,MAAM,YAAY,CAAA;AAAA,MAC/B;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAO,OAAA,CAAQ,MAAA;AAAA,MACf,SAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AAAA,MAC1C,MAAA,EAAQ,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAC,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AAAA,MAC1C,OAAA;AAAA,MACA,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,KACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAA,CACJ,UAAA,EACA,OAAA,EACgE;AAChE,IAAA,MAAM,YAAA,GAAe,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,EAMvB,IAAA,CAAK,OAAO,KAAA,GAAQ,CAAA,aAAA,EAAgB,KAAK,MAAA,CAAO,KAAK,KAAK,EAAE;;AAAA,8EAAA,CAAA;AAI1D,IAAA,MAAM,UAAA,GAAa,OAAA,GACf,CAAA,aAAA,EAAgB,UAAU;AAAA,SAAA,EAAc,OAAO,CAAA,CAAA,GAC/C,CAAA,aAAA,EAAgB,UAAU,CAAA,CAAA;AAE9B,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,MAAA,CAAO,aAAa,WAAA,EAAa;AAC1D,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,SAAS,MAAA,CAAO;AAAA,QACpD,KAAA,EAAO,4BAAA;AAAA,QACP,UAAA,EAAY,GAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,GAAG,YAAY;;AAAA,EAAO,UAAU,CAAA,CAAA;AAAG;AAC9D,OACD,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA,KAAS,MAAA,GAAS,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA,GAAO,EAAA;AAC9E,MAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACxB;AAEA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,YAAY,MAAA,CAAO;AAAA,QACzD,KAAA,EAAO,qBAAA;AAAA,QACP,QAAA,EAAU;AAAA,UACR,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,YAAA,EAAa;AAAA,UACxC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,UAAA;AAAW,SACtC;AAAA,QACA,UAAA,EAAY,GAAA;AAAA,QACZ,WAAA,EAAa,GAAA;AAAA,QACb,eAAA,EAAiB,EAAE,IAAA,EAAM,aAAA;AAAc,OACxC,CAAA;AAED,MAAA,MAAM,OAAO,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,IAAA;AACtD,MAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACxB;AAEA,IAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,mBAAmB,MAAA,EAAiC;AAChE,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,QAAA,CAAS;AAAA,MACjD,KAAA,EAAO,UAAA;AAAA,MACP,MAAA;AAAA,MACA,CAAA,EAAG,CAAA;AAAA,MACH,IAAA,EAAM,KAAK,MAAA,CAAO,IAAA;AAAA,MAClB,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,MACrB,eAAA,EAAiB;AAAA,KAClB,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,IAAA,GAAO,CAAC,CAAA,EAAG,QAAA;AACtC,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,IACtD;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEA,MAAc,WAAA,CACZ,SAAA,EACA,OAAA,EACiB;AACjB,IAAA,MAAM,EAAE,OAAO,MAAA,EAAQ,OAAA,GAAU,IAAI,MAAA,GAAS,MAAA,EAAQ,GAAA,GAAM,QAAA,EAAS,GAAI,OAAA;AAEzE,IAAA,IAAI,QAAA,GAAWC,uBAAM,SAAS,CAAA;AAG9B,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ;AAAA,QACxC,GAAA;AAAA,QACA,kBAAA,EAAoB;AAAA,OACrB,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,aAAa,SAAA,CAAU,OAAA,CAAQ,UAAA,EAAY,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AAE7D,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,MAAA;AACH,QAAA,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,EAAE,OAAA,EAAS,CAAA;AACpC,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,EAAE,OAAA,EAAS,CAAA;AACpC,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,EAAE,OAAA,EAAS,CAAA;AACnC,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,EAAE,OAAA,EAAS,CAAA;AACpC,QAAA;AAAA;AAGJ,IAAA,MAAM,QAAA,CAAS,OAAO,UAAU,CAAA;AAChC,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,MAAc,YAAA,CAAa,SAAA,EAAmB,QAAA,EAAsC;AAClF,IAAA,MAAM,KAAA,GAAQ,MAAMD,mBAAA,CAAG,IAAA,CAAK,SAAS,CAAA;AACrC,IAAA,MAAM,QAAA,GAAW,MAAMC,sBAAA,CAAM,SAAS,EAAE,QAAA,EAAS;AACjD,IAAA,MAAM,QAAA,GAAWF,sBAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AACxC,IAAA,MAAM,YAAYA,sBAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAM,CAAC,CAAA;AAChD,IAAA,MAAM,KAAKA,sBAAA,CAAK,QAAA,CAAS,UAAUA,sBAAA,CAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAGzD,IAAA,MAAM,SAAA,GAAYA,uBAAK,IAAA,CAAK,IAAA,CAAK,OAAO,WAAA,EAAa,IAAA,CAAK,OAAO,SAAS,CAAA;AAC1E,IAAA,MAAM,YAAA,GAAeA,sBAAA,CAAK,QAAA,CAAS,SAAA,EAAW,SAAS,CAAA;AACvD,IAAA,MAAM,GAAA,GAAM,GAAA,GAAM,YAAA,CAAa,OAAA,CAAQ,OAAO,GAAG,CAAA;AAEjD,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,IAAA,EAAM,YAAA;AAAA,MACN,GAAA;AAAA,MACA,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,YAAY,KAAA,CAAM;AAAA,KACpB;AAAA,EACF;AAAA,EAEQ,YAAY,UAAA,EAA4B;AAC9C,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,MAAA,OAAO,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,KAAK,KAAK,UAAU,CAAA,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEQ,iBAAiB,MAAA,EAAwB;AAC/C,IAAA,OAAO,MAAA,CACJ,WAAA,EAAY,CACZ,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAA,CAC1B,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CACnB,SAAA,CAAU,GAAG,EAAE,CAAA;AAAA,EACpB;AAAA,EAEQ,MAAM,EAAA,EAA2B;AACvC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EACzD;AACF,CAAA;ACxTA,IAAM,kBAAA,GAAqB,CAAC,KAAA,EAAO,KAAA,EAAO,QAAQ,MAAA,EAAQ,MAAA,EAAQ,OAAO,KAAK,CAAA;AAC9E,IAAM,mBAAA,GAAsB,CAAC,eAAA,EAAiB,QAAA,EAAU,QAAQ,CAAA;AAEzD,IAAM,eAAN,MAAmB;AAAA,EAChB,MAAA;AAAA,EAER,YAAY,MAAA,EAAgB;AAC1B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAA,CAAK,OAAA,GAAuB,EAAC,EAAwB;AACzD,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,MAAM;AAAA,MACJ,WAAA,GAAc,mBAAA;AAAA,MACd,UAAA,GAAa,kBAAA;AAAA,MACb,iBAAA,GAAoB,IAAA;AAAA,MACpB,SAAA,GAAY;AAAA,KACd,GAAI,OAAA;AAEJ,IAAA,MAAM,SAAA,GAAYA,uBAAK,IAAA,CAAK,IAAA,CAAK,OAAO,WAAA,EAAa,IAAA,CAAK,OAAO,SAAS,CAAA;AAC1E,IAAA,MAAM,SAAsB,EAAC;AAC7B,IAAA,MAAM,aAA0C,EAAC;AACjD,IAAA,MAAM,cAAsC,EAAC;AAC7C,IAAA,IAAI,SAAA,GAAY,CAAA;AAGhB,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAC5C,MAAA,MAAM,QAAA,GAAWA,sBAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,GAAG,CAAA;AACzC,MAAA,MAAM,UAAA,GAAa,CAAA,GAAA,EAAM,UAAA,CAAW,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAC7C,MAAA,OAAO,SAAA,GACH,CAACA,sBAAAA,CAAK,IAAA,CAAK,UAAU,IAAA,EAAM,UAAU,CAAC,CAAA,GACtC,CAACA,sBAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,UAAU,CAAC,CAAA;AAAA,IACtC,CAAC,CAAA;AAGD,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,QAAQ,MAAMG,SAAA,CAAK,SAAS,EAAE,KAAA,EAAO,MAAM,CAAA;AAEjD,MAAA,KAAA,MAAW,YAAY,KAAA,EAAO;AAC5B,QAAA,IAAI;AACF,UAAA,MAAM,YAAY,MAAM,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,WAAW,iBAAiB,CAAA;AAChF,UAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AAGrB,UAAA,SAAA,IAAa,SAAA,CAAU,IAAA;AACvB,UAAA,WAAA,CAAY,UAAU,SAAS,CAAA,GAAA,CAAK,YAAY,SAAA,CAAU,SAAS,KAAK,CAAA,IAAK,CAAA;AAG7E,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,SAAA,CAAU,IAAI,CAAA;AACpD,UAAA,IAAI,CAAC,UAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,YAAA,UAAA,CAAW,QAAQ,IAAI,EAAC;AAAA,UAC1B;AACA,UAAA,UAAA,CAAW,QAAQ,CAAA,CAAE,IAAA,CAAK,SAAS,CAAA;AAAA,QACrC,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yBAAA,EAA4B,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,QAC5D;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,OAAA,EAAQ,GAAI,CAAA,CAAE,UAAA,CAAW,OAAA,EAAS,CAAA;AAErE,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,OAAO,MAAA,CAAO,MAAA;AAAA,MACd,UAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA,EAAc,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,KAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAA,CAAa,OAAA,GAAuB,EAAC,EAA0B;AACnE,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAE1C,IAAA,MAAM,OAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,KAAA,IAAS,WAAW,MAAA,EAAQ;AACrC,MAAA,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,GAAI,KAAA;AAAA,IACnB;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAA;AAAA,MACT,WAAA,sBAAiB,IAAA,EAAK;AAAA,MACtB,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,YAAY,UAAA,CAAW,UAAA;AAAA,MACvB,QAAQ,UAAA,CAAW,MAAA;AAAA,MACnB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eAAe,QAAA,EAAwC;AAC3D,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,IAAA,EAAK;AACnC,IAAA,OAAO,UAAA,CAAW,UAAA,CAAW,QAAQ,CAAA,IAAK,EAAC;AAAA,EAC7C;AAAA,EAEA,MAAM,SAAS,EAAA,EAA4C;AACzD,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,IAAA,EAAK;AACnC,IAAA,OAAO,WAAW,MAAA,CAAO,IAAA,CAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,OAAO,EAAE,CAAA;AAAA,EACtD;AAAA,EAEA,MAAM,gBAAgB,SAAA,EAAyC;AAC7D,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,IAAA,EAAK;AACnC,IAAA,OAAO,WAAW,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,cAAc,SAAS,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,YAAA,CACZ,QAAA,EACA,SAAA,EACA,iBAAA,EACoB;AACpB,IAAA,MAAM,KAAA,GAAQ,MAAMF,mBAAAA,CAAG,IAAA,CAAK,QAAQ,CAAA;AACpC,IAAA,MAAM,QAAA,GAAWD,sBAAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AACvC,IAAA,MAAM,SAAA,GAAYA,uBAAK,OAAA,CAAQ,QAAQ,EAAE,KAAA,CAAM,CAAC,EAAE,WAAA,EAAY;AAC9D,IAAA,MAAM,KAAKA,sBAAAA,CAAK,QAAA,CAAS,UAAUA,sBAAAA,CAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAGzD,IAAA,MAAM,YAAA,GAAeA,uBAAK,QAAA,CAAS,SAAA,EAAW,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC1E,IAAA,MAAM,MAAM,GAAA,GAAM,YAAA;AAElB,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,MAAA;AAGJ,IAAA,IAAI,iBAAA,IAAqB,cAAc,KAAA,EAAO;AAC5C,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAME,sBAAAA,CAAM,QAAQ,EAAE,QAAA,EAAS;AAChD,QAAA,KAAA,GAAQ,QAAA,CAAS,KAAA;AACjB,QAAA,MAAA,GAAS,QAAA,CAAS,MAAA;AAAA,MACpB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,IAAA,EAAM,YAAA;AAAA,MACN,GAAA;AAAA,MACA,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,KAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,YAAY,KAAA,CAAM;AAAA,KACpB;AAAA,EACF;AAAA,EAEQ,gBAAgB,SAAA,EAA2B;AACjD,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA;AAEjC,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAAA,IAC/B;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;AAMO,SAAS,YAAY,KAAA,EAAuB;AACjD,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,KAAA;AACxB,EAAA,MAAM,CAAA,GAAI,IAAA;AACV,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,EAAK,IAAA,EAAM,MAAM,IAAI,CAAA;AACpC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AAClD,EAAA,OAAO,CAAA,EAAG,UAAA,CAAA,CAAY,KAAA,GAAQ,IAAA,CAAK,IAAI,CAAA,EAAG,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACvE;AAEO,SAAS,eAAe,EAAA,EAAoB;AACjD,EAAA,IAAI,EAAA,GAAK,GAAA,EAAM,OAAO,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AAC3B,EAAA,OAAO,CAAA,EAAA,CAAI,EAAA,GAAK,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAClC;ACpMO,IAAM,kBAAN,MAAsB;AAAA,EACnB,MAAA;AAAA,EACA,OAAA;AAAA,EAER,YAAY,MAAA,EAAgB;AAC1B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,YAAA,CAAa,MAAM,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAA,GAA4B;AAChC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAa;AAChD,IAAA,MAAM,UAAA,GAAaF,uBAAK,IAAA,CAAK,IAAA,CAAK,OAAO,WAAA,EAAa,IAAA,CAAK,OAAO,gBAAgB,CAAA;AAGlF,IAAA,MAAMC,mBAAAA,CAAG,SAAA,CAAUD,sBAAAA,CAAK,OAAA,CAAQ,UAAU,CAAC,CAAA;AAG3C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAA;AAG/C,IAAA,MAAMC,mBAAAA,CAAG,SAAA,CAAU,UAAA,EAAY,OAAA,EAAS,OAAO,CAAA;AAE/C,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAmB,OAAA,EAA+B;AACxD,IAAA,MAAM,aAAa,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,UAAU,EAAE,IAAA,EAAK;AACxD,IAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,EAAE,CAAA,CAAE,IAAA,EAAK;AAExD,IAAA,OAAO,CAAA;AAAA;AAAA,cAAA,EAEK,OAAA,CAAQ,WAAA,CAAY,WAAA,EAAa;AAAA,iBAAA,EAC9B,QAAQ,KAAK;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,sBAAA,EAqBR,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,IAAI,CAAC,EAAA,KAAO,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,KAAK,IAAI,QAAQ,CAAA;AAAA,4BAAA,EAClE,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,UAAA,CAAW,IAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,KAAK,IAAI,QAAQ,CAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA,EAO1G,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,kBAAA,CAAmB,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAC;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA,EAQrE,WAAW,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,sBAAsB,GAAA,EAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,KAAK,EAAE,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAC;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA,YAAA,EA0CvF,QAAQ,OAAO,CAAA;AAAA,gBAAA,EACX,OAAA,CAAQ,WAAA,CAAY,WAAA,EAAa,CAAA;AAAA,eAAA,EAClC,QAAQ,KAAK,CAAA;AAAA,cAAA,EACd,IAAA,CAAK,SAAA,CAAU,UAAU,CAAC,CAAA;AAAA;AAAA,CAAA;AAAA,EAGxC;AAAA,EAEQ,mBAAmB,GAAA,EAAwB;AACjD,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,KAAK,GAAA,CAAI,GAAA;AAAA,MACT,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,MAAM,GAAA,CAAI;AAAA,KACZ;AAEA,IAAA,IAAI,GAAA,CAAI,KAAA,EAAO,IAAA,CAAK,KAAA,GAAQ,GAAA,CAAI,KAAA;AAChC,IAAA,IAAI,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,MAAA,GAAS,GAAA,CAAI,MAAA;AAElC,IAAA,OAAO,MAAM,GAAA,CAAI,EAAE,CAAA,GAAA,EAAM,IAAA,CAAK,UAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,CAAE,QAAQ,KAAA,EAAO,MAAM,EAAE,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAC,CAAA,CAAA;AAAA,EACpG;AAAA,EAEQ,qBAAA,CAAsB,UAAkB,MAAA,EAA6B;AAC3E,IAAA,MAAM,SAAA,GAAY,OAAO,GAAA,CAAI,CAAC,QAAQ,CAAA,QAAA,EAAW,GAAA,CAAI,EAAE,CAAA,EAAA,CAAI,CAAA;AAC3D,IAAA,OAAO,MAAM,QAAQ,CAAA,IAAA,EAAO,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,EAClD;AACF,CAAA;;;AChJO,IAAM,aAAN,MAAiB;AAAA,EACd,MAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EAER,YAAY,MAAA,EAAgB;AAC1B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,cAAA,CAAe,MAAM,CAAA;AAC1C,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,YAAA,CAAa,MAAM,CAAA;AACtC,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,eAAA,CAAgB,MAAM,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAA,GAA6B;AACjC,IAAA,IAAA,CAAK,WAAA,EAAY;AAEjB,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAMG,0BAAS,MAAA,CAAO;AAAA,UACvC;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,QAAA;AAAA,YACN,OAAA,EAASC,sBAAA,CAAM,IAAA,CAAK,4BAA4B,CAAA;AAAA,YAChD,OAAA,EAAS;AAAA,cACP,EAAE,MAAM,CAAA,EAAGA,sBAAA,CAAM,MAAM,WAAI,CAAC,CAAA,2BAAA,CAAA,EAA+B,KAAA,EAAO,UAAA,EAAW;AAAA,cAC7E,EAAE,MAAM,CAAA,EAAGA,sBAAA,CAAM,KAAK,QAAG,CAAC,CAAA,iCAAA,CAAA,EAAqC,KAAA,EAAO,SAAA,EAAU;AAAA,cAChF,EAAE,MAAM,CAAA,EAAGA,sBAAA,CAAM,OAAO,WAAI,CAAC,CAAA,sBAAA,CAAA,EAA0B,KAAA,EAAO,OAAA,EAAQ;AAAA,cACtE,IAAID,0BAAS,SAAA,EAAU;AAAA,cACvB,EAAE,MAAM,CAAA,EAAGC,sBAAA,CAAM,QAAQ,WAAI,CAAC,CAAA,sBAAA,CAAA,EAA0B,KAAA,EAAO,MAAA,EAAO;AAAA,cACtE,EAAE,MAAM,CAAA,EAAGA,sBAAA,CAAM,KAAK,QAAG,CAAC,CAAA,sBAAA,CAAA,EAA0B,KAAA,EAAO,MAAA,EAAO;AAAA,cAClE,EAAE,MAAM,CAAA,EAAGA,sBAAA,CAAM,MAAM,WAAI,CAAC,CAAA,gBAAA,CAAA,EAAoB,KAAA,EAAO,OAAA,EAAQ;AAAA,cAC/D,IAAID,0BAAS,SAAA,EAAU;AAAA,cACvB,EAAE,MAAM,CAAA,EAAGC,sBAAA,CAAM,KAAK,cAAI,CAAC,CAAA,UAAA,CAAA,EAAc,KAAA,EAAO,UAAA,EAAW;AAAA,cAC3D,EAAE,MAAM,CAAA,EAAGA,sBAAA,CAAM,IAAI,WAAI,CAAC,CAAA,KAAA,CAAA,EAAS,KAAA,EAAO,MAAA;AAAO;AACnD;AACF,SACD,CAAA;AAED,QAAA,QAAQ,MAAA;AAAQ,UACd,KAAK,UAAA;AACH,YAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,YAAA;AAAA,UACF,KAAK,SAAA;AACH,YAAA,MAAM,KAAK,aAAA,EAAc;AACzB,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,MAAM,KAAK,WAAA,EAAY;AACvB,YAAA;AAAA,UACF,KAAK,MAAA;AACH,YAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,YAAA;AAAA,UACF,KAAK,MAAA;AACH,YAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,MAAM,KAAK,SAAA,EAAU;AACrB,YAAA;AAAA,UACF,KAAK,UAAA;AACH,YAAA,MAAM,KAAK,YAAA,EAAa;AACxB,YAAA;AAAA,UACF,KAAK,MAAA;AACH,YAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,IAAA,CAAK,wBAAiB,CAAC,CAAA;AACzC,YAAA;AAAA;AAGJ,QAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,MAChB,SAAS,KAAA,EAAO;AAEd,QAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,iBAAA,EAAmB;AAC9D,UAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,IAAA,CAAK,0BAAmB,CAAC,CAAA;AAC3C,UAAA;AAAA,QACF;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAS,OAAA,EAAyC;AACtD,IAAA,MAAM,OAAA,GAAUC,oBAAA,CAAI,qBAAqB,CAAA,CAAE,KAAA,EAAM;AAEjD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,SAAS,OAAO,CAAA;AAEpD,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,OAAA,CAAQ,OAAA,CAAQD,sBAAA,CAAM,KAAA,CAAM,+BAA+B,CAAC,CAAA;AAC5D,QAAA,OAAA,CAAQ,IAAIA,sBAAA,CAAM,IAAA,CAAK,WAAW,MAAA,CAAO,SAAS,EAAE,CAAC,CAAA;AACrD,QAAA,OAAA,CAAQ,IAAIA,sBAAA,CAAM,IAAA,CAAK,WAAW,MAAA,CAAO,QAAQ,EAAE,CAAC,CAAA;AACpD,QAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,cAAA,CAAe,OAAO,QAAA,IAAY,CAAC,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,MAC3E,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,KAAKA,sBAAA,CAAM,GAAA,CAAI,sBAAsB,MAAA,CAAO,KAAK,EAAE,CAAC,CAAA;AAAA,MAC9D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAKA,sBAAA,CAAM,GAAA,CAAI,CAAA,OAAA,EAAU,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAC,CAAA;AAAA,IAC9F;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,CAAK,OAAA,GAAuB,EAAC,EAAkB;AACnD,IAAA,MAAM,OAAA,GAAUC,oBAAA,CAAI,oBAAoB,CAAA,CAAE,KAAA,EAAM;AAEhD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,OAAO,CAAA;AAC9C,MAAA,OAAA,CAAQ,QAAQD,sBAAA,CAAM,KAAA,CAAM,SAAS,MAAA,CAAO,KAAK,SAAS,CAAC,CAAA;AAE3D,MAAA,OAAA,CAAQ,GAAA,CAAIA,uBAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,YAAY,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,CAAC,CAAA;AACxE,MAAA,OAAA,CAAQ,GAAA,CAAIA,uBAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,eAAe,MAAA,CAAO,YAAY,CAAC,CAAA,CAAE,CAAC,CAAA;AAG9E,MAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,IAAA,CAAK,iBAAiB,CAAC,CAAA;AACzC,MAAA,KAAA,MAAW,CAAC,UAAU,MAAM,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG;AAClE,QAAA,OAAA,CAAQ,GAAA,CAAIA,uBAAM,IAAA,CAAK,CAAA,IAAA,EAAO,QAAQ,CAAA,EAAA,EAAK,MAAA,CAAO,MAAM,CAAA,OAAA,CAAS,CAAC,CAAA;AAAA,MACpE;AAGA,MAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,IAAA,CAAK,iBAAiB,CAAC,CAAA;AACzC,MAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,WAAW,CAAA,EAAG;AAC7D,QAAA,OAAA,CAAQ,GAAA,CAAIA,uBAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,GAAG,CAAA,EAAA,EAAK,KAAK,QAAQ,CAAC,CAAA;AAAA,MACvD;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAKA,sBAAA,CAAM,GAAA,CAAI,CAAA,OAAA,EAAU,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAC,CAAA;AAAA,IAC9F;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,GAAsB;AAC1B,IAAA,MAAM,OAAA,GAAUC,oBAAA,CAAI,6BAA6B,CAAA,CAAE,KAAA,EAAM;AAEzD,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,eAAA,CAAgB,QAAA,EAAS;AACvD,MAAA,OAAA,CAAQ,OAAA,CAAQD,sBAAA,CAAM,KAAA,CAAM,6BAA6B,CAAC,CAAA;AAC1D,MAAA,OAAA,CAAQ,IAAIA,sBAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,UAAU,EAAE,CAAC,CAAA;AAAA,IACnD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAKA,sBAAA,CAAM,GAAA,CAAI,CAAA,OAAA,EAAU,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAC,CAAA;AAAA,IAC9F;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,cAAA,GAAgC;AAC5C,IAAA,MAAM,OAAA,GAAU,MAAMD,yBAAA,CAAS,MAAA,CAAO;AAAA,MACpC;AAAA,QACE,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS,0BAAA;AAAA,QACT,UAAU,CAAC,KAAA,KAAkB,KAAA,CAAM,IAAA,KAAS,IAAA,GAAO;AAAA,OACrD;AAAA,MACA;AAAA,QACE,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACX;AAAA,MACA;AAAA,QACE,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,OAAA,EAAS,qCAAA;AAAA,QACT,OAAA,EAAS;AAAA;AACX,KACD,CAAA;AAED,IAAA,MAAM,KAAK,QAAA,CAAS;AAAA,MAClB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,QAAA,EAAU,QAAQ,QAAA,IAAY,MAAA;AAAA,MAC9B,UAAU,OAAA,CAAQ;AAAA,KACnB,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,aAAA,GAA+B;AAC3C,IAAA,MAAM,OAAA,GAAU,MAAMA,yBAAA,CAAS,MAAA,CAAO;AAAA,MACpC;AAAA,QACE,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,aAAA;AAAA,QACN,OAAA,EAAS,yBAAA;AAAA,QACT,UAAU,CAAC,KAAA,KAAkB,KAAA,CAAM,IAAA,KAAS,IAAA,GAAO;AAAA,OACrD;AAAA,MACA;AAAA,QACE,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,SAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACX;AAAA,MACA;AAAA,QACE,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,OAAA,EAAS,qCAAA;AAAA,QACT,OAAA,EAAS;AAAA;AACX,KACD,CAAA;AAED,IAAA,MAAM,OAAA,GAAUE,oBAAA,CAAI,6BAA6B,CAAA,CAAE,KAAA,EAAM;AAEzD,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,aAAA;AAAA,QACpC,OAAA,CAAQ,WAAA;AAAA,QACR,QAAQ,OAAA,IAAW,KAAA;AAAA,OACrB;AAEA,MAAA,OAAA,CAAQ,QAAQ,kBAAkB,CAAA;AAClC,MAAA,OAAA,CAAQ,GAAA,CAAID,sBAAA,CAAM,IAAA,CAAK,sBAAsB,CAAC,CAAA;AAC9C,MAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,SAAS,MAAM;AAAA,CAAI,CAAC,CAAA;AAChD,MAAA,OAAA,CAAQ,IAAIA,sBAAA,CAAM,IAAA,CAAK,eAAe,QAAA,CAAS,QAAQ,EAAE,CAAC,CAAA;AAC1D,MAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,SAAS,OAAO;AAAA,CAAI,CAAC,CAAA;AAE3D,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAMD,0BAAS,MAAA,CAAO;AAAA,QACxC;AAAA,UACE,IAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAM,SAAA;AAAA,UACN,OAAA,EAAS,kCAAA;AAAA,UACT,OAAA,EAAS;AAAA;AACX,OACD,CAAA;AAED,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,KAAK,QAAA,CAAS;AAAA,UAClB,QAAQ,QAAA,CAAS,MAAA;AAAA,UACjB,UAAU,QAAA,CAAS,QAAA;AAAA,UACnB,UAAU,OAAA,CAAQ,QAAA;AAAA,UAClB,QAAA,EAAU,EAAE,OAAA,EAAS,QAAA,CAAS,OAAA;AAAQ,SACvC,CAAA;AAAA,MACH;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAKC,sBAAA,CAAM,GAAA,CAAI,CAAA,OAAA,EAAU,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAC,CAAA;AAAA,IAC9F;AAAA,EACF;AAAA,EAEA,MAAc,WAAA,GAA6B;AACzC,IAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,IAAA,CAAK,yDAAyD,CAAC,CAAA;AAEjF,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAMD,0BAAS,MAAA,CAAO;AAAA,QACvC;AAAA,UACE,IAAA,EAAM,OAAA;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,OAAA,EAAS,KAAK,UAAU,CAAA,CAAA;AAAA;AAC1B,OACD,CAAA;AAED,MAAA,IAAI,CAAC,MAAA,CAAO,IAAA,EAAK,EAAG;AACpB,MAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AACnB,MAAA,UAAA,EAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,OAAA,CAAQ,GAAA,CAAIC,sBAAA,CAAM,MAAA,CAAO,uBAAuB,CAAC,CAAA;AACjD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAY,GAAI,MAAMD,0BAAS,MAAA,CAAO;AAAA,MACtD;AAAA,QACE,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,OAAA,EAAS,0BAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACX;AAAA,MACA;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,aAAA;AAAA,QACN,OAAA,EAAS,qBAAA;AAAA,QACT,OAAA,EAAS;AAAA,UACP,EAAE,IAAA,EAAM,gBAAA,EAAkB,KAAA,EAAO,CAAA,EAAE;AAAA,UACnC,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,CAAA,EAAE;AAAA,UACjC,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,CAAA;AAAE,SAC/B;AAAA,QACA,OAAA,EAAS;AAAA;AACX,KACD,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAIC,uBAAM,IAAA,CAAK;AAAA,aAAA,EAAkB,QAAQ,MAAM,CAAA;AAAA,CAAc,CAAC,CAAA;AAEtE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc;AAAA,MAChD,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,QAAQ,CAAA,MAAO;AAAA,QACjC,MAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAU,CAAA,MAAA,EAAS,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAI,CAAC,CAAA;AAAA,OACxC,CAAE,CAAA;AAAA,MACF,WAAA;AAAA,MACA,UAAA,EAAY,CAAC,OAAA,EAAS,KAAA,EAAO,GAAA,KAAQ;AACnC,QAAA,MAAM,MAAA,GAAS,IAAI,OAAA,GAAUA,sBAAA,CAAM,MAAM,QAAG,CAAA,GAAIA,sBAAA,CAAM,GAAA,CAAI,QAAG,CAAA;AAC7D,QAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,MAAM,IAAI,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA;AAAA,MAC/C;AAAA,KACD,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,IAAA,CAAK,qBAAqB,CAAC,CAAA;AAC7C,IAAA,OAAA,CAAQ,IAAIA,sBAAA,CAAM,IAAA,CAAK,cAAc,MAAA,CAAO,OAAO,EAAE,CAAC,CAAA;AACtD,IAAA,OAAA,CAAQ,IAAIA,sBAAA,CAAM,IAAA,CAAK,cAAc,MAAA,CAAO,MAAM,EAAE,CAAC,CAAA;AACrD,IAAA,OAAA,CAAQ,GAAA,CAAIA,uBAAM,IAAA,CAAK,CAAA,WAAA,EAAc,eAAe,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,EACzE;AAAA,EAEA,MAAc,OAAA,GAAyB;AACrC,IAAA,MAAM,KAAK,IAAA,EAAK;AAAA,EAClB;AAAA,EAEA,MAAc,OAAA,GAAyB;AACrC,IAAA,MAAM,KAAK,IAAA,EAAK;AAAA,EAClB;AAAA,EAEA,MAAc,SAAA,GAA2B;AACvC,IAAA,MAAM,OAAA,GAAUC,oBAAA,CAAI,yBAAyB,CAAA,CAAE,KAAA,EAAM;AAErD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAK;AACvC,MAAA,OAAA,CAAQ,IAAA,EAAK;AAEb,MAAA,OAAA,CAAQ,GAAA,CAAID,sBAAA,CAAM,IAAA,CAAK,kCAA2B,CAAC,CAAA;AACnD,MAAA,OAAA,CAAQ,IAAIA,sBAAA,CAAM,KAAA,CAAM,sBAAsB,MAAA,CAAO,KAAK,EAAE,CAAC,CAAA;AAC7D,MAAA,OAAA,CAAQ,GAAA,CAAIA,uBAAM,KAAA,CAAM,CAAA,mBAAA,EAAsB,YAAY,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,CAAC,CAAA;AAC9E,MAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,KAAA,CAAM,CAAA,mBAAA,EAAsB,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA,CAAE,MAAM,CAAA,CAAE,CAAC,CAAA;AAEtF,MAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,IAAA,CAAK,kBAAkB,CAAC,CAAA;AAC1C,MAAA,KAAA,MAAW,CAAC,UAAU,MAAM,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,CAAC,CAAA,CAAE,SAAS,CAAA,CAAE,CAAC,CAAA,CAAE,MAAM,CAAA,EAAG;AAC5G,QAAA,MAAM,IAAA,GAAO,OAAO,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AAC1D,QAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,QAAA,CAAS,OAAO,EAAE,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,MAAA,CAAO,QAAA,GAAW,QAAA,CAAS,CAAC,CAAC,CAAA,SAAA,EAAY,WAAA,CAAY,IAAI,EAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,MACxI;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,IAAA,CAAK,mBAAmB,CAAC,CAAA;AAC3C,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,WAAW,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,CAAC,IAAI,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG;AACzF,QAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,GAAA,CAAI,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,MAAA,CAAQ,CAAC,CAAA;AAAA,MAChE;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAKA,sBAAA,CAAM,GAAA,CAAI,CAAA,OAAA,EAAU,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAC,CAAA;AAAA,IAC9F;AAAA,EACF;AAAA,EAEA,MAAc,YAAA,GAA8B;AAC1C,IAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,IAAA,CAAK,sCAA4B,CAAC,CAAA;AACpD,IAAA,OAAA,CAAQ,GAAA,CAAIA,uBAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,KAAK,MAAA,CAAO,QAAQ,EAAE,CAAC,CAAA;AACjE,IAAA,OAAA,CAAQ,GAAA,CAAIA,uBAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,KAAK,MAAA,CAAO,IAAI,EAAE,CAAC,CAAA;AAC7D,IAAA,OAAA,CAAQ,GAAA,CAAIA,uBAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,KAAK,MAAA,CAAO,OAAO,EAAE,CAAC,CAAA;AAChE,IAAA,OAAA,CAAQ,GAAA,CAAIA,uBAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,KAAK,MAAA,CAAO,SAAS,EAAE,CAAC,CAAA;AAClE,IAAA,OAAA,CAAQ,GAAA,CAAIA,uBAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,KAAK,MAAA,CAAO,gBAAgB,EAAE,CAAC,CAAA;AAEzE,IAAA,IAAI,IAAA,CAAK,OAAO,MAAA,EAAQ;AACtB,MAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,IAAA,CAAK,sBAAsB,CAAC,CAAA;AAC9C,MAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,IAAA,CAAK,OAAO,MAAA,CAAO,KAAA,IAAS,MAAM,CAAA,CAAE,CAAC,CAAA;AAC5E,MAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,IAAA,CAAK,OAAO,MAAA,CAAO,MAAA,IAAU,MAAM,CAAA,CAAE,CAAC,CAAA;AAC7E,MAAA,OAAA,CAAQ,GAAA,CAAIA,uBAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,KAAK,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAE,CAAC,CAAA;AACnE,MAAA,OAAA,CAAQ,GAAA,CAAIA,uBAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,KAAK,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,CAAE,CAAC,CAAA;AAAA,IACtE;AAEA,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,MAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,IAAA,CAAK,YAAY,CAAC,CAAA;AACpC,MAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,SAAA,CAAU,CAAA,EAAG,GAAG,CAAC,CAAA,GAAA,CAAK,CAAC,CAAA;AAAA,IACzE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,WAAA,GAAoB;AAC1B,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,IAAA,CAAK,kRAAiD,CAAC,CAAA;AACzE,IAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,IAAA,CAAK,UAAK,CAAA,GAAIA,sBAAA,CAAM,KAAA,CAAM,IAAA,CAAK,mDAA4C,CAAA,GAAIA,sBAAA,CAAM,IAAA,CAAK,QAAG,CAAC,CAAA;AAChH,IAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,IAAA,CAAK,UAAK,CAAA,GAAIA,sBAAA,CAAM,IAAA,CAAK,6CAA6C,CAAA,GAAIA,sBAAA,CAAM,IAAA,CAAK,QAAG,CAAC,CAAA;AAC3G,IAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAA,CAAM,IAAA,CAAK,kRAAiD,CAAC,CAAA;AACzE,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AACF,CAAA;;;AC3WA,IAAME,YAAA,GAAaC,iBAAA,CAAc,yPAAe,CAAA;AAChD,IAAMC,WAAA,GAAYT,sBAAAA,CAAK,OAAA,CAAQO,YAAU,CAAA;AAGzCG,uBAAA,CAAO,MAAA,EAAO;AACdA,uBAAA,CAAO,MAAA,CAAO,EAAE,IAAA,EAAMV,sBAAAA,CAAK,OAAA,CAAQ,QAAQ,GAAA,EAAI,EAAG,YAAY,CAAA,EAAG,CAAA;AACjEU,uBAAA,CAAO,MAAA,CAAO,EAAE,IAAA,EAAMV,sBAAAA,CAAK,QAAQS,WAAA,EAAW,YAAY,GAAG,CAAA;AAE7D,IAAM,OAAA,GAAU,IAAIE,iBAAA,EAAQ;AAM5B,SAAS,aAAa,OAAA,EAA0C;AAC9D,EAAA,MAAM,WAAA,GAAe,OAAA,CAAQ,IAAA,IAAmB,OAAA,CAAQ,GAAA,EAAI;AAE5D,EAAA,OAAO;AAAA,IACL,QAAA,EAAW,QAAQ,QAAA,IAAuC,QAAA;AAAA,IAC1D,YAAA,EAAc,QAAQ,GAAA,CAAI,cAAA;AAAA,IAC1B,eAAA,EAAiB,QAAQ,GAAA,CAAI,iBAAA;AAAA,IAC7B,IAAA,EAAO,QAAQ,IAAA,IAA2B,WAAA;AAAA,IAC1C,OAAA,EAAU,QAAQ,OAAA,IAAiC,UAAA;AAAA,IACnD,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,SAAA,EAAY,QAAQ,MAAA,IAAqB,sBAAA;AAAA,IACzC,WAAA;AAAA,IACA,MAAA,EAAQ,KAAA;AAAA,IACR,SAAA,EAAW,QAAA;AAAA,IACX,gBAAA,EAAmB,QAAQ,MAAA,IAAqB,oBAAA;AAAA,IAChD,MAAA,EAAQ,QAAQ,MAAA,GACZ;AAAA,MACE,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,OAAA,EAAU,QAAQ,OAAA,IAAsB,EAAA;AAAA,MACxC,MAAA,EAAS,QAAQ,MAAA,IAA+C,MAAA;AAAA,MAChE,GAAA,EAAK;AAAA,KACP,GACA;AAAA,GACN;AACF;AAMA,OAAA,CACG,KAAK,OAAO,CAAA,CACZ,YAAY,sDAAsD,CAAA,CAClE,QAAQ,OAAO,CAAA;AAGlB,OAAA,CACG,QAAQ,aAAA,EAAe,EAAE,WAAW,IAAA,EAAM,EAC1C,KAAA,CAAM,GAAG,EACT,WAAA,CAAY,wBAAwB,EACpC,MAAA,CAAO,mBAAA,EAAqB,wBAAwB,CAAA,CACpD,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,EAAA,MAAM,MAAA,GAAS,aAAa,OAAO,CAAA;AACnC,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,MAAM,CAAA;AACjC,EAAA,MAAM,IAAI,WAAA,EAAY;AACxB,CAAC,CAAA;AAGH,OAAA,CACG,OAAA,CAAQ,mBAAmB,CAAA,CAC3B,KAAA,CAAM,GAAG,CAAA,CACT,WAAA,CAAY,4BAA4B,CAAA,CACxC,MAAA,CAAO,uBAAA,EAAyB,iBAAiB,CAAA,CACjD,MAAA,CAAO,uBAAA,EAAyB,iBAAA,EAAmB,SAAS,CAAA,CAC5D,MAAA,CAAO,mBAAA,EAAqB,wBAAwB,CAAA,CACpD,MAAA,CAAO,qBAAA,EAAuB,kBAAA,EAAoB,sBAAsB,CAAA,CACxE,MAAA,CAAO,iBAAiB,8CAAA,EAAgD,WAAW,CAAA,CACnF,MAAA,CAAO,qBAAA,EAAuB,8BAAA,EAAgC,UAAU,CAAA,CACxE,MAAA,CAAO,iBAAA,EAAmB,0BAA0B,CAAA,CACpD,MAAA,CAAO,UAAA,EAAY,eAAe,CAAA,CAClC,OAAO,kBAAA,EAAoB,cAAA,EAAgB,QAAQ,CAAA,CACnD,MAAA,CAAO,mBAAA,EAAqB,eAAA,EAAiB,QAAQ,CAAA,CACrD,MAAA,CAAO,mBAAA,EAAqB,uCAAA,EAAyC,MAAM,CAAA,CAC3E,MAAA,CAAO,OAAO,QAAQ,OAAA,KAAY;AACjC,EAAA,MAAM,MAAA,GAAS,aAAa,OAAO,CAAA;AACnC,EAAA,MAAM,SAAA,GAAY,IAAI,cAAA,CAAe,MAAM,CAAA;AAC3C,EAAA,MAAM,OAAA,GAAUL,oBAAAA,CAAI,qBAAqB,CAAA,CAAE,KAAA,EAAM;AAEjD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,QAAA,CAAS;AAAA,MACtC,MAAA;AAAA,MACA,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,UAAU,OAAA,CAAQ;AAAA,KACnB,CAAA;AAED,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,OAAA,CAAQ,OAAA,CAAQD,sBAAAA,CAAM,KAAA,CAAM,kBAAkB,CAAC,CAAA;AAC/C,MAAA,OAAA,CAAQ,IAAIA,sBAAAA,CAAM,IAAA,CAAK,WAAW,MAAA,CAAO,SAAS,EAAE,CAAC,CAAA;AACrD,MAAA,OAAA,CAAQ,IAAIA,sBAAAA,CAAM,IAAA,CAAK,WAAW,MAAA,CAAO,QAAQ,EAAE,CAAC,CAAA;AAAA,IACtD,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAA,CAAKA,sBAAAA,CAAM,GAAA,CAAI,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACtC;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,IAAA,CAAKA,uBAAM,GAAA,CAAI,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAC,CAAA;AAChF,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF,CAAC,CAAA;AAGH,OAAA,CACG,OAAA,CAAQ,MAAM,CAAA,CACd,KAAA,CAAM,GAAG,EACT,WAAA,CAAY,0BAA0B,CAAA,CACtC,MAAA,CAAO,mBAAA,EAAqB,wBAAwB,EACpD,MAAA,CAAO,mBAAA,EAAqB,uCAAA,EAAyC,sBAAsB,CAAA,CAC3F,MAAA,CAAO,mBAAmB,+BAA+B,CAAA,CACzD,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,EAAA,MAAM,MAAA,GAAS,aAAa,OAAO,CAAA;AACnC,EAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,MAAM,CAAA;AACvC,EAAA,MAAM,OAAA,GAAUC,oBAAAA,CAAI,oBAAoB,CAAA,CAAE,KAAA,EAAM;AAEhD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,IAAA,CAAK;AAAA,MAChC,WAAA,EAAa,OAAA,CAAQ,IAAA,EAAM,KAAA,CAAM,GAAG,CAAA;AAAA,MACpC,iBAAA,EAAmB,QAAQ,UAAA,KAAe;AAAA,KAC3C,CAAA;AAED,IAAA,OAAA,CAAQ,QAAQD,sBAAAA,CAAM,KAAA,CAAM,SAAS,MAAA,CAAO,KAAK,SAAS,CAAC,CAAA;AAE3D,IAAA,OAAA,CAAQ,GAAA,CAAIA,uBAAM,IAAA,CAAK;AAAA,cAAA,EAAmB,WAAA,CAAY,MAAA,CAAO,SAAS,CAAC,EAAE,CAAC,CAAA;AAC1E,IAAA,OAAA,CAAQ,GAAA,CAAIA,uBAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,eAAe,MAAA,CAAO,YAAY,CAAC,CAAA,CAAE,CAAC,CAAA;AAE9E,IAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAAA,CAAM,IAAA,CAAK,iBAAiB,CAAC,CAAA;AACzC,IAAA,KAAA,MAAW,CAAC,UAAU,MAAM,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG;AAClE,MAAA,OAAA,CAAQ,GAAA,CAAIA,uBAAM,IAAA,CAAK,CAAA,IAAA,EAAO,QAAQ,CAAA,EAAA,EAAK,MAAA,CAAO,MAAM,CAAA,OAAA,CAAS,CAAC,CAAA;AAAA,IACpE;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAAA,CAAM,IAAA,CAAK,iBAAiB,CAAC,CAAA;AACzC,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,WAAW,CAAA,EAAG;AAC7D,MAAA,OAAA,CAAQ,GAAA,CAAIA,uBAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,GAAG,CAAA,EAAA,EAAK,KAAK,QAAQ,CAAC,CAAA;AAAA,IACvD;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,IAAA,CAAKA,uBAAM,GAAA,CAAI,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAC,CAAA;AAChF,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF,CAAC,CAAA;AAGH,OAAA,CACG,QAAQ,MAAM,CAAA,CACd,WAAA,CAAY,uCAAuC,EACnD,MAAA,CAAO,mBAAA,EAAqB,wBAAwB,CAAA,CACpD,OAAO,qBAAA,EAAuB,2BAAA,EAA6B,oBAAoB,CAAA,CAC/E,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,EAAA,MAAM,MAAA,GAAS,aAAa,EAAE,GAAG,SAAS,MAAA,EAAQ,OAAA,CAAQ,QAAQ,CAAA;AAClE,EAAA,MAAM,SAAA,GAAY,IAAI,eAAA,CAAgB,MAAM,CAAA;AAC5C,EAAA,MAAM,OAAA,GAAUC,oBAAAA,CAAI,yBAAyB,CAAA,CAAE,KAAA,EAAM;AAErD,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,MAAM,SAAA,CAAU,QAAA,EAAS;AAC5C,IAAA,OAAA,CAAQ,OAAA,CAAQD,sBAAAA,CAAM,KAAA,CAAM,gBAAgB,CAAC,CAAA;AAC7C,IAAA,OAAA,CAAQ,IAAIA,sBAAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,UAAU,EAAE,CAAC,CAAA;AAAA,EACnD,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,IAAA,CAAKA,uBAAM,GAAA,CAAI,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAC,CAAA;AAChF,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF,CAAC,CAAA;AAGH,OAAA,CACG,OAAA,CAAQ,OAAO,CAAA,CACf,KAAA,CAAM,GAAG,CAAA,CACT,WAAA,CAAY,iCAAiC,CAAA,CAC7C,QAAA,CAAS,QAAA,EAAU,8BAA8B,EACjD,MAAA,CAAO,mBAAA,EAAqB,wBAAwB,CAAA,CACpD,MAAA,CAAO,yBAAA,EAA2B,wBAAA,EAA0B,GAAG,CAAA,CAC/D,MAAA,CAAO,mBAAA,EAAqB,yBAAA,EAA2B,OAAO,CAAA,CAC9D,MAAA,CAAO,OAAO,MAAM,OAAA,KAAY;AAC/B,EAAA,MAAM,MAAA,GAAS,aAAa,OAAO,CAAA;AACnC,EAAA,MAAM,SAAA,GAAY,IAAI,cAAA,CAAe,MAAM,CAAA;AAG3C,EAAA,MAAMJ,GAAAA,GAAK,MAAM,OAAO,UAAU,CAAA;AAClC,EAAA,MAAM,WAAWD,sBAAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,GAAA,IAAO,IAAI,CAAA;AAEjD,EAAA,IAAI,CAAC,MAAMC,GAAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAG;AAClC,IAAA,OAAA,CAAQ,MAAMI,sBAAAA,CAAM,GAAA,CAAI,CAAA,gBAAA,EAAmB,QAAQ,EAAE,CAAC,CAAA;AACtD,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,MAAM,IAAA,GAAO,MAAMJ,GAAAA,CAAG,QAAA,CAAS,QAAQ,CAAA;AACvC,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,OAAO,IAAA,CAAK,OAAA;AAElD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC3B,IAAA,OAAA,CAAQ,KAAA,CAAMI,sBAAAA,CAAM,GAAA,CAAI,wDAAwD,CAAC,CAAA;AACjF,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAIA,uBAAM,IAAA,CAAK;AAAA,aAAA,EAAkB,QAAQ,MAAM,CAAA;AAAA,CAAc,CAAC,CAAA;AAEtE,EAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,aAAA,CAAc;AAAA,IAC3C,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAM,CAAA,MAAO;AAAA,MAC/B,MAAA,EAAQ,OAAO,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,CAAK,MAAA;AAAA,MAC/C,QAAA,EAAU,OAAO,IAAA,KAAS,QAAA,GAAW,SAAY,IAAA,CAAK,QAAA;AAAA,MACtD,UAAU,OAAA,CAAQ;AAAA,KACpB,CAAE,CAAA;AAAA,IACF,WAAA,EAAa,QAAA,CAAS,OAAA,CAAQ,WAAW,CAAA;AAAA,IACzC,UAAA,EAAY,CAAC,OAAA,EAAS,KAAA,EAAO,GAAA,KAAQ;AACnC,MAAA,MAAM,MAAA,GAAS,IAAI,OAAA,GAAUA,sBAAAA,CAAM,MAAM,QAAG,CAAA,GAAIA,sBAAAA,CAAM,GAAA,CAAI,QAAG,CAAA;AAC7D,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,GAAA,EAAM,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,KAAK,CAAA,CAAE,CAAA;AAAA,IAC/E;AAAA,GACD,CAAA;AAED,EAAA,OAAA,CAAQ,GAAA,CAAIA,sBAAAA,CAAM,IAAA,CAAK,qBAAqB,CAAC,CAAA;AAC7C,EAAA,OAAA,CAAQ,IAAIA,sBAAAA,CAAM,IAAA,CAAK,cAAc,MAAA,CAAO,OAAO,EAAE,CAAC,CAAA;AACtD,EAAA,OAAA,CAAQ,IAAIA,sBAAAA,CAAM,IAAA,CAAK,cAAc,MAAA,CAAO,MAAM,EAAE,CAAC,CAAA;AACrD,EAAA,OAAA,CAAQ,GAAA,CAAIA,uBAAM,IAAA,CAAK,CAAA,WAAA,EAAc,eAAe,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAE,CAAC,CAAA;AACzE,CAAC,CAAA;AAGH,OAAA,CAAQ,KAAA,EAAM","file":"bin.cjs","sourcesContent":["import fs from 'fs-extra';\nimport path from 'path';\nimport sharp from 'sharp';\nimport OpenAI from 'openai';\nimport Anthropic from '@anthropic-ai/sdk';\nimport type {\n Config,\n GenerateOptions,\n GenerationResult,\n BatchGenerateOptions,\n BatchResult,\n ImageInfo,\n ResizeOptions,\n} from './types';\n\n// ============================================================================\n// AI IMAGE GENERATOR\n// ============================================================================\n\nexport class ImageGenerator {\n private config: Config;\n private openai?: OpenAI;\n private anthropic?: Anthropic;\n\n constructor(config: Config) {\n this.config = config;\n this.initializeProviders();\n }\n\n private initializeProviders(): void {\n const openaiKey = this.config.openaiApiKey || process.env.OPENAI_API_KEY;\n const anthropicKey = this.config.anthropicApiKey || process.env.ANTHROPIC_API_KEY;\n\n if (openaiKey) {\n this.openai = new OpenAI({ apiKey: openaiKey });\n }\n\n if (anthropicKey) {\n this.anthropic = new Anthropic({ apiKey: anthropicKey });\n }\n\n if (!this.openai && this.config.provider === 'openai') {\n throw new Error('OpenAI API key required. Set OPENAI_API_KEY or pass openaiApiKey in config.');\n }\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // SINGLE IMAGE GENERATION\n // ──────────────────────────────────────────────────────────────────────────\n\n async generate(options: GenerateOptions): Promise<GenerationResult> {\n const startTime = Date.now();\n\n try {\n // Build full prompt with style\n const fullPrompt = this.buildPrompt(options.prompt);\n\n // Generate image using OpenAI DALL-E 3\n const imageData = await this.generateWithOpenAI(fullPrompt);\n\n // Generate filename\n const filename = options.filename || this.generateFilename(options.prompt);\n const category = options.category || 'general';\n\n // Determine output path\n const outputDir = path.join(\n this.config.projectRoot,\n this.config.outputDir,\n category\n );\n await fs.ensureDir(outputDir);\n\n // Save original image\n const originalPath = path.join(outputDir, `${filename}.png`);\n await fs.writeFile(originalPath, Buffer.from(imageData, 'base64'));\n\n // Resize if needed\n const resizeOptions = options.resize || this.config.resize;\n let finalPath = originalPath;\n\n if (resizeOptions) {\n finalPath = await this.resizeImage(originalPath, resizeOptions);\n // Remove original if format changed\n if (finalPath !== originalPath) {\n await fs.remove(originalPath);\n }\n }\n\n // Get image info\n const imageInfo = await this.getImageInfo(finalPath, category);\n\n // Add metadata\n imageInfo.metadata = {\n prompt: options.prompt,\n caption: options.metadata?.caption,\n tags: options.tags,\n category,\n generatedAt: new Date(),\n model: 'dall-e-3',\n };\n\n const duration = Date.now() - startTime;\n\n return {\n success: true,\n imagePath: finalPath,\n imageUrl: imageInfo.url,\n imageInfo,\n duration,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n duration: Date.now() - startTime,\n };\n }\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // BATCH GENERATION\n // ──────────────────────────────────────────────────────────────────────────\n\n async generateBatch(options: BatchGenerateOptions): Promise<BatchResult> {\n const startTime = Date.now();\n const results: GenerationResult[] = [];\n const concurrency = options.concurrency || 2;\n const delayBetween = options.delayBetween || 2000;\n\n // Process in batches\n for (let i = 0; i < options.items.length; i += concurrency) {\n const batch = options.items.slice(i, i + concurrency);\n\n const batchPromises = batch.map(async (item) => {\n const result = await this.generate({\n prompt: item.prompt,\n filename: item.filename,\n category: item.category,\n });\n return result;\n });\n\n const batchResults = await Promise.all(batchPromises);\n\n for (const result of batchResults) {\n results.push(result);\n if (options.onProgress) {\n options.onProgress(results.length, options.items.length, result);\n }\n }\n\n // Delay between batches\n if (i + concurrency < options.items.length) {\n await this.delay(delayBetween);\n }\n }\n\n return {\n total: results.length,\n success: results.filter((r) => r.success).length,\n failed: results.filter((r) => !r.success).length,\n results,\n duration: Date.now() - startTime,\n };\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // PROMPT ENHANCEMENT (using Claude/GPT)\n // ──────────────────────────────────────────────────────────────────────────\n\n async enhancePrompt(\n basePrompt: string,\n context?: string\n ): Promise<{ prompt: string; filename: string; caption: string }> {\n const systemPrompt = `You are an expert at creating image generation prompts.\nGiven a description, create:\n1. A detailed visual prompt (max 150 words) for DALL-E 3\n2. A descriptive filename (lowercase, hyphens, max 30 chars)\n3. A short caption (max 50 words)\n\n${this.config.style ? `Style guide: ${this.config.style}` : ''}\n\nReturn ONLY valid JSON: {\"prompt\": \"...\", \"filename\": \"...\", \"caption\": \"...\"}`;\n\n const userPrompt = context\n ? `Description: ${basePrompt}\\nContext: ${context}`\n : `Description: ${basePrompt}`;\n\n if (this.anthropic && this.config.provider === 'anthropic') {\n const response = await this.anthropic.messages.create({\n model: 'claude-3-5-sonnet-20241022',\n max_tokens: 500,\n messages: [\n { role: 'user', content: `${systemPrompt}\\n\\n${userPrompt}` },\n ],\n });\n\n const text = response.content[0].type === 'text' ? response.content[0].text : '';\n return JSON.parse(text);\n }\n\n if (this.openai) {\n const response = await this.openai.chat.completions.create({\n model: 'gpt-4-turbo-preview',\n messages: [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userPrompt },\n ],\n max_tokens: 500,\n temperature: 0.7,\n response_format: { type: 'json_object' },\n });\n\n const text = response.choices[0]?.message?.content || '{}';\n return JSON.parse(text);\n }\n\n throw new Error('No AI provider configured for prompt enhancement');\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // PRIVATE METHODS\n // ──────────────────────────────────────────────────────────────────────────\n\n private async generateWithOpenAI(prompt: string): Promise<string> {\n if (!this.openai) {\n throw new Error('OpenAI client not initialized');\n }\n\n const response = await this.openai.images.generate({\n model: 'dall-e-3',\n prompt,\n n: 1,\n size: this.config.size,\n quality: this.config.quality,\n response_format: 'b64_json',\n });\n\n const imageData = response.data?.[0]?.b64_json;\n if (!imageData) {\n throw new Error('No image data received from OpenAI');\n }\n\n return imageData;\n }\n\n private async resizeImage(\n inputPath: string,\n options: ResizeOptions\n ): Promise<string> {\n const { width, height, quality = 85, format = 'webp', fit = 'inside' } = options;\n\n let pipeline = sharp(inputPath);\n\n // Resize if dimensions provided\n if (width || height) {\n pipeline = pipeline.resize(width, height, {\n fit,\n withoutEnlargement: true,\n });\n }\n\n // Convert format\n const outputPath = inputPath.replace(/\\.[^.]+$/, `.${format}`);\n\n switch (format) {\n case 'webp':\n pipeline = pipeline.webp({ quality });\n break;\n case 'jpeg':\n pipeline = pipeline.jpeg({ quality });\n break;\n case 'png':\n pipeline = pipeline.png({ quality });\n break;\n case 'avif':\n pipeline = pipeline.avif({ quality });\n break;\n }\n\n await pipeline.toFile(outputPath);\n return outputPath;\n }\n\n private async getImageInfo(imagePath: string, category: string): Promise<ImageInfo> {\n const stats = await fs.stat(imagePath);\n const metadata = await sharp(imagePath).metadata();\n const filename = path.basename(imagePath);\n const extension = path.extname(filename).slice(1);\n const id = path.basename(filename, path.extname(filename));\n\n // Calculate relative path from public directory\n const publicDir = path.join(this.config.projectRoot, this.config.publicDir);\n const relativePath = path.relative(publicDir, imagePath);\n const url = '/' + relativePath.replace(/\\\\/g, '/');\n\n return {\n id,\n filename,\n extension,\n path: relativePath,\n url,\n size: stats.size,\n width: metadata.width,\n height: metadata.height,\n createdAt: stats.birthtime,\n modifiedAt: stats.mtime,\n };\n }\n\n private buildPrompt(basePrompt: string): string {\n if (this.config.style) {\n return `${this.config.style}. ${basePrompt}`;\n }\n return basePrompt;\n }\n\n private generateFilename(prompt: string): string {\n return prompt\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, '')\n .replace(/\\s+/g, '-')\n .substring(0, 30);\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { glob } from 'glob';\nimport sharp from 'sharp';\nimport type {\n Config,\n ImageInfo,\n ImageCatalog,\n ScanOptions,\n ScanResult,\n} from '../core/types';\n\n// ============================================================================\n// IMAGE SCANNER\n// ============================================================================\n\nconst DEFAULT_EXTENSIONS = ['png', 'jpg', 'jpeg', 'webp', 'avif', 'gif', 'svg'];\nconst DEFAULT_DIRECTORIES = ['static/images', 'images', 'assets'];\n\nexport class ImageScanner {\n private config: Config;\n\n constructor(config: Config) {\n this.config = config;\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // SCAN IMAGES\n // ──────────────────────────────────────────────────────────────────────────\n\n async scan(options: ScanOptions = {}): Promise<ScanResult> {\n const startTime = Date.now();\n\n const {\n directories = DEFAULT_DIRECTORIES,\n extensions = DEFAULT_EXTENSIONS,\n includeDimensions = true,\n recursive = true,\n } = options;\n\n const publicDir = path.join(this.config.projectRoot, this.config.publicDir);\n const images: ImageInfo[] = [];\n const byCategory: Record<string, ImageInfo[]> = {};\n const byExtension: Record<string, number> = {};\n let totalSize = 0;\n\n // Build glob patterns\n const patterns = directories.flatMap((dir) => {\n const basePath = path.join(publicDir, dir);\n const extPattern = `*.{${extensions.join(',')}}`;\n return recursive\n ? [path.join(basePath, '**', extPattern)]\n : [path.join(basePath, extPattern)];\n });\n\n // Find all images\n for (const pattern of patterns) {\n const files = await glob(pattern, { nodir: true });\n\n for (const filePath of files) {\n try {\n const imageInfo = await this.processImage(filePath, publicDir, includeDimensions);\n images.push(imageInfo);\n\n // Update stats\n totalSize += imageInfo.size;\n byExtension[imageInfo.extension] = (byExtension[imageInfo.extension] || 0) + 1;\n\n // Group by category (directory name)\n const category = this.extractCategory(imageInfo.path);\n if (!byCategory[category]) {\n byCategory[category] = [];\n }\n byCategory[category].push(imageInfo);\n } catch (error) {\n console.warn(`Failed to process image: ${filePath}`, error);\n }\n }\n }\n\n // Sort images by modification date (newest first)\n images.sort((a, b) => b.modifiedAt.getTime() - a.modifiedAt.getTime());\n\n return {\n images,\n total: images.length,\n byCategory,\n byExtension,\n totalSize,\n scanDuration: Date.now() - startTime,\n };\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // BUILD CATALOG\n // ──────────────────────────────────────────────────────────────────────────\n\n async buildCatalog(options: ScanOptions = {}): Promise<ImageCatalog> {\n const scanResult = await this.scan(options);\n\n const byId: Record<string, ImageInfo> = {};\n for (const image of scanResult.images) {\n byId[image.id] = image;\n }\n\n return {\n version: '1.0.0',\n generatedAt: new Date(),\n count: scanResult.total,\n categories: scanResult.byCategory,\n images: scanResult.images,\n byId,\n };\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // FIND SPECIFIC IMAGES\n // ──────────────────────────────────────────────────────────────────────────\n\n async findByCategory(category: string): Promise<ImageInfo[]> {\n const scanResult = await this.scan();\n return scanResult.byCategory[category] || [];\n }\n\n async findById(id: string): Promise<ImageInfo | undefined> {\n const scanResult = await this.scan();\n return scanResult.images.find((img) => img.id === id);\n }\n\n async findByExtension(extension: string): Promise<ImageInfo[]> {\n const scanResult = await this.scan();\n return scanResult.images.filter((img) => img.extension === extension);\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // PRIVATE METHODS\n // ──────────────────────────────────────────────────────────────────────────\n\n private async processImage(\n filePath: string,\n publicDir: string,\n includeDimensions: boolean\n ): Promise<ImageInfo> {\n const stats = await fs.stat(filePath);\n const filename = path.basename(filePath);\n const extension = path.extname(filename).slice(1).toLowerCase();\n const id = path.basename(filename, path.extname(filename));\n\n // Calculate paths\n const relativePath = path.relative(publicDir, filePath).replace(/\\\\/g, '/');\n const url = '/' + relativePath;\n\n let width: number | undefined;\n let height: number | undefined;\n\n // Get dimensions if requested (skip for SVG)\n if (includeDimensions && extension !== 'svg') {\n try {\n const metadata = await sharp(filePath).metadata();\n width = metadata.width;\n height = metadata.height;\n } catch {\n // Ignore dimension errors\n }\n }\n\n return {\n id,\n filename,\n extension,\n path: relativePath,\n url,\n size: stats.size,\n width,\n height,\n createdAt: stats.birthtime,\n modifiedAt: stats.mtime,\n };\n }\n\n private extractCategory(imagePath: string): string {\n const parts = imagePath.split('/');\n // Return parent directory or 'root'\n if (parts.length > 1) {\n return parts[parts.length - 2];\n }\n return 'root';\n }\n}\n\n// ============================================================================\n// STATS & UTILITIES\n// ============================================================================\n\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\n}\n\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport type { Config, ImageCatalog, ImageInfo } from '../core/types';\nimport { ImageScanner } from '../scanner';\n\n// ============================================================================\n// TYPESCRIPT CONFIG GENERATOR\n// ============================================================================\n\nexport class ConfigGenerator {\n private config: Config;\n private scanner: ImageScanner;\n\n constructor(config: Config) {\n this.config = config;\n this.scanner = new ImageScanner(config);\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // GENERATE IMAGES.TS\n // ──────────────────────────────────────────────────────────────────────────\n\n async generate(): Promise<string> {\n const catalog = await this.scanner.buildCatalog();\n const outputPath = path.join(this.config.projectRoot, this.config.configOutputPath);\n\n // Ensure directory exists\n await fs.ensureDir(path.dirname(outputPath));\n\n // Generate TypeScript content\n const content = this.generateTypeScript(catalog);\n\n // Write file\n await fs.writeFile(outputPath, content, 'utf-8');\n\n return outputPath;\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // TYPESCRIPT GENERATION\n // ──────────────────────────────────────────────────────────────────────────\n\n private generateTypeScript(catalog: ImageCatalog): string {\n const categories = Object.keys(catalog.categories).sort();\n const allIds = catalog.images.map((img) => img.id).sort();\n\n return `/**\n * Auto-generated image catalog\n * Generated: ${catalog.generatedAt.toISOString()}\n * Total images: ${catalog.count}\n *\n * DO NOT EDIT - This file is auto-generated by @djangocfg/imgai\n * Run \\`imgai sync\\` to regenerate\n */\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface ImageData {\n id: string;\n filename: string;\n url: string;\n path: string;\n extension: string;\n width?: number;\n height?: number;\n size: number;\n}\n\nexport type ImageId = ${allIds.length > 0 ? allIds.map((id) => `'${id}'`).join(' | ') : 'string'};\nexport type ImageCategory = ${categories.length > 0 ? categories.map((c) => `'${c}'`).join(' | ') : 'string'};\n\n// ============================================================================\n// IMAGE CATALOG\n// ============================================================================\n\nexport const IMAGES: Record<ImageId, ImageData> = {\n${catalog.images.map((img) => this.generateImageEntry(img)).join(',\\n')}\n} as const;\n\n// ============================================================================\n// BY CATEGORY\n// ============================================================================\n\nexport const IMAGES_BY_CATEGORY: Record<ImageCategory, readonly ImageData[]> = {\n${categories.map((cat) => this.generateCategoryEntry(cat, catalog.categories[cat] || [])).join(',\\n')}\n} as const;\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\n/** Get image by ID */\nexport function getImage(id: ImageId): ImageData | undefined {\n return IMAGES[id];\n}\n\n/** Get image URL by ID */\nexport function getImageUrl(id: ImageId): string | undefined {\n return IMAGES[id]?.url;\n}\n\n/** Get all images in category */\nexport function getImagesByCategory(category: ImageCategory): readonly ImageData[] {\n return IMAGES_BY_CATEGORY[category] || [];\n}\n\n/** Get all image IDs */\nexport function getAllImageIds(): ImageId[] {\n return Object.keys(IMAGES) as ImageId[];\n}\n\n/** Get all categories */\nexport function getAllCategories(): ImageCategory[] {\n return Object.keys(IMAGES_BY_CATEGORY) as ImageCategory[];\n}\n\n/** Check if image exists */\nexport function hasImage(id: string): id is ImageId {\n return id in IMAGES;\n}\n\n// ============================================================================\n// METADATA\n// ============================================================================\n\nexport const IMAGE_CATALOG_META = {\n version: '${catalog.version}',\n generatedAt: '${catalog.generatedAt.toISOString()}',\n totalImages: ${catalog.count},\n categories: ${JSON.stringify(categories)},\n} as const;\n`;\n }\n\n private generateImageEntry(img: ImageInfo): string {\n const data: Record<string, unknown> = {\n id: img.id,\n filename: img.filename,\n url: img.url,\n path: img.path,\n extension: img.extension,\n size: img.size,\n };\n\n if (img.width) data.width = img.width;\n if (img.height) data.height = img.height;\n\n return ` '${img.id}': ${JSON.stringify(data, null, 4).replace(/\\n/g, '\\n ').replace(/}$/, ' }')}`;\n }\n\n private generateCategoryEntry(category: string, images: ImageInfo[]): string {\n const imageRefs = images.map((img) => `IMAGES['${img.id}']`);\n return ` '${category}': [${imageRefs.join(', ')}]`;\n }\n}\n\n// ============================================================================\n// QUICK CONFIG GENERATOR\n// ============================================================================\n\nexport async function generateImagesConfig(config: Config): Promise<string> {\n const generator = new ConfigGenerator(config);\n return generator.generate();\n}\n","import chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport type { Config, GenerateOptions, ScanOptions } from '../core/types';\nimport { ImageGenerator } from '../core/generator';\nimport { ImageScanner, formatBytes, formatDuration } from '../scanner';\nimport { ConfigGenerator } from '../config/generator';\n\n// ============================================================================\n// CLI INTERFACE\n// ============================================================================\n\nexport class ImageAICLI {\n private config: Config;\n private generator: ImageGenerator;\n private scanner: ImageScanner;\n private configGenerator: ConfigGenerator;\n\n constructor(config: Config) {\n this.config = config;\n this.generator = new ImageGenerator(config);\n this.scanner = new ImageScanner(config);\n this.configGenerator = new ConfigGenerator(config);\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // INTERACTIVE MODE\n // ──────────────────────────────────────────────────────────────────────────\n\n async interactive(): Promise<void> {\n this.printHeader();\n\n while (true) {\n try {\n const { action } = await inquirer.prompt([\n {\n type: 'list',\n name: 'action',\n message: chalk.cyan('What would you like to do?'),\n choices: [\n { name: `${chalk.green('🎨')} Generate image from prompt`, value: 'generate' },\n { name: `${chalk.blue('✨')} Generate with AI-enhanced prompt`, value: 'enhance' },\n { name: `${chalk.yellow('📦')} Batch generate images`, value: 'batch' },\n new inquirer.Separator(),\n { name: `${chalk.magenta('🔍')} Scan & catalog images`, value: 'scan' },\n { name: `${chalk.cyan('⚡')} Sync images.ts config`, value: 'sync' },\n { name: `${chalk.white('📊')} Show statistics`, value: 'stats' },\n new inquirer.Separator(),\n { name: `${chalk.gray('⚙️')} Settings`, value: 'settings' },\n { name: `${chalk.red('🚪')} Exit`, value: 'exit' },\n ],\n },\n ]);\n\n switch (action) {\n case 'generate':\n await this.promptGenerate();\n break;\n case 'enhance':\n await this.promptEnhance();\n break;\n case 'batch':\n await this.promptBatch();\n break;\n case 'scan':\n await this.runScan();\n break;\n case 'sync':\n await this.runSync();\n break;\n case 'stats':\n await this.showStats();\n break;\n case 'settings':\n await this.showSettings();\n break;\n case 'exit':\n console.log(chalk.cyan('\\n👋 Goodbye!\\n'));\n return;\n }\n\n console.log(''); // Empty line\n } catch (error) {\n // Handle Ctrl+C gracefully\n if (error instanceof Error && error.name === 'ExitPromptError') {\n console.log(chalk.cyan('\\n\\n👋 Goodbye!\\n'));\n return;\n }\n throw error;\n }\n }\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // GENERATE COMMANDS\n // ──────────────────────────────────────────────────────────────────────────\n\n async generate(options: GenerateOptions): Promise<void> {\n const spinner = ora('Generating image...').start();\n\n try {\n const result = await this.generator.generate(options);\n\n if (result.success) {\n spinner.succeed(chalk.green('Image generated successfully!'));\n console.log(chalk.gray(` Path: ${result.imagePath}`));\n console.log(chalk.gray(` URL: ${result.imageUrl}`));\n console.log(chalk.gray(` Time: ${formatDuration(result.duration || 0)}`));\n } else {\n spinner.fail(chalk.red(`Generation failed: ${result.error}`));\n }\n } catch (error) {\n spinner.fail(chalk.red(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`));\n }\n }\n\n async scan(options: ScanOptions = {}): Promise<void> {\n const spinner = ora('Scanning images...').start();\n\n try {\n const result = await this.scanner.scan(options);\n spinner.succeed(chalk.green(`Found ${result.total} images`));\n\n console.log(chalk.gray(` Total size: ${formatBytes(result.totalSize)}`));\n console.log(chalk.gray(` Scan time: ${formatDuration(result.scanDuration)}`));\n\n // Show by category\n console.log(chalk.cyan('\\n Categories:'));\n for (const [category, images] of Object.entries(result.byCategory)) {\n console.log(chalk.gray(` ${category}: ${images.length} images`));\n }\n\n // Show by extension\n console.log(chalk.cyan('\\n Extensions:'));\n for (const [ext, count] of Object.entries(result.byExtension)) {\n console.log(chalk.gray(` .${ext}: ${count} files`));\n }\n } catch (error) {\n spinner.fail(chalk.red(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`));\n }\n }\n\n async sync(): Promise<void> {\n const spinner = ora('Syncing images.ts config...').start();\n\n try {\n const outputPath = await this.configGenerator.generate();\n spinner.succeed(chalk.green('Config synced successfully!'));\n console.log(chalk.gray(` Output: ${outputPath}`));\n } catch (error) {\n spinner.fail(chalk.red(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`));\n }\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // PRIVATE PROMPT METHODS\n // ──────────────────────────────────────────────────────────────────────────\n\n private async promptGenerate(): Promise<void> {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'prompt',\n message: 'Enter image description:',\n validate: (input: string) => input.trim() ? true : 'Description is required',\n },\n {\n type: 'input',\n name: 'filename',\n message: 'Filename (optional, auto-generated if empty):',\n },\n {\n type: 'input',\n name: 'category',\n message: 'Category/folder (default: general):',\n default: 'general',\n },\n ]);\n\n await this.generate({\n prompt: answers.prompt,\n filename: answers.filename || undefined,\n category: answers.category,\n });\n }\n\n private async promptEnhance(): Promise<void> {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'description',\n message: 'Describe what you want:',\n validate: (input: string) => input.trim() ? true : 'Description is required',\n },\n {\n type: 'input',\n name: 'context',\n message: 'Additional context (optional):',\n },\n {\n type: 'input',\n name: 'category',\n message: 'Category/folder (default: general):',\n default: 'general',\n },\n ]);\n\n const spinner = ora('Enhancing prompt with AI...').start();\n\n try {\n const enhanced = await this.generator.enhancePrompt(\n answers.description,\n answers.context || undefined\n );\n\n spinner.succeed('Prompt enhanced!');\n console.log(chalk.cyan('\\n Enhanced prompt:'));\n console.log(chalk.gray(` ${enhanced.prompt}\\n`));\n console.log(chalk.gray(` Filename: ${enhanced.filename}`));\n console.log(chalk.gray(` Caption: ${enhanced.caption}\\n`));\n\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Generate image with this prompt?',\n default: true,\n },\n ]);\n\n if (confirm) {\n await this.generate({\n prompt: enhanced.prompt,\n filename: enhanced.filename,\n category: answers.category,\n metadata: { caption: enhanced.caption },\n });\n }\n } catch (error) {\n spinner.fail(chalk.red(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`));\n }\n }\n\n private async promptBatch(): Promise<void> {\n console.log(chalk.cyan('\\n Enter prompts (one per line, empty line to finish):'));\n\n const prompts: string[] = [];\n let lineNumber = 1;\n\n while (true) {\n const { prompt } = await inquirer.prompt([\n {\n type: 'input',\n name: 'prompt',\n message: ` ${lineNumber}.`,\n },\n ]);\n\n if (!prompt.trim()) break;\n prompts.push(prompt);\n lineNumber++;\n }\n\n if (prompts.length === 0) {\n console.log(chalk.yellow(' No prompts entered.'));\n return;\n }\n\n const { category, concurrency } = await inquirer.prompt([\n {\n type: 'input',\n name: 'category',\n message: 'Category for all images:',\n default: 'batch',\n },\n {\n type: 'list',\n name: 'concurrency',\n message: 'Concurrent workers:',\n choices: [\n { name: '1 (slow, safe)', value: 1 },\n { name: '2 (balanced)', value: 2 },\n { name: '3 (fast)', value: 3 },\n ],\n default: 2,\n },\n ]);\n\n console.log(chalk.cyan(`\\n Generating ${prompts.length} images...\\n`));\n\n const result = await this.generator.generateBatch({\n items: prompts.map((prompt, i) => ({\n prompt,\n category,\n filename: `batch-${Date.now()}-${i + 1}`,\n })),\n concurrency,\n onProgress: (current, total, res) => {\n const status = res.success ? chalk.green('✓') : chalk.red('✗');\n console.log(` ${status} ${current}/${total}`);\n },\n });\n\n console.log(chalk.cyan('\\n Batch complete!'));\n console.log(chalk.gray(` Success: ${result.success}`));\n console.log(chalk.gray(` Failed: ${result.failed}`));\n console.log(chalk.gray(` Time: ${formatDuration(result.duration)}`));\n }\n\n private async runScan(): Promise<void> {\n await this.scan();\n }\n\n private async runSync(): Promise<void> {\n await this.sync();\n }\n\n private async showStats(): Promise<void> {\n const spinner = ora('Gathering statistics...').start();\n\n try {\n const result = await this.scanner.scan();\n spinner.stop();\n\n console.log(chalk.cyan('\\n 📊 Image Statistics\\n'));\n console.log(chalk.white(` Total images: ${result.total}`));\n console.log(chalk.white(` Total size: ${formatBytes(result.totalSize)}`));\n console.log(chalk.white(` Categories: ${Object.keys(result.byCategory).length}`));\n\n console.log(chalk.cyan('\\n By Category:'));\n for (const [category, images] of Object.entries(result.byCategory).sort((a, b) => b[1].length - a[1].length)) {\n const size = images.reduce((sum, img) => sum + img.size, 0);\n console.log(chalk.gray(` ${category.padEnd(20)} ${images.length.toString().padStart(4)} images ${formatBytes(size).padStart(10)}`));\n }\n\n console.log(chalk.cyan('\\n By Extension:'));\n for (const [ext, count] of Object.entries(result.byExtension).sort((a, b) => b[1] - a[1])) {\n console.log(chalk.gray(` .${ext.padEnd(6)} ${count} files`));\n }\n } catch (error) {\n spinner.fail(chalk.red(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`));\n }\n }\n\n private async showSettings(): Promise<void> {\n console.log(chalk.cyan('\\n ⚙️ Current Settings\\n'));\n console.log(chalk.gray(` Provider: ${this.config.provider}`));\n console.log(chalk.gray(` Size: ${this.config.size}`));\n console.log(chalk.gray(` Quality: ${this.config.quality}`));\n console.log(chalk.gray(` Output dir: ${this.config.outputDir}`));\n console.log(chalk.gray(` Config path: ${this.config.configOutputPath}`));\n\n if (this.config.resize) {\n console.log(chalk.cyan('\\n Resize Settings:'));\n console.log(chalk.gray(` Width: ${this.config.resize.width || 'auto'}`));\n console.log(chalk.gray(` Height: ${this.config.resize.height || 'auto'}`));\n console.log(chalk.gray(` Format: ${this.config.resize.format}`));\n console.log(chalk.gray(` Quality: ${this.config.resize.quality}`));\n }\n\n if (this.config.style) {\n console.log(chalk.cyan('\\n Style:'));\n console.log(chalk.gray(` ${this.config.style.substring(0, 100)}...`));\n }\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // UI HELPERS\n // ──────────────────────────────────────────────────────────────────────────\n\n private printHeader(): void {\n console.log('');\n console.log(chalk.cyan(' ╔═══════════════════════════════════════════╗'));\n console.log(chalk.cyan(' ║') + chalk.white.bold(' 🎨 IMGAI - Image Generator ') + chalk.cyan('║'));\n console.log(chalk.cyan(' ║') + chalk.gray(' AI-powered image generation & sync ') + chalk.cyan('║'));\n console.log(chalk.cyan(' ╚═══════════════════════════════════════════╝'));\n console.log('');\n }\n}\n","#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport dotenv from 'dotenv';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { ImageAICLI } from './index';\nimport { ImageGenerator } from '../core/generator';\nimport { ImageScanner, formatBytes, formatDuration } from '../scanner';\nimport { ConfigGenerator } from '../config/generator';\nimport type { Config } from '../core/types';\n\n// ESM __dirname equivalent\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// Load environment variables from multiple locations\ndotenv.config(); // Current directory\ndotenv.config({ path: path.resolve(process.cwd(), '.env.local') }); // .env.local in cwd\ndotenv.config({ path: path.resolve(__dirname, '../../.env') }); // Package root\n\nconst program = new Command();\n\n// ============================================================================\n// CLI CONFIGURATION\n// ============================================================================\n\nfunction createConfig(options: Record<string, unknown>): Config {\n const projectRoot = (options.root as string) || process.cwd();\n\n return {\n provider: (options.provider as 'openai' | 'anthropic') || 'openai',\n openaiApiKey: process.env.OPENAI_API_KEY,\n anthropicApiKey: process.env.ANTHROPIC_API_KEY,\n size: (options.size as Config['size']) || '1792x1024',\n quality: (options.quality as Config['quality']) || 'standard',\n style: options.style as string | undefined,\n outputDir: (options.output as string) || 'public/static/images',\n projectRoot,\n srcDir: 'src',\n publicDir: 'public',\n configOutputPath: (options.config as string) || 'src/core/images.ts',\n resize: options.resize\n ? {\n width: options.width as number | undefined,\n height: options.height as number | undefined,\n quality: (options.quality as number) || 85,\n format: (options.format as 'webp' | 'jpeg' | 'png' | 'avif') || 'webp',\n fit: 'inside' as const,\n }\n : undefined,\n };\n}\n\n// ============================================================================\n// COMMANDS\n// ============================================================================\n\nprogram\n .name('imgai')\n .description('AI-powered image generation & management for Next.js')\n .version('1.0.0');\n\n// Interactive mode (default)\nprogram\n .command('interactive', { isDefault: true })\n .alias('i')\n .description('Start interactive mode')\n .option('-r, --root <path>', 'Project root directory')\n .action(async (options) => {\n const config = createConfig(options);\n const cli = new ImageAICLI(config);\n await cli.interactive();\n });\n\n// Generate single image\nprogram\n .command('generate <prompt>')\n .alias('g')\n .description('Generate image from prompt')\n .option('-f, --filename <name>', 'Output filename')\n .option('-c, --category <name>', 'Category/folder', 'general')\n .option('-r, --root <path>', 'Project root directory')\n .option('-o, --output <path>', 'Output directory', 'public/static/images')\n .option('--size <size>', 'Image size (1024x1024, 1792x1024, 1024x1792)', '1792x1024')\n .option('--quality <quality>', 'Image quality (standard, hd)', 'standard')\n .option('--style <style>', 'Style prefix for prompts')\n .option('--resize', 'Enable resize')\n .option('--width <pixels>', 'Resize width', parseInt)\n .option('--height <pixels>', 'Resize height', parseInt)\n .option('--format <format>', 'Output format (webp, jpeg, png, avif)', 'webp')\n .action(async (prompt, options) => {\n const config = createConfig(options);\n const generator = new ImageGenerator(config);\n const spinner = ora('Generating image...').start();\n\n try {\n const result = await generator.generate({\n prompt,\n filename: options.filename,\n category: options.category,\n });\n\n if (result.success) {\n spinner.succeed(chalk.green('Image generated!'));\n console.log(chalk.gray(` Path: ${result.imagePath}`));\n console.log(chalk.gray(` URL: ${result.imageUrl}`));\n } else {\n spinner.fail(chalk.red(result.error));\n }\n } catch (error) {\n spinner.fail(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n process.exit(1);\n }\n });\n\n// Scan images\nprogram\n .command('scan')\n .alias('s')\n .description('Scan and list all images')\n .option('-r, --root <path>', 'Project root directory')\n .option('-d, --dirs <dirs>', 'Directories to scan (comma-separated)', 'static/images,images')\n .option('--no-dimensions', 'Skip reading image dimensions')\n .action(async (options) => {\n const config = createConfig(options);\n const scanner = new ImageScanner(config);\n const spinner = ora('Scanning images...').start();\n\n try {\n const result = await scanner.scan({\n directories: options.dirs?.split(','),\n includeDimensions: options.dimensions !== false,\n });\n\n spinner.succeed(chalk.green(`Found ${result.total} images`));\n\n console.log(chalk.gray(`\\n Total size: ${formatBytes(result.totalSize)}`));\n console.log(chalk.gray(` Scan time: ${formatDuration(result.scanDuration)}`));\n\n console.log(chalk.cyan('\\n Categories:'));\n for (const [category, images] of Object.entries(result.byCategory)) {\n console.log(chalk.gray(` ${category}: ${images.length} images`));\n }\n\n console.log(chalk.cyan('\\n Extensions:'));\n for (const [ext, count] of Object.entries(result.byExtension)) {\n console.log(chalk.gray(` .${ext}: ${count} files`));\n }\n } catch (error) {\n spinner.fail(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n process.exit(1);\n }\n });\n\n// Sync config\nprogram\n .command('sync')\n .description('Generate/update images.ts config file')\n .option('-r, --root <path>', 'Project root directory')\n .option('-o, --output <path>', 'Output path for images.ts', 'src/core/images.ts')\n .action(async (options) => {\n const config = createConfig({ ...options, config: options.output });\n const generator = new ConfigGenerator(config);\n const spinner = ora('Generating images.ts...').start();\n\n try {\n const outputPath = await generator.generate();\n spinner.succeed(chalk.green('Config synced!'));\n console.log(chalk.gray(` Output: ${outputPath}`));\n } catch (error) {\n spinner.fail(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n process.exit(1);\n }\n });\n\n// Batch generate\nprogram\n .command('batch')\n .alias('b')\n .description('Batch generate images from file')\n .argument('<file>', 'JSON file with prompts array')\n .option('-r, --root <path>', 'Project root directory')\n .option('-c, --concurrency <num>', 'Concurrent generations', '2')\n .option('--category <name>', 'Category for all images', 'batch')\n .action(async (file, options) => {\n const config = createConfig(options);\n const generator = new ImageGenerator(config);\n\n // Read prompts file\n const fs = await import('fs-extra');\n const filePath = path.resolve(process.cwd(), file);\n\n if (!await fs.pathExists(filePath)) {\n console.error(chalk.red(`File not found: ${filePath}`));\n process.exit(1);\n }\n\n const data = await fs.readJson(filePath);\n const prompts = Array.isArray(data) ? data : data.prompts;\n\n if (!Array.isArray(prompts)) {\n console.error(chalk.red('Invalid file format. Expected array or { prompts: [] }'));\n process.exit(1);\n }\n\n console.log(chalk.cyan(`\\n Generating ${prompts.length} images...\\n`));\n\n const result = await generator.generateBatch({\n items: prompts.map((item, i) => ({\n prompt: typeof item === 'string' ? item : item.prompt,\n filename: typeof item === 'string' ? undefined : item.filename,\n category: options.category,\n })),\n concurrency: parseInt(options.concurrency),\n onProgress: (current, total, res) => {\n const status = res.success ? chalk.green('✓') : chalk.red('✗');\n console.log(` ${status} ${current}/${total} - ${res.imagePath || res.error}`);\n },\n });\n\n console.log(chalk.cyan('\\n Batch complete!'));\n console.log(chalk.gray(` Success: ${result.success}`));\n console.log(chalk.gray(` Failed: ${result.failed}`));\n console.log(chalk.gray(` Time: ${formatDuration(result.duration)}`));\n });\n\n// Parse and run\nprogram.parse();\n"]}
1
+ {"version":3,"sources":["../../src/core/generator.ts","../../src/scanner/index.ts","../../src/config/generator.ts","../../src/cli/index.ts","../../src/cli/bin.ts"],"names":["OpenAI","Anthropic","path","fs","sharp","glob","inquirer","chalk","ora","__filename","fileURLToPath","__dirname","dotenv","Command"],"mappings":"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","file":"bin.cjs","sourcesContent":["import fs from 'fs-extra';\nimport path from 'path';\nimport sharp from 'sharp';\nimport OpenAI from 'openai';\nimport Anthropic from '@anthropic-ai/sdk';\nimport type {\n Config,\n GenerateOptions,\n GenerationResult,\n BatchGenerateOptions,\n BatchResult,\n ImageInfo,\n ResizeOptions,\n} from './types';\n\n// ============================================================================\n// AI IMAGE GENERATOR\n// ============================================================================\n\nexport class ImageGenerator {\n private config: Config;\n private openai?: OpenAI;\n private anthropic?: Anthropic;\n\n constructor(config: Config) {\n this.config = config;\n this.initializeProviders();\n }\n\n private initializeProviders(): void {\n const openaiKey = this.config.openaiApiKey || process.env.OPENAI_API_KEY;\n const anthropicKey = this.config.anthropicApiKey || process.env.ANTHROPIC_API_KEY;\n\n if (openaiKey) {\n this.openai = new OpenAI({ apiKey: openaiKey });\n }\n\n if (anthropicKey) {\n this.anthropic = new Anthropic({ apiKey: anthropicKey });\n }\n\n if (!this.openai && this.config.provider === 'openai') {\n throw new Error('OpenAI API key required. Set OPENAI_API_KEY or pass openaiApiKey in config.');\n }\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // SINGLE IMAGE GENERATION\n // ──────────────────────────────────────────────────────────────────────────\n\n async generate(options: GenerateOptions): Promise<GenerationResult> {\n const startTime = Date.now();\n\n try {\n // Build full prompt with style\n const fullPrompt = this.buildPrompt(options.prompt);\n\n // Generate image using OpenAI DALL-E 3\n const imageData = await this.generateWithOpenAI(fullPrompt);\n\n // Generate filename\n const filename = options.filename || this.generateFilename(options.prompt);\n const category = options.category || 'general';\n\n // Determine output path\n const outputDir = path.join(\n this.config.projectRoot,\n this.config.outputDir,\n category\n );\n await fs.ensureDir(outputDir);\n\n // Save original image\n const originalPath = path.join(outputDir, `${filename}.png`);\n await fs.writeFile(originalPath, Buffer.from(imageData, 'base64'));\n\n // Resize if needed\n const resizeOptions = options.resize || this.config.resize;\n let finalPath = originalPath;\n\n if (resizeOptions) {\n finalPath = await this.resizeImage(originalPath, resizeOptions);\n // Remove original if format changed\n if (finalPath !== originalPath) {\n await fs.remove(originalPath);\n }\n }\n\n // Get image info\n const imageInfo = await this.getImageInfo(finalPath, category);\n\n // Add metadata\n imageInfo.metadata = {\n prompt: options.prompt,\n caption: options.metadata?.caption,\n tags: options.tags,\n category,\n generatedAt: new Date(),\n model: 'dall-e-3',\n };\n\n const duration = Date.now() - startTime;\n\n return {\n success: true,\n imagePath: finalPath,\n imageUrl: imageInfo.url,\n imageInfo,\n duration,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n duration: Date.now() - startTime,\n };\n }\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // BATCH GENERATION\n // ──────────────────────────────────────────────────────────────────────────\n\n async generateBatch(options: BatchGenerateOptions): Promise<BatchResult> {\n const startTime = Date.now();\n const results: GenerationResult[] = [];\n const concurrency = options.concurrency || 2;\n const delayBetween = options.delayBetween || 2000;\n\n // Process in batches\n for (let i = 0; i < options.items.length; i += concurrency) {\n const batch = options.items.slice(i, i + concurrency);\n\n const batchPromises = batch.map(async (item) => {\n const result = await this.generate({\n prompt: item.prompt,\n filename: item.filename,\n category: item.category,\n });\n return result;\n });\n\n const batchResults = await Promise.all(batchPromises);\n\n for (const result of batchResults) {\n results.push(result);\n if (options.onProgress) {\n options.onProgress(results.length, options.items.length, result);\n }\n }\n\n // Delay between batches\n if (i + concurrency < options.items.length) {\n await this.delay(delayBetween);\n }\n }\n\n return {\n total: results.length,\n success: results.filter((r) => r.success).length,\n failed: results.filter((r) => !r.success).length,\n results,\n duration: Date.now() - startTime,\n };\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // PROMPT ENHANCEMENT (using Claude/GPT)\n // ──────────────────────────────────────────────────────────────────────────\n\n async enhancePrompt(\n basePrompt: string,\n context?: string\n ): Promise<{ prompt: string; filename: string; caption: string }> {\n const systemPrompt = `You are an expert at creating image generation prompts.\nGiven a description, create:\n1. A detailed visual prompt (max 150 words) for DALL-E 3\n2. A descriptive filename (lowercase, hyphens, max 30 chars)\n3. A short caption (max 50 words)\n\n${this.config.prefix ? `Style prefix: ${this.config.prefix}` : ''}\n${this.config.suffix ? `Style suffix: ${this.config.suffix}` : ''}\n\nReturn ONLY valid JSON: {\"prompt\": \"...\", \"filename\": \"...\", \"caption\": \"...\"}`;\n\n const userPrompt = context\n ? `Description: ${basePrompt}\\nContext: ${context}`\n : `Description: ${basePrompt}`;\n\n if (this.anthropic && this.config.provider === 'anthropic') {\n const response = await this.anthropic.messages.create({\n model: 'claude-3-5-sonnet-20241022',\n max_tokens: 500,\n messages: [\n { role: 'user', content: `${systemPrompt}\\n\\n${userPrompt}` },\n ],\n });\n\n const text = response.content[0].type === 'text' ? response.content[0].text : '';\n return JSON.parse(text);\n }\n\n if (this.openai) {\n const response = await this.openai.chat.completions.create({\n model: 'gpt-4-turbo-preview',\n messages: [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userPrompt },\n ],\n max_tokens: 500,\n temperature: 0.7,\n response_format: { type: 'json_object' },\n });\n\n const text = response.choices[0]?.message?.content || '{}';\n return JSON.parse(text);\n }\n\n throw new Error('No AI provider configured for prompt enhancement');\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // PRIVATE METHODS\n // ──────────────────────────────────────────────────────────────────────────\n\n private async generateWithOpenAI(prompt: string): Promise<string> {\n if (!this.openai) {\n throw new Error('OpenAI client not initialized');\n }\n\n const response = await this.openai.images.generate({\n model: 'dall-e-3',\n prompt,\n n: 1,\n size: this.config.size,\n quality: this.config.quality,\n style: this.config.dalleStyle || 'natural',\n response_format: 'b64_json',\n });\n\n const imageData = response.data?.[0]?.b64_json;\n if (!imageData) {\n throw new Error('No image data received from OpenAI');\n }\n\n return imageData;\n }\n\n private async resizeImage(\n inputPath: string,\n options: ResizeOptions\n ): Promise<string> {\n const { width, height, quality = 85, format = 'webp', fit = 'inside' } = options;\n\n let pipeline = sharp(inputPath);\n\n // Resize if dimensions provided\n if (width || height) {\n pipeline = pipeline.resize(width, height, {\n fit,\n withoutEnlargement: true,\n });\n }\n\n // Convert format\n const outputPath = inputPath.replace(/\\.[^.]+$/, `.${format}`);\n\n switch (format) {\n case 'webp':\n pipeline = pipeline.webp({ quality });\n break;\n case 'jpeg':\n pipeline = pipeline.jpeg({ quality });\n break;\n case 'png':\n pipeline = pipeline.png({ quality });\n break;\n case 'avif':\n pipeline = pipeline.avif({ quality });\n break;\n }\n\n await pipeline.toFile(outputPath);\n return outputPath;\n }\n\n private async getImageInfo(imagePath: string, category: string): Promise<ImageInfo> {\n const stats = await fs.stat(imagePath);\n const metadata = await sharp(imagePath).metadata();\n const filename = path.basename(imagePath);\n const extension = path.extname(filename).slice(1);\n const id = path.basename(filename, path.extname(filename));\n\n // Calculate relative path from public directory\n const publicDir = path.join(this.config.projectRoot, this.config.publicDir);\n const relativePath = path.relative(publicDir, imagePath);\n const url = '/' + relativePath.replace(/\\\\/g, '/');\n\n return {\n id,\n filename,\n extension,\n path: relativePath,\n url,\n size: stats.size,\n width: metadata.width,\n height: metadata.height,\n createdAt: stats.birthtime,\n modifiedAt: stats.mtime,\n };\n }\n\n private buildPrompt(basePrompt: string): string {\n const parts: string[] = [];\n\n if (this.config.prefix) {\n parts.push(this.config.prefix);\n }\n\n parts.push(basePrompt);\n\n if (this.config.suffix) {\n parts.push(this.config.suffix);\n }\n\n return parts.join(' ');\n }\n\n private generateFilename(prompt: string): string {\n return prompt\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, '')\n .replace(/\\s+/g, '-')\n .substring(0, 30);\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { glob } from 'glob';\nimport sharp from 'sharp';\nimport type {\n Config,\n ImageInfo,\n ImageCatalog,\n ScanOptions,\n ScanResult,\n} from '../core/types';\n\n// ============================================================================\n// IMAGE SCANNER\n// ============================================================================\n\nconst DEFAULT_EXTENSIONS = ['png', 'jpg', 'jpeg', 'webp', 'avif', 'gif', 'svg'];\nconst DEFAULT_DIRECTORIES = ['static/images', 'images', 'assets'];\n\nexport class ImageScanner {\n private config: Config;\n\n constructor(config: Config) {\n this.config = config;\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // SCAN IMAGES\n // ──────────────────────────────────────────────────────────────────────────\n\n async scan(options: ScanOptions = {}): Promise<ScanResult> {\n const startTime = Date.now();\n\n const {\n directories = DEFAULT_DIRECTORIES,\n extensions = DEFAULT_EXTENSIONS,\n includeDimensions = true,\n recursive = true,\n } = options;\n\n const publicDir = path.join(this.config.projectRoot, this.config.publicDir);\n const images: ImageInfo[] = [];\n const byCategory: Record<string, ImageInfo[]> = {};\n const byExtension: Record<string, number> = {};\n let totalSize = 0;\n\n // Build glob patterns\n const patterns = directories.flatMap((dir) => {\n const basePath = path.join(publicDir, dir);\n const extPattern = `*.{${extensions.join(',')}}`;\n return recursive\n ? [path.join(basePath, '**', extPattern)]\n : [path.join(basePath, extPattern)];\n });\n\n // Find all images\n for (const pattern of patterns) {\n const files = await glob(pattern, { nodir: true });\n\n for (const filePath of files) {\n try {\n const imageInfo = await this.processImage(filePath, publicDir, includeDimensions);\n images.push(imageInfo);\n\n // Update stats\n totalSize += imageInfo.size;\n byExtension[imageInfo.extension] = (byExtension[imageInfo.extension] || 0) + 1;\n\n // Group by category (directory name)\n const category = this.extractCategory(imageInfo.path);\n if (!byCategory[category]) {\n byCategory[category] = [];\n }\n byCategory[category].push(imageInfo);\n } catch (error) {\n console.warn(`Failed to process image: ${filePath}`, error);\n }\n }\n }\n\n // Sort images by modification date (newest first)\n images.sort((a, b) => b.modifiedAt.getTime() - a.modifiedAt.getTime());\n\n return {\n images,\n total: images.length,\n byCategory,\n byExtension,\n totalSize,\n scanDuration: Date.now() - startTime,\n };\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // BUILD CATALOG\n // ──────────────────────────────────────────────────────────────────────────\n\n async buildCatalog(options: ScanOptions = {}): Promise<ImageCatalog> {\n const scanResult = await this.scan(options);\n\n const byId: Record<string, ImageInfo> = {};\n for (const image of scanResult.images) {\n byId[image.id] = image;\n }\n\n return {\n version: '1.0.0',\n generatedAt: new Date(),\n count: scanResult.total,\n categories: scanResult.byCategory,\n images: scanResult.images,\n byId,\n };\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // FIND SPECIFIC IMAGES\n // ──────────────────────────────────────────────────────────────────────────\n\n async findByCategory(category: string): Promise<ImageInfo[]> {\n const scanResult = await this.scan();\n return scanResult.byCategory[category] || [];\n }\n\n async findById(id: string): Promise<ImageInfo | undefined> {\n const scanResult = await this.scan();\n return scanResult.images.find((img) => img.id === id);\n }\n\n async findByExtension(extension: string): Promise<ImageInfo[]> {\n const scanResult = await this.scan();\n return scanResult.images.filter((img) => img.extension === extension);\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // PRIVATE METHODS\n // ──────────────────────────────────────────────────────────────────────────\n\n private async processImage(\n filePath: string,\n publicDir: string,\n includeDimensions: boolean\n ): Promise<ImageInfo> {\n const stats = await fs.stat(filePath);\n const filename = path.basename(filePath);\n const extension = path.extname(filename).slice(1).toLowerCase();\n const id = path.basename(filename, path.extname(filename));\n\n // Calculate paths\n const relativePath = path.relative(publicDir, filePath).replace(/\\\\/g, '/');\n const url = '/' + relativePath;\n\n let width: number | undefined;\n let height: number | undefined;\n\n // Get dimensions if requested (skip for SVG)\n if (includeDimensions && extension !== 'svg') {\n try {\n const metadata = await sharp(filePath).metadata();\n width = metadata.width;\n height = metadata.height;\n } catch {\n // Ignore dimension errors\n }\n }\n\n return {\n id,\n filename,\n extension,\n path: relativePath,\n url,\n size: stats.size,\n width,\n height,\n createdAt: stats.birthtime,\n modifiedAt: stats.mtime,\n };\n }\n\n private extractCategory(imagePath: string): string {\n const parts = imagePath.split('/');\n // Return parent directory or 'root'\n if (parts.length > 1) {\n return parts[parts.length - 2];\n }\n return 'root';\n }\n}\n\n// ============================================================================\n// STATS & UTILITIES\n// ============================================================================\n\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\n}\n\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport type { Config, ImageCatalog, ImageInfo } from '../core/types';\nimport { ImageScanner } from '../scanner';\n\n// ============================================================================\n// TYPESCRIPT CONFIG GENERATOR\n// ============================================================================\n\nexport class ConfigGenerator {\n private config: Config;\n private scanner: ImageScanner;\n\n constructor(config: Config) {\n this.config = config;\n this.scanner = new ImageScanner(config);\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // GENERATE IMAGES.TS\n // ──────────────────────────────────────────────────────────────────────────\n\n async generate(): Promise<string> {\n const catalog = await this.scanner.buildCatalog();\n const outputPath = path.join(this.config.projectRoot, this.config.configOutputPath);\n\n // Ensure directory exists\n await fs.ensureDir(path.dirname(outputPath));\n\n // Generate TypeScript content\n const content = this.generateTypeScript(catalog);\n\n // Write file\n await fs.writeFile(outputPath, content, 'utf-8');\n\n return outputPath;\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // TYPESCRIPT GENERATION\n // ──────────────────────────────────────────────────────────────────────────\n\n private generateTypeScript(catalog: ImageCatalog): string {\n const categories = Object.keys(catalog.categories).sort();\n const allIds = catalog.images.map((img) => img.id).sort();\n\n return `/**\n * Auto-generated image catalog\n * Generated: ${catalog.generatedAt.toISOString()}\n * Total images: ${catalog.count}\n *\n * DO NOT EDIT - This file is auto-generated by @djangocfg/imgai\n * Run \\`imgai sync\\` to regenerate\n */\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface ImageData {\n id: string;\n filename: string;\n url: string;\n path: string;\n extension: string;\n width?: number;\n height?: number;\n size: number;\n}\n\nexport type ImageId = ${allIds.length > 0 ? allIds.map((id) => `'${id}'`).join(' | ') : 'string'};\nexport type ImageCategory = ${categories.length > 0 ? categories.map((c) => `'${c}'`).join(' | ') : 'string'};\n\n// ============================================================================\n// IMAGE CATALOG\n// ============================================================================\n\nexport const IMAGES: Record<ImageId, ImageData> = {\n${catalog.images.map((img) => this.generateImageEntry(img)).join(',\\n')}\n} as const;\n\n// ============================================================================\n// BY CATEGORY\n// ============================================================================\n\nexport const IMAGES_BY_CATEGORY: Record<ImageCategory, readonly ImageData[]> = {\n${categories.map((cat) => this.generateCategoryEntry(cat, catalog.categories[cat] || [])).join(',\\n')}\n} as const;\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\n/** Get image by ID */\nexport function getImage(id: ImageId): ImageData | undefined {\n return IMAGES[id];\n}\n\n/** Get image URL by ID */\nexport function getImageUrl(id: ImageId): string | undefined {\n return IMAGES[id]?.url;\n}\n\n/** Get all images in category */\nexport function getImagesByCategory(category: ImageCategory): readonly ImageData[] {\n return IMAGES_BY_CATEGORY[category] || [];\n}\n\n/** Get all image IDs */\nexport function getAllImageIds(): ImageId[] {\n return Object.keys(IMAGES) as ImageId[];\n}\n\n/** Get all categories */\nexport function getAllCategories(): ImageCategory[] {\n return Object.keys(IMAGES_BY_CATEGORY) as ImageCategory[];\n}\n\n/** Check if image exists */\nexport function hasImage(id: string): id is ImageId {\n return id in IMAGES;\n}\n\n// ============================================================================\n// METADATA\n// ============================================================================\n\nexport const IMAGE_CATALOG_META = {\n version: '${catalog.version}',\n generatedAt: '${catalog.generatedAt.toISOString()}',\n totalImages: ${catalog.count},\n categories: ${JSON.stringify(categories)},\n} as const;\n`;\n }\n\n private generateImageEntry(img: ImageInfo): string {\n const data: Record<string, unknown> = {\n id: img.id,\n filename: img.filename,\n url: img.url,\n path: img.path,\n extension: img.extension,\n size: img.size,\n };\n\n if (img.width) data.width = img.width;\n if (img.height) data.height = img.height;\n\n return ` '${img.id}': ${JSON.stringify(data, null, 4).replace(/\\n/g, '\\n ').replace(/}$/, ' }')}`;\n }\n\n private generateCategoryEntry(category: string, images: ImageInfo[]): string {\n const imageRefs = images.map((img) => `IMAGES['${img.id}']`);\n return ` '${category}': [${imageRefs.join(', ')}]`;\n }\n}\n\n// ============================================================================\n// QUICK CONFIG GENERATOR\n// ============================================================================\n\nexport async function generateImagesConfig(config: Config): Promise<string> {\n const generator = new ConfigGenerator(config);\n return generator.generate();\n}\n","import chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport ora from 'ora';\nimport type { Config, GenerateOptions, ScanOptions } from '../core/types';\nimport { ImageGenerator } from '../core/generator';\nimport { ImageScanner, formatBytes, formatDuration } from '../scanner';\nimport { ConfigGenerator } from '../config/generator';\n\n// ============================================================================\n// CLI INTERFACE\n// ============================================================================\n\nexport class ImageAICLI {\n private config: Config;\n private generator: ImageGenerator;\n private scanner: ImageScanner;\n private configGenerator: ConfigGenerator;\n\n constructor(config: Config) {\n this.config = config;\n this.generator = new ImageGenerator(config);\n this.scanner = new ImageScanner(config);\n this.configGenerator = new ConfigGenerator(config);\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // INTERACTIVE MODE\n // ──────────────────────────────────────────────────────────────────────────\n\n async interactive(): Promise<void> {\n this.printHeader();\n\n while (true) {\n try {\n const { action } = await inquirer.prompt([\n {\n type: 'list',\n name: 'action',\n message: chalk.cyan('What would you like to do?'),\n choices: [\n { name: `${chalk.green('🎨')} Generate image from prompt`, value: 'generate' },\n { name: `${chalk.blue('✨')} Generate with AI-enhanced prompt`, value: 'enhance' },\n { name: `${chalk.yellow('📦')} Batch generate images`, value: 'batch' },\n new inquirer.Separator(),\n { name: `${chalk.magenta('🔍')} Scan & catalog images`, value: 'scan' },\n { name: `${chalk.cyan('⚡')} Sync images.ts config`, value: 'sync' },\n { name: `${chalk.white('📊')} Show statistics`, value: 'stats' },\n new inquirer.Separator(),\n { name: `${chalk.gray('⚙️')} Settings`, value: 'settings' },\n { name: `${chalk.red('🚪')} Exit`, value: 'exit' },\n ],\n },\n ]);\n\n switch (action) {\n case 'generate':\n await this.promptGenerate();\n break;\n case 'enhance':\n await this.promptEnhance();\n break;\n case 'batch':\n await this.promptBatch();\n break;\n case 'scan':\n await this.runScan();\n break;\n case 'sync':\n await this.runSync();\n break;\n case 'stats':\n await this.showStats();\n break;\n case 'settings':\n await this.showSettings();\n break;\n case 'exit':\n console.log(chalk.cyan('\\n👋 Goodbye!\\n'));\n return;\n }\n\n console.log(''); // Empty line\n } catch (error) {\n // Handle Ctrl+C gracefully\n if (error instanceof Error && error.name === 'ExitPromptError') {\n console.log(chalk.cyan('\\n\\n👋 Goodbye!\\n'));\n return;\n }\n throw error;\n }\n }\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // GENERATE COMMANDS\n // ──────────────────────────────────────────────────────────────────────────\n\n async generate(options: GenerateOptions): Promise<void> {\n const spinner = ora('Generating image...').start();\n\n try {\n const result = await this.generator.generate(options);\n\n if (result.success) {\n spinner.succeed(chalk.green('Image generated successfully!'));\n console.log(chalk.gray(` Path: ${result.imagePath}`));\n console.log(chalk.gray(` URL: ${result.imageUrl}`));\n console.log(chalk.gray(` Time: ${formatDuration(result.duration || 0)}`));\n } else {\n spinner.fail(chalk.red(`Generation failed: ${result.error}`));\n }\n } catch (error) {\n spinner.fail(chalk.red(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`));\n }\n }\n\n async scan(options: ScanOptions = {}): Promise<void> {\n const spinner = ora('Scanning images...').start();\n\n try {\n const result = await this.scanner.scan(options);\n spinner.succeed(chalk.green(`Found ${result.total} images`));\n\n console.log(chalk.gray(` Total size: ${formatBytes(result.totalSize)}`));\n console.log(chalk.gray(` Scan time: ${formatDuration(result.scanDuration)}`));\n\n // Show by category\n console.log(chalk.cyan('\\n Categories:'));\n for (const [category, images] of Object.entries(result.byCategory)) {\n console.log(chalk.gray(` ${category}: ${images.length} images`));\n }\n\n // Show by extension\n console.log(chalk.cyan('\\n Extensions:'));\n for (const [ext, count] of Object.entries(result.byExtension)) {\n console.log(chalk.gray(` .${ext}: ${count} files`));\n }\n } catch (error) {\n spinner.fail(chalk.red(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`));\n }\n }\n\n async sync(): Promise<void> {\n const spinner = ora('Syncing images.ts config...').start();\n\n try {\n const outputPath = await this.configGenerator.generate();\n spinner.succeed(chalk.green('Config synced successfully!'));\n console.log(chalk.gray(` Output: ${outputPath}`));\n } catch (error) {\n spinner.fail(chalk.red(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`));\n }\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // PRIVATE PROMPT METHODS\n // ──────────────────────────────────────────────────────────────────────────\n\n private async promptGenerate(): Promise<void> {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'prompt',\n message: 'Enter image description:',\n validate: (input: string) => input.trim() ? true : 'Description is required',\n },\n {\n type: 'input',\n name: 'filename',\n message: 'Filename (optional, auto-generated if empty):',\n },\n {\n type: 'input',\n name: 'category',\n message: 'Category/folder (default: general):',\n default: 'general',\n },\n ]);\n\n await this.generate({\n prompt: answers.prompt,\n filename: answers.filename || undefined,\n category: answers.category,\n });\n }\n\n private async promptEnhance(): Promise<void> {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'description',\n message: 'Describe what you want:',\n validate: (input: string) => input.trim() ? true : 'Description is required',\n },\n {\n type: 'input',\n name: 'context',\n message: 'Additional context (optional):',\n },\n {\n type: 'input',\n name: 'category',\n message: 'Category/folder (default: general):',\n default: 'general',\n },\n ]);\n\n const spinner = ora('Enhancing prompt with AI...').start();\n\n try {\n const enhanced = await this.generator.enhancePrompt(\n answers.description,\n answers.context || undefined\n );\n\n spinner.succeed('Prompt enhanced!');\n console.log(chalk.cyan('\\n Enhanced prompt:'));\n console.log(chalk.gray(` ${enhanced.prompt}\\n`));\n console.log(chalk.gray(` Filename: ${enhanced.filename}`));\n console.log(chalk.gray(` Caption: ${enhanced.caption}\\n`));\n\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Generate image with this prompt?',\n default: true,\n },\n ]);\n\n if (confirm) {\n await this.generate({\n prompt: enhanced.prompt,\n filename: enhanced.filename,\n category: answers.category,\n metadata: { caption: enhanced.caption },\n });\n }\n } catch (error) {\n spinner.fail(chalk.red(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`));\n }\n }\n\n private async promptBatch(): Promise<void> {\n console.log(chalk.cyan('\\n Enter prompts (one per line, empty line to finish):'));\n\n const prompts: string[] = [];\n let lineNumber = 1;\n\n while (true) {\n const { prompt } = await inquirer.prompt([\n {\n type: 'input',\n name: 'prompt',\n message: ` ${lineNumber}.`,\n },\n ]);\n\n if (!prompt.trim()) break;\n prompts.push(prompt);\n lineNumber++;\n }\n\n if (prompts.length === 0) {\n console.log(chalk.yellow(' No prompts entered.'));\n return;\n }\n\n const { category, concurrency } = await inquirer.prompt([\n {\n type: 'input',\n name: 'category',\n message: 'Category for all images:',\n default: 'batch',\n },\n {\n type: 'list',\n name: 'concurrency',\n message: 'Concurrent workers:',\n choices: [\n { name: '1 (slow, safe)', value: 1 },\n { name: '2 (balanced)', value: 2 },\n { name: '3 (fast)', value: 3 },\n ],\n default: 2,\n },\n ]);\n\n console.log(chalk.cyan(`\\n Generating ${prompts.length} images...\\n`));\n\n const result = await this.generator.generateBatch({\n items: prompts.map((prompt, i) => ({\n prompt,\n category,\n filename: `batch-${Date.now()}-${i + 1}`,\n })),\n concurrency,\n onProgress: (current, total, res) => {\n const status = res.success ? chalk.green('✓') : chalk.red('✗');\n console.log(` ${status} ${current}/${total}`);\n },\n });\n\n console.log(chalk.cyan('\\n Batch complete!'));\n console.log(chalk.gray(` Success: ${result.success}`));\n console.log(chalk.gray(` Failed: ${result.failed}`));\n console.log(chalk.gray(` Time: ${formatDuration(result.duration)}`));\n }\n\n private async runScan(): Promise<void> {\n await this.scan();\n }\n\n private async runSync(): Promise<void> {\n await this.sync();\n }\n\n private async showStats(): Promise<void> {\n const spinner = ora('Gathering statistics...').start();\n\n try {\n const result = await this.scanner.scan();\n spinner.stop();\n\n console.log(chalk.cyan('\\n 📊 Image Statistics\\n'));\n console.log(chalk.white(` Total images: ${result.total}`));\n console.log(chalk.white(` Total size: ${formatBytes(result.totalSize)}`));\n console.log(chalk.white(` Categories: ${Object.keys(result.byCategory).length}`));\n\n console.log(chalk.cyan('\\n By Category:'));\n for (const [category, images] of Object.entries(result.byCategory).sort((a, b) => b[1].length - a[1].length)) {\n const size = images.reduce((sum, img) => sum + img.size, 0);\n console.log(chalk.gray(` ${category.padEnd(20)} ${images.length.toString().padStart(4)} images ${formatBytes(size).padStart(10)}`));\n }\n\n console.log(chalk.cyan('\\n By Extension:'));\n for (const [ext, count] of Object.entries(result.byExtension).sort((a, b) => b[1] - a[1])) {\n console.log(chalk.gray(` .${ext.padEnd(6)} ${count} files`));\n }\n } catch (error) {\n spinner.fail(chalk.red(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`));\n }\n }\n\n private async showSettings(): Promise<void> {\n console.log(chalk.cyan('\\n ⚙️ Current Settings\\n'));\n console.log(chalk.gray(` Provider: ${this.config.provider}`));\n console.log(chalk.gray(` Size: ${this.config.size}`));\n console.log(chalk.gray(` Quality: ${this.config.quality}`));\n console.log(chalk.gray(` Output dir: ${this.config.outputDir}`));\n console.log(chalk.gray(` Config path: ${this.config.configOutputPath}`));\n\n if (this.config.resize) {\n console.log(chalk.cyan('\\n Resize Settings:'));\n console.log(chalk.gray(` Width: ${this.config.resize.width || 'auto'}`));\n console.log(chalk.gray(` Height: ${this.config.resize.height || 'auto'}`));\n console.log(chalk.gray(` Format: ${this.config.resize.format}`));\n console.log(chalk.gray(` Quality: ${this.config.resize.quality}`));\n }\n\n if (this.config.prefix || this.config.suffix) {\n console.log(chalk.cyan('\\n Prompt Modifiers:'));\n if (this.config.prefix) {\n console.log(chalk.gray(` Prefix: ${this.config.prefix.substring(0, 60)}...`));\n }\n if (this.config.suffix) {\n console.log(chalk.gray(` Suffix: ${this.config.suffix.substring(0, 60)}...`));\n }\n }\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // UI HELPERS\n // ──────────────────────────────────────────────────────────────────────────\n\n private printHeader(): void {\n console.log('');\n console.log(chalk.cyan(' ╔═══════════════════════════════════════════╗'));\n console.log(chalk.cyan(' ║') + chalk.white.bold(' 🎨 IMGAI - Image Generator ') + chalk.cyan('║'));\n console.log(chalk.cyan(' ║') + chalk.gray(' AI-powered image generation & sync ') + chalk.cyan('║'));\n console.log(chalk.cyan(' ╚═══════════════════════════════════════════╝'));\n console.log('');\n }\n}\n","#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport dotenv from 'dotenv';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { ImageAICLI } from './index';\nimport { ImageGenerator } from '../core/generator';\nimport { ImageScanner, formatBytes, formatDuration } from '../scanner';\nimport { ConfigGenerator } from '../config/generator';\nimport type { Config } from '../core/types';\n\n// ESM __dirname equivalent\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// Load environment variables from multiple locations\ndotenv.config(); // Current directory\ndotenv.config({ path: path.resolve(process.cwd(), '.env.local') }); // .env.local in cwd\ndotenv.config({ path: path.resolve(__dirname, '../../.env') }); // Package root\n\nconst program = new Command();\n\n// ============================================================================\n// CLI CONFIGURATION\n// ============================================================================\n\nfunction createConfig(options: Record<string, unknown>): Config {\n const projectRoot = (options.root as string) || process.cwd();\n\n return {\n provider: (options.provider as 'openai' | 'anthropic') || 'openai',\n openaiApiKey: process.env.OPENAI_API_KEY,\n anthropicApiKey: process.env.ANTHROPIC_API_KEY,\n size: (options.size as Config['size']) || '1792x1024',\n quality: (options.quality as Config['quality']) || 'standard',\n dalleStyle: (options.dalleStyle as 'vivid' | 'natural') || 'natural',\n prefix: options.prefix as string | undefined,\n suffix: options.suffix as string | undefined,\n outputDir: (options.output as string) || 'public/static/images',\n projectRoot,\n srcDir: 'src',\n publicDir: 'public',\n configOutputPath: (options.config as string) || 'src/core/images.ts',\n resize: options.resize\n ? {\n width: options.width as number | undefined,\n height: options.height as number | undefined,\n quality: (options.quality as number) || 85,\n format: (options.format as 'webp' | 'jpeg' | 'png' | 'avif') || 'webp',\n fit: 'inside' as const,\n }\n : undefined,\n };\n}\n\n// ============================================================================\n// COMMANDS\n// ============================================================================\n\nprogram\n .name('imgai')\n .description('AI-powered image generation & management for Next.js')\n .version('1.0.0');\n\n// Interactive mode (default)\nprogram\n .command('interactive', { isDefault: true })\n .alias('i')\n .description('Start interactive mode')\n .option('-r, --root <path>', 'Project root directory')\n .action(async (options) => {\n const config = createConfig(options);\n const cli = new ImageAICLI(config);\n await cli.interactive();\n });\n\n// Generate single image\nprogram\n .command('generate <prompt>')\n .alias('g')\n .description('Generate image from prompt')\n .option('-f, --filename <name>', 'Output filename')\n .option('-c, --category <name>', 'Category/folder', 'general')\n .option('-r, --root <path>', 'Project root directory')\n .option('-o, --output <path>', 'Output directory', 'public/static/images')\n .option('--size <size>', 'Image size (1024x1024, 1792x1024, 1024x1792)', '1792x1024')\n .option('--quality <quality>', 'Image quality (standard, hd)', 'standard')\n .option('--dalle-style <style>', 'DALL-E style (vivid, natural)', 'natural')\n .option('--prefix <text>', 'Text to prepend to prompt')\n .option('--suffix <text>', 'Text to append to prompt')\n .option('--resize', 'Enable resize')\n .option('--width <pixels>', 'Resize width', parseInt)\n .option('--height <pixels>', 'Resize height', parseInt)\n .option('--format <format>', 'Output format (webp, jpeg, png, avif)', 'webp')\n .action(async (prompt, options) => {\n const config = createConfig(options);\n const generator = new ImageGenerator(config);\n const spinner = ora('Generating image...').start();\n\n try {\n const result = await generator.generate({\n prompt,\n filename: options.filename,\n category: options.category,\n });\n\n if (result.success) {\n spinner.succeed(chalk.green('Image generated!'));\n console.log(chalk.gray(` Path: ${result.imagePath}`));\n console.log(chalk.gray(` URL: ${result.imageUrl}`));\n } else {\n spinner.fail(chalk.red(result.error));\n }\n } catch (error) {\n spinner.fail(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n process.exit(1);\n }\n });\n\n// Scan images\nprogram\n .command('scan')\n .alias('s')\n .description('Scan and list all images')\n .option('-r, --root <path>', 'Project root directory')\n .option('-d, --dirs <dirs>', 'Directories to scan (comma-separated)', 'static/images,images')\n .option('--no-dimensions', 'Skip reading image dimensions')\n .action(async (options) => {\n const config = createConfig(options);\n const scanner = new ImageScanner(config);\n const spinner = ora('Scanning images...').start();\n\n try {\n const result = await scanner.scan({\n directories: options.dirs?.split(','),\n includeDimensions: options.dimensions !== false,\n });\n\n spinner.succeed(chalk.green(`Found ${result.total} images`));\n\n console.log(chalk.gray(`\\n Total size: ${formatBytes(result.totalSize)}`));\n console.log(chalk.gray(` Scan time: ${formatDuration(result.scanDuration)}`));\n\n console.log(chalk.cyan('\\n Categories:'));\n for (const [category, images] of Object.entries(result.byCategory)) {\n console.log(chalk.gray(` ${category}: ${images.length} images`));\n }\n\n console.log(chalk.cyan('\\n Extensions:'));\n for (const [ext, count] of Object.entries(result.byExtension)) {\n console.log(chalk.gray(` .${ext}: ${count} files`));\n }\n } catch (error) {\n spinner.fail(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n process.exit(1);\n }\n });\n\n// Sync config\nprogram\n .command('sync')\n .description('Generate/update images.ts config file')\n .option('-r, --root <path>', 'Project root directory')\n .option('-o, --output <path>', 'Output path for images.ts', 'src/core/images.ts')\n .action(async (options) => {\n const config = createConfig({ ...options, config: options.output });\n const generator = new ConfigGenerator(config);\n const spinner = ora('Generating images.ts...').start();\n\n try {\n const outputPath = await generator.generate();\n spinner.succeed(chalk.green('Config synced!'));\n console.log(chalk.gray(` Output: ${outputPath}`));\n } catch (error) {\n spinner.fail(chalk.red(error instanceof Error ? error.message : 'Unknown error'));\n process.exit(1);\n }\n });\n\n// Batch generate\nprogram\n .command('batch')\n .alias('b')\n .description('Batch generate images from file')\n .argument('<file>', 'JSON file with prompts array')\n .option('-r, --root <path>', 'Project root directory')\n .option('-c, --concurrency <num>', 'Concurrent generations', '2')\n .option('--category <name>', 'Category for all images', 'batch')\n .action(async (file, options) => {\n const config = createConfig(options);\n const generator = new ImageGenerator(config);\n\n // Read prompts file\n const fs = await import('fs-extra');\n const filePath = path.resolve(process.cwd(), file);\n\n if (!await fs.pathExists(filePath)) {\n console.error(chalk.red(`File not found: ${filePath}`));\n process.exit(1);\n }\n\n const data = await fs.readJson(filePath);\n const prompts = Array.isArray(data) ? data : data.prompts;\n\n if (!Array.isArray(prompts)) {\n console.error(chalk.red('Invalid file format. Expected array or { prompts: [] }'));\n process.exit(1);\n }\n\n console.log(chalk.cyan(`\\n Generating ${prompts.length} images...\\n`));\n\n const result = await generator.generateBatch({\n items: prompts.map((item, i) => ({\n prompt: typeof item === 'string' ? item : item.prompt,\n filename: typeof item === 'string' ? undefined : item.filename,\n category: options.category,\n })),\n concurrency: parseInt(options.concurrency),\n onProgress: (current, total, res) => {\n const status = res.success ? chalk.green('✓') : chalk.red('✗');\n console.log(` ${status} ${current}/${total} - ${res.imagePath || res.error}`);\n },\n });\n\n console.log(chalk.cyan('\\n Batch complete!'));\n console.log(chalk.gray(` Success: ${result.success}`));\n console.log(chalk.gray(` Failed: ${result.failed}`));\n console.log(chalk.gray(` Time: ${formatDuration(result.duration)}`));\n });\n\n// Parse and run\nprogram.parse();\n"]}
package/dist/cli/bin.js CHANGED
@@ -131,7 +131,8 @@ Given a description, create:
131
131
  2. A descriptive filename (lowercase, hyphens, max 30 chars)
132
132
  3. A short caption (max 50 words)
133
133
 
134
- ${this.config.style ? `Style guide: ${this.config.style}` : ""}
134
+ ${this.config.prefix ? `Style prefix: ${this.config.prefix}` : ""}
135
+ ${this.config.suffix ? `Style suffix: ${this.config.suffix}` : ""}
135
136
 
136
137
  Return ONLY valid JSON: {"prompt": "...", "filename": "...", "caption": "..."}`;
137
138
  const userPrompt = context ? `Description: ${basePrompt}
@@ -178,6 +179,7 @@ ${userPrompt}` }
178
179
  n: 1,
179
180
  size: this.config.size,
180
181
  quality: this.config.quality,
182
+ style: this.config.dalleStyle || "natural",
181
183
  response_format: "b64_json"
182
184
  });
183
185
  const imageData = response.data?.[0]?.b64_json;
@@ -236,10 +238,15 @@ ${userPrompt}` }
236
238
  };
237
239
  }
238
240
  buildPrompt(basePrompt) {
239
- if (this.config.style) {
240
- return `${this.config.style}. ${basePrompt}`;
241
+ const parts = [];
242
+ if (this.config.prefix) {
243
+ parts.push(this.config.prefix);
241
244
  }
242
- return basePrompt;
245
+ parts.push(basePrompt);
246
+ if (this.config.suffix) {
247
+ parts.push(this.config.suffix);
248
+ }
249
+ return parts.join(" ");
243
250
  }
244
251
  generateFilename(prompt) {
245
252
  return prompt.toLowerCase().replace(/[^a-z0-9\s]/g, "").replace(/\s+/g, "-").substring(0, 30);
@@ -826,9 +833,14 @@ var ImageAICLI = class {
826
833
  console.log(chalk.gray(` Format: ${this.config.resize.format}`));
827
834
  console.log(chalk.gray(` Quality: ${this.config.resize.quality}`));
828
835
  }
829
- if (this.config.style) {
830
- console.log(chalk.cyan("\n Style:"));
831
- console.log(chalk.gray(` ${this.config.style.substring(0, 100)}...`));
836
+ if (this.config.prefix || this.config.suffix) {
837
+ console.log(chalk.cyan("\n Prompt Modifiers:"));
838
+ if (this.config.prefix) {
839
+ console.log(chalk.gray(` Prefix: ${this.config.prefix.substring(0, 60)}...`));
840
+ }
841
+ if (this.config.suffix) {
842
+ console.log(chalk.gray(` Suffix: ${this.config.suffix.substring(0, 60)}...`));
843
+ }
832
844
  }
833
845
  }
834
846
  // ──────────────────────────────────────────────────────────────────────────
@@ -859,7 +871,9 @@ function createConfig(options) {
859
871
  anthropicApiKey: process.env.ANTHROPIC_API_KEY,
860
872
  size: options.size || "1792x1024",
861
873
  quality: options.quality || "standard",
862
- style: options.style,
874
+ dalleStyle: options.dalleStyle || "natural",
875
+ prefix: options.prefix,
876
+ suffix: options.suffix,
863
877
  outputDir: options.output || "public/static/images",
864
878
  projectRoot,
865
879
  srcDir: "src",
@@ -880,7 +894,7 @@ program.command("interactive", { isDefault: true }).alias("i").description("Star
880
894
  const cli = new ImageAICLI(config);
881
895
  await cli.interactive();
882
896
  });
883
- program.command("generate <prompt>").alias("g").description("Generate image from prompt").option("-f, --filename <name>", "Output filename").option("-c, --category <name>", "Category/folder", "general").option("-r, --root <path>", "Project root directory").option("-o, --output <path>", "Output directory", "public/static/images").option("--size <size>", "Image size (1024x1024, 1792x1024, 1024x1792)", "1792x1024").option("--quality <quality>", "Image quality (standard, hd)", "standard").option("--style <style>", "Style prefix for prompts").option("--resize", "Enable resize").option("--width <pixels>", "Resize width", parseInt).option("--height <pixels>", "Resize height", parseInt).option("--format <format>", "Output format (webp, jpeg, png, avif)", "webp").action(async (prompt, options) => {
897
+ program.command("generate <prompt>").alias("g").description("Generate image from prompt").option("-f, --filename <name>", "Output filename").option("-c, --category <name>", "Category/folder", "general").option("-r, --root <path>", "Project root directory").option("-o, --output <path>", "Output directory", "public/static/images").option("--size <size>", "Image size (1024x1024, 1792x1024, 1024x1792)", "1792x1024").option("--quality <quality>", "Image quality (standard, hd)", "standard").option("--dalle-style <style>", "DALL-E style (vivid, natural)", "natural").option("--prefix <text>", "Text to prepend to prompt").option("--suffix <text>", "Text to append to prompt").option("--resize", "Enable resize").option("--width <pixels>", "Resize width", parseInt).option("--height <pixels>", "Resize height", parseInt).option("--format <format>", "Output format (webp, jpeg, png, avif)", "webp").action(async (prompt, options) => {
884
898
  const config = createConfig(options);
885
899
  const generator = new ImageGenerator(config);
886
900
  const spinner = ora("Generating image...").start();