mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-25 17:04:52 +00:00
* fix(desktop): hide persisted agent-only history scaffolding Filter verification-stop nudges and context-compaction handoffs at the stored-history mapper boundary. Preserve a real reply when a compaction handoff shares its stored message. * test(desktop): build persisted E2E sessions through the real agent Drive tui_gateway.entry over its stdio JSON-RPC transport against the mock provider, wait for real completion events, and persist normal session history through AIAgent and SessionDB. Migrate resume and hidden-history coverage, including real compression and live verify-on-stop scaffolding, then remove the unused direct SessionDB import scripts. * fix(desktop): use the provisioned Python for real-session E2Es Run the stdio gateway through uv's synced project environment outside the Nix dev shell, while retaining the fully provisioned Nix Python when the shell advertises HERMES_PYTHON_SRC_ROOT. * fix(nix): expose the provisioned Python environment to uv Mark the Nix-built Python environment active in the dev shell so the shared E2E session builder can always run through `uv run --active --no-sync`. * fix(timeline): persist typed display events * fix(timeline): strip display-only fields from provider payloads, preserve through rewrites, fix /resume display history Three review findings from PR #69771: 1. Provider payload leak: display_kind and display_metadata were forwarded to the provider API as unknown message fields. Strict OpenAI-compatible backends can reject the next request after a model switch or resumed typed event. Strip both from the per-request api_msg copy in conversation_loop alongside the existing api_content pop. 2. Rewrite/import data loss: _insert_message_rows preserved display_kind but silently dropped display_metadata. After replace_messages, archive_and_compact, or session import, async-delegation completion events lost their task counts and fell back to generic display text. Add display_metadata to the INSERT columns and bind tuple. 3. CLI /resume stale recap: startup --resume A set _resume_display_history from A's lineage. A subsequent in-session /resume B loaded B only into conversation_history via get_messages_as_conversation, leaving the stale A display projection. _display_resumed_history preferentially read the stale attribute, showing A's recap for B. Switch /resume to get_resume_conversations and update _resume_display_history alongside conversation_history. Tests: 890 Python (5 files), 35 desktop TS — all green. * feat(tui): render typed display events as ◈ markers in the Ink TUI The TUI was not handling display_kind at all — model switch markers and async delegation completions rendered as opaque user messages with the full [System: ...] text, and hidden compaction handoffs were visible. Wire display_kind through the full TUI chain: - _history_to_messages (tui_gateway/server.py) forwards display_kind and display_metadata to the gateway transcript payload. - GatewayTranscriptMessage (gatewayTypes.ts) gains both fields. - Msg.kind (types.ts) gains 'event' value. - toTranscriptMessages (domain/messages.ts) maps: - hidden → skip entirely - model_switch → event "model changed" - async_delegation_complete → event "N background agents finished" (or "background agent work finished" without metadata) - messageGroup (blockLayout.ts) routes event to its own group, with SELF_SPACED + PAINTS_TRAILING_GAP so it owns its margins. - messageLine.tsx renders event-kind as a dim ◈ marker with no gutter, matching the CLI's ◈ event rendering. - 4 new TUI tests for hidden/model_switch/async_delegation mapping. TUI typecheck: clean. TUI lint: 0 errors (2 pre-existing warnings). TUI tests: 9 passed (1 pre-existing failure on main, unrelated). |
||
|---|---|---|
| .. | ||
| __init__.py | ||
| test_bracketed_paste_timeout.py | ||
| test_branch_command.py | ||
| test_busy_input_mode_command.py | ||
| test_chat_q_exit_clear.py | ||
| test_cli_active_agent_ref_wiring.py | ||
| test_cli_approval_ui.py | ||
| test_cli_async_delegation_delivery.py | ||
| test_cli_background_status_indicator.py | ||
| test_cli_background_tui_refresh.py | ||
| test_cli_bracketed_paste_sanitizer.py | ||
| test_cli_browser_connect.py | ||
| test_cli_codex_context_reference.py | ||
| test_cli_context_warning.py | ||
| test_cli_copy_command.py | ||
| test_cli_delegate_background_notice.py | ||
| test_cli_extension_hooks.py | ||
| test_cli_external_editor.py | ||
| test_cli_file_drop.py | ||
| test_cli_force_redraw.py | ||
| test_cli_goal_interrupt.py | ||
| test_cli_image_command.py | ||
| test_cli_init.py | ||
| test_cli_insights_command.py | ||
| test_cli_interrupt_ack_race.py | ||
| test_cli_interrupt_drain_regression.py | ||
| test_cli_interrupt_subagent.py | ||
| test_cli_light_mode.py | ||
| test_cli_loading_indicator.py | ||
| test_cli_markdown_rendering.py | ||
| test_cli_mcp_config_watch.py | ||
| test_cli_new_session.py | ||
| test_cli_pet_pane.py | ||
| test_cli_prefix_matching.py | ||
| test_cli_preloaded_skills.py | ||
| test_cli_provider_resolution.py | ||
| test_cli_reload_skills.py | ||
| test_cli_resume_command.py | ||
| test_cli_retry.py | ||
| test_cli_save_config_value.py | ||
| test_cli_secret_capture.py | ||
| test_cli_shift_enter_newline.py | ||
| test_cli_shutdown_memory_messages.py | ||
| test_cli_skin_integration.py | ||
| test_cli_status_bar.py | ||
| test_cli_status_command.py | ||
| test_cli_steer_busy_path.py | ||
| test_cli_terminal_response_sanitizer.py | ||
| test_cli_terminal_shortcuts.py | ||
| test_cli_tools_command.py | ||
| test_cli_user_message_preview.py | ||
| test_cli_yolo_toggle.py | ||
| test_compress_flags.py | ||
| test_compress_focus.py | ||
| test_compress_here.py | ||
| test_compress_type_ahead.py | ||
| test_cpr_local_leak.py | ||
| test_cprint_bg_thread.py | ||
| test_ctrl_enter_newline.py | ||
| test_cwd_env_respect.py | ||
| test_destructive_slash_confirm.py | ||
| test_destructive_slash_inline_skip_e2e.py | ||
| test_exit_delete_session.py | ||
| test_exit_summary_resume_hint.py | ||
| test_exit_watchdog_signal_arm.py | ||
| test_fast_command.py | ||
| test_manual_compress.py | ||
| test_moa_command.py | ||
| test_partial_compress.py | ||
| test_personality_none.py | ||
| test_prefill_config.py | ||
| test_prepend_note_to_message.py | ||
| test_prompt_text_input_thread_safety.py | ||
| test_quick_commands.py | ||
| test_reasoning_command.py | ||
| test_resume_display.py | ||
| test_resume_quiet_stderr.py | ||
| test_save_conversation_location.py | ||
| test_session_boundary_hooks.py | ||
| test_single_query_session_finalize.py | ||
| test_slash_command_interrupt.py | ||
| test_slash_confirm_windows.py | ||
| test_steer_inline_repaint_34569.py | ||
| test_stream_delta_think_tag.py | ||
| test_stream_partial_line_flush.py | ||
| test_surrogate_sanitization.py | ||
| test_terminal_interrupt_recovery.py | ||
| test_tool_progress_scrollback.py | ||
| test_tui_terminal_reset_on_exit.py | ||
| test_update_command.py | ||
| test_version_command.py | ||
| test_worktree.py | ||
| test_worktree_security.py | ||
| test_worktree_sync_base.py | ||