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,262 @@
1
+ # Import to trigger command registration
2
+ import contextlib
3
+
4
+ import code_muse.command_line.config_commands # noqa: F401
5
+ import code_muse.command_line.core_commands # noqa: F401
6
+ import code_muse.command_line.session_commands # noqa: F401
7
+ import code_muse.command_line.uc_menu # noqa: F401
8
+
9
+ # Global flag to track if plugins have been loaded
10
+ _PLUGINS_LOADED = False
11
+
12
+
13
+ def get_commands_help():
14
+ """Generate aligned commands help using Rich Text for safe markup.
15
+
16
+ Now dynamically generates help from the command registry!
17
+ Only shows two sections: Built-in Commands and Custom Commands.
18
+ """
19
+ from rich.text import Text
20
+
21
+ from code_muse.command_line.command_registry import get_unique_commands
22
+
23
+ # Ensure plugins are loaded so custom help can register
24
+ _ensure_plugins_loaded()
25
+
26
+ lines: list[Text] = []
27
+ # No global header needed - user already knows they're viewing help
28
+
29
+ # Collect all built-in commands (registered + legacy)
30
+ builtin_cmds: list[tuple[str, str]] = []
31
+
32
+ # Get registered commands (all categories are built-in)
33
+ registered_commands = get_unique_commands()
34
+ for cmd_info in sorted(registered_commands, key=lambda c: c.name):
35
+ builtin_cmds.append((cmd_info.usage, cmd_info.description))
36
+
37
+ # Get custom commands from plugins
38
+ custom_entries: list[tuple[str, str]] = []
39
+ try:
40
+ from code_muse import callbacks
41
+
42
+ custom_help_results = callbacks.on_custom_command_help()
43
+ for res in custom_help_results:
44
+ if not res:
45
+ continue
46
+ # Format 1: Tuple with (command_name, description)
47
+ if isinstance(res, tuple) and len(res) == 2:
48
+ cmd_name = str(res[0])
49
+ custom_entries.append((f"/{cmd_name}", str(res[1])))
50
+ # Format 2: List of tuples or strings
51
+ elif isinstance(res, list):
52
+ # Check if it's a list of tuples (preferred format)
53
+ if res and isinstance(res[0], tuple) and len(res[0]) == 2:
54
+ for item in res:
55
+ if isinstance(item, tuple) and len(item) == 2:
56
+ cmd_name = str(item[0])
57
+ custom_entries.append((f"/{cmd_name}", str(item[1])))
58
+ # Format 3: List of strings (legacy format)
59
+ # Extract command from first line like "/command_name - Description"
60
+ elif res and isinstance(res[0], str) and res[0].startswith("/"):
61
+ first_line = res[0]
62
+ if " - " in first_line:
63
+ parts = first_line.split(" - ", 1)
64
+ cmd_name = parts[0].lstrip("/").strip()
65
+ description = parts[1].strip()
66
+ custom_entries.append((f"/{cmd_name}", description))
67
+ except Exception:
68
+ pass
69
+
70
+ # Calculate global column width (longest command across ALL sections + padding)
71
+ all_commands = builtin_cmds + custom_entries
72
+ if all_commands:
73
+ max_cmd_width = max(len(cmd) for cmd, _ in all_commands)
74
+ column_width = max_cmd_width + 4 # Add 4 spaces padding
75
+ else:
76
+ column_width = 30
77
+
78
+ # Maximum description width before truncation (to prevent line wrapping)
79
+ max_desc_width = 80
80
+
81
+ def truncate_desc(desc: str, max_width: int) -> str:
82
+ """Truncate description if too long, add ellipsis."""
83
+ if len(desc) <= max_width:
84
+ return desc
85
+ return desc[: max_width - 3] + "..."
86
+
87
+ # Display Built-in Commands section (starts immediately, no blank line)
88
+ lines.append(Text("Built-in Commands", style="bold magenta"))
89
+ for cmd, desc in sorted(builtin_cmds, key=lambda x: x[0]):
90
+ truncated_desc = truncate_desc(desc, max_desc_width)
91
+ left = Text(cmd.ljust(column_width), style="cyan")
92
+ right = Text(truncated_desc)
93
+ line = Text()
94
+ line.append_text(left)
95
+ line.append_text(right)
96
+ lines.append(line)
97
+
98
+ # Display Custom Commands section (if any)
99
+ if custom_entries:
100
+ lines.append(Text(""))
101
+ lines.append(Text("Custom Commands", style="bold magenta"))
102
+ for cmd, desc in sorted(custom_entries, key=lambda x: x[0]):
103
+ truncated_desc = truncate_desc(desc, max_desc_width)
104
+ left = Text(cmd.ljust(column_width), style="cyan")
105
+ right = Text(truncated_desc)
106
+ line = Text()
107
+ line.append_text(left)
108
+ line.append_text(right)
109
+ lines.append(line)
110
+
111
+ # Display Shell Pass-through section
112
+ lines.append(Text(""))
113
+ lines.append(Text("Shell Pass-through", style="bold magenta"))
114
+ shell_left = Text("!<command>".ljust(column_width), style="cyan")
115
+ shell_right = Text("Run a shell command directly (e.g., !git status)")
116
+ shell_line = Text()
117
+ shell_line.append_text(shell_left)
118
+ shell_line.append_text(shell_right)
119
+ lines.append(shell_line)
120
+
121
+ final_text = Text()
122
+ for i, line in enumerate(lines):
123
+ if i > 0:
124
+ final_text.append("\n")
125
+ final_text.append_text(line)
126
+
127
+ # Add trailing newline for spacing before next prompt
128
+ final_text.append("\n")
129
+
130
+ return final_text
131
+
132
+
133
+ # ============================================================================
134
+ # IMPORT BUILT-IN COMMAND HANDLERS
135
+ # ============================================================================
136
+ # All built-in command handlers have been split into category-specific files.
137
+ # These imports trigger their registration via @register_command decorators.
138
+
139
+ # ============================================================================
140
+ # UTILITY FUNCTIONS
141
+ # ============================================================================
142
+
143
+
144
+ def _ensure_plugins_loaded() -> None:
145
+ global _PLUGINS_LOADED
146
+ if _PLUGINS_LOADED:
147
+ return
148
+ try:
149
+ from code_muse import plugins
150
+
151
+ plugins.load_plugin_callbacks()
152
+ _PLUGINS_LOADED = True
153
+ except Exception as e:
154
+ # If plugins fail to load, continue gracefully but note it
155
+ try:
156
+ from code_muse.messaging import emit_warning
157
+
158
+ emit_warning(f"Plugin load error: {e}")
159
+ except Exception:
160
+ pass
161
+ _PLUGINS_LOADED = True
162
+
163
+
164
+ # All command handlers moved to builtin_commands.py
165
+ # The import above triggers their registration
166
+
167
+ # ============================================================================
168
+ # MAIN COMMAND DISPATCHER
169
+ # ============================================================================
170
+
171
+ # _show_color_options has been moved to builtin_commands.py
172
+
173
+
174
+ def handle_command(command: str):
175
+ """
176
+ Handle commands prefixed with '/'.
177
+
178
+ Args:
179
+ command: The command string to handle
180
+
181
+ Returns:
182
+ True if the command was handled, False if not, or a string to be processed as user input
183
+ """
184
+ from rich.text import Text
185
+
186
+ from code_muse.command_line.command_registry import get_command
187
+ from code_muse.messaging import emit_info, emit_warning
188
+
189
+ _ensure_plugins_loaded()
190
+
191
+ command = command.strip()
192
+
193
+ # Check if this is a registered command
194
+ if command.startswith("/"):
195
+ # Extract command name (first word after /)
196
+ cmd_name = command[1:].split()[0] if len(command) > 1 else ""
197
+
198
+ # Try to find in registry
199
+ cmd_info = get_command(cmd_name)
200
+ if cmd_info:
201
+ # Execute the registered handler
202
+ return cmd_info.handler(command)
203
+
204
+ # Try plugin-provided custom commands before unknown warning
205
+ if command.startswith("/"):
206
+ # Extract command name without leading slash and arguments intact
207
+ name = command[1:].split()[0] if len(command) > 1 else ""
208
+ try:
209
+ from code_muse import callbacks
210
+
211
+ # Import the special result classes for custom commands
212
+ from code_muse.command_line.types import MarkdownCommandResult
213
+
214
+ try:
215
+ from code_muse.plugins.custom_commands.register_callbacks import (
216
+ CustomCommandResult,
217
+ )
218
+ except ImportError:
219
+ CustomCommandResult = None
220
+
221
+ results = callbacks.on_custom_command(command=command, name=name)
222
+ # Iterate through callback results; treat str as handled (no model run)
223
+ for res in results:
224
+ if res is True:
225
+ return True
226
+ if isinstance(res, MarkdownCommandResult):
227
+ # Special case: markdown command that should be processed as input
228
+ # Replace the command with the markdown content and let it be processed
229
+ # This is handled by the caller, so return the content as string
230
+ return res.content
231
+ if CustomCommandResult and isinstance(res, CustomCommandResult):
232
+ # TOML custom command — send resolved prompt to the agent
233
+ return res.content
234
+ if isinstance(res, str):
235
+ # Display returned text to the user and treat as handled
236
+ with contextlib.suppress(Exception):
237
+ emit_info(res)
238
+ return True
239
+ except Exception as e:
240
+ # Log via emit_error but do not block default handling
241
+ emit_warning(f"Custom command '{name}' failed: {e}")
242
+ return True # Command was recognized but failed — don't say "Unknown"
243
+
244
+ if name:
245
+ emit_warning(
246
+ Text.from_markup(
247
+ f"Unknown command: {command}\n[dim]Type /help for options.[/dim]"
248
+ )
249
+ )
250
+ else:
251
+ # Show current model ONLY here
252
+ from code_muse.command_line.model_picker_completion import get_active_model
253
+
254
+ current_model = get_active_model()
255
+ emit_info(
256
+ Text.from_markup(
257
+ f"[bold green]Current Model:[/bold green] [cyan]{current_model}[/cyan]"
258
+ )
259
+ )
260
+ return True
261
+
262
+ return False
@@ -0,0 +1,150 @@
1
+ """Command registry for dynamic command discovery.
2
+
3
+ This module provides a decorator-based registration system for commands,
4
+ enabling automatic help generation and eliminating static command lists.
5
+ """
6
+
7
+ from collections.abc import Callable
8
+ from dataclasses import dataclass, field
9
+
10
+
11
+ @dataclass
12
+ class CommandInfo:
13
+ """Metadata for a registered command."""
14
+
15
+ name: str
16
+ description: str
17
+ handler: Callable[[str], bool]
18
+ usage: str = ""
19
+ aliases: list[str] = field(default_factory=list)
20
+ category: str = "core"
21
+ detailed_help: str | None = None
22
+
23
+ def __post_init__(self):
24
+ """Set default usage if not provided."""
25
+ if not self.usage:
26
+ self.usage = f"/{self.name}"
27
+
28
+
29
+ # Global registry: maps command name/alias -> CommandInfo
30
+ _COMMAND_REGISTRY: dict[str, CommandInfo] = {}
31
+
32
+
33
+ def register_command(
34
+ name: str,
35
+ description: str,
36
+ usage: str = "",
37
+ aliases: list[str | None] = None,
38
+ category: str = "core",
39
+ detailed_help: str | None = None,
40
+ ):
41
+ """Decorator to register a command handler.
42
+
43
+ This decorator registers a command function so it can be:
44
+ - Auto-discovered by the help system
45
+ - Invoked by handle_command() dynamically
46
+ - Grouped by category
47
+ - Documented with aliases and detailed help
48
+
49
+ Args:
50
+ name: Primary command name (without leading /)
51
+ description: Short one-line description for help text
52
+ usage: Full usage string (e.g., "/cd <dir>"). Defaults to "/{name}"
53
+ aliases: List of alternative names (without leading /)
54
+ category: Grouping category ("core", "session", "config", etc.)
55
+ detailed_help: Optional detailed help text for /help <command>
56
+
57
+ Example:
58
+ >>> @register_command(
59
+ ... name="session",
60
+ ... description="Show or rotate autosave session ID",
61
+ ... usage="/session [id|new]",
62
+ ... aliases=["s"],
63
+ ... category="session",
64
+ ... )
65
+ ... def handle_session(command: str) -> bool:
66
+ ... return True
67
+
68
+ Returns:
69
+ The decorated function, unchanged
70
+ """
71
+
72
+ def decorator(func: Callable[[str], bool]) -> Callable[[str], bool]:
73
+ # Create CommandInfo instance
74
+ cmd_info = CommandInfo(
75
+ name=name,
76
+ description=description,
77
+ handler=func,
78
+ usage=usage,
79
+ aliases=aliases or [],
80
+ category=category,
81
+ detailed_help=detailed_help,
82
+ )
83
+
84
+ # Register primary name
85
+ _COMMAND_REGISTRY[name] = cmd_info
86
+
87
+ # Register all aliases pointing to the same CommandInfo
88
+ for alias in aliases or []:
89
+ _COMMAND_REGISTRY[alias] = cmd_info
90
+
91
+ return func
92
+
93
+ return decorator
94
+
95
+
96
+ def get_all_commands() -> dict[str, CommandInfo]:
97
+ """Get all registered commands.
98
+
99
+ Returns:
100
+ Dictionary mapping command names/aliases to CommandInfo objects.
101
+ Note: Aliases point to the same CommandInfo as their primary command.
102
+ """
103
+ return _COMMAND_REGISTRY.copy()
104
+
105
+
106
+ def get_unique_commands() -> list[CommandInfo]:
107
+ """Get unique registered commands (no duplicates from aliases).
108
+
109
+ Returns:
110
+ List of unique CommandInfo objects (one per primary command).
111
+ """
112
+ seen = set()
113
+ unique = []
114
+ for cmd_info in _COMMAND_REGISTRY.values():
115
+ # Use object id to avoid duplicates from aliases
116
+ if id(cmd_info) not in seen:
117
+ seen.add(id(cmd_info))
118
+ unique.append(cmd_info)
119
+ return unique
120
+
121
+
122
+ def get_command(name: str) -> CommandInfo | None:
123
+ """Get command info by name or alias (case-insensitive).
124
+
125
+ First tries exact match for backward compatibility, then falls back to
126
+ case-insensitive matching.
127
+
128
+ Args:
129
+ name: Command name or alias (without leading /)
130
+
131
+ Returns:
132
+ CommandInfo if found, None otherwise
133
+ """
134
+ # First try exact match (for backward compatibility)
135
+ exact_match = _COMMAND_REGISTRY.get(name)
136
+ if exact_match is not None:
137
+ return exact_match
138
+
139
+ # If no exact match, try case-insensitive matching
140
+ name_lower = name.lower()
141
+ for registered_name, cmd_info in _COMMAND_REGISTRY.items():
142
+ if registered_name.lower() == name_lower:
143
+ return cmd_info
144
+
145
+ return None
146
+
147
+
148
+ def clear_registry():
149
+ """Clear all registered commands. Useful for testing."""
150
+ _COMMAND_REGISTRY.clear()