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.
Files changed (394) hide show
  1. code_muse/__init__.py +26 -0
  2. code_muse/__main__.py +10 -0
  3. code_muse/agents/__init__.py +31 -0
  4. code_muse/agents/_builder.py +214 -0
  5. code_muse/agents/_compaction.py +506 -0
  6. code_muse/agents/_diagnostics.py +171 -0
  7. code_muse/agents/_history.py +382 -0
  8. code_muse/agents/_key_listeners.py +148 -0
  9. code_muse/agents/_non_streaming_render.py +148 -0
  10. code_muse/agents/_runtime.py +596 -0
  11. code_muse/agents/agent_creator_agent.py +603 -0
  12. code_muse/agents/agent_helios.py +47 -0
  13. code_muse/agents/agent_manager.py +740 -0
  14. code_muse/agents/agent_muse.py +78 -0
  15. code_muse/agents/agent_planning.py +44 -0
  16. code_muse/agents/agent_qa_melpomene.py +207 -0
  17. code_muse/agents/base_agent.py +194 -0
  18. code_muse/agents/event_stream_handler.py +361 -0
  19. code_muse/agents/json_agent.py +201 -0
  20. code_muse/agents/prompt_v3.py +521 -0
  21. code_muse/agents/subagent_stream_handler.py +273 -0
  22. code_muse/callbacks.py +941 -0
  23. code_muse/chatgpt_codex_client.py +333 -0
  24. code_muse/claude_cache_client.py +853 -0
  25. code_muse/cli_runner/__init__.py +319 -0
  26. code_muse/cli_runner/args.py +63 -0
  27. code_muse/cli_runner/loop.py +510 -0
  28. code_muse/cli_runner/resume.py +72 -0
  29. code_muse/cli_runner/runner.py +161 -0
  30. code_muse/command_line/__init__.py +1 -0
  31. code_muse/command_line/add_model_menu.py +1331 -0
  32. code_muse/command_line/agent_menu.py +674 -0
  33. code_muse/command_line/attachments.py +397 -0
  34. code_muse/command_line/autosave_menu.py +709 -0
  35. code_muse/command_line/clipboard.py +528 -0
  36. code_muse/command_line/colors_menu.py +530 -0
  37. code_muse/command_line/command_handler.py +262 -0
  38. code_muse/command_line/command_registry.py +150 -0
  39. code_muse/command_line/config_commands.py +711 -0
  40. code_muse/command_line/core_commands.py +740 -0
  41. code_muse/command_line/diff_menu.py +865 -0
  42. code_muse/command_line/file_path_completion.py +73 -0
  43. code_muse/command_line/load_context_completion.py +57 -0
  44. code_muse/command_line/model_picker_completion.py +512 -0
  45. code_muse/command_line/model_settings_menu.py +983 -0
  46. code_muse/command_line/onboarding_slides.py +162 -0
  47. code_muse/command_line/onboarding_wizard.py +337 -0
  48. code_muse/command_line/pagination.py +41 -0
  49. code_muse/command_line/pin_command_completion.py +329 -0
  50. code_muse/command_line/prompt_toolkit_completion.py +886 -0
  51. code_muse/command_line/session_commands.py +304 -0
  52. code_muse/command_line/shell_passthrough.py +145 -0
  53. code_muse/command_line/skills_completion.py +158 -0
  54. code_muse/command_line/types.py +18 -0
  55. code_muse/command_line/uc_menu.py +908 -0
  56. code_muse/command_line/utils.py +105 -0
  57. code_muse/command_line/wiggum_state.py +77 -0
  58. code_muse/config.py +1138 -0
  59. code_muse/config_agent.py +168 -0
  60. code_muse/config_appearance.py +241 -0
  61. code_muse/config_model.py +357 -0
  62. code_muse/config_security.py +73 -0
  63. code_muse/error_logging.py +132 -0
  64. code_muse/evals/__init__.py +35 -0
  65. code_muse/evals/eval_helpers.py +81 -0
  66. code_muse/evals/eval_runner.py +299 -0
  67. code_muse/evals/sample_evals/__init__.py +1 -0
  68. code_muse/evals/sample_evals/eval_frugal_reads.py +59 -0
  69. code_muse/evals/sample_evals/eval_memory_planning.py +31 -0
  70. code_muse/evals/sample_evals/eval_shell_efficiency.py +39 -0
  71. code_muse/evals/sample_evals/eval_tool_masking.py +33 -0
  72. code_muse/fs_scan_cache/__init__.py +31 -0
  73. code_muse/fs_scan_cache/invalidation_hooks.py +89 -0
  74. code_muse/fs_scan_cache/scan_cache_core.cpython-314-darwin.so +0 -0
  75. code_muse/fs_scan_cache/scan_cache_core.pyx +203 -0
  76. code_muse/fs_scan_cache/tool_integration.py +309 -0
  77. code_muse/fs_scan_cache/ttl_policy.py +44 -0
  78. code_muse/gemini_code_assist.py +383 -0
  79. code_muse/gemini_model.py +838 -0
  80. code_muse/hook_engine/README.md +105 -0
  81. code_muse/hook_engine/__init__.py +21 -0
  82. code_muse/hook_engine/aliases.py +153 -0
  83. code_muse/hook_engine/engine.py +221 -0
  84. code_muse/hook_engine/executor.py +347 -0
  85. code_muse/hook_engine/matcher.py +154 -0
  86. code_muse/hook_engine/models.py +245 -0
  87. code_muse/hook_engine/registry.py +114 -0
  88. code_muse/hook_engine/trust.py +268 -0
  89. code_muse/hook_engine/validator.py +144 -0
  90. code_muse/http_utils.py +360 -0
  91. code_muse/keymap.py +128 -0
  92. code_muse/list_filtering.py +26 -0
  93. code_muse/main.py +10 -0
  94. code_muse/messaging/__init__.py +259 -0
  95. code_muse/messaging/bus.py +621 -0
  96. code_muse/messaging/commands.py +166 -0
  97. code_muse/messaging/markdown_patches.py +57 -0
  98. code_muse/messaging/message_queue.py +397 -0
  99. code_muse/messaging/messages.py +591 -0
  100. code_muse/messaging/queue_console.py +269 -0
  101. code_muse/messaging/renderers.py +308 -0
  102. code_muse/messaging/rich_renderer.py +1158 -0
  103. code_muse/messaging/shimmer.py +154 -0
  104. code_muse/messaging/spinner/__init__.py +87 -0
  105. code_muse/messaging/spinner/console_spinner.py +250 -0
  106. code_muse/messaging/spinner/spinner_base.py +82 -0
  107. code_muse/messaging/subagent_console.py +458 -0
  108. code_muse/model_factory.py +1203 -0
  109. code_muse/model_switching.py +59 -0
  110. code_muse/model_utils.py +156 -0
  111. code_muse/models.json +66 -0
  112. code_muse/models_cache/__init__.py +26 -0
  113. code_muse/models_cache/blocking_lru_cache.py +98 -0
  114. code_muse/models_cache/cache_writer.py +86 -0
  115. code_muse/models_cache/sha256_hash.cpython-314-darwin.so +0 -0
  116. code_muse/models_cache/sha256_hash.pyx +34 -0
  117. code_muse/models_cache/startup_integration.py +75 -0
  118. code_muse/models_dev_api.json +1 -0
  119. code_muse/models_dev_parser.py +590 -0
  120. code_muse/motion.py +126 -0
  121. code_muse/plugins/__init__.py +471 -0
  122. code_muse/plugins/agent_skills/__init__.py +32 -0
  123. code_muse/plugins/agent_skills/config.py +176 -0
  124. code_muse/plugins/agent_skills/discovery.py +309 -0
  125. code_muse/plugins/agent_skills/downloader.py +389 -0
  126. code_muse/plugins/agent_skills/installer.py +19 -0
  127. code_muse/plugins/agent_skills/metadata.py +293 -0
  128. code_muse/plugins/agent_skills/prompt_builder.py +66 -0
  129. code_muse/plugins/agent_skills/register_callbacks.py +298 -0
  130. code_muse/plugins/agent_skills/remote_catalog.py +320 -0
  131. code_muse/plugins/agent_skills/skill_catalog.py +254 -0
  132. code_muse/plugins/agent_skills/skills_install_menu.py +690 -0
  133. code_muse/plugins/agent_skills/skills_menu.py +791 -0
  134. code_muse/plugins/autonomous_memory/__init__.py +39 -0
  135. code_muse/plugins/autonomous_memory/bm25_scorer.cpython-314-darwin.so +0 -0
  136. code_muse/plugins/autonomous_memory/bm25_scorer.cpython-314-x86_64-linux-gnu.so +0 -0
  137. code_muse/plugins/autonomous_memory/bm25_scorer.pyx +291 -0
  138. code_muse/plugins/autonomous_memory/consolidation.py +82 -0
  139. code_muse/plugins/autonomous_memory/extraction.py +382 -0
  140. code_muse/plugins/autonomous_memory/lease_lock.py +105 -0
  141. code_muse/plugins/autonomous_memory/memory_injection.py +59 -0
  142. code_muse/plugins/autonomous_memory/register_callbacks.py +268 -0
  143. code_muse/plugins/autonomous_memory/secret_scanner.py +62 -0
  144. code_muse/plugins/autonomous_memory/session_scanner.py +163 -0
  145. code_muse/plugins/aws_bedrock/__init__.py +14 -0
  146. code_muse/plugins/aws_bedrock/config.py +99 -0
  147. code_muse/plugins/aws_bedrock/register_callbacks.py +241 -0
  148. code_muse/plugins/aws_bedrock/utils.py +153 -0
  149. code_muse/plugins/azure_foundry/README.md +238 -0
  150. code_muse/plugins/azure_foundry/__init__.py +15 -0
  151. code_muse/plugins/azure_foundry/config.py +125 -0
  152. code_muse/plugins/azure_foundry/discovery.py +187 -0
  153. code_muse/plugins/azure_foundry/register_callbacks.py +495 -0
  154. code_muse/plugins/azure_foundry/token.py +180 -0
  155. code_muse/plugins/azure_foundry/utils.py +345 -0
  156. code_muse/plugins/build_filter/__init__.py +1 -0
  157. code_muse/plugins/build_filter/register_callbacks.py +201 -0
  158. code_muse/plugins/build_filter/strategies/__init__.py +1 -0
  159. code_muse/plugins/build_filter/strategies/build.py +397 -0
  160. code_muse/plugins/chatgpt_oauth/__init__.py +6 -0
  161. code_muse/plugins/chatgpt_oauth/config.py +52 -0
  162. code_muse/plugins/chatgpt_oauth/oauth_flow.py +338 -0
  163. code_muse/plugins/chatgpt_oauth/register_callbacks.py +172 -0
  164. code_muse/plugins/chatgpt_oauth/test_plugin.py +301 -0
  165. code_muse/plugins/chatgpt_oauth/utils.py +538 -0
  166. code_muse/plugins/checkpointing/__init__.py +29 -0
  167. code_muse/plugins/checkpointing/checkpoint_hook.py +51 -0
  168. code_muse/plugins/checkpointing/conversation_snapshots.py +117 -0
  169. code_muse/plugins/checkpointing/register_callbacks.py +51 -0
  170. code_muse/plugins/checkpointing/restore_command.py +263 -0
  171. code_muse/plugins/checkpointing/rewind_shortcut.py +88 -0
  172. code_muse/plugins/checkpointing/shadow_git.py +90 -0
  173. code_muse/plugins/claude_code_hooks/__init__.py +1 -0
  174. code_muse/plugins/claude_code_hooks/config.py +188 -0
  175. code_muse/plugins/claude_code_hooks/register_callbacks.py +208 -0
  176. code_muse/plugins/claude_code_oauth/README.md +167 -0
  177. code_muse/plugins/claude_code_oauth/SETUP.md +93 -0
  178. code_muse/plugins/claude_code_oauth/__init__.py +25 -0
  179. code_muse/plugins/claude_code_oauth/config.py +52 -0
  180. code_muse/plugins/claude_code_oauth/fast_mode.py +124 -0
  181. code_muse/plugins/claude_code_oauth/prompt_handler.py +63 -0
  182. code_muse/plugins/claude_code_oauth/register_callbacks.py +547 -0
  183. code_muse/plugins/claude_code_oauth/test_fast_mode.py +165 -0
  184. code_muse/plugins/claude_code_oauth/test_plugin.py +283 -0
  185. code_muse/plugins/claude_code_oauth/token_refresh_heartbeat.py +237 -0
  186. code_muse/plugins/claude_code_oauth/utils.py +664 -0
  187. code_muse/plugins/copilot_auth/__init__.py +11 -0
  188. code_muse/plugins/copilot_auth/config.py +91 -0
  189. code_muse/plugins/copilot_auth/reasoning_client.py +409 -0
  190. code_muse/plugins/copilot_auth/register_callbacks.py +461 -0
  191. code_muse/plugins/copilot_auth/utils.py +584 -0
  192. code_muse/plugins/custom_commands/__init__.py +14 -0
  193. code_muse/plugins/custom_commands/args_injection.py +82 -0
  194. code_muse/plugins/custom_commands/command_discovery.py +89 -0
  195. code_muse/plugins/custom_commands/command_toml_schema.py +71 -0
  196. code_muse/plugins/custom_commands/register_callbacks.py +176 -0
  197. code_muse/plugins/customizable_commands/__init__.py +0 -0
  198. code_muse/plugins/customizable_commands/register_callbacks.py +136 -0
  199. code_muse/plugins/destructive_command_guard/__init__.py +14 -0
  200. code_muse/plugins/destructive_command_guard/detector.py +375 -0
  201. code_muse/plugins/destructive_command_guard/register_callbacks.py +148 -0
  202. code_muse/plugins/example_custom_command/README.md +280 -0
  203. code_muse/plugins/example_custom_command/register_callbacks.py +51 -0
  204. code_muse/plugins/file_permission_handler/__init__.py +4 -0
  205. code_muse/plugins/file_permission_handler/register_callbacks.py +441 -0
  206. code_muse/plugins/filter_engine/__init__.py +30 -0
  207. code_muse/plugins/filter_engine/classifier.py +153 -0
  208. code_muse/plugins/filter_engine/content_detector.py +184 -0
  209. code_muse/plugins/filter_engine/dispatcher.py +244 -0
  210. code_muse/plugins/filter_engine/register_callbacks.py +188 -0
  211. code_muse/plugins/filter_engine/registry.py +279 -0
  212. code_muse/plugins/filter_engine/strategies/__init__.py +8 -0
  213. code_muse/plugins/filter_engine/strategies/ast_compressor.cpython-314-darwin.so +0 -0
  214. code_muse/plugins/filter_engine/strategies/ast_compressor.cpython-314-x86_64-linux-gnu.so +0 -0
  215. code_muse/plugins/filter_engine/strategies/ast_compressor.pyx +348 -0
  216. code_muse/plugins/filter_engine/strategies/ast_parser.py +167 -0
  217. code_muse/plugins/filter_engine/strategies/code.cpython-314-darwin.so +0 -0
  218. code_muse/plugins/filter_engine/strategies/code.cpython-314-x86_64-linux-gnu.so +0 -0
  219. code_muse/plugins/filter_engine/strategies/code.pyx +584 -0
  220. code_muse/plugins/filter_engine/strategies/git.cpython-314-darwin.so +0 -0
  221. code_muse/plugins/filter_engine/strategies/git.cpython-314-x86_64-linux-gnu.so +0 -0
  222. code_muse/plugins/filter_engine/strategies/git.pyx +438 -0
  223. code_muse/plugins/filter_engine/strategies/json_compressor.cpython-314-darwin.so +0 -0
  224. code_muse/plugins/filter_engine/strategies/json_compressor.pyx +253 -0
  225. code_muse/plugins/filter_engine/strategies/json_patterns.cpython-314-darwin.so +0 -0
  226. code_muse/plugins/filter_engine/strategies/json_patterns.pyx +178 -0
  227. code_muse/plugins/filter_engine/strategies/lint.cpython-314-darwin.so +0 -0
  228. code_muse/plugins/filter_engine/strategies/lint.cpython-314-x86_64-linux-gnu.so +0 -0
  229. code_muse/plugins/filter_engine/strategies/lint.pyx +626 -0
  230. code_muse/plugins/filter_engine/strategies/test.cpython-314-darwin.so +0 -0
  231. code_muse/plugins/filter_engine/strategies/test.cpython-314-x86_64-linux-gnu.so +0 -0
  232. code_muse/plugins/filter_engine/strategies/test.pyx +431 -0
  233. code_muse/plugins/filter_engine/verbosity.py +63 -0
  234. code_muse/plugins/force_push_guard/__init__.py +5 -0
  235. code_muse/plugins/force_push_guard/detector.py +96 -0
  236. code_muse/plugins/force_push_guard/register_callbacks.py +144 -0
  237. code_muse/plugins/force_push_guard/test_detector.py +143 -0
  238. code_muse/plugins/frontend_emitter/__init__.py +25 -0
  239. code_muse/plugins/frontend_emitter/emitter.py +121 -0
  240. code_muse/plugins/frontend_emitter/register_callbacks.py +259 -0
  241. code_muse/plugins/gac/__init__.py +4 -0
  242. code_muse/plugins/gac/git_ops.py +136 -0
  243. code_muse/plugins/gac/prompt.py +191 -0
  244. code_muse/plugins/gac/register_callbacks.py +82 -0
  245. code_muse/plugins/hook_creator/__init__.py +1 -0
  246. code_muse/plugins/hook_creator/register_callbacks.py +34 -0
  247. code_muse/plugins/hook_manager/__init__.py +1 -0
  248. code_muse/plugins/hook_manager/config.py +289 -0
  249. code_muse/plugins/hook_manager/hooks_menu.py +563 -0
  250. code_muse/plugins/hook_manager/register_callbacks.py +227 -0
  251. code_muse/plugins/hook_monitor/register_callbacks.py +36 -0
  252. code_muse/plugins/mindpack/__init__.py +0 -0
  253. code_muse/plugins/mindpack/factory.py +930 -0
  254. code_muse/plugins/mindpack/judge.py +573 -0
  255. code_muse/plugins/mindpack/memory.py +100 -0
  256. code_muse/plugins/mindpack/mindpack_menu.py +1552 -0
  257. code_muse/plugins/mindpack/orchestration.py +605 -0
  258. code_muse/plugins/mindpack/register_callbacks.py +175 -0
  259. code_muse/plugins/mindpack/schemas.py +358 -0
  260. code_muse/plugins/mindpack/tools.py +387 -0
  261. code_muse/plugins/oauth_muse_html.py +226 -0
  262. code_muse/plugins/ollama_setup/__init__.py +5 -0
  263. code_muse/plugins/ollama_setup/completer.py +36 -0
  264. code_muse/plugins/ollama_setup/register_callbacks.py +410 -0
  265. code_muse/plugins/plan_command/__init__.py +0 -0
  266. code_muse/plugins/plan_command/register_callbacks.py +206 -0
  267. code_muse/plugins/plan_mode/__init__.py +37 -0
  268. code_muse/plugins/plan_mode/mode_cycling.py +40 -0
  269. code_muse/plugins/plan_mode/plan_generation.py +68 -0
  270. code_muse/plugins/plan_mode/plan_hooks.py +74 -0
  271. code_muse/plugins/plan_mode/plan_mode_tools.py +138 -0
  272. code_muse/plugins/plan_mode/register_callbacks.py +121 -0
  273. code_muse/plugins/plugin_trust/register_callbacks.py +140 -0
  274. code_muse/plugins/policy_engine/__init__.py +46 -0
  275. code_muse/plugins/policy_engine/approval_flow_integration.py +59 -0
  276. code_muse/plugins/policy_engine/policy_evaluator.py +75 -0
  277. code_muse/plugins/policy_engine/policy_file_discovery.py +90 -0
  278. code_muse/plugins/policy_engine/policy_toml_schema.py +115 -0
  279. code_muse/plugins/policy_engine/register_callbacks.py +112 -0
  280. code_muse/plugins/pop_command/__init__.py +1 -0
  281. code_muse/plugins/pop_command/register_callbacks.py +189 -0
  282. code_muse/plugins/prompt_newline/__init__.py +13 -0
  283. code_muse/plugins/prompt_newline/config.py +19 -0
  284. code_muse/plugins/prompt_newline/register_callbacks.py +159 -0
  285. code_muse/plugins/safety_status/__init__.py +0 -0
  286. code_muse/plugins/safety_status/register_callbacks.py +113 -0
  287. code_muse/plugins/semantic_compression/__init__.py +6 -0
  288. code_muse/plugins/semantic_compression/compressor.py +295 -0
  289. code_muse/plugins/semantic_compression/config.py +123 -0
  290. code_muse/plugins/semantic_compression/register_callbacks.py +320 -0
  291. code_muse/plugins/shell_minimizer/__init__.py +50 -0
  292. code_muse/plugins/shell_minimizer/builtin_filters.toml +393 -0
  293. code_muse/plugins/shell_minimizer/pipeline.py +556 -0
  294. code_muse/plugins/shell_minimizer/primitives.py +482 -0
  295. code_muse/plugins/shell_minimizer/register_callbacks.py +276 -0
  296. code_muse/plugins/shell_safety/__init__.py +6 -0
  297. code_muse/plugins/shell_safety/agent_shell_safety.py +69 -0
  298. code_muse/plugins/shell_safety/command_cache.py +149 -0
  299. code_muse/plugins/shell_safety/register_callbacks.py +202 -0
  300. code_muse/plugins/synthetic_status/__init__.py +1 -0
  301. code_muse/plugins/synthetic_status/register_callbacks.py +128 -0
  302. code_muse/plugins/synthetic_status/status_api.py +145 -0
  303. code_muse/plugins/token_caching/__init__.py +21 -0
  304. code_muse/plugins/token_caching/cache_hit_tracking.py +128 -0
  305. code_muse/plugins/token_caching/cacheable_prefix_detection.py +28 -0
  306. code_muse/plugins/token_caching/register_callbacks.py +54 -0
  307. code_muse/plugins/token_caching/stats_display.py +35 -0
  308. code_muse/plugins/token_tracking/__init__.py +26 -0
  309. code_muse/plugins/token_tracking/database.py +381 -0
  310. code_muse/plugins/token_tracking/edit_analyzer.py +97 -0
  311. code_muse/plugins/token_tracking/record.py +55 -0
  312. code_muse/plugins/token_tracking/register_callbacks.py +277 -0
  313. code_muse/plugins/token_tracking/reports.py +329 -0
  314. code_muse/plugins/universal_constructor/__init__.py +13 -0
  315. code_muse/plugins/universal_constructor/models.py +136 -0
  316. code_muse/plugins/universal_constructor/register_callbacks.py +47 -0
  317. code_muse/plugins/universal_constructor/registry.py +390 -0
  318. code_muse/plugins/universal_constructor/runner.py +474 -0
  319. code_muse/plugins/universal_constructor/safety.py +440 -0
  320. code_muse/plugins/universal_constructor/sandbox.py +584 -0
  321. code_muse/provider_identity.py +105 -0
  322. code_muse/pydantic_patches.py +410 -0
  323. code_muse/reopenable_async_client.py +233 -0
  324. code_muse/round_robin_model.py +151 -0
  325. code_muse/secret_storage.py +74 -0
  326. code_muse/security/__init__.py +1 -0
  327. code_muse/security/redaction.cpython-314-darwin.so +0 -0
  328. code_muse/security/redaction.cpython-314-x86_64-linux-gnu.so +0 -0
  329. code_muse/security/redaction.pyx +135 -0
  330. code_muse/session_storage.py +565 -0
  331. code_muse/status_display.py +261 -0
  332. code_muse/stream_parser/__init__.py +76 -0
  333. code_muse/stream_parser/assistant_text_parser.py +90 -0
  334. code_muse/stream_parser/citation_parser.py +76 -0
  335. code_muse/stream_parser/inline_hidden_tag_parser.py +236 -0
  336. code_muse/stream_parser/proposed_plan_parser.py +158 -0
  337. code_muse/stream_parser/stream_text_chunk.py +23 -0
  338. code_muse/stream_parser/stream_text_parser.py +27 -0
  339. code_muse/stream_parser/tagged_line_parser.cpython-314-darwin.so +0 -0
  340. code_muse/stream_parser/tagged_line_parser.pyx +251 -0
  341. code_muse/stream_parser/utf8_stream_parser.cpython-314-darwin.so +0 -0
  342. code_muse/stream_parser/utf8_stream_parser.pyx +206 -0
  343. code_muse/summarization_agent.py +308 -0
  344. code_muse/terminal_utils.cpython-314-darwin.so +0 -0
  345. code_muse/terminal_utils.cpython-314-x86_64-linux-gnu.so +0 -0
  346. code_muse/terminal_utils.pyx +483 -0
  347. code_muse/tools/__init__.py +459 -0
  348. code_muse/tools/agent_tools.py +613 -0
  349. code_muse/tools/ask_user_question/__init__.py +26 -0
  350. code_muse/tools/ask_user_question/constants.py +73 -0
  351. code_muse/tools/ask_user_question/demo_tui.py +55 -0
  352. code_muse/tools/ask_user_question/handler.py +232 -0
  353. code_muse/tools/ask_user_question/models.py +302 -0
  354. code_muse/tools/ask_user_question/registration.py +37 -0
  355. code_muse/tools/ask_user_question/renderers.py +336 -0
  356. code_muse/tools/ask_user_question/terminal_ui.py +327 -0
  357. code_muse/tools/ask_user_question/theme.py +156 -0
  358. code_muse/tools/ask_user_question/tui_loop.py +422 -0
  359. code_muse/tools/background_jobs.py +99 -0
  360. code_muse/tools/browser/__init__.py +37 -0
  361. code_muse/tools/browser/browser_control.py +289 -0
  362. code_muse/tools/browser/browser_interactions.py +545 -0
  363. code_muse/tools/browser/browser_locators.py +640 -0
  364. code_muse/tools/browser/browser_manager.py +376 -0
  365. code_muse/tools/browser/browser_navigation.py +251 -0
  366. code_muse/tools/browser/browser_screenshot.py +180 -0
  367. code_muse/tools/browser/browser_scripts.py +462 -0
  368. code_muse/tools/browser/browser_workflows.py +222 -0
  369. code_muse/tools/chrome_cdp/__init__.py +1070 -0
  370. code_muse/tools/chrome_cdp/register_callbacks.py +61 -0
  371. code_muse/tools/command_runner.py +1401 -0
  372. code_muse/tools/common.py +1407 -0
  373. code_muse/tools/display.py +87 -0
  374. code_muse/tools/file_modifications.py +1099 -0
  375. code_muse/tools/file_operations.py +860 -0
  376. code_muse/tools/image_tools.py +185 -0
  377. code_muse/tools/meetin_proxy/__init__.py +243 -0
  378. code_muse/tools/meetin_proxy/capture_addon.py +82 -0
  379. code_muse/tools/meetin_proxy/proxy_manager.py +326 -0
  380. code_muse/tools/meetin_proxy/register_callbacks.py +45 -0
  381. code_muse/tools/path_policy.py +219 -0
  382. code_muse/tools/skills_tools.py +586 -0
  383. code_muse/tools/subagent_context.py +158 -0
  384. code_muse/tools/tools_content.py +50 -0
  385. code_muse/tools/universal_constructor.py +965 -0
  386. code_muse/uvx_detection.py +241 -0
  387. code_muse/version_checker.py +86 -0
  388. code_muse-0.0.1.data/data/code_muse/models.json +66 -0
  389. code_muse-0.0.1.data/data/code_muse/models_dev_api.json +1 -0
  390. code_muse-0.0.1.dist-info/METADATA +845 -0
  391. code_muse-0.0.1.dist-info/RECORD +394 -0
  392. code_muse-0.0.1.dist-info/WHEEL +4 -0
  393. code_muse-0.0.1.dist-info/entry_points.txt +2 -0
  394. code_muse-0.0.1.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,458 @@
1
+ """SubAgentConsoleManager - Aggregated display for parallel sub-agents.
2
+
3
+ Provides a Rich Live dashboard that shows real-time status of multiple
4
+ running sub-agents, each in its own panel with spinner animations,
5
+ status badges, and performance metrics.
6
+
7
+ Usage:
8
+ >>> manager = SubAgentConsoleManager.get_instance()
9
+ >>> manager.register_agent("session-123", "muse", "gpt-4o")
10
+ >>> manager.update_agent("session-123", status="running", tool_call_count=5)
11
+ >>> manager.unregister_agent("session-123")
12
+ """
13
+
14
+ import threading
15
+ import time
16
+ from dataclasses import dataclass, field
17
+
18
+ from rich.console import Console, Group
19
+ from rich.live import Live
20
+ from rich.panel import Panel
21
+ from rich.table import Table
22
+ from rich.text import Text
23
+
24
+ from code_muse.messaging.messages import SubAgentStatusMessage
25
+
26
+ # =============================================================================
27
+ # Status Configuration
28
+ # =============================================================================
29
+
30
+ STATUS_STYLES = {
31
+ "starting": {"color": "cyan", "spinner": "radar", "emoji": "🚀"},
32
+ "running": {"color": "green", "spinner": "radar", "emoji": "[Run]"},
33
+ "thinking": {"color": "magenta", "spinner": "radar", "emoji": "🤔"},
34
+ "tool_calling": {"color": "yellow", "spinner": "radar", "emoji": "🔧"},
35
+ "completed": {"color": "green", "spinner": None, "emoji": "✅"},
36
+ "error": {"color": "red", "spinner": None, "emoji": "❌"},
37
+ }
38
+
39
+ DEFAULT_STYLE = {"color": "white", "spinner": "radar", "emoji": "⏳"}
40
+
41
+
42
+ # =============================================================================
43
+ # Agent State Tracking
44
+ # =============================================================================
45
+
46
+
47
+ @dataclass
48
+ class AgentState:
49
+ """Internal state tracking for a single sub-agent.
50
+
51
+ Tracks all metrics needed for rendering the agent's status panel,
52
+ including timing, tool usage, and error information.
53
+ """
54
+
55
+ session_id: str
56
+ agent_name: str
57
+ model_name: str
58
+ status: str = "starting"
59
+ tool_call_count: int = 0
60
+ token_count: int = 0
61
+ current_tool: str | None = None
62
+ start_time: float = field(default_factory=time.time)
63
+ error_message: str | None = None
64
+
65
+ def elapsed_seconds(self) -> float:
66
+ """Calculate elapsed time since agent started."""
67
+ return time.time() - self.start_time
68
+
69
+ def elapsed_formatted(self) -> str:
70
+ """Format elapsed time as human-readable string."""
71
+ elapsed = self.elapsed_seconds()
72
+ if elapsed < 60:
73
+ return f"{elapsed:.1f}s"
74
+ minutes = int(elapsed // 60)
75
+ seconds = elapsed % 60
76
+ return f"{minutes}m {seconds:.1f}s"
77
+
78
+ def to_status_message(self) -> SubAgentStatusMessage:
79
+ """Convert to a SubAgentStatusMessage for bus emission."""
80
+ return SubAgentStatusMessage(
81
+ session_id=self.session_id,
82
+ agent_name=self.agent_name,
83
+ model_name=self.model_name,
84
+ status=self.status, # type: ignore[arg-type]
85
+ tool_call_count=self.tool_call_count,
86
+ token_count=self.token_count,
87
+ current_tool=self.current_tool,
88
+ elapsed_seconds=self.elapsed_seconds(),
89
+ error_message=self.error_message,
90
+ )
91
+
92
+
93
+ # =============================================================================
94
+ # SubAgent Console Manager
95
+ # =============================================================================
96
+
97
+
98
+ class SubAgentConsoleManager:
99
+ """Manager for displaying multiple parallel sub-agents in Rich Live panels.
100
+
101
+ This is a singleton that tracks all running sub-agents and renders them
102
+ in a unified Rich Live display. Each agent gets its own panel with:
103
+ - Agent name and session ID
104
+ - Model being used
105
+ - Status with spinner animation (for active states)
106
+ - Tool call count and current tool
107
+ - Token count
108
+ - Elapsed time
109
+
110
+ The display auto-starts when the first agent registers and auto-stops
111
+ when the last agent unregisters.
112
+
113
+ Thread-safe: All operations are protected by locks.
114
+ """
115
+
116
+ _instance: SubAgentConsoleManager | None = None
117
+ # FREE-THREADED: Singleton lock for sync-only get_instance().
118
+ _lock = threading.Lock()
119
+
120
+ def __init__(self, console: Console | None = None):
121
+ """Initialize the manager.
122
+
123
+ Args:
124
+ console: Optional Rich Console instance. If not provided,
125
+ a new one will be created.
126
+ """
127
+ self.console = console or Console()
128
+ self._agents: dict[str, AgentState] = {}
129
+ # FREE-THREADED: Reentrant lock for threaded sync display operations.
130
+ self._agents_lock = threading.RLock() # Reentrant lock for agent operations
131
+ self._live: Live | None = None
132
+ self._update_thread: threading.Thread | None = None
133
+ self._stop_event = threading.Event()
134
+
135
+ @classmethod
136
+ def get_instance(cls, console: Console | None = None) -> SubAgentConsoleManager:
137
+ """Get or create the singleton instance.
138
+
139
+ Thread-safe singleton pattern using double-checked locking.
140
+
141
+ Args:
142
+ console: Optional Rich Console to use. Only used when creating
143
+ the initial instance.
144
+
145
+ Returns:
146
+ The singleton SubAgentConsoleManager instance.
147
+ """
148
+ if cls._instance is None:
149
+ with cls._lock:
150
+ # Double-check inside lock
151
+ if cls._instance is None:
152
+ cls._instance = cls(console)
153
+ return cls._instance
154
+
155
+ @classmethod
156
+ def reset_instance(cls) -> None:
157
+ """Reset the singleton instance (primarily for testing).
158
+
159
+ Stops any running display and clears the singleton.
160
+ """
161
+ with cls._lock:
162
+ if cls._instance is not None:
163
+ cls._instance._stop_display()
164
+ cls._instance = None
165
+
166
+ # =========================================================================
167
+ # Agent Registration
168
+ # =========================================================================
169
+
170
+ def register_agent(self, session_id: str, agent_name: str, model_name: str) -> None:
171
+ """Register a new sub-agent and start display if needed.
172
+
173
+ Args:
174
+ session_id: Unique identifier for this agent session.
175
+ agent_name: Name of the agent (e.g., 'muse', 'qa-melpomene').
176
+ model_name: Name of the model being used (e.g., 'gpt-4o').
177
+ """
178
+ with self._agents_lock:
179
+ # Create new agent state
180
+ self._agents[session_id] = AgentState(
181
+ session_id=session_id,
182
+ agent_name=agent_name,
183
+ model_name=model_name,
184
+ )
185
+
186
+ # Start display if this is the first agent
187
+ if len(self._agents) == 1:
188
+ self._start_display()
189
+
190
+ def update_agent(self, session_id: str, **kwargs) -> None:
191
+ """Update status of an existing agent.
192
+
193
+ Args:
194
+ session_id: The session ID of the agent to update.
195
+ **kwargs: Fields to update. Valid fields:
196
+ - status: Current status string
197
+ - tool_call_count: Number of tools called
198
+ - token_count: Tokens in context
199
+ - current_tool: Name of tool being called (or None)
200
+ - error_message: Error message if status is 'error'
201
+ """
202
+ with self._agents_lock:
203
+ if session_id not in self._agents:
204
+ return # Silently ignore updates for unknown agents
205
+
206
+ agent = self._agents[session_id]
207
+
208
+ # Update only provided fields
209
+ if "status" in kwargs:
210
+ agent.status = kwargs["status"]
211
+ if "tool_call_count" in kwargs:
212
+ agent.tool_call_count = kwargs["tool_call_count"]
213
+ if "token_count" in kwargs:
214
+ agent.token_count = kwargs["token_count"]
215
+ if "current_tool" in kwargs:
216
+ agent.current_tool = kwargs["current_tool"]
217
+ if "error_message" in kwargs:
218
+ agent.error_message = kwargs["error_message"]
219
+
220
+ def unregister_agent(
221
+ self, session_id: str, final_status: str = "completed"
222
+ ) -> None:
223
+ """Remove an agent from tracking.
224
+
225
+ Args:
226
+ session_id: The session ID of the agent to remove.
227
+ final_status: Final status to set before removal (for display).
228
+ Defaults to 'completed'.
229
+ """
230
+ with self._agents_lock:
231
+ if session_id in self._agents:
232
+ # Set final status
233
+ self._agents[session_id].status = final_status
234
+ # Remove from tracking
235
+ del self._agents[session_id]
236
+
237
+ # Stop display if no agents remain
238
+ if not self._agents:
239
+ self._stop_display()
240
+
241
+ def get_agent_state(self, session_id: str) -> AgentState | None:
242
+ """Get the current state of an agent.
243
+
244
+ Args:
245
+ session_id: The session ID to look up.
246
+
247
+ Returns:
248
+ The AgentState if found, None otherwise.
249
+ """
250
+ with self._agents_lock:
251
+ return self._agents.get(session_id)
252
+
253
+ def get_all_agents(self) -> list[AgentState]:
254
+ """Get a list of all currently tracked agents.
255
+
256
+ Returns:
257
+ List of AgentState objects (copies to prevent mutation).
258
+ """
259
+ with self._agents_lock:
260
+ return list(self._agents.values())
261
+
262
+ # =========================================================================
263
+ # Display Management
264
+ # =========================================================================
265
+
266
+ def _start_display(self) -> None:
267
+ """Start the Rich Live display.
268
+
269
+ Creates the Live context and starts a background thread to
270
+ continuously refresh the display.
271
+ """
272
+ if self._live is not None:
273
+ return # Already running
274
+
275
+ self._stop_event.clear()
276
+
277
+ # Create Live display
278
+ self._live = Live(
279
+ self._render_display(),
280
+ console=self.console,
281
+ refresh_per_second=10,
282
+ transient=True, # Clear when stopped
283
+ )
284
+ self._live.start()
285
+
286
+ # Start background update thread
287
+ self._update_thread = threading.Thread(
288
+ target=self._update_loop, daemon=True, name="SubAgentDisplayUpdater"
289
+ )
290
+ self._update_thread.start()
291
+
292
+ def _stop_display(self) -> None:
293
+ """Stop the Rich Live display when no agents remain."""
294
+ # Signal stop
295
+ self._stop_event.set()
296
+
297
+ # Stop update thread
298
+ if self._update_thread is not None:
299
+ self._update_thread.join(timeout=1.0)
300
+ self._update_thread = None
301
+
302
+ # Stop Live display
303
+ if self._live is not None:
304
+ try:
305
+ self._live.stop()
306
+ except Exception:
307
+ pass # Ignore errors during cleanup
308
+ self._live = None
309
+
310
+ def _update_loop(self) -> None:
311
+ """Background thread that refreshes the display."""
312
+ while not self._stop_event.is_set():
313
+ try:
314
+ if self._live is not None:
315
+ self._live.update(self._render_display())
316
+ except Exception:
317
+ pass # Ignore rendering errors, keep trying
318
+
319
+ # Sleep between updates (10 FPS)
320
+ time.sleep(0.1)
321
+
322
+ # =========================================================================
323
+ # Rendering
324
+ # =========================================================================
325
+
326
+ def _render_display(self) -> Group:
327
+ """Render all agent panels as a Rich Group.
328
+
329
+ Returns:
330
+ A Group containing all agent panels stacked vertically.
331
+ """
332
+ with self._agents_lock:
333
+ if not self._agents:
334
+ return Group(Text("No active sub-agents", style="dim"))
335
+
336
+ panels = [
337
+ self._render_agent_panel(agent) for agent in self._agents.values()
338
+ ]
339
+ return Group(*panels)
340
+
341
+ def _render_agent_panel(self, agent: AgentState) -> Panel:
342
+ """Render a single agent's status panel.
343
+
344
+ Args:
345
+ agent: The AgentState to render.
346
+
347
+ Returns:
348
+ A Rich Panel containing the agent's status information.
349
+ """
350
+ style_config = STATUS_STYLES.get(agent.status, DEFAULT_STYLE)
351
+ color = style_config["color"]
352
+ spinner_name = style_config["spinner"]
353
+ emoji = style_config["emoji"]
354
+
355
+ # Build the content table
356
+ table = Table.grid(padding=(0, 2))
357
+ table.add_column("label", style="dim")
358
+ table.add_column("value")
359
+
360
+ # Status row with spinner (if active)
361
+ status_text = Text()
362
+ status_text.append(f"{emoji} ", style=color)
363
+ if spinner_name:
364
+ # For active statuses, we add the status text
365
+ # The spinner is visual only in Rich Live
366
+ status_text.append(agent.status.upper(), style=f"bold {color}")
367
+ else:
368
+ status_text.append(agent.status.upper(), style=f"bold {color}")
369
+
370
+ table.add_row("Status:", status_text)
371
+
372
+ # Model
373
+ table.add_row("Model:", Text(agent.model_name, style="cyan"))
374
+
375
+ # Session ID (truncated for display)
376
+ session_display = agent.session_id
377
+ if len(session_display) > 24:
378
+ session_display = session_display[:21] + "..."
379
+ table.add_row("Session:", Text(session_display, style="dim"))
380
+
381
+ # Tool calls
382
+ tool_text = Text()
383
+ tool_text.append(str(agent.tool_call_count), style="bold yellow")
384
+ if agent.current_tool:
385
+ tool_text.append(" (calling: ", style="dim")
386
+ tool_text.append(agent.current_tool, style="yellow")
387
+ tool_text.append(")", style="dim")
388
+ table.add_row("Tools:", tool_text)
389
+
390
+ # Token count
391
+ token_display = f"{agent.token_count:,}" if agent.token_count else "0"
392
+ table.add_row("Tokens:", Text(token_display, style="blue"))
393
+
394
+ # Elapsed time
395
+ table.add_row("Elapsed:", Text(agent.elapsed_formatted(), style="magenta"))
396
+
397
+ # Error message (if any)
398
+ if agent.error_message:
399
+ error_text = Text(agent.error_message, style="red")
400
+ table.add_row("Error:", error_text)
401
+
402
+ # Build panel title with agent name
403
+ title = Text()
404
+ title.append(agent.agent_name, style=f"bold {color}")
405
+
406
+ # Create panel
407
+ return Panel(
408
+ table,
409
+ title=title,
410
+ border_style=color,
411
+ padding=(0, 1),
412
+ )
413
+
414
+ # =========================================================================
415
+ # Context Manager Support
416
+ # =========================================================================
417
+
418
+ def __enter__(self) -> SubAgentConsoleManager:
419
+ """Support use as context manager."""
420
+ return self
421
+
422
+ def __exit__(self, exc_type, exc_val, exc_tb) -> None:
423
+ """Clean up on context exit."""
424
+ self._stop_display()
425
+
426
+
427
+ # =============================================================================
428
+ # Convenience Functions
429
+ # =============================================================================
430
+
431
+
432
+ def get_subagent_console_manager(
433
+ console: Console | None = None,
434
+ ) -> SubAgentConsoleManager:
435
+ """Get the singleton SubAgentConsoleManager instance.
436
+
437
+ Convenience function for accessing the manager.
438
+
439
+ Args:
440
+ console: Optional Rich Console (only used on first call).
441
+
442
+ Returns:
443
+ The singleton SubAgentConsoleManager.
444
+ """
445
+ return SubAgentConsoleManager.get_instance(console)
446
+
447
+
448
+ # =============================================================================
449
+ # Exports
450
+ # =============================================================================
451
+
452
+ __all__ = [
453
+ "AgentState",
454
+ "SubAgentConsoleManager",
455
+ "get_subagent_console_manager",
456
+ "STATUS_STYLES",
457
+ "DEFAULT_STYLE",
458
+ ]