alysis-code 0.13.0__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 (458) hide show
  1. alysis_code/__init__.py +3 -0
  2. alysis_code/__main__.py +4 -0
  3. alysis_code/_build_info.py +14 -0
  4. alysis_code/account_login.py +468 -0
  5. alysis_code/agent/README.md +35 -0
  6. alysis_code/agent/__init__.py +11 -0
  7. alysis_code/agent/acceptance_contract.py +2217 -0
  8. alysis_code/agent/blast_radius.py +1403 -0
  9. alysis_code/agent/cache_keepalive.py +227 -0
  10. alysis_code/agent/completion_certificate.py +366 -0
  11. alysis_code/agent/completion_gate.py +306 -0
  12. alysis_code/agent/empty_response_stall.py +403 -0
  13. alysis_code/agent/errors.py +28 -0
  14. alysis_code/agent/llm_calls.py +475 -0
  15. alysis_code/agent/mutation_classification.py +227 -0
  16. alysis_code/agent/prompt_context.py +2508 -0
  17. alysis_code/agent/read_ledger.py +253 -0
  18. alysis_code/agent/regression_baseline.py +642 -0
  19. alysis_code/agent/reproduction_first.py +610 -0
  20. alysis_code/agent/sensitive_output.py +629 -0
  21. alysis_code/agent/session.py +3218 -0
  22. alysis_code/agent/steering.py +191 -0
  23. alysis_code/agent/subagent_execution.py +5177 -0
  24. alysis_code/agent/subagent_workspace.py +666 -0
  25. alysis_code/agent/tools_assembly.py +4728 -0
  26. alysis_code/agent/turn/__init__.py +101 -0
  27. alysis_code/agent/turn/core.py +8483 -0
  28. alysis_code/agent/turn/events.py +113 -0
  29. alysis_code/agent/turn/exploration.py +590 -0
  30. alysis_code/agent/turn/interventions.py +65 -0
  31. alysis_code/agent/turn/read_cache.py +420 -0
  32. alysis_code/agent/turn/snapshot.py +179 -0
  33. alysis_code/agent/turn_contract.py +661 -0
  34. alysis_code/agent/turn_path.py +129 -0
  35. alysis_code/agent/verification.py +2885 -0
  36. alysis_code/agent/verification_commands.py +512 -0
  37. alysis_code/agent/verification_evidence.py +738 -0
  38. alysis_code/agent_loop.py +693 -0
  39. alysis_code/agent_runtimes/__init__.py +51 -0
  40. alysis_code/agent_runtimes/base.py +114 -0
  41. alysis_code/agent_runtimes/builtins.py +129 -0
  42. alysis_code/agent_runtimes/codex_cli.py +664 -0
  43. alysis_code/agent_runtimes/host.py +263 -0
  44. alysis_code/agent_runtimes/registry.py +64 -0
  45. alysis_code/agent_runtimes/service.py +150 -0
  46. alysis_code/agentbox_client.py +416 -0
  47. alysis_code/agentbox_integration.py +310 -0
  48. alysis_code/alysis_cloud.py +152 -0
  49. alysis_code/approval_scope.py +276 -0
  50. alysis_code/assets/README.md +33 -0
  51. alysis_code/assets/__init__.py +126 -0
  52. alysis_code/assets/asset_read_core.py +281 -0
  53. alysis_code/assets/budget_allocator.py +456 -0
  54. alysis_code/assets/comprehender.py +759 -0
  55. alysis_code/assets/index.py +654 -0
  56. alysis_code/assets/ingestion.py +275 -0
  57. alysis_code/assets/legacy_migration.py +413 -0
  58. alysis_code/assets/models.py +263 -0
  59. alysis_code/assets/ocr.py +239 -0
  60. alysis_code/assets/owl/ascii/f-000.txt +13 -0
  61. alysis_code/assets/owl/ascii/f-001.txt +13 -0
  62. alysis_code/assets/owl/ascii/f-002.txt +13 -0
  63. alysis_code/assets/owl/ascii/f-003.txt +13 -0
  64. alysis_code/assets/owl/ascii/f-004.txt +13 -0
  65. alysis_code/assets/owl/ascii/f-005.txt +13 -0
  66. alysis_code/assets/owl/ascii/f-006.txt +13 -0
  67. alysis_code/assets/owl/ascii/f-007.txt +13 -0
  68. alysis_code/assets/owl/ascii/f-008.txt +13 -0
  69. alysis_code/assets/owl/ascii/f-009.txt +13 -0
  70. alysis_code/assets/owl/ascii/f-010.txt +13 -0
  71. alysis_code/assets/owl/ascii/f-011.txt +13 -0
  72. alysis_code/assets/owl/ascii/f-012.txt +13 -0
  73. alysis_code/assets/owl/ascii/f-013.txt +13 -0
  74. alysis_code/assets/owl/ascii/f-014.txt +13 -0
  75. alysis_code/assets/owl/ascii/f-015.txt +13 -0
  76. alysis_code/assets/owl/ascii/f-016.txt +13 -0
  77. alysis_code/assets/owl/ascii/f-017.txt +13 -0
  78. alysis_code/assets/owl/ascii/f-018.txt +13 -0
  79. alysis_code/assets/owl/ascii/f-019.txt +13 -0
  80. alysis_code/assets/owl/ascii/f-020.txt +13 -0
  81. alysis_code/assets/owl/index.html +98 -0
  82. alysis_code/assets/owl/show-owl.sh +761 -0
  83. alysis_code/assets/paths.py +49 -0
  84. alysis_code/assets/plan_binding.py +326 -0
  85. alysis_code/assets/planner_context.py +466 -0
  86. alysis_code/assets/planner_tools.py +184 -0
  87. alysis_code/assets/prompts.py +101 -0
  88. alysis_code/assets/replanner_context.py +239 -0
  89. alysis_code/assets/surface.py +521 -0
  90. alysis_code/assets/untrusted_content.py +48 -0
  91. alysis_code/assets/usage_logger.py +94 -0
  92. alysis_code/assets/worker_mirror.py +428 -0
  93. alysis_code/assets/worker_section.py +303 -0
  94. alysis_code/assets/worker_tools.py +468 -0
  95. alysis_code/atomic_io.py +83 -0
  96. alysis_code/auth_diagnostics.py +272 -0
  97. alysis_code/background_runner.py +366 -0
  98. alysis_code/branding.py +270 -0
  99. alysis_code/budget_policy.py +390 -0
  100. alysis_code/build_identity.py +465 -0
  101. alysis_code/builtin_hooks/__init__.py +7 -0
  102. alysis_code/builtin_hooks/notify_done_windows.py +65 -0
  103. alysis_code/bwrap_etc.py +76 -0
  104. alysis_code/cancellation.py +41 -0
  105. alysis_code/capabilities.py +137 -0
  106. alysis_code/chatgpt_codex_static_provider.py +133 -0
  107. alysis_code/cli.py +51 -0
  108. alysis_code/cli_impl/__init__.py +1 -0
  109. alysis_code/cli_impl/assets_cli.py +537 -0
  110. alysis_code/cli_impl/assets_modal.py +412 -0
  111. alysis_code/cli_impl/chat/__init__.py +156 -0
  112. alysis_code/cli_impl/chat/commands.py +2616 -0
  113. alysis_code/cli_impl/chat/loop.py +4508 -0
  114. alysis_code/cli_impl/chat/mid_turn_policy.py +125 -0
  115. alysis_code/cli_impl/chat/rendering.py +444 -0
  116. alysis_code/cli_impl/chat/state.py +124 -0
  117. alysis_code/cli_impl/chat_resume.py +830 -0
  118. alysis_code/cli_impl/chat_slash_completer.py +258 -0
  119. alysis_code/cli_impl/commands/__init__.py +11 -0
  120. alysis_code/cli_impl/commands/_shared.py +89 -0
  121. alysis_code/cli_impl/commands/auth.py +623 -0
  122. alysis_code/cli_impl/commands/chat_resume_helpers.py +1531 -0
  123. alysis_code/cli_impl/commands/chat_state.py +158 -0
  124. alysis_code/cli_impl/commands/chat_status.py +1248 -0
  125. alysis_code/cli_impl/commands/chat_terminal.py +942 -0
  126. alysis_code/cli_impl/commands/chat_tui_panels.py +1018 -0
  127. alysis_code/cli_impl/commands/cli_common.py +1223 -0
  128. alysis_code/cli_impl/commands/cli_surface.py +77 -0
  129. alysis_code/cli_impl/commands/config.py +131 -0
  130. alysis_code/cli_impl/commands/conventions.py +85 -0
  131. alysis_code/cli_impl/commands/execution_helpers.py +350 -0
  132. alysis_code/cli_impl/commands/extensions.py +401 -0
  133. alysis_code/cli_impl/commands/forge.py +1282 -0
  134. alysis_code/cli_impl/commands/forge_asset_view.py +121 -0
  135. alysis_code/cli_impl/commands/forge_helpers.py +1215 -0
  136. alysis_code/cli_impl/commands/hooks.py +737 -0
  137. alysis_code/cli_impl/commands/ide_bridge.py +31 -0
  138. alysis_code/cli_impl/commands/mcp.py +700 -0
  139. alysis_code/cli_impl/commands/profile.py +453 -0
  140. alysis_code/cli_impl/commands/prompt_helpers.py +307 -0
  141. alysis_code/cli_impl/commands/report.py +88 -0
  142. alysis_code/cli_impl/commands/root.py +1118 -0
  143. alysis_code/cli_impl/commands/sandbox.py +184 -0
  144. alysis_code/cli_impl/commands/server.py +54 -0
  145. alysis_code/cli_impl/commands/sessions.py +252 -0
  146. alysis_code/cli_impl/commands/skills.py +404 -0
  147. alysis_code/cli_impl/commands/startup.py +946 -0
  148. alysis_code/cli_impl/commands/tools.py +335 -0
  149. alysis_code/cli_impl/commands/update.py +364 -0
  150. alysis_code/cli_impl/commands/welcome.py +972 -0
  151. alysis_code/cli_impl/config_menu.py +3882 -0
  152. alysis_code/cli_impl/forge.py +4509 -0
  153. alysis_code/cli_impl/forge_recovery.py +485 -0
  154. alysis_code/cli_impl/setup_wizard.py +2409 -0
  155. alysis_code/cli_impl/tui/__init__.py +58 -0
  156. alysis_code/cli_impl/tui/app.py +4551 -0
  157. alysis_code/cli_impl/tui/config.py +32 -0
  158. alysis_code/cli_impl/tui/config_flow.py +2754 -0
  159. alysis_code/cli_impl/tui/config_overlay.py +566 -0
  160. alysis_code/cli_impl/tui/content.py +78 -0
  161. alysis_code/cli_impl/tui/footer.py +218 -0
  162. alysis_code/cli_impl/tui/forge_status.py +136 -0
  163. alysis_code/cli_impl/tui/markdown.py +244 -0
  164. alysis_code/cli_impl/tui/owl.py +109 -0
  165. alysis_code/cli_impl/tui/plan_meta.py +477 -0
  166. alysis_code/cli_impl/tui/setup_app.py +519 -0
  167. alysis_code/cli_impl/tui/setup_flow.py +1622 -0
  168. alysis_code/cli_impl/tui/state.py +101 -0
  169. alysis_code/cli_impl/tui/subagent_identity.py +66 -0
  170. alysis_code/cli_impl/tui/subagent_panel.py +186 -0
  171. alysis_code/cli_impl/tui/surface.py +796 -0
  172. alysis_code/cli_impl/tui/transcript.py +514 -0
  173. alysis_code/cli_impl/tui/update_prompt.py +79 -0
  174. alysis_code/cli_impl/tui/workspace_guard.py +384 -0
  175. alysis_code/clipboard.py +172 -0
  176. alysis_code/code_review.py +1211 -0
  177. alysis_code/compaction/__init__.py +28 -0
  178. alysis_code/compaction/conversation_compactor.py +2932 -0
  179. alysis_code/compaction/importance.py +177 -0
  180. alysis_code/compaction/settings.py +297 -0
  181. alysis_code/compaction/tool_output_offload.py +447 -0
  182. alysis_code/config.py +3509 -0
  183. alysis_code/conflict_auto_resolver.py +895 -0
  184. alysis_code/context/__init__.py +1 -0
  185. alysis_code/context/tool_schema_budgeter.py +220 -0
  186. alysis_code/crash_diagnostics.py +282 -0
  187. alysis_code/custom_tools/README.md +34 -0
  188. alysis_code/custom_tools/__init__.py +43 -0
  189. alysis_code/custom_tools/discovery.py +903 -0
  190. alysis_code/custom_tools/runtime.py +1516 -0
  191. alysis_code/custom_tools/session.py +227 -0
  192. alysis_code/custom_tools/trust.py +232 -0
  193. alysis_code/diff_paths.py +113 -0
  194. alysis_code/direction_change.py +293 -0
  195. alysis_code/dispatch_timing.py +306 -0
  196. alysis_code/durable_service_manager.py +1236 -0
  197. alysis_code/edit_discipline.py +659 -0
  198. alysis_code/error_text.py +73 -0
  199. alysis_code/execution_budget.py +411 -0
  200. alysis_code/execution_context.py +915 -0
  201. alysis_code/execution_deadline.py +1065 -0
  202. alysis_code/execution_shared.py +1904 -0
  203. alysis_code/extensions/README.md +30 -0
  204. alysis_code/extensions/__init__.py +93 -0
  205. alysis_code/extensions/activation.py +138 -0
  206. alysis_code/extensions/install.py +1436 -0
  207. alysis_code/extensions/manifest.py +487 -0
  208. alysis_code/extensions/models.py +74 -0
  209. alysis_code/extensions/paths.py +56 -0
  210. alysis_code/extensions/registry.json +4 -0
  211. alysis_code/extensions/registry.py +52 -0
  212. alysis_code/extensions/state.py +83 -0
  213. alysis_code/extensions/workspace_trust.py +101 -0
  214. alysis_code/failed_task_evidence.py +369 -0
  215. alysis_code/failure_category.py +315 -0
  216. alysis_code/feedback_report.py +1647 -0
  217. alysis_code/file_classification.py +485 -0
  218. alysis_code/forge.py +2064 -0
  219. alysis_code/forge_completion.py +362 -0
  220. alysis_code/forge_events.py +475 -0
  221. alysis_code/frontmatter_utils.py +95 -0
  222. alysis_code/git_evidence.py +1181 -0
  223. alysis_code/git_ops.py +560 -0
  224. alysis_code/git_safe.py +62 -0
  225. alysis_code/git_worktrees.py +190 -0
  226. alysis_code/hooks/README.md +33 -0
  227. alysis_code/hooks/__init__.py +67 -0
  228. alysis_code/hooks/audit.py +171 -0
  229. alysis_code/hooks/config.py +225 -0
  230. alysis_code/hooks/dispatcher.py +1110 -0
  231. alysis_code/hooks/models.py +447 -0
  232. alysis_code/hooks/trust.py +202 -0
  233. alysis_code/host_actions.py +543 -0
  234. alysis_code/host_browser.py +103 -0
  235. alysis_code/ide/__init__.py +5 -0
  236. alysis_code/ide/activity_events.py +399 -0
  237. alysis_code/ide/approvals.py +337 -0
  238. alysis_code/ide/artifacts.py +153 -0
  239. alysis_code/ide/browser_egress_proxy.py +1076 -0
  240. alysis_code/ide/cdp_websocket_transport.py +1192 -0
  241. alysis_code/ide/change_ledger.py +1721 -0
  242. alysis_code/ide/context_blocks.py +979 -0
  243. alysis_code/ide/event_stream.py +531 -0
  244. alysis_code/ide/forge_protocol.py +3112 -0
  245. alysis_code/ide/forge_request_ledger.py +737 -0
  246. alysis_code/ide/health.py +965 -0
  247. alysis_code/ide/managed_browser.py +2251 -0
  248. alysis_code/ide/management_protocol.py +3414 -0
  249. alysis_code/ide/mcp_oauth_coordinator.py +744 -0
  250. alysis_code/ide/mcp_oauth_lifecycle.py +1504 -0
  251. alysis_code/ide/prompt_queue.py +1070 -0
  252. alysis_code/ide/protocol.py +191 -0
  253. alysis_code/ide/resumable_swarm.py +1543 -0
  254. alysis_code/ide/session_search.py +295 -0
  255. alysis_code/ide/stdio_bridge.py +9935 -0
  256. alysis_code/ide/structured_state.py +1579 -0
  257. alysis_code/ide/swarm_protocol.py +816 -0
  258. alysis_code/integration_gate.py +506 -0
  259. alysis_code/interactive_input_guard.py +39 -0
  260. alysis_code/interactive_plan_mode.py +26 -0
  261. alysis_code/internal_artifacts.py +179 -0
  262. alysis_code/knowledge_base.py +1409 -0
  263. alysis_code/knowledge_capture.py +1190 -0
  264. alysis_code/knowledge_librarian.py +605 -0
  265. alysis_code/language_policy.py +34 -0
  266. alysis_code/litellm_static_provider.py +535 -0
  267. alysis_code/llm/__init__.py +1 -0
  268. alysis_code/llm/anthropic_messages.py +2288 -0
  269. alysis_code/llm/base.py +71 -0
  270. alysis_code/llm/cache_capabilities.py +985 -0
  271. alysis_code/llm/cache_control_blocks.py +244 -0
  272. alysis_code/llm/cache_policy.py +388 -0
  273. alysis_code/llm/factory.py +373 -0
  274. alysis_code/llm/gemini_generate_content.py +2652 -0
  275. alysis_code/llm/gemini_interactions.py +739 -0
  276. alysis_code/llm/metadata.py +450 -0
  277. alysis_code/llm/openai_compat.py +2947 -0
  278. alysis_code/llm/openai_responses.py +2604 -0
  279. alysis_code/llm/protocols.py +609 -0
  280. alysis_code/llm/provider_limits.py +525 -0
  281. alysis_code/llm/request_plan.py +389 -0
  282. alysis_code/llm/request_shape.py +238 -0
  283. alysis_code/llm/streaming.py +108 -0
  284. alysis_code/llm/temperature_compat.py +78 -0
  285. alysis_code/llm/types.py +195 -0
  286. alysis_code/llm/usage_normalization.py +222 -0
  287. alysis_code/llm_error_display.py +315 -0
  288. alysis_code/logging_redaction.py +326 -0
  289. alysis_code/managed_host_deadline.py +196 -0
  290. alysis_code/mcp/README.md +33 -0
  291. alysis_code/mcp/__init__.py +24 -0
  292. alysis_code/mcp/client.py +1137 -0
  293. alysis_code/mcp/config.py +597 -0
  294. alysis_code/mcp/errors.py +113 -0
  295. alysis_code/mcp/forge_scope.py +154 -0
  296. alysis_code/mcp/jsonrpc.py +214 -0
  297. alysis_code/mcp/manager.py +2308 -0
  298. alysis_code/mcp/models.py +666 -0
  299. alysis_code/mcp/oauth.py +972 -0
  300. alysis_code/mcp/oauth_runtime.py +310 -0
  301. alysis_code/mcp/oauth_store.py +276 -0
  302. alysis_code/mcp/prompts.py +329 -0
  303. alysis_code/mcp/resources.py +295 -0
  304. alysis_code/mcp/roots.py +106 -0
  305. alysis_code/mcp/server_requests.py +75 -0
  306. alysis_code/mcp/token_store.py +859 -0
  307. alysis_code/mcp/transport_http.py +1338 -0
  308. alysis_code/mcp/transport_stdio.py +1267 -0
  309. alysis_code/mcp/untrusted_content.py +119 -0
  310. alysis_code/merge_conflict_reviewer.py +729 -0
  311. alysis_code/model_catalog/__init__.py +1 -0
  312. alysis_code/model_catalog/chatgpt_codex_subscription_snapshot.json +186 -0
  313. alysis_code/model_catalog/litellm_model_prices_snapshot.json +44715 -0
  314. alysis_code/model_catalog/litellm_model_prices_snapshot.meta.json +17 -0
  315. alysis_code/model_metadata_policy.py +223 -0
  316. alysis_code/model_metadata_utils.py +103 -0
  317. alysis_code/model_registry.py +1420 -0
  318. alysis_code/model_router.py +147 -0
  319. alysis_code/permission_policy.py +1016 -0
  320. alysis_code/personas.py +451 -0
  321. alysis_code/pipeline_facts.py +233 -0
  322. alysis_code/plan_assistant.py +4763 -0
  323. alysis_code/plan_mode.py +393 -0
  324. alysis_code/plan_reconciliation.py +1228 -0
  325. alysis_code/plan_repair.py +652 -0
  326. alysis_code/plan_validation.py +1099 -0
  327. alysis_code/planning_constraints.py +904 -0
  328. alysis_code/policy.py +95 -0
  329. alysis_code/preview_server.py +457 -0
  330. alysis_code/process_reaping.py +566 -0
  331. alysis_code/profile_presets.py +1834 -0
  332. alysis_code/profiles.py +666 -0
  333. alysis_code/provider_auth/__init__.py +29 -0
  334. alysis_code/provider_auth/base.py +99 -0
  335. alysis_code/provider_auth/openai_codex.py +951 -0
  336. alysis_code/provider_auth/registry.py +76 -0
  337. alysis_code/provider_auth/store.py +125 -0
  338. alysis_code/provider_diagnostics.py +1209 -0
  339. alysis_code/provider_model_catalog.py +685 -0
  340. alysis_code/provider_telemetry.py +1699 -0
  341. alysis_code/provider_url.py +75 -0
  342. alysis_code/reasoning_contracts.py +911 -0
  343. alysis_code/remote_sync.py +350 -0
  344. alysis_code/replanning.py +1195 -0
  345. alysis_code/repo_scan.py +1152 -0
  346. alysis_code/request_estimation.py +296 -0
  347. alysis_code/review_gate.py +617 -0
  348. alysis_code/run_lock.py +1141 -0
  349. alysis_code/run_outcome.py +58 -0
  350. alysis_code/run_provenance.py +774 -0
  351. alysis_code/run_state.py +445 -0
  352. alysis_code/runtime_artifacts.py +116 -0
  353. alysis_code/runtime_context_features.py +78 -0
  354. alysis_code/runtime_kind.py +52 -0
  355. alysis_code/safety/__init__.py +11 -0
  356. alysis_code/safety/mcp_sanitize.py +29 -0
  357. alysis_code/safety/safe_http.py +297 -0
  358. alysis_code/safety/subagent_report.py +184 -0
  359. alysis_code/sandbox_doctor.py +682 -0
  360. alysis_code/sandbox_runner.py +1025 -0
  361. alysis_code/sandbox_settings.py +423 -0
  362. alysis_code/serialized_paths.py +355 -0
  363. alysis_code/server/__init__.py +3 -0
  364. alysis_code/server/app.py +367 -0
  365. alysis_code/server/auth.py +34 -0
  366. alysis_code/server/job_config.py +30 -0
  367. alysis_code/server/settings.py +215 -0
  368. alysis_code/server/store.py +193 -0
  369. alysis_code/server/worker_runner.py +657 -0
  370. alysis_code/service_persistence.py +355 -0
  371. alysis_code/session_artifacts.py +108 -0
  372. alysis_code/session_metrics.py +331 -0
  373. alysis_code/session_store.py +624 -0
  374. alysis_code/skills/README.md +34 -0
  375. alysis_code/skills/__init__.py +104 -0
  376. alysis_code/skills/conventions.py +84 -0
  377. alysis_code/skills/discovery.py +176 -0
  378. alysis_code/skills/eval_models.py +232 -0
  379. alysis_code/skills/eval_runner.py +372 -0
  380. alysis_code/skills/evals.py +1344 -0
  381. alysis_code/skills/install.py +293 -0
  382. alysis_code/skills/loader.py +118 -0
  383. alysis_code/skills/matching.py +103 -0
  384. alysis_code/skills/models.py +71 -0
  385. alysis_code/skills/paths.py +56 -0
  386. alysis_code/skills/prompting.py +500 -0
  387. alysis_code/skills/scaffold.py +142 -0
  388. alysis_code/skills/state.py +441 -0
  389. alysis_code/skills/transactions.py +125 -0
  390. alysis_code/skills/validation.py +304 -0
  391. alysis_code/step_budget.py +238 -0
  392. alysis_code/subagent_labels.py +49 -0
  393. alysis_code/subagents.py +1072 -0
  394. alysis_code/surface/__init__.py +80 -0
  395. alysis_code/surface/base.py +305 -0
  396. alysis_code/surface/console.py +387 -0
  397. alysis_code/surface/events.py +372 -0
  398. alysis_code/surface/hidden_surface.py +529 -0
  399. alysis_code/surface/noop_surface.py +219 -0
  400. alysis_code/surface/rich_surface.py +1555 -0
  401. alysis_code/surface/styles.py +67 -0
  402. alysis_code/surface/theme.py +455 -0
  403. alysis_code/surface/types.py +100 -0
  404. alysis_code/swarm_backend.py +926 -0
  405. alysis_code/swarm_orchestrator.py +4020 -0
  406. alysis_code/swarm_scheduler.py +441 -0
  407. alysis_code/swarm_trace.py +429 -0
  408. alysis_code/swarm_worker.py +2119 -0
  409. alysis_code/swarm_write_guard.py +348 -0
  410. alysis_code/task_dependencies.py +170 -0
  411. alysis_code/task_readiness.py +992 -0
  412. alysis_code/task_scope.py +2148 -0
  413. alysis_code/terminal_manager.py +762 -0
  414. alysis_code/terminal_ownership.py +460 -0
  415. alysis_code/text_normalization.py +30 -0
  416. alysis_code/token_budget.py +97 -0
  417. alysis_code/tools/README.md +34 -0
  418. alysis_code/tools/__init__.py +1 -0
  419. alysis_code/tools/artifacts.py +127 -0
  420. alysis_code/tools/availability.py +188 -0
  421. alysis_code/tools/fs.py +1456 -0
  422. alysis_code/tools/git.py +461 -0
  423. alysis_code/tools/history.py +229 -0
  424. alysis_code/tools/http_timeout.py +78 -0
  425. alysis_code/tools/image_generation.py +552 -0
  426. alysis_code/tools/registry.py +2936 -0
  427. alysis_code/tools/repo_map.py +476 -0
  428. alysis_code/tools/search.py +563 -0
  429. alysis_code/tools/shell.py +135 -0
  430. alysis_code/tools/symbols.py +1350 -0
  431. alysis_code/tools/test_discovery.py +643 -0
  432. alysis_code/tools/web.py +482 -0
  433. alysis_code/tools/web_search.py +2012 -0
  434. alysis_code/tools/web_search_dashscope.py +557 -0
  435. alysis_code/tools/web_search_ddgs.py +221 -0
  436. alysis_code/tools/web_search_provider_adapters.py +1429 -0
  437. alysis_code/tools/web_search_tavily.py +194 -0
  438. alysis_code/updates.py +933 -0
  439. alysis_code/usage_tracker.py +1990 -0
  440. alysis_code/verification_command_analysis.py +1004 -0
  441. alysis_code/verification_contract.py +574 -0
  442. alysis_code/verification_failure_summary.py +273 -0
  443. alysis_code/verification_repair.py +385 -0
  444. alysis_code/verify_gate.py +3129 -0
  445. alysis_code/web_research.py +1872 -0
  446. alysis_code/web_search_adapters.py +66 -0
  447. alysis_code/web_search_policy.py +27 -0
  448. alysis_code/workspace_binding.py +389 -0
  449. alysis_code/workspace_binding_ui.py +408 -0
  450. alysis_code/workspace_context.py +273 -0
  451. alysis_code/workspace_isolation.py +138 -0
  452. alysis_code/workspace_provisioning.py +455 -0
  453. alysis_code-0.13.0.dist-info/METADATA +507 -0
  454. alysis_code-0.13.0.dist-info/RECORD +458 -0
  455. alysis_code-0.13.0.dist-info/WHEEL +4 -0
  456. alysis_code-0.13.0.dist-info/entry_points.txt +3 -0
  457. alysis_code-0.13.0.dist-info/licenses/LICENSE +176 -0
  458. alysis_code-0.13.0.dist-info/licenses/NOTICE +4 -0
@@ -0,0 +1,485 @@
1
+ from __future__ import annotations
2
+
3
+ import re
4
+ from dataclasses import dataclass
5
+ from pathlib import PurePosixPath
6
+
7
+ from .runtime_artifacts import RUNTIME_ARTIFACT_DIR_NAMES
8
+
9
+ LANGUAGE_EXTENSIONS: dict[str, frozenset[str]] = {
10
+ "python": frozenset({".py"}),
11
+ "javascript": frozenset({".cjs", ".js", ".jsx", ".mjs"}),
12
+ "typescript": frozenset({".cts", ".mts", ".ts", ".tsx"}),
13
+ "rust": frozenset({".rs"}),
14
+ "go": frozenset({".go"}),
15
+ "java": frozenset({".java"}),
16
+ "kotlin": frozenset({".kt", ".kts"}),
17
+ "c": frozenset({".c", ".h"}),
18
+ "cpp": frozenset({".cc", ".cpp", ".cxx", ".hpp", ".hxx"}),
19
+ "csharp": frozenset({".cs"}),
20
+ "php": frozenset({".php"}),
21
+ "ruby": frozenset({".rb"}),
22
+ "shell": frozenset({".bash", ".sh"}),
23
+ "swift": frozenset({".swift"}),
24
+ }
25
+
26
+ SOURCE_EXTENSIONS_BY_LANGUAGE: dict[str, frozenset[str]] = {
27
+ **LANGUAGE_EXTENSIONS,
28
+ "java": LANGUAGE_EXTENSIONS["java"] | LANGUAGE_EXTENSIONS["kotlin"],
29
+ "node": LANGUAGE_EXTENSIONS["javascript"] | LANGUAGE_EXTENSIONS["typescript"],
30
+ }
31
+ BROAD_SOURCE_EXTENSIONS = frozenset(
32
+ suffix for extensions in LANGUAGE_EXTENSIONS.values() for suffix in extensions
33
+ )
34
+
35
+ CODE_IMPLEMENTATION_EXTENSIONS = frozenset(
36
+ {
37
+ ".cjs",
38
+ ".go",
39
+ ".java",
40
+ ".js",
41
+ ".jsx",
42
+ ".mjs",
43
+ ".mts",
44
+ ".py",
45
+ ".rs",
46
+ ".ts",
47
+ ".tsx",
48
+ }
49
+ )
50
+ SYMBOL_SCANNABLE_EXTENSIONS = CODE_IMPLEMENTATION_EXTENSIONS
51
+ SYMBOL_SEARCH_BACKEND_BY_EXTENSION = {
52
+ ".py": "python_ast",
53
+ ".cjs": "js_ts_heuristic",
54
+ ".js": "js_ts_heuristic",
55
+ ".jsx": "js_ts_heuristic",
56
+ ".mjs": "js_ts_heuristic",
57
+ ".mts": "js_ts_heuristic",
58
+ ".ts": "js_ts_heuristic",
59
+ ".tsx": "js_ts_heuristic",
60
+ ".java": "java_heuristic",
61
+ }
62
+
63
+ INFERRED_FILE_EXTENSIONS = frozenset(
64
+ {
65
+ *(suffix.lstrip(".") for suffix in BROAD_SOURCE_EXTENSIONS),
66
+ "cfg",
67
+ "conf",
68
+ "css",
69
+ "csv",
70
+ "env",
71
+ "html",
72
+ "ini",
73
+ "json",
74
+ "md",
75
+ "scss",
76
+ "sql",
77
+ "svg",
78
+ "toml",
79
+ "txt",
80
+ "xml",
81
+ "yaml",
82
+ "yml",
83
+ }
84
+ )
85
+
86
+ CODE_SCAN_SKIP_DIR_NAMES = frozenset(
87
+ {
88
+ ".git",
89
+ ".hg",
90
+ ".mypy_cache",
91
+ ".pytest_cache",
92
+ ".ruff_cache",
93
+ ".svn",
94
+ ".alysis",
95
+ ".tox",
96
+ ".venv",
97
+ "__pycache__",
98
+ "build",
99
+ "coverage",
100
+ "dist",
101
+ "node_modules",
102
+ "target",
103
+ "vendor",
104
+ "venv",
105
+ # Vendored-dependency trees under other conventional names. Editing
106
+ # (or symbol-scanning) these is practically never the intended change:
107
+ # sklearn uses ``externals``, pip uses ``_vendor``, Chromium-style
108
+ # projects use ``third_party``/``thirdparty``.
109
+ "_vendor",
110
+ "externals",
111
+ "third_party",
112
+ "thirdparty",
113
+ }
114
+ ) | frozenset(RUNTIME_ARTIFACT_DIR_NAMES)
115
+ GENERATED_DIR_NAMES = frozenset({"gen", "generated", "out"})
116
+ TEST_DIR_NAMES = frozenset({"__tests__", "spec", "specs", "test", "tests"})
117
+ FIXTURE_DIR_NAMES = frozenset(
118
+ {
119
+ "__snapshots__",
120
+ "fixture",
121
+ "fixtures",
122
+ "golden",
123
+ "goldens",
124
+ "sample",
125
+ "samples",
126
+ "snapshot",
127
+ "snapshots",
128
+ "test-data",
129
+ "test_data",
130
+ "testdata",
131
+ }
132
+ )
133
+ CONTENT_SURFACE_EXTENSIONS = frozenset({".adoc", ".markdown", ".md", ".mdx", ".rst", ".txt"})
134
+ FRONTEND_SURFACE_EXTENSIONS = frozenset({".css", ".htm", ".html", ".less", ".sass", ".scss"})
135
+ CONFIG_EXTENSIONS = frozenset(
136
+ {
137
+ ".cfg",
138
+ ".conf",
139
+ ".env",
140
+ ".gradle",
141
+ ".ini",
142
+ ".json",
143
+ ".properties",
144
+ ".toml",
145
+ ".xml",
146
+ ".yaml",
147
+ ".yml",
148
+ }
149
+ )
150
+ CONFIG_FILENAMES = frozenset(
151
+ {
152
+ ".env",
153
+ "cargo.toml",
154
+ "dockerfile",
155
+ "go.mod",
156
+ "go.sum",
157
+ "makefile",
158
+ "mix.exs",
159
+ "package-lock.json",
160
+ "package.json",
161
+ "pnpm-lock.yaml",
162
+ "poetry.lock",
163
+ "pom.xml",
164
+ "pyproject.toml",
165
+ "requirements-dev.txt",
166
+ "requirements.txt",
167
+ "setup.cfg",
168
+ "setup.py",
169
+ "tox.ini",
170
+ "yarn.lock",
171
+ }
172
+ )
173
+
174
+ _EXTENSION_TO_LANGUAGE = {
175
+ suffix: language
176
+ for language, extensions in LANGUAGE_EXTENSIONS.items()
177
+ for suffix in extensions
178
+ }
179
+ _LANGUAGE_DISPLAY = {
180
+ "cpp": "C++",
181
+ "csharp": "C#",
182
+ "go": "Go",
183
+ "java": "Java",
184
+ "javascript": "JavaScript",
185
+ "kotlin": "Kotlin",
186
+ "php": "PHP",
187
+ "python": "Python",
188
+ "ruby": "Ruby",
189
+ "rust": "Rust",
190
+ "shell": "shell",
191
+ "swift": "Swift",
192
+ "typescript": "TypeScript",
193
+ }
194
+
195
+
196
+ @dataclass(frozen=True)
197
+ class PathClassification:
198
+ path: str
199
+ suffix: str
200
+ language: str | None
201
+ kind: str
202
+ label: str
203
+
204
+
205
+ def normalize_classification_path(path: str) -> str:
206
+ normalized = str(path or "").strip().replace("\\", "/").strip()
207
+ while normalized.startswith("./"):
208
+ normalized = normalized[2:]
209
+ return normalized.strip("/")
210
+
211
+
212
+ def _parts(path: str) -> tuple[str, ...]:
213
+ normalized = normalize_classification_path(path)
214
+ if not normalized:
215
+ return ()
216
+ return tuple(part.casefold() for part in PurePosixPath(normalized).parts if part)
217
+
218
+
219
+ def _suffix(path: str) -> str:
220
+ return PurePosixPath(normalize_classification_path(path)).suffix.casefold()
221
+
222
+
223
+ def language_for_path(path: str) -> str | None:
224
+ return _EXTENSION_TO_LANGUAGE.get(_suffix(path))
225
+
226
+
227
+ def language_display_name(language: str | None) -> str | None:
228
+ if not language:
229
+ return None
230
+ return _LANGUAGE_DISPLAY.get(language, language.title())
231
+
232
+
233
+ def source_extensions_for_languages(language_hints: list[str]) -> set[str]:
234
+ extensions: set[str] = set()
235
+ for hint in language_hints:
236
+ extensions.update(SOURCE_EXTENSIONS_BY_LANGUAGE.get(str(hint).casefold(), frozenset()))
237
+ return extensions or set(BROAD_SOURCE_EXTENSIONS)
238
+
239
+
240
+ def is_generated_or_vendor_path(path: str) -> bool:
241
+ parts = _parts(path)
242
+ if not parts:
243
+ return False
244
+ return bool(set(parts) & (CODE_SCAN_SKIP_DIR_NAMES | GENERATED_DIR_NAMES))
245
+
246
+
247
+ DERIVED_ARTIFACT_FILENAMES = frozenset(
248
+ {
249
+ "bun.lockb",
250
+ "cargo.lock",
251
+ "composer.lock",
252
+ "flake.lock",
253
+ "gemfile.lock",
254
+ "go.sum",
255
+ "gradle.lockfile",
256
+ "mix.lock",
257
+ "npm-shrinkwrap.json",
258
+ "package-lock.json",
259
+ "packages.lock.json",
260
+ "pipfile.lock",
261
+ "pnpm-lock.yaml",
262
+ "podfile.lock",
263
+ "poetry.lock",
264
+ "pubspec.lock",
265
+ "uv.lock",
266
+ "yarn.lock",
267
+ }
268
+ )
269
+ _MINIFIED_BUNDLE_NAME_SUFFIXES = (".min.js", ".min.mjs", ".min.cjs", ".min.css")
270
+ _SOURCE_MAP_NAME_SUFFIXES = (".js.map", ".mjs.map", ".cjs.map", ".css.map")
271
+
272
+
273
+ def derived_artifact_reason(path: str) -> str | None:
274
+ """Classify machine-generated, low-information-density artifacts.
275
+
276
+ These files are legitimate to read when they are the subject of the task,
277
+ but reading them wholesale by default mostly burns context: lockfiles,
278
+ minified bundles, source maps, and files under generated/vendored trees.
279
+ Classification is by file class (name shape and location) only — never by
280
+ task wording — so callers can offer an explicit opt-in instead of a block.
281
+ Returns a short human-readable reason, or None for ordinary files.
282
+ """
283
+
284
+ normalized = normalize_classification_path(path)
285
+ if not normalized:
286
+ return None
287
+ name = PurePosixPath(normalized).name.casefold()
288
+ if name in DERIVED_ARTIFACT_FILENAMES:
289
+ return "dependency lockfile"
290
+ if name.endswith(_MINIFIED_BUNDLE_NAME_SUFFIXES):
291
+ return "minified bundle"
292
+ if name.endswith(_SOURCE_MAP_NAME_SUFFIXES):
293
+ return "source map"
294
+ if name.endswith(".lock"):
295
+ return "lockfile"
296
+ if is_generated_or_vendor_path(normalized):
297
+ return "generated or vendored path"
298
+ return None
299
+
300
+
301
+ def is_fixture_path(path: str) -> bool:
302
+ parts = _parts(path)
303
+ return bool(parts and set(parts) & FIXTURE_DIR_NAMES)
304
+
305
+
306
+ def is_test_path(path: str) -> bool:
307
+ normalized = normalize_classification_path(path)
308
+ if not normalized:
309
+ return False
310
+ pure = PurePosixPath(normalized)
311
+ parts = {part.casefold() for part in pure.parts if part}
312
+ if parts & TEST_DIR_NAMES:
313
+ return True
314
+
315
+ name = pure.name
316
+ lowered_name = name.casefold()
317
+ stem = pure.stem
318
+ lowered_stem = stem.casefold()
319
+ suffix = pure.suffix.casefold()
320
+ if (
321
+ lowered_name.startswith(("test_", "test-"))
322
+ or lowered_stem.endswith(("_test", "-test", "_spec", "-spec"))
323
+ or ".test." in lowered_name
324
+ or ".spec." in lowered_name
325
+ ):
326
+ return True
327
+ if suffix == ".py" and lowered_name.endswith("_test.py"):
328
+ return True
329
+ if suffix in {".java", ".kt", ".kts"}:
330
+ return (stem.startswith("Test") and len(stem) > len("Test")) or any(
331
+ stem.endswith(suffix_marker) and len(stem) > len(suffix_marker)
332
+ for suffix_marker in ("Test", "Tests", "Spec", "IT")
333
+ )
334
+ if suffix == ".go" and lowered_name.endswith("_test.go"):
335
+ return True
336
+ if suffix == ".rs" and (
337
+ lowered_name.endswith("_test.rs") or lowered_stem.endswith(("_tests", "-tests"))
338
+ ):
339
+ return True
340
+ return False
341
+
342
+
343
+ def is_symbol_scannable_path(path: str) -> bool:
344
+ return _suffix(path) in SYMBOL_SCANNABLE_EXTENSIONS and not is_generated_or_vendor_path(path)
345
+
346
+
347
+ def symbol_search_backend_for_path(path: str) -> str | None:
348
+ if is_generated_or_vendor_path(path):
349
+ return None
350
+ return SYMBOL_SEARCH_BACKEND_BY_EXTENSION.get(_suffix(path))
351
+
352
+
353
+ def is_code_implementation_path(path: str) -> bool:
354
+ return (
355
+ _suffix(path) in CODE_IMPLEMENTATION_EXTENSIONS
356
+ and not is_test_path(path)
357
+ and not is_fixture_path(path)
358
+ and not is_generated_or_vendor_path(path)
359
+ )
360
+
361
+
362
+ def is_docs_path(path: str) -> bool:
363
+ normalized = normalize_classification_path(path).casefold()
364
+ if normalized in {"readme", "readme.md", "todo", "todo.md"}:
365
+ return True
366
+ if normalized.startswith(("docs/", "doc/", "notes/", "note/")):
367
+ return True
368
+ return _suffix(normalized) in CONTENT_SURFACE_EXTENSIONS
369
+
370
+
371
+ def is_frontend_surface_path(path: str) -> bool:
372
+ return _suffix(path) in FRONTEND_SURFACE_EXTENSIONS
373
+
374
+
375
+ def is_config_path(path: str) -> bool:
376
+ normalized = normalize_classification_path(path).casefold()
377
+ if PurePosixPath(normalized).name in CONFIG_FILENAMES:
378
+ return True
379
+ return _suffix(normalized) in CONFIG_EXTENSIONS
380
+
381
+
382
+ def classify_path(path: str) -> PathClassification:
383
+ normalized = normalize_classification_path(path)
384
+ suffix = _suffix(normalized)
385
+ language = language_for_path(normalized)
386
+ language_name = language_display_name(language)
387
+ if is_code_implementation_path(normalized):
388
+ label = f"{language_name} implementation files" if language_name else "implementation files"
389
+ return PathClassification(normalized, suffix, language, "implementation", label)
390
+ if is_generated_or_vendor_path(normalized):
391
+ label = (
392
+ f"generated/vendor {language_name} files" if language_name else "generated/vendor paths"
393
+ )
394
+ return PathClassification(normalized, suffix, language, "generated_or_vendor", label)
395
+ if is_test_path(normalized):
396
+ label = f"{language_name} test files" if language_name else "test files"
397
+ return PathClassification(normalized, suffix, language, "test", label)
398
+ if is_fixture_path(normalized):
399
+ label = f"{language_name} fixture files" if language_name else "fixture files"
400
+ return PathClassification(normalized, suffix, language, "fixture", label)
401
+ if is_docs_path(normalized):
402
+ return PathClassification(normalized, suffix, language, "docs", "docs")
403
+ if is_frontend_surface_path(normalized):
404
+ return PathClassification(
405
+ normalized,
406
+ suffix,
407
+ language,
408
+ "frontend_surface",
409
+ "frontend surface files",
410
+ )
411
+ if is_config_path(normalized):
412
+ return PathClassification(normalized, suffix, language, "config", "config")
413
+ if language_name:
414
+ return PathClassification(
415
+ normalized,
416
+ suffix,
417
+ language,
418
+ "source",
419
+ f"{language_name} source files",
420
+ )
421
+ if suffix:
422
+ return PathClassification(
423
+ normalized, suffix, language, "unknown", f"unknown {suffix} files"
424
+ )
425
+ return PathClassification(
426
+ normalized,
427
+ suffix,
428
+ language,
429
+ "unknown",
430
+ "unknown extensionless paths",
431
+ )
432
+
433
+
434
+ def describe_path_kinds(paths: list[str]) -> str:
435
+ labels = [classify_path(path).label for path in paths if normalize_classification_path(path)]
436
+ if not labels:
437
+ return "unknown paths"
438
+ unique = list(dict.fromkeys(labels))
439
+ if set(unique) <= {"docs", "config"}:
440
+ if set(unique) == {"docs"}:
441
+ return "docs only"
442
+ if set(unique) == {"config"}:
443
+ return "config only"
444
+ return "docs/config only"
445
+ if len(unique) == 1:
446
+ return f"{unique[0]} only"
447
+ return ", ".join(unique)
448
+
449
+
450
+ def symbol_definition_regex(symbol: str, path_or_suffix: str) -> re.Pattern[str]:
451
+ escaped = re.escape(symbol)
452
+ suffix = path_or_suffix if path_or_suffix.startswith(".") else _suffix(path_or_suffix)
453
+ suffix = suffix.casefold()
454
+ if suffix == ".py":
455
+ return re.compile(rf"(?m)^\s*(?:async\s+def|def|class)\s+{escaped}\b")
456
+ if suffix in {".cjs", ".js", ".jsx", ".mjs", ".mts", ".ts", ".tsx"}:
457
+ return re.compile(
458
+ rf"(?m)^\s*(?:export\s+)?(?:async\s+)?function\s+{escaped}\b"
459
+ rf"|^\s*(?:export\s+)?(?:const|let|var)\s+{escaped}\s*="
460
+ rf"|^\s*(?:export\s+)?class\s+{escaped}\b"
461
+ )
462
+ if suffix == ".go":
463
+ return re.compile(rf"(?m)^\s*func\s+(?:\([^)]*\)\s*)?{escaped}\b")
464
+ if suffix == ".rs":
465
+ return re.compile(
466
+ rf"(?m)^\s*(?:pub(?:\([^)]*\))?\s+)?(?:async\s+)?"
467
+ rf"(?:fn|struct|enum|trait)\s+{escaped}\b"
468
+ )
469
+ if suffix == ".java":
470
+ annotation = r"(?:@[A-Za-z_$][\w$.]*(?:\([^)]*\))?\s+)*"
471
+ modifier = (
472
+ r"(?:(?:public|protected|private|abstract|static|final|sealed|non-sealed|"
473
+ r"strictfp|synchronized|native|default)\s+)*"
474
+ )
475
+ generic_prefix = r"(?:<[^;{}()]+>\s+)?"
476
+ return_type = (
477
+ r"(?:(?:[A-Za-z_$][\w$.]*|void|boolean|byte|short|int|long|float|double|char)"
478
+ r"(?:\s*<[^;{}()]+>)?(?:\s*\[\])*\s+)+"
479
+ )
480
+ prefix = annotation + modifier + generic_prefix
481
+ return re.compile(
482
+ rf"(?m)^\s*{prefix}(?:class|interface|enum|record)\s+{escaped}\b"
483
+ rf"|^\s*{prefix}(?:{return_type})?{escaped}\s*\("
484
+ )
485
+ return re.compile(rf"\b{escaped}\b")