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,39 @@
1
+ """Autonomous Memory Pipeline plugin.
2
+
3
+ Infrastructure for scanning past sessions, extracting knowledge,
4
+ consolidating memories, and injecting them into prompts.
5
+ """
6
+
7
+ from .consolidation import consolidate_memories, write_memory_files
8
+ from .extraction import ExtractionResult, extract_session_knowledge
9
+ from .lease_lock import LeaseHandle, acquire_memory_lease, release_lease
10
+ from .memory_injection import inject_into_system_prompt, load_memory_injection
11
+ from .secret_scanner import SCAN_PATTERNS, SecretMatch, scan_for_secrets
12
+ from .session_scanner import (
13
+ SessionInfo,
14
+ get_memory_dir,
15
+ get_sessions_dir,
16
+ mark_session_processed,
17
+ scan_eligible_sessions,
18
+ )
19
+
20
+ __all__ = [
21
+ "acquire_memory_lease",
22
+ "consolidate_memories",
23
+ "extract_session_knowledge",
24
+ "get_memory_dir",
25
+ "get_sessions_dir",
26
+ "inject_into_system_prompt",
27
+ "lease_lock",
28
+ "load_memory_injection",
29
+ "mark_session_processed",
30
+ "release_lease",
31
+ "scan_eligible_sessions",
32
+ "scan_for_secrets",
33
+ "write_memory_files",
34
+ "ExtractionResult",
35
+ "LeaseHandle",
36
+ "SCAN_PATTERNS",
37
+ "SecretMatch",
38
+ "SessionInfo",
39
+ ]
@@ -0,0 +1,291 @@
1
+ # cython: language_level=3
2
+ """BM25 relevance scorer for memory extraction.
3
+
4
+ Cythonized implementation — uses int ID vocabulary and typed loops
5
+ for performance. No external dependencies.
6
+ """
7
+
8
+ import array
9
+ import math
10
+ import re
11
+
12
+
13
+ cdef class BM25Scorer:
14
+ """BM25 relevance scoring for text chunks.
15
+
16
+ Cythonized version: term lookups use int IDs via a vocabulary
17
+ built during ``fit()``, and the inner scoring loop uses Cython
18
+ type declarations for the math steps.
19
+ """
20
+
21
+ cdef public double k1
22
+ cdef public double b
23
+ cdef public double epsilon
24
+ cdef int _doc_count
25
+ cdef double _avgdl
26
+ cdef list _idf
27
+ cdef dict _vocabulary
28
+ cdef list _corpus_tfs
29
+ cdef list _corpus_docs
30
+ cdef list _corpus_lens
31
+
32
+ def __init__(
33
+ self,
34
+ double k1=1.5,
35
+ double b=0.75,
36
+ double epsilon=0.25,
37
+ ):
38
+ self.k1 = k1
39
+ self.b = b
40
+ self.epsilon = epsilon
41
+ self._doc_count = 0
42
+ self._avgdl = 0.0
43
+ self._idf = None
44
+ self._vocabulary = {}
45
+ self._corpus_tfs = []
46
+ self._corpus_docs = []
47
+ self._corpus_lens = []
48
+
49
+ def fit(self, documents):
50
+ """Compute corpus statistics for IDF calculation.
51
+
52
+ Args:
53
+ documents: Full document collection (all chunks across all sessions).
54
+ """
55
+ self._doc_count = len(documents)
56
+ tokenized = [self._tokenize(doc) for doc in documents]
57
+ self._avgdl = sum(len(tokens) for tokens in tokenized) / max(self._doc_count, 1)
58
+
59
+ # Build vocabulary: str -> int
60
+ cdef dict vocab = {}
61
+ cdef int vocab_idx = 0
62
+ cdef list doc_tokens
63
+ cdef str token
64
+ for doc_tokens in tokenized:
65
+ for token in doc_tokens:
66
+ if token not in vocab:
67
+ vocab[token] = vocab_idx
68
+ vocab_idx += 1
69
+ self._vocabulary = vocab
70
+ cdef int vocab_size = vocab_idx
71
+
72
+ # Document frequency per term ID
73
+ cdef list df = [0] * vocab_size
74
+ cdef set seen
75
+ for doc_tokens in tokenized:
76
+ seen = set(doc_tokens)
77
+ for token in seen:
78
+ df[vocab[token]] += 1
79
+
80
+ # IDF array indexed by term ID
81
+ cdef list idf = [0.0] * vocab_size
82
+ cdef int freq
83
+ cdef double idf_val
84
+ cdef int i
85
+ cdef int N = self._doc_count
86
+ cdef double eps = self.epsilon
87
+ for i in range(vocab_size):
88
+ freq = df[i]
89
+ idf_val = math.log((N - freq + 0.5) / (freq + 0.5) + 1.0)
90
+ if idf_val < eps:
91
+ idf_val = eps
92
+ idf[i] = idf_val
93
+ self._idf = idf
94
+
95
+ # Pre-build dense tf arrays for corpus documents
96
+ cdef list corpus_tfs = []
97
+ cdef object tf
98
+ cdef int term_id
99
+ for doc_tokens in tokenized:
100
+ tf = array.array('i', [0]) * vocab_size
101
+ for token in doc_tokens:
102
+ term_id = vocab[token]
103
+ tf[term_id] = tf[term_id] + 1
104
+ corpus_tfs.append(tf)
105
+ self._corpus_tfs = corpus_tfs
106
+ self._corpus_docs = list(documents)
107
+ self._corpus_lens = [len(doc_tokens) for doc_tokens in tokenized]
108
+
109
+ def score(self, query, document):
110
+ """Score a single document against a query.
111
+
112
+ Args:
113
+ query: The query/project context string.
114
+ document: The document/chunk to score.
115
+
116
+ Returns:
117
+ BM25 score (higher = more relevant).
118
+ """
119
+ if self._idf is None:
120
+ raise RuntimeError("Scorer not fitted. Call fit() first.")
121
+
122
+ cdef list query_tokens = self._tokenize(query)
123
+ cdef list doc_tokens = self._tokenize(document)
124
+ cdef int doc_len = len(doc_tokens)
125
+
126
+ # Build sparse tf dict using int IDs
127
+ cdef dict tf_dict = {}
128
+ cdef str token
129
+ cdef int term_id
130
+ cdef dict vocab = self._vocabulary
131
+ for token in doc_tokens:
132
+ term_id = vocab.get(token, -1)
133
+ if term_id != -1:
134
+ if term_id in tf_dict:
135
+ tf_dict[term_id] = tf_dict[term_id] + 1
136
+ else:
137
+ tf_dict[term_id] = 1
138
+
139
+ cdef double score = 0.0
140
+ cdef double idf
141
+ cdef int term_tf
142
+ cdef double numerator, denominator
143
+ cdef double k1 = self.k1
144
+ cdef double b = self.b
145
+ cdef double avgdl = self._avgdl
146
+ cdef double epsilon = self.epsilon
147
+ cdef list idf_arr = self._idf
148
+
149
+ for token in query_tokens:
150
+ term_id = vocab.get(token, -1)
151
+ if term_id == -1:
152
+ continue
153
+ idf = idf_arr[term_id]
154
+ term_tf = tf_dict.get(term_id, 0)
155
+ if term_tf == 0:
156
+ continue
157
+ numerator = term_tf * (k1 + 1.0)
158
+ denominator = term_tf + k1 * (1.0 - b + b * doc_len / avgdl)
159
+ score += idf * numerator / denominator
160
+
161
+ return score
162
+
163
+ def score_batch(self, query, documents):
164
+ """Score multiple documents against a query.
165
+
166
+ Args:
167
+ query: The query/project context.
168
+ documents: List of document strings.
169
+
170
+ Returns:
171
+ List of scores, one per document.
172
+ """
173
+ cdef list results = []
174
+ cdef str doc
175
+ cdef dict corpus_lookup = {}
176
+ cdef int i
177
+ cdef int n_corpus = len(self._corpus_docs)
178
+ cdef list query_tokens
179
+ cdef object tf
180
+ cdef int doc_len
181
+ cdef double score
182
+ cdef double idf
183
+ cdef int term_tf
184
+ cdef double numerator, denominator
185
+ cdef double k1 = self.k1
186
+ cdef double b = self.b
187
+ cdef double avgdl = self._avgdl
188
+ cdef double epsilon = self.epsilon
189
+ cdef list idf_arr = self._idf
190
+ cdef dict vocab = self._vocabulary
191
+ cdef str token
192
+ cdef int term_id
193
+
194
+ for i in range(n_corpus):
195
+ corpus_lookup[self._corpus_docs[i]] = i
196
+
197
+ cdef int idx
198
+ for doc in documents:
199
+ idx = corpus_lookup.get(doc, -1)
200
+ if idx != -1:
201
+ # Fast path: reuse pre-built tf array from fit()
202
+ query_tokens = self._tokenize(query)
203
+ tf = self._corpus_tfs[idx]
204
+ doc_len = self._corpus_lens[idx]
205
+ score = 0.0
206
+ for token in query_tokens:
207
+ term_id = vocab.get(token, -1)
208
+ if term_id == -1:
209
+ continue
210
+ idf = idf_arr[term_id]
211
+ term_tf = tf[term_id]
212
+ if term_tf == 0:
213
+ continue
214
+ numerator = term_tf * (k1 + 1.0)
215
+ denominator = term_tf + k1 * (1.0 - b + b * doc_len / avgdl)
216
+ score += idf * numerator / denominator
217
+ results.append(score)
218
+ else:
219
+ results.append(self.score(query, doc))
220
+ return results
221
+
222
+ @staticmethod
223
+ def _tokenize(text):
224
+ """Simple tokenization: lowercase, split on whitespace + punctuation.
225
+
226
+ Keeps tokens >= 2 characters to filter noise.
227
+ """
228
+ text = text.lower()
229
+ tokens = re.findall(r"[a-z0-9]{2,}", text)
230
+ return tokens
231
+
232
+
233
+ def select_top_chunks(
234
+ chunks,
235
+ scores,
236
+ threshold=None,
237
+ top_n=None,
238
+ min_keep=3,
239
+ ):
240
+ """Select the most relevant chunks.
241
+
242
+ Args:
243
+ chunks: List of text chunks.
244
+ scores: Corresponding relevance scores.
245
+ threshold: Minimum score to include (absolute). If None, uses top_n.
246
+ top_n: Number of top chunks to keep. If None, uses threshold.
247
+ min_keep: Always keep at least this many chunks (prevents empty results).
248
+
249
+ Returns:
250
+ Selected chunks in original order.
251
+ """
252
+ if not chunks:
253
+ return []
254
+
255
+ # Pair chunks with scores and original indices
256
+ indexed = list(enumerate(zip(chunks, scores)))
257
+
258
+ if threshold is not None:
259
+ # Filter by threshold
260
+ kept = [(i, (c, s)) for i, (c, s) in indexed if s >= threshold]
261
+ if len(kept) < min_keep:
262
+ # Ensure minimum kept: take top by score
263
+ sorted_by_score = sorted(indexed, key=lambda x: x[1][1], reverse=True)
264
+ kept = sorted_by_score[:max(min_keep, min(len(chunks), min_keep))]
265
+ elif top_n is not None:
266
+ sorted_by_score = sorted(indexed, key=lambda x: x[1][1], reverse=True)
267
+ kept = sorted_by_score[:max(top_n, min_keep)]
268
+ else:
269
+ # Default: keep top 30% or at least min_keep
270
+ n = max(min_keep, len(chunks) // 3)
271
+ sorted_by_score = sorted(indexed, key=lambda x: x[1][1], reverse=True)
272
+ kept = sorted_by_score[:n]
273
+
274
+ # Return in original order
275
+ kept_sorted = sorted(kept, key=lambda x: x[0])
276
+ return [chunk for _, (chunk, _) in kept_sorted]
277
+
278
+
279
+ def score_chunks_against_context(
280
+ chunks,
281
+ context,
282
+ double k1=1.5,
283
+ double b=0.75,
284
+ ):
285
+ """Convenience: fit scorer on chunks, score them against context.
286
+
287
+ Uses chunks as the document corpus and context as the query.
288
+ """
289
+ scorer = BM25Scorer(k1=k1, b=b)
290
+ scorer.fit(chunks)
291
+ return scorer.score_batch(context, chunks)
@@ -0,0 +1,82 @@
1
+ """Stub consolidation engine for the Autonomous Memory Pipeline.
2
+
3
+ Combines per-session extractions into a project-level markdown memory file.
4
+ Future iterations will drive this via a consolidation LLM agent.
5
+ """
6
+
7
+ import logging
8
+ from pathlib import Path
9
+
10
+ from .extraction import ExtractionResult
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+
15
+ def consolidate_memories(extractions: list[ExtractionResult], project_dir: Path) -> str:
16
+ """Combine extraction results into a single markdown document.
17
+
18
+ This is a stub: it simply concatenates raw memory blocks with simple
19
+ deduplication. A future consolidation agent will synthesise these into
20
+ coherent project knowledge.
21
+ """
22
+ if not extractions:
23
+ return "# Project Memory\n\nNo sessions extracted yet.\n"
24
+
25
+ lines: list[str] = [
26
+ "# Project Memory",
27
+ "",
28
+ f"Generated from {len(extractions)} sessions.",
29
+ "",
30
+ ]
31
+
32
+ seen: set[str] = set()
33
+ for ex in extractions:
34
+ block = ex.raw_memory.strip()
35
+ if block in seen:
36
+ continue
37
+ seen.add(block)
38
+ lines.append(f"### {ex.session_path}")
39
+ lines.append(f"*Synopsis: {ex.synopsis}*")
40
+ lines.append(f"*Extracted at: {ex.extracted_at}*")
41
+ lines.append("")
42
+ lines.append(block)
43
+ lines.append("")
44
+
45
+ return "\n".join(lines)
46
+
47
+
48
+ def write_memory_files(consolidated_md: str, memory_dir: Path) -> tuple[Path, Path]:
49
+ """Write the consolidated memory and a truncated summary to disk.
50
+
51
+ Returns ``(memory_path, summary_path)``.
52
+ """
53
+ memory_dir.mkdir(parents=True, exist_ok=True)
54
+
55
+ memory_path = memory_dir / "MEMORY.md"
56
+ summary_path = memory_dir / "memory_summary.md"
57
+
58
+ memory_path.write_text(consolidated_md, encoding="utf-8")
59
+
60
+ summary = _truncate_to_words(consolidated_md, max_words=500)
61
+ summary_path.write_text(summary, encoding="utf-8")
62
+
63
+ logger.info(f"Wrote memory files to {memory_dir}")
64
+ return memory_path, summary_path
65
+
66
+
67
+ def _truncate_to_words(text: str, max_words: int = 500) -> str:
68
+ """Truncate markdown to approximately ``max_words`` words.
69
+
70
+ Tries to end on a paragraph boundary for readability.
71
+ """
72
+ words = text.split()
73
+ if len(words) <= max_words:
74
+ return text
75
+
76
+ # Truncate to max_words, then try to find the nearest paragraph break
77
+ truncated = " ".join(words[:max_words])
78
+ last_break = truncated.rfind("\n\n")
79
+ if last_break > max_words * 0.5:
80
+ truncated = truncated[:last_break]
81
+
82
+ return truncated.strip() + "\n\n*(truncated)*\n"