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,372 @@
1
+ """
2
+ Engine event inventory (migration targets; current call sites are intentionally unchanged):
3
+ - message_delta: assistant streaming tokens from agent_loop.py and plan_assistant.py via
4
+ on_text_delta callbacks, including Plan Mode/Forge planner streaming in cli_impl/chat.py.
5
+ - message_end: final assistant messages from agent_loop.py and plan draft/planner completion
6
+ flows in cli_impl/chat.py.
7
+ - tool_call_started: tool lifecycle starts from agent_loop.py for built-ins, custom tools,
8
+ non-repo tool-assisted turns, and nested subagent tool forwarding through hidden_surface.py.
9
+ - tool_call_progress: tool output chunks/previews from agent_loop.py and summarization helpers
10
+ in tools/registry.py.
11
+ - tool_call_completed: tool lifecycle completion/failure from agent_loop.py, including hook
12
+ blocks, repeated-call guards, verify_run, shell, git, web, MCP/custom tool failures.
13
+ - status_update: startup/session status in agent_loop.py plus command/status HUD text in
14
+ cli_impl/chat.py.
15
+ - mode_changed: /mode, /plan on/off readonly overlay, and Forge UI transitions in
16
+ cli_impl/chat.py.
17
+ - persona_changed: persona-mode transitions (user-initiated /mode persona switches and
18
+ approved model switch_mode proposals) applied through the chat loop's persona primitive.
19
+ - plan_node_updated: task creation/status/validation/reconciliation updates in forge.py,
20
+ cli_impl/forge.py, cli_impl/chat.py, plan_assistant.py, and plan_reconciliation.py.
21
+ - swarm_worker_state_changed: scheduler batches, worker task starts/ends, merge/retry state,
22
+ and dry-run output in swarm_orchestrator.py.
23
+ - verify_gate_result: verify_run tool payloads in agent_loop.py and command execution/results
24
+ in verify_gate.py and cli_impl/forge.py.
25
+ - review_gate_decision: review approvals, blocking issues, and changes_requested status in
26
+ review_gate.py and cli_impl/forge.py.
27
+ - error_raised: agent/runtime/LLM/tool/config/Forge errors surfaced through on_error,
28
+ console.print red paths, and raised domain errors in agent_loop.py, cli_impl/chat.py,
29
+ cli_impl/forge.py, tools/*.py, verify_gate.py, and review_gate.py.
30
+ - warning_emitted: model metadata warnings, plan validation/reconciliation warnings, hook
31
+ notices, unknown command/usage warnings, repeated tool guards, and verify/review warnings.
32
+ - info_emitted: progress/thinking lines, planner assistant meta text, saved artifact paths,
33
+ subagent summaries, usage/context/HUD lines, dry-run summaries, and feedback bundle paths.
34
+ - prompt_for_input: approval prompts in RichSurface.request_approval, Plan Mode approve/revise
35
+ prompts in cli_impl/chat.py, workspace/model/menu selectors, and interactive chat input.
36
+ - config_form_request: future structured menus/forms replacing /config, setup, model metadata,
37
+ toolbar, usage HUD, subagents, skills, and workspace binding command surfaces.
38
+ """
39
+
40
+ from __future__ import annotations
41
+
42
+ import math
43
+ from dataclasses import MISSING, dataclass, field, fields
44
+ from typing import Any, ClassVar, Literal, TypeAlias, get_args
45
+
46
+ JsonPrimitive: TypeAlias = str | int | float | bool | None
47
+ JsonValue: TypeAlias = JsonPrimitive | list["JsonValue"] | dict[str, "JsonValue"]
48
+ MAX_ARGUMENTS_PREVIEW_CHARS = 500
49
+
50
+
51
+ def _truncate_preview(text: str, *, max_chars: int = MAX_ARGUMENTS_PREVIEW_CHARS) -> str:
52
+ if len(text) <= max_chars:
53
+ return text
54
+ if max_chars <= 3:
55
+ return text[:max_chars]
56
+ return text[: max_chars - 3] + "..."
57
+
58
+
59
+ def _json_safe(value: Any) -> JsonValue:
60
+ if value is None or isinstance(value, str | bool | int):
61
+ return value
62
+ if isinstance(value, float):
63
+ if not math.isfinite(value):
64
+ raise ValueError("event values must be finite JSON numbers")
65
+ return value
66
+ if isinstance(value, list | tuple):
67
+ return [_json_safe(item) for item in value]
68
+ if isinstance(value, dict):
69
+ out: dict[str, JsonValue] = {}
70
+ for key, item in value.items():
71
+ if not isinstance(key, str):
72
+ raise ValueError("event dict keys must be strings")
73
+ out[key] = _json_safe(item)
74
+ return out
75
+ raise ValueError(f"event value is not JSON-safe: {type(value).__name__}")
76
+
77
+
78
+ def _to_dict(event: Any) -> dict[str, Any]:
79
+ data: dict[str, Any] = {"type": event.type}
80
+ for event_field in fields(event):
81
+ data[event_field.name] = _json_safe(getattr(event, event_field.name))
82
+ return data
83
+
84
+
85
+ @dataclass(frozen=True, slots=True)
86
+ class MessageDelta:
87
+ type: ClassVar[Literal["message_delta"]] = "message_delta"
88
+ text: str
89
+ worker_id: str | None = None
90
+ role: str | None = None
91
+
92
+ def to_dict(self) -> dict[str, Any]:
93
+ return _to_dict(self)
94
+
95
+
96
+ @dataclass(frozen=True, slots=True)
97
+ class MessageEnd:
98
+ type: ClassVar[Literal["message_end"]] = "message_end"
99
+ text: str = ""
100
+ worker_id: str | None = None
101
+ role: str | None = None
102
+
103
+ def to_dict(self) -> dict[str, Any]:
104
+ return _to_dict(self)
105
+
106
+
107
+ @dataclass(frozen=True, slots=True)
108
+ class ToolCallStarted:
109
+ type: ClassVar[Literal["tool_call_started"]] = "tool_call_started"
110
+ call_id: str
111
+ name: str
112
+ arguments_preview: str
113
+ worker_id: str | None = None
114
+ role: str | None = None
115
+
116
+ def to_dict(self) -> dict[str, Any]:
117
+ data = _to_dict(self)
118
+ data["arguments_preview"] = _truncate_preview(str(data["arguments_preview"]))
119
+ return data
120
+
121
+
122
+ @dataclass(frozen=True, slots=True)
123
+ class ToolCallProgress:
124
+ type: ClassVar[Literal["tool_call_progress"]] = "tool_call_progress"
125
+ call_id: str
126
+ text: str
127
+ worker_id: str | None = None
128
+ role: str | None = None
129
+
130
+ def to_dict(self) -> dict[str, Any]:
131
+ return _to_dict(self)
132
+
133
+
134
+ @dataclass(frozen=True, slots=True)
135
+ class ToolCallCompleted:
136
+ type: ClassVar[Literal["tool_call_completed"]] = "tool_call_completed"
137
+ call_id: str
138
+ success: bool
139
+ result_preview: str
140
+ worker_id: str | None = None
141
+ role: str | None = None
142
+
143
+ def to_dict(self) -> dict[str, Any]:
144
+ return _to_dict(self)
145
+
146
+
147
+ @dataclass(frozen=True, slots=True)
148
+ class StatusUpdate:
149
+ type: ClassVar[Literal["status_update"]] = "status_update"
150
+ tokens_in: int | None = None
151
+ tokens_out: int | None = None
152
+ cached_tokens: int | None = None
153
+ cost_usd: float | None = None
154
+ mode: str | None = None
155
+ model: str | None = None
156
+ step: int | None = None
157
+ step_budget: int | None = None
158
+
159
+ def to_dict(self) -> dict[str, Any]:
160
+ return _to_dict(self)
161
+
162
+
163
+ @dataclass(frozen=True, slots=True)
164
+ class ModeChanged:
165
+ type: ClassVar[Literal["mode_changed"]] = "mode_changed"
166
+ mode: str
167
+
168
+ def to_dict(self) -> dict[str, Any]:
169
+ return _to_dict(self)
170
+
171
+
172
+ @dataclass(frozen=True, slots=True)
173
+ class PersonaChanged:
174
+ type: ClassVar[Literal["persona_changed"]] = "persona_changed"
175
+ persona: str
176
+ effective_mode: str
177
+ source: str = "user"
178
+
179
+ def to_dict(self) -> dict[str, Any]:
180
+ return _to_dict(self)
181
+
182
+
183
+ @dataclass(frozen=True, slots=True)
184
+ class PlanNodeUpdated:
185
+ type: ClassVar[Literal["plan_node_updated"]] = "plan_node_updated"
186
+ node_id: str
187
+ state: str
188
+ summary: str | None = None
189
+ worker_id: str | None = None
190
+ role: str | None = None
191
+
192
+ def to_dict(self) -> dict[str, Any]:
193
+ return _to_dict(self)
194
+
195
+
196
+ @dataclass(frozen=True, slots=True)
197
+ class SwarmWorkerStateChanged:
198
+ type: ClassVar[Literal["swarm_worker_state_changed"]] = "swarm_worker_state_changed"
199
+ worker_id: str
200
+ state: str
201
+ role: str | None = None
202
+
203
+ def to_dict(self) -> dict[str, Any]:
204
+ return _to_dict(self)
205
+
206
+
207
+ @dataclass(frozen=True, slots=True)
208
+ class SubagentStateChanged:
209
+ """Read-only lifecycle projection for one model-managed child turn.
210
+
211
+ ``subagent_run_id`` is correlation only, never an authority token. The
212
+ owning IDE job remains the sole cancellation/approval boundary.
213
+ """
214
+
215
+ type: ClassVar[Literal["subagent_state_changed"]] = "subagent_state_changed"
216
+ subagent_run_id: str
217
+ name: str
218
+ mode: str
219
+ state: str
220
+ label: str = ""
221
+ subagent_session_id: str | None = None
222
+ description: str = ""
223
+ elapsed_ms: int | None = None
224
+ steps_completed: int | None = None
225
+ error: str | None = None
226
+
227
+ def to_dict(self) -> dict[str, Any]:
228
+ return _to_dict(self)
229
+
230
+
231
+ @dataclass(frozen=True, slots=True)
232
+ class VerifyGateResult:
233
+ type: ClassVar[Literal["verify_gate_result"]] = "verify_gate_result"
234
+ command: str
235
+ success: bool
236
+ summary: str
237
+ worker_id: str | None = None
238
+ role: str | None = None
239
+
240
+ def to_dict(self) -> dict[str, Any]:
241
+ return _to_dict(self)
242
+
243
+
244
+ @dataclass(frozen=True, slots=True)
245
+ class ReviewGateDecision:
246
+ type: ClassVar[Literal["review_gate_decision"]] = "review_gate_decision"
247
+ decision: str
248
+ summary: str
249
+ worker_id: str | None = None
250
+ role: str | None = None
251
+
252
+ def to_dict(self) -> dict[str, Any]:
253
+ return _to_dict(self)
254
+
255
+
256
+ @dataclass(frozen=True, slots=True)
257
+ class ErrorRaised:
258
+ type: ClassVar[Literal["error_raised"]] = "error_raised"
259
+ code: str
260
+ message: str
261
+ recoverable: bool
262
+ worker_id: str | None = None
263
+ role: str | None = None
264
+
265
+ def to_dict(self) -> dict[str, Any]:
266
+ return _to_dict(self)
267
+
268
+
269
+ @dataclass(frozen=True, slots=True)
270
+ class WarningEmitted:
271
+ type: ClassVar[Literal["warning_emitted"]] = "warning_emitted"
272
+ message: str
273
+ worker_id: str | None = None
274
+ role: str | None = None
275
+
276
+ def to_dict(self) -> dict[str, Any]:
277
+ return _to_dict(self)
278
+
279
+
280
+ @dataclass(frozen=True, slots=True)
281
+ class InfoEmitted:
282
+ type: ClassVar[Literal["info_emitted"]] = "info_emitted"
283
+ message: str
284
+ worker_id: str | None = None
285
+ role: str | None = None
286
+
287
+ def to_dict(self) -> dict[str, Any]:
288
+ return _to_dict(self)
289
+
290
+
291
+ @dataclass(frozen=True, slots=True)
292
+ class PromptForInput:
293
+ type: ClassVar[Literal["prompt_for_input"]] = "prompt_for_input"
294
+ prompt_id: str
295
+ prompt_text: str
296
+ kind: str
297
+ approval_kind: str | None = None
298
+ approval_id: str | None = None
299
+ reason: str | None = None
300
+ preview: str | None = None
301
+ files: list[str] = field(default_factory=list)
302
+ command: str | None = None
303
+ metadata: dict[str, Any] = field(default_factory=dict)
304
+ expires_at: str | None = None
305
+ allow_for_session_supported: bool | None = None
306
+ allow_for_session_scope: dict[str, Any] | None = None
307
+ allow_for_session_warning: str | None = None
308
+
309
+ def to_dict(self) -> dict[str, Any]:
310
+ return _to_dict(self)
311
+
312
+
313
+ @dataclass(frozen=True, slots=True)
314
+ class ConfigFormRequest:
315
+ type: ClassVar[Literal["config_form_request"]] = "config_form_request"
316
+ form_id: str
317
+ schema: dict[str, Any]
318
+
319
+ def to_dict(self) -> dict[str, Any]:
320
+ return _to_dict(self)
321
+
322
+
323
+ Event: TypeAlias = (
324
+ MessageDelta
325
+ | MessageEnd
326
+ | ToolCallStarted
327
+ | ToolCallProgress
328
+ | ToolCallCompleted
329
+ | StatusUpdate
330
+ | ModeChanged
331
+ | PersonaChanged
332
+ | PlanNodeUpdated
333
+ | SwarmWorkerStateChanged
334
+ | SubagentStateChanged
335
+ | VerifyGateResult
336
+ | ReviewGateDecision
337
+ | ErrorRaised
338
+ | WarningEmitted
339
+ | InfoEmitted
340
+ | PromptForInput
341
+ | ConfigFormRequest
342
+ )
343
+
344
+ EVENT_REGISTRY: dict[str, type] = {event_cls.type: event_cls for event_cls in get_args(Event)}
345
+
346
+
347
+ def event_from_dict(data: dict[str, Any]) -> Event:
348
+ event_type = str(data.get("type") or "")
349
+ event_cls = EVENT_REGISTRY.get(event_type)
350
+ if event_cls is None:
351
+ raise ValueError(f"Unknown surface event type: {event_type or '(missing)'}")
352
+
353
+ event_fields = fields(event_cls)
354
+ allowed_keys = {field.name for field in event_fields}
355
+ extra_keys = sorted(set(data) - allowed_keys - {"type"})
356
+ if extra_keys:
357
+ raise ValueError(
358
+ f"Unexpected field(s) for surface event {event_type}: {', '.join(extra_keys)}"
359
+ )
360
+
361
+ missing_keys = [
362
+ field.name
363
+ for field in event_fields
364
+ if field.default is MISSING and field.default_factory is MISSING and field.name not in data
365
+ ]
366
+ if missing_keys:
367
+ raise ValueError(
368
+ f"Missing field(s) for surface event {event_type}: {', '.join(missing_keys)}"
369
+ )
370
+
371
+ kwargs = {field.name: data[field.name] for field in event_fields if field.name in data}
372
+ return event_cls(**kwargs)