Files
Jordan Ritter 51cc63d974 chore(showcase): store demo assets uniformly as Git LFS pointers
Demo assets under showcase/integrations/*/public/{demo-files,demo-audio}/
were stored two different ways. Ten integrations committed them as LFS
pointers (the root .gitattributes convention); eight carved themselves out
with a per-integration .gitattributes that re-declared the same paths
`-filter -diff -merge`, committing raw binaries instead.

Those carve-outs were added when the image build did not fetch LFS, so a
pointer stub shipped into the image and the multimodal sample-attachment
magic-bytes guard rejected it. That premise no longer holds: the deploy
build's Checkout step hardcodes `lfs: true` (7bde1eef3a), so every
integration image now gets real binaries regardless of storage form. The
overrides are dead weight that only buys divergence.

Delete all eight override files and renormalize the 21 affected assets
through the LFS clean filter. Each override contained nothing but demo-asset
exemptions, so each is removed in full; the root .gitattributes is untouched.

Storage form changes, content does not. Every asset's sha256 already equals
the LFS OID the pointer-mode integrations reference, so each renormalized
blob is bit-for-bit the pointer blob already committed on main -- no new LFS
objects are introduced and no pointer can dangle:

  sample.png  10083 B  oid 01aa5681de99461247543e9215c1e4da3242e26b2bee11593fcdbe209672d973
  sample.pdf   2486 B  oid 3da2afae36a1a81fd2c02f15e54bfc38b6c22e41655c31a5b54ff1e0e3daab41
  sample.wav  87078 B  oid bd4aa7b049f1c3e324dfd15af4068d7f8fbf2eae1dd044df270dddc5f38a5c57

All three OIDs return download actions from the LFS batch API and were
downloaded and confirmed to hash to their OID.
2026-07-24 16:33:14 -07:00
..

Demo Files — Multimodal Demo

This directory bundles sample files referenced by the /demos/multimodal page.

Required files (must be committed as binaries; see .gitattributes at repo root):

  • sample.png — a small (< 50 KB) PNG that the "Try with sample image" button injects into the chat. A CopilotKit logo or other recognizable brand mark works well so the vision-capable agent has something to describe.
  • sample.pdf — a small (< 50 KB) one-page PDF that the "Try with sample PDF" button injects. The content must mention "CopilotKit" so E2E soft assertions hold (e.g. a one-page export of the CopilotKit quickstart).

The page at src/app/demos/multimodal/page.tsx fetches these via the public path (/demo-files/sample.png, /demo-files/sample.pdf), wraps the fetched blob in a File, and routes it through the same AttachmentsConfig.onUpload callback the paperclip button uses — so the sample path exercises the exact same queueing code as a real user upload.

If these files are missing, the demo page still renders but the sample buttons will surface a fetch error. The paperclip / drag-and-drop paths continue to work without them.