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,5 @@
1
+ """Shared financial source helpers.
2
+
3
+ The old skill wrappers were demo invocations without production data contracts.
4
+ Financial analysis runs through the configured data router and financial-service.
5
+ """
@@ -0,0 +1,92 @@
1
+ """查找已安装 skills 并桥接显式配置的 Arthera 子包。
2
+
3
+ skill 那边其实早就有一套正规的发现顺序 —— packages/aria_skills/loader.py
4
+ 的 default_skill_roots()(ARIA_SKILLS_PATH 环境变量 → 同级 aria-skills
5
+ checkout → ~/.arthera/skills → ~/.claude/skills → …)。这里直接复用它,
6
+ 而不是再写第二套查找逻辑,免得两处顺序不一致时出现"CLI 能发现这个 skill、
7
+ 工具却找不到它的脚本"。
8
+
9
+ Arthera 子包是私有仓库的东西,公开仓库无从假设它在哪;仅支持显式的
10
+ ARTHERA_ROOT / ARTHERA_PATH 设置,不隐式发现相邻源码目录。
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import os
16
+ import sys
17
+ from pathlib import Path
18
+ from aria_code.packages.aria_core.paths import aria_home
19
+
20
+ __all__ = ["find_skill_script", "missing_script_message", "ensure_arthera_root"]
21
+
22
+
23
+ def _skill_roots() -> list[Path]:
24
+ """优先复用 skill loader 的发现顺序;它不可用时退化为等价的最小实现。"""
25
+ try:
26
+ from packages.aria_skills.loader import default_skill_roots
27
+
28
+ return [Path(p) for p in default_skill_roots()]
29
+ except Exception:
30
+ roots: list[Path] = []
31
+ configured = os.getenv("ARIA_SKILLS_PATH", "")
32
+ roots.extend(
33
+ Path(item).expanduser() for item in configured.split(os.pathsep) if item.strip()
34
+ )
35
+ repository = Path(__file__).resolve().parents[3]
36
+ roots.extend([
37
+ repository.parent / "aria-skills" / "skills",
38
+ aria_home() / "skills",
39
+ Path.home() / ".aria" / "skills",
40
+ Path.home() / ".claude" / "skills",
41
+ ])
42
+ return roots
43
+
44
+
45
+ def find_skill_script(skill_name: str, script_name: str) -> Path | None:
46
+ """返回 <某个 skill 根>/<skill_name>/scripts/<script_name>,找不到返回 None。
47
+
48
+ 调用方负责把 None 变成对用户有意义的提示——这里不抛异常,因为"本机没装
49
+ 这个 skill 目录"是完全正常的部署形态,不是错误。
50
+ """
51
+ for root in _skill_roots():
52
+ candidate = root / skill_name / "scripts" / script_name
53
+ try:
54
+ if candidate.is_file():
55
+ return candidate
56
+ except OSError:
57
+ continue
58
+ return None
59
+
60
+
61
+ def missing_script_message(skill_name: str, script_name: str) -> str:
62
+ """脚本缺失时给出可操作的提示,而不是打印一条别人机器上不存在的路径。"""
63
+ return (
64
+ f"Error: 找不到 {skill_name}/scripts/{script_name}。"
65
+ " 请获取 aria-skills 目录,并用 ARIA_SKILLS_PATH 指向其中的 skills/,"
66
+ "或把它放在 aria-code 的同级目录下。"
67
+ )
68
+
69
+
70
+ def ensure_arthera_root() -> bool:
71
+ """把 Arthera 仓库根目录加进 sys.path,让 ``packages.*`` 可导入。返回是否找到。
72
+
73
+ Arthera 是私有仓库,公开仓库不该假设它
74
+ 在某个写死的绝对路径上。这里认的是 ``ARTHERA_ROOT``(doctor.py 与
75
+ backtest_cmds.py 已经在用的同一个变量),不隐式发现旁边的源码目录。
76
+ """
77
+ candidates: list[Path] = []
78
+ for var in ("ARTHERA_ROOT", "ARTHERA_PATH"):
79
+ configured = os.getenv(var, "")
80
+ if configured.strip():
81
+ candidates.append(Path(configured).expanduser())
82
+
83
+ for candidate in candidates:
84
+ try:
85
+ if candidate.is_dir():
86
+ path_str = str(candidate)
87
+ if path_str not in sys.path:
88
+ sys.path.append(path_str)
89
+ return True
90
+ except OSError:
91
+ continue
92
+ return False
@@ -0,0 +1,129 @@
1
+ """Tool registry facade over Aria Code's legacy LOCAL_TOOLS shape."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass, field
6
+ from typing import Any, Callable, Dict, Iterable, List, Mapping, Optional
7
+
8
+ from aria_code.packages.aria_core import CapabilityManifest, PermissionLevel, ServiceKind
9
+
10
+
11
+ Handler = Callable[[dict], dict]
12
+
13
+
14
+ _PERMISSION_BY_TOOL = {
15
+ "read_file": [PermissionLevel.READ_ONLY],
16
+ "list_files": [PermissionLevel.READ_ONLY],
17
+ "search_code": [PermissionLevel.READ_ONLY],
18
+ "glob": [PermissionLevel.READ_ONLY],
19
+ "write_file": [PermissionLevel.WORKSPACE_WRITE],
20
+ "edit_file": [PermissionLevel.WORKSPACE_WRITE],
21
+ "notebook_edit": [PermissionLevel.WORKSPACE_WRITE],
22
+ "run_command": [PermissionLevel.WORKSPACE_WRITE],
23
+ "process": [PermissionLevel.WORKSPACE_WRITE],
24
+ "web_fetch": [PermissionLevel.NETWORK],
25
+ "github": [PermissionLevel.NETWORK],
26
+ "get_market_data": [PermissionLevel.NETWORK],
27
+ "broker_query": [PermissionLevel.BROKER_READ],
28
+ "broker_order": [PermissionLevel.BROKER_TRADE],
29
+ }
30
+
31
+
32
+ @dataclass(frozen=True)
33
+ class ToolSpec:
34
+ name: str
35
+ handler: Optional[Handler]
36
+ description: str
37
+ schema: Dict[str, Any] = field(default_factory=dict)
38
+ permissions: List[PermissionLevel] = field(default_factory=list)
39
+ capabilities: List[str] = field(default_factory=list)
40
+
41
+ def manifest(self) -> CapabilityManifest:
42
+ return CapabilityManifest(
43
+ name=self.name,
44
+ kind=ServiceKind.TOOL,
45
+ description=self.description,
46
+ capabilities=self.capabilities,
47
+ permissions=self.permissions,
48
+ input_schema=self.schema,
49
+ tags=["tool"],
50
+ )
51
+
52
+
53
+ class ToolRegistry:
54
+ """Small typed registry that can wrap existing dict-based tools."""
55
+
56
+ def __init__(self) -> None:
57
+ self._tools: Dict[str, ToolSpec] = {}
58
+
59
+ def register(self, spec: ToolSpec, *, overwrite: bool = False) -> None:
60
+ if spec.name in self._tools and not overwrite:
61
+ raise ValueError(f"tool already registered: {spec.name}")
62
+ self._tools[spec.name] = spec
63
+
64
+ def get(self, name: str) -> Optional[ToolSpec]:
65
+ return self._tools.get(name)
66
+
67
+ def list(self) -> List[ToolSpec]:
68
+ return [self._tools[name] for name in sorted(self._tools)]
69
+
70
+ def manifests(self) -> List[CapabilityManifest]:
71
+ return [tool.manifest() for tool in self.list()]
72
+
73
+ def legacy_tools(self) -> Dict[str, tuple]:
74
+ return {
75
+ name: (spec.handler, spec.description)
76
+ for name, spec in self._tools.items()
77
+ if spec.handler is not None
78
+ }
79
+
80
+
81
+ def _schema_by_name(schemas: Iterable[dict]) -> Dict[str, dict]:
82
+ out: Dict[str, dict] = {}
83
+ for schema in schemas or []:
84
+ fn = schema.get("function") or {}
85
+ name = fn.get("name")
86
+ if name:
87
+ out[name] = fn.get("parameters") or {}
88
+ return out
89
+
90
+
91
+ def _capabilities_for_tool(name: str) -> List[str]:
92
+ if name.startswith("broker_"):
93
+ return ["broker"]
94
+ if name in ("get_market_data",) or "market" in name or "quote" in name:
95
+ return ["market.data"]
96
+ if name in ("read_file", "list_files", "search_code", "glob"):
97
+ return ["workspace.read"]
98
+ if name in ("write_file", "edit_file", "notebook_edit"):
99
+ return ["workspace.write"]
100
+ if name in ("run_command", "process"):
101
+ return ["shell"]
102
+ if name in ("web_fetch", "github"):
103
+ return ["network"]
104
+ return ["tool"]
105
+
106
+
107
+ def build_registry_from_legacy(
108
+ tools: Mapping[str, tuple],
109
+ schemas: Iterable[dict] = (),
110
+ ) -> ToolRegistry:
111
+ """Create a typed registry from ``LOCAL_TOOLS`` and tool schemas."""
112
+
113
+ registry = ToolRegistry()
114
+ schema_map = _schema_by_name(schemas)
115
+ for name, value in tools.items():
116
+ handler = value[0] if value else None
117
+ description = value[1] if len(value) > 1 else ""
118
+ registry.register(
119
+ ToolSpec(
120
+ name=name,
121
+ handler=handler,
122
+ description=description,
123
+ schema=schema_map.get(name, {}),
124
+ permissions=_PERMISSION_BY_TOOL.get(name, [PermissionLevel.READ_ONLY]),
125
+ capabilities=_capabilities_for_tool(name),
126
+ ),
127
+ overwrite=True,
128
+ )
129
+ return registry
@@ -0,0 +1,33 @@
1
+ """quant_engine — vendored commodity quant modules (sports + stochastic).
2
+
3
+ Elo/Dixon-Coles football prediction and Black-Scholes/Monte-Carlo/Kelly
4
+ options+derivatives math. Proprietary factor/ML/strategy engines stay in the
5
+ private Arthera platform.
6
+
7
+ Open-core boundary: callers MUST go through ``is_available()`` and degrade
8
+ gracefully when it returns False. Today the source is bundled, so it is always
9
+ available — but routing every use through this boundary means the day the engine
10
+ is split into a separate compiled (.so) wheel, the free shell keeps working with
11
+ no caller changes (see tools/build_quant_engine.py, CLOSING_SOURCE.md).
12
+ """
13
+
14
+ from importlib.util import find_spec
15
+
16
+ # Compiled/private engine distributions may retain only this public stub.
17
+ # Absence of the optional extension helper must not prevent is_available().
18
+ try:
19
+ from ._namespace import extend as _extend_namespace
20
+ except ImportError:
21
+ pass
22
+ else:
23
+ _extend_namespace(__path__, "")
24
+
25
+ __version__ = "1.0.0"
26
+
27
+
28
+ def is_available() -> bool:
29
+ """True if the quant engine (bundled source or compiled wheel) can be imported."""
30
+ try:
31
+ return find_spec("aria_code.packages.quant_engine.stochastic") is not None
32
+ except Exception:
33
+ return False
@@ -0,0 +1,24 @@
1
+ """Explicit legacy backend opt-in; never search a developer's filesystem.
2
+
3
+ Standalone financial-service over MCP is the normal integration. Existing
4
+ private integrations may deliberately set ARTHERA_ROOT until their public API
5
+ cutover. Bundled modules keep precedence over that configured source.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import os
11
+ from pathlib import Path
12
+ from typing import List
13
+
14
+
15
+ def extend(package_path: List[str], subpackage: str) -> None:
16
+ configured = os.getenv("ARTHERA_ROOT", "").strip()
17
+ if not configured:
18
+ return
19
+ candidate = Path(configured).expanduser() / "packages" / "quant_engine" / subpackage
20
+ try:
21
+ if candidate.is_dir() and str(candidate) not in package_path:
22
+ package_path.append(str(candidate))
23
+ except OSError:
24
+ return
@@ -0,0 +1,10 @@
1
+ """Backtest engine for evaluating AI trading signals."""
2
+
3
+ from .core import Order, Position, Portfolio
4
+ from .engine import BacktestEngine
5
+
6
+ __all__ = ["Order", "Position", "Portfolio", "BacktestEngine"]
7
+
8
+ # Optional explicit backend modules never override this distribution.
9
+ from .._namespace import extend as _extend_namespace
10
+ _extend_namespace(__path__, "backtest")
@@ -0,0 +1,53 @@
1
+ from dataclasses import dataclass, field
2
+ from typing import Dict, List, Optional
3
+ from datetime import datetime
4
+
5
+ @dataclass
6
+ class Order:
7
+ symbol: str
8
+ quantity: float
9
+ price: float
10
+ order_type: str = "MARKET"
11
+ direction: str = "BUY" # BUY or SELL
12
+ status: str = "PENDING"
13
+ timestamp: Optional[datetime] = None
14
+
15
+ @dataclass
16
+ class Position:
17
+ symbol: str
18
+ quantity: float = 0.0
19
+ avg_price: float = 0.0
20
+
21
+ @property
22
+ def market_value(self, current_price: float) -> float:
23
+ return self.quantity * current_price
24
+
25
+ def update(self, quantity: float, price: float, is_buy: bool):
26
+ if is_buy:
27
+ total_cost = (self.quantity * self.avg_price) + (quantity * price)
28
+ self.quantity += quantity
29
+ self.avg_price = total_cost / self.quantity if self.quantity > 0 else 0
30
+ else:
31
+ self.quantity -= quantity
32
+ if self.quantity <= 0:
33
+ self.avg_price = 0.0
34
+ self.quantity = 0.0
35
+
36
+ class Portfolio:
37
+ def __init__(self, initial_cash: float = 100000.0):
38
+ self.initial_cash = initial_cash
39
+ self.cash = initial_cash
40
+ self.positions: Dict[str, Position] = {}
41
+ self.history: List[Dict] = []
42
+
43
+ def get_position(self, symbol: str) -> Position:
44
+ if symbol not in self.positions:
45
+ self.positions[symbol] = Position(symbol=symbol)
46
+ return self.positions[symbol]
47
+
48
+ def total_value(self, current_prices: Dict[str, float]) -> float:
49
+ pos_value = sum(
50
+ pos.quantity * current_prices.get(sym, pos.avg_price)
51
+ for sym, pos in self.positions.items()
52
+ )
53
+ return self.cash + pos_value
@@ -0,0 +1,102 @@
1
+ from typing import List, Dict, Any
2
+ import pandas as pd
3
+ from .core import Portfolio, Order
4
+
5
+ class BacktestEngine:
6
+ """Minimal Event-Driven Backtest Engine for Agent Signals"""
7
+
8
+ def __init__(self, initial_cash: float = 100000.0):
9
+ self.portfolio = Portfolio(initial_cash=initial_cash)
10
+ self.orders: List[Order] = []
11
+
12
+ def run_signals(self, price_data: pd.DataFrame, signals: List[Dict[str, Any]]):
13
+ """
14
+ Run backtest based on daily prices and agent signals.
15
+ price_data expects index to be datetime, with 'close' column.
16
+ signals expects format: [{'date': 'YYYY-MM-DD', 'signal': 'BUY', 'confidence': 0.8, 'symbol': 'AAPL'}]
17
+ """
18
+ # Convert signals to a dictionary indexed by date for O(1) lookup
19
+ signal_dict = {}
20
+ for s in signals:
21
+ try:
22
+ date_str = pd.to_datetime(s['date']).strftime('%Y-%m-%d')
23
+ signal_dict[date_str] = s
24
+ except (ValueError, TypeError, KeyError):
25
+ # 裸 except 会连 KeyboardInterrupt / SystemExit 一起吞掉——
26
+ # 循环里跑着时用户按 Ctrl+C 会被静默忽略。这里真正要容忍的
27
+ # 只是"某条信号的日期字段解析不了",收窄到具体异常。
28
+ pass
29
+
30
+ equity_curve = []
31
+
32
+ for date, row in price_data.iterrows():
33
+ current_price = float(row['close'])
34
+ date_str = date.strftime('%Y-%m-%d')
35
+ symbol = "UNKNOWN" # Simplification for single-asset backtest for now
36
+
37
+ # Check for signals on this date
38
+ if date_str in signal_dict:
39
+ sig = signal_dict[date_str]
40
+ symbol = sig.get('symbol', 'UNKNOWN')
41
+ action = sig.get('signal', 'HOLD').upper()
42
+ confidence = float(sig.get('confidence', 0.5))
43
+
44
+ if action == 'BUY':
45
+ # Allocate portion of cash based on confidence
46
+ target_investment = self.portfolio.cash * confidence
47
+ qty = int(target_investment / current_price)
48
+ if qty > 0:
49
+ cost = qty * current_price
50
+ self.portfolio.cash -= cost
51
+ pos = self.portfolio.get_position(symbol)
52
+ pos.update(qty, current_price, True)
53
+ self.orders.append(Order(symbol, qty, current_price, direction="BUY", status="FILLED", timestamp=date))
54
+
55
+ elif action in ['SELL', 'REDUCE']:
56
+ pos = self.portfolio.get_position(symbol)
57
+ if pos.quantity > 0:
58
+ # Sell portion based on confidence
59
+ sell_qty = int(pos.quantity * confidence)
60
+ if sell_qty > 0:
61
+ proceeds = sell_qty * current_price
62
+ self.portfolio.cash += proceeds
63
+ pos.update(sell_qty, current_price, False)
64
+ self.orders.append(Order(symbol, sell_qty, current_price, direction="SELL", status="FILLED", timestamp=date))
65
+
66
+ # Record daily equity
67
+ total_val = self.portfolio.total_value({symbol: current_price})
68
+ equity_curve.append({
69
+ 'date': date,
70
+ 'total_value': total_val,
71
+ 'cash': self.portfolio.cash
72
+ })
73
+
74
+ return pd.DataFrame(equity_curve).set_index('date')
75
+
76
+ def calculate_metrics(self, equity_df: pd.DataFrame) -> Dict[str, float]:
77
+ if equity_df.empty:
78
+ return {}
79
+
80
+ returns = equity_df['total_value'].pct_change().dropna()
81
+ total_return = (equity_df['total_value'].iloc[-1] / self.portfolio.initial_cash) - 1.0
82
+
83
+ # Periods a year from the equity curve's own dates; 252 when it has none.
84
+ from aria_code.domain import performance_stats as stats
85
+
86
+ periods = stats.periods_per_year_from_dates(
87
+ len(returns), equity_df.index[0], equity_df.index[-1]
88
+ ) or float(stats.FALLBACK_PERIODS_PER_YEAR)
89
+ ann_vol = returns.std() * (periods ** 0.5) if not returns.empty else 0.0
90
+ sharpe = (returns.mean() * periods) / ann_vol if ann_vol > 0 else 0.0
91
+
92
+ cum_ret = (1 + returns).cumprod()
93
+ peak = cum_ret.cummax()
94
+ drawdown = (cum_ret - peak) / peak
95
+ max_dd = drawdown.min()
96
+
97
+ return {
98
+ "total_return_pct": round(total_return * 100, 2),
99
+ "annualized_volatility_pct": round(ann_vol * 100, 2),
100
+ "sharpe_ratio": round(sharpe, 2),
101
+ "max_drawdown_pct": round(max_dd * 100, 2) if not pd.isna(max_dd) else 0.0
102
+ }
@@ -0,0 +1,9 @@
1
+ """Portfolio optimization engine."""
2
+
3
+ from .optimizer import PortfolioOptimizer
4
+
5
+ __all__ = ["PortfolioOptimizer"]
6
+
7
+ # Optional explicit backend modules never override this distribution.
8
+ from .._namespace import extend as _extend_namespace
9
+ _extend_namespace(__path__, "portfolio")
@@ -0,0 +1,85 @@
1
+ import numpy as np
2
+ import pandas as pd
3
+ from scipy.optimize import minimize
4
+ from typing import Dict, List, Tuple
5
+
6
+ class PortfolioOptimizer:
7
+ """Quantitative Portfolio Optimization Engine"""
8
+
9
+ def __init__(self, risk_free_rate: float = 0.02):
10
+ self.risk_free_rate = risk_free_rate
11
+
12
+ def _get_returns_stats(self, prices_df: pd.DataFrame) -> Tuple[np.ndarray, np.ndarray]:
13
+ returns = prices_df.pct_change().dropna()
14
+ mean_returns = returns.mean().values * 252
15
+ cov_matrix = returns.cov().values * 252
16
+ return mean_returns, cov_matrix
17
+
18
+ def portfolio_performance(self, weights: np.ndarray, mean_returns: np.ndarray, cov_matrix: np.ndarray) -> Tuple[float, float]:
19
+ returns = np.sum(mean_returns * weights)
20
+ std = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
21
+ return returns, std
22
+
23
+ def min_variance(self, prices_df: pd.DataFrame) -> Dict[str, float]:
24
+ """Minimize portfolio variance"""
25
+ symbols = prices_df.columns.tolist()
26
+ num_assets = len(symbols)
27
+ _, cov_matrix = self._get_returns_stats(prices_df)
28
+
29
+ args = (cov_matrix,)
30
+ def portfolio_volatility(weights, cov):
31
+ return np.sqrt(np.dot(weights.T, np.dot(cov, weights)))
32
+
33
+ constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
34
+ bounds = tuple((0.0, 1.0) for asset in range(num_assets))
35
+ initial_guess = num_assets * [1. / num_assets,]
36
+
37
+ result = minimize(portfolio_volatility, initial_guess, args=args,
38
+ method='SLSQP', bounds=bounds, constraints=constraints)
39
+
40
+ return {sym: round(weight, 4) for sym, weight in zip(symbols, result.x)}
41
+
42
+ def max_sharpe(self, prices_df: pd.DataFrame) -> Dict[str, float]:
43
+ """Maximize Sharpe Ratio"""
44
+ symbols = prices_df.columns.tolist()
45
+ num_assets = len(symbols)
46
+ mean_returns, cov_matrix = self._get_returns_stats(prices_df)
47
+
48
+ def neg_sharpe_ratio(weights, mean_ret, cov, rf_rate):
49
+ p_ret, p_std = self.portfolio_performance(weights, mean_ret, cov)
50
+ return -(p_ret - rf_rate) / p_std
51
+
52
+ args = (mean_returns, cov_matrix, self.risk_free_rate)
53
+ constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
54
+ bounds = tuple((0.0, 1.0) for asset in range(num_assets))
55
+ initial_guess = num_assets * [1. / num_assets,]
56
+
57
+ result = minimize(neg_sharpe_ratio, initial_guess, args=args,
58
+ method='SLSQP', bounds=bounds, constraints=constraints)
59
+
60
+ return {sym: round(weight, 4) for sym, weight in zip(symbols, result.x)}
61
+
62
+ def risk_parity(self, prices_df: pd.DataFrame) -> Dict[str, float]:
63
+ """Inverse volatility weighting (naive risk parity)"""
64
+ returns = prices_df.pct_change().dropna()
65
+ volatilities = returns.std() * np.sqrt(252)
66
+ inv_vol = 1.0 / volatilities
67
+ weights = inv_vol / inv_vol.sum()
68
+
69
+ return {sym: round(weights[sym], 4) for sym in prices_df.columns}
70
+
71
+ def combine_agent_signals(self, optimal_weights: Dict[str, float], agent_confidences: Dict[str, float]) -> Dict[str, float]:
72
+ """
73
+ Adjust optimal weights based on Agent confidence.
74
+ For example, if max_sharpe gives AAPL 0.6, but Agent confidence is 0.5,
75
+ we scale it down and keep remaining in cash.
76
+ """
77
+ final_weights = {}
78
+ for sym, w in optimal_weights.items():
79
+ conf = agent_confidences.get(sym, 1.0)
80
+ final_weights[sym] = round(w * conf, 4)
81
+
82
+ cash_weight = round(1.0 - sum(final_weights.values()), 4)
83
+ final_weights['CASH'] = max(0.0, cash_weight)
84
+
85
+ return final_weights
@@ -0,0 +1,76 @@
1
+ """
2
+ packages/quant_engine/sports — 足球量化分析模块
3
+ ================================================
4
+ v2.0.0 — 2026-06
5
+
6
+ 模块组成:
7
+ elo — World Football Elo 动态评分系统(二次曲线攻防,GD K 因子)
8
+ dixon_coles — Dixon-Coles 比分预测(NB 分布,大比分悬殊自动启用)
9
+ form — 近期状态分析(指数衰减权重)
10
+ h2h — 历史交锋分析与调整
11
+ predictor — 统一预测引擎 v2(动态权重、赛事情境、ρ 校准)
12
+ tracker — 预测追踪、Brier Score、自动 Elo 同步、动态场均进球
13
+
14
+ 快速使用:
15
+ from packages.quant_engine.sports import quick_predict, get_elo
16
+
17
+ # 预测(含 NB 分布 + 动态权重)
18
+ result = quick_predict("germany", "curacao", league="wc")
19
+ print(f"德国赢率: {result['home_win']*100:.1f}%") # ~85%
20
+
21
+ # Elo 评分
22
+ elo = get_elo()
23
+ print(elo.get_rating("germany")) # ~1912(赛后更新)
24
+
25
+ # 自动同步已结束 WC 比赛 Elo
26
+ from packages.quant_engine.sports import sync_elo_from_wc
27
+ sync_elo_from_wc(api_get_fn)
28
+ """
29
+
30
+ from .elo import EloRatingSystem, get_elo, ranking_to_elo
31
+ from .dixon_coles import (
32
+ compute_match_probabilities,
33
+ predict_scoreline_matrix,
34
+ tau_correction,
35
+ estimate_rho_from_results,
36
+ format_dc_result,
37
+ )
38
+ from .form import analyze_form, parse_api_results, form_bar, momentum_label
39
+ from .h2h import analyze_h2h
40
+ from .predictor import FootballPredictor, get_predictor, quick_predict
41
+ from .tracker import (
42
+ record_prediction,
43
+ record_result,
44
+ get_accuracy_stats,
45
+ sync_elo_from_wc,
46
+ fetch_wc_league_avg,
47
+ fetch_wc_rho,
48
+ auto_calibrate,
49
+ backfill_score_metrics,
50
+ )
51
+ from .calibrator import (
52
+ get_calibrated_params,
53
+ get_team_goal_bias,
54
+ get_all_team_biases,
55
+ calibration_summary,
56
+ save_calibration,
57
+ )
58
+
59
+ __all__ = [
60
+ "EloRatingSystem", "get_elo", "ranking_to_elo",
61
+ "compute_match_probabilities", "predict_scoreline_matrix",
62
+ "tau_correction", "estimate_rho_from_results", "format_dc_result",
63
+ "analyze_form", "parse_api_results", "form_bar", "momentum_label",
64
+ "analyze_h2h",
65
+ "FootballPredictor", "get_predictor", "quick_predict",
66
+ "record_prediction", "record_result", "get_accuracy_stats",
67
+ "sync_elo_from_wc", "fetch_wc_league_avg", "fetch_wc_rho", "auto_calibrate",
68
+ "get_calibrated_params", "get_team_goal_bias", "get_all_team_biases",
69
+ "calibration_summary", "save_calibration",
70
+ ]
71
+
72
+ __version__ = "2.0.0"
73
+
74
+ # Optional explicit backend modules never override this distribution.
75
+ from .._namespace import extend as _extend_namespace
76
+ _extend_namespace(__path__, "sports")