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,586 @@
|
|
|
1
|
+
"""Phase-3 bridge: run one chat turn through the shared ``runtime.run_agent``.
|
|
2
|
+
|
|
3
|
+
The documented runtime next step is to route the CLI tool loop through
|
|
4
|
+
``run_agent`` and keep aria_cli as orchestration glue. This module is that engine
|
|
5
|
+
— the two adapters run_agent needs plus a thin driver:
|
|
6
|
+
|
|
7
|
+
• build_tool_executor() — wraps the CLI's ``LOCAL_TOOLS`` ({name: (handler, schema)})
|
|
8
|
+
• make_provider_fn() — selects the provider (chat_routing) + streams it
|
|
9
|
+
• run_chat_via_runtime() — drives run_agent, renders via callbacks, returns text
|
|
10
|
+
|
|
11
|
+
This is THE chat path: ``send_message`` runs every turn through it (the old
|
|
12
|
+
inline per-round loop was retired in 2026-07 after the runtime path was
|
|
13
|
+
validated with real turns). Tool approval and execution context are threaded
|
|
14
|
+
through to run_agent's tool loop; on failure send_message attempts one direct
|
|
15
|
+
cloud rescue (``providers/llm/registry.stream_cloud_fallback``) before
|
|
16
|
+
presenting the error.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
from typing import Any, Callable, List, Optional
|
|
22
|
+
|
|
23
|
+
from .chat_routing import first_round_route, is_placeholder_response, should_fallback
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def build_tool_executor(
|
|
27
|
+
local_tools,
|
|
28
|
+
config: Optional[dict] = None,
|
|
29
|
+
execution_context: Optional[Callable[[], dict]] = None,
|
|
30
|
+
):
|
|
31
|
+
"""Wrap the CLI's LOCAL_TOOLS registry for run_agent."""
|
|
32
|
+
from aria_code.runtime.tool_executor import ToolExecutor
|
|
33
|
+
return ToolExecutor(
|
|
34
|
+
local_tools,
|
|
35
|
+
config=config or {},
|
|
36
|
+
execution_context=execution_context,
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# Modes in which nothing can be written, so nothing can need verifying.
|
|
41
|
+
_READ_ONLY_MODES = frozenset({"read-only", "readonly", "read_only", "plan"})
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _declared_acceptance_commands(cfg: dict, message: str) -> tuple:
|
|
45
|
+
"""What this workspace says "correct" means for this particular message.
|
|
46
|
+
|
|
47
|
+
Precedence, most specific first:
|
|
48
|
+
|
|
49
|
+
1. ``acceptance_commands`` in the session config — the user said it out
|
|
50
|
+
loud for this session, so nothing overrides it.
|
|
51
|
+
2. The active domain packs' commands. A pack contributes only when it
|
|
52
|
+
resolved a concrete entity from *this* message, so a declared
|
|
53
|
+
logistics check cannot fire on a payments question.
|
|
54
|
+
3. The workspace's ``acceptance.default`` from ``.ariarc``.
|
|
55
|
+
|
|
56
|
+
Nothing declared falls through to inference from the changed files, which
|
|
57
|
+
is the behaviour that existed before packs could speak here at all.
|
|
58
|
+
"""
|
|
59
|
+
explicit = tuple(cfg.get("acceptance_commands") or ())
|
|
60
|
+
if explicit:
|
|
61
|
+
return explicit
|
|
62
|
+
|
|
63
|
+
commands: list = []
|
|
64
|
+
try:
|
|
65
|
+
from aria_code.packs import (
|
|
66
|
+
activate_packs,
|
|
67
|
+
active_acceptance_commands,
|
|
68
|
+
load_builtin_packs,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
load_builtin_packs()
|
|
72
|
+
commands.extend(active_acceptance_commands(activate_packs(message or "")))
|
|
73
|
+
except Exception:
|
|
74
|
+
pass
|
|
75
|
+
|
|
76
|
+
try:
|
|
77
|
+
from aria_code.packs.rules import default_acceptance_commands
|
|
78
|
+
|
|
79
|
+
for command in default_acceptance_commands():
|
|
80
|
+
if command not in commands:
|
|
81
|
+
commands.append(command)
|
|
82
|
+
except Exception:
|
|
83
|
+
pass
|
|
84
|
+
|
|
85
|
+
return tuple(commands)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def _workspace_root(cfg: dict, executor=None) -> str:
|
|
89
|
+
"""Where this turn's tools act: the executor's workspace if it names one."""
|
|
90
|
+
import os
|
|
91
|
+
|
|
92
|
+
root = cfg.get("_session_workspace_root") or cfg.get("workspace_root") or os.getcwd()
|
|
93
|
+
if getattr(executor, "execution_context", None) is not None:
|
|
94
|
+
root = dict(executor.execution_context() or {}).get("_workspace") or root
|
|
95
|
+
return str(root)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def build_acceptance_gate(executor, config: Optional[dict] = None, message: str = ""):
|
|
99
|
+
"""The CLI's acceptance gate, or ``None`` when this session shouldn't have one.
|
|
100
|
+
|
|
101
|
+
The gate runs its checks through the session's own ``run_command`` tool
|
|
102
|
+
rather than spawning subprocesses itself, so the workspace sandbox, the
|
|
103
|
+
command policy and the trace all apply to a verification run exactly as
|
|
104
|
+
they apply to a command the model asked for.
|
|
105
|
+
|
|
106
|
+
``user_approved`` is set because the commands are the *planner's*, not the
|
|
107
|
+
model's or the user's prose — the same inferred plan ``/verify`` already
|
|
108
|
+
runs on request. Anything else would put an approval prompt between the
|
|
109
|
+
model finishing and the check that tells us whether it finished correctly,
|
|
110
|
+
which is the one place a prompt cannot help.
|
|
111
|
+
"""
|
|
112
|
+
cfg = config or {}
|
|
113
|
+
if not cfg.get("acceptance_gate", True):
|
|
114
|
+
return None
|
|
115
|
+
mode = str(cfg.get("permission_mode", "workspace-write") or "")
|
|
116
|
+
if mode in _READ_ONLY_MODES:
|
|
117
|
+
return None
|
|
118
|
+
if "run_command" not in getattr(executor, "local_tools", {}):
|
|
119
|
+
return None
|
|
120
|
+
|
|
121
|
+
from aria_code.runtime.acceptance import AcceptanceGate
|
|
122
|
+
from aria_code.runtime.approval import ApprovalDecision
|
|
123
|
+
|
|
124
|
+
timeout = int(cfg.get("acceptance_timeout", 300) or 300)
|
|
125
|
+
root = _workspace_root(cfg, executor)
|
|
126
|
+
|
|
127
|
+
def _runner(command: str) -> dict:
|
|
128
|
+
return executor.execute_local("run_command", {
|
|
129
|
+
"command": command,
|
|
130
|
+
"cwd": str(root),
|
|
131
|
+
"timeout": timeout,
|
|
132
|
+
}, approval=ApprovalDecision.allow(policy="balanced", user_approved=True))
|
|
133
|
+
|
|
134
|
+
return AcceptanceGate(
|
|
135
|
+
runner=_runner,
|
|
136
|
+
root=root,
|
|
137
|
+
max_attempts=int(cfg.get("acceptance_max_attempts", 2) or 2),
|
|
138
|
+
commands=_declared_acceptance_commands(cfg, message),
|
|
139
|
+
baseline=_build_baseline(executor, cfg, timeout),
|
|
140
|
+
revision_inputs=cfg.get("acceptance_revision_inputs") or (),
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def _build_baseline(executor, cfg: dict, timeout: int):
|
|
145
|
+
"""Reruns a failed check on the code before the change; None when off.
|
|
146
|
+
|
|
147
|
+
In a task worktree the "before" is the task's starting snapshot, in the
|
|
148
|
+
user's own repository. Otherwise it is the working tree with this turn's
|
|
149
|
+
edits undone from the checkpoints recorded after this point.
|
|
150
|
+
"""
|
|
151
|
+
if not cfg.get("test_baseline", True):
|
|
152
|
+
return None
|
|
153
|
+
try:
|
|
154
|
+
import os
|
|
155
|
+
|
|
156
|
+
from aria_code.packages.aria_core.paths import aria_home
|
|
157
|
+
from aria_code.runtime.approval import ApprovalDecision
|
|
158
|
+
from aria_code.runtime.baseline import Baseline
|
|
159
|
+
from aria_code.runtime.checkpoints import CheckpointStore
|
|
160
|
+
|
|
161
|
+
context = dict(executor.execution_context() or {}) if getattr(executor, "execution_context", None) else {}
|
|
162
|
+
base_commit = str(context.get("_task_base") or "")
|
|
163
|
+
workspace = cfg.get("_session_workspace_root") or os.getcwd()
|
|
164
|
+
|
|
165
|
+
def run(command: str, cwd: str) -> dict:
|
|
166
|
+
return executor.execute_local("run_command", {"command": command, "cwd": cwd, "timeout": timeout},
|
|
167
|
+
approval=ApprovalDecision.allow(policy="balanced", user_approved=True))
|
|
168
|
+
|
|
169
|
+
return Baseline(
|
|
170
|
+
workspace, run=run, base_commit=base_commit,
|
|
171
|
+
undo_since=None if base_commit else CheckpointStore().max_sequence(),
|
|
172
|
+
session_id=str(context.get("_session_id") or ""),
|
|
173
|
+
scratch_root=aria_home() / "worktrees" / "baselines",
|
|
174
|
+
)
|
|
175
|
+
except Exception:
|
|
176
|
+
return None
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def build_change_contract(config: Optional[dict] = None, message: str = "", executor=None):
|
|
180
|
+
"""The project's change contract with this request as its goal, or None.
|
|
181
|
+
|
|
182
|
+
Declared in ``.aria/policy.yaml`` under the workspace root. A file that
|
|
183
|
+
cannot be read yields a fail-closed contract rather than none — see
|
|
184
|
+
``ChangeContract.fail_closed``.
|
|
185
|
+
"""
|
|
186
|
+
from aria_code.runtime.contract import ChangeContract, ContractError
|
|
187
|
+
|
|
188
|
+
root = _workspace_root(config or {}, executor)
|
|
189
|
+
try:
|
|
190
|
+
contract = ChangeContract.load(root)
|
|
191
|
+
except ContractError as exc:
|
|
192
|
+
contract = ChangeContract.fail_closed(root, str(exc))
|
|
193
|
+
except Exception as exc: # unreadable file, missing yaml, …: still fail closed
|
|
194
|
+
contract = ChangeContract.fail_closed(root, f"{type(exc).__name__}: {exc}")
|
|
195
|
+
return contract.with_goal(message) if contract is not None else None
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def build_review_gate(config: Optional[dict] = None, *, model: str, api_url: Optional[str],
|
|
199
|
+
ollama_url: str, thinking_mode: str = "auto", auth_token: Optional[str] = None):
|
|
200
|
+
"""The independent reviewer for this turn, or None unless review_gate is on.
|
|
201
|
+
|
|
202
|
+
Fresh context: no history, no tools, no project context — the reviewer
|
|
203
|
+
judges the diff it is given, not the conversation that made it. By default
|
|
204
|
+
it is the same model; ``review_model`` (``anthropic/claude-sonnet-5-5``,
|
|
205
|
+
``openai/...``, ``google/...``) hands the review to a different one, so the
|
|
206
|
+
model that wrote the change is not also the one that approves it. That sends
|
|
207
|
+
the diff, the goal and the check results to that provider, which is why it
|
|
208
|
+
is a setting and never a default.
|
|
209
|
+
"""
|
|
210
|
+
cfg = config or {}
|
|
211
|
+
if not cfg.get("review_gate", False):
|
|
212
|
+
return None
|
|
213
|
+
if str(cfg.get("permission_mode", "workspace-write") or "") in _READ_ONLY_MODES:
|
|
214
|
+
return None
|
|
215
|
+
from aria_code.runtime.review import REVIEWER_SYSTEM, ReviewGate
|
|
216
|
+
|
|
217
|
+
other = str(cfg.get("review_model") or "").strip()
|
|
218
|
+
separate = bool(other) and other != model
|
|
219
|
+
reviewer_fn = make_provider_fn(
|
|
220
|
+
model=other if separate else model, config=cfg,
|
|
221
|
+
# A separate reviewer names its own provider, so it must not go through the
|
|
222
|
+
# builder's Aria backend (api_url) or its auth token.
|
|
223
|
+
api_url=None if separate else api_url, ollama_url=ollama_url,
|
|
224
|
+
tool_schemas=[], thinking_mode=thinking_mode, auth_token=None if separate else auth_token,
|
|
225
|
+
system_override=REVIEWER_SYSTEM,
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
async def _review(prompt: str) -> str:
|
|
229
|
+
result = await reviewer_fn(prompt, [])
|
|
230
|
+
if not result.get("success", True):
|
|
231
|
+
raise RuntimeError(result.get("error") or "reviewer call failed")
|
|
232
|
+
return str(result.get("response") or "")
|
|
233
|
+
|
|
234
|
+
try:
|
|
235
|
+
attempts = int(cfg.get("review_max_attempts", 1))
|
|
236
|
+
except (TypeError, ValueError):
|
|
237
|
+
attempts = 1
|
|
238
|
+
return ReviewGate(reviewer=_review, max_attempts=max(0, attempts), reviewer_name=other if separate else "")
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
async def run_with_fallback(
|
|
242
|
+
route: str,
|
|
243
|
+
*,
|
|
244
|
+
run_cloud: Callable,
|
|
245
|
+
run_ollama: Callable,
|
|
246
|
+
on_token: Optional[Callable[[str], None]] = None,
|
|
247
|
+
) -> dict:
|
|
248
|
+
"""Primary generation per ``route``, with cloud→Ollama fallback parity.
|
|
249
|
+
|
|
250
|
+
Mirrors ``send_message``'s inline fallback, but keyed on *route* (via
|
|
251
|
+
``should_fallback``) so a genuinely-good forced-backend answer is kept
|
|
252
|
+
instead of being discarded and re-run:
|
|
253
|
+
|
|
254
|
+
• ``skip`` / ``ollama`` → run local Ollama directly (no cloud round)
|
|
255
|
+
• ``cloud`` → run cloud; if it fails or returns an empty answer,
|
|
256
|
+
fall back to
|
|
257
|
+
local Ollama
|
|
258
|
+
|
|
259
|
+
``run_cloud`` / ``run_ollama`` are async ``(on_token) -> result dict``
|
|
260
|
+
closures; injecting them keeps this orchestration unit-testable without
|
|
261
|
+
real providers or network.
|
|
262
|
+
"""
|
|
263
|
+
if route in ("skip", "ollama", "configured"):
|
|
264
|
+
return await run_ollama(on_token)
|
|
265
|
+
|
|
266
|
+
# Route == "cloud": track streamed chunks for telemetry only. A response
|
|
267
|
+
# delivered in one final event is still a valid answer.
|
|
268
|
+
_tokens = [0]
|
|
269
|
+
|
|
270
|
+
def _counting_on_token(tok: str) -> None:
|
|
271
|
+
_tokens[0] += 1
|
|
272
|
+
if on_token is not None:
|
|
273
|
+
on_token(tok)
|
|
274
|
+
|
|
275
|
+
result = await run_cloud(_counting_on_token)
|
|
276
|
+
if result.get("cancelled"):
|
|
277
|
+
return result # user-cancelled — never silently re-run on a different provider
|
|
278
|
+
|
|
279
|
+
placeholder = is_placeholder_response(result.get("response", ""), _tokens[0])
|
|
280
|
+
if should_fallback("cloud", result, is_placeholder=placeholder):
|
|
281
|
+
return await run_ollama(on_token)
|
|
282
|
+
return result
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
def make_provider_fn(
|
|
286
|
+
*,
|
|
287
|
+
model: str,
|
|
288
|
+
config: dict,
|
|
289
|
+
api_url: Optional[str],
|
|
290
|
+
ollama_url: str,
|
|
291
|
+
tool_schemas: List[dict],
|
|
292
|
+
thinking_mode: str = "auto",
|
|
293
|
+
user_context: Optional[dict] = None,
|
|
294
|
+
auth_token: Optional[str] = None,
|
|
295
|
+
project_context: Any = None,
|
|
296
|
+
system_override: Optional[str] = None,
|
|
297
|
+
) -> Callable:
|
|
298
|
+
"""Build an async ``provider_fn`` for run_agent.
|
|
299
|
+
|
|
300
|
+
Selects the provider per chat_routing (cloud → AriaSSE backend; ollama/skip →
|
|
301
|
+
local Ollama) and streams it through the shared ``stream_provider_result``.
|
|
302
|
+
A pending system-role override is threaded the same way ``send_message`` does
|
|
303
|
+
it: cloud via ``user_context['system_role_override']``, Ollama via the
|
|
304
|
+
provider's ``system_override`` argument.
|
|
305
|
+
"""
|
|
306
|
+
# Event identity is part of the streaming contract. Importing the bare
|
|
307
|
+
# compatibility root creates a second LLMToken/LLMDone class, which the
|
|
308
|
+
# SDK's isinstance checks silently discard even when the API answered.
|
|
309
|
+
from aria_code.apps.cli.providers.base import AriaSSEProvider, ConfiguredProvider, OllamaProvider
|
|
310
|
+
from aria_code.packages.aria_sdk.streaming import stream_provider_result
|
|
311
|
+
|
|
312
|
+
from aria_code.memory_manager import MemoryManager
|
|
313
|
+
account_context = MemoryManager(config=config).load_context(max_chars=1000)
|
|
314
|
+
_cloud_uctx = dict(user_context or {})
|
|
315
|
+
if account_context and not system_override:
|
|
316
|
+
_cloud_uctx["account_memory"] = account_context
|
|
317
|
+
if system_override:
|
|
318
|
+
_cloud_uctx["system_role_override"] = system_override
|
|
319
|
+
|
|
320
|
+
task_prompt: Optional[str] = None
|
|
321
|
+
|
|
322
|
+
def _scoped_tools(prompt: str) -> List[dict]:
|
|
323
|
+
"""Tools this message may use: core always, domain only when claimed."""
|
|
324
|
+
try:
|
|
325
|
+
from aria_code.apps.cli.tool_scope import select_tool_schemas
|
|
326
|
+
|
|
327
|
+
return select_tool_schemas(tool_schemas, task_prompt if task_prompt is not None else prompt, allow_social_tools=bool((system_override or "").strip()))
|
|
328
|
+
except Exception:
|
|
329
|
+
return list(tool_schemas)
|
|
330
|
+
|
|
331
|
+
def _system_for(prompt: str) -> str:
|
|
332
|
+
"""The rules this turn runs under, for the non-Ollama providers.
|
|
333
|
+
|
|
334
|
+
ollama_stream assembles its own (with prefetched data and sized
|
|
335
|
+
project context); everything else used to get nothing at all, so a
|
|
336
|
+
cloud model was never told the tool discipline. Built per message
|
|
337
|
+
because the right prompt depends on what was asked.
|
|
338
|
+
"""
|
|
339
|
+
try:
|
|
340
|
+
from aria_code.apps.cli.prompts.select import build_turn_system_prompt
|
|
341
|
+
|
|
342
|
+
return build_turn_system_prompt(
|
|
343
|
+
task_prompt if task_prompt is not None else prompt,
|
|
344
|
+
override=system_override,
|
|
345
|
+
project_context="\n\n".join(filter(None, [str(project_context or ""), account_context])),
|
|
346
|
+
)
|
|
347
|
+
except Exception:
|
|
348
|
+
return system_override or ""
|
|
349
|
+
|
|
350
|
+
async def _provider_fn(prompt, history, *, on_token=None, on_thinking=None,
|
|
351
|
+
on_tool_call=None, on_tool_result=None, on_status=None,
|
|
352
|
+
cancel_event=None):
|
|
353
|
+
nonlocal task_prompt
|
|
354
|
+
if task_prompt is None:
|
|
355
|
+
task_prompt = prompt
|
|
356
|
+
route = first_round_route(model, config, api_url)
|
|
357
|
+
|
|
358
|
+
# ollama_stream does its own intent-based selection; the other
|
|
359
|
+
# providers had none, so a coding turn reached Gemini carrying all 74
|
|
360
|
+
# tool schemas including 34 domain tools. Scoped per message because
|
|
361
|
+
# what a turn may call depends on what it asked.
|
|
362
|
+
_scoped = _scoped_tools(prompt)
|
|
363
|
+
|
|
364
|
+
async def _stream(provider, _on_token):
|
|
365
|
+
return await stream_provider_result(
|
|
366
|
+
provider, prompt, history, tools=_scoped,
|
|
367
|
+
cancel_event=cancel_event, on_token=_on_token, on_thinking=on_thinking,
|
|
368
|
+
on_tool_call=on_tool_call, on_tool_result=on_tool_result, on_status=on_status,
|
|
369
|
+
)
|
|
370
|
+
|
|
371
|
+
async def run_cloud(_on_token):
|
|
372
|
+
return await _stream(
|
|
373
|
+
AriaSSEProvider(
|
|
374
|
+
api_url, model, thinking_mode=thinking_mode,
|
|
375
|
+
user_context=_cloud_uctx, auth_token=auth_token,
|
|
376
|
+
project_context="\n\n".join(filter(None, [str(project_context or ""), account_context])),
|
|
377
|
+
use_react_gateway=bool(config.get("arthera_react_gateway")),
|
|
378
|
+
local_tools=bool(config.get("backend_local_tools")),
|
|
379
|
+
),
|
|
380
|
+
_on_token,
|
|
381
|
+
)
|
|
382
|
+
|
|
383
|
+
async def run_ollama(_on_token):
|
|
384
|
+
if route == "ollama":
|
|
385
|
+
# stream_ollama still borrows 12 names from aria_cli's module
|
|
386
|
+
# globals and only resolves them after that module's import-time
|
|
387
|
+
# rebind, so an out-of-CLI caller has to import it first. Doing
|
|
388
|
+
# it here rather than at the caller's import time means only the
|
|
389
|
+
# route that needs it pays: measured, `import aria_cli` is 1766ms
|
|
390
|
+
# against 63ms for the daemon's own dependencies, and a
|
|
391
|
+
# Vertex/Gemini config routes to "configured", which never
|
|
392
|
+
# touches stream_ollama. The daemon was paying 1.7s to forward an
|
|
393
|
+
# alert it then analysed through the cloud.
|
|
394
|
+
#
|
|
395
|
+
# Idempotent and cached by sys.modules, so the second alert pays
|
|
396
|
+
# nothing. Inside the function, not the module, because importing
|
|
397
|
+
# aria_cli at this module's import time would put the cost back
|
|
398
|
+
# on every consumer.
|
|
399
|
+
import aria_cli # noqa: F401 (side effect: rebinds stream_ollama)
|
|
400
|
+
|
|
401
|
+
selected = (
|
|
402
|
+
OllamaProvider(ollama_url, model, system_override=system_override,
|
|
403
|
+
**({"include_ambient_context": False} if config.get("_delegate_context_only") else {}))
|
|
404
|
+
if route == "ollama" else
|
|
405
|
+
ConfiguredProvider(config, model, system_override=_system_for(prompt))
|
|
406
|
+
)
|
|
407
|
+
return await _stream(
|
|
408
|
+
selected,
|
|
409
|
+
_on_token,
|
|
410
|
+
)
|
|
411
|
+
|
|
412
|
+
return await run_with_fallback(
|
|
413
|
+
route, run_cloud=run_cloud, run_ollama=run_ollama, on_token=on_token,
|
|
414
|
+
)
|
|
415
|
+
|
|
416
|
+
return _provider_fn
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
async def run_chat_via_runtime(
|
|
420
|
+
*,
|
|
421
|
+
prompt: str,
|
|
422
|
+
history: list,
|
|
423
|
+
local_tools,
|
|
424
|
+
tool_schemas: List[dict],
|
|
425
|
+
model: str,
|
|
426
|
+
config: dict,
|
|
427
|
+
api_url: Optional[str],
|
|
428
|
+
ollama_url: str,
|
|
429
|
+
cancel_event=None,
|
|
430
|
+
on_token: Optional[Callable[[str], None]] = None,
|
|
431
|
+
on_thinking: Optional[Callable[[str], None]] = None,
|
|
432
|
+
on_tool_call: Optional[Callable[[str, dict], None]] = None,
|
|
433
|
+
on_tool_result: Optional[Callable[[str, dict], None]] = None,
|
|
434
|
+
on_status: Optional[Callable[[str, str], None]] = None,
|
|
435
|
+
thinking_mode: str = "auto",
|
|
436
|
+
user_context: Optional[dict] = None,
|
|
437
|
+
auth_token: Optional[str] = None,
|
|
438
|
+
project_context: Any = None,
|
|
439
|
+
system_override: Optional[str] = None,
|
|
440
|
+
max_rounds: int = 30,
|
|
441
|
+
return_result: bool = False,
|
|
442
|
+
execution_context: Optional[Callable[[], dict]] = None,
|
|
443
|
+
confirm_tools=(),
|
|
444
|
+
approval_callback: Optional[Callable] = None,
|
|
445
|
+
approval_applier: Optional[Callable] = None,
|
|
446
|
+
requires_evidence: bool = False,
|
|
447
|
+
grounding_tools=(),
|
|
448
|
+
evidence_already_grounded: bool = False,
|
|
449
|
+
tool_record_sink: Optional[Callable] = None,
|
|
450
|
+
):
|
|
451
|
+
"""Run one chat turn through the shared runtime Gateway.
|
|
452
|
+
|
|
453
|
+
This is the CLI *adapter* for ``runtime.gateway.run_turn``: it builds the
|
|
454
|
+
CLI's ``provider_fn`` (AriaSSE/Ollama selection + cloud→Ollama fallback) and
|
|
455
|
+
tool executor (the LOCAL_TOOLS registry), then hands them to the neutral
|
|
456
|
+
gateway, which drives ``run_agent`` and streams via the callbacks. By
|
|
457
|
+
default this returns assistant text for compatibility. ``return_result``
|
|
458
|
+
exposes the gateway result so terminal adapters can preserve provider and
|
|
459
|
+
usage metadata during final rendering.
|
|
460
|
+
"""
|
|
461
|
+
from aria_code.runtime.gateway import run_turn
|
|
462
|
+
from aria_code.apps.cli.workspace_route import workspace_config
|
|
463
|
+
from aria_code.apps.cli.conversation_policy import is_conversation_only_message
|
|
464
|
+
|
|
465
|
+
config = workspace_config(prompt, model, config, api_url)
|
|
466
|
+
social_only = not (system_override or "").strip() and is_conversation_only_message(prompt)
|
|
467
|
+
if social_only:
|
|
468
|
+
# Host-owned policy, also enforced at execution if a provider returns
|
|
469
|
+
# an unsolicited call despite receiving no schemas. Never save it.
|
|
470
|
+
config = {**config, "_conversation_only": True}
|
|
471
|
+
requires_evidence = False
|
|
472
|
+
grounding_tools = ()
|
|
473
|
+
tool_schemas = []
|
|
474
|
+
project_context = None
|
|
475
|
+
|
|
476
|
+
provider_fn = make_provider_fn(
|
|
477
|
+
model=model, config=config, api_url=api_url, ollama_url=ollama_url,
|
|
478
|
+
tool_schemas=tool_schemas, thinking_mode=thinking_mode,
|
|
479
|
+
user_context=user_context, auth_token=auth_token, project_context=project_context,
|
|
480
|
+
system_override=system_override,
|
|
481
|
+
)
|
|
482
|
+
executor = build_tool_executor(local_tools, config, execution_context)
|
|
483
|
+
gate = None if social_only else build_acceptance_gate(executor, config, prompt)
|
|
484
|
+
contract = None if social_only else build_change_contract(config, prompt, executor)
|
|
485
|
+
review = None if social_only else build_review_gate(config, model=model, api_url=api_url, ollama_url=ollama_url,
|
|
486
|
+
thinking_mode=thinking_mode, auth_token=auth_token)
|
|
487
|
+
|
|
488
|
+
try:
|
|
489
|
+
result = await run_turn(
|
|
490
|
+
prompt, history,
|
|
491
|
+
provider_fn=provider_fn, tool_executor=executor,
|
|
492
|
+
tool_schemas=list(tool_schemas),
|
|
493
|
+
on_token=on_token, on_thinking=on_thinking,
|
|
494
|
+
on_tool_call=on_tool_call, on_tool_result=on_tool_result, on_status=on_status,
|
|
495
|
+
cancel_event=cancel_event, max_rounds=max_rounds,
|
|
496
|
+
confirm_tools=confirm_tools,
|
|
497
|
+
approval_callback=approval_callback,
|
|
498
|
+
approval_applier=approval_applier,
|
|
499
|
+
requires_evidence=requires_evidence,
|
|
500
|
+
grounding_tools=grounding_tools,
|
|
501
|
+
evidence_already_grounded=evidence_already_grounded,
|
|
502
|
+
acceptance=gate,
|
|
503
|
+
contract=contract,
|
|
504
|
+
review=review,
|
|
505
|
+
)
|
|
506
|
+
finally:
|
|
507
|
+
if tool_record_sink is not None:
|
|
508
|
+
for record in executor.trace.tool_calls:
|
|
509
|
+
tool_record_sink(record)
|
|
510
|
+
return result if return_result else result.text
|
|
511
|
+
|
|
512
|
+
|
|
513
|
+
def subagent_run_options(config: dict, task: Any) -> tuple[dict, dict]:
|
|
514
|
+
"""The config and execution context a background task's turn runs under.
|
|
515
|
+
|
|
516
|
+
A task names its own workspace (its worktree, for an isolated one) and its
|
|
517
|
+
own mode; the session's are not its. Without this the runner sent every
|
|
518
|
+
task's tools to the session's directory, whatever the task said.
|
|
519
|
+
"""
|
|
520
|
+
cfg = dict(config or {})
|
|
521
|
+
cfg["_delegate_context_only"] = True
|
|
522
|
+
mode = str(getattr(task, "mode", "") or "read-only")
|
|
523
|
+
if mode != "read-only" and cfg.get("permission_mode") in _READ_ONLY_MODES:
|
|
524
|
+
raise PermissionError("A child cannot exceed the parent permission mode")
|
|
525
|
+
cfg["permission_mode"] = "read-only" if mode == "read-only" else "workspace-write"
|
|
526
|
+
context: dict = {"_session_id": str(getattr(task, "session_id", "") or "")}
|
|
527
|
+
workspace = str(getattr(task, "workspace", "") or "")
|
|
528
|
+
if workspace:
|
|
529
|
+
cfg["_session_workspace_root"] = workspace
|
|
530
|
+
context["_workspace"] = workspace
|
|
531
|
+
spec = getattr(task, "worktree_spec", None)
|
|
532
|
+
if spec is not None:
|
|
533
|
+
context["_workspace_origin"] = str(spec.repository)
|
|
534
|
+
context["_workspace_restricted"] = True
|
|
535
|
+
return cfg, context
|
|
536
|
+
|
|
537
|
+
|
|
538
|
+
async def run_subagent_turn(prompt: str, task: Any, *, local_tools, tool_schemas: List[dict],
|
|
539
|
+
config: dict, api_url: Optional[str]) -> str:
|
|
540
|
+
"""Run one background task through the same runtime as a chat turn."""
|
|
541
|
+
cfg, context = subagent_run_options(config, task)
|
|
542
|
+
from aria_code.runtime.agent_profiles import get_profile
|
|
543
|
+
profile = get_profile(str(getattr(task, "agent", "general")))
|
|
544
|
+
delegation = {"spawn_task", "task_cancel", "task_status", "task_result", "task_list", "list_agents", "list_task_context"}
|
|
545
|
+
allowed = set(local_tools) - delegation
|
|
546
|
+
if profile.tools is not None:
|
|
547
|
+
allowed.intersection_update(profile.tools)
|
|
548
|
+
if "_agent_allowed_tools" in cfg:
|
|
549
|
+
allowed.intersection_update(cfg["_agent_allowed_tools"])
|
|
550
|
+
cfg["_agent_allowed_tools"] = sorted(allowed)
|
|
551
|
+
tools = {name: value for name, value in local_tools.items() if name in allowed}
|
|
552
|
+
schemas = [s for s in tool_schemas if (s.get("function") or s).get("name") in allowed]
|
|
553
|
+
from aria_code.runtime.task_context import CONTEXT_POLICY
|
|
554
|
+
from aria_code.runtime.task_verification import MAX_RECEIPTS, receipt_from_record
|
|
555
|
+
|
|
556
|
+
def record_evidence(record):
|
|
557
|
+
if task is None:
|
|
558
|
+
return
|
|
559
|
+
if not hasattr(task, "evidence"):
|
|
560
|
+
task.evidence = []
|
|
561
|
+
if len(task.evidence) >= MAX_RECEIPTS:
|
|
562
|
+
task.evidence_truncated = True
|
|
563
|
+
return
|
|
564
|
+
task.evidence.append(receipt_from_record(record, str(getattr(task, "workspace", "") or ".")))
|
|
565
|
+
|
|
566
|
+
result = await run_chat_via_runtime(
|
|
567
|
+
prompt=prompt, history=[], local_tools=tools, tool_schemas=schemas,
|
|
568
|
+
model=str(cfg.get("model") or ""), config=cfg, api_url=api_url,
|
|
569
|
+
ollama_url=str(cfg.get("ollama_url") or "http://localhost:11434"),
|
|
570
|
+
execution_context=lambda: dict(context), return_result=True,
|
|
571
|
+
tool_record_sink=record_evidence,
|
|
572
|
+
max_rounds=min(int(getattr(task, "max_rounds", profile.max_rounds)), profile.max_rounds),
|
|
573
|
+
system_override=("You are a delegated Aria task agent. Stay within the task goal, available tools and inherited permissions. "
|
|
574
|
+
"Never delegate, publish, send messages, deploy or claim unexecuted checks. "
|
|
575
|
+
"End with FINDINGS: ...; CHANGED_FILES: ...; VERIFICATION: ...; BLOCKERS: ... . "
|
|
576
|
+
"Report actual source locations and executed checks; say when checks were not run.\n"
|
|
577
|
+
+ CONTEXT_POLICY + profile.instructions),
|
|
578
|
+
)
|
|
579
|
+
if getattr(result, "error", None):
|
|
580
|
+
raise RuntimeError(str(result.error))
|
|
581
|
+
final = getattr(result, "final", None)
|
|
582
|
+
if (getattr(result, "cancelled", False) or (final is not None and
|
|
583
|
+
(not getattr(final, "success", False) or (getattr(final, "acceptance", None) or {}).get("verified") is False))):
|
|
584
|
+
raise RuntimeError("The delegated runtime did not complete with accepted execution")
|
|
585
|
+
return str(getattr(result, "text", "") or "")
|
|
586
|
+
|