gloomberb 0.16.0 → 0.16.2

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 (691) hide show
  1. package/README.md +2 -1
  2. package/package.json +2 -1
  3. package/src/api-client/beneficial-owners.ts +92 -0
  4. package/src/api-client/data.ts +44 -11
  5. package/src/api-client/errors.ts +12 -0
  6. package/src/api-client/geo.ts +363 -0
  7. package/src/api-client/index.ts +5 -0
  8. package/src/api-client/market-discovery.ts +10 -0
  9. package/src/api-client/members.ts +26 -0
  10. package/src/api-client/paths.ts +30 -1
  11. package/src/api-client/perps.ts +41 -0
  12. package/src/api-client/request.ts +5 -2
  13. package/src/api-client/types.ts +9 -1
  14. package/src/app/global-shortcuts.ts +14 -6
  15. package/src/app/keybindings/actions.ts +1 -1
  16. package/src/app/runtime/update.ts +38 -2
  17. package/src/app.tsx +10 -6
  18. package/src/brokers/account-cache.ts +24 -0
  19. package/src/cli/commands/command-utils.ts +8 -0
  20. package/src/cli/commands/crypto-hints.ts +75 -0
  21. package/src/cli/commands/market.ts +414 -106
  22. package/src/cli/commands/overview.ts +77 -32
  23. package/src/cli/commands/ticker.ts +101 -43
  24. package/src/cli/desktop-pane-shot.ts +34 -4
  25. package/src/cli/freshness.ts +61 -0
  26. package/src/cli/help.ts +1 -0
  27. package/src/cli/helpers.ts +4 -8
  28. package/src/cli/index.ts +12 -2
  29. package/src/cli/listing-arg.ts +321 -0
  30. package/src/cli/pane-functions/access-gate.ts +42 -0
  31. package/src/cli/pane-functions/catalog.ts +28 -1
  32. package/src/cli/pane-functions/data.ts +3 -1
  33. package/src/cli/pane-functions/dom.ts +20 -2
  34. package/src/cli/pane-functions/freshness.ts +400 -0
  35. package/src/cli/pane-functions/function-help.ts +36 -22
  36. package/src/cli/pane-functions/headless.ts +39 -11
  37. package/src/cli/pane-functions/index.ts +15 -4
  38. package/src/cli/pane-functions/options.ts +3 -0
  39. package/src/cli/pane-functions/report.ts +4 -0
  40. package/src/cli/pane-functions/resolver.ts +35 -7
  41. package/src/cli/pane-functions/screenshot-evidence.ts +2 -0
  42. package/src/cli/pane-functions/screenshot.ts +7 -3
  43. package/src/cli/result.ts +41 -27
  44. package/src/cli/ticker-resolution.ts +7 -5
  45. package/src/components/chart/composite/composite-chart.tsx +88 -2536
  46. package/src/components/chart/composite/drawing-store.ts +59 -0
  47. package/src/components/chart/composite/legend.tsx +319 -0
  48. package/src/components/chart/composite/panel-bitmap.ts +139 -0
  49. package/src/components/chart/composite/panel-gestures.ts +59 -0
  50. package/src/components/chart/composite/panel-labels.ts +107 -0
  51. package/src/components/chart/composite/panel-surface.tsx +876 -0
  52. package/src/components/chart/composite/tool-catalog.ts +98 -0
  53. package/src/components/chart/composite/toolbar.tsx +186 -0
  54. package/src/components/chart/composite/tools.ts +8 -0
  55. package/src/components/chart/composite/use-composite-chart-keyboard.ts +703 -0
  56. package/src/components/chart/composite/use-composite-viewport.ts +143 -0
  57. package/src/components/command-bar/commands/collection.ts +5 -1
  58. package/src/components/command-bar/list/model.ts +5 -0
  59. package/src/components/command-bar/list/view.tsx +16 -3
  60. package/src/components/command-bar/pane-templates/workflow.ts +1 -0
  61. package/src/components/command-bar/routes/root/command-items.ts +9 -2
  62. package/src/components/command-bar/routes/root/plugin-install.ts +2 -2
  63. package/src/components/command-bar/routes/root/provider-search.ts +19 -5
  64. package/src/components/command-bar/routes/root/runtime.ts +14 -5
  65. package/src/components/command-bar/routes/ticker-search/actions.ts +5 -0
  66. package/src/components/command-bar/routes/ticker-search/results.ts +31 -5
  67. package/src/components/command-bar/routes/ticker-search/route.ts +2 -2
  68. package/src/components/command-bar/routing/actions.ts +2 -0
  69. package/src/components/command-bar/selection-runtime.ts +38 -0
  70. package/src/components/command-bar/surface/index.tsx +7 -2
  71. package/src/components/command-bar/workflow/ops.ts +1 -1
  72. package/src/components/command-bar/workflow/tickers.ts +6 -0
  73. package/src/components/data-table/view.tsx +29 -10
  74. package/src/components/feedback-dialog.tsx +2 -1
  75. package/src/components/form-modal/field-row.tsx +2 -2
  76. package/src/components/index.ts +2 -2
  77. package/src/components/layout/detached-pane-shell.tsx +6 -3
  78. package/src/components/layout/floating-pane.tsx +6 -0
  79. package/src/components/layout/header.tsx +24 -7
  80. package/src/components/layout/missing-pane.tsx +2 -2
  81. package/src/components/layout/pane/content.tsx +23 -10
  82. package/src/components/layout/pane/error-boundary.tsx +103 -0
  83. package/src/components/layout/pane/footer/registration.tsx +68 -23
  84. package/src/components/layout/pane/header.tsx +61 -28
  85. package/src/components/layout/pane/index.tsx +6 -0
  86. package/src/components/layout/pane/title.ts +31 -7
  87. package/src/components/layout/shell/drag/index.ts +6 -5
  88. package/src/components/layout/shell/drag/runtime.ts +3 -0
  89. package/src/components/layout/shell/index.tsx +6 -0
  90. package/src/components/layout/shell/menu.ts +2 -1
  91. package/src/components/layout/shell/pane/actions.ts +2 -1
  92. package/src/components/layout/shell/pane/layers.tsx +29 -10
  93. package/src/components/layout/shell/terminal-pointer-runtime.ts +24 -3
  94. package/src/components/layout/shell/ticker-link-menu.ts +23 -9
  95. package/src/components/metric-treemap/heat-surface.tsx +745 -0
  96. package/src/components/metric-treemap/heat-tiles.ts +228 -0
  97. package/src/components/metric-treemap/index.tsx +2 -0
  98. package/src/components/metric-treemap/layout.ts +8 -0
  99. package/src/components/metric-treemap/scene.ts +432 -0
  100. package/src/components/onboarding/onboarding-keyboard.ts +311 -0
  101. package/src/components/onboarding/onboarding-wizard.tsx +101 -788
  102. package/src/components/onboarding/use-onboarding-broker-form.ts +263 -0
  103. package/src/components/onboarding/use-onboarding-progress.ts +298 -0
  104. package/src/components/onboarding/use-onboarding-upgrade.ts +83 -0
  105. package/src/components/pane-settings-dialog/field-dialogs.tsx +1 -0
  106. package/src/components/ticker/list-table-view.tsx +13 -1
  107. package/src/components/toggle-list.tsx +38 -12
  108. package/src/components/ui/country-flag-art.tsx +449 -0
  109. package/src/components/ui/country-flag.tsx +41 -0
  110. package/src/components/ui/data-table/types.ts +13 -0
  111. package/src/components/ui/fields.tsx +8 -0
  112. package/src/components/ui/icon.tsx +2 -0
  113. package/src/components/ui/index.ts +4 -0
  114. package/src/components/ui/multi-select/dialog.tsx +108 -22
  115. package/src/components/ui/range-track.tsx +53 -0
  116. package/src/components/ui/status.tsx +8 -2
  117. package/src/components/ui/tabs.tsx +11 -4
  118. package/src/components/ui/text-prompt-dialog.tsx +4 -2
  119. package/src/core/state/app/types.ts +10 -1
  120. package/src/data/config/store/normalize.ts +17 -1
  121. package/src/i18n/es.ts +24 -4
  122. package/src/i18n/ja.ts +24 -4
  123. package/src/i18n/ko.ts +24 -4
  124. package/src/i18n/zh-cn.ts +24 -4
  125. package/src/i18n/zh-tw.ts +24 -4
  126. package/src/layout/ticker-navigation.ts +28 -2
  127. package/src/market-data/coordinator/chart.ts +1 -1
  128. package/src/market-data/coordinator/quotes.ts +23 -4
  129. package/src/market-data/fx-closes.ts +72 -0
  130. package/src/market-data/market/freshness.ts +78 -6
  131. package/src/market-data/market/session-close-note.ts +57 -0
  132. package/src/market-data/market/status.ts +151 -0
  133. package/src/market-data/published-apac-sessions.ts +66 -0
  134. package/src/market-data/quotes/contributions.ts +8 -0
  135. package/src/market-data/quotes/freshness.ts +36 -0
  136. package/src/market-data/quotes/resolution.ts +24 -8
  137. package/src/market-data/quotes/screener-live-quotes.ts +49 -4
  138. package/src/market-data/quotes/time.ts +16 -0
  139. package/src/plugins/builtin/account-management/pane.tsx +4 -0
  140. package/src/plugins/builtin/alerts/cli.ts +10 -5
  141. package/src/plugins/builtin/alerts/index.tsx +1 -0
  142. package/src/plugins/builtin/analytics/metrics.ts +8 -3
  143. package/src/plugins/builtin/analytics/risk-client.ts +330 -79
  144. package/src/plugins/builtin/analytics/risk-fx.ts +102 -0
  145. package/src/plugins/builtin/analytics/risk-headless.ts +61 -49
  146. package/src/plugins/builtin/analytics/risk-math.ts +33 -13
  147. package/src/plugins/builtin/analytics/risk-model.ts +282 -64
  148. package/src/plugins/builtin/analytics/risk-pane.tsx +62 -30
  149. package/src/plugins/builtin/analytics/risk-test-data.ts +206 -0
  150. package/src/plugins/builtin/attention/headless.ts +6 -4
  151. package/src/plugins/builtin/attention/index.tsx +1 -1
  152. package/src/plugins/builtin/attention/pane.tsx +1 -1
  153. package/src/plugins/builtin/awards/headless.ts +1 -0
  154. package/src/plugins/builtin/awards/pane.tsx +1 -1
  155. package/src/plugins/builtin/backtest/headless.ts +1 -0
  156. package/src/plugins/builtin/bond-calculator/headless.ts +1 -0
  157. package/src/plugins/builtin/buildout/cells.tsx +15 -12
  158. package/src/plugins/builtin/buildout/detail/company.tsx +3 -3
  159. package/src/plugins/builtin/buildout/detail/index.tsx +0 -1
  160. package/src/plugins/builtin/buildout/detail/intel.tsx +6 -6
  161. package/src/plugins/builtin/buildout/detail/site.tsx +4 -7
  162. package/src/plugins/builtin/buildout/detail/ui.tsx +0 -19
  163. package/src/plugins/builtin/buildout/index.tsx +1 -0
  164. package/src/plugins/builtin/catalysts/headless.ts +3 -1
  165. package/src/plugins/builtin/catalysts/index.tsx +2 -2
  166. package/src/plugins/builtin/catalysts/pane.tsx +3 -1
  167. package/src/plugins/builtin/cds/headless.ts +2 -0
  168. package/src/plugins/builtin/cds/index.tsx +1 -0
  169. package/src/plugins/builtin/central-bank-rates/headless.ts +1 -0
  170. package/src/plugins/builtin/chart-composer/headless.ts +38 -3
  171. package/src/plugins/builtin/chart-composer/index.tsx +3 -1
  172. package/src/plugins/builtin/chart-composer/series-expression.ts +18 -2
  173. package/src/plugins/builtin/chat/channels.ts +19 -3
  174. package/src/plugins/builtin/chat/content/composer-runtime.ts +28 -13
  175. package/src/plugins/builtin/chat/content/footer.tsx +15 -6
  176. package/src/plugins/builtin/chat/content/index.tsx +120 -21
  177. package/src/plugins/builtin/chat/content/new-dm-dialog.tsx +261 -113
  178. package/src/plugins/builtin/chat/content/transcript.tsx +20 -2
  179. package/src/plugins/builtin/chat/direct-messages.ts +200 -0
  180. package/src/plugins/builtin/chat/index.tsx +1 -0
  181. package/src/plugins/builtin/chat/message/desktop.tsx +3 -0
  182. package/src/plugins/builtin/chat/message/header.tsx +16 -6
  183. package/src/plugins/builtin/chat/message/inline-tokens.tsx +72 -32
  184. package/src/plugins/builtin/chat/message/profile-popover.tsx +96 -12
  185. package/src/plugins/builtin/chat/message/terminal.tsx +3 -0
  186. package/src/plugins/builtin/chat/message/types.ts +14 -2
  187. package/src/plugins/builtin/chat/profile-popover.ts +18 -13
  188. package/src/plugins/builtin/clinical-trials/index.tsx +1 -0
  189. package/src/plugins/builtin/cloud/askg/executor.ts +2 -1
  190. package/src/plugins/builtin/cloud/plugin.tsx +1 -0
  191. package/src/plugins/builtin/cloud/team/module.tsx +1 -0
  192. package/src/plugins/builtin/cloud/thesis/module.tsx +1 -0
  193. package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
  194. package/src/plugins/builtin/comment-letters/index.tsx +1 -0
  195. package/src/plugins/builtin/company-attention/headless.ts +5 -1
  196. package/src/plugins/builtin/company-attention/pane.tsx +1 -1
  197. package/src/plugins/builtin/company-kpis/headless.ts +1 -0
  198. package/src/plugins/builtin/congress-trades/headless.ts +1 -0
  199. package/src/plugins/builtin/correlation/compute.ts +59 -16
  200. package/src/plugins/builtin/correlation/geo.ts +34 -0
  201. package/src/plugins/builtin/correlation/headless-schema.ts +4 -1
  202. package/src/plugins/builtin/correlation/headless.ts +42 -8
  203. package/src/plugins/builtin/correlation/history.ts +2 -0
  204. package/src/plugins/builtin/correlation/index.tsx +68 -14
  205. package/src/plugins/builtin/correlation/matrix/model.ts +17 -2
  206. package/src/plugins/builtin/correlation/matrix/selection.ts +5 -3
  207. package/src/plugins/builtin/correlation/relationship/model.ts +1 -1
  208. package/src/plugins/builtin/correlation/relationship/pane.tsx +4 -2
  209. package/src/plugins/builtin/correlation/relationship/view-model.ts +16 -1
  210. package/src/plugins/builtin/correlation/settings.ts +1 -1
  211. package/src/plugins/builtin/cot/headless.ts +6 -3
  212. package/src/plugins/builtin/cot/index.tsx +3 -3
  213. package/src/plugins/builtin/cot/model.ts +36 -3
  214. package/src/plugins/builtin/cpi/headless.ts +4 -0
  215. package/src/plugins/builtin/credit-boards/headless.ts +2 -0
  216. package/src/plugins/builtin/credit-conditions/headless.ts +1 -0
  217. package/src/plugins/builtin/credit-documents/gauge.tsx +5 -8
  218. package/src/plugins/builtin/credit-documents/headless.ts +2 -0
  219. package/src/plugins/builtin/crypto-board/headless.ts +3 -0
  220. package/src/plugins/builtin/custom-view/loader.ts +1 -1
  221. package/src/plugins/builtin/debt-maturities/headless.ts +4 -0
  222. package/src/plugins/builtin/debt-maturities/wall-bar.tsx +14 -41
  223. package/src/plugins/builtin/dividend-yield/client.ts +4 -2
  224. package/src/plugins/builtin/dividend-yield/headless.ts +1 -0
  225. package/src/plugins/builtin/doe/headless.ts +7 -0
  226. package/src/plugins/builtin/doe/range-bar.tsx +7 -37
  227. package/src/plugins/builtin/earnings/client.ts +2 -2
  228. package/src/plugins/builtin/earnings/headless.ts +5 -0
  229. package/src/plugins/builtin/earnings-calls/headless.ts +1 -0
  230. package/src/plugins/builtin/earnings-calls/index.tsx +1 -0
  231. package/src/plugins/builtin/earnings-ripple/client.ts +91 -18
  232. package/src/plugins/builtin/earnings-ripple/headless.ts +28 -8
  233. package/src/plugins/builtin/earnings-ripple/index.tsx +2 -2
  234. package/src/plugins/builtin/earnings-ripple/model.ts +97 -7
  235. package/src/plugins/builtin/earnings-ripple/pane.tsx +148 -23
  236. package/src/plugins/builtin/econ/index.tsx +1 -0
  237. package/src/plugins/builtin/econ-statistics/headless.ts +2 -0
  238. package/src/plugins/builtin/equity-screener/headless.ts +2 -0
  239. package/src/plugins/builtin/estimate-revisions/headless.ts +1 -0
  240. package/src/plugins/builtin/executives/index.tsx +1 -0
  241. package/src/plugins/builtin/exposure/headless.ts +3 -1
  242. package/src/plugins/builtin/fear-greed/headless.ts +2 -0
  243. package/src/plugins/builtin/filing-events/index.tsx +1 -0
  244. package/src/plugins/builtin/futures-curve/client.ts +12 -3
  245. package/src/plugins/builtin/futures-curve/headless.ts +39 -10
  246. package/src/plugins/builtin/futures-curve/index.tsx +3 -3
  247. package/src/plugins/builtin/futures-curve/model.ts +188 -4
  248. package/src/plugins/builtin/futures-curve/pane.tsx +51 -9
  249. package/src/plugins/builtin/fx-matrix/direction.ts +81 -0
  250. package/src/plugins/builtin/fx-matrix/index.tsx +71 -33
  251. package/src/plugins/builtin/fx-matrix/live-legs.ts +17 -0
  252. package/src/plugins/builtin/fx-matrix/pairs.ts +68 -14
  253. package/src/plugins/builtin/fx-matrix/settings.ts +62 -0
  254. package/src/plugins/builtin/gpu/headless.ts +7 -3
  255. package/src/plugins/builtin/gpu/ladder.tsx +26 -30
  256. package/src/plugins/builtin/gpu/model.ts +27 -1
  257. package/src/plugins/builtin/holders/beneficial-client.ts +209 -0
  258. package/src/plugins/builtin/holders/beneficial-model.ts +279 -0
  259. package/src/plugins/builtin/holders/beneficial-report.ts +126 -0
  260. package/src/plugins/builtin/holders/beneficial-view.tsx +241 -0
  261. package/src/plugins/builtin/holders/headless.ts +139 -5
  262. package/src/plugins/builtin/holders/index.tsx +10 -3
  263. package/src/plugins/builtin/holders/pane.tsx +20 -3
  264. package/src/plugins/builtin/holders/report-header.ts +95 -0
  265. package/src/plugins/builtin/holders/table-model.ts +20 -5
  266. package/src/plugins/builtin/holders/thirteenf-match.ts +29 -1
  267. package/src/plugins/builtin/holders/types.ts +2 -1
  268. package/src/plugins/builtin/insider/headless.ts +2 -0
  269. package/src/plugins/builtin/ipo-calendar/headless.ts +1 -0
  270. package/src/plugins/builtin/iv-history/headless.ts +4 -1
  271. package/src/plugins/builtin/jobs/headless.ts +1 -0
  272. package/src/plugins/builtin/jobs/index.tsx +1 -0
  273. package/src/plugins/builtin/jobs/share-bars.tsx +5 -28
  274. package/src/plugins/builtin/kelly-sizer/index.tsx +1 -0
  275. package/src/plugins/builtin/macro-day/headless.ts +2 -0
  276. package/src/plugins/builtin/market-halts/index.tsx +1 -0
  277. package/src/plugins/builtin/market-heatmap/data.ts +30 -2
  278. package/src/plugins/builtin/market-heatmap/headless.ts +135 -0
  279. package/src/plugins/builtin/market-heatmap/index.tsx +245 -81
  280. package/src/plugins/builtin/market-heatmap/live.ts +88 -0
  281. package/src/plugins/builtin/market-heatmap/model.ts +146 -0
  282. package/src/plugins/builtin/market-heatmap/portfolio.ts +50 -11
  283. package/src/plugins/builtin/market-movers/client.ts +3 -2
  284. package/src/plugins/builtin/market-movers/headless.ts +10 -1
  285. package/src/plugins/builtin/market-movers/screener.ts +18 -5
  286. package/src/plugins/builtin/market-valuation/headless.ts +2 -0
  287. package/src/plugins/builtin/members/client.ts +53 -0
  288. package/src/plugins/builtin/members/headless.ts +35 -0
  289. package/src/plugins/builtin/members/index.tsx +20 -0
  290. package/src/plugins/builtin/members/model.ts +68 -0
  291. package/src/plugins/builtin/members/pane.tsx +175 -0
  292. package/src/plugins/builtin/mna/distress/headless.ts +1 -0
  293. package/src/plugins/builtin/mna/headless.ts +1 -0
  294. package/src/plugins/builtin/mna/index.tsx +2 -1
  295. package/src/plugins/builtin/mna/pane.tsx +5 -2
  296. package/src/plugins/builtin/money-markets/headless.ts +1 -0
  297. package/src/plugins/builtin/news/headless.ts +2 -0
  298. package/src/plugins/builtin/news/wire/index.tsx +8 -1
  299. package/src/plugins/builtin/notes/cli.ts +14 -6
  300. package/src/plugins/builtin/notes/index.tsx +1 -0
  301. package/src/plugins/builtin/openfda/index.tsx +1 -0
  302. package/src/plugins/builtin/options/index.tsx +2 -1
  303. package/src/plugins/builtin/options-calculator/headless.ts +2 -0
  304. package/src/plugins/builtin/options-positioning/headless.ts +3 -0
  305. package/src/plugins/builtin/options-scenario/headless.ts +5 -0
  306. package/src/plugins/builtin/pe-band/client.ts +74 -2
  307. package/src/plugins/builtin/pe-band/headless.ts +26 -8
  308. package/src/plugins/builtin/pe-band/model.ts +102 -22
  309. package/src/plugins/builtin/pe-band/pane.tsx +34 -16
  310. package/src/plugins/builtin/pe-band/report-dates.ts +78 -0
  311. package/src/plugins/builtin/perps/client.ts +66 -5
  312. package/src/plugins/builtin/perps/equity-identity.ts +16 -0
  313. package/src/plugins/builtin/perps/equity-row.tsx +6 -4
  314. package/src/plugins/builtin/perps/headless.ts +144 -16
  315. package/src/plugins/builtin/perps/index.tsx +6 -6
  316. package/src/plugins/builtin/perps/model.ts +189 -12
  317. package/src/plugins/builtin/perps/pane.tsx +248 -47
  318. package/src/plugins/builtin/plugin-marketplace/activation.ts +19 -0
  319. package/src/plugins/builtin/plugin-marketplace/pane.tsx +2 -2
  320. package/src/plugins/builtin/plugin-marketplace/store.ts +2 -0
  321. package/src/plugins/builtin/portfolio-list/allocation.ts +245 -0
  322. package/src/plugins/builtin/portfolio-list/cached-account.ts +33 -0
  323. package/src/plugins/builtin/portfolio-list/cell-version.ts +19 -1
  324. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +328 -29
  325. package/src/plugins/builtin/portfolio-list/cli/render.ts +230 -39
  326. package/src/plugins/builtin/portfolio-list/cli/shared.ts +67 -2
  327. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +35 -31
  328. package/src/plugins/builtin/portfolio-list/column-values.ts +124 -47
  329. package/src/plugins/builtin/portfolio-list/headless.ts +98 -16
  330. package/src/plugins/builtin/portfolio-list/index.tsx +14 -3
  331. package/src/plugins/builtin/portfolio-list/live-valuation.ts +7 -5
  332. package/src/plugins/builtin/portfolio-list/mutations.ts +55 -1
  333. package/src/plugins/builtin/portfolio-list/pane/data.ts +6 -0
  334. package/src/plugins/builtin/portfolio-list/pane/index.tsx +47 -13
  335. package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +43 -2
  336. package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +48 -5
  337. package/src/plugins/builtin/portfolio-list/settings.ts +33 -2
  338. package/src/plugins/builtin/portfolio-list/summary/index.tsx +24 -1
  339. package/src/plugins/builtin/portfolio-list/summary/totals.ts +26 -7
  340. package/src/plugins/builtin/power/headless.ts +3 -1
  341. package/src/plugins/builtin/rate-path/headless.ts +2 -0
  342. package/src/plugins/builtin/realized-vol/headless.ts +2 -0
  343. package/src/plugins/builtin/relative-rotation/headless.ts +2 -0
  344. package/src/plugins/builtin/research/analyst-headless.ts +3 -0
  345. package/src/plugins/builtin/research/events-headless.ts +2 -0
  346. package/src/plugins/builtin/research/headless.ts +2 -0
  347. package/src/plugins/builtin/research/index.tsx +1 -0
  348. package/src/plugins/builtin/research/relative-valuation-headless.ts +10 -5
  349. package/src/plugins/builtin/research/relative-valuation-model.ts +11 -3
  350. package/src/plugins/builtin/research/relative-valuation-pane.tsx +3 -3
  351. package/src/plugins/builtin/research-search/index.tsx +1 -0
  352. package/src/plugins/builtin/revenue-breakdown/headless.ts +2 -0
  353. package/src/plugins/builtin/reverse-dcf/headless.ts +2 -0
  354. package/src/plugins/builtin/risk-factors/headless.ts +2 -0
  355. package/src/plugins/builtin/scanner/flow-history.ts +2 -13
  356. package/src/plugins/builtin/scanner/headless.ts +14 -0
  357. package/src/plugins/builtin/scanner/hilo-bars.tsx +12 -70
  358. package/src/plugins/builtin/scanner/hilo-model.ts +0 -18
  359. package/src/plugins/builtin/seasonality/headless.ts +2 -0
  360. package/src/plugins/builtin/sec/command-bar-search.ts +14 -4
  361. package/src/plugins/builtin/sec/filing-content.ts +42 -17
  362. package/src/plugins/builtin/sec/forms.ts +12 -0
  363. package/src/plugins/builtin/sec/headless.ts +2 -0
  364. package/src/plugins/builtin/sectors/client.ts +1 -0
  365. package/src/plugins/builtin/sectors/headless.ts +9 -1
  366. package/src/plugins/builtin/sectors/move-bar.tsx +10 -32
  367. package/src/plugins/builtin/sectors/sector-model.ts +2 -0
  368. package/src/plugins/builtin/shared/crypto-pair.ts +14 -0
  369. package/src/plugins/builtin/shared/locked-rows.tsx +1 -1
  370. package/src/plugins/builtin/shared/report-freshness.ts +57 -0
  371. package/src/plugins/builtin/shared/research-cells.tsx +4 -9
  372. package/src/plugins/builtin/short-interest/headless.ts +2 -0
  373. package/src/plugins/builtin/short-interest/watch-headless.ts +1 -0
  374. package/src/plugins/builtin/short-volume/headless.ts +1 -0
  375. package/src/plugins/builtin/social-mentions/headless.ts +1 -0
  376. package/src/plugins/builtin/social-mentions/index.tsx +1 -1
  377. package/src/plugins/builtin/supply-chain/headless.ts +7 -1
  378. package/src/plugins/builtin/supply-chain/index.tsx +10 -1
  379. package/src/plugins/builtin/supply-chain/model.ts +27 -2
  380. package/src/plugins/builtin/supply-chain/pane.tsx +71 -32
  381. package/src/plugins/builtin/themes/headless.ts +3 -0
  382. package/src/plugins/builtin/thirteenf/headless.ts +110 -25
  383. package/src/plugins/builtin/thirteenf/index.tsx +2 -1
  384. package/src/plugins/builtin/thirteenf/report-notes.ts +149 -0
  385. package/src/plugins/builtin/ticker-detail/headless.ts +7 -1
  386. package/src/plugins/builtin/ticker-detail/index.tsx +1 -0
  387. package/src/plugins/builtin/ticker-detail/overview/components.tsx +5 -60
  388. package/src/plugins/builtin/ticker-detail/overview/model.ts +9 -2
  389. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +1 -1
  390. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +26 -26
  391. package/src/plugins/builtin/ticker-detail/pane.tsx +1 -1
  392. package/src/plugins/builtin/ticker-detail/quote-footer.ts +7 -1
  393. package/src/plugins/builtin/ticker-detail/quote-monitor/card.tsx +20 -4
  394. package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +2 -2
  395. package/src/plugins/builtin/time-sales/headless.ts +5 -1
  396. package/src/plugins/builtin/treasury-auctions/headless.ts +1 -0
  397. package/src/plugins/builtin/vol-surface/index.tsx +1 -1
  398. package/src/plugins/builtin/volatility/headless.ts +6 -1
  399. package/src/plugins/builtin/world-indices/headless.ts +2 -0
  400. package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +157 -0
  401. package/src/plugins/builtin/world-venue-map/basemap.ts +214 -0
  402. package/src/plugins/builtin/world-venue-map/client.ts +45 -0
  403. package/src/plugins/builtin/world-venue-map/entity-detail.tsx +147 -0
  404. package/src/plugins/builtin/world-venue-map/entity-table.ts +59 -0
  405. package/src/plugins/builtin/world-venue-map/evidence.ts +77 -0
  406. package/src/plugins/builtin/world-venue-map/feed.ts +293 -0
  407. package/src/plugins/builtin/world-venue-map/geo-draw.tsx +248 -0
  408. package/src/plugins/builtin/world-venue-map/geo-series.ts +142 -0
  409. package/src/plugins/builtin/world-venue-map/geo-svg.tsx +447 -0
  410. package/src/plugins/builtin/world-venue-map/headless.ts +146 -0
  411. package/src/plugins/builtin/world-venue-map/ids.ts +1 -0
  412. package/src/plugins/builtin/world-venue-map/index.ts +67 -4
  413. package/src/plugins/builtin/world-venue-map/layered-pane.tsx +552 -0
  414. package/src/plugins/builtin/world-venue-map/layers.ts +348 -0
  415. package/src/plugins/builtin/world-venue-map/map-symbols.ts +220 -0
  416. package/src/plugins/builtin/world-venue-map/map.tsx +381 -45
  417. package/src/plugins/builtin/world-venue-map/model.ts +7 -4
  418. package/src/plugins/builtin/world-venue-map/natural-earth/index.chunk.ts +199 -0
  419. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n00.chunk.ts +4 -0
  420. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n15.chunk.ts +4 -0
  421. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n30.chunk.ts +4 -0
  422. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n45.chunk.ts +4 -0
  423. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n60.chunk.ts +4 -0
  424. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n75.chunk.ts +4 -0
  425. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000s15.chunk.ts +4 -0
  426. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000s30.chunk.ts +4 -0
  427. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000s60.chunk.ts +4 -0
  428. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n00.chunk.ts +4 -0
  429. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n15.chunk.ts +4 -0
  430. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n30.chunk.ts +4 -0
  431. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n45.chunk.ts +4 -0
  432. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n60.chunk.ts +4 -0
  433. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n75.chunk.ts +4 -0
  434. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015s15.chunk.ts +4 -0
  435. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015s30.chunk.ts +4 -0
  436. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015s45.chunk.ts +4 -0
  437. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n00.chunk.ts +4 -0
  438. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n15.chunk.ts +4 -0
  439. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n30.chunk.ts +4 -0
  440. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n45.chunk.ts +4 -0
  441. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n60.chunk.ts +4 -0
  442. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n75.chunk.ts +4 -0
  443. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s15.chunk.ts +4 -0
  444. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s30.chunk.ts +4 -0
  445. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s45.chunk.ts +4 -0
  446. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s60.chunk.ts +4 -0
  447. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n00.chunk.ts +4 -0
  448. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n15.chunk.ts +4 -0
  449. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n30.chunk.ts +4 -0
  450. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n45.chunk.ts +4 -0
  451. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n60.chunk.ts +4 -0
  452. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n75.chunk.ts +4 -0
  453. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045s15.chunk.ts +4 -0
  454. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045s30.chunk.ts +4 -0
  455. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045s60.chunk.ts +4 -0
  456. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n00.chunk.ts +4 -0
  457. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n15.chunk.ts +4 -0
  458. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n30.chunk.ts +4 -0
  459. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n45.chunk.ts +4 -0
  460. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n60.chunk.ts +4 -0
  461. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n75.chunk.ts +4 -0
  462. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060s15.chunk.ts +4 -0
  463. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060s30.chunk.ts +4 -0
  464. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060s60.chunk.ts +4 -0
  465. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n00.chunk.ts +4 -0
  466. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n15.chunk.ts +4 -0
  467. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n30.chunk.ts +4 -0
  468. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n45.chunk.ts +4 -0
  469. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n60.chunk.ts +4 -0
  470. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n75.chunk.ts +4 -0
  471. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075s45.chunk.ts +4 -0
  472. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n00.chunk.ts +4 -0
  473. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n15.chunk.ts +4 -0
  474. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n30.chunk.ts +4 -0
  475. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n45.chunk.ts +4 -0
  476. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n60.chunk.ts +4 -0
  477. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n75.chunk.ts +4 -0
  478. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090s15.chunk.ts +4 -0
  479. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n00.chunk.ts +4 -0
  480. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n15.chunk.ts +4 -0
  481. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n30.chunk.ts +4 -0
  482. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n45.chunk.ts +4 -0
  483. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n60.chunk.ts +4 -0
  484. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n75.chunk.ts +4 -0
  485. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105s15.chunk.ts +4 -0
  486. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105s30.chunk.ts +4 -0
  487. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105s45.chunk.ts +4 -0
  488. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n00.chunk.ts +4 -0
  489. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n15.chunk.ts +4 -0
  490. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n30.chunk.ts +4 -0
  491. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n45.chunk.ts +4 -0
  492. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n60.chunk.ts +4 -0
  493. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120s15.chunk.ts +4 -0
  494. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120s30.chunk.ts +4 -0
  495. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120s45.chunk.ts +4 -0
  496. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n00.chunk.ts +4 -0
  497. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n15.chunk.ts +4 -0
  498. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n30.chunk.ts +4 -0
  499. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n45.chunk.ts +4 -0
  500. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n60.chunk.ts +4 -0
  501. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n75.chunk.ts +4 -0
  502. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135s15.chunk.ts +4 -0
  503. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135s30.chunk.ts +4 -0
  504. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135s45.chunk.ts +4 -0
  505. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n00.chunk.ts +4 -0
  506. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n15.chunk.ts +4 -0
  507. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n45.chunk.ts +4 -0
  508. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n60.chunk.ts +4 -0
  509. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n75.chunk.ts +4 -0
  510. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s15.chunk.ts +4 -0
  511. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s30.chunk.ts +4 -0
  512. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s45.chunk.ts +4 -0
  513. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s60.chunk.ts +4 -0
  514. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n00.chunk.ts +4 -0
  515. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n15.chunk.ts +4 -0
  516. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n45.chunk.ts +4 -0
  517. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n60.chunk.ts +4 -0
  518. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s15.chunk.ts +4 -0
  519. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s30.chunk.ts +4 -0
  520. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s45.chunk.ts +4 -0
  521. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s60.chunk.ts +4 -0
  522. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n00.chunk.ts +4 -0
  523. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n15.chunk.ts +4 -0
  524. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n30.chunk.ts +4 -0
  525. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n45.chunk.ts +4 -0
  526. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n60.chunk.ts +4 -0
  527. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n75.chunk.ts +4 -0
  528. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015s15.chunk.ts +4 -0
  529. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015s30.chunk.ts +4 -0
  530. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015s45.chunk.ts +4 -0
  531. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n00.chunk.ts +4 -0
  532. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n15.chunk.ts +4 -0
  533. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n30.chunk.ts +4 -0
  534. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n60.chunk.ts +4 -0
  535. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n75.chunk.ts +4 -0
  536. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030s30.chunk.ts +4 -0
  537. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030s60.chunk.ts +4 -0
  538. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n30.chunk.ts +4 -0
  539. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n45.chunk.ts +4 -0
  540. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n60.chunk.ts +4 -0
  541. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n75.chunk.ts +4 -0
  542. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045s15.chunk.ts +4 -0
  543. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045s30.chunk.ts +4 -0
  544. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045s60.chunk.ts +4 -0
  545. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n00.chunk.ts +4 -0
  546. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n30.chunk.ts +4 -0
  547. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n45.chunk.ts +4 -0
  548. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n60.chunk.ts +4 -0
  549. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n75.chunk.ts +4 -0
  550. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s15.chunk.ts +4 -0
  551. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s30.chunk.ts +4 -0
  552. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s45.chunk.ts +4 -0
  553. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s60.chunk.ts +4 -0
  554. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n00.chunk.ts +4 -0
  555. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n15.chunk.ts +4 -0
  556. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n30.chunk.ts +4 -0
  557. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n45.chunk.ts +4 -0
  558. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n60.chunk.ts +4 -0
  559. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n75.chunk.ts +4 -0
  560. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s15.chunk.ts +4 -0
  561. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s30.chunk.ts +4 -0
  562. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s45.chunk.ts +4 -0
  563. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s60.chunk.ts +4 -0
  564. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n00.chunk.ts +4 -0
  565. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n15.chunk.ts +4 -0
  566. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n30.chunk.ts +4 -0
  567. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n45.chunk.ts +4 -0
  568. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n60.chunk.ts +4 -0
  569. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n75.chunk.ts +4 -0
  570. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s15.chunk.ts +4 -0
  571. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s30.chunk.ts +4 -0
  572. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s45.chunk.ts +4 -0
  573. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s60.chunk.ts +4 -0
  574. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n00.chunk.ts +4 -0
  575. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n15.chunk.ts +4 -0
  576. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n30.chunk.ts +4 -0
  577. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n45.chunk.ts +4 -0
  578. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n60.chunk.ts +4 -0
  579. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n75.chunk.ts +4 -0
  580. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105s15.chunk.ts +4 -0
  581. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n00.chunk.ts +4 -0
  582. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n15.chunk.ts +4 -0
  583. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n30.chunk.ts +4 -0
  584. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n45.chunk.ts +4 -0
  585. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n60.chunk.ts +4 -0
  586. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n75.chunk.ts +4 -0
  587. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120s30.chunk.ts +4 -0
  588. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n30.chunk.ts +4 -0
  589. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n45.chunk.ts +4 -0
  590. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n60.chunk.ts +4 -0
  591. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n75.chunk.ts +4 -0
  592. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135s30.chunk.ts +4 -0
  593. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150n45.chunk.ts +4 -0
  594. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150n60.chunk.ts +4 -0
  595. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150s15.chunk.ts +4 -0
  596. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150s30.chunk.ts +4 -0
  597. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n00.chunk.ts +4 -0
  598. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n15.chunk.ts +4 -0
  599. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n45.chunk.ts +4 -0
  600. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n60.chunk.ts +4 -0
  601. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165s15.chunk.ts +4 -0
  602. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165s30.chunk.ts +4 -0
  603. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n00.chunk.ts +4 -0
  604. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n15.chunk.ts +4 -0
  605. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n45.chunk.ts +4 -0
  606. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n60.chunk.ts +4 -0
  607. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180s15.chunk.ts +4 -0
  608. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180s30.chunk.ts +4 -0
  609. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180s45.chunk.ts +4 -0
  610. package/src/plugins/builtin/world-venue-map/natural-earth/world-50m.chunk.ts +4 -0
  611. package/src/plugins/builtin/world-venue-map/pane.tsx +28 -43
  612. package/src/plugins/builtin/world-venue-map/use-geo.ts +55 -0
  613. package/src/plugins/builtin/world-venue-map/venue-header.tsx +32 -0
  614. package/src/plugins/builtin/yield-curve/headless.ts +16 -0
  615. package/src/plugins/catalog-browser.ts +2 -0
  616. package/src/plugins/catalog-manifest.ts +1 -0
  617. package/src/plugins/catalog-ui.ts +3 -1
  618. package/src/plugins/catalog.ts +1 -1
  619. package/src/plugins/host-link.ts +33 -1
  620. package/src/plugins/installer.ts +48 -12
  621. package/src/plugins/loader.ts +30 -3
  622. package/src/plugins/manager-node.ts +15 -5
  623. package/src/plugins/registry/index.ts +1 -1
  624. package/src/plugins/registry/pane-settings.ts +26 -7
  625. package/src/public/__snapshots__/public-api.test.ts.snap +2 -0
  626. package/src/renderers/dom/build-assets.ts +81 -3
  627. package/src/renderers/dom/data-table/row.tsx +52 -16
  628. package/src/renderers/dom/desktop/controls.tsx +7 -3
  629. package/src/renderers/dom/desktop/icons.tsx +1 -0
  630. package/src/renderers/dom/desktop/list-view.tsx +35 -10
  631. package/src/renderers/dom/desktop/popover.tsx +73 -14
  632. package/src/renderers/dom/host/box.tsx +69 -26
  633. package/src/renderers/dom/host/input.tsx +14 -3
  634. package/src/renderers/dom/host/tabs.tsx +37 -1
  635. package/src/renderers/dom/styles.css +41 -7
  636. package/src/renderers/electrobun/bun/desktop/backend-requests.ts +11 -6
  637. package/src/renderers/electrobun/bun/desktop/backend.ts +1 -0
  638. package/src/renderers/electrobun/bun/desktop/update.ts +181 -87
  639. package/src/renderers/electrobun/bun/index.ts +73 -6
  640. package/src/renderers/electrobun/bun/window/remembered-frame.ts +122 -0
  641. package/src/renderers/electrobun/shared/protocol.ts +3 -0
  642. package/src/renderers/electrobun/view/backend-rpc.ts +10 -4
  643. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +3 -1
  644. package/src/renderers/electrobun/view/main.tsx +7 -1
  645. package/src/renderers/electrobun/view/renderer-window-error.ts +18 -0
  646. package/src/renderers/electrobun/view/rpc-timeout.ts +14 -3
  647. package/src/renderers/electrobun/view/update-host.ts +45 -21
  648. package/src/renderers/opentui/host.tsx +5 -0
  649. package/src/sources/gloomberb-cloud/index.ts +25 -4
  650. package/src/sources/gloomberb-cloud/normalizers.ts +36 -5
  651. package/src/sources/provider-router/cached-routes.ts +4 -1
  652. package/src/sources/provider-router/financials.ts +11 -8
  653. package/src/sources/provider-router/history.ts +15 -10
  654. package/src/sources/sec-registrant.ts +75 -0
  655. package/src/state/app/context/index.tsx +24 -8
  656. package/src/state/hooks/quote-streaming.ts +41 -26
  657. package/src/sync/core-contributors.ts +4 -0
  658. package/src/telemetry/benign-window-error.ts +7 -0
  659. package/src/telemetry/crash-reports-dom.ts +2 -0
  660. package/src/telemetry/crash-reports.ts +4 -1
  661. package/src/test-support/cli-context.ts +10 -2
  662. package/src/test-support/daily-nav.ts +25 -0
  663. package/src/theme/heat-colors.ts +357 -2
  664. package/src/tickers/instrument-kind.ts +34 -7
  665. package/src/tickers/search/asset-classes.ts +24 -9
  666. package/src/tickers/search/index.ts +44 -11
  667. package/src/tickers/search/ranking.ts +23 -3
  668. package/src/time-series/resolve.ts +1 -1
  669. package/src/time-series/use-chart-resolution.ts +1 -1
  670. package/src/types/context-menu.ts +6 -0
  671. package/src/types/data-provider.ts +2 -0
  672. package/src/types/financials.ts +5 -0
  673. package/src/types/headless.ts +79 -2
  674. package/src/types/plugin.ts +38 -6
  675. package/src/types/ticker.ts +15 -0
  676. package/src/ui/context-menu.tsx +1 -0
  677. package/src/ui/host.tsx +16 -0
  678. package/src/updater/index.ts +38 -13
  679. package/src/utils/async-deadline.ts +21 -0
  680. package/src/utils/cli-output.ts +5 -1
  681. package/src/utils/crypto-pair.ts +41 -0
  682. package/src/utils/currency-units.ts +14 -0
  683. package/src/utils/depositary-receipt.ts +26 -0
  684. package/src/utils/exchanges.ts +72 -0
  685. package/src/utils/fire-and-forget.ts +24 -0
  686. package/src/utils/format.ts +13 -0
  687. package/src/utils/price-earnings.ts +70 -3
  688. package/src/utils/price-history.ts +58 -13
  689. package/src/utils/rpc-timeout-error.ts +27 -0
  690. package/src/utils/sec.ts +13 -1
  691. package/src/utils/utc-time.ts +79 -0
@@ -2,7 +2,8 @@ import { pricePointIntegrity, type PriceHistoryIntegrity } from "../../../../uti
2
2
  import type { QueryEntry } from "../../../../market-data/result-types";
3
3
  import { colors } from "../../../../theme/colors";
4
4
  import type { PricePoint } from "../../../../types/financials";
5
- import { dailyCloses, correlateDailyCloses, type CorrelationResult, type DailyClose } from "../compute";
5
+ import { dailyCloses, correlateDailyCloses, type ChangeBasis, type CorrelationResult, type DailyClose } from "../compute";
6
+ import { geoSeriesToken } from "../geo";
6
7
  import type { CorrelationRangePreset } from "../settings";
7
8
  import { clipPriceHistoryToRange } from "../../../../time-series/history-window";
8
9
 
@@ -17,6 +18,8 @@ export type SeriesStatus = "loading" | "ready" | "insufficient" | "empty" | "err
17
18
  export interface CorrelationSeries {
18
19
  symbol: string;
19
20
  prices: DailyClose[];
21
+ /** Prices correlate returns; a map series correlates its daily change. */
22
+ basis?: ChangeBasis;
20
23
  status: SeriesStatus;
21
24
  observationCount: number;
22
25
  integrity?: PriceHistoryIntegrity[];
@@ -25,7 +28,10 @@ export interface CorrelationSeries {
25
28
  fetchedAt?: number | null;
26
29
  }
27
30
 
31
+ /** A map series shows its alias (HORMUZ, SUEZ.TANKER): the GEO prefix would leave no room for the name. */
28
32
  export function displaySymbol(symbol: string): string {
33
+ const geo = geoSeriesToken(symbol);
34
+ if (geo) return geo.length > 10 ? geo.slice(0, 10) : geo;
29
35
  return symbol.length > 5 ? symbol.slice(0, 5) : symbol;
30
36
  }
31
37
 
@@ -87,6 +93,15 @@ export function buildCorrelationSeries(symbol: string, history: readonly PricePo
87
93
  };
88
94
  }
89
95
 
96
+ /** A map series' values as a matrix input: zero counts are kept, changes are level differences. */
97
+ export function buildGeoCorrelationSeries(symbol: string, values: DailyClose[]): CorrelationSeries {
98
+ const observationCount = Math.max(0, values.length - 1);
99
+ return {
100
+ symbol, prices: values, basis: "difference", observationCount,
101
+ status: values.length === 0 ? "empty" : observationCount < MIN_CORRELATION_OBSERVATIONS ? "insufficient" : "ready",
102
+ };
103
+ }
104
+
90
105
  export function rowHeaderColor(status: SeriesStatus): string {
91
106
  switch (status) {
92
107
  case "loading":
@@ -122,7 +137,7 @@ export function buildCorrelationMatrix(
122
137
  const rowSeries = seriesBySymbol.get(rowSym);
123
138
  const colSeries = seriesBySymbol.get(colSym);
124
139
  const result = rowSeries && colSeries
125
- ? correlateDailyCloses(rowSeries.prices, colSeries.prices, MIN_CORRELATION_OBSERVATIONS)
140
+ ? correlateDailyCloses(rowSeries.prices, colSeries.prices, MIN_CORRELATION_OBSERVATIONS, rowSeries.basis, colSeries.basis)
126
141
  : { correlation: null, sampleSize: 0 };
127
142
  results.set(pairKey(rowSym, colSym), result);
128
143
  if (rowIndex < colIndex) {
@@ -1,6 +1,6 @@
1
1
  import { chartTableLayout } from "../../../../components/chart-table/layout";
2
- import { alignDailyCloses } from "../compute";
3
- import { buildRelationshipReturns, buildRollingCorrelationPoints } from "../relationship/model";
2
+ import { alignDailyCloses, pairedChanges } from "../compute";
3
+ import { buildRollingCorrelationPoints } from "../relationship/model";
4
4
  import type { CorrelationRangePreset } from "../settings";
5
5
  import type { CorrelationSeries } from "./model";
6
6
 
@@ -49,7 +49,9 @@ export function buildMatrixPairHistory(
49
49
  const aligned = alignDailyCloses(left?.prices ?? [], right?.prices ?? []).map((point) => ({
50
50
  ...point, date: new Date(`${point.dateKey}T00:00:00Z`),
51
51
  }));
52
- const returns = buildRelationshipReturns(aligned);
52
+ const returns = pairedChanges(aligned, left?.basis, right?.basis).map(({ dateKey, left: leftReturn, right: rightReturn }) => ({
53
+ dateKey, date: new Date(`${dateKey}T00:00:00Z`), leftReturn, rightReturn,
54
+ }));
53
55
  const points = buildRollingCorrelationPoints(returns, window);
54
56
  const byTime = new Map(points.map((point) => [point.date.getTime(), point.close]));
55
57
  const values = points.map((point) => point.close);
@@ -72,7 +72,7 @@ function alignRelationshipPrices(leftPoints: PricePoint[], rightPoints: PricePoi
72
72
  }));
73
73
  }
74
74
 
75
- export function buildRelationshipReturns(aligned: readonly Omit<RelationshipAlignedPoint, "ratio">[]): RelationshipReturnPoint[] {
75
+ function buildRelationshipReturns(aligned: readonly Omit<RelationshipAlignedPoint, "ratio">[]): RelationshipReturnPoint[] {
76
76
  const returns: RelationshipReturnPoint[] = [];
77
77
  for (let index = 1; index < aligned.length; index++) {
78
78
  const previous = aligned[index - 1]!;
@@ -43,6 +43,8 @@ import {
43
43
  buildRelationshipRatioSeries,
44
44
  buildRelationshipScatterPointsForDate,
45
45
  buildRelationshipStatItems,
46
+ formatRatioAxisValue,
47
+ formatRatioValue,
46
48
  type MultiLineChartSeries,
47
49
  } from "./view-model";
48
50
 
@@ -99,13 +101,13 @@ const MIN_PANEL_ROWS = 3;
99
101
 
100
102
  /** Each panel's axis reads at its own precision: whole index points, a ratio, a correlation. */
101
103
  function formatAxisValue(value: number, domain: CompositeAxisDomain): string {
102
- if (domain.seriesIds.includes("ratio")) return formatNumber(value, Math.abs(value) >= 10 ? 1 : 3);
104
+ if (domain.seriesIds.includes("ratio")) return formatRatioAxisValue(value, domain);
103
105
  if (domain.seriesIds.includes("correlation")) return formatNumber(value, 2);
104
106
  return formatNumber(value, 0);
105
107
  }
106
108
 
107
109
  function formatLegendValue(value: number, series: ResolvedSeries): string {
108
- if (series.id === "ratio") return formatNumber(value, 3);
110
+ if (series.id === "ratio") return formatRatioValue(value);
109
111
  if (series.id === "correlation") return formatNumber(value, 2);
110
112
  return formatNumber(value, 1);
111
113
  }
@@ -1,7 +1,8 @@
1
1
  import type { ProjectedChartPoint } from "../../../../components/chart/core/data";
2
2
  import type { ScatterChartPoint } from "../../../../components/chart/static";
3
3
  import { colors } from "../../../../theme/colors";
4
- import { formatNumber } from "../../../../utils/format";
4
+ import { formatNumber, formatSignificant } from "../../../../utils/format";
5
+ import type { CompositeAxisDomain } from "../../../../components/chart/composite/types";
5
6
  import type { StatItem } from "../../../../components/ui";
6
7
  import type {
7
8
  RelationshipAlignedPoint,
@@ -20,6 +21,20 @@ function formatNullableNumber(value: number | null | undefined, decimals: number
20
21
  return typeof value === "number" && Number.isFinite(value) ? formatNumber(value, decimals) : "-";
21
22
  }
22
23
 
24
+ /**
25
+ * A ratio's legend value at four significant digits, so a ratio of 0.000566
26
+ * does not read 0.001. Whole index points and correlations keep their own fixed decimals.
27
+ */
28
+ export const formatRatioValue = (value: number) => formatSignificant(value);
29
+
30
+ /** Ratio axis ticks need decimals that tell neighbours apart: 0.00040, 0.00045, 0.00050 where 0.001 would repeat. */
31
+ export function formatRatioAxisValue(value: number, domain: Pick<CompositeAxisDomain, "min" | "max">): string {
32
+ if (Math.abs(value) >= 10) return formatNumber(value, 1);
33
+ const span = Math.abs(domain.max - domain.min);
34
+ const decimals = Number.isFinite(span) && span > 0 ? Math.min(10, Math.max(3, 1 - Math.floor(Math.log10(span)))) : 3;
35
+ return formatNumber(value, decimals);
36
+ }
37
+
23
38
  export function buildIndexedPriceSeries(
24
39
  aligned: RelationshipAlignedPoint[],
25
40
  leftSymbol: string,
@@ -76,7 +76,7 @@ export function buildCorrelationSettingsDef(): PaneSettingsDef {
76
76
  {
77
77
  key: "symbolsText",
78
78
  label: "Tickers",
79
- description: `Enter up to ${MAX_CORRELATION_TICKERS} tickers. Empty uses the default CORR preset.`,
79
+ description: `Enter up to ${MAX_CORRELATION_TICKERS} tickers or map series (GEO:HORMUZ). Empty uses the default CORR preset.`,
80
80
  type: "text",
81
81
  placeholder: formatTickerListInput(DEFAULT_CORRELATION_SYMBOLS),
82
82
  },
@@ -1,7 +1,7 @@
1
1
  import type { CotClass, CotClassSummary } from "../../../api-client/cot";
2
2
  import type { HeadlessPaneColumn, HeadlessPaneDefinition } from "../../../types/plugin";
3
3
  import { fetchCotBoard, fetchCotContract } from "./client";
4
- import { COT_MAJOR_CODES, COT_SCOPES, cotClass, cotContractCode, cotInteger, cotMarketName, cotScope } from "./model";
4
+ import { COT_MAJOR_CODES, COT_SCOPES, cotClass, cotContractCode, cotInteger, cotMarketName, cotScope, cotUnknownMarketMessage } from "./model";
5
5
 
6
6
  const camelClass = (id: CotClass) => id.replace(/-(\w)/g, (_match, letter: string) => letter.toUpperCase());
7
7
  const rounded = (value: number | null, digits: number) => value == null ? null : Number(value.toFixed(digits));
@@ -25,7 +25,10 @@ const POSITION_COLUMNS: HeadlessPaneColumn[] = [
25
25
  ];
26
26
 
27
27
  export const cotHeadless: HeadlessPaneDefinition<"bundle"> = {
28
- shape: "bundle", argument: { kind: "free-text", optional: true, placeholder: "code or root", description: "CFTC market code or verified futures root; omit for the extremes board." },
28
+ shape: "bundle",
29
+ // Tuesday positions published the Friday after; two weeks without a new report means one was missed.
30
+ freshness: { source: "CFTC", status: "not-a-feed", basis: "weekly report", maxAgeMinutes: 14 * 24 * 60 },
31
+ argument: { kind: "free-text", optional: true, placeholder: "code or root", description: "CFTC market code or verified futures root; omit for the extremes board." },
29
32
  options: [{ key: "report", type: "enum", values: [{ value: "legacy" }, { value: "disaggregated" }], defaultValue: "legacy", description: "CFTC report family." },
30
33
  { key: "traderClass", type: "enum", values: ["noncommercial", "commercial", "producer", "swap", "managed-money", "other-reportable", "nonreportable"].map((value) => ({ value })), description: "Trader class for the extremes board; defaults by report family." },
31
34
  { key: "scope", type: "enum", values: COT_SCOPES.map(({ value }) => ({ value })), defaultValue: "major", description: "Markets on the extremes board, as in the pane." }],
@@ -35,7 +38,7 @@ export const cotHeadless: HeadlessPaneDefinition<"bundle"> = {
35
38
  const family = args.options.report === "disaggregated" ? "disaggregated" : "legacy";
36
39
  if (args.argument) {
37
40
  const code = cotContractCode(args.argument);
38
- if (!code) throw new Error("Use a CFTC market code or supported futures root");
41
+ if (!code) throw new Error(cotUnknownMarketMessage(args.argument));
39
42
  const data = await fetchCotContract(code, family, ctx.apiClient);
40
43
  const classes = data.positions.map((row) => row.id);
41
44
  return { sections: [{ title: data.contract ? cotMarketName(data.contract.marketName) : code,
@@ -1,7 +1,7 @@
1
1
  import type { PluginModule } from "../plugin-module";
2
2
  import { cotBoardCache } from "./client";
3
3
  import { cotHeadless } from "./headless";
4
- import { COT_ROOT_OPTIONS, cotContractCode, cotRoot } from "./model";
4
+ import { COT_ROOT_OPTIONS, cotContractCode, cotContractCodeForTicker, cotRoot, cotUnknownMarketMessage } from "./model";
5
5
  import { CotPane } from "./pane";
6
6
 
7
7
  export const cotModule: PluginModule = {
@@ -15,8 +15,8 @@ export const cotModule: PluginModule = {
15
15
  argOptions: () => COT_ROOT_OPTIONS }, headless: cotHeadless,
16
16
  createInstance: (context, options) => {
17
17
  const input = options?.arg?.trim();
18
- const code = cotContractCode(input || context.activeTicker);
19
- if (input && !code) throw new Error("Use a CFTC market code or supported futures root");
18
+ const code = input ? cotContractCode(input) : cotContractCodeForTicker(context.activeTicker);
19
+ if (input && !code) throw new Error(cotUnknownMarketMessage(input));
20
20
  return { title: code ? `COT ${cotRoot(code) ?? code}` : "CFTC Positioning", params: code ? { code } : undefined,
21
21
  settings: { report: options?.values?.report ?? "legacy" }, placement: "floating" as const };
22
22
  },
@@ -4,12 +4,13 @@ import type { ResolvedSeries } from "../../../time-series/types";
4
4
  import type { PricePoint } from "../../../types/financials";
5
5
  import { formatPriceObservation } from "../../../market-data/market/format";
6
6
  import { cleanFloat32Price } from "../../../cli/history-rows";
7
+ import { cryptoPairCoin, isFuturesSymbol } from "../shared/crypto-pair";
7
8
 
8
9
  export const COT_CLASSES: Record<CotFamily, Array<{ value: CotClass; label: string }>> = {
9
10
  legacy: [{ value: "noncommercial", label: "Noncommercial" }, { value: "commercial", label: "Commercial" }, { value: "nonreportable", label: "Nonreportable" }],
10
11
  disaggregated: [{ value: "managed-money", label: "Managed Money" }, { value: "producer", label: "Producer/Merchant" }, { value: "swap", label: "Swap Dealers" }, { value: "other-reportable", label: "Other Reportables" }, { value: "nonreportable", label: "Nonreportable" }],
11
12
  };
12
- const ROOTS: Record<string, { code: string; exchange: string; priceSymbol: string | null; name: string }> = {
13
+ const ROOTS: Record<string, { code: string; exchange: string; priceSymbol: string | null; name: string; crypto?: true }> = {
13
14
  ZN: { code: "043602", exchange: "CBT", priceSymbol: "ZN=F", name: "10-Year T-Note" },
14
15
  ZQ: { code: "045601", exchange: "CBT", priceSymbol: "ZQ=F", name: "30-Day Fed Funds" },
15
16
  CL: { code: "067651", exchange: "NYM", priceSymbol: "CL=F", name: "WTI Crude Oil" },
@@ -18,14 +19,27 @@ const ROOTS: Record<string, { code: string; exchange: string; priceSymbol: strin
18
19
  VX: { code: "1170E1", exchange: "CFE", priceSymbol: null, name: "VIX Futures" },
19
20
  SR3: { code: "134741", exchange: "CME", priceSymbol: null, name: "3-Month SOFR" },
20
21
  ES: { code: "13874A", exchange: "CME", priceSymbol: "ES=F", name: "E-Mini S&P 500" },
22
+ // CME crypto, verified against the CFTC board on 2026-10-09. Only the standard
23
+ // bitcoin and ether contracts return five years of front-price history; the
24
+ // micros, XRP and SOL come back with a single bar, so they chart no price.
25
+ BTC: { code: "133741", exchange: "CME", priceSymbol: "BTC=F", name: "Bitcoin", crypto: true },
26
+ ETH: { code: "146021", exchange: "CME", priceSymbol: "ETH=F", name: "Ether", crypto: true },
27
+ MBT: { code: "133742", exchange: "CME", priceSymbol: null, name: "Micro Bitcoin", crypto: true },
28
+ MET: { code: "146022", exchange: "CME", priceSymbol: null, name: "Micro Ether", crypto: true },
29
+ SOL: { code: "177741", exchange: "CME", priceSymbol: null, name: "Solana", crypto: true },
30
+ XRP: { code: "176740", exchange: "CME", priceSymbol: null, name: "XRP", crypto: true },
21
31
  };
22
32
  /** The roots `cotContractCode` accepts, labeled "ZQ 30-Day Fed Funds". */
23
- export const COT_ROOT_OPTIONS = Object.entries(ROOTS).map(([root, row]) => ({ value: root, label: `${root} ${row.name}` }));
33
+ export const COT_ROOT_OPTIONS = Object.entries(ROOTS).map(([root, row]) => ({ value: root, label: root === row.name ? root : `${root} ${row.name}` }));
34
+ /** The crypto roots named for a coin, which a coin pair (BTC-USD) can stand for. The micros have no pair. */
35
+ const COIN_PAIR_ROOTS: ReadonlySet<string> = new Set(["BTC", "ETH", "SOL", "XRP"]);
24
36
  /**
25
37
  * Front-month price overlays for major markets without a root alias, each
26
38
  * checked to return five years of daily history (2026-09-24). Keyed by CFTC
27
39
  * code, never added to ROOTS: an alias would also claim the equity ticker under
28
40
  * the cursor (ZM, ZS, PL). No cash index stands in, so the dollar index has none.
41
+ * Bitcoin and ether are in ROOTS, where `cotContractCodeForTicker` keeps the
42
+ * same guard for their aliases.
29
43
  */
30
44
  const PRICE_OVERLAYS: Record<string, { exchange: string; priceSymbol: string }> = {
31
45
  "209742": { exchange: "CME", priceSymbol: "NQ=F" }, "239742": { exchange: "CME", priceSymbol: "RTY=F" },
@@ -37,7 +51,6 @@ const PRICE_OVERLAYS: Record<string, { exchange: string; priceSymbol: string }>
37
51
  "096742": { exchange: "CME", priceSymbol: "6B=F" }, "090741": { exchange: "CME", priceSymbol: "6C=F" },
38
52
  "232741": { exchange: "CME", priceSymbol: "6A=F" }, "092741": { exchange: "CME", priceSymbol: "6S=F" },
39
53
  "095741": { exchange: "CME", priceSymbol: "6M=F" },
40
- "133741": { exchange: "CME", priceSymbol: "BTC=F" }, "146021": { exchange: "CME", priceSymbol: "ETH=F" },
41
54
  "023651": { exchange: "NYM", priceSymbol: "NG=F" }, "111659": { exchange: "NYM", priceSymbol: "RB=F" },
42
55
  "022651": { exchange: "NYM", priceSymbol: "HO=F" }, "06765T": { exchange: "NYM", priceSymbol: "BZ=F" },
43
56
  "085692": { exchange: "CMX", priceSymbol: "HG=F" }, "076651": { exchange: "NYM", priceSymbol: "PL=F" },
@@ -77,11 +90,31 @@ export const COT_SCOPES = [{ value: "major", label: "Major markets" }, { value:
77
90
  export type CotScope = typeof COT_SCOPES[number]["value"];
78
91
  export function cotScope(value: unknown): CotScope { return value === "all" ? "all" : "major"; }
79
92
 
93
+ /** A CFTC code or root typed as an argument or stored in a pane: every alias, crypto included. */
80
94
  export function cotContractCode(value: unknown): string | null {
81
95
  if (typeof value !== "string") return null;
82
96
  const input = value.trim().toUpperCase().replace(/=F$/, "");
83
97
  return ROOTS[input === "VIX" ? "VX" : input]?.code ?? (/^[0-9A-Z]{5}[0-9A-Z+]$/.test(input) ? input : null);
84
98
  }
99
+ /** What a market that is neither a root nor a CFTC code is told, with ones that work. */
100
+ export function cotUnknownMarketMessage(value: unknown): string {
101
+ const roots = ["ES", "CL", "GC", "ZN"].filter((root) => ROOTS[root]);
102
+ return `Unknown market "${String(value)}". Try ${roots.join(", ")} or a CFTC market code such as ${ROOTS.GC!.code}.`;
103
+ }
104
+ /**
105
+ * The code for the ticker under the cursor, when COT is opened without an
106
+ * argument. The crypto aliases are also US ticker symbols (Grayscale's mini
107
+ * trusts are BTC and ETH, MetLife is MET), so a bare one is the equity's and
108
+ * never claims the market: only a futures symbol (BTC=F) or a coin pair
109
+ * (BTC-USD) does.
110
+ */
111
+ export function cotContractCodeForTicker(ticker: unknown): string | null {
112
+ if (typeof ticker !== "string") return null;
113
+ const coin = cryptoPairCoin(ticker);
114
+ if (coin) return COIN_PAIR_ROOTS.has(coin) ? ROOTS[coin]!.code : null;
115
+ const input = ticker.trim().toUpperCase().replace(/=F$/, "");
116
+ return ROOTS[input]?.crypto && !isFuturesSymbol(ticker) ? null : cotContractCode(ticker);
117
+ }
85
118
  /** The verified futures root a CFTC code belongs to, for titles readers recognize. */
86
119
  export function cotRoot(code: string): string | null {
87
120
  return Object.entries(ROOTS).find(([, row]) => row.code === code)?.[0] ?? null;
@@ -52,6 +52,8 @@ export const cpiHeadless: HeadlessPaneDefinition<"bundle"> = {
52
52
  const headline = data.rows.find((row) => row.code === "SA0") ?? null;
53
53
  const argument = Array.isArray(args.argument) ? args.argument.join(" ") : args.argument;
54
54
  const metadata = { ...data, complete: data.status === "available" };
55
+ const freshness = { source: "BLS", status: "not-a-feed" as const, basis: "monthly release",
56
+ asOf: data.release.releasedAt, nextExpectedAt: data.release.nextReleaseAt };
55
57
  if (argument) {
56
58
  const option = cpiRowOption(argument);
57
59
  const row = option ? data.rows.find((entry) => entry.id === option.value) : null;
@@ -66,12 +68,14 @@ export const cpiHeadless: HeadlessPaneDefinition<"bundle"> = {
66
68
  rows: historyRows(row, headline) },
67
69
  ],
68
70
  errors: data.gaps,
71
+ freshness,
69
72
  metadata: { ...metadata, rows: [row] },
70
73
  };
71
74
  }
72
75
  return {
73
76
  sections: [{ title: header, columns: SUMMARY_COLUMNS, rows: cpiRows(data).map((row) => reportRow(row)) }],
74
77
  errors: data.gaps,
78
+ freshness,
75
79
  metadata,
76
80
  };
77
81
  },
@@ -8,6 +8,7 @@ export const cdxHeadless: HeadlessPaneDefinition<"rows"> = {
8
8
  discovery: { aliases: ["CDX"], dataRequirements: ["Gloom Cloud index CDS endpoint"],
9
9
  limitations: ["Daily medians of public DTCC prints on the on-the-run 5Y contract", "HY and EM quote in price"] },
10
10
  shape: "rows",
11
+ freshness: { source: "DTCC", status: "not-a-feed", basis: "daily medians of public trades", cadence: "daily", observedKey: "date" },
11
12
  argument: { kind: "none" },
12
13
  options: [],
13
14
  columns: [
@@ -43,6 +44,7 @@ export const sovrHeadless: HeadlessPaneDefinition<"rows"> = {
43
44
  discovery: { aliases: ["SOVR", "WCDS"], dataRequirements: ["Gloom Cloud sovereign CDS endpoint"],
44
45
  limitations: ["Daily 5Y levels from public DTCC prints; thinly traded names can miss days"] },
45
46
  shape: "rows",
47
+ freshness: { source: "DTCC", status: "not-a-feed", basis: "daily levels of public trades", cadence: "daily", observedKey: "date" },
46
48
  argument: { kind: "none" },
47
49
  options: [],
48
50
  columns: [
@@ -38,6 +38,7 @@ function createCreditConditionsHeadless(
38
38
  options: [],
39
39
  columns: COLUMNS,
40
40
  describe: "Credit Spreads",
41
+ freshness: { source: "FRED", status: "not-a-feed", basis: "daily index levels", cadence: "daily", observedKey: "date" },
41
42
  async load(args, ctx) {
42
43
  const result = await dependencies.load(
43
44
  args,
@@ -1,17 +1,14 @@
1
1
  import type { CreditHeadroom } from "../../../api-client/credit-documents";
2
+ import { ratioBarGlyphs } from "../../../components/ui/ratio-bar";
2
3
  import { useThemeColors } from "../../../theme/theme-context";
3
4
  import { Box, Text, useUiCapabilities } from "../../../ui";
4
5
  import { covenantUsage, headroomTone } from "./model";
5
6
 
6
- const EIGHTHS = ["", "▏", "▎", "▍", "▌", "▋", "▊", "▉"];
7
7
  /** Where the limit sits along the gauge; the rest shows how far a breach runs past it. */
8
8
  const LIMIT_AT = 0.8;
9
9
 
10
- function blocks(cells: number): string {
11
- const full = Math.floor(cells);
12
- const eighth = Math.round((cells - full) * 8);
13
- return eighth === 8 ? "█".repeat(full + 1) : `${"█".repeat(full)}${EIGHTHS[eighth]}`;
14
- }
10
+ /** `cells` of a run `span` cells long, in eighth-cell block glyphs. */
11
+ const blocks = (cells: number, span: number) => ratioBarGlyphs(cells / span, span, { resolution: "eighth" });
15
12
 
16
13
  /**
17
14
  * How much of a covenant's limit the reported metric uses, against a marker at
@@ -44,10 +41,10 @@ export function HeadroomGauge({ covenant, width, selected }: { covenant: CreditH
44
41
  // In cells the limit is a whole column: usage 1 fills up to it, a breach runs through it.
45
42
  const limit = Math.min(width - 1, Math.round(width * LIMIT_AT));
46
43
  const cells = Math.min(width, Math.max(0, usage) * limit);
47
- const after = cells > limit + 1 ? blocks(cells - limit - 1) : "";
44
+ const after = cells > limit + 1 ? blocks(cells - limit - 1, width - limit - 1) : "";
48
45
  return (
49
46
  <Box flexDirection="row" width={width} overflow="hidden">
50
- <Text fg={fill}>{blocks(Math.min(cells, limit)).padEnd(limit)}</Text>
47
+ <Text fg={fill}>{blocks(Math.min(cells, limit), limit).padEnd(limit)}</Text>
51
48
  <Text fg={marker} bg={cells > limit ? fill : undefined}>│</Text>
52
49
  {after ? <Text fg={fill}>{after}</Text> : null}
53
50
  </Box>
@@ -1,9 +1,11 @@
1
1
  import type { HeadlessPaneDefinition } from "../../../types/plugin";
2
2
  import { fetchCreditDocuments, fetchCreditInstrument, fetchCreditScreen } from "./client";
3
3
  import { CREDIT_TABS } from "./model";
4
+ import { SEC_FILINGS } from "../shared/report-freshness";
4
5
 
5
6
  export const creditHeadless: HeadlessPaneDefinition<"bundle"> = {
6
7
  shape: "bundle",
8
+ freshness: SEC_FILINGS,
7
9
  argument: { kind: "ticker", description: "Issuer ticker, including exchange-qualified global symbols.", placeholder: "ticker" },
8
10
  discovery: { aliases: ["CRDOC"], dataRequirements: ["Gloom Cloud credit-document evidence"], limitations: [
9
11
  "Pro dataset; free accounts see a limited preview", "SEC credit documents with global issuer identifiers; other jurisdictions depend on connected sources",
@@ -40,6 +40,9 @@ export const cryptoBoardHeadless: HeadlessPaneDefinition<"rows"> = {
40
40
  aliases: ["CRYP"],
41
41
  dataRequirements: ["Gloom Cloud crypto markets"],
42
42
  },
43
+ // A board snapshot refreshed every few minutes; the pane streams, the report does not.
44
+ // Crypto trades around the clock, so a snapshot an hour old has stopped refreshing.
45
+ freshness: { status: "delayed", maxAgeMinutes: 60 },
43
46
  async load(args, ctx) {
44
47
  const kind = args.options.list === "stablecoin" ? "stablecoin" : "coin" satisfies CryptoAssetKind;
45
48
  const data = await fetchCryptoMarkets(ctx.apiClient);
@@ -101,7 +101,7 @@ export async function loadViewSource(
101
101
  return {
102
102
  rows,
103
103
  columns,
104
- errors: (loaded.result.errors ?? []).filter(Boolean),
104
+ errors: [...(loaded.result.errors ?? []), ...(loaded.result.notes ?? [])].filter(Boolean),
105
105
  sourceLabel: resolved.label,
106
106
  };
107
107
  }
@@ -1,9 +1,11 @@
1
1
  import type { HeadlessPaneDefinition } from "../../../types/plugin";
2
2
  import { fetchDebtMaturities } from "./client";
3
3
  import { bucketShare, debtNotices } from "./model";
4
+ import { SEC_FILINGS } from "../shared/report-freshness";
4
5
 
5
6
  export const debtMaturitiesHeadless: HeadlessPaneDefinition<"bundle"> = {
6
7
  shape: "bundle",
8
+ freshness: SEC_FILINGS,
7
9
  argument: {
8
10
  kind: "ticker",
9
11
  description: "SEC reporting issuer ticker.",
@@ -84,6 +86,8 @@ export const debtMaturitiesHeadless: HeadlessPaneDefinition<"bundle"> = {
84
86
  },
85
87
  ],
86
88
  metadata: { ...data },
89
+ // The latest filing dates the report; the history rows are past years, not stale data.
90
+ freshness: { asOf: data.latest?.asOf ?? null },
87
91
  };
88
92
  },
89
93
  };
@@ -1,24 +1,18 @@
1
- import { Box, Text, useUiCapabilities } from "../../../ui";
1
+ import { RatioBar } from "../../../components/ui/ratio-bar";
2
+ import { Box, Text } from "../../../ui";
2
3
  import { colors } from "../../../theme/colors";
3
4
  import type { BucketBar } from "./model";
4
5
 
5
- const EIGHTHS = ["", "▏", "▎", "▍", "▌", "▋", "▊", "▉"];
6
6
  const CAP = "▸";
7
7
 
8
8
  /** Cells a capped bar keeps after its end for the cap. */
9
9
  export const WALL_CAP_RESERVE = 2;
10
10
 
11
- function blocks(cells: number): string {
12
- const full = Math.floor(cells);
13
- const eighth = Math.round((cells - full) * 8);
14
- return eighth === 8 ? "█".repeat(full + 1) : `${"█".repeat(full)}${EIGHTHS[eighth]}`;
15
- }
16
-
17
11
  /**
18
12
  * One maturity bucket of the wall, inline in its table row. Dated buckets
19
13
  * share one scale; a bucket past it (Thereafter, open ended) runs to the end,
20
14
  * capped, so its length is never read as a measure; its PRINCIPAL cell says
21
- * how much. The desktop draws an element; the terminal draws block cells.
15
+ * how much.
22
16
  */
23
17
  export function WallBar({ bar, width, reserve, selected }: {
24
18
  bar: BucketBar | null;
@@ -27,37 +21,16 @@ export function WallBar({ bar, width, reserve, selected }: {
27
21
  reserve: number;
28
22
  selected: boolean;
29
23
  }) {
30
- const isDesktopWeb = useUiCapabilities().nativePaneChrome === true;
31
24
  if (!bar || width <= 0) return <Text fg={colors.textDim}>{""}</Text>;
32
- const scale = Math.max(1, width - reserve);
33
- const labelColor = selected ? colors.selectedText : colors.text;
34
-
35
- if (isDesktopWeb) {
36
- return (
37
- <Box width={width} flexDirection="row" alignItems="center" gap={1} overflow="hidden">
38
- <Box flexGrow={1} flexShrink={1} minWidth={0} flexDirection="row" alignItems="center">
39
- <Box
40
- backgroundColor={colors.warning}
41
- style={{
42
- width: bar.capped ? "100%" : `${((bar.ratio * scale) / width * 100).toFixed(2)}%`,
43
- height: "9px",
44
- borderRadius: "2px",
45
- minWidth: bar.ratio > 0 ? "2px" : "0",
46
- }}
47
- />
48
- </Box>
49
- {bar.capped ? <Text fg={labelColor}>{CAP}</Text> : null}
50
- </Box>
51
- );
52
- }
53
-
54
- if (bar.capped) {
55
- return (
56
- <Box flexDirection="row" width={width} overflow="hidden">
57
- <Text fg={colors.warning}>{"█".repeat(scale)}</Text>
58
- <Text fg={labelColor}>{` ${CAP}`}</Text>
59
- </Box>
60
- );
61
- }
62
- return <Text fg={colors.warning}>{blocks(bar.ratio * scale)}</Text>;
25
+ return (
26
+ <Box width={width} flexDirection="row" alignItems="center" overflow="hidden">
27
+ <RatioBar
28
+ ratio={bar.capped ? 1 : bar.ratio}
29
+ width={Math.max(1, width - reserve)}
30
+ color={colors.warning}
31
+ resolution="eighth"
32
+ />
33
+ {bar.capped ? <Text fg={selected ? colors.selectedText : colors.text}>{` ${CAP}`}</Text> : null}
34
+ </Box>
35
+ );
63
36
  }
@@ -6,6 +6,7 @@ import { resolveCurrencyUnit } from "../../../utils/currency-units";
6
6
  import { calendarMonthsBefore } from "../../../utils/calendar-date";
7
7
  import { inferCadence, trailingCashAt } from "./trailing-cash";
8
8
  import { dividendQuotePriceMetadata } from "./reference-price";
9
+ import { mapQuote } from "../../../sources/gloomberb-cloud/normalizers";
9
10
 
10
11
  export const DIVIDENDS_CONNECTION_ID = "gloom-dividends";
11
12
  export const INCOMPLETE_DIVIDEND_HISTORY = "Incomplete cash history; totals unavailable.";
@@ -78,7 +79,8 @@ export async function fetchDividendData(
78
79
  ): Promise<DividendData> {
79
80
  const response = await trackRequest("dividends", () => apiClient.getMarketDividends(symbol, exchange));
80
81
  if (!response.data) throw new Error(`No dividend data found for ${symbol}`);
81
- const { actions, quote, summary: quoteFields } = response.data;
82
+ const { actions, quote: rawQuote, summary: quoteFields } = response.data;
83
+ const quote = rawQuote ? mapQuote(rawQuote) : null;
82
84
  const summaryError = response.data.summaryError ?? (!quoteFields ? UNAVAILABLE_DIVIDEND_SUMMARY
83
85
  : [quoteFields.exDividendDate, quoteFields.dividendDate]
84
86
  .some((timestamp) => timestamp != null && reportedDividendDate(timestamp) === null)
@@ -111,7 +113,7 @@ export async function fetchDividendData(
111
113
  }
112
114
  return {
113
115
  payments, metrics, price, currency: currency || undefined, historyAvailable,
114
- ...(suppliedPrice == null && price != null && quote ? dividendQuotePriceMetadata({ ...quote, change: quote.change ?? NaN, changePercent: quote.changePercent ?? NaN }) : {}),
116
+ ...(suppliedPrice == null && price != null && quote ? dividendQuotePriceMetadata(quote) : {}),
115
117
  ...(historyError ? { historyError } : {}), ...(summaryError ? { summaryError } : {}),
116
118
  providerId: actions?.providerId ?? "gloom", fetchedAt: actions?.fetchedAt,
117
119
  stale: response.stale === true || response.data.stale === true || actions?.stale === true,
@@ -138,6 +138,7 @@ export function createDividendYieldHeadless(
138
138
  ): HeadlessPaneDefinition<"bundle"> {
139
139
  return {
140
140
  shape: "bundle",
141
+ freshness: { status: "not-a-feed", basis: "distribution history" },
141
142
  argument: {
142
143
  kind: "ticker",
143
144
  placeholder: "ticker",
@@ -15,6 +15,7 @@ import {
15
15
  formatDoeVsFive,
16
16
  formatDoeVsYear,
17
17
  } from "./model";
18
+ import { newestReportTime, oldestReportTime } from "../../../utils/utc-time";
18
19
 
19
20
  const text = (value: unknown) => typeof value === "string" ? value : "--";
20
21
 
@@ -60,6 +61,10 @@ export function doeHeadless(defaultTab: DoeTab | "all"): HeadlessPaneDefinition<
60
61
  describe: "EIA weekly petroleum and natural gas storage",
61
62
  async load(args) {
62
63
  const data = await fetchDoeBoard();
64
+ // EIA's weekly reports; once the next one is a day overdue the tables have missed it.
65
+ const freshness = { source: "EIA", status: "not-a-feed" as const, basis: "weekly release",
66
+ asOf: newestReportTime(data.reports.map((report) => report.releasedAt)),
67
+ nextExpectedAt: oldestReportTime(data.reports.map((report) => report.nextReleaseAt)) };
63
68
  const argument = Array.isArray(args.argument) ? args.argument.join(" ") : args.argument;
64
69
  if (argument) {
65
70
  const option = doeSeriesOption(argument);
@@ -75,6 +80,7 @@ export function doeHeadless(defaultTab: DoeTab | "all"): HeadlessPaneDefinition<
75
80
  rows: seasonalRows(row) },
76
81
  ],
77
82
  errors: data.gaps,
83
+ freshness,
78
84
  metadata: { ...data, series: [row], complete: data.status === "available" },
79
85
  };
80
86
  }
@@ -86,6 +92,7 @@ export function doeHeadless(defaultTab: DoeTab | "all"): HeadlessPaneDefinition<
86
92
  rows: doeRows(data, tab).map(reportRow),
87
93
  })),
88
94
  errors: data.gaps,
95
+ freshness,
89
96
  metadata: { ...data, complete: data.status === "available" },
90
97
  };
91
98
  },