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,269 @@
1
+ """
2
+ Queue-based console that mimics Rich Console but sends messages to a queue.
3
+
4
+ This allows tools to use the same Rich console interface while having
5
+ their output captured and routed through our message queue system.
6
+ """
7
+
8
+ import traceback
9
+ from typing import Any
10
+
11
+ from rich.console import Console
12
+ from rich.markdown import Markdown
13
+ from rich.table import Table
14
+ from rich.text import Text
15
+
16
+ from .message_queue import MessageQueue, MessageType, get_global_queue
17
+
18
+
19
+ class QueueConsole:
20
+ """
21
+ Console-like interface that sends messages to a queue instead of stdout.
22
+
23
+ This is designed to be a drop-in replacement for Rich Console that
24
+ routes messages through our queue system.
25
+ """
26
+
27
+ def __init__(
28
+ self,
29
+ queue: MessageQueue | None = None,
30
+ fallback_console: Console | None = None,
31
+ ):
32
+ self.queue = queue or get_global_queue()
33
+ self.fallback_console = fallback_console or Console()
34
+
35
+ def print(
36
+ self,
37
+ *values: Any,
38
+ sep: str = " ",
39
+ end: str = "\n",
40
+ style: str | None = None,
41
+ highlight: bool = True,
42
+ **kwargs,
43
+ ):
44
+ """Print values to the message queue."""
45
+ # Handle Rich objects properly
46
+ if len(values) == 1 and hasattr(values[0], "__rich_console__"):
47
+ # Single Rich object - pass it through directly
48
+ content = values[0]
49
+ message_type = self._infer_message_type_from_rich_object(content, style)
50
+ else:
51
+ # Convert to string, but handle Rich objects properly
52
+ processed_values = []
53
+ for v in values:
54
+ if hasattr(v, "__rich_console__"):
55
+ # For Rich objects, try to extract their text content
56
+ from io import StringIO
57
+
58
+ from rich.console import Console
59
+
60
+ string_io = StringIO()
61
+ # Use markup=True to properly process rich styling
62
+ # Use a reasonable width to prevent wrapping issues
63
+ temp_console = Console(
64
+ file=string_io, width=80, legacy_windows=False, markup=True
65
+ )
66
+ temp_console.print(v)
67
+ processed_values.append(string_io.getvalue().rstrip("\n"))
68
+ else:
69
+ processed_values.append(str(v))
70
+
71
+ content = sep.join(processed_values) + end
72
+ message_type = self._infer_message_type(content, style)
73
+
74
+ # Create Rich Text object if style is provided and content is string
75
+ if style and isinstance(content, str):
76
+ content = Text(content, style=style)
77
+
78
+ # Emit to queue
79
+ self.queue.emit_simple(
80
+ message_type, content, style=style, highlight=highlight, **kwargs
81
+ )
82
+
83
+ def print_exception(
84
+ self,
85
+ *,
86
+ width: int | None = None,
87
+ extra_lines: int = 3,
88
+ theme: str | None = None,
89
+ word_wrap: bool = False,
90
+ show_locals: bool = False,
91
+ indent_guides: bool = True,
92
+ suppress: tuple = (),
93
+ max_frames: int = 100,
94
+ ):
95
+ """Print exception information to the queue."""
96
+ # Get the exception traceback
97
+ exc_text = traceback.format_exc()
98
+
99
+ # Emit as error message
100
+ self.queue.emit_simple(
101
+ MessageType.ERROR,
102
+ f"Exception:\n{exc_text}",
103
+ exception=True,
104
+ show_locals=show_locals,
105
+ )
106
+
107
+ def log(
108
+ self,
109
+ *values: Any,
110
+ sep: str = " ",
111
+ end: str = "\n",
112
+ style: str | None = None,
113
+ justify: str | None = None,
114
+ emoji: bool | None = None,
115
+ markup: bool | None = None,
116
+ highlight: bool | None = None,
117
+ log_locals: bool = False,
118
+ ):
119
+ """Log a message (similar to print but with logging semantics)."""
120
+ content = sep.join(str(v) for v in values) + end
121
+
122
+ # Log messages are typically informational
123
+ message_type = MessageType.INFO
124
+ if style:
125
+ message_type = self._infer_message_type(content, style)
126
+
127
+ if style and isinstance(content, str):
128
+ content = Text(content, style=style)
129
+
130
+ self.queue.emit_simple(
131
+ message_type, content, log=True, style=style, log_locals=log_locals
132
+ )
133
+
134
+ def _infer_message_type_from_rich_object(
135
+ self, content: Any, style: str | None = None
136
+ ) -> MessageType:
137
+ """Infer message type from Rich object type and style."""
138
+ if style:
139
+ style_lower = style.lower()
140
+ if "red" in style_lower or "error" in style_lower:
141
+ return MessageType.ERROR
142
+ elif "yellow" in style_lower or "warning" in style_lower:
143
+ return MessageType.WARNING
144
+ elif "green" in style_lower or "success" in style_lower:
145
+ return MessageType.SUCCESS
146
+ elif "blue" in style_lower:
147
+ return MessageType.INFO
148
+ elif "purple" in style_lower or "magenta" in style_lower:
149
+ return MessageType.AGENT_REASONING
150
+ elif "dim" in style_lower:
151
+ return MessageType.SYSTEM
152
+
153
+ # Infer from object type
154
+ if isinstance(content, Markdown):
155
+ return MessageType.AGENT_REASONING
156
+ elif isinstance(content, Table) or hasattr(content, "lexer_name"):
157
+ return MessageType.TOOL_OUTPUT
158
+
159
+ return MessageType.INFO
160
+
161
+ def _infer_message_type(
162
+ self, content: str, style: str | None = None
163
+ ) -> MessageType:
164
+ """Infer message type from content and style."""
165
+ if style:
166
+ style_lower = style.lower()
167
+ if "red" in style_lower or "error" in style_lower:
168
+ return MessageType.ERROR
169
+ elif "yellow" in style_lower or "warning" in style_lower:
170
+ return MessageType.WARNING
171
+ elif "green" in style_lower or "success" in style_lower:
172
+ return MessageType.SUCCESS
173
+ elif "blue" in style_lower:
174
+ return MessageType.INFO
175
+ elif "purple" in style_lower or "magenta" in style_lower:
176
+ return MessageType.AGENT_REASONING
177
+ elif "dim" in style_lower:
178
+ return MessageType.SYSTEM
179
+
180
+ # Infer from content patterns
181
+ content_lower = content.lower()
182
+ if any(word in content_lower for word in ["error", "failed", "exception"]):
183
+ return MessageType.ERROR
184
+ elif any(word in content_lower for word in ["warning", "warn"]):
185
+ return MessageType.WARNING
186
+ elif any(word in content_lower for word in ["success", "completed", "done"]):
187
+ return MessageType.SUCCESS
188
+ elif any(word in content_lower for word in ["tool", "command", "running"]):
189
+ return MessageType.TOOL_OUTPUT
190
+
191
+ return MessageType.INFO
192
+
193
+ # Additional methods to maintain Rich Console compatibility
194
+ def rule(self, title: str = "", *, align: str = "center", style: str = "rule.line"):
195
+ """Print a horizontal rule."""
196
+ self.queue.emit_simple(
197
+ MessageType.SYSTEM,
198
+ f"─── {title} ───" if title else "─" * 40,
199
+ rule=True,
200
+ style=style,
201
+ )
202
+
203
+ def status(self, status: str, *, spinner: str = "dots"):
204
+ """Show a status message (simplified)."""
205
+ self.queue.emit_simple(
206
+ MessageType.INFO, f"⏳ {status}", status=True, spinner=spinner
207
+ )
208
+
209
+ def input(self, prompt: str = "") -> str:
210
+ """Get user input without spinner interference.
211
+
212
+ This method coordinates with the TUI to pause any running spinners
213
+ and properly display the user input prompt.
214
+ """
215
+ # Set the global flag that we're awaiting user input
216
+ from code_muse.tools.command_runner import set_awaiting_user_input
217
+
218
+ set_awaiting_user_input(True)
219
+
220
+ # Emit the prompt as a system message so it shows in the TUI chat
221
+ if prompt:
222
+ self.queue.emit_simple(MessageType.SYSTEM, prompt, requires_user_input=True)
223
+
224
+ # Create a new, isolated console instance specifically for input
225
+ # This bypasses any spinner or queue system interference
226
+ input_console = Console(file=__import__("sys").stderr, force_terminal=True)
227
+
228
+ # Clear any spinner artifacts and position cursor properly
229
+ if prompt:
230
+ input_console.print(prompt, end="", style="bold cyan")
231
+
232
+ # Use regular input() which will read from stdin
233
+ # Since we printed the prompt to stderr, this should work cleanly
234
+ try:
235
+ user_response = input()
236
+
237
+ # Show the user's response in the chat as well
238
+ if user_response:
239
+ self.queue.emit_simple(
240
+ MessageType.INFO, f"User response: {user_response}"
241
+ )
242
+
243
+ return user_response
244
+ except KeyboardInterrupt, EOFError:
245
+ # Handle interruption gracefully
246
+ input_console.print("\n[yellow]Input cancelled[/yellow]")
247
+ self.queue.emit_simple(MessageType.WARNING, "User input cancelled")
248
+ return ""
249
+ finally:
250
+ # Clear the global flag for awaiting user input
251
+ from code_muse.tools.command_runner import set_awaiting_user_input
252
+
253
+ set_awaiting_user_input(False)
254
+
255
+ # File-like interface for compatibility
256
+ @property
257
+ def file(self):
258
+ """Get the current file (for compatibility)."""
259
+ return self.fallback_console.file
260
+
261
+ @file.setter
262
+ def file(self, value):
263
+ """Set the current file (for compatibility)."""
264
+ self.fallback_console.file = value
265
+
266
+
267
+ def get_queue_console(queue: MessageQueue | None = None) -> QueueConsole:
268
+ """Get a QueueConsole instance."""
269
+ return QueueConsole(queue or get_global_queue())
@@ -0,0 +1,308 @@
1
+ """
2
+ Renderer implementations for different UI modes.
3
+
4
+ These renderers consume messages from the queue and display them
5
+ appropriately for their respective interfaces.
6
+ """
7
+
8
+ import asyncio
9
+ import contextlib
10
+ import threading
11
+ from abc import ABC, abstractmethod
12
+
13
+ from rich.console import Console
14
+ from rich.markdown import Markdown
15
+ from rich.markup import escape as escape_rich_markup
16
+
17
+ from .message_queue import MessageQueue, MessageType, UIMessage
18
+
19
+
20
+ class MessageRenderer(ABC):
21
+ """Base class for message renderers."""
22
+
23
+ def __init__(self, queue: MessageQueue):
24
+ self.queue = queue
25
+ self._running = False
26
+ self._task = None
27
+
28
+ @abstractmethod
29
+ async def render_message(self, message: UIMessage):
30
+ """Render a single message."""
31
+ pass
32
+
33
+ async def start(self):
34
+ """Start the renderer."""
35
+ if self._running:
36
+ return
37
+
38
+ self._running = True
39
+ # Mark the queue as having an active renderer
40
+ self.queue.mark_renderer_active()
41
+ self._task = asyncio.create_task(self._consume_messages())
42
+
43
+ async def stop(self):
44
+ """Stop the renderer."""
45
+ self._running = False
46
+ # Mark the queue as having no active renderer
47
+ self.queue.mark_renderer_inactive()
48
+ if self._task:
49
+ self._task.cancel()
50
+ with contextlib.suppress(asyncio.CancelledError):
51
+ await self._task
52
+
53
+ async def _consume_messages(self):
54
+ """Consume messages from the queue."""
55
+ while self._running:
56
+ try:
57
+ message = await asyncio.wait_for(self.queue.get_async(), timeout=0.1)
58
+ await self.render_message(message)
59
+ except TimeoutError:
60
+ continue
61
+ except asyncio.CancelledError:
62
+ break
63
+ except Exception as e:
64
+ # Log error but continue processing
65
+ # Note: Using sys.stderr - can't use messaging in renderer
66
+ import sys
67
+
68
+ sys.stderr.write(f"Error rendering message: {e}\n")
69
+
70
+
71
+ class InteractiveRenderer(MessageRenderer):
72
+ """Renderer for interactive CLI mode using Rich console.
73
+
74
+ Note: This async-based renderer is not currently used in the codebase.
75
+ Interactive mode currently uses SynchronousInteractiveRenderer instead.
76
+ A future refactoring might consolidate these renderers.
77
+ """
78
+
79
+ def __init__(self, queue: MessageQueue, console: Console | None = None):
80
+ super().__init__(queue)
81
+ self.console = console or Console()
82
+
83
+ async def render_message(self, message: UIMessage):
84
+ """Render a message using Rich console."""
85
+ # Handle human input requests
86
+ if message.type == MessageType.HUMAN_INPUT_REQUEST:
87
+ await self._handle_human_input_request(message)
88
+ return
89
+
90
+ # Convert message type to appropriate Rich styling
91
+ if message.type == MessageType.ERROR:
92
+ style = "bold red"
93
+ elif message.type == MessageType.WARNING:
94
+ style = "yellow"
95
+ elif message.type == MessageType.SUCCESS:
96
+ style = "green"
97
+ elif message.type == MessageType.TOOL_OUTPUT:
98
+ style = "blue"
99
+ elif (
100
+ message.type == MessageType.AGENT_REASONING
101
+ or message.type == MessageType.PLANNED_NEXT_STEPS
102
+ ):
103
+ style = None
104
+ elif message.type == MessageType.AGENT_RESPONSE:
105
+ # Special handling for agent responses - they'll be rendered as markdown
106
+ style = None
107
+ elif message.type == MessageType.SYSTEM:
108
+ style = "dim"
109
+ else:
110
+ style = None
111
+
112
+ # Make version messages dim regardless of message type
113
+ if isinstance(message.content, str) and (
114
+ "Current version:" in message.content
115
+ or "Latest version:" in message.content
116
+ ):
117
+ style = "dim"
118
+
119
+ # Render the content
120
+ if isinstance(message.content, str):
121
+ if message.type == MessageType.AGENT_RESPONSE:
122
+ # Render agent responses as markdown
123
+ try:
124
+ markdown = Markdown(message.content)
125
+ self.console.print(markdown)
126
+ except Exception:
127
+ # Fallback to plain text if markdown parsing fails
128
+ safe_content = escape_rich_markup(message.content)
129
+ self.console.print(safe_content)
130
+ elif style:
131
+ # Escape Rich markup to prevent crashes from malformed tags
132
+ safe_content = escape_rich_markup(message.content)
133
+ self.console.print(safe_content, style=style)
134
+ else:
135
+ safe_content = escape_rich_markup(message.content)
136
+ self.console.print(safe_content)
137
+ else:
138
+ # For complex Rich objects (Tables, Markdown, Text, etc.)
139
+ self.console.print(message.content)
140
+
141
+ # Ensure output is immediately flushed to the terminal
142
+ # This fixes the issue where messages don't appear until user input
143
+ if hasattr(self.console.file, "flush"):
144
+ self.console.file.flush()
145
+
146
+ async def _handle_human_input_request(self, message: UIMessage):
147
+ """Handle a human input request in async mode."""
148
+ # This renderer is not currently used in practice, but if it were:
149
+ # We would need async input handling here
150
+ # For now, just render as a system message
151
+ safe_content = escape_rich_markup(str(message.content))
152
+ self.console.print(f"[bold cyan]INPUT REQUESTED:[/bold cyan] {safe_content}")
153
+ if hasattr(self.console.file, "flush"):
154
+ self.console.file.flush()
155
+
156
+
157
+ class SynchronousInteractiveRenderer:
158
+ """
159
+ Synchronous renderer for interactive mode that doesn't require async.
160
+
161
+ This is useful for cases where we want immediate rendering without
162
+ the overhead of async message processing.
163
+
164
+ Note: As part of the messaging system refactoring, we're keeping this class for now
165
+ as it's essential for the interactive mode to function properly. Future refactoring
166
+ could replace this with a simpler implementation that leverages the unified message
167
+ queue system more effectively, or potentially convert interactive mode to use
168
+ async/await consistently and use InteractiveRenderer instead.
169
+
170
+ Current responsibilities:
171
+ - Consumes messages from the queue in a background thread
172
+ - Renders messages to the console in real-time without requiring async code
173
+ - Registers as a direct listener to the message queue for immediate processing
174
+ """
175
+
176
+ def __init__(self, queue: MessageQueue, console: Console | None = None):
177
+ self.queue = queue
178
+ self.console = console or Console()
179
+ self._running = False
180
+ self._thread = None
181
+
182
+ def start(self):
183
+ """Start the synchronous renderer in a background thread."""
184
+ if self._running:
185
+ return
186
+
187
+ self._running = True
188
+ # Mark the queue as having an active renderer
189
+ self.queue.mark_renderer_active()
190
+ # Add ourselves as a listener for immediate processing
191
+ self.queue.add_listener(self._render_message)
192
+ self._thread = threading.Thread(target=self._consume_messages, daemon=True)
193
+ self._thread.start()
194
+
195
+ def stop(self):
196
+ """Stop the synchronous renderer."""
197
+ self._running = False
198
+ # Mark the queue as having no active renderer
199
+ self.queue.mark_renderer_inactive()
200
+ # Remove ourselves as a listener
201
+ self.queue.remove_listener(self._render_message)
202
+ if self._thread and self._thread.is_alive():
203
+ self._thread.join(timeout=1.0)
204
+
205
+ def _consume_messages(self):
206
+ """Consume messages synchronously."""
207
+ while self._running:
208
+ message = self.queue.get_nowait()
209
+ if message:
210
+ self._render_message(message)
211
+ else:
212
+ # No messages, sleep briefly
213
+ import time
214
+
215
+ time.sleep(0.01)
216
+
217
+ def _render_message(self, message: UIMessage):
218
+ """Render a message using Rich console."""
219
+ # Handle human input requests
220
+ if message.type == MessageType.HUMAN_INPUT_REQUEST:
221
+ self._handle_human_input_request(message)
222
+ return
223
+
224
+ # Convert message type to appropriate Rich styling
225
+ if message.type == MessageType.ERROR:
226
+ style = "bold red"
227
+ elif message.type == MessageType.WARNING:
228
+ style = "yellow"
229
+ elif message.type == MessageType.SUCCESS:
230
+ style = "green"
231
+ elif message.type == MessageType.TOOL_OUTPUT:
232
+ style = "blue"
233
+ elif message.type == MessageType.AGENT_REASONING:
234
+ style = None
235
+ elif message.type == MessageType.AGENT_RESPONSE:
236
+ # Special handling for agent responses - they'll be rendered as markdown
237
+ style = None
238
+ elif message.type == MessageType.SYSTEM:
239
+ style = "dim"
240
+ else:
241
+ style = None
242
+
243
+ # Make version messages dim regardless of message type
244
+ if isinstance(message.content, str) and (
245
+ "Current version:" in message.content
246
+ or "Latest version:" in message.content
247
+ ):
248
+ style = "dim"
249
+
250
+ # Render the content
251
+ if isinstance(message.content, str):
252
+ if message.type == MessageType.AGENT_RESPONSE:
253
+ # Render agent responses as markdown
254
+ try:
255
+ markdown = Markdown(message.content)
256
+ self.console.print(markdown)
257
+ except Exception:
258
+ # Fallback to plain text if markdown parsing fails
259
+ safe_content = escape_rich_markup(message.content)
260
+ self.console.print(safe_content)
261
+ elif style:
262
+ # Escape Rich markup to prevent crashes from malformed tags
263
+ # in shell output or other user-provided content
264
+ safe_content = escape_rich_markup(message.content)
265
+ self.console.print(safe_content, style=style)
266
+ else:
267
+ safe_content = escape_rich_markup(message.content)
268
+ self.console.print(safe_content)
269
+ else:
270
+ # For complex Rich objects (Tables, Markdown, Text, etc.)
271
+ self.console.print(message.content)
272
+
273
+ # Ensure output is immediately flushed to the terminal
274
+ # This fixes the issue where messages don't appear until user input
275
+ if hasattr(self.console.file, "flush"):
276
+ self.console.file.flush()
277
+
278
+ def _handle_human_input_request(self, message: UIMessage):
279
+ """Handle a human input request in interactive mode."""
280
+ prompt_id = message.metadata.get("prompt_id") if message.metadata else None
281
+ if not prompt_id:
282
+ self.console.print(
283
+ "[bold red]Error: Invalid human input request[/bold red]"
284
+ )
285
+ return
286
+
287
+ # Display the prompt - escape to prevent markup injection
288
+ safe_content = escape_rich_markup(str(message.content))
289
+ self.console.print(f"[bold cyan]{safe_content}[/bold cyan]")
290
+ if hasattr(self.console.file, "flush"):
291
+ self.console.file.flush()
292
+
293
+ # Get user input
294
+ try:
295
+ # Use basic input for now - could be enhanced with prompt_toolkit later
296
+ response = input(">>> ")
297
+
298
+ # Provide the response back to the queue
299
+ from .message_queue import provide_prompt_response
300
+
301
+ provide_prompt_response(prompt_id, response)
302
+
303
+ except EOFError, KeyboardInterrupt:
304
+ # Handle Ctrl+C or Ctrl+D
305
+ provide_prompt_response(prompt_id, "")
306
+ except Exception as e:
307
+ self.console.print(f"[bold red]Error getting input: {e}[/bold red]")
308
+ provide_prompt_response(prompt_id, "")