diff --git a/a2as.yaml b/a2as.yaml new file mode 100644 index 0000000..7bc9d64 --- /dev/null +++ b/a2as.yaml @@ -0,0 +1,856 @@ +manifest: + version: "0.1.2" + schema: https://a2as.org/cert/schema + subject: + name: casonclagg/ultrawhisper + source: https://github.com/casonclagg/ultrawhisper + branch: main + commit: "3cac9c89" + scope: [src/ultrawhisper/llm/agent_service.py, src/ultrawhisper/llm/llm_service.py, src/ultrawhisper/logging_config.py, + src/ultrawhisper/ui/simple_tui.py] + issued: + by: A2AS.org + at: '2026-01-26T16:11:09Z' + signatures: + digest: sha256:ttbUNitrvtZ81RO7leTY2_RuJXqirygeOYDYsRe1WBY + key: ed25519:1-7Q6p6rl9R8biFZ_7zdlepTA6_FOKvORnU45YTFMyQ + sig: ed25519:20HzE_YiudDAKuAGBcknQr-NNEg24DjEdkm6gid9_6UZ66rHnEtM5mqhMZ0zsAUmStKSv5IY2oauDnuKDC3KCQ + +agents: + service: + type: instance + params: + name: UltraWhisper Assistant + instructions: agent_instructions + class: OpenAIAgentService + function: create_agent_service + +mcp: + server: + type: process + params: + class: MCPServerStdio + cache_tools_list: "True" + client_session_timeout_seconds: "300" + command: command + args: args + env: server_env + +imports: + Agent: agents.Agent + anthropic: anthropic + Any: typing.Any + Application: prompt_toolkit.Application + argparse: argparse + asyncio: asyncio + AudioRecorder: ultrawhisper.audio.recorder.AudioRecorder + Button: prompt_toolkit.widgets.Button + Callable: typing.Callable + Checkbox: prompt_toolkit.widgets.Checkbox + Condition: prompt_toolkit.filters.Condition + ConfigManager: ultrawhisper.config.config.ConfigManager + construct_layered_prompt: ultrawhisper.config.config.construct_layered_prompt + Container: prompt_toolkit.layout.containers.Container + ContextDetector: ultrawhisper.context.ContextDetector + create_agent_service: ultrawhisper.llm.agent_service.create_agent_service + datetime: datetime.datetime + detect_llm_providers: ultrawhisper.config.config.detect_llm_providers + Dict: typing.Dict + Dimension: prompt_toolkit.layout.dimension.Dimension + FormattedText: prompt_toolkit.formatted_text.FormattedText + FormattedTextControl: prompt_toolkit.layout.controls.FormattedTextControl + Frame: prompt_toolkit.widgets.Frame + get_ascii_height: ultrawhisper.ui.ascii_art.get_ascii_height + get_ultrawhisper_ascii_art: ultrawhisper.ui.ascii_art.get_ultrawhisper_ascii_art + HotkeyManager: ultrawhisper.ui.hotkey_manager.HotkeyManager + HSplit: prompt_toolkit.layout.containers.HSplit + interactive_setup: ultrawhisper.config.config.interactive_setup + json: json + KeyBindings: prompt_toolkit.key_binding.KeyBindings + Label: prompt_toolkit.widgets.Label + Layout: prompt_toolkit.layout.layout.Layout + List: typing.List + LLMService: ultrawhisper.llm.llm_service.LLMService + LLMServiceException: ultrawhisper.llm.llm_service.LLMServiceException + log_correction: ultrawhisper.config.config.log_correction + logger: loguru.logger + logging: logging + LogHelper: ultrawhisper.logging_config.LogHelper + MCPServerStdio: agents.mcp.MCPServerStdio + Mode: ultrawhisper.modes.mode.Mode + ModeLogger: ultrawhisper.modes.mode_logger.ModeLogger + ModeManager: ultrawhisper.modes.mode_manager.ModeManager + NotificationManager: ultrawhisper.ui.notifications.NotificationManager + OpenAI: openai.OpenAI + Optional: typing.Optional + os: os + Path: pathlib.Path + Point: prompt_toolkit.data_structures.Point + Runner: agents.Runner + ScrollbarMargin: prompt_toolkit.layout.margins.ScrollbarMargin + set_default_openai_key: agents.set_default_openai_key + SettingsComponent: ultrawhisper.ui.settings_screen.SettingsComponent + setup_logging: ultrawhisper.config.config.setup_logging + setup_loguru: ultrawhisper.logging_config.setup_loguru + SimpleUltraWhisperTUI: ultrawhisper.ui.simple_tui.SimpleUltraWhisperTUI + SQLiteSession: agents.SQLiteSession + strip_urls_for_speech: ultrawhisper.text_utils.strip_urls_for_speech + Style: prompt_toolkit.styles.Style + subprocess: subprocess + sys: sys + SystemTTSProvider: ultrawhisper.tts.system_tts.SystemTTSProvider + TextArea: prompt_toolkit.widgets.TextArea + TextCorrector: ultrawhisper.llm.text_corrector.TextCorrector + TextOutputter: ultrawhisper.ui.text_outputter.TextOutputter + threading: threading + time: time + traceback: traceback + Transcriber: ultrawhisper.transcription.whisper_transcriber.Transcriber + TranscriptionApp: ultrawhisper.app.TranscriptionApp + TTSService: ultrawhisper.tts.tts_service.TTSService + UltraWhisperConfig: models.UltraWhisperConfig + Union: typing.Union + user_config_dir: platformdirs.user_config_dir + ValidationError: pydantic.ValidationError + VSplit: prompt_toolkit.layout.containers.VSplit + WebSearchTool: agents.WebSearchTool + Window: prompt_toolkit.layout.containers.Window + yaml: yaml + +functions: + _: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [event] + __init__: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self, config_manager, on_close, application] + _cancel: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self] + _cleanup_mcp_servers_async: + type: async + module: src.ultrawhisper.llm.agent_service + args: [self] + params: + returns: None + _complete_with_anthropic: + type: sync + module: src.ultrawhisper.llm.llm_service + args: [self, messages] + params: + returns: str + _complete_with_openai_compatible: + type: sync + module: src.ultrawhisper.llm.llm_service + args: [self, messages] + params: + returns: str + _correct_with_anthropic: + type: sync + module: src.ultrawhisper.llm.llm_service + args: [self, text] + params: + returns: Dict + _correct_with_anthropic_context: + type: sync + module: src.ultrawhisper.llm.llm_service + args: [self, system_prompt] + params: + returns: Dict + _correct_with_openai_compatible: + type: sync + module: src.ultrawhisper.llm.llm_service + args: [self, text] + params: + returns: Dict + _correct_with_openai_compatible_context: + type: sync + module: src.ultrawhisper.llm.llm_service + args: [self, system_prompt] + params: + returns: Dict + _create_field_row: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self, label, widget] + params: + returns: Container + _create_main_layout: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self] + params: + returns: Layout + _create_provider_selector: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self] + params: + returns: Container + _create_settings_layout: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self] + params: + returns: Layout + _deep_merge: + type: sync + module: src.ultrawhisper.config.config + args: [self, base, updates] + params: + returns: Dict + _format_text_to_plain: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self, formatted_text] + params: + returns: str + _get_ascii_art: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self] + params: + returns: FormattedText + _get_ascii_height: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self] + params: + returns: int + _get_centered_mode_text: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self, mode_name, width] + params: + returns: str + _get_chat_text: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self] + params: + returns: FormattedText + _get_context_square: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self, app_name] + params: + returns: str + _get_context_style: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self, app_name] + params: + returns: str + _get_footer_text: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self] + params: + returns: str + _get_left_panel: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self] + _get_llm_response: + type: sync + module: src.ultrawhisper.app + args: [self, question, system_prompt, context] + params: + returns: Optional[str] + _get_log_text: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self] + params: + returns: FormattedText + _get_question_prompt: + type: sync + module: src.ultrawhisper.llm.agent_service + args: [self] + params: + returns: str + _get_status_header: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self, title] + params: + returns: FormattedText + _get_status_line_count: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self] + params: + returns: int + _get_status_text: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self] + params: + returns: FormattedText + _get_system_prompt: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self, context] + params: + returns: str + _init_fields: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self] + _init_services: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self] + _initialize_agent: + type: sync + module: src.ultrawhisper.llm.agent_service + args: [self] + params: + returns: None + _initialize_mcp_servers_async: + type: async + module: src.ultrawhisper.llm.agent_service + args: [self] + params: + returns: None + _initialize_mcp_servers_sync: + type: sync + module: src.ultrawhisper.llm.agent_service + args: [self] + params: + returns: None + _make_provider_handler: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self, provider] + _mask_api_key: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self, api_key] + params: + returns: str + _on_mode_change: + type: sync + module: src.ultrawhisper.app + args: [self, old_mode, new_mode] + params: + returns: None + _on_settings_close: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self, saved] + params: + returns: None + _open_settings: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self] + params: + returns: None + _output_text: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self, text] + _print_instructions: + type: sync + module: src.ultrawhisper.app + args: [self] + _process_question_mode: + type: sync + module: src.ultrawhisper.app + args: [self, text, context] + params: + returns: None + _process_transcription_mode: + type: sync + module: src.ultrawhisper.app + args: [self, text, context] + params: + returns: None + _save_config: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self] + _start_recording: + type: sync + module: src.ultrawhisper.app + args: [self] + _stop_recording: + type: sync + module: src.ultrawhisper.app + args: [self] + _test_connection: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self] + _validate_api_key: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self, value] + params: + returns: None + _validate_float: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self, value] + params: + returns: None + add_message: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self, message, style] + params: + returns: None + check_availability: + type: sync + module: src.ultrawhisper.llm.llm_service + args: [self] + params: + returns: bool + check_hotkey_conflicts: + type: sync + module: src.ultrawhisper.app + args: [config] + cleanup: + type: sync + module: src.ultrawhisper.llm.agent_service + args: [self] + params: + returns: None + clear_chat_history: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self] + params: + returns: None + clear_logs: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self] + params: + returns: None + clear_session: + type: sync + module: src.ultrawhisper.llm.agent_service + args: [self] + params: + returns: None + complete: + type: sync + module: src.ultrawhisper.llm.llm_service + args: [self, messages] + params: + returns: Optional[str] + config_exists: + type: sync + module: src.ultrawhisper.config.config + args: [self] + params: + returns: bool + config_loaded: + type: sync + module: src.ultrawhisper.logging_config + args: [config_path] + construct_layered_prompt: + type: sync + module: src.ultrawhisper.config.config + args: [config, context] + params: + returns: str + context_detected: + type: sync + module: src.ultrawhisper.logging_config + args: [app, title, method] + correct: + type: sync + module: src.ultrawhisper.llm.text_corrector + args: [self, text, context] + params: + returns: str + correct_text: + type: sync + module: src.ultrawhisper.llm.llm_service + args: [self, text, context] + params: + returns: Dict + create_agent_service: + type: sync + module: src.ultrawhisper.llm.agent_service + args: [config] + params: + returns: OpenAIAgentService + create_default_config: + type: sync + module: src.ultrawhisper.config.config + params: + returns: UltraWhisperConfig + create_key_bindings: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self] + params: + returns: KeyBindings + create_layout: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self] + params: + returns: Layout + create_llm_service: + type: sync + module: src.ultrawhisper.llm.llm_service + args: [config] + params: + returns: LLMService + create_new_session: + type: sync + module: src.ultrawhisper.llm.agent_service + args: [self] + params: + returns: bool + create_section_header: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [title] + params: + returns: Window + create_style: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self] + params: + returns: Style + detect_llm_providers: + type: sync + module: src.ultrawhisper.config.config + params: + returns: Dict + emit: + type: sync + module: src.ultrawhisper.logging_config + args: [self, record] + get_config_path: + type: sync + module: src.ultrawhisper.config.config + args: [self] + params: + returns: Path + get_console_format: + type: sync + module: src.ultrawhisper.logging_config + args: [verbose] + params: + returns: str + get_container: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self] + params: + returns: Container + get_file_format: + type: sync + module: src.ultrawhisper.logging_config + params: + returns: str + get_key_bindings: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self] + params: + returns: KeyBindings + get_logger: + type: sync + module: src.ultrawhisper.logging_config + args: [name] + params: + returns: Any + get_logging_status: + type: sync + module: src.ultrawhisper.logging_config + args: [config] + params: + returns: Dict + get_mcp_status: + type: sync + module: src.ultrawhisper.llm.agent_service + args: [self] + params: + returns: Dict + get_model: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self] + params: + returns: str + get_provider: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self] + params: + returns: str + get_response: + type: sync + module: src.ultrawhisper.llm.agent_service + args: [self, question, context] + params: + returns: Optional[str] + get_session_info: + type: sync + module: src.ultrawhisper.llm.agent_service + args: [self] + params: + returns: Dict + get_status_info: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self] + params: + returns: Dict + get_style_dict: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self] + params: + returns: dict + get_value: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self] + handler: + type: sync + module: src.ultrawhisper.ui.settings_screen + interactive_setup: + type: sync + module: src.ultrawhisper.config.config + params: + returns: Dict + is_available: + type: sync + module: src.ultrawhisper.llm.agent_service + args: [self] + params: + returns: bool + llm_error: + type: sync + module: src.ultrawhisper.logging_config + args: [provider, error] + llm_request: + type: sync + module: src.ultrawhisper.logging_config + args: [provider, model, url, text_length] + llm_response: + type: sync + module: src.ultrawhisper.logging_config + args: [corrected_text, duration, usage] + load_config: + type: sync + module: src.ultrawhisper.app + args: [args] + params: + returns: Dict + log_correction: + type: sync + module: src.ultrawhisper.config.config + args: [original, corrected, context, config] + params: + returns: None + main: + type: sync + module: src.ultrawhisper.ui.simple_tui + params: + returns: None + parse_arguments: + type: sync + module: src.ultrawhisper.app + params: + returns: argparse.Namespace + pattern_matched: + type: sync + module: src.ultrawhisper.logging_config + args: [pattern, prompt] + prompt_construction: + type: sync + module: src.ultrawhisper.logging_config + args: [base_length, layers, final_length] + recording_start: + type: sync + module: src.ultrawhisper.logging_config + recording_stop: + type: sync + module: src.ultrawhisper.logging_config + args: [duration] + redirect_stdlib_logging: + type: sync + module: src.ultrawhisper.logging_config + run: + type: sync + module: src.ultrawhisper.app + args: [self] + run_mcp_loop: + type: sync + module: src.ultrawhisper.llm.agent_service + save_config: + type: sync + module: src.ultrawhisper.config.config + args: [self, config] + params: + returns: None + service_status: + type: sync + module: src.ultrawhisper.logging_config + args: [service, status, details] + set_model: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self, model] + set_provider: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self, provider] + set_value: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self, value] + setup_basic_logging: + type: sync + module: src.ultrawhisper.cli + args: [verbose] + params: + returns: None + setup_component_logging: + type: sync + module: src.ultrawhisper.logging_config + args: [config, verbose] + params: + returns: None + setup_logging: + type: sync + module: src.ultrawhisper.config.config + args: [config, verbose] + params: + returns: None + setup_loguru: + type: sync + module: src.ultrawhisper.logging_config + args: [config, verbose] + params: + returns: None + show_settings_screen: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [config_manager, on_close] + test_connection: + type: sync + module: src.ultrawhisper.llm.agent_service + args: [self] + params: + returns: Dict + text_output: + type: sync + module: src.ultrawhisper.logging_config + args: [text, mode] + toggle_question_recording: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self] + toggle_recording: + type: sync + module: src.ultrawhisper.app + args: [self] + transcription_result: + type: sync + module: src.ultrawhisper.logging_config + args: [text, duration] + transcription_start: + type: sync + module: src.ultrawhisper.logging_config + args: [file_path] + update_config: + type: sync + module: src.ultrawhisper.config.config + args: [self, updates] + params: + returns: None + update_logs: + type: sync + module: src.ultrawhisper.ui.simple_tui + args: [self] + params: + returns: None + update_timer: + type: sync + module: src.ultrawhisper.ui.simple_tui + validate: + type: sync + module: src.ultrawhisper.ui.settings_screen + args: [self] + params: + returns: bool + +variables: + OPENAI_API_KEY: + type: env + params: + caller: [os.getenv] + path: [src.ultrawhisper.llm.agent_service] + +files: + audio_path: + type: variable + actions: [read] + params: + caller: [os.remove] + config.yml: + type: literal + actions: [read] + params: + caller: [__init__] + path: [self.config_dir] + config_dir: + type: literal + actions: [read] + params: + caller: [Path(user_config_dir(ultrawhisper))] + config_path: + type: variable + actions: [read] + params: + caller: [os.path.exists, open, yaml.safe_load, json.load] + file_path: + type: variable + actions: [read] + params: + caller: [Path] + log_dir: + type: variable + actions: [write] + params: + caller: [log_dir.mkdir] + log_file: + type: variable + actions: [read] + params: + caller: [Path] + +processes: + pgrep: + type: shell + actions: [exec] + args: [[i3]] + params: + caller: [subprocess.run] + shell: ["False"] + +networks: + localhost: + type: api + actions: [GET] + urls: [/v1] + protocols: [http] + ports: ["1234"] + params: + caller: [main] + links: [default]