aria-code 0.167.0__py3-none-win_amd64.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_bots/__init__.py +7 -0
- aria_bots/channels/README.md +97 -0
- aria_bots/channels/__init__.py +1 -0
- aria_bots/channels/approvals.py +263 -0
- aria_bots/channels/conversation.py +280 -0
- aria_bots/channels/digest.py +186 -0
- aria_bots/channels/registry.py +95 -0
- aria_bots/engine.py +144 -0
- aria_bots/feishu_bot.py +1385 -0
- aria_bots/logistics/__init__.py +1 -0
- aria_bots/logistics/carriers.py +253 -0
- aria_bots/logistics/freight.py +154 -0
- aria_bots/logistics/inventory.py +242 -0
- aria_bots/logistics/mcp_server.py +156 -0
- aria_bots/logistics/records.py +119 -0
- aria_bots/logistics/tenancy.py +152 -0
- aria_bots/market.py +91 -0
- aria_bots/relay_client.py +326 -0
- aria_bots/telegram_bot.py +299 -0
- aria_code/__init__.py +111 -0
- aria_code/_bin/aria-native.exe +0 -0
- aria_code/_bin/aria-runtime.exe +0 -0
- aria_code/_version.py +20 -0
- aria_code/account_memory.py +296 -0
- aria_code/account_session.py +166 -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 +49 -0
- aria_code/agents/base.py +329 -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 +315 -0
- aria_code/agents/financial/fundamental.py +178 -0
- aria_code/agents/financial/macro.py +111 -0
- aria_code/agents/financial/news.py +231 -0
- aria_code/agents/financial/risk.py +146 -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 +277 -0
- aria_code/agents/orchestrator.py +44 -0
- aria_code/agents/portfolio_agent.py +392 -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 +168 -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 +500 -0
- aria_code/agents/video/__init__.py +16 -0
- aria_code/agents/video/director.py +376 -0
- aria_code/agents/video/qa_agent.py +143 -0
- aria_code/agents/video/script_doctor.py +112 -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/navigation.schema.json +110 -0
- aria_code/agents/warehouse/task_agent.py +172 -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 +9 -0
- aria_code/apps/channels/__init__.py +17 -0
- aria_code/apps/channels/approvals.py +11 -0
- aria_code/apps/channels/conversation.py +11 -0
- aria_code/apps/channels/digest.py +11 -0
- aria_code/apps/channels/intake.py +92 -0
- aria_code/apps/channels/registry.py +11 -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/app_server.py +656 -0
- aria_code/apps/cli/auto_update.py +125 -0
- aria_code/apps/cli/bootstrap.py +206 -0
- aria_code/apps/cli/broker_render.py +206 -0
- aria_code/apps/cli/chat_turn.py +1327 -0
- aria_code/apps/cli/cloud_models.py +231 -0
- aria_code/apps/cli/codegen_paths.py +29 -0
- aria_code/apps/cli/commands/__init__.py +34 -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 +378 -0
- aria_code/apps/cli/commands/ashare_prediction_cmds.py +327 -0
- aria_code/apps/cli/commands/auth_cmds.py +215 -0
- aria_code/apps/cli/commands/backtest_cmds.py +2518 -0
- aria_code/apps/cli/commands/broker_cmds.py +1236 -0
- aria_code/apps/cli/commands/business_workflow_cmds.py +379 -0
- aria_code/apps/cli/commands/canvas_cmds.py +77 -0
- aria_code/apps/cli/commands/catalog.py +189 -0
- aria_code/apps/cli/commands/core_cmds.py +2748 -0
- aria_code/apps/cli/commands/data_cmds.py +521 -0
- aria_code/apps/cli/commands/diagnostic_cmds.py +285 -0
- aria_code/apps/cli/commands/diagnostic_ops_cmds.py +813 -0
- aria_code/apps/cli/commands/engineering_cmds.py +399 -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 +544 -0
- aria_code/apps/cli/commands/market_cmds.py +1419 -0
- aria_code/apps/cli/commands/market_context.py +432 -0
- aria_code/apps/cli/commands/market_render.py +7 -0
- aria_code/apps/cli/commands/model_cmds.py +2374 -0
- aria_code/apps/cli/commands/ops_cmds.py +721 -0
- aria_code/apps/cli/commands/orchestrator_cmds.py +181 -0
- aria_code/apps/cli/commands/pdf_export_cmds.py +125 -0
- aria_code/apps/cli/commands/portfolio_cmds.py +1316 -0
- aria_code/apps/cli/commands/report.py +476 -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 +723 -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 +297 -0
- aria_code/apps/cli/commands/workflow_cmds.py +629 -0
- aria_code/apps/cli/commands/workspace_cmds.py +1543 -0
- aria_code/apps/cli/config_paths.py +73 -0
- aria_code/apps/cli/config_store.py +158 -0
- aria_code/apps/cli/constants.py +88 -0
- aria_code/apps/cli/context.py +34 -0
- aria_code/apps/cli/conversation_policy.py +53 -0
- aria_code/apps/cli/deterministic.py +200 -0
- aria_code/apps/cli/direct.py +48 -0
- aria_code/apps/cli/earnings_view.py +172 -0
- aria_code/apps/cli/endpoint_migration.py +64 -0
- aria_code/apps/cli/exec_events.py +255 -0
- aria_code/apps/cli/file_references.py +155 -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 +239 -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 +1314 -0
- aria_code/apps/cli/handlers/market_handlers.py +2570 -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/headless.py +352 -0
- aria_code/apps/cli/helpers.py +326 -0
- aria_code/apps/cli/hooks.py +180 -0
- aria_code/apps/cli/i18n.py +310 -0
- aria_code/apps/cli/intent.py +136 -0
- aria_code/apps/cli/intent_router.py +305 -0
- aria_code/apps/cli/intent_shadow.py +72 -0
- aria_code/apps/cli/intent_signals.py +347 -0
- aria_code/apps/cli/lifecycle_hooks.py +48 -0
- aria_code/apps/cli/local_tool_schemas.py +550 -0
- aria_code/apps/cli/main.py +39 -0
- aria_code/apps/cli/market_hours.py +100 -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/mixin_binding.py +32 -0
- aria_code/apps/cli/model_catalog.py +652 -0
- aria_code/apps/cli/model_probe.py +169 -0
- aria_code/apps/cli/model_retirement.py +65 -0
- aria_code/apps/cli/native_branding.py +12 -0
- aria_code/apps/cli/native_bridge.py +118 -0
- aria_code/apps/cli/native_entry.py +58 -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 +78 -0
- aria_code/apps/cli/prompts/__init__.py +0 -0
- aria_code/apps/cli/prompts/coding.py +71 -0
- aria_code/apps/cli/prompts/select.py +193 -0
- aria_code/apps/cli/prompts/system_prompts.py +562 -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 +775 -0
- aria_code/apps/cli/providers/chat_routing.py +139 -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 +1574 -0
- aria_code/apps/cli/providers/llm/response_cache.py +60 -0
- aria_code/apps/cli/providers/llm/sse_stream.py +298 -0
- aria_code/apps/cli/providers/runtime_bridge.py +586 -0
- aria_code/apps/cli/providers/vertexai_stream.py +592 -0
- aria_code/apps/cli/release_download.py +159 -0
- aria_code/apps/cli/review_runner.py +111 -0
- aria_code/apps/cli/runtime_consumer.py +769 -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_refresh.py +123 -0
- aria_code/apps/cli/session_store.py +125 -0
- aria_code/apps/cli/skills_catalog.py +273 -0
- aria_code/apps/cli/task_isolation.py +211 -0
- aria_code/apps/cli/terminal_chrome.py +412 -0
- aria_code/apps/cli/todo_tracker.py +190 -0
- aria_code/apps/cli/tool_executor.py +932 -0
- aria_code/apps/cli/tool_registry.py +34 -0
- aria_code/apps/cli/tool_scope.py +113 -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 +181 -0
- aria_code/apps/cli/tools/market_tools.py +626 -0
- aria_code/apps/cli/tools/notebook_tools.py +111 -0
- aria_code/apps/cli/tools/system_tools.py +656 -0
- aria_code/apps/cli/tools/write_tools.py +961 -0
- aria_code/apps/cli/tradingview_bridge.py +529 -0
- aria_code/apps/cli/transactions.py +269 -0
- aria_code/apps/cli/turn_planning.py +137 -0
- aria_code/apps/cli/update_check.py +257 -0
- aria_code/apps/cli/updater.py +373 -0
- aria_code/apps/cli/utils/__init__.py +0 -0
- aria_code/apps/cli/utils/market_detect.py +1663 -0
- aria_code/apps/cli/web_login.py +136 -0
- aria_code/apps/cli/workflow_runner.py +127 -0
- aria_code/apps/cli/workspace_route.py +121 -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 +5244 -0
- aria_code/aria_daemon.py +1372 -0
- aria_code/aria_feishu_bot.py +16 -0
- aria_code/aria_mcp_server.py +61 -0
- aria_code/aria_relay_client.py +4 -0
- aria_code/aria_telegram_bot.py +11 -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 +16 -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 +1985 -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 +190 -0
- aria_code/command_safety.py +19 -0
- aria_code/computer_use_server.py +276 -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/sec_statements.py +217 -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/doctor.py +860 -0
- aria_code/domain/__init__.py +0 -0
- aria_code/domain/_finance_core/__init__.py +5 -0
- aria_code/domain/_finance_core/backtest_engine.py +325 -0
- aria_code/domain/_finance_core/performance_stats.py +101 -0
- aria_code/domain/backtest_engine.py +75 -0
- aria_code/domain/backtest_report.py +488 -0
- aria_code/domain/finance_formulas.py +389 -0
- aria_code/domain/performance_stats.py +6 -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/behavior.py +113 -0
- aria_code/evals/gap.py +93 -0
- aria_code/evals/harness.py +949 -0
- aria_code/evals/review_probe.py +132 -0
- aria_code/evals/runner.py +425 -0
- aria_code/evals/scorecard.py +322 -0
- aria_code/evals/summary.py +125 -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 +459 -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 +744 -0
- aria_code/memory_manager.py +273 -0
- aria_code/model_capability.py +512 -0
- aria_code/notification_tools.py +4 -0
- aria_code/openai_image_client.py +4 -0
- aria_code/packages/__init__.py +26 -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 +58 -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 +232 -0
- aria_code/packages/aria_mcp/circuit.py +82 -0
- aria_code/packages/aria_mcp/config.py +162 -0
- aria_code/packages/aria_mcp/installer.py +95 -0
- aria_code/packages/aria_mcp/server.py +1705 -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 +393 -0
- aria_code/packages/aria_sdk/providers.py +70 -0
- aria_code/packages/aria_sdk/streaming.py +75 -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 +304 -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 +137 -0
- aria_code/packages/aria_services/research_quality.py +186 -0
- aria_code/packages/aria_services/settings.py +160 -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 +5 -0
- aria_code/packages/aria_tools/financial/_paths.py +92 -0
- aria_code/packages/aria_tools/registry.py +129 -0
- aria_code/packages/quant_engine/__init__.py +33 -0
- aria_code/packages/quant_engine/_namespace.py +24 -0
- aria_code/packages/quant_engine/backtest/__init__.py +10 -0
- aria_code/packages/quant_engine/backtest/core.py +53 -0
- aria_code/packages/quant_engine/backtest/engine.py +102 -0
- aria_code/packages/quant_engine/portfolio/__init__.py +9 -0
- aria_code/packages/quant_engine/portfolio/optimizer.py +85 -0
- aria_code/packages/quant_engine/sports/__init__.py +76 -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/predictor.py +312 -0
- aria_code/packages/quant_engine/sports/tracker.py +665 -0
- aria_code/packages/quant_engine/stochastic/__init__.py +31 -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/healthcare/__init__.py +40 -0
- aria_code/packs/logistics/__init__.py +171 -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/google_video_provider.py +256 -0
- aria_code/providers/llm/__init__.py +19 -0
- aria_code/providers/llm/anthropic.py +184 -0
- aria_code/providers/llm/arthera_gateway.py +90 -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 +137 -0
- aria_code/providers/llm/openai_compat.py +350 -0
- aria_code/providers/llm/registry.py +457 -0
- aria_code/providers/local_image_provider.py +202 -0
- aria_code/providers/local_llm_provider.py +549 -0
- aria_code/providers/ollama_models.py +79 -0
- aria_code/providers/openai_params.py +32 -0
- aria_code/providers/tool_messages.py +100 -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/review_service.py +497 -0
- aria_code/runtime/__init__.py +176 -0
- aria_code/runtime/acceptance.py +632 -0
- aria_code/runtime/agent_loop.py +1851 -0
- aria_code/runtime/agent_profiles.py +75 -0
- aria_code/runtime/approval.py +71 -0
- aria_code/runtime/baseline.py +219 -0
- aria_code/runtime/budget.py +232 -0
- aria_code/runtime/checkpoints.py +481 -0
- aria_code/runtime/consult.py +65 -0
- aria_code/runtime/contract.py +282 -0
- aria_code/runtime/delivery.py +432 -0
- aria_code/runtime/events.py +113 -0
- aria_code/runtime/gateway.py +167 -0
- aria_code/runtime/lsp.py +484 -0
- aria_code/runtime/native_index.py +153 -0
- aria_code/runtime/orchestrator.py +55 -0
- aria_code/runtime/processes.py +343 -0
- aria_code/runtime/project_graph.py +614 -0
- aria_code/runtime/repo_map.py +712 -0
- aria_code/runtime/research_bundle.py +105 -0
- aria_code/runtime/review.py +269 -0
- aria_code/runtime/run_state.py +127 -0
- aria_code/runtime/run_store.py +522 -0
- aria_code/runtime/scoped_runs.py +113 -0
- aria_code/runtime/self_healing.py +422 -0
- aria_code/runtime/semantic_diff.py +171 -0
- aria_code/runtime/subagent.py +721 -0
- aria_code/runtime/symbol_edit.py +117 -0
- aria_code/runtime/task_brief.py +46 -0
- aria_code/runtime/task_context.py +145 -0
- aria_code/runtime/task_ledger.py +108 -0
- aria_code/runtime/task_orchestrator.py +90 -0
- aria_code/runtime/task_outcome.py +33 -0
- aria_code/runtime/task_verification.py +266 -0
- aria_code/runtime/task_worktree.py +448 -0
- aria_code/runtime/tool_executor.py +329 -0
- aria_code/runtime/tool_policy.py +107 -0
- aria_code/runtime/transactions.py +216 -0
- aria_code/runtime/windows_job.py +115 -0
- aria_code/runtime/workflows.py +222 -0
- aria_code/runtime/worktrees.py +215 -0
- aria_code/runway_video_client.py +4 -0
- aria_code/safety/__init__.py +27 -0
- aria_code/safety/client_isolation.py +178 -0
- aria_code/safety/permissions.py +339 -0
- aria_code/safety/risk.py +699 -0
- aria_code/safety/sandbox.py +148 -0
- aria_code/safety/service.py +102 -0
- aria_code/service_endpoints.py +14 -0
- aria_code/setup_wizard.py +684 -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 +509 -0
- aria_code/tools/data_analysis_tools.py +831 -0
- aria_code/tools/enterprise_finance_tools.py +202 -0
- aria_code/tools/extended_tools.py +240 -0
- aria_code/tools/file_analysis_tools.py +880 -0
- aria_code/tools/image_gen_tools.py +114 -0
- aria_code/tools/local_finance_tools.py +3488 -0
- aria_code/tools/logistics_carriers.py +11 -0
- aria_code/tools/logistics_inventory.py +11 -0
- aria_code/tools/logistics_io.py +11 -0
- aria_code/tools/logistics_tenancy.py +11 -0
- aria_code/tools/logistics_tools.py +11 -0
- aria_code/tools/macro_tools.py +412 -0
- aria_code/tools/notification_tools.py +249 -0
- aria_code/tools/project_tools.py +525 -0
- aria_code/tools/realty_data_tools.py +662 -0
- aria_code/tools/spreadsheet_tools.py +399 -0
- aria_code/tools/stripe_tools.py +115 -0
- aria_code/tools/video_tools.py +500 -0
- aria_code/training/__init__.py +1 -0
- aria_code/training/compare.py +117 -0
- aria_code/training/prelude_commands.py +111 -0
- aria_code/training/prelude_eval.py +390 -0
- aria_code/training/prelude_real.py +183 -0
- aria_code/training/prelude_train.py +248 -0
- aria_code/training/sft_dataset.py +230 -0
- aria_code/training/trajectory_dataset.py +263 -0
- aria_code/ui/__init__.py +105 -0
- aria_code/ui/banner.py +404 -0
- aria_code/ui/completer.py +571 -0
- aria_code/ui/console.py +285 -0
- aria_code/ui/input_box.py +505 -0
- aria_code/ui/mentions.py +206 -0
- aria_code/ui/picker.py +248 -0
- aria_code/ui/render/__init__.py +11 -0
- aria_code/ui/render/actions.py +297 -0
- aria_code/ui/render/finance.py +1732 -0
- aria_code/ui/render/market.py +253 -0
- aria_code/ui/render/output.py +954 -0
- aria_code/ui/render/responsive.py +75 -0
- aria_code/ui/render/team.py +367 -0
- aria_code/ui/robot.py +239 -0
- aria_code/ui/startup_dashboard.py +110 -0
- aria_code/video_analysis.py +147 -0
- aria_code/video_editor.py +518 -0
- aria_code/video_workflow/__init__.py +8 -0
- aria_code/video_workflow/__main__.py +61 -0
- aria_code/video_workflow/engines/__init__.py +18 -0
- aria_code/video_workflow/engines/base.py +69 -0
- aria_code/video_workflow/engines/custom_model.py +204 -0
- aria_code/video_workflow/engines/google_veo.py +94 -0
- aria_code/video_workflow/engines/local_engine.py +71 -0
- aria_code/video_workflow/engines/registry.py +98 -0
- aria_code/video_workflow/google_models.py +278 -0
- aria_code/video_workflow/music/__init__.py +5 -0
- aria_code/video_workflow/music/foley_service.py +132 -0
- aria_code/video_workflow/music/service.py +212 -0
- aria_code/video_workflow/pipeline.py +620 -0
- aria_code/video_workflow/plan.py +202 -0
- aria_code/video_workflow/session.py +297 -0
- aria_code/workspace/__init__.py +6 -0
- aria_code/workspace/files.py +219 -0
- aria_code/workspace/verify.py +167 -0
- aria_code/workspace_changes.py +199 -0
- aria_code/workspace_service.py +196 -0
- aria_code/workspace_tools.py +150 -0
- aria_code-0.167.0.dist-info/METADATA +330 -0
- aria_code-0.167.0.dist-info/RECORD +601 -0
- aria_code-0.167.0.dist-info/WHEEL +5 -0
- aria_code-0.167.0.dist-info/entry_points.txt +5 -0
- aria_code-0.167.0.dist-info/licenses/LICENSE +201 -0
- aria_code-0.167.0.dist-info/licenses/NOTICE +49 -0
- aria_code-0.167.0.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"""Describe how Aria packages should be exposed over MCP."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from typing import Dict, List
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@dataclass(frozen=True)
|
|
10
|
+
class MCPExposure:
|
|
11
|
+
name: str
|
|
12
|
+
target: str
|
|
13
|
+
description: str
|
|
14
|
+
read_only: bool = True
|
|
15
|
+
|
|
16
|
+
def to_tool_descriptor(self) -> Dict[str, object]:
|
|
17
|
+
return {
|
|
18
|
+
"name": self.name,
|
|
19
|
+
"description": self.description,
|
|
20
|
+
"target": self.target,
|
|
21
|
+
"read_only": self.read_only,
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def default_exposures() -> List[MCPExposure]:
|
|
26
|
+
"""Initial MCP server surface for Aria Code.
|
|
27
|
+
|
|
28
|
+
These names are stable contracts. The server implementation can bind them
|
|
29
|
+
to ToolRegistry/AgentRegistry without changing client-facing tool names.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
return [
|
|
33
|
+
MCPExposure("aria.warehouse.task", "agent:warehouse_navigation",
|
|
34
|
+
"Delegate a bounded simulation goal to the stateful warehouse task agent; it observes, plans, executes, replans and verifies. No hardware connection.", read_only=False),
|
|
35
|
+
MCPExposure("aria.market.quote", "tool:get_market_data", "Fetch quote and technical market snapshot."),
|
|
36
|
+
MCPExposure("aria.agent.team", "agent:team", "Run multi-agent financial research."),
|
|
37
|
+
MCPExposure("aria.report.generate", "tool:report_generate", "Fetch data + generate a full HTML research report artifact for a symbol.", read_only=False),
|
|
38
|
+
MCPExposure("aria.backtest.run", "tool:backtest_run", "Run a historical strategy simulation (buy_hold or sma_cross) against real price history.", read_only=False),
|
|
39
|
+
# Governance: what Aria knows about a change that another agent does not.
|
|
40
|
+
MCPExposure(
|
|
41
|
+
"aria.risk.assess",
|
|
42
|
+
"infra:risk",
|
|
43
|
+
"How risky is this action? Give a shell `command` (or a `tool` and its `params`) and get "
|
|
44
|
+
"its level L0-L4, the capabilities it uses (filesystem.write, package.install, git.push, "
|
|
45
|
+
"cloud.deploy, hardware.flash, actuator.command, ...), whether it can be undone, what it "
|
|
46
|
+
"reaches (hosts, files, systems) and whether it needs approval. Read-only: nothing runs.",
|
|
47
|
+
),
|
|
48
|
+
MCPExposure(
|
|
49
|
+
"aria.contract.check",
|
|
50
|
+
"infra:contract",
|
|
51
|
+
"Would the project's change contract (.aria/policy.yaml) allow this tool call? Returns "
|
|
52
|
+
"allowed/blocked with the rule that decided it, and the contract in force. A project with "
|
|
53
|
+
"no contract allows everything; one whose policy cannot be read allows reads only. Read-only.",
|
|
54
|
+
),
|
|
55
|
+
MCPExposure(
|
|
56
|
+
"aria.project.impact",
|
|
57
|
+
"infra:impact",
|
|
58
|
+
"What does changing these files or symbols reach? Dependents, tests and the services that "
|
|
59
|
+
"ship them, from the project's import graph. Use before editing code others depend on. Read-only.",
|
|
60
|
+
),
|
|
61
|
+
MCPExposure(
|
|
62
|
+
"aria.project.commands",
|
|
63
|
+
"infra:commands",
|
|
64
|
+
"The project's own test, build, lint and simulation commands (from .aria/project.yaml, ROS 2 "
|
|
65
|
+
"packages, package.json, Cargo.toml, go.mod, pyproject.toml or Makefile targets). Read-only; "
|
|
66
|
+
"nothing is run and nothing is guessed.",
|
|
67
|
+
),
|
|
68
|
+
MCPExposure("aria.artifacts.list", "infra:artifacts", "List local generated artifacts."),
|
|
69
|
+
MCPExposure(
|
|
70
|
+
"aria.skill.list",
|
|
71
|
+
"infra:skills",
|
|
72
|
+
"List the installed portable SKILL.md workflows — reusable expert playbooks "
|
|
73
|
+
"for design, research, and engineering tasks (e.g. UI design systems, "
|
|
74
|
+
"anti-generic-AI-look UI critique, trading-app patterns, equity research, "
|
|
75
|
+
"backtest validation). Pass `query` to rank by relevance to a task "
|
|
76
|
+
"description instead of listing everything.",
|
|
77
|
+
),
|
|
78
|
+
MCPExposure(
|
|
79
|
+
"aria.skill.get",
|
|
80
|
+
"infra:skills",
|
|
81
|
+
"Fetch one skill's full instructions by name (from aria.skill.list). Returns "
|
|
82
|
+
"the SKILL.md workflow text for you to follow yourself — skills are "
|
|
83
|
+
"instruction documents, not executable tools, so nothing runs server-side. "
|
|
84
|
+
"The response lists any bundled `references` docs; when the instructions tell "
|
|
85
|
+
"you to read one, call this again with `reference` set to that filename.",
|
|
86
|
+
),
|
|
87
|
+
MCPExposure("aria.broker.positions", "tool:broker_positions", "Read account info + positions for a configured broker."),
|
|
88
|
+
MCPExposure("aria.broker.list_previews", "tool:broker_list_previews", "List recent order previews, including TradingView-triggered ones."),
|
|
89
|
+
MCPExposure(
|
|
90
|
+
"aria.broker.preview_order",
|
|
91
|
+
"tool:broker_preview_order",
|
|
92
|
+
"Build a risk-checked order preview. Never executes a trade by itself — "
|
|
93
|
+
"actual execution needs either a human running /trade confirm in the aria-code "
|
|
94
|
+
"terminal, or aria.broker.confirm_order if the user explicitly opted that broker "
|
|
95
|
+
"into chat-confirmed execution (off by default; see aria.broker.confirm_order).",
|
|
96
|
+
read_only=False,
|
|
97
|
+
),
|
|
98
|
+
MCPExposure(
|
|
99
|
+
"aria.broker.confirm_order",
|
|
100
|
+
"tool:broker_confirm_order",
|
|
101
|
+
"Execute a previously built order preview — REAL MONEY. Refuses unless the user "
|
|
102
|
+
"already ran /trade allow-chat-confirm <broker_id> in the aria-code terminal "
|
|
103
|
+
"themselves (a real trade cannot be confirmed for the first time from chat; that "
|
|
104
|
+
"opt-in can only happen at the terminal keyboard) AND this call passes confirmed=true.",
|
|
105
|
+
read_only=False,
|
|
106
|
+
),
|
|
107
|
+
MCPExposure(
|
|
108
|
+
"aria.report.chart",
|
|
109
|
+
"tool:report_chart",
|
|
110
|
+
"Generate a candlestick + moving-average chart PNG for a symbol.",
|
|
111
|
+
read_only=False,
|
|
112
|
+
),
|
|
113
|
+
MCPExposure(
|
|
114
|
+
"aria.report.indicator_chart",
|
|
115
|
+
"tool:report_indicator_chart",
|
|
116
|
+
"Generate a candlestick + volume + RSI(14) + MACD(12,26,9) multi-panel chart "
|
|
117
|
+
"PNG for a symbol — for when you need the indicators plotted, not just price.",
|
|
118
|
+
read_only=False,
|
|
119
|
+
),
|
|
120
|
+
MCPExposure(
|
|
121
|
+
"aria.report.comparison_chart",
|
|
122
|
+
"tool:report_comparison_chart",
|
|
123
|
+
"Generate a normalized (base=100) % return comparison chart PNG across 2+ symbols.",
|
|
124
|
+
read_only=False,
|
|
125
|
+
),
|
|
126
|
+
MCPExposure(
|
|
127
|
+
"aria.report.allocation_chart",
|
|
128
|
+
"tool:report_allocation_chart",
|
|
129
|
+
"Generate a pie chart PNG of a broker account's position weights by market value.",
|
|
130
|
+
read_only=False,
|
|
131
|
+
),
|
|
132
|
+
MCPExposure(
|
|
133
|
+
"aria.report.pdf",
|
|
134
|
+
"tool:report_pdf",
|
|
135
|
+
"Render Markdown text to a styled PDF report.",
|
|
136
|
+
read_only=False,
|
|
137
|
+
),
|
|
138
|
+
MCPExposure(
|
|
139
|
+
"aria.report.canva_upload_asset",
|
|
140
|
+
"tool:canva_upload_asset",
|
|
141
|
+
"Upload a local image (e.g. a chart PNG from aria.report.chart) to Canva and "
|
|
142
|
+
"return its asset_id, for use in aria.report.canva_design's data field. "
|
|
143
|
+
"Requires /canva connect to have been run first.",
|
|
144
|
+
read_only=False,
|
|
145
|
+
),
|
|
146
|
+
MCPExposure(
|
|
147
|
+
"aria.report.estimate_image_cost",
|
|
148
|
+
"tool:openai_estimate_image_cost",
|
|
149
|
+
"Get an illustrative per-image cost estimate (USD) for OpenAI's gpt-image-1 "
|
|
150
|
+
"at a given size/quality, before generating. Free, no API call to OpenAI.",
|
|
151
|
+
),
|
|
152
|
+
MCPExposure(
|
|
153
|
+
"aria.report.generate_image",
|
|
154
|
+
"tool:openai_generate_image",
|
|
155
|
+
"Generate a new image from a text prompt (e.g. minimal-editorial-poster's "
|
|
156
|
+
"compiled prompt) via OpenAI's gpt-image-1. Real per-call cost, billed by "
|
|
157
|
+
"OpenAI the instant this succeeds — requires confirmed=true, and calling "
|
|
158
|
+
"aria.report.estimate_image_cost first is strongly recommended. Requires an "
|
|
159
|
+
"OpenAI API key (/apikey set openai sk-... or OPENAI_API_KEY).",
|
|
160
|
+
read_only=False,
|
|
161
|
+
),
|
|
162
|
+
MCPExposure(
|
|
163
|
+
"aria.report.edit_image",
|
|
164
|
+
"tool:openai_edit_image",
|
|
165
|
+
"Transform an existing local photo per a text prompt (duotone, background "
|
|
166
|
+
"simplification, texture overlay, etc.) via OpenAI's gpt-image-1 edits "
|
|
167
|
+
"endpoint. Pass mask_path for inpainting — a local mask PNG where transparent "
|
|
168
|
+
"areas mark what to edit and opaque areas are left untouched — to constrain "
|
|
169
|
+
"the edit to part of the image instead of the whole thing. Real per-call cost, "
|
|
170
|
+
"billed by OpenAI the instant this succeeds — requires confirmed=true, and "
|
|
171
|
+
"calling aria.report.estimate_image_cost first is strongly recommended. "
|
|
172
|
+
"Requires an OpenAI API key.",
|
|
173
|
+
read_only=False,
|
|
174
|
+
),
|
|
175
|
+
MCPExposure(
|
|
176
|
+
"aria.report.generate_image_local",
|
|
177
|
+
"tool:local_generate_image",
|
|
178
|
+
"Generate a new image from a text prompt entirely locally via a self-hosted "
|
|
179
|
+
"open-weight model (SDXL-Turbo by default) — no API key, no per-call cost, "
|
|
180
|
+
"runs on this machine. Needs the optional 'image_gen' extra installed. "
|
|
181
|
+
"First call for a given model downloads its weights (several GB).",
|
|
182
|
+
read_only=False,
|
|
183
|
+
),
|
|
184
|
+
MCPExposure(
|
|
185
|
+
"aria.report.edit_image_local",
|
|
186
|
+
"tool:local_edit_image",
|
|
187
|
+
"Transform an existing local photo per a text prompt, entirely locally "
|
|
188
|
+
"(image-to-image, no API key). Needs the optional 'image_gen' extra installed.",
|
|
189
|
+
read_only=False,
|
|
190
|
+
),
|
|
191
|
+
MCPExposure(
|
|
192
|
+
"aria.report.canva_design",
|
|
193
|
+
"tool:canva_autofill",
|
|
194
|
+
"Fill a Canva brand template with data and export the design draft. "
|
|
195
|
+
"Requires /canva connect to have been run first.",
|
|
196
|
+
read_only=False,
|
|
197
|
+
),
|
|
198
|
+
MCPExposure("aria.report.docx", "tool:report_docx", "Render Markdown text to an editable Word document.", read_only=False),
|
|
199
|
+
MCPExposure("aria.report.pptx", "tool:report_pptx", "Render Markdown text to an editable slide deck (one slide per heading).", read_only=False),
|
|
200
|
+
MCPExposure("aria.figma.read_file", "tool:figma_read_file", "Read a Figma file's page/frame structure (depth-limited summary, not the full node tree). Read-only — Figma has no API for writing designs."),
|
|
201
|
+
MCPExposure("aria.figma.comments", "tool:figma_comments", "List comments on a Figma file."),
|
|
202
|
+
MCPExposure("aria.video.probe", "tool:video_probe", "Read a video's duration/resolution/codec info."),
|
|
203
|
+
MCPExposure("aria.video.trim", "tool:video_trim", "Cut a [start, end] second range out of a local video.", read_only=False),
|
|
204
|
+
MCPExposure("aria.video.concat", "tool:video_concat", "Concatenate multiple local videos in order.", read_only=False),
|
|
205
|
+
MCPExposure("aria.video.overlay_text", "tool:video_overlay_text", "Burn a text overlay onto a local video (top/bottom/center).", read_only=False),
|
|
206
|
+
MCPExposure("aria.video.overlay_audio", "tool:video_overlay_audio", "Add or replace a local video's audio track.", read_only=False),
|
|
207
|
+
MCPExposure("aria.video.convert", "tool:video_convert", "Convert a local video's format and/or reframe to a target aspect ratio (e.g. 9:16 for vertical).", read_only=False),
|
|
208
|
+
MCPExposure("aria.video.change_speed", "tool:video_change_speed", "Speed up or slow down a local video (pitch-corrected audio).", read_only=False),
|
|
209
|
+
MCPExposure("aria.video.transcribe", "tool:video_transcribe", "Transcribe a local video's speech track entirely locally (faster-whisper, no API key). Needs the optional 'video_analysis' extra installed."),
|
|
210
|
+
MCPExposure("aria.video.detect_scenes", "tool:video_detect_scenes", "Detect scene-cut timestamps in a local video via frame-histogram comparison. Needs the optional 'video' extra (opencv) installed."),
|
|
211
|
+
MCPExposure(
|
|
212
|
+
"aria.video.generate_estimate",
|
|
213
|
+
"tool:video_generate_estimate",
|
|
214
|
+
"Get an illustrative cost estimate (USD) for a cloud AI video generation job on "
|
|
215
|
+
"'kling' or 'runway', before submitting. Free, no API call to the provider.",
|
|
216
|
+
),
|
|
217
|
+
MCPExposure(
|
|
218
|
+
"aria.video.generate_submit",
|
|
219
|
+
"tool:video_generate_submit",
|
|
220
|
+
"Submit a real cloud AI text-to-video generation job on 'kling' or 'runway'. "
|
|
221
|
+
"Real per-request cost (billed by the provider the instant this succeeds) — requires "
|
|
222
|
+
"confirmed=true, and calling aria.video.generate_estimate first is strongly recommended. "
|
|
223
|
+
"Returns a task_id immediately; poll with aria.video.generate_status (generation takes minutes).",
|
|
224
|
+
read_only=False,
|
|
225
|
+
),
|
|
226
|
+
MCPExposure(
|
|
227
|
+
"aria.video.generate_status",
|
|
228
|
+
"tool:video_generate_status",
|
|
229
|
+
"Check a submitted cloud video generation job's status; downloads the result once "
|
|
230
|
+
"succeeded. Checking status costs nothing beyond the original submission.",
|
|
231
|
+
),
|
|
232
|
+
]
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"""Per-server circuit breaker for MCP calls (pure, clock-injectable).
|
|
2
|
+
|
|
3
|
+
The contract's mcp-layer next step calls for per-server failure isolation and
|
|
4
|
+
a reconnect policy. Without it, a dead or wedged MCP server costs every call
|
|
5
|
+
its full request timeout (30s by default) forever — one bad server degrades
|
|
6
|
+
the whole tool loop for the rest of the session.
|
|
7
|
+
|
|
8
|
+
Classic three-state breaker:
|
|
9
|
+
|
|
10
|
+
closed → calls flow; consecutive failures are counted
|
|
11
|
+
open → calls fail fast (no subprocess I/O) until the cooldown elapses
|
|
12
|
+
half_open → after cooldown, exactly one probe call is allowed through;
|
|
13
|
+
success closes the circuit, failure re-opens it for another
|
|
14
|
+
cooldown
|
|
15
|
+
|
|
16
|
+
Pure state machine — no asyncio, no I/O; ``clock`` is injectable so tests
|
|
17
|
+
can drive time deterministically.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import time
|
|
23
|
+
from dataclasses import dataclass, field
|
|
24
|
+
from typing import Callable
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclass
|
|
28
|
+
class ServerCircuit:
|
|
29
|
+
failure_threshold: int = 3
|
|
30
|
+
cooldown_seconds: float = 60.0
|
|
31
|
+
clock: Callable[[], float] = time.monotonic
|
|
32
|
+
|
|
33
|
+
_failures: int = field(default=0, repr=False)
|
|
34
|
+
_open_until: float = field(default=0.0, repr=False)
|
|
35
|
+
_probing: bool = field(default=False, repr=False)
|
|
36
|
+
|
|
37
|
+
@property
|
|
38
|
+
def state(self) -> str:
|
|
39
|
+
if self._failures < self.failure_threshold:
|
|
40
|
+
return "closed"
|
|
41
|
+
if self.clock() < self._open_until:
|
|
42
|
+
return "open"
|
|
43
|
+
return "half_open"
|
|
44
|
+
|
|
45
|
+
@property
|
|
46
|
+
def failures(self) -> int:
|
|
47
|
+
return self._failures
|
|
48
|
+
|
|
49
|
+
def seconds_until_probe(self) -> float:
|
|
50
|
+
return max(0.0, self._open_until - self.clock())
|
|
51
|
+
|
|
52
|
+
def allow_call(self) -> bool:
|
|
53
|
+
"""Whether a call may proceed now (half-open admits a single probe)."""
|
|
54
|
+
s = self.state
|
|
55
|
+
if s == "closed":
|
|
56
|
+
return True
|
|
57
|
+
if s == "open":
|
|
58
|
+
return False
|
|
59
|
+
# half_open: admit one probe at a time
|
|
60
|
+
if self._probing:
|
|
61
|
+
return False
|
|
62
|
+
self._probing = True
|
|
63
|
+
return True
|
|
64
|
+
|
|
65
|
+
def record_success(self) -> None:
|
|
66
|
+
self._failures = 0
|
|
67
|
+
self._open_until = 0.0
|
|
68
|
+
self._probing = False
|
|
69
|
+
|
|
70
|
+
def record_failure(self) -> None:
|
|
71
|
+
self._failures += 1
|
|
72
|
+
self._probing = False
|
|
73
|
+
if self._failures >= self.failure_threshold:
|
|
74
|
+
self._open_until = self.clock() + self.cooldown_seconds
|
|
75
|
+
|
|
76
|
+
def describe(self) -> str:
|
|
77
|
+
s = self.state
|
|
78
|
+
if s == "open":
|
|
79
|
+
return f"open ({self._failures} consecutive failures; probe in {self.seconds_until_probe():.0f}s)"
|
|
80
|
+
if s == "half_open":
|
|
81
|
+
return f"half_open ({self._failures} consecutive failures; probing)"
|
|
82
|
+
return f"closed ({self._failures} recent failures)"
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"""MCP configuration helpers for Aria and Arthera package bridges."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import os
|
|
7
|
+
import sys
|
|
8
|
+
import tempfile
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Any, Dict, List, Optional
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def financial_service_server_config(python: Path) -> Dict[str, object]:
|
|
14
|
+
"""A separately installed finance service; never install or run code here."""
|
|
15
|
+
python = Path(python).expanduser()
|
|
16
|
+
if not python.is_absolute() or not python.is_file():
|
|
17
|
+
raise ValueError("Provide an absolute path to the financial-service Python interpreter")
|
|
18
|
+
# -I (isolated mode): the server is spawned in the user's workspace, and a
|
|
19
|
+
# plain `-m` puts the current directory first on sys.path, so a planted
|
|
20
|
+
# arthera_finance/ or a stdlib-named .py there would run in its place. -I
|
|
21
|
+
# also ignores PYTHON* variables and the user site directory.
|
|
22
|
+
#
|
|
23
|
+
# No "env": an entry here overrides the host's environment, so a pinned
|
|
24
|
+
# FINANCIAL_SERVICE_NETWORK=0 meant market data and brokers could never be
|
|
25
|
+
# enabled. The service itself defaults to offline; the host decides.
|
|
26
|
+
return {"name": "arthera-finance", "command": str(python),
|
|
27
|
+
"args": ["-I", "-m", "arthera_finance.server"],
|
|
28
|
+
"description": "Shared financial analysis and simulation; offline by default",
|
|
29
|
+
"enabled": True}
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def install_financial_service_config(path: Path, python: Path) -> Path:
|
|
33
|
+
"""Explicit host operation: preserve other servers and replace config atomically."""
|
|
34
|
+
server = financial_service_server_config(python)
|
|
35
|
+
path = Path(path)
|
|
36
|
+
existing = json.loads(path.read_text(encoding="utf-8")) if path.exists() else {"servers": []}
|
|
37
|
+
if (not isinstance(existing, dict) or not isinstance(existing.get("servers", []), list)
|
|
38
|
+
or any(not isinstance(item, dict) for item in existing.get("servers", []))):
|
|
39
|
+
raise ValueError("MCP configuration must contain a list of server objects")
|
|
40
|
+
merged = merge_server_config(existing, server)
|
|
41
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
42
|
+
temporary = None
|
|
43
|
+
try:
|
|
44
|
+
with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", dir=path.parent,
|
|
45
|
+
prefix=".finance-mcp-", delete=False) as stream:
|
|
46
|
+
temporary = Path(stream.name)
|
|
47
|
+
json.dump(merged, stream, ensure_ascii=False, indent=2)
|
|
48
|
+
stream.write("\n")
|
|
49
|
+
stream.flush()
|
|
50
|
+
os.fsync(stream.fileno())
|
|
51
|
+
os.replace(temporary, path)
|
|
52
|
+
finally:
|
|
53
|
+
if temporary is not None:
|
|
54
|
+
temporary.unlink(missing_ok=True)
|
|
55
|
+
return path
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def arthera_quant_engine_server_config(
|
|
59
|
+
arthera_root: Optional[Path] = None,
|
|
60
|
+
) -> Dict[str, object]:
|
|
61
|
+
"""Return a ready-to-write MCP server entry for Arthera QuantEngine."""
|
|
62
|
+
|
|
63
|
+
configured = arthera_root or os.getenv("ARTHERA_ROOT", "").strip()
|
|
64
|
+
if not configured:
|
|
65
|
+
raise ValueError("The private backend bridge requires an explicit ARTHERA_ROOT; use /finance setup for the standalone financial-service.")
|
|
66
|
+
root = Path(configured).expanduser()
|
|
67
|
+
if not root.is_absolute():
|
|
68
|
+
raise ValueError("ARTHERA_ROOT must be an absolute path.")
|
|
69
|
+
server = root / "packages" / "quant_engine" / "mcp_server.py"
|
|
70
|
+
configured_python = os.getenv("ARTHERA_MCP_PYTHON", "").strip()
|
|
71
|
+
candidates = [
|
|
72
|
+
Path(configured_python).expanduser() if configured_python else None,
|
|
73
|
+
root / ".venv-mcp" / "bin" / "python",
|
|
74
|
+
root / ".venv" / "bin" / "python",
|
|
75
|
+
Path(sys.executable),
|
|
76
|
+
]
|
|
77
|
+
python = next((path for path in candidates if path and path.exists()), Path("python3"))
|
|
78
|
+
return {
|
|
79
|
+
"name": "arthera_quant_engine",
|
|
80
|
+
"command": str(python),
|
|
81
|
+
"args": [str(server)],
|
|
82
|
+
"env": {"PYTHONPATH": str(root), "PYTHONUNBUFFERED": "1"},
|
|
83
|
+
"description": "Arthera QuantEngine tools exposed through MCP",
|
|
84
|
+
"enabled": True,
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def merge_server_config(existing: Dict[str, object], server: Dict[str, object]) -> Dict[str, object]:
|
|
89
|
+
"""Return config with server upserted by name."""
|
|
90
|
+
|
|
91
|
+
servers = list(existing.get("servers") or [])
|
|
92
|
+
name = server.get("name")
|
|
93
|
+
out = []
|
|
94
|
+
replaced = False
|
|
95
|
+
for item in servers:
|
|
96
|
+
item_name = item.get("name") if isinstance(item, dict) else None
|
|
97
|
+
is_legacy_arthera = name == "arthera_quant_engine" and item_name == "quant_engine"
|
|
98
|
+
if isinstance(item, dict) and (item_name == name or is_legacy_arthera):
|
|
99
|
+
if not replaced:
|
|
100
|
+
out.append(server)
|
|
101
|
+
replaced = True
|
|
102
|
+
else:
|
|
103
|
+
out.append(item)
|
|
104
|
+
if not replaced:
|
|
105
|
+
out.append(server)
|
|
106
|
+
return {**existing, "servers": out}
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def load_mcp_config(path: Path) -> Dict[str, object]:
|
|
110
|
+
if not path.exists():
|
|
111
|
+
return {"servers": []}
|
|
112
|
+
try:
|
|
113
|
+
return json.loads(path.read_text(encoding="utf-8"))
|
|
114
|
+
except Exception:
|
|
115
|
+
return {"servers": []}
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def write_mcp_config(path: Path, config: Dict[str, object]) -> Path:
|
|
119
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
120
|
+
path.write_text(json.dumps(config, ensure_ascii=False, indent=2), encoding="utf-8")
|
|
121
|
+
return path
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def find_server_config(config: Dict[str, object], name: str) -> Optional[Dict[str, object]]:
|
|
125
|
+
for item in config.get("servers") or []:
|
|
126
|
+
if isinstance(item, dict) and item.get("name") == name:
|
|
127
|
+
return item
|
|
128
|
+
return None
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def mcp_server_status(
|
|
132
|
+
config_path: Path,
|
|
133
|
+
server_name: str = "arthera_quant_engine",
|
|
134
|
+
runtime_status: Optional[List[Dict[str, Any]]] = None,
|
|
135
|
+
) -> Dict[str, Any]:
|
|
136
|
+
"""Return config/file/runtime status for a configured MCP server."""
|
|
137
|
+
|
|
138
|
+
config = load_mcp_config(config_path)
|
|
139
|
+
server = find_server_config(config, server_name)
|
|
140
|
+
runtime = None
|
|
141
|
+
for item in runtime_status or []:
|
|
142
|
+
if item.get("name") == server_name:
|
|
143
|
+
runtime = item
|
|
144
|
+
break
|
|
145
|
+
|
|
146
|
+
server_path = None
|
|
147
|
+
if server:
|
|
148
|
+
args = server.get("args") or []
|
|
149
|
+
if args:
|
|
150
|
+
server_path = Path(str(args[0])).expanduser()
|
|
151
|
+
|
|
152
|
+
return {
|
|
153
|
+
"name": server_name,
|
|
154
|
+
"config_path": str(config_path),
|
|
155
|
+
"configured": server is not None,
|
|
156
|
+
"server_path": str(server_path) if server_path else "",
|
|
157
|
+
"server_file_exists": bool(server_path and server_path.exists()),
|
|
158
|
+
"running": bool(runtime and runtime.get("running")),
|
|
159
|
+
"tool_count": int(runtime.get("tool_count", 0)) if runtime else 0,
|
|
160
|
+
"tools": list(runtime.get("tools", [])) if runtime else [],
|
|
161
|
+
"description": (server or {}).get("description", ""),
|
|
162
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"""
|
|
2
|
+
src/aria_code/packages/aria_mcp/installer.py — One-Click MCP Config Installer for VS Code & Cursor
|
|
3
|
+
==================================================================================================
|
|
4
|
+
Automatically detects and registers aria-code MCP server into:
|
|
5
|
+
1. VS Code / VS Code Insiders (`settings.json` or `.vscode/mcp.json`)
|
|
6
|
+
2. Cursor IDE (`settings.json`)
|
|
7
|
+
3. Claude Desktop (`claude_desktop_config.json`)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import json
|
|
13
|
+
import os
|
|
14
|
+
import platform
|
|
15
|
+
import sys
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from typing import Any, Dict, Optional, Tuple
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def get_ide_config_paths() -> Dict[str, Path]:
|
|
21
|
+
"""Return standard config paths by platform."""
|
|
22
|
+
home = Path.home()
|
|
23
|
+
system = platform.system()
|
|
24
|
+
|
|
25
|
+
if system == "Darwin": # macOS
|
|
26
|
+
return {
|
|
27
|
+
"vscode": home / "Library" / "Application Support" / "Code" / "User" / "settings.json",
|
|
28
|
+
"cursor": home / "Library" / "Application Support" / "Cursor" / "User" / "settings.json",
|
|
29
|
+
"claude": home / "Library" / "Application Support" / "Claude" / "claude_desktop_config.json",
|
|
30
|
+
}
|
|
31
|
+
elif system == "Windows":
|
|
32
|
+
appdata = Path(os.environ.get("APPDATA", str(home / "AppData" / "Roaming")))
|
|
33
|
+
return {
|
|
34
|
+
"vscode": appdata / "Code" / "User" / "settings.json",
|
|
35
|
+
"cursor": appdata / "Cursor" / "User" / "settings.json",
|
|
36
|
+
"claude": appdata / "Claude" / "claude_desktop_config.json",
|
|
37
|
+
}
|
|
38
|
+
else: # Linux
|
|
39
|
+
config_dir = Path(os.environ.get("XDG_CONFIG_HOME", str(home / ".config")))
|
|
40
|
+
return {
|
|
41
|
+
"vscode": config_dir / "Code" / "User" / "settings.json",
|
|
42
|
+
"cursor": config_dir / "Cursor" / "User" / "settings.json",
|
|
43
|
+
"claude": config_dir / "Claude" / "claude_desktop_config.json",
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def generate_mcp_entry(server_path: Optional[str] = None) -> Dict[str, Any]:
|
|
48
|
+
"""Generate canonical MCP server registration block."""
|
|
49
|
+
if not server_path:
|
|
50
|
+
# Default to invoking aria-code via sys.executable or command
|
|
51
|
+
return {
|
|
52
|
+
"command": "aria-code",
|
|
53
|
+
"args": ["mcp"],
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
"command": sys.executable,
|
|
57
|
+
"args": [server_path],
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def install_mcp_to_target(target: str = "vscode", custom_path: Optional[Path] = None) -> Tuple[bool, str]:
|
|
62
|
+
"""
|
|
63
|
+
Install aria-code MCP configuration to specified target editor.
|
|
64
|
+
Returns (success, status_message).
|
|
65
|
+
"""
|
|
66
|
+
paths = get_ide_config_paths()
|
|
67
|
+
config_file = custom_path or paths.get(target.lower())
|
|
68
|
+
|
|
69
|
+
if not config_file:
|
|
70
|
+
return False, f"Unknown target: {target}. Valid targets: vscode, cursor, claude"
|
|
71
|
+
|
|
72
|
+
try:
|
|
73
|
+
config_file.parent.mkdir(parents=True, exist_ok=True)
|
|
74
|
+
data: Dict[str, Any] = {}
|
|
75
|
+
if config_file.exists():
|
|
76
|
+
try:
|
|
77
|
+
with open(config_file, "r", encoding="utf-8") as f:
|
|
78
|
+
content = f.read().strip()
|
|
79
|
+
if content:
|
|
80
|
+
data = json.loads(content)
|
|
81
|
+
except Exception as e:
|
|
82
|
+
return False, f"Failed to parse existing JSON in {config_file}: {e}"
|
|
83
|
+
|
|
84
|
+
# Insert or update mcpServers dict
|
|
85
|
+
if "mcpServers" not in data:
|
|
86
|
+
data["mcpServers"] = {}
|
|
87
|
+
|
|
88
|
+
data["mcpServers"]["aria-code"] = generate_mcp_entry()
|
|
89
|
+
|
|
90
|
+
with open(config_file, "w", encoding="utf-8") as f:
|
|
91
|
+
json.dump(data, f, indent=2, ensure_ascii=False)
|
|
92
|
+
|
|
93
|
+
return True, f"Successfully registered aria-code MCP server to {config_file}"
|
|
94
|
+
except Exception as e:
|
|
95
|
+
return False, f"Error writing to {config_file}: {e}"
|