aria-code 0.69.0__tar.gz → 0.71.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.69.0 → aria_code-0.71.0}/PKG-INFO +12 -6
- {aria_code-0.69.0 → aria_code-0.71.0}/README.md +10 -4
- {aria_code-0.69.0 → aria_code-0.71.0}/pyproject.toml +2 -2
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/_version.py +1 -1
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/aria_cli.py +1 -1
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/aria_relay_server.py +79 -10
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/clients/aria_relay_client.py +63 -4
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/setup_wizard.py +13 -5
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code.egg-info/PKG-INFO +12 -6
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code.egg-info/SOURCES.txt +1 -0
- aria_code-0.71.0/tests/test_relay_client_credentials.py +161 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_relay_sends_for_clients.py +2 -1
- {aria_code-0.69.0 → aria_code-0.71.0}/LICENSE +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/NOTICE +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/setup.cfg +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/adk_apps/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/base.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/code_review.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/deep/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/deep/critic.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/deep/deepen.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/deep/models.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/deep/pipeline.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/deep/themes.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/deep/tiers.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/engineering/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/engineering/coder.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/engineering/tester.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/catalyst.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/debate.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/earnings.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/fundamental.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/macro.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/news.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/risk.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/sector.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/strategist.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/synthesis.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/financial/technical.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/orchestrator.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/portfolio_agent.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/realty/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/realty/business_match.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/registry.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/signal_scheme.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/sports/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/sports/football_agent.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/supervisor.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/team.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/aliyun_data_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/README.md +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/channels/README.md +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/channels/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/channels/approvals.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/channels/conversation.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/channels/digest.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/channels/intake.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/channels/registry.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/channels/tradingview.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/README.md +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/_optional.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/broker_render.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/core_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/data_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/market.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/report.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/team.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/config_paths.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/config_store.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/constants.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/context.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/deterministic.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/direct.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/football_reports.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/google_login.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/handlers/market_handlers.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/helpers.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/hooks.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/i18n.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/intent.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/intent_router.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/main.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/market_universe.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/message_processing.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/preflight.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/project_aria.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/providers/base.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/sandbox.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/session_export.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/session_store.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/tools/context.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/update_check.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/daemon/README.md +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/vscode/README.md +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/apps/vscode/package.json +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/aria_daemon.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/aria_feishu_bot.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/aria_mcp_server.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/aria_relay_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/aria_telegram_bot.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ariarc.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/artifacts.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/backtest_engine.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/backtest_report.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/automation.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/base.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/capabilities.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/cn/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/config.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/intl/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/paper_broker.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/planning.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/registry.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/brokers/trading.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/canva_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/change_store.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/clients/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/clients/canva_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/clients/figma_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/clients/football_data_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/clients/kling_video_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/clients/market_data_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/clients/openai_image_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/clients/runway_video_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/cloud_memory.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/command_safety.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/computer_use_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/dashboard_generator.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/data_analysis_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/data_cleaner.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/data_service.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/base.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/router.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/sources/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/demo_player.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/doctor.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/domain/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/domain/backtest_engine.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/domain/backtest_report.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/domain/finance_formulas.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/domain/strategy_vault.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/evals/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/evals/harness.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/evals/runner.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/external_agent_runner.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/figma_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/file_analysis_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/finance_formulas.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/football_data_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/image_gen_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/intent_classifier.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/kling_video_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/licensing.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/local_finance_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/local_image_provider.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/local_llm_provider.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/macro_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/markdown_pdf.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/market_data_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/mcp_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/memory_manager.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/model_capability.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/notification_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/openai_image_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_core/export.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_core/paths.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_infra/product.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/cache.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/context.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/data.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/references.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/registry.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/settings.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_services/usage.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packs/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packs/base.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packs/finance/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packs/logistics/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packs/payments/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packs/realty/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packs/registry.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/packs/rules.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/plan_utils.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/plugin_loader.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/portfolio_ledger.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/preview_server.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/privacy/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/privacy/feedback.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/project_review.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/project_review_api.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/project_review_server.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/project_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/providers/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/providers/llm/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/providers/llm/anthropic.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/providers/llm/base.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/providers/llm/custom.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/providers/llm/ollama.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/providers/llm/registry.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/providers/local_image_provider.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/providers/local_llm_provider.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/realty_data_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/report_exporters.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/report_generator.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/acceptance.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/agent_loop.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/approval.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/budget.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/checkpoints.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/crash_report.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/events.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/gateway.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/lsp.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/orchestrator.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/repo_map.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/run_state.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/run_store.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/self_healing.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/subagent.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/task_ledger.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/tool_executor.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/tool_policy.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runtime/worktrees.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/runway_video_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/safety/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/safety/permissions.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/safety/service.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/spreadsheet_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/strategy_vault.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/artifact_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/broker_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/build_quant_engine.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/code_audit_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/computer_use_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/extended_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/image_gen_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/local_finance_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/logistics_carriers.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/logistics_inventory.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/logistics_io.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/logistics_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/macro_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/notification_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/project_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/realty_data_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/tools/stripe_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/banner.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/completer.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/console.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/image_render.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/input_box.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/picker.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/render/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/render/finance.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/render/market.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/render/output.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/render/responsive.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/render/team.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/robot.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/ui/startup_dashboard.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/utils/vscode_uri.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/video_analysis.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/video_editor.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/workspace/__init__.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/workspace/files.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/workspace/verify.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/workspace_changes.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/workspace_context.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/workspace_service.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code/workspace_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code.egg-info/entry_points.txt +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code.egg-info/requires.txt +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/src/aria_code.egg-info/top_level.txt +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_adk_market_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_agent_team_fallback.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_analyze_file_tool.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_architecture_ledger_is_true.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_architecture_report.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_aria_cli_core.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_aria_mcp_server.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_aria_sdk.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_artifact_publishing.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_artifacts_and_reports.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_ashare_prediction_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_backtest_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_backtest_engine.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_backtest_report.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_broken_akshare_is_optional.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_broker_automation.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_broker_chat_confirm_gate.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_broker_planning.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_broker_safety.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_broker_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_budget.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_business_workflow_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_canva_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_canvas_cmds.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_card_approvals.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_channel_intake.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_channels.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_chart_handlers.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_chat_bots_fail_closed.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_chat_routing.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_ci_security_workflow.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_cli_app_split.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_cli_bootstrap.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_cli_config_store.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_cli_lifecycle_hooks.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_cli_runtime_consumer.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_cli_tool_executor_module.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_cloud_memory.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_code_audit_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_code_review_agent.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_codegen_output.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_coder_tester_self_healing.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_coder_tool_safety.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_collaboration.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_command_loggers.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_command_safety.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_completions_builder.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_config_paths.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_configured_provider.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_container_entrypoint.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_container_entrypoints.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_context_checkpoints.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_context_references.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_context_service.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_conversation_core.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_crash_report.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_credential_file_permissions.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_custom_providers.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_daemon_gateway_config.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_dashboard_generator.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_data_service.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_data_service_imports.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_datasource_routing.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_deep_analysis.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_degrades_without_quant_engine.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_doctor.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_doctor_describes_the_current_install.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_doctor_npm_scope.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_engine_boundary.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_enterprise_tool_honesty.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_env_switch_docs.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_evals_harness.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_extended_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_feishu_swarm_config.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_finalize_release.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_finance_renderers.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_finance_service_catalog.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_first_run_works.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_football_agent.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_football_prediction_output.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_google_cloud_routing.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_google_login.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_google_search_provider.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_headless_is_agentic.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_image_gen_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_image_inputs.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_import_graph_budget.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_intent_router.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_intent_signals.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_kling_video_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_lazy_rebind.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_legacy_module_imports.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_license_consistency.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_licensing.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_local_image_provider.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_logistics_3pl.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_logistics_and_finance_agents.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_lsp.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_markdown_pdf.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_market_data_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_market_history_inheritance.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_market_history_tool.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_market_symbol_extraction.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_market_universe.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_mcp_circuit.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_mcp_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_model_capability_registry.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_model_choice_is_the_users.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_model_selection_state.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_native_binary_entrypoints.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_native_installer.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_new_modules.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_no_uncommitted_imports.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_ollama_stream_imports.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_ollama_stream_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_openai_image_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_operations_suite.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_output_rendering.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_packages_facade.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_packaging_constraints.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_packaging_manifest.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_packs_domains.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_pdf_report.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_pick_best_installed_model.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_plan_mode.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_platform_package_assembly.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_platform_packages.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_plotly_html_output.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_portfolio_ledger.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_post_turn_context_decision.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_preflight.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_preview_server.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_privacy_feedback.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_project_aria.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_project_review.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_project_review_api.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_prompt_assembly.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_prompt_selection.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_provider_autoconfig.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_provider_error_messages.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_provider_integration.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_provider_registry.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_public_service_status.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_quant_engine_namespace.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_rebind_contract.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_rebind_namespace_contract.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_relay_event_verification.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_release_chain.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_release_commit_identity.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_release_push_is_atomic.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_release_reaches_the_registries.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_release_verification_waits.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_release_workflow_permissions.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_report_charts.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_report_generator.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_research_protocol.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_research_quality.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_responsive_rendering.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_root_module_budget.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_rsi_without_pandas_ta.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runtime_acceptance.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runtime_agent_loop.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runtime_approval.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runtime_bridge.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runtime_bridge_fallback.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runtime_checkpoints.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runtime_gateway.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runtime_repo_map.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runtime_run_store.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runtime_tool_executor.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runtime_worktrees.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_runway_video_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_safety_permissions.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_safety_service.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_safety_service_adoption.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_service_diagnostics_security.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_session_search.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_settings_service.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_shipper_digest.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_single_import_root.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_skill_agent_binding.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_skill_catalog.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_skill_loader.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_spreadsheet_tools.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_sse_stream_contract.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_startup_dashboard.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_startup_latency.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_streaming_pipeline.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_stripe_agent.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_subagent.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_supervisor_routing.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_system_prompts.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_system_tools_output.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_task_orchestrator.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_team_synthesis.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_tls_trust_store.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_tool_policy.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_tool_scope.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_trading_service.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_tradingview_bridge.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_turn_planning.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_ui_completer_references.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_ui_console_theme.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_ui_input_box.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_ui_robot_banner.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_update_health_routes.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_verification_hint.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_verification_policy.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_version_consistency.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_version_counter.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_video_analysis.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_video_editor.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_vscode_mcp.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_warehouse_agents.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_warehouse_cli_registration.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_warehouse_erp_client.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_warehouse_workflow.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_wheel_is_installable.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_workspace_changes.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_workspace_context.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_workspace_files.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_workspace_scope.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_workspace_service.py +0 -0
- {aria_code-0.69.0 → aria_code-0.71.0}/tests/test_workspace_verify.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aria-code
|
|
3
|
-
Version: 0.
|
|
4
|
-
Summary: AI
|
|
3
|
+
Version: 0.71.0
|
|
4
|
+
Summary: Open-source AI agent for logistics and finance work: numbers you can check, client data kept apart, actions a person approves
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
Project-URL: Homepage, https://github.com/artheras/aria-code
|
|
7
7
|
Project-URL: Repository, https://github.com/artheras/aria-code
|
|
@@ -163,8 +163,8 @@ Dynamic: license-file
|
|
|
163
163
|
|
|
164
164
|
<h1 align="center">Aria Code</h1>
|
|
165
165
|
|
|
166
|
-
<p align="center">
|
|
167
|
-
|
|
166
|
+
<p align="center">An open-source AI agent for logistics and finance work.<br>
|
|
167
|
+
Numbers you can check, client data kept apart, actions a person approves.</p>
|
|
168
168
|
|
|
169
169
|
<p align="center"><a href="README_CN.md">简体中文</a> · English</p>
|
|
170
170
|
|
|
@@ -180,9 +180,15 @@ Work in your project, use local or cloud models, and connect domain tools when y
|
|
|
180
180
|
|
|
181
181
|
## What Aria Code does
|
|
182
182
|
|
|
183
|
-
|
|
183
|
+
A general-purpose assistant aims for an answer that reads well. In logistics and finance the number gets acted on — one purchase order left out of a reorder quantity and the stock is bought twice. Aria Code is built around three things that follow from that.
|
|
184
184
|
|
|
185
|
-
|
|
185
|
+
**Numbers you can check.** Reorder points, safety stock and carrier rankings come from stated formulas, with the formula and every assumption in the result — as does stablecoin settlement reconciliation, from the [Artheras skills](https://github.com/artheras/skills) Aria Code can install. When the data cannot support an answer — under 14 days of demand history, rows that name no shipper — it says so instead of estimating. The [`operations` eval suite](docs/verifiable-evals.md) checks exactly these traps.
|
|
186
|
+
|
|
187
|
+
**Client data kept apart.** A third-party logistics provider holds many clients' stock side by side. A chat group bound to one shipper confines every analysis to that shipper, and the logistics tools themselves refuse another shipper's data or an unattributable file — the rule holds below the prompt, whatever the model asks for.
|
|
188
|
+
|
|
189
|
+
**Actions a person approves.** In Feishu, each shipper's group gets a daily digest of reorders, dead stock and freight anomalies. `/补货` turns the reorder list into a purchase-order draft card; nothing happens until an authorised approver presses approve, and what runs is exactly what was shown. The draft is a file for your own purchasing system — Aria Code places no orders.
|
|
190
|
+
|
|
191
|
+
Underneath is a terminal coding agent: it inspects project files, applies edits, runs commands and tests, and explains the changes, with a local Ollama model or a supported cloud provider. A fresh install has no live business data; the logistics tools read your exports (CSV or JSON), and the chat features need a Feishu app or the Aria relay.
|
|
186
192
|
|
|
187
193
|
## Quick start
|
|
188
194
|
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
|
|
8
8
|
<h1 align="center">Aria Code</h1>
|
|
9
9
|
|
|
10
|
-
<p align="center">
|
|
11
|
-
|
|
10
|
+
<p align="center">An open-source AI agent for logistics and finance work.<br>
|
|
11
|
+
Numbers you can check, client data kept apart, actions a person approves.</p>
|
|
12
12
|
|
|
13
13
|
<p align="center"><a href="README_CN.md">简体中文</a> · English</p>
|
|
14
14
|
|
|
@@ -24,9 +24,15 @@ Work in your project, use local or cloud models, and connect domain tools when y
|
|
|
24
24
|
|
|
25
25
|
## What Aria Code does
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
A general-purpose assistant aims for an answer that reads well. In logistics and finance the number gets acted on — one purchase order left out of a reorder quantity and the stock is bought twice. Aria Code is built around three things that follow from that.
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
**Numbers you can check.** Reorder points, safety stock and carrier rankings come from stated formulas, with the formula and every assumption in the result — as does stablecoin settlement reconciliation, from the [Artheras skills](https://github.com/artheras/skills) Aria Code can install. When the data cannot support an answer — under 14 days of demand history, rows that name no shipper — it says so instead of estimating. The [`operations` eval suite](docs/verifiable-evals.md) checks exactly these traps.
|
|
30
|
+
|
|
31
|
+
**Client data kept apart.** A third-party logistics provider holds many clients' stock side by side. A chat group bound to one shipper confines every analysis to that shipper, and the logistics tools themselves refuse another shipper's data or an unattributable file — the rule holds below the prompt, whatever the model asks for.
|
|
32
|
+
|
|
33
|
+
**Actions a person approves.** In Feishu, each shipper's group gets a daily digest of reorders, dead stock and freight anomalies. `/补货` turns the reorder list into a purchase-order draft card; nothing happens until an authorised approver presses approve, and what runs is exactly what was shown. The draft is a file for your own purchasing system — Aria Code places no orders.
|
|
34
|
+
|
|
35
|
+
Underneath is a terminal coding agent: it inspects project files, applies edits, runs commands and tests, and explains the changes, with a local Ollama model or a supported cloud provider. A fresh install has no live business data; the logistics tools read your exports (CSV or JSON), and the chat features need a Feishu app or the Aria relay.
|
|
30
36
|
|
|
31
37
|
## Quick start
|
|
32
38
|
|
|
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "aria-code"
|
|
7
|
-
version = "0.
|
|
8
|
-
description = "AI
|
|
7
|
+
version = "0.71.0"
|
|
8
|
+
description = "Open-source AI agent for logistics and finance work: numbers you can check, client data kept apart, actions a person approves"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "Apache-2.0" }
|
|
11
11
|
# Upper bound is real, not defensive: the core dep pandas_ta pulls numba, and
|
|
@@ -6555,7 +6555,7 @@ async def main():
|
|
|
6555
6555
|
# describe one product. It used to say "Quantitative Investment
|
|
6556
6556
|
# Terminal" here while the package metadata had been repositioned;
|
|
6557
6557
|
# tests/test_first_run_works.py keeps the two in step.
|
|
6558
|
-
description="Aria Code — AI
|
|
6558
|
+
description="Aria Code — Open-source AI agent for logistics and finance work: numbers you can check, client data kept apart, actions a person approves",
|
|
6559
6559
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
6560
6560
|
epilog="""
|
|
6561
6561
|
Examples:
|
|
@@ -38,7 +38,8 @@ WebSocket 注册流程:
|
|
|
38
38
|
飞书 Verification Token(次选)——校验事件体里的 token
|
|
39
39
|
⚠️ 二者至少配一个,否则 /feishu/event 一律拒绝。
|
|
40
40
|
仅本地联调可设 RELAY_ALLOW_UNVERIFIED_EVENTS=1 绕过。
|
|
41
|
-
RELAY_SECRET
|
|
41
|
+
RELAY_SECRET 部署级别的注册口令(可选)。每台电脑另有自己的令牌和绑定码,
|
|
42
|
+
见下方 client_credentials:没有它们,任何人都能冒充或绑定别人的电脑。
|
|
42
43
|
DB_PATH SQLite 路径(默认 ./relay.db)
|
|
43
44
|
MESSAGE_TIMEOUT 等待用户本机回复的超时秒数(默认 90)
|
|
44
45
|
"""
|
|
@@ -95,6 +96,23 @@ def _db() -> sqlite3.Connection:
|
|
|
95
96
|
created_at REAL NOT NULL
|
|
96
97
|
)
|
|
97
98
|
""")
|
|
99
|
+
# Each machine's own credentials, recorded the first time it registers
|
|
100
|
+
# (trust on first use) and only as hashes:
|
|
101
|
+
# token_hash — later registrations of this client_id must present the
|
|
102
|
+
# same token, so knowing a client_id is not enough to
|
|
103
|
+
# impersonate the machine and take over its messages;
|
|
104
|
+
# bind_code_hash — /bind accepts only this code, which is generated and
|
|
105
|
+
# shown on the machine itself. The bind code used to be the
|
|
106
|
+
# client_id, so anyone who learned one could bind their own
|
|
107
|
+
# Feishu account to someone else's machine.
|
|
108
|
+
conn.execute("""
|
|
109
|
+
CREATE TABLE IF NOT EXISTS client_credentials (
|
|
110
|
+
client_id TEXT PRIMARY KEY,
|
|
111
|
+
token_hash TEXT NOT NULL,
|
|
112
|
+
bind_code_hash TEXT NOT NULL,
|
|
113
|
+
created_at REAL NOT NULL
|
|
114
|
+
)
|
|
115
|
+
""")
|
|
98
116
|
# Chats a client's bound user has spoken to the bot in: the only chats the
|
|
99
117
|
# client may later send to unprompted (the daily digest).
|
|
100
118
|
conn.execute("""
|
|
@@ -162,6 +180,45 @@ def _is_valid_client_id(client_id: str) -> bool:
|
|
|
162
180
|
return row is not None
|
|
163
181
|
|
|
164
182
|
|
|
183
|
+
def _digest(value: str) -> str:
|
|
184
|
+
return hashlib.sha256(value.encode("utf-8")).hexdigest()
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def _normalise_bind_code(code: str) -> str:
|
|
188
|
+
return "".join(ch for ch in code.upper() if ch.isalnum())
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def _admit_client(client_id: str, token: str, bind_code: str) -> str:
|
|
192
|
+
""""" when this registration may proceed, otherwise why not."""
|
|
193
|
+
if len(token or "") < 32:
|
|
194
|
+
return "this Aria version is too old for the relay; upgrade aria-code"
|
|
195
|
+
if len(_normalise_bind_code(bind_code or "")) < 10:
|
|
196
|
+
return "bind code missing; upgrade aria-code"
|
|
197
|
+
row = get_db().execute(
|
|
198
|
+
"SELECT token_hash FROM client_credentials WHERE client_id = ?", (client_id,)).fetchone()
|
|
199
|
+
if row is None:
|
|
200
|
+
get_db().execute("INSERT INTO client_credentials VALUES (?, ?, ?, ?)",
|
|
201
|
+
(client_id, _digest(token), _digest(_normalise_bind_code(bind_code)), time.time()))
|
|
202
|
+
get_db().commit()
|
|
203
|
+
return ""
|
|
204
|
+
if not hmac.compare_digest(row["token_hash"], _digest(token)):
|
|
205
|
+
return "client_id is registered to another installation"
|
|
206
|
+
# The machine may rotate its bind code; the token proves it is the same one.
|
|
207
|
+
get_db().execute("UPDATE client_credentials SET bind_code_hash = ? WHERE client_id = ?",
|
|
208
|
+
(_digest(_normalise_bind_code(bind_code)), client_id))
|
|
209
|
+
get_db().commit()
|
|
210
|
+
return ""
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def _client_for_bind_code(code: str) -> Optional[str]:
|
|
214
|
+
normalised = _normalise_bind_code(code)
|
|
215
|
+
if len(normalised) < 10:
|
|
216
|
+
return None
|
|
217
|
+
row = get_db().execute("SELECT client_id FROM client_credentials WHERE bind_code_hash = ?",
|
|
218
|
+
(_digest(normalised),)).fetchone()
|
|
219
|
+
return row["client_id"] if row else None
|
|
220
|
+
|
|
221
|
+
|
|
165
222
|
# ── WebSocket connection registry ─────────────────────────────────────────────
|
|
166
223
|
|
|
167
224
|
_connections: dict[str, WebSocket] = {} # client_id → WebSocket
|
|
@@ -402,11 +459,17 @@ async def ws_endpoint(websocket: WebSocket):
|
|
|
402
459
|
await websocket.send_text(json.dumps({"ok": False, "reason": "client_id required"}))
|
|
403
460
|
return
|
|
404
461
|
|
|
405
|
-
# Validate RELAY_SECRET if configured
|
|
406
|
-
if _RELAY_SECRET and msg.get("secret")
|
|
462
|
+
# Validate RELAY_SECRET if configured (constant-time: it is a secret)
|
|
463
|
+
if _RELAY_SECRET and not hmac.compare_digest(str(msg.get("secret") or ""), _RELAY_SECRET):
|
|
407
464
|
await websocket.send_text(json.dumps({"ok": False, "reason": "invalid secret"}))
|
|
408
465
|
return
|
|
409
466
|
|
|
467
|
+
refused = _admit_client(client_id, str(msg.get("token") or ""), str(msg.get("bind_code") or ""))
|
|
468
|
+
if refused:
|
|
469
|
+
logger.warning("refused registration for %s: %s", client_id, refused)
|
|
470
|
+
await websocket.send_text(json.dumps({"ok": False, "reason": refused}))
|
|
471
|
+
return
|
|
472
|
+
|
|
410
473
|
# Register in-memory + mark as pending bind (if first time)
|
|
411
474
|
_connections[client_id] = websocket
|
|
412
475
|
if _lookup_client.__module__: # always true; used as noop to be explicit
|
|
@@ -561,15 +624,21 @@ async def feishu_event(request: Request):
|
|
|
561
624
|
text_content = ""
|
|
562
625
|
|
|
563
626
|
if text_content.upper().startswith("/BIND ") or text_content.upper().startswith("ARIA-BIND-"):
|
|
564
|
-
raw_code = text_content.upper().replace("/BIND ", "").strip()
|
|
565
|
-
#
|
|
566
|
-
|
|
567
|
-
|
|
627
|
+
raw_code = text_content.upper().replace("/BIND ", "").strip().replace("ARIA-BIND-", "")
|
|
628
|
+
# Only the code generated and shown on the machine binds it. The
|
|
629
|
+
# client_id is not accepted any more: it was the bind code, so
|
|
630
|
+
# whoever learned one could route their messages to another
|
|
631
|
+
# person's machine.
|
|
632
|
+
client_id = _client_for_bind_code(raw_code)
|
|
633
|
+
if not client_id:
|
|
634
|
+
await _send_feishu_text(
|
|
635
|
+
feishu_user_id,
|
|
636
|
+
"❌ 绑定码无效。请在你电脑上运行 aria-code 的配置向导,使用它显示的绑定码。")
|
|
637
|
+
return {"code": 0}
|
|
638
|
+
_bind(feishu_user_id, client_id)
|
|
568
639
|
await _send_feishu_text(
|
|
569
640
|
feishu_user_id,
|
|
570
|
-
|
|
571
|
-
f"Client ID: {client_id_upper}\n"
|
|
572
|
-
f"现在可以直接发消息与你的 Aria 交互了。"
|
|
641
|
+
"✅ 绑定成功!你的 Aria 实例已连接。\n现在可以直接发消息与你的 Aria 交互了。"
|
|
573
642
|
)
|
|
574
643
|
return {"code": 0}
|
|
575
644
|
|
|
@@ -42,6 +42,56 @@ def _load_env() -> None:
|
|
|
42
42
|
|
|
43
43
|
_load_env()
|
|
44
44
|
|
|
45
|
+
# ── This machine's relay credentials ──────────────────────────────────────────
|
|
46
|
+
#
|
|
47
|
+
# The relay records both on first registration (as hashes): the token proves a
|
|
48
|
+
# later connection is this machine, and the bind code is what a Feishu user
|
|
49
|
+
# sends to bind to it. Both stay in ~/.aria/.env. Before 2026-10-04 there were
|
|
50
|
+
# neither: the client_id was the only identity and also the bind code, so
|
|
51
|
+
# anyone who learned it could impersonate the machine or bind their own Feishu
|
|
52
|
+
# account to it.
|
|
53
|
+
|
|
54
|
+
_BIND_ALPHABET = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789" # nothing to misread: no 0/O, 1/I
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def new_token() -> str:
|
|
58
|
+
import secrets
|
|
59
|
+
return secrets.token_urlsafe(32)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def new_bind_code() -> str:
|
|
63
|
+
import secrets
|
|
64
|
+
return "".join(secrets.choice(_BIND_ALPHABET) for _ in range(12))
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def format_bind_code(code: str) -> str:
|
|
68
|
+
"""ABCDEFGHJKLM → ARIA-BIND-ABCD-EFGH-JKLM, the form a person types."""
|
|
69
|
+
code = "".join(ch for ch in code.upper() if ch.isalnum())
|
|
70
|
+
return "ARIA-BIND-" + "-".join(code[i:i + 4] for i in range(0, len(code), 4))
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def ensure_credentials(env_file: Path = Path.home() / ".aria" / ".env") -> tuple[str, str]:
|
|
74
|
+
"""This machine's (token, bind code), created and saved on first use."""
|
|
75
|
+
token = os.environ.get("ARIA_RELAY_CLIENT_TOKEN", "").strip()
|
|
76
|
+
code = os.environ.get("ARIA_RELAY_BIND_CODE", "").strip()
|
|
77
|
+
fresh = {}
|
|
78
|
+
if len(token) < 32:
|
|
79
|
+
token = fresh["ARIA_RELAY_CLIENT_TOKEN"] = new_token()
|
|
80
|
+
if len(code) < 10:
|
|
81
|
+
code = fresh["ARIA_RELAY_BIND_CODE"] = new_bind_code()
|
|
82
|
+
if fresh:
|
|
83
|
+
env_file.parent.mkdir(mode=0o700, parents=True, exist_ok=True)
|
|
84
|
+
with env_file.open("a", encoding="utf-8") as handle:
|
|
85
|
+
for key, value in fresh.items():
|
|
86
|
+
handle.write(f"{key}={value}\n")
|
|
87
|
+
env_file.chmod(0o600)
|
|
88
|
+
os.environ.update(fresh)
|
|
89
|
+
if "ARIA_RELAY_BIND_CODE" in fresh:
|
|
90
|
+
logger.info("New relay bind code — send this to the Aria bot in Feishu: /bind %s",
|
|
91
|
+
format_bind_code(code))
|
|
92
|
+
return token, code
|
|
93
|
+
|
|
94
|
+
|
|
45
95
|
_RELAY_URL = os.environ.get("ARIA_RELAY_URL", "wss://relay.aria.ai")
|
|
46
96
|
_CLIENT_ID = os.environ.get("ARIA_RELAY_CLIENT_ID", "")
|
|
47
97
|
_RECONNECT_DELAY_MAX = 60 # seconds
|
|
@@ -91,6 +141,14 @@ async def _handle_message(raw_msg: dict, ws) -> None:
|
|
|
91
141
|
await ws.send(reply)
|
|
92
142
|
|
|
93
143
|
|
|
144
|
+
def register_frame(client_id: str, token: str, bind_code: str) -> dict:
|
|
145
|
+
frame = {"type": "register", "client_id": client_id, "token": token, "bind_code": bind_code}
|
|
146
|
+
secret = os.environ.get("ARIA_RELAY_SECRET", "").strip()
|
|
147
|
+
if secret:
|
|
148
|
+
frame["secret"] = secret # the deployment-wide gate, when the relay sets one
|
|
149
|
+
return frame
|
|
150
|
+
|
|
151
|
+
|
|
94
152
|
# ── Sending through the relay ─────────────────────────────────────────────────
|
|
95
153
|
#
|
|
96
154
|
# This machine has no Feishu app credentials in relay mode, so the bot hands
|
|
@@ -151,14 +209,15 @@ async def _connect_and_serve(once: bool = False) -> None:
|
|
|
151
209
|
open_timeout=15,
|
|
152
210
|
) as ws:
|
|
153
211
|
# Register with server
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
"client_id": _CLIENT_ID,
|
|
157
|
-
}))
|
|
212
|
+
token, bind_code = ensure_credentials()
|
|
213
|
+
await ws.send(json.dumps(register_frame(_CLIENT_ID, token, bind_code)))
|
|
158
214
|
ack_raw = await asyncio.wait_for(ws.recv(), timeout=10)
|
|
159
215
|
ack = json.loads(ack_raw)
|
|
160
216
|
if not ack.get("ok"):
|
|
161
217
|
logger.error("Registration rejected: %s", ack.get("reason", "unknown"))
|
|
218
|
+
if "another installation" in str(ack.get("reason", "")):
|
|
219
|
+
logger.error("This client_id belongs to a different machine on the relay. "
|
|
220
|
+
"Run the setup wizard to create a new one.")
|
|
162
221
|
await asyncio.sleep(delay)
|
|
163
222
|
continue
|
|
164
223
|
|
|
@@ -376,26 +376,34 @@ def _setup_feishu_relay(env: dict[str, str]) -> None:
|
|
|
376
376
|
env["ARIA_RELAY_URL"] = relay_url
|
|
377
377
|
env["ARIA_RELAY_MODE"] = "relay"
|
|
378
378
|
|
|
379
|
-
# Generate or reuse client_id
|
|
379
|
+
# Generate or reuse client_id, plus this machine's token and bind code. The
|
|
380
|
+
# bind code — not the client_id — is what a Feishu user sends to bind:
|
|
381
|
+
# only someone who can see this screen has it.
|
|
382
|
+
from aria_code.clients.aria_relay_client import format_bind_code, new_bind_code, new_token
|
|
380
383
|
client_id = env.get("ARIA_RELAY_CLIENT_ID") or f"aria-{uuid.uuid4().hex[:12]}"
|
|
381
384
|
env["ARIA_RELAY_CLIENT_ID"] = client_id
|
|
385
|
+
if len(env.get("ARIA_RELAY_CLIENT_TOKEN", "")) < 32:
|
|
386
|
+
env["ARIA_RELAY_CLIENT_TOKEN"] = new_token()
|
|
387
|
+
if len(env.get("ARIA_RELAY_BIND_CODE", "")) < 10:
|
|
388
|
+
env["ARIA_RELAY_BIND_CODE"] = new_bind_code()
|
|
389
|
+
bind_code = format_bind_code(env["ARIA_RELAY_BIND_CODE"])
|
|
382
390
|
|
|
383
391
|
if _rich:
|
|
384
392
|
console.print(Panel(
|
|
385
393
|
f"[bold]你的绑定码:[/bold]\n\n"
|
|
386
|
-
f"[bold yellow on black]
|
|
394
|
+
f"[bold yellow on black] {bind_code} [/bold yellow on black]\n\n"
|
|
387
395
|
f"[dim]操作步骤:[/dim]\n"
|
|
388
396
|
f"1. 在飞书搜索 [cyan]Aria Bot[/cyan] 并添加好友\n"
|
|
389
|
-
f"2. 发送:[cyan]/bind
|
|
397
|
+
f"2. 发送:[cyan]/bind {bind_code}[/cyan]\n"
|
|
390
398
|
f"3. 收到 [green]\"绑定成功\"[/green] 后,飞书消息将转发到你的 Aria\n\n"
|
|
391
399
|
f"[dim](中继客户端会在 daemon 启动时自动连接)[/dim]",
|
|
392
400
|
title="📱 飞书绑定步骤",
|
|
393
401
|
border_style="yellow",
|
|
394
402
|
))
|
|
395
403
|
else:
|
|
396
|
-
print(f"\n你的绑定码:
|
|
404
|
+
print(f"\n你的绑定码: {bind_code} (只发给你自己的飞书账号里的 Aria,不要给别人)")
|
|
397
405
|
print("1. 在飞书搜索 Aria Bot 并添加好友")
|
|
398
|
-
print(f"2. 发送: /bind
|
|
406
|
+
print(f"2. 发送: /bind {bind_code}")
|
|
399
407
|
print("3. 收到绑定成功后继续\n")
|
|
400
408
|
|
|
401
409
|
if _confirm("是否已完成绑定?(可以稍后运行向导再完成)", default=False):
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aria-code
|
|
3
|
-
Version: 0.
|
|
4
|
-
Summary: AI
|
|
3
|
+
Version: 0.71.0
|
|
4
|
+
Summary: Open-source AI agent for logistics and finance work: numbers you can check, client data kept apart, actions a person approves
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
Project-URL: Homepage, https://github.com/artheras/aria-code
|
|
7
7
|
Project-URL: Repository, https://github.com/artheras/aria-code
|
|
@@ -163,8 +163,8 @@ Dynamic: license-file
|
|
|
163
163
|
|
|
164
164
|
<h1 align="center">Aria Code</h1>
|
|
165
165
|
|
|
166
|
-
<p align="center">
|
|
167
|
-
|
|
166
|
+
<p align="center">An open-source AI agent for logistics and finance work.<br>
|
|
167
|
+
Numbers you can check, client data kept apart, actions a person approves.</p>
|
|
168
168
|
|
|
169
169
|
<p align="center"><a href="README_CN.md">简体中文</a> · English</p>
|
|
170
170
|
|
|
@@ -180,9 +180,15 @@ Work in your project, use local or cloud models, and connect domain tools when y
|
|
|
180
180
|
|
|
181
181
|
## What Aria Code does
|
|
182
182
|
|
|
183
|
-
|
|
183
|
+
A general-purpose assistant aims for an answer that reads well. In logistics and finance the number gets acted on — one purchase order left out of a reorder quantity and the stock is bought twice. Aria Code is built around three things that follow from that.
|
|
184
184
|
|
|
185
|
-
|
|
185
|
+
**Numbers you can check.** Reorder points, safety stock and carrier rankings come from stated formulas, with the formula and every assumption in the result — as does stablecoin settlement reconciliation, from the [Artheras skills](https://github.com/artheras/skills) Aria Code can install. When the data cannot support an answer — under 14 days of demand history, rows that name no shipper — it says so instead of estimating. The [`operations` eval suite](docs/verifiable-evals.md) checks exactly these traps.
|
|
186
|
+
|
|
187
|
+
**Client data kept apart.** A third-party logistics provider holds many clients' stock side by side. A chat group bound to one shipper confines every analysis to that shipper, and the logistics tools themselves refuse another shipper's data or an unattributable file — the rule holds below the prompt, whatever the model asks for.
|
|
188
|
+
|
|
189
|
+
**Actions a person approves.** In Feishu, each shipper's group gets a daily digest of reorders, dead stock and freight anomalies. `/补货` turns the reorder list into a purchase-order draft card; nothing happens until an authorised approver presses approve, and what runs is exactly what was shown. The draft is a file for your own purchasing system — Aria Code places no orders.
|
|
190
|
+
|
|
191
|
+
Underneath is a terminal coding agent: it inspects project files, applies edits, runs commands and tests, and explains the changes, with a local Ollama model or a supported cloud provider. A fresh install has no live business data; the logistics tools read your exports (CSV or JSON), and the chat features need a Feishu app or the Aria relay.
|
|
186
192
|
|
|
187
193
|
## Quick start
|
|
188
194
|
|
|
@@ -635,6 +635,7 @@ tests/test_public_service_status.py
|
|
|
635
635
|
tests/test_quant_engine_namespace.py
|
|
636
636
|
tests/test_rebind_contract.py
|
|
637
637
|
tests/test_rebind_namespace_contract.py
|
|
638
|
+
tests/test_relay_client_credentials.py
|
|
638
639
|
tests/test_relay_event_verification.py
|
|
639
640
|
tests/test_relay_sends_for_clients.py
|
|
640
641
|
tests/test_release_chain.py
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"""Knowing a client_id must not let anyone impersonate or bind that machine.
|
|
2
|
+
|
|
3
|
+
Before 2026-10-04 the client_id was a relay client's only identity and also
|
|
4
|
+
its bind code. Two consequences, both closed here:
|
|
5
|
+
|
|
6
|
+
1. Registering with someone's client_id replaced their connection, and their
|
|
7
|
+
Feishu messages went to the newcomer.
|
|
8
|
+
2. Sending "/bind ARIA-BIND-<their client_id>" from your own, properly signed
|
|
9
|
+
Feishu account bound you to their machine, so your messages ran there —
|
|
10
|
+
on their model quota, against their local data.
|
|
11
|
+
|
|
12
|
+
Now each machine registers a token (trust on first use) and a bind code it
|
|
13
|
+
generated and shows only on its own screen; the relay stores hashes of both.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import importlib
|
|
19
|
+
import json
|
|
20
|
+
import os
|
|
21
|
+
from unittest import mock
|
|
22
|
+
|
|
23
|
+
import pytest
|
|
24
|
+
|
|
25
|
+
if os.environ.get("GITHUB_ACTIONS"):
|
|
26
|
+
import fastapi # noqa: F401 — CI must run these, not skip them
|
|
27
|
+
|
|
28
|
+
fastapi_testclient = pytest.importorskip("fastapi.testclient", reason="relay server dependency")
|
|
29
|
+
TestClient = fastapi_testclient.TestClient
|
|
30
|
+
|
|
31
|
+
TOKEN_A, TOKEN_B = "a" * 43, "b" * 43
|
|
32
|
+
CODE_A, CODE_B = "ABCDEFGHJKLM", "NPQRSTUVWXYZ"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@pytest.fixture
|
|
36
|
+
def relay(monkeypatch, tmp_path):
|
|
37
|
+
monkeypatch.setenv("DB_PATH", str(tmp_path / "relay.db"))
|
|
38
|
+
for key in ("FEISHU_ENCRYPT_KEY", "RELAY_ALLOW_UNVERIFIED_EVENTS", "RELAY_SECRET"):
|
|
39
|
+
monkeypatch.delenv(key, raising=False)
|
|
40
|
+
monkeypatch.setenv("FEISHU_VERIFICATION_TOKEN", "tok")
|
|
41
|
+
import aria_relay_server
|
|
42
|
+
return importlib.reload(aria_relay_server)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _register(relay, client_id="aria-victim", token=TOKEN_A, code=CODE_A, **extra):
|
|
46
|
+
with TestClient(relay.app).websocket_connect("/ws") as ws:
|
|
47
|
+
ws.send_text(json.dumps({"type": "register", "client_id": client_id,
|
|
48
|
+
"token": token, "bind_code": code, **extra}))
|
|
49
|
+
return json.loads(ws.receive_text())
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class TestRegistration:
|
|
53
|
+
def test_the_first_registration_is_accepted(self, relay):
|
|
54
|
+
assert _register(relay)["ok"]
|
|
55
|
+
|
|
56
|
+
def test_only_hashes_are_stored(self, relay):
|
|
57
|
+
_register(relay)
|
|
58
|
+
row = relay.get_db().execute("SELECT * FROM client_credentials").fetchone()
|
|
59
|
+
assert TOKEN_A not in tuple(row) and CODE_A not in tuple(row)
|
|
60
|
+
|
|
61
|
+
def test_the_same_machine_reconnects(self, relay):
|
|
62
|
+
_register(relay)
|
|
63
|
+
assert _register(relay)["ok"]
|
|
64
|
+
|
|
65
|
+
def test_someone_else_with_the_client_id_is_refused(self, relay):
|
|
66
|
+
_register(relay)
|
|
67
|
+
answer = _register(relay, token=TOKEN_B)
|
|
68
|
+
assert not answer["ok"] and "another installation" in answer["reason"]
|
|
69
|
+
|
|
70
|
+
def test_a_client_without_credentials_is_told_to_upgrade(self, relay):
|
|
71
|
+
with TestClient(relay.app).websocket_connect("/ws") as ws:
|
|
72
|
+
ws.send_text(json.dumps({"type": "register", "client_id": "aria-old"}))
|
|
73
|
+
answer = json.loads(ws.receive_text())
|
|
74
|
+
assert not answer["ok"] and "upgrade" in answer["reason"]
|
|
75
|
+
|
|
76
|
+
def test_the_deployment_secret_still_gates_registration(self, relay, monkeypatch):
|
|
77
|
+
monkeypatch.setattr(relay, "_RELAY_SECRET", "s3cret")
|
|
78
|
+
assert not _register(relay, secret="wrong")["ok"]
|
|
79
|
+
assert _register(relay, client_id="aria-other", secret="s3cret")["ok"]
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def _bind_event(open_id, text):
|
|
83
|
+
return {"token": "tok", "header": {"event_type": "im.message.receive_v1"}, "event": {
|
|
84
|
+
"sender": {"sender_id": {"open_id": open_id}},
|
|
85
|
+
"message": {"message_id": "om_1", "chat_id": "oc_dm", "message_type": "text",
|
|
86
|
+
"content": json.dumps({"text": text})}}}
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class TestBinding:
|
|
90
|
+
def _post(self, relay, open_id, text):
|
|
91
|
+
sent = []
|
|
92
|
+
|
|
93
|
+
async def send_text(to, text):
|
|
94
|
+
sent.append(text)
|
|
95
|
+
|
|
96
|
+
with mock.patch.object(relay, "_send_feishu_text", send_text):
|
|
97
|
+
TestClient(relay.app).post("/feishu/event", json=_bind_event(open_id, text))
|
|
98
|
+
return sent
|
|
99
|
+
|
|
100
|
+
def test_the_machines_own_code_binds_it(self, relay):
|
|
101
|
+
_register(relay)
|
|
102
|
+
replies = self._post(relay, "ou_owner", "/bind ARIA-BIND-ABCD-EFGH-JKLM")
|
|
103
|
+
assert "绑定成功" in replies[0]
|
|
104
|
+
assert relay._lookup_client("ou_owner") == "aria-victim"
|
|
105
|
+
|
|
106
|
+
def test_the_client_id_no_longer_binds(self, relay):
|
|
107
|
+
_register(relay)
|
|
108
|
+
replies = self._post(relay, "ou_attacker", "/bind ARIA-BIND-ARIA-VICTIM")
|
|
109
|
+
assert "无效" in replies[0]
|
|
110
|
+
assert relay._lookup_client("ou_attacker") is None
|
|
111
|
+
|
|
112
|
+
def test_a_guessed_code_does_not_bind(self, relay):
|
|
113
|
+
_register(relay)
|
|
114
|
+
self._post(relay, "ou_attacker", f"/bind ARIA-BIND-{CODE_B}")
|
|
115
|
+
assert relay._lookup_client("ou_attacker") is None
|
|
116
|
+
|
|
117
|
+
def test_a_rotated_code_replaces_the_old_one(self, relay):
|
|
118
|
+
_register(relay)
|
|
119
|
+
_register(relay, code=CODE_B)
|
|
120
|
+
self._post(relay, "ou_x", f"/bind {CODE_A}")
|
|
121
|
+
assert relay._lookup_client("ou_x") is None
|
|
122
|
+
self._post(relay, "ou_owner", f"/bind {CODE_B}")
|
|
123
|
+
assert relay._lookup_client("ou_owner") == "aria-victim"
|
|
124
|
+
|
|
125
|
+
def test_a_rotation_needs_the_token(self, relay):
|
|
126
|
+
_register(relay)
|
|
127
|
+
_register(relay, token=TOKEN_B, code=CODE_B) # refused, so nothing changes
|
|
128
|
+
self._post(relay, "ou_attacker", f"/bind {CODE_B}")
|
|
129
|
+
assert relay._lookup_client("ou_attacker") is None
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
# ── The client side ──────────────────────────────────────────────────────────
|
|
133
|
+
|
|
134
|
+
from aria_code.clients import aria_relay_client as client # noqa: E402
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
class TestClientCredentials:
|
|
138
|
+
def test_created_once_saved_privately_and_reused(self, tmp_path, monkeypatch):
|
|
139
|
+
# setenv (not delenv) so monkeypatch restores whatever
|
|
140
|
+
# ensure_credentials writes into os.environ.
|
|
141
|
+
monkeypatch.setenv("ARIA_RELAY_CLIENT_TOKEN", "")
|
|
142
|
+
monkeypatch.setenv("ARIA_RELAY_BIND_CODE", "")
|
|
143
|
+
env_file = tmp_path / ".aria" / ".env"
|
|
144
|
+
first = client.ensure_credentials(env_file)
|
|
145
|
+
assert oct(env_file.stat().st_mode & 0o777) == "0o600"
|
|
146
|
+
assert len(first[0]) >= 32 and len(first[1]) == 12
|
|
147
|
+
assert client.ensure_credentials(env_file) == first
|
|
148
|
+
assert env_file.read_text().count("ARIA_RELAY_CLIENT_TOKEN=") == 1
|
|
149
|
+
|
|
150
|
+
def test_bind_codes_avoid_characters_people_misread(self):
|
|
151
|
+
codes = "".join(client.new_bind_code() for _ in range(200))
|
|
152
|
+
assert not set(codes) & set("0O1I")
|
|
153
|
+
|
|
154
|
+
def test_the_bind_code_is_typed_in_groups(self):
|
|
155
|
+
assert client.format_bind_code("abcdefghjklm") == "ARIA-BIND-ABCD-EFGH-JKLM"
|
|
156
|
+
|
|
157
|
+
def test_the_register_frame_carries_the_credentials(self, monkeypatch):
|
|
158
|
+
monkeypatch.setenv("ARIA_RELAY_SECRET", "s3cret")
|
|
159
|
+
frame = client.register_frame("aria-a", TOKEN_A, CODE_A)
|
|
160
|
+
assert frame == {"type": "register", "client_id": "aria-a", "token": TOKEN_A,
|
|
161
|
+
"bind_code": CODE_A, "secret": "s3cret"}
|
|
@@ -184,7 +184,8 @@ class TestCardPresses:
|
|
|
184
184
|
class TestOverTheWebSocket:
|
|
185
185
|
def test_a_refused_send_comes_back_as_a_send_result(self, relay):
|
|
186
186
|
with TestClient(relay.app).websocket_connect("/ws") as ws:
|
|
187
|
-
ws.send_text(json.dumps({"type": "register", "client_id": "aria-a"
|
|
187
|
+
ws.send_text(json.dumps({"type": "register", "client_id": "aria-a",
|
|
188
|
+
"token": "t" * 43, "bind_code": "ABCDEFGHJKLM"}))
|
|
188
189
|
assert json.loads(ws.receive_text())["ok"]
|
|
189
190
|
ws.send_text(json.dumps({"type": "send", "id": "s1", **_send("oc_not_mine")}))
|
|
190
191
|
answer = json.loads(ws.receive_text())
|
|
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
|