@gloom-sh/terminal 0.18.5 → 0.19.1

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 (570) hide show
  1. package/README.md +1 -1
  2. package/README.zh-CN.md +1 -1
  3. package/package.json +1 -1
  4. package/patches/electrobun@1.18.1.patch +163 -8
  5. package/src/api-client/app-attention.ts +3 -0
  6. package/src/api-client/beneficial-owners.ts +3 -0
  7. package/src/api-client/company-kpis.ts +3 -0
  8. package/src/api-client/cot.ts +6 -2
  9. package/src/api-client/credit-documents.ts +6 -0
  10. package/src/api-client/data.ts +19 -7
  11. package/src/api-client/equity-screener.ts +24 -0
  12. package/src/api-client/fund-facts.ts +45 -4
  13. package/src/api-client/hiring.ts +3 -0
  14. package/src/api-client/index.ts +15 -0
  15. package/src/api-client/ipo.ts +24 -1
  16. package/src/api-client/market-discovery.ts +10 -0
  17. package/src/api-client/market-movers.ts +7 -0
  18. package/src/api-client/members.ts +1 -1
  19. package/src/api-client/mna.ts +3 -0
  20. package/src/api-client/paths.ts +9 -1
  21. package/src/api-client/perps.ts +43 -0
  22. package/src/api-client/research-activity.ts +3 -2
  23. package/src/api-client/roadmap.ts +85 -0
  24. package/src/api-client/types.ts +82 -2
  25. package/src/app/pane-runtime/plugin-bindings.ts +9 -5
  26. package/src/app/runtime/broker-import.ts +0 -2
  27. package/src/app/runtime/plugin-bindings.ts +73 -56
  28. package/src/architecture/core-builtin-allowlist.json +2 -2
  29. package/src/architecture/pane-tabs-allowlist.json +3 -0
  30. package/src/architecture/ttl-caches-allowlist.json +19 -0
  31. package/src/brokers/sync-broker-instance.ts +2 -8
  32. package/src/capabilities/chart-series.ts +1 -1
  33. package/src/cli/commands/crypto-hints.ts +40 -24
  34. package/src/cli/commands/market.ts +107 -38
  35. package/src/cli/commands/news-search.ts +22 -0
  36. package/src/cli/commands/options-chain.ts +48 -7
  37. package/src/cli/commands/options-leaps.ts +9 -3
  38. package/src/cli/commands/overview.ts +147 -32
  39. package/src/cli/commands/search.ts +21 -1
  40. package/src/cli/commands/themes.ts +11 -2
  41. package/src/cli/commands/ticker.ts +87 -36
  42. package/src/cli/company-name-hint.ts +41 -0
  43. package/src/cli/earnings-calendar.ts +1 -1
  44. package/src/cli/errors.ts +25 -2
  45. package/src/cli/glossary.ts +31 -2
  46. package/src/cli/history-rows.ts +57 -9
  47. package/src/cli/index-roots.ts +0 -7
  48. package/src/cli/index.ts +2 -0
  49. package/src/cli/listing-arg.ts +235 -60
  50. package/src/cli/output-file.ts +68 -0
  51. package/src/cli/pane-functions/capabilities.ts +4 -0
  52. package/src/cli/pane-functions/catalog.ts +80 -7
  53. package/src/cli/pane-functions/discovery.ts +21 -1
  54. package/src/cli/pane-functions/dom.ts +13 -3
  55. package/src/cli/pane-functions/freshness.ts +93 -4
  56. package/src/cli/pane-functions/function-help.ts +20 -10
  57. package/src/cli/pane-functions/headless.ts +17 -7
  58. package/src/cli/pane-functions/index.ts +54 -16
  59. package/src/cli/pane-functions/market-session.ts +66 -4
  60. package/src/cli/pane-functions/options.ts +19 -1
  61. package/src/cli/pane-functions/resolver.ts +19 -8
  62. package/src/cli/pane-functions/screenshot-assessment.ts +6 -4
  63. package/src/cli/pane-functions/screenshot-types.ts +5 -0
  64. package/src/cli/quote-answer.ts +22 -11
  65. package/src/cli/saved-copy-persistence.ts +88 -0
  66. package/src/cli/ticker-resolution.ts +3 -2
  67. package/src/components/chart/composite/composite-chart.tsx +4 -0
  68. package/src/components/chart/composite/interactions.ts +6 -0
  69. package/src/components/chart/composite/legend.tsx +45 -7
  70. package/src/components/chart/composite/panel-gestures.ts +33 -0
  71. package/src/components/chart/composite/panel-surface.tsx +52 -3
  72. package/src/components/chart/composite/rasterizer.ts +24 -13
  73. package/src/components/chart/composite/scene.ts +39 -4
  74. package/src/components/chart/composite/series-cues.ts +14 -0
  75. package/src/components/chart/composite/text-renderer.ts +9 -2
  76. package/src/components/chart/composite/tool-catalog.ts +36 -0
  77. package/src/components/chart/composite/tools.ts +203 -44
  78. package/src/components/chart/composite/use-composite-chart-keyboard.ts +11 -4
  79. package/src/components/command-bar/assist/inventory.ts +2 -1
  80. package/src/components/command-bar/commands/direct/index.ts +28 -13
  81. package/src/components/command-bar/list/model.ts +5 -0
  82. package/src/components/command-bar/pane-templates/items.ts +3 -2
  83. package/src/components/command-bar/routes/root/runtime.ts +6 -7
  84. package/src/components/command-bar/selection-runtime.ts +52 -3
  85. package/src/components/command-bar/surface/index.tsx +2 -0
  86. package/src/components/command-bar/workflow/collection-actions.ts +3 -3
  87. package/src/components/layout/pane/capture-stamp.ts +2 -2
  88. package/src/components/layout/pane/footer/index.tsx +22 -6
  89. package/src/components/layout/pane/footer/model.ts +83 -15
  90. package/src/components/layout/pane/status-footer.ts +35 -2
  91. package/src/components/layout/status-widget-space.ts +9 -0
  92. package/src/components/onboarding/onboarding-wizard.tsx +4 -1
  93. package/src/components/onboarding/portfolio-step/positions-panel.tsx +12 -7
  94. package/src/components/onboarding/wizard-broker-sync.ts +0 -1
  95. package/src/components/onboarding/wizard-positions.ts +3 -3
  96. package/src/components/ticker/list-table-view.tsx +8 -21
  97. package/src/components/ui/choice-dialog.tsx +23 -18
  98. package/src/components/ui/choice-groups.ts +18 -0
  99. package/src/components/ui/data-table/opentui/index.tsx +9 -7
  100. package/src/components/ui/data-table/opentui/model.ts +26 -1
  101. package/src/components/ui/data-table/types.ts +2 -0
  102. package/src/components/ui/display.tsx +18 -3
  103. package/src/components/ui/icon.tsx +4 -1
  104. package/src/components/ui/list-view.tsx +8 -4
  105. package/src/components/ui/query-bar-keys.tsx +2 -0
  106. package/src/components/ui/query-bar.tsx +1 -0
  107. package/src/components/ui/select-button.tsx +5 -1
  108. package/src/components/ui/select-field.tsx +1 -0
  109. package/src/components/ui/table-layout.ts +8 -5
  110. package/src/core/app-runtime.ts +2 -0
  111. package/src/core/app-services.ts +2 -2
  112. package/src/data/config/chart-settings.ts +1 -1
  113. package/src/data/json-ticker-repository.ts +17 -8
  114. package/src/data/plugin-cache.ts +5 -3
  115. package/src/data/saved-copies.ts +8 -0
  116. package/src/data/ticker-repository.ts +16 -9
  117. package/src/data/ticker-writes.ts +81 -0
  118. package/src/data/ttl-cache.ts +165 -0
  119. package/src/docs/snapshot.json +103 -142
  120. package/src/i18n/es.ts +20 -6
  121. package/src/i18n/ja.ts +20 -6
  122. package/src/i18n/ko.ts +20 -6
  123. package/src/i18n/zh-cn.ts +20 -6
  124. package/src/i18n/zh-tw.ts +20 -6
  125. package/src/market-data/depositary-pair.ts +27 -3
  126. package/src/market-data/fund-facts.ts +50 -0
  127. package/src/market-data/market/change-basis.ts +16 -3
  128. package/src/market-data/market/format.ts +25 -0
  129. package/src/market-data/market/freshness.ts +2 -1
  130. package/src/market-data/options-alternatives.ts +81 -4
  131. package/src/market-data/quotes/metadata.ts +7 -0
  132. package/src/news/aggregator.ts +119 -9
  133. package/src/news/cloud-session.ts +21 -0
  134. package/src/news/hooks.ts +1 -0
  135. package/src/news/news-model.ts +1 -0
  136. package/src/news/types.ts +17 -0
  137. package/src/plugins/builtin/alerts/alert-engine.ts +20 -1
  138. package/src/plugins/builtin/alerts/alert-log.ts +33 -0
  139. package/src/plugins/builtin/alerts/calendar-events.ts +10 -4
  140. package/src/plugins/builtin/alerts/cli-forms.ts +216 -0
  141. package/src/plugins/builtin/alerts/cli.ts +362 -80
  142. package/src/plugins/builtin/alerts/command.ts +25 -1
  143. package/src/plugins/builtin/alerts/event-rows.ts +24 -3
  144. package/src/plugins/builtin/alerts/events-pane.tsx +34 -10
  145. package/src/plugins/builtin/alerts/fired-log.ts +73 -9
  146. package/src/plugins/builtin/alerts/format.ts +75 -5
  147. package/src/plugins/builtin/alerts/headless.ts +34 -12
  148. package/src/plugins/builtin/alerts/history-rows.ts +3 -2
  149. package/src/plugins/builtin/alerts/history.ts +1 -1
  150. package/src/plugins/builtin/alerts/index.tsx +79 -16
  151. package/src/plugins/builtin/alerts/metric-command.ts +77 -4
  152. package/src/plugins/builtin/alerts/metric-data.ts +54 -13
  153. package/src/plugins/builtin/alerts/metric-model.ts +163 -14
  154. package/src/plugins/builtin/alerts/metric-parity-fixture.json +1 -1
  155. package/src/plugins/builtin/alerts/pane.tsx +61 -23
  156. package/src/plugins/builtin/alerts/quotes.ts +6 -0
  157. package/src/plugins/builtin/alerts/storage.ts +12 -8
  158. package/src/plugins/builtin/alerts/types.ts +4 -0
  159. package/src/plugins/builtin/analytics/index.tsx +2 -1
  160. package/src/plugins/builtin/analytics/risk-client.ts +16 -5
  161. package/src/plugins/builtin/analytics/risk-fx.ts +70 -15
  162. package/src/plugins/builtin/analytics/risk-headless.ts +27 -0
  163. package/src/plugins/builtin/analytics/risk-model.ts +55 -9
  164. package/src/plugins/builtin/analytics/risk-pane.tsx +8 -2
  165. package/src/plugins/builtin/attention/index.tsx +2 -1
  166. package/src/plugins/builtin/attention/listing.ts +14 -0
  167. package/src/plugins/builtin/broker-manager/index.tsx +7 -3
  168. package/src/plugins/builtin/buildout/cells.tsx +12 -4
  169. package/src/plugins/builtin/buildout/format.ts +38 -0
  170. package/src/plugins/builtin/buildout/model/normalizers.ts +36 -1
  171. package/src/plugins/builtin/buildout/pane/index.tsx +4 -1
  172. package/src/plugins/builtin/buildout/table-model.ts +23 -2
  173. package/src/plugins/builtin/builtin-plugin-meta.ts +6 -2
  174. package/src/plugins/builtin/cds/client.ts +142 -30
  175. package/src/plugins/builtin/cds/headless.ts +35 -8
  176. package/src/plugins/builtin/cds/model.ts +145 -18
  177. package/src/plugins/builtin/cds/pane.tsx +16 -5
  178. package/src/plugins/builtin/changelog/index.tsx +9 -6
  179. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +3 -0
  180. package/src/plugins/builtin/chart-composer/cli-options.ts +4 -0
  181. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +7 -0
  182. package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -2
  183. package/src/plugins/builtin/chart-composer/follow-binding.ts +14 -2
  184. package/src/plugins/builtin/chart-composer/headless-schema.ts +7 -1
  185. package/src/plugins/builtin/chart-composer/headless.ts +6 -1
  186. package/src/plugins/builtin/chart-composer/index.tsx +5 -6
  187. package/src/plugins/builtin/chart-composer/pane.tsx +37 -8
  188. package/src/plugins/builtin/chart-composer/settings.ts +27 -0
  189. package/src/plugins/builtin/chat/content/command-suggestions.ts +1 -0
  190. package/src/plugins/builtin/chat/controller/index.ts +5 -1
  191. package/src/plugins/builtin/chat/controller/notifications.ts +33 -3
  192. package/src/plugins/builtin/chat/controller/state.ts +25 -2
  193. package/src/plugins/builtin/chat/controller/unread-people.ts +89 -23
  194. package/src/plugins/builtin/chat/controller/utils.ts +7 -2
  195. package/src/plugins/builtin/chat/pane-links/commands.ts +7 -1
  196. package/src/plugins/builtin/chat/status-preview.ts +79 -0
  197. package/src/plugins/builtin/chat/status-widget.tsx +147 -10
  198. package/src/plugins/builtin/chat/unread-badge.ts +51 -10
  199. package/src/plugins/builtin/clinical-trials/client.ts +49 -4
  200. package/src/plugins/builtin/clinical-trials/model.ts +86 -31
  201. package/src/plugins/builtin/clinical-trials/pane.tsx +61 -49
  202. package/src/plugins/builtin/clinical-trials/sponsor-listing.ts +90 -0
  203. package/src/plugins/builtin/clinical-trials/sponsor-tickers.ts +95 -15
  204. package/src/plugins/builtin/clinical-trials/trial-pages.ts +50 -0
  205. package/src/plugins/builtin/cloud/askg/manifest.ts +2 -0
  206. package/src/plugins/builtin/company-attention/building.tsx +5 -1
  207. package/src/plugins/builtin/company-attention/client.ts +8 -9
  208. package/src/plugins/builtin/company-attention/evidence.ts +4 -1
  209. package/src/plugins/builtin/company-attention/headless.ts +2 -1
  210. package/src/plugins/builtin/company-attention/moves.tsx +5 -1
  211. package/src/plugins/builtin/company-attention/pane.tsx +12 -2
  212. package/src/plugins/builtin/company-attention/signals.tsx +5 -1
  213. package/src/plugins/builtin/company-kpis/headless.ts +8 -3
  214. package/src/plugins/builtin/company-kpis/model.ts +73 -5
  215. package/src/plugins/builtin/company-kpis/pane.tsx +15 -7
  216. package/src/plugins/builtin/composite-plugins.ts +2 -1
  217. package/src/plugins/builtin/correlation/headless.ts +13 -5
  218. package/src/plugins/builtin/correlation/history.ts +22 -0
  219. package/src/plugins/builtin/cot/client.ts +22 -18
  220. package/src/plugins/builtin/cot/headless.ts +15 -10
  221. package/src/plugins/builtin/cot/model.ts +14 -1
  222. package/src/plugins/builtin/cot/pane.tsx +22 -14
  223. package/src/plugins/builtin/credit-boards/client.ts +6 -10
  224. package/src/plugins/builtin/credit-conditions/headless.ts +8 -2
  225. package/src/plugins/builtin/credit-conditions/index.tsx +5 -1
  226. package/src/plugins/builtin/credit-conditions/model.ts +4 -0
  227. package/src/plugins/builtin/credit-conditions/series.ts +3 -1
  228. package/src/plugins/builtin/credit-documents/detail.tsx +2 -2
  229. package/src/plugins/builtin/credit-documents/export.ts +173 -0
  230. package/src/plugins/builtin/credit-documents/headless.ts +10 -10
  231. package/src/plugins/builtin/credit-documents/model.ts +104 -14
  232. package/src/plugins/builtin/credit-documents/pane.tsx +12 -5
  233. package/src/plugins/builtin/custom-view/sources.ts +2 -0
  234. package/src/plugins/builtin/dividend-yield/client.ts +131 -23
  235. package/src/plugins/builtin/dividend-yield/headless.ts +44 -16
  236. package/src/plugins/builtin/dividend-yield/model.ts +8 -5
  237. package/src/plugins/builtin/dividend-yield/pane.tsx +38 -13
  238. package/src/plugins/builtin/dividend-yield/ranking.ts +37 -14
  239. package/src/plugins/builtin/dividend-yield/types.ts +20 -2
  240. package/src/plugins/builtin/dividend-yield/view.ts +30 -2
  241. package/src/plugins/builtin/docs/targets.ts +5 -1
  242. package/src/plugins/builtin/doe/headless.ts +3 -2
  243. package/src/plugins/builtin/doe/pane.tsx +13 -3
  244. package/src/plugins/builtin/earnings/board-model.ts +16 -15
  245. package/src/plugins/builtin/earnings/board.tsx +62 -71
  246. package/src/plugins/builtin/earnings/headless.ts +40 -4
  247. package/src/plugins/builtin/earnings/scope.ts +31 -43
  248. package/src/plugins/builtin/earnings-calls/calendar.tsx +2 -2
  249. package/src/plugins/builtin/earnings-calls/data.ts +18 -6
  250. package/src/plugins/builtin/earnings-calls/format.ts +31 -2
  251. package/src/plugins/builtin/earnings-calls/headless.ts +20 -5
  252. package/src/plugins/builtin/earnings-calls/model.ts +6 -1
  253. package/src/plugins/builtin/earnings-calls/pane.tsx +12 -4
  254. package/src/plugins/builtin/econ/calendar-model.ts +48 -1
  255. package/src/plugins/builtin/econ/calendar-source.ts +4 -2
  256. package/src/plugins/builtin/econ/detail-view.tsx +2 -2
  257. package/src/plugins/builtin/econ/figures.ts +48 -0
  258. package/src/plugins/builtin/econ/index.tsx +14 -5
  259. package/src/plugins/builtin/econ/print-watch.ts +3 -1
  260. package/src/plugins/builtin/econ/types.ts +2 -0
  261. package/src/plugins/builtin/econ-statistics/client.ts +11 -0
  262. package/src/plugins/builtin/econ-statistics/defs.ts +6 -0
  263. package/src/plugins/builtin/econ-statistics/headless.ts +16 -6
  264. package/src/plugins/builtin/econ-statistics/pane.tsx +8 -4
  265. package/src/plugins/builtin/econ-statistics/stats.ts +39 -9
  266. package/src/plugins/builtin/equity-screener/categories.ts +179 -0
  267. package/src/plugins/builtin/equity-screener/client.ts +4 -2
  268. package/src/plugins/builtin/equity-screener/headless.ts +144 -13
  269. package/src/plugins/builtin/equity-screener/ideas.ts +49 -0
  270. package/src/plugins/builtin/equity-screener/model.ts +99 -10
  271. package/src/plugins/builtin/equity-screener/pane.tsx +68 -13
  272. package/src/plugins/builtin/fixed-income/pane.tsx +2 -1
  273. package/src/plugins/builtin/futures/use-board-terms.ts +42 -28
  274. package/src/plugins/builtin/futures/use-front-returns.ts +45 -28
  275. package/src/plugins/builtin/fx-matrix/client.ts +6 -3
  276. package/src/plugins/builtin/fx-matrix/headless.ts +1 -1
  277. package/src/plugins/builtin/fx-matrix/index.tsx +4 -2
  278. package/src/plugins/builtin/fx-matrix/live-legs.ts +42 -3
  279. package/src/plugins/builtin/gpu/headless.ts +8 -2
  280. package/src/plugins/builtin/help/function-index.ts +4 -1
  281. package/src/plugins/builtin/help/index.tsx +62 -59
  282. package/src/plugins/builtin/help/shortcut-model.ts +1 -1
  283. package/src/plugins/builtin/help/shortcut-table.tsx +5 -6
  284. package/src/plugins/builtin/help/table-cells.tsx +13 -2
  285. package/src/plugins/builtin/holders/beneficial-client.ts +5 -1
  286. package/src/plugins/builtin/holders/beneficial-view.tsx +3 -0
  287. package/src/plugins/builtin/holders/fund-holders.ts +51 -0
  288. package/src/plugins/builtin/holders/headless.ts +22 -3
  289. package/src/plugins/builtin/holders/pane.tsx +3 -0
  290. package/src/plugins/builtin/holders/report-rows.ts +4 -1
  291. package/src/plugins/builtin/insider/headless.ts +2 -2
  292. package/src/plugins/builtin/ipo-calendar/client.ts +18 -2
  293. package/src/plugins/builtin/ipo-calendar/headless.ts +75 -11
  294. package/src/plugins/builtin/ipo-calendar/listing-ipo.ts +160 -0
  295. package/src/plugins/builtin/ipo-calendar/model.ts +98 -2
  296. package/src/plugins/builtin/iv-history/client.ts +52 -11
  297. package/src/plugins/builtin/iv-history/format.ts +36 -23
  298. package/src/plugins/builtin/iv-history/headless.ts +33 -18
  299. package/src/plugins/builtin/iv-history/index.tsx +2 -2
  300. package/src/plugins/builtin/iv-history/model.ts +163 -27
  301. package/src/plugins/builtin/iv-history/pane.tsx +10 -6
  302. package/src/plugins/builtin/iv-history/screen-pane.tsx +22 -15
  303. package/src/plugins/builtin/iv-history/universe.ts +5 -1
  304. package/src/plugins/builtin/jobs/client.ts +25 -29
  305. package/src/plugins/builtin/kelly-sizer/model.ts +12 -8
  306. package/src/plugins/builtin/kelly-sizer/pane.tsx +9 -9
  307. package/src/plugins/builtin/kelly-sizer/sections.tsx +19 -10
  308. package/src/plugins/builtin/kelly-sizer/types.ts +10 -4
  309. package/src/plugins/builtin/macro-day/headless.ts +12 -5
  310. package/src/plugins/builtin/macro-day/index.tsx +1 -1
  311. package/src/plugins/builtin/macro-day/model.ts +39 -5
  312. package/src/plugins/builtin/macro-day/pane.tsx +27 -19
  313. package/src/plugins/builtin/macro-day/release-table.ts +2 -2
  314. package/src/plugins/builtin/market-heatmap/data.ts +8 -33
  315. package/src/plugins/builtin/market-movers/client.ts +27 -7
  316. package/src/plugins/builtin/market-movers/headless.ts +34 -12
  317. package/src/plugins/builtin/market-movers/index.tsx +26 -14
  318. package/src/plugins/builtin/market-movers/min-float.ts +74 -0
  319. package/src/plugins/builtin/market-movers/model.ts +4 -1
  320. package/src/plugins/builtin/market-movers/screener.ts +22 -4
  321. package/src/plugins/builtin/market-movers/session-body.tsx +13 -8
  322. package/src/plugins/builtin/market-movers/session-table.ts +4 -3
  323. package/src/plugins/builtin/market-movers/table.ts +17 -5
  324. package/src/plugins/builtin/members/breadth-pane.tsx +2 -1
  325. package/src/plugins/builtin/mna/headless.ts +2 -0
  326. package/src/plugins/builtin/mna/pane.tsx +3 -1
  327. package/src/plugins/builtin/news/headless.ts +3 -1
  328. package/src/plugins/builtin/news/index.tsx +4 -0
  329. package/src/plugins/builtin/news/wire/categories.ts +19 -3
  330. package/src/plugins/builtin/news/wire/industry-pane.tsx +1 -0
  331. package/src/plugins/builtin/news/wire/news/footer.ts +31 -5
  332. package/src/plugins/builtin/news/wire/news/preset-pane.tsx +6 -1
  333. package/src/plugins/builtin/news/wire/news/table.tsx +2 -2
  334. package/src/plugins/builtin/openfda/client.ts +14 -2
  335. package/src/plugins/builtin/openfda/index.tsx +3 -2
  336. package/src/plugins/builtin/openfda/model.ts +9 -0
  337. package/src/plugins/builtin/openfda/pane.tsx +42 -6
  338. package/src/plugins/builtin/options/analytics.ts +29 -5
  339. package/src/plugins/builtin/options/enrichment.ts +17 -5
  340. package/src/plugins/builtin/options/table.ts +5 -2
  341. package/src/plugins/builtin/options/types.ts +2 -0
  342. package/src/plugins/builtin/options/view.tsx +17 -4
  343. package/src/plugins/builtin/options-positioning/client.ts +11 -0
  344. package/src/plugins/builtin/options-positioning/headless.ts +21 -8
  345. package/src/plugins/builtin/options-positioning/index.tsx +1 -1
  346. package/src/plugins/builtin/options-positioning/model.ts +78 -9
  347. package/src/plugins/builtin/options-positioning/pane.tsx +21 -6
  348. package/src/plugins/builtin/options-scenario/client.ts +116 -47
  349. package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +142 -10
  350. package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +206 -55
  351. package/src/plugins/builtin/options-scenario/csp-screen.ts +63 -23
  352. package/src/plugins/builtin/options-scenario/csp.ts +8 -2
  353. package/src/plugins/builtin/options-scenario/index.tsx +9 -7
  354. package/src/plugins/builtin/options-scenario/strategy-screen.ts +532 -0
  355. package/src/plugins/builtin/pe-band/model.ts +12 -49
  356. package/src/plugins/builtin/perps/cascade-tabs.tsx +161 -0
  357. package/src/plugins/builtin/perps/cascade.ts +236 -0
  358. package/src/plugins/builtin/perps/client.ts +56 -2
  359. package/src/plugins/builtin/perps/headless.ts +65 -9
  360. package/src/plugins/builtin/perps/index.tsx +7 -5
  361. package/src/plugins/builtin/perps/model.ts +18 -4
  362. package/src/plugins/builtin/perps/pane.tsx +19 -22
  363. package/src/plugins/builtin/perps/status-line.ts +25 -0
  364. package/src/plugins/builtin/plugin-module.ts +5 -1
  365. package/src/plugins/builtin/portfolio-list/cached-account.ts +3 -1
  366. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +2 -8
  367. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +4 -4
  368. package/src/plugins/builtin/portfolio-list/cli/render.ts +7 -5
  369. package/src/plugins/builtin/portfolio-list/pane/futures-front.ts +40 -0
  370. package/src/plugins/builtin/portfolio-list/pane/index.tsx +6 -7
  371. package/src/plugins/builtin/portfolio-list/pane/streaming.ts +5 -2
  372. package/src/plugins/builtin/portfolio-list/pane/supplemental.ts +3 -2
  373. package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +0 -14
  374. package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +5 -2
  375. package/src/plugins/builtin/portfolio-list/table.tsx +15 -9
  376. package/src/plugins/builtin/primary-dealers/client.ts +13 -38
  377. package/src/plugins/builtin/realized-vol/client.ts +13 -5
  378. package/src/plugins/builtin/realized-vol/evidence.ts +29 -4
  379. package/src/plugins/builtin/realized-vol/headless.ts +8 -4
  380. package/src/plugins/builtin/realized-vol/index.tsx +2 -2
  381. package/src/plugins/builtin/realized-vol/model.ts +37 -6
  382. package/src/plugins/builtin/realized-vol/pane.tsx +11 -9
  383. package/src/plugins/builtin/relative-rotation/client.ts +18 -4
  384. package/src/plugins/builtin/relative-rotation/headless.ts +3 -3
  385. package/src/plugins/builtin/relative-rotation/index.tsx +2 -1
  386. package/src/plugins/builtin/relative-rotation/model.ts +16 -40
  387. package/src/plugins/builtin/relative-rotation/pane.tsx +3 -2
  388. package/src/plugins/builtin/research/corporate-actions-pane.tsx +3 -2
  389. package/src/plugins/builtin/research/event-model.ts +40 -12
  390. package/src/plugins/builtin/research/headless.ts +1 -1
  391. package/src/plugins/builtin/research/index.tsx +7 -3
  392. package/src/plugins/builtin/research/relative-valuation-headless.ts +13 -26
  393. package/src/plugins/builtin/research/relative-valuation-model.ts +31 -3
  394. package/src/plugins/builtin/research/relative-valuation-pane.tsx +59 -20
  395. package/src/plugins/builtin/research/relative-valuation-peers.ts +217 -20
  396. package/src/plugins/builtin/research/relative-valuation-settings.ts +44 -0
  397. package/src/plugins/builtin/reverse-dcf/headless.ts +5 -3
  398. package/src/plugins/builtin/reverse-dcf/model.ts +61 -6
  399. package/src/plugins/builtin/reverse-dcf/pane.tsx +7 -4
  400. package/src/plugins/builtin/risk-factors/data.ts +4 -2
  401. package/src/plugins/builtin/risk-factors/headless.ts +5 -2
  402. package/src/plugins/builtin/roadmap/index.tsx +28 -0
  403. package/src/plugins/builtin/roadmap/model.ts +67 -0
  404. package/src/plugins/builtin/roadmap/pane.tsx +244 -0
  405. package/src/plugins/builtin/scanner/flow-model.ts +50 -4
  406. package/src/plugins/builtin/scanner/flow-pane.tsx +367 -65
  407. package/src/plugins/builtin/scanner/flow-session.ts +146 -0
  408. package/src/plugins/builtin/scanner/headless.ts +204 -35
  409. package/src/plugins/builtin/scanner/index.ts +16 -5
  410. package/src/plugins/builtin/scanner/live-headless.ts +48 -5
  411. package/src/plugins/builtin/scanner/live-model.ts +11 -0
  412. package/src/plugins/builtin/scanner/live-pane.tsx +3 -3
  413. package/src/plugins/builtin/scanner/lock-note.ts +3 -2
  414. package/src/plugins/builtin/seasonality/headless.ts +10 -1
  415. package/src/plugins/builtin/sec/fund-facts-view.tsx +5 -2
  416. package/src/plugins/builtin/sec/fund-facts.ts +116 -34
  417. package/src/plugins/builtin/sec/headless.ts +4 -2
  418. package/src/plugins/builtin/sec/index.tsx +3 -0
  419. package/src/plugins/builtin/series-inventory.ts +2 -0
  420. package/src/plugins/builtin/shared/cloud-resource.ts +16 -7
  421. package/src/plugins/builtin/shared/cloud-upgrade.ts +4 -3
  422. package/src/plugins/builtin/shared/earnings-calendar.ts +6 -2
  423. package/src/plugins/builtin/shared/earnings-report.ts +2 -2
  424. package/src/plugins/builtin/shared/headless-market-data.ts +2 -2
  425. package/src/plugins/builtin/shared/job-posting.ts +1 -0
  426. package/src/plugins/builtin/shared/members-menu.tsx +3 -2
  427. package/src/plugins/builtin/shared/pro-lock-note.ts +12 -12
  428. package/src/plugins/builtin/shared/report-freshness.ts +11 -2
  429. package/src/plugins/builtin/shared/research-cells.tsx +1 -1
  430. package/src/plugins/builtin/shared/series-cache.ts +4 -4
  431. package/src/plugins/builtin/shared/ticker-choice.tsx +2 -1
  432. package/src/plugins/builtin/shared/ticker-company.ts +77 -0
  433. package/src/plugins/builtin/shared/use-quote-board.ts +2 -1
  434. package/src/plugins/builtin/shared/volatility/live-session.ts +34 -8
  435. package/src/plugins/builtin/shared/volatility/pricing.ts +19 -0
  436. package/src/plugins/builtin/shared/wall-view-lifecycle.ts +3 -1
  437. package/src/plugins/builtin/themes/model.ts +16 -7
  438. package/src/plugins/builtin/themes/pane.tsx +5 -5
  439. package/src/plugins/builtin/thirteenf/api.ts +12 -1
  440. package/src/plugins/builtin/thirteenf/data.ts +7 -7
  441. package/src/plugins/builtin/thirteenf/headless.ts +31 -4
  442. package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +43 -18
  443. package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +3 -2
  444. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +62 -0
  445. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +83 -46
  446. package/src/plugins/builtin/ticker-detail/headless.ts +31 -16
  447. package/src/plugins/builtin/ticker-detail/overview/model.ts +11 -3
  448. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +2 -1
  449. package/src/plugins/builtin/ticker-detail/pane.tsx +14 -8
  450. package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +2 -1
  451. package/src/plugins/builtin/ticker-detail/settings.ts +1 -0
  452. package/src/plugins/builtin/time-sales/pane.tsx +31 -19
  453. package/src/plugins/builtin/treasury-auctions/headless.ts +21 -12
  454. package/src/plugins/builtin/treasury-auctions/pane.tsx +9 -3
  455. package/src/plugins/builtin/treasury-daily/client.ts +41 -5
  456. package/src/plugins/builtin/treasury-daily/headless.ts +2 -2
  457. package/src/plugins/builtin/treasury-daily/index.tsx +1 -1
  458. package/src/plugins/builtin/treasury-daily/model.ts +50 -3
  459. package/src/plugins/builtin/treasury-daily/pane.tsx +81 -2
  460. package/src/plugins/builtin/vol-surface/client.ts +3 -13
  461. package/src/plugins/builtin/vol-surface/headless.ts +3 -3
  462. package/src/plugins/builtin/vol-surface/index.tsx +1 -1
  463. package/src/plugins/builtin/vol-surface/pane.tsx +7 -5
  464. package/src/plugins/builtin/volatility/index.tsx +2 -2
  465. package/src/plugins/builtin/volatility/pane.tsx +7 -4
  466. package/src/plugins/builtin/world-venue-map/headless.ts +3 -3
  467. package/src/plugins/builtin/yield-curve/client.ts +61 -1
  468. package/src/plugins/builtin/yield-curve/headless.ts +9 -6
  469. package/src/plugins/builtin/yield-curve/index.tsx +34 -10
  470. package/src/plugins/builtin/yield-curve/swaps.tsx +9 -5
  471. package/src/plugins/catalog-browser.ts +2 -1
  472. package/src/plugins/catalog-manifest.ts +2 -1
  473. package/src/plugins/host-link.ts +1 -1
  474. package/src/plugins/marketplace/model.ts +18 -5
  475. package/src/portfolio/column-values.ts +11 -7
  476. package/src/portfolio/futures-positions.ts +6 -3
  477. package/src/portfolio/position-quantity.ts +15 -9
  478. package/src/remote/resources.ts +2 -1
  479. package/src/renderers/dom/data-table/row.tsx +26 -0
  480. package/src/renderers/dom/desktop/icons.tsx +7 -0
  481. package/src/renderers/dom/desktop/list-view.tsx +13 -10
  482. package/src/renderers/dom/desktop/query-bar.tsx +4 -2
  483. package/src/renderers/dom/desktop/select-field.tsx +4 -2
  484. package/src/renderers/dom/host/chart-surface.tsx +21 -0
  485. package/src/renderers/electrobun/bun/desktop/app-name.ts +3 -3
  486. package/src/renderers/electrobun/bun/desktop/backend.ts +21 -10
  487. package/src/renderers/electrobun/bun/desktop/host-requests.ts +15 -0
  488. package/src/renderers/electrobun/bun/desktop/initialization.ts +2 -0
  489. package/src/renderers/electrobun/bun/desktop/installer-folder.ts +731 -0
  490. package/src/renderers/electrobun/bun/desktop/relaunch.ts +102 -10
  491. package/src/renderers/electrobun/bun/desktop/update.ts +115 -14
  492. package/src/renderers/electrobun/bun/desktop/view-ids.ts +52 -0
  493. package/src/renderers/electrobun/bun/desktop/windows-script.ts +92 -0
  494. package/src/renderers/electrobun/bun/index.ts +26 -2
  495. package/src/renderers/electrobun/bun/window/create.ts +43 -4
  496. package/src/renderers/electrobun/bun/window/events.ts +20 -0
  497. package/src/renderers/electrobun/bun/window/windows-custom-chrome.ts +9 -2
  498. package/src/renderers/electrobun/bun/window/windows-native.ts +78 -0
  499. package/src/renderers/electrobun/bun/window/windows-quit.ts +57 -0
  500. package/src/renderers/electrobun/shared/app-name.ts +13 -0
  501. package/src/renderers/electrobun/shared/protocol.ts +12 -0
  502. package/src/renderers/electrobun/view/backend-rpc.ts +6 -0
  503. package/src/renderers/electrobun/view/main.tsx +24 -1
  504. package/src/renderers/electrobun/view/news-source.ts +5 -1
  505. package/src/renderers/electrobun/view/remote/ticker-repository.ts +14 -7
  506. package/src/renderers/electrobun/view/ui-host.tsx +8 -0
  507. package/src/renderers/electrobun/view/view-ids.ts +85 -0
  508. package/src/renderers/opentui/start.tsx +5 -0
  509. package/src/series/registry.ts +1 -0
  510. package/src/series/types.ts +6 -0
  511. package/src/series/validate.ts +1 -0
  512. package/src/sources/gloomberb-cloud/fred-series.ts +3 -1
  513. package/src/sources/gloomberb-cloud/index.ts +43 -8
  514. package/src/sources/gloomberb-cloud/news.ts +47 -7
  515. package/src/sources/provider-router/financials.ts +15 -3
  516. package/src/sources/provider-router/index.ts +8 -5
  517. package/src/state/ticker-cleanup.ts +50 -0
  518. package/src/sync/controller.ts +4 -3
  519. package/src/sync/core-contributors.ts +90 -31
  520. package/src/telemetry/stall-reports-dom.ts +38 -0
  521. package/src/telemetry/stall-reports-node.ts +75 -0
  522. package/src/telemetry/stall-reports.ts +214 -0
  523. package/src/test-support/preload.ts +14 -0
  524. package/src/theme/themes.ts +10 -0
  525. package/src/tickers/company-name-listing.ts +53 -13
  526. package/src/tickers/company-name.ts +50 -4
  527. package/src/tickers/index-roots.ts +7 -0
  528. package/src/tickers/listing-fate.ts +2 -2
  529. package/src/tickers/listing-venues.ts +15 -3
  530. package/src/tickers/search/index.ts +6 -2
  531. package/src/tickers/search/ranking.ts +5 -1
  532. package/src/tickers/search/upsert.ts +13 -0
  533. package/src/tickers/terminal-codes.ts +19 -0
  534. package/src/tickers/ticker-changes.ts +8 -4
  535. package/src/time-series/alignment.ts +1 -1
  536. package/src/time-series/economic.ts +18 -4
  537. package/src/time-series/field-catalog.ts +1 -1
  538. package/src/time-series/filed-trailing-eps.ts +197 -0
  539. package/src/time-series/fundamentals.ts +44 -1
  540. package/src/time-series/ice-credit.ts +3 -0
  541. package/src/time-series/price-comparison.ts +30 -2
  542. package/src/time-series/resolve-context.ts +3 -1
  543. package/src/time-series/resolve.ts +56 -4
  544. package/src/time-series/session-bar.ts +11 -0
  545. package/src/time-series/spec.ts +3 -2
  546. package/src/time-series/studies.ts +8 -2
  547. package/src/time-series/total-return.ts +160 -0
  548. package/src/time-series/transforms.ts +2 -3
  549. package/src/time-series/types.ts +22 -1
  550. package/src/types/company-from.ts +40 -0
  551. package/src/types/data-provider.ts +7 -0
  552. package/src/types/financials.ts +59 -1
  553. package/src/types/headless.ts +27 -3
  554. package/src/types/news-source.ts +1 -0
  555. package/src/types/plugin.ts +9 -0
  556. package/src/ui/host.tsx +3 -0
  557. package/src/updater/failure.ts +4 -1
  558. package/src/utils/cli-output.ts +42 -1
  559. package/src/utils/crypto-pair.ts +165 -7
  560. package/src/utils/declared-dividends.ts +1 -1
  561. package/src/utils/forward-dividend.ts +2 -0
  562. package/src/utils/fundamentals.ts +60 -8
  563. package/src/utils/fx-market-hours.ts +26 -3
  564. package/src/utils/main-thread-stall.ts +35 -2
  565. package/src/utils/market-capitalization.ts +24 -1
  566. package/src/utils/price-history.ts +7 -1
  567. package/src/utils/shell-word.ts +8 -0
  568. package/src/utils/trailing-dividend.ts +53 -4
  569. package/src/version.ts +2 -2
  570. package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +0 -17
@@ -28,6 +28,24 @@ interface IpoFirstDay {
28
28
  returnPct: number | null;
29
29
  }
30
30
 
31
+ /**
32
+ * When a US IPO's lock-up is estimated to end: the final prospectus's date
33
+ * plus the period it states, or the first session plus the usual 180 days
34
+ * until the prospectus is read. An estimate: underwriters can release
35
+ * shares early, and some holders agree to other periods.
36
+ */
37
+ export interface IpoLockup {
38
+ /** YYYY-MM-DD. */
39
+ endsOn: string;
40
+ days: number;
41
+ /** `prospectus`: the period the final prospectus states; `typical`: 180 days, when it states none of a lock-up's length or was not read. */
42
+ basis: "prospectus" | "typical";
43
+ /** The date the final prospectus is dated, when it was read. */
44
+ prospectusDate: string | null;
45
+ /** The SEC document the period was read from. */
46
+ prospectusUrl: string | null;
47
+ }
48
+
31
49
  export interface IpoDeal {
32
50
  /** Assigned when the deal is first seen and never changed. */
33
51
  id: string;
@@ -66,6 +84,8 @@ export interface IpoDeal {
66
84
  listingType: IpoListingType;
67
85
  filedDate: string | null;
68
86
  firstDay: IpoFirstDay | null;
87
+ /** A priced or listed US IPO's estimated lock-up end; absent elsewhere, and from a server without the estimate. */
88
+ lockup?: IpoLockup | null;
69
89
  updatedAt: string;
70
90
  }
71
91
 
@@ -86,11 +106,14 @@ export interface IpoCalendarPayload {
86
106
 
87
107
  /**
88
108
  * Narrows or moves the window. Without any, the server sends its default:
89
- * 90 days back to 180 ahead, filed and withdrawn deals left out, 500 at most.
109
+ * a year back (90 days on a server before that) to 180 days ahead, filed
110
+ * and withdrawn deals left out.
90
111
  */
91
112
  export interface IpoCalendarParams {
92
113
  region?: IpoRegion;
93
114
  status?: IpoStatus;
115
+ /** Company (in either script) or symbol the deals' names contain. */
116
+ q?: string;
94
117
  /** First listing date, YYYY-MM-DD. */
95
118
  from?: string;
96
119
  /** Last listing date, YYYY-MM-DD. */
@@ -21,6 +21,12 @@ export interface ScreenerQuote {
21
21
  previousClose?: number;
22
22
  /** The quote's sessions beside the live print the server ranked the row by, when the server sends them. */
23
23
  sessions?: CloudMoverSessionFields;
24
+ /** The listing's float as the equity screener serves it; absent where the server serves none or predates it. */
25
+ floatShares?: number;
26
+ /** Set with a float the source states no measurement date for: `partial`. */
27
+ floatSharesState?: "partial";
28
+ /** Why the float is partial, as the server says it. */
29
+ floatSharesReason?: string;
24
30
  }
25
31
 
26
32
 
@@ -105,6 +111,8 @@ export interface DividendSummary {
105
111
  /** The ex-date of the distribution that rate annualizes, YYYY-MM-DD. */
106
112
  forwardRateAsOf?: string | null;
107
113
  payoutRatio: number | null;
114
+ /** The trailing EPS fundamentals serve for the listing; only its sign is read, since a payout over a loss is not meaningful. Absent from older servers. */
115
+ trailingEps?: number | null;
108
116
  exDividendDate: number | null;
109
117
  dividendDate: number | null;
110
118
  currency: string | null;
@@ -117,4 +125,6 @@ export interface MarketDividendsPayload {
117
125
  summary: DividendSummary | null;
118
126
  historyError?: string;
119
127
  summaryError?: string;
128
+ /** When Gloom Cloud last asked for the history and the summary, ISO. Absent from older servers. */
129
+ triedAt?: string;
120
130
  }
@@ -37,7 +37,14 @@ export interface CloudSessionMoverItem {
37
37
  /** Regular-session VWAP. */
38
38
  vwap: number | null;
39
39
  vwapPercent: number | null;
40
+ /** The equity screener's float, null where it serves none. */
40
41
  floatShares: number | null;
42
+ /** Set with a float the source states no measurement date for: `partial`. */
43
+ floatSharesState?: "partial";
44
+ /** Why the float is partial, as the server says it. */
45
+ floatSharesReason?: string;
46
+ /** When the statistics the float is read from were retrieved (ISO). */
47
+ floatSharesRetrievedAt?: string;
41
48
  catalysts: CloudSessionCatalyst[];
42
49
  lastUpdated: number;
43
50
  }
@@ -1,7 +1,7 @@
1
1
  interface MemberFund { ticker: string; name: string; aliases: string[]; changes: "sp500" | "announcements" | "none" }
2
2
  export interface FundMember {
3
3
  id: string; symbol: string | null; name: string; sector: string | null;
4
- weight: number | null; shares: number; holdingPrice: number; marketValue: number;
4
+ weight: number | null; shares: number; holdingPrice: number | null; marketValue: number | null;
5
5
  price: number | null; priceAsOf: string | null; changePercent: number | null; dailyAsOf: string | null;
6
6
  return1WPercent: number | null; return1MPercent: number | null; returnYtdPercent: number | null;
7
7
  contribution: number | null; stale: boolean;
@@ -1,3 +1,4 @@
1
+ import type { CompanyFrom } from "../types/company-from";
1
2
  /**
2
3
  * Mergers and acquisitions read from news, press releases and SEC filings.
3
4
  * A deal is one target and one buyer; a target with competing bidders has a
@@ -84,6 +85,8 @@ export interface MnaDealsParams {
84
85
 
85
86
  export interface MnaDealsPayload {
86
87
  deals: MnaDeal[];
88
+ /** The company's home line the data is read from, when not the listing asked (a receipt, a foreign line). */
89
+ companyFrom?: CompanyFrom;
87
90
  hasMore: boolean;
88
91
  nextOffset: number;
89
92
  /** "delayed" hides deals first reported within `delayDays` from a free account. */
@@ -621,10 +621,18 @@ export function cloudNewsPath(params: CloudNewsParams = {}): string {
621
621
 
622
622
  /** Stories whose headline, summary or publisher matches the text, best match first; the service takes at most 100. */
623
623
  /** `topics` are NI codes the stories must carry: `query=gold&topics=metals` is gold's market news. */
624
- export function cloudNewsSearchPath(query: string, limit?: number, topics?: readonly string[]): string {
624
+ /**
625
+ * `closest`: when no story has every word, the stories with the most of them, marked `match: "closest"`.
626
+ * `tickers`: only the stories filed under them (`HAWK:NYSE`).
627
+ */
628
+ export function cloudNewsSearchPath(
629
+ query: string, limit?: number, topics?: readonly string[], options: { closest?: boolean; tickers?: readonly string[] } = {},
630
+ ): string {
625
631
  const search = new URLSearchParams({ query });
626
632
  if (limit != null) search.set("limit", String(limit));
627
633
  if (topics?.length) search.set("topics", topics.join(","));
634
+ if (options.tickers?.length) search.set("tickers", options.tickers.join(","));
635
+ if (options.closest) search.set("closest", "1");
628
636
  return appendQuery("/news/search", search);
629
637
  }
630
638
 
@@ -174,3 +174,46 @@ export interface PerpMarketPayload extends PerpBoardPayload {
174
174
  evidence: { kind: string; period_at: string; received_at: string; superseded_at: string | null; fingerprint: string; payload: PerpMarket | PerpFunding | PerpCandle }[];
175
175
  methodologyUrl: string;
176
176
  }
177
+
178
+ /** One contract's liquidations: long is longs liquidated (forced sells), short is shorts; quote notional. */
179
+ export interface PerpLiquidationMarket {
180
+ marketId: string; venue: string; symbol: string; dex: string; quoteCurrency: string;
181
+ long24h: number; short24h: number; long7d: number; short7d: number; count24h: number; count7d: number; lastEventAt: string | null;
182
+ }
183
+ export interface PerpLiquidationPrint {
184
+ marketId: string; venue: string; symbol: string; dex: string;
185
+ side: "long" | "short"; priceKind: "fill" | "bankruptcy"; price: number; quantity: number; notionalUsd: number;
186
+ /** The venue's time for the liquidation. */
187
+ eventAt: string;
188
+ /** When Gloom Cloud received it. */
189
+ receivedAt: string;
190
+ }
191
+ /** One base asset's liquidations across the venues' public streams. */
192
+ export interface PerpLiquidationsPayload {
193
+ status: string; baseAsset: string; asOf: string; from: string; collectingSince: string | null;
194
+ markets: PerpLiquidationMarket[];
195
+ totals: Pick<PerpLiquidationMarket, "long24h" | "short24h" | "long7d" | "short7d" | "count24h" | "count7d">;
196
+ /** Pro: UTC hours with liquidations over the last 7 days; empty for a preview. */
197
+ hourly: { time: string; long: number; short: number; count: number }[];
198
+ largest: PerpLiquidationPrint[];
199
+ streams: { venue: string; state: "live" | "down"; lastOkAt: string | null; error: string | null }[];
200
+ notes: string[];
201
+ locked: boolean; access: "pro" | "preview";
202
+ }
203
+ /** Quote notional resting within 0.5%, 1% and 2% of mid; reach is how far the returned book went, as a fraction of mid. */
204
+ export interface PerpDepthSnapshot {
205
+ marketId: string; bucket: string; observedAt: string; sourceAsOf: string | null; mid: number;
206
+ bid05: number; ask05: number; bid1: number; ask1: number; bid2: number; ask2: number;
207
+ bidReach: number; askReach: number; levels: number; grouping: number | null;
208
+ }
209
+ export interface PerpDepthRow extends PerpDepthSnapshot { venue: string; symbol: string; dex: string; quoteCurrency: string; stale: boolean }
210
+ /** One base asset's hourly order book depth across the venues. */
211
+ export interface PerpDepthPayload {
212
+ status: string; baseAsset: string; asOf: string;
213
+ rows: PerpDepthRow[];
214
+ /** Pro: every market's hourly snapshots over the last 7 days; empty for a preview. */
215
+ history: PerpDepthSnapshot[];
216
+ sources: { venue: string; lastOkAt: string | null; error: string | null }[];
217
+ notes: string[];
218
+ locked: boolean; access: "pro" | "preview";
219
+ }
@@ -46,8 +46,9 @@ const signinWallExperiment = createWallExperimentSession("wall_teaser_signin");
46
46
  const upgradeExperiment = createUpgradeExperimentSession();
47
47
  const WALL_VIEWS_SESSION_KEY = "gloomberb.wall-teaser.views";
48
48
 
49
- const ATTRIBUTION_STORAGE_KEY = "gloomberb.web.attribution";
50
- const ANONYMOUS_ID_STORAGE_KEY = "gloomberb.web.anonymous-id";
49
+ // The desktop app also keeps a copy of these two on disk (electrobun/view/view-ids.ts).
50
+ export const ATTRIBUTION_STORAGE_KEY = "gloomberb.web.attribution";
51
+ export const ANONYMOUS_ID_STORAGE_KEY = "gloomberb.web.anonymous-id";
51
52
  const HANDOFF_ID_KEY = "_gloom";
52
53
  const ATTRIBUTION_WINDOW_MS = 30 * 24 * 60 * 60 * 1000;
53
54
  /** Another device's clock may run slightly ahead; a touch from a minute in the future is still fresh. */
@@ -0,0 +1,85 @@
1
+ import type { CloudApiRequest } from "./request";
2
+
3
+ /**
4
+ * The public roadmap: what is being built, what is planned and what shipped,
5
+ * with the votes Pro members put on the first two. Anyone reads it; a signed-in
6
+ * Pro member votes once per item and can take the vote back.
7
+ */
8
+ const ROADMAP_STATUSES = ["building", "planned", "shipped"] as const;
9
+ export type RoadmapStatus = (typeof ROADMAP_STATUSES)[number];
10
+
11
+ export interface RoadmapItem {
12
+ id: string;
13
+ title: string;
14
+ /** One line on what it is. */
15
+ blurb: string;
16
+ status: RoadmapStatus;
17
+ /** ISO time it shipped; null until then. */
18
+ shippedAt: string | null;
19
+ votes: number;
20
+ /** Whether this account voted for it; false signed out. */
21
+ voted: boolean;
22
+ }
23
+
24
+ export interface RoadmapPayload {
25
+ items: RoadmapItem[];
26
+ /** The service's word on whether this session may vote (a verified Pro account). */
27
+ canVote: boolean;
28
+ }
29
+
30
+ export interface RoadmapVote {
31
+ id: string;
32
+ votes: number;
33
+ voted: boolean;
34
+ }
35
+
36
+ function isRecord(value: unknown): value is Record<string, unknown> {
37
+ return typeof value === "object" && value !== null && !Array.isArray(value);
38
+ }
39
+
40
+ function parseItem(value: unknown): RoadmapItem | null {
41
+ if (!isRecord(value)) return null;
42
+ const { id, title, blurb, status, shippedAt, votes, voted } = value;
43
+ if (typeof id !== "string" || !id || typeof title !== "string" || !title.trim()) return null;
44
+ if (!(ROADMAP_STATUSES as readonly unknown[]).includes(status)) return null;
45
+ return {
46
+ id,
47
+ title: title.trim(),
48
+ blurb: typeof blurb === "string" ? blurb.trim() : "",
49
+ status: status as RoadmapStatus,
50
+ shippedAt: typeof shippedAt === "string" && Number.isFinite(Date.parse(shippedAt)) ? shippedAt : null,
51
+ votes: typeof votes === "number" && Number.isFinite(votes) ? Math.max(0, Math.round(votes)) : 0,
52
+ voted: voted === true,
53
+ };
54
+ }
55
+
56
+ /** Items it cannot read (an unknown status from a newer service) are left out, not the whole list. */
57
+ function parseRoadmapPayload(value: unknown): RoadmapPayload {
58
+ if (!isRecord(value) || !Array.isArray(value.items)) throw new Error("The roadmap service returned invalid data.");
59
+ return {
60
+ items: value.items.map(parseItem).filter((item): item is RoadmapItem => item !== null),
61
+ canVote: value.canVote === true,
62
+ };
63
+ }
64
+
65
+ function parseVote(value: unknown): RoadmapVote {
66
+ if (!isRecord(value) || typeof value.id !== "string" || typeof value.votes !== "number" || typeof value.voted !== "boolean") {
67
+ throw new Error("The roadmap service returned invalid data.");
68
+ }
69
+ return { id: value.id, votes: value.votes, voted: value.voted };
70
+ }
71
+
72
+ export class CloudRoadmapApi {
73
+ constructor(private readonly request: CloudApiRequest) {}
74
+
75
+ async getRoadmap(signal?: AbortSignal): Promise<RoadmapPayload> {
76
+ return parseRoadmapPayload(await this.request<unknown>("/roadmap", { signal }));
77
+ }
78
+
79
+ /** Votes, or takes the vote back; the answer is the item's count after it. */
80
+ async setRoadmapVote(id: string, voted: boolean): Promise<RoadmapVote> {
81
+ return parseVote(await this.request<unknown>(`/roadmap/${encodeURIComponent(id)}/vote`, {
82
+ method: voted ? "POST" : "DELETE",
83
+ }));
84
+ }
85
+ }
@@ -1,3 +1,4 @@
1
+ import type { CompanyFrom } from "../types/company-from";
1
2
  import type {
2
3
  AnalystResearchData,
3
4
  CorporateActionsData,
@@ -518,10 +519,16 @@ export interface CloudEconEventPayload {
518
519
  source?: { name: string; url?: string };
519
520
  /**
520
521
  * The indicator this release is of, the same from one release to the next
521
- * (US CPI m/m on every month's row), where `id` names the one row. Absent
522
- * until Gloom Cloud names indicators; exports leave the column empty.
522
+ * (`us-unemployment-rate` on every month's row), where `id` names the one
523
+ * row. Absent from a server that names none; exports leave the column empty.
523
524
  */
524
525
  indicatorId?: string | null;
526
+ /**
527
+ * Where the forecast (the consensus) was read from, `week-feed` or
528
+ * `release-calendar`, and when that feed was read. Absent on a row with no
529
+ * forecast and on one kept before the read was recorded.
530
+ */
531
+ consensus?: { source: string; readAt: string } | null;
525
532
  }
526
533
 
527
534
  /** One currency's short-term rate, as GET /cloud/econ/short-rates serves it. */
@@ -891,6 +898,13 @@ export interface CloudEarningsCallPayload {
891
898
  * New York day). Absent from a server that predates it.
892
899
  */
893
900
  callTimeKnown?: boolean;
901
+ /**
902
+ * "other" for an event that is not an earnings call (a deal call, a
903
+ * conference, an investor day), named by eventLabel and with no fiscal
904
+ * period; null when unclear. Older servers omit both.
905
+ */
906
+ eventKind?: "earnings" | "other" | null;
907
+ eventLabel?: string | null;
894
908
  }
895
909
 
896
910
  interface CloudJobsSeriesPoint {
@@ -1047,6 +1061,8 @@ export interface CloudEarningsCallListPayload {
1047
1061
  pending?: boolean;
1048
1062
  /** Set when the requested symbol is not one the SEC knows. */
1049
1063
  unknownTicker?: boolean;
1064
+ /** The company's home line the calls are read from, when not the listing asked (a receipt, a foreign line). */
1065
+ companyFrom?: CompanyFrom;
1050
1066
  }
1051
1067
 
1052
1068
  /** One row of a proxy statement's Summary Compensation Table, in dollars. */
@@ -1255,6 +1271,13 @@ export interface CloudEarningsTranscriptPayload {
1255
1271
  companyName: string | null;
1256
1272
  fiscalYear: number | null;
1257
1273
  fiscalQuarter: number | null;
1274
+ /**
1275
+ * "other" for an event that is not an earnings call (a deal call, a
1276
+ * conference, an investor day), named by eventLabel and with no fiscal
1277
+ * period; null when unclear. Older servers omit both.
1278
+ */
1279
+ eventKind?: "earnings" | "other" | null;
1280
+ eventLabel?: string | null;
1258
1281
  callAt: string | null;
1259
1282
  timing: string | null;
1260
1283
  webcastUrl: string | null;
@@ -1436,6 +1459,8 @@ export interface CloudSecFilingsResponse {
1436
1459
  filings: CloudSecFilingPayload[];
1437
1460
  hasMore: boolean;
1438
1461
  nextOffset: number;
1462
+ /** The company's home line the filings are read from, when not the listing asked (a foreign line). */
1463
+ companyFrom?: CompanyFrom;
1439
1464
  }
1440
1465
 
1441
1466
  export interface CloudSecDocumentsResponse {
@@ -1536,6 +1561,15 @@ export interface CloudNewsPayload {
1536
1561
  export interface CloudNewsListResponse {
1537
1562
  items: CloudNewsPayload[];
1538
1563
  nextCursor: string | null;
1564
+ /** Which news the service answered with, when it says: the live wire, or the one held back for a free account. */
1565
+ access?: "realtime" | "delayed";
1566
+ /**
1567
+ * A search asked for its closest stories: `all` when stories have every
1568
+ * word, `closest` when none does and these have the most of them.
1569
+ */
1570
+ match?: "all" | "closest";
1571
+ /** A receipt's or foreign line's feed is its company's: the home line it reads, when not the listing asked. */
1572
+ companyFrom?: CompanyFrom;
1539
1573
  }
1540
1574
 
1541
1575
  interface CloudTweetUserPayload {
@@ -1739,6 +1773,14 @@ export interface CloudMarketScreenerItem extends CloudMoverSessionFields {
1739
1773
  exchange: string;
1740
1774
  lastUpdated: number;
1741
1775
  dataSource: "live";
1776
+ /** The listing's float as the equity screener serves it; absent where it serves none. */
1777
+ floatShares?: number;
1778
+ /** Set with a float the source states no measurement date for: `partial`. */
1779
+ floatSharesState?: "partial";
1780
+ /** Why the float is partial, as the server says it. */
1781
+ floatSharesReason?: string;
1782
+ /** When the statistics the float is read from were retrieved (ISO). */
1783
+ floatSharesRetrievedAt?: string;
1742
1784
  }
1743
1785
 
1744
1786
  export interface CloudMarketScreenerPayload {
@@ -1933,6 +1975,44 @@ export interface ScannerFlowHistoryPage {
1933
1975
  hasMore: boolean;
1934
1976
  }
1935
1977
 
1978
+ /**
1979
+ * Premium of a slice of the session's recorded prints by where it traded: at
1980
+ * or above the ask (bought) or at or below the bid (sold). Mid and unknown
1981
+ * prints count as neither.
1982
+ */
1983
+ interface ScannerFlowSidePremium {
1984
+ callAsk: number;
1985
+ callBid: number;
1986
+ putAsk: number;
1987
+ putBid: number;
1988
+ }
1989
+
1990
+ /** The session's prints in one time bucket, which starts at `at`. */
1991
+ export interface ScannerFlowSessionBucket extends ScannerFlowSidePremium {
1992
+ at: number;
1993
+ }
1994
+
1995
+ /** What one name printed at one expiry and strike during the session. */
1996
+ export interface ScannerFlowSessionStrike extends ScannerFlowSidePremium {
1997
+ expiry: string;
1998
+ strike: number;
1999
+ /** Every call print's premium, mid and unknown included. */
2000
+ callPremium: number;
2001
+ putPremium: number;
2002
+ prints: number;
2003
+ }
2004
+
2005
+ /** The latest session's recorded prints under the FLOW pane's filters, summed. */
2006
+ export interface ScannerFlowSession {
2007
+ /** The New York date of the session; null before any print was recorded. */
2008
+ session: string | null;
2009
+ bucketMs: number;
2010
+ /** Buckets with a matching print, oldest first. */
2011
+ buckets: ScannerFlowSessionBucket[];
2012
+ /** Only when one name was asked for: most premium first. */
2013
+ strikes: ScannerFlowSessionStrike[] | null;
2014
+ }
2015
+
1936
2016
  export type ScannerPayload = ScannerHiloPayload | ScannerFlowPayload;
1937
2017
 
1938
2018
  /** What a scanner subscriber receives: data, or the entitlement refusal. */
@@ -513,13 +513,17 @@ export function bindAppPanePluginRegistry({
513
513
  removeExternalPlugin(pluginId, directory);
514
514
  },
515
515
  contributions: (pluginId) => {
516
+ // An unlisted function (`listed: false`) and a pane only it opens are left out, as of every list.
517
+ const registered = pluginRegistry.getPluginPaneTemplateIds(pluginId)
518
+ .map((id) => ({ id, template: pluginRegistry.paneTemplates.get(id) }));
519
+ const listedPaneIds = new Set(registered.flatMap(({ template }) => template && template.listed !== false ? [template.paneId] : []));
520
+ const unlistedPaneIds = new Set(registered.flatMap(({ template }) => template?.listed === false && !listedPaneIds.has(template.paneId) ? [template.paneId] : []));
516
521
  const panes = pluginRegistry.getPluginPaneIds(pluginId)
522
+ .filter((id) => !unlistedPaneIds.has(id))
517
523
  .map((id) => ({ id, name: pluginRegistry.panes.get(id)?.name ?? id }));
518
- const templates = pluginRegistry.getPluginPaneTemplateIds(pluginId)
519
- .map((id) => {
520
- const template = pluginRegistry.paneTemplates.get(id);
521
- return { id, label: template?.label ?? id, ...(template?.shortcut?.prefix ? { prefix: template.shortcut.prefix } : {}) };
522
- });
524
+ const templates = registered
525
+ .filter(({ template }) => template?.listed !== false)
526
+ .map(({ id, template }) => ({ id, label: template?.label ?? id, ...(template?.shortcut?.prefix ? { prefix: template.shortcut.prefix } : {}) }));
523
527
  const commands = [...pluginRegistry.commands.entries()]
524
528
  .filter(([id]) => pluginRegistry.getCommandPluginId(id) === pluginId && !id.endsWith(":setup"))
525
529
  .map(([id, command]) => ({ id, label: command.label, ...(command.shortcut ? { shortcut: command.shortcut } : {}) }));
@@ -28,7 +28,6 @@ export interface AppBrokerImportRuntime {
28
28
  interface BrokerImportOptions {
29
29
  refreshImportedTickers?: boolean;
30
30
  config?: AppConfig;
31
- persistResolvedBrokerConfig?: boolean;
32
31
  signal?: AbortSignal;
33
32
  onCommitStart?: () => void;
34
33
  onCommitEnd?: () => void;
@@ -122,7 +121,6 @@ export function useBrokerImportRuntime({
122
121
  tickerRepository,
123
122
  existingTickers: tickerMap ?? new Map(stateRef.current.tickers),
124
123
  resources: pluginRegistry.persistence.resources,
125
- persistResolvedBrokerConfig: options?.persistResolvedBrokerConfig,
126
124
  signal: options?.signal,
127
125
  deferPersistence: true,
128
126
  });
@@ -10,6 +10,8 @@ import type { MarketDataCoordinator } from "../../market-data/coordinator";
10
10
  import { instrumentFromTicker } from "../../market-data/request-types";
11
11
  import type { PluginRegistry } from "../../plugins/registry";
12
12
  import { saveConfigImmediately } from "../../state/config-save-scheduler";
13
+ import { persistTickerCleanup } from "../../state/ticker-cleanup";
14
+ import { hasPendingTickerWrites } from "../../data/ticker-writes";
13
15
  import { settleWithin } from "../../utils/async-deadline";
14
16
  import type { AppAction, AppState } from "../../state/app/context";
15
17
  import type { AppConfig, BrokerInstanceConfig } from "../../types/config";
@@ -215,66 +217,81 @@ export function bindPluginRegistryRuntimeAccess({
215
217
  else removedPortfolioIds.add(portfolio.id);
216
218
  }
217
219
 
218
- const nextPortfolios = stateRef.current.config.portfolios.flatMap((portfolio) => {
219
- if (removedPortfolioIds.has(portfolio.id)) return [];
220
- const heirId = heirs.get(portfolio.id);
221
- return [heirId ? { ...portfolio, brokerInstanceId: heirId } : portfolio];
220
+ const removeProfile = (config: AppConfig): AppConfig => ({
221
+ ...config,
222
+ brokerInstances: config.brokerInstances.filter((entry) => entry.id !== instanceId),
223
+ portfolios: config.portfolios.flatMap((portfolio) => {
224
+ if (removedPortfolioIds.has(portfolio.id)) return [];
225
+ const heirId = heirs.get(portfolio.id);
226
+ return [heirId ? { ...portfolio, brokerInstanceId: heirId } : portfolio];
227
+ }),
222
228
  });
223
- const nextTickers = new Map(stateRef.current.tickers);
224
- const nextBrokerInstances = stateRef.current.config.brokerInstances.filter((entry) => entry.id !== instanceId);
225
- // What older removals and pulls from other devices left behind goes as well.
226
- const known = knownBrokerHoldings({ portfolios: nextPortfolios, brokerInstances: nextBrokerInstances });
227
229
 
228
- for (const ticker of stateRef.current.tickers.values()) {
229
- // A position here without a profile came from another device's sync of this one.
230
- const nextPositions = ticker.metadata.positions.filter((position) => position.brokerInstanceId !== instanceId
231
- && !(removedPortfolioIds.has(position.portfolio) && !position.brokerInstanceId));
232
- const heldPortfolioIds = new Set(nextPositions.map((position) => position.portfolio));
233
- const nextPortfolioRefs = ticker.metadata.portfolios.filter((portfolioId) =>
234
- !removedPortfolioIds.has(portfolioId) && (!heirs.has(portfolioId) || heldPortfolioIds.has(portfolioId)));
235
- const nextBrokerContracts = (ticker.metadata.broker_contracts ?? []).filter((contract) => contract.brokerInstanceId !== instanceId);
236
-
237
- const removedTicker: TickerRecord = {
238
- ...ticker,
239
- metadata: {
240
- ...ticker.metadata,
241
- positions: nextPositions,
242
- portfolios: nextPortfolioRefs,
243
- broker_contracts: nextBrokerContracts,
244
- },
245
- };
246
- const nextTicker = clearLeftoverBrokerHoldings(removedTicker, known) ?? removedTicker;
247
-
248
- const shouldDeleteTicker =
249
- nextTicker.metadata.positions.length === 0
250
- && nextTicker.metadata.portfolios.length === 0
251
- && nextTicker.metadata.watchlists.length === 0
252
- && (nextTicker.metadata.broker_contracts ?? []).length === 0
253
- && nextTicker.metadata.tags.length === 0
254
- && Object.keys(nextTicker.metadata.custom).length === 0;
230
+ const cleanTickers = () => persistTickerCleanup({
231
+ tickerRepository,
232
+ getTickers: () => stateRef.current.tickers,
233
+ transform: (ticker) => {
234
+ // A position without a profile came from another device's sync of this one.
235
+ const nextPositions = ticker.metadata.positions.filter((position) => position.brokerInstanceId !== instanceId
236
+ && !(removedPortfolioIds.has(position.portfolio) && !position.brokerInstanceId));
237
+ const heldPortfolioIds = new Set(nextPositions.map((position) => position.portfolio));
238
+ const nextPortfolioRefs = ticker.metadata.portfolios.filter((portfolioId) =>
239
+ !removedPortfolioIds.has(portfolioId) && (!heirs.has(portfolioId) || heldPortfolioIds.has(portfolioId)));
240
+ const nextBrokerContracts = (ticker.metadata.broker_contracts ?? []).filter((contract) => contract.brokerInstanceId !== instanceId);
241
+ const changed = nextPositions.length !== ticker.metadata.positions.length
242
+ || nextPortfolioRefs.length !== ticker.metadata.portfolios.length
243
+ || nextBrokerContracts.length !== (ticker.metadata.broker_contracts ?? []).length;
244
+ const removedTicker: TickerRecord = changed ? {
245
+ ...ticker,
246
+ metadata: {
247
+ ...ticker.metadata,
248
+ positions: nextPositions,
249
+ portfolios: nextPortfolioRefs,
250
+ broker_contracts: nextBrokerContracts,
251
+ },
252
+ } : ticker;
253
+ // Also clear holdings left behind by older removals or pulls.
254
+ const known = knownBrokerHoldings(removeProfile(stateRef.current.config));
255
+ const nextTicker = clearLeftoverBrokerHoldings(removedTicker, known) ?? removedTicker;
256
+ if (nextTicker === ticker) return ticker;
257
+ const empty = nextTicker.metadata.positions.length === 0
258
+ && nextTicker.metadata.portfolios.length === 0
259
+ && nextTicker.metadata.watchlists.length === 0
260
+ && (nextTicker.metadata.broker_contracts ?? []).length === 0
261
+ && nextTicker.metadata.tags.length === 0
262
+ && Object.keys(nextTicker.metadata.custom).length === 0;
263
+ return empty ? null : nextTicker;
264
+ },
265
+ publish: (symbol, ticker) => {
266
+ if (ticker) dispatch({ type: "UPDATE_TICKER", ticker });
267
+ else {
268
+ dispatch({ type: "REMOVE_TICKER", symbol });
269
+ pluginRegistry.events.emit("ticker:removed", { symbol });
270
+ }
271
+ },
272
+ });
255
273
 
256
- if (shouldDeleteTicker) {
257
- nextTickers.delete(ticker.metadata.ticker);
258
- await tickerRepository.deleteTicker(ticker.metadata.ticker);
259
- dispatch({ type: "REMOVE_TICKER", symbol: ticker.metadata.ticker });
260
- pluginRegistry.events.emit("ticker:removed", { symbol: ticker.metadata.ticker });
261
- } else {
262
- await tickerRepository.saveTicker(nextTicker);
263
- nextTickers.set(nextTicker.metadata.ticker, nextTicker);
264
- dispatch({ type: "UPDATE_TICKER", ticker: nextTicker });
265
- }
274
+ // Keep the profile available for retry until cleanup and config both
275
+ // succeed. Rebase after callbacks and edits, including during config saves.
276
+ let savedRemoval = false;
277
+ for (;;) {
278
+ const cleaned = await cleanTickers().catch(async (error: unknown) => {
279
+ // A config acknowledgement can precede a late row write. If that
280
+ // cleanup fails, keep its removal intent durable for a restart too.
281
+ if (savedRemoval) await saveConfigImmediately(stateRef.current.config);
282
+ throw error;
283
+ });
284
+ if (hasPendingTickerWrites(tickerRepository) || stateRef.current.tickers !== cleaned) continue;
285
+ const source = stateRef.current.config;
286
+ const nextConfig = removeProfile(source);
287
+ await saveConfigImmediately(nextConfig);
288
+ savedRemoval = true;
289
+ if (stateRef.current.config !== source || stateRef.current.tickers !== cleaned
290
+ || hasPendingTickerWrites(tickerRepository)) continue;
291
+ dispatch({ type: "SET_CONFIG", config: nextConfig });
292
+ pluginRegistry.events.emit("config:changed", { config: nextConfig });
293
+ break;
266
294
  }
267
-
268
- const nextConfig = {
269
- ...stateRef.current.config,
270
- brokerInstances: nextBrokerInstances,
271
- portfolios: nextPortfolios,
272
- };
273
-
274
- dispatch({ type: "SET_CONFIG", config: nextConfig });
275
- dispatch({ type: "SET_TICKERS", tickers: nextTickers });
276
- await saveConfigImmediately(nextConfig);
277
- pluginRegistry.events.emit("config:changed", { config: nextConfig });
278
295
  // The profile that kept a portfolio fills in what the removed one held there.
279
296
  for (const heirId of new Set(heirs.values())) {
280
297
  void importBrokerPositions(heirId).catch(logFailure("app.runtime.plugin-bindings", "Replacement broker positions import failed"));
@@ -9,7 +9,7 @@
9
9
  "src/cli/commands/options-chain.ts": ["options","options-calculator"],
10
10
  "src/cli/commands/options-leaps.ts": ["iv-history","options","vol-surface"],
11
11
  "src/cli/commands/overview.ts": ["correlation","econ","market-movers","sectors","world-indices"],
12
- "src/cli/commands/ticker.ts": ["notes"],
12
+ "src/cli/commands/ticker.ts": ["ipo-calendar","notes"],
13
13
  "src/cli/desktop-pane-shot.ts": ["market-valuation","time-sales"],
14
14
  "src/cli/pane-functions/data.ts": ["chart-composer","correlation","seasonality","ticker-detail"],
15
15
  "src/cli/pane-functions/financial-ratio-shot.ts": ["ticker-detail"],
@@ -27,7 +27,7 @@
27
27
  "src/components/layout/shell/index.tsx": ["cloud"],
28
28
  "src/components/onboarding/use-onboarding-upgrade.ts": ["chat"],
29
29
  "src/layout/desks.ts": ["chart-composer"],
30
- "src/plugins/catalog-browser.ts": ["alerts","analytics","attention","awards","backtest","bond-calculator","catalysts","cds","central-bank-rates","changelog","chart-composer","clinical-trials","cloud","comment-letters","commodities-energy","commodity-balances","company-attention","company-kpis","connections","correlation","cot","cpi","credit-boards","credit-conditions","credit-documents","crypto-board","crypto-etf-flows","debt-maturities","dividend-yield","docs","doe","earnings","earnings-calls","earnings-ripple","econ","econ-statistics","equity-screener","estimate-revisions","executives","exposure","fear-greed","filing-events","fixed-income","futures","futures-curve","fx-matrix","gpu","help","holders","insider","ipo-calendar","iv-history","jobs","jodi","kelly-sizer","layout-manager","macro-day","market-halts","market-heatmap","market-valuation","members","mna","money-markets","news","openfda","options","options-calculator","options-positioning","options-scenario","pe-band","perps","portfolio-list","power","primary-dealers","rate-path","realized-vol","relative-rotation","research","research-search","revenue-breakdown","reverse-dcf","risk-factors","scanner","seasonality","sec","sectors","short-interest","short-volume","social-mentions","supply-chain","thirteenf","ticker-detail","time-sales","trace-bonds","treasury-auctions","treasury-daily","vol-surface","volatility","world-indices","world-venue-map","yield-curve"],
30
+ "src/plugins/catalog-browser.ts": ["alerts","analytics","attention","awards","backtest","bond-calculator","catalysts","cds","central-bank-rates","changelog","chart-composer","clinical-trials","cloud","comment-letters","commodities-energy","commodity-balances","company-attention","company-kpis","connections","correlation","cot","cpi","credit-boards","credit-conditions","credit-documents","crypto-board","crypto-etf-flows","debt-maturities","dividend-yield","docs","doe","earnings","earnings-calls","earnings-ripple","econ","econ-statistics","equity-screener","estimate-revisions","executives","exposure","fear-greed","filing-events","fixed-income","futures","futures-curve","fx-matrix","gpu","help","holders","insider","ipo-calendar","iv-history","jobs","jodi","kelly-sizer","layout-manager","macro-day","market-halts","market-heatmap","market-valuation","members","mna","money-markets","news","openfda","options","options-calculator","options-positioning","options-scenario","pe-band","perps","portfolio-list","power","primary-dealers","rate-path","realized-vol","relative-rotation","research","research-search","revenue-breakdown","reverse-dcf","risk-factors","roadmap","scanner","seasonality","sec","sectors","short-interest","short-volume","social-mentions","supply-chain","thirteenf","ticker-detail","time-sales","trace-bonds","treasury-auctions","treasury-daily","vol-surface","volatility","world-indices","world-venue-map","yield-curve"],
31
31
  "src/plugins/catalog-ui.ts": ["alerts","clinical-trials","cloud","comment-letters","custom-view","fear-greed","ipo-calendar","market-halts","market-heatmap","members","news","notes","openfda","research-search"],
32
32
  "src/plugins/catalog.ts": ["debug"],
33
33
  "src/remote/controller.ts": ["custom-view"],