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,530 @@
1
+ """Interactive TUI for configuring banner colors.
2
+
3
+ Similar to diff_menu.py but for customizing the banner background colors
4
+ for different tool outputs (THINKING, SHELL COMMAND, READ FILE, etc.).
5
+
6
+ Use /colors to launch the TUI and customize your banners!
7
+ """
8
+
9
+ import asyncio
10
+ import io
11
+ import sys
12
+ from collections.abc import Callable
13
+
14
+ from prompt_toolkit import Application
15
+ from prompt_toolkit.formatted_text import ANSI, FormattedText
16
+ from prompt_toolkit.key_binding import KeyBindings
17
+ from prompt_toolkit.layout import Layout, VSplit, Window
18
+ from prompt_toolkit.layout.controls import FormattedTextControl
19
+ from prompt_toolkit.widgets import Frame
20
+ from rich.console import Console
21
+
22
+ # Banner display names with icons
23
+ BANNER_DISPLAY_INFO = {
24
+ "thinking": ("THINKING", "⚡"),
25
+ "agent_response": ("AGENT RESPONSE", ""),
26
+ "shell_command": ("SHELL COMMAND", "🚀"),
27
+ "read_file": ("READ FILE", "📂"),
28
+ "edit_file": ("EDIT FILE", "✏️"),
29
+ "create_file": ("CREATE FILE", "📝"),
30
+ "replace_in_file": ("REPLACE IN FILE", "✏️"),
31
+ "delete_snippet": ("DELETE SNIPPET", "✂️"),
32
+ "grep": ("GREP", "📂"),
33
+ "directory_listing": ("DIRECTORY LISTING", "📂"),
34
+ "agent_reasoning": ("AGENT REASONING", ""),
35
+ "invoke_agent": ("🤖 INVOKE AGENT", ""),
36
+ "subagent_response": ("✓ AGENT RESPONSE", ""),
37
+ "list_agents": ("LIST AGENTS", ""),
38
+ "universal_constructor": ("UNIVERSAL CONSTRUCTOR", "🔧"),
39
+ "terminal_tool": ("TERMINAL TOOL", "🖥️"),
40
+ }
41
+
42
+ # Sample content to show after each banner
43
+ BANNER_SAMPLE_CONTENT = {
44
+ "thinking": "Let me analyze this code structure and figure out the best approach...",
45
+ "agent_response": "I've implemented the feature you requested. The changes include...",
46
+ "shell_command": "$ npm run test -- --silent\n⏱ Timeout: 60s",
47
+ "read_file": "/path/to/file.py (lines 1-50)",
48
+ "edit_file": "MODIFY /path/to/file.py\n--- a/file.py\n+++ b/file.py",
49
+ "create_file": "CREATE /path/to/new_file.py\nFile created successfully.",
50
+ "replace_in_file": "MODIFY /path/to/file.py\n--- a/file.py\n+++ b/file.py",
51
+ "delete_snippet": "MODIFY /path/to/file.py\nSnippet deleted from file.",
52
+ "grep": "/src for 'handleClick'\n📄 Button.tsx (3 matches)",
53
+ "directory_listing": "/src (recursive=True)\n📁 components/\n └── Button.tsx",
54
+ "agent_reasoning": "Current reasoning:\nI need to refactor this function...",
55
+ "invoke_agent": "code-reviewer (New session)\nSession: review-auth-abc123",
56
+ "subagent_response": "code-reviewer\nThe code looks good overall...",
57
+ "list_agents": "- muse: Muse\n- planning-agent: Planning Agent",
58
+ "universal_constructor": "action=create tool_name=api.weather\n✅ Created successfully",
59
+ "terminal_tool": "$ chromium --headless\nBrowser terminal session started",
60
+ }
61
+
62
+ # Available background colors grouped by theme
63
+ BANNER_COLORS = {
64
+ # Cool colors
65
+ "blue": "blue",
66
+ "dark blue": "dark_blue",
67
+ "navy blue": "navy_blue",
68
+ "deep sky blue": "deep_sky_blue4",
69
+ "steel blue": "steel_blue",
70
+ "dodger blue": "dodger_blue3",
71
+ # Cyans & Teals
72
+ "dark cyan": "dark_cyan",
73
+ "cyan": "cyan4",
74
+ "teal": "dark_turquoise",
75
+ "aquamarine": "aquamarine1",
76
+ # Greens
77
+ "green": "green4",
78
+ "dark green": "dark_green",
79
+ "sea green": "dark_sea_green4",
80
+ "spring green": "spring_green4",
81
+ "chartreuse": "chartreuse4",
82
+ # Purples & Magentas
83
+ "purple": "purple",
84
+ "dark magenta": "dark_magenta",
85
+ "medium purple": "medium_purple4",
86
+ "dark violet": "dark_violet",
87
+ "plum": "plum4",
88
+ "orchid": "dark_orchid",
89
+ # Reds & Oranges
90
+ "red": "red3",
91
+ "dark red": "dark_red",
92
+ "indian red": "indian_red",
93
+ "orange red": "orange_red1",
94
+ "orange": "dark_orange3",
95
+ # Yellows & Golds
96
+ "gold": "gold3",
97
+ "dark goldenrod": "dark_goldenrod",
98
+ "olive": "dark_olive_green3",
99
+ # Grays
100
+ "grey30": "grey30",
101
+ "grey37": "grey37",
102
+ "grey42": "grey42",
103
+ "grey50": "grey50",
104
+ "grey58": "grey58",
105
+ "dark slate gray": "dark_slate_gray3",
106
+ # Pink tones
107
+ "hot pink": "hot_pink3",
108
+ "deep pink": "deep_pink4",
109
+ "pale violet red": "pale_violet_red1",
110
+ }
111
+
112
+
113
+ class ColorConfiguration:
114
+ """Holds the current banner color configuration state."""
115
+
116
+ def __init__(self):
117
+ """Initialize configuration from current settings."""
118
+ from code_muse.config import get_all_banner_colors
119
+
120
+ self.current_colors = get_all_banner_colors()
121
+ self.original_colors = self.current_colors.copy()
122
+ self.selected_banner_index = 0
123
+ self.banner_keys = list(BANNER_DISPLAY_INFO.keys())
124
+
125
+ def has_changes(self) -> bool:
126
+ """Check if any changes have been made."""
127
+ return self.current_colors != self.original_colors
128
+
129
+ def get_current_banner_key(self) -> str:
130
+ """Get the currently selected banner key."""
131
+ return self.banner_keys[self.selected_banner_index]
132
+
133
+ def get_current_banner_color(self) -> str:
134
+ """Get the color of the currently selected banner."""
135
+ return self.current_colors[self.get_current_banner_key()]
136
+
137
+ def set_current_banner_color(self, color: str):
138
+ """Set the color of the currently selected banner."""
139
+ self.current_colors[self.get_current_banner_key()] = color
140
+
141
+ def next_banner(self):
142
+ """Cycle to the next banner."""
143
+ self.selected_banner_index = (self.selected_banner_index + 1) % len(
144
+ self.banner_keys
145
+ )
146
+
147
+ def prev_banner(self):
148
+ """Cycle to the previous banner."""
149
+ self.selected_banner_index = (self.selected_banner_index - 1) % len(
150
+ self.banner_keys
151
+ )
152
+
153
+
154
+ async def interactive_colors_picker() -> dict | None:
155
+ """Show an interactive full-screen terminal UI to configure banner colors.
156
+
157
+ Returns:
158
+ A dict with changes or None if cancelled
159
+ """
160
+ from code_muse.tools.command_runner import set_awaiting_user_input
161
+
162
+ config = ColorConfiguration()
163
+
164
+ set_awaiting_user_input(True)
165
+
166
+ # Enter alternate screen buffer once for entire session
167
+ sys.stdout.write("\033[?1049h") # Enter alternate buffer
168
+ sys.stdout.write("\033[2J\033[H") # Clear and home
169
+ sys.stdout.flush()
170
+ await asyncio.sleep(0.1) # Minimal delay for state sync
171
+
172
+ try:
173
+ # Main menu loop
174
+ while True:
175
+ choices = []
176
+ for key in config.banner_keys:
177
+ display_name, icon = BANNER_DISPLAY_INFO[key]
178
+ current_color = config.current_colors[key]
179
+ choices.append(f"{display_name} [{current_color}]")
180
+
181
+ # Add action items
182
+ if config.has_changes():
183
+ choices.append("─── Actions ───")
184
+ choices.append("💾 Save & Exit")
185
+ choices.append("🔄 Reset All to Defaults")
186
+ choices.append("❌ Discard & Exit")
187
+ else:
188
+ choices.append("─── Actions ───")
189
+ choices.append("🔄 Reset All to Defaults")
190
+ choices.append("❌ Exit")
191
+
192
+ def dummy_update(choice: str):
193
+ pass
194
+
195
+ def get_main_preview():
196
+ return _get_preview_text_for_prompt_toolkit(config)
197
+
198
+ try:
199
+ selected = await _split_panel_selector(
200
+ "Banner Color Configuration",
201
+ choices,
202
+ dummy_update,
203
+ get_preview=get_main_preview,
204
+ config=config,
205
+ )
206
+ except KeyboardInterrupt:
207
+ break
208
+
209
+ # Handle selection
210
+ if selected is None or "Save & Exit" in selected:
211
+ break
212
+ elif "Reset All" in selected:
213
+ from code_muse.config import DEFAULT_BANNER_COLORS
214
+
215
+ config.current_colors = DEFAULT_BANNER_COLORS.copy()
216
+ elif "Discard" in selected or selected == "❌ Exit":
217
+ config.current_colors = config.original_colors.copy()
218
+ break
219
+ elif "───" in selected:
220
+ # Separator - do nothing
221
+ pass
222
+ else:
223
+ # A banner was selected - show color picker
224
+ # Find which banner was selected
225
+ for i, key in enumerate(config.banner_keys):
226
+ display_name, _ = BANNER_DISPLAY_INFO[key]
227
+ if selected.startswith(display_name):
228
+ config.selected_banner_index = i
229
+ await _handle_color_menu(config)
230
+ break
231
+
232
+ except Exception:
233
+ # Silent error - just exit cleanly
234
+ return None
235
+ finally:
236
+ set_awaiting_user_input(False)
237
+ # Exit alternate screen buffer once at end
238
+ sys.stdout.write("\033[?1049l") # Exit alternate buffer
239
+ sys.stdout.flush()
240
+
241
+ # Clear exit message
242
+ from code_muse.messaging import emit_info
243
+
244
+ emit_info("✓ Exited banner color configuration")
245
+
246
+ # Return changes if any
247
+ if config.has_changes():
248
+ return config.current_colors
249
+
250
+ return None
251
+
252
+
253
+ async def _split_panel_selector(
254
+ title: str,
255
+ choices: list[str],
256
+ on_change: Callable[[str], None],
257
+ get_preview: Callable[[], ANSI],
258
+ config: ColorConfiguration | None = None,
259
+ ) -> str | None:
260
+ """Split-panel selector with menu on left and live preview on right."""
261
+ selected_index = [0]
262
+ result = [None]
263
+
264
+ def get_left_panel_text():
265
+ """Generate the selector menu text."""
266
+ try:
267
+ lines = []
268
+ lines.append(("bold cyan", title))
269
+ lines.append(("", "\n\n"))
270
+
271
+ if not choices:
272
+ lines.append(("fg:ansiyellow", "No choices available"))
273
+ lines.append(("", "\n"))
274
+ else:
275
+ for i, choice in enumerate(choices):
276
+ # Skip separator lines for selection highlighting
277
+ if "───" in choice:
278
+ lines.append(("fg:ansigray", f" {choice}"))
279
+ lines.append(("", "\n"))
280
+ elif i == selected_index[0]:
281
+ lines.append(("fg:ansigreen", "▶ "))
282
+ lines.append(("fg:ansigreen bold", choice))
283
+ lines.append(("", "\n"))
284
+ else:
285
+ lines.append(("", " "))
286
+ lines.append(("", choice))
287
+ lines.append(("", "\n"))
288
+
289
+ lines.append(("", "\n"))
290
+ lines.append(
291
+ ("fg:ansicyan", "↑↓ Navigate │ Enter Select │ Ctrl-C Cancel")
292
+ )
293
+ return FormattedText(lines)
294
+ except Exception as e:
295
+ return FormattedText([("fg:ansired", f"Error: {e}")])
296
+
297
+ def get_right_panel_text():
298
+ """Generate the preview panel text."""
299
+ try:
300
+ preview = get_preview()
301
+ return preview
302
+ except Exception as e:
303
+ return FormattedText([("fg:ansired", f"Preview error: {e}")])
304
+
305
+ kb = KeyBindings()
306
+
307
+ @kb.add("up")
308
+ @kb.add("c-p") # Ctrl+P = previous (Emacs-style)
309
+ def move_up(event):
310
+ if choices:
311
+ # Skip separator lines
312
+ new_idx = (selected_index[0] - 1) % len(choices)
313
+ while "───" in choices[new_idx]:
314
+ new_idx = (new_idx - 1) % len(choices)
315
+ selected_index[0] = new_idx
316
+ on_change(choices[selected_index[0]])
317
+ event.app.invalidate()
318
+
319
+ @kb.add("down")
320
+ @kb.add("c-n") # Ctrl+N = next (Emacs-style)
321
+ def move_down(event):
322
+ if choices:
323
+ # Skip separator lines
324
+ new_idx = (selected_index[0] + 1) % len(choices)
325
+ while "───" in choices[new_idx]:
326
+ new_idx = (new_idx + 1) % len(choices)
327
+ selected_index[0] = new_idx
328
+ on_change(choices[selected_index[0]])
329
+ event.app.invalidate()
330
+
331
+ @kb.add("enter")
332
+ def accept(event):
333
+ if choices:
334
+ result[0] = choices[selected_index[0]]
335
+ else:
336
+ result[0] = None
337
+ event.app.exit()
338
+
339
+ @kb.add("c-c")
340
+ def cancel(event):
341
+ result[0] = None
342
+ event.app.exit()
343
+
344
+ # Create split layout with left (selector) and right (preview) panels
345
+ left_panel = Window(
346
+ content=FormattedTextControl(lambda: get_left_panel_text()),
347
+ width=45,
348
+ )
349
+
350
+ right_panel = Window(
351
+ content=FormattedTextControl(lambda: get_right_panel_text()),
352
+ )
353
+
354
+ # Create vertical split (side-by-side panels)
355
+ root_container = VSplit(
356
+ [
357
+ Frame(left_panel, title="Menu"),
358
+ Frame(right_panel, title="Preview"),
359
+ ]
360
+ )
361
+
362
+ layout = Layout(root_container)
363
+ app = Application(
364
+ layout=layout,
365
+ key_bindings=kb,
366
+ full_screen=False,
367
+ mouse_support=False,
368
+ color_depth="DEPTH_24_BIT",
369
+ )
370
+
371
+ sys.stdout.flush()
372
+
373
+ # Trigger initial update only if choices is not empty
374
+ if choices:
375
+ on_change(choices[selected_index[0]])
376
+
377
+ # Clear the current buffer
378
+ sys.stdout.write("\033[2J\033[H")
379
+ sys.stdout.flush()
380
+
381
+ # Run application
382
+ await app.run_async()
383
+
384
+ if result[0] is None:
385
+ raise KeyboardInterrupt()
386
+
387
+ return result[0]
388
+
389
+
390
+ def _get_preview_text_for_prompt_toolkit(config: ColorConfiguration) -> ANSI:
391
+ """Get preview as ANSI for embedding in selector with live colors.
392
+
393
+ Returns ANSI-formatted text that prompt_toolkit can render with full colors.
394
+ """
395
+ # Build preview showing all banners with their current colors
396
+ buffer = io.StringIO()
397
+ console = Console(
398
+ file=buffer,
399
+ force_terminal=True,
400
+ width=70,
401
+ legacy_windows=False,
402
+ color_system="truecolor",
403
+ no_color=False,
404
+ force_interactive=True,
405
+ )
406
+
407
+ # Header
408
+ console.print("[bold]═" * 60 + "[/bold]")
409
+ console.print("[bold cyan] LIVE PREVIEW - Banner Colors[/bold cyan]")
410
+ console.print("[bold]═" * 60 + "[/bold]")
411
+ console.print()
412
+
413
+ # Show each banner with its current color
414
+ for key in config.banner_keys:
415
+ display_name, icon = BANNER_DISPLAY_INFO[key]
416
+ color = config.current_colors[key]
417
+ sample = BANNER_SAMPLE_CONTENT[key]
418
+
419
+ # Highlight the currently selected banner
420
+ is_selected = key == config.get_current_banner_key()
421
+ if is_selected:
422
+ console.print("[bold yellow]▶[/bold yellow] ", end="")
423
+ else:
424
+ console.print(" ", end="")
425
+
426
+ # Print the banner with its configured color
427
+ icon_str = f" {icon}" if icon else ""
428
+ banner_text = (
429
+ f"[bold white on {color}] {display_name} [/bold white on {color}]{icon_str}"
430
+ )
431
+ console.print(banner_text)
432
+
433
+ # Print sample content (dimmed)
434
+ sample_lines = sample.split("\n")
435
+ for line in sample_lines[:2]: # Only show first 2 lines
436
+ if is_selected:
437
+ console.print(f" [dim]{line}[/dim]")
438
+ else:
439
+ console.print(f" [dim]{line}[/dim]")
440
+ console.print()
441
+
442
+ console.print("[bold]═" * 60 + "[/bold]")
443
+
444
+ ansi_output = buffer.getvalue()
445
+ return ANSI(ansi_output)
446
+
447
+
448
+ async def _handle_color_menu(config: ColorConfiguration) -> None:
449
+ """Handle color selection for the current banner."""
450
+ banner_key = config.get_current_banner_key()
451
+ display_name, _ = BANNER_DISPLAY_INFO[banner_key]
452
+ current_color = config.get_current_banner_color()
453
+ title = f"Select color for {display_name}:"
454
+
455
+ # Build choices with color names
456
+ choices = []
457
+ for name, color_value in BANNER_COLORS.items():
458
+ marker = " ← current" if color_value == current_color else ""
459
+ choices.append(f"{name}{marker}")
460
+
461
+ # Store original color for potential cancellation
462
+ original_color = current_color
463
+
464
+ # Callback for live preview updates
465
+ def update_preview(selected_choice: str):
466
+ color_name = selected_choice.replace(" ← current", "").strip()
467
+ selected_color = BANNER_COLORS.get(color_name, "blue")
468
+ config.set_current_banner_color(selected_color)
469
+
470
+ def get_preview_header():
471
+ return _get_single_banner_preview(config)
472
+
473
+ try:
474
+ await _split_panel_selector(
475
+ title,
476
+ choices,
477
+ update_preview,
478
+ get_preview=get_preview_header,
479
+ config=config,
480
+ )
481
+ except KeyboardInterrupt:
482
+ # Restore original color on cancel
483
+ config.set_current_banner_color(original_color)
484
+ except Exception:
485
+ pass # Silent error handling
486
+
487
+
488
+ def _get_single_banner_preview(config: ColorConfiguration) -> ANSI:
489
+ """Get preview for a single banner being edited."""
490
+ buffer = io.StringIO()
491
+ console = Console(
492
+ file=buffer,
493
+ force_terminal=True,
494
+ width=70,
495
+ legacy_windows=False,
496
+ color_system="truecolor",
497
+ no_color=False,
498
+ force_interactive=True,
499
+ )
500
+
501
+ banner_key = config.get_current_banner_key()
502
+ display_name, icon = BANNER_DISPLAY_INFO[banner_key]
503
+ color = config.get_current_banner_color()
504
+ sample = BANNER_SAMPLE_CONTENT[banner_key]
505
+
506
+ # Header
507
+ console.print("[bold]═" * 60 + "[/bold]")
508
+ console.print(f"[bold cyan] Editing: {display_name}[/bold cyan]")
509
+ console.print(f" Current Color: [bold]{color}[/bold]")
510
+ console.print("[bold]═" * 60 + "[/bold]")
511
+ console.print()
512
+
513
+ # Show the banner large
514
+ icon_str = f" {icon}" if icon else ""
515
+ banner_text = (
516
+ f"[bold white on {color}] {display_name} [/bold white on {color}]{icon_str}"
517
+ )
518
+ console.print(banner_text)
519
+ console.print()
520
+
521
+ # Show sample content
522
+ console.print("[dim]Sample output:[/dim]")
523
+ for line in sample.split("\n"):
524
+ console.print(f"[dim]{line}[/dim]")
525
+
526
+ console.print()
527
+ console.print("[bold]═" * 60 + "[/bold]")
528
+
529
+ ansi_output = buffer.getvalue()
530
+ return ANSI(ansi_output)