code-muse 0.1.2__tar.gz → 0.1.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (414) hide show
  1. {code_muse-0.1.2 → code_muse-0.1.3}/PKG-INFO +1 -1
  2. code_muse-0.1.3/code_muse/__init__.py +87 -0
  3. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/_compaction.py +116 -5
  4. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/_history.py +8 -1
  5. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/fs_scan_cache/scan_cache_core.cpython-314-darwin.so +0 -0
  6. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/hook_engine/registry.py +1 -1
  7. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/hook_engine/validator.py +2 -0
  8. code_muse-0.1.3/code_muse/models.json +1 -0
  9. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/models_cache/sha256_hash.cpython-314-darwin.so +0 -0
  10. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/__init__.py +27 -0
  11. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/bm25_scorer.cpython-314-darwin.so +0 -0
  12. code_muse-0.1.3/code_muse/plugins/delegation_manager/__init__.py +24 -0
  13. code_muse-0.1.3/code_muse/plugins/delegation_manager/delegation_manager.py +183 -0
  14. code_muse-0.1.3/code_muse/plugins/delegation_manager/register_callbacks.py +109 -0
  15. code_muse-0.1.3/code_muse/plugins/delegation_manager/supervisor_agent.py +52 -0
  16. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/ast_compressor.cpython-314-darwin.so +0 -0
  17. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/code.cpython-314-darwin.so +0 -0
  18. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/git.cpython-314-darwin.so +0 -0
  19. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/lint.cpython-314-darwin.so +0 -0
  20. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/test.cpython-314-darwin.so +0 -0
  21. code_muse-0.1.3/code_muse/plugins/history_store/__init__.py +13 -0
  22. code_muse-0.1.3/code_muse/plugins/history_store/register_callbacks.py +68 -0
  23. code_muse-0.1.3/code_muse/plugins/history_store/store.py +95 -0
  24. code_muse-0.1.3/code_muse/plugins/tool_registry/__init__.py +17 -0
  25. code_muse-0.1.3/code_muse/plugins/tool_registry/definitions.py +150 -0
  26. code_muse-0.1.3/code_muse/plugins/tool_registry/register_callbacks.py +129 -0
  27. code_muse-0.1.3/code_muse/plugins/tool_registry/registry.py +117 -0
  28. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/security/redaction.cpython-314-darwin.so +0 -0
  29. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/stream_parser/tagged_line_parser.cpython-314-darwin.so +0 -0
  30. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/stream_parser/utf8_stream_parser.cpython-314-darwin.so +0 -0
  31. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/terminal_utils.cpython-314-darwin.so +0 -0
  32. {code_muse-0.1.2 → code_muse-0.1.3}/pyproject.toml +1 -1
  33. code_muse-0.1.2/code_muse/__init__.py +0 -26
  34. code_muse-0.1.2/code_muse/models.json +0 -66
  35. code_muse-0.1.2/code_muse/plugins/autonomous_memory/bm25_scorer.cpython-314-x86_64-linux-gnu.so +0 -0
  36. code_muse-0.1.2/code_muse/plugins/filter_engine/strategies/ast_compressor.cpython-314-x86_64-linux-gnu.so +0 -0
  37. code_muse-0.1.2/code_muse/plugins/filter_engine/strategies/code.cpython-314-x86_64-linux-gnu.so +0 -0
  38. code_muse-0.1.2/code_muse/plugins/filter_engine/strategies/git.cpython-314-x86_64-linux-gnu.so +0 -0
  39. code_muse-0.1.2/code_muse/plugins/filter_engine/strategies/json_compressor.cpython-314-darwin.so +0 -0
  40. code_muse-0.1.2/code_muse/plugins/filter_engine/strategies/json_patterns.cpython-314-darwin.so +0 -0
  41. code_muse-0.1.2/code_muse/plugins/filter_engine/strategies/lint.cpython-314-x86_64-linux-gnu.so +0 -0
  42. code_muse-0.1.2/code_muse/plugins/filter_engine/strategies/test.cpython-314-x86_64-linux-gnu.so +0 -0
  43. code_muse-0.1.2/code_muse/security/redaction.cpython-314-x86_64-linux-gnu.so +0 -0
  44. code_muse-0.1.2/code_muse/terminal_utils.cpython-314-x86_64-linux-gnu.so +0 -0
  45. {code_muse-0.1.2 → code_muse-0.1.3}/.gitignore +0 -0
  46. {code_muse-0.1.2 → code_muse-0.1.3}/LICENSE +0 -0
  47. {code_muse-0.1.2 → code_muse-0.1.3}/README.md +0 -0
  48. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/__main__.py +0 -0
  49. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/__init__.py +0 -0
  50. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/_builder.py +0 -0
  51. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/_diagnostics.py +0 -0
  52. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/_key_listeners.py +0 -0
  53. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/_non_streaming_render.py +0 -0
  54. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/_runtime.py +0 -0
  55. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/agent_creator_agent.py +0 -0
  56. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/agent_helios.py +0 -0
  57. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/agent_manager.py +0 -0
  58. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/agent_muse.py +0 -0
  59. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/agent_planning.py +0 -0
  60. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/agent_qa_iris.py +0 -0
  61. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/base_agent.py +0 -0
  62. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/event_stream_handler.py +0 -0
  63. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/json_agent.py +0 -0
  64. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/prompt_v3.py +0 -0
  65. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/agents/subagent_stream_handler.py +0 -0
  66. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/callbacks.py +0 -0
  67. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/chatgpt_codex_client.py +0 -0
  68. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/claude_cache_client.py +0 -0
  69. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/cli_runner/__init__.py +0 -0
  70. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/cli_runner/args.py +0 -0
  71. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/cli_runner/loop.py +0 -0
  72. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/cli_runner/resume.py +0 -0
  73. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/cli_runner/runner.py +0 -0
  74. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/__init__.py +0 -0
  75. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/add_model_menu.py +0 -0
  76. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/agent_menu.py +0 -0
  77. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/attachments.py +0 -0
  78. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/autosave_menu.py +0 -0
  79. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/clipboard.py +0 -0
  80. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/colors_menu.py +0 -0
  81. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/command_handler.py +0 -0
  82. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/command_registry.py +0 -0
  83. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/config_commands.py +0 -0
  84. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/core_commands.py +0 -0
  85. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/diff_menu.py +0 -0
  86. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/file_path_completion.py +0 -0
  87. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/load_context_completion.py +0 -0
  88. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/model_picker_completion.py +0 -0
  89. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/model_settings_menu.py +0 -0
  90. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/onboarding_slides.py +0 -0
  91. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/onboarding_wizard.py +0 -0
  92. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/pagination.py +0 -0
  93. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/pin_command_completion.py +0 -0
  94. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/prompt_toolkit_completion.py +0 -0
  95. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/session_commands.py +0 -0
  96. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/shell_passthrough.py +0 -0
  97. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/skills_completion.py +0 -0
  98. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/types.py +0 -0
  99. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/uc_menu.py +0 -0
  100. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/utils.py +0 -0
  101. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/command_line/wiggum_state.py +0 -0
  102. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/config.py +0 -0
  103. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/config_agent.py +0 -0
  104. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/config_appearance.py +0 -0
  105. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/config_model.py +0 -0
  106. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/config_security.py +0 -0
  107. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/error_logging.py +0 -0
  108. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/evals/__init__.py +0 -0
  109. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/evals/eval_helpers.py +0 -0
  110. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/evals/eval_runner.py +0 -0
  111. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/evals/sample_evals/__init__.py +0 -0
  112. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/evals/sample_evals/eval_frugal_reads.py +0 -0
  113. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/evals/sample_evals/eval_memory_planning.py +0 -0
  114. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/evals/sample_evals/eval_shell_efficiency.py +0 -0
  115. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/evals/sample_evals/eval_tool_masking.py +0 -0
  116. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/fs_scan_cache/__init__.py +0 -0
  117. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/fs_scan_cache/invalidation_hooks.py +0 -0
  118. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/fs_scan_cache/scan_cache_core.pyx +0 -0
  119. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/fs_scan_cache/tool_integration.py +0 -0
  120. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/fs_scan_cache/ttl_policy.py +0 -0
  121. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/gemini_code_assist.py +0 -0
  122. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/gemini_model.py +0 -0
  123. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/hook_engine/README.md +0 -0
  124. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/hook_engine/__init__.py +0 -0
  125. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/hook_engine/aliases.py +0 -0
  126. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/hook_engine/engine.py +0 -0
  127. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/hook_engine/executor.py +0 -0
  128. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/hook_engine/matcher.py +0 -0
  129. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/hook_engine/models.py +0 -0
  130. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/hook_engine/trust.py +0 -0
  131. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/http_utils.py +0 -0
  132. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/keymap.py +0 -0
  133. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/list_filtering.py +0 -0
  134. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/main.py +0 -0
  135. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/__init__.py +0 -0
  136. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/bus.py +0 -0
  137. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/commands.py +0 -0
  138. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/markdown_patches.py +0 -0
  139. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/message_queue.py +0 -0
  140. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/messages.py +0 -0
  141. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/queue_console.py +0 -0
  142. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/renderers.py +0 -0
  143. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/rich_renderer.py +0 -0
  144. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/shimmer.py +0 -0
  145. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/spinner/__init__.py +0 -0
  146. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/spinner/console_spinner.py +0 -0
  147. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/spinner/spinner_base.py +0 -0
  148. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/messaging/subagent_console.py +0 -0
  149. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/model_factory.py +0 -0
  150. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/model_switching.py +0 -0
  151. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/model_utils.py +0 -0
  152. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/models_cache/__init__.py +0 -0
  153. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/models_cache/blocking_lru_cache.py +0 -0
  154. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/models_cache/cache_writer.py +0 -0
  155. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/models_cache/sha256_hash.pyx +0 -0
  156. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/models_cache/startup_integration.py +0 -0
  157. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/models_dev_api.json +0 -0
  158. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/models_dev_parser.py +0 -0
  159. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/motion.py +0 -0
  160. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/__init__.py +0 -0
  161. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/config.py +0 -0
  162. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/discovery.py +0 -0
  163. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/downloader.py +0 -0
  164. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/installer.py +0 -0
  165. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/metadata.py +0 -0
  166. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/prompt_builder.py +0 -0
  167. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/register_callbacks.py +0 -0
  168. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/remote_catalog.py +0 -0
  169. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/skill_catalog.py +0 -0
  170. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/skills_install_menu.py +0 -0
  171. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/agent_skills/skills_menu.py +0 -0
  172. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/auto_review/__init__.py +0 -0
  173. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/auto_review/cache.py +0 -0
  174. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/auto_review/config.py +0 -0
  175. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/auto_review/register_callbacks.py +0 -0
  176. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/auto_review/review_prompt.py +0 -0
  177. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/auto_review/reviewer.py +0 -0
  178. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/auto_review/visibility.py +0 -0
  179. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/__init__.py +0 -0
  180. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/bm25_scorer.pyx +0 -0
  181. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/consolidation.py +0 -0
  182. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/extraction.py +0 -0
  183. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/lease_lock.py +0 -0
  184. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/memory_injection.py +0 -0
  185. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/register_callbacks.py +0 -0
  186. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/secret_scanner.py +0 -0
  187. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/session_scanner.py +0 -0
  188. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/aws_bedrock/__init__.py +0 -0
  189. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/aws_bedrock/config.py +0 -0
  190. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/aws_bedrock/register_callbacks.py +0 -0
  191. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/aws_bedrock/utils.py +0 -0
  192. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/README.md +0 -0
  193. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/__init__.py +0 -0
  194. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/config.py +0 -0
  195. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/discovery.py +0 -0
  196. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/register_callbacks.py +0 -0
  197. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/token.py +0 -0
  198. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/utils.py +0 -0
  199. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/build_filter/__init__.py +0 -0
  200. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/build_filter/register_callbacks.py +0 -0
  201. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/build_filter/strategies/__init__.py +0 -0
  202. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/build_filter/strategies/build.py +0 -0
  203. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/__init__.py +0 -0
  204. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/config.py +0 -0
  205. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/oauth_flow.py +0 -0
  206. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/register_callbacks.py +0 -0
  207. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/test_plugin.py +0 -0
  208. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/utils.py +0 -0
  209. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/checkpointing/__init__.py +0 -0
  210. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/checkpointing/checkpoint_hook.py +0 -0
  211. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/checkpointing/conversation_snapshots.py +0 -0
  212. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/checkpointing/register_callbacks.py +0 -0
  213. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/checkpointing/restore_command.py +0 -0
  214. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/checkpointing/rewind_shortcut.py +0 -0
  215. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/checkpointing/shadow_git.py +0 -0
  216. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_hooks/__init__.py +0 -0
  217. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_hooks/config.py +0 -0
  218. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_hooks/register_callbacks.py +0 -0
  219. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/README.md +0 -0
  220. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/SETUP.md +0 -0
  221. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/__init__.py +0 -0
  222. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/config.py +0 -0
  223. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/fast_mode.py +0 -0
  224. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/prompt_handler.py +0 -0
  225. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/register_callbacks.py +0 -0
  226. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/test_fast_mode.py +0 -0
  227. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/test_plugin.py +0 -0
  228. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
  229. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/utils.py +0 -0
  230. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/copilot_auth/__init__.py +0 -0
  231. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/copilot_auth/config.py +0 -0
  232. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/copilot_auth/reasoning_client.py +0 -0
  233. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/copilot_auth/register_callbacks.py +0 -0
  234. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/copilot_auth/utils.py +0 -0
  235. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/custom_commands/__init__.py +0 -0
  236. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/custom_commands/args_injection.py +0 -0
  237. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/custom_commands/command_discovery.py +0 -0
  238. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/custom_commands/command_toml_schema.py +0 -0
  239. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/custom_commands/register_callbacks.py +0 -0
  240. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/customizable_commands/__init__.py +0 -0
  241. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/customizable_commands/register_callbacks.py +0 -0
  242. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/destructive_command_guard/__init__.py +0 -0
  243. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/destructive_command_guard/detector.py +0 -0
  244. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/destructive_command_guard/register_callbacks.py +0 -0
  245. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/example_custom_command/README.md +0 -0
  246. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/example_custom_command/register_callbacks.py +0 -0
  247. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/file_permission_handler/__init__.py +0 -0
  248. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/file_permission_handler/register_callbacks.py +0 -0
  249. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/__init__.py +0 -0
  250. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/classifier.py +0 -0
  251. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/content_detector.py +0 -0
  252. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/dispatcher.py +0 -0
  253. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/register_callbacks.py +0 -0
  254. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/registry.py +0 -0
  255. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/__init__.py +0 -0
  256. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/ast_compressor.pyx +0 -0
  257. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/ast_parser.py +0 -0
  258. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/code.pyx +0 -0
  259. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/git.pyx +0 -0
  260. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/json_compressor.pyx +0 -0
  261. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/json_patterns.pyx +0 -0
  262. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/lint.pyx +0 -0
  263. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/test.pyx +0 -0
  264. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/filter_engine/verbosity.py +0 -0
  265. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/force_push_guard/__init__.py +0 -0
  266. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/force_push_guard/detector.py +0 -0
  267. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/force_push_guard/register_callbacks.py +0 -0
  268. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/force_push_guard/test_detector.py +0 -0
  269. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/frontend_emitter/__init__.py +0 -0
  270. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/frontend_emitter/emitter.py +0 -0
  271. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/frontend_emitter/register_callbacks.py +0 -0
  272. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/gac/__init__.py +0 -0
  273. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/gac/git_ops.py +0 -0
  274. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/gac/prompt.py +0 -0
  275. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/gac/register_callbacks.py +0 -0
  276. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/hook_creator/__init__.py +0 -0
  277. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/hook_creator/register_callbacks.py +0 -0
  278. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/hook_manager/__init__.py +0 -0
  279. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/hook_manager/config.py +0 -0
  280. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/hook_manager/hooks_menu.py +0 -0
  281. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/hook_manager/register_callbacks.py +0 -0
  282. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/hook_monitor/register_callbacks.py +0 -0
  283. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/mindpack/__init__.py +0 -0
  284. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/mindpack/factory.py +0 -0
  285. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/mindpack/judge.py +0 -0
  286. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/mindpack/memory.py +0 -0
  287. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/mindpack/mindpack_menu.py +0 -0
  288. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/mindpack/orchestration.py +0 -0
  289. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/mindpack/register_callbacks.py +0 -0
  290. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/mindpack/schemas.py +0 -0
  291. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/mindpack/tools.py +0 -0
  292. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/oauth_muse_html.py +0 -0
  293. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/ollama_setup/__init__.py +0 -0
  294. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/ollama_setup/completer.py +0 -0
  295. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/ollama_setup/register_callbacks.py +0 -0
  296. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/plan_command/__init__.py +0 -0
  297. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/plan_command/register_callbacks.py +0 -0
  298. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/plan_mode/__init__.py +0 -0
  299. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/plan_mode/mode_cycling.py +0 -0
  300. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/plan_mode/plan_generation.py +0 -0
  301. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/plan_mode/plan_hooks.py +0 -0
  302. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/plan_mode/plan_mode_tools.py +0 -0
  303. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/plan_mode/register_callbacks.py +0 -0
  304. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/plugin_trust/register_callbacks.py +0 -0
  305. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/policy_engine/__init__.py +0 -0
  306. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/policy_engine/approval_flow_integration.py +0 -0
  307. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/policy_engine/policy_evaluator.py +0 -0
  308. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/policy_engine/policy_file_discovery.py +0 -0
  309. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/policy_engine/policy_toml_schema.py +0 -0
  310. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/policy_engine/register_callbacks.py +0 -0
  311. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/pop_command/__init__.py +0 -0
  312. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/pop_command/register_callbacks.py +0 -0
  313. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/prompt_newline/__init__.py +0 -0
  314. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/prompt_newline/config.py +0 -0
  315. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/prompt_newline/register_callbacks.py +0 -0
  316. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/safety_status/__init__.py +0 -0
  317. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/safety_status/register_callbacks.py +0 -0
  318. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/semantic_compression/__init__.py +0 -0
  319. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/semantic_compression/compressor.py +0 -0
  320. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/semantic_compression/config.py +0 -0
  321. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/semantic_compression/register_callbacks.py +0 -0
  322. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/shell_minimizer/__init__.py +0 -0
  323. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/shell_minimizer/builtin_filters.toml +0 -0
  324. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/shell_minimizer/pipeline.py +0 -0
  325. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/shell_minimizer/primitives.py +0 -0
  326. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/shell_minimizer/register_callbacks.py +0 -0
  327. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/shell_safety/__init__.py +0 -0
  328. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/shell_safety/agent_shell_safety.py +0 -0
  329. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/shell_safety/command_cache.py +0 -0
  330. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/shell_safety/register_callbacks.py +0 -0
  331. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/synthetic_status/__init__.py +0 -0
  332. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/synthetic_status/register_callbacks.py +0 -0
  333. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/synthetic_status/status_api.py +0 -0
  334. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/token_caching/__init__.py +0 -0
  335. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/token_caching/cache_hit_tracking.py +0 -0
  336. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/token_caching/cacheable_prefix_detection.py +0 -0
  337. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/token_caching/register_callbacks.py +0 -0
  338. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/token_caching/stats_display.py +0 -0
  339. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/token_tracking/__init__.py +0 -0
  340. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/token_tracking/database.py +0 -0
  341. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/token_tracking/edit_analyzer.py +0 -0
  342. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/token_tracking/record.py +0 -0
  343. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/token_tracking/register_callbacks.py +0 -0
  344. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/token_tracking/reports.py +0 -0
  345. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/tps_meter/__init__.py +0 -0
  346. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/tps_meter/register_callbacks.py +0 -0
  347. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/__init__.py +0 -0
  348. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/models.py +0 -0
  349. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/register_callbacks.py +0 -0
  350. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/registry.py +0 -0
  351. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/runner.py +0 -0
  352. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/safety.py +0 -0
  353. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/sandbox.py +0 -0
  354. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/provider_identity.py +0 -0
  355. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/pydantic_patches.py +0 -0
  356. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/reopenable_async_client.py +0 -0
  357. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/round_robin_model.py +0 -0
  358. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/secret_storage.py +0 -0
  359. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/security/__init__.py +0 -0
  360. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/security/redaction.pyx +0 -0
  361. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/session_storage.py +0 -0
  362. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/status_display.py +0 -0
  363. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/stream_parser/__init__.py +0 -0
  364. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/stream_parser/assistant_text_parser.py +0 -0
  365. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/stream_parser/citation_parser.py +0 -0
  366. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/stream_parser/inline_hidden_tag_parser.py +0 -0
  367. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/stream_parser/proposed_plan_parser.py +0 -0
  368. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/stream_parser/stream_text_chunk.py +0 -0
  369. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/stream_parser/stream_text_parser.py +0 -0
  370. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/stream_parser/tagged_line_parser.pyx +0 -0
  371. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/stream_parser/utf8_stream_parser.pyx +0 -0
  372. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/summarization_agent.py +0 -0
  373. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/terminal_utils.pyx +0 -0
  374. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/__init__.py +0 -0
  375. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/agent_tools.py +0 -0
  376. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/ask_user_question/__init__.py +0 -0
  377. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/ask_user_question/constants.py +0 -0
  378. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/ask_user_question/demo_tui.py +0 -0
  379. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/ask_user_question/handler.py +0 -0
  380. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/ask_user_question/models.py +0 -0
  381. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/ask_user_question/registration.py +0 -0
  382. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/ask_user_question/renderers.py +0 -0
  383. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/ask_user_question/terminal_ui.py +0 -0
  384. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/ask_user_question/theme.py +0 -0
  385. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/ask_user_question/tui_loop.py +0 -0
  386. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/background_jobs.py +0 -0
  387. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/browser/__init__.py +0 -0
  388. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/browser/browser_control.py +0 -0
  389. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/browser/browser_interactions.py +0 -0
  390. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/browser/browser_locators.py +0 -0
  391. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/browser/browser_manager.py +0 -0
  392. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/browser/browser_navigation.py +0 -0
  393. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/browser/browser_screenshot.py +0 -0
  394. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/browser/browser_scripts.py +0 -0
  395. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/browser/browser_workflows.py +0 -0
  396. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/chrome_cdp/__init__.py +0 -0
  397. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/chrome_cdp/register_callbacks.py +0 -0
  398. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/command_runner.py +0 -0
  399. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/common.py +0 -0
  400. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/display.py +0 -0
  401. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/file_modifications.py +0 -0
  402. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/file_operations.py +0 -0
  403. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/image_tools.py +0 -0
  404. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/meetin_proxy/__init__.py +0 -0
  405. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/meetin_proxy/capture_addon.py +0 -0
  406. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/meetin_proxy/proxy_manager.py +0 -0
  407. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/meetin_proxy/register_callbacks.py +0 -0
  408. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/path_policy.py +0 -0
  409. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/skills_tools.py +0 -0
  410. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/subagent_context.py +0 -0
  411. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/tools_content.py +0 -0
  412. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/tools/universal_constructor.py +0 -0
  413. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/uvx_detection.py +0 -0
  414. {code_muse-0.1.2 → code_muse-0.1.3}/code_muse/version_checker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-muse
3
- Version: 0.1.2
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 summary you might just"
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, and recent tail."""
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; wrapping into message request"
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 ``compact(...)`` if we're over threshold.
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 = compact(
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
@@ -56,7 +56,7 @@ def build_registry_from_config(
56
56
  if not isinstance(group, dict):
57
57
  continue
58
58
 
59
- matcher = group.get("matcher", "*")
59
+ matcher = group.get("matcher") or "*"
60
60
  hooks_data = group.get("hooks", [])
61
61
 
62
62
  for hook_data in hooks_data:
@@ -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
+ {}
@@ -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,24 @@
1
+ """Multi-Agent Delegation Manager — supervisor agent with sub-agent delegation."""
2
+
3
+ from code_muse.plugins.delegation_manager.delegation_manager import DelegationManager
4
+ from code_muse.plugins.delegation_manager.supervisor_agent import SupervisorAgent
5
+
6
+
7
+ def get_delegation_manager() -> DelegationManager:
8
+ """Get the singleton DelegationManager instance."""
9
+ from code_muse.plugins.delegation_manager.register_callbacks import _get_manager
10
+
11
+ return _get_manager()
12
+
13
+
14
+ def get_supervisor_agent() -> SupervisorAgent:
15
+ """Get a fresh SupervisorAgent instance."""
16
+ return SupervisorAgent()
17
+
18
+
19
+ __all__ = [
20
+ "DelegationManager",
21
+ "SupervisorAgent",
22
+ "get_delegation_manager",
23
+ "get_supervisor_agent",
24
+ ]
@@ -0,0 +1,183 @@
1
+ """Delegation Manager — creates isolated sub-agent runs with caching.
2
+
3
+ The DelegationManager is the engine behind the Supervisor agent. It:
4
+
5
+ 1. Dynamically builds delegation tool functions (one per available agent).
6
+ 2. Caches sub-agent results to avoid re-running identical tasks.
7
+ 3. Tracks active tasks and provides graceful error handling.
8
+
9
+ Sub-agents are **fully isolated** — they receive only the task + context
10
+ that the supervisor explicitly provides. No conversation history is passed.
11
+ """
12
+
13
+ import asyncio
14
+ import hashlib
15
+ import json
16
+ import logging
17
+ import threading
18
+ from typing import Any, Callable
19
+
20
+ from pydantic_ai import Agent, RunContext, UsageLimits
21
+
22
+ from code_muse.config import get_message_limit
23
+ from code_muse.tools.subagent_context import subagent_context
24
+
25
+ logger = logging.getLogger(__name__)
26
+
27
+
28
+ class DelegationManager:
29
+ """Manages creation, caching, and execution of delegation tools."""
30
+
31
+ def __init__(self) -> None:
32
+ self._result_cache: dict[str, str] = {}
33
+ self._active_tasks: dict[str, asyncio.Task] = {}
34
+ self._lock = threading.Lock()
35
+
36
+ def create_delegation_function(
37
+ self, agent_name: str, agent_config: Any
38
+ ) -> Callable:
39
+ """Create a delegation tool function for a sub-agent.
40
+
41
+ The returned function is suitable for registration as a pydantic-ai
42
+ tool via ``agent.tool(delegate_func)``.
43
+ """
44
+
45
+ async def delegate_to(
46
+ ctx: RunContext, task_description: str, context: str = ""
47
+ ) -> str:
48
+ """Delegate a task to a specialized sub-agent.
49
+
50
+ Sub-agents are ISOLATED — they receive ONLY this task + context.
51
+ They do NOT have access to your conversation history or prior tool
52
+ results.
53
+
54
+ Args:
55
+ task_description: Clear, detailed task for the sub-agent.
56
+ context: ALL context the sub-agent needs (file paths, code
57
+ snippets, error messages, etc.) since they're isolated from
58
+ conversation.
59
+ """
60
+ cache_key = self._make_cache_key(agent_name, task_description, context)
61
+
62
+ # Check cache first
63
+ cached = self._get_cached(cache_key)
64
+ if cached is not None:
65
+ return cached
66
+
67
+ # Execute sub-agent
68
+ result = await self._run_subagent(
69
+ agent_name, task_description, context, cache_key
70
+ )
71
+ return result
72
+
73
+ # Fix up metadata so pydantic-ai schema generation is clean
74
+ safe_name = agent_name.replace("-", "_")
75
+ delegate_to.__name__ = f"delegate_to_{safe_name}"
76
+ delegate_to.__doc__ = (
77
+ f"Delegate a task to the {agent_name} sub-agent. "
78
+ f"The sub-agent is isolated — it only receives the task + context you provide.\n\n"
79
+ f"Args:\n"
80
+ f" task_description: The task to perform\n"
81
+ f" context: All relevant context (file paths, code, errors, etc.)"
82
+ )
83
+ return delegate_to
84
+
85
+ # ------------------------------------------------------------------
86
+ # Cache helpers
87
+ # ------------------------------------------------------------------
88
+
89
+ def _make_cache_key(self, agent_name: str, task: str, context: str) -> str:
90
+ raw = f"{agent_name}:{task}:{context}"
91
+ return hashlib.sha256(raw.encode()).hexdigest()[:32]
92
+
93
+ def _get_cached(self, cache_key: str) -> str | None:
94
+ with self._lock:
95
+ return self._result_cache.get(cache_key)
96
+
97
+ def _cache_result(self, cache_key: str, result: str) -> None:
98
+ with self._lock:
99
+ self._result_cache[cache_key] = result
100
+
101
+ # ------------------------------------------------------------------
102
+ # Sub-agent execution
103
+ # ------------------------------------------------------------------
104
+
105
+ async def _run_subagent(
106
+ self, agent_name: str, task_desc: str, context: str, cache_key: str
107
+ ) -> str:
108
+ """Invoke the sub-agent using Muse's agent construction pattern.
109
+
110
+ Mimics ``code_muse/tools/agent_tools.py::invoke_agent`` but with
111
+ **full isolation**: no message history, no prior context, no
112
+ session persistence.
113
+ """
114
+ from code_muse.agents.agent_manager import load_agent
115
+ from code_muse.model_factory import ModelFactory, make_model_settings
116
+ from code_muse.tools import register_tools_for_agent
117
+
118
+ try:
119
+ # Load sub-agent config
120
+ sub_agent_config = load_agent(agent_name)
121
+
122
+ # Build prompt with full context (no history = isolated)
123
+ instructions = sub_agent_config.get_full_system_prompt()
124
+
125
+ # Load muse rules if available
126
+ try:
127
+ from code_muse.agents._builder import load_muse_rules
128
+
129
+ rules = load_muse_rules()
130
+ if rules:
131
+ instructions += f"\n\n{rules}"
132
+ except ImportError:
133
+ pass
134
+
135
+ # Load prompt additions from plugins
136
+ try:
137
+ from code_muse import callbacks
138
+
139
+ prompt_additions = callbacks.on_load_prompt()
140
+ if prompt_additions:
141
+ instructions += "\n" + "\n".join(prompt_additions)
142
+ except Exception:
143
+ pass
144
+
145
+ # Create temporary pydantic-ai agent
146
+ model_name = sub_agent_config.get_model_name()
147
+ models_config = ModelFactory.load_config()
148
+ model = ModelFactory.get_model(model_name, models_config)
149
+
150
+ model_settings = make_model_settings(model_name)
151
+
152
+ temp_agent = Agent(
153
+ model=model,
154
+ instructions=instructions,
155
+ output_type=str,
156
+ retries=2,
157
+ model_settings=model_settings,
158
+ )
159
+
160
+ # Register tools for the sub-agent
161
+ agent_tools = sub_agent_config.get_available_tools()
162
+ register_tools_for_agent(temp_agent, agent_tools, model_name=model_name)
163
+
164
+ # Build the combined prompt
165
+ prompt = f"## Task\n\n{task_desc}\n\n## Context\n\n{context}"
166
+
167
+ # Run the sub-agent with isolation
168
+ with subagent_context(agent_name):
169
+ result = await temp_agent.run(
170
+ prompt,
171
+ message_history=[], # ISOLATED — no history!
172
+ usage_limits=UsageLimits(request_limit=get_message_limit()),
173
+ )
174
+
175
+ response = result.output if result.output else ""
176
+ self._cache_result(cache_key, response)
177
+ return response
178
+
179
+ except Exception as e:
180
+ logger.warning(f"Sub-agent {agent_name} failed: {e}")
181
+ error_msg = f"Error in {agent_name} sub-agent: {type(e).__name__}: {e}"
182
+ self._cache_result(cache_key, error_msg)
183
+ return error_msg
@@ -0,0 +1,109 @@
1
+ """Register delegation manager callbacks.
2
+
3
+ Registers:
4
+ - Supervisor agent via register_agents hook
5
+ - Delegation tools via register_tools hook
6
+ - /supervisor command for easy activation
7
+ """
8
+
9
+ import logging
10
+ from typing import Any
11
+
12
+ from code_muse.callbacks import register_callback
13
+ from code_muse.messaging import emit_info, emit_success
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+ # Lazy manager singleton
18
+ _manager = None
19
+
20
+
21
+ def _get_manager():
22
+ global _manager
23
+ if _manager is None:
24
+ from code_muse.plugins.delegation_manager.delegation_manager import (
25
+ DelegationManager,
26
+ )
27
+
28
+ _manager = DelegationManager()
29
+ return _manager
30
+
31
+
32
+ def _register_agents():
33
+ """Register the supervisor agent."""
34
+ from code_muse.plugins.delegation_manager.supervisor_agent import SupervisorAgent
35
+
36
+ return [{"name": "supervisor", "class": SupervisorAgent}]
37
+
38
+
39
+ def _register_delegation_tools() -> list[dict[str, Any]]:
40
+ """Dynamically create delegation tools for all available agents."""
41
+ from code_muse.agents.agent_manager import load_agent
42
+ from code_muse.agents import get_available_agents
43
+
44
+ manager = _get_manager()
45
+
46
+ tools = []
47
+ agents = get_available_agents()
48
+
49
+ for agent_name in agents:
50
+ # Skip self
51
+ if agent_name == "supervisor":
52
+ continue
53
+ # Create delegation function using the manager
54
+ try:
55
+ agent_config = load_agent(agent_name)
56
+ delegate_func = manager.create_delegation_function(agent_name, agent_config)
57
+ tool_name = f"delegate_to_{agent_name.replace('-', '_')}"
58
+ tools.append(
59
+ {
60
+ "name": tool_name,
61
+ "register_func": lambda a, f=delegate_func: a.tool(f),
62
+ }
63
+ )
64
+ except Exception as e:
65
+ logger.warning(
66
+ f"Could not create delegation tool for {agent_name}: {e}"
67
+ )
68
+
69
+ return tools
70
+
71
+
72
+ def _on_custom_command_help():
73
+ return [
74
+ (
75
+ "supervisor",
76
+ "Switch to Supervisor agent for multi-agent task orchestration",
77
+ ),
78
+ ]
79
+
80
+
81
+ async def _on_custom_command(command: str, name: str):
82
+ if name != "supervisor":
83
+ return None
84
+
85
+ from code_muse.agents.agent_manager import set_current_agent
86
+
87
+ success = set_current_agent("supervisor")
88
+ if success:
89
+ emit_success(
90
+ "Switched to Supervisor agent. I can delegate tasks to specialized sub-agents!"
91
+ )
92
+ else:
93
+ emit_info("Could not find Supervisor agent.")
94
+ return True
95
+
96
+
97
+ def _on_startup():
98
+ """Pre-warm the manager on startup."""
99
+ _get_manager()
100
+
101
+
102
+ # Register all callbacks
103
+ register_callback("startup", _on_startup)
104
+ register_callback("register_agents", _register_agents)
105
+ register_callback("register_tools", _register_delegation_tools)
106
+ register_callback("custom_command_help", _on_custom_command_help)
107
+ register_callback("custom_command", _on_custom_command)
108
+
109
+ logger.debug("Delegation Manager plugin callbacks registered")