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,132 @@
|
|
|
1
|
+
"""Score the independent reviewer on fixed changes: false positives and misses.
|
|
2
|
+
|
|
3
|
+
python -m aria_code.evals.review_probe evals/review/cases.yaml --model <id> [--repeat 3] [--report out.json]
|
|
4
|
+
|
|
5
|
+
The suites measure the builder; the reviewer (runtime/review.py) blocks or
|
|
6
|
+
passes the builder's diff, and nothing measured whether it is right to. Each
|
|
7
|
+
case is a goal and a diff with the verdict it should get: ``expect: pass``
|
|
8
|
+
for a correct change it must not block (a false positive costs a repair
|
|
9
|
+
round and the user's trust), ``expect: block`` for one that misses the goal
|
|
10
|
+
(a miss lets a wrong change through), optionally with ``mentions_any`` — the
|
|
11
|
+
finding must name one of these.
|
|
12
|
+
|
|
13
|
+
A reviewer that errors or answers out of format is an ERROR, not a verdict,
|
|
14
|
+
like an agent that never ran. The exit code is 1 only for errors.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import argparse
|
|
20
|
+
import asyncio
|
|
21
|
+
import json
|
|
22
|
+
import sys
|
|
23
|
+
from dataclasses import dataclass
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
from typing import Any, Awaitable, Callable
|
|
26
|
+
|
|
27
|
+
import yaml
|
|
28
|
+
|
|
29
|
+
PASS, FAIL, ERROR = "pass", "fail", "error"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@dataclass(frozen=True)
|
|
33
|
+
class Case:
|
|
34
|
+
id: str
|
|
35
|
+
goal: str
|
|
36
|
+
diff: str
|
|
37
|
+
expect: str # "pass" | "block"
|
|
38
|
+
mentions_any: tuple[str, ...] = ()
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def load_cases(path: str | Path) -> list[Case]:
|
|
42
|
+
data = yaml.safe_load(Path(path).read_text(encoding="utf-8")) or {}
|
|
43
|
+
cases = []
|
|
44
|
+
for raw in data.get("cases") or []:
|
|
45
|
+
expect = str(raw.get("expect") or "")
|
|
46
|
+
if expect not in ("pass", "block") or not raw.get("goal") or not raw.get("diff"):
|
|
47
|
+
raise ValueError(f"case {raw.get('id')!r}: needs goal, diff and expect: pass|block")
|
|
48
|
+
cases.append(Case(id=str(raw["id"]), goal=str(raw["goal"]), diff=str(raw["diff"]), expect=expect,
|
|
49
|
+
mentions_any=tuple(str(m) for m in raw.get("mentions_any") or ())))
|
|
50
|
+
return cases
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def score(case: Case, report: Any) -> tuple[str, str]:
|
|
54
|
+
"""(outcome, detail) for one reviewer answer."""
|
|
55
|
+
if getattr(report, "verdict", "") == "error":
|
|
56
|
+
return ERROR, f"reviewer error: {getattr(report, 'error', '')}"
|
|
57
|
+
blocking = list(getattr(report, "blocking", ()) or ())
|
|
58
|
+
if case.expect == "pass":
|
|
59
|
+
if blocking:
|
|
60
|
+
return FAIL, f"false positive: {len(blocking)} blocking — {blocking[0].issue[:120]}"
|
|
61
|
+
return PASS, "not blocked"
|
|
62
|
+
if not blocking:
|
|
63
|
+
return FAIL, "missed: no blocking finding"
|
|
64
|
+
text = " ".join(f"{getattr(f, 'file', '')} {getattr(f, 'issue', '')}" for f in blocking).lower()
|
|
65
|
+
if case.mentions_any and not any(m.lower() in text for m in case.mentions_any):
|
|
66
|
+
return FAIL, f"blocked, but not for {' / '.join(case.mentions_any)}: {blocking[0].issue[:120]}"
|
|
67
|
+
return PASS, f"blocked: {blocking[0].issue[:120]}"
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
Review = Callable[..., Awaitable[Any]]
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
async def run_cases(cases: list[Case], review: Review, *, repeat: int = 1) -> list[dict]:
|
|
74
|
+
results = []
|
|
75
|
+
for attempt in range(1, max(1, repeat) + 1):
|
|
76
|
+
for case in cases:
|
|
77
|
+
try:
|
|
78
|
+
report = await review(goal=case.goal, diff=case.diff)
|
|
79
|
+
outcome, detail = score(case, report)
|
|
80
|
+
except Exception as exc: # a provider outage is not the reviewer's verdict
|
|
81
|
+
outcome, detail = ERROR, f"{type(exc).__name__}: {exc}"
|
|
82
|
+
results.append({"case": case.id, "expect": case.expect, "attempt": attempt,
|
|
83
|
+
"outcome": outcome, "detail": detail})
|
|
84
|
+
return results
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def summary(results: list[dict]) -> dict:
|
|
88
|
+
def rate(expect: str) -> dict:
|
|
89
|
+
scored = [r for r in results if r["expect"] == expect and r["outcome"] != ERROR]
|
|
90
|
+
return {"passed": sum(r["outcome"] == PASS for r in scored), "scored": len(scored)}
|
|
91
|
+
|
|
92
|
+
return {"correct_changes_not_blocked": rate("pass"), "wrong_changes_blocked": rate("block"),
|
|
93
|
+
"errors": sum(r["outcome"] == ERROR for r in results), "results": results}
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def _gate_review(model: str) -> Review:
|
|
97
|
+
from aria_code.aria_cli import load_config
|
|
98
|
+
from aria_code.apps.cli.providers.runtime_bridge import build_review_gate
|
|
99
|
+
|
|
100
|
+
config = {**load_config(), "review_gate": True}
|
|
101
|
+
if model:
|
|
102
|
+
config["model"] = model
|
|
103
|
+
gate = build_review_gate(config, model=config.get("model", ""), api_url=config.get("api_url"),
|
|
104
|
+
ollama_url=config.get("ollama_url", "http://localhost:11434"))
|
|
105
|
+
return gate.run
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def main(argv: list[str] | None = None) -> int:
|
|
109
|
+
parser = argparse.ArgumentParser(prog="review_probe", description=__doc__.splitlines()[0])
|
|
110
|
+
parser.add_argument("cases")
|
|
111
|
+
parser.add_argument("--model", default="")
|
|
112
|
+
parser.add_argument("--repeat", type=int, default=1)
|
|
113
|
+
parser.add_argument("--report", default="")
|
|
114
|
+
args = parser.parse_args(argv)
|
|
115
|
+
|
|
116
|
+
cases = load_cases(args.cases)
|
|
117
|
+
results = asyncio.run(run_cases(cases, _gate_review(args.model), repeat=args.repeat))
|
|
118
|
+
for r in results:
|
|
119
|
+
icon = {PASS: "✓", FAIL: "✗"}.get(r["outcome"], "!")
|
|
120
|
+
print(f" {icon} {r['case']} (expect {r['expect']}) — {r['detail']}")
|
|
121
|
+
data = summary(results)
|
|
122
|
+
ok, wrong = data["correct_changes_not_blocked"], data["wrong_changes_blocked"]
|
|
123
|
+
print(f"\nreviewer: correct changes not blocked {ok['passed']}/{ok['scored']} · "
|
|
124
|
+
f"wrong changes blocked {wrong['passed']}/{wrong['scored']}"
|
|
125
|
+
+ (f" · {data['errors']} error" if data["errors"] else ""))
|
|
126
|
+
if args.report:
|
|
127
|
+
Path(args.report).write_text(json.dumps(data, indent=2, ensure_ascii=False), encoding="utf-8")
|
|
128
|
+
return 1 if data["errors"] else 0
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
if __name__ == "__main__":
|
|
132
|
+
sys.exit(main())
|
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
"""Command-line entry point for the verifiable eval suites.
|
|
2
|
+
|
|
3
|
+
python3 -m aria_code.evals.runner evals/suites/core.yaml
|
|
4
|
+
python3 -m aria_code.evals.runner evals/suites/core.yaml --tag logistics
|
|
5
|
+
python3 -m aria_code.evals.runner evals/suites/core.yaml --check # no agent
|
|
6
|
+
|
|
7
|
+
``--check`` is the mode worth knowing about. It runs every task's pre-flight
|
|
8
|
+
and nothing else, so it answers "is this suite still measuring anything?"
|
|
9
|
+
without a model, an API key, or a minute of runtime. Run it in CI: a fixture
|
|
10
|
+
that has drifted green is a silent scoreboard inflation, and this is what
|
|
11
|
+
catches it on the commit that caused it rather than a month later.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import argparse
|
|
17
|
+
import json
|
|
18
|
+
import sys
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
|
|
21
|
+
from .harness import (
|
|
22
|
+
ERROR,
|
|
23
|
+
FAIL,
|
|
24
|
+
INVALID,
|
|
25
|
+
PASS,
|
|
26
|
+
SuiteResult,
|
|
27
|
+
TaskResult,
|
|
28
|
+
load_suite,
|
|
29
|
+
run_suite,
|
|
30
|
+
write_report,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
_ICONS = {PASS: "✓", FAIL: "✗", INVALID: "⚠", ERROR: "!"}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class _TimedOut:
|
|
37
|
+
"""Marker: the agent was cut off before it could finish.
|
|
38
|
+
|
|
39
|
+
Carries a non-zero ``returncode`` so the harness's existing solver-failure
|
|
40
|
+
check classifies it as ERROR — excluded from the score — rather than as a
|
|
41
|
+
task the model failed.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
returncode = 124
|
|
45
|
+
# Read by the harness so the report counts timeouts on their own line
|
|
46
|
+
# instead of folding them, unseen, into "error".
|
|
47
|
+
timed_out = True
|
|
48
|
+
|
|
49
|
+
def __init__(self, seconds: int, stdout: str = "", stderr: str = "") -> None:
|
|
50
|
+
self.stderr = f"{stderr}\nthe agent was still working when the {seconds}s budget ran out".strip()
|
|
51
|
+
self.stdout = stdout
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class Trajectories:
|
|
55
|
+
"""Each attempt's events as JSONL, closed with the outcome the check gave.
|
|
56
|
+
|
|
57
|
+
The material a model learns an agent's job from is the sequence, not the
|
|
58
|
+
final answer: which file it read, what it ran, what came back, what it
|
|
59
|
+
changed, and whether the check then passed. `-p --format jsonl` already
|
|
60
|
+
emits that; this keeps one file per task attempt and, once the suite is
|
|
61
|
+
scored, appends an `eval.outcome` line, so passing runs can be selected.
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
def __init__(self, root: Path, suite: str, model: str) -> None:
|
|
65
|
+
self.root = Path(root) / suite
|
|
66
|
+
self.root.mkdir(parents=True, exist_ok=True)
|
|
67
|
+
self.model = model
|
|
68
|
+
self._files: dict[str, list[Path]] = {}
|
|
69
|
+
|
|
70
|
+
def record(self, task_id: str, prompt: str, stdout: str) -> Path:
|
|
71
|
+
attempt = len(self._files.get(task_id, [])) + 1
|
|
72
|
+
path = self.root / f"{task_id}-{attempt}.jsonl"
|
|
73
|
+
header = json.dumps({"type": "eval.task", "task_id": task_id, "attempt": attempt,
|
|
74
|
+
"model": self.model, "prompt": prompt}, ensure_ascii=False)
|
|
75
|
+
body = "\n".join(line for line in str(stdout or "").splitlines() if line.startswith("{"))
|
|
76
|
+
path.write_text(header + "\n" + (body + "\n" if body else ""), encoding="utf-8")
|
|
77
|
+
self._files.setdefault(task_id, []).append(path)
|
|
78
|
+
return path
|
|
79
|
+
|
|
80
|
+
def close(self, results) -> None:
|
|
81
|
+
"""Append each attempt's outcome, in the order the attempts ran."""
|
|
82
|
+
seen: dict[str, int] = {}
|
|
83
|
+
for result in results:
|
|
84
|
+
files = self._files.get(result.task_id, [])
|
|
85
|
+
index = seen.get(result.task_id, 0)
|
|
86
|
+
seen[result.task_id] = index + 1
|
|
87
|
+
if index >= len(files):
|
|
88
|
+
continue
|
|
89
|
+
line = json.dumps({"type": "eval.outcome", "outcome": result.outcome, "detail": result.detail,
|
|
90
|
+
"changed": list(result.changed), "seconds": round(result.seconds, 2)},
|
|
91
|
+
ensure_ascii=False)
|
|
92
|
+
with files[index].open("a", encoding="utf-8") as handle:
|
|
93
|
+
handle.write(line + "\n")
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def check_only_solver(prompt: str, workspace: Path) -> None:
|
|
97
|
+
"""A solver that does nothing, so only the pre-flight is exercised.
|
|
98
|
+
|
|
99
|
+
Every task should come back FAIL under it. A PASS means the fixture is
|
|
100
|
+
already green; anything else means the fixture or its check is broken.
|
|
101
|
+
"""
|
|
102
|
+
return None
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def native_command(prompt: str, workspace: Path, *, model: str = "", native: str = "") -> list:
|
|
106
|
+
"""The native agent (Rust frontend, Go runtime) over one task, headless.
|
|
107
|
+
|
|
108
|
+
The tuned model is served by the native runtime, so its training
|
|
109
|
+
trajectories must come from it too: the tools it learns are the ones it
|
|
110
|
+
will have.
|
|
111
|
+
"""
|
|
112
|
+
import os
|
|
113
|
+
import shutil
|
|
114
|
+
|
|
115
|
+
binary = native or os.environ.get("ARIA_NATIVE_BINARY") or shutil.which("aria-native") or "aria-native"
|
|
116
|
+
command = [binary, "-C", str(workspace), "exec", "--jsonl", prompt, "--", "--dangerously-skip-permissions"]
|
|
117
|
+
if model:
|
|
118
|
+
command.extend(["--model", model])
|
|
119
|
+
return command
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def build_agent_solver(*, model: str = "", timeout: int = 900, local: bool = False,
|
|
123
|
+
trajectories: "Trajectories | None" = None, events: bool = False,
|
|
124
|
+
runtime: str = "python", native: str = "", go_runtime: str = ""):
|
|
125
|
+
"""Drive the real Aria agent over one task, in the task's own workspace.
|
|
126
|
+
|
|
127
|
+
The agent is invoked as a subprocess in headless mode rather than in this
|
|
128
|
+
process on purpose: a task that leaves the interpreter's cwd, module cache
|
|
129
|
+
or event loop in a strange state then cannot contaminate the next task's
|
|
130
|
+
score.
|
|
131
|
+
|
|
132
|
+
``--dangerously-skip-permissions`` is not optional here, and it is safe for
|
|
133
|
+
the same reason the flag is dangerous everywhere else: the agent is pointed
|
|
134
|
+
at a throwaway copy of a fixture. Without it every write waits on an
|
|
135
|
+
approval prompt that no one is there to answer, so every task times out and
|
|
136
|
+
the suite scores zero for a reason that has nothing to do with the model.
|
|
137
|
+
"""
|
|
138
|
+
import subprocess
|
|
139
|
+
|
|
140
|
+
def _solve(prompt: str, workspace: Path):
|
|
141
|
+
if runtime == "native":
|
|
142
|
+
return _run(native_command(prompt, workspace, model=model, native=native), prompt, workspace)
|
|
143
|
+
command = [
|
|
144
|
+
sys.executable, "-m", "aria_code.aria_cli",
|
|
145
|
+
"-p", prompt,
|
|
146
|
+
"--dangerously-skip-permissions",
|
|
147
|
+
"--no-banner",
|
|
148
|
+
]
|
|
149
|
+
if trajectories is not None or events:
|
|
150
|
+
# One JSON event per tool call on stdout; the screen output stays
|
|
151
|
+
# on stderr, which is what a failed task's log tail shows. Behaviour
|
|
152
|
+
# checks read these events too.
|
|
153
|
+
command.extend(["--format", "jsonl"])
|
|
154
|
+
if model:
|
|
155
|
+
command.extend(["--model", model])
|
|
156
|
+
if local:
|
|
157
|
+
command.append("--local")
|
|
158
|
+
return _run(command, prompt, workspace)
|
|
159
|
+
|
|
160
|
+
def _run(command: list, prompt: str, workspace: Path):
|
|
161
|
+
try:
|
|
162
|
+
import os
|
|
163
|
+
|
|
164
|
+
# The task's own check runs under `{python}`, this interpreter, which has
|
|
165
|
+
# what the suite `requires:` (pytest). The agent types `python3`: put this
|
|
166
|
+
# interpreter first on its PATH, or its acceptance check meets a different
|
|
167
|
+
# python with no pytest, reports "No module named pytest", and the model
|
|
168
|
+
# spends its budget trying to install it.
|
|
169
|
+
env = {**os.environ, "PATH": os.pathsep.join([str(Path(sys.executable).parent), os.environ.get("PATH", "")])}
|
|
170
|
+
# Each attempt gets its own home, so global memory, sessions and
|
|
171
|
+
# learned preferences one attempt writes cannot reach the next one.
|
|
172
|
+
env.update(trial_home_env(workspace.parent / f".home-{workspace.name}"))
|
|
173
|
+
# The agent reports the tokens it used here, outside the workspace so the
|
|
174
|
+
# file is never mistaken for a change the agent made.
|
|
175
|
+
usage_file = workspace.parent / f".usage-{workspace.name}.json"
|
|
176
|
+
usage_file.unlink(missing_ok=True)
|
|
177
|
+
env["ARIA_USAGE_FILE"] = str(usage_file)
|
|
178
|
+
if trajectories is not None or events or runtime == "native":
|
|
179
|
+
if trajectories is not None or events:
|
|
180
|
+
env["ARIA_EVENTS_FULL"] = "1"
|
|
181
|
+
if runtime == "native" and (go_runtime or os.environ.get("ARIA_GO_RUNTIME_BINARY")):
|
|
182
|
+
env["ARIA_RUNTIME"] = go_runtime or os.environ["ARIA_GO_RUNTIME_BINARY"]
|
|
183
|
+
done = subprocess.run(
|
|
184
|
+
command,
|
|
185
|
+
cwd=str(workspace),
|
|
186
|
+
# A headless agent must never wait for input: inheriting an open stdin
|
|
187
|
+
# (a terminal, a pipe that never closes) stalls it before its first event.
|
|
188
|
+
stdin=subprocess.DEVNULL,
|
|
189
|
+
capture_output=True,
|
|
190
|
+
text=True,
|
|
191
|
+
encoding="utf-8",
|
|
192
|
+
timeout=timeout,
|
|
193
|
+
check=False,
|
|
194
|
+
env=env,
|
|
195
|
+
)
|
|
196
|
+
if trajectories is not None:
|
|
197
|
+
trajectories.record(workspace.name, prompt, done.stdout)
|
|
198
|
+
done.usage = _read_usage(usage_file)
|
|
199
|
+
return done
|
|
200
|
+
except subprocess.TimeoutExpired as exc:
|
|
201
|
+
# A truncated run is not a measured failure.
|
|
202
|
+
#
|
|
203
|
+
# I first scored this as FAIL, reasoning "it had its time and
|
|
204
|
+
# produced nothing". That holds only when the budget is generous
|
|
205
|
+
# relative to how long the work takes. It was not: the same task
|
|
206
|
+
# completed in 78–146s alone and exceeded 600s inside a suite,
|
|
207
|
+
# where back-to-back turns contend and get throttled. Scoring that
|
|
208
|
+
# as FAIL blamed the model for the harness cutting it off — which
|
|
209
|
+
# is precisely the confusion PASS/FAIL vs ERROR exists to prevent.
|
|
210
|
+
# TimeoutExpired may carry bytes even with text=True. Keep partial
|
|
211
|
+
# tool events and diagnostics so a stalled run can be investigated.
|
|
212
|
+
def _text(value):
|
|
213
|
+
return value.decode("utf-8", errors="replace") if isinstance(value, bytes) else (value or "")
|
|
214
|
+
stdout, stderr = _text(exc.stdout), _text(exc.stderr)
|
|
215
|
+
if trajectories is not None:
|
|
216
|
+
trajectories.record(workspace.name, prompt, stdout)
|
|
217
|
+
timed_out = _TimedOut(timeout, stdout, stderr)
|
|
218
|
+
timed_out.usage = _read_usage(workspace.parent / f".usage-{workspace.name}.json")
|
|
219
|
+
return timed_out
|
|
220
|
+
|
|
221
|
+
return _solve
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
# What a trial home is seeded with from the real Aria home: sign-in and provider
|
|
225
|
+
# settings, so the agent reaches the same model. Nothing it remembers (memory,
|
|
226
|
+
# sessions, the ARIA.md profile, skills it learned) is copied.
|
|
227
|
+
_TRIAL_HOME_SEED = ("config.json", "providers.json", ".env", "license.json")
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def trial_home_env(home: Path) -> dict:
|
|
231
|
+
"""Environment for one attempt: a fresh HOME / ARIA_HOME / XDG tree under *home*.
|
|
232
|
+
|
|
233
|
+
Provider keys and PATH stay as they are (they come from the inherited
|
|
234
|
+
environment); the user's site-packages stay importable through
|
|
235
|
+
PYTHONUSERBASE, and their git identity through a copied .gitconfig.
|
|
236
|
+
"""
|
|
237
|
+
import os
|
|
238
|
+
import shutil
|
|
239
|
+
import site
|
|
240
|
+
|
|
241
|
+
from aria_code.packages.aria_core.paths import aria_home
|
|
242
|
+
|
|
243
|
+
source_aria = aria_home()
|
|
244
|
+
real_home = Path.home()
|
|
245
|
+
shutil.rmtree(home, ignore_errors=True)
|
|
246
|
+
aria = home / ".aria-code"
|
|
247
|
+
aria.mkdir(parents=True)
|
|
248
|
+
for name in _TRIAL_HOME_SEED:
|
|
249
|
+
if (source_aria / name).is_file():
|
|
250
|
+
shutil.copy2(source_aria / name, aria / name)
|
|
251
|
+
if (real_home / ".gitconfig").is_file():
|
|
252
|
+
shutil.copy2(real_home / ".gitconfig", home / ".gitconfig")
|
|
253
|
+
xdg = {key: home / sub for key, sub in (
|
|
254
|
+
("XDG_CONFIG_HOME", ".config"), ("XDG_DATA_HOME", ".local/share"),
|
|
255
|
+
("XDG_CACHE_HOME", ".cache"), ("XDG_STATE_HOME", ".local/state"))}
|
|
256
|
+
for path in xdg.values():
|
|
257
|
+
path.mkdir(parents=True, exist_ok=True)
|
|
258
|
+
env = {
|
|
259
|
+
"HOME": str(home),
|
|
260
|
+
"USERPROFILE": str(home),
|
|
261
|
+
"ARIA_HOME": str(aria),
|
|
262
|
+
"ARIA_CONFIG_DIR": str(aria),
|
|
263
|
+
"PYTHONUSERBASE": os.environ.get("PYTHONUSERBASE") or site.getuserbase(),
|
|
264
|
+
**{key: str(path) for key, path in xdg.items()},
|
|
265
|
+
}
|
|
266
|
+
return env
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
def _read_usage(path: Path) -> dict:
|
|
270
|
+
"""What the agent wrote to ARIA_USAGE_FILE, or {} when it wrote nothing."""
|
|
271
|
+
try:
|
|
272
|
+
data = json.loads(path.read_text(encoding="utf-8"))
|
|
273
|
+
except (OSError, ValueError):
|
|
274
|
+
return {}
|
|
275
|
+
finally:
|
|
276
|
+
path.unlink(missing_ok=True)
|
|
277
|
+
return data if isinstance(data, dict) else {}
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def _print_result(result: TaskResult) -> None:
|
|
281
|
+
icon = _ICONS.get(result.outcome, "?")
|
|
282
|
+
line = f" {icon} {result.task_id} ({result.seconds:.1f}s)"
|
|
283
|
+
if result.detail:
|
|
284
|
+
line += f" — {result.detail}"
|
|
285
|
+
print(line)
|
|
286
|
+
for item in result.behavior:
|
|
287
|
+
print(f" {'✓' if item['passed'] else '✗'} {item['check']} — {item['detail']}")
|
|
288
|
+
if result.outcome == FAIL and result.changed:
|
|
289
|
+
print(f" changed: {', '.join(result.changed)}")
|
|
290
|
+
if result.outcome in (FAIL, INVALID, ERROR) and result.log:
|
|
291
|
+
for log_line in result.log.splitlines()[-8:]:
|
|
292
|
+
print(f" {log_line}")
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
def main(argv: list[str] | None = None) -> int:
|
|
296
|
+
parser = argparse.ArgumentParser(prog="aria-evals", description=__doc__)
|
|
297
|
+
parser.add_argument("suite", help="path to a suite YAML file")
|
|
298
|
+
parser.add_argument("--fixtures", default="", help="fixtures root (default: <suite>/../fixtures)")
|
|
299
|
+
parser.add_argument("--only", nargs="*", default=[], help="run only these task ids")
|
|
300
|
+
parser.add_argument("--tag", nargs="*", default=[], help="run only tasks with these tags")
|
|
301
|
+
parser.add_argument("--check", action="store_true",
|
|
302
|
+
help="run only the pre-flight: verify every task still starts red")
|
|
303
|
+
parser.add_argument("--model", default="", help="model to pass to the agent")
|
|
304
|
+
parser.add_argument("--local", action="store_true",
|
|
305
|
+
help="run the agent local-only (Ollama), skipping the cloud backend")
|
|
306
|
+
parser.add_argument("--runtime", choices=("python", "native"), default="python",
|
|
307
|
+
help="agent to run: the Python CLI, or the native Rust/Go runtime that serves Aria's tuned "
|
|
308
|
+
"models (default python)")
|
|
309
|
+
parser.add_argument("--native-binary", default="", help="aria-native for --runtime native (default: $ARIA_NATIVE_BINARY)")
|
|
310
|
+
parser.add_argument("--go-runtime", default="",
|
|
311
|
+
help="aria-runtime for --runtime native (default: $ARIA_GO_RUNTIME_BINARY)")
|
|
312
|
+
parser.add_argument("--solve-timeout", type=int, default=900,
|
|
313
|
+
help="seconds to give the agent per task (default 900)")
|
|
314
|
+
parser.add_argument("--repeat", type=int, default=1, metavar="N",
|
|
315
|
+
help="run the suite N times; pass@1 is then passes/attempts (default 1)")
|
|
316
|
+
parser.add_argument("--report", default="", help="write the scoreboard to this JSON path")
|
|
317
|
+
parser.add_argument("--keep", action="store_true", help="keep task workspaces for inspection")
|
|
318
|
+
parser.add_argument("--trajectories", default="",
|
|
319
|
+
help="write each attempt's events (JSONL) and outcome under this folder")
|
|
320
|
+
parser.add_argument("--scratch", default="", help="scratch root (implies --keep)")
|
|
321
|
+
args = parser.parse_args(argv)
|
|
322
|
+
|
|
323
|
+
suite_path = Path(args.suite).expanduser().resolve()
|
|
324
|
+
fixtures = Path(args.fixtures).expanduser().resolve() if args.fixtures else (
|
|
325
|
+
suite_path.parent.parent / "fixtures"
|
|
326
|
+
)
|
|
327
|
+
|
|
328
|
+
try:
|
|
329
|
+
name, tasks = load_suite(suite_path)
|
|
330
|
+
except Exception as exc:
|
|
331
|
+
print(f"could not load suite: {exc}", file=sys.stderr)
|
|
332
|
+
return 2
|
|
333
|
+
|
|
334
|
+
if not tasks:
|
|
335
|
+
print(f"suite {name} has no tasks", file=sys.stderr)
|
|
336
|
+
return 2
|
|
337
|
+
|
|
338
|
+
trajectories = (Trajectories(Path(args.trajectories), name, args.model)
|
|
339
|
+
if args.trajectories and not args.check else None)
|
|
340
|
+
solver = check_only_solver if args.check else build_agent_solver(
|
|
341
|
+
model=args.model, timeout=args.solve_timeout, local=args.local, trajectories=trajectories,
|
|
342
|
+
events=any(task.behavior for task in tasks), runtime=args.runtime,
|
|
343
|
+
native=args.native_binary, go_runtime=args.go_runtime,
|
|
344
|
+
)
|
|
345
|
+
mode = "pre-flight only" if args.check else f"agent{f' ({args.model})' if args.model else ''}"
|
|
346
|
+
print(f"\n{name} — {len(tasks)} task(s), {mode}\n")
|
|
347
|
+
|
|
348
|
+
repeats = max(1, args.repeat)
|
|
349
|
+
suite: SuiteResult | None = None
|
|
350
|
+
for attempt in range(repeats):
|
|
351
|
+
if repeats > 1:
|
|
352
|
+
print(f" — attempt {attempt + 1}/{repeats} —")
|
|
353
|
+
run = run_suite(
|
|
354
|
+
tasks,
|
|
355
|
+
solver=solver,
|
|
356
|
+
fixtures_root=fixtures,
|
|
357
|
+
name=name,
|
|
358
|
+
only=args.only,
|
|
359
|
+
tags=args.tag,
|
|
360
|
+
scratch_root=args.scratch or None,
|
|
361
|
+
keep_workspace=args.keep,
|
|
362
|
+
on_result=_print_result,
|
|
363
|
+
)
|
|
364
|
+
if suite is None:
|
|
365
|
+
suite = run
|
|
366
|
+
else:
|
|
367
|
+
suite.merge(run)
|
|
368
|
+
assert suite is not None
|
|
369
|
+
if trajectories is not None:
|
|
370
|
+
trajectories.close(suite.results)
|
|
371
|
+
print(f"trajectories → {trajectories.root}")
|
|
372
|
+
|
|
373
|
+
print(f"\n{suite.summary_line()}")
|
|
374
|
+
if repeats > 1:
|
|
375
|
+
# Print the per-task record, because an aggregate hides the tasks that
|
|
376
|
+
# flip. A task at 2/3 is a different engineering problem from two tasks
|
|
377
|
+
# at 1/1 and 1/2.
|
|
378
|
+
for task_id, stats in sorted(suite.per_task().items()):
|
|
379
|
+
if stats["attempts"]:
|
|
380
|
+
print(f" {task_id:<28} {stats['passed']}/{stats['attempts']}")
|
|
381
|
+
by_tag = suite.by_tag()
|
|
382
|
+
if by_tag and not args.check:
|
|
383
|
+
for tag, stats in by_tag.items():
|
|
384
|
+
if stats["scored"]:
|
|
385
|
+
print(f" {tag:<16} {stats['passed']}/{stats['scored']} ({stats['pass_rate']:.0%})")
|
|
386
|
+
|
|
387
|
+
if args.report:
|
|
388
|
+
print(f"\nreport → {write_report(suite, args.report)}")
|
|
389
|
+
|
|
390
|
+
if args.check:
|
|
391
|
+
# In check mode the only acceptable outcome is "every task is still
|
|
392
|
+
# broken". A pass here means a fixture drifted green and the suite is
|
|
393
|
+
# quietly measuring less than it claims.
|
|
394
|
+
#
|
|
395
|
+
# "Could not run" is reported separately from "drifted green" because
|
|
396
|
+
# they call for opposite responses and were previously indistinguishable:
|
|
397
|
+
# CI installed the package without pytest, every task errored with
|
|
398
|
+
# "environment is missing pytest", and the verdict said five fixtures had
|
|
399
|
+
# stopped being red. That reads as a fixture problem and sends whoever
|
|
400
|
+
# sees it to look at the fixtures, which are fine.
|
|
401
|
+
errored = [r for r in suite.results if r.outcome == ERROR]
|
|
402
|
+
drifted = [r.task_id for r in suite.results
|
|
403
|
+
if r.outcome != FAIL and r.outcome != ERROR]
|
|
404
|
+
|
|
405
|
+
if errored:
|
|
406
|
+
print(f"\n✗ {len(errored)} task(s) could not run — this is an "
|
|
407
|
+
f"environment problem, not a drifted fixture:")
|
|
408
|
+
for result in errored:
|
|
409
|
+
print(f" {result.task_id}: {result.detail}")
|
|
410
|
+
print("\n The suite declares what it needs with `requires:`. "
|
|
411
|
+
"Install it and run again;")
|
|
412
|
+
print(" `pip install -e \".[dev]\"` covers the pytest the shipped "
|
|
413
|
+
"suite asks for.")
|
|
414
|
+
if drifted:
|
|
415
|
+
print(f"\n✗ {len(drifted)} task(s) no longer start red: {', '.join(drifted)}")
|
|
416
|
+
if errored or drifted:
|
|
417
|
+
return 1
|
|
418
|
+
print(f"\n✓ all {len(suite.results)} task(s) still start red")
|
|
419
|
+
return 0
|
|
420
|
+
|
|
421
|
+
return 0 if suite.failed == 0 and suite.errored == 0 and suite.invalid == 0 else 1
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
if __name__ == "__main__":
|
|
425
|
+
raise SystemExit(main())
|