aria-code 0.167.0__py3-none-win_amd64.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 (601) hide show
  1. aria_bots/__init__.py +7 -0
  2. aria_bots/channels/README.md +97 -0
  3. aria_bots/channels/__init__.py +1 -0
  4. aria_bots/channels/approvals.py +263 -0
  5. aria_bots/channels/conversation.py +280 -0
  6. aria_bots/channels/digest.py +186 -0
  7. aria_bots/channels/registry.py +95 -0
  8. aria_bots/engine.py +144 -0
  9. aria_bots/feishu_bot.py +1385 -0
  10. aria_bots/logistics/__init__.py +1 -0
  11. aria_bots/logistics/carriers.py +253 -0
  12. aria_bots/logistics/freight.py +154 -0
  13. aria_bots/logistics/inventory.py +242 -0
  14. aria_bots/logistics/mcp_server.py +156 -0
  15. aria_bots/logistics/records.py +119 -0
  16. aria_bots/logistics/tenancy.py +152 -0
  17. aria_bots/market.py +91 -0
  18. aria_bots/relay_client.py +326 -0
  19. aria_bots/telegram_bot.py +299 -0
  20. aria_code/__init__.py +111 -0
  21. aria_code/_bin/aria-native.exe +0 -0
  22. aria_code/_bin/aria-runtime.exe +0 -0
  23. aria_code/_version.py +20 -0
  24. aria_code/account_memory.py +296 -0
  25. aria_code/account_session.py +166 -0
  26. aria_code/adk_apps/__init__.py +1 -0
  27. aria_code/adk_apps/aria_code_review/__init__.py +1 -0
  28. aria_code/adk_apps/aria_code_review/agent.py +32 -0
  29. aria_code/adk_apps/aria_research/__init__.py +1 -0
  30. aria_code/adk_apps/aria_research/agent.py +31 -0
  31. aria_code/agents/__init__.py +49 -0
  32. aria_code/agents/base.py +329 -0
  33. aria_code/agents/code_review.py +200 -0
  34. aria_code/agents/deep/__init__.py +37 -0
  35. aria_code/agents/deep/calibration_loop.py +144 -0
  36. aria_code/agents/deep/critic.py +125 -0
  37. aria_code/agents/deep/deepen.py +193 -0
  38. aria_code/agents/deep/models.py +149 -0
  39. aria_code/agents/deep/pipeline.py +164 -0
  40. aria_code/agents/deep/quant_fusion.py +192 -0
  41. aria_code/agents/deep/themes.py +95 -0
  42. aria_code/agents/deep/tiers.py +106 -0
  43. aria_code/agents/engineering/__init__.py +14 -0
  44. aria_code/agents/engineering/coder.py +222 -0
  45. aria_code/agents/engineering/tester.py +145 -0
  46. aria_code/agents/financial/__init__.py +21 -0
  47. aria_code/agents/financial/cashflow_burn.py +119 -0
  48. aria_code/agents/financial/catalyst.py +279 -0
  49. aria_code/agents/financial/corporate_finance.py +175 -0
  50. aria_code/agents/financial/debate.py +224 -0
  51. aria_code/agents/financial/earnings.py +315 -0
  52. aria_code/agents/financial/fundamental.py +178 -0
  53. aria_code/agents/financial/macro.py +111 -0
  54. aria_code/agents/financial/news.py +231 -0
  55. aria_code/agents/financial/risk.py +146 -0
  56. aria_code/agents/financial/sector.py +279 -0
  57. aria_code/agents/financial/strategist.py +121 -0
  58. aria_code/agents/financial/stripe_revenue.py +127 -0
  59. aria_code/agents/financial/synthesis.py +274 -0
  60. aria_code/agents/financial/technical.py +277 -0
  61. aria_code/agents/orchestrator.py +44 -0
  62. aria_code/agents/portfolio_agent.py +392 -0
  63. aria_code/agents/realty/__init__.py +62 -0
  64. aria_code/agents/realty/asset_diagnosis.py +152 -0
  65. aria_code/agents/realty/business_match.py +166 -0
  66. aria_code/agents/realty/cashflow_verify.py +209 -0
  67. aria_code/agents/realty/contract_rules.py +210 -0
  68. aria_code/agents/realty/energy_anomaly.py +189 -0
  69. aria_code/agents/realty/exit_settlement.py +208 -0
  70. aria_code/agents/realty/fulfillment_risk.py +206 -0
  71. aria_code/agents/realty/ops_optimize.py +160 -0
  72. aria_code/agents/realty/revenue_share.py +215 -0
  73. aria_code/agents/registry.py +168 -0
  74. aria_code/agents/signal_scheme.py +111 -0
  75. aria_code/agents/sports/__init__.py +0 -0
  76. aria_code/agents/sports/football_agent.py +197 -0
  77. aria_code/agents/supervisor.py +113 -0
  78. aria_code/agents/team.py +500 -0
  79. aria_code/agents/video/__init__.py +16 -0
  80. aria_code/agents/video/director.py +376 -0
  81. aria_code/agents/video/qa_agent.py +143 -0
  82. aria_code/agents/video/script_doctor.py +112 -0
  83. aria_code/agents/warehouse/__init__.py +25 -0
  84. aria_code/agents/warehouse/contracts.py +26 -0
  85. aria_code/agents/warehouse/dashboard.py +155 -0
  86. aria_code/agents/warehouse/fulfillment_leadtime.py +95 -0
  87. aria_code/agents/warehouse/inbound_exceptions.py +25 -0
  88. aria_code/agents/warehouse/inventory_health.py +24 -0
  89. aria_code/agents/warehouse/local_run.py +71 -0
  90. aria_code/agents/warehouse/local_snapshot.py +132 -0
  91. aria_code/agents/warehouse/logistics_cost.py +84 -0
  92. aria_code/agents/warehouse/logistics_sync.py +21 -0
  93. aria_code/agents/warehouse/navigation.schema.json +110 -0
  94. aria_code/agents/warehouse/task_agent.py +172 -0
  95. aria_code/agents/warehouse/workflow.py +31 -0
  96. aria_code/aliyun_data_client.py +4 -0
  97. aria_code/apps/README.md +12 -0
  98. aria_code/apps/__init__.py +2 -0
  99. aria_code/apps/channels/README.md +9 -0
  100. aria_code/apps/channels/__init__.py +17 -0
  101. aria_code/apps/channels/approvals.py +11 -0
  102. aria_code/apps/channels/conversation.py +11 -0
  103. aria_code/apps/channels/digest.py +11 -0
  104. aria_code/apps/channels/intake.py +92 -0
  105. aria_code/apps/channels/registry.py +11 -0
  106. aria_code/apps/channels/tradingview.py +94 -0
  107. aria_code/apps/cli/README.md +13 -0
  108. aria_code/apps/cli/__init__.py +2 -0
  109. aria_code/apps/cli/_optional.py +120 -0
  110. aria_code/apps/cli/app_server.py +656 -0
  111. aria_code/apps/cli/auto_update.py +125 -0
  112. aria_code/apps/cli/bootstrap.py +206 -0
  113. aria_code/apps/cli/broker_render.py +206 -0
  114. aria_code/apps/cli/chat_turn.py +1327 -0
  115. aria_code/apps/cli/cloud_models.py +231 -0
  116. aria_code/apps/cli/codegen_paths.py +29 -0
  117. aria_code/apps/cli/commands/__init__.py +34 -0
  118. aria_code/apps/cli/commands/_business_render.py +78 -0
  119. aria_code/apps/cli/commands/_ui.py +71 -0
  120. aria_code/apps/cli/commands/analysis_cmds.py +378 -0
  121. aria_code/apps/cli/commands/ashare_prediction_cmds.py +327 -0
  122. aria_code/apps/cli/commands/auth_cmds.py +215 -0
  123. aria_code/apps/cli/commands/backtest_cmds.py +2518 -0
  124. aria_code/apps/cli/commands/broker_cmds.py +1236 -0
  125. aria_code/apps/cli/commands/business_workflow_cmds.py +379 -0
  126. aria_code/apps/cli/commands/canvas_cmds.py +77 -0
  127. aria_code/apps/cli/commands/catalog.py +189 -0
  128. aria_code/apps/cli/commands/core_cmds.py +2748 -0
  129. aria_code/apps/cli/commands/data_cmds.py +521 -0
  130. aria_code/apps/cli/commands/diagnostic_cmds.py +285 -0
  131. aria_code/apps/cli/commands/diagnostic_ops_cmds.py +813 -0
  132. aria_code/apps/cli/commands/engineering_cmds.py +399 -0
  133. aria_code/apps/cli/commands/file_cmds.py +312 -0
  134. aria_code/apps/cli/commands/finance_service_cmds.py +60 -0
  135. aria_code/apps/cli/commands/fx_commodity_cmds.py +123 -0
  136. aria_code/apps/cli/commands/market.py +544 -0
  137. aria_code/apps/cli/commands/market_cmds.py +1419 -0
  138. aria_code/apps/cli/commands/market_context.py +432 -0
  139. aria_code/apps/cli/commands/market_render.py +7 -0
  140. aria_code/apps/cli/commands/model_cmds.py +2374 -0
  141. aria_code/apps/cli/commands/ops_cmds.py +721 -0
  142. aria_code/apps/cli/commands/orchestrator_cmds.py +181 -0
  143. aria_code/apps/cli/commands/pdf_export_cmds.py +125 -0
  144. aria_code/apps/cli/commands/portfolio_cmds.py +1316 -0
  145. aria_code/apps/cli/commands/report.py +476 -0
  146. aria_code/apps/cli/commands/scaffold_templates.py +617 -0
  147. aria_code/apps/cli/commands/session_cmds.py +236 -0
  148. aria_code/apps/cli/commands/session_ux_cmds.py +359 -0
  149. aria_code/apps/cli/commands/team.py +723 -0
  150. aria_code/apps/cli/commands/team_render.py +8 -0
  151. aria_code/apps/cli/commands/ui_cmds.py +401 -0
  152. aria_code/apps/cli/commands/warehouse_cmds.py +297 -0
  153. aria_code/apps/cli/commands/workflow_cmds.py +629 -0
  154. aria_code/apps/cli/commands/workspace_cmds.py +1543 -0
  155. aria_code/apps/cli/config_paths.py +73 -0
  156. aria_code/apps/cli/config_store.py +158 -0
  157. aria_code/apps/cli/constants.py +88 -0
  158. aria_code/apps/cli/context.py +34 -0
  159. aria_code/apps/cli/conversation_policy.py +53 -0
  160. aria_code/apps/cli/deterministic.py +200 -0
  161. aria_code/apps/cli/direct.py +48 -0
  162. aria_code/apps/cli/earnings_view.py +172 -0
  163. aria_code/apps/cli/endpoint_migration.py +64 -0
  164. aria_code/apps/cli/exec_events.py +255 -0
  165. aria_code/apps/cli/file_references.py +155 -0
  166. aria_code/apps/cli/finance_service_catalog.py +111 -0
  167. aria_code/apps/cli/football_reports.py +231 -0
  168. aria_code/apps/cli/github_app_auth.py +135 -0
  169. aria_code/apps/cli/google_login.py +239 -0
  170. aria_code/apps/cli/handlers/__init__.py +11 -0
  171. aria_code/apps/cli/handlers/broker_handlers.py +122 -0
  172. aria_code/apps/cli/handlers/chart_handlers.py +1314 -0
  173. aria_code/apps/cli/handlers/market_handlers.py +2570 -0
  174. aria_code/apps/cli/handlers/realty_handlers.py +114 -0
  175. aria_code/apps/cli/handlers/sports_handlers.py +22 -0
  176. aria_code/apps/cli/handlers/strategy_advice.py +82 -0
  177. aria_code/apps/cli/headless.py +352 -0
  178. aria_code/apps/cli/helpers.py +326 -0
  179. aria_code/apps/cli/hooks.py +180 -0
  180. aria_code/apps/cli/i18n.py +310 -0
  181. aria_code/apps/cli/intent.py +136 -0
  182. aria_code/apps/cli/intent_router.py +305 -0
  183. aria_code/apps/cli/intent_shadow.py +72 -0
  184. aria_code/apps/cli/intent_signals.py +347 -0
  185. aria_code/apps/cli/lifecycle_hooks.py +48 -0
  186. aria_code/apps/cli/local_tool_schemas.py +550 -0
  187. aria_code/apps/cli/main.py +39 -0
  188. aria_code/apps/cli/market_hours.py +100 -0
  189. aria_code/apps/cli/market_metadata.py +135 -0
  190. aria_code/apps/cli/market_universe.py +487 -0
  191. aria_code/apps/cli/message_processing.py +310 -0
  192. aria_code/apps/cli/mixin_binding.py +32 -0
  193. aria_code/apps/cli/model_catalog.py +652 -0
  194. aria_code/apps/cli/model_probe.py +169 -0
  195. aria_code/apps/cli/model_retirement.py +65 -0
  196. aria_code/apps/cli/native_branding.py +12 -0
  197. aria_code/apps/cli/native_bridge.py +118 -0
  198. aria_code/apps/cli/native_entry.py +58 -0
  199. aria_code/apps/cli/pdf_report.py +977 -0
  200. aria_code/apps/cli/plan_mode.py +139 -0
  201. aria_code/apps/cli/plotly_html.py +15 -0
  202. aria_code/apps/cli/prediction_feedback.py +202 -0
  203. aria_code/apps/cli/preflight.py +502 -0
  204. aria_code/apps/cli/project_aria.py +60 -0
  205. aria_code/apps/cli/prompt_assembly.py +78 -0
  206. aria_code/apps/cli/prompts/__init__.py +0 -0
  207. aria_code/apps/cli/prompts/coding.py +71 -0
  208. aria_code/apps/cli/prompts/select.py +193 -0
  209. aria_code/apps/cli/prompts/system_prompts.py +562 -0
  210. aria_code/apps/cli/prompts/ui.py +436 -0
  211. aria_code/apps/cli/provider_endpoints.py +237 -0
  212. aria_code/apps/cli/provider_keys.py +73 -0
  213. aria_code/apps/cli/providers/__init__.py +1 -0
  214. aria_code/apps/cli/providers/base.py +775 -0
  215. aria_code/apps/cli/providers/chat_routing.py +139 -0
  216. aria_code/apps/cli/providers/collaboration.py +98 -0
  217. aria_code/apps/cli/providers/llm/__init__.py +1 -0
  218. aria_code/apps/cli/providers/llm/offline_responses.py +68 -0
  219. aria_code/apps/cli/providers/llm/ollama_stream.py +1574 -0
  220. aria_code/apps/cli/providers/llm/response_cache.py +60 -0
  221. aria_code/apps/cli/providers/llm/sse_stream.py +298 -0
  222. aria_code/apps/cli/providers/runtime_bridge.py +586 -0
  223. aria_code/apps/cli/providers/vertexai_stream.py +592 -0
  224. aria_code/apps/cli/release_download.py +159 -0
  225. aria_code/apps/cli/review_runner.py +111 -0
  226. aria_code/apps/cli/runtime_consumer.py +769 -0
  227. aria_code/apps/cli/sandbox.py +32 -0
  228. aria_code/apps/cli/session_export.py +120 -0
  229. aria_code/apps/cli/session_jsonl.py +208 -0
  230. aria_code/apps/cli/session_refresh.py +123 -0
  231. aria_code/apps/cli/session_store.py +125 -0
  232. aria_code/apps/cli/skills_catalog.py +273 -0
  233. aria_code/apps/cli/task_isolation.py +211 -0
  234. aria_code/apps/cli/terminal_chrome.py +412 -0
  235. aria_code/apps/cli/todo_tracker.py +190 -0
  236. aria_code/apps/cli/tool_executor.py +932 -0
  237. aria_code/apps/cli/tool_registry.py +34 -0
  238. aria_code/apps/cli/tool_scope.py +113 -0
  239. aria_code/apps/cli/tools/__init__.py +40 -0
  240. aria_code/apps/cli/tools/context.py +46 -0
  241. aria_code/apps/cli/tools/file_tools.py +181 -0
  242. aria_code/apps/cli/tools/market_tools.py +626 -0
  243. aria_code/apps/cli/tools/notebook_tools.py +111 -0
  244. aria_code/apps/cli/tools/system_tools.py +656 -0
  245. aria_code/apps/cli/tools/write_tools.py +961 -0
  246. aria_code/apps/cli/tradingview_bridge.py +529 -0
  247. aria_code/apps/cli/transactions.py +269 -0
  248. aria_code/apps/cli/turn_planning.py +137 -0
  249. aria_code/apps/cli/update_check.py +257 -0
  250. aria_code/apps/cli/updater.py +373 -0
  251. aria_code/apps/cli/utils/__init__.py +0 -0
  252. aria_code/apps/cli/utils/market_detect.py +1663 -0
  253. aria_code/apps/cli/web_login.py +136 -0
  254. aria_code/apps/cli/workflow_runner.py +127 -0
  255. aria_code/apps/cli/workspace_route.py +121 -0
  256. aria_code/apps/daemon/README.md +14 -0
  257. aria_code/apps/vscode/README.md +115 -0
  258. aria_code/apps/vscode/package.json +70 -0
  259. aria_code/aria_cli.py +5244 -0
  260. aria_code/aria_daemon.py +1372 -0
  261. aria_code/aria_feishu_bot.py +16 -0
  262. aria_code/aria_mcp_server.py +61 -0
  263. aria_code/aria_relay_client.py +4 -0
  264. aria_code/aria_telegram_bot.py +11 -0
  265. aria_code/ariarc.py +385 -0
  266. aria_code/artifacts.py +581 -0
  267. aria_code/backtest_engine.py +4 -0
  268. aria_code/backtest_report.py +4 -0
  269. aria_code/brokers/__init__.py +78 -0
  270. aria_code/brokers/automation.py +193 -0
  271. aria_code/brokers/base.py +231 -0
  272. aria_code/brokers/capabilities.py +264 -0
  273. aria_code/brokers/cn/__init__.py +10 -0
  274. aria_code/brokers/cn/easytrader_broker.py +193 -0
  275. aria_code/brokers/cn/futu_broker.py +194 -0
  276. aria_code/brokers/cn/longbridge_broker.py +190 -0
  277. aria_code/brokers/cn/tiger_broker.py +196 -0
  278. aria_code/brokers/cn/xtquant_broker.py +225 -0
  279. aria_code/brokers/config.py +414 -0
  280. aria_code/brokers/intl/__init__.py +5 -0
  281. aria_code/brokers/intl/alpaca_broker.py +183 -0
  282. aria_code/brokers/intl/ibkr_broker.py +215 -0
  283. aria_code/brokers/intl/trading212_broker.py +183 -0
  284. aria_code/brokers/intl/webull_broker.py +156 -0
  285. aria_code/brokers/paper_broker.py +266 -0
  286. aria_code/brokers/planning.py +296 -0
  287. aria_code/brokers/registry.py +213 -0
  288. aria_code/brokers/trading.py +267 -0
  289. aria_code/canva_client.py +4 -0
  290. aria_code/change_store.py +127 -0
  291. aria_code/clients/__init__.py +0 -0
  292. aria_code/clients/aliyun_data_client.py +660 -0
  293. aria_code/clients/aria_relay_client.py +16 -0
  294. aria_code/clients/canva_client.py +284 -0
  295. aria_code/clients/figma_client.py +100 -0
  296. aria_code/clients/football_data_client.py +1671 -0
  297. aria_code/clients/kling_video_client.py +182 -0
  298. aria_code/clients/market_data_client.py +1985 -0
  299. aria_code/clients/openai_image_client.py +242 -0
  300. aria_code/clients/runway_video_client.py +157 -0
  301. aria_code/clients/warehouse_erp_client.py +105 -0
  302. aria_code/cloud_memory.py +190 -0
  303. aria_code/command_safety.py +19 -0
  304. aria_code/computer_use_server.py +276 -0
  305. aria_code/computer_use_tools.py +4 -0
  306. aria_code/dashboard_generator.py +579 -0
  307. aria_code/data_analysis_tools.py +4 -0
  308. aria_code/data_cleaner.py +483 -0
  309. aria_code/data_service.py +513 -0
  310. aria_code/datasources/__init__.py +23 -0
  311. aria_code/datasources/base.py +166 -0
  312. aria_code/datasources/router.py +253 -0
  313. aria_code/datasources/sec_statements.py +217 -0
  314. aria_code/datasources/sources/__init__.py +15 -0
  315. aria_code/datasources/sources/akshare_source.py +269 -0
  316. aria_code/datasources/sources/alpha_vantage_source.py +203 -0
  317. aria_code/datasources/sources/edgar_source.py +219 -0
  318. aria_code/datasources/sources/finnhub_source.py +198 -0
  319. aria_code/datasources/sources/fred_source.py +223 -0
  320. aria_code/datasources/sources/tushare_source.py +143 -0
  321. aria_code/datasources/sources/web_scraper_source.py +278 -0
  322. aria_code/datasources/sources/world_bank_source.py +206 -0
  323. aria_code/datasources/sources/yfinance_source.py +152 -0
  324. aria_code/doctor.py +860 -0
  325. aria_code/domain/__init__.py +0 -0
  326. aria_code/domain/_finance_core/__init__.py +5 -0
  327. aria_code/domain/_finance_core/backtest_engine.py +325 -0
  328. aria_code/domain/_finance_core/performance_stats.py +101 -0
  329. aria_code/domain/backtest_engine.py +75 -0
  330. aria_code/domain/backtest_report.py +488 -0
  331. aria_code/domain/finance_formulas.py +389 -0
  332. aria_code/domain/performance_stats.py +6 -0
  333. aria_code/domain/portfolio_ledger.py +307 -0
  334. aria_code/domain/strategy_vault.py +421 -0
  335. aria_code/evals/__init__.py +37 -0
  336. aria_code/evals/behavior.py +113 -0
  337. aria_code/evals/gap.py +93 -0
  338. aria_code/evals/harness.py +949 -0
  339. aria_code/evals/review_probe.py +132 -0
  340. aria_code/evals/runner.py +425 -0
  341. aria_code/evals/scorecard.py +322 -0
  342. aria_code/evals/summary.py +125 -0
  343. aria_code/external_agent_runner.py +115 -0
  344. aria_code/figma_client.py +4 -0
  345. aria_code/file_analysis_tools.py +4 -0
  346. aria_code/finance_formulas.py +4 -0
  347. aria_code/football_data_client.py +4 -0
  348. aria_code/image_gen_tools.py +4 -0
  349. aria_code/intent_classifier.py +459 -0
  350. aria_code/kling_video_client.py +4 -0
  351. aria_code/licensing.py +151 -0
  352. aria_code/local_finance_tools.py +4 -0
  353. aria_code/local_image_provider.py +4 -0
  354. aria_code/local_llm_provider.py +4 -0
  355. aria_code/macro_tools.py +4 -0
  356. aria_code/markdown_pdf.py +289 -0
  357. aria_code/market_data_client.py +4 -0
  358. aria_code/mcp_client.py +744 -0
  359. aria_code/memory_manager.py +273 -0
  360. aria_code/model_capability.py +512 -0
  361. aria_code/notification_tools.py +4 -0
  362. aria_code/openai_image_client.py +4 -0
  363. aria_code/packages/__init__.py +26 -0
  364. aria_code/packages/adk_bridge/__init__.py +11 -0
  365. aria_code/packages/adk_bridge/code_review_tools.py +49 -0
  366. aria_code/packages/adk_bridge/market_tools.py +125 -0
  367. aria_code/packages/aria_agents/__init__.py +5 -0
  368. aria_code/packages/aria_agents/manifest.py +78 -0
  369. aria_code/packages/aria_core/__init__.py +34 -0
  370. aria_code/packages/aria_core/architecture.py +269 -0
  371. aria_code/packages/aria_core/export.py +147 -0
  372. aria_code/packages/aria_core/manifest.py +65 -0
  373. aria_code/packages/aria_core/paths.py +57 -0
  374. aria_code/packages/aria_core/secure_file.py +68 -0
  375. aria_code/packages/aria_infra/__init__.py +15 -0
  376. aria_code/packages/aria_infra/arthera.py +58 -0
  377. aria_code/packages/aria_infra/doctor.py +246 -0
  378. aria_code/packages/aria_infra/product.py +40 -0
  379. aria_code/packages/aria_mcp/__init__.py +25 -0
  380. aria_code/packages/aria_mcp/bridge.py +232 -0
  381. aria_code/packages/aria_mcp/circuit.py +82 -0
  382. aria_code/packages/aria_mcp/config.py +162 -0
  383. aria_code/packages/aria_mcp/installer.py +95 -0
  384. aria_code/packages/aria_mcp/server.py +1705 -0
  385. aria_code/packages/aria_mcp/tools.py +81 -0
  386. aria_code/packages/aria_sdk/__init__.py +19 -0
  387. aria_code/packages/aria_sdk/client.py +393 -0
  388. aria_code/packages/aria_sdk/providers.py +70 -0
  389. aria_code/packages/aria_sdk/streaming.py +75 -0
  390. aria_code/packages/aria_sdk/types.py +86 -0
  391. aria_code/packages/aria_services/__init__.py +92 -0
  392. aria_code/packages/aria_services/cache.py +60 -0
  393. aria_code/packages/aria_services/context.py +356 -0
  394. aria_code/packages/aria_services/context_checkpoints.py +157 -0
  395. aria_code/packages/aria_services/data.py +11 -0
  396. aria_code/packages/aria_services/provider_health.py +304 -0
  397. aria_code/packages/aria_services/references.py +247 -0
  398. aria_code/packages/aria_services/registry.py +249 -0
  399. aria_code/packages/aria_services/research_protocol.py +137 -0
  400. aria_code/packages/aria_services/research_quality.py +186 -0
  401. aria_code/packages/aria_services/settings.py +160 -0
  402. aria_code/packages/aria_services/usage.py +151 -0
  403. aria_code/packages/aria_skills/__init__.py +46 -0
  404. aria_code/packages/aria_skills/catalog.py +149 -0
  405. aria_code/packages/aria_skills/loader.py +455 -0
  406. aria_code/packages/aria_skills/registry.py +84 -0
  407. aria_code/packages/aria_tools/__init__.py +5 -0
  408. aria_code/packages/aria_tools/financial/__init__.py +5 -0
  409. aria_code/packages/aria_tools/financial/_paths.py +92 -0
  410. aria_code/packages/aria_tools/registry.py +129 -0
  411. aria_code/packages/quant_engine/__init__.py +33 -0
  412. aria_code/packages/quant_engine/_namespace.py +24 -0
  413. aria_code/packages/quant_engine/backtest/__init__.py +10 -0
  414. aria_code/packages/quant_engine/backtest/core.py +53 -0
  415. aria_code/packages/quant_engine/backtest/engine.py +102 -0
  416. aria_code/packages/quant_engine/portfolio/__init__.py +9 -0
  417. aria_code/packages/quant_engine/portfolio/optimizer.py +85 -0
  418. aria_code/packages/quant_engine/sports/__init__.py +76 -0
  419. aria_code/packages/quant_engine/sports/calibrator.py +354 -0
  420. aria_code/packages/quant_engine/sports/dixon_coles.py +234 -0
  421. aria_code/packages/quant_engine/sports/elo.py +300 -0
  422. aria_code/packages/quant_engine/sports/form.py +188 -0
  423. aria_code/packages/quant_engine/sports/h2h.py +195 -0
  424. aria_code/packages/quant_engine/sports/predictor.py +312 -0
  425. aria_code/packages/quant_engine/sports/tracker.py +665 -0
  426. aria_code/packages/quant_engine/stochastic/__init__.py +31 -0
  427. aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +195 -0
  428. aria_code/packages/quant_engine/stochastic/ito_calculus.py +477 -0
  429. aria_code/packages/quant_engine/stochastic/kelly_criterion.py +181 -0
  430. aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +95 -0
  431. aria_code/packages/quant_engine/stochastic/options_pricing.py +576 -0
  432. aria_code/packages/quant_engine/stochastic/stochastic_processes.py +90 -0
  433. aria_code/packs/__init__.py +85 -0
  434. aria_code/packs/base.py +168 -0
  435. aria_code/packs/finance/__init__.py +250 -0
  436. aria_code/packs/healthcare/__init__.py +40 -0
  437. aria_code/packs/logistics/__init__.py +171 -0
  438. aria_code/packs/payments/__init__.py +139 -0
  439. aria_code/packs/realty/__init__.py +190 -0
  440. aria_code/packs/registry.py +202 -0
  441. aria_code/packs/rules.py +90 -0
  442. aria_code/plan_utils.py +194 -0
  443. aria_code/plugin_loader.py +328 -0
  444. aria_code/portfolio_ledger.py +4 -0
  445. aria_code/preview_server.py +449 -0
  446. aria_code/privacy/__init__.py +5 -0
  447. aria_code/privacy/feedback.py +123 -0
  448. aria_code/project_review.py +278 -0
  449. aria_code/project_review_api.py +235 -0
  450. aria_code/project_review_server.py +18 -0
  451. aria_code/project_tools.py +4 -0
  452. aria_code/providers/__init__.py +30 -0
  453. aria_code/providers/google_video_provider.py +256 -0
  454. aria_code/providers/llm/__init__.py +19 -0
  455. aria_code/providers/llm/anthropic.py +184 -0
  456. aria_code/providers/llm/arthera_gateway.py +90 -0
  457. aria_code/providers/llm/autoconfig.py +213 -0
  458. aria_code/providers/llm/base.py +139 -0
  459. aria_code/providers/llm/custom.py +158 -0
  460. aria_code/providers/llm/ollama.py +137 -0
  461. aria_code/providers/llm/openai_compat.py +350 -0
  462. aria_code/providers/llm/registry.py +457 -0
  463. aria_code/providers/local_image_provider.py +202 -0
  464. aria_code/providers/local_llm_provider.py +549 -0
  465. aria_code/providers/ollama_models.py +79 -0
  466. aria_code/providers/openai_params.py +32 -0
  467. aria_code/providers/tool_messages.py +100 -0
  468. aria_code/realty_data_tools.py +4 -0
  469. aria_code/report_exporters.py +150 -0
  470. aria_code/report_generator.py +1764 -0
  471. aria_code/review_service.py +497 -0
  472. aria_code/runtime/__init__.py +176 -0
  473. aria_code/runtime/acceptance.py +632 -0
  474. aria_code/runtime/agent_loop.py +1851 -0
  475. aria_code/runtime/agent_profiles.py +75 -0
  476. aria_code/runtime/approval.py +71 -0
  477. aria_code/runtime/baseline.py +219 -0
  478. aria_code/runtime/budget.py +232 -0
  479. aria_code/runtime/checkpoints.py +481 -0
  480. aria_code/runtime/consult.py +65 -0
  481. aria_code/runtime/contract.py +282 -0
  482. aria_code/runtime/delivery.py +432 -0
  483. aria_code/runtime/events.py +113 -0
  484. aria_code/runtime/gateway.py +167 -0
  485. aria_code/runtime/lsp.py +484 -0
  486. aria_code/runtime/native_index.py +153 -0
  487. aria_code/runtime/orchestrator.py +55 -0
  488. aria_code/runtime/processes.py +343 -0
  489. aria_code/runtime/project_graph.py +614 -0
  490. aria_code/runtime/repo_map.py +712 -0
  491. aria_code/runtime/research_bundle.py +105 -0
  492. aria_code/runtime/review.py +269 -0
  493. aria_code/runtime/run_state.py +127 -0
  494. aria_code/runtime/run_store.py +522 -0
  495. aria_code/runtime/scoped_runs.py +113 -0
  496. aria_code/runtime/self_healing.py +422 -0
  497. aria_code/runtime/semantic_diff.py +171 -0
  498. aria_code/runtime/subagent.py +721 -0
  499. aria_code/runtime/symbol_edit.py +117 -0
  500. aria_code/runtime/task_brief.py +46 -0
  501. aria_code/runtime/task_context.py +145 -0
  502. aria_code/runtime/task_ledger.py +108 -0
  503. aria_code/runtime/task_orchestrator.py +90 -0
  504. aria_code/runtime/task_outcome.py +33 -0
  505. aria_code/runtime/task_verification.py +266 -0
  506. aria_code/runtime/task_worktree.py +448 -0
  507. aria_code/runtime/tool_executor.py +329 -0
  508. aria_code/runtime/tool_policy.py +107 -0
  509. aria_code/runtime/transactions.py +216 -0
  510. aria_code/runtime/windows_job.py +115 -0
  511. aria_code/runtime/workflows.py +222 -0
  512. aria_code/runtime/worktrees.py +215 -0
  513. aria_code/runway_video_client.py +4 -0
  514. aria_code/safety/__init__.py +27 -0
  515. aria_code/safety/client_isolation.py +178 -0
  516. aria_code/safety/permissions.py +339 -0
  517. aria_code/safety/risk.py +699 -0
  518. aria_code/safety/sandbox.py +148 -0
  519. aria_code/safety/service.py +102 -0
  520. aria_code/service_endpoints.py +14 -0
  521. aria_code/setup_wizard.py +684 -0
  522. aria_code/spreadsheet_tools.py +4 -0
  523. aria_code/strategy_vault.py +4 -0
  524. aria_code/tools/__init__.py +0 -0
  525. aria_code/tools/artifact_tools.py +252 -0
  526. aria_code/tools/broker_tools.py +92 -0
  527. aria_code/tools/build_quant_engine.py +97 -0
  528. aria_code/tools/code_audit_tools.py +192 -0
  529. aria_code/tools/computer_use_tools.py +509 -0
  530. aria_code/tools/data_analysis_tools.py +831 -0
  531. aria_code/tools/enterprise_finance_tools.py +202 -0
  532. aria_code/tools/extended_tools.py +240 -0
  533. aria_code/tools/file_analysis_tools.py +880 -0
  534. aria_code/tools/image_gen_tools.py +114 -0
  535. aria_code/tools/local_finance_tools.py +3488 -0
  536. aria_code/tools/logistics_carriers.py +11 -0
  537. aria_code/tools/logistics_inventory.py +11 -0
  538. aria_code/tools/logistics_io.py +11 -0
  539. aria_code/tools/logistics_tenancy.py +11 -0
  540. aria_code/tools/logistics_tools.py +11 -0
  541. aria_code/tools/macro_tools.py +412 -0
  542. aria_code/tools/notification_tools.py +249 -0
  543. aria_code/tools/project_tools.py +525 -0
  544. aria_code/tools/realty_data_tools.py +662 -0
  545. aria_code/tools/spreadsheet_tools.py +399 -0
  546. aria_code/tools/stripe_tools.py +115 -0
  547. aria_code/tools/video_tools.py +500 -0
  548. aria_code/training/__init__.py +1 -0
  549. aria_code/training/compare.py +117 -0
  550. aria_code/training/prelude_commands.py +111 -0
  551. aria_code/training/prelude_eval.py +390 -0
  552. aria_code/training/prelude_real.py +183 -0
  553. aria_code/training/prelude_train.py +248 -0
  554. aria_code/training/sft_dataset.py +230 -0
  555. aria_code/training/trajectory_dataset.py +263 -0
  556. aria_code/ui/__init__.py +105 -0
  557. aria_code/ui/banner.py +404 -0
  558. aria_code/ui/completer.py +571 -0
  559. aria_code/ui/console.py +285 -0
  560. aria_code/ui/input_box.py +505 -0
  561. aria_code/ui/mentions.py +206 -0
  562. aria_code/ui/picker.py +248 -0
  563. aria_code/ui/render/__init__.py +11 -0
  564. aria_code/ui/render/actions.py +297 -0
  565. aria_code/ui/render/finance.py +1732 -0
  566. aria_code/ui/render/market.py +253 -0
  567. aria_code/ui/render/output.py +954 -0
  568. aria_code/ui/render/responsive.py +75 -0
  569. aria_code/ui/render/team.py +367 -0
  570. aria_code/ui/robot.py +239 -0
  571. aria_code/ui/startup_dashboard.py +110 -0
  572. aria_code/video_analysis.py +147 -0
  573. aria_code/video_editor.py +518 -0
  574. aria_code/video_workflow/__init__.py +8 -0
  575. aria_code/video_workflow/__main__.py +61 -0
  576. aria_code/video_workflow/engines/__init__.py +18 -0
  577. aria_code/video_workflow/engines/base.py +69 -0
  578. aria_code/video_workflow/engines/custom_model.py +204 -0
  579. aria_code/video_workflow/engines/google_veo.py +94 -0
  580. aria_code/video_workflow/engines/local_engine.py +71 -0
  581. aria_code/video_workflow/engines/registry.py +98 -0
  582. aria_code/video_workflow/google_models.py +278 -0
  583. aria_code/video_workflow/music/__init__.py +5 -0
  584. aria_code/video_workflow/music/foley_service.py +132 -0
  585. aria_code/video_workflow/music/service.py +212 -0
  586. aria_code/video_workflow/pipeline.py +620 -0
  587. aria_code/video_workflow/plan.py +202 -0
  588. aria_code/video_workflow/session.py +297 -0
  589. aria_code/workspace/__init__.py +6 -0
  590. aria_code/workspace/files.py +219 -0
  591. aria_code/workspace/verify.py +167 -0
  592. aria_code/workspace_changes.py +199 -0
  593. aria_code/workspace_service.py +196 -0
  594. aria_code/workspace_tools.py +150 -0
  595. aria_code-0.167.0.dist-info/METADATA +330 -0
  596. aria_code-0.167.0.dist-info/RECORD +601 -0
  597. aria_code-0.167.0.dist-info/WHEEL +5 -0
  598. aria_code-0.167.0.dist-info/entry_points.txt +5 -0
  599. aria_code-0.167.0.dist-info/licenses/LICENSE +201 -0
  600. aria_code-0.167.0.dist-info/licenses/NOTICE +49 -0
  601. aria_code-0.167.0.dist-info/top_level.txt +2 -0
@@ -0,0 +1,721 @@
1
+ """OpsCommandsMixin — watch, services, plan, git, and GitHub helper commands."""
2
+
3
+ from __future__ import annotations
4
+
5
+
6
+ import json
7
+ import asyncio
8
+ import datetime
9
+ import time
10
+ import shlex
11
+ from typing import Dict, Any, Optional
12
+
13
+ # display_path lives in ui.render.output; aria_cli only re-exports it under a
14
+ # private alias, so going through aria_cli was a pointless second hop.
15
+ from aria_code.ui.render.output import display_path as _display_path
16
+ def _tool_github(*args, **kwargs):
17
+ from aria_cli import _tool_github as fn
18
+ return fn(*args, **kwargs)
19
+ def _get_LOCAL_TOOLS():
20
+ # Owned by apps/cli/tool_registry.py; aria_cli fills it in place.
21
+ from ..tool_registry import LOCAL_TOOLS as val
22
+ return val
23
+ def _get_provider_key(*args, **kwargs):
24
+ from aria_code.apps.cli.provider_keys import get_provider_key as fn
25
+ return fn(*args, **kwargs)
26
+ def _tool_run_command(*args, **kwargs):
27
+ from aria_cli import _tool_run_command as fn
28
+ return fn(*args, **kwargs)
29
+ def _tool_write_file(*args, **kwargs):
30
+ from aria_cli import _tool_write_file as fn
31
+ return fn(*args, **kwargs)
32
+ def _get_Syntax():
33
+ from ._ui import Syntax as val
34
+ return val
35
+ def _get__SYNTAX_THEME():
36
+ from aria_cli import _SYNTAX_THEME as val
37
+ return val
38
+
39
+ import json
40
+ import asyncio
41
+ import datetime
42
+ import time
43
+ import shlex
44
+ import sys
45
+ import os
46
+ from typing import Dict, Any, Optional
47
+
48
+
49
+ import json
50
+ import asyncio
51
+ import datetime
52
+ import time
53
+ import shlex
54
+ import sys
55
+ import os
56
+ from typing import Dict, Any, Optional
57
+
58
+
59
+ class OpsCommandsMixin:
60
+ """Mixin: operational and workflow helper commands."""
61
+
62
+ def cmd_watch(self, args: str):
63
+ parts = args.split() if args else ["list"]
64
+ action = parts[0].lower() if parts else "list"
65
+ watchlist = self.terminal.config.get("watchlist", [])
66
+
67
+ if action == "add" and len(parts) > 1:
68
+ symbol = parts[1].upper()
69
+ if symbol not in watchlist:
70
+ watchlist.append(symbol)
71
+ self.terminal.config["watchlist"] = watchlist
72
+ self.context.save_config(self.terminal.config)
73
+ self.context.console.print(f"[green]Added {symbol} to watchlist[/green]" if self.context.has_rich
74
+ else f"Added {symbol}")
75
+ else:
76
+ self.context.console.print(f"[dim]{symbol} already in watchlist[/dim]" if self.context.has_rich
77
+ else f"{symbol} already in watchlist")
78
+
79
+ elif action == "remove" and len(parts) > 1:
80
+ symbol = parts[1].upper()
81
+ if symbol in watchlist:
82
+ watchlist.remove(symbol)
83
+ self.terminal.config["watchlist"] = watchlist
84
+ self.context.save_config(self.terminal.config)
85
+ self.context.console.print(f"[dim]Removed {symbol} from watchlist[/dim]" if self.context.has_rich
86
+ else f"Removed {symbol}")
87
+ else:
88
+ self.context.console.print(f"[red]{symbol} not in watchlist[/red]" if self.context.has_rich
89
+ else f"{symbol} not in watchlist")
90
+
91
+ else:
92
+ if self.context.has_rich:
93
+ if watchlist:
94
+ self.context.console.print(f" [dim]Watchlist:[/dim] {', '.join(watchlist)}")
95
+ else:
96
+ self.context.console.print(" [dim]Watchlist: Empty[/dim]")
97
+ else:
98
+ print(f"Watchlist: {', '.join(watchlist)}")
99
+
100
+ def cmd_services(self, args: str):
101
+ """Show CLI service tiers and core workflows."""
102
+ provider_summary = None
103
+ try:
104
+ from packages.aria_services.provider_health import GLOBAL_PROVIDER_HEALTH
105
+ provider_summary = GLOBAL_PROVIDER_HEALTH.summary()
106
+ except Exception:
107
+ provider_summary = None
108
+
109
+ cfg = getattr(self.terminal, "config", {}) or {}
110
+ auto_compact = bool(cfg.get("auto_compact_context", True))
111
+ try:
112
+ auto_compact_threshold = int(float(cfg.get("auto_compact_threshold", 0.78)) * 100)
113
+ except Exception:
114
+ auto_compact_threshold = 78
115
+
116
+ def _key_status(provider: str) -> str:
117
+ try:
118
+ return "configured" if _get_provider_key(provider) else "not set"
119
+ except Exception:
120
+ return "unknown"
121
+
122
+ runtime_services = [
123
+ ("LLM runtime", cfg.get("model", "unknown"), "local/Ollama with cloud fallback"),
124
+ ("Context manager", f"auto compact {'on' if auto_compact else 'off'} @ {auto_compact_threshold}%", "preflight + post-turn guards"),
125
+ ("Market data", "DataService", "quote/history/fundamentals/TA + provider health"),
126
+ ("Charts/reports", "artifact services", "HTML/PNG charts, dashboards, Markdown/HTML reports"),
127
+ ("News/Web", f"finnhub:{_key_status('finnhub')} · newsapi:{_key_status('newsapi')} · brave:{_key_status('brave')}", "news command + web search fallback"),
128
+ ("Cloud AI/data", f"dashscope:{_key_status('dashscope')} · openai:{_key_status('openai')} · anthropic:{_key_status('anthropic')}", "optional external providers"),
129
+ ("MCP/tools", f"{len(_get_LOCAL_TOOLS())} local tools", "tool loop with repeat-call guard"),
130
+ ]
131
+
132
+ service_groups = [
133
+ (
134
+ "CORE (Standard)",
135
+ [
136
+ "Code agent with local tools (read/write/edit/search/run)",
137
+ "Slash command workflows for quote/analyze/backtest/risk/screen",
138
+ "Session save/load/export and interactive history management",
139
+ "Model switching + thinking mode controls for response depth",
140
+ ],
141
+ ),
142
+ (
143
+ "QUANTUM Automation",
144
+ [
145
+ "Agentic multi-step loop (auto read -> analyze -> edit -> execute)",
146
+ "Auto-recovery guidance for failed commands and code fixes",
147
+ "Strategy generation, backtest reporting, and risk analysis skills",
148
+ "Cross-workspace research sync hooks (session + export pipeline)",
149
+ ],
150
+ ),
151
+ (
152
+ "ENTERPRISE Controls (included in Quantum)",
153
+ [
154
+ "Service health diagnostics (/health) for backend + local model stack",
155
+ "Governed command execution with dangerous-command blocking",
156
+ "Audit-friendly session logs and reproducible command trails",
157
+ "MCP-ready service integration path via external tool endpoints",
158
+ ],
159
+ ),
160
+ ]
161
+
162
+ quick_flow = [
163
+ "/model",
164
+ "/gen-strategy momentum AAPL",
165
+ "/backtest momentum AAPL 2024-01-01 2025-01-01",
166
+ "/risk AAPL",
167
+ "/export md strategy_report.md",
168
+ ]
169
+
170
+ if self.context.has_rich:
171
+ self.context.console.print()
172
+ self.context.console.print("[bold]CLI Services[/bold] [dim](runtime boundaries + workflow)[/dim]")
173
+ self.context.console.print()
174
+ self.context.console.print(" [bold]Runtime Service Map[/bold]")
175
+ for name, status, detail in runtime_services:
176
+ self.context.console.print(f" [dim]{name:<16}[/dim] [bold]{status}[/bold] [dim]{detail}[/dim]")
177
+ if provider_summary is not None:
178
+ color = "green" if provider_summary.status == "ok" else ("red" if provider_summary.status == "err" else "yellow")
179
+ self.context.console.print(f" [dim]{'Provider health':<16}[/dim] [{color}]{provider_summary.status}[/{color}] [dim]{provider_summary.detail}[/dim]")
180
+ self.context.console.print(f" [dim]{'Suggestion':<16}[/dim] [dim]{provider_summary.suggestion}[/dim]")
181
+ self.context.console.print()
182
+ for group_name, items in service_groups:
183
+ self.context.console.print(f" [bold #C08050]{group_name}[/bold #C08050]")
184
+ for item in items:
185
+ self.context.console.print(f" [dim]> {item}[/dim]")
186
+ self.context.console.print()
187
+
188
+ self.context.console.print(" [bold]Quick Start Flow[/bold]")
189
+ for cmd in quick_flow:
190
+ self.context.console.print(f" [bold]{cmd}[/bold]")
191
+ self.context.console.print()
192
+ else:
193
+ print("\nCLI Services (runtime boundaries + workflow)\n")
194
+ print(" Runtime Service Map")
195
+ for name, status, detail in runtime_services:
196
+ print(f" {name:<16} {status} {detail}")
197
+ if provider_summary is not None:
198
+ print(f" {'Provider health':<16} {provider_summary.status} {provider_summary.detail}")
199
+ print(f" {'Suggestion':<16} {provider_summary.suggestion}")
200
+ print()
201
+ for group_name, items in service_groups:
202
+ print(f" {group_name}")
203
+ for item in items:
204
+ print(f" > {item}")
205
+ print()
206
+
207
+ print(" Quick Start Flow")
208
+ for cmd in quick_flow:
209
+ print(f" {cmd}")
210
+ print()
211
+
212
+ def cmd_plan(self, args: str):
213
+ """Create an executable plan and store it for /apply-plan."""
214
+ raw = args.strip()
215
+ if not raw:
216
+ if self.context.has_rich:
217
+ self.context.console.print("[dim]Usage: /plan <steps> — see examples below[/dim]")
218
+ self.context.console.print("[dim] /plan fetch AAPL quote -> generate chart -> write report[/dim]")
219
+ self.context.console.print("[dim] /plan 1. Analyze sentiment 2. Build model 3. Backtest[/dim]")
220
+ else:
221
+ print("Usage: /plan <steps>")
222
+ print(" /plan fetch AAPL quote -> generate chart -> write report")
223
+ print(" /plan 1. Analyze sentiment 2. Build model 3. Backtest")
224
+ return
225
+
226
+ from plan_utils import parse_plan
227
+ plan_steps = parse_plan(raw)
228
+ if not plan_steps:
229
+ self.context.console.print("[dim]No valid steps found[/dim]" if self.context.has_rich else "No valid steps found")
230
+ return
231
+
232
+ self.terminal.pending_plan = [s.description for s in plan_steps]
233
+
234
+ if self.context.has_rich:
235
+ self.context.console.print()
236
+ self.context.console.print(f"[bold]Execution Plan[/bold] [dim]({len(plan_steps)} steps)[/dim]")
237
+ self.context.console.print()
238
+ for s in plan_steps:
239
+ dep_str = f" [dim](after {', '.join(str(d) for d in s.deps)})[/dim]" if s.deps else ""
240
+ label = f" [dim][{s.name}][/dim]" if s.name else ""
241
+ self.context.console.print(f" [dim]{s.index}.[/dim]{label} [bold]{s.description}[/bold]{dep_str}")
242
+ self.context.console.print()
243
+ self.context.console.print("[dim]Run /apply-plan to execute these steps.[/dim]")
244
+ self.context.console.print()
245
+ else:
246
+ print(f"\nExecution Plan ({len(plan_steps)} steps)")
247
+ for s in plan_steps:
248
+ dep_str = f" (after {', '.join(str(d) for d in s.deps)})" if s.deps else ""
249
+ label = f" [{s.name}]" if s.name else ""
250
+ print(f" {s.index}.{label} {s.description}{dep_str}")
251
+ print("Run /apply-plan to execute these steps.\n")
252
+
253
+ def cmd_plan_report(self, args: str):
254
+ """Show or export last plan execution report."""
255
+ rows = list(getattr(self.terminal, "last_plan_results", []) or [])
256
+ if not rows:
257
+ msg = "No plan report available. Run /apply-plan first."
258
+ self.context.console.print(f"[dim]{msg}[/dim]" if self.context.has_rich else msg)
259
+ return
260
+
261
+ parts = args.split()
262
+ open_after = "--open" in parts
263
+ parts = [p for p in parts if p != "--open"]
264
+ fmt = parts[0].lower() if parts else "show"
265
+ out_file = parts[1] if len(parts) > 1 else None
266
+
267
+ if fmt == "show":
268
+ if self.context.has_rich:
269
+ self.context.console.print()
270
+ self.context.console.print("[bold]Last Plan Report[/bold]")
271
+ for idx, row in enumerate(rows, 1):
272
+ status_color = "green" if row["status"] == "completed" else ("yellow" if row["status"] == "blocked" else "red")
273
+ self.context.console.print(
274
+ f" [dim]{idx}.[/dim] [{status_color}]{row['status']}[/{status_color}] "
275
+ f"[bold]{row['step']}[/bold] [dim]({row['duration']}s, exit={row.get('exit_code')})[/dim]"
276
+ )
277
+ if row.get("error"):
278
+ self.context.console.print(f" [red]{row['error']}[/red]")
279
+ self.context.console.print()
280
+ else:
281
+ print("\nLast Plan Report")
282
+ for idx, row in enumerate(rows, 1):
283
+ print(f" {idx}. {row['status']} {row['step']} ({row['duration']}s, exit={row.get('exit_code')})")
284
+ if row.get("error"):
285
+ print(f" ERROR: {row['error']}")
286
+ return
287
+
288
+ if fmt not in {"md", "json"}:
289
+ msg = "Usage: /plan-report [md|json] [file] [--open]"
290
+ self.context.console.print(f"[dim]{msg}[/dim]" if self.context.has_rich else msg)
291
+ return
292
+
293
+ if not out_file:
294
+ out_file = f"plan_report.{fmt}"
295
+
296
+ try:
297
+ if fmt == "json":
298
+ content = json.dumps(rows, ensure_ascii=False, indent=2)
299
+ else:
300
+ md_lines = ["# Plan Execution Report", ""]
301
+ for idx, row in enumerate(rows, 1):
302
+ md_lines.append(
303
+ f"{idx}. **{row['status']}** `{row['step']}` "
304
+ f"({row['duration']}s, exit={row.get('exit_code')})"
305
+ )
306
+ if row.get("error"):
307
+ md_lines.append(f" - Error: {row['error']}")
308
+ md_lines.append("")
309
+ content = "\n".join(md_lines)
310
+
311
+ result = _tool_write_file({"path": out_file, "content": content})
312
+ if result.get("success"):
313
+ saved_path = result["data"]["path"]
314
+ msg = f"Plan report saved to {_display_path(saved_path)}"
315
+ self.context.console.print(f"[green]{msg}[/green]" if self.context.has_rich else msg)
316
+ if open_after:
317
+ self._open_file(saved_path)
318
+ else:
319
+ err = result.get("error", "Failed to save report")
320
+ self.context.console.print(f"[red]{err}[/red]" if self.context.has_rich else err)
321
+ except Exception as e:
322
+ self.context.console.print(f"[red]{e}[/red]" if self.context.has_rich else str(e))
323
+
324
+ def cmd_git(self, args: str):
325
+ """Git helper shortcuts."""
326
+ policy = self.terminal.config.get("command_policy", "safe")
327
+ raw = args.strip()
328
+ if not raw:
329
+ sub = "status"
330
+ sub_args = ""
331
+ else:
332
+ parts = raw.split(maxsplit=1)
333
+ sub = parts[0].lower()
334
+ sub_args = parts[1].strip() if len(parts) > 1 else ""
335
+
336
+ mapping = {
337
+ "status": "git status --short --branch",
338
+ "diff": "git diff --stat",
339
+ "summary": "git status --short --branch && git diff --stat",
340
+ "branch": "git branch -v",
341
+ "stash": "git stash list",
342
+ "remote": "git remote -v",
343
+ }
344
+ if sub == "patch":
345
+ cmd = "git diff" if not sub_args else f"git diff -- {sub_args}"
346
+ elif sub == "log":
347
+ limit = sub_args if sub_args and sub_args.isdigit() else "15"
348
+ cmd = f"git log --oneline --graph --decorate -{limit}"
349
+ elif sub == "commit":
350
+ status_probe = _tool_run_command({"command": "git status --porcelain", "policy": policy})
351
+ if not status_probe.get("success"):
352
+ err = status_probe.get("error", "Failed to inspect git status")
353
+ self.context.console.print(f"[red]{err}[/red]" if self.context.has_rich else err)
354
+ return
355
+
356
+ status_out = status_probe.get("data", {}).get("stdout", "").strip()
357
+ if not status_out:
358
+ msg = "No changes to commit."
359
+ self.context.console.print(f"[dim]{msg}[/dim]" if self.context.has_rich else msg)
360
+ return
361
+
362
+ changed_files = []
363
+ for line in status_out.splitlines():
364
+ if len(line) >= 4:
365
+ changed_files.append(line[3:].strip())
366
+ unique_files = [f for f in changed_files if f]
367
+ total_files = len(unique_files)
368
+ file_preview = ", ".join(unique_files[:5]) if unique_files else "workspace"
369
+ body_summary = f"Files changed: {total_files}"
370
+ body_preview = f"Top files: {file_preview}"
371
+
372
+ if not sub_args:
373
+ files = []
374
+ for line in status_out.splitlines()[:3]:
375
+ if len(line) >= 4:
376
+ files.append(line[3:].strip())
377
+ sample = ", ".join(files) if files else "workspace"
378
+ total = len(status_out.splitlines())
379
+ sub_args = f"chore: update {total} file(s) ({sample})"
380
+ if self.context.has_rich:
381
+ self.context.console.print(f"[dim]Auto commit message:[/dim] {sub_args}")
382
+ else:
383
+ print(f"Auto commit message: {sub_args}")
384
+
385
+ cmd = (
386
+ f"git add -A && git commit "
387
+ f"-m {shlex.quote(sub_args)} "
388
+ f"-m {shlex.quote(body_summary)} "
389
+ f"-m {shlex.quote(body_preview)}"
390
+ )
391
+ elif sub in mapping:
392
+ cmd = mapping[sub]
393
+ else:
394
+ msg = "Usage: /git [status|diff|summary|patch|log [N]|branch|stash|remote|commit <msg>]"
395
+ self.context.console.print(f"[dim]{msg}[/dim]" if self.context.has_rich else msg)
396
+ return
397
+ result = _tool_run_command({"command": cmd, "policy": policy})
398
+ if not result.get("success"):
399
+ self.context.console.print(f"[red]{result.get('error', 'Command failed')}[/red]" if self.context.has_rich
400
+ else result.get("error", "Command failed"))
401
+ return
402
+ data = result.get("data", {})
403
+ out = (data.get("stdout", "") + ("\n" + data.get("stderr", "") if data.get("stderr") else "")).strip()
404
+ if out:
405
+ if self.context.has_rich:
406
+ self.context.console.print(_get_Syntax()(out, "text", theme=_get__SYNTAX_THEME()))
407
+ else:
408
+ print(out)
409
+
410
+ def cmd_gh(self, args: str):
411
+ """GitHub CLI helper — prs | issues | pr N | issue N | search | create-pr | diff N | checks N"""
412
+ raw = args.strip()
413
+ if not raw or raw in ("help", "--help"):
414
+ lines = [
415
+ "Usage: /gh <command>",
416
+ " prs List open pull requests",
417
+ " issues List open issues",
418
+ " pr <N> View pull request #N",
419
+ " issue <N> View issue #N",
420
+ " diff <N> Show PR #N diff",
421
+ " checks <N> Show PR #N CI checks",
422
+ " search <q> Search code in this repo",
423
+ " create-pr Create a PR (follow prompts)",
424
+ " commits [N] Show last N commits (default 10)",
425
+ ]
426
+ for ln in lines:
427
+ self.context.console.print(f" [dim]{ln}[/dim]" if self.context.has_rich else ln)
428
+ return
429
+
430
+ parts = raw.split(maxsplit=1)
431
+ sub = parts[0].lower()
432
+ subarg = parts[1].strip() if len(parts) > 1 else ""
433
+
434
+ def _run(action: str, extra: dict = None):
435
+ p = {"action": action}
436
+ if extra:
437
+ p.update(extra)
438
+ r = _tool_github(p)
439
+ if not r.get("success"):
440
+ msg = r.get("error", "GitHub command failed")
441
+ self.context.console.print(f"[red]{msg}[/red]" if self.context.has_rich else msg)
442
+ return
443
+ data = r.get("data", {})
444
+ out = data.get("stdout", "") if isinstance(data, dict) else str(data)
445
+ if out.strip():
446
+ if self.context.has_rich:
447
+ try:
448
+ import json as _jj
449
+ parsed = _jj.loads(out)
450
+ from rich.pretty import pprint as _pp
451
+ _pp(parsed, expand_all=False)
452
+ except Exception:
453
+ self.context.console.print(_get_Syntax()(out, "text", theme=_get__SYNTAX_THEME()))
454
+ else:
455
+ print(out)
456
+
457
+ if sub in ("prs", "pr_list"):
458
+ _run("list_prs")
459
+ elif sub in ("issues", "issue_list"):
460
+ _run("list_issues")
461
+ elif sub == "pr" and subarg.isdigit():
462
+ _run("view_pr", {"number": int(subarg)})
463
+ elif sub == "issue" and subarg.isdigit():
464
+ _run("view_issue", {"number": int(subarg)})
465
+ elif sub == "diff" and subarg.isdigit():
466
+ _run("pr_diff", {"number": int(subarg)})
467
+ elif sub == "checks" and subarg.isdigit():
468
+ _run("pr_checks", {"number": int(subarg)})
469
+ elif sub in ("commits", "log"):
470
+ n = int(subarg) if subarg.isdigit() else 10
471
+ _run("list_commits", {"limit": n})
472
+ elif sub == "search":
473
+ if not subarg:
474
+ self.context.console.print("[dim]Usage: /gh search <query>[/dim]" if self.context.has_rich else "Usage: /gh search <query>")
475
+ return
476
+ _run("search", {"q": subarg, "kind": "code"})
477
+ elif sub in ("create-pr", "createpr", "create_pr"):
478
+ try:
479
+ title = (self.context.console.input(" PR title: ") if self.context.has_rich else input(" PR title: ")).strip()
480
+ body = (self.context.console.input(" PR body (optional): ") if self.context.has_rich else input(" PR body (optional): ")).strip()
481
+ base = (self.context.console.input(" Base branch [main]: ") if self.context.has_rich else input(" Base branch [main]: ")).strip() or "main"
482
+ _run("create_pr", {"title": title, "body": body, "base": base})
483
+ except (EOFError, KeyboardInterrupt):
484
+ self.context.console.print("[dim]Cancelled[/dim]" if self.context.has_rich else "Cancelled")
485
+ else:
486
+ self.context.console.print(f"[dim]Unknown /gh sub-command: {sub}. Try /gh help[/dim]" if self.context.has_rich
487
+ else f"Unknown /gh sub-command: {sub}. Try /gh help")
488
+
489
+ def cmd_lsp(self, args: str):
490
+ """Language-server diagnostics for code files.
491
+
492
+ /lsp — show which language servers are installed
493
+ /lsp <file> — run diagnostics (errors/warnings) on a file
494
+ """
495
+ try:
496
+ from runtime.lsp import available_servers, server_for, get_diagnostics
497
+ except ImportError as _e:
498
+ self.context.console.print(f"[red]runtime.lsp not available: {_e}[/red]") if self.context.has_rich else print(f"Error: {_e}")
499
+ return
500
+
501
+ target = args.strip().strip('"\'')
502
+
503
+ # No arg or "status" → show installed servers
504
+ if not target or target.lower() == "status":
505
+ servers = available_servers()
506
+ if self.context.has_rich:
507
+ self.context.console.print()
508
+ self.context.console.print(" [bold]Language Servers[/bold] [dim]on-demand diagnostics[/dim]")
509
+ self.context.console.print()
510
+ _hints = {
511
+ "pylsp": "pip install 'python-lsp-server[all]'",
512
+ "typescript-language-server": "npm i -g typescript-language-server typescript",
513
+ }
514
+ for exe, installed in servers.items():
515
+ if installed:
516
+ self.context.console.print(f" [green]●[/green] [bold]{exe}[/bold] [dim]installed[/dim]")
517
+ else:
518
+ self.context.console.print(f" [dim]○ {exe} not installed — {_hints.get(exe, '')}[/dim]")
519
+ self.context.console.print()
520
+ self.context.console.print(" [dim]/lsp <file> — run diagnostics on a file[/dim]")
521
+ self.context.console.print()
522
+ else:
523
+ print("\n Language Servers:")
524
+ for exe, installed in servers.items():
525
+ print(f" {'OK' if installed else '--'} {exe}")
526
+ return
527
+
528
+ # File path → run diagnostics
529
+ import pathlib
530
+ p = pathlib.Path(target).expanduser()
531
+ if not p.exists():
532
+ self.context.console.print(f"[red]File not found: {p}[/red]" if self.context.has_rich else f"File not found: {p}")
533
+ return
534
+ if not server_for(p):
535
+ msg = f"No language server installed for '{p.suffix}' files"
536
+ self.context.console.print(f"[yellow]{msg}[/yellow]" if self.context.has_rich else msg)
537
+ return
538
+
539
+ if self.context.has_rich:
540
+ with self.context.console.status(f"[dim]Analyzing {p.name}…[/dim]", spinner="dots"):
541
+ diags = get_diagnostics(p)
542
+ else:
543
+ print(f" Analyzing {p.name}…")
544
+ diags = get_diagnostics(p)
545
+
546
+ if not diags:
547
+ self.context.console.print(f"[green]✓ No diagnostics — {p.name} is clean[/green]" if self.context.has_rich
548
+ else f"No diagnostics for {p.name}")
549
+ return
550
+
551
+ errors = sum(1 for d in diags if d["severity"] == "error")
552
+ warnings = sum(1 for d in diags if d["severity"] == "warning")
553
+ if self.context.has_rich:
554
+ from rich.table import Table
555
+ from rich import box as _rbox
556
+ self.context.console.print()
557
+ self.context.console.print(f" [bold]{p.name}[/bold] "
558
+ f"[red]{errors} error(s)[/red] · [yellow]{warnings} warning(s)[/yellow]")
559
+ self.context.console.print()
560
+ t = Table(box=_rbox.SIMPLE, padding=(0, 1), show_header=True)
561
+ t.add_column("Loc", style="dim", justify="right", min_width=7)
562
+ t.add_column("Severity", min_width=8)
563
+ t.add_column("Message")
564
+ _sev_color = {"error": "red", "warning": "yellow", "info": "cyan", "hint": "dim"}
565
+ for d in diags[:40]:
566
+ color = _sev_color.get(d["severity"], "white")
567
+ src = f" [dim]({d['source']})[/dim]" if d["source"] else ""
568
+ t.add_row(
569
+ f"{d['line']}:{d['col']}",
570
+ f"[{color}]{d['severity']}[/{color}]",
571
+ f"{d['message']}{src}",
572
+ )
573
+ self.context.console.print(t)
574
+ self.context.console.print()
575
+ else:
576
+ print(f"\n {p.name}: {errors} errors, {warnings} warnings")
577
+ for d in diags[:40]:
578
+ print(f" {d['line']}:{d['col']} {d['severity']:8s} {d['message']}")
579
+
580
+ def cmd_completions(self, args: str):
581
+ """Generate shell completion script for aria-code slash commands.
582
+
583
+ /completions — show instructions
584
+ /completions bash — output bash completion snippet
585
+ /completions zsh — output zsh completion snippet
586
+ /completions install — write and source the completion script
587
+ """
588
+ # NOTE: this method's __globals__ are rebound to aria_cli's namespace by
589
+ # _rebind_mixin_globals(), so module-level names from this file (Path and
590
+ # the _build_*/_detect_user_shell helpers) must be imported locally.
591
+ from pathlib import Path
592
+ from apps.cli.commands.ops_cmds import (
593
+ _build_bash_completion, _build_zsh_completion, _detect_user_shell,
594
+ )
595
+
596
+ shell = args.strip().lower() or "show"
597
+
598
+ # Build sorted slash command list from VISIBLE_SLASH_COMMANDS
599
+ try:
600
+ from apps.cli.commands.catalog import VISIBLE_SLASH_COMMANDS
601
+ cmds = sorted(VISIBLE_SLASH_COMMANDS)
602
+ except ImportError:
603
+ cmds = ["/help", "/model", "/config", "/recall", "/permissions", "/deep", "/quote"]
604
+
605
+ if shell == "bash":
606
+ script = _build_bash_completion(cmds)
607
+ self.context.console.print(script if not self.context.has_rich else f"[dim]{script}[/dim]")
608
+ return
609
+
610
+ if shell == "zsh":
611
+ script = _build_zsh_completion(cmds)
612
+ self.context.console.print(script if not self.context.has_rich else f"[dim]{script}[/dim]")
613
+ return
614
+
615
+ if shell == "install":
616
+ import subprocess as _sp
617
+ import shutil as _sh
618
+ detected = _detect_user_shell()
619
+ if detected == "zsh":
620
+ script = _build_zsh_completion(cmds)
621
+ target = Path.home() / ".zsh" / "_aria-code"
622
+ target.parent.mkdir(parents=True, exist_ok=True)
623
+ target.write_text(script)
624
+ rc = Path.home() / ".zshrc"
625
+ fpath_line = f'fpath=("{target.parent}" $fpath)'
626
+ if rc.exists():
627
+ existing = rc.read_text()
628
+ if str(target.parent) not in existing:
629
+ rc.write_text(existing.rstrip("\n") + f"\n{fpath_line}\nautoload -U compinit && compinit\n")
630
+ msg = f"Zsh completion installed → {target}\nRestart your shell or run: source ~/.zshrc"
631
+ else:
632
+ script = _build_bash_completion(cmds)
633
+ target = Path.home() / ".bash_completion.d" / "aria-code"
634
+ target.parent.mkdir(parents=True, exist_ok=True)
635
+ target.write_text(script)
636
+ rc = Path.home() / ".bashrc"
637
+ source_line = f'[ -f "{target}" ] && source "{target}"'
638
+ if rc.exists():
639
+ existing = rc.read_text()
640
+ if str(target) not in existing:
641
+ rc.write_text(existing.rstrip("\n") + f"\n{source_line}\n")
642
+ msg = f"Bash completion installed → {target}\nRestart your shell or run: source ~/.bashrc"
643
+ if self.context.has_rich:
644
+ self.context.console.print(f"[green]✓[/green] {msg}")
645
+ else:
646
+ print(msg)
647
+ return
648
+
649
+ # Default: instructions
650
+ detected = _detect_user_shell()
651
+ if self.context.has_rich:
652
+ self.context.console.print()
653
+ self.context.console.print(" [bold]Shell Completions[/bold] [dim]aria-code slash commands[/dim]")
654
+ self.context.console.print()
655
+ self.context.console.print(f" Detected shell: [bold]{detected}[/bold]")
656
+ self.context.console.print()
657
+ self.context.console.print(" [dim]/completions bash — print bash completion script[/dim]")
658
+ self.context.console.print(" [dim]/completions zsh — print zsh completion script[/dim]")
659
+ self.context.console.print(" [dim]/completions install — auto-install for your shell[/dim]")
660
+ self.context.console.print()
661
+ self.context.console.print(f" [dim]{len(cmds)} slash commands registered[/dim]")
662
+ self.context.console.print()
663
+ else:
664
+ print(f"\n Shell: {detected} | {len(cmds)} commands registered")
665
+ print(" /completions bash|zsh|install")
666
+
667
+
668
+ def _detect_user_shell() -> str:
669
+ import os as _os
670
+ shell = _os.environ.get("SHELL", "").lower()
671
+ if "zsh" in shell:
672
+ return "zsh"
673
+ if "fish" in shell:
674
+ return "fish"
675
+ return "bash"
676
+
677
+
678
+ def _build_bash_completion(cmds: list) -> str:
679
+ cmd_list = " ".join(cmds)
680
+ return f"""# aria-code bash completion
681
+ # Add to ~/.bashrc: source ~/.bash_completion.d/aria-code
682
+ _aria_code_complete() {{
683
+ local cur prev words
684
+ COMPREPLY=()
685
+ cur="${{COMP_WORDS[COMP_CWORD]}}"
686
+ # Complete slash commands when passed via -p flag
687
+ if [[ "${{cur}}" == /* ]]; then
688
+ COMPREPLY=( $(compgen -W "{cmd_list}" -- "${{cur}}") )
689
+ return 0
690
+ fi
691
+ # Complete top-level flags
692
+ COMPREPLY=( $(compgen -W "--help --version --print -p --no-color" -- "${{cur}}") )
693
+ }}
694
+ complete -F _aria_code_complete aria-code
695
+ complete -F _aria_code_complete aria_cli.py
696
+ """
697
+
698
+
699
+ def _build_zsh_completion(cmds: list) -> str:
700
+ lines = ["#compdef aria-code aria_cli.py", "", "_aria_code() {", " local -a slash_cmds", " slash_cmds=("]
701
+ for cmd in cmds:
702
+ lines.append(f" '{cmd}'")
703
+ lines += [
704
+ " )",
705
+ " _arguments \\",
706
+ " '(-h --help)'{-h,--help}'[show help]' \\",
707
+ " '(-v --version)'{-v,--version}'[show version]' \\",
708
+ " '(-p --print)'{-p,--print}'[non-interactive mode]:prompt:->prompt' \\",
709
+ " '*: :->args'",
710
+ " case $state in",
711
+ " prompt|args)",
712
+ " if [[ $PREFIX == /* ]]; then",
713
+ " _values 'slash command' $slash_cmds",
714
+ " fi",
715
+ " ;;",
716
+ " esac",
717
+ "}",
718
+ "",
719
+ "_aria_code",
720
+ ]
721
+ return "\n".join(lines) + "\n"