code-muse 0.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- code_muse/__init__.py +26 -0
- code_muse/__main__.py +10 -0
- code_muse/agents/__init__.py +31 -0
- code_muse/agents/_builder.py +214 -0
- code_muse/agents/_compaction.py +506 -0
- code_muse/agents/_diagnostics.py +171 -0
- code_muse/agents/_history.py +382 -0
- code_muse/agents/_key_listeners.py +148 -0
- code_muse/agents/_non_streaming_render.py +148 -0
- code_muse/agents/_runtime.py +596 -0
- code_muse/agents/agent_creator_agent.py +603 -0
- code_muse/agents/agent_helios.py +47 -0
- code_muse/agents/agent_manager.py +740 -0
- code_muse/agents/agent_muse.py +78 -0
- code_muse/agents/agent_planning.py +44 -0
- code_muse/agents/agent_qa_melpomene.py +207 -0
- code_muse/agents/base_agent.py +194 -0
- code_muse/agents/event_stream_handler.py +361 -0
- code_muse/agents/json_agent.py +201 -0
- code_muse/agents/prompt_v3.py +521 -0
- code_muse/agents/subagent_stream_handler.py +273 -0
- code_muse/callbacks.py +941 -0
- code_muse/chatgpt_codex_client.py +333 -0
- code_muse/claude_cache_client.py +853 -0
- code_muse/cli_runner/__init__.py +319 -0
- code_muse/cli_runner/args.py +63 -0
- code_muse/cli_runner/loop.py +510 -0
- code_muse/cli_runner/resume.py +72 -0
- code_muse/cli_runner/runner.py +161 -0
- code_muse/command_line/__init__.py +1 -0
- code_muse/command_line/add_model_menu.py +1331 -0
- code_muse/command_line/agent_menu.py +674 -0
- code_muse/command_line/attachments.py +397 -0
- code_muse/command_line/autosave_menu.py +709 -0
- code_muse/command_line/clipboard.py +528 -0
- code_muse/command_line/colors_menu.py +530 -0
- code_muse/command_line/command_handler.py +262 -0
- code_muse/command_line/command_registry.py +150 -0
- code_muse/command_line/config_commands.py +711 -0
- code_muse/command_line/core_commands.py +740 -0
- code_muse/command_line/diff_menu.py +865 -0
- code_muse/command_line/file_path_completion.py +73 -0
- code_muse/command_line/load_context_completion.py +57 -0
- code_muse/command_line/model_picker_completion.py +512 -0
- code_muse/command_line/model_settings_menu.py +983 -0
- code_muse/command_line/onboarding_slides.py +162 -0
- code_muse/command_line/onboarding_wizard.py +337 -0
- code_muse/command_line/pagination.py +41 -0
- code_muse/command_line/pin_command_completion.py +329 -0
- code_muse/command_line/prompt_toolkit_completion.py +886 -0
- code_muse/command_line/session_commands.py +304 -0
- code_muse/command_line/shell_passthrough.py +145 -0
- code_muse/command_line/skills_completion.py +158 -0
- code_muse/command_line/types.py +18 -0
- code_muse/command_line/uc_menu.py +908 -0
- code_muse/command_line/utils.py +105 -0
- code_muse/command_line/wiggum_state.py +77 -0
- code_muse/config.py +1138 -0
- code_muse/config_agent.py +168 -0
- code_muse/config_appearance.py +241 -0
- code_muse/config_model.py +357 -0
- code_muse/config_security.py +73 -0
- code_muse/error_logging.py +132 -0
- code_muse/evals/__init__.py +35 -0
- code_muse/evals/eval_helpers.py +81 -0
- code_muse/evals/eval_runner.py +299 -0
- code_muse/evals/sample_evals/__init__.py +1 -0
- code_muse/evals/sample_evals/eval_frugal_reads.py +59 -0
- code_muse/evals/sample_evals/eval_memory_planning.py +31 -0
- code_muse/evals/sample_evals/eval_shell_efficiency.py +39 -0
- code_muse/evals/sample_evals/eval_tool_masking.py +33 -0
- code_muse/fs_scan_cache/__init__.py +31 -0
- code_muse/fs_scan_cache/invalidation_hooks.py +89 -0
- code_muse/fs_scan_cache/scan_cache_core.cpython-314-darwin.so +0 -0
- code_muse/fs_scan_cache/scan_cache_core.pyx +203 -0
- code_muse/fs_scan_cache/tool_integration.py +309 -0
- code_muse/fs_scan_cache/ttl_policy.py +44 -0
- code_muse/gemini_code_assist.py +383 -0
- code_muse/gemini_model.py +838 -0
- code_muse/hook_engine/README.md +105 -0
- code_muse/hook_engine/__init__.py +21 -0
- code_muse/hook_engine/aliases.py +153 -0
- code_muse/hook_engine/engine.py +221 -0
- code_muse/hook_engine/executor.py +347 -0
- code_muse/hook_engine/matcher.py +154 -0
- code_muse/hook_engine/models.py +245 -0
- code_muse/hook_engine/registry.py +114 -0
- code_muse/hook_engine/trust.py +268 -0
- code_muse/hook_engine/validator.py +144 -0
- code_muse/http_utils.py +360 -0
- code_muse/keymap.py +128 -0
- code_muse/list_filtering.py +26 -0
- code_muse/main.py +10 -0
- code_muse/messaging/__init__.py +259 -0
- code_muse/messaging/bus.py +621 -0
- code_muse/messaging/commands.py +166 -0
- code_muse/messaging/markdown_patches.py +57 -0
- code_muse/messaging/message_queue.py +397 -0
- code_muse/messaging/messages.py +591 -0
- code_muse/messaging/queue_console.py +269 -0
- code_muse/messaging/renderers.py +308 -0
- code_muse/messaging/rich_renderer.py +1158 -0
- code_muse/messaging/shimmer.py +154 -0
- code_muse/messaging/spinner/__init__.py +87 -0
- code_muse/messaging/spinner/console_spinner.py +250 -0
- code_muse/messaging/spinner/spinner_base.py +82 -0
- code_muse/messaging/subagent_console.py +458 -0
- code_muse/model_factory.py +1203 -0
- code_muse/model_switching.py +59 -0
- code_muse/model_utils.py +156 -0
- code_muse/models.json +66 -0
- code_muse/models_cache/__init__.py +26 -0
- code_muse/models_cache/blocking_lru_cache.py +98 -0
- code_muse/models_cache/cache_writer.py +86 -0
- code_muse/models_cache/sha256_hash.cpython-314-darwin.so +0 -0
- code_muse/models_cache/sha256_hash.pyx +34 -0
- code_muse/models_cache/startup_integration.py +75 -0
- code_muse/models_dev_api.json +1 -0
- code_muse/models_dev_parser.py +590 -0
- code_muse/motion.py +126 -0
- code_muse/plugins/__init__.py +471 -0
- code_muse/plugins/agent_skills/__init__.py +32 -0
- code_muse/plugins/agent_skills/config.py +176 -0
- code_muse/plugins/agent_skills/discovery.py +309 -0
- code_muse/plugins/agent_skills/downloader.py +389 -0
- code_muse/plugins/agent_skills/installer.py +19 -0
- code_muse/plugins/agent_skills/metadata.py +293 -0
- code_muse/plugins/agent_skills/prompt_builder.py +66 -0
- code_muse/plugins/agent_skills/register_callbacks.py +298 -0
- code_muse/plugins/agent_skills/remote_catalog.py +320 -0
- code_muse/plugins/agent_skills/skill_catalog.py +254 -0
- code_muse/plugins/agent_skills/skills_install_menu.py +690 -0
- code_muse/plugins/agent_skills/skills_menu.py +791 -0
- code_muse/plugins/autonomous_memory/__init__.py +39 -0
- code_muse/plugins/autonomous_memory/bm25_scorer.cpython-314-darwin.so +0 -0
- code_muse/plugins/autonomous_memory/bm25_scorer.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/plugins/autonomous_memory/bm25_scorer.pyx +291 -0
- code_muse/plugins/autonomous_memory/consolidation.py +82 -0
- code_muse/plugins/autonomous_memory/extraction.py +382 -0
- code_muse/plugins/autonomous_memory/lease_lock.py +105 -0
- code_muse/plugins/autonomous_memory/memory_injection.py +59 -0
- code_muse/plugins/autonomous_memory/register_callbacks.py +268 -0
- code_muse/plugins/autonomous_memory/secret_scanner.py +62 -0
- code_muse/plugins/autonomous_memory/session_scanner.py +163 -0
- code_muse/plugins/aws_bedrock/__init__.py +14 -0
- code_muse/plugins/aws_bedrock/config.py +99 -0
- code_muse/plugins/aws_bedrock/register_callbacks.py +241 -0
- code_muse/plugins/aws_bedrock/utils.py +153 -0
- code_muse/plugins/azure_foundry/README.md +238 -0
- code_muse/plugins/azure_foundry/__init__.py +15 -0
- code_muse/plugins/azure_foundry/config.py +125 -0
- code_muse/plugins/azure_foundry/discovery.py +187 -0
- code_muse/plugins/azure_foundry/register_callbacks.py +495 -0
- code_muse/plugins/azure_foundry/token.py +180 -0
- code_muse/plugins/azure_foundry/utils.py +345 -0
- code_muse/plugins/build_filter/__init__.py +1 -0
- code_muse/plugins/build_filter/register_callbacks.py +201 -0
- code_muse/plugins/build_filter/strategies/__init__.py +1 -0
- code_muse/plugins/build_filter/strategies/build.py +397 -0
- code_muse/plugins/chatgpt_oauth/__init__.py +6 -0
- code_muse/plugins/chatgpt_oauth/config.py +52 -0
- code_muse/plugins/chatgpt_oauth/oauth_flow.py +338 -0
- code_muse/plugins/chatgpt_oauth/register_callbacks.py +172 -0
- code_muse/plugins/chatgpt_oauth/test_plugin.py +301 -0
- code_muse/plugins/chatgpt_oauth/utils.py +538 -0
- code_muse/plugins/checkpointing/__init__.py +29 -0
- code_muse/plugins/checkpointing/checkpoint_hook.py +51 -0
- code_muse/plugins/checkpointing/conversation_snapshots.py +117 -0
- code_muse/plugins/checkpointing/register_callbacks.py +51 -0
- code_muse/plugins/checkpointing/restore_command.py +263 -0
- code_muse/plugins/checkpointing/rewind_shortcut.py +88 -0
- code_muse/plugins/checkpointing/shadow_git.py +90 -0
- code_muse/plugins/claude_code_hooks/__init__.py +1 -0
- code_muse/plugins/claude_code_hooks/config.py +188 -0
- code_muse/plugins/claude_code_hooks/register_callbacks.py +208 -0
- code_muse/plugins/claude_code_oauth/README.md +167 -0
- code_muse/plugins/claude_code_oauth/SETUP.md +93 -0
- code_muse/plugins/claude_code_oauth/__init__.py +25 -0
- code_muse/plugins/claude_code_oauth/config.py +52 -0
- code_muse/plugins/claude_code_oauth/fast_mode.py +124 -0
- code_muse/plugins/claude_code_oauth/prompt_handler.py +63 -0
- code_muse/plugins/claude_code_oauth/register_callbacks.py +547 -0
- code_muse/plugins/claude_code_oauth/test_fast_mode.py +165 -0
- code_muse/plugins/claude_code_oauth/test_plugin.py +283 -0
- code_muse/plugins/claude_code_oauth/token_refresh_heartbeat.py +237 -0
- code_muse/plugins/claude_code_oauth/utils.py +664 -0
- code_muse/plugins/copilot_auth/__init__.py +11 -0
- code_muse/plugins/copilot_auth/config.py +91 -0
- code_muse/plugins/copilot_auth/reasoning_client.py +409 -0
- code_muse/plugins/copilot_auth/register_callbacks.py +461 -0
- code_muse/plugins/copilot_auth/utils.py +584 -0
- code_muse/plugins/custom_commands/__init__.py +14 -0
- code_muse/plugins/custom_commands/args_injection.py +82 -0
- code_muse/plugins/custom_commands/command_discovery.py +89 -0
- code_muse/plugins/custom_commands/command_toml_schema.py +71 -0
- code_muse/plugins/custom_commands/register_callbacks.py +176 -0
- code_muse/plugins/customizable_commands/__init__.py +0 -0
- code_muse/plugins/customizable_commands/register_callbacks.py +136 -0
- code_muse/plugins/destructive_command_guard/__init__.py +14 -0
- code_muse/plugins/destructive_command_guard/detector.py +375 -0
- code_muse/plugins/destructive_command_guard/register_callbacks.py +148 -0
- code_muse/plugins/example_custom_command/README.md +280 -0
- code_muse/plugins/example_custom_command/register_callbacks.py +51 -0
- code_muse/plugins/file_permission_handler/__init__.py +4 -0
- code_muse/plugins/file_permission_handler/register_callbacks.py +441 -0
- code_muse/plugins/filter_engine/__init__.py +30 -0
- code_muse/plugins/filter_engine/classifier.py +153 -0
- code_muse/plugins/filter_engine/content_detector.py +184 -0
- code_muse/plugins/filter_engine/dispatcher.py +244 -0
- code_muse/plugins/filter_engine/register_callbacks.py +188 -0
- code_muse/plugins/filter_engine/registry.py +279 -0
- code_muse/plugins/filter_engine/strategies/__init__.py +8 -0
- code_muse/plugins/filter_engine/strategies/ast_compressor.cpython-314-darwin.so +0 -0
- code_muse/plugins/filter_engine/strategies/ast_compressor.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/plugins/filter_engine/strategies/ast_compressor.pyx +348 -0
- code_muse/plugins/filter_engine/strategies/ast_parser.py +167 -0
- code_muse/plugins/filter_engine/strategies/code.cpython-314-darwin.so +0 -0
- code_muse/plugins/filter_engine/strategies/code.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/plugins/filter_engine/strategies/code.pyx +584 -0
- code_muse/plugins/filter_engine/strategies/git.cpython-314-darwin.so +0 -0
- code_muse/plugins/filter_engine/strategies/git.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/plugins/filter_engine/strategies/git.pyx +438 -0
- code_muse/plugins/filter_engine/strategies/json_compressor.cpython-314-darwin.so +0 -0
- code_muse/plugins/filter_engine/strategies/json_compressor.pyx +253 -0
- code_muse/plugins/filter_engine/strategies/json_patterns.cpython-314-darwin.so +0 -0
- code_muse/plugins/filter_engine/strategies/json_patterns.pyx +178 -0
- code_muse/plugins/filter_engine/strategies/lint.cpython-314-darwin.so +0 -0
- code_muse/plugins/filter_engine/strategies/lint.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/plugins/filter_engine/strategies/lint.pyx +626 -0
- code_muse/plugins/filter_engine/strategies/test.cpython-314-darwin.so +0 -0
- code_muse/plugins/filter_engine/strategies/test.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/plugins/filter_engine/strategies/test.pyx +431 -0
- code_muse/plugins/filter_engine/verbosity.py +63 -0
- code_muse/plugins/force_push_guard/__init__.py +5 -0
- code_muse/plugins/force_push_guard/detector.py +96 -0
- code_muse/plugins/force_push_guard/register_callbacks.py +144 -0
- code_muse/plugins/force_push_guard/test_detector.py +143 -0
- code_muse/plugins/frontend_emitter/__init__.py +25 -0
- code_muse/plugins/frontend_emitter/emitter.py +121 -0
- code_muse/plugins/frontend_emitter/register_callbacks.py +259 -0
- code_muse/plugins/gac/__init__.py +4 -0
- code_muse/plugins/gac/git_ops.py +136 -0
- code_muse/plugins/gac/prompt.py +191 -0
- code_muse/plugins/gac/register_callbacks.py +82 -0
- code_muse/plugins/hook_creator/__init__.py +1 -0
- code_muse/plugins/hook_creator/register_callbacks.py +34 -0
- code_muse/plugins/hook_manager/__init__.py +1 -0
- code_muse/plugins/hook_manager/config.py +289 -0
- code_muse/plugins/hook_manager/hooks_menu.py +563 -0
- code_muse/plugins/hook_manager/register_callbacks.py +227 -0
- code_muse/plugins/hook_monitor/register_callbacks.py +36 -0
- code_muse/plugins/mindpack/__init__.py +0 -0
- code_muse/plugins/mindpack/factory.py +930 -0
- code_muse/plugins/mindpack/judge.py +573 -0
- code_muse/plugins/mindpack/memory.py +100 -0
- code_muse/plugins/mindpack/mindpack_menu.py +1552 -0
- code_muse/plugins/mindpack/orchestration.py +605 -0
- code_muse/plugins/mindpack/register_callbacks.py +175 -0
- code_muse/plugins/mindpack/schemas.py +358 -0
- code_muse/plugins/mindpack/tools.py +387 -0
- code_muse/plugins/oauth_muse_html.py +226 -0
- code_muse/plugins/ollama_setup/__init__.py +5 -0
- code_muse/plugins/ollama_setup/completer.py +36 -0
- code_muse/plugins/ollama_setup/register_callbacks.py +410 -0
- code_muse/plugins/plan_command/__init__.py +0 -0
- code_muse/plugins/plan_command/register_callbacks.py +206 -0
- code_muse/plugins/plan_mode/__init__.py +37 -0
- code_muse/plugins/plan_mode/mode_cycling.py +40 -0
- code_muse/plugins/plan_mode/plan_generation.py +68 -0
- code_muse/plugins/plan_mode/plan_hooks.py +74 -0
- code_muse/plugins/plan_mode/plan_mode_tools.py +138 -0
- code_muse/plugins/plan_mode/register_callbacks.py +121 -0
- code_muse/plugins/plugin_trust/register_callbacks.py +140 -0
- code_muse/plugins/policy_engine/__init__.py +46 -0
- code_muse/plugins/policy_engine/approval_flow_integration.py +59 -0
- code_muse/plugins/policy_engine/policy_evaluator.py +75 -0
- code_muse/plugins/policy_engine/policy_file_discovery.py +90 -0
- code_muse/plugins/policy_engine/policy_toml_schema.py +115 -0
- code_muse/plugins/policy_engine/register_callbacks.py +112 -0
- code_muse/plugins/pop_command/__init__.py +1 -0
- code_muse/plugins/pop_command/register_callbacks.py +189 -0
- code_muse/plugins/prompt_newline/__init__.py +13 -0
- code_muse/plugins/prompt_newline/config.py +19 -0
- code_muse/plugins/prompt_newline/register_callbacks.py +159 -0
- code_muse/plugins/safety_status/__init__.py +0 -0
- code_muse/plugins/safety_status/register_callbacks.py +113 -0
- code_muse/plugins/semantic_compression/__init__.py +6 -0
- code_muse/plugins/semantic_compression/compressor.py +295 -0
- code_muse/plugins/semantic_compression/config.py +123 -0
- code_muse/plugins/semantic_compression/register_callbacks.py +320 -0
- code_muse/plugins/shell_minimizer/__init__.py +50 -0
- code_muse/plugins/shell_minimizer/builtin_filters.toml +393 -0
- code_muse/plugins/shell_minimizer/pipeline.py +556 -0
- code_muse/plugins/shell_minimizer/primitives.py +482 -0
- code_muse/plugins/shell_minimizer/register_callbacks.py +276 -0
- code_muse/plugins/shell_safety/__init__.py +6 -0
- code_muse/plugins/shell_safety/agent_shell_safety.py +69 -0
- code_muse/plugins/shell_safety/command_cache.py +149 -0
- code_muse/plugins/shell_safety/register_callbacks.py +202 -0
- code_muse/plugins/synthetic_status/__init__.py +1 -0
- code_muse/plugins/synthetic_status/register_callbacks.py +128 -0
- code_muse/plugins/synthetic_status/status_api.py +145 -0
- code_muse/plugins/token_caching/__init__.py +21 -0
- code_muse/plugins/token_caching/cache_hit_tracking.py +128 -0
- code_muse/plugins/token_caching/cacheable_prefix_detection.py +28 -0
- code_muse/plugins/token_caching/register_callbacks.py +54 -0
- code_muse/plugins/token_caching/stats_display.py +35 -0
- code_muse/plugins/token_tracking/__init__.py +26 -0
- code_muse/plugins/token_tracking/database.py +381 -0
- code_muse/plugins/token_tracking/edit_analyzer.py +97 -0
- code_muse/plugins/token_tracking/record.py +55 -0
- code_muse/plugins/token_tracking/register_callbacks.py +277 -0
- code_muse/plugins/token_tracking/reports.py +329 -0
- code_muse/plugins/universal_constructor/__init__.py +13 -0
- code_muse/plugins/universal_constructor/models.py +136 -0
- code_muse/plugins/universal_constructor/register_callbacks.py +47 -0
- code_muse/plugins/universal_constructor/registry.py +390 -0
- code_muse/plugins/universal_constructor/runner.py +474 -0
- code_muse/plugins/universal_constructor/safety.py +440 -0
- code_muse/plugins/universal_constructor/sandbox.py +584 -0
- code_muse/provider_identity.py +105 -0
- code_muse/pydantic_patches.py +410 -0
- code_muse/reopenable_async_client.py +233 -0
- code_muse/round_robin_model.py +151 -0
- code_muse/secret_storage.py +74 -0
- code_muse/security/__init__.py +1 -0
- code_muse/security/redaction.cpython-314-darwin.so +0 -0
- code_muse/security/redaction.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/security/redaction.pyx +135 -0
- code_muse/session_storage.py +565 -0
- code_muse/status_display.py +261 -0
- code_muse/stream_parser/__init__.py +76 -0
- code_muse/stream_parser/assistant_text_parser.py +90 -0
- code_muse/stream_parser/citation_parser.py +76 -0
- code_muse/stream_parser/inline_hidden_tag_parser.py +236 -0
- code_muse/stream_parser/proposed_plan_parser.py +158 -0
- code_muse/stream_parser/stream_text_chunk.py +23 -0
- code_muse/stream_parser/stream_text_parser.py +27 -0
- code_muse/stream_parser/tagged_line_parser.cpython-314-darwin.so +0 -0
- code_muse/stream_parser/tagged_line_parser.pyx +251 -0
- code_muse/stream_parser/utf8_stream_parser.cpython-314-darwin.so +0 -0
- code_muse/stream_parser/utf8_stream_parser.pyx +206 -0
- code_muse/summarization_agent.py +308 -0
- code_muse/terminal_utils.cpython-314-darwin.so +0 -0
- code_muse/terminal_utils.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/terminal_utils.pyx +483 -0
- code_muse/tools/__init__.py +459 -0
- code_muse/tools/agent_tools.py +613 -0
- code_muse/tools/ask_user_question/__init__.py +26 -0
- code_muse/tools/ask_user_question/constants.py +73 -0
- code_muse/tools/ask_user_question/demo_tui.py +55 -0
- code_muse/tools/ask_user_question/handler.py +232 -0
- code_muse/tools/ask_user_question/models.py +302 -0
- code_muse/tools/ask_user_question/registration.py +37 -0
- code_muse/tools/ask_user_question/renderers.py +336 -0
- code_muse/tools/ask_user_question/terminal_ui.py +327 -0
- code_muse/tools/ask_user_question/theme.py +156 -0
- code_muse/tools/ask_user_question/tui_loop.py +422 -0
- code_muse/tools/background_jobs.py +99 -0
- code_muse/tools/browser/__init__.py +37 -0
- code_muse/tools/browser/browser_control.py +289 -0
- code_muse/tools/browser/browser_interactions.py +545 -0
- code_muse/tools/browser/browser_locators.py +640 -0
- code_muse/tools/browser/browser_manager.py +376 -0
- code_muse/tools/browser/browser_navigation.py +251 -0
- code_muse/tools/browser/browser_screenshot.py +180 -0
- code_muse/tools/browser/browser_scripts.py +462 -0
- code_muse/tools/browser/browser_workflows.py +222 -0
- code_muse/tools/chrome_cdp/__init__.py +1070 -0
- code_muse/tools/chrome_cdp/register_callbacks.py +61 -0
- code_muse/tools/command_runner.py +1401 -0
- code_muse/tools/common.py +1407 -0
- code_muse/tools/display.py +87 -0
- code_muse/tools/file_modifications.py +1099 -0
- code_muse/tools/file_operations.py +860 -0
- code_muse/tools/image_tools.py +185 -0
- code_muse/tools/meetin_proxy/__init__.py +243 -0
- code_muse/tools/meetin_proxy/capture_addon.py +82 -0
- code_muse/tools/meetin_proxy/proxy_manager.py +326 -0
- code_muse/tools/meetin_proxy/register_callbacks.py +45 -0
- code_muse/tools/path_policy.py +219 -0
- code_muse/tools/skills_tools.py +586 -0
- code_muse/tools/subagent_context.py +158 -0
- code_muse/tools/tools_content.py +50 -0
- code_muse/tools/universal_constructor.py +965 -0
- code_muse/uvx_detection.py +241 -0
- code_muse/version_checker.py +86 -0
- code_muse-0.0.1.data/data/code_muse/models.json +66 -0
- code_muse-0.0.1.data/data/code_muse/models_dev_api.json +1 -0
- code_muse-0.0.1.dist-info/METADATA +845 -0
- code_muse-0.0.1.dist-info/RECORD +394 -0
- code_muse-0.0.1.dist-info/WHEEL +4 -0
- code_muse-0.0.1.dist-info/entry_points.txt +2 -0
- code_muse-0.0.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"""Autonomous Memory Pipeline plugin.
|
|
2
|
+
|
|
3
|
+
Infrastructure for scanning past sessions, extracting knowledge,
|
|
4
|
+
consolidating memories, and injecting them into prompts.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from .consolidation import consolidate_memories, write_memory_files
|
|
8
|
+
from .extraction import ExtractionResult, extract_session_knowledge
|
|
9
|
+
from .lease_lock import LeaseHandle, acquire_memory_lease, release_lease
|
|
10
|
+
from .memory_injection import inject_into_system_prompt, load_memory_injection
|
|
11
|
+
from .secret_scanner import SCAN_PATTERNS, SecretMatch, scan_for_secrets
|
|
12
|
+
from .session_scanner import (
|
|
13
|
+
SessionInfo,
|
|
14
|
+
get_memory_dir,
|
|
15
|
+
get_sessions_dir,
|
|
16
|
+
mark_session_processed,
|
|
17
|
+
scan_eligible_sessions,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
__all__ = [
|
|
21
|
+
"acquire_memory_lease",
|
|
22
|
+
"consolidate_memories",
|
|
23
|
+
"extract_session_knowledge",
|
|
24
|
+
"get_memory_dir",
|
|
25
|
+
"get_sessions_dir",
|
|
26
|
+
"inject_into_system_prompt",
|
|
27
|
+
"lease_lock",
|
|
28
|
+
"load_memory_injection",
|
|
29
|
+
"mark_session_processed",
|
|
30
|
+
"release_lease",
|
|
31
|
+
"scan_eligible_sessions",
|
|
32
|
+
"scan_for_secrets",
|
|
33
|
+
"write_memory_files",
|
|
34
|
+
"ExtractionResult",
|
|
35
|
+
"LeaseHandle",
|
|
36
|
+
"SCAN_PATTERNS",
|
|
37
|
+
"SecretMatch",
|
|
38
|
+
"SessionInfo",
|
|
39
|
+
]
|
|
Binary file
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
# cython: language_level=3
|
|
2
|
+
"""BM25 relevance scorer for memory extraction.
|
|
3
|
+
|
|
4
|
+
Cythonized implementation — uses int ID vocabulary and typed loops
|
|
5
|
+
for performance. No external dependencies.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import array
|
|
9
|
+
import math
|
|
10
|
+
import re
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
cdef class BM25Scorer:
|
|
14
|
+
"""BM25 relevance scoring for text chunks.
|
|
15
|
+
|
|
16
|
+
Cythonized version: term lookups use int IDs via a vocabulary
|
|
17
|
+
built during ``fit()``, and the inner scoring loop uses Cython
|
|
18
|
+
type declarations for the math steps.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
cdef public double k1
|
|
22
|
+
cdef public double b
|
|
23
|
+
cdef public double epsilon
|
|
24
|
+
cdef int _doc_count
|
|
25
|
+
cdef double _avgdl
|
|
26
|
+
cdef list _idf
|
|
27
|
+
cdef dict _vocabulary
|
|
28
|
+
cdef list _corpus_tfs
|
|
29
|
+
cdef list _corpus_docs
|
|
30
|
+
cdef list _corpus_lens
|
|
31
|
+
|
|
32
|
+
def __init__(
|
|
33
|
+
self,
|
|
34
|
+
double k1=1.5,
|
|
35
|
+
double b=0.75,
|
|
36
|
+
double epsilon=0.25,
|
|
37
|
+
):
|
|
38
|
+
self.k1 = k1
|
|
39
|
+
self.b = b
|
|
40
|
+
self.epsilon = epsilon
|
|
41
|
+
self._doc_count = 0
|
|
42
|
+
self._avgdl = 0.0
|
|
43
|
+
self._idf = None
|
|
44
|
+
self._vocabulary = {}
|
|
45
|
+
self._corpus_tfs = []
|
|
46
|
+
self._corpus_docs = []
|
|
47
|
+
self._corpus_lens = []
|
|
48
|
+
|
|
49
|
+
def fit(self, documents):
|
|
50
|
+
"""Compute corpus statistics for IDF calculation.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
documents: Full document collection (all chunks across all sessions).
|
|
54
|
+
"""
|
|
55
|
+
self._doc_count = len(documents)
|
|
56
|
+
tokenized = [self._tokenize(doc) for doc in documents]
|
|
57
|
+
self._avgdl = sum(len(tokens) for tokens in tokenized) / max(self._doc_count, 1)
|
|
58
|
+
|
|
59
|
+
# Build vocabulary: str -> int
|
|
60
|
+
cdef dict vocab = {}
|
|
61
|
+
cdef int vocab_idx = 0
|
|
62
|
+
cdef list doc_tokens
|
|
63
|
+
cdef str token
|
|
64
|
+
for doc_tokens in tokenized:
|
|
65
|
+
for token in doc_tokens:
|
|
66
|
+
if token not in vocab:
|
|
67
|
+
vocab[token] = vocab_idx
|
|
68
|
+
vocab_idx += 1
|
|
69
|
+
self._vocabulary = vocab
|
|
70
|
+
cdef int vocab_size = vocab_idx
|
|
71
|
+
|
|
72
|
+
# Document frequency per term ID
|
|
73
|
+
cdef list df = [0] * vocab_size
|
|
74
|
+
cdef set seen
|
|
75
|
+
for doc_tokens in tokenized:
|
|
76
|
+
seen = set(doc_tokens)
|
|
77
|
+
for token in seen:
|
|
78
|
+
df[vocab[token]] += 1
|
|
79
|
+
|
|
80
|
+
# IDF array indexed by term ID
|
|
81
|
+
cdef list idf = [0.0] * vocab_size
|
|
82
|
+
cdef int freq
|
|
83
|
+
cdef double idf_val
|
|
84
|
+
cdef int i
|
|
85
|
+
cdef int N = self._doc_count
|
|
86
|
+
cdef double eps = self.epsilon
|
|
87
|
+
for i in range(vocab_size):
|
|
88
|
+
freq = df[i]
|
|
89
|
+
idf_val = math.log((N - freq + 0.5) / (freq + 0.5) + 1.0)
|
|
90
|
+
if idf_val < eps:
|
|
91
|
+
idf_val = eps
|
|
92
|
+
idf[i] = idf_val
|
|
93
|
+
self._idf = idf
|
|
94
|
+
|
|
95
|
+
# Pre-build dense tf arrays for corpus documents
|
|
96
|
+
cdef list corpus_tfs = []
|
|
97
|
+
cdef object tf
|
|
98
|
+
cdef int term_id
|
|
99
|
+
for doc_tokens in tokenized:
|
|
100
|
+
tf = array.array('i', [0]) * vocab_size
|
|
101
|
+
for token in doc_tokens:
|
|
102
|
+
term_id = vocab[token]
|
|
103
|
+
tf[term_id] = tf[term_id] + 1
|
|
104
|
+
corpus_tfs.append(tf)
|
|
105
|
+
self._corpus_tfs = corpus_tfs
|
|
106
|
+
self._corpus_docs = list(documents)
|
|
107
|
+
self._corpus_lens = [len(doc_tokens) for doc_tokens in tokenized]
|
|
108
|
+
|
|
109
|
+
def score(self, query, document):
|
|
110
|
+
"""Score a single document against a query.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
query: The query/project context string.
|
|
114
|
+
document: The document/chunk to score.
|
|
115
|
+
|
|
116
|
+
Returns:
|
|
117
|
+
BM25 score (higher = more relevant).
|
|
118
|
+
"""
|
|
119
|
+
if self._idf is None:
|
|
120
|
+
raise RuntimeError("Scorer not fitted. Call fit() first.")
|
|
121
|
+
|
|
122
|
+
cdef list query_tokens = self._tokenize(query)
|
|
123
|
+
cdef list doc_tokens = self._tokenize(document)
|
|
124
|
+
cdef int doc_len = len(doc_tokens)
|
|
125
|
+
|
|
126
|
+
# Build sparse tf dict using int IDs
|
|
127
|
+
cdef dict tf_dict = {}
|
|
128
|
+
cdef str token
|
|
129
|
+
cdef int term_id
|
|
130
|
+
cdef dict vocab = self._vocabulary
|
|
131
|
+
for token in doc_tokens:
|
|
132
|
+
term_id = vocab.get(token, -1)
|
|
133
|
+
if term_id != -1:
|
|
134
|
+
if term_id in tf_dict:
|
|
135
|
+
tf_dict[term_id] = tf_dict[term_id] + 1
|
|
136
|
+
else:
|
|
137
|
+
tf_dict[term_id] = 1
|
|
138
|
+
|
|
139
|
+
cdef double score = 0.0
|
|
140
|
+
cdef double idf
|
|
141
|
+
cdef int term_tf
|
|
142
|
+
cdef double numerator, denominator
|
|
143
|
+
cdef double k1 = self.k1
|
|
144
|
+
cdef double b = self.b
|
|
145
|
+
cdef double avgdl = self._avgdl
|
|
146
|
+
cdef double epsilon = self.epsilon
|
|
147
|
+
cdef list idf_arr = self._idf
|
|
148
|
+
|
|
149
|
+
for token in query_tokens:
|
|
150
|
+
term_id = vocab.get(token, -1)
|
|
151
|
+
if term_id == -1:
|
|
152
|
+
continue
|
|
153
|
+
idf = idf_arr[term_id]
|
|
154
|
+
term_tf = tf_dict.get(term_id, 0)
|
|
155
|
+
if term_tf == 0:
|
|
156
|
+
continue
|
|
157
|
+
numerator = term_tf * (k1 + 1.0)
|
|
158
|
+
denominator = term_tf + k1 * (1.0 - b + b * doc_len / avgdl)
|
|
159
|
+
score += idf * numerator / denominator
|
|
160
|
+
|
|
161
|
+
return score
|
|
162
|
+
|
|
163
|
+
def score_batch(self, query, documents):
|
|
164
|
+
"""Score multiple documents against a query.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
query: The query/project context.
|
|
168
|
+
documents: List of document strings.
|
|
169
|
+
|
|
170
|
+
Returns:
|
|
171
|
+
List of scores, one per document.
|
|
172
|
+
"""
|
|
173
|
+
cdef list results = []
|
|
174
|
+
cdef str doc
|
|
175
|
+
cdef dict corpus_lookup = {}
|
|
176
|
+
cdef int i
|
|
177
|
+
cdef int n_corpus = len(self._corpus_docs)
|
|
178
|
+
cdef list query_tokens
|
|
179
|
+
cdef object tf
|
|
180
|
+
cdef int doc_len
|
|
181
|
+
cdef double score
|
|
182
|
+
cdef double idf
|
|
183
|
+
cdef int term_tf
|
|
184
|
+
cdef double numerator, denominator
|
|
185
|
+
cdef double k1 = self.k1
|
|
186
|
+
cdef double b = self.b
|
|
187
|
+
cdef double avgdl = self._avgdl
|
|
188
|
+
cdef double epsilon = self.epsilon
|
|
189
|
+
cdef list idf_arr = self._idf
|
|
190
|
+
cdef dict vocab = self._vocabulary
|
|
191
|
+
cdef str token
|
|
192
|
+
cdef int term_id
|
|
193
|
+
|
|
194
|
+
for i in range(n_corpus):
|
|
195
|
+
corpus_lookup[self._corpus_docs[i]] = i
|
|
196
|
+
|
|
197
|
+
cdef int idx
|
|
198
|
+
for doc in documents:
|
|
199
|
+
idx = corpus_lookup.get(doc, -1)
|
|
200
|
+
if idx != -1:
|
|
201
|
+
# Fast path: reuse pre-built tf array from fit()
|
|
202
|
+
query_tokens = self._tokenize(query)
|
|
203
|
+
tf = self._corpus_tfs[idx]
|
|
204
|
+
doc_len = self._corpus_lens[idx]
|
|
205
|
+
score = 0.0
|
|
206
|
+
for token in query_tokens:
|
|
207
|
+
term_id = vocab.get(token, -1)
|
|
208
|
+
if term_id == -1:
|
|
209
|
+
continue
|
|
210
|
+
idf = idf_arr[term_id]
|
|
211
|
+
term_tf = tf[term_id]
|
|
212
|
+
if term_tf == 0:
|
|
213
|
+
continue
|
|
214
|
+
numerator = term_tf * (k1 + 1.0)
|
|
215
|
+
denominator = term_tf + k1 * (1.0 - b + b * doc_len / avgdl)
|
|
216
|
+
score += idf * numerator / denominator
|
|
217
|
+
results.append(score)
|
|
218
|
+
else:
|
|
219
|
+
results.append(self.score(query, doc))
|
|
220
|
+
return results
|
|
221
|
+
|
|
222
|
+
@staticmethod
|
|
223
|
+
def _tokenize(text):
|
|
224
|
+
"""Simple tokenization: lowercase, split on whitespace + punctuation.
|
|
225
|
+
|
|
226
|
+
Keeps tokens >= 2 characters to filter noise.
|
|
227
|
+
"""
|
|
228
|
+
text = text.lower()
|
|
229
|
+
tokens = re.findall(r"[a-z0-9]{2,}", text)
|
|
230
|
+
return tokens
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def select_top_chunks(
|
|
234
|
+
chunks,
|
|
235
|
+
scores,
|
|
236
|
+
threshold=None,
|
|
237
|
+
top_n=None,
|
|
238
|
+
min_keep=3,
|
|
239
|
+
):
|
|
240
|
+
"""Select the most relevant chunks.
|
|
241
|
+
|
|
242
|
+
Args:
|
|
243
|
+
chunks: List of text chunks.
|
|
244
|
+
scores: Corresponding relevance scores.
|
|
245
|
+
threshold: Minimum score to include (absolute). If None, uses top_n.
|
|
246
|
+
top_n: Number of top chunks to keep. If None, uses threshold.
|
|
247
|
+
min_keep: Always keep at least this many chunks (prevents empty results).
|
|
248
|
+
|
|
249
|
+
Returns:
|
|
250
|
+
Selected chunks in original order.
|
|
251
|
+
"""
|
|
252
|
+
if not chunks:
|
|
253
|
+
return []
|
|
254
|
+
|
|
255
|
+
# Pair chunks with scores and original indices
|
|
256
|
+
indexed = list(enumerate(zip(chunks, scores)))
|
|
257
|
+
|
|
258
|
+
if threshold is not None:
|
|
259
|
+
# Filter by threshold
|
|
260
|
+
kept = [(i, (c, s)) for i, (c, s) in indexed if s >= threshold]
|
|
261
|
+
if len(kept) < min_keep:
|
|
262
|
+
# Ensure minimum kept: take top by score
|
|
263
|
+
sorted_by_score = sorted(indexed, key=lambda x: x[1][1], reverse=True)
|
|
264
|
+
kept = sorted_by_score[:max(min_keep, min(len(chunks), min_keep))]
|
|
265
|
+
elif top_n is not None:
|
|
266
|
+
sorted_by_score = sorted(indexed, key=lambda x: x[1][1], reverse=True)
|
|
267
|
+
kept = sorted_by_score[:max(top_n, min_keep)]
|
|
268
|
+
else:
|
|
269
|
+
# Default: keep top 30% or at least min_keep
|
|
270
|
+
n = max(min_keep, len(chunks) // 3)
|
|
271
|
+
sorted_by_score = sorted(indexed, key=lambda x: x[1][1], reverse=True)
|
|
272
|
+
kept = sorted_by_score[:n]
|
|
273
|
+
|
|
274
|
+
# Return in original order
|
|
275
|
+
kept_sorted = sorted(kept, key=lambda x: x[0])
|
|
276
|
+
return [chunk for _, (chunk, _) in kept_sorted]
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
def score_chunks_against_context(
|
|
280
|
+
chunks,
|
|
281
|
+
context,
|
|
282
|
+
double k1=1.5,
|
|
283
|
+
double b=0.75,
|
|
284
|
+
):
|
|
285
|
+
"""Convenience: fit scorer on chunks, score them against context.
|
|
286
|
+
|
|
287
|
+
Uses chunks as the document corpus and context as the query.
|
|
288
|
+
"""
|
|
289
|
+
scorer = BM25Scorer(k1=k1, b=b)
|
|
290
|
+
scorer.fit(chunks)
|
|
291
|
+
return scorer.score_batch(context, chunks)
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"""Stub consolidation engine for the Autonomous Memory Pipeline.
|
|
2
|
+
|
|
3
|
+
Combines per-session extractions into a project-level markdown memory file.
|
|
4
|
+
Future iterations will drive this via a consolidation LLM agent.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
from .extraction import ExtractionResult
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def consolidate_memories(extractions: list[ExtractionResult], project_dir: Path) -> str:
|
|
16
|
+
"""Combine extraction results into a single markdown document.
|
|
17
|
+
|
|
18
|
+
This is a stub: it simply concatenates raw memory blocks with simple
|
|
19
|
+
deduplication. A future consolidation agent will synthesise these into
|
|
20
|
+
coherent project knowledge.
|
|
21
|
+
"""
|
|
22
|
+
if not extractions:
|
|
23
|
+
return "# Project Memory\n\nNo sessions extracted yet.\n"
|
|
24
|
+
|
|
25
|
+
lines: list[str] = [
|
|
26
|
+
"# Project Memory",
|
|
27
|
+
"",
|
|
28
|
+
f"Generated from {len(extractions)} sessions.",
|
|
29
|
+
"",
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
seen: set[str] = set()
|
|
33
|
+
for ex in extractions:
|
|
34
|
+
block = ex.raw_memory.strip()
|
|
35
|
+
if block in seen:
|
|
36
|
+
continue
|
|
37
|
+
seen.add(block)
|
|
38
|
+
lines.append(f"### {ex.session_path}")
|
|
39
|
+
lines.append(f"*Synopsis: {ex.synopsis}*")
|
|
40
|
+
lines.append(f"*Extracted at: {ex.extracted_at}*")
|
|
41
|
+
lines.append("")
|
|
42
|
+
lines.append(block)
|
|
43
|
+
lines.append("")
|
|
44
|
+
|
|
45
|
+
return "\n".join(lines)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def write_memory_files(consolidated_md: str, memory_dir: Path) -> tuple[Path, Path]:
|
|
49
|
+
"""Write the consolidated memory and a truncated summary to disk.
|
|
50
|
+
|
|
51
|
+
Returns ``(memory_path, summary_path)``.
|
|
52
|
+
"""
|
|
53
|
+
memory_dir.mkdir(parents=True, exist_ok=True)
|
|
54
|
+
|
|
55
|
+
memory_path = memory_dir / "MEMORY.md"
|
|
56
|
+
summary_path = memory_dir / "memory_summary.md"
|
|
57
|
+
|
|
58
|
+
memory_path.write_text(consolidated_md, encoding="utf-8")
|
|
59
|
+
|
|
60
|
+
summary = _truncate_to_words(consolidated_md, max_words=500)
|
|
61
|
+
summary_path.write_text(summary, encoding="utf-8")
|
|
62
|
+
|
|
63
|
+
logger.info(f"Wrote memory files to {memory_dir}")
|
|
64
|
+
return memory_path, summary_path
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _truncate_to_words(text: str, max_words: int = 500) -> str:
|
|
68
|
+
"""Truncate markdown to approximately ``max_words`` words.
|
|
69
|
+
|
|
70
|
+
Tries to end on a paragraph boundary for readability.
|
|
71
|
+
"""
|
|
72
|
+
words = text.split()
|
|
73
|
+
if len(words) <= max_words:
|
|
74
|
+
return text
|
|
75
|
+
|
|
76
|
+
# Truncate to max_words, then try to find the nearest paragraph break
|
|
77
|
+
truncated = " ".join(words[:max_words])
|
|
78
|
+
last_break = truncated.rfind("\n\n")
|
|
79
|
+
if last_break > max_words * 0.5:
|
|
80
|
+
truncated = truncated[:last_break]
|
|
81
|
+
|
|
82
|
+
return truncated.strip() + "\n\n*(truncated)*\n"
|