aria-code 0.52.0__py3-none-any.whl
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/__init__.py +42 -0
- aria_code/_version.py +20 -0
- aria_code/adk_apps/__init__.py +1 -0
- aria_code/adk_apps/aria_code_review/__init__.py +1 -0
- aria_code/adk_apps/aria_code_review/agent.py +32 -0
- aria_code/adk_apps/aria_research/__init__.py +1 -0
- aria_code/adk_apps/aria_research/agent.py +31 -0
- aria_code/agents/__init__.py +34 -0
- aria_code/agents/base.py +318 -0
- aria_code/agents/code_review.py +200 -0
- aria_code/agents/deep/__init__.py +37 -0
- aria_code/agents/deep/calibration_loop.py +144 -0
- aria_code/agents/deep/critic.py +125 -0
- aria_code/agents/deep/deepen.py +193 -0
- aria_code/agents/deep/models.py +149 -0
- aria_code/agents/deep/pipeline.py +164 -0
- aria_code/agents/deep/quant_fusion.py +192 -0
- aria_code/agents/deep/themes.py +95 -0
- aria_code/agents/deep/tiers.py +106 -0
- aria_code/agents/engineering/__init__.py +14 -0
- aria_code/agents/engineering/coder.py +222 -0
- aria_code/agents/engineering/tester.py +145 -0
- aria_code/agents/financial/__init__.py +21 -0
- aria_code/agents/financial/cashflow_burn.py +119 -0
- aria_code/agents/financial/catalyst.py +279 -0
- aria_code/agents/financial/corporate_finance.py +175 -0
- aria_code/agents/financial/debate.py +224 -0
- aria_code/agents/financial/earnings.py +303 -0
- aria_code/agents/financial/fundamental.py +191 -0
- aria_code/agents/financial/macro.py +99 -0
- aria_code/agents/financial/news.py +207 -0
- aria_code/agents/financial/risk.py +165 -0
- aria_code/agents/financial/sector.py +279 -0
- aria_code/agents/financial/strategist.py +121 -0
- aria_code/agents/financial/stripe_revenue.py +127 -0
- aria_code/agents/financial/synthesis.py +274 -0
- aria_code/agents/financial/technical.py +258 -0
- aria_code/agents/orchestrator.py +44 -0
- aria_code/agents/portfolio_agent.py +363 -0
- aria_code/agents/realty/__init__.py +62 -0
- aria_code/agents/realty/asset_diagnosis.py +152 -0
- aria_code/agents/realty/business_match.py +166 -0
- aria_code/agents/realty/cashflow_verify.py +209 -0
- aria_code/agents/realty/contract_rules.py +210 -0
- aria_code/agents/realty/energy_anomaly.py +189 -0
- aria_code/agents/realty/exit_settlement.py +208 -0
- aria_code/agents/realty/fulfillment_risk.py +206 -0
- aria_code/agents/realty/ops_optimize.py +160 -0
- aria_code/agents/realty/revenue_share.py +215 -0
- aria_code/agents/registry.py +158 -0
- aria_code/agents/signal_scheme.py +111 -0
- aria_code/agents/sports/__init__.py +0 -0
- aria_code/agents/sports/football_agent.py +197 -0
- aria_code/agents/supervisor.py +113 -0
- aria_code/agents/team.py +492 -0
- aria_code/agents/warehouse/__init__.py +25 -0
- aria_code/agents/warehouse/contracts.py +26 -0
- aria_code/agents/warehouse/dashboard.py +155 -0
- aria_code/agents/warehouse/fulfillment_leadtime.py +95 -0
- aria_code/agents/warehouse/inbound_exceptions.py +25 -0
- aria_code/agents/warehouse/inventory_health.py +24 -0
- aria_code/agents/warehouse/local_run.py +71 -0
- aria_code/agents/warehouse/local_snapshot.py +132 -0
- aria_code/agents/warehouse/logistics_cost.py +84 -0
- aria_code/agents/warehouse/logistics_sync.py +21 -0
- aria_code/agents/warehouse/workflow.py +31 -0
- aria_code/aliyun_data_client.py +4 -0
- aria_code/apps/README.md +12 -0
- aria_code/apps/__init__.py +2 -0
- aria_code/apps/channels/README.md +15 -0
- aria_code/apps/channels/__init__.py +17 -0
- aria_code/apps/channels/intake.py +92 -0
- aria_code/apps/channels/registry.py +95 -0
- aria_code/apps/channels/tradingview.py +94 -0
- aria_code/apps/cli/README.md +13 -0
- aria_code/apps/cli/__init__.py +2 -0
- aria_code/apps/cli/_optional.py +120 -0
- aria_code/apps/cli/bootstrap.py +145 -0
- aria_code/apps/cli/broker_render.py +206 -0
- aria_code/apps/cli/codegen_paths.py +29 -0
- aria_code/apps/cli/commands/__init__.py +16 -0
- aria_code/apps/cli/commands/_business_render.py +78 -0
- aria_code/apps/cli/commands/_ui.py +71 -0
- aria_code/apps/cli/commands/analysis_cmds.py +369 -0
- aria_code/apps/cli/commands/ashare_prediction_cmds.py +327 -0
- aria_code/apps/cli/commands/auth_cmds.py +239 -0
- aria_code/apps/cli/commands/backtest_cmds.py +2543 -0
- aria_code/apps/cli/commands/broker_cmds.py +1234 -0
- aria_code/apps/cli/commands/business_workflow_cmds.py +319 -0
- aria_code/apps/cli/commands/canvas_cmds.py +77 -0
- aria_code/apps/cli/commands/catalog.py +87 -0
- aria_code/apps/cli/commands/core_cmds.py +2520 -0
- aria_code/apps/cli/commands/data_cmds.py +457 -0
- aria_code/apps/cli/commands/diagnostic_cmds.py +230 -0
- aria_code/apps/cli/commands/diagnostic_ops_cmds.py +813 -0
- aria_code/apps/cli/commands/file_cmds.py +312 -0
- aria_code/apps/cli/commands/finance_service_cmds.py +60 -0
- aria_code/apps/cli/commands/fx_commodity_cmds.py +123 -0
- aria_code/apps/cli/commands/market.py +434 -0
- aria_code/apps/cli/commands/market_cmds.py +1381 -0
- aria_code/apps/cli/commands/market_context.py +425 -0
- aria_code/apps/cli/commands/market_render.py +7 -0
- aria_code/apps/cli/commands/model_cmds.py +2153 -0
- aria_code/apps/cli/commands/ops_cmds.py +721 -0
- aria_code/apps/cli/commands/orchestrator_cmds.py +179 -0
- aria_code/apps/cli/commands/pdf_export_cmds.py +125 -0
- aria_code/apps/cli/commands/portfolio_cmds.py +1278 -0
- aria_code/apps/cli/commands/report.py +437 -0
- aria_code/apps/cli/commands/scaffold_templates.py +617 -0
- aria_code/apps/cli/commands/session_cmds.py +236 -0
- aria_code/apps/cli/commands/session_ux_cmds.py +359 -0
- aria_code/apps/cli/commands/team.py +669 -0
- aria_code/apps/cli/commands/team_render.py +8 -0
- aria_code/apps/cli/commands/ui_cmds.py +401 -0
- aria_code/apps/cli/commands/warehouse_cmds.py +79 -0
- aria_code/apps/cli/commands/workflow_cmds.py +480 -0
- aria_code/apps/cli/commands/workspace_cmds.py +1494 -0
- aria_code/apps/cli/config_paths.py +73 -0
- aria_code/apps/cli/config_store.py +78 -0
- aria_code/apps/cli/constants.py +88 -0
- aria_code/apps/cli/context.py +34 -0
- aria_code/apps/cli/deterministic.py +191 -0
- aria_code/apps/cli/direct.py +48 -0
- aria_code/apps/cli/finance_service_catalog.py +111 -0
- aria_code/apps/cli/football_reports.py +231 -0
- aria_code/apps/cli/github_app_auth.py +135 -0
- aria_code/apps/cli/google_login.py +196 -0
- aria_code/apps/cli/handlers/__init__.py +11 -0
- aria_code/apps/cli/handlers/broker_handlers.py +122 -0
- aria_code/apps/cli/handlers/chart_handlers.py +1309 -0
- aria_code/apps/cli/handlers/market_handlers.py +2513 -0
- aria_code/apps/cli/handlers/realty_handlers.py +114 -0
- aria_code/apps/cli/handlers/sports_handlers.py +22 -0
- aria_code/apps/cli/handlers/strategy_advice.py +82 -0
- aria_code/apps/cli/helpers.py +302 -0
- aria_code/apps/cli/hooks.py +180 -0
- aria_code/apps/cli/i18n.py +297 -0
- aria_code/apps/cli/intent.py +136 -0
- aria_code/apps/cli/intent_router.py +276 -0
- aria_code/apps/cli/intent_signals.py +344 -0
- aria_code/apps/cli/lifecycle_hooks.py +48 -0
- aria_code/apps/cli/local_tool_schemas.py +536 -0
- aria_code/apps/cli/main.py +29 -0
- aria_code/apps/cli/market_metadata.py +135 -0
- aria_code/apps/cli/market_universe.py +487 -0
- aria_code/apps/cli/message_processing.py +310 -0
- aria_code/apps/cli/model_catalog.py +620 -0
- aria_code/apps/cli/pdf_report.py +977 -0
- aria_code/apps/cli/plan_mode.py +139 -0
- aria_code/apps/cli/plotly_html.py +15 -0
- aria_code/apps/cli/prediction_feedback.py +202 -0
- aria_code/apps/cli/preflight.py +502 -0
- aria_code/apps/cli/project_aria.py +60 -0
- aria_code/apps/cli/prompt_assembly.py +59 -0
- aria_code/apps/cli/prompts/__init__.py +0 -0
- aria_code/apps/cli/prompts/coding.py +53 -0
- aria_code/apps/cli/prompts/select.py +142 -0
- aria_code/apps/cli/prompts/system_prompts.py +552 -0
- aria_code/apps/cli/prompts/ui.py +436 -0
- aria_code/apps/cli/provider_endpoints.py +237 -0
- aria_code/apps/cli/provider_keys.py +73 -0
- aria_code/apps/cli/providers/__init__.py +1 -0
- aria_code/apps/cli/providers/base.py +521 -0
- aria_code/apps/cli/providers/chat_routing.py +128 -0
- aria_code/apps/cli/providers/collaboration.py +98 -0
- aria_code/apps/cli/providers/llm/__init__.py +1 -0
- aria_code/apps/cli/providers/llm/offline_responses.py +68 -0
- aria_code/apps/cli/providers/llm/ollama_stream.py +1594 -0
- aria_code/apps/cli/providers/llm/response_cache.py +60 -0
- aria_code/apps/cli/providers/llm/sse_stream.py +257 -0
- aria_code/apps/cli/providers/runtime_bridge.py +353 -0
- aria_code/apps/cli/providers/vertexai_stream.py +316 -0
- aria_code/apps/cli/runtime_consumer.py +657 -0
- aria_code/apps/cli/sandbox.py +32 -0
- aria_code/apps/cli/session_export.py +120 -0
- aria_code/apps/cli/session_jsonl.py +208 -0
- aria_code/apps/cli/session_store.py +112 -0
- aria_code/apps/cli/skills_catalog.py +273 -0
- aria_code/apps/cli/todo_tracker.py +190 -0
- aria_code/apps/cli/tool_executor.py +823 -0
- aria_code/apps/cli/tool_registry.py +34 -0
- aria_code/apps/cli/tool_scope.py +106 -0
- aria_code/apps/cli/tools/__init__.py +40 -0
- aria_code/apps/cli/tools/context.py +46 -0
- aria_code/apps/cli/tools/file_tools.py +180 -0
- aria_code/apps/cli/tools/market_tools.py +620 -0
- aria_code/apps/cli/tools/notebook_tools.py +111 -0
- aria_code/apps/cli/tools/system_tools.py +726 -0
- aria_code/apps/cli/tools/write_tools.py +845 -0
- aria_code/apps/cli/tradingview_bridge.py +529 -0
- aria_code/apps/cli/turn_planning.py +137 -0
- aria_code/apps/cli/update_check.py +153 -0
- aria_code/apps/cli/utils/__init__.py +0 -0
- aria_code/apps/cli/utils/market_detect.py +1597 -0
- aria_code/apps/daemon/README.md +14 -0
- aria_code/apps/vscode/README.md +115 -0
- aria_code/apps/vscode/package.json +70 -0
- aria_code/aria_cli.py +6743 -0
- aria_code/aria_daemon.py +1398 -0
- aria_code/aria_feishu_bot.py +1423 -0
- aria_code/aria_mcp_server.py +7 -0
- aria_code/aria_relay_client.py +4 -0
- aria_code/aria_relay_server.py +490 -0
- aria_code/aria_telegram_bot.py +202 -0
- aria_code/ariarc.py +385 -0
- aria_code/artifacts.py +581 -0
- aria_code/backtest_engine.py +4 -0
- aria_code/backtest_report.py +4 -0
- aria_code/brokers/__init__.py +78 -0
- aria_code/brokers/automation.py +193 -0
- aria_code/brokers/base.py +231 -0
- aria_code/brokers/capabilities.py +264 -0
- aria_code/brokers/cn/__init__.py +10 -0
- aria_code/brokers/cn/easytrader_broker.py +193 -0
- aria_code/brokers/cn/futu_broker.py +194 -0
- aria_code/brokers/cn/longbridge_broker.py +190 -0
- aria_code/brokers/cn/tiger_broker.py +196 -0
- aria_code/brokers/cn/xtquant_broker.py +225 -0
- aria_code/brokers/config.py +414 -0
- aria_code/brokers/intl/__init__.py +5 -0
- aria_code/brokers/intl/alpaca_broker.py +183 -0
- aria_code/brokers/intl/ibkr_broker.py +215 -0
- aria_code/brokers/intl/trading212_broker.py +183 -0
- aria_code/brokers/intl/webull_broker.py +156 -0
- aria_code/brokers/paper_broker.py +266 -0
- aria_code/brokers/planning.py +296 -0
- aria_code/brokers/registry.py +213 -0
- aria_code/brokers/trading.py +267 -0
- aria_code/canva_client.py +4 -0
- aria_code/change_store.py +127 -0
- aria_code/clients/__init__.py +0 -0
- aria_code/clients/aliyun_data_client.py +660 -0
- aria_code/clients/aria_relay_client.py +182 -0
- aria_code/clients/canva_client.py +284 -0
- aria_code/clients/figma_client.py +100 -0
- aria_code/clients/football_data_client.py +1671 -0
- aria_code/clients/kling_video_client.py +182 -0
- aria_code/clients/market_data_client.py +1976 -0
- aria_code/clients/openai_image_client.py +242 -0
- aria_code/clients/runway_video_client.py +157 -0
- aria_code/clients/warehouse_erp_client.py +105 -0
- aria_code/cloud_memory.py +181 -0
- aria_code/command_safety.py +19 -0
- aria_code/computer_use_tools.py +4 -0
- aria_code/dashboard_generator.py +579 -0
- aria_code/data_analysis_tools.py +4 -0
- aria_code/data_cleaner.py +483 -0
- aria_code/data_service.py +513 -0
- aria_code/datasources/__init__.py +23 -0
- aria_code/datasources/base.py +166 -0
- aria_code/datasources/router.py +253 -0
- aria_code/datasources/sources/__init__.py +15 -0
- aria_code/datasources/sources/akshare_source.py +269 -0
- aria_code/datasources/sources/alpha_vantage_source.py +203 -0
- aria_code/datasources/sources/edgar_source.py +219 -0
- aria_code/datasources/sources/finnhub_source.py +198 -0
- aria_code/datasources/sources/fred_source.py +223 -0
- aria_code/datasources/sources/tushare_source.py +143 -0
- aria_code/datasources/sources/web_scraper_source.py +278 -0
- aria_code/datasources/sources/world_bank_source.py +206 -0
- aria_code/datasources/sources/yfinance_source.py +152 -0
- aria_code/demo_player.py +207 -0
- aria_code/doctor.py +813 -0
- aria_code/domain/__init__.py +0 -0
- aria_code/domain/backtest_engine.py +354 -0
- aria_code/domain/backtest_report.py +472 -0
- aria_code/domain/finance_formulas.py +389 -0
- aria_code/domain/portfolio_ledger.py +307 -0
- aria_code/domain/strategy_vault.py +421 -0
- aria_code/evals/__init__.py +37 -0
- aria_code/evals/harness.py +598 -0
- aria_code/evals/runner.py +238 -0
- aria_code/external_agent_runner.py +115 -0
- aria_code/figma_client.py +4 -0
- aria_code/file_analysis_tools.py +4 -0
- aria_code/finance_formulas.py +4 -0
- aria_code/football_data_client.py +4 -0
- aria_code/image_gen_tools.py +4 -0
- aria_code/intent_classifier.py +386 -0
- aria_code/kling_video_client.py +4 -0
- aria_code/licensing.py +151 -0
- aria_code/local_finance_tools.py +4 -0
- aria_code/local_image_provider.py +4 -0
- aria_code/local_llm_provider.py +4 -0
- aria_code/macro_tools.py +4 -0
- aria_code/markdown_pdf.py +289 -0
- aria_code/market_data_client.py +4 -0
- aria_code/mcp_client.py +639 -0
- aria_code/memory_manager.py +246 -0
- aria_code/model_capability.py +486 -0
- aria_code/notification_tools.py +4 -0
- aria_code/openai_image_client.py +4 -0
- aria_code/packages/__init__.py +23 -0
- aria_code/packages/adk_bridge/__init__.py +11 -0
- aria_code/packages/adk_bridge/code_review_tools.py +49 -0
- aria_code/packages/adk_bridge/market_tools.py +125 -0
- aria_code/packages/aria_agents/__init__.py +5 -0
- aria_code/packages/aria_agents/manifest.py +78 -0
- aria_code/packages/aria_core/__init__.py +34 -0
- aria_code/packages/aria_core/architecture.py +269 -0
- aria_code/packages/aria_core/export.py +147 -0
- aria_code/packages/aria_core/manifest.py +65 -0
- aria_code/packages/aria_core/paths.py +57 -0
- aria_code/packages/aria_core/secure_file.py +68 -0
- aria_code/packages/aria_infra/__init__.py +15 -0
- aria_code/packages/aria_infra/arthera.py +52 -0
- aria_code/packages/aria_infra/doctor.py +246 -0
- aria_code/packages/aria_infra/product.py +40 -0
- aria_code/packages/aria_mcp/__init__.py +25 -0
- aria_code/packages/aria_mcp/bridge.py +201 -0
- aria_code/packages/aria_mcp/circuit.py +82 -0
- aria_code/packages/aria_mcp/config.py +111 -0
- aria_code/packages/aria_mcp/installer.py +95 -0
- aria_code/packages/aria_mcp/server.py +1550 -0
- aria_code/packages/aria_mcp/tools.py +81 -0
- aria_code/packages/aria_sdk/__init__.py +19 -0
- aria_code/packages/aria_sdk/client.py +396 -0
- aria_code/packages/aria_sdk/providers.py +70 -0
- aria_code/packages/aria_sdk/streaming.py +79 -0
- aria_code/packages/aria_sdk/types.py +86 -0
- aria_code/packages/aria_services/__init__.py +92 -0
- aria_code/packages/aria_services/cache.py +60 -0
- aria_code/packages/aria_services/context.py +356 -0
- aria_code/packages/aria_services/context_checkpoints.py +157 -0
- aria_code/packages/aria_services/data.py +11 -0
- aria_code/packages/aria_services/provider_health.py +268 -0
- aria_code/packages/aria_services/references.py +247 -0
- aria_code/packages/aria_services/registry.py +249 -0
- aria_code/packages/aria_services/research_protocol.py +57 -0
- aria_code/packages/aria_services/research_quality.py +186 -0
- aria_code/packages/aria_services/settings.py +157 -0
- aria_code/packages/aria_services/usage.py +151 -0
- aria_code/packages/aria_skills/__init__.py +46 -0
- aria_code/packages/aria_skills/catalog.py +149 -0
- aria_code/packages/aria_skills/loader.py +455 -0
- aria_code/packages/aria_skills/registry.py +84 -0
- aria_code/packages/aria_tools/__init__.py +5 -0
- aria_code/packages/aria_tools/financial/__init__.py +8 -0
- aria_code/packages/aria_tools/financial/_paths.py +130 -0
- aria_code/packages/aria_tools/financial/compliance.py +31 -0
- aria_code/packages/aria_tools/financial/factors.py +33 -0
- aria_code/packages/aria_tools/financial/risk_tools.py +33 -0
- aria_code/packages/aria_tools/financial/strategy.py +31 -0
- aria_code/packages/aria_tools/registry.py +128 -0
- aria_code/packages/quant_engine/__init__.py +34 -0
- aria_code/packages/quant_engine/_namespace.py +62 -0
- aria_code/packages/quant_engine/backtest/__init__.py +14 -0
- aria_code/packages/quant_engine/backtest/core.py +53 -0
- aria_code/packages/quant_engine/backtest/engine.py +96 -0
- aria_code/packages/quant_engine/portfolio/__init__.py +13 -0
- aria_code/packages/quant_engine/portfolio/optimizer.py +85 -0
- aria_code/packages/quant_engine/sports/__init__.py +80 -0
- aria_code/packages/quant_engine/sports/calibrator.py +354 -0
- aria_code/packages/quant_engine/sports/dixon_coles.py +234 -0
- aria_code/packages/quant_engine/sports/elo.py +300 -0
- aria_code/packages/quant_engine/sports/form.py +188 -0
- aria_code/packages/quant_engine/sports/h2h.py +195 -0
- aria_code/packages/quant_engine/sports/ml_model.py +377 -0
- aria_code/packages/quant_engine/sports/predictor.py +312 -0
- aria_code/packages/quant_engine/sports/tracker.py +665 -0
- aria_code/packages/quant_engine/stochastic/__init__.py +35 -0
- aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +195 -0
- aria_code/packages/quant_engine/stochastic/ito_calculus.py +477 -0
- aria_code/packages/quant_engine/stochastic/kelly_criterion.py +181 -0
- aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +95 -0
- aria_code/packages/quant_engine/stochastic/options_pricing.py +576 -0
- aria_code/packages/quant_engine/stochastic/stochastic_processes.py +90 -0
- aria_code/packs/__init__.py +85 -0
- aria_code/packs/base.py +168 -0
- aria_code/packs/finance/__init__.py +250 -0
- aria_code/packs/logistics/__init__.py +169 -0
- aria_code/packs/payments/__init__.py +139 -0
- aria_code/packs/realty/__init__.py +190 -0
- aria_code/packs/registry.py +202 -0
- aria_code/packs/rules.py +90 -0
- aria_code/plan_utils.py +194 -0
- aria_code/plugin_loader.py +328 -0
- aria_code/portfolio_ledger.py +4 -0
- aria_code/preview_server.py +449 -0
- aria_code/privacy/__init__.py +5 -0
- aria_code/privacy/feedback.py +123 -0
- aria_code/project_review.py +278 -0
- aria_code/project_review_api.py +235 -0
- aria_code/project_review_server.py +18 -0
- aria_code/project_tools.py +4 -0
- aria_code/providers/__init__.py +30 -0
- aria_code/providers/llm/__init__.py +19 -0
- aria_code/providers/llm/anthropic.py +184 -0
- aria_code/providers/llm/autoconfig.py +213 -0
- aria_code/providers/llm/base.py +139 -0
- aria_code/providers/llm/custom.py +158 -0
- aria_code/providers/llm/ollama.py +129 -0
- aria_code/providers/llm/openai_compat.py +313 -0
- aria_code/providers/llm/registry.py +444 -0
- aria_code/providers/local_image_provider.py +202 -0
- aria_code/providers/local_llm_provider.py +589 -0
- aria_code/realty_data_tools.py +4 -0
- aria_code/report_exporters.py +150 -0
- aria_code/report_generator.py +1764 -0
- aria_code/runtime/__init__.py +169 -0
- aria_code/runtime/acceptance.py +481 -0
- aria_code/runtime/agent_loop.py +1520 -0
- aria_code/runtime/approval.py +57 -0
- aria_code/runtime/budget.py +232 -0
- aria_code/runtime/checkpoints.py +432 -0
- aria_code/runtime/crash_report.py +174 -0
- aria_code/runtime/events.py +113 -0
- aria_code/runtime/gateway.py +150 -0
- aria_code/runtime/lsp.py +484 -0
- aria_code/runtime/orchestrator.py +55 -0
- aria_code/runtime/repo_map.py +700 -0
- aria_code/runtime/run_state.py +127 -0
- aria_code/runtime/run_store.py +450 -0
- aria_code/runtime/self_healing.py +422 -0
- aria_code/runtime/subagent.py +547 -0
- aria_code/runtime/task_ledger.py +86 -0
- aria_code/runtime/task_orchestrator.py +90 -0
- aria_code/runtime/tool_executor.py +217 -0
- aria_code/runtime/tool_policy.py +107 -0
- aria_code/runtime/worktrees.py +215 -0
- aria_code/runway_video_client.py +4 -0
- aria_code/safety/__init__.py +23 -0
- aria_code/safety/permissions.py +306 -0
- aria_code/safety/service.py +102 -0
- aria_code/setup_wizard.py +673 -0
- aria_code/spreadsheet_tools.py +4 -0
- aria_code/strategy_vault.py +4 -0
- aria_code/tools/__init__.py +0 -0
- aria_code/tools/artifact_tools.py +252 -0
- aria_code/tools/broker_tools.py +92 -0
- aria_code/tools/build_quant_engine.py +97 -0
- aria_code/tools/code_audit_tools.py +192 -0
- aria_code/tools/computer_use_tools.py +504 -0
- aria_code/tools/data_analysis_tools.py +809 -0
- aria_code/tools/enterprise_finance_tools.py +156 -0
- aria_code/tools/extended_tools.py +240 -0
- aria_code/tools/file_analysis_tools.py +885 -0
- aria_code/tools/image_gen_tools.py +114 -0
- aria_code/tools/local_finance_tools.py +3417 -0
- aria_code/tools/logistics_tools.py +135 -0
- aria_code/tools/macro_tools.py +369 -0
- aria_code/tools/notification_tools.py +249 -0
- aria_code/tools/project_tools.py +525 -0
- aria_code/tools/realty_data_tools.py +659 -0
- aria_code/tools/spreadsheet_tools.py +388 -0
- aria_code/tools/stripe_tools.py +115 -0
- aria_code/ui/__init__.py +105 -0
- aria_code/ui/banner.py +508 -0
- aria_code/ui/completer.py +501 -0
- aria_code/ui/console.py +281 -0
- aria_code/ui/image_render.py +243 -0
- aria_code/ui/input_box.py +488 -0
- aria_code/ui/picker.py +201 -0
- aria_code/ui/render/__init__.py +11 -0
- aria_code/ui/render/finance.py +1705 -0
- aria_code/ui/render/market.py +225 -0
- aria_code/ui/render/output.py +775 -0
- aria_code/ui/render/responsive.py +75 -0
- aria_code/ui/render/team.py +354 -0
- aria_code/ui/robot.py +235 -0
- aria_code/ui/startup_dashboard.py +109 -0
- aria_code/utils/vscode_uri.py +37 -0
- aria_code/video_analysis.py +147 -0
- aria_code/video_editor.py +271 -0
- aria_code/workspace/__init__.py +6 -0
- aria_code/workspace/files.py +193 -0
- aria_code/workspace/verify.py +113 -0
- aria_code/workspace_changes.py +199 -0
- aria_code/workspace_context.py +233 -0
- aria_code/workspace_service.py +196 -0
- aria_code/workspace_tools.py +150 -0
- aria_code-0.52.0.dist-info/METADATA +237 -0
- aria_code-0.52.0.dist-info/RECORD +478 -0
- aria_code-0.52.0.dist-info/WHEEL +5 -0
- aria_code-0.52.0.dist-info/entry_points.txt +3 -0
- aria_code-0.52.0.dist-info/licenses/LICENSE +201 -0
- aria_code-0.52.0.dist-info/licenses/NOTICE +49 -0
- aria_code-0.52.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
"""Unified permission and command-risk policy for Aria Code."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import shlex
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from enum import Enum
|
|
8
|
+
from typing import Any, Dict
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
SAFE_POLICIES = {"safe", "balanced", "full"}
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class PermissionMode(str, Enum):
|
|
15
|
+
READ_ONLY = "read-only"
|
|
16
|
+
WORKSPACE_WRITE = "workspace-write"
|
|
17
|
+
FULL_ACCESS = "full-access"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass(frozen=True)
|
|
21
|
+
class PolicyDecision:
|
|
22
|
+
allowed: bool
|
|
23
|
+
normalized_command: str
|
|
24
|
+
policy: str
|
|
25
|
+
risk: str
|
|
26
|
+
reason: str = ""
|
|
27
|
+
requires_approval: bool = False
|
|
28
|
+
network: bool = False
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@dataclass(frozen=True)
|
|
32
|
+
class PermissionDecision:
|
|
33
|
+
allowed: bool
|
|
34
|
+
requires_approval: bool
|
|
35
|
+
risk: str
|
|
36
|
+
reason: str
|
|
37
|
+
normalized_command: str = ""
|
|
38
|
+
network: bool = False
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def normalize_command(command) -> str:
|
|
42
|
+
"""Normalize common macOS command aliases used by models/users."""
|
|
43
|
+
if isinstance(command, list):
|
|
44
|
+
import shlex as _shlex
|
|
45
|
+
command = _shlex.join(str(c) for c in command)
|
|
46
|
+
raw = (command or "").strip()
|
|
47
|
+
if not raw:
|
|
48
|
+
return ""
|
|
49
|
+
try:
|
|
50
|
+
parts = shlex.split(raw)
|
|
51
|
+
except ValueError:
|
|
52
|
+
parts = []
|
|
53
|
+
if parts:
|
|
54
|
+
if parts[0] == "python":
|
|
55
|
+
parts[0] = "python3"
|
|
56
|
+
elif parts[0] == "pip":
|
|
57
|
+
parts[0] = "pip3"
|
|
58
|
+
return shlex.join(parts)
|
|
59
|
+
if raw.startswith("python ") and not raw.startswith("python3"):
|
|
60
|
+
return "python3" + raw[6:]
|
|
61
|
+
if raw == "python":
|
|
62
|
+
return "python3"
|
|
63
|
+
if raw.startswith("pip ") and not raw.startswith("pip3"):
|
|
64
|
+
return "pip3" + raw[3:]
|
|
65
|
+
if raw == "pip":
|
|
66
|
+
return "pip3"
|
|
67
|
+
return raw
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def command_uses_network(command: str) -> bool:
|
|
71
|
+
stripped = command.lower().strip()
|
|
72
|
+
network_prefixes = (
|
|
73
|
+
"curl ", "wget ", "http ", "https ", "gh ", "git fetch", "git pull",
|
|
74
|
+
"git push", "pip3 install", "pip install", "npm install", "npm i ",
|
|
75
|
+
"pnpm install", "yarn install", "brew install",
|
|
76
|
+
)
|
|
77
|
+
return any(stripped.startswith(prefix) for prefix in network_prefixes)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def is_verification_command(command: str) -> bool:
|
|
81
|
+
stripped = command.lower().strip()
|
|
82
|
+
prefixes = (
|
|
83
|
+
"python3 -m py_compile",
|
|
84
|
+
"python -m py_compile",
|
|
85
|
+
"python3 -m pytest",
|
|
86
|
+
"python -m pytest",
|
|
87
|
+
"pytest",
|
|
88
|
+
"npm test",
|
|
89
|
+
"npm run test",
|
|
90
|
+
"npm run build",
|
|
91
|
+
"npx tsc --noemit",
|
|
92
|
+
"npx tsc --noEmit".lower(),
|
|
93
|
+
"tsc --noemit",
|
|
94
|
+
"go test",
|
|
95
|
+
"cargo test",
|
|
96
|
+
"mypy",
|
|
97
|
+
"ruff check",
|
|
98
|
+
)
|
|
99
|
+
return any(stripped.startswith(prefix) for prefix in prefixes)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def classify_command_risk(command) -> str:
|
|
103
|
+
"""Classify command risk into low/medium/high."""
|
|
104
|
+
if isinstance(command, list):
|
|
105
|
+
import shlex as _shlex
|
|
106
|
+
command = _shlex.join(str(c) for c in command)
|
|
107
|
+
normalized = f" {str(command).lower().strip()} "
|
|
108
|
+
stripped = normalized.strip()
|
|
109
|
+
|
|
110
|
+
high_risk_patterns = (
|
|
111
|
+
" rm ", " rm -", "chmod ", "chown ", "mkfs", "dd if=", "docker ", "kubectl ",
|
|
112
|
+
"shutdown", "reboot", "systemctl ", "launchctl ", "passwd", "sudo ",
|
|
113
|
+
"git push", "git reset --hard", "git checkout --", "mv ",
|
|
114
|
+
"> /dev/", ":(){ :", "fork bomb",
|
|
115
|
+
)
|
|
116
|
+
low_risk_prefixes = (
|
|
117
|
+
"ls", "pwd", "echo", "cat ", "head ", "tail ", "rg ", "find ", "git status",
|
|
118
|
+
"git diff", "git log", "which ", "whoami", "date", "uname ", "env",
|
|
119
|
+
"python3 --version", "node --version", "npm --version",
|
|
120
|
+
)
|
|
121
|
+
medium_risk_prefixes = (
|
|
122
|
+
"pip ", "pip3 ", "npm install", "npm i ", "npm run ", "python ", "python3 ",
|
|
123
|
+
"pytest", "make ", "go test", "cargo test", "git commit", "git pull", "git merge",
|
|
124
|
+
"gh ", "curl ", "wget ",
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
if any(pattern in normalized for pattern in high_risk_patterns):
|
|
128
|
+
return "high"
|
|
129
|
+
if stripped.startswith(low_risk_prefixes):
|
|
130
|
+
return "low"
|
|
131
|
+
if stripped.startswith(medium_risk_prefixes) or is_verification_command(stripped):
|
|
132
|
+
return "medium"
|
|
133
|
+
return "medium"
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
class PermissionService:
|
|
137
|
+
"""Central policy for tools and shell-command execution."""
|
|
138
|
+
|
|
139
|
+
READ_TOOLS = {"read_file", "list_files", "search_code", "project_context", "git_status", "git_diff"}
|
|
140
|
+
WRITE_TOOLS = {"write_file", "edit_file", "apply_change", "apply_patch", "reject_change"}
|
|
141
|
+
|
|
142
|
+
def __init__(
|
|
143
|
+
self,
|
|
144
|
+
mode: PermissionMode | str = PermissionMode.WORKSPACE_WRITE,
|
|
145
|
+
command_policy: str = "safe",
|
|
146
|
+
network_enabled: bool = True,
|
|
147
|
+
) -> None:
|
|
148
|
+
try:
|
|
149
|
+
self.mode = PermissionMode(mode)
|
|
150
|
+
except ValueError:
|
|
151
|
+
self.mode = PermissionMode.WORKSPACE_WRITE
|
|
152
|
+
self.command_policy = command_policy if command_policy in SAFE_POLICIES else "safe"
|
|
153
|
+
self.network_enabled = network_enabled
|
|
154
|
+
|
|
155
|
+
def evaluate_tool(self, tool_name: str, params: Dict[str, Any] | None = None) -> PermissionDecision:
|
|
156
|
+
name = (tool_name or "").strip()
|
|
157
|
+
if name in self.READ_TOOLS:
|
|
158
|
+
return PermissionDecision(True, False, "low", "Read-only tool allowed.")
|
|
159
|
+
if name in self.WRITE_TOOLS:
|
|
160
|
+
if self.mode == PermissionMode.READ_ONLY:
|
|
161
|
+
return PermissionDecision(False, False, "medium", "Writes are blocked in read-only mode.")
|
|
162
|
+
return PermissionDecision(
|
|
163
|
+
True,
|
|
164
|
+
self.mode != PermissionMode.FULL_ACCESS,
|
|
165
|
+
"medium",
|
|
166
|
+
"Write requires review or explicit approval before disk mutation.",
|
|
167
|
+
)
|
|
168
|
+
if name == "run_command":
|
|
169
|
+
return self.evaluate_command(str((params or {}).get("command", "")))
|
|
170
|
+
return PermissionDecision(False, False, "unknown", f"Unknown tool '{name}' is blocked.")
|
|
171
|
+
|
|
172
|
+
def evaluate_command(self, command: str, policy: str | None = None) -> PermissionDecision:
|
|
173
|
+
decision = evaluate_command_policy(
|
|
174
|
+
command,
|
|
175
|
+
policy or self.command_policy,
|
|
176
|
+
mode=self.mode.value,
|
|
177
|
+
network_enabled=self.network_enabled,
|
|
178
|
+
)
|
|
179
|
+
return PermissionDecision(
|
|
180
|
+
allowed=decision.allowed,
|
|
181
|
+
requires_approval=decision.requires_approval,
|
|
182
|
+
risk=decision.risk,
|
|
183
|
+
reason=decision.reason or "Command allowed.",
|
|
184
|
+
normalized_command=decision.normalized_command,
|
|
185
|
+
network=decision.network,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def evaluate_command_policy(
|
|
190
|
+
command: str,
|
|
191
|
+
policy: str = "safe",
|
|
192
|
+
*,
|
|
193
|
+
mode: str = PermissionMode.WORKSPACE_WRITE.value,
|
|
194
|
+
network_enabled: bool = True,
|
|
195
|
+
) -> PolicyDecision:
|
|
196
|
+
"""Return policy decision for command execution."""
|
|
197
|
+
normalized = normalize_command(command)
|
|
198
|
+
selected_policy = (policy or "safe").strip().lower()
|
|
199
|
+
if selected_policy not in SAFE_POLICIES:
|
|
200
|
+
selected_policy = "safe"
|
|
201
|
+
try:
|
|
202
|
+
selected_mode = PermissionMode(mode)
|
|
203
|
+
except ValueError:
|
|
204
|
+
# Fail closed. An unrecognised mode used to resolve to WORKSPACE_WRITE,
|
|
205
|
+
# which is more permissive than READ_ONLY, not less: under read-only a
|
|
206
|
+
# write command is a hard block, while under workspace-write it is a
|
|
207
|
+
# block the user can unlock by approving. Resolving an invalid value to
|
|
208
|
+
# the laxer of the two turns a typo โ or a caller passing a *policy*
|
|
209
|
+
# name into the *mode* slot โ into an approval prompt that should never
|
|
210
|
+
# have been offered.
|
|
211
|
+
selected_mode = PermissionMode.READ_ONLY
|
|
212
|
+
|
|
213
|
+
risk = classify_command_risk(normalized)
|
|
214
|
+
network = command_uses_network(normalized)
|
|
215
|
+
if network and not network_enabled:
|
|
216
|
+
return PolicyDecision(
|
|
217
|
+
allowed=False,
|
|
218
|
+
normalized_command=normalized,
|
|
219
|
+
policy=selected_policy,
|
|
220
|
+
risk=risk,
|
|
221
|
+
reason=f"Network command blocked by policy: {normalized}",
|
|
222
|
+
requires_approval=False,
|
|
223
|
+
network=True,
|
|
224
|
+
)
|
|
225
|
+
if selected_mode == PermissionMode.READ_ONLY and risk != "low":
|
|
226
|
+
return PolicyDecision(
|
|
227
|
+
allowed=False,
|
|
228
|
+
normalized_command=normalized,
|
|
229
|
+
policy=selected_policy,
|
|
230
|
+
risk=risk,
|
|
231
|
+
reason=f"Command blocked by read-only mode (risk={risk}): {normalized}",
|
|
232
|
+
requires_approval=False,
|
|
233
|
+
network=network,
|
|
234
|
+
)
|
|
235
|
+
if risk == "high" and selected_policy != "full":
|
|
236
|
+
return PolicyDecision(
|
|
237
|
+
allowed=False,
|
|
238
|
+
normalized_command=normalized,
|
|
239
|
+
policy=selected_policy,
|
|
240
|
+
risk=risk,
|
|
241
|
+
reason=(
|
|
242
|
+
f"Command blocked by policy '{selected_policy}' (risk={risk}): {normalized}. "
|
|
243
|
+
"Use /config set command_policy=full only if you understand the risk."
|
|
244
|
+
),
|
|
245
|
+
requires_approval=selected_policy == "balanced",
|
|
246
|
+
network=network,
|
|
247
|
+
)
|
|
248
|
+
# Verification is the one class of command the agent must be able to run
|
|
249
|
+
# under the default policy. `safe` blocked pytest, py_compile, npm test and
|
|
250
|
+
# tsc --noEmit, so the loop could write a fix and then had no way to find
|
|
251
|
+
# out whether it worked โ and the model said so out loud: "็ฑไบๅฎๅ
จ็ญ็ฅ็
|
|
252
|
+
# ้ๅถ๏ผๆๆ ๆณๆง่ก pytest ... ไฝๆ็ธไฟกๆต่ฏๅบ่ฏฅ่ฝๅค้่ฟ". An agent that
|
|
253
|
+
# cannot check its own work is guessing, and the whole acceptance gate rests
|
|
254
|
+
# on being able to run exactly these commands.
|
|
255
|
+
#
|
|
256
|
+
# The exposure is small and bounded by what `is_verification_command`
|
|
257
|
+
# matches: test and type-check runners, anchored at the start of the
|
|
258
|
+
# command. It stays subject to read-only mode and to the network rule
|
|
259
|
+
# above, and `high` risk was already rejected before this point โ so a
|
|
260
|
+
# command like `pytest && rm -rf /` never reaches here.
|
|
261
|
+
if selected_policy == "safe" and risk != "low" and is_verification_command(normalized):
|
|
262
|
+
return PolicyDecision(
|
|
263
|
+
allowed=True,
|
|
264
|
+
normalized_command=normalized,
|
|
265
|
+
policy=selected_policy,
|
|
266
|
+
risk=risk,
|
|
267
|
+
reason="",
|
|
268
|
+
requires_approval=False,
|
|
269
|
+
network=network,
|
|
270
|
+
)
|
|
271
|
+
|
|
272
|
+
if selected_policy == "safe" and risk != "low":
|
|
273
|
+
extra = ""
|
|
274
|
+
norm_low = normalized.lower()
|
|
275
|
+
if "pip3" in norm_low or "pip " in norm_low or norm_low.startswith("pip"):
|
|
276
|
+
extra = (
|
|
277
|
+
"\n\n๐ก ไพ่ตๅฎ่ฃ
ๆ็คบ๏ผ่ฟ่ก `/config set command_policy=balanced` ๅ้่ฏ๏ผ"
|
|
278
|
+
"ๆๆๅจๅจ็ป็ซฏๆง่ก่ฏฅๅฝไปคใไธ่ฆ้่ฏ็ธๅๅฝไปค๏ผ"
|
|
279
|
+
)
|
|
280
|
+
elif "python" in norm_low and ("~/" in normalized or "/Desktop/" in normalized):
|
|
281
|
+
extra = (
|
|
282
|
+
"\n\n๐ก ่ๆฌๆง่กๆ็คบ๏ผ่ฟ่ก `/config set command_policy=balanced` ๅ้่ฏใ"
|
|
283
|
+
"ไธ่ฆ้่ฏ็ธๅๅฝไปค๏ผ"
|
|
284
|
+
)
|
|
285
|
+
return PolicyDecision(
|
|
286
|
+
allowed=False,
|
|
287
|
+
normalized_command=normalized,
|
|
288
|
+
policy=selected_policy,
|
|
289
|
+
risk=risk,
|
|
290
|
+
reason=(
|
|
291
|
+
f"Command blocked by policy '{selected_policy}' (risk={risk}): {normalized}. "
|
|
292
|
+
"Use /config set command_policy=balanced or /run --dry-run <cmd> first."
|
|
293
|
+
+ extra
|
|
294
|
+
),
|
|
295
|
+
requires_approval=True,
|
|
296
|
+
network=network,
|
|
297
|
+
)
|
|
298
|
+
return PolicyDecision(
|
|
299
|
+
allowed=True,
|
|
300
|
+
normalized_command=normalized,
|
|
301
|
+
policy=selected_policy,
|
|
302
|
+
risk=risk,
|
|
303
|
+
reason="",
|
|
304
|
+
requires_approval=False,
|
|
305
|
+
network=network,
|
|
306
|
+
)
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"""SafetyService โ one facade over Aria's three safety domains.
|
|
2
|
+
|
|
3
|
+
The architecture contract's safety layer calls for command policy, broker
|
|
4
|
+
risk policy, and privacy controls to be reachable through a single service
|
|
5
|
+
(registry spec ``safety`` โ SafetyService, capabilities: command.policy,
|
|
6
|
+
privacy, audit, sandbox). The three implementations already exist and stay
|
|
7
|
+
where they are; this facade composes them behind one config-driven object so
|
|
8
|
+
launcher/daemon/CLI/MCP consumers stop reaching into three packages with
|
|
9
|
+
three different conventions:
|
|
10
|
+
|
|
11
|
+
โข command/tool policy โ safety.permissions.PermissionService
|
|
12
|
+
โข privacy controls โ privacy.PrivacySettings (lazy import)
|
|
13
|
+
โข broker/trading risk โ brokers.trading policy helpers (lazy import)
|
|
14
|
+
|
|
15
|
+
Cross-domain imports are deferred to call time, so importing ``safety``
|
|
16
|
+
never drags in broker or privacy modules (mirrors SettingsService's
|
|
17
|
+
injection-clean layering).
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
from typing import Any, Dict, Optional
|
|
23
|
+
|
|
24
|
+
from .permissions import PermissionDecision, PermissionService, classify_command_risk
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class SafetyService:
|
|
28
|
+
"""Config-driven facade over command, privacy, and trading safety."""
|
|
29
|
+
|
|
30
|
+
def __init__(self, config: Optional[Dict[str, Any]] = None) -> None:
|
|
31
|
+
self._config: Dict[str, Any] = dict(config or {})
|
|
32
|
+
self._permissions = self._build_permissions(self._config)
|
|
33
|
+
|
|
34
|
+
# โโ lifecycle โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
35
|
+
|
|
36
|
+
@staticmethod
|
|
37
|
+
def _build_permissions(config: Dict[str, Any]) -> PermissionService:
|
|
38
|
+
return PermissionService(
|
|
39
|
+
mode=config.get("permission_mode", "workspace-write"),
|
|
40
|
+
command_policy=config.get("command_policy", "safe"),
|
|
41
|
+
network_enabled=bool(config.get("network_enabled", True)),
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
def refresh(self, config: Dict[str, Any]) -> None:
|
|
45
|
+
"""Rebuild policy state after a config change (e.g. /config set)."""
|
|
46
|
+
self._config = dict(config)
|
|
47
|
+
self._permissions = self._build_permissions(self._config)
|
|
48
|
+
|
|
49
|
+
# โโ command / tool policy (capability: command.policy) โโโโโโโโโโโโโโโโโโ
|
|
50
|
+
|
|
51
|
+
@property
|
|
52
|
+
def permissions(self) -> PermissionService:
|
|
53
|
+
return self._permissions
|
|
54
|
+
|
|
55
|
+
def evaluate_tool(self, tool_name: str, params: Optional[Dict[str, Any]] = None) -> PermissionDecision:
|
|
56
|
+
return self._permissions.evaluate_tool(tool_name, params)
|
|
57
|
+
|
|
58
|
+
def evaluate_command(self, command: str, policy: Optional[str] = None) -> PermissionDecision:
|
|
59
|
+
return self._permissions.evaluate_command(command, policy)
|
|
60
|
+
|
|
61
|
+
def classify_risk(self, command: str) -> str:
|
|
62
|
+
return classify_command_risk(command)
|
|
63
|
+
|
|
64
|
+
# โโ privacy controls (capability: privacy) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
65
|
+
|
|
66
|
+
def privacy(self):
|
|
67
|
+
"""Current PrivacySettings derived from config."""
|
|
68
|
+
# Package-qualified on purpose. The bare `privacy` and the packaged
|
|
69
|
+
# `aria_code.privacy` are distinct module objects with distinct class
|
|
70
|
+
# objects, and every other caller in the tree uses the packaged form โ
|
|
71
|
+
# importing it bare here handed those callers a PrivacySettings that
|
|
72
|
+
# was not the PrivacySettings they compare against.
|
|
73
|
+
#
|
|
74
|
+
# The trading helpers below stay bare precisely because the opposite is
|
|
75
|
+
# true there: every brokers.trading caller in the tree is bare, so the
|
|
76
|
+
# packaged form is what would split the class.
|
|
77
|
+
from aria_code.privacy import PrivacySettings
|
|
78
|
+
return PrivacySettings.from_config(self._config)
|
|
79
|
+
|
|
80
|
+
# โโ broker / trading risk (capability: audit โ trading is the audited
|
|
81
|
+
# domain today; the jsonl audit sink lives with the trading policy) โโโ
|
|
82
|
+
|
|
83
|
+
def trading_policy(self, broker_type: str = ""):
|
|
84
|
+
"""TradingPolicy resolved from config (paper/live, confirm, limits)."""
|
|
85
|
+
from brokers.trading import policy_from_config
|
|
86
|
+
return policy_from_config(self._config, broker_type)
|
|
87
|
+
|
|
88
|
+
def trading_mode(self, broker_type: str = "") -> str:
|
|
89
|
+
from brokers.trading import resolve_trading_mode
|
|
90
|
+
return resolve_trading_mode(self._config, broker_type)
|
|
91
|
+
|
|
92
|
+
def trading_dry_run(self) -> bool:
|
|
93
|
+
"""Global operational kill-switch (env ARIA_DRY_RUN).
|
|
94
|
+
|
|
95
|
+
The name matters: this docstring is the only documentation the switch
|
|
96
|
+
has โ no .md file mentions it โ and it used to name a variable that
|
|
97
|
+
nothing reads. Anyone who followed it to freeze live trading got no
|
|
98
|
+
freeze and no error. tests/test_env_switch_docs.py now fails if any
|
|
99
|
+
docstring names an ARIA_* variable the tree never reads.
|
|
100
|
+
"""
|
|
101
|
+
from brokers.trading import global_dry_run
|
|
102
|
+
return global_dry_run()
|