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,202 @@
1
+ """The edit plan: the one document every stage of the video workflow reads and writes.
2
+
3
+ Its beat fields follow the short-form-video-editing skill's edit-plan schema
4
+ (id, start, end, purpose, visual, copy, caption, pending) so the plan can be
5
+ checked by that skill's release gate. Additions the renderer needs — where the
6
+ visual comes from, the camera move, the narration — live beside them.
7
+
8
+ A plan is what the user reviews before anything is rendered or paid for, so
9
+ validation here is strict and its messages are meant to be read by a person.
10
+ """
11
+ from __future__ import annotations
12
+
13
+ from dataclasses import asdict, dataclass, field
14
+ from typing import Any, Dict, List, Optional
15
+
16
+ PURPOSES = ("hook", "evidence", "conclusion", "cta")
17
+ EFFECTS = ("zoom_in", "zoom_out", "pan_left", "pan_right")
18
+ ASPECT_RATIOS = ("9:16", "16:9", "1:1")
19
+ SOURCE_KINDS = ("asset", "generate", "animate")
20
+ # Billed per second by Veo. "animate" starts from one of the user's own images
21
+ # (image-to-video), so the shot keeps that image instead of inventing a new one.
22
+ PAID_SOURCES = ("generate", "animate")
23
+
24
+ # Platform → default aspect ratio, from the skill's platform specs.
25
+ PLATFORM_ASPECT = {
26
+ "douyin": "9:16", "tiktok": "9:16", "xiaohongshu": "9:16", "reels": "9:16", "shorts": "9:16",
27
+ "bilibili": "16:9", "youtube": "16:9", "x": "16:9", "linkedin": "1:1",
28
+ }
29
+
30
+ # Veo produces short clips; a generated beat longer than this is split or refused.
31
+ MAX_GENERATED_SECONDS = 8
32
+
33
+
34
+ @dataclass
35
+ class Asset:
36
+ id: str
37
+ path: str
38
+ kind: str # "image" | "video"
39
+ description: str = ""
40
+ subjects: List[str] = field(default_factory=list)
41
+ text_in_frame: str = ""
42
+ orientation: str = "" # "portrait" | "landscape" | "square"
43
+ suggested_use: str = ""
44
+ rights_note: str = "" # anything the user must confirm before release
45
+
46
+
47
+ @dataclass
48
+ class Beat:
49
+ id: str
50
+ start: float
51
+ end: float
52
+ purpose: str
53
+ visual: str # what the viewer sees, in words
54
+ source: str = "asset" # "asset" | "generate" | "animate"
55
+ asset_id: str = "" # when source is "asset" or "animate"
56
+ generate_prompt: str = "" # when source is "generate", or the motion for "animate"
57
+ effect: str = "zoom_in"
58
+ copy: str = "" # narration spoken over the beat
59
+ caption: str = "" # on-screen text; defaults to the narration
60
+ pending: bool = False # something the user must still supply or approve
61
+
62
+ @property
63
+ def duration(self) -> float:
64
+ return round(self.end - self.start, 3)
65
+
66
+
67
+ @dataclass
68
+ class EditPlan:
69
+ project_id: str
70
+ title: str
71
+ platform: str
72
+ aspect_ratio: str
73
+ language: str
74
+ beats: List[Beat]
75
+ voice: str = ""
76
+ notes: List[str] = field(default_factory=list)
77
+
78
+ @property
79
+ def duration(self) -> float:
80
+ return round(self.beats[-1].end, 3) if self.beats else 0.0
81
+
82
+ def generated_seconds(self) -> float:
83
+ return round(sum(beat.duration for beat in self.beats if beat.source in PAID_SOURCES), 3)
84
+
85
+ def to_dict(self) -> Dict[str, Any]:
86
+ data = asdict(self)
87
+ data["duration"] = self.duration
88
+ return data
89
+
90
+ @classmethod
91
+ def from_dict(cls, data: Dict[str, Any]) -> "EditPlan":
92
+ beats = [Beat(**{key: value for key, value in beat.items() if key in Beat.__dataclass_fields__}) for beat in data.get("beats", [])]
93
+ fields = {key: value for key, value in data.items() if key in cls.__dataclass_fields__ and key != "beats"}
94
+ return cls(beats=beats, **fields)
95
+
96
+ def retime(self) -> None:
97
+ """Lay the beats end to end from 0, keeping each beat's duration."""
98
+ cursor = 0.0
99
+ for beat in self.beats:
100
+ length = beat.duration
101
+ beat.start = round(cursor, 3)
102
+ beat.end = round(cursor + length, 3)
103
+ cursor = beat.end
104
+
105
+
106
+ def validate_plan(plan: EditPlan, assets: Dict[str, Asset]) -> List[str]:
107
+ """Problems that block rendering, as sentences. Empty means renderable."""
108
+ problems: List[str] = []
109
+ if plan.aspect_ratio not in ASPECT_RATIOS:
110
+ problems.append(f"Aspect ratio {plan.aspect_ratio!r} is not one of {', '.join(ASPECT_RATIOS)}.")
111
+ if not plan.beats:
112
+ problems.append("The plan has no beats.")
113
+ return problems
114
+ expected_start = 0.0
115
+ seen = set()
116
+ for beat in plan.beats:
117
+ label = f"Beat {beat.id}"
118
+ if beat.id in seen:
119
+ problems.append(f"{label} appears twice.")
120
+ seen.add(beat.id)
121
+ if beat.purpose not in PURPOSES:
122
+ problems.append(f"{label}: purpose {beat.purpose!r} is not one of {', '.join(PURPOSES)}.")
123
+ if beat.end <= beat.start:
124
+ problems.append(f"{label} ends before it starts.")
125
+ if abs(beat.start - expected_start) > 0.05:
126
+ problems.append(f"{label} starts at {beat.start}s but the previous beat ends at {expected_start}s.")
127
+ expected_start = beat.end
128
+ if beat.effect not in EFFECTS:
129
+ problems.append(f"{label}: camera move {beat.effect!r} is not one of {', '.join(EFFECTS)}.")
130
+ if beat.source not in SOURCE_KINDS:
131
+ problems.append(f"{label}: source {beat.source!r} must be one of {', '.join(SOURCE_KINDS)}.")
132
+ elif beat.source in ("asset", "animate") and beat.asset_id not in assets:
133
+ problems.append(f"{label} uses asset {beat.asset_id!r}, which is not among the provided files.")
134
+ if beat.source == "animate" and beat.asset_id in assets and assets[beat.asset_id].kind != "image":
135
+ problems.append(f"{label} animates {beat.asset_id!r}, which is a video; only images can be animated.")
136
+ if beat.source in PAID_SOURCES:
137
+ if not beat.generate_prompt.strip():
138
+ problems.append(f"{label} is a generated shot without a prompt." if beat.source == "generate"
139
+ else f"{label} animates an image without describing the motion.")
140
+ if beat.duration > MAX_GENERATED_SECONDS:
141
+ problems.append(f"{label} is a generated shot of {beat.duration}s; generated shots are at most {MAX_GENERATED_SECONDS}s.")
142
+ if plan.beats[0].purpose != "hook":
143
+ problems.append("The first beat should be the hook.")
144
+ # Variety: a still repeated shot after shot reads as a slideshow of one image.
145
+ run_asset, run_length = "", 0
146
+ for beat in plan.beats:
147
+ current = beat.asset_id if beat.source in ("asset", "animate") else ""
148
+ run_length = run_length + 1 if current and current == run_asset else 1
149
+ run_asset = current
150
+ if current and run_length == 3:
151
+ problems.append(f"Asset {current} is used in 3 beats in a row (up to {beat.id}); alternate it with other assets.")
152
+ used = {beat.asset_id for beat in plan.beats if beat.source in ("asset", "animate")}
153
+ unused = [asset_id for asset_id in assets if asset_id not in used]
154
+ if unused and len(plan.beats) >= len(assets):
155
+ problems.append(f"Assets {', '.join(unused)} are not used although the video has room for them.")
156
+ return problems
157
+
158
+
159
+ def to_srt(plan: EditPlan, max_chars: int = 18) -> str:
160
+ """Subtitles from the beats' captions, split into readable lines across each beat."""
161
+ def stamp(seconds: float) -> str:
162
+ millis = int(round(seconds * 1000))
163
+ hours, rest = divmod(millis, 3_600_000)
164
+ minutes, rest = divmod(rest, 60_000)
165
+ secs, ms = divmod(rest, 1000)
166
+ return f"{hours:02d}:{minutes:02d}:{secs:02d},{ms:03d}"
167
+
168
+ def chunks(text: str) -> List[str]:
169
+ text = " ".join(text.split())
170
+ if not text:
171
+ return []
172
+ pieces, current = [], ""
173
+ for char in text:
174
+ current += char
175
+ breakable = char in ",。!?;、,.!?; " and len(current) >= max_chars * 0.5
176
+ if len(current) >= max_chars or breakable:
177
+ pieces.append(current.strip())
178
+ current = ""
179
+ if current.strip():
180
+ pieces.append(current.strip())
181
+ return pieces
182
+
183
+ entries: List[str] = []
184
+ index = 1
185
+ for beat in plan.beats:
186
+ lines = chunks(beat.caption or beat.copy)
187
+ if not lines:
188
+ continue
189
+ total = sum(len(line) for line in lines)
190
+ cursor = beat.start
191
+ for line in lines:
192
+ span = beat.duration * len(line) / total
193
+ entries.append(f"{index}\n{stamp(cursor)} --> {stamp(min(beat.end, cursor + span))}\n{line}\n")
194
+ cursor += span
195
+ index += 1
196
+ return "\n".join(entries)
197
+
198
+
199
+ def default_aspect(platform: str, requested: Optional[str] = None) -> str:
200
+ if requested in ASPECT_RATIOS:
201
+ return requested
202
+ return PLATFORM_ASPECT.get((platform or "").strip().lower(), "9:16")
@@ -0,0 +1,297 @@
1
+ """session.py — 桌面端视频工程与会话中枢 (Video Project Session Manager)
2
+
3
+ 专为桌面端(桌面 App / Electron / Tauri / MCP 协议调用)量身打造:
4
+ 1. 项目工程状态持久化:以结构化 JSON 保存分镜卡片、素材关联、各镜头生成状态、音轨配置与成片记录。
5
+ 2. 单镜头独立重生成 (Per-Shot Regeneration):
6
+ 当用户对第 N 个镜头不满意时,仅重新生成该镜头的画面,其余镜头全部复用已有缓存,秒级快速重新缝合母带!
7
+ 3. 状态轮询与进度推送:支持桌面端 UI 逐镜展示生成状态(draft -> generating -> completed -> failed)。
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import json
13
+ import logging
14
+ import os
15
+ import time
16
+ import uuid
17
+ from dataclasses import asdict, dataclass, field
18
+ from pathlib import Path
19
+ from typing import Any, Dict, List, Optional
20
+
21
+ from aria_code.video_editor import assemble_storyboard
22
+ from aria_code.video_workflow.engines import VideoEngineRegistry, VideoShotRequest
23
+
24
+ logger = logging.getLogger(__name__)
25
+
26
+
27
+ @dataclass
28
+ class ShotCard:
29
+ shot_index: int
30
+ duration: float
31
+ prompt: str
32
+ narration: str
33
+ caption: str
34
+ source_image: Optional[str] = None
35
+ clip_path: Optional[str] = None
36
+ status: str = "draft" # "draft" | "generating" | "completed" | "failed"
37
+ engine_used: Optional[str] = None
38
+ camera_motion: Optional[Dict[str, float]] = None
39
+ camera_description: str = ""
40
+ effect: str = "zoom_in"
41
+ qa_score: Optional[int] = None
42
+ error: Optional[str] = None
43
+
44
+
45
+ @dataclass
46
+ class VideoProject:
47
+ project_id: str
48
+ title: str
49
+ script: str
50
+ aspect_ratio: str = "16:9"
51
+ target_duration: float = 15.0
52
+ active_engine: str = "google"
53
+ subject_anchor: str = ""
54
+ shots: List[ShotCard] = field(default_factory=list)
55
+ audio_path: Optional[str] = None
56
+ bgm_path: Optional[str] = None
57
+ master_video_path: Optional[str] = None
58
+ created_at: float = field(default_factory=time.time)
59
+ updated_at: float = field(default_factory=time.time)
60
+
61
+
62
+ class VideoProjectSession:
63
+ """桌面端工程化会话中枢单例。"""
64
+
65
+ _instance: Optional[VideoProjectSession] = None
66
+
67
+ def __init__(self, workspace_root: Optional[str] = None):
68
+ self.workspace_root = Path(workspace_root or os.path.expanduser("~/.aria-code/projects/video"))
69
+ self.workspace_root.mkdir(parents=True, exist_ok=True)
70
+ from aria_code.agents.video.director import VideoDirectorAgent
71
+ from aria_code.agents.video.qa_agent import VisualQAAgent
72
+ self.director = VideoDirectorAgent()
73
+ self.qa_agent = VisualQAAgent()
74
+
75
+ @classmethod
76
+ def get_instance(cls) -> VideoProjectSession:
77
+ if cls._instance is None:
78
+ cls._instance = cls()
79
+ return cls._instance
80
+
81
+ def _project_dir(self, project_id: str) -> Path:
82
+ return self.workspace_root / project_id
83
+
84
+ def _project_file(self, project_id: str) -> Path:
85
+ return self._project_dir(project_id) / "project.json"
86
+
87
+ def create_project(
88
+ self,
89
+ title: str,
90
+ script: str,
91
+ images: Optional[List[str]] = None,
92
+ aspect_ratio: str = "16:9",
93
+ target_duration: float = 15.0,
94
+ provider: str = "auto",
95
+ ) -> Dict[str, Any]:
96
+ """初始化一个新视频项目,自动拆解分镜并保存工程文件。"""
97
+ project_id = f"proj_{int(time.time())}_{uuid.uuid4().hex[:6]}"
98
+ pdir = self._project_dir(project_id)
99
+ pdir.mkdir(parents=True, exist_ok=True)
100
+
101
+ # 调度导演 Agent 进行多模态分镜规划与角色特征锚定
102
+ storyboard = self.director.decompose_script_and_images(
103
+ script,
104
+ images=images,
105
+ target_duration=target_duration,
106
+ aspect_ratio=aspect_ratio,
107
+ )
108
+
109
+ shots = []
110
+ for s in storyboard.get("shots", []):
111
+ shots.append(ShotCard(
112
+ shot_index=s["shot_index"],
113
+ duration=s["duration"],
114
+ prompt=s["prompt"],
115
+ narration=s.get("narration", ""),
116
+ caption=s.get("caption", ""),
117
+ source_image=s.get("source_image"),
118
+ camera_motion=s.get("camera_motion"),
119
+ camera_description=s.get("camera_description", ""),
120
+ effect=s.get("effect", "zoom_in"),
121
+ ))
122
+
123
+ project = VideoProject(
124
+ project_id=project_id,
125
+ title=title or storyboard.get("title", "未命名视频"),
126
+ script=script,
127
+ aspect_ratio=aspect_ratio,
128
+ target_duration=target_duration,
129
+ active_engine=provider,
130
+ subject_anchor=storyboard.get("subject_anchor", ""),
131
+ shots=shots,
132
+ )
133
+
134
+ self._save_project(project)
135
+ return {"success": True, "project": asdict(project)}
136
+
137
+ def get_project(self, project_id: str) -> Dict[str, Any]:
138
+ """获取项目工程详情。"""
139
+ pfile = self._project_file(project_id)
140
+ if not pfile.exists():
141
+ return {"success": False, "error": f"Project '{project_id}' not found."}
142
+ try:
143
+ data = json.loads(pfile.read_text(encoding="utf-8"))
144
+ return {"success": True, "project": data}
145
+ except Exception as exc:
146
+ return {"success": False, "error": str(exc)}
147
+
148
+ def list_projects(self) -> List[Dict[str, Any]]:
149
+ """列出所有本地视频项目。"""
150
+ projects = []
151
+ for pdir in self.workspace_root.iterdir():
152
+ pfile = pdir / "project.json"
153
+ if pfile.is_file():
154
+ try:
155
+ data = json.loads(pfile.read_text(encoding="utf-8"))
156
+ projects.append({
157
+ "project_id": data.get("project_id"),
158
+ "title": data.get("title"),
159
+ "aspect_ratio": data.get("aspect_ratio"),
160
+ "shots_count": len(data.get("shots", [])),
161
+ "has_master": bool(data.get("master_video_path")),
162
+ "updated_at": data.get("updated_at"),
163
+ })
164
+ except Exception:
165
+ pass
166
+ return sorted(projects, key=lambda x: x.get("updated_at", 0), reverse=True)
167
+
168
+ def regenerate_single_shot(
169
+ self,
170
+ project_id: str,
171
+ shot_index: int,
172
+ new_prompt: Optional[str] = None,
173
+ engine_name: Optional[str] = None,
174
+ ) -> Dict[str, Any]:
175
+ """核心交互:单镜头独立重新生成,其余镜头复用已有缓存,并触发母带快速重装配。"""
176
+ res = self.get_project(project_id)
177
+ if not res["success"]:
178
+ return res
179
+ pdata = res["project"]
180
+
181
+ target_shot = None
182
+ for s in pdata["shots"]:
183
+ if s["shot_index"] == shot_index:
184
+ target_shot = s
185
+ break
186
+
187
+ if not target_shot:
188
+ return {"success": False, "error": f"Shot index {shot_index} not in project."}
189
+
190
+ target_shot["status"] = "generating"
191
+ self._save_raw(project_id, pdata)
192
+
193
+ # 准备生成请求
194
+ effective_prompt = new_prompt or target_shot["prompt"]
195
+ target_shot["prompt"] = effective_prompt
196
+
197
+ engine_to_use = engine_name or pdata.get("active_engine", "auto")
198
+ registry = VideoEngineRegistry.get_instance()
199
+ engine = registry.get_engine(None if engine_to_use == "auto" else engine_to_use)
200
+
201
+ req = VideoShotRequest(
202
+ prompt=effective_prompt,
203
+ image_path=target_shot.get("source_image"),
204
+ duration_seconds=int(round(target_shot.get("duration", 4.0))),
205
+ aspect_ratio=pdata.get("aspect_ratio", "16:9"),
206
+ camera_motion=target_shot.get("camera_motion"),
207
+ )
208
+
209
+ shot_res = engine.generate_shot(req)
210
+ if not shot_res.success or not shot_res.path:
211
+ # 兜底到本地引擎
212
+ if target_shot.get("source_image"):
213
+ local_res = registry.get_engine("local").generate_shot(req)
214
+ if local_res.success and local_res.path:
215
+ shot_res = local_res
216
+ shot_res.engine_name = "local_fallback"
217
+
218
+ if shot_res.success and shot_res.path:
219
+ target_shot["clip_path"] = shot_res.path
220
+ target_shot["engine_used"] = shot_res.engine_name
221
+ target_shot["status"] = "completed"
222
+
223
+ # 触发视觉质检
224
+ qa_res = self.qa_agent.review_shot(shot_index, shot_res.path, effective_prompt)
225
+ target_shot["qa_score"] = qa_res.quality_score
226
+
227
+ pdata["updated_at"] = time.time()
228
+ self._save_raw(project_id, pdata)
229
+
230
+ # 重新缝合母带
231
+ master_res = self.assemble_master(project_id)
232
+
233
+ return {
234
+ "success": True,
235
+ "shot_index": shot_index,
236
+ "clip_path": shot_res.path,
237
+ "qa_score": qa_res.quality_score,
238
+ "engine_used": shot_res.engine_name,
239
+ "master_video_path": master_res.get("master_video_path"),
240
+ }
241
+ else:
242
+ target_shot["status"] = "failed"
243
+ target_shot["error"] = shot_res.error or "Generation failed"
244
+ self._save_raw(project_id, pdata)
245
+ return {"success": False, "error": target_shot["error"]}
246
+
247
+ def assemble_master(self, project_id: str) -> Dict[str, Any]:
248
+ """将当前项目已生成的所有镜头拼接、压音并输出母带 MP4。"""
249
+ res = self.get_project(project_id)
250
+ if not res["success"]:
251
+ return res
252
+ pdata = res["project"]
253
+
254
+ # 构建 storyboard 格式结构
255
+ storyboard = {
256
+ "title": pdata.get("title", "未命名"),
257
+ "aspect_ratio": pdata.get("aspect_ratio", "16:9"),
258
+ "audio_path": pdata.get("audio_path"),
259
+ "bgm_path": pdata.get("bgm_path"),
260
+ "shots": pdata.get("shots", []),
261
+ }
262
+
263
+ # 自动配乐处理
264
+ if not storyboard.get("bgm_path"):
265
+ try:
266
+ from aria_code.video_workflow.music import MusicLibraryService
267
+ msvc = MusicLibraryService.get_instance()
268
+ storyboard["bgm_path"] = msvc.match_or_synthesize_bgm(
269
+ script=pdata.get("script", ""),
270
+ duration_seconds=float(pdata.get("target_duration", 15.0)) + 4.0,
271
+ output_dir=str(self._project_dir(project_id)),
272
+ )
273
+ except Exception as exc:
274
+ logger.warning(f"[VideoProjectSession] Auto BGM synthesis failed: {exc}")
275
+
276
+ master_out = self._project_dir(project_id) / "master.mp4"
277
+ assemble_res = assemble_storyboard(storyboard, aspect_ratio=storyboard["aspect_ratio"], output_path=str(master_out))
278
+
279
+ if assemble_res.get("success") and assemble_res.get("path"):
280
+ pdata["master_video_path"] = assemble_res["path"]
281
+ pdata["updated_at"] = time.time()
282
+ self._save_raw(project_id, pdata)
283
+ return {
284
+ "success": True,
285
+ "master_video_path": assemble_res["path"],
286
+ "duration": assemble_res.get("duration"),
287
+ }
288
+
289
+ return {"success": False, "error": assemble_res.get("error", "Assemble failed")}
290
+
291
+ def _save_project(self, project: VideoProject) -> None:
292
+ pfile = self._project_file(project.project_id)
293
+ pfile.write_text(json.dumps(asdict(project), ensure_ascii=False, indent=2), encoding="utf-8")
294
+
295
+ def _save_raw(self, project_id: str, data: Dict[str, Any]) -> None:
296
+ pfile = self._project_file(project_id)
297
+ pfile.write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
@@ -0,0 +1,6 @@
1
+ """Workspace primitives for Aria Code."""
2
+
3
+ from .files import WorkspaceFiles, WorkspaceSecurity
4
+ from .verify import VerificationPlan, VerificationPlanner
5
+
6
+ __all__ = ["VerificationPlan", "VerificationPlanner", "WorkspaceFiles", "WorkspaceSecurity"]