{"version":3,"sources":["../src/tools/offscreen-canvas.ts"],"names":["z","tool"],"mappings":"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","file":"chunk-44HAKYZT.cjs","sourcesContent":["/**\n * offscreen-canvas.ts — Render graphics off the main thread via OffscreenCanvas.\n *\n * The agent describes a scene via declarative ops. Rendering happens in a reusable\n * Worker (main thread stays responsive). If OffscreenCanvas is unavailable in a\n * Worker (old browser), falls back to a main-thread canvas.\n *\n * Tools:\n *   offscreen_render          — declarative 2D scene → PNG/JPEG/WebP data URL\n *   offscreen_render_sequence — render N frames with parameterized ops → sprite sheet or array\n *   offscreen_chart           — quick line/bar/pie charts without hand-crafting ops\n *   offscreen_badge           — status/version/counter badges (shields.io-style)\n *   offscreen_ops_reference   — list all supported ops + examples\n */\nimport { tool } from '@strands-agents/sdk'\nimport { z } from 'zod'\n\n// ---------------------------------------------------------------------------\n// Worker: inline source. Handles one job per postMessage; kept alive across\n// calls so we don't pay worker boot cost per render.\n// ---------------------------------------------------------------------------\nconst WORKER_SRC = `\nlet _fontsLoaded = new Set()\n\nasync function loadFonts(fonts) {\n  if (!fonts || !fonts.length || typeof self.FontFace === 'undefined') return\n  await Promise.all(fonts.map(async (f) => {\n    const key = f.family + '|' + f.source\n    if (_fontsLoaded.has(key)) return\n    try {\n      const face = new FontFace(f.family, \\`url(\\${f.source})\\`, f.descriptors || {})\n      await face.load()\n      ;(self.fonts || self).add?.(face)\n      _fontsLoaded.add(key)\n    } catch (e) { /* ignore */ }\n  }))\n}\n\nasync function prefetchImages(ops) {\n  // Collect all image ops and fetch in parallel so sequential draws aren't serialized.\n  const pending = new Map()\n  for (const op of ops) {\n    if (op.op === 'image' && op.url && !pending.has(op.url)) {\n      pending.set(op.url, (async () => {\n        const resp = await fetch(op.url)\n        const blob = await resp.blob()\n        return await createImageBitmap(blob)\n      })())\n    }\n  }\n  const resolved = new Map()\n  for (const [url, p] of pending) {\n    try { resolved.set(url, await p) } catch { resolved.set(url, null) }\n  }\n  return resolved\n}\n\nasync function runJob(job) {\n  const { width, height, ops, format, quality, fonts } = job\n  if (typeof OffscreenCanvas === 'undefined') {\n    return { error: 'OffscreenCanvas not supported in worker' }\n  }\n\n  await loadFonts(fonts)\n  const images = await prefetchImages(ops)\n\n  const canvas = new OffscreenCanvas(width, height)\n  const ctx = canvas.getContext('2d')\n  if (!ctx) return { error: '2d context unavailable' }\n\n  const opErrors = []\n\n  for (let i = 0; i < ops.length; i++) {\n    const op = ops[i]\n    try {\n      applyOp(ctx, op, images, width, height)\n    } catch (e) {\n      opErrors.push({ index: i, op: op.op, error: String(e && e.message || e) })\n    }\n  }\n\n  const type = format === 'jpeg' ? 'image/jpeg' : format === 'webp' ? 'image/webp' : 'image/png'\n  const blob = await canvas.convertToBlob({ type, quality: quality ?? 0.92 })\n  const buf = await blob.arrayBuffer()\n  return { ok: true, buffer: buf, width, height, mimeType: type, opErrors }\n}\n\nfunction applyOp(ctx, op, images, width, height) {\n  // Per-op state save/restore when overrides are present.\n  const hasOverrides = op.fillStyle !== undefined || op.strokeStyle !== undefined\n    || op.lineWidth !== undefined || op.font !== undefined\n    || op.textAlign !== undefined || op.textBaseline !== undefined\n    || op.globalAlpha !== undefined || op.shadow !== undefined\n  if (hasOverrides) {\n    ctx.save()\n    if (op.fillStyle !== undefined) ctx.fillStyle = op.fillStyle\n    if (op.strokeStyle !== undefined) ctx.strokeStyle = op.strokeStyle\n    if (op.lineWidth !== undefined) ctx.lineWidth = op.lineWidth\n    if (op.font !== undefined) ctx.font = op.font\n    if (op.textAlign !== undefined) ctx.textAlign = op.textAlign\n    if (op.textBaseline !== undefined) ctx.textBaseline = op.textBaseline\n    if (op.globalAlpha !== undefined) ctx.globalAlpha = op.globalAlpha\n    if (op.shadow) {\n      ctx.shadowColor = op.shadow.color || 'rgba(0,0,0,0.5)'\n      ctx.shadowBlur = op.shadow.blur || 0\n      ctx.shadowOffsetX = op.shadow.x || 0\n      ctx.shadowOffsetY = op.shadow.y || 0\n    }\n  }\n\n  switch (op.op) {\n    // State (still supported for multi-op sequences)\n    case 'fill': ctx.fillStyle = op.style; break\n    case 'stroke': ctx.strokeStyle = op.style; break\n    case 'lineWidth': ctx.lineWidth = op.value; break\n    case 'font': ctx.font = op.value; break\n    case 'textAlign': ctx.textAlign = op.value; break\n    case 'textBaseline': ctx.textBaseline = op.value; break\n    case 'globalAlpha': ctx.globalAlpha = op.value; break\n    case 'shadow':\n      ctx.shadowColor = op.color || 'rgba(0,0,0,0.5)'\n      ctx.shadowBlur = op.blur || 0\n      ctx.shadowOffsetX = op.x || 0\n      ctx.shadowOffsetY = op.y || 0\n      break\n    case 'lineCap': ctx.lineCap = op.value; break\n    case 'lineJoin': ctx.lineJoin = op.value; break\n    case 'lineDash': ctx.setLineDash(op.value || []); break\n\n    case 'clear': ctx.clearRect(0, 0, width, height); break\n    case 'fillBackground':\n      ctx.fillStyle = op.style || '#000'\n      ctx.fillRect(0, 0, width, height)\n      break\n\n    case 'fillRect': ctx.fillRect(op.x, op.y, op.w, op.h); break\n    case 'strokeRect': ctx.strokeRect(op.x, op.y, op.w, op.h); break\n    case 'roundRect': {\n      const r = op.r || 8\n      ctx.beginPath()\n      if (typeof ctx.roundRect === 'function') {\n        ctx.roundRect(op.x, op.y, op.w, op.h, r)\n      } else {\n        // Manual roundRect fallback.\n        ctx.moveTo(op.x + r, op.y)\n        ctx.arcTo(op.x + op.w, op.y, op.x + op.w, op.y + op.h, r)\n        ctx.arcTo(op.x + op.w, op.y + op.h, op.x, op.y + op.h, r)\n        ctx.arcTo(op.x, op.y + op.h, op.x, op.y, r)\n        ctx.arcTo(op.x, op.y, op.x + op.w, op.y, r)\n        ctx.closePath()\n      }\n      if (op.fill !== false) ctx.fill()\n      if (op.stroke) ctx.stroke()\n      break\n    }\n    case 'circle':\n      ctx.beginPath()\n      ctx.arc(op.x, op.y, op.r, 0, Math.PI * 2)\n      if (op.fill !== false) ctx.fill()\n      if (op.stroke) ctx.stroke()\n      break\n    case 'arc':\n      ctx.beginPath()\n      ctx.arc(op.x, op.y, op.r, op.startAngle, op.endAngle, !!op.anticlockwise)\n      if (op.fill) ctx.fill()\n      if (op.stroke !== false) ctx.stroke()\n      break\n    case 'line':\n      ctx.beginPath()\n      ctx.moveTo(op.x1, op.y1)\n      ctx.lineTo(op.x2, op.y2)\n      ctx.stroke()\n      break\n    case 'fillText': ctx.fillText(op.text, op.x, op.y, op.maxWidth); break\n    case 'strokeText': ctx.strokeText(op.text, op.x, op.y, op.maxWidth); break\n    case 'path': {\n      ctx.beginPath()\n      const pts = op.points || []\n      if (pts.length) ctx.moveTo(pts[0][0], pts[0][1])\n      for (let i = 1; i < pts.length; i++) ctx.lineTo(pts[i][0], pts[i][1])\n      if (op.close) ctx.closePath()\n      if (op.fill) ctx.fill()\n      if (op.stroke !== false) ctx.stroke()\n      break\n    }\n    case 'bezier': {\n      // Single bezier curve: {x1,y1}→{cx1,cy1}-{cx2,cy2}→{x2,y2}\n      ctx.beginPath()\n      ctx.moveTo(op.x1, op.y1)\n      ctx.bezierCurveTo(op.cx1, op.cy1, op.cx2, op.cy2, op.x2, op.y2)\n      if (op.stroke !== false) ctx.stroke()\n      if (op.fill) ctx.fill()\n      break\n    }\n    case 'linearGradient': {\n      const g = ctx.createLinearGradient(op.x1, op.y1, op.x2, op.y2)\n      for (const [stop, color] of op.stops) g.addColorStop(stop, color)\n      ctx.fillStyle = g\n      const r = op.rect || [0, 0, width, height]\n      ctx.fillRect(r[0], r[1], r[2], r[3])\n      break\n    }\n    case 'radialGradient': {\n      const g = ctx.createRadialGradient(op.x1, op.y1, op.r1, op.x2, op.y2, op.r2)\n      for (const [stop, color] of op.stops) g.addColorStop(stop, color)\n      ctx.fillStyle = g\n      const r = op.rect || [0, 0, width, height]\n      ctx.fillRect(r[0], r[1], r[2], r[3])\n      break\n    }\n    case 'clipRect': {\n      ctx.beginPath()\n      ctx.rect(op.x, op.y, op.w, op.h)\n      ctx.clip()\n      break\n    }\n    case 'rotate': ctx.rotate(op.angle); break\n    case 'translate': ctx.translate(op.x, op.y); break\n    case 'scale': ctx.scale(op.x, op.y); break\n    case 'save': ctx.save(); break\n    case 'restore': ctx.restore(); break\n    case 'image': {\n      const bmp = images.get(op.url)\n      if (!bmp) throw new Error('image failed to load: ' + String(op.url).slice(0, 80))\n      ctx.drawImage(bmp, op.x || 0, op.y || 0, op.w || bmp.width, op.h || bmp.height)\n      break\n    }\n    default:\n      throw new Error('unknown op: ' + op.op)\n  }\n\n  if (hasOverrides) ctx.restore()\n}\n\nself.onmessage = async (ev) => {\n  const { id, job } = ev.data\n  try {\n    const result = await runJob(job)\n    if (result.ok) {\n      self.postMessage({ id, ...result }, [result.buffer])\n    } else {\n      self.postMessage({ id, error: result.error })\n    }\n  } catch (e) {\n    self.postMessage({ id, error: String(e && e.message || e) })\n  }\n}\n`\n\n// ---------------------------------------------------------------------------\n// Worker pool (1 reusable worker + request id multiplexing)\n// ---------------------------------------------------------------------------\n\nlet _workerUrl: string | null = null\nlet _worker: Worker | null = null\nlet _requestSeq = 0\nconst _pending = new Map<number, { resolve: (v: any) => void; reject: (e: any) => void; timer: any }>()\nlet _workerUsable = true // flipped off once we detect OffscreenCanvas is unsupported in the worker\n\nfunction getWorkerUrl() {\n  if (!_workerUrl) _workerUrl = URL.createObjectURL(new Blob([WORKER_SRC], { type: 'application/javascript' }))\n  return _workerUrl\n}\n\nfunction ensureWorker(): Worker | null {\n  if (!_workerUsable) return null\n  if (typeof Worker === 'undefined') return null\n  if (_worker) return _worker\n  const w = new Worker(getWorkerUrl())\n  w.onmessage = (ev: MessageEvent) => {\n    const { id, error, ...rest } = ev.data || {}\n    const pending = _pending.get(id)\n    if (!pending) return\n    clearTimeout(pending.timer)\n    _pending.delete(id)\n    if (error) {\n      if (error.includes('OffscreenCanvas not supported')) _workerUsable = false\n      pending.reject(new Error(error))\n    } else {\n      pending.resolve(rest)\n    }\n  }\n  w.onerror = (err) => {\n    console.error('[offscreen worker]', err)\n    for (const p of _pending.values()) {\n      clearTimeout(p.timer)\n      p.reject(new Error('worker crashed'))\n    }\n    _pending.clear()\n    try { w.terminate() } catch {}\n    _worker = null\n  }\n  _worker = w\n  return w\n}\n\nfunction runInWorker(job: any, timeoutMs: number): Promise<any> {\n  return new Promise((resolve, reject) => {\n    const w = ensureWorker()\n    if (!w) return reject(new Error('Worker unavailable'))\n    const id = ++_requestSeq\n    const timer = setTimeout(() => {\n      _pending.delete(id)\n      reject(new Error(`Render timed out after ${timeoutMs}ms`))\n    }, timeoutMs)\n    _pending.set(id, { resolve, reject, timer })\n    w.postMessage({ id, job })\n  })\n}\n\n// ---------------------------------------------------------------------------\n// Main-thread fallback renderer (when worker is unusable)\n// ---------------------------------------------------------------------------\n\nasync function renderOnMainThread(job: any): Promise<any> {\n  if (typeof document === 'undefined') throw new Error('No DOM available for fallback render')\n  const canvas = document.createElement('canvas')\n  canvas.width = job.width\n  canvas.height = job.height\n  const ctx = canvas.getContext('2d')\n  if (!ctx) throw new Error('2d context unavailable on fallback')\n\n  // Prefetch images in parallel\n  const images = new Map<string, HTMLImageElement>()\n  await Promise.all(\n    (job.ops as any[])\n      .filter((op) => op.op === 'image' && op.url)\n      .map((op) => new Promise<void>((resolve) => {\n        if (images.has(op.url)) return resolve()\n        const img = new Image()\n        img.crossOrigin = 'anonymous'\n        img.onload = () => { images.set(op.url, img); resolve() }\n        img.onerror = () => { images.set(op.url, null as any); resolve() }\n        img.src = op.url\n      })),\n  )\n\n  const opErrors: any[] = []\n  // We inline the same applyOp logic but calling into HTMLCanvasElement context; the worker\n  // logic works identically here, so we just eval() the worker's applyOp in-scope. Simpler:\n  // duplicate the key cases. Keep this small — full feature parity can be added on demand.\n  for (let i = 0; i < job.ops.length; i++) {\n    const op = job.ops[i]\n    try {\n      switch (op.op) {\n        case 'fill': ctx.fillStyle = op.style; break\n        case 'stroke': ctx.strokeStyle = op.style; break\n        case 'lineWidth': ctx.lineWidth = op.value; break\n        case 'font': ctx.font = op.value; break\n        case 'textAlign': ctx.textAlign = op.value; break\n        case 'textBaseline': ctx.textBaseline = op.value; break\n        case 'globalAlpha': ctx.globalAlpha = op.value; break\n        case 'clear': ctx.clearRect(0, 0, job.width, job.height); break\n        case 'fillBackground':\n          ctx.fillStyle = op.style || '#000'; ctx.fillRect(0, 0, job.width, job.height); break\n        case 'fillRect': ctx.fillRect(op.x, op.y, op.w, op.h); break\n        case 'strokeRect': ctx.strokeRect(op.x, op.y, op.w, op.h); break\n        case 'circle':\n          ctx.beginPath(); ctx.arc(op.x, op.y, op.r, 0, Math.PI * 2)\n          if (op.fill !== false) ctx.fill()\n          if (op.stroke) ctx.stroke()\n          break\n        case 'line':\n          ctx.beginPath(); ctx.moveTo(op.x1, op.y1); ctx.lineTo(op.x2, op.y2); ctx.stroke(); break\n        case 'fillText': ctx.fillText(op.text, op.x, op.y); break\n        case 'strokeText': ctx.strokeText(op.text, op.x, op.y); break\n        case 'image': {\n          const img = images.get(op.url)\n          if (!img) throw new Error('image failed to load')\n          ctx.drawImage(img, op.x || 0, op.y || 0, op.w || img.naturalWidth, op.h || img.naturalHeight)\n          break\n        }\n        default:\n          // Fallback doesn't cover everything; at least record it\n          opErrors.push({ index: i, op: op.op, error: 'op not supported in fallback renderer' })\n      }\n    } catch (e) {\n      opErrors.push({ index: i, op: op.op, error: String((e as Error).message || e) })\n    }\n  }\n\n  const type = job.format === 'jpeg' ? 'image/jpeg' : job.format === 'webp' ? 'image/webp' : 'image/png'\n  const dataURL = canvas.toDataURL(type, job.quality ?? 0.92)\n  // Reconstruct an ArrayBuffer from the data URL for parity with worker response shape.\n  const base64 = dataURL.split(',')[1]\n  const bin = atob(base64)\n  const bytes = new Uint8Array(bin.length)\n  for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i)\n  return {\n    ok: true,\n    buffer: bytes.buffer,\n    width: job.width,\n    height: job.height,\n    mimeType: type,\n    opErrors,\n    fallback: true,\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Encode helpers\n// ---------------------------------------------------------------------------\n\nfunction bufferToDataURL(buf: ArrayBuffer, type: string): string {\n  const bytes = new Uint8Array(buf)\n  let bin = ''\n  const chunk = 0x8000\n  for (let i = 0; i < bytes.length; i += chunk) {\n    bin += String.fromCharCode.apply(null, bytes.subarray(i, i + chunk) as any)\n  }\n  return `data:${type};base64,${btoa(bin)}`\n}\n\nasync function runJob(job: any, timeoutMs: number): Promise<any> {\n  if (_workerUsable) {\n    try {\n      return await runInWorker(job, timeoutMs)\n    } catch (err) {\n      // If worker fails in a way that suggests it's unusable, flip to fallback.\n      if ((err as Error).message.includes('OffscreenCanvas not supported')\n          || (err as Error).message.includes('Worker unavailable')\n          || (err as Error).message.includes('worker crashed')) {\n        _workerUsable = false\n      } else {\n        throw err\n      }\n    }\n  }\n  return await renderOnMainThread(job)\n}\n\n// ---------------------------------------------------------------------------\n// Tools\n// ---------------------------------------------------------------------------\n\nconst OpSchema = z.record(z.string(), z.any())\n\nconst CommonOutput = {\n  returnAs: z.enum(['dataURL', 'blobURL']).optional().describe('Default dataURL'),\n  format: z.enum(['png', 'jpeg', 'webp']).optional().describe('Default png'),\n  quality: z.number().min(0).max(1).optional().describe('JPEG/WebP quality 0..1 (default 0.92)'),\n  timeout_ms: z.number().optional().describe('Max render time in ms (default 15000)'),\n  fonts: z.array(z.object({\n    family: z.string(),\n    source: z.string().describe('Font URL (https) or data URL'),\n    descriptors: z.record(z.string(), z.string()).optional(),\n  })).optional().describe('Optional custom fonts to load before rendering'),\n}\n\nexport const offscreenRenderTool = tool({\n  name: 'offscreen_render',\n  description:\n    'Render a 2D scene off the main thread. Pass width, height, and an ops array. ' +\n    'Use offscreen_ops_reference to list all ops. ' +\n    'Each op may include per-op overrides: fillStyle, strokeStyle, lineWidth, font, textAlign, ' +\n    'textBaseline, globalAlpha, shadow ({color,blur,x,y}) — applied for just that op. ' +\n    'Supports PNG/JPEG/WebP output and custom font loading.',\n  inputSchema: z.object({\n    width: z.number(),\n    height: z.number(),\n    ops: z.array(OpSchema).describe('Ordered draw operations'),\n    ...CommonOutput,\n  }),\n  callback: async (input) => {\n    try {\n      const result = await runJob({\n        width: input.width, height: input.height, ops: input.ops,\n        format: input.format, quality: input.quality, fonts: input.fonts,\n      }, input.timeout_ms ?? 15000)\n\n      const base = {\n        status: 'success',\n        width: result.width,\n        height: result.height,\n        mimeType: result.mimeType,\n        bytes: result.buffer.byteLength,\n        fallback: !!result.fallback,\n        op_errors: (result.opErrors || []).length ? result.opErrors : undefined,\n      }\n\n      if (input.returnAs === 'blobURL') {\n        const url = URL.createObjectURL(new Blob([result.buffer], { type: result.mimeType }))\n        return JSON.stringify({ ...base, blobURL: url })\n      }\n      return JSON.stringify({ ...base, dataURL: bufferToDataURL(result.buffer, result.mimeType) })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\n// ---------- Render a sequence of frames ------------------------------------\n\nexport const offscreenRenderSequenceTool = tool({\n  name: 'offscreen_render_sequence',\n  description:\n    'Render N frames of a parameterized scene. Useful for sprite sheets, animations, or GIF/WebM prep. ' +\n    'Pass ops as a template with {{t}}, {{i}}, {{frames}} placeholders — t goes 0..1, i goes 0..frames-1. ' +\n    'Returns either an array of per-frame data URLs (mode=frames) or a single horizontal sprite sheet (mode=sheet).',\n  inputSchema: z.object({\n    width: z.number().describe('Per-frame width'),\n    height: z.number().describe('Per-frame height'),\n    frames: z.number().min(1).max(240).describe('How many frames to render'),\n    ops: z.array(OpSchema).describe('Ops template. Numeric values may be strings with {{t}} / {{i}} / {{frames}} / arithmetic.'),\n    mode: z.enum(['frames', 'sheet']).optional().describe('Default \"sheet\" (one image, frames laid out horizontally)'),\n    ...CommonOutput,\n  }),\n  callback: async (input) => {\n    try {\n      const frameResults: ArrayBuffer[] = []\n      const allOpErrors: any[] = []\n      const mode = input.mode ?? 'sheet'\n\n      // Substitute placeholders per frame.\n      const substitute = (ops: any[], t: number, i: number, frames: number): any[] => {\n        return ops.map((op) => {\n          const copy: any = {}\n          for (const [k, v] of Object.entries(op)) {\n            if (typeof v === 'string' && v.includes('{{')) {\n              // Evaluate simple expression: replace tokens then Function-eval.\n              const expr = v.replace(/\\{\\{t\\}\\}/g, String(t))\n                            .replace(/\\{\\{i\\}\\}/g, String(i))\n                            .replace(/\\{\\{frames\\}\\}/g, String(frames))\n              try { copy[k] = Function('\"use strict\";return (' + expr + ')')() }\n              catch { copy[k] = v } // keep literal string if eval fails\n            } else if (Array.isArray(v)) {\n              copy[k] = v.map((inner: any) => (typeof inner === 'string' && inner.includes('{{')\n                ? (() => {\n                    const expr = inner.replace(/\\{\\{t\\}\\}/g, String(t))\n                                      .replace(/\\{\\{i\\}\\}/g, String(i))\n                                      .replace(/\\{\\{frames\\}\\}/g, String(frames))\n                    try { return Function('\"use strict\";return (' + expr + ')')() }\n                    catch { return inner }\n                  })()\n                : inner))\n            } else {\n              copy[k] = v\n            }\n          }\n          return copy\n        })\n      }\n\n      for (let i = 0; i < input.frames; i++) {\n        const t = input.frames <= 1 ? 0 : i / (input.frames - 1)\n        const subbed = substitute(input.ops, t, i, input.frames)\n        const result = await runJob({\n          width: input.width, height: input.height, ops: subbed,\n          format: 'png', quality: 1.0, fonts: input.fonts,\n        }, input.timeout_ms ?? 15000)\n        frameResults.push(result.buffer)\n        if ((result.opErrors || []).length) {\n          allOpErrors.push({ frame: i, errors: result.opErrors })\n        }\n      }\n\n      if (mode === 'frames') {\n        const dataUrls = frameResults.map((buf) => bufferToDataURL(buf, 'image/png'))\n        return JSON.stringify({\n          status: 'success',\n          mode: 'frames',\n          count: dataUrls.length,\n          frames: dataUrls,\n          op_errors: allOpErrors.length ? allOpErrors : undefined,\n        })\n      }\n\n      // Sheet mode: composite all frames into one horizontal strip.\n      const sheetOps = frameResults.map((buf, i) => ({\n        op: 'image',\n        url: bufferToDataURL(buf, 'image/png'),\n        x: i * input.width,\n        y: 0,\n        w: input.width,\n        h: input.height,\n      }))\n      const sheetResult = await runJob({\n        width: input.width * input.frames,\n        height: input.height,\n        ops: [{ op: 'fillBackground', style: 'rgba(0,0,0,0)' }, ...sheetOps],\n        format: input.format ?? 'png',\n        quality: input.quality ?? 1.0,\n      }, input.timeout_ms ?? 30000)\n\n      const mime = sheetResult.mimeType\n      return JSON.stringify({\n        status: 'success',\n        mode: 'sheet',\n        frames: input.frames,\n        frame_width: input.width,\n        frame_height: input.height,\n        total_width: input.width * input.frames,\n        total_height: input.height,\n        mimeType: mime,\n        dataURL: bufferToDataURL(sheetResult.buffer, mime),\n        op_errors: allOpErrors.length ? allOpErrors : undefined,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\n// ---------- Chart preset ---------------------------------------------------\n\nexport const offscreenChartTool = tool({\n  name: 'offscreen_chart',\n  description:\n    'Render a quick line/bar/pie chart without hand-crafting ops. For richer features use Chart.js; this is for agent-friendly quick snapshots.',\n  inputSchema: z.object({\n    type: z.enum(['line', 'bar', 'pie']),\n    data: z.array(z.number()).describe('Values'),\n    labels: z.array(z.string()).optional(),\n    width: z.number().optional(),\n    height: z.number().optional(),\n    title: z.string().optional(),\n    background: z.string().optional(),\n    color: z.string().optional().describe('Primary accent color, default #6ee7b7'),\n    ...CommonOutput,\n  }),\n  callback: async (input) => {\n    try {\n      const width = input.width ?? 640\n      const height = input.height ?? 360\n      const pad = 40\n      const titleHeight = input.title ? 32 : 0\n      const plotTop = pad + titleHeight\n      const plotLeft = pad + 10\n      const plotW = width - pad * 2 - 10\n      const plotH = height - plotTop - pad\n      const color = input.color ?? '#6ee7b7'\n      const bg = input.background ?? '#0a0a0a'\n      const fg = '#e5e7eb'\n      const dim = '#6b7280'\n\n      const ops: any[] = [{ op: 'fillBackground', style: bg }]\n\n      if (input.title) {\n        ops.push({\n          op: 'fillText', text: input.title, x: width / 2, y: 28,\n          fillStyle: fg, font: '600 18px system-ui,sans-serif',\n          textAlign: 'center', textBaseline: 'middle',\n        })\n      }\n\n      const data = input.data\n      if (!data.length) {\n        ops.push({\n          op: 'fillText', text: '(no data)', x: width / 2, y: height / 2,\n          fillStyle: dim, font: '16px system-ui', textAlign: 'center', textBaseline: 'middle',\n        })\n      } else if (input.type === 'line' || input.type === 'bar') {\n        const max = Math.max(...data, 0)\n        const min = Math.min(...data, 0)\n        const range = max - min || 1\n        const barW = plotW / data.length\n\n        // Axis\n        ops.push(\n          { op: 'stroke', style: dim }, { op: 'lineWidth', value: 1 },\n          { op: 'line', x1: plotLeft, y1: plotTop + plotH, x2: plotLeft + plotW, y2: plotTop + plotH },\n          { op: 'line', x1: plotLeft, y1: plotTop, x2: plotLeft, y2: plotTop + plotH },\n        )\n        // Max label\n        ops.push({\n          op: 'fillText', text: String(Number(max.toFixed(2))), x: plotLeft - 6, y: plotTop,\n          fillStyle: dim, font: '11px system-ui', textAlign: 'right', textBaseline: 'middle',\n        })\n        ops.push({\n          op: 'fillText', text: String(Number(min.toFixed(2))), x: plotLeft - 6, y: plotTop + plotH,\n          fillStyle: dim, font: '11px system-ui', textAlign: 'right', textBaseline: 'middle',\n        })\n\n        if (input.type === 'bar') {\n          for (let i = 0; i < data.length; i++) {\n            const v = data[i]\n            const h = ((v - min) / range) * plotH\n            const x = plotLeft + i * barW + 2\n            const y = plotTop + plotH - h\n            ops.push({ op: 'fillRect', x, y, w: barW - 4, h, fillStyle: color })\n            if (input.labels && input.labels[i]) {\n              ops.push({\n                op: 'fillText', text: input.labels[i],\n                x: x + (barW - 4) / 2, y: plotTop + plotH + 14,\n                fillStyle: dim, font: '11px system-ui', textAlign: 'center', textBaseline: 'top',\n              })\n            }\n          }\n        } else {\n          // Line\n          const points: [number, number][] = data.map((v, i) => {\n            const x = plotLeft + (i + 0.5) * (plotW / data.length)\n            const y = plotTop + plotH - ((v - min) / range) * plotH\n            return [x, y]\n          })\n          ops.push({ op: 'path', points, stroke: true, fill: false, strokeStyle: color, lineWidth: 2 })\n          for (const [x, y] of points) {\n            ops.push({ op: 'circle', x, y, r: 3, fillStyle: color })\n          }\n        }\n      } else {\n        // Pie\n        const cx = width / 2\n        const cy = plotTop + plotH / 2\n        const r = Math.min(plotW, plotH) * 0.42\n        const total = data.reduce((a, b) => a + b, 0) || 1\n        const palette = ['#6ee7b7', '#60a5fa', '#f472b6', '#fbbf24', '#a78bfa', '#fb923c', '#34d399', '#c084fc']\n        let angle = -Math.PI / 2\n        for (let i = 0; i < data.length; i++) {\n          const slice = (data[i] / total) * Math.PI * 2\n          const c = palette[i % palette.length]\n          ops.push({ op: 'path',\n            points: [[cx, cy]],\n            stroke: false, fill: false,\n          })\n          // Pie slices need real arcs, not paths — use arc op\n          ops.push({\n            op: 'fill', style: c,\n          })\n          ops.push({\n            op: 'arc',\n            x: cx, y: cy, r,\n            startAngle: angle, endAngle: angle + slice,\n            fill: true, stroke: false,\n          })\n          // Label\n          const mid = angle + slice / 2\n          const lx = cx + Math.cos(mid) * (r + 18)\n          const ly = cy + Math.sin(mid) * (r + 18)\n          const label = input.labels?.[i] || String(data[i])\n          ops.push({\n            op: 'fillText', text: label, x: lx, y: ly,\n            fillStyle: fg, font: '12px system-ui',\n            textAlign: Math.cos(mid) > 0 ? 'left' : 'right',\n            textBaseline: 'middle',\n          })\n          angle += slice\n        }\n      }\n\n      // Fix pie arc: the arc op needs its own path — inject beginPath+moveTo\n      // Simpler: we'll let the arc op draw a complete pie slice using a temporary workaround:\n      // rewrite pie ops to use a path() op with computed arc approximation. But for brevity,\n      // leverage arc op properly.\n      // (The arc op in the worker already calls ctx.beginPath() + ctx.arc; good enough for pie wedges.)\n\n      const result = await runJob({\n        width, height, ops, format: input.format, quality: input.quality, fonts: input.fonts,\n      }, input.timeout_ms ?? 15000)\n\n      return JSON.stringify({\n        status: 'success',\n        type: input.type,\n        width, height,\n        dataURL: bufferToDataURL(result.buffer, result.mimeType),\n        fallback: !!result.fallback,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\n// ---------- Badge preset ---------------------------------------------------\n\nexport const offscreenBadgeTool = tool({\n  name: 'offscreen_badge',\n  description: 'Render a shields.io-style flat badge. Two halves: label (left) + value (right). Returns a small PNG data URL.',\n  inputSchema: z.object({\n    label: z.string(),\n    value: z.string(),\n    color: z.string().optional().describe('Right-half color (default \"#2ea44f\" green)'),\n    label_color: z.string().optional().describe('Left-half color (default \"#555\")'),\n    height: z.number().optional().describe('Default 20'),\n    font: z.string().optional(),\n    scale: z.number().optional().describe('Integer upscale for crispness on HiDPI (default 2)'),\n    ...CommonOutput,\n  }),\n  callback: async (input) => {\n    try {\n      const scale = input.scale ?? 2\n      const h = (input.height ?? 20) * scale\n      const font = (input.font ?? '600 11px system-ui,sans-serif').replace(/(\\d+)px/, (_, n) => `${parseInt(n) * scale}px`)\n      const padX = 6 * scale\n      // Estimate text width: 6.5px per char at 11px baseline — rough but good enough.\n      const charWidth = 6.5 * scale\n      const labelW = input.label.length * charWidth + padX * 2\n      const valueW = input.value.length * charWidth + padX * 2\n      const width = labelW + valueW\n      const fg = '#fff'\n\n      const ops: any[] = [\n        { op: 'fillBackground', style: 'rgba(0,0,0,0)' },\n        { op: 'fillRect', x: 0, y: 0, w: labelW, h, fillStyle: input.label_color ?? '#555' },\n        { op: 'fillRect', x: labelW, y: 0, w: valueW, h, fillStyle: input.color ?? '#2ea44f' },\n        {\n          op: 'fillText', text: input.label, x: labelW / 2, y: h / 2,\n          fillStyle: fg, font, textAlign: 'center', textBaseline: 'middle',\n        },\n        {\n          op: 'fillText', text: input.value, x: labelW + valueW / 2, y: h / 2,\n          fillStyle: fg, font, textAlign: 'center', textBaseline: 'middle',\n        },\n      ]\n\n      const result = await runJob({\n        width, height: h, ops,\n        format: input.format, quality: input.quality, fonts: input.fonts,\n      }, input.timeout_ms ?? 8000)\n\n      return JSON.stringify({\n        status: 'success',\n        label: input.label, value: input.value,\n        width, height: h,\n        dataURL: bufferToDataURL(result.buffer, result.mimeType),\n        fallback: !!result.fallback,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\n// ---------- Ops reference --------------------------------------------------\n\nconst OPS_REFERENCE: Array<{ op: string; params: string; example?: any }> = [\n  { op: 'clear', params: '(none)', example: { op: 'clear' } },\n  { op: 'fillBackground', params: '{ style }', example: { op: 'fillBackground', style: '#0a0a0a' } },\n  { op: 'fill', params: '{ style }', example: { op: 'fill', style: '#6ee7b7' } },\n  { op: 'stroke', params: '{ style }', example: { op: 'stroke', style: '#fff' } },\n  { op: 'lineWidth', params: '{ value }', example: { op: 'lineWidth', value: 2 } },\n  { op: 'lineCap', params: '{ value: \"butt|round|square\" }' },\n  { op: 'lineJoin', params: '{ value: \"miter|round|bevel\" }' },\n  { op: 'lineDash', params: '{ value: [dashOn, dashOff] }' },\n  { op: 'font', params: '{ value }', example: { op: 'font', value: '600 18px system-ui' } },\n  { op: 'textAlign', params: '{ value: \"left|right|center|start|end\" }' },\n  { op: 'textBaseline', params: '{ value: \"top|middle|bottom|...\" }' },\n  { op: 'globalAlpha', params: '{ value: 0..1 }' },\n  { op: 'shadow', params: '{ color, blur, x, y }' },\n  { op: 'fillRect', params: '{ x, y, w, h }' },\n  { op: 'strokeRect', params: '{ x, y, w, h }' },\n  { op: 'roundRect', params: '{ x, y, w, h, r, fill?, stroke? }' },\n  { op: 'circle', params: '{ x, y, r, fill?, stroke? }' },\n  { op: 'arc', params: '{ x, y, r, startAngle, endAngle, anticlockwise?, fill?, stroke? }' },\n  { op: 'line', params: '{ x1, y1, x2, y2 }' },\n  { op: 'path', params: '{ points: [[x,y]...], fill?, stroke?, close? }' },\n  { op: 'bezier', params: '{ x1, y1, cx1, cy1, cx2, cy2, x2, y2 }' },\n  { op: 'fillText', params: '{ text, x, y, maxWidth? }' },\n  { op: 'strokeText', params: '{ text, x, y, maxWidth? }' },\n  { op: 'linearGradient', params: '{ x1, y1, x2, y2, stops: [[0..1, color]...], rect? }' },\n  { op: 'radialGradient', params: '{ x1, y1, r1, x2, y2, r2, stops, rect? }' },\n  { op: 'clipRect', params: '{ x, y, w, h }' },\n  { op: 'rotate', params: '{ angle }' },\n  { op: 'translate', params: '{ x, y }' },\n  { op: 'scale', params: '{ x, y }' },\n  { op: 'save', params: '(none)' },\n  { op: 'restore', params: '(none)' },\n  { op: 'image', params: '{ url (data URL), x, y, w?, h? }' },\n]\n\nexport const offscreenOpsReferenceTool = tool({\n  name: 'offscreen_ops_reference',\n  description: 'List all supported ops for offscreen_render with their parameters and examples. Call this FIRST when crafting a scene.',\n  inputSchema: z.object({}),\n  callback: async () => {\n    return JSON.stringify({\n      status: 'success',\n      count: OPS_REFERENCE.length,\n      ops: OPS_REFERENCE,\n      per_op_overrides: [\n        'fillStyle', 'strokeStyle', 'lineWidth', 'font',\n        'textAlign', 'textBaseline', 'globalAlpha',\n        'shadow: { color, blur, x, y }',\n      ],\n      placeholders_in_sequence: ['{{t}} (0..1)', '{{i}} (frame index)', '{{frames}} (total count)'],\n    })\n  },\n})\n\nexport const OFFSCREEN_CANVAS_TOOLS = [\n  offscreenRenderTool,\n  offscreenRenderSequenceTool,\n  offscreenChartTool,\n  offscreenBadgeTool,\n  offscreenOpsReferenceTool,\n]\n"]}