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.
Files changed (749) hide show
  1. {aria_code-0.86.0/src/aria_code.egg-info → aria_code-0.88.0}/PKG-INFO +1 -1
  2. {aria_code-0.86.0 → aria_code-0.88.0}/pyproject.toml +1 -1
  3. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/_version.py +1 -1
  4. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/core_cmds.py +7 -6
  5. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/portfolio_cmds.py +6 -4
  6. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/handlers/market_handlers.py +14 -14
  7. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/prompts/system_prompts.py +2 -2
  8. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/aria_cli.py +56 -3
  9. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/render/output.py +16 -0
  10. {aria_code-0.86.0 → aria_code-0.88.0/src/aria_code.egg-info}/PKG-INFO +1 -1
  11. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code.egg-info/SOURCES.txt +3 -0
  12. aria_code-0.88.0/tests/test_data_without_model.py +53 -0
  13. aria_code-0.88.0/tests/test_file_links.py +43 -0
  14. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_market_answers_in_english.py +20 -2
  15. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_output_rendering.py +5 -4
  16. aria_code-0.88.0/tests/test_platform_publish.py +99 -0
  17. {aria_code-0.86.0 → aria_code-0.88.0}/LICENSE +0 -0
  18. {aria_code-0.86.0 → aria_code-0.88.0}/NOTICE +0 -0
  19. {aria_code-0.86.0 → aria_code-0.88.0}/README.md +0 -0
  20. {aria_code-0.86.0 → aria_code-0.88.0}/setup.cfg +0 -0
  21. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/__init__.py +0 -0
  22. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/adk_apps/__init__.py +0 -0
  23. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/adk_apps/aria_code_review/__init__.py +0 -0
  24. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/adk_apps/aria_code_review/agent.py +0 -0
  25. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/adk_apps/aria_research/__init__.py +0 -0
  26. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/adk_apps/aria_research/agent.py +0 -0
  27. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/__init__.py +0 -0
  28. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/base.py +0 -0
  29. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/code_review.py +0 -0
  30. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/deep/__init__.py +0 -0
  31. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/deep/calibration_loop.py +0 -0
  32. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/deep/critic.py +0 -0
  33. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/deep/deepen.py +0 -0
  34. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/deep/models.py +0 -0
  35. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/deep/pipeline.py +0 -0
  36. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/deep/quant_fusion.py +0 -0
  37. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/deep/themes.py +0 -0
  38. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/deep/tiers.py +0 -0
  39. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/engineering/__init__.py +0 -0
  40. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/engineering/coder.py +0 -0
  41. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/engineering/tester.py +0 -0
  42. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/__init__.py +0 -0
  43. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/cashflow_burn.py +0 -0
  44. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/catalyst.py +0 -0
  45. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/corporate_finance.py +0 -0
  46. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/debate.py +0 -0
  47. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/earnings.py +0 -0
  48. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/fundamental.py +0 -0
  49. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/macro.py +0 -0
  50. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/news.py +0 -0
  51. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/risk.py +0 -0
  52. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/sector.py +0 -0
  53. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/strategist.py +0 -0
  54. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/stripe_revenue.py +0 -0
  55. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/synthesis.py +0 -0
  56. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/financial/technical.py +0 -0
  57. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/orchestrator.py +0 -0
  58. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/portfolio_agent.py +0 -0
  59. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/realty/__init__.py +0 -0
  60. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/realty/asset_diagnosis.py +0 -0
  61. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/realty/business_match.py +0 -0
  62. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/realty/cashflow_verify.py +0 -0
  63. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/realty/contract_rules.py +0 -0
  64. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/realty/energy_anomaly.py +0 -0
  65. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/realty/exit_settlement.py +0 -0
  66. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/realty/fulfillment_risk.py +0 -0
  67. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/realty/ops_optimize.py +0 -0
  68. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/realty/revenue_share.py +0 -0
  69. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/registry.py +0 -0
  70. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/signal_scheme.py +0 -0
  71. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/sports/__init__.py +0 -0
  72. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/sports/football_agent.py +0 -0
  73. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/supervisor.py +0 -0
  74. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/team.py +0 -0
  75. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/warehouse/__init__.py +0 -0
  76. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/warehouse/contracts.py +0 -0
  77. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/warehouse/dashboard.py +0 -0
  78. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/warehouse/fulfillment_leadtime.py +0 -0
  79. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/warehouse/inbound_exceptions.py +0 -0
  80. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/warehouse/inventory_health.py +0 -0
  81. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/warehouse/local_run.py +0 -0
  82. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/warehouse/local_snapshot.py +0 -0
  83. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/warehouse/logistics_cost.py +0 -0
  84. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/warehouse/logistics_sync.py +0 -0
  85. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/agents/warehouse/workflow.py +0 -0
  86. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/aliyun_data_client.py +0 -0
  87. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/README.md +0 -0
  88. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/__init__.py +0 -0
  89. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/channels/README.md +0 -0
  90. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/channels/__init__.py +0 -0
  91. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/channels/approvals.py +0 -0
  92. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/channels/conversation.py +0 -0
  93. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/channels/digest.py +0 -0
  94. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/channels/intake.py +0 -0
  95. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/channels/registry.py +0 -0
  96. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/channels/tradingview.py +0 -0
  97. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/README.md +0 -0
  98. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/__init__.py +0 -0
  99. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/_optional.py +0 -0
  100. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/bootstrap.py +0 -0
  101. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/broker_render.py +0 -0
  102. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/codegen_paths.py +0 -0
  103. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/__init__.py +0 -0
  104. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/_business_render.py +0 -0
  105. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/_ui.py +0 -0
  106. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/analysis_cmds.py +0 -0
  107. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/ashare_prediction_cmds.py +0 -0
  108. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/auth_cmds.py +0 -0
  109. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/backtest_cmds.py +0 -0
  110. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/broker_cmds.py +0 -0
  111. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/business_workflow_cmds.py +0 -0
  112. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/canvas_cmds.py +0 -0
  113. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/catalog.py +0 -0
  114. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/data_cmds.py +0 -0
  115. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/diagnostic_cmds.py +0 -0
  116. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/diagnostic_ops_cmds.py +0 -0
  117. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/file_cmds.py +0 -0
  118. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/finance_service_cmds.py +0 -0
  119. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/fx_commodity_cmds.py +0 -0
  120. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/market.py +0 -0
  121. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/market_cmds.py +0 -0
  122. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/market_context.py +0 -0
  123. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/market_render.py +0 -0
  124. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/model_cmds.py +0 -0
  125. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/ops_cmds.py +0 -0
  126. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/orchestrator_cmds.py +0 -0
  127. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/pdf_export_cmds.py +0 -0
  128. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/report.py +0 -0
  129. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/scaffold_templates.py +0 -0
  130. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/session_cmds.py +0 -0
  131. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/session_ux_cmds.py +0 -0
  132. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/team.py +0 -0
  133. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/team_render.py +0 -0
  134. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/ui_cmds.py +0 -0
  135. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/warehouse_cmds.py +0 -0
  136. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/workflow_cmds.py +0 -0
  137. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/commands/workspace_cmds.py +0 -0
  138. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/config_paths.py +0 -0
  139. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/config_store.py +0 -0
  140. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/constants.py +0 -0
  141. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/context.py +0 -0
  142. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/deterministic.py +0 -0
  143. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/direct.py +0 -0
  144. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/finance_service_catalog.py +0 -0
  145. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/football_reports.py +0 -0
  146. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/github_app_auth.py +0 -0
  147. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/google_login.py +0 -0
  148. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/handlers/__init__.py +0 -0
  149. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/handlers/broker_handlers.py +0 -0
  150. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/handlers/chart_handlers.py +0 -0
  151. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/handlers/realty_handlers.py +0 -0
  152. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/handlers/sports_handlers.py +0 -0
  153. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/handlers/strategy_advice.py +0 -0
  154. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/helpers.py +0 -0
  155. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/hooks.py +0 -0
  156. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/i18n.py +0 -0
  157. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/intent.py +0 -0
  158. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/intent_router.py +0 -0
  159. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/intent_signals.py +0 -0
  160. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/lifecycle_hooks.py +0 -0
  161. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/local_tool_schemas.py +0 -0
  162. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/main.py +0 -0
  163. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/market_hours.py +0 -0
  164. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/market_metadata.py +0 -0
  165. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/market_universe.py +0 -0
  166. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/message_processing.py +0 -0
  167. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/model_catalog.py +0 -0
  168. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/pdf_report.py +0 -0
  169. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/plan_mode.py +0 -0
  170. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/plotly_html.py +0 -0
  171. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/prediction_feedback.py +0 -0
  172. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/preflight.py +0 -0
  173. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/project_aria.py +0 -0
  174. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/prompt_assembly.py +0 -0
  175. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/prompts/__init__.py +0 -0
  176. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/prompts/coding.py +0 -0
  177. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/prompts/select.py +0 -0
  178. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/prompts/ui.py +0 -0
  179. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/provider_endpoints.py +0 -0
  180. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/provider_keys.py +0 -0
  181. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/providers/__init__.py +0 -0
  182. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/providers/base.py +0 -0
  183. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/providers/chat_routing.py +0 -0
  184. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/providers/collaboration.py +0 -0
  185. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/providers/llm/__init__.py +0 -0
  186. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/providers/llm/offline_responses.py +0 -0
  187. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/providers/llm/ollama_stream.py +0 -0
  188. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/providers/llm/response_cache.py +0 -0
  189. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/providers/llm/sse_stream.py +0 -0
  190. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/providers/runtime_bridge.py +0 -0
  191. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/providers/vertexai_stream.py +0 -0
  192. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/review_runner.py +0 -0
  193. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/runtime_consumer.py +0 -0
  194. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/sandbox.py +0 -0
  195. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/session_export.py +0 -0
  196. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/session_jsonl.py +0 -0
  197. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/session_store.py +0 -0
  198. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/skills_catalog.py +0 -0
  199. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/todo_tracker.py +0 -0
  200. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/tool_executor.py +0 -0
  201. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/tool_registry.py +0 -0
  202. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/tool_scope.py +0 -0
  203. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/tools/__init__.py +0 -0
  204. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/tools/context.py +0 -0
  205. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/tools/file_tools.py +0 -0
  206. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/tools/market_tools.py +0 -0
  207. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/tools/notebook_tools.py +0 -0
  208. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/tools/system_tools.py +0 -0
  209. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/tools/write_tools.py +0 -0
  210. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/tradingview_bridge.py +0 -0
  211. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/turn_planning.py +0 -0
  212. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/update_check.py +0 -0
  213. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/updater.py +0 -0
  214. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/utils/__init__.py +0 -0
  215. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/cli/utils/market_detect.py +0 -0
  216. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/daemon/README.md +0 -0
  217. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/vscode/README.md +0 -0
  218. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/apps/vscode/package.json +0 -0
  219. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/aria_daemon.py +0 -0
  220. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/aria_feishu_bot.py +0 -0
  221. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/aria_mcp_server.py +0 -0
  222. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/aria_relay_client.py +0 -0
  223. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/aria_relay_server.py +0 -0
  224. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/aria_telegram_bot.py +0 -0
  225. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ariarc.py +0 -0
  226. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/artifacts.py +0 -0
  227. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/backtest_engine.py +0 -0
  228. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/backtest_report.py +0 -0
  229. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/__init__.py +0 -0
  230. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/automation.py +0 -0
  231. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/base.py +0 -0
  232. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/capabilities.py +0 -0
  233. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/cn/__init__.py +0 -0
  234. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/cn/easytrader_broker.py +0 -0
  235. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/cn/futu_broker.py +0 -0
  236. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/cn/longbridge_broker.py +0 -0
  237. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/cn/tiger_broker.py +0 -0
  238. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/cn/xtquant_broker.py +0 -0
  239. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/config.py +0 -0
  240. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/intl/__init__.py +0 -0
  241. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/intl/alpaca_broker.py +0 -0
  242. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/intl/ibkr_broker.py +0 -0
  243. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/intl/trading212_broker.py +0 -0
  244. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/intl/webull_broker.py +0 -0
  245. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/paper_broker.py +0 -0
  246. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/planning.py +0 -0
  247. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/registry.py +0 -0
  248. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/brokers/trading.py +0 -0
  249. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/canva_client.py +0 -0
  250. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/change_store.py +0 -0
  251. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/clients/__init__.py +0 -0
  252. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/clients/aliyun_data_client.py +0 -0
  253. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/clients/aria_relay_client.py +0 -0
  254. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/clients/canva_client.py +0 -0
  255. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/clients/figma_client.py +0 -0
  256. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/clients/football_data_client.py +0 -0
  257. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/clients/kling_video_client.py +0 -0
  258. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/clients/market_data_client.py +0 -0
  259. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/clients/openai_image_client.py +0 -0
  260. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/clients/runway_video_client.py +0 -0
  261. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/clients/warehouse_erp_client.py +0 -0
  262. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/cloud_memory.py +0 -0
  263. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/command_safety.py +0 -0
  264. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/computer_use_tools.py +0 -0
  265. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/dashboard_generator.py +0 -0
  266. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/data_analysis_tools.py +0 -0
  267. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/data_cleaner.py +0 -0
  268. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/data_service.py +0 -0
  269. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/__init__.py +0 -0
  270. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/base.py +0 -0
  271. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/router.py +0 -0
  272. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/sources/__init__.py +0 -0
  273. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/sources/akshare_source.py +0 -0
  274. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/sources/alpha_vantage_source.py +0 -0
  275. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/sources/edgar_source.py +0 -0
  276. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/sources/finnhub_source.py +0 -0
  277. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/sources/fred_source.py +0 -0
  278. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/sources/tushare_source.py +0 -0
  279. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/sources/web_scraper_source.py +0 -0
  280. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/sources/world_bank_source.py +0 -0
  281. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/datasources/sources/yfinance_source.py +0 -0
  282. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/demo_player.py +0 -0
  283. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/doctor.py +0 -0
  284. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/domain/__init__.py +0 -0
  285. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/domain/backtest_engine.py +0 -0
  286. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/domain/backtest_report.py +0 -0
  287. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/domain/finance_formulas.py +0 -0
  288. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/domain/portfolio_ledger.py +0 -0
  289. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/domain/strategy_vault.py +0 -0
  290. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/evals/__init__.py +0 -0
  291. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/evals/harness.py +0 -0
  292. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/evals/runner.py +0 -0
  293. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/external_agent_runner.py +0 -0
  294. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/figma_client.py +0 -0
  295. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/file_analysis_tools.py +0 -0
  296. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/finance_formulas.py +0 -0
  297. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/football_data_client.py +0 -0
  298. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/image_gen_tools.py +0 -0
  299. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/intent_classifier.py +0 -0
  300. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/kling_video_client.py +0 -0
  301. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/licensing.py +0 -0
  302. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/local_finance_tools.py +0 -0
  303. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/local_image_provider.py +0 -0
  304. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/local_llm_provider.py +0 -0
  305. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/macro_tools.py +0 -0
  306. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/markdown_pdf.py +0 -0
  307. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/market_data_client.py +0 -0
  308. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/mcp_client.py +0 -0
  309. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/memory_manager.py +0 -0
  310. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/model_capability.py +0 -0
  311. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/notification_tools.py +0 -0
  312. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/openai_image_client.py +0 -0
  313. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/__init__.py +0 -0
  314. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/adk_bridge/__init__.py +0 -0
  315. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/adk_bridge/code_review_tools.py +0 -0
  316. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/adk_bridge/market_tools.py +0 -0
  317. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_agents/__init__.py +0 -0
  318. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_agents/manifest.py +0 -0
  319. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_core/__init__.py +0 -0
  320. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_core/architecture.py +0 -0
  321. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_core/export.py +0 -0
  322. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_core/manifest.py +0 -0
  323. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_core/paths.py +0 -0
  324. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_core/secure_file.py +0 -0
  325. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_infra/__init__.py +0 -0
  326. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_infra/arthera.py +0 -0
  327. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_infra/doctor.py +0 -0
  328. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_infra/product.py +0 -0
  329. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_mcp/__init__.py +0 -0
  330. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_mcp/bridge.py +0 -0
  331. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_mcp/circuit.py +0 -0
  332. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_mcp/config.py +0 -0
  333. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_mcp/installer.py +0 -0
  334. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_mcp/server.py +0 -0
  335. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_mcp/tools.py +0 -0
  336. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_sdk/__init__.py +0 -0
  337. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_sdk/client.py +0 -0
  338. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_sdk/providers.py +0 -0
  339. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_sdk/streaming.py +0 -0
  340. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_sdk/types.py +0 -0
  341. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/__init__.py +0 -0
  342. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/cache.py +0 -0
  343. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/context.py +0 -0
  344. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/context_checkpoints.py +0 -0
  345. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/data.py +0 -0
  346. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/provider_health.py +0 -0
  347. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/references.py +0 -0
  348. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/registry.py +0 -0
  349. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/research_protocol.py +0 -0
  350. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/research_quality.py +0 -0
  351. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/settings.py +0 -0
  352. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_services/usage.py +0 -0
  353. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_skills/__init__.py +0 -0
  354. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_skills/catalog.py +0 -0
  355. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_skills/loader.py +0 -0
  356. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_skills/registry.py +0 -0
  357. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_tools/__init__.py +0 -0
  358. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_tools/financial/__init__.py +0 -0
  359. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_tools/financial/_paths.py +0 -0
  360. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_tools/financial/compliance.py +0 -0
  361. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_tools/financial/factors.py +0 -0
  362. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_tools/financial/risk_tools.py +0 -0
  363. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_tools/financial/strategy.py +0 -0
  364. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/aria_tools/registry.py +0 -0
  365. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/__init__.py +0 -0
  366. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/_namespace.py +0 -0
  367. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/backtest/__init__.py +0 -0
  368. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/backtest/core.py +0 -0
  369. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/backtest/engine.py +0 -0
  370. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/portfolio/__init__.py +0 -0
  371. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/portfolio/optimizer.py +0 -0
  372. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/sports/__init__.py +0 -0
  373. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/sports/calibrator.py +0 -0
  374. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/sports/dixon_coles.py +0 -0
  375. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/sports/elo.py +0 -0
  376. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/sports/form.py +0 -0
  377. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/sports/h2h.py +0 -0
  378. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/sports/ml_model.py +0 -0
  379. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/sports/predictor.py +0 -0
  380. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/sports/tracker.py +0 -0
  381. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/stochastic/__init__.py +0 -0
  382. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/stochastic/gbm_enhanced.py +0 -0
  383. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/stochastic/ito_calculus.py +0 -0
  384. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/stochastic/kelly_criterion.py +0 -0
  385. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/stochastic/monte_carlo_advanced.py +0 -0
  386. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/stochastic/options_pricing.py +0 -0
  387. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packages/quant_engine/stochastic/stochastic_processes.py +0 -0
  388. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packs/__init__.py +0 -0
  389. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packs/base.py +0 -0
  390. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packs/finance/__init__.py +0 -0
  391. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packs/logistics/__init__.py +0 -0
  392. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packs/payments/__init__.py +0 -0
  393. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packs/realty/__init__.py +0 -0
  394. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packs/registry.py +0 -0
  395. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/packs/rules.py +0 -0
  396. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/plan_utils.py +0 -0
  397. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/plugin_loader.py +0 -0
  398. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/portfolio_ledger.py +0 -0
  399. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/preview_server.py +0 -0
  400. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/privacy/__init__.py +0 -0
  401. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/privacy/feedback.py +0 -0
  402. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/project_review.py +0 -0
  403. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/project_review_api.py +0 -0
  404. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/project_review_server.py +0 -0
  405. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/project_tools.py +0 -0
  406. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/__init__.py +0 -0
  407. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/llm/__init__.py +0 -0
  408. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/llm/anthropic.py +0 -0
  409. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/llm/autoconfig.py +0 -0
  410. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/llm/base.py +0 -0
  411. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/llm/custom.py +0 -0
  412. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/llm/ollama.py +0 -0
  413. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/llm/openai_compat.py +0 -0
  414. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/llm/registry.py +0 -0
  415. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/local_image_provider.py +0 -0
  416. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/local_llm_provider.py +0 -0
  417. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/providers/tool_messages.py +0 -0
  418. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/realty_data_tools.py +0 -0
  419. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/relay_store.py +0 -0
  420. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/report_exporters.py +0 -0
  421. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/report_generator.py +0 -0
  422. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/review_service.py +0 -0
  423. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/__init__.py +0 -0
  424. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/acceptance.py +0 -0
  425. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/agent_loop.py +0 -0
  426. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/approval.py +0 -0
  427. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/budget.py +0 -0
  428. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/checkpoints.py +0 -0
  429. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/crash_report.py +0 -0
  430. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/events.py +0 -0
  431. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/gateway.py +0 -0
  432. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/lsp.py +0 -0
  433. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/orchestrator.py +0 -0
  434. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/repo_map.py +0 -0
  435. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/run_state.py +0 -0
  436. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/run_store.py +0 -0
  437. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/self_healing.py +0 -0
  438. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/subagent.py +0 -0
  439. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/task_ledger.py +0 -0
  440. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/task_orchestrator.py +0 -0
  441. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/tool_executor.py +0 -0
  442. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/tool_policy.py +0 -0
  443. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runtime/worktrees.py +0 -0
  444. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/runway_video_client.py +0 -0
  445. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/safety/__init__.py +0 -0
  446. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/safety/permissions.py +0 -0
  447. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/safety/service.py +0 -0
  448. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/setup_wizard.py +0 -0
  449. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/spreadsheet_tools.py +0 -0
  450. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/strategy_vault.py +0 -0
  451. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/__init__.py +0 -0
  452. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/artifact_tools.py +0 -0
  453. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/broker_tools.py +0 -0
  454. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/build_quant_engine.py +0 -0
  455. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/code_audit_tools.py +0 -0
  456. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/computer_use_tools.py +0 -0
  457. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/data_analysis_tools.py +0 -0
  458. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/enterprise_finance_tools.py +0 -0
  459. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/extended_tools.py +0 -0
  460. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/file_analysis_tools.py +0 -0
  461. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/image_gen_tools.py +0 -0
  462. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/local_finance_tools.py +0 -0
  463. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/logistics_carriers.py +0 -0
  464. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/logistics_inventory.py +0 -0
  465. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/logistics_io.py +0 -0
  466. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/logistics_tenancy.py +0 -0
  467. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/logistics_tools.py +0 -0
  468. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/macro_tools.py +0 -0
  469. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/notification_tools.py +0 -0
  470. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/project_tools.py +0 -0
  471. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/realty_data_tools.py +0 -0
  472. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/spreadsheet_tools.py +0 -0
  473. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/tools/stripe_tools.py +0 -0
  474. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/__init__.py +0 -0
  475. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/banner.py +0 -0
  476. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/completer.py +0 -0
  477. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/console.py +0 -0
  478. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/image_render.py +0 -0
  479. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/input_box.py +0 -0
  480. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/mentions.py +0 -0
  481. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/picker.py +0 -0
  482. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/render/__init__.py +0 -0
  483. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/render/finance.py +0 -0
  484. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/render/market.py +0 -0
  485. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/render/responsive.py +0 -0
  486. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/render/team.py +0 -0
  487. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/robot.py +0 -0
  488. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/ui/startup_dashboard.py +0 -0
  489. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/utils/vscode_uri.py +0 -0
  490. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/video_analysis.py +0 -0
  491. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/video_editor.py +0 -0
  492. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/workspace/__init__.py +0 -0
  493. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/workspace/files.py +0 -0
  494. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/workspace/verify.py +0 -0
  495. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/workspace_changes.py +0 -0
  496. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/workspace_context.py +0 -0
  497. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/workspace_service.py +0 -0
  498. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code/workspace_tools.py +0 -0
  499. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code.egg-info/dependency_links.txt +0 -0
  500. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code.egg-info/entry_points.txt +0 -0
  501. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code.egg-info/requires.txt +0 -0
  502. {aria_code-0.86.0 → aria_code-0.88.0}/src/aria_code.egg-info/top_level.txt +0 -0
  503. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_adk_market_tools.py +0 -0
  504. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_agent_team_fallback.py +0 -0
  505. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_analyze_file_tool.py +0 -0
  506. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_architecture_ledger_is_true.py +0 -0
  507. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_architecture_report.py +0 -0
  508. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_aria_cli_core.py +0 -0
  509. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_aria_mcp_server.py +0 -0
  510. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_aria_sdk.py +0 -0
  511. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_artifact_publishing.py +0 -0
  512. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_artifacts_and_reports.py +0 -0
  513. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_ashare_prediction_cmds.py +0 -0
  514. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_backtest_cmds.py +0 -0
  515. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_backtest_engine.py +0 -0
  516. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_backtest_report.py +0 -0
  517. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_binary_bundles_runtime_imports.py +0 -0
  518. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_broken_akshare_is_optional.py +0 -0
  519. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_broker_automation.py +0 -0
  520. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_broker_chat_confirm_gate.py +0 -0
  521. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_broker_planning.py +0 -0
  522. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_broker_safety.py +0 -0
  523. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_broker_tools.py +0 -0
  524. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_budget.py +0 -0
  525. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_business_workflow_cmds.py +0 -0
  526. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_canva_client.py +0 -0
  527. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_canvas_cmds.py +0 -0
  528. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_card_approvals.py +0 -0
  529. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_channel_intake.py +0 -0
  530. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_channels.py +0 -0
  531. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_chart_handlers.py +0 -0
  532. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_chat_bots_fail_closed.py +0 -0
  533. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_chat_routing.py +0 -0
  534. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_ci_security_workflow.py +0 -0
  535. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_cli_app_split.py +0 -0
  536. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_cli_bootstrap.py +0 -0
  537. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_cli_config_store.py +0 -0
  538. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_cli_lifecycle_hooks.py +0 -0
  539. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_cli_runtime_consumer.py +0 -0
  540. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_cli_tool_executor_module.py +0 -0
  541. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_cli_updater.py +0 -0
  542. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_cloud_memory.py +0 -0
  543. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_code_audit_tools.py +0 -0
  544. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_code_review_agent.py +0 -0
  545. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_codegen_output.py +0 -0
  546. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_coder_tester_self_healing.py +0 -0
  547. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_coder_tool_safety.py +0 -0
  548. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_collaboration.py +0 -0
  549. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_command_loggers.py +0 -0
  550. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_command_safety.py +0 -0
  551. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_completions_builder.py +0 -0
  552. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_config_paths.py +0 -0
  553. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_configured_provider.py +0 -0
  554. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_container_entrypoint.py +0 -0
  555. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_container_entrypoints.py +0 -0
  556. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_context_checkpoints.py +0 -0
  557. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_context_references.py +0 -0
  558. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_context_service.py +0 -0
  559. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_conversation_core.py +0 -0
  560. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_crash_report.py +0 -0
  561. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_credential_file_permissions.py +0 -0
  562. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_custom_providers.py +0 -0
  563. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_daemon_gateway_config.py +0 -0
  564. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_dashboard_generator.py +0 -0
  565. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_data_service.py +0 -0
  566. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_data_service_imports.py +0 -0
  567. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_datasource_routing.py +0 -0
  568. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_deep_analysis.py +0 -0
  569. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_degrades_without_quant_engine.py +0 -0
  570. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_dispatcher_pins_match_the_release.py +0 -0
  571. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_doctor.py +0 -0
  572. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_doctor_describes_the_current_install.py +0 -0
  573. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_doctor_npm_scope.py +0 -0
  574. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_engine_boundary.py +0 -0
  575. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_enterprise_tool_honesty.py +0 -0
  576. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_env_switch_docs.py +0 -0
  577. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_evals_harness.py +0 -0
  578. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_event_import_roots.py +0 -0
  579. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_extended_tools.py +0 -0
  580. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_feishu_swarm_config.py +0 -0
  581. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_finalize_release.py +0 -0
  582. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_finance_renderers.py +0 -0
  583. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_finance_service_catalog.py +0 -0
  584. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_first_run_output.py +0 -0
  585. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_first_run_works.py +0 -0
  586. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_football_agent.py +0 -0
  587. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_football_prediction_output.py +0 -0
  588. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_google_cloud_models.py +0 -0
  589. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_google_cloud_routing.py +0 -0
  590. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_google_login.py +0 -0
  591. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_google_search_provider.py +0 -0
  592. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_headless_is_agentic.py +0 -0
  593. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_honest_surfaces.py +0 -0
  594. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_image_gen_tools.py +0 -0
  595. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_image_inputs.py +0 -0
  596. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_import_graph_budget.py +0 -0
  597. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_intent_router.py +0 -0
  598. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_intent_signals.py +0 -0
  599. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_kling_video_client.py +0 -0
  600. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_lazy_rebind.py +0 -0
  601. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_legacy_module_imports.py +0 -0
  602. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_license_consistency.py +0 -0
  603. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_licensing.py +0 -0
  604. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_local_image_provider.py +0 -0
  605. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_logistics_3pl.py +0 -0
  606. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_logistics_and_finance_agents.py +0 -0
  607. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_lsp.py +0 -0
  608. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_markdown_pdf.py +0 -0
  609. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_market_data_client.py +0 -0
  610. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_market_history_inheritance.py +0 -0
  611. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_market_history_tool.py +0 -0
  612. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_market_hours.py +0 -0
  613. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_market_questions_on_backend.py +0 -0
  614. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_market_symbol_extraction.py +0 -0
  615. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_market_universe.py +0 -0
  616. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_mcp_circuit.py +0 -0
  617. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_mcp_client.py +0 -0
  618. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_mentions.py +0 -0
  619. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_model_capability_registry.py +0 -0
  620. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_model_choice_is_the_users.py +0 -0
  621. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_model_selection_state.py +0 -0
  622. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_native_binary_entrypoints.py +0 -0
  623. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_native_installer.py +0 -0
  624. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_natural_language_routing.py +0 -0
  625. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_new_modules.py +0 -0
  626. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_no_hardcoded_developer_paths.py +0 -0
  627. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_no_uncommitted_imports.py +0 -0
  628. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_numeric_listings.py +0 -0
  629. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_ollama_stream_imports.py +0 -0
  630. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_ollama_stream_tools.py +0 -0
  631. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_openai_image_client.py +0 -0
  632. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_operations_suite.py +0 -0
  633. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_packages_facade.py +0 -0
  634. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_packaging_constraints.py +0 -0
  635. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_packaging_manifest.py +0 -0
  636. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_packs_domains.py +0 -0
  637. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_pdf_report.py +0 -0
  638. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_pick_best_installed_model.py +0 -0
  639. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_plan_mode.py +0 -0
  640. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_platform_package_assembly.py +0 -0
  641. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_platform_packages.py +0 -0
  642. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_plotly_html_output.py +0 -0
  643. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_portfolio_ledger.py +0 -0
  644. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_post_turn_context_decision.py +0 -0
  645. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_preflight.py +0 -0
  646. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_preview_server.py +0 -0
  647. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_privacy_feedback.py +0 -0
  648. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_project_aria.py +0 -0
  649. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_project_review.py +0 -0
  650. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_project_review_api.py +0 -0
  651. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_prompt_assembly.py +0 -0
  652. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_prompt_selection.py +0 -0
  653. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_provider_autoconfig.py +0 -0
  654. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_provider_error_messages.py +0 -0
  655. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_provider_integration.py +0 -0
  656. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_provider_registry.py +0 -0
  657. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_public_service_status.py +0 -0
  658. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_quant_engine_namespace.py +0 -0
  659. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_rebind_contract.py +0 -0
  660. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_rebind_namespace_contract.py +0 -0
  661. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_relay_client_credentials.py +0 -0
  662. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_relay_event_verification.py +0 -0
  663. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_relay_sends_for_clients.py +0 -0
  664. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_relay_store.py +0 -0
  665. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_relay_url.py +0 -0
  666. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_release_chain.py +0 -0
  667. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_release_commit_identity.py +0 -0
  668. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_release_push_is_atomic.py +0 -0
  669. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_release_reaches_the_registries.py +0 -0
  670. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_release_verification_waits.py +0 -0
  671. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_release_workflow_permissions.py +0 -0
  672. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_report_charts.py +0 -0
  673. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_report_generator.py +0 -0
  674. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_research_protocol.py +0 -0
  675. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_research_quality.py +0 -0
  676. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_responsive_rendering.py +0 -0
  677. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_review_service.py +0 -0
  678. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_root_module_budget.py +0 -0
  679. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_rsi_without_pandas_ta.py +0 -0
  680. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_acceptance.py +0 -0
  681. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_agent_loop.py +0 -0
  682. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_approval.py +0 -0
  683. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_bridge.py +0 -0
  684. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_bridge_fallback.py +0 -0
  685. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_checkpoints.py +0 -0
  686. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_event_identity.py +0 -0
  687. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_gateway.py +0 -0
  688. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_repo_map.py +0 -0
  689. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_run_store.py +0 -0
  690. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_tool_executor.py +0 -0
  691. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runtime_worktrees.py +0 -0
  692. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_runway_video_client.py +0 -0
  693. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_safety_permissions.py +0 -0
  694. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_safety_service.py +0 -0
  695. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_safety_service_adoption.py +0 -0
  696. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_service_diagnostics_security.py +0 -0
  697. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_session_search.py +0 -0
  698. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_settings_service.py +0 -0
  699. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_shipper_digest.py +0 -0
  700. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_single_import_root.py +0 -0
  701. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_skill_agent_binding.py +0 -0
  702. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_skill_catalog.py +0 -0
  703. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_skill_loader.py +0 -0
  704. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_slash_popup.py +0 -0
  705. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_spreadsheet_tools.py +0 -0
  706. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_sse_stream_contract.py +0 -0
  707. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_startup_dashboard.py +0 -0
  708. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_startup_latency.py +0 -0
  709. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_status_language.py +0 -0
  710. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_streaming_pipeline.py +0 -0
  711. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_stripe_agent.py +0 -0
  712. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_subagent.py +0 -0
  713. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_supervisor_routing.py +0 -0
  714. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_system_prompts.py +0 -0
  715. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_system_tools_output.py +0 -0
  716. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_task_orchestrator.py +0 -0
  717. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_team_synthesis.py +0 -0
  718. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_tls_trust_store.py +0 -0
  719. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_tool_policy.py +0 -0
  720. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_tool_rounds_on_openai_apis.py +0 -0
  721. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_tool_scope.py +0 -0
  722. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_tool_step_output.py +0 -0
  723. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_trading_service.py +0 -0
  724. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_tradingview_bridge.py +0 -0
  725. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_turn_planning.py +0 -0
  726. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_ui_completer_references.py +0 -0
  727. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_ui_console_theme.py +0 -0
  728. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_ui_input_box.py +0 -0
  729. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_ui_language_and_model.py +0 -0
  730. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_ui_robot_banner.py +0 -0
  731. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_update_health_routes.py +0 -0
  732. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_verification_hint.py +0 -0
  733. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_verification_policy.py +0 -0
  734. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_version_consistency.py +0 -0
  735. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_version_counter.py +0 -0
  736. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_video_analysis.py +0 -0
  737. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_video_editor.py +0 -0
  738. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_vscode_mcp.py +0 -0
  739. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_warehouse_agents.py +0 -0
  740. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_warehouse_cli_registration.py +0 -0
  741. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_warehouse_erp_client.py +0 -0
  742. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_warehouse_workflow.py +0 -0
  743. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_wheel_is_installable.py +0 -0
  744. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_workspace_changes.py +0 -0
  745. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_workspace_context.py +0 -0
  746. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_workspace_files.py +0 -0
  747. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_workspace_scope.py +0 -0
  748. {aria_code-0.86.0 → aria_code-0.88.0}/tests/test_workspace_service.py +0 -0
  749. {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.86.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.86.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" }
@@ -17,4 +17,4 @@ from __future__ import annotations
17
17
 
18
18
  __all__ = ["__version__"]
19
19
 
20
- __version__ = "0.86.0"
20
+ __version__ = "0.88.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
- meta = f"For: {horizon}"
394
- if source:
395
- meta += f" · Source: {source}"
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
- meta = f"适合:{horizon}"
402
- if source:
403
- meta += f" · 来源:{source}"
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) use '$' (USD); A-shares use '¥' (CNY); HK assets use 'HK$'. Never mix currencies.\n"
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
- "- 严格匹配货币符号:美股(如 AAPL、TSLA)必须使用 '$' (USD);A股使用 '¥' (CNY);港股使用 'HK$'。严禁将美股均线/价格标注为人民币。\n"
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.86.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 "For: 1-5 days" in text and "For: 1-8 weeks" in text and "For: 2-12 months" in text
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 "适合:1-5 日" in text and "**下一步**" in text
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
- assert "- **4H/短线**" in result["response"]
126
- assert " - 支撑:" in result["response"]
127
- assert " - 压力:" in result["response"]
128
- assert " - 用法:" in result["response"]
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