aria-code 0.95.0__tar.gz → 0.96.0__tar.gz
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_code-0.95.0/src/aria_code.egg-info → aria_code-0.96.0}/PKG-INFO +1 -1
- {aria_code-0.95.0 → aria_code-0.96.0}/pyproject.toml +1 -1
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/_version.py +1 -1
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/core_cmds.py +9 -2
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +4 -2
- aria_code-0.96.0/src/aria_code/apps/cli/headless.py +288 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/aria_cli.py +6 -253
- {aria_code-0.95.0 → aria_code-0.96.0/src/aria_code.egg-info}/PKG-INFO +1 -1
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code.egg-info/SOURCES.txt +3 -0
- aria_code-0.96.0/tests/test_headless_module.py +46 -0
- aria_code-0.96.0/tests/test_terminal_snapshots.py +229 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/LICENSE +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/NOTICE +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/README.md +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/setup.cfg +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/adk_apps/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/base.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/code_review.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/deep/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/deep/critic.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/deep/deepen.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/deep/models.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/deep/pipeline.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/deep/themes.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/deep/tiers.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/engineering/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/engineering/coder.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/engineering/tester.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/catalyst.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/debate.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/earnings.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/fundamental.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/macro.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/news.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/risk.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/sector.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/strategist.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/synthesis.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/financial/technical.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/orchestrator.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/portfolio_agent.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/realty/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/realty/business_match.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/registry.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/signal_scheme.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/sports/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/sports/football_agent.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/supervisor.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/team.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/aliyun_data_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/README.md +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/channels/README.md +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/channels/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/channels/approvals.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/channels/conversation.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/channels/digest.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/channels/intake.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/channels/registry.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/channels/tradingview.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/README.md +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/_optional.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/broker_render.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/data_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/market.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/report.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/team.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/config_paths.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/config_store.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/constants.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/context.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/deterministic.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/direct.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/exec_events.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/football_reports.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/google_login.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/handlers/market_handlers.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/helpers.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/hooks.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/i18n.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/intent.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/intent_router.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/main.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/market_hours.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/market_universe.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/message_processing.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/preflight.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/project_aria.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/base.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/review_runner.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/sandbox.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/session_export.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/session_store.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tools/context.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/update_check.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/updater.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/cli/workspace_route.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/daemon/README.md +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/vscode/README.md +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/apps/vscode/package.json +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/aria_daemon.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/aria_feishu_bot.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/aria_mcp_server.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/aria_relay_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/aria_relay_server.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/aria_telegram_bot.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ariarc.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/artifacts.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/backtest_engine.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/backtest_report.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/automation.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/base.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/capabilities.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/cn/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/config.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/intl/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/paper_broker.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/planning.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/registry.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/brokers/trading.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/canva_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/change_store.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/clients/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/clients/aria_relay_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/clients/canva_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/clients/figma_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/clients/football_data_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/clients/kling_video_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/clients/market_data_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/clients/openai_image_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/clients/runway_video_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/cloud_memory.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/command_safety.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/computer_use_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/dashboard_generator.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/data_analysis_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/data_cleaner.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/data_service.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/base.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/router.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/demo_player.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/doctor.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/domain/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/domain/backtest_engine.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/domain/backtest_report.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/domain/finance_formulas.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/domain/strategy_vault.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/evals/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/evals/harness.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/evals/runner.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/external_agent_runner.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/figma_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/file_analysis_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/finance_formulas.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/football_data_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/image_gen_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/intent_classifier.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/kling_video_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/licensing.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/local_finance_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/local_image_provider.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/local_llm_provider.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/macro_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/markdown_pdf.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/market_data_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/mcp_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/memory_manager.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/model_capability.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/notification_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/openai_image_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_core/export.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_core/paths.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_infra/product.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/cache.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/context.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/data.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/references.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/registry.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/settings.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_services/usage.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packs/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packs/base.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packs/finance/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packs/logistics/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packs/payments/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packs/realty/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packs/registry.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/packs/rules.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/plan_utils.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/plugin_loader.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/portfolio_ledger.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/preview_server.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/privacy/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/privacy/feedback.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/project_review.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/project_review_api.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/project_review_server.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/project_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/llm/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/llm/anthropic.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/llm/base.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/llm/custom.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/llm/ollama.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/llm/registry.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/local_image_provider.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/local_llm_provider.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/providers/tool_messages.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/realty_data_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/relay_store.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/report_exporters.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/report_generator.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/review_service.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/acceptance.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/agent_loop.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/approval.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/budget.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/checkpoints.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/crash_report.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/events.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/gateway.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/lsp.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/orchestrator.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/processes.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/repo_map.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/run_state.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/run_store.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/self_healing.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/subagent.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/task_ledger.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/tool_executor.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/tool_policy.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runtime/worktrees.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/runway_video_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/safety/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/safety/permissions.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/safety/sandbox.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/safety/service.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/setup_wizard.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/spreadsheet_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/strategy_vault.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/artifact_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/broker_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/build_quant_engine.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/code_audit_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/computer_use_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/extended_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/image_gen_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/local_finance_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/logistics_carriers.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/logistics_inventory.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/logistics_io.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/logistics_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/macro_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/notification_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/project_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/realty_data_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/tools/stripe_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/banner.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/completer.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/console.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/image_render.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/input_box.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/mentions.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/picker.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/render/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/render/finance.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/render/market.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/render/output.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/render/responsive.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/render/team.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/robot.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/ui/startup_dashboard.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/utils/vscode_uri.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/video_analysis.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/video_editor.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/workspace/__init__.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/workspace/files.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/workspace/verify.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/workspace_changes.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/workspace_context.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/workspace_service.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code/workspace_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code.egg-info/entry_points.txt +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code.egg-info/requires.txt +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/src/aria_code.egg-info/top_level.txt +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_adk_market_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_agent_key_points_language.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_agent_team_fallback.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_analyze_file_tool.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_architecture_ledger_is_true.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_architecture_report.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_aria_cli_core.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_aria_mcp_server.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_aria_sdk.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_artifact_publishing.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_artifacts_and_reports.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_ashare_prediction_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_background_processes.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_backtest_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_backtest_engine.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_backtest_report.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_broken_akshare_is_optional.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_broker_automation.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_broker_chat_confirm_gate.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_broker_planning.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_broker_safety.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_broker_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_budget.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_business_workflow_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_canva_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_canvas_cmds.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_card_approvals.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_channel_intake.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_channels.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_chart_handlers.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_chat_bots_fail_closed.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_chat_routing.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_ci_security_workflow.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_cli_app_split.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_cli_bootstrap.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_cli_config_store.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_cli_lifecycle_hooks.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_cli_runtime_consumer.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_cli_tool_executor_module.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_cli_updater.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_cloud_memory.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_code_audit_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_code_review_agent.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_codegen_output.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_coder_tester_self_healing.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_coder_tool_safety.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_collaboration.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_command_loggers.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_command_safety.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_compare_strategies.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_completions_builder.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_config_paths.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_configured_provider.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_container_entrypoint.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_container_entrypoints.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_context_checkpoints.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_context_references.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_context_service.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_conversation_core.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_crash_report.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_credential_file_permissions.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_custom_providers.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_daemon_gateway_config.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_dashboard_generator.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_data_service.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_data_service_imports.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_data_without_model.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_datasource_routing.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_deep_analysis.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_degrades_without_quant_engine.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_doctor.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_doctor_describes_the_current_install.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_doctor_npm_scope.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_edit_and_command_safety.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_engine_boundary.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_enterprise_tool_honesty.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_env_switch_docs.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_evals_harness.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_event_import_roots.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_exec_events.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_extended_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_feishu_swarm_config.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_file_links.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_finalize_release.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_finance_renderers.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_finance_service_catalog.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_first_run_output.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_first_run_works.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_football_agent.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_football_prediction_output.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_google_cloud_models.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_google_cloud_routing.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_google_login.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_google_search_provider.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_headless_is_agentic.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_honest_surfaces.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_image_gen_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_image_inputs.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_import_graph_budget.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_intent_router.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_intent_signals.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_kling_video_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_lazy_rebind.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_legacy_module_imports.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_license_consistency.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_licensing.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_local_image_provider.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_logistics_3pl.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_logistics_and_finance_agents.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_lsp.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_markdown_pdf.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_market_answers_in_english.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_market_data_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_market_history_inheritance.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_market_history_tool.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_market_hours.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_market_questions_on_backend.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_market_symbol_extraction.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_market_universe.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_mcp_circuit.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_mcp_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_mentions.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_model_capability_registry.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_model_choice_is_the_users.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_model_selection_state.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_narrow_chinese_output.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_native_binary_entrypoints.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_native_installer.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_natural_language_routing.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_new_modules.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_no_tools_route.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_no_uncommitted_imports.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_numeric_listings.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_ollama_stream_imports.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_ollama_stream_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_openai_image_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_operations_suite.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_os_sandbox.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_output_rendering.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_packages_facade.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_packaging_constraints.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_packaging_manifest.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_packs_domains.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_pdf_report.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_pick_best_installed_model.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_plan_mode.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_platform_package_assembly.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_platform_packages.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_platform_publish.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_plotly_html_output.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_portfolio_language.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_portfolio_ledger.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_post_turn_context_decision.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_preflight.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_preview_server.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_privacy_feedback.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_project_aria.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_project_context_files.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_project_review.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_project_review_api.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_prompt_assembly.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_prompt_selection.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_provider_autoconfig.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_provider_error_messages.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_provider_integration.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_provider_registry.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_public_service_status.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_quant_engine_namespace.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_rebind_contract.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_rebind_namespace_contract.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_relay_client_credentials.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_relay_event_verification.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_relay_sends_for_clients.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_relay_store.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_relay_url.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_release_chain.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_release_commit_identity.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_release_push_is_atomic.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_release_reaches_the_registries.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_release_verification_waits.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_release_workflow_permissions.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_report_charts.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_report_generator.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_research_protocol.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_research_quality.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_responsive_rendering.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_review_service.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_root_module_budget.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_rsi_without_pandas_ta.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_acceptance.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_agent_loop.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_approval.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_bridge.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_bridge_fallback.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_checkpoints.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_event_identity.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_gateway.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_repo_map.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_run_store.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_tool_executor.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runtime_worktrees.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_runway_video_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_safety_permissions.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_safety_service.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_safety_service_adoption.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_service_diagnostics_security.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_session_search.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_settings_service.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_shell_commands_as_written.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_shipper_digest.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_single_import_root.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_skill_agent_binding.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_skill_catalog.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_skill_loader.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_slash_popup.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_spreadsheet_tools.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_sse_stream_contract.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_startup_dashboard.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_startup_latency.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_status_language.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_streaming_pipeline.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_stripe_agent.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_subagent.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_supervisor_routing.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_system_prompts.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_system_tools_output.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_task_orchestrator.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_team_analysts.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_team_synthesis.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_tls_trust_store.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_tool_policy.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_tool_rounds_on_openai_apis.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_tool_scope.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_tool_step_output.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_trading_service.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_tradingview_bridge.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_turn_planning.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_ui_completer_references.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_ui_console_theme.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_ui_input_box.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_ui_language_and_model.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_ui_robot_banner.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_update_health_routes.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_verification_hint.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_verification_policy.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_version_consistency.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_version_counter.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_video_analysis.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_video_editor.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_vscode_mcp.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_warehouse_agents.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_warehouse_cli_registration.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_warehouse_erp_client.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_warehouse_workflow.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_wheel_is_installable.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_workspace_changes.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_workspace_context.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_workspace_files.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_workspace_scope.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_workspace_service.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_workspace_verify.py +0 -0
- {aria_code-0.95.0 → aria_code-0.96.0}/tests/test_wrapped_indent.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aria-code
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.96.0
|
|
4
4
|
Summary: Open-source AI agent for coding, financial analysis and logistics operations: numbers you can check, client data kept apart, actions a person approves
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
Project-URL: Homepage, https://github.com/artheras/aria-code
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "aria-code"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.96.0"
|
|
8
8
|
description = "Open-source AI agent for coding, financial analysis and logistics operations: numbers you can check, client data kept apart, actions a person approves"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "Apache-2.0" }
|
|
@@ -287,6 +287,7 @@ class CoreCommandsMixin:
|
|
|
287
287
|
print("\n" + T(f"更多:/help {topics} · all · <命令>", f"More: /help {topics} · all · <command>"))
|
|
288
288
|
return
|
|
289
289
|
|
|
290
|
+
from rich.cells import cell_len, set_cell_size
|
|
290
291
|
from rich.text import Text
|
|
291
292
|
|
|
292
293
|
console = self.context.console
|
|
@@ -301,8 +302,14 @@ class CoreCommandsMixin:
|
|
|
301
302
|
# indent 2, name, gap 2, description, gap 3, name, gap 2, description
|
|
302
303
|
desc_width = max(12, (console.width - 2 - 2 * name_width - 2 - 3 - 2) // 2)
|
|
303
304
|
|
|
305
|
+
# Widths in terminal cells, not characters: a Chinese character takes
|
|
306
|
+
# two. Counted as one, the Chinese /help padded each left description
|
|
307
|
+
# to twice its room and the right column wrapped back to column 0.
|
|
304
308
|
def cell(text: str) -> str:
|
|
305
|
-
return text if
|
|
309
|
+
return text if cell_len(text) <= desc_width else set_cell_size(text, desc_width - 1) + "…"
|
|
310
|
+
|
|
311
|
+
def pad(text: str, width: int) -> str:
|
|
312
|
+
return text + " " * max(0, width - cell_len(text))
|
|
306
313
|
|
|
307
314
|
two_columns = console.width >= 96
|
|
308
315
|
if not two_columns:
|
|
@@ -317,7 +324,7 @@ class CoreCommandsMixin:
|
|
|
317
324
|
lines = Text()
|
|
318
325
|
for left, right in pairs:
|
|
319
326
|
lines.append(" " + left[0].ljust(name_width + 2), style="bold #C08050")
|
|
320
|
-
lines.append(cell(left[1])
|
|
327
|
+
lines.append(pad(cell(left[1]), desc_width + 3) if right[0] else cell(left[1]), style="dim")
|
|
321
328
|
if right[0]:
|
|
322
329
|
lines.append(right[0].ljust(name_width + 2), style="bold #C08050")
|
|
323
330
|
lines.append(cell(right[1]), style="dim")
|
|
@@ -758,10 +758,12 @@ class PortfolioCommandsMixin:
|
|
|
758
758
|
# NEEDS_ATTENTION (signal SELL) came out as HIGH_RISK.
|
|
759
759
|
_port_verdict = str((result.data_used or {}).get("verdict") or "NEEDS_ATTENTION")
|
|
760
760
|
if self.context.has_rich:
|
|
761
|
-
|
|
761
|
+
# The header already ends in a blank line, and the banner's
|
|
762
|
+
# panel opens with one: two blank lines each side before.
|
|
763
|
+
if tokens:
|
|
764
|
+
self.context.console.print()
|
|
762
765
|
for pt in (result.key_points or []):
|
|
763
766
|
self.context.console.print(f" [dim]• {pt}[/dim]")
|
|
764
|
-
self.context.console.print()
|
|
765
767
|
_subtitle = " · ".join(result.key_points[:2]) if result.key_points else ""
|
|
766
768
|
_print_verdict_banner(_port_verdict, subtitle=_subtitle,
|
|
767
769
|
confidence=result.confidence, lang=_lang)
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
"""Non-interactive Aria: `aria-code -p "…"` and `--watch`.
|
|
2
|
+
|
|
3
|
+
Moved out of aria_cli.py, where ArtheraTerminal held it alongside the REPL.
|
|
4
|
+
The bodies are unchanged and still use aria_cli's names (console, LOCAL_TOOLS,
|
|
5
|
+
_run_deterministic_chain, …): aria_cli binds a copy of this class to its own
|
|
6
|
+
globals with bind_to() and puts it among ArtheraTerminal's bases. A copy per
|
|
7
|
+
binding, because aria_cli loads under two names (aria_cli and
|
|
8
|
+
aria_code.aria_cli); rebinding one shared class would leave both terminals
|
|
9
|
+
on whichever module loaded last.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import types
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class HeadlessMixin:
|
|
18
|
+
"""run_prompt, _run_prompt_turn, _finish_prompt and run_watch for ArtheraTerminal."""
|
|
19
|
+
|
|
20
|
+
async def run_prompt(self, prompt: str, json_output: bool = False,
|
|
21
|
+
fmt: str = "table", output_file: str = None, quiet: bool = False,
|
|
22
|
+
machine_out=None):
|
|
23
|
+
"""Run a single prompt (non-interactive / pipe mode).
|
|
24
|
+
|
|
25
|
+
``machine_out`` is the real stdout when the output is JSON (sys.stdout
|
|
26
|
+
then points at stderr). With fmt "jsonl" each step is written there as
|
|
27
|
+
one JSON event per line as it happens.
|
|
28
|
+
"""
|
|
29
|
+
from aria_code.apps.cli.exec_events import ExecEvents, json_safe
|
|
30
|
+
events = ExecEvents(machine_out if fmt == "jsonl" else None)
|
|
31
|
+
events.emit("turn.started", prompt=prompt, model=self.config.get("model", ""))
|
|
32
|
+
result = await self._run_prompt_turn(prompt, quiet=quiet, events=events)
|
|
33
|
+
self._finish_prompt(result, json_output=json_output, fmt=fmt, output_file=output_file,
|
|
34
|
+
quiet=quiet, machine_out=machine_out, events=events)
|
|
35
|
+
|
|
36
|
+
async def _run_prompt_turn(self, prompt: str, *, quiet: bool, events) -> dict:
|
|
37
|
+
"""The work of run_prompt: a slash command, a deterministic answer, or an agent turn."""
|
|
38
|
+
model = self.config.get("model", "qwen2.5:7b")
|
|
39
|
+
thinking_mode = self.config.get("thinking_mode", "auto")
|
|
40
|
+
auth_token = self.config.get("auth_token")
|
|
41
|
+
user_context = _build_user_context(self.config)
|
|
42
|
+
|
|
43
|
+
local_mode = self.config.get("local_mode", False)
|
|
44
|
+
|
|
45
|
+
# Dispatch slash commands in -p mode (same as interactive REPL loop).
|
|
46
|
+
# Without this, /memory /note /init /review are sent to the LLM as plain text.
|
|
47
|
+
_stripped_prompt = prompt.strip()
|
|
48
|
+
if self.commands.is_command(_stripped_prompt):
|
|
49
|
+
self._maybe_show_intent_preflight(_stripped_prompt, quiet=quiet)
|
|
50
|
+
await self.commands.execute(_stripped_prompt)
|
|
51
|
+
return {"success": True, "command": _stripped_prompt.split()[0], "response": ""}
|
|
52
|
+
|
|
53
|
+
_reference_context = ""
|
|
54
|
+
_reference_service = getattr(self, "_reference_service", None)
|
|
55
|
+
if _reference_service is not None and "@" in prompt:
|
|
56
|
+
_prepared_references = _reference_service.prepare(prompt)
|
|
57
|
+
if _prepared_references.errors:
|
|
58
|
+
self._print_reference_errors(_prepared_references)
|
|
59
|
+
return {"success": False, "response": "", "error": "unresolved @ reference"}
|
|
60
|
+
if _prepared_references.references:
|
|
61
|
+
self._print_reference_summary(_prepared_references)
|
|
62
|
+
prompt = _prepared_references.expanded_text
|
|
63
|
+
_reference_context = _prepared_references.context_block
|
|
64
|
+
|
|
65
|
+
# Keep referenced local files as pointers; the model reads them through
|
|
66
|
+
# audited tools instead of silently embedding their contents.
|
|
67
|
+
if _reference_context:
|
|
68
|
+
prompt = f"{prompt}\n\n{_reference_context}"
|
|
69
|
+
else:
|
|
70
|
+
_file_tool_hint = _build_file_tool_hint(prompt)
|
|
71
|
+
if _file_tool_hint:
|
|
72
|
+
prompt = _file_tool_hint + prompt
|
|
73
|
+
self._maybe_show_intent_preflight(prompt, quiet=quiet)
|
|
74
|
+
|
|
75
|
+
_curr_model_id_p = self.config.get("model", "")
|
|
76
|
+
# The route counts as much as the model: on backend_chat the model gets
|
|
77
|
+
# no local tools whatever it could do with them. This only looked at the
|
|
78
|
+
# model, so the deterministic chain skipped its data pre-fetch there.
|
|
79
|
+
from aria_code.apps.cli.workspace_route import no_tools_message, needs_workspace, route_has_tools
|
|
80
|
+
_model_has_tools_p = route_has_tools(_curr_model_id_p, self.config, self.api_url)
|
|
81
|
+
|
|
82
|
+
# ── Broker guide intent: broad discovery should not start an add wizard ──
|
|
83
|
+
if _is_broker_guide_intent(prompt):
|
|
84
|
+
if HAS_RICH:
|
|
85
|
+
console.print("\n[bold]Aria[/bold] [dim] 正在打开券商与服务指南…[/dim]\n")
|
|
86
|
+
await self.commands.cmd_broker("guide")
|
|
87
|
+
await self.commands.cmd_broker("services")
|
|
88
|
+
await self.commands.cmd_packages("services")
|
|
89
|
+
return {"success": True, "command": "/broker guide", "response": ""}
|
|
90
|
+
|
|
91
|
+
# ── Broker setup intent: intercept before LLM / deterministic routing ──
|
|
92
|
+
if _is_broker_setup_intent(prompt):
|
|
93
|
+
_btype_p = _detect_broker_type(prompt)
|
|
94
|
+
if HAS_RICH:
|
|
95
|
+
from apps.cli.utils.market_detect import _BROKER_SETUP_NAMES
|
|
96
|
+
_display_p = _BROKER_SETUP_NAMES.get(_btype_p, ("",))[0] if _btype_p else ""
|
|
97
|
+
_label_p = f" 正在启动{_display_p}配置向导…" if _display_p else " 正在启动券商配置向导…"
|
|
98
|
+
console.print(f"\n[bold]Aria[/bold] [dim]{_label_p}[/dim]\n")
|
|
99
|
+
await self.commands._cmd_broker_add(_btype_p)
|
|
100
|
+
return {"success": True, "command": "/broker add", "response": ""}
|
|
101
|
+
|
|
102
|
+
# ── Football prediction intercept → built-in Poisson handler ──────────
|
|
103
|
+
if await self._try_football_nl_intercept(prompt):
|
|
104
|
+
return {"success": True, "command": "football", "response": ""}
|
|
105
|
+
|
|
106
|
+
deterministic = _run_deterministic_chain(
|
|
107
|
+
prompt, model_has_tools=_model_has_tools_p)
|
|
108
|
+
if deterministic.get("success") or _is_stock_chart_analysis_request(prompt):
|
|
109
|
+
result = deterministic
|
|
110
|
+
else:
|
|
111
|
+
# No one reads a headless answer before a script acts on it. A task
|
|
112
|
+
# about this folder on a model that cannot open it would come back as
|
|
113
|
+
# a confident guess with exit 0; fail before sending it instead.
|
|
114
|
+
if not _model_has_tools_p and needs_workspace(prompt):
|
|
115
|
+
_zh = str(self.config.get("ui_lang", "en")).lower().startswith("zh")
|
|
116
|
+
_why = no_tools_message(self.config, lang="zh" if _zh else "en")
|
|
117
|
+
print(_why, file=sys.stderr)
|
|
118
|
+
return {"success": False, "response": "", "error": "model_cannot_use_tools", "detail": _why}
|
|
119
|
+
# Spinner for terminal usage: gives visual feedback while the model generates.
|
|
120
|
+
# Only starts when we actually need to call the LLM (not for deterministic responses).
|
|
121
|
+
_prompt_spinner = None
|
|
122
|
+
if HAS_RICH and sys.stdout.isatty():
|
|
123
|
+
try:
|
|
124
|
+
_prompt_spinner = console.status("", spinner="dots", spinner_style="dim")
|
|
125
|
+
_prompt_spinner.__enter__()
|
|
126
|
+
except Exception:
|
|
127
|
+
_prompt_spinner = None
|
|
128
|
+
try:
|
|
129
|
+
# Headless -p runs the SAME loop as the REPL.
|
|
130
|
+
#
|
|
131
|
+
# It used to call stream_provider_result directly: one provider
|
|
132
|
+
# round, tool schemas advertised but nothing executing what came
|
|
133
|
+
# back, and a single best-effort pass over tool_calls_pending
|
|
134
|
+
# afterwards whose results the model never saw. So `-p` was not
|
|
135
|
+
# agentic at all — no rounds, no tool results fed back, no loop
|
|
136
|
+
# guard, no acceptance gate. Every non-interactive user (CI, a
|
|
137
|
+
# pipe, the eval harness) got a chat reply where the REPL would
|
|
138
|
+
# have done the work.
|
|
139
|
+
#
|
|
140
|
+
# run_chat_via_runtime is the documented single entry point and
|
|
141
|
+
# already handles provider selection and cloud→Ollama fallback,
|
|
142
|
+
# which is what the two branches here were open-coding.
|
|
143
|
+
from aria_code.apps.cli.providers.runtime_bridge import run_chat_via_runtime
|
|
144
|
+
|
|
145
|
+
_turn = await run_chat_via_runtime(
|
|
146
|
+
prompt=prompt, history=[],
|
|
147
|
+
local_tools=LOCAL_TOOLS, tool_schemas=LOCAL_TOOL_SCHEMAS,
|
|
148
|
+
model=model, config=self.config, api_url=self.api_url,
|
|
149
|
+
ollama_url=self.config.get("ollama_url", "http://localhost:11434"),
|
|
150
|
+
thinking_mode=thinking_mode, user_context=user_context,
|
|
151
|
+
auth_token=auth_token, project_context=_PROJECT_CONTEXT,
|
|
152
|
+
max_rounds=int(self.config.get("max_rounds", 30) or 30),
|
|
153
|
+
# No approval UI exists in headless mode. Leaving the confirm
|
|
154
|
+
# set populated would block every write on a prompt nobody is
|
|
155
|
+
# there to answer; the operator opts in with
|
|
156
|
+
# --dangerously-skip-permissions or --allow-tools.
|
|
157
|
+
confirm_tools=(
|
|
158
|
+
frozenset() if _auto_approve_session
|
|
159
|
+
else frozenset(_CONFIRM_TOOLS) - _session_always_allow
|
|
160
|
+
),
|
|
161
|
+
on_tool_call=events.tool_started,
|
|
162
|
+
on_tool_result=events.tool_completed,
|
|
163
|
+
return_result=True,
|
|
164
|
+
)
|
|
165
|
+
_tools_used = list(getattr(_turn.final, "tools", []) or [])
|
|
166
|
+
# An empty closing message after the tools already ran is not a
|
|
167
|
+
# failed turn. The model did the work and then said nothing;
|
|
168
|
+
# exiting 1 there told a script the task failed while the edit
|
|
169
|
+
# sat finished on disk. Narrow on purpose — any other error,
|
|
170
|
+
# and a turn that ran no tools at all, still fails.
|
|
171
|
+
_empty_after_work = (
|
|
172
|
+
_turn.error == "empty_response" and bool(_tools_used)
|
|
173
|
+
)
|
|
174
|
+
result = {
|
|
175
|
+
"success": _turn.ok or _empty_after_work,
|
|
176
|
+
"response": (
|
|
177
|
+
_turn.text
|
|
178
|
+
or (f"(模型未给出收尾说明。已执行的工具:{', '.join(_tools_used)})"
|
|
179
|
+
if _empty_after_work else "")
|
|
180
|
+
),
|
|
181
|
+
"error": "" if _empty_after_work else (_turn.error or ""),
|
|
182
|
+
"provider": getattr(_turn.final, "provider", ""),
|
|
183
|
+
"tools_used": _tools_used,
|
|
184
|
+
"acceptance": getattr(_turn.final, "acceptance", None),
|
|
185
|
+
}
|
|
186
|
+
finally:
|
|
187
|
+
if _prompt_spinner is not None:
|
|
188
|
+
try:
|
|
189
|
+
_prompt_spinner.__exit__(None, None, None)
|
|
190
|
+
except Exception:
|
|
191
|
+
pass
|
|
192
|
+
|
|
193
|
+
return result
|
|
194
|
+
|
|
195
|
+
def _finish_prompt(self, result: dict, *, json_output: bool, fmt: str, output_file,
|
|
196
|
+
quiet: bool, machine_out, events) -> None:
|
|
197
|
+
"""Print or save run_prompt's result, and exit 1 if it failed."""
|
|
198
|
+
from aria_code.apps.cli.exec_events import json_safe
|
|
199
|
+
result = result or {"success": False, "response": "", "error": "no result"}
|
|
200
|
+
# The agent loop executes tools now, so there is nothing left over to
|
|
201
|
+
# run here — only stream_provider_result ever populated
|
|
202
|
+
# tool_calls_pending, and the deterministic chain never does. Keeping
|
|
203
|
+
# the old pass would risk running a write twice.
|
|
204
|
+
#
|
|
205
|
+
# What is worth surfacing instead is the acceptance verdict: in headless
|
|
206
|
+
# mode nobody watched the run, so a turn that changed files and failed
|
|
207
|
+
# its checks must say so on stderr rather than print a confident summary
|
|
208
|
+
# and exit 0.
|
|
209
|
+
_acceptance = (result or {}).get("acceptance") or {}
|
|
210
|
+
if _acceptance.get("verified") is False and not quiet:
|
|
211
|
+
_zh = str(self.config.get("ui_lang", "en")).lower().startswith("zh")
|
|
212
|
+
print(f"⚠ {'验收未通过' if _zh else 'Checks failed'}: {_acceptance.get('headline', '')}",
|
|
213
|
+
file=sys.stderr)
|
|
214
|
+
|
|
215
|
+
events.emit("turn.completed", **json_safe(result))
|
|
216
|
+
out = machine_out or sys.stdout
|
|
217
|
+
if fmt == "jsonl":
|
|
218
|
+
content = None # the events were the output
|
|
219
|
+
elif json_output or fmt == "json":
|
|
220
|
+
content = json.dumps(json_safe(result), ensure_ascii=False, indent=2)
|
|
221
|
+
elif fmt == "csv":
|
|
222
|
+
content = f"role,content\nassistant,\"{result.get('response', '').replace(chr(34), chr(34)+chr(34))}\""
|
|
223
|
+
elif fmt == "md":
|
|
224
|
+
content = f"# Aria Code AI Response\n\n{result.get('response', '')}\n"
|
|
225
|
+
else:
|
|
226
|
+
content = result.get("response", "") if result.get("success") else f"Error: {result.get('error', 'Unknown')}"
|
|
227
|
+
|
|
228
|
+
# Output routing
|
|
229
|
+
if content is None or (fmt == "table" and not json_output and result.get("command") and not content):
|
|
230
|
+
pass # jsonl, or a command that printed its own output
|
|
231
|
+
elif output_file:
|
|
232
|
+
with open(output_file, "w") as f:
|
|
233
|
+
f.write(content)
|
|
234
|
+
if not quiet:
|
|
235
|
+
console.print(f"[green]Saved to {output_file}[/green]" if HAS_RICH
|
|
236
|
+
else f"Saved: {output_file}")
|
|
237
|
+
elif not result.get("success") and fmt == "table" and not json_output:
|
|
238
|
+
print(f"Error: {result.get('error', 'Unknown')}", file=sys.stderr)
|
|
239
|
+
# In default (table) format: render with Rich Markdown when output is
|
|
240
|
+
# a terminal. This gives properly formatted headings, bold, and tables
|
|
241
|
+
# in interactive use. When piped/redirected, fall back to plain text
|
|
242
|
+
# for scripting compatibility.
|
|
243
|
+
elif HAS_RICH and fmt == "table" and not json_output and sys.stdout.isatty() and result.get("success"):
|
|
244
|
+
console.print(make_markdown(_strip_latex(content)))
|
|
245
|
+
else:
|
|
246
|
+
print(content, file=out, flush=True)
|
|
247
|
+
# A failed turn exits 1 in every format. Only table did; with --json a
|
|
248
|
+
# script got exit 0 and had to read the body to learn it had failed.
|
|
249
|
+
if not result.get("success"):
|
|
250
|
+
sys.exit(1)
|
|
251
|
+
|
|
252
|
+
async def run_watch(self, command_fn, interval: int, cmd_args: str):
|
|
253
|
+
"""Run a command repeatedly with interval (like Unix watch)."""
|
|
254
|
+
try:
|
|
255
|
+
while True:
|
|
256
|
+
if not self.config.get("_quiet"):
|
|
257
|
+
os.system("clear" if os.name == "posix" else "cls")
|
|
258
|
+
ts = datetime.now().strftime("%H:%M:%S")
|
|
259
|
+
if HAS_RICH:
|
|
260
|
+
console.print(f"[dim]Every {interval}s | {ts} | Ctrl+C to stop[/dim]\n")
|
|
261
|
+
else:
|
|
262
|
+
print(f"Every {interval}s | {ts} | Ctrl+C to stop\n")
|
|
263
|
+
|
|
264
|
+
await command_fn(cmd_args)
|
|
265
|
+
|
|
266
|
+
await asyncio.sleep(interval)
|
|
267
|
+
except (KeyboardInterrupt, asyncio.CancelledError):
|
|
268
|
+
if HAS_RICH:
|
|
269
|
+
console.print("\n[dim]Watch stopped[/dim]")
|
|
270
|
+
else:
|
|
271
|
+
print("\nStopped")
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def bind_to(namespace: dict) -> type:
|
|
275
|
+
"""A copy of HeadlessMixin whose methods resolve bare names in ``namespace``."""
|
|
276
|
+
methods = {}
|
|
277
|
+
for name, attr in vars(HeadlessMixin).items():
|
|
278
|
+
if isinstance(attr, types.FunctionType):
|
|
279
|
+
bound = types.FunctionType(attr.__code__, namespace, attr.__name__,
|
|
280
|
+
attr.__defaults__, attr.__closure__)
|
|
281
|
+
bound.__kwdefaults__ = attr.__kwdefaults__
|
|
282
|
+
bound.__doc__ = attr.__doc__
|
|
283
|
+
bound.__qualname__ = f"ArtheraTerminal.{attr.__name__}"
|
|
284
|
+
methods[name] = bound
|
|
285
|
+
return type("HeadlessMixin", (), {"__doc__": HeadlessMixin.__doc__, "__module__": __name__, **methods})
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
__all__ = ["HeadlessMixin", "bind_to"]
|
|
@@ -3999,8 +3999,13 @@ class SlashCommands(
|
|
|
3999
3999
|
# ============================================================================
|
|
4000
4000
|
|
|
4001
4001
|
from aria_code.apps.cli.context import AriaContext
|
|
4002
|
+
from aria_code.apps.cli.headless import bind_to as _bind_headless
|
|
4002
4003
|
|
|
4003
|
-
|
|
4004
|
+
# -p and --watch live in apps/cli/headless.py, bound to this module's names.
|
|
4005
|
+
_HeadlessMixin = _bind_headless(globals())
|
|
4006
|
+
|
|
4007
|
+
|
|
4008
|
+
class ArtheraTerminal(_HeadlessMixin):
|
|
4004
4009
|
"""Interactive REPL inspired by Claude Code CLI."""
|
|
4005
4010
|
|
|
4006
4011
|
def __init__(self, config: dict):
|
|
@@ -6482,258 +6487,6 @@ class ArtheraTerminal:
|
|
|
6482
6487
|
|
|
6483
6488
|
save_config(self.config)
|
|
6484
6489
|
|
|
6485
|
-
async def run_prompt(self, prompt: str, json_output: bool = False,
|
|
6486
|
-
fmt: str = "table", output_file: str = None, quiet: bool = False,
|
|
6487
|
-
machine_out=None):
|
|
6488
|
-
"""Run a single prompt (non-interactive / pipe mode).
|
|
6489
|
-
|
|
6490
|
-
``machine_out`` is the real stdout when the output is JSON (sys.stdout
|
|
6491
|
-
then points at stderr). With fmt "jsonl" each step is written there as
|
|
6492
|
-
one JSON event per line as it happens.
|
|
6493
|
-
"""
|
|
6494
|
-
from aria_code.apps.cli.exec_events import ExecEvents, json_safe
|
|
6495
|
-
events = ExecEvents(machine_out if fmt == "jsonl" else None)
|
|
6496
|
-
events.emit("turn.started", prompt=prompt, model=self.config.get("model", ""))
|
|
6497
|
-
result = await self._run_prompt_turn(prompt, quiet=quiet, events=events)
|
|
6498
|
-
self._finish_prompt(result, json_output=json_output, fmt=fmt, output_file=output_file,
|
|
6499
|
-
quiet=quiet, machine_out=machine_out, events=events)
|
|
6500
|
-
|
|
6501
|
-
async def _run_prompt_turn(self, prompt: str, *, quiet: bool, events) -> dict:
|
|
6502
|
-
"""The work of run_prompt: a slash command, a deterministic answer, or an agent turn."""
|
|
6503
|
-
model = self.config.get("model", "qwen2.5:7b")
|
|
6504
|
-
thinking_mode = self.config.get("thinking_mode", "auto")
|
|
6505
|
-
auth_token = self.config.get("auth_token")
|
|
6506
|
-
user_context = _build_user_context(self.config)
|
|
6507
|
-
|
|
6508
|
-
local_mode = self.config.get("local_mode", False)
|
|
6509
|
-
|
|
6510
|
-
# Dispatch slash commands in -p mode (same as interactive REPL loop).
|
|
6511
|
-
# Without this, /memory /note /init /review are sent to the LLM as plain text.
|
|
6512
|
-
_stripped_prompt = prompt.strip()
|
|
6513
|
-
if self.commands.is_command(_stripped_prompt):
|
|
6514
|
-
self._maybe_show_intent_preflight(_stripped_prompt, quiet=quiet)
|
|
6515
|
-
await self.commands.execute(_stripped_prompt)
|
|
6516
|
-
return {"success": True, "command": _stripped_prompt.split()[0], "response": ""}
|
|
6517
|
-
|
|
6518
|
-
_reference_context = ""
|
|
6519
|
-
_reference_service = getattr(self, "_reference_service", None)
|
|
6520
|
-
if _reference_service is not None and "@" in prompt:
|
|
6521
|
-
_prepared_references = _reference_service.prepare(prompt)
|
|
6522
|
-
if _prepared_references.errors:
|
|
6523
|
-
self._print_reference_errors(_prepared_references)
|
|
6524
|
-
return {"success": False, "response": "", "error": "unresolved @ reference"}
|
|
6525
|
-
if _prepared_references.references:
|
|
6526
|
-
self._print_reference_summary(_prepared_references)
|
|
6527
|
-
prompt = _prepared_references.expanded_text
|
|
6528
|
-
_reference_context = _prepared_references.context_block
|
|
6529
|
-
|
|
6530
|
-
# Keep referenced local files as pointers; the model reads them through
|
|
6531
|
-
# audited tools instead of silently embedding their contents.
|
|
6532
|
-
if _reference_context:
|
|
6533
|
-
prompt = f"{prompt}\n\n{_reference_context}"
|
|
6534
|
-
else:
|
|
6535
|
-
_file_tool_hint = _build_file_tool_hint(prompt)
|
|
6536
|
-
if _file_tool_hint:
|
|
6537
|
-
prompt = _file_tool_hint + prompt
|
|
6538
|
-
self._maybe_show_intent_preflight(prompt, quiet=quiet)
|
|
6539
|
-
|
|
6540
|
-
_curr_model_id_p = self.config.get("model", "")
|
|
6541
|
-
# The route counts as much as the model: on backend_chat the model gets
|
|
6542
|
-
# no local tools whatever it could do with them. This only looked at the
|
|
6543
|
-
# model, so the deterministic chain skipped its data pre-fetch there.
|
|
6544
|
-
from aria_code.apps.cli.workspace_route import no_tools_message, needs_workspace, route_has_tools
|
|
6545
|
-
_model_has_tools_p = route_has_tools(_curr_model_id_p, self.config, self.api_url)
|
|
6546
|
-
|
|
6547
|
-
# ── Broker guide intent: broad discovery should not start an add wizard ──
|
|
6548
|
-
if _is_broker_guide_intent(prompt):
|
|
6549
|
-
if HAS_RICH:
|
|
6550
|
-
console.print("\n[bold]Aria[/bold] [dim] 正在打开券商与服务指南…[/dim]\n")
|
|
6551
|
-
await self.commands.cmd_broker("guide")
|
|
6552
|
-
await self.commands.cmd_broker("services")
|
|
6553
|
-
await self.commands.cmd_packages("services")
|
|
6554
|
-
return {"success": True, "command": "/broker guide", "response": ""}
|
|
6555
|
-
|
|
6556
|
-
# ── Broker setup intent: intercept before LLM / deterministic routing ──
|
|
6557
|
-
if _is_broker_setup_intent(prompt):
|
|
6558
|
-
_btype_p = _detect_broker_type(prompt)
|
|
6559
|
-
if HAS_RICH:
|
|
6560
|
-
from apps.cli.utils.market_detect import _BROKER_SETUP_NAMES
|
|
6561
|
-
_display_p = _BROKER_SETUP_NAMES.get(_btype_p, ("",))[0] if _btype_p else ""
|
|
6562
|
-
_label_p = f" 正在启动{_display_p}配置向导…" if _display_p else " 正在启动券商配置向导…"
|
|
6563
|
-
console.print(f"\n[bold]Aria[/bold] [dim]{_label_p}[/dim]\n")
|
|
6564
|
-
await self.commands._cmd_broker_add(_btype_p)
|
|
6565
|
-
return {"success": True, "command": "/broker add", "response": ""}
|
|
6566
|
-
|
|
6567
|
-
# ── Football prediction intercept → built-in Poisson handler ──────────
|
|
6568
|
-
if await self._try_football_nl_intercept(prompt):
|
|
6569
|
-
return {"success": True, "command": "football", "response": ""}
|
|
6570
|
-
|
|
6571
|
-
deterministic = _run_deterministic_chain(
|
|
6572
|
-
prompt, model_has_tools=_model_has_tools_p)
|
|
6573
|
-
if deterministic.get("success") or _is_stock_chart_analysis_request(prompt):
|
|
6574
|
-
result = deterministic
|
|
6575
|
-
else:
|
|
6576
|
-
# No one reads a headless answer before a script acts on it. A task
|
|
6577
|
-
# about this folder on a model that cannot open it would come back as
|
|
6578
|
-
# a confident guess with exit 0; fail before sending it instead.
|
|
6579
|
-
if not _model_has_tools_p and needs_workspace(prompt):
|
|
6580
|
-
_zh = str(self.config.get("ui_lang", "en")).lower().startswith("zh")
|
|
6581
|
-
_why = no_tools_message(self.config, lang="zh" if _zh else "en")
|
|
6582
|
-
print(_why, file=sys.stderr)
|
|
6583
|
-
return {"success": False, "response": "", "error": "model_cannot_use_tools", "detail": _why}
|
|
6584
|
-
# Spinner for terminal usage: gives visual feedback while the model generates.
|
|
6585
|
-
# Only starts when we actually need to call the LLM (not for deterministic responses).
|
|
6586
|
-
_prompt_spinner = None
|
|
6587
|
-
if HAS_RICH and sys.stdout.isatty():
|
|
6588
|
-
try:
|
|
6589
|
-
_prompt_spinner = console.status("", spinner="dots", spinner_style="dim")
|
|
6590
|
-
_prompt_spinner.__enter__()
|
|
6591
|
-
except Exception:
|
|
6592
|
-
_prompt_spinner = None
|
|
6593
|
-
try:
|
|
6594
|
-
# Headless -p runs the SAME loop as the REPL.
|
|
6595
|
-
#
|
|
6596
|
-
# It used to call stream_provider_result directly: one provider
|
|
6597
|
-
# round, tool schemas advertised but nothing executing what came
|
|
6598
|
-
# back, and a single best-effort pass over tool_calls_pending
|
|
6599
|
-
# afterwards whose results the model never saw. So `-p` was not
|
|
6600
|
-
# agentic at all — no rounds, no tool results fed back, no loop
|
|
6601
|
-
# guard, no acceptance gate. Every non-interactive user (CI, a
|
|
6602
|
-
# pipe, the eval harness) got a chat reply where the REPL would
|
|
6603
|
-
# have done the work.
|
|
6604
|
-
#
|
|
6605
|
-
# run_chat_via_runtime is the documented single entry point and
|
|
6606
|
-
# already handles provider selection and cloud→Ollama fallback,
|
|
6607
|
-
# which is what the two branches here were open-coding.
|
|
6608
|
-
from aria_code.apps.cli.providers.runtime_bridge import run_chat_via_runtime
|
|
6609
|
-
|
|
6610
|
-
_turn = await run_chat_via_runtime(
|
|
6611
|
-
prompt=prompt, history=[],
|
|
6612
|
-
local_tools=LOCAL_TOOLS, tool_schemas=LOCAL_TOOL_SCHEMAS,
|
|
6613
|
-
model=model, config=self.config, api_url=self.api_url,
|
|
6614
|
-
ollama_url=self.config.get("ollama_url", "http://localhost:11434"),
|
|
6615
|
-
thinking_mode=thinking_mode, user_context=user_context,
|
|
6616
|
-
auth_token=auth_token, project_context=_PROJECT_CONTEXT,
|
|
6617
|
-
max_rounds=int(self.config.get("max_rounds", 30) or 30),
|
|
6618
|
-
# No approval UI exists in headless mode. Leaving the confirm
|
|
6619
|
-
# set populated would block every write on a prompt nobody is
|
|
6620
|
-
# there to answer; the operator opts in with
|
|
6621
|
-
# --dangerously-skip-permissions or --allow-tools.
|
|
6622
|
-
confirm_tools=(
|
|
6623
|
-
frozenset() if _auto_approve_session
|
|
6624
|
-
else frozenset(_CONFIRM_TOOLS) - _session_always_allow
|
|
6625
|
-
),
|
|
6626
|
-
on_tool_call=events.tool_started,
|
|
6627
|
-
on_tool_result=events.tool_completed,
|
|
6628
|
-
return_result=True,
|
|
6629
|
-
)
|
|
6630
|
-
_tools_used = list(getattr(_turn.final, "tools", []) or [])
|
|
6631
|
-
# An empty closing message after the tools already ran is not a
|
|
6632
|
-
# failed turn. The model did the work and then said nothing;
|
|
6633
|
-
# exiting 1 there told a script the task failed while the edit
|
|
6634
|
-
# sat finished on disk. Narrow on purpose — any other error,
|
|
6635
|
-
# and a turn that ran no tools at all, still fails.
|
|
6636
|
-
_empty_after_work = (
|
|
6637
|
-
_turn.error == "empty_response" and bool(_tools_used)
|
|
6638
|
-
)
|
|
6639
|
-
result = {
|
|
6640
|
-
"success": _turn.ok or _empty_after_work,
|
|
6641
|
-
"response": (
|
|
6642
|
-
_turn.text
|
|
6643
|
-
or (f"(模型未给出收尾说明。已执行的工具:{', '.join(_tools_used)})"
|
|
6644
|
-
if _empty_after_work else "")
|
|
6645
|
-
),
|
|
6646
|
-
"error": "" if _empty_after_work else (_turn.error or ""),
|
|
6647
|
-
"provider": getattr(_turn.final, "provider", ""),
|
|
6648
|
-
"tools_used": _tools_used,
|
|
6649
|
-
"acceptance": getattr(_turn.final, "acceptance", None),
|
|
6650
|
-
}
|
|
6651
|
-
finally:
|
|
6652
|
-
if _prompt_spinner is not None:
|
|
6653
|
-
try:
|
|
6654
|
-
_prompt_spinner.__exit__(None, None, None)
|
|
6655
|
-
except Exception:
|
|
6656
|
-
pass
|
|
6657
|
-
|
|
6658
|
-
return result
|
|
6659
|
-
|
|
6660
|
-
def _finish_prompt(self, result: dict, *, json_output: bool, fmt: str, output_file,
|
|
6661
|
-
quiet: bool, machine_out, events) -> None:
|
|
6662
|
-
"""Print or save run_prompt's result, and exit 1 if it failed."""
|
|
6663
|
-
from aria_code.apps.cli.exec_events import json_safe
|
|
6664
|
-
result = result or {"success": False, "response": "", "error": "no result"}
|
|
6665
|
-
# The agent loop executes tools now, so there is nothing left over to
|
|
6666
|
-
# run here — only stream_provider_result ever populated
|
|
6667
|
-
# tool_calls_pending, and the deterministic chain never does. Keeping
|
|
6668
|
-
# the old pass would risk running a write twice.
|
|
6669
|
-
#
|
|
6670
|
-
# What is worth surfacing instead is the acceptance verdict: in headless
|
|
6671
|
-
# mode nobody watched the run, so a turn that changed files and failed
|
|
6672
|
-
# its checks must say so on stderr rather than print a confident summary
|
|
6673
|
-
# and exit 0.
|
|
6674
|
-
_acceptance = (result or {}).get("acceptance") or {}
|
|
6675
|
-
if _acceptance.get("verified") is False and not quiet:
|
|
6676
|
-
_zh = str(self.config.get("ui_lang", "en")).lower().startswith("zh")
|
|
6677
|
-
print(f"⚠ {'验收未通过' if _zh else 'Checks failed'}: {_acceptance.get('headline', '')}",
|
|
6678
|
-
file=sys.stderr)
|
|
6679
|
-
|
|
6680
|
-
events.emit("turn.completed", **json_safe(result))
|
|
6681
|
-
out = machine_out or sys.stdout
|
|
6682
|
-
if fmt == "jsonl":
|
|
6683
|
-
content = None # the events were the output
|
|
6684
|
-
elif json_output or fmt == "json":
|
|
6685
|
-
content = json.dumps(json_safe(result), ensure_ascii=False, indent=2)
|
|
6686
|
-
elif fmt == "csv":
|
|
6687
|
-
content = f"role,content\nassistant,\"{result.get('response', '').replace(chr(34), chr(34)+chr(34))}\""
|
|
6688
|
-
elif fmt == "md":
|
|
6689
|
-
content = f"# Aria Code AI Response\n\n{result.get('response', '')}\n"
|
|
6690
|
-
else:
|
|
6691
|
-
content = result.get("response", "") if result.get("success") else f"Error: {result.get('error', 'Unknown')}"
|
|
6692
|
-
|
|
6693
|
-
# Output routing
|
|
6694
|
-
if content is None or (fmt == "table" and not json_output and result.get("command") and not content):
|
|
6695
|
-
pass # jsonl, or a command that printed its own output
|
|
6696
|
-
elif output_file:
|
|
6697
|
-
with open(output_file, "w") as f:
|
|
6698
|
-
f.write(content)
|
|
6699
|
-
if not quiet:
|
|
6700
|
-
console.print(f"[green]Saved to {output_file}[/green]" if HAS_RICH
|
|
6701
|
-
else f"Saved: {output_file}")
|
|
6702
|
-
elif not result.get("success") and fmt == "table" and not json_output:
|
|
6703
|
-
print(f"Error: {result.get('error', 'Unknown')}", file=sys.stderr)
|
|
6704
|
-
# In default (table) format: render with Rich Markdown when output is
|
|
6705
|
-
# a terminal. This gives properly formatted headings, bold, and tables
|
|
6706
|
-
# in interactive use. When piped/redirected, fall back to plain text
|
|
6707
|
-
# for scripting compatibility.
|
|
6708
|
-
elif HAS_RICH and fmt == "table" and not json_output and sys.stdout.isatty() and result.get("success"):
|
|
6709
|
-
console.print(make_markdown(_strip_latex(content)))
|
|
6710
|
-
else:
|
|
6711
|
-
print(content, file=out, flush=True)
|
|
6712
|
-
# A failed turn exits 1 in every format. Only table did; with --json a
|
|
6713
|
-
# script got exit 0 and had to read the body to learn it had failed.
|
|
6714
|
-
if not result.get("success"):
|
|
6715
|
-
sys.exit(1)
|
|
6716
|
-
|
|
6717
|
-
async def run_watch(self, command_fn, interval: int, cmd_args: str):
|
|
6718
|
-
"""Run a command repeatedly with interval (like Unix watch)."""
|
|
6719
|
-
try:
|
|
6720
|
-
while True:
|
|
6721
|
-
if not self.config.get("_quiet"):
|
|
6722
|
-
os.system("clear" if os.name == "posix" else "cls")
|
|
6723
|
-
ts = datetime.now().strftime("%H:%M:%S")
|
|
6724
|
-
if HAS_RICH:
|
|
6725
|
-
console.print(f"[dim]Every {interval}s | {ts} | Ctrl+C to stop[/dim]\n")
|
|
6726
|
-
else:
|
|
6727
|
-
print(f"Every {interval}s | {ts} | Ctrl+C to stop\n")
|
|
6728
|
-
|
|
6729
|
-
await command_fn(cmd_args)
|
|
6730
|
-
|
|
6731
|
-
await asyncio.sleep(interval)
|
|
6732
|
-
except (KeyboardInterrupt, asyncio.CancelledError):
|
|
6733
|
-
if HAS_RICH:
|
|
6734
|
-
console.print("\n[dim]Watch stopped[/dim]")
|
|
6735
|
-
else:
|
|
6736
|
-
print("\nStopped")
|
|
6737
6490
|
|
|
6738
6491
|
|
|
6739
6492
|
# ============================================================================
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aria-code
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.96.0
|
|
4
4
|
Summary: Open-source AI agent for coding, financial analysis and logistics operations: numbers you can check, client data kept apart, actions a person approves
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
Project-URL: Homepage, https://github.com/artheras/aria-code
|