code-muse 0.1.2__tar.gz → 0.1.3__tar.gz
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-0.1.2 → code_muse-0.1.3}/PKG-INFO +1 -1
- code_muse-0.1.3/code_muse/__init__.py +87 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/_compaction.py +116 -5
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/_history.py +8 -1
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/fs_scan_cache/scan_cache_core.cpython-314-darwin.so +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/hook_engine/registry.py +1 -1
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/hook_engine/validator.py +2 -0
- code_muse-0.1.3/code_muse/models.json +1 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/models_cache/sha256_hash.cpython-314-darwin.so +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/__init__.py +27 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/bm25_scorer.cpython-314-darwin.so +0 -0
- code_muse-0.1.3/code_muse/plugins/delegation_manager/__init__.py +24 -0
- code_muse-0.1.3/code_muse/plugins/delegation_manager/delegation_manager.py +183 -0
- code_muse-0.1.3/code_muse/plugins/delegation_manager/register_callbacks.py +109 -0
- code_muse-0.1.3/code_muse/plugins/delegation_manager/supervisor_agent.py +52 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/ast_compressor.cpython-314-darwin.so +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/code.cpython-314-darwin.so +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/git.cpython-314-darwin.so +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/lint.cpython-314-darwin.so +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/test.cpython-314-darwin.so +0 -0
- code_muse-0.1.3/code_muse/plugins/history_store/__init__.py +13 -0
- code_muse-0.1.3/code_muse/plugins/history_store/register_callbacks.py +68 -0
- code_muse-0.1.3/code_muse/plugins/history_store/store.py +95 -0
- code_muse-0.1.3/code_muse/plugins/tool_registry/__init__.py +17 -0
- code_muse-0.1.3/code_muse/plugins/tool_registry/definitions.py +150 -0
- code_muse-0.1.3/code_muse/plugins/tool_registry/register_callbacks.py +129 -0
- code_muse-0.1.3/code_muse/plugins/tool_registry/registry.py +117 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/security/redaction.cpython-314-darwin.so +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/stream_parser/tagged_line_parser.cpython-314-darwin.so +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/stream_parser/utf8_stream_parser.cpython-314-darwin.so +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/terminal_utils.cpython-314-darwin.so +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/pyproject.toml +1 -1
- code_muse-0.1.2/code_muse/__init__.py +0 -26
- code_muse-0.1.2/code_muse/models.json +0 -66
- code_muse-0.1.2/code_muse/plugins/autonomous_memory/bm25_scorer.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse-0.1.2/code_muse/plugins/filter_engine/strategies/ast_compressor.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse-0.1.2/code_muse/plugins/filter_engine/strategies/code.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse-0.1.2/code_muse/plugins/filter_engine/strategies/git.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse-0.1.2/code_muse/plugins/filter_engine/strategies/json_compressor.cpython-314-darwin.so +0 -0
- code_muse-0.1.2/code_muse/plugins/filter_engine/strategies/json_patterns.cpython-314-darwin.so +0 -0
- code_muse-0.1.2/code_muse/plugins/filter_engine/strategies/lint.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse-0.1.2/code_muse/plugins/filter_engine/strategies/test.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse-0.1.2/code_muse/security/redaction.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse-0.1.2/code_muse/terminal_utils.cpython-314-x86_64-linux-gnu.so +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/.gitignore +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/LICENSE +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/README.md +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/__main__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/_builder.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/_diagnostics.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/_key_listeners.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/_non_streaming_render.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/_runtime.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/agent_creator_agent.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/agent_helios.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/agent_manager.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/agent_muse.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/agent_planning.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/agent_qa_iris.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/base_agent.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/event_stream_handler.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/json_agent.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/prompt_v3.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/subagent_stream_handler.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/chatgpt_codex_client.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/claude_cache_client.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/cli_runner/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/cli_runner/args.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/cli_runner/loop.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/cli_runner/resume.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/cli_runner/runner.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/add_model_menu.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/agent_menu.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/attachments.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/autosave_menu.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/clipboard.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/colors_menu.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/command_handler.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/command_registry.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/config_commands.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/core_commands.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/diff_menu.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/file_path_completion.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/load_context_completion.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/model_picker_completion.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/model_settings_menu.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/onboarding_slides.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/onboarding_wizard.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/pagination.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/pin_command_completion.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/prompt_toolkit_completion.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/session_commands.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/shell_passthrough.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/skills_completion.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/types.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/uc_menu.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/utils.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/wiggum_state.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/config.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/config_agent.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/config_appearance.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/config_model.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/config_security.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/error_logging.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/evals/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/evals/eval_helpers.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/evals/eval_runner.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/evals/sample_evals/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/evals/sample_evals/eval_frugal_reads.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/evals/sample_evals/eval_memory_planning.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/evals/sample_evals/eval_shell_efficiency.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/evals/sample_evals/eval_tool_masking.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/fs_scan_cache/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/fs_scan_cache/invalidation_hooks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/fs_scan_cache/scan_cache_core.pyx +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/fs_scan_cache/tool_integration.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/fs_scan_cache/ttl_policy.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/gemini_code_assist.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/gemini_model.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/hook_engine/README.md +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/hook_engine/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/hook_engine/aliases.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/hook_engine/engine.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/hook_engine/executor.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/hook_engine/matcher.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/hook_engine/models.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/hook_engine/trust.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/http_utils.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/keymap.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/list_filtering.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/main.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/bus.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/commands.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/markdown_patches.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/message_queue.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/messages.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/queue_console.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/renderers.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/rich_renderer.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/shimmer.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/spinner/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/spinner/console_spinner.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/spinner/spinner_base.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/subagent_console.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/model_factory.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/model_switching.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/model_utils.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/models_cache/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/models_cache/blocking_lru_cache.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/models_cache/cache_writer.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/models_cache/sha256_hash.pyx +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/models_cache/startup_integration.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/models_dev_api.json +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/models_dev_parser.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/motion.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/config.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/discovery.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/downloader.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/installer.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/metadata.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/prompt_builder.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/remote_catalog.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/skill_catalog.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/skills_install_menu.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/skills_menu.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/auto_review/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/auto_review/cache.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/auto_review/config.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/auto_review/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/auto_review/review_prompt.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/auto_review/reviewer.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/auto_review/visibility.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/bm25_scorer.pyx +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/consolidation.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/extraction.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/lease_lock.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/memory_injection.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/secret_scanner.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/session_scanner.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/aws_bedrock/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/aws_bedrock/config.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/aws_bedrock/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/aws_bedrock/utils.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/README.md +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/config.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/discovery.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/token.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/utils.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/build_filter/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/build_filter/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/build_filter/strategies/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/build_filter/strategies/build.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/config.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/oauth_flow.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/test_plugin.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/utils.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/checkpointing/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/checkpointing/checkpoint_hook.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/checkpointing/conversation_snapshots.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/checkpointing/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/checkpointing/restore_command.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/checkpointing/rewind_shortcut.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/checkpointing/shadow_git.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_hooks/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_hooks/config.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_hooks/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/README.md +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/SETUP.md +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/config.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/fast_mode.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/prompt_handler.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/test_fast_mode.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/test_plugin.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/utils.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/copilot_auth/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/copilot_auth/config.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/copilot_auth/reasoning_client.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/copilot_auth/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/copilot_auth/utils.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/custom_commands/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/custom_commands/args_injection.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/custom_commands/command_discovery.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/custom_commands/command_toml_schema.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/custom_commands/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/customizable_commands/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/customizable_commands/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/destructive_command_guard/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/destructive_command_guard/detector.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/destructive_command_guard/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/example_custom_command/README.md +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/example_custom_command/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/file_permission_handler/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/file_permission_handler/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/classifier.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/content_detector.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/dispatcher.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/registry.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/ast_compressor.pyx +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/ast_parser.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/code.pyx +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/git.pyx +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/json_compressor.pyx +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/json_patterns.pyx +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/lint.pyx +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/test.pyx +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/verbosity.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/force_push_guard/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/force_push_guard/detector.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/force_push_guard/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/force_push_guard/test_detector.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/frontend_emitter/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/frontend_emitter/emitter.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/frontend_emitter/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/gac/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/gac/git_ops.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/gac/prompt.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/gac/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/hook_creator/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/hook_creator/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/hook_manager/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/hook_manager/config.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/hook_manager/hooks_menu.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/hook_manager/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/hook_monitor/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/mindpack/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/mindpack/factory.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/mindpack/judge.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/mindpack/memory.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/mindpack/mindpack_menu.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/mindpack/orchestration.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/mindpack/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/mindpack/schemas.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/mindpack/tools.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/oauth_muse_html.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/ollama_setup/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/ollama_setup/completer.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/ollama_setup/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/plan_command/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/plan_command/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/plan_mode/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/plan_mode/mode_cycling.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/plan_mode/plan_generation.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/plan_mode/plan_hooks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/plan_mode/plan_mode_tools.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/plan_mode/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/plugin_trust/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/policy_engine/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/policy_engine/approval_flow_integration.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/policy_engine/policy_evaluator.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/policy_engine/policy_file_discovery.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/policy_engine/policy_toml_schema.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/policy_engine/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/pop_command/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/pop_command/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/prompt_newline/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/prompt_newline/config.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/prompt_newline/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/safety_status/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/safety_status/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/semantic_compression/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/semantic_compression/compressor.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/semantic_compression/config.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/semantic_compression/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/shell_minimizer/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/shell_minimizer/builtin_filters.toml +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/shell_minimizer/pipeline.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/shell_minimizer/primitives.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/shell_minimizer/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/shell_safety/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/shell_safety/agent_shell_safety.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/shell_safety/command_cache.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/shell_safety/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/synthetic_status/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/synthetic_status/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/synthetic_status/status_api.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/token_caching/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/token_caching/cache_hit_tracking.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/token_caching/cacheable_prefix_detection.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/token_caching/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/token_caching/stats_display.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/token_tracking/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/token_tracking/database.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/token_tracking/edit_analyzer.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/token_tracking/record.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/token_tracking/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/token_tracking/reports.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/tps_meter/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/tps_meter/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/models.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/registry.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/runner.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/safety.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/sandbox.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/provider_identity.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/pydantic_patches.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/reopenable_async_client.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/round_robin_model.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/secret_storage.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/security/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/security/redaction.pyx +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/session_storage.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/status_display.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/stream_parser/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/stream_parser/assistant_text_parser.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/stream_parser/citation_parser.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/stream_parser/inline_hidden_tag_parser.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/stream_parser/proposed_plan_parser.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/stream_parser/stream_text_chunk.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/stream_parser/stream_text_parser.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/stream_parser/tagged_line_parser.pyx +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/stream_parser/utf8_stream_parser.pyx +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/summarization_agent.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/terminal_utils.pyx +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/agent_tools.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/ask_user_question/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/ask_user_question/constants.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/ask_user_question/demo_tui.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/ask_user_question/handler.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/ask_user_question/models.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/ask_user_question/registration.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/ask_user_question/renderers.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/ask_user_question/terminal_ui.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/ask_user_question/theme.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/ask_user_question/tui_loop.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/background_jobs.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/browser/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/browser/browser_control.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/browser/browser_interactions.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/browser/browser_locators.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/browser/browser_manager.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/browser/browser_navigation.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/browser/browser_screenshot.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/browser/browser_scripts.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/browser/browser_workflows.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/chrome_cdp/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/chrome_cdp/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/command_runner.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/common.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/display.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/file_modifications.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/file_operations.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/image_tools.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/meetin_proxy/__init__.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/meetin_proxy/capture_addon.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/meetin_proxy/proxy_manager.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/meetin_proxy/register_callbacks.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/path_policy.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/skills_tools.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/subagent_context.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/tools_content.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/universal_constructor.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/uvx_detection.py +0 -0
- {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/version_checker.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-muse
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.3
|
|
4
4
|
Summary: Muse — eternal guide of creators in the arts and sciences. An elegant AI coding assistant.
|
|
5
5
|
Project-URL: Repository, https://github.com/asx8678/muse
|
|
6
6
|
Project-URL: Homepage, https://github.com/asx8678/muse
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import importlib.metadata
|
|
2
|
+
import logging
|
|
3
|
+
import os
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
logger = logging.getLogger(__name__)
|
|
7
|
+
|
|
8
|
+
# Biscuit was here.
|
|
9
|
+
try:
|
|
10
|
+
_detected_version = importlib.metadata.version("code-muse")
|
|
11
|
+
# Ensure we never end up with None or empty string
|
|
12
|
+
__version__ = _detected_version if _detected_version else "0.0.0-dev"
|
|
13
|
+
except Exception:
|
|
14
|
+
# Fallback for dev environments where metadata might not be available
|
|
15
|
+
__version__ = "0.0.0-dev"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _rebuild_stale_cython_modules(package_root: Path) -> None:
|
|
19
|
+
"""Delete stale compiled extensions so pyximport rebuilds them.
|
|
20
|
+
|
|
21
|
+
Checks both file mtime AND embedded module name to catch extensions
|
|
22
|
+
compiled from an older package version (e.g. after a rename from
|
|
23
|
+
``code_puppy`` to ``code_muse``).
|
|
24
|
+
|
|
25
|
+
Safe no-op when no ``.pyx`` files exist or no stale extensions found.
|
|
26
|
+
"""
|
|
27
|
+
if not list(package_root.rglob("*.pyx")):
|
|
28
|
+
return
|
|
29
|
+
|
|
30
|
+
import importlib.util
|
|
31
|
+
|
|
32
|
+
# Read first 4 KB of each .so to check for old module names.
|
|
33
|
+
# Compiled Cython modules embed their source package path (e.g.
|
|
34
|
+
# ``code_puppy.plugins.…``) in the binary.
|
|
35
|
+
_OLD_NAMES = [b"code_puppy", b"code.puppy"]
|
|
36
|
+
|
|
37
|
+
stale_count = 0
|
|
38
|
+
for pyx_file in package_root.rglob("*.pyx"):
|
|
39
|
+
pyx_mtime = pyx_file.stat().st_mtime
|
|
40
|
+
parent = pyx_file.parent
|
|
41
|
+
stem = pyx_file.stem
|
|
42
|
+
|
|
43
|
+
for so_file in parent.glob(f"{stem}*.so"):
|
|
44
|
+
if not so_file.is_file():
|
|
45
|
+
continue
|
|
46
|
+
|
|
47
|
+
# 1. Mtime check: .so is older than .pyx source
|
|
48
|
+
# 2. Content check: .so still references old package name
|
|
49
|
+
is_stale = so_file.stat().st_mtime < pyx_mtime
|
|
50
|
+
if not is_stale:
|
|
51
|
+
try:
|
|
52
|
+
header = so_file.read_bytes()[:4096]
|
|
53
|
+
is_stale = any(old in header for old in _OLD_NAMES)
|
|
54
|
+
except OSError:
|
|
55
|
+
pass
|
|
56
|
+
|
|
57
|
+
if is_stale:
|
|
58
|
+
try:
|
|
59
|
+
so_file.unlink()
|
|
60
|
+
stale_count += 1
|
|
61
|
+
logger.debug("Removed stale extension: %s", so_file)
|
|
62
|
+
except OSError:
|
|
63
|
+
pass
|
|
64
|
+
|
|
65
|
+
if stale_count:
|
|
66
|
+
logger.info(
|
|
67
|
+
"Removed %d stale Cython extension(s) — will rebuild on next import",
|
|
68
|
+
stale_count,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
# Enable Cython JIT compilation for .pyx modules throughout the package.
|
|
73
|
+
_CYTHON_AVAILABLE = False
|
|
74
|
+
_PACKAGE_ROOT = Path(__file__).parent
|
|
75
|
+
try:
|
|
76
|
+
import pyximport
|
|
77
|
+
|
|
78
|
+
pyximport.install(language_level=3, build_in_temp=True, inplace=True)
|
|
79
|
+
_CYTHON_AVAILABLE = True
|
|
80
|
+
_rebuild_stale_cython_modules(_PACKAGE_ROOT)
|
|
81
|
+
except Exception:
|
|
82
|
+
pass # Cython not available — .pyx modules will need pre-compiled extension files
|
|
83
|
+
|
|
84
|
+
# Scan the package tree for .pyx modules and record Cython status.
|
|
85
|
+
_pyx_files = list(_PACKAGE_ROOT.rglob("*.pyx"))
|
|
86
|
+
PYX_MODULE_COUNT: int = len(_pyx_files)
|
|
87
|
+
CYTHON_ENABLED: bool = _CYTHON_AVAILABLE and PYX_MODULE_COUNT > 0
|
|
@@ -21,6 +21,7 @@ from pydantic_ai.messages import (
|
|
|
21
21
|
ModelResponse,
|
|
22
22
|
TextPart,
|
|
23
23
|
ThinkingPart,
|
|
24
|
+
ToolReturnPart,
|
|
24
25
|
)
|
|
25
26
|
|
|
26
27
|
from code_muse.agents._history import (
|
|
@@ -49,7 +50,8 @@ _SUMMARIZATION_INSTRUCTIONS = (
|
|
|
49
50
|
" as well as user queries, etc. Summarize the contents of these steps."
|
|
50
51
|
" The high level details should remain but the bulk of the content from tool-call"
|
|
51
52
|
" responses should be compacted and summarized. For example if you see a tool-call"
|
|
52
|
-
" reading a file, and the file contents are large, then in your
|
|
53
|
+
" reading a file, and the file contents are large, then in your"
|
|
54
|
+
" summary you might just"
|
|
53
55
|
" write: * used read_file on space_invaders.cpp - contents removed."
|
|
54
56
|
"\n Make sure your result is a bulleted list of all steps and interactions."
|
|
55
57
|
"\n\nNOTE: This summary represents older conversation history. "
|
|
@@ -147,7 +149,8 @@ def truncate(
|
|
|
147
149
|
model_name: str | None = None,
|
|
148
150
|
cache: CompactionCache | None = None,
|
|
149
151
|
) -> list[ModelMessage]:
|
|
150
|
-
"""Drop middle messages, keeping system prompt, optional thinking,
|
|
152
|
+
"""Drop middle messages, keeping system prompt, optional thinking,
|
|
153
|
+
and recent tail."""
|
|
151
154
|
import queue
|
|
152
155
|
|
|
153
156
|
if not messages:
|
|
@@ -223,7 +226,8 @@ def _run_summarization_core(
|
|
|
223
226
|
|
|
224
227
|
if not isinstance(new_messages, list):
|
|
225
228
|
emit_warning(
|
|
226
|
-
"Summarization agent returned non-list output;
|
|
229
|
+
"Summarization agent returned non-list output;"
|
|
230
|
+
" wrapping into message request"
|
|
227
231
|
)
|
|
228
232
|
new_messages = [ModelRequest([TextPart(str(new_messages))])]
|
|
229
233
|
|
|
@@ -425,7 +429,7 @@ def make_history_processor(agent: Any) -> Callable[..., list[ModelMessage]]:
|
|
|
425
429
|
1. Fires ``on_message_history_processor_start``.
|
|
426
430
|
2. Merges any incoming messages not already in ``agent._message_history``
|
|
427
431
|
(preserving the last-message regardless of compacted-hash collisions).
|
|
428
|
-
3. Runs ``
|
|
432
|
+
3. Runs ``compact_with_tool_truncation(...)`` if we're over threshold — truncates older tool-result content first, then falls through to compact().
|
|
429
433
|
4. Records dropped-message hashes in ``agent._compacted_message_hashes``.
|
|
430
434
|
5. Strips empty ThinkingParts.
|
|
431
435
|
6. Trims trailing ModelResponse messages so history ends with a ModelRequest.
|
|
@@ -467,7 +471,7 @@ def make_history_processor(agent: Any) -> Callable[..., list[ModelMessage]]:
|
|
|
467
471
|
history.append(msg)
|
|
468
472
|
messages_added += 1
|
|
469
473
|
|
|
470
|
-
new_history, dropped =
|
|
474
|
+
new_history, dropped = compact_with_tool_truncation(
|
|
471
475
|
agent,
|
|
472
476
|
history,
|
|
473
477
|
agent._get_model_context_length(),
|
|
@@ -504,3 +508,110 @@ def make_history_processor(agent: Any) -> Callable[..., list[ModelMessage]]:
|
|
|
504
508
|
return cleaned
|
|
505
509
|
|
|
506
510
|
return history_processor
|
|
511
|
+
|
|
512
|
+
|
|
513
|
+
# --- Phase 3: Enhanced History Compression ---
|
|
514
|
+
PROTECTION_ZONE_MESSAGES = 6 # Last N messages never pruned
|
|
515
|
+
RECENT_TOOL_RESULTS_TO_KEEP = 7 # Keep last N tool results in full
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
def _truncate_tool_result_content(
|
|
519
|
+
messages: list[ModelMessage],
|
|
520
|
+
keep_count: int = RECENT_TOOL_RESULTS_TO_KEEP,
|
|
521
|
+
) -> list[ModelMessage]:
|
|
522
|
+
"""Replace older tool result content with a truncation marker.
|
|
523
|
+
|
|
524
|
+
Keeps the last `keep_count` tool results in full.
|
|
525
|
+
Older tool results get their content replaced with a short notice.
|
|
526
|
+
The structural pairing (tool_call ↔ tool_return) stays intact.
|
|
527
|
+
|
|
528
|
+
Only affects ToolReturnPart content — all other parts preserved.
|
|
529
|
+
"""
|
|
530
|
+
# Reverse-scan: collect tool_call_ids of the most recent N tool results
|
|
531
|
+
protected_ids: set[str] = set()
|
|
532
|
+
seen = 0
|
|
533
|
+
for i in range(len(messages) - 1, -1, -1):
|
|
534
|
+
msg = messages[i]
|
|
535
|
+
if isinstance(msg, ModelRequest):
|
|
536
|
+
for part in msg.parts:
|
|
537
|
+
if isinstance(part, ToolReturnPart):
|
|
538
|
+
seen += 1
|
|
539
|
+
if seen <= keep_count:
|
|
540
|
+
protected_ids.add(part.tool_call_id)
|
|
541
|
+
|
|
542
|
+
# Forward-pass: truncate old results
|
|
543
|
+
result: list[ModelMessage] = []
|
|
544
|
+
TRUNCATION_MSG = "[Result truncated — re-call tool if full output is needed]"
|
|
545
|
+
|
|
546
|
+
for msg in messages:
|
|
547
|
+
if not isinstance(msg, ModelRequest):
|
|
548
|
+
result.append(msg)
|
|
549
|
+
continue
|
|
550
|
+
new_parts = []
|
|
551
|
+
for part in msg.parts:
|
|
552
|
+
if (
|
|
553
|
+
isinstance(part, ToolReturnPart)
|
|
554
|
+
and part.tool_call_id not in protected_ids
|
|
555
|
+
):
|
|
556
|
+
# Replace content, keep structure
|
|
557
|
+
try:
|
|
558
|
+
if hasattr(part, "model_copy"):
|
|
559
|
+
new_parts.append(
|
|
560
|
+
part.model_copy(update={"content": TRUNCATION_MSG})
|
|
561
|
+
)
|
|
562
|
+
else:
|
|
563
|
+
new_parts.append(part)
|
|
564
|
+
except Exception:
|
|
565
|
+
new_parts.append(part)
|
|
566
|
+
else:
|
|
567
|
+
new_parts.append(part)
|
|
568
|
+
result.append(ModelRequest(parts=new_parts))
|
|
569
|
+
|
|
570
|
+
return result
|
|
571
|
+
|
|
572
|
+
|
|
573
|
+
def compact_with_tool_truncation(
|
|
574
|
+
agent: Any,
|
|
575
|
+
messages: list[ModelMessage],
|
|
576
|
+
model_max: int,
|
|
577
|
+
context_overhead: int,
|
|
578
|
+
) -> tuple[list[ModelMessage], list[ModelMessage]]:
|
|
579
|
+
"""Enhanced compact() that first truncates old tool results,
|
|
580
|
+
then runs normal compaction.
|
|
581
|
+
|
|
582
|
+
This is the Phase 3 replacement for compact(). It:
|
|
583
|
+
1. Truncates old tool result content first (always reduces tokens)
|
|
584
|
+
2. Then runs the existing compact() logic on the cleaner history
|
|
585
|
+
3. Falls through to summarization/truncation if still over threshold
|
|
586
|
+
|
|
587
|
+
Returns: (new_messages, dropped_messages_for_hash_tracking)
|
|
588
|
+
"""
|
|
589
|
+
# Step 1: Truncate old tool results (always safe, always reduces tokens)
|
|
590
|
+
truncated = _truncate_tool_result_content(messages)
|
|
591
|
+
|
|
592
|
+
# Step 2: Run existing compaction on the already-trimmed history
|
|
593
|
+
# The existing compact() handles summarization or truncation if still over threshold
|
|
594
|
+
return compact(agent, truncated, model_max, context_overhead)
|
|
595
|
+
|
|
596
|
+
|
|
597
|
+
def _protect_zone_messages(
|
|
598
|
+
messages: list[ModelMessage],
|
|
599
|
+
zone_size: int = PROTECTION_ZONE_MESSAGES,
|
|
600
|
+
) -> tuple[list[ModelMessage], list[ModelMessage]]:
|
|
601
|
+
"""Split messages into (middle_for_summarization, protected_tail).
|
|
602
|
+
|
|
603
|
+
The last `zone_size` messages (or fewer if history is short) are protected
|
|
604
|
+
and never summarized/truncated. Returns (middle, protected).
|
|
605
|
+
|
|
606
|
+
System message (index 0) is always protected.
|
|
607
|
+
"""
|
|
608
|
+
if len(messages) <= zone_size + 1:
|
|
609
|
+
return [], messages
|
|
610
|
+
|
|
611
|
+
split_idx = max(1, len(messages) - zone_size)
|
|
612
|
+
# Adjust split to not sever tool_call/tool_return pairs (use existing logic)
|
|
613
|
+
adjusted_idx = _find_safe_split_index(messages, split_idx)
|
|
614
|
+
|
|
615
|
+
middle = messages[1:adjusted_idx]
|
|
616
|
+
protected = messages[:1] + messages[adjusted_idx:]
|
|
617
|
+
return middle, protected
|
|
@@ -20,7 +20,7 @@ from typing import Any
|
|
|
20
20
|
|
|
21
21
|
import pydantic
|
|
22
22
|
from pydantic_ai import BinaryContent
|
|
23
|
-
from pydantic_ai.messages import ModelMessage
|
|
23
|
+
from pydantic_ai.messages import ModelMessage, ModelRequest, ToolReturnPart
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
def _json_safe(obj):
|
|
@@ -380,3 +380,10 @@ class CompactionCache:
|
|
|
380
380
|
) -> int:
|
|
381
381
|
"""Sum estimated tokens across all messages using the cache."""
|
|
382
382
|
return sum(self.estimate_tokens(m, model_name) for m in messages)
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
def is_tool_result_message(msg: ModelMessage) -> bool:
|
|
386
|
+
"""Check if a message contains tool return parts."""
|
|
387
|
+
if isinstance(msg, ModelRequest):
|
|
388
|
+
return any(isinstance(p, ToolReturnPart) for p in msg.parts)
|
|
389
|
+
return False
|
{code_muse-0.1.2 → code_muse-0.1.3}/code_muse/fs_scan_cache/scan_cache_core.cpython-314-darwin.so
RENAMED
|
Binary file
|
|
@@ -60,6 +60,8 @@ def validate_hooks_config(config: dict[str, Any]) -> tuple[bool, list[str]]:
|
|
|
60
60
|
|
|
61
61
|
if "matcher" not in group:
|
|
62
62
|
errors.append(f"'{event_type}[{i}]' missing required field 'matcher'")
|
|
63
|
+
elif not group["matcher"]:
|
|
64
|
+
errors.append(f"'{event_type}[{i}]' matcher cannot be empty string — use '*' to match all events")
|
|
63
65
|
|
|
64
66
|
if "hooks" not in group:
|
|
65
67
|
errors.append(f"'{event_type}[{i}]' missing required field 'hooks'")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
{code_muse-0.1.2 → code_muse-0.1.3}/code_muse/models_cache/sha256_hash.cpython-314-darwin.so
RENAMED
|
Binary file
|
|
@@ -28,6 +28,30 @@ USER_PLUGINS_DIR = Path.home() / ".muse" / "plugins"
|
|
|
28
28
|
# Track if plugins have already been loaded to prevent duplicate registration
|
|
29
29
|
_PLUGINS_LOADED = False
|
|
30
30
|
|
|
31
|
+
def _clean_stale_pycache(root_dir: Path) -> None:
|
|
32
|
+
"""Remove stale __pycache__ directories to prevent import ghosts.
|
|
33
|
+
|
|
34
|
+
Deletes any __pycache__ directory whose containing .py file no longer
|
|
35
|
+
exists. This prevents stale bytecode from old package names (e.g.
|
|
36
|
+
after a rename) from causing ``No module named X`` errors.
|
|
37
|
+
"""
|
|
38
|
+
import shutil
|
|
39
|
+
|
|
40
|
+
for pycache_dir in list(root_dir.rglob("__pycache__")):
|
|
41
|
+
if not pycache_dir.is_dir():
|
|
42
|
+
continue
|
|
43
|
+
# Check if any .py file in parent directory still exists
|
|
44
|
+
parent = pycache_dir.parent
|
|
45
|
+
has_py_files = any(parent.glob("*.py"))
|
|
46
|
+
if not has_py_files:
|
|
47
|
+
# Parent dir has no .py files anymore — likely a removed module
|
|
48
|
+
try:
|
|
49
|
+
shutil.rmtree(pycache_dir)
|
|
50
|
+
logger.debug("Cleaned stale __pycache__: %s", pycache_dir)
|
|
51
|
+
except OSError:
|
|
52
|
+
pass
|
|
53
|
+
|
|
54
|
+
|
|
31
55
|
# ---------------------------------------------------------------------------
|
|
32
56
|
# Trust manifest helpers
|
|
33
57
|
# ---------------------------------------------------------------------------
|
|
@@ -420,6 +444,9 @@ def load_plugin_callbacks() -> dict[str, list[str]]:
|
|
|
420
444
|
NOTE: This function is idempotent - calling it multiple times will only
|
|
421
445
|
load plugins once. Subsequent calls return empty lists.
|
|
422
446
|
"""
|
|
447
|
+
# Clean stale __pycache__ to prevent import ghosts from renames
|
|
448
|
+
_clean_stale_pycache(Path(__file__).parent)
|
|
449
|
+
|
|
423
450
|
global _PLUGINS_LOADED
|
|
424
451
|
|
|
425
452
|
# Prevent duplicate loading - plugins register callbacks at import time,
|
|
Binary file
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""Multi-Agent Delegation Manager — supervisor agent with sub-agent delegation."""
|
|
2
|
+
|
|
3
|
+
from code_muse.plugins.delegation_manager.delegation_manager import DelegationManager
|
|
4
|
+
from code_muse.plugins.delegation_manager.supervisor_agent import SupervisorAgent
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def get_delegation_manager() -> DelegationManager:
|
|
8
|
+
"""Get the singleton DelegationManager instance."""
|
|
9
|
+
from code_muse.plugins.delegation_manager.register_callbacks import _get_manager
|
|
10
|
+
|
|
11
|
+
return _get_manager()
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def get_supervisor_agent() -> SupervisorAgent:
|
|
15
|
+
"""Get a fresh SupervisorAgent instance."""
|
|
16
|
+
return SupervisorAgent()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
__all__ = [
|
|
20
|
+
"DelegationManager",
|
|
21
|
+
"SupervisorAgent",
|
|
22
|
+
"get_delegation_manager",
|
|
23
|
+
"get_supervisor_agent",
|
|
24
|
+
]
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"""Delegation Manager — creates isolated sub-agent runs with caching.
|
|
2
|
+
|
|
3
|
+
The DelegationManager is the engine behind the Supervisor agent. It:
|
|
4
|
+
|
|
5
|
+
1. Dynamically builds delegation tool functions (one per available agent).
|
|
6
|
+
2. Caches sub-agent results to avoid re-running identical tasks.
|
|
7
|
+
3. Tracks active tasks and provides graceful error handling.
|
|
8
|
+
|
|
9
|
+
Sub-agents are **fully isolated** — they receive only the task + context
|
|
10
|
+
that the supervisor explicitly provides. No conversation history is passed.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import asyncio
|
|
14
|
+
import hashlib
|
|
15
|
+
import json
|
|
16
|
+
import logging
|
|
17
|
+
import threading
|
|
18
|
+
from typing import Any, Callable
|
|
19
|
+
|
|
20
|
+
from pydantic_ai import Agent, RunContext, UsageLimits
|
|
21
|
+
|
|
22
|
+
from code_muse.config import get_message_limit
|
|
23
|
+
from code_muse.tools.subagent_context import subagent_context
|
|
24
|
+
|
|
25
|
+
logger = logging.getLogger(__name__)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class DelegationManager:
|
|
29
|
+
"""Manages creation, caching, and execution of delegation tools."""
|
|
30
|
+
|
|
31
|
+
def __init__(self) -> None:
|
|
32
|
+
self._result_cache: dict[str, str] = {}
|
|
33
|
+
self._active_tasks: dict[str, asyncio.Task] = {}
|
|
34
|
+
self._lock = threading.Lock()
|
|
35
|
+
|
|
36
|
+
def create_delegation_function(
|
|
37
|
+
self, agent_name: str, agent_config: Any
|
|
38
|
+
) -> Callable:
|
|
39
|
+
"""Create a delegation tool function for a sub-agent.
|
|
40
|
+
|
|
41
|
+
The returned function is suitable for registration as a pydantic-ai
|
|
42
|
+
tool via ``agent.tool(delegate_func)``.
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
async def delegate_to(
|
|
46
|
+
ctx: RunContext, task_description: str, context: str = ""
|
|
47
|
+
) -> str:
|
|
48
|
+
"""Delegate a task to a specialized sub-agent.
|
|
49
|
+
|
|
50
|
+
Sub-agents are ISOLATED — they receive ONLY this task + context.
|
|
51
|
+
They do NOT have access to your conversation history or prior tool
|
|
52
|
+
results.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
task_description: Clear, detailed task for the sub-agent.
|
|
56
|
+
context: ALL context the sub-agent needs (file paths, code
|
|
57
|
+
snippets, error messages, etc.) since they're isolated from
|
|
58
|
+
conversation.
|
|
59
|
+
"""
|
|
60
|
+
cache_key = self._make_cache_key(agent_name, task_description, context)
|
|
61
|
+
|
|
62
|
+
# Check cache first
|
|
63
|
+
cached = self._get_cached(cache_key)
|
|
64
|
+
if cached is not None:
|
|
65
|
+
return cached
|
|
66
|
+
|
|
67
|
+
# Execute sub-agent
|
|
68
|
+
result = await self._run_subagent(
|
|
69
|
+
agent_name, task_description, context, cache_key
|
|
70
|
+
)
|
|
71
|
+
return result
|
|
72
|
+
|
|
73
|
+
# Fix up metadata so pydantic-ai schema generation is clean
|
|
74
|
+
safe_name = agent_name.replace("-", "_")
|
|
75
|
+
delegate_to.__name__ = f"delegate_to_{safe_name}"
|
|
76
|
+
delegate_to.__doc__ = (
|
|
77
|
+
f"Delegate a task to the {agent_name} sub-agent. "
|
|
78
|
+
f"The sub-agent is isolated — it only receives the task + context you provide.\n\n"
|
|
79
|
+
f"Args:\n"
|
|
80
|
+
f" task_description: The task to perform\n"
|
|
81
|
+
f" context: All relevant context (file paths, code, errors, etc.)"
|
|
82
|
+
)
|
|
83
|
+
return delegate_to
|
|
84
|
+
|
|
85
|
+
# ------------------------------------------------------------------
|
|
86
|
+
# Cache helpers
|
|
87
|
+
# ------------------------------------------------------------------
|
|
88
|
+
|
|
89
|
+
def _make_cache_key(self, agent_name: str, task: str, context: str) -> str:
|
|
90
|
+
raw = f"{agent_name}:{task}:{context}"
|
|
91
|
+
return hashlib.sha256(raw.encode()).hexdigest()[:32]
|
|
92
|
+
|
|
93
|
+
def _get_cached(self, cache_key: str) -> str | None:
|
|
94
|
+
with self._lock:
|
|
95
|
+
return self._result_cache.get(cache_key)
|
|
96
|
+
|
|
97
|
+
def _cache_result(self, cache_key: str, result: str) -> None:
|
|
98
|
+
with self._lock:
|
|
99
|
+
self._result_cache[cache_key] = result
|
|
100
|
+
|
|
101
|
+
# ------------------------------------------------------------------
|
|
102
|
+
# Sub-agent execution
|
|
103
|
+
# ------------------------------------------------------------------
|
|
104
|
+
|
|
105
|
+
async def _run_subagent(
|
|
106
|
+
self, agent_name: str, task_desc: str, context: str, cache_key: str
|
|
107
|
+
) -> str:
|
|
108
|
+
"""Invoke the sub-agent using Muse's agent construction pattern.
|
|
109
|
+
|
|
110
|
+
Mimics ``code_muse/tools/agent_tools.py::invoke_agent`` but with
|
|
111
|
+
**full isolation**: no message history, no prior context, no
|
|
112
|
+
session persistence.
|
|
113
|
+
"""
|
|
114
|
+
from code_muse.agents.agent_manager import load_agent
|
|
115
|
+
from code_muse.model_factory import ModelFactory, make_model_settings
|
|
116
|
+
from code_muse.tools import register_tools_for_agent
|
|
117
|
+
|
|
118
|
+
try:
|
|
119
|
+
# Load sub-agent config
|
|
120
|
+
sub_agent_config = load_agent(agent_name)
|
|
121
|
+
|
|
122
|
+
# Build prompt with full context (no history = isolated)
|
|
123
|
+
instructions = sub_agent_config.get_full_system_prompt()
|
|
124
|
+
|
|
125
|
+
# Load muse rules if available
|
|
126
|
+
try:
|
|
127
|
+
from code_muse.agents._builder import load_muse_rules
|
|
128
|
+
|
|
129
|
+
rules = load_muse_rules()
|
|
130
|
+
if rules:
|
|
131
|
+
instructions += f"\n\n{rules}"
|
|
132
|
+
except ImportError:
|
|
133
|
+
pass
|
|
134
|
+
|
|
135
|
+
# Load prompt additions from plugins
|
|
136
|
+
try:
|
|
137
|
+
from code_muse import callbacks
|
|
138
|
+
|
|
139
|
+
prompt_additions = callbacks.on_load_prompt()
|
|
140
|
+
if prompt_additions:
|
|
141
|
+
instructions += "\n" + "\n".join(prompt_additions)
|
|
142
|
+
except Exception:
|
|
143
|
+
pass
|
|
144
|
+
|
|
145
|
+
# Create temporary pydantic-ai agent
|
|
146
|
+
model_name = sub_agent_config.get_model_name()
|
|
147
|
+
models_config = ModelFactory.load_config()
|
|
148
|
+
model = ModelFactory.get_model(model_name, models_config)
|
|
149
|
+
|
|
150
|
+
model_settings = make_model_settings(model_name)
|
|
151
|
+
|
|
152
|
+
temp_agent = Agent(
|
|
153
|
+
model=model,
|
|
154
|
+
instructions=instructions,
|
|
155
|
+
output_type=str,
|
|
156
|
+
retries=2,
|
|
157
|
+
model_settings=model_settings,
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
# Register tools for the sub-agent
|
|
161
|
+
agent_tools = sub_agent_config.get_available_tools()
|
|
162
|
+
register_tools_for_agent(temp_agent, agent_tools, model_name=model_name)
|
|
163
|
+
|
|
164
|
+
# Build the combined prompt
|
|
165
|
+
prompt = f"## Task\n\n{task_desc}\n\n## Context\n\n{context}"
|
|
166
|
+
|
|
167
|
+
# Run the sub-agent with isolation
|
|
168
|
+
with subagent_context(agent_name):
|
|
169
|
+
result = await temp_agent.run(
|
|
170
|
+
prompt,
|
|
171
|
+
message_history=[], # ISOLATED — no history!
|
|
172
|
+
usage_limits=UsageLimits(request_limit=get_message_limit()),
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
response = result.output if result.output else ""
|
|
176
|
+
self._cache_result(cache_key, response)
|
|
177
|
+
return response
|
|
178
|
+
|
|
179
|
+
except Exception as e:
|
|
180
|
+
logger.warning(f"Sub-agent {agent_name} failed: {e}")
|
|
181
|
+
error_msg = f"Error in {agent_name} sub-agent: {type(e).__name__}: {e}"
|
|
182
|
+
self._cache_result(cache_key, error_msg)
|
|
183
|
+
return error_msg
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"""Register delegation manager callbacks.
|
|
2
|
+
|
|
3
|
+
Registers:
|
|
4
|
+
- Supervisor agent via register_agents hook
|
|
5
|
+
- Delegation tools via register_tools hook
|
|
6
|
+
- /supervisor command for easy activation
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import logging
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from code_muse.callbacks import register_callback
|
|
13
|
+
from code_muse.messaging import emit_info, emit_success
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
# Lazy manager singleton
|
|
18
|
+
_manager = None
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _get_manager():
|
|
22
|
+
global _manager
|
|
23
|
+
if _manager is None:
|
|
24
|
+
from code_muse.plugins.delegation_manager.delegation_manager import (
|
|
25
|
+
DelegationManager,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
_manager = DelegationManager()
|
|
29
|
+
return _manager
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _register_agents():
|
|
33
|
+
"""Register the supervisor agent."""
|
|
34
|
+
from code_muse.plugins.delegation_manager.supervisor_agent import SupervisorAgent
|
|
35
|
+
|
|
36
|
+
return [{"name": "supervisor", "class": SupervisorAgent}]
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _register_delegation_tools() -> list[dict[str, Any]]:
|
|
40
|
+
"""Dynamically create delegation tools for all available agents."""
|
|
41
|
+
from code_muse.agents.agent_manager import load_agent
|
|
42
|
+
from code_muse.agents import get_available_agents
|
|
43
|
+
|
|
44
|
+
manager = _get_manager()
|
|
45
|
+
|
|
46
|
+
tools = []
|
|
47
|
+
agents = get_available_agents()
|
|
48
|
+
|
|
49
|
+
for agent_name in agents:
|
|
50
|
+
# Skip self
|
|
51
|
+
if agent_name == "supervisor":
|
|
52
|
+
continue
|
|
53
|
+
# Create delegation function using the manager
|
|
54
|
+
try:
|
|
55
|
+
agent_config = load_agent(agent_name)
|
|
56
|
+
delegate_func = manager.create_delegation_function(agent_name, agent_config)
|
|
57
|
+
tool_name = f"delegate_to_{agent_name.replace('-', '_')}"
|
|
58
|
+
tools.append(
|
|
59
|
+
{
|
|
60
|
+
"name": tool_name,
|
|
61
|
+
"register_func": lambda a, f=delegate_func: a.tool(f),
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
except Exception as e:
|
|
65
|
+
logger.warning(
|
|
66
|
+
f"Could not create delegation tool for {agent_name}: {e}"
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
return tools
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _on_custom_command_help():
|
|
73
|
+
return [
|
|
74
|
+
(
|
|
75
|
+
"supervisor",
|
|
76
|
+
"Switch to Supervisor agent for multi-agent task orchestration",
|
|
77
|
+
),
|
|
78
|
+
]
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
async def _on_custom_command(command: str, name: str):
|
|
82
|
+
if name != "supervisor":
|
|
83
|
+
return None
|
|
84
|
+
|
|
85
|
+
from code_muse.agents.agent_manager import set_current_agent
|
|
86
|
+
|
|
87
|
+
success = set_current_agent("supervisor")
|
|
88
|
+
if success:
|
|
89
|
+
emit_success(
|
|
90
|
+
"Switched to Supervisor agent. I can delegate tasks to specialized sub-agents!"
|
|
91
|
+
)
|
|
92
|
+
else:
|
|
93
|
+
emit_info("Could not find Supervisor agent.")
|
|
94
|
+
return True
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def _on_startup():
|
|
98
|
+
"""Pre-warm the manager on startup."""
|
|
99
|
+
_get_manager()
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
# Register all callbacks
|
|
103
|
+
register_callback("startup", _on_startup)
|
|
104
|
+
register_callback("register_agents", _register_agents)
|
|
105
|
+
register_callback("register_tools", _register_delegation_tools)
|
|
106
|
+
register_callback("custom_command_help", _on_custom_command_help)
|
|
107
|
+
register_callback("custom_command", _on_custom_command)
|
|
108
|
+
|
|
109
|
+
logger.debug("Delegation Manager plugin callbacks registered")
|