Split out from #336 (item B2, plus the still-valid half of B3). Verdict: PARTIAL.
Ask: multi-file, folder, and zip upload.
- Multi-select: already works —
multiple is set at web/src/routes/hypervisor/Chat.tsx:631 and routes/tasks/MessageChat.tsx:353. But each file is a separate sequential request, which likely explains the "one file at a time" feel — worth batching or parallelizing with combined progress.
- Folder upload: MISSING — no
webkitdirectory anywhere in the SPA.
- Zip: MISSING and actively blocked —
routes/tasks/imageAttach.ts:52-66 (ALLOWED_EXTS), with imageAttach.test.ts:77 asserting archive.zip -> false. Server-side upload/extract would need to accompany any client change.
For the record (original item B3): general non-image uploads already work — the server enforces no type restriction at all (handle_file_upload, server.py:6728); the allowlist is client-side only and already includes documents, markdown, and source files. The "only images work" perception was likely the 413 ingress bug (#344) — most images are under 1 MiB, most documents aren't. Video is deliberately excluded (Claude can't read it); zip is the real gap.
Split out from #336 (item B2, plus the still-valid half of B3). Verdict: PARTIAL.
Ask: multi-file, folder, and zip upload.
multipleis set atweb/src/routes/hypervisor/Chat.tsx:631androutes/tasks/MessageChat.tsx:353. But each file is a separate sequential request, which likely explains the "one file at a time" feel — worth batching or parallelizing with combined progress.webkitdirectoryanywhere in the SPA.routes/tasks/imageAttach.ts:52-66(ALLOWED_EXTS), withimageAttach.test.ts:77assertingarchive.zip->false. Server-side upload/extract would need to accompany any client change.For the record (original item B3): general non-image uploads already work — the server enforces no type restriction at all (
handle_file_upload,server.py:6728); the allowlist is client-side only and already includes documents, markdown, and source files. The "only images work" perception was likely the 413 ingress bug (#344) — most images are under 1 MiB, most documents aren't. Video is deliberately excluded (Claude can't read it); zip is the real gap.