code-muse 0.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- code_muse/__init__.py +26 -0
- code_muse/__main__.py +10 -0
- code_muse/agents/__init__.py +31 -0
- code_muse/agents/_builder.py +214 -0
- code_muse/agents/_compaction.py +506 -0
- code_muse/agents/_diagnostics.py +171 -0
- code_muse/agents/_history.py +382 -0
- code_muse/agents/_key_listeners.py +148 -0
- code_muse/agents/_non_streaming_render.py +148 -0
- code_muse/agents/_runtime.py +596 -0
- code_muse/agents/agent_creator_agent.py +603 -0
- code_muse/agents/agent_helios.py +47 -0
- code_muse/agents/agent_manager.py +740 -0
- code_muse/agents/agent_muse.py +78 -0
- code_muse/agents/agent_planning.py +44 -0
- code_muse/agents/agent_qa_melpomene.py +207 -0
- code_muse/agents/base_agent.py +194 -0
- code_muse/agents/event_stream_handler.py +361 -0
- code_muse/agents/json_agent.py +201 -0
- code_muse/agents/prompt_v3.py +521 -0
- code_muse/agents/subagent_stream_handler.py +273 -0
- code_muse/callbacks.py +941 -0
- code_muse/chatgpt_codex_client.py +333 -0
- code_muse/claude_cache_client.py +853 -0
- code_muse/cli_runner/__init__.py +319 -0
- code_muse/cli_runner/args.py +63 -0
- code_muse/cli_runner/loop.py +510 -0
- code_muse/cli_runner/resume.py +72 -0
- code_muse/cli_runner/runner.py +161 -0
- code_muse/command_line/__init__.py +1 -0
- code_muse/command_line/add_model_menu.py +1331 -0
- code_muse/command_line/agent_menu.py +674 -0
- code_muse/command_line/attachments.py +397 -0
- code_muse/command_line/autosave_menu.py +709 -0
- code_muse/command_line/clipboard.py +528 -0
- code_muse/command_line/colors_menu.py +530 -0
- code_muse/command_line/command_handler.py +262 -0
- code_muse/command_line/command_registry.py +150 -0
- code_muse/command_line/config_commands.py +711 -0
- code_muse/command_line/core_commands.py +740 -0
- code_muse/command_line/diff_menu.py +865 -0
- code_muse/command_line/file_path_completion.py +73 -0
- code_muse/command_line/load_context_completion.py +57 -0
- code_muse/command_line/model_picker_completion.py +512 -0
- code_muse/command_line/model_settings_menu.py +983 -0
- code_muse/command_line/onboarding_slides.py +162 -0
- code_muse/command_line/onboarding_wizard.py +337 -0
- code_muse/command_line/pagination.py +41 -0
- code_muse/command_line/pin_command_completion.py +329 -0
- code_muse/command_line/prompt_toolkit_completion.py +886 -0
- code_muse/command_line/session_commands.py +304 -0
- code_muse/command_line/shell_passthrough.py +145 -0
- code_muse/command_line/skills_completion.py +158 -0
- code_muse/command_line/types.py +18 -0
- code_muse/command_line/uc_menu.py +908 -0
- code_muse/command_line/utils.py +105 -0
- code_muse/command_line/wiggum_state.py +77 -0
- code_muse/config.py +1138 -0
- code_muse/config_agent.py +168 -0
- code_muse/config_appearance.py +241 -0
- code_muse/config_model.py +357 -0
- code_muse/config_security.py +73 -0
- code_muse/error_logging.py +132 -0
- code_muse/evals/__init__.py +35 -0
- code_muse/evals/eval_helpers.py +81 -0
- code_muse/evals/eval_runner.py +299 -0
- code_muse/evals/sample_evals/__init__.py +1 -0
- code_muse/evals/sample_evals/eval_frugal_reads.py +59 -0
- code_muse/evals/sample_evals/eval_memory_planning.py +31 -0
- code_muse/evals/sample_evals/eval_shell_efficiency.py +39 -0
- code_muse/evals/sample_evals/eval_tool_masking.py +33 -0
- code_muse/fs_scan_cache/__init__.py +31 -0
- code_muse/fs_scan_cache/invalidation_hooks.py +89 -0
- code_muse/fs_scan_cache/scan_cache_core.cpython-314-darwin.so +0 -0
- code_muse/fs_scan_cache/scan_cache_core.pyx +203 -0
- code_muse/fs_scan_cache/tool_integration.py +309 -0
- code_muse/fs_scan_cache/ttl_policy.py +44 -0
- code_muse/gemini_code_assist.py +383 -0
- code_muse/gemini_model.py +838 -0
- code_muse/hook_engine/README.md +105 -0
- code_muse/hook_engine/__init__.py +21 -0
- code_muse/hook_engine/aliases.py +153 -0
- code_muse/hook_engine/engine.py +221 -0
- code_muse/hook_engine/executor.py +347 -0
- code_muse/hook_engine/matcher.py +154 -0
- code_muse/hook_engine/models.py +245 -0
- code_muse/hook_engine/registry.py +114 -0
- code_muse/hook_engine/trust.py +268 -0
- code_muse/hook_engine/validator.py +144 -0
- code_muse/http_utils.py +360 -0
- code_muse/keymap.py +128 -0
- code_muse/list_filtering.py +26 -0
- code_muse/main.py +10 -0
- code_muse/messaging/__init__.py +259 -0
- code_muse/messaging/bus.py +621 -0
- code_muse/messaging/commands.py +166 -0
- code_muse/messaging/markdown_patches.py +57 -0
- code_muse/messaging/message_queue.py +397 -0
- code_muse/messaging/messages.py +591 -0
- code_muse/messaging/queue_console.py +269 -0
- code_muse/messaging/renderers.py +308 -0
- code_muse/messaging/rich_renderer.py +1158 -0
- code_muse/messaging/shimmer.py +154 -0
- code_muse/messaging/spinner/__init__.py +87 -0
- code_muse/messaging/spinner/console_spinner.py +250 -0
- code_muse/messaging/spinner/spinner_base.py +82 -0
- code_muse/messaging/subagent_console.py +458 -0
- code_muse/model_factory.py +1203 -0
- code_muse/model_switching.py +59 -0
- code_muse/model_utils.py +156 -0
- code_muse/models.json +66 -0
- code_muse/models_cache/__init__.py +26 -0
- code_muse/models_cache/blocking_lru_cache.py +98 -0
- code_muse/models_cache/cache_writer.py +86 -0
- code_muse/models_cache/sha256_hash.cpython-314-darwin.so +0 -0
- code_muse/models_cache/sha256_hash.pyx +34 -0
- code_muse/models_cache/startup_integration.py +75 -0
- code_muse/models_dev_api.json +1 -0
- code_muse/models_dev_parser.py +590 -0
- code_muse/motion.py +126 -0
- code_muse/plugins/__init__.py +471 -0
- code_muse/plugins/agent_skills/__init__.py +32 -0
- code_muse/plugins/agent_skills/config.py +176 -0
- code_muse/plugins/agent_skills/discovery.py +309 -0
- code_muse/plugins/agent_skills/downloader.py +389 -0
- code_muse/plugins/agent_skills/installer.py +19 -0
- code_muse/plugins/agent_skills/metadata.py +293 -0
- code_muse/plugins/agent_skills/prompt_builder.py +66 -0
- code_muse/plugins/agent_skills/register_callbacks.py +298 -0
- code_muse/plugins/agent_skills/remote_catalog.py +320 -0
- code_muse/plugins/agent_skills/skill_catalog.py +254 -0
- code_muse/plugins/agent_skills/skills_install_menu.py +690 -0
- code_muse/plugins/agent_skills/skills_menu.py +791 -0
- code_muse/plugins/autonomous_memory/__init__.py +39 -0
- code_muse/plugins/autonomous_memory/bm25_scorer.cpython-314-darwin.so +0 -0
- code_muse/plugins/autonomous_memory/bm25_scorer.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/plugins/autonomous_memory/bm25_scorer.pyx +291 -0
- code_muse/plugins/autonomous_memory/consolidation.py +82 -0
- code_muse/plugins/autonomous_memory/extraction.py +382 -0
- code_muse/plugins/autonomous_memory/lease_lock.py +105 -0
- code_muse/plugins/autonomous_memory/memory_injection.py +59 -0
- code_muse/plugins/autonomous_memory/register_callbacks.py +268 -0
- code_muse/plugins/autonomous_memory/secret_scanner.py +62 -0
- code_muse/plugins/autonomous_memory/session_scanner.py +163 -0
- code_muse/plugins/aws_bedrock/__init__.py +14 -0
- code_muse/plugins/aws_bedrock/config.py +99 -0
- code_muse/plugins/aws_bedrock/register_callbacks.py +241 -0
- code_muse/plugins/aws_bedrock/utils.py +153 -0
- code_muse/plugins/azure_foundry/README.md +238 -0
- code_muse/plugins/azure_foundry/__init__.py +15 -0
- code_muse/plugins/azure_foundry/config.py +125 -0
- code_muse/plugins/azure_foundry/discovery.py +187 -0
- code_muse/plugins/azure_foundry/register_callbacks.py +495 -0
- code_muse/plugins/azure_foundry/token.py +180 -0
- code_muse/plugins/azure_foundry/utils.py +345 -0
- code_muse/plugins/build_filter/__init__.py +1 -0
- code_muse/plugins/build_filter/register_callbacks.py +201 -0
- code_muse/plugins/build_filter/strategies/__init__.py +1 -0
- code_muse/plugins/build_filter/strategies/build.py +397 -0
- code_muse/plugins/chatgpt_oauth/__init__.py +6 -0
- code_muse/plugins/chatgpt_oauth/config.py +52 -0
- code_muse/plugins/chatgpt_oauth/oauth_flow.py +338 -0
- code_muse/plugins/chatgpt_oauth/register_callbacks.py +172 -0
- code_muse/plugins/chatgpt_oauth/test_plugin.py +301 -0
- code_muse/plugins/chatgpt_oauth/utils.py +538 -0
- code_muse/plugins/checkpointing/__init__.py +29 -0
- code_muse/plugins/checkpointing/checkpoint_hook.py +51 -0
- code_muse/plugins/checkpointing/conversation_snapshots.py +117 -0
- code_muse/plugins/checkpointing/register_callbacks.py +51 -0
- code_muse/plugins/checkpointing/restore_command.py +263 -0
- code_muse/plugins/checkpointing/rewind_shortcut.py +88 -0
- code_muse/plugins/checkpointing/shadow_git.py +90 -0
- code_muse/plugins/claude_code_hooks/__init__.py +1 -0
- code_muse/plugins/claude_code_hooks/config.py +188 -0
- code_muse/plugins/claude_code_hooks/register_callbacks.py +208 -0
- code_muse/plugins/claude_code_oauth/README.md +167 -0
- code_muse/plugins/claude_code_oauth/SETUP.md +93 -0
- code_muse/plugins/claude_code_oauth/__init__.py +25 -0
- code_muse/plugins/claude_code_oauth/config.py +52 -0
- code_muse/plugins/claude_code_oauth/fast_mode.py +124 -0
- code_muse/plugins/claude_code_oauth/prompt_handler.py +63 -0
- code_muse/plugins/claude_code_oauth/register_callbacks.py +547 -0
- code_muse/plugins/claude_code_oauth/test_fast_mode.py +165 -0
- code_muse/plugins/claude_code_oauth/test_plugin.py +283 -0
- code_muse/plugins/claude_code_oauth/token_refresh_heartbeat.py +237 -0
- code_muse/plugins/claude_code_oauth/utils.py +664 -0
- code_muse/plugins/copilot_auth/__init__.py +11 -0
- code_muse/plugins/copilot_auth/config.py +91 -0
- code_muse/plugins/copilot_auth/reasoning_client.py +409 -0
- code_muse/plugins/copilot_auth/register_callbacks.py +461 -0
- code_muse/plugins/copilot_auth/utils.py +584 -0
- code_muse/plugins/custom_commands/__init__.py +14 -0
- code_muse/plugins/custom_commands/args_injection.py +82 -0
- code_muse/plugins/custom_commands/command_discovery.py +89 -0
- code_muse/plugins/custom_commands/command_toml_schema.py +71 -0
- code_muse/plugins/custom_commands/register_callbacks.py +176 -0
- code_muse/plugins/customizable_commands/__init__.py +0 -0
- code_muse/plugins/customizable_commands/register_callbacks.py +136 -0
- code_muse/plugins/destructive_command_guard/__init__.py +14 -0
- code_muse/plugins/destructive_command_guard/detector.py +375 -0
- code_muse/plugins/destructive_command_guard/register_callbacks.py +148 -0
- code_muse/plugins/example_custom_command/README.md +280 -0
- code_muse/plugins/example_custom_command/register_callbacks.py +51 -0
- code_muse/plugins/file_permission_handler/__init__.py +4 -0
- code_muse/plugins/file_permission_handler/register_callbacks.py +441 -0
- code_muse/plugins/filter_engine/__init__.py +30 -0
- code_muse/plugins/filter_engine/classifier.py +153 -0
- code_muse/plugins/filter_engine/content_detector.py +184 -0
- code_muse/plugins/filter_engine/dispatcher.py +244 -0
- code_muse/plugins/filter_engine/register_callbacks.py +188 -0
- code_muse/plugins/filter_engine/registry.py +279 -0
- code_muse/plugins/filter_engine/strategies/__init__.py +8 -0
- code_muse/plugins/filter_engine/strategies/ast_compressor.cpython-314-darwin.so +0 -0
- code_muse/plugins/filter_engine/strategies/ast_compressor.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/plugins/filter_engine/strategies/ast_compressor.pyx +348 -0
- code_muse/plugins/filter_engine/strategies/ast_parser.py +167 -0
- code_muse/plugins/filter_engine/strategies/code.cpython-314-darwin.so +0 -0
- code_muse/plugins/filter_engine/strategies/code.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/plugins/filter_engine/strategies/code.pyx +584 -0
- code_muse/plugins/filter_engine/strategies/git.cpython-314-darwin.so +0 -0
- code_muse/plugins/filter_engine/strategies/git.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/plugins/filter_engine/strategies/git.pyx +438 -0
- code_muse/plugins/filter_engine/strategies/json_compressor.cpython-314-darwin.so +0 -0
- code_muse/plugins/filter_engine/strategies/json_compressor.pyx +253 -0
- code_muse/plugins/filter_engine/strategies/json_patterns.cpython-314-darwin.so +0 -0
- code_muse/plugins/filter_engine/strategies/json_patterns.pyx +178 -0
- code_muse/plugins/filter_engine/strategies/lint.cpython-314-darwin.so +0 -0
- code_muse/plugins/filter_engine/strategies/lint.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/plugins/filter_engine/strategies/lint.pyx +626 -0
- code_muse/plugins/filter_engine/strategies/test.cpython-314-darwin.so +0 -0
- code_muse/plugins/filter_engine/strategies/test.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/plugins/filter_engine/strategies/test.pyx +431 -0
- code_muse/plugins/filter_engine/verbosity.py +63 -0
- code_muse/plugins/force_push_guard/__init__.py +5 -0
- code_muse/plugins/force_push_guard/detector.py +96 -0
- code_muse/plugins/force_push_guard/register_callbacks.py +144 -0
- code_muse/plugins/force_push_guard/test_detector.py +143 -0
- code_muse/plugins/frontend_emitter/__init__.py +25 -0
- code_muse/plugins/frontend_emitter/emitter.py +121 -0
- code_muse/plugins/frontend_emitter/register_callbacks.py +259 -0
- code_muse/plugins/gac/__init__.py +4 -0
- code_muse/plugins/gac/git_ops.py +136 -0
- code_muse/plugins/gac/prompt.py +191 -0
- code_muse/plugins/gac/register_callbacks.py +82 -0
- code_muse/plugins/hook_creator/__init__.py +1 -0
- code_muse/plugins/hook_creator/register_callbacks.py +34 -0
- code_muse/plugins/hook_manager/__init__.py +1 -0
- code_muse/plugins/hook_manager/config.py +289 -0
- code_muse/plugins/hook_manager/hooks_menu.py +563 -0
- code_muse/plugins/hook_manager/register_callbacks.py +227 -0
- code_muse/plugins/hook_monitor/register_callbacks.py +36 -0
- code_muse/plugins/mindpack/__init__.py +0 -0
- code_muse/plugins/mindpack/factory.py +930 -0
- code_muse/plugins/mindpack/judge.py +573 -0
- code_muse/plugins/mindpack/memory.py +100 -0
- code_muse/plugins/mindpack/mindpack_menu.py +1552 -0
- code_muse/plugins/mindpack/orchestration.py +605 -0
- code_muse/plugins/mindpack/register_callbacks.py +175 -0
- code_muse/plugins/mindpack/schemas.py +358 -0
- code_muse/plugins/mindpack/tools.py +387 -0
- code_muse/plugins/oauth_muse_html.py +226 -0
- code_muse/plugins/ollama_setup/__init__.py +5 -0
- code_muse/plugins/ollama_setup/completer.py +36 -0
- code_muse/plugins/ollama_setup/register_callbacks.py +410 -0
- code_muse/plugins/plan_command/__init__.py +0 -0
- code_muse/plugins/plan_command/register_callbacks.py +206 -0
- code_muse/plugins/plan_mode/__init__.py +37 -0
- code_muse/plugins/plan_mode/mode_cycling.py +40 -0
- code_muse/plugins/plan_mode/plan_generation.py +68 -0
- code_muse/plugins/plan_mode/plan_hooks.py +74 -0
- code_muse/plugins/plan_mode/plan_mode_tools.py +138 -0
- code_muse/plugins/plan_mode/register_callbacks.py +121 -0
- code_muse/plugins/plugin_trust/register_callbacks.py +140 -0
- code_muse/plugins/policy_engine/__init__.py +46 -0
- code_muse/plugins/policy_engine/approval_flow_integration.py +59 -0
- code_muse/plugins/policy_engine/policy_evaluator.py +75 -0
- code_muse/plugins/policy_engine/policy_file_discovery.py +90 -0
- code_muse/plugins/policy_engine/policy_toml_schema.py +115 -0
- code_muse/plugins/policy_engine/register_callbacks.py +112 -0
- code_muse/plugins/pop_command/__init__.py +1 -0
- code_muse/plugins/pop_command/register_callbacks.py +189 -0
- code_muse/plugins/prompt_newline/__init__.py +13 -0
- code_muse/plugins/prompt_newline/config.py +19 -0
- code_muse/plugins/prompt_newline/register_callbacks.py +159 -0
- code_muse/plugins/safety_status/__init__.py +0 -0
- code_muse/plugins/safety_status/register_callbacks.py +113 -0
- code_muse/plugins/semantic_compression/__init__.py +6 -0
- code_muse/plugins/semantic_compression/compressor.py +295 -0
- code_muse/plugins/semantic_compression/config.py +123 -0
- code_muse/plugins/semantic_compression/register_callbacks.py +320 -0
- code_muse/plugins/shell_minimizer/__init__.py +50 -0
- code_muse/plugins/shell_minimizer/builtin_filters.toml +393 -0
- code_muse/plugins/shell_minimizer/pipeline.py +556 -0
- code_muse/plugins/shell_minimizer/primitives.py +482 -0
- code_muse/plugins/shell_minimizer/register_callbacks.py +276 -0
- code_muse/plugins/shell_safety/__init__.py +6 -0
- code_muse/plugins/shell_safety/agent_shell_safety.py +69 -0
- code_muse/plugins/shell_safety/command_cache.py +149 -0
- code_muse/plugins/shell_safety/register_callbacks.py +202 -0
- code_muse/plugins/synthetic_status/__init__.py +1 -0
- code_muse/plugins/synthetic_status/register_callbacks.py +128 -0
- code_muse/plugins/synthetic_status/status_api.py +145 -0
- code_muse/plugins/token_caching/__init__.py +21 -0
- code_muse/plugins/token_caching/cache_hit_tracking.py +128 -0
- code_muse/plugins/token_caching/cacheable_prefix_detection.py +28 -0
- code_muse/plugins/token_caching/register_callbacks.py +54 -0
- code_muse/plugins/token_caching/stats_display.py +35 -0
- code_muse/plugins/token_tracking/__init__.py +26 -0
- code_muse/plugins/token_tracking/database.py +381 -0
- code_muse/plugins/token_tracking/edit_analyzer.py +97 -0
- code_muse/plugins/token_tracking/record.py +55 -0
- code_muse/plugins/token_tracking/register_callbacks.py +277 -0
- code_muse/plugins/token_tracking/reports.py +329 -0
- code_muse/plugins/universal_constructor/__init__.py +13 -0
- code_muse/plugins/universal_constructor/models.py +136 -0
- code_muse/plugins/universal_constructor/register_callbacks.py +47 -0
- code_muse/plugins/universal_constructor/registry.py +390 -0
- code_muse/plugins/universal_constructor/runner.py +474 -0
- code_muse/plugins/universal_constructor/safety.py +440 -0
- code_muse/plugins/universal_constructor/sandbox.py +584 -0
- code_muse/provider_identity.py +105 -0
- code_muse/pydantic_patches.py +410 -0
- code_muse/reopenable_async_client.py +233 -0
- code_muse/round_robin_model.py +151 -0
- code_muse/secret_storage.py +74 -0
- code_muse/security/__init__.py +1 -0
- code_muse/security/redaction.cpython-314-darwin.so +0 -0
- code_muse/security/redaction.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/security/redaction.pyx +135 -0
- code_muse/session_storage.py +565 -0
- code_muse/status_display.py +261 -0
- code_muse/stream_parser/__init__.py +76 -0
- code_muse/stream_parser/assistant_text_parser.py +90 -0
- code_muse/stream_parser/citation_parser.py +76 -0
- code_muse/stream_parser/inline_hidden_tag_parser.py +236 -0
- code_muse/stream_parser/proposed_plan_parser.py +158 -0
- code_muse/stream_parser/stream_text_chunk.py +23 -0
- code_muse/stream_parser/stream_text_parser.py +27 -0
- code_muse/stream_parser/tagged_line_parser.cpython-314-darwin.so +0 -0
- code_muse/stream_parser/tagged_line_parser.pyx +251 -0
- code_muse/stream_parser/utf8_stream_parser.cpython-314-darwin.so +0 -0
- code_muse/stream_parser/utf8_stream_parser.pyx +206 -0
- code_muse/summarization_agent.py +308 -0
- code_muse/terminal_utils.cpython-314-darwin.so +0 -0
- code_muse/terminal_utils.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/terminal_utils.pyx +483 -0
- code_muse/tools/__init__.py +459 -0
- code_muse/tools/agent_tools.py +613 -0
- code_muse/tools/ask_user_question/__init__.py +26 -0
- code_muse/tools/ask_user_question/constants.py +73 -0
- code_muse/tools/ask_user_question/demo_tui.py +55 -0
- code_muse/tools/ask_user_question/handler.py +232 -0
- code_muse/tools/ask_user_question/models.py +302 -0
- code_muse/tools/ask_user_question/registration.py +37 -0
- code_muse/tools/ask_user_question/renderers.py +336 -0
- code_muse/tools/ask_user_question/terminal_ui.py +327 -0
- code_muse/tools/ask_user_question/theme.py +156 -0
- code_muse/tools/ask_user_question/tui_loop.py +422 -0
- code_muse/tools/background_jobs.py +99 -0
- code_muse/tools/browser/__init__.py +37 -0
- code_muse/tools/browser/browser_control.py +289 -0
- code_muse/tools/browser/browser_interactions.py +545 -0
- code_muse/tools/browser/browser_locators.py +640 -0
- code_muse/tools/browser/browser_manager.py +376 -0
- code_muse/tools/browser/browser_navigation.py +251 -0
- code_muse/tools/browser/browser_screenshot.py +180 -0
- code_muse/tools/browser/browser_scripts.py +462 -0
- code_muse/tools/browser/browser_workflows.py +222 -0
- code_muse/tools/chrome_cdp/__init__.py +1070 -0
- code_muse/tools/chrome_cdp/register_callbacks.py +61 -0
- code_muse/tools/command_runner.py +1401 -0
- code_muse/tools/common.py +1407 -0
- code_muse/tools/display.py +87 -0
- code_muse/tools/file_modifications.py +1099 -0
- code_muse/tools/file_operations.py +860 -0
- code_muse/tools/image_tools.py +185 -0
- code_muse/tools/meetin_proxy/__init__.py +243 -0
- code_muse/tools/meetin_proxy/capture_addon.py +82 -0
- code_muse/tools/meetin_proxy/proxy_manager.py +326 -0
- code_muse/tools/meetin_proxy/register_callbacks.py +45 -0
- code_muse/tools/path_policy.py +219 -0
- code_muse/tools/skills_tools.py +586 -0
- code_muse/tools/subagent_context.py +158 -0
- code_muse/tools/tools_content.py +50 -0
- code_muse/tools/universal_constructor.py +965 -0
- code_muse/uvx_detection.py +241 -0
- code_muse/version_checker.py +86 -0
- code_muse-0.0.1.data/data/code_muse/models.json +66 -0
- code_muse-0.0.1.data/data/code_muse/models_dev_api.json +1 -0
- code_muse-0.0.1.dist-info/METADATA +845 -0
- code_muse-0.0.1.dist-info/RECORD +394 -0
- code_muse-0.0.1.dist-info/WHEEL +4 -0
- code_muse-0.0.1.dist-info/entry_points.txt +2 -0
- code_muse-0.0.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"""Muse — The default code generation agent."""
|
|
2
|
+
|
|
3
|
+
from code_muse.config import get_owner_name, get_agent_name
|
|
4
|
+
|
|
5
|
+
from .base_agent import BaseAgent
|
|
6
|
+
from .prompt_v3 import autonomy_base_prompt, muse_overlay, repository_addendum
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class MuseAgent(BaseAgent):
|
|
10
|
+
"""Muse — The default creative coding agent."""
|
|
11
|
+
|
|
12
|
+
@property
|
|
13
|
+
def name(self) -> str:
|
|
14
|
+
return "muse"
|
|
15
|
+
|
|
16
|
+
@property
|
|
17
|
+
def display_name(self) -> str:
|
|
18
|
+
return "Muse"
|
|
19
|
+
|
|
20
|
+
@property
|
|
21
|
+
def description(self) -> str:
|
|
22
|
+
return "The creative coding companion, illuminating all software tasks"
|
|
23
|
+
|
|
24
|
+
def get_available_tools(self) -> list[str]:
|
|
25
|
+
"""Get the list of tools available to Muse."""
|
|
26
|
+
return [
|
|
27
|
+
"list_agents",
|
|
28
|
+
"invoke_agent",
|
|
29
|
+
"list_files",
|
|
30
|
+
"read_file",
|
|
31
|
+
"grep",
|
|
32
|
+
"create_file",
|
|
33
|
+
"replace_in_file",
|
|
34
|
+
"delete_snippet",
|
|
35
|
+
"delete_file",
|
|
36
|
+
"agent_run_shell_command",
|
|
37
|
+
"ask_user_question",
|
|
38
|
+
"chrome_cdp",
|
|
39
|
+
"activate_skill",
|
|
40
|
+
"list_or_search_skills",
|
|
41
|
+
"load_image_for_analysis",
|
|
42
|
+
"mitmproxy",
|
|
43
|
+
]
|
|
44
|
+
|
|
45
|
+
def _get_reasoning_prompt_sections(self) -> dict[str, str]:
|
|
46
|
+
"""Return prompt sections describing the expected think-act loop."""
|
|
47
|
+
return {
|
|
48
|
+
"pre_tool_rule": (
|
|
49
|
+
"- Before major tool use, think through your approach "
|
|
50
|
+
"and planned next steps"
|
|
51
|
+
),
|
|
52
|
+
"loop_rule": (
|
|
53
|
+
"- You're encouraged to loop between reasoning, file "
|
|
54
|
+
"tools, and run_shell_command to test output in order "
|
|
55
|
+
"to write programs"
|
|
56
|
+
),
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
def get_system_prompt(self) -> str:
|
|
60
|
+
"""Get Muse's full system prompt — v3 architecture."""
|
|
61
|
+
agent_name = get_agent_name()
|
|
62
|
+
owner_name = get_owner_name()
|
|
63
|
+
r = self._get_reasoning_prompt_sections()
|
|
64
|
+
|
|
65
|
+
result = (
|
|
66
|
+
autonomy_base_prompt()
|
|
67
|
+
+ "\n\n"
|
|
68
|
+
+ muse_overlay(agent_name, owner_name)
|
|
69
|
+
+ "\n\n"
|
|
70
|
+
+ repository_addendum()
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
# Reasoning prompt sections (pre_tool_rule, loop_rule) come after overlays
|
|
74
|
+
if r:
|
|
75
|
+
result += "\n" + r.get("pre_tool_rule", "")
|
|
76
|
+
result += "\n" + r.get("loop_rule", "")
|
|
77
|
+
|
|
78
|
+
return result
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""Planning Agent - Breaks down complex tasks into actionable steps with strategic roadmapping."""
|
|
2
|
+
|
|
3
|
+
from code_muse.config import get_agent_name
|
|
4
|
+
|
|
5
|
+
from .base_agent import BaseAgent
|
|
6
|
+
from .prompt_v3 import autonomy_base_prompt, planning_overlay
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class PlanningAgent(BaseAgent):
|
|
10
|
+
"""Planning Agent - Analyzes requirements and creates detailed execution plans."""
|
|
11
|
+
|
|
12
|
+
@property
|
|
13
|
+
def name(self) -> str:
|
|
14
|
+
return "planning-agent"
|
|
15
|
+
|
|
16
|
+
@property
|
|
17
|
+
def display_name(self) -> str:
|
|
18
|
+
return "Planning Agent 📋"
|
|
19
|
+
|
|
20
|
+
@property
|
|
21
|
+
def description(self) -> str:
|
|
22
|
+
return (
|
|
23
|
+
"Breaks down complex coding tasks into clear, actionable steps. "
|
|
24
|
+
"Analyzes project structure, identifies dependencies, and creates execution roadmaps."
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
def get_available_tools(self) -> list[str]:
|
|
28
|
+
"""Get the list of tools available to the Planning Agent."""
|
|
29
|
+
return [
|
|
30
|
+
"list_files",
|
|
31
|
+
"read_file",
|
|
32
|
+
"grep",
|
|
33
|
+
"ask_user_question",
|
|
34
|
+
"list_agents",
|
|
35
|
+
"invoke_agent",
|
|
36
|
+
"list_or_search_skills",
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
def get_system_prompt(self) -> str:
|
|
40
|
+
"""Get the Planning Agent's system prompt — v3 architecture."""
|
|
41
|
+
agent_name = get_agent_name()
|
|
42
|
+
|
|
43
|
+
result = autonomy_base_prompt() + "\n\n" + planning_overlay(agent_name)
|
|
44
|
+
return result
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"""QA Melpomene — Playwright-powered browser automation agent."""
|
|
2
|
+
|
|
3
|
+
from .base_agent import BaseAgent
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class QualityAssuranceMelpomeneAgent(BaseAgent):
|
|
7
|
+
"""QA Melpomene — Advanced browser automation with Playwright."""
|
|
8
|
+
|
|
9
|
+
@property
|
|
10
|
+
def name(self) -> str:
|
|
11
|
+
return "qa-melpomene"
|
|
12
|
+
|
|
13
|
+
@property
|
|
14
|
+
def display_name(self) -> str:
|
|
15
|
+
return "QA Melpomene"
|
|
16
|
+
|
|
17
|
+
@property
|
|
18
|
+
def description(self) -> str:
|
|
19
|
+
return "Advanced web browser automation and quality assurance testing using Playwright with visual analysis capabilities"
|
|
20
|
+
|
|
21
|
+
def get_available_tools(self) -> list[str]:
|
|
22
|
+
"""Get the list of tools available to QA Melpomene."""
|
|
23
|
+
return [
|
|
24
|
+
# Core agent tools
|
|
25
|
+
# Browser control and initialization
|
|
26
|
+
"browser_initialize",
|
|
27
|
+
"browser_close",
|
|
28
|
+
"browser_status",
|
|
29
|
+
"browser_new_page",
|
|
30
|
+
"browser_list_pages",
|
|
31
|
+
# Browser navigation
|
|
32
|
+
"browser_navigate",
|
|
33
|
+
"browser_get_page_info",
|
|
34
|
+
"browser_go_back",
|
|
35
|
+
"browser_go_forward",
|
|
36
|
+
"browser_reload",
|
|
37
|
+
"browser_wait_for_load",
|
|
38
|
+
# Element discovery (semantic locators preferred)
|
|
39
|
+
"browser_find_by_role",
|
|
40
|
+
"browser_find_by_text",
|
|
41
|
+
"browser_find_by_label",
|
|
42
|
+
"browser_find_by_placeholder",
|
|
43
|
+
"browser_find_by_test_id",
|
|
44
|
+
"browser_find_buttons",
|
|
45
|
+
"browser_find_links",
|
|
46
|
+
"browser_xpath_query", # Fallback when semantic locators fail
|
|
47
|
+
# Element interactions
|
|
48
|
+
"browser_click",
|
|
49
|
+
"browser_double_click",
|
|
50
|
+
"browser_hover",
|
|
51
|
+
"browser_set_text",
|
|
52
|
+
"browser_get_text",
|
|
53
|
+
"browser_get_value",
|
|
54
|
+
"browser_select_option",
|
|
55
|
+
"browser_check",
|
|
56
|
+
"browser_uncheck",
|
|
57
|
+
# Advanced features
|
|
58
|
+
"browser_execute_js",
|
|
59
|
+
"browser_scroll",
|
|
60
|
+
"browser_scroll_to_element",
|
|
61
|
+
"browser_set_viewport",
|
|
62
|
+
"browser_wait_for_element",
|
|
63
|
+
"browser_highlight_element",
|
|
64
|
+
"browser_clear_highlights",
|
|
65
|
+
# Screenshots (returns BinaryContent for direct visual analysis)
|
|
66
|
+
"browser_screenshot_analyze",
|
|
67
|
+
"load_image_for_analysis",
|
|
68
|
+
# Workflow management
|
|
69
|
+
"browser_save_workflow",
|
|
70
|
+
"browser_list_workflows",
|
|
71
|
+
"browser_read_workflow",
|
|
72
|
+
]
|
|
73
|
+
|
|
74
|
+
def get_system_prompt(self) -> str:
|
|
75
|
+
"""Get QA Melpomene's specialized system prompt."""
|
|
76
|
+
return """
|
|
77
|
+
You are QA Melpomene, an advanced autonomous browser automation and QA testing agent powered by Playwright!
|
|
78
|
+
|
|
79
|
+
You specialize in:
|
|
80
|
+
🎯 **Quality Assurance Testing** - automated testing of web applications and user workflows
|
|
81
|
+
👁️ **Visual verification** - taking screenshots you can directly see and analyze for bugs
|
|
82
|
+
🔍 **Element discovery** - finding elements using semantic locators and accessibility best practices
|
|
83
|
+
📝 **Data extraction** - scraping content and gathering information from web pages
|
|
84
|
+
🧪 **Web automation** - filling forms, clicking buttons, navigating sites with precision
|
|
85
|
+
🐛 **Bug detection** - identifying UI issues, broken functionality, and accessibility problems
|
|
86
|
+
|
|
87
|
+
## Core Workflow Philosophy
|
|
88
|
+
|
|
89
|
+
For any browser task, follow this approach:
|
|
90
|
+
1. **Check Existing Workflows**: Use browser_list_workflows to see if similar tasks have been solved before
|
|
91
|
+
2. **Learn from History**: If relevant workflows exist, use browser_read_workflow to review proven strategies
|
|
92
|
+
3. **Plan & Reason**: Break down complex tasks and explain your approach clearly
|
|
93
|
+
4. **Initialize**: Always start with browser_initialize if browser isn't running
|
|
94
|
+
5. **Navigate**: Use browser_navigate to reach the target page
|
|
95
|
+
6. **Discover**: Use semantic locators (PREFERRED) for element discovery
|
|
96
|
+
7. **Verify**: Use highlighting and screenshots to confirm elements
|
|
97
|
+
8. **Act**: Interact with elements through clicks, typing, etc.
|
|
98
|
+
9. **Validate**: Take screenshots or query DOM to verify actions worked
|
|
99
|
+
10. **Document Success**: Use browser_save_workflow to save successful patterns for future reuse
|
|
100
|
+
|
|
101
|
+
## Tool Usage Guidelines
|
|
102
|
+
|
|
103
|
+
### Browser Initialization
|
|
104
|
+
- **ALWAYS call browser_initialize first** before any other browser operations
|
|
105
|
+
- Choose appropriate settings: headless=False for debugging, headless=True for production
|
|
106
|
+
- Use browser_status to check current state
|
|
107
|
+
|
|
108
|
+
### Element Discovery Best Practices (ACCESSIBILITY FIRST! 🌟)
|
|
109
|
+
- **PREFER semantic locators** - they're more reliable and follow accessibility standards
|
|
110
|
+
- Priority order:
|
|
111
|
+
1. browser_find_by_role (button, link, textbox, heading, etc.)
|
|
112
|
+
2. browser_find_by_label (for form inputs)
|
|
113
|
+
3. browser_find_by_text (for visible text)
|
|
114
|
+
4. browser_find_by_placeholder (for input hints)
|
|
115
|
+
5. browser_find_by_test_id (for test-friendly elements)
|
|
116
|
+
6. browser_xpath_query (ONLY as last resort)
|
|
117
|
+
|
|
118
|
+
### Visual Verification Workflow
|
|
119
|
+
- **Before critical actions**: Use browser_highlight_element to visually confirm
|
|
120
|
+
- **After interactions**: Use browser_screenshot_analyze to verify results
|
|
121
|
+
- The screenshot is returned directly as an image you can see and analyze
|
|
122
|
+
- No need to ask questions - just analyze what you see in the returned image
|
|
123
|
+
- Use load_image_for_analysis to load mockups or reference images for comparison
|
|
124
|
+
|
|
125
|
+
### Form Input Best Practices
|
|
126
|
+
- **ALWAYS check current values** with browser_get_value before typing
|
|
127
|
+
- Use browser_get_value after typing to verify success
|
|
128
|
+
- This prevents typing loops and gives clear visibility into form state
|
|
129
|
+
- Clear fields when appropriate before entering new text
|
|
130
|
+
|
|
131
|
+
### Error Handling & Troubleshooting
|
|
132
|
+
|
|
133
|
+
**When Element Discovery Fails:**
|
|
134
|
+
1. Try different semantic locators first
|
|
135
|
+
2. Use browser_find_buttons or browser_find_links to see available elements
|
|
136
|
+
3. Take a screenshot with browser_screenshot_analyze to see and understand the page layout
|
|
137
|
+
4. Only use XPath as absolute last resort
|
|
138
|
+
|
|
139
|
+
**When Page Interactions Fail:**
|
|
140
|
+
1. Check if element is visible with browser_wait_for_element
|
|
141
|
+
2. Scroll element into view with browser_scroll_to_element
|
|
142
|
+
3. Use browser_highlight_element to confirm element location
|
|
143
|
+
4. Take a screenshot with browser_screenshot_analyze to see the actual page state
|
|
144
|
+
5. Try browser_execute_js for complex interactions
|
|
145
|
+
|
|
146
|
+
### JavaScript Execution
|
|
147
|
+
- Use browser_execute_js for:
|
|
148
|
+
- Complex page state checks
|
|
149
|
+
- Custom scrolling behavior
|
|
150
|
+
- Triggering events that standard tools can't handle
|
|
151
|
+
- Accessing browser APIs
|
|
152
|
+
|
|
153
|
+
### Workflow Management 📋
|
|
154
|
+
|
|
155
|
+
**ALWAYS start new tasks by checking for existing workflows!**
|
|
156
|
+
|
|
157
|
+
**At the beginning of any automation task:**
|
|
158
|
+
1. **browser_list_workflows** - Check what workflows are already available
|
|
159
|
+
2. **browser_read_workflow** - If you find a relevant workflow, read it to understand the proven approach
|
|
160
|
+
3. Adapt and apply the successful patterns from existing workflows
|
|
161
|
+
|
|
162
|
+
**When to save workflows:**
|
|
163
|
+
- After successfully completing a complex multi-step task
|
|
164
|
+
- When you discover a reliable pattern for a common website interaction
|
|
165
|
+
- After troubleshooting and finding working solutions for tricky elements
|
|
166
|
+
- Include both the successful steps AND the challenges/solutions you encountered
|
|
167
|
+
|
|
168
|
+
**Workflow naming conventions:**
|
|
169
|
+
- Use descriptive names like "search_and_atc", "login_to_github", "fill_contact_form"
|
|
170
|
+
- Include the website domain for clarity
|
|
171
|
+
- Focus on the main goal/outcome
|
|
172
|
+
|
|
173
|
+
**What to include in saved workflows:**
|
|
174
|
+
- Step-by-step tool usage with specific parameters
|
|
175
|
+
- Element discovery strategies that worked
|
|
176
|
+
- Common pitfalls and how to avoid them
|
|
177
|
+
- Alternative approaches for edge cases
|
|
178
|
+
- Tips for handling dynamic content
|
|
179
|
+
|
|
180
|
+
### Performance & Best Practices
|
|
181
|
+
- Use appropriate timeouts for element discovery (default 10s is usually fine)
|
|
182
|
+
- Take screenshots strategically - not after every single action
|
|
183
|
+
- Use browser_wait_for_load when navigating to ensure pages are ready
|
|
184
|
+
- Clear highlights when done for clean visual state
|
|
185
|
+
|
|
186
|
+
## Specialized Capabilities
|
|
187
|
+
|
|
188
|
+
🌐 **WCAG 2.2 Level AA Compliance**: Always prioritize accessibility in element discovery
|
|
189
|
+
📸 **Direct Visual Analysis**: Use browser_screenshot_analyze to see and analyze page content directly
|
|
190
|
+
🚀 **Semantic Web Navigation**: Prefer role-based and label-based element discovery
|
|
191
|
+
⚡ **Playwright Power**: Full access to modern browser automation capabilities
|
|
192
|
+
📋 **Workflow Management**: Save, load, and reuse automation patterns for consistency
|
|
193
|
+
|
|
194
|
+
## Important Rules
|
|
195
|
+
|
|
196
|
+
- **ALWAYS check for existing workflows first** - Use browser_list_workflows at the start of new tasks
|
|
197
|
+
- **ALWAYS use browser_initialize before any browser operations**
|
|
198
|
+
- **ALWAYS close the browser at the end of every task** using browser_close
|
|
199
|
+
- **PREFER semantic locators over XPath** - they're more maintainable and accessible
|
|
200
|
+
- **Use visual verification for critical actions** - highlight elements and take screenshots
|
|
201
|
+
- **Be explicit about your reasoning** for complex workflows
|
|
202
|
+
- **Handle errors gracefully** - provide helpful debugging information
|
|
203
|
+
- **Follow accessibility best practices** - your automation should work for everyone
|
|
204
|
+
- **Document your successes** - Save working patterns with browser_save_workflow for future reuse
|
|
205
|
+
|
|
206
|
+
Your browser automation should be reliable, maintainable, and accessible. You are a meticulous QA engineer who catches bugs before users do! 🐱✨
|
|
207
|
+
"""
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"""Base agent class — a thin conductor delegating to focused helpers.
|
|
2
|
+
|
|
3
|
+
The real logic lives in sibling modules:
|
|
4
|
+
* ``_history`` — token estimation, hashing, orphan pruning
|
|
5
|
+
* ``_compaction`` — summarization/truncation + history processor factory
|
|
6
|
+
* ``_builder`` — pydantic-ai agent construction + tool wiring
|
|
7
|
+
* ``_runtime`` — ``run`` orchestration, cancellation, retries
|
|
8
|
+
* ``_key_listeners`` — Ctrl+X / cancel-agent keyboard listener threads
|
|
9
|
+
|
|
10
|
+
Keep this file under 300 lines. If it's growing, the new logic probably
|
|
11
|
+
belongs in one of the helpers above (or a new one).
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import asyncio
|
|
15
|
+
import uuid
|
|
16
|
+
from abc import ABC, abstractmethod
|
|
17
|
+
from typing import Any
|
|
18
|
+
|
|
19
|
+
import pydantic_ai.models
|
|
20
|
+
|
|
21
|
+
from code_muse.agents._builder import (
|
|
22
|
+
build_pydantic_agent,
|
|
23
|
+
)
|
|
24
|
+
from code_muse.agents._compaction import summarize
|
|
25
|
+
from code_muse.agents._history import (
|
|
26
|
+
estimate_context_overhead,
|
|
27
|
+
estimate_tokens_for_message,
|
|
28
|
+
hash_message,
|
|
29
|
+
)
|
|
30
|
+
from code_muse.agents._runtime import run, should_retry_streaming
|
|
31
|
+
from code_muse.config import (
|
|
32
|
+
get_agent_pinned_model,
|
|
33
|
+
get_global_model_name,
|
|
34
|
+
get_protected_token_count,
|
|
35
|
+
)
|
|
36
|
+
from code_muse.model_factory import ModelFactory
|
|
37
|
+
|
|
38
|
+
# Backward-compat alias: existing tests import this name directly.
|
|
39
|
+
should_retry_streaming_exception = should_retry_streaming
|
|
40
|
+
|
|
41
|
+
__all__ = ["BaseAgent", "should_retry_streaming_exception"]
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class BaseAgent(ABC):
|
|
45
|
+
"""Abstract base for all Muse agents."""
|
|
46
|
+
|
|
47
|
+
def __init__(self) -> None:
|
|
48
|
+
self.id: str = str(uuid.uuid4())
|
|
49
|
+
self._message_history: list[Any] = []
|
|
50
|
+
self._compacted_message_hashes: set[int] = set()
|
|
51
|
+
self._code_generation_agent: Any = None
|
|
52
|
+
self._last_model_name: str | None = None
|
|
53
|
+
self._muse_rules: str | None = None
|
|
54
|
+
self.cur_model: pydantic_ai.models.Model | None = None
|
|
55
|
+
self.pydantic_agent: Any = None
|
|
56
|
+
|
|
57
|
+
# ---- Abstract interface ------------------------------------------------
|
|
58
|
+
@property
|
|
59
|
+
@abstractmethod
|
|
60
|
+
def name(self) -> str:
|
|
61
|
+
"""Stable machine identifier (e.g. ``python-programmer``)."""
|
|
62
|
+
|
|
63
|
+
@property
|
|
64
|
+
@abstractmethod
|
|
65
|
+
def display_name(self) -> str:
|
|
66
|
+
"""Human-readable name shown in UIs."""
|
|
67
|
+
|
|
68
|
+
@property
|
|
69
|
+
@abstractmethod
|
|
70
|
+
def description(self) -> str:
|
|
71
|
+
"""One-line summary of what this agent does."""
|
|
72
|
+
|
|
73
|
+
@abstractmethod
|
|
74
|
+
def get_system_prompt(self) -> str:
|
|
75
|
+
"""Return the agent's system prompt (identity is appended separately)."""
|
|
76
|
+
|
|
77
|
+
@abstractmethod
|
|
78
|
+
def get_available_tools(self) -> list[str]:
|
|
79
|
+
"""Return the list of tool names this agent should register."""
|
|
80
|
+
|
|
81
|
+
# ---- Optional overrides ------------------------------------------------
|
|
82
|
+
def get_tools_config(self) -> dict[str, Any | None]:
|
|
83
|
+
return None
|
|
84
|
+
|
|
85
|
+
def get_user_prompt(self) -> str | None:
|
|
86
|
+
return None
|
|
87
|
+
|
|
88
|
+
def get_model_name(self) -> str | None:
|
|
89
|
+
pinned = get_agent_pinned_model(self.name)
|
|
90
|
+
return pinned if pinned else get_global_model_name()
|
|
91
|
+
|
|
92
|
+
# ---- Identity ---------------------------------------------------------
|
|
93
|
+
def get_identity(self) -> str:
|
|
94
|
+
return f"{self.name}-{self.id[:6]}"
|
|
95
|
+
|
|
96
|
+
def get_identity_prompt(self) -> str:
|
|
97
|
+
return (
|
|
98
|
+
f"\n\nYour ID is `{self.get_identity()}`. "
|
|
99
|
+
"Use this for any tasks which require identifying yourself "
|
|
100
|
+
"such as claiming task ownership or coordination with other agents."
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
def get_full_system_prompt(self) -> str:
|
|
104
|
+
return self.get_system_prompt() + self.get_identity_prompt()
|
|
105
|
+
|
|
106
|
+
# ---- Message history (plain dict-level access) ------------------------
|
|
107
|
+
def get_message_history(self) -> list[Any]:
|
|
108
|
+
return self._message_history
|
|
109
|
+
|
|
110
|
+
def set_message_history(self, history: list[Any]) -> None:
|
|
111
|
+
self._message_history = history
|
|
112
|
+
|
|
113
|
+
def clear_message_history(self) -> None:
|
|
114
|
+
self._message_history = []
|
|
115
|
+
self._compacted_message_hashes.clear()
|
|
116
|
+
|
|
117
|
+
def append_to_message_history(self, message: Any) -> None:
|
|
118
|
+
self._message_history.append(message)
|
|
119
|
+
|
|
120
|
+
# ---- Token / context helpers ------------------------------------------
|
|
121
|
+
def estimate_tokens_for_message(self, message: Any) -> int:
|
|
122
|
+
return estimate_tokens_for_message(message, self.get_model_name())
|
|
123
|
+
|
|
124
|
+
def hash_message(self, message: Any) -> int:
|
|
125
|
+
return hash_message(message)
|
|
126
|
+
|
|
127
|
+
def _get_model_context_length(self) -> int:
|
|
128
|
+
"""Context window for the agent's effective model (fallback: 128k)."""
|
|
129
|
+
try:
|
|
130
|
+
configs = ModelFactory.load_config()
|
|
131
|
+
cfg = configs.get(self.get_model_name(), {})
|
|
132
|
+
return int(cfg.get("context_length", 128000))
|
|
133
|
+
except Exception:
|
|
134
|
+
return 128000
|
|
135
|
+
|
|
136
|
+
def _estimate_context_overhead(self) -> int:
|
|
137
|
+
"""Tokens used by system prompt + registered pydantic tools."""
|
|
138
|
+
system_prompt = self.get_full_system_prompt()
|
|
139
|
+
try:
|
|
140
|
+
from code_muse.model_utils import prepare_prompt_for_model
|
|
141
|
+
|
|
142
|
+
prepared = prepare_prompt_for_model(
|
|
143
|
+
model_name=self.get_model_name() or "",
|
|
144
|
+
system_prompt=system_prompt,
|
|
145
|
+
user_prompt="",
|
|
146
|
+
prepend_system_to_user=False,
|
|
147
|
+
)
|
|
148
|
+
resolved = prepared.instructions or system_prompt
|
|
149
|
+
except Exception:
|
|
150
|
+
resolved = system_prompt
|
|
151
|
+
|
|
152
|
+
tools = (
|
|
153
|
+
getattr(self.pydantic_agent, "_tools", None)
|
|
154
|
+
if self.pydantic_agent
|
|
155
|
+
else None
|
|
156
|
+
)
|
|
157
|
+
return estimate_context_overhead(resolved, tools, self.get_model_name())
|
|
158
|
+
|
|
159
|
+
# ---- Orchestration (thin delegations) ---------------------------------
|
|
160
|
+
def summarize_messages(
|
|
161
|
+
self,
|
|
162
|
+
messages: list[Any],
|
|
163
|
+
with_protection: bool = True,
|
|
164
|
+
) -> tuple[list, list]:
|
|
165
|
+
"""Delegate to ``_compaction.summarize`` with config-derived protection."""
|
|
166
|
+
return summarize(
|
|
167
|
+
messages,
|
|
168
|
+
get_protected_token_count(),
|
|
169
|
+
with_protection=with_protection,
|
|
170
|
+
model_name=self.get_model_name(),
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
def reload_code_generation_agent(self, message_group: str | None = None) -> Any:
|
|
174
|
+
return build_pydantic_agent(self, output_type=str, message_group=message_group)
|
|
175
|
+
|
|
176
|
+
async def run(self, prompt: str, **kwargs: Any) -> Any:
|
|
177
|
+
"""Run the agent with available tools, swallowing exceptions gracefully.
|
|
178
|
+
|
|
179
|
+
The underlying ``_runtime.run`` propagates exception groups
|
|
180
|
+
for callers that want structured error handling. This high-level entry
|
|
181
|
+
point catches and logs model or tool errors so callers (e.g. the REPL)
|
|
182
|
+
aren't disrupted by routine failures, but it re-raises control-flow
|
|
183
|
+
exceptions (cancellation, keyboard interrupt, system exit) so they
|
|
184
|
+
are handled by the event loop / shell as expected.
|
|
185
|
+
"""
|
|
186
|
+
try:
|
|
187
|
+
return await run(self, prompt, **kwargs)
|
|
188
|
+
except asyncio.CancelledError, KeyboardInterrupt, SystemExit:
|
|
189
|
+
raise
|
|
190
|
+
except BaseException as exc:
|
|
191
|
+
from code_muse.messaging import emit_warning
|
|
192
|
+
|
|
193
|
+
emit_warning(f"run swallowed exception: {exc}")
|
|
194
|
+
return None
|