aria-code 0.61.0__tar.gz → 0.63.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.61.0 → aria_code-0.63.0}/PKG-INFO +1 -1
- {aria_code-0.61.0 → aria_code-0.63.0}/pyproject.toml +1 -1
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/_version.py +1 -1
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/aria_cli.py +7 -2
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/aria_feishu_bot.py +121 -33
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/aria_telegram_bot.py +8 -2
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/clients/aria_relay_client.py +3 -1
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/evals/harness.py +36 -1
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code.egg-info/PKG-INFO +1 -1
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code.egg-info/SOURCES.txt +1 -0
- aria_code-0.63.0/tests/test_chat_bots_fail_closed.py +178 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_coder_tool_safety.py +4 -1
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_evals_harness.py +28 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/LICENSE +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/NOTICE +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/README.md +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/setup.cfg +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/adk_apps/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/base.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/code_review.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/deep/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/deep/critic.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/deep/deepen.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/deep/models.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/deep/pipeline.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/deep/themes.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/deep/tiers.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/engineering/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/engineering/coder.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/engineering/tester.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/catalyst.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/debate.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/earnings.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/fundamental.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/macro.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/news.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/risk.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/sector.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/strategist.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/synthesis.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/financial/technical.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/orchestrator.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/portfolio_agent.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/realty/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/realty/business_match.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/registry.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/signal_scheme.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/sports/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/sports/football_agent.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/supervisor.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/team.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/aliyun_data_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/README.md +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/channels/README.md +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/channels/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/channels/intake.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/channels/registry.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/channels/tradingview.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/README.md +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/_optional.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/broker_render.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/core_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/data_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/market.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/report.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/team.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/config_paths.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/config_store.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/constants.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/context.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/deterministic.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/direct.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/football_reports.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/google_login.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/handlers/market_handlers.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/helpers.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/hooks.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/i18n.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/intent.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/intent_router.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/main.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/market_universe.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/message_processing.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/preflight.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/project_aria.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/base.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/sandbox.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/session_export.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/session_store.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tools/context.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/update_check.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/daemon/README.md +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/vscode/README.md +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/apps/vscode/package.json +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/aria_daemon.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/aria_mcp_server.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/aria_relay_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/aria_relay_server.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ariarc.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/artifacts.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/backtest_engine.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/backtest_report.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/automation.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/base.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/capabilities.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/cn/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/config.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/intl/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/paper_broker.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/planning.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/registry.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/brokers/trading.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/canva_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/change_store.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/clients/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/clients/canva_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/clients/figma_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/clients/football_data_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/clients/kling_video_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/clients/market_data_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/clients/openai_image_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/clients/runway_video_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/cloud_memory.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/command_safety.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/computer_use_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/dashboard_generator.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/data_analysis_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/data_cleaner.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/data_service.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/base.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/router.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/demo_player.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/doctor.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/domain/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/domain/backtest_engine.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/domain/backtest_report.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/domain/finance_formulas.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/domain/strategy_vault.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/evals/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/evals/runner.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/external_agent_runner.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/figma_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/file_analysis_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/finance_formulas.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/football_data_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/image_gen_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/intent_classifier.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/kling_video_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/licensing.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/local_finance_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/local_image_provider.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/local_llm_provider.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/macro_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/markdown_pdf.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/market_data_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/mcp_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/memory_manager.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/model_capability.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/notification_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/openai_image_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_core/export.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_core/paths.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_infra/product.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/cache.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/context.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/data.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/references.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/registry.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/settings.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/usage.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packs/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packs/base.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packs/finance/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packs/logistics/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packs/payments/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packs/realty/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packs/registry.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/packs/rules.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/plan_utils.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/plugin_loader.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/portfolio_ledger.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/preview_server.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/privacy/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/privacy/feedback.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/project_review.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/project_review_api.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/project_review_server.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/project_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/providers/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/providers/llm/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/providers/llm/anthropic.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/providers/llm/base.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/providers/llm/custom.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/providers/llm/ollama.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/providers/llm/registry.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/providers/local_image_provider.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/providers/local_llm_provider.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/realty_data_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/report_exporters.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/report_generator.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/acceptance.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/agent_loop.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/approval.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/budget.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/checkpoints.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/crash_report.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/events.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/gateway.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/lsp.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/orchestrator.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/repo_map.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/run_state.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/run_store.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/self_healing.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/subagent.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/task_ledger.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/tool_executor.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/tool_policy.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runtime/worktrees.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/runway_video_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/safety/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/safety/permissions.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/safety/service.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/setup_wizard.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/spreadsheet_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/strategy_vault.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/artifact_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/broker_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/build_quant_engine.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/code_audit_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/computer_use_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/extended_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/image_gen_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/local_finance_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/logistics_carriers.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/logistics_inventory.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/logistics_io.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/logistics_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/macro_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/notification_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/project_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/realty_data_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/tools/stripe_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/banner.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/completer.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/console.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/image_render.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/input_box.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/picker.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/render/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/render/finance.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/render/market.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/render/output.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/render/responsive.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/render/team.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/robot.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/ui/startup_dashboard.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/utils/vscode_uri.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/video_analysis.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/video_editor.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/workspace/__init__.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/workspace/files.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/workspace/verify.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/workspace_changes.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/workspace_context.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/workspace_service.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code/workspace_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code.egg-info/entry_points.txt +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code.egg-info/requires.txt +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/src/aria_code.egg-info/top_level.txt +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_adk_market_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_agent_team_fallback.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_analyze_file_tool.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_architecture_ledger_is_true.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_architecture_report.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_aria_cli_core.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_aria_mcp_server.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_aria_sdk.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_artifact_publishing.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_artifacts_and_reports.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_ashare_prediction_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_backtest_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_backtest_engine.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_backtest_report.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_broken_akshare_is_optional.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_broker_automation.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_broker_chat_confirm_gate.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_broker_planning.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_broker_safety.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_broker_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_budget.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_business_workflow_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_canva_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_canvas_cmds.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_channel_intake.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_channels.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_chart_handlers.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_chat_routing.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_ci_security_workflow.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_cli_app_split.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_cli_bootstrap.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_cli_config_store.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_cli_lifecycle_hooks.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_cli_runtime_consumer.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_cli_tool_executor_module.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_cloud_memory.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_code_audit_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_code_review_agent.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_codegen_output.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_coder_tester_self_healing.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_collaboration.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_command_loggers.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_command_safety.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_completions_builder.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_config_paths.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_configured_provider.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_container_entrypoint.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_container_entrypoints.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_context_checkpoints.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_context_references.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_context_service.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_crash_report.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_credential_file_permissions.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_custom_providers.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_daemon_gateway_config.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_dashboard_generator.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_data_service.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_data_service_imports.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_datasource_routing.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_deep_analysis.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_degrades_without_quant_engine.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_doctor.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_doctor_describes_the_current_install.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_doctor_npm_scope.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_engine_boundary.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_enterprise_tool_honesty.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_env_switch_docs.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_extended_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_feishu_swarm_config.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_finance_renderers.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_finance_service_catalog.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_first_run_works.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_football_agent.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_football_prediction_output.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_google_cloud_routing.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_google_login.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_google_search_provider.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_headless_is_agentic.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_image_gen_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_image_inputs.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_import_graph_budget.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_intent_router.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_intent_signals.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_kling_video_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_lazy_rebind.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_legacy_module_imports.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_license_consistency.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_licensing.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_local_image_provider.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_logistics_3pl.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_logistics_and_finance_agents.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_lsp.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_markdown_pdf.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_market_data_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_market_history_inheritance.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_market_history_tool.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_market_symbol_extraction.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_market_universe.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_mcp_circuit.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_mcp_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_model_capability_registry.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_model_choice_is_the_users.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_model_selection_state.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_native_binary_entrypoints.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_native_installer.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_new_modules.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_no_uncommitted_imports.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_ollama_stream_imports.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_ollama_stream_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_openai_image_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_operations_suite.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_output_rendering.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_packages_facade.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_packaging_constraints.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_packaging_manifest.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_packs_domains.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_pdf_report.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_pick_best_installed_model.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_plan_mode.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_platform_package_assembly.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_platform_packages.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_plotly_html_output.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_portfolio_ledger.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_post_turn_context_decision.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_preflight.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_preview_server.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_privacy_feedback.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_project_aria.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_project_review.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_project_review_api.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_prompt_assembly.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_prompt_selection.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_provider_autoconfig.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_provider_error_messages.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_provider_integration.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_provider_registry.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_public_service_status.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_quant_engine_namespace.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_rebind_contract.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_rebind_namespace_contract.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_relay_event_verification.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_release_chain.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_release_commit_identity.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_release_push_is_atomic.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_release_reaches_the_registries.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_release_verification_waits.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_release_workflow_permissions.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_report_charts.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_report_generator.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_research_protocol.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_research_quality.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_responsive_rendering.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_root_module_budget.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_rsi_without_pandas_ta.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runtime_acceptance.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runtime_agent_loop.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runtime_approval.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runtime_bridge.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runtime_bridge_fallback.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runtime_checkpoints.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runtime_gateway.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runtime_repo_map.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runtime_run_store.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runtime_tool_executor.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runtime_worktrees.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_runway_video_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_safety_permissions.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_safety_service.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_safety_service_adoption.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_service_diagnostics_security.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_session_search.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_settings_service.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_single_import_root.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_skill_agent_binding.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_skill_catalog.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_skill_loader.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_spreadsheet_tools.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_sse_stream_contract.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_startup_dashboard.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_streaming_pipeline.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_stripe_agent.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_subagent.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_supervisor_routing.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_system_prompts.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_system_tools_output.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_task_orchestrator.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_team_synthesis.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_tls_trust_store.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_tool_policy.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_tool_scope.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_trading_service.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_tradingview_bridge.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_turn_planning.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_ui_completer_references.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_ui_console_theme.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_ui_input_box.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_ui_robot_banner.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_verification_hint.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_verification_policy.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_version_consistency.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_version_counter.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_video_analysis.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_video_editor.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_vscode_mcp.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_warehouse_agents.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_warehouse_cli_registration.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_warehouse_erp_client.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_warehouse_workflow.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_wheel_is_installable.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_workspace_changes.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_workspace_context.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_workspace_files.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_workspace_scope.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_workspace_service.py +0 -0
- {aria_code-0.61.0 → aria_code-0.63.0}/tests/test_workspace_verify.py +0 -0
|
@@ -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.63.0"
|
|
8
8
|
description = "AI coding and research workspace with optional finance and connected-domain tools"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "Apache-2.0" }
|
|
@@ -1241,9 +1241,14 @@ _dedup_tool_schemas()
|
|
|
1241
1241
|
|
|
1242
1242
|
# Tools that require user confirmation before execution
|
|
1243
1243
|
_CONFIRM_TOOLS = {"write_file", "edit_file", "multi_edit", "run_command"}
|
|
1244
|
-
#
|
|
1244
|
+
# Bot mode (ARIA_BOT_MODE=1) is about output only: plain text for a chat card.
|
|
1245
|
+
# It used to start the session with every tool approved, and the Feishu and
|
|
1246
|
+
# Telegram bots set it — so whoever could message a bot could run shell
|
|
1247
|
+
# commands and write files on its host. Tools that need confirmation are now
|
|
1248
|
+
# refused in bot runs (nobody in a chat can answer the prompt); a bot that
|
|
1249
|
+
# needs one passes --allow-tools for exactly that tool.
|
|
1245
1250
|
_ARIA_BOT_MODE: bool = bool(os.environ.get("ARIA_BOT_MODE"))
|
|
1246
|
-
_auto_approve_session: bool =
|
|
1251
|
+
_auto_approve_session: bool = False # Set True when user chooses "Yes, allow all"
|
|
1247
1252
|
|
|
1248
1253
|
# Per-tool session allow list — populated by "Always allow [tool] this session" choice.
|
|
1249
1254
|
# More granular than _auto_approve_session: allows write_file without approving run_command.
|
|
@@ -15,7 +15,18 @@ OpenClaw 同款设计:任意输入(文字/语音/图片/文件)→ Aria AI
|
|
|
15
15
|
FEISHU_APP_ID=cli_xxx FEISHU_APP_SECRET=xxx
|
|
16
16
|
ANTHROPIC_API_KEY=xxx # 图片理解 / LLM
|
|
17
17
|
OPENAI_API_KEY=xxx # Whisper 语音转文字(可选)
|
|
18
|
-
FEISHU_ALLOWED_USER_IDS=
|
|
18
|
+
FEISHU_ALLOWED_USER_IDS=ou_xxx,ou_yyy # 必填:留空 = 谁都不能用
|
|
19
|
+
FEISHU_ENCRYPT_KEY=xxx 或 FEISHU_VERIFICATION_TOKEN=xxx # 独立运行时必填其一
|
|
20
|
+
ARIA_BOT_ALLOW_TOOLS=write_file # 可选:机器人可免审批使用的工具
|
|
21
|
+
|
|
22
|
+
安全边界(2026-10-03):
|
|
23
|
+
- 白名单为空时拒绝所有人。之前留空 = 不限制,而机器人调用 aria 时自动批准
|
|
24
|
+
全部工具,于是任何能给它发消息的人都能在这台机器上跑 shell 命令。
|
|
25
|
+
- 机器人不再自动批准需要确认的工具(run_command / write_file / edit_file /
|
|
26
|
+
multi_edit);没有人能在飞书里点「同意」,这些调用会被拒绝。确实需要的,
|
|
27
|
+
由管理员用 ARIA_BOT_ALLOW_TOOLS 逐个列出。
|
|
28
|
+
- 独立运行时校验飞书事件签名;未配置 Encrypt Key 或 Verification Token 时
|
|
29
|
+
拒绝一切事件。之前任何能访问端口的人都能伪造发件人。
|
|
19
30
|
|
|
20
31
|
支持的消息类型:
|
|
21
32
|
📝 文字(非命令)→ Aria LLM 自然语言回答
|
|
@@ -661,12 +672,27 @@ async def _async_run_aria(cmd: str, message_id: str) -> None:
|
|
|
661
672
|
|
|
662
673
|
# ── Multimodal helpers ────────────────────────────────────────────────────────
|
|
663
674
|
|
|
664
|
-
def _is_allowed_user(
|
|
665
|
-
"""
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
675
|
+
def _is_allowed_user(*sender_ids: str) -> bool:
|
|
676
|
+
"""Whether any of the sender's ids (user_id, open_id) is on the allowlist.
|
|
677
|
+
|
|
678
|
+
Fails closed: an empty FEISHU_ALLOWED_USER_IDS allows nobody. It used to
|
|
679
|
+
allow everybody, and the bot runs aria with tools — so an unconfigured
|
|
680
|
+
deployment answered anyone who could message it.
|
|
681
|
+
"""
|
|
682
|
+
raw = os.environ.get("FEISHU_ALLOWED_USER_IDS", "")
|
|
683
|
+
allowed = {u.strip() for u in raw.split(",") if u.strip()}
|
|
684
|
+
return any(i in allowed for i in sender_ids if i)
|
|
685
|
+
|
|
686
|
+
|
|
687
|
+
def _bot_cli_flags() -> list[str]:
|
|
688
|
+
"""Extra aria CLI flags for bot-run commands: only an explicit tool allowlist.
|
|
689
|
+
|
|
690
|
+
Bot mode no longer approves every tool. A tool that needs confirmation is
|
|
691
|
+
refused, because nobody in the chat can answer the prompt; an operator who
|
|
692
|
+
needs one names it in ARIA_BOT_ALLOW_TOOLS.
|
|
693
|
+
"""
|
|
694
|
+
tools = [t.strip() for t in os.environ.get("ARIA_BOT_ALLOW_TOOLS", "").split(",") if t.strip()]
|
|
695
|
+
return ["--allow-tools", ",".join(tools)] if tools else []
|
|
670
696
|
|
|
671
697
|
|
|
672
698
|
async def _query_aria_direct(text: str, timeout: int = 90) -> str:
|
|
@@ -709,10 +735,11 @@ async def _query_aria_llm(text: str, timeout: int = 120) -> str:
|
|
|
709
735
|
if not aria_cli.exists():
|
|
710
736
|
return "❌ aria_cli.py 未找到,请检查 ARIA_CODE_DIR 配置。"
|
|
711
737
|
try:
|
|
712
|
-
# ARIA_BOT_MODE=1:
|
|
738
|
+
# ARIA_BOT_MODE=1: plain output for a chat card. It no longer approves
|
|
739
|
+
# tools; see _bot_cli_flags.
|
|
713
740
|
bot_env = {**os.environ, "ARIA_BOT_MODE": "1"}
|
|
714
741
|
proc = await asyncio.create_subprocess_exec(
|
|
715
|
-
sys.executable, str(aria_cli), "-p", text,
|
|
742
|
+
sys.executable, str(aria_cli), "-p", text, *_bot_cli_flags(),
|
|
716
743
|
stdin=asyncio.subprocess.DEVNULL, # no interactive prompts
|
|
717
744
|
stdout=asyncio.subprocess.PIPE,
|
|
718
745
|
stderr=asyncio.subprocess.PIPE,
|
|
@@ -939,23 +966,57 @@ async def _analyze_file(file_bytes: bytes, filename: str) -> str:
|
|
|
939
966
|
|
|
940
967
|
# ── Event verifier ────────────────────────────────────────────────────────────
|
|
941
968
|
|
|
942
|
-
def
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
969
|
+
def verify_feishu_request(headers: Dict[str, str], body: bytes, payload: Dict[str, Any]) -> tuple[bool, str]:
|
|
970
|
+
"""(trusted, reason) for an event received directly from Feishu.
|
|
971
|
+
|
|
972
|
+
The same two checks the relay applies (aria_relay_server._verify_feishu_request),
|
|
973
|
+
kept separate because the relay ships without this module's dependencies:
|
|
974
|
+
- Encrypt Key: X-Lark-Signature = sha256(timestamp + nonce + key + body)
|
|
975
|
+
- Verification Token: the token field in the event body
|
|
976
|
+
With neither configured every event is refused, unless
|
|
977
|
+
FEISHU_ALLOW_UNVERIFIED_EVENTS=1 is set for local testing.
|
|
978
|
+
|
|
979
|
+
This replaces verify_feishu_signature, which compared the digest with an
|
|
980
|
+
empty string and was never called: the standalone server dispatched any
|
|
981
|
+
POST, so anyone who could reach the port chose the sender — including one
|
|
982
|
+
on the allowlist.
|
|
983
|
+
"""
|
|
984
|
+
headers = {k.lower(): v for k, v in (headers or {}).items()}
|
|
985
|
+
encrypt_key = os.environ.get("FEISHU_ENCRYPT_KEY", "")
|
|
986
|
+
token = os.environ.get("FEISHU_VERIFICATION_TOKEN", "")
|
|
987
|
+
if encrypt_key:
|
|
988
|
+
signature = headers.get("x-lark-signature", "")
|
|
989
|
+
if not signature:
|
|
990
|
+
return False, "missing X-Lark-Signature"
|
|
991
|
+
digest = hashlib.sha256(
|
|
992
|
+
(headers.get("x-lark-request-timestamp", "") + headers.get("x-lark-request-nonce", "")
|
|
993
|
+
+ encrypt_key).encode("utf-8") + body
|
|
994
|
+
).hexdigest()
|
|
995
|
+
if not hmac.compare_digest(digest, signature):
|
|
996
|
+
return False, "signature mismatch"
|
|
997
|
+
return True, ""
|
|
998
|
+
if token:
|
|
999
|
+
sent = payload.get("token") or (payload.get("header") or {}).get("token", "")
|
|
1000
|
+
if not hmac.compare_digest(str(sent), token):
|
|
1001
|
+
return False, "verification token mismatch"
|
|
1002
|
+
return True, ""
|
|
1003
|
+
if os.environ.get("FEISHU_ALLOW_UNVERIFIED_EVENTS", "").strip().lower() in {"1", "true", "yes", "on"}:
|
|
1004
|
+
return True, ""
|
|
1005
|
+
return False, ("neither FEISHU_ENCRYPT_KEY nor FEISHU_VERIFICATION_TOKEN is set; "
|
|
1006
|
+
"unverified events are refused")
|
|
952
1007
|
|
|
953
1008
|
|
|
954
1009
|
# ── Main event dispatcher (called by feishu_routes.py or standalone) ──────────
|
|
955
1010
|
|
|
956
|
-
async def dispatch_event(raw: Dict[str, Any]) -> Dict[str, Any]:
|
|
1011
|
+
async def dispatch_event(raw: Dict[str, Any], *, authorized_by_binding: bool = False) -> Dict[str, Any]:
|
|
957
1012
|
"""
|
|
958
1013
|
Handle one Feishu event payload.
|
|
1014
|
+
|
|
1015
|
+
authorized_by_binding: the relay client passes True. The relay forwards an
|
|
1016
|
+
event only to the machine its sender bound with a code shown on that
|
|
1017
|
+
machine, so the binding is the authorization; a local allowlist would add
|
|
1018
|
+
nothing, since the relay knows the bound id. What limits a compromised
|
|
1019
|
+
relay is that bot-run commands cannot use confirmation-required tools.
|
|
959
1020
|
Supports: text / audio / image / file / post (富文本)
|
|
960
1021
|
Returns a dict to be sent as JSON response (HTTP 200 required by Feishu).
|
|
961
1022
|
"""
|
|
@@ -985,8 +1046,18 @@ async def dispatch_event(raw: Dict[str, Any]) -> Dict[str, Any]:
|
|
|
985
1046
|
json.dumps(raw, ensure_ascii=False)[:600])
|
|
986
1047
|
return {"code": 0}
|
|
987
1048
|
|
|
988
|
-
|
|
989
|
-
|
|
1049
|
+
open_id = sender.get("open_id", "")
|
|
1050
|
+
if not authorized_by_binding and not _is_allowed_user(sender.get("user_id", ""), open_id):
|
|
1051
|
+
logger.warning("Blocked sender user_id=%s open_id=%s (not in FEISHU_ALLOWED_USER_IDS)",
|
|
1052
|
+
sender.get("user_id", ""), open_id)
|
|
1053
|
+
# Say why only in a direct chat: in a group the bot would answer every
|
|
1054
|
+
# message from everyone not on the list.
|
|
1055
|
+
if msg.get("chat_type") == "p2p":
|
|
1056
|
+
await reply_text(
|
|
1057
|
+
msg_id,
|
|
1058
|
+
"⛔ 你还没有使用 Aria 的权限。请把下面的 ID 发给管理员,"
|
|
1059
|
+
f"加入 FEISHU_ALLOWED_USER_IDS:\n{open_id or sender.get('user_id', '')}",
|
|
1060
|
+
)
|
|
990
1061
|
return {"code": 0}
|
|
991
1062
|
|
|
992
1063
|
content_raw = msg.get("content", "{}")
|
|
@@ -1386,6 +1457,33 @@ async def _handle_file(file_key: str, filename: str, message_id: str) -> None:
|
|
|
1386
1457
|
|
|
1387
1458
|
# ── Standalone HTTP server (for testing without FastAPI) ──────────────────────
|
|
1388
1459
|
|
|
1460
|
+
async def _standalone_handle(request):
|
|
1461
|
+
"""POST /feishu/event for the standalone server: verify, then dispatch."""
|
|
1462
|
+
from aiohttp import web
|
|
1463
|
+
|
|
1464
|
+
raw = await request.read()
|
|
1465
|
+
try:
|
|
1466
|
+
body = json.loads(raw)
|
|
1467
|
+
except Exception:
|
|
1468
|
+
return web.json_response({"code": 1, "msg": "bad json"}, status=400)
|
|
1469
|
+
# Before anything else, the URL-verification challenge included: it
|
|
1470
|
+
# carries the token too, and answering it unverified is a free probe.
|
|
1471
|
+
trusted, reason = verify_feishu_request(dict(request.headers), raw, body)
|
|
1472
|
+
if not trusted:
|
|
1473
|
+
logger.warning("refused an unverified Feishu event: %s", reason)
|
|
1474
|
+
return web.json_response({"code": 1, "msg": "unverified event"}, status=401)
|
|
1475
|
+
return web.json_response(await dispatch_event(body))
|
|
1476
|
+
|
|
1477
|
+
|
|
1478
|
+
def _standalone_app():
|
|
1479
|
+
from aiohttp import web
|
|
1480
|
+
|
|
1481
|
+
app = web.Application()
|
|
1482
|
+
app.router.add_post("/feishu/event", _standalone_handle)
|
|
1483
|
+
app.router.add_post("/api/v1/feishu/event", _standalone_handle)
|
|
1484
|
+
return app
|
|
1485
|
+
|
|
1486
|
+
|
|
1389
1487
|
async def _standalone_server(host: str = "0.0.0.0", port: int = 8888) -> None:
|
|
1390
1488
|
"""Minimal aiohttp-based server for standalone Feishu event reception."""
|
|
1391
1489
|
try:
|
|
@@ -1394,17 +1492,7 @@ async def _standalone_server(host: str = "0.0.0.0", port: int = 8888) -> None:
|
|
|
1394
1492
|
logger.error("aiohttp not installed. pip install aiohttp")
|
|
1395
1493
|
return
|
|
1396
1494
|
|
|
1397
|
-
|
|
1398
|
-
try:
|
|
1399
|
-
body = await request.json()
|
|
1400
|
-
except Exception:
|
|
1401
|
-
return web.json_response({"code": 1, "msg": "bad json"}, status=400)
|
|
1402
|
-
result = await dispatch_event(body)
|
|
1403
|
-
return web.json_response(result)
|
|
1404
|
-
|
|
1405
|
-
app = web.Application()
|
|
1406
|
-
app.router.add_post("/feishu/event", handle)
|
|
1407
|
-
app.router.add_post("/api/v1/feishu/event", handle)
|
|
1495
|
+
app = _standalone_app()
|
|
1408
1496
|
|
|
1409
1497
|
runner = web.AppRunner(app)
|
|
1410
1498
|
await runner.setup()
|
|
@@ -45,6 +45,10 @@ class TelegramBot:
|
|
|
45
45
|
self._running = False
|
|
46
46
|
self._client: Optional[httpx.AsyncClient] = None
|
|
47
47
|
|
|
48
|
+
def is_allowed(self, chat_id: int) -> bool:
|
|
49
|
+
"""Fails closed: an empty allowlist allows nobody."""
|
|
50
|
+
return chat_id in self.allowed_chat_ids
|
|
51
|
+
|
|
48
52
|
# ── Low-level API ─────────────────────────────────────────────────────────
|
|
49
53
|
|
|
50
54
|
def _url(self, method: str) -> str:
|
|
@@ -157,8 +161,10 @@ class TelegramBot:
|
|
|
157
161
|
if not text or not chat_id:
|
|
158
162
|
continue
|
|
159
163
|
|
|
160
|
-
# ACL check
|
|
161
|
-
|
|
164
|
+
# ACL check. Fails closed: an empty TELEGRAM_ALLOWED_IDS allows
|
|
165
|
+
# nobody. It used to allow everybody — anyone who found the bot
|
|
166
|
+
# could drive the daemon's commands.
|
|
167
|
+
if not self.is_allowed(chat_id):
|
|
162
168
|
await self.send_message(
|
|
163
169
|
chat_id,
|
|
164
170
|
"⛔ 未授权。请将你的 Chat ID 添加到 `TELEGRAM_ALLOWED_IDS`。\n你的 ID: `" + str(chat_id) + "`",
|
|
@@ -80,7 +80,9 @@ async def _handle_message(raw_msg: dict, ws) -> None:
|
|
|
80
80
|
result = {"error": "aria_feishu_bot unavailable"}
|
|
81
81
|
else:
|
|
82
82
|
try:
|
|
83
|
-
|
|
83
|
+
# The relay routes an event only to the machine its sender bound
|
|
84
|
+
# with a code shown here, so that binding is the authorization.
|
|
85
|
+
result = await bot.dispatch_event(payload, authorized_by_binding=True)
|
|
84
86
|
except Exception as e:
|
|
85
87
|
logger.exception("dispatch_event error")
|
|
86
88
|
result = {"error": str(e)[:300]}
|
|
@@ -55,6 +55,8 @@ from __future__ import annotations
|
|
|
55
55
|
|
|
56
56
|
import importlib.util
|
|
57
57
|
import json
|
|
58
|
+
import os
|
|
59
|
+
import shlex
|
|
58
60
|
import shutil
|
|
59
61
|
import subprocess
|
|
60
62
|
import sys
|
|
@@ -299,8 +301,34 @@ def _resolve(command: str) -> str:
|
|
|
299
301
|
Without this a suite silently verifies against whatever ``python3`` means
|
|
300
302
|
on PATH, which is how five tasks once reported red because that
|
|
301
303
|
interpreter had no pytest installed.
|
|
304
|
+
|
|
305
|
+
The path is quoted, because the command runs through a shell. Unquoted, an
|
|
306
|
+
interpreter under "Application Support" — where the macOS app keeps its
|
|
307
|
+
projects — split at the space, every check exited 126, and the pre-flight
|
|
308
|
+
reported all four tasks red: measuring nothing while saying it was fine.
|
|
302
309
|
"""
|
|
303
|
-
|
|
310
|
+
if os.name == "nt":
|
|
311
|
+
interpreter = subprocess.list2cmdline([sys.executable])
|
|
312
|
+
else:
|
|
313
|
+
interpreter = shlex.quote(sys.executable)
|
|
314
|
+
return (command or "").replace("{python}", interpreter)
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
# Exit codes with which the shell says it never ran the check at all: 125 is
|
|
318
|
+
# _run's own "could not start", 126 not executable, 127 not found, 9009 the
|
|
319
|
+
# Windows not-found. A red result for any of these is not a broken fixture and
|
|
320
|
+
# not a failed agent — counting it as either lets an environment problem pose
|
|
321
|
+
# as a measurement.
|
|
322
|
+
_COULD_NOT_RUN = {125: "could not start", 126: "not executable", 127: "command not found",
|
|
323
|
+
9009: "command not found"}
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
def _could_not_run(code: int, log: str) -> str:
|
|
327
|
+
reason = _COULD_NOT_RUN.get(code)
|
|
328
|
+
if reason is None:
|
|
329
|
+
return ""
|
|
330
|
+
last = (log or "").strip().splitlines()[-1:] or [""]
|
|
331
|
+
return f"the check itself could not run (exit {code}, {reason}): {last[0]}".rstrip(": ")
|
|
304
332
|
|
|
305
333
|
|
|
306
334
|
def _missing_modules(names: Iterable[str]) -> list[str]:
|
|
@@ -488,6 +516,9 @@ def run_task(
|
|
|
488
516
|
# ── the pre-flight ────────────────────────────────────────────────
|
|
489
517
|
# Confirm the task is actually broken before asking anyone to fix it.
|
|
490
518
|
before_code, before_log = _run(task.verify, workspace, task.timeout)
|
|
519
|
+
broken = _could_not_run(before_code, before_log)
|
|
520
|
+
if broken:
|
|
521
|
+
return _result(ERROR, exit_code=before_code, detail=broken, log=_trim(before_log))
|
|
491
522
|
if before_code == 0 and not task.allow_green_start:
|
|
492
523
|
return _result(
|
|
493
524
|
INVALID, exit_code=0,
|
|
@@ -526,6 +557,10 @@ def run_task(
|
|
|
526
557
|
after_code, after_log = _run(task.verify, workspace, task.timeout)
|
|
527
558
|
if after_code == 0:
|
|
528
559
|
return _result(PASS, exit_code=0, changed=changed)
|
|
560
|
+
broken = _could_not_run(after_code, after_log)
|
|
561
|
+
if broken:
|
|
562
|
+
return _result(ERROR, exit_code=after_code, detail=broken,
|
|
563
|
+
log=_trim(after_log), changed=changed)
|
|
529
564
|
|
|
530
565
|
# Red — now the solver's status decides who is to blame. A subprocess
|
|
531
566
|
# that died in seconds on a provider outage or a crash never gave the
|
|
@@ -511,6 +511,7 @@ tests/test_canvas_cmds.py
|
|
|
511
511
|
tests/test_channel_intake.py
|
|
512
512
|
tests/test_channels.py
|
|
513
513
|
tests/test_chart_handlers.py
|
|
514
|
+
tests/test_chat_bots_fail_closed.py
|
|
514
515
|
tests/test_chat_routing.py
|
|
515
516
|
tests/test_ci_security_workflow.py
|
|
516
517
|
tests/test_cli_app_split.py
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"""Chat bots must refuse by default and must not approve tools on anyone's behalf.
|
|
2
|
+
|
|
3
|
+
Before 2026-10-03 three things combined on the Feishu bot:
|
|
4
|
+
|
|
5
|
+
1. FEISHU_ALLOWED_USER_IDS empty meant "allow everybody";
|
|
6
|
+
2. the bot ran aria with ARIA_BOT_MODE=1, which started the session with
|
|
7
|
+
every tool approved — run_command, write_file, edit_file, multi_edit;
|
|
8
|
+
3. the standalone server dispatched any POST without checking it came from
|
|
9
|
+
Feishu, so the sender (allowlisted or not) was whatever the POST said.
|
|
10
|
+
|
|
11
|
+
Together: anyone who could reach the port, or message an unconfigured bot,
|
|
12
|
+
could run shell commands on its host. The Telegram bot had (1) too. Each test
|
|
13
|
+
here pins one link of that chain.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import asyncio
|
|
19
|
+
import hashlib
|
|
20
|
+
import json
|
|
21
|
+
import os
|
|
22
|
+
import subprocess
|
|
23
|
+
import sys
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
from unittest import mock
|
|
26
|
+
|
|
27
|
+
import pytest
|
|
28
|
+
|
|
29
|
+
import aria_feishu_bot as bot
|
|
30
|
+
from aria_telegram_bot import TelegramBot
|
|
31
|
+
|
|
32
|
+
ROOT = Path(__file__).resolve().parents[1]
|
|
33
|
+
|
|
34
|
+
ENV_KEYS = ("FEISHU_ALLOWED_USER_IDS", "FEISHU_ENCRYPT_KEY", "FEISHU_VERIFICATION_TOKEN",
|
|
35
|
+
"FEISHU_ALLOW_UNVERIFIED_EVENTS", "ARIA_BOT_ALLOW_TOOLS")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@pytest.fixture(autouse=True)
|
|
39
|
+
def clean_env(monkeypatch):
|
|
40
|
+
for key in ENV_KEYS:
|
|
41
|
+
monkeypatch.delenv(key, raising=False)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _event(text="/run /price AAPL", *, open_id="ou_stranger", user_id="", chat_type="p2p"):
|
|
45
|
+
return {
|
|
46
|
+
"header": {"event_type": "im.message.receive_v1"},
|
|
47
|
+
"event": {
|
|
48
|
+
"sender": {"sender_id": {"open_id": open_id, "user_id": user_id}},
|
|
49
|
+
"message": {"message_id": "om_1", "chat_id": "oc_1", "chat_type": chat_type,
|
|
50
|
+
"message_type": "text", "content": json.dumps({"text": text})},
|
|
51
|
+
},
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _dispatch(event, **kwargs):
|
|
56
|
+
"""Run dispatch_event and report (replies sent, commands started)."""
|
|
57
|
+
replies, commands = [], []
|
|
58
|
+
|
|
59
|
+
async def fake_reply(message_id, text):
|
|
60
|
+
replies.append(text)
|
|
61
|
+
|
|
62
|
+
async def fake_command(text, message_id, user_id, chat_id):
|
|
63
|
+
commands.append(text)
|
|
64
|
+
|
|
65
|
+
async def run():
|
|
66
|
+
with mock.patch.object(bot, "reply_text", fake_reply), \
|
|
67
|
+
mock.patch.object(bot, "_handle_command", fake_command):
|
|
68
|
+
await bot.dispatch_event(event, **kwargs)
|
|
69
|
+
await asyncio.sleep(0) # let create_task'd handlers run
|
|
70
|
+
|
|
71
|
+
asyncio.run(run())
|
|
72
|
+
return replies, commands
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class TestFeishuAllowlist:
|
|
76
|
+
def test_an_empty_allowlist_allows_nobody(self):
|
|
77
|
+
assert not bot._is_allowed_user("ou_anyone", "u_anyone")
|
|
78
|
+
|
|
79
|
+
def test_either_sender_id_can_be_listed(self, monkeypatch):
|
|
80
|
+
monkeypatch.setenv("FEISHU_ALLOWED_USER_IDS", "ou_alice, u_bob")
|
|
81
|
+
assert bot._is_allowed_user("", "ou_alice")
|
|
82
|
+
assert bot._is_allowed_user("u_bob", "ou_other")
|
|
83
|
+
assert not bot._is_allowed_user("u_eve", "ou_eve")
|
|
84
|
+
|
|
85
|
+
def test_an_unlisted_sender_runs_nothing_and_is_told_their_id(self):
|
|
86
|
+
replies, commands = _dispatch(_event())
|
|
87
|
+
assert commands == []
|
|
88
|
+
assert len(replies) == 1 and "ou_stranger" in replies[0]
|
|
89
|
+
|
|
90
|
+
def test_in_a_group_an_unlisted_sender_is_ignored_silently(self):
|
|
91
|
+
replies, commands = _dispatch(_event(chat_type="group"))
|
|
92
|
+
assert (replies, commands) == ([], [])
|
|
93
|
+
|
|
94
|
+
def test_a_listed_sender_is_served(self, monkeypatch):
|
|
95
|
+
monkeypatch.setenv("FEISHU_ALLOWED_USER_IDS", "ou_alice")
|
|
96
|
+
_, commands = _dispatch(_event(open_id="ou_alice"))
|
|
97
|
+
assert commands == ["/run /price AAPL"]
|
|
98
|
+
|
|
99
|
+
def test_the_relay_binding_authorizes_its_sender(self):
|
|
100
|
+
# The relay only forwards to the machine the sender bound.
|
|
101
|
+
_, commands = _dispatch(_event(), authorized_by_binding=True)
|
|
102
|
+
assert commands == ["/run /price AAPL"]
|
|
103
|
+
|
|
104
|
+
def test_the_relay_client_says_so(self):
|
|
105
|
+
source = (ROOT / "src" / "aria_code" / "clients" / "aria_relay_client.py").read_text(encoding="utf-8")
|
|
106
|
+
assert "dispatch_event(payload, authorized_by_binding=True)" in source
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class TestFeishuEventVerification:
|
|
110
|
+
BODY = json.dumps({"token": "tok", "challenge": "c"}).encode()
|
|
111
|
+
|
|
112
|
+
def test_nothing_configured_refuses_everything(self):
|
|
113
|
+
trusted, reason = bot.verify_feishu_request({}, self.BODY, json.loads(self.BODY))
|
|
114
|
+
assert not trusted and "refused" in reason
|
|
115
|
+
|
|
116
|
+
def test_the_local_testing_escape_hatch_is_explicit(self, monkeypatch):
|
|
117
|
+
monkeypatch.setenv("FEISHU_ALLOW_UNVERIFIED_EVENTS", "1")
|
|
118
|
+
assert bot.verify_feishu_request({}, self.BODY, {})[0]
|
|
119
|
+
|
|
120
|
+
def test_verification_token(self, monkeypatch):
|
|
121
|
+
monkeypatch.setenv("FEISHU_VERIFICATION_TOKEN", "tok")
|
|
122
|
+
assert bot.verify_feishu_request({}, self.BODY, {"token": "tok"})[0]
|
|
123
|
+
assert not bot.verify_feishu_request({}, self.BODY, {"token": "forged"})[0]
|
|
124
|
+
|
|
125
|
+
def test_signature(self, monkeypatch):
|
|
126
|
+
monkeypatch.setenv("FEISHU_ENCRYPT_KEY", "key")
|
|
127
|
+
good = hashlib.sha256(b"17" + b"n" + b"key" + self.BODY).hexdigest()
|
|
128
|
+
headers = {"X-Lark-Request-Timestamp": "17", "X-Lark-Request-Nonce": "n"}
|
|
129
|
+
assert bot.verify_feishu_request({**headers, "X-Lark-Signature": good}, self.BODY, {})[0]
|
|
130
|
+
assert not bot.verify_feishu_request({**headers, "X-Lark-Signature": "0" * 64}, self.BODY, {})[0]
|
|
131
|
+
assert not bot.verify_feishu_request(headers, self.BODY, {})[0]
|
|
132
|
+
|
|
133
|
+
def test_the_standalone_server_refuses_a_forged_event(self, monkeypatch):
|
|
134
|
+
aiohttp_test = pytest.importorskip("aiohttp.test_utils")
|
|
135
|
+
monkeypatch.setenv("FEISHU_VERIFICATION_TOKEN", "tok")
|
|
136
|
+
monkeypatch.setenv("FEISHU_ALLOWED_USER_IDS", "ou_admin")
|
|
137
|
+
dispatched = []
|
|
138
|
+
|
|
139
|
+
async def fake_dispatch(body, **kwargs):
|
|
140
|
+
dispatched.append(body)
|
|
141
|
+
return {"code": 0}
|
|
142
|
+
|
|
143
|
+
async def run():
|
|
144
|
+
with mock.patch.object(bot, "dispatch_event", fake_dispatch):
|
|
145
|
+
async with aiohttp_test.TestClient(aiohttp_test.TestServer(bot._standalone_app())) as client:
|
|
146
|
+
forged = _event(open_id="ou_admin") # claims to be the admin, has no token
|
|
147
|
+
refused = await client.post("/feishu/event", data=json.dumps(forged))
|
|
148
|
+
genuine = await client.post("/feishu/event", data=json.dumps({**forged, "token": "tok"}))
|
|
149
|
+
return refused.status, genuine.status
|
|
150
|
+
|
|
151
|
+
refused, genuine = asyncio.run(run())
|
|
152
|
+
assert refused == 401
|
|
153
|
+
assert genuine == 200
|
|
154
|
+
assert len(dispatched) == 1
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
class TestBotsDoNotApproveTools:
|
|
158
|
+
def test_bot_mode_starts_with_nothing_approved(self):
|
|
159
|
+
proc = subprocess.run(
|
|
160
|
+
[sys.executable, "-c", "import aria_code.aria_cli as c; print(c._auto_approve_session)"],
|
|
161
|
+
capture_output=True, text=True, timeout=120, env={**os.environ, "ARIA_BOT_MODE": "1"},
|
|
162
|
+
)
|
|
163
|
+
assert proc.returncode == 0, proc.stderr[-1000:]
|
|
164
|
+
assert proc.stdout.strip().splitlines()[-1] == "False"
|
|
165
|
+
|
|
166
|
+
def test_no_tools_are_allowed_unless_the_operator_names_them(self, monkeypatch):
|
|
167
|
+
assert bot._bot_cli_flags() == []
|
|
168
|
+
monkeypatch.setenv("ARIA_BOT_ALLOW_TOOLS", "write_file, edit_file")
|
|
169
|
+
assert bot._bot_cli_flags() == ["--allow-tools", "write_file,edit_file"]
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
class TestTelegramAllowlist:
|
|
173
|
+
def test_an_empty_allowlist_allows_nobody(self):
|
|
174
|
+
assert not TelegramBot(token="t").is_allowed(12345)
|
|
175
|
+
|
|
176
|
+
def test_a_listed_chat_is_allowed(self):
|
|
177
|
+
assert TelegramBot(token="t", allowed_chat_ids={12345}).is_allowed(12345)
|
|
178
|
+
assert not TelegramBot(token="t", allowed_chat_ids={12345}).is_allowed(999)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"""Regression checks for model-facing code tools."""
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
|
+
import shlex
|
|
4
5
|
import sys
|
|
5
6
|
|
|
6
7
|
from aria_code.agents.engineering.coder import CoderAgent
|
|
@@ -13,7 +14,9 @@ def call(agent, name, args):
|
|
|
13
14
|
def test_command_requires_real_approval(tmp_path):
|
|
14
15
|
agent = CoderAgent(output_dir=tmp_path)
|
|
15
16
|
marker = tmp_path / "executed"
|
|
16
|
-
|
|
17
|
+
# Quoted: run_command splits with shlex, and an interpreter under
|
|
18
|
+
# "Application Support" would otherwise split at the space.
|
|
19
|
+
command = f'{shlex.quote(sys.executable)} -c "open(\'executed\', \'w\').write(\'yes\')"'
|
|
17
20
|
assert "approval is unavailable" in call(agent, "run_command", {"command": command})
|
|
18
21
|
assert not marker.exists()
|
|
19
22
|
agent.command_approval = lambda argv, cwd: True
|
|
@@ -129,6 +129,34 @@ class EnvironmentTests(HarnessBase):
|
|
|
129
129
|
# Green start, so INVALID — which proves the interpreter matched.
|
|
130
130
|
self.assertEqual(result.outcome, INVALID)
|
|
131
131
|
|
|
132
|
+
def test_an_interpreter_path_with_a_space_still_runs_the_check(self):
|
|
133
|
+
# The macOS app keeps projects under "Application Support". Unquoted,
|
|
134
|
+
# {python} split there and every check exited 126.
|
|
135
|
+
import os
|
|
136
|
+
import sys
|
|
137
|
+
from unittest import mock
|
|
138
|
+
|
|
139
|
+
from aria_code.evals import harness
|
|
140
|
+
|
|
141
|
+
if os.name == "nt":
|
|
142
|
+
self.skipTest("symlinking an interpreter needs privileges on Windows")
|
|
143
|
+
spaced = self.fixtures.parent / "Application Support" / "python"
|
|
144
|
+
spaced.parent.mkdir(parents=True)
|
|
145
|
+
spaced.symlink_to(sys.executable)
|
|
146
|
+
_fixture(self.fixtures, "broken", {"check.py": "import sys; sys.exit(1)\n"})
|
|
147
|
+
with mock.patch.object(harness.sys, "executable", str(spaced)):
|
|
148
|
+
result = self._run(self._task(), lambda p, w: None)
|
|
149
|
+
self.assertEqual(result.outcome, FAIL, result.detail)
|
|
150
|
+
self.assertEqual(result.exit_code, 1)
|
|
151
|
+
|
|
152
|
+
def test_a_check_the_shell_cannot_run_is_an_error_not_a_red_task(self):
|
|
153
|
+
# A pre-flight that counts "command not found" as red reports a healthy
|
|
154
|
+
# suite while measuring nothing.
|
|
155
|
+
_fixture(self.fixtures, "broken", {"check.py": _GUARD})
|
|
156
|
+
result = self._run(self._task(verify="definitely_not_a_command_xyz"), lambda p, w: None)
|
|
157
|
+
self.assertEqual(result.outcome, ERROR)
|
|
158
|
+
self.assertIn("could not run", result.detail)
|
|
159
|
+
|
|
132
160
|
def test_a_check_that_never_finishes_is_a_failure(self):
|
|
133
161
|
_fixture(self.fixtures, "broken", {"check.py": "import time; time.sleep(30)\n"})
|
|
134
162
|
result = self._run(self._task(timeout=1), lambda p, w: None)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|