gloomberb 0.16.4 → 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 (852) hide show
  1. package/README.md +14 -91
  2. package/package.json +5 -1
  3. package/src/{plugins/builtin/cloud → account}/auth-form.tsx +9 -9
  4. package/src/{plugins/builtin/cloud → account}/auth-model.ts +4 -4
  5. package/src/account/billing.ts +57 -0
  6. package/src/{plugins/builtin/cloud → account}/device-signin-dialog.tsx +18 -12
  7. package/src/{plugins/builtin/cloud → account}/device-signin.ts +2 -2
  8. package/src/{plugins/builtin/cloud → account}/email-auth-attempt.ts +2 -2
  9. package/src/account/session.ts +16 -0
  10. package/src/{plugins/builtin/cloud → account}/upgrade-dialog.tsx +16 -15
  11. package/src/{plugins/builtin/cloud → account}/upgrade-personalization.ts +7 -7
  12. package/src/{plugins/builtin/cloud → account}/upgrade-tickers.ts +6 -6
  13. package/src/{plugins/builtin/cloud → account}/verification-panel.tsx +6 -6
  14. package/src/api-client/central-bank-rates.ts +6 -1
  15. package/src/api-client/chat.ts +26 -0
  16. package/src/api-client/credit-boards.ts +2 -0
  17. package/src/api-client/data.ts +73 -3
  18. package/src/api-client/earnings.ts +6 -0
  19. package/src/api-client/europe-energy.ts +106 -0
  20. package/src/api-client/futures-curve.ts +56 -0
  21. package/src/api-client/index.ts +13 -1
  22. package/src/api-client/market-discovery.ts +13 -1
  23. package/src/api-client/normalizers.ts +32 -0
  24. package/src/api-client/paths.ts +7 -0
  25. package/src/api-client/perps.ts +8 -0
  26. package/src/api-client/request.ts +9 -2
  27. package/src/api-client/research-activity.ts +15 -10
  28. package/src/api-client/socket.ts +29 -0
  29. package/src/api-client/themes.ts +22 -1
  30. package/src/api-client/types.ts +78 -2
  31. package/src/api-client/yield-curves.ts +8 -0
  32. package/src/app/global-shortcuts.ts +50 -2
  33. package/src/app/keybindings/actions.ts +12 -1
  34. package/src/app/pane-runtime/plugin-bindings.ts +2 -2
  35. package/src/app/pane-runtime/ticker-open-runtime.ts +16 -6
  36. package/src/app/runtime/desktop-deeplink.ts +10 -5
  37. package/src/app/runtime/startup.ts +1 -1
  38. package/src/app.tsx +6 -0
  39. package/src/architecture/core-builtin-allowlist.json +8 -26
  40. package/src/ask-gloom/pane-context.ts +114 -0
  41. package/src/ask-gloom/pane-request.ts +70 -0
  42. package/src/ask-gloom/pane-text.ts +201 -0
  43. package/src/brokers/signed-in/sign-in-dialog.tsx +11 -5
  44. package/src/capabilities/chart-series.ts +19 -2
  45. package/src/capabilities/factories.ts +1 -0
  46. package/src/cli/central-bank-events.ts +23 -0
  47. package/src/cli/command-options.ts +17 -5
  48. package/src/cli/commands/crypto-hints.ts +35 -2
  49. package/src/cli/commands/fred-series.ts +146 -0
  50. package/src/cli/commands/market.ts +501 -115
  51. package/src/cli/commands/news-hints.ts +62 -0
  52. package/src/cli/commands/news-search.ts +53 -0
  53. package/src/cli/commands/options-leaps.ts +5 -2
  54. package/src/cli/commands/overview.ts +132 -26
  55. package/src/cli/commands/remote.ts +2 -1
  56. package/src/cli/commands/search.ts +317 -13
  57. package/src/cli/commands/system.ts +55 -8
  58. package/src/cli/commands/ticker.ts +155 -18
  59. package/src/cli/context.ts +45 -14
  60. package/src/cli/desktop-pane-shot.ts +76 -7
  61. package/src/cli/earnings-calendar.ts +71 -0
  62. package/src/cli/errors.ts +7 -5
  63. package/src/cli/exit-codes.ts +8 -0
  64. package/src/cli/export-source.ts +58 -0
  65. package/src/cli/freshness.ts +18 -7
  66. package/src/cli/glossary.ts +483 -0
  67. package/src/cli/help.ts +10 -0
  68. package/src/cli/helpers.ts +2 -5
  69. package/src/cli/history-rows.ts +118 -7
  70. package/src/cli/index-roots.ts +7 -0
  71. package/src/cli/index.ts +29 -9
  72. package/src/cli/known-gaps.ts +84 -0
  73. package/src/cli/listing-arg.ts +551 -97
  74. package/src/cli/not-a-ticker.ts +24 -9
  75. package/src/cli/pane-functions/access-gate.ts +13 -2
  76. package/src/cli/pane-functions/capabilities.ts +4 -3
  77. package/src/cli/pane-functions/catalog.ts +214 -40
  78. package/src/cli/pane-functions/data.ts +42 -8
  79. package/src/cli/pane-functions/discovery.ts +1 -0
  80. package/src/cli/pane-functions/dom.ts +37 -8
  81. package/src/cli/pane-functions/freshness.ts +393 -49
  82. package/src/cli/pane-functions/function-help.ts +31 -15
  83. package/src/cli/pane-functions/headless.ts +98 -30
  84. package/src/cli/pane-functions/index.ts +101 -19
  85. package/src/cli/pane-functions/market-session.ts +22 -8
  86. package/src/cli/pane-functions/options.ts +71 -22
  87. package/src/cli/pane-functions/report-notices.ts +25 -7
  88. package/src/cli/pane-functions/report.ts +15 -8
  89. package/src/cli/pane-functions/resolver.ts +74 -19
  90. package/src/cli/pane-functions/screenshot.ts +250 -27
  91. package/src/cli/perpetual-contract.ts +60 -0
  92. package/src/cli/registry.ts +3 -1
  93. package/src/cli/report-tables.ts +26 -7
  94. package/src/cli/result.ts +45 -11
  95. package/src/cli/series-search.ts +111 -0
  96. package/src/cli/staged-tickers.ts +52 -0
  97. package/src/cli/symbol-args.ts +27 -0
  98. package/src/cli/symbol-list.ts +154 -0
  99. package/src/cli/symbol-rows.ts +154 -0
  100. package/src/cli/ticker-resolution.ts +311 -27
  101. package/src/cli/types.ts +5 -0
  102. package/src/components/chart/composite/axis-overlays.tsx +14 -3
  103. package/src/components/chart/composite/composite-chart.tsx +71 -11
  104. package/src/components/chart/composite/crosshair-readout.tsx +150 -0
  105. package/src/components/chart/composite/downsample.ts +1 -1
  106. package/src/components/chart/composite/format.ts +29 -0
  107. package/src/components/chart/composite/interactions.ts +9 -2
  108. package/src/components/chart/composite/legend.tsx +100 -33
  109. package/src/components/chart/composite/panel-bitmap.ts +70 -35
  110. package/src/components/chart/composite/panel-labels.ts +18 -17
  111. package/src/components/chart/composite/panel-series.ts +1 -0
  112. package/src/components/chart/composite/panel-surface.tsx +46 -21
  113. package/src/components/chart/composite/price-axis-labels.tsx +3 -1
  114. package/src/components/chart/composite/rasterizer.ts +50 -8
  115. package/src/components/chart/composite/scene.ts +2 -1
  116. package/src/components/chart/composite/time-scale.ts +26 -9
  117. package/src/components/chart/composite/types.ts +18 -0
  118. package/src/components/chart/composite/use-composite-viewport.ts +30 -2
  119. package/src/components/chart/native/raster/crosshair.ts +8 -3
  120. package/src/components/chart/native/raster/primitives.ts +85 -21
  121. package/src/components/chart/native/surface/manager.ts +33 -8
  122. package/src/components/chart/surface3d/chart.tsx +1 -1
  123. package/src/components/command-bar/action-runtime.ts +1 -1
  124. package/src/components/command-bar/commands/collection-list.ts +210 -0
  125. package/src/components/command-bar/commands/collection.ts +40 -1
  126. package/src/components/command-bar/commands/direct/index.ts +4 -0
  127. package/src/components/command-bar/commands/registry.ts +8 -0
  128. package/src/components/command-bar/panel/index.tsx +11 -3
  129. package/src/components/command-bar/panel/runtime.ts +3 -0
  130. package/src/components/command-bar/panel/types.ts +2 -0
  131. package/src/components/command-bar/routes/root/plugin-install.ts +4 -4
  132. package/src/components/command-bar/routes/root/provider-search.ts +4 -3
  133. package/src/components/command-bar/routes/ticker-search/results.ts +12 -11
  134. package/src/components/command-bar/routes/ticker-search/route.ts +4 -3
  135. package/src/components/command-bar/routing/actions.ts +1 -1
  136. package/src/components/command-bar/workflow/tickers.ts +42 -17
  137. package/src/components/layout/detached-pane-shell.tsx +68 -39
  138. package/src/components/layout/floating-pane.tsx +10 -1
  139. package/src/components/layout/header.tsx +25 -5
  140. package/src/components/layout/missing-pane.tsx +3 -3
  141. package/src/components/layout/pane/capture-stamp.ts +41 -0
  142. package/src/components/layout/pane/capture-status.ts +12 -0
  143. package/src/components/layout/pane/content.tsx +7 -13
  144. package/src/components/layout/pane/footer/index.tsx +6 -2
  145. package/src/components/layout/pane/footer/keyboard.ts +3 -0
  146. package/src/components/layout/pane/footer/model.ts +41 -1
  147. package/src/components/layout/pane/header.tsx +50 -1
  148. package/src/components/layout/pane/index.tsx +21 -3
  149. package/src/components/layout/pane/sidebar.tsx +88 -21
  150. package/src/components/layout/shell/active-drag.ts +21 -5
  151. package/src/components/layout/shell/cursor-occlusion.ts +2 -1
  152. package/src/components/layout/shell/drag/index.ts +39 -9
  153. package/src/components/layout/shell/drag/live.ts +61 -51
  154. package/src/components/layout/shell/drag/runtime.ts +54 -12
  155. package/src/components/layout/shell/index.tsx +84 -65
  156. package/src/components/layout/shell/menu.ts +14 -1
  157. package/src/components/layout/shell/native/pointer-runtime.ts +3 -1
  158. package/src/components/layout/shell/pane/actions.ts +32 -10
  159. package/src/components/layout/shell/pane/ask.ts +131 -0
  160. package/src/components/layout/shell/pane/capture.ts +162 -0
  161. package/src/components/layout/shell/pane/layers.tsx +218 -50
  162. package/src/components/layout/shell/pane/management-shortcuts.ts +46 -1
  163. package/src/components/layout/shell/shortcuts.ts +21 -4
  164. package/src/components/layout/shell/terminal-pointer-runtime.ts +24 -0
  165. package/src/components/markdown-text.tsx +62 -20
  166. package/src/components/metric-treemap/heat-surface.tsx +8 -1
  167. package/src/components/onboarding/account-step/form-panel.tsx +1 -1
  168. package/src/components/onboarding/account-step/index.tsx +1 -1
  169. package/src/components/onboarding/account-step/qr-panel.tsx +1 -1
  170. package/src/components/onboarding/account-step/signed-in-panel.tsx +1 -1
  171. package/src/components/onboarding/onboarding-keyboard.ts +1 -1
  172. package/src/components/onboarding/onboarding-wizard.tsx +2 -2
  173. package/src/components/onboarding/use-onboarding-upgrade.ts +3 -3
  174. package/src/components/onboarding/wizard-account.ts +2 -2
  175. package/src/components/pane-template-wizard.tsx +9 -1
  176. package/src/components/price-selector-dialog.tsx +11 -2
  177. package/src/components/reader/article-reader.tsx +642 -0
  178. package/src/components/reader/article-text.ts +527 -0
  179. package/src/components/sign-in-gate.tsx +3 -3
  180. package/src/components/ticker/list-table-view.tsx +43 -2
  181. package/src/components/ui/action-row.tsx +2 -1
  182. package/src/components/ui/button.tsx +7 -1
  183. package/src/components/ui/choice-dialog.tsx +6 -4
  184. package/src/components/ui/confirm-dialog.tsx +28 -18
  185. package/src/components/ui/data-table/index.tsx +18 -6
  186. package/src/components/ui/data-table/opentui/index.tsx +37 -6
  187. package/src/components/ui/data-table/types.ts +12 -0
  188. package/src/components/ui/dialog-actions.tsx +64 -0
  189. package/src/components/ui/display.tsx +17 -3
  190. package/src/components/ui/frame.tsx +35 -2
  191. package/src/components/ui/icon.tsx +6 -1
  192. package/src/components/ui/query-bar.tsx +10 -1
  193. package/src/components/ui/text-prompt-dialog.tsx +11 -9
  194. package/src/data/cached-query.ts +2 -0
  195. package/src/data/config/store/migrations.ts +7 -0
  196. package/src/data/config/store/normalize.ts +7 -2
  197. package/src/data/config/store/portfolio-as-of-column.ts +57 -0
  198. package/src/data/ticker-repository.ts +5 -0
  199. package/src/data/ticker-store.ts +15 -0
  200. package/src/docs/content.ts +215 -0
  201. package/src/docs/load.ts +139 -0
  202. package/src/docs/requests.ts +39 -0
  203. package/src/docs/snapshot.chunk.ts +8 -0
  204. package/src/docs/snapshot.json +7555 -0
  205. package/src/docs/topics.ts +216 -0
  206. package/src/i18n/es.ts +65 -5
  207. package/src/i18n/ja.ts +65 -5
  208. package/src/i18n/ko.ts +65 -5
  209. package/src/i18n/zh-cn.ts +65 -5
  210. package/src/i18n/zh-tw.ts +65 -5
  211. package/src/layout/desks.ts +1 -1
  212. package/src/layout/pane-manager/dock-tree.ts +18 -0
  213. package/src/layout/pane-manager/index.ts +1 -0
  214. package/src/layout-marketplace/gallery.tsx +1 -1
  215. package/src/market-data/coordinator/chart.ts +10 -4
  216. package/src/market-data/coordinator/index.ts +6 -3
  217. package/src/{plugins/builtin/futures/contracts.ts → market-data/futures-board.ts} +81 -28
  218. package/src/market-data/futures-contract.ts +151 -0
  219. package/src/market-data/hooks.tsx +10 -2
  220. package/src/market-data/market/format.ts +39 -21
  221. package/src/market-data/market/freshness.ts +84 -20
  222. package/src/market-data/market/session-close-note.ts +3 -2
  223. package/src/market-data/market/status.ts +19 -23
  224. package/src/market-data/published-apac-sessions.ts +23 -1
  225. package/src/market-data/quotes/contributions.ts +5 -0
  226. package/src/market-data/quotes/metadata.ts +19 -24
  227. package/src/market-data/quotes/resolution.ts +5 -0
  228. package/src/market-data/quotes/screener-live-quotes.ts +5 -4
  229. package/src/market-data/result-types.ts +2 -0
  230. package/src/notifications/app-notifier.ts +17 -1
  231. package/src/notifications/notification-log.ts +180 -0
  232. package/src/plugins/auto-update-node.ts +2 -2
  233. package/src/plugins/auto-update.ts +2 -2
  234. package/src/plugins/builtin/account-management/index.tsx +1 -0
  235. package/src/plugins/builtin/account-management/model.ts +1 -56
  236. package/src/plugins/builtin/account-management/pane.tsx +6 -4
  237. package/src/plugins/builtin/account-management/password-dialog.tsx +1 -1
  238. package/src/plugins/builtin/alerts/catalysts.ts +1 -1
  239. package/src/plugins/builtin/alerts/cli.ts +313 -47
  240. package/src/plugins/builtin/alerts/events-pane.tsx +45 -7
  241. package/src/plugins/builtin/alerts/events.ts +23 -2
  242. package/src/plugins/builtin/alerts/focus.ts +27 -0
  243. package/src/plugins/builtin/alerts/history-pane.tsx +7 -2
  244. package/src/plugins/builtin/alerts/history.ts +2 -0
  245. package/src/plugins/builtin/alerts/index.tsx +47 -11
  246. package/src/plugins/builtin/alerts/pane.tsx +27 -1
  247. package/src/plugins/builtin/alerts/research-builder.ts +8 -3
  248. package/src/plugins/builtin/alerts/research-rules.ts +18 -2
  249. package/src/plugins/builtin/alerts/scheduled-check.ts +122 -0
  250. package/src/plugins/builtin/alerts/scheduled-sources.ts +25 -0
  251. package/src/plugins/builtin/alerts/scheduled.ts +254 -0
  252. package/src/plugins/builtin/alerts/targets.ts +92 -0
  253. package/src/plugins/builtin/analytics/index.tsx +8 -3
  254. package/src/plugins/builtin/analytics/risk-headless.ts +60 -27
  255. package/src/plugins/builtin/analytics/risk-math.ts +91 -27
  256. package/src/plugins/builtin/analytics/risk-model.ts +35 -5
  257. package/src/plugins/builtin/analytics/risk-pane.tsx +15 -8
  258. package/src/plugins/builtin/attention/headless.ts +1 -1
  259. package/src/plugins/builtin/attention/index.tsx +2 -0
  260. package/src/plugins/builtin/attention/pane.tsx +3 -1
  261. package/src/plugins/builtin/attention/series.ts +26 -0
  262. package/src/plugins/builtin/awards/headless.ts +88 -18
  263. package/src/plugins/builtin/awards/index.tsx +2 -0
  264. package/src/plugins/builtin/awards/model.ts +41 -1
  265. package/src/plugins/builtin/awards/pane.tsx +22 -13
  266. package/src/plugins/builtin/awards/series.ts +29 -0
  267. package/src/plugins/builtin/backtest/headless.ts +2 -2
  268. package/src/plugins/builtin/bond-calculator/model.ts +2 -1
  269. package/src/plugins/builtin/broker-manager/index.tsx +1 -0
  270. package/src/plugins/builtin/catalysts/headless.ts +1 -1
  271. package/src/plugins/builtin/catalysts/pane.tsx +3 -1
  272. package/src/plugins/builtin/cds/client.ts +49 -12
  273. package/src/plugins/builtin/cds/headless.ts +119 -19
  274. package/src/plugins/builtin/cds/index.tsx +3 -1
  275. package/src/plugins/builtin/cds/model.ts +214 -32
  276. package/src/plugins/builtin/cds/pane.tsx +58 -14
  277. package/src/plugins/builtin/cds/series.ts +19 -0
  278. package/src/plugins/builtin/central-bank-rates/client.ts +4 -0
  279. package/src/plugins/builtin/central-bank-rates/headless.ts +46 -16
  280. package/src/plugins/builtin/central-bank-rates/index.tsx +3 -1
  281. package/src/plugins/builtin/central-bank-rates/model.ts +99 -0
  282. package/src/plugins/builtin/central-bank-rates/pane.tsx +1 -1
  283. package/src/plugins/builtin/central-bank-rates/series.ts +36 -0
  284. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +193 -255
  285. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +84 -46
  286. package/src/plugins/builtin/chart-composer/editor.tsx +5 -4
  287. package/src/plugins/builtin/chart-composer/field-series.ts +40 -0
  288. package/src/plugins/builtin/chart-composer/headless-schema.ts +1 -1
  289. package/src/plugins/builtin/chart-composer/headless.ts +70 -5
  290. package/src/plugins/builtin/chart-composer/index.tsx +15 -3
  291. package/src/plugins/builtin/chart-composer/pane.tsx +81 -38
  292. package/src/plugins/builtin/chart-composer/series-catalog.ts +58 -50
  293. package/src/plugins/builtin/chart-composer/series-expression.ts +18 -10
  294. package/src/plugins/builtin/chart-composer/use-series-catalog.ts +59 -3
  295. package/src/plugins/builtin/chart-composer/user-series.ts +84 -0
  296. package/src/plugins/builtin/chat/content/composer-runtime.ts +6 -1
  297. package/src/plugins/builtin/chat/content/composer.tsx +5 -1
  298. package/src/plugins/builtin/chat/content/footer.tsx +12 -0
  299. package/src/plugins/builtin/chat/content/index.tsx +89 -5
  300. package/src/plugins/builtin/chat/content/new-dm-dialog.tsx +10 -2
  301. package/src/plugins/builtin/chat/content/new-messages.tsx +89 -0
  302. package/src/plugins/builtin/chat/content/row-activity.ts +132 -0
  303. package/src/plugins/builtin/chat/content/scroll.ts +127 -27
  304. package/src/plugins/builtin/chat/content/shortcuts.ts +2 -2
  305. package/src/plugins/builtin/chat/content/transcript.tsx +145 -78
  306. package/src/plugins/builtin/chat/content/types.ts +1 -0
  307. package/src/plugins/builtin/chat/controller/fetch.ts +8 -2
  308. package/src/plugins/builtin/chat/controller/index.ts +123 -1
  309. package/src/plugins/builtin/chat/controller/message-loading.ts +3 -0
  310. package/src/plugins/builtin/chat/controller/messages.ts +7 -2
  311. package/src/plugins/builtin/chat/controller/realtime.ts +10 -1
  312. package/src/plugins/builtin/chat/controller/send.ts +61 -1
  313. package/src/plugins/builtin/chat/controller/state.ts +8 -0
  314. package/src/plugins/builtin/chat/ghost-user.ts +20 -0
  315. package/src/plugins/builtin/chat/index.tsx +23 -5
  316. package/src/plugins/builtin/chat/layout.ts +78 -5
  317. package/src/plugins/builtin/chat/message/ai-badge.tsx +18 -0
  318. package/src/plugins/builtin/chat/message/desktop.tsx +55 -6
  319. package/src/plugins/builtin/chat/message/header.tsx +16 -4
  320. package/src/plugins/builtin/chat/message/profile-popover.tsx +5 -1
  321. package/src/plugins/builtin/chat/message/reactions.tsx +210 -0
  322. package/src/plugins/builtin/chat/message/render-state.ts +18 -2
  323. package/src/plugins/builtin/chat/message/terminal.tsx +43 -4
  324. package/src/plugins/builtin/chat/message/types.ts +12 -0
  325. package/src/plugins/builtin/chat/reactions.ts +197 -0
  326. package/src/plugins/builtin/chat/share/flow.tsx +87 -0
  327. package/src/plugins/builtin/chat/share/targets.ts +27 -0
  328. package/src/plugins/builtin/chat/status-widget.tsx +6 -3
  329. package/src/plugins/builtin/chat/unread-inbox-pane.tsx +148 -27
  330. package/src/plugins/builtin/chat/unread-inbox.ts +22 -0
  331. package/src/plugins/builtin/cloud/askg/attached-pane.tsx +69 -0
  332. package/src/plugins/builtin/cloud/askg/controller.ts +111 -19
  333. package/src/plugins/builtin/cloud/askg/executor.ts +57 -3
  334. package/src/plugins/builtin/cloud/askg/manifest.ts +32 -7
  335. package/src/plugins/builtin/cloud/askg/model.ts +27 -8
  336. package/src/plugins/builtin/cloud/askg/pane-attachment.ts +94 -0
  337. package/src/plugins/builtin/cloud/askg/pane.tsx +141 -12
  338. package/src/plugins/builtin/cloud/askg/pending-question.ts +11 -0
  339. package/src/plugins/builtin/cloud/askg/protocol.ts +10 -1
  340. package/src/plugins/builtin/cloud/askg/tool-display.ts +3 -0
  341. package/src/plugins/builtin/cloud/askg/undo.ts +2 -0
  342. package/src/plugins/builtin/cloud/auth-actions.tsx +1 -1
  343. package/src/plugins/builtin/cloud/auth-commands.ts +1 -1
  344. package/src/plugins/builtin/cloud/auth-dialog.tsx +3 -3
  345. package/src/plugins/builtin/cloud/company-picker.tsx +1 -1
  346. package/src/plugins/builtin/cloud/mcp-connect/dialog.tsx +3 -0
  347. package/src/plugins/builtin/cloud/plugin.tsx +19 -2
  348. package/src/plugins/builtin/cloud/team/model.ts +5 -0
  349. package/src/plugins/builtin/cloud/team/module.tsx +1 -0
  350. package/src/plugins/builtin/cloud/team/store.ts +8 -3
  351. package/src/plugins/builtin/cloud/terminal-relay/engine.ts +77 -9
  352. package/src/plugins/builtin/cloud/terminal-relay/manifest.ts +6 -1
  353. package/src/plugins/builtin/cloud/terminal-relay/policy.ts +9 -0
  354. package/src/plugins/builtin/cloud/terminal-relay/prompts.tsx +35 -11
  355. package/src/plugins/builtin/cloud/thesis/exposure.ts +1 -1
  356. package/src/plugins/builtin/cloud/thesis/module.tsx +1 -0
  357. package/src/plugins/builtin/cloud/thesis/prompts.tsx +2 -1
  358. package/src/plugins/builtin/company-attention/app-rank.tsx +1 -1
  359. package/src/plugins/builtin/company-attention/headless.ts +21 -7
  360. package/src/plugins/builtin/company-attention/index.tsx +2 -0
  361. package/src/plugins/builtin/company-attention/model.ts +26 -7
  362. package/src/plugins/builtin/company-attention/pane.tsx +12 -9
  363. package/src/plugins/builtin/company-attention/series.ts +52 -0
  364. package/src/plugins/builtin/company-kpis/headless.ts +97 -10
  365. package/src/plugins/builtin/company-kpis/model.ts +24 -2
  366. package/src/plugins/builtin/company-kpis/pane.tsx +17 -16
  367. package/src/plugins/builtin/composite-plugins.ts +19 -13
  368. package/src/plugins/builtin/connections/index.ts +1 -0
  369. package/src/plugins/builtin/cot/headless.ts +1 -1
  370. package/src/plugins/builtin/cot/index.tsx +3 -1
  371. package/src/plugins/builtin/cot/model.ts +40 -11
  372. package/src/plugins/builtin/cot/series.ts +27 -0
  373. package/src/plugins/builtin/cpi/headless.ts +3 -3
  374. package/src/plugins/builtin/credit-boards/cdx-pane.tsx +10 -1
  375. package/src/plugins/builtin/credit-boards/client.ts +6 -2
  376. package/src/plugins/builtin/credit-boards/headless.ts +108 -31
  377. package/src/plugins/builtin/credit-boards/index.tsx +2 -0
  378. package/src/plugins/builtin/credit-boards/model.ts +11 -1
  379. package/src/plugins/builtin/credit-boards/series.ts +66 -0
  380. package/src/plugins/builtin/credit-conditions/client.ts +12 -9
  381. package/src/plugins/builtin/credit-conditions/headless.ts +13 -2
  382. package/src/plugins/builtin/credit-conditions/index.tsx +18 -9
  383. package/src/plugins/builtin/credit-conditions/model.ts +19 -11
  384. package/src/plugins/builtin/credit-conditions/series.ts +16 -0
  385. package/src/plugins/builtin/credit-documents/headless.ts +33 -3
  386. package/src/plugins/builtin/credit-documents/pane.tsx +3 -1
  387. package/src/plugins/builtin/crypto-board/headless.ts +2 -3
  388. package/src/plugins/builtin/crypto-board/index.tsx +2 -0
  389. package/src/plugins/builtin/crypto-board/model.ts +12 -0
  390. package/src/plugins/builtin/crypto-board/pane.tsx +19 -12
  391. package/src/plugins/builtin/crypto-board/series.ts +48 -0
  392. package/src/plugins/builtin/custom-view/live-quotes.ts +2 -2
  393. package/src/plugins/builtin/debt-maturities/headless.ts +17 -11
  394. package/src/plugins/builtin/debt-maturities/index.tsx +2 -0
  395. package/src/plugins/builtin/debt-maturities/series.ts +45 -0
  396. package/src/plugins/builtin/dividend-yield/client.ts +3 -0
  397. package/src/plugins/builtin/dividend-yield/headless.ts +7 -4
  398. package/src/plugins/builtin/dividend-yield/index.tsx +3 -1
  399. package/src/plugins/builtin/dividend-yield/pane.tsx +3 -1
  400. package/src/plugins/builtin/dividend-yield/series.ts +20 -0
  401. package/src/plugins/builtin/dividend-yield/types.ts +2 -0
  402. package/src/plugins/builtin/docs/blocks.tsx +181 -0
  403. package/src/plugins/builtin/docs/index.tsx +68 -0
  404. package/src/plugins/builtin/docs/pane.tsx +426 -0
  405. package/src/plugins/builtin/docs/targets.ts +72 -0
  406. package/src/plugins/builtin/docs/use-docs.ts +60 -0
  407. package/src/plugins/builtin/doe/headless.ts +12 -8
  408. package/src/plugins/builtin/doe/index.tsx +2 -0
  409. package/src/plugins/builtin/doe/series.ts +62 -0
  410. package/src/plugins/builtin/earnings/client.ts +3 -2
  411. package/src/plugins/builtin/earnings/format.ts +1 -5
  412. package/src/plugins/builtin/earnings/headless.ts +58 -6
  413. package/src/plugins/builtin/earnings/history-model.ts +15 -1
  414. package/src/plugins/builtin/earnings/history-table.ts +13 -2
  415. package/src/plugins/builtin/earnings/history.tsx +7 -3
  416. package/src/plugins/builtin/earnings/index.tsx +9 -0
  417. package/src/plugins/builtin/earnings-calls/headless.ts +28 -2
  418. package/src/plugins/builtin/earnings-calls/index.tsx +1 -1
  419. package/src/plugins/builtin/earnings-ripple/index.tsx +2 -0
  420. package/src/plugins/builtin/econ/fred-catalog.ts +198 -0
  421. package/src/plugins/builtin/econ/fred-series-map.ts +0 -46
  422. package/src/plugins/builtin/econ/index.tsx +2 -0
  423. package/src/plugins/builtin/econ-statistics/defs.ts +5 -0
  424. package/src/plugins/builtin/econ-statistics/headless.ts +19 -4
  425. package/src/plugins/builtin/econ-statistics/stats.ts +1 -0
  426. package/src/plugins/builtin/equity-screener/headless.ts +3 -3
  427. package/src/plugins/builtin/equity-screener/pane.tsx +4 -11
  428. package/src/plugins/builtin/estimate-revisions/headless.ts +3 -3
  429. package/src/plugins/builtin/exposure/drivers.ts +13 -0
  430. package/src/plugins/builtin/exposure/headless.ts +205 -13
  431. package/src/plugins/builtin/exposure/holdings.ts +1 -1
  432. package/src/plugins/builtin/exposure/index.tsx +1 -0
  433. package/src/plugins/builtin/exposure/model.ts +23 -3
  434. package/src/plugins/builtin/exposure/pane.tsx +14 -12
  435. package/src/plugins/builtin/fear-greed/index.tsx +18 -10
  436. package/src/plugins/builtin/fear-greed/series.ts +52 -0
  437. package/src/plugins/builtin/futures/index.tsx +43 -3
  438. package/src/plugins/builtin/futures/model.ts +1 -1
  439. package/src/plugins/builtin/futures/returns.ts +1 -1
  440. package/src/plugins/builtin/futures/series.ts +13 -0
  441. package/src/plugins/builtin/futures/table.tsx +1 -1
  442. package/src/plugins/builtin/futures/use-front-returns.ts +1 -1
  443. package/src/plugins/builtin/futures-curve/client.ts +12 -3
  444. package/src/plugins/builtin/futures-curve/headless.ts +71 -10
  445. package/src/plugins/builtin/futures-curve/index.tsx +1 -1
  446. package/src/plugins/builtin/futures-curve/model.ts +66 -11
  447. package/src/plugins/builtin/futures-curve/pane.tsx +52 -18
  448. package/src/plugins/builtin/fx-matrix/client.ts +63 -0
  449. package/src/plugins/builtin/fx-matrix/export.ts +2 -1
  450. package/src/plugins/builtin/fx-matrix/headless.ts +154 -0
  451. package/src/plugins/builtin/fx-matrix/index.tsx +4 -4
  452. package/src/plugins/builtin/gpu/board.tsx +13 -10
  453. package/src/plugins/builtin/gpu/changes.tsx +4 -4
  454. package/src/plugins/builtin/gpu/client.ts +19 -1
  455. package/src/plugins/builtin/gpu/equities.tsx +14 -10
  456. package/src/plugins/builtin/gpu/headless.ts +58 -27
  457. package/src/plugins/builtin/gpu/history.tsx +3 -3
  458. package/src/plugins/builtin/gpu/index.tsx +2 -0
  459. package/src/plugins/builtin/gpu/model.ts +101 -16
  460. package/src/plugins/builtin/gpu/pane.tsx +28 -12
  461. package/src/plugins/builtin/gpu/series.ts +38 -0
  462. package/src/plugins/builtin/help/function-card.tsx +25 -6
  463. package/src/plugins/builtin/help/function-index.ts +2 -0
  464. package/src/plugins/builtin/help/index.tsx +31 -9
  465. package/src/plugins/builtin/holders/beneficial-model.ts +90 -3
  466. package/src/plugins/builtin/holders/beneficial-report.ts +57 -5
  467. package/src/plugins/builtin/holders/beneficial-view.tsx +55 -11
  468. package/src/plugins/builtin/holders/client.ts +22 -3
  469. package/src/plugins/builtin/holders/format.ts +18 -3
  470. package/src/plugins/builtin/holders/headless.ts +36 -133
  471. package/src/plugins/builtin/holders/pane.tsx +11 -4
  472. package/src/plugins/builtin/holders/report-header.ts +40 -5
  473. package/src/plugins/builtin/holders/report-rows.ts +240 -0
  474. package/src/plugins/builtin/insider/client.ts +35 -20
  475. package/src/plugins/builtin/insider/headless.ts +41 -11
  476. package/src/plugins/builtin/insider/index.tsx +26 -9
  477. package/src/plugins/builtin/insider/insider-data.ts +10 -0
  478. package/src/plugins/builtin/insider/issuer.ts +49 -0
  479. package/src/plugins/builtin/insider/model.ts +3 -0
  480. package/src/plugins/builtin/ipo-calendar/headless.ts +1 -1
  481. package/src/plugins/builtin/iv-history/client.ts +20 -6
  482. package/src/plugins/builtin/iv-history/format.ts +9 -0
  483. package/src/plugins/builtin/iv-history/headless.ts +56 -21
  484. package/src/plugins/builtin/iv-history/index.tsx +2 -0
  485. package/src/plugins/builtin/iv-history/model.ts +143 -8
  486. package/src/plugins/builtin/iv-history/screen-pane.tsx +5 -9
  487. package/src/plugins/builtin/iv-history/series.ts +29 -0
  488. package/src/plugins/builtin/jobs/headless.ts +26 -3
  489. package/src/plugins/builtin/jobs/index.tsx +3 -1
  490. package/src/plugins/builtin/jobs/series.ts +19 -0
  491. package/src/plugins/builtin/kelly-sizer/index.tsx +2 -0
  492. package/src/plugins/builtin/kelly-sizer/pane.tsx +2 -1
  493. package/src/plugins/builtin/kelly-sizer/portfolio.ts +0 -39
  494. package/src/plugins/builtin/macro-day/client.ts +44 -3
  495. package/src/plugins/builtin/macro-day/headless.ts +13 -10
  496. package/src/plugins/builtin/macro-day/model.ts +56 -10
  497. package/src/plugins/builtin/macro-day/pane.tsx +30 -20
  498. package/src/plugins/builtin/market-heatmap/headless.ts +20 -5
  499. package/src/plugins/builtin/market-heatmap/index.tsx +6 -0
  500. package/src/plugins/builtin/market-heatmap/model.ts +19 -11
  501. package/src/plugins/builtin/market-heatmap/portfolio.ts +2 -2
  502. package/src/plugins/builtin/market-movers/client.ts +7 -5
  503. package/src/plugins/builtin/market-movers/index.tsx +3 -2
  504. package/src/plugins/builtin/market-movers/model.ts +30 -0
  505. package/src/plugins/builtin/market-movers/screener.ts +31 -0
  506. package/src/plugins/builtin/market-valuation/chart-series.ts +29 -69
  507. package/src/plugins/builtin/market-valuation/index.tsx +3 -3
  508. package/src/plugins/builtin/market-valuation/indicators.ts +0 -5
  509. package/src/plugins/builtin/members/headless.ts +8 -3
  510. package/src/plugins/builtin/members/model.ts +31 -3
  511. package/src/plugins/builtin/members/pane.tsx +6 -8
  512. package/src/plugins/builtin/mna/distress/headless.ts +4 -4
  513. package/src/plugins/builtin/mna/headless.ts +18 -6
  514. package/src/plugins/builtin/money-markets/headless.ts +5 -4
  515. package/src/plugins/builtin/money-markets/index.tsx +2 -0
  516. package/src/plugins/builtin/money-markets/series.ts +41 -0
  517. package/src/plugins/builtin/news/index.tsx +0 -2
  518. package/src/plugins/builtin/news/wire/news/detail-view.tsx +53 -104
  519. package/src/plugins/builtin/news/wire/news/footer.ts +2 -25
  520. package/src/plugins/builtin/news/wire/news/preset-pane.tsx +0 -2
  521. package/src/plugins/builtin/notes/cli.ts +12 -7
  522. package/src/plugins/builtin/notes/index.tsx +1 -0
  523. package/src/plugins/builtin/options/index.tsx +3 -0
  524. package/src/plugins/builtin/options/view.tsx +1 -1
  525. package/src/plugins/builtin/options-calculator/inputs.ts +2 -1
  526. package/src/plugins/builtin/options-positioning/client.ts +7 -3
  527. package/src/plugins/builtin/options-positioning/headless.ts +4 -3
  528. package/src/plugins/builtin/options-positioning/pane.tsx +2 -2
  529. package/src/plugins/builtin/options-scenario/client.ts +2 -1
  530. package/src/plugins/builtin/options-scenario/headless.ts +1 -0
  531. package/src/plugins/builtin/options-scenario/hedge.ts +2 -1
  532. package/src/plugins/builtin/perps/client.ts +90 -16
  533. package/src/plugins/builtin/perps/equity-row.tsx +52 -17
  534. package/src/plugins/builtin/perps/freshness.ts +66 -0
  535. package/src/plugins/builtin/perps/headless.ts +47 -32
  536. package/src/plugins/builtin/perps/index.tsx +23 -4
  537. package/src/plugins/builtin/perps/list-perpetuals.ts +118 -0
  538. package/src/plugins/builtin/perps/model.ts +20 -5
  539. package/src/plugins/builtin/perps/open-market.ts +15 -0
  540. package/src/plugins/builtin/perps/pane.tsx +76 -20
  541. package/src/plugins/builtin/perps/series.ts +76 -0
  542. package/src/plugins/builtin/plugin-marketplace/index.tsx +1 -1
  543. package/src/plugins/builtin/plugin-marketplace/pane.tsx +73 -67
  544. package/src/plugins/builtin/plugin-module.ts +3 -0
  545. package/src/plugins/builtin/portfolio-list/account-metrics.ts +1 -1
  546. package/src/plugins/builtin/portfolio-list/allocation.ts +5 -4
  547. package/src/plugins/builtin/portfolio-list/cell-version.ts +8 -1
  548. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +161 -0
  549. package/src/plugins/builtin/portfolio-list/cli/import-13f.ts +109 -0
  550. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +384 -74
  551. package/src/plugins/builtin/portfolio-list/cli/render.ts +437 -71
  552. package/src/plugins/builtin/portfolio-list/cli/shared.ts +21 -4
  553. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +121 -47
  554. package/src/plugins/builtin/portfolio-list/column-values.ts +104 -26
  555. package/src/plugins/builtin/portfolio-list/grid.tsx +1 -1
  556. package/src/plugins/builtin/portfolio-list/headless.ts +84 -18
  557. package/src/plugins/builtin/portfolio-list/imported-from.ts +8 -0
  558. package/src/plugins/builtin/portfolio-list/index.tsx +5 -1
  559. package/src/plugins/builtin/portfolio-list/live-valuation.ts +6 -2
  560. package/src/plugins/builtin/portfolio-list/mutations.ts +2 -9
  561. package/src/plugins/builtin/portfolio-list/pane/data.ts +5 -1
  562. package/src/plugins/builtin/portfolio-list/pane/index.tsx +52 -9
  563. package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +33 -11
  564. package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +21 -1
  565. package/src/plugins/builtin/portfolio-list/settings.ts +17 -0
  566. package/src/plugins/builtin/portfolio-list/summary/index.tsx +12 -0
  567. package/src/plugins/builtin/portfolio-list/summary/totals.ts +9 -4
  568. package/src/plugins/builtin/portfolio-list/table.tsx +37 -7
  569. package/src/plugins/builtin/power/client.ts +16 -0
  570. package/src/plugins/builtin/power/evidence.ts +63 -10
  571. package/src/plugins/builtin/power/headless.ts +77 -9
  572. package/src/plugins/builtin/power/index.tsx +28 -3
  573. package/src/plugins/builtin/power/model.ts +73 -2
  574. package/src/plugins/builtin/power/pane.tsx +37 -9
  575. package/src/plugins/builtin/power/prices-client.ts +139 -0
  576. package/src/plugins/builtin/power/prices-headless.ts +137 -0
  577. package/src/plugins/builtin/power/prices-model.ts +103 -0
  578. package/src/plugins/builtin/power/prices.tsx +179 -0
  579. package/src/plugins/builtin/rate-path/headless.ts +46 -18
  580. package/src/plugins/builtin/realized-vol/headless.ts +5 -0
  581. package/src/plugins/builtin/relative-rotation/headless.ts +3 -3
  582. package/src/plugins/builtin/research/corporate-actions-pane.tsx +5 -2
  583. package/src/plugins/builtin/research/event-model.ts +68 -24
  584. package/src/plugins/builtin/research/events-headless.ts +2 -1
  585. package/src/plugins/builtin/research/headless.ts +2 -1
  586. package/src/plugins/builtin/research/index.tsx +2 -0
  587. package/src/plugins/builtin/research-search/article.ts +65 -0
  588. package/src/plugins/builtin/research-search/document-view.tsx +33 -215
  589. package/src/plugins/builtin/research-search/model.ts +0 -9
  590. package/src/plugins/builtin/research-search/pane.tsx +41 -30
  591. package/src/plugins/builtin/research-search/snippet.ts +0 -29
  592. package/src/plugins/builtin/revenue-breakdown/headless.ts +18 -6
  593. package/src/plugins/builtin/seasonality/client.ts +15 -7
  594. package/src/plugins/builtin/seasonality/headless.ts +36 -12
  595. package/src/plugins/builtin/seasonality/index.tsx +2 -2
  596. package/src/plugins/builtin/seasonality/model.ts +119 -0
  597. package/src/plugins/builtin/seasonality/pane.tsx +108 -37
  598. package/src/plugins/builtin/sec/headless.ts +25 -3
  599. package/src/plugins/builtin/sec/index.tsx +2 -1
  600. package/src/plugins/builtin/series-inventory.ts +93 -0
  601. package/src/plugins/builtin/shared/cloud-denied.ts +15 -0
  602. package/src/plugins/builtin/shared/cloud-upgrade.ts +1 -1
  603. package/src/plugins/builtin/shared/command-tab.ts +30 -12
  604. package/src/plugins/builtin/shared/earnings-report.ts +55 -0
  605. package/src/plugins/builtin/shared/fred-points.ts +20 -0
  606. package/src/plugins/builtin/shared/free-preview.ts +47 -0
  607. package/src/plugins/builtin/shared/fx-rate-freshness.ts +101 -0
  608. package/src/plugins/builtin/shared/open-description.ts +29 -0
  609. package/src/plugins/builtin/shared/report-freshness.ts +12 -1
  610. package/src/plugins/builtin/shared/series-warning.ts +5 -0
  611. package/src/plugins/builtin/shared/volatility/options.ts +4 -1
  612. package/src/plugins/builtin/short-interest/headless.ts +1 -0
  613. package/src/plugins/builtin/short-interest/index.tsx +2 -0
  614. package/src/plugins/builtin/short-interest/series.ts +36 -0
  615. package/src/plugins/builtin/short-interest/watch-headless.ts +3 -2
  616. package/src/plugins/builtin/short-interest/watch-model.ts +9 -5
  617. package/src/plugins/builtin/short-volume/headless.ts +2 -1
  618. package/src/plugins/builtin/short-volume/index.tsx +2 -0
  619. package/src/plugins/builtin/short-volume/series.ts +23 -0
  620. package/src/plugins/builtin/social-mentions/headless.ts +1 -1
  621. package/src/plugins/builtin/social-mentions/index.tsx +2 -0
  622. package/src/plugins/builtin/social-mentions/series.ts +23 -0
  623. package/src/plugins/builtin/supply-chain/graph-pane.tsx +3 -2
  624. package/src/plugins/builtin/supply-chain/headless.ts +43 -11
  625. package/src/plugins/builtin/supply-chain/model.ts +13 -0
  626. package/src/plugins/builtin/supply-chain/pane.tsx +8 -6
  627. package/src/plugins/builtin/themes/headless.ts +74 -10
  628. package/src/plugins/builtin/themes/model.ts +71 -4
  629. package/src/plugins/builtin/themes/pane.tsx +22 -5
  630. package/src/plugins/builtin/thirteenf/api.ts +1 -0
  631. package/src/plugins/builtin/thirteenf/data.ts +6 -4
  632. package/src/plugins/builtin/thirteenf/headless.ts +217 -36
  633. package/src/plugins/builtin/thirteenf/model.ts +39 -1
  634. package/src/plugins/builtin/thirteenf/overlap.ts +75 -0
  635. package/src/plugins/builtin/thirteenf/pane.tsx +10 -1
  636. package/src/plugins/builtin/thirteenf/report-notes.ts +103 -1
  637. package/src/plugins/builtin/thirteenf/types.ts +2 -0
  638. package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +114 -0
  639. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +57 -2
  640. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +19 -55
  641. package/src/plugins/builtin/ticker-detail/headless-schema.ts +30 -0
  642. package/src/plugins/builtin/ticker-detail/headless.ts +86 -0
  643. package/src/plugins/builtin/ticker-detail/index.tsx +26 -11
  644. package/src/plugins/builtin/ticker-detail/overview/components.tsx +1 -1
  645. package/src/plugins/builtin/ticker-detail/overview/futures-contract.ts +31 -0
  646. package/src/plugins/builtin/ticker-detail/overview/model.ts +3 -3
  647. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +2 -1
  648. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +49 -5
  649. package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +13 -3
  650. package/src/plugins/builtin/time-sales/headless.ts +2 -1
  651. package/src/plugins/builtin/time-sales/index.tsx +2 -1
  652. package/src/plugins/builtin/treasury-auctions/headless.ts +16 -2
  653. package/src/plugins/builtin/treasury-auctions/index.tsx +1 -0
  654. package/src/plugins/builtin/treasury-auctions/model.ts +8 -0
  655. package/src/plugins/builtin/vol-surface/evidence.ts +7 -1
  656. package/src/plugins/builtin/vol-surface/headless.ts +51 -17
  657. package/src/plugins/builtin/vol-surface/heat-grid.tsx +113 -0
  658. package/src/plugins/builtin/vol-surface/model.ts +39 -6
  659. package/src/plugins/builtin/vol-surface/pane.tsx +14 -13
  660. package/src/plugins/builtin/vol-surface/stored.ts +63 -3
  661. package/src/plugins/builtin/vol-surface/surface.tsx +30 -2
  662. package/src/plugins/builtin/volatility/index.tsx +2 -0
  663. package/src/plugins/builtin/volatility/series.ts +84 -0
  664. package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +6 -5
  665. package/src/plugins/builtin/world-venue-map/basemap.ts +6 -3
  666. package/src/plugins/builtin/world-venue-map/geo-draw.tsx +2 -1
  667. package/src/plugins/builtin/world-venue-map/geo-series.ts +26 -1
  668. package/src/plugins/builtin/world-venue-map/geo-svg.tsx +6 -6
  669. package/src/plugins/builtin/world-venue-map/headless.ts +4 -1
  670. package/src/plugins/builtin/world-venue-map/index.ts +2 -1
  671. package/src/plugins/builtin/world-venue-map/layered-pane.tsx +24 -13
  672. package/src/plugins/builtin/world-venue-map/layers.ts +29 -0
  673. package/src/plugins/builtin/world-venue-map/map.tsx +144 -13
  674. package/src/plugins/builtin/world-venue-map/model.ts +56 -19
  675. package/src/plugins/builtin/world-venue-map/pane.tsx +5 -2
  676. package/src/plugins/builtin/yield-curve/chart.ts +2 -2
  677. package/src/plugins/builtin/yield-curve/curves.ts +21 -8
  678. package/src/plugins/builtin/yield-curve/headless.ts +71 -18
  679. package/src/plugins/builtin/yield-curve/index.tsx +4 -2
  680. package/src/plugins/builtin/yield-curve/series.ts +86 -0
  681. package/src/plugins/catalog-browser.ts +2 -1
  682. package/src/plugins/installer.ts +2 -2
  683. package/src/plugins/loader.ts +15 -0
  684. package/src/plugins/manager-node.ts +1 -1
  685. package/src/plugins/{builtin/plugin-marketplace → marketplace}/feed.ts +2 -2
  686. package/src/plugins/{builtin/plugin-marketplace → marketplace}/model.ts +6 -6
  687. package/src/plugins/{builtin/plugin-marketplace → marketplace}/store.ts +1 -1
  688. package/src/plugins/registry/host-actions.ts +11 -0
  689. package/src/plugins/registry/index.ts +89 -4
  690. package/src/portfolio/collection-name.ts +31 -0
  691. package/src/{plugins/builtin/portfolio-list → portfolio}/position-metrics.ts +6 -6
  692. package/src/portfolio/position-value.ts +40 -0
  693. package/src/portfolio/valuation-basis.ts +79 -0
  694. package/src/public/__snapshots__/public-api.test.ts.snap +7 -0
  695. package/src/public/time-series.ts +17 -0
  696. package/src/react/auto-refresh.ts +13 -3
  697. package/src/react/input.ts +33 -1
  698. package/src/react/key-repeat.ts +86 -0
  699. package/src/remote/app-host.tsx +20 -4
  700. package/src/remote/confirm-change.tsx +85 -0
  701. package/src/remote/controller-utils.ts +8 -1
  702. package/src/remote/controller.ts +144 -7
  703. package/src/remote/pane-screenshot.ts +47 -0
  704. package/src/remote/schema.ts +65 -2
  705. package/src/remote/types.ts +30 -0
  706. package/src/remote/watchlist.ts +306 -0
  707. package/src/renderers/browser/main.tsx +4 -3
  708. package/src/renderers/browser/research-entry.ts +4 -2
  709. package/src/renderers/cloudflare/worker.ts +1 -1
  710. package/src/renderers/dom/data-table/frozen-column.ts +3 -1
  711. package/src/renderers/dom/data-table/index.tsx +33 -6
  712. package/src/renderers/dom/data-table/row.tsx +30 -1
  713. package/src/renderers/dom/desktop/control-styles.ts +63 -1
  714. package/src/renderers/dom/desktop/controls.tsx +30 -23
  715. package/src/renderers/dom/desktop/dialog-actions.tsx +170 -0
  716. package/src/renderers/dom/desktop/icons.tsx +16 -0
  717. package/src/renderers/dom/dom-ui-host.tsx +3 -0
  718. package/src/renderers/dom/host/block-glyph-canvas.tsx +6 -3
  719. package/src/renderers/dom/host/box.tsx +8 -0
  720. package/src/renderers/dom/host/chart-surface.tsx +33 -2
  721. package/src/renderers/dom/host/live-frame.ts +6 -2
  722. package/src/renderers/dom/host/overflow-fade.ts +14 -1
  723. package/src/renderers/dom/host/scroll-box.tsx +32 -0
  724. package/src/renderers/dom/host/size-observer.ts +41 -0
  725. package/src/renderers/dom/host/sticky-scroll.ts +128 -0
  726. package/src/renderers/dom/host/style.ts +1 -1
  727. package/src/renderers/dom/host/surface-3d.tsx +19 -7
  728. package/src/renderers/dom/host/surface-fit.ts +406 -0
  729. package/src/renderers/dom/host/text.tsx +1 -1
  730. package/src/renderers/dom/input-host.tsx +1 -0
  731. package/src/renderers/dom/styles.css +102 -5
  732. package/src/renderers/electrobun/bun/application-menu/click.ts +18 -0
  733. package/src/renderers/electrobun/bun/index.ts +3 -2
  734. package/src/renderers/electrobun/shared/protocol.ts +1 -1
  735. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +29 -2
  736. package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +63 -20
  737. package/src/renderers/electrobun/view/cli-pane-shot-health.ts +10 -26
  738. package/src/renderers/electrobun/view/main.tsx +5 -3
  739. package/src/renderers/electrobun/view/remote/asset-data-client.ts +2 -0
  740. package/src/renderers/opentui/chart-surface.tsx +1 -0
  741. package/src/renderers/opentui/frame-capture.ts +33 -0
  742. package/src/renderers/opentui/host.tsx +10 -13
  743. package/src/renderers/opentui/pane-image/glyphs-license.txt +107 -0
  744. package/src/renderers/opentui/pane-image/glyphs.json +1 -0
  745. package/src/renderers/opentui/pane-image/index.ts +107 -0
  746. package/src/renderers/opentui/pane-image/raster.ts +428 -0
  747. package/src/renderers/opentui/start.tsx +3 -3
  748. package/src/renderers/opentui/test-utils.tsx +3 -0
  749. package/src/renderers/opentui/ui-host.tsx +29 -1
  750. package/src/series/capability.ts +75 -0
  751. package/src/series/csv.ts +160 -0
  752. package/src/series/files.ts +107 -0
  753. package/src/series/registry.ts +198 -0
  754. package/src/series/resolve.ts +108 -0
  755. package/src/series/standalone.ts +48 -0
  756. package/src/series/types.ts +153 -0
  757. package/src/series/validate.ts +171 -0
  758. package/src/shares/chat.ts +34 -0
  759. package/src/shares/dialog.tsx +295 -0
  760. package/src/shares/flow.tsx +56 -0
  761. package/src/shares/live.ts +14 -22
  762. package/src/shares/pane-image.ts +152 -0
  763. package/src/shares/personal-pane.ts +64 -0
  764. package/src/shares/portable-layout.ts +4 -2
  765. package/src/shares/prepare.ts +20 -0
  766. package/src/sources/gloomberb-cloud/index.ts +109 -10
  767. package/src/sources/gloomberb-cloud/normalizers.ts +3 -0
  768. package/src/sources/gloomberb-cloud/perpetuals.ts +249 -0
  769. package/src/sources/history-result.ts +1 -0
  770. package/src/sources/history-retention.ts +11 -0
  771. package/src/sources/listing-symbols.ts +4 -1
  772. package/src/sources/listing-target.ts +4 -0
  773. package/src/sources/provider-router/batches.ts +4 -1
  774. package/src/sources/provider-router/cache.ts +4 -2
  775. package/src/sources/provider-router/cached-routes.ts +1 -1
  776. package/src/sources/provider-router/financial-routes.ts +1 -0
  777. package/src/sources/provider-router/financials.ts +13 -0
  778. package/src/sources/provider-router/history.ts +43 -25
  779. package/src/sources/provider-router/index.ts +14 -0
  780. package/src/sources/provider-router/search.ts +1 -0
  781. package/src/state/hooks/inline-tickers.ts +49 -11
  782. package/src/sync/core-contributors.ts +1 -0
  783. package/src/test-support/shell-pane-keys.tsx +1 -0
  784. package/src/theme/theme-context.tsx +15 -1
  785. package/src/tickers/company-name.ts +75 -0
  786. package/src/tickers/instrument-kind.ts +34 -1
  787. package/src/tickers/listing-name.ts +34 -0
  788. package/src/tickers/listing-venues.ts +132 -0
  789. package/src/tickers/open-target.ts +13 -4
  790. package/src/tickers/perpetual-listing.ts +151 -0
  791. package/src/tickers/prediction-listing.ts +26 -0
  792. package/src/tickers/search/index.ts +72 -11
  793. package/src/tickers/search/ranking.ts +98 -20
  794. package/src/tickers/search/types.ts +7 -1
  795. package/src/tickers/ticker-changes.ts +213 -0
  796. package/src/tickers/us-listing.ts +34 -0
  797. package/src/time-series/economic.ts +2 -6
  798. package/src/time-series/hooks.ts +9 -0
  799. package/src/time-series/ice-credit.ts +39 -0
  800. package/src/time-series/resolve.ts +211 -29
  801. package/src/time-series/studies.ts +1 -0
  802. package/src/time-series/types.ts +12 -2
  803. package/src/time-series/use-chart-resolution.ts +32 -0
  804. package/src/types/config.ts +10 -2
  805. package/src/types/data-provider.ts +11 -0
  806. package/src/types/financials.ts +62 -1
  807. package/src/types/headless.ts +113 -0
  808. package/src/types/instrument.ts +4 -0
  809. package/src/types/plugin.ts +52 -2
  810. package/src/types/price-history.ts +7 -0
  811. package/src/types/ticker-changes.ts +26 -0
  812. package/src/types/ticker.ts +14 -0
  813. package/src/ui/context-menu.tsx +13 -1
  814. package/src/ui/host.tsx +57 -3
  815. package/src/ui/live-resize.ts +91 -0
  816. package/src/ui/live-stretch.ts +153 -0
  817. package/src/ui/measured-cells.ts +58 -0
  818. package/src/ui/sticky-scroll.ts +7 -0
  819. package/src/utils/basis-points.ts +17 -0
  820. package/src/utils/central-banks.ts +76 -0
  821. package/src/utils/cli-output.ts +131 -15
  822. package/src/utils/concurrency.ts +25 -0
  823. package/src/utils/crypto-pair.ts +20 -0
  824. package/src/utils/currency-pair.ts +19 -0
  825. package/src/utils/currency-units.ts +11 -0
  826. package/src/utils/datetime-format.ts +27 -6
  827. package/src/utils/decimal-comma.ts +19 -0
  828. package/src/utils/dom-screenshot-css.ts +265 -0
  829. package/src/utils/dom-screenshot-rasters.ts +276 -0
  830. package/src/utils/dom-screenshot.ts +439 -52
  831. package/src/utils/double-escape-close.ts +15 -1
  832. package/src/utils/exchange-rate-snapshot.ts +6 -2
  833. package/src/utils/exchanges.ts +143 -1
  834. package/src/utils/format.ts +35 -5
  835. package/src/utils/forward-dividend.ts +14 -0
  836. package/src/utils/fundamentals.ts +66 -0
  837. package/src/utils/futures-generic.ts +6 -12
  838. package/src/utils/fx-market-hours.ts +15 -5
  839. package/src/utils/fx-status.ts +6 -1
  840. package/src/utils/inline-content-tokenizer.ts +22 -3
  841. package/src/utils/market-capitalization.ts +8 -0
  842. package/src/utils/one-shot.ts +73 -0
  843. package/src/utils/options.ts +37 -8
  844. package/src/utils/price-history.ts +99 -42
  845. package/src/utils/sec-eps-basis.ts +24 -11
  846. package/src/utils/sec.ts +61 -7
  847. package/src/utils/utc-time.ts +63 -4
  848. package/src/plugins/builtin/fx-matrix/freshness.ts +0 -65
  849. /package/src/plugins/{builtin/plugin-marketplace → marketplace}/activation.ts +0 -0
  850. /package/src/plugins/{builtin/plugin-marketplace → marketplace}/ids.ts +0 -0
  851. /package/src/plugins/{builtin/plugin-marketplace → marketplace}/packs.ts +0 -0
  852. /package/src/{plugins/builtin/cloud → tickers}/starter-symbols.ts +0 -0
@@ -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,18 +24,20 @@ 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";
29
31
  import type { MoneyMarketsPayload } from "./money-markets";
30
- import type { CloudCurveId, CloudCurveView, CloudWorldCurves } from "./yield-curves";
32
+ import type { CloudCurveHistory, CloudCurveId, CloudCurveView, CloudWorldCurves } from "./yield-curves";
31
33
  import type { CdxBoardPayload, CloudCreditBoardParams, SovrBoardPayload } from "./credit-boards";
32
34
  import type { ShortVolumePayload, ShortVolumeScope } from "./short-volume";
33
35
  import type { BeneficialOwnersPayload, CloudBeneficialOwnersParams } from "./beneficial-owners";
34
36
  import type { SocialMentionDayPosts, SocialMentionsPayload, SocialMentionsRange } from "./social-mentions";
35
- import type { FuturesCurveAsOfPayload, FuturesCurvePayload } from "./futures-curve";
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";
@@ -85,6 +88,7 @@ import {
85
88
  cloudMarketSearchPath,
86
89
  cloudMarketSymbolPath,
87
90
  cloudNewsPath,
91
+ cloudNewsSearchPath,
88
92
  cloudOptionsChainPath,
89
93
  cloudSavedSearchPath,
90
94
  cloudSavedSearchesPath,
@@ -109,6 +113,7 @@ import type {
109
113
  CloudAnalystResearchPayload,
110
114
  CloudShortInterestPayload,
111
115
  CloudCdsHistoryResponse,
116
+ CloudCdsLevelsResponse,
112
117
  CloudCdsResponse,
113
118
  CloudCongressHousePayload,
114
119
  CloudEarningsCallListPayload,
@@ -372,6 +377,17 @@ export class CloudDataApi {
372
377
  );
373
378
  }
374
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
+
375
391
  async getCloudHistory(
376
392
  symbol: string,
377
393
  exchange: string,
@@ -517,6 +533,9 @@ export class CloudDataApi {
517
533
  const query = exchange === undefined ? "" : `?${new URLSearchParams({ identity: "listing", exchange })}`;
518
534
  return this.request(`/cloud/perps/equity/${encodeURIComponent(symbol)}${query}`);
519
535
  }
536
+ async getCloudPerpsEquities(listings: readonly PerpEquityListing[]): Promise<PerpEquitiesPayload> {
537
+ return this.request("/cloud/perps/equities", { method: "POST", body: JSON.stringify({ listings }) });
538
+ }
520
539
  async getCloudPerpsMarket(marketId: string): Promise<PerpMarketPayload> { return this.request(`/cloud/perps/market?${new URLSearchParams({ marketId })}`); }
521
540
 
522
541
  async analyzeCloudExposure(request: ExposureRequest): Promise<ExposurePayload> {
@@ -576,6 +595,31 @@ export class CloudDataApi {
576
595
  return this.request<PowerDetail>(`/cloud/power/projects/${encodeURIComponent(id)}?${params}`, { signal });
577
596
  }
578
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
+
579
623
  async getCloudGpuBoard(): Promise<GpuBoardPayload> {
580
624
  return this.request<GpuBoardPayload>("/cloud/gpu/board");
581
625
  }
@@ -608,6 +652,15 @@ export class CloudDataApi {
608
652
  return this.request<CloudCurveView>(`/cloud/econ/curves/${encodeURIComponent(curve)}${query}`, { signal: AbortSignal.timeout(30_000) });
609
653
  }
610
654
 
655
+ /** One tenor of a curve from `from` (all stored sessions without one), oldest first. */
656
+ async getCloudCurveHistory(curve: CloudCurveId, tenor: string, from?: string | null): Promise<CloudCurveHistory> {
657
+ const query = new URLSearchParams({ tenor, ...(from ? { from } : {}) });
658
+ return this.request<CloudCurveHistory>(
659
+ `/cloud/econ/curves/${encodeURIComponent(curve)}/history?${query}`,
660
+ { signal: AbortSignal.timeout(30_000) },
661
+ );
662
+ }
663
+
611
664
  /** Each market's latest curve and the session before, each on its own date. */
612
665
  async getCloudWorldCurves(): Promise<CloudWorldCurves> {
613
666
  return this.request<CloudWorldCurves>("/cloud/econ/curves", { signal: AbortSignal.timeout(30_000) });
@@ -703,6 +756,11 @@ export class CloudDataApi {
703
756
  return this.request<FuturesCurvePayload>(`/cloud/futures/curve/${encodeURIComponent(root)}`, { signal: AbortSignal.timeout(60_000) });
704
757
  }
705
758
 
759
+ /** What a futures symbol (GC=F, GCZ26, CL1) trades: its contract, terms and latest confirmed settlement. */
760
+ async getCloudFuturesContract(symbol: string): Promise<FuturesContractTermsPayload> {
761
+ return this.request<FuturesContractTermsPayload>(`/cloud/futures/contract/${encodeURIComponent(symbol)}`, { signal: AbortSignal.timeout(20_000) });
762
+ }
763
+
706
764
  async getCloudFuturesCurveAsOf(root: string, date: string): Promise<FuturesCurveAsOfPayload> {
707
765
  return this.request<FuturesCurveAsOfPayload>(`/cloud/futures/curve/${encodeURIComponent(root)}/as-of/${encodeURIComponent(date)}`,
708
766
  { signal: AbortSignal.timeout(30_000) });
@@ -720,6 +778,11 @@ export class CloudDataApi {
720
778
  return this.request<CloudCdsHistoryResponse>(cloudCdsHistoryPath(params), { signal: AbortSignal.timeout(30_000) });
721
779
  }
722
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
+
723
786
  async getCloudCdxBoard(params: CloudCreditBoardParams = {}): Promise<CdxBoardPayload> {
724
787
  return this.request<CdxBoardPayload>(cloudCreditBoardPath("cdx", params), { signal: AbortSignal.timeout(30_000) });
725
788
  }
@@ -926,6 +989,13 @@ export class CloudDataApi {
926
989
  return this.request<CloudNewsListResponse>(cloudNewsPath(params));
927
990
  }
928
991
 
992
+ async searchCloudNews(
993
+ query: string,
994
+ limit?: number,
995
+ ): Promise<CloudNewsListResponse> {
996
+ return this.request<CloudNewsListResponse>(cloudNewsSearchPath(query, limit));
997
+ }
998
+
929
999
  async getCloudNewsStory(storyId: string): Promise<CloudNewsPayload> {
930
1000
  return this.request<CloudNewsPayload>(
931
1001
  `/news/${encodeURIComponent(storyId)}`,
@@ -1,3 +1,5 @@
1
+ import type { EarningsDateStatus, EarningsEpsBasis } from "../types/financials";
2
+
1
3
  /** Before the open, during the session, after the close. */
2
4
  export type EarningsTiming = "bmo" | "dmh" | "amc";
3
5
 
@@ -44,6 +46,8 @@ export interface EarningsReport {
44
46
  revenueAnalysts: number | null;
45
47
  implied: EarningsImpliedMove | null;
46
48
  realized: EarningsRealizedMove | null;
49
+ /** Whether the date is out, announced or projected; absent from older servers. */
50
+ dateStatus?: EarningsDateStatus;
47
51
  }
48
52
 
49
53
  export interface EarningsCalendarReport extends EarningsReport {
@@ -61,6 +65,8 @@ export interface EarningsCalendarPayload {
61
65
 
62
66
  interface EarningsHistoryReport extends EarningsReport {
63
67
  revenueActual: number | null;
68
+ /** Null when the basis cannot be determined; absent from older servers. */
69
+ epsBasis?: EarningsEpsBasis | null;
64
70
  }
65
71
 
66
72
  export interface EarningsHistoryPayload {
@@ -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
+ }
@@ -1,3 +1,37 @@
1
+ /** What one contract of a root is, from the exchange's rulebook. */
2
+ export interface FuturesContractSpec {
3
+ /** What a quoted price counts: "USD / troy oz", "US cents / bushel", "index points". */
4
+ unit: string
5
+ /** One contract as the exchange words it: "100 troy oz", "$50 x index". */
6
+ size: string
7
+ /** US dollars a move of 1.0 in the quoted price makes on one contract. */
8
+ pointValue: number
9
+ /** The smallest outright price move, in the quoted unit. */
10
+ tick: number
11
+ /** US dollars one tick makes on one contract. */
12
+ tickValue: number
13
+ settlement: "physical" | "cash"
14
+ }
15
+
16
+ /** What a futures symbol trades: the contract behind it, its terms and its latest confirmed settlement. */
17
+ export interface FuturesContractTermsPayload {
18
+ /** The symbol asked for: GC=F, GCZ26 or CL1. */
19
+ symbol: string
20
+ root: string
21
+ name: string
22
+ /** The listed contract the symbol prices today (GCZ26 for GC=F); null where it cannot be placed. */
23
+ contract: string | null
24
+ contractSymbol: string | null
25
+ deliveryMonth: string | null
26
+ spec: FuturesContractSpec | null
27
+ lastTrade: string | null
28
+ firstNotice: string | null
29
+ /** Past first notice: a long can be assigned delivery. */
30
+ inDelivery: boolean
31
+ /** The newest exchange settlement confirmed for the contract, with its session. */
32
+ settlement: { price: number; date: string } | null
33
+ }
34
+
1
35
  /** Gloom Cloud futures prices retain provider denomination and explicit quote units. */
2
36
  export interface FuturesContract {
3
37
  symbol: string
@@ -17,6 +51,18 @@ export interface FuturesContract {
17
51
  samples: number
18
52
  historyStart: string | null
19
53
  historyEnd: string | null
54
+ /**
55
+ * The exchange settlement for the curve's settlementDate; null when none is
56
+ * confirmed for that session. `price` is the latest trade, never a settlement,
57
+ * except on a Cboe curve, whose prices are settlements.
58
+ */
59
+ settlement?: number | null
60
+ /** The last trading day. */
61
+ lastTrade?: string | null
62
+ /** First notice day of a physically delivered contract; null where there is none. */
63
+ firstNotice?: string | null
64
+ /** Past first notice: a long can be assigned delivery. */
65
+ inDelivery?: boolean
20
66
  }
21
67
 
22
68
  export interface FuturesCurvePayload {
@@ -51,6 +97,10 @@ export interface FuturesCurvePayload {
51
97
  state: "contango" | "backwardation" | "flat" | "unavailable"
52
98
  }
53
99
  gaps: string[]
100
+ /** The session the contracts' settlements are for; null when none is confirmed. */
101
+ settlementDate?: string | null
102
+ /** The root's contract terms; null where they are not listed. */
103
+ spec?: FuturesContractSpec | null
54
104
  }
55
105
 
56
106
 
@@ -78,6 +128,12 @@ export interface FuturesCurveAsOfPayload {
78
128
  /** When the price was made; older than tradeDate when the contract did not trade that day. */
79
129
  asOf: string
80
130
  stale: boolean
131
+ /** The price is the exchange settlement for tradeDate; otherwise that session's last trade or, when stale, an earlier price. */
132
+ settled?: boolean
133
+ lastTrade?: string | null
134
+ firstNotice?: string | null
135
+ inDelivery?: boolean
81
136
  }>
82
137
  gaps: string[]
138
+ spec?: FuturesContractSpec | null
83
139
  }
@@ -59,7 +59,7 @@ export type {
59
59
  /** Server-side caps for `/assist/command`; enforced here so a 422 is never sent. */
60
60
  const ASSIST_QUERY_MAX_LENGTH = 200;
61
61
  const ASSIST_COMMAND_LIMIT = 150;
62
- const ASSIST_ARG_OPTION_LIMIT = 40;
62
+ const ASSIST_ARG_OPTION_LIMIT = 64;
63
63
  const ASSIST_ARG_OPTION_VALUE_MAX_LENGTH = 40;
64
64
  const ASSIST_ARG_OPTION_LABEL_MAX_LENGTH = 60;
65
65
  const ASSIST_REQUEST_TIMEOUT_MS = 6_000;
@@ -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);
@@ -775,6 +778,7 @@ class GloomApiClient {
775
778
  getCloudSocialMentionPosts = this.data.getCloudSocialMentionPosts.bind(this.data);
776
779
  getCloudFuturesCurve = this.data.getCloudFuturesCurve.bind(this.data);
777
780
  getCloudFuturesCurveAsOf = this.data.getCloudFuturesCurveAsOf.bind(this.data);
781
+ getCloudFuturesContract = this.data.getCloudFuturesContract.bind(this.data);
778
782
  getCloudRatePath = this.data.getCloudRatePath.bind(this.data);
779
783
  getCloudShiller = this.data.getCloudShiller.bind(this.data);
780
784
  getCloudCotBoard = this.data.getCloudCotBoard.bind(this.data);
@@ -795,6 +799,7 @@ class GloomApiClient {
795
799
  getCloudPerpsRankings = this.data.getCloudPerpsRankings.bind(this.data);
796
800
  getCloudPerpsCompare = this.data.getCloudPerpsCompare.bind(this.data);
797
801
  getCloudPerpsEquity = this.data.getCloudPerpsEquity.bind(this.data);
802
+ getCloudPerpsEquities = this.data.getCloudPerpsEquities.bind(this.data);
798
803
  getCloudPerpsMarket = this.data.getCloudPerpsMarket.bind(this.data);
799
804
  analyzeCloudExposure = this.data.analyzeCloudExposure.bind(this.data);
800
805
  getCloudExposureScenarios = this.data.getCloudExposureScenarios.bind(this.data);
@@ -808,6 +813,10 @@ class GloomApiClient {
808
813
  getCloudPowerBoard = this.data.getCloudPowerBoard.bind(this.data);
809
814
  getCloudPowerHistory = this.data.getCloudPowerHistory.bind(this.data);
810
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);
811
820
  getCloudGpuBoard = this.data.getCloudGpuBoard.bind(this.data);
812
821
  getCloudGpuHistory = this.data.getCloudGpuHistory.bind(this.data);
813
822
  getCloudGpuEvents = this.data.getCloudGpuEvents.bind(this.data);
@@ -815,9 +824,11 @@ class GloomApiClient {
815
824
  getCloudTape = this.data.getCloudTape.bind(this.data);
816
825
  getCloudYieldCurve = this.data.getCloudYieldCurve.bind(this.data);
817
826
  getCloudCurve = this.data.getCloudCurve.bind(this.data);
827
+ getCloudCurveHistory = this.data.getCloudCurveHistory.bind(this.data);
818
828
  getCloudWorldCurves = this.data.getCloudWorldCurves.bind(this.data);
819
829
  getCloudCds = this.data.getCloudCds.bind(this.data);
820
830
  getCloudCdsHistory = this.data.getCloudCdsHistory.bind(this.data);
831
+ getCloudCdsLevels = this.data.getCloudCdsLevels.bind(this.data);
821
832
  getCloudCdxBoard = this.data.getCloudCdxBoard.bind(this.data);
822
833
  getCloudSovrBoard = this.data.getCloudSovrBoard.bind(this.data);
823
834
  getCloudCongressHouse = this.data.getCloudCongressHouse.bind(this.data);
@@ -843,6 +854,7 @@ class GloomApiClient {
843
854
  updateCloudSavedSearch = this.data.updateCloudSavedSearch.bind(this.data);
844
855
  deleteCloudSavedSearch = this.data.deleteCloudSavedSearch.bind(this.data);
845
856
  getCloudNews = this.data.getCloudNews.bind(this.data);
857
+ searchCloudNews = this.data.searchCloudNews.bind(this.data);
846
858
  getCloudNewsStory = this.data.getCloudNewsStory.bind(this.data);
847
859
  getCloudTickerTweets = this.data.getCloudTickerTweets.bind(this.data);
848
860
  searchCloudTweets = this.data.searchCloudTweets.bind(this.data);
@@ -1,4 +1,4 @@
1
- import type { CloudCorporateActionsPayload, CloudQuotePayload } from "./types";
1
+ import type { CloudCorporateActionsPayload, CloudMoverSessionFields, CloudQuotePayload } from "./types";
2
2
 
3
3
  export interface ScreenerQuote {
4
4
  symbol: string;
@@ -19,6 +19,8 @@ export interface ScreenerQuote {
19
19
  lastUpdated?: number;
20
20
  /** Session-fixed, so the price column reads its decimals from it rather than from each tick. */
21
21
  previousClose?: number;
22
+ /** The quote's sessions beside the live print the list ranks by, when the server sends them. */
23
+ sessions?: CloudMoverSessionFields;
22
24
  }
23
25
 
24
26
 
@@ -63,6 +65,13 @@ export interface MarketHeatmapResult {
63
65
  session?: "REGULAR" | "PRE" | "POST" | "CLOSED" | null;
64
66
  /** The completed regular session every stored tile describes outside the regular session, as a New York date; null while it trades. */
65
67
  regularSessionDate?: string | null;
68
+ /**
69
+ * When that session closed, in epoch milliseconds: its real close from the
70
+ * exchange calendar, so an early close reads 13:00 New York. Null while a
71
+ * session trades and when the snapshot names no session; an older server
72
+ * leaves it out.
73
+ */
74
+ regularSessionClosedAt?: number | null;
66
75
  assets: MarketHeatmapAsset[];
67
76
  }
68
77
 
@@ -77,7 +86,10 @@ export interface MarketMoversPayload {
77
86
  export interface DividendSummary {
78
87
  trailingAnnualDividendRate: number | null;
79
88
  trailingAnnualDividendYield: number | null;
89
+ /** The indicated annual rate fundamentals serve: the latest regular distribution annualized. */
80
90
  forwardAnnualDividendRate: number | null;
91
+ /** The ex-date of the distribution that rate annualizes, YYYY-MM-DD. */
92
+ forwardRateAsOf?: string | null;
81
93
  payoutRatio: number | null;
82
94
  exDividendDate: number | null;
83
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
  }
@@ -576,6 +576,13 @@ export function cloudNewsPath(params: CloudNewsParams = {}): string {
576
576
  return appendQuery("/news", search);
577
577
  }
578
578
 
579
+ /** Stories whose headline, summary or publisher matches the text, best match first; the service takes at most 100. */
580
+ export function cloudNewsSearchPath(query: string, limit?: number): string {
581
+ const search = new URLSearchParams({ query });
582
+ if (limit != null) search.set("limit", String(limit));
583
+ return appendQuery("/news/search", search);
584
+ }
585
+
579
586
  export function cloudTickerTweetsPath(params: CloudTickerTweetsParams): string {
580
587
  const search = new URLSearchParams({ ticker: params.ticker });
581
588
  if (params.limit != null) search.set("limit", String(params.limit));
@@ -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,
@@ -6,6 +6,9 @@ import { createWallExperimentSession, type WallExperiment, type WallExperimentCo
6
6
  import { createUpgradeExperimentSession, UPGRADE_PERSONALIZED, type UpgradeExperimentContext, type UpgradePersonalizedVariant } from "./upgrade-experiment";
7
7
  import { hasProAccess } from "./plan-rules";
8
8
  import { withDeadline } from "../utils/async-deadline";
9
+ import { browserDoNotTrack } from "../telemetry/crash-reports-dom";
10
+ import { currentTelemetryConfig } from "../telemetry/live-config";
11
+ import { usageTelemetryAllowed } from "../telemetry/usage-counts";
9
12
 
10
13
  export type ResearchActivity =
11
14
  | "workspace_opened"
@@ -234,12 +237,7 @@ function stripHandoffParams(url: URL): void {
234
237
  /** Hosted web analytics only. Native local use never creates an identifier. */
235
238
  export function initializeBrowserResearchActivity(): void {
236
239
  try {
237
- if (
238
- navigator.doNotTrack === "1" ||
239
- (navigator as Navigator & { globalPrivacyControl?: boolean })
240
- .globalPrivacyControl
241
- )
242
- return;
240
+ if (!researchTelemetryAllowed()) return;
243
241
  const url = new URL(location.href);
244
242
  const incoming = readHandoffId(url);
245
243
  const stored = localStorage.getItem(ANONYMOUS_ID_STORAGE_KEY);
@@ -269,6 +267,7 @@ export function initializeBrowserResearchActivity(): void {
269
267
  */
270
268
  export function initializeDesktopResearchActivity(storage: StorageLike = localStorage): void {
271
269
  try {
270
+ if (!researchTelemetryAllowed()) return;
272
271
  const stored = storage.getItem(ANONYMOUS_ID_STORAGE_KEY);
273
272
  anonymousId = stored && ANONYMOUS_ID.test(stored) ? stored : undefined;
274
273
  attribution = readStoredAttribution(storage.getItem(ATTRIBUTION_STORAGE_KEY));
@@ -278,6 +277,7 @@ export function initializeDesktopResearchActivity(storage: StorageLike = localSt
278
277
  }
279
278
 
280
279
  export function adoptDesktopHandoff(href: string, storage: StorageLike = localStorage, now = Date.now()): boolean {
280
+ if (!researchTelemetryAllowed()) return false;
281
281
  if (!carriesHandoff(href)) return false;
282
282
  try {
283
283
  const url = new URL(href);
@@ -369,6 +369,7 @@ export function recordResearchActivity(
369
369
  tab?: string,
370
370
  { desks, placement: rawPlacement, teaser_kind, cta }: ResearchActivityDetails = {},
371
371
  ): void {
372
+ if (!researchTelemetryAllowed()) return;
372
373
  const target = getCurrentPluginTarget();
373
374
  const user = apiClient.getCurrentUser();
374
375
  const wallEvent = event === "wall_viewed" || event === "wall_cta_clicked";
@@ -451,6 +452,7 @@ function webExperimentAttribution(): { experiments?: string } {
451
452
  * Privacy Control) and not driven by automation are asked. See web-experiments.ts.
452
453
  */
453
454
  export function exposeWebExperiment(experiment: string): Promise<string | null> {
455
+ if (!researchTelemetryAllowed()) return Promise.resolve(null);
454
456
  if (getCurrentPluginTarget() !== "web") return Promise.resolve(null);
455
457
  try {
456
458
  return exposeExperiment(experiment, {
@@ -473,11 +475,13 @@ export function exposeWebExperiment(experiment: string): Promise<string | null>
473
475
  }
474
476
  }
475
477
 
478
+ /** Research milestones, attribution and exposures share the Usage off switch. */
479
+ function researchTelemetryAllowed(): boolean {
480
+ return usageTelemetryAllowed(currentTelemetryConfig(undefined)) && !browserDoNotTrack();
481
+ }
482
+
476
483
  function wallPrivacyBlocked(): boolean {
477
- if (typeof navigator === "undefined") return false;
478
- return navigator.doNotTrack === "1"
479
- || (navigator as Navigator & { globalPrivacyControl?: boolean }).globalPrivacyControl === true
480
- || navigator.webdriver === true;
484
+ return !researchTelemetryAllowed() || (typeof navigator !== "undefined" && navigator.webdriver === true);
481
485
  }
482
486
 
483
487
  function wallExperimentContext(): WallExperimentContext {
@@ -568,6 +572,7 @@ export function recordWallCtaClicked(placement: string, cta: "login" | "signup")
568
572
  export function researchUpgradeUrl(returnTo?: string): string {
569
573
  const url = new URL("https://gloom.sh/cloud?upgrade=pro");
570
574
  if (returnTo) url.searchParams.set("returnTo", returnTo);
575
+ if (!researchTelemetryAllowed()) return url.href;
571
576
  if (anonymousId) url.searchParams.set(HANDOFF_ID_KEY, anonymousId);
572
577
  for (const [key, value] of Object.entries(attribution)) {
573
578
  if (/^(utm_(source|medium|campaign|content|term)|twclid)$/.test(key))