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,73 @@
|
|
|
1
|
+
"""Shared config path resolution for Aria CLI components."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import os
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import Optional
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass(frozen=True)
|
|
11
|
+
class AriaConfigPaths:
|
|
12
|
+
config_dir: Path
|
|
13
|
+
config_file: Path
|
|
14
|
+
history_file: Path
|
|
15
|
+
sessions_dir: Path
|
|
16
|
+
providers_file: Path
|
|
17
|
+
hooks_file: Path
|
|
18
|
+
user_output_root: Path
|
|
19
|
+
user_generated_dir: Path
|
|
20
|
+
user_projects_dir: Path
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def resolve_config_dir() -> Path:
|
|
24
|
+
"""Resolve the user config directory with stable precedence.
|
|
25
|
+
|
|
26
|
+
实现已收敛到 packages/aria_core/paths.aria_home():同一套优先级此前只有
|
|
27
|
+
配置文件走,另外 38 个文件直接写死 Path.home()/".arthera" 绕过了它,导致
|
|
28
|
+
新用户的 config 落在 ~/.aria-code 而凭证落在 ~/.arthera。这里保留函数名做
|
|
29
|
+
兼容,逻辑不再各自维护一份。
|
|
30
|
+
"""
|
|
31
|
+
from packages.aria_core.paths import aria_home
|
|
32
|
+
|
|
33
|
+
return aria_home()
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def resolve_user_output_root() -> Path:
|
|
37
|
+
"""Resolve the per-user output root for generated code and user artifacts."""
|
|
38
|
+
configured = os.getenv("ARIA_USER_OUTPUT_ROOT")
|
|
39
|
+
if configured:
|
|
40
|
+
return Path(configured).expanduser()
|
|
41
|
+
return Path.home() / "Documents" / "Aria Code"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def resolve_paths(config_dir: Optional[Path] = None) -> AriaConfigPaths:
|
|
45
|
+
root = Path(config_dir).expanduser() if config_dir else resolve_config_dir()
|
|
46
|
+
user_output_root = resolve_user_output_root()
|
|
47
|
+
return AriaConfigPaths(
|
|
48
|
+
config_dir=root,
|
|
49
|
+
config_file=root / "config.json",
|
|
50
|
+
history_file=root / "history",
|
|
51
|
+
sessions_dir=root / "sessions",
|
|
52
|
+
providers_file=root / "providers.json",
|
|
53
|
+
hooks_file=root / "hooks.json",
|
|
54
|
+
user_output_root=user_output_root,
|
|
55
|
+
user_generated_dir=user_output_root / "generated",
|
|
56
|
+
user_projects_dir=user_output_root / "projects",
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def config_snapshot(config_dir: Optional[Path] = None) -> dict[str, str]:
|
|
61
|
+
"""Return a JSON-serializable snapshot of resolved config paths."""
|
|
62
|
+
paths = resolve_paths(config_dir)
|
|
63
|
+
return {
|
|
64
|
+
"config_dir": str(paths.config_dir),
|
|
65
|
+
"config_file": str(paths.config_file),
|
|
66
|
+
"history_file": str(paths.history_file),
|
|
67
|
+
"sessions_dir": str(paths.sessions_dir),
|
|
68
|
+
"providers_file": str(paths.providers_file),
|
|
69
|
+
"hooks_file": str(paths.hooks_file),
|
|
70
|
+
"user_output_root": str(paths.user_output_root),
|
|
71
|
+
"user_generated_dir": str(paths.user_generated_dir),
|
|
72
|
+
"user_projects_dir": str(paths.user_projects_dir),
|
|
73
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"""Persistent CLI configuration loading and saving.
|
|
2
|
+
|
|
3
|
+
CLI adapter for :class:`packages.aria_services.settings.SettingsService` —
|
|
4
|
+
the service owns the merge/normalize/persist mechanics; this module supplies
|
|
5
|
+
the CLI-specific hooks (provider-name normalization, i18n detection, model
|
|
6
|
+
auto-selection) and keeps the historical ``load_cli_config``/``save_cli_config``
|
|
7
|
+
API so existing call sites are untouched.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from collections.abc import Callable
|
|
13
|
+
|
|
14
|
+
from aria_code.apps.cli.config_paths import AriaConfigPaths
|
|
15
|
+
from aria_code.packages.aria_services.settings import ( # noqa: F401 (re-exported)
|
|
16
|
+
STALE_ARIA_MODEL_PREFIXES,
|
|
17
|
+
SettingsService,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _normalize_provider(name: str) -> str:
|
|
22
|
+
from apps.cli.providers.chat_routing import normalize_provider_name
|
|
23
|
+
return normalize_provider_name(name)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _detect_lang() -> str:
|
|
27
|
+
from apps.cli.i18n import detect_system_lang
|
|
28
|
+
return detect_system_lang()
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def build_settings_service(
|
|
32
|
+
paths: AriaConfigPaths,
|
|
33
|
+
defaults: dict,
|
|
34
|
+
*,
|
|
35
|
+
sync_policy: Callable[[dict], None] | None = None,
|
|
36
|
+
) -> SettingsService:
|
|
37
|
+
"""Construct the SettingsService with the CLI's environment hooks."""
|
|
38
|
+
return SettingsService(
|
|
39
|
+
config_dir=paths.config_dir,
|
|
40
|
+
config_file=paths.config_file,
|
|
41
|
+
sessions_dir=paths.sessions_dir,
|
|
42
|
+
defaults=defaults,
|
|
43
|
+
normalize_provider=_normalize_provider,
|
|
44
|
+
detect_lang=_detect_lang,
|
|
45
|
+
on_loaded=sync_policy,
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def load_cli_config(
|
|
50
|
+
paths: AriaConfigPaths,
|
|
51
|
+
defaults: dict,
|
|
52
|
+
*,
|
|
53
|
+
sync_policy: Callable[[dict], None] | None = None,
|
|
54
|
+
) -> dict:
|
|
55
|
+
"""Load config.json, merge with defaults, then apply the project's .ariarc.
|
|
56
|
+
|
|
57
|
+
The i18n/chat_routing imports below are bare on purpose: the tests
|
|
58
|
+
patch those modules, and the packaged root is a different module
|
|
59
|
+
object, so the packaged form left detect_system_lang unpatched.
|
|
60
|
+
|
|
61
|
+
The .ariarc overlay goes last so a repo that pins a model gets it for
|
|
62
|
+
everyone who opens it, without each developer editing their global config.
|
|
63
|
+
It is best-effort: a malformed project file must not stop the CLI from
|
|
64
|
+
starting, because the user would then have no way to run the tool that
|
|
65
|
+
would fix it.
|
|
66
|
+
"""
|
|
67
|
+
service = build_settings_service(paths, defaults, sync_policy=sync_policy)
|
|
68
|
+
config = service.load()
|
|
69
|
+
# The old localhost default is replaced once; see endpoint_migration.
|
|
70
|
+
from aria_code.apps.cli.endpoint_migration import migrate_config as migrate_endpoint
|
|
71
|
+
|
|
72
|
+
moved = migrate_endpoint(config)
|
|
73
|
+
if moved:
|
|
74
|
+
try:
|
|
75
|
+
service.save(config)
|
|
76
|
+
except Exception:
|
|
77
|
+
pass
|
|
78
|
+
_announce_endpoint(moved, config)
|
|
79
|
+
# A model Google has retired fails on every request. The user's own saved
|
|
80
|
+
# choice is replaced once and written back; see model_retirement.
|
|
81
|
+
from aria_code.apps.cli.model_retirement import migrate_config
|
|
82
|
+
|
|
83
|
+
saved = migrate_config(config)
|
|
84
|
+
if saved:
|
|
85
|
+
try:
|
|
86
|
+
service.save(config)
|
|
87
|
+
except Exception:
|
|
88
|
+
pass
|
|
89
|
+
_announce(saved, config, pinned=False)
|
|
90
|
+
try:
|
|
91
|
+
from aria_code.ariarc import apply_to_config
|
|
92
|
+
|
|
93
|
+
apply_to_config(config)
|
|
94
|
+
except Exception:
|
|
95
|
+
pass
|
|
96
|
+
# A project's .ariarc is the user's file: replace in memory, say so, never rewrite it.
|
|
97
|
+
pinned = migrate_config(config)
|
|
98
|
+
if pinned:
|
|
99
|
+
_announce(pinned, config, pinned=True)
|
|
100
|
+
# Legacy callers read ollama_url. Resolve one effective per-user endpoint
|
|
101
|
+
# without persisting a process environment override back to the user's file.
|
|
102
|
+
from aria_code.providers.ollama_models import ollama_base_url
|
|
103
|
+
try:
|
|
104
|
+
config["ollama_url"] = ollama_base_url(config)
|
|
105
|
+
except ValueError:
|
|
106
|
+
pass # Selection/inference reports an invalid Ollama address explicitly.
|
|
107
|
+
return config
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
_ANNOUNCED: set[tuple[str, str]] = set()
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def _announce_endpoint(changes, config: dict) -> None:
|
|
114
|
+
"""Say once per process that the old localhost default was replaced."""
|
|
115
|
+
import sys
|
|
116
|
+
|
|
117
|
+
zh = str(config.get("ui_lang", "")).lower().startswith("zh")
|
|
118
|
+
for _key, old, new in changes:
|
|
119
|
+
if (old, new) in _ANNOUNCED:
|
|
120
|
+
continue
|
|
121
|
+
_ANNOUNCED.add((old, new))
|
|
122
|
+
if zh:
|
|
123
|
+
msg = (f"ℹ 服务器地址 {old} 是旧版默认值,已改为 {new}。"
|
|
124
|
+
"如需使用本机后端,请设置环境变量 ARTHERA_API_URL,或在配置里加 api_url_pinned: true。")
|
|
125
|
+
else:
|
|
126
|
+
msg = (f"ℹ The server address {old} was the old default and is now {new}. "
|
|
127
|
+
"For a local backend set ARTHERA_API_URL, or add api_url_pinned: true to the config.")
|
|
128
|
+
try:
|
|
129
|
+
print(msg, file=sys.stderr)
|
|
130
|
+
except Exception:
|
|
131
|
+
pass
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _announce(changes, config: dict, *, pinned: bool) -> None:
|
|
135
|
+
"""One line on stderr per retired model, once per process."""
|
|
136
|
+
import sys
|
|
137
|
+
|
|
138
|
+
zh = str(config.get("ui_lang", "")).lower().startswith("zh")
|
|
139
|
+
for _key, old, new in changes:
|
|
140
|
+
if (old, new) in _ANNOUNCED:
|
|
141
|
+
continue
|
|
142
|
+
_ANNOUNCED.add((old, new))
|
|
143
|
+
if zh:
|
|
144
|
+
where = "项目 .ariarc 里固定的" if pinned else "你设置的"
|
|
145
|
+
tail = ",请修改 .ariarc 里的 model" if pinned else "。可以用 /model 换成其他模型"
|
|
146
|
+
msg = f"ℹ {where}模型 {old} 已被 Google 停用,本次改用 {new}{tail}。"
|
|
147
|
+
else:
|
|
148
|
+
where = "The model pinned in this project's .ariarc" if pinned else "Your model"
|
|
149
|
+
tail = "; update the model in .ariarc" if pinned else "; use /model to pick another"
|
|
150
|
+
msg = f"ℹ {where}, {old}, has been retired by Google. Using {new}{tail}."
|
|
151
|
+
try:
|
|
152
|
+
print(msg, file=sys.stderr)
|
|
153
|
+
except Exception:
|
|
154
|
+
pass
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def save_cli_config(paths: AriaConfigPaths, cfg: dict) -> None:
|
|
158
|
+
build_settings_service(paths, {}).save(cfg)
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
from typing import Dict
|
|
2
|
+
|
|
3
|
+
_PROVIDER_KEY_MAP: Dict[str, str] = {
|
|
4
|
+
"deepseek": "DEEPSEEK_API_KEY",
|
|
5
|
+
"openai": "OPENAI_API_KEY",
|
|
6
|
+
"anthropic": "ANTHROPIC_API_KEY",
|
|
7
|
+
"claude": "ANTHROPIC_API_KEY",
|
|
8
|
+
"groq": "GROQ_API_KEY",
|
|
9
|
+
"together": "TOGETHER_API_KEY",
|
|
10
|
+
"google": "GOOGLE_API_KEY",
|
|
11
|
+
"gemini": "GOOGLE_API_KEY",
|
|
12
|
+
"xai": "XAI_API_KEY",
|
|
13
|
+
"grok": "XAI_API_KEY",
|
|
14
|
+
"mistral": "MISTRAL_API_KEY",
|
|
15
|
+
"cohere": "COHERE_API_KEY",
|
|
16
|
+
"perplexity": "PERPLEXITY_API_KEY",
|
|
17
|
+
"dashscope": "DASHSCOPE_API_KEY",
|
|
18
|
+
"aliyun": "DASHSCOPE_API_KEY",
|
|
19
|
+
"siliconflow": "SILICONFLOW_API_KEY",
|
|
20
|
+
"moonshot": "MOONSHOT_API_KEY",
|
|
21
|
+
"zhipu": "ZHIPUAI_API_KEY",
|
|
22
|
+
"glm": "ZHIPUAI_API_KEY",
|
|
23
|
+
"baidu": "QIANFAN_ACCESS_KEY",
|
|
24
|
+
"ernie": "QIANFAN_ACCESS_KEY",
|
|
25
|
+
"qianfan": "QIANFAN_ACCESS_KEY",
|
|
26
|
+
"bytedance": "ARK_API_KEY",
|
|
27
|
+
"doubao": "ARK_API_KEY",
|
|
28
|
+
"ark": "ARK_API_KEY",
|
|
29
|
+
"minimax": "MINIMAX_API_KEY",
|
|
30
|
+
"stepfun": "STEPFUN_API_KEY",
|
|
31
|
+
"01ai": "ONEAI_API_KEY",
|
|
32
|
+
"yi": "ONEAI_API_KEY",
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
_DATA_KEY_MAP: Dict[str, str] = {
|
|
36
|
+
"finnhub": "FINNHUB_API_KEY",
|
|
37
|
+
"newsapi": "NEWS_API_KEY",
|
|
38
|
+
"brave": "BRAVE_SEARCH_API_KEY",
|
|
39
|
+
"tavily": "TAVILY_API_KEY",
|
|
40
|
+
"coingecko": "COINGECKO_API_KEY",
|
|
41
|
+
"alphavantage": "ALPHA_VANTAGE_API_KEY",
|
|
42
|
+
"polygon": "POLYGON_API_KEY",
|
|
43
|
+
"fmp": "FMP_API_KEY",
|
|
44
|
+
"twelvedata": "TWELVEDATA_API_KEY",
|
|
45
|
+
"figma": "FIGMA_API_KEY",
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
_DATA_SIGNUP_URLS: Dict[str, str] = {
|
|
49
|
+
"finnhub": "https://finnhub.io/register",
|
|
50
|
+
"newsapi": "https://newsapi.org/register",
|
|
51
|
+
"brave": "https://api.search.brave.com/app/keys",
|
|
52
|
+
"tavily": "https://app.tavily.com",
|
|
53
|
+
"coingecko": "https://www.coingecko.com/en/api",
|
|
54
|
+
"alphavantage": "https://www.alphavantage.co/support/#api-key",
|
|
55
|
+
"polygon": "https://polygon.io/signup",
|
|
56
|
+
"fmp": "https://financialmodelingprep.com/register",
|
|
57
|
+
"twelvedata": "https://twelvedata.com/register",
|
|
58
|
+
"figma": "https://www.figma.com/developers/api#access-tokens",
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
_LLM_SIGNUP_URLS: Dict[str, str] = {
|
|
62
|
+
"deepseek": "https://platform.deepseek.com/api_keys",
|
|
63
|
+
"openai": "https://platform.openai.com/api-keys",
|
|
64
|
+
"anthropic": "https://console.anthropic.com/settings/keys",
|
|
65
|
+
"claude": "https://console.anthropic.com/settings/keys",
|
|
66
|
+
"groq": "https://console.groq.com/keys",
|
|
67
|
+
"together": "https://api.together.ai/settings/api-keys",
|
|
68
|
+
"google": "https://aistudio.google.com/app/apikey",
|
|
69
|
+
"gemini": "https://aistudio.google.com/app/apikey",
|
|
70
|
+
"xai": "https://console.x.ai",
|
|
71
|
+
"grok": "https://console.x.ai",
|
|
72
|
+
"mistral": "https://console.mistral.ai/api-keys",
|
|
73
|
+
"cohere": "https://dashboard.cohere.com/api-keys",
|
|
74
|
+
"perplexity": "https://www.perplexity.ai/settings/api",
|
|
75
|
+
"dashscope": "https://dashscope.console.aliyun.com/apiKey",
|
|
76
|
+
"aliyun": "https://dashscope.console.aliyun.com/apiKey",
|
|
77
|
+
"siliconflow": "https://cloud.siliconflow.cn/account/ak",
|
|
78
|
+
"moonshot": "https://platform.moonshot.cn/console/api-keys",
|
|
79
|
+
"zhipu": "https://open.bigmodel.cn/usercenter/apikeys",
|
|
80
|
+
"baidu": "https://qianfan.cloud.baidu.com/user/accessToken",
|
|
81
|
+
"ernie": "https://qianfan.cloud.baidu.com/user/accessToken",
|
|
82
|
+
"bytedance": "https://ark.volcengine.com/api-key",
|
|
83
|
+
"doubao": "https://ark.volcengine.com/api-key",
|
|
84
|
+
"minimax": "https://platform.minimaxi.com/user-center/basic-information/interface-key",
|
|
85
|
+
"stepfun": "https://platform.stepfun.com/interface-key",
|
|
86
|
+
"01ai": "https://platform.lingyiwanwu.com/apikeys",
|
|
87
|
+
"yi": "https://platform.lingyiwanwu.com/apikeys",
|
|
88
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from dataclasses import dataclass, field
|
|
2
|
+
from typing import Any, Dict, Callable
|
|
3
|
+
|
|
4
|
+
@dataclass
|
|
5
|
+
class AriaContext:
|
|
6
|
+
"""
|
|
7
|
+
Unified context for Aria CLI commands.
|
|
8
|
+
This replaces the dynamic `__globals__` injection pattern.
|
|
9
|
+
Commands should accept this context to access console, workspace, and config.
|
|
10
|
+
"""
|
|
11
|
+
console: Any = None
|
|
12
|
+
workspace: Any = None
|
|
13
|
+
config: Dict[str, Any] = field(default_factory=dict)
|
|
14
|
+
has_rich: bool = False
|
|
15
|
+
|
|
16
|
+
# Callbacks for config
|
|
17
|
+
save_config_cb: Callable[[Dict[str, Any]], None] = None
|
|
18
|
+
load_config_cb: Callable[[], Dict[str, Any]] = None
|
|
19
|
+
|
|
20
|
+
def save_config(self, cfg: dict):
|
|
21
|
+
if self.save_config_cb:
|
|
22
|
+
self.save_config_cb(cfg)
|
|
23
|
+
|
|
24
|
+
def load_config(self) -> dict:
|
|
25
|
+
if self.load_config_cb:
|
|
26
|
+
return self.load_config_cb()
|
|
27
|
+
return {}
|
|
28
|
+
|
|
29
|
+
def __post_init__(self):
|
|
30
|
+
if self.config is None:
|
|
31
|
+
self.config = {}
|
|
32
|
+
if self.has_rich is False and self.console is not None:
|
|
33
|
+
self.has_rich = True
|
|
34
|
+
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""Recognize standalone social messages without guessing a task's intent.
|
|
2
|
+
|
|
3
|
+
Matching the whole message is intentional: ``hi, read README.md`` must keep
|
|
4
|
+
its tools, as must ``yes`` or ``continue`` in an ongoing coding conversation.
|
|
5
|
+
"""
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
import re
|
|
9
|
+
|
|
10
|
+
_SOCIAL = frozenset({
|
|
11
|
+
"hi", "hello", "hey", "hiya", "hi there", "hello there", "how are you", "how are you doing", "good morning", "good afternoon", "good evening",
|
|
12
|
+
"hi aria", "hello aria", "hey aria", "thanks", "thank you", "thanks aria",
|
|
13
|
+
"bye", "goodbye", "你好", "你好啊", "你好呀", "您好", "嗨", "哈喽", "在吗", "你在吗", "早安", "晚安", "早上好", "下午好", "晚上好", "👋",
|
|
14
|
+
"你好aria", "aria你好", "你好 aria", "aria 你好", "hiaria", "helloaria", "heyaria", "谢谢", "谢谢你", "再见",
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def is_social_message(message: str) -> bool:
|
|
19
|
+
text = re.sub(r"[!!??。,,.~~]+", "", str(message or "").strip().casefold())
|
|
20
|
+
text = " ".join(text.split())
|
|
21
|
+
return text in _SOCIAL
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def is_capability_question(message: str) -> bool:
|
|
25
|
+
"""Standalone questions about the assistant, not requests to act on a subject.
|
|
26
|
+
|
|
27
|
+
Full matching keeps a mixed request such as "what can you do; analyze AAPL"
|
|
28
|
+
on the normal execution path. Mentioning stocks in a capability question
|
|
29
|
+
does not ask for a current financial conclusion.
|
|
30
|
+
"""
|
|
31
|
+
text = " ".join(str(message or "").strip().casefold().split()).rstrip("??!!。.")
|
|
32
|
+
chinese = re.sub(r"\s+", "", text)
|
|
33
|
+
chinese = re.sub(r"^(?:除了|除)[^。!?!?;;]+?[,,]((?:你|您|aria(?:code)?).+)$", r"\1", chinese)
|
|
34
|
+
if re.fullmatch(
|
|
35
|
+
r"(?:你|您|aria(?:code)?)(?:(?:除了|除)[^。!?!?;;]+?(?:之外|以外|外)?[,,]?)?"
|
|
36
|
+
r"还?(?:能|可以|会)(?:帮我|帮助我)?(?:做|干)(?:些|一些|点)?(?:什么|啥)(?:事情|工作|任务)?(?:吗|呢|呀|啊)?",
|
|
37
|
+
chinese,
|
|
38
|
+
):
|
|
39
|
+
return True
|
|
40
|
+
if re.fullmatch(r"(?:你|您|aria(?:code)?)(?:还)?(?:有|具备|支持)(?:哪些|什么)(?:能力|功能|用途)(?:吗|呢)?", chinese):
|
|
41
|
+
return True
|
|
42
|
+
if re.fullmatch(r"(?:介绍|说明)(?:一下)?(?:你|您|aria(?:code)?)(?:的)?(?:能力|功能|用途)", chinese):
|
|
43
|
+
return True
|
|
44
|
+
return bool(re.fullmatch(
|
|
45
|
+
r"(?:(?:besides|apart from|other than) [^.!?;]+[,,]? )?"
|
|
46
|
+
r"what (?:else |other things )?can you (?:(?:help me )?(?:do|help with)|help me with)"
|
|
47
|
+
r"(?: (?:besides|apart from|other than) [^.!?;]+)?"
|
|
48
|
+
r"|what are your (?:capabilities|features)", text,
|
|
49
|
+
))
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def is_conversation_only_message(message: str) -> bool:
|
|
53
|
+
return is_social_message(message) or is_capability_question(message)
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"""Shared deterministic routing for Aria agent entrypoints.
|
|
2
|
+
|
|
3
|
+
This module is intentionally UI-free. The legacy CLI, future daemon/webhook
|
|
4
|
+
entrypoints, and the public SDK can all use the same routing order without
|
|
5
|
+
importing the terminal implementation from ``aria_cli.py``.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from dataclasses import dataclass
|
|
11
|
+
from typing import Any, Callable
|
|
12
|
+
|
|
13
|
+
from aria_code.apps.cli.handlers.broker_handlers import handle_broker_query
|
|
14
|
+
from aria_code.apps.cli.handlers.chart_handlers import handle_stock_chart_analysis
|
|
15
|
+
from aria_code.apps.cli.handlers.market_handlers import (
|
|
16
|
+
_try_handle_market_overview,
|
|
17
|
+
_try_handle_market_snapshot_analysis,
|
|
18
|
+
)
|
|
19
|
+
from aria_code.apps.cli.handlers.realty_handlers import handle_realty_query
|
|
20
|
+
from aria_code.apps.cli.handlers.strategy_advice import handle_strategy_advice
|
|
21
|
+
from aria_code.apps.cli.utils.market_detect import (
|
|
22
|
+
_CN_CITIES,
|
|
23
|
+
_INTL_CITIES,
|
|
24
|
+
_extract_market_symbol,
|
|
25
|
+
_is_broker_intent,
|
|
26
|
+
_is_realty_query,
|
|
27
|
+
_is_stock_chart_analysis_request,
|
|
28
|
+
)
|
|
29
|
+
from aria_code.packages.aria_services.research_protocol import requires_financial_evidence
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
BrokerRegistryFactory = Callable[[], Any]
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _pack_handlers(message: str) -> tuple:
|
|
36
|
+
"""Deterministic handlers contributed by the packs this message activates.
|
|
37
|
+
|
|
38
|
+
Falls back to the legacy finance handlers if the pack layer is unavailable,
|
|
39
|
+
so an import problem degrades to the previous behaviour rather than
|
|
40
|
+
silently dropping domain routing.
|
|
41
|
+
"""
|
|
42
|
+
try:
|
|
43
|
+
from aria_code.packs import (
|
|
44
|
+
activate_packs,
|
|
45
|
+
active_handlers,
|
|
46
|
+
load_builtin_packs,
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
load_builtin_packs()
|
|
50
|
+
return active_handlers(activate_packs(message))
|
|
51
|
+
except Exception:
|
|
52
|
+
return (handle_strategy_advice, _handle_stock_chart_analysis)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
# Names of the handlers that decide for themselves whether a message is theirs
|
|
56
|
+
# and answer without fetching anything. They need no pack activation; see the
|
|
57
|
+
# call site for why.
|
|
58
|
+
#
|
|
59
|
+
# Names rather than function objects, resolved at call time: a module-level
|
|
60
|
+
# tuple of references captures whatever was imported and then ignores anything
|
|
61
|
+
# that replaces the module attribute later, which silently defeats both
|
|
62
|
+
# monkeypatching in tests and any runtime substitution.
|
|
63
|
+
_SELF_GATED_HANDLER_NAMES = ("handle_strategy_advice",)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def _self_gated_handlers() -> tuple:
|
|
67
|
+
return tuple(globals()[name] for name in _SELF_GATED_HANDLER_NAMES)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _missing_broker_registry() -> None:
|
|
71
|
+
return None
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@dataclass(frozen=True)
|
|
75
|
+
class DeterministicRouterConfig:
|
|
76
|
+
"""Configuration for deterministic routing outside the model loop."""
|
|
77
|
+
|
|
78
|
+
model_has_tools: bool = True
|
|
79
|
+
has_brokers: bool = False
|
|
80
|
+
get_broker_registry: BrokerRegistryFactory | None = None
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _handle_broker_query(message: str, config: DeterministicRouterConfig) -> dict:
|
|
84
|
+
return handle_broker_query(
|
|
85
|
+
message,
|
|
86
|
+
has_brokers=config.has_brokers,
|
|
87
|
+
is_broker_intent=_is_broker_intent,
|
|
88
|
+
get_broker_registry=config.get_broker_registry or _missing_broker_registry,
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def _handle_realty_query(message: str) -> dict:
|
|
93
|
+
return handle_realty_query(
|
|
94
|
+
message,
|
|
95
|
+
is_realty_query=_is_realty_query,
|
|
96
|
+
cn_cities=_CN_CITIES,
|
|
97
|
+
intl_cities=_INTL_CITIES,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def _handle_stock_chart_analysis(message: str) -> dict:
|
|
102
|
+
return handle_stock_chart_analysis(
|
|
103
|
+
message,
|
|
104
|
+
is_chart_request=_is_stock_chart_analysis_request,
|
|
105
|
+
extract_symbol=_extract_market_symbol,
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def run_deterministic_chain(
|
|
110
|
+
message: str,
|
|
111
|
+
*,
|
|
112
|
+
model_has_tools: bool,
|
|
113
|
+
history: list | None = None,
|
|
114
|
+
has_brokers: bool = False,
|
|
115
|
+
get_broker_registry: BrokerRegistryFactory | None = None,
|
|
116
|
+
) -> dict:
|
|
117
|
+
"""Run the deterministic routing chain used before LLM fallback.
|
|
118
|
+
|
|
119
|
+
Order matters:
|
|
120
|
+
- broker account reads are only used when the model cannot call tools;
|
|
121
|
+
- realty must run before market parsing, so housing questions do not inherit
|
|
122
|
+
a ticker;
|
|
123
|
+
- chart requests run before snapshots;
|
|
124
|
+
- whole-market overview runs before single-symbol snapshot parsing, so
|
|
125
|
+
"分析A股" is treated as the A-share market instead of ticker ``A``.
|
|
126
|
+
"""
|
|
127
|
+
|
|
128
|
+
from aria_code.apps.cli.conversation_policy import is_capability_question
|
|
129
|
+
if is_capability_question(message):
|
|
130
|
+
return {"success": False}
|
|
131
|
+
config = DeterministicRouterConfig(
|
|
132
|
+
model_has_tools=model_has_tools,
|
|
133
|
+
has_brokers=has_brokers,
|
|
134
|
+
get_broker_registry=get_broker_registry,
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
deterministic: dict = {"success": False}
|
|
138
|
+
if not config.model_has_tools:
|
|
139
|
+
deterministic = _handle_broker_query(message, config)
|
|
140
|
+
|
|
141
|
+
# Domain handlers run only for packs the message actually activated. They
|
|
142
|
+
# used to run against every message: a question about this repository was
|
|
143
|
+
# walked through the strategy, realty and stock-chart handlers before the
|
|
144
|
+
# model saw it, which is how a code request came back as a stock quote.
|
|
145
|
+
# Activation is entity-gated, so a message that names no instrument never
|
|
146
|
+
# reaches the finance handlers at all. See aria_code.packs.
|
|
147
|
+
#
|
|
148
|
+
# Realty was the last handler still running ungated here, and it moved
|
|
149
|
+
# behind the same gate in the realty pack: a message must name a city and
|
|
150
|
+
# a housing term, or name the national market outright. A property-domain
|
|
151
|
+
# word on its own ("物业", "地产") no longer reaches it, because that word
|
|
152
|
+
# also appears in the source of every property-management codebase.
|
|
153
|
+
for handler in _pack_handlers(message):
|
|
154
|
+
if deterministic.get("success"):
|
|
155
|
+
break
|
|
156
|
+
deterministic = handler(message)
|
|
157
|
+
|
|
158
|
+
# Self-gated handlers run without a pack activation, because they do not
|
|
159
|
+
# depend on one.
|
|
160
|
+
#
|
|
161
|
+
# The entity gate exists to stop a handler that ANSWERS WITH DATA from
|
|
162
|
+
# firing when no instrument was named — that is how a question about this
|
|
163
|
+
# repository came back as a MongoDB stock quote. handle_strategy_advice
|
|
164
|
+
# answers with static methodology text, names no instrument, and fetches
|
|
165
|
+
# nothing, so it carries none of that risk. Gating it anyway simply broke
|
|
166
|
+
# it: "如果我要写一个美股量化策略,你觉得要从几个角度去写" names no ticker,
|
|
167
|
+
# so no pack activated and the handler was unreachable.
|
|
168
|
+
#
|
|
169
|
+
# Its own gate is a three-way conjunction (strategy term AND advice term
|
|
170
|
+
# AND NOT execution term) that rejects every software-engineering use of
|
|
171
|
+
# 策略/建议 — "帮我写一个缓存策略", "数据库索引策略有什么建议",
|
|
172
|
+
# "给我一些代码风格建议" all fall through untouched.
|
|
173
|
+
for handler in _self_gated_handlers():
|
|
174
|
+
if deterministic.get("success"):
|
|
175
|
+
break
|
|
176
|
+
deterministic = handler(message)
|
|
177
|
+
|
|
178
|
+
# Tool-capable models should resolve symbols and fetch market data through
|
|
179
|
+
# the audited tool loop. The deterministic market handlers can refresh a
|
|
180
|
+
# large remote symbol universe, which blocks the REPL before the model ever
|
|
181
|
+
# receives the request. Keep them as the fallback for text-only models.
|
|
182
|
+
if not deterministic.get("success") and not config.model_has_tools:
|
|
183
|
+
deterministic = _try_handle_market_overview(message)
|
|
184
|
+
|
|
185
|
+
# The evidence gate refuses a market answer given without data, and a
|
|
186
|
+
# model with no tools cannot fetch any — so whatever the gate will demand
|
|
187
|
+
# data for is fetched here, in any wording ("How's NVDA this week?" as
|
|
188
|
+
# well as "分析苹果股票").
|
|
189
|
+
if not deterministic.get("success") and not config.model_has_tools:
|
|
190
|
+
deterministic = _try_handle_market_snapshot_analysis(
|
|
191
|
+
message, history=history, evidence_required=requires_financial_evidence(message))
|
|
192
|
+
|
|
193
|
+
return deterministic
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
__all__ = [
|
|
197
|
+
"BrokerRegistryFactory",
|
|
198
|
+
"DeterministicRouterConfig",
|
|
199
|
+
"run_deterministic_chain",
|
|
200
|
+
]
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"""Direct command dispatcher for non-interactive CLI entrypoints."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import inspect
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from aria_code.apps.cli.commands.catalog import DIRECT_COMMAND_MAP, WATCHABLE_DIRECT_COMMANDS
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def is_watchable_direct_command(command: str) -> bool:
|
|
12
|
+
return command.strip().lower() in WATCHABLE_DIRECT_COMMANDS
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
async def dispatch_direct_command(
|
|
16
|
+
terminal: Any,
|
|
17
|
+
command: str,
|
|
18
|
+
command_args: str = "",
|
|
19
|
+
*,
|
|
20
|
+
json_output: bool = False,
|
|
21
|
+
fmt: str = "table",
|
|
22
|
+
output_file: str | None = None,
|
|
23
|
+
quiet: bool = False,
|
|
24
|
+
) -> bool:
|
|
25
|
+
"""Dispatch a direct CLI command.
|
|
26
|
+
|
|
27
|
+
Returns True when the command was handled by a known direct command handler.
|
|
28
|
+
Unknown direct commands fall back to the normal prompt path and return False.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
cmd = command.strip().lower()
|
|
32
|
+
spec = DIRECT_COMMAND_MAP.get(cmd)
|
|
33
|
+
if spec is None:
|
|
34
|
+
await terminal.run_prompt(
|
|
35
|
+
f"{command} {command_args}".strip(),
|
|
36
|
+
json_output=json_output,
|
|
37
|
+
fmt=fmt,
|
|
38
|
+
output_file=output_file,
|
|
39
|
+
quiet=quiet,
|
|
40
|
+
)
|
|
41
|
+
return False
|
|
42
|
+
|
|
43
|
+
handler = getattr(terminal.commands, spec.method_name)
|
|
44
|
+
result = handler(command_args)
|
|
45
|
+
if inspect.isawaitable(result):
|
|
46
|
+
await result
|
|
47
|
+
return True
|
|
48
|
+
|