aria-code 0.86.0__tar.gz → 0.88.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {aria_code-0.86.0/src/aria_code.egg-info → aria_code-0.88.0}/PKG-INFO +1 -1
- {aria_code-0.86.0 → aria_code-0.88.0}/pyproject.toml +1 -1
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/_version.py +1 -1
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/core_cmds.py +7 -6
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +6 -4
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/handlers/market_handlers.py +14 -14
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/prompts/system_prompts.py +2 -2
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/aria_cli.py +56 -3
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/render/output.py +16 -0
- {aria_code-0.86.0 → aria_code-0.88.0/src/aria_code.egg-info}/PKG-INFO +1 -1
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code.egg-info/SOURCES.txt +3 -0
- aria_code-0.88.0/tests/test_data_without_model.py +53 -0
- aria_code-0.88.0/tests/test_file_links.py +43 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_market_answers_in_english.py +20 -2
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_output_rendering.py +5 -4
- aria_code-0.88.0/tests/test_platform_publish.py +99 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/LICENSE +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/NOTICE +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/README.md +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/setup.cfg +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/adk_apps/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/base.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/code_review.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/deep/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/deep/critic.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/deep/deepen.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/deep/models.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/deep/pipeline.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/deep/themes.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/deep/tiers.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/engineering/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/engineering/coder.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/engineering/tester.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/catalyst.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/debate.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/earnings.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/fundamental.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/macro.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/news.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/risk.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/sector.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/strategist.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/synthesis.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/technical.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/orchestrator.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/portfolio_agent.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/realty/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/realty/business_match.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/registry.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/signal_scheme.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/sports/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/sports/football_agent.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/supervisor.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/team.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/aliyun_data_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/README.md +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/channels/README.md +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/channels/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/channels/approvals.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/channels/conversation.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/channels/digest.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/channels/intake.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/channels/registry.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/channels/tradingview.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/README.md +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/_optional.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/broker_render.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/data_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/market.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/report.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/team.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/config_paths.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/config_store.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/constants.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/context.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/deterministic.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/direct.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/football_reports.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/google_login.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/helpers.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/hooks.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/i18n.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/intent.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/intent_router.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/main.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/market_hours.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/market_universe.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/message_processing.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/preflight.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/project_aria.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/providers/base.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/review_runner.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/sandbox.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/session_export.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/session_store.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/tools/context.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/update_check.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/updater.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/daemon/README.md +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/vscode/README.md +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/vscode/package.json +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/aria_daemon.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/aria_feishu_bot.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/aria_mcp_server.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/aria_relay_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/aria_relay_server.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/aria_telegram_bot.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ariarc.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/artifacts.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/backtest_engine.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/backtest_report.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/automation.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/base.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/capabilities.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/cn/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/config.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/intl/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/paper_broker.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/planning.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/registry.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/trading.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/canva_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/change_store.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/clients/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/clients/aria_relay_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/clients/canva_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/clients/figma_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/clients/football_data_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/clients/kling_video_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/clients/market_data_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/clients/openai_image_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/clients/runway_video_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/cloud_memory.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/command_safety.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/computer_use_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/dashboard_generator.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/data_analysis_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/data_cleaner.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/data_service.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/base.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/router.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/sources/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/demo_player.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/doctor.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/domain/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/domain/backtest_engine.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/domain/backtest_report.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/domain/finance_formulas.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/domain/strategy_vault.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/evals/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/evals/harness.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/evals/runner.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/external_agent_runner.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/figma_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/file_analysis_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/finance_formulas.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/football_data_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/image_gen_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/intent_classifier.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/kling_video_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/licensing.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/local_finance_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/local_image_provider.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/local_llm_provider.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/macro_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/markdown_pdf.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/market_data_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/mcp_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/memory_manager.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/model_capability.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/notification_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/openai_image_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_core/export.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_core/paths.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_infra/product.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/cache.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/context.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/data.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/references.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/registry.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/settings.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/usage.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packs/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packs/base.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packs/finance/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packs/logistics/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packs/payments/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packs/realty/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packs/registry.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packs/rules.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/plan_utils.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/plugin_loader.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/portfolio_ledger.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/preview_server.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/privacy/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/privacy/feedback.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/project_review.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/project_review_api.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/project_review_server.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/project_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/llm/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/llm/anthropic.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/llm/base.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/llm/custom.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/llm/ollama.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/llm/registry.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/local_image_provider.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/local_llm_provider.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/tool_messages.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/realty_data_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/relay_store.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/report_exporters.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/report_generator.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/review_service.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/acceptance.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/agent_loop.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/approval.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/budget.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/checkpoints.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/crash_report.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/events.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/gateway.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/lsp.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/orchestrator.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/repo_map.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/run_state.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/run_store.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/self_healing.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/subagent.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/task_ledger.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/tool_executor.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/tool_policy.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/worktrees.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runway_video_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/safety/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/safety/permissions.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/safety/service.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/setup_wizard.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/spreadsheet_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/strategy_vault.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/artifact_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/broker_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/build_quant_engine.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/code_audit_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/computer_use_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/extended_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/image_gen_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/local_finance_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/logistics_carriers.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/logistics_inventory.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/logistics_io.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/logistics_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/macro_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/notification_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/project_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/realty_data_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/stripe_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/banner.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/completer.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/console.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/image_render.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/input_box.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/mentions.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/picker.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/render/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/render/finance.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/render/market.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/render/responsive.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/render/team.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/robot.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/startup_dashboard.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/utils/vscode_uri.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/video_analysis.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/video_editor.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/workspace/__init__.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/workspace/files.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/workspace/verify.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/workspace_changes.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/workspace_context.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/workspace_service.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/workspace_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code.egg-info/entry_points.txt +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code.egg-info/requires.txt +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code.egg-info/top_level.txt +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_adk_market_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_agent_team_fallback.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_analyze_file_tool.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_architecture_ledger_is_true.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_architecture_report.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_aria_cli_core.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_aria_mcp_server.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_aria_sdk.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_artifact_publishing.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_artifacts_and_reports.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_ashare_prediction_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_backtest_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_backtest_engine.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_backtest_report.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_broken_akshare_is_optional.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_broker_automation.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_broker_chat_confirm_gate.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_broker_planning.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_broker_safety.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_broker_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_budget.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_business_workflow_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_canva_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_canvas_cmds.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_card_approvals.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_channel_intake.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_channels.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_chart_handlers.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_chat_bots_fail_closed.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_chat_routing.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_ci_security_workflow.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_cli_app_split.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_cli_bootstrap.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_cli_config_store.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_cli_lifecycle_hooks.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_cli_runtime_consumer.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_cli_tool_executor_module.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_cli_updater.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_cloud_memory.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_code_audit_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_code_review_agent.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_codegen_output.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_coder_tester_self_healing.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_coder_tool_safety.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_collaboration.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_command_loggers.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_command_safety.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_completions_builder.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_config_paths.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_configured_provider.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_container_entrypoint.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_container_entrypoints.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_context_checkpoints.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_context_references.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_context_service.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_conversation_core.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_crash_report.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_credential_file_permissions.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_custom_providers.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_daemon_gateway_config.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_dashboard_generator.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_data_service.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_data_service_imports.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_datasource_routing.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_deep_analysis.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_degrades_without_quant_engine.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_doctor.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_doctor_describes_the_current_install.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_doctor_npm_scope.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_engine_boundary.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_enterprise_tool_honesty.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_env_switch_docs.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_evals_harness.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_event_import_roots.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_extended_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_feishu_swarm_config.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_finalize_release.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_finance_renderers.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_finance_service_catalog.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_first_run_output.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_first_run_works.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_football_agent.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_football_prediction_output.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_google_cloud_models.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_google_cloud_routing.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_google_login.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_google_search_provider.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_headless_is_agentic.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_honest_surfaces.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_image_gen_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_image_inputs.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_import_graph_budget.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_intent_router.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_intent_signals.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_kling_video_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_lazy_rebind.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_legacy_module_imports.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_license_consistency.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_licensing.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_local_image_provider.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_logistics_3pl.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_logistics_and_finance_agents.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_lsp.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_markdown_pdf.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_market_data_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_market_history_inheritance.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_market_history_tool.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_market_hours.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_market_questions_on_backend.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_market_symbol_extraction.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_market_universe.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_mcp_circuit.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_mcp_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_mentions.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_model_capability_registry.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_model_choice_is_the_users.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_model_selection_state.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_native_binary_entrypoints.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_native_installer.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_natural_language_routing.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_new_modules.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_no_uncommitted_imports.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_numeric_listings.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_ollama_stream_imports.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_ollama_stream_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_openai_image_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_operations_suite.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_packages_facade.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_packaging_constraints.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_packaging_manifest.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_packs_domains.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_pdf_report.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_pick_best_installed_model.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_plan_mode.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_platform_package_assembly.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_platform_packages.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_plotly_html_output.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_portfolio_ledger.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_post_turn_context_decision.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_preflight.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_preview_server.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_privacy_feedback.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_project_aria.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_project_review.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_project_review_api.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_prompt_assembly.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_prompt_selection.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_provider_autoconfig.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_provider_error_messages.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_provider_integration.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_provider_registry.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_public_service_status.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_quant_engine_namespace.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_rebind_contract.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_rebind_namespace_contract.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_relay_client_credentials.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_relay_event_verification.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_relay_sends_for_clients.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_relay_store.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_relay_url.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_release_chain.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_release_commit_identity.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_release_push_is_atomic.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_release_reaches_the_registries.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_release_verification_waits.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_release_workflow_permissions.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_report_charts.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_report_generator.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_research_protocol.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_research_quality.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_responsive_rendering.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_review_service.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_root_module_budget.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_rsi_without_pandas_ta.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_acceptance.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_agent_loop.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_approval.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_bridge.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_bridge_fallback.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_checkpoints.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_event_identity.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_gateway.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_repo_map.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_run_store.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_tool_executor.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_worktrees.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runway_video_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_safety_permissions.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_safety_service.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_safety_service_adoption.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_service_diagnostics_security.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_session_search.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_settings_service.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_shipper_digest.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_single_import_root.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_skill_agent_binding.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_skill_catalog.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_skill_loader.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_slash_popup.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_spreadsheet_tools.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_sse_stream_contract.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_startup_dashboard.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_startup_latency.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_status_language.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_streaming_pipeline.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_stripe_agent.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_subagent.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_supervisor_routing.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_system_prompts.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_system_tools_output.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_task_orchestrator.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_team_synthesis.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_tls_trust_store.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_tool_policy.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_tool_rounds_on_openai_apis.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_tool_scope.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_tool_step_output.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_trading_service.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_tradingview_bridge.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_turn_planning.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_ui_completer_references.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_ui_console_theme.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_ui_input_box.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_ui_language_and_model.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_ui_robot_banner.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_update_health_routes.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_verification_hint.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_verification_policy.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_version_consistency.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_version_counter.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_video_analysis.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_video_editor.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_vscode_mcp.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_warehouse_agents.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_warehouse_cli_registration.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_warehouse_erp_client.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_warehouse_workflow.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_wheel_is_installable.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_workspace_changes.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_workspace_context.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_workspace_files.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_workspace_scope.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_workspace_service.py +0 -0
- {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_workspace_verify.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aria-code
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.88.0
|
|
4
4
|
Summary: Open-source AI agent for coding, financial analysis and logistics operations: numbers you can check, client data kept apart, actions a person approves
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
Project-URL: Homepage, https://github.com/artheras/aria-code
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "aria-code"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.88.0"
|
|
8
8
|
description = "Open-source AI agent for coding, financial analysis and logistics operations: numbers you can check, client data kept apart, actions a person approves"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "Apache-2.0" }
|
|
@@ -13,6 +13,7 @@ NameError,而这正是 requires-python = "<3.14,>=3.10" 声明支持的全部
|
|
|
13
13
|
全绿。已发布的 4.3.0 同样中招:pip install 后运行 aria-code 直接崩溃。
|
|
14
14
|
"""
|
|
15
15
|
|
|
16
|
+
from aria_code.ui.render.output import file_uri as _file_uri
|
|
16
17
|
from aria_code.apps.cli.i18n import ui_text
|
|
17
18
|
from ._ui import print_error
|
|
18
19
|
|
|
@@ -2049,7 +2050,7 @@ class CoreCommandsMixin:
|
|
|
2049
2050
|
"command": f"/tv {symbol} --pine",
|
|
2050
2051
|
}
|
|
2051
2052
|
if self.context.has_rich:
|
|
2052
|
-
self.context.console.print(f" [green]✓[/green] Pine strategy saved: [link={pine_path}]{pine_path}[/link]")
|
|
2053
|
+
self.context.console.print(f" [green]✓[/green] Pine strategy saved: [link={_file_uri(pine_path)}]{pine_path}[/link]")
|
|
2053
2054
|
self.context.console.print(" [dim]Use: TradingView → Pine Editor → paste script → Save → Add to chart[/dim]")
|
|
2054
2055
|
else:
|
|
2055
2056
|
print(f"Pine strategy saved: {pine_path}")
|
|
@@ -2058,7 +2059,7 @@ class CoreCommandsMixin:
|
|
|
2058
2059
|
companion = _write_text_companion(str(pine_path))
|
|
2059
2060
|
if companion:
|
|
2060
2061
|
if self.context.has_rich:
|
|
2061
|
-
self.context.console.print(f" [green]✓[/green] Text copy saved: [link={companion}]{companion}[/link]")
|
|
2062
|
+
self.context.console.print(f" [green]✓[/green] Text copy saved: [link={_file_uri(companion)}]{companion}[/link]")
|
|
2062
2063
|
else:
|
|
2063
2064
|
print(f"Text copy saved: {companion}")
|
|
2064
2065
|
if copy_pine:
|
|
@@ -2208,7 +2209,7 @@ class CoreCommandsMixin:
|
|
|
2208
2209
|
from rich.markup import escape as _esc
|
|
2209
2210
|
|
|
2210
2211
|
self.context.console.print(f" [green]✓[/green] {_T('图表已生成', 'chart generated')} [dim]({elapsed_ms}ms)[/dim]")
|
|
2211
|
-
self.context.console.print(f" {_T('已保存', 'saved')}: [link={path}]{path_label}[/link]")
|
|
2212
|
+
self.context.console.print(f" {_T('已保存', 'saved')}: [link={_file_uri(path)}]{path_label}[/link]")
|
|
2212
2213
|
self.context.console.print(f" [dim]{_esc(_summary)}[/dim]")
|
|
2213
2214
|
if issues:
|
|
2214
2215
|
self.context.console.print(f" [yellow]⚠ {_issues_head}[/yellow]")
|
|
@@ -2266,7 +2267,7 @@ class CoreCommandsMixin:
|
|
|
2266
2267
|
}
|
|
2267
2268
|
if self.context.has_rich:
|
|
2268
2269
|
self.context.console.print(f" [green]✓[/green] comparison chart generated [dim]({elapsed_ms}ms)[/dim]")
|
|
2269
|
-
self.context.console.print(f" saved: [link={path}]{path_label}[/link]")
|
|
2270
|
+
self.context.console.print(f" saved: [link={_file_uri(path)}]{path_label}[/link]")
|
|
2270
2271
|
rows = result.get("metrics") or []
|
|
2271
2272
|
for row in rows[:6]:
|
|
2272
2273
|
self.context.console.print(
|
|
@@ -2537,9 +2538,9 @@ class CoreCommandsMixin:
|
|
|
2537
2538
|
self.context.console.print()
|
|
2538
2539
|
self.context.console.print(f" [green]✓[/green] {T('技术图表已生成', 'Chart saved')}")
|
|
2539
2540
|
if html_path:
|
|
2540
|
-
self.context.console.print(f" [dim]HTML:[/dim] [link={html_path}]{_display_path(html_path)}[/link]")
|
|
2541
|
+
self.context.console.print(f" [dim]HTML:[/dim] [link={_file_uri(html_path)}]{_display_path(html_path)}[/link]")
|
|
2541
2542
|
if png_path:
|
|
2542
|
-
self.context.console.print(f" [dim]PNG :[/dim] [link={png_path}]{_display_path(png_path)}[/link]")
|
|
2543
|
+
self.context.console.print(f" [dim]PNG :[/dim] [link={_file_uri(png_path)}]{_display_path(png_path)}[/link]")
|
|
2543
2544
|
elif png_error:
|
|
2544
2545
|
self.context.console.print(f" [yellow]{T('PNG 跳过', 'PNG skipped')}:[/yellow] {png_error[:90]}")
|
|
2545
2546
|
else:
|
|
@@ -7,6 +7,8 @@ by _rebind_mixin_globals() called at module load time.
|
|
|
7
7
|
|
|
8
8
|
from __future__ import annotations
|
|
9
9
|
|
|
10
|
+
from aria_code.ui.render.output import file_uri as _file_uri
|
|
11
|
+
|
|
10
12
|
from aria_code.apps.cli.i18n import ui_text
|
|
11
13
|
|
|
12
14
|
from ._ui import Panel, print_error
|
|
@@ -470,7 +472,7 @@ class PortfolioCommandsMixin:
|
|
|
470
472
|
if self.context.has_rich:
|
|
471
473
|
self.context.console.print(
|
|
472
474
|
f" [green]PDF 导出成功[/green] "
|
|
473
|
-
f"[link={_pdf_out}]{_pdf_out.name}[/link]"
|
|
475
|
+
f"[link={_file_uri(_pdf_out)}]{_pdf_out.name}[/link]"
|
|
474
476
|
)
|
|
475
477
|
else:
|
|
476
478
|
print(f" PDF: {_pdf_out}")
|
|
@@ -577,7 +579,7 @@ class PortfolioCommandsMixin:
|
|
|
577
579
|
else:
|
|
578
580
|
self.context.console.print(
|
|
579
581
|
f"\n [green]✅ 研报已保存[/green]"
|
|
580
|
-
f" [link={path}]{path_label}[/link]"
|
|
582
|
+
f" [link={_file_uri(path)}]{path_label}[/link]"
|
|
581
583
|
f" [dim]({_file_kb}KB)[/dim]"
|
|
582
584
|
)
|
|
583
585
|
self.context.console.print(f" [dim]文件: {path_label}[/dim]")
|
|
@@ -608,7 +610,7 @@ class PortfolioCommandsMixin:
|
|
|
608
610
|
if self.context.has_rich:
|
|
609
611
|
self.context.console.print(
|
|
610
612
|
f" [green]PDF 导出成功[/green]"
|
|
611
|
-
f" [link={_pdf_path}]{_pdf_path.name}[/link]"
|
|
613
|
+
f" [link={_file_uri(_pdf_path)}]{_pdf_path.name}[/link]"
|
|
612
614
|
f" [dim]({_pdf_kb}KB)[/dim]"
|
|
613
615
|
)
|
|
614
616
|
else:
|
|
@@ -635,7 +637,7 @@ class PortfolioCommandsMixin:
|
|
|
635
637
|
_idx = await update_report_index(out_f.parent)
|
|
636
638
|
if _idx and self.context.has_rich:
|
|
637
639
|
self.context.console.print(
|
|
638
|
-
f" [dim]索引已更新: [link={_idx}]{_idx.name}[/link][/dim]"
|
|
640
|
+
f" [dim]索引已更新: [link={_file_uri(_idx)}]{_idx.name}[/link][/dim]"
|
|
639
641
|
)
|
|
640
642
|
except Exception as _e:
|
|
641
643
|
logger.debug("[report] index update error: %s", _e)
|
|
@@ -294,6 +294,11 @@ def _nearest_levels(
|
|
|
294
294
|
return support, resistance
|
|
295
295
|
|
|
296
296
|
|
|
297
|
+
def _compact_levels(currency: str, levels: list[float]) -> str:
|
|
298
|
+
""""USD 332.54 / 328.35 / 325.81": the currency once."""
|
|
299
|
+
return f"{currency} " + " / ".join(f"{v:,.2f}" for v in levels) if levels else "—"
|
|
300
|
+
|
|
301
|
+
|
|
297
302
|
def _format_levels(currency: str, levels: list[float]) -> str:
|
|
298
303
|
return ", ".join(f"{currency} {v:,.2f}" for v in levels) if levels else "—"
|
|
299
304
|
|
|
@@ -389,22 +394,17 @@ def _append_timeframe_levels(
|
|
|
389
394
|
resistance = row.get("resistance") or []
|
|
390
395
|
action = _level_action_line(name, support, resistance, currency, english=english)
|
|
391
396
|
|
|
397
|
+
# Two lines a timeframe, not four: the levels on one line, what to do
|
|
398
|
+
# with them on the next. Every level stays; the data source is in the
|
|
399
|
+
# header already. The whole snapshot ran to about 48 lines.
|
|
392
400
|
if english:
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
lines.append(f"- **{name}** — {meta}")
|
|
397
|
-
lines.append(f" - Support: {_format_levels(currency, support)}")
|
|
398
|
-
lines.append(f" - Resistance: {_format_levels(currency, resistance)}")
|
|
399
|
-
lines.append(f" - Use: {action}")
|
|
401
|
+
lines.append(f"- **{name}** ({horizon}) — support {_compact_levels(currency, support)}"
|
|
402
|
+
f" · resistance {_compact_levels(currency, resistance)} ")
|
|
403
|
+
lines.append(f" {action}")
|
|
400
404
|
else:
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
lines.append(f"- **{name}** — {meta}")
|
|
405
|
-
lines.append(f" - 支撑:{_format_levels(currency, support)}")
|
|
406
|
-
lines.append(f" - 压力:{_format_levels(currency, resistance)}")
|
|
407
|
-
lines.append(f" - 用法:{action}")
|
|
405
|
+
lines.append(f"- **{name}**({horizon})— 支撑 {_compact_levels(currency, support)}"
|
|
406
|
+
f" · 压力 {_compact_levels(currency, resistance)} ")
|
|
407
|
+
lines.append(f" {action}")
|
|
408
408
|
|
|
409
409
|
|
|
410
410
|
_HORIZON_UNITS_EN = {"日": "days", "周": "weeks", "月": "months"}
|
|
@@ -38,7 +38,7 @@ def build_response_style_rule(lang: str) -> str:
|
|
|
38
38
|
return (
|
|
39
39
|
"## Terminal Answer Style\n"
|
|
40
40
|
"- Lead with the answer or conclusion. Do not start with filler such as 'Sure' or 'I can help'.\n"
|
|
41
|
-
"- Strict Currency: US assets (e.g. AAPL, TSLA)
|
|
41
|
+
"- Strict Currency: label amounts with the asset's currency as the data gives it — USD for US assets (e.g. AAPL, TSLA), CNY for A-shares, HKD for Hong Kong — and never mix currencies.\n"
|
|
42
42
|
"- Format Financial Metrics Cleanly: Use structured Markdown tables or concise bullet points for Price, RSI, MACD, MA, and Bollinger Bands.\n"
|
|
43
43
|
"- Never dump raw, unexecuted Python code or pseudo-scripts in chat when performing analytical queries. Synthesize insights directly.\n"
|
|
44
44
|
"- Never explain tool errors, missing parameters, or recovery mechanics to the user. Silently proceed with available data.\n"
|
|
@@ -53,7 +53,7 @@ def build_response_style_rule(lang: str) -> str:
|
|
|
53
53
|
return (
|
|
54
54
|
"## 终端回答风格\n"
|
|
55
55
|
"- 先给结论或直接答案,不要以“好的/当然/我来帮你”开头。\n"
|
|
56
|
-
"-
|
|
56
|
+
"- 严格匹配货币:按数据给出的货币代码标注金额——美股(如 AAPL、TSLA)用 USD,A股用 CNY,港股用 HKD;严禁混用,严禁将美股均线/价格标注为人民币。\n"
|
|
57
57
|
"- 金融指标结构化排版:价格、涨跌幅、RSI、MACD、均线、布林带等必须使用结构清晰的 Markdown 表格或整齐键值对呈现,禁止乱序纯文本堆砌。\n"
|
|
58
58
|
"- 严禁在对话中向用户输出未执行的 Python 伪代码或脚本片段;直接给出整理后的金融分析结论与核心数据。\n"
|
|
59
59
|
"- 严禁向用户解释底层工具调用失败的原因或道歉(如“因缺少参数导致web_search失败”);遇网络或工具异常时静默使用备用数据并继续分析。\n"
|
|
@@ -103,6 +103,7 @@ except ImportError:
|
|
|
103
103
|
readline = None
|
|
104
104
|
import logging
|
|
105
105
|
import time
|
|
106
|
+
from aria_code.ui.render.output import file_uri as _file_uri
|
|
106
107
|
import shlex
|
|
107
108
|
import pathlib
|
|
108
109
|
import uuid
|
|
@@ -2308,13 +2309,13 @@ def _print_pending_artifact_location(pending_artifact: dict) -> None:
|
|
|
2308
2309
|
console.print(f" [dim]类型: {kind}[/dim]")
|
|
2309
2310
|
if paths:
|
|
2310
2311
|
for label, path in paths:
|
|
2311
|
-
console.print(f" [dim]{label}:[/dim] [link={path}]{_display_path(path, fallback=label)}[/link]")
|
|
2312
|
+
console.print(f" [dim]{label}:[/dim] [link={_file_uri(path)}]{_display_path(path, fallback=label)}[/link]")
|
|
2312
2313
|
elif command:
|
|
2313
2314
|
console.print(" [yellow]上一项任务只记录了命令,尚未记录具体文件路径。[/yellow]")
|
|
2314
2315
|
if child_paths:
|
|
2315
2316
|
console.print(" [dim]包含的单标的图表:[/dim]")
|
|
2316
2317
|
for child_label, label, path in child_paths:
|
|
2317
|
-
console.print(f" [dim]{child_label} {label}:[/dim] [link={path}]{_display_path(path, fallback=child_label)}[/link]")
|
|
2318
|
+
console.print(f" [dim]{child_label} {label}:[/dim] [link={_file_uri(path)}]{_display_path(path, fallback=child_label)}[/link]")
|
|
2318
2319
|
if command:
|
|
2319
2320
|
console.print(f" [dim]复现命令: {command}[/dim]")
|
|
2320
2321
|
console.print()
|
|
@@ -2515,7 +2516,7 @@ Plotly.newPlot('chart', [
|
|
|
2515
2516
|
"rows": z_rows,
|
|
2516
2517
|
})
|
|
2517
2518
|
if HAS_RICH:
|
|
2518
|
-
console.print(f" [dim]Z-Score 图表: [link={art.path}]{_display_path(art.path)}[/link][/dim]")
|
|
2519
|
+
console.print(f" [dim]Z-Score 图表: [link={_file_uri(art.path)}]{_display_path(art.path)}[/link][/dim]")
|
|
2519
2520
|
import subprocess
|
|
2520
2521
|
try:
|
|
2521
2522
|
subprocess.Popen(["open", str(art.path)])
|
|
@@ -2752,6 +2753,34 @@ def _render_answer_block(text: str) -> None:
|
|
|
2752
2753
|
console.print(Padding(make_markdown(_strip_latex(text)), (0, 0, 0, 4)))
|
|
2753
2754
|
|
|
2754
2755
|
|
|
2756
|
+
_MODEL_UNAVAILABLE_MARKERS = (
|
|
2757
|
+
"vertex_needs_project", "vertex_not_logged_in", "vertex_gcloud_failed", "missing_api_key:",
|
|
2758
|
+
"no_cloud_provider", "no_provider", "all_providers_failed", "http 401", "http 403", "http 402",
|
|
2759
|
+
"insufficient balance", "http 429", "rate limit",
|
|
2760
|
+
)
|
|
2761
|
+
|
|
2762
|
+
|
|
2763
|
+
def _model_unavailable(error: object) -> bool:
|
|
2764
|
+
"""The turn failed because no model could be reached — not because of what was asked."""
|
|
2765
|
+
text = str(error or "").lower()
|
|
2766
|
+
return any(marker in text for marker in _MODEL_UNAVAILABLE_MARKERS)
|
|
2767
|
+
|
|
2768
|
+
|
|
2769
|
+
def _data_without_model(message: str, history: list) -> dict:
|
|
2770
|
+
"""What Aria can answer from data alone, for a turn whose model is unreachable.
|
|
2771
|
+
|
|
2772
|
+
With no Google project set, "AAPL price" printed setup guidance and
|
|
2773
|
+
nothing else, though the quote needs no model: the same pre-fetch that
|
|
2774
|
+
serves tool-less routes answers it.
|
|
2775
|
+
"""
|
|
2776
|
+
try:
|
|
2777
|
+
found = _run_deterministic_chain(message, model_has_tools=False, history=history)
|
|
2778
|
+
except Exception as exc:
|
|
2779
|
+
logger.debug("data fallback failed: %s", exc)
|
|
2780
|
+
return {}
|
|
2781
|
+
return found if found.get("success") and (found.get("response") or "").strip() else {}
|
|
2782
|
+
|
|
2783
|
+
|
|
2755
2784
|
def _announce_route(command_text: str) -> None:
|
|
2756
2785
|
"""Say which command a plain-language message ran: "→ /news AAPL".
|
|
2757
2786
|
|
|
@@ -5353,6 +5382,30 @@ class ArtheraTerminal:
|
|
|
5353
5382
|
result.get("error", "Unknown error"),
|
|
5354
5383
|
lang=self.config.get("ui_lang", "en") or "en",
|
|
5355
5384
|
)
|
|
5385
|
+
_offline_answer = (
|
|
5386
|
+
_data_without_model(message, self.conversation[:-1])
|
|
5387
|
+
if _model_unavailable(result.get("error")) else {}
|
|
5388
|
+
)
|
|
5389
|
+
if _offline_answer:
|
|
5390
|
+
# The data is the answer; the model problem is a note under it.
|
|
5391
|
+
_en_note = _detect_lang(message) == "en"
|
|
5392
|
+
_answer = _offline_answer["response"]
|
|
5393
|
+
if HAS_RICH:
|
|
5394
|
+
console.print()
|
|
5395
|
+
console.print(make_markdown(_strip_latex(_answer))) # its header carries the disclaimer
|
|
5396
|
+
else:
|
|
5397
|
+
print("\n" + _answer)
|
|
5398
|
+
self.conversation.append({"role": "assistant", "content": _answer})
|
|
5399
|
+
self._last_response = _answer
|
|
5400
|
+
error_presentation = AgentErrorPresentation(
|
|
5401
|
+
error=error_presentation.error,
|
|
5402
|
+
level="warning",
|
|
5403
|
+
lines=[
|
|
5404
|
+
("模型不可用,以上为数据快照(未经模型分析)。" if not _en_note else
|
|
5405
|
+
"The model is unavailable, so this is the data snapshot without model analysis."),
|
|
5406
|
+
*error_presentation.lines[-1:],
|
|
5407
|
+
],
|
|
5408
|
+
)
|
|
5356
5409
|
console.print() if HAS_RICH else print()
|
|
5357
5410
|
if error_presentation.use_generic_error_prefix:
|
|
5358
5411
|
_print_error(error_presentation.lines[0])
|
|
@@ -179,6 +179,22 @@ def format_turn_footer(metadata, *, mode: str = "compact", copy_available: bool
|
|
|
179
179
|
return " · ".join(out)
|
|
180
180
|
|
|
181
181
|
|
|
182
|
+
def file_uri(path: object) -> str:
|
|
183
|
+
"""A terminal-hyperlink target for a local file: file:///Users/…/chart.html.
|
|
184
|
+
|
|
185
|
+
Saved files were linked as [link=/Users/…/chart.html]: OSC 8 hyperlinks
|
|
186
|
+
take a URI, so terminals that support them had nothing to open. A value
|
|
187
|
+
that already has a scheme (https://…) is returned unchanged.
|
|
188
|
+
"""
|
|
189
|
+
text = str(path or "")
|
|
190
|
+
if not text or "://" in text:
|
|
191
|
+
return text
|
|
192
|
+
try:
|
|
193
|
+
return pathlib.Path(text).expanduser().resolve().as_uri()
|
|
194
|
+
except (OSError, ValueError):
|
|
195
|
+
return text
|
|
196
|
+
|
|
197
|
+
|
|
182
198
|
def display_path(path: object, *, fallback: str = "file") -> str:
|
|
183
199
|
"""Return a path-safe display value for user-facing UI."""
|
|
184
200
|
if not path:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aria-code
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.88.0
|
|
4
4
|
Summary: Open-source AI agent for coding, financial analysis and logistics operations: numbers you can check, client data kept apart, actions a person approves
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
Project-URL: Homepage, https://github.com/artheras/aria-code
|
|
@@ -557,6 +557,7 @@ tests/test_daemon_gateway_config.py
|
|
|
557
557
|
tests/test_dashboard_generator.py
|
|
558
558
|
tests/test_data_service.py
|
|
559
559
|
tests/test_data_service_imports.py
|
|
560
|
+
tests/test_data_without_model.py
|
|
560
561
|
tests/test_datasource_routing.py
|
|
561
562
|
tests/test_deep_analysis.py
|
|
562
563
|
tests/test_degrades_without_quant_engine.py
|
|
@@ -571,6 +572,7 @@ tests/test_evals_harness.py
|
|
|
571
572
|
tests/test_event_import_roots.py
|
|
572
573
|
tests/test_extended_tools.py
|
|
573
574
|
tests/test_feishu_swarm_config.py
|
|
575
|
+
tests/test_file_links.py
|
|
574
576
|
tests/test_finalize_release.py
|
|
575
577
|
tests/test_finance_renderers.py
|
|
576
578
|
tests/test_finance_service_catalog.py
|
|
@@ -634,6 +636,7 @@ tests/test_pick_best_installed_model.py
|
|
|
634
636
|
tests/test_plan_mode.py
|
|
635
637
|
tests/test_platform_package_assembly.py
|
|
636
638
|
tests/test_platform_packages.py
|
|
639
|
+
tests/test_platform_publish.py
|
|
637
640
|
tests/test_plotly_html_output.py
|
|
638
641
|
tests/test_portfolio_ledger.py
|
|
639
642
|
tests/test_post_turn_context_decision.py
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""When no model can be reached, a market question still gets its data.
|
|
2
|
+
|
|
3
|
+
With no Google project set, "AAPL price" printed setup guidance and nothing
|
|
4
|
+
else, though the quote needs no model: the pre-fetch that serves tool-less
|
|
5
|
+
routes answers it. The model problem becomes a note under the data.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import sys
|
|
11
|
+
|
|
12
|
+
import pytest
|
|
13
|
+
|
|
14
|
+
sys.argv = ["aria-code"]
|
|
15
|
+
import aria_code.aria_cli as cli # noqa: E402
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@pytest.mark.parametrize("error", [
|
|
19
|
+
"vertex_needs_project: set GOOGLE_CLOUD_PROJECT …", "vertex_not_logged_in: run `gcloud auth login`",
|
|
20
|
+
"missing_api_key:openai", "no_cloud_provider", "all_providers_failed", "HTTP 401 Unauthorized",
|
|
21
|
+
"HTTP 429 rate limit",
|
|
22
|
+
])
|
|
23
|
+
def test_unreachable_models_are_recognised(error):
|
|
24
|
+
assert cli._model_unavailable(error)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@pytest.mark.parametrize("error", ["ARIA-4223 evidence required", "empty_response", "tool crashed", ""])
|
|
28
|
+
def test_other_failures_are_not(error):
|
|
29
|
+
assert not cli._model_unavailable(error)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def test_the_data_fallback_uses_the_tool_less_pre_fetch(monkeypatch):
|
|
33
|
+
seen = {}
|
|
34
|
+
|
|
35
|
+
def chain(message, *, model_has_tools, history):
|
|
36
|
+
seen.update(message=message, tools=model_has_tools)
|
|
37
|
+
return {"success": True, "response": "## Apple Inc. `AAPL`", "tools_used": ["market_snapshot"]}
|
|
38
|
+
|
|
39
|
+
monkeypatch.setattr(cli, "_run_deterministic_chain", chain)
|
|
40
|
+
assert cli._data_without_model("AAPL price", [])["response"].startswith("## Apple")
|
|
41
|
+
assert seen == {"message": "AAPL price", "tools": False}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def test_nothing_is_offered_when_the_data_has_no_answer(monkeypatch):
|
|
45
|
+
monkeypatch.setattr(cli, "_run_deterministic_chain", lambda *a, **k: {"success": False})
|
|
46
|
+
assert cli._data_without_model("write me a poem", []) == {}
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def test_the_error_path_shows_the_data_first():
|
|
50
|
+
import inspect
|
|
51
|
+
|
|
52
|
+
source = inspect.getsource(cli.ArtheraTerminal.send_message)
|
|
53
|
+
assert "_data_without_model(message" in source and "_model_unavailable(result.get(\"error\"))" in source
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""Saved files are links a terminal can open.
|
|
2
|
+
|
|
3
|
+
They were linked as [link=/Users/…/chart.html]: terminal hyperlinks (OSC 8)
|
|
4
|
+
take a URI, so a terminal that supports them had nothing to open, and the
|
|
5
|
+
line showed only "232347_AAPL_chart.html".
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import io
|
|
11
|
+
import pathlib
|
|
12
|
+
import re
|
|
13
|
+
|
|
14
|
+
from rich.console import Console
|
|
15
|
+
|
|
16
|
+
from aria_code.ui.render.output import file_uri
|
|
17
|
+
|
|
18
|
+
SRC = pathlib.Path(__file__).resolve().parents[1] / "src" / "aria_code"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def test_a_path_becomes_a_file_uri(tmp_path):
|
|
22
|
+
target = tmp_path / "my charts" / "AAPL_chart.html"
|
|
23
|
+
assert file_uri(str(target)) == target.resolve().as_uri()
|
|
24
|
+
assert file_uri(str(target)).startswith("file:///") and "%20" in file_uri(str(target))
|
|
25
|
+
assert file_uri("https://example.com/x") == "https://example.com/x"
|
|
26
|
+
assert file_uri("") == ""
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def test_the_terminal_receives_the_uri(tmp_path):
|
|
30
|
+
target = tmp_path / "AAPL_chart.html"
|
|
31
|
+
console = Console(file=io.StringIO(), force_terminal=True, color_system="truecolor")
|
|
32
|
+
console.print(f"saved: [link={file_uri(target)}]AAPL_chart.html[/link]")
|
|
33
|
+
assert f"\x1b]8;id=" in console.file.getvalue() and target.resolve().as_uri() in console.file.getvalue()
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def test_every_file_link_goes_through_file_uri():
|
|
37
|
+
raw = []
|
|
38
|
+
for path in SRC.rglob("*.py"):
|
|
39
|
+
for number, line in enumerate(path.read_text(encoding="utf-8").splitlines(), 1):
|
|
40
|
+
for target in re.findall(r"\[link=\{([^}]+)\}\]", line):
|
|
41
|
+
if not target.startswith("_file_uri(") and "url" not in target.lower():
|
|
42
|
+
raw.append(f"{path.relative_to(SRC)}:{number}: {target}")
|
|
43
|
+
assert not raw, raw
|
|
@@ -109,14 +109,14 @@ def test_an_english_question_gets_an_english_snapshot(offline_market):
|
|
|
109
109
|
text = result["response"]
|
|
110
110
|
assert result["success"] and result["symbol"] == "AAPL"
|
|
111
111
|
assert "**Takeaway**: " in text and "| RSI(14) | 50.7 | Neutral |" in text
|
|
112
|
-
assert "
|
|
112
|
+
assert "(1-5 days)" in text and "(1-8 weeks)" in text and "(2-12 months)" in text
|
|
113
113
|
assert not CJK.findall(text), CJK.findall(text)
|
|
114
114
|
|
|
115
115
|
|
|
116
116
|
def test_a_chinese_question_still_gets_the_chinese_snapshot(offline_market):
|
|
117
117
|
text = deterministic.run_deterministic_chain("分析苹果股票", model_has_tools=False)["response"]
|
|
118
118
|
assert "**结论**:" in text and "| RSI(14) | 50.7,中性 | 中性 |" in text
|
|
119
|
-
assert "
|
|
119
|
+
assert "(1-5 日)" in text and "**下一步**" in text
|
|
120
120
|
|
|
121
121
|
|
|
122
122
|
def test_an_english_failure_is_explained_in_english(monkeypatch):
|
|
@@ -214,3 +214,21 @@ def test_takeaway_and_levels_render_as_two_lines(offline_market):
|
|
|
214
214
|
text = market_handlers._try_handle_market_snapshot_analysis("AAPL price")["response"]
|
|
215
215
|
assert re.search(r"\*\*Takeaway\*\*: .+ \n\*\*Levels\*\*: Watch ", text)
|
|
216
216
|
assert "**Watch**" not in text
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def test_each_timeframe_takes_two_lines(offline_market):
|
|
220
|
+
"""The snapshot ran to about 48 lines; each timeframe took four."""
|
|
221
|
+
text = market_handlers._try_handle_market_snapshot_analysis("AAPL price")["response"]
|
|
222
|
+
block = text.split("**Multi-timeframe key levels**", 1)[1].split("\n\n", 2)[0].strip().splitlines()
|
|
223
|
+
assert len(block) == 6
|
|
224
|
+
assert block[0].startswith("- **4H/Short-term** (1-5 days) — support USD ")
|
|
225
|
+
assert " / " in block[0] and " · resistance USD " in block[0]
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
def test_the_currency_rule_matches_the_data():
|
|
229
|
+
"""The model was told to write "$" while the data it was given says USD."""
|
|
230
|
+
from aria_code.apps.cli.prompts.system_prompts import build_response_style_rule
|
|
231
|
+
|
|
232
|
+
en, zh = build_response_style_rule("en"), build_response_style_rule("zh")
|
|
233
|
+
assert "USD for US assets" in en and "'$'" not in en
|
|
234
|
+
assert "美股(如 AAPL、TSLA)用 USD" in zh and "'$'" not in zh
|
|
@@ -122,10 +122,11 @@ def test_market_snapshot_output_avoids_na_placeholders(monkeypatch):
|
|
|
122
122
|
assert "日线/波段" in result["response"]
|
|
123
123
|
assert "周线/长线" in result["response"]
|
|
124
124
|
assert "| 周期 | 适合 | 支撑 | 压力 | 用法 |" not in result["response"]
|
|
125
|
-
|
|
126
|
-
assert "
|
|
127
|
-
assert "
|
|
128
|
-
assert "
|
|
125
|
+
# Two lines a timeframe: levels, then what to do with them.
|
|
126
|
+
assert "- **4H/短线**(" in result["response"]
|
|
127
|
+
assert "— 支撑 USD " in result["response"]
|
|
128
|
+
assert " · 压力 USD " in result["response"]
|
|
129
|
+
assert "来源:" not in result["response"]
|
|
129
130
|
assert "N/A" not in result["response"]
|
|
130
131
|
assert result.get("analysis_complete") is True
|
|
131
132
|
assert result.get("timeframe_levels")
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"""The platform publish step makes sure every package reaches npm.
|
|
2
|
+
|
|
3
|
+
It skipped any package `npm view` answered for — trusting the exit status,
|
|
4
|
+
with the output thrown away — and npm versions differ on whether a missing
|
|
5
|
+
version is an error there. It now asks the registry directly, and checks that
|
|
6
|
+
every package can be seen, publishing a missing one again. npm itself can be
|
|
7
|
+
slow to expose a package (v0.86.0's mcp-linux-arm64 appeared 15 minutes after
|
|
8
|
+
its neighbours), so one still missing after 45 minutes is named in a warning
|
|
9
|
+
and the dispatcher's own wait makes the final call.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import os
|
|
15
|
+
import pathlib
|
|
16
|
+
import subprocess
|
|
17
|
+
import tempfile
|
|
18
|
+
import unittest
|
|
19
|
+
|
|
20
|
+
import yaml
|
|
21
|
+
|
|
22
|
+
ROOT = pathlib.Path(__file__).resolve().parents[1]
|
|
23
|
+
NAMES = [f"aria-code-{p}" for p in ("darwin-arm64", "darwin-x64", "linux-arm64", "linux-x64", "win32-x64")]
|
|
24
|
+
NAMES += [n.replace("aria-code-", "aria-code-mcp-") for n in NAMES]
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _step() -> str:
|
|
28
|
+
jobs = yaml.safe_load((ROOT / ".github/workflows/build-native-binaries.yml").read_text())["jobs"]
|
|
29
|
+
for job in jobs.values():
|
|
30
|
+
for step in job.get("steps", []):
|
|
31
|
+
if step.get("name") == "Publish each platform package":
|
|
32
|
+
return step["run"]
|
|
33
|
+
raise AssertionError("no publish step")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class PlatformPublish(unittest.TestCase):
|
|
37
|
+
def _run(self, *, lose: str = "", never: str = "", deadline_zero: bool = False):
|
|
38
|
+
script = _step().replace("sleep 30", "sleep 0")
|
|
39
|
+
if deadline_zero:
|
|
40
|
+
self.assertIn("+ 2700", script)
|
|
41
|
+
script = script.replace("+ 2700", "+ 0", 1)
|
|
42
|
+
with tempfile.TemporaryDirectory() as tmp:
|
|
43
|
+
work = pathlib.Path(tmp)
|
|
44
|
+
for name in NAMES:
|
|
45
|
+
(work / "npm/platforms" / name).mkdir(parents=True)
|
|
46
|
+
(work / "npm/platforms" / name / "package.json").write_text("{}")
|
|
47
|
+
bin_dir, registry, log = work / "bin", work / "registry", work / "publishes"
|
|
48
|
+
bin_dir.mkdir()
|
|
49
|
+
registry.write_text("")
|
|
50
|
+
# node: the spec of a package dir, or the packed size from stdin.
|
|
51
|
+
(bin_dir / "node").write_text(
|
|
52
|
+
'#!/bin/sh\nif [ "$#" -ge 3 ]; then d=$(basename "$(dirname "$3")"); echo "@artheras/$d@1.0.0"; '
|
|
53
|
+
"else echo 100; fi\n")
|
|
54
|
+
# npm publish: recorded; `lose` is accepted once without appearing,
|
|
55
|
+
# `never` never appears.
|
|
56
|
+
(bin_dir / "npm").write_text(
|
|
57
|
+
"#!/bin/sh\n"
|
|
58
|
+
'if [ "$1" = publish ]; then name=$(basename "$PWD"); echo "$name" >> ' + str(log) + "\n"
|
|
59
|
+
' if [ "$name" = "' + never + '" ]; then exit 0; fi\n'
|
|
60
|
+
' if [ "$name" = "' + lose + '" ] && [ "$(grep -c "^$name$" ' + str(log) + ')" = 1 ]; then exit 0; fi\n'
|
|
61
|
+
' echo "$name" >> ' + str(registry) + "\nfi\nexit 0\n")
|
|
62
|
+
# curl: 200 / the version list only for what reached the registry.
|
|
63
|
+
(bin_dir / "curl").write_text(
|
|
64
|
+
"#!/bin/sh\n"
|
|
65
|
+
'for a in "$@"; do case "$a" in (https://*) url="$a";; esac; done\n'
|
|
66
|
+
'name=$(echo "$url" | sed -e "s|https://registry.npmjs.org/@artheras%2F||" -e "s|[/?].*||")\n'
|
|
67
|
+
'if grep -qx "$name" ' + str(registry) + '; then hit=1; else hit=0; fi\n'
|
|
68
|
+
'case "$*" in *http_code*) [ $hit = 1 ] && printf 200 || printf 404; exit 0;; esac\n'
|
|
69
|
+
'[ $hit = 1 ] && echo \'{"versions":{"1.0.0":{}}}\' || echo \'{"versions":{}}\'\n')
|
|
70
|
+
for tool in ("node", "npm", "curl"):
|
|
71
|
+
(bin_dir / tool).chmod(0o755)
|
|
72
|
+
env = dict(os.environ, PATH=f"{bin_dir}:{os.environ['PATH']}", NODE_AUTH_TOKEN="t")
|
|
73
|
+
result = subprocess.run(["bash", "-c", script], cwd=work, env=env, capture_output=True, text=True,
|
|
74
|
+
timeout=60)
|
|
75
|
+
published = log.read_text().split() if log.exists() else []
|
|
76
|
+
return result, published
|
|
77
|
+
|
|
78
|
+
def test_all_ten_are_published_once(self):
|
|
79
|
+
result, published = self._run()
|
|
80
|
+
self.assertEqual(result.returncode, 0, result.stdout + result.stderr)
|
|
81
|
+
self.assertEqual(sorted(published), sorted(NAMES))
|
|
82
|
+
self.assertIn("All 10 platform packages are visible", result.stdout)
|
|
83
|
+
|
|
84
|
+
def test_a_package_that_did_not_arrive_is_published_again(self):
|
|
85
|
+
result, published = self._run(lose="aria-code-mcp-linux-arm64")
|
|
86
|
+
self.assertEqual(result.returncode, 0, result.stdout + result.stderr)
|
|
87
|
+
self.assertEqual(published.count("aria-code-mcp-linux-arm64"), 2)
|
|
88
|
+
self.assertIn("not visible yet, publishing again: @artheras/aria-code-mcp-linux-arm64@1.0.0", result.stdout)
|
|
89
|
+
|
|
90
|
+
def test_a_package_still_missing_at_the_deadline_is_named_not_fatal(self):
|
|
91
|
+
"""npm has taken 15 minutes, maybe 80, to expose a package: a slow
|
|
92
|
+
registry must not fail the release here — the dispatcher's wait decides."""
|
|
93
|
+
result, _ = self._run(never="aria-code-darwin-arm64", deadline_zero=True)
|
|
94
|
+
self.assertEqual(result.returncode, 0, result.stdout + result.stderr)
|
|
95
|
+
self.assertIn("::warning::Not on the registry yet: @artheras/aria-code-darwin-arm64@1.0.0", result.stdout)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
if __name__ == "__main__":
|
|
99
|
+
unittest.main()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|