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,375 @@
1
+ """Pattern detection for destructive shell commands.
2
+
3
+ Detects dangerous patterns in shell commands using pure regex — no LLM
4
+ calls, no caching, no yolo-mode checks. Covers:
5
+ - Unix/Linux: rm -rf root/home, git push --mirror, git clean -fd, git reset --hard,
6
+ git checkout/restore ., SQL DROP via clients, docker prune, accidental package publishes
7
+ - Windows PowerShell: Remove-Item, rmdir, del, Format-Volume, Clear-Disk, registry operations
8
+ - Windows CMD: rd, rmdir, del, erase with /s /q flags, format, diskpart
9
+ """
10
+
11
+ import re
12
+ from dataclasses import dataclass
13
+
14
+
15
+ @dataclass
16
+ class DestructiveCommandMatch:
17
+ """Result of a destructive command pattern match."""
18
+
19
+ pattern_name: str
20
+ description: str
21
+
22
+
23
+ # ---------------------------------------------------------------------------
24
+ # Shell-operator regex — same approach as force_push_guard
25
+ # ---------------------------------------------------------------------------
26
+
27
+ # Matches shell operators that precede a new command in a pipeline/chain.
28
+ # E.g. "cd foo && rm -rf /" or "true || git reset --hard"
29
+ # The capture ensures the command keyword follows a real shell boundary.
30
+ _SHELL_OPERATOR_RE = re.compile(r"(?:^|&&|\|\||;|\|)\s*\w+", re.MULTILINE)
31
+
32
+
33
+ def _is_real_command(command: str) -> bool:
34
+ """Check that the destructive keyword is an actual invocation, not a string arg.
35
+
36
+ Handles compound commands like "cd foo && rm -rf /" while
37
+ avoiding false positives like "echo 'rm -rf /'".
38
+
39
+ Args:
40
+ command: The shell command string to inspect.
41
+
42
+ Returns:
43
+ True if the command appears to be a real invocation.
44
+ """
45
+ return bool(_SHELL_OPERATOR_RE.search(command))
46
+
47
+
48
+ # ---------------------------------------------------------------------------
49
+ # Cheap pre-filter substrings — if none appear, bail immediately
50
+ # ---------------------------------------------------------------------------
51
+
52
+ _PREFILTER_SUBSTRINGS = (
53
+ # Unix/Linux
54
+ "rm",
55
+ "git",
56
+ "docker",
57
+ "drop",
58
+ "npm",
59
+ "yarn",
60
+ "twine",
61
+ "psql",
62
+ "mysql",
63
+ "sqlite3",
64
+ # Windows PowerShell (cmdlets and common aliases)
65
+ "remove-item",
66
+ " ri ",
67
+ "ri ",
68
+ " rmdir",
69
+ "del ",
70
+ "erase",
71
+ "format-volume",
72
+ "clear-disk",
73
+ "remove-itemproperty",
74
+ "clear-recyclebin",
75
+ "invoke-expression",
76
+ " irm ",
77
+ "iex",
78
+ "get-childitem",
79
+ # Windows CMD
80
+ "rd ",
81
+ "format",
82
+ "diskpart",
83
+ "bcdedit",
84
+ "reg ",
85
+ "netsh",
86
+ )
87
+
88
+
89
+ # ---------------------------------------------------------------------------
90
+ # Pattern lists — organized by shell type
91
+ # ---------------------------------------------------------------------------
92
+
93
+ # Unix destructive patterns
94
+ _UNIX_DESTRUCTIVE_PATTERNS: list[tuple[re.Pattern, str, str]] = [
95
+ # —— Tier 1 ——————————————————————————————————————————————————————————————
96
+ # 1. rm -rf / / rm -rf /* (recursive delete of root filesystem)
97
+ (
98
+ re.compile(r"\brm\b.*\s-rf?\b.*\s/\s*$"),
99
+ "rm -rf /",
100
+ "recursive delete of root filesystem",
101
+ ),
102
+ (
103
+ re.compile(r"\brm\b.*\s-rf?\b.*\s/\*\s*$"),
104
+ "rm -rf /*",
105
+ "recursive delete of root filesystem (glob)",
106
+ ),
107
+ # 2. rm -rf ~ / rm -rf ~/* (recursive delete of home directory)
108
+ (
109
+ re.compile(r"\brm\b.*\s-rf?\b.*\s~\s*$"),
110
+ "rm -rf ~",
111
+ "recursive delete of home directory",
112
+ ),
113
+ (
114
+ re.compile(r"\brm\b.*\s-rf?\b.*\s~/\*\s*$"),
115
+ "rm -rf ~/*",
116
+ "recursive delete of home directory (glob)",
117
+ ),
118
+ # 3. git push --mirror (deletes remote branches not present locally)
119
+ (
120
+ re.compile(r"\bgit\s+push\b.*--mirror\b"),
121
+ "git push --mirror",
122
+ "deletes remote branches not present locally",
123
+ ),
124
+ # 4. git clean -fd (deletes untracked files and directories)
125
+ (
126
+ re.compile(r"\bgit\s+clean\b.*-f(?:[dxf]|\s+-?[dxf])"),
127
+ "git clean -fd",
128
+ "deletes untracked files and directories",
129
+ ),
130
+ # 5. git reset --hard (destroys all uncommitted changes)
131
+ (
132
+ re.compile(r"\bgit\s+reset\b.*--hard\b"),
133
+ "git reset --hard",
134
+ "destroys all uncommitted changes",
135
+ ),
136
+ # 6. git checkout -- . / git restore . (discards all working dir changes)
137
+ (
138
+ re.compile(r"\bgit\s+(?:checkout|restore)\b.*\s--?\s*\.\s*$"),
139
+ "git checkout/restore .",
140
+ "discards all working directory changes",
141
+ ),
142
+ # —— Tier 2 ——————————————————————————————————————————————————————————————
143
+ # 7. DROP TABLE/DATABASE/SCHEMA via SQL client
144
+ (
145
+ re.compile(
146
+ r"(?:psql|mysql|sqlite3)\b.*(?:-c|-e)\b.*DROP\s+(?:TABLE|DATABASE|SCHEMA)\b",
147
+ re.IGNORECASE,
148
+ ),
149
+ "DROP via SQL client",
150
+ "drops a table/database/schema via SQL client",
151
+ ),
152
+ (
153
+ re.compile(
154
+ r"DROP\s+(?:TABLE|DATABASE|SCHEMA)\b.*\|\s*(?:psql|mysql|sqlite3)\b",
155
+ re.IGNORECASE,
156
+ ),
157
+ "DROP via SQL pipe",
158
+ "drops a table/database/schema piped to SQL client",
159
+ ),
160
+ # 8. docker system prune -af / docker volume prune -f
161
+ (
162
+ re.compile(
163
+ r"\bdocker\s+(?:system|volume)\s+prune\b.*(?:-[af]|\s-[af]|\s--all)"
164
+ ),
165
+ "docker prune",
166
+ "nukes Docker resources without confirmation",
167
+ ),
168
+ # 9. npm publish / yarn publish / twine upload
169
+ (
170
+ re.compile(r"\b(?:npm|yarn)\s+publish\b"),
171
+ "npm/yarn publish",
172
+ "accidental package publishing",
173
+ ),
174
+ (
175
+ re.compile(r"\btwine\s+upload\b"),
176
+ "twine upload",
177
+ "accidental package publishing",
178
+ ),
179
+ ]
180
+
181
+ # Windows PowerShell destructive patterns
182
+ _POWERSHELL_DESTRUCTIVE_PATTERNS: list[tuple[re.Pattern, str, str]] = [
183
+ # —— Tier 1 PowerShell ————————————————————————————————————————————————————
184
+ # 1. Remove-Item/ri with -Recurse/-r or -Force/-f flags
185
+ (
186
+ re.compile(
187
+ r"(?:^|[;|&])\s*(?:Remove-Item|ri)\b.*\s-(?:r|recurse|f|force)\b",
188
+ re.IGNORECASE,
189
+ ),
190
+ "Remove-Item with recursive/force flags",
191
+ "deletion with recursive or force flag",
192
+ ),
193
+ # 2. Remove-Item -Recurse -Force on system directories
194
+ (
195
+ re.compile(
196
+ r"\b(?:Remove-Item|ri)\b.*\s-(?:r|recurse)\b.*(?:C:|Windows|System32|Users|Program Files|ProgramData)",
197
+ re.IGNORECASE,
198
+ ),
199
+ "Remove-Item on system location",
200
+ "deletion operation on system directory or drive",
201
+ ),
202
+ # 3. Get-ChildItem piped to Remove-Item (pipeline delete)
203
+ (
204
+ re.compile(
205
+ r"\|\s*\b(?:Remove-Item|ri|del|erase)\b",
206
+ re.IGNORECASE,
207
+ ),
208
+ "Piped deletion command",
209
+ "deletion via pipeline (potentially recursive)",
210
+ ),
211
+ # 4. Format-Volume (disk formatting)
212
+ (
213
+ re.compile(
214
+ r"\b(?:Format-Volume|fdisk)\b",
215
+ re.IGNORECASE,
216
+ ),
217
+ "Format-Volume",
218
+ "formats a disk volume",
219
+ ),
220
+ # 5. Clear-Disk (wipes disk)
221
+ (
222
+ re.compile(
223
+ r"\bClear-Disk\b",
224
+ re.IGNORECASE,
225
+ ),
226
+ "Clear-Disk",
227
+ "removes all data and OEM recovery partitions",
228
+ ),
229
+ # 6. Remove-ItemProperty on critical registry paths
230
+ (
231
+ re.compile(
232
+ r"\b(?:Remove-ItemProperty|rp)\b.*\sHK(?:LM|CU|CR|U|CC):",
233
+ re.IGNORECASE,
234
+ ),
235
+ "Remove-ItemProperty registry",
236
+ "removes critical registry values",
237
+ ),
238
+ # 7. Clear-RecycleBin with -Force
239
+ (
240
+ re.compile(
241
+ r"\b(?:Clear-RecycleBin|recycle)\b.*\s-(?:f|force)\b",
242
+ re.IGNORECASE,
243
+ ),
244
+ "Clear-RecycleBin -Force",
245
+ "permanently deletes all recycle bin contents",
246
+ ),
247
+ # 8. Invoke-WebRequest / Invoke-RestMethod piped to IEX (remote code execution)
248
+ (
249
+ re.compile(
250
+ r"\b(?:irm|Invoke-WebRequest|iwr|Invoke-RestMethod|curl|wget)\b.*\|\s*(?:iex|Invoke-Expression)\b",
251
+ re.IGNORECASE,
252
+ ),
253
+ "Download + Execute (IWR| IEX)",
254
+ "downloads and executes remote code",
255
+ ),
256
+ ]
257
+
258
+ # Windows CMD destructive patterns
259
+ _CMD_DESTRUCTIVE_PATTERNS: list[tuple[re.Pattern, str, str]] = [
260
+ # —— Tier 1 CMD ———————————————————————————————————————————————————————————
261
+ # 1. rd /s /q - recursive silent delete
262
+ (
263
+ re.compile(
264
+ r"\b(?:rmdir|rd)\b.*\s/s\b.*\s/q\b",
265
+ re.IGNORECASE,
266
+ ),
267
+ "rd /s /q",
268
+ "recursive silent directory delete",
269
+ ),
270
+ (
271
+ re.compile(
272
+ r"\b(?:rmdir|rd)\b.*\s/q\b.*\s/s\b",
273
+ re.IGNORECASE,
274
+ ),
275
+ "rd /s /q",
276
+ "recursive silent directory delete",
277
+ ),
278
+ # 2. del /s /q /f on system directories
279
+ (
280
+ re.compile(
281
+ r"\b(?:del|erase)\b.*\s/s\b.*(?:Windows|System32|Program)",
282
+ re.IGNORECASE,
283
+ ),
284
+ "del /s system files",
285
+ "recursive delete of system files",
286
+ ),
287
+ (
288
+ re.compile(
289
+ r"\b(?:del|erase)\b.*\s/f\b.*\s/s\b.*(?:Windows|System32|Program)",
290
+ re.IGNORECASE,
291
+ ),
292
+ "del /f /s system files",
293
+ "force recursive delete of system files",
294
+ ),
295
+ # 3. format command without confirmation
296
+ (
297
+ re.compile(
298
+ r"(?:^|&&|\|\||;|\|)\s*format\b.*\s(?:C:|D:|E:)",
299
+ re.IGNORECASE,
300
+ ),
301
+ "format",
302
+ "formats drive",
303
+ ),
304
+ (
305
+ re.compile(
306
+ r"(?:^|&&|\|\||;|\|)\s*format\b.*\s/q\b.*\s(?:C:|D:|E:)",
307
+ re.IGNORECASE,
308
+ ),
309
+ "format /q",
310
+ "quick formats drive",
311
+ ),
312
+ # 4. diskpart invocation (almost never legitimate in automation)
313
+ (
314
+ re.compile(
315
+ r"\bdiskpart\b",
316
+ re.IGNORECASE,
317
+ ),
318
+ "diskpart",
319
+ "diskpart disk management tool",
320
+ ),
321
+ # 5. bcdedit (boot configuration) modifications
322
+ (
323
+ re.compile(
324
+ r"\bbcdedit\b.*\s/(?:delete|set|export|import|bootsequence)\b.*\s(?:{.*}|.*bootmgr|.*resume)",
325
+ re.IGNORECASE,
326
+ ),
327
+ "bcdedit destructive",
328
+ "modifies critical boot configuration",
329
+ ),
330
+ # 6. reg delete on critical keys
331
+ (
332
+ re.compile(
333
+ r"\breg\s+delete\b.*\sHK(?:LM|CR|CU)",
334
+ re.IGNORECASE,
335
+ ),
336
+ "reg delete",
337
+ "deletes critical registry keys",
338
+ ),
339
+ ]
340
+
341
+ # Combine all patterns
342
+ _DESTRUCTIVE_PATTERNS = (
343
+ _UNIX_DESTRUCTIVE_PATTERNS
344
+ + _POWERSHELL_DESTRUCTIVE_PATTERNS
345
+ + _CMD_DESTRUCTIVE_PATTERNS
346
+ )
347
+
348
+
349
+ def detect_destructive_command(command: str) -> DestructiveCommandMatch | None:
350
+ """Check if a shell command contains a destructive operation.
351
+
352
+ Uses a cheap substring pre-filter before any regex work, then verifies
353
+ the command is a real invocation (not a string argument), then checks
354
+ patterns first-match-wins.
355
+
356
+ Args:
357
+ command: The shell command string to inspect.
358
+
359
+ Returns:
360
+ DestructiveCommandMatch if a destructive pattern is found, None otherwise.
361
+ """
362
+ # Quick pre-filter: bail if none of the trigger substrings appear
363
+ command_lower = command.lower()
364
+ if not any(sub in command_lower for sub in _PREFILTER_SUBSTRINGS):
365
+ return None
366
+
367
+ # Ensure the command is a real invocation, not a string argument
368
+ if not _is_real_command(command):
369
+ return None
370
+
371
+ for pattern, name, description in _DESTRUCTIVE_PATTERNS:
372
+ if pattern.search(command):
373
+ return DestructiveCommandMatch(pattern_name=name, description=description)
374
+
375
+ return None
@@ -0,0 +1,148 @@
1
+ """Callback registration for the destructive command guard plugin.
2
+
3
+ Hooks into the run_shell_command phase to intercept destructive shell
4
+ commands (rm -rf /, git reset --hard, docker system prune -af, etc.) and
5
+ prompt the user for approval before allowing them through.
6
+
7
+ Returns {"blocked": True} to deny, None to allow.
8
+ """
9
+
10
+ import sys
11
+ from typing import Any
12
+
13
+ from rich.text import Text
14
+
15
+ from code_muse.callbacks import register_callback
16
+ from code_muse.messaging import emit_info, emit_warning
17
+ from code_muse.plugins.destructive_command_guard.detector import (
18
+ detect_destructive_command,
19
+ )
20
+
21
+
22
+ def _is_interactive() -> bool:
23
+ """Check if we're in an interactive terminal that can show prompts."""
24
+ try:
25
+ return sys.stdin.isatty()
26
+ except AttributeError, OSError:
27
+ return False
28
+
29
+
30
+ async def destructive_command_guard_callback(
31
+ context: Any, command: str, cwd: str | None = None, timeout: int = 60
32
+ ) -> dict[str, Any | None]:
33
+ """Intercept shell commands containing destructive operations.
34
+
35
+ When a destructive command is detected:
36
+ - Interactive TTY: prompt the user with approve/reject options.
37
+ - Non-interactive (CI, sub-agent, piped): hard-block with an error.
38
+
39
+ This runs on *every* shell command, but the heavy lifting (regex
40
+ matching) is gated behind a cheap substring pre-filter inside
41
+ detect_destructive_command().
42
+
43
+ Args:
44
+ context: Execution context (unused).
45
+ command: The shell command about to run.
46
+ cwd: Working directory (unused).
47
+ timeout: Command timeout (unused).
48
+
49
+ Returns:
50
+ None if the command is safe to proceed or user approved it.
51
+ Dict with blocked=True if a destructive command was detected and rejected.
52
+ """
53
+ match = detect_destructive_command(command)
54
+ if match is None:
55
+ return None
56
+
57
+ # --- Interactive TTY: ask the user ---
58
+ if _is_interactive():
59
+ return await _prompt_user_approval(command, match)
60
+
61
+ # --- Non-interactive: hard-block ---
62
+ return _block_command(command, match)
63
+
64
+
65
+ async def _prompt_user_approval(command: str, match: Any) -> dict[str, Any | None]:
66
+ """Show an interactive approval prompt for the detected destructive command.
67
+
68
+ Args:
69
+ command: The original shell command.
70
+ match: The DestructiveCommandMatch from the detector.
71
+
72
+ Returns:
73
+ None if user approves, Dict with blocked=True if rejected.
74
+ """
75
+ from code_muse.tools.common import get_user_approval_async
76
+
77
+ panel_content = Text()
78
+ panel_content.append("⚠️ Destructive command detected: ", style="bold yellow")
79
+ panel_content.append(match.pattern_name, style="bold red")
80
+ panel_content.append("\n", style="")
81
+ panel_content.append(f" {match.description}", style="dim")
82
+ panel_content.append("\n\n", style="")
83
+ panel_content.append("$ ", style="bold green")
84
+ panel_content.append(command, style="bold white")
85
+ panel_content.append(
86
+ "\n\nThis command could cause irreversible data loss.",
87
+ style="yellow",
88
+ )
89
+
90
+ confirmed, user_feedback = await get_user_approval_async(
91
+ title="Destructive Command Guard 🛡️",
92
+ content=panel_content,
93
+ border_style="red",
94
+ )
95
+
96
+ if confirmed:
97
+ emit_info("⚠️ Destructive command approved — proceeding with caution.")
98
+ return None # Allow the command through
99
+
100
+ # Rejected
101
+ reason = user_feedback or "User rejected destructive command"
102
+ return {
103
+ "blocked": True,
104
+ "reasoning": f"Destructive command rejected: {match.pattern_name} — {reason}",
105
+ "error_message": (
106
+ f"🛑 Destructive command rejected. Detected {match.pattern_name} "
107
+ f"in command:\n {command}\n"
108
+ f" {match.description}\n"
109
+ f"Feedback: {reason}"
110
+ ),
111
+ }
112
+
113
+
114
+ def _block_command(command: str, match: Any) -> dict[str, Any]:
115
+ """Hard-block a destructive command in non-interactive contexts.
116
+
117
+ Args:
118
+ command: The original shell command.
119
+ match: The DestructiveCommandMatch from the detector.
120
+
121
+ Returns:
122
+ Dict with blocked=True and a descriptive error.
123
+ """
124
+ error_message = (
125
+ f"🛑 Destructive command blocked! Detected {match.pattern_name} "
126
+ f"in command:\n {command}\n"
127
+ f" {match.description}\n\n"
128
+ f"This operation could cause irreversible data loss.\n"
129
+ f"If you *really* need to run this, use the exact command directly\n"
130
+ f"in your terminal (outside Muse) after double-checking the target."
131
+ )
132
+
133
+ emit_warning(error_message)
134
+
135
+ return {
136
+ "blocked": True,
137
+ "reasoning": f"Destructive command detected: {match.pattern_name} — {match.description}",
138
+ "error_message": error_message,
139
+ }
140
+
141
+
142
+ def register() -> None:
143
+ """Register the destructive command guard callback."""
144
+ register_callback("run_shell_command", destructive_command_guard_callback)
145
+
146
+
147
+ # Auto-register when this module is imported
148
+ register()