hermes-agent/tests
Teknium 46da6784aa feat(xchat): full feature parity — encrypted media, threaded replies, new-conversation handshake, key-event meta, read receipts
Brings the X Chat adapter to parity with mature gateway platforms:

- Encrypted media, both directions. Inbound attachments are downloaded
  (GET /2/chat/media/{conv}/{hash}), decrypted with the conversation key
  for the EVENT's key version (post-rotation media stays readable),
  size-capped, cached locally, and surfaced on MessageEvent
  (media_urls/media_types + correct MessageType) so vision/file tools
  see them. Outbound send_image/send_image_file/send_voice/send_video/
  send_document encrypt with the latest conversation key
  (encrypt_stream), upload via the 3-step chat-media flow
  (initialize/append/finalize, base64 JSON segments), and attach by
  media_hash_key. Standalone sends (cron/send_message_tool) carry
  media_files the same way.
- Native threaded replies. A bounded per-conversation cache of decrypted
  events lets send(reply_to=...) use encrypt_reply against the real
  target event; unknown targets fall back to a plain send. Inbound
  reply context (reply_to_message_id/text/author,
  reply_to_is_own_message) now propagates on MessageEvent.
- New-conversation initiation. Standalone send to a bare numeric user id
  performs the conversation-key handshake: fetch both parties' public
  keys, verify each identity↔signing binding (verify_key_binding — a
  substituted key must never receive the conversation key), wrap a
  fresh key per participant (prepare_conversation_key_change), POST to
  add-conversation-keys, then encrypt under the returned raw key.
- meta.conversation_key_events. The events endpoint returns KeyChange
  events SEPARATELY in meta — previously they were never decrypted, so
  conversations whose key changes fell outside the data array could
  never seed a key. Both the poll loop and the standalone sender now
  feed them through the batch decrypt path (after signing-key
  registration) before processing messages.
- Read receipts (opt-in, XCHAT_SEND_READ_RECEIPTS, default off) via
  POST /2/chat/conversations/{id}/read.
- Latest-key-version tracking per conversation for media encrypt and
  correct key selection after rotations.

api.py: media_upload (chunked 3-step), media_download, mark_read.
crypto.py: encrypt_reply, encrypt_media/decrypt_media, verify_key_binding,
prepare_conversation_key_change (SDK->API body mapping incl.
action_signatures), attachments/explicit-key support on encrypt_text,
latest_key_version surfaced from decrypt_events, message_attachments,
detect_mime_type/detect_image_dimensions helpers.

Docs: media/replies/handshake/read-receipts documented; stale "text
only" / "reply flows only" limitations removed; capability row added to
the messaging comparison table; media.write scope noted in setup + docs.

Tests: 51 total — inbound attachment decrypt-and-cache, outbound
encrypt-upload-attach (+ no-key failure), threaded-reply cache hit and
fallback, meta key-event absorption order, read-receipt opt-in/default,
reply-context propagation, full handshake happy path (bindings verified,
key change POSTed, explicit key used), chunked upload reassembly,
media download, mark-read body.
2026-08-12 17:16:41 -07:00
..
acp
acp_adapter
agent test(error_classifier): cover Qwen applyPromptTemplate vs llama.cpp grammar 2026-08-13 01:17:02 +05:30
ci fix(ci): stop running uv lock --check on PRs that can't touch the lockfile (#84675) 2026-08-12 13:30:01 -05:00
cli
computer_use
conformance
cron fix(cron): deliver to relay-fronted platforms via canonical home_channel (#84300) 2026-08-12 14:48:54 +10:00
dashboard
docker
e2e
fakes
fixtures
gateway fix(cron): managed-cron fires execute in the gateway process (live adapters + dashboard forwarder) (#84339) 2026-08-12 17:04:44 +10:00
hermes_cli fix(windows): SSH ControlMaster gating + stop hijacking the user's python (#84452) 2026-08-12 02:56:33 -07:00
hermes_state
honcho_plugin
install
integration
manual
monitoring
openviking_plugin
plugins feat(xchat): full feature parity — encrypted media, threaded replies, new-conversation handshake, key-event meta, read receipts 2026-08-12 17:16:41 -07:00
providers
run_agent fix: close provider-anthropic MiniMax proxy bypass + rework cache observability 2026-08-12 13:58:26 +05:30
scripts
secret_sources
skills feat(skills): cover all Hermes browser pathways in har-derived-api-client 2026-08-12 16:11:51 -07:00
state
stress
tools Disable Browser Use telemetry by default 2026-08-12 16:10:25 -07:00
tui_gateway
verify
website
__init__.py
conftest.py
run_interrupt_test.py
test_account_usage.py
test_atomic_replace_symlinks.py test(utils): cover contended Windows renames on the Windows CI lane 2026-08-12 17:25:30 -05:00
test_atomic_write_text_metadata.py
test_audio_playback_guard.py
test_background_review_list_shapes.py
test_background_review_session_isolation.py
test_base_url_hostname.py
test_batch_runner_checkpoint.py
test_batch_runner_durability.py
test_bitwarden_secrets.py
test_cli_manual_compress.py
test_cli_skin_integration.py
test_code_skew.py
test_command_secret_source.py
test_conftest_wal_gate.py
test_copilot_initiator.py
test_credential_file_permissions.py
test_ctx_halving_fix.py
test_delegate_cascade_49148.py
test_dispatch_session_id.py
test_empty_model_fallback.py
test_empty_session_hygiene.py
test_engines_satisfiable.py
test_env_loader_applied_homes.py
test_env_loader_op_bootstrap.py
test_env_loader_secret_sources.py
test_estop.py
test_evidence_store.py
test_fast_safe_load.py
test_fts_cjk_bigram.py
test_fts_update_of_narrowing.py
test_gateway_streaming_nested_config.py
test_get_tool_definitions_cache_isolation.py
test_hermes_bootstrap.py
test_hermes_constants.py
test_hermes_home_profile_warning.py
test_hermes_logging.py
test_hermes_state.py
test_hermes_state_compression_busy_retry.py
test_hermes_state_compression_locks.py
test_hermes_state_readonly_preflight.py
test_hermes_state_wal_fallback.py
test_hermetic_side_effect_guards.py
test_honcho_client_concurrency.py
test_honcho_client_config.py
test_honcho_session_context.py
test_honcho_startup_fail_open.py
test_install_autostash_conflict_recovery.py
test_install_commit_pin_rollback.py
test_install_diverged_update.py
test_install_lockfile_churn.py
test_install_macos_launcher.py
test_install_no_initial_commit.py
test_install_ps1_ascii_only.py
test_install_ps1_native_stderr_eap.py
test_install_ps1_node_path_for_npm.py
test_install_ps1_python_fallback_venv.py
test_install_ps1_uv_powershell_host.py
test_install_ps1_venv_process_tree.py
test_install_ps1_web_server_syntax_probe.py
test_install_sh_acp_launcher.py
test_install_sh_bootstrap_marker.py
test_install_sh_browser_install.py
test_install_sh_install_method_stamp.py
test_install_sh_node_global_prefix.py
test_install_sh_pythonpath_sanitization.py
test_install_sh_root_fhs_uv_python_path.py
test_install_sh_setup_wizard_tty_probe.py
test_install_sh_symlink_stomp.py
test_install_sh_termux_network_prereqs.py
test_install_unmerged_index.py
test_ipv4_preference.py
test_iron_proxy.py
test_iron_proxy_cli.py
test_iron_proxy_e2e.py
test_journal_mode_config.py
test_lazy_session_regressions.py
test_list_recent_user_messages_handoffs.py
test_live_system_guard.py
test_live_system_guard_self_test.py
test_log_isolation.py
test_managed_runtime_resolution.py fix: ASCII-only install.ps1 comment; allow-list install_cli's uv PATH fallback 2026-08-11 17:06:15 -05:00
test_mcp_serve.py
test_message_reactions.py
test_mini_swe_runner.py
test_minimax_model_validation.py
test_minimax_oauth.py
test_minisweagent_path.py
test_model_forces_max_completion_tokens.py
test_model_picker_scroll.py
test_model_tools.py
test_model_tools_async_bridge.py
test_no_shadowed_test_definitions.py
test_ollama_num_ctx.py
test_onepassword_secrets.py
test_os_marker_gating.py
test_output_cap_parsing.py
test_packaging_build_guard.py
test_packaging_metadata.py
test_plugin_skills.py
test_plugin_utils.py
test_process_loop_event_loop_warning.py
test_profile_isolation_runtime.py
test_project_metadata.py
test_pty_keepalive_ws.py
test_pty_session.py
test_resource_limits.py
test_retry_utils.py
test_run_tests_parallel.py
test_run_tests_parallel_stdio.py
test_sanitize_tool_error.py
test_schema_read_probe.py
test_search_slow_query_log.py
test_secret_scope_plugin_families.py
test_session_db_read_conn_pool.py
test_session_db_read_path_split.py
test_session_skill_previews.py
test_session_system_prompt_dedup.py
test_session_vacuum_config.py
test_session_workspace_binding.py
test_slack_thread_require_mention.py
test_slash_worker_watchdog.py
test_sql_injection.py
test_sqlite_lock_safe_inspection.py
test_sqlite_wal_reset_gate.py
test_stale_tool_call_marker_session_repair.py
test_stale_utils_module_import.py
test_state_db_malformed_repair.py
test_state_db_stats.py
test_subprocess_home_isolation.py
test_telegram_polling_progress_ptb.py
test_termux_all_extra_compat.py
test_timezone.py
test_tini_shim.py
test_toolset_distributions.py
test_toolsets.py
test_trajectory_compressor.py
test_trajectory_compressor_async.py
test_transform_llm_output_hook.py
test_transform_tool_result_hook.py
test_tui_entry_mcp_owner.py
test_tui_gateway_loop_noise.py
test_tui_gateway_queue_on_busy.py
test_tui_gateway_server.py
test_tui_gateway_server_crash_history.py
test_tui_gateway_ws.py
test_tui_mcp_late_refresh.py
test_utils_atomic_roundtrip_yaml_save.py
test_utils_truthy_values.py
test_voice_max_recording_seconds.py
test_wal_checkpoint_strategy.py
test_web_server.py
test_web_server_sessiondb_eventloop.py
test_web_server_status_topology_cache.py
test_windows_subprocess_no_window_flags.py
test_yaml_indent_consistency_31999.py
test_yuanbao_integration.py
test_yuanbao_markdown.py
test_yuanbao_pipeline.py
test_yuanbao_proto.py
test_yuanbao_reconnect_set_active.py
test_yuanbao_shutdown.py
test_zeroed_state_db.py