aria-code 0.71.0__tar.gz → 0.73.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.71.0/src/aria_code.egg-info → aria_code-0.73.0}/PKG-INFO +1 -1
- {aria_code-0.71.0 → aria_code-0.73.0}/pyproject.toml +1 -1
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/_version.py +1 -1
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/hooks.py +1 -1
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/aria_cli.py +0 -11
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/aria_relay_server.py +52 -119
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/clients/aria_relay_client.py +44 -2
- aria_code-0.73.0/src/aria_code/relay_store.py +194 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/setup_wizard.py +5 -2
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/ui/banner.py +0 -31
- {aria_code-0.71.0 → aria_code-0.73.0/src/aria_code.egg-info}/PKG-INFO +1 -1
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code.egg-info/SOURCES.txt +4 -0
- aria_code-0.73.0/tests/test_honest_surfaces.py +76 -0
- aria_code-0.73.0/tests/test_relay_store.py +177 -0
- aria_code-0.73.0/tests/test_relay_url.py +75 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/LICENSE +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/NOTICE +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/README.md +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/setup.cfg +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/adk_apps/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/base.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/code_review.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/deep/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/deep/critic.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/deep/deepen.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/deep/models.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/deep/pipeline.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/deep/themes.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/deep/tiers.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/engineering/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/engineering/coder.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/engineering/tester.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/financial/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/financial/catalyst.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/financial/debate.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/financial/earnings.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/financial/fundamental.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/financial/macro.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/financial/news.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/financial/risk.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/financial/sector.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/financial/strategist.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/financial/synthesis.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/financial/technical.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/orchestrator.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/portfolio_agent.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/realty/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/realty/business_match.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/registry.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/signal_scheme.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/sports/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/sports/football_agent.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/supervisor.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/team.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/aliyun_data_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/README.md +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/channels/README.md +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/channels/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/channels/approvals.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/channels/conversation.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/channels/digest.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/channels/intake.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/channels/registry.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/channels/tradingview.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/README.md +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/_optional.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/broker_render.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/core_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/data_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/market.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/report.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/team.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/config_paths.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/config_store.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/constants.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/context.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/deterministic.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/direct.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/football_reports.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/google_login.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/handlers/market_handlers.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/helpers.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/i18n.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/intent.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/intent_router.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/main.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/market_universe.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/message_processing.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/preflight.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/project_aria.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/providers/base.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/sandbox.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/session_export.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/session_store.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/tools/context.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/update_check.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/daemon/README.md +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/vscode/README.md +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/apps/vscode/package.json +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/aria_daemon.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/aria_feishu_bot.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/aria_mcp_server.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/aria_relay_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/aria_telegram_bot.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/ariarc.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/artifacts.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/backtest_engine.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/backtest_report.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/brokers/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/brokers/automation.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/brokers/base.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/brokers/capabilities.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/brokers/cn/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/brokers/config.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/brokers/intl/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/brokers/paper_broker.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/brokers/planning.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/brokers/registry.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/brokers/trading.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/canva_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/change_store.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/clients/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/clients/canva_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/clients/figma_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/clients/football_data_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/clients/kling_video_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/clients/market_data_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/clients/openai_image_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/clients/runway_video_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/cloud_memory.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/command_safety.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/computer_use_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/dashboard_generator.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/data_analysis_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/data_cleaner.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/data_service.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/datasources/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/datasources/base.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/datasources/router.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/datasources/sources/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/demo_player.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/doctor.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/domain/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/domain/backtest_engine.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/domain/backtest_report.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/domain/finance_formulas.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/domain/strategy_vault.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/evals/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/evals/harness.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/evals/runner.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/external_agent_runner.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/figma_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/file_analysis_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/finance_formulas.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/football_data_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/image_gen_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/intent_classifier.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/kling_video_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/licensing.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/local_finance_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/local_image_provider.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/local_llm_provider.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/macro_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/markdown_pdf.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/market_data_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/mcp_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/memory_manager.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/model_capability.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/notification_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/openai_image_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_core/export.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_core/paths.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_infra/product.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_services/cache.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_services/context.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_services/data.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_services/references.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_services/registry.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_services/settings.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_services/usage.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packs/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packs/base.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packs/finance/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packs/logistics/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packs/payments/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packs/realty/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packs/registry.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/packs/rules.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/plan_utils.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/plugin_loader.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/portfolio_ledger.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/preview_server.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/privacy/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/privacy/feedback.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/project_review.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/project_review_api.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/project_review_server.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/project_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/providers/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/providers/llm/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/providers/llm/anthropic.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/providers/llm/base.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/providers/llm/custom.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/providers/llm/ollama.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/providers/llm/registry.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/providers/local_image_provider.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/providers/local_llm_provider.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/realty_data_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/report_exporters.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/report_generator.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/runtime/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/runtime/acceptance.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/runtime/agent_loop.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/runtime/approval.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/runtime/budget.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/runtime/checkpoints.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/runtime/crash_report.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/runtime/events.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/runtime/gateway.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/runtime/lsp.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/runtime/orchestrator.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/runtime/repo_map.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/runtime/run_state.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/runtime/run_store.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/runtime/self_healing.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/runtime/subagent.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/runtime/task_ledger.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/runtime/tool_executor.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/runtime/tool_policy.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/runtime/worktrees.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/runway_video_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/safety/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/safety/permissions.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/safety/service.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/spreadsheet_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/strategy_vault.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/tools/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/tools/artifact_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/tools/broker_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/tools/build_quant_engine.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/tools/code_audit_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/tools/computer_use_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/tools/extended_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/tools/image_gen_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/tools/local_finance_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/tools/logistics_carriers.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/tools/logistics_inventory.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/tools/logistics_io.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/tools/logistics_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/tools/macro_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/tools/notification_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/tools/project_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/tools/realty_data_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/tools/stripe_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/ui/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/ui/completer.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/ui/console.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/ui/image_render.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/ui/input_box.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/ui/picker.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/ui/render/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/ui/render/finance.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/ui/render/market.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/ui/render/output.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/ui/render/responsive.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/ui/render/team.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/ui/robot.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/ui/startup_dashboard.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/utils/vscode_uri.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/video_analysis.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/video_editor.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/workspace/__init__.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/workspace/files.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/workspace/verify.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/workspace_changes.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/workspace_context.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/workspace_service.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code/workspace_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code.egg-info/entry_points.txt +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code.egg-info/requires.txt +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/src/aria_code.egg-info/top_level.txt +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_adk_market_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_agent_team_fallback.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_analyze_file_tool.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_architecture_ledger_is_true.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_architecture_report.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_aria_cli_core.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_aria_mcp_server.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_aria_sdk.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_artifact_publishing.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_artifacts_and_reports.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_ashare_prediction_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_backtest_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_backtest_engine.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_backtest_report.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_broken_akshare_is_optional.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_broker_automation.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_broker_chat_confirm_gate.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_broker_planning.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_broker_safety.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_broker_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_budget.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_business_workflow_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_canva_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_canvas_cmds.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_card_approvals.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_channel_intake.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_channels.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_chart_handlers.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_chat_bots_fail_closed.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_chat_routing.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_ci_security_workflow.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_cli_app_split.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_cli_bootstrap.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_cli_config_store.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_cli_lifecycle_hooks.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_cli_runtime_consumer.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_cli_tool_executor_module.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_cloud_memory.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_code_audit_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_code_review_agent.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_codegen_output.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_coder_tester_self_healing.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_coder_tool_safety.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_collaboration.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_command_loggers.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_command_safety.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_completions_builder.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_config_paths.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_configured_provider.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_container_entrypoint.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_container_entrypoints.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_context_checkpoints.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_context_references.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_context_service.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_conversation_core.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_crash_report.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_credential_file_permissions.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_custom_providers.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_daemon_gateway_config.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_dashboard_generator.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_data_service.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_data_service_imports.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_datasource_routing.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_deep_analysis.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_degrades_without_quant_engine.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_doctor.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_doctor_describes_the_current_install.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_doctor_npm_scope.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_engine_boundary.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_enterprise_tool_honesty.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_env_switch_docs.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_evals_harness.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_extended_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_feishu_swarm_config.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_finalize_release.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_finance_renderers.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_finance_service_catalog.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_first_run_works.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_football_agent.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_football_prediction_output.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_google_cloud_routing.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_google_login.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_google_search_provider.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_headless_is_agentic.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_image_gen_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_image_inputs.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_import_graph_budget.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_intent_router.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_intent_signals.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_kling_video_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_lazy_rebind.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_legacy_module_imports.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_license_consistency.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_licensing.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_local_image_provider.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_logistics_3pl.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_logistics_and_finance_agents.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_lsp.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_markdown_pdf.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_market_data_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_market_history_inheritance.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_market_history_tool.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_market_symbol_extraction.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_market_universe.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_mcp_circuit.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_mcp_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_model_capability_registry.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_model_choice_is_the_users.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_model_selection_state.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_native_binary_entrypoints.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_native_installer.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_new_modules.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_no_uncommitted_imports.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_ollama_stream_imports.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_ollama_stream_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_openai_image_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_operations_suite.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_output_rendering.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_packages_facade.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_packaging_constraints.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_packaging_manifest.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_packs_domains.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_pdf_report.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_pick_best_installed_model.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_plan_mode.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_platform_package_assembly.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_platform_packages.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_plotly_html_output.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_portfolio_ledger.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_post_turn_context_decision.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_preflight.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_preview_server.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_privacy_feedback.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_project_aria.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_project_review.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_project_review_api.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_prompt_assembly.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_prompt_selection.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_provider_autoconfig.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_provider_error_messages.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_provider_integration.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_provider_registry.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_public_service_status.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_quant_engine_namespace.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_rebind_contract.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_rebind_namespace_contract.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_relay_client_credentials.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_relay_event_verification.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_relay_sends_for_clients.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_release_chain.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_release_commit_identity.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_release_push_is_atomic.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_release_reaches_the_registries.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_release_verification_waits.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_release_workflow_permissions.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_report_charts.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_report_generator.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_research_protocol.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_research_quality.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_responsive_rendering.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_root_module_budget.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_rsi_without_pandas_ta.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_runtime_acceptance.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_runtime_agent_loop.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_runtime_approval.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_runtime_bridge.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_runtime_bridge_fallback.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_runtime_checkpoints.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_runtime_gateway.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_runtime_repo_map.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_runtime_run_store.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_runtime_tool_executor.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_runtime_worktrees.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_runway_video_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_safety_permissions.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_safety_service.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_safety_service_adoption.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_service_diagnostics_security.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_session_search.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_settings_service.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_shipper_digest.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_single_import_root.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_skill_agent_binding.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_skill_catalog.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_skill_loader.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_spreadsheet_tools.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_sse_stream_contract.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_startup_dashboard.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_startup_latency.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_streaming_pipeline.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_stripe_agent.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_subagent.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_supervisor_routing.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_system_prompts.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_system_tools_output.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_task_orchestrator.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_team_synthesis.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_tls_trust_store.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_tool_policy.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_tool_scope.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_trading_service.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_tradingview_bridge.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_turn_planning.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_ui_completer_references.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_ui_console_theme.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_ui_input_box.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_ui_robot_banner.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_update_health_routes.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_verification_hint.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_verification_policy.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_version_consistency.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_version_counter.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_video_analysis.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_video_editor.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_vscode_mcp.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_warehouse_agents.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_warehouse_cli_registration.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_warehouse_erp_client.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_warehouse_workflow.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_wheel_is_installable.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_workspace_changes.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_workspace_context.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_workspace_files.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_workspace_scope.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_workspace_service.py +0 -0
- {aria_code-0.71.0 → aria_code-0.73.0}/tests/test_workspace_verify.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aria-code
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.73.0
|
|
4
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
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "aria-code"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.73.0"
|
|
8
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" }
|
|
@@ -170,7 +170,7 @@ def create_example_hooks(path: Path) -> None:
|
|
|
170
170
|
return
|
|
171
171
|
path.parent.mkdir(parents=True, exist_ok=True)
|
|
172
172
|
example = {
|
|
173
|
-
"_comment": "Aria Code hooks — https://aria
|
|
173
|
+
"_comment": "Aria Code hooks — schema: https://github.com/artheras/aria-code/blob/main/src/aria_code/apps/cli/hooks.py",
|
|
174
174
|
"PreToolUse": [],
|
|
175
175
|
"PostToolUse": [],
|
|
176
176
|
"ResponseDone": [],
|
|
@@ -6067,17 +6067,6 @@ class ArtheraTerminal:
|
|
|
6067
6067
|
"""Run the interactive REPL loop."""
|
|
6068
6068
|
self.print_header()
|
|
6069
6069
|
await self._startup_health_check()
|
|
6070
|
-
try:
|
|
6071
|
-
from ui.banner import render_session_banner
|
|
6072
|
-
render_session_banner(
|
|
6073
|
-
self.session_id,
|
|
6074
|
-
console=console,
|
|
6075
|
-
has_rich=HAS_RICH,
|
|
6076
|
-
lang=self.config.get("ui_lang", "en") or "en",
|
|
6077
|
-
web_url=self.config.get("web_url", "https://arthera.finance"),
|
|
6078
|
-
)
|
|
6079
|
-
except Exception:
|
|
6080
|
-
pass
|
|
6081
6070
|
|
|
6082
6071
|
# Background: settle pending market calls (>24h) vs live prices so the
|
|
6083
6072
|
# prediction track record + DPO signals accrue with zero user effort.
|
|
@@ -40,6 +40,9 @@ WebSocket 注册流程:
|
|
|
40
40
|
仅本地联调可设 RELAY_ALLOW_UNVERIFIED_EVENTS=1 绕过。
|
|
41
41
|
RELAY_SECRET 部署级别的注册口令(可选)。每台电脑另有自己的令牌和绑定码,
|
|
42
42
|
见下方 client_credentials:没有它们,任何人都能冒充或绑定别人的电脑。
|
|
43
|
+
RELAY_STORE 状态存储:sqlite(默认,DB_PATH)或 firestore。Cloud Run 上必须用
|
|
44
|
+
firestore——容器文件系统每次部署都会清空,SQLite 里的绑定和电脑凭证会丢。
|
|
45
|
+
RELAY_FIRESTORE_PROJECT / RELAY_FIRESTORE_DATABASE 可选,默认当前项目和 (default) 数据库
|
|
43
46
|
DB_PATH SQLite 路径(默认 ./relay.db)
|
|
44
47
|
MESSAGE_TIMEOUT 等待用户本机回复的超时秒数(默认 90)
|
|
45
48
|
"""
|
|
@@ -78,106 +81,44 @@ _MSG_TIMEOUT = int(os.environ.get("MESSAGE_TIMEOUT", "90"))
|
|
|
78
81
|
_FEISHU_API = "https://open.feishu.cn/open-apis"
|
|
79
82
|
|
|
80
83
|
|
|
81
|
-
# ──
|
|
84
|
+
# ── Persistent state (relay_store.py) ─────────────────────────────────────────
|
|
85
|
+
#
|
|
86
|
+
# SQLite by default; RELAY_STORE=firestore on Cloud Run, where the container
|
|
87
|
+
# filesystem — and with it a SQLite file — is discarded on every deploy.
|
|
88
|
+
#
|
|
89
|
+
# Each machine's credentials are recorded on its first registration (trust on
|
|
90
|
+
# first use), only as hashes: the token proves a later connection is the same
|
|
91
|
+
# machine; the bind code is the only thing /bind accepts. The bind code used to
|
|
92
|
+
# be the client_id, so anyone who learned one could bind their own Feishu
|
|
93
|
+
# account to someone else's machine.
|
|
94
|
+
|
|
95
|
+
_store_instance = None
|
|
82
96
|
|
|
83
|
-
def _db() -> sqlite3.Connection:
|
|
84
|
-
conn = sqlite3.connect(_DB_PATH, check_same_thread=False)
|
|
85
|
-
conn.row_factory = sqlite3.Row
|
|
86
|
-
conn.execute("""
|
|
87
|
-
CREATE TABLE IF NOT EXISTS bindings (
|
|
88
|
-
feishu_user_id TEXT PRIMARY KEY,
|
|
89
|
-
client_id TEXT NOT NULL,
|
|
90
|
-
bound_at REAL NOT NULL
|
|
91
|
-
)
|
|
92
|
-
""")
|
|
93
|
-
conn.execute("""
|
|
94
|
-
CREATE TABLE IF NOT EXISTS pending_binds (
|
|
95
|
-
client_id TEXT PRIMARY KEY,
|
|
96
|
-
created_at REAL NOT NULL
|
|
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
|
-
""")
|
|
116
|
-
# Chats a client's bound user has spoken to the bot in: the only chats the
|
|
117
|
-
# client may later send to unprompted (the daily digest).
|
|
118
|
-
conn.execute("""
|
|
119
|
-
CREATE TABLE IF NOT EXISTS client_chats (
|
|
120
|
-
client_id TEXT NOT NULL,
|
|
121
|
-
chat_id TEXT NOT NULL,
|
|
122
|
-
last_seen REAL NOT NULL,
|
|
123
|
-
PRIMARY KEY (client_id, chat_id)
|
|
124
|
-
)
|
|
125
|
-
""")
|
|
126
|
-
# Cards the relay posted for a client: a press on one is routed back to
|
|
127
|
-
# that client, which holds the approval it belongs to.
|
|
128
|
-
conn.execute("""
|
|
129
|
-
CREATE TABLE IF NOT EXISTS card_origins (
|
|
130
|
-
message_id TEXT PRIMARY KEY,
|
|
131
|
-
client_id TEXT NOT NULL,
|
|
132
|
-
created_at REAL NOT NULL
|
|
133
|
-
)
|
|
134
|
-
""")
|
|
135
|
-
conn.commit()
|
|
136
|
-
return conn
|
|
137
97
|
|
|
98
|
+
def _store():
|
|
99
|
+
global _store_instance
|
|
100
|
+
if _store_instance is None:
|
|
101
|
+
from aria_code.relay_store import open_store
|
|
102
|
+
_store_instance = open_store()
|
|
103
|
+
return _store_instance
|
|
138
104
|
|
|
139
|
-
|
|
105
|
+
|
|
106
|
+
def _ephemeral_store() -> bool:
|
|
107
|
+
"""SQLite inside a Cloud Run container is discarded with the container."""
|
|
108
|
+
return bool(os.environ.get("K_SERVICE")) and _store().kind == "sqlite"
|
|
140
109
|
|
|
141
110
|
|
|
142
111
|
def get_db() -> sqlite3.Connection:
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
_db_conn = _db()
|
|
146
|
-
return _db_conn
|
|
112
|
+
"""The SQLite connection, when that is the store (tests and local use)."""
|
|
113
|
+
return _store().db
|
|
147
114
|
|
|
148
115
|
|
|
149
116
|
def _lookup_client(feishu_user_id: str) -> Optional[str]:
|
|
150
|
-
|
|
151
|
-
"SELECT client_id FROM bindings WHERE feishu_user_id = ?",
|
|
152
|
-
(feishu_user_id,),
|
|
153
|
-
).fetchone()
|
|
154
|
-
return row["client_id"] if row else None
|
|
117
|
+
return _store().client_for_user(feishu_user_id)
|
|
155
118
|
|
|
156
119
|
|
|
157
120
|
def _bind(feishu_user_id: str, client_id: str) -> None:
|
|
158
|
-
|
|
159
|
-
"INSERT OR REPLACE INTO bindings VALUES (?, ?, ?)",
|
|
160
|
-
(feishu_user_id, client_id, time.time()),
|
|
161
|
-
)
|
|
162
|
-
get_db().execute(
|
|
163
|
-
"DELETE FROM pending_binds WHERE client_id = ?", (client_id,)
|
|
164
|
-
)
|
|
165
|
-
get_db().commit()
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
def _register_pending(client_id: str) -> None:
|
|
169
|
-
get_db().execute(
|
|
170
|
-
"INSERT OR REPLACE INTO pending_binds VALUES (?, ?)",
|
|
171
|
-
(client_id, time.time()),
|
|
172
|
-
)
|
|
173
|
-
get_db().commit()
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
def _is_valid_client_id(client_id: str) -> bool:
|
|
177
|
-
row = get_db().execute(
|
|
178
|
-
"SELECT client_id FROM pending_binds WHERE client_id = ?", (client_id,)
|
|
179
|
-
).fetchone()
|
|
180
|
-
return row is not None
|
|
121
|
+
_store().bind_user(feishu_user_id, client_id)
|
|
181
122
|
|
|
182
123
|
|
|
183
124
|
def _digest(value: str) -> str:
|
|
@@ -194,19 +135,18 @@ def _admit_client(client_id: str, token: str, bind_code: str) -> str:
|
|
|
194
135
|
return "this Aria version is too old for the relay; upgrade aria-code"
|
|
195
136
|
if len(_normalise_bind_code(bind_code or "")) < 10:
|
|
196
137
|
return "bind code missing; upgrade aria-code"
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
if not hmac.compare_digest(
|
|
138
|
+
store = _store()
|
|
139
|
+
code_hash = _digest(_normalise_bind_code(bind_code))
|
|
140
|
+
known = store.credentials(client_id)
|
|
141
|
+
if known is None:
|
|
142
|
+
if store.claim_credentials(client_id, _digest(token), code_hash):
|
|
143
|
+
return ""
|
|
144
|
+
known = store.credentials(client_id) # lost a race for the same id
|
|
145
|
+
if not known or not hmac.compare_digest(known["token_hash"], _digest(token)):
|
|
205
146
|
return "client_id is registered to another installation"
|
|
206
147
|
# The machine may rotate its bind code; the token proves it is the same one.
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
get_db().commit()
|
|
148
|
+
if known["bind_code_hash"] != code_hash:
|
|
149
|
+
store.set_bind_code(client_id, code_hash)
|
|
210
150
|
return ""
|
|
211
151
|
|
|
212
152
|
|
|
@@ -214,9 +154,7 @@ def _client_for_bind_code(code: str) -> Optional[str]:
|
|
|
214
154
|
normalised = _normalise_bind_code(code)
|
|
215
155
|
if len(normalised) < 10:
|
|
216
156
|
return None
|
|
217
|
-
|
|
218
|
-
(_digest(normalised),)).fetchone()
|
|
219
|
-
return row["client_id"] if row else None
|
|
157
|
+
return _store().client_for_bind_code(_digest(normalised))
|
|
220
158
|
|
|
221
159
|
|
|
222
160
|
# ── WebSocket connection registry ─────────────────────────────────────────────
|
|
@@ -253,9 +191,7 @@ def _remember_forward(client_id: str, message_id: str, chat_id: str) -> None:
|
|
|
253
191
|
if message_id:
|
|
254
192
|
_forwarded[message_id] = (client_id, now + _FORWARD_TTL)
|
|
255
193
|
if chat_id:
|
|
256
|
-
|
|
257
|
-
"INSERT OR REPLACE INTO client_chats VALUES (?, ?, ?)", (client_id, chat_id, now))
|
|
258
|
-
get_db().commit()
|
|
194
|
+
_store().remember_chat(client_id, chat_id)
|
|
259
195
|
|
|
260
196
|
|
|
261
197
|
def _may_send(client_id: str, request: dict) -> str:
|
|
@@ -272,10 +208,7 @@ def _may_send(client_id: str, request: dict) -> str:
|
|
|
272
208
|
elif op == "send":
|
|
273
209
|
if request.get("receive_id_type", "chat_id") != "chat_id":
|
|
274
210
|
return "send is only to chats"
|
|
275
|
-
|
|
276
|
-
"SELECT 1 FROM client_chats WHERE client_id = ? AND chat_id = ?", (client_id, target)
|
|
277
|
-
).fetchone()
|
|
278
|
-
if not row:
|
|
211
|
+
if not _store().has_chat(client_id, target):
|
|
279
212
|
return "this client has no conversation in that chat"
|
|
280
213
|
else:
|
|
281
214
|
return "op must be reply or send"
|
|
@@ -309,17 +242,13 @@ async def _send_for_client(client_id: str, request: dict) -> dict:
|
|
|
309
242
|
return {"code": -1, "msg": "relay could not reach Feishu"}
|
|
310
243
|
sent_id = ((result.get("data") or {}).get("message_id") or "")
|
|
311
244
|
if result.get("code") == 0 and request["msg_type"] == "interactive" and sent_id:
|
|
312
|
-
|
|
313
|
-
(sent_id, client_id, time.time()))
|
|
314
|
-
get_db().commit()
|
|
245
|
+
_store().remember_card(sent_id, client_id)
|
|
315
246
|
return {"code": result.get("code"), "msg": result.get("msg", ""),
|
|
316
247
|
"data": {"message_id": sent_id} if sent_id else {}}
|
|
317
248
|
|
|
318
249
|
|
|
319
250
|
def _card_origin(message_id: str) -> Optional[str]:
|
|
320
|
-
|
|
321
|
-
(message_id,)).fetchone()
|
|
322
|
-
return row["client_id"] if row else None
|
|
251
|
+
return _store().card_origin(message_id) if message_id else None
|
|
323
252
|
|
|
324
253
|
|
|
325
254
|
# ── Feishu API helpers ────────────────────────────────────────────────────────
|
|
@@ -430,7 +359,10 @@ async def lifespan(app: FastAPI):
|
|
|
430
359
|
datefmt="%H:%M:%S",
|
|
431
360
|
)
|
|
432
361
|
logger.info("Aria Relay Server started db=%s", _DB_PATH)
|
|
433
|
-
|
|
362
|
+
logger.info("Relay state store: %s", _store().kind)
|
|
363
|
+
if _ephemeral_store():
|
|
364
|
+
logger.warning("Running on Cloud Run with SQLite: bindings and machine credentials are "
|
|
365
|
+
"lost on every deploy. Set RELAY_STORE=firestore.")
|
|
434
366
|
yield
|
|
435
367
|
logger.info("Relay Server shutting down")
|
|
436
368
|
|
|
@@ -472,8 +404,6 @@ async def ws_endpoint(websocket: WebSocket):
|
|
|
472
404
|
|
|
473
405
|
# Register in-memory + mark as pending bind (if first time)
|
|
474
406
|
_connections[client_id] = websocket
|
|
475
|
-
if _lookup_client.__module__: # always true; used as noop to be explicit
|
|
476
|
-
_register_pending(client_id)
|
|
477
407
|
|
|
478
408
|
await websocket.send_text(json.dumps({"ok": True, "client_id": client_id}))
|
|
479
409
|
logger.info("Client connected: %s", client_id)
|
|
@@ -675,7 +605,10 @@ async def status(request: Request):
|
|
|
675
605
|
"""
|
|
676
606
|
body = {
|
|
677
607
|
"connected_clients": len(_connections),
|
|
678
|
-
"total_bindings":
|
|
608
|
+
"total_bindings": _store().binding_count(),
|
|
609
|
+
"store": _store().kind,
|
|
610
|
+
**({"store_warning": "sqlite on Cloud Run — bindings are lost on every deploy; "
|
|
611
|
+
"set RELAY_STORE=firestore"} if _ephemeral_store() else {}),
|
|
679
612
|
"feishu_app_configured": bool(_FEISHU_APP_ID),
|
|
680
613
|
"event_verification": (
|
|
681
614
|
"encrypt_key" if _FEISHU_ENCRYPT_KEY
|
|
@@ -10,7 +10,7 @@ aria_relay_client.py — 连接 Aria 中继服务器的 WebSocket 客户端
|
|
|
10
10
|
python3 aria_relay_client.py --once # 调试:收到第一条消息后退出
|
|
11
11
|
|
|
12
12
|
所需环境变量(读取 ~/.aria/.env):
|
|
13
|
-
ARIA_RELAY_URL
|
|
13
|
+
ARIA_RELAY_URL 中继地址,配置向导默认填 Arthera 运营的中继(见 OFFICIAL_RELAY_URL)
|
|
14
14
|
ARIA_RELAY_CLIENT_ID setup_wizard 生成的 12 位 hex id
|
|
15
15
|
"""
|
|
16
16
|
|
|
@@ -92,7 +92,44 @@ def ensure_credentials(env_file: Path = Path.home() / ".aria" / ".env") -> tuple
|
|
|
92
92
|
return token, code
|
|
93
93
|
|
|
94
94
|
|
|
95
|
-
|
|
95
|
+
# The relay Arthera runs. Offered as the setup wizard's default, never used as
|
|
96
|
+
# a silent fallback.
|
|
97
|
+
OFFICIAL_RELAY_URL = "wss://aria-code-741336310848.europe-west2.run.app/ws"
|
|
98
|
+
|
|
99
|
+
# The default used to be wss://relay.aria.ai. aria.ai belongs to an unrelated
|
|
100
|
+
# party (registered 2017); the subdomain does not resolve today, but its owner
|
|
101
|
+
# could create it at any time, and every client left on the default would then
|
|
102
|
+
# send its machine token, bind code and Feishu traffic there. Anyone who ran
|
|
103
|
+
# the wizard before 2026-10-04 has it saved in ~/.aria/.env, so it is refused
|
|
104
|
+
# by name, not merely no longer suggested.
|
|
105
|
+
_UNOWNED_RELAY_HOSTS = {"relay.aria.ai"}
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def relay_url_problem(url: str) -> str:
|
|
109
|
+
""""" when the client may connect to `url`, otherwise why not."""
|
|
110
|
+
from urllib.parse import urlparse
|
|
111
|
+
|
|
112
|
+
if not url:
|
|
113
|
+
return "ARIA_RELAY_URL is not set — run the setup wizard (relay mode) to configure it"
|
|
114
|
+
parsed = urlparse(url)
|
|
115
|
+
host = (parsed.hostname or "").lower()
|
|
116
|
+
if host in _UNOWNED_RELAY_HOSTS or host.endswith(".aria.ai") or host == "aria.ai":
|
|
117
|
+
return (f"{host} is not run by Arthera; run the setup wizard again to switch to "
|
|
118
|
+
f"{OFFICIAL_RELAY_URL}")
|
|
119
|
+
if parsed.scheme == "wss" and host:
|
|
120
|
+
return ""
|
|
121
|
+
if parsed.scheme == "ws" and host in ("localhost", "127.0.0.1", "::1"):
|
|
122
|
+
return ""
|
|
123
|
+
return "ARIA_RELAY_URL must be wss:// — this machine's token is sent when it connects (ws:// only to localhost)"
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def default_relay_url(current: str) -> str:
|
|
127
|
+
"""What the setup wizard offers: the saved URL, unless it is unusable."""
|
|
128
|
+
current = (current or "").strip()
|
|
129
|
+
return current if current and not relay_url_problem(current) else OFFICIAL_RELAY_URL
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
_RELAY_URL = os.environ.get("ARIA_RELAY_URL", "").strip()
|
|
96
133
|
_CLIENT_ID = os.environ.get("ARIA_RELAY_CLIENT_ID", "")
|
|
97
134
|
_RECONNECT_DELAY_MAX = 60 # seconds
|
|
98
135
|
_RECONNECT_DELAY_BASE = 3
|
|
@@ -191,6 +228,11 @@ async def _connect_and_serve(once: bool = False) -> None:
|
|
|
191
228
|
logger.error("websockets package not installed — run: pip install websockets")
|
|
192
229
|
sys.exit(1)
|
|
193
230
|
|
|
231
|
+
problem = relay_url_problem(_RELAY_URL)
|
|
232
|
+
if problem:
|
|
233
|
+
logger.error("Not connecting to the relay: %s", problem)
|
|
234
|
+
sys.exit(1)
|
|
235
|
+
|
|
194
236
|
if not _CLIENT_ID:
|
|
195
237
|
logger.error(
|
|
196
238
|
"ARIA_RELAY_CLIENT_ID is not set. "
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"""Where the relay keeps what it must not forget.
|
|
2
|
+
|
|
3
|
+
Bindings (which Feishu user reaches which machine), each machine's
|
|
4
|
+
credentials, the chats a client may post to, and which client posted which
|
|
5
|
+
card. All of it used to live in a SQLite file inside the container — and a
|
|
6
|
+
Cloud Run container's filesystem is discarded on every deploy and restart, so
|
|
7
|
+
every merge to main unbound every user and reset every machine's credentials
|
|
8
|
+
to "first use". `RELAY_STORE=firestore` keeps it in Firestore instead.
|
|
9
|
+
|
|
10
|
+
SQLite stays the default: right for local development and for a self-hosted
|
|
11
|
+
relay with a persistent disk.
|
|
12
|
+
|
|
13
|
+
Both stores implement the same small contract, and tests/test_relay_store.py
|
|
14
|
+
runs one set of tests against both. The one operation that must be atomic is
|
|
15
|
+
claim_credentials: the first registration of a client_id wins, and two
|
|
16
|
+
connections racing for the same id cannot both. SQLite gets that from the
|
|
17
|
+
primary key, Firestore from create(), which fails if the document exists.
|
|
18
|
+
|
|
19
|
+
Firestore layout — every read is by document id, never a query:
|
|
20
|
+
relay_bindings/{feishu_user_id} {client_id, bound_at}
|
|
21
|
+
relay_clients/{client_id} {token_hash, bind_code_hash, created_at}
|
|
22
|
+
relay_bind_codes/{bind_code_hash} {client_id}
|
|
23
|
+
relay_client_chats/{sha256(client:chat)} {client_id, chat_id, last_seen}
|
|
24
|
+
relay_card_origins/{message_id} {client_id, created_at}
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
from __future__ import annotations
|
|
28
|
+
|
|
29
|
+
import hashlib
|
|
30
|
+
import os
|
|
31
|
+
import sqlite3
|
|
32
|
+
import time
|
|
33
|
+
from typing import Optional
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class SqliteStore:
|
|
37
|
+
kind = "sqlite"
|
|
38
|
+
|
|
39
|
+
def __init__(self, path: str) -> None:
|
|
40
|
+
self.db = sqlite3.connect(path, check_same_thread=False)
|
|
41
|
+
self.db.row_factory = sqlite3.Row
|
|
42
|
+
self.db.executescript("""
|
|
43
|
+
CREATE TABLE IF NOT EXISTS bindings (
|
|
44
|
+
feishu_user_id TEXT PRIMARY KEY, client_id TEXT NOT NULL, bound_at REAL NOT NULL);
|
|
45
|
+
CREATE TABLE IF NOT EXISTS client_credentials (
|
|
46
|
+
client_id TEXT PRIMARY KEY, token_hash TEXT NOT NULL,
|
|
47
|
+
bind_code_hash TEXT NOT NULL, created_at REAL NOT NULL);
|
|
48
|
+
CREATE TABLE IF NOT EXISTS client_chats (
|
|
49
|
+
client_id TEXT NOT NULL, chat_id TEXT NOT NULL, last_seen REAL NOT NULL,
|
|
50
|
+
PRIMARY KEY (client_id, chat_id));
|
|
51
|
+
CREATE TABLE IF NOT EXISTS card_origins (
|
|
52
|
+
message_id TEXT PRIMARY KEY, client_id TEXT NOT NULL, created_at REAL NOT NULL);
|
|
53
|
+
""")
|
|
54
|
+
self.db.commit()
|
|
55
|
+
|
|
56
|
+
def client_for_user(self, feishu_user_id: str) -> Optional[str]:
|
|
57
|
+
row = self.db.execute("SELECT client_id FROM bindings WHERE feishu_user_id = ?",
|
|
58
|
+
(feishu_user_id,)).fetchone()
|
|
59
|
+
return row["client_id"] if row else None
|
|
60
|
+
|
|
61
|
+
def bind_user(self, feishu_user_id: str, client_id: str) -> None:
|
|
62
|
+
self.db.execute("INSERT OR REPLACE INTO bindings VALUES (?, ?, ?)",
|
|
63
|
+
(feishu_user_id, client_id, time.time()))
|
|
64
|
+
self.db.commit()
|
|
65
|
+
|
|
66
|
+
def binding_count(self) -> int:
|
|
67
|
+
return self.db.execute("SELECT COUNT(*) FROM bindings").fetchone()[0]
|
|
68
|
+
|
|
69
|
+
def credentials(self, client_id: str) -> Optional[dict]:
|
|
70
|
+
row = self.db.execute("SELECT token_hash, bind_code_hash FROM client_credentials "
|
|
71
|
+
"WHERE client_id = ?", (client_id,)).fetchone()
|
|
72
|
+
return dict(row) if row else None
|
|
73
|
+
|
|
74
|
+
def claim_credentials(self, client_id: str, token_hash: str, bind_code_hash: str) -> bool:
|
|
75
|
+
try:
|
|
76
|
+
self.db.execute("INSERT INTO client_credentials VALUES (?, ?, ?, ?)",
|
|
77
|
+
(client_id, token_hash, bind_code_hash, time.time()))
|
|
78
|
+
self.db.commit()
|
|
79
|
+
return True
|
|
80
|
+
except sqlite3.IntegrityError:
|
|
81
|
+
return False
|
|
82
|
+
|
|
83
|
+
def set_bind_code(self, client_id: str, bind_code_hash: str) -> None:
|
|
84
|
+
self.db.execute("UPDATE client_credentials SET bind_code_hash = ? WHERE client_id = ?",
|
|
85
|
+
(bind_code_hash, client_id))
|
|
86
|
+
self.db.commit()
|
|
87
|
+
|
|
88
|
+
def client_for_bind_code(self, bind_code_hash: str) -> Optional[str]:
|
|
89
|
+
row = self.db.execute("SELECT client_id FROM client_credentials WHERE bind_code_hash = ?",
|
|
90
|
+
(bind_code_hash,)).fetchone()
|
|
91
|
+
return row["client_id"] if row else None
|
|
92
|
+
|
|
93
|
+
def remember_chat(self, client_id: str, chat_id: str) -> None:
|
|
94
|
+
self.db.execute("INSERT OR REPLACE INTO client_chats VALUES (?, ?, ?)",
|
|
95
|
+
(client_id, chat_id, time.time()))
|
|
96
|
+
self.db.commit()
|
|
97
|
+
|
|
98
|
+
def has_chat(self, client_id: str, chat_id: str) -> bool:
|
|
99
|
+
return self.db.execute("SELECT 1 FROM client_chats WHERE client_id = ? AND chat_id = ?",
|
|
100
|
+
(client_id, chat_id)).fetchone() is not None
|
|
101
|
+
|
|
102
|
+
def remember_card(self, message_id: str, client_id: str) -> None:
|
|
103
|
+
self.db.execute("INSERT OR REPLACE INTO card_origins VALUES (?, ?, ?)",
|
|
104
|
+
(message_id, client_id, time.time()))
|
|
105
|
+
self.db.commit()
|
|
106
|
+
|
|
107
|
+
def card_origin(self, message_id: str) -> Optional[str]:
|
|
108
|
+
row = self.db.execute("SELECT client_id FROM card_origins WHERE message_id = ?",
|
|
109
|
+
(message_id,)).fetchone()
|
|
110
|
+
return row["client_id"] if row else None
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
class FirestoreStore:
|
|
114
|
+
kind = "firestore"
|
|
115
|
+
|
|
116
|
+
def __init__(self, client, already_exists: type = Exception) -> None:
|
|
117
|
+
self.client = client
|
|
118
|
+
self._already_exists = already_exists
|
|
119
|
+
|
|
120
|
+
def _doc(self, collection: str, doc_id: str):
|
|
121
|
+
return self.client.collection(collection).document(doc_id)
|
|
122
|
+
|
|
123
|
+
def _get(self, collection: str, doc_id: str) -> Optional[dict]:
|
|
124
|
+
if not doc_id:
|
|
125
|
+
return None
|
|
126
|
+
snapshot = self._doc(collection, doc_id).get()
|
|
127
|
+
return snapshot.to_dict() if snapshot.exists else None
|
|
128
|
+
|
|
129
|
+
@staticmethod
|
|
130
|
+
def _chat_key(client_id: str, chat_id: str) -> str:
|
|
131
|
+
return hashlib.sha256(f"{client_id}\0{chat_id}".encode("utf-8")).hexdigest()
|
|
132
|
+
|
|
133
|
+
def client_for_user(self, feishu_user_id: str) -> Optional[str]:
|
|
134
|
+
return (self._get("relay_bindings", feishu_user_id) or {}).get("client_id")
|
|
135
|
+
|
|
136
|
+
def bind_user(self, feishu_user_id: str, client_id: str) -> None:
|
|
137
|
+
self._doc("relay_bindings", feishu_user_id).set({"client_id": client_id, "bound_at": time.time()})
|
|
138
|
+
|
|
139
|
+
def binding_count(self) -> int:
|
|
140
|
+
# Fine at a relay's scale; an aggregation query would need an index.
|
|
141
|
+
return sum(1 for _ in self.client.collection("relay_bindings").list_documents())
|
|
142
|
+
|
|
143
|
+
def credentials(self, client_id: str) -> Optional[dict]:
|
|
144
|
+
data = self._get("relay_clients", client_id)
|
|
145
|
+
return {"token_hash": data["token_hash"], "bind_code_hash": data["bind_code_hash"]} if data else None
|
|
146
|
+
|
|
147
|
+
def claim_credentials(self, client_id: str, token_hash: str, bind_code_hash: str) -> bool:
|
|
148
|
+
try:
|
|
149
|
+
self._doc("relay_clients", client_id).create(
|
|
150
|
+
{"token_hash": token_hash, "bind_code_hash": bind_code_hash, "created_at": time.time()})
|
|
151
|
+
except self._already_exists:
|
|
152
|
+
return False
|
|
153
|
+
self._doc("relay_bind_codes", bind_code_hash).set({"client_id": client_id})
|
|
154
|
+
return True
|
|
155
|
+
|
|
156
|
+
def set_bind_code(self, client_id: str, bind_code_hash: str) -> None:
|
|
157
|
+
old = (self._get("relay_clients", client_id) or {}).get("bind_code_hash")
|
|
158
|
+
if old and old != bind_code_hash:
|
|
159
|
+
self._doc("relay_bind_codes", old).delete()
|
|
160
|
+
self._doc("relay_bind_codes", bind_code_hash).set({"client_id": client_id})
|
|
161
|
+
self._doc("relay_clients", client_id).set({"bind_code_hash": bind_code_hash}, merge=True)
|
|
162
|
+
|
|
163
|
+
def client_for_bind_code(self, bind_code_hash: str) -> Optional[str]:
|
|
164
|
+
return (self._get("relay_bind_codes", bind_code_hash) or {}).get("client_id")
|
|
165
|
+
|
|
166
|
+
def remember_chat(self, client_id: str, chat_id: str) -> None:
|
|
167
|
+
self._doc("relay_client_chats", self._chat_key(client_id, chat_id)).set(
|
|
168
|
+
{"client_id": client_id, "chat_id": chat_id, "last_seen": time.time()})
|
|
169
|
+
|
|
170
|
+
def has_chat(self, client_id: str, chat_id: str) -> bool:
|
|
171
|
+
return self._get("relay_client_chats", self._chat_key(client_id, chat_id)) is not None
|
|
172
|
+
|
|
173
|
+
def remember_card(self, message_id: str, client_id: str) -> None:
|
|
174
|
+
self._doc("relay_card_origins", message_id).set({"client_id": client_id, "created_at": time.time()})
|
|
175
|
+
|
|
176
|
+
def card_origin(self, message_id: str) -> Optional[str]:
|
|
177
|
+
return (self._get("relay_card_origins", message_id) or {}).get("client_id")
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def open_store():
|
|
181
|
+
"""The store RELAY_STORE names: "sqlite" (default, DB_PATH) or "firestore"."""
|
|
182
|
+
kind = os.environ.get("RELAY_STORE", "sqlite").strip().lower()
|
|
183
|
+
if kind == "firestore":
|
|
184
|
+
from google.api_core.exceptions import AlreadyExists
|
|
185
|
+
from google.cloud import firestore
|
|
186
|
+
|
|
187
|
+
client = firestore.Client(
|
|
188
|
+
project=os.environ.get("RELAY_FIRESTORE_PROJECT") or None,
|
|
189
|
+
database=os.environ.get("RELAY_FIRESTORE_DATABASE") or "(default)",
|
|
190
|
+
)
|
|
191
|
+
return FirestoreStore(client, already_exists=AlreadyExists)
|
|
192
|
+
if kind != "sqlite":
|
|
193
|
+
raise ValueError(f"RELAY_STORE must be sqlite or firestore, not {kind!r}")
|
|
194
|
+
return SqliteStore(os.environ.get("DB_PATH", "./relay.db"))
|
|
@@ -371,8 +371,11 @@ def setup_feishu(env: dict[str, str]) -> None:
|
|
|
371
371
|
|
|
372
372
|
def _setup_feishu_relay(env: dict[str, str]) -> None:
|
|
373
373
|
"""Connect via Aria Relay Server — no Feishu developer account needed."""
|
|
374
|
-
|
|
375
|
-
relay_url = _ask("中继服务器地址", default=
|
|
374
|
+
from aria_code.clients.aria_relay_client import default_relay_url, relay_url_problem
|
|
375
|
+
relay_url = _ask("中继服务器地址", default=default_relay_url(env.get("ARIA_RELAY_URL", "")))
|
|
376
|
+
while relay_url_problem(relay_url):
|
|
377
|
+
print(f" ✗ {relay_url_problem(relay_url)}")
|
|
378
|
+
relay_url = _ask("中继服务器地址", default=default_relay_url(""))
|
|
376
379
|
env["ARIA_RELAY_URL"] = relay_url
|
|
377
380
|
env["ARIA_RELAY_MODE"] = "relay"
|
|
378
381
|
|
|
@@ -375,37 +375,6 @@ def render_startup_dashboard(
|
|
|
375
375
|
console.print(Panel(body, title=panel_title, title_align="left", box=panel_box, border_style=border_style, padding=(0, 1)))
|
|
376
376
|
|
|
377
377
|
|
|
378
|
-
def render_session_banner(
|
|
379
|
-
session_id: str,
|
|
380
|
-
*,
|
|
381
|
-
console,
|
|
382
|
-
has_rich: bool,
|
|
383
|
-
lang: str = "en",
|
|
384
|
-
web_url: str = "https://arthera.finance",
|
|
385
|
-
) -> None:
|
|
386
|
-
"""Render the 'Keep working from anywhere' card with session sync link."""
|
|
387
|
-
is_zh = lang.lower().startswith("zh")
|
|
388
|
-
title = "随时随地继续工作" if is_zh else "Keep working from anywhere"
|
|
389
|
-
line1 = (
|
|
390
|
-
f"在网页端、移动 App 或飞书中查看或回复此会话:"
|
|
391
|
-
if is_zh else
|
|
392
|
-
f"Check progress or reply to any session from mobile app, desktop app, or"
|
|
393
|
-
)
|
|
394
|
-
line2 = f"{web_url}/sessions/{session_id}"
|
|
395
|
-
line3 = "仅在本终端保留请运行 /remote-control" if is_zh else "To keep session in this terminal only, run /remote-control"
|
|
396
|
-
|
|
397
|
-
if has_rich:
|
|
398
|
-
console.print(f"[dim]│[/dim] [bold]{title}[/bold]")
|
|
399
|
-
console.print(f"[dim]│[/dim] [dim]{line1}[/dim]")
|
|
400
|
-
console.print(f"[dim]│[/dim] [underline]{line2}[/underline]. [dim]{line3}[/dim]")
|
|
401
|
-
console.print()
|
|
402
|
-
else:
|
|
403
|
-
print(f"| {title}")
|
|
404
|
-
print(f"| {line1}")
|
|
405
|
-
print(f"| {line2}. {line3}")
|
|
406
|
-
print()
|
|
407
|
-
|
|
408
|
-
|
|
409
378
|
def render_compact_banner(
|
|
410
379
|
*,
|
|
411
380
|
version: str,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aria-code
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.73.0
|
|
4
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
|
|
@@ -56,6 +56,7 @@ src/aria_code/project_review_api.py
|
|
|
56
56
|
src/aria_code/project_review_server.py
|
|
57
57
|
src/aria_code/project_tools.py
|
|
58
58
|
src/aria_code/realty_data_tools.py
|
|
59
|
+
src/aria_code/relay_store.py
|
|
59
60
|
src/aria_code/report_exporters.py
|
|
60
61
|
src/aria_code/report_generator.py
|
|
61
62
|
src/aria_code/runway_video_client.py
|
|
@@ -572,6 +573,7 @@ tests/test_google_cloud_routing.py
|
|
|
572
573
|
tests/test_google_login.py
|
|
573
574
|
tests/test_google_search_provider.py
|
|
574
575
|
tests/test_headless_is_agentic.py
|
|
576
|
+
tests/test_honest_surfaces.py
|
|
575
577
|
tests/test_image_gen_tools.py
|
|
576
578
|
tests/test_image_inputs.py
|
|
577
579
|
tests/test_import_graph_budget.py
|
|
@@ -638,6 +640,8 @@ tests/test_rebind_namespace_contract.py
|
|
|
638
640
|
tests/test_relay_client_credentials.py
|
|
639
641
|
tests/test_relay_event_verification.py
|
|
640
642
|
tests/test_relay_sends_for_clients.py
|
|
643
|
+
tests/test_relay_store.py
|
|
644
|
+
tests/test_relay_url.py
|
|
641
645
|
tests/test_release_chain.py
|
|
642
646
|
tests/test_release_commit_identity.py
|
|
643
647
|
tests/test_release_push_is_atomic.py
|