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,483 @@
1
+ # cython: language_level=3
2
+ """Terminal utilities for cross-platform terminal state management.
3
+
4
+ Handles Windows console mode resets and Unix terminal sanity restoration.
5
+ Includes a Cython-optimised ANSI escape sequence stripper.
6
+ """
7
+
8
+ import os
9
+ import platform
10
+ import subprocess
11
+ import sys
12
+ from collections.abc import Callable
13
+ from typing import TYPE_CHECKING
14
+
15
+ if TYPE_CHECKING:
16
+ from rich.console import Console
17
+
18
+ # Store the original console ctrl handler so we can restore it if needed
19
+ _original_ctrl_handler: Callable | None = None
20
+
21
+
22
+ # ---------------------------------------------------------------------------
23
+ # ANSI stripping (Cython-optimised byte scan)
24
+ # ---------------------------------------------------------------------------
25
+
26
+ def strip_ansi(input: str) -> str:
27
+ """Remove ANSI CSI escape sequences and bare carriage-return frames.
28
+
29
+ CSI sequences like ``\\x1b[0m``, ``\\x1b[32;1m``, and cursor movement
30
+ sequences are stripped. Lines that use ``\\r`` for progress / spinner
31
+ frames (not followed by a newline) are cleaned up by replacing the
32
+ carriage return with a newline so each frame becomes its own line.
33
+
34
+ This implementation uses a typed single-pass byte scan for speed.
35
+ """
36
+ if not input:
37
+ return input
38
+
39
+ cdef bytes b = input.encode("utf-8")
40
+ cdef Py_ssize_t i = 0
41
+ cdef Py_ssize_t n = len(b)
42
+ cdef bytearray out = bytearray()
43
+ cdef int in_csi = 0
44
+ cdef Py_ssize_t start_csi = 0
45
+ cdef unsigned char ch
46
+
47
+ while i < n:
48
+ ch = b[i]
49
+ if in_csi:
50
+ # CSI param bytes are 0x30-0x3F (;, digits, etc.)
51
+ # intermediate bytes 0x20-0x2F, final bytes 0x40-0x7E
52
+ # We simply wait for a final byte (0x40-0x7E).
53
+ if 0x40 <= ch <= 0x7E:
54
+ in_csi = 0
55
+ i += 1
56
+ continue
57
+ if ch == 0x1B and i + 1 < n and b[i + 1] == 0x5B: # ESC [
58
+ in_csi = 1
59
+ start_csi = i
60
+ i += 2
61
+ continue
62
+ if ch == 0x0D: # \r
63
+ if i + 1 < n and b[i + 1] == 0x0A: # \r\n
64
+ out.append(0x0A)
65
+ i += 2
66
+ continue
67
+ out.append(0x0A)
68
+ i += 1
69
+ continue
70
+ out.append(ch)
71
+ i += 1
72
+
73
+ if in_csi:
74
+ # Unterminated CSI — preserve from ESC to end
75
+ out.extend(b[start_csi:])
76
+
77
+ return out.decode("utf-8")
78
+
79
+
80
+ # ---------------------------------------------------------------------------
81
+ # Windows terminal resets
82
+ # ---------------------------------------------------------------------------
83
+
84
+
85
+ def reset_windows_terminal_ansi() -> None:
86
+ """Reset ANSI formatting on Windows stdout/stderr.
87
+
88
+ This is a lightweight reset that just clears ANSI escape sequences.
89
+ Use this for quick resets after output operations.
90
+ """
91
+ if platform.system() != "Windows":
92
+ return
93
+
94
+ try:
95
+ sys.stdout.write("\x1b[0m") # Reset ANSI formatting
96
+ sys.stdout.flush()
97
+ sys.stderr.write("\x1b[0m")
98
+ sys.stderr.flush()
99
+ except Exception:
100
+ pass # Silently ignore errors - best effort reset
101
+
102
+
103
+ def reset_windows_console_mode() -> None:
104
+ """Full Windows console mode reset using ctypes.
105
+
106
+ This resets both stdout and stdin console modes to restore proper
107
+ terminal behavior after interrupts (Ctrl+C, Ctrl+D). Without this,
108
+ the terminal can become unresponsive (can't type characters).
109
+ """
110
+ if platform.system() != "Windows":
111
+ return
112
+
113
+ try:
114
+ import ctypes
115
+
116
+ kernel32 = ctypes.windll.kernel32
117
+
118
+ # Reset stdout
119
+ STD_OUTPUT_HANDLE = -11
120
+ handle = kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
121
+
122
+ # Enable virtual terminal processing and line input
123
+ mode = ctypes.c_ulong()
124
+ kernel32.GetConsoleMode(handle, ctypes.byref(mode))
125
+
126
+ # Console mode flags for stdout
127
+ ENABLE_PROCESSED_OUTPUT = 0x0001
128
+ ENABLE_WRAP_AT_EOL_OUTPUT = 0x0002
129
+ ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004
130
+
131
+ new_mode = (
132
+ mode.value
133
+ | ENABLE_PROCESSED_OUTPUT
134
+ | ENABLE_WRAP_AT_EOL_OUTPUT
135
+ | ENABLE_VIRTUAL_TERMINAL_PROCESSING
136
+ )
137
+ kernel32.SetConsoleMode(handle, new_mode)
138
+
139
+ # Reset stdin
140
+ STD_INPUT_HANDLE = -10
141
+ stdin_handle = kernel32.GetStdHandle(STD_INPUT_HANDLE)
142
+
143
+ # Console mode flags for stdin
144
+ ENABLE_LINE_INPUT = 0x0002
145
+ ENABLE_ECHO_INPUT = 0x0004
146
+ ENABLE_PROCESSED_INPUT = 0x0001
147
+
148
+ stdin_mode = ctypes.c_ulong()
149
+ kernel32.GetConsoleMode(stdin_handle, ctypes.byref(stdin_mode))
150
+
151
+ new_stdin_mode = (
152
+ stdin_mode.value
153
+ | ENABLE_LINE_INPUT
154
+ | ENABLE_ECHO_INPUT
155
+ | ENABLE_PROCESSED_INPUT
156
+ )
157
+ kernel32.SetConsoleMode(stdin_handle, new_stdin_mode)
158
+
159
+ except Exception:
160
+ pass # Silently ignore errors - best effort reset
161
+
162
+
163
+ def flush_windows_keyboard_buffer() -> None:
164
+ """Flush the Windows keyboard buffer.
165
+
166
+ Clears any pending keyboard input that could interfere with
167
+ subsequent input operations after an interrupt.
168
+ """
169
+ if platform.system() != "Windows":
170
+ return
171
+
172
+ try:
173
+ import msvcrt
174
+
175
+ while msvcrt.kbhit():
176
+ msvcrt.getch()
177
+ except Exception:
178
+ pass # Silently ignore errors - best effort flush
179
+
180
+
181
+ def reset_windows_terminal_full() -> None:
182
+ """Perform a full Windows terminal reset (ANSI + console mode + keyboard buffer).
183
+
184
+ Combines ANSI reset, console mode reset, and keyboard buffer flush
185
+ for complete terminal state restoration after interrupts.
186
+ """
187
+ if platform.system() != "Windows":
188
+ return
189
+
190
+ reset_windows_terminal_ansi()
191
+ reset_windows_console_mode()
192
+ flush_windows_keyboard_buffer()
193
+
194
+
195
+ def reset_unix_terminal() -> None:
196
+ """Reset Unix/Linux/macOS terminal to sane state.
197
+
198
+ Uses the `reset` command to restore terminal sanity.
199
+ Silently fails if the command isn't available.
200
+ """
201
+ if platform.system() == "Windows":
202
+ return
203
+
204
+ try:
205
+ subprocess.run(["reset"], check=True, capture_output=True)
206
+ except (subprocess.CalledProcessError, FileNotFoundError):
207
+ pass # Silently fail if reset command isn't available
208
+
209
+
210
+ def reset_terminal() -> None:
211
+ """Cross-platform terminal reset.
212
+
213
+ Automatically detects the platform and performs the appropriate
214
+ terminal reset operation.
215
+ """
216
+ if platform.system() == "Windows":
217
+ reset_windows_terminal_full()
218
+ else:
219
+ reset_unix_terminal()
220
+
221
+
222
+ def disable_windows_ctrl_c() -> bool:
223
+ """Disable Ctrl+C processing at the Windows console input level.
224
+
225
+ This removes ENABLE_PROCESSED_INPUT from stdin, which prevents
226
+ Ctrl+C from being interpreted as a signal at all. Instead, it
227
+ becomes just a regular character (^C) that gets ignored.
228
+
229
+ This is more reliable than SetConsoleCtrlHandler because it
230
+ prevents Ctrl+C from being processed before it reaches any handler.
231
+
232
+ Returns:
233
+ True if successfully disabled, False otherwise.
234
+ """
235
+ global _original_ctrl_handler
236
+
237
+ if platform.system() != "Windows":
238
+ return False
239
+
240
+ try:
241
+ import ctypes
242
+
243
+ kernel32 = ctypes.windll.kernel32
244
+
245
+ # Get stdin handle
246
+ STD_INPUT_HANDLE = -10
247
+ stdin_handle = kernel32.GetStdHandle(STD_INPUT_HANDLE)
248
+
249
+ # Get current console mode
250
+ mode = ctypes.c_ulong()
251
+ if not kernel32.GetConsoleMode(stdin_handle, ctypes.byref(mode)):
252
+ return False
253
+
254
+ # Save original mode for potential restoration
255
+ _original_ctrl_handler = mode.value
256
+
257
+ # Console mode flags
258
+ ENABLE_PROCESSED_INPUT = 0x0001 # This makes Ctrl+C generate signals
259
+
260
+ # Remove ENABLE_PROCESSED_INPUT to disable Ctrl+C signal generation
261
+ new_mode = mode.value & ~ENABLE_PROCESSED_INPUT
262
+
263
+ return bool(kernel32.SetConsoleMode(stdin_handle, new_mode))
264
+
265
+ except Exception:
266
+ return False
267
+
268
+
269
+ def enable_windows_ctrl_c() -> bool:
270
+ """Re-enable Ctrl+C at the Windows console level.
271
+
272
+ Restores the original console mode saved by disable_windows_ctrl_c().
273
+
274
+ Returns:
275
+ True if successfully re-enabled, False otherwise.
276
+ """
277
+ global _original_ctrl_handler
278
+
279
+ if platform.system() != "Windows":
280
+ return False
281
+
282
+ if _original_ctrl_handler is None:
283
+ return True # Nothing to restore
284
+
285
+ try:
286
+ import ctypes
287
+
288
+ kernel32 = ctypes.windll.kernel32
289
+
290
+ # Get stdin handle
291
+ STD_INPUT_HANDLE = -10
292
+ stdin_handle = kernel32.GetStdHandle(STD_INPUT_HANDLE)
293
+
294
+ # Restore original mode
295
+ if kernel32.SetConsoleMode(stdin_handle, _original_ctrl_handler):
296
+ _original_ctrl_handler = None
297
+ return True
298
+ return False
299
+
300
+ except Exception:
301
+ return False
302
+
303
+
304
+ # Flag to track if we should keep Ctrl+C disabled
305
+ _keep_ctrl_c_disabled: bool = False
306
+
307
+
308
+ def set_keep_ctrl_c_disabled(value: bool) -> None:
309
+ """Set whether Ctrl+C should be kept disabled.
310
+
311
+ When True, ensure_ctrl_c_disabled() will re-disable Ctrl+C
312
+ even if something else (like prompt_toolkit) re-enables it.
313
+ """
314
+ global _keep_ctrl_c_disabled
315
+ _keep_ctrl_c_disabled = value
316
+
317
+
318
+ def ensure_ctrl_c_disabled() -> bool:
319
+ """Ensure Ctrl+C is disabled if it should be.
320
+
321
+ Call this after operations that might restore console mode
322
+ (like prompt_toolkit input).
323
+
324
+ Returns:
325
+ True if Ctrl+C is now disabled (or wasn't needed), False on error.
326
+ """
327
+ if not _keep_ctrl_c_disabled:
328
+ return True
329
+
330
+ if platform.system() != "Windows":
331
+ return True
332
+
333
+ try:
334
+ import ctypes
335
+
336
+ kernel32 = ctypes.windll.kernel32
337
+
338
+ # Get stdin handle
339
+ STD_INPUT_HANDLE = -10
340
+ stdin_handle = kernel32.GetStdHandle(STD_INPUT_HANDLE)
341
+
342
+ # Get current console mode
343
+ mode = ctypes.c_ulong()
344
+ if not kernel32.GetConsoleMode(stdin_handle, ctypes.byref(mode)):
345
+ return False
346
+
347
+ # Console mode flags
348
+ ENABLE_PROCESSED_INPUT = 0x0001
349
+
350
+ # Check if Ctrl+C processing is enabled
351
+ if mode.value & ENABLE_PROCESSED_INPUT:
352
+ # Disable it
353
+ new_mode = mode.value & ~ENABLE_PROCESSED_INPUT
354
+ return bool(kernel32.SetConsoleMode(stdin_handle, new_mode))
355
+
356
+ return True # Already disabled
357
+
358
+ except Exception:
359
+ return False
360
+
361
+
362
+ def detect_truecolor_support() -> bool:
363
+ """Detect if the terminal supports truecolor (24-bit color).
364
+
365
+ Checks multiple indicators:
366
+ 1. COLORTERM environment variable (most reliable)
367
+ 2. TERM environment variable patterns
368
+ 3. Rich's Console color_system detection as fallback
369
+
370
+ Returns:
371
+ True if truecolor is supported, False otherwise.
372
+ """
373
+ # Check COLORTERM - this is the most reliable indicator
374
+ colorterm = os.environ.get("COLORTERM", "").lower()
375
+ if colorterm in ("truecolor", "24bit"):
376
+ return True
377
+
378
+ # Check TERM for known truecolor-capable terminals
379
+ term = os.environ.get("TERM", "").lower()
380
+ truecolor_terms = (
381
+ "xterm-direct",
382
+ "xterm-truecolor",
383
+ "iterm2",
384
+ "vte-256color", # Many modern terminals set this
385
+ )
386
+ if any(t in term for t in truecolor_terms):
387
+ return True
388
+
389
+ # Some terminals like iTerm2, Kitty, Alacritty set specific env vars
390
+ if os.environ.get("ITERM_SESSION_ID"):
391
+ return True
392
+ if os.environ.get("KITTY_WINDOW_ID"):
393
+ return True
394
+ if os.environ.get("ALACRITTY_SOCKET"):
395
+ return True
396
+ if os.environ.get("WT_SESSION"): # Windows Terminal
397
+ return True
398
+
399
+ # Use Rich's detection as a fallback
400
+ try:
401
+ from rich.console import Console
402
+
403
+ console = Console(force_terminal=True)
404
+ color_system = console.color_system
405
+ return color_system == "truecolor"
406
+ except Exception:
407
+ pass
408
+
409
+ return False
410
+
411
+
412
+ def print_truecolor_warning(console: Console | None = None) -> None:
413
+ """Print a big fat red warning if truecolor is not supported.
414
+
415
+ Args:
416
+ console: Optional Rich Console instance. If None, creates a new one.
417
+ """
418
+ if detect_truecolor_support():
419
+ return # All good, no warning needed
420
+
421
+ if console is None:
422
+ try:
423
+ from rich.console import Console
424
+
425
+ console = Console()
426
+ except ImportError:
427
+ # Rich not available, fall back to plain print
428
+ print("\n" + "=" * 70)
429
+ print("⚠️ WARNING: TERMINAL DOES NOT SUPPORT TRUECOLOR (24-BIT COLOR)")
430
+ print("=" * 70)
431
+ print("Code Puppy looks best with truecolor support.")
432
+ print("Consider using a modern terminal like:")
433
+ print(" • iTerm2 (macOS)")
434
+ print(" • Windows Terminal (Windows)")
435
+ print(" • Kitty, Alacritty, or any modern terminal emulator")
436
+ print("")
437
+ print("You can also try setting: export COLORTERM=truecolor")
438
+ print("")
439
+ print("Note: The built-in macOS Terminal.app does not support truecolor")
440
+ print("(Sequoia and earlier). You'll need a different terminal app.")
441
+ print("=" * 70 + "\n")
442
+ return
443
+
444
+ # Get detected color system for diagnostic info
445
+ color_system = console.color_system or "unknown"
446
+
447
+ # Build the warning box
448
+ warning_lines = [
449
+ "",
450
+ "[bold bright_red on red]" + "━" * 72 + "[/]",
451
+ "[bold bright_red on red]┃[/][bold bright_white on red]"
452
+ + " " * 70
453
+ + "[/][bold bright_red on red]┃[/]",
454
+ "[bold bright_red on red]┃[/][bold bright_white on red]"
455
+ " ⚠️ WARNING: TERMINAL DOES NOT SUPPORT TRUECOLOR (24-BIT COLOR) ⚠️ [/][bold bright_red on red]┃[/]",
456
+ "[bold bright_red on red]┃[/][bold bright_white on red]"
457
+ + " " * 70
458
+ + "[/][bold bright_red on red]┃[/]",
459
+ "[bold bright_red on red]" + "━" * 72 + "[/]",
460
+ "",
461
+ f"[yellow]Detected color system:[/] [bold]{color_system}[/]",
462
+ "",
463
+ "[bold white]Code Puppy uses rich colors and will look degraded without truecolor.[/]",
464
+ "",
465
+ "[cyan]Consider using a modern terminal emulator:[/]",
466
+ " [green]•[/] [bold]iTerm2[/] (macOS) - https://iterm2.com",
467
+ " [green]•[/] [bold]Windows Terminal[/] (Windows) - Built into Windows 11",
468
+ " [green]•[/] [bold]Kitty[/] - https://sw.kovidgoyal.net/kitty",
469
+ " [green]•[/] [bold]Alacritty[/] - https://alacritty.org",
470
+ " [green]•[/] [bold]Warp[/] (macOS) - https://warp.dev",
471
+ "",
472
+ "[cyan]Or try setting the COLORTERM environment variable:[/]",
473
+ " [dim]export COLORTERM=truecolor[/]",
474
+ "",
475
+ "[dim italic]Note: The built-in macOS Terminal.app does not support truecolor (Sequoia and earlier).[/]",
476
+ "[dim italic]Setting COLORTERM=truecolor won't help - you'll need a different terminal app.[/]",
477
+ "",
478
+ "[bold bright_red]" + "─" * 72 + "[/]",
479
+ "",
480
+ ]
481
+
482
+ for line in warning_lines:
483
+ console.print(line)