aria-code 0.62.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.62.0 → aria_code-0.63.0}/PKG-INFO +1 -1
- {aria_code-0.62.0 → aria_code-0.63.0}/pyproject.toml +1 -1
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/_version.py +1 -1
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/aria_cli.py +7 -2
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/aria_feishu_bot.py +121 -33
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/aria_telegram_bot.py +8 -2
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/clients/aria_relay_client.py +3 -1
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code.egg-info/PKG-INFO +1 -1
- {aria_code-0.62.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.62.0 → aria_code-0.63.0}/LICENSE +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/NOTICE +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/README.md +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/setup.cfg +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/adk_apps/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/base.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/code_review.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/deep/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/deep/critic.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/deep/deepen.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/deep/models.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/deep/pipeline.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/deep/themes.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/deep/tiers.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/engineering/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/engineering/coder.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/engineering/tester.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/financial/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/financial/catalyst.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/financial/debate.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/financial/earnings.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/financial/fundamental.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/financial/macro.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/financial/news.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/financial/risk.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/financial/sector.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/financial/strategist.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/financial/synthesis.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/financial/technical.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/orchestrator.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/portfolio_agent.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/realty/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/realty/business_match.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/registry.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/signal_scheme.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/sports/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/sports/football_agent.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/supervisor.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/team.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/aliyun_data_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/README.md +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/channels/README.md +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/channels/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/channels/intake.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/channels/registry.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/channels/tradingview.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/README.md +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/_optional.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/broker_render.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/core_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/data_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/market.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/report.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/team.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/config_paths.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/config_store.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/constants.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/context.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/deterministic.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/direct.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/football_reports.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/google_login.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/handlers/market_handlers.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/helpers.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/hooks.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/i18n.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/intent.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/intent_router.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/main.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/market_universe.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/message_processing.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/preflight.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/project_aria.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/base.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/sandbox.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/session_export.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/session_store.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tools/context.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/update_check.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/daemon/README.md +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/vscode/README.md +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/apps/vscode/package.json +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/aria_daemon.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/aria_mcp_server.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/aria_relay_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/aria_relay_server.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/ariarc.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/artifacts.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/backtest_engine.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/backtest_report.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/brokers/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/brokers/automation.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/brokers/base.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/brokers/capabilities.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/brokers/cn/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/brokers/config.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/brokers/intl/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/brokers/paper_broker.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/brokers/planning.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/brokers/registry.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/brokers/trading.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/canva_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/change_store.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/clients/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/clients/canva_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/clients/figma_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/clients/football_data_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/clients/kling_video_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/clients/market_data_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/clients/openai_image_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/clients/runway_video_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/cloud_memory.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/command_safety.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/computer_use_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/dashboard_generator.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/data_analysis_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/data_cleaner.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/data_service.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/datasources/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/datasources/base.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/datasources/router.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/demo_player.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/doctor.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/domain/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/domain/backtest_engine.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/domain/backtest_report.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/domain/finance_formulas.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/domain/strategy_vault.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/evals/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/evals/harness.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/evals/runner.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/external_agent_runner.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/figma_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/file_analysis_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/finance_formulas.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/football_data_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/image_gen_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/intent_classifier.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/kling_video_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/licensing.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/local_finance_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/local_image_provider.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/local_llm_provider.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/macro_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/markdown_pdf.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/market_data_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/mcp_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/memory_manager.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/model_capability.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/notification_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/openai_image_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_core/export.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_core/paths.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_infra/product.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/cache.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/context.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/data.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/references.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/registry.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/settings.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_services/usage.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packs/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packs/base.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packs/finance/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packs/logistics/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packs/payments/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packs/realty/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packs/registry.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/packs/rules.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/plan_utils.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/plugin_loader.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/portfolio_ledger.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/preview_server.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/privacy/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/privacy/feedback.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/project_review.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/project_review_api.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/project_review_server.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/project_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/providers/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/providers/llm/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/providers/llm/anthropic.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/providers/llm/base.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/providers/llm/custom.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/providers/llm/ollama.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/providers/llm/registry.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/providers/local_image_provider.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/providers/local_llm_provider.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/realty_data_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/report_exporters.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/report_generator.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/runtime/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/runtime/acceptance.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/runtime/agent_loop.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/runtime/approval.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/runtime/budget.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/runtime/checkpoints.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/runtime/crash_report.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/runtime/events.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/runtime/gateway.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/runtime/lsp.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/runtime/orchestrator.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/runtime/repo_map.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/runtime/run_state.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/runtime/run_store.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/runtime/self_healing.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/runtime/subagent.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/runtime/task_ledger.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/runtime/tool_executor.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/runtime/tool_policy.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/runtime/worktrees.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/runway_video_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/safety/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/safety/permissions.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/safety/service.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/setup_wizard.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/spreadsheet_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/strategy_vault.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/tools/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/tools/artifact_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/tools/broker_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/tools/build_quant_engine.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/tools/code_audit_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/tools/computer_use_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/tools/extended_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/tools/image_gen_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/tools/local_finance_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/tools/logistics_carriers.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/tools/logistics_inventory.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/tools/logistics_io.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/tools/logistics_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/tools/macro_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/tools/notification_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/tools/project_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/tools/realty_data_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/tools/stripe_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/ui/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/ui/banner.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/ui/completer.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/ui/console.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/ui/image_render.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/ui/input_box.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/ui/picker.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/ui/render/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/ui/render/finance.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/ui/render/market.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/ui/render/output.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/ui/render/responsive.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/ui/render/team.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/ui/robot.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/ui/startup_dashboard.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/utils/vscode_uri.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/video_analysis.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/video_editor.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/workspace/__init__.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/workspace/files.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/workspace/verify.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/workspace_changes.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/workspace_context.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/workspace_service.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code/workspace_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code.egg-info/entry_points.txt +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code.egg-info/requires.txt +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/src/aria_code.egg-info/top_level.txt +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_adk_market_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_agent_team_fallback.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_analyze_file_tool.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_architecture_ledger_is_true.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_architecture_report.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_aria_cli_core.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_aria_mcp_server.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_aria_sdk.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_artifact_publishing.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_artifacts_and_reports.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_ashare_prediction_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_backtest_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_backtest_engine.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_backtest_report.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_broken_akshare_is_optional.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_broker_automation.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_broker_chat_confirm_gate.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_broker_planning.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_broker_safety.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_broker_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_budget.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_business_workflow_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_canva_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_canvas_cmds.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_channel_intake.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_channels.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_chart_handlers.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_chat_routing.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_ci_security_workflow.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_cli_app_split.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_cli_bootstrap.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_cli_config_store.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_cli_lifecycle_hooks.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_cli_runtime_consumer.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_cli_tool_executor_module.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_cloud_memory.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_code_audit_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_code_review_agent.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_codegen_output.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_coder_tester_self_healing.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_coder_tool_safety.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_collaboration.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_command_loggers.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_command_safety.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_completions_builder.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_config_paths.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_configured_provider.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_container_entrypoint.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_container_entrypoints.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_context_checkpoints.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_context_references.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_context_service.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_crash_report.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_credential_file_permissions.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_custom_providers.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_daemon_gateway_config.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_dashboard_generator.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_data_service.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_data_service_imports.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_datasource_routing.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_deep_analysis.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_degrades_without_quant_engine.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_doctor.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_doctor_describes_the_current_install.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_doctor_npm_scope.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_engine_boundary.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_enterprise_tool_honesty.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_env_switch_docs.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_evals_harness.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_extended_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_feishu_swarm_config.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_finance_renderers.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_finance_service_catalog.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_first_run_works.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_football_agent.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_football_prediction_output.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_google_cloud_routing.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_google_login.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_google_search_provider.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_headless_is_agentic.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_image_gen_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_image_inputs.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_import_graph_budget.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_intent_router.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_intent_signals.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_kling_video_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_lazy_rebind.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_legacy_module_imports.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_license_consistency.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_licensing.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_local_image_provider.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_logistics_3pl.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_logistics_and_finance_agents.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_lsp.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_markdown_pdf.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_market_data_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_market_history_inheritance.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_market_history_tool.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_market_symbol_extraction.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_market_universe.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_mcp_circuit.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_mcp_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_model_capability_registry.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_model_choice_is_the_users.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_model_selection_state.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_native_binary_entrypoints.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_native_installer.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_new_modules.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_no_uncommitted_imports.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_ollama_stream_imports.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_ollama_stream_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_openai_image_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_operations_suite.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_output_rendering.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_packages_facade.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_packaging_constraints.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_packaging_manifest.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_packs_domains.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_pdf_report.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_pick_best_installed_model.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_plan_mode.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_platform_package_assembly.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_platform_packages.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_plotly_html_output.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_portfolio_ledger.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_post_turn_context_decision.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_preflight.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_preview_server.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_privacy_feedback.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_project_aria.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_project_review.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_project_review_api.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_prompt_assembly.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_prompt_selection.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_provider_autoconfig.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_provider_error_messages.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_provider_integration.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_provider_registry.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_public_service_status.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_quant_engine_namespace.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_rebind_contract.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_rebind_namespace_contract.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_relay_event_verification.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_release_chain.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_release_commit_identity.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_release_push_is_atomic.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_release_reaches_the_registries.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_release_verification_waits.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_release_workflow_permissions.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_report_charts.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_report_generator.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_research_protocol.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_research_quality.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_responsive_rendering.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_root_module_budget.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_rsi_without_pandas_ta.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_runtime_acceptance.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_runtime_agent_loop.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_runtime_approval.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_runtime_bridge.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_runtime_bridge_fallback.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_runtime_checkpoints.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_runtime_gateway.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_runtime_repo_map.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_runtime_run_store.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_runtime_tool_executor.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_runtime_worktrees.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_runway_video_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_safety_permissions.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_safety_service.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_safety_service_adoption.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_service_diagnostics_security.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_session_search.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_settings_service.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_single_import_root.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_skill_agent_binding.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_skill_catalog.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_skill_loader.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_spreadsheet_tools.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_sse_stream_contract.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_startup_dashboard.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_streaming_pipeline.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_stripe_agent.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_subagent.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_supervisor_routing.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_system_prompts.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_system_tools_output.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_task_orchestrator.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_team_synthesis.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_tls_trust_store.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_tool_policy.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_tool_scope.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_trading_service.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_tradingview_bridge.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_turn_planning.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_ui_completer_references.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_ui_console_theme.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_ui_input_box.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_ui_robot_banner.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_verification_hint.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_verification_policy.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_version_consistency.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_version_counter.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_video_analysis.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_video_editor.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_vscode_mcp.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_warehouse_agents.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_warehouse_cli_registration.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_warehouse_erp_client.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_warehouse_workflow.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_wheel_is_installable.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_workspace_changes.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_workspace_context.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_workspace_files.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_workspace_scope.py +0 -0
- {aria_code-0.62.0 → aria_code-0.63.0}/tests/test_workspace_service.py +0 -0
- {aria_code-0.62.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]}
|
|
@@ -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)
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|