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,125 @@
|
|
|
1
|
+
"""Install a verified update in the background, the way Claude Code does.
|
|
2
|
+
|
|
3
|
+
The session keeps running on the version it started with. When a newer native
|
|
4
|
+
release is out, it is downloaded, checked and switched in behind the scenes,
|
|
5
|
+
and the header says "restart to use it". Nothing is interrupted: the new
|
|
6
|
+
version only takes over the next time Aria starts.
|
|
7
|
+
|
|
8
|
+
Only managed native installs update themselves. pip, npm and source checkouts
|
|
9
|
+
belong to their own tools, so they keep the plain "update available" notice.
|
|
10
|
+
Turn it off with `auto_update: false` in the config or `ARIA_AUTO_UPDATE=0`.
|
|
11
|
+
A version that failed to install is not retried for a day, and two sessions
|
|
12
|
+
never install at once.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import json
|
|
18
|
+
import os
|
|
19
|
+
import subprocess
|
|
20
|
+
import time
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
from typing import Callable, Optional
|
|
23
|
+
|
|
24
|
+
RETRY_AFTER_FAILURE_S = 86_400
|
|
25
|
+
LOCK_STALE_S = 900
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def enabled(config: dict) -> bool:
|
|
29
|
+
if os.environ.get("ARIA_AUTO_UPDATE", "").lower() in {"0", "false", "no", "off"}:
|
|
30
|
+
return False
|
|
31
|
+
if os.environ.get("ARIA_OFFLINE", "").lower() in {"1", "true", "yes", "on"}:
|
|
32
|
+
return False
|
|
33
|
+
return bool(config.get("auto_update", True))
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _state_path(app_root: Path) -> Path:
|
|
37
|
+
return app_root / "auto-update.json"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _recently_failed(app_root: Path, version: str, now: float) -> bool:
|
|
41
|
+
try:
|
|
42
|
+
data = json.loads(_state_path(app_root).read_text())
|
|
43
|
+
except (OSError, ValueError):
|
|
44
|
+
return False
|
|
45
|
+
return data.get("failed") == version and now - float(data.get("at", 0)) < RETRY_AFTER_FAILURE_S
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _remember_failure(app_root: Path, version: str, now: float) -> None:
|
|
49
|
+
try:
|
|
50
|
+
_state_path(app_root).write_text(json.dumps({"failed": version, "at": now}))
|
|
51
|
+
except OSError:
|
|
52
|
+
pass
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _take_lock(app_root: Path, now: float) -> Optional[Path]:
|
|
56
|
+
lock = app_root / "auto-update.lock"
|
|
57
|
+
try:
|
|
58
|
+
if lock.exists() and now - lock.stat().st_mtime > LOCK_STALE_S:
|
|
59
|
+
lock.unlink()
|
|
60
|
+
fd = os.open(lock, os.O_CREAT | os.O_EXCL | os.O_WRONLY, 0o600)
|
|
61
|
+
except OSError:
|
|
62
|
+
return None
|
|
63
|
+
os.close(fd)
|
|
64
|
+
return lock
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def install_if_newer(
|
|
68
|
+
current: str,
|
|
69
|
+
channel: str,
|
|
70
|
+
config: dict,
|
|
71
|
+
*,
|
|
72
|
+
check: Callable[..., tuple],
|
|
73
|
+
install: Callable[[str, dict], Path],
|
|
74
|
+
newer: Callable[[str, str], bool],
|
|
75
|
+
app_root: Path,
|
|
76
|
+
now: Optional[float] = None,
|
|
77
|
+
) -> Optional[str]:
|
|
78
|
+
"""Install the latest release when there is one; return its version, else None.
|
|
79
|
+
|
|
80
|
+
Blocking: run it off the event loop. Any failure leaves the installed
|
|
81
|
+
version untouched and returns None.
|
|
82
|
+
"""
|
|
83
|
+
if channel != "native" or not enabled(config):
|
|
84
|
+
return None
|
|
85
|
+
try:
|
|
86
|
+
# New managed packages let Rust own retry state, update locking and
|
|
87
|
+
# install orchestration. Keep the Python implementation below for
|
|
88
|
+
# older bundles and source/wheel installs without the native helper.
|
|
89
|
+
from aria_code.apps.cli.updater import _native_update_helper
|
|
90
|
+
|
|
91
|
+
helper = _native_update_helper()
|
|
92
|
+
if helper is not None:
|
|
93
|
+
result = subprocess.run(
|
|
94
|
+
[str(helper), "update", "auto-install", "--current", current],
|
|
95
|
+
capture_output=True,
|
|
96
|
+
text=True,
|
|
97
|
+
timeout=600,
|
|
98
|
+
check=False,
|
|
99
|
+
)
|
|
100
|
+
if result.returncode == 0:
|
|
101
|
+
payload = json.loads(result.stdout)
|
|
102
|
+
if payload.get("status") in {"installed", "skipped", "failed"}:
|
|
103
|
+
version = payload.get("version")
|
|
104
|
+
return version if payload["status"] == "installed" and isinstance(version, str) else None
|
|
105
|
+
except Exception:
|
|
106
|
+
pass
|
|
107
|
+
stamp = time.time() if now is None else now
|
|
108
|
+
try:
|
|
109
|
+
app_root.mkdir(parents=True, exist_ok=True)
|
|
110
|
+
latest, release = check("native")
|
|
111
|
+
if not newer(latest, current) or _recently_failed(app_root, latest, stamp):
|
|
112
|
+
return None
|
|
113
|
+
lock = _take_lock(app_root, stamp)
|
|
114
|
+
if lock is None:
|
|
115
|
+
return None
|
|
116
|
+
try:
|
|
117
|
+
install(latest, release)
|
|
118
|
+
except Exception:
|
|
119
|
+
_remember_failure(app_root, latest, stamp)
|
|
120
|
+
return None
|
|
121
|
+
finally:
|
|
122
|
+
lock.unlink(missing_ok=True)
|
|
123
|
+
return latest
|
|
124
|
+
except Exception:
|
|
125
|
+
return None
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"""CLI bootstrap utilities shared by legacy and packaged entrypoints."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
import socket
|
|
7
|
+
import ssl
|
|
8
|
+
import sys
|
|
9
|
+
import urllib.parse
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
from aria_code.apps.cli.config_paths import resolve_paths
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def load_aria_env(env_file: Path | None = None) -> None:
|
|
16
|
+
"""Load persisted CLI environment values without overriding the process."""
|
|
17
|
+
target = env_file or (Path.home() / ".aria" / ".env")
|
|
18
|
+
if not target.exists():
|
|
19
|
+
return
|
|
20
|
+
try:
|
|
21
|
+
for line in target.read_text(encoding="utf-8").splitlines():
|
|
22
|
+
line = line.strip()
|
|
23
|
+
if not line or line.startswith("#") or "=" not in line:
|
|
24
|
+
continue
|
|
25
|
+
key, _, value = line.partition("=")
|
|
26
|
+
key = key.strip()
|
|
27
|
+
value = value.strip()
|
|
28
|
+
if key and value:
|
|
29
|
+
os.environ.setdefault(key, value)
|
|
30
|
+
except Exception:
|
|
31
|
+
return
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def disable_broken_proxy(timeout: float = 1.5) -> None:
|
|
35
|
+
"""Unset proxy variables when the configured proxy cannot be reached."""
|
|
36
|
+
proxy = (
|
|
37
|
+
os.environ.get("HTTPS_PROXY")
|
|
38
|
+
or os.environ.get("https_proxy")
|
|
39
|
+
or os.environ.get("HTTP_PROXY")
|
|
40
|
+
or os.environ.get("http_proxy")
|
|
41
|
+
)
|
|
42
|
+
if not proxy:
|
|
43
|
+
return
|
|
44
|
+
try:
|
|
45
|
+
parsed = urllib.parse.urlparse(proxy if "://" in proxy else f"http://{proxy}")
|
|
46
|
+
host = parsed.hostname
|
|
47
|
+
port = parsed.port or 80
|
|
48
|
+
if not host:
|
|
49
|
+
return
|
|
50
|
+
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
51
|
+
sock.settimeout(timeout)
|
|
52
|
+
alive = sock.connect_ex((host, port)) == 0
|
|
53
|
+
sock.close()
|
|
54
|
+
except Exception:
|
|
55
|
+
alive = False
|
|
56
|
+
if not alive:
|
|
57
|
+
for name in ("HTTP_PROXY", "HTTPS_PROXY", "http_proxy", "https_proxy", "ALL_PROXY", "all_proxy"):
|
|
58
|
+
os.environ.pop(name, None)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
_LOOPBACK = ("localhost", "127.0.0.1", "::1")
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def ensure_loopback_bypasses_proxy() -> None:
|
|
65
|
+
"""With a proxy set, keep local services (Ollama, LM Studio, the API) off it.
|
|
66
|
+
|
|
67
|
+
HTTP clients honour HTTP(S)_PROXY, so a machine with a system proxy and no
|
|
68
|
+
NO_PROXY would send requests for localhost:11434 to the proxy and fail.
|
|
69
|
+
"""
|
|
70
|
+
if not any(os.environ.get(name) for name in ("HTTP_PROXY", "HTTPS_PROXY", "http_proxy", "https_proxy",
|
|
71
|
+
"ALL_PROXY", "all_proxy")):
|
|
72
|
+
return
|
|
73
|
+
current = os.environ.get("NO_PROXY") or os.environ.get("no_proxy") or ""
|
|
74
|
+
entries = [item.strip() for item in current.split(",") if item.strip()]
|
|
75
|
+
missing = [host for host in _LOOPBACK if host not in entries]
|
|
76
|
+
if missing:
|
|
77
|
+
value = ",".join(entries + missing)
|
|
78
|
+
os.environ["NO_PROXY"] = value
|
|
79
|
+
os.environ["no_proxy"] = value
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def prepare_network() -> None:
|
|
83
|
+
"""Proxy settings every entry point needs before its first request."""
|
|
84
|
+
disable_broken_proxy()
|
|
85
|
+
ensure_loopback_bypasses_proxy()
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def use_system_trust_store() -> bool:
|
|
89
|
+
"""Verify TLS against the OS trust store instead of certifi's bundle.
|
|
90
|
+
|
|
91
|
+
Corporate and local TLS-intercepting proxies present their own CA. That CA
|
|
92
|
+
is installed in the system keychain — which is why ``curl`` works on such a
|
|
93
|
+
machine — but Python verifies against certifi, which has never heard of it,
|
|
94
|
+
so every HTTPS call fails with CERTIFICATE_VERIFY_FAILED.
|
|
95
|
+
|
|
96
|
+
This was not hypothetical: on a machine behind an intercepting proxy,
|
|
97
|
+
``oauth2.googleapis.com`` failed 5 times out of 5 from Python and returned
|
|
98
|
+
404 from curl, so roughly a third of Vertex turns died fetching an OAuth
|
|
99
|
+
token. Trusting the OS store fixed it without disabling verification —
|
|
100
|
+
which is the tempting wrong fix, and would accept any certificate at all.
|
|
101
|
+
|
|
102
|
+
Returns whether the injection happened, and never raises: an environment
|
|
103
|
+
without ``truststore`` keeps certifi's behaviour exactly as before.
|
|
104
|
+
"""
|
|
105
|
+
try:
|
|
106
|
+
import truststore
|
|
107
|
+
|
|
108
|
+
truststore.inject_into_ssl()
|
|
109
|
+
return True
|
|
110
|
+
except Exception:
|
|
111
|
+
return False
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def use_macos_ca_bundle() -> bool:
|
|
115
|
+
"""Use macOS's verified CA bundle when Python has no default CA file.
|
|
116
|
+
|
|
117
|
+
Some standalone Python runtimes have no configured OpenSSL CA path, while
|
|
118
|
+
curl and the system browser can verify the same HTTPS service. This keeps
|
|
119
|
+
verification enabled and respects an explicit SSL_CERT_FILE override.
|
|
120
|
+
"""
|
|
121
|
+
if sys.platform != "darwin" or os.environ.get("SSL_CERT_FILE"):
|
|
122
|
+
return False
|
|
123
|
+
if ssl.get_default_verify_paths().cafile:
|
|
124
|
+
return False
|
|
125
|
+
bundle = Path("/etc/ssl/cert.pem")
|
|
126
|
+
if not bundle.is_file():
|
|
127
|
+
return False
|
|
128
|
+
os.environ["SSL_CERT_FILE"] = str(bundle)
|
|
129
|
+
return True
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def initialize_cli_environment() -> None:
|
|
133
|
+
os.environ.setdefault("TQDM_DISABLE", "1")
|
|
134
|
+
load_aria_env()
|
|
135
|
+
prepare_network()
|
|
136
|
+
if not use_system_trust_store():
|
|
137
|
+
use_macos_ca_bundle()
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
# The model used when nothing has been configured yet.
|
|
141
|
+
#
|
|
142
|
+
# This exists so there is ONE place that answers "which model by default".
|
|
143
|
+
# Call sites used to spell their own fallback — `config.get("model",
|
|
144
|
+
# "qwen2.5:7b")`, ten times over — which quietly made Ollama the answer
|
|
145
|
+
# whenever a config key was missing, no matter what the user had chosen.
|
|
146
|
+
# Provider configuration is the user's to make (that is what `/model` and
|
|
147
|
+
# `.ariarc` are for); the code's job is to have a sane default and then get
|
|
148
|
+
# out of the way.
|
|
149
|
+
DEFAULT_MODEL = os.getenv("ARIA_DEFAULT_MODEL", "google/gemini-3.8-flash")
|
|
150
|
+
# A stable model (Google: available until at least May 2027), not a short-term
|
|
151
|
+
# one: an install that is rarely updated should not lose its default within
|
|
152
|
+
# months. gemini-2.5-pro, the previous default, retires in October 2026.
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def default_config() -> dict:
|
|
156
|
+
return {
|
|
157
|
+
# The Arthera backend and gateway. Not localhost: see endpoint_migration.
|
|
158
|
+
"api_url": os.getenv("ARTHERA_API_URL", "").strip() or "https://api.arthera.xyz",
|
|
159
|
+
"local_url": "http://localhost:8000",
|
|
160
|
+
"ollama_url": os.getenv("OLLAMA_URL") or os.getenv("OLLAMA_HOST") or "http://127.0.0.1:11434",
|
|
161
|
+
# Which backend serves a bare, unprefixed model name. Only consulted
|
|
162
|
+
# for names that do not name their own provider ("qwen2.5:7b"); a
|
|
163
|
+
# prefixed id like "google/gemini-3.8-flash" always wins.
|
|
164
|
+
"local_provider": os.getenv("ARIA_LLM_PROVIDER", "ollama"),
|
|
165
|
+
"provider_fallback": "configured",
|
|
166
|
+
"model": DEFAULT_MODEL,
|
|
167
|
+
"thinking_mode": "auto",
|
|
168
|
+
"watchlist": ["AAPL", "MSFT", "GOOGL", "TSLA", "NVDA"],
|
|
169
|
+
"auth_token": None,
|
|
170
|
+
"user_id": None,
|
|
171
|
+
"last_session_id": None,
|
|
172
|
+
"auto_save_sessions": True,
|
|
173
|
+
"auto_compact_context": True,
|
|
174
|
+
"auto_compact_threshold": 0.78,
|
|
175
|
+
"command_policy": "safe",
|
|
176
|
+
"permission_mode": "workspace-write",
|
|
177
|
+
# Approval by risk level (safety/risk.py): "manual" asks as before;
|
|
178
|
+
# "risk" runs actions at or below auto_approve_level (0-2) without a
|
|
179
|
+
# prompt. L4 always asks, even after "always allow".
|
|
180
|
+
"approval_mode": "manual",
|
|
181
|
+
"auto_approve_level": 1,
|
|
182
|
+
# Independent review of a turn's changes by a fresh-context reviewer
|
|
183
|
+
# before it ends (runtime/review.py). Costs one extra model call.
|
|
184
|
+
"review_gate": False,
|
|
185
|
+
# A different model for that review (provider/model); "" = the builder itself.
|
|
186
|
+
"review_model": "",
|
|
187
|
+
# The runtime's DONE/INCOMPLETE report under coding answers.
|
|
188
|
+
"delivery_report": True,
|
|
189
|
+
"network_enabled": True,
|
|
190
|
+
"data_sharing": False,
|
|
191
|
+
"feedback_upload": False,
|
|
192
|
+
"write_policy": "desktop_only",
|
|
193
|
+
"lsp_autocheck": False,
|
|
194
|
+
"input_style": "panel",
|
|
195
|
+
"input_theme": "auto",
|
|
196
|
+
"response_footer": "compact",
|
|
197
|
+
"report_agent_timeout": 40.0,
|
|
198
|
+
"report_synthesis_timeout": 20.0,
|
|
199
|
+
"local_mode": False,
|
|
200
|
+
"conversation_history": [],
|
|
201
|
+
"ui_lang": "",
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def runtime_paths():
|
|
206
|
+
return resolve_paths()
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"""券商账户 / 持仓 / 订单的终端渲染 —— 从 aria_cli.py 抽出的第二块。
|
|
2
|
+
|
|
3
|
+
原本在 aria_cli.py 的 4399-4578 行。跟 football_reports 一样,这些函数依赖
|
|
4
|
+
aria_cli 的模块级状态(``console`` / ``HAS_RICH`` / ``Panel`` / ``rich_box``),
|
|
5
|
+
所以必须由 aria_cli 用 ``_rebind_module_function_globals`` 绑回它自己的
|
|
6
|
+
globals,不能只是普通 import。
|
|
7
|
+
|
|
8
|
+
调用方有两种形态,重绑后都成立:
|
|
9
|
+
- ``apps/cli/commands/broker_cmds.py`` 用显式 ``from aria_cli import
|
|
10
|
+
_print_broker_account`` —— 读的是 aria_cli 的命名空间;
|
|
11
|
+
- ``tests/test_responsive_rendering.py`` 用 ``aria_cli._print_broker_positions``
|
|
12
|
+
—— 同上。
|
|
13
|
+
|
|
14
|
+
(这一组不像 football 那样被 mixin 裸名调用,但依赖 aria_cli 模块级 rich
|
|
15
|
+
状态,所以约束是一样的。)
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
__all__ = [
|
|
21
|
+
"_print_broker_account",
|
|
22
|
+
"_print_broker_positions",
|
|
23
|
+
"_print_broker_orders",
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _print_broker_account(acct: "AccountInfo"):
|
|
28
|
+
"""Render AccountInfo in a Rich Panel."""
|
|
29
|
+
if not HAS_RICH:
|
|
30
|
+
print(f"{acct.label} 总资产:{acct.total_assets:,.2f} 可用:{acct.cash:,.2f} 市值:{acct.market_value:,.2f}")
|
|
31
|
+
return
|
|
32
|
+
pnl_color = "green" if acct.pnl_today >= 0 else "red"
|
|
33
|
+
pnl_sign = "+" if acct.pnl_today >= 0 else ""
|
|
34
|
+
body = (
|
|
35
|
+
f"[dim]账户:[/dim] [bold]{acct.masked_account}[/bold] [dim]({acct.broker_type})[/dim]\n\n"
|
|
36
|
+
f" 总资产 [bold]{acct.currency} {acct.total_assets:>14,.2f}[/bold]\n"
|
|
37
|
+
f" 持仓市值 [bold]{acct.market_value:>14,.2f}[/bold]\n"
|
|
38
|
+
f" 可用现金 [bold]{acct.cash:>14,.2f}[/bold]\n"
|
|
39
|
+
f" 冻结资金 [dim]{acct.frozen:>14,.2f}[/dim]\n"
|
|
40
|
+
f" 当日盈亏 [{pnl_color}]{pnl_sign}{acct.pnl_today:>14,.2f}[/{pnl_color}]\n"
|
|
41
|
+
)
|
|
42
|
+
if acct.pnl_total:
|
|
43
|
+
tp_color = "green" if acct.pnl_total >= 0 else "red"
|
|
44
|
+
body += f" 累计盈亏 [{tp_color}]{pnl_sign}{acct.pnl_total:>14,.2f}[/{tp_color}]\n"
|
|
45
|
+
console.print(Panel(body, title=f"[bold]{acct.label}[/bold]",
|
|
46
|
+
border_style="dim", box=rich_box.ROUNDED, padding=(0, 1)))
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _print_broker_positions(positions: list, broker_label: str, currency: str = "CNY"):
|
|
50
|
+
"""Render Position list as a Rich Table."""
|
|
51
|
+
if not HAS_RICH:
|
|
52
|
+
for p in positions:
|
|
53
|
+
print(f" {p.symbol:<8} {p.name:<12} 持仓:{p.quantity} 市值:{p.market_value:,.2f} 盈亏:{p.pnl:+,.2f} ({p.pnl_pct:+.2f}%)")
|
|
54
|
+
return
|
|
55
|
+
if not positions:
|
|
56
|
+
console.print(f"[dim]{broker_label} — 当前无持仓[/dim]")
|
|
57
|
+
return
|
|
58
|
+
from rich.markup import escape as _esc
|
|
59
|
+
from ui.render.responsive import StackedRecord, render_stacked_records, structured_layout
|
|
60
|
+
|
|
61
|
+
ordered = sorted(positions, key=lambda x: -abs(x.market_value))
|
|
62
|
+
total_mv = sum(p.market_value for p in positions)
|
|
63
|
+
total_pnl = sum(p.pnl for p in positions)
|
|
64
|
+
total_color = "green" if total_pnl >= 0 else "red"
|
|
65
|
+
layout = structured_layout(console)
|
|
66
|
+
if layout == "stacked":
|
|
67
|
+
records = []
|
|
68
|
+
for p in ordered:
|
|
69
|
+
pnl_color = "green" if p.pnl >= 0 else "red"
|
|
70
|
+
records.append(StackedRecord(
|
|
71
|
+
headline=f"{_esc(str(p.symbol))} {_esc(str(p.name or '—'))}",
|
|
72
|
+
lines=(
|
|
73
|
+
f"[dim]持仓[/dim] {p.quantity:,.0f} · [dim]可卖[/dim] {p.available_qty:,.0f}",
|
|
74
|
+
f"[dim]成本[/dim] {p.cost_price:.3f} · [dim]现价[/dim] {p.current_price:.3f}",
|
|
75
|
+
f"[dim]市值[/dim] {p.market_value:,.2f} · "
|
|
76
|
+
f"[dim]盈亏[/dim] [{pnl_color}]{p.pnl:+,.2f} ({p.pnl_pct:+.2f}%)[/{pnl_color}]",
|
|
77
|
+
),
|
|
78
|
+
))
|
|
79
|
+
render_stacked_records(
|
|
80
|
+
console,
|
|
81
|
+
title=f"{_esc(str(broker_label))} 持仓",
|
|
82
|
+
records=records,
|
|
83
|
+
footer=(
|
|
84
|
+
f"共 {len(positions)} 只 · 总市值 {currency} {total_mv:,.2f} · "
|
|
85
|
+
f"总盈亏 [{total_color}]{total_pnl:+,.2f}[/{total_color}]"
|
|
86
|
+
),
|
|
87
|
+
)
|
|
88
|
+
return
|
|
89
|
+
from rich.table import Table
|
|
90
|
+
tbl = Table(title=f"[bold]{broker_label}[/bold] 持仓", show_header=True, header_style="bold")
|
|
91
|
+
tbl.add_column("代码", style="bold", no_wrap=True)
|
|
92
|
+
tbl.add_column("名称", max_width=12)
|
|
93
|
+
tbl.add_column("持仓", justify="right")
|
|
94
|
+
if layout == "full":
|
|
95
|
+
tbl.add_column("可卖", justify="right", style="dim")
|
|
96
|
+
tbl.add_column("成本", justify="right", style="dim")
|
|
97
|
+
tbl.add_column("现价", justify="right")
|
|
98
|
+
tbl.add_column("市值", justify="right")
|
|
99
|
+
tbl.add_column("盈亏", justify="right")
|
|
100
|
+
tbl.add_column("盈亏%", justify="right")
|
|
101
|
+
for p in ordered:
|
|
102
|
+
pnl_color = "green" if p.pnl >= 0 else "red"
|
|
103
|
+
pnl_sign = "+" if p.pnl >= 0 else ""
|
|
104
|
+
row = [p.symbol, p.name[:12] or "—", f"{p.quantity:,.0f}"]
|
|
105
|
+
if layout == "full":
|
|
106
|
+
row.extend([
|
|
107
|
+
f"{p.available_qty:,.0f}",
|
|
108
|
+
f"{p.cost_price:.3f}",
|
|
109
|
+
f"{p.current_price:.3f}",
|
|
110
|
+
])
|
|
111
|
+
row.extend([
|
|
112
|
+
f"{p.market_value:,.2f}",
|
|
113
|
+
f"[{pnl_color}]{pnl_sign}{p.pnl:,.2f}[/{pnl_color}]",
|
|
114
|
+
f"[{pnl_color}]{pnl_sign}{p.pnl_pct:.2f}%[/{pnl_color}]",
|
|
115
|
+
])
|
|
116
|
+
tbl.add_row(*row)
|
|
117
|
+
console.print(tbl)
|
|
118
|
+
console.print(
|
|
119
|
+
f" [dim]共 {len(positions)} 只 总市值 {total_mv:,.2f} "
|
|
120
|
+
f"总盈亏 [{total_color}]{'+' if total_pnl>=0 else ''}{total_pnl:,.2f}[/{total_color}][/dim]"
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def _print_broker_orders(orders: list, broker_label: str, status_filter: str = "all"):
|
|
125
|
+
"""Render Order list as a Rich Table."""
|
|
126
|
+
if not HAS_RICH:
|
|
127
|
+
for o in orders:
|
|
128
|
+
print(f" {o.order_id[:8]} {o.symbol:<8} {o.side:<4} {o.quantity:>8.0f} @ {o.price:.3f} {o.status}")
|
|
129
|
+
return
|
|
130
|
+
if not orders:
|
|
131
|
+
console.print(f"[dim]{broker_label} — 无 {status_filter} 订单[/dim]")
|
|
132
|
+
return
|
|
133
|
+
from rich.markup import escape as _esc
|
|
134
|
+
from ui.render.responsive import StackedRecord, render_stacked_records, structured_layout
|
|
135
|
+
|
|
136
|
+
layout = structured_layout(console)
|
|
137
|
+
_STATUS_STYLE = {"filled":"[green]成交[/green]","partial":"[yellow]部成[/yellow]",
|
|
138
|
+
"open":"[cyan]委托中[/cyan]","cancelled":"[dim]已撤[/dim]"}
|
|
139
|
+
_SIDE_STYLE = {"buy":"[green]买入[/green]","sell":"[red]卖出[/red]"}
|
|
140
|
+
if layout == "stacked":
|
|
141
|
+
records = []
|
|
142
|
+
for o in orders:
|
|
143
|
+
avg_price = f"{o.avg_price:.3f}" if o.avg_price else "—"
|
|
144
|
+
records.append(StackedRecord(
|
|
145
|
+
headline=(
|
|
146
|
+
f"{_esc(str(o.symbol))} {_esc(str(o.name or '—'))} "
|
|
147
|
+
f"[dim]#{_esc(str(o.order_id[-8:]))}[/dim]"
|
|
148
|
+
),
|
|
149
|
+
lines=(
|
|
150
|
+
f"[dim]方向[/dim] {_SIDE_STYLE.get(o.side, _esc(str(o.side)))} · "
|
|
151
|
+
f"[dim]状态[/dim] {_STATUS_STYLE.get(o.status, _esc(str(o.status)))}",
|
|
152
|
+
f"[dim]委托[/dim] {o.quantity:,.0f} @ {o.price:.3f}",
|
|
153
|
+
f"[dim]成交[/dim] {o.filled_qty:,.0f} @ {avg_price}",
|
|
154
|
+
f"[dim]时间[/dim] {_esc(str(o.created_at[:16] if o.created_at else '—'))}",
|
|
155
|
+
),
|
|
156
|
+
))
|
|
157
|
+
render_stacked_records(
|
|
158
|
+
console,
|
|
159
|
+
title=f"{_esc(str(broker_label))} 订单 · {_esc(str(status_filter))}",
|
|
160
|
+
records=records,
|
|
161
|
+
footer=f"共 {len(orders)} 笔",
|
|
162
|
+
)
|
|
163
|
+
return
|
|
164
|
+
from rich.table import Table
|
|
165
|
+
tbl = Table(title=f"[bold]{broker_label}[/bold] 订单 [dim]({status_filter})[/dim]",
|
|
166
|
+
show_header=True, header_style="bold")
|
|
167
|
+
if layout == "full":
|
|
168
|
+
tbl.add_column("订单号", style="dim", max_width=12)
|
|
169
|
+
tbl.add_column("代码", style="bold", no_wrap=True)
|
|
170
|
+
tbl.add_column("名称", max_width=10)
|
|
171
|
+
tbl.add_column("方向", justify="center")
|
|
172
|
+
tbl.add_column("类型", style="dim")
|
|
173
|
+
tbl.add_column("委托量", justify="right")
|
|
174
|
+
tbl.add_column("成交量", justify="right")
|
|
175
|
+
tbl.add_column("委托价", justify="right", style="dim")
|
|
176
|
+
tbl.add_column("均价", justify="right")
|
|
177
|
+
tbl.add_column("状态")
|
|
178
|
+
tbl.add_column("时间", style="dim", max_width=16)
|
|
179
|
+
else:
|
|
180
|
+
tbl.add_column("代码", style="bold", no_wrap=True)
|
|
181
|
+
tbl.add_column("方向", justify="center")
|
|
182
|
+
tbl.add_column("委托量", justify="right")
|
|
183
|
+
tbl.add_column("委托价", justify="right", style="dim")
|
|
184
|
+
tbl.add_column("状态")
|
|
185
|
+
tbl.add_column("时间", style="dim", max_width=16)
|
|
186
|
+
for o in orders:
|
|
187
|
+
if layout == "full":
|
|
188
|
+
row = [
|
|
189
|
+
o.order_id[-8:], o.symbol, o.name[:10] or "—",
|
|
190
|
+
_SIDE_STYLE.get(o.side, o.side), o.order_type,
|
|
191
|
+
f"{o.quantity:,.0f}", f"{o.filled_qty:,.0f}",
|
|
192
|
+
f"{o.price:.3f}", f"{o.avg_price:.3f}" if o.avg_price else "—",
|
|
193
|
+
_STATUS_STYLE.get(o.status, o.status),
|
|
194
|
+
o.created_at[:16] if o.created_at else "—",
|
|
195
|
+
]
|
|
196
|
+
else:
|
|
197
|
+
row = [
|
|
198
|
+
o.symbol, _SIDE_STYLE.get(o.side, o.side),
|
|
199
|
+
f"{o.quantity:,.0f}", f"{o.price:.3f}",
|
|
200
|
+
_STATUS_STYLE.get(o.status, o.status),
|
|
201
|
+
o.created_at[:16] if o.created_at else "—",
|
|
202
|
+
]
|
|
203
|
+
tbl.add_row(*row)
|
|
204
|
+
console.print(tbl)
|
|
205
|
+
|
|
206
|
+
|