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,136 @@
|
|
|
1
|
+
"""Sign in through the account page, the way Claude Code and Codex do.
|
|
2
|
+
|
|
3
|
+
``/login`` opens a page on Arthera's own auth host. The user chooses how to sign
|
|
4
|
+
in there (Google, Apple or email, and email can be a new account) and the page
|
|
5
|
+
hands the session back to this process on a loopback port. Nothing is typed in
|
|
6
|
+
the terminal and no provider is chosen for the user.
|
|
7
|
+
|
|
8
|
+
The hand-back is bound to this process, not merely to "whoever is listening":
|
|
9
|
+
|
|
10
|
+
* ``state`` is random and checked on the way back, so a callback this run did
|
|
11
|
+
not start is ignored;
|
|
12
|
+
* a PKCE ``code_verifier`` stays here; only its SHA-256 goes into the page. The
|
|
13
|
+
one-time code in the redirect is useless without it, so a program that sees
|
|
14
|
+
the redirect cannot redeem it;
|
|
15
|
+
* the credential never appears in a URL. The redirect carries a short code and
|
|
16
|
+
the session is fetched over POST.
|
|
17
|
+
|
|
18
|
+
Page: the /cli-login route of apps/web. Server side: apps/api/src/routes/auth_v2_routes.py
|
|
19
|
+
(/cli/handoff, /cli/exchange).
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
import base64
|
|
25
|
+
import hashlib
|
|
26
|
+
import http.server
|
|
27
|
+
import os
|
|
28
|
+
import secrets
|
|
29
|
+
import threading
|
|
30
|
+
import urllib.parse
|
|
31
|
+
import webbrowser
|
|
32
|
+
from typing import Any, Dict
|
|
33
|
+
|
|
34
|
+
from .google_login import _CallbackResult, _free_port, _post_json
|
|
35
|
+
|
|
36
|
+
# The apex is Firebase Hosting and the Firebase auth domain, so the page and the
|
|
37
|
+
# sign-in popup are same-origin there.
|
|
38
|
+
from aria_code.service_endpoints import SITE_URL, current_url
|
|
39
|
+
AUTH_ORIGIN = SITE_URL
|
|
40
|
+
LOGIN_PATH = "/cli-login"
|
|
41
|
+
_TIMEOUT_SECONDS = 300
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def auth_origin() -> str:
|
|
45
|
+
"""The host that serves the sign-in page. ARIA_AUTH_URL overrides it for staging."""
|
|
46
|
+
return current_url(os.getenv("ARIA_AUTH_URL", "").strip() or AUTH_ORIGIN, website=True)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def pkce_pair() -> tuple[str, str]:
|
|
50
|
+
"""A code verifier and its S256 challenge (RFC 7636)."""
|
|
51
|
+
verifier = secrets.token_urlsafe(48) # 64 characters, inside the 43-128 the spec allows
|
|
52
|
+
digest = hashlib.sha256(verifier.encode("ascii")).digest()
|
|
53
|
+
return verifier, base64.urlsafe_b64encode(digest).rstrip(b"=").decode("ascii")
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _handler(result: _CallbackResult, state: str):
|
|
57
|
+
class Handler(http.server.BaseHTTPRequestHandler):
|
|
58
|
+
def do_GET(self): # noqa: N802 - name fixed by BaseHTTPRequestHandler
|
|
59
|
+
parsed = urllib.parse.urlparse(self.path)
|
|
60
|
+
params = {k: v[0] for k, v in urllib.parse.parse_qs(parsed.query).items()}
|
|
61
|
+
if parsed.path != "/callback" or not secrets.compare_digest(params.get("state", ""), state):
|
|
62
|
+
# Not this run's callback: ignore it and keep waiting for ours.
|
|
63
|
+
self.send_response(404)
|
|
64
|
+
self.end_headers()
|
|
65
|
+
return
|
|
66
|
+
ok = "handoff_code" in params
|
|
67
|
+
body = (
|
|
68
|
+
"<html><body style='font-family:system-ui;padding:3rem'>"
|
|
69
|
+
f"<h2>{'Signed in.' if ok else 'Sign-in failed.'}</h2>"
|
|
70
|
+
"<p>You can close this tab and return to the terminal.</p>"
|
|
71
|
+
"</body></html>"
|
|
72
|
+
).encode("utf-8")
|
|
73
|
+
self.send_response(200 if ok else 400)
|
|
74
|
+
self.send_header("Content-Type", "text/html; charset=utf-8")
|
|
75
|
+
self.send_header("Content-Length", str(len(body)))
|
|
76
|
+
self.send_header("Referrer-Policy", "no-referrer")
|
|
77
|
+
self.send_header("Cache-Control", "no-store")
|
|
78
|
+
self.end_headers()
|
|
79
|
+
self.wfile.write(body)
|
|
80
|
+
result.params = params
|
|
81
|
+
result.received.set()
|
|
82
|
+
|
|
83
|
+
def log_message(self, *args): # keep the terminal clean
|
|
84
|
+
return
|
|
85
|
+
|
|
86
|
+
return Handler
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def run_web_login(api_url: str, *, open_browser=webbrowser.open, timeout: int = _TIMEOUT_SECONDS) -> Dict[str, Any]:
|
|
90
|
+
"""Drive the whole flow; return the stored-credential fields.
|
|
91
|
+
|
|
92
|
+
Raises RuntimeError with a message suitable for display on any failure.
|
|
93
|
+
"""
|
|
94
|
+
api_url = api_url.rstrip("/")
|
|
95
|
+
port = _free_port()
|
|
96
|
+
state = secrets.token_urlsafe(24)
|
|
97
|
+
verifier, challenge = pkce_pair()
|
|
98
|
+
result = _CallbackResult()
|
|
99
|
+
server = http.server.HTTPServer(("127.0.0.1", port), _handler(result, state))
|
|
100
|
+
thread = threading.Thread(target=server.serve_forever, daemon=True)
|
|
101
|
+
thread.start()
|
|
102
|
+
try:
|
|
103
|
+
url = f"{auth_origin()}{LOGIN_PATH}?" + urllib.parse.urlencode(
|
|
104
|
+
{"port": port, "state": state, "code_challenge": challenge, "code_challenge_method": "S256"}
|
|
105
|
+
)
|
|
106
|
+
if not open_browser(url):
|
|
107
|
+
raise RuntimeError("Could not open a browser. Visit this URL manually:\n " + url)
|
|
108
|
+
if not result.received.wait(timeout=timeout):
|
|
109
|
+
raise RuntimeError(f"Timed out after {timeout}s waiting for the browser.")
|
|
110
|
+
finally:
|
|
111
|
+
server.shutdown()
|
|
112
|
+
server.server_close()
|
|
113
|
+
|
|
114
|
+
code = result.params.get("handoff_code")
|
|
115
|
+
if not code:
|
|
116
|
+
raise RuntimeError(result.params.get("message") or "The sign-in did not carry a handoff code.")
|
|
117
|
+
try:
|
|
118
|
+
reply = _post_json(f"{api_url}/api/v2/auth/cli/exchange",
|
|
119
|
+
{"code": code, "code_verifier": verifier, "state": state})
|
|
120
|
+
except Exception as exc:
|
|
121
|
+
raise RuntimeError(f"Could not redeem the sign-in: {exc}") from exc
|
|
122
|
+
data = reply.get("data") or {}
|
|
123
|
+
if not data.get("auth_token"):
|
|
124
|
+
raise RuntimeError("The sign-in did not return a session.")
|
|
125
|
+
return {
|
|
126
|
+
"auth_token": data["auth_token"],
|
|
127
|
+
"refresh_token": data.get("refresh_token"),
|
|
128
|
+
"expires_in": str(data["expires_in"]) if data.get("expires_in") is not None else None,
|
|
129
|
+
"user_id": data.get("user_id"),
|
|
130
|
+
"email": data.get("email"),
|
|
131
|
+
"display_name": data.get("display_name"),
|
|
132
|
+
"provider": "firebase",
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
__all__ = ["run_web_login", "pkce_pair", "auth_origin", "AUTH_ORIGIN"]
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"""Run a ``.aria/workflows`` file in the REPL, one step at a time.
|
|
2
|
+
|
|
3
|
+
Each kind of step goes through what already exists for it, so a workflow has
|
|
4
|
+
no powers of its own: ``run`` through the ``run_command`` tool (command
|
|
5
|
+
policy, sandbox, output display), ``prompt`` through ``send_message`` (tools,
|
|
6
|
+
approvals, checks, task worktree, transaction point), ``command`` through
|
|
7
|
+
the slash-command dispatcher.
|
|
8
|
+
|
|
9
|
+
A step fails when its command exits non-zero, when its turn leaves the code
|
|
10
|
+
failing checks it did not fail before (or gets no answer), or when its slash
|
|
11
|
+
command does not exist. The first failure stops the workflow unless the step
|
|
12
|
+
says ``continue_on_error``; declining a ``confirm`` step stops it too.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import asyncio
|
|
18
|
+
import sys
|
|
19
|
+
import time
|
|
20
|
+
from dataclasses import dataclass
|
|
21
|
+
from typing import Any, Callable
|
|
22
|
+
|
|
23
|
+
from aria_code.runtime.workflows import Workflow, WorkflowStep, variables
|
|
24
|
+
|
|
25
|
+
PASSED, FAILED, SKIPPED, DECLINED = "passed", "failed", "skipped", "declined"
|
|
26
|
+
_MARKS = {PASSED: "✓", FAILED: "✗", SKIPPED: "–", DECLINED: "–"}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class StepResult:
|
|
31
|
+
name: str
|
|
32
|
+
status: str
|
|
33
|
+
detail: str = ""
|
|
34
|
+
seconds: float = 0.0
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _namespace(terminal: Any) -> dict:
|
|
38
|
+
return vars(sys.modules[type(terminal).__module__])
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
async def _run_command_step(terminal: Any, step: WorkflowStep, text: str) -> tuple[bool, str]:
|
|
42
|
+
from aria_code.apps.cli.providers.runtime_bridge import build_tool_executor
|
|
43
|
+
from aria_code.runtime.approval import ApprovalDecision
|
|
44
|
+
|
|
45
|
+
config = terminal.config
|
|
46
|
+
executor = build_tool_executor(
|
|
47
|
+
_namespace(terminal)["LOCAL_TOOLS"], config,
|
|
48
|
+
lambda: {"_session_id": getattr(terminal, "session_id", "")},
|
|
49
|
+
)
|
|
50
|
+
root = config.get("_session_workspace_root") or None
|
|
51
|
+
params = {"command": text, "timeout": step.timeout, **({"cwd": root} if root else {})}
|
|
52
|
+
# The user ran the workflow, and trusted its file before the first run;
|
|
53
|
+
# the command policy and sandbox still apply, as they do to /verify.
|
|
54
|
+
approval = ApprovalDecision.allow(policy="balanced", user_approved=True)
|
|
55
|
+
result = await asyncio.to_thread(executor.execute_local, "run_command", params, approval=approval)
|
|
56
|
+
if not result.get("success"):
|
|
57
|
+
return False, str(result.get("error") or "command failed")
|
|
58
|
+
code = (result.get("data") or {}).get("exit_code", 0)
|
|
59
|
+
return code == 0, f"exit {code}"
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
async def _prompt_step(terminal: Any, text: str) -> tuple[bool, str]:
|
|
63
|
+
before = str(getattr(terminal, "_code_verdict", "") or "")
|
|
64
|
+
length = len(terminal.conversation)
|
|
65
|
+
await terminal.send_message(text)
|
|
66
|
+
answered = len(terminal.conversation) > length and terminal.conversation[-1].get("role") == "assistant"
|
|
67
|
+
after = str(getattr(terminal, "_code_verdict", "") or "")
|
|
68
|
+
if not answered:
|
|
69
|
+
return False, "no answer"
|
|
70
|
+
if after == "failed" and before != "failed":
|
|
71
|
+
return False, "checks failed after this step"
|
|
72
|
+
return True, f"checks {after}" if after else "answered"
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
async def _slash_step(terminal: Any, workflow: Workflow, text: str) -> tuple[bool, str]:
|
|
76
|
+
name = text.split(maxsplit=1)[0].lower()
|
|
77
|
+
if name.lstrip("/") == workflow.name:
|
|
78
|
+
return False, "a workflow cannot run itself"
|
|
79
|
+
commands = terminal.commands
|
|
80
|
+
if not commands.is_command(text):
|
|
81
|
+
return False, f"unknown command {name}"
|
|
82
|
+
await commands.execute(text)
|
|
83
|
+
return True, name
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
async def run_workflow(terminal: Any, workflow: Workflow, args: str = "", *,
|
|
87
|
+
ask: Callable[[str], bool], say: Callable[[str, str], None]) -> list[StepResult]:
|
|
88
|
+
values = variables(workflow, args)
|
|
89
|
+
results: list[StepResult] = []
|
|
90
|
+
total = len(workflow.steps)
|
|
91
|
+
stopped = False
|
|
92
|
+
for index, step in enumerate(workflow.steps, 1):
|
|
93
|
+
if stopped:
|
|
94
|
+
results.append(StepResult(step.name, SKIPPED))
|
|
95
|
+
continue
|
|
96
|
+
text = step.render(values)
|
|
97
|
+
say(f"[{index}/{total}] {step.name}", "bold")
|
|
98
|
+
if step.confirm and not ask(f" Run “{step.name}”: {text[:80]}? [y/N] "):
|
|
99
|
+
results.append(StepResult(step.name, DECLINED, "declined"))
|
|
100
|
+
stopped = True
|
|
101
|
+
continue
|
|
102
|
+
started = time.time()
|
|
103
|
+
try:
|
|
104
|
+
if step.kind == "run":
|
|
105
|
+
ok, detail = await _run_command_step(terminal, step, text)
|
|
106
|
+
elif step.kind == "prompt":
|
|
107
|
+
ok, detail = await _prompt_step(terminal, text)
|
|
108
|
+
else:
|
|
109
|
+
ok, detail = await _slash_step(terminal, workflow, text)
|
|
110
|
+
except Exception as exc:
|
|
111
|
+
ok, detail = False, f"{type(exc).__name__}: {exc}"
|
|
112
|
+
results.append(StepResult(step.name, PASSED if ok else FAILED, detail, time.time() - started))
|
|
113
|
+
if not ok and not step.continue_on_error:
|
|
114
|
+
stopped = True
|
|
115
|
+
return results
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def summary_lines(workflow: Workflow, results: list[StepResult]) -> list[str]:
|
|
119
|
+
failed = [r for r in results if r.status == FAILED]
|
|
120
|
+
declined = any(r.status == DECLINED for r in results)
|
|
121
|
+
verdict = "FAILED" if failed else "STOPPED" if declined else "DONE"
|
|
122
|
+
lines = [f"/{workflow.name} {verdict}"]
|
|
123
|
+
for result in results:
|
|
124
|
+
timing = f" · {result.seconds:.1f}s" if result.seconds >= 0.05 else ""
|
|
125
|
+
detail = f" {result.detail}" if result.detail else ""
|
|
126
|
+
lines.append(f" {_MARKS[result.status]} {result.name}{detail}{timing}")
|
|
127
|
+
return lines
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"""A task about this folder, sent to a model that cannot touch it.
|
|
2
|
+
|
|
3
|
+
With backend_chat on, turns go to the Arthera backend, which receives the
|
|
4
|
+
prompt and history but none of Aria's local tools. Asked to run
|
|
5
|
+
`python3 -c 'import calc; print(calc.add(2,3))'` in a folder, it said it had
|
|
6
|
+
no filesystem access and gave the output as 5; the function subtracts, so it
|
|
7
|
+
is -1. The turn reported success with no tools used, and `-p` exited 0. A
|
|
8
|
+
small local model without tool calling is in the same position.
|
|
9
|
+
|
|
10
|
+
``needs_workspace`` asks only whether a message needs this machine: it names
|
|
11
|
+
a file or imports a module that exists here, uses an @file reference, asks
|
|
12
|
+
for a command to be run, or says "this project", "the failing tests" and the
|
|
13
|
+
like. A question about code in general ("explain Python decorators") does not
|
|
14
|
+
need the folder and is left alone.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import re
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
|
|
22
|
+
_PATH_TOKEN = re.compile(r"[\w./-]+\.[A-Za-z0-9]{1,6}\b|[\w-]+/[\w./-]+")
|
|
23
|
+
_HERE_EN = re.compile(
|
|
24
|
+
r"\b(?:this|my|our|current)\s+(?:project|repo|repository|folder|directory|codebase|workspace|"
|
|
25
|
+
r"working\s+tree)\b|\bin\s+here\b|\b(?:the\s+)?failing\s+tests?\b|\bmy\s+(?:code|tests)\b",
|
|
26
|
+
re.I,
|
|
27
|
+
)
|
|
28
|
+
# Asking for a command to be run needs a tool to run it, wherever it points.
|
|
29
|
+
_RUN_EN = re.compile(r"\b(?:run|execute)\s+(?:`|python3?\b|pytest\b|npm\b|npx\b|node\b|make\b|cargo\b|"
|
|
30
|
+
r"go\s+(?:test|run|build)\b|bash\b|sh\b|pip3?\b|uv\b|git\b|ls\b|the\s+tests?\b)", re.I)
|
|
31
|
+
_RUN_ZH = re.compile(r"(?:运行|执行|跑一下|跑)\s*(?:`|python|pytest|npm|node|git|make|命令|脚本|测试)", re.I)
|
|
32
|
+
_IMPORT = re.compile(r"\b(?:import|from)\s+([A-Za-z_]\w*)")
|
|
33
|
+
_HERE_ZH = ("这个项目", "该项目", "当前项目", "这个仓库", "当前仓库", "这个目录", "当前目录", "这个文件夹",
|
|
34
|
+
"当前文件夹", "这个代码库", "本项目", "本仓库", "失败的测试", "我的代码",
|
|
35
|
+
"我的项目", "本地项目", "本地文件", "电脑文件", "桌面文件", "创建项目", "新建项目")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def needs_workspace(text: str, cwd: Path | str | None = None) -> bool:
|
|
39
|
+
"""True when the message is about files in ``cwd`` (default: the current directory)."""
|
|
40
|
+
message = str(text or "")
|
|
41
|
+
if "@file:" in message or "@folder:" in message:
|
|
42
|
+
return True
|
|
43
|
+
if _HERE_EN.search(message) or any(word in message for word in _HERE_ZH):
|
|
44
|
+
return True
|
|
45
|
+
if re.search(r"\b(?:create|build|scaffold|initialize)\s+(?:a\s+|an\s+|new\s+)?(?:react\s+|next\.js\s+)?(?:app|project|website)\b", message, re.I):
|
|
46
|
+
return True
|
|
47
|
+
if _RUN_EN.search(message) or _RUN_ZH.search(message):
|
|
48
|
+
return True
|
|
49
|
+
base = Path(cwd or Path.cwd())
|
|
50
|
+
for module in _IMPORT.findall(message):
|
|
51
|
+
if (base / f"{module}.py").is_file() or (base / module / "__init__.py").is_file():
|
|
52
|
+
return True
|
|
53
|
+
tokens = _PATH_TOKEN.findall(message)
|
|
54
|
+
# Chinese prose can touch an ASCII filename without whitespace (修改calc.py).
|
|
55
|
+
tokens += re.findall(r"[A-Za-z0-9_./~-]+\.[A-Za-z0-9]{1,6}\b", message)
|
|
56
|
+
for token in tokens:
|
|
57
|
+
candidate = token.strip("./") if token.startswith("./") else token
|
|
58
|
+
try:
|
|
59
|
+
if candidate and (base / candidate).exists():
|
|
60
|
+
return True
|
|
61
|
+
except (OSError, ValueError):
|
|
62
|
+
continue
|
|
63
|
+
return False
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def route_has_tools(model: str, config: dict, api_url: str | None) -> bool:
|
|
67
|
+
"""Whether this turn's model can call Aria's local tools."""
|
|
68
|
+
try:
|
|
69
|
+
from aria_code.model_capability import get_model_capability
|
|
70
|
+
|
|
71
|
+
capability = get_model_capability(model)
|
|
72
|
+
if not (capability.tool_calls and capability.context_window >= 8192):
|
|
73
|
+
return False
|
|
74
|
+
except Exception:
|
|
75
|
+
pass
|
|
76
|
+
try:
|
|
77
|
+
from aria_code.apps.cli.providers.chat_routing import model_receives_local_tools
|
|
78
|
+
|
|
79
|
+
return model_receives_local_tools(model, config, api_url)
|
|
80
|
+
except Exception:
|
|
81
|
+
return True
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def no_tools_message(config: dict, *, lang: str = "en") -> str:
|
|
85
|
+
"""Why the model cannot do this here, and what to change."""
|
|
86
|
+
backend = bool(config.get("backend_chat"))
|
|
87
|
+
if lang == "zh":
|
|
88
|
+
why = ("当前通过 Arthera 云端对话(backend_chat),那里的模型读不到这个文件夹,也不能运行命令"
|
|
89
|
+
if backend else "当前模型不支持工具调用,读不到这个文件夹,也不能运行命令")
|
|
90
|
+
return (f"{why},关于这里文件的回答只能是推测。要在这个文件夹里写代码、跑测试,请用 /model "
|
|
91
|
+
"选一个能调用工具的模型(例如 Vertex 上的 Gemini、OpenAI 或 Ollama 的 qwen2.5-coder),"
|
|
92
|
+
"或用 aria-code --local。")
|
|
93
|
+
why = ("Turns go to Arthera cloud chat (backend_chat), where the model cannot read this folder or run "
|
|
94
|
+
"commands" if backend else "The current model cannot call tools, so it cannot read this folder "
|
|
95
|
+
"or run commands")
|
|
96
|
+
return (f"{why}; anything it says about files here is a guess. To work on code in this folder, pick a "
|
|
97
|
+
"model that runs tools with /model (Gemini on Vertex, OpenAI, or an Ollama model such as "
|
|
98
|
+
"qwen2.5-coder), or start with aria-code --local.")
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def workspace_config(text: str, model: str, config: dict, api_url: str | None) -> dict:
|
|
102
|
+
"""Choose authenticated Google inference with local tools for workspace tasks.
|
|
103
|
+
|
|
104
|
+
Change only this turn's inference transport, never the saved config or
|
|
105
|
+
the user's model. A backend chat setting must not turn edits into guesses.
|
|
106
|
+
"""
|
|
107
|
+
from aria_code.apps.cli.providers.chat_routing import force_backend, model_provider, normalize_provider_name
|
|
108
|
+
if not needs_workspace(text) or not force_backend(config, api_url):
|
|
109
|
+
return config
|
|
110
|
+
if config.get("backend_local_tools"):
|
|
111
|
+
return config
|
|
112
|
+
provider = model_provider(model) or normalize_provider_name(config.get("local_provider", ""))
|
|
113
|
+
if provider not in {"google", "vertexai", "vertex-ai", "google-genai"}:
|
|
114
|
+
return config
|
|
115
|
+
from aria_code.apps.cli.providers.base import google_readiness
|
|
116
|
+
if google_readiness(config):
|
|
117
|
+
return config
|
|
118
|
+
return {**config, "backend_chat": False, "_workspace_transport": "google"}
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
__all__ = ["needs_workspace", "route_has_tools", "no_tools_message", "workspace_config"]
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Daemon App
|
|
2
|
+
|
|
3
|
+
Target role: local-first gateway process for background jobs and external
|
|
4
|
+
clients.
|
|
5
|
+
|
|
6
|
+
Responsibilities:
|
|
7
|
+
|
|
8
|
+
- manage long-running sessions and task queues;
|
|
9
|
+
- expose local MCP or HTTP control surfaces;
|
|
10
|
+
- coordinate channel adapters;
|
|
11
|
+
- keep user data local unless explicit opt-in allows upload.
|
|
12
|
+
|
|
13
|
+
The daemon should not implement market data, reports, broker logic, or model
|
|
14
|
+
reasoning directly. Those belong behind package services.
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# Aria Code — VS Code Extension
|
|
2
|
+
|
|
3
|
+
AI-powered financial analysis sidebar for VS Code, connected to the Aria Code backend.
|
|
4
|
+
|
|
5
|
+
## Requirements
|
|
6
|
+
|
|
7
|
+
- VS Code 1.85 or later
|
|
8
|
+
- Aria Code backend running locally or on a reachable API host
|
|
9
|
+
|
|
10
|
+
## Start the backend
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
# From the Aria Code project root:
|
|
14
|
+
python3 aria_daemon.py
|
|
15
|
+
|
|
16
|
+
# Or start the FastAPI server directly:
|
|
17
|
+
uvicorn apps.api.src.main:app --host 0.0.0.0 --port 8000
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Install from VSIX (recommended)
|
|
21
|
+
|
|
22
|
+
### Step 1 — Build the extension package
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
cd apps/vscode
|
|
26
|
+
npm install --save-dev @vscode/vsce
|
|
27
|
+
npx vsce package
|
|
28
|
+
# Produces: aria-code-1.0.0.vsix
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Step 2 — Install in VS Code
|
|
32
|
+
|
|
33
|
+
**Option A — command line:**
|
|
34
|
+
```bash
|
|
35
|
+
code --install-extension aria-code-1.0.0.vsix
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Option B — VS Code UI:**
|
|
39
|
+
1. Open VS Code
|
|
40
|
+
2. Go to **Extensions** (⇧⌘X)
|
|
41
|
+
3. Click the **...** menu (top-right of Extensions panel)
|
|
42
|
+
4. Choose **Install from VSIX...**
|
|
43
|
+
5. Select `aria-code-1.0.0.vsix`
|
|
44
|
+
|
|
45
|
+
## Install for development (no build step)
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# Copy the extension folder to VS Code extensions directory
|
|
49
|
+
cp -r apps/vscode ~/.vscode/extensions/aria-code-1.0.0
|
|
50
|
+
|
|
51
|
+
# Then reload VS Code (⇧⌘P → "Developer: Reload Window")
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Features
|
|
55
|
+
|
|
56
|
+
| Feature | Description |
|
|
57
|
+
|---|---|
|
|
58
|
+
| **Market tab** | Live indices (S&P 500, Nasdaq, 沪深300, BTC), auto-refreshes every 60 s |
|
|
59
|
+
| **Portfolio tab** | Portfolio overview from your connected broker |
|
|
60
|
+
| **Chat tab** | Ask Aria AI anything — markets, stocks, analysis |
|
|
61
|
+
| **Alerts tab** | View and manage price alerts |
|
|
62
|
+
| **Status bar** | Shows `Aria Online / Offline` — polls `/health` every 30 s |
|
|
63
|
+
| **Analyze Selection** | Right-click selected text → "Analyze with Aria AI" |
|
|
64
|
+
|
|
65
|
+
## Usage
|
|
66
|
+
|
|
67
|
+
1. After installing, click the **graph icon** in the VS Code Activity Bar (left sidebar)
|
|
68
|
+
2. The **Aria Financial** panel opens with Market, Portfolio, Chat, and Alerts tabs
|
|
69
|
+
3. Make sure the backend is running — the status bar shows connection state
|
|
70
|
+
|
|
71
|
+
### Analyze code/text with AI
|
|
72
|
+
|
|
73
|
+
1. Select any text in your editor
|
|
74
|
+
2. Right-click → **Analyze with Aria AI**
|
|
75
|
+
3. Aria switches to the Chat tab and sends your selection for analysis
|
|
76
|
+
|
|
77
|
+
### Keyboard shortcut (optional)
|
|
78
|
+
|
|
79
|
+
Add to your `keybindings.json`:
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"key": "ctrl+shift+a",
|
|
83
|
+
"command": "aria-code.openPanel"
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## API Endpoints Used
|
|
88
|
+
|
|
89
|
+
| Endpoint | Purpose |
|
|
90
|
+
|---|---|
|
|
91
|
+
| `GET /health` | Connection health check (every 30 s) |
|
|
92
|
+
| `GET /api/v1/institution/market/indices` | Major market indices |
|
|
93
|
+
| `GET /api/v2/market/quote?symbols=...` | Fallback quote data |
|
|
94
|
+
| `GET /api/v1/institution/analysis/morning-brief` | Morning market brief |
|
|
95
|
+
| `GET /api/v1/institution/portfolio/overview` | Portfolio overview |
|
|
96
|
+
| `POST /api/v2/ai/chat` | AI chat messages |
|
|
97
|
+
| `GET /api/v2/alert/list` | Price alerts list |
|
|
98
|
+
| `POST /api/v2/alert/create` | Create new alert |
|
|
99
|
+
| `DELETE /api/v2/alert/:id` | Delete alert |
|
|
100
|
+
|
|
101
|
+
## Troubleshooting
|
|
102
|
+
|
|
103
|
+
**Status bar shows "Aria Offline"**
|
|
104
|
+
- Confirm the backend is running: `curl http://localhost:8000/health`
|
|
105
|
+
- Check for port conflicts: `lsof -i :8000`
|
|
106
|
+
|
|
107
|
+
**Extension not appearing after install**
|
|
108
|
+
- Reload VS Code: ⇧⌘P → "Developer: Reload Window"
|
|
109
|
+
|
|
110
|
+
**Chat returns errors**
|
|
111
|
+
- The AI chat endpoint requires the backend to have a valid LLM provider configured
|
|
112
|
+
- Check backend logs for API key or model errors
|
|
113
|
+
|
|
114
|
+
**Backend is on a different URL**
|
|
115
|
+
- Set the VS Code setting `ariaCode.apiBase` to the backend base URL you want to use.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "aria-code",
|
|
3
|
+
"displayName": "Aria Code — AI Financial Terminal",
|
|
4
|
+
"description": "AI-powered financial analysis in your editor",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"publisher": "Cinsoul",
|
|
7
|
+
"engines": {
|
|
8
|
+
"vscode": "^1.85.0"
|
|
9
|
+
},
|
|
10
|
+
"categories": ["Other", "Data Science"],
|
|
11
|
+
"activationEvents": ["onStartupFinished"],
|
|
12
|
+
"main": "./extension.js",
|
|
13
|
+
"contributes": {
|
|
14
|
+
"configuration": {
|
|
15
|
+
"title": "Aria Code",
|
|
16
|
+
"properties": {
|
|
17
|
+
"ariaCode.apiBase": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"default": "http://127.0.0.1:8000",
|
|
20
|
+
"description": "Aria backend base URL used by the VS Code extension."
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"commands": [
|
|
25
|
+
{
|
|
26
|
+
"command": "aria-code.openPanel",
|
|
27
|
+
"title": "Open Aria Dashboard",
|
|
28
|
+
"category": "Aria"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"command": "aria-code.analyzeSelection",
|
|
32
|
+
"title": "Analyze with Aria AI",
|
|
33
|
+
"category": "Aria"
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
"viewsContainers": {
|
|
37
|
+
"activitybar": [
|
|
38
|
+
{
|
|
39
|
+
"id": "aria-sidebar",
|
|
40
|
+
"title": "Aria",
|
|
41
|
+
"icon": "$(graph)"
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
},
|
|
45
|
+
"views": {
|
|
46
|
+
"aria-sidebar": [
|
|
47
|
+
{
|
|
48
|
+
"id": "aria-code.sidebar",
|
|
49
|
+
"name": "Aria Financial",
|
|
50
|
+
"type": "webview"
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
},
|
|
54
|
+
"menus": {
|
|
55
|
+
"editor/context": [
|
|
56
|
+
{
|
|
57
|
+
"command": "aria-code.analyzeSelection",
|
|
58
|
+
"when": "editorHasSelection",
|
|
59
|
+
"group": "aria@1"
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"scripts": {
|
|
65
|
+
"package": "npx @vscode/vsce package"
|
|
66
|
+
},
|
|
67
|
+
"devDependencies": {
|
|
68
|
+
"@vscode/vsce": "^2.24.0"
|
|
69
|
+
}
|
|
70
|
+
}
|