* fix(embeddings): support secure multimodal inputs
Closes#7956
* fix(embeddings): translate multimodal inputs and harden URL/base64 bounds
Reject oversize base64 before format validation to avoid Zod stack overflows,
translate canonical items to Jina modality-keyed and Gemini embedContent
contracts, and fetch HTTPS media server-side with DNS pinning before provider
submission.
Closes#7956
* fix(embeddings): pin DNS only for embedding media fetches
Default remote-image fetch keeps the previous globalThis.fetch path so
image-generation tests and callers stay mockable. Multimodal embeddings
still opt into undici DNS pinning for URL media.
* fix(embeddings): close 2 SSRF/DoS gaps in secure multimodal input (#7978)
Closes two gaps in the multimodal embedding input hardening from #7956:
1. `createPinnedFetch()` (the connection-pinning mechanism that closes the
DNS-rebinding TOCTOU window, GHSA-cmhj-wh2f-9cgx) had zero test coverage
anywhere in the repo. Writing that test surfaced a real regression: its
custom `connect.lookup` only implemented the single-address callback
form `(err, address, family)`. Node's autoSelectFamily/Happy Eyeballs
(on by default since Node 18) calls `lookup` with `{ all: true }` and
requires the array form `(err, addresses[])` — the mismatch threw
`ERR_INVALID_IP_ADDRESS` on every real pinned fetch, silently breaking
all URL-sourced multimodal embedding requests in production. Fixed by
branching on `options.all`.
2. The documented "16 MiB decoded per request" cap was enforced by the Zod
schema only for base64-sourced items; URL-sourced items were excluded,
and all up-to-32 items were fetched concurrently via `Promise.all` —
allowing ~256 MiB in memory at once (16x the documented bound). Fixed by
resolving items sequentially with a running byte budget shared across
base64 and fetched-URL sources, rejecting once the aggregate is
exhausted instead of after over-fetching.
Adds tests/unit/remote-image-fetch-pin-dns-connection.test.ts (real
loopback-server pinning tests) and a new aggregate-cap test in
tests/unit/embeddings-multimodal-7956.test.ts; both were verified to fail
against the pre-fix code before the corresponding fix was applied.
Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>
---------
Co-authored-by: Ravi Tharuma <RaviTharuma@users.noreply.github.com>
Co-authored-by: Diego Rodrigues de Sa e Souza <diegosouza.pw@gmail.com>
Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>