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,482 @@
1
+ """Text transform primitives for shell output minimisation.
2
+
3
+ Each function is a pure, side-effect-free transform on a string.
4
+ They are the building blocks that pipeline definitions compose.
5
+
6
+ All functions accept ``str`` and return ``str``. Every primitive is
7
+ single-pass, Unicode-safe, and raises on gross misuse but never on
8
+ edge-case input (empty string, all-whitespace, etc.).
9
+
10
+ Includes a comprehensive ``if __name__ == "__main__":`` test block.
11
+ """
12
+
13
+ import re
14
+
15
+ from code_muse.terminal_utils import strip_ansi
16
+
17
+ # ---------------------------------------------------------------------------
18
+ # ANSI / control character stripping
19
+ # ---------------------------------------------------------------------------
20
+
21
+ # Re-export the Cython-optimised strip_ansi from terminal_utils for backward
22
+ # compatibility and so that downstream pipeline code keeps working.
23
+
24
+
25
+ # ---------------------------------------------------------------------------
26
+ # Consecutive-line deduplication
27
+ # ---------------------------------------------------------------------------
28
+
29
+
30
+ # ---------------------------------------------------------------------------
31
+ # Consecutive-line deduplication
32
+ # ---------------------------------------------------------------------------
33
+
34
+
35
+ def dedup_consecutive_lines(input: str) -> str:
36
+ """Collapse consecutive identical lines into ``line (×N)`` notation.
37
+
38
+ Runs of 2+ identical consecutive lines are collapsed. Blank lines
39
+ participate in deduplication.
40
+ """
41
+ if not input:
42
+ return input
43
+
44
+ lines = input.splitlines()
45
+ if len(lines) < 2:
46
+ return input
47
+
48
+ result: list[str] = []
49
+ i = 0
50
+ while i < len(lines):
51
+ run_start = i
52
+ line = lines[i]
53
+ # Count how many consecutive identical lines follow
54
+ while i < len(lines) and lines[i] == line:
55
+ i += 1
56
+ run_len = i - run_start
57
+ if run_len >= 2:
58
+ result.append(f"{line} (×{run_len})")
59
+ else:
60
+ result.extend(lines[run_start:i])
61
+
62
+ output = "\n".join(result)
63
+ if input.endswith("\n"):
64
+ output += "\n"
65
+ return output
66
+
67
+
68
+ # ---------------------------------------------------------------------------
69
+ # Head / tail extraction
70
+ # ---------------------------------------------------------------------------
71
+
72
+
73
+ def head_tail_lines(input: str, head: int, tail: int) -> str:
74
+ """Keep *head* first lines and *tail* last lines, with an omission marker.
75
+
76
+ Returns::
77
+
78
+ <first N lines>
79
+ … <M> lines omitted …
80
+ <last N lines>
81
+
82
+ When the input has fewer than ``head + tail`` lines it is returned
83
+ unchanged.
84
+ """
85
+ if not input:
86
+ return input
87
+
88
+ lines = input.splitlines()
89
+ total = len(lines)
90
+
91
+ if total <= head + tail:
92
+ return input
93
+
94
+ head_lines = lines[:head]
95
+ tail_lines = lines[-tail:] if tail > 0 else []
96
+ omitted = total - head - tail
97
+
98
+ result = head_lines[:]
99
+ result.append(f"… {omitted} line{'s' if omitted != 1 else ''} omitted …")
100
+ result.extend(tail_lines)
101
+
102
+ output = "\n".join(result)
103
+ if input.endswith("\n"):
104
+ output += "\n"
105
+ return output
106
+
107
+
108
+ def head_lines_only(input: str, head: int) -> str:
109
+ """Return first *head* lines with a trailing count line.
110
+
111
+ Returns::
112
+
113
+ <first N lines>
114
+ (… and <M> more lines)
115
+
116
+ When input has ≤ *head* lines it is returned unchanged.
117
+ """
118
+ if not input:
119
+ return input
120
+
121
+ lines = input.splitlines()
122
+ total = len(lines)
123
+
124
+ if total <= head:
125
+ return input
126
+
127
+ kept = lines[:head]
128
+ remainder = total - head
129
+ kept.append(f"(… and {remainder} more line{'s' if remainder != 1 else ''})")
130
+
131
+ output = "\n".join(kept)
132
+ if input.endswith("\n"):
133
+ output += "\n"
134
+ return output
135
+
136
+
137
+ def tail_lines_only(input: str, tail: int) -> str:
138
+ """Return last *tail* lines with a leading count line.
139
+
140
+ Returns::
141
+
142
+ (… <M> lines above …)
143
+ <last N lines>
144
+
145
+ When input has ≤ *tail* lines it is returned unchanged.
146
+ """
147
+ if not input:
148
+ return input
149
+
150
+ lines = input.splitlines()
151
+ total = len(lines)
152
+
153
+ if total <= tail:
154
+ return input
155
+
156
+ omitted = total - tail
157
+ result = [f"(… {omitted} line{'s' if omitted != 1 else ''} above …)"]
158
+ result.extend(lines[-tail:])
159
+
160
+ output = "\n".join(result)
161
+ if input.endswith("\n"):
162
+ output += "\n"
163
+ return output
164
+
165
+
166
+ # ---------------------------------------------------------------------------
167
+ # Regex-based line filtering
168
+ # ---------------------------------------------------------------------------
169
+
170
+
171
+ def strip_lines_regex(input: str, patterns: list[str]) -> str:
172
+ """Drop every line that matches any regex in *patterns*.
173
+
174
+ Patterns are compiled with ``re.IGNORECASE``. Lines are split on
175
+ universal newlines.
176
+ """
177
+ if not input or not patterns:
178
+ return input
179
+
180
+ compiled = [re.compile(p, re.IGNORECASE) for p in patterns]
181
+ lines = input.splitlines()
182
+ kept = [line for line in lines if not any(c.search(line) for c in compiled)]
183
+ return "\n".join(kept)
184
+
185
+
186
+ def keep_lines_regex(input: str, patterns: list[str]) -> str:
187
+ """Keep only lines that match at least one regex in *patterns*.
188
+
189
+ Patterns are compiled with ``re.IGNORECASE``. Non-matching lines are
190
+ dropped.
191
+ """
192
+ if not input or not patterns:
193
+ return input
194
+
195
+ compiled = [re.compile(p, re.IGNORECASE) for p in patterns]
196
+ lines = input.splitlines()
197
+ kept = [line for line in lines if any(c.search(line) for c in compiled)]
198
+ return "\n".join(kept)
199
+
200
+
201
+ # ---------------------------------------------------------------------------
202
+ # Per-line truncation
203
+ # ---------------------------------------------------------------------------
204
+
205
+
206
+ def truncate_line(line: str, max_chars: int) -> str:
207
+ """Truncate a single line to *max_chars* Unicode codepoints with ``…``.
208
+
209
+ When the line is ≤ *max_chars* it is returned unchanged. The
210
+ ellipsis character counts toward the limit. Unicode-aware.
211
+ """
212
+ if not line or max_chars <= 0:
213
+ return line
214
+
215
+ if len(line) <= max_chars:
216
+ return line
217
+
218
+ # Reserve space for the ellipsis
219
+ keep = max_chars - 1
220
+ if keep <= 0:
221
+ return "…"
222
+
223
+ return line[:keep] + "…"
224
+
225
+
226
+ # ---------------------------------------------------------------------------
227
+ # Listing compactors
228
+ # ---------------------------------------------------------------------------
229
+
230
+
231
+ def compact_listing(input: str, max_lines: int) -> str:
232
+ """Compact a plain-text listing to head/tail with an entry count.
233
+
234
+ Designed for directory listings, file lists, etc. Returns::
235
+
236
+ <first max_lines entries>
237
+ (… and <N> more entries)
238
+ """
239
+ if not input:
240
+ return input
241
+
242
+ lines = input.splitlines()
243
+ total = len(lines)
244
+
245
+ if total <= max_lines:
246
+ return input
247
+
248
+ kept = lines[:max_lines]
249
+ remainder = total - max_lines
250
+ kept.append(f"(… and {remainder} more entr{'ies' if remainder != 1 else 'y'})")
251
+
252
+ return "\n".join(kept)
253
+
254
+
255
+ # ---------------------------------------------------------------------------
256
+ # Diagnostics grouper (file:line:message)
257
+ # ---------------------------------------------------------------------------
258
+
259
+
260
+ _GLOC_RE = re.compile(r"^(.+?):(\d+):(.*)$")
261
+
262
+
263
+ def group_by_file(input: str, max_per_file: int) -> str:
264
+ """Group ``file:line:message`` diagnostics by file, limiting per file.
265
+
266
+ Lines that don't match the ``path:lineno:text`` pattern are passed
267
+ through unchanged. For each file, only the first *max_per_file*
268
+ diagnostics are kept; the rest are summarised as ``(… N more in <file>)``.
269
+ """
270
+ if not input:
271
+ return input
272
+
273
+ lines = input.splitlines()
274
+ unmatched: list[str] = []
275
+ grouped: dict[str, list[str]] = {}
276
+ file_order: list[str] = []
277
+
278
+ for line in lines:
279
+ m = _GLOC_RE.match(line)
280
+ if m:
281
+ fname = m.group(1)
282
+ if fname not in grouped:
283
+ grouped[fname] = []
284
+ file_order.append(fname)
285
+ grouped[fname].append(line)
286
+ else:
287
+ unmatched.append(line)
288
+
289
+ result: list[str] = []
290
+
291
+ for fname in file_order:
292
+ entries = grouped[fname]
293
+ kept = entries[:max_per_file]
294
+ result.extend(kept)
295
+ if len(entries) > max_per_file:
296
+ more = len(entries) - max_per_file
297
+ result.append(f"(… {more} more in {fname})")
298
+
299
+ result.extend(unmatched)
300
+ return "\n".join(result)
301
+
302
+
303
+ # ---------------------------------------------------------------------------
304
+ # Hard line cap
305
+ # ---------------------------------------------------------------------------
306
+
307
+
308
+ def max_lines(input: str, max: int) -> str:
309
+ """Return at most *max* lines, with an omission marker.
310
+
311
+ When input has ≤ *max* lines it is returned unchanged.
312
+
313
+ Returns::
314
+
315
+ <first max lines>
316
+ … N lines omitted …
317
+ """
318
+ if not input:
319
+ return input
320
+
321
+ lines = input.splitlines()
322
+ total = len(lines)
323
+
324
+ if total <= max:
325
+ return input
326
+
327
+ kept = lines[:max]
328
+ omitted = total - max
329
+ kept.append(f"… {omitted} line{'s' if omitted != 1 else ''} omitted …")
330
+
331
+ output = "\n".join(kept)
332
+ if input.endswith("\n"):
333
+ output += "\n"
334
+ return output
335
+
336
+
337
+ # ---------------------------------------------------------------------------
338
+ # Self-tests
339
+ # ---------------------------------------------------------------------------
340
+
341
+ if __name__ == "__main__":
342
+ import sys
343
+
344
+ failures = 0
345
+
346
+ def _check(name: str, got: str, expected: str) -> None:
347
+ global failures
348
+ ok = got == expected
349
+ status = "✅" if ok else "❌ FAIL"
350
+ print(f"{status} {name}")
351
+ if not ok:
352
+ failures += 1
353
+ print(f" expected: {expected!r}")
354
+ print(f" got: {got!r}")
355
+
356
+ # --- strip_ansi ----------------------------------------------------------
357
+
358
+ _check("ansi: empty", strip_ansi(""), "")
359
+ _check("ansi: plain text", strip_ansi("hello world"), "hello world")
360
+ _check(
361
+ "ansi: CSI codes stripped",
362
+ strip_ansi("\x1b[32mOK\x1b[0m\n\x1b[1;31mFAIL\x1b[0m"),
363
+ "OK\nFAIL",
364
+ )
365
+ _check(
366
+ "ansi: carriage-return frames to newlines",
367
+ strip_ansi(
368
+ "Downloading... 10%\rDownloading... 50%\rDownloading... 100%\r\nDone!"
369
+ ),
370
+ "Downloading... 10%\nDownloading... 50%\nDownloading... 100%\nDone!",
371
+ )
372
+
373
+ # --- dedup_consecutive_lines ---------------------------------------------
374
+
375
+ _check("dedup: empty", dedup_consecutive_lines(""), "")
376
+ _check("dedup: single line", dedup_consecutive_lines("hello"), "hello")
377
+ _check(
378
+ "dedup: identical run of 3+",
379
+ dedup_consecutive_lines("a\na\na\nb\nb\nc"),
380
+ "a (×3)\nb (×2)\nc",
381
+ )
382
+ _check(
383
+ "dedup: identical run of 2 collapsed",
384
+ dedup_consecutive_lines("a\na\nb"),
385
+ "a (×2)\nb",
386
+ )
387
+ _check(
388
+ "dedup: blank line run",
389
+ dedup_consecutive_lines("text\n\n\n\ntext"),
390
+ "text\n (×3)\ntext",
391
+ )
392
+
393
+ # --- head_tail_lines -----------------------------------------------------
394
+
395
+ big = "\n".join(str(i) for i in range(100))
396
+ _check("head_tail: empty", head_tail_lines("", 5, 5), "")
397
+ _check("head_tail: short input", head_tail_lines("1\n2\n3", 5, 5), "1\n2\n3")
398
+ ht = head_tail_lines(big, 3, 2)
399
+ assert ht.startswith("0\n1\n2\n"), f"head wrong: {ht!r}"
400
+ assert "… 95 lines omitted …" in ht
401
+ assert ht.endswith("\n98\n99"), f"tail wrong: {ht!r}"
402
+
403
+ # --- head_lines_only -----------------------------------------------------
404
+
405
+ _check("head_only: empty", head_lines_only("", 3), "")
406
+ _check("head_only: short", head_lines_only("a\nb", 3), "a\nb")
407
+ hl = head_lines_only(big, 4)
408
+ assert hl.startswith("0\n1\n2\n3\n"), f"head_only wrong start: {hl!r}"
409
+ assert hl.endswith("(… and 96 more lines)"), f"head_only wrong end: {hl!r}"
410
+
411
+ # --- tail_lines_only -----------------------------------------------------
412
+
413
+ _check("tail_only: empty", tail_lines_only("", 3), "")
414
+ _check("tail_only: short", tail_lines_only("a\nb", 3), "a\nb")
415
+ tl = tail_lines_only(big, 3)
416
+ assert tl.startswith("(… 97 lines above …)\n"), f"tail_only wrong start: {tl!r}"
417
+ assert tl.endswith("\n97\n98\n99"), f"tail_only wrong end: {tl!r}"
418
+
419
+ # --- strip_lines_regex ---------------------------------------------------
420
+
421
+ _check("strip_re: empty", strip_lines_regex("", [r"err"]), "")
422
+ _check("strip_re: no patterns", strip_lines_regex("a\nb", []), "a\nb")
423
+ _check(
424
+ "strip_re: drop error/warning lines",
425
+ strip_lines_regex(
426
+ "info\nERROR: bad\nWARNING: meh\nok", [r"^error:", r"^warning:"]
427
+ ),
428
+ "info\nok",
429
+ )
430
+
431
+ # --- keep_lines_regex ----------------------------------------------------
432
+
433
+ _check("keep_re: empty", keep_lines_regex("", [r"err"]), "")
434
+ _check("keep_re: no patterns", keep_lines_regex("a\nb", []), "a\nb")
435
+ _check(
436
+ "keep_re: keep only error lines",
437
+ keep_lines_regex("info\nERROR: bad\nok\nWARN: x", [r"error|warn"]),
438
+ "ERROR: bad\nWARN: x",
439
+ )
440
+
441
+ # --- truncate_line -------------------------------------------------------
442
+
443
+ _check("trunc: empty", truncate_line("", 10), "")
444
+ _check("trunc: short", truncate_line("abc", 10), "abc")
445
+ _check("trunc: exact", truncate_line("abcdefghij", 10), "abcdefghij")
446
+ _check("trunc: over", truncate_line("abcdefghijk", 10), "abcdefghi…")
447
+ _check("trunc: very narrow", truncate_line("abcdefghijk", 3), "ab…")
448
+ _check("trunc: zero max", truncate_line("abc", 0), "abc")
449
+
450
+ # --- compact_listing -----------------------------------------------------
451
+
452
+ _check("compact: empty", compact_listing("", 5), "")
453
+ _check("compact: short", compact_listing("a\nb", 5), "a\nb")
454
+ cl = compact_listing(big, 7)
455
+ assert cl.startswith("0\n1\n2\n3\n4\n5\n6\n"), f"compact wrong start: {cl!r}"
456
+ assert cl.endswith("(… and 93 more entries)"), f"compact wrong end: {cl!r}"
457
+
458
+ # --- group_by_file -------------------------------------------------------
459
+
460
+ diag = "src/a.py:10: error\nsrc/a.py:20: warning\nsrc/b.py:5: error\nextra info"
461
+ _check("group: empty", group_by_file("", 3), "")
462
+ _check("group: non-diag passthrough", group_by_file("plain text", 3), "plain text")
463
+ gb = group_by_file(diag, 1)
464
+ assert "src/a.py:10: error\n(… 1 more in src/a.py)" in gb
465
+ assert "src/b.py:5: error" in gb
466
+ assert "extra info" in gb
467
+
468
+ # --- max_lines -----------------------------------------------------------
469
+
470
+ _check("max: empty", max_lines("", 5), "")
471
+ _check("max: short", max_lines("a\nb", 5), "a\nb")
472
+ ml = max_lines(big, 6)
473
+ assert ml.startswith("0\n1\n2\n3\n4\n5\n"), f"max wrong start: {ml!r}"
474
+ assert ml.endswith("… 94 lines omitted …"), f"max wrong end: {ml!r}"
475
+
476
+ # --- summary -------------------------------------------------------------
477
+
478
+ if failures:
479
+ print(f"\n{failures} test(s) FAILED", file=sys.stderr)
480
+ sys.exit(1)
481
+ else:
482
+ print("\n🎉 All primitives tests passed!")