gloomberb 0.18.2 → 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 (954) 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/patches/electrobun@1.18.1.patch +106 -5
  6. package/src/account/checkout-handoff.tsx +225 -0
  7. package/src/account/device-signin-dialog.tsx +2 -2
  8. package/src/account/device-signin.ts +2 -2
  9. package/src/account/upgrade-dialog.tsx +1 -1
  10. package/src/api-client/askg.ts +2 -2
  11. package/src/api-client/auth.ts +2 -2
  12. package/src/api-client/central-bank-rates.ts +6 -0
  13. package/src/api-client/collections.ts +5 -1
  14. package/src/api-client/cot.ts +2 -0
  15. package/src/api-client/crypto-etf-flows.ts +37 -0
  16. package/src/api-client/crypto-markets.ts +60 -0
  17. package/src/api-client/data.ts +99 -5
  18. package/src/api-client/doe.ts +15 -0
  19. package/src/api-client/equity-screener.ts +28 -0
  20. package/src/api-client/exchange-announcements.ts +38 -0
  21. package/src/api-client/fund-facts.ts +39 -0
  22. package/src/api-client/futures-curve.ts +9 -1
  23. package/src/api-client/hiring.ts +301 -0
  24. package/src/api-client/index.ts +24 -5
  25. package/src/api-client/market-discovery.ts +14 -0
  26. package/src/api-client/members.ts +6 -0
  27. package/src/api-client/mna.ts +6 -0
  28. package/src/api-client/paths.ts +18 -1
  29. package/src/api-client/request.ts +26 -7
  30. package/src/api-client/short-side-publications.ts +37 -0
  31. package/src/api-client/socket.ts +64 -4
  32. package/src/api-client/swap-curve.ts +35 -0
  33. package/src/api-client/telemetry.ts +17 -0
  34. package/src/api-client/themes.ts +7 -1
  35. package/src/api-client/types.ts +90 -2
  36. package/src/app/global-shortcuts.ts +1 -16
  37. package/src/app/pane-runtime/plugin-bindings.ts +9 -2
  38. package/src/app/runtime/desktop-deeplink.ts +5 -5
  39. package/src/app/runtime/plugin-bindings.ts +2 -2
  40. package/src/app/runtime/startup.ts +13 -0
  41. package/src/app/runtime/update.ts +28 -8
  42. package/src/app/star-prompt/status-line.tsx +2 -2
  43. package/src/architecture/core-builtin-allowlist.json +5 -2
  44. package/src/architecture/pane-tabs-allowlist.json +65 -0
  45. package/src/architecture/ui-literals-allowlist.json +3 -3
  46. package/src/architecture/ui-tokens-allowlist.json +1 -1
  47. package/src/brokers/broker-portfolio-sync.ts +37 -0
  48. package/src/brokers/directory.ts +11 -0
  49. package/src/brokers/logos.ts +3 -1
  50. package/src/brokers/signed-in/adapter.ts +304 -26
  51. package/src/brokers/signed-in/client.ts +14 -2
  52. package/src/brokers/signed-in/connect.ts +10 -2
  53. package/src/brokers/sync-broker-instance.ts +9 -1
  54. package/src/capabilities/chart-series.ts +22 -6
  55. package/src/cli/bank-section.ts +1 -1
  56. package/src/cli/base-converter.ts +23 -14
  57. package/src/cli/central-bank-events.ts +1 -1
  58. package/src/cli/command-options.ts +59 -4
  59. package/src/cli/commands/api.ts +9 -6
  60. package/src/cli/commands/broker.ts +2 -2
  61. package/src/cli/commands/command-utils.ts +2 -2
  62. package/src/cli/commands/crypto-hints.ts +7 -20
  63. package/src/cli/commands/fred-series.ts +4 -2
  64. package/src/cli/commands/keybindings.ts +2 -2
  65. package/src/cli/commands/market.ts +1189 -296
  66. package/src/cli/commands/news-hints.ts +2 -2
  67. package/src/cli/commands/news-search.ts +59 -6
  68. package/src/cli/commands/options-leaps.ts +41 -26
  69. package/src/cli/commands/overview.ts +121 -48
  70. package/src/cli/commands/plugins.ts +9 -9
  71. package/src/cli/commands/remote.ts +13 -10
  72. package/src/cli/commands/search.ts +64 -44
  73. package/src/cli/commands/system.ts +27 -19
  74. package/src/cli/commands/themes.ts +1 -1
  75. package/src/cli/commands/ticker.ts +272 -70
  76. package/src/cli/context.ts +3 -2
  77. package/src/cli/desktop-pane-shot-view.ts +2 -2
  78. package/src/cli/desktop-pane-shot.ts +1 -1
  79. package/src/cli/earnings-calendar.ts +4 -4
  80. package/src/cli/entry.ts +18 -1
  81. package/src/cli/errors.ts +20 -2
  82. package/src/cli/exit-codes.ts +1 -1
  83. package/src/cli/export-source.ts +10 -4
  84. package/src/cli/freshness.ts +2 -8
  85. package/src/cli/fx-forward.ts +130 -0
  86. package/src/cli/fx-pair.ts +10 -9
  87. package/src/cli/glossary.ts +64 -20
  88. package/src/cli/help.ts +20 -14
  89. package/src/cli/history-export.ts +126 -0
  90. package/src/cli/history-rows.ts +196 -43
  91. package/src/cli/index-roots.ts +5 -45
  92. package/src/cli/index.ts +32 -18
  93. package/src/cli/issuer-membership.ts +103 -0
  94. package/src/cli/known-gaps.ts +118 -25
  95. package/src/cli/listing-arg.ts +315 -43
  96. package/src/cli/name-entries.ts +73 -22
  97. package/src/cli/native-smoke.ts +2 -0
  98. package/src/cli/not-a-ticker.ts +19 -9
  99. package/src/cli/opentui-libc.ts +5 -0
  100. package/src/cli/options.ts +12 -0
  101. package/src/cli/pane-functions/capabilities.ts +77 -20
  102. package/src/cli/pane-functions/catalog.ts +40 -23
  103. package/src/cli/pane-functions/discovery.ts +1 -1
  104. package/src/cli/pane-functions/dom.ts +12 -8
  105. package/src/cli/pane-functions/financial-ratio-shot.ts +2 -2
  106. package/src/cli/pane-functions/freshness.ts +174 -23
  107. package/src/cli/pane-functions/function-help.ts +66 -27
  108. package/src/cli/pane-functions/headless.ts +48 -16
  109. package/src/cli/pane-functions/index.ts +82 -21
  110. package/src/cli/pane-functions/options.ts +22 -2
  111. package/src/cli/pane-functions/report-notices.ts +12 -4
  112. package/src/cli/pane-functions/report.ts +5 -5
  113. package/src/cli/pane-functions/resolver.ts +65 -14
  114. package/src/cli/pane-functions/screenshot-assessment.ts +322 -0
  115. package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
  116. package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
  117. package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
  118. package/src/cli/pane-functions/screenshot-evidence.ts +1 -1
  119. package/src/cli/pane-functions/screenshot-payload.ts +453 -0
  120. package/src/cli/pane-functions/screenshot-render.ts +316 -0
  121. package/src/cli/pane-functions/screenshot-types.ts +162 -0
  122. package/src/cli/pane-functions/shot-options.ts +8 -3
  123. package/src/cli/peso-dollar-rates.ts +79 -0
  124. package/src/cli/quote-answer.ts +38 -3
  125. package/src/cli/report-tables.ts +190 -27
  126. package/src/cli/restore-plugins.ts +29 -14
  127. package/src/cli/result.ts +122 -25
  128. package/src/cli/series-search.ts +5 -5
  129. package/src/cli/statement-filings.ts +19 -0
  130. package/src/cli/suffixed-listing-rows.ts +49 -0
  131. package/src/cli/symbol-args.ts +50 -15
  132. package/src/cli/symbol-cells.ts +120 -0
  133. package/src/cli/symbol-list.ts +226 -60
  134. package/src/cli/symbol-rows.ts +131 -25
  135. package/src/cli/ticker-resolution.ts +108 -11
  136. package/src/cli/treasury-yields.ts +5 -5
  137. package/src/cli/types.ts +2 -0
  138. package/src/cli/uncovered-instrument.ts +3 -3
  139. package/src/cli/unknown-command.ts +6 -6
  140. package/src/components/chart/composite/chart-layout.ts +131 -0
  141. package/src/components/chart/composite/composite-chart.tsx +387 -21
  142. package/src/components/chart/composite/drawing-store.ts +26 -6
  143. package/src/components/chart/composite/interactions.ts +9 -3
  144. package/src/components/chart/composite/legend.tsx +75 -3
  145. package/src/components/chart/composite/levels.ts +5 -0
  146. package/src/components/chart/composite/panel-gestures.ts +41 -0
  147. package/src/components/chart/composite/panel-labels.ts +2 -1
  148. package/src/components/chart/composite/panel-surface.tsx +316 -11
  149. package/src/components/chart/composite/price-axis-labels.tsx +27 -3
  150. package/src/components/chart/composite/rasterizer.ts +44 -19
  151. package/src/components/chart/composite/scene.ts +16 -4
  152. package/src/components/chart/composite/text-renderer.ts +48 -21
  153. package/src/components/chart/composite/toolbar.tsx +52 -5
  154. package/src/components/chart/composite/types.ts +19 -0
  155. package/src/components/chart/composite/use-composite-chart-keyboard.ts +120 -13
  156. package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
  157. package/src/components/chart/composite/use-composite-viewport.ts +12 -3
  158. package/src/components/chart/composite/value-scale.ts +149 -0
  159. package/src/components/chart/composite/volume-profile-paint.ts +6 -3
  160. package/src/components/chart/core/pointer.ts +2 -0
  161. package/src/components/chart-table/index.ts +2 -0
  162. package/src/components/chart-table/read.tsx +74 -0
  163. package/src/components/command-bar/commands/collection-list.ts +41 -19
  164. package/src/components/command-bar/commands/collection.ts +9 -3
  165. package/src/components/command-bar/commands/direct/index.ts +1 -1
  166. package/src/components/command-bar/commands/direct/runtime.ts +3 -2
  167. package/src/components/command-bar/pane-templates/items.ts +59 -6
  168. package/src/components/command-bar/pane-templates/workflow.ts +10 -1
  169. package/src/components/command-bar/routes/root/command-items.ts +32 -6
  170. package/src/components/command-bar/routes/root/plugin-install.ts +1 -1
  171. package/src/components/command-bar/routes/root/provider-search.ts +42 -11
  172. package/src/components/command-bar/routes/root/results.ts +18 -4
  173. package/src/components/command-bar/routes/root/runtime.ts +15 -3
  174. package/src/components/command-bar/routes/root/search-providers.ts +25 -2
  175. package/src/components/command-bar/routes/root/selection.ts +6 -1
  176. package/src/components/command-bar/routes/root/shortcut-feedback.ts +4 -1
  177. package/src/components/command-bar/routes/root/shortcuts.ts +30 -3
  178. package/src/components/command-bar/routes/ticker-search/results.ts +73 -4
  179. package/src/components/command-bar/selection-runtime.ts +50 -10
  180. package/src/components/command-bar/surface/index.tsx +24 -2
  181. package/src/components/command-bar/view-model.ts +7 -0
  182. package/src/components/command-bar/workflow/broker.ts +2 -2
  183. package/src/components/command-bar/workflow/collection-actions.ts +46 -7
  184. package/src/components/command-bar/workflow/collection-ticker.ts +32 -4
  185. package/src/components/command-bar/workflow/fields.ts +8 -2
  186. package/src/components/command-bar/workflow/ops.ts +18 -4
  187. package/src/components/command-bar/workflow/portfolio-position.ts +53 -4
  188. package/src/components/command-bar/workflow/submit.ts +3 -2
  189. package/src/components/command-bar/workflow/tickers.ts +5 -1
  190. package/src/components/company-logo.tsx +39 -0
  191. package/src/components/data-table/sections.ts +4 -2
  192. package/src/components/data-table/view.tsx +23 -3
  193. package/src/components/form-modal/confirm.tsx +2 -1
  194. package/src/components/form-modal/request.ts +5 -0
  195. package/src/components/form-modal/routes.ts +4 -1
  196. package/src/components/index.ts +13 -6
  197. package/src/components/layout/detached-pane-shell.tsx +1 -0
  198. package/src/components/layout/floating-pane.tsx +1 -0
  199. package/src/components/layout/header.tsx +234 -60
  200. package/src/components/layout/market-summary.ts +9 -6
  201. package/src/components/layout/pane/capture-status.ts +1 -1
  202. package/src/components/layout/pane/footer/model.ts +11 -5
  203. package/src/components/layout/pane/header.tsx +10 -3
  204. package/src/components/layout/pane/index.tsx +1 -0
  205. package/src/components/layout/pane/pane-tabs.tsx +9 -1
  206. package/src/components/layout/shell/chrome.ts +19 -6
  207. package/src/components/layout/shell/index.tsx +2 -1
  208. package/src/components/layout/shell/pane/layers.tsx +19 -1
  209. package/src/components/layout/status-bar.tsx +2 -2
  210. package/src/components/market-board/index.tsx +11 -3
  211. package/src/components/onboarding/onboarding-wizard.tsx +1 -0
  212. package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +2 -2
  213. package/src/components/onboarding/wizard-broker-sync.ts +4 -1
  214. package/src/components/pane-settings-dialog/desktop.tsx +20 -7
  215. package/src/components/pane-settings-dialog/tui.tsx +17 -9
  216. package/src/components/pane-settings-dialog/value.ts +8 -1
  217. package/src/components/pane-settings-dialog.tsx +44 -13
  218. package/src/components/sign-in-code-panel.tsx +27 -19
  219. package/src/components/ui/column-grid.tsx +48 -4
  220. package/src/components/ui/country-flag-art.tsx +180 -0
  221. package/src/components/ui/country-flag.tsx +118 -12
  222. package/src/components/ui/data-table/opentui/index.tsx +61 -2
  223. package/src/components/ui/data-table/opentui/model.ts +109 -2
  224. package/src/components/ui/data-table/types.ts +1 -1
  225. package/src/components/ui/display.tsx +5 -1
  226. package/src/components/ui/index.ts +3 -1
  227. package/src/components/ui/logo-mark.tsx +11 -2
  228. package/src/components/ui/query-bar.tsx +1 -1
  229. package/src/components/ui/row-notes.ts +79 -0
  230. package/src/components/ui/stat-grid.tsx +28 -3
  231. package/src/components/ui/status.tsx +3 -1
  232. package/src/core/app-services.ts +4 -0
  233. package/src/core/state/app/layout.ts +4 -4
  234. package/src/data/cached-query.ts +8 -1
  235. package/src/data/config/chart-settings.ts +3 -3
  236. package/src/data/config/home.ts +10 -2
  237. package/src/data/config/layout.ts +4 -1
  238. package/src/data/config/store/node.ts +4 -0
  239. package/src/data/config/store/normalize.ts +13 -3
  240. package/src/data/config/store/portfolio-as-of-column.ts +2 -2
  241. package/src/data/json-storage.ts +2 -0
  242. package/src/data/saved-copies.ts +84 -0
  243. package/src/docs/snapshot.json +65 -32
  244. package/src/i18n/es.ts +51 -12
  245. package/src/i18n/ja.ts +51 -12
  246. package/src/i18n/ko.ts +51 -12
  247. package/src/i18n/zh-cn.ts +51 -12
  248. package/src/i18n/zh-tw.ts +51 -12
  249. package/src/layout/desks.ts +1 -1
  250. package/src/layout/launch-layout.ts +1 -1
  251. package/src/layout/pane-manager/floating-actions.ts +5 -3
  252. package/src/layout/pane-manager/floating.ts +43 -1
  253. package/src/layout/pane-manager/index.ts +2 -0
  254. package/src/layout/selected-ticker.ts +74 -0
  255. package/src/market-data/depositary-pair.ts +251 -0
  256. package/src/market-data/futures-board.ts +1 -1
  257. package/src/market-data/futures-contract.ts +124 -40
  258. package/src/market-data/fx-closes.ts +17 -2
  259. package/src/market-data/hooks.tsx +19 -11
  260. package/src/market-data/market/change-basis.ts +49 -7
  261. package/src/market-data/market/freshness.ts +34 -5
  262. package/src/market-data/market/period-return.ts +163 -0
  263. package/src/market-data/market/trading-sessions.ts +13 -0
  264. package/src/market-data/market/year-to-date.ts +8 -13
  265. package/src/market-data/performance.ts +20 -14
  266. package/src/market-data/perpetual-premium.ts +32 -0
  267. package/src/market-data/published-apac-sessions.ts +2 -1
  268. package/src/market-data/published-futures-sessions.ts +69 -0
  269. package/src/market-data/quotes/contributions.ts +5 -1
  270. package/src/market-data/quotes/freshness.ts +42 -0
  271. package/src/market-data/quotes/intraday-bar.ts +37 -0
  272. package/src/market-data/quotes/regular-session-valuation.ts +13 -8
  273. package/src/market-data/quotes/resolution.ts +4 -2
  274. package/src/market-data/tax-equivalent.ts +1 -1
  275. package/src/market-data/ticker-price-returns.ts +3 -1
  276. package/src/news/aggregator.ts +5 -1
  277. package/src/news/news-model.ts +4 -0
  278. package/src/news/types.ts +11 -0
  279. package/src/notifications/app-notifier.ts +1 -1
  280. package/src/plugins/auto-update.ts +2 -2
  281. package/src/plugins/builtin/account-management/index.tsx +1 -0
  282. package/src/plugins/builtin/account-management/pane.tsx +9 -8
  283. package/src/plugins/builtin/alerts/alert-engine.ts +30 -18
  284. package/src/plugins/builtin/alerts/calendar-events.ts +378 -0
  285. package/src/plugins/builtin/alerts/cli.ts +485 -76
  286. package/src/plugins/builtin/alerts/command.ts +5 -10
  287. package/src/plugins/builtin/alerts/event-rows.ts +9 -5
  288. package/src/plugins/builtin/alerts/events-pane.tsx +71 -56
  289. package/src/plugins/builtin/alerts/events.ts +108 -5
  290. package/src/plugins/builtin/alerts/fired-log.ts +78 -0
  291. package/src/plugins/builtin/alerts/format.ts +2 -1
  292. package/src/plugins/builtin/alerts/headless.ts +100 -39
  293. package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
  294. package/src/plugins/builtin/alerts/history-rows.ts +89 -0
  295. package/src/plugins/builtin/alerts/index.tsx +45 -18
  296. package/src/plugins/builtin/alerts/iv-level.ts +365 -0
  297. package/src/plugins/builtin/alerts/levels.ts +3 -3
  298. package/src/plugins/builtin/alerts/pane.tsx +97 -29
  299. package/src/plugins/builtin/alerts/price.ts +35 -0
  300. package/src/plugins/builtin/alerts/quotes.ts +24 -0
  301. package/src/plugins/builtin/alerts/research-builder.ts +84 -11
  302. package/src/plugins/builtin/alerts/research-rules.ts +77 -3
  303. package/src/plugins/builtin/alerts/scheduled-check.ts +206 -32
  304. package/src/plugins/builtin/alerts/scheduled-sources.ts +26 -3
  305. package/src/plugins/builtin/alerts/scheduled.ts +188 -29
  306. package/src/plugins/builtin/alerts/storage.ts +13 -10
  307. package/src/plugins/builtin/alerts/targets.ts +12 -3
  308. package/src/plugins/builtin/analytics/index.tsx +8 -2
  309. package/src/plugins/builtin/analytics/metrics.ts +1 -1
  310. package/src/plugins/builtin/analytics/risk-book.ts +215 -0
  311. package/src/plugins/builtin/analytics/risk-client.ts +13 -6
  312. package/src/plugins/builtin/analytics/risk-headless.ts +55 -21
  313. package/src/plugins/builtin/analytics/risk-math.ts +6 -3
  314. package/src/plugins/builtin/analytics/risk-model.ts +297 -104
  315. package/src/plugins/builtin/analytics/risk-options.ts +17 -2
  316. package/src/plugins/builtin/analytics/risk-pane.tsx +107 -43
  317. package/src/plugins/builtin/attention/pane.tsx +22 -16
  318. package/src/plugins/builtin/awards/headless.ts +7 -3
  319. package/src/plugins/builtin/awards/model.ts +18 -0
  320. package/src/plugins/builtin/awards/pane.tsx +12 -9
  321. package/src/plugins/builtin/backtest/export.ts +1 -1
  322. package/src/plugins/builtin/backtest/headless.ts +3 -3
  323. package/src/plugins/builtin/backtest/rules.ts +41 -5
  324. package/src/plugins/builtin/broker-manager/add-flow.tsx +12 -7
  325. package/src/plugins/builtin/broker-manager/detail.tsx +47 -19
  326. package/src/plugins/builtin/broker-manager/footer.ts +27 -11
  327. package/src/plugins/builtin/broker-manager/index.tsx +21 -12
  328. package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
  329. package/src/plugins/builtin/broker-manager/model.ts +12 -2
  330. package/src/plugins/builtin/broker-manager/pane-actions.tsx +183 -57
  331. package/src/plugins/builtin/broker-manager/table.ts +28 -12
  332. package/src/plugins/builtin/broker-trading/account-picker.tsx +2 -1
  333. package/src/plugins/builtin/broker-trading/chart-levels.ts +82 -13
  334. package/src/plugins/builtin/broker-trading/controller.ts +45 -13
  335. package/src/plugins/builtin/broker-trading/dock.tsx +24 -4
  336. package/src/plugins/builtin/broker-trading/headless.ts +2 -1
  337. package/src/plugins/builtin/broker-trading/index.tsx +7 -1
  338. package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
  339. package/src/plugins/builtin/broker-trading/order-feed.ts +75 -7
  340. package/src/plugins/builtin/broker-trading/orders.tsx +109 -31
  341. package/src/plugins/builtin/broker-trading/overview-orders.tsx +9 -3
  342. package/src/plugins/builtin/broker-trading/pane-model.ts +30 -2
  343. package/src/plugins/builtin/broker-trading/pane.tsx +115 -26
  344. package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
  345. package/src/plugins/builtin/broker-trading/ticket.tsx +122 -36
  346. package/src/plugins/builtin/buildout/cells.tsx +4 -0
  347. package/src/plugins/builtin/buildout/detail/index.tsx +5 -1
  348. package/src/plugins/builtin/buildout/detail/ui.tsx +7 -4
  349. package/src/plugins/builtin/buildout/pane/index.tsx +34 -18
  350. package/src/plugins/builtin/buildout/pane/status.tsx +0 -4
  351. package/src/plugins/builtin/builtin-plugin-meta.ts +1 -1
  352. package/src/plugins/builtin/catalysts/client.ts +2 -2
  353. package/src/plugins/builtin/catalysts/detail.tsx +3 -2
  354. package/src/plugins/builtin/catalysts/index.tsx +1 -1
  355. package/src/plugins/builtin/catalysts/model.ts +49 -4
  356. package/src/plugins/builtin/catalysts/pane.tsx +9 -11
  357. package/src/plugins/builtin/central-bank-rates/client.ts +5 -0
  358. package/src/plugins/builtin/central-bank-rates/headless.ts +36 -10
  359. package/src/plugins/builtin/central-bank-rates/model.ts +33 -8
  360. package/src/plugins/builtin/changelog/index.tsx +1 -0
  361. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +1 -0
  362. package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +2 -1
  363. package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
  364. package/src/plugins/builtin/chart-composer/cli-options.ts +2 -5
  365. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +2 -1
  366. package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -0
  367. package/src/plugins/builtin/chart-composer/editor.tsx +4 -1
  368. package/src/plugins/builtin/chart-composer/headless-schema.ts +28 -26
  369. package/src/plugins/builtin/chart-composer/headless.ts +253 -35
  370. package/src/plugins/builtin/chart-composer/index.tsx +12 -2
  371. package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
  372. package/src/plugins/builtin/chart-composer/pane.tsx +128 -28
  373. package/src/plugins/builtin/chart-composer/series-catalog.ts +1 -0
  374. package/src/plugins/builtin/chart-composer/series-expression.ts +65 -6
  375. package/src/plugins/builtin/chart-composer/session-history.ts +15 -21
  376. package/src/plugins/builtin/chart-composer/session-range.ts +4 -2
  377. package/src/plugins/builtin/chart-composer/settings.ts +31 -19
  378. package/src/plugins/builtin/chart-composer/use-series-catalog.ts +5 -6
  379. package/src/plugins/builtin/chart-composer/viewport-labels.ts +18 -8
  380. package/src/plugins/builtin/chat/attachments/model.ts +3 -1
  381. package/src/plugins/builtin/chat/content/index.tsx +1 -1
  382. package/src/plugins/builtin/chat/pane-links/open.ts +1 -1
  383. package/src/plugins/builtin/chat/people.ts +1 -1
  384. package/src/plugins/builtin/clinical-trials/client.ts +5 -2
  385. package/src/plugins/builtin/clinical-trials/model.ts +13 -4
  386. package/src/plugins/builtin/clinical-trials/pane.tsx +32 -12
  387. package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +17 -0
  388. package/src/plugins/builtin/cloud/askg/controller.ts +1 -1
  389. package/src/plugins/builtin/cloud/askg/lock-note.ts +1 -1
  390. package/src/plugins/builtin/cloud/askg/tool-display.ts +1 -1
  391. package/src/plugins/builtin/cloud/auth-commands.ts +3 -3
  392. package/src/plugins/builtin/cloud/team/pane-sections.tsx +105 -47
  393. package/src/plugins/builtin/cloud/team/pane-ui.tsx +42 -4
  394. package/src/plugins/builtin/cloud/team/pane.tsx +204 -64
  395. package/src/plugins/builtin/cloud/thesis/store.ts +45 -22
  396. package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
  397. package/src/plugins/builtin/commodities-energy/index.tsx +29 -2
  398. package/src/plugins/builtin/commodities-energy/view-state.ts +2 -0
  399. package/src/plugins/builtin/commodity-balances/pane.tsx +14 -8
  400. package/src/plugins/builtin/company-attention/app-rank.tsx +11 -10
  401. package/src/plugins/builtin/company-attention/building-model.ts +222 -0
  402. package/src/plugins/builtin/company-attention/building.tsx +172 -0
  403. package/src/plugins/builtin/company-attention/client.ts +117 -1
  404. package/src/plugins/builtin/company-attention/evidence.ts +16 -3
  405. package/src/plugins/builtin/company-attention/headless.ts +101 -5
  406. package/src/plugins/builtin/company-attention/index.tsx +6 -3
  407. package/src/plugins/builtin/company-attention/model.ts +33 -7
  408. package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
  409. package/src/plugins/builtin/company-attention/moves.tsx +159 -0
  410. package/src/plugins/builtin/company-attention/pane.tsx +89 -31
  411. package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
  412. package/src/plugins/builtin/company-attention/signals.tsx +160 -0
  413. package/src/plugins/builtin/company-kpis/headless.ts +3 -2
  414. package/src/plugins/builtin/company-kpis/model.ts +2 -2
  415. package/src/plugins/builtin/company-kpis/pane.tsx +5 -4
  416. package/src/plugins/builtin/composite-plugins.ts +2 -1
  417. package/src/plugins/builtin/congress-trades/headless.ts +1 -1
  418. package/src/plugins/builtin/connections/index.ts +1 -0
  419. package/src/plugins/builtin/correlation/headless-schema.ts +3 -2
  420. package/src/plugins/builtin/correlation/headless.ts +7 -4
  421. package/src/plugins/builtin/correlation/relationship/model.ts +1 -0
  422. package/src/plugins/builtin/correlation/settings.ts +1 -0
  423. package/src/plugins/builtin/cot/headless.ts +28 -6
  424. package/src/plugins/builtin/cot/model.ts +12 -0
  425. package/src/plugins/builtin/cot/pane.tsx +7 -5
  426. package/src/plugins/builtin/cpi/headless.ts +5 -1
  427. package/src/plugins/builtin/cpi/pane.tsx +11 -9
  428. package/src/plugins/builtin/credit-boards/model.ts +2 -0
  429. package/src/plugins/builtin/credit-documents/headless.ts +1 -1
  430. package/src/plugins/builtin/credit-documents/pane.tsx +8 -7
  431. package/src/plugins/builtin/crypto-board/client.ts +86 -0
  432. package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
  433. package/src/plugins/builtin/crypto-board/defi.ts +239 -0
  434. package/src/plugins/builtin/crypto-board/headless.ts +117 -6
  435. package/src/plugins/builtin/crypto-board/index.tsx +8 -3
  436. package/src/plugins/builtin/crypto-board/model.ts +40 -8
  437. package/src/plugins/builtin/crypto-board/pane.tsx +55 -21
  438. package/src/plugins/builtin/crypto-board/series.ts +19 -1
  439. package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
  440. package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
  441. package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
  442. package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
  443. package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
  444. package/src/plugins/builtin/debt-maturities/pane.tsx +4 -3
  445. package/src/plugins/builtin/debug/index.tsx +1 -0
  446. package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
  447. package/src/plugins/builtin/docs/index.tsx +1 -1
  448. package/src/plugins/builtin/docs/pane.tsx +2 -2
  449. package/src/plugins/builtin/docs/targets.ts +1 -1
  450. package/src/plugins/builtin/doe/client.ts +5 -1
  451. package/src/plugins/builtin/doe/headless.ts +12 -6
  452. package/src/plugins/builtin/doe/model.ts +43 -6
  453. package/src/plugins/builtin/doe/pane.tsx +19 -12
  454. package/src/plugins/builtin/earnings/board-model.ts +13 -6
  455. package/src/plugins/builtin/earnings/board-table.ts +4 -1
  456. package/src/plugins/builtin/earnings/board.tsx +253 -50
  457. package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
  458. package/src/plugins/builtin/earnings/calendar.tsx +338 -0
  459. package/src/plugins/builtin/earnings/client.ts +4 -3
  460. package/src/plugins/builtin/earnings/headless.ts +53 -15
  461. package/src/plugins/builtin/earnings/history-model.ts +53 -36
  462. package/src/plugins/builtin/earnings/index.tsx +15 -22
  463. package/src/plugins/builtin/earnings/model.ts +17 -12
  464. package/src/plugins/builtin/earnings/scope.ts +89 -0
  465. package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
  466. package/src/plugins/builtin/earnings-calls/data.ts +146 -2
  467. package/src/plugins/builtin/earnings-calls/headless.ts +151 -9
  468. package/src/plugins/builtin/earnings-calls/index.tsx +3 -3
  469. package/src/plugins/builtin/earnings-calls/lock-note.ts +1 -1
  470. package/src/plugins/builtin/earnings-calls/pane.tsx +149 -31
  471. package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
  472. package/src/plugins/builtin/earnings-ripple/pane.tsx +10 -5
  473. package/src/plugins/builtin/econ/calendar-model.ts +132 -20
  474. package/src/plugins/builtin/econ/detail-view.tsx +48 -10
  475. package/src/plugins/builtin/econ/fred-catalog.ts +23 -6
  476. package/src/plugins/builtin/econ/fred-series-map.ts +4 -0
  477. package/src/plugins/builtin/econ/index.tsx +112 -25
  478. package/src/plugins/builtin/econ/print-watch.ts +2 -1
  479. package/src/plugins/builtin/econ/types.ts +32 -1
  480. package/src/plugins/builtin/econ-statistics/client.ts +16 -3
  481. package/src/plugins/builtin/econ-statistics/defs.ts +4 -0
  482. package/src/plugins/builtin/econ-statistics/detail.tsx +2 -2
  483. package/src/plugins/builtin/econ-statistics/headless.ts +13 -2
  484. package/src/plugins/builtin/econ-statistics/index.tsx +3 -3
  485. package/src/plugins/builtin/econ-statistics/pane.tsx +2 -1
  486. package/src/plugins/builtin/econ-statistics/stats.ts +103 -0
  487. package/src/plugins/builtin/econ-statistics/view.ts +16 -1
  488. package/src/plugins/builtin/equity-screener/client.ts +21 -3
  489. package/src/plugins/builtin/equity-screener/headless.ts +77 -5
  490. package/src/plugins/builtin/equity-screener/live.ts +1 -1
  491. package/src/plugins/builtin/equity-screener/model.ts +34 -0
  492. package/src/plugins/builtin/equity-screener/pane.tsx +148 -106
  493. package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
  494. package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
  495. package/src/plugins/builtin/estimate-revisions/headless.ts +3 -1
  496. package/src/plugins/builtin/estimate-revisions/lock-note.ts +3 -3
  497. package/src/plugins/builtin/estimate-revisions/model.ts +8 -10
  498. package/src/plugins/builtin/exposure/headless.ts +51 -6
  499. package/src/plugins/builtin/exposure/index.tsx +28 -2
  500. package/src/plugins/builtin/exposure/model.ts +7 -0
  501. package/src/plugins/builtin/exposure/pane.tsx +16 -10
  502. package/src/plugins/builtin/fear-greed/index.tsx +1 -1
  503. package/src/plugins/builtin/filing-events/index.tsx +1 -1
  504. package/src/plugins/builtin/futures/model.ts +10 -9
  505. package/src/plugins/builtin/futures/returns.ts +8 -36
  506. package/src/plugins/builtin/futures/table.tsx +1 -1
  507. package/src/plugins/builtin/futures-curve/client.ts +40 -9
  508. package/src/plugins/builtin/futures-curve/headless.ts +39 -17
  509. package/src/plugins/builtin/futures-curve/model.ts +258 -69
  510. package/src/plugins/builtin/futures-curve/pane.tsx +46 -17
  511. package/src/plugins/builtin/fx-matrix/client.ts +15 -8
  512. package/src/plugins/builtin/fx-matrix/headless.ts +32 -14
  513. package/src/plugins/builtin/fx-matrix/index.tsx +13 -11
  514. package/src/plugins/builtin/fx-matrix/live-legs.ts +22 -0
  515. package/src/plugins/builtin/fx-matrix/settings.ts +2 -1
  516. package/src/plugins/builtin/gpu/board.tsx +4 -1
  517. package/src/plugins/builtin/gpu/changes.tsx +10 -10
  518. package/src/plugins/builtin/gpu/equities.tsx +4 -1
  519. package/src/plugins/builtin/gpu/headless.ts +9 -4
  520. package/src/plugins/builtin/gpu/history.tsx +4 -2
  521. package/src/plugins/builtin/gpu/pane.tsx +5 -3
  522. package/src/plugins/builtin/help/index.tsx +13 -3
  523. package/src/plugins/builtin/holders/beneficial-model.ts +8 -11
  524. package/src/plugins/builtin/holders/beneficial-report.ts +6 -5
  525. package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
  526. package/src/plugins/builtin/holders/client.ts +15 -2
  527. package/src/plugins/builtin/holders/format.ts +28 -17
  528. package/src/plugins/builtin/holders/headless.ts +48 -8
  529. package/src/plugins/builtin/holders/index-holders.ts +264 -0
  530. package/src/plugins/builtin/holders/pane.tsx +79 -15
  531. package/src/plugins/builtin/holders/report-rows.ts +35 -7
  532. package/src/plugins/builtin/holders/table-model.ts +2 -1
  533. package/src/plugins/builtin/holders/thirteenf-match.ts +3 -1
  534. package/src/plugins/builtin/holders/treemap.tsx +2 -2
  535. package/src/plugins/builtin/insider/base-values.ts +11 -7
  536. package/src/plugins/builtin/insider/client.ts +3 -0
  537. package/src/plugins/builtin/insider/headless.ts +20 -7
  538. package/src/plugins/builtin/insider/index.tsx +17 -8
  539. package/src/plugins/builtin/insider/issuer.ts +34 -4
  540. package/src/plugins/builtin/insider/signals-client.ts +3 -3
  541. package/src/plugins/builtin/insider/signals.tsx +1 -1
  542. package/src/plugins/builtin/insider/table-model.ts +35 -13
  543. package/src/plugins/builtin/insider/table.tsx +5 -2
  544. package/src/plugins/builtin/ipo-calendar/pane.tsx +7 -4
  545. package/src/plugins/builtin/iv-history/client.ts +20 -0
  546. package/src/plugins/builtin/iv-history/events.ts +145 -0
  547. package/src/plugins/builtin/iv-history/format.ts +3 -0
  548. package/src/plugins/builtin/iv-history/headless.ts +91 -7
  549. package/src/plugins/builtin/iv-history/index.tsx +1 -1
  550. package/src/plugins/builtin/iv-history/model.ts +13 -4
  551. package/src/plugins/builtin/iv-history/series.ts +3 -1
  552. package/src/plugins/builtin/jobs/lock-note.ts +1 -1
  553. package/src/plugins/builtin/jobs/model.ts +4 -15
  554. package/src/plugins/builtin/jobs/pane.tsx +7 -5
  555. package/src/plugins/builtin/jobs/share-bars.tsx +11 -5
  556. package/src/plugins/builtin/jodi/pane.tsx +14 -8
  557. package/src/plugins/builtin/layout-manager/index.tsx +1 -0
  558. package/src/plugins/builtin/macro-day/headless.ts +20 -7
  559. package/src/plugins/builtin/macro-day/index.tsx +3 -2
  560. package/src/plugins/builtin/macro-day/model.ts +29 -8
  561. package/src/plugins/builtin/macro-day/pane.tsx +46 -10
  562. package/src/plugins/builtin/macro-day/releases.ts +55 -13
  563. package/src/plugins/builtin/market-heatmap/data.ts +9 -2
  564. package/src/plugins/builtin/market-heatmap/evidence.ts +1 -1
  565. package/src/plugins/builtin/market-heatmap/headless.ts +9 -6
  566. package/src/plugins/builtin/market-heatmap/index.tsx +3 -3
  567. package/src/plugins/builtin/market-heatmap/model.ts +10 -7
  568. package/src/plugins/builtin/market-movers/client.ts +36 -21
  569. package/src/plugins/builtin/market-movers/headless.ts +8 -2
  570. package/src/plugins/builtin/market-movers/index.tsx +16 -10
  571. package/src/plugins/builtin/market-movers/screener.ts +33 -11
  572. package/src/plugins/builtin/market-movers/session-body.tsx +4 -2
  573. package/src/plugins/builtin/market-movers/session-table.ts +4 -2
  574. package/src/plugins/builtin/market-movers/table.ts +4 -1
  575. package/src/plugins/builtin/market-valuation/headless.ts +2 -0
  576. package/src/plugins/builtin/market-valuation/view.ts +5 -0
  577. package/src/plugins/builtin/members/headless.ts +6 -5
  578. package/src/plugins/builtin/members/pane.tsx +11 -4
  579. package/src/plugins/builtin/mna/client.ts +1 -0
  580. package/src/plugins/builtin/mna/detail.tsx +20 -32
  581. package/src/plugins/builtin/mna/distress/detail.tsx +16 -4
  582. package/src/plugins/builtin/mna/distress/model.ts +3 -2
  583. package/src/plugins/builtin/mna/distress/pane.tsx +7 -4
  584. package/src/plugins/builtin/mna/headless.ts +6 -13
  585. package/src/plugins/builtin/mna/model.ts +93 -15
  586. package/src/plugins/builtin/mna/pane.tsx +5 -4
  587. package/src/plugins/builtin/news/headless.ts +12 -6
  588. package/src/plugins/builtin/news/index.tsx +10 -1
  589. package/src/plugins/builtin/news/wire/index.tsx +3 -2
  590. package/src/plugins/builtin/news/wire/news/command-bar-search.ts +26 -10
  591. package/src/plugins/builtin/news/wire/news/query-presets.ts +6 -2
  592. package/src/plugins/builtin/news/wire/rss/cli.ts +3 -3
  593. package/src/plugins/builtin/notes/cli.ts +50 -15
  594. package/src/plugins/builtin/notes/export.ts +17 -6
  595. package/src/plugins/builtin/notes/files.ts +16 -5
  596. package/src/plugins/builtin/openfda/pane.tsx +1 -1
  597. package/src/plugins/builtin/options/carry.ts +2 -2
  598. package/src/plugins/builtin/options/enrichment-model.ts +10 -9
  599. package/src/plugins/builtin/options/index.tsx +1 -1
  600. package/src/plugins/builtin/options/model-spot.ts +70 -4
  601. package/src/plugins/builtin/options/view.tsx +51 -23
  602. package/src/plugins/builtin/options-calculator/headless.ts +46 -7
  603. package/src/plugins/builtin/options-calculator/pane.tsx +3 -2
  604. package/src/plugins/builtin/options-positioning/headless.ts +11 -3
  605. package/src/plugins/builtin/options-positioning/model.ts +24 -0
  606. package/src/plugins/builtin/options-positioning/pane.tsx +10 -12
  607. package/src/plugins/builtin/options-scenario/client.ts +142 -29
  608. package/src/plugins/builtin/options-scenario/collar.ts +8 -6
  609. package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +127 -0
  610. package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +165 -0
  611. package/src/plugins/builtin/options-scenario/csp-screen.ts +258 -0
  612. package/src/plugins/builtin/options-scenario/csp.ts +101 -21
  613. package/src/plugins/builtin/options-scenario/headless.ts +49 -21
  614. package/src/plugins/builtin/options-scenario/hedge.ts +20 -14
  615. package/src/plugins/builtin/options-scenario/index.tsx +28 -3
  616. package/src/plugins/builtin/options-scenario/model.ts +13 -0
  617. package/src/plugins/builtin/options-scenario/pane.tsx +22 -10
  618. package/src/plugins/builtin/perps/equity-row.tsx +11 -3
  619. package/src/plugins/builtin/perps/freshness.ts +8 -5
  620. package/src/plugins/builtin/perps/headless.ts +3 -1
  621. package/src/plugins/builtin/perps/list-perpetuals.ts +25 -4
  622. package/src/plugins/builtin/perps/live-rows.ts +161 -0
  623. package/src/plugins/builtin/perps/markets-section.tsx +154 -0
  624. package/src/plugins/builtin/perps/pane.tsx +36 -17
  625. package/src/plugins/builtin/perps/venue-markets.ts +96 -0
  626. package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -1
  627. package/src/plugins/builtin/plugin-marketplace/pane.tsx +145 -60
  628. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +78 -27
  629. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +158 -141
  630. package/src/plugins/builtin/portfolio-list/cli/render.ts +49 -20
  631. package/src/plugins/builtin/portfolio-list/cli/shared.ts +3 -3
  632. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +29 -24
  633. package/src/plugins/builtin/portfolio-list/headless.ts +6 -3
  634. package/src/plugins/builtin/portfolio-list/income.ts +13 -2
  635. package/src/plugins/builtin/portfolio-list/index.tsx +9 -2
  636. package/src/plugins/builtin/portfolio-list/pane/index.tsx +21 -8
  637. package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
  638. package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +16 -9
  639. package/src/plugins/builtin/portfolio-list/summary/totals.ts +2 -15
  640. package/src/plugins/builtin/power/client.ts +6 -3
  641. package/src/plugins/builtin/power/evidence.ts +22 -7
  642. package/src/plugins/builtin/power/gas.tsx +5 -1
  643. package/src/plugins/builtin/power/pane.tsx +44 -32
  644. package/src/plugins/builtin/power/prices.tsx +10 -3
  645. package/src/plugins/builtin/research/analyst-headless.ts +25 -8
  646. package/src/plugins/builtin/research/analyst-model.ts +68 -3
  647. package/src/plugins/builtin/research/corporate-actions-pane.tsx +63 -14
  648. package/src/plugins/builtin/research/event-model.ts +3 -1
  649. package/src/plugins/builtin/research/event-sources.ts +12 -4
  650. package/src/plugins/builtin/research/index.tsx +2 -1
  651. package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
  652. package/src/plugins/builtin/research/relative-valuation-columns.ts +31 -2
  653. package/src/plugins/builtin/research/relative-valuation-currency.ts +12 -5
  654. package/src/plugins/builtin/research/relative-valuation-headless.ts +84 -26
  655. package/src/plugins/builtin/research/relative-valuation-model.ts +88 -19
  656. package/src/plugins/builtin/research/relative-valuation-pane.tsx +76 -9
  657. package/src/plugins/builtin/research/relative-valuation-peers.ts +1 -1
  658. package/src/plugins/builtin/reverse-dcf/client.ts +2 -1
  659. package/src/plugins/builtin/reverse-dcf/model.ts +10 -5
  660. package/src/plugins/builtin/risk-factors/index.tsx +2 -2
  661. package/src/plugins/builtin/scanner/lock-note.ts +1 -1
  662. package/src/plugins/builtin/seasonality/client.ts +2 -1
  663. package/src/plugins/builtin/sec/forms.ts +13 -0
  664. package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
  665. package/src/plugins/builtin/sec/fund-facts.ts +68 -8
  666. package/src/plugins/builtin/sec/headless.ts +85 -8
  667. package/src/plugins/builtin/sec/index.tsx +58 -12
  668. package/src/plugins/builtin/sectors/client.ts +6 -4
  669. package/src/plugins/builtin/sectors/sector-model.ts +11 -15
  670. package/src/plugins/builtin/series-inventory.ts +2 -0
  671. package/src/plugins/builtin/shared/broker-reconnect.ts +107 -22
  672. package/src/plugins/builtin/shared/cloud-resource.ts +15 -2
  673. package/src/plugins/builtin/shared/cloud-upgrade.ts +34 -6
  674. package/src/plugins/builtin/shared/earnings-calendar.ts +375 -0
  675. package/src/plugins/builtin/{earnings/estimate-basis.ts → shared/earnings-estimate-basis.ts} +1 -1
  676. package/src/plugins/builtin/shared/earnings-report.ts +3 -3
  677. package/src/plugins/builtin/shared/fx-rate-freshness.ts +23 -1
  678. package/src/plugins/builtin/shared/job-posting.ts +129 -0
  679. package/src/plugins/builtin/shared/pro-lock-note.ts +3 -3
  680. package/src/plugins/builtin/shared/report-freshness.ts +3 -0
  681. package/src/plugins/builtin/shared/research-trading.tsx +23 -0
  682. package/src/plugins/builtin/shared/series-cache.ts +2 -0
  683. package/src/plugins/builtin/shared/series-list-detail.tsx +3 -1
  684. package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
  685. package/src/plugins/builtin/shared/volatility/options.ts +2 -1
  686. package/src/plugins/builtin/short-interest/client.ts +2 -0
  687. package/src/plugins/builtin/short-interest/headless.ts +41 -12
  688. package/src/plugins/builtin/short-interest/index.tsx +23 -1
  689. package/src/plugins/builtin/short-interest/model.ts +70 -19
  690. package/src/plugins/builtin/short-interest/pane.tsx +19 -2
  691. package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
  692. package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
  693. package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
  694. package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
  695. package/src/plugins/builtin/short-interest/schedule.ts +35 -2
  696. package/src/plugins/builtin/short-interest/surface.tsx +11 -4
  697. package/src/plugins/builtin/short-interest/types.ts +9 -0
  698. package/src/plugins/builtin/short-interest/watch-client.ts +14 -8
  699. package/src/plugins/builtin/short-interest/watch-model.ts +12 -25
  700. package/src/plugins/builtin/short-interest/watch-pane.tsx +5 -1
  701. package/src/plugins/builtin/social-mentions/client.ts +2 -1
  702. package/src/plugins/builtin/supply-chain/flow.tsx +33 -9
  703. package/src/plugins/builtin/supply-chain/model.ts +51 -3
  704. package/src/plugins/builtin/supply-chain/pane.tsx +78 -39
  705. package/src/plugins/builtin/supply-chain/row-evidence.tsx +1 -1
  706. package/src/plugins/builtin/themes/headless.ts +8 -5
  707. package/src/plugins/builtin/themes/model.ts +14 -4
  708. package/src/plugins/builtin/themes/pane.tsx +24 -5
  709. package/src/plugins/builtin/thirteenf/headless.ts +5 -5
  710. package/src/plugins/builtin/thirteenf/signals.ts +3 -1
  711. package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
  712. package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
  713. package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
  714. package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +40 -26
  715. package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +8 -4
  716. package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +67 -3
  717. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +112 -5
  718. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +17 -2
  719. package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +21 -7
  720. package/src/plugins/builtin/ticker-detail/financials/model.ts +36 -1
  721. package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
  722. package/src/plugins/builtin/ticker-detail/financials/ratios.ts +62 -13
  723. package/src/plugins/builtin/ticker-detail/financials/tab.tsx +30 -4
  724. package/src/plugins/builtin/ticker-detail/headless-schema.ts +14 -2
  725. package/src/plugins/builtin/ticker-detail/headless.ts +148 -35
  726. package/src/plugins/builtin/ticker-detail/index.tsx +37 -5
  727. package/src/plugins/builtin/ticker-detail/overview/model.ts +65 -10
  728. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +9 -1
  729. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +68 -11
  730. package/src/plugins/builtin/ticker-detail/pane.tsx +11 -0
  731. package/src/plugins/builtin/ticker-detail/quote-footer.ts +8 -3
  732. package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
  733. package/src/plugins/builtin/vol-surface/client.ts +28 -7
  734. package/src/plugins/builtin/vol-surface/headless.ts +43 -15
  735. package/src/plugins/builtin/vol-surface/model.ts +34 -12
  736. package/src/plugins/builtin/vol-surface/pane.tsx +33 -13
  737. package/src/plugins/builtin/vol-surface/stored.ts +34 -3
  738. package/src/plugins/builtin/vol-surface/tables.ts +14 -0
  739. package/src/plugins/builtin/volatility/model.ts +5 -10
  740. package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +4 -3
  741. package/src/plugins/builtin/world-venue-map/basemap.ts +3 -1
  742. package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -0
  743. package/src/plugins/builtin/world-venue-map/evidence.ts +1 -1
  744. package/src/plugins/builtin/world-venue-map/geo-series.ts +90 -11
  745. package/src/plugins/builtin/world-venue-map/headless.ts +1 -1
  746. package/src/plugins/builtin/world-venue-map/index.ts +3 -26
  747. package/src/plugins/builtin/world-venue-map/layers.ts +1 -1
  748. package/src/plugins/builtin/world-venue-map/map.tsx +2 -1
  749. package/src/plugins/builtin/world-venue-map/pane.tsx +4 -2
  750. package/src/plugins/builtin/world-venue-map/venue-header.tsx +15 -4
  751. package/src/plugins/builtin/yield-curve/client.ts +25 -0
  752. package/src/plugins/builtin/yield-curve/curves.ts +7 -4
  753. package/src/plugins/builtin/yield-curve/headless.ts +38 -4
  754. package/src/plugins/builtin/yield-curve/history.ts +4 -3
  755. package/src/plugins/builtin/yield-curve/index.tsx +12 -6
  756. package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
  757. package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
  758. package/src/plugins/bundle.ts +1 -1
  759. package/src/plugins/catalog-browser.ts +2 -1
  760. package/src/plugins/compat.ts +3 -3
  761. package/src/plugins/dependencies.ts +75 -14
  762. package/src/plugins/extracted-plugins.ts +132 -34
  763. package/src/plugins/host-link.ts +149 -34
  764. package/src/plugins/installer.ts +35 -10
  765. package/src/plugins/loader.ts +206 -38
  766. package/src/plugins/manager-node.ts +2 -2
  767. package/src/plugins/marketplace/deactivation.ts +22 -0
  768. package/src/plugins/marketplace/model.ts +2 -2
  769. package/src/plugins/marketplace/packs.ts +1 -1
  770. package/src/plugins/ownership.ts +1 -1
  771. package/src/plugins/peer-retry.ts +155 -0
  772. package/src/plugins/registry/contributions.ts +3 -1
  773. package/src/plugins/registry/index.ts +4 -3
  774. package/src/plugins/registry/plugin-state.ts +3 -0
  775. package/src/plugins/seed-notice.ts +20 -0
  776. package/src/plugins/shortcut-argument.ts +39 -0
  777. package/src/portfolio/allocation.ts +1 -1
  778. package/src/portfolio/collection-name.ts +31 -0
  779. package/src/portfolio/column-values.ts +10 -8
  780. package/src/portfolio/cost-fx.ts +296 -19
  781. package/src/portfolio/manual-lots.ts +75 -0
  782. package/src/portfolio/mutations.ts +60 -22
  783. package/src/portfolio/suffixed-listings.ts +209 -0
  784. package/src/portfolio/totals-currency.ts +24 -0
  785. package/src/public/__snapshots__/public-api.test.ts.snap +14 -0
  786. package/src/public/time-series.ts +11 -8
  787. package/src/remote/schema.ts +1 -1
  788. package/src/renderers/browser/config-host.ts +3 -0
  789. package/src/renderers/browser/main.tsx +23 -3
  790. package/src/renderers/dom/boot-frame-page.ts +187 -0
  791. package/src/renderers/dom/boot-frame.ts +237 -0
  792. package/src/renderers/dom/build-assets.ts +46 -8
  793. package/src/renderers/dom/desktop/controls.tsx +1 -1
  794. package/src/renderers/dom/desktop/query-bar.tsx +2 -0
  795. package/src/renderers/dom/dom-ui-host.tsx +4 -29
  796. package/src/renderers/dom/host/ascii-text.ts +16 -2
  797. package/src/renderers/dom/host/box.tsx +43 -2
  798. package/src/renderers/dom/host/chart-surface.tsx +2 -0
  799. package/src/renderers/dom/host/hls.chunk.ts +3 -0
  800. package/src/renderers/dom/host/image-surface.tsx +49 -0
  801. package/src/renderers/dom/host/media-surface.tsx +24 -18
  802. package/src/renderers/dom/host/mouse.ts +30 -0
  803. package/src/renderers/dom/host/size-observer.ts +1 -1
  804. package/src/renderers/dom/host/style.ts +1 -1
  805. package/src/renderers/dom/host/tabs.tsx +16 -5
  806. package/src/renderers/dom/host/top-surface.ts +127 -0
  807. package/src/renderers/dom/styles.css +115 -0
  808. package/src/renderers/dom/test-utils.tsx +2 -1
  809. package/src/renderers/electrobun/bun/application-menu/index.ts +3 -3
  810. package/src/renderers/electrobun/bun/core-capabilities.ts +9 -1
  811. package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
  812. package/src/renderers/electrobun/bun/desktop/backend.ts +56 -3
  813. package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
  814. package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
  815. package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
  816. package/src/renderers/electrobun/bun/desktop/update.ts +210 -30
  817. package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
  818. package/src/renderers/electrobun/bun/index.ts +11 -1
  819. package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
  820. package/src/renderers/electrobun/bun/window/create.ts +4 -1
  821. package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
  822. package/src/renderers/electrobun/shared/protocol.ts +6 -1
  823. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
  824. package/src/renderers/electrobun/view/config-host.ts +3 -0
  825. package/src/renderers/electrobun/view/fatal-screen.tsx +1 -1
  826. package/src/renderers/electrobun/view/main.tsx +30 -4
  827. package/src/renderers/electrobun/view/news-source.ts +9 -7
  828. package/src/renderers/electrobun/view/remote/asset-data-client.ts +9 -2
  829. package/src/renderers/electrobun/view/ui-host.tsx +1 -1
  830. package/src/renderers/opentui/browser-open.ts +88 -0
  831. package/src/renderers/opentui/host.tsx +5 -14
  832. package/src/renderers/opentui/image/loader.ts +3 -2
  833. package/src/renderers/opentui/native-smoke.ts +10 -1
  834. package/src/renderers/opentui/pane-image/index.ts +2 -1
  835. package/src/renderers/opentui/render-lib.ts +253 -0
  836. package/src/renderers/opentui/render-timing-smoke.ts +1 -1
  837. package/src/renderers/opentui/start.tsx +8 -1
  838. package/src/renderers/share/layout-view.tsx +2 -2
  839. package/src/renderers/share/main.tsx +4 -4
  840. package/src/renderers/share/view.tsx +1 -1
  841. package/src/series/resolve.ts +22 -6
  842. package/src/series/standalone.ts +30 -2
  843. package/src/series/types.ts +8 -1
  844. package/src/shares/api.ts +4 -1
  845. package/src/shares/pane.ts +1 -1
  846. package/src/sources/gloomberb-cloud/fred-series.ts +46 -1
  847. package/src/sources/gloomberb-cloud/index.ts +39 -16
  848. package/src/sources/gloomberb-cloud/news.ts +39 -0
  849. package/src/sources/gloomberb-cloud/normalizers.ts +14 -1
  850. package/src/sources/gloomberb-cloud/perpetuals.ts +49 -1
  851. package/src/sources/listing-symbols.ts +37 -0
  852. package/src/sources/provider-errors.ts +16 -2
  853. package/src/sources/provider-router/financial-routes.ts +21 -3
  854. package/src/sources/provider-router/financials.ts +15 -2
  855. package/src/sources/provider-router/history.ts +30 -8
  856. package/src/sources/provider-router/index.ts +16 -0
  857. package/src/sources/provider-router/primary.ts +1 -1
  858. package/src/state/app/bootstrap.ts +23 -0
  859. package/src/state/hooks/inline-tickers.ts +30 -5
  860. package/src/sync/controller.ts +1 -1
  861. package/src/sync/core-contributors.ts +46 -14
  862. package/src/team/collections-sync.ts +2 -1
  863. package/src/team/collections.ts +178 -17
  864. package/src/telemetry/crash-reports.ts +21 -4
  865. package/src/telemetry/update-failures-node.ts +59 -0
  866. package/src/telemetry/update-failures.ts +307 -0
  867. package/src/test-support/builtin-panes.ts +1 -1
  868. package/src/theme/colors.ts +3 -30
  869. package/src/theme/ui-tokens.ts +37 -1
  870. package/src/tickers/company-name-listing.ts +215 -36
  871. package/src/tickers/company-name.ts +43 -0
  872. package/src/tickers/index-roots.ts +47 -0
  873. package/src/tickers/instrument-label.ts +5 -1
  874. package/src/tickers/listing-fate.ts +30 -0
  875. package/src/tickers/metadata.ts +10 -0
  876. package/src/tickers/perpetual-listing.ts +5 -2
  877. package/src/tickers/search/home-listing.ts +75 -0
  878. package/src/tickers/search/index.ts +76 -27
  879. package/src/tickers/search/ranking.ts +54 -4
  880. package/src/tickers/search/upsert.ts +29 -0
  881. package/src/tickers/terminal-codes.ts +416 -40
  882. package/src/time-series/bar-aggregation.ts +243 -0
  883. package/src/time-series/base-series.ts +307 -0
  884. package/src/time-series/chart-bounds.ts +349 -0
  885. package/src/time-series/chart-seed.ts +142 -0
  886. package/src/time-series/economic.ts +5 -0
  887. package/src/time-series/fundamentals.ts +18 -3
  888. package/src/time-series/history-acquisition.ts +499 -0
  889. package/src/time-series/leverage.ts +100 -0
  890. package/src/time-series/market-resolution.ts +4 -2
  891. package/src/time-series/market.ts +2 -1
  892. package/src/time-series/price-comparison.ts +175 -30
  893. package/src/time-series/range.ts +9 -1
  894. package/src/time-series/resolution.ts +174 -16
  895. package/src/time-series/resolve-context.ts +157 -0
  896. package/src/time-series/resolve.ts +126 -1577
  897. package/src/time-series/series-name.ts +38 -0
  898. package/src/time-series/series-presentation.ts +208 -0
  899. package/src/time-series/spec.ts +11 -6
  900. package/src/time-series/studies.ts +109 -12
  901. package/src/time-series/tail-reconcile.ts +121 -0
  902. package/src/time-series/types.ts +29 -2
  903. package/src/time-series/use-chart-resolution.ts +4 -5
  904. package/src/types/broker.ts +10 -0
  905. package/src/types/config.ts +14 -0
  906. package/src/types/data-provider.ts +20 -0
  907. package/src/types/exchange-rate.ts +6 -0
  908. package/src/types/financials.ts +104 -7
  909. package/src/types/headless.ts +83 -6
  910. package/src/types/instrument.ts +3 -0
  911. package/src/types/issuer-listings.ts +28 -0
  912. package/src/types/plugin.ts +65 -8
  913. package/src/types/price-history.ts +2 -0
  914. package/src/types/ticker.ts +13 -0
  915. package/src/types/trading.ts +59 -1
  916. package/src/ui/ascii-font.ts +13 -1
  917. package/src/ui/host.tsx +6 -1
  918. package/src/updater/command-names.ts +175 -0
  919. package/src/updater/failure.ts +163 -0
  920. package/src/updater/index.ts +97 -28
  921. package/src/utils/calendar-date.ts +32 -15
  922. package/src/utils/cash-runway.ts +241 -0
  923. package/src/utils/central-banks.ts +42 -0
  924. package/src/utils/cli-output.ts +259 -80
  925. package/src/utils/contract-month.ts +16 -0
  926. package/src/utils/crypto-pair.ts +61 -3
  927. package/src/utils/currency-pair.ts +26 -0
  928. package/src/utils/currency-units.ts +29 -0
  929. package/src/utils/datetime-format.ts +10 -0
  930. package/src/utils/debug-log.ts +1 -1
  931. package/src/utils/decimal-comma.ts +39 -6
  932. package/src/utils/exchange-announcements.ts +71 -0
  933. package/src/utils/exchange-rate-snapshot.ts +10 -0
  934. package/src/utils/financial-statements.ts +83 -4
  935. package/src/utils/format.ts +34 -16
  936. package/src/utils/fundamentals.ts +150 -34
  937. package/src/utils/fx-market-hours.ts +10 -1
  938. package/src/utils/latest-financial-period.ts +8 -0
  939. package/src/utils/linux-libc.ts +54 -0
  940. package/src/utils/market-capitalization.ts +111 -15
  941. package/src/utils/max-drawdown.ts +64 -0
  942. package/src/utils/network-failure.ts +83 -0
  943. package/src/utils/option-expiry.ts +139 -7
  944. package/src/utils/price-earnings.ts +11 -5
  945. package/src/utils/price-history.ts +18 -8
  946. package/src/utils/price-window.ts +131 -0
  947. package/src/utils/release-date.ts +47 -0
  948. package/src/utils/sec.ts +71 -0
  949. package/src/utils/throttled-fetch.ts +11 -4
  950. package/src/utils/trailing-eps.ts +67 -0
  951. package/src/utils/typed-text.ts +21 -0
  952. package/src/utils/utc-time.ts +24 -1
  953. package/src/version.ts +6 -0
  954. package/src/cli/pane-functions/screenshot.ts +0 -2122
@@ -21,7 +21,7 @@ function formatFatalError(error: unknown, details?: string): string {
21
21
  }
22
22
 
23
23
  export function DesktopFatalScreen({
24
- title = "Gloomberb crashed",
24
+ title = "Gloom crashed",
25
25
  error,
26
26
  details,
27
27
  source,
@@ -26,6 +26,7 @@ import { installElectrobunUpdateHost } from "./update-host";
26
26
  import { installScreenshotWatermark } from "./screenshot-watermark";
27
27
  import { installElectrobunWindowFullscreenTracking } from "./window-fullscreen";
28
28
  import { installDomMarketDataFrames } from "../../dom/data-frames";
29
+ import { releaseBootFrameWhenDrawn, startBootFrameRecorder } from "../../dom/boot-frame";
29
30
  import { DomErrorBoundary, DomHostProviders } from "../../dom/dom-host-providers";
30
31
  import { DesktopFatalScreen } from "./fatal-screen";
31
32
  import { resolveRendererWindowError } from "./renderer-window-error";
@@ -45,6 +46,7 @@ import { getMarketplaceHost, setPluginManager, type PluginManager } from "../../
45
46
  import { remoteNotesFilesIO, setNotesFilesIO } from "../../../plugins/builtin/notes/files";
46
47
  import { NOTES_FILES_CAPABILITY_ID } from "../../../capabilities";
47
48
  import { loadOfficialPluginIds } from "../../../plugins/marketplace/feed";
49
+ import { setPluginSeedNotice } from "../../../plugins/seed-notice";
48
50
  import { crashReportsEnabled, installCrashReporter, reportCrash } from "../../../telemetry/crash-reports";
49
51
  import { browserDoNotTrack, installWindowCrashListeners } from "../../../telemetry/crash-reports-dom";
50
52
  import { currentTelemetryConfig } from "../../../telemetry/live-config";
@@ -72,9 +74,14 @@ const bootLog = debugLog.createLogger("electrobun-web-boot");
72
74
  let appMounted = false;
73
75
 
74
76
  appRootElement.tabIndex = -1;
75
- root.render(<div className="gloom-loading">Starting Gloomberb...</div>);
77
+ // The page drew the layout this window last drew, or the bare shell, before
78
+ // this script loaded (dom/boot-frame.ts); it stays until the app has drawn its own.
79
+ const releaseBootFrame = releaseBootFrameWhenDrawn(document, appRootElement);
80
+ /** How long after the app mounts the launch frame stays at most. */
81
+ const BOOT_FRAME_RELEASE_FALLBACK_MS = 4_000;
76
82
 
77
- function renderFatalError(error: unknown, details?: string, title = "Gloomberb failed to start"): void {
83
+ function renderFatalError(error: unknown, details?: string, title = "Gloom failed to start"): void {
84
+ releaseBootFrame();
78
85
  root.render(
79
86
  <DesktopFatalScreen
80
87
  title={title}
@@ -94,7 +101,7 @@ window.__gloomRenderFatalError = (error, details, source) => {
94
101
  }) === "ignore") {
95
102
  return;
96
103
  }
97
- renderFatalError(error, details, "Gloomberb crashed");
104
+ renderFatalError(error, details, "Gloom crashed");
98
105
  };
99
106
 
100
107
  function focusWebSurface(): void {
@@ -113,9 +120,13 @@ function requestStartupFocus(): void {
113
120
 
114
121
  async function boot() {
115
122
  bootLog.info("boot started");
123
+ // Both asked for at once: the Bun process compiles the plugins while it
124
+ // answers `init`, rather than after this view asks a second time.
116
125
  const backendInitPromise = initElectrobunBackend();
126
+ const externalBundlesPromise = backendRequest("plugins.listExternal");
117
127
  // Avoid a premature global unhandled-rejection render while UI chunks load.
118
128
  void backendInitPromise.catch(() => {});
129
+ void externalBundlesPromise.catch(() => {});
119
130
 
120
131
  installElectrobunConfigStoreHost();
121
132
  installElectrobunBrokerRemoteClient();
@@ -156,6 +167,8 @@ async function boot() {
156
167
  : init.desktopSnapshot;
157
168
  const config = desktopSnapshot?.config ?? init.config;
158
169
  applyLanguageFromConfig(config);
170
+ // Said by the app once it is up, as the terminal says it.
171
+ setPluginSeedNotice(init.pluginSeedNotice ?? null);
159
172
  const desktopWindowBridge = createDesktopWindowBridge(init.windowKind, init.paneId);
160
173
  const desktopApplicationMenuBridge: DesktopApplicationMenuBridge = {
161
174
  subscribe: (listener) => onBackendMessage("application-menu.select", ({ command }) => listener(command)),
@@ -172,7 +185,11 @@ async function boot() {
172
185
  "startup.electrobun.load-external-plugins",
173
186
  async () => {
174
187
  try {
175
- return await loadDesktopExternalPlugins(await backendRequest("plugins.listExternal"));
188
+ // Asked once more if the early request failed: it waits for the
189
+ // whole launch, which a first run's plugin downloads can stretch past
190
+ // the request's time limit.
191
+ const bundles = await externalBundlesPromise.catch(() => backendRequest("plugins.listExternal"));
192
+ return await loadDesktopExternalPlugins(bundles);
176
193
  } catch (error) {
177
194
  debugLog.createLogger("desktop-plugins").error(`External plugin load failed: ${error}`);
178
195
  return [];
@@ -245,6 +262,15 @@ async function boot() {
245
262
  );
246
263
  appMounted = true;
247
264
  });
265
+ // A layout with neither panes nor a status bar has nothing to wait for.
266
+ window.setTimeout(releaseBootFrame, BOOT_FRAME_RELEASE_FALLBACK_MS);
267
+ if (init.windowKind === "main") {
268
+ startBootFrameRecorder({
269
+ doc: document,
270
+ root: appRootElement,
271
+ save: (frame) => { void backendRequest("host.saveBootFrame", { frame }).catch(() => {}); },
272
+ });
273
+ }
248
274
  requestStartupFocus();
249
275
  bootLog.info("root render scheduled", {
250
276
  layoutPanes: config.layout.instances.length,
@@ -1,15 +1,16 @@
1
1
  import { apiClient } from "../../../api-client";
2
2
  import { newsProvider, type NewsCapability } from "../../../capabilities";
3
- import { cloudNewsParams, mapCloudNewsArticle } from "../../../sources/gloomberb-cloud/news";
4
- import type { NewsArticle, NewsQuery } from "../../../types/news-source";
3
+ import { cloudNewsReadArticles, mapCloudNewsArticle, readCloudNews } from "../../../sources/gloomberb-cloud/news";
4
+ import type { NewsArticle, NewsPage, NewsQuery } from "../../../news/types";
5
5
 
6
6
  interface BackendNews {
7
7
  id: string;
8
8
  name: string;
9
9
  getNews(query: NewsQuery): Promise<NewsArticle[]>;
10
+ getNewsPage(query: NewsQuery): Promise<NewsPage>;
10
11
  }
11
12
 
12
- type CloudNewsClient = Pick<typeof apiClient, "getCloudNews" | "getCloudNewsStory">;
13
+ type CloudNewsClient = Pick<typeof apiClient, "getCloudNews" | "getCloudNewsStory" | "searchCloudNews">;
13
14
 
14
15
  /**
15
16
  * The view's only news source: the desktop view runs without capability
@@ -27,13 +28,14 @@ export function createDesktopNewsSource(backend: BackendNews, client: CloudNewsC
27
28
  fetchNews: (query) => backend.getNews(query),
28
29
  fetchNewsPage: async (query) => {
29
30
  try {
30
- const response = await client.getCloudNews(cloudNewsParams(query));
31
+ const read = await readCloudNews(client, query);
31
32
  return {
32
- articles: response.items.map((item) => mapCloudNewsArticle(item, query.ticker)),
33
- nextCursor: response.nextCursor ?? null,
33
+ articles: cloudNewsReadArticles(read, query.ticker),
34
+ nextCursor: read.nextCursor ?? null,
34
35
  };
35
36
  } catch {
36
- return { articles: await backend.getNews(query), nextCursor: null };
37
+ // The aggregate page keeps RSS failures beside any usable stories.
38
+ return backend.getNewsPage(query);
37
39
  }
38
40
  },
39
41
  fetchNewsStory: async (storyId) => mapCloudNewsArticle(await client.getCloudNewsStory(storyId)),
@@ -1,5 +1,5 @@
1
1
  import type { CapabilityManifest } from "../../../../capabilities";
2
- import type { NewsArticle, NewsQuery } from "../../../../news/types";
2
+ import type { NewsArticle, NewsPage, NewsQuery } from "../../../../news/types";
3
3
  import type { DataProvider } from "../../../../types/data-provider";
4
4
  import type { TickerFinancials } from "../../../../types/financials";
5
5
  import { backendRequest, getElectrobunBackendInitSnapshot, subscribeBackendCapability } from "../backend-rpc";
@@ -14,6 +14,7 @@ const ASSET_DATA_REQUEST_TIMEOUT_MS = 115_000;
14
14
 
15
15
  export type RemoteAssetDataClient = DataProvider & {
16
16
  getNews(query: NewsQuery): Promise<NewsArticle[]>;
17
+ getNewsPage(query: NewsQuery): Promise<NewsPage>;
17
18
  };
18
19
 
19
20
  interface RemoteAssetDataClientBase {
@@ -21,6 +22,7 @@ interface RemoteAssetDataClientBase {
21
22
  name: string;
22
23
  getCachedFinancialsForTargets: NonNullable<DataProvider["getCachedFinancialsForTargets"]>;
23
24
  getNews(query: NewsQuery): Promise<NewsArticle[]>;
25
+ getNewsPage(query: NewsQuery): Promise<NewsPage>;
24
26
  subscribeQuotes: NonNullable<DataProvider["subscribeQuotes"]>;
25
27
  }
26
28
 
@@ -119,7 +121,7 @@ export function createRemoteAssetDataClient(): RemoteAssetDataClient {
119
121
 
120
122
  const base: RemoteAssetDataClientBase = {
121
123
  id: "desktop-backend",
122
- name: "Gloomberb Backend",
124
+ name: "Gloom Backend",
123
125
  getCachedFinancialsForTargets: (targets, options) => (
124
126
  hasRendererOperation(assetDataOperations, "getCachedFinancialsForTargets")
125
127
  ? invoke<Map<string, TickerFinancials>>(ASSET_DATA_CAPABILITY_ID, "getCachedFinancialsForTargets", { targets, options })
@@ -130,6 +132,11 @@ export function createRemoteAssetDataClient(): RemoteAssetDataClient {
130
132
  ? invoke<NewsArticle[]>(NEWS_CAPABILITY_ID, "fetchNews", { query })
131
133
  : Promise.resolve([])
132
134
  ),
135
+ getNewsPage: (query) => (
136
+ hasRendererOperation(newsOperations, "fetchNewsPage")
137
+ ? invoke<NewsPage>(NEWS_CAPABILITY_ID, "fetchNewsPage", { query })
138
+ : Promise.reject(new Error("News is unavailable."))
139
+ ),
133
140
  subscribeQuotes: (targets, onQuote) => {
134
141
  if (!hasRendererOperation(assetDataOperations, "subscribeQuotes")) return () => {};
135
142
  return quoteSubscriptions.subscribe(targets, onQuote);
@@ -33,7 +33,7 @@ export const webRendererHost: RendererHost = {
33
33
  await backendRequest("host.windowControl", { action });
34
34
  },
35
35
  async openExternal(url) {
36
- await backendRequest("host.openExternal", { url });
36
+ return await backendRequest("host.openExternal", { url });
37
37
  },
38
38
  async copyText(text) {
39
39
  try {
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Opening a link in a browser the person can see, from a terminal. The
3
+ * terminal often runs somewhere else: over SSH, a browser started on that
4
+ * machine shows on its screen or nowhere, and `open` or `xdg-open` still
5
+ * report success. Those cases get no command at all, so the caller knows
6
+ * nothing opened and can show the link instead.
7
+ */
8
+
9
+ type Env = Readonly<Record<string, string | undefined>>;
10
+
11
+ function present(value: string | undefined): boolean {
12
+ return !!value?.trim();
13
+ }
14
+
15
+ /**
16
+ * The command `$BROWSER` names, with the link in it. Editors with a remote
17
+ * terminal (VS Code over SSH, Codespaces) point it at a helper that opens the
18
+ * link on the person's own machine. A `:` separated list takes its first entry.
19
+ */
20
+ function envBrowserCommand(browser: string, url: string): string[] | null {
21
+ const entry = browser.split(":")[0]?.trim();
22
+ if (!entry) return null;
23
+ const parts = entry.split(/\s+/);
24
+ return parts.some((part) => part.includes("%s"))
25
+ ? parts.map((part) => part.replaceAll("%s", url))
26
+ : [...parts, url];
27
+ }
28
+
29
+ /**
30
+ * The commands to try in order, each with the link as its last argument.
31
+ * Empty when this terminal cannot show a browser to the person using it.
32
+ */
33
+ export function browserOpenCommands(url: string, env: Env, platform: NodeJS.Platform): string[][] {
34
+ const remote = present(env.SSH_CONNECTION) || present(env.SSH_CLIENT) || present(env.SSH_TTY);
35
+ const forwarded = present(env.BROWSER) ? envBrowserCommand(env.BROWSER!, url) : null;
36
+
37
+ if (platform === "darwin") {
38
+ if (!remote) return [["open", url]];
39
+ return forwarded ? [forwarded] : [];
40
+ }
41
+ if (platform === "win32") {
42
+ if (!remote) return [["cmd", "/c", "start", "", url]];
43
+ return forwarded ? [forwarded] : [];
44
+ }
45
+
46
+ // Linux and the other unixes. WSL has no Linux browser, but Windows can
47
+ // open the link: `wslview` when wslu is installed, else Windows' own handler.
48
+ if (present(env.WSL_DISTRO_NAME) || present(env.WSL_INTEROP)) {
49
+ return [
50
+ ...(forwarded ? [forwarded] : []),
51
+ ["wslview", url],
52
+ ["rundll32.exe", "url.dll,FileProtocolHandler", url],
53
+ ];
54
+ }
55
+ const display = present(env.DISPLAY) || present(env.WAYLAND_DISPLAY);
56
+ // xdg-open reads $BROWSER itself, so a forwarding helper still applies.
57
+ if (remote && !display && !forwarded) return [];
58
+ return [["xdg-open", url]];
59
+ }
60
+
61
+ /** How long an opener may run before it counts as having opened the browser. */
62
+ const OPENER_SETTLE_MS = 5_000;
63
+
64
+ /**
65
+ * Runs one opener. Exit 0 opened the link; a missing command or another exit
66
+ * code did not. An opener still running after a few seconds is a browser
67
+ * started in the foreground of the command, which has opened the link.
68
+ */
69
+ export async function runBrowserOpener(command: string[]): Promise<boolean> {
70
+ try {
71
+ const proc = Bun.spawn(command, { stdin: "ignore", stdout: "ignore", stderr: "ignore" });
72
+ let timer: ReturnType<typeof setTimeout> | undefined;
73
+ const settled = new Promise<"running">((resolve) => {
74
+ timer = setTimeout(() => resolve("running"), OPENER_SETTLE_MS);
75
+ timer.unref?.();
76
+ });
77
+ const result = await Promise.race([proc.exited, settled]);
78
+ clearTimeout(timer);
79
+ if (result === "running") {
80
+ proc.unref();
81
+ return true;
82
+ }
83
+ return result === 0;
84
+ } catch {
85
+ // The command is not installed (xdg-open is missing on minimal Linux).
86
+ return false;
87
+ }
88
+ }
@@ -6,6 +6,7 @@ import type { KeyEventLike } from "../../react/input";
6
6
  import type { NativeRendererHost, PixelResolution, RendererHost } from "../../ui/host";
7
7
  import { colors } from "../../theme/colors";
8
8
  import { safeExternalUrl } from "../../utils/external-url";
9
+ import { browserOpenCommands, runBrowserOpener } from "./browser-open";
9
10
  import { buildTerminalMediaArgs, createTerminalMediaReaper, terminalMediaStateFile } from "./terminal-media";
10
11
  import { saveTextFileToDownloads } from "../../utils/save-text-file";
11
12
  import { installInteractionPerformanceRecorder } from "./interaction-performance";
@@ -129,23 +130,13 @@ export async function createOpenTuiHost(): Promise<OpenTuiHost> {
129
130
  requestExit: () => renderer.destroy(),
130
131
  async openExternal(rawUrl) {
131
132
  const url = safeExternalUrl(rawUrl);
132
- if (!url) return;
133
- const command = process.platform === "darwin"
134
- ? ["open", url]
135
- : process.platform === "win32"
136
- ? ["cmd", "/c", "start", "", url]
137
- : ["xdg-open", url];
138
- try {
139
- const proc = Bun.spawn(command, {
140
- stdout: "ignore",
141
- stderr: "ignore",
142
- });
143
- if (await proc.exited === 0) return;
144
- } catch {
145
- // No opener installed (xdg-open is missing on minimal Linux and WSL).
133
+ if (!url) return false;
134
+ for (const command of browserOpenCommands(url, process.env, process.platform)) {
135
+ if (await runBrowserOpener(command)) return true;
146
136
  }
147
137
  // Leave the link on the clipboard, so it can at least be pasted.
148
138
  renderer.copyToClipboardOSC52(url);
139
+ return false;
149
140
  },
150
141
  async copyText(text) {
151
142
  if (!text) return;
@@ -1,4 +1,3 @@
1
- import { Jimp } from "jimp";
2
1
  import type { NativeChartBitmap } from "../../../components/chart/native/chart-rasterizer";
3
2
 
4
3
  type ImageObjectFit = "contain" | "cover";
@@ -67,7 +66,9 @@ function loadSourceImage(src: string): Promise<JimpImageLike> {
67
66
  if (cached) return cached;
68
67
 
69
68
  const promise = fetchImageBytes(src)
70
- .then((bytes) => Jimp.read(bytes))
69
+ // Loaded with the first image: the decoder is a large part of what the
70
+ // terminal would otherwise load before it draws anything.
71
+ .then(async (bytes) => (await import("jimp")).Jimp.read(bytes))
71
72
  .then(adaptJimpImage)
72
73
  .catch((error) => {
73
74
  sourceImageCache.delete(src);
@@ -1 +1,10 @@
1
- import "@opentui/core";
1
+ import { resolveRenderLib } from "@opentui/core";
2
+ import { loadRenderLib } from "./render-lib";
3
+
4
+ // Loaded the way a launch loads it, so the smoke covers the cache folder used
5
+ // when the temp folder cannot run the library.
6
+ await loadRenderLib();
7
+ // Importing @opentui/core swallows a render library that fails to load and
8
+ // throws only on first use, so load it here: the glibc library on a musl
9
+ // system fails this way ("getcontext: symbol not found").
10
+ resolveRenderLib();
@@ -1,5 +1,4 @@
1
1
  import type { CliRenderer } from "@opentui/core";
2
- import { Jimp } from "jimp";
3
2
  import type { NativeSurfaceManager } from "../../../components/chart/native/surface/manager";
4
3
  import type { CellRect } from "../../../components/chart/native/chart-rasterizer";
5
4
  import { intersectCellRects } from "../../../components/chart/native/chart-rasterizer";
@@ -95,6 +94,8 @@ export async function captureTerminalPaneImage(
95
94
  const base = hexRgb(background);
96
95
  const layers = imageLayers(manager, clipRect(rect, renderer.currentRenderBuffer.width, renderer.currentRenderBuffer.height)!);
97
96
  const image = rasterizeFrame(frame, layers, base);
97
+ // Loaded on the first capture rather than with the terminal.
98
+ const { Jimp } = await import("jimp");
98
99
  const jimp = new Jimp({ width: image.width, height: image.height, data: Buffer.from(image.pixels.buffer, image.pixels.byteOffset, image.pixels.byteLength) });
99
100
  const png = await jimp.getBuffer("image/png");
100
101
  return {
@@ -0,0 +1,253 @@
1
+ /**
2
+ * Loads OpenTUI's native render library before the terminal starts, and
3
+ * keeps the standalone binary starting when its temp folder cannot run it.
4
+ *
5
+ * A Bun-compiled binary carries the library inside itself. Bun's dlopen
6
+ * writes it to a new file in the temp folder on every launch and loads that
7
+ * file. When the folder is full or read-only the write fails and the load
8
+ * fails on the path inside the binary ("/$bunfs/root/libopentui-*.so: cannot
9
+ * open shared object file"); when it is mounted noexec the file is written
10
+ * but cannot be mapped ("failed to map segment from shared object"). Either
11
+ * way the library is copied once into the native cache folder and loaded
12
+ * from there on every later launch. The copy is named after the embedded
13
+ * file, whose name carries a hash of its contents, so an upgrade never loads
14
+ * an older library.
15
+ *
16
+ * Bun never deletes the files it writes, so each launch would leave 8 MB in
17
+ * the temp folder until it fills up. On Linux the one this launch mapped is
18
+ * removed once it is loaded: the mapping keeps it usable until exit.
19
+ */
20
+ import { mkdirSync, readdirSync, readFileSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "fs";
21
+ import { basename, dirname, join } from "path";
22
+ import { getGloomberbDirs } from "../../data/config/home";
23
+
24
+ /** Where the render library sits inside a standalone binary. */
25
+ interface EmbeddedRenderLib {
26
+ /** The library @opentui/core loads by default. */
27
+ path: string;
28
+ /** Linux: the musl library, which it loads instead when `OPENTUI_LIBC` is `musl`. */
29
+ musl?: string;
30
+ }
31
+
32
+ let embeddedRenderLib: EmbeddedRenderLib | null = null;
33
+
34
+ /**
35
+ * Where the standalone binary carries its render library. A package or a
36
+ * checkout has none.
37
+ * @knipignore Called by the module scripts/build.ts writes for the release binary.
38
+ */
39
+ export function useEmbeddedRenderLib(lib: EmbeddedRenderLib): void {
40
+ embeddedRenderLib = lib;
41
+ }
42
+
43
+ /** The embedded library @opentui/core picks, by the same rule it uses. */
44
+ function embeddedRenderLibPath(env: NodeJS.ProcessEnv): string | null {
45
+ if (!embeddedRenderLib) return null;
46
+ return env.OPENTUI_LIBC === "musl" && embeddedRenderLib.musl ? embeddedRenderLib.musl : embeddedRenderLib.path;
47
+ }
48
+
49
+ /**
50
+ * The folder Bun writes embedded libraries to before loading them: a
51
+ * non-empty `BUN_TMPDIR`, else `TMPDIR`, `TMP` or `TEMP`, else the platform's
52
+ * (Bun 1.3, `RealFS.tmpdirPath`).
53
+ */
54
+ function bunTempDir(env: NodeJS.ProcessEnv, platform: NodeJS.Platform): string {
55
+ const dir = env.BUN_TMPDIR || env.TMPDIR || env.TMP || env.TEMP;
56
+ if (dir) return dir.length > 1 && /[\\/]$/.test(dir) ? dir.slice(0, -1) : dir;
57
+ if (platform === "darwin") return "/private/tmp";
58
+ if (platform === "win32") return `${(env.SYSTEMROOT || env.WINDIR || "C:\\Windows").replace(/\\$/, "")}\\Temp`;
59
+ return "/tmp";
60
+ }
61
+
62
+ /** How Bun names the copy it writes: `.<hex>-<HEX>.so` (`.dylib`, `.dll`). */
63
+ const BUN_EXTRACTED_NAME = /^\.[0-9a-f]+-[0-9A-F]+\.(?:so|dylib|dll)$/;
64
+
65
+ /**
66
+ * The temp folder copies this process has mapped, read from
67
+ * `/proc/self/maps`: `address perms offset dev inode path`, with
68
+ * ` (deleted)` after a path that is gone.
69
+ */
70
+ function mappedExtractedCopies(maps: string, tempDir: string): string[] {
71
+ const copies = new Set<string>();
72
+ for (const line of maps.split("\n")) {
73
+ const path = /^\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\/.*)$/.exec(line)?.[1];
74
+ if (!path || path.endsWith(" (deleted)")) continue;
75
+ if (dirname(path) === tempDir && BUN_EXTRACTED_NAME.test(basename(path))) copies.add(path);
76
+ }
77
+ return [...copies];
78
+ }
79
+
80
+ /**
81
+ * Copies of the library Bun wrote to the temp folder during this launch and
82
+ * could not load: a noexec folder holds a whole copy for every attempt, a
83
+ * full one a cut-off copy. Matched by Bun's naming, a size up to the
84
+ * library's and a write time after this process started.
85
+ */
86
+ function failedExtractedCopies(tempDir: string, size: number, sinceMs: number): string[] {
87
+ return listDir(tempDir).filter((name) => BUN_EXTRACTED_NAME.test(name)).map((name) => join(tempDir, name)).filter((path) => {
88
+ try {
89
+ const stat = statSync(path);
90
+ return stat.isFile() && stat.size <= size && stat.mtimeMs >= sinceMs;
91
+ } catch {
92
+ // Intentional ignore: a copy that vanished needs no removal.
93
+ return false;
94
+ }
95
+ });
96
+ }
97
+
98
+ function listDir(dir: string): string[] {
99
+ try {
100
+ return readdirSync(dir);
101
+ } catch {
102
+ // Intentional ignore: an unreadable folder holds nothing we could remove.
103
+ return [];
104
+ }
105
+ }
106
+
107
+ function removeFiles(paths: readonly string[]): void {
108
+ for (const path of paths) {
109
+ try {
110
+ rmSync(path, { force: true });
111
+ } catch {
112
+ // Intentional ignore: a copy left behind only costs disk space.
113
+ }
114
+ }
115
+ }
116
+
117
+ /** Puts the embedded library in the cache folder unless an intact copy is there, and returns its path. */
118
+ function cachedCopy(embeddedPath: string, size: number, cacheDir: string): string {
119
+ const name = basename(embeddedPath);
120
+ const target = join(cacheDir, name);
121
+ try {
122
+ if (statSync(target).size === size) return target;
123
+ } catch {
124
+ // Intentional ignore: no copy yet, written below.
125
+ }
126
+ mkdirSync(cacheDir, { recursive: true });
127
+ const partial = join(cacheDir, `.${name}.${process.pid}.partial`);
128
+ try {
129
+ writeFileSync(partial, readFileSync(embeddedPath), { mode: 0o755 });
130
+ renameSync(partial, target);
131
+ } catch (error) {
132
+ removeFiles([partial]);
133
+ throw error;
134
+ }
135
+ // The copy an earlier version left, now unused. Another launch's partial
136
+ // copy (dot-named) is still being written and stays.
137
+ removeFiles(listDir(cacheDir).filter((entry) => entry !== name && entry.startsWith("libopentui")).map((entry) => join(cacheDir, entry)));
138
+ return target;
139
+ }
140
+
141
+ /**
142
+ * A failed load the folder the library was in explains: it never left the
143
+ * binary because the temp folder took no file (`$bunfs`, `~BUN` on Windows),
144
+ * or the folder does not let code run from it (glibc: "failed to map
145
+ * segment", musl: "Operation not permitted"). A missing symbol or dependency
146
+ * fails wherever the file sits.
147
+ */
148
+ function isFolderFailure(error: unknown): boolean {
149
+ const message = error instanceof Error ? error.message : String(error);
150
+ return /\$bunfs|~BUN|failed to map segment|operation not permitted|permission denied/i.test(message);
151
+ }
152
+
153
+ /** Neither the temp folder nor the cache folder can hold and run the library. */
154
+ export class RenderLibUnavailableError extends Error {
155
+ constructor(tempDir: string, cacheDir: string) {
156
+ super(
157
+ `Gloom can't load its render library: neither the temp folder ${tempDir} nor ${cacheDir} can hold and run it. `
158
+ + "Start it with TMPDIR set to a writable folder that allows running programs: TMPDIR=/path/to/folder gloom",
159
+ );
160
+ this.name = "RenderLibUnavailableError";
161
+ }
162
+ }
163
+
164
+ export interface RenderLibLoadOptions {
165
+ /** Points @opentui/core at a library file (undefined: the one it picks) and loads it, throwing what loading threw. */
166
+ load(path?: string): void;
167
+ /** The library inside a standalone binary; null for a package or a checkout. */
168
+ embeddedPath: string | null;
169
+ tempDir: string;
170
+ cacheDir: string;
171
+ /** `/proc/self/maps`, or null where there is none. */
172
+ readMaps(): string | null;
173
+ /** When this process started, in epoch milliseconds. */
174
+ startedAtMs: number;
175
+ }
176
+
177
+ /**
178
+ * Loads the library from the temp folder, and from the cache folder when
179
+ * the temp folder cannot hold or run it. Anything this cannot help with is
180
+ * left as it was: the terminal then fails on it where it always did.
181
+ * Throws {@link RenderLibUnavailableError} when both folders fail.
182
+ */
183
+ export function loadRenderLibWith(options: RenderLibLoadOptions): void {
184
+ const { load, embeddedPath, tempDir, cacheDir } = options;
185
+ let tempError: unknown;
186
+ try {
187
+ load();
188
+ if (embeddedPath) removeFiles(mappedExtractedCopies(options.readMaps() ?? "", realPath(tempDir)));
189
+ return;
190
+ } catch (error) {
191
+ if (!embeddedPath) return;
192
+ tempError = error;
193
+ }
194
+
195
+ let size: number;
196
+ try {
197
+ size = statSync(embeddedPath).size;
198
+ } catch {
199
+ // Intentional ignore: without the embedded file there is nothing to copy, so the original failure stands.
200
+ return;
201
+ }
202
+ // The margin allows for file systems with coarse times.
203
+ removeFiles(failedExtractedCopies(tempDir, size, options.startedAtMs - 2_000));
204
+
205
+ let cachePath: string;
206
+ try {
207
+ cachePath = cachedCopy(embeddedPath, size, cacheDir);
208
+ } catch {
209
+ // The cache folder cannot hold it either. Only the temp folder's fault is reported as such.
210
+ if (isFolderFailure(tempError)) throw new RenderLibUnavailableError(tempDir, cacheDir);
211
+ return;
212
+ }
213
+ try {
214
+ load(cachePath);
215
+ } catch (cacheError) {
216
+ if (isFolderFailure(tempError) && isFolderFailure(cacheError)) throw new RenderLibUnavailableError(tempDir, cacheDir);
217
+ }
218
+ }
219
+
220
+ function realPath(path: string): string {
221
+ try {
222
+ return realpathSync(path);
223
+ } catch {
224
+ // Intentional ignore: a temp folder that does not resolve holds nothing mapped.
225
+ return path;
226
+ }
227
+ }
228
+
229
+ function readProcessMaps(): string | null {
230
+ if (process.platform !== "linux") return null;
231
+ try {
232
+ return readFileSync("/proc/self/maps", "utf8");
233
+ } catch {
234
+ // Intentional ignore: without /proc the copy stays, as it always did.
235
+ return null;
236
+ }
237
+ }
238
+
239
+ /** Loads the render library for this process; see {@link loadRenderLibWith}. */
240
+ export async function loadRenderLib(): Promise<void> {
241
+ const { resolveRenderLib, setRenderLibPath } = await import("@opentui/core");
242
+ loadRenderLibWith({
243
+ load(path) {
244
+ if (path) setRenderLibPath(path);
245
+ resolveRenderLib();
246
+ },
247
+ embeddedPath: embeddedRenderLibPath(process.env),
248
+ tempDir: bunTempDir(process.env, process.platform),
249
+ cacheDir: getGloomberbDirs().nativeCache,
250
+ readMaps: readProcessMaps,
251
+ startedAtMs: performance.timeOrigin,
252
+ });
253
+ }
@@ -3,7 +3,7 @@ import { testRender } from "@opentui/react/test-utils";
3
3
 
4
4
  /**
5
5
  * A global install runs react-reconciler without its patch (see
6
- * bin/gloomberb). If the dev build's user timing turns back on, every render
6
+ * bin/gloom). If the dev build's user timing turns back on, every render
7
7
  * adds a performance.measure entry that Bun never frees (#452).
8
8
  */
9
9
  export async function assertRendersLeaveNoTimingEntries(): Promise<void> {
@@ -37,6 +37,9 @@ import {
37
37
  readOrCreateInstallId,
38
38
  } from "../../telemetry/crash-reports-node";
39
39
  import { currentTelemetryConfig } from "../../telemetry/live-config";
40
+ import { installUpdateFailureReporter } from "../../telemetry/update-failures";
41
+ import { createNodeUpdateFailureHost } from "../../telemetry/update-failures-node";
42
+ import { terminalInstallKind } from "../../updater";
40
43
  import { flushUsageCounts, installUsageCounter, usageCountsEnabled } from "../../telemetry/usage-counts";
41
44
  import { attentionCountsEnabled, installAttentionCounter } from "../../telemetry/attention-counts";
42
45
  import { starPromptEnvironmentAllows } from "../../app/star-prompt/model";
@@ -57,7 +60,7 @@ export async function startOpenTuiApp({ externalPlugins, cliLaunchRequest }: Sta
57
60
  debugLog.interceptConsole();
58
61
 
59
62
  const appLog = debugLog.createLogger("app");
60
- appLog.info("Gloomberb starting");
63
+ appLog.info("Gloom starting");
61
64
  const remoteControlAdapter: RemoteControlAdapter = {
62
65
  terminalDevice: { kind: "tui", name: hostname() },
63
66
  startServer: ({ dataDir, handle }) => {
@@ -117,6 +120,10 @@ export async function startOpenTuiApp({ externalPlugins, cliLaunchRequest }: Sta
117
120
  surface: "terminal",
118
121
  getConfig: () => ({ dataDir: config.dataDir, telemetry: currentTelemetryConfig(config)?.telemetry }),
119
122
  }));
123
+ installUpdateFailureReporter(createNodeUpdateFailureHost({
124
+ installKind: terminalInstallKind(),
125
+ getDataDir: () => config.dataDir,
126
+ }));
120
127
  installUsageCounter({
121
128
  surface: "terminal",
122
129
  os: describeNodeOs(),