gloomberb 0.18.3 → 0.18.4

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 (886) hide show
  1. package/README.md +8 -8
  2. package/README.zh-CN.md +11 -11
  3. package/bin/{gloomberb → gloom} +3 -1
  4. package/package.json +6 -2
  5. package/src/account/checkout-handoff.tsx +225 -0
  6. package/src/account/device-signin-dialog.tsx +2 -2
  7. package/src/account/device-signin.ts +2 -2
  8. package/src/account/upgrade-dialog.tsx +1 -1
  9. package/src/api-client/askg.ts +2 -2
  10. package/src/api-client/auth.ts +2 -2
  11. package/src/api-client/central-bank-rates.ts +6 -0
  12. package/src/api-client/collections.ts +5 -1
  13. package/src/api-client/cot.ts +2 -0
  14. package/src/api-client/crypto-etf-flows.ts +37 -0
  15. package/src/api-client/crypto-markets.ts +60 -0
  16. package/src/api-client/data.ts +84 -5
  17. package/src/api-client/doe.ts +15 -0
  18. package/src/api-client/equity-screener.ts +28 -0
  19. package/src/api-client/exchange-announcements.ts +38 -0
  20. package/src/api-client/fund-facts.ts +39 -0
  21. package/src/api-client/futures-curve.ts +9 -1
  22. package/src/api-client/hiring.ts +301 -0
  23. package/src/api-client/index.ts +22 -5
  24. package/src/api-client/market-discovery.ts +14 -0
  25. package/src/api-client/members.ts +6 -0
  26. package/src/api-client/mna.ts +6 -0
  27. package/src/api-client/paths.ts +18 -1
  28. package/src/api-client/request.ts +21 -4
  29. package/src/api-client/short-side-publications.ts +37 -0
  30. package/src/api-client/socket.ts +64 -4
  31. package/src/api-client/swap-curve.ts +35 -0
  32. package/src/api-client/themes.ts +7 -1
  33. package/src/api-client/types.ts +90 -2
  34. package/src/app/pane-runtime/plugin-bindings.ts +9 -2
  35. package/src/app/runtime/desktop-deeplink.ts +5 -5
  36. package/src/app/runtime/plugin-bindings.ts +2 -2
  37. package/src/app/runtime/startup.ts +13 -0
  38. package/src/app/star-prompt/status-line.tsx +2 -2
  39. package/src/architecture/core-builtin-allowlist.json +5 -2
  40. package/src/architecture/ui-literals-allowlist.json +3 -3
  41. package/src/architecture/ui-tokens-allowlist.json +1 -1
  42. package/src/brokers/broker-portfolio-sync.ts +37 -0
  43. package/src/brokers/directory.ts +11 -0
  44. package/src/brokers/logos.ts +3 -1
  45. package/src/brokers/signed-in/adapter.ts +304 -26
  46. package/src/brokers/signed-in/client.ts +14 -2
  47. package/src/brokers/signed-in/connect.ts +10 -2
  48. package/src/brokers/sync-broker-instance.ts +9 -1
  49. package/src/capabilities/chart-series.ts +22 -6
  50. package/src/cli/bank-section.ts +1 -1
  51. package/src/cli/base-converter.ts +23 -14
  52. package/src/cli/central-bank-events.ts +1 -1
  53. package/src/cli/command-options.ts +59 -4
  54. package/src/cli/commands/api.ts +9 -6
  55. package/src/cli/commands/broker.ts +2 -2
  56. package/src/cli/commands/command-utils.ts +2 -2
  57. package/src/cli/commands/crypto-hints.ts +7 -20
  58. package/src/cli/commands/fred-series.ts +4 -2
  59. package/src/cli/commands/keybindings.ts +2 -2
  60. package/src/cli/commands/market.ts +1117 -264
  61. package/src/cli/commands/news-hints.ts +2 -2
  62. package/src/cli/commands/news-search.ts +59 -6
  63. package/src/cli/commands/options-leaps.ts +41 -26
  64. package/src/cli/commands/overview.ts +121 -48
  65. package/src/cli/commands/plugins.ts +9 -9
  66. package/src/cli/commands/remote.ts +13 -10
  67. package/src/cli/commands/search.ts +64 -44
  68. package/src/cli/commands/system.ts +27 -19
  69. package/src/cli/commands/themes.ts +1 -1
  70. package/src/cli/commands/ticker.ts +192 -47
  71. package/src/cli/context.ts +3 -2
  72. package/src/cli/desktop-pane-shot-view.ts +2 -2
  73. package/src/cli/desktop-pane-shot.ts +1 -1
  74. package/src/cli/earnings-calendar.ts +4 -4
  75. package/src/cli/entry.ts +18 -1
  76. package/src/cli/errors.ts +20 -2
  77. package/src/cli/exit-codes.ts +1 -1
  78. package/src/cli/export-source.ts +10 -4
  79. package/src/cli/freshness.ts +2 -8
  80. package/src/cli/fx-forward.ts +130 -0
  81. package/src/cli/fx-pair.ts +10 -9
  82. package/src/cli/glossary.ts +64 -20
  83. package/src/cli/help.ts +19 -13
  84. package/src/cli/history-export.ts +126 -0
  85. package/src/cli/history-rows.ts +196 -43
  86. package/src/cli/index-roots.ts +5 -45
  87. package/src/cli/index.ts +24 -18
  88. package/src/cli/known-gaps.ts +118 -25
  89. package/src/cli/listing-arg.ts +300 -41
  90. package/src/cli/name-entries.ts +30 -18
  91. package/src/cli/native-smoke.ts +2 -0
  92. package/src/cli/not-a-ticker.ts +19 -9
  93. package/src/cli/opentui-libc.ts +5 -0
  94. package/src/cli/options.ts +12 -0
  95. package/src/cli/pane-functions/capabilities.ts +75 -20
  96. package/src/cli/pane-functions/catalog.ts +24 -23
  97. package/src/cli/pane-functions/discovery.ts +1 -1
  98. package/src/cli/pane-functions/dom.ts +10 -7
  99. package/src/cli/pane-functions/financial-ratio-shot.ts +2 -2
  100. package/src/cli/pane-functions/freshness.ts +174 -23
  101. package/src/cli/pane-functions/function-help.ts +66 -27
  102. package/src/cli/pane-functions/headless.ts +24 -11
  103. package/src/cli/pane-functions/index.ts +18 -16
  104. package/src/cli/pane-functions/options.ts +22 -2
  105. package/src/cli/pane-functions/report-notices.ts +12 -4
  106. package/src/cli/pane-functions/report.ts +5 -5
  107. package/src/cli/pane-functions/resolver.ts +47 -10
  108. package/src/cli/pane-functions/screenshot-assessment.ts +322 -0
  109. package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
  110. package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
  111. package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
  112. package/src/cli/pane-functions/screenshot-evidence.ts +1 -1
  113. package/src/cli/pane-functions/screenshot-payload.ts +453 -0
  114. package/src/cli/pane-functions/screenshot-render.ts +316 -0
  115. package/src/cli/pane-functions/screenshot-types.ts +162 -0
  116. package/src/cli/pane-functions/shot-options.ts +8 -3
  117. package/src/cli/peso-dollar-rates.ts +79 -0
  118. package/src/cli/quote-answer.ts +38 -3
  119. package/src/cli/report-tables.ts +61 -16
  120. package/src/cli/restore-plugins.ts +29 -14
  121. package/src/cli/result.ts +111 -22
  122. package/src/cli/series-search.ts +5 -5
  123. package/src/cli/statement-filings.ts +19 -0
  124. package/src/cli/suffixed-listing-rows.ts +49 -0
  125. package/src/cli/symbol-args.ts +50 -15
  126. package/src/cli/symbol-cells.ts +120 -0
  127. package/src/cli/symbol-list.ts +198 -68
  128. package/src/cli/symbol-rows.ts +131 -25
  129. package/src/cli/ticker-resolution.ts +108 -11
  130. package/src/cli/treasury-yields.ts +5 -5
  131. package/src/cli/types.ts +2 -0
  132. package/src/cli/uncovered-instrument.ts +3 -3
  133. package/src/cli/unknown-command.ts +6 -6
  134. package/src/components/chart/composite/chart-layout.ts +131 -0
  135. package/src/components/chart/composite/composite-chart.tsx +373 -16
  136. package/src/components/chart/composite/interactions.ts +7 -2
  137. package/src/components/chart/composite/legend.tsx +75 -3
  138. package/src/components/chart/composite/levels.ts +5 -0
  139. package/src/components/chart/composite/panel-gestures.ts +41 -0
  140. package/src/components/chart/composite/panel-labels.ts +2 -1
  141. package/src/components/chart/composite/panel-surface.tsx +305 -11
  142. package/src/components/chart/composite/price-axis-labels.tsx +27 -3
  143. package/src/components/chart/composite/rasterizer.ts +44 -19
  144. package/src/components/chart/composite/scene.ts +16 -4
  145. package/src/components/chart/composite/text-renderer.ts +48 -21
  146. package/src/components/chart/composite/toolbar.tsx +52 -5
  147. package/src/components/chart/composite/types.ts +13 -0
  148. package/src/components/chart/composite/use-composite-chart-keyboard.ts +120 -13
  149. package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
  150. package/src/components/chart/composite/use-composite-viewport.ts +12 -3
  151. package/src/components/chart/composite/value-scale.ts +149 -0
  152. package/src/components/chart/composite/volume-profile-paint.ts +6 -3
  153. package/src/components/chart/core/pointer.ts +2 -0
  154. package/src/components/chart-table/index.ts +2 -0
  155. package/src/components/chart-table/read.tsx +74 -0
  156. package/src/components/command-bar/commands/collection-list.ts +41 -19
  157. package/src/components/command-bar/commands/collection.ts +9 -3
  158. package/src/components/command-bar/commands/direct/index.ts +1 -1
  159. package/src/components/command-bar/commands/direct/runtime.ts +3 -2
  160. package/src/components/command-bar/pane-templates/items.ts +59 -6
  161. package/src/components/command-bar/pane-templates/workflow.ts +10 -1
  162. package/src/components/command-bar/routes/root/plugin-install.ts +1 -1
  163. package/src/components/command-bar/routes/root/provider-search.ts +42 -11
  164. package/src/components/command-bar/routes/root/results.ts +18 -4
  165. package/src/components/command-bar/routes/root/runtime.ts +15 -3
  166. package/src/components/command-bar/routes/root/search-providers.ts +25 -2
  167. package/src/components/command-bar/routes/root/selection.ts +6 -1
  168. package/src/components/command-bar/routes/root/shortcut-feedback.ts +4 -1
  169. package/src/components/command-bar/routes/root/shortcuts.ts +30 -3
  170. package/src/components/command-bar/routes/ticker-search/results.ts +73 -4
  171. package/src/components/command-bar/selection-runtime.ts +50 -10
  172. package/src/components/command-bar/surface/index.tsx +24 -2
  173. package/src/components/command-bar/view-model.ts +7 -0
  174. package/src/components/command-bar/workflow/broker.ts +2 -2
  175. package/src/components/command-bar/workflow/collection-actions.ts +46 -7
  176. package/src/components/command-bar/workflow/collection-ticker.ts +32 -4
  177. package/src/components/command-bar/workflow/fields.ts +8 -2
  178. package/src/components/command-bar/workflow/ops.ts +18 -4
  179. package/src/components/command-bar/workflow/portfolio-position.ts +53 -4
  180. package/src/components/command-bar/workflow/submit.ts +3 -2
  181. package/src/components/command-bar/workflow/tickers.ts +5 -1
  182. package/src/components/company-logo.tsx +39 -0
  183. package/src/components/data-table/sections.ts +4 -2
  184. package/src/components/form-modal/confirm.tsx +2 -1
  185. package/src/components/form-modal/request.ts +5 -0
  186. package/src/components/form-modal/routes.ts +4 -1
  187. package/src/components/index.ts +12 -6
  188. package/src/components/layout/header.tsx +7 -6
  189. package/src/components/layout/market-summary.ts +9 -6
  190. package/src/components/layout/pane/capture-status.ts +1 -1
  191. package/src/components/layout/pane/footer/model.ts +11 -5
  192. package/src/components/layout/shell/chrome.ts +19 -6
  193. package/src/components/layout/shell/index.tsx +2 -1
  194. package/src/components/layout/shell/pane/layers.tsx +19 -1
  195. package/src/components/layout/status-bar.tsx +2 -2
  196. package/src/components/market-board/index.tsx +11 -3
  197. package/src/components/onboarding/onboarding-wizard.tsx +1 -0
  198. package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +2 -2
  199. package/src/components/onboarding/wizard-broker-sync.ts +4 -1
  200. package/src/components/pane-settings-dialog/desktop.tsx +20 -7
  201. package/src/components/pane-settings-dialog/tui.tsx +17 -9
  202. package/src/components/pane-settings-dialog/value.ts +8 -1
  203. package/src/components/pane-settings-dialog.tsx +44 -13
  204. package/src/components/sign-in-code-panel.tsx +27 -19
  205. package/src/components/ui/column-grid.tsx +48 -4
  206. package/src/components/ui/country-flag-art.tsx +180 -0
  207. package/src/components/ui/country-flag.tsx +118 -12
  208. package/src/components/ui/data-table/opentui/index.tsx +61 -2
  209. package/src/components/ui/data-table/opentui/model.ts +109 -2
  210. package/src/components/ui/data-table/types.ts +1 -1
  211. package/src/components/ui/display.tsx +5 -1
  212. package/src/components/ui/index.ts +3 -1
  213. package/src/components/ui/logo-mark.tsx +11 -2
  214. package/src/components/ui/query-bar.tsx +1 -1
  215. package/src/components/ui/row-notes.ts +79 -0
  216. package/src/core/state/app/layout.ts +4 -4
  217. package/src/data/cached-query.ts +8 -1
  218. package/src/data/config/chart-settings.ts +3 -3
  219. package/src/data/config/home.ts +10 -2
  220. package/src/data/config/layout.ts +4 -1
  221. package/src/data/config/store/node.ts +4 -0
  222. package/src/data/config/store/normalize.ts +13 -3
  223. package/src/data/config/store/portfolio-as-of-column.ts +2 -2
  224. package/src/data/json-storage.ts +2 -0
  225. package/src/data/saved-copies.ts +84 -0
  226. package/src/docs/snapshot.json +65 -32
  227. package/src/i18n/es.ts +29 -12
  228. package/src/i18n/ja.ts +29 -12
  229. package/src/i18n/ko.ts +29 -12
  230. package/src/i18n/zh-cn.ts +29 -12
  231. package/src/i18n/zh-tw.ts +29 -12
  232. package/src/layout/desks.ts +1 -1
  233. package/src/layout/launch-layout.ts +1 -1
  234. package/src/layout/pane-manager/floating-actions.ts +5 -3
  235. package/src/layout/pane-manager/floating.ts +43 -1
  236. package/src/layout/pane-manager/index.ts +2 -0
  237. package/src/layout/selected-ticker.ts +74 -0
  238. package/src/market-data/depositary-pair.ts +251 -0
  239. package/src/market-data/futures-board.ts +1 -1
  240. package/src/market-data/futures-contract.ts +124 -40
  241. package/src/market-data/fx-closes.ts +17 -2
  242. package/src/market-data/hooks.tsx +19 -11
  243. package/src/market-data/market/change-basis.ts +49 -7
  244. package/src/market-data/market/freshness.ts +34 -5
  245. package/src/market-data/market/period-return.ts +163 -0
  246. package/src/market-data/market/trading-sessions.ts +13 -0
  247. package/src/market-data/market/year-to-date.ts +8 -13
  248. package/src/market-data/performance.ts +20 -14
  249. package/src/market-data/perpetual-premium.ts +32 -0
  250. package/src/market-data/published-apac-sessions.ts +2 -1
  251. package/src/market-data/published-futures-sessions.ts +69 -0
  252. package/src/market-data/quotes/contributions.ts +5 -1
  253. package/src/market-data/quotes/freshness.ts +42 -0
  254. package/src/market-data/quotes/intraday-bar.ts +37 -0
  255. package/src/market-data/quotes/regular-session-valuation.ts +13 -8
  256. package/src/market-data/quotes/resolution.ts +4 -2
  257. package/src/market-data/tax-equivalent.ts +1 -1
  258. package/src/market-data/ticker-price-returns.ts +3 -1
  259. package/src/news/aggregator.ts +5 -1
  260. package/src/news/news-model.ts +4 -0
  261. package/src/news/types.ts +11 -0
  262. package/src/notifications/app-notifier.ts +1 -1
  263. package/src/plugins/auto-update.ts +2 -2
  264. package/src/plugins/builtin/account-management/index.tsx +1 -0
  265. package/src/plugins/builtin/account-management/pane.tsx +9 -8
  266. package/src/plugins/builtin/alerts/alert-engine.ts +29 -19
  267. package/src/plugins/builtin/alerts/calendar-events.ts +378 -0
  268. package/src/plugins/builtin/alerts/cli.ts +485 -76
  269. package/src/plugins/builtin/alerts/command.ts +5 -10
  270. package/src/plugins/builtin/alerts/event-rows.ts +9 -5
  271. package/src/plugins/builtin/alerts/events-pane.tsx +71 -56
  272. package/src/plugins/builtin/alerts/events.ts +107 -5
  273. package/src/plugins/builtin/alerts/fired-log.ts +78 -0
  274. package/src/plugins/builtin/alerts/format.ts +2 -1
  275. package/src/plugins/builtin/alerts/headless.ts +100 -39
  276. package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
  277. package/src/plugins/builtin/alerts/history-rows.ts +89 -0
  278. package/src/plugins/builtin/alerts/index.tsx +45 -18
  279. package/src/plugins/builtin/alerts/iv-level.ts +365 -0
  280. package/src/plugins/builtin/alerts/levels.ts +3 -3
  281. package/src/plugins/builtin/alerts/pane.tsx +97 -29
  282. package/src/plugins/builtin/alerts/price.ts +35 -0
  283. package/src/plugins/builtin/alerts/quotes.ts +24 -0
  284. package/src/plugins/builtin/alerts/research-builder.ts +84 -11
  285. package/src/plugins/builtin/alerts/research-rules.ts +76 -3
  286. package/src/plugins/builtin/alerts/scheduled-check.ts +206 -32
  287. package/src/plugins/builtin/alerts/scheduled-sources.ts +26 -3
  288. package/src/plugins/builtin/alerts/scheduled.ts +188 -29
  289. package/src/plugins/builtin/alerts/storage.ts +13 -10
  290. package/src/plugins/builtin/alerts/targets.ts +12 -3
  291. package/src/plugins/builtin/analytics/index.tsx +8 -2
  292. package/src/plugins/builtin/analytics/metrics.ts +1 -1
  293. package/src/plugins/builtin/analytics/risk-book.ts +215 -0
  294. package/src/plugins/builtin/analytics/risk-client.ts +13 -6
  295. package/src/plugins/builtin/analytics/risk-headless.ts +55 -21
  296. package/src/plugins/builtin/analytics/risk-math.ts +6 -3
  297. package/src/plugins/builtin/analytics/risk-model.ts +297 -104
  298. package/src/plugins/builtin/analytics/risk-options.ts +17 -2
  299. package/src/plugins/builtin/analytics/risk-pane.tsx +97 -36
  300. package/src/plugins/builtin/attention/pane.tsx +6 -2
  301. package/src/plugins/builtin/awards/headless.ts +7 -3
  302. package/src/plugins/builtin/awards/model.ts +18 -0
  303. package/src/plugins/builtin/awards/pane.tsx +6 -3
  304. package/src/plugins/builtin/backtest/headless.ts +3 -3
  305. package/src/plugins/builtin/backtest/rules.ts +41 -5
  306. package/src/plugins/builtin/broker-manager/add-flow.tsx +12 -7
  307. package/src/plugins/builtin/broker-manager/detail.tsx +47 -19
  308. package/src/plugins/builtin/broker-manager/footer.ts +27 -11
  309. package/src/plugins/builtin/broker-manager/index.tsx +21 -12
  310. package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
  311. package/src/plugins/builtin/broker-manager/model.ts +12 -2
  312. package/src/plugins/builtin/broker-manager/pane-actions.tsx +183 -57
  313. package/src/plugins/builtin/broker-manager/table.ts +28 -12
  314. package/src/plugins/builtin/broker-trading/account-picker.tsx +2 -1
  315. package/src/plugins/builtin/broker-trading/chart-levels.ts +82 -13
  316. package/src/plugins/builtin/broker-trading/controller.ts +45 -13
  317. package/src/plugins/builtin/broker-trading/dock.tsx +22 -4
  318. package/src/plugins/builtin/broker-trading/headless.ts +2 -1
  319. package/src/plugins/builtin/broker-trading/index.tsx +7 -1
  320. package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
  321. package/src/plugins/builtin/broker-trading/order-feed.ts +75 -7
  322. package/src/plugins/builtin/broker-trading/orders.tsx +109 -31
  323. package/src/plugins/builtin/broker-trading/overview-orders.tsx +9 -3
  324. package/src/plugins/builtin/broker-trading/pane-model.ts +30 -2
  325. package/src/plugins/builtin/broker-trading/pane.tsx +110 -23
  326. package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
  327. package/src/plugins/builtin/broker-trading/ticket.tsx +112 -31
  328. package/src/plugins/builtin/buildout/cells.tsx +4 -0
  329. package/src/plugins/builtin/buildout/detail/index.tsx +5 -1
  330. package/src/plugins/builtin/buildout/detail/ui.tsx +7 -4
  331. package/src/plugins/builtin/buildout/pane/index.tsx +25 -12
  332. package/src/plugins/builtin/buildout/pane/status.tsx +0 -4
  333. package/src/plugins/builtin/builtin-plugin-meta.ts +1 -1
  334. package/src/plugins/builtin/catalysts/detail.tsx +3 -2
  335. package/src/plugins/builtin/catalysts/index.tsx +1 -1
  336. package/src/plugins/builtin/catalysts/model.ts +49 -4
  337. package/src/plugins/builtin/catalysts/pane.tsx +6 -8
  338. package/src/plugins/builtin/central-bank-rates/client.ts +5 -0
  339. package/src/plugins/builtin/central-bank-rates/headless.ts +36 -10
  340. package/src/plugins/builtin/central-bank-rates/model.ts +33 -8
  341. package/src/plugins/builtin/changelog/index.tsx +1 -0
  342. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +1 -0
  343. package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +2 -1
  344. package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
  345. package/src/plugins/builtin/chart-composer/cli-options.ts +2 -5
  346. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +2 -1
  347. package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -0
  348. package/src/plugins/builtin/chart-composer/editor.tsx +4 -1
  349. package/src/plugins/builtin/chart-composer/headless-schema.ts +28 -26
  350. package/src/plugins/builtin/chart-composer/headless.ts +253 -35
  351. package/src/plugins/builtin/chart-composer/index.tsx +12 -2
  352. package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
  353. package/src/plugins/builtin/chart-composer/pane.tsx +127 -28
  354. package/src/plugins/builtin/chart-composer/series-catalog.ts +1 -0
  355. package/src/plugins/builtin/chart-composer/series-expression.ts +65 -6
  356. package/src/plugins/builtin/chart-composer/session-history.ts +15 -21
  357. package/src/plugins/builtin/chart-composer/session-range.ts +4 -2
  358. package/src/plugins/builtin/chart-composer/settings.ts +31 -19
  359. package/src/plugins/builtin/chart-composer/use-series-catalog.ts +5 -6
  360. package/src/plugins/builtin/chart-composer/viewport-labels.ts +18 -8
  361. package/src/plugins/builtin/chat/attachments/model.ts +3 -1
  362. package/src/plugins/builtin/chat/content/index.tsx +1 -1
  363. package/src/plugins/builtin/chat/pane-links/open.ts +1 -1
  364. package/src/plugins/builtin/chat/people.ts +1 -1
  365. package/src/plugins/builtin/clinical-trials/client.ts +5 -2
  366. package/src/plugins/builtin/clinical-trials/model.ts +13 -4
  367. package/src/plugins/builtin/clinical-trials/pane.tsx +32 -12
  368. package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +17 -0
  369. package/src/plugins/builtin/cloud/askg/controller.ts +1 -1
  370. package/src/plugins/builtin/cloud/askg/lock-note.ts +1 -1
  371. package/src/plugins/builtin/cloud/askg/tool-display.ts +1 -1
  372. package/src/plugins/builtin/cloud/auth-commands.ts +3 -3
  373. package/src/plugins/builtin/cloud/team/pane-sections.tsx +105 -47
  374. package/src/plugins/builtin/cloud/team/pane-ui.tsx +42 -4
  375. package/src/plugins/builtin/cloud/team/pane.tsx +204 -64
  376. package/src/plugins/builtin/cloud/thesis/store.ts +45 -22
  377. package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
  378. package/src/plugins/builtin/commodities-energy/index.tsx +29 -2
  379. package/src/plugins/builtin/commodities-energy/view-state.ts +2 -0
  380. package/src/plugins/builtin/commodity-balances/pane.tsx +11 -4
  381. package/src/plugins/builtin/company-attention/app-rank.tsx +7 -5
  382. package/src/plugins/builtin/company-attention/building-model.ts +222 -0
  383. package/src/plugins/builtin/company-attention/building.tsx +172 -0
  384. package/src/plugins/builtin/company-attention/client.ts +117 -1
  385. package/src/plugins/builtin/company-attention/evidence.ts +16 -3
  386. package/src/plugins/builtin/company-attention/headless.ts +101 -5
  387. package/src/plugins/builtin/company-attention/index.tsx +6 -3
  388. package/src/plugins/builtin/company-attention/model.ts +33 -7
  389. package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
  390. package/src/plugins/builtin/company-attention/moves.tsx +159 -0
  391. package/src/plugins/builtin/company-attention/pane.tsx +79 -23
  392. package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
  393. package/src/plugins/builtin/company-attention/signals.tsx +160 -0
  394. package/src/plugins/builtin/company-kpis/headless.ts +3 -2
  395. package/src/plugins/builtin/company-kpis/model.ts +2 -2
  396. package/src/plugins/builtin/company-kpis/pane.tsx +1 -1
  397. package/src/plugins/builtin/composite-plugins.ts +2 -1
  398. package/src/plugins/builtin/congress-trades/headless.ts +1 -1
  399. package/src/plugins/builtin/connections/index.ts +1 -0
  400. package/src/plugins/builtin/correlation/headless-schema.ts +3 -2
  401. package/src/plugins/builtin/correlation/headless.ts +5 -3
  402. package/src/plugins/builtin/cot/headless.ts +28 -6
  403. package/src/plugins/builtin/cot/model.ts +12 -0
  404. package/src/plugins/builtin/cot/pane.tsx +3 -2
  405. package/src/plugins/builtin/cpi/headless.ts +5 -1
  406. package/src/plugins/builtin/cpi/pane.tsx +11 -9
  407. package/src/plugins/builtin/credit-boards/model.ts +2 -0
  408. package/src/plugins/builtin/credit-documents/headless.ts +1 -1
  409. package/src/plugins/builtin/crypto-board/client.ts +86 -0
  410. package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
  411. package/src/plugins/builtin/crypto-board/defi.ts +239 -0
  412. package/src/plugins/builtin/crypto-board/headless.ts +117 -6
  413. package/src/plugins/builtin/crypto-board/index.tsx +8 -3
  414. package/src/plugins/builtin/crypto-board/model.ts +40 -8
  415. package/src/plugins/builtin/crypto-board/pane.tsx +55 -21
  416. package/src/plugins/builtin/crypto-board/series.ts +19 -1
  417. package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
  418. package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
  419. package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
  420. package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
  421. package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
  422. package/src/plugins/builtin/debug/index.tsx +1 -0
  423. package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
  424. package/src/plugins/builtin/docs/index.tsx +1 -1
  425. package/src/plugins/builtin/docs/pane.tsx +2 -2
  426. package/src/plugins/builtin/docs/targets.ts +1 -1
  427. package/src/plugins/builtin/doe/client.ts +5 -1
  428. package/src/plugins/builtin/doe/headless.ts +12 -6
  429. package/src/plugins/builtin/doe/model.ts +43 -6
  430. package/src/plugins/builtin/doe/pane.tsx +18 -11
  431. package/src/plugins/builtin/earnings/board-model.ts +13 -6
  432. package/src/plugins/builtin/earnings/board-table.ts +4 -1
  433. package/src/plugins/builtin/earnings/board.tsx +253 -50
  434. package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
  435. package/src/plugins/builtin/earnings/calendar.tsx +338 -0
  436. package/src/plugins/builtin/earnings/client.ts +4 -3
  437. package/src/plugins/builtin/earnings/headless.ts +53 -15
  438. package/src/plugins/builtin/earnings/history-model.ts +53 -36
  439. package/src/plugins/builtin/earnings/index.tsx +15 -22
  440. package/src/plugins/builtin/earnings/model.ts +17 -12
  441. package/src/plugins/builtin/earnings/scope.ts +89 -0
  442. package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
  443. package/src/plugins/builtin/earnings-calls/data.ts +146 -2
  444. package/src/plugins/builtin/earnings-calls/headless.ts +151 -9
  445. package/src/plugins/builtin/earnings-calls/index.tsx +3 -3
  446. package/src/plugins/builtin/earnings-calls/lock-note.ts +1 -1
  447. package/src/plugins/builtin/earnings-calls/pane.tsx +149 -31
  448. package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
  449. package/src/plugins/builtin/earnings-ripple/pane.tsx +10 -5
  450. package/src/plugins/builtin/econ/calendar-model.ts +132 -20
  451. package/src/plugins/builtin/econ/detail-view.tsx +48 -10
  452. package/src/plugins/builtin/econ/fred-catalog.ts +23 -6
  453. package/src/plugins/builtin/econ/fred-series-map.ts +4 -0
  454. package/src/plugins/builtin/econ/index.tsx +112 -25
  455. package/src/plugins/builtin/econ/print-watch.ts +2 -1
  456. package/src/plugins/builtin/econ/types.ts +32 -1
  457. package/src/plugins/builtin/econ-statistics/client.ts +16 -3
  458. package/src/plugins/builtin/econ-statistics/defs.ts +4 -0
  459. package/src/plugins/builtin/econ-statistics/detail.tsx +2 -2
  460. package/src/plugins/builtin/econ-statistics/headless.ts +13 -2
  461. package/src/plugins/builtin/econ-statistics/index.tsx +3 -3
  462. package/src/plugins/builtin/econ-statistics/pane.tsx +2 -1
  463. package/src/plugins/builtin/econ-statistics/stats.ts +103 -0
  464. package/src/plugins/builtin/econ-statistics/view.ts +16 -1
  465. package/src/plugins/builtin/equity-screener/client.ts +21 -3
  466. package/src/plugins/builtin/equity-screener/headless.ts +68 -6
  467. package/src/plugins/builtin/equity-screener/live.ts +1 -1
  468. package/src/plugins/builtin/equity-screener/model.ts +6 -0
  469. package/src/plugins/builtin/equity-screener/pane.tsx +45 -10
  470. package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
  471. package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
  472. package/src/plugins/builtin/estimate-revisions/headless.ts +3 -1
  473. package/src/plugins/builtin/estimate-revisions/lock-note.ts +3 -3
  474. package/src/plugins/builtin/estimate-revisions/model.ts +8 -10
  475. package/src/plugins/builtin/exposure/headless.ts +51 -6
  476. package/src/plugins/builtin/exposure/index.tsx +28 -2
  477. package/src/plugins/builtin/exposure/model.ts +7 -0
  478. package/src/plugins/builtin/exposure/pane.tsx +6 -1
  479. package/src/plugins/builtin/fear-greed/index.tsx +1 -1
  480. package/src/plugins/builtin/filing-events/index.tsx +1 -1
  481. package/src/plugins/builtin/futures/model.ts +10 -9
  482. package/src/plugins/builtin/futures/returns.ts +8 -36
  483. package/src/plugins/builtin/futures/table.tsx +1 -1
  484. package/src/plugins/builtin/futures-curve/client.ts +40 -9
  485. package/src/plugins/builtin/futures-curve/headless.ts +39 -17
  486. package/src/plugins/builtin/futures-curve/model.ts +258 -69
  487. package/src/plugins/builtin/futures-curve/pane.tsx +46 -17
  488. package/src/plugins/builtin/fx-matrix/client.ts +15 -8
  489. package/src/plugins/builtin/fx-matrix/headless.ts +32 -14
  490. package/src/plugins/builtin/fx-matrix/index.tsx +13 -11
  491. package/src/plugins/builtin/fx-matrix/live-legs.ts +22 -0
  492. package/src/plugins/builtin/fx-matrix/settings.ts +2 -1
  493. package/src/plugins/builtin/gpu/headless.ts +9 -4
  494. package/src/plugins/builtin/help/index.tsx +13 -3
  495. package/src/plugins/builtin/holders/beneficial-model.ts +8 -11
  496. package/src/plugins/builtin/holders/beneficial-report.ts +6 -5
  497. package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
  498. package/src/plugins/builtin/holders/client.ts +13 -1
  499. package/src/plugins/builtin/holders/format.ts +28 -17
  500. package/src/plugins/builtin/holders/headless.ts +46 -7
  501. package/src/plugins/builtin/holders/index-holders.ts +264 -0
  502. package/src/plugins/builtin/holders/pane.tsx +79 -15
  503. package/src/plugins/builtin/holders/report-rows.ts +35 -7
  504. package/src/plugins/builtin/holders/table-model.ts +2 -1
  505. package/src/plugins/builtin/holders/treemap.tsx +2 -2
  506. package/src/plugins/builtin/insider/headless.ts +1 -1
  507. package/src/plugins/builtin/insider/signals-client.ts +1 -1
  508. package/src/plugins/builtin/insider/signals.tsx +1 -1
  509. package/src/plugins/builtin/ipo-calendar/pane.tsx +7 -4
  510. package/src/plugins/builtin/iv-history/client.ts +20 -0
  511. package/src/plugins/builtin/iv-history/headless.ts +4 -4
  512. package/src/plugins/builtin/iv-history/index.tsx +1 -1
  513. package/src/plugins/builtin/iv-history/model.ts +13 -4
  514. package/src/plugins/builtin/iv-history/series.ts +3 -1
  515. package/src/plugins/builtin/jobs/lock-note.ts +1 -1
  516. package/src/plugins/builtin/jobs/model.ts +4 -15
  517. package/src/plugins/builtin/jobs/pane.tsx +7 -5
  518. package/src/plugins/builtin/jobs/share-bars.tsx +11 -5
  519. package/src/plugins/builtin/jodi/pane.tsx +10 -4
  520. package/src/plugins/builtin/layout-manager/index.tsx +1 -0
  521. package/src/plugins/builtin/macro-day/headless.ts +20 -7
  522. package/src/plugins/builtin/macro-day/index.tsx +3 -2
  523. package/src/plugins/builtin/macro-day/model.ts +29 -8
  524. package/src/plugins/builtin/macro-day/pane.tsx +46 -10
  525. package/src/plugins/builtin/macro-day/releases.ts +55 -13
  526. package/src/plugins/builtin/market-heatmap/data.ts +9 -2
  527. package/src/plugins/builtin/market-heatmap/evidence.ts +1 -1
  528. package/src/plugins/builtin/market-heatmap/headless.ts +9 -6
  529. package/src/plugins/builtin/market-heatmap/index.tsx +3 -3
  530. package/src/plugins/builtin/market-heatmap/model.ts +10 -7
  531. package/src/plugins/builtin/market-movers/client.ts +33 -19
  532. package/src/plugins/builtin/market-movers/headless.ts +8 -2
  533. package/src/plugins/builtin/market-movers/index.tsx +16 -10
  534. package/src/plugins/builtin/market-movers/screener.ts +29 -8
  535. package/src/plugins/builtin/market-movers/session-body.tsx +4 -2
  536. package/src/plugins/builtin/market-movers/session-table.ts +4 -2
  537. package/src/plugins/builtin/market-movers/table.ts +4 -1
  538. package/src/plugins/builtin/market-valuation/headless.ts +2 -0
  539. package/src/plugins/builtin/market-valuation/view.ts +5 -0
  540. package/src/plugins/builtin/members/headless.ts +6 -5
  541. package/src/plugins/builtin/members/pane.tsx +11 -4
  542. package/src/plugins/builtin/mna/client.ts +1 -0
  543. package/src/plugins/builtin/mna/detail.tsx +20 -32
  544. package/src/plugins/builtin/mna/distress/detail.tsx +16 -4
  545. package/src/plugins/builtin/mna/distress/model.ts +3 -2
  546. package/src/plugins/builtin/mna/distress/pane.tsx +7 -4
  547. package/src/plugins/builtin/mna/headless.ts +6 -13
  548. package/src/plugins/builtin/mna/model.ts +93 -15
  549. package/src/plugins/builtin/mna/pane.tsx +5 -4
  550. package/src/plugins/builtin/news/headless.ts +12 -6
  551. package/src/plugins/builtin/news/index.tsx +10 -1
  552. package/src/plugins/builtin/news/wire/index.tsx +3 -2
  553. package/src/plugins/builtin/news/wire/news/command-bar-search.ts +26 -10
  554. package/src/plugins/builtin/news/wire/news/query-presets.ts +6 -2
  555. package/src/plugins/builtin/news/wire/rss/cli.ts +3 -3
  556. package/src/plugins/builtin/notes/cli.ts +49 -14
  557. package/src/plugins/builtin/openfda/pane.tsx +1 -1
  558. package/src/plugins/builtin/options/carry.ts +2 -2
  559. package/src/plugins/builtin/options/index.tsx +1 -1
  560. package/src/plugins/builtin/options/view.tsx +10 -10
  561. package/src/plugins/builtin/options-calculator/headless.ts +46 -7
  562. package/src/plugins/builtin/options-scenario/client.ts +123 -28
  563. package/src/plugins/builtin/options-scenario/collar.ts +8 -6
  564. package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +127 -0
  565. package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +165 -0
  566. package/src/plugins/builtin/options-scenario/csp-screen.ts +258 -0
  567. package/src/plugins/builtin/options-scenario/csp.ts +101 -21
  568. package/src/plugins/builtin/options-scenario/headless.ts +36 -15
  569. package/src/plugins/builtin/options-scenario/hedge.ts +20 -14
  570. package/src/plugins/builtin/options-scenario/index.tsx +28 -3
  571. package/src/plugins/builtin/options-scenario/model.ts +13 -0
  572. package/src/plugins/builtin/options-scenario/pane.tsx +9 -5
  573. package/src/plugins/builtin/perps/equity-row.tsx +11 -3
  574. package/src/plugins/builtin/perps/freshness.ts +8 -5
  575. package/src/plugins/builtin/perps/headless.ts +3 -1
  576. package/src/plugins/builtin/perps/list-perpetuals.ts +25 -4
  577. package/src/plugins/builtin/perps/live-rows.ts +161 -0
  578. package/src/plugins/builtin/perps/markets-section.tsx +154 -0
  579. package/src/plugins/builtin/perps/pane.tsx +36 -17
  580. package/src/plugins/builtin/perps/venue-markets.ts +96 -0
  581. package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -1
  582. package/src/plugins/builtin/plugin-marketplace/pane.tsx +143 -59
  583. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +72 -24
  584. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +158 -141
  585. package/src/plugins/builtin/portfolio-list/cli/render.ts +49 -20
  586. package/src/plugins/builtin/portfolio-list/cli/shared.ts +3 -3
  587. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +29 -24
  588. package/src/plugins/builtin/portfolio-list/headless.ts +6 -3
  589. package/src/plugins/builtin/portfolio-list/income.ts +13 -2
  590. package/src/plugins/builtin/portfolio-list/index.tsx +9 -2
  591. package/src/plugins/builtin/portfolio-list/pane/index.tsx +21 -8
  592. package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
  593. package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +16 -9
  594. package/src/plugins/builtin/portfolio-list/summary/totals.ts +2 -15
  595. package/src/plugins/builtin/power/client.ts +4 -1
  596. package/src/plugins/builtin/power/evidence.ts +22 -7
  597. package/src/plugins/builtin/power/gas.tsx +5 -1
  598. package/src/plugins/builtin/power/pane.tsx +8 -1
  599. package/src/plugins/builtin/power/prices.tsx +10 -3
  600. package/src/plugins/builtin/research/analyst-headless.ts +25 -8
  601. package/src/plugins/builtin/research/analyst-model.ts +68 -3
  602. package/src/plugins/builtin/research/corporate-actions-pane.tsx +63 -14
  603. package/src/plugins/builtin/research/event-model.ts +3 -1
  604. package/src/plugins/builtin/research/event-sources.ts +12 -4
  605. package/src/plugins/builtin/research/index.tsx +2 -1
  606. package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
  607. package/src/plugins/builtin/research/relative-valuation-columns.ts +31 -2
  608. package/src/plugins/builtin/research/relative-valuation-currency.ts +12 -5
  609. package/src/plugins/builtin/research/relative-valuation-headless.ts +84 -26
  610. package/src/plugins/builtin/research/relative-valuation-model.ts +88 -19
  611. package/src/plugins/builtin/research/relative-valuation-pane.tsx +76 -9
  612. package/src/plugins/builtin/research/relative-valuation-peers.ts +1 -1
  613. package/src/plugins/builtin/reverse-dcf/model.ts +6 -2
  614. package/src/plugins/builtin/risk-factors/index.tsx +2 -2
  615. package/src/plugins/builtin/scanner/lock-note.ts +1 -1
  616. package/src/plugins/builtin/sec/forms.ts +13 -0
  617. package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
  618. package/src/plugins/builtin/sec/fund-facts.ts +68 -8
  619. package/src/plugins/builtin/sec/headless.ts +85 -8
  620. package/src/plugins/builtin/sec/index.tsx +58 -12
  621. package/src/plugins/builtin/sectors/client.ts +2 -1
  622. package/src/plugins/builtin/sectors/sector-model.ts +11 -15
  623. package/src/plugins/builtin/series-inventory.ts +2 -0
  624. package/src/plugins/builtin/shared/broker-reconnect.ts +107 -22
  625. package/src/plugins/builtin/shared/cloud-upgrade.ts +34 -6
  626. package/src/plugins/builtin/shared/earnings-calendar.ts +375 -0
  627. package/src/plugins/builtin/{earnings/estimate-basis.ts → shared/earnings-estimate-basis.ts} +1 -1
  628. package/src/plugins/builtin/shared/earnings-report.ts +3 -3
  629. package/src/plugins/builtin/shared/fx-rate-freshness.ts +23 -1
  630. package/src/plugins/builtin/shared/job-posting.ts +129 -0
  631. package/src/plugins/builtin/shared/pro-lock-note.ts +3 -3
  632. package/src/plugins/builtin/shared/report-freshness.ts +3 -0
  633. package/src/plugins/builtin/shared/research-trading.tsx +21 -0
  634. package/src/plugins/builtin/shared/series-cache.ts +2 -0
  635. package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
  636. package/src/plugins/builtin/short-interest/client.ts +2 -0
  637. package/src/plugins/builtin/short-interest/headless.ts +41 -12
  638. package/src/plugins/builtin/short-interest/index.tsx +23 -1
  639. package/src/plugins/builtin/short-interest/model.ts +70 -19
  640. package/src/plugins/builtin/short-interest/pane.tsx +19 -2
  641. package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
  642. package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
  643. package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
  644. package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
  645. package/src/plugins/builtin/short-interest/schedule.ts +35 -2
  646. package/src/plugins/builtin/short-interest/surface.tsx +11 -4
  647. package/src/plugins/builtin/short-interest/types.ts +9 -0
  648. package/src/plugins/builtin/short-interest/watch-client.ts +14 -8
  649. package/src/plugins/builtin/short-interest/watch-model.ts +12 -25
  650. package/src/plugins/builtin/short-interest/watch-pane.tsx +5 -1
  651. package/src/plugins/builtin/supply-chain/flow.tsx +33 -9
  652. package/src/plugins/builtin/supply-chain/model.ts +51 -3
  653. package/src/plugins/builtin/supply-chain/pane.tsx +78 -39
  654. package/src/plugins/builtin/supply-chain/row-evidence.tsx +1 -1
  655. package/src/plugins/builtin/themes/headless.ts +8 -5
  656. package/src/plugins/builtin/themes/model.ts +14 -4
  657. package/src/plugins/builtin/themes/pane.tsx +24 -5
  658. package/src/plugins/builtin/thirteenf/headless.ts +5 -5
  659. package/src/plugins/builtin/thirteenf/signals.ts +3 -1
  660. package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
  661. package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
  662. package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
  663. package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +40 -26
  664. package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +8 -4
  665. package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +67 -3
  666. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +112 -5
  667. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +17 -2
  668. package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +21 -7
  669. package/src/plugins/builtin/ticker-detail/financials/model.ts +36 -1
  670. package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
  671. package/src/plugins/builtin/ticker-detail/financials/ratios.ts +62 -13
  672. package/src/plugins/builtin/ticker-detail/financials/tab.tsx +30 -4
  673. package/src/plugins/builtin/ticker-detail/headless-schema.ts +14 -2
  674. package/src/plugins/builtin/ticker-detail/headless.ts +148 -35
  675. package/src/plugins/builtin/ticker-detail/index.tsx +37 -5
  676. package/src/plugins/builtin/ticker-detail/overview/model.ts +65 -10
  677. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +9 -1
  678. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +68 -11
  679. package/src/plugins/builtin/ticker-detail/pane.tsx +11 -0
  680. package/src/plugins/builtin/ticker-detail/quote-footer.ts +8 -3
  681. package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
  682. package/src/plugins/builtin/vol-surface/client.ts +5 -4
  683. package/src/plugins/builtin/vol-surface/headless.ts +12 -3
  684. package/src/plugins/builtin/vol-surface/model.ts +4 -2
  685. package/src/plugins/builtin/volatility/model.ts +5 -10
  686. package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +4 -3
  687. package/src/plugins/builtin/world-venue-map/basemap.ts +3 -1
  688. package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -0
  689. package/src/plugins/builtin/world-venue-map/evidence.ts +1 -1
  690. package/src/plugins/builtin/world-venue-map/geo-series.ts +90 -11
  691. package/src/plugins/builtin/world-venue-map/headless.ts +1 -1
  692. package/src/plugins/builtin/world-venue-map/index.ts +3 -26
  693. package/src/plugins/builtin/world-venue-map/layers.ts +1 -1
  694. package/src/plugins/builtin/world-venue-map/map.tsx +2 -1
  695. package/src/plugins/builtin/world-venue-map/pane.tsx +4 -2
  696. package/src/plugins/builtin/world-venue-map/venue-header.tsx +15 -4
  697. package/src/plugins/builtin/yield-curve/client.ts +25 -0
  698. package/src/plugins/builtin/yield-curve/curves.ts +7 -4
  699. package/src/plugins/builtin/yield-curve/headless.ts +38 -4
  700. package/src/plugins/builtin/yield-curve/history.ts +4 -3
  701. package/src/plugins/builtin/yield-curve/index.tsx +12 -6
  702. package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
  703. package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
  704. package/src/plugins/bundle.ts +1 -1
  705. package/src/plugins/catalog-browser.ts +2 -1
  706. package/src/plugins/compat.ts +3 -3
  707. package/src/plugins/dependencies.ts +75 -14
  708. package/src/plugins/extracted-plugins.ts +132 -34
  709. package/src/plugins/host-link.ts +149 -34
  710. package/src/plugins/installer.ts +35 -10
  711. package/src/plugins/loader.ts +206 -38
  712. package/src/plugins/manager-node.ts +2 -2
  713. package/src/plugins/marketplace/deactivation.ts +22 -0
  714. package/src/plugins/marketplace/model.ts +2 -2
  715. package/src/plugins/marketplace/packs.ts +1 -1
  716. package/src/plugins/ownership.ts +1 -1
  717. package/src/plugins/peer-retry.ts +155 -0
  718. package/src/plugins/registry/contributions.ts +3 -1
  719. package/src/plugins/registry/index.ts +4 -3
  720. package/src/plugins/registry/plugin-state.ts +3 -0
  721. package/src/plugins/seed-notice.ts +20 -0
  722. package/src/plugins/shortcut-argument.ts +39 -0
  723. package/src/portfolio/allocation.ts +1 -1
  724. package/src/portfolio/collection-name.ts +31 -0
  725. package/src/portfolio/column-values.ts +10 -8
  726. package/src/portfolio/cost-fx.ts +296 -19
  727. package/src/portfolio/manual-lots.ts +75 -0
  728. package/src/portfolio/mutations.ts +60 -22
  729. package/src/portfolio/suffixed-listings.ts +209 -0
  730. package/src/portfolio/totals-currency.ts +24 -0
  731. package/src/public/__snapshots__/public-api.test.ts.snap +14 -0
  732. package/src/public/time-series.ts +11 -8
  733. package/src/remote/schema.ts +1 -1
  734. package/src/renderers/browser/config-host.ts +3 -0
  735. package/src/renderers/browser/main.tsx +23 -3
  736. package/src/renderers/dom/boot-frame-page.ts +187 -0
  737. package/src/renderers/dom/boot-frame.ts +237 -0
  738. package/src/renderers/dom/build-assets.ts +46 -8
  739. package/src/renderers/dom/dom-ui-host.tsx +4 -29
  740. package/src/renderers/dom/host/ascii-text.ts +16 -2
  741. package/src/renderers/dom/host/box.tsx +43 -2
  742. package/src/renderers/dom/host/chart-surface.tsx +2 -0
  743. package/src/renderers/dom/host/hls.chunk.ts +3 -0
  744. package/src/renderers/dom/host/image-surface.tsx +49 -0
  745. package/src/renderers/dom/host/media-surface.tsx +24 -18
  746. package/src/renderers/dom/host/mouse.ts +30 -0
  747. package/src/renderers/dom/host/size-observer.ts +1 -1
  748. package/src/renderers/dom/host/style.ts +1 -1
  749. package/src/renderers/dom/styles.css +76 -0
  750. package/src/renderers/dom/test-utils.tsx +2 -1
  751. package/src/renderers/electrobun/bun/application-menu/index.ts +3 -3
  752. package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
  753. package/src/renderers/electrobun/bun/desktop/backend.ts +46 -3
  754. package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
  755. package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
  756. package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
  757. package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
  758. package/src/renderers/electrobun/bun/index.ts +11 -1
  759. package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
  760. package/src/renderers/electrobun/bun/window/create.ts +4 -1
  761. package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
  762. package/src/renderers/electrobun/shared/protocol.ts +6 -1
  763. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
  764. package/src/renderers/electrobun/view/config-host.ts +3 -0
  765. package/src/renderers/electrobun/view/fatal-screen.tsx +1 -1
  766. package/src/renderers/electrobun/view/main.tsx +30 -4
  767. package/src/renderers/electrobun/view/news-source.ts +5 -5
  768. package/src/renderers/electrobun/view/remote/asset-data-client.ts +1 -1
  769. package/src/renderers/electrobun/view/ui-host.tsx +1 -1
  770. package/src/renderers/opentui/browser-open.ts +88 -0
  771. package/src/renderers/opentui/host.tsx +5 -14
  772. package/src/renderers/opentui/image/loader.ts +3 -2
  773. package/src/renderers/opentui/native-smoke.ts +10 -1
  774. package/src/renderers/opentui/pane-image/index.ts +2 -1
  775. package/src/renderers/opentui/render-lib.ts +253 -0
  776. package/src/renderers/opentui/render-timing-smoke.ts +1 -1
  777. package/src/renderers/opentui/start.tsx +1 -1
  778. package/src/renderers/share/layout-view.tsx +2 -2
  779. package/src/renderers/share/main.tsx +4 -4
  780. package/src/renderers/share/view.tsx +1 -1
  781. package/src/series/resolve.ts +22 -6
  782. package/src/series/standalone.ts +30 -2
  783. package/src/series/types.ts +8 -1
  784. package/src/shares/api.ts +4 -1
  785. package/src/shares/pane.ts +1 -1
  786. package/src/sources/gloomberb-cloud/fred-series.ts +46 -1
  787. package/src/sources/gloomberb-cloud/index.ts +32 -16
  788. package/src/sources/gloomberb-cloud/news.ts +39 -0
  789. package/src/sources/gloomberb-cloud/normalizers.ts +14 -1
  790. package/src/sources/gloomberb-cloud/perpetuals.ts +49 -1
  791. package/src/sources/listing-symbols.ts +37 -0
  792. package/src/sources/provider-errors.ts +16 -2
  793. package/src/sources/provider-router/financial-routes.ts +21 -3
  794. package/src/sources/provider-router/financials.ts +15 -2
  795. package/src/sources/provider-router/history.ts +30 -8
  796. package/src/sources/provider-router/primary.ts +1 -1
  797. package/src/state/app/bootstrap.ts +23 -0
  798. package/src/state/hooks/inline-tickers.ts +30 -5
  799. package/src/sync/controller.ts +1 -1
  800. package/src/sync/core-contributors.ts +46 -14
  801. package/src/team/collections-sync.ts +2 -1
  802. package/src/team/collections.ts +178 -17
  803. package/src/telemetry/crash-reports.ts +17 -4
  804. package/src/test-support/builtin-panes.ts +1 -1
  805. package/src/theme/colors.ts +3 -30
  806. package/src/theme/ui-tokens.ts +37 -1
  807. package/src/tickers/company-name-listing.ts +210 -33
  808. package/src/tickers/index-roots.ts +47 -0
  809. package/src/tickers/instrument-label.ts +5 -1
  810. package/src/tickers/metadata.ts +10 -0
  811. package/src/tickers/perpetual-listing.ts +5 -2
  812. package/src/tickers/search/home-listing.ts +75 -0
  813. package/src/tickers/search/index.ts +76 -27
  814. package/src/tickers/search/ranking.ts +54 -4
  815. package/src/tickers/search/upsert.ts +29 -0
  816. package/src/tickers/terminal-codes.ts +416 -40
  817. package/src/time-series/bar-aggregation.ts +243 -0
  818. package/src/time-series/base-series.ts +307 -0
  819. package/src/time-series/chart-bounds.ts +349 -0
  820. package/src/time-series/chart-seed.ts +142 -0
  821. package/src/time-series/economic.ts +5 -0
  822. package/src/time-series/fundamentals.ts +18 -3
  823. package/src/time-series/history-acquisition.ts +499 -0
  824. package/src/time-series/leverage.ts +100 -0
  825. package/src/time-series/market-resolution.ts +4 -2
  826. package/src/time-series/market.ts +2 -1
  827. package/src/time-series/price-comparison.ts +175 -30
  828. package/src/time-series/range.ts +9 -1
  829. package/src/time-series/resolution.ts +174 -16
  830. package/src/time-series/resolve-context.ts +157 -0
  831. package/src/time-series/resolve.ts +126 -1577
  832. package/src/time-series/series-name.ts +38 -0
  833. package/src/time-series/series-presentation.ts +208 -0
  834. package/src/time-series/spec.ts +11 -6
  835. package/src/time-series/studies.ts +109 -12
  836. package/src/time-series/tail-reconcile.ts +121 -0
  837. package/src/time-series/types.ts +29 -2
  838. package/src/time-series/use-chart-resolution.ts +4 -5
  839. package/src/types/broker.ts +10 -0
  840. package/src/types/config.ts +14 -0
  841. package/src/types/data-provider.ts +14 -0
  842. package/src/types/exchange-rate.ts +6 -0
  843. package/src/types/financials.ts +104 -7
  844. package/src/types/headless.ts +76 -6
  845. package/src/types/instrument.ts +3 -0
  846. package/src/types/plugin.ts +65 -8
  847. package/src/types/price-history.ts +2 -0
  848. package/src/types/ticker.ts +13 -0
  849. package/src/types/trading.ts +59 -1
  850. package/src/ui/ascii-font.ts +13 -1
  851. package/src/ui/host.tsx +6 -1
  852. package/src/updater/command-names.ts +175 -0
  853. package/src/updater/index.ts +10 -5
  854. package/src/utils/calendar-date.ts +32 -15
  855. package/src/utils/cash-runway.ts +241 -0
  856. package/src/utils/central-banks.ts +42 -0
  857. package/src/utils/cli-output.ts +259 -80
  858. package/src/utils/contract-month.ts +16 -0
  859. package/src/utils/crypto-pair.ts +61 -3
  860. package/src/utils/currency-units.ts +29 -0
  861. package/src/utils/datetime-format.ts +10 -0
  862. package/src/utils/debug-log.ts +1 -1
  863. package/src/utils/decimal-comma.ts +39 -6
  864. package/src/utils/exchange-announcements.ts +71 -0
  865. package/src/utils/exchange-rate-snapshot.ts +10 -0
  866. package/src/utils/financial-statements.ts +83 -4
  867. package/src/utils/format.ts +34 -16
  868. package/src/utils/fundamentals.ts +150 -34
  869. package/src/utils/fx-market-hours.ts +10 -1
  870. package/src/utils/latest-financial-period.ts +8 -0
  871. package/src/utils/linux-libc.ts +54 -0
  872. package/src/utils/market-capitalization.ts +111 -15
  873. package/src/utils/max-drawdown.ts +64 -0
  874. package/src/utils/network-failure.ts +83 -0
  875. package/src/utils/option-expiry.ts +139 -7
  876. package/src/utils/price-earnings.ts +11 -5
  877. package/src/utils/price-history.ts +18 -8
  878. package/src/utils/price-window.ts +131 -0
  879. package/src/utils/release-date.ts +47 -0
  880. package/src/utils/sec.ts +3 -0
  881. package/src/utils/throttled-fetch.ts +11 -4
  882. package/src/utils/trailing-eps.ts +67 -0
  883. package/src/utils/typed-text.ts +21 -0
  884. package/src/utils/utc-time.ts +24 -1
  885. package/src/version.ts +6 -0
  886. package/src/cli/pane-functions/screenshot.ts +0 -2122
@@ -23,6 +23,7 @@ import { debugLog } from "../utils/debug-log";
23
23
  import { canonicalExchange, normalizeSymbol } from "../utils/exchanges";
24
24
  import { mergeQuoteSubscriptionTargets } from "../market-data/quote-subscription-target";
25
25
  import { recordServerClockSample } from "../market-data/quotes/clock";
26
+ import { perpetualListing } from "../tickers/perpetual-listing";
26
27
  import {
27
28
  connectionHealth,
28
29
  GLOOM_CLOUD_SOCKET_CONNECTION_ID,
@@ -41,6 +42,19 @@ export const CHAT_ATTACHMENTS_FEATURE = "chat.attachments";
41
42
  /** The app can run terminal tools relayed from a remote assistant; it still announces itself first. */
42
43
  export const TERMINAL_RELAY_FEATURE = "terminal.relay";
43
44
  const CLIENT_SOCKET_FEATURES = [MARKET_BATCH_FEATURE, CHAT_ATTACHMENTS_FEATURE, TERMINAL_RELAY_FEATURE] as const;
45
+ /**
46
+ * The server streams perpetual listings (`BTC:HYPERLIQUID`) from their venues. Until a server offers it, they are
47
+ * kept off market.subscribe: an older one would read `BTC` on HYPERLIQUID as a stock symbol.
48
+ */
49
+ const MARKET_PERPS_FEATURE = "market.perps";
50
+ /**
51
+ * The most perpetual listings the app streams at once, across every pane: on screen and selected first. The server
52
+ * takes up to 100 from one connection (fewer signed out); the rest keep their fetched readings.
53
+ */
54
+ const PERP_STREAM_BUDGET = 60;
55
+ /** On screen and selected first, then by weight; equal ones keep the order they were asked in. */
56
+ const perpStreamRank = (target: QuoteStreamTarget) => (target.selected ? 2 : 0) + (target.visible ? 1 : 0);
57
+ const isPerpTarget = (target: QuoteStreamTarget) => !!perpetualListing(target.symbol, target.exchange);
44
58
  const cloudApiLog = debugLog.createLogger("cloud-api");
45
59
 
46
60
  type ChannelListener = (message: ChatMessage) => void;
@@ -143,6 +157,13 @@ export class CloudApiSocket {
143
157
  private featuresRequestedFor: WebSocket | null = null;
144
158
  /** What the last "ready" frame offered; kept across reconnects so a blip does not hide features. */
145
159
  private offeredFeatures: ReadonlySet<string> = new Set();
160
+ /**
161
+ * The connection whose server offered perpetual markets. Asked of every connection: a reconnect may reach an older
162
+ * server, which would read `BTC` on HYPERLIQUID as a stock symbol.
163
+ */
164
+ private perpsOfferedOn: WebSocket | null = null;
165
+ /** The perpetual listings this connection streams, within PERP_STREAM_BUDGET. */
166
+ private streamedPerps = new Map<string, QuoteStreamTarget>();
146
167
  private readonly offeredFeatureListeners = new Set<() => void>();
147
168
  private readonly connectionListeners = new Set<(event: "ready" | "closed") => void>();
148
169
  private readonly tapeListeners = new Map<string, { symbol: string; exchange: string; listeners: Set<(event: TapeFeedEvent) => void> }>();
@@ -761,6 +782,13 @@ export class CloudApiSocket {
761
782
  const changed = next.size !== this.offeredFeatures.size
762
783
  || [...next].some((feature) => !this.offeredFeatures.has(feature));
763
784
  this.offeredFeatures = next;
785
+ // Perpetual listings held back since the socket opened go out once this connection's server offers them.
786
+ const perpsOffered = next.has(MARKET_PERPS_FEATURE) ? this.ws : null;
787
+ if (perpsOffered !== this.perpsOfferedOn) {
788
+ this.perpsOfferedOn = perpsOffered;
789
+ this.streamedPerps.clear();
790
+ this.syncPerpSubscriptions();
791
+ }
764
792
  if (!changed) return;
765
793
  for (const listener of this.offeredFeatureListeners) listener();
766
794
  }
@@ -960,14 +988,41 @@ export class CloudApiSocket {
960
988
  this.sendSocketMessage({ type: "scanner.subscribe", scanner });
961
989
  }
962
990
 
963
- if (this.quoteTargets.size > 0) {
991
+ const targets = [...this.quoteTargets.values()].filter((target) => !isPerpTarget(target));
992
+ if (targets.length > 0) {
964
993
  this.sendSocketMessage({
965
994
  type: "market.subscribe",
966
- symbols: [...this.quoteTargets.values()].map((target) =>
995
+ symbols: targets.map((target) =>
967
996
  this.serializeQuoteStreamTarget(target),
968
997
  ),
969
998
  });
970
999
  }
1000
+ this.streamedPerps.clear();
1001
+ this.syncPerpSubscriptions();
1002
+ }
1003
+
1004
+ /**
1005
+ * Streams the perpetual listings within the budget, once this connection's server offers them: the best ranked
1006
+ * across every pane. One that falls out is unsubscribed; one whose target changed (`changed`) is sent again.
1007
+ */
1008
+ private syncPerpSubscriptions(changed: ReadonlySet<string> = new Set()): void {
1009
+ const ws = this.ws;
1010
+ if (!ws || ws.readyState !== WebSocket.OPEN || this.perpsOfferedOn !== ws) return;
1011
+ const wanted = new Map(
1012
+ [...this.quoteTargets]
1013
+ .filter(([, target]) => isPerpTarget(target))
1014
+ .sort(([, left], [, right]) => perpStreamRank(right) - perpStreamRank(left) || (right.weight ?? 0) - (left.weight ?? 0))
1015
+ .slice(0, PERP_STREAM_BUDGET),
1016
+ );
1017
+ const unsubscribes = [...this.streamedPerps].filter(([key]) => !wanted.has(key)).map(([, target]) => target);
1018
+ const subscribes = [...wanted].filter(([key]) => !this.streamedPerps.has(key) || changed.has(key)).map(([, target]) => target);
1019
+ this.streamedPerps = wanted;
1020
+ if (unsubscribes.length > 0) {
1021
+ this.sendSocketMessage({ type: "market.unsubscribe", symbols: unsubscribes.map((target) => this.serializeQuoteStreamTarget(target)) });
1022
+ }
1023
+ if (subscribes.length > 0) {
1024
+ this.sendSocketMessage({ type: "market.subscribe", symbols: subscribes.map((target) => this.serializeQuoteStreamTarget(target)) });
1025
+ }
971
1026
  }
972
1027
 
973
1028
  private scheduleQuoteSubscriptionFlush(): void {
@@ -1002,10 +1057,15 @@ export class CloudApiSocket {
1002
1057
  this.pendingQuoteUnsubscribes.clear();
1003
1058
  return;
1004
1059
  }
1005
- const subscribes = [...this.pendingQuoteSubscribes.values()];
1006
- const unsubscribes = [...this.pendingQuoteUnsubscribes.values()];
1060
+ const subscribes = [...this.pendingQuoteSubscribes.values()].filter((target) => !isPerpTarget(target));
1061
+ const unsubscribes = [...this.pendingQuoteUnsubscribes.values()].filter((target) => !isPerpTarget(target));
1062
+ const perpsChanged = [...this.pendingQuoteSubscribes]
1063
+ .filter(([, target]) => isPerpTarget(target))
1064
+ .map(([key]) => key);
1065
+ const perpsMoved = perpsChanged.length > 0 || [...this.pendingQuoteUnsubscribes.values()].some(isPerpTarget);
1007
1066
  this.pendingQuoteSubscribes.clear();
1008
1067
  this.pendingQuoteUnsubscribes.clear();
1068
+ if (perpsMoved) this.syncPerpSubscriptions(new Set(perpsChanged));
1009
1069
  if (unsubscribes.length > 0) {
1010
1070
  this.sendSocketMessage({
1011
1071
  type: "market.unsubscribe",
@@ -0,0 +1,35 @@
1
+ export const SWAP_TENORS = ["1Y", "2Y", "3Y", "5Y", "7Y", "10Y", "15Y", "20Y", "30Y"] as const;
2
+ export type SwapTenor = typeof SWAP_TENORS[number];
3
+ type SwapQuality = "ok" | "thin" | "missing";
4
+
5
+ export interface SwapPoint {
6
+ tenor: SwapTenor;
7
+ years: number;
8
+ /** Percentage rate: 4.5 means 4.5%. */
9
+ rate: number | null;
10
+ changeBp: number | null;
11
+ spreadBp: number | null;
12
+ treasuryRate: number | null;
13
+ tradeCount: number;
14
+ candidateCount: number;
15
+ excludedCount: number;
16
+ notionalUsd: number;
17
+ quality: SwapQuality;
18
+ }
19
+
20
+ export interface SwapCurvePayload {
21
+ source: "DTCC PPD";
22
+ currency: "USD";
23
+ benchmark: "SOFR";
24
+ asOf: string | null;
25
+ fetchedAt: string | null;
26
+ stale: boolean;
27
+ previousDate: string | null;
28
+ treasuryDate: string | null;
29
+ points: SwapPoint[];
30
+ comparisons: Record<"week" | "month", { date: string | null; points: SwapPoint[] }>;
31
+ history: {
32
+ tenor: SwapTenor;
33
+ points: Array<{ date: string; rate: number | null; spreadBp: number | null; tradeCount: number; quality: SwapQuality }>;
34
+ };
35
+ }
@@ -38,7 +38,13 @@ interface SnapshotMetadata {
38
38
  asOf: string;
39
39
  snapshotId: string;
40
40
  stale: boolean;
41
- /** The US market as the server's delayed board reads it. Absent from older servers. */
41
+ /**
42
+ * Whose prices the board carries: `realtime` for a Pro account, priced from
43
+ * a live read the server renews every 15 seconds; `delayed`, fifteen
44
+ * minutes behind, otherwise. An older server leaves it out (delayed).
45
+ */
46
+ access?: "realtime" | "delayed";
47
+ /** The US market as the board reads it: now for a real-time board, fifteen minutes back otherwise. Absent from older servers. */
42
48
  session?: "PRE" | "REGULAR" | "POST" | "CLOSED" | null;
43
49
  /** Outside the regular session, the completed session every figure describes; null while one trades. */
44
50
  regularSessionDate?: string | null;
@@ -480,6 +480,11 @@ export interface CloudPricePointPayload {
480
480
  low?: number;
481
481
  close: number;
482
482
  volume?: number;
483
+ /**
484
+ * One venue's count for a bar whose market volume is unavailable (a US session still trading, counted on IEX
485
+ * alone), served in place of `volume`.
486
+ */
487
+ venueVolume?: { venue: string; volume: number };
483
488
  /** A daily bar still forming when served: a coin's UTC day, or the trade date a future is trading. */
484
489
  partial?: boolean;
485
490
  /** A coin's daily bar whose prices were rebuilt from hourly bars; a day the source left empty has no volume. */
@@ -500,6 +505,43 @@ export interface CloudEconEventPayload {
500
505
  forecast: string | null;
501
506
  prior: string | null;
502
507
  impact: CloudEconImpact;
508
+ /** Rows the calendar adds beside its feeds: a central bank's kept decision or a statistics office's listed release. */
509
+ kind?: "central-bank-decision" | "statistics-release";
510
+ /** The publisher's own clock time and its IANA zone; null when it states no time. */
511
+ localTime?: string | null;
512
+ timeZone?: string;
513
+ /** Why a row has no time, when its publisher states none. */
514
+ timeNote?: string | null;
515
+ priorAsOf?: string | null;
516
+ referencePeriod?: string | null;
517
+ /** Who publishes the release (Freddie Mac for the 30-year mortgage rate), and its page when one is named. */
518
+ source?: { name: string; url?: string };
519
+ }
520
+
521
+ /** One currency's short-term rate, as GET /cloud/econ/short-rates serves it. */
522
+ export interface CloudShortRate {
523
+ currency: string;
524
+ /** "SOFR", "TIIE 28d". */
525
+ name: string;
526
+ /** "overnight" or the term the rate is for. */
527
+ tenor: string;
528
+ tenorDays: number;
529
+ /** Days in the year the rate is quoted over. */
530
+ dayCountBasis: 360 | 365;
531
+ publisher: string;
532
+ sourceUrl: string;
533
+ /** Percent a year; null when it could not be read. */
534
+ value: number | null;
535
+ /** The day the rate is for. */
536
+ asOf: string | null;
537
+ fetchedAt: string | null;
538
+ stale: boolean;
539
+ unavailableReason: string | null;
540
+ }
541
+
542
+ export interface CloudShortRatesPayload {
543
+ generatedAt: string;
544
+ rates: CloudShortRate[];
503
545
  }
504
546
 
505
547
  /** CPI, payrolls and FOMC statement days as published, as GET /cloud/econ/release-days serves them. */
@@ -509,8 +551,17 @@ export interface CloudMacroReleaseDaysPayload {
509
551
  /** The last New York day the lists are complete for. */
510
552
  coveredThrough: string;
511
553
  sources: string[];
512
- /** New York dates, oldest first. */
513
- releases: Record<"cpi" | "jobs" | "fomc", string[]>;
554
+ /** New York dates, oldest first. Brazil's IPCA days when the server can vouch for them. */
555
+ releases: Record<"cpi" | "jobs" | "fomc", string[]> & { ipca?: string[] };
556
+ /** Each kind's figures by New York release day, for the days they are known. */
557
+ figures?: Partial<Record<"cpi" | "jobs" | "fomc" | "ipca", Record<string, {
558
+ event: string;
559
+ actual: string | null;
560
+ forecast: string | null;
561
+ prior: string | null;
562
+ /** Above the consensus (hot), below it (cool), at it (in-line); null without both. */
563
+ surprise: "hot" | "cool" | "in-line" | null;
564
+ }>>>;
514
565
  }
515
566
 
516
567
  export interface CloudFredObservationPayload {
@@ -523,6 +574,12 @@ export interface CloudFredObservationPayload {
523
574
  publisher?: string;
524
575
  /** When that publisher's value was first read, ISO in UTC. */
525
576
  publishedAt?: string;
577
+ /**
578
+ * The day FRED's source released this value (`YYYY-MM-DD`), on the newest
579
+ * observation of a weekly to annual series: September's permits are dated
580
+ * 1 Sep and were released 20 Oct. Absent on daily series and older points.
581
+ */
582
+ releasedOn?: string;
526
583
  }
527
584
 
528
585
  export interface CloudFredSeriesInfoPayload {
@@ -681,6 +738,10 @@ export interface CloudCdsLevelsResponse {
681
738
  interface CloudShortInterestPointPayload {
682
739
  settlementDate: string;
683
740
  shortPercentFloat?: number | null;
741
+ /** The 10-K or 10-Q cover share count known when FINRA published the settlement. Absent on servers older than the field. */
742
+ sharesOutstanding?: number;
743
+ /** YYYY-MM-DD that count was taken. */
744
+ sharesOutstandingAsOf?: string;
684
745
  sharesShort: number;
685
746
  previousSharesShort: number | null;
686
747
  averageDailyVolume: number | null;
@@ -819,6 +880,11 @@ export interface CloudEarningsCallPayload {
819
880
  sentiment: number | null;
820
881
  /** The replay or event page the transcript came from. */
821
882
  webcastUrl?: string | null;
883
+ /**
884
+ * Whether `callAt` is the call's start or its day alone (00:00 UTC of that
885
+ * New York day). Absent from a server that predates it.
886
+ */
887
+ callTimeKnown?: boolean;
822
888
  }
823
889
 
824
890
  interface CloudJobsSeriesPoint {
@@ -864,6 +930,17 @@ export interface CloudJobsPosting {
864
930
  tags: string[];
865
931
  }
866
932
 
933
+ /** One posting as its detail view reads it. */
934
+ export interface CloudJobsPostingDetail extends CloudJobsPosting {
935
+ /** The careers system's own id. */
936
+ externalId: string;
937
+ /** As the careers system writes it ("Full time", "FULL_TIME", "CDI"). */
938
+ employmentType: string | null;
939
+ /** The start of the role's description, as read from its page. */
940
+ description: string | null;
941
+ closedAt: string | null;
942
+ }
943
+
867
944
  export interface CloudJobsChange {
868
945
  count: number;
869
946
  percent: number | null;
@@ -1335,6 +1412,8 @@ interface CloudSecFilingPayload {
1335
1412
  primaryDocumentUrl?: string;
1336
1413
  /** The filing's SEC file number for this company, empty when it has none. Absent from older servers. */
1337
1414
  fileNumber?: string;
1415
+ /** In a fund's list from a trust that runs several funds: filed for the fund's own series. Absent from older servers. */
1416
+ fundSeries?: boolean;
1338
1417
  }
1339
1418
 
1340
1419
  interface CloudSecDocumentPayload {
@@ -2200,6 +2279,15 @@ export interface TeamCollectionItem {
2200
2279
  exchange: string;
2201
2280
  quantity: number | null;
2202
2281
  note: string | null;
2282
+ /**
2283
+ * A portfolio holding's purchase date (YYYY-MM-DD), its currency, and the
2284
+ * rate its cost was bought at (one unit of `currency` in `costFxCurrency`).
2285
+ * Null when no one has sent one; missing from a server that keeps none.
2286
+ */
2287
+ dateAcquired?: string | null;
2288
+ currency?: string | null;
2289
+ costFxRate?: number | null;
2290
+ costFxCurrency?: string | null;
2203
2291
  addedBy: string;
2204
2292
  addedAt: string;
2205
2293
  updatedAt: string;
@@ -17,6 +17,7 @@ import {
17
17
  import { applyPluginToggles } from "../../plugins/ownership";
18
18
  import { setLayoutManagerDispatch } from "../../plugins/builtin/layout-manager";
19
19
  import { setMarketplaceHost } from "../../plugins/marketplace/store";
20
+ import { deactivatePluginForRemoval } from "../../plugins/marketplace/deactivation";
20
21
  import type { InstalledPlugin } from "../../plugins/marketplace/model";
21
22
  import {
22
23
  listExternalPlugins,
@@ -235,7 +236,7 @@ export function bindAppPanePluginRegistry({
235
236
  const sharedPane = materialized.layout.instances[0];
236
237
  if (!sharedPane) throw new Error("This shared pane is invalid.");
237
238
  const paneDef = pluginRegistry.panes.get(sharedPane.paneId);
238
- if (!paneDef) throw new Error("This shared pane is unavailable in this version of Gloomberb.");
239
+ if (!paneDef) throw new Error("This shared pane is unavailable in this version of Gloom.");
239
240
  const owner = pluginRegistry.getDisabledPaneOwner(sharedPane.paneId, stateRef.current.config.disabledPlugins);
240
241
  if (owner) throw new PluginOffError(owner, "this shared pane");
241
242
  const instance = buildPaneInstance(sharedPane.paneId, sharedPane);
@@ -502,7 +503,13 @@ export function bindAppPanePluginRegistry({
502
503
  for (const instanceId of orphaned) next = removePane(next, instanceId);
503
504
  persistLayout(next);
504
505
  }
505
- if (pluginRegistry.allPlugins.has(pluginId)) pluginRegistry.unregister(pluginId);
506
+ try {
507
+ deactivatePluginForRemoval(pluginRegistry, pluginId);
508
+ } catch (error) {
509
+ const entry = listExternalPlugins().find((candidate) => candidate.plugin.id === pluginId);
510
+ if (entry) upsertExternalPlugin({ ...entry, needsRestart: true });
511
+ throw error;
512
+ }
506
513
  removeExternalPlugin(pluginId, directory);
507
514
  },
508
515
  contributions: (pluginId) => {
@@ -184,7 +184,7 @@ function parseCloudDeepLink(parsed: ParsedGloomUrl): DesktopDeepLinkAction {
184
184
  message: "Pro is active.",
185
185
  };
186
186
  }
187
- return { type: "unsupported", message: "Unsupported Gloomberb cloud link." };
187
+ return { type: "unsupported", message: "Unsupported Gloom cloud link." };
188
188
  }
189
189
 
190
190
  function parseTickerDeepLink(parsed: ParsedGloomUrl): DesktopDeepLinkAction {
@@ -207,7 +207,7 @@ function parseCollectionDeepLink(parsed: ParsedGloomUrl, kind: CollectionDeepLin
207
207
 
208
208
  function parseAlertDeepLink(parsed: ParsedGloomUrl): DesktopDeepLinkAction {
209
209
  if ((parsed.segments[0] ?? "new") !== "new") {
210
- return { type: "unsupported", message: "Unsupported Gloomberb alert link." };
210
+ return { type: "unsupported", message: "Unsupported Gloom alert link." };
211
211
  }
212
212
  const symbol = normalizeSymbol(param(parsed.url, "symbol", "ticker"));
213
213
  const condition = normalizeAlertCondition(param(parsed.url, "condition", "side", "trigger"));
@@ -255,7 +255,7 @@ function parseNewsDeepLink(parsed: ParsedGloomUrl): DesktopDeepLinkAction {
255
255
  if (route === "top") {
256
256
  return { type: "open-news", kind: "top", symbol: null, message: "Opened top news." };
257
257
  }
258
- return { type: "unsupported", message: "Unsupported Gloomberb news link." };
258
+ return { type: "unsupported", message: "Unsupported Gloom news link." };
259
259
  }
260
260
 
261
261
  function parseLayoutDeepLink(parsed: ParsedGloomUrl): DesktopDeepLinkAction {
@@ -274,7 +274,7 @@ function parseShareDeepLink(parsed: ParsedGloomUrl): DesktopDeepLinkAction {
274
274
 
275
275
  export function resolveDesktopDeepLinkAction(rawUrl: string): DesktopDeepLinkAction {
276
276
  const parsed = parseGloomUrl(rawUrl);
277
- if (!parsed) return { type: "unsupported", message: "Unsupported Gloomberb link." };
277
+ if (!parsed) return { type: "unsupported", message: "Unsupported Gloom link." };
278
278
 
279
279
  switch (parsed.host) {
280
280
  case "cloud":
@@ -298,7 +298,7 @@ export function resolveDesktopDeepLinkAction(rawUrl: string): DesktopDeepLinkAct
298
298
  case "layout":
299
299
  return parseLayoutDeepLink(parsed);
300
300
  default:
301
- return { type: "unsupported", message: "Unsupported Gloomberb link." };
301
+ return { type: "unsupported", message: "Unsupported Gloom link." };
302
302
  }
303
303
  }
304
304
 
@@ -4,7 +4,7 @@ import {
4
4
  clearPersistedBrokerAccounts,
5
5
  getBrokerAccountCacheSourceKey,
6
6
  } from "../../brokers/account-cache";
7
- import { clearLeftoverBrokerHoldings, findPortfolioHeir, knownBrokerHoldings } from "../../brokers/broker-portfolio-sync";
7
+ import { accountsShownFor, clearLeftoverBrokerHoldings, findPortfolioHeir, knownBrokerHoldings } from "../../brokers/broker-portfolio-sync";
8
8
  import type { AppTickerRepositoryPort } from "../../core/app-service-ports";
9
9
  import type { MarketDataCoordinator } from "../../market-data/coordinator";
10
10
  import { instrumentFromTicker } from "../../market-data/request-types";
@@ -143,7 +143,7 @@ export function bindPluginRegistryRuntimeAccess({
143
143
 
144
144
  await broker.connect?.(instance);
145
145
  if (broker.listAccounts) {
146
- const accounts = await broker.listAccounts(instance);
146
+ const accounts = accountsShownFor(stateRef.current.config, instance, await broker.listAccounts(instance));
147
147
  dispatch({ type: "SET_BROKER_ACCOUNTS", instanceId, accounts });
148
148
  }
149
149
  },
@@ -8,6 +8,7 @@ import { instrumentFromTicker, type InstrumentRef } from "../../market-data/requ
8
8
  import { useSavedLayoutWarmup } from "./layout-warmup";
9
9
  import { chatController } from "../../plugins/builtin/chat/controller";
10
10
  import { PLUGIN_MARKETPLACE_PANE_ID } from "../../plugins/marketplace/ids";
11
+ import { takePluginSeedNotice } from "../../plugins/seed-notice";
11
12
  import type { LoadedExternalPlugin } from "../../plugins/loader";
12
13
  import type { PluginRegistry } from "../../plugins/registry";
13
14
  import type {
@@ -38,6 +39,8 @@ const appLog = debugLog.createLogger("app");
38
39
 
39
40
  /** How long the restored panes wait for plugins that register theirs during setup. */
40
41
  const RESTORED_FUNCTIONS_WAIT_MS = 15_000;
42
+ /** Long enough to read what to install before it goes. */
43
+ const PLUGIN_SEED_NOTICE_MS = 12_000;
41
44
 
42
45
  /**
43
46
  * One function per pane placed in the layout: docked, floating and popped
@@ -203,6 +206,16 @@ export function useAppStartupRuntime({
203
206
  // identity, so this runs when initialization flips and not again.
204
207
  }, [externalPlugins, isDetachedWindow, pluginRegistry, state.initialized]);
205
208
 
209
+ // Official plugins the launch could not install (no git, offline) are
210
+ // otherwise simply missing. One notice, taken once, says which and why.
211
+ useEffect(() => {
212
+ if (!state.initialized || isDetachedWindow) return;
213
+ const notice = takePluginSeedNotice();
214
+ if (!notice) return;
215
+ appLog.warn("official plugins not installed at launch", { notice: notice.body });
216
+ pluginRegistry.notify({ ...notice, duration: PLUGIN_SEED_NOTICE_MS });
217
+ }, [isDetachedWindow, pluginRegistry, state.initialized]);
218
+
206
219
  // What people keep on screen: the functions open in the workspace restored
207
220
  // at launch, counted once per session. The layout is taken as restored,
208
221
  // before cloud sync can replace it; the first launch shows the default
@@ -49,7 +49,7 @@ function starPromptCopy(widgetRoom: number, openKey: string, dismissKey: string)
49
49
  + 1 + (dismissKey ? 1 + displayWidth(dismissKey) : 0)
50
50
  // The chip padding after the line.
51
51
  + 1;
52
- for (const lead of [t("Enjoying Gloomberb? Star it on GitHub"), t("Star on GitHub")]) {
52
+ for (const lead of [t("Enjoying Gloom? Star it on GitHub"), t("Star on GitHub")]) {
53
53
  const columns = displayWidth(STAR + lead) + keys;
54
54
  if (spare >= columns) return { lead, columns };
55
55
  }
@@ -163,7 +163,7 @@ function StarPromptLine({ delayMs = STAR_PROMPT_DELAY_MS, visibleMs = STAR_PROMP
163
163
  return (
164
164
  <Box flexDirection="row" flexShrink={0} paddingRight={1} data-gloom-role="star-prompt">
165
165
  <Button
166
- label={t("Star Gloomberb on GitHub")}
166
+ label={t("Star Gloom on GitHub")}
167
167
  variant="plain"
168
168
  compact
169
169
  shortcut={openKey || undefined}
@@ -16,15 +16,18 @@
16
16
  "src/cli/pane-functions/headless.ts": ["portfolio-list"],
17
17
  "src/cli/pane-functions/options.ts": ["ticker-detail"],
18
18
  "src/cli/pane-functions/resolver.ts": ["chart-composer"],
19
+ "src/cli/pane-functions/screenshot-bridge.ts": ["time-sales"],
20
+ "src/cli/pane-functions/screenshot-chart-evidence.ts": ["chart-composer"],
21
+ "src/cli/pane-functions/screenshot-data-evidence.ts": ["chart-composer","ticker-detail"],
19
22
  "src/cli/pane-functions/screenshot-evidence.ts": ["attention","awards","catalysts","company-attention","company-kpis","credit-documents","exposure","market-heatmap","options-calculator","options-scenario","power","realized-vol","supply-chain","vol-surface","volatility","world-venue-map"],
20
- "src/cli/pane-functions/screenshot.ts": ["chart-composer","econ-statistics","market-valuation","portfolio-list","ticker-detail","time-sales"],
23
+ "src/cli/pane-functions/screenshot-payload.ts": ["chart-composer","econ-statistics","market-valuation","portfolio-list","ticker-detail","time-sales"],
21
24
  "src/components/command-bar/commands/direct/index.ts": ["broker-manager"],
22
25
  "src/components/command-bar/routes/root/help-items.ts": ["help"],
23
26
  "src/components/command-bar/workflow/ops.ts": ["correlation","portfolio-list","ticker-detail"],
24
27
  "src/components/layout/shell/index.tsx": ["cloud"],
25
28
  "src/components/onboarding/use-onboarding-upgrade.ts": ["chat"],
26
29
  "src/layout/desks.ts": ["chart-composer"],
27
- "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","debt-maturities","dividend-yield","docs","doe","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","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","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-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","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","ticker-detail","time-sales","trace-bonds","treasury-auctions","treasury-daily","vol-surface","volatility","world-indices","world-venue-map","yield-curve"],
28
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"],
29
32
  "src/plugins/catalog.ts": ["debug"],
30
33
  "src/remote/controller.ts": ["custom-view"],
@@ -65,14 +65,14 @@
65
65
  "radius": 5,
66
66
  "spacing": 2
67
67
  },
68
- "why": "Chat has its own owner and conventions; reported, not changed (GLO-768)."
68
+ "why": "Chat has its own owner and conventions; reported, not changed."
69
69
  },
70
70
  "src/plugins/builtin/chat/content/handle-prompt.tsx": {
71
71
  "literals": {
72
72
  "font weight": 1,
73
73
  "spacing": 2
74
74
  },
75
- "why": "Chat has its own owner and conventions; reported, not changed (GLO-768)."
75
+ "why": "Chat has its own owner and conventions; reported, not changed."
76
76
  },
77
77
  "src/plugins/builtin/chat/message/pane-chip.tsx": {
78
78
  "literals": {
@@ -80,7 +80,7 @@
80
80
  "radius": 3,
81
81
  "spacing": 2
82
82
  },
83
- "why": "Chat has its own owner and conventions; reported, not changed (GLO-768)."
83
+ "why": "Chat has its own owner and conventions; reported, not changed."
84
84
  },
85
85
  "src/plugins/builtin/credit-documents/gauge.tsx": {
86
86
  "literals": {
@@ -26,7 +26,7 @@
26
26
  "measure": "inset",
27
27
  "value": 7.2,
28
28
  "component": "PaneSidebarRow",
29
- "why": "Chat has its own owner: its channel rows start 7px in (reported, not changed, in GLO-768)."
29
+ "why": "Chat has its own owner: its channel rows start 7px in (reported, not changed)."
30
30
  }
31
31
  ],
32
32
  "FXMD_REST_HEALTH": [
@@ -1,6 +1,7 @@
1
1
  import type { BrokerAdapter } from "../types/broker";
2
2
  import type { AppConfig, BrokerInstanceConfig } from "../types/config";
3
3
  import type { Portfolio, TickerPosition, TickerRecord } from "../types/ticker";
4
+ import type { BrokerAccount } from "../types/trading";
4
5
  import { buildBrokerPortfolioId, getBrokerInstance, isBrokerPortfolioId } from "../utils/broker-instances";
5
6
  import { isSignedInBrokerProfile } from "./signed-in/profile";
6
7
 
@@ -55,6 +56,42 @@ export function isHeldByOtherSignedInProfile(
55
56
  return !!owner && owner.id !== instance.id && isSignedInBrokerProfile(owner);
56
57
  }
57
58
 
59
+ /**
60
+ * The accounts `instance` reports that another enabled profile already holds
61
+ * under the account's own number, such as IBKR U1234567 synced on this device
62
+ * and linked through SnapTrade as well. That profile keeps the account, so its
63
+ * portfolio and positions appear once.
64
+ */
65
+ export function accountsHeldUnderOwnNumber(
66
+ config: AppConfig,
67
+ instance: BrokerInstanceConfig,
68
+ accounts: readonly BrokerAccount[],
69
+ ): Set<string> {
70
+ const held = new Set(config.portfolios.flatMap((portfolio) => {
71
+ if (!portfolio.brokerAccountId || portfolio.brokerInstanceId === instance.id) return [];
72
+ const owner = getBrokerInstance(config.brokerInstances, portfolio.brokerInstanceId);
73
+ return owner && owner.enabled !== false ? [portfolio.brokerAccountId.trim().toUpperCase()] : [];
74
+ }));
75
+ return new Set(accounts.flatMap((account) => {
76
+ const number = account.brokerageAccountId?.trim().toUpperCase();
77
+ return number && held.has(number) ? [account.accountId] : [];
78
+ }));
79
+ }
80
+
81
+ /**
82
+ * The accounts of `instance` to list: without those another enabled profile
83
+ * holds under their own number (`accountsHeldUnderOwnNumber`), so an account
84
+ * linked twice appears once wherever accounts are chosen or shown.
85
+ */
86
+ export function accountsShownFor(
87
+ config: AppConfig,
88
+ instance: BrokerInstanceConfig,
89
+ accounts: BrokerAccount[],
90
+ ): BrokerAccount[] {
91
+ const held = accountsHeldUnderOwnNumber(config, instance, accounts);
92
+ return held.size ? accounts.filter((account) => !held.has(account.accountId)) : accounts;
93
+ }
94
+
58
95
  /**
59
96
  * Who keeps a portfolio when the profile holding it is removed: another
60
97
  * enabled profile of the same broker that syncs the same account. Only a
@@ -57,6 +57,17 @@ export function brokerMethodSummary(entry: BrokerDirectoryEntry): string {
57
57
  return signsIn ? t("Sign in") : t("On this device");
58
58
  }
59
59
 
60
+ /**
61
+ * The method summary with what the broker says of itself, for a list that
62
+ * gives each broker a line under its name: "Sign in · Brokerages you link in
63
+ * SnapTrade" for one that is not itself a broker.
64
+ */
65
+ export function brokerDirectorySummary(entry: BrokerDirectoryEntry): string {
66
+ const described = entry.methods.find((method) => method.kind === "signed-in")?.broker.description?.trim();
67
+ const summary = brokerMethodSummary(entry);
68
+ return described ? `${summary} · ${described}` : summary;
69
+ }
70
+
60
71
  export function brokerMethodLabel(entry: BrokerDirectoryEntry, method: BrokerMethod): string {
61
72
  if (method.kind === "signed-in") {
62
73
  return entry.methods.some((candidate) => candidate.kind === "device") ? t("Sign in (recommended)") : t("Sign in");
@@ -15,11 +15,13 @@ function svg(markup: string): string {
15
15
 
16
16
  /**
17
17
  * The marks the official plugins ship as their icon, for the same brokers
18
- * when Gloom connects them, keyed by the backend's broker id.
18
+ * when Gloom connects them, keyed by the backend's broker id. SnapTrade has
19
+ * no plugin: its mark is from its own site, on white.
19
20
  */
20
21
  const SIGNED_IN_BROKER_LOGOS: Readonly<Record<string, string>> = {
21
22
  ibkr: svg('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><defs><linearGradient id="t" x1="0" y1="0" x2="0" y2="64" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#262626"/><stop offset="1" stop-color="#0F0F0F"/></linearGradient><linearGradient id="m" gradientUnits="userSpaceOnUse" x1="3633.335" y1="66.0445" x2="3671.0737" y2="66.0445" gradientTransform="matrix(-1 0 0 1 3673.7529 0)"><stop offset="0" stop-color="#D71F27"/><stop offset="1" stop-color="#971B1E"/></linearGradient></defs><rect width="64" height="64" fill="url(#t)"/><g transform="translate(20.4 8.2) scale(0.539)"><polygon points="40.4,86.8 2.7,86.8 2.7,45.3" fill="url(#m)"/><polygon points="40.4,1.5 2.7,45.3 2.7,86.8" fill="#D71F27"/><circle cx="35.2" cy="55.5" r="11.3" fill="#D71F27"/></g></svg>'),
22
23
  robinhood: svg('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect width="64" height="64" fill="#CCFF00"/><path transform="translate(14 14) scale(1.5)" d="M2.84 24h.53c.096 0 .192-.048.224-.128C7.591 13.696 11.94 8.656 14.67 5.638c.112-.128.064-.225-.096-.225h-4.88a.55.55 0 0 0-.45.225L5.746 9.972c-.514.642-.642 1.236-.642 2.086v4.43c-1.14 3.194-1.862 5.361-2.392 7.32-.032.125.016.192.129.192M20.447.646c-.754-.802-4.157-.834-5.73-.224a3 3 0 0 0-.786.465 41 41 0 0 0-3.323 3.178c-.112.113-.064.225.097.225h5.409c.497 0 .786.289.786.786v6.1c0 .16.128.208.225.064l3.258-4.254c.53-.69.69-.898.835-1.861.192-1.413.08-3.58-.77-4.479m-6.982 16.18 2.231-3.676a.7.7 0 0 0 .064-.29V6.73c0-.16-.112-.225-.224-.097-3.355 3.74-5.971 7.672-8.395 12.407-.06.12.016.225.16.177l5.009-1.54c.565-.174.882-.402 1.155-.852" fill="#1A1A1A"/></svg>'),
24
+ snaptrade: svg('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><defs><linearGradient id="a" x1="14" y1="-33.2" x2="39.35" y2="10.81" gradientUnits="userSpaceOnUse"><stop stop-color="#045856"/><stop offset="1" stop-color="#52C4C2"/></linearGradient><linearGradient id="b" x1="14.33" y1="34.34" x2="-24.58" y2="-4.39" gradientUnits="userSpaceOnUse"><stop stop-color="#E6960D"/><stop offset=".27" stop-color="#F2CA86"/></linearGradient><linearGradient id="c" x1="1.95" y1="33.87" x2="-32.55" y2="-6.92" gradientUnits="userSpaceOnUse"><stop stop-color="#E6960D"/><stop offset=".27" stop-color="#F2CA86"/></linearGradient></defs><rect width="64" height="64" fill="#FFFFFF"/><g transform="translate(12.4 10.45) scale(1.4)"><path d="M27.47 11.24 27.11 10.62 22.55 2.73C21.96 1.72 20.88 1.09 19.7 1.09H11.12C9.95 1.09 8.86 1.72 8.28 2.73L3.71 10.62 8.28 18.51C8.86 19.53 9.95 20.15 11.12 20.15H15.42L9.9 10.62 15.41 1.1 20.92 10.62 25.32 18.23 27.46 14.52C28.05 13.5 28.05 12.25 27.46 11.24Z" fill="url(#a)"/><path d="M24.21 20.15 19.64 12.26C19.06 11.25 17.97 10.62 16.8 10.62H12.5L18.01 20.15 12.5 29.69H16.8C17.97 29.69 19.06 29.06 19.64 28.05Z" fill="url(#b)"/><path d="M6.99 20.15 2.59 12.54.44 16.26C-.15 17.27-.15 18.52.44 19.54L.8 20.15 5.36 28.05C5.95 29.06 7.03 29.69 8.21 29.69H12.5L6.99 20.15Z" fill="url(#c)"/></g></svg>'),
23
25
  };
24
26
 
25
27
  /** The plugin icon of a broker adapter (`getBrokerLogo` on the plugin runtime). */