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,432 @@
|
|
|
1
|
+
"""The delivery report — how a coding turn ends, written from evidence.
|
|
2
|
+
|
|
3
|
+
A turn used to end with whatever the model chose to say: "I have successfully
|
|
4
|
+
implemented…", sometimes over a red test run, sometimes with nothing changed.
|
|
5
|
+
The runtime knows better than the model what happened — which files changed and
|
|
6
|
+
by how much, which checks ran and how they came out, what the change contract
|
|
7
|
+
refused, the riskiest thing that ran, and where the checkpoints are — so it
|
|
8
|
+
writes the ending itself, in one fixed shape:
|
|
9
|
+
|
|
10
|
+
DONE
|
|
11
|
+
|
|
12
|
+
Changed
|
|
13
|
+
M src/auth/session.py +43 -18
|
|
14
|
+
A src/auth/refresh.py +82
|
|
15
|
+
|
|
16
|
+
Verified
|
|
17
|
+
✓ python3 -m pytest -q
|
|
18
|
+
|
|
19
|
+
Review
|
|
20
|
+
Not reviewed
|
|
21
|
+
|
|
22
|
+
Risk
|
|
23
|
+
L1 low · Edit files
|
|
24
|
+
|
|
25
|
+
Checkpoint
|
|
26
|
+
2 checkpoints · /rewind code <run>
|
|
27
|
+
|
|
28
|
+
Next
|
|
29
|
+
Ready to commit
|
|
30
|
+
|
|
31
|
+
The status comes from evidence, never from the model's text: a turn that
|
|
32
|
+
stopped early, or whose checks are red, is INCOMPLETE however confident its
|
|
33
|
+
last message sounds.
|
|
34
|
+
|
|
35
|
+
A turn that changed nothing, ran no checks and had nothing refused gets no
|
|
36
|
+
report: questions and read-only exploration end as they always did.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
from __future__ import annotations
|
|
40
|
+
|
|
41
|
+
import re
|
|
42
|
+
from dataclasses import dataclass, field
|
|
43
|
+
from pathlib import Path
|
|
44
|
+
from typing import Any, Iterable, Mapping, Optional, Sequence
|
|
45
|
+
|
|
46
|
+
from aria_code.safety.risk import LEVEL_NAMES, assess_tool
|
|
47
|
+
|
|
48
|
+
from .acceptance import DEFAULT_MUTATING_TOOLS, extract_mutated_paths
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@dataclass
|
|
52
|
+
class ChangedFile:
|
|
53
|
+
path: str
|
|
54
|
+
added: int = 0
|
|
55
|
+
removed: int = 0
|
|
56
|
+
created: bool = False
|
|
57
|
+
# Definitions touched, from runtime/semantic_diff: "refresh() modified".
|
|
58
|
+
symbols: tuple = ()
|
|
59
|
+
# Test files that reference what changed (repo_map), relative to the root.
|
|
60
|
+
tested_by: tuple = ()
|
|
61
|
+
|
|
62
|
+
@property
|
|
63
|
+
def mark(self) -> str:
|
|
64
|
+
return "A" if self.created else "M"
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@dataclass(frozen=True)
|
|
68
|
+
class DeliveryReport:
|
|
69
|
+
status: str # "done" | "incomplete"
|
|
70
|
+
changed: tuple = ()
|
|
71
|
+
checks: tuple = () # ({"command", "passed", "exit_code"}, …)
|
|
72
|
+
not_run: tuple = () # ({"command", "reason"}, …): checks whose tool is missing
|
|
73
|
+
verified: Optional[bool] = None
|
|
74
|
+
review: str = "Not reviewed"
|
|
75
|
+
review_lines: tuple = ()
|
|
76
|
+
behaviour: Optional[dict] = None
|
|
77
|
+
risk_level: Optional[int] = None
|
|
78
|
+
risk_summary: str = ""
|
|
79
|
+
checkpoints: tuple = ()
|
|
80
|
+
refused: tuple = ()
|
|
81
|
+
stop_reason: str = "completed"
|
|
82
|
+
next: str = ""
|
|
83
|
+
impact: str = "" # what depends on the changed files (project graph)
|
|
84
|
+
|
|
85
|
+
@property
|
|
86
|
+
def worth_showing(self) -> bool:
|
|
87
|
+
return bool(self.changed or self.checks or self.refused)
|
|
88
|
+
|
|
89
|
+
@property
|
|
90
|
+
def added(self) -> int:
|
|
91
|
+
return sum(item.added for item in self.changed)
|
|
92
|
+
|
|
93
|
+
@property
|
|
94
|
+
def removed(self) -> int:
|
|
95
|
+
return sum(item.removed for item in self.changed)
|
|
96
|
+
|
|
97
|
+
def as_dict(self) -> dict:
|
|
98
|
+
extra = {"not_run": [dict(item) for item in self.not_run]} if self.not_run else {} # absent when empty, so the two reports stay comparable
|
|
99
|
+
return {
|
|
100
|
+
**extra,
|
|
101
|
+
"status": self.status,
|
|
102
|
+
"changed": [vars(item).copy() for item in self.changed],
|
|
103
|
+
"checks": [dict(item) for item in self.checks],
|
|
104
|
+
"verified": self.verified,
|
|
105
|
+
"review": self.review,
|
|
106
|
+
"review_lines": list(self.review_lines),
|
|
107
|
+
"behaviour": dict(self.behaviour) if self.behaviour else None,
|
|
108
|
+
"risk": None if self.risk_level is None else {
|
|
109
|
+
"level": self.risk_level, "name": LEVEL_NAMES[self.risk_level], "summary": self.risk_summary},
|
|
110
|
+
"checkpoints": list(self.checkpoints),
|
|
111
|
+
"refused": [dict(item) for item in self.refused],
|
|
112
|
+
"stop_reason": self.stop_reason,
|
|
113
|
+
"next": self.next,
|
|
114
|
+
"impact": self.impact,
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
@classmethod
|
|
118
|
+
def from_dict(cls, data: Mapping[str, Any]) -> "DeliveryReport":
|
|
119
|
+
risk = data.get("risk") or {}
|
|
120
|
+
return cls(
|
|
121
|
+
status=str(data.get("status") or "done"),
|
|
122
|
+
changed=tuple(ChangedFile(**{**item, "symbols": tuple(item.get("symbols") or ()),
|
|
123
|
+
"tested_by": tuple(item.get("tested_by") or ())})
|
|
124
|
+
for item in data.get("changed") or ()),
|
|
125
|
+
checks=tuple(dict(item) for item in data.get("checks") or ()),
|
|
126
|
+
not_run=tuple(dict(item) for item in data.get("not_run") or ()),
|
|
127
|
+
verified=data.get("verified"),
|
|
128
|
+
review=str(data.get("review") or "Not reviewed"),
|
|
129
|
+
review_lines=tuple(data.get("review_lines") or ()),
|
|
130
|
+
behaviour=data.get("behaviour") or None,
|
|
131
|
+
risk_level=risk.get("level"),
|
|
132
|
+
risk_summary=str(risk.get("summary") or ""),
|
|
133
|
+
checkpoints=tuple(data.get("checkpoints") or ()),
|
|
134
|
+
refused=tuple(dict(item) for item in data.get("refused") or ()),
|
|
135
|
+
stop_reason=str(data.get("stop_reason") or "completed"),
|
|
136
|
+
next=str(data.get("next") or ""),
|
|
137
|
+
impact=str(data.get("impact") or ""),
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
def render(self, *, rewind_hint: str = "", root: Optional[Path | str] = None) -> str:
|
|
141
|
+
lines = [self.status.upper()]
|
|
142
|
+
if self.changed:
|
|
143
|
+
width = max(len(_display(item.path, root)) for item in self.changed)
|
|
144
|
+
lines += ["", "Changed"]
|
|
145
|
+
for item in self.changed:
|
|
146
|
+
stats = f"+{item.added}" + (f" -{item.removed}" if item.removed or not item.created else "")
|
|
147
|
+
lines.append(f" {item.mark} {_display(item.path, root):<{width}} {stats}")
|
|
148
|
+
if item.symbols:
|
|
149
|
+
shown = " · ".join(item.symbols[:4])
|
|
150
|
+
more = f" · +{len(item.symbols) - 4}" if len(item.symbols) > 4 else ""
|
|
151
|
+
lines.append(f" {shown}{more}")
|
|
152
|
+
if item.tested_by:
|
|
153
|
+
shown = ", ".join(item.tested_by[:3])
|
|
154
|
+
more = f" +{len(item.tested_by) - 3}" if len(item.tested_by) > 3 else ""
|
|
155
|
+
lines.append(f" tested by {shown}{more}")
|
|
156
|
+
if len(self.changed) > 1:
|
|
157
|
+
lines.append(f" {len(self.changed)} files · +{self.added} / -{self.removed}")
|
|
158
|
+
if self.impact:
|
|
159
|
+
lines.append(f" impact {self.impact}")
|
|
160
|
+
lines += ["", "Verified"]
|
|
161
|
+
if self.checks:
|
|
162
|
+
for check in self.checks:
|
|
163
|
+
ok = check.get("passed")
|
|
164
|
+
tail = "" if ok else f" (exit {check.get('exit_code')})"
|
|
165
|
+
if not ok and check.get("preexisting"):
|
|
166
|
+
tail += " — already failing before this change"
|
|
167
|
+
lines.append(f" {'✓' if ok else '✗'} {check.get('command', '')}{tail}")
|
|
168
|
+
new = check.get("new_failures") or ()
|
|
169
|
+
if new:
|
|
170
|
+
shown = ", ".join(new[:3]) + (f" … +{len(new) - 3}" if len(new) > 3 else "")
|
|
171
|
+
lines.append(f" new failures: {shown}")
|
|
172
|
+
if self.verified is None and self.changed:
|
|
173
|
+
lines.append(" ⚠ changed again after the last check")
|
|
174
|
+
elif not self.not_run:
|
|
175
|
+
lines.append(" — no check ran" + (" (none could be inferred)" if self.changed else ""))
|
|
176
|
+
for item in self.not_run:
|
|
177
|
+
lines.append(f" · not run: {item.get('command', '')} — {item.get('reason', '')}")
|
|
178
|
+
if self.behaviour:
|
|
179
|
+
lines += ["", "Behaviour"]
|
|
180
|
+
for key in ("before", "after", "why", "impact"):
|
|
181
|
+
if self.behaviour.get(key):
|
|
182
|
+
lines.append(f" {key.capitalize():<7}{self.behaviour[key]}")
|
|
183
|
+
lines += ["", "Review"] + [f" {line}" for line in (self.review_lines or (self.review,))]
|
|
184
|
+
if self.risk_level is not None:
|
|
185
|
+
lines += ["", "Risk", f" L{self.risk_level} {LEVEL_NAMES[self.risk_level]}"
|
|
186
|
+
+ (f" · {self.risk_summary}" if self.risk_summary else "")]
|
|
187
|
+
if self.refused:
|
|
188
|
+
lines += ["", "Contract"]
|
|
189
|
+
lines += [f" × {item.get('tool', '')}: {item.get('reason', '')}" for item in self.refused]
|
|
190
|
+
if self.checkpoints:
|
|
191
|
+
count = len(self.checkpoints)
|
|
192
|
+
label = f"{count} checkpoint{'s' if count != 1 else ''}"
|
|
193
|
+
lines += ["", "Checkpoint", f" {label}" + (f" · {rewind_hint}" if rewind_hint else "")]
|
|
194
|
+
if self.next:
|
|
195
|
+
lines += ["", "Next", f" {self.next}"]
|
|
196
|
+
return "\n".join(lines)
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def _display(path: str, root: Optional[Path | str]) -> str:
|
|
200
|
+
if root:
|
|
201
|
+
try:
|
|
202
|
+
return Path(path).resolve().relative_to(Path(root).expanduser().resolve()).as_posix()
|
|
203
|
+
except (ValueError, OSError):
|
|
204
|
+
pass
|
|
205
|
+
return path
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
_TEST_PATH = re.compile(r"(^|/)(tests?|__tests__|spec)/|(^|/)test_[^/]+$|_test\.[a-z]+$|\.(test|spec)\.[a-z]+$")
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def _is_test_path(path: str) -> bool:
|
|
212
|
+
return bool(_TEST_PATH.search(path.replace("\\", "/")))
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def _diff_stats(diff: str) -> tuple[int, int, bool]:
|
|
216
|
+
added = removed = 0
|
|
217
|
+
created = False
|
|
218
|
+
for line in (diff or "").splitlines():
|
|
219
|
+
if line.startswith("+++") or line.startswith("---"):
|
|
220
|
+
if line.startswith("--- /dev/null"):
|
|
221
|
+
created = True
|
|
222
|
+
continue
|
|
223
|
+
if line.startswith("+"):
|
|
224
|
+
added += 1
|
|
225
|
+
elif line.startswith("-"):
|
|
226
|
+
removed += 1
|
|
227
|
+
return added, removed, created
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def _data(result: Any) -> Mapping:
|
|
231
|
+
if not isinstance(result, Mapping):
|
|
232
|
+
return {}
|
|
233
|
+
data = result.get("data")
|
|
234
|
+
return data if isinstance(data, Mapping) else result
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
@dataclass
|
|
238
|
+
class DeliveryLedger:
|
|
239
|
+
"""What a turn did, recorded as it happens; turned into a report at the end."""
|
|
240
|
+
|
|
241
|
+
root: Optional[str] = None
|
|
242
|
+
mutating_tools: frozenset = DEFAULT_MUTATING_TOOLS
|
|
243
|
+
_changed: dict = field(default_factory=dict)
|
|
244
|
+
_checkpoints: list = field(default_factory=list)
|
|
245
|
+
_diffs: list = field(default_factory=list)
|
|
246
|
+
_file_diffs: dict = field(default_factory=dict)
|
|
247
|
+
_risk: Optional[tuple] = None
|
|
248
|
+
|
|
249
|
+
def record(self, tool: str, params: Mapping | None, result: Any) -> None:
|
|
250
|
+
if isinstance(result, Mapping) and result.get("contract_violation"):
|
|
251
|
+
return # refused calls did not run; the contract summary has them
|
|
252
|
+
if isinstance(result, Mapping) and result.get("success") is not False:
|
|
253
|
+
assessment = assess_tool(tool, params or {}, root=self.root)
|
|
254
|
+
if self._risk is None or assessment.level > self._risk[0]:
|
|
255
|
+
self._risk = (assessment.level, assessment.summary)
|
|
256
|
+
paths = extract_mutated_paths(tool, result, mutating_tools=self.mutating_tools)
|
|
257
|
+
if not paths:
|
|
258
|
+
return
|
|
259
|
+
data = _data(result)
|
|
260
|
+
diff = str(data.get("diff") or "")
|
|
261
|
+
if diff.strip():
|
|
262
|
+
self._diffs.append(diff if diff.endswith("\n") else diff + "\n")
|
|
263
|
+
added, removed, created = _diff_stats(diff)
|
|
264
|
+
action = str(data.get("action") or "").lower()
|
|
265
|
+
created = created or action in {"created", "create", "write new file"}
|
|
266
|
+
for index, path in enumerate(paths):
|
|
267
|
+
entry = self._changed.get(path)
|
|
268
|
+
if entry is None:
|
|
269
|
+
entry = self._changed[path] = ChangedFile(path=path, created=created)
|
|
270
|
+
if index == 0: # one diff per call; attribute it to the first path
|
|
271
|
+
entry.added += added
|
|
272
|
+
entry.removed += removed
|
|
273
|
+
if diff.strip():
|
|
274
|
+
self._file_diffs.setdefault(path, []).append(diff)
|
|
275
|
+
checkpoint = data.get("checkpoint_id")
|
|
276
|
+
if checkpoint and checkpoint not in self._checkpoints:
|
|
277
|
+
self._checkpoints.append(str(checkpoint))
|
|
278
|
+
|
|
279
|
+
@property
|
|
280
|
+
def changed(self) -> bool:
|
|
281
|
+
return bool(self._changed)
|
|
282
|
+
|
|
283
|
+
def _symbol_changes(self, path: str) -> list:
|
|
284
|
+
diffs = self._file_diffs.get(path)
|
|
285
|
+
if not diffs:
|
|
286
|
+
return []
|
|
287
|
+
try:
|
|
288
|
+
from .semantic_diff import file_symbol_changes
|
|
289
|
+
|
|
290
|
+
return list(file_symbol_changes(path, diffs) or [])
|
|
291
|
+
except Exception:
|
|
292
|
+
return []
|
|
293
|
+
|
|
294
|
+
def _tested_by(self, changes: Sequence) -> tuple:
|
|
295
|
+
"""Test files that reference a definition this change added or modified.
|
|
296
|
+
|
|
297
|
+
A method counts only where its class is referenced too: "get" alone
|
|
298
|
+
appears in half the tests of any project.
|
|
299
|
+
"""
|
|
300
|
+
wanted = [c.name.split(".") for c in changes if c.kind != "removed"]
|
|
301
|
+
if not wanted or not self.root:
|
|
302
|
+
return ()
|
|
303
|
+
try:
|
|
304
|
+
from .repo_map import get_repo_map
|
|
305
|
+
|
|
306
|
+
refs = get_repo_map(self.root).refs
|
|
307
|
+
except Exception:
|
|
308
|
+
return ()
|
|
309
|
+
found: set = set()
|
|
310
|
+
for parts in wanted:
|
|
311
|
+
files = set(refs.get(parts[-1], ()))
|
|
312
|
+
for outer in parts[:-1]:
|
|
313
|
+
files &= set(refs.get(outer, ()))
|
|
314
|
+
found |= {f for f in files if _is_test_path(f)}
|
|
315
|
+
return tuple(sorted(found))
|
|
316
|
+
|
|
317
|
+
@staticmethod
|
|
318
|
+
def _impact(changed) -> str:
|
|
319
|
+
sources = [item.path for item in changed if not _is_test_path(item.path)]
|
|
320
|
+
if not sources:
|
|
321
|
+
return ""
|
|
322
|
+
try:
|
|
323
|
+
from .project_graph import impact_line, impact_of_paths
|
|
324
|
+
|
|
325
|
+
return impact_line(impact_of_paths(sources))
|
|
326
|
+
except Exception:
|
|
327
|
+
return ""
|
|
328
|
+
|
|
329
|
+
def diff_text(self) -> str:
|
|
330
|
+
"""Every applied change's diff, in order — what a reviewer reads."""
|
|
331
|
+
return "".join(self._diffs)
|
|
332
|
+
|
|
333
|
+
def report(
|
|
334
|
+
self,
|
|
335
|
+
*,
|
|
336
|
+
acceptance: Optional[Mapping] = None,
|
|
337
|
+
contract: Optional[Mapping] = None,
|
|
338
|
+
review: Optional[Mapping] = None,
|
|
339
|
+
stop_reason: str = "completed",
|
|
340
|
+
) -> DeliveryReport:
|
|
341
|
+
checks: list = []
|
|
342
|
+
not_run: list = []
|
|
343
|
+
reports = list((acceptance or {}).get("reports") or [])
|
|
344
|
+
if reports:
|
|
345
|
+
for c in reports[-1].get("checks") or []:
|
|
346
|
+
if c.get("not_run"):
|
|
347
|
+
not_run.append({"command": c.get("command", ""), "reason": str(c["not_run"])})
|
|
348
|
+
continue
|
|
349
|
+
checks.append(
|
|
350
|
+
{"command": c.get("command", ""), "passed": bool(c.get("passed")), "exit_code": c.get("exit_code"),
|
|
351
|
+
**({"preexisting": True} if c.get("preexisting") else {}),
|
|
352
|
+
**({"new_failures": list(c["new_failures"])} if c.get("new_failures") else {})})
|
|
353
|
+
verified = (acceptance or {}).get("verified")
|
|
354
|
+
refused = tuple(dict(item) for item in (contract or {}).get("refused") or ())
|
|
355
|
+
changed = tuple(self._changed.values())
|
|
356
|
+
for item in changed:
|
|
357
|
+
changes = self._symbol_changes(item.path)
|
|
358
|
+
item.symbols = tuple(change.label() for change in changes)
|
|
359
|
+
item.tested_by = self._tested_by(changes)
|
|
360
|
+
|
|
361
|
+
if stop_reason != "completed":
|
|
362
|
+
status = "incomplete"
|
|
363
|
+
next_step = {
|
|
364
|
+
"max_rounds": "Ran out of rounds — continue, or narrow the task",
|
|
365
|
+
"budget_exhausted": "Budget reached — raise it or narrow the task",
|
|
366
|
+
"loop_guard": "Stopped repeating a failing call — look at the error above",
|
|
367
|
+
"checks_failed": "Fix the failing checks",
|
|
368
|
+
"text_tool_calls": "The model wrote tool calls as text — retry the turn",
|
|
369
|
+
"prompt_echo": "The model stopped without an answer — retry the turn",
|
|
370
|
+
}.get(stop_reason, f"Stopped: {stop_reason}")
|
|
371
|
+
elif verified is False and checks and all(c["passed"] or c.get("preexisting") for c in checks):
|
|
372
|
+
# Red only where it was red before this change (runtime/baseline.py).
|
|
373
|
+
status = "done"
|
|
374
|
+
next_step = "Ready to commit — the failing checks already failed before this change"
|
|
375
|
+
elif verified is False or any(not c["passed"] for c in checks):
|
|
376
|
+
status = "incomplete"
|
|
377
|
+
next_step = "Fix the failing checks"
|
|
378
|
+
elif not_run and changed and verified is None:
|
|
379
|
+
# What could run passed; the tests did not run. Not verified, and not a failure.
|
|
380
|
+
status = "done"
|
|
381
|
+
next_step = f"Run the tests yourself — {not_run[0]['reason']}"
|
|
382
|
+
elif changed:
|
|
383
|
+
status = "done"
|
|
384
|
+
next_step = ("Ready to commit" if verified else
|
|
385
|
+
"Review the changes — no check ran" if not checks else
|
|
386
|
+
"Re-run the checks: files changed after the last run")
|
|
387
|
+
else:
|
|
388
|
+
status = "done"
|
|
389
|
+
next_step = ""
|
|
390
|
+
review_blocks = bool(review) and review.get("verdict") == "blocking"
|
|
391
|
+
if review_blocks and status == "done":
|
|
392
|
+
status = "incomplete"
|
|
393
|
+
next_step = "Address the review's blocking findings"
|
|
394
|
+
if refused and status == "done":
|
|
395
|
+
next_step = "Some calls were refused by the change contract — see above" if not changed \
|
|
396
|
+
else next_step + " · some calls were refused by the contract"
|
|
397
|
+
|
|
398
|
+
return DeliveryReport(
|
|
399
|
+
status=status,
|
|
400
|
+
changed=changed,
|
|
401
|
+
checks=tuple(checks),
|
|
402
|
+
not_run=tuple(not_run),
|
|
403
|
+
verified=verified,
|
|
404
|
+
impact=self._impact(changed),
|
|
405
|
+
review=str((review or {}).get("headline") or "Not reviewed"),
|
|
406
|
+
review_lines=tuple((review or {}).get("lines") or ()),
|
|
407
|
+
behaviour=(review or {}).get("behaviour") or None,
|
|
408
|
+
risk_level=self._risk[0] if self._risk else None,
|
|
409
|
+
risk_summary=self._risk[1] if self._risk else "",
|
|
410
|
+
checkpoints=tuple(self._checkpoints),
|
|
411
|
+
refused=refused,
|
|
412
|
+
stop_reason=stop_reason,
|
|
413
|
+
next=next_step,
|
|
414
|
+
)
|
|
415
|
+
|
|
416
|
+
|
|
417
|
+
def report_from_activities(
|
|
418
|
+
activities: Iterable[tuple[str, Mapping, Any]],
|
|
419
|
+
*,
|
|
420
|
+
root: Optional[str] = None,
|
|
421
|
+
acceptance: Optional[Mapping] = None,
|
|
422
|
+
contract: Optional[Mapping] = None,
|
|
423
|
+
review: Optional[Mapping] = None,
|
|
424
|
+
stop_reason: str = "completed",
|
|
425
|
+
) -> DeliveryReport:
|
|
426
|
+
ledger = DeliveryLedger(root=root)
|
|
427
|
+
for tool, params, result in activities:
|
|
428
|
+
ledger.record(tool, params, result)
|
|
429
|
+
return ledger.report(acceptance=acceptance, contract=contract, review=review, stop_reason=stop_reason)
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
__all__ = ["ChangedFile", "DeliveryLedger", "DeliveryReport", "report_from_activities"]
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"""Runtime event and trace records for Aria Code."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import time
|
|
6
|
+
import uuid
|
|
7
|
+
from dataclasses import asdict, dataclass, field
|
|
8
|
+
from typing import Any, Callable, Dict, List, Optional
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@dataclass(frozen=True)
|
|
12
|
+
class RuntimeEvent:
|
|
13
|
+
event_id: str
|
|
14
|
+
type: str
|
|
15
|
+
timestamp: float
|
|
16
|
+
data: Dict[str, Any] = field(default_factory=dict)
|
|
17
|
+
|
|
18
|
+
@classmethod
|
|
19
|
+
def create(cls, event_type: str, data: Dict[str, Any] | None = None) -> "RuntimeEvent":
|
|
20
|
+
return cls(uuid.uuid4().hex[:12], event_type, time.time(), data or {})
|
|
21
|
+
|
|
22
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
23
|
+
return asdict(self)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@dataclass(frozen=True)
|
|
27
|
+
class ToolCallRecord:
|
|
28
|
+
tool: str
|
|
29
|
+
params: Dict[str, Any]
|
|
30
|
+
result: Dict[str, Any]
|
|
31
|
+
elapsed_ms: float
|
|
32
|
+
started_at: float
|
|
33
|
+
ended_at: float
|
|
34
|
+
|
|
35
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
36
|
+
return asdict(self)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@dataclass(frozen=True)
|
|
40
|
+
class TurnResultRecord:
|
|
41
|
+
status: str
|
|
42
|
+
success: bool
|
|
43
|
+
cancelled: bool
|
|
44
|
+
provider: str
|
|
45
|
+
error: str
|
|
46
|
+
final_text: str
|
|
47
|
+
summary: str
|
|
48
|
+
metadata: Dict[str, Any] = field(default_factory=dict)
|
|
49
|
+
timestamp: float = field(default_factory=time.time)
|
|
50
|
+
|
|
51
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
52
|
+
return asdict(self)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class RuntimeTrace:
|
|
56
|
+
"""In-memory trace of runtime events for session replay/debugging."""
|
|
57
|
+
|
|
58
|
+
def __init__(
|
|
59
|
+
self,
|
|
60
|
+
event_sink: Optional[Callable[[RuntimeEvent], None]] = None,
|
|
61
|
+
) -> None:
|
|
62
|
+
self.events: List[RuntimeEvent] = []
|
|
63
|
+
self.tool_calls: List[ToolCallRecord] = []
|
|
64
|
+
self.turn_results: List[TurnResultRecord] = []
|
|
65
|
+
self.event_sink = event_sink
|
|
66
|
+
|
|
67
|
+
def emit(self, event_type: str, data: Dict[str, Any] | None = None) -> RuntimeEvent:
|
|
68
|
+
event = RuntimeEvent.create(event_type, data)
|
|
69
|
+
self.events.append(event)
|
|
70
|
+
if self.event_sink is not None:
|
|
71
|
+
try:
|
|
72
|
+
self.event_sink(event)
|
|
73
|
+
except Exception:
|
|
74
|
+
# Observability must never turn a successful tool call into a
|
|
75
|
+
# failed one. The in-memory trace remains available as fallback.
|
|
76
|
+
pass
|
|
77
|
+
return event
|
|
78
|
+
|
|
79
|
+
def add_tool_call(self, record: ToolCallRecord) -> None:
|
|
80
|
+
self.tool_calls.append(record)
|
|
81
|
+
self.emit("tool_result", {
|
|
82
|
+
"tool": record.tool,
|
|
83
|
+
"success": bool(record.result.get("success")),
|
|
84
|
+
"elapsed_ms": record.elapsed_ms,
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
def add_turn_result(self, record: Dict[str, Any]) -> TurnResultRecord:
|
|
88
|
+
turn = TurnResultRecord(
|
|
89
|
+
status=str(record.get("status", "")),
|
|
90
|
+
success=bool(record.get("success")),
|
|
91
|
+
cancelled=bool(record.get("cancelled")),
|
|
92
|
+
provider=str(record.get("provider", "")),
|
|
93
|
+
error=str(record.get("error", "")),
|
|
94
|
+
final_text=str(record.get("final_text", "")),
|
|
95
|
+
summary=str(record.get("summary", "")),
|
|
96
|
+
metadata=dict(record.get("metadata") or {}),
|
|
97
|
+
)
|
|
98
|
+
self.turn_results.append(turn)
|
|
99
|
+
self.emit("turn_complete", {
|
|
100
|
+
"status": turn.status,
|
|
101
|
+
"success": turn.success,
|
|
102
|
+
"cancelled": turn.cancelled,
|
|
103
|
+
"provider": turn.provider,
|
|
104
|
+
"summary": turn.summary,
|
|
105
|
+
})
|
|
106
|
+
return turn
|
|
107
|
+
|
|
108
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
109
|
+
return {
|
|
110
|
+
"events": [event.to_dict() for event in self.events],
|
|
111
|
+
"tool_calls": [call.to_dict() for call in self.tool_calls],
|
|
112
|
+
"turn_results": [turn.to_dict() for turn in self.turn_results],
|
|
113
|
+
}
|