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,232 @@
1
+ """Describe how Aria packages should be exposed over MCP."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass
6
+ from typing import Dict, List
7
+
8
+
9
+ @dataclass(frozen=True)
10
+ class MCPExposure:
11
+ name: str
12
+ target: str
13
+ description: str
14
+ read_only: bool = True
15
+
16
+ def to_tool_descriptor(self) -> Dict[str, object]:
17
+ return {
18
+ "name": self.name,
19
+ "description": self.description,
20
+ "target": self.target,
21
+ "read_only": self.read_only,
22
+ }
23
+
24
+
25
+ def default_exposures() -> List[MCPExposure]:
26
+ """Initial MCP server surface for Aria Code.
27
+
28
+ These names are stable contracts. The server implementation can bind them
29
+ to ToolRegistry/AgentRegistry without changing client-facing tool names.
30
+ """
31
+
32
+ return [
33
+ MCPExposure("aria.warehouse.task", "agent:warehouse_navigation",
34
+ "Delegate a bounded simulation goal to the stateful warehouse task agent; it observes, plans, executes, replans and verifies. No hardware connection.", read_only=False),
35
+ MCPExposure("aria.market.quote", "tool:get_market_data", "Fetch quote and technical market snapshot."),
36
+ MCPExposure("aria.agent.team", "agent:team", "Run multi-agent financial research."),
37
+ MCPExposure("aria.report.generate", "tool:report_generate", "Fetch data + generate a full HTML research report artifact for a symbol.", read_only=False),
38
+ MCPExposure("aria.backtest.run", "tool:backtest_run", "Run a historical strategy simulation (buy_hold or sma_cross) against real price history.", read_only=False),
39
+ # Governance: what Aria knows about a change that another agent does not.
40
+ MCPExposure(
41
+ "aria.risk.assess",
42
+ "infra:risk",
43
+ "How risky is this action? Give a shell `command` (or a `tool` and its `params`) and get "
44
+ "its level L0-L4, the capabilities it uses (filesystem.write, package.install, git.push, "
45
+ "cloud.deploy, hardware.flash, actuator.command, ...), whether it can be undone, what it "
46
+ "reaches (hosts, files, systems) and whether it needs approval. Read-only: nothing runs.",
47
+ ),
48
+ MCPExposure(
49
+ "aria.contract.check",
50
+ "infra:contract",
51
+ "Would the project's change contract (.aria/policy.yaml) allow this tool call? Returns "
52
+ "allowed/blocked with the rule that decided it, and the contract in force. A project with "
53
+ "no contract allows everything; one whose policy cannot be read allows reads only. Read-only.",
54
+ ),
55
+ MCPExposure(
56
+ "aria.project.impact",
57
+ "infra:impact",
58
+ "What does changing these files or symbols reach? Dependents, tests and the services that "
59
+ "ship them, from the project's import graph. Use before editing code others depend on. Read-only.",
60
+ ),
61
+ MCPExposure(
62
+ "aria.project.commands",
63
+ "infra:commands",
64
+ "The project's own test, build, lint and simulation commands (from .aria/project.yaml, ROS 2 "
65
+ "packages, package.json, Cargo.toml, go.mod, pyproject.toml or Makefile targets). Read-only; "
66
+ "nothing is run and nothing is guessed.",
67
+ ),
68
+ MCPExposure("aria.artifacts.list", "infra:artifacts", "List local generated artifacts."),
69
+ MCPExposure(
70
+ "aria.skill.list",
71
+ "infra:skills",
72
+ "List the installed portable SKILL.md workflows — reusable expert playbooks "
73
+ "for design, research, and engineering tasks (e.g. UI design systems, "
74
+ "anti-generic-AI-look UI critique, trading-app patterns, equity research, "
75
+ "backtest validation). Pass `query` to rank by relevance to a task "
76
+ "description instead of listing everything.",
77
+ ),
78
+ MCPExposure(
79
+ "aria.skill.get",
80
+ "infra:skills",
81
+ "Fetch one skill's full instructions by name (from aria.skill.list). Returns "
82
+ "the SKILL.md workflow text for you to follow yourself — skills are "
83
+ "instruction documents, not executable tools, so nothing runs server-side. "
84
+ "The response lists any bundled `references` docs; when the instructions tell "
85
+ "you to read one, call this again with `reference` set to that filename.",
86
+ ),
87
+ MCPExposure("aria.broker.positions", "tool:broker_positions", "Read account info + positions for a configured broker."),
88
+ MCPExposure("aria.broker.list_previews", "tool:broker_list_previews", "List recent order previews, including TradingView-triggered ones."),
89
+ MCPExposure(
90
+ "aria.broker.preview_order",
91
+ "tool:broker_preview_order",
92
+ "Build a risk-checked order preview. Never executes a trade by itself — "
93
+ "actual execution needs either a human running /trade confirm in the aria-code "
94
+ "terminal, or aria.broker.confirm_order if the user explicitly opted that broker "
95
+ "into chat-confirmed execution (off by default; see aria.broker.confirm_order).",
96
+ read_only=False,
97
+ ),
98
+ MCPExposure(
99
+ "aria.broker.confirm_order",
100
+ "tool:broker_confirm_order",
101
+ "Execute a previously built order preview — REAL MONEY. Refuses unless the user "
102
+ "already ran /trade allow-chat-confirm <broker_id> in the aria-code terminal "
103
+ "themselves (a real trade cannot be confirmed for the first time from chat; that "
104
+ "opt-in can only happen at the terminal keyboard) AND this call passes confirmed=true.",
105
+ read_only=False,
106
+ ),
107
+ MCPExposure(
108
+ "aria.report.chart",
109
+ "tool:report_chart",
110
+ "Generate a candlestick + moving-average chart PNG for a symbol.",
111
+ read_only=False,
112
+ ),
113
+ MCPExposure(
114
+ "aria.report.indicator_chart",
115
+ "tool:report_indicator_chart",
116
+ "Generate a candlestick + volume + RSI(14) + MACD(12,26,9) multi-panel chart "
117
+ "PNG for a symbol — for when you need the indicators plotted, not just price.",
118
+ read_only=False,
119
+ ),
120
+ MCPExposure(
121
+ "aria.report.comparison_chart",
122
+ "tool:report_comparison_chart",
123
+ "Generate a normalized (base=100) % return comparison chart PNG across 2+ symbols.",
124
+ read_only=False,
125
+ ),
126
+ MCPExposure(
127
+ "aria.report.allocation_chart",
128
+ "tool:report_allocation_chart",
129
+ "Generate a pie chart PNG of a broker account's position weights by market value.",
130
+ read_only=False,
131
+ ),
132
+ MCPExposure(
133
+ "aria.report.pdf",
134
+ "tool:report_pdf",
135
+ "Render Markdown text to a styled PDF report.",
136
+ read_only=False,
137
+ ),
138
+ MCPExposure(
139
+ "aria.report.canva_upload_asset",
140
+ "tool:canva_upload_asset",
141
+ "Upload a local image (e.g. a chart PNG from aria.report.chart) to Canva and "
142
+ "return its asset_id, for use in aria.report.canva_design's data field. "
143
+ "Requires /canva connect to have been run first.",
144
+ read_only=False,
145
+ ),
146
+ MCPExposure(
147
+ "aria.report.estimate_image_cost",
148
+ "tool:openai_estimate_image_cost",
149
+ "Get an illustrative per-image cost estimate (USD) for OpenAI's gpt-image-1 "
150
+ "at a given size/quality, before generating. Free, no API call to OpenAI.",
151
+ ),
152
+ MCPExposure(
153
+ "aria.report.generate_image",
154
+ "tool:openai_generate_image",
155
+ "Generate a new image from a text prompt (e.g. minimal-editorial-poster's "
156
+ "compiled prompt) via OpenAI's gpt-image-1. Real per-call cost, billed by "
157
+ "OpenAI the instant this succeeds — requires confirmed=true, and calling "
158
+ "aria.report.estimate_image_cost first is strongly recommended. Requires an "
159
+ "OpenAI API key (/apikey set openai sk-... or OPENAI_API_KEY).",
160
+ read_only=False,
161
+ ),
162
+ MCPExposure(
163
+ "aria.report.edit_image",
164
+ "tool:openai_edit_image",
165
+ "Transform an existing local photo per a text prompt (duotone, background "
166
+ "simplification, texture overlay, etc.) via OpenAI's gpt-image-1 edits "
167
+ "endpoint. Pass mask_path for inpainting — a local mask PNG where transparent "
168
+ "areas mark what to edit and opaque areas are left untouched — to constrain "
169
+ "the edit to part of the image instead of the whole thing. Real per-call cost, "
170
+ "billed by OpenAI the instant this succeeds — requires confirmed=true, and "
171
+ "calling aria.report.estimate_image_cost first is strongly recommended. "
172
+ "Requires an OpenAI API key.",
173
+ read_only=False,
174
+ ),
175
+ MCPExposure(
176
+ "aria.report.generate_image_local",
177
+ "tool:local_generate_image",
178
+ "Generate a new image from a text prompt entirely locally via a self-hosted "
179
+ "open-weight model (SDXL-Turbo by default) — no API key, no per-call cost, "
180
+ "runs on this machine. Needs the optional 'image_gen' extra installed. "
181
+ "First call for a given model downloads its weights (several GB).",
182
+ read_only=False,
183
+ ),
184
+ MCPExposure(
185
+ "aria.report.edit_image_local",
186
+ "tool:local_edit_image",
187
+ "Transform an existing local photo per a text prompt, entirely locally "
188
+ "(image-to-image, no API key). Needs the optional 'image_gen' extra installed.",
189
+ read_only=False,
190
+ ),
191
+ MCPExposure(
192
+ "aria.report.canva_design",
193
+ "tool:canva_autofill",
194
+ "Fill a Canva brand template with data and export the design draft. "
195
+ "Requires /canva connect to have been run first.",
196
+ read_only=False,
197
+ ),
198
+ MCPExposure("aria.report.docx", "tool:report_docx", "Render Markdown text to an editable Word document.", read_only=False),
199
+ MCPExposure("aria.report.pptx", "tool:report_pptx", "Render Markdown text to an editable slide deck (one slide per heading).", read_only=False),
200
+ MCPExposure("aria.figma.read_file", "tool:figma_read_file", "Read a Figma file's page/frame structure (depth-limited summary, not the full node tree). Read-only — Figma has no API for writing designs."),
201
+ MCPExposure("aria.figma.comments", "tool:figma_comments", "List comments on a Figma file."),
202
+ MCPExposure("aria.video.probe", "tool:video_probe", "Read a video's duration/resolution/codec info."),
203
+ MCPExposure("aria.video.trim", "tool:video_trim", "Cut a [start, end] second range out of a local video.", read_only=False),
204
+ MCPExposure("aria.video.concat", "tool:video_concat", "Concatenate multiple local videos in order.", read_only=False),
205
+ MCPExposure("aria.video.overlay_text", "tool:video_overlay_text", "Burn a text overlay onto a local video (top/bottom/center).", read_only=False),
206
+ MCPExposure("aria.video.overlay_audio", "tool:video_overlay_audio", "Add or replace a local video's audio track.", read_only=False),
207
+ MCPExposure("aria.video.convert", "tool:video_convert", "Convert a local video's format and/or reframe to a target aspect ratio (e.g. 9:16 for vertical).", read_only=False),
208
+ MCPExposure("aria.video.change_speed", "tool:video_change_speed", "Speed up or slow down a local video (pitch-corrected audio).", read_only=False),
209
+ MCPExposure("aria.video.transcribe", "tool:video_transcribe", "Transcribe a local video's speech track entirely locally (faster-whisper, no API key). Needs the optional 'video_analysis' extra installed."),
210
+ MCPExposure("aria.video.detect_scenes", "tool:video_detect_scenes", "Detect scene-cut timestamps in a local video via frame-histogram comparison. Needs the optional 'video' extra (opencv) installed."),
211
+ MCPExposure(
212
+ "aria.video.generate_estimate",
213
+ "tool:video_generate_estimate",
214
+ "Get an illustrative cost estimate (USD) for a cloud AI video generation job on "
215
+ "'kling' or 'runway', before submitting. Free, no API call to the provider.",
216
+ ),
217
+ MCPExposure(
218
+ "aria.video.generate_submit",
219
+ "tool:video_generate_submit",
220
+ "Submit a real cloud AI text-to-video generation job on 'kling' or 'runway'. "
221
+ "Real per-request cost (billed by the provider the instant this succeeds) — requires "
222
+ "confirmed=true, and calling aria.video.generate_estimate first is strongly recommended. "
223
+ "Returns a task_id immediately; poll with aria.video.generate_status (generation takes minutes).",
224
+ read_only=False,
225
+ ),
226
+ MCPExposure(
227
+ "aria.video.generate_status",
228
+ "tool:video_generate_status",
229
+ "Check a submitted cloud video generation job's status; downloads the result once "
230
+ "succeeded. Checking status costs nothing beyond the original submission.",
231
+ ),
232
+ ]
@@ -0,0 +1,82 @@
1
+ """Per-server circuit breaker for MCP calls (pure, clock-injectable).
2
+
3
+ The contract's mcp-layer next step calls for per-server failure isolation and
4
+ a reconnect policy. Without it, a dead or wedged MCP server costs every call
5
+ its full request timeout (30s by default) forever — one bad server degrades
6
+ the whole tool loop for the rest of the session.
7
+
8
+ Classic three-state breaker:
9
+
10
+ closed → calls flow; consecutive failures are counted
11
+ open → calls fail fast (no subprocess I/O) until the cooldown elapses
12
+ half_open → after cooldown, exactly one probe call is allowed through;
13
+ success closes the circuit, failure re-opens it for another
14
+ cooldown
15
+
16
+ Pure state machine — no asyncio, no I/O; ``clock`` is injectable so tests
17
+ can drive time deterministically.
18
+ """
19
+
20
+ from __future__ import annotations
21
+
22
+ import time
23
+ from dataclasses import dataclass, field
24
+ from typing import Callable
25
+
26
+
27
+ @dataclass
28
+ class ServerCircuit:
29
+ failure_threshold: int = 3
30
+ cooldown_seconds: float = 60.0
31
+ clock: Callable[[], float] = time.monotonic
32
+
33
+ _failures: int = field(default=0, repr=False)
34
+ _open_until: float = field(default=0.0, repr=False)
35
+ _probing: bool = field(default=False, repr=False)
36
+
37
+ @property
38
+ def state(self) -> str:
39
+ if self._failures < self.failure_threshold:
40
+ return "closed"
41
+ if self.clock() < self._open_until:
42
+ return "open"
43
+ return "half_open"
44
+
45
+ @property
46
+ def failures(self) -> int:
47
+ return self._failures
48
+
49
+ def seconds_until_probe(self) -> float:
50
+ return max(0.0, self._open_until - self.clock())
51
+
52
+ def allow_call(self) -> bool:
53
+ """Whether a call may proceed now (half-open admits a single probe)."""
54
+ s = self.state
55
+ if s == "closed":
56
+ return True
57
+ if s == "open":
58
+ return False
59
+ # half_open: admit one probe at a time
60
+ if self._probing:
61
+ return False
62
+ self._probing = True
63
+ return True
64
+
65
+ def record_success(self) -> None:
66
+ self._failures = 0
67
+ self._open_until = 0.0
68
+ self._probing = False
69
+
70
+ def record_failure(self) -> None:
71
+ self._failures += 1
72
+ self._probing = False
73
+ if self._failures >= self.failure_threshold:
74
+ self._open_until = self.clock() + self.cooldown_seconds
75
+
76
+ def describe(self) -> str:
77
+ s = self.state
78
+ if s == "open":
79
+ return f"open ({self._failures} consecutive failures; probe in {self.seconds_until_probe():.0f}s)"
80
+ if s == "half_open":
81
+ return f"half_open ({self._failures} consecutive failures; probing)"
82
+ return f"closed ({self._failures} recent failures)"
@@ -0,0 +1,162 @@
1
+ """MCP configuration helpers for Aria and Arthera package bridges."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import os
7
+ import sys
8
+ import tempfile
9
+ from pathlib import Path
10
+ from typing import Any, Dict, List, Optional
11
+
12
+
13
+ def financial_service_server_config(python: Path) -> Dict[str, object]:
14
+ """A separately installed finance service; never install or run code here."""
15
+ python = Path(python).expanduser()
16
+ if not python.is_absolute() or not python.is_file():
17
+ raise ValueError("Provide an absolute path to the financial-service Python interpreter")
18
+ # -I (isolated mode): the server is spawned in the user's workspace, and a
19
+ # plain `-m` puts the current directory first on sys.path, so a planted
20
+ # arthera_finance/ or a stdlib-named .py there would run in its place. -I
21
+ # also ignores PYTHON* variables and the user site directory.
22
+ #
23
+ # No "env": an entry here overrides the host's environment, so a pinned
24
+ # FINANCIAL_SERVICE_NETWORK=0 meant market data and brokers could never be
25
+ # enabled. The service itself defaults to offline; the host decides.
26
+ return {"name": "arthera-finance", "command": str(python),
27
+ "args": ["-I", "-m", "arthera_finance.server"],
28
+ "description": "Shared financial analysis and simulation; offline by default",
29
+ "enabled": True}
30
+
31
+
32
+ def install_financial_service_config(path: Path, python: Path) -> Path:
33
+ """Explicit host operation: preserve other servers and replace config atomically."""
34
+ server = financial_service_server_config(python)
35
+ path = Path(path)
36
+ existing = json.loads(path.read_text(encoding="utf-8")) if path.exists() else {"servers": []}
37
+ if (not isinstance(existing, dict) or not isinstance(existing.get("servers", []), list)
38
+ or any(not isinstance(item, dict) for item in existing.get("servers", []))):
39
+ raise ValueError("MCP configuration must contain a list of server objects")
40
+ merged = merge_server_config(existing, server)
41
+ path.parent.mkdir(parents=True, exist_ok=True)
42
+ temporary = None
43
+ try:
44
+ with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", dir=path.parent,
45
+ prefix=".finance-mcp-", delete=False) as stream:
46
+ temporary = Path(stream.name)
47
+ json.dump(merged, stream, ensure_ascii=False, indent=2)
48
+ stream.write("\n")
49
+ stream.flush()
50
+ os.fsync(stream.fileno())
51
+ os.replace(temporary, path)
52
+ finally:
53
+ if temporary is not None:
54
+ temporary.unlink(missing_ok=True)
55
+ return path
56
+
57
+
58
+ def arthera_quant_engine_server_config(
59
+ arthera_root: Optional[Path] = None,
60
+ ) -> Dict[str, object]:
61
+ """Return a ready-to-write MCP server entry for Arthera QuantEngine."""
62
+
63
+ configured = arthera_root or os.getenv("ARTHERA_ROOT", "").strip()
64
+ if not configured:
65
+ raise ValueError("The private backend bridge requires an explicit ARTHERA_ROOT; use /finance setup for the standalone financial-service.")
66
+ root = Path(configured).expanduser()
67
+ if not root.is_absolute():
68
+ raise ValueError("ARTHERA_ROOT must be an absolute path.")
69
+ server = root / "packages" / "quant_engine" / "mcp_server.py"
70
+ configured_python = os.getenv("ARTHERA_MCP_PYTHON", "").strip()
71
+ candidates = [
72
+ Path(configured_python).expanduser() if configured_python else None,
73
+ root / ".venv-mcp" / "bin" / "python",
74
+ root / ".venv" / "bin" / "python",
75
+ Path(sys.executable),
76
+ ]
77
+ python = next((path for path in candidates if path and path.exists()), Path("python3"))
78
+ return {
79
+ "name": "arthera_quant_engine",
80
+ "command": str(python),
81
+ "args": [str(server)],
82
+ "env": {"PYTHONPATH": str(root), "PYTHONUNBUFFERED": "1"},
83
+ "description": "Arthera QuantEngine tools exposed through MCP",
84
+ "enabled": True,
85
+ }
86
+
87
+
88
+ def merge_server_config(existing: Dict[str, object], server: Dict[str, object]) -> Dict[str, object]:
89
+ """Return config with server upserted by name."""
90
+
91
+ servers = list(existing.get("servers") or [])
92
+ name = server.get("name")
93
+ out = []
94
+ replaced = False
95
+ for item in servers:
96
+ item_name = item.get("name") if isinstance(item, dict) else None
97
+ is_legacy_arthera = name == "arthera_quant_engine" and item_name == "quant_engine"
98
+ if isinstance(item, dict) and (item_name == name or is_legacy_arthera):
99
+ if not replaced:
100
+ out.append(server)
101
+ replaced = True
102
+ else:
103
+ out.append(item)
104
+ if not replaced:
105
+ out.append(server)
106
+ return {**existing, "servers": out}
107
+
108
+
109
+ def load_mcp_config(path: Path) -> Dict[str, object]:
110
+ if not path.exists():
111
+ return {"servers": []}
112
+ try:
113
+ return json.loads(path.read_text(encoding="utf-8"))
114
+ except Exception:
115
+ return {"servers": []}
116
+
117
+
118
+ def write_mcp_config(path: Path, config: Dict[str, object]) -> Path:
119
+ path.parent.mkdir(parents=True, exist_ok=True)
120
+ path.write_text(json.dumps(config, ensure_ascii=False, indent=2), encoding="utf-8")
121
+ return path
122
+
123
+
124
+ def find_server_config(config: Dict[str, object], name: str) -> Optional[Dict[str, object]]:
125
+ for item in config.get("servers") or []:
126
+ if isinstance(item, dict) and item.get("name") == name:
127
+ return item
128
+ return None
129
+
130
+
131
+ def mcp_server_status(
132
+ config_path: Path,
133
+ server_name: str = "arthera_quant_engine",
134
+ runtime_status: Optional[List[Dict[str, Any]]] = None,
135
+ ) -> Dict[str, Any]:
136
+ """Return config/file/runtime status for a configured MCP server."""
137
+
138
+ config = load_mcp_config(config_path)
139
+ server = find_server_config(config, server_name)
140
+ runtime = None
141
+ for item in runtime_status or []:
142
+ if item.get("name") == server_name:
143
+ runtime = item
144
+ break
145
+
146
+ server_path = None
147
+ if server:
148
+ args = server.get("args") or []
149
+ if args:
150
+ server_path = Path(str(args[0])).expanduser()
151
+
152
+ return {
153
+ "name": server_name,
154
+ "config_path": str(config_path),
155
+ "configured": server is not None,
156
+ "server_path": str(server_path) if server_path else "",
157
+ "server_file_exists": bool(server_path and server_path.exists()),
158
+ "running": bool(runtime and runtime.get("running")),
159
+ "tool_count": int(runtime.get("tool_count", 0)) if runtime else 0,
160
+ "tools": list(runtime.get("tools", [])) if runtime else [],
161
+ "description": (server or {}).get("description", ""),
162
+ }
@@ -0,0 +1,95 @@
1
+ """
2
+ src/aria_code/packages/aria_mcp/installer.py — One-Click MCP Config Installer for VS Code & Cursor
3
+ ==================================================================================================
4
+ Automatically detects and registers aria-code MCP server into:
5
+ 1. VS Code / VS Code Insiders (`settings.json` or `.vscode/mcp.json`)
6
+ 2. Cursor IDE (`settings.json`)
7
+ 3. Claude Desktop (`claude_desktop_config.json`)
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import json
13
+ import os
14
+ import platform
15
+ import sys
16
+ from pathlib import Path
17
+ from typing import Any, Dict, Optional, Tuple
18
+
19
+
20
+ def get_ide_config_paths() -> Dict[str, Path]:
21
+ """Return standard config paths by platform."""
22
+ home = Path.home()
23
+ system = platform.system()
24
+
25
+ if system == "Darwin": # macOS
26
+ return {
27
+ "vscode": home / "Library" / "Application Support" / "Code" / "User" / "settings.json",
28
+ "cursor": home / "Library" / "Application Support" / "Cursor" / "User" / "settings.json",
29
+ "claude": home / "Library" / "Application Support" / "Claude" / "claude_desktop_config.json",
30
+ }
31
+ elif system == "Windows":
32
+ appdata = Path(os.environ.get("APPDATA", str(home / "AppData" / "Roaming")))
33
+ return {
34
+ "vscode": appdata / "Code" / "User" / "settings.json",
35
+ "cursor": appdata / "Cursor" / "User" / "settings.json",
36
+ "claude": appdata / "Claude" / "claude_desktop_config.json",
37
+ }
38
+ else: # Linux
39
+ config_dir = Path(os.environ.get("XDG_CONFIG_HOME", str(home / ".config")))
40
+ return {
41
+ "vscode": config_dir / "Code" / "User" / "settings.json",
42
+ "cursor": config_dir / "Cursor" / "User" / "settings.json",
43
+ "claude": config_dir / "Claude" / "claude_desktop_config.json",
44
+ }
45
+
46
+
47
+ def generate_mcp_entry(server_path: Optional[str] = None) -> Dict[str, Any]:
48
+ """Generate canonical MCP server registration block."""
49
+ if not server_path:
50
+ # Default to invoking aria-code via sys.executable or command
51
+ return {
52
+ "command": "aria-code",
53
+ "args": ["mcp"],
54
+ }
55
+ return {
56
+ "command": sys.executable,
57
+ "args": [server_path],
58
+ }
59
+
60
+
61
+ def install_mcp_to_target(target: str = "vscode", custom_path: Optional[Path] = None) -> Tuple[bool, str]:
62
+ """
63
+ Install aria-code MCP configuration to specified target editor.
64
+ Returns (success, status_message).
65
+ """
66
+ paths = get_ide_config_paths()
67
+ config_file = custom_path or paths.get(target.lower())
68
+
69
+ if not config_file:
70
+ return False, f"Unknown target: {target}. Valid targets: vscode, cursor, claude"
71
+
72
+ try:
73
+ config_file.parent.mkdir(parents=True, exist_ok=True)
74
+ data: Dict[str, Any] = {}
75
+ if config_file.exists():
76
+ try:
77
+ with open(config_file, "r", encoding="utf-8") as f:
78
+ content = f.read().strip()
79
+ if content:
80
+ data = json.loads(content)
81
+ except Exception as e:
82
+ return False, f"Failed to parse existing JSON in {config_file}: {e}"
83
+
84
+ # Insert or update mcpServers dict
85
+ if "mcpServers" not in data:
86
+ data["mcpServers"] = {}
87
+
88
+ data["mcpServers"]["aria-code"] = generate_mcp_entry()
89
+
90
+ with open(config_file, "w", encoding="utf-8") as f:
91
+ json.dump(data, f, indent=2, ensure_ascii=False)
92
+
93
+ return True, f"Successfully registered aria-code MCP server to {config_file}"
94
+ except Exception as e:
95
+ return False, f"Error writing to {config_file}: {e}"