# NousResearch/hermes-agent · Plugin hooks, persistence ordering, and run_conversation metadata

## Open now

- 4 issues, 5 PRs open on GitHub.
- #28431: feat: expose structured multi-turn response metadata from run_conversation()
- #28474: feat: structured response object from run_conversation()
- #46574: \[Feature\]: Add plugin hook for transforming assistant messages before session DB persistence (transform_persisted_assistant)
- #57282: \[Bug\]: transform_llm_output appended content leaks into Honcho external memory sync
- PR #28453: feat: expose structured per-turn content metadata from run_conversation()
- PR #28538: feat: expose tool_call_log and metadata from run_conversation()
- PR #46578: feat: add transform_persisted_assistant plugin hook for pre-persistence transformation
- PR #57289: fix(agent): pass pre-transform response to external memory sync
- PR #82358: fix(agent): let transform_llm_output split display text from memory-sync text

These items cover adding and fixing plugin hooks that transform assistant messages before persistence, correcting mismatches between final responses and stored history caused by hook ordering, and exposing structured per-turn metadata from run_conversation().

## TL;DR

- 16 member(s): 4 open issue(s), 2 closed issue(s), 5 open PR(s), 1 merged PR(s), 4 PR(s) closed without merging.
- A fix was merged to main in PR #118845. Verify it addresses your case.
- **Recommended:** read PR #118845 (and any competing PRs below) before filing. Confirm the merged change covers your symptom.

## Maintainer resolution verdict

- Internal-tracker verdict over this cluster's issue members: `partially_resolved` · deciding PR(s): `pr-118845`. This is distinct from the fix status above. Weigh it yourself.

## How this cluster was grouped

- Link evidence (`STRUCTURAL_PARTIAL`): some members are connected by structural evidence (shared changed files, or a closing/superseded reference); the rest are joined by an automated relevance judgement over their text.
- Members outside that structural core may belong to a different underlying problem.
- Pairwise link density `0.12`: the share of member pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36. `1.00` means every pair is linked.

## Open related issues

- #28431: feat: expose structured multi-turn response metadata from run_conversation()
- #28474: feat: structured response object from run_conversation()
- #46574: \[Feature\]: Add plugin hook for transforming assistant messages before session DB persistence (transform_persisted_assistant)
- #57282: \[Bug\]: transform_llm_output appended content leaks into Honcho external memory sync

## Closed / duplicate issues

- #14894: \[Bug\]: post_llm_call response overrides are applied after persistence, causing final_response/history mismatch
- #44239: \[Bug\]: transform_llm_output and post_llm_call hooks both produce final_response/history mismatch — same root cause as #14894

## Prior & competing PRs

- **#118845: Plugin hooks fire on every surface: gateway slash commands bound + off-loop, transform hooks cover inline runtime tools, background processes and the persisted reply (#108698 #105279 #72836 #70760 #44239)**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`; implication `superseded`
  - files: `agent/agent_runtime_helpers.py`, `agent/inline_tool_executors.py`, `agent/tool_executor.py`, `agent/turn_final_response.py`, `agent/turn_finalizer.py`, `gateway/run.py`, `gateway/run_inbound.py`, `gateway/run_notifications.py`, `tests/agent/test_run_agent.py`, `tests/agent/test_transform_llm_output_persistence.py`, `tests/gateway/test_session_env.py`, `tests/gateway/test_unknown_command.py`, `tests/tools/test_process_registry.py`, `tests/tui_gateway/test_tui_gateway_server.py`, `tools/process_registry.py`, `tui_gateway/methods_tools.py`, `website/docs/user-guide/features/hooks.md`
- **#14913: fix(agent): run post_llm_call hook before session persistence**. closed without merge
  - maintainer direction: category `superseded_by_pr`; implication `superseded`; refs `35fdb4608a`, `#118845`, `#44239`
- **#28453: feat: expose structured per-turn content metadata from run_conversation()**. open
  - maintainer direction: category `uncategorized`; implication `needs_llm`; refs `#14894`, `#6067`, `#6067`
  - files: `agent/conversation_loop.py`, `tests/run_agent/test_run_agent.py`
- **#28538: feat: expose tool_call_log and metadata from run_conversation()**. open
  - maintainer direction: category `uncategorized`; implication `needs_llm`
  - files: `.dev-workflow/code-graph.db`, `.dev-workflow/experiences.jsonl`, `agent/conversation_loop.py`, `agent/tool_executor.py`, `analyzed_issues.json`, `tests/run_agent/test_run_agent.py`
- **#28840: Preserve original message timestamps through fork/compress/branch**. closed without merge
  - maintainer direction: category `merged_via`; implication `superseded`; refs `961b832c1`, `#69301`
- **#44244: fix(agent): persist plugin-transformed responses so resume replays what the user saw**. closed without merge
  - maintainer direction: category `implemented_elsewhere`; implication `superseded`; refs `35fdb4608a`, `#118845`
- **#44253: fix: persist finalized LLM hook responses**. closed without merge
  - maintainer direction: category `superseded_by_pr`; implication `superseded`; refs `35fdb4608a`, `#118845`, `#44239`
- **#46578: feat: add transform_persisted_assistant plugin hook for pre-persistence transformation**. open
  - maintainer direction: category `silent_close`; implication `active`
  - files: `hermes_cli/hooks.py`, `hermes_cli/plugins.py`, `run_agent.py`, `tests/run_agent/test_run_agent.py`
- **#57289: fix(agent): pass pre-transform response to external memory sync**. open
  - maintainer direction: category `uncategorized`; implication `needs_llm`; refs `#57282`
  - files: `agent/turn_finalizer.py`, `tests/agent/test_turn_finalizer_memory_sync_pre_transform.py`
- **#82358: fix(agent): let transform_llm_output split display text from memory-sync text**. open
  - maintainer direction: category `uncategorized`; implication `needs_llm`; refs `#57289`, `#57289`
  - files: `agent/turn_finalizer.py`, `docs/observability/README.md`, `tests/agent/test_turn_finalizer_memory_sync_pre_transform.py`, `website/docs/user-guide/features/hooks.md`

## Fix status

- Merged to main in PR #118845 (cited above). No release data is tracked. Verify downstream.
- Fix last verified (merged) `2026-09-22`.
- Subsystem: `agent`
