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
@@ -26,25 +26,31 @@ import {
26
26
  formatMaybePercent,
27
27
  formatMoneyCompact,
28
28
  formatSignedCompact,
29
+ holderStakeMarketCap,
30
+ holderValueCurrency,
29
31
  resolveHolderOwnershipPercent,
30
32
  } from "./format";
33
+ import { holderShareBasisMarker } from "./report-header";
31
34
  import {
32
35
  buildColumns,
36
+ hasHolderChanges,
33
37
  buildRows,
34
38
  DEFAULT_SORT,
39
+ nextViewMode,
35
40
  sortRows,
36
41
  VIEW_TABS,
37
42
  } from "./table-model";
38
43
  import { loadHolderData } from "./client";
39
44
  import { HoldersTreemap } from "./treemap";
45
+ import { BeneficialOwnersView } from "./beneficial-view";
40
46
  import type { HolderColumn, HolderColumnId, HolderRow, SortPreference, ViewMode } from "./types";
41
47
  import { loadHolder13FMatches, type Holder13FMatch } from "./thirteenf-match";
42
48
  import { useSampledValue, useTickerQuoteStream } from "../../../state/hooks/live-ticker-financials";
43
49
 
44
50
  const HOLDER_MARKET_CAP_SAMPLE_MS = 5_000;
45
51
 
46
- /** The "13F" badge: the label and its padding. */
47
- const FUND_BADGE_WIDTH = 5;
52
+ /** The width of a three-letter badge ("13F", "ADR"): the label and its padding. */
53
+ const BADGE_WIDTH = 5;
48
54
 
49
55
  export function HoldersView({ focused, width, height }: { focused: boolean; width: number; height: number }) {
50
56
  const { nativePaneChrome } = useUiCapabilities();
@@ -67,17 +73,20 @@ export function HoldersView({ focused, width, height }: { focused: boolean; widt
67
73
  // refresh keeps the last holders; the failure goes to the footer.
68
74
  const { data, loading, error, reload } = useAsyncResource<HolderData>(loadHolders, { keepPreviousData: true });
69
75
 
70
- const currency = data?.currency || ticker?.metadata.currency || "USD";
76
+ // The values' own currency: dollars from the 13F filings on a London line, not its pence.
77
+ const currency = holderValueCurrency(data, ticker?.metadata.currency || "USD")!;
71
78
  // A stake without a reported percentage is the holding's value over the
72
- // market cap. The stream keeps the cap current, about once a second; the
73
- // stakes follow it at most every few seconds so ticks do not re-sort them.
79
+ // market cap, when both are in one currency. The stream keeps the cap
80
+ // current, about once a second; the stakes follow it at most every few
81
+ // seconds so ticks do not re-sort them.
74
82
  useTickerQuoteStream(ticker ? symbol : null, ticker, { surface: "detail", visible: false, weight: 30 });
75
- const quoteMarketCap = financials?.quote?.marketCap;
76
- const liveMarketCap = financials?.quote?.currency && financials.quote.currency !== currency ? undefined : quoteMarketCap;
83
+ const liveMarketCap = holderStakeMarketCap(financials?.quote?.marketCap, financials?.quote?.currency, currency);
77
84
  const marketCap = useSampledValue(liveMarketCap, HOLDER_MARKET_CAP_SAMPLE_MS, `${symbol ?? ""}:${currency}`);
78
85
  const rows = useMemo(() => buildRows(data), [data]);
79
86
  const sortedRows = useMemo(() => sortRows(rows, sortPreference, marketCap), [marketCap, rows, sortPreference]);
80
- const columns = useMemo(() => buildColumns(width), [width]);
87
+ // Change columns only when the source reports a change; otherwise they read "-" on every row.
88
+ const showChange = useMemo(() => hasHolderChanges(rows), [rows]);
89
+ const columns = useMemo(() => buildColumns(width, showChange), [showChange, width]);
81
90
  const selectedIdx = selectedId
82
91
  ? sortedRows.findIndex((row) => row.id === selectedId)
83
92
  : -1;
@@ -145,7 +154,7 @@ export function HoldersView({ focused, width, height }: { focused: boolean; widt
145
154
  }, [setSortPreference]);
146
155
 
147
156
  const toggleView = useCallback(() => {
148
- setViewMode((current) => current === "table" ? "chart" : "table");
157
+ setViewMode(nextViewMode);
149
158
  }, [setViewMode]);
150
159
 
151
160
  const refresh = useCallback(() => {
@@ -211,17 +220,22 @@ export function HoldersView({ focused, width, height }: { focused: boolean; widt
211
220
  switch (column.id) {
212
221
  case "holder": {
213
222
  const color = rowState.selected ? colors.selectedText : colors.textBright;
214
- if (!fundMatches.has(row.id)) return { text: row.name, color, attributes: TextAttributes.BOLD };
215
- // A fund with a 13F opens on Enter or o. The name gives way first, so
216
- // the marker survives a narrow column.
223
+ // ADR: a position held as receipts on a home line's list. 13F: a fund
224
+ // whose filing opens on Enter or o.
225
+ const receipts = holderShareBasisMarker(row);
226
+ const fund = fundMatches.has(row.id);
227
+ if (!receipts && !fund) return { text: row.name, color, attributes: TextAttributes.BOLD };
228
+ const badges = (receipts ? 1 : 0) + (fund ? 1 : 0);
229
+ // The name gives way first, so the markers survive a narrow column.
217
230
  return {
218
- text: `${row.name} 13F`,
231
+ text: [row.name, receipts, fund ? "13F" : ""].filter(Boolean).join(" "),
219
232
  content: (
220
233
  <Box flexDirection="row" gap={1} width={column.width} overflow="hidden">
221
234
  <Text fg={color} attributes={TextAttributes.BOLD}>
222
- {clipToDisplayWidth(row.name, Math.max(1, column.width - FUND_BADGE_WIDTH - 1))}
235
+ {clipToDisplayWidth(row.name, Math.max(1, column.width - badges * (BADGE_WIDTH + 1)))}
223
236
  </Text>
224
- <Badge label="13F" tone="accent" />
237
+ {receipts ? <Badge label={receipts} /> : null}
238
+ {fund ? <Badge label="13F" tone="accent" /> : null}
225
239
  </Box>
226
240
  ),
227
241
  };
@@ -250,7 +264,9 @@ export function HoldersView({ focused, width, height }: { focused: boolean; widt
250
264
  }
251
265
  }, [currency, fundMatches, marketCap]);
252
266
 
267
+ // The 13D/G tab registers its own footer.
253
268
  usePaneFooter("holders", () => {
269
+ if (viewMode === "13dg") return null;
254
270
  return {
255
271
  info: [
256
272
  ...(data?.asOf ? [{ id: "as-of", parts: [{ text: data.asOf, tone: "value" as const }] }] : []),
@@ -264,7 +280,7 @@ export function HoldersView({ focused, width, height }: { focused: boolean; widt
264
280
  ...(selectedFundMatch ? [{ id: "fund", key: "o", label: "pen 13F", onPress: () => openFundDetail(selectedRow) }] : []),
265
281
  ],
266
282
  };
267
- }, [data, error, fundMatching, loading, openFundDetail, selectedFundMatch, selectedRow]);
283
+ }, [data, error, fundMatching, loading, openFundDetail, selectedFundMatch, selectedRow, viewMode]);
268
284
 
269
285
  const selectView = useCallback((value: string) => setViewMode(value as ViewMode), [setViewMode]);
270
286
  // As a research tab, h/l move between research tabs; `s` switches the view.
@@ -316,6 +332,16 @@ export function HoldersView({ focused, width, height }: { focused: boolean; widt
316
332
  selectedTextOverridesCellColor
317
333
  emptyStateTitle={statusTitle ?? "No holders available"}
318
334
  />
335
+ ) : viewMode === "13dg" ? (
336
+ <BeneficialOwnersView
337
+ focused={focused}
338
+ width={width}
339
+ symbol={symbol ?? null}
340
+ holderRows={rows}
341
+ fundMatches={fundMatches}
342
+ onCycleView={toggleView}
343
+ onRefreshHolders={refresh}
344
+ />
319
345
  ) : (
320
346
  <HoldersTreemap
321
347
  rows={sortedRows}
@@ -0,0 +1,136 @@
1
+ import type { HolderData } from "../../../types/financials";
2
+ import { currencyUnitLabel, resolveCurrencyUnit } from "../../../utils/currency-units";
3
+ import { adrRatioText } from "../../../utils/depositary-receipt";
4
+ import { canonicalExchange, isUsListingExchange, resolveExchangeTimeZone } from "../../../utils/exchanges";
5
+
6
+ /**
7
+ * The lines above a holder table in text reports (`holders`, `insider`,
8
+ * `13f`, `fn HDS`): which listing, in which unit, and how much of the list
9
+ * is shown. Holder lists come as the source's own top holders, usually
10
+ * without a total, so the count says that rather than implying a full list.
11
+ */
12
+ export interface HolderReportFacts {
13
+ name?: string | null;
14
+ /** Left out when the report title already names it. */
15
+ symbol?: string | null;
16
+ exchange?: string | null;
17
+ /** The unit the values are in. */
18
+ currency?: string | null;
19
+ /** The listing's price currency, when the values are in another one. */
20
+ listingCurrency?: string | null;
21
+ /** Left out when the report's closing line already carries it. */
22
+ asOf?: string | null;
23
+ /** Rows printed. */
24
+ shown: number;
25
+ /** Rows the source returned, before any limit. */
26
+ reported: number;
27
+ /** Every holder the source counts, when it says so. */
28
+ total?: number | null;
29
+ }
30
+
31
+ /** "Value (GBp)": a money column names its unit. */
32
+ export function moneyColumnHeader(label: string, currency?: string | null): string {
33
+ const unit = currency?.trim();
34
+ return unit ? `${label} (${unit})` : label;
35
+ }
36
+
37
+ function holderCountText(shown: number, reported: number, total?: number | null): string {
38
+ if (total != null && Number.isFinite(total) && total >= reported) {
39
+ return `${shown.toLocaleString("en-US")} of ${total.toLocaleString("en-US")} holders`;
40
+ }
41
+ if (reported === 0) return "none reported";
42
+ // Without a total the source's list is its largest holders, cut where it cuts it.
43
+ return shown < reported ? `${shown} of top ${reported} reported` : `top ${reported} reported`;
44
+ }
45
+
46
+ /** A venue the app knows by its short name (NasdaqGS is NASDAQ); any other as the source wrote it. */
47
+ function venueLabel(exchange?: string | null): string {
48
+ const canonical = canonicalExchange(exchange ?? "");
49
+ return resolveExchangeTimeZone(canonical) ? canonical : (exchange ?? "").trim();
50
+ }
51
+
52
+ /** What the list is, after the listing is named: its unit, date and how much of it is shown. */
53
+ export function holderListFacts(
54
+ facts: Pick<HolderReportFacts, "currency" | "listingCurrency" | "asOf" | "shown" | "reported" | "total">,
55
+ ): string[] {
56
+ const unit = currencyUnitLabel(facts.currency);
57
+ // Dollars on a London line: say they are the values' unit, not the listing's.
58
+ const otherUnit = unit && facts.listingCurrency?.trim() && facts.listingCurrency.trim() !== facts.currency?.trim();
59
+ return [
60
+ otherUnit ? `values in ${unit}` : unit,
61
+ facts.asOf ? `as of ${facts.asOf}` : "",
62
+ holderCountText(facts.shown, facts.reported, facts.total),
63
+ ].filter(Boolean);
64
+ }
65
+
66
+ export function holdersHeaderLine(facts: HolderReportFacts): string {
67
+ const name = facts.name?.trim();
68
+ const symbol = facts.symbol?.trim();
69
+ const identity = name && symbol && name !== symbol ? `${name} (${symbol})` : name || symbol || "";
70
+ return [identity, venueLabel(facts.exchange), ...holderListFacts(facts)].filter(Boolean).join(" | ");
71
+ }
72
+
73
+ /** The one report date every row shares, or null when they differ or none has one. */
74
+ export function sharedReportDate(rows: ReadonlyArray<{ reportDate?: unknown }>): string | null {
75
+ const dates = new Set(rows.map((row) => (typeof row.reportDate === "string" ? row.reportDate : "")));
76
+ const [only] = dates;
77
+ return dates.size === 1 && only ? only : null;
78
+ }
79
+
80
+ /**
81
+ * How a holder value was reached: reported shares times the latest price, or,
82
+ * where Gloom Cloud priced the filings themselves, times the security's price
83
+ * at the report date in the values' currency.
84
+ */
85
+ export function holderValueBasis(
86
+ reportDate: string | null,
87
+ basis?: HolderData["valueBasis"] | null,
88
+ valueCurrency?: string | null,
89
+ ): string {
90
+ const shares = `shares reported${reportDate ? ` at ${reportDate}` : ""}`;
91
+ if (basis === "period_end_price") {
92
+ const unit = valueCurrency?.trim();
93
+ return `${shares} x period-end price${unit ? ` (${unit})` : ""}`;
94
+ }
95
+ return `${shares} x latest price`;
96
+ }
97
+
98
+ /** The short marker a holder row carries when its position is held as depositary receipts. */
99
+ export function holderShareBasisMarker(row: { shareBasis?: unknown }): string {
100
+ return row.shareBasis === "depositary_receipt" ? "ADR" : "";
101
+ }
102
+
103
+ /**
104
+ * What the share counts are, when Gloom Cloud says: which rows of a home
105
+ * line are positions in the receipts, or that a receipt line's rows all are.
106
+ */
107
+ export function holderShareBasisNote(
108
+ data: Pick<HolderData, "shareBasis" | "adrRatio">,
109
+ rows: ReadonlyArray<{ shareBasis?: unknown }>,
110
+ ): string | null {
111
+ const ratio = adrRatioText(data.adrRatio);
112
+ const each = ratio ? ` (${ratio})` : "";
113
+ if (rows.some((row) => holderShareBasisMarker(row))) return `ADR: shares held as depositary receipts${each}.`;
114
+ if (rows.length > 0 && data.shareBasis === "depositary_receipt") return `Shares are depositary receipts${each}.`;
115
+ return null;
116
+ }
117
+
118
+ /** A listing outside the US, by its venue, or by a currency other than the dollar. */
119
+ function isNonUsHolderListing(exchange?: string | null, currency?: string | null): boolean {
120
+ const venue = canonicalExchange(exchange ?? "");
121
+ if (venue && !isUsListingExchange(venue) && resolveExchangeTimeZone(venue)) return true;
122
+ const unit = resolveCurrencyUnit(currency).currency;
123
+ return unit !== "" && unit !== "USD";
124
+ }
125
+
126
+ /**
127
+ * Holder lists are institutions' quarterly filings, mostly US 13F. On a
128
+ * listing outside the US they are not that market's share register, which a
129
+ * reader would otherwise assume.
130
+ */
131
+ export function nonUsHolderCaveat(exchange?: string | null, currency?: string | null): string | null {
132
+ if (!isNonUsHolderListing(exchange, currency)) return null;
133
+ const canonical = canonicalExchange(exchange ?? "");
134
+ const venue = resolveExchangeTimeZone(canonical) ? canonical : "local";
135
+ return `Positions come from institutional filings (mostly US 13F), not the ${venue} share register.`;
136
+ }
@@ -11,8 +11,15 @@ export const DEFAULT_SORT: SortPreference = {
11
11
  export const VIEW_TABS: Array<{ label: string; value: ViewMode }> = [
12
12
  { label: "Table", value: "table" },
13
13
  { label: "Chart", value: "chart" },
14
+ { label: "13D/G", value: "13dg" },
14
15
  ];
15
16
 
17
+ /** `s` steps through the views in tab order. */
18
+ export function nextViewMode(current: ViewMode): ViewMode {
19
+ const index = VIEW_TABS.findIndex((tab) => tab.value === current);
20
+ return VIEW_TABS[(index + 1) % VIEW_TABS.length]!.value;
21
+ }
22
+
16
23
  export function buildRows(data: HolderData | null): HolderRow[] {
17
24
  return (data?.holders ?? []).map((holder, index) => ({
18
25
  ...holder,
@@ -20,23 +27,31 @@ export function buildRows(data: HolderData | null): HolderRow[] {
20
27
  }));
21
28
  }
22
29
 
23
- export function buildColumns(width: number): HolderColumn[] {
30
+ /** Whether any holder carries the quarter's change; many sources report none. */
31
+ export function hasHolderChanges(rows: readonly HolderRow[]): boolean {
32
+ return rows.some((row) => row.changeShares != null || row.changePercent != null);
33
+ }
34
+
35
+ export function buildColumns(width: number, showChange: boolean): HolderColumn[] {
24
36
  const valueWidth = 10;
25
37
  const sharesWidth = 10;
26
38
  const changeWidth = 10;
27
39
  const changePercentWidth = 8;
28
40
  const heldWidth = 7;
29
41
  const dateWidth = 10;
30
- const columnCount = 7;
31
- const fixedWidth = valueWidth + sharesWidth + changeWidth + changePercentWidth + heldWidth + dateWidth;
42
+ const columnCount = showChange ? 7 : 5;
43
+ const fixedWidth = valueWidth + sharesWidth + heldWidth + dateWidth
44
+ + (showChange ? changeWidth + changePercentWidth : 0);
32
45
  const holderWidth = Math.max(16, width - 2 - columnCount - fixedWidth);
33
46
 
34
47
  return [
35
48
  { id: "holder", label: "HOLDER", width: holderWidth, align: "left" },
36
49
  { id: "value", label: "MKT VAL", width: valueWidth, align: "right" },
37
50
  { id: "shares", label: "AMOUNT", width: sharesWidth, align: "right" },
38
- { id: "changeShares", label: "CHG", width: changeWidth, align: "right" },
39
- { id: "changePercent", label: "CHG%", width: changePercentWidth, align: "right" },
51
+ ...(showChange ? [
52
+ { id: "changeShares", label: "CHG", width: changeWidth, align: "right" },
53
+ { id: "changePercent", label: "CHG%", width: changePercentWidth, align: "right" },
54
+ ] satisfies HolderColumn[] : []),
40
55
  { id: "percentHeld", label: "HELD", width: heldWidth, align: "right" },
41
56
  { id: "reportDate", label: "PERIOD", width: dateWidth, align: "right" },
42
57
  ];
@@ -1,4 +1,4 @@
1
- import { listThirteenFForms, searchThirteenFFunds } from "../thirteenf/api";
1
+ import { listThirteenFForms, normalizeCik, searchThirteenFFunds } from "../thirteenf/api";
2
2
  import { isoDateToday, isoDateYearsAgo } from "../../../utils/calendar-date";
3
3
  import { buildPeriodReports } from "../thirteenf/model";
4
4
  import type { HolderRow } from "./types";
@@ -42,6 +42,34 @@ export function bestFundMatch(holderName: string, funds: Array<{ cik: string; na
42
42
  return matches.length === 1 ? matches[0] : undefined;
43
43
  }
44
44
 
45
+ /**
46
+ * The 13F holder row that is a 13D/13G filer: the row whose matched 13F
47
+ * manager has the filer's CIK, else the one row whose name is the filer's once
48
+ * normalised. A parent or subsidiary with a longer name is not the filer, and
49
+ * two rows with the filer's name leave it unmatched. A manager's CIK can
50
+ * change (BlackRock's 13G filer did in 2024) while its 13F match keeps the
51
+ * old one, so an exact name is not overruled by a CIK.
52
+ */
53
+ export function matchFilerToHolder<Row extends { id: string; name: string }>(
54
+ filer: { filerCik: string | null; filerName: string },
55
+ rows: readonly Row[],
56
+ fundMatches: ReadonlyMap<string, Pick<Holder13FMatch, "cik">> = new Map(),
57
+ ): Row | undefined {
58
+ const cik = filer.filerCik ? normalizeCik(filer.filerCik) : null;
59
+ const matchedCik = (row: Row) => {
60
+ const match = fundMatches.get(row.id);
61
+ return match ? normalizeCik(match.cik) : null;
62
+ };
63
+ if (cik) {
64
+ const byCik = rows.filter((row) => matchedCik(row) === cik);
65
+ if (byCik.length === 1) return byCik[0];
66
+ }
67
+ const name = normalizeName(filer.filerName);
68
+ if (!name) return undefined;
69
+ const byName = rows.filter((row) => normalizeName(row.name) === name);
70
+ return byName.length === 1 ? byName[0] : undefined;
71
+ }
72
+
45
73
  export async function loadHolder13FMatches(
46
74
  rows: HolderRow[],
47
75
  signal: AbortSignal,
@@ -2,7 +2,8 @@ import type { DataTableColumn } from "../../../components";
2
2
  import type { HolderRecord } from "../../../types/financials";
3
3
  import type { SortDirection } from "../../../utils/sort-values";
4
4
 
5
- export type ViewMode = "table" | "chart";
5
+ /** `13dg`: the Schedule 13D and 13G beneficial owners. */
6
+ export type ViewMode = "table" | "chart" | "13dg";
6
7
  export type HolderColumnId = "holder" | "value" | "shares" | "changeShares" | "changePercent" | "percentHeld" | "reportDate";
7
8
  export type HolderColumn = DataTableColumn & { id: HolderColumnId };
8
9
 
@@ -17,6 +17,7 @@ import {
17
17
  } from "./model";
18
18
  import { relevantInsiderAmendments } from "./amendments";
19
19
  import { formatInsiderName } from "./display";
20
+ import { SEC_FILINGS } from "../shared/report-freshness";
20
21
 
21
22
  const INSIDER_COLUMNS: HeadlessPaneColumn[] = [
22
23
  { key: "form", header: "Form" },
@@ -84,6 +85,7 @@ export function createInsiderHeadless(
84
85
  ): HeadlessPaneDefinition<"rows"> {
85
86
  return {
86
87
  shape: "rows",
88
+ freshness: { ...SEC_FILINGS, basis: "Form 4 filings", observedKey: "filingDate" },
87
89
  argument: {
88
90
  kind: "ticker",
89
91
  placeholder: "ticker",
@@ -104,6 +104,7 @@ function projectIpoCalendarHeadless(payload: IpoCalendarPayload, args: HeadlessP
104
104
 
105
105
  export const ipoCalendarHeadless: HeadlessPaneDefinition<"rows"> = {
106
106
  shape: "rows",
107
+ freshness: { source: "Exchange listings", status: "not-a-feed", basis: "calendar" },
107
108
  argument: {
108
109
  kind: "free-text",
109
110
  placeholder: "company or ticker",
@@ -11,6 +11,7 @@ const percent = (value: unknown) => typeof value === "number" ? formatVol(value)
11
11
 
12
12
  export const ivHistoryHeadless: HeadlessPaneDefinition<"bundle"> = {
13
13
  shape: "bundle", argument: { kind: "ticker", description: "US option underlying" },
14
+ freshness: { status: "not-a-feed", basis: "daily implied volatility", cadence: "daily", observedKey: "date", oldest: null },
14
15
  describe: (args) => `HIVG ${args.symbols[0] ?? ""}`,
15
16
  discovery: { aliases: ["HIVG"], screenshotReadiness: "live-dom", dataRequirements: ["Cloud stored implied volatility", "Daily price history"],
16
17
  limitations: ["History starts February 2024 (OPRA daily trade closes)", "Rank and percentile use trade-close readings only"] },
@@ -57,6 +58,7 @@ export const ivHistoryHeadless: HeadlessPaneDefinition<"bundle"> = {
57
58
 
58
59
  export const ivScreenHeadless: HeadlessPaneDefinition<"bundle"> = {
59
60
  shape: "bundle",
61
+ freshness: { status: "not-a-feed", basis: "daily implied volatility", cadence: "daily" },
60
62
  argument: { kind: "symbol-list", optional: true, maximum: VCA_LIMIT, description: "US option underlyings; defaults to index and sector ETFs." },
61
63
  options: [{ key: "preset", type: "enum", values: [{ value: "etfs" }, { value: "megacaps" }], defaultValue: "etfs", description: "Preset when no symbols are given" }],
62
64
  describe: "Volatility rich/cheap",
@@ -86,7 +88,8 @@ export const ivScreenHeadless: HeadlessPaneDefinition<"bundle"> = {
86
88
  { key: "ivHv", header: "IV/HV", format: (value: unknown) => typeof value === "number" ? value.toFixed(2) : "--" },
87
89
  ], rows: rows.map((row) => ({ ...row })) }],
88
90
  complete: !queued.length && !universe.error, unavailableSymbols: queued,
89
- errors: [universe.error, ...(queued.length ? [`Queued for backfill: ${queued.join(", ")}`] : [])].filter((value): value is string => !!value),
91
+ errors: [universe.error].filter((value): value is string => !!value),
92
+ ...(queued.length ? { notes: [`Queued for backfill: ${queued.join(", ")}.`] } : {}),
90
93
  metadata: { asOf: payload.asOf, presets: VCA_PRESETS, methodology: METHODOLOGY },
91
94
  };
92
95
  },
@@ -151,6 +151,7 @@ function companyBundle(symbol: string, state: JobsCompanyState, roleLimit: numbe
151
151
  */
152
152
  export const jobsHeadless: HeadlessPaneDefinition<"bundle"> = {
153
153
  shape: "bundle",
154
+ freshness: { source: "Company careers sites", status: "not-a-feed", basis: "observed job postings" },
154
155
  argument: {
155
156
  kind: "ticker",
156
157
  placeholder: "ticker",
@@ -15,6 +15,7 @@ export const positionSizerModule: PluginModule = {
15
15
  panes: [
16
16
  {
17
17
  id: KELLY_PANE_ID,
18
+ reportFreshness: { source: "Your inputs and Gloom Cloud", status: "not-a-feed", basis: "position sizing" },
18
19
  name: "Position Sizer",
19
20
  icon: "K",
20
21
  component: KellySizerPane,
@@ -35,6 +35,7 @@ import { getSharedRegistry } from "../../registry";
35
35
  import { resolveTickerOpenTarget } from "../../../tickers/open-target";
36
36
  import { calculatePortfolioSummaryTotals } from "../portfolio-list/metrics";
37
37
  import { resolvePortfolioNetLiquidation } from "../portfolio-list/account-metrics";
38
+ import { resolvePortfolioCash } from "../portfolio-list/allocation";
38
39
  import {
39
40
  buildTrackedCurrencies,
40
41
  getCollectionTickersFromConfig,
@@ -71,7 +72,7 @@ import {
71
72
  KellySensitivitySection,
72
73
  buildKellyResultItems,
73
74
  } from "./sections";
74
- import { getPortfolioPositionValue, resolveActivePortfolioId } from "./portfolio";
75
+ import { getPortfolioPositionValue, resolveActivePortfolioId, resolveKellyBankroll } from "./portfolio";
75
76
  import { useKellyCommonAssumptions } from "./state";
76
77
 
77
78
  export function KellySizerPane({ focused, width, height }: PaneProps) {
@@ -214,9 +215,11 @@ export function KellySizerPane({ focused, width, height }: PaneProps) {
214
215
  ? portfolioFinancials.get(requestedSymbol!) ?? null
215
216
  : financials;
216
217
  const { accountState } = usePortfolioAccountState(activePortfolio, { brokerAccounts, config });
218
+ // Cash entered by hand counts toward a manual portfolio's bankroll; a broker's is in its Net Liq.
219
+ const manualCash = accountState ? null : resolvePortfolioCash(activePortfolio, null);
217
220
  const trackedCurrencies = useMemo(
218
- () => buildTrackedCurrencies(portfolioTickers, portfolioFinancials, accountState, config.baseCurrency),
219
- [accountState, config.baseCurrency, portfolioFinancials, portfolioTickers],
221
+ () => buildTrackedCurrencies(portfolioTickers, portfolioFinancials, accountState, config.baseCurrency, manualCash?.currency),
222
+ [accountState, config.baseCurrency, manualCash?.currency, portfolioFinancials, portfolioTickers],
220
223
  );
221
224
  const exchangeRates = useFxRatesMap(trackedCurrencies);
222
225
  const portfolioSummary = useMemo(
@@ -237,9 +240,12 @@ export function KellySizerPane({ focused, width, height }: PaneProps) {
237
240
  (value) => convertCurrency(value, accountState?.account.currency ?? "", config.baseCurrency, exchangeRates),
238
241
  accountState?.snapshotBasis,
239
242
  );
240
- const sourceBankroll = netLiquidation != null && Number.isFinite(netLiquidation)
241
- ? netLiquidation
242
- : portfolioSummary.totalMktValue ?? 0;
243
+ const sourceBankroll = resolveKellyBankroll({
244
+ netLiquidation,
245
+ brokerPortfolio: !!activePortfolio?.brokerInstanceId,
246
+ holdings: portfolioSummary.allocationHoldings ?? [],
247
+ cashValue: manualCash ? convertCurrency(manualCash.amount, manualCash.currency, config.baseCurrency, exchangeRates) : null,
248
+ });
243
249
  const sourceCurrentValue = getPortfolioPositionValue({
244
250
  ticker,
245
251
  financials: positionFinancials,
@@ -2,6 +2,7 @@ import type { AppConfig } from "../../../types/config";
2
2
  import type { TickerFinancials } from "../../../types/financials";
3
3
  import type { TickerRecord } from "../../../types/ticker";
4
4
  import { convertCurrency } from "../../../utils/format";
5
+ import { allocationTotal, type AllocationHolding } from "../portfolio-list/allocation";
5
6
  import { getCollectionTypeFromConfig } from "../portfolio-list/pane/data";
6
7
  import { getPortfolioPositionMetrics, getPortfolioQuoteDisplay, resolvePortfolioMarketValue } from "../portfolio-list/position-metrics";
7
8
 
@@ -41,6 +42,30 @@ export function getPortfolioPositionValue({
41
42
  ?? (metrics.positionCount > 0 ? Number.NaN : 0);
42
43
  }
43
44
 
45
+ /**
46
+ * What the portfolio is worth to bet with: its equity. A broker account's is
47
+ * its Net Liq. Otherwise it is the priced holdings at net value plus the cash
48
+ * entered for the portfolio, the portfolio header's Total. A broker portfolio
49
+ * with neither has no known equity: its positions alone are its gross, which
50
+ * margin puts above the equity, so it gives no bankroll.
51
+ */
52
+ export function resolveKellyBankroll({
53
+ netLiquidation,
54
+ brokerPortfolio,
55
+ holdings,
56
+ cashValue,
57
+ }: {
58
+ netLiquidation: number | null;
59
+ brokerPortfolio: boolean;
60
+ holdings: readonly AllocationHolding[];
61
+ /** Cash entered by hand, in the bankroll currency; NaN when it cannot be converted. */
62
+ cashValue: number | null;
63
+ }): number {
64
+ if (netLiquidation != null && Number.isFinite(netLiquidation)) return netLiquidation;
65
+ if (brokerPortfolio && cashValue == null) return 0;
66
+ return allocationTotal(holdings, cashValue) ?? 0;
67
+ }
68
+
44
69
  export function resolveActivePortfolioId({
45
70
  requestedPortfolioId,
46
71
  activeCollectionId,
@@ -11,6 +11,8 @@ const share = (value: unknown) => typeof value === "number" ? `${Math.round(valu
11
11
 
12
12
  export const macroDayHeadless: HeadlessPaneDefinition<"bundle"> = {
13
13
  shape: "bundle", argument: { kind: "ticker", description: "Ticker" },
14
+ // Dated by the maintained release list as much as by the closes, so no session schedule applies.
15
+ freshness: { status: "not-a-feed", basis: "release-day study on daily closes" },
14
16
  describe: (args) => `MDAY ${args.symbols[0] ?? ""}`,
15
17
  discovery: { screenshotReadiness: "live-dom", limitations: [
16
18
  "US listings; close-to-close on the release day.",
@@ -17,6 +17,7 @@ export const marketHaltsPlugin: GloomPlugin = {
17
17
  panes: [
18
18
  {
19
19
  id: MARKET_HALTS_PANE_ID,
20
+ reportFreshness: { source: "Nasdaq Trader" },
20
21
  name: "Market Halts",
21
22
  icon: "H",
22
23
  component: MarketHaltsPane,
@@ -6,6 +6,8 @@ export const MARKET_HEATMAP_UNIVERSES = [
6
6
  { id: "us-equity", label: "US Stocks" },
7
7
  { id: "us-etf", label: "US ETFs" },
8
8
  ] as const;
9
+ /** The 500 largest US stocks (an older server answers with its own maximum); ETFs stay flat and need fewer. */
10
+ export const MARKET_HEATMAP_REQUEST_COUNT: Record<MarketHeatmapUniverseId, number> = { "us-equity": 500, "us-etf": 160 };
9
11
  export interface MarketHeatmapFetchOptions { count?: number; forceRefresh?: boolean; cache?: boolean; }
10
12
  export interface MarketHeatmapSources { client?: Pick<typeof apiClient, "getMarketHeatmap">; }
11
13
  const DEFAULT_COUNT = 80;