aria-code 0.52.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 (478) hide show
  1. aria_code/__init__.py +42 -0
  2. aria_code/_version.py +20 -0
  3. aria_code/adk_apps/__init__.py +1 -0
  4. aria_code/adk_apps/aria_code_review/__init__.py +1 -0
  5. aria_code/adk_apps/aria_code_review/agent.py +32 -0
  6. aria_code/adk_apps/aria_research/__init__.py +1 -0
  7. aria_code/adk_apps/aria_research/agent.py +31 -0
  8. aria_code/agents/__init__.py +34 -0
  9. aria_code/agents/base.py +318 -0
  10. aria_code/agents/code_review.py +200 -0
  11. aria_code/agents/deep/__init__.py +37 -0
  12. aria_code/agents/deep/calibration_loop.py +144 -0
  13. aria_code/agents/deep/critic.py +125 -0
  14. aria_code/agents/deep/deepen.py +193 -0
  15. aria_code/agents/deep/models.py +149 -0
  16. aria_code/agents/deep/pipeline.py +164 -0
  17. aria_code/agents/deep/quant_fusion.py +192 -0
  18. aria_code/agents/deep/themes.py +95 -0
  19. aria_code/agents/deep/tiers.py +106 -0
  20. aria_code/agents/engineering/__init__.py +14 -0
  21. aria_code/agents/engineering/coder.py +222 -0
  22. aria_code/agents/engineering/tester.py +145 -0
  23. aria_code/agents/financial/__init__.py +21 -0
  24. aria_code/agents/financial/cashflow_burn.py +119 -0
  25. aria_code/agents/financial/catalyst.py +279 -0
  26. aria_code/agents/financial/corporate_finance.py +175 -0
  27. aria_code/agents/financial/debate.py +224 -0
  28. aria_code/agents/financial/earnings.py +303 -0
  29. aria_code/agents/financial/fundamental.py +191 -0
  30. aria_code/agents/financial/macro.py +99 -0
  31. aria_code/agents/financial/news.py +207 -0
  32. aria_code/agents/financial/risk.py +165 -0
  33. aria_code/agents/financial/sector.py +279 -0
  34. aria_code/agents/financial/strategist.py +121 -0
  35. aria_code/agents/financial/stripe_revenue.py +127 -0
  36. aria_code/agents/financial/synthesis.py +274 -0
  37. aria_code/agents/financial/technical.py +258 -0
  38. aria_code/agents/orchestrator.py +44 -0
  39. aria_code/agents/portfolio_agent.py +363 -0
  40. aria_code/agents/realty/__init__.py +62 -0
  41. aria_code/agents/realty/asset_diagnosis.py +152 -0
  42. aria_code/agents/realty/business_match.py +166 -0
  43. aria_code/agents/realty/cashflow_verify.py +209 -0
  44. aria_code/agents/realty/contract_rules.py +210 -0
  45. aria_code/agents/realty/energy_anomaly.py +189 -0
  46. aria_code/agents/realty/exit_settlement.py +208 -0
  47. aria_code/agents/realty/fulfillment_risk.py +206 -0
  48. aria_code/agents/realty/ops_optimize.py +160 -0
  49. aria_code/agents/realty/revenue_share.py +215 -0
  50. aria_code/agents/registry.py +158 -0
  51. aria_code/agents/signal_scheme.py +111 -0
  52. aria_code/agents/sports/__init__.py +0 -0
  53. aria_code/agents/sports/football_agent.py +197 -0
  54. aria_code/agents/supervisor.py +113 -0
  55. aria_code/agents/team.py +492 -0
  56. aria_code/agents/warehouse/__init__.py +25 -0
  57. aria_code/agents/warehouse/contracts.py +26 -0
  58. aria_code/agents/warehouse/dashboard.py +155 -0
  59. aria_code/agents/warehouse/fulfillment_leadtime.py +95 -0
  60. aria_code/agents/warehouse/inbound_exceptions.py +25 -0
  61. aria_code/agents/warehouse/inventory_health.py +24 -0
  62. aria_code/agents/warehouse/local_run.py +71 -0
  63. aria_code/agents/warehouse/local_snapshot.py +132 -0
  64. aria_code/agents/warehouse/logistics_cost.py +84 -0
  65. aria_code/agents/warehouse/logistics_sync.py +21 -0
  66. aria_code/agents/warehouse/workflow.py +31 -0
  67. aria_code/aliyun_data_client.py +4 -0
  68. aria_code/apps/README.md +12 -0
  69. aria_code/apps/__init__.py +2 -0
  70. aria_code/apps/channels/README.md +15 -0
  71. aria_code/apps/channels/__init__.py +17 -0
  72. aria_code/apps/channels/intake.py +92 -0
  73. aria_code/apps/channels/registry.py +95 -0
  74. aria_code/apps/channels/tradingview.py +94 -0
  75. aria_code/apps/cli/README.md +13 -0
  76. aria_code/apps/cli/__init__.py +2 -0
  77. aria_code/apps/cli/_optional.py +120 -0
  78. aria_code/apps/cli/bootstrap.py +145 -0
  79. aria_code/apps/cli/broker_render.py +206 -0
  80. aria_code/apps/cli/codegen_paths.py +29 -0
  81. aria_code/apps/cli/commands/__init__.py +16 -0
  82. aria_code/apps/cli/commands/_business_render.py +78 -0
  83. aria_code/apps/cli/commands/_ui.py +71 -0
  84. aria_code/apps/cli/commands/analysis_cmds.py +369 -0
  85. aria_code/apps/cli/commands/ashare_prediction_cmds.py +327 -0
  86. aria_code/apps/cli/commands/auth_cmds.py +239 -0
  87. aria_code/apps/cli/commands/backtest_cmds.py +2543 -0
  88. aria_code/apps/cli/commands/broker_cmds.py +1234 -0
  89. aria_code/apps/cli/commands/business_workflow_cmds.py +319 -0
  90. aria_code/apps/cli/commands/canvas_cmds.py +77 -0
  91. aria_code/apps/cli/commands/catalog.py +87 -0
  92. aria_code/apps/cli/commands/core_cmds.py +2520 -0
  93. aria_code/apps/cli/commands/data_cmds.py +457 -0
  94. aria_code/apps/cli/commands/diagnostic_cmds.py +230 -0
  95. aria_code/apps/cli/commands/diagnostic_ops_cmds.py +813 -0
  96. aria_code/apps/cli/commands/file_cmds.py +312 -0
  97. aria_code/apps/cli/commands/finance_service_cmds.py +60 -0
  98. aria_code/apps/cli/commands/fx_commodity_cmds.py +123 -0
  99. aria_code/apps/cli/commands/market.py +434 -0
  100. aria_code/apps/cli/commands/market_cmds.py +1381 -0
  101. aria_code/apps/cli/commands/market_context.py +425 -0
  102. aria_code/apps/cli/commands/market_render.py +7 -0
  103. aria_code/apps/cli/commands/model_cmds.py +2153 -0
  104. aria_code/apps/cli/commands/ops_cmds.py +721 -0
  105. aria_code/apps/cli/commands/orchestrator_cmds.py +179 -0
  106. aria_code/apps/cli/commands/pdf_export_cmds.py +125 -0
  107. aria_code/apps/cli/commands/portfolio_cmds.py +1278 -0
  108. aria_code/apps/cli/commands/report.py +437 -0
  109. aria_code/apps/cli/commands/scaffold_templates.py +617 -0
  110. aria_code/apps/cli/commands/session_cmds.py +236 -0
  111. aria_code/apps/cli/commands/session_ux_cmds.py +359 -0
  112. aria_code/apps/cli/commands/team.py +669 -0
  113. aria_code/apps/cli/commands/team_render.py +8 -0
  114. aria_code/apps/cli/commands/ui_cmds.py +401 -0
  115. aria_code/apps/cli/commands/warehouse_cmds.py +79 -0
  116. aria_code/apps/cli/commands/workflow_cmds.py +480 -0
  117. aria_code/apps/cli/commands/workspace_cmds.py +1494 -0
  118. aria_code/apps/cli/config_paths.py +73 -0
  119. aria_code/apps/cli/config_store.py +78 -0
  120. aria_code/apps/cli/constants.py +88 -0
  121. aria_code/apps/cli/context.py +34 -0
  122. aria_code/apps/cli/deterministic.py +191 -0
  123. aria_code/apps/cli/direct.py +48 -0
  124. aria_code/apps/cli/finance_service_catalog.py +111 -0
  125. aria_code/apps/cli/football_reports.py +231 -0
  126. aria_code/apps/cli/github_app_auth.py +135 -0
  127. aria_code/apps/cli/google_login.py +196 -0
  128. aria_code/apps/cli/handlers/__init__.py +11 -0
  129. aria_code/apps/cli/handlers/broker_handlers.py +122 -0
  130. aria_code/apps/cli/handlers/chart_handlers.py +1309 -0
  131. aria_code/apps/cli/handlers/market_handlers.py +2513 -0
  132. aria_code/apps/cli/handlers/realty_handlers.py +114 -0
  133. aria_code/apps/cli/handlers/sports_handlers.py +22 -0
  134. aria_code/apps/cli/handlers/strategy_advice.py +82 -0
  135. aria_code/apps/cli/helpers.py +302 -0
  136. aria_code/apps/cli/hooks.py +180 -0
  137. aria_code/apps/cli/i18n.py +297 -0
  138. aria_code/apps/cli/intent.py +136 -0
  139. aria_code/apps/cli/intent_router.py +276 -0
  140. aria_code/apps/cli/intent_signals.py +344 -0
  141. aria_code/apps/cli/lifecycle_hooks.py +48 -0
  142. aria_code/apps/cli/local_tool_schemas.py +536 -0
  143. aria_code/apps/cli/main.py +29 -0
  144. aria_code/apps/cli/market_metadata.py +135 -0
  145. aria_code/apps/cli/market_universe.py +487 -0
  146. aria_code/apps/cli/message_processing.py +310 -0
  147. aria_code/apps/cli/model_catalog.py +620 -0
  148. aria_code/apps/cli/pdf_report.py +977 -0
  149. aria_code/apps/cli/plan_mode.py +139 -0
  150. aria_code/apps/cli/plotly_html.py +15 -0
  151. aria_code/apps/cli/prediction_feedback.py +202 -0
  152. aria_code/apps/cli/preflight.py +502 -0
  153. aria_code/apps/cli/project_aria.py +60 -0
  154. aria_code/apps/cli/prompt_assembly.py +59 -0
  155. aria_code/apps/cli/prompts/__init__.py +0 -0
  156. aria_code/apps/cli/prompts/coding.py +53 -0
  157. aria_code/apps/cli/prompts/select.py +142 -0
  158. aria_code/apps/cli/prompts/system_prompts.py +552 -0
  159. aria_code/apps/cli/prompts/ui.py +436 -0
  160. aria_code/apps/cli/provider_endpoints.py +237 -0
  161. aria_code/apps/cli/provider_keys.py +73 -0
  162. aria_code/apps/cli/providers/__init__.py +1 -0
  163. aria_code/apps/cli/providers/base.py +521 -0
  164. aria_code/apps/cli/providers/chat_routing.py +128 -0
  165. aria_code/apps/cli/providers/collaboration.py +98 -0
  166. aria_code/apps/cli/providers/llm/__init__.py +1 -0
  167. aria_code/apps/cli/providers/llm/offline_responses.py +68 -0
  168. aria_code/apps/cli/providers/llm/ollama_stream.py +1594 -0
  169. aria_code/apps/cli/providers/llm/response_cache.py +60 -0
  170. aria_code/apps/cli/providers/llm/sse_stream.py +257 -0
  171. aria_code/apps/cli/providers/runtime_bridge.py +353 -0
  172. aria_code/apps/cli/providers/vertexai_stream.py +316 -0
  173. aria_code/apps/cli/runtime_consumer.py +657 -0
  174. aria_code/apps/cli/sandbox.py +32 -0
  175. aria_code/apps/cli/session_export.py +120 -0
  176. aria_code/apps/cli/session_jsonl.py +208 -0
  177. aria_code/apps/cli/session_store.py +112 -0
  178. aria_code/apps/cli/skills_catalog.py +273 -0
  179. aria_code/apps/cli/todo_tracker.py +190 -0
  180. aria_code/apps/cli/tool_executor.py +823 -0
  181. aria_code/apps/cli/tool_registry.py +34 -0
  182. aria_code/apps/cli/tool_scope.py +106 -0
  183. aria_code/apps/cli/tools/__init__.py +40 -0
  184. aria_code/apps/cli/tools/context.py +46 -0
  185. aria_code/apps/cli/tools/file_tools.py +180 -0
  186. aria_code/apps/cli/tools/market_tools.py +620 -0
  187. aria_code/apps/cli/tools/notebook_tools.py +111 -0
  188. aria_code/apps/cli/tools/system_tools.py +726 -0
  189. aria_code/apps/cli/tools/write_tools.py +845 -0
  190. aria_code/apps/cli/tradingview_bridge.py +529 -0
  191. aria_code/apps/cli/turn_planning.py +137 -0
  192. aria_code/apps/cli/update_check.py +153 -0
  193. aria_code/apps/cli/utils/__init__.py +0 -0
  194. aria_code/apps/cli/utils/market_detect.py +1597 -0
  195. aria_code/apps/daemon/README.md +14 -0
  196. aria_code/apps/vscode/README.md +115 -0
  197. aria_code/apps/vscode/package.json +70 -0
  198. aria_code/aria_cli.py +6743 -0
  199. aria_code/aria_daemon.py +1398 -0
  200. aria_code/aria_feishu_bot.py +1423 -0
  201. aria_code/aria_mcp_server.py +7 -0
  202. aria_code/aria_relay_client.py +4 -0
  203. aria_code/aria_relay_server.py +490 -0
  204. aria_code/aria_telegram_bot.py +202 -0
  205. aria_code/ariarc.py +385 -0
  206. aria_code/artifacts.py +581 -0
  207. aria_code/backtest_engine.py +4 -0
  208. aria_code/backtest_report.py +4 -0
  209. aria_code/brokers/__init__.py +78 -0
  210. aria_code/brokers/automation.py +193 -0
  211. aria_code/brokers/base.py +231 -0
  212. aria_code/brokers/capabilities.py +264 -0
  213. aria_code/brokers/cn/__init__.py +10 -0
  214. aria_code/brokers/cn/easytrader_broker.py +193 -0
  215. aria_code/brokers/cn/futu_broker.py +194 -0
  216. aria_code/brokers/cn/longbridge_broker.py +190 -0
  217. aria_code/brokers/cn/tiger_broker.py +196 -0
  218. aria_code/brokers/cn/xtquant_broker.py +225 -0
  219. aria_code/brokers/config.py +414 -0
  220. aria_code/brokers/intl/__init__.py +5 -0
  221. aria_code/brokers/intl/alpaca_broker.py +183 -0
  222. aria_code/brokers/intl/ibkr_broker.py +215 -0
  223. aria_code/brokers/intl/trading212_broker.py +183 -0
  224. aria_code/brokers/intl/webull_broker.py +156 -0
  225. aria_code/brokers/paper_broker.py +266 -0
  226. aria_code/brokers/planning.py +296 -0
  227. aria_code/brokers/registry.py +213 -0
  228. aria_code/brokers/trading.py +267 -0
  229. aria_code/canva_client.py +4 -0
  230. aria_code/change_store.py +127 -0
  231. aria_code/clients/__init__.py +0 -0
  232. aria_code/clients/aliyun_data_client.py +660 -0
  233. aria_code/clients/aria_relay_client.py +182 -0
  234. aria_code/clients/canva_client.py +284 -0
  235. aria_code/clients/figma_client.py +100 -0
  236. aria_code/clients/football_data_client.py +1671 -0
  237. aria_code/clients/kling_video_client.py +182 -0
  238. aria_code/clients/market_data_client.py +1976 -0
  239. aria_code/clients/openai_image_client.py +242 -0
  240. aria_code/clients/runway_video_client.py +157 -0
  241. aria_code/clients/warehouse_erp_client.py +105 -0
  242. aria_code/cloud_memory.py +181 -0
  243. aria_code/command_safety.py +19 -0
  244. aria_code/computer_use_tools.py +4 -0
  245. aria_code/dashboard_generator.py +579 -0
  246. aria_code/data_analysis_tools.py +4 -0
  247. aria_code/data_cleaner.py +483 -0
  248. aria_code/data_service.py +513 -0
  249. aria_code/datasources/__init__.py +23 -0
  250. aria_code/datasources/base.py +166 -0
  251. aria_code/datasources/router.py +253 -0
  252. aria_code/datasources/sources/__init__.py +15 -0
  253. aria_code/datasources/sources/akshare_source.py +269 -0
  254. aria_code/datasources/sources/alpha_vantage_source.py +203 -0
  255. aria_code/datasources/sources/edgar_source.py +219 -0
  256. aria_code/datasources/sources/finnhub_source.py +198 -0
  257. aria_code/datasources/sources/fred_source.py +223 -0
  258. aria_code/datasources/sources/tushare_source.py +143 -0
  259. aria_code/datasources/sources/web_scraper_source.py +278 -0
  260. aria_code/datasources/sources/world_bank_source.py +206 -0
  261. aria_code/datasources/sources/yfinance_source.py +152 -0
  262. aria_code/demo_player.py +207 -0
  263. aria_code/doctor.py +813 -0
  264. aria_code/domain/__init__.py +0 -0
  265. aria_code/domain/backtest_engine.py +354 -0
  266. aria_code/domain/backtest_report.py +472 -0
  267. aria_code/domain/finance_formulas.py +389 -0
  268. aria_code/domain/portfolio_ledger.py +307 -0
  269. aria_code/domain/strategy_vault.py +421 -0
  270. aria_code/evals/__init__.py +37 -0
  271. aria_code/evals/harness.py +598 -0
  272. aria_code/evals/runner.py +238 -0
  273. aria_code/external_agent_runner.py +115 -0
  274. aria_code/figma_client.py +4 -0
  275. aria_code/file_analysis_tools.py +4 -0
  276. aria_code/finance_formulas.py +4 -0
  277. aria_code/football_data_client.py +4 -0
  278. aria_code/image_gen_tools.py +4 -0
  279. aria_code/intent_classifier.py +386 -0
  280. aria_code/kling_video_client.py +4 -0
  281. aria_code/licensing.py +151 -0
  282. aria_code/local_finance_tools.py +4 -0
  283. aria_code/local_image_provider.py +4 -0
  284. aria_code/local_llm_provider.py +4 -0
  285. aria_code/macro_tools.py +4 -0
  286. aria_code/markdown_pdf.py +289 -0
  287. aria_code/market_data_client.py +4 -0
  288. aria_code/mcp_client.py +639 -0
  289. aria_code/memory_manager.py +246 -0
  290. aria_code/model_capability.py +486 -0
  291. aria_code/notification_tools.py +4 -0
  292. aria_code/openai_image_client.py +4 -0
  293. aria_code/packages/__init__.py +23 -0
  294. aria_code/packages/adk_bridge/__init__.py +11 -0
  295. aria_code/packages/adk_bridge/code_review_tools.py +49 -0
  296. aria_code/packages/adk_bridge/market_tools.py +125 -0
  297. aria_code/packages/aria_agents/__init__.py +5 -0
  298. aria_code/packages/aria_agents/manifest.py +78 -0
  299. aria_code/packages/aria_core/__init__.py +34 -0
  300. aria_code/packages/aria_core/architecture.py +269 -0
  301. aria_code/packages/aria_core/export.py +147 -0
  302. aria_code/packages/aria_core/manifest.py +65 -0
  303. aria_code/packages/aria_core/paths.py +57 -0
  304. aria_code/packages/aria_core/secure_file.py +68 -0
  305. aria_code/packages/aria_infra/__init__.py +15 -0
  306. aria_code/packages/aria_infra/arthera.py +52 -0
  307. aria_code/packages/aria_infra/doctor.py +246 -0
  308. aria_code/packages/aria_infra/product.py +40 -0
  309. aria_code/packages/aria_mcp/__init__.py +25 -0
  310. aria_code/packages/aria_mcp/bridge.py +201 -0
  311. aria_code/packages/aria_mcp/circuit.py +82 -0
  312. aria_code/packages/aria_mcp/config.py +111 -0
  313. aria_code/packages/aria_mcp/installer.py +95 -0
  314. aria_code/packages/aria_mcp/server.py +1550 -0
  315. aria_code/packages/aria_mcp/tools.py +81 -0
  316. aria_code/packages/aria_sdk/__init__.py +19 -0
  317. aria_code/packages/aria_sdk/client.py +396 -0
  318. aria_code/packages/aria_sdk/providers.py +70 -0
  319. aria_code/packages/aria_sdk/streaming.py +79 -0
  320. aria_code/packages/aria_sdk/types.py +86 -0
  321. aria_code/packages/aria_services/__init__.py +92 -0
  322. aria_code/packages/aria_services/cache.py +60 -0
  323. aria_code/packages/aria_services/context.py +356 -0
  324. aria_code/packages/aria_services/context_checkpoints.py +157 -0
  325. aria_code/packages/aria_services/data.py +11 -0
  326. aria_code/packages/aria_services/provider_health.py +268 -0
  327. aria_code/packages/aria_services/references.py +247 -0
  328. aria_code/packages/aria_services/registry.py +249 -0
  329. aria_code/packages/aria_services/research_protocol.py +57 -0
  330. aria_code/packages/aria_services/research_quality.py +186 -0
  331. aria_code/packages/aria_services/settings.py +157 -0
  332. aria_code/packages/aria_services/usage.py +151 -0
  333. aria_code/packages/aria_skills/__init__.py +46 -0
  334. aria_code/packages/aria_skills/catalog.py +149 -0
  335. aria_code/packages/aria_skills/loader.py +455 -0
  336. aria_code/packages/aria_skills/registry.py +84 -0
  337. aria_code/packages/aria_tools/__init__.py +5 -0
  338. aria_code/packages/aria_tools/financial/__init__.py +8 -0
  339. aria_code/packages/aria_tools/financial/_paths.py +130 -0
  340. aria_code/packages/aria_tools/financial/compliance.py +31 -0
  341. aria_code/packages/aria_tools/financial/factors.py +33 -0
  342. aria_code/packages/aria_tools/financial/risk_tools.py +33 -0
  343. aria_code/packages/aria_tools/financial/strategy.py +31 -0
  344. aria_code/packages/aria_tools/registry.py +128 -0
  345. aria_code/packages/quant_engine/__init__.py +34 -0
  346. aria_code/packages/quant_engine/_namespace.py +62 -0
  347. aria_code/packages/quant_engine/backtest/__init__.py +14 -0
  348. aria_code/packages/quant_engine/backtest/core.py +53 -0
  349. aria_code/packages/quant_engine/backtest/engine.py +96 -0
  350. aria_code/packages/quant_engine/portfolio/__init__.py +13 -0
  351. aria_code/packages/quant_engine/portfolio/optimizer.py +85 -0
  352. aria_code/packages/quant_engine/sports/__init__.py +80 -0
  353. aria_code/packages/quant_engine/sports/calibrator.py +354 -0
  354. aria_code/packages/quant_engine/sports/dixon_coles.py +234 -0
  355. aria_code/packages/quant_engine/sports/elo.py +300 -0
  356. aria_code/packages/quant_engine/sports/form.py +188 -0
  357. aria_code/packages/quant_engine/sports/h2h.py +195 -0
  358. aria_code/packages/quant_engine/sports/ml_model.py +377 -0
  359. aria_code/packages/quant_engine/sports/predictor.py +312 -0
  360. aria_code/packages/quant_engine/sports/tracker.py +665 -0
  361. aria_code/packages/quant_engine/stochastic/__init__.py +35 -0
  362. aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +195 -0
  363. aria_code/packages/quant_engine/stochastic/ito_calculus.py +477 -0
  364. aria_code/packages/quant_engine/stochastic/kelly_criterion.py +181 -0
  365. aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +95 -0
  366. aria_code/packages/quant_engine/stochastic/options_pricing.py +576 -0
  367. aria_code/packages/quant_engine/stochastic/stochastic_processes.py +90 -0
  368. aria_code/packs/__init__.py +85 -0
  369. aria_code/packs/base.py +168 -0
  370. aria_code/packs/finance/__init__.py +250 -0
  371. aria_code/packs/logistics/__init__.py +169 -0
  372. aria_code/packs/payments/__init__.py +139 -0
  373. aria_code/packs/realty/__init__.py +190 -0
  374. aria_code/packs/registry.py +202 -0
  375. aria_code/packs/rules.py +90 -0
  376. aria_code/plan_utils.py +194 -0
  377. aria_code/plugin_loader.py +328 -0
  378. aria_code/portfolio_ledger.py +4 -0
  379. aria_code/preview_server.py +449 -0
  380. aria_code/privacy/__init__.py +5 -0
  381. aria_code/privacy/feedback.py +123 -0
  382. aria_code/project_review.py +278 -0
  383. aria_code/project_review_api.py +235 -0
  384. aria_code/project_review_server.py +18 -0
  385. aria_code/project_tools.py +4 -0
  386. aria_code/providers/__init__.py +30 -0
  387. aria_code/providers/llm/__init__.py +19 -0
  388. aria_code/providers/llm/anthropic.py +184 -0
  389. aria_code/providers/llm/autoconfig.py +213 -0
  390. aria_code/providers/llm/base.py +139 -0
  391. aria_code/providers/llm/custom.py +158 -0
  392. aria_code/providers/llm/ollama.py +129 -0
  393. aria_code/providers/llm/openai_compat.py +313 -0
  394. aria_code/providers/llm/registry.py +444 -0
  395. aria_code/providers/local_image_provider.py +202 -0
  396. aria_code/providers/local_llm_provider.py +589 -0
  397. aria_code/realty_data_tools.py +4 -0
  398. aria_code/report_exporters.py +150 -0
  399. aria_code/report_generator.py +1764 -0
  400. aria_code/runtime/__init__.py +169 -0
  401. aria_code/runtime/acceptance.py +481 -0
  402. aria_code/runtime/agent_loop.py +1520 -0
  403. aria_code/runtime/approval.py +57 -0
  404. aria_code/runtime/budget.py +232 -0
  405. aria_code/runtime/checkpoints.py +432 -0
  406. aria_code/runtime/crash_report.py +174 -0
  407. aria_code/runtime/events.py +113 -0
  408. aria_code/runtime/gateway.py +150 -0
  409. aria_code/runtime/lsp.py +484 -0
  410. aria_code/runtime/orchestrator.py +55 -0
  411. aria_code/runtime/repo_map.py +700 -0
  412. aria_code/runtime/run_state.py +127 -0
  413. aria_code/runtime/run_store.py +450 -0
  414. aria_code/runtime/self_healing.py +422 -0
  415. aria_code/runtime/subagent.py +547 -0
  416. aria_code/runtime/task_ledger.py +86 -0
  417. aria_code/runtime/task_orchestrator.py +90 -0
  418. aria_code/runtime/tool_executor.py +217 -0
  419. aria_code/runtime/tool_policy.py +107 -0
  420. aria_code/runtime/worktrees.py +215 -0
  421. aria_code/runway_video_client.py +4 -0
  422. aria_code/safety/__init__.py +23 -0
  423. aria_code/safety/permissions.py +306 -0
  424. aria_code/safety/service.py +102 -0
  425. aria_code/setup_wizard.py +673 -0
  426. aria_code/spreadsheet_tools.py +4 -0
  427. aria_code/strategy_vault.py +4 -0
  428. aria_code/tools/__init__.py +0 -0
  429. aria_code/tools/artifact_tools.py +252 -0
  430. aria_code/tools/broker_tools.py +92 -0
  431. aria_code/tools/build_quant_engine.py +97 -0
  432. aria_code/tools/code_audit_tools.py +192 -0
  433. aria_code/tools/computer_use_tools.py +504 -0
  434. aria_code/tools/data_analysis_tools.py +809 -0
  435. aria_code/tools/enterprise_finance_tools.py +156 -0
  436. aria_code/tools/extended_tools.py +240 -0
  437. aria_code/tools/file_analysis_tools.py +885 -0
  438. aria_code/tools/image_gen_tools.py +114 -0
  439. aria_code/tools/local_finance_tools.py +3417 -0
  440. aria_code/tools/logistics_tools.py +135 -0
  441. aria_code/tools/macro_tools.py +369 -0
  442. aria_code/tools/notification_tools.py +249 -0
  443. aria_code/tools/project_tools.py +525 -0
  444. aria_code/tools/realty_data_tools.py +659 -0
  445. aria_code/tools/spreadsheet_tools.py +388 -0
  446. aria_code/tools/stripe_tools.py +115 -0
  447. aria_code/ui/__init__.py +105 -0
  448. aria_code/ui/banner.py +508 -0
  449. aria_code/ui/completer.py +501 -0
  450. aria_code/ui/console.py +281 -0
  451. aria_code/ui/image_render.py +243 -0
  452. aria_code/ui/input_box.py +488 -0
  453. aria_code/ui/picker.py +201 -0
  454. aria_code/ui/render/__init__.py +11 -0
  455. aria_code/ui/render/finance.py +1705 -0
  456. aria_code/ui/render/market.py +225 -0
  457. aria_code/ui/render/output.py +775 -0
  458. aria_code/ui/render/responsive.py +75 -0
  459. aria_code/ui/render/team.py +354 -0
  460. aria_code/ui/robot.py +235 -0
  461. aria_code/ui/startup_dashboard.py +109 -0
  462. aria_code/utils/vscode_uri.py +37 -0
  463. aria_code/video_analysis.py +147 -0
  464. aria_code/video_editor.py +271 -0
  465. aria_code/workspace/__init__.py +6 -0
  466. aria_code/workspace/files.py +193 -0
  467. aria_code/workspace/verify.py +113 -0
  468. aria_code/workspace_changes.py +199 -0
  469. aria_code/workspace_context.py +233 -0
  470. aria_code/workspace_service.py +196 -0
  471. aria_code/workspace_tools.py +150 -0
  472. aria_code-0.52.0.dist-info/METADATA +237 -0
  473. aria_code-0.52.0.dist-info/RECORD +478 -0
  474. aria_code-0.52.0.dist-info/WHEEL +5 -0
  475. aria_code-0.52.0.dist-info/entry_points.txt +3 -0
  476. aria_code-0.52.0.dist-info/licenses/LICENSE +201 -0
  477. aria_code-0.52.0.dist-info/licenses/NOTICE +49 -0
  478. aria_code-0.52.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,486 @@
1
+ """
2
+ model_capability.py — Aria Code model capability registry & tool-call adapter.
3
+
4
+ Responsibilities:
5
+ - Know which local models support native tool calling vs text-based <tool_call>
6
+ - Normalise tool call output across Ollama-native / XML-tag / JSON-fenced formats
7
+ - Inject the correct tool schema format into the Ollama payload
8
+ - Detect capability dynamically when a model is not in the registry
9
+
10
+ Usage::
11
+
12
+ from aria_code.model_capability import get_model_capability, build_ollama_tool_payload
13
+
14
+ caps = get_model_capability("qwen2.5-coder:7b")
15
+ # {"tool_calls": True, "format": "ollama_native", "context_window": 32768, ...}
16
+
17
+ calls = parse_tool_calls_from_response(full_text, native_tool_calls)
18
+ """
19
+
20
+ from __future__ import annotations
21
+
22
+ import json
23
+ import re
24
+ from dataclasses import dataclass, field
25
+ from typing import Any, Dict, List, Optional, Tuple
26
+
27
+ # ---------------------------------------------------------------------------
28
+ # Capability catalogue
29
+ # ---------------------------------------------------------------------------
30
+
31
+ @dataclass
32
+ class ModelCapability:
33
+ # Whether the model reliably produces structured tool calls
34
+ tool_calls: bool = False
35
+ # "ollama_native" → Ollama's message.tool_calls list
36
+ # "xml_tags" → <tool_call>{"name":…,"arguments":{…}}</tool_call>
37
+ # "json_fence" → ```json\n{"tool":…,"arguments":{…}}\n```
38
+ # "anthropic_native" → tool calling via the Anthropic SDK
39
+ # "openai_native" → tool calling via an OpenAI-compatible / Vertex endpoint
40
+ # (OpenAI, Gemini, Grok) — structured `tool_calls` in the
41
+ # response, not parsed out of the text stream
42
+ # "text_only" → no tool calling; prompt must ask for plain-text answers
43
+ # "router_only" → model is only suitable for intent classification / routing;
44
+ # MUST NOT handle coding, analysis, or multi-step tasks
45
+ format: str = "text_only"
46
+ context_window: int = 8192
47
+ thinking: bool = False # extended-reasoning / <think> tokens
48
+ vision: bool = False # supports image / multimodal input
49
+ finance_tuned: bool = False # model has finance-domain fine-tuning
50
+ # Recommended sampling params
51
+ temperature: float = 0.3
52
+ top_p: float = 0.9
53
+ # Maximum simultaneous tool calls per round (safety limit)
54
+ max_parallel_tools: int = 1
55
+ # Minimum model size class: "nano" <1B / "small" 1-4B / "medium" 4-14B / "large" >14B
56
+ size_class: str = "medium"
57
+ # Extra notes shown in /models list
58
+ notes: str = ""
59
+
60
+
61
+ def is_router_only(cap: "ModelCapability") -> bool:
62
+ """Return True if this model must NOT handle complex tasks (coding/analysis)."""
63
+ return cap.format == "router_only"
64
+
65
+
66
+ def can_handle_coding(cap: "ModelCapability") -> bool:
67
+ """Return True if the model is large/capable enough for code generation tasks."""
68
+ return (
69
+ cap.format in ("ollama_native", "xml_tags", "anthropic_native", "openai_native")
70
+ and cap.context_window >= 8192
71
+ and cap.size_class not in ("nano",)
72
+ )
73
+
74
+
75
+ def can_handle_analysis(cap: "ModelCapability") -> bool:
76
+ """Return True if the model can handle multi-step financial analysis."""
77
+ return (
78
+ cap.format not in ("router_only",)
79
+ and cap.context_window >= 4096
80
+ and cap.size_class not in ("nano",)
81
+ )
82
+
83
+
84
+ # Prefix → capability mapping. Longest prefix wins.
85
+ _CAPABILITY_TABLE: Dict[str, ModelCapability] = {
86
+ # ── Qwen family ────────────────────────────────────────────────────────
87
+ "qwen2.5-coder:32b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.2, size_class="large", notes="Best local code+finance model"),
88
+ "qwen2.5-coder:14b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.2, size_class="large"),
89
+ "qwen2.5-coder:7b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.2, size_class="medium"),
90
+ "qwen2.5-coder:3b": ModelCapability(tool_calls=True, format="ollama_native", context_window=32768, temperature=0.3, size_class="small"),
91
+ # 1.5B — too small for reliable tool calls; use text_only to prevent JSON hallucination
92
+ "qwen2.5-coder:1.5b": ModelCapability(tool_calls=False, format="text_only", context_window=8192, temperature=0.4, size_class="small", notes="1.5B — no tools; simple Q&A only"),
93
+ # 0.5B — nano class; only suitable for routing/classification, never complex tasks
94
+ "qwen2.5-coder:0.5b": ModelCapability(tool_calls=False, format="router_only", context_window=4096, temperature=0.5, size_class="nano", notes="0.5B nano — routing/intent only"),
95
+ "qwen2.5-coder": ModelCapability(tool_calls=True, format="ollama_native", context_window=32768, temperature=0.2, size_class="medium"),
96
+ "qwen2.5:72b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.2, notes="Strongest Qwen general model"),
97
+ "qwen2.5:32b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.2),
98
+ "qwen2.5:14b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.2),
99
+ "qwen2.5:7b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3),
100
+ "qwen2.5": ModelCapability(tool_calls=True, format="ollama_native", context_window=32768, temperature=0.3),
101
+ "qwen3": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, thinking=True),
102
+ "qwq": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, thinking=True, notes="Math/reasoning focused"),
103
+ # ── DeepSeek family ────────────────────────────────────────────────────
104
+ "deepseek-r1:671b": ModelCapability(tool_calls=False, format="xml_tags", context_window=131072, temperature=0.3, thinking=True, notes="State-of-the-art reasoning"),
105
+ "deepseek-r1:70b": ModelCapability(tool_calls=False, format="xml_tags", context_window=131072, temperature=0.3, thinking=True),
106
+ "deepseek-r1:32b": ModelCapability(tool_calls=False, format="xml_tags", context_window=32768, temperature=0.3, thinking=True),
107
+ "deepseek-r1:14b": ModelCapability(tool_calls=False, format="xml_tags", context_window=32768, temperature=0.3, thinking=True),
108
+ "deepseek-r1:8b": ModelCapability(tool_calls=False, format="xml_tags", context_window=32768, temperature=0.3, thinking=True),
109
+ "deepseek-r1:7b": ModelCapability(tool_calls=False, format="xml_tags", context_window=32768, temperature=0.3, thinking=True),
110
+ "deepseek-r1": ModelCapability(tool_calls=False, format="xml_tags", context_window=32768, temperature=0.3, thinking=True),
111
+ "deepseek-v3.1": ModelCapability(tool_calls=True, format="ollama_native", context_window=163840, temperature=0.3, thinking=True, notes="DeepSeek V3.1 671B"),
112
+ "deepseek-v3": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3),
113
+ "deepseek-v2.5": ModelCapability(tool_calls=True, format="ollama_native", context_window=65536, temperature=0.3),
114
+ "deepseek-coder-v2": ModelCapability(tool_calls=True, format="ollama_native", context_window=65536, temperature=0.2),
115
+ # ── LLaMA family ───────────────────────────────────────────────────────
116
+ "llama3.3:70b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, notes="Meta flagship 2024"),
117
+ "llama3.2:90b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, vision=True, notes="Multimodal, image+text"),
118
+ "llama3.2:11b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, vision=True, notes="Multimodal, image+text"),
119
+ "llama3.2:3b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3),
120
+ "llama3.2": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3),
121
+ "llama3.1:405b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3),
122
+ "llama3.1:70b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3),
123
+ "llama3.1:8b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3),
124
+ "llama3.1": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3),
125
+ "llama3": ModelCapability(tool_calls=False, format="text_only", context_window=8192, temperature=0.3),
126
+ # ── Mistral family ─────────────────────────────────────────────────────
127
+ "mistral-nemo": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3),
128
+ "mistral-large": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3),
129
+ "mistral-small": ModelCapability(tool_calls=True, format="ollama_native", context_window=32768, temperature=0.3),
130
+ "mistral:7b": ModelCapability(tool_calls=True, format="ollama_native", context_window=32768, temperature=0.3),
131
+ "mistral": ModelCapability(tool_calls=True, format="ollama_native", context_window=32768, temperature=0.3),
132
+ "mixtral": ModelCapability(tool_calls=True, format="ollama_native", context_window=32768, temperature=0.3),
133
+ # ── Phi family ─────────────────────────────────────────────────────────
134
+ "phi4:14b": ModelCapability(tool_calls=True, format="ollama_native", context_window=16384, temperature=0.3, notes="Microsoft Phi4, compact+capable"),
135
+ "phi4": ModelCapability(tool_calls=True, format="ollama_native", context_window=16384, temperature=0.3),
136
+ "phi3.5": ModelCapability(tool_calls=True, format="ollama_native", context_window=16384, temperature=0.3),
137
+ "phi3": ModelCapability(tool_calls=False, format="text_only", context_window=8192, temperature=0.3),
138
+ # ── Google Gemma ───────────────────────────────────────────────────────
139
+ "gemma3:27b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, vision=True),
140
+ "gemma3:12b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, vision=True),
141
+ "gemma3:4b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, vision=True),
142
+ "gemma3": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, vision=True),
143
+ "gemma2": ModelCapability(tool_calls=False, format="text_only", context_window=8192, temperature=0.3),
144
+ # ── Vision / multimodal models ─────────────────────────────────────────────
145
+ "llava:34b": ModelCapability(tool_calls=False, format="text_only", context_window=4096, temperature=0.3, vision=True, notes="LLaVA 34B vision-language"),
146
+ "llava:13b": ModelCapability(tool_calls=False, format="text_only", context_window=4096, temperature=0.3, vision=True),
147
+ "llava:7b": ModelCapability(tool_calls=False, format="text_only", context_window=4096, temperature=0.3, vision=True),
148
+ "llava": ModelCapability(tool_calls=False, format="text_only", context_window=4096, temperature=0.3, vision=True),
149
+ "bakllava": ModelCapability(tool_calls=False, format="text_only", context_window=4096, temperature=0.3, vision=True),
150
+ "moondream": ModelCapability(tool_calls=False, format="text_only", context_window=2048, temperature=0.3, vision=True, size_class="small", notes="Tiny vision model"),
151
+ "minicpm-v": ModelCapability(tool_calls=False, format="text_only", context_window=8192, temperature=0.3, vision=True, size_class="small"),
152
+ "qwen2-vl:72b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, vision=True, notes="Qwen2-VL 72B multimodal"),
153
+ "qwen2-vl:7b": ModelCapability(tool_calls=True, format="ollama_native", context_window=32768, temperature=0.3, vision=True),
154
+ "qwen2-vl": ModelCapability(tool_calls=True, format="ollama_native", context_window=32768, temperature=0.3, vision=True),
155
+ "qwen2.5vl:72b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, vision=True, notes="Qwen2.5-VL 72B"),
156
+ "qwen2.5vl:7b": ModelCapability(tool_calls=True, format="ollama_native", context_window=32768, temperature=0.3, vision=True),
157
+ "qwen2.5vl": ModelCapability(tool_calls=True, format="ollama_native", context_window=32768, temperature=0.3, vision=True),
158
+ # ── Finance-specific ───────────────────────────────────────────────────
159
+ "finma": ModelCapability(tool_calls=False, format="text_only", context_window=4096, temperature=0.3, finance_tuned=True),
160
+ "fingpt": ModelCapability(tool_calls=False, format="text_only", context_window=4096, temperature=0.3, finance_tuned=True),
161
+ "bloomberggpt": ModelCapability(tool_calls=False, format="text_only", context_window=2048, temperature=0.2, finance_tuned=True),
162
+ # ── Aria own models ────────────────────────────────────────────────────
163
+ # aria-sonata-3b: primary local production model — 3B, good for finance Q&A + tool calls
164
+ "aria-sonata-3b": ModelCapability(tool_calls=False, format="xml_tags", context_window=16384, temperature=0.3, size_class="small", finance_tuned=True, notes="3B local production model"),
165
+ # aria-sonata 1.x/0.5B series — GGUF Ollama models; xml_tags for text-based tool parsing
166
+ "aria-sonata:4.5-thinking": ModelCapability(tool_calls=False, format="xml_tags", context_window=8192, temperature=0.3, size_class="small", thinking=True, finance_tuned=True),
167
+ "aria-sonata:4.5-verbose": ModelCapability(tool_calls=False, format="xml_tags", context_window=8192, temperature=0.3, size_class="small", finance_tuned=True),
168
+ "aria-sonata:4.6-thinking": ModelCapability(tool_calls=False, format="xml_tags", context_window=8192, temperature=0.3, size_class="small", thinking=True, finance_tuned=True),
169
+ "aria-sonata": ModelCapability(tool_calls=False, format="xml_tags", context_window=8192, temperature=0.3, size_class="small", finance_tuned=True),
170
+ # aria-prelude: nano router model — ONLY for intent classification and routing
171
+ "aria-prelude": ModelCapability(tool_calls=False, format="router_only", context_window=4096, temperature=0.2, size_class="nano", finance_tuned=True, notes="Nano router — intent classification only"),
172
+ # ── Anthropic Claude (cloud API via providers/llm/anthropic.py) ───────
173
+ # format="anthropic_native" → tool calling via Anthropic SDK, not Ollama
174
+ # All Claude 3+ models share 200K context and native vision support.
175
+ "claude-opus-4-8": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="large", vision=True, thinking=True, notes="Claude Opus 4.8 — most capable"),
176
+ "claude-opus-4": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="large", vision=True, thinking=True),
177
+ "claude-sonnet-4-6": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="large", vision=True),
178
+ "claude-sonnet-4": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="large", vision=True),
179
+ "claude-haiku-4-5": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="medium", vision=True, notes="Claude Haiku 4.5 — fast/cheap"),
180
+ "claude-haiku-4": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="medium", vision=True),
181
+ # Claude 3.x legacy — still widely used
182
+ "claude-3-7-sonnet": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="large", vision=True, thinking=True),
183
+ "claude-3-5-sonnet": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="large", vision=True),
184
+ "claude-3-5-haiku": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="medium", vision=True),
185
+ "claude-3-opus": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="large", vision=True, thinking=True),
186
+ "claude-3-sonnet": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="large", vision=True),
187
+ "claude-3-haiku": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="medium", vision=True),
188
+ # Generic prefix catch-all for future Claude versions (longest-prefix matching ensures
189
+ # specific entries above still win over this fallback)
190
+ "claude": ModelCapability(tool_calls=True, format="anthropic_native", context_window=200000, temperature=0.3, size_class="large", vision=True),
191
+ # ── Arthera cloud-routed models (large, run via cloud API) ────────────
192
+ "gpt-oss:120b": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, thinking=True, notes="GPT-OSS 120B via Ollama Cloud"),
193
+ "gpt-oss": ModelCapability(tool_calls=True, format="ollama_native", context_window=131072, temperature=0.3, thinking=True, notes="GPT-OSS via Ollama Cloud"),
194
+ "deepseek-v3.1:671b-cloud": ModelCapability(tool_calls=True, format="ollama_native", context_window=163840, temperature=0.3, thinking=True, notes="DeepSeek V3.1 671B via Ollama Cloud"),
195
+ # ── Google Gemini (cloud, via apps/cli/providers/vertexai_stream.py) ──
196
+ # Registered here as well as in the MODELS catalogue: callers such as the
197
+ # tool-routing check in aria_cli use get_model_capability() directly, and a
198
+ # missing entry silently degrades the model to text_only / 4K context.
199
+ "gemini-2.5-pro": ModelCapability(tool_calls=True, format="openai_native", context_window=1048576, temperature=0.2, size_class="large", vision=True, thinking=True, notes="Gemini 2.5 Pro — 1M context"),
200
+ "gemini-2.5-flash": ModelCapability(tool_calls=True, format="openai_native", context_window=1048576, temperature=0.2, size_class="medium", vision=True, notes="Gemini 2.5 Flash — 1M context"),
201
+ "gemini-2.0-flash": ModelCapability(tool_calls=True, format="openai_native", context_window=1048576, temperature=0.2, size_class="medium", vision=True),
202
+ "gemini-1.5-pro": ModelCapability(tool_calls=True, format="openai_native", context_window=2097152, temperature=0.2, size_class="large", vision=True),
203
+ "gemini-1.5-flash": ModelCapability(tool_calls=True, format="openai_native", context_window=1048576, temperature=0.2, size_class="medium", vision=True),
204
+ "gemini": ModelCapability(tool_calls=True, format="openai_native", context_window=1048576, temperature=0.2, size_class="large", vision=True),
205
+ # ── OpenAI (cloud, via providers/llm/openai_compat.py) ────────────────
206
+ "gpt-5": ModelCapability(tool_calls=True, format="openai_native", context_window=400000, temperature=0.2, size_class="large", vision=True, thinking=True),
207
+ "gpt-4.1": ModelCapability(tool_calls=True, format="openai_native", context_window=1047576, temperature=0.2, size_class="large", vision=True),
208
+ "gpt-4o-mini": ModelCapability(tool_calls=True, format="openai_native", context_window=128000, temperature=0.2, size_class="medium", vision=True),
209
+ "gpt-4o": ModelCapability(tool_calls=True, format="openai_native", context_window=128000, temperature=0.2, size_class="large", vision=True),
210
+ "gpt-4-turbo": ModelCapability(tool_calls=True, format="openai_native", context_window=128000, temperature=0.2, size_class="large", vision=True),
211
+ "gpt-4": ModelCapability(tool_calls=True, format="openai_native", context_window=8192, temperature=0.2, size_class="large"),
212
+ "o4-mini": ModelCapability(tool_calls=True, format="openai_native", context_window=200000, temperature=1.0, size_class="medium", thinking=True),
213
+ "o3-mini": ModelCapability(tool_calls=True, format="openai_native", context_window=200000, temperature=1.0, size_class="medium", thinking=True),
214
+ "o3": ModelCapability(tool_calls=True, format="openai_native", context_window=200000, temperature=1.0, size_class="large", thinking=True),
215
+ "o1": ModelCapability(tool_calls=True, format="openai_native", context_window=200000, temperature=1.0, size_class="large", thinking=True),
216
+ # ── xAI Grok (cloud, OpenAI-compatible endpoint) ──────────────────────
217
+ "grok-4": ModelCapability(tool_calls=True, format="openai_native", context_window=256000, temperature=0.3, size_class="large", vision=True),
218
+ "grok": ModelCapability(tool_calls=True, format="openai_native", context_window=131072, temperature=0.3, size_class="large"),
219
+ }
220
+
221
+ # Provider-qualified ids ("google/gemini-2.5-pro", "openai/gpt-4o") are stripped
222
+ # down to the bare model name before prefix matching. The CLI stores the fully
223
+ # qualified id in its config, so without this every cloud model looked unknown.
224
+ _VENDOR_PREFIXES = (
225
+ "google/", "openai/", "anthropic/", "x-ai/", "xai/", "meta-llama/",
226
+ "mistralai/", "deepseek/", "qwen/", "alibaba/", "vertex_ai/", "vertexai/",
227
+ "azure/", "bedrock/", "openrouter/", "together/", "groq/",
228
+ )
229
+
230
+ # Default fallback when model is unknown. Deliberately conservative: guessing
231
+ # tool support wrong breaks every turn. ``UNKNOWN_MODEL_NOTE`` lets callers
232
+ # detect this case and warn the user instead of degrading in silence.
233
+ UNKNOWN_MODEL_NOTE = "Unknown model — conservative settings applied"
234
+
235
+ _DEFAULT_CAPABILITY = ModelCapability(
236
+ tool_calls=False, format="text_only", context_window=4096, temperature=0.5,
237
+ notes=UNKNOWN_MODEL_NOTE,
238
+ )
239
+
240
+
241
+ def is_unknown_model(cap: "ModelCapability") -> bool:
242
+ """Return True if *cap* is the unregistered-model fallback.
243
+
244
+ A model that is missing from the registry runs without tools and with a 4K
245
+ context budget. For a cloud model that is a severe, invisible downgrade —
246
+ it cannot read files and the context gauge is computed against the wrong
247
+ denominator — so callers should surface it rather than absorb it.
248
+ """
249
+ return cap.notes == UNKNOWN_MODEL_NOTE
250
+
251
+
252
+ def strip_vendor_prefix(model_name: str) -> str:
253
+ """Strip a provider prefix ("google/gemini-2.5-pro" → "gemini-2.5-pro")."""
254
+ name = (model_name or "").strip().lower()
255
+ for prefix in _VENDOR_PREFIXES:
256
+ if name.startswith(prefix):
257
+ return name[len(prefix):]
258
+ return name
259
+
260
+
261
+ def get_model_capability(model_name: str) -> ModelCapability:
262
+ """
263
+ Return capability for *model_name* using longest-prefix matching.
264
+
265
+ Provider-qualified ids are normalised first, so the fully qualified id the
266
+ CLI stores in its config resolves to the same entry as the bare name.
267
+
268
+ Examples::
269
+
270
+ get_model_capability("qwen2.5-coder:7b-instruct-q4_K_M")
271
+ # → same as "qwen2.5-coder:7b" entry
272
+
273
+ get_model_capability("google/gemini-2.5-pro")
274
+ # → same as "gemini-2.5-pro" entry
275
+ """
276
+ name = strip_vendor_prefix(model_name)
277
+ # Strip GGUF quantisation suffixes like :q4_k_m, :f16, etc.
278
+ clean = re.sub(r":[qfQ][0-9].*$", "", name)
279
+ # Also strip common instruct/chat/gguf tags appended after the size
280
+ clean = re.sub(r"-(instruct|chat|gguf|base|it)$", "", clean)
281
+ # Cloud ids carry a dated or "-latest" suffix ("gemini-2.5-pro-preview-06-05",
282
+ # "claude-3-5-sonnet-20241022") that must not defeat prefix matching.
283
+ clean = re.sub(r"-(latest|preview|exp)(-[0-9-]+)?$", "", clean)
284
+
285
+ best_prefix = ""
286
+ best_cap = _DEFAULT_CAPABILITY
287
+ for prefix, cap in _CAPABILITY_TABLE.items():
288
+ if clean.startswith(prefix.lower()) and len(prefix) > len(best_prefix):
289
+ best_prefix = prefix
290
+ best_cap = cap
291
+
292
+ return best_cap
293
+
294
+
295
+ # ---------------------------------------------------------------------------
296
+ # Tool schema injection helpers
297
+ # ---------------------------------------------------------------------------
298
+
299
+ def build_ollama_tool_payload(
300
+ tools_schema: List[Dict],
301
+ model_name: str,
302
+ ) -> Optional[List[Dict]]:
303
+ """
304
+ Return the `tools` field for an Ollama /api/chat request, or None when the
305
+ model does not support native tool calling.
306
+
307
+ When format == "ollama_native" the schema is passed as-is.
308
+ When format == "xml_tags" we skip the field and rely on prompt injection.
309
+ """
310
+ cap = get_model_capability(model_name)
311
+ if not cap.tool_calls or cap.format != "ollama_native":
312
+ return None
313
+ return tools_schema
314
+
315
+
316
+ def build_tool_system_prompt(
317
+ tools_schema: List[Dict],
318
+ model_name: str,
319
+ ) -> str:
320
+ """
321
+ For models that do NOT support native tool calls (xml_tags / text_only),
322
+ return a system-prompt block that instructs the model to emit
323
+ ``<tool_call>{"name":…,"arguments":{…}}</tool_call>`` tags.
324
+ """
325
+ cap = get_model_capability(model_name)
326
+ if cap.tool_calls and cap.format == "ollama_native":
327
+ return "" # handled by native API
328
+
329
+ tool_list = []
330
+ for t in tools_schema:
331
+ fn = t.get("function", t)
332
+ params = fn.get("parameters", {}).get("properties", {})
333
+ required = fn.get("parameters", {}).get("required", [])
334
+ param_str = ", ".join(
335
+ f"{k}: {v.get('type','any')}{'*' if k in required else ''}"
336
+ for k, v in params.items()
337
+ )
338
+ tool_list.append(f" - {fn['name']}({param_str}): {fn.get('description','')}")
339
+
340
+ tools_block = "\n".join(tool_list)
341
+ return (
342
+ "\n\n## Available Tools\n\n"
343
+ "When you need to call a tool, output EXACTLY this format (nothing else on the line):\n\n"
344
+ '<tool_call>{"name": "tool_name", "arguments": {"param": "value"}}</tool_call>\n\n'
345
+ "Tools available:\n"
346
+ f"{tools_block}\n\n"
347
+ "Rules:\n"
348
+ "1. Call ONE tool at a time. Wait for the result before calling the next.\n"
349
+ "2. After receiving a tool result, continue your analysis or call another tool.\n"
350
+ "3. When done with all tools, write your final answer in plain text.\n"
351
+ "4. Never make up tool results — always call the tool.\n"
352
+ )
353
+
354
+
355
+ # ---------------------------------------------------------------------------
356
+ # Tool call parsers
357
+ # ---------------------------------------------------------------------------
358
+
359
+ def parse_tool_calls_from_response(
360
+ text: str,
361
+ native_calls: Optional[List[Dict]] = None,
362
+ model_name: str = "",
363
+ ) -> List[Dict[str, Any]]:
364
+ """
365
+ Unified parser. Returns list of {"tool": str, "params": dict}.
366
+
367
+ Priority:
368
+ 1. native_calls (Ollama tool_calls list) — most reliable
369
+ 2. XML tags <tool_call>…</tool_call>
370
+ 3. JSON code fences ```json … ```
371
+ 4. Raw JSON object containing "name"/"arguments" keys
372
+ """
373
+ # 1. Native Ollama tool calls
374
+ if native_calls:
375
+ result = []
376
+ for tc in native_calls:
377
+ fn = tc.get("function", tc)
378
+ name = fn.get("name", "")
379
+ args = fn.get("arguments", {})
380
+ if isinstance(args, str):
381
+ try:
382
+ args = json.loads(args)
383
+ except json.JSONDecodeError:
384
+ args = {}
385
+ if name:
386
+ result.append({"tool": name, "params": args})
387
+ if result:
388
+ return result
389
+
390
+ if not text:
391
+ return []
392
+
393
+ results: List[Dict[str, Any]] = []
394
+
395
+ # 2. XML tag format: <tool_call>…</tool_call>
396
+ xml_pattern = re.compile(
397
+ r"<tool_call>\s*(.*?)\s*</tool_call>", re.DOTALL | re.IGNORECASE
398
+ )
399
+ for m in xml_pattern.finditer(text):
400
+ tc = _try_parse_json(m.group(1))
401
+ if tc:
402
+ results.append(_normalise_call(tc))
403
+
404
+ if results:
405
+ return results
406
+
407
+ # 3. JSON fence: ```json … ``` or ``` … ```
408
+ fence_pattern = re.compile(
409
+ r"```(?:json)?\s*(\{.*?\})\s*```", re.DOTALL | re.IGNORECASE
410
+ )
411
+ for m in fence_pattern.finditer(text):
412
+ tc = _try_parse_json(m.group(1))
413
+ if tc and ("name" in tc or "tool" in tc):
414
+ results.append(_normalise_call(tc))
415
+
416
+ if results:
417
+ return results
418
+
419
+ # 4. Bare JSON object anywhere in text
420
+ json_pattern = re.compile(r"\{[^{}]*\"(?:name|tool)\"[^{}]*\}", re.DOTALL)
421
+ for m in json_pattern.finditer(text):
422
+ tc = _try_parse_json(m.group(0))
423
+ if tc and ("name" in tc or "tool" in tc):
424
+ results.append(_normalise_call(tc))
425
+
426
+ return results
427
+
428
+
429
+ def _try_parse_json(s: str) -> Optional[Dict]:
430
+ try:
431
+ return json.loads(s.strip())
432
+ except (json.JSONDecodeError, TypeError):
433
+ return None
434
+
435
+
436
+ def _normalise_call(tc: Dict) -> Dict[str, Any]:
437
+ """Normalise various key naming conventions → {"tool": …, "params": …}."""
438
+ name = tc.get("name") or tc.get("tool") or tc.get("function", {}).get("name", "")
439
+ args = (
440
+ tc.get("arguments")
441
+ or tc.get("params")
442
+ or tc.get("parameters")
443
+ or tc.get("function", {}).get("arguments", {})
444
+ or {}
445
+ )
446
+ if isinstance(args, str):
447
+ args = _try_parse_json(args) or {}
448
+ return {"tool": name, "params": args}
449
+
450
+
451
+ # ---------------------------------------------------------------------------
452
+ # Recommended local models for finance work
453
+ # ---------------------------------------------------------------------------
454
+
455
+ RECOMMENDED_FINANCE_MODELS: List[Dict[str, str]] = [
456
+ {
457
+ "model": "qwen2.5-coder:7b",
458
+ "reason": "Best balance of tool calling + code generation for finance scripts",
459
+ "install": "ollama pull qwen2.5-coder:7b",
460
+ "vram_gb": "5",
461
+ },
462
+ {
463
+ "model": "qwen2.5:14b",
464
+ "reason": "Strong quantitative reasoning, multi-turn strategy analysis",
465
+ "install": "ollama pull qwen2.5:14b",
466
+ "vram_gb": "10",
467
+ },
468
+ {
469
+ "model": "deepseek-r1:14b",
470
+ "reason": "Deep reasoning for complex factor models (slow but thorough)",
471
+ "install": "ollama pull deepseek-r1:14b",
472
+ "vram_gb": "10",
473
+ },
474
+ {
475
+ "model": "llama3.2:3b",
476
+ "reason": "Ultra-fast for quick quotes and simple questions",
477
+ "install": "ollama pull llama3.2:3b",
478
+ "vram_gb": "2",
479
+ },
480
+ {
481
+ "model": "phi4:14b",
482
+ "reason": "Math-strong, good for Greeks / derivative pricing",
483
+ "install": "ollama pull phi4",
484
+ "vram_gb": "9",
485
+ },
486
+ ]
@@ -0,0 +1,4 @@
1
+ """Compatibility import for :mod:`tools.notification_tools`."""
2
+ from importlib import import_module as _import_module
3
+ import sys as _sys
4
+ _sys.modules[__name__] = _import_module("tools.notification_tools")
@@ -0,0 +1,4 @@
1
+ """Compatibility import for :mod:`clients.openai_image_client`."""
2
+ from importlib import import_module as _import_module
3
+ import sys as _sys
4
+ _sys.modules[__name__] = _import_module("clients.openai_image_client")
@@ -0,0 +1,23 @@
1
+ """Aria Code package facade layer.
2
+
3
+ This namespace is intentionally thin. It exposes stable package boundaries
4
+ without forcing the existing single-file CLI to move all implementation code at
5
+ once.
6
+ """
7
+
8
+ import pathlib as _pathlib
9
+
10
+ # Extend __path__ to include Arthera/packages/ so that
11
+ # `from packages.quant_engine.*` resolves transparently.
12
+ _arthera_pkgs = _pathlib.Path(__file__).parents[2] / "Arthera" / "packages"
13
+ if _arthera_pkgs.exists() and str(_arthera_pkgs) not in __path__:
14
+ __path__.append(str(_arthera_pkgs))
15
+
16
+ __all__ = [
17
+ "aria_agents",
18
+ "aria_core",
19
+ "aria_infra",
20
+ "aria_mcp",
21
+ "aria_skills",
22
+ "aria_tools",
23
+ ]
@@ -0,0 +1,11 @@
1
+ """Safe integration points between Aria Code services and Google ADK.
2
+
3
+ The bridge deliberately exports only read-only, bounded market-data tools.
4
+ Trading, broker credentials, shell access, and filesystem mutation stay outside
5
+ the ADK tool surface and continue to be governed by Aria's existing runtime.
6
+ """
7
+
8
+ from .code_review_tools import CodeReviewTools
9
+ from .market_tools import MarketResearchTools
10
+
11
+ __all__ = ["CodeReviewTools", "MarketResearchTools"]
@@ -0,0 +1,49 @@
1
+ """Read-only code-review tool surface for Google ADK."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from pathlib import PurePath
6
+ from typing import Any, Dict
7
+
8
+
9
+ class CodeReviewTools:
10
+ """Review submitted source text without filesystem or shell capabilities."""
11
+
12
+ def review_code(self, source: str, filename: str = "snippet.py", language: str = "python") -> Dict[str, Any]:
13
+ """Return deterministic review findings for caller-provided code only.
14
+
15
+ Args:
16
+ source: Source code pasted by the user. File paths are never read.
17
+ filename: Display name used to infer language; directory components are ignored.
18
+ language: Source language, currently with additional syntax checks for Python.
19
+ """
20
+ # 惰性导入:agents/__init__.py 会连带拉起 registry 和各 financial agent,
21
+ # 122 个模块、numpy 在内,约 260ms。放在模块级会让 packages.adk_bridge 整体
22
+ # 变重,也会让 agents/ 侧的任何导入故障连累 MarketResearchTools——两个工具面
23
+ # 本该互不影响。market_tools.py 对 DataService 用的是同一套惰性做法。
24
+ from agents.code_review import CodeReviewAgent
25
+
26
+ if not isinstance(source, str) or not source.strip():
27
+ return {"success": False, "error": "Non-empty source text is required."}
28
+ if len(source) > CodeReviewAgent.MAX_SOURCE_CHARS:
29
+ return {
30
+ "success": False,
31
+ "error": f"Source exceeds the {CodeReviewAgent.MAX_SOURCE_CHARS}-character review limit; split it by file.",
32
+ }
33
+
34
+ safe_filename = PurePath(str(filename or "snippet.py")).name[:160] or "snippet.py"
35
+ findings = CodeReviewAgent.review_source(source, filename=safe_filename, language=str(language or "python"))
36
+ counts = {severity: 0 for severity in ("critical", "high", "medium", "low")}
37
+ for finding in findings:
38
+ counts[finding.severity] += 1
39
+ return {
40
+ "success": True,
41
+ "filename": safe_filename,
42
+ "language": str(language or "python")[:32],
43
+ "findings": [finding.to_dict() for finding in findings],
44
+ "counts": counts,
45
+ "limitations": [
46
+ "Static checks only; it did not read a file, execute code, run tests, or inspect dependencies.",
47
+ "Review findings are not a security certification.",
48
+ ],
49
+ }