diff --git a/docs/ouroboros/artifacts/call_graph.json b/docs/ouroboros/artifacts/call_graph.json new file mode 100644 index 000000000..37d31a55d --- /dev/null +++ b/docs/ouroboros/artifacts/call_graph.json @@ -0,0 +1,4657 @@ +{ + "model_tools.py": { + "_get_tool_loop": [ + "is_closed", + "new_event_loop" + ], + "_get_worker_loop": [ + "is_closed", + "set_event_loop", + "new_event_loop", + "getattr" + ], + "_run_async": [ + "_get_tool_loop", + "submit", + "run_until_complete", + "get_running_loop", + "ThreadPoolExecutor", + "current_thread", + "_get_worker_loop", + "main_thread", + "result", + "is_running" + ], + "_discover_tools": [ + "warning", + "import_module" + ], + "get_tool_definitions": [ + "get_all_toolsets", + "update", + "build_execute_code_schema", + "difference_update", + "replace", + "enumerate", + "get", + "len", + "validate_toolset", + "resolve_toolset", + "get_definitions", + "print", + "set", + "join" + ], + "handle_function_call": [ + "error", + "invoke_hook", + "str", + "notify_other_tool_call", + "dispatch", + "dumps" + ], + "get_all_tool_names": [ + "get_all_tool_names" + ], + "get_toolset_for_tool": [ + "get_toolset_for_tool" + ], + "get_available_toolsets": [ + "get_available_toolsets" + ], + "check_toolset_requirements": [ + "check_toolset_requirements" + ], + "check_tool_availability": [ + "check_tool_availability" + ] + }, + "agent/context_compressor.py": { + "ContextCompressor.__init__": [ + "int", + "info", + "min", + "max", + "get_model_context_length" + ], + "ContextCompressor.update_from_response": [ + "get" + ], + "ContextCompressor.should_compress": [], + "ContextCompressor.should_compress_preflight": [ + "estimate_messages_tokens_rough" + ], + "ContextCompressor.get_status": [ + "min" + ], + "ContextCompressor._prune_old_tool_results": [ + "get", + "len", + "copy", + "range" + ], + "ContextCompressor._compute_summary_budget": [ + "int", + "estimate_messages_tokens_rough", + "max", + "min" + ], + "ContextCompressor._serialize_for_summary": [ + "append", + "getattr", + "get", + "isinstance", + "len", + "upper", + "join" + ], + "ContextCompressor._generate_summary": [ + "strip", + "warning", + "call_llm", + "_compute_summary_budget", + "str", + "_serialize_for_summary", + "isinstance", + "_with_summary_prefix" + ], + "ContextCompressor._with_summary_prefix": [ + "lstrip", + "strip", + "startswith", + "len" + ], + "ContextCompressor._get_tool_call_id": [ + "get", + "isinstance", + "getattr" + ], + "ContextCompressor._sanitize_tool_pairs": [ + "append", + "info", + "get", + "add", + "len", + "set", + "_get_tool_call_id" + ], + "ContextCompressor._align_boundary_forward": [ + "get", + "len" + ], + "ContextCompressor._align_boundary_backward": [ + "get", + "len" + ], + "ContextCompressor._find_tail_cut_by_tokens": [ + "_align_boundary_backward", + "get", + "max", + "len", + "isinstance", + "range" + ], + "ContextCompressor.compress": [ + "warning", + "_prune_old_tool_results", + "copy", + "_sanitize_tool_pairs", + "append", + "info", + "_align_boundary_forward", + "get", + "len", + "range", + "_generate_summary", + "estimate_messages_tokens_rough", + "_find_tail_cut_by_tokens" + ] + }, + "tools/registry.py": { + "ToolEntry.__init__": [], + "ToolRegistry.__init__": [], + "ToolRegistry.register": [ + "get", + "warning", + "ToolEntry" + ], + "ToolRegistry.deregister": [ + "pop", + "any", + "values", + "debug" + ], + "ToolRegistry.get_definitions": [ + "check_fn", + "bool", + "sorted", + "append", + "get", + "debug" + ], + "ToolRegistry.dispatch": [ + "exception", + "type", + "get", + "handler", + "_run_async", + "dumps" + ], + "ToolRegistry.get_all_tool_names": [ + "keys", + "sorted" + ], + "ToolRegistry.get_schema": [ + "get" + ], + "ToolRegistry.get_toolset_for_tool": [ + "get" + ], + "ToolRegistry.get_emoji": [ + "get" + ], + "ToolRegistry.get_tool_to_toolset_map": [ + "items" + ], + "ToolRegistry.is_toolset_available": [ + "get", + "check", + "bool", + "debug" + ], + "ToolRegistry.check_toolset_requirements": [ + "is_toolset_available", + "set", + "sorted", + "values" + ], + "ToolRegistry.get_available_toolsets": [ + "is_toolset_available", + "append", + "values" + ], + "ToolRegistry.get_toolset_requirements": [ + "get", + "append", + "values" + ], + "ToolRegistry.check_tool_availability": [ + "is_toolset_available", + "append", + "values", + "add", + "set" + ] + }, + "gateway/run.py": { + "_ensure_ssl_certs": [ + "where", + "exists", + "get_default_verify_paths" + ], + "_normalize_whatsapp_identifier": [ + "str", + "strip", + "replace", + "split" + ], + "_expand_whatsapp_auth_aliases": [ + "_normalize_whatsapp_identifier", + "append", + "loads", + "add", + "exists", + "read_text", + "pop", + "set" + ], + "_resolve_runtime_agent_kwargs": [ + "RuntimeError", + "getenv", + "format_runtime_provider_error", + "get", + "list", + "resolve_runtime_provider" + ], + "_build_media_placeholder": [ + "append", + "enumerate", + "getattr", + "startswith", + "len", + "join" + ], + "_dequeue_pending_text": [ + "_build_media_placeholder", + "get_pending_message", + "getattr" + ], + "_check_unavailable_skill": [ + "relative_to", + "rglob", + "replace", + "get_all_skills_dirs", + "Path", + "resolve", + "exists", + "_get_disabled_skill_names", + "lower", + "any", + "list", + "get_optional_skills_dir", + "join" + ], + "_platform_config_key": [], + "_load_gateway_config": [ + "exists", + "open", + "safe_load", + "debug" + ], + "_resolve_gateway_model": [ + "get", + "isinstance", + "_load_gateway_config" + ], + "_resolve_hermes_bin": [ + "find_spec", + "which" + ], + "GatewayRunner.__init__": [ + "_load_reasoning_config", + "Lock", + "_load_ephemeral_system_prompt", + "ensure_installed", + "DeliveryRouter", + "HookRegistry", + "_load_prefill_messages", + "_load_fallback_model", + "_load_voice_modes", + "_load_provider_routing", + "_load_show_reasoning", + "load_gateway_config", + "has_active_for_session", + "_load_smart_model_routing", + "PairingStore", + "SessionDB", + "SessionStore", + "set", + "debug", + "Event" + ], + "GatewayRunner._has_setup_skill": [ + "_find_skill" + ], + "GatewayRunner._load_voice_modes": [ + "loads", + "str", + "read_text", + "isinstance", + "items" + ], + "GatewayRunner._save_voice_modes": [ + "dumps", + "write_text", + "warning", + "mkdir" + ], + "GatewayRunner._set_adapter_auto_tts_disabled": [ + "add", + "discard", + "isinstance", + "getattr" + ], + "GatewayRunner._sync_voice_mode_state_to_adapter": [ + "update", + "clear", + "getattr", + "isinstance", + "items" + ], + "GatewayRunner._flush_memories_for_session": [ + "load_transcript", + "strip", + "AIAgent", + "_resolve_runtime_agent_kwargs", + "info", + "get", + "exists", + "startswith", + "read_text", + "get_memory_dir", + "run_conversation", + "len", + "_resolve_gateway_model", + "debug" + ], + "GatewayRunner._async_flush_memories": [ + "get_event_loop", + "run_in_executor" + ], + "GatewayRunner.should_exit_cleanly": [], + "GatewayRunner.should_exit_with_failure": [], + "GatewayRunner.exit_reason": [], + "GatewayRunner._session_key_for_source": [ + "getattr", + "_generate_session_key", + "isinstance", + "build_session_key", + "hasattr" + ], + "GatewayRunner._resolve_turn_agent_config": [ + "get", + "resolve_turn_route", + "getattr", + "list" + ], + "GatewayRunner._handle_adapter_fatal_error": [ + "warning", + "error", + "info", + "stop", + "get", + "disconnect", + "monotonic", + "len", + "pop" + ], + "GatewayRunner._request_clean_exit": [ + "set" + ], + "GatewayRunner._load_prefill_messages": [ + "safe_load", + "expanduser", + "warning", + "getenv", + "open", + "Path", + "get", + "exists", + "isinstance", + "is_absolute", + "load" + ], + "GatewayRunner._load_ephemeral_system_prompt": [ + "strip", + "open", + "getenv", + "get", + "exists", + "safe_load" + ], + "GatewayRunner._load_reasoning_config": [ + "strip", + "warning", + "getenv", + "open", + "parse_reasoning_effort", + "get", + "exists", + "str", + "safe_load" + ], + "GatewayRunner._load_show_reasoning": [ + "bool", + "open", + "get", + "exists", + "safe_load" + ], + "GatewayRunner._load_background_notifications_mode": [ + "warning", + "strip", + "getenv", + "open", + "get", + "exists", + "str", + "lower", + "safe_load" + ], + "GatewayRunner._load_provider_routing": [ + "get", + "exists", + "open", + "safe_load" + ], + "GatewayRunner._load_fallback_model": [ + "get", + "exists", + "open", + "safe_load" + ], + "GatewayRunner._load_smart_model_routing": [ + "get", + "exists", + "open", + "safe_load" + ], + "GatewayRunner.start": [ + "_create_adapter", + "create_task", + "getenv", + "append", + "emit", + "get", + "any", + "keys", + "items", + "recover_from_checkpoint", + "set_fatal_error_handler", + "get_active_profile_name", + "values", + "set_message_handler", + "lower", + "len", + "_send_update_notification", + "_run_process_watcher", + "warning", + "discover_and_load", + "error", + "connect", + "write_runtime_status", + "exists", + "_schedule_update_notification_watch", + "_sync_voice_mode_state_to_adapter", + "monotonic", + "build_channel_directory", + "_request_clean_exit", + "sum", + "_platform_reconnect_watcher", + "_session_expiry_watcher", + "info", + "pop", + "join" + ], + "GatewayRunner._session_expiry_watcher": [ + "_ensure_loaded", + "_async_flush_memories", + "shutdown_memory_provider", + "info", + "get", + "_is_session_expired", + "_save", + "range", + "list", + "debug", + "sleep", + "items", + "hasattr" + ], + "GatewayRunner._platform_reconnect_watcher": [ + "set_fatal_error_handler", + "warning", + "_create_adapter", + "connect", + "list", + "info", + "min", + "set_message_handler", + "_sync_voice_mode_state_to_adapter", + "monotonic", + "range", + "build_channel_directory", + "keys", + "sleep" + ], + "GatewayRunner.stop": [ + "cancel_background_tasks", + "clear", + "error", + "write_runtime_status", + "interrupt", + "info", + "shutdown_memory_provider", + "disconnect", + "cancel", + "list", + "remove_pid_file", + "debug", + "set", + "items", + "hasattr" + ], + "GatewayRunner.wait_for_shutdown": [ + "wait" + ], + "GatewayRunner._create_adapter": [ + "check_mattermost_requirements", + "check_wecom_requirements", + "check_api_server_requirements", + "DiscordAdapter", + "HomeAssistantAdapter", + "WeComAdapter", + "check_telegram_requirements", + "check_whatsapp_requirements", + "check_feishu_requirements", + "check_matrix_requirements", + "APIServerAdapter", + "setdefault", + "SmsAdapter", + "WebhookAdapter", + "WhatsAppAdapter", + "MatrixAdapter", + "SignalAdapter", + "warning", + "EmailAdapter", + "check_webhook_requirements", + "isinstance", + "check_sms_requirements", + "FeishuAdapter", + "hasattr", + "check_dingtalk_requirements", + "DingTalkAdapter", + "check_ha_requirements", + "TelegramAdapter", + "SlackAdapter", + "check_signal_requirements", + "check_slack_requirements", + "MattermostAdapter", + "check_discord_requirements", + "check_email_requirements" + ], + "GatewayRunner._is_user_authorized": [ + "_normalize_whatsapp_identifier", + "strip", + "update", + "bool", + "_expand_whatsapp_auth_aliases", + "getenv", + "get", + "add", + "lower", + "split", + "set", + "is_approved" + ], + "GatewayRunner._get_unauthorized_dm_behavior": [ + "hasattr", + "get_unauthorized_dm_behavior", + "getattr" + ], + "GatewayRunner._handle_message": [ + "_handle_resume_command", + "get_command", + "get_plugin_command_handler", + "wait_for", + "decode", + "_handle_personality_command", + "getenv", + "emit", + "_handle_stop_command", + "get", + "build_skill_invocation_message", + "_handle_insights_command", + "_handle_branch_command", + "_handle_yolo_command", + "_handle_title_command", + "str", + "_handle_deny_command", + "send", + "_is_user_authorized", + "time", + "_handle_approve_command", + "_handle_provider_command", + "_handle_undo_command", + "_session_key_for_source", + "_record_rate_limit", + "_handle_btw_command", + "_resolve_cmd", + "get_skill_commands", + "lstrip", + "_handle_message_with_agent", + "_handle_compress_command", + "_handle_reset_command", + "_handle_status_command", + "getattr", + "create_subprocess_shell", + "_handle_rollback_command", + "plugin_handler", + "_check_unavailable_skill", + "_handle_voice_command", + "_get_plat_disabled", + "_handle_help_command", + "_handle_update_command", + "warning", + "_handle_set_home_command", + "get_command_args", + "extend", + "communicate", + "isinstance", + "_handle_reload_mcp_command", + "_handle_reasoning_command", + "_handle_retry_command", + "hasattr", + "exception", + "strip", + "float", + "_resolve_cmd_inner", + "_is_rate_limited", + "interrupt", + "info", + "_handle_commands_command", + "_handle_profile_command", + "build_plan_path", + "_handle_usage_command", + "_get_unauthorized_dm_behavior", + "startswith", + "iscoroutine", + "_ME", + "pop", + "_handle_verbose_command", + "generate_code", + "get_pending_message", + "debug", + "_handle_background_command" + ], + "GatewayRunner._handle_message_with_agent": [ + "splitlines", + "open", + "append", + "_build_skill_message", + "_save", + "locals", + "append_to_transcript", + "getattr", + "_run_process_watcher", + "get_event_loop", + "_should_send_voice_reply", + "_resolve_gateway_model", + "load_transcript", + "preprocess_context_references_async", + "_set_session_env", + "info", + "run_in_executor", + "pop", + "debug", + "create_task", + "send", + "any", + "_has_setup_skill", + "AIAgent", + "int", + "_get_guild_id", + "lower", + "len", + "sub", + "ceil", + "has_any_sessions", + "error", + "_format_session_info", + "_enrich_message_with_vision", + "estimate_messages_tokens_rough", + "update_session", + "exception", + "strip", + "join", + "title", + "get", + "_enrich_message_with_transcription", + "_run_agent", + "expanduser", + "now", + "build_session_context", + "_load_skill_payload", + "get_model_context_length", + "warning", + "type", + "_resolve_runtime_agent_kwargs", + "split", + "get_reset_policy", + "enumerate", + "build_session_context_prompt", + "_send_voice_reply", + "basename", + "safe_load", + "rstrip", + "_compress_context", + "getenv", + "emit", + "get_voice_channel_context", + "str", + "rewrite_transcript", + "exists", + "isinstance", + "json", + "upper", + "_clear_session_env", + "_deliver_media_from_response", + "hasattr", + "bool", + "stop_typing", + "get_or_create_session", + "startswith", + "isoformat" + ], + "GatewayRunner._format_session_info": [ + "safe_load", + "int", + "_resolve_runtime_agent_kwargs", + "append", + "open", + "get", + "exists", + "str", + "get_model_context_length", + "isinstance", + "_resolve_gateway_model", + "join" + ], + "GatewayRunner._handle_reset_command": [ + "_session_key_for_source", + "_async_flush_memories", + "create_task", + "add_done_callback", + "emit", + "get_or_create_session", + "reset_session", + "_evict_cached_agent", + "get", + "_format_session_info", + "add", + "debug" + ], + "GatewayRunner._handle_profile_command": [ + "relative_to", + "get_hermes_home", + "home", + "str", + "split", + "display_hermes_home", + "join" + ], + "GatewayRunner._handle_status_command": [ + "strftime", + "keys", + "join", + "get_or_create_session" + ], + "GatewayRunner._handle_stop_command": [ + "get", + "interrupt", + "info", + "get_or_create_session" + ], + "GatewayRunner._handle_help_command": [ + "get_skill_commands", + "sorted", + "append", + "len", + "gateway_help_lines", + "join" + ], + "GatewayRunner._handle_commands_command": [ + "strip", + "int", + "get_skill_commands", + "append", + "sorted", + "get_command_args", + "min", + "extend", + "get", + "max", + "len", + "list", + "gateway_help_lines", + "join" + ], + "GatewayRunner._handle_provider_command": [ + "safe_load", + "open", + "append", + "normalize_provider", + "get", + "exists", + "isinstance", + "list_available_providers", + "_resolve_provider", + "join" + ], + "GatewayRunner._handle_personality_command": [ + "safe_load", + "strip", + "atomic_yaml_write", + "open", + "append", + "get_command_args", + "get", + "exists", + "str", + "lower", + "isinstance", + "len", + "_resolve_prompt", + "keys", + "join", + "items" + ], + "GatewayRunner._handle_retry_command": [ + "load_transcript", + "MessageEvent", + "rewrite_transcript", + "get_or_create_session", + "get", + "len", + "range", + "_handle_message" + ], + "GatewayRunner._handle_undo_command": [ + "load_transcript", + "rewrite_transcript", + "get_or_create_session", + "get", + "len", + "range" + ], + "GatewayRunner._handle_set_home_command": [ + "atomic_yaml_write", + "open", + "exists", + "str", + "upper", + "safe_load" + ], + "GatewayRunner._get_guild_id": [ + "int", + "hasattr", + "getattr" + ], + "GatewayRunner._handle_voice_command": [ + "_save_voice_modes", + "strip", + "_set_adapter_auto_tts_disabled", + "_get_guild_id", + "append", + "_handle_voice_channel_leave", + "get_command_args", + "get", + "lower", + "_handle_voice_channel_join", + "get_voice_channel_info", + "join", + "hasattr" + ], + "GatewayRunner._handle_voice_channel_join": [ + "_save_voice_modes", + "_set_adapter_auto_tts_disabled", + "join_voice_channel", + "warning", + "int", + "_get_guild_id", + "get_user_voice_channel", + "get", + "str", + "lower", + "hasattr" + ], + "GatewayRunner._handle_voice_channel_leave": [ + "_save_voice_modes", + "_set_adapter_auto_tts_disabled", + "warning", + "is_in_voice_channel", + "_get_guild_id", + "get", + "leave_voice_channel", + "hasattr" + ], + "GatewayRunner._handle_voice_timeout_cleanup": [ + "get", + "_save_voice_modes", + "_set_adapter_auto_tts_disabled" + ], + "GatewayRunner._handle_voice_channel_input": [ + "handle_message", + "SessionSource", + "MessageEvent", + "get_channel", + "replace", + "get", + "str", + "SimpleNamespace", + "send", + "_is_user_authorized", + "debug" + ], + "GatewayRunner._should_send_voice_reply": [ + "get", + "startswith", + "any" + ], + "GatewayRunner._send_voice_reply": [ + "warning", + "makedirs", + "is_in_voice_channel", + "play_in_voice_channel", + "_get_guild_id", + "loads", + "get", + "uuid4", + "to_thread", + "dirname", + "unlink", + "_strip_markdown_for_tts", + "gettempdir", + "isfile", + "join", + "send_voice", + "hasattr" + ], + "GatewayRunner._deliver_media_from_response": [ + "extract_images", + "warning", + "extract_local_files", + "send_document", + "Path", + "extract_media", + "send_video", + "lower", + "send_image_file", + "send_voice" + ], + "GatewayRunner._handle_rollback_command": [ + "CheckpointManager", + "strip", + "home", + "format_checkpoint_list", + "int", + "getenv", + "open", + "get_command_args", + "get", + "exists", + "str", + "isinstance", + "len", + "list_checkpoints", + "restore", + "safe_load" + ], + "GatewayRunner._handle_background_command": [ + "hex", + "strftime", + "strip", + "now", + "create_task", + "add_done_callback", + "get_command_args", + "add", + "_run_background_task", + "len", + "urandom" + ], + "GatewayRunner._run_background_task": [ + "_load_reasoning_config", + "_resolve_turn_agent_config", + "getenv", + "get", + "send", + "send_image", + "AIAgent", + "int", + "send_document", + "_load_gateway_config", + "len", + "warning", + "_resolve_runtime_agent_kwargs", + "sorted", + "get_event_loop", + "run_conversation", + "_resolve_gateway_model", + "_platform_config_key", + "_get_platform_tools", + "extract_images", + "exception", + "extract_media", + "run_in_executor" + ], + "GatewayRunner._handle_btw_command": [ + "_run_btw_task", + "strip", + "_session_key_for_source", + "strftime", + "now", + "discard", + "create_task", + "add_done_callback", + "get_command_args", + "get", + "add", + "getattr", + "done", + "uuid4", + "len", + "pop", + "hasattr" + ], + "GatewayRunner._run_btw_task": [ + "_load_reasoning_config", + "_resolve_turn_agent_config", + "get", + "send", + "list", + "send_image", + "AIAgent", + "_load_gateway_config", + "getattr", + "len", + "warning", + "_resolve_runtime_agent_kwargs", + "get_event_loop", + "send_file", + "run_conversation", + "_resolve_gateway_model", + "_platform_config_key", + "extract_images", + "load_transcript", + "exception", + "get_or_create_session", + "extract_media", + "run_in_executor" + ], + "GatewayRunner._handle_reasoning_command": [ + "strip", + "_save_config_key", + "_load_reasoning_config", + "atomic_yaml_write", + "error", + "open", + "_load_show_reasoning", + "get_command_args", + "get", + "exists", + "lower", + "split", + "isinstance", + "safe_load" + ], + "GatewayRunner._handle_yolo_command": [ + "get", + "pop", + "bool" + ], + "GatewayRunner._handle_verbose_command": [ + "warning", + "index", + "atomic_yaml_write", + "open", + "get", + "exists", + "str", + "lower", + "len", + "isinstance", + "safe_load" + ], + "GatewayRunner._handle_compress_command": [ + "load_transcript", + "warning", + "AIAgent", + "_compress_context", + "_resolve_runtime_agent_kwargs", + "rewrite_transcript", + "get_or_create_session", + "get_event_loop", + "get", + "_save", + "len", + "run_in_executor", + "_resolve_gateway_model", + "estimate_messages_tokens_rough", + "update_session" + ], + "GatewayRunner._handle_title_command": [ + "strip", + "get_session_title", + "create_session", + "get_or_create_session", + "get_command_args", + "set_session_title", + "sanitize_title" + ], + "GatewayRunner._handle_resume_command": [ + "load_transcript", + "_session_key_for_source", + "switch_session", + "strip", + "_async_flush_memories", + "get_session_title", + "resolve_session_by_title", + "create_task", + "add_done_callback", + "append", + "get_or_create_session", + "get_command_args", + "add", + "get", + "len", + "list_sessions_rich", + "join", + "debug" + ], + "GatewayRunner._handle_branch_command": [ + "append_message", + "switch_session", + "set_session_title", + "get", + "uuid4", + "strftime", + "_session_key_for_source", + "now", + "get_next_title_in_lineage", + "len", + "create_session", + "error", + "get_command_args", + "_evict_cached_agent", + "isinstance", + "load_transcript", + "strip", + "get_session_title", + "get_or_create_session" + ], + "GatewayRunner._handle_usage_command": [ + "load_transcript", + "_session_key_for_source", + "append", + "get_or_create_session", + "get", + "min", + "len", + "estimate_messages_tokens_rough", + "join", + "hasattr" + ], + "GatewayRunner._handle_insights_command": [ + "isdigit", + "strip", + "close", + "generate", + "int", + "error", + "SessionDB", + "get_command_args", + "get_event_loop", + "InsightsEngine", + "len", + "split", + "run_in_executor", + "format_gateway" + ], + "GatewayRunner._handle_reload_mcp_command": [ + "warning", + "_load_mcp_config", + "append_to_transcript", + "set", + "append", + "get_or_create_session", + "sorted", + "get_event_loop", + "run_in_executor", + "len", + "keys", + "join" + ], + "GatewayRunner._handle_approve_command": [ + "_session_key_for_source", + "strip", + "has_blocking_approval", + "pop", + "info", + "get_command_args", + "lower", + "split", + "any", + "resolve_gateway_approval" + ], + "GatewayRunner._handle_deny_command": [ + "_session_key_for_source", + "strip", + "has_blocking_approval", + "pop", + "info", + "get_command_args", + "lower", + "resolve_gateway_approval" + ], + "GatewayRunner._handle_update_command": [ + "resolve", + "str", + "with_suffix", + "now", + "Popen", + "write_text", + "Path", + "exists", + "_schedule_update_notification_watch", + "which", + "dumps", + "unlink", + "_resolve_hermes_bin", + "quote", + "replace", + "format_managed_message", + "isoformat", + "is_managed", + "join" + ], + "GatewayRunner._schedule_update_notification_watch": [ + "create_task", + "done", + "getattr", + "_watch_for_update_completion", + "debug" + ], + "GatewayRunner._watch_for_update_completion": [ + "warning", + "write_text", + "get_running_loop", + "exists", + "_send_update_notification", + "time", + "sleep" + ], + "GatewayRunner._send_update_notification": [ + "strip", + "warning", + "int", + "Platform", + "replace", + "loads", + "info", + "get", + "exists", + "read_text", + "send", + "sub", + "len", + "unlink" + ], + "GatewayRunner._set_session_env": [ + "str" + ], + "GatewayRunner._clear_session_env": [], + "GatewayRunner._enrich_message_with_vision": [ + "vision_analyze_tool", + "error", + "loads", + "append", + "get", + "join", + "debug" + ], + "GatewayRunner._enrich_message_with_transcription": [ + "get_stt_model_from_config", + "error", + "append", + "getattr", + "get", + "to_thread", + "startswith", + "_has_setup_skill", + "join", + "debug" + ], + "GatewayRunner._run_process_watcher": [ + "_load_background_notifications_mode", + "error", + "items", + "get", + "send", + "len", + "sleep", + "debug" + ], + "GatewayRunner._agent_config_signature": [ + "sorted", + "get", + "str", + "encode", + "sha256", + "dumps", + "hexdigest" + ], + "GatewayRunner._evict_cached_agent": [ + "pop", + "getattr" + ], + "GatewayRunner._run_agent": [ + "append", + "_save", + "time", + "_start_stream_consumer", + "register_gateway_notify", + "getattr", + "empty", + "StreamConsumerConfig", + "get_event_loop", + "_evict_cached_agent", + "run_conversation", + "range", + "_resolve_gateway_model", + "result", + "_get_platform_tools", + "float", + "info", + "set_tool_preview_max_len", + "run_in_executor", + "pop", + "debug", + "finditer", + "create_task", + "_resolve_turn_agent_config", + "send", + "get_tool_emoji", + "keys", + "run", + "items", + "AIAgent", + "queue_message", + "int", + "_load_gateway_config", + "lower", + "len", + "edit_message", + "error", + "sorted", + "get_nowait", + "monotonic", + "strip", + "group", + "_dequeue_pending_text", + "_agent_config_signature", + "join", + "sleep", + "GatewayStreamConsumer", + "_notify_long_running", + "wait_for", + "unregister_gateway_notify", + "maybe_auto_title", + "insert", + "get", + "list", + "_run_agent", + "get_tool_preview_max_len", + "load_dotenv", + "track_agent", + "warning", + "type", + "finish", + "_resolve_runtime_agent_kwargs", + "send_progress_messages", + "cancel", + "dumps", + "has_pending_interrupt", + "_platform_config_key", + "put", + "clear", + "interrupt", + "send_exec_approval", + "monitor_for_interrupt", + "_load_reasoning_config", + "rstrip", + "getenv", + "reset_current_session_key", + "emit", + "str", + "set_current_session_key", + "run_coroutine_threadsafe", + "Queue", + "add", + "StreamingConfig", + "isinstance", + "hasattr", + "send_typing", + "set", + "get_pending_message" + ], + "_start_cron_ticker": [ + "info", + "cleanup_image_cache", + "build_channel_directory", + "cleanup_document_cache", + "is_set", + "cron_tick", + "debug", + "wait" + ], + "start_gateway": [ + "get_hermes_home", + "write_pid_file", + "register", + "create_task", + "release_all_scoped_locks", + "stop", + "get", + "shutdown_mcp_servers", + "str", + "addHandler", + "remove_pid_file", + "GatewayRunner", + "getLogger", + "Thread", + "sleep", + "add_signal_handler", + "StreamHandler", + "sync_skills", + "warning", + "wait_for_shutdown", + "RotatingFileHandler", + "getpid", + "error", + "get_event_loop", + "get_running_pid", + "range", + "print", + "kill", + "setLevel", + "RedactingFormatter", + "start", + "mkdir", + "setFormatter", + "info", + "set", + "join", + "Event" + ], + "main": [ + "from_dict", + "ArgumentParser", + "open", + "add_argument", + "parse_args", + "start_gateway", + "exit", + "load", + "run" + ] + }, + "cli.py": { + "_load_prefill_messages": [ + "expanduser", + "warning", + "open", + "Path", + "exists", + "isinstance", + "is_absolute", + "load" + ], + "_parse_reasoning_config": [ + "strip", + "warning", + "parse_reasoning_effort" + ], + "load_cli_config": [ + "getcwd", + "strip", + "warning", + "update", + "_expand_env_vars", + "open", + "Path", + "get", + "exists", + "str", + "dumps", + "lower", + "isinstance", + "pop", + "safe_load", + "items" + ], + "_run_cleanup": [ + "shutdown_memory_provider", + "getattr", + "shutdown_mcp_servers", + "shutdown_cached_clients", + "_cleanup_all_terminals", + "_cleanup_all_browsers", + "hasattr" + ], + "_git_repo_root": [ + "strip", + "run" + ], + "_path_is_within_root": [ + "relative_to" + ], + "_setup_worktree": [ + "splitlines", + "open", + "_git_repo_root", + "resolve", + "str", + "uuid4", + "endswith", + "run", + "warning", + "is_file", + "Path", + "write", + "exists", + "is_dir", + "symlink", + "print", + "strip", + "mkdir", + "copy2", + "startswith", + "read_text", + "_path_is_within_root", + "debug" + ], + "_cleanup_worktree": [ + "strip", + "bool", + "Path", + "exists", + "debug", + "print", + "run" + ], + "_prune_stale_worktrees": [ + "stat", + "strip", + "iterdir", + "Path", + "exists", + "str", + "startswith", + "is_dir", + "debug", + "time", + "run" + ], + "_accent_hex": [ + "get_active_skin", + "get_color" + ], + "_rich_text_from_ansi": [ + "from_ansi" + ], + "_cprint": [ + "_pt_print", + "_PT_ANSI" + ], + "_detect_file_drop": [ + "strip", + "replace", + "is_file", + "Path", + "exists", + "startswith", + "lower", + "isinstance", + "len" + ], + "ChatConsole.__init__": [ + "Console", + "StringIO" + ], + "ChatConsole.print": [ + "rstrip", + "get_terminal_size", + "truncate", + "_cprint", + "getvalue", + "split", + "seek", + "print" + ], + "_build_compact_banner": [ + "min", + "get_terminal_size", + "ljust" + ], + "_looks_like_slash_command": [ + "startswith", + "split" + ], + "_get_plugin_cmd_handler_names": [ + "keys", + "set", + "get_plugin_manager" + ], + "_parse_skills_argument": [ + "strip", + "append", + "add", + "str", + "split", + "isinstance", + "set" + ], + "save_config_value": [ + "chmod", + "atomic_yaml_write", + "error", + "mkdir", + "open", + "Path", + "exists", + "split", + "isinstance", + "safe_load" + ], + "HermesCLI.__init__": [ + "Lock", + "getenv", + "get", + "str", + "uuid4", + "_parse_reasoning_config", + "strftime", + "now", + "int", + "lower", + "_load_prefill_messages", + "warning", + "Queue", + "isinstance", + "print", + "strip", + "Console", + "_auto_detect_local_model", + "SessionDB", + "validate_toolset", + "set", + "join", + "Event" + ], + "HermesCLI._invalidate": [ + "monotonic", + "invalidate", + "hasattr" + ], + "HermesCLI._status_bar_context_style": [], + "HermesCLI._build_context_bar": [ + "round", + "max", + "min" + ], + "HermesCLI._get_status_bar_snapshot": [ + "round", + "now", + "getattr", + "min", + "max", + "len", + "split", + "endswith", + "format_duration_compact", + "total_seconds" + ], + "HermesCLI._status_bar_display_width": [ + "get_cwidth", + "len" + ], + "HermesCLI._trim_status_bar_text": [ + "rstrip", + "join", + "append", + "len", + "get_cwidth", + "_status_bar_display_width" + ], + "HermesCLI._build_status_bar_text": [ + "_trim_status_bar_text", + "get_size", + "get_terminal_size", + "append", + "_get_status_bar_snapshot", + "getattr", + "get_app", + "format_token_count_compact", + "_format_context_length", + "join" + ], + "HermesCLI._get_status_bar_fragments": [ + "_status_bar_context_style", + "_trim_status_bar_text", + "get_size", + "get_terminal_size", + "_get_status_bar_snapshot", + "_status_bar_display_width", + "get_app", + "format_token_count_compact", + "_build_context_bar", + "_format_context_length", + "sum", + "join", + "_build_status_bar_text" + ], + "HermesCLI._normalize_model_for_provider": [ + "get_codex_model_ids", + "strip", + "normalize_copilot_model_id", + "opencode_model_api_mode", + "normalize_opencode_model_id", + "copilot_model_api_mode", + "split", + "print" + ], + "HermesCLI._on_thinking": [ + "_invalidate", + "_flush_reasoning_preview" + ], + "HermesCLI._current_reasoning_callback": [], + "HermesCLI._emit_reasoning_preview": [ + "strip", + "splitlines", + "get_terminal_size", + "replace", + "append", + "_cprint", + "fill", + "max", + "split", + "len", + "join" + ], + "HermesCLI._flush_reasoning_preview": [ + "_emit_reasoning_preview", + "rfind", + "lstrip", + "get_terminal_size", + "getattr", + "min", + "max", + "len", + "endswith" + ], + "HermesCLI._stream_reasoning_delta": [ + "get_terminal_size", + "_cprint", + "getattr", + "max", + "len", + "split" + ], + "HermesCLI._close_reasoning_box": [ + "get_terminal_size", + "_cprint", + "getattr" + ], + "HermesCLI._stream_delta": [ + "_reset_stream_state", + "_flush_stream", + "_stream_delta", + "find", + "getattr", + "_stream_reasoning_delta", + "max", + "len", + "range", + "endswith", + "_emit_stream_text" + ], + "HermesCLI._emit_stream_text": [ + "get_active_skin", + "get_branding", + "_close_reasoning_box", + "int", + "lstrip", + "get_terminal_size", + "_cprint", + "getattr", + "max", + "split", + "len", + "get_color" + ], + "HermesCLI._flush_stream": [ + "get_terminal_size", + "_close_reasoning_box", + "_cprint", + "getattr" + ], + "HermesCLI._reset_stream_state": [], + "HermesCLI._slow_command_status": [ + "strip", + "startswith", + "lower" + ], + "HermesCLI._command_spinner_frame": [ + "int", + "monotonic", + "len" + ], + "HermesCLI._busy_command": [ + "print", + "_invalidate" + ], + "HermesCLI._ensure_runtime_credentials": [ + "format_runtime_provider_error", + "get", + "_normalize_model_for_provider", + "isinstance", + "list", + "resolve_runtime_provider", + "print", + "debug" + ], + "HermesCLI._resolve_turn_agent_config": [ + "resolve_turn_route", + "getattr", + "list" + ], + "HermesCLI._init_agent": [ + "get_messages_as_conversation", + "_current_reasoning_callback", + "_cprint", + "set_session_title", + "get", + "list", + "commit", + "AIAgent", + "execute", + "getattr", + "len", + "_ensure_runtime_credentials", + "tuple", + "warning", + "_accent_hex", + "get_session", + "_escape", + "ChatConsole", + "print", + "SessionDB" + ], + "HermesCLI.show_banner": [ + "getcwd", + "get_tool_definitions", + "clear", + "build_welcome_banner", + "get_terminal_size", + "getenv", + "_build_compact_banner", + "getattr", + "_show_tool_availability_warnings", + "lower", + "_show_status", + "print", + "hasattr" + ], + "HermesCLI._preload_resumed_session": [ + "get_messages_as_conversation", + "get_session", + "execute", + "get", + "len", + "print", + "commit" + ], + "HermesCLI._display_resumed_history": [ + "strip", + "get_active_skin", + "splitlines", + "Text", + "append", + "_strip_reasoning", + "enumerate", + "get", + "str", + "Panel", + "sub", + "len", + "isinstance", + "print", + "join", + "get_color" + ], + "HermesCLI._try_attach_clipboard_image": [ + "strftime", + "get_hermes_home", + "now", + "append", + "save_clipboard_image" + ], + "HermesCLI._handle_rollback_command": [ + "getcwd", + "splitlines", + "format_checkpoint_list", + "join", + "getenv", + "diff", + "get", + "_resolve_checkpoint_ref", + "lower", + "split", + "len", + "list_checkpoints", + "restore", + "print", + "undo_last", + "hasattr" + ], + "HermesCLI._resolve_checkpoint_ref": [ + "int", + "print", + "len" + ], + "HermesCLI._handle_stop_command": [ + "get", + "list_sessions", + "len", + "print", + "kill_all" + ], + "HermesCLI._handle_paste_command": [ + "_try_attach_clipboard_image", + "has_clipboard_image", + "_cprint", + "len" + ], + "HermesCLI._preprocess_images_with_vision": [ + "stat", + "vision_analyze_tool", + "loads", + "_cprint", + "append", + "get", + "exists", + "str", + "isinstance", + "join", + "run" + ], + "HermesCLI._show_tool_availability_warnings": [ + "print", + "check_tool_availability", + "join", + "len" + ], + "HermesCLI._show_status": [ + "get_tool_definitions", + "split", + "len", + "print", + "join" + ], + "HermesCLI.show_help": [ + "strip", + "_accent_hex", + "sorted", + "_cprint", + "_escape", + "ChatConsole", + "get_active_help_header", + "len", + "print", + "items" + ], + "HermesCLI.show_tools": [ + "get_tool_definitions", + "index", + "sorted", + "append", + "get", + "get_toolset_for_tool", + "len", + "split", + "print", + "keys" + ], + "HermesCLI._handle_tools_command": [ + "_get_platform_tools", + "show_tools", + "_cprint", + "load_config", + "tools_disable_enable_command", + "split", + "Namespace", + "len", + "print", + "join", + "new_session" + ], + "HermesCLI.show_toolsets": [ + "get_toolset_info", + "sorted", + "len", + "get_all_toolsets", + "print", + "keys" + ], + "HermesCLI._handle_profile_command": [ + "relative_to", + "get_hermes_home", + "home", + "str", + "split", + "display_hermes_home", + "print" + ], + "HermesCLI.show_config": [ + "getcwd", + "strftime", + "getenv", + "Path", + "exists", + "len", + "print", + "join" + ], + "HermesCLI._list_recent_sessions": [ + "get", + "list_sessions_rich" + ], + "HermesCLI._show_recent_sessions": [ + "get", + "_list_recent_sessions", + "print", + "_relative_time" + ], + "HermesCLI.show_history": [ + "flush_tool_summary", + "get", + "str", + "len", + "print", + "_show_recent_sessions" + ], + "HermesCLI.new_session": [ + "end_session", + "strftime", + "now", + "_invalidate_system_prompt", + "create_session", + "reset_session_state", + "flush_memories", + "get", + "uuid4", + "TodoStore", + "print", + "hasattr" + ], + "HermesCLI._handle_resume_command": [ + "end_session", + "strip", + "_resolve_session_by_name_or_id", + "get_messages_as_conversation", + "_invalidate_system_prompt", + "reopen_session", + "get_session", + "reset_session_state", + "_cprint", + "get", + "TodoStore", + "split", + "len", + "_show_recent_sessions", + "hasattr" + ], + "HermesCLI._handle_branch_command": [ + "end_session", + "strftime", + "strip", + "now", + "append_message", + "get_session_title", + "_invalidate_system_prompt", + "create_session", + "get_next_title_in_lineage", + "reset_session_state", + "_cprint", + "set_session_title", + "get", + "uuid4", + "TodoStore", + "split", + "len", + "hasattr" + ], + "HermesCLI.reset_conversation": [ + "shutdown_memory_provider", + "new_session", + "hasattr" + ], + "HermesCLI.save_conversation": [ + "strftime", + "now", + "open", + "dump", + "isoformat", + "print" + ], + "HermesCLI.retry_last": [ + "get", + "print", + "len", + "range" + ], + "HermesCLI.undo_last": [ + "get", + "print", + "len", + "range" + ], + "HermesCLI._show_model_and_providers": [ + "curated_models_for_provider", + "_get_custom_base_url", + "normalize_provider", + "get", + "list_available_providers", + "_resolve_provider", + "print", + "join" + ], + "HermesCLI._handle_prompt_command": [ + "strip", + "save_config_value", + "append", + "lower", + "split", + "len", + "print" + ], + "HermesCLI._resolve_personality_prompt": [ + "append", + "get", + "str", + "isinstance", + "join" + ], + "HermesCLI._handle_personality_command": [ + "strip", + "save_config_value", + "_resolve_personality_prompt", + "get", + "str", + "lower", + "split", + "len", + "isinstance", + "print", + "keys", + "join", + "items" + ], + "HermesCLI._handle_cron_command": [ + "strip", + "_cron_api", + "cronjob_tool", + "int", + "_parse_flags", + "loads", + "get_job", + "list", + "append", + "get", + "str", + "lower", + "split", + "len", + "_normalize_skills", + "print", + "set", + "join" + ], + "HermesCLI._handle_skills_command": [ + "handle_skills_slash", + "ChatConsole" + ], + "HermesCLI._show_gateway_status": [ + "get_home_channel", + "load_gateway_config", + "get", + "display_hermes_home", + "print", + "get_connected_platforms", + "items" + ], + "HermesCLI.process_command": [ + "build_skill_invocation_message", + "_rich_text_from_ansi", + "get_tool_definitions", + "_resolve_cmd", + "_reload_mcp", + "save_conversation", + "_handle_rollback_command", + "show_config", + "_handle_cron_command", + "_handle_prompt_command", + "_handle_paste_command", + "list_plugins", + "_handle_plan_command", + "_handle_reasoning_command", + "undo_last", + "_handle_skin_command", + "cursor_goto", + "flush", + "_handle_profile_command", + "_show_usage", + "_cprint", + "_handle_stop_command", + "_handle_branch_command", + "display_hermes_home", + "run", + "getcwd", + "lstrip", + "lower", + "len", + "show_toolsets", + "_toggle_yolo", + "_handle_voice_command", + "get_session", + "sorted", + "show_history", + "_show_insights", + "strip", + "_build_compact_banner", + "_handle_browser_command", + "join", + "plugin_handler", + "_handle_resume_command", + "erase_screen", + "_handle_personality_command", + "retry_last", + "set_session_title", + "get", + "_handle_btw_command", + "_handle_tools_command", + "_show_gateway_status", + "split", + "_busy_command", + "print", + "_manual_compress", + "clear", + "put", + "_handle_skills_command", + "show_banner", + "_slow_command_status", + "show_help", + "get_session_by_title", + "get_plugin_command_handler", + "get_terminal_size", + "getenv", + "str", + "sanitize_title", + "new_session", + "get_plugin_manager", + "_show_model_and_providers", + "min", + "_toggle_verbose", + "ChatConsole", + "hasattr", + "process_command", + "build_welcome_banner", + "_get_plugin_cmd_handler_names", + "startswith", + "set", + "_handle_background_command" + ], + "HermesCLI._handle_plan_command": [ + "strip", + "put", + "_cprint", + "build_plan_path", + "build_skill_invocation_message", + "split", + "len", + "print", + "hasattr" + ], + "HermesCLI._handle_background_command": [ + "get_branding", + "_resolve_turn_agent_config", + "_cprint", + "get", + "uuid4", + "_invalidate", + "_rich_text_from_ansi", + "strftime", + "now", + "Thread", + "AIAgent", + "Panel", + "len", + "_ensure_runtime_credentials", + "_accent_hex", + "invalidate", + "write", + "ChatConsole", + "split", + "run_conversation", + "print", + "get_color", + "strip", + "get_active_skin", + "start", + "flush", + "pop", + "sleep" + ], + "HermesCLI._handle_btw_command": [ + "_resolve_turn_agent_config", + "_cprint", + "get", + "uuid4", + "list", + "_invalidate", + "_rich_text_from_ansi", + "strftime", + "now", + "Thread", + "AIAgent", + "Panel", + "len", + "_ensure_runtime_credentials", + "invalidate", + "write", + "ChatConsole", + "split", + "run_conversation", + "print", + "get_color", + "strip", + "get_active_skin", + "start", + "flush", + "sleep" + ], + "HermesCLI._try_launch_chrome_debug": [ + "which", + "isfile", + "Popen", + "append" + ], + "HermesCLI._handle_browser_command": [ + "close", + "get", + "settimeout", + "int", + "cleanup_all_browsers", + "lower", + "len", + "connect", + "_try_launch_chrome_debug", + "split", + "range", + "print", + "rsplit", + "system", + "hasattr", + "strip", + "put", + "socket", + "startswith", + "pop", + "sleep" + ], + "HermesCLI._handle_skin_command": [ + "strip", + "save_config_value", + "sorted", + "display_hermes_home", + "get_active_skin_name", + "lower", + "split", + "_apply_tui_skin_style", + "set_active_skin", + "len", + "print", + "join", + "list_skins" + ], + "HermesCLI._toggle_verbose": [ + "index", + "_current_reasoning_callback", + "_cprint", + "get", + "len" + ], + "HermesCLI._toggle_yolo": [ + "get", + "print", + "pop", + "bool" + ], + "HermesCLI._handle_reasoning_command": [ + "_parse_reasoning_config", + "strip", + "save_config_value", + "_current_reasoning_callback", + "_cprint", + "get", + "lower", + "split", + "len" + ], + "HermesCLI._on_reasoning": [ + "_flush_reasoning_preview", + "getattr" + ], + "HermesCLI._manual_compress": [ + "_compress_context", + "estimate_messages_tokens_rough", + "print", + "len" + ], + "HermesCLI._show_usage": [ + "setLevel", + "now", + "CanonicalUsage", + "float", + "getattr", + "min", + "estimate_usage_cost", + "len", + "format_duration_compact", + "print", + "total_seconds", + "getLogger" + ], + "HermesCLI._show_insights": [ + "close", + "format_terminal", + "generate", + "int", + "SessionDB", + "InsightsEngine", + "split", + "len", + "print" + ], + "HermesCLI._check_config_mcp_changes": [ + "stat", + "safe_load", + "Thread", + "start", + "_get_config_path", + "open", + "get", + "exists", + "is_alive", + "monotonic", + "print", + "join" + ], + "HermesCLI._reload_mcp": [ + "get_tool_definitions", + "keys", + "discover_mcp_tools", + "append", + "sorted", + "shutdown_mcp_servers", + "len", + "_persist_session", + "print", + "set", + "join", + "hasattr" + ], + "HermesCLI._on_tool_gen_start": [ + "_close_reasoning_box", + "_flush_stream", + "_cprint", + "getattr", + "get_tool_emoji" + ], + "HermesCLI._on_tool_progress": [ + "Thread", + "start", + "get_tool_preview_max_len", + "startswith", + "len", + "_invalidate", + "get_tool_emoji" + ], + "HermesCLI._on_tool_start": [ + "capture_local_edit_snapshot", + "debug" + ], + "HermesCLI._on_tool_complete": [ + "pop", + "render_edit_diff_with_delta", + "debug" + ], + "HermesCLI._voice_start_recording": [ + "play_beep", + "_voice_stop_and_transcribe", + "Thread", + "start", + "RuntimeError", + "_cprint", + "invalidate", + "getattr", + "get", + "check_voice_requirements", + "hasattr", + "load_config", + "sleep", + "AudioRecorder" + ], + "HermesCLI._voice_stop_and_transcribe": [ + "strip", + "play_beep", + "put", + "Thread", + "start", + "_voice_start_recording", + "_cprint", + "stop", + "invalidate", + "get", + "transcribe_recording", + "getattr", + "load_config", + "unlink", + "isfile", + "hasattr" + ], + "HermesCLI._voice_speak_response": [ + "strftime", + "strip", + "makedirs", + "warning", + "clear", + "isfile", + "_cprint", + "getsize", + "sub", + "play_audio_file", + "len", + "unlink", + "rsplit", + "gettempdir", + "set", + "join", + "text_to_speech_tool" + ], + "HermesCLI._handle_voice_command": [ + "strip", + "_toggle_voice_tts", + "_disable_voice_mode", + "_cprint", + "_enable_voice_mode", + "lower", + "len", + "split", + "_show_voice_status" + ], + "HermesCLI._enable_voice_mode": [ + "detect_audio_environment", + "replace", + "_cprint", + "get", + "lower", + "split", + "check_voice_requirements", + "load_config", + "upper", + "join" + ], + "HermesCLI._disable_voice_mode": [ + "Thread", + "start", + "_cprint", + "shutdown", + "cancel", + "stop_playback", + "set" + ], + "HermesCLI._toggle_voice_tts": [ + "_cprint", + "check_tts_requirements" + ], + "HermesCLI._show_voice_status": [ + "replace", + "_cprint", + "get", + "lower", + "split", + "check_voice_requirements", + "load_config", + "upper" + ], + "HermesCLI._clarify_callback": [ + "Queue", + "_cprint", + "get", + "monotonic", + "len", + "_invalidate" + ], + "HermesCLI._sudo_password_callback": [ + "Queue", + "_cprint", + "get", + "monotonic", + "_invalidate" + ], + "HermesCLI._approval_callback": [ + "Queue", + "_cprint", + "get", + "monotonic", + "_invalidate", + "_approval_choices" + ], + "HermesCLI._approval_choices": [ + "append", + "len" + ], + "HermesCLI._handle_approval_selection": [ + "put", + "get", + "max", + "len", + "_invalidate" + ], + "HermesCLI._get_approval_display_fragments": [ + "_panel_box_width", + "_wrap_panel_text", + "get_terminal_size", + "append", + "enumerate", + "_append_panel_line", + "get", + "extend", + "min", + "max", + "len", + "wrap", + "_append_blank_panel_line", + "ljust" + ], + "HermesCLI._secret_capture_callback": [ + "prompt_for_secret" + ], + "HermesCLI._submit_secret_response": [ + "_invalidate", + "put" + ], + "HermesCLI._cancel_secret_capture": [ + "_submit_secret_response" + ], + "HermesCLI._clear_secret_input_buffer": [ + "reset", + "getattr" + ], + "HermesCLI._clear_current_input": [ + "getattr" + ], + "HermesCLI.chat": [ + "get_branding", + "splitlines", + "_preprocess_images_with_vision", + "rstrip", + "get_terminal_size", + "_resolve_turn_agent_config", + "append", + "_cprint", + "maybe_auto_title", + "open", + "get", + "str", + "is_alive", + "_invalidate", + "_rich_text_from_ansi", + "getcwd", + "strftime", + "Thread", + "_import_sounddevice", + "getattr", + "put_nowait", + "max", + "get_model_context_length", + "len", + "_ensure_runtime_credentials", + "empty", + "Panel", + "cleanup_stale_async_clients", + "_reset_stream_state", + "_accent_hex", + "_load_tts_cfg", + "join", + "Queue", + "error", + "write", + "set_secret_capture_callback", + "ChatConsole", + "get_nowait", + "isinstance", + "run_conversation", + "print", + "hasattr", + "preprocess_context_references", + "get_color", + "get_active_skin", + "strip", + "_flush_stream", + "_get_prov", + "put", + "start", + "flush", + "_init_agent", + "interrupt", + "enumerate", + "_sanitize_surrogates", + "_import_elevenlabs", + "set", + "sleep", + "debug", + "Event" + ], + "HermesCLI._print_exit_summary": [ + "now", + "get_session_title", + "int", + "get", + "divmod", + "len", + "get_active_goodbye", + "print", + "total_seconds" + ], + "HermesCLI._get_tui_prompt_symbols": [ + "get_active_profile_name", + "rstrip", + "get_active_prompt_symbol", + "split", + "any" + ], + "HermesCLI._audio_level_bar": [ + "min", + "getattr" + ], + "HermesCLI._get_tui_prompt_fragments": [ + "_audio_level_bar", + "_get_tui_prompt_symbols", + "_command_spinner_frame" + ], + "HermesCLI._get_tui_prompt_text": [ + "_get_tui_prompt_fragments", + "join" + ], + "HermesCLI._build_tui_style_dict": [ + "update", + "get_prompt_toolkit_style_overrides", + "dict", + "getattr" + ], + "HermesCLI._apply_tui_skin_style": [ + "from_dict", + "_invalidate", + "_build_tui_style_dict", + "getattr" + ], + "HermesCLI._get_extra_tui_widgets": [], + "HermesCLI._register_extra_tui_keybindings": [], + "HermesCLI._build_tui_layout_children": [ + "_get_extra_tui_widgets", + "Window" + ], + "HermesCLI.run": [ + "register", + "open", + "append", + "shutdown", + "set_exception_handler", + "_check_config_mcp_changes", + "time", + "getattr", + "auto_down", + "KeyboardInterrupt", + "PasswordProcessor", + "_panel_box_width", + "_accent_hex", + "_wrap_panel_text", + "_display_resumed_history", + "Condition", + "_handle_approval_selection", + "invalidate", + "get_event_loop", + "range", + "from_dict", + "_get_approval_display_fragments", + "FileHistory", + "compile", + "get_size", + "replace", + "mkdir", + "_invoke_hook", + "debug", + "SlashCommandCompleter", + "_Pt", + "get_branding", + "Lock", + "auto_up", + "finditer", + "_cprint", + "_looks_like_slash_command", + "ensure_installed", + "stop_playback", + "run", + "_preload_resumed_session", + "SlashCommandAutoSuggest", + "Thread", + "FormattedTextControl", + "int", + "max", + "lower", + "len", + "sub", + "load_config", + "Layout", + "_original_on_resize", + "write_text", + "_escape", + "write", + "flush_memories", + "set_secret_capture_callback", + "Transformation", + "monotonic", + "kill", + "wait", + "strip", + "group", + "ConditionalProcessor", + "insert_text", + "Application", + "_get_status_bar_fragments", + "cleanup_temp_recordings", + "join", + "sleep", + "end_session", + "_submit_secret_response", + "_register_extra_tui_keybindings", + "insert", + "get", + "AutoSuggestFromHistory", + "list", + "ljust", + "now", + "_build_tui_style_dict", + "_append_panel_line", + "_cancel_secret_capture", + "apply_completion", + "encode", + "patch_stdout", + "TextArea", + "_PlaceholderProcessor", + "extend", + "_try_attach_clipboard_image", + "split", + "print", + "get_color", + "set_sudo_password_callback", + "HSplit", + "_run_cleanup", + "put", + "clear", + "_get_config_path", + "interrupt", + "set_approval_callback", + "enumerate", + "_detect_file_drop", + "default_exception_handler", + "start_completion", + "show_banner", + "is_set", + "_get_tui_prompt_fragments", + "_command_spinner_frame", + "get_terminal_size", + "str", + "_build_tui_layout_children", + "_invalidate", + "strftime", + "get_plugin_manager", + "run_in_terminal", + "min", + "KeyBindings", + "exit", + "CompletionsMenu", + "Dimension", + "count", + "Queue", + "_voice_start_recording", + "_get_tui_prompt_text", + "chat", + "Path", + "add", + "exists", + "ChatConsole", + "Window", + "isinstance", + "signal", + "wrap", + "_append_blank_panel_line", + "hasattr", + "stat", + "go_to_completion", + "get_active_skin", + "_print_exit_summary", + "process_command", + "bool", + "ConditionalContainer", + "start", + "reset", + "startswith", + "read_text", + "_get_text", + "set", + "Event" + ], + "main": [ + "_setup_worktree", + "register", + "_resolve_turn_agent_config", + "append", + "_git_repo_root", + "get", + "str", + "HermesCLI", + "build_preloaded_skills_prompt", + "run", + "_prune_stale_worktrees", + "_ensure_runtime_credentials", + "start_gateway", + "exit", + "show_toolsets", + "_parse_skills_argument", + "sorted", + "chat", + "extend", + "isinstance", + "split", + "ValueError", + "run_conversation", + "print", + "_get_platform_tools", + "strip", + "_print_exit_summary", + "show_tools", + "_init_agent", + "show_banner", + "join" + ] + }, + "agent/prompt_caching.py": { + "_apply_cache_marker": [ + "get", + "isinstance" + ], + "apply_anthropic_cache_control": [ + "get", + "_apply_cache_marker", + "deepcopy", + "len", + "range" + ] + }, + "hermes_state.py": { + "SessionDB.__init__": [ + "Lock", + "connect", + "mkdir", + "execute", + "str", + "_init_schema" + ], + "SessionDB._execute_write": [ + "sleep", + "execute", + "OperationalError", + "fn", + "str", + "lower", + "range", + "uniform", + "rollback", + "_try_wal_checkpoint", + "commit" + ], + "SessionDB._try_wal_checkpoint": [ + "execute", + "debug", + "fetchone" + ], + "SessionDB.close": [ + "execute", + "close" + ], + "SessionDB._init_schema": [ + "executescript", + "cursor", + "execute", + "replace", + "fetchone", + "isinstance", + "commit" + ], + "SessionDB.create_session": [ + "dumps", + "_execute_write", + "execute", + "time" + ], + "SessionDB.end_session": [ + "_execute_write", + "execute", + "time" + ], + "SessionDB.reopen_session": [ + "_execute_write", + "execute" + ], + "SessionDB.update_system_prompt": [ + "_execute_write", + "execute" + ], + "SessionDB.update_token_counts": [ + "_execute_write", + "execute" + ], + "SessionDB.ensure_session": [ + "_execute_write", + "execute", + "time" + ], + "SessionDB.set_token_counts": [ + "_execute_write", + "execute" + ], + "SessionDB.get_session": [ + "execute", + "dict", + "fetchone" + ], + "SessionDB.resolve_session_id": [ + "get_session", + "execute", + "replace", + "fetchall", + "len" + ], + "SessionDB.sanitize_title": [ + "ValueError", + "strip", + "sub", + "len" + ], + "SessionDB.set_session_title": [ + "execute", + "fetchone", + "_execute_write", + "ValueError", + "sanitize_title" + ], + "SessionDB.get_session_title": [ + "execute", + "fetchone" + ], + "SessionDB.get_session_by_title": [ + "execute", + "dict", + "fetchone" + ], + "SessionDB.resolve_session_by_title": [ + "fetchall", + "get_session_by_title", + "replace", + "execute" + ], + "SessionDB.get_next_title_in_lineage": [ + "int", + "execute", + "replace", + "group", + "max", + "fetchall", + "match" + ], + "SessionDB.list_sessions_rich": [ + "strip", + "dict", + "execute", + "append", + "extend", + "fetchall", + "len", + "pop", + "join" + ], + "SessionDB.append_message": [ + "execute", + "_execute_write", + "isinstance", + "len", + "dumps", + "time" + ], + "SessionDB.get_messages": [ + "dict", + "execute", + "append", + "loads", + "get", + "fetchall" + ], + "SessionDB.get_messages_as_conversation": [ + "loads", + "execute", + "fetchall", + "append" + ], + "SessionDB._sanitize_fts5_query": [ + "strip", + "replace", + "append", + "group", + "enumerate", + "sub", + "len" + ], + "SessionDB.search_messages": [ + "strip", + "dict", + "execute", + "append", + "extend", + "fetchall", + "pop", + "_sanitize_fts5_query", + "join" + ], + "SessionDB.search_sessions": [ + "execute", + "fetchall", + "dict" + ], + "SessionDB.session_count": [ + "execute", + "fetchone" + ], + "SessionDB.message_count": [ + "execute", + "fetchone" + ], + "SessionDB.export_session": [ + "get_messages", + "get_session" + ], + "SessionDB.export_all": [ + "get_messages", + "append", + "search_sessions" + ], + "SessionDB.clear_messages": [ + "_execute_write", + "execute" + ], + "SessionDB.delete_session": [ + "_execute_write", + "execute", + "fetchone" + ], + "SessionDB.prune_sessions": [ + "execute", + "_execute_write", + "fetchall", + "len", + "time" + ] + }, + "agent/skill_commands.py": { + "build_plan_path": [ + "strftime", + "strip", + "splitlines", + "now", + "Path", + "lower", + "sub", + "split", + "join" + ], + "_load_skill_payload": [ + "expanduser", + "strip", + "relative_to", + "lstrip", + "loads", + "Path", + "resolve", + "get", + "str", + "is_absolute", + "skill_view" + ], + "_build_skill_message": [ + "strip", + "relative_to", + "rglob", + "append", + "values", + "sorted", + "is_file", + "get", + "str", + "extend", + "exists", + "isinstance", + "join" + ], + "scan_skill_commands": [ + "skill_matches_platform", + "append", + "get", + "str", + "any", + "rglob", + "lower", + "extend", + "exists", + "add", + "get_external_skills_dirs", + "split", + "strip", + "_parse_frontmatter", + "replace", + "startswith", + "_get_disabled_skill_names", + "read_text", + "set" + ], + "get_skill_commands": [ + "scan_skill_commands" + ], + "build_skill_invocation_message": [ + "get", + "get_skill_commands", + "_load_skill_payload", + "_build_skill_message" + ], + "build_preloaded_skills_prompt": [ + "strip", + "append", + "_build_skill_message", + "add", + "_load_skill_payload", + "set", + "join" + ] + }, + "run_agent.py": { + "_SafeWriter.__init__": [ + "__setattr__" + ], + "_SafeWriter.write": [ + "isinstance", + "write", + "len" + ], + "_SafeWriter.flush": [ + "flush" + ], + "_SafeWriter.fileno": [ + "fileno" + ], + "_SafeWriter.isatty": [ + "isatty" + ], + "_SafeWriter.__getattr__": [ + "getattr" + ], + "_install_safe_stdio": [ + "setattr", + "isinstance", + "_SafeWriter", + "getattr" + ], + "IterationBudget.__init__": [ + "Lock" + ], + "IterationBudget.consume": [], + "IterationBudget.refund": [], + "IterationBudget.used": [], + "IterationBudget.remaining": [ + "max" + ], + "_is_destructive_command": [ + "search" + ], + "_should_parallelize_tool_batch": [ + "_paths_overlap", + "type", + "loads", + "append", + "isinstance", + "len", + "any", + "_extract_parallel_scope_path", + "debug" + ], + "_extract_parallel_scope_path": [ + "expanduser", + "strip", + "cwd", + "Path", + "get", + "str", + "isinstance", + "abspath", + "is_absolute" + ], + "_paths_overlap": [ + "min", + "bool", + "len" + ], + "_sanitize_surrogates": [ + "search", + "sub" + ], + "_sanitize_messages_surrogates": [ + "get", + "search", + "isinstance", + "sub" + ], + "_strip_budget_warnings_from_history": [ + "strip", + "loads", + "get", + "isinstance", + "sub", + "dumps" + ], + "AIAgent.base_url": [ + "lower" + ], + "AIAgent.__init__": [ + "_ghh", + "add_provider", + "append", + "resolve", + "_is_oat", + "addHandler", + "endswith", + "check_toolset_requirements", + "getLogger", + "get_tool_definitions", + "MemoryStore", + "getattr", + "create_session", + "from_global_config", + "_create_openai_client", + "_is_openrouter_url", + "IterationBudget", + "setLevel", + "float", + "mkdir", + "info", + "fetch_model_metadata", + "_load_agent_config", + "is_available", + "debug", + "_sc", + "Lock", + "_install_safe_stdio", + "any", + "basicConfig", + "items", + "initialize_all", + "dict", + "Thread", + "int", + "setdefault", + "lower", + "len", + "copilot_default_headers", + "_is_direct_openai_url", + "get_all_tool_schemas", + "sorted", + "strip", + "setFormatter", + "TodoStore", + "join", + "load_from_disk", + "get", + "list", + "now", + "update", + "get_active_profile_name", + "resolve_provider_client", + "resolve_anthropic_token", + "warning", + "RotatingFileHandler", + "print", + "RedactingFormatter", + "set", + "_lc", + "get_hermes_home", + "rstrip", + "getenv", + "str", + "uuid4", + "ContextCompressor", + "strftime", + "_MemoryManager", + "build_anthropic_client", + "Path", + "add", + "isinstance", + "upper", + "RLock", + "hasattr", + "CheckpointManager", + "start", + "RuntimeError", + "_load_mem" + ], + "AIAgent.reset_session_state": [ + "hasattr" + ], + "AIAgent._safe_print": [ + "fn" + ], + "AIAgent._vprint": [ + "_has_stream_consumers", + "getattr", + "_safe_print" + ], + "AIAgent._emit_status": [ + "status_callback", + "_vprint", + "debug" + ], + "AIAgent._is_direct_openai_url": [ + "lower" + ], + "AIAgent._is_openrouter_url": [], + "AIAgent._is_anthropic_url": [ + "endswith", + "rstrip" + ], + "AIAgent._max_tokens_param": [ + "_is_direct_openai_url" + ], + "AIAgent._has_content_after_think_block": [ + "bool", + "strip", + "_strip_think_blocks" + ], + "AIAgent._strip_think_blocks": [ + "sub" + ], + "AIAgent._looks_like_codex_intermediate_ack": [ + "strip", + "bool", + "search", + "get", + "lower", + "len", + "any", + "isinstance", + "_strip_think_blocks" + ], + "AIAgent._extract_reasoning": [ + "strip", + "findall", + "append", + "getattr", + "get", + "isinstance", + "join", + "hasattr" + ], + "AIAgent._classify_empty_content_response": [ + "strip", + "bool", + "int", + "is_local_endpoint", + "getattr", + "_extract_reasoning", + "max", + "len", + "any", + "_strip_think_blocks" + ], + "AIAgent._cleanup_task_resources": [ + "cleanup_vm", + "warning", + "cleanup_browser" + ], + "AIAgent._spawn_background_review": [ + "redirect_stderr", + "open", + "append", + "get", + "Thread", + "AIAgent", + "getattr", + "lower", + "isinstance", + "run_conversation", + "_safe_print", + "start", + "_bg_cb", + "redirect_stdout", + "loads", + "fromkeys", + "_close_openai_client", + "join", + "debug" + ], + "AIAgent._apply_persist_user_message_override": [ + "isinstance", + "get", + "len", + "getattr" + ], + "AIAgent._persist_session": [ + "_save_session_log", + "_apply_persist_user_message_override", + "_flush_messages_to_session_db" + ], + "AIAgent._flush_messages_to_session_db": [ + "append_message", + "warning", + "ensure_session", + "get", + "max", + "len", + "_apply_persist_user_message_override", + "isinstance", + "hasattr" + ], + "AIAgent._get_messages_up_to_last_assistant": [ + "get", + "len", + "copy", + "range" + ], + "AIAgent._format_tools_for_system_message": [ + "dumps", + "get", + "append" + ], + "AIAgent._convert_to_trajectory_format": [ + "strip", + "warning", + "rstrip", + "_format_tools_for_system_message", + "append", + "loads", + "get", + "startswith", + "len", + "convert_scratchpad_to_think", + "isinstance", + "dumps", + "join" + ], + "AIAgent._save_trajectory": [ + "_convert_to_trajectory_format", + "_save_trajectory_to_file" + ], + "AIAgent._summarize_api_error": [ + "strip", + "search", + "append", + "group", + "getattr", + "get", + "str", + "isinstance", + "join" + ], + "AIAgent._mask_api_key_for_logs": [ + "len" + ], + "AIAgent._clean_error_message": [ + "strip", + "startswith", + "split", + "len", + "join" + ], + "AIAgent._dump_api_request_debug": [ + "strftime", + "warning", + "now", + "_vprint", + "type", + "rstrip", + "write_text", + "env_var_enabled", + "_mask_api_key_for_logs", + "getattr", + "str", + "dumps", + "isoformat", + "deepcopy", + "pop", + "debug", + "print", + "items" + ], + "AIAgent._clean_session_content": [ + "strip", + "sub", + "convert_scratchpad_to_think" + ], + "AIAgent._save_session_log": [ + "warning", + "now", + "_clean_session_content", + "dict", + "append", + "loads", + "get", + "exists", + "read_text", + "len", + "isoformat", + "atomic_json_write", + "debug" + ], + "AIAgent.interrupt": [ + "_set_interrupt", + "interrupt", + "len", + "list", + "print", + "debug" + ], + "AIAgent.clear_interrupt": [ + "_set_interrupt" + ], + "AIAgent.shutdown_memory_provider": [ + "on_session_end", + "shutdown_all" + ], + "AIAgent._hydrate_todo_store": [ + "_set_interrupt", + "_vprint", + "loads", + "reversed", + "write", + "get", + "isinstance", + "len" + ], + "AIAgent.is_interrupted": [], + "AIAgent._build_system_prompt": [ + "strftime", + "strip", + "format_for_system_prompt", + "build_system_prompt", + "build_nous_subscription_prompt", + "build_context_files_prompt", + "replace", + "append", + "getenv", + "_hermes_now", + "build_skills_system_prompt", + "get_toolset_for_tool", + "lower", + "load_soul_md", + "any", + "isinstance", + "split", + "join" + ], + "AIAgent._get_tool_call_id_static": [ + "get", + "isinstance", + "getattr" + ], + "AIAgent._sanitize_api_messages": [ + "append", + "get", + "add", + "len", + "set", + "debug", + "_get_tool_call_id_static" + ], + "AIAgent._cap_delegate_task_calls": [ + "warning", + "sum", + "append" + ], + "AIAgent._deduplicate_tool_calls": [ + "warning", + "append", + "add", + "len", + "set" + ], + "AIAgent._repair_tool_call": [ + "replace", + "lower", + "get_close_matches" + ], + "AIAgent._invalidate_system_prompt": [ + "load_from_disk" + ], + "AIAgent._responses_tools": [ + "get", + "strip", + "append", + "isinstance" + ], + "AIAgent._deterministic_call_id": [ + "encode", + "sha256", + "hexdigest" + ], + "AIAgent._split_responses_tool_id": [ + "strip", + "startswith", + "split", + "isinstance" + ], + "AIAgent._derive_responses_function_call_id": [ + "strip", + "sha1", + "str", + "uuid4", + "startswith", + "encode", + "isinstance", + "sub", + "len", + "hexdigest" + ], + "AIAgent._chat_messages_to_responses_input": [ + "strip", + "append", + "_deterministic_call_id", + "get", + "str", + "startswith", + "isinstance", + "len", + "dumps", + "_split_responses_tool_id" + ], + "AIAgent._preflight_codex_input_items": [ + "strip", + "append", + "enumerate", + "get", + "str", + "isinstance", + "ValueError", + "dumps" + ], + "AIAgent._preflight_codex_api_kwargs": [ + "strip", + "bool", + "int", + "float", + "sorted", + "append", + "enumerate", + "_preflight_codex_input_items", + "get", + "str", + "add", + "isinstance", + "ValueError", + "keys", + "join" + ], + "AIAgent._extract_responses_message_text": [ + "strip", + "append", + "getattr", + "isinstance", + "join" + ], + "AIAgent._extract_responses_reasoning_text": [ + "strip", + "append", + "getattr", + "isinstance", + "join" + ], + "AIAgent._normalize_codex_response": [ + "strip", + "RuntimeError", + "append", + "_derive_responses_function_call_id", + "_deterministic_call_id", + "getattr", + "get", + "SimpleNamespace", + "str", + "lower", + "isinstance", + "_extract_responses_message_text", + "len", + "dumps", + "_extract_responses_reasoning_text", + "_split_responses_tool_id", + "join", + "hasattr" + ], + "AIAgent._thread_identity": [ + "current_thread" + ], + "AIAgent._client_log_context": [ + "_thread_identity", + "getattr" + ], + "AIAgent._openai_client_lock": [ + "RLock", + "getattr" + ], + "AIAgent._is_openai_client_closed": [ + "bool", + "callable", + "is_closed_attr", + "getattr", + "isinstance" + ], + "AIAgent._create_openai_client": [ + "OpenAI", + "info", + "get", + "str", + "startswith", + "_client_log_context", + "CopilotACPClient" + ], + "AIAgent._force_close_tcp_sockets": [ + "close", + "shutdown", + "getattr", + "list", + "debug" + ], + "AIAgent._close_openai_client": [ + "close", + "info", + "_force_close_tcp_sockets", + "_client_log_context", + "debug" + ], + "AIAgent._replace_primary_openai_client": [ + "warning", + "_openai_client_lock", + "getattr", + "_create_openai_client", + "_close_openai_client", + "_client_log_context" + ], + "AIAgent._ensure_primary_openai_client": [ + "warning", + "_openai_client_lock", + "RuntimeError", + "getattr", + "_replace_primary_openai_client", + "_is_openai_client_closed", + "_client_log_context" + ], + "AIAgent._cleanup_dead_connections": [ + "setblocking", + "warning", + "recv", + "getattr", + "_replace_primary_openai_client", + "list", + "debug" + ], + "AIAgent._create_request_openai_client": [ + "_openai_client_lock", + "dict", + "_ensure_primary_openai_client", + "_create_openai_client", + "isinstance" + ], + "AIAgent._close_request_openai_client": [ + "_close_openai_client" + ], + "AIAgent._run_codex_stream": [ + "_fire_reasoning_delta", + "_run_codex_create_stream_fallback", + "on_first_delta", + "_ensure_primary_openai_client", + "getattr", + "str", + "_fire_stream_delta", + "_client_log_context", + "stream", + "range", + "debug", + "get_final_response" + ], + "AIAgent._run_codex_create_stream_fallback": [ + "callable", + "dict", + "RuntimeError", + "create", + "_ensure_primary_openai_client", + "_preflight_codex_api_kwargs", + "getattr", + "get", + "isinstance", + "close_fn", + "hasattr" + ], + "AIAgent._try_refresh_codex_client_credentials": [ + "strip", + "resolve_codex_runtime_credentials", + "rstrip", + "get", + "_replace_primary_openai_client", + "isinstance", + "debug" + ], + "AIAgent._try_refresh_nous_client_credentials": [ + "strip", + "rstrip", + "int", + "float", + "getenv", + "resolve_nous_runtime_credentials", + "get", + "_replace_primary_openai_client", + "max", + "isinstance", + "pop", + "debug" + ], + "AIAgent._try_refresh_anthropic_client_credentials": [ + "strip", + "close", + "warning", + "_is_oauth_token", + "build_anthropic_client", + "getattr", + "isinstance", + "resolve_anthropic_token", + "debug", + "hasattr" + ], + "AIAgent._apply_client_headers_for_base_url": [ + "pop", + "copilot_default_headers", + "lower", + "dict" + ], + "AIAgent._swap_credential": [ + "close", + "rstrip", + "_is_oauth_token", + "build_anthropic_client", + "getattr", + "_replace_primary_openai_client", + "isinstance", + "_apply_client_headers_for_base_url" + ], + "AIAgent._recover_with_credential_pool": [ + "mark_exhausted_and_rotate", + "info", + "getattr", + "_swap_credential", + "try_refresh_current" + ], + "AIAgent._anthropic_messages_create": [ + "create", + "_try_refresh_anthropic_client_credentials" + ], + "AIAgent._interruptible_api_call": [ + "_anthropic_messages_create", + "_create_request_openai_client", + "close", + "InterruptedError", + "Thread", + "start", + "create", + "build_anthropic_client", + "getattr", + "get", + "_run_codex_stream", + "_close_request_openai_client", + "is_alive", + "join" + ], + "AIAgent._fire_stream_delta": [ + "cb", + "strip", + "getattr" + ], + "AIAgent._fire_reasoning_delta": [ + "cb" + ], + "AIAgent._fire_tool_gen_started": [ + "cb" + ], + "AIAgent._has_stream_consumers": [ + "getattr" + ], + "AIAgent._interruptible_streaming_api_call": [ + "close", + "InterruptedError", + "_call_anthropic", + "_fire_first_delta", + "create", + "getenv", + "on_first_delta", + "append", + "_try_refresh_anthropic_client_credentials", + "get", + "str", + "_close_request_openai_client", + "is_alive", + "uuid4", + "model_dump", + "any", + "time", + "_emit_status", + "Thread", + "_interruptible_api_call", + "int", + "build_anthropic_client", + "_fire_tool_gen_started", + "getattr", + "SimpleNamespace", + "Timeout", + "max", + "_fire_stream_delta", + "len", + "stream", + "_call_chat_completions", + "lower", + "stream_delta_callback", + "warning", + "type", + "sorted", + "add", + "isinstance", + "range", + "sum", + "hasattr", + "_safe_print", + "_create_request_openai_client", + "_fire_reasoning_delta", + "float", + "start", + "info", + "_replace_primary_openai_client", + "get_final_message", + "set", + "join" + ], + "AIAgent._try_activate_fallback": [ + "rstrip", + "get", + "str", + "endswith", + "_emit_status", + "_try_activate_fallback", + "resolve_provider_client", + "_is_oauth_token", + "int", + "build_anthropic_client", + "getattr", + "lower", + "len", + "get_model_context_length", + "resolve_anthropic_token", + "_is_direct_openai_url", + "warning", + "error", + "hasattr", + "strip", + "info" + ], + "AIAgent._restore_primary_runtime": [ + "warning", + "dict", + "build_anthropic_client", + "info", + "_create_openai_client" + ], + "AIAgent._try_recover_primary_transport": [ + "strip", + "warning", + "_vprint", + "dict", + "type", + "build_anthropic_client", + "getattr", + "min", + "_create_openai_client", + "lower", + "_is_openrouter_url", + "_close_openai_client", + "sleep" + ], + "AIAgent._content_has_image_parts": [ + "get", + "isinstance" + ], + "AIAgent._materialize_data_url_for_vision": [ + "strip", + "NamedTemporaryFile", + "Path", + "write", + "get", + "str", + "startswith", + "split", + "len", + "partition", + "b64decode" + ], + "AIAgent._describe_image_for_anthropic_fallback": [ + "vision_analyze_tool", + "strip", + "loads", + "get", + "str", + "exists", + "startswith", + "encode", + "isinstance", + "_materialize_data_url_for_vision", + "sha256", + "unlink", + "run", + "hexdigest" + ], + "AIAgent._preprocess_anthropic_content": [ + "strip", + "_describe_image_for_anthropic_fallback", + "append", + "get", + "str", + "isinstance", + "_content_has_image_parts", + "join" + ], + "AIAgent._prepare_anthropic_messages_for_api": [ + "get", + "str", + "isinstance", + "any", + "deepcopy", + "_content_has_image_parts", + "_preprocess_anthropic_content" + ], + "AIAgent._anthropic_preserve_dots": [ + "lower", + "getattr" + ], + "AIAgent._build_api_kwargs": [ + "getenv", + "get", + "str", + "any", + "list", + "_max_tokens_param", + "update", + "dict", + "_anthropic_preserve_dots", + "getattr", + "_responses_tools", + "lower", + "_supports_reasoning_extra_body", + "_is_openrouter_url", + "isinstance", + "strip", + "_prepare_anthropic_messages_for_api", + "float", + "_get_anthropic_max_output", + "_chat_messages_to_responses_input", + "_github_models_reasoning_extra_body", + "deepcopy", + "pop", + "build_anthropic_kwargs" + ], + "AIAgent._supports_reasoning_extra_body": [ + "bool", + "startswith", + "lower", + "any", + "github_model_reasoning_efforts" + ], + "AIAgent._github_models_reasoning_extra_body": [ + "strip", + "get", + "str", + "lower", + "isinstance", + "github_model_reasoning_efforts" + ], + "AIAgent._build_assistant_message": [ + "strip", + "bool", + "reasoning_callback", + "findall", + "_derive_responses_function_call_id", + "append", + "_deterministic_call_id", + "getattr", + "_extract_reasoning", + "model_dump", + "isinstance", + "len", + "_split_responses_tool_id", + "join", + "debug", + "hasattr" + ], + "AIAgent._sanitize_tool_calls_for_strict_api": [ + "get", + "isinstance", + "items" + ], + "AIAgent.flush_memories": [ + "_normalize_codex_response", + "_build_api_kwargs", + "create", + "append", + "_sanitize_tool_calls_for_strict_api", + "get", + "_build_ant_kwargs", + "_max_tokens_param", + "_anthropic_preserve_dots", + "getattr", + "_responses_tools", + "len", + "_call_llm", + "_nar_flush", + "_ensure_primary_openai_client", + "id", + "monotonic", + "print", + "hasattr", + "_anthropic_messages_create", + "_memory_tool", + "copy", + "loads", + "_run_codex_stream", + "pop", + "debug" + ], + "AIAgent._compress_context": [ + "end_session", + "append", + "set_session_title", + "get", + "uuid4", + "update_system_prompt", + "compress", + "strftime", + "now", + "get_next_title_in_lineage", + "_build_system_prompt", + "warning", + "format_for_injection", + "create_session", + "flush_memories", + "estimate_messages_tokens_rough", + "reset_file_dedup", + "estimate_tokens_rough", + "_invalidate_system_prompt", + "get_session_title", + "on_pre_compress", + "debug" + ], + "AIAgent._execute_tool_calls": [ + "_execute_tool_calls_concurrent", + "_execute_tool_calls_sequential", + "_should_parallelize_tool_batch" + ], + "AIAgent._invoke_tool": [ + "_memory_tool", + "handle_function_call", + "list", + "on_memory_write", + "get", + "_delegate_task", + "_todo_tool", + "handle_tool_call", + "dumps", + "has_tool", + "_session_search", + "_clarify_tool" + ], + "AIAgent._execute_tool_calls_concurrent": [ + "_invoke_tool", + "_is_destructive_command", + "getenv", + "append", + "stop", + "ThreadPoolExecutor", + "get", + "tool_progress_callback", + "get_working_dir_for_path", + "list", + "time", + "_get_budget_warning", + "keys", + "getcwd", + "_get_cute_tool_message_impl", + "min", + "len", + "warning", + "tool_start_callback", + "error", + "_detect_tool_failure", + "isinstance", + "dumps", + "sum", + "print", + "wait", + "choice", + "_safe_print", + "KawaiiSpinner", + "submit", + "start", + "loads", + "tool_complete_callback", + "enumerate", + "_build_tool_preview", + "ensure_checkpoint", + "join", + "debug" + ], + "AIAgent._execute_tool_calls_sequential": [ + "_is_destructive_command", + "getenv", + "append", + "stop", + "_delegate_task", + "get", + "_get_tool_emoji", + "tool_progress_callback", + "_todo_tool", + "get_working_dir_for_path", + "list", + "has_tool", + "_get_budget_warning", + "time", + "keys", + "getcwd", + "_get_cute_tool_message_impl", + "len", + "_session_search", + "warning", + "tool_start_callback", + "error", + "handle_function_call", + "_detect_tool_failure", + "isinstance", + "dumps", + "print", + "_clarify_tool", + "choice", + "KawaiiSpinner", + "_vprint", + "_memory_tool", + "start", + "loads", + "tool_complete_callback", + "enumerate", + "handle_tool_call", + "_build_tool_preview", + "ensure_checkpoint", + "sleep", + "debug" + ], + "AIAgent._get_budget_warning": [], + "AIAgent._emit_context_pressure": [ + "status_callback", + "format_context_pressure_gateway", + "format_context_pressure", + "debug", + "_safe_print" + ], + "AIAgent._handle_max_iterations": [ + "_nar", + "_normalize_codex_response", + "_build_api_kwargs", + "insert", + "append", + "_sanitize_tool_calls_for_strict_api", + "create", + "str", + "_max_tokens_param", + "update", + "_anthropic_preserve_dots", + "sub", + "_supports_reasoning_extra_body", + "warning", + "_ensure_primary_openai_client", + "print", + "_anthropic_messages_create", + "strip", + "_nar2", + "copy", + "_bak2", + "_bak", + "enumerate", + "_run_codex_stream", + "pop" + ], + "AIAgent.run_conversation": [ + "_has_stream_consumers", + "append", + "_sanitize_tool_calls_for_strict_api", + "_execute_tool_calls", + "should_compress", + "all", + "_repair_tool_call", + "time", + "_strip_budget_warnings_from_history", + "_save_session_log", + "_get_messages_up_to_last_assistant", + "_try_activate_fallback", + "_clean_error_message", + "getattr", + "_preflight_codex_api_kwargs", + "_cleanup_dead_connections", + "_try_recover_primary_transport", + "_build_system_prompt", + "_cap_delegate_task_calls", + "has_incomplete_scratchpad", + "_dhh_fn", + "_handle_max_iterations", + "range", + "IterationBudget", + "_vprint", + "copy", + "float", + "info", + "_client_log_context", + "_invoke_hook", + "pop", + "_deduplicate_tool_calls", + "debug", + "_install_safe_stdio", + "_normalize_codex_response", + "any", + "update_system_prompt", + "items", + "_emit_status", + "step_callback", + "_interruptible_api_call", + "int", + "_is_oauth_token", + "next", + "lower", + "len", + "sub", + "stream_delta_callback", + "queue_prefetch_all", + "get_session", + "normalize_usage", + "new_turn", + "error", + "sorted", + "clear_interrupt", + "get_next_probe_tier", + "has_items", + "_interruptible_streaming_api_call", + "estimate_messages_tokens_rough", + "_restore_primary_runtime", + "choice", + "exception", + "strip", + "KawaiiSpinner", + "vars", + "_emit_context_pressure", + "join", + "sleep", + "_summarize_api_error", + "_build_api_kwargs", + "insert", + "stop", + "get", + "list", + "update_from_response", + "_strip_think_blocks", + "env_var_enabled", + "warning", + "update_token_counts", + "type", + "_classify_empty_content_response", + "reversed", + "split", + "_persist_session", + "dumps", + "sum", + "print", + "_safe_print", + "refund", + "apply_anthropic_cache_control", + "sync_all", + "loads", + "enumerate", + "thinking_callback", + "consume", + "_build_assistant_message", + "_save_trajectory", + "frozenset", + "_compress_context", + "_try_refresh_anthropic_client_credentials", + "has_available", + "str", + "uuid4", + "tool_progress_callback", + "_hydrate_todo_store", + "min", + "_sanitize_messages_surrogates", + "_try_refresh_codex_client_credentials", + "_has_content_after_think_block", + "_looks_like_codex_intermediate_ack", + "_dump_api_request_debug", + "save_context_length", + "parse_context_limit_from_error", + "estimate_request_tokens_rough", + "isinstance", + "normalize_anthropic_response", + "_sanitize_api_messages", + "_try_refresh_nous_client_credentials", + "hasattr", + "prefetch_all", + "bool", + "_cleanup_task_resources", + "start", + "_spawn_background_review", + "estimate_usage_cost", + "startswith", + "_sanitize_surrogates", + "_recover_with_credential_pool" + ], + "AIAgent.chat": [ + "run_conversation" + ], + "main": [ + "get_toolset_info", + "open", + "append", + "str", + "uuid4", + "_convert_to_trajectory_format", + "items", + "now", + "AIAgent", + "len", + "get_all_toolsets", + "sorted", + "write", + "get_toolset_for_tool", + "split", + "run_conversation", + "dumps", + "print", + "get_all_tool_names", + "get_available_toolsets", + "strip", + "isoformat", + "join" + ] + } +} \ No newline at end of file diff --git a/docs/ouroboros/specs/AIAgent_DECOMPOSITION.md b/docs/ouroboros/specs/AIAgent_DECOMPOSITION.md new file mode 100644 index 000000000..a979f44e7 --- /dev/null +++ b/docs/ouroboros/specs/AIAgent_DECOMPOSITION.md @@ -0,0 +1,74 @@ +# AIAgent Decomposition Plan (EPIC-999 Phase II Prep) + +## Current State +`run_agent.py` contains `AIAgent` — a ~7,000-SLOC class that is the highest-blast-radius module in Hermes. + +## Goal +Decompose `AIAgent` into 5 focused classes with strict interfaces, enabling: +- Parallel rewrites by competing sub-agents (Phase II) +- Independent testing of loop semantics vs. model I/O vs. memory +- Future runtime replacement (Hermes Ω) without touching tool infrastructure + +## Proposed Decomposition + +### 1. `ConversationLoop` +**Responsibility:** Own the `while` loop invariant, iteration budget, and termination conditions. +**Interface:** +```python +class ConversationLoop: + def run(self, messages: list, tools: list, client) -> dict: + ... +``` +**Invariant:** Must terminate before `max_iterations` and `iteration_budget.remaining <= 0`. + +### 2. `ModelDispatcher` +**Responsibility:** All interaction with `client.chat.completions.create`, including streaming, fallback activation, and response normalization. +**Interface:** +```python +class ModelDispatcher: + def call(self, model: str, messages: list, tools: list, **kwargs) -> ModelResponse: + ... +``` +**Invariant:** Must always return a normalized object with `.content`, `.tool_calls`, `.reasoning`. + +### 3. `ToolExecutor` +**Responsibility:** Execute tool calls (sequential or concurrent), handle errors, and format results. +**Interface:** +```python +class ToolExecutor: + def execute(self, tool_calls: list, task_id: str = None) -> list[ToolResult]: + ... +``` +**Invariant:** Every tool_call produces exactly one ToolResult, and errors are JSON-serializable. + +### 4. `MemoryInterceptor` +**Responsibility:** Intercept `memory` and `todo` tool calls before they reach the registry, plus flush memories on session end. +**Interface:** +```python +class MemoryInterceptor: + def intercept(self, tool_name: str, args: dict, task_id: str = None) -> str | None: + ... # returns result if intercepted, None if pass-through +``` +**Invariant:** Must not mutate agent state except through explicit `flush()` calls. + +### 5. `PromptBuilder` +**Responsibility:** Assemble system prompt, inject skills, apply context compression, and manage prompt caching markers. +**Interface:** +```python +class PromptBuilder: + def build(self, user_message: str, conversation_history: list) -> list: + ... +``` +**Invariant:** Output list must start with a system message (or equivalent provider parameter). + +## Migration Path +1. Create the 5 classes as thin facades that delegate back to `AIAgent` methods. +2. Move logic incrementally from `AIAgent` into the new classes. +3. Once `AIAgent` is a pure coordinator (~500 SLOC), freeze the interface. +4. Phase II competing agents rewrite one class at a time. + +## Acceptance Criteria +- [ ] `AIAgent` reduced to < 1,000 SLOC +- [ ] Each new class has > 80% test coverage +- [ ] Full existing test suite still passes +- [ ] No behavioral regressions in shadow mode diff --git a/docs/ouroboros/specs/test_invariants_stubs.py b/docs/ouroboros/specs/test_invariants_stubs.py new file mode 100644 index 000000000..4a6af92fc --- /dev/null +++ b/docs/ouroboros/specs/test_invariants_stubs.py @@ -0,0 +1,137 @@ +""" +Property-based test stubs for Hermes core invariants. +Part of EPIC-999 Phase I — The Mirror. + +These tests define behavioral contracts that ANY rewrite of the runtime +must satisfy, including the Hermes Ω target. +""" + +import pytest +from unittest.mock import Mock, patch + + +# ----------------------------------------------------------------------------- +# Conversation Loop Invariants +# ----------------------------------------------------------------------------- + +class TestConversationLoopInvariants: + """ + Invariants for AIAgent.run_conversation and its successors. + """ + + def test_deterministic_tool_ordering(self): + """ + Given the same message history and available tools, + the agent must produce the same tool_call ordering. + + (If non-determinism is introduced by temperature > 0, + this becomes a statistical test.) + """ + pytest.skip("TODO: implement with seeded mock model responses") + + def test_tool_result_always_appended_to_history(self): + """ + After any tool_call is executed, its result MUST appear + in the conversation history before the next assistant turn. + """ + pytest.skip("TODO: mock model with forced tool_call and verify history") + + def test_iteration_budget_never_exceeded(self): + """ + The loop must terminate before api_call_count >= max_iterations + AND before iteration_budget.remaining <= 0. + """ + pytest.skip("TODO: mock model to always return tool_calls; verify termination") + + def test_system_prompt_presence(self): + """ + Every API call must include a system message as the first message + (or system parameter for providers that support it). + """ + pytest.skip("TODO: intercept all client.chat.completions.create calls") + + def test_compression_preserves_last_n_messages(self): + """ + After context compression, the final N messages (configurable, + default ~4) must remain uncompressed to preserve local context. + """ + pytest.skip("TODO: create history > threshold, compress, verify tail") + + +# ----------------------------------------------------------------------------- +# Tool Registry Invariants +# ----------------------------------------------------------------------------- + +class TestToolRegistryInvariants: + """ + Invariants for tools.registry.Registry. + """ + + def test_register_then_list_contains_tool(self): + """ + After register() is called with a valid schema and handler, + list_tools() must include the registered name. + """ + pytest.skip("TODO: instantiate fresh Registry, register, assert membership") + + def test_dispatch_unknown_tool_returns_error_json(self): + """ + Calling dispatch() with an unregistered tool name must return + a JSON string containing an error key, never raise raw. + """ + pytest.skip("TODO: call dispatch with 'nonexistent_tool', parse result") + + def test_handler_receives_task_id_kwarg(self): + """ + Registered handlers that accept **kwargs must receive task_id + when dispatch is called with one. + """ + pytest.skip("TODO: register mock handler, dispatch with task_id, verify") + + +# ----------------------------------------------------------------------------- +# State Persistence Invariants +# ----------------------------------------------------------------------------- + +class TestStatePersistenceInvariants: + """ + Invariants for hermes_state.SessionDB. + """ + + def test_saved_message_is_retrievable_by_session_id(self): + """ + After save_message(session_id, ...), get_messages(session_id) + must return the message. + """ + pytest.skip("TODO: use temp SQLite DB, save, query, assert") + + def test_fts_search_returns_relevant_messages(self): + """ + After indexing messages, FTS search for a unique keyword + must return the message containing it. + """ + pytest.skip("TODO: seed DB with messages, search unique token") + + +# ----------------------------------------------------------------------------- +# Context Compressor Invariants +# ----------------------------------------------------------------------------- + +class TestContextCompressorInvariants: + """ + Invariants for agent.context_compressor.ContextCompressor. + """ + + def test_compression_reduces_token_count(self): + """ + compress_messages(output) must have fewer tokens than + the uncompressed input (for any input > threshold). + """ + pytest.skip("TODO: mock tokenizer, provide long history, assert reduction") + + def test_compression_never_drops_system_message(self): + """ + The system message must survive compression and remain + at index 0 of the returned message list. + """ + pytest.skip("TODO: compress history with system msg, verify position")