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,399 @@
|
|
|
1
|
+
"""EngineeringCommandsMixin — the everyday commands of a coding session.
|
|
2
|
+
|
|
3
|
+
/diff /commit /pr /checkpoint /worktree /graph /agents /build /test /fix
|
|
4
|
+
|
|
5
|
+
Most are a short name for something Aria already does: /diff is `/git` with a
|
|
6
|
+
patch, /worktree is `/task`, /checkpoint is `/rewind list`, /graph is `/impact`.
|
|
7
|
+
They exist because these are the words people reach for in Codex and Claude
|
|
8
|
+
Code, and because "/" should list them. The new work is small and lives in
|
|
9
|
+
:func:`detect_commands`, which finds a project's test, build and lint commands.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import asyncio
|
|
15
|
+
import json
|
|
16
|
+
import os
|
|
17
|
+
import re
|
|
18
|
+
import shlex
|
|
19
|
+
import shutil
|
|
20
|
+
import time
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
from typing import Dict, Optional
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _package_manager(root: Path) -> str:
|
|
26
|
+
if (root / "pnpm-lock.yaml").exists():
|
|
27
|
+
return "pnpm"
|
|
28
|
+
if (root / "yarn.lock").exists():
|
|
29
|
+
return "yarn"
|
|
30
|
+
return "npm"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _make_targets(root: Path) -> set:
|
|
34
|
+
for name in ("Makefile", "makefile", "GNUmakefile"):
|
|
35
|
+
path = root / name
|
|
36
|
+
if path.is_file():
|
|
37
|
+
try:
|
|
38
|
+
return set(re.findall(r"^([A-Za-z0-9_.-]+):", path.read_text(errors="ignore"), re.M))
|
|
39
|
+
except OSError:
|
|
40
|
+
return set()
|
|
41
|
+
return set()
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
_DECLARED_KINDS = ("test", "build", "lint", "sim")
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _is_ros2_workspace(root: Path) -> bool:
|
|
48
|
+
"""A colcon workspace (src/<pkg>/package.xml) or a single ROS 2 package."""
|
|
49
|
+
if (root / "package.xml").is_file():
|
|
50
|
+
return True
|
|
51
|
+
src = root / "src"
|
|
52
|
+
if not src.is_dir():
|
|
53
|
+
return False
|
|
54
|
+
try:
|
|
55
|
+
return any((child / "package.xml").is_file() for child in src.iterdir() if child.is_dir()) or any(
|
|
56
|
+
True for _ in src.glob("*/*/package.xml"))
|
|
57
|
+
except OSError:
|
|
58
|
+
return False
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def declared_commands(root) -> Dict[str, str]:
|
|
62
|
+
"""Commands the project states for itself in `.aria/project.yaml`:
|
|
63
|
+
|
|
64
|
+
commands:
|
|
65
|
+
test: ./scripts/test.sh
|
|
66
|
+
sim: ros2 launch my_robot sim_scenarios.launch.py
|
|
67
|
+
|
|
68
|
+
These win over anything detected. `sim` has no detection: running a robot
|
|
69
|
+
simulation is never guessed.
|
|
70
|
+
"""
|
|
71
|
+
path = Path(root) / ".aria" / "project.yaml"
|
|
72
|
+
if not path.is_file():
|
|
73
|
+
return {}
|
|
74
|
+
try:
|
|
75
|
+
import yaml
|
|
76
|
+
|
|
77
|
+
data = yaml.safe_load(path.read_text(encoding="utf-8")) or {}
|
|
78
|
+
except Exception:
|
|
79
|
+
return {}
|
|
80
|
+
block = data.get("commands") if isinstance(data, dict) else None
|
|
81
|
+
if not isinstance(block, dict):
|
|
82
|
+
return {}
|
|
83
|
+
return {k: v.strip() for k, v in block.items() if k in _DECLARED_KINDS and isinstance(v, str) and v.strip()}
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def detect_commands(root) -> Dict[str, str]:
|
|
87
|
+
"""The project's own test, build and lint commands: {"test": ..., "build": ..., "lint": ...}.
|
|
88
|
+
|
|
89
|
+
What `.aria/project.yaml` declares wins; otherwise read from what the
|
|
90
|
+
project has (ROS 2 packages, package.json scripts, Cargo.toml, go.mod,
|
|
91
|
+
pyproject.toml, Makefile targets), first match per kind. Nothing is
|
|
92
|
+
guessed for a kind the project does not declare. A colcon test run also
|
|
93
|
+
yields `test_report`, the command that prints its results.
|
|
94
|
+
"""
|
|
95
|
+
root = Path(root)
|
|
96
|
+
found: Dict[str, str] = {}
|
|
97
|
+
|
|
98
|
+
def set_(kind: str, command: str) -> None:
|
|
99
|
+
found.setdefault(kind, command)
|
|
100
|
+
|
|
101
|
+
if _is_ros2_workspace(root):
|
|
102
|
+
# colcon test only runs; the verdicts are in `colcon test-result`.
|
|
103
|
+
set_("build", "colcon build")
|
|
104
|
+
set_("test", "colcon test")
|
|
105
|
+
found["test_report"] = "colcon test-result --verbose"
|
|
106
|
+
|
|
107
|
+
package = root / "package.json"
|
|
108
|
+
if package.is_file():
|
|
109
|
+
try:
|
|
110
|
+
scripts = json.loads(package.read_text(encoding="utf-8")).get("scripts") or {}
|
|
111
|
+
except (OSError, ValueError):
|
|
112
|
+
scripts = {}
|
|
113
|
+
pm = _package_manager(root)
|
|
114
|
+
if "test" in scripts:
|
|
115
|
+
set_("test", f"{pm} test")
|
|
116
|
+
if "build" in scripts:
|
|
117
|
+
set_("build", f"{pm} run build")
|
|
118
|
+
if "lint" in scripts:
|
|
119
|
+
set_("lint", f"{pm} run lint")
|
|
120
|
+
if (root / "Cargo.toml").is_file():
|
|
121
|
+
set_("test", "cargo test")
|
|
122
|
+
set_("build", "cargo build")
|
|
123
|
+
set_("lint", "cargo clippy --all-targets")
|
|
124
|
+
if (root / "go.mod").is_file():
|
|
125
|
+
set_("test", "go test ./...")
|
|
126
|
+
set_("build", "go build ./...")
|
|
127
|
+
set_("lint", "go vet ./...")
|
|
128
|
+
pyproject = root / "pyproject.toml"
|
|
129
|
+
py_text = ""
|
|
130
|
+
if pyproject.is_file():
|
|
131
|
+
try:
|
|
132
|
+
py_text = pyproject.read_text(encoding="utf-8", errors="ignore")
|
|
133
|
+
except OSError:
|
|
134
|
+
py_text = ""
|
|
135
|
+
if py_text or (root / "setup.py").is_file() or (root / "pytest.ini").is_file() or (root / "tests").is_dir():
|
|
136
|
+
if "pytest" in py_text or (root / "pytest.ini").is_file() or (root / "tests").is_dir():
|
|
137
|
+
set_("test", "python3 -m pytest -q")
|
|
138
|
+
if "[build-system]" in py_text:
|
|
139
|
+
set_("build", "python3 -m build")
|
|
140
|
+
if "ruff" in py_text or (root / "ruff.toml").is_file():
|
|
141
|
+
set_("lint", "ruff check .")
|
|
142
|
+
targets = _make_targets(root)
|
|
143
|
+
for kind in ("test", "build", "lint"):
|
|
144
|
+
if kind in targets:
|
|
145
|
+
set_(kind, f"make {kind}")
|
|
146
|
+
declared = declared_commands(root)
|
|
147
|
+
found.update(declared)
|
|
148
|
+
if "test" in declared:
|
|
149
|
+
found.pop("test_report", None) # the project's own test command reports for itself
|
|
150
|
+
return found
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def fix_prompt(description: str, commands: Dict[str, str]) -> str:
|
|
154
|
+
"""What /fix asks the model to do: find the cause, change as little as possible, check, repair."""
|
|
155
|
+
checks = ", ".join(f"`{c}`" for c in (commands.get("test"), commands.get("lint")) if c)
|
|
156
|
+
run = f" Run {checks} when you are done." if checks else " Run the project's checks when you are done."
|
|
157
|
+
return (
|
|
158
|
+
f"Fix this: {description.strip()}\n\n"
|
|
159
|
+
"Find the cause first: read the code involved and reproduce the problem if you can. "
|
|
160
|
+
"Make the smallest change that fixes it; do not refactor unrelated code."
|
|
161
|
+
f"{run} If your change broke something, repair it."
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def _tail(text: str, lines: int = 30) -> str:
|
|
166
|
+
rows = (text or "").rstrip().splitlines()
|
|
167
|
+
cut = len(rows) - lines
|
|
168
|
+
return ("… +%d lines\n" % cut if cut > 0 else "") + "\n".join(rows[-lines:])
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
class EngineeringCommandsMixin:
|
|
172
|
+
# ── output ──────────────────────────────────────────────────────────────
|
|
173
|
+
def _eng_say(self, text: str, style: str = "") -> None:
|
|
174
|
+
console = self.context.console
|
|
175
|
+
if self.context.has_rich:
|
|
176
|
+
from rich.markup import escape
|
|
177
|
+
|
|
178
|
+
body = escape(text)
|
|
179
|
+
console.print(f"[{style}]{body}[/{style}]" if style else body, highlight=False)
|
|
180
|
+
else:
|
|
181
|
+
print(text)
|
|
182
|
+
|
|
183
|
+
def _eng_note_shadow(self, name: str) -> None:
|
|
184
|
+
"""A project workflow with this command's name is not shadowed in silence.
|
|
185
|
+
|
|
186
|
+
Built-in commands win over `.aria/workflows/<name>.yaml` (a repository
|
|
187
|
+
file must not replace a command the user knows), but `/test`, `/build`
|
|
188
|
+
and `/fix` are names projects plausibly gave their own workflows, so
|
|
189
|
+
say how to reach it.
|
|
190
|
+
"""
|
|
191
|
+
try:
|
|
192
|
+
shadowed = self._workflow_named("/" + name)
|
|
193
|
+
except Exception:
|
|
194
|
+
shadowed = False
|
|
195
|
+
if shadowed:
|
|
196
|
+
self._eng_say(f"Note: this project also has a workflow named '{name}'; run it with /workflow run {name}.", "dim")
|
|
197
|
+
|
|
198
|
+
def _eng_root(self) -> str:
|
|
199
|
+
return self.terminal.config.get("_session_workspace_root") or os.getcwd()
|
|
200
|
+
|
|
201
|
+
async def _eng_call(self, handler, *args):
|
|
202
|
+
"""Run another command, which may be sync or async."""
|
|
203
|
+
result = handler(*args)
|
|
204
|
+
if asyncio.iscoroutine(result):
|
|
205
|
+
await result
|
|
206
|
+
|
|
207
|
+
def _eng_run(self, command: str, *, timeout: int = 600) -> dict:
|
|
208
|
+
# The wrapper lives in tool_executor; importing it from aria_cli would add a
|
|
209
|
+
# reverse dependency (tests/test_import_graph_budget.py forbids growing them).
|
|
210
|
+
from aria_code.apps.cli.tool_executor import _tool_run_command
|
|
211
|
+
|
|
212
|
+
return _tool_run_command({
|
|
213
|
+
"command": command,
|
|
214
|
+
"policy": "balanced",
|
|
215
|
+
"permission_mode": self.terminal.config.get("permission_mode", "workspace-write"),
|
|
216
|
+
"network_enabled": bool(self.terminal.config.get("network_enabled", True)),
|
|
217
|
+
"user_approved": True, # typed by the user, so it is theirs to run
|
|
218
|
+
"timeout": timeout,
|
|
219
|
+
})
|
|
220
|
+
|
|
221
|
+
def _eng_show(self, result: dict, label: str, started: float) -> bool:
|
|
222
|
+
data = result.get("data") or {}
|
|
223
|
+
out = (data.get("stdout") or "") + (("\n" + data["stderr"]) if data.get("stderr") else "")
|
|
224
|
+
if out.strip():
|
|
225
|
+
self._eng_say(_tail(out))
|
|
226
|
+
took = f"{time.monotonic() - started:.1f}s"
|
|
227
|
+
if result.get("success"):
|
|
228
|
+
self._eng_say(f"✓ {label} passed · {took}", "green")
|
|
229
|
+
return True
|
|
230
|
+
self._eng_say(f"✗ {label} failed · {took} · {result.get('error', '')}".rstrip(" ·"), "red")
|
|
231
|
+
return False
|
|
232
|
+
|
|
233
|
+
# ── checks ──────────────────────────────────────────────────────────────
|
|
234
|
+
async def _eng_check(self, kind: str, extra: str) -> None:
|
|
235
|
+
commands = detect_commands(self._eng_root())
|
|
236
|
+
command = commands.get(kind)
|
|
237
|
+
if not command:
|
|
238
|
+
if kind == "sim":
|
|
239
|
+
self._eng_say(
|
|
240
|
+
"No simulation command declared. Add it to .aria/project.yaml:\n"
|
|
241
|
+
" commands:\n sim: ros2 launch my_robot sim_scenarios.launch.py", "dim")
|
|
242
|
+
else:
|
|
243
|
+
self._eng_say(
|
|
244
|
+
f"No {kind} command found. Aria looked for .aria/project.yaml, ROS 2 packages, package.json "
|
|
245
|
+
"scripts, Cargo.toml, go.mod, pyproject.toml and Makefile targets.", "dim")
|
|
246
|
+
return
|
|
247
|
+
if extra.strip():
|
|
248
|
+
command += " " + " ".join(shlex.quote(p) for p in shlex.split(extra))
|
|
249
|
+
self._eng_say(f"$ {command}", "dim")
|
|
250
|
+
started = time.monotonic()
|
|
251
|
+
result = await asyncio.to_thread(self._eng_run, command)
|
|
252
|
+
self._eng_show(result, kind, started)
|
|
253
|
+
report = commands.get("test_report") if kind == "test" else None
|
|
254
|
+
if report:
|
|
255
|
+
# The run's own exit code says little (colcon test exits 0 with failures);
|
|
256
|
+
# the report is the verdict.
|
|
257
|
+
self._eng_say(f"$ {report}", "dim")
|
|
258
|
+
started = time.monotonic()
|
|
259
|
+
result = await asyncio.to_thread(self._eng_run, report)
|
|
260
|
+
self._eng_show(result, "test results", started)
|
|
261
|
+
|
|
262
|
+
async def cmd_test(self, args: str):
|
|
263
|
+
"""/test [paths] — run the project's tests."""
|
|
264
|
+
self._eng_note_shadow("test")
|
|
265
|
+
await self._eng_check("test", args)
|
|
266
|
+
|
|
267
|
+
async def cmd_sim(self, args: str):
|
|
268
|
+
"""/sim [scenario] — run the simulation the project declares (never guessed)."""
|
|
269
|
+
self._eng_note_shadow("sim")
|
|
270
|
+
await self._eng_check("sim", args)
|
|
271
|
+
|
|
272
|
+
async def cmd_build(self, args: str):
|
|
273
|
+
"""/build — run the project's build."""
|
|
274
|
+
self._eng_note_shadow("build")
|
|
275
|
+
await self._eng_check("build", "")
|
|
276
|
+
|
|
277
|
+
# ── git ─────────────────────────────────────────────────────────────────
|
|
278
|
+
async def cmd_diff(self, args: str):
|
|
279
|
+
"""/diff [path ...] | --patch — what changed: a summary, or the patch."""
|
|
280
|
+
self._eng_note_shadow("diff")
|
|
281
|
+
text = args.strip()
|
|
282
|
+
if not text:
|
|
283
|
+
# Two plain read-only commands, not /git summary's `a && b`: the default
|
|
284
|
+
# command policy blocks compound commands.
|
|
285
|
+
await self._eng_call(self.cmd_git, "status")
|
|
286
|
+
await self._eng_call(self.cmd_git, "diff")
|
|
287
|
+
elif text in ("--patch", "-p"):
|
|
288
|
+
await self._eng_call(self.cmd_git, "patch")
|
|
289
|
+
else:
|
|
290
|
+
await self._eng_call(self.cmd_git, "patch " + text)
|
|
291
|
+
|
|
292
|
+
async def cmd_commit(self, args: str):
|
|
293
|
+
"""/commit [message] — commit everything that changed."""
|
|
294
|
+
self._eng_note_shadow("commit")
|
|
295
|
+
await self._eng_call(self.cmd_git, ("commit " + args.strip()).strip())
|
|
296
|
+
|
|
297
|
+
async def cmd_pr(self, args: str):
|
|
298
|
+
"""/pr [status|view|create [title]] — the branch's pull request."""
|
|
299
|
+
self._eng_note_shadow("pr")
|
|
300
|
+
words = shlex.split(args) if args.strip() else []
|
|
301
|
+
sub = words[0].lower() if words else "status"
|
|
302
|
+
if shutil.which("gh") is None:
|
|
303
|
+
self._eng_say("The GitHub CLI (gh) is not installed. See https://cli.github.com", "yellow")
|
|
304
|
+
return
|
|
305
|
+
if sub == "status":
|
|
306
|
+
command = "gh pr status"
|
|
307
|
+
elif sub == "view":
|
|
308
|
+
command = "gh pr view"
|
|
309
|
+
elif sub == "create":
|
|
310
|
+
title = " ".join(words[1:]).strip()
|
|
311
|
+
command = "gh pr create --fill" + (f" --title {shlex.quote(title)}" if title else "")
|
|
312
|
+
else:
|
|
313
|
+
self._eng_say("Usage: /pr [status|view|create [title]]", "dim")
|
|
314
|
+
return
|
|
315
|
+
started = time.monotonic()
|
|
316
|
+
result = await asyncio.to_thread(self._eng_run, command, timeout=120)
|
|
317
|
+
self._eng_show(result, command, started)
|
|
318
|
+
|
|
319
|
+
# ── session and project ─────────────────────────────────────────────────
|
|
320
|
+
async def cmd_checkpoint(self, args: str):
|
|
321
|
+
"""/checkpoint [list | restore [N|id]] — file checkpoints and turn points."""
|
|
322
|
+
self._eng_note_shadow("checkpoint")
|
|
323
|
+
words = args.split()
|
|
324
|
+
sub = words[0].lower() if words else "list"
|
|
325
|
+
if sub == "list":
|
|
326
|
+
await self._eng_call(self.cmd_rewind, "list")
|
|
327
|
+
await self._eng_call(self.cmd_rewind, "turns")
|
|
328
|
+
elif sub == "restore":
|
|
329
|
+
await self._eng_call(self.cmd_rewind, ("turn " + " ".join(words[1:])).strip())
|
|
330
|
+
else:
|
|
331
|
+
self._eng_say("Usage: /checkpoint [list | restore [N|id]]", "dim")
|
|
332
|
+
|
|
333
|
+
async def cmd_worktree(self, args: str):
|
|
334
|
+
"""/worktree [diff|apply|discard] — the coding task's worktree (same as /task)."""
|
|
335
|
+
self._eng_note_shadow("worktree")
|
|
336
|
+
await self._eng_call(self.cmd_task, args)
|
|
337
|
+
|
|
338
|
+
async def cmd_graph(self, args: str):
|
|
339
|
+
"""/graph [path|symbol ...] — the project graph; with targets, what a change reaches."""
|
|
340
|
+
self._eng_note_shadow("graph")
|
|
341
|
+
if args.strip():
|
|
342
|
+
await self._eng_call(self.cmd_impact, args)
|
|
343
|
+
return
|
|
344
|
+
from aria_code.runtime.project_graph import load_project_graph
|
|
345
|
+
|
|
346
|
+
summary = await asyncio.to_thread(lambda: load_project_graph(self._eng_root()).summary())
|
|
347
|
+
services = summary.get("services") or {}
|
|
348
|
+
lines = [
|
|
349
|
+
f"Project graph: {summary['files']} files · {summary['symbols']} symbols · "
|
|
350
|
+
f"{summary['import_edges']} imports · {summary['tests']} test files",
|
|
351
|
+
]
|
|
352
|
+
if services:
|
|
353
|
+
lines.append("Services: " + ", ".join(sorted(services)[:12]))
|
|
354
|
+
lines.append("/graph <path|symbol> shows what a change reaches.")
|
|
355
|
+
self._eng_say("\n".join(lines))
|
|
356
|
+
|
|
357
|
+
async def cmd_agents(self, args: str):
|
|
358
|
+
"""/agents — project agents in .aria/agents and the background tasks running."""
|
|
359
|
+
self._eng_note_shadow("agents")
|
|
360
|
+
folder = Path(self._eng_root()) / ".aria" / "agents"
|
|
361
|
+
names = sorted(p.stem for p in folder.glob("*.md")) if folder.is_dir() else []
|
|
362
|
+
self._eng_say("Project agents: " + (", ".join(names) if names else "none (add .aria/agents/<name>.md)"))
|
|
363
|
+
await self._eng_call(self.cmd_tasks, "")
|
|
364
|
+
|
|
365
|
+
async def cmd_consult(self, args: str):
|
|
366
|
+
"""/consult <claude|provider/model> <question> — a second opinion from another model."""
|
|
367
|
+
self._eng_note_shadow("consult")
|
|
368
|
+
from aria_code.runtime import consult
|
|
369
|
+
|
|
370
|
+
name, question = consult.split_request(args)
|
|
371
|
+
if not name or not question:
|
|
372
|
+
self._eng_say("Usage: /consult <claude|provider/model> <question> "
|
|
373
|
+
"e.g. /consult claude is this retry loop safe? @src/retry.py", "dim")
|
|
374
|
+
return
|
|
375
|
+
model = consult.resolve_model(name, self.terminal.config)
|
|
376
|
+
if model is None:
|
|
377
|
+
self._eng_say(f"'{name}' is not a model. Use provider/model (anthropic/claude-sonnet-5-5, "
|
|
378
|
+
"openai/<model>, google/gemini-3.8-flash), or 'claude'. "
|
|
379
|
+
"Add short names with /config set consult_aliases=...", "yellow")
|
|
380
|
+
return
|
|
381
|
+
provider = model.split("/", 1)[0]
|
|
382
|
+
self._eng_say(f"Asking {model}. Your question (and any @files in it) goes to {provider}.", "dim")
|
|
383
|
+
try:
|
|
384
|
+
answer = await consult.ask(model, question, self.terminal.config,
|
|
385
|
+
ollama_url=self.terminal.config.get("ollama_url", "http://localhost:11434"))
|
|
386
|
+
except Exception as exc:
|
|
387
|
+
self._eng_say(f"✗ {model} did not answer: {exc}", "red")
|
|
388
|
+
return
|
|
389
|
+
self._eng_say(answer)
|
|
390
|
+
# File it, so what Aria is told next can build on it.
|
|
391
|
+
self.terminal.conversation.append({"role": "user", "content": consult.note_for_conversation(model, question, answer)})
|
|
392
|
+
|
|
393
|
+
async def cmd_fix(self, args: str):
|
|
394
|
+
"""/fix <what is wrong> — find the cause, make the smallest change, check, repair."""
|
|
395
|
+
self._eng_note_shadow("fix")
|
|
396
|
+
if not args.strip():
|
|
397
|
+
self._eng_say("Usage: /fix <what is wrong> e.g. /fix expired sessions are not refreshed", "dim")
|
|
398
|
+
return
|
|
399
|
+
await self.terminal.send_message(fix_prompt(args, detect_commands(self._eng_root())))
|