aria-code 0.70.0__tar.gz → 0.72.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.70.0 → aria_code-0.72.0}/PKG-INFO +12 -6
- {aria_code-0.70.0 → aria_code-0.72.0}/README.md +10 -4
- {aria_code-0.70.0 → aria_code-0.72.0}/pyproject.toml +2 -2
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/_version.py +1 -1
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/aria_cli.py +1 -1
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/aria_relay_server.py +52 -119
- aria_code-0.72.0/src/aria_code/relay_store.py +194 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code.egg-info/PKG-INFO +12 -6
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code.egg-info/SOURCES.txt +2 -0
- aria_code-0.72.0/tests/test_relay_store.py +177 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/LICENSE +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/NOTICE +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/setup.cfg +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/adk_apps/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/base.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/code_review.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/deep/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/deep/critic.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/deep/deepen.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/deep/models.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/deep/pipeline.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/deep/themes.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/deep/tiers.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/engineering/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/engineering/coder.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/engineering/tester.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/catalyst.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/debate.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/earnings.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/fundamental.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/macro.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/news.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/risk.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/sector.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/strategist.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/synthesis.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/financial/technical.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/orchestrator.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/portfolio_agent.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/realty/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/realty/business_match.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/registry.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/signal_scheme.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/sports/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/sports/football_agent.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/supervisor.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/team.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/aliyun_data_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/README.md +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/channels/README.md +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/channels/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/channels/approvals.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/channels/conversation.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/channels/digest.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/channels/intake.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/channels/registry.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/channels/tradingview.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/README.md +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/_optional.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/broker_render.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/core_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/data_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/market.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/report.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/team.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/config_paths.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/config_store.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/constants.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/context.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/deterministic.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/direct.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/football_reports.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/google_login.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/handlers/market_handlers.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/helpers.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/hooks.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/i18n.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/intent.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/intent_router.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/main.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/market_universe.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/message_processing.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/preflight.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/project_aria.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/prompts/system_prompts.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/providers/base.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/sandbox.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/session_export.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/session_store.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/tools/context.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/update_check.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/daemon/README.md +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/vscode/README.md +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/apps/vscode/package.json +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/aria_daemon.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/aria_feishu_bot.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/aria_mcp_server.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/aria_relay_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/aria_telegram_bot.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ariarc.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/artifacts.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/backtest_engine.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/backtest_report.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/automation.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/base.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/capabilities.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/cn/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/config.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/intl/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/paper_broker.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/planning.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/registry.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/brokers/trading.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/canva_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/change_store.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/clients/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/clients/aria_relay_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/clients/canva_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/clients/figma_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/clients/football_data_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/clients/kling_video_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/clients/market_data_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/clients/openai_image_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/clients/runway_video_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/cloud_memory.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/command_safety.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/computer_use_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/dashboard_generator.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/data_analysis_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/data_cleaner.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/data_service.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/base.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/router.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/sources/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/demo_player.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/doctor.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/domain/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/domain/backtest_engine.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/domain/backtest_report.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/domain/finance_formulas.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/domain/strategy_vault.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/evals/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/evals/harness.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/evals/runner.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/external_agent_runner.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/figma_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/file_analysis_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/finance_formulas.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/football_data_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/image_gen_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/intent_classifier.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/kling_video_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/licensing.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/local_finance_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/local_image_provider.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/local_llm_provider.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/macro_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/markdown_pdf.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/market_data_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/mcp_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/memory_manager.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/model_capability.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/notification_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/openai_image_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_core/export.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_core/paths.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_infra/product.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/cache.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/context.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/data.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/references.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/registry.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/settings.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_services/usage.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packs/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packs/base.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packs/finance/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packs/logistics/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packs/payments/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packs/realty/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packs/registry.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/packs/rules.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/plan_utils.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/plugin_loader.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/portfolio_ledger.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/preview_server.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/privacy/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/privacy/feedback.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/project_review.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/project_review_api.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/project_review_server.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/project_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/providers/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/providers/llm/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/providers/llm/anthropic.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/providers/llm/base.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/providers/llm/custom.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/providers/llm/ollama.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/providers/llm/registry.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/providers/local_image_provider.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/providers/local_llm_provider.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/realty_data_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/report_exporters.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/report_generator.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/acceptance.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/agent_loop.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/approval.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/budget.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/checkpoints.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/crash_report.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/events.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/gateway.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/lsp.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/orchestrator.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/repo_map.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/run_state.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/run_store.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/self_healing.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/subagent.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/task_ledger.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/tool_executor.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/tool_policy.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runtime/worktrees.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/runway_video_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/safety/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/safety/permissions.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/safety/service.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/setup_wizard.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/spreadsheet_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/strategy_vault.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/artifact_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/broker_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/build_quant_engine.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/code_audit_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/computer_use_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/extended_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/image_gen_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/local_finance_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/logistics_carriers.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/logistics_inventory.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/logistics_io.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/logistics_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/macro_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/notification_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/project_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/realty_data_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/tools/stripe_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/banner.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/completer.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/console.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/image_render.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/input_box.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/picker.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/render/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/render/finance.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/render/market.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/render/output.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/render/responsive.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/render/team.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/robot.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/ui/startup_dashboard.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/utils/vscode_uri.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/video_analysis.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/video_editor.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/workspace/__init__.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/workspace/files.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/workspace/verify.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/workspace_changes.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/workspace_context.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/workspace_service.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code/workspace_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code.egg-info/entry_points.txt +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code.egg-info/requires.txt +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/src/aria_code.egg-info/top_level.txt +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_adk_market_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_agent_team_fallback.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_analyze_file_tool.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_architecture_ledger_is_true.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_architecture_report.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_aria_cli_core.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_aria_mcp_server.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_aria_sdk.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_artifact_publishing.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_artifacts_and_reports.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_ashare_prediction_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_backtest_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_backtest_engine.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_backtest_report.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_broken_akshare_is_optional.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_broker_automation.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_broker_chat_confirm_gate.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_broker_planning.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_broker_safety.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_broker_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_budget.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_business_workflow_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_canva_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_canvas_cmds.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_card_approvals.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_channel_intake.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_channels.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_chart_handlers.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_chat_bots_fail_closed.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_chat_routing.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_ci_security_workflow.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_cli_app_split.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_cli_bootstrap.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_cli_config_store.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_cli_lifecycle_hooks.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_cli_runtime_consumer.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_cli_tool_executor_module.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_cloud_memory.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_code_audit_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_code_review_agent.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_codegen_output.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_coder_tester_self_healing.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_coder_tool_safety.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_collaboration.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_command_loggers.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_command_safety.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_completions_builder.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_config_paths.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_configured_provider.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_container_entrypoint.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_container_entrypoints.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_context_checkpoints.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_context_references.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_context_service.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_conversation_core.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_crash_report.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_credential_file_permissions.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_custom_providers.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_daemon_gateway_config.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_dashboard_generator.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_data_service.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_data_service_imports.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_datasource_routing.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_deep_analysis.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_degrades_without_quant_engine.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_doctor.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_doctor_describes_the_current_install.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_doctor_npm_scope.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_engine_boundary.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_enterprise_tool_honesty.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_env_switch_docs.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_evals_harness.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_extended_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_feishu_swarm_config.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_finalize_release.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_finance_renderers.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_finance_service_catalog.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_first_run_works.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_football_agent.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_football_prediction_output.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_google_cloud_routing.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_google_login.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_google_search_provider.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_headless_is_agentic.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_image_gen_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_image_inputs.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_import_graph_budget.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_intent_router.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_intent_signals.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_kling_video_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_lazy_rebind.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_legacy_module_imports.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_license_consistency.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_licensing.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_local_image_provider.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_logistics_3pl.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_logistics_and_finance_agents.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_lsp.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_markdown_pdf.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_market_data_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_market_history_inheritance.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_market_history_tool.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_market_symbol_extraction.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_market_universe.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_mcp_circuit.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_mcp_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_model_capability_registry.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_model_choice_is_the_users.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_model_selection_state.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_native_binary_entrypoints.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_native_installer.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_new_modules.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_no_uncommitted_imports.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_ollama_stream_imports.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_ollama_stream_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_openai_image_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_operations_suite.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_output_rendering.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_packages_facade.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_packaging_constraints.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_packaging_manifest.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_packs_domains.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_pdf_report.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_pick_best_installed_model.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_plan_mode.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_platform_package_assembly.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_platform_packages.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_plotly_html_output.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_portfolio_ledger.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_post_turn_context_decision.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_preflight.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_preview_server.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_privacy_feedback.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_project_aria.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_project_review.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_project_review_api.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_prompt_assembly.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_prompt_selection.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_provider_autoconfig.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_provider_error_messages.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_provider_integration.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_provider_registry.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_public_service_status.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_quant_engine_namespace.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_rebind_contract.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_rebind_namespace_contract.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_relay_client_credentials.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_relay_event_verification.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_relay_sends_for_clients.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_release_chain.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_release_commit_identity.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_release_push_is_atomic.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_release_reaches_the_registries.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_release_verification_waits.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_release_workflow_permissions.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_report_charts.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_report_generator.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_research_protocol.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_research_quality.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_responsive_rendering.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_root_module_budget.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_rsi_without_pandas_ta.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runtime_acceptance.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runtime_agent_loop.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runtime_approval.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runtime_bridge.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runtime_bridge_fallback.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runtime_checkpoints.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runtime_gateway.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runtime_repo_map.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runtime_run_store.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runtime_tool_executor.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runtime_worktrees.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_runway_video_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_safety_permissions.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_safety_service.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_safety_service_adoption.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_service_diagnostics_security.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_session_search.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_settings_service.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_shipper_digest.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_single_import_root.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_skill_agent_binding.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_skill_catalog.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_skill_loader.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_spreadsheet_tools.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_sse_stream_contract.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_startup_dashboard.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_startup_latency.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_streaming_pipeline.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_stripe_agent.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_subagent.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_supervisor_routing.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_system_prompts.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_system_tools_output.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_task_orchestrator.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_team_synthesis.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_tls_trust_store.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_tool_policy.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_tool_scope.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_trading_service.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_tradingview_bridge.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_turn_planning.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_ui_completer_references.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_ui_console_theme.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_ui_input_box.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_ui_robot_banner.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_update_health_routes.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_verification_hint.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_verification_policy.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_version_consistency.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_version_counter.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_video_analysis.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_video_editor.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_vscode_mcp.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_warehouse_agents.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_warehouse_cli_registration.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_warehouse_erp_client.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_warehouse_workflow.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_wheel_is_installable.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_workspace_changes.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_workspace_context.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_workspace_files.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_workspace_scope.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_workspace_service.py +0 -0
- {aria_code-0.70.0 → aria_code-0.72.0}/tests/test_workspace_verify.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aria-code
|
|
3
|
-
Version: 0.
|
|
4
|
-
Summary: AI
|
|
3
|
+
Version: 0.72.0
|
|
4
|
+
Summary: Open-source AI agent for logistics and finance work: numbers you can check, client data kept apart, actions a person approves
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
Project-URL: Homepage, https://github.com/artheras/aria-code
|
|
7
7
|
Project-URL: Repository, https://github.com/artheras/aria-code
|
|
@@ -163,8 +163,8 @@ Dynamic: license-file
|
|
|
163
163
|
|
|
164
164
|
<h1 align="center">Aria Code</h1>
|
|
165
165
|
|
|
166
|
-
<p align="center">
|
|
167
|
-
|
|
166
|
+
<p align="center">An open-source AI agent for logistics and finance work.<br>
|
|
167
|
+
Numbers you can check, client data kept apart, actions a person approves.</p>
|
|
168
168
|
|
|
169
169
|
<p align="center"><a href="README_CN.md">简体中文</a> · English</p>
|
|
170
170
|
|
|
@@ -180,9 +180,15 @@ Work in your project, use local or cloud models, and connect domain tools when y
|
|
|
180
180
|
|
|
181
181
|
## What Aria Code does
|
|
182
182
|
|
|
183
|
-
|
|
183
|
+
A general-purpose assistant aims for an answer that reads well. In logistics and finance the number gets acted on — one purchase order left out of a reorder quantity and the stock is bought twice. Aria Code is built around three things that follow from that.
|
|
184
184
|
|
|
185
|
-
|
|
185
|
+
**Numbers you can check.** Reorder points, safety stock and carrier rankings come from stated formulas, with the formula and every assumption in the result — as does stablecoin settlement reconciliation, from the [Artheras skills](https://github.com/artheras/skills) Aria Code can install. When the data cannot support an answer — under 14 days of demand history, rows that name no shipper — it says so instead of estimating. The [`operations` eval suite](docs/verifiable-evals.md) checks exactly these traps.
|
|
186
|
+
|
|
187
|
+
**Client data kept apart.** A third-party logistics provider holds many clients' stock side by side. A chat group bound to one shipper confines every analysis to that shipper, and the logistics tools themselves refuse another shipper's data or an unattributable file — the rule holds below the prompt, whatever the model asks for.
|
|
188
|
+
|
|
189
|
+
**Actions a person approves.** In Feishu, each shipper's group gets a daily digest of reorders, dead stock and freight anomalies. `/补货` turns the reorder list into a purchase-order draft card; nothing happens until an authorised approver presses approve, and what runs is exactly what was shown. The draft is a file for your own purchasing system — Aria Code places no orders.
|
|
190
|
+
|
|
191
|
+
Underneath is a terminal coding agent: it inspects project files, applies edits, runs commands and tests, and explains the changes, with a local Ollama model or a supported cloud provider. A fresh install has no live business data; the logistics tools read your exports (CSV or JSON), and the chat features need a Feishu app or the Aria relay.
|
|
186
192
|
|
|
187
193
|
## Quick start
|
|
188
194
|
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
|
|
8
8
|
<h1 align="center">Aria Code</h1>
|
|
9
9
|
|
|
10
|
-
<p align="center">
|
|
11
|
-
|
|
10
|
+
<p align="center">An open-source AI agent for logistics and finance work.<br>
|
|
11
|
+
Numbers you can check, client data kept apart, actions a person approves.</p>
|
|
12
12
|
|
|
13
13
|
<p align="center"><a href="README_CN.md">简体中文</a> · English</p>
|
|
14
14
|
|
|
@@ -24,9 +24,15 @@ Work in your project, use local or cloud models, and connect domain tools when y
|
|
|
24
24
|
|
|
25
25
|
## What Aria Code does
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
A general-purpose assistant aims for an answer that reads well. In logistics and finance the number gets acted on — one purchase order left out of a reorder quantity and the stock is bought twice. Aria Code is built around three things that follow from that.
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
**Numbers you can check.** Reorder points, safety stock and carrier rankings come from stated formulas, with the formula and every assumption in the result — as does stablecoin settlement reconciliation, from the [Artheras skills](https://github.com/artheras/skills) Aria Code can install. When the data cannot support an answer — under 14 days of demand history, rows that name no shipper — it says so instead of estimating. The [`operations` eval suite](docs/verifiable-evals.md) checks exactly these traps.
|
|
30
|
+
|
|
31
|
+
**Client data kept apart.** A third-party logistics provider holds many clients' stock side by side. A chat group bound to one shipper confines every analysis to that shipper, and the logistics tools themselves refuse another shipper's data or an unattributable file — the rule holds below the prompt, whatever the model asks for.
|
|
32
|
+
|
|
33
|
+
**Actions a person approves.** In Feishu, each shipper's group gets a daily digest of reorders, dead stock and freight anomalies. `/补货` turns the reorder list into a purchase-order draft card; nothing happens until an authorised approver presses approve, and what runs is exactly what was shown. The draft is a file for your own purchasing system — Aria Code places no orders.
|
|
34
|
+
|
|
35
|
+
Underneath is a terminal coding agent: it inspects project files, applies edits, runs commands and tests, and explains the changes, with a local Ollama model or a supported cloud provider. A fresh install has no live business data; the logistics tools read your exports (CSV or JSON), and the chat features need a Feishu app or the Aria relay.
|
|
30
36
|
|
|
31
37
|
## Quick start
|
|
32
38
|
|
|
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "aria-code"
|
|
7
|
-
version = "0.
|
|
8
|
-
description = "AI
|
|
7
|
+
version = "0.72.0"
|
|
8
|
+
description = "Open-source AI agent for logistics and finance work: numbers you can check, client data kept apart, actions a person approves"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "Apache-2.0" }
|
|
11
11
|
# Upper bound is real, not defensive: the core dep pandas_ta pulls numba, and
|
|
@@ -6555,7 +6555,7 @@ async def main():
|
|
|
6555
6555
|
# describe one product. It used to say "Quantitative Investment
|
|
6556
6556
|
# Terminal" here while the package metadata had been repositioned;
|
|
6557
6557
|
# tests/test_first_run_works.py keeps the two in step.
|
|
6558
|
-
description="Aria Code — AI
|
|
6558
|
+
description="Aria Code — Open-source AI agent for logistics and finance work: numbers you can check, client data kept apart, actions a person approves",
|
|
6559
6559
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
6560
6560
|
epilog="""
|
|
6561
6561
|
Examples:
|
|
@@ -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
|
|
@@ -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"))
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aria-code
|
|
3
|
-
Version: 0.
|
|
4
|
-
Summary: AI
|
|
3
|
+
Version: 0.72.0
|
|
4
|
+
Summary: Open-source AI agent for logistics and finance work: numbers you can check, client data kept apart, actions a person approves
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
Project-URL: Homepage, https://github.com/artheras/aria-code
|
|
7
7
|
Project-URL: Repository, https://github.com/artheras/aria-code
|
|
@@ -163,8 +163,8 @@ Dynamic: license-file
|
|
|
163
163
|
|
|
164
164
|
<h1 align="center">Aria Code</h1>
|
|
165
165
|
|
|
166
|
-
<p align="center">
|
|
167
|
-
|
|
166
|
+
<p align="center">An open-source AI agent for logistics and finance work.<br>
|
|
167
|
+
Numbers you can check, client data kept apart, actions a person approves.</p>
|
|
168
168
|
|
|
169
169
|
<p align="center"><a href="README_CN.md">简体中文</a> · English</p>
|
|
170
170
|
|
|
@@ -180,9 +180,15 @@ Work in your project, use local or cloud models, and connect domain tools when y
|
|
|
180
180
|
|
|
181
181
|
## What Aria Code does
|
|
182
182
|
|
|
183
|
-
|
|
183
|
+
A general-purpose assistant aims for an answer that reads well. In logistics and finance the number gets acted on — one purchase order left out of a reorder quantity and the stock is bought twice. Aria Code is built around three things that follow from that.
|
|
184
184
|
|
|
185
|
-
|
|
185
|
+
**Numbers you can check.** Reorder points, safety stock and carrier rankings come from stated formulas, with the formula and every assumption in the result — as does stablecoin settlement reconciliation, from the [Artheras skills](https://github.com/artheras/skills) Aria Code can install. When the data cannot support an answer — under 14 days of demand history, rows that name no shipper — it says so instead of estimating. The [`operations` eval suite](docs/verifiable-evals.md) checks exactly these traps.
|
|
186
|
+
|
|
187
|
+
**Client data kept apart.** A third-party logistics provider holds many clients' stock side by side. A chat group bound to one shipper confines every analysis to that shipper, and the logistics tools themselves refuse another shipper's data or an unattributable file — the rule holds below the prompt, whatever the model asks for.
|
|
188
|
+
|
|
189
|
+
**Actions a person approves.** In Feishu, each shipper's group gets a daily digest of reorders, dead stock and freight anomalies. `/补货` turns the reorder list into a purchase-order draft card; nothing happens until an authorised approver presses approve, and what runs is exactly what was shown. The draft is a file for your own purchasing system — Aria Code places no orders.
|
|
190
|
+
|
|
191
|
+
Underneath is a terminal coding agent: it inspects project files, applies edits, runs commands and tests, and explains the changes, with a local Ollama model or a supported cloud provider. A fresh install has no live business data; the logistics tools read your exports (CSV or JSON), and the chat features need a Feishu app or the Aria relay.
|
|
186
192
|
|
|
187
193
|
## Quick start
|
|
188
194
|
|
|
@@ -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
|
|
@@ -638,6 +639,7 @@ tests/test_rebind_namespace_contract.py
|
|
|
638
639
|
tests/test_relay_client_credentials.py
|
|
639
640
|
tests/test_relay_event_verification.py
|
|
640
641
|
tests/test_relay_sends_for_clients.py
|
|
642
|
+
tests/test_relay_store.py
|
|
641
643
|
tests/test_release_chain.py
|
|
642
644
|
tests/test_release_commit_identity.py
|
|
643
645
|
tests/test_release_push_is_atomic.py
|