Stage 384 / v0.51.91 — Release BO — 5-PR full sweep batch#2557
Merged
Conversation
handle_upload_extract() used Path(s.workspace) as the extraction root, bypassing HERMES_WEBUI_ATTACHMENT_DIR entirely. Route through _session_attachment_dir(session_id) so archives land alongside single-file uploads and session cleanup covers them. Add tests and CHANGELOG entry. Ref #2247
# Conflicts: # CHANGELOG.md
# Conflicts: # CHANGELOG.md
# Conflicts: # CHANGELOG.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stage 384 / v0.51.91 — Release BO — 5-PR full sweep batch
5-PR contributor batch following v0.51.90 (shipped earlier today). No agent-authored code; one inline Opus advisor followup (
ControlResultexplicit unhashable annotation).PRs in this batch
Fixed
_sanitize_messages_for_api+_api_safe_message_positions(provider replay); visible-transcript persistence via_restore_display_reasoning_metadatapreserves Thinking cards in the UI.static/ui.jswas updated to spare[data-live-thinking="1"]from the compact Activity cleanup._session_attachment_dir(session_id)instead ofPath(s.workspace). Extracted archives land at<attachment_root>/<session_id>/<archive_stem>/so session deletion cleanup covers them and per-session isolation is preserved whenHERMES_WEBUI_ATTACHMENT_DIRis configured._is_fallback_lifecycle_messagepredicate. Matchesrate limited/switching to fallback/falling back/fallback activated/trying fallback. Emits aswarningevents withtype=fallbackso the existingstatic/messages.jslistener surfaces them with the correct auto-clear contract.custom:gpu.local-8000now use POSIX-safeCUSTOM_GPU_LOCAL_8000_API_KEYinstead of the legacy punctuation-preserving shape. Runtime resolution checks the sanitized env var first; a one-shot deprecation warning fires when the legacy shape is used. Configured literalapi_keyvalues and explicitkey_envare unchanged.Documentation
RuntimeAdapter/LegacyJournalRuntimeAdapternow exposequeue_message(...)andupdate_goal(...)as protocol-translator delegates;/api/goalroutes throughupdate_goal(...)whenHERMES_WEBUI_RUNTIME_ADAPTER=legacy-journalis set. The defaultlegacy-directpath preserves the existing response shape. No runner/sidecar, WebUI-owned queue, goal scheduler, cached-agent table, or execution-survives-restart claim introduced.Stage cleanup
ControlResultwith@dataclass(frozen=True, eq=True, unsafe_hash=False)plus a 4-line explainer comment so future maintainers don't addfrozen=True-implied hashability back. Opus advisor followup; the previously-hashableControlResultlost its__hash__when feat(runtime): route goal through adapter seam #2544 addedpayload: dict, but nothing in the repo hashesControlResult, so making the policy explicit is the right resolution.Verification
Pre-Opus 7-point gate — green
ast.parseover allapi/*.py+tests/*.py: cleanTests
5969 passed, 6 skipped, 3 xpassed, 8 subtests passed in 125.70s (0:02:05)— 17 new tests vs v0.51.90 baselinerun-browser-tests.sh --skip-unit): 11/11 PASSOpus advisor — GO-WITH-FOLLOWUP (1 followup applied inline)
Verified each of five self-verify concerns with file:line citations and behavioral checks:
_sanitize_messages_for_api+_api_safe_message_positions;_restore_display_reasoning_metadatare-inserts at the visible-transcript persistence boundary. UI preserved, provider replay filtered. ✅_agent_status_callbackcontrol-flow inversion — Inverted form is logically equivalent. Tested both branches via existingtest_auto_compression_card.py. No previously-emitted message is dropped. ✅_resolve_keyprecedence isliteral api_key → key_env → _lookup_custom_api_key_env(pid); real keys never superseded._resolve_custom_provider_runtime_overridesplaceholder-key path in api/streaming.py still fires for the no-key case. ✅ControlResult.payloadhashability —payload: dictsilently dropped__hash__(verified viahash(ControlResult(True))pre/post). Repo-wide grep shows no current hash usage, so functionally inert. Followup applied inline:@dataclass(frozen=True, eq=True, unsafe_hash=False)+ 4-line explainer inapi/runtime_adapter.py.goal_delegate/queue_delegatekwargs — All fiveLegacyJournalRuntimeAdapter(...)call sites use keyword-only construction; defaults don't affect pre-existing cancel/start_run/approval/clarify sites. Route 7897 is the onlygoal_delegate=caller. ✅Triage actions taken this sweep (not in the batch)
maintainer-reviewapplied: [2/7] Rebuild Profiles as Profile Ops Console #2552 (@Charanis Profile Ops Console — 16631 LOC, full Profile panel rewrite, Phase 0 Q2/Q3/Q4 concerns), fix(chat): align WebUI context with messaging sessions #2547 (@AJV20 — same subprocess-from-config architecture concern as closed feat(chat): load WebUI prefill context #2526 even though the prefill loader is well-implemented)uxapplied: feat(ui): add PWA standalone reload button and pull-to-refresh gesture #2548 (@espokaos-ops PWA reload + pull-to-refresh — needs 4-viewport gate)Notes on CHANGELOG mechanics
The resolver script auto-merged #2544's CHANGELOG entry into the v0.51.90 Documentation block on the first pass. Fixed by removing the misplaced entry and rebuilding the [Unreleased] → v0.51.91 → v0.51.90 chain inline. Worth noting for the next sweep — when a PR is both a continuation of a prior shipped slice (#2509) and the implementation slice, the auto-resolver doesn't know to give it its own release block.