HERMES-GIELIE/api
nesquena-hermes e2ade27bfe fix(anchor): preserve settled mixed content order (#4958)
When a settled assistant turn carries _anchor_activity_scene and has mixed
content[] (text interleaved with tool_use), promote that ordering into anchor
scene rows (prose / tool / thinking rows in sequence) instead of only the raw
content[] fallback, and mirror the same scene model in the backend hydration
path so a cold reload reconstructs an identical transcript.

Also fixes: post-tool_use text/thinking in a NON-FINAL assistant message was
silently dropped — only the turn-final assistant's post-last-tool text is the
"final answer" tail; earlier assistant messages keep post-tool content as
activity rows. Tail thinking is excluded from the final-answer text but still
emitted as a thinking row (verified on both JS and Python paths).

Tool-row de-duplication is conservative — ID-equal always merges; name/
invocation matches are cardinality-gated and same-message; body-prefix is only
a secondary confirmation inside the id-flexible branch (also requires matching
started_at + compatible name + invocation). It biases toward an extra visible
tool card over ever silently merging two distinct calls.

Gate: Codex SAFE (tail-thinking edge verified already-handled both sides),
Opus SHIP (dedup fails toward duplicate-not-loss; non-final preservation, XSS,
non-mixed regression all clean), full suite 10778 passed (only the 4 known
pre-existing flakes). One non-blocking follow-up noted: bring the prose/thinking
peer-dedup into JS↔Python parity (cosmetic cold-reload extra-narration row).

Co-authored-by: franksong2702 <franksong2702@users.noreply.github.com>
2026-06-27 22:54:29 +00:00
..
__init__.py
agent_health.py fix(agent_health): read cross-container gateway runtime status from gateway_state.json (#5065) 2026-06-27 19:54:50 +00:00
agent_sessions.py fix(sidebar): restrict cron pre-aggregation to missing-index scans 2026-06-26 03:06:40 +00:00
auth.py fix(#5022): keep corrupt auth state from bricking startup 2026-06-27 01:58:40 +00:00
background.py
background_process.py fix(#4912): deliver async_delegation completions to the parent chat 2026-06-25 11:38:02 +00:00
clarify.py
commands.py
compression_anchor.py Address compaction marker and redaction review 2026-06-26 00:12:09 +00:00
config.py feat(settings): expose max_tokens override in Settings (#5010) 2026-06-27 20:27:18 +00:00
dashboard_probe.py
extensions.py fix(#4933): one-click extension install works with no env (bootstrap managed default root) 2026-06-25 18:45:09 +00:00
gateway_chat.py fix(streaming): strip consumed OOB steer blocks from model-facing history (#4978) 2026-06-27 19:13:36 +00:00
gateway_watcher.py
goals.py
helpers.py Address compaction marker and redaction review 2026-06-26 00:12:09 +00:00
kanban_bridge.py rebase(#2814): resolve i18n onto current master + add kanban_view_* keys to all 13 locales 2026-06-23 23:40:45 +00:00
metering.py
models.py fix(webui): hold per-session lock for state.db sidecar self-heal (TOCTOU + clobber) 2026-06-27 15:24:15 +00:00
oauth.py
onboarding.py
passkeys.py
paths.py
plugin_providers.py
plugins.py
profiles.py fix(#4783): prune dependency trees in mtime probe to match compute path (gate finding 4) 2026-06-24 21:27:22 +00:00
providers.py
request_diagnostics.py fix(#4973): replace per-request diagnostics Timer with a process-global watchdog thread 2026-06-26 07:58:13 +00:00
rollback.py
route_approvals.py fix(#5000): relay mirrored gateway approvals after stream loss 2026-06-27 06:03:24 +00:00
route_session_list_cache.py Keep session cache invalidation signals live across the routes extraction 2026-06-26 18:36:07 +00:00
routes.py fix(anchor): preserve settled mixed content order (#4958) 2026-06-27 22:54:29 +00:00
run_journal.py
runner_client.py
runtime_adapter.py
session_discoverability.py
session_events.py
session_lifecycle.py
session_ops.py fix(#4767): review fixes - more edge cases 2026-06-24 18:08:50 +00:00
session_recovery.py fix(anchor): preserve settled mixed content order (#4958) 2026-06-27 22:54:29 +00:00
skill_usage.py
sse_chunked.py
startup.py
state_sync.py
streaming.py fix(streaming): strip consumed OOB steer blocks from model-facing history (#4978) 2026-06-27 19:13:36 +00:00
system_health.py fix: keep psutil optional for system health 2026-06-26 20:49:13 +00:00
terminal.py
todo_state.py
turn_journal.py
updates.py fix(#4914): don't abort force update when git clean -fd fails 2026-06-25 11:13:57 +00:00
upload.py
usage.py
webui_session_db.py fix(#4767): review fixes - more edge cases 2026-06-24 18:08:50 +00:00
workspace.py Prevent stale escape errors from collapsing live browse grants 2026-06-23 02:53:12 -04:00
workspace_git.py
worktrees.py