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,136 @@
1
+ """Sign in through the account page, the way Claude Code and Codex do.
2
+
3
+ ``/login`` opens a page on Arthera's own auth host. The user chooses how to sign
4
+ in there (Google, Apple or email, and email can be a new account) and the page
5
+ hands the session back to this process on a loopback port. Nothing is typed in
6
+ the terminal and no provider is chosen for the user.
7
+
8
+ The hand-back is bound to this process, not merely to "whoever is listening":
9
+
10
+ * ``state`` is random and checked on the way back, so a callback this run did
11
+ not start is ignored;
12
+ * a PKCE ``code_verifier`` stays here; only its SHA-256 goes into the page. The
13
+ one-time code in the redirect is useless without it, so a program that sees
14
+ the redirect cannot redeem it;
15
+ * the credential never appears in a URL. The redirect carries a short code and
16
+ the session is fetched over POST.
17
+
18
+ Page: the /cli-login route of apps/web. Server side: apps/api/src/routes/auth_v2_routes.py
19
+ (/cli/handoff, /cli/exchange).
20
+ """
21
+
22
+ from __future__ import annotations
23
+
24
+ import base64
25
+ import hashlib
26
+ import http.server
27
+ import os
28
+ import secrets
29
+ import threading
30
+ import urllib.parse
31
+ import webbrowser
32
+ from typing import Any, Dict
33
+
34
+ from .google_login import _CallbackResult, _free_port, _post_json
35
+
36
+ # The apex is Firebase Hosting and the Firebase auth domain, so the page and the
37
+ # sign-in popup are same-origin there.
38
+ from aria_code.service_endpoints import SITE_URL, current_url
39
+ AUTH_ORIGIN = SITE_URL
40
+ LOGIN_PATH = "/cli-login"
41
+ _TIMEOUT_SECONDS = 300
42
+
43
+
44
+ def auth_origin() -> str:
45
+ """The host that serves the sign-in page. ARIA_AUTH_URL overrides it for staging."""
46
+ return current_url(os.getenv("ARIA_AUTH_URL", "").strip() or AUTH_ORIGIN, website=True)
47
+
48
+
49
+ def pkce_pair() -> tuple[str, str]:
50
+ """A code verifier and its S256 challenge (RFC 7636)."""
51
+ verifier = secrets.token_urlsafe(48) # 64 characters, inside the 43-128 the spec allows
52
+ digest = hashlib.sha256(verifier.encode("ascii")).digest()
53
+ return verifier, base64.urlsafe_b64encode(digest).rstrip(b"=").decode("ascii")
54
+
55
+
56
+ def _handler(result: _CallbackResult, state: str):
57
+ class Handler(http.server.BaseHTTPRequestHandler):
58
+ def do_GET(self): # noqa: N802 - name fixed by BaseHTTPRequestHandler
59
+ parsed = urllib.parse.urlparse(self.path)
60
+ params = {k: v[0] for k, v in urllib.parse.parse_qs(parsed.query).items()}
61
+ if parsed.path != "/callback" or not secrets.compare_digest(params.get("state", ""), state):
62
+ # Not this run's callback: ignore it and keep waiting for ours.
63
+ self.send_response(404)
64
+ self.end_headers()
65
+ return
66
+ ok = "handoff_code" in params
67
+ body = (
68
+ "<html><body style='font-family:system-ui;padding:3rem'>"
69
+ f"<h2>{'Signed in.' if ok else 'Sign-in failed.'}</h2>"
70
+ "<p>You can close this tab and return to the terminal.</p>"
71
+ "</body></html>"
72
+ ).encode("utf-8")
73
+ self.send_response(200 if ok else 400)
74
+ self.send_header("Content-Type", "text/html; charset=utf-8")
75
+ self.send_header("Content-Length", str(len(body)))
76
+ self.send_header("Referrer-Policy", "no-referrer")
77
+ self.send_header("Cache-Control", "no-store")
78
+ self.end_headers()
79
+ self.wfile.write(body)
80
+ result.params = params
81
+ result.received.set()
82
+
83
+ def log_message(self, *args): # keep the terminal clean
84
+ return
85
+
86
+ return Handler
87
+
88
+
89
+ def run_web_login(api_url: str, *, open_browser=webbrowser.open, timeout: int = _TIMEOUT_SECONDS) -> Dict[str, Any]:
90
+ """Drive the whole flow; return the stored-credential fields.
91
+
92
+ Raises RuntimeError with a message suitable for display on any failure.
93
+ """
94
+ api_url = api_url.rstrip("/")
95
+ port = _free_port()
96
+ state = secrets.token_urlsafe(24)
97
+ verifier, challenge = pkce_pair()
98
+ result = _CallbackResult()
99
+ server = http.server.HTTPServer(("127.0.0.1", port), _handler(result, state))
100
+ thread = threading.Thread(target=server.serve_forever, daemon=True)
101
+ thread.start()
102
+ try:
103
+ url = f"{auth_origin()}{LOGIN_PATH}?" + urllib.parse.urlencode(
104
+ {"port": port, "state": state, "code_challenge": challenge, "code_challenge_method": "S256"}
105
+ )
106
+ if not open_browser(url):
107
+ raise RuntimeError("Could not open a browser. Visit this URL manually:\n " + url)
108
+ if not result.received.wait(timeout=timeout):
109
+ raise RuntimeError(f"Timed out after {timeout}s waiting for the browser.")
110
+ finally:
111
+ server.shutdown()
112
+ server.server_close()
113
+
114
+ code = result.params.get("handoff_code")
115
+ if not code:
116
+ raise RuntimeError(result.params.get("message") or "The sign-in did not carry a handoff code.")
117
+ try:
118
+ reply = _post_json(f"{api_url}/api/v2/auth/cli/exchange",
119
+ {"code": code, "code_verifier": verifier, "state": state})
120
+ except Exception as exc:
121
+ raise RuntimeError(f"Could not redeem the sign-in: {exc}") from exc
122
+ data = reply.get("data") or {}
123
+ if not data.get("auth_token"):
124
+ raise RuntimeError("The sign-in did not return a session.")
125
+ return {
126
+ "auth_token": data["auth_token"],
127
+ "refresh_token": data.get("refresh_token"),
128
+ "expires_in": str(data["expires_in"]) if data.get("expires_in") is not None else None,
129
+ "user_id": data.get("user_id"),
130
+ "email": data.get("email"),
131
+ "display_name": data.get("display_name"),
132
+ "provider": "firebase",
133
+ }
134
+
135
+
136
+ __all__ = ["run_web_login", "pkce_pair", "auth_origin", "AUTH_ORIGIN"]
@@ -0,0 +1,127 @@
1
+ """Run a ``.aria/workflows`` file in the REPL, one step at a time.
2
+
3
+ Each kind of step goes through what already exists for it, so a workflow has
4
+ no powers of its own: ``run`` through the ``run_command`` tool (command
5
+ policy, sandbox, output display), ``prompt`` through ``send_message`` (tools,
6
+ approvals, checks, task worktree, transaction point), ``command`` through
7
+ the slash-command dispatcher.
8
+
9
+ A step fails when its command exits non-zero, when its turn leaves the code
10
+ failing checks it did not fail before (or gets no answer), or when its slash
11
+ command does not exist. The first failure stops the workflow unless the step
12
+ says ``continue_on_error``; declining a ``confirm`` step stops it too.
13
+ """
14
+
15
+ from __future__ import annotations
16
+
17
+ import asyncio
18
+ import sys
19
+ import time
20
+ from dataclasses import dataclass
21
+ from typing import Any, Callable
22
+
23
+ from aria_code.runtime.workflows import Workflow, WorkflowStep, variables
24
+
25
+ PASSED, FAILED, SKIPPED, DECLINED = "passed", "failed", "skipped", "declined"
26
+ _MARKS = {PASSED: "✓", FAILED: "✗", SKIPPED: "–", DECLINED: "–"}
27
+
28
+
29
+ @dataclass
30
+ class StepResult:
31
+ name: str
32
+ status: str
33
+ detail: str = ""
34
+ seconds: float = 0.0
35
+
36
+
37
+ def _namespace(terminal: Any) -> dict:
38
+ return vars(sys.modules[type(terminal).__module__])
39
+
40
+
41
+ async def _run_command_step(terminal: Any, step: WorkflowStep, text: str) -> tuple[bool, str]:
42
+ from aria_code.apps.cli.providers.runtime_bridge import build_tool_executor
43
+ from aria_code.runtime.approval import ApprovalDecision
44
+
45
+ config = terminal.config
46
+ executor = build_tool_executor(
47
+ _namespace(terminal)["LOCAL_TOOLS"], config,
48
+ lambda: {"_session_id": getattr(terminal, "session_id", "")},
49
+ )
50
+ root = config.get("_session_workspace_root") or None
51
+ params = {"command": text, "timeout": step.timeout, **({"cwd": root} if root else {})}
52
+ # The user ran the workflow, and trusted its file before the first run;
53
+ # the command policy and sandbox still apply, as they do to /verify.
54
+ approval = ApprovalDecision.allow(policy="balanced", user_approved=True)
55
+ result = await asyncio.to_thread(executor.execute_local, "run_command", params, approval=approval)
56
+ if not result.get("success"):
57
+ return False, str(result.get("error") or "command failed")
58
+ code = (result.get("data") or {}).get("exit_code", 0)
59
+ return code == 0, f"exit {code}"
60
+
61
+
62
+ async def _prompt_step(terminal: Any, text: str) -> tuple[bool, str]:
63
+ before = str(getattr(terminal, "_code_verdict", "") or "")
64
+ length = len(terminal.conversation)
65
+ await terminal.send_message(text)
66
+ answered = len(terminal.conversation) > length and terminal.conversation[-1].get("role") == "assistant"
67
+ after = str(getattr(terminal, "_code_verdict", "") or "")
68
+ if not answered:
69
+ return False, "no answer"
70
+ if after == "failed" and before != "failed":
71
+ return False, "checks failed after this step"
72
+ return True, f"checks {after}" if after else "answered"
73
+
74
+
75
+ async def _slash_step(terminal: Any, workflow: Workflow, text: str) -> tuple[bool, str]:
76
+ name = text.split(maxsplit=1)[0].lower()
77
+ if name.lstrip("/") == workflow.name:
78
+ return False, "a workflow cannot run itself"
79
+ commands = terminal.commands
80
+ if not commands.is_command(text):
81
+ return False, f"unknown command {name}"
82
+ await commands.execute(text)
83
+ return True, name
84
+
85
+
86
+ async def run_workflow(terminal: Any, workflow: Workflow, args: str = "", *,
87
+ ask: Callable[[str], bool], say: Callable[[str, str], None]) -> list[StepResult]:
88
+ values = variables(workflow, args)
89
+ results: list[StepResult] = []
90
+ total = len(workflow.steps)
91
+ stopped = False
92
+ for index, step in enumerate(workflow.steps, 1):
93
+ if stopped:
94
+ results.append(StepResult(step.name, SKIPPED))
95
+ continue
96
+ text = step.render(values)
97
+ say(f"[{index}/{total}] {step.name}", "bold")
98
+ if step.confirm and not ask(f" Run “{step.name}”: {text[:80]}? [y/N] "):
99
+ results.append(StepResult(step.name, DECLINED, "declined"))
100
+ stopped = True
101
+ continue
102
+ started = time.time()
103
+ try:
104
+ if step.kind == "run":
105
+ ok, detail = await _run_command_step(terminal, step, text)
106
+ elif step.kind == "prompt":
107
+ ok, detail = await _prompt_step(terminal, text)
108
+ else:
109
+ ok, detail = await _slash_step(terminal, workflow, text)
110
+ except Exception as exc:
111
+ ok, detail = False, f"{type(exc).__name__}: {exc}"
112
+ results.append(StepResult(step.name, PASSED if ok else FAILED, detail, time.time() - started))
113
+ if not ok and not step.continue_on_error:
114
+ stopped = True
115
+ return results
116
+
117
+
118
+ def summary_lines(workflow: Workflow, results: list[StepResult]) -> list[str]:
119
+ failed = [r for r in results if r.status == FAILED]
120
+ declined = any(r.status == DECLINED for r in results)
121
+ verdict = "FAILED" if failed else "STOPPED" if declined else "DONE"
122
+ lines = [f"/{workflow.name} {verdict}"]
123
+ for result in results:
124
+ timing = f" · {result.seconds:.1f}s" if result.seconds >= 0.05 else ""
125
+ detail = f" {result.detail}" if result.detail else ""
126
+ lines.append(f" {_MARKS[result.status]} {result.name}{detail}{timing}")
127
+ return lines
@@ -0,0 +1,121 @@
1
+ """A task about this folder, sent to a model that cannot touch it.
2
+
3
+ With backend_chat on, turns go to the Arthera backend, which receives the
4
+ prompt and history but none of Aria's local tools. Asked to run
5
+ `python3 -c 'import calc; print(calc.add(2,3))'` in a folder, it said it had
6
+ no filesystem access and gave the output as 5; the function subtracts, so it
7
+ is -1. The turn reported success with no tools used, and `-p` exited 0. A
8
+ small local model without tool calling is in the same position.
9
+
10
+ ``needs_workspace`` asks only whether a message needs this machine: it names
11
+ a file or imports a module that exists here, uses an @file reference, asks
12
+ for a command to be run, or says "this project", "the failing tests" and the
13
+ like. A question about code in general ("explain Python decorators") does not
14
+ need the folder and is left alone.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import re
20
+ from pathlib import Path
21
+
22
+ _PATH_TOKEN = re.compile(r"[\w./-]+\.[A-Za-z0-9]{1,6}\b|[\w-]+/[\w./-]+")
23
+ _HERE_EN = re.compile(
24
+ r"\b(?:this|my|our|current)\s+(?:project|repo|repository|folder|directory|codebase|workspace|"
25
+ r"working\s+tree)\b|\bin\s+here\b|\b(?:the\s+)?failing\s+tests?\b|\bmy\s+(?:code|tests)\b",
26
+ re.I,
27
+ )
28
+ # Asking for a command to be run needs a tool to run it, wherever it points.
29
+ _RUN_EN = re.compile(r"\b(?:run|execute)\s+(?:`|python3?\b|pytest\b|npm\b|npx\b|node\b|make\b|cargo\b|"
30
+ r"go\s+(?:test|run|build)\b|bash\b|sh\b|pip3?\b|uv\b|git\b|ls\b|the\s+tests?\b)", re.I)
31
+ _RUN_ZH = re.compile(r"(?:运行|执行|跑一下|跑)\s*(?:`|python|pytest|npm|node|git|make|命令|脚本|测试)", re.I)
32
+ _IMPORT = re.compile(r"\b(?:import|from)\s+([A-Za-z_]\w*)")
33
+ _HERE_ZH = ("这个项目", "该项目", "当前项目", "这个仓库", "当前仓库", "这个目录", "当前目录", "这个文件夹",
34
+ "当前文件夹", "这个代码库", "本项目", "本仓库", "失败的测试", "我的代码",
35
+ "我的项目", "本地项目", "本地文件", "电脑文件", "桌面文件", "创建项目", "新建项目")
36
+
37
+
38
+ def needs_workspace(text: str, cwd: Path | str | None = None) -> bool:
39
+ """True when the message is about files in ``cwd`` (default: the current directory)."""
40
+ message = str(text or "")
41
+ if "@file:" in message or "@folder:" in message:
42
+ return True
43
+ if _HERE_EN.search(message) or any(word in message for word in _HERE_ZH):
44
+ return True
45
+ if re.search(r"\b(?:create|build|scaffold|initialize)\s+(?:a\s+|an\s+|new\s+)?(?:react\s+|next\.js\s+)?(?:app|project|website)\b", message, re.I):
46
+ return True
47
+ if _RUN_EN.search(message) or _RUN_ZH.search(message):
48
+ return True
49
+ base = Path(cwd or Path.cwd())
50
+ for module in _IMPORT.findall(message):
51
+ if (base / f"{module}.py").is_file() or (base / module / "__init__.py").is_file():
52
+ return True
53
+ tokens = _PATH_TOKEN.findall(message)
54
+ # Chinese prose can touch an ASCII filename without whitespace (修改calc.py).
55
+ tokens += re.findall(r"[A-Za-z0-9_./~-]+\.[A-Za-z0-9]{1,6}\b", message)
56
+ for token in tokens:
57
+ candidate = token.strip("./") if token.startswith("./") else token
58
+ try:
59
+ if candidate and (base / candidate).exists():
60
+ return True
61
+ except (OSError, ValueError):
62
+ continue
63
+ return False
64
+
65
+
66
+ def route_has_tools(model: str, config: dict, api_url: str | None) -> bool:
67
+ """Whether this turn's model can call Aria's local tools."""
68
+ try:
69
+ from aria_code.model_capability import get_model_capability
70
+
71
+ capability = get_model_capability(model)
72
+ if not (capability.tool_calls and capability.context_window >= 8192):
73
+ return False
74
+ except Exception:
75
+ pass
76
+ try:
77
+ from aria_code.apps.cli.providers.chat_routing import model_receives_local_tools
78
+
79
+ return model_receives_local_tools(model, config, api_url)
80
+ except Exception:
81
+ return True
82
+
83
+
84
+ def no_tools_message(config: dict, *, lang: str = "en") -> str:
85
+ """Why the model cannot do this here, and what to change."""
86
+ backend = bool(config.get("backend_chat"))
87
+ if lang == "zh":
88
+ why = ("当前通过 Arthera 云端对话(backend_chat),那里的模型读不到这个文件夹,也不能运行命令"
89
+ if backend else "当前模型不支持工具调用,读不到这个文件夹,也不能运行命令")
90
+ return (f"{why},关于这里文件的回答只能是推测。要在这个文件夹里写代码、跑测试,请用 /model "
91
+ "选一个能调用工具的模型(例如 Vertex 上的 Gemini、OpenAI 或 Ollama 的 qwen2.5-coder),"
92
+ "或用 aria-code --local。")
93
+ why = ("Turns go to Arthera cloud chat (backend_chat), where the model cannot read this folder or run "
94
+ "commands" if backend else "The current model cannot call tools, so it cannot read this folder "
95
+ "or run commands")
96
+ return (f"{why}; anything it says about files here is a guess. To work on code in this folder, pick a "
97
+ "model that runs tools with /model (Gemini on Vertex, OpenAI, or an Ollama model such as "
98
+ "qwen2.5-coder), or start with aria-code --local.")
99
+
100
+
101
+ def workspace_config(text: str, model: str, config: dict, api_url: str | None) -> dict:
102
+ """Choose authenticated Google inference with local tools for workspace tasks.
103
+
104
+ Change only this turn's inference transport, never the saved config or
105
+ the user's model. A backend chat setting must not turn edits into guesses.
106
+ """
107
+ from aria_code.apps.cli.providers.chat_routing import force_backend, model_provider, normalize_provider_name
108
+ if not needs_workspace(text) or not force_backend(config, api_url):
109
+ return config
110
+ if config.get("backend_local_tools"):
111
+ return config
112
+ provider = model_provider(model) or normalize_provider_name(config.get("local_provider", ""))
113
+ if provider not in {"google", "vertexai", "vertex-ai", "google-genai"}:
114
+ return config
115
+ from aria_code.apps.cli.providers.base import google_readiness
116
+ if google_readiness(config):
117
+ return config
118
+ return {**config, "backend_chat": False, "_workspace_transport": "google"}
119
+
120
+
121
+ __all__ = ["needs_workspace", "route_has_tools", "no_tools_message", "workspace_config"]
@@ -0,0 +1,14 @@
1
+ # Daemon App
2
+
3
+ Target role: local-first gateway process for background jobs and external
4
+ clients.
5
+
6
+ Responsibilities:
7
+
8
+ - manage long-running sessions and task queues;
9
+ - expose local MCP or HTTP control surfaces;
10
+ - coordinate channel adapters;
11
+ - keep user data local unless explicit opt-in allows upload.
12
+
13
+ The daemon should not implement market data, reports, broker logic, or model
14
+ reasoning directly. Those belong behind package services.
@@ -0,0 +1,115 @@
1
+ # Aria Code — VS Code Extension
2
+
3
+ AI-powered financial analysis sidebar for VS Code, connected to the Aria Code backend.
4
+
5
+ ## Requirements
6
+
7
+ - VS Code 1.85 or later
8
+ - Aria Code backend running locally or on a reachable API host
9
+
10
+ ## Start the backend
11
+
12
+ ```bash
13
+ # From the Aria Code project root:
14
+ python3 aria_daemon.py
15
+
16
+ # Or start the FastAPI server directly:
17
+ uvicorn apps.api.src.main:app --host 0.0.0.0 --port 8000
18
+ ```
19
+
20
+ ## Install from VSIX (recommended)
21
+
22
+ ### Step 1 — Build the extension package
23
+
24
+ ```bash
25
+ cd apps/vscode
26
+ npm install --save-dev @vscode/vsce
27
+ npx vsce package
28
+ # Produces: aria-code-1.0.0.vsix
29
+ ```
30
+
31
+ ### Step 2 — Install in VS Code
32
+
33
+ **Option A — command line:**
34
+ ```bash
35
+ code --install-extension aria-code-1.0.0.vsix
36
+ ```
37
+
38
+ **Option B — VS Code UI:**
39
+ 1. Open VS Code
40
+ 2. Go to **Extensions** (⇧⌘X)
41
+ 3. Click the **...** menu (top-right of Extensions panel)
42
+ 4. Choose **Install from VSIX...**
43
+ 5. Select `aria-code-1.0.0.vsix`
44
+
45
+ ## Install for development (no build step)
46
+
47
+ ```bash
48
+ # Copy the extension folder to VS Code extensions directory
49
+ cp -r apps/vscode ~/.vscode/extensions/aria-code-1.0.0
50
+
51
+ # Then reload VS Code (⇧⌘P → "Developer: Reload Window")
52
+ ```
53
+
54
+ ## Features
55
+
56
+ | Feature | Description |
57
+ |---|---|
58
+ | **Market tab** | Live indices (S&P 500, Nasdaq, 沪深300, BTC), auto-refreshes every 60 s |
59
+ | **Portfolio tab** | Portfolio overview from your connected broker |
60
+ | **Chat tab** | Ask Aria AI anything — markets, stocks, analysis |
61
+ | **Alerts tab** | View and manage price alerts |
62
+ | **Status bar** | Shows `Aria Online / Offline` — polls `/health` every 30 s |
63
+ | **Analyze Selection** | Right-click selected text → "Analyze with Aria AI" |
64
+
65
+ ## Usage
66
+
67
+ 1. After installing, click the **graph icon** in the VS Code Activity Bar (left sidebar)
68
+ 2. The **Aria Financial** panel opens with Market, Portfolio, Chat, and Alerts tabs
69
+ 3. Make sure the backend is running — the status bar shows connection state
70
+
71
+ ### Analyze code/text with AI
72
+
73
+ 1. Select any text in your editor
74
+ 2. Right-click → **Analyze with Aria AI**
75
+ 3. Aria switches to the Chat tab and sends your selection for analysis
76
+
77
+ ### Keyboard shortcut (optional)
78
+
79
+ Add to your `keybindings.json`:
80
+ ```json
81
+ {
82
+ "key": "ctrl+shift+a",
83
+ "command": "aria-code.openPanel"
84
+ }
85
+ ```
86
+
87
+ ## API Endpoints Used
88
+
89
+ | Endpoint | Purpose |
90
+ |---|---|
91
+ | `GET /health` | Connection health check (every 30 s) |
92
+ | `GET /api/v1/institution/market/indices` | Major market indices |
93
+ | `GET /api/v2/market/quote?symbols=...` | Fallback quote data |
94
+ | `GET /api/v1/institution/analysis/morning-brief` | Morning market brief |
95
+ | `GET /api/v1/institution/portfolio/overview` | Portfolio overview |
96
+ | `POST /api/v2/ai/chat` | AI chat messages |
97
+ | `GET /api/v2/alert/list` | Price alerts list |
98
+ | `POST /api/v2/alert/create` | Create new alert |
99
+ | `DELETE /api/v2/alert/:id` | Delete alert |
100
+
101
+ ## Troubleshooting
102
+
103
+ **Status bar shows "Aria Offline"**
104
+ - Confirm the backend is running: `curl http://localhost:8000/health`
105
+ - Check for port conflicts: `lsof -i :8000`
106
+
107
+ **Extension not appearing after install**
108
+ - Reload VS Code: ⇧⌘P → "Developer: Reload Window"
109
+
110
+ **Chat returns errors**
111
+ - The AI chat endpoint requires the backend to have a valid LLM provider configured
112
+ - Check backend logs for API key or model errors
113
+
114
+ **Backend is on a different URL**
115
+ - Set the VS Code setting `ariaCode.apiBase` to the backend base URL you want to use.
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "aria-code",
3
+ "displayName": "Aria Code — AI Financial Terminal",
4
+ "description": "AI-powered financial analysis in your editor",
5
+ "version": "1.0.0",
6
+ "publisher": "Cinsoul",
7
+ "engines": {
8
+ "vscode": "^1.85.0"
9
+ },
10
+ "categories": ["Other", "Data Science"],
11
+ "activationEvents": ["onStartupFinished"],
12
+ "main": "./extension.js",
13
+ "contributes": {
14
+ "configuration": {
15
+ "title": "Aria Code",
16
+ "properties": {
17
+ "ariaCode.apiBase": {
18
+ "type": "string",
19
+ "default": "http://127.0.0.1:8000",
20
+ "description": "Aria backend base URL used by the VS Code extension."
21
+ }
22
+ }
23
+ },
24
+ "commands": [
25
+ {
26
+ "command": "aria-code.openPanel",
27
+ "title": "Open Aria Dashboard",
28
+ "category": "Aria"
29
+ },
30
+ {
31
+ "command": "aria-code.analyzeSelection",
32
+ "title": "Analyze with Aria AI",
33
+ "category": "Aria"
34
+ }
35
+ ],
36
+ "viewsContainers": {
37
+ "activitybar": [
38
+ {
39
+ "id": "aria-sidebar",
40
+ "title": "Aria",
41
+ "icon": "$(graph)"
42
+ }
43
+ ]
44
+ },
45
+ "views": {
46
+ "aria-sidebar": [
47
+ {
48
+ "id": "aria-code.sidebar",
49
+ "name": "Aria Financial",
50
+ "type": "webview"
51
+ }
52
+ ]
53
+ },
54
+ "menus": {
55
+ "editor/context": [
56
+ {
57
+ "command": "aria-code.analyzeSelection",
58
+ "when": "editorHasSelection",
59
+ "group": "aria@1"
60
+ }
61
+ ]
62
+ }
63
+ },
64
+ "scripts": {
65
+ "package": "npx @vscode/vsce package"
66
+ },
67
+ "devDependencies": {
68
+ "@vscode/vsce": "^2.24.0"
69
+ }
70
+ }