aria-code 0.161.0__tar.gz → 0.163.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.161.0/src/aria_code.egg-info → aria_code-0.163.0}/PKG-INFO +2 -2
- {aria_code-0.161.0 → aria_code-0.163.0}/README.md +1 -1
- {aria_code-0.161.0 → aria_code-0.163.0}/pyproject.toml +1 -1
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/_version.py +1 -1
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/app_server.py +3 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/bootstrap.py +2 -4
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/auth_cmds.py +11 -4
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/model_cmds.py +58 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/config_store.py +31 -0
- aria_code-0.163.0/src/aria_code/apps/cli/endpoint_migration.py +58 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/google_login.py +43 -2
- aria_code-0.163.0/src/aria_code/apps/cli/session_refresh.py +115 -0
- aria_code-0.163.0/src/aria_code/apps/cli/web_login.py +135 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/mcp_client.py +40 -2
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/providers/llm/arthera_gateway.py +9 -8
- {aria_code-0.161.0 → aria_code-0.163.0/src/aria_code.egg-info}/PKG-INFO +2 -2
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code.egg-info/SOURCES.txt +10 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_arthera_gateway_provider.py +2 -2
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_dispatcher_pins_match_the_release.py +1 -1
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_doctor_describes_the_current_install.py +3 -3
- aria_code-0.163.0/tests/test_endpoint_migration.py +71 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_license_consistency.py +1 -1
- aria_code-0.163.0/tests/test_login_api_url.py +36 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_market_questions_on_backend.py +1 -1
- aria_code-0.163.0/tests/test_mcp_fast_fail.py +65 -0
- aria_code-0.163.0/tests/test_model_native_picker.py +103 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_native_app.py +11 -9
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_native_binary_entrypoints.py +3 -3
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_native_checkpoints.py +1 -1
- aria_code-0.163.0/tests/test_native_go_app.py +155 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_native_go_stream.py +1 -0
- aria_code-0.163.0/tests/test_native_session_export.py +87 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_platform_package_assembly.py +21 -14
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_platform_packages.py +21 -19
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_runtime_event_identity.py +1 -1
- aria_code-0.163.0/tests/test_session_refresh.py +96 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_update_health_routes.py +4 -4
- aria_code-0.163.0/tests/test_web_login.py +105 -0
- aria_code-0.161.0/tests/test_native_go_app.py +0 -62
- {aria_code-0.161.0 → aria_code-0.163.0}/LICENSE +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/NOTICE +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/setup.cfg +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/adk_apps/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/base.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/code_review.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/deep/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/deep/critic.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/deep/deepen.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/deep/models.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/deep/pipeline.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/deep/themes.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/deep/tiers.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/engineering/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/engineering/coder.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/engineering/tester.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/financial/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/financial/catalyst.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/financial/debate.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/financial/earnings.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/financial/fundamental.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/financial/macro.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/financial/news.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/financial/risk.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/financial/sector.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/financial/strategist.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/financial/synthesis.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/financial/technical.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/orchestrator.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/portfolio_agent.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/realty/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/realty/business_match.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/registry.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/signal_scheme.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/sports/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/sports/football_agent.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/supervisor.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/team.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/video/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/video/director.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/video/qa_agent.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/video/script_doctor.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/aliyun_data_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/README.md +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/channels/README.md +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/channels/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/channels/approvals.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/channels/conversation.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/channels/digest.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/channels/intake.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/channels/registry.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/channels/tradingview.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/README.md +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/_optional.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/broker_render.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/chat_turn.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/core_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/data_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/market.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/report.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/team.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/config_paths.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/constants.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/context.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/conversation_policy.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/deterministic.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/direct.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/earnings_view.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/exec_events.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/football_reports.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/handlers/market_handlers.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/headless.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/helpers.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/hooks.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/i18n.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/intent.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/intent_router.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/main.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/market_hours.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/market_universe.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/message_processing.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/mixin_binding.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/model_probe.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/model_retirement.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/native_branding.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/native_bridge.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/native_entry.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/preflight.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/project_aria.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/providers/base.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/release_download.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/review_runner.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/sandbox.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/session_export.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/session_store.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/task_isolation.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/terminal_chrome.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/tools/context.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/transactions.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/update_check.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/updater.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/workflow_runner.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/cli/workspace_route.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/daemon/README.md +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/vscode/README.md +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/apps/vscode/package.json +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/aria_cli.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/aria_daemon.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/aria_feishu_bot.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/aria_mcp_server.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/aria_relay_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/aria_relay_server.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/aria_telegram_bot.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/ariarc.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/artifacts.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/backtest_engine.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/backtest_report.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/brokers/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/brokers/automation.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/brokers/base.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/brokers/capabilities.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/brokers/cn/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/brokers/config.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/brokers/intl/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/brokers/paper_broker.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/brokers/planning.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/brokers/registry.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/brokers/trading.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/canva_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/change_store.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/clients/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/clients/aria_relay_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/clients/canva_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/clients/figma_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/clients/football_data_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/clients/kling_video_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/clients/market_data_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/clients/openai_image_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/clients/runway_video_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/cloud_memory.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/command_safety.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/computer_use_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/dashboard_generator.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/data_analysis_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/data_cleaner.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/data_service.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/datasources/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/datasources/base.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/datasources/router.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/datasources/sources/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/demo_player.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/doctor.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/domain/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/domain/backtest_engine.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/domain/backtest_report.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/domain/finance_formulas.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/domain/performance_stats.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/domain/strategy_vault.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/evals/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/evals/behavior.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/evals/gap.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/evals/harness.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/evals/review_probe.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/evals/runner.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/evals/summary.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/external_agent_runner.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/figma_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/file_analysis_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/finance_formulas.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/football_data_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/image_gen_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/intent_classifier.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/kling_video_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/licensing.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/local_finance_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/local_image_provider.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/local_llm_provider.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/macro_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/markdown_pdf.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/market_data_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/memory_manager.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/model_capability.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/notification_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/openai_image_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_core/export.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_core/paths.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_infra/product.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_services/cache.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_services/context.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_services/data.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_services/references.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_services/registry.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_services/settings.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_services/usage.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packs/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packs/base.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packs/finance/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packs/logistics/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packs/payments/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packs/realty/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packs/registry.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/packs/rules.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/plan_utils.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/plugin_loader.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/portfolio_ledger.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/preview_server.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/privacy/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/privacy/feedback.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/project_review.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/project_review_api.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/project_review_server.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/project_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/providers/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/providers/google_video_provider.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/providers/llm/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/providers/llm/anthropic.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/providers/llm/base.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/providers/llm/custom.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/providers/llm/ollama.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/providers/llm/registry.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/providers/local_image_provider.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/providers/local_llm_provider.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/providers/tool_messages.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/realty_data_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/relay_store.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/report_exporters.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/report_generator.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/review_service.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/acceptance.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/agent_loop.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/approval.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/baseline.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/budget.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/checkpoints.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/contract.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/crash_report.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/delivery.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/events.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/gateway.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/lsp.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/native_index.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/orchestrator.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/processes.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/project_graph.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/repo_map.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/review.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/run_state.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/run_store.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/self_healing.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/semantic_diff.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/subagent.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/symbol_edit.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/task_ledger.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/task_worktree.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/tool_executor.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/tool_policy.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/transactions.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/windows_job.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/workflows.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runtime/worktrees.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/runway_video_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/safety/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/safety/client_isolation.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/safety/permissions.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/safety/risk.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/safety/sandbox.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/safety/service.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/setup_wizard.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/spreadsheet_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/strategy_vault.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/artifact_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/broker_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/build_quant_engine.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/code_audit_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/computer_use_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/extended_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/image_gen_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/local_finance_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/logistics_carriers.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/logistics_inventory.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/logistics_io.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/logistics_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/macro_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/notification_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/project_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/realty_data_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/stripe_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/tools/video_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/training/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/training/compare.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/training/sft_dataset.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/ui/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/ui/banner.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/ui/completer.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/ui/console.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/ui/input_box.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/ui/mentions.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/ui/picker.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/ui/render/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/ui/render/actions.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/ui/render/finance.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/ui/render/market.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/ui/render/output.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/ui/render/responsive.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/ui/render/team.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/ui/robot.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/ui/startup_dashboard.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/utils/vscode_uri.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/video_analysis.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/video_editor.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/video_workflow/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/video_workflow/__main__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/video_workflow/engines/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/video_workflow/engines/base.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/video_workflow/engines/custom_model.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/video_workflow/engines/google_veo.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/video_workflow/engines/local_engine.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/video_workflow/engines/registry.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/video_workflow/google_models.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/video_workflow/music/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/video_workflow/music/foley_service.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/video_workflow/music/service.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/video_workflow/pipeline.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/video_workflow/plan.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/video_workflow/session.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/workspace/__init__.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/workspace/files.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/workspace/verify.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/workspace_changes.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/workspace_context.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/workspace_service.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code/workspace_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code.egg-info/entry_points.txt +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code.egg-info/requires.txt +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/src/aria_code.egg-info/top_level.txt +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_action_view.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_adk_market_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_agent_key_points_language.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_agent_team_fallback.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_analyze_file_tool.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_architecture_ledger_is_true.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_architecture_report.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_aria_cli_core.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_aria_mcp_server.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_aria_sdk.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_artifact_publishing.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_artifacts_and_reports.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_ashare_prediction_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_background_processes.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_backtest_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_backtest_engine.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_backtest_report.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_backtest_runs_what_it_names.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_baseline.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_broken_akshare_is_optional.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_broker_automation.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_broker_chat_confirm_gate.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_broker_planning.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_broker_safety.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_broker_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_budget.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_business_workflow_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_callback_provider_cleanup.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_canva_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_canvas_cmds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_card_approvals.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_change_contract.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_channel_intake.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_channels.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_chart_handlers.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_chat_bots_fail_closed.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_chat_routing.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_checkpoints_since.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_ci_security_workflow.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_cli_app_split.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_cli_bootstrap.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_cli_config_store.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_cli_lifecycle_hooks.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_cli_runtime_consumer.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_cli_tool_executor_module.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_cli_updater.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_client_isolation_guard.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_cloud_memory.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_code_audit_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_code_review_agent.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_codegen_output.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_coder_tester_self_healing.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_coder_tool_safety.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_collaboration.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_command_loggers.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_command_safety.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_compare_strategies.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_completions_builder.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_config_paths.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_configured_provider.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_container_entrypoint.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_container_entrypoints.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_context_checkpoints.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_context_references.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_context_service.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_conversation_core.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_conversation_policy.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_crash_report.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_credential_file_permissions.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_custom_providers.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_daemon_gateway_config.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_dashboard_generator.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_data_service.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_data_service_imports.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_data_without_model.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_datasource_routing.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_deep_analysis.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_degrades_without_quant_engine.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_delivery_report.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_doctor.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_doctor_npm_scope.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_doctor_sandbox.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_edit_and_command_safety.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_engine_boundary.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_english_output_group.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_enterprise_tool_honesty.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_env_switch_docs.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_eval_behavior.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_eval_hard_suite.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_eval_holdout.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_eval_summary.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_eval_task_bank.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_eval_trajectories.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_evals_harness.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_event_import_roots.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_exec_events.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_extended_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_feishu_swarm_config.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_file_links.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_finalize_release.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_finance_renderers.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_finance_service_catalog.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_first_run_output.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_first_run_works.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_football_agent.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_football_prediction_output.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_frozen_module_aliases.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_gemini_retirement.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_general_turn_prompt.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_google_cloud_models.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_google_cloud_routing.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_google_login.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_google_search_provider.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_headless_command_approval.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_headless_is_agentic.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_honest_surfaces.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_image_gen_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_image_inputs.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_import_aliasing.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_import_graph_budget.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_intent_router.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_intent_signals.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_kling_video_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_lazy_rebind.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_legacy_module_imports.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_licensing.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_linux_sandbox_integration.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_local_image_provider.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_local_workspace_execution.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_logistics_3pl.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_logistics_and_finance_agents.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_lsp.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_markdown_pdf.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_market_answers_in_english.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_market_data_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_market_history_inheritance.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_market_history_tool.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_market_hours.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_market_symbol_extraction.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_market_universe.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_mcp_circuit.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_mcp_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_mentions.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_model_capability_registry.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_model_choice_is_the_users.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_model_number_selection.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_model_probe.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_model_selection_state.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_narrow_chinese_output.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_native_branding.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_native_bridge.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_native_entry.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_native_eval_trajectories.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_native_go_acceptance.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_native_go_bridge.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_native_go_contract.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_native_go_delivery.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_native_go_providers.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_native_go_review.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_native_go_risk.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_native_index.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_native_installer.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_native_runtime_domain.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_native_training_compare.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_native_training_dataset.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_natural_language_routing.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_new_modules.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_no_tools_route.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_no_uncommitted_imports.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_numeric_listings.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_ollama_stream_imports.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_ollama_stream_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_openai_image_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_operations_suite.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_os_sandbox.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_output_discipline_prompt.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_output_rendering.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_packages_facade.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_packaging_constraints.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_packaging_manifest.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_packs_domains.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_pdf_report.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_performance_stats.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_pick_best_installed_model.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_plan_mode.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_plan_schema.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_plan_without_material.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_platform_publish.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_plotly_html_output.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_portfolio_language.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_portfolio_ledger.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_portfolio_periods.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_post_turn_context_decision.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_preflight.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_preview_server.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_privacy_feedback.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_project_aria.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_project_context_files.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_project_graph.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_project_review.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_project_review_api.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_prompt_assembly.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_prompt_dates.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_prompt_selection.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_provider_autoconfig.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_provider_error_classification.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_provider_error_messages.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_provider_integration.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_provider_project_config.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_provider_registry.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_public_service_status.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_quant_engine_namespace.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_rebind_contract.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_rebind_namespace_contract.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_relay_client_credentials.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_relay_contract.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_relay_event_verification.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_relay_reliability.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_relay_sends_for_clients.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_relay_store.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_relay_url.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_release_badges.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_release_chain.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_release_commit_identity.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_release_download.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_release_push_is_atomic.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_release_reaches_the_registries.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_release_verification_waits.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_release_workflow_permissions.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_report_charts.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_report_generator.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_report_prompt_language.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_research_protocol.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_research_quality.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_responsive_rendering.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_review_gate.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_review_service.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_risk_approval.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_risk_assessment.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_risk_earnings_ops.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_robot_artwork.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_root_module_budget.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_rsi_without_pandas_ta.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_run_store_redaction.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_runtime_acceptance.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_runtime_agent_loop.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_runtime_approval.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_runtime_bridge.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_runtime_bridge_fallback.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_runtime_checkpoints.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_runtime_gateway.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_runtime_repo_map.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_runtime_run_store.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_runtime_tool_executor.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_runtime_worktrees.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_runway_video_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_rust_cli.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_rust_state.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_rust_stream.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_safety_permissions.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_safety_service.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_safety_service_adoption.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_semantic_diff.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_service_diagnostics_security.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_session_search.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_settings_service.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_shell_commands_as_written.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_shipper_digest.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_single_import_root.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_skill_agent_binding.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_skill_catalog.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_skill_loader.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_slash_popup.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_spreadsheet_tools.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_sse_http_roundtrip.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_sse_stream_contract.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_startup_dashboard.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_startup_keeps_cloud_model.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_startup_latency.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_status_language.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_streaming_pipeline.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_stripe_agent.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_subagent.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_subagent_workspace.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_supervisor_routing.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_symbol_edit.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_system_prompts.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_system_tools_output.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_task_isolation_turn.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_task_orchestrator.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_task_restore_startup.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_task_worktree.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_team_analysts.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_team_synthesis.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_terminal_mixins.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_terminal_snapshots.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_tls_trust_store.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_tool_policy.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_tool_rounds_on_openai_apis.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_tool_scope.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_tool_step_output.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_trading_service.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_tradingview_bridge.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_training_pipeline.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_transactions.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_transactions_turn.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_turn_planning.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_ui_completer_references.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_ui_console_theme.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_ui_input_box.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_ui_language_and_model.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_ui_robot_banner.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_verification_hint.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_verification_policy.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_verification_runner_selection.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_version_consistency.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_version_counter.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_vertex_busy_retry.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_vertex_empty_rounds.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_vertex_models.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_vertex_project.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_vertexai_tool_history.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_video_analysis.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_video_director.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_video_editor.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_video_engines.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_video_multi_agent.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_video_session.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_vscode_mcp.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_warehouse_agents.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_warehouse_cli_registration.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_warehouse_erp_client.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_warehouse_workflow.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_wheel_is_installable.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_workflows.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_workspace_changes.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_workspace_context.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_workspace_files.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_workspace_scope.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_workspace_service.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.0}/tests/test_workspace_verify.py +0 -0
- {aria_code-0.161.0 → aria_code-0.163.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.163.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
|
|
@@ -172,7 +172,7 @@ Numbers you can check, client data kept apart, actions a person approves.</p>
|
|
|
172
172
|
<p align="center">
|
|
173
173
|
<a href="https://www.npmjs.com/package/@artheras/aria-code"><img src="https://img.shields.io/npm/v/@artheras/aria-code/latest?style=flat-square&logo=npm&label=npm" alt="npm version"></a>
|
|
174
174
|
<!-- Release automation pins PyPI: the default endpoint still selects legacy 4.x. -->
|
|
175
|
-
<a href="https://pypi.org/project/aria-code/0.
|
|
175
|
+
<a href="https://pypi.org/project/aria-code/0.163.0/"><img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fpypi.org%2Fpypi%2Faria-code%2F0.163.0%2Fjson&query=%24.info.version&prefix=v&style=flat-square&logo=pypi&label=PyPI&color=blue&cacheSeconds=300" alt="PyPI version"></a>
|
|
176
176
|
<a href="https://github.com/artheras/aria-code/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/artheras/aria-code/ci.yml?branch=main&style=flat-square&logo=githubactions&label=CI" alt="CI status"></a>
|
|
177
177
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache%202.0-64748b?style=flat-square" alt="Apache License 2.0"></a>
|
|
178
178
|
</p>
|
|
@@ -15,7 +15,7 @@ Numbers you can check, client data kept apart, actions a person approves.</p>
|
|
|
15
15
|
<p align="center">
|
|
16
16
|
<a href="https://www.npmjs.com/package/@artheras/aria-code"><img src="https://img.shields.io/npm/v/@artheras/aria-code/latest?style=flat-square&logo=npm&label=npm" alt="npm version"></a>
|
|
17
17
|
<!-- Release automation pins PyPI: the default endpoint still selects legacy 4.x. -->
|
|
18
|
-
<a href="https://pypi.org/project/aria-code/0.
|
|
18
|
+
<a href="https://pypi.org/project/aria-code/0.163.0/"><img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fpypi.org%2Fpypi%2Faria-code%2F0.163.0%2Fjson&query=%24.info.version&prefix=v&style=flat-square&logo=pypi&label=PyPI&color=blue&cacheSeconds=300" alt="PyPI version"></a>
|
|
19
19
|
<a href="https://github.com/artheras/aria-code/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/artheras/aria-code/ci.yml?branch=main&style=flat-square&logo=githubactions&label=CI" alt="CI status"></a>
|
|
20
20
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache%202.0-64748b?style=flat-square" alt="Apache License 2.0"></a>
|
|
21
21
|
</p>
|
|
@@ -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.163.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" }
|
|
@@ -285,6 +285,9 @@ class Server:
|
|
|
285
285
|
# The host draws its own turn footer. Keep this presentation flag out
|
|
286
286
|
# of saved user settings and retain normal Python CLI behaviour.
|
|
287
287
|
terminal._native_frontend = True
|
|
288
|
+
# Commands that need a choice (/model) draw it in the host's own menu.
|
|
289
|
+
# This process's stdin is a pipe, so the TTY arrow picker can never run.
|
|
290
|
+
terminal._native_select = self.select
|
|
288
291
|
execute = terminal.tool_executor.execute_local
|
|
289
292
|
def tracked(*args, **kwargs):
|
|
290
293
|
with self.tool_lock:
|
|
@@ -154,10 +154,8 @@ DEFAULT_MODEL = os.getenv("ARIA_DEFAULT_MODEL", "google/gemini-3.5-flash")
|
|
|
154
154
|
|
|
155
155
|
def default_config() -> dict:
|
|
156
156
|
return {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
"http://localhost:8000",
|
|
160
|
-
),
|
|
157
|
+
# The Arthera backend and gateway. Not localhost: see endpoint_migration.
|
|
158
|
+
"api_url": os.getenv("ARTHERA_API_URL", "").strip() or "https://api.arthera.xyz",
|
|
161
159
|
"local_url": "http://localhost:8000",
|
|
162
160
|
"ollama_url": os.getenv("OLLAMA_URL", "http://localhost:11434"),
|
|
163
161
|
# Which backend serves a bare, unprefixed model name. Only consulted
|
|
@@ -145,18 +145,25 @@ class AuthCommandsMixin:
|
|
|
145
145
|
"""
|
|
146
146
|
import asyncio as _asyncio
|
|
147
147
|
|
|
148
|
-
from ..google_login import run_google_login
|
|
148
|
+
from ..google_login import login_api_url, run_google_login
|
|
149
|
+
import os as _os
|
|
150
|
+
|
|
151
|
+
from ..web_login import run_web_login
|
|
149
152
|
|
|
150
153
|
rich = self.context.has_rich
|
|
154
|
+
api_url = login_api_url(self.terminal.api_url)
|
|
151
155
|
self.context.console.print(
|
|
152
156
|
"[dim]Opening your browser to sign in or create an account…[/dim]"
|
|
153
157
|
if rich else "Opening your browser to sign in or create an account…"
|
|
154
158
|
)
|
|
155
159
|
|
|
156
160
|
try:
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
)
|
|
161
|
+
# The account page (a choice of Google, Apple or email, with sign-up)
|
|
162
|
+
# is opt-in until it is deployed; until then this goes straight to Google.
|
|
163
|
+
if _os.getenv("ARIA_LOGIN_PAGE") == "1":
|
|
164
|
+
session = await _asyncio.to_thread(run_web_login, api_url)
|
|
165
|
+
else:
|
|
166
|
+
session = await _asyncio.to_thread(run_google_login, api_url)
|
|
160
167
|
except RuntimeError as exc:
|
|
161
168
|
print_error(self.context, str(exc), "login")
|
|
162
169
|
return
|
|
@@ -387,6 +387,8 @@ class ModelCommandsMixin:
|
|
|
387
387
|
_term_cols = os.get_terminal_size().columns
|
|
388
388
|
except Exception:
|
|
389
389
|
_term_cols = 80
|
|
390
|
+
if getattr(self.terminal, "_native_select", None) is not None:
|
|
391
|
+
_term_cols = 110 # the host's menu is about this wide; not a TTY to measure
|
|
390
392
|
|
|
391
393
|
def _cjk_width(s: str) -> int:
|
|
392
394
|
"""Display-column width (CJK = 2 cols each)."""
|
|
@@ -448,6 +450,19 @@ class ModelCommandsMixin:
|
|
|
448
450
|
options: list = [] # (label_str, desc_str) for _arrow_select
|
|
449
451
|
all_ids: list = []
|
|
450
452
|
|
|
453
|
+
# ── Native frontend: pick in the host's menu, not from a printed list ─
|
|
454
|
+
# Arrow keys and Enter, the way Claude and ChatGPT do it. The list used
|
|
455
|
+
# to be printed and the user had to type a number back.
|
|
456
|
+
native_select = getattr(self.terminal, "_native_select", None)
|
|
457
|
+
if native_select is not None and not name:
|
|
458
|
+
await self._pick_model_in_host(
|
|
459
|
+
native_select, picker_title=_picker_title, current_id=current_id,
|
|
460
|
+
current_provider=current_provider, rich_models=rich_models,
|
|
461
|
+
aria_ids=aria_ids, status_tag=_status_tag, short_desc=_short_desc,
|
|
462
|
+
lang=_lang,
|
|
463
|
+
)
|
|
464
|
+
return
|
|
465
|
+
|
|
451
466
|
# ── Print numbered list only in non-interactive (-p) mode ────────────
|
|
452
467
|
# In interactive TTY mode the arrow picker below already shows all items.
|
|
453
468
|
# Printing twice causes the visual duplication seen in the session log.
|
|
@@ -570,6 +585,49 @@ class ModelCommandsMixin:
|
|
|
570
585
|
|
|
571
586
|
self._set_model_by_id(all_ids[choice], provider=current_provider)
|
|
572
587
|
|
|
588
|
+
async def _pick_model_in_host(self, native_select, *, picker_title, current_id, current_provider,
|
|
589
|
+
rich_models, aria_ids, status_tag, short_desc, lang):
|
|
590
|
+
"""Offer every model in the frontend's menu and apply the choice.
|
|
591
|
+
|
|
592
|
+
One row per model: the name (with a mark for the current one and for
|
|
593
|
+
whether it is installed) and, beneath it, what it is for and its
|
|
594
|
+
limits. Aria's catalogue comes first, then community Ollama models.
|
|
595
|
+
"""
|
|
596
|
+
zh = str(lang).lower().startswith("zh")
|
|
597
|
+
rows: list = [] # (model_id, label, help)
|
|
598
|
+
for m in _get_MODELS().values():
|
|
599
|
+
mid = m["id"]
|
|
600
|
+
tags = short_desc(m)
|
|
601
|
+
current = (" ✓ 当前" if zh else " ✓ current") if mid == current_id else ""
|
|
602
|
+
rows.append((mid, f"{status_tag(mid, m.get('badge', ''))} {m['name']}{current}", tags))
|
|
603
|
+
if current_provider == "ollama":
|
|
604
|
+
for cm in rich_models:
|
|
605
|
+
if cm["name"] in aria_ids:
|
|
606
|
+
continue
|
|
607
|
+
current = (" ✓ 当前" if zh else " ✓ current") if cm["name"] == current_id else ""
|
|
608
|
+
rows.append((cm["name"], f"● {cm['name']}{current}", "社区模型 (Ollama)" if zh else "Community model (Ollama)"))
|
|
609
|
+
if not rows:
|
|
610
|
+
return
|
|
611
|
+
start = next((i for i, row in enumerate(rows) if row[0] == current_id), 0)
|
|
612
|
+
options = [(label, help_text) for _mid, label, help_text in rows]
|
|
613
|
+
# select() blocks on the user's answer, so keep it off the event loop.
|
|
614
|
+
import asyncio as _asyncio
|
|
615
|
+
|
|
616
|
+
try:
|
|
617
|
+
choice = await _asyncio.to_thread(native_select, options, start, picker_title)
|
|
618
|
+
except (KeyboardInterrupt, ValueError):
|
|
619
|
+
choice = -1
|
|
620
|
+
if not isinstance(choice, int) or not 0 <= choice < len(rows):
|
|
621
|
+
msg = "已取消,模型未改变。" if zh else "Cancelled; the model is unchanged."
|
|
622
|
+
self.context.console.print(f"[dim]{msg}[/dim]" if self.context.has_rich else msg)
|
|
623
|
+
return
|
|
624
|
+
chosen = rows[choice][0]
|
|
625
|
+
if "/" in chosen:
|
|
626
|
+
# provider/model: the route that checks credentials and sets the provider.
|
|
627
|
+
await self.cmd_model(chosen)
|
|
628
|
+
else:
|
|
629
|
+
self._set_model_by_id(chosen)
|
|
630
|
+
|
|
573
631
|
def _set_model(self, key: str):
|
|
574
632
|
"""Set model by _get_MODELS() key."""
|
|
575
633
|
m = _get_MODELS()[key]
|
|
@@ -66,6 +66,16 @@ def load_cli_config(
|
|
|
66
66
|
"""
|
|
67
67
|
service = build_settings_service(paths, defaults, sync_policy=sync_policy)
|
|
68
68
|
config = service.load()
|
|
69
|
+
# The old localhost default is replaced once; see endpoint_migration.
|
|
70
|
+
from aria_code.apps.cli.endpoint_migration import migrate_config as migrate_endpoint
|
|
71
|
+
|
|
72
|
+
moved = migrate_endpoint(config)
|
|
73
|
+
if moved:
|
|
74
|
+
try:
|
|
75
|
+
service.save(config)
|
|
76
|
+
except Exception:
|
|
77
|
+
pass
|
|
78
|
+
_announce_endpoint(moved, config)
|
|
69
79
|
# A model Google has retired fails on every request. The user's own saved
|
|
70
80
|
# choice is replaced once and written back; see model_retirement.
|
|
71
81
|
from aria_code.apps.cli.model_retirement import migrate_config
|
|
@@ -93,6 +103,27 @@ def load_cli_config(
|
|
|
93
103
|
_ANNOUNCED: set[tuple[str, str]] = set()
|
|
94
104
|
|
|
95
105
|
|
|
106
|
+
def _announce_endpoint(changes, config: dict) -> None:
|
|
107
|
+
"""Say once per process that the old localhost default was replaced."""
|
|
108
|
+
import sys
|
|
109
|
+
|
|
110
|
+
zh = str(config.get("ui_lang", "")).lower().startswith("zh")
|
|
111
|
+
for _key, old, new in changes:
|
|
112
|
+
if (old, new) in _ANNOUNCED:
|
|
113
|
+
continue
|
|
114
|
+
_ANNOUNCED.add((old, new))
|
|
115
|
+
if zh:
|
|
116
|
+
msg = (f"ℹ 服务器地址 {old} 是旧版默认值,已改为 {new}。"
|
|
117
|
+
"如需使用本机后端,请设置环境变量 ARTHERA_API_URL,或在配置里加 api_url_pinned: true。")
|
|
118
|
+
else:
|
|
119
|
+
msg = (f"ℹ The server address {old} was the old default and is now {new}. "
|
|
120
|
+
"For a local backend set ARTHERA_API_URL, or add api_url_pinned: true to the config.")
|
|
121
|
+
try:
|
|
122
|
+
print(msg, file=sys.stderr)
|
|
123
|
+
except Exception:
|
|
124
|
+
pass
|
|
125
|
+
|
|
126
|
+
|
|
96
127
|
def _announce(changes, config: dict, *, pinned: bool) -> None:
|
|
97
128
|
"""One line on stderr per retired model, once per process."""
|
|
98
129
|
import sys
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""The server an install talks to, and the old default that stranded it on localhost.
|
|
2
|
+
|
|
3
|
+
``default_config()`` used to save ``api_url = http://localhost:8000``. That
|
|
4
|
+
looked like a default but was written into every user's config.json on first
|
|
5
|
+
run, where it became indistinguishable from a choice. Anyone who installed
|
|
6
|
+
from GitHub then had every backend call, and Google sign-in, aimed at a
|
|
7
|
+
developer backend on their own machine: a refused connection, or on a machine
|
|
8
|
+
that happened to run one, a page reading ``{"detail":"Not Found"}``. Fixing the
|
|
9
|
+
default in code cannot reach a config that already holds the old value, so the
|
|
10
|
+
old default is recognised here and replaced once, written back and announced,
|
|
11
|
+
the same way a retired model is (see model_retirement).
|
|
12
|
+
|
|
13
|
+
What counts as a choice and is left alone:
|
|
14
|
+
|
|
15
|
+
* ``ARTHERA_API_URL`` in the environment, which now also overrides a saved value
|
|
16
|
+
(in memory only), so a developer with a real local backend sets it once;
|
|
17
|
+
* any ``api_url`` other than the exact old default, such as a staging server;
|
|
18
|
+
* ``api_url_pinned: true``, an escape hatch for someone who wants localhost.
|
|
19
|
+
|
|
20
|
+
``local_mode`` is not touched: choosing a local model is a different decision
|
|
21
|
+
from where the backend lives.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from __future__ import annotations
|
|
25
|
+
|
|
26
|
+
import os
|
|
27
|
+
|
|
28
|
+
PRODUCTION_API_URL = "https://api.arthera.xyz"
|
|
29
|
+
LEGACY_DEFAULT_API_URL = "http://localhost:8000"
|
|
30
|
+
# The product moved from arthera.finance to arthera.xyz and the old domain no
|
|
31
|
+
# longer answers, so a config that was migrated to (or installed with) the old
|
|
32
|
+
# production address points at nothing. It is replaced the same way the
|
|
33
|
+
# localhost default is.
|
|
34
|
+
RETIRED_API_URLS = ("http://localhost:8000", "https://api.arthera.finance")
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _norm(url: object) -> str:
|
|
38
|
+
return str(url or "").strip().rstrip("/").lower()
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def migrate_config(config: dict) -> list[tuple[str, str, str]]:
|
|
42
|
+
"""Move the old localhost default to production in place; return (key, old, new)."""
|
|
43
|
+
env = os.getenv("ARTHERA_API_URL", "").strip()
|
|
44
|
+
if env:
|
|
45
|
+
# An explicit environment choice wins over the file for this run only;
|
|
46
|
+
# nothing is rewritten, so unsetting the variable restores the file.
|
|
47
|
+
config["api_url"] = env.rstrip("/")
|
|
48
|
+
return []
|
|
49
|
+
if config.get("api_url_pinned"):
|
|
50
|
+
return []
|
|
51
|
+
old = config.get("api_url")
|
|
52
|
+
if _norm(old) not in RETIRED_API_URLS:
|
|
53
|
+
return []
|
|
54
|
+
config["api_url"] = PRODUCTION_API_URL
|
|
55
|
+
return [("api_url", str(old), PRODUCTION_API_URL)]
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
__all__ = ["LEGACY_DEFAULT_API_URL", "PRODUCTION_API_URL", "RETIRED_API_URLS", "migrate_config"]
|
|
@@ -116,6 +116,47 @@ def exchange_google_token_for_firebase(google_id_token: str) -> Dict[str, Any]:
|
|
|
116
116
|
)
|
|
117
117
|
|
|
118
118
|
|
|
119
|
+
def login_api_url(configured: str) -> str:
|
|
120
|
+
"""Which server serves Google sign-in for this install.
|
|
121
|
+
|
|
122
|
+
Sign-in is a route of the Arthera gateway, and the credential it returns is
|
|
123
|
+
used against that gateway. The saved ``api_url`` is something else: a
|
|
124
|
+
fresh install writes ``http://localhost:8000`` there, a developer backend
|
|
125
|
+
that has no such route, so /login opened a browser on a page reading
|
|
126
|
+
``{"detail":"Not Found"}`` (or on a refused connection when nothing listens).
|
|
127
|
+
|
|
128
|
+
``ARIA_API_URL`` wins, as it does for the gateway provider. Otherwise a
|
|
129
|
+
loopback ``api_url`` means "no real server was ever configured" and the
|
|
130
|
+
production gateway is used. Any other configured server is respected.
|
|
131
|
+
"""
|
|
132
|
+
import os
|
|
133
|
+
|
|
134
|
+
from ...providers.llm.arthera_gateway import DEFAULT_API_URL
|
|
135
|
+
|
|
136
|
+
override = os.getenv("ARIA_API_URL", "").strip()
|
|
137
|
+
if override:
|
|
138
|
+
return override.rstrip("/")
|
|
139
|
+
host = (urllib.parse.urlparse(configured or "").hostname or "").lower()
|
|
140
|
+
if not configured or host in {"localhost", "127.0.0.1", "::1", "0.0.0.0"}:
|
|
141
|
+
return DEFAULT_API_URL
|
|
142
|
+
return configured.rstrip("/")
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def login_page_origin(api_url: str) -> str:
|
|
146
|
+
"""Where the browser is sent to sign in.
|
|
147
|
+
|
|
148
|
+
The same Arthera login route is also served on the brand's auth host
|
|
149
|
+
(auth.arthera.xyz), so the address bar can read like the product, the
|
|
150
|
+
way Claude Code and Codex open their own accounts site, rather than an API
|
|
151
|
+
hostname. Opt-in with ARIA_AUTH_URL until that path has been exercised end
|
|
152
|
+
to end; the handoff exchange below always goes to the API origin.
|
|
153
|
+
"""
|
|
154
|
+
import os
|
|
155
|
+
|
|
156
|
+
override = os.getenv("ARIA_AUTH_URL", "").strip()
|
|
157
|
+
return (override or api_url).rstrip("/")
|
|
158
|
+
|
|
159
|
+
|
|
119
160
|
def run_google_login(api_url: str, region: str = "GLOBAL") -> Dict[str, Any]:
|
|
120
161
|
"""Drive the whole flow and return the stored-credential fields.
|
|
121
162
|
|
|
@@ -134,7 +175,7 @@ def run_google_login(api_url: str, region: str = "GLOBAL") -> Dict[str, Any]:
|
|
|
134
175
|
|
|
135
176
|
try:
|
|
136
177
|
login_url = (
|
|
137
|
-
f"{api_url}/api/v2/auth/google/login?"
|
|
178
|
+
f"{login_page_origin(api_url)}/api/v2/auth/google/login?"
|
|
138
179
|
+ urllib.parse.urlencode(
|
|
139
180
|
{"platform": "cli", "region": region, "port": port}
|
|
140
181
|
)
|
|
@@ -193,4 +234,4 @@ def run_google_login(api_url: str, region: str = "GLOBAL") -> Dict[str, Any]:
|
|
|
193
234
|
}
|
|
194
235
|
|
|
195
236
|
|
|
196
|
-
__all__ = ["run_google_login", "exchange_google_token_for_firebase"]
|
|
237
|
+
__all__ = ["run_google_login", "exchange_google_token_for_firebase", "login_api_url", "login_page_origin"]
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"""Keep a Firebase sign-in alive the way Claude Code and Codex keep theirs.
|
|
2
|
+
|
|
3
|
+
A Firebase ID token lasts an hour. /login stores it with a refresh token, but
|
|
4
|
+
nothing used the refresh token, so an hour after signing in every gateway call
|
|
5
|
+
failed and the user was told to /login again. Claude Code and Codex do not ask:
|
|
6
|
+
they exchange the refresh token for a new access token shortly before the old
|
|
7
|
+
one expires and carry on.
|
|
8
|
+
|
|
9
|
+
This does the same against Firebase's Secure Token API, which accepts the
|
|
10
|
+
project's public web API key (the one the web and desktop clients ship; see
|
|
11
|
+
google_login.FIREBASE_WEB_API_KEY) and the user's refresh token. The result is
|
|
12
|
+
written back to config.json with owner-only permissions, so every process that
|
|
13
|
+
reads the session, the gateway provider and the Commerce plugin among them,
|
|
14
|
+
sees the fresh token.
|
|
15
|
+
|
|
16
|
+
Failure is deliberately quiet: if the refresh cannot happen (offline, token
|
|
17
|
+
revoked) the stored token is returned unchanged, the request fails with the
|
|
18
|
+
gateway's own 401, and /login remains the way back in.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import json
|
|
24
|
+
import urllib.parse
|
|
25
|
+
import urllib.request
|
|
26
|
+
from datetime import datetime, timedelta, timezone
|
|
27
|
+
from pathlib import Path
|
|
28
|
+
from typing import Any, Callable, Dict, Optional
|
|
29
|
+
|
|
30
|
+
SECURE_TOKEN_URL = "https://securetoken.googleapis.com/v1/token"
|
|
31
|
+
|
|
32
|
+
#: Refresh when the token has this long or less left, so a request that starts
|
|
33
|
+
#: just before expiry is not sent with a token that dies in flight.
|
|
34
|
+
REFRESH_WITHIN_SECONDS = 300
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _parse_expiry(value: Any) -> Optional[datetime]:
|
|
38
|
+
if not value:
|
|
39
|
+
return None
|
|
40
|
+
try:
|
|
41
|
+
return datetime.fromisoformat(str(value).replace("Z", "+00:00"))
|
|
42
|
+
except ValueError:
|
|
43
|
+
return None
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def needs_refresh(config: Dict[str, Any], now: Optional[datetime] = None) -> bool:
|
|
47
|
+
"""True when the stored token is expired or about to be, and can be renewed."""
|
|
48
|
+
if not config.get("auth_token") or not config.get("refresh_token"):
|
|
49
|
+
return False
|
|
50
|
+
expires = _parse_expiry(config.get("token_expires_at"))
|
|
51
|
+
if expires is None:
|
|
52
|
+
# A login from before expiry was recorded: nothing to compare against,
|
|
53
|
+
# so leave it alone rather than refresh on every call.
|
|
54
|
+
return False
|
|
55
|
+
now = now or datetime.now(timezone.utc)
|
|
56
|
+
return expires - now <= timedelta(seconds=REFRESH_WITHIN_SECONDS)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def exchange_refresh_token(refresh_token: str, api_key: str, *, timeout: int = 15,
|
|
60
|
+
opener: Callable = urllib.request.urlopen) -> Dict[str, Any]:
|
|
61
|
+
"""Trade a refresh token for a new ID token. Raises on any failure."""
|
|
62
|
+
body = urllib.parse.urlencode({"grant_type": "refresh_token", "refresh_token": refresh_token}).encode()
|
|
63
|
+
request = urllib.request.Request(
|
|
64
|
+
f"{SECURE_TOKEN_URL}?key={urllib.parse.quote(api_key)}", data=body,
|
|
65
|
+
headers={"Content-Type": "application/x-www-form-urlencoded"}, method="POST",
|
|
66
|
+
)
|
|
67
|
+
with opener(request, timeout=timeout) as response:
|
|
68
|
+
return json.loads(response.read().decode("utf-8"))
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def refresh_config_file(path: Path, *, now: Optional[datetime] = None,
|
|
72
|
+
exchange: Optional[Callable[[str, str], Dict[str, Any]]] = None) -> Optional[str]:
|
|
73
|
+
"""Renew the session stored in `path` if it is due; return the token to use.
|
|
74
|
+
|
|
75
|
+
Returns the current (possibly just refreshed) ID token, or None when there
|
|
76
|
+
is no session. Never raises: a failed refresh returns the stored token.
|
|
77
|
+
"""
|
|
78
|
+
try:
|
|
79
|
+
config = json.loads(Path(path).read_text(encoding="utf-8"))
|
|
80
|
+
except (OSError, ValueError):
|
|
81
|
+
return None
|
|
82
|
+
token = config.get("auth_token")
|
|
83
|
+
token = str(token) if token else None
|
|
84
|
+
if not token or not needs_refresh(config, now):
|
|
85
|
+
return token
|
|
86
|
+
|
|
87
|
+
from .google_login import FIREBASE_WEB_API_KEY
|
|
88
|
+
|
|
89
|
+
try:
|
|
90
|
+
result = (exchange or exchange_refresh_token)(str(config["refresh_token"]), FIREBASE_WEB_API_KEY)
|
|
91
|
+
new_token = result.get("id_token") or result.get("idToken")
|
|
92
|
+
if not new_token:
|
|
93
|
+
return token
|
|
94
|
+
config["auth_token"] = new_token
|
|
95
|
+
if result.get("refresh_token") or result.get("refreshToken"):
|
|
96
|
+
config["refresh_token"] = result.get("refresh_token") or result.get("refreshToken")
|
|
97
|
+
seconds = int(result.get("expires_in") or result.get("expiresIn") or 3600)
|
|
98
|
+
stamp = (now or datetime.now(timezone.utc)) + timedelta(seconds=seconds)
|
|
99
|
+
config["token_expires_at"] = stamp.isoformat().replace("+00:00", "Z")
|
|
100
|
+
from aria_code.packages.aria_core.secure_file import write_secret_json
|
|
101
|
+
|
|
102
|
+
# Replace the file in one step: this is the whole config, and a crash
|
|
103
|
+
# halfway through an in-place write would lose every setting in it.
|
|
104
|
+
target = Path(path)
|
|
105
|
+
scratch = target.with_name(target.name + ".refresh")
|
|
106
|
+
write_secret_json(scratch, config)
|
|
107
|
+
import os
|
|
108
|
+
|
|
109
|
+
os.replace(scratch, target)
|
|
110
|
+
return str(new_token)
|
|
111
|
+
except Exception:
|
|
112
|
+
return token
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
__all__ = ["needs_refresh", "refresh_config_file", "exchange_refresh_token", "REFRESH_WITHIN_SECONDS"]
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"""Sign in through the account page, the way Claude Code and Codex do.
|
|
2
|
+
|
|
3
|
+
``/login`` opens a page on Arthera's own auth host. The user chooses how to sign
|
|
4
|
+
in there (Google, Apple or email, and email can be a new account) and the page
|
|
5
|
+
hands the session back to this process on a loopback port. Nothing is typed in
|
|
6
|
+
the terminal and no provider is chosen for the user.
|
|
7
|
+
|
|
8
|
+
The hand-back is bound to this process, not merely to "whoever is listening":
|
|
9
|
+
|
|
10
|
+
* ``state`` is random and checked on the way back, so a callback this run did
|
|
11
|
+
not start is ignored;
|
|
12
|
+
* a PKCE ``code_verifier`` stays here; only its SHA-256 goes into the page. The
|
|
13
|
+
one-time code in the redirect is useless without it, so a program that sees
|
|
14
|
+
the redirect cannot redeem it;
|
|
15
|
+
* the credential never appears in a URL. The redirect carries a short code and
|
|
16
|
+
the session is fetched over POST.
|
|
17
|
+
|
|
18
|
+
Page: the /cli-login route of apps/web. Server side: apps/api/src/routes/auth_v2_routes.py
|
|
19
|
+
(/cli/handoff, /cli/exchange).
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
import base64
|
|
25
|
+
import hashlib
|
|
26
|
+
import http.server
|
|
27
|
+
import os
|
|
28
|
+
import secrets
|
|
29
|
+
import threading
|
|
30
|
+
import urllib.parse
|
|
31
|
+
import webbrowser
|
|
32
|
+
from typing import Any, Dict
|
|
33
|
+
|
|
34
|
+
from .google_login import _CallbackResult, _free_port, _post_json
|
|
35
|
+
|
|
36
|
+
# The apex is Firebase Hosting and the Firebase auth domain, so the page and the
|
|
37
|
+
# sign-in popup are same-origin there.
|
|
38
|
+
AUTH_ORIGIN = "https://arthera.xyz"
|
|
39
|
+
LOGIN_PATH = "/cli-login"
|
|
40
|
+
_TIMEOUT_SECONDS = 300
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def auth_origin() -> str:
|
|
44
|
+
"""The host that serves the sign-in page. ARIA_AUTH_URL overrides it for staging."""
|
|
45
|
+
return (os.getenv("ARIA_AUTH_URL", "").strip() or AUTH_ORIGIN).rstrip("/")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def pkce_pair() -> tuple[str, str]:
|
|
49
|
+
"""A code verifier and its S256 challenge (RFC 7636)."""
|
|
50
|
+
verifier = secrets.token_urlsafe(48) # 64 characters, inside the 43-128 the spec allows
|
|
51
|
+
digest = hashlib.sha256(verifier.encode("ascii")).digest()
|
|
52
|
+
return verifier, base64.urlsafe_b64encode(digest).rstrip(b"=").decode("ascii")
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _handler(result: _CallbackResult, state: str):
|
|
56
|
+
class Handler(http.server.BaseHTTPRequestHandler):
|
|
57
|
+
def do_GET(self): # noqa: N802 - name fixed by BaseHTTPRequestHandler
|
|
58
|
+
parsed = urllib.parse.urlparse(self.path)
|
|
59
|
+
params = {k: v[0] for k, v in urllib.parse.parse_qs(parsed.query).items()}
|
|
60
|
+
if parsed.path != "/callback" or not secrets.compare_digest(params.get("state", ""), state):
|
|
61
|
+
# Not this run's callback: ignore it and keep waiting for ours.
|
|
62
|
+
self.send_response(404)
|
|
63
|
+
self.end_headers()
|
|
64
|
+
return
|
|
65
|
+
ok = "handoff_code" in params
|
|
66
|
+
body = (
|
|
67
|
+
"<html><body style='font-family:system-ui;padding:3rem'>"
|
|
68
|
+
f"<h2>{'Signed in.' if ok else 'Sign-in failed.'}</h2>"
|
|
69
|
+
"<p>You can close this tab and return to the terminal.</p>"
|
|
70
|
+
"</body></html>"
|
|
71
|
+
).encode("utf-8")
|
|
72
|
+
self.send_response(200 if ok else 400)
|
|
73
|
+
self.send_header("Content-Type", "text/html; charset=utf-8")
|
|
74
|
+
self.send_header("Content-Length", str(len(body)))
|
|
75
|
+
self.send_header("Referrer-Policy", "no-referrer")
|
|
76
|
+
self.send_header("Cache-Control", "no-store")
|
|
77
|
+
self.end_headers()
|
|
78
|
+
self.wfile.write(body)
|
|
79
|
+
result.params = params
|
|
80
|
+
result.received.set()
|
|
81
|
+
|
|
82
|
+
def log_message(self, *args): # keep the terminal clean
|
|
83
|
+
return
|
|
84
|
+
|
|
85
|
+
return Handler
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def run_web_login(api_url: str, *, open_browser=webbrowser.open, timeout: int = _TIMEOUT_SECONDS) -> Dict[str, Any]:
|
|
89
|
+
"""Drive the whole flow; return the stored-credential fields.
|
|
90
|
+
|
|
91
|
+
Raises RuntimeError with a message suitable for display on any failure.
|
|
92
|
+
"""
|
|
93
|
+
api_url = api_url.rstrip("/")
|
|
94
|
+
port = _free_port()
|
|
95
|
+
state = secrets.token_urlsafe(24)
|
|
96
|
+
verifier, challenge = pkce_pair()
|
|
97
|
+
result = _CallbackResult()
|
|
98
|
+
server = http.server.HTTPServer(("127.0.0.1", port), _handler(result, state))
|
|
99
|
+
thread = threading.Thread(target=server.serve_forever, daemon=True)
|
|
100
|
+
thread.start()
|
|
101
|
+
try:
|
|
102
|
+
url = f"{auth_origin()}{LOGIN_PATH}?" + urllib.parse.urlencode(
|
|
103
|
+
{"port": port, "state": state, "code_challenge": challenge, "code_challenge_method": "S256"}
|
|
104
|
+
)
|
|
105
|
+
if not open_browser(url):
|
|
106
|
+
raise RuntimeError("Could not open a browser. Visit this URL manually:\n " + url)
|
|
107
|
+
if not result.received.wait(timeout=timeout):
|
|
108
|
+
raise RuntimeError(f"Timed out after {timeout}s waiting for the browser.")
|
|
109
|
+
finally:
|
|
110
|
+
server.shutdown()
|
|
111
|
+
server.server_close()
|
|
112
|
+
|
|
113
|
+
code = result.params.get("handoff_code")
|
|
114
|
+
if not code:
|
|
115
|
+
raise RuntimeError(result.params.get("message") or "The sign-in did not carry a handoff code.")
|
|
116
|
+
try:
|
|
117
|
+
reply = _post_json(f"{api_url}/api/v2/auth/cli/exchange",
|
|
118
|
+
{"code": code, "code_verifier": verifier, "state": state})
|
|
119
|
+
except Exception as exc:
|
|
120
|
+
raise RuntimeError(f"Could not redeem the sign-in: {exc}") from exc
|
|
121
|
+
data = reply.get("data") or {}
|
|
122
|
+
if not data.get("auth_token"):
|
|
123
|
+
raise RuntimeError("The sign-in did not return a session.")
|
|
124
|
+
return {
|
|
125
|
+
"auth_token": data["auth_token"],
|
|
126
|
+
"refresh_token": data.get("refresh_token"),
|
|
127
|
+
"expires_in": str(data["expires_in"]) if data.get("expires_in") is not None else None,
|
|
128
|
+
"user_id": data.get("user_id"),
|
|
129
|
+
"email": data.get("email"),
|
|
130
|
+
"display_name": data.get("display_name"),
|
|
131
|
+
"provider": "firebase",
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
__all__ = ["run_web_login", "pkce_pair", "auth_origin", "AUTH_ORIGIN"]
|
|
@@ -159,15 +159,53 @@ class MCPServer:
|
|
|
159
159
|
else:
|
|
160
160
|
fut.set_result(msg.get("result"))
|
|
161
161
|
except asyncio.CancelledError:
|
|
162
|
-
|
|
162
|
+
return # stop() cancelled us; nothing is waiting on an answer
|
|
163
163
|
except Exception as exc:
|
|
164
164
|
logger.debug("[MCP:%s] Reader loop error: %s", self.name, exc)
|
|
165
|
+
# stdout closed: the server has exited. Nothing can answer a request that
|
|
166
|
+
# is still waiting, so fail those now. Without this, a server that
|
|
167
|
+
# refuses to start (a missing environment variable, say) is waited on
|
|
168
|
+
# for the whole timeout, 30 s at every launch, and the reason it gave on
|
|
169
|
+
# stderr is never shown.
|
|
170
|
+
await self._fail_pending()
|
|
171
|
+
|
|
172
|
+
async def _fail_pending(self):
|
|
173
|
+
reason = await self._exit_reason()
|
|
174
|
+
for rid, fut in list(self._pending.items()):
|
|
175
|
+
self._pending.pop(rid, None)
|
|
176
|
+
if not fut.done():
|
|
177
|
+
fut.set_exception(RuntimeError(f"MCP server {self.name!r} exited before answering{reason}"))
|
|
178
|
+
|
|
179
|
+
async def _exit_reason(self) -> str:
|
|
180
|
+
"""Exit code and the server's own last words, for the error message."""
|
|
181
|
+
proc = self._proc
|
|
182
|
+
if proc is None:
|
|
183
|
+
return ""
|
|
184
|
+
try:
|
|
185
|
+
code = await asyncio.wait_for(proc.wait(), timeout=2)
|
|
186
|
+
except Exception:
|
|
187
|
+
code = None
|
|
188
|
+
said = ""
|
|
189
|
+
try:
|
|
190
|
+
if proc.stderr is not None:
|
|
191
|
+
said = (await asyncio.wait_for(proc.stderr.read(2000), timeout=1)).decode("utf-8", errors="ignore").strip()
|
|
192
|
+
except Exception:
|
|
193
|
+
pass
|
|
194
|
+
said = " ".join(said.split())[:300]
|
|
195
|
+
detail = f" (exit {code})" if code is not None else ""
|
|
196
|
+
return f"{detail}: {said}" if said else detail
|
|
165
197
|
|
|
166
198
|
async def _request(self, method: str, params: Any = None) -> Any:
|
|
199
|
+
if self._proc is not None and self._proc.returncode is not None:
|
|
200
|
+
raise RuntimeError(f"MCP server {self.name!r} has exited (exit {self._proc.returncode})")
|
|
167
201
|
rid = self._next_id()
|
|
168
202
|
fut = asyncio.get_event_loop().create_future()
|
|
169
203
|
self._pending[rid] = fut
|
|
170
|
-
|
|
204
|
+
try:
|
|
205
|
+
await self._send(_make_request(method, params, rid))
|
|
206
|
+
except (BrokenPipeError, ConnectionResetError) as exc:
|
|
207
|
+
self._pending.pop(rid, None)
|
|
208
|
+
raise RuntimeError(f"MCP server {self.name!r} closed its input: {exc}") from exc
|
|
171
209
|
try:
|
|
172
210
|
return await asyncio.wait_for(fut, timeout=self.timeout)
|
|
173
211
|
except asyncio.TimeoutError:
|