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
@@ -5,6 +5,10 @@ import { t, tf } from "../../../i18n";
5
5
  import { getManualPortfolioPositionPrefill, type ManualPortfolioPositionPrefill } from "../../../portfolio/manual-lots";
6
6
  import { isManualPortfolio, positionQuantityLabel, resolveManualPositionCurrency } from "../../../portfolio/mutations";
7
7
  import { futuresLotCurrency, isFuturesTicker } from "../../../portfolio/futures-positions";
8
+ import { sameCurrency } from "../../../portfolio/position-metrics";
9
+ import { resolvePortfolioTotalsCurrency } from "../../../portfolio/totals-currency";
10
+ import type { TickerPosition } from "../../../types/ticker";
11
+ import { DATE_FIELD_EXAMPLES } from "../../../utils/calendar-date";
8
12
  import { US_CENTS } from "../../../utils/currency-units";
9
13
 
10
14
  export interface SetPortfolioPositionWorkflowState {
@@ -24,12 +28,29 @@ interface ManualPortfolioPositionWorkflowOptions {
24
28
  hidePortfolioFieldWhenSingleOption?: boolean;
25
29
  }
26
30
 
31
+ /**
32
+ * What the Purchase Date and Cost FX fields start from for a holding: its
33
+ * date (several lots, their earliest) and the rate its cost was bought at
34
+ * into the portfolio's currency (several, weighted by cost). Saving them
35
+ * unchanged keeps what the lots have; a rate into another currency is kept
36
+ * without being shown.
37
+ */
38
+ export function positionCostTermsPrefill(position: TickerPosition | null | undefined, portfolioCurrency: string): { dateAcquired: string; costFx: string } {
39
+ const rate = position?.costFxRate;
40
+ const shown = typeof rate === "number" && Number.isFinite(rate) && rate > 0 && position?.costFxCurrency?.trim().toUpperCase() === portfolioCurrency;
41
+ // A cross rate carries float noise (0.012625500000000001): shown to ten digits, kept exact when left as it opened.
42
+ return { dateAcquired: position?.dateAcquired ?? "", costFx: shown ? String(Number(rate.toPrecision(10))) : "" };
43
+ }
44
+
27
45
  /** Several lots become one position on save: say so, and what the fields hold. */
28
46
  function lotsReplacementHint(prefill: ManualPortfolioPositionPrefill, portfolioName: string): string | undefined {
29
47
  if (prefill.lotCount < 2) return undefined;
30
48
  const params = { count: prefill.lotCount, portfolio: portfolioName };
49
+ if (prefill.position && prefill.costFxConflict) {
50
+ return tf("Totals of your {count} lots in \"{portfolio}\", bought at FX rates one position cannot keep: give its Cost FX or Purchase Date. Saving replaces them with one position.", params);
51
+ }
31
52
  if (prefill.position) {
32
- return tf("Totals of your {count} lots in \"{portfolio}\". Saving replaces them with one position and clears their acquisition dates.", params);
53
+ return tf("Totals of your {count} lots in \"{portfolio}\". Saving replaces them with one position, dated by the earliest.", params);
33
54
  }
34
55
  return prefill.currencies
35
56
  ? tf("{count} lots in \"{portfolio}\" are in different currencies ({currencies}), so none is filled in. Saving replaces them with one position.", {
@@ -56,6 +77,13 @@ function buildManualPortfolioPositionWorkflow(
56
77
  // A future's cost is typed as it is quoted, which for corn is cents: what a blank currency then saves.
57
78
  const contractCurrency = options.ticker && isFuturesTicker(options.ticker)
58
79
  && options.quoteCurrency?.trim().toUpperCase() === US_CENTS ? US_CENTS : undefined;
80
+ // What a blank currency saves, and the currency the portfolio values it in: the rate's units.
81
+ const blankCurrency = options.ticker
82
+ ? resolveManualPositionCurrency(undefined, options.ticker, preferredPortfolio, config.baseCurrency, contractCurrency)
83
+ : undefined;
84
+ const portfolioCurrency = resolvePortfolioTotalsCurrency(preferredPortfolio, config.baseCurrency);
85
+ const heldCurrency = (preferredPosition ? futuresLotCurrency(preferredPosition, contractCurrency) : undefined) ?? blankCurrency;
86
+ const costTerms = positionCostTermsPrefill(preferredPosition, portfolioCurrency);
59
87
 
60
88
  const fields: CommandBarWorkflowField[] = [
61
89
  ...(showPortfolioField ? [{
@@ -98,9 +126,28 @@ function buildManualPortfolioPositionWorkflow(
98
126
  type: "text",
99
127
  // What a blank field saves: the ticker's own currency before the
100
128
  // portfolio's. Without a ticker yet there is nothing true to show.
101
- placeholder: options.ticker
102
- ? resolveManualPositionCurrency(undefined, options.ticker, preferredPortfolio, config.baseCurrency, contractCurrency)
103
- : undefined,
129
+ placeholder: blankCurrency,
130
+ required: false,
131
+ },
132
+ {
133
+ id: "dateAcquired",
134
+ label: "Purchase Date",
135
+ type: "text",
136
+ placeholder: DATE_FIELD_EXAMPLES,
137
+ required: false,
138
+ },
139
+ {
140
+ id: "costFx",
141
+ label: "Cost FX",
142
+ type: "number",
143
+ // What a blank field saves, as `position set` without --cost-fx does.
144
+ placeholder: t("The purchase date's close, else today's rate"),
145
+ // The rate's units, in context: the portfolio's currency per unit of the holding's.
146
+ description: heldCurrency && sameCurrency(heldCurrency, portfolioCurrency)
147
+ ? t("Only for a holding in another currency than the portfolio's.")
148
+ : heldCurrency
149
+ ? tf("{portfolio} per {holding} when bought.", { portfolio: portfolioCurrency, holding: heldCurrency })
150
+ : tf("{portfolio} per unit of the holding's currency when bought.", { portfolio: portfolioCurrency }),
104
151
  required: false,
105
152
  },
106
153
  ];
@@ -116,6 +163,8 @@ function buildManualPortfolioPositionWorkflow(
116
163
  : "",
117
164
  // A corn lot saved before contract sizes, in dollars, is read in cents: saving the form unchanged keeps it so.
118
165
  currency: (preferredPosition ? futuresLotCurrency(preferredPosition, contractCurrency) : undefined) ?? "",
166
+ dateAcquired: costTerms.dateAcquired,
167
+ costFx: costTerms.costFx,
119
168
  };
120
169
 
121
170
  return {
@@ -158,8 +158,9 @@ export async function submitCommandBarWorkflow(options: {
158
158
  break;
159
159
  }
160
160
  case "add-portfolio": {
161
- const shares = coerceFieldString(route.values.shares).trim();
162
- if (!shares) {
161
+ // A purchase date or rate typed without a size is a position to set, whose missing size is then refused.
162
+ const position = ["shares", "dateAcquired", "costFx"].some((id) => coerceFieldString(route.values[id]).trim());
163
+ if (!position) {
163
164
  await collectionWorkflowActions.addTickerMembershipFromWorkflow(route.values);
164
165
  } else {
165
166
  await collectionWorkflowActions.setPortfolioPositionFromWorkflow(route.values);
@@ -1,3 +1,4 @@
1
+ import { indexRootSuggestion } from "../../../tickers/index-roots";
1
2
  import type { Dispatch } from "react";
2
3
  import type { AppAction, AppState } from "../../../state/app/context";
3
4
  import type { AppTickerRepositoryPort } from "../../../core/app-service-ports";
@@ -203,7 +204,10 @@ export async function resolveTickerInputOrThrow(
203
204
  ): Promise<ResolvedTickerInput> {
204
205
  const resolved = await resolveTickerInput(rawInput, activeTicker, collectionId, deps, { ...options, throwUnresolved: true });
205
206
  if (!resolved) {
206
- throw new Error(`No ticker match found for "${rawInput ?? activeTicker ?? ""}".`);
207
+ const typed = rawInput ?? activeTicker ?? "";
208
+ // A bare index root (VIX) is quoted as ^VIX, which the message offers.
209
+ const suggestion = indexRootSuggestion(typed.trim());
210
+ throw new Error(`No ticker match found for "${typed}".${suggestion ? ` ${suggestion}` : ""}`);
207
211
  }
208
212
  return resolved;
209
213
  }
@@ -1,8 +1,11 @@
1
+ import { createElement } from "react";
1
2
  import { Box, ImageSurface, Text, TextAttributes, useUiCapabilities } from "../ui";
2
3
  import { cloudLogoPath, type CloudLogoKind } from "../api-client/paths";
3
4
  import { getCloudApiBaseUrl } from "../api-client/request";
4
5
  import { resolveAssetDisplayKind } from "../market-data/market/format";
5
6
  import { colors } from "../theme/colors";
7
+ import type { DataTableCell } from "./ui/data-table";
8
+ import { LogoMark, type LogoMarkProps } from "./ui/logo-mark";
6
9
 
7
10
  export function resolveCompanyLogoSrc(input: {
8
11
  symbol: string;
@@ -14,6 +17,42 @@ export function resolveCompanyLogoSrc(input: {
14
17
  return path ? `${getCloudApiBaseUrl()}${path}` : null;
15
18
  }
16
19
 
20
+ /** What a row's logo stands for: a company's listing or a coin. */
21
+ export interface CompanyLogoSubject {
22
+ symbol: string;
23
+ /** `CRYPTO` draws the coin's logo; any other listing but cash and contracts, the company's. */
24
+ assetCategory?: string;
25
+ /** Its initial stands in while there is no logo; the symbol's without a name. */
26
+ name?: string | null;
27
+ }
28
+
29
+ /**
30
+ * A company's or a coin's logo on a `LogoMark` tile, on the desktop and the
31
+ * web: the logo Gloom Cloud serves for its ticker, and its initial on the
32
+ * same tile when there is none, so a missing logo moves nothing.
33
+ */
34
+ export function CompanyLogoMark({ symbol, assetCategory, name, size }: CompanyLogoSubject & Pick<LogoMarkProps, "size">) {
35
+ return createElement(LogoMark, {
36
+ src: resolveCompanyLogoSrc({ symbol, assetCategory }),
37
+ name: name?.trim() || symbol,
38
+ size,
39
+ plate: true,
40
+ });
41
+ }
42
+
43
+ /**
44
+ * The cell that names a company or a coin in a table, led by its logo on the
45
+ * desktop and the web (docs/pane-conventions.md, "Company and coin logos").
46
+ * The terminal gets the cell as it was, and exports read only its text.
47
+ */
48
+ export function withCompanyLogo(cell: DataTableCell, subject: CompanyLogoSubject | null | undefined, desktop: boolean): DataTableCell {
49
+ if (!desktop || !subject?.symbol) return cell;
50
+ return {
51
+ ...cell,
52
+ leading: createElement(CompanyLogoMark, { symbol: subject.symbol, assetCategory: subject.assetCategory, name: subject.name ?? cell.text }),
53
+ };
54
+ }
55
+
17
56
  export function CompanyLogo({
18
57
  symbol,
19
58
  assetCategory,
@@ -12,6 +12,8 @@ import type { DataTableSectionHeader } from "../ui/data-table";
12
12
 
13
13
  export interface TableSection<T> {
14
14
  label: string;
15
+ /** Tells apart two sections under one label (a month split by today); the label by default. */
16
+ key?: string;
15
17
  items: T[];
16
18
  /** Kept even with no items, to show the section exists. */
17
19
  emptyLabel?: string;
@@ -32,9 +34,9 @@ export function buildSectionedRows<T>(
32
34
  return sections.flatMap((section) => {
33
35
  if (section.items.length === 0 && !section.emptyLabel) return [];
34
36
  return [
35
- { kind: "section" as const, key: `section:${section.label}`, label: section.label, count: section.items.length },
37
+ { kind: "section" as const, key: `section:${section.key ?? section.label}`, label: section.label, count: section.items.length },
36
38
  ...(section.items.length === 0
37
- ? [{ kind: "empty" as const, key: `empty:${section.label}`, label: section.emptyLabel! }]
39
+ ? [{ kind: "empty" as const, key: `empty:${section.key ?? section.label}`, label: section.emptyLabel! }]
38
40
  : section.items.map((item) => ({ kind: "item" as const, key: getItemKey(item), item }))),
39
41
  ];
40
42
  });
@@ -74,7 +74,8 @@ export function ConfirmModalContent({
74
74
  pendingRef.current = false;
75
75
  if (!mountedRef.current) {
76
76
  // Closed while it ran: the inline error has nowhere to go.
77
- runtime.getDeps().pluginRegistry.notify({ body: errorMessage(failure), type: "error" });
77
+ if (confirm.onFailureAfterClose) confirm.onFailureAfterClose(failure);
78
+ else runtime.getDeps().pluginRegistry.notify({ body: errorMessage(failure), type: "error" });
78
79
  return;
79
80
  }
80
81
  setPending(false);
@@ -24,6 +24,11 @@ export interface ConfirmModalOptions {
24
24
  * when the confirm was closed before the work finished.
25
25
  */
26
26
  onSuccess?: () => void;
27
+ /**
28
+ * Says what `onConfirm` threw once the confirm was closed and cannot say it
29
+ * inline: on the row it concerns, say. A toast when missing.
30
+ */
31
+ onFailureAfterClose?: (failure: unknown) => void;
27
32
  }
28
33
 
29
34
  /**
@@ -7,6 +7,7 @@ import {
7
7
  getFocusedTickerSymbol,
8
8
  type AppState,
9
9
  } from "../../state/app/context";
10
+ import { commandPromptTicker } from "../../layout/selected-ticker";
10
11
  import type { CommandDef, PaneTemplateCreateOptions } from "../../types/plugin";
11
12
  import type { TickerRecord } from "../../types/ticker";
12
13
  import { buildPaneTemplateWorkflowRoute } from "../command-bar/pane-templates/workflow-route";
@@ -142,8 +143,10 @@ export function buildPaneTemplateFormRoute(
142
143
  ): FormRouteResult {
143
144
  const template = pluginRegistry.paneTemplates.get(templateId);
144
145
  if (!template) return { kind: "none" };
146
+ const requiresTicker = (template.shortcut?.argPlaceholder === "ticker" || template.shortcut?.argKind === "ticker")
147
+ && !template.shortcut?.argOptional;
145
148
  const route = buildPaneTemplateWorkflowRoute({
146
- activeTicker: getFocusedTickerSymbol(state),
149
+ activeTicker: (requiresTicker ? commandPromptTicker(state)?.symbol : null) ?? getFocusedTickerSymbol(state),
147
150
  arg,
148
151
  template,
149
152
  });
@@ -12,11 +12,11 @@ export { CompositeChart, pricePointsToResolvedSeries } from "./chart/composite";
12
12
  // Figures, then a chart, then a table: the header zone, its size rule at every
13
13
  // pane size, and the selection the chart and the table share.
14
14
  export {
15
- ChartStrip, ChartTableHeader, chartTableChromeRows, chartTableLayout, formatBpAxis, formatPercentAxis,
16
- spanAxisFormatter, spanDigits, useChartTableLayout, useChartTableSelection,
15
+ ChartRead, ChartStrip, ChartTableHeader, chartTableChromeRows, chartTableLayout, formatBpAxis, formatPercentAxis,
16
+ spanAxisFormatter, spanDigits, useChartReadRows, useChartTableLayout, useChartTableSelection,
17
17
  } from "./chart-table";
18
18
  export type {
19
- ChartBandMode, ChartStripSpec, ChartTableChart, ChartTableHeaderProps, ChartTableLayout,
19
+ ChartBandMode, ChartReadProps, ChartStripSpec, ChartTableChart, ChartTableHeaderProps, ChartTableLayout,
20
20
  ChartTableSelection,
21
21
  } from "./chart-table";
22
22
  export { scalarPoint, stackedSeries, staticSeries, type StackedLayer } from "./chart/static/series";
@@ -87,6 +87,11 @@ export { DataTableStackView } from "./data-table/stack-view";
87
87
  // table re-render on selection or scroll does not redo all of it.
88
88
  export { createRowValueCache } from "./ui/row-value-cache";
89
89
  export type { RowValueCache } from "./ui/row-value-cache";
90
+ // What the last action on one row came to, kept for that row until the next
91
+ // action on it or until its own status moves on (docs/pane-conventions.md,
92
+ // "Row messages"): its status cell says it, never the footer or a toast.
93
+ export { useRowNotes } from "./ui/row-notes";
94
+ export type { RowNotes } from "./ui/row-notes";
90
95
  export { FeedDataTableStackView } from "./feed-data-table/stack-view";
91
96
  export type { FeedDataTableItem } from "./feed-data-table/stack-view";
92
97
  export { activeStackIndex, sortStackItems } from "./feed-stack-controller";
@@ -128,7 +133,8 @@ export { MarkdownText } from "./markdown-text";
128
133
  // this file is the public `gloomberb/components` surface: a kit component
129
134
  // reaches plugins only once it is added here.
130
135
  export {
131
- ActionRow, Badge, BulletList, Button, ButtonActionScope, Card, Checkbox, ChoiceDialog, ColumnGrid, ColumnGridPair, ConfirmDialog, confirmDialog, DataTable,
136
+ ActionRow, Badge, BulletList, Button, ButtonActionScope, Card, Checkbox, ChoiceDialog, ColumnGrid, ColumnGridPair, ConfirmDialog, confirmDialog,
137
+ COUNTRY_FLAG_CELLS, CountryFlag, CountryFlagLead, DataTable,
132
138
  DetailScrollBody, DialogFrame, DisclosureMarker, Divider, EmptyState, ExternalLink, ExternalLinkText, FieldGrid, FieldLabel,
133
139
  fieldFrameStyle, fieldGridColumns, FRAMED_TEXTAREA_DESKTOP_STYLE, fieldGridRows, FigureList, getMessageComposerBlockHeight, GridFieldView, Icon, ICON_GLYPHS,
134
140
  IconButton, InlineQuickAddRow, KeyValueRow, ListView, loadingText, Menu, MenuPopover,
@@ -136,11 +142,11 @@ export {
136
142
  NumberPromptDialog, openUrl, PageStackView, PaneLinkMenu, PaneStatusBody, Popover, Prose,
137
143
  QueryBar, RangeTrack, RatioBar, READING_WIDTH, RemoteImage, Section, SectionHeading, SegmentedControl, SelectButton, ShortcutHint,
138
144
  Spinner, StatGrid, statGridColumns, statGridRows, Tabs, TextField, TextPromptDialog, unavailableText,
139
- useFieldRing, usePaneLinkMenuEntry, useQueryBarSearch,
145
+ useFieldRing, usePaneLinkMenuEntry, useQueryBarSearch, withCountryFlag, withFlagRoom,
140
146
  } from "./ui";
141
147
  export type {
142
148
  ActionRowProps, BadgeProps, BulletListProps, ButtonProps, ButtonVariant, CardProps, CheckboxProps, ChoiceDialogChoice, ColumnGridCell,
143
- ColumnGridColumn, ColumnGridPairProps, ColumnGridProps, ConfirmDialogOptions,
149
+ ColumnGridColumn, ColumnGridLink, ColumnGridPairProps, ColumnGridProps, ConfirmDialogOptions, CountryFlagProps,
144
150
  DataTableCell, DataTableColumn, DataTableProps, DataTableVisibleRange, DetailScrollBodyProps, DialogFrameProps,
145
151
  DisclosureMarkerProps, DividerProps, EmptyStateProps, FieldGridProps, FieldLabelProps, FieldRing, FieldRingOptions,
146
152
  FigureListItem, FigureListProps, GridField,
@@ -412,7 +412,7 @@ function resolveUpdateStatusView({
412
412
  if (updateAvailable.updateAction.kind === "managed") {
413
413
  return {
414
414
  kind: "text",
415
- text: tf("v{version} available, update through the package manager that installed Gloomberb", {
415
+ text: tf("v{version} available, update through the package manager that installed Gloom", {
416
416
  version: updateAvailable.version,
417
417
  }),
418
418
  };
@@ -780,7 +780,7 @@ function HeaderMarketSummary({ nativePaneChrome, width }: { nativePaneChrome: bo
780
780
  const summary = useMarketSummary();
781
781
  const fit = resolveMarketSummaryFit({
782
782
  available: width,
783
- baseCurrencyWidth: summary.baseCurrency.length + 1,
783
+ baseCurrencyWidth: displayWidth(summary.baseCurrencyLabel) + 1,
784
784
  countdownWidth: summary.marketLabel.length - summary.marketLabelShort.length,
785
785
  spyWidth: summary.spyText.length + 1,
786
786
  stateWidth: summary.marketLabelShort ? summary.marketLabelShort.length + 1 : 0,
@@ -790,20 +790,20 @@ function HeaderMarketSummary({ nativePaneChrome, width }: { nativePaneChrome: bo
790
790
  return (
791
791
  <>
792
792
  {fit.showState && marketLabel ? (
793
- <Box paddingRight={1} flexShrink={0}>
793
+ <Box paddingRight={1} flexShrink={0} data-gloom-role="header-market">
794
794
  <Text fg={summary.marketColor} {...(nativePaneChrome ? { attributes: TextAttributes.BOLD } : {})}>
795
795
  {marketLabel}
796
796
  </Text>
797
797
  </Box>
798
798
  ) : null}
799
799
  {fit.showSpy ? (
800
- <Box paddingRight={1} flexShrink={0}>
800
+ <Box paddingRight={1} flexShrink={0} data-gloom-role="header-market">
801
801
  <Text fg={summary.spyColor}>{summary.spyText}</Text>
802
802
  </Box>
803
803
  ) : null}
804
804
  {fit.showBaseCurrency ? (
805
805
  <Box paddingRight={1} flexShrink={0}>
806
- <Text fg={nativePaneChrome ? colors.textDim : blendHex(colors.headerText, colors.header, 0.42)}>{summary.baseCurrency}</Text>
806
+ <Text fg={nativePaneChrome ? colors.textDim : blendHex(colors.headerText, colors.header, 0.42)}>{summary.baseCurrencyLabel}</Text>
807
807
  </Box>
808
808
  ) : null}
809
809
  </>
@@ -845,15 +845,16 @@ export function Header({
845
845
  const { nativePaneChrome = false, titleBarOverlay, nativeWindowChrome = titleBarOverlay, windowControls } = useUiCapabilities();
846
846
  const showWindowControls = nativeWindowChrome && windowControls === "windows";
847
847
  const windowFullscreen = useWindowFullscreen();
848
+ const updateStatus = useUpdateStatus(!!onRestartForUpdate);
848
849
  const prompt = resolveHeaderPromptGeometry({
849
850
  nativePaneChrome,
850
851
  nativeWindowChrome,
851
852
  termWidth,
852
853
  titleBarOverlay,
853
854
  windowFullscreen,
855
+ allowMarketExpansion: !updateStatus.view,
854
856
  });
855
857
  const shortcutLabel = useCommandBarShortcut();
856
- const updateStatus = useUpdateStatus(!!onRestartForUpdate);
857
858
  // The terminal lays the header out by cell counts, so it works out what is left
858
859
  // for the update status once the Help pill and the slot's padding are paid for.
859
860
  let updateStatusColumns = Math.max(
@@ -4,12 +4,12 @@ import { useThemeColors } from "../../theme/theme-context";
4
4
  import { useAppVisible } from "../../state/app/activity";
5
5
  import { useAppSelector } from "../../state/app/context";
6
6
  import { getSharedMarketDataCoordinator } from "../../market-data/coordinator";
7
- import { t } from "../../i18n";
7
+ import { t, tf } from "../../i18n";
8
8
  import { useQuoteEntry, useResolvedEntryValue } from "../../market-data/hooks";
9
9
  import { useQuoteStreaming } from "../../state/hooks/quote-streaming";
10
10
  import type { QuoteSubscriptionTarget } from "../../types/data-provider";
11
11
  import { formatPercentRaw } from "../../utils/format";
12
- import { formatMarketPrice, liveQuoteFormatOptions } from "../../market-data/market/format";
12
+ import { formatMarketPriceWithCurrency, liveQuoteFormatOptions } from "../../market-data/market/format";
13
13
  import { getSessionMoveDisplay, marketStateColor, marketStateCountdown, marketStateLabel } from "../../market-data/market/status";
14
14
  import type { Quote } from "../../types/financials";
15
15
 
@@ -33,7 +33,8 @@ const SPY_STREAM_TARGETS: QuoteSubscriptionTarget[] = [{
33
33
  }];
34
34
 
35
35
  export interface MarketSummary {
36
- baseCurrency: string;
36
+ /** The base currency under its own label (base THB), so it never reads as the unit of SPY's price beside it. */
37
+ baseCurrencyLabel: string;
37
38
  marketColor: string;
38
39
  /** Market state with its countdown, when the state has one. */
39
40
  marketLabel: string;
@@ -83,6 +84,8 @@ export function resolveMarketSummaryFit(options: {
83
84
  * it, as `ticker SPY` headlines them. While a pre-market or after-hours
84
85
  * session is open (PRE-MKT, AFTER-HRS) the slot is that session's print and
85
86
  * its move from the close, so the figure is the session the label names.
87
+ * The price carries its currency's sign ($), so the base currency label
88
+ * after it is never read as its unit.
86
89
  */
87
90
  export function spySummary(quote: Quote | null | undefined, colors: ThemeColors): Pick<MarketSummary, "spyColor" | "spyText"> {
88
91
  const display = getSessionMoveDisplay(quote);
@@ -91,7 +94,7 @@ export function spySummary(quote: Quote | null | undefined, colors: ThemeColors)
91
94
  return {
92
95
  spyColor: display?.change != null ? priceColor(display.change, colors) : colors.textDim,
93
96
  spyText: display
94
- ? `SPY ${formatMarketPrice(display.price, liveQuoteFormatOptions(quote, quote?.currency, "ETF"))} ${formatPercentRaw(display.changePercent).padStart(6)}`
97
+ ? `SPY ${formatMarketPriceWithCurrency(display.price, quote?.currency || "USD", liveQuoteFormatOptions(quote, quote?.currency, "ETF"))} ${formatPercentRaw(display.changePercent).padStart(6)}`
95
98
  : "SPY —",
96
99
  };
97
100
  }
@@ -137,11 +140,11 @@ export function useMarketSummary(): MarketSummary {
137
140
  const mktCountdown = mktState ? marketStateCountdown(mktState, now) : null;
138
141
  const marketLabelShort = mktState ? t(marketStateLabel(mktState)) : "";
139
142
  const marketLabel = marketLabelShort && mktCountdown
140
- ? `${marketLabelShort} · ${mktCountdown}`
143
+ ? `${marketLabelShort} · ${mktCountdown}${mktState === "PRE" ? ` ${t("to regular open")}` : ""}`
141
144
  : marketLabelShort;
142
145
 
143
146
  return {
144
- baseCurrency,
147
+ baseCurrencyLabel: tf("base {currency}", { currency: baseCurrency }),
145
148
  marketColor: mktState ? marketStateColor(mktState, colors) : colors.textDim,
146
149
  marketLabel,
147
150
  marketLabelShort,
@@ -1,7 +1,7 @@
1
1
  import { createContext, useContext } from "react";
2
2
 
3
3
  /**
4
- * True inside a `gloomberb shot` whose status line dates the pane's data: the
4
+ * True inside a `gloom shot` whose status line dates the pane's data: the
5
5
  * pane's own `as of` text (a query bar's `asOf`) is left out, so the date is
6
6
  * said once. False everywhere else.
7
7
  */
@@ -38,7 +38,7 @@ export interface PaneFooterSegment {
38
38
  asOf?: boolean;
39
39
  /**
40
40
  * The segment only says how current the pane's quotes are (`2026-10-09 ·
41
- * 15m delayed`), which a `gloomberb shot` status line says too: a shot whose
41
+ * 15m delayed`), which a `gloom shot` status line says too: a shot whose
42
42
  * line states its data's date and delay leaves it out.
43
43
  */
44
44
  quoteStatus?: boolean;
@@ -165,7 +165,12 @@ export interface CombinedPaneFooter {
165
165
 
166
166
  export const EMPTY_FOOTER: CombinedPaneFooter = { info: [], hints: [], menu: [], keys: [] };
167
167
 
168
- /** Status the hints leave room for, more when it is a warning: a failure must stay readable. */
168
+ /**
169
+ * Status the hints leave room for, more when it is a warning: a failure must
170
+ * stay readable. A status no longer than the warning's room is kept whole,
171
+ * with the hints that no longer fit under More, so a status word is never cut
172
+ * against them ("Cloud sync d [a]dd event"); a longer one gives way to the hints.
173
+ */
169
174
  const INFO_FLOOR_CHARS = 10;
170
175
  const WARNING_FLOOR_CHARS = 24;
171
176
  const HINT_GAP = 1;
@@ -264,9 +269,10 @@ export function layoutPaneFooterHintRow(
264
269
  const width = Math.max(0, Math.floor(contentWidth));
265
270
  const hints = footer.hints.filter((hint) => !hint.disabled);
266
271
  const warning = footer.info.some((segment) => segment.parts.some((part) => part.tone === "warning" || part.tone === "negative"));
267
- const textFloor = footer.info.length > 0
268
- ? Math.min(warning ? WARNING_FLOOR_CHARS : INFO_FLOOR_CHARS, infoTextWidth(footer.info))
269
- : 0;
272
+ const infoChars = infoTextWidth(footer.info);
273
+ const textFloor = footer.info.length === 0 ? 0
274
+ : warning || infoChars <= WARNING_FLOOR_CHARS ? Math.min(WARNING_FLOOR_CHARS, infoChars)
275
+ : INFO_FLOOR_CHARS;
270
276
  const infoFloor = Math.min(width, Math.max(iconReserve, textFloor));
271
277
  const hintBudget = Math.max(0, width - infoFloor - (infoFloor > 0 && hints.length > 0 ? 1 : 0));
272
278
  const more = moreControl(hintBudget);
@@ -15,11 +15,11 @@ const HEADER_PROMPT_COMFORT_WIDTH = 48;
15
15
  const COMMAND_SURFACE_MIN_WIDTH = { native: 46, terminal: 42 };
16
16
 
17
17
  /**
18
- * The market cluster's reserve at the header's right edge, widest first. Each
19
- * step is the worst case for what it shows, so a ticking countdown or a longer
20
- * state label can never push the cluster past its columns:
18
+ * Market budgets used to size the command prompt, widest first. These stay
19
+ * independent of label wording so a longer countdown cannot resize the prompt
20
+ * or the sheet attached to it:
21
21
  *
22
- * 42 PRE-MKT · 5h 30m SPY 1,234.56 -10.60% USD
22
+ * 42 state, SPY, currency and a short countdown
23
23
  * 31 the state label and SPY
24
24
  * 21 SPY alone
25
25
  *
@@ -29,6 +29,11 @@ const COMMAND_SURFACE_MIN_WIDTH = { native: 46, terminal: 42 };
29
29
  * columns to add the base currency, the one value here that barely moves.
30
30
  */
31
31
  const HEADER_MARKET_TIERS = [42, 31, 21] as const;
32
+ /**
33
+ * Full pre-market label, including "to regular open", when spare room allows:
34
+ * "PRE-MKT · 1h 17m to regular open SPY $762.43 -0.60% base USD" with room to spare.
35
+ */
36
+ const HEADER_MARKET_FULL_COLUMNS = 64;
32
37
 
33
38
  /**
34
39
  * Update status is transient, so on a narrow header it gives most of its
@@ -94,6 +99,8 @@ export function resolveHeaderPromptGeometry(options: {
94
99
  platform?: string;
95
100
  titleBarOverlay?: boolean;
96
101
  windowFullscreen?: boolean;
102
+ /** An active update status keeps its spare room ahead of a longer market label. */
103
+ allowMarketExpansion?: boolean;
97
104
  }): HeaderPromptGeometry {
98
105
  const { nativePaneChrome, platform, termWidth, titleBarOverlay, windowFullscreen } = options;
99
106
  const nativeWindowChrome = options.nativeWindowChrome ?? titleBarOverlay;
@@ -102,13 +109,19 @@ export function resolveHeaderPromptGeometry(options: {
102
109
  : 0;
103
110
  const left = leadingInset + 1;
104
111
  const updateReserve = headerPromptUpdateColumns(termWidth);
105
- const marketColumns = headerMarketColumns(termWidth, left, updateReserve);
112
+ const marketReserve = headerMarketColumns(termWidth, left, updateReserve);
106
113
  const width = Math.max(
107
114
  HEADER_PROMPT_MIN_WIDTH,
108
115
  Math.min(
109
116
  resolveCommandSurfaceWidth({ nativePaneChrome, termWidth }),
110
- termWidth - left - updateReserve - marketColumns,
117
+ termWidth - left - updateReserve - marketReserve,
111
118
  ),
112
119
  );
120
+ // Spend only space left after the prompt and update reserve have their room.
121
+ // The longer market label gives way before either can lose a column.
122
+ const marketColumns = options.allowMarketExpansion !== false
123
+ && termWidth - left - width - updateReserve >= HEADER_MARKET_FULL_COLUMNS
124
+ ? HEADER_MARKET_FULL_COLUMNS
125
+ : marketReserve;
113
126
  return { left, width, marketColumns, updateColumns: Math.max(0, termWidth - left - width - marketColumns) };
114
127
  }
@@ -847,7 +847,7 @@ export function Shell({
847
847
  justifyContent="center"
848
848
  >
849
849
  <Box flexDirection="column" alignItems="center">
850
- <AsciiText text="Gloomberb" font="wordmark" color={colors.textMuted} />
850
+ <AsciiText text="Gloom" font="wordmark" color={colors.textMuted} />
851
851
  <Box height={1} />
852
852
  {/* An empty layout starts at the command bar: a click opens it, the key is beside it. */}
853
853
  <Button
@@ -881,6 +881,7 @@ export function Shell({
881
881
  dockDividerLayouts={dockDividerLayouts}
882
882
  dockLeafLayouts={dockLeafLayouts}
883
883
  focusedPaneId={focusedPaneId}
884
+ floatingOrder={activeLayout.floating}
884
885
  getPaneTitle={getPaneTitle}
885
886
  getPaneQuickSettings={getPaneQuickSettings}
886
887
  handleFloatingClose={handleFloatingClose}
@@ -34,6 +34,8 @@ interface ShellPaneLayersProps {
34
34
  dockDividerLayouts: DockDividerLayout[];
35
35
  dockLeafLayouts: DockLeafLayout[];
36
36
  focusedPaneId: string | null;
37
+ /** Saved insertion order, independent of which floating window is in front. */
38
+ floatingOrder: readonly { instanceId: string }[];
37
39
  getPaneTitle: (pane: ResolvedPane) => string;
38
40
  getPaneQuickSettings: (paneId: string) => PaneHeaderQuickSetting[];
39
41
  handleFloatingClose: (paneId: string) => void;
@@ -588,6 +590,7 @@ export function ShellPaneLayers({
588
590
  dockDividerLayouts,
589
591
  dockLeafLayouts,
590
592
  focusedPaneId,
593
+ floatingOrder,
591
594
  getPaneTitle,
592
595
  getPaneQuickSettings,
593
596
  handleFloatingClose,
@@ -691,6 +694,21 @@ export function ShellPaneLayers({
691
694
  dividerDragStart: (divider, event) => handlersRef.current.startNativeDividerDrag(divider, event),
692
695
  }), []);
693
696
 
697
+ // DOM z-index already stacks the windows. Reordering their React children
698
+ // as focus changes detaches/reinserts the existing DOM nodes, resetting every
699
+ // nested scrollport to zero without a scroll event. A windowed list then
700
+ // paints its old tail into an empty viewport. Keep insertion order on the
701
+ // desktop/web, including the saved order for equal z-indices. The terminal
702
+ // still draws back to front.
703
+ const floatingLayers = useMemo(() => {
704
+ if (!nativePaneChrome) return visibleFloatingPanes;
705
+ const byId = new Map(visibleFloatingPanes.map((entry) => [entry.pane.instance.instanceId, entry]));
706
+ return floatingOrder.flatMap(({ instanceId }) => {
707
+ const entry = byId.get(instanceId);
708
+ return entry ? [entry] : [];
709
+ });
710
+ }, [floatingOrder, nativePaneChrome, visibleFloatingPanes]);
711
+
694
712
  const layerProps = (pane: ResolvedPane, rect: LayoutBounds): PaneLayerProps => {
695
713
  const paneId = pane.instance.instanceId;
696
714
  const focused = focusedPaneId === paneId && (!overlayOpen || menuPaneId === paneId);
@@ -729,7 +747,7 @@ export function ShellPaneLayers({
729
747
  );
730
748
  })}
731
749
 
732
- {visibleFloatingPanes.map(({ pane, rect }) => {
750
+ {floatingLayers.map(({ pane, rect }) => {
733
751
  if (transientFocusActive && pane.instance.instanceId !== transientFocusPaneId) return null;
734
752
  return (
735
753
  <FloatingPaneLayer
@@ -466,7 +466,7 @@ function NativeStatusBar({
466
466
  <Box flexGrow={1} minWidth={0} />
467
467
  <StatusBarSummary nativePaneChrome {...props} />
468
468
  {/* Widgets keep their width; the layout tabs give way instead. */}
469
- <Box flexShrink={0} flexDirection="row" alignItems="center">
469
+ <Box flexShrink={0} flexDirection="row" alignItems="center" data-gloom-role="status-widgets">
470
470
  <PluginSlot name="status:widget" />
471
471
  </Box>
472
472
  <StatusBarFeedback nativePaneChrome {...props} />
@@ -592,7 +592,7 @@ function StatusBarSummary({
592
592
  onPress={() => { void rendererHost.openExternal(DESKTOP_DOWNLOAD_URL); }}
593
593
  role="link"
594
594
  setHoveredControl={setHoveredControl}
595
- title={t("Get Gloomberb for Mac or Windows")}
595
+ title={t("Get Gloom for Mac or Windows")}
596
596
  />
597
597
  )}
598
598
  </>