hermes-agent/tests/tui_gateway
ethernet 41e00dcf87
fix(desktop): salvage /compress cluster — session.compress RPC + dedicated RPC routing (#68229)
* fix(desktop): route /compress through session.compress RPC with transcript replacement

Salvages #44462, #53755, and #68218 into a single canonical fix for the
desktop /compress cluster.

The desktop routed /compress through slash.exec, which sends it to the
_SlashWorker subprocess. Compressing a large session outlives both the
desktop's 30s WS timeout and the worker's 45s pipe timeout — the client
gives up, runExec's blanket catch swallows the error, and command.dispatch
surfaces a misleading "not a quick/plugin/skill command: compress" (#44456).
Even when compression succeeded via the _mirror_slash_side_effects path,
the desktop never received the post-compress message list, so summarized
bubbles stayed on screen forever — /compress looked like a no-op.

This change routes /compress to the dedicated session.compress RPC (the TUI's
path), combining the best of all three PRs:

- 120s client timeout matching the TUI's HERMES_TUI_RPC_TIMEOUT_MS (#44462)
- Transcript replacement from the response `messages` via toChatMessages,
  the same converter session.resume uses (#68218, teknium1 review on #44462)
- Session-isolation guard: updateSessionState only publishes for the active
  runtime, so a late result after a session switch can't clobber the
  foreground transcript (#53755, teknium1 review on #53755)
- Coalescing: dedup concurrent compress requests per session (#53755)
- Progress toast ("compressing context...") outside the transcript (#53755)
- Error unmasking in runExec: when slash.exec fails and command.dispatch only
  adds "not a quick/plugin/skill command" routing noise, surface the original
  worker error instead (#44462)
- /compact alias + focus_topic forwarding

Co-authored-by: AlliDev <AIalliAI@users.noreply.github.com>
Co-authored-by: PinkEVO <PINKIIILQWQ@users.noreply.github.com>

* feat(desktop): route slash commands with dedicated RPCs to those RPCs

Salvages #63513 — introduces a new `rpc` kind on DesktopCommandSurface so
commands with a first-class gateway @method handler bypass slash.exec /
command.dispatch entirely, and a `renderRpcResult` utility that shapes
each RPC's structured reply into readable transcript text.

Migrates 6 commands from exec() to rpc(...):
  /agents → agents.list
  /save   → session.save
  /status → session.status
  /steer  → session.steer
  /stop   → process.stop
  /usage  → session.usage

/compress stays as action('compress') — it needs transcript replacement
from the response `messages`, which the generic rpc path can't do (per
teknium1 review on #44462/#63513).

Also includes the json-rpc-gateway timeout message improvement: the error
now includes the configured timeout duration ("request timed out after 120s:
session.compress") so a user can tell whether the default 30s fired or a
per-call override.

Co-authored-by: Jelvin <SmallNew2003@users.noreply.github.com>

* fix(desktop): preserve provider choice during config initialization

* fix(desktop): preserve slash command and host compression semantics

Keep commands whose CLI behavior exceeds their current RPC contracts on slash.exec.
Propagate the full compression timeout through compute-host control, return structured
host compression outcomes with metadata, and retain successful compression feedback
in the desktop transcript.

Add regressions for timeout forwarding, host aborts and metadata sync, structured host
control responses, command routing parity, and numeric stop counts.

* fix(desktop): harden compression state handling

Preserve the invoking stored-session binding for delayed compression results,
normalize replacement histories, and serialize provider selection. Stabilize
gateway platform tests and guard the desktop Git facade during renderer teardown.

---------

Co-authored-by: AlliDev <AIalliAI@users.noreply.github.com>
Co-authored-by: PinkEVO <PINKIIILQWQ@users.noreply.github.com>
Co-authored-by: Jelvin <SmallNew2003@users.noreply.github.com>
2026-07-22 16:40:06 -04:00
..
__init__.py
test_billing_rpc.py feat(billing): /billing terminal billing — interactive TUI + CLI client (#45449) 2026-06-19 01:53:32 +05:30
test_codex_app_server_live_events.py feat(codex): stream live app-server events to TUI/desktop tool cards 2026-07-17 13:44:12 -07:00
test_compaction_status.py
test_compute_host.py feat(dashboard): isolate turns in compute host (#65895) 2026-07-16 15:24:03 -04:00
test_compute_host_phase1.py fix(desktop): salvage /compress cluster — session.compress RPC + dedicated RPC routing (#68229) 2026-07-22 16:40:06 -04:00
test_custom_provider_session_persistence.py fix(desktop): never persist or restore a named custom provider as bare "custom" (#48547) 2026-06-18 11:11:51 -07:00
test_delegation_session_lifecycle.py fix(delegation): fail-closed orphan handling + session-scoped delegation lifecycle 2026-07-08 07:06:15 -07:00
test_entry_sys_path.py fix(tui): stop a cwd package named utils/proxy/ui from crashing the gateway child (#51693) 2026-06-23 23:29:45 -07:00
test_fast_session_scope.py fix(desktop): session-scope fast mode, surface profile ownership + pinned model override 2026-07-17 14:31:10 -04:00
test_finalize_session_persist.py fix tui finalize persist drop conversation_history so disconnect saves chat 2026-07-10 07:47:10 -07:00
test_gateway_owned_session_reap.py fix(tui): derive gateway-owned sources from the Platform enum, not a hardcoded list 2026-07-07 22:15:36 -07:00
test_goal_command.py feat(moa): make /moa one-shot only; route preset switching through the model picker 2026-06-27 03:09:09 -07:00
test_image_routing_stale_model.py fix(tui): route images with the live switched model 2026-07-17 09:08:30 -07:00
test_inline_rpc_gil_starvation.py fix(desktop): prevent false runtime-not-ready under gateway load (#66174) 2026-07-20 10:51:27 -04:00
test_interim_assistant_callback.py fix(desktop, ink): don't wipe messages before final message (#65919) 2026-07-20 11:42:29 -04:00
test_iso_certify_seam.py fix(ci): make tests, workflows, and attribution reliable under load (#66373) 2026-07-17 20:55:24 +00:00
test_make_agent_provider.py fix(model): persist /model switch by default across sessions 2026-06-19 07:07:06 -07:00
test_mcp_late_refresh_thread_owner.py fix(mcp): late-refresh must see desktop/dashboard discovery thread owner (#55514) 2026-06-30 02:08:37 -07:00
test_mcp_reload_rev.py fix(tui): revision-aware reload.mcp — an ack now means the revision was LOADED 2026-07-21 20:27:15 -05:00
test_moa_reference_emit.py feat(moa): render reference-model blocks in TUI and desktop, not just CLI (#53855) 2026-06-27 18:46:20 -07:00
test_model_switch_marker_role.py fix(tui): use role=user for model switch marker to avoid HTTP 400 on strict providers (#48338) 2026-06-28 04:34:55 -07:00
test_pet_generate_rpc.py feat(pets): polish generate flow and reduce hatch CPU pressure 2026-06-24 19:08:06 -05:00
test_project_tree.py fix(desktop): mirror Windows path identity in live overlay + WSL spelling 2026-07-12 04:33:05 -04:00
test_projects_rpc.py feat(desktop): configure repository discovery (supersedes #67630) (#68642) 2026-07-21 10:09:31 -04:00
test_protocol.py fix(themes): broadcast live skin.changed to WS surfaces (desktop/dashboard), not just stdio 2026-07-22 12:50:18 -05:00
test_reasoning_config_per_model.py feat(config): support per-model reasoning_effort overrides 2026-07-14 11:46:40 -07:00
test_reasoning_session_scope.py fix(desktop,tui-gateway,zai): stop thinking-off from reverting to medium 2026-07-02 15:23:47 -05:00
test_render.py
test_review_summary_callback.py fix(desktop,tui): surface self-improvement review summary + honor memory_notifications 2026-06-18 13:22:12 -05:00
test_session_platform_resolution.py test: deflake CI and dev-machine flaky tests in bulk (11 tests, 10 files) (#61816) 2026-07-09 20:03:11 -07:00
test_slash_worker_ansi.py fix(tui_gateway): strip ANSI from slash-worker output for desktop chat 2026-07-01 16:28:34 -05:00
test_slash_worker_mcp_discovery.py test(tui): cover profile-local MCP discovery 2026-07-10 18:09:17 +05:30
test_slash_worker_profile_home.py fix(tui): pass profile_home to slash_worker subprocess for profile-local skill discovery (#40677) 2026-07-07 05:14:00 -07:00
test_slash_worker_sys_path.py fix(tui): use shared harden_import_path guard in slash_worker 2026-07-01 05:29:22 -07:00
test_subagent_child_mirror.py feat(desktop): stream subagent activity into watch windows (#47060) 2026-06-16 14:30:11 -04:00
test_undo_command.py test: deflake CI and dev-machine flaky tests in bulk (11 tests, 10 files) (#61816) 2026-07-09 20:03:11 -07:00
test_wait_for_mcp_discovery.py fix(ci): make tests, workflows, and attribution reliable under load (#66373) 2026-07-17 20:55:24 +00:00