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,273 @@
1
+ """Skills 目录 —— 从 aria_cli.py 抽出的纯数据。
2
+
3
+ SKILLS 字面量原本在 aria_cli.py 的 1772-2035 行(264 行)。同 model_catalog:
4
+ 纯字面量、零耦合,用普通 import 即可,core_cmds / diagnostic_cmds 的裸名
5
+ 引用不受影响。
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ SKILLS = [
11
+ {
12
+ "command": "/morning-brief",
13
+ "name": "Morning Brief",
14
+ "category": "research",
15
+ "description": "Daily market briefing with key events and outlook",
16
+ "args": "[focus_area]",
17
+ "prompt": (
18
+ "Generate a comprehensive morning market briefing:\n"
19
+ "1. US market futures and overnight moves\n"
20
+ "2. Key economic events and earnings today\n"
21
+ "3. Global markets overview (Asia, Europe)\n"
22
+ "4. Top sector movers and themes\n"
23
+ "5. Trading outlook and key levels to watch\n"
24
+ "{extra}"
25
+ ),
26
+ "tools_hint": ["web_search", "get_market_indices", "get_sector_performance", "analyze_news"],
27
+ },
28
+ {
29
+ "command": "/deep-analysis",
30
+ "name": "Deep Analysis",
31
+ "category": "analysis",
32
+ "description": "Multi-factor stock deep dive (technical + fundamental + sentiment)",
33
+ "args": "<symbol>",
34
+ "prompt": (
35
+ "Perform a comprehensive multi-factor analysis of {symbol}:\n"
36
+ "1. Technical Analysis: trend, support/resistance, indicators (RSI, MACD, Bollinger)\n"
37
+ "2. Fundamental Analysis: PE, PB, revenue growth, margins, debt ratios\n"
38
+ "3. Sentiment Analysis: recent news sentiment, analyst ratings, social buzz\n"
39
+ "4. Risk Assessment: VaR, beta, max drawdown potential\n"
40
+ "5. Verdict: Bull/Bear/Neutral with confidence level and price targets"
41
+ ),
42
+ "tools_hint": ["web_search", "get_market_data", "calculate_factors", "analyze_news", "peer_comparison", "piotroski_fscore", "get_risk_metrics"],
43
+ },
44
+ {
45
+ "command": "/trade-idea",
46
+ "name": "Trade Idea",
47
+ "category": "strategy",
48
+ "description": "AI-generated trade ideas with entry/exit levels",
49
+ "args": "[market_or_sector]",
50
+ "prompt": (
51
+ "Generate 3 actionable trade ideas{context}:\n"
52
+ "For each idea provide:\n"
53
+ "1. Symbol and direction (Long/Short)\n"
54
+ "2. Entry zone, stop loss, and 2 take-profit levels\n"
55
+ "3. Risk-reward ratio\n"
56
+ "4. Catalyst: what's driving the trade\n"
57
+ "5. Timeframe (swing/position/day)\n"
58
+ "6. Confidence level (1-10)"
59
+ ),
60
+ "tools_hint": ["web_search", "get_market_data", "analyze_news", "recommend_strategy"],
61
+ },
62
+ {
63
+ "command": "/risk-report",
64
+ "name": "Risk Report",
65
+ "category": "risk",
66
+ "description": "Portfolio risk analysis with VaR, stress tests, and correlation",
67
+ "args": "[symbols...]",
68
+ "prompt": (
69
+ "Generate a comprehensive risk report for portfolio: {symbols}\n"
70
+ "1. Portfolio VaR (95%, 99%) — daily and monthly\n"
71
+ "2. Correlation matrix between holdings\n"
72
+ "3. Concentration risk by sector/geography\n"
73
+ "4. Stress test scenarios (2008 crisis, COVID crash, rate hike)\n"
74
+ "5. Tail risk analysis\n"
75
+ "6. Recommendations: rebalancing suggestions to reduce risk"
76
+ ),
77
+ "tools_hint": ["assess_portfolio_risk", "get_risk_metrics", "stress_test_strategy"],
78
+ },
79
+ {
80
+ "command": "/sector-rotation",
81
+ "name": "Sector Rotation",
82
+ "category": "strategy",
83
+ "description": "Sector rotation analysis with economic cycle positioning",
84
+ "args": "",
85
+ "prompt": (
86
+ "Analyze current sector rotation dynamics:\n"
87
+ "1. Current economic cycle phase (early/mid/late/recession)\n"
88
+ "2. All 11 GICS sectors: performance, momentum, relative strength\n"
89
+ "3. Leading vs lagging sectors and why\n"
90
+ "4. Sector rotation strategy: which sectors to overweight/underweight\n"
91
+ "5. Top stock picks from the strongest sectors\n"
92
+ "6. Historical analog: which past period is most similar"
93
+ ),
94
+ "tools_hint": ["get_sector_performance", "get_market_indices", "analyze_news"],
95
+ },
96
+ {
97
+ "command": "/macro-outlook",
98
+ "name": "Macro Outlook",
99
+ "category": "research",
100
+ "description": "Macroeconomic analysis: rates, inflation, growth & cycle",
101
+ "args": "[region]",
102
+ "prompt": (
103
+ "Provide a macroeconomic outlook{context}:\n"
104
+ "1. GDP growth forecast and trends\n"
105
+ "2. Inflation trajectory (CPI, PCE) and central bank response\n"
106
+ "3. Interest rate path: current level and expectations\n"
107
+ "4. Employment situation: jobs, wages, participation\n"
108
+ "5. Key risks: geopolitical, financial, systemic\n"
109
+ "6. Asset class implications: equities, bonds, commodities, crypto"
110
+ ),
111
+ "tools_hint": ["web_search", "get_world_bank_reports", "get_bonds_data", "analyze_news"],
112
+ },
113
+ {
114
+ "command": "/factor-screen",
115
+ "name": "Factor Screen",
116
+ "category": "quant",
117
+ "description": "Factor-based stock screening (value, momentum, quality, etc.)",
118
+ "args": "<factor_type>",
119
+ "prompt": (
120
+ "Screen US stocks using {factor} factor strategy:\n"
121
+ "1. Define the factor criteria and thresholds\n"
122
+ "2. Top 10 stocks ranking highest on {factor}\n"
123
+ "3. For each: symbol, score, key metrics, sector\n"
124
+ "4. Historical factor performance: how has {factor} performed\n"
125
+ "5. Current factor environment: is {factor} in favor?\n"
126
+ "6. Combined multi-factor overlay suggestion"
127
+ ),
128
+ "tools_hint": ["calculate_factors", "get_alpha158_factors", "get_market_data"],
129
+ },
130
+ {
131
+ "command": "/crypto-scan",
132
+ "name": "Crypto Scanner",
133
+ "category": "crypto",
134
+ "description": "Cryptocurrency market scan with top movers and DeFi trends",
135
+ "args": "[focus]",
136
+ "prompt": (
137
+ "Scan the cryptocurrency market:\n"
138
+ "1. BTC and ETH: price, trend, dominance, key levels\n"
139
+ "2. Top 5 gainers and top 5 losers (24h)\n"
140
+ "3. Market sentiment: Fear & Greed index, funding rates\n"
141
+ "4. DeFi and Layer-2 highlights\n"
142
+ "5. Upcoming catalysts: halvings, upgrades, token unlocks\n"
143
+ "6. Trading opportunities with risk levels\n"
144
+ "{extra}"
145
+ ),
146
+ "tools_hint": ["get_crypto_data", "analyze_news"],
147
+ },
148
+ {
149
+ "command": "/backtest-report",
150
+ "name": "Backtest Report",
151
+ "category": "quant",
152
+ "description": "Run and analyze a strategy backtest with detailed metrics",
153
+ "args": "<strategy> <symbol> [start] [end]",
154
+ "prompt": (
155
+ "Run a detailed backtest of '{strategy}' strategy on {symbol} from {start} to {end}:\n"
156
+ "1. Performance summary: total return, annualized, Sharpe, Sortino\n"
157
+ "2. Risk metrics: max drawdown, VaR, downside deviation\n"
158
+ "3. Trade analysis: win rate, avg win/loss, profit factor\n"
159
+ "4. Monthly returns breakdown\n"
160
+ "5. Comparison vs buy-and-hold and benchmark (SPY)\n"
161
+ "6. Optimization suggestions: parameter sensitivity"
162
+ ),
163
+ "tools_hint": ["backtest_strategy", "get_market_data", "get_risk_metrics"],
164
+ },
165
+ {
166
+ "command": "/watchlist-scan",
167
+ "name": "Watchlist Scan",
168
+ "category": "tools",
169
+ "description": "Scan all watchlist stocks for signals and alerts",
170
+ "args": "",
171
+ "prompt": (
172
+ "Scan my watchlist ({symbols}) and for each stock provide:\n"
173
+ "1. Current price and daily change\n"
174
+ "2. Technical signal: Buy/Sell/Hold based on key indicators\n"
175
+ "3. Any earnings or events upcoming\n"
176
+ "4. News sentiment (positive/neutral/negative)\n"
177
+ "5. Overall alert level: Green/Yellow/Red\n"
178
+ "Sort by urgency of action needed."
179
+ ),
180
+ "tools_hint": ["get_market_data", "analyze_news"],
181
+ },
182
+ {
183
+ "command": "/gen-strategy",
184
+ "name": "Generate Strategy Code",
185
+ "category": "code",
186
+ "description": "Generate complete Python trading strategy code",
187
+ "args": "<strategy_type> [symbol]",
188
+ "prompt": (
189
+ "Generate a complete, production-ready Python backtrader trading strategy.\n"
190
+ "Strategy type: {strategy}\n"
191
+ "Target symbol: {symbol}\n\n"
192
+ "Requirements:\n"
193
+ "1. Full backtrader Strategy class with __init__, next, notify_order\n"
194
+ "2. Proper indicator initialization (use bt.indicators)\n"
195
+ "3. Entry/exit logic with clear conditions\n"
196
+ "4. Position sizing (percent sizer or fixed)\n"
197
+ "5. Risk management: stop-loss and take-profit\n"
198
+ "6. Logging via self.log()\n"
199
+ "7. Complete cerebro setup code at the bottom\n\n"
200
+ "Return ONLY the Python code wrapped in ```python``` fences. "
201
+ "Include inline comments explaining the logic."
202
+ ),
203
+ "tools_hint": ["recommend_strategy", "backtest_strategy"],
204
+ },
205
+ {
206
+ "command": "/gen-analysis",
207
+ "name": "Generate Analysis Script",
208
+ "category": "code",
209
+ "description": "Generate a Python analysis/visualization script",
210
+ "args": "<topic> [symbols...]",
211
+ "prompt": (
212
+ "Generate a Python script for financial analysis and visualization.\n"
213
+ "Topic: {topic}\n"
214
+ "Symbols: {symbols}\n\n"
215
+ "Requirements:\n"
216
+ "1. Use pandas, numpy, matplotlib/plotly, yfinance\n"
217
+ "2. Fetch real market data with yfinance\n"
218
+ "3. Compute relevant metrics/indicators\n"
219
+ "4. Create informative charts/plots\n"
220
+ "5. Print a summary table of key findings\n"
221
+ "6. Include error handling for data fetching\n\n"
222
+ "Return ONLY the Python code wrapped in ```python``` fences. "
223
+ "Include inline comments."
224
+ ),
225
+ "tools_hint": ["get_market_data", "calculate_factors"],
226
+ },
227
+ {
228
+ "command": "/gen-bot",
229
+ "name": "Generate Trading Bot",
230
+ "category": "code",
231
+ "description": "Generate live trading bot with exchange API (ccxt)",
232
+ "args": "<exchange> <strategy>",
233
+ "prompt": (
234
+ "Generate a Python trading bot for live execution.\n"
235
+ "Exchange: {exchange}\n"
236
+ "Strategy: {strategy}\n\n"
237
+ "Requirements:\n"
238
+ "1. Use ccxt library for exchange connection\n"
239
+ "2. Market data fetching and order execution\n"
240
+ "3. Signal generation based on the strategy logic\n"
241
+ "4. Risk management: max position size, daily loss limit\n"
242
+ "5. Logging with timestamps\n"
243
+ "6. Graceful shutdown handling (SIGINT)\n"
244
+ "7. Configuration via environment variables (API keys)\n"
245
+ "8. Paper trading mode toggle\n\n"
246
+ "Return ONLY the Python code wrapped in ```python``` fences. "
247
+ "NEVER include actual API keys. Use env vars."
248
+ ),
249
+ "tools_hint": ["recommend_strategy"],
250
+ },
251
+ {
252
+ "command": "/train-status",
253
+ "name": "Training Status",
254
+ "category": "tools",
255
+ "description": "Check Aria model training and data pipeline status",
256
+ "args": "",
257
+ "prompt": (
258
+ "Check the current Aria model training status.\n"
259
+ "1. Locate the project root via the ARIA_PROJECT_ROOT environment variable, or "
260
+ "search upward from the current directory for a 'packages/ml/llm/training' folder.\n"
261
+ "2. List checkpoint directories inside 'packages/ml/llm/training/outputs/' "
262
+ "(any subdirectory containing 'trainer_state.json').\n"
263
+ "3. Read the latest checkpoint's trainer_state.json: report current step, "
264
+ "total steps, epoch, eval_loss, and best_model_checkpoint.\n"
265
+ "4. Check for model_versions.json in the training outputs and report the "
266
+ "currently deployed version if present.\n"
267
+ "5. List recent training data files under 'data/training/' (newest 5 files).\n"
268
+ "Summarize: training progress (step/total, %), eval_loss trend, "
269
+ "deployed version, and data pipeline status."
270
+ ),
271
+ "tools_hint": ["read_file", "list_files"],
272
+ },
273
+ ]
@@ -0,0 +1,190 @@
1
+ """Structured task tracking for the Aria agent loop (Claude Code TodoWrite parity).
2
+
3
+ The model calls the ``update_todos`` tool with the full current task list each
4
+ time progress changes. We keep the latest list in a module-global so the
5
+ renderer (and any UI surface) can show a live checklist of multi-step work.
6
+
7
+ Design notes
8
+ ------------
9
+ * State is intentionally a process-global, mirroring how the screenshot tool
10
+ stashes a pending image. Tool handlers only receive ``params``; they have no
11
+ reference to the terminal, so a module global is the pragmatic channel.
12
+ * The list is replaced wholesale on every call (not merged) so the model owns
13
+ the source of truth and we never drift out of sync with its plan.
14
+ """
15
+ from __future__ import annotations
16
+
17
+ from typing import Any, Dict, List
18
+
19
+ _VALID_STATUS = ("pending", "in_progress", "completed")
20
+
21
+ # Latest task list the model published this turn.
22
+ _ACTIVE_TODOS: List[Dict[str, str]] = []
23
+
24
+
25
+ def get_active_todos() -> List[Dict[str, str]]:
26
+ """Return a copy of the current task list."""
27
+ return list(_ACTIVE_TODOS)
28
+
29
+
30
+ def clear_todos() -> None:
31
+ """Reset the task list (call at the start of a new user turn)."""
32
+ _ACTIVE_TODOS.clear()
33
+
34
+
35
+ def _normalize(todos: Any) -> List[Dict[str, str]]:
36
+ """Coerce model-supplied todos into a clean list of {content, status}."""
37
+ out: List[Dict[str, str]] = []
38
+ if not isinstance(todos, list):
39
+ return out
40
+ for item in todos:
41
+ if isinstance(item, str):
42
+ content, status = item, "pending"
43
+ elif isinstance(item, dict):
44
+ content = str(
45
+ item.get("content")
46
+ or item.get("task")
47
+ or item.get("title")
48
+ or item.get("step")
49
+ or ""
50
+ ).strip()
51
+ status = str(item.get("status", "pending")).strip().lower()
52
+ else:
53
+ continue
54
+ if not content:
55
+ continue
56
+ if status not in _VALID_STATUS:
57
+ # Accept a few common synonyms
58
+ status = {
59
+ "done": "completed", "complete": "completed", "finished": "completed",
60
+ "doing": "in_progress", "active": "in_progress", "wip": "in_progress",
61
+ "todo": "pending", "open": "pending", "not_started": "pending",
62
+ }.get(status, "pending")
63
+ out.append({"content": content, "status": status})
64
+ return out
65
+
66
+
67
+ def update_todos(params: dict) -> dict:
68
+ """Tool handler: replace the active task list with the model's latest plan."""
69
+ todos = _normalize(params.get("todos", params.get("tasks", [])))
70
+ if not todos:
71
+ return {
72
+ "success": False,
73
+ "error": "update_todos 需要非空的 todos 数组,每项形如 "
74
+ "{\"content\": \"步骤描述\", \"status\": \"pending|in_progress|completed\"}",
75
+ }
76
+
77
+ # At most one in_progress is the convention — demote extras to pending order
78
+ seen_in_progress = False
79
+ for t in todos:
80
+ if t["status"] == "in_progress":
81
+ if seen_in_progress:
82
+ t["status"] = "pending"
83
+ else:
84
+ seen_in_progress = True
85
+
86
+ _ACTIVE_TODOS.clear()
87
+ _ACTIVE_TODOS.extend(todos)
88
+
89
+ _render(todos)
90
+
91
+ done = sum(1 for t in todos if t["status"] == "completed")
92
+ total = len(todos)
93
+ return {
94
+ "success": True,
95
+ "data": {
96
+ "total": total,
97
+ "completed": done,
98
+ "in_progress": sum(1 for t in todos if t["status"] == "in_progress"),
99
+ "pending": sum(1 for t in todos if t["status"] == "pending"),
100
+ "todos": todos,
101
+ },
102
+ # Compact text the model reads back so it knows the tracked state
103
+ "summary": f"任务进度 {done}/{total} 已完成",
104
+ }
105
+
106
+
107
+ def _render(todos: List[Dict[str, str]]) -> None:
108
+ """Print the task list as a checklist. Uses rich when available."""
109
+ try:
110
+ import aria_cli as _ac
111
+ console = getattr(_ac, "console", None)
112
+ has_rich = getattr(_ac, "HAS_RICH", False)
113
+ except Exception:
114
+ console, has_rich = None, False
115
+
116
+ _icons = {
117
+ "completed": ("[green]✓[/green]", "✓"),
118
+ "in_progress": ("[yellow]▶[/yellow]", "▶"),
119
+ "pending": ("[dim]○[/dim]", "○"),
120
+ }
121
+ done = sum(1 for t in todos if t["status"] == "completed")
122
+ total = len(todos)
123
+
124
+ if has_rich and console is not None:
125
+ from rich.panel import Panel
126
+ from rich.text import Text
127
+ body = Text()
128
+ for i, t in enumerate(todos):
129
+ icon_rich, _ = _icons.get(t["status"], _icons["pending"])
130
+ style = (
131
+ "green" if t["status"] == "completed"
132
+ else "bold yellow" if t["status"] == "in_progress"
133
+ else "dim"
134
+ )
135
+ line = Text.from_markup(f"{icon_rich} ")
136
+ content = t["content"]
137
+ if t["status"] == "completed":
138
+ line.append(content, style="dim strike")
139
+ else:
140
+ line.append(content, style=style)
141
+ body.append_text(line)
142
+ if i < len(todos) - 1:
143
+ body.append("\n")
144
+ console.print(Panel(
145
+ body,
146
+ title=f"[bold]任务清单[/bold] [dim]{done}/{total}[/dim]",
147
+ border_style="cyan",
148
+ padding=(0, 1),
149
+ ))
150
+ else:
151
+ print(f"\n任务清单 ({done}/{total}):")
152
+ for t in todos:
153
+ _, icon_plain = _icons.get(t["status"], _icons["pending"])
154
+ print(f" {icon_plain} {t['content']}")
155
+
156
+
157
+ UPDATE_TODOS_SCHEMA = {
158
+ "type": "function",
159
+ "function": {
160
+ "name": "update_todos",
161
+ "description": (
162
+ "Track progress on a multi-step task as a live checklist. Call this when a task "
163
+ "has 3+ distinct steps: first to lay out the plan (all pending), then again each "
164
+ "time you start a step (mark it in_progress) or finish one (mark it completed). "
165
+ "Keep exactly one step in_progress at a time. Always send the FULL list every call."
166
+ ),
167
+ "parameters": {
168
+ "type": "object",
169
+ "properties": {
170
+ "todos": {
171
+ "type": "array",
172
+ "description": "The complete current task list (replaces the previous list).",
173
+ "items": {
174
+ "type": "object",
175
+ "properties": {
176
+ "content": {"type": "string", "description": "Short step description"},
177
+ "status": {
178
+ "type": "string",
179
+ "enum": list(_VALID_STATUS),
180
+ "description": "pending | in_progress | completed",
181
+ },
182
+ },
183
+ "required": ["content", "status"],
184
+ },
185
+ },
186
+ },
187
+ "required": ["todos"],
188
+ },
189
+ },
190
+ }