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.
- aria_bots/__init__.py +7 -0
- aria_bots/channels/README.md +97 -0
- aria_bots/channels/__init__.py +1 -0
- aria_bots/channels/approvals.py +263 -0
- aria_bots/channels/conversation.py +280 -0
- aria_bots/channels/digest.py +186 -0
- aria_bots/channels/registry.py +95 -0
- aria_bots/engine.py +144 -0
- aria_bots/feishu_bot.py +1385 -0
- aria_bots/logistics/__init__.py +1 -0
- aria_bots/logistics/carriers.py +253 -0
- aria_bots/logistics/freight.py +154 -0
- aria_bots/logistics/inventory.py +242 -0
- aria_bots/logistics/mcp_server.py +156 -0
- aria_bots/logistics/records.py +119 -0
- aria_bots/logistics/tenancy.py +152 -0
- aria_bots/market.py +91 -0
- aria_bots/relay_client.py +326 -0
- aria_bots/telegram_bot.py +299 -0
- aria_code/__init__.py +111 -0
- aria_code/_bin/aria-native.exe +0 -0
- aria_code/_bin/aria-runtime.exe +0 -0
- aria_code/_version.py +20 -0
- aria_code/account_memory.py +296 -0
- aria_code/account_session.py +166 -0
- aria_code/adk_apps/__init__.py +1 -0
- aria_code/adk_apps/aria_code_review/__init__.py +1 -0
- aria_code/adk_apps/aria_code_review/agent.py +32 -0
- aria_code/adk_apps/aria_research/__init__.py +1 -0
- aria_code/adk_apps/aria_research/agent.py +31 -0
- aria_code/agents/__init__.py +49 -0
- aria_code/agents/base.py +329 -0
- aria_code/agents/code_review.py +200 -0
- aria_code/agents/deep/__init__.py +37 -0
- aria_code/agents/deep/calibration_loop.py +144 -0
- aria_code/agents/deep/critic.py +125 -0
- aria_code/agents/deep/deepen.py +193 -0
- aria_code/agents/deep/models.py +149 -0
- aria_code/agents/deep/pipeline.py +164 -0
- aria_code/agents/deep/quant_fusion.py +192 -0
- aria_code/agents/deep/themes.py +95 -0
- aria_code/agents/deep/tiers.py +106 -0
- aria_code/agents/engineering/__init__.py +14 -0
- aria_code/agents/engineering/coder.py +222 -0
- aria_code/agents/engineering/tester.py +145 -0
- aria_code/agents/financial/__init__.py +21 -0
- aria_code/agents/financial/cashflow_burn.py +119 -0
- aria_code/agents/financial/catalyst.py +279 -0
- aria_code/agents/financial/corporate_finance.py +175 -0
- aria_code/agents/financial/debate.py +224 -0
- aria_code/agents/financial/earnings.py +315 -0
- aria_code/agents/financial/fundamental.py +178 -0
- aria_code/agents/financial/macro.py +111 -0
- aria_code/agents/financial/news.py +231 -0
- aria_code/agents/financial/risk.py +146 -0
- aria_code/agents/financial/sector.py +279 -0
- aria_code/agents/financial/strategist.py +121 -0
- aria_code/agents/financial/stripe_revenue.py +127 -0
- aria_code/agents/financial/synthesis.py +274 -0
- aria_code/agents/financial/technical.py +277 -0
- aria_code/agents/orchestrator.py +44 -0
- aria_code/agents/portfolio_agent.py +392 -0
- aria_code/agents/realty/__init__.py +62 -0
- aria_code/agents/realty/asset_diagnosis.py +152 -0
- aria_code/agents/realty/business_match.py +166 -0
- aria_code/agents/realty/cashflow_verify.py +209 -0
- aria_code/agents/realty/contract_rules.py +210 -0
- aria_code/agents/realty/energy_anomaly.py +189 -0
- aria_code/agents/realty/exit_settlement.py +208 -0
- aria_code/agents/realty/fulfillment_risk.py +206 -0
- aria_code/agents/realty/ops_optimize.py +160 -0
- aria_code/agents/realty/revenue_share.py +215 -0
- aria_code/agents/registry.py +168 -0
- aria_code/agents/signal_scheme.py +111 -0
- aria_code/agents/sports/__init__.py +0 -0
- aria_code/agents/sports/football_agent.py +197 -0
- aria_code/agents/supervisor.py +113 -0
- aria_code/agents/team.py +500 -0
- aria_code/agents/video/__init__.py +16 -0
- aria_code/agents/video/director.py +376 -0
- aria_code/agents/video/qa_agent.py +143 -0
- aria_code/agents/video/script_doctor.py +112 -0
- aria_code/agents/warehouse/__init__.py +25 -0
- aria_code/agents/warehouse/contracts.py +26 -0
- aria_code/agents/warehouse/dashboard.py +155 -0
- aria_code/agents/warehouse/fulfillment_leadtime.py +95 -0
- aria_code/agents/warehouse/inbound_exceptions.py +25 -0
- aria_code/agents/warehouse/inventory_health.py +24 -0
- aria_code/agents/warehouse/local_run.py +71 -0
- aria_code/agents/warehouse/local_snapshot.py +132 -0
- aria_code/agents/warehouse/logistics_cost.py +84 -0
- aria_code/agents/warehouse/logistics_sync.py +21 -0
- aria_code/agents/warehouse/navigation.schema.json +110 -0
- aria_code/agents/warehouse/task_agent.py +172 -0
- aria_code/agents/warehouse/workflow.py +31 -0
- aria_code/aliyun_data_client.py +4 -0
- aria_code/apps/README.md +12 -0
- aria_code/apps/__init__.py +2 -0
- aria_code/apps/channels/README.md +9 -0
- aria_code/apps/channels/__init__.py +17 -0
- aria_code/apps/channels/approvals.py +11 -0
- aria_code/apps/channels/conversation.py +11 -0
- aria_code/apps/channels/digest.py +11 -0
- aria_code/apps/channels/intake.py +92 -0
- aria_code/apps/channels/registry.py +11 -0
- aria_code/apps/channels/tradingview.py +94 -0
- aria_code/apps/cli/README.md +13 -0
- aria_code/apps/cli/__init__.py +2 -0
- aria_code/apps/cli/_optional.py +120 -0
- aria_code/apps/cli/app_server.py +656 -0
- aria_code/apps/cli/auto_update.py +125 -0
- aria_code/apps/cli/bootstrap.py +206 -0
- aria_code/apps/cli/broker_render.py +206 -0
- aria_code/apps/cli/chat_turn.py +1327 -0
- aria_code/apps/cli/cloud_models.py +231 -0
- aria_code/apps/cli/codegen_paths.py +29 -0
- aria_code/apps/cli/commands/__init__.py +34 -0
- aria_code/apps/cli/commands/_business_render.py +78 -0
- aria_code/apps/cli/commands/_ui.py +71 -0
- aria_code/apps/cli/commands/analysis_cmds.py +378 -0
- aria_code/apps/cli/commands/ashare_prediction_cmds.py +327 -0
- aria_code/apps/cli/commands/auth_cmds.py +215 -0
- aria_code/apps/cli/commands/backtest_cmds.py +2518 -0
- aria_code/apps/cli/commands/broker_cmds.py +1236 -0
- aria_code/apps/cli/commands/business_workflow_cmds.py +379 -0
- aria_code/apps/cli/commands/canvas_cmds.py +77 -0
- aria_code/apps/cli/commands/catalog.py +189 -0
- aria_code/apps/cli/commands/core_cmds.py +2748 -0
- aria_code/apps/cli/commands/data_cmds.py +521 -0
- aria_code/apps/cli/commands/diagnostic_cmds.py +285 -0
- aria_code/apps/cli/commands/diagnostic_ops_cmds.py +813 -0
- aria_code/apps/cli/commands/engineering_cmds.py +399 -0
- aria_code/apps/cli/commands/file_cmds.py +312 -0
- aria_code/apps/cli/commands/finance_service_cmds.py +60 -0
- aria_code/apps/cli/commands/fx_commodity_cmds.py +123 -0
- aria_code/apps/cli/commands/market.py +544 -0
- aria_code/apps/cli/commands/market_cmds.py +1419 -0
- aria_code/apps/cli/commands/market_context.py +432 -0
- aria_code/apps/cli/commands/market_render.py +7 -0
- aria_code/apps/cli/commands/model_cmds.py +2374 -0
- aria_code/apps/cli/commands/ops_cmds.py +721 -0
- aria_code/apps/cli/commands/orchestrator_cmds.py +181 -0
- aria_code/apps/cli/commands/pdf_export_cmds.py +125 -0
- aria_code/apps/cli/commands/portfolio_cmds.py +1316 -0
- aria_code/apps/cli/commands/report.py +476 -0
- aria_code/apps/cli/commands/scaffold_templates.py +617 -0
- aria_code/apps/cli/commands/session_cmds.py +236 -0
- aria_code/apps/cli/commands/session_ux_cmds.py +359 -0
- aria_code/apps/cli/commands/team.py +723 -0
- aria_code/apps/cli/commands/team_render.py +8 -0
- aria_code/apps/cli/commands/ui_cmds.py +401 -0
- aria_code/apps/cli/commands/warehouse_cmds.py +297 -0
- aria_code/apps/cli/commands/workflow_cmds.py +629 -0
- aria_code/apps/cli/commands/workspace_cmds.py +1543 -0
- aria_code/apps/cli/config_paths.py +73 -0
- aria_code/apps/cli/config_store.py +158 -0
- aria_code/apps/cli/constants.py +88 -0
- aria_code/apps/cli/context.py +34 -0
- aria_code/apps/cli/conversation_policy.py +53 -0
- aria_code/apps/cli/deterministic.py +200 -0
- aria_code/apps/cli/direct.py +48 -0
- aria_code/apps/cli/earnings_view.py +172 -0
- aria_code/apps/cli/endpoint_migration.py +64 -0
- aria_code/apps/cli/exec_events.py +255 -0
- aria_code/apps/cli/file_references.py +155 -0
- aria_code/apps/cli/finance_service_catalog.py +111 -0
- aria_code/apps/cli/football_reports.py +231 -0
- aria_code/apps/cli/github_app_auth.py +135 -0
- aria_code/apps/cli/google_login.py +239 -0
- aria_code/apps/cli/handlers/__init__.py +11 -0
- aria_code/apps/cli/handlers/broker_handlers.py +122 -0
- aria_code/apps/cli/handlers/chart_handlers.py +1314 -0
- aria_code/apps/cli/handlers/market_handlers.py +2570 -0
- aria_code/apps/cli/handlers/realty_handlers.py +114 -0
- aria_code/apps/cli/handlers/sports_handlers.py +22 -0
- aria_code/apps/cli/handlers/strategy_advice.py +82 -0
- aria_code/apps/cli/headless.py +352 -0
- aria_code/apps/cli/helpers.py +326 -0
- aria_code/apps/cli/hooks.py +180 -0
- aria_code/apps/cli/i18n.py +310 -0
- aria_code/apps/cli/intent.py +136 -0
- aria_code/apps/cli/intent_router.py +305 -0
- aria_code/apps/cli/intent_shadow.py +72 -0
- aria_code/apps/cli/intent_signals.py +347 -0
- aria_code/apps/cli/lifecycle_hooks.py +48 -0
- aria_code/apps/cli/local_tool_schemas.py +550 -0
- aria_code/apps/cli/main.py +39 -0
- aria_code/apps/cli/market_hours.py +100 -0
- aria_code/apps/cli/market_metadata.py +135 -0
- aria_code/apps/cli/market_universe.py +487 -0
- aria_code/apps/cli/message_processing.py +310 -0
- aria_code/apps/cli/mixin_binding.py +32 -0
- aria_code/apps/cli/model_catalog.py +652 -0
- aria_code/apps/cli/model_probe.py +169 -0
- aria_code/apps/cli/model_retirement.py +65 -0
- aria_code/apps/cli/native_branding.py +12 -0
- aria_code/apps/cli/native_bridge.py +118 -0
- aria_code/apps/cli/native_entry.py +58 -0
- aria_code/apps/cli/pdf_report.py +977 -0
- aria_code/apps/cli/plan_mode.py +139 -0
- aria_code/apps/cli/plotly_html.py +15 -0
- aria_code/apps/cli/prediction_feedback.py +202 -0
- aria_code/apps/cli/preflight.py +502 -0
- aria_code/apps/cli/project_aria.py +60 -0
- aria_code/apps/cli/prompt_assembly.py +78 -0
- aria_code/apps/cli/prompts/__init__.py +0 -0
- aria_code/apps/cli/prompts/coding.py +71 -0
- aria_code/apps/cli/prompts/select.py +193 -0
- aria_code/apps/cli/prompts/system_prompts.py +562 -0
- aria_code/apps/cli/prompts/ui.py +436 -0
- aria_code/apps/cli/provider_endpoints.py +237 -0
- aria_code/apps/cli/provider_keys.py +73 -0
- aria_code/apps/cli/providers/__init__.py +1 -0
- aria_code/apps/cli/providers/base.py +775 -0
- aria_code/apps/cli/providers/chat_routing.py +139 -0
- aria_code/apps/cli/providers/collaboration.py +98 -0
- aria_code/apps/cli/providers/llm/__init__.py +1 -0
- aria_code/apps/cli/providers/llm/offline_responses.py +68 -0
- aria_code/apps/cli/providers/llm/ollama_stream.py +1574 -0
- aria_code/apps/cli/providers/llm/response_cache.py +60 -0
- aria_code/apps/cli/providers/llm/sse_stream.py +298 -0
- aria_code/apps/cli/providers/runtime_bridge.py +586 -0
- aria_code/apps/cli/providers/vertexai_stream.py +592 -0
- aria_code/apps/cli/release_download.py +159 -0
- aria_code/apps/cli/review_runner.py +111 -0
- aria_code/apps/cli/runtime_consumer.py +769 -0
- aria_code/apps/cli/sandbox.py +32 -0
- aria_code/apps/cli/session_export.py +120 -0
- aria_code/apps/cli/session_jsonl.py +208 -0
- aria_code/apps/cli/session_refresh.py +123 -0
- aria_code/apps/cli/session_store.py +125 -0
- aria_code/apps/cli/skills_catalog.py +273 -0
- aria_code/apps/cli/task_isolation.py +211 -0
- aria_code/apps/cli/terminal_chrome.py +412 -0
- aria_code/apps/cli/todo_tracker.py +190 -0
- aria_code/apps/cli/tool_executor.py +932 -0
- aria_code/apps/cli/tool_registry.py +34 -0
- aria_code/apps/cli/tool_scope.py +113 -0
- aria_code/apps/cli/tools/__init__.py +40 -0
- aria_code/apps/cli/tools/context.py +46 -0
- aria_code/apps/cli/tools/file_tools.py +181 -0
- aria_code/apps/cli/tools/market_tools.py +626 -0
- aria_code/apps/cli/tools/notebook_tools.py +111 -0
- aria_code/apps/cli/tools/system_tools.py +656 -0
- aria_code/apps/cli/tools/write_tools.py +961 -0
- aria_code/apps/cli/tradingview_bridge.py +529 -0
- aria_code/apps/cli/transactions.py +269 -0
- aria_code/apps/cli/turn_planning.py +137 -0
- aria_code/apps/cli/update_check.py +257 -0
- aria_code/apps/cli/updater.py +373 -0
- aria_code/apps/cli/utils/__init__.py +0 -0
- aria_code/apps/cli/utils/market_detect.py +1663 -0
- aria_code/apps/cli/web_login.py +136 -0
- aria_code/apps/cli/workflow_runner.py +127 -0
- aria_code/apps/cli/workspace_route.py +121 -0
- aria_code/apps/daemon/README.md +14 -0
- aria_code/apps/vscode/README.md +115 -0
- aria_code/apps/vscode/package.json +70 -0
- aria_code/aria_cli.py +5244 -0
- aria_code/aria_daemon.py +1372 -0
- aria_code/aria_feishu_bot.py +16 -0
- aria_code/aria_mcp_server.py +61 -0
- aria_code/aria_relay_client.py +4 -0
- aria_code/aria_telegram_bot.py +11 -0
- aria_code/ariarc.py +385 -0
- aria_code/artifacts.py +581 -0
- aria_code/backtest_engine.py +4 -0
- aria_code/backtest_report.py +4 -0
- aria_code/brokers/__init__.py +78 -0
- aria_code/brokers/automation.py +193 -0
- aria_code/brokers/base.py +231 -0
- aria_code/brokers/capabilities.py +264 -0
- aria_code/brokers/cn/__init__.py +10 -0
- aria_code/brokers/cn/easytrader_broker.py +193 -0
- aria_code/brokers/cn/futu_broker.py +194 -0
- aria_code/brokers/cn/longbridge_broker.py +190 -0
- aria_code/brokers/cn/tiger_broker.py +196 -0
- aria_code/brokers/cn/xtquant_broker.py +225 -0
- aria_code/brokers/config.py +414 -0
- aria_code/brokers/intl/__init__.py +5 -0
- aria_code/brokers/intl/alpaca_broker.py +183 -0
- aria_code/brokers/intl/ibkr_broker.py +215 -0
- aria_code/brokers/intl/trading212_broker.py +183 -0
- aria_code/brokers/intl/webull_broker.py +156 -0
- aria_code/brokers/paper_broker.py +266 -0
- aria_code/brokers/planning.py +296 -0
- aria_code/brokers/registry.py +213 -0
- aria_code/brokers/trading.py +267 -0
- aria_code/canva_client.py +4 -0
- aria_code/change_store.py +127 -0
- aria_code/clients/__init__.py +0 -0
- aria_code/clients/aliyun_data_client.py +660 -0
- aria_code/clients/aria_relay_client.py +16 -0
- aria_code/clients/canva_client.py +284 -0
- aria_code/clients/figma_client.py +100 -0
- aria_code/clients/football_data_client.py +1671 -0
- aria_code/clients/kling_video_client.py +182 -0
- aria_code/clients/market_data_client.py +1985 -0
- aria_code/clients/openai_image_client.py +242 -0
- aria_code/clients/runway_video_client.py +157 -0
- aria_code/clients/warehouse_erp_client.py +105 -0
- aria_code/cloud_memory.py +190 -0
- aria_code/command_safety.py +19 -0
- aria_code/computer_use_server.py +276 -0
- aria_code/computer_use_tools.py +4 -0
- aria_code/dashboard_generator.py +579 -0
- aria_code/data_analysis_tools.py +4 -0
- aria_code/data_cleaner.py +483 -0
- aria_code/data_service.py +513 -0
- aria_code/datasources/__init__.py +23 -0
- aria_code/datasources/base.py +166 -0
- aria_code/datasources/router.py +253 -0
- aria_code/datasources/sec_statements.py +217 -0
- aria_code/datasources/sources/__init__.py +15 -0
- aria_code/datasources/sources/akshare_source.py +269 -0
- aria_code/datasources/sources/alpha_vantage_source.py +203 -0
- aria_code/datasources/sources/edgar_source.py +219 -0
- aria_code/datasources/sources/finnhub_source.py +198 -0
- aria_code/datasources/sources/fred_source.py +223 -0
- aria_code/datasources/sources/tushare_source.py +143 -0
- aria_code/datasources/sources/web_scraper_source.py +278 -0
- aria_code/datasources/sources/world_bank_source.py +206 -0
- aria_code/datasources/sources/yfinance_source.py +152 -0
- aria_code/doctor.py +860 -0
- aria_code/domain/__init__.py +0 -0
- aria_code/domain/_finance_core/__init__.py +5 -0
- aria_code/domain/_finance_core/backtest_engine.py +325 -0
- aria_code/domain/_finance_core/performance_stats.py +101 -0
- aria_code/domain/backtest_engine.py +75 -0
- aria_code/domain/backtest_report.py +488 -0
- aria_code/domain/finance_formulas.py +389 -0
- aria_code/domain/performance_stats.py +6 -0
- aria_code/domain/portfolio_ledger.py +307 -0
- aria_code/domain/strategy_vault.py +421 -0
- aria_code/evals/__init__.py +37 -0
- aria_code/evals/behavior.py +113 -0
- aria_code/evals/gap.py +93 -0
- aria_code/evals/harness.py +949 -0
- aria_code/evals/review_probe.py +132 -0
- aria_code/evals/runner.py +425 -0
- aria_code/evals/scorecard.py +322 -0
- aria_code/evals/summary.py +125 -0
- aria_code/external_agent_runner.py +115 -0
- aria_code/figma_client.py +4 -0
- aria_code/file_analysis_tools.py +4 -0
- aria_code/finance_formulas.py +4 -0
- aria_code/football_data_client.py +4 -0
- aria_code/image_gen_tools.py +4 -0
- aria_code/intent_classifier.py +459 -0
- aria_code/kling_video_client.py +4 -0
- aria_code/licensing.py +151 -0
- aria_code/local_finance_tools.py +4 -0
- aria_code/local_image_provider.py +4 -0
- aria_code/local_llm_provider.py +4 -0
- aria_code/macro_tools.py +4 -0
- aria_code/markdown_pdf.py +289 -0
- aria_code/market_data_client.py +4 -0
- aria_code/mcp_client.py +744 -0
- aria_code/memory_manager.py +273 -0
- aria_code/model_capability.py +512 -0
- aria_code/notification_tools.py +4 -0
- aria_code/openai_image_client.py +4 -0
- aria_code/packages/__init__.py +26 -0
- aria_code/packages/adk_bridge/__init__.py +11 -0
- aria_code/packages/adk_bridge/code_review_tools.py +49 -0
- aria_code/packages/adk_bridge/market_tools.py +125 -0
- aria_code/packages/aria_agents/__init__.py +5 -0
- aria_code/packages/aria_agents/manifest.py +78 -0
- aria_code/packages/aria_core/__init__.py +34 -0
- aria_code/packages/aria_core/architecture.py +269 -0
- aria_code/packages/aria_core/export.py +147 -0
- aria_code/packages/aria_core/manifest.py +65 -0
- aria_code/packages/aria_core/paths.py +57 -0
- aria_code/packages/aria_core/secure_file.py +68 -0
- aria_code/packages/aria_infra/__init__.py +15 -0
- aria_code/packages/aria_infra/arthera.py +58 -0
- aria_code/packages/aria_infra/doctor.py +246 -0
- aria_code/packages/aria_infra/product.py +40 -0
- aria_code/packages/aria_mcp/__init__.py +25 -0
- aria_code/packages/aria_mcp/bridge.py +232 -0
- aria_code/packages/aria_mcp/circuit.py +82 -0
- aria_code/packages/aria_mcp/config.py +162 -0
- aria_code/packages/aria_mcp/installer.py +95 -0
- aria_code/packages/aria_mcp/server.py +1705 -0
- aria_code/packages/aria_mcp/tools.py +81 -0
- aria_code/packages/aria_sdk/__init__.py +19 -0
- aria_code/packages/aria_sdk/client.py +393 -0
- aria_code/packages/aria_sdk/providers.py +70 -0
- aria_code/packages/aria_sdk/streaming.py +75 -0
- aria_code/packages/aria_sdk/types.py +86 -0
- aria_code/packages/aria_services/__init__.py +92 -0
- aria_code/packages/aria_services/cache.py +60 -0
- aria_code/packages/aria_services/context.py +356 -0
- aria_code/packages/aria_services/context_checkpoints.py +157 -0
- aria_code/packages/aria_services/data.py +11 -0
- aria_code/packages/aria_services/provider_health.py +304 -0
- aria_code/packages/aria_services/references.py +247 -0
- aria_code/packages/aria_services/registry.py +249 -0
- aria_code/packages/aria_services/research_protocol.py +137 -0
- aria_code/packages/aria_services/research_quality.py +186 -0
- aria_code/packages/aria_services/settings.py +160 -0
- aria_code/packages/aria_services/usage.py +151 -0
- aria_code/packages/aria_skills/__init__.py +46 -0
- aria_code/packages/aria_skills/catalog.py +149 -0
- aria_code/packages/aria_skills/loader.py +455 -0
- aria_code/packages/aria_skills/registry.py +84 -0
- aria_code/packages/aria_tools/__init__.py +5 -0
- aria_code/packages/aria_tools/financial/__init__.py +5 -0
- aria_code/packages/aria_tools/financial/_paths.py +92 -0
- aria_code/packages/aria_tools/registry.py +129 -0
- aria_code/packages/quant_engine/__init__.py +33 -0
- aria_code/packages/quant_engine/_namespace.py +24 -0
- aria_code/packages/quant_engine/backtest/__init__.py +10 -0
- aria_code/packages/quant_engine/backtest/core.py +53 -0
- aria_code/packages/quant_engine/backtest/engine.py +102 -0
- aria_code/packages/quant_engine/portfolio/__init__.py +9 -0
- aria_code/packages/quant_engine/portfolio/optimizer.py +85 -0
- aria_code/packages/quant_engine/sports/__init__.py +76 -0
- aria_code/packages/quant_engine/sports/calibrator.py +354 -0
- aria_code/packages/quant_engine/sports/dixon_coles.py +234 -0
- aria_code/packages/quant_engine/sports/elo.py +300 -0
- aria_code/packages/quant_engine/sports/form.py +188 -0
- aria_code/packages/quant_engine/sports/h2h.py +195 -0
- aria_code/packages/quant_engine/sports/predictor.py +312 -0
- aria_code/packages/quant_engine/sports/tracker.py +665 -0
- aria_code/packages/quant_engine/stochastic/__init__.py +31 -0
- aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +195 -0
- aria_code/packages/quant_engine/stochastic/ito_calculus.py +477 -0
- aria_code/packages/quant_engine/stochastic/kelly_criterion.py +181 -0
- aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +95 -0
- aria_code/packages/quant_engine/stochastic/options_pricing.py +576 -0
- aria_code/packages/quant_engine/stochastic/stochastic_processes.py +90 -0
- aria_code/packs/__init__.py +85 -0
- aria_code/packs/base.py +168 -0
- aria_code/packs/finance/__init__.py +250 -0
- aria_code/packs/healthcare/__init__.py +40 -0
- aria_code/packs/logistics/__init__.py +171 -0
- aria_code/packs/payments/__init__.py +139 -0
- aria_code/packs/realty/__init__.py +190 -0
- aria_code/packs/registry.py +202 -0
- aria_code/packs/rules.py +90 -0
- aria_code/plan_utils.py +194 -0
- aria_code/plugin_loader.py +328 -0
- aria_code/portfolio_ledger.py +4 -0
- aria_code/preview_server.py +449 -0
- aria_code/privacy/__init__.py +5 -0
- aria_code/privacy/feedback.py +123 -0
- aria_code/project_review.py +278 -0
- aria_code/project_review_api.py +235 -0
- aria_code/project_review_server.py +18 -0
- aria_code/project_tools.py +4 -0
- aria_code/providers/__init__.py +30 -0
- aria_code/providers/google_video_provider.py +256 -0
- aria_code/providers/llm/__init__.py +19 -0
- aria_code/providers/llm/anthropic.py +184 -0
- aria_code/providers/llm/arthera_gateway.py +90 -0
- aria_code/providers/llm/autoconfig.py +213 -0
- aria_code/providers/llm/base.py +139 -0
- aria_code/providers/llm/custom.py +158 -0
- aria_code/providers/llm/ollama.py +137 -0
- aria_code/providers/llm/openai_compat.py +350 -0
- aria_code/providers/llm/registry.py +457 -0
- aria_code/providers/local_image_provider.py +202 -0
- aria_code/providers/local_llm_provider.py +549 -0
- aria_code/providers/ollama_models.py +79 -0
- aria_code/providers/openai_params.py +32 -0
- aria_code/providers/tool_messages.py +100 -0
- aria_code/realty_data_tools.py +4 -0
- aria_code/report_exporters.py +150 -0
- aria_code/report_generator.py +1764 -0
- aria_code/review_service.py +497 -0
- aria_code/runtime/__init__.py +176 -0
- aria_code/runtime/acceptance.py +632 -0
- aria_code/runtime/agent_loop.py +1851 -0
- aria_code/runtime/agent_profiles.py +75 -0
- aria_code/runtime/approval.py +71 -0
- aria_code/runtime/baseline.py +219 -0
- aria_code/runtime/budget.py +232 -0
- aria_code/runtime/checkpoints.py +481 -0
- aria_code/runtime/consult.py +65 -0
- aria_code/runtime/contract.py +282 -0
- aria_code/runtime/delivery.py +432 -0
- aria_code/runtime/events.py +113 -0
- aria_code/runtime/gateway.py +167 -0
- aria_code/runtime/lsp.py +484 -0
- aria_code/runtime/native_index.py +153 -0
- aria_code/runtime/orchestrator.py +55 -0
- aria_code/runtime/processes.py +343 -0
- aria_code/runtime/project_graph.py +614 -0
- aria_code/runtime/repo_map.py +712 -0
- aria_code/runtime/research_bundle.py +105 -0
- aria_code/runtime/review.py +269 -0
- aria_code/runtime/run_state.py +127 -0
- aria_code/runtime/run_store.py +522 -0
- aria_code/runtime/scoped_runs.py +113 -0
- aria_code/runtime/self_healing.py +422 -0
- aria_code/runtime/semantic_diff.py +171 -0
- aria_code/runtime/subagent.py +721 -0
- aria_code/runtime/symbol_edit.py +117 -0
- aria_code/runtime/task_brief.py +46 -0
- aria_code/runtime/task_context.py +145 -0
- aria_code/runtime/task_ledger.py +108 -0
- aria_code/runtime/task_orchestrator.py +90 -0
- aria_code/runtime/task_outcome.py +33 -0
- aria_code/runtime/task_verification.py +266 -0
- aria_code/runtime/task_worktree.py +448 -0
- aria_code/runtime/tool_executor.py +329 -0
- aria_code/runtime/tool_policy.py +107 -0
- aria_code/runtime/transactions.py +216 -0
- aria_code/runtime/windows_job.py +115 -0
- aria_code/runtime/workflows.py +222 -0
- aria_code/runtime/worktrees.py +215 -0
- aria_code/runway_video_client.py +4 -0
- aria_code/safety/__init__.py +27 -0
- aria_code/safety/client_isolation.py +178 -0
- aria_code/safety/permissions.py +339 -0
- aria_code/safety/risk.py +699 -0
- aria_code/safety/sandbox.py +148 -0
- aria_code/safety/service.py +102 -0
- aria_code/service_endpoints.py +14 -0
- aria_code/setup_wizard.py +684 -0
- aria_code/spreadsheet_tools.py +4 -0
- aria_code/strategy_vault.py +4 -0
- aria_code/tools/__init__.py +0 -0
- aria_code/tools/artifact_tools.py +252 -0
- aria_code/tools/broker_tools.py +92 -0
- aria_code/tools/build_quant_engine.py +97 -0
- aria_code/tools/code_audit_tools.py +192 -0
- aria_code/tools/computer_use_tools.py +509 -0
- aria_code/tools/data_analysis_tools.py +831 -0
- aria_code/tools/enterprise_finance_tools.py +202 -0
- aria_code/tools/extended_tools.py +240 -0
- aria_code/tools/file_analysis_tools.py +880 -0
- aria_code/tools/image_gen_tools.py +114 -0
- aria_code/tools/local_finance_tools.py +3488 -0
- aria_code/tools/logistics_carriers.py +11 -0
- aria_code/tools/logistics_inventory.py +11 -0
- aria_code/tools/logistics_io.py +11 -0
- aria_code/tools/logistics_tenancy.py +11 -0
- aria_code/tools/logistics_tools.py +11 -0
- aria_code/tools/macro_tools.py +412 -0
- aria_code/tools/notification_tools.py +249 -0
- aria_code/tools/project_tools.py +525 -0
- aria_code/tools/realty_data_tools.py +662 -0
- aria_code/tools/spreadsheet_tools.py +399 -0
- aria_code/tools/stripe_tools.py +115 -0
- aria_code/tools/video_tools.py +500 -0
- aria_code/training/__init__.py +1 -0
- aria_code/training/compare.py +117 -0
- aria_code/training/prelude_commands.py +111 -0
- aria_code/training/prelude_eval.py +390 -0
- aria_code/training/prelude_real.py +183 -0
- aria_code/training/prelude_train.py +248 -0
- aria_code/training/sft_dataset.py +230 -0
- aria_code/training/trajectory_dataset.py +263 -0
- aria_code/ui/__init__.py +105 -0
- aria_code/ui/banner.py +404 -0
- aria_code/ui/completer.py +571 -0
- aria_code/ui/console.py +285 -0
- aria_code/ui/input_box.py +505 -0
- aria_code/ui/mentions.py +206 -0
- aria_code/ui/picker.py +248 -0
- aria_code/ui/render/__init__.py +11 -0
- aria_code/ui/render/actions.py +297 -0
- aria_code/ui/render/finance.py +1732 -0
- aria_code/ui/render/market.py +253 -0
- aria_code/ui/render/output.py +954 -0
- aria_code/ui/render/responsive.py +75 -0
- aria_code/ui/render/team.py +367 -0
- aria_code/ui/robot.py +239 -0
- aria_code/ui/startup_dashboard.py +110 -0
- aria_code/video_analysis.py +147 -0
- aria_code/video_editor.py +518 -0
- aria_code/video_workflow/__init__.py +8 -0
- aria_code/video_workflow/__main__.py +61 -0
- aria_code/video_workflow/engines/__init__.py +18 -0
- aria_code/video_workflow/engines/base.py +69 -0
- aria_code/video_workflow/engines/custom_model.py +204 -0
- aria_code/video_workflow/engines/google_veo.py +94 -0
- aria_code/video_workflow/engines/local_engine.py +71 -0
- aria_code/video_workflow/engines/registry.py +98 -0
- aria_code/video_workflow/google_models.py +278 -0
- aria_code/video_workflow/music/__init__.py +5 -0
- aria_code/video_workflow/music/foley_service.py +132 -0
- aria_code/video_workflow/music/service.py +212 -0
- aria_code/video_workflow/pipeline.py +620 -0
- aria_code/video_workflow/plan.py +202 -0
- aria_code/video_workflow/session.py +297 -0
- aria_code/workspace/__init__.py +6 -0
- aria_code/workspace/files.py +219 -0
- aria_code/workspace/verify.py +167 -0
- aria_code/workspace_changes.py +199 -0
- aria_code/workspace_service.py +196 -0
- aria_code/workspace_tools.py +150 -0
- aria_code-0.167.0.dist-info/METADATA +330 -0
- aria_code-0.167.0.dist-info/RECORD +601 -0
- aria_code-0.167.0.dist-info/WHEEL +5 -0
- aria_code-0.167.0.dist-info/entry_points.txt +5 -0
- aria_code-0.167.0.dist-info/licenses/LICENSE +201 -0
- aria_code-0.167.0.dist-info/licenses/NOTICE +49 -0
- aria_code-0.167.0.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"""The models each cloud provider offers, read from the provider itself.
|
|
2
|
+
|
|
3
|
+
`/model` used to list Aria's own catalogue and, for a cloud provider, only the
|
|
4
|
+
model already selected: a hand-kept list is out of date within weeks (Google
|
|
5
|
+
retired Gemini 3.5 Flash a month after this catalogue called it stable). So for
|
|
6
|
+
every provider with a key, the model list endpoint is asked what it serves now.
|
|
7
|
+
|
|
8
|
+
The answer is cached for a few hours. An expired cache is shown straight away
|
|
9
|
+
and refreshed behind it, so opening the picker never waits on a slow provider;
|
|
10
|
+
only a provider with no cache at all is waited for, and only for a few seconds.
|
|
11
|
+
Offline, or when a provider is down, the cache (however old) is used, and a
|
|
12
|
+
provider with neither simply has no section.
|
|
13
|
+
|
|
14
|
+
Keys are used for the request and never written to the cache.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import json
|
|
20
|
+
import os
|
|
21
|
+
import re
|
|
22
|
+
import threading
|
|
23
|
+
import time
|
|
24
|
+
import urllib.error
|
|
25
|
+
import urllib.request
|
|
26
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
27
|
+
from pathlib import Path
|
|
28
|
+
from typing import Callable, Dict, List, Optional
|
|
29
|
+
|
|
30
|
+
CACHE_TTL_S = 6 * 3600
|
|
31
|
+
FETCH_TIMEOUT_S = 4.0
|
|
32
|
+
MAX_PER_PROVIDER = 60
|
|
33
|
+
|
|
34
|
+
#: provider -> (heading, kind, models URL). The URL for Google carries the key
|
|
35
|
+
#: as a header, not in the query string.
|
|
36
|
+
PROVIDERS: Dict[str, tuple] = {
|
|
37
|
+
"google": ("Google Gemini", "google", "https://generativelanguage.googleapis.com/v1beta/models?pageSize=200"),
|
|
38
|
+
"openai": ("OpenAI", "openai", "https://api.openai.com/v1/models"),
|
|
39
|
+
"anthropic": ("Anthropic Claude", "anthropic", "https://api.anthropic.com/v1/models?limit=100"),
|
|
40
|
+
"deepseek": ("DeepSeek", "openai", "https://api.deepseek.com/models"),
|
|
41
|
+
"groq": ("Groq", "openai", "https://api.groq.com/openai/v1/models"),
|
|
42
|
+
"together": ("Together AI", "openai", "https://api.together.xyz/v1/models"),
|
|
43
|
+
"dashscope": ("Alibaba DashScope", "openai", "https://dashscope.aliyuncs.com/compatible-mode/v1/models"),
|
|
44
|
+
"siliconflow": ("SiliconFlow", "openai", "https://api.siliconflow.cn/v1/models"),
|
|
45
|
+
"moonshot": ("Moonshot", "openai", "https://api.moonshot.cn/v1/models"),
|
|
46
|
+
"zhipu": ("Zhipu GLM", "openai", "https://open.bigmodel.cn/api/paas/v4/models"),
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
#: Not chat models: embeddings, speech, images, video, music, moderation, live audio.
|
|
50
|
+
_NOT_CHAT = re.compile(
|
|
51
|
+
r"embed|whisper|tts|transcribe|speech|audio|realtime|dall-e|image|imagen|veo|lyria|"
|
|
52
|
+
r"omni-|nano-banana|moderation|rerank|guard|-live|robotics|computer-use|sora|deep-research|"
|
|
53
|
+
r"search-preview|davinci|babbage|aqa|text-bison|vision-preview",
|
|
54
|
+
re.IGNORECASE,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
_refreshing: set = set()
|
|
58
|
+
_lock = threading.Lock()
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def cache_dir() -> Path:
|
|
62
|
+
from aria_code.packages.aria_core.paths import aria_home
|
|
63
|
+
|
|
64
|
+
return Path(aria_home()) / "cloud_models"
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _http_json(url: str, headers: Dict[str, str], timeout: float) -> object:
|
|
68
|
+
request = urllib.request.Request(url, headers={"User-Agent": "aria-code", "Accept": "application/json", **headers})
|
|
69
|
+
with urllib.request.urlopen(request, timeout=timeout) as response: # noqa: S310 - fixed https endpoints above
|
|
70
|
+
return json.load(response)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _natural_key(text: str):
|
|
74
|
+
"""Sort key where 3.10 follows 3.9 and a higher version sorts later."""
|
|
75
|
+
return [int(part) if part.isdigit() else part for part in re.split(r"(\d+)", text.lower())]
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _ctx_label(tokens) -> str:
|
|
79
|
+
try:
|
|
80
|
+
n = int(tokens)
|
|
81
|
+
except (TypeError, ValueError):
|
|
82
|
+
return ""
|
|
83
|
+
if n >= 900_000:
|
|
84
|
+
return f"ctx {round(n / 1_048_576)}M"
|
|
85
|
+
return f"ctx {n // 1000}K" if n >= 1000 else ""
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def _date(epoch: int) -> str:
|
|
89
|
+
import datetime
|
|
90
|
+
|
|
91
|
+
try:
|
|
92
|
+
return datetime.date.fromtimestamp(epoch).isoformat()
|
|
93
|
+
except (OverflowError, OSError, ValueError):
|
|
94
|
+
return ""
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def _is_shut_down(value: object, today: Optional[float] = None) -> bool:
|
|
98
|
+
"""True when a provider's `shutdown_date` (epoch seconds or ISO date) has passed."""
|
|
99
|
+
now = time.time() if today is None else today
|
|
100
|
+
if isinstance(value, (int, float)) and value > 0:
|
|
101
|
+
return float(value) < now
|
|
102
|
+
if isinstance(value, str) and value:
|
|
103
|
+
import datetime
|
|
104
|
+
|
|
105
|
+
try:
|
|
106
|
+
return datetime.date.fromisoformat(value[:10]) < datetime.date.fromtimestamp(now)
|
|
107
|
+
except ValueError:
|
|
108
|
+
return False
|
|
109
|
+
return False
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def parse(provider: str, payload: object) -> List[dict]:
|
|
113
|
+
"""The chat models in a provider's list response, newest first: [{id, name, detail}]."""
|
|
114
|
+
kind = PROVIDERS[provider][1]
|
|
115
|
+
rows: List[dict] = []
|
|
116
|
+
if kind == "google":
|
|
117
|
+
for item in (payload or {}).get("models", []) if isinstance(payload, dict) else []:
|
|
118
|
+
methods = item.get("supportedGenerationMethods") or []
|
|
119
|
+
ident = str(item.get("name", "")).removeprefix("models/")
|
|
120
|
+
if "generateContent" not in methods or not ident or _NOT_CHAT.search(ident):
|
|
121
|
+
continue
|
|
122
|
+
detail = " · ".join(x for x in (_ctx_label(item.get("inputTokenLimit")),) if x)
|
|
123
|
+
rows.append({"id": ident, "name": item.get("displayName") or ident, "detail": detail})
|
|
124
|
+
elif kind == "anthropic":
|
|
125
|
+
for item in (payload or {}).get("data", []) if isinstance(payload, dict) else []:
|
|
126
|
+
ident = str(item.get("id", ""))
|
|
127
|
+
if ident:
|
|
128
|
+
rows.append({"id": ident, "name": item.get("display_name") or ident, "detail": ""})
|
|
129
|
+
else:
|
|
130
|
+
items = payload.get("data", []) if isinstance(payload, dict) else payload
|
|
131
|
+
for item in items if isinstance(items, list) else []:
|
|
132
|
+
ident = str(item.get("id", "")) if isinstance(item, dict) else ""
|
|
133
|
+
if not ident or _NOT_CHAT.search(ident) or _is_shut_down(item.get("shutdown_date")):
|
|
134
|
+
continue
|
|
135
|
+
created = item.get("created")
|
|
136
|
+
created = int(created) if isinstance(created, (int, float)) and created > 0 else 0
|
|
137
|
+
detail = _date(created) if created else ""
|
|
138
|
+
rows.append({"id": ident, "name": ident, "detail": detail, "created": created})
|
|
139
|
+
# Newest first by the provider's own creation date where it gives one (OpenAI does);
|
|
140
|
+
# otherwise by version number in the id, which is only a rough proxy.
|
|
141
|
+
rows.sort(key=lambda r: (r.get("created", 0), _natural_key(r["id"])), reverse=True)
|
|
142
|
+
return [{k: v for k, v in r.items() if k != "created"} for r in rows[:MAX_PER_PROVIDER]]
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def fetch(provider: str, key: str, timeout: float = FETCH_TIMEOUT_S) -> Optional[List[dict]]:
|
|
146
|
+
"""Ask the provider; None when it cannot be reached or refuses the key."""
|
|
147
|
+
_heading, kind, url = PROVIDERS[provider]
|
|
148
|
+
if kind == "google":
|
|
149
|
+
headers = {"x-goog-api-key": key}
|
|
150
|
+
elif kind == "anthropic":
|
|
151
|
+
headers = {"x-api-key": key, "anthropic-version": "2023-06-01"}
|
|
152
|
+
else:
|
|
153
|
+
headers = {"Authorization": f"Bearer {key}"}
|
|
154
|
+
try:
|
|
155
|
+
return parse(provider, _http_json(url, headers, timeout))
|
|
156
|
+
except (OSError, urllib.error.URLError, ValueError):
|
|
157
|
+
return None
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def _read_cache(provider: str) -> Optional[dict]:
|
|
161
|
+
try:
|
|
162
|
+
data = json.loads((cache_dir() / f"{provider}.json").read_text(encoding="utf-8"))
|
|
163
|
+
if isinstance(data.get("models"), list):
|
|
164
|
+
return data
|
|
165
|
+
except (OSError, ValueError):
|
|
166
|
+
pass
|
|
167
|
+
return None
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def _write_cache(provider: str, models: List[dict], now: float) -> None:
|
|
171
|
+
try:
|
|
172
|
+
directory = cache_dir()
|
|
173
|
+
directory.mkdir(parents=True, exist_ok=True)
|
|
174
|
+
(directory / f"{provider}.json").write_text(json.dumps({"at": now, "models": models}), encoding="utf-8")
|
|
175
|
+
except OSError:
|
|
176
|
+
pass
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def _refresh_later(provider: str, key: str) -> None:
|
|
180
|
+
with _lock:
|
|
181
|
+
if provider in _refreshing:
|
|
182
|
+
return
|
|
183
|
+
_refreshing.add(provider)
|
|
184
|
+
|
|
185
|
+
def run() -> None:
|
|
186
|
+
try:
|
|
187
|
+
models = fetch(provider, key)
|
|
188
|
+
if models:
|
|
189
|
+
_write_cache(provider, models, time.time())
|
|
190
|
+
finally:
|
|
191
|
+
with _lock:
|
|
192
|
+
_refreshing.discard(provider)
|
|
193
|
+
|
|
194
|
+
threading.Thread(target=run, daemon=True, name=f"aria-models-{provider}").start()
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def models_for(provider: str, key: str, *, offline: bool = False, now: Optional[float] = None) -> List[dict]:
|
|
198
|
+
"""The provider's models: fresh cache, else stale cache (refreshed behind), else a live request."""
|
|
199
|
+
stamp = time.time() if now is None else now
|
|
200
|
+
cached = _read_cache(provider)
|
|
201
|
+
if cached and (offline or stamp - float(cached.get("at", 0)) < CACHE_TTL_S):
|
|
202
|
+
return cached["models"]
|
|
203
|
+
if cached:
|
|
204
|
+
_refresh_later(provider, key)
|
|
205
|
+
return cached["models"]
|
|
206
|
+
if offline:
|
|
207
|
+
return []
|
|
208
|
+
models = fetch(provider, key)
|
|
209
|
+
if models:
|
|
210
|
+
_write_cache(provider, models, stamp)
|
|
211
|
+
return models or []
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def collect(key_for: Callable[[str], str], *, offline: Optional[bool] = None) -> Dict[str, List[dict]]:
|
|
215
|
+
"""Models for every provider that has a key, looked up in parallel: {provider: [models]}."""
|
|
216
|
+
if offline is None:
|
|
217
|
+
offline = os.environ.get("ARIA_OFFLINE", "").lower() in {"1", "true", "yes", "on"}
|
|
218
|
+
keyed = {p: key for p in PROVIDERS if (key := key_for(p))}
|
|
219
|
+
if not keyed:
|
|
220
|
+
return {}
|
|
221
|
+
with ThreadPoolExecutor(max_workers=min(8, len(keyed))) as pool:
|
|
222
|
+
futures = {p: pool.submit(models_for, p, key, offline=offline) for p, key in keyed.items()}
|
|
223
|
+
out = {}
|
|
224
|
+
for provider, future in futures.items():
|
|
225
|
+
try:
|
|
226
|
+
models = future.result(timeout=FETCH_TIMEOUT_S + 2)
|
|
227
|
+
except Exception:
|
|
228
|
+
models = []
|
|
229
|
+
if models:
|
|
230
|
+
out[provider] = models
|
|
231
|
+
return out
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"""Path helpers for generated code and strategy artifacts."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def resolve_user_code_path(
|
|
9
|
+
description: str,
|
|
10
|
+
save_path: str | None = None,
|
|
11
|
+
*,
|
|
12
|
+
user_generated_dir: Path,
|
|
13
|
+
) -> Path:
|
|
14
|
+
"""Resolve a code output path into the user's generated workspace."""
|
|
15
|
+
from artifacts import slugify_topic
|
|
16
|
+
|
|
17
|
+
if save_path:
|
|
18
|
+
p = Path(save_path).expanduser()
|
|
19
|
+
if not p.is_absolute():
|
|
20
|
+
p = user_generated_dir / p
|
|
21
|
+
if p.suffix != ".py":
|
|
22
|
+
p = p.with_suffix(".py")
|
|
23
|
+
return p
|
|
24
|
+
|
|
25
|
+
desc_slug = slugify_topic(description, fallback="generated_code")
|
|
26
|
+
if any(k in description.lower() for k in ("backtest", "strategy", "quant", "portfolio")):
|
|
27
|
+
desc_slug = f"strategy_{desc_slug}"
|
|
28
|
+
return user_generated_dir / f"{desc_slug}.py"
|
|
29
|
+
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""CLI command adapters, imported only when used.
|
|
2
|
+
|
|
3
|
+
Importing a lightweight command such as /architecture must not initialize the
|
|
4
|
+
finance stack (pandas/numpy) through this package's __init__.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from importlib import import_module
|
|
8
|
+
|
|
9
|
+
__all__ = [
|
|
10
|
+
"BrokerCommandsMixin",
|
|
11
|
+
"BacktestCommandsMixin",
|
|
12
|
+
"WorkspaceCommandsMixin",
|
|
13
|
+
"ModelCommandsMixin",
|
|
14
|
+
"MarketCommandsMixin",
|
|
15
|
+
"PortfolioCommandsMixin",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
_MIXIN_MODULES = {
|
|
19
|
+
"BrokerCommandsMixin": "broker_cmds",
|
|
20
|
+
"BacktestCommandsMixin": "backtest_cmds",
|
|
21
|
+
"WorkspaceCommandsMixin": "workspace_cmds",
|
|
22
|
+
"ModelCommandsMixin": "model_cmds",
|
|
23
|
+
"MarketCommandsMixin": "market_cmds",
|
|
24
|
+
"PortfolioCommandsMixin": "portfolio_cmds",
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def __getattr__(name: str):
|
|
29
|
+
module_name = _MIXIN_MODULES.get(name)
|
|
30
|
+
if module_name is None:
|
|
31
|
+
raise AttributeError(name)
|
|
32
|
+
value = getattr(import_module(f".{module_name}", __name__), name)
|
|
33
|
+
globals()[name] = value
|
|
34
|
+
return value
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"""Business-workflow renderers, taking the context instead of aria_cli's globals.
|
|
2
|
+
|
|
3
|
+
These three drew through aria_cli's module-level ``console`` and ``HAS_RICH``,
|
|
4
|
+
so business_workflow_cmds reached into a 7000-line module for three functions
|
|
5
|
+
totalling 56 lines. The state they need is on ``self.context`` already — the
|
|
6
|
+
same move print_error made in _ui.py.
|
|
7
|
+
|
|
8
|
+
Names lost their leading underscore on the way over: they are this module's
|
|
9
|
+
public surface now, not aria_cli privates borrowed by bare name.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
from typing import Any
|
|
15
|
+
|
|
16
|
+
__all__ = ["p", "print_realty_result", "print_risk_scan"]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def p(context, msg: str, style: str = ""):
|
|
20
|
+
"""快速打印辅助(rich 可用时带样式)"""
|
|
21
|
+
if context.has_rich:
|
|
22
|
+
tag = {"dim": "dim", "error": "red", "ok": "green"}.get(style, style)
|
|
23
|
+
context.console.print(f"[{tag}]{msg}[/{tag}]" if tag else msg)
|
|
24
|
+
else:
|
|
25
|
+
print(msg)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def print_realty_result(context, result, agent_name: str):
|
|
29
|
+
"""格式化打印 realty Agent 结果(地产健康度词汇,见 agents/signal_scheme.py::REALTY_SCHEME)"""
|
|
30
|
+
_SIGNAL_LABELS = {
|
|
31
|
+
"GOOD": "[green]正常/推荐[/green]",
|
|
32
|
+
"WATCH": "[yellow]需观察[/yellow]",
|
|
33
|
+
"CONCERN": "[red]警示[/red]",
|
|
34
|
+
"SEVERE": "[bold red]极高风险[/bold red]",
|
|
35
|
+
}
|
|
36
|
+
if not context.has_rich:
|
|
37
|
+
print(f"\n[{agent_name}] Signal: {result.signal} Confidence: {result.confidence:.0%}")
|
|
38
|
+
print(result.analysis)
|
|
39
|
+
return
|
|
40
|
+
|
|
41
|
+
context.console.print()
|
|
42
|
+
context.console.print(f" [bold]{agent_name.upper().replace('_',' ')}[/bold]"
|
|
43
|
+
f" {_SIGNAL_LABELS.get(result.signal, result.signal)}"
|
|
44
|
+
f" [dim]置信度 {result.confidence:.0%}[/dim]")
|
|
45
|
+
context.console.print()
|
|
46
|
+
for pt in (result.key_points or []):
|
|
47
|
+
context.console.print(f" • {pt}")
|
|
48
|
+
if result.analysis:
|
|
49
|
+
context.console.print()
|
|
50
|
+
text = result.analysis[:1200] + ("…" if len(result.analysis) > 1200 else "")
|
|
51
|
+
context.console.print(f" [dim]{text}[/dim]")
|
|
52
|
+
context.console.print()
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def print_risk_scan(context, data: dict):
|
|
56
|
+
"""格式化打印风险扫描结果"""
|
|
57
|
+
if not context.has_rich:
|
|
58
|
+
print(f"Risk scan: {data.get('overall_level','?')} "
|
|
59
|
+
f"(score={data.get('risk_score',0)})")
|
|
60
|
+
for alert in data.get("alerts", []):
|
|
61
|
+
print(f" [{alert['level']}] {alert['desc']}")
|
|
62
|
+
return
|
|
63
|
+
|
|
64
|
+
level = data.get("overall_level", "未知")
|
|
65
|
+
score = data.get("risk_score", 0)
|
|
66
|
+
color = {"低": "green", "中": "yellow", "高": "red", "极高": "bold red"}.get(level, "white")
|
|
67
|
+
context.console.print()
|
|
68
|
+
context.console.print(f" 风险等级: [{color}]{level}[/{color}] "
|
|
69
|
+
f"风险分值: {score} "
|
|
70
|
+
f"预警项: {data.get('alert_count',0)}")
|
|
71
|
+
context.console.print()
|
|
72
|
+
for alert in data.get("alerts", []):
|
|
73
|
+
ac = {"低": "dim", "中": "yellow", "高": "red", "极高": "bold red"}.get(
|
|
74
|
+
alert["level"], "white")
|
|
75
|
+
context.console.print(f" [{ac}][{alert['level']}][/{ac}] {alert['desc']}")
|
|
76
|
+
if data.get("suggestion"):
|
|
77
|
+
context.console.print(f"\n [dim]建议: {data['suggestion']}[/dim]")
|
|
78
|
+
context.console.print()
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""Rendering helpers for the command mixins.
|
|
2
|
+
|
|
3
|
+
Two different things used to come from aria_cli's module globals, and only one
|
|
4
|
+
of them was ever state:
|
|
5
|
+
|
|
6
|
+
* ``console`` / ``HAS_RICH`` are per-session state. They belong on
|
|
7
|
+
``self.context`` — which 40f23c8 started and this package is finishing.
|
|
8
|
+
* ``rich_box`` and ``Panel`` are not state at all. They are ``rich.box`` and
|
|
9
|
+
``rich.panel.Panel``, sitting behind aria_cli's guarded import purely because
|
|
10
|
+
that is where the try/except happened to live. Reaching into a 7000-line
|
|
11
|
+
module for them bought nothing, so they are resolved here instead.
|
|
12
|
+
|
|
13
|
+
``print_error`` takes the context explicitly rather than reading a global, so a
|
|
14
|
+
mixin can render without knowing anything about aria_cli.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from contextlib import contextmanager
|
|
20
|
+
from typing import Any
|
|
21
|
+
|
|
22
|
+
__all__ = ["Panel", "Syntax", "null_ctx", "print_error", "rich_box", "has_rich"]
|
|
23
|
+
|
|
24
|
+
try: # Optional: the CLI degrades to plain print when rich is absent.
|
|
25
|
+
from rich import box as rich_box
|
|
26
|
+
from rich.panel import Panel
|
|
27
|
+
from rich.syntax import Syntax
|
|
28
|
+
except ImportError: # pragma: no cover - exercised only without rich installed
|
|
29
|
+
rich_box = None # type: ignore[assignment]
|
|
30
|
+
Panel = None # type: ignore[assignment]
|
|
31
|
+
Syntax = None # type: ignore[assignment]
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@contextmanager
|
|
35
|
+
def null_ctx():
|
|
36
|
+
"""No-op context manager, for `with x if cond else null_ctx():`.
|
|
37
|
+
|
|
38
|
+
Three lines with no dependencies, defined in aria_cli only because that is
|
|
39
|
+
where the first caller was. Note the *theme* these renderers use
|
|
40
|
+
(_SYNTAX_THEME) is deliberately not here: it is read from user config and
|
|
41
|
+
changes with /theme, so it is session state and belongs on the context.
|
|
42
|
+
"""
|
|
43
|
+
yield
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def has_rich() -> bool:
|
|
47
|
+
"""Whether rich is importable.
|
|
48
|
+
|
|
49
|
+
For module-level helpers that have no ``self`` and so cannot read
|
|
50
|
+
``self.context.has_rich``. Anything with a context should use that instead —
|
|
51
|
+
a session can be configured without a console even where rich is installed.
|
|
52
|
+
"""
|
|
53
|
+
return rich_box is not None
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def print_error(context: Any, msg: str, hint: str = "") -> None:
|
|
57
|
+
"""Render an error through the context's console.
|
|
58
|
+
|
|
59
|
+
``context`` is an AriaContext, or anything exposing ``console`` and
|
|
60
|
+
``has_rich``; the renderer already falls back to plain print when console is
|
|
61
|
+
None, so a context built without one still works.
|
|
62
|
+
"""
|
|
63
|
+
from aria_code.ui.render.output import print_error as _render
|
|
64
|
+
|
|
65
|
+
_render(
|
|
66
|
+
msg,
|
|
67
|
+
hint,
|
|
68
|
+
console=getattr(context, "console", None),
|
|
69
|
+
has_rich=bool(getattr(context, "has_rich", False)),
|
|
70
|
+
rich_box=rich_box,
|
|
71
|
+
)
|