opensentinel 2.1.1 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. package/README.md +354 -283
  2. package/dist/archiver-AVNBYCKQ.js +15340 -0
  3. package/dist/archiver-AVNBYCKQ.js.map +1 -0
  4. package/dist/audit-logger-OBPR7CRO.js +22 -0
  5. package/dist/auth-UOX5K2BE.js +18 -0
  6. package/dist/autonomy-ZXDBDQUJ.js +86 -0
  7. package/dist/autonomy-ZXDBDQUJ.js.map +1 -0
  8. package/dist/aws-s3-Q4LLZZPD.js +146 -0
  9. package/dist/aws-s3-Q4LLZZPD.js.map +1 -0
  10. package/dist/backup-restore-PZ7CYYB7.js +16 -0
  11. package/dist/blocks-R3PODY47.js +23 -0
  12. package/dist/bot-QRARP4UN.js +36 -0
  13. package/dist/brain-7XLLM3KC.js +56 -0
  14. package/dist/camera-monitor-M5CYKUU4.js +335 -0
  15. package/dist/camera-monitor-M5CYKUU4.js.map +1 -0
  16. package/dist/{charts-MMXM6BWW.js → charts-V7ARZNKF.js} +2 -2
  17. package/dist/chunk-22VGGA7S.js +330 -0
  18. package/dist/chunk-22VGGA7S.js.map +1 -0
  19. package/dist/chunk-35WYTA3C.js +382 -0
  20. package/dist/chunk-35WYTA3C.js.map +1 -0
  21. package/dist/chunk-3E2PSU2C.js +146 -0
  22. package/dist/chunk-3E2PSU2C.js.map +1 -0
  23. package/dist/{chunk-L3F43VPB.js → chunk-4GLYY4NN.js} +2 -2
  24. package/dist/{chunk-L3F43VPB.js.map → chunk-4GLYY4NN.js.map} +1 -1
  25. package/dist/{chunk-L3PDU3XN.js → chunk-4UOE5TUZ.js} +4 -4
  26. package/dist/{chunk-6SNHU3CY.js → chunk-66OJ3WB4.js} +2 -2
  27. package/dist/chunk-6KONMXQ6.js +297 -0
  28. package/dist/chunk-6KONMXQ6.js.map +1 -0
  29. package/dist/chunk-6PMVAAA7.js +196 -0
  30. package/dist/chunk-6PMVAAA7.js.map +1 -0
  31. package/dist/chunk-766ASQWE.js +32620 -0
  32. package/dist/chunk-766ASQWE.js.map +1 -0
  33. package/dist/chunk-7WQO5J2M.js +29 -0
  34. package/dist/chunk-7WQO5J2M.js.map +1 -0
  35. package/dist/chunk-APHSRMBS.js +148 -0
  36. package/dist/chunk-APHSRMBS.js.map +1 -0
  37. package/dist/{chunk-4LVWXUNC.js → chunk-AYUKPTSM.js} +57 -39
  38. package/dist/chunk-AYUKPTSM.js.map +1 -0
  39. package/dist/chunk-BIPYADGB.js +84 -0
  40. package/dist/chunk-BIPYADGB.js.map +1 -0
  41. package/dist/chunk-BRBWNV65.js +457 -0
  42. package/dist/chunk-BRBWNV65.js.map +1 -0
  43. package/dist/chunk-BXZ6EA52.js +382 -0
  44. package/dist/chunk-BXZ6EA52.js.map +1 -0
  45. package/dist/chunk-EVE7MIIY.js +290 -0
  46. package/dist/chunk-EVE7MIIY.js.map +1 -0
  47. package/dist/chunk-F3TTNID2.js +138 -0
  48. package/dist/chunk-F3TTNID2.js.map +1 -0
  49. package/dist/chunk-H5RQOFO2.js +190 -0
  50. package/dist/chunk-H5RQOFO2.js.map +1 -0
  51. package/dist/chunk-HN3F4WSW.js +145 -0
  52. package/dist/chunk-HN3F4WSW.js.map +1 -0
  53. package/dist/{chunk-6DRDKB45.js → chunk-I6BDYQIG.js} +20 -9
  54. package/dist/chunk-I6BDYQIG.js.map +1 -0
  55. package/dist/chunk-IZJMVV7O.js +347 -0
  56. package/dist/chunk-IZJMVV7O.js.map +1 -0
  57. package/dist/chunk-KM22GV7G.js +211 -0
  58. package/dist/chunk-KM22GV7G.js.map +1 -0
  59. package/dist/chunk-MGFBLVR7.js +103 -0
  60. package/dist/chunk-MGFBLVR7.js.map +1 -0
  61. package/dist/chunk-MQJ2ECQT.js +228 -0
  62. package/dist/chunk-MQJ2ECQT.js.map +1 -0
  63. package/dist/{chunk-F6QUZQGI.js → chunk-MXAPLSJ5.js} +2 -2
  64. package/dist/{chunk-GK3E2I7A.js → chunk-NHMBTUMW.js} +2 -2
  65. package/dist/chunk-NPRTSZIF.js +131 -0
  66. package/dist/chunk-NPRTSZIF.js.map +1 -0
  67. package/dist/chunk-O7IH7JTI.js +1898 -0
  68. package/dist/chunk-O7IH7JTI.js.map +1 -0
  69. package/dist/chunk-OCVQGBJK.js +293 -0
  70. package/dist/chunk-OCVQGBJK.js.map +1 -0
  71. package/dist/chunk-P6QINGFL.js +332 -0
  72. package/dist/chunk-P6QINGFL.js.map +1 -0
  73. package/dist/chunk-PHDZKPNE.js +91 -0
  74. package/dist/chunk-PHDZKPNE.js.map +1 -0
  75. package/dist/chunk-PLDDJCW6.js +49 -0
  76. package/dist/chunk-PTGTGXV2.js +164 -0
  77. package/dist/chunk-PTGTGXV2.js.map +1 -0
  78. package/dist/chunk-REMIY4U2.js +171 -0
  79. package/dist/chunk-REMIY4U2.js.map +1 -0
  80. package/dist/chunk-RZ4YESBG.js +141 -0
  81. package/dist/chunk-RZ4YESBG.js.map +1 -0
  82. package/dist/chunk-SAX5MHK4.js +111 -0
  83. package/dist/chunk-SAX5MHK4.js.map +1 -0
  84. package/dist/{chunk-GVJVEWHI.js → chunk-SJSUSJ47.js} +2 -2
  85. package/dist/chunk-SPPMCAKG.js +777 -0
  86. package/dist/chunk-SPPMCAKG.js.map +1 -0
  87. package/dist/chunk-SVAPX2XN.js +2441 -0
  88. package/dist/chunk-SVAPX2XN.js.map +1 -0
  89. package/dist/chunk-TVEWKIK3.js +452 -0
  90. package/dist/chunk-TVEWKIK3.js.map +1 -0
  91. package/dist/{chunk-HH2HBTQM.js → chunk-TYAGMJNV.js} +5 -5
  92. package/dist/{chunk-JXUP2X7V.js → chunk-VEHFVBLI.js} +2 -2
  93. package/dist/chunk-VNX5GMTN.js +128 -0
  94. package/dist/chunk-VNX5GMTN.js.map +1 -0
  95. package/dist/chunk-VRD5CYRL.js +1568 -0
  96. package/dist/chunk-VRD5CYRL.js.map +1 -0
  97. package/dist/chunk-WLUHNG6X.js +122 -0
  98. package/dist/chunk-WLUHNG6X.js.map +1 -0
  99. package/dist/chunk-WRAKK6K6.js +265 -0
  100. package/dist/chunk-WRAKK6K6.js.map +1 -0
  101. package/dist/chunk-XKYRH4FM.js +681 -0
  102. package/dist/chunk-XKYRH4FM.js.map +1 -0
  103. package/dist/{chunk-GUBEEYDW.js → chunk-XMCVRVTF.js} +2 -2
  104. package/dist/{chunk-GUBEEYDW.js.map → chunk-XMCVRVTF.js.map} +1 -1
  105. package/dist/chunk-ZLZKF2PM.js +310 -0
  106. package/dist/chunk-ZLZKF2PM.js.map +1 -0
  107. package/dist/cli.js +5 -1
  108. package/dist/cli.js.map +1 -1
  109. package/dist/client-ZQSFPMOB.js +21 -0
  110. package/dist/clipboard-manager-TEO2GEDN.js +24 -0
  111. package/dist/commands/setup.js +3 -3
  112. package/dist/commands/setup.js.map +1 -1
  113. package/dist/commands/start.js +3 -3
  114. package/dist/commands/status.js +2 -2
  115. package/dist/commands/stop.js +2 -2
  116. package/dist/commands/utils.js +2 -2
  117. package/dist/cron-explain-HHQKPD3M.js +16 -0
  118. package/dist/crypto-4AP47IKC.js +14 -0
  119. package/dist/crypto-4AP47IKC.js.map +1 -0
  120. package/dist/databases-37X4CI2Y.js +21 -0
  121. package/dist/databases-37X4CI2Y.js.map +1 -0
  122. package/dist/discord-B3HUPGQ6.js +70 -0
  123. package/dist/discord-B3HUPGQ6.js.map +1 -0
  124. package/dist/dist-UISMLMFN.js +21847 -0
  125. package/dist/dist-UISMLMFN.js.map +1 -0
  126. package/dist/email-K7LO2IPB.js +268 -0
  127. package/dist/email-K7LO2IPB.js.map +1 -0
  128. package/dist/enhanced-retrieval-DNLLEM4Z.js +753 -0
  129. package/dist/enhanced-retrieval-DNLLEM4Z.js.map +1 -0
  130. package/dist/enrichment-pipeline-MNHNW65K.js +13 -0
  131. package/dist/enrichment-pipeline-MNHNW65K.js.map +1 -0
  132. package/dist/entity-resolution-Y3IUWEAT.js +24 -0
  133. package/dist/entity-resolution-Y3IUWEAT.js.map +1 -0
  134. package/dist/env-IWXUVTCB.js +12 -0
  135. package/dist/env-IWXUVTCB.js.map +1 -0
  136. package/dist/google-workspace-DKWUVNGC.js +169 -0
  137. package/dist/google-workspace-DKWUVNGC.js.map +1 -0
  138. package/dist/hash-tool-ULQYD7B5.js +22 -0
  139. package/dist/hash-tool-ULQYD7B5.js.map +1 -0
  140. package/dist/heartbeat-monitor-GCISLXI3.js +22 -0
  141. package/dist/heartbeat-monitor-GCISLXI3.js.map +1 -0
  142. package/dist/image-generation-OSU7FP6F.js +486 -0
  143. package/dist/image-generation-OSU7FP6F.js.map +1 -0
  144. package/dist/imessage-NGA2XF2V.js +35 -0
  145. package/dist/imessage-NGA2XF2V.js.map +1 -0
  146. package/dist/inbox-summarizer-NRI4S7IF.js +47 -0
  147. package/dist/inbox-summarizer-NRI4S7IF.js.map +1 -0
  148. package/dist/incident-response-C5J7Q6DT.js +244 -0
  149. package/dist/incident-response-C5J7Q6DT.js.map +1 -0
  150. package/dist/inventory-manager-352OHXWD.js +24 -0
  151. package/dist/inventory-manager-352OHXWD.js.map +1 -0
  152. package/dist/jira-GSGDBMIG.js +199 -0
  153. package/dist/jira-GSGDBMIG.js.map +1 -0
  154. package/dist/json-tool-QE2SYHEG.js +26 -0
  155. package/dist/json-tool-QE2SYHEG.js.map +1 -0
  156. package/dist/key-rotation-DPHU4ZTB.js +18 -0
  157. package/dist/key-rotation-DPHU4ZTB.js.map +1 -0
  158. package/dist/lib.d.ts +603 -11
  159. package/dist/lib.js +161 -35
  160. package/dist/lib.js.map +1 -1
  161. package/dist/mailchimp-KKNF6QJ7.js +152 -0
  162. package/dist/mailchimp-KKNF6QJ7.js.map +1 -0
  163. package/dist/matrix-QVHG76I7.js +279 -0
  164. package/dist/matrix-QVHG76I7.js.map +1 -0
  165. package/dist/{mcp-LS7Q3Z5W.js → mcp-3JI6W7ZE.js} +3 -3
  166. package/dist/mcp-3JI6W7ZE.js.map +1 -0
  167. package/dist/microsoft365-UCBKJHNX.js +164 -0
  168. package/dist/microsoft365-UCBKJHNX.js.map +1 -0
  169. package/dist/ocr-AC7NPX33.js +22 -0
  170. package/dist/ocr-AC7NPX33.js.map +1 -0
  171. package/dist/ollama-BOAMSPLJ.js +8 -0
  172. package/dist/ollama-BOAMSPLJ.js.map +1 -0
  173. package/dist/pages-MI523RB7.js +26 -0
  174. package/dist/pages-MI523RB7.js.map +1 -0
  175. package/dist/pair-JDFTERIK.js +24 -0
  176. package/dist/pair-JDFTERIK.js.map +1 -0
  177. package/dist/pairing-IFQYCPNS.js +10 -0
  178. package/dist/pairing-IFQYCPNS.js.map +1 -0
  179. package/dist/pdf-ALQVOEJR.js +17 -0
  180. package/dist/pdf-ALQVOEJR.js.map +1 -0
  181. package/dist/presentations-DSV5IHG5.js +1002 -0
  182. package/dist/presentations-DSV5IHG5.js.map +1 -0
  183. package/dist/prometheus-JNT2BD4L.js +10 -0
  184. package/dist/prometheus-JNT2BD4L.js.map +1 -0
  185. package/dist/providers-J4LYPHDR.js +19 -0
  186. package/dist/providers-J4LYPHDR.js.map +1 -0
  187. package/dist/qr-code-WIX4PB4U.js +16 -0
  188. package/dist/qr-code-WIX4PB4U.js.map +1 -0
  189. package/dist/quickbooks-XB4NII2S.js +190 -0
  190. package/dist/quickbooks-XB4NII2S.js.map +1 -0
  191. package/dist/regex-tool-W4ABRKGK.js +24 -0
  192. package/dist/regex-tool-W4ABRKGK.js.map +1 -0
  193. package/dist/scheduler-VK4WFERV.js +63 -0
  194. package/dist/scheduler-VK4WFERV.js.map +1 -0
  195. package/dist/search-BCLBO5E3.js +25 -0
  196. package/dist/search-BCLBO5E3.js.map +1 -0
  197. package/dist/sendgrid-RNXCAFKM.js +152 -0
  198. package/dist/sendgrid-RNXCAFKM.js.map +1 -0
  199. package/dist/shopify-NCXYJB4R.js +171 -0
  200. package/dist/shopify-NCXYJB4R.js.map +1 -0
  201. package/dist/signal-6CGDFYL2.js +35 -0
  202. package/dist/signal-6CGDFYL2.js.map +1 -0
  203. package/dist/slack-IZQWIKOH.js +75 -0
  204. package/dist/slack-IZQWIKOH.js.map +1 -0
  205. package/dist/sms-M3JIOTCW.js +23 -0
  206. package/dist/sms-M3JIOTCW.js.map +1 -0
  207. package/dist/{src-K7GASHRH.js → src-VYUE6LRA.js} +138 -32
  208. package/dist/src-VYUE6LRA.js.map +1 -0
  209. package/dist/stocks-XXWBPOCU.js +14 -0
  210. package/dist/stocks-XXWBPOCU.js.map +1 -0
  211. package/dist/text-transform-6SGUA5Z4.js +22 -0
  212. package/dist/text-transform-6SGUA5Z4.js.map +1 -0
  213. package/dist/tools-2RLEI2N6.js +38 -0
  214. package/dist/tools-2RLEI2N6.js.map +1 -0
  215. package/dist/tunnel-IWMXUML4.js +301 -0
  216. package/dist/tunnel-IWMXUML4.js.map +1 -0
  217. package/dist/twilio-53GEW5JT.js +139 -0
  218. package/dist/twilio-53GEW5JT.js.map +1 -0
  219. package/dist/unit-converter-ZYXMEZOE.js +14 -0
  220. package/dist/unit-converter-ZYXMEZOE.js.map +1 -0
  221. package/dist/whatsapp-LFX6YKCM.js +35 -0
  222. package/dist/whatsapp-LFX6YKCM.js.map +1 -0
  223. package/dist/word-document-7B6SJMAY.js +902 -0
  224. package/dist/word-document-7B6SJMAY.js.map +1 -0
  225. package/dist/xero-QYO66D45.js +162 -0
  226. package/dist/xero-QYO66D45.js.map +1 -0
  227. package/dist/zapier-webhook-TBZ5YF2A.js +106 -0
  228. package/dist/zapier-webhook-TBZ5YF2A.js.map +1 -0
  229. package/drizzle/0002_mushy_master_mold.sql +140 -0
  230. package/drizzle/meta/0002_snapshot.json +3637 -0
  231. package/drizzle/meta/_journal.json +7 -0
  232. package/package.json +100 -98
  233. package/dist/bot-KJ26BG56.js +0 -15
  234. package/dist/chunk-4LVWXUNC.js.map +0 -1
  235. package/dist/chunk-4TG2IG5K.js +0 -5249
  236. package/dist/chunk-4TG2IG5K.js.map +0 -1
  237. package/dist/chunk-6DRDKB45.js.map +0 -1
  238. package/dist/chunk-CI6Q63MM.js +0 -1613
  239. package/dist/chunk-CI6Q63MM.js.map +0 -1
  240. package/dist/chunk-KHNYJY2Z.js +0 -178
  241. package/dist/chunk-KHNYJY2Z.js.map +0 -1
  242. package/dist/chunk-NSBPE2FW.js +0 -17
  243. package/dist/discord-ZOJFTVTB.js +0 -49
  244. package/dist/imessage-JFRB6EJ7.js +0 -14
  245. package/dist/scheduler-EZ7CZMCS.js +0 -42
  246. package/dist/signal-T3MCSULM.js +0 -14
  247. package/dist/slack-N2M4FHAJ.js +0 -54
  248. package/dist/src-K7GASHRH.js.map +0 -1
  249. package/dist/tools-24GZHYRF.js +0 -16
  250. package/dist/whatsapp-VCRUPAO5.js +0 -14
  251. /package/dist/{bot-KJ26BG56.js.map → audit-logger-OBPR7CRO.js.map} +0 -0
  252. /package/dist/{chunk-NSBPE2FW.js.map → auth-UOX5K2BE.js.map} +0 -0
  253. /package/dist/{discord-ZOJFTVTB.js.map → backup-restore-PZ7CYYB7.js.map} +0 -0
  254. /package/dist/{imessage-JFRB6EJ7.js.map → blocks-R3PODY47.js.map} +0 -0
  255. /package/dist/{mcp-LS7Q3Z5W.js.map → bot-QRARP4UN.js.map} +0 -0
  256. /package/dist/{scheduler-EZ7CZMCS.js.map → brain-7XLLM3KC.js.map} +0 -0
  257. /package/dist/{charts-MMXM6BWW.js.map → charts-V7ARZNKF.js.map} +0 -0
  258. /package/dist/{chunk-L3PDU3XN.js.map → chunk-4UOE5TUZ.js.map} +0 -0
  259. /package/dist/{chunk-6SNHU3CY.js.map → chunk-66OJ3WB4.js.map} +0 -0
  260. /package/dist/{chunk-F6QUZQGI.js.map → chunk-MXAPLSJ5.js.map} +0 -0
  261. /package/dist/{chunk-GK3E2I7A.js.map → chunk-NHMBTUMW.js.map} +0 -0
  262. /package/dist/{signal-T3MCSULM.js.map → chunk-PLDDJCW6.js.map} +0 -0
  263. /package/dist/{chunk-GVJVEWHI.js.map → chunk-SJSUSJ47.js.map} +0 -0
  264. /package/dist/{chunk-HH2HBTQM.js.map → chunk-TYAGMJNV.js.map} +0 -0
  265. /package/dist/{chunk-JXUP2X7V.js.map → chunk-VEHFVBLI.js.map} +0 -0
  266. /package/dist/{slack-N2M4FHAJ.js.map → client-ZQSFPMOB.js.map} +0 -0
  267. /package/dist/{tools-24GZHYRF.js.map → clipboard-manager-TEO2GEDN.js.map} +0 -0
  268. /package/dist/{whatsapp-VCRUPAO5.js.map → cron-explain-HHQKPD3M.js.map} +0 -0
@@ -0,0 +1,486 @@
1
+ import {
2
+ isPathAllowed
3
+ } from "./chunk-CQ4JURG7.js";
4
+ import "./chunk-PLDDJCW6.js";
5
+
6
+ // src/tools/file-generation/image-generation.ts
7
+ import { join } from "path";
8
+ import { tmpdir } from "os";
9
+ import { randomBytes } from "crypto";
10
+ import { writeFile, mkdir } from "fs/promises";
11
+ import { dirname } from "path";
12
+ var DEFAULT_OPTIONS = {
13
+ model: "dall-e-3",
14
+ size: "1024x1024",
15
+ quality: "standard",
16
+ style: "vivid",
17
+ n: 1,
18
+ format: "png",
19
+ responseFormat: "url"
20
+ };
21
+ function getTempPath(format = "png") {
22
+ const id = randomBytes(8).toString("hex");
23
+ return join(tmpdir(), `sentinel-image-${id}.${format}`);
24
+ }
25
+ function getOpenAIApiKey() {
26
+ return process.env.OPENAI_API_KEY;
27
+ }
28
+ function validateSizeForModel(size, model) {
29
+ const validSizes = {
30
+ "dall-e-2": ["256x256", "512x512", "1024x1024"],
31
+ "dall-e-3": ["1024x1024", "1024x1792", "1792x1024"],
32
+ "stable-diffusion": ["256x256", "512x512", "1024x1024"],
33
+ "midjourney": ["256x256", "512x512", "1024x1024", "1024x1792", "1792x1024"]
34
+ };
35
+ const modelSizes = validSizes[model] || validSizes["dall-e-3"];
36
+ if (modelSizes.includes(size)) {
37
+ return size;
38
+ }
39
+ return model === "dall-e-2" ? "1024x1024" : "1024x1024";
40
+ }
41
+ async function generateImageWithDALLE(prompt, filename, options = {}) {
42
+ const apiKey = getOpenAIApiKey();
43
+ if (!apiKey) {
44
+ return {
45
+ success: false,
46
+ error: "OPENAI_API_KEY environment variable is not set"
47
+ };
48
+ }
49
+ const finalOptions = { ...DEFAULT_OPTIONS, ...options };
50
+ const model = finalOptions.model === "dall-e-2" ? "dall-e-2" : "dall-e-3";
51
+ const size = validateSizeForModel(finalOptions.size, model);
52
+ const filePath = filename ? isPathAllowed(filename) ? filename : join(tmpdir(), filename) : getTempPath(finalOptions.format);
53
+ try {
54
+ await mkdir(dirname(filePath), { recursive: true });
55
+ const requestBody = {
56
+ model,
57
+ prompt,
58
+ n: model === "dall-e-3" ? 1 : Math.min(finalOptions.n || 1, 10),
59
+ size,
60
+ response_format: finalOptions.responseFormat || "url"
61
+ };
62
+ if (model === "dall-e-3") {
63
+ requestBody.quality = finalOptions.quality || "standard";
64
+ requestBody.style = finalOptions.style || "vivid";
65
+ }
66
+ if (finalOptions.user) {
67
+ requestBody.user = finalOptions.user;
68
+ }
69
+ const response = await fetch("https://api.openai.com/v1/images/generations", {
70
+ method: "POST",
71
+ headers: {
72
+ "Content-Type": "application/json",
73
+ Authorization: `Bearer ${apiKey}`
74
+ },
75
+ body: JSON.stringify(requestBody)
76
+ });
77
+ if (!response.ok) {
78
+ const errorData = await response.json().catch(() => ({}));
79
+ const errorMessage = errorData?.error?.message || response.statusText;
80
+ return {
81
+ success: false,
82
+ error: `OpenAI API error: ${errorMessage}`
83
+ };
84
+ }
85
+ const data = await response.json();
86
+ const imageData = data.data[0];
87
+ if (!imageData) {
88
+ return {
89
+ success: false,
90
+ error: "No image data received from API"
91
+ };
92
+ }
93
+ let savedFilePath;
94
+ if (imageData.url) {
95
+ const imageResponse = await fetch(imageData.url);
96
+ if (!imageResponse.ok) {
97
+ return {
98
+ success: false,
99
+ error: "Failed to download generated image"
100
+ };
101
+ }
102
+ const imageBuffer = await imageResponse.arrayBuffer();
103
+ await writeFile(filePath, Buffer.from(imageBuffer));
104
+ savedFilePath = filePath;
105
+ }
106
+ if (imageData.b64_json) {
107
+ const imageBuffer = Buffer.from(imageData.b64_json, "base64");
108
+ await writeFile(filePath, imageBuffer);
109
+ savedFilePath = filePath;
110
+ }
111
+ return {
112
+ success: true,
113
+ filePath: savedFilePath,
114
+ url: imageData.url,
115
+ revisedPrompt: imageData.revised_prompt,
116
+ base64: imageData.b64_json
117
+ };
118
+ } catch (error) {
119
+ return {
120
+ success: false,
121
+ error: error instanceof Error ? error.message : String(error)
122
+ };
123
+ }
124
+ }
125
+ async function generateMultipleImages(prompt, count = 4, options = {}) {
126
+ const results = [];
127
+ const model = options.model || "dall-e-3";
128
+ if (model === "dall-e-3") {
129
+ for (let i = 0; i < count; i++) {
130
+ const result = await generateImageWithDALLE(prompt, void 0, {
131
+ ...options,
132
+ n: 1
133
+ });
134
+ results.push(result);
135
+ if (i < count - 1) {
136
+ await new Promise((resolve) => setTimeout(resolve, 500));
137
+ }
138
+ }
139
+ } else {
140
+ const apiKey = getOpenAIApiKey();
141
+ if (!apiKey) {
142
+ return {
143
+ success: false,
144
+ images: [],
145
+ error: "OPENAI_API_KEY environment variable is not set"
146
+ };
147
+ }
148
+ const finalOptions = { ...DEFAULT_OPTIONS, ...options };
149
+ const size = validateSizeForModel(finalOptions.size, "dall-e-2");
150
+ try {
151
+ const response = await fetch("https://api.openai.com/v1/images/generations", {
152
+ method: "POST",
153
+ headers: {
154
+ "Content-Type": "application/json",
155
+ Authorization: `Bearer ${apiKey}`
156
+ },
157
+ body: JSON.stringify({
158
+ model: "dall-e-2",
159
+ prompt,
160
+ n: Math.min(count, 10),
161
+ size,
162
+ response_format: "url"
163
+ })
164
+ });
165
+ if (!response.ok) {
166
+ const errorData = await response.json().catch(() => ({}));
167
+ const errorMessage = errorData?.error?.message || response.statusText;
168
+ return {
169
+ success: false,
170
+ images: [],
171
+ error: `OpenAI API error: ${errorMessage}`
172
+ };
173
+ }
174
+ const data = await response.json();
175
+ for (let i = 0; i < data.data.length; i++) {
176
+ const imageData = data.data[i];
177
+ const filePath = getTempPath(finalOptions.format);
178
+ if (imageData.url) {
179
+ try {
180
+ await mkdir(dirname(filePath), { recursive: true });
181
+ const imageResponse = await fetch(imageData.url);
182
+ const imageBuffer = await imageResponse.arrayBuffer();
183
+ await writeFile(filePath, Buffer.from(imageBuffer));
184
+ results.push({
185
+ success: true,
186
+ filePath,
187
+ url: imageData.url
188
+ });
189
+ } catch (error) {
190
+ results.push({
191
+ success: false,
192
+ error: error instanceof Error ? error.message : String(error)
193
+ });
194
+ }
195
+ }
196
+ }
197
+ } catch (error) {
198
+ return {
199
+ success: false,
200
+ images: [],
201
+ error: error instanceof Error ? error.message : String(error)
202
+ };
203
+ }
204
+ }
205
+ return {
206
+ success: results.some((r) => r.success),
207
+ images: results
208
+ };
209
+ }
210
+ async function editImage(imagePath, prompt, options = {}) {
211
+ const apiKey = getOpenAIApiKey();
212
+ if (!apiKey) {
213
+ return {
214
+ success: false,
215
+ error: "OPENAI_API_KEY environment variable is not set"
216
+ };
217
+ }
218
+ if (!isPathAllowed(imagePath)) {
219
+ return {
220
+ success: false,
221
+ error: "Access to image path is not allowed"
222
+ };
223
+ }
224
+ if (options.mask && !isPathAllowed(options.mask)) {
225
+ return {
226
+ success: false,
227
+ error: "Access to mask path is not allowed"
228
+ };
229
+ }
230
+ const finalOptions = { ...DEFAULT_OPTIONS, ...options };
231
+ const size = validateSizeForModel(finalOptions.size, "dall-e-2");
232
+ const filePath = getTempPath(finalOptions.format);
233
+ try {
234
+ await mkdir(dirname(filePath), { recursive: true });
235
+ const fs = await import("fs/promises");
236
+ const imageBuffer = await fs.readFile(imagePath);
237
+ const imageArrayBuffer = new Uint8Array(imageBuffer).buffer;
238
+ const imageBlob = new Blob([imageArrayBuffer], { type: "image/png" });
239
+ const formData = new FormData();
240
+ formData.append("model", "dall-e-2");
241
+ formData.append("image", imageBlob, "image.png");
242
+ formData.append("prompt", prompt);
243
+ formData.append("n", "1");
244
+ formData.append("size", size);
245
+ formData.append("response_format", "url");
246
+ if (options.mask) {
247
+ const maskBuffer = await fs.readFile(options.mask);
248
+ const maskArrayBuffer = new Uint8Array(maskBuffer).buffer;
249
+ const maskBlob = new Blob([maskArrayBuffer], { type: "image/png" });
250
+ formData.append("mask", maskBlob, "mask.png");
251
+ }
252
+ const response = await fetch("https://api.openai.com/v1/images/edits", {
253
+ method: "POST",
254
+ headers: {
255
+ Authorization: `Bearer ${apiKey}`
256
+ },
257
+ body: formData
258
+ });
259
+ if (!response.ok) {
260
+ const errorData = await response.json().catch(() => ({}));
261
+ const errorMessage = errorData?.error?.message || response.statusText;
262
+ return {
263
+ success: false,
264
+ error: `OpenAI API error: ${errorMessage}`
265
+ };
266
+ }
267
+ const data = await response.json();
268
+ const imageData = data.data[0];
269
+ if (imageData?.url) {
270
+ const imageResponse = await fetch(imageData.url);
271
+ const downloadedBuffer = await imageResponse.arrayBuffer();
272
+ await writeFile(filePath, Buffer.from(downloadedBuffer));
273
+ return {
274
+ success: true,
275
+ filePath,
276
+ url: imageData.url
277
+ };
278
+ }
279
+ return {
280
+ success: false,
281
+ error: "No image data received from API"
282
+ };
283
+ } catch (error) {
284
+ return {
285
+ success: false,
286
+ error: error instanceof Error ? error.message : String(error)
287
+ };
288
+ }
289
+ }
290
+ async function createImageVariations(imagePath, count = 1, options = {}) {
291
+ const apiKey = getOpenAIApiKey();
292
+ if (!apiKey) {
293
+ return {
294
+ success: false,
295
+ images: [],
296
+ error: "OPENAI_API_KEY environment variable is not set"
297
+ };
298
+ }
299
+ if (!isPathAllowed(imagePath)) {
300
+ return {
301
+ success: false,
302
+ images: [],
303
+ error: "Access to image path is not allowed"
304
+ };
305
+ }
306
+ const finalOptions = { ...DEFAULT_OPTIONS, ...options };
307
+ const size = validateSizeForModel(finalOptions.size, "dall-e-2");
308
+ const results = [];
309
+ try {
310
+ const fs = await import("fs/promises");
311
+ const imageBuffer = await fs.readFile(imagePath);
312
+ const imageArrayBuffer = new Uint8Array(imageBuffer).buffer;
313
+ const imageBlob = new Blob([imageArrayBuffer], { type: "image/png" });
314
+ const formData = new FormData();
315
+ formData.append("model", "dall-e-2");
316
+ formData.append("image", imageBlob, "image.png");
317
+ formData.append("n", String(Math.min(count, 10)));
318
+ formData.append("size", size);
319
+ formData.append("response_format", "url");
320
+ const response = await fetch("https://api.openai.com/v1/images/variations", {
321
+ method: "POST",
322
+ headers: {
323
+ Authorization: `Bearer ${apiKey}`
324
+ },
325
+ body: formData
326
+ });
327
+ if (!response.ok) {
328
+ const errorData = await response.json().catch(() => ({}));
329
+ const errorMessage = errorData?.error?.message || response.statusText;
330
+ return {
331
+ success: false,
332
+ images: [],
333
+ error: `OpenAI API error: ${errorMessage}`
334
+ };
335
+ }
336
+ const data = await response.json();
337
+ for (const imageData of data.data) {
338
+ const filePath = getTempPath(finalOptions.format);
339
+ if (imageData?.url) {
340
+ try {
341
+ await mkdir(dirname(filePath), { recursive: true });
342
+ const imageResponse = await fetch(imageData.url);
343
+ const downloadedBuffer = await imageResponse.arrayBuffer();
344
+ await writeFile(filePath, Buffer.from(downloadedBuffer));
345
+ results.push({
346
+ success: true,
347
+ filePath,
348
+ url: imageData.url
349
+ });
350
+ } catch (error) {
351
+ results.push({
352
+ success: false,
353
+ error: error instanceof Error ? error.message : String(error)
354
+ });
355
+ }
356
+ }
357
+ }
358
+ return {
359
+ success: results.some((r) => r.success),
360
+ images: results
361
+ };
362
+ } catch (error) {
363
+ return {
364
+ success: false,
365
+ images: [],
366
+ error: error instanceof Error ? error.message : String(error)
367
+ };
368
+ }
369
+ }
370
+ async function generatePlaceholderImage(prompt, filename, options = {}) {
371
+ const finalOptions = { ...DEFAULT_OPTIONS, ...options };
372
+ const [widthStr, heightStr] = (finalOptions.size || "1024x1024").split("x");
373
+ const width = parseInt(widthStr, 10);
374
+ const height = parseInt(heightStr, 10);
375
+ const filePath = filename ? isPathAllowed(filename) ? filename : join(tmpdir(), filename) : getTempPath("svg");
376
+ try {
377
+ await mkdir(dirname(filePath), { recursive: true });
378
+ const svgContent = generatePlaceholderSVG(prompt, width, height);
379
+ const svgPath = filePath.replace(/\.(png|jpeg|webp)$/, ".svg");
380
+ await writeFile(svgPath, svgContent, "utf-8");
381
+ return {
382
+ success: true,
383
+ filePath: svgPath,
384
+ revisedPrompt: `[Placeholder for: ${prompt}]`
385
+ };
386
+ } catch (error) {
387
+ return {
388
+ success: false,
389
+ error: error instanceof Error ? error.message : String(error)
390
+ };
391
+ }
392
+ }
393
+ function generatePlaceholderSVG(prompt, width, height) {
394
+ const hash = simpleHash(prompt);
395
+ const hue1 = hash % 360;
396
+ const hue2 = hash * 7 % 360;
397
+ const displayPrompt = prompt.length > 50 ? prompt.substring(0, 47) + "..." : prompt;
398
+ const escapedPrompt = displayPrompt.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
399
+ return `<?xml version="1.0" encoding="UTF-8"?>
400
+ <svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}">
401
+ <defs>
402
+ <linearGradient id="grad" x1="0%" y1="0%" x2="100%" y2="100%">
403
+ <stop offset="0%" style="stop-color:hsl(${hue1}, 70%, 60%);stop-opacity:1" />
404
+ <stop offset="100%" style="stop-color:hsl(${hue2}, 70%, 40%);stop-opacity:1" />
405
+ </linearGradient>
406
+ <pattern id="pattern" patternUnits="userSpaceOnUse" width="40" height="40">
407
+ <circle cx="20" cy="20" r="2" fill="rgba(255,255,255,0.1)"/>
408
+ </pattern>
409
+ </defs>
410
+ <rect width="100%" height="100%" fill="url(#grad)"/>
411
+ <rect width="100%" height="100%" fill="url(#pattern)"/>
412
+ <rect x="10%" y="40%" width="80%" height="20%" rx="10" fill="rgba(0,0,0,0.3)"/>
413
+ <text x="50%" y="48%" font-family="Arial, sans-serif" font-size="${Math.max(12, width / 40)}" fill="white" text-anchor="middle" dominant-baseline="middle">
414
+ AI Image Placeholder
415
+ </text>
416
+ <text x="50%" y="56%" font-family="Arial, sans-serif" font-size="${Math.max(10, width / 50)}" fill="rgba(255,255,255,0.8)" text-anchor="middle" dominant-baseline="middle">
417
+ ${escapedPrompt}
418
+ </text>
419
+ <text x="50%" y="90%" font-family="Arial, sans-serif" font-size="${Math.max(8, width / 60)}" fill="rgba(255,255,255,0.5)" text-anchor="middle">
420
+ ${width} x ${height}
421
+ </text>
422
+ </svg>`;
423
+ }
424
+ function simpleHash(str) {
425
+ let hash = 0;
426
+ for (let i = 0; i < str.length; i++) {
427
+ const char = str.charCodeAt(i);
428
+ hash = (hash << 5) - hash + char;
429
+ hash = hash & hash;
430
+ }
431
+ return Math.abs(hash);
432
+ }
433
+ function enhancePrompt(prompt, style) {
434
+ const styleEnhancements = {
435
+ photorealistic: ", photorealistic, highly detailed, 8k resolution, professional photography",
436
+ artistic: ", artistic style, creative composition, vibrant colors, expressive brushstrokes",
437
+ minimal: ", minimalist design, clean lines, simple composition, modern aesthetic",
438
+ cinematic: ", cinematic lighting, dramatic atmosphere, movie still, widescreen composition",
439
+ anime: ", anime style, vibrant colors, detailed character design, Japanese animation aesthetic",
440
+ "3d": ", 3D rendered, octane render, high quality, detailed textures, realistic lighting",
441
+ watercolor: ", watercolor painting, soft edges, flowing colors, artistic texture",
442
+ sketch: ", pencil sketch, detailed linework, artistic drawing, hand-drawn style",
443
+ vintage: ", vintage style, retro aesthetic, film grain, nostalgic mood, aged appearance",
444
+ fantasy: ", fantasy art, magical atmosphere, ethereal lighting, imaginative elements",
445
+ scifi: ", science fiction, futuristic design, advanced technology, space aesthetic",
446
+ portrait: ", professional portrait, studio lighting, sharp focus, detailed features",
447
+ landscape: ", scenic landscape, natural beauty, atmospheric perspective, golden hour lighting",
448
+ abstract: ", abstract art, non-representational, bold colors, geometric shapes"
449
+ };
450
+ if (style && styleEnhancements[style.toLowerCase()]) {
451
+ return prompt + styleEnhancements[style.toLowerCase()];
452
+ }
453
+ return prompt;
454
+ }
455
+ async function generateImage(prompt, filename, options) {
456
+ let finalPrompt = prompt;
457
+ if (options?.enhancePrompt || options?.promptStyle) {
458
+ finalPrompt = enhancePrompt(prompt, options?.promptStyle);
459
+ }
460
+ const result = await generateImageWithDALLE(finalPrompt, filename, options);
461
+ if (!result.success && result.error?.includes("OPENAI_API_KEY")) {
462
+ console.log("[ImageGeneration] OpenAI API key not available, generating placeholder");
463
+ return generatePlaceholderImage(prompt, filename, options);
464
+ }
465
+ return result;
466
+ }
467
+ var image_generation_default = {
468
+ generateImage,
469
+ generateImageWithDALLE,
470
+ generateMultipleImages,
471
+ editImage,
472
+ createImageVariations,
473
+ generatePlaceholderImage,
474
+ enhancePrompt
475
+ };
476
+ export {
477
+ createImageVariations,
478
+ image_generation_default as default,
479
+ editImage,
480
+ enhancePrompt,
481
+ generateImage,
482
+ generateImageWithDALLE,
483
+ generateMultipleImages,
484
+ generatePlaceholderImage
485
+ };
486
+ //# sourceMappingURL=image-generation-OSU7FP6F.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/file-generation/image-generation.ts"],"sourcesContent":["import { join } from \"path\";\nimport { tmpdir } from \"os\";\nimport { randomBytes } from \"crypto\";\nimport { writeFile, mkdir } from \"fs/promises\";\nimport { dirname } from \"path\";\nimport { isPathAllowed } from \"../../utils/paths\";\n\nexport type ImageSize = \"256x256\" | \"512x512\" | \"1024x1024\" | \"1024x1792\" | \"1792x1024\";\nexport type ImageQuality = \"standard\" | \"hd\";\nexport type ImageStyle = \"natural\" | \"vivid\";\nexport type ImageModel = \"dall-e-2\" | \"dall-e-3\" | \"stable-diffusion\" | \"midjourney\";\nexport type ImageFormat = \"png\" | \"jpeg\" | \"webp\" | \"svg\";\n\nexport interface ImageGenerationOptions {\n model?: ImageModel;\n size?: ImageSize;\n quality?: ImageQuality;\n style?: ImageStyle;\n n?: number;\n format?: ImageFormat;\n responseFormat?: \"url\" | \"b64_json\";\n user?: string;\n}\n\nexport interface ImageGenerationResult {\n success: boolean;\n filePath?: string;\n url?: string;\n revisedPrompt?: string;\n base64?: string;\n error?: string;\n}\n\nexport interface BatchImageGenerationResult {\n success: boolean;\n images: ImageGenerationResult[];\n error?: string;\n}\n\nexport interface ImageEditOptions extends ImageGenerationOptions {\n mask?: string; // Path to mask image for inpainting\n}\n\nexport interface ImageVariationOptions extends ImageGenerationOptions {\n image: string; // Path to source image\n}\n\n// Default options\nconst DEFAULT_OPTIONS: ImageGenerationOptions = {\n model: \"dall-e-3\",\n size: \"1024x1024\",\n quality: \"standard\",\n style: \"vivid\",\n n: 1,\n format: \"png\",\n responseFormat: \"url\",\n};\n\n// Generate temp file path\nfunction getTempPath(format: ImageFormat = \"png\"): string {\n const id = randomBytes(8).toString(\"hex\");\n return join(tmpdir(), `sentinel-image-${id}.${format}`);\n}\n\n// Get OpenAI API key from environment\nfunction getOpenAIApiKey(): string | undefined {\n return process.env.OPENAI_API_KEY;\n}\n\n// Validate image size for model\nfunction validateSizeForModel(size: ImageSize, model: ImageModel): ImageSize {\n const validSizes: Record<ImageModel, ImageSize[]> = {\n \"dall-e-2\": [\"256x256\", \"512x512\", \"1024x1024\"],\n \"dall-e-3\": [\"1024x1024\", \"1024x1792\", \"1792x1024\"],\n \"stable-diffusion\": [\"256x256\", \"512x512\", \"1024x1024\"],\n \"midjourney\": [\"256x256\", \"512x512\", \"1024x1024\", \"1024x1792\", \"1792x1024\"],\n };\n\n const modelSizes = validSizes[model] || validSizes[\"dall-e-3\"];\n\n if (modelSizes.includes(size)) {\n return size;\n }\n\n // Return default size for model\n return model === \"dall-e-2\" ? \"1024x1024\" : \"1024x1024\";\n}\n\n// Generate image using OpenAI DALL-E API\nexport async function generateImageWithDALLE(\n prompt: string,\n filename?: string,\n options: ImageGenerationOptions = {}\n): Promise<ImageGenerationResult> {\n const apiKey = getOpenAIApiKey();\n if (!apiKey) {\n return {\n success: false,\n error: \"OPENAI_API_KEY environment variable is not set\",\n };\n }\n\n const finalOptions = { ...DEFAULT_OPTIONS, ...options };\n const model = finalOptions.model === \"dall-e-2\" ? \"dall-e-2\" : \"dall-e-3\";\n const size = validateSizeForModel(finalOptions.size!, model);\n\n const filePath = filename\n ? isPathAllowed(filename)\n ? filename\n : join(tmpdir(), filename)\n : getTempPath(finalOptions.format);\n\n try {\n await mkdir(dirname(filePath), { recursive: true });\n\n const requestBody: Record<string, unknown> = {\n model,\n prompt,\n n: model === \"dall-e-3\" ? 1 : Math.min(finalOptions.n || 1, 10),\n size,\n response_format: finalOptions.responseFormat || \"url\",\n };\n\n // DALL-E 3 specific options\n if (model === \"dall-e-3\") {\n requestBody.quality = finalOptions.quality || \"standard\";\n requestBody.style = finalOptions.style || \"vivid\";\n }\n\n if (finalOptions.user) {\n requestBody.user = finalOptions.user;\n }\n\n const response = await fetch(\"https://api.openai.com/v1/images/generations\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n const errorMessage = (errorData as { error?: { message?: string } })?.error?.message || response.statusText;\n return {\n success: false,\n error: `OpenAI API error: ${errorMessage}`,\n };\n }\n\n const data = await response.json() as {\n data: Array<{\n url?: string;\n b64_json?: string;\n revised_prompt?: string;\n }>;\n };\n\n const imageData = data.data[0];\n\n if (!imageData) {\n return {\n success: false,\n error: \"No image data received from API\",\n };\n }\n\n let savedFilePath: string | undefined;\n\n // Handle URL response\n if (imageData.url) {\n // Download the image\n const imageResponse = await fetch(imageData.url);\n if (!imageResponse.ok) {\n return {\n success: false,\n error: \"Failed to download generated image\",\n };\n }\n\n const imageBuffer = await imageResponse.arrayBuffer();\n await writeFile(filePath, Buffer.from(imageBuffer));\n savedFilePath = filePath;\n }\n\n // Handle base64 response\n if (imageData.b64_json) {\n const imageBuffer = Buffer.from(imageData.b64_json, \"base64\");\n await writeFile(filePath, imageBuffer);\n savedFilePath = filePath;\n }\n\n return {\n success: true,\n filePath: savedFilePath,\n url: imageData.url,\n revisedPrompt: imageData.revised_prompt,\n base64: imageData.b64_json,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n// Generate multiple images\nexport async function generateMultipleImages(\n prompt: string,\n count: number = 4,\n options: ImageGenerationOptions = {}\n): Promise<BatchImageGenerationResult> {\n const results: ImageGenerationResult[] = [];\n const model = options.model || \"dall-e-3\";\n\n // DALL-E 3 only supports n=1, so we need multiple requests\n if (model === \"dall-e-3\") {\n for (let i = 0; i < count; i++) {\n const result = await generateImageWithDALLE(prompt, undefined, {\n ...options,\n n: 1,\n });\n results.push(result);\n\n // Add a small delay between requests to avoid rate limiting\n if (i < count - 1) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n }\n }\n } else {\n // DALL-E 2 supports n up to 10\n const apiKey = getOpenAIApiKey();\n if (!apiKey) {\n return {\n success: false,\n images: [],\n error: \"OPENAI_API_KEY environment variable is not set\",\n };\n }\n\n const finalOptions = { ...DEFAULT_OPTIONS, ...options };\n const size = validateSizeForModel(finalOptions.size!, \"dall-e-2\");\n\n try {\n const response = await fetch(\"https://api.openai.com/v1/images/generations\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model: \"dall-e-2\",\n prompt,\n n: Math.min(count, 10),\n size,\n response_format: \"url\",\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n const errorMessage = (errorData as { error?: { message?: string } })?.error?.message || response.statusText;\n return {\n success: false,\n images: [],\n error: `OpenAI API error: ${errorMessage}`,\n };\n }\n\n const data = await response.json() as {\n data: Array<{ url?: string; b64_json?: string }>;\n };\n\n for (let i = 0; i < data.data.length; i++) {\n const imageData = data.data[i];\n const filePath = getTempPath(finalOptions.format);\n\n if (imageData.url) {\n try {\n await mkdir(dirname(filePath), { recursive: true });\n const imageResponse = await fetch(imageData.url);\n const imageBuffer = await imageResponse.arrayBuffer();\n await writeFile(filePath, Buffer.from(imageBuffer));\n\n results.push({\n success: true,\n filePath,\n url: imageData.url,\n });\n } catch (error) {\n results.push({\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n }\n } catch (error) {\n return {\n success: false,\n images: [],\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n return {\n success: results.some((r) => r.success),\n images: results,\n };\n}\n\n// Edit an existing image (inpainting)\nexport async function editImage(\n imagePath: string,\n prompt: string,\n options: ImageEditOptions = {}\n): Promise<ImageGenerationResult> {\n const apiKey = getOpenAIApiKey();\n if (!apiKey) {\n return {\n success: false,\n error: \"OPENAI_API_KEY environment variable is not set\",\n };\n }\n\n // Check if path is allowed\n if (!isPathAllowed(imagePath)) {\n return {\n success: false,\n error: \"Access to image path is not allowed\",\n };\n }\n\n if (options.mask && !isPathAllowed(options.mask)) {\n return {\n success: false,\n error: \"Access to mask path is not allowed\",\n };\n }\n\n const finalOptions = { ...DEFAULT_OPTIONS, ...options };\n const size = validateSizeForModel(finalOptions.size!, \"dall-e-2\");\n const filePath = getTempPath(finalOptions.format);\n\n try {\n await mkdir(dirname(filePath), { recursive: true });\n\n // Read image file\n const fs = await import(\"fs/promises\");\n const imageBuffer = await fs.readFile(imagePath);\n const imageArrayBuffer = new Uint8Array(imageBuffer).buffer;\n const imageBlob = new Blob([imageArrayBuffer], { type: \"image/png\" });\n\n // Create form data\n const formData = new FormData();\n formData.append(\"model\", \"dall-e-2\"); // Only DALL-E 2 supports edits\n formData.append(\"image\", imageBlob, \"image.png\");\n formData.append(\"prompt\", prompt);\n formData.append(\"n\", \"1\");\n formData.append(\"size\", size);\n formData.append(\"response_format\", \"url\");\n\n // Add mask if provided\n if (options.mask) {\n const maskBuffer = await fs.readFile(options.mask);\n const maskArrayBuffer = new Uint8Array(maskBuffer).buffer;\n const maskBlob = new Blob([maskArrayBuffer], { type: \"image/png\" });\n formData.append(\"mask\", maskBlob, \"mask.png\");\n }\n\n const response = await fetch(\"https://api.openai.com/v1/images/edits\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n body: formData,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n const errorMessage = (errorData as { error?: { message?: string } })?.error?.message || response.statusText;\n return {\n success: false,\n error: `OpenAI API error: ${errorMessage}`,\n };\n }\n\n const data = await response.json() as {\n data: Array<{ url?: string }>;\n };\n\n const imageData = data.data[0];\n\n if (imageData?.url) {\n const imageResponse = await fetch(imageData.url);\n const downloadedBuffer = await imageResponse.arrayBuffer();\n await writeFile(filePath, Buffer.from(downloadedBuffer));\n\n return {\n success: true,\n filePath,\n url: imageData.url,\n };\n }\n\n return {\n success: false,\n error: \"No image data received from API\",\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n// Create variations of an existing image\nexport async function createImageVariations(\n imagePath: string,\n count: number = 1,\n options: Omit<ImageGenerationOptions, \"n\"> = {}\n): Promise<BatchImageGenerationResult> {\n const apiKey = getOpenAIApiKey();\n if (!apiKey) {\n return {\n success: false,\n images: [],\n error: \"OPENAI_API_KEY environment variable is not set\",\n };\n }\n\n // Check if path is allowed\n if (!isPathAllowed(imagePath)) {\n return {\n success: false,\n images: [],\n error: \"Access to image path is not allowed\",\n };\n }\n\n const finalOptions = { ...DEFAULT_OPTIONS, ...options };\n const size = validateSizeForModel(finalOptions.size!, \"dall-e-2\");\n const results: ImageGenerationResult[] = [];\n\n try {\n // Read image file\n const fs = await import(\"fs/promises\");\n const imageBuffer = await fs.readFile(imagePath);\n const imageArrayBuffer = new Uint8Array(imageBuffer).buffer;\n const imageBlob = new Blob([imageArrayBuffer], { type: \"image/png\" });\n\n // Create form data\n const formData = new FormData();\n formData.append(\"model\", \"dall-e-2\"); // Only DALL-E 2 supports variations\n formData.append(\"image\", imageBlob, \"image.png\");\n formData.append(\"n\", String(Math.min(count, 10)));\n formData.append(\"size\", size);\n formData.append(\"response_format\", \"url\");\n\n const response = await fetch(\"https://api.openai.com/v1/images/variations\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n body: formData,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n const errorMessage = (errorData as { error?: { message?: string } })?.error?.message || response.statusText;\n return {\n success: false,\n images: [],\n error: `OpenAI API error: ${errorMessage}`,\n };\n }\n\n const data = await response.json() as {\n data: Array<{ url?: string }>;\n };\n\n for (const imageData of data.data) {\n const filePath = getTempPath(finalOptions.format);\n\n if (imageData?.url) {\n try {\n await mkdir(dirname(filePath), { recursive: true });\n const imageResponse = await fetch(imageData.url);\n const downloadedBuffer = await imageResponse.arrayBuffer();\n await writeFile(filePath, Buffer.from(downloadedBuffer));\n\n results.push({\n success: true,\n filePath,\n url: imageData.url,\n });\n } catch (error) {\n results.push({\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n }\n\n return {\n success: results.some((r) => r.success),\n images: results,\n };\n } catch (error) {\n return {\n success: false,\n images: [],\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n// Generate placeholder image (fallback when API is not available)\nexport async function generatePlaceholderImage(\n prompt: string,\n filename?: string,\n options: ImageGenerationOptions = {}\n): Promise<ImageGenerationResult> {\n const finalOptions = { ...DEFAULT_OPTIONS, ...options };\n const [widthStr, heightStr] = (finalOptions.size || \"1024x1024\").split(\"x\");\n const width = parseInt(widthStr, 10);\n const height = parseInt(heightStr, 10);\n\n const filePath = filename\n ? isPathAllowed(filename)\n ? filename\n : join(tmpdir(), filename)\n : getTempPath(\"svg\");\n\n try {\n await mkdir(dirname(filePath), { recursive: true });\n\n // Generate a simple SVG placeholder\n const svgContent = generatePlaceholderSVG(prompt, width, height);\n const svgPath = filePath.replace(/\\.(png|jpeg|webp)$/, \".svg\");\n await writeFile(svgPath, svgContent, \"utf-8\");\n\n return {\n success: true,\n filePath: svgPath,\n revisedPrompt: `[Placeholder for: ${prompt}]`,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n// Generate placeholder SVG\nfunction generatePlaceholderSVG(prompt: string, width: number, height: number): string {\n // Generate a gradient background based on prompt hash\n const hash = simpleHash(prompt);\n const hue1 = hash % 360;\n const hue2 = (hash * 7) % 360;\n\n // Truncate prompt for display\n const displayPrompt = prompt.length > 50 ? prompt.substring(0, 47) + \"...\" : prompt;\n const escapedPrompt = displayPrompt\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\">\n <defs>\n <linearGradient id=\"grad\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" style=\"stop-color:hsl(${hue1}, 70%, 60%);stop-opacity:1\" />\n <stop offset=\"100%\" style=\"stop-color:hsl(${hue2}, 70%, 40%);stop-opacity:1\" />\n </linearGradient>\n <pattern id=\"pattern\" patternUnits=\"userSpaceOnUse\" width=\"40\" height=\"40\">\n <circle cx=\"20\" cy=\"20\" r=\"2\" fill=\"rgba(255,255,255,0.1)\"/>\n </pattern>\n </defs>\n <rect width=\"100%\" height=\"100%\" fill=\"url(#grad)\"/>\n <rect width=\"100%\" height=\"100%\" fill=\"url(#pattern)\"/>\n <rect x=\"10%\" y=\"40%\" width=\"80%\" height=\"20%\" rx=\"10\" fill=\"rgba(0,0,0,0.3)\"/>\n <text x=\"50%\" y=\"48%\" font-family=\"Arial, sans-serif\" font-size=\"${Math.max(12, width / 40)}\" fill=\"white\" text-anchor=\"middle\" dominant-baseline=\"middle\">\n AI Image Placeholder\n </text>\n <text x=\"50%\" y=\"56%\" font-family=\"Arial, sans-serif\" font-size=\"${Math.max(10, width / 50)}\" fill=\"rgba(255,255,255,0.8)\" text-anchor=\"middle\" dominant-baseline=\"middle\">\n ${escapedPrompt}\n </text>\n <text x=\"50%\" y=\"90%\" font-family=\"Arial, sans-serif\" font-size=\"${Math.max(8, width / 60)}\" fill=\"rgba(255,255,255,0.5)\" text-anchor=\"middle\">\n ${width} x ${height}\n </text>\n</svg>`;\n}\n\n// Simple hash function for generating consistent colors\nfunction simpleHash(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash);\n}\n\n// Enhance prompt with additional details\nexport function enhancePrompt(prompt: string, style?: string): string {\n const styleEnhancements: Record<string, string> = {\n photorealistic: \", photorealistic, highly detailed, 8k resolution, professional photography\",\n artistic: \", artistic style, creative composition, vibrant colors, expressive brushstrokes\",\n minimal: \", minimalist design, clean lines, simple composition, modern aesthetic\",\n cinematic: \", cinematic lighting, dramatic atmosphere, movie still, widescreen composition\",\n anime: \", anime style, vibrant colors, detailed character design, Japanese animation aesthetic\",\n \"3d\": \", 3D rendered, octane render, high quality, detailed textures, realistic lighting\",\n watercolor: \", watercolor painting, soft edges, flowing colors, artistic texture\",\n sketch: \", pencil sketch, detailed linework, artistic drawing, hand-drawn style\",\n vintage: \", vintage style, retro aesthetic, film grain, nostalgic mood, aged appearance\",\n fantasy: \", fantasy art, magical atmosphere, ethereal lighting, imaginative elements\",\n scifi: \", science fiction, futuristic design, advanced technology, space aesthetic\",\n portrait: \", professional portrait, studio lighting, sharp focus, detailed features\",\n landscape: \", scenic landscape, natural beauty, atmospheric perspective, golden hour lighting\",\n abstract: \", abstract art, non-representational, bold colors, geometric shapes\",\n };\n\n if (style && styleEnhancements[style.toLowerCase()]) {\n return prompt + styleEnhancements[style.toLowerCase()];\n }\n\n return prompt;\n}\n\n// Main function for tool use\nexport async function generateImage(\n prompt: string,\n filename?: string,\n options?: ImageGenerationOptions & { enhancePrompt?: boolean; promptStyle?: string }\n): Promise<ImageGenerationResult> {\n // Enhance prompt if requested\n let finalPrompt = prompt;\n if (options?.enhancePrompt || options?.promptStyle) {\n finalPrompt = enhancePrompt(prompt, options?.promptStyle);\n }\n\n // Try to generate with DALL-E first\n const result = await generateImageWithDALLE(finalPrompt, filename, options);\n\n // If DALL-E fails due to missing API key, use placeholder\n if (!result.success && result.error?.includes(\"OPENAI_API_KEY\")) {\n console.log(\"[ImageGeneration] OpenAI API key not available, generating placeholder\");\n return generatePlaceholderImage(prompt, filename, options);\n }\n\n return result;\n}\n\nexport default {\n generateImage,\n generateImageWithDALLE,\n generateMultipleImages,\n editImage,\n createImageVariations,\n generatePlaceholderImage,\n enhancePrompt,\n};\n"],"mappings":"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","names":[]}
@@ -0,0 +1,35 @@
1
+ import {
2
+ iMessageBot,
3
+ imessage_default
4
+ } from "./chunk-NHMBTUMW.js";
5
+ import "./chunk-766ASQWE.js";
6
+ import "./chunk-IZJMVV7O.js";
7
+ import "./chunk-6PMVAAA7.js";
8
+ import "./chunk-MQJ2ECQT.js";
9
+ import "./chunk-TVEWKIK3.js";
10
+ import "./chunk-BRBWNV65.js";
11
+ import "./chunk-H5RQOFO2.js";
12
+ import "./chunk-VRD5CYRL.js";
13
+ import "./chunk-KM22GV7G.js";
14
+ import "./chunk-P6QINGFL.js";
15
+ import "./chunk-HN3F4WSW.js";
16
+ import "./chunk-SVAPX2XN.js";
17
+ import "./chunk-WRAKK6K6.js";
18
+ import "./chunk-7WQO5J2M.js";
19
+ import "./chunk-BXZ6EA52.js";
20
+ import "./chunk-4GLYY4NN.js";
21
+ import "./chunk-EVE7MIIY.js";
22
+ import "./chunk-RZ4YESBG.js";
23
+ import "./chunk-CQ4JURG7.js";
24
+ import "./chunk-OCVQGBJK.js";
25
+ import "./chunk-XKYRH4FM.js";
26
+ import "./chunk-ZLZKF2PM.js";
27
+ import "./chunk-6KONMXQ6.js";
28
+ import "./chunk-22VGGA7S.js";
29
+ import "./chunk-35WYTA3C.js";
30
+ import "./chunk-PLDDJCW6.js";
31
+ export {
32
+ imessage_default as default,
33
+ iMessageBot
34
+ };
35
+ //# sourceMappingURL=imessage-NGA2XF2V.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,47 @@
1
+ import {
2
+ analyzeSentiment,
3
+ categorizeEmail,
4
+ extractActionItems,
5
+ generateDailyDigest,
6
+ inbox_summarizer_default,
7
+ suggestReplies,
8
+ summarizeInbox,
9
+ summarizeThread
10
+ } from "./chunk-SPPMCAKG.js";
11
+ import "./chunk-766ASQWE.js";
12
+ import "./chunk-IZJMVV7O.js";
13
+ import "./chunk-6PMVAAA7.js";
14
+ import "./chunk-MQJ2ECQT.js";
15
+ import "./chunk-TVEWKIK3.js";
16
+ import "./chunk-BRBWNV65.js";
17
+ import "./chunk-H5RQOFO2.js";
18
+ import "./chunk-VRD5CYRL.js";
19
+ import "./chunk-KM22GV7G.js";
20
+ import "./chunk-P6QINGFL.js";
21
+ import "./chunk-HN3F4WSW.js";
22
+ import "./chunk-SVAPX2XN.js";
23
+ import "./chunk-WRAKK6K6.js";
24
+ import "./chunk-7WQO5J2M.js";
25
+ import "./chunk-BXZ6EA52.js";
26
+ import "./chunk-4GLYY4NN.js";
27
+ import "./chunk-EVE7MIIY.js";
28
+ import "./chunk-RZ4YESBG.js";
29
+ import "./chunk-CQ4JURG7.js";
30
+ import "./chunk-OCVQGBJK.js";
31
+ import "./chunk-XKYRH4FM.js";
32
+ import "./chunk-ZLZKF2PM.js";
33
+ import "./chunk-6KONMXQ6.js";
34
+ import "./chunk-22VGGA7S.js";
35
+ import "./chunk-35WYTA3C.js";
36
+ import "./chunk-PLDDJCW6.js";
37
+ export {
38
+ analyzeSentiment,
39
+ categorizeEmail,
40
+ inbox_summarizer_default as default,
41
+ extractActionItems,
42
+ generateDailyDigest,
43
+ suggestReplies,
44
+ summarizeInbox,
45
+ summarizeThread
46
+ };
47
+ //# sourceMappingURL=inbox-summarizer-NRI4S7IF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}