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,241 @@
1
+ """Detect if Muse was launched via uvx on Windows.
2
+
3
+ This module provides utilities to detect the launch method of Muse,
4
+ specifically to handle signal differences when running via uvx on Windows.
5
+
6
+ On Windows, when launched via `uvx muse`, Ctrl+C (SIGINT) gets captured
7
+ by uvx's process handling before reaching our Python process. To work around
8
+ this, we detect the uvx launch scenario and switch to Ctrl+K for cancellation.
9
+
10
+ Note: This issue is specific to uvx.exe, NOT uv.exe. Running via `uv run`
11
+ handles SIGINT correctly on Windows.
12
+
13
+ On non-Windows platforms, this is not an issue - Ctrl+C works fine with uvx.
14
+ """
15
+
16
+ import os
17
+ import platform
18
+ import sys
19
+ from functools import lru_cache
20
+
21
+ # Cache the detection result - it won't change during runtime
22
+ _uvx_detection_cache: bool | None = None
23
+
24
+
25
+ def _get_parent_process_name_psutil(pid: int) -> str | None:
26
+ """Get parent process name using psutil (if available).
27
+
28
+ Args:
29
+ pid: Process ID to get parent name for
30
+
31
+ Returns:
32
+ Parent process name (lowercase) or None if not found
33
+ """
34
+ try:
35
+ import psutil
36
+
37
+ proc = psutil.Process(pid)
38
+ parent = proc.parent()
39
+ if parent:
40
+ return parent.name().lower()
41
+ except Exception:
42
+ pass
43
+ return None
44
+
45
+
46
+ def _get_parent_process_chain_psutil() -> list[str]:
47
+ """Get the entire parent process chain using psutil.
48
+
49
+ Returns:
50
+ List of process names from current process up to init/System
51
+ """
52
+ chain = []
53
+ try:
54
+ import psutil
55
+
56
+ proc = psutil.Process(os.getpid())
57
+ while proc:
58
+ chain.append(proc.name().lower())
59
+ parent = proc.parent()
60
+ if parent is None or parent.pid in (0, proc.pid):
61
+ break
62
+ proc = parent
63
+ except Exception:
64
+ pass
65
+ return chain
66
+
67
+
68
+ def _get_parent_process_chain_windows_ctypes() -> list[str]:
69
+ """Get parent process chain on Windows using ctypes (no external deps).
70
+
71
+ This is a fallback when psutil is not available.
72
+
73
+ Returns:
74
+ List of process names from current process up to System
75
+ """
76
+ if platform.system() != "Windows":
77
+ return []
78
+
79
+ chain = []
80
+ try:
81
+ import ctypes
82
+ from ctypes import wintypes
83
+
84
+ # Windows API constants
85
+ TH32CS_SNAPPROCESS = 0x00000002
86
+ INVALID_HANDLE_VALUE = -1
87
+
88
+ class PROCESSENTRY32(ctypes.Structure):
89
+ _fields_ = [
90
+ ("dwSize", wintypes.DWORD),
91
+ ("cntUsage", wintypes.DWORD),
92
+ ("th32ProcessID", wintypes.DWORD),
93
+ ("th32DefaultHeapID", ctypes.POINTER(wintypes.ULONG)),
94
+ ("th32ModuleID", wintypes.DWORD),
95
+ ("cntThreads", wintypes.DWORD),
96
+ ("th32ParentProcessID", wintypes.DWORD),
97
+ ("pcPriClassBase", wintypes.LONG),
98
+ ("dwFlags", wintypes.DWORD),
99
+ ("szExeFile", ctypes.c_char * 260),
100
+ ]
101
+
102
+ kernel32 = ctypes.windll.kernel32
103
+
104
+ # Take a snapshot of all processes
105
+ snapshot = kernel32.CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
106
+ if snapshot == INVALID_HANDLE_VALUE:
107
+ return chain
108
+
109
+ try:
110
+ # Build a map of PID -> (parent_pid, exe_name)
111
+ process_map: dict[int, tuple[int, str]] = {}
112
+ pe = PROCESSENTRY32()
113
+ pe.dwSize = ctypes.sizeof(PROCESSENTRY32)
114
+
115
+ if kernel32.Process32First(snapshot, ctypes.byref(pe)):
116
+ while True:
117
+ pid = pe.th32ProcessID
118
+ parent_pid = pe.th32ParentProcessID
119
+ exe_name = pe.szExeFile.decode("utf-8", errors="ignore").lower()
120
+ process_map[pid] = (parent_pid, exe_name)
121
+
122
+ if not kernel32.Process32Next(snapshot, ctypes.byref(pe)):
123
+ break
124
+
125
+ # Traverse from current PID up the parent chain
126
+ current_pid = os.getpid()
127
+ visited = set() # Prevent infinite loops
128
+
129
+ while current_pid in process_map and current_pid not in visited:
130
+ visited.add(current_pid)
131
+ parent_pid, exe_name = process_map[current_pid]
132
+ chain.append(exe_name)
133
+
134
+ if parent_pid == 0 or parent_pid == current_pid:
135
+ break
136
+ current_pid = parent_pid
137
+
138
+ finally:
139
+ kernel32.CloseHandle(snapshot)
140
+
141
+ except Exception:
142
+ pass
143
+
144
+ return chain
145
+
146
+
147
+ def _get_parent_process_chain() -> list[str]:
148
+ """Get the parent process chain using best available method.
149
+
150
+ Returns:
151
+ List of process names from current process up to init/System
152
+ """
153
+ # Try psutil first (more reliable, cross-platform)
154
+ try:
155
+ import psutil # noqa: F401
156
+
157
+ return _get_parent_process_chain_psutil()
158
+ except ImportError:
159
+ pass
160
+
161
+ # Fall back to ctypes on Windows
162
+ if platform.system() == "Windows":
163
+ return _get_parent_process_chain_windows_ctypes()
164
+
165
+ return []
166
+
167
+
168
+ def _is_uvx_in_chain(chain: list[str]) -> bool:
169
+ """Check if uvx is in the process chain.
170
+
171
+ Note: We only check for uvx.exe, NOT uv.exe. The uv.exe binary
172
+ (used by `uv run`) handles SIGINT correctly on Windows, but
173
+ uvx.exe captures it before it reaches Python.
174
+
175
+ Args:
176
+ chain: List of process names (lowercase)
177
+
178
+ Returns:
179
+ True if uvx.exe is found in the chain
180
+ """
181
+ # Only uvx.exe has the SIGINT issue, not uv.exe
182
+ uvx_names = {"uvx.exe", "uvx"}
183
+ return any(name in uvx_names for name in chain)
184
+
185
+
186
+ @lru_cache(maxsize=1)
187
+ def is_launched_via_uvx() -> bool:
188
+ """Detect if Muse was launched via uvx.
189
+
190
+ Traverses the parent process chain to find uvx.exe or uv.exe.
191
+ Result is cached for the lifetime of the process.
192
+
193
+ Returns:
194
+ True if launched via uvx, False otherwise
195
+ """
196
+ chain = _get_parent_process_chain()
197
+ return _is_uvx_in_chain(chain)
198
+
199
+
200
+ def is_windows() -> bool:
201
+ """Check if we're running on Windows.
202
+
203
+ Returns:
204
+ True if running on Windows, False otherwise
205
+ """
206
+ return platform.system() == "Windows"
207
+
208
+
209
+ def should_use_alternate_cancel_key() -> bool:
210
+ """Determine if we should use an alternate cancel key (Ctrl+K) instead of Ctrl+C.
211
+
212
+ This returns True when:
213
+ - Running on Windows AND
214
+ - Launched via uvx
215
+
216
+ In this scenario, Ctrl+C is captured by uvx before reaching Python,
217
+ so we need to use a different key (Ctrl+K) for agent cancellation.
218
+
219
+ Returns:
220
+ True if alternate cancel key should be used, False otherwise
221
+ """
222
+ return is_windows() and is_launched_via_uvx()
223
+
224
+
225
+ def get_uvx_detection_info() -> dict:
226
+ """Get diagnostic information about uvx detection.
227
+
228
+ Useful for debugging and testing.
229
+
230
+ Returns:
231
+ Dictionary with detection details
232
+ """
233
+ chain = _get_parent_process_chain()
234
+ return {
235
+ "is_windows": is_windows(),
236
+ "is_launched_via_uvx": is_launched_via_uvx(),
237
+ "should_use_alternate_cancel_key": should_use_alternate_cancel_key(),
238
+ "parent_process_chain": chain,
239
+ "current_pid": os.getpid(),
240
+ "python_executable": sys.executable,
241
+ }
@@ -0,0 +1,86 @@
1
+ """Version checking utilities for Muse."""
2
+
3
+ import httpx
4
+
5
+ from code_muse.messaging import emit_info, emit_success, emit_warning, get_message_bus
6
+ from code_muse.messaging.messages import VersionCheckMessage
7
+
8
+ UVX_REFRESH_COMMAND = "uvx code-muse"
9
+
10
+
11
+ def normalize_version(version_str):
12
+ if not version_str:
13
+ return version_str
14
+ version_str = version_str.lstrip("v")
15
+ return version_str
16
+
17
+
18
+ def _version_tuple(version_str):
19
+ """Convert version string to tuple of ints for proper comparison."""
20
+ try:
21
+ return tuple(int(x) for x in version_str.split("."))
22
+ except ValueError, AttributeError:
23
+ return None
24
+
25
+
26
+ def version_is_newer(latest, current):
27
+ """Return True if latest version is strictly newer than current."""
28
+ latest_tuple = _version_tuple(normalize_version(latest))
29
+ current_tuple = _version_tuple(normalize_version(current))
30
+ if latest_tuple is None or current_tuple is None:
31
+ return False
32
+ return latest_tuple > current_tuple
33
+
34
+
35
+ def versions_are_equal(current, latest):
36
+ current_norm = normalize_version(current)
37
+ latest_norm = normalize_version(latest)
38
+ # Try numeric tuple comparison first
39
+ current_tuple = _version_tuple(current_norm)
40
+ latest_tuple = _version_tuple(latest_norm)
41
+ if current_tuple is not None and latest_tuple is not None:
42
+ return current_tuple == latest_tuple
43
+ # Fallback to string comparison
44
+ return current_norm == latest_norm
45
+
46
+
47
+ def fetch_latest_version(package_name):
48
+ try:
49
+ response = httpx.get(f"https://pypi.org/pypi/{package_name}/json", timeout=5.0)
50
+ response.raise_for_status()
51
+ data = response.json()
52
+ return data["info"]["version"]
53
+ except Exception as e:
54
+ emit_warning(f"Error fetching version: {e}")
55
+ return None
56
+
57
+
58
+ def default_version_mismatch_behavior(current_version):
59
+ # Defensive: ensure current_version is never None
60
+ if current_version is None:
61
+ current_version = "0.0.0-unknown"
62
+ emit_warning("Could not detect current version, using fallback")
63
+
64
+ latest_version = fetch_latest_version("code-muse")
65
+
66
+ update_available = bool(
67
+ latest_version and version_is_newer(latest_version, current_version)
68
+ )
69
+
70
+ # Emit structured version check message
71
+ version_msg = VersionCheckMessage(
72
+ current_version=current_version,
73
+ latest_version=latest_version or current_version,
74
+ update_available=update_available,
75
+ )
76
+ get_message_bus().emit(version_msg)
77
+
78
+ # Also emit plain text for legacy renderer
79
+ emit_info(f"Current version: {current_version}")
80
+
81
+ if update_available:
82
+ emit_info(f"Latest version: {latest_version}")
83
+ emit_warning(f"A new version of Muse is available: {latest_version}")
84
+ emit_success(
85
+ f"Run to refresh uvx and start the latest version: {UVX_REFRESH_COMMAND}"
86
+ )
@@ -0,0 +1,66 @@
1
+ {
2
+ "wafer.ai-glm-5.1": {
3
+ "type": "custom_openai",
4
+ "provider": "wafer",
5
+ "name": "GLM-5.1",
6
+ "custom_endpoint": {
7
+ "url": "https://pass.wafer.ai/v1",
8
+ "api_key": "$WAFER_API_KEY"
9
+ },
10
+ "context_length": 200000,
11
+ "supported_settings": ["temperature", "seed", "top_p", "max_tokens"]
12
+ },
13
+ "wafer.ai-Qwen3.5-397B-A17B": {
14
+ "type": "custom_openai",
15
+ "provider": "wafer",
16
+ "name": "Qwen3.5-397B-A17B",
17
+ "custom_endpoint": {
18
+ "url": "https://pass.wafer.ai/v1",
19
+ "api_key": "$WAFER_API_KEY"
20
+ },
21
+ "context_length": 262144,
22
+ "supported_settings": ["temperature", "seed", "top_p", "max_tokens"]
23
+ },
24
+ "wafer-DeepSeek-V4-Pro": {
25
+ "type": "custom_openai",
26
+ "provider": "wafer",
27
+ "name": "DeepSeek-V4-Pro",
28
+ "custom_endpoint": {
29
+ "url": "https://pass.wafer.ai/v1",
30
+ "api_key": "$WAFER_API_KEY"
31
+ },
32
+ "context_length": 1000000,
33
+ "supported_settings": ["temperature", "seed", "top_p", "max_tokens"]
34
+ },
35
+ "wafer-MiniMax-M2.7": {
36
+ "type": "custom_openai",
37
+ "provider": "wafer",
38
+ "name": "MiniMax-M2.7",
39
+ "custom_endpoint": {
40
+ "url": "https://pass.wafer.ai/v1",
41
+ "api_key": "$WAFER_API_KEY"
42
+ },
43
+ "context_length": 204800,
44
+ "supported_settings": ["temperature", "seed", "top_p", "max_tokens"]
45
+ },
46
+ "crof-kimi-k2.5-lightning": {
47
+ "type": "custom_openai",
48
+ "provider": "crof",
49
+ "name": "kimi-k2.5-lightning",
50
+ "custom_endpoint": {
51
+ "url": "https://crof.ai/v1",
52
+ "api_key": "$CROF_API_KEY"
53
+ },
54
+ "context_length": 131072,
55
+ "streaming": false,
56
+ "strict_tools": false,
57
+ "supported_settings": ["temperature", "seed", "top_p"]
58
+ },
59
+ "zai-glm-5-coding": {
60
+ "type": "zai_coding",
61
+ "provider": "zai",
62
+ "name": "glm-5",
63
+ "context_length": 200000,
64
+ "supported_settings": ["temperature", "top_p"]
65
+ }
66
+ }