gloomberb 0.16.0 → 0.16.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (691) hide show
  1. package/README.md +2 -1
  2. package/package.json +2 -1
  3. package/src/api-client/beneficial-owners.ts +92 -0
  4. package/src/api-client/data.ts +44 -11
  5. package/src/api-client/errors.ts +12 -0
  6. package/src/api-client/geo.ts +363 -0
  7. package/src/api-client/index.ts +5 -0
  8. package/src/api-client/market-discovery.ts +10 -0
  9. package/src/api-client/members.ts +26 -0
  10. package/src/api-client/paths.ts +30 -1
  11. package/src/api-client/perps.ts +41 -0
  12. package/src/api-client/request.ts +5 -2
  13. package/src/api-client/types.ts +9 -1
  14. package/src/app/global-shortcuts.ts +14 -6
  15. package/src/app/keybindings/actions.ts +1 -1
  16. package/src/app/runtime/update.ts +38 -2
  17. package/src/app.tsx +10 -6
  18. package/src/brokers/account-cache.ts +24 -0
  19. package/src/cli/commands/command-utils.ts +8 -0
  20. package/src/cli/commands/crypto-hints.ts +75 -0
  21. package/src/cli/commands/market.ts +414 -106
  22. package/src/cli/commands/overview.ts +77 -32
  23. package/src/cli/commands/ticker.ts +101 -43
  24. package/src/cli/desktop-pane-shot.ts +34 -4
  25. package/src/cli/freshness.ts +61 -0
  26. package/src/cli/help.ts +1 -0
  27. package/src/cli/helpers.ts +4 -8
  28. package/src/cli/index.ts +12 -2
  29. package/src/cli/listing-arg.ts +321 -0
  30. package/src/cli/pane-functions/access-gate.ts +42 -0
  31. package/src/cli/pane-functions/catalog.ts +28 -1
  32. package/src/cli/pane-functions/data.ts +3 -1
  33. package/src/cli/pane-functions/dom.ts +20 -2
  34. package/src/cli/pane-functions/freshness.ts +400 -0
  35. package/src/cli/pane-functions/function-help.ts +36 -22
  36. package/src/cli/pane-functions/headless.ts +39 -11
  37. package/src/cli/pane-functions/index.ts +15 -4
  38. package/src/cli/pane-functions/options.ts +3 -0
  39. package/src/cli/pane-functions/report.ts +4 -0
  40. package/src/cli/pane-functions/resolver.ts +35 -7
  41. package/src/cli/pane-functions/screenshot-evidence.ts +2 -0
  42. package/src/cli/pane-functions/screenshot.ts +7 -3
  43. package/src/cli/result.ts +41 -27
  44. package/src/cli/ticker-resolution.ts +7 -5
  45. package/src/components/chart/composite/composite-chart.tsx +88 -2536
  46. package/src/components/chart/composite/drawing-store.ts +59 -0
  47. package/src/components/chart/composite/legend.tsx +319 -0
  48. package/src/components/chart/composite/panel-bitmap.ts +139 -0
  49. package/src/components/chart/composite/panel-gestures.ts +59 -0
  50. package/src/components/chart/composite/panel-labels.ts +107 -0
  51. package/src/components/chart/composite/panel-surface.tsx +876 -0
  52. package/src/components/chart/composite/tool-catalog.ts +98 -0
  53. package/src/components/chart/composite/toolbar.tsx +186 -0
  54. package/src/components/chart/composite/tools.ts +8 -0
  55. package/src/components/chart/composite/use-composite-chart-keyboard.ts +703 -0
  56. package/src/components/chart/composite/use-composite-viewport.ts +143 -0
  57. package/src/components/command-bar/commands/collection.ts +5 -1
  58. package/src/components/command-bar/list/model.ts +5 -0
  59. package/src/components/command-bar/list/view.tsx +16 -3
  60. package/src/components/command-bar/pane-templates/workflow.ts +1 -0
  61. package/src/components/command-bar/routes/root/command-items.ts +9 -2
  62. package/src/components/command-bar/routes/root/plugin-install.ts +2 -2
  63. package/src/components/command-bar/routes/root/provider-search.ts +19 -5
  64. package/src/components/command-bar/routes/root/runtime.ts +14 -5
  65. package/src/components/command-bar/routes/ticker-search/actions.ts +5 -0
  66. package/src/components/command-bar/routes/ticker-search/results.ts +31 -5
  67. package/src/components/command-bar/routes/ticker-search/route.ts +2 -2
  68. package/src/components/command-bar/routing/actions.ts +2 -0
  69. package/src/components/command-bar/selection-runtime.ts +38 -0
  70. package/src/components/command-bar/surface/index.tsx +7 -2
  71. package/src/components/command-bar/workflow/ops.ts +1 -1
  72. package/src/components/command-bar/workflow/tickers.ts +6 -0
  73. package/src/components/data-table/view.tsx +29 -10
  74. package/src/components/feedback-dialog.tsx +2 -1
  75. package/src/components/form-modal/field-row.tsx +2 -2
  76. package/src/components/index.ts +2 -2
  77. package/src/components/layout/detached-pane-shell.tsx +6 -3
  78. package/src/components/layout/floating-pane.tsx +6 -0
  79. package/src/components/layout/header.tsx +24 -7
  80. package/src/components/layout/missing-pane.tsx +2 -2
  81. package/src/components/layout/pane/content.tsx +23 -10
  82. package/src/components/layout/pane/error-boundary.tsx +103 -0
  83. package/src/components/layout/pane/footer/registration.tsx +68 -23
  84. package/src/components/layout/pane/header.tsx +61 -28
  85. package/src/components/layout/pane/index.tsx +6 -0
  86. package/src/components/layout/pane/title.ts +31 -7
  87. package/src/components/layout/shell/drag/index.ts +6 -5
  88. package/src/components/layout/shell/drag/runtime.ts +3 -0
  89. package/src/components/layout/shell/index.tsx +6 -0
  90. package/src/components/layout/shell/menu.ts +2 -1
  91. package/src/components/layout/shell/pane/actions.ts +2 -1
  92. package/src/components/layout/shell/pane/layers.tsx +29 -10
  93. package/src/components/layout/shell/terminal-pointer-runtime.ts +24 -3
  94. package/src/components/layout/shell/ticker-link-menu.ts +23 -9
  95. package/src/components/metric-treemap/heat-surface.tsx +745 -0
  96. package/src/components/metric-treemap/heat-tiles.ts +228 -0
  97. package/src/components/metric-treemap/index.tsx +2 -0
  98. package/src/components/metric-treemap/layout.ts +8 -0
  99. package/src/components/metric-treemap/scene.ts +432 -0
  100. package/src/components/onboarding/onboarding-keyboard.ts +311 -0
  101. package/src/components/onboarding/onboarding-wizard.tsx +101 -788
  102. package/src/components/onboarding/use-onboarding-broker-form.ts +263 -0
  103. package/src/components/onboarding/use-onboarding-progress.ts +298 -0
  104. package/src/components/onboarding/use-onboarding-upgrade.ts +83 -0
  105. package/src/components/pane-settings-dialog/field-dialogs.tsx +1 -0
  106. package/src/components/ticker/list-table-view.tsx +13 -1
  107. package/src/components/toggle-list.tsx +38 -12
  108. package/src/components/ui/country-flag-art.tsx +449 -0
  109. package/src/components/ui/country-flag.tsx +41 -0
  110. package/src/components/ui/data-table/types.ts +13 -0
  111. package/src/components/ui/fields.tsx +8 -0
  112. package/src/components/ui/icon.tsx +2 -0
  113. package/src/components/ui/index.ts +4 -0
  114. package/src/components/ui/multi-select/dialog.tsx +108 -22
  115. package/src/components/ui/range-track.tsx +53 -0
  116. package/src/components/ui/status.tsx +8 -2
  117. package/src/components/ui/tabs.tsx +11 -4
  118. package/src/components/ui/text-prompt-dialog.tsx +4 -2
  119. package/src/core/state/app/types.ts +10 -1
  120. package/src/data/config/store/normalize.ts +17 -1
  121. package/src/i18n/es.ts +24 -4
  122. package/src/i18n/ja.ts +24 -4
  123. package/src/i18n/ko.ts +24 -4
  124. package/src/i18n/zh-cn.ts +24 -4
  125. package/src/i18n/zh-tw.ts +24 -4
  126. package/src/layout/ticker-navigation.ts +28 -2
  127. package/src/market-data/coordinator/chart.ts +1 -1
  128. package/src/market-data/coordinator/quotes.ts +23 -4
  129. package/src/market-data/fx-closes.ts +72 -0
  130. package/src/market-data/market/freshness.ts +78 -6
  131. package/src/market-data/market/session-close-note.ts +57 -0
  132. package/src/market-data/market/status.ts +151 -0
  133. package/src/market-data/published-apac-sessions.ts +66 -0
  134. package/src/market-data/quotes/contributions.ts +8 -0
  135. package/src/market-data/quotes/freshness.ts +36 -0
  136. package/src/market-data/quotes/resolution.ts +24 -8
  137. package/src/market-data/quotes/screener-live-quotes.ts +49 -4
  138. package/src/market-data/quotes/time.ts +16 -0
  139. package/src/plugins/builtin/account-management/pane.tsx +4 -0
  140. package/src/plugins/builtin/alerts/cli.ts +10 -5
  141. package/src/plugins/builtin/alerts/index.tsx +1 -0
  142. package/src/plugins/builtin/analytics/metrics.ts +8 -3
  143. package/src/plugins/builtin/analytics/risk-client.ts +330 -79
  144. package/src/plugins/builtin/analytics/risk-fx.ts +102 -0
  145. package/src/plugins/builtin/analytics/risk-headless.ts +61 -49
  146. package/src/plugins/builtin/analytics/risk-math.ts +33 -13
  147. package/src/plugins/builtin/analytics/risk-model.ts +282 -64
  148. package/src/plugins/builtin/analytics/risk-pane.tsx +62 -30
  149. package/src/plugins/builtin/analytics/risk-test-data.ts +206 -0
  150. package/src/plugins/builtin/attention/headless.ts +6 -4
  151. package/src/plugins/builtin/attention/index.tsx +1 -1
  152. package/src/plugins/builtin/attention/pane.tsx +1 -1
  153. package/src/plugins/builtin/awards/headless.ts +1 -0
  154. package/src/plugins/builtin/awards/pane.tsx +1 -1
  155. package/src/plugins/builtin/backtest/headless.ts +1 -0
  156. package/src/plugins/builtin/bond-calculator/headless.ts +1 -0
  157. package/src/plugins/builtin/buildout/cells.tsx +15 -12
  158. package/src/plugins/builtin/buildout/detail/company.tsx +3 -3
  159. package/src/plugins/builtin/buildout/detail/index.tsx +0 -1
  160. package/src/plugins/builtin/buildout/detail/intel.tsx +6 -6
  161. package/src/plugins/builtin/buildout/detail/site.tsx +4 -7
  162. package/src/plugins/builtin/buildout/detail/ui.tsx +0 -19
  163. package/src/plugins/builtin/buildout/index.tsx +1 -0
  164. package/src/plugins/builtin/catalysts/headless.ts +3 -1
  165. package/src/plugins/builtin/catalysts/index.tsx +2 -2
  166. package/src/plugins/builtin/catalysts/pane.tsx +3 -1
  167. package/src/plugins/builtin/cds/headless.ts +2 -0
  168. package/src/plugins/builtin/cds/index.tsx +1 -0
  169. package/src/plugins/builtin/central-bank-rates/headless.ts +1 -0
  170. package/src/plugins/builtin/chart-composer/headless.ts +38 -3
  171. package/src/plugins/builtin/chart-composer/index.tsx +3 -1
  172. package/src/plugins/builtin/chart-composer/series-expression.ts +18 -2
  173. package/src/plugins/builtin/chat/channels.ts +19 -3
  174. package/src/plugins/builtin/chat/content/composer-runtime.ts +28 -13
  175. package/src/plugins/builtin/chat/content/footer.tsx +15 -6
  176. package/src/plugins/builtin/chat/content/index.tsx +120 -21
  177. package/src/plugins/builtin/chat/content/new-dm-dialog.tsx +261 -113
  178. package/src/plugins/builtin/chat/content/transcript.tsx +20 -2
  179. package/src/plugins/builtin/chat/direct-messages.ts +200 -0
  180. package/src/plugins/builtin/chat/index.tsx +1 -0
  181. package/src/plugins/builtin/chat/message/desktop.tsx +3 -0
  182. package/src/plugins/builtin/chat/message/header.tsx +16 -6
  183. package/src/plugins/builtin/chat/message/inline-tokens.tsx +72 -32
  184. package/src/plugins/builtin/chat/message/profile-popover.tsx +96 -12
  185. package/src/plugins/builtin/chat/message/terminal.tsx +3 -0
  186. package/src/plugins/builtin/chat/message/types.ts +14 -2
  187. package/src/plugins/builtin/chat/profile-popover.ts +18 -13
  188. package/src/plugins/builtin/clinical-trials/index.tsx +1 -0
  189. package/src/plugins/builtin/cloud/askg/executor.ts +2 -1
  190. package/src/plugins/builtin/cloud/plugin.tsx +1 -0
  191. package/src/plugins/builtin/cloud/team/module.tsx +1 -0
  192. package/src/plugins/builtin/cloud/thesis/module.tsx +1 -0
  193. package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
  194. package/src/plugins/builtin/comment-letters/index.tsx +1 -0
  195. package/src/plugins/builtin/company-attention/headless.ts +5 -1
  196. package/src/plugins/builtin/company-attention/pane.tsx +1 -1
  197. package/src/plugins/builtin/company-kpis/headless.ts +1 -0
  198. package/src/plugins/builtin/congress-trades/headless.ts +1 -0
  199. package/src/plugins/builtin/correlation/compute.ts +59 -16
  200. package/src/plugins/builtin/correlation/geo.ts +34 -0
  201. package/src/plugins/builtin/correlation/headless-schema.ts +4 -1
  202. package/src/plugins/builtin/correlation/headless.ts +42 -8
  203. package/src/plugins/builtin/correlation/history.ts +2 -0
  204. package/src/plugins/builtin/correlation/index.tsx +68 -14
  205. package/src/plugins/builtin/correlation/matrix/model.ts +17 -2
  206. package/src/plugins/builtin/correlation/matrix/selection.ts +5 -3
  207. package/src/plugins/builtin/correlation/relationship/model.ts +1 -1
  208. package/src/plugins/builtin/correlation/relationship/pane.tsx +4 -2
  209. package/src/plugins/builtin/correlation/relationship/view-model.ts +16 -1
  210. package/src/plugins/builtin/correlation/settings.ts +1 -1
  211. package/src/plugins/builtin/cot/headless.ts +6 -3
  212. package/src/plugins/builtin/cot/index.tsx +3 -3
  213. package/src/plugins/builtin/cot/model.ts +36 -3
  214. package/src/plugins/builtin/cpi/headless.ts +4 -0
  215. package/src/plugins/builtin/credit-boards/headless.ts +2 -0
  216. package/src/plugins/builtin/credit-conditions/headless.ts +1 -0
  217. package/src/plugins/builtin/credit-documents/gauge.tsx +5 -8
  218. package/src/plugins/builtin/credit-documents/headless.ts +2 -0
  219. package/src/plugins/builtin/crypto-board/headless.ts +3 -0
  220. package/src/plugins/builtin/custom-view/loader.ts +1 -1
  221. package/src/plugins/builtin/debt-maturities/headless.ts +4 -0
  222. package/src/plugins/builtin/debt-maturities/wall-bar.tsx +14 -41
  223. package/src/plugins/builtin/dividend-yield/client.ts +4 -2
  224. package/src/plugins/builtin/dividend-yield/headless.ts +1 -0
  225. package/src/plugins/builtin/doe/headless.ts +7 -0
  226. package/src/plugins/builtin/doe/range-bar.tsx +7 -37
  227. package/src/plugins/builtin/earnings/client.ts +2 -2
  228. package/src/plugins/builtin/earnings/headless.ts +5 -0
  229. package/src/plugins/builtin/earnings-calls/headless.ts +1 -0
  230. package/src/plugins/builtin/earnings-calls/index.tsx +1 -0
  231. package/src/plugins/builtin/earnings-ripple/client.ts +91 -18
  232. package/src/plugins/builtin/earnings-ripple/headless.ts +28 -8
  233. package/src/plugins/builtin/earnings-ripple/index.tsx +2 -2
  234. package/src/plugins/builtin/earnings-ripple/model.ts +97 -7
  235. package/src/plugins/builtin/earnings-ripple/pane.tsx +148 -23
  236. package/src/plugins/builtin/econ/index.tsx +1 -0
  237. package/src/plugins/builtin/econ-statistics/headless.ts +2 -0
  238. package/src/plugins/builtin/equity-screener/headless.ts +2 -0
  239. package/src/plugins/builtin/estimate-revisions/headless.ts +1 -0
  240. package/src/plugins/builtin/executives/index.tsx +1 -0
  241. package/src/plugins/builtin/exposure/headless.ts +3 -1
  242. package/src/plugins/builtin/fear-greed/headless.ts +2 -0
  243. package/src/plugins/builtin/filing-events/index.tsx +1 -0
  244. package/src/plugins/builtin/futures-curve/client.ts +12 -3
  245. package/src/plugins/builtin/futures-curve/headless.ts +39 -10
  246. package/src/plugins/builtin/futures-curve/index.tsx +3 -3
  247. package/src/plugins/builtin/futures-curve/model.ts +188 -4
  248. package/src/plugins/builtin/futures-curve/pane.tsx +51 -9
  249. package/src/plugins/builtin/fx-matrix/direction.ts +81 -0
  250. package/src/plugins/builtin/fx-matrix/index.tsx +71 -33
  251. package/src/plugins/builtin/fx-matrix/live-legs.ts +17 -0
  252. package/src/plugins/builtin/fx-matrix/pairs.ts +68 -14
  253. package/src/plugins/builtin/fx-matrix/settings.ts +62 -0
  254. package/src/plugins/builtin/gpu/headless.ts +7 -3
  255. package/src/plugins/builtin/gpu/ladder.tsx +26 -30
  256. package/src/plugins/builtin/gpu/model.ts +27 -1
  257. package/src/plugins/builtin/holders/beneficial-client.ts +209 -0
  258. package/src/plugins/builtin/holders/beneficial-model.ts +279 -0
  259. package/src/plugins/builtin/holders/beneficial-report.ts +126 -0
  260. package/src/plugins/builtin/holders/beneficial-view.tsx +241 -0
  261. package/src/plugins/builtin/holders/headless.ts +139 -5
  262. package/src/plugins/builtin/holders/index.tsx +10 -3
  263. package/src/plugins/builtin/holders/pane.tsx +20 -3
  264. package/src/plugins/builtin/holders/report-header.ts +95 -0
  265. package/src/plugins/builtin/holders/table-model.ts +20 -5
  266. package/src/plugins/builtin/holders/thirteenf-match.ts +29 -1
  267. package/src/plugins/builtin/holders/types.ts +2 -1
  268. package/src/plugins/builtin/insider/headless.ts +2 -0
  269. package/src/plugins/builtin/ipo-calendar/headless.ts +1 -0
  270. package/src/plugins/builtin/iv-history/headless.ts +4 -1
  271. package/src/plugins/builtin/jobs/headless.ts +1 -0
  272. package/src/plugins/builtin/jobs/index.tsx +1 -0
  273. package/src/plugins/builtin/jobs/share-bars.tsx +5 -28
  274. package/src/plugins/builtin/kelly-sizer/index.tsx +1 -0
  275. package/src/plugins/builtin/macro-day/headless.ts +2 -0
  276. package/src/plugins/builtin/market-halts/index.tsx +1 -0
  277. package/src/plugins/builtin/market-heatmap/data.ts +30 -2
  278. package/src/plugins/builtin/market-heatmap/headless.ts +135 -0
  279. package/src/plugins/builtin/market-heatmap/index.tsx +245 -81
  280. package/src/plugins/builtin/market-heatmap/live.ts +88 -0
  281. package/src/plugins/builtin/market-heatmap/model.ts +146 -0
  282. package/src/plugins/builtin/market-heatmap/portfolio.ts +50 -11
  283. package/src/plugins/builtin/market-movers/client.ts +3 -2
  284. package/src/plugins/builtin/market-movers/headless.ts +10 -1
  285. package/src/plugins/builtin/market-movers/screener.ts +18 -5
  286. package/src/plugins/builtin/market-valuation/headless.ts +2 -0
  287. package/src/plugins/builtin/members/client.ts +53 -0
  288. package/src/plugins/builtin/members/headless.ts +35 -0
  289. package/src/plugins/builtin/members/index.tsx +20 -0
  290. package/src/plugins/builtin/members/model.ts +68 -0
  291. package/src/plugins/builtin/members/pane.tsx +175 -0
  292. package/src/plugins/builtin/mna/distress/headless.ts +1 -0
  293. package/src/plugins/builtin/mna/headless.ts +1 -0
  294. package/src/plugins/builtin/mna/index.tsx +2 -1
  295. package/src/plugins/builtin/mna/pane.tsx +5 -2
  296. package/src/plugins/builtin/money-markets/headless.ts +1 -0
  297. package/src/plugins/builtin/news/headless.ts +2 -0
  298. package/src/plugins/builtin/news/wire/index.tsx +8 -1
  299. package/src/plugins/builtin/notes/cli.ts +14 -6
  300. package/src/plugins/builtin/notes/index.tsx +1 -0
  301. package/src/plugins/builtin/openfda/index.tsx +1 -0
  302. package/src/plugins/builtin/options/index.tsx +2 -1
  303. package/src/plugins/builtin/options-calculator/headless.ts +2 -0
  304. package/src/plugins/builtin/options-positioning/headless.ts +3 -0
  305. package/src/plugins/builtin/options-scenario/headless.ts +5 -0
  306. package/src/plugins/builtin/pe-band/client.ts +74 -2
  307. package/src/plugins/builtin/pe-band/headless.ts +26 -8
  308. package/src/plugins/builtin/pe-band/model.ts +102 -22
  309. package/src/plugins/builtin/pe-band/pane.tsx +34 -16
  310. package/src/plugins/builtin/pe-band/report-dates.ts +78 -0
  311. package/src/plugins/builtin/perps/client.ts +66 -5
  312. package/src/plugins/builtin/perps/equity-identity.ts +16 -0
  313. package/src/plugins/builtin/perps/equity-row.tsx +6 -4
  314. package/src/plugins/builtin/perps/headless.ts +144 -16
  315. package/src/plugins/builtin/perps/index.tsx +6 -6
  316. package/src/plugins/builtin/perps/model.ts +189 -12
  317. package/src/plugins/builtin/perps/pane.tsx +248 -47
  318. package/src/plugins/builtin/plugin-marketplace/activation.ts +19 -0
  319. package/src/plugins/builtin/plugin-marketplace/pane.tsx +2 -2
  320. package/src/plugins/builtin/plugin-marketplace/store.ts +2 -0
  321. package/src/plugins/builtin/portfolio-list/allocation.ts +245 -0
  322. package/src/plugins/builtin/portfolio-list/cached-account.ts +33 -0
  323. package/src/plugins/builtin/portfolio-list/cell-version.ts +19 -1
  324. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +328 -29
  325. package/src/plugins/builtin/portfolio-list/cli/render.ts +230 -39
  326. package/src/plugins/builtin/portfolio-list/cli/shared.ts +67 -2
  327. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +35 -31
  328. package/src/plugins/builtin/portfolio-list/column-values.ts +124 -47
  329. package/src/plugins/builtin/portfolio-list/headless.ts +98 -16
  330. package/src/plugins/builtin/portfolio-list/index.tsx +14 -3
  331. package/src/plugins/builtin/portfolio-list/live-valuation.ts +7 -5
  332. package/src/plugins/builtin/portfolio-list/mutations.ts +55 -1
  333. package/src/plugins/builtin/portfolio-list/pane/data.ts +6 -0
  334. package/src/plugins/builtin/portfolio-list/pane/index.tsx +47 -13
  335. package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +43 -2
  336. package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +48 -5
  337. package/src/plugins/builtin/portfolio-list/settings.ts +33 -2
  338. package/src/plugins/builtin/portfolio-list/summary/index.tsx +24 -1
  339. package/src/plugins/builtin/portfolio-list/summary/totals.ts +26 -7
  340. package/src/plugins/builtin/power/headless.ts +3 -1
  341. package/src/plugins/builtin/rate-path/headless.ts +2 -0
  342. package/src/plugins/builtin/realized-vol/headless.ts +2 -0
  343. package/src/plugins/builtin/relative-rotation/headless.ts +2 -0
  344. package/src/plugins/builtin/research/analyst-headless.ts +3 -0
  345. package/src/plugins/builtin/research/events-headless.ts +2 -0
  346. package/src/plugins/builtin/research/headless.ts +2 -0
  347. package/src/plugins/builtin/research/index.tsx +1 -0
  348. package/src/plugins/builtin/research/relative-valuation-headless.ts +10 -5
  349. package/src/plugins/builtin/research/relative-valuation-model.ts +11 -3
  350. package/src/plugins/builtin/research/relative-valuation-pane.tsx +3 -3
  351. package/src/plugins/builtin/research-search/index.tsx +1 -0
  352. package/src/plugins/builtin/revenue-breakdown/headless.ts +2 -0
  353. package/src/plugins/builtin/reverse-dcf/headless.ts +2 -0
  354. package/src/plugins/builtin/risk-factors/headless.ts +2 -0
  355. package/src/plugins/builtin/scanner/flow-history.ts +2 -13
  356. package/src/plugins/builtin/scanner/headless.ts +14 -0
  357. package/src/plugins/builtin/scanner/hilo-bars.tsx +12 -70
  358. package/src/plugins/builtin/scanner/hilo-model.ts +0 -18
  359. package/src/plugins/builtin/seasonality/headless.ts +2 -0
  360. package/src/plugins/builtin/sec/command-bar-search.ts +14 -4
  361. package/src/plugins/builtin/sec/filing-content.ts +42 -17
  362. package/src/plugins/builtin/sec/forms.ts +12 -0
  363. package/src/plugins/builtin/sec/headless.ts +2 -0
  364. package/src/plugins/builtin/sectors/client.ts +1 -0
  365. package/src/plugins/builtin/sectors/headless.ts +9 -1
  366. package/src/plugins/builtin/sectors/move-bar.tsx +10 -32
  367. package/src/plugins/builtin/sectors/sector-model.ts +2 -0
  368. package/src/plugins/builtin/shared/crypto-pair.ts +14 -0
  369. package/src/plugins/builtin/shared/locked-rows.tsx +1 -1
  370. package/src/plugins/builtin/shared/report-freshness.ts +57 -0
  371. package/src/plugins/builtin/shared/research-cells.tsx +4 -9
  372. package/src/plugins/builtin/short-interest/headless.ts +2 -0
  373. package/src/plugins/builtin/short-interest/watch-headless.ts +1 -0
  374. package/src/plugins/builtin/short-volume/headless.ts +1 -0
  375. package/src/plugins/builtin/social-mentions/headless.ts +1 -0
  376. package/src/plugins/builtin/social-mentions/index.tsx +1 -1
  377. package/src/plugins/builtin/supply-chain/headless.ts +7 -1
  378. package/src/plugins/builtin/supply-chain/index.tsx +10 -1
  379. package/src/plugins/builtin/supply-chain/model.ts +27 -2
  380. package/src/plugins/builtin/supply-chain/pane.tsx +71 -32
  381. package/src/plugins/builtin/themes/headless.ts +3 -0
  382. package/src/plugins/builtin/thirteenf/headless.ts +110 -25
  383. package/src/plugins/builtin/thirteenf/index.tsx +2 -1
  384. package/src/plugins/builtin/thirteenf/report-notes.ts +149 -0
  385. package/src/plugins/builtin/ticker-detail/headless.ts +7 -1
  386. package/src/plugins/builtin/ticker-detail/index.tsx +1 -0
  387. package/src/plugins/builtin/ticker-detail/overview/components.tsx +5 -60
  388. package/src/plugins/builtin/ticker-detail/overview/model.ts +9 -2
  389. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +1 -1
  390. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +26 -26
  391. package/src/plugins/builtin/ticker-detail/pane.tsx +1 -1
  392. package/src/plugins/builtin/ticker-detail/quote-footer.ts +7 -1
  393. package/src/plugins/builtin/ticker-detail/quote-monitor/card.tsx +20 -4
  394. package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +2 -2
  395. package/src/plugins/builtin/time-sales/headless.ts +5 -1
  396. package/src/plugins/builtin/treasury-auctions/headless.ts +1 -0
  397. package/src/plugins/builtin/vol-surface/index.tsx +1 -1
  398. package/src/plugins/builtin/volatility/headless.ts +6 -1
  399. package/src/plugins/builtin/world-indices/headless.ts +2 -0
  400. package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +157 -0
  401. package/src/plugins/builtin/world-venue-map/basemap.ts +214 -0
  402. package/src/plugins/builtin/world-venue-map/client.ts +45 -0
  403. package/src/plugins/builtin/world-venue-map/entity-detail.tsx +147 -0
  404. package/src/plugins/builtin/world-venue-map/entity-table.ts +59 -0
  405. package/src/plugins/builtin/world-venue-map/evidence.ts +77 -0
  406. package/src/plugins/builtin/world-venue-map/feed.ts +293 -0
  407. package/src/plugins/builtin/world-venue-map/geo-draw.tsx +248 -0
  408. package/src/plugins/builtin/world-venue-map/geo-series.ts +142 -0
  409. package/src/plugins/builtin/world-venue-map/geo-svg.tsx +447 -0
  410. package/src/plugins/builtin/world-venue-map/headless.ts +146 -0
  411. package/src/plugins/builtin/world-venue-map/ids.ts +1 -0
  412. package/src/plugins/builtin/world-venue-map/index.ts +67 -4
  413. package/src/plugins/builtin/world-venue-map/layered-pane.tsx +552 -0
  414. package/src/plugins/builtin/world-venue-map/layers.ts +348 -0
  415. package/src/plugins/builtin/world-venue-map/map-symbols.ts +220 -0
  416. package/src/plugins/builtin/world-venue-map/map.tsx +381 -45
  417. package/src/plugins/builtin/world-venue-map/model.ts +7 -4
  418. package/src/plugins/builtin/world-venue-map/natural-earth/index.chunk.ts +199 -0
  419. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n00.chunk.ts +4 -0
  420. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n15.chunk.ts +4 -0
  421. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n30.chunk.ts +4 -0
  422. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n45.chunk.ts +4 -0
  423. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n60.chunk.ts +4 -0
  424. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000n75.chunk.ts +4 -0
  425. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000s15.chunk.ts +4 -0
  426. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000s30.chunk.ts +4 -0
  427. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e000s60.chunk.ts +4 -0
  428. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n00.chunk.ts +4 -0
  429. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n15.chunk.ts +4 -0
  430. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n30.chunk.ts +4 -0
  431. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n45.chunk.ts +4 -0
  432. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n60.chunk.ts +4 -0
  433. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015n75.chunk.ts +4 -0
  434. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015s15.chunk.ts +4 -0
  435. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015s30.chunk.ts +4 -0
  436. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e015s45.chunk.ts +4 -0
  437. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n00.chunk.ts +4 -0
  438. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n15.chunk.ts +4 -0
  439. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n30.chunk.ts +4 -0
  440. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n45.chunk.ts +4 -0
  441. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n60.chunk.ts +4 -0
  442. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030n75.chunk.ts +4 -0
  443. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s15.chunk.ts +4 -0
  444. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s30.chunk.ts +4 -0
  445. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s45.chunk.ts +4 -0
  446. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e030s60.chunk.ts +4 -0
  447. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n00.chunk.ts +4 -0
  448. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n15.chunk.ts +4 -0
  449. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n30.chunk.ts +4 -0
  450. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n45.chunk.ts +4 -0
  451. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n60.chunk.ts +4 -0
  452. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045n75.chunk.ts +4 -0
  453. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045s15.chunk.ts +4 -0
  454. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045s30.chunk.ts +4 -0
  455. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e045s60.chunk.ts +4 -0
  456. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n00.chunk.ts +4 -0
  457. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n15.chunk.ts +4 -0
  458. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n30.chunk.ts +4 -0
  459. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n45.chunk.ts +4 -0
  460. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n60.chunk.ts +4 -0
  461. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060n75.chunk.ts +4 -0
  462. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060s15.chunk.ts +4 -0
  463. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060s30.chunk.ts +4 -0
  464. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e060s60.chunk.ts +4 -0
  465. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n00.chunk.ts +4 -0
  466. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n15.chunk.ts +4 -0
  467. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n30.chunk.ts +4 -0
  468. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n45.chunk.ts +4 -0
  469. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n60.chunk.ts +4 -0
  470. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075n75.chunk.ts +4 -0
  471. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e075s45.chunk.ts +4 -0
  472. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n00.chunk.ts +4 -0
  473. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n15.chunk.ts +4 -0
  474. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n30.chunk.ts +4 -0
  475. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n45.chunk.ts +4 -0
  476. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n60.chunk.ts +4 -0
  477. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090n75.chunk.ts +4 -0
  478. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e090s15.chunk.ts +4 -0
  479. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n00.chunk.ts +4 -0
  480. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n15.chunk.ts +4 -0
  481. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n30.chunk.ts +4 -0
  482. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n45.chunk.ts +4 -0
  483. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n60.chunk.ts +4 -0
  484. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105n75.chunk.ts +4 -0
  485. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105s15.chunk.ts +4 -0
  486. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105s30.chunk.ts +4 -0
  487. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e105s45.chunk.ts +4 -0
  488. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n00.chunk.ts +4 -0
  489. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n15.chunk.ts +4 -0
  490. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n30.chunk.ts +4 -0
  491. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n45.chunk.ts +4 -0
  492. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120n60.chunk.ts +4 -0
  493. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120s15.chunk.ts +4 -0
  494. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120s30.chunk.ts +4 -0
  495. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e120s45.chunk.ts +4 -0
  496. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n00.chunk.ts +4 -0
  497. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n15.chunk.ts +4 -0
  498. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n30.chunk.ts +4 -0
  499. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n45.chunk.ts +4 -0
  500. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n60.chunk.ts +4 -0
  501. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135n75.chunk.ts +4 -0
  502. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135s15.chunk.ts +4 -0
  503. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135s30.chunk.ts +4 -0
  504. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e135s45.chunk.ts +4 -0
  505. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n00.chunk.ts +4 -0
  506. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n15.chunk.ts +4 -0
  507. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n45.chunk.ts +4 -0
  508. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n60.chunk.ts +4 -0
  509. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150n75.chunk.ts +4 -0
  510. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s15.chunk.ts +4 -0
  511. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s30.chunk.ts +4 -0
  512. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s45.chunk.ts +4 -0
  513. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e150s60.chunk.ts +4 -0
  514. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n00.chunk.ts +4 -0
  515. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n15.chunk.ts +4 -0
  516. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n45.chunk.ts +4 -0
  517. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165n60.chunk.ts +4 -0
  518. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s15.chunk.ts +4 -0
  519. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s30.chunk.ts +4 -0
  520. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s45.chunk.ts +4 -0
  521. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/e165s60.chunk.ts +4 -0
  522. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n00.chunk.ts +4 -0
  523. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n15.chunk.ts +4 -0
  524. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n30.chunk.ts +4 -0
  525. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n45.chunk.ts +4 -0
  526. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n60.chunk.ts +4 -0
  527. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015n75.chunk.ts +4 -0
  528. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015s15.chunk.ts +4 -0
  529. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015s30.chunk.ts +4 -0
  530. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w015s45.chunk.ts +4 -0
  531. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n00.chunk.ts +4 -0
  532. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n15.chunk.ts +4 -0
  533. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n30.chunk.ts +4 -0
  534. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n60.chunk.ts +4 -0
  535. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030n75.chunk.ts +4 -0
  536. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030s30.chunk.ts +4 -0
  537. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w030s60.chunk.ts +4 -0
  538. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n30.chunk.ts +4 -0
  539. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n45.chunk.ts +4 -0
  540. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n60.chunk.ts +4 -0
  541. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045n75.chunk.ts +4 -0
  542. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045s15.chunk.ts +4 -0
  543. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045s30.chunk.ts +4 -0
  544. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w045s60.chunk.ts +4 -0
  545. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n00.chunk.ts +4 -0
  546. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n30.chunk.ts +4 -0
  547. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n45.chunk.ts +4 -0
  548. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n60.chunk.ts +4 -0
  549. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060n75.chunk.ts +4 -0
  550. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s15.chunk.ts +4 -0
  551. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s30.chunk.ts +4 -0
  552. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s45.chunk.ts +4 -0
  553. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w060s60.chunk.ts +4 -0
  554. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n00.chunk.ts +4 -0
  555. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n15.chunk.ts +4 -0
  556. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n30.chunk.ts +4 -0
  557. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n45.chunk.ts +4 -0
  558. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n60.chunk.ts +4 -0
  559. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075n75.chunk.ts +4 -0
  560. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s15.chunk.ts +4 -0
  561. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s30.chunk.ts +4 -0
  562. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s45.chunk.ts +4 -0
  563. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w075s60.chunk.ts +4 -0
  564. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n00.chunk.ts +4 -0
  565. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n15.chunk.ts +4 -0
  566. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n30.chunk.ts +4 -0
  567. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n45.chunk.ts +4 -0
  568. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n60.chunk.ts +4 -0
  569. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090n75.chunk.ts +4 -0
  570. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s15.chunk.ts +4 -0
  571. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s30.chunk.ts +4 -0
  572. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s45.chunk.ts +4 -0
  573. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w090s60.chunk.ts +4 -0
  574. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n00.chunk.ts +4 -0
  575. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n15.chunk.ts +4 -0
  576. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n30.chunk.ts +4 -0
  577. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n45.chunk.ts +4 -0
  578. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n60.chunk.ts +4 -0
  579. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105n75.chunk.ts +4 -0
  580. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w105s15.chunk.ts +4 -0
  581. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n00.chunk.ts +4 -0
  582. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n15.chunk.ts +4 -0
  583. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n30.chunk.ts +4 -0
  584. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n45.chunk.ts +4 -0
  585. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n60.chunk.ts +4 -0
  586. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120n75.chunk.ts +4 -0
  587. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w120s30.chunk.ts +4 -0
  588. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n30.chunk.ts +4 -0
  589. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n45.chunk.ts +4 -0
  590. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n60.chunk.ts +4 -0
  591. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135n75.chunk.ts +4 -0
  592. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w135s30.chunk.ts +4 -0
  593. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150n45.chunk.ts +4 -0
  594. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150n60.chunk.ts +4 -0
  595. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150s15.chunk.ts +4 -0
  596. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w150s30.chunk.ts +4 -0
  597. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n00.chunk.ts +4 -0
  598. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n15.chunk.ts +4 -0
  599. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n45.chunk.ts +4 -0
  600. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165n60.chunk.ts +4 -0
  601. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165s15.chunk.ts +4 -0
  602. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w165s30.chunk.ts +4 -0
  603. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n00.chunk.ts +4 -0
  604. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n15.chunk.ts +4 -0
  605. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n45.chunk.ts +4 -0
  606. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180n60.chunk.ts +4 -0
  607. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180s15.chunk.ts +4 -0
  608. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180s30.chunk.ts +4 -0
  609. package/src/plugins/builtin/world-venue-map/natural-earth/tiles/w180s45.chunk.ts +4 -0
  610. package/src/plugins/builtin/world-venue-map/natural-earth/world-50m.chunk.ts +4 -0
  611. package/src/plugins/builtin/world-venue-map/pane.tsx +28 -43
  612. package/src/plugins/builtin/world-venue-map/use-geo.ts +55 -0
  613. package/src/plugins/builtin/world-venue-map/venue-header.tsx +32 -0
  614. package/src/plugins/builtin/yield-curve/headless.ts +16 -0
  615. package/src/plugins/catalog-browser.ts +2 -0
  616. package/src/plugins/catalog-manifest.ts +1 -0
  617. package/src/plugins/catalog-ui.ts +3 -1
  618. package/src/plugins/catalog.ts +1 -1
  619. package/src/plugins/host-link.ts +33 -1
  620. package/src/plugins/installer.ts +48 -12
  621. package/src/plugins/loader.ts +30 -3
  622. package/src/plugins/manager-node.ts +15 -5
  623. package/src/plugins/registry/index.ts +1 -1
  624. package/src/plugins/registry/pane-settings.ts +26 -7
  625. package/src/public/__snapshots__/public-api.test.ts.snap +2 -0
  626. package/src/renderers/dom/build-assets.ts +81 -3
  627. package/src/renderers/dom/data-table/row.tsx +52 -16
  628. package/src/renderers/dom/desktop/controls.tsx +7 -3
  629. package/src/renderers/dom/desktop/icons.tsx +1 -0
  630. package/src/renderers/dom/desktop/list-view.tsx +35 -10
  631. package/src/renderers/dom/desktop/popover.tsx +73 -14
  632. package/src/renderers/dom/host/box.tsx +69 -26
  633. package/src/renderers/dom/host/input.tsx +14 -3
  634. package/src/renderers/dom/host/tabs.tsx +37 -1
  635. package/src/renderers/dom/styles.css +41 -7
  636. package/src/renderers/electrobun/bun/desktop/backend-requests.ts +11 -6
  637. package/src/renderers/electrobun/bun/desktop/backend.ts +1 -0
  638. package/src/renderers/electrobun/bun/desktop/update.ts +181 -87
  639. package/src/renderers/electrobun/bun/index.ts +73 -6
  640. package/src/renderers/electrobun/bun/window/remembered-frame.ts +122 -0
  641. package/src/renderers/electrobun/shared/protocol.ts +3 -0
  642. package/src/renderers/electrobun/view/backend-rpc.ts +10 -4
  643. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +3 -1
  644. package/src/renderers/electrobun/view/main.tsx +7 -1
  645. package/src/renderers/electrobun/view/renderer-window-error.ts +18 -0
  646. package/src/renderers/electrobun/view/rpc-timeout.ts +14 -3
  647. package/src/renderers/electrobun/view/update-host.ts +45 -21
  648. package/src/renderers/opentui/host.tsx +5 -0
  649. package/src/sources/gloomberb-cloud/index.ts +25 -4
  650. package/src/sources/gloomberb-cloud/normalizers.ts +36 -5
  651. package/src/sources/provider-router/cached-routes.ts +4 -1
  652. package/src/sources/provider-router/financials.ts +11 -8
  653. package/src/sources/provider-router/history.ts +15 -10
  654. package/src/sources/sec-registrant.ts +75 -0
  655. package/src/state/app/context/index.tsx +24 -8
  656. package/src/state/hooks/quote-streaming.ts +41 -26
  657. package/src/sync/core-contributors.ts +4 -0
  658. package/src/telemetry/benign-window-error.ts +7 -0
  659. package/src/telemetry/crash-reports-dom.ts +2 -0
  660. package/src/telemetry/crash-reports.ts +4 -1
  661. package/src/test-support/cli-context.ts +10 -2
  662. package/src/test-support/daily-nav.ts +25 -0
  663. package/src/theme/heat-colors.ts +357 -2
  664. package/src/tickers/instrument-kind.ts +34 -7
  665. package/src/tickers/search/asset-classes.ts +24 -9
  666. package/src/tickers/search/index.ts +44 -11
  667. package/src/tickers/search/ranking.ts +23 -3
  668. package/src/time-series/resolve.ts +1 -1
  669. package/src/time-series/use-chart-resolution.ts +1 -1
  670. package/src/types/context-menu.ts +6 -0
  671. package/src/types/data-provider.ts +2 -0
  672. package/src/types/financials.ts +5 -0
  673. package/src/types/headless.ts +79 -2
  674. package/src/types/plugin.ts +38 -6
  675. package/src/types/ticker.ts +15 -0
  676. package/src/ui/context-menu.tsx +1 -0
  677. package/src/ui/host.tsx +16 -0
  678. package/src/updater/index.ts +38 -13
  679. package/src/utils/async-deadline.ts +21 -0
  680. package/src/utils/cli-output.ts +5 -1
  681. package/src/utils/crypto-pair.ts +41 -0
  682. package/src/utils/currency-units.ts +14 -0
  683. package/src/utils/depositary-receipt.ts +26 -0
  684. package/src/utils/exchanges.ts +72 -0
  685. package/src/utils/fire-and-forget.ts +24 -0
  686. package/src/utils/format.ts +13 -0
  687. package/src/utils/price-earnings.ts +70 -3
  688. package/src/utils/price-history.ts +58 -13
  689. package/src/utils/rpc-timeout-error.ts +27 -0
  690. package/src/utils/sec.ts +13 -1
  691. package/src/utils/utc-time.ts +79 -0
@@ -184,7 +184,7 @@ function createProviderTickerSearchCandidates(
184
184
  }
185
185
 
186
186
  export async function searchTickerCandidates({
187
- query,
187
+ query: rawQuery,
188
188
  tickers,
189
189
  dataProvider,
190
190
  searchContext,
@@ -203,6 +203,7 @@ export async function searchTickerCandidates({
203
203
  /** Called when a slower, richer source improves results already returned. */
204
204
  onPartial?: (candidates: TickerSearchCandidate[]) => void;
205
205
  }): Promise<TickerSearchCandidate[]> {
206
+ const query = symbolSearchQuery(rawQuery);
206
207
  const assemble = (providerResults: InstrumentSearchResult[]) => buildTickerSearchCandidates({
207
208
  query,
208
209
  tickers,
@@ -261,17 +262,42 @@ interface ResolveTickerSearchOptions {
261
262
  searchContext?: SearchRequestContext;
262
263
  }
263
264
 
265
+ /** `NET:` asks which NET. `NET:N` narrows that list. `NET:XNYS` already names one. */
266
+ const LISTING_PICKER_QUERY = /^[A-Z0-9][A-Z0-9.\-]{0,20}:$/;
267
+ const LISTING_CHOICE_QUERY = /^([A-Z0-9][A-Z0-9.\-]{0,20}):([A-Z0-9.\-]*)$/;
268
+
269
+ function isListingPickerQuery(query: string): boolean {
270
+ return LISTING_PICKER_QUERY.test(query.trim().toUpperCase());
271
+ }
272
+
273
+ /** `NET:` and `NET:N` name a symbol plus the exchange prefix still being typed. */
274
+ export function listingChoiceQuery(query: string): { symbol: string; suffix: string } | null {
275
+ const match = LISTING_CHOICE_QUERY.exec(query.trim().toUpperCase());
276
+ if (!match?.[1]) return null;
277
+ return { symbol: match[1], suffix: match[2] ?? "" };
278
+ }
279
+
280
+ /** Search text for a ticker query. A trailing colon searches the symbol it qualifies. */
281
+ export function symbolSearchQuery(query: string): string {
282
+ const trimmed = query.trim();
283
+ if (!isListingPickerQuery(trimmed)) return trimmed;
284
+ return trimmed.slice(0, -1).toUpperCase();
285
+ }
286
+
264
287
  export function resolveTickerSearch(options: ResolveTickerSearchOptions): Promise<ResolvedTickerSearch | null> {
265
- const symbol = normalizeTickerInput(options.activeTicker, options.query);
266
- if (!symbol) return Promise.resolve(null);
267
- const literal = resolveTickerSymbol(symbol, options);
268
- const alternatives = dottedVenueQueries(symbol);
288
+ const requested = normalizeTickerInput(options.activeTicker, options.query);
289
+ if (!requested) return Promise.resolve(null);
290
+ // `NET:` lists NET's venues instead of settling on one.
291
+ const pickListing = isListingPickerQuery(requested);
292
+ const symbol = symbolSearchQuery(requested);
293
+ const literal = resolveTickerSymbol(symbol, options, pickListing ? requested : null);
294
+ const alternatives = pickListing ? [] : dottedVenueQueries(symbol);
269
295
  // Most input has no venue code to retry: hand back the literal lookup
270
296
  // itself, so it settles no later than it did before the retry existed.
271
297
  if (alternatives.length === 0) return literal;
272
298
  return literal.then(async (resolved) => {
273
299
  for (const alternative of resolved ? [] : alternatives) {
274
- const match = await resolveTickerSymbol(alternative, options);
300
+ const match = await resolveTickerSymbol(alternative, options, null);
275
301
  if (match) return match;
276
302
  }
277
303
  return resolved;
@@ -281,6 +307,8 @@ export function resolveTickerSearch(options: ResolveTickerSearchOptions): Promis
281
307
  async function resolveTickerSymbol(
282
308
  symbol: string,
283
309
  { tickers, dataProvider, searchContext }: ResolveTickerSearchOptions,
310
+ /** The `NET:` text that asked for every venue, or null to settle on one. */
311
+ pickerQuery: string | null,
284
312
  ): Promise<ResolvedTickerSearch | null> {
285
313
  const local = tickers.get(symbol)
286
314
  ?? findExactTickerSearchMatch(createLocalTickerSearchCandidates(tickers.values()), symbol)?.ticker
@@ -292,8 +320,10 @@ async function resolveTickerSymbol(
292
320
  }));
293
321
  if (contracts.size > 1) throw new AmbiguousContractError(symbol,
294
322
  [...contracts.values()].map((contract) => tickerInstrumentLabel(local.metadata.ticker, contract)));
295
- return { kind: "local", symbol: local.metadata.ticker, ticker: local };
296
323
  }
324
+ // A saved symbol keeps its company. The colon still offers the others.
325
+ const saved: ResolvedTickerSearch | null = local ? { kind: "local", symbol: local.metadata.ticker, ticker: local } : null;
326
+ if (saved && !pickerQuery) return saved;
297
327
 
298
328
  const providerItems = createProviderTickerSearchCandidates(
299
329
  await searchProviderResults(dataProvider, symbol, searchContext),
@@ -303,13 +333,18 @@ async function resolveTickerSymbol(
303
333
  const matches = literalMatches.length ? literalMatches
304
334
  : providerItems.filter((item) => findExactTickerSearchMatch([item], symbol));
305
335
  let exactMatch = matches[0];
306
- if (!exactMatch?.result) return null;
336
+ if (!exactMatch?.result) return saved;
307
337
 
308
338
  const contracts = new Set(matches.map((item) => item.contractKey).filter(Boolean));
309
339
  if (contracts.size > 1 || (contracts.size && matches.some((item) => !item.contractKey))) {
310
340
  throw new AmbiguousContractError(symbol, matches.map((item) => tickerInstrumentLabel(item.symbol, item.result?.brokerContract)));
311
341
  }
312
342
  const listings = new Set(matches.map((item) => publicTickerKey(item.symbol, listingExchange(item.result!))));
343
+ const ambiguity = (query: string) => new AmbiguousTickerError(query, [...listings], Object.fromEntries(matches.map((item) => [
344
+ publicTickerKey(item.symbol, listingExchange(item.result!)), item.result!.name,
345
+ ])));
346
+ if (pickerQuery && listings.size > 1) throw ambiguity(pickerQuery);
347
+ if (saved) return saved;
313
348
  if (listings.size > 1 && !parsePublicTickerKey(symbol).exchange && !tickerHasListingSuffix(symbol)) {
314
349
  // Search order is relevance, not a canonical listing identifier. Align bare
315
350
  // symbols with the quote source only when it supplies the exact identity.
@@ -336,9 +371,7 @@ async function resolveTickerSymbol(
336
371
  // An unavailable quote cannot establish the default listing.
337
372
  }
338
373
  if (new Set(verified.map((item) => publicTickerKey(item.symbol, listingExchange(item.result!)))).size !== 1) {
339
- throw new AmbiguousTickerError(symbol, [...listings], Object.fromEntries(matches.map((item) => [
340
- publicTickerKey(item.symbol, listingExchange(item.result!)), item.result!.name,
341
- ])));
374
+ throw ambiguity(symbol);
342
375
  }
343
376
  exactMatch = verified[0]!;
344
377
  }
@@ -4,7 +4,7 @@ import type {
4
4
  } from "./types";
5
5
  import { getListingSymbol, tickerHasListingSuffix } from "../../sources/listing-symbols";
6
6
  import { canonicalExchange, parsePublicTickerKey } from "../../utils/exchanges";
7
- import { assetClassMarketSymbol, instrumentClassCode, parseAssetClassQuery } from "./asset-classes";
7
+ import { assetClassKeeps, assetClassMarketSymbol, instrumentClassCode, parseAssetClassQuery } from "./asset-classes";
8
8
 
9
9
  const FUND_TYPES = new Set(["ETF", "ETN", "ETP", "FUND", "MUTUALFUND", "CEF", "CLOSEDEND"]);
10
10
  const DERIVATIVE_TYPES = new Set(["OPT", "OPTION", "OPTIONS", "FUT", "FUTURE", "FUTURES", "WARRANT", "WARRANTS", "RIGHT", "RIGHTS"]);
@@ -174,12 +174,12 @@ export function rankTickerSearchItems<T extends Pick<TickerSearchRankableItem, "
174
174
  if (!intent.normalizedQuery) return items;
175
175
 
176
176
  const ranked = (assetClass
177
- ? items.filter((item) => instrumentClassCode({
177
+ ? items.filter((item) => assetClassKeeps(assetClass.code, instrumentClassCode({
178
178
  instrumentClass: item.instrumentClass,
179
179
  instrumentType: item.instrumentType,
180
180
  symbol: item.symbol || item.label,
181
181
  exchange: item.exchangeLabel || item.right,
182
- }) === assetClass.code)
182
+ })))
183
183
  : items)
184
184
  .map((item, index) => {
185
185
  // A saved public key replaces its provider row during deduplication.
@@ -259,8 +259,28 @@ export function rankTickerSearchItems<T extends Pick<TickerSearchRankableItem, "
259
259
  promoteMuchMorePopularCompanies(filtered);
260
260
 
261
261
  type RankedEntry = (typeof ranked)[number];
262
+ // One exact symbol can name several companies (NET is Cloudflare in New York
263
+ // and Netcall in London). Saved listings come first, then each company ranks
264
+ // by its earliest listing position in the returned search order.
265
+ // Without this, a name that starts with the symbol (Netcall) or the boost for
266
+ // stocks over funds (GLD) put a thinly traded company first.
267
+ const exactIssuerRank = new Map<string, number>();
268
+ const exactIssuerKey = (entry: RankedEntry) => getIssuerGroupKey(entry.item.detail) || `item:${entry.index}`;
269
+ for (const entry of filtered) {
270
+ if (entry.symbolMatchRank !== 4 || entry.item.providerRank == null) continue;
271
+ const key = exactIssuerKey(entry);
272
+ exactIssuerRank.set(key, Math.min(entry.item.providerRank, exactIssuerRank.get(key) ?? Number.POSITIVE_INFINITY));
273
+ }
262
274
  const compareFallbackEntries = (a: RankedEntry, b: RankedEntry): number => {
263
275
  if (b.symbolMatchRank !== a.symbolMatchRank) return b.symbolMatchRank - a.symbolMatchRank;
276
+ if (a.symbolMatchRank === 4) {
277
+ const aSaved = isSavedSearchItem(a.item);
278
+ const bSaved = isSavedSearchItem(b.item);
279
+ if (aSaved !== bSaved) return aSaved ? -1 : 1;
280
+ const aIssuerRank = exactIssuerRank.get(exactIssuerKey(a)) ?? Number.POSITIVE_INFINITY;
281
+ const bIssuerRank = exactIssuerRank.get(exactIssuerKey(b)) ?? Number.POSITIVE_INFINITY;
282
+ if (aIssuerRank !== bIssuerRank) return aIssuerRank - bIssuerRank;
283
+ }
264
284
  if (b.score !== a.score) return b.score - a.score;
265
285
  const aSaved = isSavedSearchItem(a.item);
266
286
  const bSaved = isSavedSearchItem(b.item);
@@ -1647,7 +1647,7 @@ async function resolveChartSpecPass(
1647
1647
  || (request.bounds.end !== null && now() - (request.bounds.end + 1) < 60 * 60_000);
1648
1648
  const staleCurrent = (value: LoadedPriceHistory) => currentWindow() && !!value.session
1649
1649
  && isPriceHistoryStaleForCurrentWindow(value.points, now(), {
1650
- exchange: source.instrument.exchange, session: value.session,
1650
+ symbol: source.instrument.symbol, exchange: source.instrument.exchange, session: value.session,
1651
1651
  ...(value.resolution ? { intervalMs: CHART_RESOLUTION_STEP_MS[value.resolution] } : {}),
1652
1652
  });
1653
1653
  if (staleCurrent(loaded)) {
@@ -105,7 +105,7 @@ function freshSeedPoints(
105
105
  // Broker contract/session interpretation remains unproven, as at acquisition.
106
106
  const session = instrument.instrument ? undefined : result.session;
107
107
  if (currentWindow && isIntradayResolution(resolution) && isPriceHistoryStaleForCurrentWindow(points, now, {
108
- exchange: target.exchange, intervalMs: CHART_RESOLUTION_STEP_MS[resolution], session,
108
+ symbol: target.symbol, exchange: target.exchange, intervalMs: CHART_RESOLUTION_STEP_MS[resolution], session,
109
109
  })) return null;
110
110
  return points.length ? points : null;
111
111
  }
@@ -80,6 +80,12 @@ export type ContextMenuContext =
80
80
  layoutIndex: number;
81
81
  layoutName: string;
82
82
  active: boolean;
83
+ }
84
+ | {
85
+ /** A person's name or @mention in the chat. */
86
+ kind: "chat-user";
87
+ userId: string;
88
+ username: string | null;
83
89
  };
84
90
 
85
91
  export function hasRunnableContextMenuItem(items: readonly ContextMenuItem[]): boolean {
@@ -116,6 +116,8 @@ export interface MarketDataRequestContext {
116
116
  historyRequestKey?: string;
117
117
  /** Intraday history should include pre-market and after-hours bars where the source has them. */
118
118
  historySession?: "extended";
119
+ /** The listing's company, from its own quote: an SEC lookup for a non-US listing checks the registrant against it. */
120
+ listingName?: string;
119
121
  }
120
122
 
121
123
  export interface CachedFinancialsTarget {
@@ -41,6 +41,8 @@ export interface QuoteMetadata {
41
41
  export interface Quote {
42
42
  /** Applies to this price observation; a stored position cannot supply it. */
43
43
  priceBasis?: PriceBasis;
44
+ /** Daily fund net asset value; independent of the units used to format its price. */
45
+ priceObservation?: "nav";
44
46
  symbol: string;
45
47
  /** Provider-reported security type, independent of the company profile. */
46
48
  instrumentType?: string;
@@ -56,6 +58,9 @@ export interface Quote {
56
58
  regularClose?: number;
57
59
  /** Exchange-local date of regularClose; separate from the daily previous-close reference. */
58
60
  regularCloseSessionDate?: string;
61
+ /** Move of that completed regular session from the one before it, in this quote's currency; set and cleared together with regularClose. */
62
+ regularChange?: number;
63
+ regularChangePercent?: number;
59
64
  /** Provider's exchange-local session date for the daily quote reference. */
60
65
  changeSessionDate?: string;
61
66
  high52w?: number;
@@ -71,7 +71,12 @@ export interface HeadlessPaneContext {
71
71
  settings?: Record<string, unknown>;
72
72
  capabilities?: CapabilityInvoker;
73
73
  /** Read one local portfolio without passing holdings through a remote endpoint. */
74
- resolvePortfolio?: (id: string) => Promise<{ portfolio: import("./ticker").Portfolio; tickers: import("./ticker").TickerRecord[] } | null>;
74
+ resolvePortfolio?: (id: string) => Promise<{
75
+ portfolio: import("./ticker").Portfolio;
76
+ tickers: import("./ticker").TickerRecord[];
77
+ /** The broker account the portfolio was last synced with, as saved on this device. */
78
+ account?: import("./trading").BrokerAccount | null;
79
+ } | null>;
75
80
  /** Read locally remembered watchlist membership. */
76
81
  resolveWatchlist?: (id: string) => Promise<import("./ticker").TickerRecord[] | null>;
77
82
  /** Resolve locally remembered exchange identities without coupling plugins to storage. */
@@ -97,6 +102,63 @@ export interface HeadlessPaneEntry {
97
102
  formatted?: string;
98
103
  }
99
104
 
105
+ /**
106
+ * How current a report's data is (docs/usage.md#how-current-a-report-is):
107
+ * - `live`: a real-time feed, such as a streaming venue or a real-time quote.
108
+ * - `delayed`: a feed held back on purpose, by `delayMinutes` when known.
109
+ * - `stale`: a feed or scheduled release whose newest observation is older
110
+ * than that kind of data allows.
111
+ * - `not-a-feed`: data that is not a feed at all (filings, fundamentals,
112
+ * calendars, statistics releases, calculators, local portfolio data). It
113
+ * never reads stale just because it is old.
114
+ */
115
+ export type HeadlessFreshnessStatus = "live" | "delayed" | "stale" | "not-a-feed";
116
+
117
+ /**
118
+ * What a report can cite about its data. Every field is optional: the report
119
+ * fills what is missing from the result itself (quote `dataSource`,
120
+ * `delayMinutes`, `stale`, `asOf`/`observedAt`/`lastUpdated` fields, the last
121
+ * point of each series), so a pane declares only what that would get wrong.
122
+ */
123
+ export interface HeadlessPaneFreshness {
124
+ /**
125
+ * Who a reader would cite: the venue, exchange or agency for primary data
126
+ * ("SEC EDGAR", "Hyperliquid"), "Gloom Cloud" for aggregated market data,
127
+ * "Local data" or "Your inputs". Never a data vendor or an internal provider id.
128
+ */
129
+ source?: string;
130
+ /** Newest observation in the data. A `YYYY-MM-DD` string reads as a date without a time. */
131
+ asOf?: string | number | Date | null;
132
+ /** Oldest observation, mentioned when it is far older than `asOf`; `null` when the rows are a history. */
133
+ oldest?: string | number | Date | null;
134
+ /**
135
+ * The row field that says when each row was observed, when it is not one of
136
+ * the standard names (`asOf`, `observedAt`, `lastUpdated`...). The report is
137
+ * then dated by that field alone, not by metadata stamps.
138
+ */
139
+ observedKey?: string;
140
+ status?: HeadlessFreshnessStatus;
141
+ /** How far a delayed feed is held back, in minutes. */
142
+ delayMinutes?: number;
143
+ /** What not-a-feed data is, in a few words: "filed data", "monthly release", "your inputs". */
144
+ basis?: string;
145
+ /** The newest observation is stale once it is older than this many minutes. */
146
+ maxAgeMinutes?: number;
147
+ /**
148
+ * The rows' and metadata's own `stale` flags mean something other than "this
149
+ * value is out of date" (a historical marker, a cache state), so the report
150
+ * judges staleness from the schedule alone.
151
+ */
152
+ ignoreStaleFlags?: boolean;
153
+ /**
154
+ * `daily`: one observation per US trading day, stale once more than one
155
+ * completed session has passed after the newest (a day's lag is allowed).
156
+ */
157
+ cadence?: "daily";
158
+ /** The newest observation is stale once this time (the next scheduled release) has passed by a day. */
159
+ nextExpectedAt?: string | number | Date | null;
160
+ }
161
+
100
162
  interface HeadlessPaneResultBase {
101
163
  /** False when usable output does not fully cover the requested inputs/depth. */
102
164
  complete?: boolean;
@@ -104,8 +166,17 @@ interface HeadlessPaneResultBase {
104
166
  symbols?: string[];
105
167
  /** Missing inputs must remain visible even when other inputs returned rows. */
106
168
  unavailableSymbols?: string[];
169
+ /** Failures: a source that did not answer, or a value that could not be computed. */
107
170
  errors?: string[];
171
+ /**
172
+ * Caveats about a report that did load: what it leaves out, what it assumes,
173
+ * how a value was marked. One sentence each. They never make a report fail;
174
+ * `complete: false` says when the report does not cover what was asked.
175
+ */
176
+ notes?: string[];
108
177
  metadata?: Record<string, unknown>;
178
+ /** What this load knows about its data's source and age; overrides the definition's `freshness`. */
179
+ freshness?: HeadlessPaneFreshness;
109
180
  }
110
181
 
111
182
  export interface HeadlessRowsResult extends HeadlessPaneResultBase {
@@ -185,8 +256,14 @@ export interface HeadlessPaneDefinition<Shape extends HeadlessPaneShape = Headle
185
256
  description?: string;
186
257
  argument: HeadlessPaneArgumentDef;
187
258
  options: HeadlessPaneOptionDef[];
259
+ /** What is true of every load: its source, and whether it is a feed. */
260
+ freshness?: HeadlessPaneFreshness;
188
261
  columns?: HeadlessPaneColumn[];
189
- describe?: string | ((args: HeadlessPaneLoadArgs) => string);
262
+ /**
263
+ * The report title. A report passes the loaded result, so a title can name
264
+ * what the load resolved (the view an `auto` query became, a fund's name).
265
+ */
266
+ describe?: string | ((args: HeadlessPaneLoadArgs, result?: HeadlessPaneResult) => string);
190
267
  load(
191
268
  args: HeadlessPaneLoadArgs,
192
269
  ctx: HeadlessPaneContext,
@@ -1,10 +1,11 @@
1
1
  import type { ReactNode } from "react";
2
2
  import type { AppTickerRepositoryPort } from "../core/app-service-ports";
3
- import type { HeadlessPaneDefinition } from "./headless";
3
+ import type { HeadlessPaneDefinition, HeadlessPaneFreshness } from "./headless";
4
4
 
5
5
  export type {
6
6
  HeadlessBundleResult,
7
7
  HeadlessBundleSection,
8
+ HeadlessFreshnessStatus,
8
9
  HeadlessPaneApiClient,
9
10
  HeadlessPaneArgumentDef,
10
11
  HeadlessPaneArgumentKind,
@@ -12,6 +13,7 @@ export type {
12
13
  HeadlessPaneContext,
13
14
  HeadlessPaneDefinition,
14
15
  HeadlessPaneEntry,
16
+ HeadlessPaneFreshness,
15
17
  HeadlessPaneLoadArgs,
16
18
  HeadlessPaneOptionDef,
17
19
  HeadlessPaneOptionType,
@@ -116,27 +118,48 @@ export interface PaneDef {
116
118
  tickerSource?: boolean;
117
119
  /**
118
120
  * Pane shows one ticker read through its binding (`usePaneTicker`, `usePaneTickerIdentity`), so
119
- * its pane menu offers "Link to" each visible `tickerSource` pane and it then follows that pane's
120
- * selection. A function decides per instance (a chart with one security, not a comparison). A
121
- * follower must never write its own `cursorSymbol`: that would win over the binding.
121
+ * its pane menu offers "Link to" each visible list, scanner, and other single-ticker pane, and
122
+ * it then follows that pane's selection. A function decides per instance (a chart with one
123
+ * security, not a comparison). A follower must never write its own `cursorSymbol`: that would
124
+ * win over the binding.
122
125
  */
123
126
  tickerFollower?: boolean | ((pane: PaneInstanceConfig) => boolean);
124
127
  /** Renderer-neutral data model used by CLI functions, automation, and hosted tools. */
125
128
  headless?: HeadlessPaneDefinition;
129
+ /**
130
+ * Source and status a rendered-view report (`fn` on a pane without a
131
+ * `headless` model) cites, when "Gloom Cloud" with the state the footer
132
+ * shows would be wrong: local data, a calculator, filed records.
133
+ */
134
+ reportFreshness?: Pick<HeadlessPaneFreshness, "source" | "status" | "basis">;
126
135
  /** Add an Excel-compatible CSV action for the pane's single active DataTable. */
127
136
  tableExport?: true;
128
137
  settings?: PaneSettingsDef | ((context: PaneSettingsContext) => PaneSettingsDef | null);
129
138
  /** Portable sharing is public by default; list the few pane-owned fields that must remain local. */
130
139
  portableShare?: PanePortableShareDef;
131
- /** Compact controls surfaced next to the pane title. Toggle keys reference toggle fields in settings. */
140
+ /**
141
+ * Compact controls surfaced next to the pane title. A key references a
142
+ * toggle field in settings, or a two-option select field when `onValue` is set.
143
+ */
132
144
  quickSettings?: readonly PaneQuickSettingDef[];
133
145
  }
134
146
 
135
147
  export interface PaneQuickSettingDef {
136
148
  type: "toggle";
137
149
  key: string;
138
- icon: "zap";
150
+ icon: "zap" | "sqrt";
139
151
  label?: string;
152
+ /**
153
+ * For a two-option select field: the option the control turns on. Turning
154
+ * it off picks the field's other option.
155
+ */
156
+ onValue?: string;
157
+ /**
158
+ * Shows the control only where it changes something, for a setting that
159
+ * applies to some of what the pane can show. The field stays in the
160
+ * settings dialog either way.
161
+ */
162
+ visible?: (context: PaneSettingsContext) => boolean;
140
163
  }
141
164
 
142
165
  export interface PaneSettingsContext {
@@ -183,11 +206,15 @@ interface PaneSettingSelectField extends PaneSettingFieldBase {
183
206
  interface PaneSettingMultiSelectField extends PaneSettingFieldBase {
184
207
  type: "multi-select";
185
208
  options: PaneSettingOption[];
209
+ /** A long list: a filter box, each description beside its label. */
210
+ searchable?: boolean;
186
211
  }
187
212
 
188
213
  interface PaneSettingOrderedMultiSelectField extends PaneSettingFieldBase {
189
214
  type: "ordered-multi-select";
190
215
  options: PaneSettingOption[];
216
+ /** A long list: a filter box, each description beside its label and each selection's position. */
217
+ searchable?: boolean;
191
218
  }
192
219
 
193
220
  export interface PaneSettingActionContext extends PaneSettingsContext {
@@ -251,6 +278,11 @@ interface PaneTemplateShortcut {
251
278
  aliases?: readonly string[];
252
279
  argPlaceholder?: string;
253
280
  argKind?: "text" | "ticker" | "ticker-list";
281
+ /**
282
+ * For a ticker list, entries kept as typed instead of resolved as tickers:
283
+ * CORR keeps map series (`GEO:HORMUZ`) beside its tickers.
284
+ */
285
+ keepArgToken?: (token: string) => boolean;
254
286
  argOptional?: boolean;
255
287
  /**
256
288
  * With no argument typed and none to infer from the active ticker, open
@@ -56,6 +56,21 @@ export interface Portfolio {
56
56
  lastSyncedAt?: number;
57
57
  /** Set on paper portfolios shared with a team; the server holds the items. */
58
58
  teamId?: string;
59
+ /**
60
+ * Cash held beside the positions, entered by hand. A broker account that
61
+ * reports its own cash is shown instead of this.
62
+ */
63
+ cash?: PortfolioCash;
64
+ /**
65
+ * Target weights in percent of the total value, cash included, keyed by
66
+ * ticker symbol; `CASH` is the cash line.
67
+ */
68
+ targetWeights?: Record<string, number>;
69
+ }
70
+
71
+ export interface PortfolioCash {
72
+ amount: number;
73
+ currency: string;
59
74
  }
60
75
 
61
76
  export interface Watchlist {
@@ -42,6 +42,7 @@ const MENU_SURFACE_SELECTOR = [
42
42
  "[data-gloom-role='pane-header']",
43
43
  "[data-gloom-role='pane-action']",
44
44
  "[data-gloom-role='pane-close']",
45
+ "[data-gloom-role='pane-restore']",
45
46
  "[data-gloom-role='status-bar']",
46
47
  "[data-gloom-role='tab-button']",
47
48
  ].join(", ");
package/src/ui/host.tsx CHANGED
@@ -375,6 +375,8 @@ export interface HostTabsProps {
375
375
  addLabel?: string;
376
376
  onAdd?: () => void;
377
377
  onReorder?: (fromValue: string, toValue: string) => void;
378
+ /** A press that moves, on a tab that is not reordered. */
379
+ onDrag?: () => void;
378
380
  focused?: boolean;
379
381
  palette: HostTabsPalette;
380
382
  }
@@ -459,6 +461,20 @@ export interface HostPopoverProps {
459
461
  trigger: ReactNode;
460
462
  children: ReactNode;
461
463
  anchorPoint?: { x: number; y: number } | null;
464
+ /**
465
+ * Opens beside this element instead of the trigger, such as a name the
466
+ * pointer is on: below it with the left edges aligned, above it when there
467
+ * is no room below, and kept inside the boundary. A Box ref is one. Read
468
+ * each time the popover places itself, so it follows the element when the
469
+ * page scrolls.
470
+ */
471
+ anchor?: BoxRenderable | null;
472
+ /** `pane` also keeps the popover inside the pane it opens from. Default `viewport`. */
473
+ boundary?: "viewport" | "pane";
474
+ /** The pointer came onto the popover, e.g. to keep a hover card open while it is used. */
475
+ onPointerEnter?: () => void;
476
+ /** The pointer left the popover. */
477
+ onPointerLeave?: () => void;
462
478
  placement?: "bottom-start" | "bottom-end";
463
479
  minWidth?: number | string;
464
480
  maxWidth?: number | string;
@@ -1,7 +1,7 @@
1
1
  import { compareSemver } from "../utils/semver";
2
2
  import { GITHUB_LATEST_RELEASE_API_URL } from "./github-releases";
3
3
 
4
- function getRuntimeProcess(): Pick<NodeJS.Process, "platform" | "arch" | "argv" | "execPath"> | null {
4
+ function getRuntimeProcess(): Pick<NodeJS.Process, "platform" | "arch" | "argv" | "execPath" | "getBuiltinModule"> | null {
5
5
  return (globalThis as { process?: NodeJS.Process }).process ?? null;
6
6
  }
7
7
 
@@ -17,10 +17,18 @@ export interface ReleaseInfo {
17
17
  }
18
18
 
19
19
  export interface UpdateProgress {
20
- phase: "downloading" | "replacing" | "done" | "error";
20
+ /**
21
+ * `ready`: the new version is downloaded and waiting. The terminal binary is
22
+ * already swapped and runs on the next launch; the desktop app applies it
23
+ * when `canRestart` is set and the user asks. Nothing restarts by itself.
24
+ * `done` is for a finished action that has nothing left to wait for.
25
+ */
26
+ phase: "downloading" | "ready" | "replacing" | "done" | "error";
21
27
  percent?: number;
22
28
  error?: string;
23
29
  message?: string;
30
+ /** With `ready`: this host can apply the update and relaunch on request. */
31
+ canRestart?: boolean;
24
32
  }
25
33
 
26
34
  export type UpdateAction =
@@ -43,7 +51,10 @@ export type UpdateCheckResult =
43
51
 
44
52
  export interface UpdateHost {
45
53
  checkForUpdateDetailed(currentVersion: string): Promise<UpdateCheckResult>;
54
+ /** Downloads and stages the update, ending in `ready` (or `error`). It never relaunches the app. */
46
55
  performUpdate(release: ReleaseInfo, onProgress: (p: UpdateProgress) => void): Promise<void>;
56
+ /** Installs the staged update and relaunches the app. Only runs on an explicit request. */
57
+ applyUpdate?(onProgress: (p: UpdateProgress) => void): Promise<void>;
47
58
  }
48
59
 
49
60
  let updateHost: UpdateHost | null = null;
@@ -255,6 +266,11 @@ export function canSelfUpdate(release: Pick<ReleaseInfo, "updateAction"> | null
255
266
  return release?.updateAction.kind === "self" || release?.updateAction.kind === "desktop";
256
267
  }
257
268
 
269
+ /** A downloaded update this host can install and relaunch into when the user asks. */
270
+ export function canRestartToApply(progress: UpdateProgress | null | undefined): boolean {
271
+ return progress?.phase === "ready" && progress.canRestart === true;
272
+ }
273
+
258
274
  export async function checkForUpdateDetailed(
259
275
  currentVersion: string,
260
276
  ): Promise<UpdateCheckResult> {
@@ -339,6 +355,15 @@ export async function checkForUpdate(
339
355
  return result.kind === "available" ? result.release : null;
340
356
  }
341
357
 
358
+ /** Installs the downloaded update and relaunches. Callers gate it on `canRestartToApply`. */
359
+ export async function applyUpdate(onProgress: (p: UpdateProgress) => void): Promise<void> {
360
+ if (!updateHost?.applyUpdate) {
361
+ onProgress({ phase: "error", error: "Restarting to apply an update is unavailable in this runtime." });
362
+ return;
363
+ }
364
+ await updateHost.applyUpdate(onProgress);
365
+ }
366
+
342
367
  export async function performUpdate(
343
368
  release: ReleaseInfo,
344
369
  onProgress: (p: UpdateProgress) => void,
@@ -389,17 +414,15 @@ export async function performUpdate(
389
414
  let unlinkUpdatePath: ((path: string) => void) | null = null;
390
415
 
391
416
  try {
392
- const fsModulePath = "fs";
393
- const zlibModulePath = "zlib";
394
- const cryptoModulePath = "crypto";
395
- const {
396
- renameSync,
397
- unlinkSync,
398
- chmodSync,
399
- } = await import(fsModulePath) as typeof import("fs");
417
+ // Not import(): Bun folds even a specifier held in a variable and bundles
418
+ // browser polyfills for all three into the web and desktop view builds,
419
+ // which never reach this path. Self-update only runs in the compiled
420
+ // terminal binary, where the process is always there.
421
+ const runtime = getRuntimeProcess()!;
422
+ const { renameSync, unlinkSync, chmodSync } = runtime.getBuiltinModule("fs");
400
423
  unlinkUpdatePath = unlinkSync;
401
- const { gunzipSync } = await import(zlibModulePath) as typeof import("zlib");
402
- const { createHash } = await import(cryptoModulePath) as typeof import("crypto");
424
+ const { gunzipSync } = runtime.getBuiltinModule("zlib");
425
+ const { createHash } = runtime.getBuiltinModule("crypto");
403
426
 
404
427
  onProgress({ phase: "downloading", percent: 0 });
405
428
 
@@ -458,7 +481,9 @@ export async function performUpdate(
458
481
  unlinkSync(oldPath);
459
482
  } catch {}
460
483
 
461
- onProgress({ phase: "done" });
484
+ // The new binary is in place; the running process keeps the old one until
485
+ // the user restarts it, which this process never does for them.
486
+ onProgress({ phase: "ready" });
462
487
  } catch (err: unknown) {
463
488
  // Clean up temp file on failure
464
489
  try {
@@ -58,3 +58,24 @@ export function abortable<T>(promise: Promise<T>, signal: AbortSignal | undefine
58
58
  promise.then(resolve, reject).finally(() => signal.removeEventListener("abort", abort));
59
59
  });
60
60
  }
61
+
62
+ /**
63
+ * Aborts when the caller's signal does or after `timeoutMs`, whichever comes
64
+ * first, with that signal's reason. Wired by hand because AbortSignal.any is
65
+ * missing from the older system WebViews the desktop app runs in.
66
+ */
67
+ export function signalWithTimeout(signal: AbortSignal | undefined, timeoutMs: number): AbortSignal {
68
+ const timeout = AbortSignal.timeout(timeoutMs);
69
+ if (!signal) return timeout;
70
+ if (signal.aborted) return signal;
71
+ const controller = new AbortController();
72
+ const fromCaller = () => controller.abort(signal.reason);
73
+ const fromTimeout = () => controller.abort(timeout.reason);
74
+ signal.addEventListener("abort", fromCaller, { once: true });
75
+ timeout.addEventListener("abort", fromTimeout, { once: true });
76
+ controller.signal.addEventListener("abort", () => {
77
+ signal.removeEventListener("abort", fromCaller);
78
+ timeout.removeEventListener("abort", fromTimeout);
79
+ }, { once: true });
80
+ return controller.signal;
81
+ }
@@ -8,6 +8,8 @@ export interface CliTableColumn {
8
8
  maxWidth?: number;
9
9
  /** Dropped, rightmost first, before other columns are shortened to fit a terminal. */
10
10
  optional?: boolean;
11
+ /** Among optional columns, a higher priority is dropped sooner; equal ones go rightmost first. */
12
+ dropPriority?: number;
11
13
  /** False keeps the column whole when fitting, for identifiers a user types into the next command. */
12
14
  shrink?: boolean;
13
15
  }
@@ -301,7 +303,9 @@ export function renderTable(columns: CliTableColumn[], rows: string[][], options
301
303
  let truncate = false;
302
304
  if (available != null && tableWidth(shown.map((entry) => entry.width)) > available) {
303
305
  while (tableWidth(shown.map((entry) => entry.width)) > available) {
304
- const dropped = shown.findLast((entry) => entry.column.optional);
306
+ const dropped = shown.reduce<(typeof shown)[number] | undefined>((pick, entry) => (
307
+ entry.column.optional && (!pick || (entry.column.dropPriority ?? 0) >= (pick.column.dropPriority ?? 0)) ? entry : pick
308
+ ), undefined);
305
309
  if (!dropped) break;
306
310
  shown = shown.filter((entry) => entry !== dropped);
307
311
  }