aria-code 0.52.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (478) hide show
  1. aria_code/__init__.py +42 -0
  2. aria_code/_version.py +20 -0
  3. aria_code/adk_apps/__init__.py +1 -0
  4. aria_code/adk_apps/aria_code_review/__init__.py +1 -0
  5. aria_code/adk_apps/aria_code_review/agent.py +32 -0
  6. aria_code/adk_apps/aria_research/__init__.py +1 -0
  7. aria_code/adk_apps/aria_research/agent.py +31 -0
  8. aria_code/agents/__init__.py +34 -0
  9. aria_code/agents/base.py +318 -0
  10. aria_code/agents/code_review.py +200 -0
  11. aria_code/agents/deep/__init__.py +37 -0
  12. aria_code/agents/deep/calibration_loop.py +144 -0
  13. aria_code/agents/deep/critic.py +125 -0
  14. aria_code/agents/deep/deepen.py +193 -0
  15. aria_code/agents/deep/models.py +149 -0
  16. aria_code/agents/deep/pipeline.py +164 -0
  17. aria_code/agents/deep/quant_fusion.py +192 -0
  18. aria_code/agents/deep/themes.py +95 -0
  19. aria_code/agents/deep/tiers.py +106 -0
  20. aria_code/agents/engineering/__init__.py +14 -0
  21. aria_code/agents/engineering/coder.py +222 -0
  22. aria_code/agents/engineering/tester.py +145 -0
  23. aria_code/agents/financial/__init__.py +21 -0
  24. aria_code/agents/financial/cashflow_burn.py +119 -0
  25. aria_code/agents/financial/catalyst.py +279 -0
  26. aria_code/agents/financial/corporate_finance.py +175 -0
  27. aria_code/agents/financial/debate.py +224 -0
  28. aria_code/agents/financial/earnings.py +303 -0
  29. aria_code/agents/financial/fundamental.py +191 -0
  30. aria_code/agents/financial/macro.py +99 -0
  31. aria_code/agents/financial/news.py +207 -0
  32. aria_code/agents/financial/risk.py +165 -0
  33. aria_code/agents/financial/sector.py +279 -0
  34. aria_code/agents/financial/strategist.py +121 -0
  35. aria_code/agents/financial/stripe_revenue.py +127 -0
  36. aria_code/agents/financial/synthesis.py +274 -0
  37. aria_code/agents/financial/technical.py +258 -0
  38. aria_code/agents/orchestrator.py +44 -0
  39. aria_code/agents/portfolio_agent.py +363 -0
  40. aria_code/agents/realty/__init__.py +62 -0
  41. aria_code/agents/realty/asset_diagnosis.py +152 -0
  42. aria_code/agents/realty/business_match.py +166 -0
  43. aria_code/agents/realty/cashflow_verify.py +209 -0
  44. aria_code/agents/realty/contract_rules.py +210 -0
  45. aria_code/agents/realty/energy_anomaly.py +189 -0
  46. aria_code/agents/realty/exit_settlement.py +208 -0
  47. aria_code/agents/realty/fulfillment_risk.py +206 -0
  48. aria_code/agents/realty/ops_optimize.py +160 -0
  49. aria_code/agents/realty/revenue_share.py +215 -0
  50. aria_code/agents/registry.py +158 -0
  51. aria_code/agents/signal_scheme.py +111 -0
  52. aria_code/agents/sports/__init__.py +0 -0
  53. aria_code/agents/sports/football_agent.py +197 -0
  54. aria_code/agents/supervisor.py +113 -0
  55. aria_code/agents/team.py +492 -0
  56. aria_code/agents/warehouse/__init__.py +25 -0
  57. aria_code/agents/warehouse/contracts.py +26 -0
  58. aria_code/agents/warehouse/dashboard.py +155 -0
  59. aria_code/agents/warehouse/fulfillment_leadtime.py +95 -0
  60. aria_code/agents/warehouse/inbound_exceptions.py +25 -0
  61. aria_code/agents/warehouse/inventory_health.py +24 -0
  62. aria_code/agents/warehouse/local_run.py +71 -0
  63. aria_code/agents/warehouse/local_snapshot.py +132 -0
  64. aria_code/agents/warehouse/logistics_cost.py +84 -0
  65. aria_code/agents/warehouse/logistics_sync.py +21 -0
  66. aria_code/agents/warehouse/workflow.py +31 -0
  67. aria_code/aliyun_data_client.py +4 -0
  68. aria_code/apps/README.md +12 -0
  69. aria_code/apps/__init__.py +2 -0
  70. aria_code/apps/channels/README.md +15 -0
  71. aria_code/apps/channels/__init__.py +17 -0
  72. aria_code/apps/channels/intake.py +92 -0
  73. aria_code/apps/channels/registry.py +95 -0
  74. aria_code/apps/channels/tradingview.py +94 -0
  75. aria_code/apps/cli/README.md +13 -0
  76. aria_code/apps/cli/__init__.py +2 -0
  77. aria_code/apps/cli/_optional.py +120 -0
  78. aria_code/apps/cli/bootstrap.py +145 -0
  79. aria_code/apps/cli/broker_render.py +206 -0
  80. aria_code/apps/cli/codegen_paths.py +29 -0
  81. aria_code/apps/cli/commands/__init__.py +16 -0
  82. aria_code/apps/cli/commands/_business_render.py +78 -0
  83. aria_code/apps/cli/commands/_ui.py +71 -0
  84. aria_code/apps/cli/commands/analysis_cmds.py +369 -0
  85. aria_code/apps/cli/commands/ashare_prediction_cmds.py +327 -0
  86. aria_code/apps/cli/commands/auth_cmds.py +239 -0
  87. aria_code/apps/cli/commands/backtest_cmds.py +2543 -0
  88. aria_code/apps/cli/commands/broker_cmds.py +1234 -0
  89. aria_code/apps/cli/commands/business_workflow_cmds.py +319 -0
  90. aria_code/apps/cli/commands/canvas_cmds.py +77 -0
  91. aria_code/apps/cli/commands/catalog.py +87 -0
  92. aria_code/apps/cli/commands/core_cmds.py +2520 -0
  93. aria_code/apps/cli/commands/data_cmds.py +457 -0
  94. aria_code/apps/cli/commands/diagnostic_cmds.py +230 -0
  95. aria_code/apps/cli/commands/diagnostic_ops_cmds.py +813 -0
  96. aria_code/apps/cli/commands/file_cmds.py +312 -0
  97. aria_code/apps/cli/commands/finance_service_cmds.py +60 -0
  98. aria_code/apps/cli/commands/fx_commodity_cmds.py +123 -0
  99. aria_code/apps/cli/commands/market.py +434 -0
  100. aria_code/apps/cli/commands/market_cmds.py +1381 -0
  101. aria_code/apps/cli/commands/market_context.py +425 -0
  102. aria_code/apps/cli/commands/market_render.py +7 -0
  103. aria_code/apps/cli/commands/model_cmds.py +2153 -0
  104. aria_code/apps/cli/commands/ops_cmds.py +721 -0
  105. aria_code/apps/cli/commands/orchestrator_cmds.py +179 -0
  106. aria_code/apps/cli/commands/pdf_export_cmds.py +125 -0
  107. aria_code/apps/cli/commands/portfolio_cmds.py +1278 -0
  108. aria_code/apps/cli/commands/report.py +437 -0
  109. aria_code/apps/cli/commands/scaffold_templates.py +617 -0
  110. aria_code/apps/cli/commands/session_cmds.py +236 -0
  111. aria_code/apps/cli/commands/session_ux_cmds.py +359 -0
  112. aria_code/apps/cli/commands/team.py +669 -0
  113. aria_code/apps/cli/commands/team_render.py +8 -0
  114. aria_code/apps/cli/commands/ui_cmds.py +401 -0
  115. aria_code/apps/cli/commands/warehouse_cmds.py +79 -0
  116. aria_code/apps/cli/commands/workflow_cmds.py +480 -0
  117. aria_code/apps/cli/commands/workspace_cmds.py +1494 -0
  118. aria_code/apps/cli/config_paths.py +73 -0
  119. aria_code/apps/cli/config_store.py +78 -0
  120. aria_code/apps/cli/constants.py +88 -0
  121. aria_code/apps/cli/context.py +34 -0
  122. aria_code/apps/cli/deterministic.py +191 -0
  123. aria_code/apps/cli/direct.py +48 -0
  124. aria_code/apps/cli/finance_service_catalog.py +111 -0
  125. aria_code/apps/cli/football_reports.py +231 -0
  126. aria_code/apps/cli/github_app_auth.py +135 -0
  127. aria_code/apps/cli/google_login.py +196 -0
  128. aria_code/apps/cli/handlers/__init__.py +11 -0
  129. aria_code/apps/cli/handlers/broker_handlers.py +122 -0
  130. aria_code/apps/cli/handlers/chart_handlers.py +1309 -0
  131. aria_code/apps/cli/handlers/market_handlers.py +2513 -0
  132. aria_code/apps/cli/handlers/realty_handlers.py +114 -0
  133. aria_code/apps/cli/handlers/sports_handlers.py +22 -0
  134. aria_code/apps/cli/handlers/strategy_advice.py +82 -0
  135. aria_code/apps/cli/helpers.py +302 -0
  136. aria_code/apps/cli/hooks.py +180 -0
  137. aria_code/apps/cli/i18n.py +297 -0
  138. aria_code/apps/cli/intent.py +136 -0
  139. aria_code/apps/cli/intent_router.py +276 -0
  140. aria_code/apps/cli/intent_signals.py +344 -0
  141. aria_code/apps/cli/lifecycle_hooks.py +48 -0
  142. aria_code/apps/cli/local_tool_schemas.py +536 -0
  143. aria_code/apps/cli/main.py +29 -0
  144. aria_code/apps/cli/market_metadata.py +135 -0
  145. aria_code/apps/cli/market_universe.py +487 -0
  146. aria_code/apps/cli/message_processing.py +310 -0
  147. aria_code/apps/cli/model_catalog.py +620 -0
  148. aria_code/apps/cli/pdf_report.py +977 -0
  149. aria_code/apps/cli/plan_mode.py +139 -0
  150. aria_code/apps/cli/plotly_html.py +15 -0
  151. aria_code/apps/cli/prediction_feedback.py +202 -0
  152. aria_code/apps/cli/preflight.py +502 -0
  153. aria_code/apps/cli/project_aria.py +60 -0
  154. aria_code/apps/cli/prompt_assembly.py +59 -0
  155. aria_code/apps/cli/prompts/__init__.py +0 -0
  156. aria_code/apps/cli/prompts/coding.py +53 -0
  157. aria_code/apps/cli/prompts/select.py +142 -0
  158. aria_code/apps/cli/prompts/system_prompts.py +552 -0
  159. aria_code/apps/cli/prompts/ui.py +436 -0
  160. aria_code/apps/cli/provider_endpoints.py +237 -0
  161. aria_code/apps/cli/provider_keys.py +73 -0
  162. aria_code/apps/cli/providers/__init__.py +1 -0
  163. aria_code/apps/cli/providers/base.py +521 -0
  164. aria_code/apps/cli/providers/chat_routing.py +128 -0
  165. aria_code/apps/cli/providers/collaboration.py +98 -0
  166. aria_code/apps/cli/providers/llm/__init__.py +1 -0
  167. aria_code/apps/cli/providers/llm/offline_responses.py +68 -0
  168. aria_code/apps/cli/providers/llm/ollama_stream.py +1594 -0
  169. aria_code/apps/cli/providers/llm/response_cache.py +60 -0
  170. aria_code/apps/cli/providers/llm/sse_stream.py +257 -0
  171. aria_code/apps/cli/providers/runtime_bridge.py +353 -0
  172. aria_code/apps/cli/providers/vertexai_stream.py +316 -0
  173. aria_code/apps/cli/runtime_consumer.py +657 -0
  174. aria_code/apps/cli/sandbox.py +32 -0
  175. aria_code/apps/cli/session_export.py +120 -0
  176. aria_code/apps/cli/session_jsonl.py +208 -0
  177. aria_code/apps/cli/session_store.py +112 -0
  178. aria_code/apps/cli/skills_catalog.py +273 -0
  179. aria_code/apps/cli/todo_tracker.py +190 -0
  180. aria_code/apps/cli/tool_executor.py +823 -0
  181. aria_code/apps/cli/tool_registry.py +34 -0
  182. aria_code/apps/cli/tool_scope.py +106 -0
  183. aria_code/apps/cli/tools/__init__.py +40 -0
  184. aria_code/apps/cli/tools/context.py +46 -0
  185. aria_code/apps/cli/tools/file_tools.py +180 -0
  186. aria_code/apps/cli/tools/market_tools.py +620 -0
  187. aria_code/apps/cli/tools/notebook_tools.py +111 -0
  188. aria_code/apps/cli/tools/system_tools.py +726 -0
  189. aria_code/apps/cli/tools/write_tools.py +845 -0
  190. aria_code/apps/cli/tradingview_bridge.py +529 -0
  191. aria_code/apps/cli/turn_planning.py +137 -0
  192. aria_code/apps/cli/update_check.py +153 -0
  193. aria_code/apps/cli/utils/__init__.py +0 -0
  194. aria_code/apps/cli/utils/market_detect.py +1597 -0
  195. aria_code/apps/daemon/README.md +14 -0
  196. aria_code/apps/vscode/README.md +115 -0
  197. aria_code/apps/vscode/package.json +70 -0
  198. aria_code/aria_cli.py +6743 -0
  199. aria_code/aria_daemon.py +1398 -0
  200. aria_code/aria_feishu_bot.py +1423 -0
  201. aria_code/aria_mcp_server.py +7 -0
  202. aria_code/aria_relay_client.py +4 -0
  203. aria_code/aria_relay_server.py +490 -0
  204. aria_code/aria_telegram_bot.py +202 -0
  205. aria_code/ariarc.py +385 -0
  206. aria_code/artifacts.py +581 -0
  207. aria_code/backtest_engine.py +4 -0
  208. aria_code/backtest_report.py +4 -0
  209. aria_code/brokers/__init__.py +78 -0
  210. aria_code/brokers/automation.py +193 -0
  211. aria_code/brokers/base.py +231 -0
  212. aria_code/brokers/capabilities.py +264 -0
  213. aria_code/brokers/cn/__init__.py +10 -0
  214. aria_code/brokers/cn/easytrader_broker.py +193 -0
  215. aria_code/brokers/cn/futu_broker.py +194 -0
  216. aria_code/brokers/cn/longbridge_broker.py +190 -0
  217. aria_code/brokers/cn/tiger_broker.py +196 -0
  218. aria_code/brokers/cn/xtquant_broker.py +225 -0
  219. aria_code/brokers/config.py +414 -0
  220. aria_code/brokers/intl/__init__.py +5 -0
  221. aria_code/brokers/intl/alpaca_broker.py +183 -0
  222. aria_code/brokers/intl/ibkr_broker.py +215 -0
  223. aria_code/brokers/intl/trading212_broker.py +183 -0
  224. aria_code/brokers/intl/webull_broker.py +156 -0
  225. aria_code/brokers/paper_broker.py +266 -0
  226. aria_code/brokers/planning.py +296 -0
  227. aria_code/brokers/registry.py +213 -0
  228. aria_code/brokers/trading.py +267 -0
  229. aria_code/canva_client.py +4 -0
  230. aria_code/change_store.py +127 -0
  231. aria_code/clients/__init__.py +0 -0
  232. aria_code/clients/aliyun_data_client.py +660 -0
  233. aria_code/clients/aria_relay_client.py +182 -0
  234. aria_code/clients/canva_client.py +284 -0
  235. aria_code/clients/figma_client.py +100 -0
  236. aria_code/clients/football_data_client.py +1671 -0
  237. aria_code/clients/kling_video_client.py +182 -0
  238. aria_code/clients/market_data_client.py +1976 -0
  239. aria_code/clients/openai_image_client.py +242 -0
  240. aria_code/clients/runway_video_client.py +157 -0
  241. aria_code/clients/warehouse_erp_client.py +105 -0
  242. aria_code/cloud_memory.py +181 -0
  243. aria_code/command_safety.py +19 -0
  244. aria_code/computer_use_tools.py +4 -0
  245. aria_code/dashboard_generator.py +579 -0
  246. aria_code/data_analysis_tools.py +4 -0
  247. aria_code/data_cleaner.py +483 -0
  248. aria_code/data_service.py +513 -0
  249. aria_code/datasources/__init__.py +23 -0
  250. aria_code/datasources/base.py +166 -0
  251. aria_code/datasources/router.py +253 -0
  252. aria_code/datasources/sources/__init__.py +15 -0
  253. aria_code/datasources/sources/akshare_source.py +269 -0
  254. aria_code/datasources/sources/alpha_vantage_source.py +203 -0
  255. aria_code/datasources/sources/edgar_source.py +219 -0
  256. aria_code/datasources/sources/finnhub_source.py +198 -0
  257. aria_code/datasources/sources/fred_source.py +223 -0
  258. aria_code/datasources/sources/tushare_source.py +143 -0
  259. aria_code/datasources/sources/web_scraper_source.py +278 -0
  260. aria_code/datasources/sources/world_bank_source.py +206 -0
  261. aria_code/datasources/sources/yfinance_source.py +152 -0
  262. aria_code/demo_player.py +207 -0
  263. aria_code/doctor.py +813 -0
  264. aria_code/domain/__init__.py +0 -0
  265. aria_code/domain/backtest_engine.py +354 -0
  266. aria_code/domain/backtest_report.py +472 -0
  267. aria_code/domain/finance_formulas.py +389 -0
  268. aria_code/domain/portfolio_ledger.py +307 -0
  269. aria_code/domain/strategy_vault.py +421 -0
  270. aria_code/evals/__init__.py +37 -0
  271. aria_code/evals/harness.py +598 -0
  272. aria_code/evals/runner.py +238 -0
  273. aria_code/external_agent_runner.py +115 -0
  274. aria_code/figma_client.py +4 -0
  275. aria_code/file_analysis_tools.py +4 -0
  276. aria_code/finance_formulas.py +4 -0
  277. aria_code/football_data_client.py +4 -0
  278. aria_code/image_gen_tools.py +4 -0
  279. aria_code/intent_classifier.py +386 -0
  280. aria_code/kling_video_client.py +4 -0
  281. aria_code/licensing.py +151 -0
  282. aria_code/local_finance_tools.py +4 -0
  283. aria_code/local_image_provider.py +4 -0
  284. aria_code/local_llm_provider.py +4 -0
  285. aria_code/macro_tools.py +4 -0
  286. aria_code/markdown_pdf.py +289 -0
  287. aria_code/market_data_client.py +4 -0
  288. aria_code/mcp_client.py +639 -0
  289. aria_code/memory_manager.py +246 -0
  290. aria_code/model_capability.py +486 -0
  291. aria_code/notification_tools.py +4 -0
  292. aria_code/openai_image_client.py +4 -0
  293. aria_code/packages/__init__.py +23 -0
  294. aria_code/packages/adk_bridge/__init__.py +11 -0
  295. aria_code/packages/adk_bridge/code_review_tools.py +49 -0
  296. aria_code/packages/adk_bridge/market_tools.py +125 -0
  297. aria_code/packages/aria_agents/__init__.py +5 -0
  298. aria_code/packages/aria_agents/manifest.py +78 -0
  299. aria_code/packages/aria_core/__init__.py +34 -0
  300. aria_code/packages/aria_core/architecture.py +269 -0
  301. aria_code/packages/aria_core/export.py +147 -0
  302. aria_code/packages/aria_core/manifest.py +65 -0
  303. aria_code/packages/aria_core/paths.py +57 -0
  304. aria_code/packages/aria_core/secure_file.py +68 -0
  305. aria_code/packages/aria_infra/__init__.py +15 -0
  306. aria_code/packages/aria_infra/arthera.py +52 -0
  307. aria_code/packages/aria_infra/doctor.py +246 -0
  308. aria_code/packages/aria_infra/product.py +40 -0
  309. aria_code/packages/aria_mcp/__init__.py +25 -0
  310. aria_code/packages/aria_mcp/bridge.py +201 -0
  311. aria_code/packages/aria_mcp/circuit.py +82 -0
  312. aria_code/packages/aria_mcp/config.py +111 -0
  313. aria_code/packages/aria_mcp/installer.py +95 -0
  314. aria_code/packages/aria_mcp/server.py +1550 -0
  315. aria_code/packages/aria_mcp/tools.py +81 -0
  316. aria_code/packages/aria_sdk/__init__.py +19 -0
  317. aria_code/packages/aria_sdk/client.py +396 -0
  318. aria_code/packages/aria_sdk/providers.py +70 -0
  319. aria_code/packages/aria_sdk/streaming.py +79 -0
  320. aria_code/packages/aria_sdk/types.py +86 -0
  321. aria_code/packages/aria_services/__init__.py +92 -0
  322. aria_code/packages/aria_services/cache.py +60 -0
  323. aria_code/packages/aria_services/context.py +356 -0
  324. aria_code/packages/aria_services/context_checkpoints.py +157 -0
  325. aria_code/packages/aria_services/data.py +11 -0
  326. aria_code/packages/aria_services/provider_health.py +268 -0
  327. aria_code/packages/aria_services/references.py +247 -0
  328. aria_code/packages/aria_services/registry.py +249 -0
  329. aria_code/packages/aria_services/research_protocol.py +57 -0
  330. aria_code/packages/aria_services/research_quality.py +186 -0
  331. aria_code/packages/aria_services/settings.py +157 -0
  332. aria_code/packages/aria_services/usage.py +151 -0
  333. aria_code/packages/aria_skills/__init__.py +46 -0
  334. aria_code/packages/aria_skills/catalog.py +149 -0
  335. aria_code/packages/aria_skills/loader.py +455 -0
  336. aria_code/packages/aria_skills/registry.py +84 -0
  337. aria_code/packages/aria_tools/__init__.py +5 -0
  338. aria_code/packages/aria_tools/financial/__init__.py +8 -0
  339. aria_code/packages/aria_tools/financial/_paths.py +130 -0
  340. aria_code/packages/aria_tools/financial/compliance.py +31 -0
  341. aria_code/packages/aria_tools/financial/factors.py +33 -0
  342. aria_code/packages/aria_tools/financial/risk_tools.py +33 -0
  343. aria_code/packages/aria_tools/financial/strategy.py +31 -0
  344. aria_code/packages/aria_tools/registry.py +128 -0
  345. aria_code/packages/quant_engine/__init__.py +34 -0
  346. aria_code/packages/quant_engine/_namespace.py +62 -0
  347. aria_code/packages/quant_engine/backtest/__init__.py +14 -0
  348. aria_code/packages/quant_engine/backtest/core.py +53 -0
  349. aria_code/packages/quant_engine/backtest/engine.py +96 -0
  350. aria_code/packages/quant_engine/portfolio/__init__.py +13 -0
  351. aria_code/packages/quant_engine/portfolio/optimizer.py +85 -0
  352. aria_code/packages/quant_engine/sports/__init__.py +80 -0
  353. aria_code/packages/quant_engine/sports/calibrator.py +354 -0
  354. aria_code/packages/quant_engine/sports/dixon_coles.py +234 -0
  355. aria_code/packages/quant_engine/sports/elo.py +300 -0
  356. aria_code/packages/quant_engine/sports/form.py +188 -0
  357. aria_code/packages/quant_engine/sports/h2h.py +195 -0
  358. aria_code/packages/quant_engine/sports/ml_model.py +377 -0
  359. aria_code/packages/quant_engine/sports/predictor.py +312 -0
  360. aria_code/packages/quant_engine/sports/tracker.py +665 -0
  361. aria_code/packages/quant_engine/stochastic/__init__.py +35 -0
  362. aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +195 -0
  363. aria_code/packages/quant_engine/stochastic/ito_calculus.py +477 -0
  364. aria_code/packages/quant_engine/stochastic/kelly_criterion.py +181 -0
  365. aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +95 -0
  366. aria_code/packages/quant_engine/stochastic/options_pricing.py +576 -0
  367. aria_code/packages/quant_engine/stochastic/stochastic_processes.py +90 -0
  368. aria_code/packs/__init__.py +85 -0
  369. aria_code/packs/base.py +168 -0
  370. aria_code/packs/finance/__init__.py +250 -0
  371. aria_code/packs/logistics/__init__.py +169 -0
  372. aria_code/packs/payments/__init__.py +139 -0
  373. aria_code/packs/realty/__init__.py +190 -0
  374. aria_code/packs/registry.py +202 -0
  375. aria_code/packs/rules.py +90 -0
  376. aria_code/plan_utils.py +194 -0
  377. aria_code/plugin_loader.py +328 -0
  378. aria_code/portfolio_ledger.py +4 -0
  379. aria_code/preview_server.py +449 -0
  380. aria_code/privacy/__init__.py +5 -0
  381. aria_code/privacy/feedback.py +123 -0
  382. aria_code/project_review.py +278 -0
  383. aria_code/project_review_api.py +235 -0
  384. aria_code/project_review_server.py +18 -0
  385. aria_code/project_tools.py +4 -0
  386. aria_code/providers/__init__.py +30 -0
  387. aria_code/providers/llm/__init__.py +19 -0
  388. aria_code/providers/llm/anthropic.py +184 -0
  389. aria_code/providers/llm/autoconfig.py +213 -0
  390. aria_code/providers/llm/base.py +139 -0
  391. aria_code/providers/llm/custom.py +158 -0
  392. aria_code/providers/llm/ollama.py +129 -0
  393. aria_code/providers/llm/openai_compat.py +313 -0
  394. aria_code/providers/llm/registry.py +444 -0
  395. aria_code/providers/local_image_provider.py +202 -0
  396. aria_code/providers/local_llm_provider.py +589 -0
  397. aria_code/realty_data_tools.py +4 -0
  398. aria_code/report_exporters.py +150 -0
  399. aria_code/report_generator.py +1764 -0
  400. aria_code/runtime/__init__.py +169 -0
  401. aria_code/runtime/acceptance.py +481 -0
  402. aria_code/runtime/agent_loop.py +1520 -0
  403. aria_code/runtime/approval.py +57 -0
  404. aria_code/runtime/budget.py +232 -0
  405. aria_code/runtime/checkpoints.py +432 -0
  406. aria_code/runtime/crash_report.py +174 -0
  407. aria_code/runtime/events.py +113 -0
  408. aria_code/runtime/gateway.py +150 -0
  409. aria_code/runtime/lsp.py +484 -0
  410. aria_code/runtime/orchestrator.py +55 -0
  411. aria_code/runtime/repo_map.py +700 -0
  412. aria_code/runtime/run_state.py +127 -0
  413. aria_code/runtime/run_store.py +450 -0
  414. aria_code/runtime/self_healing.py +422 -0
  415. aria_code/runtime/subagent.py +547 -0
  416. aria_code/runtime/task_ledger.py +86 -0
  417. aria_code/runtime/task_orchestrator.py +90 -0
  418. aria_code/runtime/tool_executor.py +217 -0
  419. aria_code/runtime/tool_policy.py +107 -0
  420. aria_code/runtime/worktrees.py +215 -0
  421. aria_code/runway_video_client.py +4 -0
  422. aria_code/safety/__init__.py +23 -0
  423. aria_code/safety/permissions.py +306 -0
  424. aria_code/safety/service.py +102 -0
  425. aria_code/setup_wizard.py +673 -0
  426. aria_code/spreadsheet_tools.py +4 -0
  427. aria_code/strategy_vault.py +4 -0
  428. aria_code/tools/__init__.py +0 -0
  429. aria_code/tools/artifact_tools.py +252 -0
  430. aria_code/tools/broker_tools.py +92 -0
  431. aria_code/tools/build_quant_engine.py +97 -0
  432. aria_code/tools/code_audit_tools.py +192 -0
  433. aria_code/tools/computer_use_tools.py +504 -0
  434. aria_code/tools/data_analysis_tools.py +809 -0
  435. aria_code/tools/enterprise_finance_tools.py +156 -0
  436. aria_code/tools/extended_tools.py +240 -0
  437. aria_code/tools/file_analysis_tools.py +885 -0
  438. aria_code/tools/image_gen_tools.py +114 -0
  439. aria_code/tools/local_finance_tools.py +3417 -0
  440. aria_code/tools/logistics_tools.py +135 -0
  441. aria_code/tools/macro_tools.py +369 -0
  442. aria_code/tools/notification_tools.py +249 -0
  443. aria_code/tools/project_tools.py +525 -0
  444. aria_code/tools/realty_data_tools.py +659 -0
  445. aria_code/tools/spreadsheet_tools.py +388 -0
  446. aria_code/tools/stripe_tools.py +115 -0
  447. aria_code/ui/__init__.py +105 -0
  448. aria_code/ui/banner.py +508 -0
  449. aria_code/ui/completer.py +501 -0
  450. aria_code/ui/console.py +281 -0
  451. aria_code/ui/image_render.py +243 -0
  452. aria_code/ui/input_box.py +488 -0
  453. aria_code/ui/picker.py +201 -0
  454. aria_code/ui/render/__init__.py +11 -0
  455. aria_code/ui/render/finance.py +1705 -0
  456. aria_code/ui/render/market.py +225 -0
  457. aria_code/ui/render/output.py +775 -0
  458. aria_code/ui/render/responsive.py +75 -0
  459. aria_code/ui/render/team.py +354 -0
  460. aria_code/ui/robot.py +235 -0
  461. aria_code/ui/startup_dashboard.py +109 -0
  462. aria_code/utils/vscode_uri.py +37 -0
  463. aria_code/video_analysis.py +147 -0
  464. aria_code/video_editor.py +271 -0
  465. aria_code/workspace/__init__.py +6 -0
  466. aria_code/workspace/files.py +193 -0
  467. aria_code/workspace/verify.py +113 -0
  468. aria_code/workspace_changes.py +199 -0
  469. aria_code/workspace_context.py +233 -0
  470. aria_code/workspace_service.py +196 -0
  471. aria_code/workspace_tools.py +150 -0
  472. aria_code-0.52.0.dist-info/METADATA +237 -0
  473. aria_code-0.52.0.dist-info/RECORD +478 -0
  474. aria_code-0.52.0.dist-info/WHEEL +5 -0
  475. aria_code-0.52.0.dist-info/entry_points.txt +3 -0
  476. aria_code-0.52.0.dist-info/licenses/LICENSE +201 -0
  477. aria_code-0.52.0.dist-info/licenses/NOTICE +49 -0
  478. aria_code-0.52.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,319 @@
1
+ """BusinessWorkflowCommandsMixin — research, earnings, realty, ops workflow commands."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from ._business_render import p, print_realty_result, print_risk_scan
6
+
7
+
8
+ import json
9
+ import asyncio
10
+ import datetime
11
+ import time
12
+ import shlex
13
+ from typing import Dict, Any, Optional
14
+
15
+
16
+ import json
17
+ import asyncio
18
+ import datetime
19
+ import time
20
+ import shlex
21
+ import sys
22
+ import os
23
+ from typing import Dict, Any, Optional
24
+
25
+
26
+ import json
27
+ import asyncio
28
+ import datetime
29
+ import time
30
+ import shlex
31
+ import sys
32
+ import os
33
+ from typing import Dict, Any, Optional
34
+
35
+
36
+ class BusinessWorkflowCommandsMixin:
37
+ """Mixin: financial research and realty/operations workflow commands."""
38
+
39
+ async def cmd_research(self, args: str):
40
+ sym = args.strip().upper() or "AAPL"
41
+ # Route research through the deterministic team workflow so data
42
+ # fetching, rendering, and artifact saving happen in one service path.
43
+ await self.cmd_team(f"{sym} --full")
44
+
45
+ async def cmd_earnings_workflow(self, args: str):
46
+ parts = args.strip().split()
47
+ sym = parts[0].upper() if parts else "AAPL"
48
+ period = " ".join(parts[1:]) if len(parts) > 1 else "最近一个季度"
49
+ report_type = "deep" if any(k in period.lower() for k in ("deep", "深度", "全年", "年报", "10-k")) else "standard"
50
+ # Earnings review is a report workflow, not a code-generation prompt.
51
+ # The report command already fetches market data, records provenance,
52
+ # asks the model for the narrative, and saves the Markdown artifact.
53
+ await self.cmd_report(f"{sym} --format md --type {report_type}")
54
+
55
+ async def cmd_asset_diag(self, args: str):
56
+ asset_id = args.strip()
57
+ if not asset_id:
58
+ p(self.context, "用法: /asset-diag <资产ID或名称> 例: /asset-diag asset_000001", "dim")
59
+ return
60
+ asset_info = {}
61
+ api_url = self.terminal.config.get("api_url", "http://localhost:8000")
62
+ try:
63
+ import aiohttp
64
+ async with aiohttp.ClientSession() as sess:
65
+ async with sess.get(
66
+ f"{api_url}/api/realty/assets/{asset_id}",
67
+ timeout=aiohttp.ClientTimeout(total=5)
68
+ ) as resp:
69
+ if resp.status == 200:
70
+ body = await resp.json()
71
+ raw = body.get("data", {})
72
+ asset_info = {
73
+ "area": raw.get("area_sqm", 0),
74
+ "location": raw.get("address", asset_id),
75
+ "vacancy_days": raw.get("vacancy_days", 0),
76
+ "expected_rent": raw.get("monthly_rent_market", 0),
77
+ "allowed_business": raw.get("allowed_business_types", []),
78
+ "property_state": raw.get("property_state", "正常"),
79
+ "floor_height": raw.get("floor_height", 0),
80
+ }
81
+ p(self.context, f"已从 API 加载资产: {raw.get('name', asset_id)}", "ok")
82
+ except Exception:
83
+ pass
84
+ if not asset_info:
85
+ p(self.context, "[dim]提示: 未找到资产数据,以 ID 作为位置标识演示(结果仅供参考)[/dim]")
86
+ asset_info = {
87
+ "location": asset_id,
88
+ "area": 0, "vacancy_days": 0,
89
+ "expected_rent": 0, "allowed_business": [],
90
+ "property_state": "正常",
91
+ }
92
+ await self._run_realty_agent("asset_diagnosis", asset_id, {"asset_info": asset_info})
93
+
94
+ async def cmd_contract_draft(self, args: str):
95
+ parts = args.split() if args else []
96
+ project_id = parts[0] if parts else "demo_project"
97
+ nego = {"guaranteed_amount": 0, "revenue_share_pct": 0}
98
+ for i, p in enumerate(parts):
99
+ if p == "--guaranteed" and i + 1 < len(parts):
100
+ try:
101
+ nego["guaranteed_amount"] = float(parts[i + 1])
102
+ except ValueError:
103
+ pass
104
+ elif p == "--share" and i + 1 < len(parts):
105
+ try:
106
+ nego["revenue_share_pct"] = float(parts[i + 1])
107
+ except ValueError:
108
+ pass
109
+ await self._run_realty_agent("contract_rules", project_id, {
110
+ "negotiation": nego,
111
+ "asset_info": {"name": project_id},
112
+ "operator_info": {},
113
+ })
114
+
115
+ async def cmd_revenue_calc(self, args: str):
116
+ parts = args.split() if args else []
117
+ if len(parts) < 2:
118
+ p(self.context, "用法: /revenue-calc <project_id> <总流水> [退款] 例: /revenue-calc proj_001 200000", "dim")
119
+ return
120
+ project_id = parts[0]
121
+ try:
122
+ gross = float(parts[1])
123
+ refunds = float(parts[2]) if len(parts) > 2 else 0.0
124
+ except ValueError:
125
+ p(self.context, "流水金额必须为数字", "error")
126
+ return
127
+ api_url = self.terminal.config.get("api_url", "http://localhost:8000")
128
+ rules = {}
129
+ try:
130
+ import aiohttp
131
+ async with aiohttp.ClientSession() as sess:
132
+ async with sess.get(f"{api_url}/api/realty/contracts/{project_id}",
133
+ timeout=aiohttp.ClientTimeout(total=5)) as resp:
134
+ if resp.status == 200:
135
+ body = await resp.json()
136
+ rules = body.get("data", {})
137
+ except Exception:
138
+ pass
139
+ if not rules:
140
+ p(self.context, f"[dim]未找到 {project_id} 的合同规则,使用默认值演示[/dim]")
141
+ rules = {"guaranteed_monthly": 30000, "revenue_share_pct": 10,
142
+ "revenue_share_base": 0, "platform_fee_pct": 5,
143
+ "risk_reserve_pct": 3, "settlement_cycle": "monthly"}
144
+ await self._run_realty_agent("revenue_share", project_id, {
145
+ "contract_rules": rules,
146
+ "transaction_data": {"gross_revenue": gross, "refunds": refunds},
147
+ })
148
+
149
+ async def cmd_realty_risk_scan(self, args: str):
150
+ project_id = args.strip() or "demo_project"
151
+ if self.context.has_rich:
152
+ self.context.console.print(f"\n [bold]风险扫描[/bold] 项目: [cyan]{project_id}[/cyan]")
153
+ api_url = self.terminal.config.get("api_url", "http://localhost:8000")
154
+ try:
155
+ import aiohttp
156
+ async with aiohttp.ClientSession() as sess:
157
+ async with sess.get(
158
+ f"{api_url}/api/realty/risks/scan/{project_id}",
159
+ timeout=aiohttp.ClientTimeout(total=10)
160
+ ) as resp:
161
+ if resp.status == 200:
162
+ data = await resp.json()
163
+ print_risk_scan(self.context, data)
164
+ return
165
+ except Exception:
166
+ pass
167
+ await self._run_realty_team(["cashflow_verify", "energy_anomaly", "fulfillment_risk"], project_id, {})
168
+
169
+ async def cmd_ops_report(self, args: str):
170
+ project_id = args.strip() or "demo_project"
171
+ api_url = self.terminal.config.get("api_url", "http://localhost:8000")
172
+ project_info = {"name": project_id, "area": 0, "business_type": "未知"}
173
+ performance_data = {}
174
+ marketing_data = {}
175
+ try:
176
+ import aiohttp
177
+ async with aiohttp.ClientSession() as sess:
178
+ async with sess.get(
179
+ f"{api_url}/api/realty/assets/{project_id}",
180
+ timeout=aiohttp.ClientTimeout(total=5)
181
+ ) as resp:
182
+ if resp.status == 200:
183
+ raw = (await resp.json()).get("data", {})
184
+ project_info = {
185
+ "name": raw.get("name", project_id),
186
+ "area": raw.get("area_sqm", 0),
187
+ "business_type": raw.get("current_business_type", "未知"),
188
+ "open_date": raw.get("open_date", ""),
189
+ }
190
+ async with sess.get(
191
+ f"{api_url}/api/realty/revenue/splits?project_id={project_id}&page_size=3",
192
+ timeout=aiohttp.ClientTimeout(total=5)
193
+ ) as resp2:
194
+ if resp2.status == 200:
195
+ splits = (await resp2.json()).get("data", {}).get("splits", [])
196
+ if splits:
197
+ revenues = [s["split_result"].get("gross_revenue", 0) for s in splits]
198
+ avg_rev = sum(revenues) / len(revenues)
199
+ performance_data = {"monthly_revenue": avg_rev, "daily_visits": 0}
200
+ p(self.context, f"已加载近 {len(splits)} 期分账数据,月均流水 {avg_rev:,.0f}元", "ok")
201
+ except Exception:
202
+ pass
203
+ if not performance_data:
204
+ p(self.context, "[dim]提示: 未找到运营数据,建议先录入分账记录后再运行此命令[/dim]")
205
+ await self._run_realty_agent("ops_optimize", project_id, {
206
+ "project_info": project_info,
207
+ "performance_data": performance_data,
208
+ "marketing_data": marketing_data,
209
+ "peer_benchmarks": {"revenue_per_sqm": 300},
210
+ })
211
+
212
+ async def cmd_exit_calc(self, args: str):
213
+ parts = args.split() if args else []
214
+ project_id = parts[0] if parts else "demo_project"
215
+ reason = "到期终止"
216
+ for i, p in enumerate(parts):
217
+ if p == "--reason" and i + 1 < len(parts):
218
+ reason = " ".join(parts[i + 1:])
219
+ break
220
+ api_url = self.terminal.config.get("api_url", "http://localhost:8000")
221
+ project_info = {"name": project_id}
222
+ financials = {"deposit_amount": 0, "unpaid_invoices": 0,
223
+ "guaranteed_monthly": 0, "exit_penalty_months": 3,
224
+ "prepayment_received": 0, "renovation_cost": 0}
225
+ try:
226
+ import aiohttp
227
+ async with aiohttp.ClientSession() as sess:
228
+ async with sess.get(
229
+ f"{api_url}/api/realty/contracts/{project_id}",
230
+ timeout=aiohttp.ClientTimeout(total=5)
231
+ ) as resp:
232
+ if resp.status == 200:
233
+ ctr = (await resp.json()).get("data", {})
234
+ from datetime import date
235
+ start = ctr.get("start_date", "")
236
+ used_months = 0
237
+ if start:
238
+ try:
239
+ from dateutil.relativedelta import relativedelta
240
+ d0 = date.fromisoformat(start)
241
+ delta = relativedelta(date.today(), d0)
242
+ used_months = delta.years * 12 + delta.months
243
+ except Exception:
244
+ pass
245
+ project_info.update({
246
+ "contract_years": ctr.get("contract_years", 1),
247
+ "used_months": used_months,
248
+ "contract_end": ctr.get("end_date", ""),
249
+ })
250
+ financials.update({
251
+ "deposit_amount": ctr.get("deposit_amount", 0),
252
+ "guaranteed_monthly": ctr.get("guaranteed_monthly", 0),
253
+ "exit_penalty_months": ctr.get("exit_penalty_months", 3),
254
+ })
255
+ p(self.context, f"已加载合同规则: 保底 {ctr.get('guaranteed_monthly',0):,}元/月", "ok")
256
+ async with sess.get(
257
+ f"{api_url}/api/realty/invoices?project_id={project_id}&status=unpaid",
258
+ timeout=aiohttp.ClientTimeout(total=5)
259
+ ) as resp2:
260
+ if resp2.status == 200:
261
+ body2 = await resp2.json()
262
+ summary = body2.get("data", {}).get("summary", {})
263
+ unpaid = summary.get("total_amount", 0) - summary.get("paid_amount", 0)
264
+ financials["unpaid_invoices"] = unpaid
265
+ if unpaid > 0:
266
+ p(self.context, f"发现未结账单合计: {unpaid:,.2f}元", "ok")
267
+ except Exception:
268
+ pass
269
+ await self._run_realty_agent("exit_settlement", project_id, {
270
+ "project_info": project_info,
271
+ "financials": financials,
272
+ "asset_condition": {},
273
+ "exit_reason": reason,
274
+ })
275
+
276
+ async def _run_realty_agent(self, agent_name: str, project_id: str, input_data: dict):
277
+ if self.context.has_rich:
278
+ with self.context.console.status(f"[dim]运行 {agent_name} Agent...[/dim]", spinner="dots"):
279
+ result = await self._call_realty_agent(agent_name, project_id, input_data)
280
+ else:
281
+ print(f"Running {agent_name}...")
282
+ result = await self._call_realty_agent(agent_name, project_id, input_data)
283
+ if result:
284
+ print_realty_result(self.context, result, agent_name)
285
+
286
+ async def _run_realty_team(self, agents: list, project_id: str, input_data: dict):
287
+ import asyncio
288
+ if self.context.has_rich:
289
+ with self.context.console.status(f"[dim]并行扫描 {', '.join(agents)}...[/dim]", spinner="dots"):
290
+ tasks = [self._call_realty_agent(n, project_id, input_data) for n in agents]
291
+ results = await asyncio.gather(*tasks, return_exceptions=False)
292
+ else:
293
+ tasks = [self._call_realty_agent(n, project_id, input_data) for n in agents]
294
+ results = await asyncio.gather(*tasks, return_exceptions=False)
295
+ for res, name in zip(results, agents):
296
+ if res:
297
+ print_realty_result(self.context, res, name)
298
+
299
+ async def _call_realty_agent(self, agent_name: str, project_id: str, input_data: dict):
300
+ try:
301
+ from agents.registry import get_registry
302
+ cls = get_registry().get(agent_name)
303
+ if not cls:
304
+ p(self.context, f"Agent '{agent_name}' 未注册", "error")
305
+ return None
306
+ llm = None
307
+ try:
308
+ from providers.llm.registry import list_available_providers, get_provider
309
+ avail = [p for p in list_available_providers() if p.get("available")]
310
+ if avail:
311
+ llm = get_provider(avail[0]["name"])
312
+ except Exception:
313
+ pass
314
+ agent = cls(llm_provider=llm)
315
+ result = await agent.analyze(project_id, input_data)
316
+ return result
317
+ except Exception as e:
318
+ p(self.context, f"Agent {agent_name} 执行失败: {e}", "error")
319
+ return None
@@ -0,0 +1,77 @@
1
+ """CanvasCommandsMixin — /canvas command (live artifact preview server).
2
+
3
+ Extracted following the same convention as broker_cmds.py/backtest_cmds.py:
4
+ module globals (self.context.has_rich, self.context.console, etc.) are imported lazily inside each
5
+ method body to avoid circular imports at load time.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from ._ui import print_error
11
+
12
+
13
+ import json
14
+ import asyncio
15
+ import datetime
16
+ import time
17
+ import shlex
18
+ import sys
19
+ import os
20
+ from typing import Dict, Any, Optional
21
+
22
+
23
+ import json
24
+ import asyncio
25
+ import datetime
26
+ import time
27
+ import shlex
28
+ import sys
29
+ import os
30
+ from typing import Dict, Any, Optional
31
+
32
+
33
+ class CanvasCommandsMixin:
34
+ """Mixin providing the /canvas live-preview-server command.
35
+
36
+ Off by default — nothing in preview_server.py runs until this command
37
+ is explicitly typed. See preview_server.py's module docstring for why
38
+ this stays opt-in rather than auto-starting.
39
+ """
40
+
41
+ async def cmd_canvas(self, args: str):
42
+ """实时预览面板: /canvas [stop] —— 启动/停止本地预览服务器,报告和图表生成后会自动在浏览器里实时更新。"""
43
+
44
+
45
+ sub = args.strip().lower()
46
+ import preview_server
47
+
48
+ if sub == "stop":
49
+ session = preview_server.get_active_session()
50
+ if session is None:
51
+ msg = "预览服务器未在运行"
52
+ self.context.console.print(f"[yellow]{msg}[/yellow]") if self.context.has_rich else print(msg)
53
+ return
54
+ await preview_server.stop_session()
55
+ msg = "✓ 已停止预览服务器"
56
+ self.context.console.print(f"[green]{msg}[/green]") if self.context.has_rich else print(msg)
57
+ return
58
+
59
+ existing = preview_server.get_active_session()
60
+ if existing is not None and existing.url:
61
+ msg = f"预览服务器已在运行: {existing.url}"
62
+ self.context.console.print(f"[cyan]{msg}[/cyan]") if self.context.has_rich else print(msg)
63
+ return
64
+
65
+ try:
66
+ session = await preview_server.start_session()
67
+ except Exception as exc:
68
+ print_error(self.context, f"预览服务器启动失败: {exc}", "换个端口范围或检查网络配置后重试")
69
+ return
70
+
71
+ preview_server.open_in_browser(session.url)
72
+ msg = (
73
+ f"✓ 预览服务器已启动: {session.url}\n"
74
+ f"之后生成的报告/图表会自动在这个浏览器标签里实时更新,无需手动刷新。\n"
75
+ f"/canvas stop 可以随时关闭。"
76
+ )
77
+ self.context.console.print(f"[green]{msg}[/green]") if self.context.has_rich else print(msg)
@@ -0,0 +1,87 @@
1
+ """Shared CLI command metadata.
2
+
3
+ This module is intentionally UI-free so future channel adapters such as Feishu
4
+ or a local gateway can reuse the same command categories without importing the
5
+ large terminal implementation.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from dataclasses import dataclass
11
+ from typing import FrozenSet, Tuple
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class DirectCommandSpec:
16
+ name: str
17
+ method_name: str
18
+ async_method: bool = False
19
+ watchable: bool = False
20
+ aliases: Tuple[str, ...] = ()
21
+
22
+ @property
23
+ def names(self) -> Tuple[str, ...]:
24
+ return (self.name, *self.aliases)
25
+
26
+
27
+ DIRECT_COMMANDS: Tuple[DirectCommandSpec, ...] = (
28
+ DirectCommandSpec("quote", "cmd_quote", async_method=True, watchable=True),
29
+ DirectCommandSpec("backtest", "cmd_backtest", async_method=True),
30
+ DirectCommandSpec("health", "cmd_health", async_method=True, watchable=True),
31
+ DirectCommandSpec("doctor", "cmd_doctor"),
32
+ DirectCommandSpec("tools", "cmd_tools"),
33
+ DirectCommandSpec("skills", "cmd_skills"),
34
+ DirectCommandSpec("sessions", "cmd_sessions"),
35
+ DirectCommandSpec("watch", "cmd_watch", aliases=("watchlist",)),
36
+ DirectCommandSpec("export", "cmd_export", async_method=True),
37
+ DirectCommandSpec("tv", "cmd_tv", async_method=True),
38
+ DirectCommandSpec("ashare", "cmd_ashare", async_method=True, aliases=("a-share",)),
39
+ DirectCommandSpec("markets", "cmd_markets"),
40
+ DirectCommandSpec("orchestrate", "cmd_orchestrate"),
41
+ )
42
+
43
+
44
+ DIRECT_COMMAND_MAP = {
45
+ alias: spec
46
+ for spec in DIRECT_COMMANDS
47
+ for alias in spec.names
48
+ }
49
+
50
+
51
+ WATCHABLE_DIRECT_COMMANDS: FrozenSet[str] = frozenset(
52
+ alias
53
+ for spec in DIRECT_COMMANDS
54
+ if spec.watchable
55
+ for alias in spec.names
56
+ )
57
+
58
+
59
+ # Commands shown by default in /help. Other slash commands remain executable but
60
+ # are hidden to keep the startup surface compact.
61
+ VISIBLE_SLASH_COMMANDS: FrozenSet[str] = frozenset({
62
+ # Session
63
+ "/help", "/clear", "/compact", "/cost", "/status", "/health",
64
+ "/regen", "/undo", "/rewind", "/copy", "/recap", "/btw",
65
+ # Sessions
66
+ "/save", "/load", "/sessions", "/recall", "/export",
67
+ # Config
68
+ "/model", "/thinking", "/config", "/permissions", "/privacy",
69
+ # Setup & discovery
70
+ "/setup", "/apikey", "/doctor", "/architecture", "/mcp", "/skills", "/tools", "/packages", "/markets",
71
+ # Auth
72
+ "/login", "/logout", "/whoami",
73
+ # Persistent data (direct writes)
74
+ "/alert", "/journal", "/watch", "/note", "/todo", "/memory",
75
+ # Broker
76
+ "/broker", "/account", "/positions", "/orders", "/paper", "/trade",
77
+ # Code & project
78
+ "/project", "/init", "/review", "/code", "/plan", "/orchestrate", "/run", "/tasks", "/delegate", "/canva", "/completions", "/lsp",
79
+ # Research
80
+ "/team", "/warehouse", "/deep",
81
+ # Quant
82
+ "/backtest", "/wf", "/tv", "/ashare",
83
+ # UI generation
84
+ "/ui",
85
+ # Other
86
+ "/artifacts", "/vision", "/upload-image", "/file", "/strategy", "/accuracy",
87
+ })