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,258 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Callable, Iterable, Sequence
4
+ from dataclasses import dataclass
5
+ from typing import Any
6
+
7
+ from prompt_toolkit.completion import Completer, Completion
8
+
9
+
10
+ @dataclass(frozen=True)
11
+ class ChatSlashCommandSpec:
12
+ name: str
13
+ usage: str
14
+ description: str
15
+
16
+
17
+ @dataclass(frozen=True)
18
+ class _ChatSlashCompletionSpec:
19
+ completion: str
20
+ usage: str
21
+ description: str
22
+
23
+
24
+ _DISPLAY_WIDTH = 72
25
+ _USAGE_COLUMN = 34
26
+
27
+
28
+ def _ellipsize(text: str, limit: int) -> str:
29
+ clean = " ".join(str(text or "").split())
30
+ limit = max(1, int(limit))
31
+ if len(clean) <= limit:
32
+ return clean
33
+ if limit <= 3:
34
+ return "." * limit
35
+ return clean[: limit - 3].rstrip() + "..."
36
+
37
+
38
+ def _completion_display(
39
+ usage: str,
40
+ description: str,
41
+ *,
42
+ width: int = _DISPLAY_WIDTH,
43
+ ) -> str:
44
+ """Return one bounded completion row for prompt_toolkit's menu."""
45
+ width = max(8, int(width))
46
+ usage_text = " ".join(str(usage or "").split())
47
+ desc_text = " ".join(str(description or "").split())
48
+ if width <= _USAGE_COLUMN + 1:
49
+ return _ellipsize(usage_text, width)
50
+ usage_cell = _ellipsize(usage_text, _USAGE_COLUMN)
51
+ prefix = f"{usage_cell:<{_USAGE_COLUMN}} "
52
+ remaining = max(1, width - len(prefix))
53
+ return (prefix + _ellipsize(desc_text, remaining))[:width]
54
+
55
+
56
+ SPECS: tuple[ChatSlashCommandSpec, ...] = (
57
+ ChatSlashCommandSpec("help", "/help", "Show available commands"),
58
+ ChatSlashCommandSpec("mode", "/mode", "Change execution mode"),
59
+ ChatSlashCommandSpec("persona", "/persona", "Switch persona: code, architect, ask, debug"),
60
+ ChatSlashCommandSpec("ask", "/ask <question>", "One read-only turn; mode restored after"),
61
+ ChatSlashCommandSpec("status", "/status", "Show session status"),
62
+ ChatSlashCommandSpec("subagents", "/subagents", "Open an active subagent run"),
63
+ ChatSlashCommandSpec("terminals", "/terminals [list|show|kill]", "Manage background processes"),
64
+ ChatSlashCommandSpec("pwd", "/pwd", "Show active workdir"),
65
+ ChatSlashCommandSpec("usage", "/usage", "Token count & cost; /usage hud on|off toggles HUD"),
66
+ ChatSlashCommandSpec("context", "/context", "Show context usage"),
67
+ ChatSlashCommandSpec("compact", "/compact [focus]", "Force conversation compaction"),
68
+ ChatSlashCommandSpec("clear", "/clear", "Wipe conversation; keep session id and log"),
69
+ ChatSlashCommandSpec("resume", "/resume [id]", "Resume a previous session"),
70
+ ChatSlashCommandSpec("stream", "/stream", "Toggle live answer and reasoning output"),
71
+ ChatSlashCommandSpec("trace", "/trace", "Set reasoning trace detail"),
72
+ ChatSlashCommandSpec("config", "/config", "Open or show configuration"),
73
+ ChatSlashCommandSpec("login", "/login", "Connect your Alysis Code account or a subscription"),
74
+ ChatSlashCommandSpec("logout", "/logout", "Disconnect your Alysis Code account"),
75
+ ChatSlashCommandSpec("toolbar", "/toolbar", "Configure status toolbar"),
76
+ ChatSlashCommandSpec("assets", "/assets", "Open Forge assets"),
77
+ ChatSlashCommandSpec("image", "/image [path]", "Queue an image for the next message"),
78
+ ChatSlashCommandSpec("forge", "/forge [resume]", "Enter or resume Forge"),
79
+ ChatSlashCommandSpec("report", "/report [text]", "Create feedback bundle and issue draft"),
80
+ ChatSlashCommandSpec("feedback", "/feedback [text]", "Alias for /report"),
81
+ ChatSlashCommandSpec("plan", "/plan <task>", "Draft, review, approve, then execute"),
82
+ ChatSlashCommandSpec(
83
+ "skill",
84
+ "/skill",
85
+ "No args lists; <name> shows info; <name> <task> attaches",
86
+ ),
87
+ ChatSlashCommandSpec("exit", "/exit", "Exit chat"),
88
+ )
89
+
90
+ FORGE_SPECS: tuple[ChatSlashCommandSpec, ...] = (
91
+ ChatSlashCommandSpec("assistant", "/assistant on|off|status", "Toggle planner assistant"),
92
+ ChatSlashCommandSpec("execute", "/execute plan", "Run scoped planned tasks"),
93
+ ChatSlashCommandSpec("goal", "/goal <text>", "Set project goal"),
94
+ ChatSlashCommandSpec("task", "/task <title>", "Add a task to the plan"),
95
+ ChatSlashCommandSpec("show", "/show", "Show the current plan summary"),
96
+ ChatSlashCommandSpec("done", "/done", "Save and validate the plan"),
97
+ ChatSlashCommandSpec("back", "/back", "Return to chat without finalizing"),
98
+ )
99
+
100
+ _SHARED_NESTED_SPECS: tuple[_ChatSlashCompletionSpec, ...] = (
101
+ _ChatSlashCompletionSpec("/usage hud", "/usage hud", "Open usage HUD controls"),
102
+ _ChatSlashCompletionSpec("/usage hud on", "/usage hud on", "Enable the persistent usage HUD"),
103
+ _ChatSlashCompletionSpec(
104
+ "/usage hud off", "/usage hud off", "Disable the persistent usage HUD"
105
+ ),
106
+ _ChatSlashCompletionSpec(
107
+ "/usage hud status", "/usage hud status", "Show the current usage HUD state"
108
+ ),
109
+ _ChatSlashCompletionSpec("/terminals list", "/terminals list", "List background processes"),
110
+ _ChatSlashCompletionSpec(
111
+ "/terminals show", "/terminals show <process_id>", "Show background process output"
112
+ ),
113
+ _ChatSlashCompletionSpec(
114
+ "/terminals kill", "/terminals kill <process_id>", "Kill a background process"
115
+ ),
116
+ _ChatSlashCompletionSpec("/terminals help", "/terminals help", "Show terminal command usage"),
117
+ _ChatSlashCompletionSpec("/stream on", "/stream on", "Render model output live"),
118
+ _ChatSlashCompletionSpec("/stream off", "/stream off", "Buffer model output until complete"),
119
+ _ChatSlashCompletionSpec(
120
+ "/stream status", "/stream status", "Show the current streaming setting"
121
+ ),
122
+ )
123
+
124
+ _CHAT_NESTED_SPECS: tuple[_ChatSlashCompletionSpec, ...] = (
125
+ _ChatSlashCompletionSpec("/forge resume", "/forge resume", "Resume the current run pointer"),
126
+ _ChatSlashCompletionSpec("/plan mode", "/plan mode", "Enter persistent readonly planning"),
127
+ _ChatSlashCompletionSpec("/plan approve", "/plan approve", "Execute the stored plan draft"),
128
+ )
129
+
130
+ _FORGE_NESTED_SPECS: tuple[_ChatSlashCompletionSpec, ...] = (
131
+ _ChatSlashCompletionSpec("/execute plan", "/execute plan", "Run scoped planned tasks"),
132
+ _ChatSlashCompletionSpec(
133
+ "/plan markdown", "/plan markdown", "Preview PLAN.md for the current run"
134
+ ),
135
+ _ChatSlashCompletionSpec("/plan md", "/plan md", "Preview PLAN.md for the current run"),
136
+ _ChatSlashCompletionSpec("/plan edit", "/plan edit", "Edit plan.json and reload Forge state"),
137
+ )
138
+
139
+
140
+ def get_chat_specs() -> tuple[ChatSlashCommandSpec, ...]:
141
+ return SPECS
142
+
143
+
144
+ def get_forge_specs() -> tuple[ChatSlashCommandSpec, ...]:
145
+ return FORGE_SPECS
146
+
147
+
148
+ def max_completions_for_mode(mode: str) -> int:
149
+ """Return the largest static slash completion list for one menu in this mode."""
150
+
151
+ normalized = str(mode or "chat").strip().lower()
152
+ if normalized == "forge":
153
+ top_level_count = len([spec for spec in SPECS if spec.name not in {"clear", "forge"}])
154
+ top_level_count += len(FORGE_SPECS)
155
+ nested_count = len(_SHARED_NESTED_SPECS) + len(_FORGE_NESTED_SPECS)
156
+ return max(top_level_count, nested_count)
157
+
158
+ top_level_count = len(SPECS)
159
+ nested_count = len(_SHARED_NESTED_SPECS) + len(_CHAT_NESTED_SPECS)
160
+ return max(top_level_count, nested_count)
161
+
162
+
163
+ class ChatSlashCompleter(Completer):
164
+ def __init__(
165
+ self,
166
+ *,
167
+ mode_provider: Callable[[], str],
168
+ skill_names_provider: Callable[[], Sequence[str]] | None = None,
169
+ ) -> None:
170
+ self._mode_provider = mode_provider
171
+ self._skill_names_provider = skill_names_provider
172
+
173
+ def get_completions(self, document: Any, complete_event: Any) -> Iterable[Completion]:
174
+ del complete_event
175
+ text = str(getattr(document, "text_before_cursor", "") or "")
176
+ if not text.startswith("/"):
177
+ return
178
+ completions = self._matching_completions(text)
179
+ for spec in completions:
180
+ yield Completion(
181
+ text=spec.completion,
182
+ start_position=-len(text),
183
+ display=_completion_display(spec.usage, spec.description),
184
+ )
185
+
186
+ def _matching_completions(self, text: str) -> list[_ChatSlashCompletionSpec]:
187
+ entries = self._completion_entries_for_text(text)
188
+ text_lower = text.lower()
189
+ matches = [entry for entry in entries if entry.completion.lower().startswith(text_lower)]
190
+ exact = [entry for entry in matches if entry.completion.lower() == text_lower]
191
+ inexact = [entry for entry in matches if entry.completion.lower() != text_lower]
192
+ return [*exact, *inexact]
193
+
194
+ def _completion_entries_for_text(self, text: str) -> list[_ChatSlashCompletionSpec]:
195
+ if " " not in text[1:]:
196
+ return self._top_level_entries()
197
+ return self._nested_entries(text)
198
+
199
+ def _top_level_entries(self) -> list[_ChatSlashCompletionSpec]:
200
+ specs = list(get_chat_specs())
201
+ if self._mode() == "forge":
202
+ specs = [spec for spec in specs if spec.name not in {"clear", "forge"}]
203
+ specs.extend(get_forge_specs())
204
+ return [
205
+ _ChatSlashCompletionSpec(
206
+ completion=f"/{spec.name}",
207
+ usage=spec.usage,
208
+ description=spec.description,
209
+ )
210
+ for spec in specs
211
+ ]
212
+
213
+ def _nested_entries(self, text: str) -> list[_ChatSlashCompletionSpec]:
214
+ entries = list(_SHARED_NESTED_SPECS)
215
+ if self._mode() == "forge":
216
+ entries.extend(_FORGE_NESTED_SPECS)
217
+ else:
218
+ entries.extend(_CHAT_NESTED_SPECS)
219
+ lower = text.lower()
220
+ if lower.startswith("/skill "):
221
+ entries.extend(self._skill_name_entries())
222
+ return entries
223
+
224
+ def _skill_name_entries(self) -> list[_ChatSlashCompletionSpec]:
225
+ names = self._safe_names(self._skill_names_provider)
226
+ return [
227
+ _ChatSlashCompletionSpec(
228
+ completion=f"/skill {name}",
229
+ usage=f"/skill {name} [task]",
230
+ description="Show skill info or attach it for one turn",
231
+ )
232
+ for name in names
233
+ ]
234
+
235
+ @staticmethod
236
+ def _safe_names(provider: Callable[[], Sequence[str]] | None) -> list[str]:
237
+ if provider is None:
238
+ return []
239
+ try:
240
+ values = provider()
241
+ except Exception:
242
+ return []
243
+ seen: set[str] = set()
244
+ ordered: list[str] = []
245
+ for value in values:
246
+ name = str(value or "").strip()
247
+ if not name or name in seen:
248
+ continue
249
+ seen.add(name)
250
+ ordered.append(name)
251
+ return ordered
252
+
253
+ def _mode(self) -> str:
254
+ try:
255
+ mode = str(self._mode_provider() or "chat").strip().lower()
256
+ except Exception:
257
+ return "chat"
258
+ return "forge" if mode == "forge" else "chat"
@@ -0,0 +1,11 @@
1
+ from __future__ import annotations
2
+
3
+ import sys
4
+ from typing import TypeVar
5
+
6
+ _T = TypeVar("_T")
7
+
8
+
9
+ def _patchable(name: str, default: _T) -> _T:
10
+ module = sys.modules.get("alysis_code.cli")
11
+ return getattr(module, name, default) if module is not None else default
@@ -0,0 +1,89 @@
1
+ from __future__ import annotations
2
+
3
+ import io
4
+ import shutil
5
+ import sys
6
+ from enum import StrEnum
7
+ from pathlib import Path
8
+ from typing import TYPE_CHECKING, Any
9
+
10
+ from click import get_current_context
11
+
12
+ from ...forge_events import machine_output_active
13
+ from ...surface.console import make_console
14
+ from ...workspace_context import resolve_workspace_context
15
+ from . import _patchable
16
+
17
+ if TYPE_CHECKING:
18
+ from rich.console import Console
19
+
20
+
21
+ class Mode(StrEnum):
22
+ review = "review"
23
+ auto = "auto"
24
+ readonly = "readonly"
25
+ fullaccess = "fullaccess"
26
+
27
+
28
+ def _Table(*args: Any, **kwargs: Any) -> Any:
29
+ from rich.table import Table
30
+
31
+ return Table(*args, **kwargs)
32
+
33
+
34
+ class _DiscardStream(io.TextIOBase):
35
+ """Sink for Rich output while stdout belongs to the machine event stream."""
36
+
37
+ encoding = "utf-8"
38
+
39
+ def write(self, text: str) -> int: # type: ignore[override]
40
+ return len(text)
41
+
42
+ def isatty(self) -> bool:
43
+ return False
44
+
45
+
46
+ def _quiet_console() -> Console:
47
+ return make_console(
48
+ file=_DiscardStream(),
49
+ force_terminal=False,
50
+ no_color=True,
51
+ width=_terminal_width(),
52
+ )
53
+
54
+
55
+ def _console() -> Console:
56
+ # In machine mode stdout carries NDJSON only, so Rich renders into a sink instead.
57
+ # Deep execution code keeps printing through the console it was handed; nothing
58
+ # below this point needs to know which mode it is in.
59
+ if machine_output_active():
60
+ return _quiet_console()
61
+ return make_console(width=_terminal_width())
62
+
63
+
64
+ def _terminal_width(default: int = 120) -> int:
65
+ try:
66
+ ctx = get_current_context(silent=True)
67
+ except RuntimeError:
68
+ ctx = None
69
+ if ctx is not None:
70
+ ctx_width = getattr(ctx, "terminal_width", None)
71
+ if isinstance(ctx_width, int) and ctx_width > 0:
72
+ return ctx_width
73
+ max_content_width = getattr(ctx, "max_content_width", None)
74
+ if isinstance(max_content_width, int) and max_content_width > 0:
75
+ return max_content_width
76
+ stdout = getattr(sys, "stdout", None)
77
+ if stdout is None or not getattr(stdout, "isatty", lambda: False)():
78
+ return default
79
+ try:
80
+ return shutil.get_terminal_size((default, 40)).columns
81
+ except OSError:
82
+ return default
83
+
84
+
85
+ def _resolve_tool_workspace_root(*, path: Path) -> Path:
86
+ workspace_context = _patchable("resolve_workspace_context", resolve_workspace_context)(
87
+ path.expanduser().resolve()
88
+ )
89
+ return workspace_context.workspace_root