aria-code 0.63.0__tar.gz → 0.64.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.63.0 → aria_code-0.64.0}/PKG-INFO +1 -1
- {aria_code-0.63.0 → aria_code-0.64.0}/pyproject.toml +1 -1
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/_version.py +1 -1
- aria_code-0.64.0/src/aria_code/apps/channels/README.md +47 -0
- aria_code-0.64.0/src/aria_code/apps/channels/conversation.py +274 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/aria_feishu_bot.py +123 -16
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/logistics_tenancy.py +39 -1
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code.egg-info/PKG-INFO +1 -1
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code.egg-info/SOURCES.txt +2 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_chat_bots_fail_closed.py +3 -1
- aria_code-0.64.0/tests/test_conversation_core.py +273 -0
- aria_code-0.63.0/src/aria_code/apps/channels/README.md +0 -15
- {aria_code-0.63.0 → aria_code-0.64.0}/LICENSE +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/NOTICE +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/README.md +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/setup.cfg +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/adk_apps/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/base.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/code_review.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/deep/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/deep/critic.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/deep/deepen.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/deep/models.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/deep/pipeline.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/deep/themes.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/deep/tiers.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/engineering/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/engineering/coder.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/engineering/tester.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/catalyst.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/debate.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/earnings.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/fundamental.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/macro.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/news.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/risk.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/sector.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/strategist.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/synthesis.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/financial/technical.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/orchestrator.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/portfolio_agent.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/realty/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/realty/business_match.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/registry.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/signal_scheme.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/sports/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/sports/football_agent.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/supervisor.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/team.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/aliyun_data_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/README.md +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/channels/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/channels/intake.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/channels/registry.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/channels/tradingview.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/README.md +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/_optional.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/broker_render.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/core_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/data_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/market.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/report.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/team.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/config_paths.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/config_store.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/constants.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/context.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/deterministic.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/direct.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/football_reports.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/google_login.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/handlers/market_handlers.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/helpers.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/hooks.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/i18n.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/intent.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/intent_router.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/main.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/market_universe.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/message_processing.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/preflight.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/project_aria.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/providers/base.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/sandbox.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/session_export.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/session_store.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/tools/context.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/update_check.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/daemon/README.md +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/vscode/README.md +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/apps/vscode/package.json +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/aria_cli.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/aria_daemon.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/aria_mcp_server.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/aria_relay_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/aria_relay_server.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/aria_telegram_bot.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ariarc.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/artifacts.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/backtest_engine.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/backtest_report.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/automation.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/base.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/capabilities.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/cn/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/config.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/intl/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/paper_broker.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/planning.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/registry.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/brokers/trading.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/canva_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/change_store.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/clients/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/clients/aria_relay_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/clients/canva_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/clients/figma_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/clients/football_data_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/clients/kling_video_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/clients/market_data_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/clients/openai_image_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/clients/runway_video_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/cloud_memory.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/command_safety.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/computer_use_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/dashboard_generator.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/data_analysis_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/data_cleaner.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/data_service.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/base.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/router.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/sources/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/demo_player.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/doctor.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/domain/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/domain/backtest_engine.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/domain/backtest_report.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/domain/finance_formulas.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/domain/strategy_vault.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/evals/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/evals/harness.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/evals/runner.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/external_agent_runner.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/figma_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/file_analysis_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/finance_formulas.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/football_data_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/image_gen_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/intent_classifier.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/kling_video_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/licensing.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/local_finance_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/local_image_provider.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/local_llm_provider.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/macro_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/markdown_pdf.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/market_data_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/mcp_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/memory_manager.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/model_capability.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/notification_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/openai_image_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_core/export.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_core/paths.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_infra/product.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/cache.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/context.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/data.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/references.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/registry.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/settings.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_services/usage.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packs/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packs/base.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packs/finance/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packs/logistics/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packs/payments/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packs/realty/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packs/registry.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/packs/rules.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/plan_utils.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/plugin_loader.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/portfolio_ledger.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/preview_server.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/privacy/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/privacy/feedback.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/project_review.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/project_review_api.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/project_review_server.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/project_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/providers/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/providers/llm/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/providers/llm/anthropic.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/providers/llm/base.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/providers/llm/custom.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/providers/llm/ollama.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/providers/llm/registry.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/providers/local_image_provider.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/providers/local_llm_provider.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/realty_data_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/report_exporters.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/report_generator.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/acceptance.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/agent_loop.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/approval.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/budget.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/checkpoints.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/crash_report.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/events.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/gateway.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/lsp.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/orchestrator.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/repo_map.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/run_state.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/run_store.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/self_healing.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/subagent.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/task_ledger.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/tool_executor.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/tool_policy.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runtime/worktrees.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/runway_video_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/safety/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/safety/permissions.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/safety/service.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/setup_wizard.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/spreadsheet_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/strategy_vault.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/artifact_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/broker_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/build_quant_engine.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/code_audit_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/computer_use_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/extended_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/image_gen_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/local_finance_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/logistics_carriers.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/logistics_inventory.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/logistics_io.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/logistics_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/macro_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/notification_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/project_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/realty_data_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/tools/stripe_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/banner.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/completer.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/console.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/image_render.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/input_box.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/picker.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/render/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/render/finance.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/render/market.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/render/output.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/render/responsive.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/render/team.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/robot.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/ui/startup_dashboard.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/utils/vscode_uri.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/video_analysis.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/video_editor.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/workspace/__init__.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/workspace/files.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/workspace/verify.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/workspace_changes.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/workspace_context.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/workspace_service.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code/workspace_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code.egg-info/entry_points.txt +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code.egg-info/requires.txt +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/src/aria_code.egg-info/top_level.txt +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_adk_market_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_agent_team_fallback.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_analyze_file_tool.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_architecture_ledger_is_true.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_architecture_report.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_aria_cli_core.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_aria_mcp_server.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_aria_sdk.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_artifact_publishing.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_artifacts_and_reports.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_ashare_prediction_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_backtest_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_backtest_engine.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_backtest_report.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_broken_akshare_is_optional.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_broker_automation.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_broker_chat_confirm_gate.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_broker_planning.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_broker_safety.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_broker_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_budget.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_business_workflow_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_canva_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_canvas_cmds.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_channel_intake.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_channels.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_chart_handlers.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_chat_routing.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_ci_security_workflow.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_cli_app_split.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_cli_bootstrap.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_cli_config_store.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_cli_lifecycle_hooks.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_cli_runtime_consumer.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_cli_tool_executor_module.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_cloud_memory.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_code_audit_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_code_review_agent.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_codegen_output.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_coder_tester_self_healing.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_coder_tool_safety.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_collaboration.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_command_loggers.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_command_safety.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_completions_builder.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_config_paths.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_configured_provider.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_container_entrypoint.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_container_entrypoints.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_context_checkpoints.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_context_references.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_context_service.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_crash_report.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_credential_file_permissions.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_custom_providers.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_daemon_gateway_config.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_dashboard_generator.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_data_service.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_data_service_imports.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_datasource_routing.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_deep_analysis.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_degrades_without_quant_engine.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_doctor.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_doctor_describes_the_current_install.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_doctor_npm_scope.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_engine_boundary.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_enterprise_tool_honesty.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_env_switch_docs.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_evals_harness.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_extended_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_feishu_swarm_config.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_finance_renderers.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_finance_service_catalog.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_first_run_works.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_football_agent.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_football_prediction_output.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_google_cloud_routing.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_google_login.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_google_search_provider.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_headless_is_agentic.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_image_gen_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_image_inputs.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_import_graph_budget.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_intent_router.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_intent_signals.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_kling_video_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_lazy_rebind.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_legacy_module_imports.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_license_consistency.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_licensing.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_local_image_provider.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_logistics_3pl.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_logistics_and_finance_agents.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_lsp.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_markdown_pdf.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_market_data_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_market_history_inheritance.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_market_history_tool.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_market_symbol_extraction.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_market_universe.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_mcp_circuit.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_mcp_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_model_capability_registry.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_model_choice_is_the_users.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_model_selection_state.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_native_binary_entrypoints.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_native_installer.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_new_modules.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_no_uncommitted_imports.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_ollama_stream_imports.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_ollama_stream_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_openai_image_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_operations_suite.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_output_rendering.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_packages_facade.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_packaging_constraints.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_packaging_manifest.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_packs_domains.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_pdf_report.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_pick_best_installed_model.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_plan_mode.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_platform_package_assembly.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_platform_packages.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_plotly_html_output.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_portfolio_ledger.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_post_turn_context_decision.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_preflight.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_preview_server.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_privacy_feedback.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_project_aria.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_project_review.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_project_review_api.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_prompt_assembly.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_prompt_selection.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_provider_autoconfig.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_provider_error_messages.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_provider_integration.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_provider_registry.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_public_service_status.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_quant_engine_namespace.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_rebind_contract.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_rebind_namespace_contract.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_relay_event_verification.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_release_chain.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_release_commit_identity.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_release_push_is_atomic.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_release_reaches_the_registries.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_release_verification_waits.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_release_workflow_permissions.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_report_charts.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_report_generator.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_research_protocol.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_research_quality.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_responsive_rendering.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_root_module_budget.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_rsi_without_pandas_ta.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runtime_acceptance.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runtime_agent_loop.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runtime_approval.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runtime_bridge.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runtime_bridge_fallback.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runtime_checkpoints.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runtime_gateway.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runtime_repo_map.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runtime_run_store.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runtime_tool_executor.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runtime_worktrees.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_runway_video_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_safety_permissions.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_safety_service.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_safety_service_adoption.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_service_diagnostics_security.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_session_search.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_settings_service.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_single_import_root.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_skill_agent_binding.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_skill_catalog.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_skill_loader.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_spreadsheet_tools.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_sse_stream_contract.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_startup_dashboard.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_streaming_pipeline.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_stripe_agent.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_subagent.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_supervisor_routing.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_system_prompts.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_system_tools_output.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_task_orchestrator.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_team_synthesis.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_tls_trust_store.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_tool_policy.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_tool_scope.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_trading_service.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_tradingview_bridge.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_turn_planning.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_ui_completer_references.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_ui_console_theme.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_ui_input_box.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_ui_robot_banner.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_verification_hint.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_verification_policy.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_version_consistency.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_version_counter.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_video_analysis.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_video_editor.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_vscode_mcp.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_warehouse_agents.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_warehouse_cli_registration.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_warehouse_erp_client.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_warehouse_workflow.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_wheel_is_installable.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_workspace_changes.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_workspace_context.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_workspace_files.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_workspace_scope.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.0}/tests/test_workspace_service.py +0 -0
- {aria_code-0.63.0 → aria_code-0.64.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.64.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" }
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Channel Apps
|
|
2
|
+
|
|
3
|
+
Target role: adapters for non-terminal entrypoints.
|
|
4
|
+
|
|
5
|
+
Examples:
|
|
6
|
+
|
|
7
|
+
- relay server/client;
|
|
8
|
+
- Feishu bot;
|
|
9
|
+
- Telegram bot;
|
|
10
|
+
- webhooks;
|
|
11
|
+
- future desktop or browser UI.
|
|
12
|
+
|
|
13
|
+
Each channel should translate inbound messages into gateway requests and render
|
|
14
|
+
gateway responses back to the channel. It should not bypass safety, runtime, or
|
|
15
|
+
artifact policies.
|
|
16
|
+
|
|
17
|
+
## The conversation layer (`conversation.py`)
|
|
18
|
+
|
|
19
|
+
Everything a chat bot decides that does not depend on the platform lives in
|
|
20
|
+
one module, so every channel — Feishu today, Arthera's own bot later — gets
|
|
21
|
+
the same rules from the same code:
|
|
22
|
+
|
|
23
|
+
| Rule | Where |
|
|
24
|
+
|------|-------|
|
|
25
|
+
| In a group, answer only when addressed; in a direct chat, always | `should_respond` |
|
|
26
|
+
| One group = one shipper (货主), bound by an admin with `/owner <id>` | `handle_owner_command`, `ConversationStore` |
|
|
27
|
+
| Admins are per channel: `ARIA_CHANNEL_ADMINS=feishu:ou_x,telegram:42` | `is_admin` |
|
|
28
|
+
| Context is the conversation's own recent messages, never another's; capped at 20 messages and 7 days | `ConversationStore.history` |
|
|
29
|
+
| A bound conversation runs every turn with `ARIA_OWNER_SCOPE`, enforced by the logistics tools themselves | `ChannelTurn.env`, `tools/logistics_tenancy.py` |
|
|
30
|
+
|
|
31
|
+
A new channel is an adapter: turn the platform's event into an
|
|
32
|
+
`InboundMessage`, then
|
|
33
|
+
|
|
34
|
+
```python
|
|
35
|
+
if not should_respond(msg):
|
|
36
|
+
return
|
|
37
|
+
reply = handle_owner_command(msg, store) # /owner commands
|
|
38
|
+
if reply is None:
|
|
39
|
+
turn = prepare_turn(msg, store) # context + shipper scope
|
|
40
|
+
reply = await run_model(turn.prompt, history=turn.history, env=turn.env)
|
|
41
|
+
store.record(msg.key, "assistant", reply)
|
|
42
|
+
send(reply)
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`aria_feishu_bot.feishu_inbound` is the Feishu version of that first step.
|
|
46
|
+
Conversation keys are `<channel>:<conversation id>`, so the same chat id on
|
|
47
|
+
two platforms is two conversations.
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
"""The platform-neutral half of every chat channel.
|
|
2
|
+
|
|
3
|
+
A chat bot does the same five things on any platform: decide whether a
|
|
4
|
+
message is for it, know which client a conversation belongs to, remember what
|
|
5
|
+
was just said there, keep each conversation's memory to itself, and hand the
|
|
6
|
+
model a turn. Only parsing the platform's event and sending its reply differ.
|
|
7
|
+
This module is the part that does not differ, so Feishu, Telegram, and a bot
|
|
8
|
+
on Arthera's own app or website share one implementation of the rules that
|
|
9
|
+
matter — and a new channel is an adapter of a few dozen lines:
|
|
10
|
+
|
|
11
|
+
msg = InboundMessage(channel="myapp", conversation_id=room_id, kind="group",
|
|
12
|
+
sender_id=user_id, text=text, mentions_bot=True)
|
|
13
|
+
if not should_respond(msg):
|
|
14
|
+
return
|
|
15
|
+
turn = prepare_turn(msg, store)
|
|
16
|
+
reply = await run_my_model(turn.prompt, history=turn.history, env=turn.env)
|
|
17
|
+
store.record(msg.key, "assistant", reply)
|
|
18
|
+
|
|
19
|
+
The guarantees, each tested in tests/test_conversation_core.py:
|
|
20
|
+
|
|
21
|
+
- In a group the bot answers only when addressed; in a direct chat, always.
|
|
22
|
+
- A conversation bound to a shipper (货主) runs every turn with
|
|
23
|
+
ARIA_OWNER_SCOPE set, which the logistics tools enforce themselves
|
|
24
|
+
(tools/logistics_tenancy.py) — the binding does not rely on the prompt.
|
|
25
|
+
- Only channel admins (ARIA_CHANNEL_ADMINS) can bind or unbind.
|
|
26
|
+
- History is per conversation and never crosses: the context for a turn is
|
|
27
|
+
built from that conversation's own messages and nothing else.
|
|
28
|
+
- History is bounded twice: the last `max_turns` messages, none older than
|
|
29
|
+
`ttl_seconds`. A chat bot that keeps every client message forever is a
|
|
30
|
+
liability, not a feature.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
from __future__ import annotations
|
|
34
|
+
|
|
35
|
+
import os
|
|
36
|
+
import re
|
|
37
|
+
import sqlite3
|
|
38
|
+
import time
|
|
39
|
+
from dataclasses import dataclass, field
|
|
40
|
+
from pathlib import Path
|
|
41
|
+
from typing import Callable, Dict, List, Optional, Tuple
|
|
42
|
+
|
|
43
|
+
from aria_code.apps.channels.registry import CHANNEL_TASK_SCHEMA
|
|
44
|
+
from aria_code.tools.logistics_tenancy import OWNER_SCOPE_ENV
|
|
45
|
+
|
|
46
|
+
ADMINS_ENV = "ARIA_CHANNEL_ADMINS"
|
|
47
|
+
DB_ENV = "ARIA_CONVERSATIONS_DB"
|
|
48
|
+
_OWNER_ID = re.compile(r"^[A-Za-z0-9][A-Za-z0-9_.\-]{0,63}$")
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@dataclass(frozen=True)
|
|
52
|
+
class InboundMessage:
|
|
53
|
+
"""One message, as any channel adapter normalises it."""
|
|
54
|
+
|
|
55
|
+
channel: str # "feishu", "telegram", "web", ...
|
|
56
|
+
conversation_id: str # the chat / group / room on that channel
|
|
57
|
+
kind: str # "direct" or "group"
|
|
58
|
+
sender_id: str
|
|
59
|
+
text: str
|
|
60
|
+
message_id: str = ""
|
|
61
|
+
mentions_bot: bool = False
|
|
62
|
+
reply_to: str = "" # the message this one answers, if any
|
|
63
|
+
sender_aliases: Tuple[str, ...] = () # other ids for the same person
|
|
64
|
+
|
|
65
|
+
@property
|
|
66
|
+
def key(self) -> str:
|
|
67
|
+
"""Unique across channels: two platforms may reuse the same chat id."""
|
|
68
|
+
return f"{self.channel}:{self.conversation_id}"
|
|
69
|
+
|
|
70
|
+
@property
|
|
71
|
+
def sender_ids(self) -> Tuple[str, ...]:
|
|
72
|
+
return tuple(i for i in (self.sender_id, *self.sender_aliases) if i)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def should_respond(msg: InboundMessage) -> bool:
|
|
76
|
+
"""Direct chats always; groups only when the bot is addressed."""
|
|
77
|
+
if msg.kind == "direct":
|
|
78
|
+
return True
|
|
79
|
+
return bool(msg.mentions_bot)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def is_admin(msg: InboundMessage, env: Optional[Dict[str, str]] = None) -> bool:
|
|
83
|
+
"""ARIA_CHANNEL_ADMINS="feishu:ou_abc,telegram:12345" — per channel, fail closed."""
|
|
84
|
+
raw = (env if env is not None else os.environ).get(ADMINS_ENV, "")
|
|
85
|
+
admins = {item.strip() for item in raw.split(",") if item.strip()}
|
|
86
|
+
return any(f"{msg.channel}:{sid}" in admins for sid in msg.sender_ids)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
# ── Admin commands ───────────────────────────────────────────────────────────
|
|
90
|
+
|
|
91
|
+
_OWNER_COMMAND = re.compile(r"^/(?:owner|货主)(?:\s+(\S+))?\s*$", re.IGNORECASE)
|
|
92
|
+
_UNBIND_WORDS = {"off", "clear", "none", "解除", "取消"}
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def parse_owner_command(text: str) -> Optional[Tuple[str, str]]:
|
|
96
|
+
"""'/owner' → show; '/owner ACME' → bind; '/owner off' → unbind. None otherwise."""
|
|
97
|
+
match = _OWNER_COMMAND.match((text or "").strip())
|
|
98
|
+
if not match:
|
|
99
|
+
return None
|
|
100
|
+
arg = (match.group(1) or "").strip()
|
|
101
|
+
if not arg:
|
|
102
|
+
return ("show", "")
|
|
103
|
+
if arg.lower() in _UNBIND_WORDS:
|
|
104
|
+
return ("unbind", "")
|
|
105
|
+
return ("bind", arg)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def handle_owner_command(msg: InboundMessage, store: "ConversationStore",
|
|
109
|
+
env: Optional[Dict[str, str]] = None) -> Optional[str]:
|
|
110
|
+
"""Run an /owner command and return the reply text, or None if it is not one."""
|
|
111
|
+
command = parse_owner_command(msg.text)
|
|
112
|
+
if command is None:
|
|
113
|
+
return None
|
|
114
|
+
action, owner = command
|
|
115
|
+
current = store.owner_for(msg.key)
|
|
116
|
+
if action == "show":
|
|
117
|
+
return (f"本会话绑定的货主:{current}" if current
|
|
118
|
+
else "本会话未绑定货主。管理员可发送 /owner <货主ID> 绑定。")
|
|
119
|
+
if not is_admin(msg, env):
|
|
120
|
+
return "只有管理员可以修改本会话绑定的货主。"
|
|
121
|
+
if msg.kind != "group":
|
|
122
|
+
# A direct chat is one person, not a client; binding it would confine
|
|
123
|
+
# an operator's own chat to one shipper and surprise them later.
|
|
124
|
+
return "货主只能绑定到群聊:一个群对应一个货主。"
|
|
125
|
+
if action == "unbind":
|
|
126
|
+
store.unbind_owner(msg.key)
|
|
127
|
+
return "已解除本会话的货主绑定。"
|
|
128
|
+
if not _OWNER_ID.match(owner):
|
|
129
|
+
return "货主 ID 只能包含字母、数字、下划线、点和短横线,最长 64 个字符。"
|
|
130
|
+
store.bind_owner(msg.key, owner, bound_by=f"{msg.channel}:{msg.sender_id}")
|
|
131
|
+
return f"已绑定:本会话之后的分析只会使用货主 {owner} 的数据。"
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
# ── Storage ──────────────────────────────────────────────────────────────────
|
|
135
|
+
|
|
136
|
+
def default_db_path() -> Path:
|
|
137
|
+
configured = os.environ.get(DB_ENV, "").strip()
|
|
138
|
+
if configured:
|
|
139
|
+
return Path(configured).expanduser()
|
|
140
|
+
return Path.home() / ".aria" / "conversations.db"
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
class ConversationStore:
|
|
144
|
+
"""Owner bindings and bounded per-conversation history, in one SQLite file."""
|
|
145
|
+
|
|
146
|
+
def __init__(self, path: Optional[Path | str] = None, *, max_turns: int = 20,
|
|
147
|
+
ttl_seconds: float = 7 * 86400, clock: Callable[[], float] = time.time) -> None:
|
|
148
|
+
self.path = Path(path) if path else default_db_path()
|
|
149
|
+
self.path.parent.mkdir(parents=True, exist_ok=True)
|
|
150
|
+
self.max_turns = max(1, int(max_turns))
|
|
151
|
+
self.ttl_seconds = float(ttl_seconds)
|
|
152
|
+
self._clock = clock
|
|
153
|
+
with self._db() as db:
|
|
154
|
+
db.executescript(
|
|
155
|
+
"""
|
|
156
|
+
CREATE TABLE IF NOT EXISTS bindings (
|
|
157
|
+
conversation TEXT PRIMARY KEY,
|
|
158
|
+
owner_id TEXT NOT NULL,
|
|
159
|
+
bound_by TEXT NOT NULL,
|
|
160
|
+
bound_at REAL NOT NULL
|
|
161
|
+
);
|
|
162
|
+
CREATE TABLE IF NOT EXISTS history (
|
|
163
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
164
|
+
conversation TEXT NOT NULL,
|
|
165
|
+
role TEXT NOT NULL,
|
|
166
|
+
sender TEXT NOT NULL DEFAULT '',
|
|
167
|
+
content TEXT NOT NULL,
|
|
168
|
+
at REAL NOT NULL
|
|
169
|
+
);
|
|
170
|
+
CREATE INDEX IF NOT EXISTS history_by_conversation ON history (conversation, id);
|
|
171
|
+
"""
|
|
172
|
+
)
|
|
173
|
+
try:
|
|
174
|
+
os.chmod(self.path, 0o600) # client messages: owner-readable only
|
|
175
|
+
except OSError:
|
|
176
|
+
pass
|
|
177
|
+
|
|
178
|
+
def _db(self) -> sqlite3.Connection:
|
|
179
|
+
return sqlite3.connect(str(self.path))
|
|
180
|
+
|
|
181
|
+
# bindings
|
|
182
|
+
def bind_owner(self, key: str, owner_id: str, *, bound_by: str) -> None:
|
|
183
|
+
with self._db() as db:
|
|
184
|
+
db.execute(
|
|
185
|
+
"INSERT INTO bindings (conversation, owner_id, bound_by, bound_at) VALUES (?, ?, ?, ?) "
|
|
186
|
+
"ON CONFLICT(conversation) DO UPDATE SET owner_id=excluded.owner_id, "
|
|
187
|
+
"bound_by=excluded.bound_by, bound_at=excluded.bound_at",
|
|
188
|
+
(key, owner_id, bound_by, self._clock()),
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
def unbind_owner(self, key: str) -> None:
|
|
192
|
+
with self._db() as db:
|
|
193
|
+
db.execute("DELETE FROM bindings WHERE conversation = ?", (key,))
|
|
194
|
+
|
|
195
|
+
def owner_for(self, key: str) -> Optional[str]:
|
|
196
|
+
with self._db() as db:
|
|
197
|
+
row = db.execute("SELECT owner_id FROM bindings WHERE conversation = ?", (key,)).fetchone()
|
|
198
|
+
return row[0] if row else None
|
|
199
|
+
|
|
200
|
+
# history
|
|
201
|
+
def record(self, key: str, role: str, content: str, *, sender: str = "") -> None:
|
|
202
|
+
if role not in ("user", "assistant") or not (content or "").strip():
|
|
203
|
+
return
|
|
204
|
+
now = self._clock()
|
|
205
|
+
with self._db() as db:
|
|
206
|
+
db.execute("INSERT INTO history (conversation, role, sender, content, at) VALUES (?, ?, ?, ?, ?)",
|
|
207
|
+
(key, role, sender, content, now))
|
|
208
|
+
self._prune(db, key, now)
|
|
209
|
+
|
|
210
|
+
def history(self, key: str) -> List[Dict[str, str]]:
|
|
211
|
+
"""Oldest first, in the {role, content} shape model providers take."""
|
|
212
|
+
now = self._clock()
|
|
213
|
+
with self._db() as db:
|
|
214
|
+
self._prune(db, key, now)
|
|
215
|
+
rows = db.execute(
|
|
216
|
+
"SELECT role, content FROM history WHERE conversation = ? ORDER BY id", (key,)
|
|
217
|
+
).fetchall()
|
|
218
|
+
return [{"role": role, "content": content} for role, content in rows]
|
|
219
|
+
|
|
220
|
+
def forget(self, key: str) -> None:
|
|
221
|
+
with self._db() as db:
|
|
222
|
+
db.execute("DELETE FROM history WHERE conversation = ?", (key,))
|
|
223
|
+
|
|
224
|
+
def _prune(self, db: sqlite3.Connection, key: str, now: float) -> None:
|
|
225
|
+
db.execute("DELETE FROM history WHERE conversation = ? AND at < ?", (key, now - self.ttl_seconds))
|
|
226
|
+
db.execute(
|
|
227
|
+
"DELETE FROM history WHERE conversation = ? AND id NOT IN "
|
|
228
|
+
"(SELECT id FROM history WHERE conversation = ? ORDER BY id DESC LIMIT ?)",
|
|
229
|
+
(key, key, self.max_turns),
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
# ── Turns ────────────────────────────────────────────────────────────────────
|
|
234
|
+
|
|
235
|
+
@dataclass(frozen=True)
|
|
236
|
+
class ChannelTurn:
|
|
237
|
+
"""Everything a model call needs for one message, platform-free."""
|
|
238
|
+
|
|
239
|
+
prompt: str
|
|
240
|
+
history: List[Dict[str, str]] = field(default_factory=list)
|
|
241
|
+
owner_scope: Optional[str] = None
|
|
242
|
+
|
|
243
|
+
@property
|
|
244
|
+
def env(self) -> Dict[str, str]:
|
|
245
|
+
"""Environment for a subprocess running this turn's tools."""
|
|
246
|
+
return {OWNER_SCOPE_ENV: self.owner_scope} if self.owner_scope else {}
|
|
247
|
+
|
|
248
|
+
def as_task(self, msg: InboundMessage) -> Dict[str, object]:
|
|
249
|
+
"""The same turn as a structured channel task (aria.channel_task.v1)."""
|
|
250
|
+
return {
|
|
251
|
+
"schema": CHANNEL_TASK_SCHEMA,
|
|
252
|
+
"channel": msg.channel,
|
|
253
|
+
"conversation": msg.key,
|
|
254
|
+
"message_id": msg.message_id,
|
|
255
|
+
"prompt": self.prompt,
|
|
256
|
+
"history": list(self.history),
|
|
257
|
+
"owner_scope": self.owner_scope,
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
def prepare_turn(msg: InboundMessage, store: ConversationStore) -> ChannelTurn:
|
|
262
|
+
"""Record the incoming message and build the turn that answers it.
|
|
263
|
+
|
|
264
|
+
History is read before this message is recorded, so the turn carries the
|
|
265
|
+
conversation so far plus the new prompt — not the prompt twice.
|
|
266
|
+
"""
|
|
267
|
+
history = store.history(msg.key)
|
|
268
|
+
owner = store.owner_for(msg.key)
|
|
269
|
+
store.record(msg.key, "user", msg.text, sender=msg.sender_id)
|
|
270
|
+
prompt = msg.text
|
|
271
|
+
if owner:
|
|
272
|
+
prompt = (f"[本会话属于货主 {owner}。只分析该货主的数据,回答中不要提及其他货主。]\n"
|
|
273
|
+
f"{msg.text}")
|
|
274
|
+
return ChannelTurn(prompt=prompt, history=history, owner_scope=owner)
|
|
@@ -53,9 +53,20 @@ import re
|
|
|
53
53
|
import sys
|
|
54
54
|
import tempfile
|
|
55
55
|
import time
|
|
56
|
+
from contextvars import ContextVar
|
|
56
57
|
from pathlib import Path
|
|
57
58
|
from typing import Any, Dict, Optional
|
|
58
59
|
|
|
60
|
+
from aria_code.apps.channels.conversation import (
|
|
61
|
+
ChannelTurn,
|
|
62
|
+
ConversationStore,
|
|
63
|
+
InboundMessage,
|
|
64
|
+
handle_owner_command,
|
|
65
|
+
prepare_turn,
|
|
66
|
+
should_respond,
|
|
67
|
+
)
|
|
68
|
+
from aria_code.tools.logistics_tenancy import OWNER_SCOPE_ENV
|
|
69
|
+
|
|
59
70
|
logger = logging.getLogger(__name__)
|
|
60
71
|
|
|
61
72
|
# Strip ANSI escape codes from aria CLI output
|
|
@@ -695,7 +706,7 @@ def _bot_cli_flags() -> list[str]:
|
|
|
695
706
|
return ["--allow-tools", ",".join(tools)] if tools else []
|
|
696
707
|
|
|
697
708
|
|
|
698
|
-
async def _query_aria_direct(text: str, timeout: int = 90) -> str:
|
|
709
|
+
async def _query_aria_direct(text: str, timeout: int = 90, history: Optional[list] = None) -> str:
|
|
699
710
|
"""
|
|
700
711
|
Query the LLM directly via providers/llm/registry.py — no subprocess, no tool use.
|
|
701
712
|
Used for conversational NL queries where we want a clean text answer.
|
|
@@ -709,7 +720,7 @@ async def _query_aria_direct(text: str, timeout: int = 90) -> str:
|
|
|
709
720
|
|
|
710
721
|
collected: list[str] = []
|
|
711
722
|
result = await _aio.wait_for(
|
|
712
|
-
stream_cloud_fallback(text, history=[], on_token=collected.append),
|
|
723
|
+
stream_cloud_fallback(text, history=list(history or []), on_token=collected.append),
|
|
713
724
|
timeout=timeout,
|
|
714
725
|
)
|
|
715
726
|
if result.get("success") and collected:
|
|
@@ -738,6 +749,11 @@ async def _query_aria_llm(text: str, timeout: int = 120) -> str:
|
|
|
738
749
|
# ARIA_BOT_MODE=1: plain output for a chat card. It no longer approves
|
|
739
750
|
# tools; see _bot_cli_flags.
|
|
740
751
|
bot_env = {**os.environ, "ARIA_BOT_MODE": "1"}
|
|
752
|
+
# A conversation bound to a shipper confines every tool in this run to
|
|
753
|
+
# that shipper; the logistics tools enforce it (logistics_tenancy).
|
|
754
|
+
bot_env.pop(OWNER_SCOPE_ENV, None)
|
|
755
|
+
if _TURN_OWNER.get():
|
|
756
|
+
bot_env[OWNER_SCOPE_ENV] = _TURN_OWNER.get()
|
|
741
757
|
proc = await asyncio.create_subprocess_exec(
|
|
742
758
|
sys.executable, str(aria_cli), "-p", text, *_bot_cli_flags(),
|
|
743
759
|
stdin=asyncio.subprocess.DEVNULL, # no interactive prompts
|
|
@@ -1006,6 +1022,66 @@ def verify_feishu_request(headers: Dict[str, str], body: bytes, payload: Dict[st
|
|
|
1006
1022
|
"unverified events are refused")
|
|
1007
1023
|
|
|
1008
1024
|
|
|
1025
|
+
# ── Conversation layer (apps/channels/conversation.py) ───────────────────────
|
|
1026
|
+
|
|
1027
|
+
# The shipper the current conversation is bound to, for every task it spawns.
|
|
1028
|
+
_TURN_OWNER: ContextVar[Optional[str]] = ContextVar("aria_feishu_turn_owner", default=None)
|
|
1029
|
+
_STORE: Optional[ConversationStore] = None
|
|
1030
|
+
_MENTION_TOKEN = re.compile(r"@_user_\d+")
|
|
1031
|
+
|
|
1032
|
+
|
|
1033
|
+
def _conversation_store() -> ConversationStore:
|
|
1034
|
+
global _STORE
|
|
1035
|
+
if _STORE is None or str(_STORE.path) != str(_conversation_db_path()):
|
|
1036
|
+
_STORE = ConversationStore(_conversation_db_path())
|
|
1037
|
+
return _STORE
|
|
1038
|
+
|
|
1039
|
+
|
|
1040
|
+
def _conversation_db_path() -> Path:
|
|
1041
|
+
from aria_code.apps.channels.conversation import default_db_path
|
|
1042
|
+
return default_db_path()
|
|
1043
|
+
|
|
1044
|
+
|
|
1045
|
+
def _strip_mentions(text: str) -> str:
|
|
1046
|
+
"""Feishu writes each @ as a placeholder (@_user_1); the model needs the words."""
|
|
1047
|
+
return re.sub(r"\s+", " ", _MENTION_TOKEN.sub(" ", text or "")).strip()
|
|
1048
|
+
|
|
1049
|
+
|
|
1050
|
+
def _mentions_bot(message: Dict[str, Any]) -> bool:
|
|
1051
|
+
"""Whether a group message addresses this bot.
|
|
1052
|
+
|
|
1053
|
+
With FEISHU_BOT_OPEN_ID set, the bot's own id must be among the mentions.
|
|
1054
|
+
Without it, any mention counts — correct for an app without the
|
|
1055
|
+
read-all-group-messages permission, which receives only @-mentions of
|
|
1056
|
+
itself; set the id if the app has that permission.
|
|
1057
|
+
"""
|
|
1058
|
+
mentions = message.get("mentions") or []
|
|
1059
|
+
own_id = os.environ.get("FEISHU_BOT_OPEN_ID", "").strip()
|
|
1060
|
+
if own_id:
|
|
1061
|
+
return any((m.get("id") or {}).get("open_id") == own_id for m in mentions)
|
|
1062
|
+
return bool(mentions)
|
|
1063
|
+
|
|
1064
|
+
|
|
1065
|
+
def feishu_inbound(event: Dict[str, Any], text: str) -> InboundMessage:
|
|
1066
|
+
"""A Feishu im.message.receive_v1 event as a platform-neutral message."""
|
|
1067
|
+
message = event.get("message") or {}
|
|
1068
|
+
sender = (event.get("sender") or {}).get("sender_id") or {}
|
|
1069
|
+
open_id = sender.get("open_id", "")
|
|
1070
|
+
user_id = sender.get("user_id", "")
|
|
1071
|
+
direct = message.get("chat_type") == "p2p"
|
|
1072
|
+
return InboundMessage(
|
|
1073
|
+
channel="feishu",
|
|
1074
|
+
conversation_id=message.get("chat_id", ""),
|
|
1075
|
+
kind="direct" if direct else "group",
|
|
1076
|
+
sender_id=open_id or user_id,
|
|
1077
|
+
sender_aliases=(user_id,) if open_id and user_id else (),
|
|
1078
|
+
text=text,
|
|
1079
|
+
message_id=message.get("message_id", ""),
|
|
1080
|
+
mentions_bot=direct or _mentions_bot(message),
|
|
1081
|
+
reply_to=message.get("parent_id", ""),
|
|
1082
|
+
)
|
|
1083
|
+
|
|
1084
|
+
|
|
1009
1085
|
# ── Main event dispatcher (called by feishu_routes.py or standalone) ──────────
|
|
1010
1086
|
|
|
1011
1087
|
async def dispatch_event(raw: Dict[str, Any], *, authorized_by_binding: bool = False) -> Dict[str, Any]:
|
|
@@ -1066,22 +1142,44 @@ async def dispatch_event(raw: Dict[str, Any], *, authorized_by_binding: bool = F
|
|
|
1066
1142
|
except Exception:
|
|
1067
1143
|
content = {}
|
|
1068
1144
|
|
|
1145
|
+
# Groups: only what is addressed to the bot. Feishu delivers just the
|
|
1146
|
+
# @-mentions unless the app holds the read-all-group-messages permission;
|
|
1147
|
+
# with it, this is what stops the bot answering every message in the room.
|
|
1148
|
+
# Images, audio and files cannot @ anyone, so in a group they are ignored.
|
|
1149
|
+
if msg.get("chat_type") != "p2p" and msg_type not in ("text", "post"):
|
|
1150
|
+
return {"code": 0}
|
|
1151
|
+
|
|
1069
1152
|
# ── Text message ──────────────────────────────────────────────────────────
|
|
1070
1153
|
if msg_type == "text":
|
|
1071
|
-
text = content.get("text", "")
|
|
1072
|
-
# Strip @bot mention (飞书群里 @ 机器人会带前缀)
|
|
1073
|
-
if text.startswith("@"):
|
|
1074
|
-
text = " ".join(text.split()[1:]).strip()
|
|
1154
|
+
text = _strip_mentions(content.get("text", ""))
|
|
1075
1155
|
if not text:
|
|
1076
1156
|
return {"code": 0}
|
|
1157
|
+
inbound = feishu_inbound(event, text)
|
|
1158
|
+
if not should_respond(inbound):
|
|
1159
|
+
return {"code": 0}
|
|
1077
1160
|
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1161
|
+
store = _conversation_store()
|
|
1162
|
+
owner_reply = handle_owner_command(inbound, store)
|
|
1163
|
+
if owner_reply is not None:
|
|
1164
|
+
await reply_text(msg_id, owner_reply)
|
|
1165
|
+
return {"code": 0}
|
|
1166
|
+
|
|
1167
|
+
# A task copies the context it is created in, so every aria subprocess
|
|
1168
|
+
# the tasks below start runs under this conversation's shipper scope.
|
|
1169
|
+
# Reset afterwards: dispatch_event runs in its caller's context.
|
|
1170
|
+
scope_token = _TURN_OWNER.set(store.owner_for(inbound.key))
|
|
1171
|
+
try:
|
|
1172
|
+
if text.startswith("/"):
|
|
1173
|
+
logger.info("Feishu /cmd from %s: %s", user_id, text[:80])
|
|
1174
|
+
asyncio.create_task(_handle_command(text, msg_id, user_id, chat_id))
|
|
1175
|
+
else:
|
|
1176
|
+
# Free-form natural language → Aria LLM, with this conversation's context
|
|
1177
|
+
logger.info("Feishu NL query from %s: %s", user_id, text[:80])
|
|
1178
|
+
turn = prepare_turn(inbound, store)
|
|
1179
|
+
asyncio.create_task(_handle_nl_query(text, msg_id, chat_id, turn=turn,
|
|
1180
|
+
conversation=inbound.key))
|
|
1181
|
+
finally:
|
|
1182
|
+
_TURN_OWNER.reset(scope_token)
|
|
1085
1183
|
|
|
1086
1184
|
# ── Voice / Audio ─────────────────────────────────────────────────────────
|
|
1087
1185
|
elif msg_type == "audio":
|
|
@@ -1341,7 +1439,8 @@ def _resolve_cn_company(text: str) -> str:
|
|
|
1341
1439
|
return result
|
|
1342
1440
|
|
|
1343
1441
|
|
|
1344
|
-
async def _handle_nl_query(text: str, message_id: str, chat_id: str = ""
|
|
1442
|
+
async def _handle_nl_query(text: str, message_id: str, chat_id: str = "", *,
|
|
1443
|
+
turn: Optional[ChannelTurn] = None, conversation: str = "") -> None:
|
|
1345
1444
|
"""Route free-form natural language to Aria LLM and reply."""
|
|
1346
1445
|
import re as _re_nl
|
|
1347
1446
|
_low = text.strip().lower()
|
|
@@ -1406,8 +1505,16 @@ async def _handle_nl_query(text: str, message_id: str, chat_id: str = "") -> Non
|
|
|
1406
1505
|
return
|
|
1407
1506
|
|
|
1408
1507
|
await reply_or_send(message_id, chat_id, "🤔 思考中…", f"> {_orig[:120]}", "blue")
|
|
1409
|
-
# Use direct LLM call (no subprocess, no tool execution) for conversational queries
|
|
1410
|
-
|
|
1508
|
+
# Use direct LLM call (no subprocess, no tool execution) for conversational queries.
|
|
1509
|
+
# With a turn, the model sees this conversation's recent messages and, when
|
|
1510
|
+
# the conversation is bound to a shipper, which one.
|
|
1511
|
+
if turn is not None:
|
|
1512
|
+
prompt = turn.prompt if resolved == _orig else f"{turn.prompt}\n({text})"
|
|
1513
|
+
result = await _query_aria_direct(prompt, timeout=120, history=turn.history)
|
|
1514
|
+
if conversation and not result.startswith("❌"):
|
|
1515
|
+
_conversation_store().record(conversation, "assistant", result[:2000])
|
|
1516
|
+
else:
|
|
1517
|
+
result = await _query_aria_direct(text, timeout=120)
|
|
1411
1518
|
color = "red" if result.startswith("❌") else "green"
|
|
1412
1519
|
await reply_or_send(message_id, chat_id, "💡 Aria 回答", result[:2000], color,
|
|
1413
1520
|
footer="Aria Code · AI 分析")
|
|
@@ -19,13 +19,27 @@ fails closed.
|
|
|
19
19
|
What an error message says is part of the guarantee: it may say how many
|
|
20
20
|
shippers the data spans, but never which, so a refusal does not itself
|
|
21
21
|
disclose another client's name.
|
|
22
|
+
|
|
23
|
+
Conversation scope
|
|
24
|
+
------------------
|
|
25
|
+
A chat bound to one shipper (a 3PL usually keeps one group per client) sets
|
|
26
|
+
ARIA_OWNER_SCOPE for every turn it runs. Then, whatever the model asks for:
|
|
27
|
+
- owner_id defaults to that shipper, and naming another is refused;
|
|
28
|
+
- all_owners is refused — the internal view has no place in a client chat;
|
|
29
|
+
- records without owner_id are refused, because nothing shows they are this
|
|
30
|
+
shipper's (a file on the host could be anyone's).
|
|
31
|
+
This is enforced here rather than in a prompt, so it holds for the CLI, the
|
|
32
|
+
MCP server and every chat channel alike, and does not depend on the model
|
|
33
|
+
choosing to comply.
|
|
22
34
|
"""
|
|
23
35
|
|
|
24
36
|
from __future__ import annotations
|
|
25
37
|
|
|
38
|
+
import os
|
|
26
39
|
from typing import Any, Iterable
|
|
27
40
|
|
|
28
41
|
OWNER_FIELD = "owner_id"
|
|
42
|
+
OWNER_SCOPE_ENV = "ARIA_OWNER_SCOPE"
|
|
29
43
|
|
|
30
44
|
INTERNAL_MARKER = "INTERNAL — cross-shipper view; not for client distribution"
|
|
31
45
|
|
|
@@ -34,6 +48,11 @@ class TenancyError(ValueError):
|
|
|
34
48
|
"""The records cannot be analysed without mixing shippers."""
|
|
35
49
|
|
|
36
50
|
|
|
51
|
+
def active_owner_scope() -> str:
|
|
52
|
+
"""The shipper this process is confined to, or "" when unconfined."""
|
|
53
|
+
return os.environ.get(OWNER_SCOPE_ENV, "").strip()
|
|
54
|
+
|
|
55
|
+
|
|
37
56
|
def _owner_of(record: dict[str, Any]) -> str:
|
|
38
57
|
value = record.get(OWNER_FIELD)
|
|
39
58
|
return "" if value is None else str(value).strip()
|
|
@@ -55,10 +74,26 @@ def scope_records(
|
|
|
55
74
|
if wanted and all_owners:
|
|
56
75
|
raise TenancyError("Pass owner_id or all_owners, not both")
|
|
57
76
|
|
|
77
|
+
scope = active_owner_scope()
|
|
78
|
+
if scope:
|
|
79
|
+
if all_owners:
|
|
80
|
+
raise TenancyError(
|
|
81
|
+
"This conversation is confined to one shipper; the cross-shipper view "
|
|
82
|
+
"is not available here"
|
|
83
|
+
)
|
|
84
|
+
if wanted and wanted != scope:
|
|
85
|
+
raise TenancyError("This conversation is confined to one shipper and cannot analyse another")
|
|
86
|
+
wanted = scope
|
|
87
|
+
|
|
58
88
|
labelled = [r for r in records if _owner_of(r)]
|
|
59
89
|
unlabelled = len(records) - len(labelled)
|
|
60
90
|
|
|
61
91
|
if not labelled:
|
|
92
|
+
if scope:
|
|
93
|
+
raise TenancyError(
|
|
94
|
+
f"This conversation is confined to one shipper, so every record must carry "
|
|
95
|
+
f"{OWNER_FIELD} to show it is theirs; these records have none"
|
|
96
|
+
)
|
|
62
97
|
if wanted:
|
|
63
98
|
raise TenancyError(
|
|
64
99
|
f"owner_id {wanted!r} was requested, but the records carry no {OWNER_FIELD}"
|
|
@@ -79,7 +114,10 @@ def scope_records(
|
|
|
79
114
|
if not in_scope:
|
|
80
115
|
# Deliberately does not list the owners that *are* present.
|
|
81
116
|
raise TenancyError(f"No records for owner_id {wanted!r}")
|
|
82
|
-
|
|
117
|
+
result_scope = {"mode": "single_owner", "owner_id": wanted, "client_facing": True}
|
|
118
|
+
if scope:
|
|
119
|
+
result_scope["conversation_scoped"] = True
|
|
120
|
+
return in_scope, result_scope
|
|
83
121
|
|
|
84
122
|
if len(owners) == 1:
|
|
85
123
|
(only,) = owners
|
|
@@ -142,6 +142,7 @@ src/aria_code/apps/README.md
|
|
|
142
142
|
src/aria_code/apps/__init__.py
|
|
143
143
|
src/aria_code/apps/channels/README.md
|
|
144
144
|
src/aria_code/apps/channels/__init__.py
|
|
145
|
+
src/aria_code/apps/channels/conversation.py
|
|
145
146
|
src/aria_code/apps/channels/intake.py
|
|
146
147
|
src/aria_code/apps/channels/registry.py
|
|
147
148
|
src/aria_code/apps/channels/tradingview.py
|
|
@@ -537,6 +538,7 @@ tests/test_container_entrypoints.py
|
|
|
537
538
|
tests/test_context_checkpoints.py
|
|
538
539
|
tests/test_context_references.py
|
|
539
540
|
tests/test_context_service.py
|
|
541
|
+
tests/test_conversation_core.py
|
|
540
542
|
tests/test_crash_report.py
|
|
541
543
|
tests/test_credential_file_permissions.py
|
|
542
544
|
tests/test_custom_providers.py
|
|
@@ -36,9 +36,11 @@ ENV_KEYS = ("FEISHU_ALLOWED_USER_IDS", "FEISHU_ENCRYPT_KEY", "FEISHU_VERIFICATIO
|
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
@pytest.fixture(autouse=True)
|
|
39
|
-
def clean_env(monkeypatch):
|
|
39
|
+
def clean_env(monkeypatch, tmp_path):
|
|
40
40
|
for key in ENV_KEYS:
|
|
41
41
|
monkeypatch.delenv(key, raising=False)
|
|
42
|
+
# Served messages are recorded per conversation; keep that out of ~/.aria.
|
|
43
|
+
monkeypatch.setenv("ARIA_CONVERSATIONS_DB", str(tmp_path / "conversations.db"))
|
|
42
44
|
|
|
43
45
|
|
|
44
46
|
def _event(text="/run /price AAPL", *, open_id="ou_stranger", user_id="", chat_type="p2p"):
|