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,222 @@
1
+ """
2
+ agents/engineering/coder.py — Coder Agent
3
+ =========================================
4
+ Engineering agent responsible for translating Quant Strategist Rule Trees
5
+ into self-contained, robust, executable Python / TypeScript backtest scripts.
6
+ Never dumps raw unexecuted code into user dialogue; saves directly to disk.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import inspect
12
+ import logging
13
+ import os
14
+ import pathlib
15
+ import re
16
+ import shlex
17
+ import subprocess
18
+ from typing import Any, Awaitable, Callable, Dict, Optional
19
+
20
+ from ..base import BaseAgent, AgentResult
21
+
22
+ logger = logging.getLogger(__name__)
23
+
24
+
25
+ class CoderAgent(BaseAgent):
26
+ name = "coder"
27
+ description = "编码智能体 — 在指定工作区读写文件;执行命令需宿主明确授权"
28
+
29
+ def __init__(
30
+ self,
31
+ output_dir: Optional[pathlib.Path] = None,
32
+ llm_provider=None,
33
+ data_router=None,
34
+ on_token: Optional[Callable[[str], None]] = None,
35
+ on_thought: Optional[Callable[[str], None]] = None,
36
+ on_tool_start: Optional[Callable[[str, Dict], None]] = None,
37
+ on_tool_end: Optional[Callable[[str, Any], None]] = None,
38
+ lang: str = "zh",
39
+ command_approval: Optional[Callable[[list[str], pathlib.Path], bool | Awaitable[bool]]] = None,
40
+ on_user_question: Optional[Callable[[str], str | Awaitable[str]]] = None,
41
+ ) -> None:
42
+ super().__init__(
43
+ llm_provider=llm_provider,
44
+ data_router=data_router,
45
+ on_token=on_token,
46
+ on_thought=on_thought,
47
+ on_tool_start=on_tool_start,
48
+ on_tool_end=on_tool_end,
49
+ lang=lang,
50
+ )
51
+ self.output_dir = (output_dir or pathlib.Path.cwd() / "generated").resolve()
52
+ self.command_approval = command_approval
53
+ self.on_user_question = on_user_question
54
+
55
+ def _workspace_path(self, raw_path: str, *, required: bool = True) -> pathlib.Path:
56
+ """Resolve a model-supplied path without allowing access outside the workspace."""
57
+ if required and not raw_path:
58
+ raise ValueError("A workspace-relative path is required")
59
+ path = pathlib.Path(raw_path)
60
+ if path.is_absolute():
61
+ raise ValueError("Absolute paths are not allowed")
62
+ resolved = (self.output_dir / path).resolve()
63
+ if not resolved.is_relative_to(self.output_dir):
64
+ raise ValueError("Path escapes the workspace")
65
+ return resolved
66
+
67
+ async def _execute_tool(self, tool_name: str, tool_args: Dict[str, Any]) -> str:
68
+ if self.on_tool_start:
69
+ self.on_tool_start(tool_name, tool_args)
70
+
71
+ try:
72
+ if tool_name == "run_command":
73
+ argv = shlex.split(str(tool_args.get("command", "")))
74
+ if not argv:
75
+ raise ValueError("Command is required")
76
+ cwd = self._workspace_path(str(tool_args.get("cwd", "")), required=False)
77
+ if not cwd.is_dir():
78
+ raise ValueError("Command directory does not exist")
79
+ if self.command_approval is None:
80
+ result = "Error: command approval is unavailable; command was not run"
81
+ else:
82
+ approved = self.command_approval(argv, cwd)
83
+ if inspect.isawaitable(approved):
84
+ approved = await approved
85
+ if not approved:
86
+ result = "Error: command was denied; command was not run"
87
+ else:
88
+ proc = subprocess.run(argv, shell=False, cwd=cwd, capture_output=True, text=True, timeout=120)
89
+ result = f"STDOUT:\n{proc.stdout}\nSTDERR:\n{proc.stderr}\nReturnCode: {proc.returncode}"
90
+
91
+ elif tool_name in {"write_file", "read_file", "edit_file_chunk"}:
92
+ path = self._workspace_path(str(tool_args.get("filename", "")))
93
+ if tool_name == "write_file":
94
+ path.parent.mkdir(parents=True, exist_ok=True)
95
+ path.write_text(str(tool_args.get("content", "")), encoding="utf-8")
96
+ result = f"Successfully wrote full file to {path}"
97
+ elif tool_name == "read_file":
98
+ lines = path.read_text(encoding="utf-8").splitlines()
99
+ result = f"File: {path}\n" + "\n".join(f"{i:04d} | {line}" for i, line in enumerate(lines, 1))
100
+ else:
101
+ target = str(tool_args.get("target_content", ""))
102
+ if not target:
103
+ raise ValueError("target_content is required")
104
+ original = path.read_text(encoding="utf-8")
105
+ if target not in original:
106
+ result = f"Error: target_content not found in {path}"
107
+ else:
108
+ path.write_text(original.replace(target, str(tool_args.get("replacement_content", ""))), encoding="utf-8")
109
+ result = f"Successfully replaced chunk in {path}"
110
+
111
+ elif tool_name == "search_code":
112
+ query = str(tool_args.get("query", ""))
113
+ if not query:
114
+ raise ValueError("Search query is required")
115
+ matches: list[str] = []
116
+ for root, dirs, files in os.walk(self.output_dir, followlinks=False):
117
+ dirs[:] = [name for name in dirs if not name.startswith(".")]
118
+ for filename in files:
119
+ if len(matches) >= 50:
120
+ break
121
+ path = pathlib.Path(root) / filename
122
+ try:
123
+ if filename.startswith(".") or not path.resolve().is_relative_to(self.output_dir) or path.stat().st_size > 1_000_000:
124
+ continue
125
+ lines = path.read_text(encoding="utf-8").splitlines()
126
+ except (OSError, UnicodeError):
127
+ continue
128
+ for line_no, line in enumerate(lines, 1):
129
+ if query in line:
130
+ matches.append(f"{path.relative_to(self.output_dir)}:{line_no}:{line}")
131
+ if len(matches) >= 50:
132
+ break
133
+ if len(matches) >= 50:
134
+ break
135
+ result = "\n".join(matches) if matches else "No matches found."
136
+
137
+ elif tool_name == "list_dir":
138
+ path = self._workspace_path(str(tool_args.get("path", "")), required=False)
139
+ if not path.is_dir():
140
+ raise ValueError("Directory does not exist")
141
+ items: list[str] = []
142
+ for root, dirs, files in os.walk(path, followlinks=False):
143
+ depth = len(pathlib.Path(root).relative_to(path).parts)
144
+ if depth >= 3:
145
+ dirs[:] = []
146
+ dirs[:] = [name for name in dirs if not name.startswith(".")]
147
+ items.extend(str((pathlib.Path(root) / name).relative_to(path)) for name in dirs + files if not name.startswith("."))
148
+ if len(items) >= 200:
149
+ break
150
+ result = "\n".join(items[:200])
151
+
152
+ elif tool_name == "take_screenshot":
153
+ result = "Error: screenshot capability is not configured; no image was captured"
154
+
155
+ elif tool_name == "github_api":
156
+ repo = str(tool_args.get("repo", ""))
157
+ issue = str(tool_args.get("issue_number", ""))
158
+ if tool_args.get("action") != "read_issue" or not re.fullmatch(r"[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+", repo) or not issue.isdecimal():
159
+ raise ValueError("Only read_issue with a valid repository and issue number is supported")
160
+ proc = subprocess.run(["gh", "issue", "view", issue, "--repo", repo], shell=False, capture_output=True, text=True, timeout=30)
161
+ result = proc.stdout if proc.returncode == 0 else proc.stderr
162
+
163
+ elif tool_name == "ask_user":
164
+ question = str(tool_args.get("question", ""))
165
+ if self.on_user_question is None:
166
+ result = "Error: user interaction is unavailable; no user response was received"
167
+ else:
168
+ answer = self.on_user_question(question)
169
+ if inspect.isawaitable(answer):
170
+ answer = await answer
171
+ result = f"USER REPLIED: {answer}"
172
+ else:
173
+ result = await super()._execute_tool(tool_name, tool_args)
174
+ except (OSError, ValueError, subprocess.TimeoutExpired) as exc:
175
+ result = f"Tool Error: {exc}"
176
+
177
+ if self.on_tool_end:
178
+ self.on_tool_end(tool_name, result)
179
+ return result
180
+
181
+ async def analyze(self, symbol: str, data: Dict[str, Any]) -> AgentResult:
182
+ """
183
+ Advanced Autonomous Software Engineer Loop (Cursor/Claude Code caliber).
184
+ """
185
+ rule_tree = data.get("strategy_rules") or data.get("rule_tree")
186
+ request_text = data.get("request", "Write a Python script.")
187
+
188
+ system_prompt = (
189
+ "You are a software engineer working within a bounded local workspace. "
190
+ "Use workspace-relative paths only. Never claim an action succeeded without a tool result.\n"
191
+ "Tools: list_dir(path), search_code(query), read_file(filename), "
192
+ "write_file(filename, content), edit_file_chunk(filename, target_content, replacement_content), "
193
+ "github_api(action='read_issue', repo='owner/repo', issue_number='123').\n"
194
+ "run_command(command, cwd) executes an argv command only after host approval. "
195
+ "If approval is unavailable or denied, do not retry to bypass it; report that verification was not run. "
196
+ "Shell pipelines, redirects and command substitution are unavailable.\n"
197
+ "Screenshot capture is unavailable; do not claim visual verification.\n"
198
+ + ("ask_user(question) forwards a real question to the host.\n" if self.on_user_question else "User interaction is unavailable; do not invent a reply.\n")
199
+ + "Call a tool with one JSON block per turn: "
200
+ + '{"type":"tool_call","name":"<tool_name>","args":{}}\n'
201
+ + "Inspect context, make focused edits, request approved verification, and report observed results."
202
+ )
203
+
204
+ user_prompt = f"Workspace: {self.output_dir}\nTarget Symbol: {symbol}\nRules: {rule_tree}\nUser Request: {request_text}\n\nPlease begin autonomous execution."
205
+
206
+ analysis = await self._call_llm(system_prompt, user_prompt, max_tokens=2500, max_tool_loops=15)
207
+
208
+ report = (
209
+ f"### Aria Coder - Engineering Report\n\n"
210
+ f"**项目根目录**:`{self.output_dir.absolute()}`\n\n"
211
+ f"**执行记录与结果**:\n{analysis}\n"
212
+ )
213
+
214
+ return AgentResult(
215
+ agent=self.name,
216
+ symbol=symbol,
217
+ analysis=report,
218
+ confidence=0.5,
219
+ signal="HOLD",
220
+ key_points=[],
221
+ data_used={"workspace": str(self.output_dir)},
222
+ )
@@ -0,0 +1,145 @@
1
+ """
2
+ agents/engineering/tester.py — Tester & Self-Healing Agent
3
+ =========================================================
4
+ Engineering agent responsible for running fast pre-flight compilation checks,
5
+ sandbox dry-runs, traceback diagnosis, and surgical patch self-healing.
6
+ Delivers concise, high-signal results without terminal log flooding.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import logging
12
+ import pathlib
13
+ import sys
14
+ from typing import Any, Callable, Dict, List, Optional
15
+
16
+ from ..base import BaseAgent, AgentResult
17
+ from aria_code.runtime.self_healing import SelfHealingEngine, SelfHealingResult
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+ class TesterAgent(BaseAgent):
23
+ __test__ = False
24
+ name = "tester"
25
+ description = "测试与自愈智能体 — 负责代码静态预检、沙箱试跑与自动诊断修复"
26
+
27
+ def __init__(
28
+ self,
29
+ llm_provider=None,
30
+ data_router=None,
31
+ on_token: Optional[Callable[[str], None]] = None,
32
+ on_thought: Optional[Callable[[str], None]] = None,
33
+ on_tool_start: Optional[Callable[[str, Dict], None]] = None,
34
+ on_tool_end: Optional[Callable[[str, Any], None]] = None,
35
+ lang: str = "zh",
36
+ max_retries: int = 3,
37
+ ) -> None:
38
+ super().__init__(
39
+ llm_provider=llm_provider,
40
+ data_router=data_router,
41
+ on_token=on_token,
42
+ on_thought=on_thought,
43
+ on_tool_start=on_tool_start,
44
+ on_tool_end=on_tool_end,
45
+ lang=lang,
46
+ )
47
+ self.engine = SelfHealingEngine(python_executable=sys.executable, max_retries=max_retries)
48
+
49
+ async def analyze(self, symbol: str, data: Dict[str, Any]) -> AgentResult:
50
+ """
51
+ Run test and self-healing on the target script.
52
+ """
53
+ script_path_str = data.get("script_path") or data.get("file_path") or ""
54
+ if not script_path_str:
55
+ # Look in generated folder
56
+ gen_path = pathlib.Path.cwd() / "generated" / f"strategy_{symbol.replace('.', '_').replace('-', '_').lower()}.py"
57
+ if gen_path.exists():
58
+ script_path_str = str(gen_path)
59
+ else:
60
+ return AgentResult(
61
+ agent=self.name,
62
+ symbol=symbol,
63
+ analysis=f"❌ 未找到待测试的代码文件: {symbol}",
64
+ confidence=0.0,
65
+ signal="HOLD",
66
+ error="Missing script_path",
67
+ )
68
+
69
+ target_file = pathlib.Path(script_path_str)
70
+ if not target_file.exists():
71
+ return AgentResult(
72
+ agent=self.name,
73
+ symbol=symbol,
74
+ analysis=f"❌ 目标文件不存在: {target_file}",
75
+ confidence=0.0,
76
+ signal="HOLD",
77
+ error=f"File not found: {target_file}",
78
+ )
79
+
80
+ # Run Self-Healing Engine
81
+ heal_result: SelfHealingResult = await self.engine.execute_and_heal(target_file)
82
+
83
+ if heal_result.success:
84
+ m = heal_result.metrics
85
+ ann_ret = m.get("annual_return_pct", m.get("total_return_pct", 0.0))
86
+ sharpe = m.get("sharpe_ratio", 0.0)
87
+ max_dd = m.get("max_drawdown_pct", 0.0)
88
+ win_rate = m.get("win_rate_pct", 0.0)
89
+ trades = m.get("total_trades", 0)
90
+
91
+ patch_msg = ""
92
+ if heal_result.patches_applied:
93
+ patch_msg = f"\n• 🛠️ 自动诊断与自愈修复: 已应用 {len(heal_result.patches_applied)} 处差量补丁 (未整文件重写)"
94
+
95
+ summary = (
96
+ f"### 🧪 回测执行验证成功\n\n"
97
+ f"| 关键回测指标 | 数值 |\n"
98
+ f"| :--- | :--- |\n"
99
+ f"| **年化收益率 (Annual Return)** | `{ann_ret}%` |\n"
100
+ f"| **夏普比率 (Sharpe Ratio)** | `{sharpe}` |\n"
101
+ f"| **最大回撤 (Max Drawdown)** | `{max_dd}%` |\n"
102
+ f"| **策略胜率 (Win Rate)** | `{win_rate}%` ({trades} 笔交易) |\n\n"
103
+ f"**产物交付路径**:\n"
104
+ f"- 策略脚本: `{target_file}`\n"
105
+ + "\n".join(f"- 输出产物: `{p}`" for p in heal_result.artifact_paths if p != str(target_file))
106
+ + patch_msg
107
+ )
108
+
109
+ signal = "STRONG_BUY" if sharpe > 1.5 and max_dd < 15.0 else ("BUY" if sharpe > 0.8 else "HOLD")
110
+
111
+ return AgentResult(
112
+ agent=self.name,
113
+ symbol=symbol,
114
+ analysis=summary,
115
+ confidence=0.92,
116
+ signal=signal,
117
+ key_points=[
118
+ f"Annual Return: {ann_ret}%",
119
+ f"Sharpe Ratio: {sharpe}",
120
+ f"Max Drawdown: {max_dd}%",
121
+ f"Win Rate: {win_rate}%",
122
+ ],
123
+ data_used={
124
+ "metrics": m,
125
+ "artifact_paths": heal_result.artifact_paths,
126
+ "patches_applied": heal_result.patches_applied,
127
+ },
128
+ )
129
+ else:
130
+ return AgentResult(
131
+ agent=self.name,
132
+ symbol=symbol,
133
+ analysis=f"❌ 测试自愈失败: {heal_result.error}",
134
+ confidence=0.0,
135
+ signal="HOLD",
136
+ error=heal_result.error,
137
+ data_used={"patches_applied": heal_result.patches_applied},
138
+ )
139
+
140
+
141
+ class TesterSelfHealingAgent(TesterAgent):
142
+ """Alias for TesterAgent."""
143
+ __test__ = False
144
+ name = "debugger"
145
+ description = "调试与自愈智能体 — 负责捕捉 Traceback 并精准修补代码"
@@ -0,0 +1,21 @@
1
+ from .technical import TechnicalAgent
2
+ from .macro import MacroAgent
3
+ from .fundamental import FundamentalAgent
4
+ from .risk import RiskAgent
5
+ from .synthesis import SynthesisAgent
6
+ from .strategist import StrategistAgent
7
+ from .corporate_finance import CorporateFinanceAgent
8
+ from .cashflow_burn import CashflowBurnRateAgent
9
+ from .stripe_revenue import StripeRevenueAgent
10
+
11
+ __all__ = [
12
+ "TechnicalAgent",
13
+ "MacroAgent",
14
+ "FundamentalAgent",
15
+ "RiskAgent",
16
+ "SynthesisAgent",
17
+ "StrategistAgent",
18
+ "CorporateFinanceAgent",
19
+ "CashflowBurnRateAgent",
20
+ "StripeRevenueAgent",
21
+ ]
@@ -0,0 +1,119 @@
1
+ """
2
+ agents/financial/cashflow_burn.py — Cash Flow, Burn Rate & Runway Analysis Agent
3
+ ==============================================================================
4
+ Monitors enterprise cash flow sustainability:
5
+ 1. Gross Burn vs. Net Burn Rate
6
+ 2. Cash Runway (Months of survival under zero revenue or current operations)
7
+ 3. Accounts Receivable Aging Breakdown & Bad Debt Risk
8
+ 4. Working Capital Liquidity Stress Testing
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import logging
14
+ from typing import Any, Callable, Dict, List, Optional
15
+
16
+ from ..base import BaseAgent, AgentResult
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+ class CashflowBurnRateAgent(BaseAgent):
22
+ name = "cashflow_burn"
23
+ description = "企业现金流与烧钱率智能体 — 负责现金跑道测算、月度烧钱率与应收账龄风险审计"
24
+
25
+ def __init__(
26
+ self,
27
+ llm_provider=None,
28
+ data_router=None,
29
+ on_token: Optional[Callable[[str], None]] = None,
30
+ on_thought: Optional[Callable[[str], None]] = None,
31
+ on_tool_start: Optional[Callable[[str, Dict], None]] = None,
32
+ on_tool_end: Optional[Callable[[str, Any], None]] = None,
33
+ lang: str = "zh",
34
+ ) -> None:
35
+ super().__init__(
36
+ llm_provider=llm_provider,
37
+ data_router=data_router,
38
+ on_token=on_token,
39
+ on_thought=on_thought,
40
+ on_tool_start=on_tool_start,
41
+ on_tool_end=on_tool_end,
42
+ lang=lang,
43
+ )
44
+
45
+ async def analyze(self, symbol: str, data: Dict[str, Any]) -> AgentResult:
46
+ """
47
+ Analyze cash flow, burn rate, and runway.
48
+ """
49
+ company_name = symbol or data.get("company_name", "Enterprise")
50
+ cash = float(data.get("cash", data.get("cash_and_equivalents", 5000000.0)))
51
+ monthly_inflows = float(data.get("monthly_inflows", data.get("revenue_monthly", 800000.0)))
52
+ monthly_outflows = float(data.get("monthly_outflows", data.get("expenses_monthly", 1000000.0)))
53
+ ar_aging = data.get("ar_aging", {
54
+ "within_30_days": 1200000.0,
55
+ "days_31_60": 500000.0,
56
+ "days_61_90": 200000.0,
57
+ "over_90_days": 100000.0,
58
+ })
59
+
60
+ gross_burn = monthly_outflows
61
+ net_burn = monthly_outflows - monthly_inflows
62
+
63
+ if net_burn > 0:
64
+ runway_months = cash / net_burn
65
+ status = "CONCERN" if runway_months < 12.0 else ("SEVERE" if runway_months < 6.0 else "GOOD")
66
+ else:
67
+ runway_months = 999.0
68
+ status = "GOOD"
69
+
70
+ total_ar = sum(ar_aging.values())
71
+ overdue_ar = ar_aging.get("days_61_90", 0.0) + ar_aging.get("over_90_days", 0.0)
72
+ overdue_pct = (overdue_ar / max(1.0, total_ar)) * 100.0
73
+
74
+ runway_str = f"{runway_months:.1f} 个月" if runway_months < 100.0 else "正向自由现金流 (无需消耗现金储备)"
75
+ burn_str = f"¥{net_burn:,.2f}/月" if net_burn > 0 else f"正向结余 ¥{abs(net_burn):,.2f}/月"
76
+
77
+ analysis_text = (
78
+ f"### 💰 企业现金流与跑道 (Runway) 分析报告: {company_name}\n\n"
79
+ f"• **当前现金储备**: `¥{cash:,.2f}`\n"
80
+ f"• **月度净消耗 (Net Burn)**: `{burn_str}` (月支出 `¥{gross_burn:,.2f}`)\n"
81
+ f"• **现金可持续跑道**: `{runway_str}`\n"
82
+ f"• **应收账款总额**: `¥{total_ar:,.2f}` (逾期 >60天占比: `{overdue_pct:.1f}%`)\n\n"
83
+ f"**📊 账龄结构 (AR Aging)**:\n"
84
+ f"- 30天以内 (正常): `¥{ar_aging.get('within_30_days', 0):,.2f}`\n"
85
+ f"- 31-60天: `¥{ar_aging.get('days_31_60', 0):,.2f}`\n"
86
+ f"- 61-90天 (预警): `¥{ar_aging.get('days_61_90', 0):,.2f}`\n"
87
+ f"- >90天 (高坏账风险): `¥{ar_aging.get('over_90_days', 0):,.2f}`\n\n"
88
+ f"**💡 资金管理对策**:\n"
89
+ )
90
+
91
+ if net_burn > 0 and runway_months < 12.0:
92
+ analysis_text += f"- ⚠️ 现金跑道短于 12 个月,需严控固定支出或推进催收逾期款项 ¥{overdue_ar:,.2f}。\n"
93
+ else:
94
+ analysis_text += "- ✓ 现金储备处于安全水位,可按计划支持业务拓展。\n"
95
+
96
+ if overdue_pct > 15.0:
97
+ analysis_text += f"- ⚠️ 逾期账款占比达 {overdue_pct:.1f}%,需启动法务/催收介入以防死账坏账。"
98
+
99
+ return AgentResult(
100
+ agent=self.name,
101
+ symbol=company_name,
102
+ analysis=analysis_text,
103
+ confidence=0.93,
104
+ signal=status,
105
+ key_points=[
106
+ f"Cash Reserve: ¥{cash:,.2f}",
107
+ f"Net Burn Rate: {burn_str}",
108
+ f"Runway: {runway_str}",
109
+ f"Overdue AR (>60d): ¥{overdue_ar:,.2f} ({overdue_pct:.1f}%)",
110
+ ],
111
+ data_used={
112
+ "cash": cash,
113
+ "gross_burn": gross_burn,
114
+ "net_burn": net_burn,
115
+ "runway_months": runway_months,
116
+ "ar_aging": ar_aging,
117
+ },
118
+ provenance=["cashflow-runway-engine", "ar-aging-risk-matrix"],
119
+ )