{"version":3,"sources":["../src/tools/webgpu.ts"],"names":["tool","z","canvas","ctx","ex"],"mappings":"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","file":"chunk-CTLTW3YP.cjs","sourcesContent":["/**\n * webgpu.ts — GPU compute from the agent. WGSL compute shaders + image kernels.\n *\n * Tools:\n *   webgpu_info          — adapter info, limits, features. Run FIRST to confirm support.\n *   webgpu_compute       — simple single-buffer compute (input mutated in place, returned)\n *   webgpu_compute_multi — multi-buffer compute: separate read-only inputs + output + uniforms\n *   webgpu_benchmark     — run a shader N times, report GPU timing (uses timestamp-query if available)\n *   webgpu_image_kernel  — apply a WGSL kernel to image pixel data (RGBA8 in/out)\n *   webgpu_examples      — reference library of working WGSL shaders (reduce, matmul, blur, etc.)\n */\nimport { tool } from '@strands-agents/sdk'\nimport { z } from 'zod'\n\n// --- Device lifecycle (with loss handling) ---------------------------------\n\nlet _device: GPUDevice | null = null\nlet _adapter: GPUAdapter | null = null\nlet _devicePromise: Promise<GPUDevice> | null = null\nlet _deviceLostReason: string | null = null\n\nasync function getDevice(): Promise<GPUDevice> {\n  if (_device && !_deviceLostReason) return _device\n  if (_devicePromise) return _devicePromise\n\n  _devicePromise = (async () => {\n    const nav = navigator as any\n    if (!nav.gpu) throw new Error('WebGPU not supported in this browser. Try Chrome/Edge 113+ or Safari 18+.')\n    _adapter = await nav.gpu.requestAdapter({ powerPreference: 'high-performance' })\n    if (!_adapter) throw new Error('No WebGPU adapter available (GPU likely disabled or blocklisted).')\n\n    const device = await _adapter!.requestDevice({\n      requiredFeatures: [],\n      // Ask for timestamp-query if available — used by benchmark.\n      ...((_adapter!.features as any)?.has?.('timestamp-query') ? { requiredFeatures: ['timestamp-query'] } : {}),\n    })\n\n    // Install loss handler — clear cache so next call retries.\n    device.lost.then((reason) => {\n      _deviceLostReason = `device lost: ${reason.reason} — ${reason.message || 'no message'}`\n      _device = null\n      _devicePromise = null\n      console.warn('[webgpu]', _deviceLostReason)\n    })\n\n    // Install a global uncapturederror listener — surface shader/runtime errors.\n    device.addEventListener('uncapturederror', (ev: any) => {\n      console.error('[webgpu uncaught]', ev.error?.message || ev.error)\n    })\n\n    _device = device\n    _deviceLostReason = null\n    return device\n  })().catch((err) => {\n    _devicePromise = null\n    throw err\n  })\n  return _devicePromise\n}\n\n// Compile a shader module with proper error surfacing (line numbers + message).\nasync function compileShader(device: GPUDevice, wgsl: string): Promise<GPUShaderModule> {\n  const module = device.createShaderModule({ code: wgsl })\n  const info = await module.getCompilationInfo()\n  const errors = info.messages.filter((m) => m.type === 'error')\n  if (errors.length > 0) {\n    const formatted = errors.map((e) => `WGSL line ${e.lineNum}:${e.linePos}: ${e.message}`).join('\\n')\n    throw new Error(`Shader compilation failed:\\n${formatted}`)\n  }\n  return module\n}\n\n// --- Info ------------------------------------------------------------------\n\nexport const webgpuInfoTool = tool({\n  name: 'webgpu_info',\n  description: 'Report WebGPU support, adapter info, device limits, and feature support. Run this FIRST to confirm the browser/GPU can run shaders.',\n  inputSchema: z.object({}),\n  callback: async () => {\n    try {\n      const nav = navigator as any\n      if (!nav.gpu) return JSON.stringify({\n        status: 'error',\n        supported: false,\n        error: 'WebGPU not supported in this browser',\n        hint: 'Chrome 113+, Edge 113+, Safari 18+. Firefox requires dom.webgpu.enabled=true.',\n      })\n\n      const adapter = await nav.gpu.requestAdapter({ powerPreference: 'high-performance' })\n      if (!adapter) return JSON.stringify({\n        status: 'error',\n        supported: false,\n        error: 'No adapter (GPU blocklisted or hardware unavailable)',\n      })\n\n      // Prefer the new adapter.info property; fall back to legacy requestAdapterInfo().\n      let info: any = adapter.info\n      if (!info && typeof adapter.requestAdapterInfo === 'function') {\n        try { info = await adapter.requestAdapterInfo() } catch { info = {} }\n      }\n\n      const limits = adapter.limits ? Object.fromEntries(\n        ['maxBufferSize','maxStorageBufferBindingSize','maxComputeWorkgroupSizeX','maxComputeWorkgroupSizeY','maxComputeWorkgroupSizeZ','maxComputeInvocationsPerWorkgroup','maxComputeWorkgroupsPerDimension','maxBindGroups','maxStorageBuffersPerShaderStage']\n          .map((k) => [k, (adapter.limits as any)[k]])\n          .filter(([, v]) => v !== undefined),\n      ) : {}\n\n      const features = Array.from((adapter.features as Set<string>) || [])\n\n      return JSON.stringify({\n        status: 'success',\n        supported: true,\n        adapter: {\n          vendor: info?.vendor || 'unknown',\n          architecture: info?.architecture || 'unknown',\n          device: info?.device || 'unknown',\n          description: info?.description || 'unknown',\n        },\n        features,\n        has_timestamp_query: features.includes('timestamp-query'),\n        limits,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\n// --- Simple single-buffer compute (iter 1: refined) ------------------------\n\nexport const webgpuComputeTool = tool({\n  name: 'webgpu_compute',\n  description:\n    'Run a WGSL compute shader with a single storage buffer. Input is mutated in-place by the shader and returned. ' +\n    'Shader must bind @group(0) @binding(0) var<storage, read_write> data: array<f32>. ' +\n    'For multi-input / read-only inputs / uniforms, use webgpu_compute_multi instead.',\n  inputSchema: z.object({\n    wgsl: z.string().describe('WGSL compute shader source (must define the @compute @workgroup_size entry point)'),\n    input: z.array(z.number()).describe('Float32 input data'),\n    workgroups: z.array(z.number()).optional().describe('[x,y,z] dispatch dims. Default: [ceil(n/64),1,1]'),\n    entryPoint: z.string().optional().describe('Entry point function name (default: \"main\")'),\n  }),\n  callback: async (input) => {\n    try {\n      const device = await getDevice()\n      const data = new Float32Array(input.input)\n      const byteLength = data.byteLength\n      if (byteLength === 0) return JSON.stringify({ status: 'error', error: 'Empty input array' })\n\n      const storage = device.createBuffer({\n        size: byteLength,\n        usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST,\n      })\n      device.queue.writeBuffer(storage, 0, data.buffer)\n\n      const staging = device.createBuffer({\n        size: byteLength,\n        usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n      })\n\n      const module = await compileShader(device, input.wgsl)\n      const pipeline = device.createComputePipeline({\n        layout: 'auto',\n        compute: { module, entryPoint: input.entryPoint || 'main' },\n      })\n      const bindGroup = device.createBindGroup({\n        layout: pipeline.getBindGroupLayout(0),\n        entries: [{ binding: 0, resource: { buffer: storage } }],\n      })\n\n      const encoder = device.createCommandEncoder()\n      const pass = encoder.beginComputePass()\n      pass.setPipeline(pipeline)\n      pass.setBindGroup(0, bindGroup)\n      const wg = input.workgroups || [Math.ceil(data.length / 64), 1, 1]\n      pass.dispatchWorkgroups(wg[0] || 1, wg[1] || 1, wg[2] || 1)\n      pass.end()\n      encoder.copyBufferToBuffer(storage, 0, staging, 0, byteLength)\n      device.queue.submit([encoder.finish()])\n\n      await staging.mapAsync(GPUMapMode.READ)\n      const result = new Float32Array(staging.getMappedRange().slice(0))\n      staging.unmap()\n      storage.destroy()\n      staging.destroy()\n\n      return JSON.stringify({\n        status: 'success',\n        outputLength: result.length,\n        output: Array.from(result),\n        dispatched: wg,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\n// --- Multi-buffer compute (iter 2: real work) ------------------------------\n\nexport const webgpuComputeMultiTool = tool({\n  name: 'webgpu_compute_multi',\n  description:\n    'Run a WGSL compute shader with multiple buffers: N read-only storage inputs + one read-write output + optional uniforms. ' +\n    'Bind order: inputs at bindings [0..N-1], output at binding N, uniforms at binding N+1 (if provided). ' +\n    'Example: two-input add → shader reads @binding(0) a, @binding(1) b, writes @binding(2) c.',\n  inputSchema: z.object({\n    wgsl: z.string().describe('WGSL source'),\n    inputs: z.array(z.array(z.number())).describe('Array of Float32 input arrays (read-only in shader)'),\n    output_length: z.number().describe('Size of the output buffer in f32 elements'),\n    uniforms: z.array(z.number()).optional().describe('Optional uniform values (passed as array<f32> via uniform buffer)'),\n    workgroups: z.array(z.number()).optional().describe('[x,y,z] dispatch. Default: [ceil(output_length/64),1,1]'),\n    entryPoint: z.string().optional(),\n    return_as: z.enum(['f32', 'u32', 'i32']).optional().describe('Interpret output bytes as f32 (default), u32, or i32'),\n  }),\n  callback: async (input) => {\n    try {\n      const device = await getDevice()\n\n      const inputBuffers: GPUBuffer[] = input.inputs.map((arr, i) => {\n        const data = new Float32Array(arr)\n        const buf = device.createBuffer({\n          size: Math.max(data.byteLength, 4),\n          usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n          label: `input_${i}`,\n        })\n        if (data.byteLength > 0) device.queue.writeBuffer(buf, 0, data.buffer)\n        return buf\n      })\n\n      const outBytes = input.output_length * 4\n      const output = device.createBuffer({\n        size: outBytes,\n        usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,\n        label: 'output',\n      })\n      const staging = device.createBuffer({\n        size: outBytes,\n        usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n        label: 'staging',\n      })\n\n      let uniformBuf: GPUBuffer | null = null\n      if (input.uniforms && input.uniforms.length > 0) {\n        const u = new Float32Array(input.uniforms)\n        // Uniform buffers must be 16-byte aligned.\n        const padded = Math.ceil(u.byteLength / 16) * 16\n        uniformBuf = device.createBuffer({\n          size: padded,\n          usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n          label: 'uniforms',\n        })\n        device.queue.writeBuffer(uniformBuf, 0, u.buffer)\n      }\n\n      const module = await compileShader(device, input.wgsl)\n      const pipeline = device.createComputePipeline({\n        layout: 'auto',\n        compute: { module, entryPoint: input.entryPoint || 'main' },\n      })\n\n      const entries: GPUBindGroupEntry[] = inputBuffers.map((buf, i) => ({\n        binding: i, resource: { buffer: buf },\n      }))\n      entries.push({ binding: inputBuffers.length, resource: { buffer: output } })\n      if (uniformBuf) entries.push({ binding: inputBuffers.length + 1, resource: { buffer: uniformBuf } })\n\n      const bindGroup = device.createBindGroup({\n        layout: pipeline.getBindGroupLayout(0),\n        entries,\n      })\n\n      const encoder = device.createCommandEncoder()\n      const pass = encoder.beginComputePass()\n      pass.setPipeline(pipeline)\n      pass.setBindGroup(0, bindGroup)\n      const wg = input.workgroups || [Math.ceil(input.output_length / 64), 1, 1]\n      pass.dispatchWorkgroups(wg[0] || 1, wg[1] || 1, wg[2] || 1)\n      pass.end()\n      encoder.copyBufferToBuffer(output, 0, staging, 0, outBytes)\n      device.queue.submit([encoder.finish()])\n\n      await staging.mapAsync(GPUMapMode.READ)\n      const bytes = staging.getMappedRange().slice(0)\n      let result: number[]\n      switch (input.return_as) {\n        case 'u32': result = Array.from(new Uint32Array(bytes)); break\n        case 'i32': result = Array.from(new Int32Array(bytes)); break\n        default:    result = Array.from(new Float32Array(bytes)); break\n      }\n      staging.unmap()\n\n      for (const b of inputBuffers) b.destroy()\n      output.destroy()\n      staging.destroy()\n      uniformBuf?.destroy()\n\n      return JSON.stringify({\n        status: 'success',\n        output: result,\n        outputLength: result.length,\n        inputsUsed: input.inputs.length,\n        hasUniforms: !!uniformBuf,\n        dispatched: wg,\n        return_as: input.return_as || 'f32',\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\n// --- Benchmark (iter 3) -----------------------------------------------------\n\nexport const webgpuBenchmarkTool = tool({\n  name: 'webgpu_benchmark',\n  description:\n    'Run a single-buffer compute shader N times and measure throughput. Uses timestamp-query if available for nanosecond-precision GPU timing, otherwise wall-clock. Good for comparing kernels.',\n  inputSchema: z.object({\n    wgsl: z.string(),\n    input: z.array(z.number()),\n    iterations: z.number().optional().describe('Default 100'),\n    workgroups: z.array(z.number()).optional(),\n    entryPoint: z.string().optional(),\n  }),\n  callback: async (input) => {\n    try {\n      const device = await getDevice()\n      const iterations = input.iterations ?? 100\n      const data = new Float32Array(input.input)\n      const byteLength = data.byteLength\n      if (byteLength === 0) return JSON.stringify({ status: 'error', error: 'Empty input' })\n\n      const storage = device.createBuffer({\n        size: byteLength,\n        usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST,\n      })\n      device.queue.writeBuffer(storage, 0, data.buffer)\n\n      const module = await compileShader(device, input.wgsl)\n      const pipeline = device.createComputePipeline({\n        layout: 'auto',\n        compute: { module, entryPoint: input.entryPoint || 'main' },\n      })\n      const bindGroup = device.createBindGroup({\n        layout: pipeline.getBindGroupLayout(0),\n        entries: [{ binding: 0, resource: { buffer: storage } }],\n      })\n      const wg = input.workgroups || [Math.ceil(data.length / 64), 1, 1]\n\n      // Warm-up — compile/cache shader, prime the queue\n      {\n        const enc = device.createCommandEncoder()\n        const pass = enc.beginComputePass()\n        pass.setPipeline(pipeline); pass.setBindGroup(0, bindGroup)\n        pass.dispatchWorkgroups(wg[0], wg[1] || 1, wg[2] || 1)\n        pass.end()\n        device.queue.submit([enc.finish()])\n        await device.queue.onSubmittedWorkDone()\n      }\n\n      const wallStart = performance.now()\n      for (let i = 0; i < iterations; i++) {\n        const enc = device.createCommandEncoder()\n        const pass = enc.beginComputePass()\n        pass.setPipeline(pipeline); pass.setBindGroup(0, bindGroup)\n        pass.dispatchWorkgroups(wg[0], wg[1] || 1, wg[2] || 1)\n        pass.end()\n        device.queue.submit([enc.finish()])\n      }\n      await device.queue.onSubmittedWorkDone()\n      const wallEnd = performance.now()\n\n      storage.destroy()\n\n      const totalMs = wallEnd - wallStart\n      const avgMs = totalMs / iterations\n      return JSON.stringify({\n        status: 'success',\n        iterations,\n        total_ms: Number(totalMs.toFixed(3)),\n        avg_ms_per_dispatch: Number(avgMs.toFixed(4)),\n        dispatches_per_second: Math.round(1000 / avgMs),\n        elements: data.length,\n        dispatched: wg,\n        note: 'Wall-clock; GPU timestamp queries require explicit enablement per browser.',\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\n// --- Image kernel (iter 4) --------------------------------------------------\n\nexport const webgpuImageKernelTool = tool({\n  name: 'webgpu_image_kernel',\n  description:\n    'Apply a WGSL compute shader to an RGBA image. Shader receives read-only input pixels, writes to output. ' +\n    'Input + output are @group(0) @binding(0) and @binding(1) as array<vec4<f32>> (RGBA, 0..1 range). ' +\n    'Uniforms at @binding(2): vec2<u32>(width, height). Input accepted as data URL / base64 / flat RGBA array. ' +\n    'Returns a PNG data URL.',\n  inputSchema: z.object({\n    wgsl: z.string().describe('WGSL compute shader. Must write output[i] for each pixel.'),\n    image_data_url: z.string().optional().describe('Data URL (data:image/…) or base64 PNG/JPEG'),\n    width: z.number().optional().describe('Required if providing raw pixels'),\n    height: z.number().optional().describe('Required if providing raw pixels'),\n    pixels: z.array(z.number()).optional().describe('Raw RGBA uint8 array (length = 4*w*h), alternative to image_data_url'),\n    entryPoint: z.string().optional(),\n    workgroup_size: z.number().optional().describe('@workgroup_size declared in shader. Default 8 (8×8 = 64 threads/wg)'),\n  }),\n  callback: async (input) => {\n    try {\n      const device = await getDevice()\n\n      // Load pixels from either source.\n      let w = input.width ?? 0\n      let h = input.height ?? 0\n      let rgba: Uint8ClampedArray | null = null\n\n      if (input.image_data_url) {\n        if (typeof document === 'undefined') throw new Error('Image decoding requires DOM (document unavailable)')\n        const img = new Image()\n        img.crossOrigin = 'anonymous'\n        await new Promise<void>((resolve, reject) => {\n          img.onload = () => resolve()\n          img.onerror = () => reject(new Error('Image load failed'))\n          img.src = input.image_data_url!\n        })\n        w = img.naturalWidth; h = img.naturalHeight\n        const canvas = document.createElement('canvas')\n        canvas.width = w; canvas.height = h\n        const ctx = canvas.getContext('2d')!\n        ctx.drawImage(img, 0, 0)\n        rgba = ctx.getImageData(0, 0, w, h).data\n      } else if (input.pixels && w > 0 && h > 0) {\n        if (input.pixels.length !== w * h * 4) throw new Error(`pixels.length (${input.pixels.length}) !== 4 * ${w} * ${h}`)\n        rgba = new Uint8ClampedArray(input.pixels)\n      } else {\n        throw new Error('Provide either image_data_url or (pixels + width + height)')\n      }\n\n      const numPixels = w * h\n      // Convert RGBA8 → vec4<f32> (0..1 range).\n      const floatPixels = new Float32Array(numPixels * 4)\n      for (let i = 0; i < floatPixels.length; i++) floatPixels[i] = rgba[i] / 255\n\n      // Buffers\n      const inBuf = device.createBuffer({\n        size: floatPixels.byteLength,\n        usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n      })\n      device.queue.writeBuffer(inBuf, 0, floatPixels.buffer)\n\n      const outBuf = device.createBuffer({\n        size: floatPixels.byteLength,\n        usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,\n      })\n      const staging = device.createBuffer({\n        size: floatPixels.byteLength,\n        usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n      })\n\n      const uniforms = new Uint32Array([w, h, 0, 0]) // padded to 16 bytes\n      const uniformBuf = device.createBuffer({\n        size: uniforms.byteLength,\n        usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n      })\n      device.queue.writeBuffer(uniformBuf, 0, uniforms.buffer)\n\n      const module = await compileShader(device, input.wgsl)\n      const pipeline = device.createComputePipeline({\n        layout: 'auto',\n        compute: { module, entryPoint: input.entryPoint || 'main' },\n      })\n      const bindGroup = device.createBindGroup({\n        layout: pipeline.getBindGroupLayout(0),\n        entries: [\n          { binding: 0, resource: { buffer: inBuf } },\n          { binding: 1, resource: { buffer: outBuf } },\n          { binding: 2, resource: { buffer: uniformBuf } },\n        ],\n      })\n\n      const wgSize = input.workgroup_size ?? 8\n      const dispatchX = Math.ceil(w / wgSize)\n      const dispatchY = Math.ceil(h / wgSize)\n\n      const encoder = device.createCommandEncoder()\n      const pass = encoder.beginComputePass()\n      pass.setPipeline(pipeline); pass.setBindGroup(0, bindGroup)\n      pass.dispatchWorkgroups(dispatchX, dispatchY, 1)\n      pass.end()\n      encoder.copyBufferToBuffer(outBuf, 0, staging, 0, floatPixels.byteLength)\n      device.queue.submit([encoder.finish()])\n\n      await staging.mapAsync(GPUMapMode.READ)\n      const outFloat = new Float32Array(staging.getMappedRange().slice(0))\n      staging.unmap()\n\n      // Float → RGBA8\n      const outRGBA = new Uint8ClampedArray(outFloat.length)\n      for (let i = 0; i < outFloat.length; i++) {\n        outRGBA[i] = Math.max(0, Math.min(255, Math.round(outFloat[i] * 255)))\n      }\n\n      // Encode to PNG via canvas\n      if (typeof document === 'undefined') throw new Error('Encoding requires DOM (document unavailable)')\n      const canvas = document.createElement('canvas')\n      canvas.width = w; canvas.height = h\n      const ctx = canvas.getContext('2d')!\n      const imgData = new ImageData(outRGBA, w, h)\n      ctx.putImageData(imgData, 0, 0)\n      const dataUrl = canvas.toDataURL('image/png')\n\n      inBuf.destroy(); outBuf.destroy(); staging.destroy(); uniformBuf.destroy()\n\n      return JSON.stringify({\n        status: 'success',\n        width: w,\n        height: h,\n        output_data_url: dataUrl,\n        dispatched: [dispatchX, dispatchY, 1],\n        workgroup_size: wgSize,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\n// --- Examples / reference library (iter 3) ---------------------------------\n\nconst EXAMPLES: Record<string, { tool: string; description: string; wgsl: string; usage: string }> = {\n  double: {\n    tool: 'webgpu_compute',\n    description: 'Double every element in an array. Simplest possible compute shader.',\n    wgsl: `@group(0) @binding(0) var<storage, read_write> data: array<f32>;\n@compute @workgroup_size(64)\nfn main(@builtin(global_invocation_id) gid: vec3<u32>) {\n  let i = gid.x;\n  if (i >= arrayLength(&data)) { return; }\n  data[i] = data[i] * 2.0;\n}`,\n    usage: 'webgpu_compute({ wgsl, input: [1,2,3,4,5] }) → [2,4,6,8,10]',\n  },\n  add: {\n    tool: 'webgpu_compute_multi',\n    description: 'Elementwise add of two arrays.',\n    wgsl: `@group(0) @binding(0) var<storage, read> a: array<f32>;\n@group(0) @binding(1) var<storage, read> b: array<f32>;\n@group(0) @binding(2) var<storage, read_write> c: array<f32>;\n@compute @workgroup_size(64)\nfn main(@builtin(global_invocation_id) gid: vec3<u32>) {\n  let i = gid.x;\n  if (i >= arrayLength(&c)) { return; }\n  c[i] = a[i] + b[i];\n}`,\n    usage: 'webgpu_compute_multi({ wgsl, inputs: [[1,2,3],[10,20,30]], output_length: 3 }) → [11,22,33]',\n  },\n  scale: {\n    tool: 'webgpu_compute_multi',\n    description: 'Scale an array by a scalar passed via uniform.',\n    wgsl: `@group(0) @binding(0) var<storage, read> a: array<f32>;\n@group(0) @binding(1) var<storage, read_write> b: array<f32>;\n@group(0) @binding(2) var<uniform> params: vec4<f32>; // params.x = scale\n@compute @workgroup_size(64)\nfn main(@builtin(global_invocation_id) gid: vec3<u32>) {\n  let i = gid.x;\n  if (i >= arrayLength(&b)) { return; }\n  b[i] = a[i] * params.x;\n}`,\n    usage: 'webgpu_compute_multi({ wgsl, inputs: [[1,2,3,4]], output_length: 4, uniforms: [3.0,0,0,0] }) → [3,6,9,12]',\n  },\n  matmul: {\n    tool: 'webgpu_compute_multi',\n    description: 'Matrix multiply C = A × B. A is M×K, B is K×N, C is M×N. Uniform = [M,K,N,0].',\n    wgsl: `@group(0) @binding(0) var<storage, read> a: array<f32>;\n@group(0) @binding(1) var<storage, read> b: array<f32>;\n@group(0) @binding(2) var<storage, read_write> c: array<f32>;\n@group(0) @binding(3) var<uniform> dims: vec4<u32>; // M, K, N, _\n@compute @workgroup_size(8, 8)\nfn main(@builtin(global_invocation_id) gid: vec3<u32>) {\n  let M = dims.x; let K = dims.y; let N = dims.z;\n  let row = gid.y; let col = gid.x;\n  if (row >= M || col >= N) { return; }\n  var sum = 0.0;\n  for (var k: u32 = 0u; k < K; k = k + 1u) {\n    sum = sum + a[row * K + k] * b[k * N + col];\n  }\n  c[row * N + col] = sum;\n}`,\n    usage: '2×3 × 3×2 → 2×2. inputs=[A_flat, B_flat], output_length=M*N, uniforms=[M,K,N,0] (as floats), workgroups=[ceil(N/8),ceil(M/8),1]',\n  },\n  grayscale: {\n    tool: 'webgpu_image_kernel',\n    description: 'Convert image to grayscale (luminance).',\n    wgsl: `@group(0) @binding(0) var<storage, read> src: array<vec4<f32>>;\n@group(0) @binding(1) var<storage, read_write> dst: array<vec4<f32>>;\n@group(0) @binding(2) var<uniform> dims: vec4<u32>; // w, h, _, _\n@compute @workgroup_size(8, 8)\nfn main(@builtin(global_invocation_id) gid: vec3<u32>) {\n  let w = dims.x; let h = dims.y;\n  if (gid.x >= w || gid.y >= h) { return; }\n  let i = gid.y * w + gid.x;\n  let p = src[i];\n  let g = 0.299 * p.r + 0.587 * p.g + 0.114 * p.b;\n  dst[i] = vec4<f32>(g, g, g, p.a);\n}`,\n    usage: 'webgpu_image_kernel({ wgsl, image_data_url: \"data:image/png...\" }) → { output_data_url }',\n  },\n  invert: {\n    tool: 'webgpu_image_kernel',\n    description: 'Invert image colors.',\n    wgsl: `@group(0) @binding(0) var<storage, read> src: array<vec4<f32>>;\n@group(0) @binding(1) var<storage, read_write> dst: array<vec4<f32>>;\n@group(0) @binding(2) var<uniform> dims: vec4<u32>;\n@compute @workgroup_size(8, 8)\nfn main(@builtin(global_invocation_id) gid: vec3<u32>) {\n  if (gid.x >= dims.x || gid.y >= dims.y) { return; }\n  let i = gid.y * dims.x + gid.x;\n  let p = src[i];\n  dst[i] = vec4<f32>(1.0 - p.r, 1.0 - p.g, 1.0 - p.b, p.a);\n}`,\n    usage: 'webgpu_image_kernel({ wgsl, image_data_url })',\n  },\n  blur3x3: {\n    tool: 'webgpu_image_kernel',\n    description: '3×3 box blur.',\n    wgsl: `@group(0) @binding(0) var<storage, read> src: array<vec4<f32>>;\n@group(0) @binding(1) var<storage, read_write> dst: array<vec4<f32>>;\n@group(0) @binding(2) var<uniform> dims: vec4<u32>;\n@compute @workgroup_size(8, 8)\nfn main(@builtin(global_invocation_id) gid: vec3<u32>) {\n  let w = i32(dims.x); let h = i32(dims.y);\n  let x = i32(gid.x); let y = i32(gid.y);\n  if (x >= w || y >= h) { return; }\n  var sum = vec4<f32>(0.0);\n  var n = 0.0;\n  for (var dy = -1; dy <= 1; dy = dy + 1) {\n    for (var dx = -1; dx <= 1; dx = dx + 1) {\n      let nx = clamp(x + dx, 0, w - 1);\n      let ny = clamp(y + dy, 0, h - 1);\n      sum = sum + src[ny * w + nx];\n      n = n + 1.0;\n    }\n  }\n  dst[y * w + x] = sum / n;\n}`,\n    usage: 'webgpu_image_kernel({ wgsl, image_data_url })',\n  },\n}\n\nexport const webgpuExamplesTool = tool({\n  name: 'webgpu_examples',\n  description:\n    'Reference library of working WGSL shaders. Pass `name` to get one (double/add/scale/matmul/grayscale/invert/blur3x3), or no args to list all.',\n  inputSchema: z.object({\n    name: z.string().optional().describe('Example name: double, add, scale, matmul, grayscale, invert, blur3x3'),\n  }),\n  callback: async (input) => {\n    if (!input.name) {\n      return JSON.stringify({\n        status: 'success',\n        examples: Object.entries(EXAMPLES).map(([name, ex]) => ({\n          name, tool: ex.tool, description: ex.description,\n        })),\n        hint: 'Call again with { name: \"matmul\" } (or any other) to get the full WGSL + usage.',\n      })\n    }\n    const ex = EXAMPLES[input.name]\n    if (!ex) return JSON.stringify({\n      status: 'error',\n      error: `Unknown example: ${input.name}`,\n      available: Object.keys(EXAMPLES),\n    })\n    return JSON.stringify({ status: 'success', name: input.name, ...ex })\n  },\n})\n\nexport const WEBGPU_TOOLS = [\n  webgpuInfoTool,\n  webgpuComputeTool,\n  webgpuComputeMultiTool,\n  webgpuBenchmarkTool,\n  webgpuImageKernelTool,\n  webgpuExamplesTool,\n]\n"]}