code-muse 0.1.0__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.0 → code_muse-0.1.3}/PKG-INFO +1 -1
- code_muse-0.1.3/code_muse/__init__.py +87 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/_compaction.py +116 -5
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/_history.py +8 -1
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/fs_scan_cache/scan_cache_core.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/hook_engine/registry.py +1 -1
- {code_muse-0.1.0 → 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.0 → code_muse-0.1.3}/code_muse/models_cache/sha256_hash.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/__init__.py +27 -0
- code_muse-0.1.3/code_muse/plugins/auto_review/__init__.py +6 -0
- code_muse-0.1.3/code_muse/plugins/auto_review/cache.py +33 -0
- code_muse-0.1.3/code_muse/plugins/auto_review/config.py +35 -0
- code_muse-0.1.3/code_muse/plugins/auto_review/register_callbacks.py +122 -0
- code_muse-0.1.3/code_muse/plugins/auto_review/review_prompt.py +23 -0
- code_muse-0.1.3/code_muse/plugins/auto_review/reviewer.py +314 -0
- code_muse-0.1.3/code_muse/plugins/auto_review/visibility.py +45 -0
- {code_muse-0.1.0 → 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.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/ast_compressor.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/code.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/git.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/lint.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → 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.0 → code_muse-0.1.3}/code_muse/security/redaction.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/stream_parser/tagged_line_parser.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/stream_parser/utf8_stream_parser.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/terminal_utils.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/pyproject.toml +1 -1
- code_muse-0.1.0/code_muse/__init__.py +0 -26
- code_muse-0.1.0/code_muse/models.json +0 -66
- code_muse-0.1.0/code_muse/plugins/autonomous_memory/bm25_scorer.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse-0.1.0/code_muse/plugins/filter_engine/strategies/ast_compressor.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse-0.1.0/code_muse/plugins/filter_engine/strategies/code.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse-0.1.0/code_muse/plugins/filter_engine/strategies/git.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse-0.1.0/code_muse/plugins/filter_engine/strategies/json_compressor.cpython-314-darwin.so +0 -0
- code_muse-0.1.0/code_muse/plugins/filter_engine/strategies/json_patterns.cpython-314-darwin.so +0 -0
- code_muse-0.1.0/code_muse/plugins/filter_engine/strategies/lint.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse-0.1.0/code_muse/plugins/filter_engine/strategies/test.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse-0.1.0/code_muse/security/redaction.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse-0.1.0/code_muse/terminal_utils.cpython-314-x86_64-linux-gnu.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/.gitignore +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/LICENSE +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/README.md +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/__main__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/_builder.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/_diagnostics.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/_key_listeners.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/_non_streaming_render.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/_runtime.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/agent_creator_agent.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/agent_helios.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/agent_manager.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/agent_muse.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/agent_planning.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/agent_qa_iris.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/base_agent.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/event_stream_handler.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/json_agent.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/prompt_v3.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/subagent_stream_handler.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/chatgpt_codex_client.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/claude_cache_client.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/cli_runner/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/cli_runner/args.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/cli_runner/loop.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/cli_runner/resume.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/cli_runner/runner.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/add_model_menu.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/agent_menu.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/attachments.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/autosave_menu.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/clipboard.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/colors_menu.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/command_handler.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/command_registry.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/config_commands.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/core_commands.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/diff_menu.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/file_path_completion.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/load_context_completion.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/model_picker_completion.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/model_settings_menu.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/onboarding_slides.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/onboarding_wizard.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/pagination.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/pin_command_completion.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/prompt_toolkit_completion.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/session_commands.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/shell_passthrough.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/skills_completion.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/types.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/uc_menu.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/utils.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/wiggum_state.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/config.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/config_agent.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/config_appearance.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/config_model.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/config_security.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/error_logging.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/evals/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/evals/eval_helpers.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/evals/eval_runner.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/evals/sample_evals/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/evals/sample_evals/eval_frugal_reads.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/evals/sample_evals/eval_memory_planning.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/evals/sample_evals/eval_shell_efficiency.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/evals/sample_evals/eval_tool_masking.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/fs_scan_cache/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/fs_scan_cache/invalidation_hooks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/fs_scan_cache/scan_cache_core.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/fs_scan_cache/tool_integration.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/fs_scan_cache/ttl_policy.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/gemini_code_assist.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/gemini_model.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/hook_engine/README.md +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/hook_engine/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/hook_engine/aliases.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/hook_engine/engine.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/hook_engine/executor.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/hook_engine/matcher.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/hook_engine/models.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/hook_engine/trust.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/http_utils.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/keymap.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/list_filtering.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/main.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/bus.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/commands.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/markdown_patches.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/message_queue.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/messages.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/queue_console.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/renderers.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/rich_renderer.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/shimmer.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/spinner/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/spinner/console_spinner.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/spinner/spinner_base.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/subagent_console.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/model_factory.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/model_switching.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/model_utils.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/models_cache/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/models_cache/blocking_lru_cache.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/models_cache/cache_writer.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/models_cache/sha256_hash.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/models_cache/startup_integration.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/models_dev_api.json +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/models_dev_parser.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/motion.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/config.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/discovery.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/downloader.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/installer.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/metadata.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/prompt_builder.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/remote_catalog.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/skill_catalog.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/skills_install_menu.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/skills_menu.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/bm25_scorer.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/consolidation.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/extraction.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/lease_lock.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/memory_injection.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/secret_scanner.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/session_scanner.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/aws_bedrock/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/aws_bedrock/config.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/aws_bedrock/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/aws_bedrock/utils.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/README.md +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/config.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/discovery.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/token.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/utils.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/build_filter/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/build_filter/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/build_filter/strategies/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/build_filter/strategies/build.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/config.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/oauth_flow.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/test_plugin.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/utils.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/checkpointing/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/checkpointing/checkpoint_hook.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/checkpointing/conversation_snapshots.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/checkpointing/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/checkpointing/restore_command.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/checkpointing/rewind_shortcut.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/checkpointing/shadow_git.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_hooks/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_hooks/config.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_hooks/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/README.md +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/SETUP.md +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/config.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/fast_mode.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/prompt_handler.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/test_fast_mode.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/test_plugin.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/utils.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/copilot_auth/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/copilot_auth/config.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/copilot_auth/reasoning_client.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/copilot_auth/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/copilot_auth/utils.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/custom_commands/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/custom_commands/args_injection.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/custom_commands/command_discovery.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/custom_commands/command_toml_schema.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/custom_commands/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/customizable_commands/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/customizable_commands/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/destructive_command_guard/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/destructive_command_guard/detector.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/destructive_command_guard/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/example_custom_command/README.md +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/example_custom_command/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/file_permission_handler/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/file_permission_handler/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/classifier.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/content_detector.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/dispatcher.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/registry.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/ast_compressor.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/ast_parser.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/code.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/git.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/json_compressor.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/json_patterns.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/lint.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/test.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/verbosity.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/force_push_guard/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/force_push_guard/detector.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/force_push_guard/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/force_push_guard/test_detector.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/frontend_emitter/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/frontend_emitter/emitter.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/frontend_emitter/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/gac/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/gac/git_ops.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/gac/prompt.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/gac/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/hook_creator/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/hook_creator/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/hook_manager/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/hook_manager/config.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/hook_manager/hooks_menu.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/hook_manager/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/hook_monitor/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/mindpack/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/mindpack/factory.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/mindpack/judge.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/mindpack/memory.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/mindpack/mindpack_menu.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/mindpack/orchestration.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/mindpack/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/mindpack/schemas.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/mindpack/tools.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/oauth_muse_html.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/ollama_setup/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/ollama_setup/completer.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/ollama_setup/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/plan_command/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/plan_command/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/plan_mode/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/plan_mode/mode_cycling.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/plan_mode/plan_generation.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/plan_mode/plan_hooks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/plan_mode/plan_mode_tools.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/plan_mode/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/plugin_trust/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/policy_engine/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/policy_engine/approval_flow_integration.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/policy_engine/policy_evaluator.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/policy_engine/policy_file_discovery.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/policy_engine/policy_toml_schema.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/policy_engine/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/pop_command/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/pop_command/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/prompt_newline/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/prompt_newline/config.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/prompt_newline/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/safety_status/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/safety_status/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/semantic_compression/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/semantic_compression/compressor.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/semantic_compression/config.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/semantic_compression/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/shell_minimizer/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/shell_minimizer/builtin_filters.toml +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/shell_minimizer/pipeline.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/shell_minimizer/primitives.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/shell_minimizer/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/shell_safety/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/shell_safety/agent_shell_safety.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/shell_safety/command_cache.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/shell_safety/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/synthetic_status/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/synthetic_status/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/synthetic_status/status_api.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/token_caching/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/token_caching/cache_hit_tracking.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/token_caching/cacheable_prefix_detection.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/token_caching/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/token_caching/stats_display.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/token_tracking/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/token_tracking/database.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/token_tracking/edit_analyzer.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/token_tracking/record.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/token_tracking/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/token_tracking/reports.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/tps_meter/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/tps_meter/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/models.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/registry.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/runner.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/safety.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/sandbox.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/provider_identity.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/pydantic_patches.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/reopenable_async_client.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/round_robin_model.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/secret_storage.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/security/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/security/redaction.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/session_storage.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/status_display.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/stream_parser/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/stream_parser/assistant_text_parser.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/stream_parser/citation_parser.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/stream_parser/inline_hidden_tag_parser.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/stream_parser/proposed_plan_parser.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/stream_parser/stream_text_chunk.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/stream_parser/stream_text_parser.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/stream_parser/tagged_line_parser.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/stream_parser/utf8_stream_parser.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/summarization_agent.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/terminal_utils.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/agent_tools.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/ask_user_question/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/ask_user_question/constants.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/ask_user_question/demo_tui.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/ask_user_question/handler.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/ask_user_question/models.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/ask_user_question/registration.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/ask_user_question/renderers.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/ask_user_question/terminal_ui.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/ask_user_question/theme.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/ask_user_question/tui_loop.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/background_jobs.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/browser/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/browser/browser_control.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/browser/browser_interactions.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/browser/browser_locators.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/browser/browser_manager.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/browser/browser_navigation.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/browser/browser_screenshot.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/browser/browser_scripts.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/browser/browser_workflows.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/chrome_cdp/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/chrome_cdp/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/command_runner.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/common.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/display.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/file_modifications.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/file_operations.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/image_tools.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/meetin_proxy/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/meetin_proxy/capture_addon.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/meetin_proxy/proxy_manager.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/meetin_proxy/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/path_policy.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/skills_tools.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/subagent_context.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/tools_content.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/universal_constructor.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/uvx_detection.py +0 -0
- {code_muse-0.1.0 → 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.0 → 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.0 → 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,
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"""Auto-Review plugin — second-agent review of file changes.
|
|
2
|
+
|
|
3
|
+
Hooks into ``post_tool_call`` to automatically review file modifications
|
|
4
|
+
using a separate LLM call. Displays visible review status so the user always
|
|
5
|
+
knows when a review is happening and what was found.
|
|
6
|
+
"""
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""In-memory cache for auto-review results."""
|
|
2
|
+
|
|
3
|
+
import hashlib
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class ReviewCache:
|
|
7
|
+
"""Simple cache keyed by SHA256(file_path + content_hash)."""
|
|
8
|
+
|
|
9
|
+
def __init__(self) -> None:
|
|
10
|
+
self._cache: dict[str, dict] = {}
|
|
11
|
+
|
|
12
|
+
def _key(self, file_path: str, content_hash: str) -> str:
|
|
13
|
+
return hashlib.sha256(f"{file_path}::{content_hash}".encode()).hexdigest()
|
|
14
|
+
|
|
15
|
+
def get(self, file_path: str, content_hash: str) -> dict | None:
|
|
16
|
+
"""Return cached review result or None."""
|
|
17
|
+
return self._cache.get(self._key(file_path, content_hash))
|
|
18
|
+
|
|
19
|
+
def set(self, file_path: str, content_hash: str, result: dict) -> None:
|
|
20
|
+
"""Store a review result in the cache."""
|
|
21
|
+
self._cache[self._key(file_path, content_hash)] = result
|
|
22
|
+
|
|
23
|
+
def clear(self) -> None:
|
|
24
|
+
"""Clear all cached entries."""
|
|
25
|
+
self._cache.clear()
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
_review_cache = ReviewCache()
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def get_review_cache() -> ReviewCache:
|
|
32
|
+
"""Return the module-level ReviewCache singleton."""
|
|
33
|
+
return _review_cache
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""Configuration accessors for the Auto-Review plugin."""
|
|
2
|
+
|
|
3
|
+
from code_muse.config import get_value
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def is_auto_review_enabled() -> bool:
|
|
7
|
+
"""Check if auto-review is enabled (default: True)."""
|
|
8
|
+
val = get_value("auto_review_enabled")
|
|
9
|
+
if val is None:
|
|
10
|
+
return True
|
|
11
|
+
return str(val).lower() in ("1", "true", "yes", "on")
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def get_auto_review_model() -> str | None:
|
|
15
|
+
"""Get the model to use for auto-review, or None to use the global model."""
|
|
16
|
+
return get_value("auto_review_model")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def get_auto_review_mode() -> str:
|
|
20
|
+
"""Get the review mode: 'background' or 'blocking' (default: 'background')."""
|
|
21
|
+
val = get_value("auto_review_mode")
|
|
22
|
+
if val and val.strip().lower() in ("background", "blocking"):
|
|
23
|
+
return val.strip().lower()
|
|
24
|
+
return "background"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def get_auto_review_min_diff_length() -> int:
|
|
28
|
+
"""Minimum diff length (in characters) to trigger a review (default: 10)."""
|
|
29
|
+
val = get_value("auto_review_min_diff_length")
|
|
30
|
+
if val is not None:
|
|
31
|
+
try:
|
|
32
|
+
return max(0, int(val))
|
|
33
|
+
except (ValueError, TypeError):
|
|
34
|
+
pass
|
|
35
|
+
return 10
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"""Callback registration for the Auto-Review plugin.
|
|
2
|
+
|
|
3
|
+
Registers:
|
|
4
|
+
- ``post_tool_call`` hook — automatically reviews file changes
|
|
5
|
+
- ``request_code_review`` tool — manual review trigger
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import logging
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from code_muse.callbacks import register_callback
|
|
12
|
+
from code_muse.plugins.auto_review.reviewer import (
|
|
13
|
+
request_manual_review,
|
|
14
|
+
run_auto_review,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# ---------------------------------------------------------------------------
|
|
21
|
+
# post_tool_call hook
|
|
22
|
+
# ---------------------------------------------------------------------------
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
async def _on_post_tool_call(
|
|
26
|
+
tool_name: str,
|
|
27
|
+
tool_args: dict,
|
|
28
|
+
result: dict,
|
|
29
|
+
duration_ms: float,
|
|
30
|
+
context: Any = None,
|
|
31
|
+
) -> None:
|
|
32
|
+
"""Review file changes after tool execution."""
|
|
33
|
+
try:
|
|
34
|
+
await run_auto_review(tool_name, tool_args, result)
|
|
35
|
+
except Exception as exc:
|
|
36
|
+
logger.error("Auto-review hook failed: %s", exc, exc_info=True)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# ---------------------------------------------------------------------------
|
|
40
|
+
# Tool registration
|
|
41
|
+
# ---------------------------------------------------------------------------
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _register_review_tools() -> list[dict]:
|
|
45
|
+
"""Return tool definitions for the auto-review plugin."""
|
|
46
|
+
|
|
47
|
+
def register_request_code_review(agent):
|
|
48
|
+
"""Register the request_code_review tool on an agent."""
|
|
49
|
+
|
|
50
|
+
@agent.tool
|
|
51
|
+
async def request_code_review(
|
|
52
|
+
context,
|
|
53
|
+
file_path: str = "",
|
|
54
|
+
reason: str | None = None,
|
|
55
|
+
) -> dict:
|
|
56
|
+
"""Request a code review for a specific file.
|
|
57
|
+
|
|
58
|
+
The reviewer analyzes the file for correctness, safety, style,
|
|
59
|
+
edge cases, and completeness. Returns structured feedback.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
file_path: Path to the file to review
|
|
63
|
+
reason: Optional focus area for the review \
|
|
64
|
+
(e.g., "security", "performance")
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
Dict with verdict, summary, issues, and suggestion
|
|
68
|
+
"""
|
|
69
|
+
return await request_manual_review(file_path, reason)
|
|
70
|
+
|
|
71
|
+
return [
|
|
72
|
+
{
|
|
73
|
+
"name": "request_code_review",
|
|
74
|
+
"register_func": register_request_code_review,
|
|
75
|
+
},
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# ---------------------------------------------------------------------------
|
|
80
|
+
# Help entry
|
|
81
|
+
# ---------------------------------------------------------------------------
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _on_custom_command_help() -> list[tuple[str, str]]:
|
|
85
|
+
return [
|
|
86
|
+
("review <path>", "Request an auto-review for a specific file"),
|
|
87
|
+
]
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _on_custom_command(command: str, name: str) -> bool | None:
|
|
91
|
+
"""Handle ``/review <path>`` command."""
|
|
92
|
+
if name == "review":
|
|
93
|
+
parts = command.split(maxsplit=1)
|
|
94
|
+
file_path = parts[1].strip() if len(parts) > 1 else ""
|
|
95
|
+
if not file_path:
|
|
96
|
+
from code_muse.messaging import emit_warning
|
|
97
|
+
|
|
98
|
+
emit_warning("Usage: /review <file_path>")
|
|
99
|
+
return True
|
|
100
|
+
|
|
101
|
+
import asyncio
|
|
102
|
+
|
|
103
|
+
try:
|
|
104
|
+
loop = asyncio.get_running_loop()
|
|
105
|
+
loop.create_task(request_manual_review(file_path))
|
|
106
|
+
except RuntimeError:
|
|
107
|
+
asyncio.run(request_manual_review(file_path))
|
|
108
|
+
|
|
109
|
+
return True
|
|
110
|
+
return None
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
# ---------------------------------------------------------------------------
|
|
114
|
+
# Register all callbacks
|
|
115
|
+
# ---------------------------------------------------------------------------
|
|
116
|
+
|
|
117
|
+
register_callback("post_tool_call", _on_post_tool_call)
|
|
118
|
+
register_callback("register_tools", _register_review_tools)
|
|
119
|
+
register_callback("custom_command_help", _on_custom_command_help)
|
|
120
|
+
register_callback("custom_command", _on_custom_command)
|
|
121
|
+
|
|
122
|
+
logger.debug("Auto-Review plugin callbacks registered")
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""Reviewer system prompt templates."""
|
|
2
|
+
|
|
3
|
+
REVIEWER_SYSTEM_PROMPT = """\
|
|
4
|
+
You are a code reviewer. Review the following file change and \
|
|
5
|
+
provide structured feedback.
|
|
6
|
+
|
|
7
|
+
Evaluate:
|
|
8
|
+
1. CORRECTNESS — Does the change achieve its apparent goal? Any bugs?
|
|
9
|
+
2. SAFETY — Could this change introduce security issues, data loss, or breakage?
|
|
10
|
+
3. STYLE — Does it follow best practices for the language/framework?
|
|
11
|
+
4. EDGE CASES — Are there inputs or states where this fails?
|
|
12
|
+
5. COMPLETENESS — Is the change self-contained? Missing imports, error handling, tests?
|
|
13
|
+
|
|
14
|
+
Be concise. Focus on actionable issues. If the change looks good, say so.
|
|
15
|
+
|
|
16
|
+
Return your review as JSON with:
|
|
17
|
+
{
|
|
18
|
+
"verdict": "approved" | "flagged" | "rejected",
|
|
19
|
+
"summary": "One-line summary of findings",
|
|
20
|
+
"issues": ["list of specific issues, or empty list"],
|
|
21
|
+
"suggestion": "Optional improvement suggestion or null"
|
|
22
|
+
}
|
|
23
|
+
"""
|