gloomberb 0.16.5 → 0.16.6

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 (478) hide show
  1. package/package.json +2 -1
  2. package/src/api-client/central-bank-rates.ts +6 -1
  3. package/src/api-client/chat.ts +26 -0
  4. package/src/api-client/credit-boards.ts +2 -0
  5. package/src/api-client/data.ts +49 -1
  6. package/src/api-client/europe-energy.ts +106 -0
  7. package/src/api-client/index.ts +9 -0
  8. package/src/api-client/market-discovery.ts +3 -0
  9. package/src/api-client/normalizers.ts +32 -0
  10. package/src/api-client/perps.ts +8 -0
  11. package/src/api-client/request.ts +9 -2
  12. package/src/api-client/socket.ts +29 -0
  13. package/src/api-client/themes.ts +22 -1
  14. package/src/api-client/types.ts +61 -1
  15. package/src/app/global-shortcuts.ts +35 -1
  16. package/src/app/keybindings/actions.ts +12 -1
  17. package/src/app/pane-runtime/plugin-bindings.ts +2 -2
  18. package/src/app/pane-runtime/ticker-open-runtime.ts +9 -3
  19. package/src/app/runtime/desktop-deeplink.ts +10 -5
  20. package/src/app/runtime/startup.ts +1 -1
  21. package/src/app.tsx +6 -0
  22. package/src/architecture/core-builtin-allowlist.json +4 -13
  23. package/src/ask-gloom/pane-context.ts +114 -0
  24. package/src/ask-gloom/pane-request.ts +70 -0
  25. package/src/ask-gloom/pane-text.ts +201 -0
  26. package/src/capabilities/chart-series.ts +8 -1
  27. package/src/capabilities/factories.ts +1 -0
  28. package/src/cli/central-bank-events.ts +23 -0
  29. package/src/cli/command-options.ts +17 -5
  30. package/src/cli/commands/crypto-hints.ts +28 -2
  31. package/src/cli/commands/fred-series.ts +89 -4
  32. package/src/cli/commands/market.ts +101 -18
  33. package/src/cli/commands/overview.ts +47 -14
  34. package/src/cli/commands/search.ts +254 -23
  35. package/src/cli/commands/ticker.ts +73 -13
  36. package/src/cli/desktop-pane-shot.ts +23 -6
  37. package/src/cli/errors.ts +7 -5
  38. package/src/cli/exit-codes.ts +8 -0
  39. package/src/cli/export-source.ts +58 -0
  40. package/src/cli/glossary.ts +62 -8
  41. package/src/cli/help.ts +10 -0
  42. package/src/cli/helpers.ts +2 -5
  43. package/src/cli/history-rows.ts +70 -0
  44. package/src/cli/index.ts +9 -3
  45. package/src/cli/known-gaps.ts +65 -8
  46. package/src/cli/listing-arg.ts +182 -89
  47. package/src/cli/not-a-ticker.ts +12 -4
  48. package/src/cli/pane-functions/access-gate.ts +8 -2
  49. package/src/cli/pane-functions/capabilities.ts +1 -1
  50. package/src/cli/pane-functions/catalog.ts +183 -39
  51. package/src/cli/pane-functions/data.ts +30 -0
  52. package/src/cli/pane-functions/dom.ts +17 -2
  53. package/src/cli/pane-functions/freshness.ts +48 -24
  54. package/src/cli/pane-functions/function-help.ts +19 -10
  55. package/src/cli/pane-functions/headless.ts +55 -15
  56. package/src/cli/pane-functions/index.ts +45 -16
  57. package/src/cli/pane-functions/options.ts +8 -0
  58. package/src/cli/pane-functions/resolver.ts +25 -7
  59. package/src/cli/pane-functions/screenshot.ts +145 -9
  60. package/src/cli/perpetual-contract.ts +60 -0
  61. package/src/cli/registry.ts +3 -1
  62. package/src/cli/report-tables.ts +23 -7
  63. package/src/cli/result.ts +41 -10
  64. package/src/cli/series-search.ts +111 -0
  65. package/src/cli/staged-tickers.ts +1 -1
  66. package/src/cli/symbol-args.ts +18 -0
  67. package/src/cli/symbol-list.ts +1 -19
  68. package/src/cli/symbol-rows.ts +154 -0
  69. package/src/cli/ticker-resolution.ts +99 -8
  70. package/src/components/chart/composite/axis-overlays.tsx +8 -1
  71. package/src/components/chart/composite/composite-chart.tsx +41 -15
  72. package/src/components/chart/composite/crosshair-readout.tsx +150 -0
  73. package/src/components/chart/composite/downsample.ts +1 -1
  74. package/src/components/chart/composite/format.ts +29 -0
  75. package/src/components/chart/composite/interactions.ts +9 -2
  76. package/src/components/chart/composite/legend.tsx +52 -32
  77. package/src/components/chart/composite/panel-bitmap.ts +70 -35
  78. package/src/components/chart/composite/panel-labels.ts +18 -17
  79. package/src/components/chart/composite/panel-series.ts +1 -0
  80. package/src/components/chart/composite/panel-surface.tsx +6 -8
  81. package/src/components/chart/composite/rasterizer.ts +50 -8
  82. package/src/components/chart/composite/scene.ts +2 -1
  83. package/src/components/chart/composite/time-scale.ts +26 -9
  84. package/src/components/chart/composite/types.ts +18 -0
  85. package/src/components/chart/composite/use-composite-viewport.ts +30 -2
  86. package/src/components/chart/native/raster/crosshair.ts +8 -3
  87. package/src/components/chart/native/raster/primitives.ts +85 -21
  88. package/src/components/chart/native/surface/manager.ts +33 -8
  89. package/src/components/chart/surface3d/chart.tsx +1 -1
  90. package/src/components/command-bar/action-runtime.ts +1 -1
  91. package/src/components/command-bar/commands/collection-list.ts +210 -0
  92. package/src/components/command-bar/commands/collection.ts +40 -1
  93. package/src/components/command-bar/commands/direct/index.ts +4 -0
  94. package/src/components/command-bar/commands/registry.ts +8 -0
  95. package/src/components/command-bar/routes/root/plugin-install.ts +4 -4
  96. package/src/components/command-bar/routing/actions.ts +1 -1
  97. package/src/components/command-bar/workflow/tickers.ts +35 -29
  98. package/src/components/layout/detached-pane-shell.tsx +59 -39
  99. package/src/components/layout/floating-pane.tsx +7 -1
  100. package/src/components/layout/header.tsx +5 -0
  101. package/src/components/layout/missing-pane.tsx +3 -3
  102. package/src/components/layout/pane/capture-stamp.ts +41 -0
  103. package/src/components/layout/pane/capture-status.ts +12 -0
  104. package/src/components/layout/pane/footer/keyboard.ts +3 -0
  105. package/src/components/layout/pane/footer/model.ts +7 -1
  106. package/src/components/layout/pane/header.tsx +26 -0
  107. package/src/components/layout/pane/index.tsx +9 -1
  108. package/src/components/layout/pane/sidebar.tsx +10 -11
  109. package/src/components/layout/shell/cursor-occlusion.ts +2 -1
  110. package/src/components/layout/shell/index.tsx +61 -60
  111. package/src/components/layout/shell/menu.ts +9 -1
  112. package/src/components/layout/shell/pane/actions.ts +32 -10
  113. package/src/components/layout/shell/pane/ask.ts +131 -0
  114. package/src/components/layout/shell/pane/capture.ts +162 -0
  115. package/src/components/layout/shell/pane/layers.tsx +26 -5
  116. package/src/components/layout/shell/pane/management-shortcuts.ts +46 -1
  117. package/src/components/layout/shell/shortcuts.ts +21 -4
  118. package/src/components/metric-treemap/heat-surface.tsx +1 -3
  119. package/src/components/reader/article-reader.tsx +642 -0
  120. package/src/components/reader/article-text.ts +527 -0
  121. package/src/components/ticker/list-table-view.tsx +19 -1
  122. package/src/components/ui/data-table/index.tsx +1 -0
  123. package/src/components/ui/icon.tsx +4 -1
  124. package/src/components/ui/query-bar.tsx +10 -1
  125. package/src/data/config/store/migrations.ts +7 -0
  126. package/src/data/config/store/portfolio-as-of-column.ts +57 -0
  127. package/src/docs/snapshot.json +162 -23
  128. package/src/i18n/es.ts +4 -1
  129. package/src/i18n/ja.ts +4 -1
  130. package/src/i18n/ko.ts +4 -1
  131. package/src/i18n/zh-cn.ts +4 -1
  132. package/src/i18n/zh-tw.ts +4 -1
  133. package/src/layout-marketplace/gallery.tsx +1 -1
  134. package/src/market-data/market/freshness.ts +3 -2
  135. package/src/market-data/market/session-close-note.ts +3 -2
  136. package/src/market-data/quotes/contributions.ts +2 -0
  137. package/src/market-data/quotes/metadata.ts +12 -0
  138. package/src/market-data/quotes/resolution.ts +3 -0
  139. package/src/notifications/app-notifier.ts +17 -1
  140. package/src/notifications/notification-log.ts +180 -0
  141. package/src/plugins/auto-update-node.ts +2 -2
  142. package/src/plugins/auto-update.ts +2 -2
  143. package/src/plugins/builtin/account-management/index.tsx +1 -0
  144. package/src/plugins/builtin/alerts/catalysts.ts +1 -1
  145. package/src/plugins/builtin/alerts/focus.ts +27 -0
  146. package/src/plugins/builtin/alerts/index.tsx +6 -2
  147. package/src/plugins/builtin/alerts/pane.tsx +19 -1
  148. package/src/plugins/builtin/analytics/index.tsx +4 -1
  149. package/src/plugins/builtin/analytics/risk-headless.ts +30 -15
  150. package/src/plugins/builtin/attention/headless.ts +1 -1
  151. package/src/plugins/builtin/awards/headless.ts +88 -18
  152. package/src/plugins/builtin/awards/model.ts +41 -1
  153. package/src/plugins/builtin/awards/pane.tsx +19 -12
  154. package/src/plugins/builtin/backtest/headless.ts +2 -2
  155. package/src/plugins/builtin/broker-manager/index.tsx +1 -0
  156. package/src/plugins/builtin/catalysts/headless.ts +1 -1
  157. package/src/plugins/builtin/cds/client.ts +11 -31
  158. package/src/plugins/builtin/cds/headless.ts +5 -2
  159. package/src/plugins/builtin/cds/model.ts +21 -1
  160. package/src/plugins/builtin/cds/pane.tsx +6 -4
  161. package/src/plugins/builtin/central-bank-rates/client.ts +4 -0
  162. package/src/plugins/builtin/central-bank-rates/headless.ts +46 -16
  163. package/src/plugins/builtin/central-bank-rates/index.tsx +1 -1
  164. package/src/plugins/builtin/central-bank-rates/model.ts +99 -0
  165. package/src/plugins/builtin/central-bank-rates/pane.tsx +1 -1
  166. package/src/plugins/builtin/central-bank-rates/series.ts +19 -25
  167. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +1 -0
  168. package/src/plugins/builtin/chart-composer/headless-schema.ts +1 -1
  169. package/src/plugins/builtin/chart-composer/headless.ts +65 -5
  170. package/src/plugins/builtin/chart-composer/index.tsx +6 -1
  171. package/src/plugins/builtin/chart-composer/pane.tsx +81 -38
  172. package/src/plugins/builtin/chat/content/composer-runtime.ts +6 -1
  173. package/src/plugins/builtin/chat/content/composer.tsx +5 -1
  174. package/src/plugins/builtin/chat/content/footer.tsx +12 -0
  175. package/src/plugins/builtin/chat/content/index.tsx +89 -5
  176. package/src/plugins/builtin/chat/content/new-messages.tsx +89 -0
  177. package/src/plugins/builtin/chat/content/row-activity.ts +132 -0
  178. package/src/plugins/builtin/chat/content/scroll.ts +127 -27
  179. package/src/plugins/builtin/chat/content/shortcuts.ts +2 -2
  180. package/src/plugins/builtin/chat/content/transcript.tsx +145 -78
  181. package/src/plugins/builtin/chat/content/types.ts +1 -0
  182. package/src/plugins/builtin/chat/controller/fetch.ts +8 -2
  183. package/src/plugins/builtin/chat/controller/index.ts +121 -1
  184. package/src/plugins/builtin/chat/controller/message-loading.ts +3 -0
  185. package/src/plugins/builtin/chat/controller/messages.ts +7 -2
  186. package/src/plugins/builtin/chat/controller/realtime.ts +10 -1
  187. package/src/plugins/builtin/chat/controller/send.ts +61 -1
  188. package/src/plugins/builtin/chat/controller/state.ts +8 -0
  189. package/src/plugins/builtin/chat/ghost-user.ts +20 -0
  190. package/src/plugins/builtin/chat/index.tsx +23 -5
  191. package/src/plugins/builtin/chat/layout.ts +78 -5
  192. package/src/plugins/builtin/chat/message/ai-badge.tsx +18 -0
  193. package/src/plugins/builtin/chat/message/desktop.tsx +55 -6
  194. package/src/plugins/builtin/chat/message/header.tsx +16 -4
  195. package/src/plugins/builtin/chat/message/profile-popover.tsx +5 -1
  196. package/src/plugins/builtin/chat/message/reactions.tsx +210 -0
  197. package/src/plugins/builtin/chat/message/render-state.ts +18 -2
  198. package/src/plugins/builtin/chat/message/terminal.tsx +43 -4
  199. package/src/plugins/builtin/chat/message/types.ts +12 -0
  200. package/src/plugins/builtin/chat/reactions.ts +197 -0
  201. package/src/plugins/builtin/chat/share/flow.tsx +87 -0
  202. package/src/plugins/builtin/chat/share/targets.ts +27 -0
  203. package/src/plugins/builtin/chat/status-widget.tsx +6 -3
  204. package/src/plugins/builtin/chat/unread-inbox-pane.tsx +148 -27
  205. package/src/plugins/builtin/chat/unread-inbox.ts +22 -0
  206. package/src/plugins/builtin/cloud/askg/attached-pane.tsx +69 -0
  207. package/src/plugins/builtin/cloud/askg/pane-attachment.ts +94 -0
  208. package/src/plugins/builtin/cloud/askg/pane.tsx +141 -12
  209. package/src/plugins/builtin/cloud/askg/pending-question.ts +11 -0
  210. package/src/plugins/builtin/cloud/plugin.tsx +19 -2
  211. package/src/plugins/builtin/cloud/team/model.ts +5 -0
  212. package/src/plugins/builtin/cloud/team/module.tsx +1 -0
  213. package/src/plugins/builtin/cloud/team/store.ts +8 -3
  214. package/src/plugins/builtin/cloud/thesis/module.tsx +1 -0
  215. package/src/plugins/builtin/company-attention/headless.ts +2 -2
  216. package/src/plugins/builtin/company-kpis/headless.ts +97 -10
  217. package/src/plugins/builtin/company-kpis/model.ts +24 -2
  218. package/src/plugins/builtin/company-kpis/pane.tsx +13 -14
  219. package/src/plugins/builtin/connections/index.ts +1 -0
  220. package/src/plugins/builtin/cot/headless.ts +1 -1
  221. package/src/plugins/builtin/cpi/headless.ts +3 -3
  222. package/src/plugins/builtin/credit-boards/cdx-pane.tsx +10 -1
  223. package/src/plugins/builtin/credit-boards/client.ts +6 -2
  224. package/src/plugins/builtin/credit-boards/headless.ts +108 -31
  225. package/src/plugins/builtin/credit-boards/model.ts +11 -1
  226. package/src/plugins/builtin/credit-conditions/client.ts +12 -9
  227. package/src/plugins/builtin/credit-conditions/headless.ts +13 -2
  228. package/src/plugins/builtin/credit-conditions/index.tsx +16 -9
  229. package/src/plugins/builtin/credit-conditions/model.ts +19 -11
  230. package/src/plugins/builtin/credit-conditions/series.ts +8 -18
  231. package/src/plugins/builtin/credit-documents/headless.ts +2 -2
  232. package/src/plugins/builtin/debt-maturities/headless.ts +17 -11
  233. package/src/plugins/builtin/dividend-yield/client.ts +3 -0
  234. package/src/plugins/builtin/dividend-yield/headless.ts +5 -2
  235. package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
  236. package/src/plugins/builtin/dividend-yield/pane.tsx +3 -1
  237. package/src/plugins/builtin/dividend-yield/types.ts +2 -0
  238. package/src/plugins/builtin/doe/headless.ts +12 -8
  239. package/src/plugins/builtin/earnings/index.tsx +9 -0
  240. package/src/plugins/builtin/earnings-calls/headless.ts +28 -2
  241. package/src/plugins/builtin/earnings-calls/index.tsx +1 -1
  242. package/src/plugins/builtin/earnings-ripple/index.tsx +2 -0
  243. package/src/plugins/builtin/econ/fred-catalog.ts +9 -0
  244. package/src/plugins/builtin/equity-screener/headless.ts +3 -3
  245. package/src/plugins/builtin/estimate-revisions/headless.ts +3 -3
  246. package/src/plugins/builtin/exposure/drivers.ts +13 -0
  247. package/src/plugins/builtin/exposure/headless.ts +205 -13
  248. package/src/plugins/builtin/exposure/index.tsx +1 -0
  249. package/src/plugins/builtin/exposure/model.ts +23 -3
  250. package/src/plugins/builtin/exposure/pane.tsx +11 -11
  251. package/src/plugins/builtin/fear-greed/index.tsx +14 -10
  252. package/src/plugins/builtin/futures-curve/headless.ts +1 -1
  253. package/src/plugins/builtin/futures-curve/index.tsx +1 -1
  254. package/src/plugins/builtin/fx-matrix/client.ts +63 -0
  255. package/src/plugins/builtin/fx-matrix/export.ts +2 -1
  256. package/src/plugins/builtin/fx-matrix/headless.ts +154 -0
  257. package/src/plugins/builtin/fx-matrix/index.tsx +3 -3
  258. package/src/plugins/builtin/gpu/headless.ts +4 -4
  259. package/src/plugins/builtin/help/function-index.ts +2 -0
  260. package/src/plugins/builtin/help/index.tsx +14 -1
  261. package/src/plugins/builtin/ipo-calendar/headless.ts +1 -1
  262. package/src/plugins/builtin/iv-history/client.ts +6 -2
  263. package/src/plugins/builtin/iv-history/format.ts +9 -0
  264. package/src/plugins/builtin/iv-history/headless.ts +50 -18
  265. package/src/plugins/builtin/iv-history/model.ts +35 -4
  266. package/src/plugins/builtin/jobs/headless.ts +6 -8
  267. package/src/plugins/builtin/kelly-sizer/index.tsx +2 -0
  268. package/src/plugins/builtin/market-heatmap/headless.ts +20 -5
  269. package/src/plugins/builtin/market-heatmap/index.tsx +6 -0
  270. package/src/plugins/builtin/members/headless.ts +1 -1
  271. package/src/plugins/builtin/members/pane.tsx +3 -2
  272. package/src/plugins/builtin/mna/distress/headless.ts +4 -4
  273. package/src/plugins/builtin/mna/headless.ts +3 -3
  274. package/src/plugins/builtin/money-markets/headless.ts +5 -4
  275. package/src/plugins/builtin/news/index.tsx +0 -2
  276. package/src/plugins/builtin/news/wire/news/detail-view.tsx +53 -104
  277. package/src/plugins/builtin/news/wire/news/footer.ts +2 -25
  278. package/src/plugins/builtin/news/wire/news/preset-pane.tsx +0 -2
  279. package/src/plugins/builtin/notes/index.tsx +1 -0
  280. package/src/plugins/builtin/options/index.tsx +3 -0
  281. package/src/plugins/builtin/options-positioning/headless.ts +3 -3
  282. package/src/plugins/builtin/perps/client.ts +50 -10
  283. package/src/plugins/builtin/perps/equity-row.tsx +29 -16
  284. package/src/plugins/builtin/perps/headless.ts +2 -2
  285. package/src/plugins/builtin/perps/index.tsx +5 -3
  286. package/src/plugins/builtin/perps/list-perpetuals.ts +118 -0
  287. package/src/plugins/builtin/perps/open-market.ts +15 -0
  288. package/src/plugins/builtin/plugin-marketplace/index.tsx +1 -1
  289. package/src/plugins/builtin/plugin-marketplace/pane.tsx +6 -6
  290. package/src/plugins/builtin/portfolio-list/allocation.ts +5 -4
  291. package/src/plugins/builtin/portfolio-list/cell-version.ts +8 -1
  292. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +23 -135
  293. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +59 -15
  294. package/src/plugins/builtin/portfolio-list/cli/render.ts +248 -51
  295. package/src/plugins/builtin/portfolio-list/cli/shared.ts +5 -12
  296. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +3 -2
  297. package/src/plugins/builtin/portfolio-list/column-values.ts +103 -25
  298. package/src/plugins/builtin/portfolio-list/headless.ts +51 -15
  299. package/src/plugins/builtin/portfolio-list/index.tsx +5 -1
  300. package/src/plugins/builtin/portfolio-list/mutations.ts +2 -9
  301. package/src/plugins/builtin/portfolio-list/pane/data.ts +5 -1
  302. package/src/plugins/builtin/portfolio-list/pane/index.tsx +46 -8
  303. package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +16 -10
  304. package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +21 -1
  305. package/src/plugins/builtin/portfolio-list/settings.ts +17 -0
  306. package/src/plugins/builtin/portfolio-list/summary/index.tsx +12 -0
  307. package/src/plugins/builtin/portfolio-list/summary/totals.ts +8 -3
  308. package/src/plugins/builtin/portfolio-list/table.tsx +30 -6
  309. package/src/plugins/builtin/power/evidence.ts +57 -8
  310. package/src/plugins/builtin/power/headless.ts +6 -2
  311. package/src/plugins/builtin/power/index.tsx +24 -2
  312. package/src/plugins/builtin/power/model.ts +2 -2
  313. package/src/plugins/builtin/power/pane.tsx +5 -0
  314. package/src/plugins/builtin/power/prices-client.ts +139 -0
  315. package/src/plugins/builtin/power/prices-headless.ts +137 -0
  316. package/src/plugins/builtin/power/prices-model.ts +103 -0
  317. package/src/plugins/builtin/power/prices.tsx +179 -0
  318. package/src/plugins/builtin/rate-path/headless.ts +38 -18
  319. package/src/plugins/builtin/relative-rotation/headless.ts +3 -3
  320. package/src/plugins/builtin/research/index.tsx +2 -0
  321. package/src/plugins/builtin/research-search/article.ts +65 -0
  322. package/src/plugins/builtin/research-search/document-view.tsx +33 -215
  323. package/src/plugins/builtin/research-search/model.ts +0 -9
  324. package/src/plugins/builtin/research-search/pane.tsx +41 -30
  325. package/src/plugins/builtin/research-search/snippet.ts +0 -29
  326. package/src/plugins/builtin/revenue-breakdown/headless.ts +18 -6
  327. package/src/plugins/builtin/sec/headless.ts +25 -3
  328. package/src/plugins/builtin/sec/index.tsx +2 -1
  329. package/src/plugins/builtin/series-inventory.ts +2 -0
  330. package/src/plugins/builtin/shared/cloud-denied.ts +15 -0
  331. package/src/plugins/builtin/shared/free-preview.ts +47 -0
  332. package/src/plugins/builtin/shared/report-freshness.ts +3 -1
  333. package/src/plugins/builtin/shared/volatility/options.ts +4 -1
  334. package/src/plugins/builtin/short-interest/watch-headless.ts +2 -2
  335. package/src/plugins/builtin/short-volume/headless.ts +1 -1
  336. package/src/plugins/builtin/social-mentions/headless.ts +1 -1
  337. package/src/plugins/builtin/supply-chain/headless.ts +43 -11
  338. package/src/plugins/builtin/supply-chain/model.ts +13 -0
  339. package/src/plugins/builtin/supply-chain/pane.tsx +5 -5
  340. package/src/plugins/builtin/themes/headless.ts +74 -10
  341. package/src/plugins/builtin/themes/model.ts +71 -4
  342. package/src/plugins/builtin/themes/pane.tsx +22 -5
  343. package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +114 -0
  344. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +57 -2
  345. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +19 -55
  346. package/src/plugins/builtin/ticker-detail/headless-schema.ts +30 -0
  347. package/src/plugins/builtin/ticker-detail/headless.ts +86 -0
  348. package/src/plugins/builtin/ticker-detail/index.tsx +23 -11
  349. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +1 -1
  350. package/src/plugins/builtin/time-sales/headless.ts +1 -1
  351. package/src/plugins/builtin/time-sales/index.tsx +2 -1
  352. package/src/plugins/builtin/vol-surface/evidence.ts +7 -1
  353. package/src/plugins/builtin/vol-surface/headless.ts +50 -17
  354. package/src/plugins/builtin/vol-surface/heat-grid.tsx +113 -0
  355. package/src/plugins/builtin/vol-surface/model.ts +39 -6
  356. package/src/plugins/builtin/vol-surface/pane.tsx +14 -13
  357. package/src/plugins/builtin/vol-surface/stored.ts +63 -3
  358. package/src/plugins/builtin/vol-surface/surface.tsx +30 -2
  359. package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +6 -5
  360. package/src/plugins/builtin/world-venue-map/basemap.ts +6 -3
  361. package/src/plugins/builtin/world-venue-map/geo-draw.tsx +2 -1
  362. package/src/plugins/builtin/world-venue-map/geo-svg.tsx +6 -6
  363. package/src/plugins/builtin/world-venue-map/layered-pane.tsx +16 -9
  364. package/src/plugins/builtin/world-venue-map/map.tsx +144 -13
  365. package/src/plugins/builtin/world-venue-map/model.ts +56 -19
  366. package/src/plugins/builtin/world-venue-map/pane.tsx +5 -2
  367. package/src/plugins/builtin/yield-curve/index.tsx +1 -1
  368. package/src/plugins/installer.ts +2 -2
  369. package/src/plugins/loader.ts +15 -0
  370. package/src/plugins/manager-node.ts +1 -1
  371. package/src/plugins/{builtin/plugin-marketplace → marketplace}/feed.ts +2 -2
  372. package/src/plugins/{builtin/plugin-marketplace → marketplace}/model.ts +6 -6
  373. package/src/plugins/{builtin/plugin-marketplace → marketplace}/store.ts +1 -1
  374. package/src/plugins/registry/host-actions.ts +11 -0
  375. package/src/portfolio/collection-name.ts +31 -0
  376. package/src/portfolio/valuation-basis.ts +79 -0
  377. package/src/public/time-series.ts +1 -1
  378. package/src/react/input.ts +33 -1
  379. package/src/react/key-repeat.ts +86 -0
  380. package/src/remote/controller.ts +21 -1
  381. package/src/remote/schema.ts +3 -2
  382. package/src/renderers/browser/main.tsx +1 -1
  383. package/src/renderers/browser/research-entry.ts +4 -2
  384. package/src/renderers/dom/data-table/row.tsx +3 -0
  385. package/src/renderers/dom/desktop/icons.tsx +9 -0
  386. package/src/renderers/dom/host/block-glyph-canvas.tsx +6 -3
  387. package/src/renderers/dom/host/box.tsx +7 -2
  388. package/src/renderers/dom/host/chart-surface.tsx +27 -0
  389. package/src/renderers/dom/host/scroll-box.tsx +32 -0
  390. package/src/renderers/dom/host/size-observer.ts +24 -9
  391. package/src/renderers/dom/host/sticky-scroll.ts +128 -0
  392. package/src/renderers/dom/host/style.ts +1 -1
  393. package/src/renderers/dom/host/surface-3d.tsx +13 -6
  394. package/src/renderers/dom/host/surface-fit.ts +406 -0
  395. package/src/renderers/dom/input-host.tsx +1 -0
  396. package/src/renderers/dom/styles.css +48 -12
  397. package/src/renderers/electrobun/bun/application-menu/click.ts +18 -0
  398. package/src/renderers/electrobun/bun/index.ts +3 -2
  399. package/src/renderers/electrobun/shared/protocol.ts +1 -1
  400. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +12 -0
  401. package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +59 -24
  402. package/src/renderers/electrobun/view/main.tsx +3 -3
  403. package/src/renderers/electrobun/view/remote/asset-data-client.ts +2 -0
  404. package/src/renderers/opentui/chart-surface.tsx +1 -0
  405. package/src/renderers/opentui/frame-capture.ts +33 -0
  406. package/src/renderers/opentui/host.tsx +10 -13
  407. package/src/renderers/opentui/pane-image/glyphs-license.txt +107 -0
  408. package/src/renderers/opentui/pane-image/glyphs.json +1 -0
  409. package/src/renderers/opentui/pane-image/index.ts +107 -0
  410. package/src/renderers/opentui/pane-image/raster.ts +428 -0
  411. package/src/renderers/opentui/start.tsx +3 -3
  412. package/src/renderers/opentui/test-utils.tsx +3 -0
  413. package/src/renderers/opentui/ui-host.tsx +29 -1
  414. package/src/series/resolve.ts +3 -2
  415. package/src/series/types.ts +8 -0
  416. package/src/series/validate.ts +1 -1
  417. package/src/shares/chat.ts +34 -0
  418. package/src/shares/dialog.tsx +295 -0
  419. package/src/shares/flow.tsx +56 -0
  420. package/src/shares/live.ts +14 -22
  421. package/src/shares/pane-image.ts +152 -0
  422. package/src/shares/personal-pane.ts +64 -0
  423. package/src/shares/portable-layout.ts +4 -2
  424. package/src/shares/prepare.ts +20 -0
  425. package/src/sources/gloomberb-cloud/index.ts +102 -3
  426. package/src/sources/gloomberb-cloud/normalizers.ts +2 -0
  427. package/src/sources/gloomberb-cloud/perpetuals.ts +249 -0
  428. package/src/sources/history-retention.ts +11 -0
  429. package/src/sources/listing-target.ts +4 -0
  430. package/src/sources/provider-router/index.ts +14 -0
  431. package/src/state/hooks/inline-tickers.ts +49 -11
  432. package/src/test-support/shell-pane-keys.tsx +1 -0
  433. package/src/theme/theme-context.tsx +15 -1
  434. package/src/tickers/instrument-kind.ts +9 -1
  435. package/src/tickers/listing-name.ts +34 -0
  436. package/src/tickers/listing-venues.ts +132 -0
  437. package/src/tickers/open-target.ts +11 -3
  438. package/src/tickers/perpetual-listing.ts +151 -0
  439. package/src/tickers/prediction-listing.ts +26 -0
  440. package/src/tickers/search/index.ts +27 -4
  441. package/src/tickers/search/ranking.ts +66 -4
  442. package/src/tickers/ticker-changes.ts +213 -0
  443. package/src/time-series/economic.ts +2 -6
  444. package/src/time-series/ice-credit.ts +39 -0
  445. package/src/time-series/resolve.ts +116 -13
  446. package/src/time-series/studies.ts +1 -0
  447. package/src/time-series/types.ts +8 -0
  448. package/src/types/config.ts +4 -2
  449. package/src/types/data-provider.ts +6 -0
  450. package/src/types/financials.ts +10 -0
  451. package/src/types/headless.ts +52 -0
  452. package/src/types/instrument.ts +4 -0
  453. package/src/types/plugin.ts +33 -2
  454. package/src/types/ticker-changes.ts +26 -0
  455. package/src/ui/context-menu.tsx +13 -1
  456. package/src/ui/host.tsx +43 -7
  457. package/src/ui/live-resize.ts +10 -0
  458. package/src/ui/live-stretch.ts +51 -19
  459. package/src/ui/sticky-scroll.ts +7 -0
  460. package/src/utils/central-banks.ts +76 -0
  461. package/src/utils/cli-output.ts +126 -16
  462. package/src/utils/currency-units.ts +11 -0
  463. package/src/utils/datetime-format.ts +27 -6
  464. package/src/utils/dom-screenshot.ts +3 -1
  465. package/src/utils/double-escape-close.ts +15 -1
  466. package/src/utils/exchanges.ts +36 -0
  467. package/src/utils/format.ts +19 -2
  468. package/src/utils/forward-dividend.ts +14 -0
  469. package/src/utils/fx-status.ts +6 -1
  470. package/src/utils/inline-content-tokenizer.ts +22 -3
  471. package/src/utils/market-capitalization.ts +8 -0
  472. package/src/utils/one-shot.ts +73 -0
  473. package/src/utils/options.ts +37 -8
  474. package/src/utils/utc-time.ts +12 -0
  475. package/src/ui/pane-fill.ts +0 -11
  476. /package/src/plugins/{builtin/plugin-marketplace → marketplace}/activation.ts +0 -0
  477. /package/src/plugins/{builtin/plugin-marketplace → marketplace}/ids.ts +0 -0
  478. /package/src/plugins/{builtin/plugin-marketplace → marketplace}/packs.ts +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gloomberb",
3
- "version": "0.16.5",
3
+ "version": "0.16.6",
4
4
  "packageManager": "bun@1.3.11",
5
5
  "description": "Market research and portfolio tracker for the terminal",
6
6
  "module": "src/public/index.ts",
@@ -68,6 +68,7 @@
68
68
  "plugins:registry:check": "bun run scripts/check-registry-plugins.ts",
69
69
  "web:proxy-hosts": "bun run scripts/generate-web-proxy-hosts.ts",
70
70
  "map:data": "bun run scripts/generate-world-map-data.ts",
71
+ "glyphs:terminal": "bun run scripts/generate-terminal-glyphs.ts",
71
72
  "macro-releases:update": "bun run scripts/update-macro-releases.ts",
72
73
  "web:proxy-hosts:check": "bun run scripts/generate-web-proxy-hosts.ts --check",
73
74
  "typecheck": "bun run typecheck:opentui && bun run typecheck:dom && bun run typecheck:cloudflare && bun run typecheck:scripts && bun run typecheck:plugin-tests",
@@ -29,7 +29,12 @@ export interface CentralBankRow {
29
29
  /** When the bank's own site last showed the same level as a lagging BIS observation. */
30
30
  confirmedAt?: string | null
31
31
  confirmationSourceUrl?: string | null
32
- nextMeeting: { date: string; sourceUrl: string; verifiedAt: string } | null
32
+ /** The bank's next decision from its own published calendar, or China's next 1-year LPR fixing (`kind`). */
33
+ nextMeeting: { date: string; sourceUrl: string; verifiedAt: string; kind?: "decision" | "fixing" } | null
34
+ /** Why `nextMeeting` is null; older servers leave it out, and a null meeting then reads as not published. */
35
+ nextMeetingStatus?: "scheduled" | "not-published" | "not-verified" | "no-policy-rate"
36
+ /** The BIS series definition and breaks, also in `notes`: history a citation of the latest rate leaves out. */
37
+ seriesNotes?: string[]
33
38
  }
34
39
 
35
40
  export interface CentralBankRatesPayload {
@@ -4,6 +4,7 @@ import {
4
4
  normalizeChatDiscordLink,
5
5
  normalizeChatMessage,
6
6
  normalizeChatMessages,
7
+ normalizeChatReactions,
7
8
  normalizeChatState,
8
9
  } from "./normalizers";
9
10
  import { CHAT_ATTACHMENTS_FEATURE, type CloudApiSocket } from "./socket";
@@ -14,6 +15,7 @@ import type {
14
15
  ChatDiscordLink,
15
16
  ChatMessage,
16
17
  ChatNotification,
18
+ ChatReactionsUpdate,
17
19
  ChatStateResponse,
18
20
  } from "./types";
19
21
  import type { CloudApiRequest } from "./request";
@@ -258,6 +260,30 @@ export class CloudChatApi {
258
260
  return normalizeChatMessage(message);
259
261
  }
260
262
 
263
+ /**
264
+ * Sets your reaction with one emoji on a message; setting what is already
265
+ * there changes nothing. Answers the message's reactions as they stand.
266
+ */
267
+ async setReaction(
268
+ channelId: string,
269
+ messageId: string,
270
+ emoji: string,
271
+ reacted: boolean,
272
+ ): Promise<ChatReactionsUpdate> {
273
+ const answer = await this.request<{ reactions?: unknown }>(
274
+ `/chat/channels/${channelId}/messages/${messageId}/reactions`,
275
+ {
276
+ method: "PUT",
277
+ body: JSON.stringify({ emoji, reacted }),
278
+ },
279
+ );
280
+ return { channelId, messageId, reactions: normalizeChatReactions(answer?.reactions) };
281
+ }
282
+
283
+ subscribeReactions(listener: (update: ChatReactionsUpdate) => void): () => void {
284
+ return this.options.socket.subscribeChatReactions(listener);
285
+ }
286
+
261
287
  /** Whether this account is tied to a Discord person. Throws a 404 or 501 `ApiRequestError` on a server without Discord sync. */
262
288
  async getDiscordLink(): Promise<ChatDiscordLink> {
263
289
  return normalizeChatDiscordLink(await this.options.request<unknown>("/chat/discord/link"));
@@ -27,6 +27,8 @@ export interface CdxBoardIndex {
27
27
  /** In the quote's unit, on one contract across a roll. */
28
28
  change1D: number | null;
29
29
  change1W: number | null;
30
+ /** Absent from a server that predates it. */
31
+ change1M?: number | null;
30
32
  /** Oldest first, the on-the-run 5Y contract each day. */
31
33
  points: CreditBoardPoint[];
32
34
  }
@@ -5,7 +5,8 @@ import type { CatalystResponse, CatalystDetail, CatalystFilters, CatalystStatus,
5
5
  import type { KpisPayload, GuidancePayload, KpiQueryOptions } from "./company-kpis";
6
6
  import { companyDisclosurePath } from "./company-kpis";
7
7
  import type { PowerBoard, PowerDetail, PowerFilter, PowerHistory } from "./power";
8
- import type { PerpBoardPayload, PerpHistoryPayload, PerpRankingsPayload, PerpBoardQuery, PerpHistoryQuery, PerpMarketPayload } from "./perps";
8
+ import type { PerpBoardPayload, PerpEquitiesPayload, PerpEquityListing, PerpHistoryPayload, PerpRankingsPayload, PerpBoardQuery, PerpHistoryQuery,
9
+ PerpMarketPayload } from "./perps";
9
10
  import type { ExposureRequest, ExposurePayload, ExposureScenario } from "./exposure";
10
11
  import type { SupplyChainPayload, SupplyOptions } from "./supply-chain";
11
12
  import { supplyGraphQuery, type GraphOptions, type GraphPayload } from "./supply-chain-graph";
@@ -23,6 +24,7 @@ import {
23
24
  type InsolvencyNoticesParams,
24
25
  } from "./distress";
25
26
  import type { IpoCalendarParams, IpoCalendarPayload } from "./ipo";
27
+ import type { TickerChanges } from "../types/ticker-changes";
26
28
  import type { CryptoMarketsPayload } from "./crypto-markets";
27
29
  import type { CentralBankRatesPayload } from "./central-bank-rates";
28
30
  import type { EstimateRevisionsPayload } from "./estimate-revisions";
@@ -35,6 +37,7 @@ import type { SocialMentionDayPosts, SocialMentionsPayload, SocialMentionsRange
35
37
  import type { FuturesContractTermsPayload, FuturesCurveAsOfPayload, FuturesCurvePayload } from "./futures-curve";
36
38
  import type { CotBoardPayload, CotContractPayload, CotFamily, CotClass } from "./cot";
37
39
  import type { DoeBoardPayload } from "./doe";
40
+ import type { CarbonBoard, CarbonHistory, EuropePowerBoard, EuropePowerHistory } from "./europe-energy";
38
41
  import type { GpuBoardPayload, GpuEventsPayload, GpuHistoryPayload, GpuHistoryQuery } from "./gpu";
39
42
  import type { CpiBoardPayload } from "./cpi";
40
43
  import type { TapeSnapshot } from "./tape";
@@ -110,6 +113,7 @@ import type {
110
113
  CloudAnalystResearchPayload,
111
114
  CloudShortInterestPayload,
112
115
  CloudCdsHistoryResponse,
116
+ CloudCdsLevelsResponse,
113
117
  CloudCdsResponse,
114
118
  CloudCongressHousePayload,
115
119
  CloudEarningsCallListPayload,
@@ -373,6 +377,17 @@ export class CloudDataApi {
373
377
  );
374
378
  }
375
379
 
380
+ /** Where the issuer that held a US symbol trades now, or what the symbol's holder was called before. */
381
+ async getCloudTickerChanges(
382
+ symbol: string,
383
+ options: { signal?: AbortSignal } = {},
384
+ ): Promise<CloudMarketResponse<TickerChanges>> {
385
+ return this.request<CloudMarketResponse<TickerChanges>>(
386
+ `/market/ticker-changes?${new URLSearchParams({ symbol: symbol.trim().toUpperCase() })}`,
387
+ options.signal ? { signal: options.signal } : undefined,
388
+ );
389
+ }
390
+
376
391
  async getCloudHistory(
377
392
  symbol: string,
378
393
  exchange: string,
@@ -518,6 +533,9 @@ export class CloudDataApi {
518
533
  const query = exchange === undefined ? "" : `?${new URLSearchParams({ identity: "listing", exchange })}`;
519
534
  return this.request(`/cloud/perps/equity/${encodeURIComponent(symbol)}${query}`);
520
535
  }
536
+ async getCloudPerpsEquities(listings: readonly PerpEquityListing[]): Promise<PerpEquitiesPayload> {
537
+ return this.request("/cloud/perps/equities", { method: "POST", body: JSON.stringify({ listings }) });
538
+ }
521
539
  async getCloudPerpsMarket(marketId: string): Promise<PerpMarketPayload> { return this.request(`/cloud/perps/market?${new URLSearchParams({ marketId })}`); }
522
540
 
523
541
  async analyzeCloudExposure(request: ExposureRequest): Promise<ExposurePayload> {
@@ -577,6 +595,31 @@ export class CloudDataApi {
577
595
  return this.request<PowerDetail>(`/cloud/power/projects/${encodeURIComponent(id)}?${params}`, { signal });
578
596
  }
579
597
 
598
+ /** European day-ahead power prices by country, latest day first per market. */
599
+ async getCloudEuropePower(): Promise<EuropePowerBoard> {
600
+ return this.request<EuropePowerBoard>("/cloud/europe-energy/power", { signal: AbortSignal.timeout(30_000) });
601
+ }
602
+
603
+ /** One market's daily day-ahead prices from `from` (all of them without one), oldest first. */
604
+ async getCloudEuropePowerHistory(code: string, from?: string | null): Promise<EuropePowerHistory> {
605
+ const query = from ? `?${new URLSearchParams({ from })}` : "";
606
+ return this.request<EuropePowerHistory>(
607
+ `/cloud/europe-energy/power/${encodeURIComponent(code)}/history${query}`,
608
+ { signal: AbortSignal.timeout(30_000) },
609
+ );
610
+ }
611
+
612
+ /** The EU carbon allowance (EUA) auction price as of its latest auction day, with the latest auctions. */
613
+ async getCloudEuropeCarbon(): Promise<CarbonBoard> {
614
+ return this.request<CarbonBoard>("/cloud/europe-energy/carbon", { signal: AbortSignal.timeout(30_000) });
615
+ }
616
+
617
+ /** The daily EUA auction price from `from` (every auction day since 2020 without one), oldest first. */
618
+ async getCloudEuropeCarbonHistory(from?: string | null): Promise<CarbonHistory> {
619
+ const query = from ? `?${new URLSearchParams({ from })}` : "";
620
+ return this.request<CarbonHistory>(`/cloud/europe-energy/carbon/history${query}`, { signal: AbortSignal.timeout(30_000) });
621
+ }
622
+
580
623
  async getCloudGpuBoard(): Promise<GpuBoardPayload> {
581
624
  return this.request<GpuBoardPayload>("/cloud/gpu/board");
582
625
  }
@@ -735,6 +778,11 @@ export class CloudDataApi {
735
778
  return this.request<CloudCdsHistoryResponse>(cloudCdsHistoryPath(params), { signal: AbortSignal.timeout(30_000) });
736
779
  }
737
780
 
781
+ /** Every listed issuer's latest 5Y level in one request. */
782
+ async getCloudCdsLevels(): Promise<CloudCdsLevelsResponse> {
783
+ return this.request<CloudCdsLevelsResponse>("/cloud/credit/cds/levels", { signal: AbortSignal.timeout(30_000) });
784
+ }
785
+
738
786
  async getCloudCdxBoard(params: CloudCreditBoardParams = {}): Promise<CdxBoardPayload> {
739
787
  return this.request<CdxBoardPayload>(cloudCreditBoardPath("cdx", params), { signal: AbortSignal.timeout(30_000) });
740
788
  }
@@ -0,0 +1,106 @@
1
+ /** Who publishes the prices; their licence asks for this attribution. */
2
+ interface EuropeEnergySource {
3
+ name: string;
4
+ licence: string;
5
+ url: string;
6
+ }
7
+
8
+ /** One market's latest day-ahead price and its context, all as of `date`. */
9
+ export interface PowerPriceRow {
10
+ /** ISO 3166 alpha-2: DE, FR, GB. */
11
+ code: string;
12
+ name: string;
13
+ /** Latest delivery day with a price. */
14
+ date: string | null;
15
+ /** EUR/MWh, the day's load-weighted average of the day-ahead auction. */
16
+ price: number | null;
17
+ previousDate: string | null;
18
+ change: number | null;
19
+ average7: number | null;
20
+ average30: number | null;
21
+ yearAgoDate: string | null;
22
+ yearAgo: number | null;
23
+ low52w: number | null;
24
+ high52w: number | null;
25
+ /** Weekly means over the year to `date`, oldest first. */
26
+ trail: Array<{ date: string; value: number }>;
27
+ }
28
+
29
+ export interface EuropePowerBoard {
30
+ generatedAt: string;
31
+ status: "available" | "unavailable";
32
+ market: "day-ahead";
33
+ unit: "EUR/MWh";
34
+ source: EuropeEnergySource;
35
+ /** When the published file was last read, and when its publisher last changed it. */
36
+ checkedAt: string | null;
37
+ publishedAt: string | null;
38
+ gaps: string[];
39
+ rows: PowerPriceRow[];
40
+ }
41
+
42
+ export interface EuropePowerHistory {
43
+ code: string;
44
+ name: string;
45
+ market: "day-ahead";
46
+ unit: "EUR/MWh";
47
+ source: EuropeEnergySource;
48
+ /** Oldest first. */
49
+ points: Array<{ date: string; value: number }>;
50
+ }
51
+
52
+ /** One EU ETS primary-market auction. Prices in EUR/tCO2, volumes in tCO2. */
53
+ interface CarbonAuction {
54
+ date: string;
55
+ auction: string;
56
+ contract: string;
57
+ /** successful, cancelled. */
58
+ status: string;
59
+ /** EU (common platform), DE, PL, XI (Northern Ireland). */
60
+ zone: string | null;
61
+ /** Null when the auction did not clear. */
62
+ price: number | null;
63
+ minBid: number | null;
64
+ maxBid: number | null;
65
+ meanBid: number | null;
66
+ medianBid: number | null;
67
+ volume: number;
68
+ coverRatio: number | null;
69
+ bidders: number | null;
70
+ successfulBidders: number | null;
71
+ /** An aviation allowance (EUAA) auction, which is not the EUA price. */
72
+ aviation: boolean;
73
+ }
74
+
75
+ /** The EUA price as of its latest auction day: the day's cleared auctions, volume-weighted. */
76
+ interface CarbonPriceRow extends Omit<PowerPriceRow, "code"> {
77
+ code: "EUA";
78
+ /** tCO2 auctioned that day, and in how many auctions. */
79
+ volume: number | null;
80
+ auctions: number | null;
81
+ }
82
+
83
+ export interface CarbonBoard {
84
+ generatedAt: string;
85
+ status: "available" | "unavailable";
86
+ /** The primary auction clearing price, not a futures settlement. */
87
+ market: "primary auction";
88
+ unit: "EUR/tCO2";
89
+ source: { name: string; url: string };
90
+ checkedAt: string | null;
91
+ publishedAt: string | null;
92
+ gaps: string[];
93
+ row: CarbonPriceRow;
94
+ /** Newest first. */
95
+ auctions: CarbonAuction[];
96
+ }
97
+
98
+ export interface CarbonHistory {
99
+ code: "EUA";
100
+ name: string;
101
+ market: "primary auction";
102
+ unit: "EUR/tCO2";
103
+ source: { name: string; url: string };
104
+ /** Each auction day's price, oldest first. */
105
+ points: Array<{ date: string; value: number }>;
106
+ }
@@ -643,6 +643,8 @@ class GloomApiClient {
643
643
  chatAttachmentsSupported = this.chat.attachmentsSupported.bind(this.chat);
644
644
  subscribeChatAttachmentSupport = this.chat.subscribeAttachmentSupport.bind(this.chat);
645
645
  editMessage = this.chat.editMessage.bind(this.chat);
646
+ setChatReaction = this.chat.setReaction.bind(this.chat);
647
+ subscribeChatReactions = this.chat.subscribeReactions.bind(this.chat);
646
648
  connectChannel = this.chat.connectChannel.bind(this.chat);
647
649
  subscribeChatNotifications = this.chat.subscribeNotifications.bind(this.chat);
648
650
  subscribeChatPresence = this.chat.subscribePresence.bind(this.chat);
@@ -738,6 +740,7 @@ class GloomApiClient {
738
740
  getCloudShortInterest = this.data.getCloudShortInterest.bind(this.data);
739
741
  getCloudAnalystResearch = this.data.getCloudAnalystResearch.bind(this.data);
740
742
  getCloudCorporateActions = this.data.getCloudCorporateActions.bind(this.data);
743
+ getCloudTickerChanges = this.data.getCloudTickerChanges.bind(this.data);
741
744
  getCloudHistory = this.data.getCloudHistory.bind(this.data);
742
745
  getCloudExchangeRate = this.data.getCloudExchangeRate.bind(this.data);
743
746
  getCloudEconomicCalendar = this.data.getCloudEconomicCalendar.bind(this.data);
@@ -796,6 +799,7 @@ class GloomApiClient {
796
799
  getCloudPerpsRankings = this.data.getCloudPerpsRankings.bind(this.data);
797
800
  getCloudPerpsCompare = this.data.getCloudPerpsCompare.bind(this.data);
798
801
  getCloudPerpsEquity = this.data.getCloudPerpsEquity.bind(this.data);
802
+ getCloudPerpsEquities = this.data.getCloudPerpsEquities.bind(this.data);
799
803
  getCloudPerpsMarket = this.data.getCloudPerpsMarket.bind(this.data);
800
804
  analyzeCloudExposure = this.data.analyzeCloudExposure.bind(this.data);
801
805
  getCloudExposureScenarios = this.data.getCloudExposureScenarios.bind(this.data);
@@ -809,6 +813,10 @@ class GloomApiClient {
809
813
  getCloudPowerBoard = this.data.getCloudPowerBoard.bind(this.data);
810
814
  getCloudPowerHistory = this.data.getCloudPowerHistory.bind(this.data);
811
815
  getCloudPowerProject = this.data.getCloudPowerProject.bind(this.data);
816
+ getCloudEuropePower = this.data.getCloudEuropePower.bind(this.data);
817
+ getCloudEuropePowerHistory = this.data.getCloudEuropePowerHistory.bind(this.data);
818
+ getCloudEuropeCarbon = this.data.getCloudEuropeCarbon.bind(this.data);
819
+ getCloudEuropeCarbonHistory = this.data.getCloudEuropeCarbonHistory.bind(this.data);
812
820
  getCloudGpuBoard = this.data.getCloudGpuBoard.bind(this.data);
813
821
  getCloudGpuHistory = this.data.getCloudGpuHistory.bind(this.data);
814
822
  getCloudGpuEvents = this.data.getCloudGpuEvents.bind(this.data);
@@ -820,6 +828,7 @@ class GloomApiClient {
820
828
  getCloudWorldCurves = this.data.getCloudWorldCurves.bind(this.data);
821
829
  getCloudCds = this.data.getCloudCds.bind(this.data);
822
830
  getCloudCdsHistory = this.data.getCloudCdsHistory.bind(this.data);
831
+ getCloudCdsLevels = this.data.getCloudCdsLevels.bind(this.data);
823
832
  getCloudCdxBoard = this.data.getCloudCdxBoard.bind(this.data);
824
833
  getCloudSovrBoard = this.data.getCloudSovrBoard.bind(this.data);
825
834
  getCloudCongressHouse = this.data.getCloudCongressHouse.bind(this.data);
@@ -86,7 +86,10 @@ export interface MarketMoversPayload {
86
86
  export interface DividendSummary {
87
87
  trailingAnnualDividendRate: number | null;
88
88
  trailingAnnualDividendYield: number | null;
89
+ /** The indicated annual rate fundamentals serve: the latest regular distribution annualized. */
89
90
  forwardAnnualDividendRate: number | null;
91
+ /** The ex-date of the distribution that rate annualizes, YYYY-MM-DD. */
92
+ forwardRateAsOf?: string | null;
90
93
  payoutRatio: number | null;
91
94
  exDividendDate: number | null;
92
95
  dividendDate: number | null;
@@ -6,6 +6,8 @@ import type {
6
6
  ChatMessage,
7
7
  ChatMessageOrigin,
8
8
  ChatNotification,
9
+ ChatReaction,
10
+ ChatReactionUser,
9
11
  ChatStateResponse,
10
12
  CloudSavedSearch,
11
13
  CloudSearchHit,
@@ -98,6 +100,7 @@ export function normalizeChatMessage(message: ChatMessage): ChatMessage {
98
100
  : {}),
99
101
  };
100
102
  if ("attachments" in message) normalized.attachments = normalizeChatAttachments(message.attachments);
103
+ if ("reactions" in message) normalized.reactions = normalizeChatReactions(message.reactions);
101
104
  if (message.origin !== undefined && !CHAT_MESSAGE_ORIGINS.includes(message.origin)) delete normalized.origin;
102
105
  if (message.attachmentReview !== "pending" && message.attachmentReview !== "failed") {
103
106
  delete normalized.attachmentReview;
@@ -117,6 +120,35 @@ export function normalizeChatDiscordLink(value: unknown): ChatDiscordLink {
117
120
  };
118
121
  }
119
122
 
123
+ /** Reactions as the server sent them, dropping anything malformed. */
124
+ export function normalizeChatReactions(value: unknown): ChatReaction[] {
125
+ if (!Array.isArray(value)) return [];
126
+ const reactions: ChatReaction[] = [];
127
+ for (const entry of value) {
128
+ if (!entry || typeof entry !== "object") continue;
129
+ const raw = entry as Record<string, unknown>;
130
+ if (typeof raw.emoji !== "string" || !raw.emoji) continue;
131
+ const count = typeof raw.count === "number" && Number.isFinite(raw.count) ? Math.max(0, Math.floor(raw.count)) : 0;
132
+ if (count === 0) continue;
133
+ const users = Array.isArray(raw.users)
134
+ ? raw.users.flatMap((user): ChatReactionUser[] => {
135
+ if (!user || typeof user !== "object") return [];
136
+ const candidate = user as Record<string, unknown>;
137
+ if (typeof candidate.id !== "string") return [];
138
+ const accountType = candidate.accountType;
139
+ return [{
140
+ id: candidate.id,
141
+ username: typeof candidate.username === "string" ? candidate.username : null,
142
+ displayName: typeof candidate.displayName === "string" ? candidate.displayName : "User",
143
+ ...(accountType === "human" || accountType === "managed_llm" || accountType === "discord" ? { accountType } : {}),
144
+ }];
145
+ })
146
+ : [];
147
+ reactions.push({ emoji: raw.emoji, count, me: raw.me === true, users });
148
+ }
149
+ return reactions;
150
+ }
151
+
120
152
  export function normalizeChatMessages(messages: ChatMessage[]): ChatMessage[] {
121
153
  return messages.map((message) => normalizeChatMessage(message));
122
154
  }
@@ -147,6 +147,14 @@ export interface PerpBoardPayload {
147
147
  access: "pro" | "preview"; sources?: unknown[];
148
148
  }
149
149
  export interface PerpEquityListing { symbol: string; exchange: string }
150
+ /**
151
+ * The batch lookup a watchlist or portfolio makes: one entry per requested listing, in its order, with the contract
152
+ * the single equity lookup would list first, or none. `listing` is null when the server cannot read the listing.
153
+ */
154
+ export interface PerpEquitiesPayload {
155
+ status: string; asOf: string | null; access: "pro" | "preview"; locked: number;
156
+ results: { listing: PerpEquityListing | null; market: PerpBoardRow | null }[];
157
+ }
150
158
  export interface PerpHistoryPayload {
151
159
  status: string; marketId: string; rows: PerpHistoryPoint[]; funding: PerpFunding[]; candles: PerpCandle[];
152
160
  /** Absent from servers older than the long/short series: read as empty. */
@@ -408,8 +408,15 @@ export class CloudApiRequestTransport {
408
408
  // Crash reports, usage counts and command-search reports are background
409
409
  // traffic: a rate-limited, timed-out or missing one must not show up as a
410
410
  // Cloud outage in the connections pane. Nor must the map's probe for geo
411
- // layers, which a server without them answers with 404.
412
- if (path.startsWith("/telemetry/") || path === "/assist/searches" || path === "/cloud/geo/layers") return request();
411
+ // layers, which a server without them answers with 404, or a ticker
412
+ // change lookup: a note beside a quote, never one of the refused market
413
+ // requests a lookup of many symbols waits out and retries.
414
+ if (
415
+ path.startsWith("/telemetry/")
416
+ || path === "/assist/searches"
417
+ || path === "/cloud/geo/layers"
418
+ || path.startsWith("/market/ticker-changes?")
419
+ ) return request();
413
420
  return this.connectionHealth.track(
414
421
  GLOOM_CLOUD_HTTP_CONNECTION_ID,
415
422
  operation,
@@ -3,6 +3,7 @@ import type {
3
3
  AuthUser,
4
4
  ChatMessage,
5
5
  ChatNotification,
6
+ ChatReactionsUpdate,
6
7
  CloudQuotePayload,
7
8
  QuoteStreamTarget,
8
9
  ScannerFeedEvent,
@@ -12,6 +13,7 @@ import type {
12
13
  import {
13
14
  normalizeChatMessage,
14
15
  normalizeChatNotification,
16
+ normalizeChatReactions,
15
17
  normalizeTeamNotification,
16
18
  } from "./normalizers";
17
19
  import { debugLog } from "../utils/debug-log";
@@ -41,6 +43,7 @@ const cloudApiLog = debugLog.createLogger("cloud-api");
41
43
  type ChannelListener = (message: ChatMessage) => void;
42
44
  type ChatNotificationListener = (notification: ChatNotification) => void;
43
45
  type ChatPresenceListener = (onlineCount: number) => void;
46
+ type ChatReactionsListener = (update: ChatReactionsUpdate) => void;
44
47
  type TeamNotificationListener = (notification: TeamNotification) => void;
45
48
  type CloudEventListener = (data: unknown) => void;
46
49
  type QuoteListener = (
@@ -106,6 +109,7 @@ export class CloudApiSocket {
106
109
  private readonly chatNotificationListeners =
107
110
  new Set<ChatNotificationListener>();
108
111
  private readonly chatPresenceListeners = new Set<ChatPresenceListener>();
112
+ private readonly chatReactionsListeners = new Set<ChatReactionsListener>();
109
113
  private readonly teamNotificationListeners =
110
114
  new Set<TeamNotificationListener>();
111
115
  private readonly cloudEventListeners = new Map<
@@ -245,6 +249,14 @@ export class CloudApiSocket {
245
249
  };
246
250
  }
247
251
 
252
+ /** A message's reactions changed in a channel this socket reads. */
253
+ subscribeChatReactions(listener: ChatReactionsListener): () => void {
254
+ this.chatReactionsListeners.add(listener);
255
+ return () => {
256
+ this.chatReactionsListeners.delete(listener);
257
+ };
258
+ }
259
+
248
260
  subscribeChatPresence(listener: ChatPresenceListener): () => void {
249
261
  this.chatPresenceListeners.add(listener);
250
262
  return () => {
@@ -500,6 +512,7 @@ export class CloudApiSocket {
500
512
  this.connectionListeners.clear();
501
513
  this.chatNotificationListeners.clear();
502
514
  this.chatPresenceListeners.clear();
515
+ this.chatReactionsListeners.clear();
503
516
  this.teamNotificationListeners.clear();
504
517
  this.cloudEventListeners.clear();
505
518
  this.quoteSubscriptions.clear();
@@ -575,6 +588,22 @@ export class CloudApiSocket {
575
588
  return;
576
589
  }
577
590
 
591
+ if (
592
+ parsed?.type === "chat.reactions" &&
593
+ typeof parsed.channelId === "string" &&
594
+ typeof parsed.data?.messageId === "string"
595
+ ) {
596
+ const update: ChatReactionsUpdate = {
597
+ channelId: parsed.channelId,
598
+ messageId: parsed.data.messageId,
599
+ reactions: normalizeChatReactions(parsed.data.reactions),
600
+ };
601
+ for (const listener of this.chatReactionsListeners) {
602
+ listener(update);
603
+ }
604
+ return;
605
+ }
606
+
578
607
  if (parsed?.type === "chat.notification" && parsed.data) {
579
608
  const notification = normalizeChatNotification(
580
609
  parsed.data as ChatNotification,
@@ -15,6 +15,12 @@ export interface ThemeSummary {
15
15
  worst: { symbol: string; changePercent: number } | null;
16
16
  stale: boolean;
17
17
  }
18
+ /**
19
+ * A member's figures. `price`, `changePercent` and the returns are the regular
20
+ * session's: outside it, its close and that close's move. The extended fields
21
+ * are the pre-market or after-hours print measured from that close; a server
22
+ * sends them only when there is one, and older servers never do.
23
+ */
18
24
  export interface ThemeMember extends Record<ThemePeriod | "price", number | null> {
19
25
  symbol: string;
20
26
  name: string | null;
@@ -22,7 +28,22 @@ export interface ThemeMember extends Record<ThemePeriod | "price", number | null
22
28
  present: boolean;
23
29
  asOf: Record<ThemePeriod | "price", string | null>;
24
30
  stale: boolean;
31
+ extendedSession?: "PRE" | "POST" | null;
32
+ extendedPrice?: number | null;
33
+ extendedChange?: number | null;
34
+ extendedChangePercent?: number | null;
35
+ }
36
+ interface SnapshotMetadata {
37
+ /** When the server put the snapshot together, not a trade time. */
38
+ asOf: string;
39
+ snapshotId: string;
40
+ stale: boolean;
41
+ /** The US market as the server's delayed board reads it. Absent from older servers. */
42
+ session?: "PRE" | "REGULAR" | "POST" | "CLOSED" | null;
43
+ /** Outside the regular session, the completed session every figure describes; null while one trades. */
44
+ regularSessionDate?: string | null;
45
+ /** When that session closed, in epoch milliseconds (13:00 New York on an early close). */
46
+ regularSessionClosedAt?: number | null;
25
47
  }
26
- interface SnapshotMetadata { asOf: string; snapshotId: string; stale: boolean }
27
48
  export interface ThemesPayload extends SnapshotMetadata { themes: ThemeSummary[] }
28
49
  export interface ThemeMembersPayload extends SnapshotMetadata { theme: ThemeSummary; members: ThemeMember[] }
@@ -49,6 +49,33 @@ export interface ChatAttachment {
49
49
  url: string;
50
50
  }
51
51
 
52
+ /** Someone who reacted, as a reaction lists the first few. */
53
+ export interface ChatReactionUser {
54
+ id: string;
55
+ username: string | null;
56
+ displayName: string;
57
+ accountType?: ChatAccountType | null;
58
+ }
59
+
60
+ /**
61
+ * One emoji on a message: how many reacted, whether you did, and the first
62
+ * few who did, oldest first. `emoji` is the character, or `:name:` for a
63
+ * custom Discord server emoji.
64
+ */
65
+ export interface ChatReaction {
66
+ emoji: string;
67
+ count: number;
68
+ me: boolean;
69
+ users?: ChatReactionUser[];
70
+ }
71
+
72
+ /** A message's reactions as they stand after a change, from the `chat.reactions` frame or a reaction request. */
73
+ export interface ChatReactionsUpdate {
74
+ channelId: string;
75
+ messageId: string;
76
+ reactions: ChatReaction[];
77
+ }
78
+
52
79
  export interface ChatMessage {
53
80
  id: string;
54
81
  channelId: string;
@@ -66,6 +93,12 @@ export interface ChatMessage {
66
93
  } | null;
67
94
  /** Images in display order. A server that predates them leaves this out. */
68
95
  attachments?: ChatAttachment[];
96
+ /**
97
+ * Emoji reactions in the order they first appeared. Message lists from a
98
+ * server that knows reactions always carry it; a live copy of a message
99
+ * (an edit) leaves it out, and the reactions held stay.
100
+ */
101
+ reactions?: ChatReaction[];
69
102
  /**
70
103
  * Only on the author's copy of a public message whose images are still being
71
104
  * checked ("pending") or could not be checked ("failed"). Nobody else has the
@@ -402,6 +435,10 @@ export interface CloudPricePointPayload {
402
435
  low?: number;
403
436
  close: number;
404
437
  volume?: number;
438
+ /** A coin's daily bar for the UTC day still forming when served; it has no volume yet. */
439
+ partial?: boolean;
440
+ /** A coin's daily bar whose prices were rebuilt from hourly bars; a day the source left empty has no volume. */
441
+ filled?: boolean;
405
442
  }
406
443
 
407
444
  type CloudEconImpact = "high" | "medium" | "low";
@@ -432,6 +469,13 @@ export interface CloudMacroReleaseDaysPayload {
432
469
  export interface CloudFredObservationPayload {
433
470
  date: string;
434
471
  value: number | null;
472
+ /**
473
+ * Who published a value FRED does not list yet, such as a Treasury yield
474
+ * Gloom Cloud read from the Treasury first. Absent on FRED's own values.
475
+ */
476
+ publisher?: string;
477
+ /** When that publisher's value was first read, ISO in UTC. */
478
+ publishedAt?: string;
435
479
  }
436
480
 
437
481
  export interface CloudFredSeriesInfoPayload {
@@ -538,6 +582,22 @@ export interface CloudCdsHistoryResponse {
538
582
  points: CloudCdsHistoryPointPayload[];
539
583
  }
540
584
 
585
+ /** An issuer's latest 5Y level: the last point of its history over the last month. */
586
+ export interface CloudCdsLevelPayload {
587
+ /** The reference entity as the history response names it. */
588
+ issuer: string;
589
+ spreadBp: number;
590
+ date: string;
591
+ }
592
+
593
+ export interface CloudCdsLevelsResponse {
594
+ source: string;
595
+ tenor: string;
596
+ asOf: string | null;
597
+ /** Every issuer traded in the last month whose 5Y line has a level in it. */
598
+ levels: CloudCdsLevelPayload[];
599
+ }
600
+
541
601
  interface CloudShortInterestPointPayload {
542
602
  settlementDate: string;
543
603
  shortPercentFloat?: number | null;
@@ -1098,7 +1158,7 @@ export interface CloudSearchResponse {
1098
1158
  tookMs: number;
1099
1159
  }
1100
1160
 
1101
- export interface CloudSearchDocumentChunk {
1161
+ interface CloudSearchDocumentChunk {
1102
1162
  id: string;
1103
1163
  chunkIndex: number;
1104
1164
  body: string;