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,125 @@
|
|
|
1
|
+
"""Read-only, token-bounded tools for the Aria research ADK agent."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from dataclasses import asdict, is_dataclass
|
|
7
|
+
from typing import Any, Callable, Dict
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _as_dict(value: Any) -> Dict[str, Any]:
|
|
14
|
+
if isinstance(value, dict):
|
|
15
|
+
return dict(value)
|
|
16
|
+
if is_dataclass(value):
|
|
17
|
+
return asdict(value)
|
|
18
|
+
if hasattr(value, "__dict__"):
|
|
19
|
+
return dict(value.__dict__)
|
|
20
|
+
return {}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _compact(value: Any, *, depth: int = 0) -> Any:
|
|
24
|
+
"""Make a small JSON-safe representation suitable for an LLM tool result."""
|
|
25
|
+
if depth > 3:
|
|
26
|
+
return str(value)[:240]
|
|
27
|
+
if isinstance(value, dict):
|
|
28
|
+
return {str(k): _compact(v, depth=depth + 1) for k, v in list(value.items())[:32]}
|
|
29
|
+
if isinstance(value, (list, tuple)):
|
|
30
|
+
return [_compact(v, depth=depth + 1) for v in list(value)[:12]]
|
|
31
|
+
if isinstance(value, (str, int, float, bool)) or value is None:
|
|
32
|
+
return value
|
|
33
|
+
return str(value)[:240]
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class MarketResearchTools:
|
|
37
|
+
"""Expose data-service capabilities without exposing its mutable internals.
|
|
38
|
+
|
|
39
|
+
``service_factory`` is injectable so tests and future deployments can use a
|
|
40
|
+
remote Arthera service instead of importing the local market client.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
def __init__(self, service_factory: Callable[[], Any] | None = None) -> None:
|
|
44
|
+
self._service_factory = service_factory or self._default_service
|
|
45
|
+
|
|
46
|
+
@staticmethod
|
|
47
|
+
def _default_service() -> Any:
|
|
48
|
+
from data_service import DataService
|
|
49
|
+
|
|
50
|
+
return DataService()
|
|
51
|
+
|
|
52
|
+
def get_market_snapshot(self, symbol: str) -> Dict[str, Any]:
|
|
53
|
+
"""Return a current, read-only market snapshot for one symbol.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
symbol: Ticker, A-share code, or crypto pair, e.g. ``AAPL``,
|
|
57
|
+
``000300.SS``, or ``BTC/USDT``.
|
|
58
|
+
"""
|
|
59
|
+
symbol = str(symbol or "").strip().upper()
|
|
60
|
+
if not symbol or len(symbol) > 32:
|
|
61
|
+
return {"success": False, "error": "A valid symbol of up to 32 characters is required."}
|
|
62
|
+
|
|
63
|
+
try:
|
|
64
|
+
# ``bundle`` is Aria's public normalized aggregate. Keep the ADK
|
|
65
|
+
# contract independent of the underlying service method name.
|
|
66
|
+
result = self._service_factory().bundle(symbol)
|
|
67
|
+
payload = _as_dict(result)
|
|
68
|
+
status = str(payload.get("status") or payload.get("quality", {}).get("status") or "")
|
|
69
|
+
return {
|
|
70
|
+
"success": status in {"complete", "partial", "stale"},
|
|
71
|
+
"symbol": symbol,
|
|
72
|
+
"as_of": payload.get("as_of") or payload.get("timestamp"),
|
|
73
|
+
"quote": _compact(payload.get("quote", {})),
|
|
74
|
+
"fundamentals": _compact(payload.get("fundamentals", {})),
|
|
75
|
+
"technical": _compact(payload.get("technical", {})),
|
|
76
|
+
"quality": _compact(payload.get("quality", {})),
|
|
77
|
+
"status": status or "data_unavailable",
|
|
78
|
+
"warnings": _compact(payload.get("warnings", [])),
|
|
79
|
+
"errors": _compact(payload.get("errors", [])),
|
|
80
|
+
"disclaimer": "Market data may be delayed or unavailable; verify before acting.",
|
|
81
|
+
}
|
|
82
|
+
except Exception as exc: # Tool errors must be factual and non-fatal to the agent turn.
|
|
83
|
+
# Provider exceptions can include URLs, headers or other diagnostics.
|
|
84
|
+
# Keep those in the local log; the agent gets a stable public error.
|
|
85
|
+
logger.warning("Market snapshot unavailable for %s: %s", symbol, exc)
|
|
86
|
+
return {
|
|
87
|
+
"success": False,
|
|
88
|
+
"symbol": symbol,
|
|
89
|
+
"error": "Market snapshot is temporarily unavailable.",
|
|
90
|
+
"retryable": True,
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
def get_market_data_health(self) -> Dict[str, Any]:
|
|
94
|
+
"""Return product-safe current data-provider health.
|
|
95
|
+
|
|
96
|
+
This endpoint intentionally exposes only an aggregate health summary.
|
|
97
|
+
It can be rendered directly in the UI or used by an agent to decide
|
|
98
|
+
whether to retry, without leaking credentials, endpoints, provider
|
|
99
|
+
names, or raw provider exceptions.
|
|
100
|
+
"""
|
|
101
|
+
try:
|
|
102
|
+
from packages.aria_services.provider_health import GLOBAL_PROVIDER_HEALTH
|
|
103
|
+
|
|
104
|
+
public_status = GLOBAL_PROVIDER_HEALTH.public_status("market_data")
|
|
105
|
+
summary = GLOBAL_PROVIDER_HEALTH.summary()
|
|
106
|
+
|
|
107
|
+
return {
|
|
108
|
+
"success": True,
|
|
109
|
+
"status": _compact(public_status.to_dict()),
|
|
110
|
+
"health": {
|
|
111
|
+
"total": summary.total,
|
|
112
|
+
"available": summary.ok,
|
|
113
|
+
"degraded": summary.warn,
|
|
114
|
+
"unavailable": summary.err,
|
|
115
|
+
"cooldown": summary.cooldown,
|
|
116
|
+
},
|
|
117
|
+
"note": "Status updates after the first market-data request in this process.",
|
|
118
|
+
}
|
|
119
|
+
except Exception as exc:
|
|
120
|
+
logger.warning("Provider health unavailable: %s", exc)
|
|
121
|
+
return {
|
|
122
|
+
"success": False,
|
|
123
|
+
"error": "Provider health is temporarily unavailable.",
|
|
124
|
+
"retryable": True,
|
|
125
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"""Agent manifests built from the existing AgentRegistry."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass, field
|
|
6
|
+
from typing import Any, Dict, List, Type
|
|
7
|
+
|
|
8
|
+
from aria_code.agents.base import BaseAgent
|
|
9
|
+
from aria_code.agents.registry import get_registry
|
|
10
|
+
from aria_code.packages.aria_core import CapabilityManifest, PermissionLevel, ServiceKind
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
_CAPABILITIES_BY_AGENT = {
|
|
14
|
+
"technical": ["market.history", "market.technical"],
|
|
15
|
+
"fundamental": ["market.fundamentals", "filings"],
|
|
16
|
+
"macro": ["macro.data", "news"],
|
|
17
|
+
"risk": ["market.history", "portfolio.risk", "compliance.check"],
|
|
18
|
+
"news": ["news"],
|
|
19
|
+
"catalyst": ["news", "events"],
|
|
20
|
+
"sector": ["market.sector"],
|
|
21
|
+
"earnings": ["filings", "events"],
|
|
22
|
+
"portfolio": ["portfolio"],
|
|
23
|
+
"synthesis": ["reasoning.synthesis"],
|
|
24
|
+
"debate": ["reasoning.debate"],
|
|
25
|
+
"coder": ["code.write", "code.edit", "file.io"],
|
|
26
|
+
"tester": ["code.test", "code.compile", "command.execute"],
|
|
27
|
+
"debugger": ["code.debug", "code.self_heal", "traceback.analyze"],
|
|
28
|
+
"strategist": ["quant.strategy", "factor.selection", "portfolio.allocation"],
|
|
29
|
+
"corporate_finance": ["finance.statements", "dupont.analysis", "working_capital.cycle", "solvency.z_score"],
|
|
30
|
+
"cashflow_burn": ["cashflow.runway", "burn_rate.analysis", "ar.aging"],
|
|
31
|
+
"warehouse_logistics_cost": ["logistics.cost", "freight.billing", "carrier.matrix"],
|
|
32
|
+
"warehouse_fulfillment_leadtime": ["fulfillment.leadtime", "warehouse.sla", "supplychain.bottleneck"],
|
|
33
|
+
"stripe_revenue": ["stripe.revenue", "saas.mrr", "subscription.churn", "dunning.recovery"],
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@dataclass(frozen=True)
|
|
38
|
+
class AgentManifest:
|
|
39
|
+
name: str
|
|
40
|
+
description: str
|
|
41
|
+
builtin: bool
|
|
42
|
+
capabilities: List[str] = field(default_factory=list)
|
|
43
|
+
permissions: List[PermissionLevel] = field(default_factory=lambda: [PermissionLevel.NETWORK])
|
|
44
|
+
output_schema: Dict[str, Any] = field(default_factory=lambda: {
|
|
45
|
+
"type": "object",
|
|
46
|
+
"required": ["agent", "symbol", "analysis", "confidence", "signal"],
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
def manifest(self) -> CapabilityManifest:
|
|
50
|
+
return CapabilityManifest(
|
|
51
|
+
name=self.name,
|
|
52
|
+
kind=ServiceKind.AGENT,
|
|
53
|
+
description=self.description,
|
|
54
|
+
capabilities=self.capabilities,
|
|
55
|
+
permissions=self.permissions,
|
|
56
|
+
output_schema=self.output_schema,
|
|
57
|
+
tags=["agent"],
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def manifest_from_agent_class(cls: Type[BaseAgent], *, builtin: bool = True) -> AgentManifest:
|
|
62
|
+
name = getattr(cls, "name", cls.__name__).lower()
|
|
63
|
+
return AgentManifest(
|
|
64
|
+
name=name,
|
|
65
|
+
description=getattr(cls, "description", ""),
|
|
66
|
+
builtin=builtin,
|
|
67
|
+
capabilities=_CAPABILITIES_BY_AGENT.get(name, ["agent"]),
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def list_agent_manifests() -> List[AgentManifest]:
|
|
72
|
+
registry = get_registry()
|
|
73
|
+
out: List[AgentManifest] = []
|
|
74
|
+
for item in registry.list():
|
|
75
|
+
cls = registry.get(item["name"])
|
|
76
|
+
if cls:
|
|
77
|
+
out.append(manifest_from_agent_class(cls, builtin=bool(item.get("builtin"))))
|
|
78
|
+
return sorted(out, key=lambda item: item.name)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""Core contracts shared by Aria packages."""
|
|
2
|
+
|
|
3
|
+
from .architecture import (
|
|
4
|
+
ARCHITECTURE_SCHEMA_VERSION,
|
|
5
|
+
ArchitectureLayer,
|
|
6
|
+
LayerStatus,
|
|
7
|
+
architecture_contract,
|
|
8
|
+
architecture_gaps,
|
|
9
|
+
architecture_layer_map,
|
|
10
|
+
architecture_status_counts,
|
|
11
|
+
list_architecture_layers,
|
|
12
|
+
required_architecture_layer_names,
|
|
13
|
+
)
|
|
14
|
+
from .export import build_package_manifest, build_session_diagnostic_bundle, write_package_manifest
|
|
15
|
+
from .manifest import CapabilityManifest, PackageLink, PermissionLevel, ServiceKind
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"ARCHITECTURE_SCHEMA_VERSION",
|
|
19
|
+
"ArchitectureLayer",
|
|
20
|
+
"CapabilityManifest",
|
|
21
|
+
"LayerStatus",
|
|
22
|
+
"PackageLink",
|
|
23
|
+
"PermissionLevel",
|
|
24
|
+
"ServiceKind",
|
|
25
|
+
"architecture_contract",
|
|
26
|
+
"architecture_gaps",
|
|
27
|
+
"architecture_layer_map",
|
|
28
|
+
"architecture_status_counts",
|
|
29
|
+
"build_package_manifest",
|
|
30
|
+
"build_session_diagnostic_bundle",
|
|
31
|
+
"list_architecture_layers",
|
|
32
|
+
"required_architecture_layer_names",
|
|
33
|
+
"write_package_manifest",
|
|
34
|
+
]
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
"""Declarative agent architecture contract for Aria Code.
|
|
2
|
+
|
|
3
|
+
The contract keeps Codex/Claude Code style boundaries explicit while the legacy
|
|
4
|
+
CLI is extracted into smaller packages. It is intentionally pure data so tests,
|
|
5
|
+
doctor checks, docs, and future UI views can share one source of truth.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from dataclasses import asdict, dataclass, field
|
|
11
|
+
from enum import Enum
|
|
12
|
+
from typing import Any, Dict, List, Tuple
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class LayerStatus(str, Enum):
|
|
16
|
+
DONE = "done"
|
|
17
|
+
PARTIAL = "partial"
|
|
18
|
+
PLANNED = "planned"
|
|
19
|
+
BLOCKED = "blocked"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass(frozen=True)
|
|
23
|
+
class ArchitectureLayer:
|
|
24
|
+
name: str
|
|
25
|
+
responsibility: str
|
|
26
|
+
target_state: str
|
|
27
|
+
current_state: str
|
|
28
|
+
status: LayerStatus
|
|
29
|
+
source_paths: Tuple[str, ...] = field(default_factory=tuple)
|
|
30
|
+
depends_on: Tuple[str, ...] = field(default_factory=tuple)
|
|
31
|
+
next_steps: Tuple[str, ...] = field(default_factory=tuple)
|
|
32
|
+
blockers: Tuple[str, ...] = field(default_factory=tuple)
|
|
33
|
+
|
|
34
|
+
@property
|
|
35
|
+
def is_complete(self) -> bool:
|
|
36
|
+
return self.status == LayerStatus.DONE
|
|
37
|
+
|
|
38
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
39
|
+
data = asdict(self)
|
|
40
|
+
data["status"] = self.status.value
|
|
41
|
+
return data
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
ARCHITECTURE_SCHEMA_VERSION = "aria.agent-architecture.v1"
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
_ARCHITECTURE_LAYERS: Tuple[ArchitectureLayer, ...] = (
|
|
48
|
+
ArchitectureLayer(
|
|
49
|
+
name="launcher",
|
|
50
|
+
responsibility="Stable executable entrypoint, runtime selection, and dependency bootstrap.",
|
|
51
|
+
target_state="Shell entrypoints resolve the repo, use a controlled virtualenv, and never depend on the caller's random Python.",
|
|
52
|
+
current_state="aria and aria-code bootstrap local dependencies. /doctor runs a python_venv drift check (pyvenv.cfg recorded version vs the running interpreter, and whether the venv's base interpreter still exists — the Homebrew-upgrade breakage); install.sh --rebuild and npm run repair both perform the drift-aware venv rebuild it suggests (repair auto-detects drift via npm/lib/venv.js before reusing an existing venv).",
|
|
53
|
+
status=LayerStatus.PARTIAL,
|
|
54
|
+
source_paths=("aria-code", "install.sh", "doctor.py"),
|
|
55
|
+
next_steps=("Exercise the drift rebuild end-to-end on a real system-Python upgrade, then consider promoting launcher to ok.",),
|
|
56
|
+
),
|
|
57
|
+
ArchitectureLayer(
|
|
58
|
+
name="settings",
|
|
59
|
+
responsibility="Configuration, secrets, model profiles, and permission policy resolution.",
|
|
60
|
+
target_state="A single settings service resolves env, config files, CLI flags, and secrets without leaking credentials.",
|
|
61
|
+
current_state=(
|
|
62
|
+
"packages/aria_services/settings.py exists and apps/cli/config_store.py builds it, but "
|
|
63
|
+
"aria_cli.py and aria_daemon.py are its callers. Two of the three sites this entry "
|
|
64
|
+
"used to name were miscategorised: brokers/config.py owns a different file "
|
|
65
|
+
"(brokers.json, broker credentials) and already writes it owner-only via "
|
|
66
|
+
"packages/aria_core/secure_file.py, and packages/aria_mcp/server.py never reads the "
|
|
67
|
+
"main config at all — it delegates to brokers.config.is_chat_confirm_enabled. The one "
|
|
68
|
+
"real bypass was aria_daemon.py, which built the runtime gateway's config as a dict "
|
|
69
|
+
"literal pinned to Ollama and so never saw the user's configuration: a Vertex/Gemini "
|
|
70
|
+
"user had every channel alert analysed by a local qwen2.5:7b, and a user without "
|
|
71
|
+
"Ollama had the gateway raise on every alert and degrade to the legacy summary at log "
|
|
72
|
+
"level info. It now loads through SettingsService per call, keeping "
|
|
73
|
+
"ARIA_DAEMON_MODEL/OLLAMA_URL as operator overrides; "
|
|
74
|
+
"tests/test_daemon_gateway_config.py pins it and fails on a hardcoded model name."
|
|
75
|
+
),
|
|
76
|
+
status=LayerStatus.PARTIAL,
|
|
77
|
+
source_paths=(
|
|
78
|
+
"packages/aria_services/settings.py",
|
|
79
|
+
"apps/cli/config_store.py",
|
|
80
|
+
"apps/cli/config_paths.py",
|
|
81
|
+
"packages/aria_core/secure_file.py",
|
|
82
|
+
),
|
|
83
|
+
next_steps=(
|
|
84
|
+
"Consider a settings-service entry point for brokers.json so brokers/config.py "
|
|
85
|
+
"stops owning its own load/save pair — it is already secure, so this is "
|
|
86
|
+
"consolidation rather than a fix.",
|
|
87
|
+
),
|
|
88
|
+
),
|
|
89
|
+
ArchitectureLayer(
|
|
90
|
+
name="ui",
|
|
91
|
+
responsibility="Terminal rendering, input UX, progress display, and artifact links.",
|
|
92
|
+
target_state="A thin UI adapter renders compact, resumable, non-repetitive output with graceful plain-terminal fallback.",
|
|
93
|
+
current_state="Terminal streaming and approval prompts now have a CLI runtime event consumer; Rich/prompt_toolkit remain optional and generated-file UX still needs hardening.",
|
|
94
|
+
status=LayerStatus.PARTIAL,
|
|
95
|
+
source_paths=("ui/", "apps/cli/commands/", "apps/cli/runtime_consumer.py"),
|
|
96
|
+
next_steps=("Move generated-file open actions and remaining terminal panels behind a UI service.",),
|
|
97
|
+
),
|
|
98
|
+
ArchitectureLayer(
|
|
99
|
+
name="context",
|
|
100
|
+
responsibility="Conversation memory, context compaction, task continuity, and artifact-backed summaries.",
|
|
101
|
+
target_state="Context is automatically compacted before overflow, with recoverable task state and traceable artifacts.",
|
|
102
|
+
current_state="ContextService owns pressure checks, local compaction, summary prompts, and resume envelopes; /doctor runs a context check and /export bundle carries context_health. Every compaction path (smart, hard, both fallbacks) first persists an aria.context_checkpoint.v1 full-snapshot record (2MB cap, keep-5 per session, 30-day expiry; config keys context_checkpoint_keep / context_checkpoint_max_age_days) via packages.aria_services.context_checkpoints under ~/.arthera/runtime/context_checkpoints/. Of the three places send_message decides that history is too hot, the post-turn char-estimate path honoured neither auto_compact_context nor auto_compact_threshold and hardcoded 90%/70%, so turning auto-compaction off did not turn it off and a 0.95 threshold was overridden by the hidden 0.90; the decision now lives in apps/cli/turn_planning.post_turn_context_decision alongside the other pure per-turn decisions, warning still fires when compaction is disabled, and tests/test_post_turn_context_decision.py covers it.",
|
|
103
|
+
status=LayerStatus.PARTIAL,
|
|
104
|
+
source_paths=("packages/aria_services/context.py", "packages/aria_services/context_checkpoints.py", "apps/cli/message_processing.py", "apps/cli/commands/session_ux_cmds.py"),
|
|
105
|
+
next_steps=("Wire checkpoint restore into the conversation-rewind flow once cmd_rewind lands, so a compaction can be undone from the CLI.",),
|
|
106
|
+
),
|
|
107
|
+
ArchitectureLayer(
|
|
108
|
+
name="runtime",
|
|
109
|
+
responsibility="Agent turn loop, planning, tool execution, retries, streaming, and interruption handling.",
|
|
110
|
+
target_state="Runtime is separate from UI and business services, with typed tool calls, retries, cancellation, and traces.",
|
|
111
|
+
current_state="A public packages.aria_sdk facade owns SDK-style query/result events, provider selection, streaming normalization, and the reusable runtime tool-turn loop; CLI rendering/approval is consumed through apps.cli.runtime_consumer. Every CLI chat turn runs through run_agent via apps.cli.providers.runtime_bridge and runtime.gateway (the inline send_message loop was retired 2026-07 after real-turn validation), with route-aware provider/fallback decisions in apps.cli.providers.chat_routing, per-tool approval and execution context threaded into run_agent's tool loop, and a single direct cloud rescue on runtime failure.",
|
|
112
|
+
status=LayerStatus.PARTIAL,
|
|
113
|
+
source_paths=("aria_cli.py", "runtime/", "packages/aria_sdk/", "apps/cli/runtime_consumer.py", "apps/cli/deterministic.py", "apps/cli/providers/"),
|
|
114
|
+
depends_on=("settings", "tools", "safety", "context"),
|
|
115
|
+
next_steps=(
|
|
116
|
+
"Fold send_message's remaining pre-turn (routing/decomposition/context injection) and post-turn (rendering/history/metrics) sections into testable modules, mirroring turn_planning/prompt_assembly.",
|
|
117
|
+
"Untangle stream_ollama's 12 aria_cli module-global borrowings (45 → 30 → 20 → 12; 47 before "
|
|
118
|
+
"the response cache moved to apps/cli/providers/llm/response_cache.py). Counted with "
|
|
119
|
+
"stdlib symtable rather than a hand-rolled AST walk. The 33 reclaimed are module-level "
|
|
120
|
+
"imports in ollama_stream.py: the rebind merges rather than replaces "
|
|
121
|
+
"(dict(source.__globals__) then .update(globals())), so a name defined there is the base "
|
|
122
|
+
"of the merge, aria_cli still wins on conflict, and the CLI path is untouched while the "
|
|
123
|
+
"fallback path (SDK, daemon) stops dying on it. Each one is checked to be the same "
|
|
124
|
+
"object aria_cli holds. That rule keeps paying: _CONFIRM_TOOLS is excluded because "
|
|
125
|
+
"apps.cli.tool_executor's copy is an empty set() placeholder against aria_cli's real "
|
|
126
|
+
"confirmation set, and it caught aria_cli holding one-line *wrapper* shims over "
|
|
127
|
+
"apps/cli/message_processing.py — a wrapper is a different function object from what it "
|
|
128
|
+
"calls, so the two paths ran different objects until the shims became aliases. "
|
|
129
|
+
"aria_cli also shed code rather than just re-pointing imports: the three offline/greeting "
|
|
130
|
+
"responders moved to apps/cli/providers/llm/offline_responses.py and the sports "
|
|
131
|
+
"prefetch to apps/cli/handlers/sports_handlers.py, each next to the thing whose "
|
|
132
|
+
"failure or domain it belongs to, and eleven wrapper shims became aliases. "
|
|
133
|
+
"ANALYSIS_SYSTEM_PROMPT is the one documented exception to the identity rule: "
|
|
134
|
+
"build_analysis_system_prompt() stamps the date at call time, so the two paths hold "
|
|
135
|
+
"equal strings that are never the same object, asserted by value instead. "
|
|
136
|
+
"Still live for the remaining 12: _ACTIVE_COMMAND_POLICY, _ARIA_BOT_MODE, "
|
|
137
|
+
"_CONFIRM_TOOLS, _HAS_ARIARC, _PROJECT_CONTEXT, execute_local_tool, get_ariarc, "
|
|
138
|
+
"build_tool_system_prompt, _print_tool_result and the three approval/summary "
|
|
139
|
+
"functions — all of them either CLI session state or objects whose aria_cli copy "
|
|
140
|
+
"differs from the extracted module's. "
|
|
141
|
+
"tests/test_ollama_stream_imports.py pins the identity rule and the budget.",
|
|
142
|
+
),
|
|
143
|
+
),
|
|
144
|
+
ArchitectureLayer(
|
|
145
|
+
name="tools",
|
|
146
|
+
responsibility="Tool registry, schemas, permissions, local commands, and MCP adapters.",
|
|
147
|
+
target_state="All tools are manifests with input schema, permission level, owner service, and deterministic output shape.",
|
|
148
|
+
current_state="Legacy tools can be converted to manifests; some direct command paths still bypass the registry.",
|
|
149
|
+
status=LayerStatus.PARTIAL,
|
|
150
|
+
source_paths=("packages/aria_tools/", "tools/"),
|
|
151
|
+
depends_on=("safety",),
|
|
152
|
+
next_steps=("Route new slash commands through tool/service manifests instead of direct CLI functions.",),
|
|
153
|
+
),
|
|
154
|
+
ArchitectureLayer(
|
|
155
|
+
name="services",
|
|
156
|
+
responsibility="Product service boundaries for data, reports, brokers, skills, channels, and gateway.",
|
|
157
|
+
target_state="Business logic lives behind services; CLI, daemon, MCP, and webhooks are adapters.",
|
|
158
|
+
current_state="Required service specs now cover gateway, runtime, settings, context, tools, data, reports, brokers, skills, MCP, safety, and observability; several implementations still sit in legacy modules.",
|
|
159
|
+
status=LayerStatus.PARTIAL,
|
|
160
|
+
source_paths=(
|
|
161
|
+
"packages/aria_services/",
|
|
162
|
+
"docs/architecture/service_boundaries.md",
|
|
163
|
+
),
|
|
164
|
+
depends_on=("settings", "runtime", "tools"),
|
|
165
|
+
next_steps=("Extract concrete SettingsService, SafetyService, ReportService, GatewayService, and ObservabilityService implementations behind the registered service manifests.",),
|
|
166
|
+
),
|
|
167
|
+
ArchitectureLayer(
|
|
168
|
+
name="mcp",
|
|
169
|
+
responsibility="External package/tool integration through MCP and explicit adapters.",
|
|
170
|
+
target_state="MCP servers expose typed tools, health, permissions, and connection status independent of CLI state.",
|
|
171
|
+
current_state="Arthera Quant Engine bridge has manifests and doctor checks; lifecycle management still needs tightening.",
|
|
172
|
+
status=LayerStatus.PARTIAL,
|
|
173
|
+
source_paths=("packages/aria_mcp/",),
|
|
174
|
+
depends_on=("tools", "services"),
|
|
175
|
+
next_steps=("Add MCP reload/reconnect policy, tool provenance, and per-server failure isolation.",),
|
|
176
|
+
),
|
|
177
|
+
ArchitectureLayer(
|
|
178
|
+
name="safety",
|
|
179
|
+
responsibility="Filesystem, shell, network, broker, and privacy guardrails.",
|
|
180
|
+
target_state="Every risky action is classified, previewed when needed, audited, and blocked by default for live trading.",
|
|
181
|
+
current_state=(
|
|
182
|
+
"safety/service.py SafetyService unifies evaluate_tool, evaluate_command, "
|
|
183
|
+
"classify_risk, privacy and trading policy, and is now constructed at its "
|
|
184
|
+
"config-holding call sites: /run and /apply-plan for command policy, /feedback "
|
|
185
|
+
"and /privacy for privacy settings. tests/test_safety_service_adoption.py keeps "
|
|
186
|
+
"apps/cli/commands/ from reaching past it. Two defects were closed on the way: "
|
|
187
|
+
"evaluate_command_policy resolved an unrecognised mode to workspace-write rather "
|
|
188
|
+
"than read-only (so apps/cli/tools/system_tools.py, which defaulted the argument "
|
|
189
|
+
"to the *policy* name \"safe\", silently ran at workspace-write), and the service "
|
|
190
|
+
"returned a PrivacySettings from the bare `privacy` root that was a different "
|
|
191
|
+
"class object from the aria_code.privacy one its callers use. "
|
|
192
|
+
"Still direct, on purpose: apps/cli/tools/ takes explicit params and holds no "
|
|
193
|
+
"config, and apps/cli/tool_executor.py calls the stateless classify_command_risk. "
|
|
194
|
+
"The broker paths are now routed too: /broker status and /trade mode go through "
|
|
195
|
+
"trading_dry_run/trading_policy. brokers/ itself stays direct on purpose — it IS "
|
|
196
|
+
"the trading domain and SafetyService is the facade over it, so a call the other "
|
|
197
|
+
"way would invert the layering. A third defect surfaced here: trading_dry_run "
|
|
198
|
+
"documented the kill switch under a variable name nothing reads, and that "
|
|
199
|
+
"docstring was its only documentation, so following it froze nothing and raised "
|
|
200
|
+
"nothing. tests/test_env_switch_docs.py now checks all 27 ARIA_* names appearing "
|
|
201
|
+
"in docstrings against what the tree actually reads (it also caught aria_daemon.py "
|
|
202
|
+
"advertising an ARIA_API_BASE that never existed; the backend URL is the api_url "
|
|
203
|
+
"config key). Broker preview/confirm and the two-gate chat-confirm gate "
|
|
204
|
+
"are real and in use; credential files are written owner-only via "
|
|
205
|
+
"packages/aria_core/secure_file.py."
|
|
206
|
+
),
|
|
207
|
+
status=LayerStatus.PARTIAL,
|
|
208
|
+
source_paths=("safety/", "brokers/", "apps/cli/commands/broker_cmds.py"),
|
|
209
|
+
depends_on=("settings", "tools"),
|
|
210
|
+
next_steps=(
|
|
211
|
+
"Give SafetyService a privacy setter so /privacy on|off stops constructing "
|
|
212
|
+
"PrivacySettings itself; until it has one, the adoption guard can only forbid "
|
|
213
|
+
"deriving settings from config, not constructing them.",
|
|
214
|
+
),
|
|
215
|
+
),
|
|
216
|
+
ArchitectureLayer(
|
|
217
|
+
name="channels",
|
|
218
|
+
responsibility="Daemon, webhook, TradingView alerts, Feishu, Telegram, and future external entrypoints.",
|
|
219
|
+
target_state="Channels submit structured tasks to gateway/runtime and never call CLI internals directly.",
|
|
220
|
+
current_state="apps/channels now has the channel registry (six channels with direction/capabilities/enable resolution from config+env) and the TradingView adapter: alert payloads become aria.channel_task.v1 structured tasks (passphrase/HMAC verification reused from tradingview_bridge, fail-closed on mismatch, explicit verified/open_mode flags, stable dedup keys, gateway-facing prompt that forbids order placement). The daemon webhook endpoint now refuses open-mode intake from non-loopback clients and runs alert analysis through runtime.gateway.run_turn (tool-less turn; legacy quick summary kept as fallback).",
|
|
221
|
+
status=LayerStatus.PARTIAL,
|
|
222
|
+
source_paths=("aria_daemon.py", "apps/channels/", "apps/cli/tradingview_bridge.py"),
|
|
223
|
+
depends_on=("settings", "runtime", "services", "safety"),
|
|
224
|
+
next_steps=("Consider context-aware disambiguation for MA (Mastercard vs moving-average) in alert prompts; otherwise the channel flow is exercised end-to-end.",),
|
|
225
|
+
),
|
|
226
|
+
ArchitectureLayer(
|
|
227
|
+
name="observability",
|
|
228
|
+
responsibility="Doctor checks, traces, provider health, audit logs, and user-visible diagnostics.",
|
|
229
|
+
target_state="Health checks explain missing services, degraded providers, unsafe configs, and incomplete architecture layers.",
|
|
230
|
+
current_state="Provider and package doctor checks exist; this contract represents architecture coverage. The /architecture command renders it (layers, status, gaps, per-layer next steps; --gaps for outstanding work) and /doctor prints a one-line coverage summary. /export bundle emits the support bundle: redacted config, runtime trace, provider health (+summary), artifact summary, the architecture contract, doctor checks, and MCP server/circuit status.",
|
|
231
|
+
status=LayerStatus.PARTIAL,
|
|
232
|
+
source_paths=("packages/aria_infra/doctor.py", "packages/aria_services/provider_health.py", "packages/aria_core/export.py", "apps/cli/commands/diagnostic_ops_cmds.py", "aria_cli.py"),
|
|
233
|
+
depends_on=("services", "mcp", "safety"),
|
|
234
|
+
next_steps=("Persist bundle/doctor history for trend diagnosis, and fold durable run summaries in once the run store lands on main.",),
|
|
235
|
+
),
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
def list_architecture_layers() -> List[ArchitectureLayer]:
|
|
240
|
+
"""Return the product architecture layers in dependency order."""
|
|
241
|
+
|
|
242
|
+
return list(_ARCHITECTURE_LAYERS)
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def architecture_layer_map() -> Dict[str, ArchitectureLayer]:
|
|
246
|
+
return {layer.name: layer for layer in _ARCHITECTURE_LAYERS}
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def required_architecture_layer_names() -> List[str]:
|
|
250
|
+
return [layer.name for layer in _ARCHITECTURE_LAYERS]
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
def architecture_gaps() -> List[ArchitectureLayer]:
|
|
254
|
+
return [layer for layer in _ARCHITECTURE_LAYERS if not layer.is_complete]
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
def architecture_status_counts() -> Dict[str, int]:
|
|
258
|
+
counts = {status.value: 0 for status in LayerStatus}
|
|
259
|
+
for layer in _ARCHITECTURE_LAYERS:
|
|
260
|
+
counts[layer.status.value] += 1
|
|
261
|
+
return counts
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def architecture_contract() -> Dict[str, Any]:
|
|
265
|
+
return {
|
|
266
|
+
"schema_version": ARCHITECTURE_SCHEMA_VERSION,
|
|
267
|
+
"layers": [layer.to_dict() for layer in _ARCHITECTURE_LAYERS],
|
|
268
|
+
"status_counts": architecture_status_counts(),
|
|
269
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"""Manifest export helpers for Aria package facades."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
from datetime import datetime, timezone
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Any, Dict, Iterable, List, Optional
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _manifest_dicts(items: Iterable[Any]) -> List[Dict[str, Any]]:
|
|
12
|
+
out: List[Dict[str, Any]] = []
|
|
13
|
+
for item in items:
|
|
14
|
+
if hasattr(item, "manifest"):
|
|
15
|
+
item = item.manifest()
|
|
16
|
+
if hasattr(item, "to_dict"):
|
|
17
|
+
out.append(item.to_dict())
|
|
18
|
+
elif isinstance(item, dict):
|
|
19
|
+
out.append(dict(item))
|
|
20
|
+
return out
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def build_package_manifest(
|
|
24
|
+
*,
|
|
25
|
+
identity: Any,
|
|
26
|
+
tools: Iterable[Any],
|
|
27
|
+
agents: Iterable[Any],
|
|
28
|
+
skills: Iterable[Any],
|
|
29
|
+
mcp_exposures: Iterable[Any],
|
|
30
|
+
services: Iterable[Any] = (),
|
|
31
|
+
arthera_packages: Any = None,
|
|
32
|
+
arthera_mcp_tools: Iterable[Any] = (),
|
|
33
|
+
) -> Dict[str, Any]:
|
|
34
|
+
"""Build one JSON-serializable package manifest."""
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
"schema_version": "aria.package-manifest.v1",
|
|
38
|
+
"generated_at": datetime.now(timezone.utc).isoformat(timespec="seconds").replace("+00:00", "Z"),
|
|
39
|
+
"product": identity.to_dict() if hasattr(identity, "to_dict") else identity,
|
|
40
|
+
"capabilities": {
|
|
41
|
+
"services": _manifest_dicts(services),
|
|
42
|
+
"tools": _manifest_dicts(tools),
|
|
43
|
+
"agents": _manifest_dicts(agents),
|
|
44
|
+
"skills": _manifest_dicts(skills),
|
|
45
|
+
"mcp_exposures": [
|
|
46
|
+
item.to_tool_descriptor() if hasattr(item, "to_tool_descriptor") else dict(item)
|
|
47
|
+
for item in mcp_exposures
|
|
48
|
+
],
|
|
49
|
+
"arthera_mcp_tools": _manifest_dicts(arthera_mcp_tools),
|
|
50
|
+
},
|
|
51
|
+
"arthera_packages": (
|
|
52
|
+
arthera_packages.to_dict()
|
|
53
|
+
if hasattr(arthera_packages, "to_dict")
|
|
54
|
+
else arthera_packages
|
|
55
|
+
),
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def build_session_diagnostic_bundle(
|
|
60
|
+
*,
|
|
61
|
+
session_id: str,
|
|
62
|
+
conversation: list,
|
|
63
|
+
config: Optional[dict] = None,
|
|
64
|
+
paths: Optional[dict] = None,
|
|
65
|
+
trace: Any = None,
|
|
66
|
+
provider_health: Optional[list] = None,
|
|
67
|
+
artifact_summary: Optional[dict] = None,
|
|
68
|
+
doctor_report: Any = None,
|
|
69
|
+
mcp_status: Optional[list] = None,
|
|
70
|
+
context_health: Optional[dict] = None,
|
|
71
|
+
) -> Dict[str, Any]:
|
|
72
|
+
"""Build a stable export bundle for debugging and replay."""
|
|
73
|
+
config = dict(config or {})
|
|
74
|
+
redacted_config: Dict[str, Any] = {}
|
|
75
|
+
for key, value in config.items():
|
|
76
|
+
if any(token in key.lower() for token in ("key", "token", "secret", "password")):
|
|
77
|
+
if value:
|
|
78
|
+
redacted_config[key] = "***"
|
|
79
|
+
else:
|
|
80
|
+
redacted_config[key] = value
|
|
81
|
+
|
|
82
|
+
bundle: Dict[str, Any] = {
|
|
83
|
+
"schema": "aria.session_diagnostic_bundle.v1",
|
|
84
|
+
"generated_at": datetime.now(timezone.utc).isoformat(timespec="seconds").replace("+00:00", "Z"),
|
|
85
|
+
"session_id": session_id,
|
|
86
|
+
"conversation": list(conversation),
|
|
87
|
+
"conversation_count": len(conversation),
|
|
88
|
+
"config": redacted_config,
|
|
89
|
+
}
|
|
90
|
+
if paths:
|
|
91
|
+
bundle["paths"] = dict(paths)
|
|
92
|
+
if trace is not None:
|
|
93
|
+
try:
|
|
94
|
+
bundle["runtime_trace"] = trace.to_dict()
|
|
95
|
+
except Exception:
|
|
96
|
+
bundle["runtime_trace"] = {}
|
|
97
|
+
if provider_health is not None:
|
|
98
|
+
provider_rows = list(provider_health)
|
|
99
|
+
bundle["provider_health"] = provider_rows
|
|
100
|
+
try:
|
|
101
|
+
from packages.aria_services.provider_health import summarize_provider_health
|
|
102
|
+
|
|
103
|
+
bundle["provider_health_summary"] = summarize_provider_health(provider_rows).to_dict()
|
|
104
|
+
except Exception:
|
|
105
|
+
pass
|
|
106
|
+
if doctor_report is not None:
|
|
107
|
+
# Accept a DoctorReport dataclass or a pre-serialized dict.
|
|
108
|
+
try:
|
|
109
|
+
bundle["doctor"] = {
|
|
110
|
+
"status": doctor_report.status,
|
|
111
|
+
"passed": doctor_report.passed,
|
|
112
|
+
"warnings": doctor_report.warnings,
|
|
113
|
+
"errors": doctor_report.errors,
|
|
114
|
+
"checks": [
|
|
115
|
+
{"name": c.name, "status": c.status,
|
|
116
|
+
"detail": c.detail, "suggestion": c.suggestion}
|
|
117
|
+
for c in doctor_report.checks
|
|
118
|
+
],
|
|
119
|
+
}
|
|
120
|
+
except AttributeError:
|
|
121
|
+
bundle["doctor"] = dict(doctor_report) if isinstance(doctor_report, dict) else {}
|
|
122
|
+
if mcp_status is not None:
|
|
123
|
+
bundle["mcp_servers"] = list(mcp_status)
|
|
124
|
+
if context_health is not None:
|
|
125
|
+
bundle["context_health"] = dict(context_health)
|
|
126
|
+
if artifact_summary is not None:
|
|
127
|
+
bundle["artifact_summary"] = dict(artifact_summary)
|
|
128
|
+
else:
|
|
129
|
+
try:
|
|
130
|
+
from artifacts import artifact_summary as _artifact_summary
|
|
131
|
+
|
|
132
|
+
bundle["artifact_summary"] = _artifact_summary()
|
|
133
|
+
except Exception:
|
|
134
|
+
pass
|
|
135
|
+
try:
|
|
136
|
+
from packages.aria_core.architecture import architecture_contract
|
|
137
|
+
|
|
138
|
+
bundle["architecture"] = architecture_contract()
|
|
139
|
+
except Exception:
|
|
140
|
+
pass
|
|
141
|
+
return bundle
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def write_package_manifest(path: Path, manifest: Dict[str, Any]) -> Path:
|
|
145
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
146
|
+
path.write_text(json.dumps(manifest, ensure_ascii=False, indent=2, default=str), encoding="utf-8")
|
|
147
|
+
return path
|