gloomberb 0.15.7 → 0.16.0

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 (524) hide show
  1. package/README.md +11 -2
  2. package/package.json +1 -1
  3. package/src/api-client/app-attention.ts +147 -0
  4. package/src/api-client/attention.ts +26 -0
  5. package/src/api-client/awards.ts +215 -0
  6. package/src/api-client/catalysts.ts +160 -0
  7. package/src/api-client/chat.ts +137 -14
  8. package/src/api-client/company-kpis.ts +153 -0
  9. package/src/api-client/cpi.ts +52 -0
  10. package/src/api-client/credit-documents.ts +107 -0
  11. package/src/api-client/data.ts +192 -3
  12. package/src/api-client/distress.ts +164 -0
  13. package/src/api-client/doe.ts +75 -0
  14. package/src/api-client/equity-screener.ts +11 -0
  15. package/src/api-client/exposure.ts +202 -0
  16. package/src/api-client/gpu.ts +93 -0
  17. package/src/api-client/hiring.ts +110 -0
  18. package/src/api-client/index.ts +78 -3
  19. package/src/api-client/normalizers.ts +31 -1
  20. package/src/api-client/paths.ts +3 -0
  21. package/src/api-client/perps.ts +127 -0
  22. package/src/api-client/power.ts +148 -0
  23. package/src/api-client/request.ts +58 -1
  24. package/src/api-client/research-activity.ts +172 -13
  25. package/src/api-client/socket.ts +75 -27
  26. package/src/api-client/supply-chain-graph.ts +40 -0
  27. package/src/api-client/supply-chain.ts +98 -0
  28. package/src/api-client/telemetry.ts +29 -0
  29. package/src/api-client/themes.ts +28 -0
  30. package/src/api-client/types.ts +33 -1
  31. package/src/api-client/wall-experiments.ts +100 -0
  32. package/src/api-client/wall-summary.ts +49 -0
  33. package/src/api-client/web-experiments.ts +136 -0
  34. package/src/app/pane-runtime/plugin-bindings.ts +5 -0
  35. package/src/app/pane-runtime/ticker-open-runtime.ts +8 -2
  36. package/src/app/runtime/update.ts +13 -1
  37. package/src/cli/commands/system.ts +2 -0
  38. package/src/cli/desktop-pane-shot.ts +3 -4
  39. package/src/cli/pane-functions/data.ts +78 -0
  40. package/src/cli/pane-functions/financial-ratio-shot.ts +160 -0
  41. package/src/cli/pane-functions/function-help.ts +220 -8
  42. package/src/cli/pane-functions/headless.ts +4 -0
  43. package/src/cli/pane-functions/screenshot-evidence.ts +21 -0
  44. package/src/cli/pane-functions/screenshot.ts +49 -5
  45. package/src/components/chart/composite/composite-chart.tsx +15 -2
  46. package/src/components/chart/composite/format.ts +24 -11
  47. package/src/components/chart/composite/rasterizer.ts +67 -16
  48. package/src/components/chart/composite/scene.ts +53 -2
  49. package/src/components/chart/composite/session-shading.ts +3 -2
  50. package/src/components/chart/composite/text-renderer.ts +52 -1
  51. package/src/components/chart/composite/time-axis.ts +100 -30
  52. package/src/components/chart/composite/tools.ts +2 -1
  53. package/src/components/chart/composite/types.ts +4 -0
  54. package/src/components/chart-table/index.ts +1 -0
  55. package/src/components/chart-table/layout.ts +15 -0
  56. package/src/components/command-bar/action-runtime.ts +1 -0
  57. package/src/components/command-bar/commands/direct/index.ts +32 -0
  58. package/src/components/command-bar/commands/registry.ts +7 -0
  59. package/src/components/command-bar/pane-templates/items.ts +11 -0
  60. package/src/components/command-bar/pane-templates/workflow.ts +19 -4
  61. package/src/components/command-bar/routes/root/command-items.ts +6 -0
  62. package/src/components/command-bar/routes/root/provider-search.ts +2 -0
  63. package/src/components/command-bar/routes/root/results.ts +64 -0
  64. package/src/components/command-bar/routes/root/runtime.ts +8 -0
  65. package/src/components/command-bar/routes/ticker-search/results.ts +89 -24
  66. package/src/components/command-bar/routes/ticker-search/route.ts +2 -0
  67. package/src/components/command-bar/surface/index.tsx +15 -0
  68. package/src/components/command-bar/view-model.ts +3 -0
  69. package/src/components/command-bar/workflow/collection-actions.ts +9 -7
  70. package/src/components/command-bar/workflow/ops.ts +19 -0
  71. package/src/components/command-bar/workflow/tickers.ts +5 -0
  72. package/src/components/company-logo.tsx +15 -2
  73. package/src/components/data-table/table-pane.ts +2 -1
  74. package/src/components/index.ts +1 -0
  75. package/src/components/layout/detached-pane-shell.tsx +12 -1
  76. package/src/components/layout/missing-pane.tsx +87 -23
  77. package/src/components/layout/pane/footer/index.tsx +64 -18
  78. package/src/components/layout/pane/footer/model.ts +85 -0
  79. package/src/components/layout/pane/sidebar.tsx +19 -1
  80. package/src/components/layout/shell/index.tsx +38 -28
  81. package/src/components/layout/shell/pane/management-shortcuts.ts +13 -1
  82. package/src/components/layout/status-bar.tsx +93 -28
  83. package/src/components/layout/status-widget-space.ts +72 -0
  84. package/src/components/onboarding/first-run-workspace.ts +8 -2
  85. package/src/components/onboarding/onboarding-wizard.tsx +35 -16
  86. package/src/components/onboarding/portfolio-step/positions-panel.tsx +14 -5
  87. package/src/components/onboarding/wizard-model.ts +13 -5
  88. package/src/components/onboarding/wizard-positions.ts +56 -7
  89. package/src/components/price-performance.tsx +31 -34
  90. package/src/components/ui/data-table/index.tsx +11 -8
  91. package/src/components/ui/display.tsx +15 -6
  92. package/src/components/ui/fields.tsx +5 -0
  93. package/src/components/ui/figure.tsx +94 -0
  94. package/src/components/ui/header-case.ts +25 -3
  95. package/src/components/ui/icon.tsx +3 -1
  96. package/src/components/ui/message-composer.tsx +8 -1
  97. package/src/components/ui/query-bar.tsx +8 -1
  98. package/src/components/ui/ratio-bar.tsx +84 -0
  99. package/src/components/ui/toggle.tsx +3 -1
  100. package/src/components/use-scrollbox-layout.ts +17 -0
  101. package/src/core/state/app/layout.ts +35 -1
  102. package/src/core/state/app/state.ts +15 -0
  103. package/src/core/state/app/types.ts +1 -0
  104. package/src/data/config/store/normalize.ts +24 -0
  105. package/src/i18n/es.ts +2 -0
  106. package/src/i18n/ja.ts +2 -0
  107. package/src/i18n/ko.ts +2 -0
  108. package/src/i18n/zh-cn.ts +2 -0
  109. package/src/i18n/zh-tw.ts +2 -0
  110. package/src/layout-marketplace/pane-imagery.ts +1 -0
  111. package/src/market-data/coordinator/entries.ts +13 -0
  112. package/src/market-data/coordinator/financials.ts +33 -8
  113. package/src/market-data/market/freshness.ts +16 -5
  114. package/src/market-data/market/trading-sessions.ts +65 -1
  115. package/src/market-data/published-cn-sessions.ts +25 -0
  116. package/src/market-data/published-nse-sessions.ts +20 -0
  117. package/src/news/aggregator.ts +4 -0
  118. package/src/plugins/builtin/account-management/model.ts +6 -1
  119. package/src/plugins/builtin/account-management/pane.tsx +36 -25
  120. package/src/plugins/builtin/alerts/catalysts.ts +77 -0
  121. package/src/plugins/builtin/alerts/events-pane.tsx +3 -0
  122. package/src/plugins/builtin/alerts/events.ts +10 -4
  123. package/src/plugins/builtin/alerts/history-pane.tsx +1 -1
  124. package/src/plugins/builtin/alerts/history.ts +1 -0
  125. package/src/plugins/builtin/alerts/index.tsx +6 -0
  126. package/src/plugins/builtin/alerts/research-builder.ts +10 -3
  127. package/src/plugins/builtin/alerts/research-rules.ts +15 -1
  128. package/src/plugins/builtin/analytics/risk-client.ts +15 -3
  129. package/src/plugins/builtin/analytics/risk-headless.ts +123 -18
  130. package/src/plugins/builtin/attention/client.ts +80 -0
  131. package/src/plugins/builtin/attention/evidence.ts +30 -0
  132. package/src/plugins/builtin/attention/headless.ts +33 -0
  133. package/src/plugins/builtin/attention/index.tsx +18 -0
  134. package/src/plugins/builtin/attention/model.ts +59 -0
  135. package/src/plugins/builtin/attention/pane.tsx +211 -0
  136. package/src/plugins/builtin/attention/trending.tsx +59 -0
  137. package/src/plugins/builtin/awards/alerts.ts +32 -0
  138. package/src/plugins/builtin/awards/client.ts +82 -0
  139. package/src/plugins/builtin/awards/detail.tsx +107 -0
  140. package/src/plugins/builtin/awards/evidence.ts +36 -0
  141. package/src/plugins/builtin/awards/headless.ts +55 -0
  142. package/src/plugins/builtin/awards/index.tsx +20 -0
  143. package/src/plugins/builtin/awards/model.ts +42 -0
  144. package/src/plugins/builtin/awards/pane.tsx +263 -0
  145. package/src/plugins/builtin/catalysts/client.ts +28 -0
  146. package/src/plugins/builtin/catalysts/detail.tsx +88 -0
  147. package/src/plugins/builtin/catalysts/evidence.ts +47 -0
  148. package/src/plugins/builtin/catalysts/headless.ts +42 -0
  149. package/src/plugins/builtin/catalysts/history.ts +26 -0
  150. package/src/plugins/builtin/catalysts/index.tsx +29 -0
  151. package/src/plugins/builtin/catalysts/model.ts +135 -0
  152. package/src/plugins/builtin/catalysts/pane.tsx +159 -0
  153. package/src/plugins/builtin/chart-composer/cli-options.ts +4 -0
  154. package/src/plugins/builtin/chart-composer/headless-schema.ts +6 -0
  155. package/src/plugins/builtin/chart-composer/index.tsx +8 -1
  156. package/src/plugins/builtin/chart-composer/pane.tsx +28 -1
  157. package/src/plugins/builtin/chat/attachments/desktop.tsx +610 -0
  158. package/src/plugins/builtin/chat/attachments/files.ts +45 -0
  159. package/src/plugins/builtin/chat/attachments/model.ts +164 -0
  160. package/src/plugins/builtin/chat/attachments/terminal.tsx +72 -0
  161. package/src/plugins/builtin/chat/attachments/transfer.ts +165 -0
  162. package/src/plugins/builtin/chat/content/channel-navigation.ts +13 -12
  163. package/src/plugins/builtin/chat/content/composer-runtime.ts +25 -4
  164. package/src/plugins/builtin/chat/content/composer.tsx +46 -4
  165. package/src/plugins/builtin/chat/content/footer.tsx +46 -8
  166. package/src/plugins/builtin/chat/content/index.tsx +263 -62
  167. package/src/plugins/builtin/chat/content/layout-metrics.ts +10 -2
  168. package/src/plugins/builtin/chat/content/open-targets.ts +17 -3
  169. package/src/plugins/builtin/chat/content/scroll.ts +7 -1
  170. package/src/plugins/builtin/chat/content/shortcuts.ts +36 -11
  171. package/src/plugins/builtin/chat/content/snapshot.ts +3 -0
  172. package/src/plugins/builtin/chat/content/transcript.tsx +17 -1
  173. package/src/plugins/builtin/chat/content/types.ts +7 -0
  174. package/src/plugins/builtin/chat/controller/attachments.ts +213 -0
  175. package/src/plugins/builtin/chat/controller/connections.ts +3 -1
  176. package/src/plugins/builtin/chat/controller/index.ts +114 -2
  177. package/src/plugins/builtin/chat/controller/lifecycle.ts +9 -0
  178. package/src/plugins/builtin/chat/controller/messages.ts +35 -2
  179. package/src/plugins/builtin/chat/controller/send.ts +128 -25
  180. package/src/plugins/builtin/chat/controller/state.ts +12 -1
  181. package/src/plugins/builtin/chat/controller/utils.ts +7 -5
  182. package/src/plugins/builtin/chat/controller/view.ts +2 -0
  183. package/src/plugins/builtin/chat/index.tsx +21 -0
  184. package/src/plugins/builtin/chat/layout.ts +9 -4
  185. package/src/plugins/builtin/chat/message/desktop.tsx +55 -20
  186. package/src/plugins/builtin/chat/message/header.tsx +30 -5
  187. package/src/plugins/builtin/chat/message/inline-tokens.tsx +9 -0
  188. package/src/plugins/builtin/chat/message/pending-send.ts +35 -0
  189. package/src/plugins/builtin/chat/message/profile-popover.tsx +5 -1
  190. package/src/plugins/builtin/chat/message/render-state.ts +12 -2
  191. package/src/plugins/builtin/chat/message/terminal.tsx +51 -4
  192. package/src/plugins/builtin/chat/message/types.ts +6 -1
  193. package/src/plugins/builtin/chat/pane-state.ts +59 -1
  194. package/src/plugins/builtin/chat/profile-popover.ts +50 -1
  195. package/src/plugins/builtin/chat/sidebar.tsx +8 -3
  196. package/src/plugins/builtin/chat/status-widget.tsx +29 -12
  197. package/src/plugins/builtin/chat/unread-inbox-pane.tsx +143 -0
  198. package/src/plugins/builtin/chat/unread-inbox.ts +91 -0
  199. package/src/plugins/builtin/clinical-trials/client.ts +237 -0
  200. package/src/plugins/builtin/clinical-trials/index.tsx +74 -0
  201. package/src/plugins/builtin/clinical-trials/pane.tsx +225 -0
  202. package/src/plugins/builtin/clinical-trials/types.ts +2 -0
  203. package/src/plugins/builtin/cloud/askg/controller.ts +37 -6
  204. package/src/plugins/builtin/cloud/askg/executor.ts +59 -44
  205. package/src/plugins/builtin/cloud/askg/host.ts +8 -1
  206. package/src/plugins/builtin/cloud/askg/manifest.ts +29 -2
  207. package/src/plugins/builtin/cloud/askg/model.ts +47 -13
  208. package/src/plugins/builtin/cloud/askg/notes.ts +100 -0
  209. package/src/plugins/builtin/cloud/askg/pane.tsx +50 -14
  210. package/src/plugins/builtin/cloud/askg/protocol.ts +39 -1
  211. package/src/plugins/builtin/cloud/askg/result-budget.ts +156 -0
  212. package/src/plugins/builtin/cloud/askg/user-data.ts +89 -0
  213. package/src/plugins/builtin/cloud/auth-actions.tsx +55 -31
  214. package/src/plugins/builtin/cloud/plugin.tsx +4 -1
  215. package/src/plugins/builtin/cloud/team/pane-sections.tsx +10 -1
  216. package/src/plugins/builtin/cloud/team/pane.tsx +3 -2
  217. package/src/plugins/builtin/cloud/thesis/board-pane.tsx +2 -2
  218. package/src/plugins/builtin/cloud/thesis/detail.tsx +1 -1
  219. package/src/plugins/builtin/cloud/thesis/ticker-tab.tsx +2 -2
  220. package/src/plugins/builtin/cloud/trial-offer-status-widget.tsx +202 -0
  221. package/src/plugins/builtin/cloud/upgrade-command.ts +1 -1
  222. package/src/plugins/builtin/cloud/upgrade-dialog.tsx +29 -3
  223. package/src/plugins/builtin/cloud/upgrade-status-widget.tsx +1 -1
  224. package/src/plugins/builtin/cloud-tweets/table.tsx +1 -1
  225. package/src/plugins/builtin/comment-letters/client.ts +342 -0
  226. package/src/plugins/builtin/comment-letters/index.tsx +74 -0
  227. package/src/plugins/builtin/comment-letters/pane.tsx +295 -0
  228. package/src/plugins/builtin/comment-letters/types.ts +43 -0
  229. package/src/plugins/builtin/company-attention/app-rank.tsx +79 -0
  230. package/src/plugins/builtin/company-attention/client.ts +69 -0
  231. package/src/plugins/builtin/company-attention/evidence.ts +45 -0
  232. package/src/plugins/builtin/company-attention/headless.ts +47 -0
  233. package/src/plugins/builtin/company-attention/index.tsx +30 -0
  234. package/src/plugins/builtin/company-attention/model.ts +129 -0
  235. package/src/plugins/builtin/company-attention/pane.tsx +183 -0
  236. package/src/plugins/builtin/company-kpis/client.ts +92 -0
  237. package/src/plugins/builtin/company-kpis/headless.ts +32 -0
  238. package/src/plugins/builtin/company-kpis/index.tsx +26 -0
  239. package/src/plugins/builtin/company-kpis/model.ts +124 -0
  240. package/src/plugins/builtin/company-kpis/pane.tsx +226 -0
  241. package/src/plugins/builtin/company-kpis/related.ts +11 -0
  242. package/src/plugins/builtin/company-kpis/screenshot-evidence.ts +44 -0
  243. package/src/plugins/builtin/composite-plugins.ts +34 -0
  244. package/src/plugins/builtin/correlation/history.ts +4 -1
  245. package/src/plugins/builtin/correlation/index.tsx +139 -80
  246. package/src/plugins/builtin/correlation/matrix/pair-chart.tsx +48 -0
  247. package/src/plugins/builtin/correlation/matrix/selection.ts +77 -0
  248. package/src/plugins/builtin/correlation/relationship/model.ts +2 -2
  249. package/src/plugins/builtin/cpi/client.ts +66 -0
  250. package/src/plugins/builtin/cpi/headless.ts +78 -0
  251. package/src/plugins/builtin/cpi/index.tsx +31 -0
  252. package/src/plugins/builtin/cpi/model.ts +198 -0
  253. package/src/plugins/builtin/cpi/pane.tsx +157 -0
  254. package/src/plugins/builtin/credit-documents/client.ts +99 -0
  255. package/src/plugins/builtin/credit-documents/detail.tsx +109 -0
  256. package/src/plugins/builtin/credit-documents/evidence.ts +64 -0
  257. package/src/plugins/builtin/credit-documents/gauge.tsx +55 -0
  258. package/src/plugins/builtin/credit-documents/headless.ts +40 -0
  259. package/src/plugins/builtin/credit-documents/index.tsx +19 -0
  260. package/src/plugins/builtin/credit-documents/model.ts +336 -0
  261. package/src/plugins/builtin/credit-documents/pane.tsx +185 -0
  262. package/src/plugins/builtin/custom-view/view-spec.ts +14 -2
  263. package/src/plugins/builtin/debt-maturities/pane.tsx +1 -0
  264. package/src/plugins/builtin/dividend-yield/pane.tsx +1 -1
  265. package/src/plugins/builtin/doe/client.ts +73 -0
  266. package/src/plugins/builtin/doe/headless.ts +93 -0
  267. package/src/plugins/builtin/doe/index.tsx +41 -0
  268. package/src/plugins/builtin/doe/model.ts +215 -0
  269. package/src/plugins/builtin/doe/pane.tsx +148 -0
  270. package/src/plugins/builtin/doe/range-bar.tsx +45 -0
  271. package/src/plugins/builtin/earnings/board.tsx +3 -0
  272. package/src/plugins/builtin/earnings/index.tsx +2 -0
  273. package/src/plugins/builtin/earnings-calls/pane.tsx +7 -1
  274. package/src/plugins/builtin/earnings-calls/transcript-view.tsx +7 -7
  275. package/src/plugins/builtin/earnings-ripple/client.ts +60 -0
  276. package/src/plugins/builtin/earnings-ripple/headless.ts +35 -0
  277. package/src/plugins/builtin/earnings-ripple/index.tsx +35 -0
  278. package/src/plugins/builtin/earnings-ripple/model.ts +98 -0
  279. package/src/plugins/builtin/earnings-ripple/pane.tsx +103 -0
  280. package/src/plugins/builtin/equity-screener/client.ts +1 -1
  281. package/src/plugins/builtin/equity-screener/criterion-editor.tsx +1 -1
  282. package/src/plugins/builtin/equity-screener/model.ts +74 -9
  283. package/src/plugins/builtin/equity-screener/pane.tsx +2 -0
  284. package/src/plugins/builtin/estimate-revisions/pane.tsx +3 -0
  285. package/src/plugins/builtin/executives/pane.tsx +7 -5
  286. package/src/plugins/builtin/exposure/charts.tsx +66 -0
  287. package/src/plugins/builtin/exposure/client.ts +53 -0
  288. package/src/plugins/builtin/exposure/drivers.ts +29 -0
  289. package/src/plugins/builtin/exposure/editor.tsx +61 -0
  290. package/src/plugins/builtin/exposure/evidence.ts +39 -0
  291. package/src/plugins/builtin/exposure/headless.ts +51 -0
  292. package/src/plugins/builtin/exposure/holdings.ts +56 -0
  293. package/src/plugins/builtin/exposure/index.tsx +13 -0
  294. package/src/plugins/builtin/exposure/model.ts +104 -0
  295. package/src/plugins/builtin/exposure/pane.tsx +247 -0
  296. package/src/plugins/builtin/fear-greed/charts.tsx +1 -1
  297. package/src/plugins/builtin/fear-greed/pane.tsx +2 -9
  298. package/src/plugins/builtin/filing-events/pane.tsx +2 -1
  299. package/src/plugins/builtin/gpu/board.tsx +163 -0
  300. package/src/plugins/builtin/gpu/changes.tsx +94 -0
  301. package/src/plugins/builtin/gpu/client.ts +130 -0
  302. package/src/plugins/builtin/gpu/equities.tsx +112 -0
  303. package/src/plugins/builtin/gpu/headless.ts +67 -0
  304. package/src/plugins/builtin/gpu/history.tsx +140 -0
  305. package/src/plugins/builtin/gpu/index.tsx +18 -0
  306. package/src/plugins/builtin/gpu/ladder.tsx +127 -0
  307. package/src/plugins/builtin/gpu/model.ts +317 -0
  308. package/src/plugins/builtin/gpu/pane.tsx +63 -0
  309. package/src/plugins/builtin/help/index.tsx +19 -2
  310. package/src/plugins/builtin/holders/pane.tsx +5 -9
  311. package/src/plugins/builtin/insider/detail.tsx +119 -0
  312. package/src/plugins/builtin/insider/display.ts +221 -0
  313. package/src/plugins/builtin/insider/headless.ts +24 -3
  314. package/src/plugins/builtin/insider/index.tsx +206 -108
  315. package/src/plugins/builtin/insider/insider-data.ts +31 -3
  316. package/src/plugins/builtin/insider/model.ts +53 -4
  317. package/src/plugins/builtin/insider/table-model.ts +226 -0
  318. package/src/plugins/builtin/insider/table.tsx +79 -0
  319. package/src/plugins/builtin/iv-history/screen-pane.tsx +1 -1
  320. package/src/plugins/builtin/jobs/pane.tsx +14 -7
  321. package/src/plugins/builtin/kelly-sizer/pane.tsx +1 -1
  322. package/src/plugins/builtin/macro-day/client.ts +50 -0
  323. package/src/plugins/builtin/macro-day/headless.ts +51 -0
  324. package/src/plugins/builtin/macro-day/index.tsx +21 -0
  325. package/src/plugins/builtin/macro-day/model.ts +137 -0
  326. package/src/plugins/builtin/macro-day/pane.tsx +118 -0
  327. package/src/plugins/builtin/macro-day/releases.ts +58 -0
  328. package/src/plugins/builtin/market-halts/model.ts +30 -17
  329. package/src/plugins/builtin/market-halts/pane.tsx +15 -21
  330. package/src/plugins/builtin/market-heatmap/data.ts +1 -1
  331. package/src/plugins/builtin/market-heatmap/index.tsx +198 -50
  332. package/src/plugins/builtin/market-heatmap/portfolio.ts +220 -0
  333. package/src/plugins/builtin/market-movers/index.tsx +1 -0
  334. package/src/plugins/builtin/market-movers/session-body.tsx +5 -2
  335. package/src/plugins/builtin/mna/distress/client.ts +326 -0
  336. package/src/plugins/builtin/mna/distress/detail.tsx +247 -0
  337. package/src/plugins/builtin/mna/distress/headless.ts +257 -0
  338. package/src/plugins/builtin/mna/distress/model.ts +427 -0
  339. package/src/plugins/builtin/mna/distress/pane.tsx +606 -0
  340. package/src/plugins/builtin/mna/index.tsx +15 -0
  341. package/src/plugins/builtin/mna/pane.tsx +42 -1
  342. package/src/plugins/builtin/news/index.tsx +62 -16
  343. package/src/plugins/builtin/news/wire/filter-articles.ts +54 -0
  344. package/src/plugins/builtin/news/wire/index.tsx +37 -3
  345. package/src/plugins/builtin/news/wire/industry-pane.tsx +29 -13
  346. package/src/plugins/builtin/news/wire/mutes.ts +253 -0
  347. package/src/plugins/builtin/news/wire/news/command-bar-search.ts +117 -0
  348. package/src/plugins/builtin/news/wire/news/footer.ts +4 -0
  349. package/src/plugins/builtin/news/wire/news/list-search.ts +34 -0
  350. package/src/plugins/builtin/news/wire/news/pop-out.tsx +158 -0
  351. package/src/plugins/builtin/news/wire/news/preset-pane.tsx +64 -19
  352. package/src/plugins/builtin/openfda/client.ts +300 -0
  353. package/src/plugins/builtin/openfda/index.tsx +71 -0
  354. package/src/plugins/builtin/openfda/pane.tsx +382 -0
  355. package/src/plugins/builtin/openfda/types.ts +76 -0
  356. package/src/plugins/builtin/options/footer.ts +1 -0
  357. package/src/plugins/builtin/options/view.tsx +1 -1
  358. package/src/plugins/builtin/options-calculator/pane.tsx +0 -1
  359. package/src/plugins/builtin/options-positioning/index.tsx +4 -2
  360. package/src/plugins/builtin/options-positioning/pane.tsx +1 -1
  361. package/src/plugins/builtin/pe-band/client.ts +61 -0
  362. package/src/plugins/builtin/pe-band/headless.ts +51 -0
  363. package/src/plugins/builtin/pe-band/index.tsx +20 -0
  364. package/src/plugins/builtin/pe-band/model.ts +267 -0
  365. package/src/plugins/builtin/pe-band/pane.tsx +159 -0
  366. package/src/plugins/builtin/perps/client.ts +66 -0
  367. package/src/plugins/builtin/perps/equity-row.tsx +28 -0
  368. package/src/plugins/builtin/perps/headless.ts +34 -0
  369. package/src/plugins/builtin/perps/index.tsx +14 -0
  370. package/src/plugins/builtin/perps/model.ts +58 -0
  371. package/src/plugins/builtin/perps/pane.tsx +185 -0
  372. package/src/plugins/builtin/plugin-marketplace/pane.tsx +0 -1
  373. package/src/plugins/builtin/portfolio-list/cli/render.ts +177 -87
  374. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +6 -20
  375. package/src/plugins/builtin/portfolio-list/command-bar.ts +6 -2
  376. package/src/plugins/builtin/portfolio-list/headless.ts +237 -0
  377. package/src/plugins/builtin/portfolio-list/index.tsx +2 -0
  378. package/src/plugins/builtin/portfolio-list/mutations.ts +70 -1
  379. package/src/plugins/builtin/portfolio-list/pane/data.ts +17 -0
  380. package/src/plugins/builtin/portfolio-list/pane/index.tsx +88 -5
  381. package/src/plugins/builtin/portfolio-list/pane/remove-ticker.ts +85 -0
  382. package/src/plugins/builtin/portfolio-list/pane/streaming.ts +18 -12
  383. package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +6 -0
  384. package/src/plugins/builtin/power/client.ts +100 -0
  385. package/src/plugins/builtin/power/detail.tsx +82 -0
  386. package/src/plugins/builtin/power/evidence.ts +56 -0
  387. package/src/plugins/builtin/power/generation.tsx +37 -0
  388. package/src/plugins/builtin/power/headless.ts +43 -0
  389. package/src/plugins/builtin/power/index.tsx +16 -0
  390. package/src/plugins/builtin/power/model.ts +89 -0
  391. package/src/plugins/builtin/power/pane.tsx +209 -0
  392. package/src/plugins/builtin/power/query.ts +25 -0
  393. package/src/plugins/builtin/relative-rotation/pane.tsx +3 -3
  394. package/src/plugins/builtin/research/analyst-pane.tsx +1 -1
  395. package/src/plugins/builtin/research/corporate-actions-pane.tsx +13 -4
  396. package/src/plugins/builtin/research/equity-diagnostic-pane.tsx +11 -9
  397. package/src/plugins/builtin/research-search/pane.tsx +21 -7
  398. package/src/plugins/builtin/revenue-breakdown/pane.tsx +1 -1
  399. package/src/plugins/builtin/reverse-dcf/client.ts +35 -0
  400. package/src/plugins/builtin/reverse-dcf/headless.ts +44 -0
  401. package/src/plugins/builtin/reverse-dcf/index.tsx +20 -0
  402. package/src/plugins/builtin/reverse-dcf/model.ts +87 -0
  403. package/src/plugins/builtin/reverse-dcf/pane.tsx +107 -0
  404. package/src/plugins/builtin/risk-factors/pane.tsx +6 -5
  405. package/src/plugins/builtin/scanner/denied.tsx +4 -2
  406. package/src/plugins/builtin/scanner/feed.ts +1 -0
  407. package/src/plugins/builtin/scanner/flow-pane.tsx +3 -2
  408. package/src/plugins/builtin/scanner/hilo-pane.tsx +1 -1
  409. package/src/plugins/builtin/seasonality/client.ts +4 -1
  410. package/src/plugins/builtin/sec/command-bar-search.ts +217 -0
  411. package/src/plugins/builtin/sec/forms.ts +54 -0
  412. package/src/plugins/builtin/sec/headless.ts +31 -5
  413. package/src/plugins/builtin/sec/index.tsx +67 -11
  414. package/src/plugins/builtin/sec/model.ts +35 -5
  415. package/src/plugins/builtin/sectors/headless.ts +1 -0
  416. package/src/plugins/builtin/sectors/index.tsx +72 -26
  417. package/src/plugins/builtin/shared/cloud-upgrade.ts +143 -39
  418. package/src/plugins/builtin/shared/pro-feature-wall.tsx +8 -4
  419. package/src/plugins/builtin/shared/research-cells.tsx +107 -0
  420. package/src/plugins/builtin/shared/series-list-detail.tsx +5 -1
  421. package/src/plugins/builtin/shared/ticker-request.ts +1 -1
  422. package/src/plugins/builtin/shared/wall-teaser-catalog.ts +80 -0
  423. package/src/plugins/builtin/shared/wall-teaser.tsx +192 -0
  424. package/src/plugins/builtin/shared/wall-view-lifecycle.ts +43 -0
  425. package/src/plugins/builtin/short-interest/index.tsx +31 -0
  426. package/src/plugins/builtin/short-interest/watch-client.ts +70 -0
  427. package/src/plugins/builtin/short-interest/watch-headless.ts +49 -0
  428. package/src/plugins/builtin/short-interest/watch-model.ts +185 -0
  429. package/src/plugins/builtin/short-interest/watch-pane.tsx +169 -0
  430. package/src/plugins/builtin/short-volume/pane.tsx +1 -1
  431. package/src/plugins/builtin/social-mentions/pane.tsx +1 -1
  432. package/src/plugins/builtin/supply-chain/client.ts +104 -0
  433. package/src/plugins/builtin/supply-chain/disclosure-quote.tsx +17 -0
  434. package/src/plugins/builtin/supply-chain/evidence.ts +88 -0
  435. package/src/plugins/builtin/supply-chain/flow-layout.ts +133 -0
  436. package/src/plugins/builtin/supply-chain/flow.tsx +323 -0
  437. package/src/plugins/builtin/supply-chain/graph-client.ts +83 -0
  438. package/src/plugins/builtin/supply-chain/graph-evidence.ts +25 -0
  439. package/src/plugins/builtin/supply-chain/graph-model.ts +45 -0
  440. package/src/plugins/builtin/supply-chain/graph-pane.tsx +218 -0
  441. package/src/plugins/builtin/supply-chain/graph.tsx +163 -0
  442. package/src/plugins/builtin/supply-chain/headless.ts +105 -0
  443. package/src/plugins/builtin/supply-chain/index.tsx +17 -0
  444. package/src/plugins/builtin/supply-chain/model.ts +145 -0
  445. package/src/plugins/builtin/supply-chain/pane.tsx +276 -0
  446. package/src/plugins/builtin/supply-chain/row-evidence.tsx +96 -0
  447. package/src/plugins/builtin/supply-chain/trust.ts +34 -0
  448. package/src/plugins/builtin/themes/client.ts +39 -0
  449. package/src/plugins/builtin/themes/headless.ts +38 -0
  450. package/src/plugins/builtin/themes/model.ts +92 -0
  451. package/src/plugins/builtin/themes/pane.tsx +125 -0
  452. package/src/plugins/builtin/thirteenf/pane.tsx +6 -15
  453. package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +5 -6
  454. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +201 -0
  455. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +327 -0
  456. package/src/plugins/builtin/ticker-detail/financials/period-end-history.ts +5 -2
  457. package/src/plugins/builtin/ticker-detail/financials/ratios.ts +60 -12
  458. package/src/plugins/builtin/ticker-detail/financials/tab.tsx +2 -1
  459. package/src/plugins/builtin/ticker-detail/headless.ts +7 -2
  460. package/src/plugins/builtin/ticker-detail/index.tsx +22 -0
  461. package/src/plugins/builtin/ticker-detail/overview/components.tsx +53 -30
  462. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +2 -0
  463. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +112 -47
  464. package/src/plugins/builtin/ticker-detail/pane.tsx +50 -6
  465. package/src/plugins/builtin/ticker-detail/quote-monitor/card.tsx +21 -42
  466. package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +3 -0
  467. package/src/plugins/builtin/time-sales/pane.tsx +1 -1
  468. package/src/plugins/builtin/world-indices/indices.ts +1 -0
  469. package/src/plugins/catalog-browser.ts +40 -0
  470. package/src/plugins/catalog-manifest.ts +3 -0
  471. package/src/plugins/catalog-ui.ts +6 -0
  472. package/src/plugins/current-target.ts +0 -9
  473. package/src/public/__snapshots__/public-api.test.ts.snap +1 -0
  474. package/src/renderers/browser/cloud-transport.ts +66 -1
  475. package/src/renderers/browser/main.tsx +2 -0
  476. package/src/renderers/dom/data-table/row.tsx +2 -0
  477. package/src/renderers/dom/desktop/controls.tsx +38 -25
  478. package/src/renderers/dom/desktop/icons.tsx +8 -0
  479. package/src/renderers/dom/host/chart-surface.tsx +36 -2
  480. package/src/renderers/dom/host/focus-scope.ts +11 -1
  481. package/src/renderers/dom/styles.css +28 -0
  482. package/src/renderers/electrobun/view/backend-rpc.ts +3 -2
  483. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
  484. package/src/renderers/electrobun/view/http-fetch.ts +2 -0
  485. package/src/renderers/electrobun/view/main.tsx +3 -1
  486. package/src/renderers/electrobun/view/rpc-timeout.ts +59 -0
  487. package/src/renderers/opentui/start.tsx +3 -0
  488. package/src/shares/api.ts +3 -1
  489. package/src/sources/gloomberb-cloud/index.ts +47 -13
  490. package/src/sources/history-result.ts +1 -0
  491. package/src/sources/history-retention.ts +16 -0
  492. package/src/sources/provider-router/history.ts +4 -2
  493. package/src/sources/sec-edgar/identity.ts +36 -0
  494. package/src/sources/sec-edgar.ts +1 -34
  495. package/src/state/app/context/index.tsx +8 -0
  496. package/src/sync/core-contributors.ts +20 -2
  497. package/src/telemetry/attention-counts.ts +164 -0
  498. package/src/telemetry/live-config.ts +7 -0
  499. package/src/test-support/rpc-loopback.ts +7 -3
  500. package/src/test-support/shell-pane-keys.tsx +34 -0
  501. package/src/tickers/instrument-kind.ts +12 -6
  502. package/src/tickers/open-target.ts +1 -1
  503. package/src/tickers/search/asset-classes.ts +91 -0
  504. package/src/tickers/search/index.ts +62 -15
  505. package/src/tickers/search/ranking.ts +22 -3
  506. package/src/tickers/search/upsert.ts +4 -1
  507. package/src/time-series/live-bars.ts +8 -3
  508. package/src/time-series/resolve.ts +224 -17
  509. package/src/time-series/spec.ts +1 -0
  510. package/src/time-series/types.ts +9 -1
  511. package/src/types/config.ts +23 -1
  512. package/src/types/data-provider.ts +2 -0
  513. package/src/types/headless.ts +17 -0
  514. package/src/types/price-history.ts +2 -0
  515. package/src/ui/host.tsx +6 -0
  516. package/src/utils/double-escape-close.ts +20 -0
  517. package/src/utils/exchanges.ts +1 -0
  518. package/src/utils/html-entities.ts +15 -0
  519. package/src/utils/http-proxy-response.ts +44 -7
  520. package/src/utils/plugin-proxy-hosts.json +3 -0
  521. package/src/utils/price-history.ts +35 -1
  522. package/src/utils/sec.ts +21 -2
  523. package/src/utils/text-wrap.ts +13 -8
  524. package/src/utils/zoned-date-time.ts +67 -0
@@ -79,6 +79,7 @@ const TABS = key("h/l", " tabs");
79
79
  const OPEN = key("Enter", " open");
80
80
  const SEARCH = key("/", "search");
81
81
  const OPEN_SOURCE = key("o", "pen source");
82
+ const POP_OUT = key("p", "op out");
82
83
  const STEP = key("←/→", " step");
83
84
  const CHART_KEYS = [key("s", "eries"), key("i", "ndicators"), key("t", "imeframe"), key("f", "ormulas")];
84
85
 
@@ -168,6 +169,13 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
168
169
  data: QUOTES,
169
170
  bloomberg: ["HP"],
170
171
  },
172
+ RETURN: {
173
+ summary: "Interval and cumulative price returns in a scrollable table, for a selectable range and granularity.",
174
+ usage: ["RETURN AAPL"],
175
+ keys: [key("/", "search")],
176
+ data: QUOTES,
177
+ bloomberg: [],
178
+ },
171
179
  GR: {
172
180
  summary: "How two tickers move together: indexed prices, their ratio, rolling correlation, and a return regression with beta, alpha and R².",
173
181
  usage: ["GR NVDA, AMD"],
@@ -283,6 +291,34 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
283
291
  data: DAILY_CLOSES,
284
292
  bloomberg: ["SEAS"],
285
293
  },
294
+ RIPL: {
295
+ summary: "Which of my holdings are tied to a company that reports soon? Customers your holdings name in their filings, and suppliers whose filings name your holdings, with the disclosed revenue share, by report date.",
296
+ usage: ["RIPL", "RIPL CRUS QRVO"],
297
+ keys: [key("Enter", " supply chain"), key("e", "arnings")],
298
+ data: ON_RELEASE,
299
+ bloomberg: [],
300
+ },
301
+ RDCF: {
302
+ summary: "What growth is the price assuming? The yearly free cash flow growth over ten years that makes a DCF equal today's enterprise value, next to the growth the company delivered.",
303
+ usage: ["RDCF AAPL"],
304
+ keys: [],
305
+ data: ON_RELEASE,
306
+ bloomberg: [],
307
+ },
308
+ PEB: {
309
+ summary: "Is the stock cheap or rich against itself? Weekly price against round multiples of trailing EPS, stepping when each EPS figure became known, with today's P/E ranked in its own history.",
310
+ usage: ["PEB AAPL", "PEB RELIANCE.NS"],
311
+ keys: [],
312
+ data: ON_RELEASE,
313
+ bloomberg: [],
314
+ },
315
+ MDAY: {
316
+ summary: "Does this name care about CPI day? Its average move on CPI, jobs report and FOMC days against a normal day, the average signed move and share of up days, and the move on every release day.",
317
+ usage: ["MDAY SPY"],
318
+ keys: [],
319
+ data: DAILY_CLOSES,
320
+ bloomberg: [],
321
+ },
286
322
  VCA: {
287
323
  summary: "IV rank, term slope, skew and IV against realized vol for up to 60 US tickers, flagged rich or cheap against each name's own year. Alone it screens index and sector ETFs.",
288
324
  usage: ["VCA", "VCA NVDA, AAPL, TSLA"],
@@ -354,6 +390,13 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
354
390
  data: same("Twice a month, as FINRA publishes"),
355
391
  bloomberg: ["SI"],
356
392
  },
393
+ SIW: {
394
+ summary: "Which of your names are crowded shorts that are moving up? Short interest as a share of float, days to cover, the change since the prior settlement and the month's price move across your portfolios and watchlists, or the tickers you give.",
395
+ usage: ["SIW", "SIW GME, AMC, CVNA"],
396
+ keys: [OPEN],
397
+ data: same("Twice a month, as FINRA publishes; daily closes"),
398
+ bloomberg: [],
399
+ },
357
400
  SIV: {
358
401
  summary: "FINRA daily off-exchange short volume as a share of volume, against its one-year range. Not short interest; SI has that.",
359
402
  usage: ["SIV TSLA"],
@@ -410,6 +453,90 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
410
453
  data: pro("As calls, stories and filings arrive"),
411
454
  bloomberg: ["NSE"],
412
455
  },
456
+ COVN: {
457
+ summary: "Financial maintenance covenant thresholds, matching reported values and supported headroom. Open a covenant for its definition, calculation limits, literal filing evidence and instrument revisions.",
458
+ usage: ["COVN FICO"],
459
+ keys: [TABS, OPEN, OPEN_SOURCE, key("f", "a"), key("m", "aturities")],
460
+ data: { free: "As filed; three supported rows per section", pro: "As filed; all covenants, evidence and revisions" },
461
+ bloomberg: ["CAST"],
462
+ },
463
+ CRDOC: {
464
+ summary: "Issuer capital structure, contractual covenants, supported headroom and maturity walls. Open each instrument for verbatim filing evidence and immutable amendment history. Screen for low headroom and approaching springing maturities.",
465
+ usage: ["CRDOC FICO", "COVN AAPL"],
466
+ keys: [TABS, OPEN, OPEN_SOURCE, key("d", "es"), key("f", "a"), key("m", "aturities"), key("c", "ds")],
467
+ data: { free: "As filed; three rows per section with supporting evidence", pro: "As filed; all stored terms, revisions and risk screens" },
468
+ bloomberg: ["CAST", "DDIS"],
469
+ },
470
+ ATTN: {
471
+ summary: "See which tickers opted-in Gloom users are researching, with delayed privacy-qualified hourly counts, abnormal attention, sectors, countries and market context. Suppressed activity is unavailable, never zero.",
472
+ usage: ["ATTN", "ATTN 6758:JPX"],
473
+ keys: [OPEN, key("e", "vidence"), key("d", "es"), key("g", "raph"), key("n", "ews")],
474
+ data: { free: "Three published rows per section and the latest history point", pro: "All published rows and hourly history; minimum one-hour publication lag" },
475
+ bloomberg: [],
476
+ },
477
+ HIRE: {
478
+ summary: "Pro hiring momentum: weekly observed open roles, additions and removals, role families, seniority, remote and location mix, peers and primary posting evidence. Observed requisitions are not headcount. No argument opens the covered-company board.",
479
+ usage: ["HIRE", "HIRE NET", "HIRE 0700:HKEX"],
480
+ keys: [TABS, OPEN, key("e", "vidence"), key("o", "pen source"), key("d", "es"), key("g", "raph")],
481
+ data: { free: "Latest values and three rows per section", pro: "Weekly history, all stored observations and evidence" },
482
+ bloomberg: [],
483
+ },
484
+ APPS: {
485
+ summary: "Pro app attention: public app ranks by country, rank velocity, rating drift and country spreads, mapped through developers to listed parents. Evidence preserves capture and ownership revisions. Ranks are not downloads or revenue.",
486
+ usage: ["APPS", "APPS META", "APPS 0700:HKEX"],
487
+ keys: [TABS, OPEN, key("e", "vidence"), key("o", "pen source"), key("d", "es"), key("g", "raph")],
488
+ data: { free: "Latest values and three rows per section", pro: "Daily observations, full history, countries and evidence" },
489
+ bloomberg: [],
490
+ },
491
+ CATL: {
492
+ summary: "Regulatory, clinical, legal and trade-policy events linked to companies. Filter the calendar by type, agency, country and sector, follow upcoming dates or observed changes, and inspect source evidence and revision history.",
493
+ usage: ["CATL", "CATL PFE", "CATL NOVN:SIX"],
494
+ keys: [TABS, OPEN, OPEN_SOURCE, key("a", "lert"), key("d", "es")],
495
+ data: { free: "Three events with primary-source evidence", pro: "All stored events, revision history and local alerts" },
496
+ bloomberg: [],
497
+ },
498
+ LITI: {
499
+ summary: "Company litigation, enforcement and antitrust dockets with primary documents, resolved parties, dated status changes and revision history. Published coverage varies by jurisdiction.",
500
+ usage: ["LITI AAPL", "LITI MSFT"],
501
+ keys: [TABS, OPEN, OPEN_SOURCE, key("t", "o calendar")],
502
+ data: { free: "Three company events with evidence", pro: "All stored company dockets and history" },
503
+ bloomberg: ["LITI"],
504
+ },
505
+ KPIS: {
506
+ summary: "Company operating KPIs, fiscal history and revisions with source quotes.",
507
+ usage: ["KPIS CRM", "KPIS 005930:KRX"],
508
+ keys: [TABS, OPEN, key("e", "vidence"), OPEN_SOURCE],
509
+ data: { free: "Pro dataset; fixed latest preview with evidence", pro: "As disclosed; all stored observations and history" },
510
+ bloomberg: [],
511
+ },
512
+ GUIDE: {
513
+ summary: "Management guidance ranges, raises, cuts and later actuals, with source quotes.",
514
+ usage: ["GUIDE DAL", "GUIDE CRM"],
515
+ keys: [TABS, OPEN, key("e", "vidence"), OPEN_SOURCE],
516
+ data: { free: "Pro dataset; fixed latest preview with evidence", pro: "As issued; full guidance history and actual matches" },
517
+ bloomberg: [],
518
+ },
519
+ EXPO: {
520
+ summary: "Pro scenario exposure engine. Trace country, supplier, customer, commodity, rate, FX and tariff shocks through holdings, disclosed revenue and supply chains. Table, Drivers, Paths and Portfolio preserve evidence, unknowns, signed NAV weights and separate operating denominators. Drivers adds sourced KPIs, guidance and credit disclosures.",
521
+ usage: ["EXPO AAPL=60% NVDA=40%", "EXPO PORT:portfolio-id", "EXPO WATCH:watchlist-id"],
522
+ keys: [TABS, OPEN, key("s", "cenario and holdings"), key("e", "vidence"), key("a", "ll company disclosures"), key("v", "isibility"), key("o", "pen source")],
523
+ data: { free: "One holding and one-hop evidence preview", pro: "Full holdings and up to four-hop paths, as filed" },
524
+ bloomberg: ["PORT", "SPLC"],
525
+ },
526
+ SPLC: {
527
+ summary: "Pro global supply chain research in Table, Flow, Graph and Path with a free preview. Filter filings, company announcements, calls and reported evidence. Follow up to four disclosed hops with ranked paths and estimated exposure. Unconfirmed leads stay separate and out of the flow. Evidence carries publisher, date, corroboration, permitted original-language quotes or links, labelled English glosses and native disclosed units.",
528
+ usage: ["SPLC NVDA", "SUPPLY AAPL", "SPLC 005930.KS", "SPLC 8035.T"],
529
+ keys: [OPEN, key("e", "vidence"), key("d", "es"), key("g", "raph")],
530
+ data: { free: "Three relationships per role with evidence and a one-hop graph preview", pro: "Full evidence tiers, one-to-four-hop graphs and ranked paths" },
531
+ bloomberg: ["SPLC"],
532
+ },
533
+ AWARDS: {
534
+ summary: "Government contracts mapped to verified listed parents, with a dated feed, company award history, agency concentration, sector leaders and awards relative to annual revenue. Inspect original evidence, revisions, subawards and modifications. Coverage varies by jurisdiction.",
535
+ usage: ["AWARDS", "AWARDS LMT", "AWARDS BA.:LSE"],
536
+ keys: [TABS, OPEN, SEARCH, key("e", "vidence"), key("o", "pen source"), key("d", "es"), key("f", "a"), key("g", "raph"), key("s", "plc"), key("c", "alendar")],
537
+ data: { free: "Pro preview: three rows per section", pro: "All collected awards, history, revisions and relationships" },
538
+ bloomberg: [],
539
+ },
413
540
  SEG: {
414
541
  summary: "Quarterly revenue by product, segment or region from the company's 10-Q and 10-K filings.",
415
542
  usage: ["SEG AAPL"],
@@ -452,6 +579,13 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
452
579
  data: { free: "7 days delayed", pro: "As announced, spreads live" },
453
580
  bloomberg: ["MA"],
454
581
  },
582
+ DIST: {
583
+ summary: "Dated public records about companies in difficulty: 8-K bankruptcy, obligation and listing filings, SEC going-concern disclosures, Taiwan exchange listing designations, and French and UK insolvency notices. The Distress tab of MA.",
584
+ usage: ["DIST"],
585
+ keys: [key("←/→", " source"), OPEN, key("t", "icker"), key("o", "pen")],
586
+ data: same("As published: 8-K filings through the day, going-concern disclosures from monthly SEC data sets, listings and notices daily"),
587
+ bloomberg: [],
588
+ },
455
589
  ASKG: {
456
590
  summary: "Ask a question about what is on screen and watch the tools Gloom runs to answer it.",
457
591
  usage: ["ASKG why is NVDA down today"],
@@ -464,35 +598,35 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
464
598
  TOP: {
465
599
  summary: "Curated stories ranked by importance across wires, publishers and X, with tickers and category. The pane to keep open when you only want what matters.",
466
600
  usage: ["TOP"],
467
- keys: [OPEN, key("t", "icker")],
601
+ keys: [OPEN, SEARCH, POP_OUT, key("t", "icker")],
468
602
  data: NEWS,
469
603
  bloomberg: ["TOP"],
470
604
  },
471
605
  N: {
472
606
  summary: "Every story as it arrives, newest first, with source, tickers, sentiment and importance; filter by sentiment or minimum score.",
473
607
  usage: ["N"],
474
- keys: [OPEN, key("t", "icker"), key("y", " share")],
608
+ keys: [OPEN, SEARCH, POP_OUT, key("t", "icker"), key("y", " share")],
475
609
  data: NEWS,
476
610
  bloomberg: ["N"],
477
611
  },
478
612
  CN: {
479
613
  summary: "Stories linked to the ticker, newest first.",
480
614
  usage: ["CN NVDA"],
481
- keys: [OPEN, key("t", "icker")],
615
+ keys: [OPEN, SEARCH, POP_OUT, key("t", "icker")],
482
616
  data: NEWS,
483
617
  bloomberg: ["CN"],
484
618
  },
485
619
  NI: {
486
620
  summary: "Market news by topic code (MNA, CB, ENERGY, REG, CRYPTO, EARN, IPO) or sector.",
487
621
  usage: ["NI ENERGY"],
488
- keys: [OPEN, key("t", "icker")],
622
+ keys: [OPEN, SEARCH, POP_OUT, key("t", "icker")],
489
623
  data: NEWS,
490
624
  bloomberg: ["NI"],
491
625
  },
492
626
  FIRST: {
493
627
  summary: "Stories flagged as breaking or urgent. Turn on Notifications in its pane settings to hear about new ones while the pane is closed.",
494
628
  usage: ["FIRST"],
495
- keys: [OPEN, key("t", "icker")],
629
+ keys: [OPEN, SEARCH, POP_OUT, key("t", "icker")],
496
630
  data: NEWS,
497
631
  bloomberg: ["FIRST"],
498
632
  },
@@ -516,16 +650,23 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
516
650
  summary: "Major indices grouped by region with last, change and session status: which markets are open and how they closed.",
517
651
  usage: ["WEI"],
518
652
  keys: [OPEN],
519
- data: same("Delayed up to 15 minutes"),
653
+ data: same(DELAYED),
520
654
  bloomberg: ["WEI"],
521
655
  },
522
656
  BI: {
523
- summary: "S&P 500 sectors and industries sorted by the day's move, with their representative ETFs.",
657
+ summary: "S&P 500 sectors and industries sorted by the day's move, with their representative ETFs, and curated thematic baskets on the Themes tab.",
524
658
  usage: ["BI"],
525
659
  keys: [TABS, OPEN],
526
660
  data: QUOTES,
527
661
  bloomberg: ["IMAP"],
528
662
  },
663
+ THEM: {
664
+ summary: "Curated thematic baskets with equal-weight returns and breadth. Open a theme to see its members, leaders and laggards. The Themes tab of BI.",
665
+ usage: ["THEM", "THEM nuclear"],
666
+ keys: [TABS, OPEN, key("Esc", "back")],
667
+ data: same("Updated every 15 minutes"),
668
+ bloomberg: ["IMAP", "custom baskets"],
669
+ },
529
670
  RRG: {
530
671
  summary: "Each name's strength against SPY or another benchmark, plotted against its momentum with weekly trails through the four quadrants. Sector ETFs by default, or your tickers.",
531
672
  usage: ["RRG", "RRG NVDA, AAPL, MSFT"],
@@ -547,6 +688,13 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
547
688
  data: FX,
548
689
  bloomberg: ["FXC"],
549
690
  },
691
+ PERP: {
692
+ summary: "Perpetual funding, open interest and premiums across crypto and stock, index, commodity and FX contracts. Per-market History and Evidence. Pro history with a latest-value free preview.",
693
+ usage: ["PERP", "PERP BTC", "PERP TSLA"],
694
+ keys: [TABS, SEARCH, OPEN_SOURCE, key("a", "lert"), key("e", "vidence"), key("d", "es"), key("f", "a"), key("g", "raph")],
695
+ data: { free: "Latest market values", pro: "Observed funding, open interest and stored history; source timestamps retained" },
696
+ bloomberg: [],
697
+ },
550
698
  CRYP: {
551
699
  summary: "The top coins by market cap, stablecoins on their own tab, with returns from a day to a year, a 30-day sparkline, volume and market cap.",
552
700
  usage: ["CRYP"],
@@ -558,7 +706,7 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
558
706
  summary: "Front-month futures across equity index, rates, energy, metals, agriculture, livestock and FX with last price and session change, grouped by sector.",
559
707
  usage: ["FUT"],
560
708
  keys: [SEARCH, OPEN],
561
- data: same("Delayed, usually 10 minutes"),
709
+ data: same(DELAYED),
562
710
  bloomberg: ["GLCO"],
563
711
  },
564
712
  CTM: {
@@ -582,6 +730,35 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
582
730
  data: same("Weekly: Tuesday positions, out on Friday"),
583
731
  bloomberg: ["COT"],
584
732
  },
733
+ DOE: {
734
+ summary: "The EIA's weekly petroleum and natural gas storage numbers: crude, Cushing and the SPR, gasoline, distillates, jet fuel and propane, refinery runs, trade and demand, and gas storage by region. Each row shows the week's build or draw, the change on a year ago and where it sits in its five-year range; the selected one is charted over the year against the five-year band with a plain read of the numbers.",
735
+ usage: ["DOE", "NGS"],
736
+ keys: [],
737
+ data: same("Weekly, on release"),
738
+ bloomberg: ["DOE"],
739
+ },
740
+ POWER: {
741
+ summary: "Pro: global power interconnection queues, recorded MW history, completion and withdrawal cohorts, large-load requests and approvals, utility exposure and generation capacity. Open a project for primary evidence and revisions; mapped companies link to DES, FA, G and SPLC.",
742
+ usage: ["POWER", "POWER NEE"],
743
+ keys: [SEARCH, key("o", "pen source"), key("d", "es"), key("f", "a"), key("g", "raph"), key("s", "plc"), key("c", "ompute"), key("t", "BO")],
744
+ data: { free: "Three rows per section; limited history", pro: "Snapshots as public registers update; coverage by region" },
745
+ bloomberg: [],
746
+ },
747
+ GPU: {
748
+ summary: "Pro GPU rental list prices, provider-declared spot rates and marketplace asks in USD per GPU-hour. Compare clouds and hardware variants, inspect observations, anonymised third-party reference indices and dated price changes, and open related equities or TheBuildout.",
749
+ usage: ["GPU", "GPU H100", "GPU B200"],
750
+ keys: [key("t", "BO")],
751
+ data: same("Hourly asks and AWS spot; other published prices every 6 or 24 hours"),
752
+ bloomberg: [],
753
+ },
754
+ NGS: {
755
+ summary: "Lower 48 working gas in storage and each region's, the week's injection or withdrawal against a year ago and the five-year average, charted over the year. The Gas Storage tab of DOE.",
756
+ usage: ["NGS"],
757
+ keys: [],
758
+ data: same("Weekly, on release"),
759
+ bloomberg: [],
760
+ docs: "DOE",
761
+ },
585
762
  VIX: {
586
763
  summary: "Daily VIX tenor closes, the term structure and whether it is in contango or inverted, with the cross-asset volatility board beside it.",
587
764
  usage: ["VIX"],
@@ -647,6 +824,13 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
647
824
  data: ON_RELEASE,
648
825
  bloomberg: ["ECST"],
649
826
  },
827
+ CPI: {
828
+ summary: "The US consumer price index by component: food, energy, core goods, shelter and services ex shelter, each with its weight, the month's change, three- and six-month annualised rates, the change on a year ago and its contribution in points to the headline. The selected row is charted month by month against the headline with a plain read of the numbers; the header gives the next release.",
829
+ usage: ["CPI", "CPI shelter", "ECAN"],
830
+ keys: [],
831
+ data: same("Monthly, on release"),
832
+ bloomberg: ["ECAN"],
833
+ },
650
834
  CBR: {
651
835
  summary: "Policy rates for the G20 central banks with the last move, its date and a one-year percentile; open one for its history.",
652
836
  usage: ["CBR"],
@@ -733,6 +917,34 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
733
917
  data: AS_FILED,
734
918
  bloomberg: ["CF"],
735
919
  },
920
+ ETF: {
921
+ summary: "A US-listed fund's SEC filings: registration statements and prospectus updates, shareholder reports, N-CEN and N-PORT reports. Open any of them inline.",
922
+ usage: ["ETF SPY"],
923
+ keys: [OPEN, OPEN_SOURCE],
924
+ data: AS_FILED,
925
+ bloomberg: [],
926
+ },
927
+ TRIAL: {
928
+ summary: "Clinical studies by condition, drug, or sponsor, with status, phase, and enrollment. Open the study record.",
929
+ usage: ["TRIAL", "TRIAL semaglutide"],
930
+ keys: [SEARCH, OPEN],
931
+ data: same("As studies are posted"),
932
+ bloomberg: [],
933
+ },
934
+ CLTR: {
935
+ summary: "SEC staff comment letters and company responses, newest first. Search their text, or type a ticker for one company's letters, and open a letter to read it.",
936
+ usage: ["CLTR", "CLTR revenue recognition", "CLTR AAPL"],
937
+ keys: [SEARCH, OPEN],
938
+ data: AS_FILED,
939
+ bloomberg: [],
940
+ },
941
+ FDA: {
942
+ summary: "FDA drug and device adverse event reports and drug recalls, by drug, device or firm name. A report is what someone observed, not proof the product caused it.",
943
+ usage: ["FDA", "FDA metformin", "FDA insulin pump"],
944
+ keys: [SEARCH, OPEN],
945
+ data: same("As FDA updates each dataset; drug reports quarterly"),
946
+ bloomberg: [],
947
+ },
736
948
  HDS: {
737
949
  summary: "Institutional holders as a table (value, shares, change, percent held) or as an ownership treemap.",
738
950
  usage: ["HDS NVDA"],
@@ -170,6 +170,10 @@ export async function loadResolvedHeadlessPaneModel(
170
170
  const tickers = (await context.store.loadAllTickers()).filter(row => row.metadata.portfolios.includes(id));
171
171
  return { portfolio, tickers };
172
172
  },
173
+ async resolveWatchlist(id) {
174
+ if (!context.config.watchlists.some(row => row.id === id)) return null;
175
+ return (await context.store.loadAllTickers()).filter(row => row.metadata.watchlists.includes(id));
176
+ },
173
177
  async resolveInstrument(key) {
174
178
  const parsed = parsePublicTickerKey(key);
175
179
  const ticker = await context.store.loadTicker(key)
@@ -1,3 +1,12 @@
1
+ import { creditScreenshotEvidence } from "../../plugins/builtin/credit-documents/evidence";
2
+ import { attentionScreenshotEvidence } from "../../plugins/builtin/attention/evidence";
3
+ import { attentionScreenshotEvidence as companyAttentionScreenshotEvidence } from "../../plugins/builtin/company-attention/evidence";
4
+ import { catalystsScreenshotEvidence, litigationScreenshotEvidence } from "../../plugins/builtin/catalysts/evidence";
5
+ import { companyKpisScreenshotEvidence, companyGuidanceScreenshotEvidence } from "../../plugins/builtin/company-kpis/screenshot-evidence";
6
+ import { powerScreenshotEvidence } from "../../plugins/builtin/power/evidence";
7
+ import { exposureScreenshotEvidence } from "../../plugins/builtin/exposure/evidence";
8
+ import { supplyScreenshotEvidence } from "../../plugins/builtin/supply-chain/evidence";
9
+ import { awardsScreenshotEvidence } from "../../plugins/builtin/awards/evidence";
1
10
  import type { RemoteUiNodeSnapshot } from "../../remote/types";
2
11
  import type { TickerFinancials } from "../../types/financials";
3
12
  import type { DesktopPaneShotPayload, DesktopPaneShotRenderResult } from "../desktop-pane-shot";
@@ -67,6 +76,18 @@ export interface PaneScreenshotEvidenceHook<E extends PaneScreenshotEvidence = P
67
76
 
68
77
  /** Built-in panes that certify their captures with their own evidence. */
69
78
  const PANE_SCREENSHOT_EVIDENCE: readonly PaneScreenshotEvidenceHook[] = [
79
+ exposureScreenshotEvidence,
80
+ supplyScreenshotEvidence,
81
+ creditScreenshotEvidence,
82
+ attentionScreenshotEvidence,
83
+ companyAttentionScreenshotEvidence("hiring"),
84
+ companyAttentionScreenshotEvidence("apps"),
85
+ catalystsScreenshotEvidence,
86
+ litigationScreenshotEvidence,
87
+ companyKpisScreenshotEvidence,
88
+ companyGuidanceScreenshotEvidence,
89
+ awardsScreenshotEvidence,
90
+ powerScreenshotEvidence,
70
91
  calculatorScreenshotEvidence,
71
92
  scenarioScreenshotEvidence,
72
93
  realizedVolScreenshotEvidence,
@@ -84,8 +84,19 @@ import {
84
84
  createFallbackTicker,
85
85
  fetchTickerFinancials,
86
86
  isFinancialAnalysisFunction,
87
+ readsDailyReturns,
88
+ withShotDailyReturns,
89
+ withShotPeriodEndHistory,
87
90
  withShotPriceHistory,
91
+ withShotSeasonalityHistory,
88
92
  } from "./data";
93
+ import {
94
+ financialRatioRenderMismatches,
95
+ financialRatioShotEvidence,
96
+ financialRatioShotGap,
97
+ shotRatioTab,
98
+ type PaneScreenshotFinancialRatioEvidence,
99
+ } from "./financial-ratio-shot";
89
100
 
90
101
  const DESKTOP_CELL_WIDTH_PX = 8;
91
102
  const DESKTOP_CELL_HEIGHT_PX = 18;
@@ -270,7 +281,7 @@ async function collectShotValuationSeries(
270
281
  }
271
282
 
272
283
  export interface PaneScreenshotExpectedSelection {
273
- control: "metric" | "statement" | "period";
284
+ control: "metric" | "statement" | "ratio" | "period";
274
285
  value?: string;
275
286
  label?: string;
276
287
  }
@@ -368,6 +379,7 @@ export type PaneScreenshotDataEvidence =
368
379
  | PaneScreenshotPriceComparisonEvidence
369
380
  | PaneScreenshotFundamentalSeriesEvidence
370
381
  | PaneScreenshotFinancialStatementEvidence
382
+ | PaneScreenshotFinancialRatioEvidence
371
383
  | PaneScreenshotEvidence;
372
384
 
373
385
  export interface PaneScreenshotReadinessSignals {
@@ -550,7 +562,8 @@ export async function buildDesktopShotPayload(
550
562
  ?? data.quote?.listingExchangeName
551
563
  ?? data.quote?.exchangeName
552
564
  ?? "";
553
- if (resolved.pane.id === "realized-vol" || resolved.pane.id === "iv-history" || resolved.pane.id === "iv-screen"
565
+ const fiveYearsDaily = resolved.pane.id === "realized-vol" || resolved.pane.id === "iv-history" || resolved.pane.id === "macro-day";
566
+ if (fiveYearsDaily || resolved.pane.id === "iv-screen" || resolved.pane.id === "short-watch"
554
567
  || resolved.pane.id === "backtest" || resolved.pane.id === OPTIONS_PANE_ID) {
555
568
  // Generic 5Y snapshots can contain weekly bars. The snapshot provider
556
569
  // treats captured history as authoritative, even for a later 1d request.
@@ -560,10 +573,16 @@ export async function buildDesktopShotPayload(
560
573
  }
561
574
  const priceHistory = await context.dataProvider.getPriceHistoryForResolution(
562
575
  entry.instrument.symbol, exchange,
563
- resolved.pane.id === "realized-vol" || resolved.pane.id === "iv-history" ? "5Y" : resolved.pane.id === "backtest" ? "ALL" : "1Y",
576
+ fiveYearsDaily ? "5Y" : resolved.pane.id === "backtest" ? "ALL" : "1Y",
564
577
  "1d", toMarketDataContext(entry.instrument),
565
578
  );
566
579
  data = { ...data, priceHistory };
580
+ } else if (shotRatioTab(resolved)?.key === "valuation") {
581
+ data = await withShotPeriodEndHistory(context, entry.instrument, exchange, resolved, data);
582
+ } else if (resolved.pane.id === "seasonality") {
583
+ data = await withShotSeasonalityHistory(context, entry.instrument, data);
584
+ } else if (requestedRange && readsDailyReturns(resolved)) {
585
+ data = await withShotDailyReturns(context, entry.instrument, exchange, requestedRange, data);
567
586
  } else if (requestedRange) {
568
587
  try {
569
588
  const priceHistory = await context.dataProvider.getPriceHistory(entry.instrument.symbol, exchange, requestedRange);
@@ -717,6 +736,17 @@ export async function renderDesktopShot({
717
736
  }
718
737
  const renderedInstance = payload.config.layout.instances.find(({ instanceId }) => instanceId === payload.paneId);
719
738
  if (renderedInstance) resolved = { ...resolved, instance: renderedInstance };
739
+ return assessPaneScreenshot(resolved, payload, render, rawArg, outputPath);
740
+ }
741
+
742
+ /** What a rendered capture shows, and whether it is fit to use. */
743
+ export function assessPaneScreenshot(
744
+ resolved: ResolvedPaneFunction,
745
+ payload: DesktopPaneShotPayload,
746
+ render: DesktopPaneShotRenderResult,
747
+ rawArg: string,
748
+ outputPath: string,
749
+ ): PaneScreenshotResult {
720
750
  const evidenceHook = paneScreenshotEvidenceHook(resolved);
721
751
  // The sizer carries portfolio members to value holdings and the earnings board
722
752
  // to mark them, but each shows only what its argument asks for.
@@ -747,6 +777,7 @@ export async function renderDesktopShot({
747
777
  ...(expectedChart ? chartEvidenceMismatchesFor(render.semanticUi, expectedChart) : []),
748
778
  ...intradayChartEvidenceMismatchesFor(resolved, payload, render.semanticUi),
749
779
  ...paneEvidenceMismatches(resolved, payload, render),
780
+ ...financialRatioRenderMismatches(resolved, payload, render),
750
781
  ];
751
782
  const semanticMismatch = missingExpectedText.length > 0
752
783
  || missingExpectedSelections.length > 0
@@ -843,6 +874,8 @@ export function shotUnusableReasonFor(
843
874
  if (render.errorStateDetected) return "The pane rendered an error state.";
844
875
  if (render.emptyStateDetected) return "The pane rendered an empty state.";
845
876
  if (unavailableSymbols.length > 0) return `Data is unavailable for ${unavailableSymbols.join(", ")}.`;
877
+ const ratioGap = financialRatioShotGap(resolved, payload);
878
+ if (ratioGap) return ratioGap;
846
879
  if (semanticMismatch) return "The rendered content did not match the requested capability.";
847
880
  return "The pane did not produce verifiable screenshot evidence.";
848
881
  }
@@ -975,6 +1008,7 @@ export function shotDataEvidenceFor(
975
1008
  return { kind: "fundamental-series", metric, period, series };
976
1009
  }
977
1010
 
1011
+ if (shotRatioTab(resolved)) return financialRatioShotEvidence(resolved, payload);
978
1012
  if (resolved.capability.id === "financial-statements") {
979
1013
  const [symbol, financials] = payload.financials[0] ?? [];
980
1014
  if (!symbol || !financials) return null;
@@ -1552,7 +1586,9 @@ export function shotExpectedText(
1552
1586
  balance: "Balance",
1553
1587
  cashflow: "Cash Flow",
1554
1588
  };
1555
- expected.push(statementLabels[String(resolved.options.statement)] ?? "");
1589
+ // A ratio tab names itself in the query bar and leads with its first ratio.
1590
+ const ratioTab = shotRatioTab(resolved);
1591
+ expected.push(ratioTab?.name ?? statementLabels[String(resolved.options.statement)] ?? "");
1556
1592
  expected.push(resolved.options.period === "annual" ? "Annual" : "Quarterly");
1557
1593
  const financials = payload.financials[0]?.[1];
1558
1594
  if (financials) {
@@ -1576,7 +1612,8 @@ export function shotExpectedText(
1576
1612
  latestStatement.aggregation?.periodEnd,
1577
1613
  ).trim());
1578
1614
  }
1579
- if (firstMetric) expected.push(firstMetric.unitLabel);
1615
+ const firstLabel = ratioTab ? ratioTab.ratios[0]?.label : firstMetric?.unitLabel;
1616
+ if (firstLabel) expected.push(firstLabel);
1580
1617
  }
1581
1618
  }
1582
1619
  return expected.filter(Boolean);
@@ -1593,6 +1630,13 @@ function shotExpectedSelections(
1593
1630
  }];
1594
1631
  }
1595
1632
  if (resolved.capability.id !== "financial-statements") return [];
1633
+ const ratioTab = shotRatioTab(resolved);
1634
+ if (ratioTab) {
1635
+ return [
1636
+ { control: "ratio", value: ratioTab.key, label: ratioTab.name },
1637
+ { control: "period", value: String(resolved.options.period) },
1638
+ ];
1639
+ }
1596
1640
  const labels: Record<string, string> = {
1597
1641
  income: "Income",
1598
1642
  cashflow: "Cash Flow",
@@ -1159,6 +1159,17 @@ function CompositePanelSurface({
1159
1159
  color: marker.color,
1160
1160
  };
1161
1161
  }, [formatAxisValue, panel]);
1162
+ const priorCloseMarker = useMemo(() => {
1163
+ const marker = panel.priorClose;
1164
+ const domain = marker ? panel.axes[marker.axis] : undefined;
1165
+ if (!marker || !domain) return null;
1166
+ return {
1167
+ side: marker.axis,
1168
+ yRatio: marker.yRatio,
1169
+ label: formatAxisValue ? formatAxisValue(marker.value, domain) : formatCompositeCursorValue(marker.value, domain),
1170
+ color: colors.textDim,
1171
+ };
1172
+ }, [colors.textDim, formatAxisValue, panel]);
1162
1173
  const levelMarkers = useMemo(() => levelDomain ? [...projectedLevels]
1163
1174
  // The picked level's label first, then alerts', when they compete for room.
1164
1175
  .sort((left, right) => Number(right.level.id === selectedLevelId) - Number(left.level.id === selectedLevelId)
@@ -1181,7 +1192,8 @@ function CompositePanelSurface({
1181
1192
  !!marker && (marker.side === null || marker.side === side)
1182
1193
  );
1183
1194
  const fixed = [lastPriceMarker, axisMarkers].filter(onSide).map(toAxisMarker);
1184
- const levelLabels = levelMarkers.filter(onSide).map(toAxisMarker);
1195
+ // The prior close's label yields to every level's.
1196
+ const levelLabels = [...levelMarkers, priorCloseMarker].filter(onSide).map(toAxisMarker);
1185
1197
  // A label is a row tall, so close levels would stack into an unreadable
1186
1198
  // pile and hide the last price: each keeps its line, and only the labels
1187
1199
  // with a row to themselves show. Desktop badges sit between rows.
@@ -2885,7 +2897,7 @@ export function CompositeChart({
2885
2897
  const timeAxisCursorLabel = xAxis?.formatCursor && scene.cursorXRatio !== null
2886
2898
  ? xAxis.formatCursor(scene.cursorXRatio)
2887
2899
  : scene.cursorDate
2888
- ? formatCompositeTimeAxisDate(scene.cursorDate, scene.startTime, scene.endTime)
2900
+ ? formatCompositeTimeAxisDate(scene.cursorDate, scene.startTime, scene.endTime, scene.timeZone)
2889
2901
  : null;
2890
2902
  // The crosshair labels the moving end, so the axis only adds the anchor.
2891
2903
  const timeAxisMarkers = toolSpan
@@ -2895,6 +2907,7 @@ export function CompositeChart({
2895
2907
  new Date(toolSpan.startTime),
2896
2908
  scene.startTime,
2897
2909
  scene.endTime,
2910
+ scene.timeZone,
2898
2911
  ),
2899
2912
  color: toolSpan.color,
2900
2913
  }]
@@ -1,6 +1,7 @@
1
1
  import { formatMarketPrice, formatMarketPriceWithCurrency, stablePriceFractionDigits, type MarketFormatOptions } from "../../../market-data/market/format";
2
2
  import type { ResolvedSeries, TimeSeriesPoint } from "../../../time-series/types";
3
3
  import type { CompositeAxisDomain, CompositePanelScene } from "./types";
4
+ import { timeZoneLabel, zonedWallClockMs } from "../../../utils/zoned-date-time";
4
5
 
5
6
  const CURRENCY_SYMBOLS: Record<string, string> = {
6
7
  USD: "$",
@@ -411,17 +412,28 @@ function utcTime(date: Date): string {
411
412
  return date.toISOString().slice(11, 16);
412
413
  }
413
414
 
415
+ /** The date's wall-clock reading in `timeZone` (UTC when absent), and the zone's short name. */
416
+ function onClock(date: Date, timeZone: string | undefined): { wall: Date; zone: string } {
417
+ if (!timeZone || timeZone === "UTC") return { wall: date, zone: "UTC" };
418
+ try {
419
+ return { wall: new Date(zonedWallClockMs(date.getTime(), timeZone)), zone: timeZoneLabel(timeZone) };
420
+ } catch {
421
+ return { wall: date, zone: "UTC" };
422
+ }
423
+ }
424
+
414
425
  function isIntradaySpan(startTime: number, endTime: number): boolean {
415
426
  return Number.isFinite(startTime)
416
427
  && Number.isFinite(endTime)
417
428
  && Math.abs(endTime - startTime) <= INTRADAY_SPAN_MAX_MS;
418
429
  }
419
430
 
420
- /** Shared-cursor timestamp using the chart's explicit UTC convention. */
421
- export function formatCompositeCursorDate(date: Date, startTime: number, endTime: number): string {
431
+ /** Shared-cursor timestamp on the chart's clock: the venue's for intraday bars, else UTC. */
432
+ export function formatCompositeCursorDate(date: Date, startTime: number, endTime: number, timeZone?: string): string {
433
+ const { wall, zone } = onClock(date, timeZone);
422
434
  return isIntradaySpan(startTime, endTime)
423
- ? `${utcDate(date)} ${utcTime(date)} UTC`
424
- : utcDate(date);
435
+ ? `${utcDate(wall)} ${utcTime(wall)} ${zone}`
436
+ : utcDate(wall);
425
437
  }
426
438
 
427
439
  function validUtcTimestamp(date: Date | undefined): string | null {
@@ -462,12 +474,13 @@ export function formatCompositePointDetails(point: TimeSeriesPoint | null | unde
462
474
  return details.join(" · ");
463
475
  }
464
476
 
465
- /** Compact UTC tick label selected from the full visible chart span. */
466
- export function formatCompositeTimeAxisDate(date: Date, startTime: number, endTime: number): string {
467
- if (!isIntradaySpan(startTime, endTime)) return utcDate(date);
468
- const startDate = utcDate(new Date(startTime));
469
- const endDate = utcDate(new Date(endTime));
477
+ /** Compact tick label on the chart's clock, selected from the full visible chart span. */
478
+ export function formatCompositeTimeAxisDate(date: Date, startTime: number, endTime: number, timeZone?: string): string {
479
+ const { wall, zone } = onClock(date, timeZone);
480
+ if (!isIntradaySpan(startTime, endTime)) return utcDate(wall);
481
+ const startDate = utcDate(onClock(new Date(startTime), timeZone).wall);
482
+ const endDate = utcDate(onClock(new Date(endTime), timeZone).wall);
470
483
  return startDate === endDate
471
- ? `${utcTime(date)} UTC`
472
- : `${utcDate(date).slice(5)} ${utcTime(date)} UTC`;
484
+ ? `${utcTime(wall)} ${zone}`
485
+ : `${utcDate(wall).slice(5)} ${utcTime(wall)} ${zone}`;
473
486
  }