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,75 @@
|
|
|
1
|
+
"""Shared responsive layout primitives for structured terminal output."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
import shutil
|
|
7
|
+
from typing import Literal, Sequence
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
StructuredLayout = Literal["stacked", "compact", "full"]
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass(frozen=True)
|
|
14
|
+
class StackedRecord:
|
|
15
|
+
"""One narrow-terminal record with a headline and readable detail rows."""
|
|
16
|
+
|
|
17
|
+
headline: str
|
|
18
|
+
lines: tuple[str, ...]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def terminal_width(console=None, *, fallback: int = 80) -> int:
|
|
22
|
+
"""Return a stable terminal width for real and recording consoles."""
|
|
23
|
+
try:
|
|
24
|
+
width = int(getattr(console, "width", 0) or 0)
|
|
25
|
+
if width > 0:
|
|
26
|
+
return width
|
|
27
|
+
except (TypeError, ValueError):
|
|
28
|
+
pass
|
|
29
|
+
return int(shutil.get_terminal_size((fallback, 24)).columns or fallback)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def select_structured_layout(
|
|
33
|
+
width: int,
|
|
34
|
+
*,
|
|
35
|
+
stacked_below: int = 96,
|
|
36
|
+
full_at: int = 120,
|
|
37
|
+
) -> StructuredLayout:
|
|
38
|
+
"""Choose stacked cards, a reduced table, or the full table."""
|
|
39
|
+
if width < stacked_below:
|
|
40
|
+
return "stacked"
|
|
41
|
+
if width < full_at:
|
|
42
|
+
return "compact"
|
|
43
|
+
return "full"
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def structured_layout(
|
|
47
|
+
console=None,
|
|
48
|
+
*,
|
|
49
|
+
width: int | None = None,
|
|
50
|
+
stacked_below: int = 96,
|
|
51
|
+
full_at: int = 120,
|
|
52
|
+
) -> StructuredLayout:
|
|
53
|
+
return select_structured_layout(
|
|
54
|
+
width if width is not None else terminal_width(console),
|
|
55
|
+
stacked_below=stacked_below,
|
|
56
|
+
full_at=full_at,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def render_stacked_records(
|
|
61
|
+
console,
|
|
62
|
+
*,
|
|
63
|
+
title: str,
|
|
64
|
+
records: Sequence[StackedRecord],
|
|
65
|
+
footer: str = "",
|
|
66
|
+
) -> None:
|
|
67
|
+
"""Render narrow structured data without a wide table or panel border."""
|
|
68
|
+
console.print(f"[bold]{title}[/bold]")
|
|
69
|
+
for index, record in enumerate(records, start=1):
|
|
70
|
+
console.print(f" [bold]#{index} {record.headline}[/bold]")
|
|
71
|
+
for line in record.lines:
|
|
72
|
+
if str(line).strip():
|
|
73
|
+
console.print(f" {line}")
|
|
74
|
+
if footer:
|
|
75
|
+
console.print(f" [dim]{footer}[/dim]")
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
"""Rendering helpers for /team output — table, verdict banner, adaptive widths."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import shutil
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from typing import TYPE_CHECKING, Any
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from rich.console import Console
|
|
11
|
+
|
|
12
|
+
# ── Signal → Rich style ──────────────────────────────────────────────────────
|
|
13
|
+
|
|
14
|
+
SIGNAL_COLORS: dict[str, str] = {
|
|
15
|
+
"BUY": "green",
|
|
16
|
+
"STRONG_BUY": "bold green",
|
|
17
|
+
"SELL": "red",
|
|
18
|
+
"STRONG_SELL": "bold red",
|
|
19
|
+
"HOLD": "yellow",
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
# ── Verdict banner ────────────────────────────────────────────────────────────
|
|
23
|
+
|
|
24
|
+
VERDICT_STYLE: dict[str, tuple[str, str]] = {
|
|
25
|
+
# Text glyphs, not emoji: "🔴" drew as an empty box in common terminal
|
|
26
|
+
# fonts, and the variation selector in "⚠️" threw the panel width off.
|
|
27
|
+
"HEALTHY": ("green", "✓ "),
|
|
28
|
+
"NEEDS_ATTENTION": ("yellow", "! "),
|
|
29
|
+
"HIGH_RISK": ("red", "✗ "),
|
|
30
|
+
"STRONG_BUY": ("bold green", "▲▲"),
|
|
31
|
+
"BUY": ("green", "▲ "),
|
|
32
|
+
"HOLD": ("dim", "─ "),
|
|
33
|
+
"SELL": ("red", "▼ "),
|
|
34
|
+
"STRONG_SELL": ("bold red", "▼▼"),
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
# ── Streaming agent tree (Claude Code-style nested ⏺ rendering) ────────────────
|
|
39
|
+
|
|
40
|
+
AGENT_LABELS: dict[str, str] = {
|
|
41
|
+
"fundamental": "基本面", "technical": "技术面", "macro": "宏观",
|
|
42
|
+
"risk": "风险", "news": "新闻", "catalyst": "催化剂",
|
|
43
|
+
"sector": "行业", "sentiment": "情绪", "debate": "分歧调解",
|
|
44
|
+
"valuation": "估值", "quant": "量化", "synthesis": "综合",
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def agent_label(name: str, lang: str = "zh") -> str:
|
|
49
|
+
if not str(lang).lower().startswith("zh"):
|
|
50
|
+
return (name or "?").replace("_", " ").title()
|
|
51
|
+
return AGENT_LABELS.get((name or "").lower(), name or "?")
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def render_agent_tree_root(console, sym: str, n_agents: int, lang: str = "zh") -> None:
|
|
55
|
+
"""Print the root of the agent tree: ⏺ 多代理分析 SYM N 个分析师并行"""
|
|
56
|
+
head = "多代理分析" if lang == "zh" else "Multi-agent analysis"
|
|
57
|
+
sub = (f"{n_agents} 个分析师并行" if lang == "zh"
|
|
58
|
+
else f"{n_agents} analysts in parallel")
|
|
59
|
+
console.print(f"\n [#C08050]⏺[/#C08050] [bold]{head} {sym}[/bold] [dim]{sub}[/dim]")
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def render_agent_node(console, name: str, signal: str | None,
|
|
63
|
+
key_point: str | None, success: bool = True,
|
|
64
|
+
error: str | None = None,
|
|
65
|
+
degraded: bool = False, lang: str = "zh") -> None:
|
|
66
|
+
"""Print one completed-agent leaf: ⎿ ⏺ 基本面 BUY ROE 24%·PE 32 偏高 (Fundamental … in English)"""
|
|
67
|
+
zh = str(lang).lower().startswith("zh")
|
|
68
|
+
label = agent_label(name, lang)
|
|
69
|
+
if not success or error:
|
|
70
|
+
_err_label = ({
|
|
71
|
+
"timeout": "超时", "rate_limited": "数据源限流",
|
|
72
|
+
"no_data": "无数据", "": "失败",
|
|
73
|
+
} if zh else {
|
|
74
|
+
"timeout": "timed out", "rate_limited": "data source rate-limited",
|
|
75
|
+
"no_data": "no data", "": "failed",
|
|
76
|
+
}).get((error or "").lower(), error or ("失败" if zh else "failed"))
|
|
77
|
+
console.print(f" [dim]⎿ ⏺ {label} {_err_label}[/dim]")
|
|
78
|
+
return
|
|
79
|
+
sig = (signal or "").upper()
|
|
80
|
+
color = SIGNAL_COLORS.get(sig, "dim")
|
|
81
|
+
sig_disp = f"[{color}]{sig}[/{color}] " if sig else ""
|
|
82
|
+
kp = (key_point or "").strip().replace("\n", " ")
|
|
83
|
+
if len(kp) > 52:
|
|
84
|
+
kp = kp[:52] + "…"
|
|
85
|
+
if degraded:
|
|
86
|
+
tag = "降级" if zh else "degraded"
|
|
87
|
+
kp = f"{tag} · {kp}" if kp else (f"{tag}执行" if zh else tag)
|
|
88
|
+
console.print(
|
|
89
|
+
f" [dim]⎿[/dim] [#C08050]⏺[/#C08050] [bold]{label}[/bold] "
|
|
90
|
+
f"{sig_disp}[dim]{kp}[/dim]"
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def render_agent_synthesis_leaf(console, signal: str | None,
|
|
95
|
+
confidence: float | None, elapsed: float | None,
|
|
96
|
+
lang: str = "zh") -> None:
|
|
97
|
+
"""Print the synthesis leaf: ⎿ 综合: ▲ BUY (置信 68%) 耗时 4.2s"""
|
|
98
|
+
sig = (signal or "").upper()
|
|
99
|
+
color, icon = VERDICT_STYLE.get(sig, ("dim", "●"))
|
|
100
|
+
zh = str(lang).lower().startswith("zh")
|
|
101
|
+
conf = (f" [dim]{'置信' if zh else 'confidence'} {confidence:.0%}[/dim]" if confidence else "")
|
|
102
|
+
el = (f" [dim]{'耗时' if zh else 'took'} {elapsed:.1f}s[/dim]" if elapsed else "")
|
|
103
|
+
lab = "综合" if zh else "Synthesis"
|
|
104
|
+
console.print(
|
|
105
|
+
f" [dim]⎿[/dim] [bold]{lab}[/bold] [{color}]{icon} {sig}[/{color}]{conf}{el}"
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def build_verdict_body(
|
|
110
|
+
verdict: str,
|
|
111
|
+
subtitle: str = "",
|
|
112
|
+
confidence: float | None = None,
|
|
113
|
+
lang: str = "zh",
|
|
114
|
+
) -> str:
|
|
115
|
+
"""Return a Rich markup string suitable for a Panel body."""
|
|
116
|
+
verdict_upper = verdict.upper()
|
|
117
|
+
style, icon = VERDICT_STYLE.get(verdict_upper, ("dim", "●"))
|
|
118
|
+
label = "置信度" if str(lang).lower().startswith("zh") else "confidence"
|
|
119
|
+
conf_str = f" [dim]{label} {confidence:.0%}[/dim]" if confidence else ""
|
|
120
|
+
body = f"[{style}]{icon} {verdict_upper}[/{style}]{conf_str}"
|
|
121
|
+
if subtitle:
|
|
122
|
+
body += f"\n[dim]{subtitle}[/dim]"
|
|
123
|
+
return body
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def render_verdict_banner(
|
|
127
|
+
verdict: str,
|
|
128
|
+
subtitle: str = "",
|
|
129
|
+
confidence: float | None = None,
|
|
130
|
+
*,
|
|
131
|
+
console: "Console | None" = None,
|
|
132
|
+
has_rich: bool = True,
|
|
133
|
+
lang: str = "zh",
|
|
134
|
+
) -> None:
|
|
135
|
+
"""Print a visually prominent verdict/signal result.
|
|
136
|
+
|
|
137
|
+
Falls back to a plain print when Rich is unavailable or *console* is None.
|
|
138
|
+
"""
|
|
139
|
+
if not verdict:
|
|
140
|
+
return
|
|
141
|
+
verdict_upper = verdict.upper()
|
|
142
|
+
|
|
143
|
+
if not has_rich or console is None:
|
|
144
|
+
conf_str = f" ({confidence:.0%})" if confidence else ""
|
|
145
|
+
sub_str = f" {subtitle}" if subtitle else ""
|
|
146
|
+
print(f"\n {verdict_upper}{conf_str}{sub_str}\n")
|
|
147
|
+
return
|
|
148
|
+
|
|
149
|
+
try:
|
|
150
|
+
from rich import box as _rbox
|
|
151
|
+
from rich.panel import Panel
|
|
152
|
+
body = build_verdict_body(verdict_upper, subtitle, confidence, lang)
|
|
153
|
+
console.print(Panel(body, box=_rbox.SIMPLE, padding=(0, 2)))
|
|
154
|
+
except Exception:
|
|
155
|
+
conf_str = f" ({confidence:.0%})" if confidence else ""
|
|
156
|
+
console.print(f"\n {verdict_upper}{conf_str}\n")
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
# ── Team table ────────────────────────────────────────────────────────────────
|
|
160
|
+
|
|
161
|
+
@dataclass(frozen=True)
|
|
162
|
+
class TeamTableRow:
|
|
163
|
+
agent: str
|
|
164
|
+
signal: str
|
|
165
|
+
confidence: str
|
|
166
|
+
key_point: str
|
|
167
|
+
success: bool
|
|
168
|
+
signal_color: str = "dim"
|
|
169
|
+
is_debate: bool = False
|
|
170
|
+
degraded: bool = False
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
# Minimum usable terminal width before we drop the key_point column entirely.
|
|
174
|
+
_KEY_POINT_MIN_TERMINAL = 72
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def calc_column_widths(terminal_width: int) -> tuple[int, int, int, int]:
|
|
178
|
+
"""Return ``(agent_w, signal_w, conf_w, key_w)`` adaptive to *terminal_width*.
|
|
179
|
+
|
|
180
|
+
Column budget (chars used by content only, excluding Rich padding/borders):
|
|
181
|
+
|
|
182
|
+
+-----------+---------+-----------+--------------------+
|
|
183
|
+
| Agent | Signal | Conf | Key point |
|
|
184
|
+
+-----------+---------+-----------+--------------------+
|
|
185
|
+
Fixed overhead per row: ~7 chars (borders + padding × 4 cols).
|
|
186
|
+
|
|
187
|
+
Width tiers
|
|
188
|
+
-----------
|
|
189
|
+
≥ 120 cols full layout 14 | 10 | 7 | 38
|
|
190
|
+
≥ 100 cols medium 12 | 9 | 6 | 30
|
|
191
|
+
≥ 80 cols compact 10 | 8 | 6 | 20
|
|
192
|
+
≥ 72 cols tight 9 | 8 | 6 | 12
|
|
193
|
+
< 72 cols no key col 9 | 8 | 6 | 0 (column omitted)
|
|
194
|
+
"""
|
|
195
|
+
if terminal_width >= 120:
|
|
196
|
+
return (14, 10, 7, 38)
|
|
197
|
+
if terminal_width >= 100:
|
|
198
|
+
return (12, 9, 6, 30)
|
|
199
|
+
if terminal_width >= 80:
|
|
200
|
+
return (10, 8, 6, 20)
|
|
201
|
+
if terminal_width >= _KEY_POINT_MIN_TERMINAL:
|
|
202
|
+
return ( 9, 8, 6, 12)
|
|
203
|
+
return (9, 8, 6, 0)
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def truncate_cell(value: Any, width: int = 36) -> str:
|
|
207
|
+
text = str(value or "").strip().replace("\n", " ")
|
|
208
|
+
if width <= 0:
|
|
209
|
+
return ""
|
|
210
|
+
if width <= 1:
|
|
211
|
+
return text[:width]
|
|
212
|
+
if len(text) <= width:
|
|
213
|
+
return text
|
|
214
|
+
return text[: width - 1].rstrip() + "…"
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def team_mode_label(results: list[Any], use_full: bool = False) -> str:
|
|
218
|
+
non_debate = [r for r in results if getattr(r, "agent", None) != "debate"]
|
|
219
|
+
return f"{len(non_debate)}-agent {'完整分析' if use_full else '分析'}"
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
_AGENT_DISPLAY = {
|
|
223
|
+
"fundamental": "fundmntl",
|
|
224
|
+
"synthesis": "synthsis",
|
|
225
|
+
"catalyst": "catalyst",
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def build_team_table_rows(results: list[Any], key_width: int = 36) -> list[TeamTableRow]:
|
|
230
|
+
rows: list[TeamTableRow] = []
|
|
231
|
+
debate_rows: list[TeamTableRow] = []
|
|
232
|
+
|
|
233
|
+
for result in results:
|
|
234
|
+
agent = str(getattr(result, "agent", "") or "")
|
|
235
|
+
agent = _AGENT_DISPLAY.get(agent, agent)
|
|
236
|
+
success = bool(getattr(result, "success", False))
|
|
237
|
+
raw_signal = str(getattr(result, "signal", "") or "")
|
|
238
|
+
signal = raw_signal or "N/A"
|
|
239
|
+
conf_val = float(getattr(result, "confidence", 0.0) or 0.0)
|
|
240
|
+
confidence = f"{conf_val:.0%}" if success else "-"
|
|
241
|
+
degraded = bool(getattr(result, "degraded", False))
|
|
242
|
+
color = SIGNAL_COLORS.get(raw_signal.upper(), "dim")
|
|
243
|
+
|
|
244
|
+
if agent == "debate":
|
|
245
|
+
debate_rows.append(TeamTableRow(
|
|
246
|
+
agent="debate",
|
|
247
|
+
signal=raw_signal or "ADJ",
|
|
248
|
+
confidence=confidence,
|
|
249
|
+
key_point="信号分歧调解",
|
|
250
|
+
success=success,
|
|
251
|
+
signal_color="orange1",
|
|
252
|
+
is_debate=True,
|
|
253
|
+
))
|
|
254
|
+
continue
|
|
255
|
+
|
|
256
|
+
if success:
|
|
257
|
+
kpts = getattr(result, "key_points", []) or []
|
|
258
|
+
key_point = truncate_cell(kpts[0] if kpts else "", key_width)
|
|
259
|
+
if degraded:
|
|
260
|
+
key_point = truncate_cell(f"降级 · {key_point}" if key_point else "降级执行", key_width)
|
|
261
|
+
else:
|
|
262
|
+
_raw_err = getattr(result, "error", None) or "failed"
|
|
263
|
+
_err_display = {
|
|
264
|
+
"stale_or_conflicting_price": "数据冲突 — 价格与行情不符",
|
|
265
|
+
"timeout": "分析超时",
|
|
266
|
+
"no_data": "数据不可用",
|
|
267
|
+
"agent_failed": "Agent 执行失败",
|
|
268
|
+
}.get(_raw_err, _raw_err)
|
|
269
|
+
key_point = truncate_cell(_err_display, key_width)
|
|
270
|
+
|
|
271
|
+
rows.append(TeamTableRow(
|
|
272
|
+
agent=agent,
|
|
273
|
+
signal=signal,
|
|
274
|
+
confidence=confidence,
|
|
275
|
+
key_point=key_point,
|
|
276
|
+
success=success,
|
|
277
|
+
signal_color=color,
|
|
278
|
+
degraded=degraded,
|
|
279
|
+
))
|
|
280
|
+
|
|
281
|
+
return rows + debate_rows
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
def render_team_rows_plain(rows: list[TeamTableRow]) -> list[str]:
|
|
285
|
+
"""Plain-text fallback (no Rich)."""
|
|
286
|
+
lines: list[str] = []
|
|
287
|
+
for row in rows:
|
|
288
|
+
icon = "DEG" if row.degraded else "OK" if row.success else "WARN"
|
|
289
|
+
lines.append(
|
|
290
|
+
f" {icon} [{row.agent}] {row.signal} ({row.confidence}) {row.key_point}".rstrip()
|
|
291
|
+
)
|
|
292
|
+
return lines
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
def render_team_table(
|
|
296
|
+
sym: str,
|
|
297
|
+
rows: list[TeamTableRow],
|
|
298
|
+
use_full: bool = False,
|
|
299
|
+
*,
|
|
300
|
+
console: "Console | None" = None,
|
|
301
|
+
terminal_width: int | None = None,
|
|
302
|
+
has_rich: bool = True,
|
|
303
|
+
) -> None:
|
|
304
|
+
"""Print the /team results table, adapting column widths to *terminal_width*.
|
|
305
|
+
|
|
306
|
+
Falls back to :func:`render_team_rows_plain` when Rich is unavailable.
|
|
307
|
+
"""
|
|
308
|
+
if not has_rich or console is None:
|
|
309
|
+
for line in render_team_rows_plain(rows):
|
|
310
|
+
print(line)
|
|
311
|
+
return
|
|
312
|
+
|
|
313
|
+
try:
|
|
314
|
+
from rich import box as _rbox
|
|
315
|
+
from rich.table import Table as _Table
|
|
316
|
+
except ImportError:
|
|
317
|
+
for line in render_team_rows_plain(rows):
|
|
318
|
+
console.print(line)
|
|
319
|
+
return
|
|
320
|
+
|
|
321
|
+
# Determine terminal width from console if not supplied
|
|
322
|
+
if terminal_width is None:
|
|
323
|
+
terminal_width = getattr(console, "width", None) or shutil.get_terminal_size().columns
|
|
324
|
+
|
|
325
|
+
agent_w, signal_w, conf_w, key_w = calc_column_widths(terminal_width)
|
|
326
|
+
mode_label = team_mode_label(rows, use_full) # rows already built; agent count approximate
|
|
327
|
+
|
|
328
|
+
tbl = _Table(
|
|
329
|
+
title=f"[bold]/team {sym}[/bold] · [dim]{mode_label}[/dim]",
|
|
330
|
+
box=_rbox.ROUNDED,
|
|
331
|
+
border_style="dim",
|
|
332
|
+
show_header=True,
|
|
333
|
+
header_style="bold dim",
|
|
334
|
+
padding=(0, 1),
|
|
335
|
+
)
|
|
336
|
+
tbl.add_column("Agent", width=agent_w)
|
|
337
|
+
tbl.add_column("信号", width=signal_w)
|
|
338
|
+
tbl.add_column("置信度", justify="right", width=conf_w)
|
|
339
|
+
if key_w > 0:
|
|
340
|
+
tbl.add_column("关键点", width=key_w)
|
|
341
|
+
|
|
342
|
+
for row in rows:
|
|
343
|
+
# Re-truncate key_point to the current adaptive width
|
|
344
|
+
kp = truncate_cell(row.key_point, key_w) if key_w > 0 else None
|
|
345
|
+
|
|
346
|
+
agent_cell = (
|
|
347
|
+
f"[orange1]{row.agent}[/orange1]"
|
|
348
|
+
if row.is_debate
|
|
349
|
+
else f"[dim]{row.agent}[/dim]"
|
|
350
|
+
)
|
|
351
|
+
key_cell = (
|
|
352
|
+
"[dim][orange1]信号分歧调解[/orange1][/dim]"
|
|
353
|
+
if row.is_debate
|
|
354
|
+
else f"[dim]{kp}[/dim]"
|
|
355
|
+
) if key_w > 0 else None
|
|
356
|
+
|
|
357
|
+
cells = [
|
|
358
|
+
agent_cell,
|
|
359
|
+
f"[{row.signal_color}]{row.signal}[/{row.signal_color}]",
|
|
360
|
+
f"[dim]{row.confidence}[/dim]" if row.success else "[dim]—[/dim]",
|
|
361
|
+
]
|
|
362
|
+
if key_cell is not None:
|
|
363
|
+
cells.append(key_cell)
|
|
364
|
+
tbl.add_row(*cells)
|
|
365
|
+
|
|
366
|
+
console.print()
|
|
367
|
+
console.print(tbl)
|
aria_code/ui/robot.py
ADDED
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
"""Aria robot mascot — the terminal rendition of the robot artwork.
|
|
2
|
+
|
|
3
|
+
Drawn the way Claude Code draws its mascot: a few flat colours and Unicode
|
|
4
|
+
quadrant blocks (▗▖▘▝▛▜▙▟), each character cell holding 2×2 sub-pixels. That
|
|
5
|
+
keeps the robot small (4 rows × 9 columns, beside four lines of text) and its
|
|
6
|
+
edges exact in any terminal and font, with no image and no blending.
|
|
7
|
+
|
|
8
|
+
The grid is the artwork's own: 18 units wide × 16 tall (ear, body, ear; cap,
|
|
9
|
+
screen, base, feet), each unit one sub-pixel across and half a sub-pixel down
|
|
10
|
+
— which, with terminal cells twice as tall as wide, keeps the units square.
|
|
11
|
+
Each eye is two quadrants (a square) and the two are identical,
|
|
12
|
+
the cap corners ▛ ▜, the ears ▌ ▐, the four feet ▀. Colours are sampled from
|
|
13
|
+
the artwork (docs/assets/aria-robot.png) on this grid; only the light-theme
|
|
14
|
+
greys and body are deepened, where the artwork's would vanish against a
|
|
15
|
+
white background. The orange seam between body and base is left out: at
|
|
16
|
+
this size it would share a cell with two other colours, and a cell has two.
|
|
17
|
+
|
|
18
|
+
Runtime state is shown by the compact status dot, not by the mascot.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import os
|
|
24
|
+
import sys
|
|
25
|
+
import threading
|
|
26
|
+
import time
|
|
27
|
+
from enum import Enum
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class RobotState(Enum):
|
|
31
|
+
IDLE = "idle"
|
|
32
|
+
THINKING = "thinking"
|
|
33
|
+
STREAMING = "streaming"
|
|
34
|
+
ERROR = "error"
|
|
35
|
+
DONE = "done"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
# ── Shared mutable state (written by aria_cli, read by input_box) ─────────────
|
|
39
|
+
_state = RobotState.IDLE
|
|
40
|
+
_state_lock = threading.Lock()
|
|
41
|
+
_done_at: float | None = None # timestamp when DONE state was set
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def set_robot_state(state: RobotState) -> None:
|
|
45
|
+
global _state, _done_at
|
|
46
|
+
with _state_lock:
|
|
47
|
+
_state = state
|
|
48
|
+
_done_at = time.monotonic() if state is RobotState.DONE else None
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def get_robot_state() -> RobotState:
|
|
52
|
+
with _state_lock:
|
|
53
|
+
# Auto-revert DONE → IDLE after 1.5 s
|
|
54
|
+
if _state is RobotState.DONE and _done_at is not None:
|
|
55
|
+
if time.monotonic() - _done_at > 1.5:
|
|
56
|
+
return RobotState.IDLE
|
|
57
|
+
return _state
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
# Eye symbols per state. IDLE mirrors the mascot art: two matching square eyes.
|
|
61
|
+
_EYES = {
|
|
62
|
+
RobotState.IDLE: ("■", "■"),
|
|
63
|
+
RobotState.THINKING: ("◐", "◑"),
|
|
64
|
+
RobotState.STREAMING: ("▸", "▸"),
|
|
65
|
+
RobotState.ERROR: ("×", "×"),
|
|
66
|
+
RobotState.DONE: ("✓", "✓"),
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
# Accent colour per state
|
|
70
|
+
_COLOUR = {
|
|
71
|
+
RobotState.IDLE: "#C08050",
|
|
72
|
+
RobotState.THINKING: "#d29922",
|
|
73
|
+
RobotState.STREAMING: "#3fb950",
|
|
74
|
+
RobotState.ERROR: "#f85149",
|
|
75
|
+
RobotState.DONE: "#3fb950",
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
# Status text per state (used by status bar dot)
|
|
79
|
+
_STATUS = {
|
|
80
|
+
RobotState.IDLE: "",
|
|
81
|
+
RobotState.THINKING: "thinking…",
|
|
82
|
+
RobotState.STREAMING: "generating…",
|
|
83
|
+
RobotState.ERROR: "error",
|
|
84
|
+
RobotState.DONE: "done",
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
# ── Theme-aware palette ───────────────────────────────────────────────────────
|
|
88
|
+
# Colours sampled from the robot artwork. Roles name what a cell shows; each
|
|
89
|
+
# resolves to a Rich style ("<fg> on <bg>").
|
|
90
|
+
_COLOURS = {
|
|
91
|
+
"dark": {
|
|
92
|
+
"body": "#F4EBE4", # cream shell
|
|
93
|
+
"screen": "#0E0E0E", # black screen
|
|
94
|
+
"eye": "#FFFDF5", # square eye, brighter than the shell
|
|
95
|
+
"ear": "#B6ADA4", # grey ear nub
|
|
96
|
+
"base": "#B6ADA4", # grey underside
|
|
97
|
+
"leg": "#D5CCC3", # light grey feet
|
|
98
|
+
},
|
|
99
|
+
"light": {
|
|
100
|
+
"body": "#E6DDD0", # deeper cream: the artwork's would vanish on white
|
|
101
|
+
"screen": "#0E0E0E",
|
|
102
|
+
"eye": "#FFFDF5",
|
|
103
|
+
"ear": "#9C948B",
|
|
104
|
+
"base": "#9C948B",
|
|
105
|
+
"leg": "#B8AFA6",
|
|
106
|
+
},
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def _palette(theme: str) -> dict:
|
|
111
|
+
c = _COLOURS[theme]
|
|
112
|
+
return {
|
|
113
|
+
"body": c["body"],
|
|
114
|
+
"body_screen": f"{c['body']} on {c['screen']}",
|
|
115
|
+
"eye": f"{c['eye']} on {c['screen']}",
|
|
116
|
+
"screen": f"on {c['screen']}",
|
|
117
|
+
"ear_body": f"{c['ear']} on {c['body']}",
|
|
118
|
+
"base": c["base"],
|
|
119
|
+
"base_leg": f"{c['base']} on {c['leg']}",
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
_PALETTES = {theme: _palette(theme) for theme in _COLOURS}
|
|
124
|
+
|
|
125
|
+
_theme_cache: str | None = None
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def _resolve_theme() -> str:
|
|
129
|
+
pref = os.environ.get("ARIA_THEME", "").strip().lower()
|
|
130
|
+
if pref in ("light", "dark"):
|
|
131
|
+
return pref
|
|
132
|
+
if sys.platform == "darwin":
|
|
133
|
+
try:
|
|
134
|
+
import subprocess
|
|
135
|
+
r = subprocess.run(
|
|
136
|
+
["defaults", "read", "-g", "AppleInterfaceStyle"],
|
|
137
|
+
capture_output=True, text=True, timeout=1,
|
|
138
|
+
)
|
|
139
|
+
# `defaults` prints "Dark" in dark mode and errors (non-zero) in light.
|
|
140
|
+
return "dark" if (r.returncode == 0 and "dark" in r.stdout.lower()) else "light"
|
|
141
|
+
except Exception:
|
|
142
|
+
pass
|
|
143
|
+
# xterm-style COLORFGBG ("fg;bg"): bg 0-6/8 → dark, 7/9-15 → light.
|
|
144
|
+
cfb = os.environ.get("COLORFGBG", "")
|
|
145
|
+
if ";" in cfb:
|
|
146
|
+
try:
|
|
147
|
+
bg = int(cfb.split(";")[-1])
|
|
148
|
+
return "light" if (bg == 7 or bg >= 9) else "dark"
|
|
149
|
+
except Exception:
|
|
150
|
+
pass
|
|
151
|
+
return "dark"
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def detect_theme() -> str:
|
|
155
|
+
"""Return 'light' or 'dark' for the mascot, auto-detected once and cached.
|
|
156
|
+
|
|
157
|
+
Order: ``ARIA_THEME`` env override → macOS system appearance → ``COLORFGBG``
|
|
158
|
+
→ default dark.
|
|
159
|
+
"""
|
|
160
|
+
global _theme_cache
|
|
161
|
+
if _theme_cache is None:
|
|
162
|
+
_theme_cache = _resolve_theme()
|
|
163
|
+
return _theme_cache
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
# 9 columns × 4 rows; each cell is (palette-role, glyphs).
|
|
167
|
+
_MASCOT_TEMPLATE = [
|
|
168
|
+
[("body", "▗"), ("body_screen", "▛▀▀▀▀▀▜"), ("body", "▖")], # cap, screen top
|
|
169
|
+
[("ear_body", "▌"), ("body_screen", "▌"), ("eye", "▗▖"), ("screen", " "), # ears, two matching eyes
|
|
170
|
+
("eye", "▗▖"), ("body_screen", "▐"), ("ear_body", "▐")],
|
|
171
|
+
[("body", "▐"), ("body_screen", "▙▄▄▄▄▄▟"), ("body", "▌")], # screen bottom, body
|
|
172
|
+
[("base", "▝"), ("base_leg", "▀"), ("base", "▀"), ("base_leg", "▀"), ("base", "▀"), # base and four feet
|
|
173
|
+
("base_leg", "▀"), ("base", "▀"), ("base_leg", "▀"), ("base", "▘")],
|
|
174
|
+
]
|
|
175
|
+
|
|
176
|
+
ROBOT_ROW_COUNT = len(_MASCOT_TEMPLATE)
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def _resolve_eyes(state: RobotState, tick: int) -> tuple[str, str]:
|
|
180
|
+
el, er = _EYES[state]
|
|
181
|
+
if state is RobotState.IDLE:
|
|
182
|
+
if tick % 24 in (0, 1):
|
|
183
|
+
el, er = "·", "·"
|
|
184
|
+
elif state is RobotState.THINKING:
|
|
185
|
+
frames = (("◐", "◑"), ("◓", "◒"), ("◑", "◐"), ("◒", "◓"))
|
|
186
|
+
el, er = frames[tick % len(frames)]
|
|
187
|
+
elif state is RobotState.STREAMING:
|
|
188
|
+
el = er = "▸" if (tick % 4) < 2 else "▹"
|
|
189
|
+
return el, er
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def get_robot_row(tick: int, row: int) -> list:
|
|
193
|
+
"""Return (style, text) fragments for one robot row, themed.
|
|
194
|
+
|
|
195
|
+
Rows: cap and screen top; ears and two eyes; screen bottom and body;
|
|
196
|
+
base and four feet. Roles follow the active light/dark theme
|
|
197
|
+
(see detect_theme()).
|
|
198
|
+
"""
|
|
199
|
+
del tick
|
|
200
|
+
pal = _PALETTES[detect_theme()]
|
|
201
|
+
return [(pal[key] if key else "", text) for key, text in _MASCOT_TEMPLATE[row]]
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def get_robot_frame(tick: int) -> list:
|
|
205
|
+
"""Legacy single-fragment list (not split by row). Use get_robot_row() instead."""
|
|
206
|
+
out = []
|
|
207
|
+
for r in range(ROBOT_ROW_COUNT):
|
|
208
|
+
out += get_robot_row(tick, r)
|
|
209
|
+
return out
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def get_status_dot(tick: int) -> list:
|
|
213
|
+
"""Compact inline indicator for the status bar — one animated glyph + state label.
|
|
214
|
+
|
|
215
|
+
IDLE: • (copper, slow blink)
|
|
216
|
+
THINKING: ◐ thinking… (yellow spinner)
|
|
217
|
+
STREAMING: ▶ generating… (green pulse)
|
|
218
|
+
ERROR: ✕ error (red)
|
|
219
|
+
DONE: ✓ done (green, brief)
|
|
220
|
+
"""
|
|
221
|
+
state = get_robot_state()
|
|
222
|
+
col = _COLOUR[state]
|
|
223
|
+
if detect_theme() == "light":
|
|
224
|
+
col = {
|
|
225
|
+
RobotState.IDLE: "#9A6700",
|
|
226
|
+
RobotState.THINKING: "#9A6700",
|
|
227
|
+
RobotState.STREAMING: "#1A7F37",
|
|
228
|
+
RobotState.ERROR: "#CF222E",
|
|
229
|
+
RobotState.DONE: "#1A7F37",
|
|
230
|
+
}[state]
|
|
231
|
+
el, _ = _resolve_eyes(state, tick)
|
|
232
|
+
if state is RobotState.IDLE:
|
|
233
|
+
el = "•"
|
|
234
|
+
label = _STATUS[state]
|
|
235
|
+
|
|
236
|
+
frags: list = [(f"bold {col}", el)]
|
|
237
|
+
if label:
|
|
238
|
+
frags.append((col, f" {label}"))
|
|
239
|
+
return frags
|