{"version":3,"sources":["../src/tools/openai-image.ts"],"names":["tool","z"],"mappings":"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","file":"chunk-7YR6WCIM.cjs","sourcesContent":["import { tool } from '@strands-agents/sdk'\nimport { z } from 'zod'\n\nfunction getKey(): string | null {\n  try {\n    const raw = localStorage.getItem('careless-v2-settings')\n    const s = raw ? JSON.parse(raw) : {}\n    // Prefer dedicated openaiApiKey, fall back to main key only if provider is openai\n    return s.openaiApiKey || (s.provider === 'openai' ? s.apiKey : null) || null\n  } catch { return null }\n}\n\n/**\n * Persist a base64 image to IndexedDB so it survives reloads and can be referenced\n * from conversation history. Returns an id we embed in markdown.\n */\nasync function storeImage(b64: string, mime: string, prompt: string): Promise<string> {\n  const id = `img_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`\n  try {\n    const db = await openImageDb()\n    const tx = db.transaction('images', 'readwrite')\n    tx.objectStore('images').put({ id, b64, mime, prompt, createdAt: Date.now() })\n    await new Promise<void>((res, rej) => { tx.oncomplete = () => res(); tx.onerror = () => rej(tx.error) })\n  } catch (e) {\n    console.warn('[openai-image] IDB store failed, image is session-only', e)\n  }\n  return id\n}\n\nfunction openImageDb(): Promise<IDBDatabase> {\n  return new Promise((resolve, reject) => {\n    const req = indexedDB.open('careless-images', 1)\n    req.onupgradeneeded = () => {\n      const db = req.result\n      if (!db.objectStoreNames.contains('images')) db.createObjectStore('images', { keyPath: 'id' })\n    }\n    req.onsuccess = () => resolve(req.result)\n    req.onerror = () => reject(req.error)\n  })\n}\n\nconst GPT_IMAGE_MODELS = ['gpt-image-1.5', 'gpt-image-1', 'gpt-image-1-mini']\nconst GPT_IMAGE_SIZES = ['auto', '1024x1024', '1536x1024', '1024x1536'] as const\nconst DALL_E_3_SIZES = ['1024x1024', '1792x1024', '1024x1792'] as const\n\nexport const generateImageTool = tool({\n  name: 'generate_image',\n  description:\n    'Generate an image from a text prompt via OpenAI. Supports gpt-image-1.5 (default, best), gpt-image-1, gpt-image-1-mini, dall-e-3, dall-e-2. Returns a data-URL embedded in markdown so it renders inline.',\n  inputSchema: z.object({\n    prompt: z.string().min(1).max(32000).describe('Text description of the image'),\n    model: z\n      .enum(['gpt-image-1.5', 'gpt-image-1', 'gpt-image-1-mini', 'dall-e-3', 'dall-e-2'])\n      .optional()\n      .describe('Model. Default: gpt-image-1.5 (recommended).'),\n    size: z\n      .string()\n      .optional()\n      .describe('Size. gpt-image: auto|1024x1024|1536x1024|1024x1536. dall-e-3: 1024x1024|1792x1024|1024x1792. Default: 1024x1024.'),\n    quality: z\n      .enum(['auto', 'low', 'medium', 'high', 'standard', 'hd'])\n      .optional()\n      .describe('Quality. gpt-image: auto|low|medium|high. dall-e-3: standard|hd. Default: auto.'),\n    format: z.enum(['png', 'jpeg', 'webp']).optional().describe('Output format (gpt-image only). Default: png.'),\n    background: z.enum(['transparent', 'opaque', 'auto']).optional().describe('Background (gpt-image only). Default: auto. Transparent requires png/webp.'),\n    compression: z.number().min(0).max(100).optional().describe('Compression 0-100 for jpeg/webp (gpt-image only).'),\n    n: z.number().min(1).max(4).optional().describe('Number of images (1-4). Default: 1.'),\n  }),\n  callback: async (input) => {\n    try {\n      const key = getKey()\n      if (!key) {\n        return JSON.stringify({\n          status: 'error',\n          error: 'OpenAI API key required. Add it in Settings → OpenAI.',\n        })\n      }\n\n      const model = input.model || 'gpt-image-1.5'\n      const isGptImage = GPT_IMAGE_MODELS.includes(model)\n      const isDallE3 = model === 'dall-e-3'\n\n      // Build body based on model family\n      const body: Record<string, unknown> = {\n        model,\n        prompt: input.prompt,\n        n: input.n || 1,\n      }\n\n      // Size handling\n      if (input.size) {\n        body.size = input.size\n      } else {\n        body.size = '1024x1024'\n      }\n\n      // Quality handling — map generic values to model-specific\n      if (input.quality) {\n        if (isDallE3 && !['standard', 'hd'].includes(input.quality)) {\n          body.quality = 'standard'\n        } else if (isGptImage && !['auto', 'low', 'medium', 'high'].includes(input.quality)) {\n          body.quality = 'auto'\n        } else {\n          body.quality = input.quality\n        }\n      }\n\n      // GPT-image-only params\n      if (isGptImage) {\n        if (input.format) body.output_format = input.format\n        if (input.background) body.background = input.background\n        if (input.compression !== undefined && (input.format === 'jpeg' || input.format === 'webp')) {\n          body.output_compression = input.compression\n        }\n      }\n\n      // DALL-E 2/3 need explicit b64_json response_format (GPT-image always returns b64)\n      if (!isGptImage) {\n        body.response_format = 'b64_json'\n      }\n\n      const res = await fetch('https://api.openai.com/v1/images/generations', {\n        method: 'POST',\n        headers: {\n          Authorization: `Bearer ${key}`,\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify(body),\n      })\n\n      const data = await res.json()\n      if (!res.ok) {\n        return JSON.stringify({\n          status: 'error',\n          error: data.error?.message || `HTTP ${res.status}`,\n          code: data.error?.code,\n          type: data.error?.type,\n        })\n      }\n\n      const images = data.data || []\n      if (!images.length) {\n        return JSON.stringify({ status: 'error', error: 'No images returned' })\n      }\n\n      const mime = `image/${(data.output_format || input.format || 'png')}`\n      const results = await Promise.all(\n        images.map(async (img: { b64_json?: string; url?: string; revised_prompt?: string }) => {\n          const b64 = img.b64_json\n          if (!b64) {\n            // Shouldn't happen for our configured request but handle gracefully\n            return { url: img.url, revised_prompt: img.revised_prompt }\n          }\n          const id = await storeImage(b64, mime, input.prompt)\n          const dataUrl = `data:${mime};base64,${b64}`\n          return { id, dataUrl, revised_prompt: img.revised_prompt }\n        })\n      )\n\n      // Build markdown so the agent's response renders images inline.\n      // The MarkdownRenderer's <img> handler will wire click-to-fullscreen.\n      const markdown = results\n        .map((r, i) => {\n          const alt = (r as any).revised_prompt || input.prompt\n          const src = (r as any).dataUrl || (r as any).url\n          return `![${alt.replace(/[\\[\\]]/g, '').slice(0, 120)}](${src})`\n        })\n        .join('\\n\\n')\n\n      return JSON.stringify({\n        status: 'success',\n        model,\n        size: body.size,\n        count: results.length,\n        usage: data.usage,\n        images: results.map((r: any) => ({\n          id: r.id,\n          revised_prompt: r.revised_prompt,\n          // Do NOT echo dataUrl back to agent context — it would blow up tokens.\n          // The markdown below already embeds it for rendering.\n          has_data_url: !!r.dataUrl,\n          url: r.url,\n        })),\n        markdown,\n        hint: 'Include the `markdown` field in your reply so the user sees the image.',\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const editImageTool = tool({\n  name: 'edit_image',\n  description:\n    'Edit or combine existing images via OpenAI gpt-image-1.5 / gpt-image-1. Pass 1-16 images as data URLs or https URLs plus a prompt describing the edit.',\n  inputSchema: z.object({\n    prompt: z.string().min(1).describe('Description of the desired edit'),\n    images: z\n      .array(z.string())\n      .min(1)\n      .max(16)\n      .describe('Array of data URLs (data:image/...) or https URLs of input images'),\n    model: z\n      .enum(['gpt-image-1.5', 'gpt-image-1', 'gpt-image-1-mini'])\n      .optional()\n      .describe('Model. Default: gpt-image-1.5.'),\n    size: z.enum(GPT_IMAGE_SIZES).optional().describe('Output size. Default: auto.'),\n    quality: z.enum(['auto', 'low', 'medium', 'high']).optional().describe('Default: auto.'),\n    format: z.enum(['png', 'jpeg', 'webp']).optional(),\n    background: z.enum(['transparent', 'opaque', 'auto']).optional(),\n    mask: z.string().optional().describe('Optional mask as data URL or https URL (alpha channel indicates edit region)'),\n    n: z.number().min(1).max(4).optional(),\n  }),\n  callback: async (input) => {\n    try {\n      const key = getKey()\n      if (!key) return JSON.stringify({ status: 'error', error: 'OpenAI API key required' })\n\n      const model = input.model || 'gpt-image-1.5'\n\n      // /v1/images/edits with JSON body + images[] array is supported on newer GPT-image models\n      const body: Record<string, unknown> = {\n        model,\n        prompt: input.prompt,\n        images: input.images.map((url) => ({ image_url: url })),\n        n: input.n || 1,\n      }\n      if (input.mask) body.mask = { image_url: input.mask }\n      if (input.size) body.size = input.size\n      if (input.quality) body.quality = input.quality\n      if (input.format) body.output_format = input.format\n      if (input.background) body.background = input.background\n\n      const res = await fetch('https://api.openai.com/v1/images/edits', {\n        method: 'POST',\n        headers: {\n          Authorization: `Bearer ${key}`,\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify(body),\n      })\n\n      const data = await res.json()\n      if (!res.ok) {\n        return JSON.stringify({\n          status: 'error',\n          error: data.error?.message || `HTTP ${res.status}`,\n          code: data.error?.code,\n        })\n      }\n\n      const images = data.data || []\n      const mime = `image/${data.output_format || input.format || 'png'}`\n      const results = await Promise.all(\n        images.map(async (img: { b64_json?: string }) => {\n          if (!img.b64_json) return null\n          const id = await storeImage(img.b64_json, mime, `edit: ${input.prompt}`)\n          return { id, dataUrl: `data:${mime};base64,${img.b64_json}` }\n        })\n      )\n\n      const markdown = results\n        .filter(Boolean)\n        .map((r: any) => `![${input.prompt.replace(/[\\[\\]]/g, '').slice(0, 120)}](${r.dataUrl})`)\n        .join('\\n\\n')\n\n      return JSON.stringify({\n        status: 'success',\n        model,\n        count: results.filter(Boolean).length,\n        usage: data.usage,\n        images: results.filter(Boolean).map((r: any) => ({ id: r.id })),\n        markdown,\n        hint: 'Include the `markdown` in your reply to render the edited image.',\n      })\n    } catch (err) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const OPENAI_IMAGE_TOOLS = [generateImageTool, editImageTool]\n"]}