Add app assetsGLIDE_MCP_ADD_APP_ASSETS
Promote user attachments into the project's public app-asset storage and return an app-local path — `/assets/<sha256>/<filename>` — for each. Use that value as-is in `src` / `href`: it resolves on the app's own origin, so it survives a clone or a change of asset origin untouched. To read one from SERVER code, `import { assets } from "./assets"` (server-only — importing it from client code fails the build) and call `assets(env).fetch(<that same app-local path>)` — never construct or fetch the canonical app-assets URL, which is refused without the helper's capability. Pass an `assets` array; a single upload is just an array of one, and a 93-image batch is a single call. Each path is content-addressed, immutable, and cached for a year. 100 MB each. Images, audio and video whose bytes match a known container (PNG/JPEG/WEBP/GIF, MP3/WAV/FLAC/OGG/M4A, MP4/MOV/WebM) are served under their real content type; anything else is served as generic binary, which a browser will download rather than play. Every asset is stored with a visibility class — see `visibility`, which defaults to `private`; only mark bytes `public` when they are meant to be world-readable forever. Returns `{ results }` — one entry per input asset, in order: a success is `{ path, id, url, sha256, bytes, alreadyExisted }` (`url` is that app-local path), a failure is `{ path, error }`. One bad file does NOT fail the rest of the batch.
WIRING ASSETS TO DATA ROWS: when each asset belongs to a record in a table (one asset per record), set `writeUrlsToTable` and give each asset a `row: { key, column }`. The worker then writes every resulting app-local path straight into the table — do NOT, and do not need to, follow up with a `db_execute` UPDATE to store them. Emitting dozens of long content-addressed references as inline SQL is slow and burns output tokens; let this tool bind them server-side instead. What lands in the column is a PATH, not an absolute URL, so it resolves only on the app's own origin — anything reading those columns from outside the app (an export, a webhook payload) must join it to the app's origin itself.