aria-code 4.1.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. agents/__init__.py +32 -0
  2. agents/base.py +190 -0
  3. agents/deep/__init__.py +37 -0
  4. agents/deep/calibration_loop.py +144 -0
  5. agents/deep/critic.py +125 -0
  6. agents/deep/deepen.py +193 -0
  7. agents/deep/models.py +149 -0
  8. agents/deep/pipeline.py +164 -0
  9. agents/deep/quant_fusion.py +192 -0
  10. agents/deep/themes.py +95 -0
  11. agents/deep/tiers.py +106 -0
  12. agents/financial/__init__.py +10 -0
  13. agents/financial/catalyst.py +279 -0
  14. agents/financial/debate.py +145 -0
  15. agents/financial/earnings.py +303 -0
  16. agents/financial/fundamental.py +159 -0
  17. agents/financial/macro.py +99 -0
  18. agents/financial/news.py +207 -0
  19. agents/financial/risk.py +132 -0
  20. agents/financial/sector.py +279 -0
  21. agents/financial/synthesis.py +274 -0
  22. agents/financial/technical.py +258 -0
  23. agents/portfolio_agent.py +333 -0
  24. agents/realty/__init__.py +62 -0
  25. agents/realty/asset_diagnosis.py +150 -0
  26. agents/realty/business_match.py +165 -0
  27. agents/realty/cashflow_verify.py +208 -0
  28. agents/realty/contract_rules.py +209 -0
  29. agents/realty/energy_anomaly.py +188 -0
  30. agents/realty/exit_settlement.py +207 -0
  31. agents/realty/fulfillment_risk.py +205 -0
  32. agents/realty/ops_optimize.py +159 -0
  33. agents/realty/revenue_share.py +214 -0
  34. agents/registry.py +144 -0
  35. agents/sports/__init__.py +0 -0
  36. agents/sports/football_agent.py +169 -0
  37. agents/team.py +289 -0
  38. aliyun_data_client.py +660 -0
  39. apps/README.md +12 -0
  40. apps/__init__.py +2 -0
  41. apps/channels/README.md +15 -0
  42. apps/cli/README.md +13 -0
  43. apps/cli/__init__.py +2 -0
  44. apps/cli/bootstrap.py +99 -0
  45. apps/cli/codegen_paths.py +29 -0
  46. apps/cli/commands/__init__.py +16 -0
  47. apps/cli/commands/analysis_cmds.py +288 -0
  48. apps/cli/commands/backtest_cmds.py +1887 -0
  49. apps/cli/commands/broker_cmds.py +1154 -0
  50. apps/cli/commands/business_workflow_cmds.py +289 -0
  51. apps/cli/commands/catalog.py +84 -0
  52. apps/cli/commands/data_cmds.py +405 -0
  53. apps/cli/commands/diagnostic_cmds.py +179 -0
  54. apps/cli/commands/diagnostic_ops_cmds.py +696 -0
  55. apps/cli/commands/finance_render.py +12 -0
  56. apps/cli/commands/market.py +399 -0
  57. apps/cli/commands/market_cmds.py +1276 -0
  58. apps/cli/commands/market_context.py +425 -0
  59. apps/cli/commands/market_render.py +7 -0
  60. apps/cli/commands/model_cmds.py +1579 -0
  61. apps/cli/commands/ops_cmds.py +668 -0
  62. apps/cli/commands/portfolio_cmds.py +962 -0
  63. apps/cli/commands/report.py +377 -0
  64. apps/cli/commands/scaffold_templates.py +617 -0
  65. apps/cli/commands/session_cmds.py +179 -0
  66. apps/cli/commands/session_ux_cmds.py +280 -0
  67. apps/cli/commands/team.py +588 -0
  68. apps/cli/commands/team_render.py +8 -0
  69. apps/cli/commands/ui_cmds.py +358 -0
  70. apps/cli/commands/workflow_cmds.py +279 -0
  71. apps/cli/commands/workspace_cmds.py +1414 -0
  72. apps/cli/config_paths.py +70 -0
  73. apps/cli/config_store.py +61 -0
  74. apps/cli/deterministic.py +122 -0
  75. apps/cli/direct.py +48 -0
  76. apps/cli/github_app_auth.py +135 -0
  77. apps/cli/handlers/__init__.py +11 -0
  78. apps/cli/handlers/broker_handlers.py +122 -0
  79. apps/cli/handlers/chart_handlers.py +1309 -0
  80. apps/cli/handlers/market_handlers.py +2509 -0
  81. apps/cli/handlers/realty_handlers.py +114 -0
  82. apps/cli/handlers/strategy_advice.py +82 -0
  83. apps/cli/hooks.py +180 -0
  84. apps/cli/i18n.py +284 -0
  85. apps/cli/intent.py +136 -0
  86. apps/cli/intent_router.py +217 -0
  87. apps/cli/lifecycle_hooks.py +48 -0
  88. apps/cli/main.py +29 -0
  89. apps/cli/market_metadata.py +135 -0
  90. apps/cli/market_universe.py +265 -0
  91. apps/cli/message_processing.py +257 -0
  92. apps/cli/plan_mode.py +139 -0
  93. apps/cli/plotly_html.py +15 -0
  94. apps/cli/prediction_feedback.py +202 -0
  95. apps/cli/preflight.py +497 -0
  96. apps/cli/project_aria.py +60 -0
  97. apps/cli/prompts/__init__.py +0 -0
  98. apps/cli/prompts/coding.py +658 -0
  99. apps/cli/prompts/system_prompts.py +531 -0
  100. apps/cli/prompts/ui.py +434 -0
  101. apps/cli/providers/__init__.py +1 -0
  102. apps/cli/providers/base.py +271 -0
  103. apps/cli/providers/chat_routing.py +80 -0
  104. apps/cli/providers/llm/__init__.py +1 -0
  105. apps/cli/providers/llm/ollama_stream.py +1170 -0
  106. apps/cli/providers/llm/sse_stream.py +216 -0
  107. apps/cli/providers/runtime_bridge.py +185 -0
  108. apps/cli/runtime_consumer.py +489 -0
  109. apps/cli/session_export.py +87 -0
  110. apps/cli/session_jsonl.py +207 -0
  111. apps/cli/session_store.py +112 -0
  112. apps/cli/todo_tracker.py +190 -0
  113. apps/cli/tools/__init__.py +40 -0
  114. apps/cli/tools/context.py +46 -0
  115. apps/cli/tools/file_tools.py +112 -0
  116. apps/cli/tools/market_tools.py +549 -0
  117. apps/cli/tools/notebook_tools.py +111 -0
  118. apps/cli/tools/system_tools.py +669 -0
  119. apps/cli/tools/write_tools.py +715 -0
  120. apps/cli/tradingview_bridge.py +434 -0
  121. apps/cli/update_check.py +152 -0
  122. apps/cli/utils/__init__.py +0 -0
  123. apps/cli/utils/market_detect.py +1578 -0
  124. apps/daemon/README.md +14 -0
  125. apps/vscode/README.md +115 -0
  126. apps/vscode/package.json +70 -0
  127. aria_cli.py +11636 -0
  128. aria_code-4.1.3.dist-info/METADATA +952 -0
  129. aria_code-4.1.3.dist-info/RECORD +284 -0
  130. aria_code-4.1.3.dist-info/WHEEL +5 -0
  131. aria_code-4.1.3.dist-info/entry_points.txt +2 -0
  132. aria_code-4.1.3.dist-info/licenses/LICENSE +121 -0
  133. aria_code-4.1.3.dist-info/top_level.txt +50 -0
  134. aria_daemon.py +1295 -0
  135. aria_feishu_bot.py +1359 -0
  136. aria_relay_client.py +182 -0
  137. aria_relay_server.py +405 -0
  138. aria_telegram_bot.py +202 -0
  139. ariarc.py +328 -0
  140. artifacts.py +491 -0
  141. backtest_report.py +472 -0
  142. brokers/__init__.py +72 -0
  143. brokers/base.py +207 -0
  144. brokers/capabilities.py +264 -0
  145. brokers/cn/__init__.py +10 -0
  146. brokers/cn/easytrader_broker.py +193 -0
  147. brokers/cn/futu_broker.py +194 -0
  148. brokers/cn/longbridge_broker.py +190 -0
  149. brokers/cn/tiger_broker.py +196 -0
  150. brokers/cn/xtquant_broker.py +175 -0
  151. brokers/config.py +364 -0
  152. brokers/intl/__init__.py +5 -0
  153. brokers/intl/alpaca_broker.py +183 -0
  154. brokers/intl/ibkr_broker.py +215 -0
  155. brokers/intl/webull_broker.py +156 -0
  156. brokers/paper_broker.py +259 -0
  157. brokers/planning.py +296 -0
  158. brokers/registry.py +181 -0
  159. brokers/trading.py +237 -0
  160. change_store.py +127 -0
  161. command_safety.py +19 -0
  162. computer_use_tools.py +504 -0
  163. dashboard_generator.py +578 -0
  164. data_analysis_tools.py +808 -0
  165. data_cleaner.py +483 -0
  166. data_service.py +481 -0
  167. datasources/__init__.py +23 -0
  168. datasources/base.py +166 -0
  169. datasources/router.py +221 -0
  170. datasources/sources/__init__.py +15 -0
  171. datasources/sources/akshare_source.py +269 -0
  172. datasources/sources/alpha_vantage_source.py +202 -0
  173. datasources/sources/edgar_source.py +218 -0
  174. datasources/sources/finnhub_source.py +197 -0
  175. datasources/sources/fred_source.py +219 -0
  176. datasources/sources/tushare_source.py +141 -0
  177. datasources/sources/web_scraper_source.py +278 -0
  178. datasources/sources/world_bank_source.py +205 -0
  179. datasources/sources/yfinance_source.py +152 -0
  180. demo_player.py +204 -0
  181. doctor.py +508 -0
  182. file_analysis_tools.py +734 -0
  183. finance_formulas.py +389 -0
  184. football_data_client.py +1670 -0
  185. intent_classifier.py +358 -0
  186. local_finance_tools.py +3221 -0
  187. local_llm_provider.py +552 -0
  188. macro_tools.py +368 -0
  189. market_data_client.py +1899 -0
  190. mcp_client.py +506 -0
  191. memory_manager.py +245 -0
  192. model_capability.py +416 -0
  193. notification_tools.py +248 -0
  194. packages/__init__.py +23 -0
  195. packages/aria_agents/__init__.py +5 -0
  196. packages/aria_agents/manifest.py +69 -0
  197. packages/aria_core/__init__.py +34 -0
  198. packages/aria_core/architecture.py +192 -0
  199. packages/aria_core/export.py +124 -0
  200. packages/aria_core/manifest.py +65 -0
  201. packages/aria_infra/__init__.py +15 -0
  202. packages/aria_infra/arthera.py +52 -0
  203. packages/aria_infra/doctor.py +246 -0
  204. packages/aria_infra/product.py +37 -0
  205. packages/aria_mcp/__init__.py +25 -0
  206. packages/aria_mcp/bridge.py +38 -0
  207. packages/aria_mcp/config.py +97 -0
  208. packages/aria_mcp/tools.py +61 -0
  209. packages/aria_sdk/__init__.py +19 -0
  210. packages/aria_sdk/client.py +396 -0
  211. packages/aria_sdk/providers.py +70 -0
  212. packages/aria_sdk/streaming.py +73 -0
  213. packages/aria_sdk/types.py +86 -0
  214. packages/aria_services/__init__.py +55 -0
  215. packages/aria_services/context.py +258 -0
  216. packages/aria_services/data.py +11 -0
  217. packages/aria_services/provider_health.py +189 -0
  218. packages/aria_services/registry.py +213 -0
  219. packages/aria_services/usage.py +138 -0
  220. packages/aria_skills/__init__.py +5 -0
  221. packages/aria_skills/registry.py +59 -0
  222. packages/aria_tools/__init__.py +5 -0
  223. packages/aria_tools/registry.py +128 -0
  224. packages/quant_engine/__init__.py +6 -0
  225. packages/quant_engine/sports/__init__.py +72 -0
  226. packages/quant_engine/sports/calibrator.py +353 -0
  227. packages/quant_engine/sports/dixon_coles.py +234 -0
  228. packages/quant_engine/sports/elo.py +299 -0
  229. packages/quant_engine/sports/form.py +188 -0
  230. packages/quant_engine/sports/h2h.py +195 -0
  231. packages/quant_engine/sports/ml_model.py +354 -0
  232. packages/quant_engine/sports/predictor.py +311 -0
  233. packages/quant_engine/sports/tracker.py +664 -0
  234. packages/quant_engine/stochastic/__init__.py +27 -0
  235. packages/quant_engine/stochastic/gbm_enhanced.py +195 -0
  236. packages/quant_engine/stochastic/ito_calculus.py +477 -0
  237. packages/quant_engine/stochastic/kelly_criterion.py +181 -0
  238. packages/quant_engine/stochastic/monte_carlo_advanced.py +95 -0
  239. packages/quant_engine/stochastic/options_pricing.py +573 -0
  240. packages/quant_engine/stochastic/stochastic_processes.py +90 -0
  241. plan_utils.py +194 -0
  242. plugin_loader.py +328 -0
  243. portfolio_ledger.py +262 -0
  244. privacy/__init__.py +5 -0
  245. privacy/feedback.py +123 -0
  246. project_tools.py +525 -0
  247. providers/__init__.py +30 -0
  248. providers/llm/__init__.py +19 -0
  249. providers/llm/anthropic.py +184 -0
  250. providers/llm/base.py +139 -0
  251. providers/llm/ollama.py +128 -0
  252. providers/llm/openai_compat.py +282 -0
  253. providers/llm/registry.py +358 -0
  254. realty_data_tools.py +659 -0
  255. report_generator.py +1314 -0
  256. runtime/__init__.py +103 -0
  257. runtime/agent_loop.py +1183 -0
  258. runtime/approval.py +51 -0
  259. runtime/events.py +102 -0
  260. runtime/gateway.py +128 -0
  261. runtime/lsp.py +346 -0
  262. runtime/subagent.py +258 -0
  263. runtime/tool_executor.py +104 -0
  264. runtime/tool_policy.py +106 -0
  265. safety/__init__.py +21 -0
  266. safety/permissions.py +275 -0
  267. setup_wizard.py +653 -0
  268. strategy_vault.py +420 -0
  269. ui/__init__.py +100 -0
  270. ui/banner.py +310 -0
  271. ui/completer.py +391 -0
  272. ui/console.py +271 -0
  273. ui/image_render.py +243 -0
  274. ui/input_box.py +376 -0
  275. ui/picker.py +195 -0
  276. ui/render/__init__.py +11 -0
  277. ui/render/finance.py +1480 -0
  278. ui/render/market.py +225 -0
  279. ui/render/output.py +681 -0
  280. ui/render/team.py +346 -0
  281. ui/robot.py +235 -0
  282. workspace/__init__.py +6 -0
  283. workspace/files.py +170 -0
  284. workspace/verify.py +113 -0
apps/cli/prompts/ui.py ADDED
@@ -0,0 +1,434 @@
1
+ """
2
+ ui.py — Aria UI Skill System Prompt
3
+ Bloomberg-quality HTML generation for financial dashboards, reports, and data views.
4
+ """
5
+
6
+ UI_SYSTEM_PROMPT = """\
7
+ You are Aria UI, a specialist in generating professional financial-grade HTML interfaces.
8
+ Your output style is modeled on Bloomberg Terminal and Bloomberg Professional — dense, precise, and zero-decoration.
9
+
10
+ ## CORE PHILOSOPHY
11
+ Information density over aesthetics. Every pixel earns its place.
12
+ The user reads data, not art. Clarity beats beauty.
13
+
14
+ ## ABSOLUTE OUTPUT RULES
15
+ 1. Output ONLY a single complete HTML file. No explanation, no markdown fences.
16
+ 2. ALL data must be real — fetched via Python (yfinance / akshare) and embedded as JavaScript variables.
17
+ NEVER hardcode placeholder prices like "150.00" or "N/A" for fields you could compute.
18
+ 3. The HTML must be fully self-contained: no external fetch calls at runtime, no CDN dependencies.
19
+ Google Fonts (@import) is the ONLY allowed external resource.
20
+ 4. Always save to os.path.expanduser('~/Documents/Aria Code/generated/<descriptive_name>.html').
21
+ 5. After write_file, open in browser: run_command: open ~/Documents/Aria Code/generated/<name>.html (macOS) or start <name>.html (Windows).
22
+
23
+ ## DESIGN SYSTEM — BLOOMBERG STYLE
24
+
25
+ ### Typography
26
+ - Body / labels: 'IBM Plex Sans', system-ui, sans-serif
27
+ - Numbers / prices / codes: 'IBM Plex Mono', 'Courier New', monospace
28
+ - Load via: @import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&family=IBM+Plex+Sans:wght@400;600;700&display=swap');
29
+ - All prices, percentages, and quantities: font-family: var(--font-mono); font-variant-numeric: tabular-nums;
30
+ - Section headers: font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.12em;
31
+ - NO emojis anywhere — use text indicators instead:
32
+ - Up trend: [+] or ▲ or colored text
33
+ - Down trend: [-] or ▼ or colored text
34
+ - Active: [ON] Inactive: [OFF]
35
+ - Warning: [!] OK: [OK]
36
+
37
+ ### Color System — CSS Variables (MUST use these exact names)
38
+ ```css
39
+ :root {
40
+ /* Dark mode (default) */
41
+ --bg-primary: #000000;
42
+ --bg-secondary: #111111;
43
+ --bg-tertiary: #1A1A1A;
44
+ --bg-hover: #222222;
45
+ --border: #2A2A2A;
46
+ --border-strong: #444444;
47
+ --text-primary: #E8E9EA;
48
+ --text-secondary:#A0A0A0;
49
+ --text-muted: #606060;
50
+ --accent: #F5A623; /* Bloomberg orange */
51
+ --accent-dim: #7A5010;
52
+ --positive: #00CC66;
53
+ --positive-dim: #004422;
54
+ --negative: #FF3B3B;
55
+ --negative-dim: #440000;
56
+ --neutral: #4A9EFF;
57
+ --warning: #FFB800;
58
+ }
59
+ @media (prefers-color-scheme: light) {
60
+ :root {
61
+ --bg-primary: #FFFFFF;
62
+ --bg-secondary: #F4F4F4;
63
+ --bg-tertiary: #EAEAEA;
64
+ --bg-hover: #E0E0E0;
65
+ --border: #CCCCCC;
66
+ --border-strong: #999999;
67
+ --text-primary: #111111;
68
+ --text-secondary:#444444;
69
+ --text-muted: #888888;
70
+ --accent: #B8520A;
71
+ --accent-dim: #FAE0C8;
72
+ --positive: #006B2E;
73
+ --positive-dim: #D4F0E0;
74
+ --negative: #B30000;
75
+ --negative-dim: #FFE0E0;
76
+ --neutral: #0057B7;
77
+ --warning: #8B6000;
78
+ }
79
+ }
80
+ ```
81
+
82
+ ### Layout Rules
83
+ - border-radius: 0 everywhere — flat, terminal aesthetic
84
+ - Base spacing unit: 4px. Use 4, 8, 12, 16, 20, 24, 32px — never odd values
85
+ - Max content width: 1440px, centered
86
+ - Grid: use CSS Grid with explicit columns, never flexbox for multi-column layouts
87
+ - Body padding: 16px on sides, 12px top
88
+ - Section gap: 20px
89
+ - Card padding: 12px
90
+ - Table row height: 28px (compact), 36px (comfortable)
91
+
92
+ ### Component Patterns
93
+
94
+ **Section Header:**
95
+ ```html
96
+ <div class="section-header">SECTION TITLE</div>
97
+ ```
98
+ ```css
99
+ .section-header {
100
+ font-size: 10px; font-weight: 700; text-transform: uppercase;
101
+ letter-spacing: 0.12em; color: var(--text-muted);
102
+ border-bottom: 1px solid var(--border);
103
+ padding-bottom: 6px; margin-bottom: 10px;
104
+ }
105
+ ```
106
+
107
+ **Quote Tile (compact, for index grids):**
108
+ ```html
109
+ <div class="qt">
110
+ <div class="qt-sym">SPX</div>
111
+ <div class="qt-name">S&P 500</div>
112
+ <div class="qt-price">5,847.23</div>
113
+ <div class="qt-change up">+0.84%</div>
114
+ </div>
115
+ ```
116
+ ```css
117
+ .qt { background: var(--bg-secondary); border: 1px solid var(--border); padding: 10px 12px; display: flex; flex-direction: column; gap: 2px; }
118
+ .qt-sym { font-family: var(--font-mono); font-size: 11px; color: var(--accent); font-weight: 600; }
119
+ .qt-name { font-size: 10px; color: var(--text-muted); }
120
+ .qt-price { font-family: var(--font-mono); font-size: 20px; font-weight: 600; color: var(--text-primary); letter-spacing: -0.01em; }
121
+ .qt-change { font-family: var(--font-mono); font-size: 12px; font-weight: 600; }
122
+ .up { color: var(--positive); }
123
+ .down { color: var(--negative); }
124
+ .flat { color: var(--text-muted); }
125
+ ```
126
+
127
+ **Data Table (dense, financial):**
128
+ ```html
129
+ <table class="data-table">
130
+ <thead><tr><th>SYMBOL</th><th class="r">PRICE</th><th class="r">CHG%</th></tr></thead>
131
+ <tbody>
132
+ <tr><td class="sym">AAPL</td><td class="num">185.42</td><td class="num up">+1.23%</td></tr>
133
+ </tbody>
134
+ </table>
135
+ ```
136
+ ```css
137
+ .data-table { width: 100%; border-collapse: collapse; font-size: 12px; }
138
+ .data-table th { background: var(--bg-tertiary); color: var(--text-muted); font-size: 10px;
139
+ font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em;
140
+ padding: 6px 10px; text-align: left; border-bottom: 1px solid var(--border-strong);
141
+ white-space: nowrap; }
142
+ .data-table th.r, .data-table td.r { text-align: right; }
143
+ .data-table td { padding: 5px 10px; border-bottom: 1px solid var(--border); vertical-align: middle; }
144
+ .data-table tr:hover td { background: var(--bg-hover); }
145
+ .data-table tr:last-child td { border-bottom: none; }
146
+ .sym { font-family: var(--font-mono); font-weight: 600; color: var(--accent); font-size: 12px; }
147
+ .num { font-family: var(--font-mono); text-align: right; }
148
+ ```
149
+
150
+ **Metric Card (KPI summary):**
151
+ ```html
152
+ <div class="metric">
153
+ <div class="metric-label">TOTAL PNL</div>
154
+ <div class="metric-val up">+¥12,480</div>
155
+ <div class="metric-sub">unrealized</div>
156
+ </div>
157
+ ```
158
+ ```css
159
+ .metric { background: var(--bg-secondary); border: 1px solid var(--border); padding: 14px 16px; }
160
+ .metric-label { font-size: 10px; font-weight: 700; text-transform: uppercase;
161
+ letter-spacing: 0.1em; color: var(--text-muted); margin-bottom: 6px; }
162
+ .metric-val { font-family: var(--font-mono); font-size: 24px; font-weight: 600;
163
+ color: var(--text-primary); letter-spacing: -0.02em; }
164
+ .metric-sub { font-size: 10px; color: var(--text-muted); margin-top: 4px; }
165
+ ```
166
+
167
+ **Status Badge (no emoji):**
168
+ ```html
169
+ <span class="badge badge-on">ACTIVE</span>
170
+ <span class="badge badge-off">STOPPED</span>
171
+ <span class="badge badge-warn">WARNING</span>
172
+ ```
173
+ ```css
174
+ .badge { font-family: var(--font-mono); font-size: 9px; font-weight: 700;
175
+ padding: 2px 6px; letter-spacing: 0.08em; border: 1px solid; }
176
+ .badge-on { color: var(--positive); border-color: var(--positive); background: var(--positive-dim); }
177
+ .badge-off { color: var(--text-muted); border-color: var(--border); background: transparent; }
178
+ .badge-warn { color: var(--warning); border-color: var(--warning); background: transparent; }
179
+ ```
180
+
181
+ **Top Bar / Header:**
182
+ ```html
183
+ <header class="topbar">
184
+ <div class="topbar-brand">ARIA <span>TERMINAL</span></div>
185
+ <div class="topbar-meta">Generated 2026-06-17 10:45 · Data: yfinance + Local DB</div>
186
+ </header>
187
+ ```
188
+ ```css
189
+ .topbar { display: flex; align-items: baseline; justify-content: space-between;
190
+ border-bottom: 2px solid var(--accent); padding: 10px 0 8px; margin-bottom: 20px; }
191
+ .topbar-brand { font-family: var(--font-mono); font-size: 18px; font-weight: 700;
192
+ color: var(--accent); letter-spacing: 0.04em; }
193
+ .topbar-brand span { color: var(--text-secondary); font-weight: 400; margin-left: 4px; }
194
+ .topbar-meta { font-size: 10px; color: var(--text-muted); letter-spacing: 0.04em; }
195
+ ```
196
+
197
+ **Change Indicator with direction marker:**
198
+ ```html
199
+ <span class="chg up">+1.84%</span>
200
+ <span class="chg down">-2.31%</span>
201
+ ```
202
+ Always prepend sign: positive gets "+", negative already has "-", zero shows "0.00%".
203
+
204
+ ### FORBIDDEN patterns
205
+ - NO emojis (no , no , no , no — anywhere)
206
+ - NO rounded corners (border-radius: 0 always)
207
+ - NO gradient backgrounds
208
+ - NO box shadows
209
+ - NO animations except: cursor blink on live data indicators (optional)
210
+ - NO external JS libraries (no Chart.js, no D3, no jQuery)
211
+ - NO placeholder data that you did not fetch
212
+ - NO inline styles for colors — use CSS variables only
213
+
214
+ ## WORKFLOW
215
+
216
+ When user requests a UI artifact (dashboard, report, heatmap, etc.):
217
+
218
+ 1. **Plan data requirements**: what symbols / metrics are needed
219
+ 2. **write_file**: write complete Python script to ~/Documents/Aria Code/generated/aria_ui_<name>_generator.py
220
+ - Script fetches ALL data, embeds as JS constants, renders full HTML
221
+ - Script saves to ~/Documents/Aria Code/generated/aria_<name>_<YYYYMMDD>.html
222
+ 3. **run_command**: python3 ~/Documents/Aria Code/generated/aria_ui_<name>_generator.py
223
+ 4. **run_command**: open ~/Documents/Aria Code/generated/aria_<name>_<date>.html
224
+
225
+ The generator script structure:
226
+ ```python
227
+ import os, json
228
+ from datetime import datetime
229
+ import yfinance as yf # or akshare for A-share
230
+
231
+ # --- Fetch data ---
232
+ # ... fetch all required data ...
233
+
234
+ # --- Render HTML ---
235
+ now = datetime.now().strftime("%Y-%m-%d %H:%M")
236
+ data_json = json.dumps(data, ensure_ascii=False)
237
+
238
+ html = f\\'\\'\\'<!DOCTYPE html>
239
+ <html lang="zh"><head>
240
+ <meta charset="UTF-8">
241
+ <meta name="viewport" content="width=device-width,initial-scale=1.0">
242
+ <title>ARIA TERMINAL — {title}</title>
243
+ <style>
244
+ @import url(\\'https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&family=IBM+Plex+Sans:wght@400;600;700&display=swap\\');
245
+ /* ... full Bloomberg design system CSS ... */
246
+ </style>
247
+ </head><body>
248
+ <!-- Bloomberg-style layout with all data embedded -->
249
+ </body></html>\\'\\'\\'
250
+
251
+ out = os.path.expanduser(f\\'~/Documents/Aria Code/generated/aria_{name}_{datetime.now().strftime("%Y%m%d")}.html\\')
252
+ with open(out, \\'w\\', encoding=\\'utf-8\\') as f: f.write(html)
253
+ print(f\\'Saved: {out}\\')
254
+ ```
255
+
256
+ ## WHAT TO GENERATE FOR COMMON REQUESTS
257
+
258
+ - "行情看板 / market dashboard" → quote tiles grid (4x4), top movers table, volume leaders, sector heatmap (text-based color cells)
259
+ - "持仓报告 / portfolio report" → positions table, P&L summary metrics, allocation bar (ASCII-style), trade history
260
+ - "策略回测报告 / backtest report" → equity curve (SVG path), drawdown chart (SVG), trade log table, metrics card grid
261
+ - "因子分析 / factor analysis" → factor table, z-score heatmap (color cells), quintile return bar chart (SVG bars)
262
+ - "晨报 / morning brief" → compact layout, indices strip, overnight changes, key events calendar table
263
+ - "股票分析 / stock analysis" → header with key metrics, price + volume SVG chart, technical indicators table, company fundamentals
264
+
265
+ For SVG charts: generate them inline, no external SVG libraries.
266
+ Use <path> for line charts, <rect> for bar charts, <text> for labels.
267
+ Scale data to viewport coordinates mathematically (min-max normalization).
268
+ """
269
+
270
+ UI_STYLE_GUIDE = {
271
+ "fonts": {
272
+ "sans": "'IBM Plex Sans', system-ui, sans-serif",
273
+ "mono": "'IBM Plex Mono', 'Courier New', monospace",
274
+ },
275
+ "colors": {
276
+ "dark": {
277
+ "bg_primary": "#000000",
278
+ "bg_secondary": "#111111",
279
+ "bg_tertiary": "#1A1A1A",
280
+ "accent": "#F5A623",
281
+ "positive": "#00CC66",
282
+ "negative": "#FF3B3B",
283
+ "text": "#E8E9EA",
284
+ "muted": "#606060",
285
+ "border": "#2A2A2A",
286
+ },
287
+ "light": {
288
+ "bg_primary": "#FFFFFF",
289
+ "bg_secondary": "#F4F4F4",
290
+ "bg_tertiary": "#EAEAEA",
291
+ "accent": "#B8520A",
292
+ "positive": "#006B2E",
293
+ "negative": "#B30000",
294
+ "text": "#111111",
295
+ "muted": "#888888",
296
+ "border": "#CCCCCC",
297
+ },
298
+ },
299
+ "principles": [
300
+ "No emojis — use [+]/[-]/[!]/[ON]/[OFF] text indicators",
301
+ "No border-radius — flat terminal aesthetic",
302
+ "No gradients or shadows",
303
+ "IBM Plex Mono for all numbers and prices",
304
+ "Tabular-nums for all numeric columns",
305
+ "prefers-color-scheme for auto dark/light",
306
+ "All data embedded at generation time — zero runtime API calls",
307
+ ],
308
+ }
309
+
310
+
311
+ def get_ui_css_base() -> str:
312
+ """Return the complete Bloomberg-style CSS base as a string for embedding in generated HTML."""
313
+ return """
314
+ @import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&family=IBM+Plex+Sans:wght@400;600;700&display=swap');
315
+
316
+ :root {
317
+ --bg-primary: #000000;
318
+ --bg-secondary: #111111;
319
+ --bg-tertiary: #1A1A1A;
320
+ --bg-hover: #222222;
321
+ --border: #2A2A2A;
322
+ --border-strong: #444444;
323
+ --text-primary: #E8E9EA;
324
+ --text-secondary:#A0A0A0;
325
+ --text-muted: #606060;
326
+ --accent: #F5A623;
327
+ --accent-dim: #7A5010;
328
+ --positive: #00CC66;
329
+ --positive-dim: #003318;
330
+ --negative: #FF3B3B;
331
+ --negative-dim: #3D0000;
332
+ --neutral: #4A9EFF;
333
+ --warning: #FFB800;
334
+ --font-sans: 'IBM Plex Sans', system-ui, sans-serif;
335
+ --font-mono: 'IBM Plex Mono', 'Courier New', monospace;
336
+ }
337
+ @media (prefers-color-scheme: light) {
338
+ :root {
339
+ --bg-primary: #FFFFFF;
340
+ --bg-secondary: #F4F4F4;
341
+ --bg-tertiary: #EAEAEA;
342
+ --bg-hover: #E0E0E0;
343
+ --border: #CCCCCC;
344
+ --border-strong: #999999;
345
+ --text-primary: #111111;
346
+ --text-secondary:#444444;
347
+ --text-muted: #888888;
348
+ --accent: #B8520A;
349
+ --accent-dim: #FAE0C8;
350
+ --positive: #006B2E;
351
+ --positive-dim: #D4F0E0;
352
+ --negative: #B30000;
353
+ --negative-dim: #FFE0E0;
354
+ --neutral: #0057B7;
355
+ --warning: #8B6000;
356
+ }
357
+ }
358
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
359
+ html { font-size: 13px; }
360
+ body {
361
+ font-family: var(--font-sans);
362
+ background: var(--bg-primary);
363
+ color: var(--text-primary);
364
+ padding: 12px 16px 32px;
365
+ max-width: 1440px;
366
+ margin: 0 auto;
367
+ line-height: 1.4;
368
+ }
369
+ /* ── Top bar ── */
370
+ .topbar { display: flex; align-items: baseline; justify-content: space-between;
371
+ border-bottom: 2px solid var(--accent); padding-bottom: 8px; margin-bottom: 20px; }
372
+ .topbar-brand { font-family: var(--font-mono); font-size: 16px; font-weight: 700;
373
+ color: var(--accent); letter-spacing: 0.06em; }
374
+ .topbar-brand span { color: var(--text-secondary); font-weight: 400; }
375
+ .topbar-meta { font-size: 10px; color: var(--text-muted); letter-spacing: 0.04em; font-family: var(--font-mono); }
376
+ /* ── Section header ── */
377
+ .sh { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.12em;
378
+ color: var(--text-muted); border-bottom: 1px solid var(--border);
379
+ padding-bottom: 5px; margin-bottom: 10px; }
380
+ /* ── Layout ── */
381
+ .section { margin-bottom: 20px; }
382
+ .grid { display: grid; gap: 1px; background: var(--border); border: 1px solid var(--border); }
383
+ .g2 { grid-template-columns: 1fr 1fr; }
384
+ .g3 { grid-template-columns: repeat(3, 1fr); }
385
+ .g4 { grid-template-columns: repeat(4, 1fr); }
386
+ .g5 { grid-template-columns: repeat(5, 1fr); }
387
+ .g6 { grid-template-columns: repeat(6, 1fr); }
388
+ .gcol2 { grid-template-columns: 2fr 1fr; }
389
+ .gcol3 { grid-template-columns: 3fr 1fr; }
390
+ /* ── Quote tile ── */
391
+ .qt { background: var(--bg-secondary); padding: 10px 12px;
392
+ display: flex; flex-direction: column; gap: 2px; }
393
+ .qt-sym { font-family: var(--font-mono); font-size: 11px; color: var(--accent); font-weight: 600; }
394
+ .qt-name { font-size: 10px; color: var(--text-muted); }
395
+ .qt-price { font-family: var(--font-mono); font-size: 20px; font-weight: 600;
396
+ color: var(--text-primary); letter-spacing: -0.01em; font-variant-numeric: tabular-nums; }
397
+ .qt-chg { font-family: var(--font-mono); font-size: 12px; font-weight: 600; }
398
+ .up { color: var(--positive); }
399
+ .down { color: var(--negative); }
400
+ .flat { color: var(--text-muted); }
401
+ /* ── Metric card ── */
402
+ .metric { background: var(--bg-secondary); padding: 14px 16px; }
403
+ .metric-label { font-size: 10px; font-weight: 700; text-transform: uppercase;
404
+ letter-spacing: 0.1em; color: var(--text-muted); margin-bottom: 6px; }
405
+ .metric-val { font-family: var(--font-mono); font-size: 22px; font-weight: 600;
406
+ color: var(--text-primary); letter-spacing: -0.02em; font-variant-numeric: tabular-nums; }
407
+ .metric-sub { font-size: 10px; color: var(--text-muted); margin-top: 3px; font-family: var(--font-mono); }
408
+ /* ── Data table ── */
409
+ .data-table { width: 100%; border-collapse: collapse; font-size: 12px; }
410
+ .data-table th { background: var(--bg-tertiary); color: var(--text-muted); font-size: 10px;
411
+ font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em;
412
+ padding: 6px 10px; text-align: left; border-bottom: 1px solid var(--border-strong);
413
+ white-space: nowrap; font-family: var(--font-sans); }
414
+ .data-table td { padding: 5px 10px; border-bottom: 1px solid var(--border); vertical-align: middle; }
415
+ .data-table tr:hover td { background: var(--bg-hover); }
416
+ .data-table tr:last-child td { border-bottom: none; }
417
+ .r { text-align: right; }
418
+ .sym { font-family: var(--font-mono); font-weight: 600; color: var(--accent); font-size: 12px; }
419
+ .num { font-family: var(--font-mono); text-align: right; font-variant-numeric: tabular-nums; }
420
+ .dim { color: var(--text-muted); font-size: 11px; }
421
+ /* ── Badge ── */
422
+ .badge { font-family: var(--font-mono); font-size: 9px; font-weight: 700;
423
+ padding: 1px 5px; letter-spacing: 0.06em; border: 1px solid; }
424
+ .badge-on { color: var(--positive); border-color: var(--positive); background: var(--positive-dim); }
425
+ .badge-off { color: var(--text-muted); border-color: var(--border); background: transparent; }
426
+ .badge-warn { color: var(--warning); border-color: var(--warning); background: transparent; }
427
+ /* ── Card ── */
428
+ .card { background: var(--bg-secondary); border: 1px solid var(--border); padding: 14px; }
429
+ /* ── Divider ── */
430
+ hr { border: none; border-top: 1px solid var(--border); margin: 16px 0; }
431
+ /* ── Responsive ── */
432
+ @media (max-width: 960px) { .g4,.g5,.g6 { grid-template-columns: repeat(2, 1fr); } }
433
+ @media (max-width: 600px) { .g2,.g3,.g4 { grid-template-columns: 1fr; } }
434
+ """
@@ -0,0 +1 @@
1
+ """apps/cli/providers — LLM provider utilities."""