gloomberb 0.16.1 → 0.16.3

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 (643) 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 +26 -8
  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 +2 -0
  8. package/src/api-client/market-discovery.ts +10 -0
  9. package/src/api-client/paths.ts +30 -1
  10. package/src/api-client/perps.ts +37 -0
  11. package/src/api-client/request.ts +5 -2
  12. package/src/api-client/types.ts +2 -0
  13. package/src/brokers/account-cache.ts +69 -0
  14. package/src/cli/command-options.ts +74 -0
  15. package/src/cli/commands/command-utils.ts +37 -0
  16. package/src/cli/commands/crypto-hints.ts +75 -0
  17. package/src/cli/commands/market.ts +560 -136
  18. package/src/cli/commands/overview.ts +136 -48
  19. package/src/cli/commands/ticker.ts +220 -67
  20. package/src/cli/desktop-pane-shot.ts +37 -4
  21. package/src/cli/freshness.ts +61 -0
  22. package/src/cli/help.ts +27 -6
  23. package/src/cli/helpers.ts +4 -8
  24. package/src/cli/history-rows.ts +187 -15
  25. package/src/cli/index.ts +23 -8
  26. package/src/cli/listing-arg.ts +321 -0
  27. package/src/cli/options.ts +5 -1
  28. package/src/cli/pane-functions/access-gate.ts +42 -0
  29. package/src/cli/pane-functions/capabilities.ts +5 -0
  30. package/src/cli/pane-functions/catalog.ts +28 -1
  31. package/src/cli/pane-functions/data.ts +3 -1
  32. package/src/cli/pane-functions/dom.ts +87 -16
  33. package/src/cli/pane-functions/freshness.ts +400 -0
  34. package/src/cli/pane-functions/function-help.ts +31 -22
  35. package/src/cli/pane-functions/headless.ts +201 -41
  36. package/src/cli/pane-functions/index.ts +24 -6
  37. package/src/cli/pane-functions/options.ts +3 -0
  38. package/src/cli/pane-functions/report.ts +12 -1
  39. package/src/cli/pane-functions/resolver.ts +63 -9
  40. package/src/cli/pane-functions/screenshot-evidence.ts +2 -0
  41. package/src/cli/pane-functions/screenshot.ts +11 -3
  42. package/src/cli/registry.ts +6 -3
  43. package/src/cli/report-tables.ts +460 -0
  44. package/src/cli/result.ts +53 -29
  45. package/src/cli/ticker-resolution.ts +7 -5
  46. package/src/components/chart/composite/composite-chart.tsx +88 -2536
  47. package/src/components/chart/composite/drawing-store.ts +59 -0
  48. package/src/components/chart/composite/legend.tsx +319 -0
  49. package/src/components/chart/composite/panel-bitmap.ts +139 -0
  50. package/src/components/chart/composite/panel-gestures.ts +59 -0
  51. package/src/components/chart/composite/panel-labels.ts +107 -0
  52. package/src/components/chart/composite/panel-surface.tsx +876 -0
  53. package/src/components/chart/composite/tool-catalog.ts +98 -0
  54. package/src/components/chart/composite/toolbar.tsx +186 -0
  55. package/src/components/chart/composite/tools.ts +8 -0
  56. package/src/components/chart/composite/use-composite-chart-keyboard.ts +703 -0
  57. package/src/components/chart/composite/use-composite-viewport.ts +143 -0
  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/ticker-search/actions.ts +5 -0
  62. package/src/components/command-bar/workflow/ops.ts +1 -1
  63. package/src/components/command-bar/workflow/tickers.ts +6 -0
  64. package/src/components/data-table/export.ts +6 -51
  65. package/src/components/data-table/view.tsx +32 -11
  66. package/src/components/feedback-dialog.tsx +2 -1
  67. package/src/components/form-modal/field-row.tsx +2 -2
  68. package/src/components/layout/detached-pane-shell.tsx +6 -3
  69. package/src/components/layout/pane/content.tsx +23 -10
  70. package/src/components/layout/pane/error-boundary.tsx +103 -0
  71. package/src/components/layout/pane/footer/registration.tsx +68 -23
  72. package/src/components/layout/pane/header.tsx +11 -11
  73. package/src/components/layout/shell/active-drag.ts +67 -35
  74. package/src/components/layout/shell/cursor-occlusion.ts +6 -5
  75. package/src/components/layout/shell/drag/index.ts +12 -7
  76. package/src/components/layout/shell/drag/live.ts +122 -0
  77. package/src/components/layout/shell/drag/overlays.tsx +179 -35
  78. package/src/components/layout/shell/drag/runtime.ts +62 -50
  79. package/src/components/layout/shell/drag/slide.ts +10 -0
  80. package/src/components/layout/shell/index.tsx +37 -51
  81. package/src/components/layout/shell/menu.ts +2 -1
  82. package/src/components/layout/shell/native/pointer-runtime.ts +13 -13
  83. package/src/components/layout/shell/native/surfaces.ts +30 -14
  84. package/src/components/layout/shell/pane/actions.ts +2 -1
  85. package/src/components/layout/shell/pane/layers.tsx +419 -168
  86. package/src/components/layout/shell/terminal-pointer-runtime.ts +18 -18
  87. package/src/components/layout/shell/window-mode/overlays.tsx +12 -4
  88. package/src/components/metric-treemap/heat-surface.tsx +43 -16
  89. package/src/components/metric-treemap/heat-tiles.ts +18 -0
  90. package/src/components/metric-treemap/layout.ts +2 -0
  91. package/src/components/onboarding/onboarding-keyboard.ts +311 -0
  92. package/src/components/onboarding/onboarding-wizard.tsx +101 -788
  93. package/src/components/onboarding/use-onboarding-broker-form.ts +263 -0
  94. package/src/components/onboarding/use-onboarding-progress.ts +298 -0
  95. package/src/components/onboarding/use-onboarding-upgrade.ts +83 -0
  96. package/src/components/ticker/list-table-view.tsx +13 -1
  97. package/src/components/ui/fields.tsx +8 -0
  98. package/src/components/ui/range-track.tsx +10 -3
  99. package/src/components/ui/status.tsx +8 -2
  100. package/src/components/ui/tabs.tsx +7 -4
  101. package/src/components/ui/text-prompt-dialog.tsx +4 -2
  102. package/src/data/config/store/normalize.ts +17 -1
  103. package/src/data/json-persistence.ts +17 -3
  104. package/src/data/json-storage.ts +2 -0
  105. package/src/data/memory-resource-store.ts +46 -0
  106. package/src/i18n/es.ts +19 -1
  107. package/src/i18n/ja.ts +19 -1
  108. package/src/i18n/ko.ts +19 -1
  109. package/src/i18n/zh-cn.ts +19 -1
  110. package/src/i18n/zh-tw.ts +19 -1
  111. package/src/market-data/coordinator/chart.ts +1 -1
  112. package/src/market-data/coordinator/quotes.ts +23 -4
  113. package/src/market-data/fx-closes.ts +72 -0
  114. package/src/market-data/market/freshness.ts +123 -6
  115. package/src/market-data/market/session-close-note.ts +57 -0
  116. package/src/market-data/market/status.ts +151 -0
  117. package/src/market-data/published-apac-sessions.ts +66 -0
  118. package/src/market-data/quotes/contributions.ts +2 -0
  119. package/src/market-data/quotes/freshness.ts +5 -0
  120. package/src/market-data/quotes/resolution.ts +2 -0
  121. package/src/market-data/quotes/screener-live-quotes.ts +49 -4
  122. package/src/plugins/builtin/account-management/pane.tsx +4 -0
  123. package/src/plugins/builtin/alerts/cli.ts +10 -5
  124. package/src/plugins/builtin/alerts/index.tsx +1 -0
  125. package/src/plugins/builtin/analytics/metrics.ts +8 -3
  126. package/src/plugins/builtin/analytics/pane-model.ts +10 -6
  127. package/src/plugins/builtin/analytics/risk-client.ts +191 -66
  128. package/src/plugins/builtin/analytics/risk-fx.ts +102 -0
  129. package/src/plugins/builtin/analytics/risk-headless.ts +19 -13
  130. package/src/plugins/builtin/analytics/risk-model.ts +45 -17
  131. package/src/plugins/builtin/analytics/risk-pane.tsx +1 -0
  132. package/src/plugins/builtin/analytics/risk-test-data.ts +25 -1
  133. package/src/plugins/builtin/attention/headless.ts +6 -4
  134. package/src/plugins/builtin/attention/index.tsx +1 -1
  135. package/src/plugins/builtin/attention/pane.tsx +2 -2
  136. package/src/plugins/builtin/awards/headless.ts +1 -0
  137. package/src/plugins/builtin/awards/pane.tsx +1 -1
  138. package/src/plugins/builtin/backtest/headless.ts +1 -0
  139. package/src/plugins/builtin/bond-calculator/headless.ts +1 -0
  140. package/src/plugins/builtin/buildout/index.tsx +1 -0
  141. package/src/plugins/builtin/catalysts/detail.tsx +1 -1
  142. package/src/plugins/builtin/catalysts/headless.ts +3 -1
  143. package/src/plugins/builtin/cds/headless.ts +2 -0
  144. package/src/plugins/builtin/central-bank-rates/headless.ts +1 -0
  145. package/src/plugins/builtin/chart-composer/headless.ts +38 -3
  146. package/src/plugins/builtin/chart-composer/index.tsx +3 -1
  147. package/src/plugins/builtin/chart-composer/series-expression.ts +18 -2
  148. package/src/plugins/builtin/chat/channels.ts +19 -3
  149. package/src/plugins/builtin/chat/content/composer-runtime.ts +28 -13
  150. package/src/plugins/builtin/chat/content/footer.tsx +15 -6
  151. package/src/plugins/builtin/chat/content/index.tsx +120 -21
  152. package/src/plugins/builtin/chat/content/new-dm-dialog.tsx +261 -113
  153. package/src/plugins/builtin/chat/content/transcript.tsx +20 -2
  154. package/src/plugins/builtin/chat/direct-messages.ts +200 -0
  155. package/src/plugins/builtin/chat/index.tsx +1 -0
  156. package/src/plugins/builtin/chat/message/desktop.tsx +3 -0
  157. package/src/plugins/builtin/chat/message/header.tsx +16 -6
  158. package/src/plugins/builtin/chat/message/inline-tokens.tsx +72 -32
  159. package/src/plugins/builtin/chat/message/profile-popover.tsx +96 -12
  160. package/src/plugins/builtin/chat/message/terminal.tsx +3 -0
  161. package/src/plugins/builtin/chat/message/types.ts +14 -2
  162. package/src/plugins/builtin/chat/profile-popover.ts +18 -13
  163. package/src/plugins/builtin/clinical-trials/index.tsx +1 -0
  164. package/src/plugins/builtin/cloud/askg/executor.ts +2 -1
  165. package/src/plugins/builtin/cloud/plugin.tsx +1 -0
  166. package/src/plugins/builtin/cloud/team/module.tsx +1 -0
  167. package/src/plugins/builtin/cloud/thesis/module.tsx +1 -0
  168. package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
  169. package/src/plugins/builtin/comment-letters/index.tsx +1 -0
  170. package/src/plugins/builtin/company-attention/headless.ts +5 -1
  171. package/src/plugins/builtin/company-attention/pane.tsx +2 -2
  172. package/src/plugins/builtin/company-kpis/headless.ts +1 -0
  173. package/src/plugins/builtin/congress-trades/headless.ts +1 -0
  174. package/src/plugins/builtin/correlation/compute.ts +59 -16
  175. package/src/plugins/builtin/correlation/geo.ts +34 -0
  176. package/src/plugins/builtin/correlation/headless-schema.ts +4 -1
  177. package/src/plugins/builtin/correlation/headless.ts +42 -8
  178. package/src/plugins/builtin/correlation/history.ts +2 -0
  179. package/src/plugins/builtin/correlation/index.tsx +68 -14
  180. package/src/plugins/builtin/correlation/matrix/model.ts +17 -2
  181. package/src/plugins/builtin/correlation/matrix/selection.ts +5 -3
  182. package/src/plugins/builtin/correlation/relationship/model.ts +1 -1
  183. package/src/plugins/builtin/correlation/relationship/pane.tsx +4 -2
  184. package/src/plugins/builtin/correlation/relationship/view-model.ts +16 -1
  185. package/src/plugins/builtin/correlation/settings.ts +1 -1
  186. package/src/plugins/builtin/cot/headless.ts +6 -3
  187. package/src/plugins/builtin/cot/index.tsx +3 -3
  188. package/src/plugins/builtin/cot/model.ts +36 -3
  189. package/src/plugins/builtin/cpi/headless.ts +4 -0
  190. package/src/plugins/builtin/credit-boards/headless.ts +2 -0
  191. package/src/plugins/builtin/credit-conditions/headless.ts +1 -0
  192. package/src/plugins/builtin/credit-documents/gauge.tsx +5 -8
  193. package/src/plugins/builtin/credit-documents/headless.ts +2 -0
  194. package/src/plugins/builtin/crypto-board/headless.ts +3 -0
  195. package/src/plugins/builtin/custom-view/loader.ts +1 -1
  196. package/src/plugins/builtin/debt-maturities/headless.ts +4 -0
  197. package/src/plugins/builtin/dividend-yield/headless.ts +1 -0
  198. package/src/plugins/builtin/doe/headless.ts +7 -0
  199. package/src/plugins/builtin/doe/range-bar.tsx +7 -37
  200. package/src/plugins/builtin/earnings/headless.ts +5 -0
  201. package/src/plugins/builtin/earnings-calls/headless.ts +1 -0
  202. package/src/plugins/builtin/earnings-ripple/client.ts +91 -18
  203. package/src/plugins/builtin/earnings-ripple/headless.ts +28 -8
  204. package/src/plugins/builtin/earnings-ripple/index.tsx +2 -2
  205. package/src/plugins/builtin/earnings-ripple/model.ts +97 -7
  206. package/src/plugins/builtin/earnings-ripple/pane.tsx +148 -23
  207. package/src/plugins/builtin/econ/index.tsx +1 -0
  208. package/src/plugins/builtin/econ-statistics/headless.ts +2 -0
  209. package/src/plugins/builtin/equity-screener/headless.ts +2 -0
  210. package/src/plugins/builtin/estimate-revisions/headless.ts +1 -0
  211. package/src/plugins/builtin/executives/index.tsx +1 -0
  212. package/src/plugins/builtin/exposure/headless.ts +3 -1
  213. package/src/plugins/builtin/fear-greed/headless.ts +2 -0
  214. package/src/plugins/builtin/filing-events/index.tsx +1 -0
  215. package/src/plugins/builtin/futures-curve/client.ts +12 -3
  216. package/src/plugins/builtin/futures-curve/headless.ts +39 -10
  217. package/src/plugins/builtin/futures-curve/index.tsx +3 -3
  218. package/src/plugins/builtin/futures-curve/model.ts +188 -4
  219. package/src/plugins/builtin/futures-curve/pane.tsx +51 -9
  220. package/src/plugins/builtin/gpu/headless.ts +7 -3
  221. package/src/plugins/builtin/gpu/ladder.tsx +26 -30
  222. package/src/plugins/builtin/gpu/model.ts +27 -1
  223. package/src/plugins/builtin/holders/beneficial-client.ts +209 -0
  224. package/src/plugins/builtin/holders/beneficial-model.ts +279 -0
  225. package/src/plugins/builtin/holders/beneficial-report.ts +126 -0
  226. package/src/plugins/builtin/holders/beneficial-view.tsx +241 -0
  227. package/src/plugins/builtin/holders/client.ts +3 -6
  228. package/src/plugins/builtin/holders/format.ts +31 -1
  229. package/src/plugins/builtin/holders/headless.ts +161 -6
  230. package/src/plugins/builtin/holders/index.tsx +10 -3
  231. package/src/plugins/builtin/holders/pane.tsx +42 -16
  232. package/src/plugins/builtin/holders/report-header.ts +136 -0
  233. package/src/plugins/builtin/holders/table-model.ts +20 -5
  234. package/src/plugins/builtin/holders/thirteenf-match.ts +29 -1
  235. package/src/plugins/builtin/holders/types.ts +2 -1
  236. package/src/plugins/builtin/insider/headless.ts +2 -0
  237. package/src/plugins/builtin/ipo-calendar/headless.ts +1 -0
  238. package/src/plugins/builtin/iv-history/headless.ts +4 -1
  239. package/src/plugins/builtin/jobs/headless.ts +1 -0
  240. package/src/plugins/builtin/kelly-sizer/index.tsx +1 -0
  241. package/src/plugins/builtin/kelly-sizer/pane.tsx +12 -6
  242. package/src/plugins/builtin/kelly-sizer/portfolio.ts +25 -0
  243. package/src/plugins/builtin/macro-day/headless.ts +2 -0
  244. package/src/plugins/builtin/market-halts/index.tsx +1 -0
  245. package/src/plugins/builtin/market-heatmap/data.ts +2 -0
  246. package/src/plugins/builtin/market-heatmap/headless.ts +135 -0
  247. package/src/plugins/builtin/market-heatmap/index.tsx +39 -46
  248. package/src/plugins/builtin/market-heatmap/model.ts +146 -0
  249. package/src/plugins/builtin/market-heatmap/portfolio.ts +23 -4
  250. package/src/plugins/builtin/market-movers/headless.ts +2 -0
  251. package/src/plugins/builtin/market-valuation/headless.ts +2 -0
  252. package/src/plugins/builtin/members/client.ts +20 -3
  253. package/src/plugins/builtin/members/headless.ts +5 -3
  254. package/src/plugins/builtin/members/model.ts +10 -2
  255. package/src/plugins/builtin/members/pane.tsx +23 -6
  256. package/src/plugins/builtin/mna/distress/headless.ts +1 -0
  257. package/src/plugins/builtin/mna/headless.ts +1 -0
  258. package/src/plugins/builtin/money-markets/headless.ts +1 -0
  259. package/src/plugins/builtin/news/headless.ts +2 -0
  260. package/src/plugins/builtin/news/wire/index.tsx +8 -1
  261. package/src/plugins/builtin/notes/cli.ts +14 -6
  262. package/src/plugins/builtin/notes/index.tsx +1 -0
  263. package/src/plugins/builtin/openfda/index.tsx +1 -0
  264. package/src/plugins/builtin/options-calculator/headless.ts +2 -0
  265. package/src/plugins/builtin/options-positioning/headless.ts +3 -0
  266. package/src/plugins/builtin/options-scenario/headless.ts +5 -0
  267. package/src/plugins/builtin/pe-band/client.ts +48 -3
  268. package/src/plugins/builtin/pe-band/headless.ts +25 -7
  269. package/src/plugins/builtin/pe-band/model.ts +92 -16
  270. package/src/plugins/builtin/pe-band/pane.tsx +33 -16
  271. package/src/plugins/builtin/perps/client.ts +50 -3
  272. package/src/plugins/builtin/perps/headless.ts +144 -16
  273. package/src/plugins/builtin/perps/index.tsx +6 -6
  274. package/src/plugins/builtin/perps/model.ts +189 -12
  275. package/src/plugins/builtin/perps/pane.tsx +249 -48
  276. package/src/plugins/builtin/portfolio-list/account-metrics.ts +16 -1
  277. package/src/plugins/builtin/portfolio-list/allocation.ts +248 -0
  278. package/src/plugins/builtin/portfolio-list/cached-account.ts +42 -0
  279. package/src/plugins/builtin/portfolio-list/cell-version.ts +19 -1
  280. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +328 -29
  281. package/src/plugins/builtin/portfolio-list/cli/render.ts +232 -39
  282. package/src/plugins/builtin/portfolio-list/cli/shared.ts +67 -2
  283. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +35 -31
  284. package/src/plugins/builtin/portfolio-list/column-values.ts +124 -47
  285. package/src/plugins/builtin/portfolio-list/headless.ts +100 -16
  286. package/src/plugins/builtin/portfolio-list/index.tsx +14 -3
  287. package/src/plugins/builtin/portfolio-list/live-valuation.ts +7 -5
  288. package/src/plugins/builtin/portfolio-list/mutations.ts +55 -1
  289. package/src/plugins/builtin/portfolio-list/pane/data.ts +6 -0
  290. package/src/plugins/builtin/portfolio-list/pane/index.tsx +53 -16
  291. package/src/plugins/builtin/portfolio-list/settings.ts +33 -2
  292. package/src/plugins/builtin/portfolio-list/summary/index.tsx +46 -5
  293. package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +11 -1
  294. package/src/plugins/builtin/portfolio-list/summary/totals.ts +26 -7
  295. package/src/plugins/builtin/power/headless.ts +3 -1
  296. package/src/plugins/builtin/rate-path/headless.ts +2 -0
  297. package/src/plugins/builtin/realized-vol/headless.ts +2 -0
  298. package/src/plugins/builtin/relative-rotation/headless.ts +2 -0
  299. package/src/plugins/builtin/research/analyst-headless.ts +3 -0
  300. package/src/plugins/builtin/research/events-headless.ts +2 -0
  301. package/src/plugins/builtin/research/headless.ts +2 -0
  302. package/src/plugins/builtin/research/index.tsx +1 -0
  303. package/src/plugins/builtin/research/relative-valuation-headless.ts +10 -5
  304. package/src/plugins/builtin/research/relative-valuation-model.ts +18 -6
  305. package/src/plugins/builtin/research/relative-valuation-pane.tsx +3 -3
  306. package/src/plugins/builtin/research-search/index.tsx +1 -0
  307. package/src/plugins/builtin/revenue-breakdown/headless.ts +2 -0
  308. package/src/plugins/builtin/reverse-dcf/headless.ts +2 -0
  309. package/src/plugins/builtin/reverse-dcf/model.ts +2 -1
  310. package/src/plugins/builtin/risk-factors/headless.ts +2 -0
  311. package/src/plugins/builtin/scanner/flow-history.ts +2 -13
  312. package/src/plugins/builtin/scanner/headless.ts +14 -0
  313. package/src/plugins/builtin/seasonality/headless.ts +2 -0
  314. package/src/plugins/builtin/sec/command-bar-search.ts +14 -4
  315. package/src/plugins/builtin/sec/filing-content.ts +42 -17
  316. package/src/plugins/builtin/sec/forms.ts +12 -0
  317. package/src/plugins/builtin/sec/headless.ts +2 -0
  318. package/src/plugins/builtin/sectors/client.ts +1 -0
  319. package/src/plugins/builtin/sectors/headless.ts +9 -1
  320. package/src/plugins/builtin/sectors/sector-model.ts +2 -0
  321. package/src/plugins/builtin/shared/crypto-pair.ts +14 -0
  322. package/src/plugins/builtin/shared/locked-rows.tsx +1 -1
  323. package/src/plugins/builtin/shared/members-menu.tsx +260 -0
  324. package/src/plugins/builtin/shared/report-freshness.ts +57 -0
  325. package/src/plugins/builtin/shared/research-cells.tsx +4 -9
  326. package/src/plugins/builtin/short-interest/headless.ts +2 -0
  327. package/src/plugins/builtin/short-interest/watch-headless.ts +1 -0
  328. package/src/plugins/builtin/short-volume/headless.ts +1 -0
  329. package/src/plugins/builtin/short-volume/pane.tsx +1 -1
  330. package/src/plugins/builtin/social-mentions/headless.ts +1 -0
  331. package/src/plugins/builtin/social-mentions/pane.tsx +1 -1
  332. package/src/plugins/builtin/supply-chain/headless.ts +7 -1
  333. package/src/plugins/builtin/supply-chain/index.tsx +10 -1
  334. package/src/plugins/builtin/supply-chain/model.ts +27 -2
  335. package/src/plugins/builtin/supply-chain/pane.tsx +71 -32
  336. package/src/plugins/builtin/themes/headless.ts +3 -0
  337. package/src/plugins/builtin/themes/pane.tsx +3 -0
  338. package/src/plugins/builtin/thirteenf/headless.ts +110 -25
  339. package/src/plugins/builtin/thirteenf/report-notes.ts +149 -0
  340. package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +4 -0
  341. package/src/plugins/builtin/ticker-detail/financials/model.ts +25 -2
  342. package/src/plugins/builtin/ticker-detail/headless.ts +27 -5
  343. package/src/plugins/builtin/ticker-detail/index.tsx +1 -0
  344. package/src/plugins/builtin/ticker-detail/overview/model.ts +17 -5
  345. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +27 -26
  346. package/src/plugins/builtin/time-sales/headless.ts +5 -1
  347. package/src/plugins/builtin/treasury-auctions/headless.ts +1 -0
  348. package/src/plugins/builtin/volatility/headless.ts +6 -1
  349. package/src/plugins/builtin/world-indices/headless.ts +2 -0
  350. package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +159 -0
  351. package/src/plugins/builtin/world-venue-map/basemap.ts +232 -0
  352. package/src/plugins/builtin/world-venue-map/client.ts +45 -0
  353. package/src/plugins/builtin/world-venue-map/country-labels.ts +78 -0
  354. package/src/plugins/builtin/world-venue-map/entity-detail.tsx +147 -0
  355. package/src/plugins/builtin/world-venue-map/entity-table.ts +59 -0
  356. package/src/plugins/builtin/world-venue-map/evidence.ts +77 -0
  357. package/src/plugins/builtin/world-venue-map/feed.ts +293 -0
  358. package/src/plugins/builtin/world-venue-map/geo-draw.tsx +248 -0
  359. package/src/plugins/builtin/world-venue-map/geo-series.ts +142 -0
  360. package/src/plugins/builtin/world-venue-map/geo-svg.tsx +448 -0
  361. package/src/plugins/builtin/world-venue-map/headless.ts +146 -0
  362. package/src/plugins/builtin/world-venue-map/ids.ts +1 -0
  363. package/src/plugins/builtin/world-venue-map/index.ts +69 -6
  364. package/src/plugins/builtin/world-venue-map/layered-pane.tsx +565 -0
  365. package/src/plugins/builtin/world-venue-map/layers.ts +406 -0
  366. package/src/plugins/builtin/world-venue-map/map-symbols.ts +220 -0
  367. package/src/plugins/builtin/world-venue-map/map.tsx +557 -85
  368. package/src/plugins/builtin/world-venue-map/model.ts +23 -4
  369. package/src/plugins/builtin/world-venue-map/natural-earth/index.chunk.ts +202 -0
  370. package/src/plugins/builtin/world-venue-map/natural-earth/labels.chunk.ts +244 -0
  371. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n00.chunk.ts +4 -0
  372. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n15.chunk.ts +4 -0
  373. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n30.chunk.ts +4 -0
  374. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n45.chunk.ts +4 -0
  375. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n60.chunk.ts +4 -0
  376. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n75.chunk.ts +4 -0
  377. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000s15.chunk.ts +4 -0
  378. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000s30.chunk.ts +4 -0
  379. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000s60.chunk.ts +4 -0
  380. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n00.chunk.ts +4 -0
  381. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n15.chunk.ts +4 -0
  382. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n30.chunk.ts +4 -0
  383. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n45.chunk.ts +4 -0
  384. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n60.chunk.ts +4 -0
  385. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n75.chunk.ts +4 -0
  386. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015s15.chunk.ts +4 -0
  387. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015s30.chunk.ts +4 -0
  388. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015s45.chunk.ts +4 -0
  389. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n00.chunk.ts +4 -0
  390. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n15.chunk.ts +4 -0
  391. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n30.chunk.ts +4 -0
  392. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n45.chunk.ts +4 -0
  393. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n60.chunk.ts +4 -0
  394. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n75.chunk.ts +4 -0
  395. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s15.chunk.ts +4 -0
  396. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s30.chunk.ts +4 -0
  397. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s45.chunk.ts +4 -0
  398. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s60.chunk.ts +4 -0
  399. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n00.chunk.ts +4 -0
  400. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n15.chunk.ts +4 -0
  401. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n30.chunk.ts +4 -0
  402. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n45.chunk.ts +4 -0
  403. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n60.chunk.ts +4 -0
  404. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n75.chunk.ts +4 -0
  405. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045s15.chunk.ts +4 -0
  406. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045s30.chunk.ts +4 -0
  407. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045s60.chunk.ts +4 -0
  408. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n00.chunk.ts +4 -0
  409. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n15.chunk.ts +4 -0
  410. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n30.chunk.ts +4 -0
  411. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n45.chunk.ts +4 -0
  412. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n60.chunk.ts +4 -0
  413. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n75.chunk.ts +4 -0
  414. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060s15.chunk.ts +4 -0
  415. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060s30.chunk.ts +4 -0
  416. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060s60.chunk.ts +4 -0
  417. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n00.chunk.ts +4 -0
  418. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n15.chunk.ts +4 -0
  419. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n30.chunk.ts +4 -0
  420. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n45.chunk.ts +4 -0
  421. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n60.chunk.ts +4 -0
  422. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n75.chunk.ts +4 -0
  423. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075s45.chunk.ts +4 -0
  424. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n00.chunk.ts +4 -0
  425. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n15.chunk.ts +4 -0
  426. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n30.chunk.ts +4 -0
  427. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n45.chunk.ts +4 -0
  428. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n60.chunk.ts +4 -0
  429. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n75.chunk.ts +4 -0
  430. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090s15.chunk.ts +4 -0
  431. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n00.chunk.ts +4 -0
  432. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n15.chunk.ts +4 -0
  433. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n30.chunk.ts +4 -0
  434. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n45.chunk.ts +4 -0
  435. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n60.chunk.ts +4 -0
  436. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n75.chunk.ts +4 -0
  437. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105s15.chunk.ts +4 -0
  438. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105s30.chunk.ts +4 -0
  439. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105s45.chunk.ts +4 -0
  440. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n00.chunk.ts +4 -0
  441. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n15.chunk.ts +4 -0
  442. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n30.chunk.ts +4 -0
  443. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n45.chunk.ts +4 -0
  444. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n60.chunk.ts +4 -0
  445. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120s15.chunk.ts +4 -0
  446. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120s30.chunk.ts +4 -0
  447. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120s45.chunk.ts +4 -0
  448. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n00.chunk.ts +4 -0
  449. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n15.chunk.ts +4 -0
  450. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n30.chunk.ts +4 -0
  451. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n45.chunk.ts +4 -0
  452. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n60.chunk.ts +4 -0
  453. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n75.chunk.ts +4 -0
  454. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135s15.chunk.ts +4 -0
  455. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135s30.chunk.ts +4 -0
  456. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135s45.chunk.ts +4 -0
  457. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n00.chunk.ts +4 -0
  458. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n15.chunk.ts +4 -0
  459. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n45.chunk.ts +4 -0
  460. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n60.chunk.ts +4 -0
  461. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n75.chunk.ts +4 -0
  462. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s15.chunk.ts +4 -0
  463. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s30.chunk.ts +4 -0
  464. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s45.chunk.ts +4 -0
  465. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s60.chunk.ts +4 -0
  466. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n00.chunk.ts +4 -0
  467. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n15.chunk.ts +4 -0
  468. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n45.chunk.ts +4 -0
  469. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n60.chunk.ts +4 -0
  470. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s15.chunk.ts +4 -0
  471. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s30.chunk.ts +4 -0
  472. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s45.chunk.ts +4 -0
  473. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s60.chunk.ts +4 -0
  474. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n00.chunk.ts +4 -0
  475. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n15.chunk.ts +4 -0
  476. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n30.chunk.ts +4 -0
  477. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n45.chunk.ts +4 -0
  478. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n60.chunk.ts +4 -0
  479. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n75.chunk.ts +4 -0
  480. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015s15.chunk.ts +4 -0
  481. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015s30.chunk.ts +4 -0
  482. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015s45.chunk.ts +4 -0
  483. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n00.chunk.ts +4 -0
  484. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n15.chunk.ts +4 -0
  485. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n30.chunk.ts +4 -0
  486. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n60.chunk.ts +4 -0
  487. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n75.chunk.ts +4 -0
  488. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030s30.chunk.ts +4 -0
  489. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030s60.chunk.ts +4 -0
  490. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n30.chunk.ts +4 -0
  491. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n45.chunk.ts +4 -0
  492. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n60.chunk.ts +4 -0
  493. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n75.chunk.ts +4 -0
  494. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045s15.chunk.ts +4 -0
  495. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045s30.chunk.ts +4 -0
  496. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045s60.chunk.ts +4 -0
  497. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n00.chunk.ts +4 -0
  498. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n30.chunk.ts +4 -0
  499. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n45.chunk.ts +4 -0
  500. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n60.chunk.ts +4 -0
  501. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n75.chunk.ts +4 -0
  502. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s15.chunk.ts +4 -0
  503. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s30.chunk.ts +4 -0
  504. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s45.chunk.ts +4 -0
  505. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s60.chunk.ts +4 -0
  506. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n00.chunk.ts +4 -0
  507. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n15.chunk.ts +4 -0
  508. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n30.chunk.ts +4 -0
  509. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n45.chunk.ts +4 -0
  510. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n60.chunk.ts +4 -0
  511. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n75.chunk.ts +4 -0
  512. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s15.chunk.ts +4 -0
  513. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s30.chunk.ts +4 -0
  514. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s45.chunk.ts +4 -0
  515. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s60.chunk.ts +4 -0
  516. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n00.chunk.ts +4 -0
  517. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n15.chunk.ts +4 -0
  518. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n30.chunk.ts +4 -0
  519. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n45.chunk.ts +4 -0
  520. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n60.chunk.ts +4 -0
  521. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n75.chunk.ts +4 -0
  522. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s15.chunk.ts +4 -0
  523. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s30.chunk.ts +4 -0
  524. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s45.chunk.ts +4 -0
  525. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s60.chunk.ts +4 -0
  526. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n00.chunk.ts +4 -0
  527. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n15.chunk.ts +4 -0
  528. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n30.chunk.ts +4 -0
  529. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n45.chunk.ts +4 -0
  530. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n60.chunk.ts +4 -0
  531. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n75.chunk.ts +4 -0
  532. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105s15.chunk.ts +4 -0
  533. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n00.chunk.ts +4 -0
  534. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n15.chunk.ts +4 -0
  535. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n30.chunk.ts +4 -0
  536. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n45.chunk.ts +4 -0
  537. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n60.chunk.ts +4 -0
  538. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n75.chunk.ts +4 -0
  539. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120s30.chunk.ts +4 -0
  540. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n30.chunk.ts +4 -0
  541. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n45.chunk.ts +4 -0
  542. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n60.chunk.ts +4 -0
  543. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n75.chunk.ts +4 -0
  544. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135s30.chunk.ts +4 -0
  545. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150n45.chunk.ts +4 -0
  546. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150n60.chunk.ts +4 -0
  547. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150s15.chunk.ts +4 -0
  548. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150s30.chunk.ts +4 -0
  549. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n00.chunk.ts +4 -0
  550. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n15.chunk.ts +4 -0
  551. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n45.chunk.ts +4 -0
  552. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n60.chunk.ts +4 -0
  553. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165s15.chunk.ts +4 -0
  554. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165s30.chunk.ts +4 -0
  555. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n00.chunk.ts +4 -0
  556. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n15.chunk.ts +4 -0
  557. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n45.chunk.ts +4 -0
  558. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n60.chunk.ts +4 -0
  559. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180s15.chunk.ts +4 -0
  560. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180s30.chunk.ts +4 -0
  561. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180s45.chunk.ts +4 -0
  562. package/src/plugins/builtin/world-venue-map/natural-earth/world-50m.chunk.ts +4 -0
  563. package/src/plugins/builtin/world-venue-map/pane.tsx +35 -44
  564. package/src/plugins/builtin/world-venue-map/use-geo.ts +55 -0
  565. package/src/plugins/builtin/world-venue-map/venue-header.tsx +32 -0
  566. package/src/plugins/builtin/yield-curve/headless.ts +16 -0
  567. package/src/plugins/loader.ts +13 -1
  568. package/src/plugins/registry/pane-settings.ts +1 -0
  569. package/src/renderers/browser/app-services.ts +3 -1
  570. package/src/renderers/dom/build-assets.ts +81 -3
  571. package/src/renderers/dom/data-table/dom.ts +31 -0
  572. package/src/renderers/dom/data-table/index.tsx +5 -0
  573. package/src/renderers/dom/data-table/row.tsx +2 -0
  574. package/src/renderers/dom/desktop/controls.tsx +7 -3
  575. package/src/renderers/dom/desktop/list-view.tsx +35 -10
  576. package/src/renderers/dom/desktop/popover.tsx +73 -14
  577. package/src/renderers/dom/host/box.tsx +113 -17
  578. package/src/renderers/dom/host/drag-shield.ts +24 -0
  579. package/src/renderers/dom/host/input.tsx +14 -3
  580. package/src/renderers/dom/host/live-frame.ts +54 -0
  581. package/src/renderers/dom/host/mouse.ts +8 -1
  582. package/src/renderers/dom/host/scroll-box.tsx +6 -5
  583. package/src/renderers/dom/host/tabs.tsx +3 -2
  584. package/src/renderers/dom/styles.css +16 -9
  585. package/src/renderers/electrobun/bun/desktop/backend-requests.ts +7 -0
  586. package/src/renderers/electrobun/bun/desktop/backend.ts +2 -0
  587. package/src/renderers/electrobun/bun/desktop/initialization.ts +13 -0
  588. package/src/renderers/electrobun/shared/protocol.ts +10 -1
  589. package/src/renderers/electrobun/view/backend-rpc.ts +10 -4
  590. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +4 -0
  591. package/src/renderers/electrobun/view/host/native.ts +0 -10
  592. package/src/renderers/electrobun/view/host/window-move.ts +28 -0
  593. package/src/renderers/electrobun/view/remote/persistence.ts +15 -2
  594. package/src/renderers/electrobun/view/rpc-timeout.ts +14 -3
  595. package/src/renderers/electrobun/view/ui-host.tsx +2 -5
  596. package/src/renderers/opentui/host.tsx +5 -0
  597. package/src/renderers/opentui/ui-host.tsx +7 -1
  598. package/src/sources/gloomberb-cloud/index.ts +25 -4
  599. package/src/sources/gloomberb-cloud/normalizers.ts +43 -23
  600. package/src/sources/provider-router/batches.ts +3 -3
  601. package/src/sources/provider-router/cached-routes.ts +4 -1
  602. package/src/sources/provider-router/financial-routes.ts +2 -2
  603. package/src/sources/provider-router/financials.ts +76 -12
  604. package/src/sources/provider-router/history.ts +15 -10
  605. package/src/sources/provider-router/primary.ts +2 -2
  606. package/src/sources/sec-registrant.ts +75 -0
  607. package/src/state/app/context/index.tsx +24 -8
  608. package/src/state/hooks/quote-streaming.ts +41 -26
  609. package/src/state/pane-scroll-registry.tsx +67 -35
  610. package/src/sync/core-contributors.ts +4 -0
  611. package/src/telemetry/crash-reports.ts +4 -1
  612. package/src/test-support/cli-context.ts +10 -2
  613. package/src/test-support/margin-account.ts +108 -0
  614. package/src/theme/heat-colors.ts +266 -84
  615. package/src/time-series/resolution.ts +15 -0
  616. package/src/time-series/resolve.ts +1 -1
  617. package/src/time-series/use-chart-resolution.ts +1 -1
  618. package/src/types/context-menu.ts +6 -0
  619. package/src/types/data-provider.ts +2 -0
  620. package/src/types/financials.ts +35 -3
  621. package/src/types/headless.ts +79 -2
  622. package/src/types/plugin.ts +20 -1
  623. package/src/types/ticker.ts +15 -0
  624. package/src/ui/host.tsx +26 -0
  625. package/src/ui/index.tsx +8 -3
  626. package/src/ui/scroll-box-axis.ts +26 -0
  627. package/src/updater/index.ts +9 -11
  628. package/src/utils/async-deadline.ts +21 -0
  629. package/src/utils/cli-output.ts +5 -1
  630. package/src/utils/crypto-pair.ts +41 -0
  631. package/src/utils/currency-units.ts +19 -0
  632. package/src/utils/depositary-receipt.ts +70 -0
  633. package/src/utils/display-number.ts +63 -0
  634. package/src/utils/exchanges.ts +72 -0
  635. package/src/utils/fire-and-forget.ts +24 -0
  636. package/src/utils/format.ts +13 -0
  637. package/src/utils/fundamentals.ts +17 -1
  638. package/src/utils/price-earnings.ts +70 -3
  639. package/src/utils/price-history-integrity.ts +19 -6
  640. package/src/utils/price-history.ts +58 -13
  641. package/src/utils/rpc-timeout-error.ts +27 -0
  642. package/src/utils/sec.ts +13 -1
  643. package/src/utils/utc-time.ts +79 -0
package/README.md CHANGED
@@ -86,7 +86,8 @@ Press `Ctrl+P` to open the command bar, or press `` ` `` to search for a ticker.
86
86
  | `TOP` | Market stories |
87
87
  | `WIRP` / `FFIP` | US rate path and conditional FOMC probabilities |
88
88
  | `BTMM` | Funding rates, bill curves and Federal Reserve liquidity |
89
- | `CTM [root]` | Futures contract curve, historical ghosts, roll yield and open interest, including `CTM VX` |
89
+ | `CTM [root]` | Futures contract curve, historical ghosts, roll yield and open interest, including `CTM VX` and CME crypto (`CTM BTC`) |
90
+ | `MAP ships` / `CHOKE` | Ships, ports, energy and airports on one map, and chokepoint transits as chart series ([guide](docs/world-map.md)) |
90
91
  | `PF` | Portfolios and watchlists |
91
92
  | `HELP` | Commands and keyboard shortcuts |
92
93
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gloomberb",
3
- "version": "0.16.1",
3
+ "version": "0.16.3",
4
4
  "packageManager": "bun@1.3.11",
5
5
  "description": "Market research and portfolio tracker for the terminal",
6
6
  "module": "src/public/index.ts",
@@ -66,6 +66,7 @@
66
66
  "plugins:manifest:check": "bun run scripts/generate-plugin-manifest.ts --check",
67
67
  "plugins:registry:check": "bun run scripts/check-registry-plugins.ts",
68
68
  "web:proxy-hosts": "bun run scripts/generate-web-proxy-hosts.ts",
69
+ "map:data": "bun run scripts/generate-world-map-data.ts",
69
70
  "web:proxy-hosts:check": "bun run scripts/generate-web-proxy-hosts.ts --check",
70
71
  "typecheck": "bun run typecheck:opentui && bun run typecheck:dom && bun run typecheck:cloudflare && bun run typecheck:scripts && bun run typecheck:plugin-tests",
71
72
  "typecheck:opentui": "tsc --project tsconfig.opentui.json",
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Schedule 13D and 13G beneficial ownership reports about one issuer, as
3
+ * `GET /cloud/sec/beneficial-owners` returns them. Percentages are percent
4
+ * points (7.3 means 7.3% of the class) and dates are `YYYY-MM-DD`.
5
+ */
6
+
7
+ type BeneficialOwnerKind = "13D" | "13G";
8
+ /**
9
+ * What the filer's latest report says it holds: `below-threshold` is a
10
+ * reported stake under 5% (still a stake, no longer reportable), `exited` a
11
+ * report of zero shares or 0%.
12
+ */
13
+ export type BeneficialOwnerStatus = "holder" | "below-threshold" | "exited";
14
+ /** Which reports to list; the route takes the kind in capitals. */
15
+ export type BeneficialOwnersForm = "all" | BeneficialOwnerKind;
16
+
17
+ export interface BeneficialOwnerReportingPerson {
18
+ name: string;
19
+ cik: string | null;
20
+ percentOfClass: number | null;
21
+ shares: number | null;
22
+ }
23
+
24
+ /**
25
+ * One report: the latest per filer in `owners`, every report in `filings`.
26
+ * The previous-report fields and `status` come only with `owners`.
27
+ */
28
+ export interface BeneficialOwnerFiling {
29
+ filerCik: string | null;
30
+ filerName: string;
31
+ /** The EDGAR form type as filed, such as `SCHEDULE 13G/A`. */
32
+ form: string;
33
+ kind: BeneficialOwnerKind;
34
+ amendment: boolean;
35
+ amendmentNo: number | null;
36
+ percentOfClass: number | null;
37
+ shares: number | null;
38
+ classTitle: string | null;
39
+ cusip: string | null;
40
+ eventDate: string | null;
41
+ filingDate: string;
42
+ accessionNumber: string;
43
+ filingUrl: string;
44
+ /** The same filer's percentage in its report before this one. */
45
+ previousPercent?: number | null;
46
+ previousFilingDate?: string | null;
47
+ status?: BeneficialOwnerStatus;
48
+ /**
49
+ * Only with `owners`: a filing the route could not read may be this filer's
50
+ * newer report or its real previous one, so the row and its change may be off.
51
+ */
52
+ provisional?: boolean;
53
+ /** `text` and `index` reports could not be read in full; their missing numbers stay null. */
54
+ source: "xml" | "text" | "index";
55
+ reportingPersons: BeneficialOwnerReportingPerson[];
56
+ }
57
+
58
+ export interface BeneficialOwnersCoverage {
59
+ from: string | null;
60
+ /** Reports listed for the issuer in the window. */
61
+ filings: number;
62
+ /** Reports whose cover page was read. */
63
+ parsed: number;
64
+ /** Reports known only from the EDGAR index: listed, with their figures missing. */
65
+ unparsed: number;
66
+ /** Reports that could not be read this time and are left out until a later request. */
67
+ unavailable?: number;
68
+ /** Every report in the window was read; when false the owners are provisional. */
69
+ complete?: boolean;
70
+ }
71
+
72
+ export interface BeneficialOwnersPayload {
73
+ ticker: string;
74
+ cik: string;
75
+ companyName: string;
76
+ /** When the server assembled the list, an ISO time. */
77
+ asOf: string | null;
78
+ owners: BeneficialOwnerFiling[];
79
+ /** Only when the request asked for the history. Newest first. */
80
+ filings?: BeneficialOwnerFiling[];
81
+ hasMore: boolean;
82
+ nextOffset: number | null;
83
+ coverage: BeneficialOwnersCoverage | null;
84
+ }
85
+
86
+ export interface CloudBeneficialOwnersParams {
87
+ ticker: string;
88
+ form?: BeneficialOwnersForm;
89
+ history?: boolean;
90
+ limit?: number;
91
+ offset?: number;
92
+ }
@@ -30,6 +30,7 @@ import type { MoneyMarketsPayload } from "./money-markets";
30
30
  import type { CloudCurveId, CloudCurveView, CloudWorldCurves } from "./yield-curves";
31
31
  import type { CdxBoardPayload, CloudCreditBoardParams, SovrBoardPayload } from "./credit-boards";
32
32
  import type { ShortVolumePayload, ShortVolumeScope } from "./short-volume";
33
+ import type { BeneficialOwnersPayload, CloudBeneficialOwnersParams } from "./beneficial-owners";
33
34
  import type { SocialMentionDayPosts, SocialMentionsPayload, SocialMentionsRange } from "./social-mentions";
34
35
  import type { FuturesCurveAsOfPayload, FuturesCurvePayload } from "./futures-curve";
35
36
  import type { CotBoardPayload, CotContractPayload, CotFamily, CotClass } from "./cot";
@@ -37,6 +38,7 @@ import type { DoeBoardPayload } from "./doe";
37
38
  import type { GpuBoardPayload, GpuEventsPayload, GpuHistoryPayload, GpuHistoryQuery } from "./gpu";
38
39
  import type { CpiBoardPayload } from "./cpi";
39
40
  import type { TapeSnapshot } from "./tape";
41
+ import { signalWithTimeout } from "../utils/async-deadline";
40
42
  import type { ExchangeRateSnapshot } from "../types/exchange-rate";
41
43
  import type { RatePathPayload } from "./rates";
42
44
  import type { EarningsCalendarPayload, EarningsCalendarQuery, EarningsHistoryPayload } from "./earnings";
@@ -70,6 +72,7 @@ import {
70
72
  cloudProxyStatementsPath,
71
73
  cloudExchangeRatePath,
72
74
  cloudSec13FPath,
75
+ cloudSecBeneficialOwnersPath,
73
76
  cloudSecFilingContentPath,
74
77
  cloudSecFilingDocumentsPath,
75
78
  cloudSecFilingsPath,
@@ -434,6 +437,11 @@ export class CloudDataApi {
434
437
  return this.request<CotContractPayload>(`/cloud/cot/contracts/${encodeURIComponent(code)}?${new URLSearchParams({ report })}`);
435
438
  }
436
439
 
440
+ /** Geo layers (the map's layers, entities and series); one prefix-scoped method, like EQS. */
441
+ geo<T>(path: string, init?: RequestInit): Promise<T> {
442
+ return this.request<T>(`/cloud/geo/${path}`, init);
443
+ }
444
+
437
445
  /** Credit-document paths stay with their pane; keep the shared client small. */
438
446
  creditDocuments<T>(path: string): Promise<T> {
439
447
  return this.request<T>(`/cloud/credit-documents/${path}`);
@@ -572,7 +580,7 @@ export class CloudDataApi {
572
580
  }
573
581
 
574
582
  async getCloudTape(symbol: string, exchange: string, signal?: AbortSignal): Promise<TapeSnapshot> {
575
- return this.request<TapeSnapshot>(`/cloud/tape/${encodeURIComponent(symbol)}?exchange=${encodeURIComponent(exchange)}`, { signal: signal ?? AbortSignal.timeout(30_000) });
583
+ return this.request<TapeSnapshot>(`/cloud/tape/${encodeURIComponent(symbol)}?exchange=${encodeURIComponent(exchange)}`, { signal: signalWithTimeout(signal, 30_000) });
576
584
  }
577
585
 
578
586
  async getCloudYieldCurve(): Promise<CloudYieldPointPayload[]> {
@@ -628,29 +636,29 @@ export class CloudDataApi {
628
636
  }
629
637
  const text = query.toString();
630
638
  const suffix = text ? `?${text}` : "";
631
- return this.request<MnaDealsPayload>(`/cloud/mna/deals${suffix}`, { signal: options?.signal ?? AbortSignal.timeout(30_000) });
639
+ return this.request<MnaDealsPayload>(`/cloud/mna/deals${suffix}`, { signal: signalWithTimeout(options?.signal, 30_000) });
632
640
  }
633
641
 
634
642
  async getCloudMnaDeal(id: string, options?: { signal?: AbortSignal }): Promise<MnaDealPayload> {
635
- return this.request<MnaDealPayload>(`/cloud/mna/deals/${encodeURIComponent(id)}`, { signal: options?.signal ?? AbortSignal.timeout(30_000) });
643
+ return this.request<MnaDealPayload>(`/cloud/mna/deals/${encodeURIComponent(id)}`, { signal: signalWithTimeout(options?.signal, 30_000) });
636
644
  }
637
645
 
638
646
  // Public records about companies in difficulty. The answers are unchecked
639
647
  // JSON: the distress tab's parsers validate them before anything is drawn.
640
648
  async getPublicDistressFilings(params: DistressFilingsParams, options?: { signal?: AbortSignal }): Promise<unknown> {
641
- return this.request<unknown>(`/public/events${distressQuery(params)}`, { signal: options?.signal ?? AbortSignal.timeout(30_000) });
649
+ return this.request<unknown>(`/public/events${distressQuery(params)}`, { signal: signalWithTimeout(options?.signal, 30_000) });
642
650
  }
643
651
 
644
652
  async getPublicGoingConcern(params: GoingConcernParams = {}, options?: { signal?: AbortSignal }): Promise<unknown> {
645
- return this.request<unknown>(`/public/going-concern${distressQuery(params)}`, { signal: options?.signal ?? AbortSignal.timeout(30_000) });
653
+ return this.request<unknown>(`/public/going-concern${distressQuery(params)}`, { signal: signalWithTimeout(options?.signal, 30_000) });
646
654
  }
647
655
 
648
656
  async getPublicDistressDesignations(params: DistressDesignationsParams = {}, options?: { signal?: AbortSignal }): Promise<unknown> {
649
- return this.request<unknown>(`/public/distress-designations${distressQuery(params)}`, { signal: options?.signal ?? AbortSignal.timeout(30_000) });
657
+ return this.request<unknown>(`/public/distress-designations${distressQuery(params)}`, { signal: signalWithTimeout(options?.signal, 30_000) });
650
658
  }
651
659
 
652
660
  async getPublicInsolvencyNotices(params: InsolvencyNoticesParams = {}, options?: { signal?: AbortSignal }): Promise<unknown> {
653
- return this.request<unknown>(`/public/insolvency-notices${distressQuery(params)}`, { signal: options?.signal ?? AbortSignal.timeout(30_000) });
661
+ return this.request<unknown>(`/public/insolvency-notices${distressQuery(params)}`, { signal: signalWithTimeout(options?.signal, 30_000) });
654
662
  }
655
663
 
656
664
  async getCloudIpoCalendar(params: IpoCalendarParams = {}, options?: { signal?: AbortSignal }): Promise<IpoCalendarPayload> {
@@ -660,7 +668,7 @@ export class CloudDataApi {
660
668
  }
661
669
  const text = query.toString();
662
670
  const suffix = text ? `?${text}` : "";
663
- return this.request<IpoCalendarPayload>(`/cloud/ipo/calendar${suffix}`, { signal: options?.signal ?? AbortSignal.timeout(30_000) });
671
+ return this.request<IpoCalendarPayload>(`/cloud/ipo/calendar${suffix}`, { signal: signalWithTimeout(options?.signal, 30_000) });
664
672
  }
665
673
 
666
674
  async getCloudShortVolume(symbol: string, scope: ShortVolumeScope = "nms"): Promise<ShortVolumePayload> {
@@ -795,6 +803,16 @@ export class CloudDataApi {
795
803
  return this.request<CloudSecFilingsResponse>(cloudSecFilingsPath(params));
796
804
  }
797
805
 
806
+ /** Schedule 13D/13G reports about an issuer. Unknown tickers answer 404; no reports is an empty `owners`. */
807
+ async getCloudSecBeneficialOwners(
808
+ params: CloudBeneficialOwnersParams,
809
+ options?: { signal?: AbortSignal },
810
+ ): Promise<BeneficialOwnersPayload> {
811
+ return this.request<BeneficialOwnersPayload>(cloudSecBeneficialOwnersPath(params), {
812
+ signal: options?.signal,
813
+ });
814
+ }
815
+
798
816
  async getCloudSecFilingDocuments(
799
817
  params: CloudSecFilingParams,
800
818
  ): Promise<CloudSecDocumentsResponse> {
@@ -12,6 +12,8 @@ export class ApiRequestError extends Error {
12
12
  readonly retryAfterMs?: number,
13
13
  /** The body's `error` field, e.g. a broker route's "unsupported" or "tool_error". */
14
14
  readonly code?: string,
15
+ /** The rest of a JSON error body, for a route that says more, e.g. which user refused a chat. */
16
+ readonly details?: Readonly<Record<string, unknown>>,
15
17
  ) {
16
18
  super(message);
17
19
  this.name = "ApiRequestError";
@@ -79,6 +81,16 @@ export function parseApiErrorMessage(body: string): string {
79
81
  }
80
82
  }
81
83
 
84
+ /** A JSON error body as an object, or undefined for any other body. */
85
+ export function parseApiErrorDetails(body: string): Readonly<Record<string, unknown>> | undefined {
86
+ try {
87
+ const parsed = JSON.parse(body) as unknown;
88
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed as Record<string, unknown> : undefined;
89
+ } catch {
90
+ return undefined;
91
+ }
92
+ }
93
+
82
94
  /** The JSON body's `error` field, which routes that name their failures set to a code. */
83
95
  export function parseApiErrorCode(body: string): string | undefined {
84
96
  try {
@@ -0,0 +1,363 @@
1
+ /**
2
+ * Geo layers, as GET /cloud/geo/* serves them: anything with a place (a ship,
3
+ * a port, a pipeline) as map features, an entity table and chart series. The
4
+ * types mirror the server's wire contract field for field. The app knows only
5
+ * this contract, so a layer the server adds needs no release.
6
+ *
7
+ * Failures carry `{ error, message }`: 404 `not_found`, 400 `invalid_bbox`,
8
+ * 403 `pro_required`, 429 `geo_rate_limited` with Retry-After, 503
9
+ * `geo_unavailable`. A layer that cannot serve still answers 200 with an
10
+ * empty body and its `status` and `statusNote`.
11
+ */
12
+ type Lon = number;
13
+ type Lat = number;
14
+
15
+ type GeoGeometry =
16
+ | { type: "Point"; coordinates: [Lon, Lat] }
17
+ | { type: "LineString"; coordinates: [Lon, Lat][] }
18
+ | { type: "MultiLineString"; coordinates: [Lon, Lat][][] }
19
+ | { type: "Polygon"; coordinates: [Lon, Lat][][] };
20
+
21
+ export interface GeoTickerLink {
22
+ symbol: string;
23
+ exchange?: string;
24
+ /** How the entity relates to the company. */
25
+ via: "owner" | "operator" | "route" | "sector";
26
+ confidence: "reviewed" | "inferred";
27
+ /** Short, e.g. "Operates the pipeline". */
28
+ note?: string;
29
+ }
30
+
31
+ export type GeoPropValue = string | number | boolean | null;
32
+
33
+ export interface GeoFeature {
34
+ /** Stable within the layer, e.g. "mmsi:123456789", "iata:JFK", "choke:suez". */
35
+ id: string;
36
+ layer: string;
37
+ entityKind: string;
38
+ label: string;
39
+ geometry: GeoGeometry;
40
+ /** ISO time of the observation; null for static layers. */
41
+ ts: string | null;
42
+ /** Flat, display-ready values. */
43
+ props: Record<string, GeoPropValue>;
44
+ tickers?: GeoTickerLink[];
45
+ }
46
+
47
+ /** `percent1` values are percentage points: 12.3 reads 12.3%. */
48
+ export type GeoColumnFormat = "text" | "int" | "decimal1" | "percent1" | "datetime" | "knots" | "km";
49
+
50
+ export interface GeoColumn {
51
+ key: string;
52
+ label: string;
53
+ align?: "left" | "right";
54
+ format?: GeoColumnFormat;
55
+ }
56
+
57
+ export interface GeoSeriesInfo {
58
+ id: string;
59
+ name: string;
60
+ unit: string;
61
+ frequency: "daily" | "weekly" | "monthly";
62
+ entityId?: string;
63
+ }
64
+
65
+ type GeoLayerGroup = "ships" | "air" | "energy" | "ports" | "infrastructure";
66
+ type GeoLayerStatus = "ok" | "partial" | "unavailable";
67
+
68
+ export interface GeoLayerInfo {
69
+ id: string;
70
+ name: string;
71
+ /** A group the app does not know yet still lists, under its own name. */
72
+ group: GeoLayerGroup | (string & {});
73
+ geometry: "point" | "line" | "area";
74
+ cadence: "live" | "daily" | "static";
75
+ /** How often a client should re-request features; null for static layers. */
76
+ refreshSeconds: number | null;
77
+ asOf: string | null;
78
+ count: number | null;
79
+ status: GeoLayerStatus;
80
+ /** Short plain words, never a source name. */
81
+ statusNote?: string;
82
+ access: "free" | "pro";
83
+ /** The entity table's columns; the first is the label. */
84
+ columns: GeoColumn[];
85
+ series: GeoSeriesInfo[];
86
+ defaultVisible: boolean;
87
+ /** Below this zoom the client requests nothing. */
88
+ minZoom?: number;
89
+ }
90
+
91
+ export interface GeoLayersPayload {
92
+ layers: GeoLayerInfo[];
93
+ asOf: string | null;
94
+ }
95
+
96
+ export interface GeoCluster {
97
+ id: string;
98
+ lon: Lon;
99
+ lat: Lat;
100
+ count: number;
101
+ kinds?: Record<string, number>;
102
+ }
103
+
104
+ /**
105
+ * A clustering answer has no features: everything is in `clusters`. Closer
106
+ * in, a capped answer keeps the top features by rank and sets `truncated`.
107
+ */
108
+ export interface GeoFeaturesPayload {
109
+ layer: string;
110
+ asOf: string | null;
111
+ features: GeoFeature[];
112
+ total: number;
113
+ truncated: boolean;
114
+ clusters?: GeoCluster[];
115
+ /** Present when the layer cannot serve right now, with the same words as the catalog. */
116
+ status?: GeoLayerStatus;
117
+ statusNote?: string;
118
+ }
119
+
120
+ export interface GeoEntityRow {
121
+ id: string;
122
+ label: string;
123
+ lon: Lon;
124
+ lat: Lat;
125
+ props: Record<string, GeoPropValue>;
126
+ tickers?: GeoTickerLink[];
127
+ }
128
+
129
+ export interface GeoEntitiesPayload {
130
+ layer: string;
131
+ asOf: string | null;
132
+ columns: GeoColumn[];
133
+ rows: GeoEntityRow[];
134
+ total: number;
135
+ status?: GeoLayerStatus;
136
+ statusNote?: string;
137
+ }
138
+
139
+ /** Longitude, latitude and the ISO time the entity was seen there. */
140
+ type GeoTrailPoint = [Lon, Lat, string];
141
+
142
+ export interface GeoEntityPayload {
143
+ feature: GeoFeature;
144
+ detail: Record<string, GeoPropValue>;
145
+ /** Oldest first. */
146
+ trail?: GeoTrailPoint[];
147
+ series?: GeoSeriesInfo[];
148
+ }
149
+
150
+ /** `alias` is the short form G takes (SUEZ, HORMUZ.TANKER); ids are the server's own. */
151
+ export type GeoSeriesSearchHit = GeoSeriesInfo & { layer: string; alias?: string };
152
+
153
+ export interface GeoSeriesSearchPayload {
154
+ series: GeoSeriesSearchHit[];
155
+ }
156
+
157
+ export interface GeoSeriesPayload {
158
+ id: string;
159
+ name: string;
160
+ unit: string;
161
+ frequency: GeoSeriesInfo["frequency"];
162
+ /** [YYYY-MM-DD, value], oldest first. */
163
+ points: [string, number][];
164
+ asOf: string | null;
165
+ }
166
+
167
+ /** West, south, east, north in degrees. */
168
+ export type GeoBbox = [number, number, number, number];
169
+
170
+ /** A request under /cloud/geo/, through the shared Cloud client (`apiClient.geo`). */
171
+ export type GeoRequest = <T>(path: string, init?: RequestInit) => Promise<T>;
172
+
173
+ /** The server's default cap on one features answer; above it a point layer answers clusters. */
174
+ export const GEO_FEATURE_LIMIT = 1500;
175
+ const GEO_FEATURE_LIMIT_MAX = 5000;
176
+ /** Live layers a client may keep refreshing at once. */
177
+ export const GEO_MAX_LIVE_LAYERS = 2;
178
+ const CATALOG_TTL_MS = 5 * 60_000;
179
+ /** A server without geo layers is asked again only after this long. */
180
+ const ABSENT_TTL_MS = 10 * 60_000;
181
+
182
+ function query(params: Record<string, string | number | undefined | null>): string {
183
+ const search = new URLSearchParams();
184
+ for (const [key, value] of Object.entries(params)) {
185
+ if (value === undefined || value === null || value === "") continue;
186
+ search.set(key, String(value));
187
+ }
188
+ // Commas stay literal (bbox=w,s,e,n), as the contract writes them and caches key them.
189
+ const text = search.toString().replaceAll("%2C", ",");
190
+ return text ? `?${text}` : "";
191
+ }
192
+
193
+ function segment(value: string): string {
194
+ return encodeURIComponent(value);
195
+ }
196
+
197
+ function bboxParam(bbox: GeoBbox | undefined): string | undefined {
198
+ return bbox ? bbox.map((value) => Number(value.toFixed(3))).join(",") : undefined;
199
+ }
200
+
201
+ export interface GeoFeaturesQuery {
202
+ bbox?: GeoBbox;
203
+ zoom?: number;
204
+ limit?: number;
205
+ }
206
+
207
+ export function getGeoFeatures(
208
+ request: GeoRequest,
209
+ layerId: string,
210
+ options: GeoFeaturesQuery = {},
211
+ signal?: AbortSignal,
212
+ ): Promise<GeoFeaturesPayload> {
213
+ const limit = Math.max(1, Math.min(options.limit ?? GEO_FEATURE_LIMIT, GEO_FEATURE_LIMIT_MAX));
214
+ return request<GeoFeaturesPayload>(
215
+ `layers/${segment(layerId)}/features${query({ bbox: bboxParam(options.bbox), zoom: options.zoom, limit })}`,
216
+ signal ? { signal } : undefined,
217
+ );
218
+ }
219
+
220
+ export interface GeoEntitiesQuery {
221
+ q?: string;
222
+ sort?: string;
223
+ dir?: "asc" | "desc";
224
+ limit?: number;
225
+ offset?: number;
226
+ bbox?: GeoBbox;
227
+ }
228
+
229
+ export function getGeoEntities(
230
+ request: GeoRequest,
231
+ layerId: string,
232
+ options: GeoEntitiesQuery = {},
233
+ signal?: AbortSignal,
234
+ ): Promise<GeoEntitiesPayload> {
235
+ return request<GeoEntitiesPayload>(
236
+ `layers/${segment(layerId)}/entities${query({
237
+ q: options.q?.trim(),
238
+ sort: options.sort,
239
+ dir: options.sort ? options.dir : undefined,
240
+ limit: options.limit,
241
+ offset: options.offset,
242
+ bbox: bboxParam(options.bbox),
243
+ })}`,
244
+ signal ? { signal } : undefined,
245
+ );
246
+ }
247
+
248
+ export function getGeoEntity(
249
+ request: GeoRequest,
250
+ layerId: string,
251
+ entityId: string,
252
+ signal?: AbortSignal,
253
+ ): Promise<GeoEntityPayload> {
254
+ return request<GeoEntityPayload>(`entities/${segment(layerId)}/${segment(entityId)}`, signal ? { signal } : undefined);
255
+ }
256
+
257
+ export function searchGeoSeries(request: GeoRequest, q: string, signal?: AbortSignal): Promise<GeoSeriesSearchPayload> {
258
+ return request<GeoSeriesSearchPayload>(`series${query({ q: q.trim() })}`, signal ? { signal } : undefined);
259
+ }
260
+
261
+ export function getGeoSeries(
262
+ request: GeoRequest,
263
+ seriesId: string,
264
+ range: { from?: string; to?: string } = {},
265
+ signal?: AbortSignal,
266
+ ): Promise<GeoSeriesPayload> {
267
+ return request<GeoSeriesPayload>(`series/${segment(seriesId)}${query(range)}`, signal ? { signal } : undefined);
268
+ }
269
+
270
+ /**
271
+ * Finds a series by id or short alias (SUEZ). Exact matches win over a series
272
+ * whose name merely contains the text.
273
+ */
274
+ export async function resolveGeoSeries(
275
+ request: GeoRequest,
276
+ token: string,
277
+ signal?: AbortSignal,
278
+ ): Promise<GeoSeriesSearchHit | null> {
279
+ const needle = token.trim().toLowerCase();
280
+ if (!needle) return null;
281
+ const { series } = await searchGeoSeries(request, token, signal);
282
+ return series.find((hit) => hit.id.toLowerCase() === needle)
283
+ ?? series.find((hit) => hit.alias?.toLowerCase() === needle)
284
+ ?? null;
285
+ }
286
+
287
+ interface CatalogEntry {
288
+ at: number;
289
+ payload: GeoLayersPayload | null;
290
+ }
291
+
292
+ let catalogEntry: CatalogEntry | null = null;
293
+ let catalogInFlight: Promise<GeoLayersPayload | null> | null = null;
294
+
295
+ function validLayer(value: unknown): value is GeoLayerInfo {
296
+ if (!value || typeof value !== "object") return false;
297
+ const layer = value as Partial<GeoLayerInfo>;
298
+ return typeof layer.id === "string" && !!layer.id && typeof layer.name === "string"
299
+ && (layer.geometry === "point" || layer.geometry === "line" || layer.geometry === "area")
300
+ && Array.isArray(layer.columns);
301
+ }
302
+
303
+ function normalizeCatalog(payload: unknown): GeoLayersPayload | null {
304
+ if (!payload || typeof payload !== "object" || !Array.isArray((payload as GeoLayersPayload).layers)) return null;
305
+ const raw = payload as GeoLayersPayload;
306
+ const layers = raw.layers.filter(validLayer).map((layer) => ({
307
+ ...layer,
308
+ series: Array.isArray(layer.series) ? layer.series : [],
309
+ refreshSeconds: typeof layer.refreshSeconds === "number" && layer.refreshSeconds > 0 ? layer.refreshSeconds : null,
310
+ }));
311
+ return layers.length ? { layers, asOf: raw.asOf ?? null } : null;
312
+ }
313
+
314
+ /**
315
+ * The layer catalog, or null when this server has no geo layers. A 404, a
316
+ * failed request or an empty answer all read as "no layers", so the map stays
317
+ * the venue map it was, without errors. Answers are kept for a few minutes.
318
+ */
319
+ export async function loadGeoCatalog(
320
+ request: GeoRequest,
321
+ options: { force?: boolean; signal?: AbortSignal; now?: number } = {},
322
+ ): Promise<GeoLayersPayload | null> {
323
+ const now = options.now ?? Date.now();
324
+ if (!options.force && catalogEntry) {
325
+ const ttl = catalogEntry.payload ? CATALOG_TTL_MS : ABSENT_TTL_MS;
326
+ if (now - catalogEntry.at < ttl) return catalogEntry.payload;
327
+ }
328
+ if (!catalogInFlight) {
329
+ catalogInFlight = request<unknown>("layers")
330
+ .then(normalizeCatalog)
331
+ // A missing route or a refusal is an answer; a network blip is too, for a while.
332
+ .catch(() => null)
333
+ .then((payload) => {
334
+ catalogEntry = { at: options.now ?? Date.now(), payload };
335
+ return payload;
336
+ })
337
+ .finally(() => {
338
+ catalogInFlight = null;
339
+ });
340
+ }
341
+ const pending = catalogInFlight;
342
+ if (!options.signal) return pending;
343
+ return new Promise((resolve, reject) => {
344
+ const abort = () => reject(options.signal!.reason ?? new DOMException("Aborted", "AbortError"));
345
+ if (options.signal!.aborted) return abort();
346
+ options.signal!.addEventListener("abort", abort, { once: true });
347
+ void pending.then((value) => {
348
+ options.signal!.removeEventListener("abort", abort);
349
+ resolve(value);
350
+ });
351
+ });
352
+ }
353
+
354
+ /** The last catalog answer without asking the server, for synchronous readers such as pane settings. */
355
+ export function peekGeoCatalog(): GeoLayersPayload | null {
356
+ return catalogEntry?.payload ?? null;
357
+ }
358
+
359
+ /** Test seam: forget what the server answered. */
360
+ export function resetGeoCatalogCache(): void {
361
+ catalogEntry = null;
362
+ catalogInFlight = null;
363
+ }
@@ -768,6 +768,7 @@ class GloomApiClient {
768
768
  getCloudCotBoard = this.data.getCloudCotBoard.bind(this.data);
769
769
  getCloudCotContract = this.data.getCloudCotContract.bind(this.data);
770
770
  creditDocuments = this.data.creditDocuments.bind(this.data);
771
+ geo = this.data.geo.bind(this.data);
771
772
  getCloudHiring = this.data.getCloudHiring.bind(this.data);
772
773
  getCloudAppRankHistory = this.data.getCloudAppRankHistory.bind(this.data);
773
774
  getCloudAppAttention = this.data.getCloudAppAttention.bind(this.data);
@@ -819,6 +820,7 @@ class GloomApiClient {
819
820
  getRiskReports = this.data.getRiskReports.bind(this.data);
820
821
  getRiskReport = this.data.getRiskReport.bind(this.data);
821
822
  getCloudSecFilings = this.data.getCloudSecFilings.bind(this.data);
823
+ getCloudSecBeneficialOwners = this.data.getCloudSecBeneficialOwners.bind(this.data);
822
824
  getCloudSecFilingDocuments = this.data.getCloudSecFilingDocuments.bind(this.data);
823
825
  getCloudSecFilingContent = this.data.getCloudSecFilingContent.bind(this.data);
824
826
  getCloudSec13F = this.data.getCloudSec13F.bind(this.data);
@@ -46,6 +46,12 @@ export interface MarketHeatmapAsset {
46
46
  industry: string | null;
47
47
  marketState: string | null;
48
48
  source: MarketHeatmapSource;
49
+ /**
50
+ * The move of the last completed regular session, which `price`, `change`
51
+ * and `changePercent` then are. Null while the regular session trades, and
52
+ * for a name without that session's close.
53
+ */
54
+ regularChangePercent?: number | null;
49
55
  }
50
56
 
51
57
  export interface MarketHeatmapResult {
@@ -53,6 +59,10 @@ export interface MarketHeatmapResult {
53
59
  universe: MarketHeatmapUniverseId;
54
60
  source: MarketHeatmapSource;
55
61
  fetchedAt: number;
62
+ /** The US market session the snapshot describes; null when the server cannot tell. */
63
+ session?: "REGULAR" | "PRE" | "POST" | "CLOSED" | null;
64
+ /** The completed regular session every stored tile describes outside the regular session, as a New York date; null while it trades. */
65
+ regularSessionDate?: string | null;
56
66
  assets: MarketHeatmapAsset[];
57
67
  }
58
68