HERMES-GIELIE/api
Bryan Bartley 6caf86ba96 feat(workspace): download folder as zip via /api/folder/download
Adds a "Download Folder" item to the workspace file-tree right-click
menu and a GET /api/folder/download endpoint that streams the
directory as a zip with Content-Disposition: attachment.

Configurable caps:
  HERMES_WEBUI_FOLDER_ZIP_MAX_MB    (default 1024)
  HERMES_WEBUI_FOLDER_ZIP_MAX_FILES (default 50000)

Pre-flights the walk so cap-exceeded returns 413 + JSON BEFORE any
zip bytes are sent. Symlinks resolving outside the workspace are
skipped. Mirrors the existing _handle_file_raw shape (session_id
resolution, safe_resolve, RFC 5987 filename via
_content_disposition_value). Stdlib zipfile only; no new dependencies.

Tests: 11 static-inspection tests matching the style of
tests/test_issue1867_upload_size_preflight.py. All passing on
Python 3.11/3.12/3.13.
2026-05-18 21:40:02 -05:00
..
__init__.py
agent_health.py fix(agent-health): treat stale running gateway as unknown 2026-05-11 23:13:09 +00:00
agent_sessions.py fix: label email gateway sessions 2026-05-17 02:49:25 -07:00
auth.py Add session-bound CSRF token checks 2026-05-18 07:14:26 +08:00
background.py
clarify.py
commands.py fix(security): drop unsafe-eval + add jsdelivr to CSP, sanitize plugin error 2026-05-11 17:53:02 +00:00
compression_anchor.py docs: clarify compression anchor helpers 2026-05-12 01:43:16 -07:00
config.py fix: sanitize custom provider env hints 2026-05-18 15:18:20 -07:00
dashboard_probe.py feat: link official Hermes dashboard 2026-05-05 01:23:55 +00:00
extensions.py Opus pre-release follow-ups for PR #1445 2026-05-02 03:49:40 +00:00
gateway_watcher.py
goals.py fix(i18n): localize /goal runtime status strings 2026-05-10 15:21:24 +08:00
helpers.py stage-348: apply Opus SHOULD-FIX-pre-merge — add '://' to _SENSITIVE_LOWER_MARKERS 2026-05-13 16:54:36 +00:00
kanban_bridge.py stage-315 absorb: document handle_kanban_* three-valued return contract 2026-05-07 18:52:01 +00:00
metering.py fix: show TPS in assistant message headers 2026-05-04 21:26:43 +00:00
models.py Recover journal output after core transcript sync 2026-05-17 12:28:05 +08:00
oauth.py fix(oauth): serialize Anthropic env fallback reads 2026-05-07 02:47:19 +00:00
onboarding.py Classify onboarding DNS probe failures consistently 2026-05-15 08:51:30 +08:00
profiles.py fix: route background worker credentials through profile env 2026-05-16 01:02:19 -07:00
providers.py Stage 374: PR #2418 — fix(cost-history): provider-specific POSIX file lock for snapshot updates by @Michaelyklam (fixes #2402) 2026-05-17 02:49:15 +00:00
request_diagnostics.py fix: add request wedge diagnostics 2026-05-08 15:37:08 +00:00
rollback.py
routes.py feat(workspace): download folder as zip via /api/folder/download 2026-05-18 21:40:02 -05:00
run_journal.py Address run journal replay review 2026-05-16 02:58:34 +00:00
runtime_adapter.py Mark ControlResult unsafe_hash=False with explainer (Opus advisor followup) 2026-05-18 22:50:45 +00:00
session_lifecycle.py fix: align WebUI memory commits with CLI boundaries 2026-05-17 05:04:57 -06:00
session_ops.py
session_recovery.py fix: audit turn journal terminal collisions 2026-05-12 05:20:06 -07:00
startup.py
state_sync.py
streaming.py Stage 384: PR #2505 2026-05-18 22:44:02 +00:00
system_health.py feat: add VPS resource health panel 2026-05-05 17:30:56 +00:00
terminal.py
turn_journal.py fix: lock turn journal appends 2026-05-15 16:39:45 -07:00
updates.py Stage 378: PR #2146 2026-05-17 19:55:09 +00:00
upload.py fix(upload): scope archive extraction to per-session attachment dir 2026-05-18 21:22:02 +03:00
workspace.py refactor: reduce stale workspace recovery fix 2026-05-12 06:28:35 -06:00
worktrees.py Harden worktree removal safeguards 2026-05-13 09:49:15 +08:00