gloomberb 0.17.6 → 0.18.0

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 (768) hide show
  1. package/README.md +2 -0
  2. package/README.zh-CN.md +2 -0
  3. package/package.json +6 -1
  4. package/patches/electrobun@1.18.1.patch +74 -0
  5. package/src/account/auth-model.ts +3 -2
  6. package/src/account/device-signin-dialog.tsx +38 -13
  7. package/src/account/device-signin.ts +2 -1
  8. package/src/account/upgrade-dialog.tsx +6 -2
  9. package/src/api-client/askg.ts +5 -3
  10. package/src/api-client/bank-figures.ts +73 -0
  11. package/src/api-client/credit-boards.ts +21 -1
  12. package/src/api-client/crypto-markets.ts +88 -1
  13. package/src/api-client/data.ts +104 -4
  14. package/src/api-client/debt-maturities.ts +18 -0
  15. package/src/api-client/equity-screener.ts +3 -0
  16. package/src/api-client/errors.ts +13 -0
  17. package/src/api-client/fund-facts.ts +72 -0
  18. package/src/api-client/futures-curve.ts +26 -3
  19. package/src/api-client/geo.ts +11 -1
  20. package/src/api-client/index.ts +25 -2
  21. package/src/api-client/insider-signals.ts +95 -11
  22. package/src/api-client/normalizers.ts +1 -0
  23. package/src/api-client/paths.ts +20 -1
  24. package/src/api-client/request.ts +11 -3
  25. package/src/api-client/research-activity.ts +15 -8
  26. package/src/api-client/socket.ts +6 -3
  27. package/src/api-client/supply-chain-graph.ts +2 -2
  28. package/src/api-client/supply-chain.ts +8 -0
  29. package/src/api-client/tape.ts +12 -0
  30. package/src/api-client/types.ts +66 -2
  31. package/src/api-client/upgrade-experiment.ts +4 -3
  32. package/src/api-client/wall-experiments.ts +5 -3
  33. package/src/api-client/wall-summary.ts +3 -1
  34. package/src/api-client/web-experiments.ts +5 -2
  35. package/src/api-client/yield-curves.ts +17 -0
  36. package/src/app/command-bar-intro.ts +38 -0
  37. package/src/app/keybindings/actions.ts +1 -1
  38. package/src/app/pane-runtime/pane-template-runtime.ts +35 -7
  39. package/src/app/pane-runtime/plugin-bindings.ts +4 -0
  40. package/src/app/pane-runtime/ticker-open-runtime.ts +4 -14
  41. package/src/app/pane-runtime/ticker-open-target.ts +31 -0
  42. package/src/app/runtime/desktop-deeplink.ts +3 -4
  43. package/src/app/runtime/plugin-bindings.ts +3 -2
  44. package/src/app/runtime/startup.ts +3 -4
  45. package/src/app/runtime/ticker-refresh.ts +13 -12
  46. package/src/app/runtime/update.ts +3 -2
  47. package/src/architecture/core-builtin-allowlist.json +0 -3
  48. package/src/architecture/silent-catch-allowlist.json +3 -0
  49. package/src/architecture/ui-literals-allowlist.json +186 -0
  50. package/src/architecture/ui-tokens-allowlist.json +40 -0
  51. package/src/ask-gloom/pane-context.ts +3 -1
  52. package/src/brokers/signed-in/catalog.ts +2 -1
  53. package/src/brokers/signed-in/client.ts +7 -2
  54. package/src/brokers/signed-in/sign-in-dialog.tsx +120 -26
  55. package/src/brokers/signed-in/sign-in.ts +22 -20
  56. package/src/brokers/sync-broker-instance.ts +2 -1
  57. package/src/capabilities/chart-series.ts +2 -0
  58. package/src/capabilities/registry.ts +1 -3
  59. package/src/cli/bank-section.ts +147 -0
  60. package/src/cli/base-converter.ts +5 -2
  61. package/src/cli/board-coins.ts +70 -0
  62. package/src/cli/commands/fred-series.ts +90 -0
  63. package/src/cli/commands/market.ts +340 -69
  64. package/src/cli/commands/news-search.ts +35 -2
  65. package/src/cli/commands/options-chain.ts +7 -5
  66. package/src/cli/commands/options-leaps.ts +3 -3
  67. package/src/cli/commands/overview.ts +78 -29
  68. package/src/cli/commands/plugins.ts +1 -0
  69. package/src/cli/commands/search.ts +87 -24
  70. package/src/cli/commands/system.ts +5 -2
  71. package/src/cli/commands/ticker.ts +337 -60
  72. package/src/cli/context.ts +2 -1
  73. package/src/cli/desktop-pane-shot.ts +11 -3
  74. package/src/cli/earnings-calendar.ts +2 -1
  75. package/src/cli/errors.ts +10 -0
  76. package/src/cli/export-source.ts +18 -3
  77. package/src/cli/glossary.ts +196 -14
  78. package/src/cli/history-rows.ts +60 -9
  79. package/src/cli/index-roots.ts +26 -0
  80. package/src/cli/index.ts +34 -9
  81. package/src/cli/known-gaps.ts +156 -22
  82. package/src/cli/listing-arg.ts +156 -12
  83. package/src/cli/listing-suggestion.ts +4 -2
  84. package/src/cli/name-entries.ts +76 -0
  85. package/src/cli/not-a-ticker.ts +15 -6
  86. package/src/cli/pane-functions/access-gate.ts +22 -0
  87. package/src/cli/pane-functions/capabilities.ts +62 -4
  88. package/src/cli/pane-functions/catalog.ts +94 -39
  89. package/src/cli/pane-functions/data.ts +6 -5
  90. package/src/cli/pane-functions/discovery.ts +1 -1
  91. package/src/cli/pane-functions/dom.ts +3 -3
  92. package/src/cli/pane-functions/freshness.ts +49 -8
  93. package/src/cli/pane-functions/function-help.ts +13 -10
  94. package/src/cli/pane-functions/headless.ts +177 -42
  95. package/src/cli/pane-functions/index.ts +64 -8
  96. package/src/cli/pane-functions/options.ts +17 -3
  97. package/src/cli/pane-functions/report-notices.ts +17 -3
  98. package/src/cli/pane-functions/resolver.ts +48 -13
  99. package/src/cli/pane-functions/screenshot.ts +124 -23
  100. package/src/cli/pane-functions/shot-options.ts +68 -0
  101. package/src/cli/perpetual-contract.ts +3 -1
  102. package/src/cli/report-tables.ts +10 -2
  103. package/src/cli/staged-tickers.ts +5 -0
  104. package/src/cli/statement-filings.ts +261 -0
  105. package/src/cli/symbol-args.ts +47 -8
  106. package/src/cli/symbol-list.ts +9 -2
  107. package/src/cli/symbol-rows.ts +269 -29
  108. package/src/cli/ticker-resolution.ts +148 -34
  109. package/src/cli/treasury-yields.ts +86 -0
  110. package/src/cli/types.ts +3 -0
  111. package/src/cli/uncovered-instrument.ts +20 -0
  112. package/src/components/chart/composite/axis-overlays.tsx +16 -9
  113. package/src/components/chart/composite/composite-chart.tsx +85 -6
  114. package/src/components/chart/composite/downsample.ts +19 -3
  115. package/src/components/chart/composite/format.ts +3 -0
  116. package/src/components/chart/composite/legend.tsx +155 -76
  117. package/src/components/chart/composite/panel-bitmap.ts +8 -2
  118. package/src/components/chart/composite/panel-surface.tsx +3 -3
  119. package/src/components/chart/composite/toolbar.tsx +12 -7
  120. package/src/components/chart/composite/types.ts +6 -0
  121. package/src/components/chart/composite/use-composite-chart-keyboard.ts +28 -1
  122. package/src/components/chart/curve/curve-surface.tsx +1 -1
  123. package/src/components/chart/static/series.ts +39 -0
  124. package/src/components/chart/static/trail-chart-surface.tsx +2 -1
  125. package/src/components/command-bar/commands/collection-list.ts +45 -15
  126. package/src/components/command-bar/commands/collection.ts +10 -3
  127. package/src/components/command-bar/commands/registry.ts +2 -2
  128. package/src/components/command-bar/list/badge.ts +4 -3
  129. package/src/components/command-bar/list/model.ts +5 -0
  130. package/src/components/command-bar/list/view.tsx +1 -1
  131. package/src/components/command-bar/panel/index.tsx +19 -8
  132. package/src/components/command-bar/panel/native-surface.ts +6 -4
  133. package/src/components/command-bar/panel/prompt-example.ts +22 -0
  134. package/src/components/command-bar/routes/root/provider-search.ts +3 -9
  135. package/src/components/command-bar/routes/root/results.ts +13 -0
  136. package/src/components/command-bar/routes/root/start-here.ts +90 -0
  137. package/src/components/command-bar/routes/ticker-search/results.ts +42 -3
  138. package/src/components/command-bar/routes/ticker-search/route.ts +3 -10
  139. package/src/components/command-bar/theme-picker.tsx +3 -1
  140. package/src/components/command-bar/workflow/builtin.ts +5 -1
  141. package/src/components/command-bar/workflow/collection-actions.ts +21 -12
  142. package/src/components/command-bar/workflow/ops.ts +21 -1
  143. package/src/{plugins/builtin/portfolio-list/command-bar.ts → components/command-bar/workflow/portfolio-position.ts} +42 -9
  144. package/src/components/command-bar/workflow/tickers.ts +6 -4
  145. package/src/components/feedback-dialog.tsx +1 -1
  146. package/src/components/form-modal/broker-step.tsx +7 -63
  147. package/src/components/form-modal/content.tsx +7 -2
  148. package/src/components/form-modal/field-row.tsx +6 -8
  149. package/src/components/form-modal/host.tsx +3 -3
  150. package/src/components/form-modal/model.ts +3 -0
  151. package/src/components/form-modal/routes.ts +17 -2
  152. package/src/components/index.ts +6 -6
  153. package/src/components/input-search-bar.tsx +43 -6
  154. package/src/components/layout/detached-pane-shell.tsx +0 -1
  155. package/src/components/layout/floating-pane.tsx +0 -1
  156. package/src/components/layout/header.tsx +8 -7
  157. package/src/components/layout/pane/footer/index.tsx +7 -4
  158. package/src/components/layout/pane/footer/model.ts +28 -2
  159. package/src/components/layout/pane/header.tsx +9 -19
  160. package/src/components/layout/pane/index.tsx +0 -1
  161. package/src/components/layout/pane/instrument-coverage-gate.tsx +57 -0
  162. package/src/components/layout/pane/pane-tabs.tsx +4 -3
  163. package/src/components/layout/pane/sizing.ts +9 -0
  164. package/src/components/layout/pane/ticker-fate-gate.tsx +8 -2
  165. package/src/components/layout/shell/pane/capture.ts +44 -20
  166. package/src/components/layout/status-bar.tsx +3 -6
  167. package/src/components/markdown-text.tsx +17 -2
  168. package/src/components/market-board/index.tsx +19 -8
  169. package/src/components/metric-treemap/heat-surface.tsx +2 -7
  170. package/src/components/onboarding/account-step/qr-panel.tsx +5 -2
  171. package/src/components/onboarding/onboarding-frame.tsx +24 -21
  172. package/src/components/onboarding/portfolio-step/positions-panel.tsx +20 -10
  173. package/src/components/onboarding/wizard-positions.ts +40 -11
  174. package/src/components/pane-settings-dialog/desktop.tsx +12 -50
  175. package/src/components/pane-settings-dialog/field-dialogs.tsx +1 -1
  176. package/src/components/price-performance.tsx +18 -2
  177. package/src/components/reader/article-reader.tsx +11 -10
  178. package/src/components/reader/detail-reader.tsx +9 -5
  179. package/src/components/reader/reader-text.tsx +51 -24
  180. package/src/components/sign-in-code-panel.tsx +129 -75
  181. package/src/components/ticker/badge/index.tsx +2 -1
  182. package/src/components/ui/action-row.tsx +5 -2
  183. package/src/components/ui/audio-player.tsx +70 -0
  184. package/src/components/ui/card.tsx +75 -0
  185. package/src/components/ui/data-table/index.tsx +4 -2
  186. package/src/components/ui/data-table/types.ts +11 -0
  187. package/src/components/ui/detail-scroll-body.tsx +1 -1
  188. package/src/components/ui/dialog-actions.tsx +1 -21
  189. package/src/components/ui/display.tsx +13 -5
  190. package/src/components/ui/external-link.tsx +4 -2
  191. package/src/components/ui/fields.tsx +12 -0
  192. package/src/components/ui/figure.tsx +5 -3
  193. package/src/components/ui/frame.tsx +40 -6
  194. package/src/components/ui/icon.tsx +4 -0
  195. package/src/components/ui/index.ts +4 -1
  196. package/src/components/ui/list-view.tsx +8 -0
  197. package/src/components/ui/prose.tsx +97 -25
  198. package/src/components/ui/query-bar-keys.tsx +3 -1
  199. package/src/components/ui/query-bar.tsx +6 -0
  200. package/src/components/ui/quote.ts +42 -0
  201. package/src/components/ui/range-track.tsx +15 -2
  202. package/src/components/ui/reveal-in-scroll-box.ts +21 -3
  203. package/src/components/ui/select-button.tsx +38 -3
  204. package/src/components/ui/status.tsx +73 -4
  205. package/src/components/ui/table-layout.ts +20 -0
  206. package/src/components/use-pinned-moment.ts +19 -0
  207. package/src/core/app-runtime.ts +2 -2
  208. package/src/core/state/app/instrument.ts +18 -1
  209. package/src/core/state/app/layout.ts +6 -0
  210. package/src/core/state/app/state.ts +14 -2
  211. package/src/data/cached-query.ts +1 -1
  212. package/src/data/config/chart-settings.ts +3 -1
  213. package/src/data/config/home.ts +4 -1
  214. package/src/data/config/store/node.ts +9 -4
  215. package/src/data/config/store/normalize.ts +9 -0
  216. package/src/data/json-storage.ts +6 -3
  217. package/src/data/json-ticker-repository.ts +3 -1
  218. package/src/data/plugin-cache.ts +5 -1
  219. package/src/data/sqlite/json.ts +3 -1
  220. package/src/data/ticker-repository.ts +5 -2
  221. package/src/feedback/diagnostics.ts +2 -6
  222. package/src/i18n/es.ts +86 -6
  223. package/src/i18n/index.ts +3 -9
  224. package/src/i18n/ja.ts +86 -6
  225. package/src/i18n/ko.ts +86 -6
  226. package/src/i18n/zh-cn.ts +86 -6
  227. package/src/i18n/zh-tw.ts +86 -6
  228. package/src/layout-marketplace/gallery-desktop.tsx +8 -4
  229. package/src/market-data/bars-per-year.ts +43 -0
  230. package/src/market-data/bond-funds.ts +85 -0
  231. package/src/market-data/coordinator/auxiliary.ts +5 -2
  232. package/src/market-data/coordinator/index.ts +6 -5
  233. package/src/market-data/futures-contract.ts +102 -5
  234. package/src/market-data/hooks.tsx +20 -11
  235. package/src/market-data/market/bar-period.ts +36 -0
  236. package/src/market-data/market/format.ts +5 -13
  237. package/src/market-data/market/freshness.ts +1 -3
  238. package/src/market-data/market/index-level.ts +51 -0
  239. package/src/market-data/model-dividend-yield.ts +57 -16
  240. package/src/market-data/quotes/live-valuation.ts +48 -2
  241. package/src/market-data/realized-volatility.ts +16 -7
  242. package/src/market-data/tax-equivalent.ts +344 -0
  243. package/src/news/aggregator.ts +4 -2
  244. package/src/notifications/notification-log.ts +5 -3
  245. package/src/plugins/auto-update-node.ts +1 -0
  246. package/src/plugins/builtin/account-management/footer.ts +1 -1
  247. package/src/plugins/builtin/account-management/keyboard.ts +3 -0
  248. package/src/plugins/builtin/account-management/model.ts +1 -0
  249. package/src/plugins/builtin/account-management/pane.tsx +71 -19
  250. package/src/plugins/builtin/account-management/trial-cancel.ts +40 -0
  251. package/src/plugins/builtin/alerts/cli.ts +7 -18
  252. package/src/plugins/builtin/alerts/constants.ts +8 -0
  253. package/src/plugins/builtin/alerts/event-rows.ts +16 -0
  254. package/src/plugins/builtin/alerts/events-pane.tsx +2 -14
  255. package/src/plugins/builtin/alerts/headless.ts +182 -0
  256. package/src/plugins/builtin/alerts/index.tsx +3 -0
  257. package/src/plugins/builtin/alerts/pane.tsx +1 -7
  258. package/src/plugins/builtin/alerts/storage.ts +17 -1
  259. package/src/plugins/builtin/analytics/index.tsx +6 -1
  260. package/src/plugins/builtin/analytics/metrics.ts +47 -9
  261. package/src/plugins/builtin/analytics/risk-headless.ts +14 -2
  262. package/src/plugins/builtin/analytics/risk-math.ts +83 -0
  263. package/src/plugins/builtin/analytics/risk-model.ts +97 -4
  264. package/src/plugins/builtin/analytics/risk-pane.tsx +11 -6
  265. package/src/plugins/builtin/analytics/sector-model.ts +14 -3
  266. package/src/plugins/builtin/awards/headless.ts +6 -5
  267. package/src/plugins/builtin/awards/index.tsx +1 -1
  268. package/src/plugins/builtin/backtest/client.ts +38 -8
  269. package/src/plugins/builtin/backtest/engine.ts +25 -13
  270. package/src/plugins/builtin/backtest/export.ts +27 -0
  271. package/src/plugins/builtin/backtest/format.ts +19 -3
  272. package/src/plugins/builtin/backtest/headless.ts +42 -28
  273. package/src/plugins/builtin/backtest/index.tsx +3 -0
  274. package/src/plugins/builtin/backtest/pane.tsx +39 -10
  275. package/src/plugins/builtin/backtest/report.ts +160 -0
  276. package/src/plugins/builtin/backtest/rules.ts +2 -0
  277. package/src/plugins/builtin/backtest/window.ts +112 -0
  278. package/src/plugins/builtin/bond-calculator/headless.ts +3 -2
  279. package/src/plugins/builtin/broker-manager/add-flow.tsx +4 -4
  280. package/src/plugins/builtin/catalysts/headless.ts +24 -13
  281. package/src/plugins/builtin/catalysts/index.tsx +4 -2
  282. package/src/plugins/builtin/catalysts/model.ts +18 -1
  283. package/src/plugins/builtin/catalysts/pane.tsx +2 -2
  284. package/src/plugins/builtin/cds/client.ts +28 -5
  285. package/src/plugins/builtin/cds/headless.ts +183 -31
  286. package/src/plugins/builtin/cds/index.tsx +1 -1
  287. package/src/plugins/builtin/cds/model.ts +229 -53
  288. package/src/plugins/builtin/cds/pane.tsx +82 -26
  289. package/src/plugins/builtin/central-bank-rates/headless.ts +1 -1
  290. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +39 -1
  291. package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +77 -0
  292. package/src/plugins/builtin/chart-composer/chart-spec.ts +15 -0
  293. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +22 -2
  294. package/src/plugins/builtin/chart-composer/editor/desktop-view.tsx +2 -2
  295. package/src/plugins/builtin/chart-composer/headless-schema.ts +10 -2
  296. package/src/plugins/builtin/chart-composer/headless.ts +99 -21
  297. package/src/plugins/builtin/chart-composer/index.tsx +70 -13
  298. package/src/plugins/builtin/chart-composer/pane.tsx +65 -15
  299. package/src/plugins/builtin/chart-composer/presets.ts +79 -11
  300. package/src/plugins/builtin/chart-composer/series-catalog.ts +50 -14
  301. package/src/plugins/builtin/chart-composer/series-expression.ts +9 -7
  302. package/src/plugins/builtin/chart-composer/series-listings.ts +178 -0
  303. package/src/plugins/builtin/chart-composer/session-range.ts +87 -0
  304. package/src/plugins/builtin/chat/attachments/desktop.tsx +4 -1
  305. package/src/plugins/builtin/chat/content/composer-runtime.ts +49 -14
  306. package/src/plugins/builtin/chat/content/composer.tsx +22 -1
  307. package/src/plugins/builtin/chat/content/index.tsx +35 -5
  308. package/src/plugins/builtin/chat/content/layout-metrics.ts +3 -0
  309. package/src/plugins/builtin/chat/content/shortcuts.ts +32 -13
  310. package/src/plugins/builtin/chat/content/snapshot.ts +29 -6
  311. package/src/plugins/builtin/chat/ghost-user.ts +11 -3
  312. package/src/plugins/builtin/chat/layout.ts +2 -0
  313. package/src/plugins/builtin/chat/message/desktop.tsx +13 -5
  314. package/src/plugins/builtin/chat/message/header.tsx +26 -4
  315. package/src/plugins/builtin/chat/message/pane-chip.tsx +131 -35
  316. package/src/plugins/builtin/chat/message/render-state.ts +28 -1
  317. package/src/plugins/builtin/chat/message/terminal.tsx +9 -3
  318. package/src/plugins/builtin/chat/pane-links/composer.ts +87 -0
  319. package/src/plugins/builtin/chat/pane-links/model.ts +1 -1
  320. package/src/plugins/builtin/chat/share/flow.tsx +9 -73
  321. package/src/plugins/builtin/cloud/askg/controller.ts +5 -3
  322. package/src/plugins/builtin/cloud/askg/executor.ts +3 -1
  323. package/src/plugins/builtin/cloud/askg/lock-note.ts +16 -0
  324. package/src/plugins/builtin/cloud/askg/pane.tsx +6 -2
  325. package/src/plugins/builtin/cloud/auth-actions.tsx +4 -2
  326. package/src/plugins/builtin/cloud/company-picker.tsx +21 -26
  327. package/src/plugins/builtin/cloud/mcp-connect/dialog.tsx +5 -3
  328. package/src/plugins/builtin/cloud/plugin.tsx +2 -0
  329. package/src/plugins/builtin/cloud/team/module.tsx +5 -1
  330. package/src/plugins/builtin/cloud/team/pane.tsx +11 -4
  331. package/src/plugins/builtin/cloud/team/views.ts +11 -4
  332. package/src/plugins/builtin/cloud/terminal-relay/engine.ts +9 -4
  333. package/src/plugins/builtin/cloud/terminal-relay/prompts.tsx +3 -2
  334. package/src/plugins/builtin/cloud/thesis/detail.tsx +2 -1
  335. package/src/plugins/builtin/cloud/thesis/exposure.ts +3 -0
  336. package/src/plugins/builtin/cloud/thesis/prompts.tsx +3 -2
  337. package/src/plugins/builtin/cloud/thesis/ticker-tab.tsx +2 -1
  338. package/src/plugins/builtin/cloud/trial-offer-status-widget.tsx +2 -1
  339. package/src/plugins/builtin/cloud/verification-status-widget.tsx +2 -1
  340. package/src/plugins/builtin/commodities-energy/index.tsx +8 -5
  341. package/src/plugins/builtin/commodities-energy/view-state.ts +11 -0
  342. package/src/plugins/builtin/company-attention/headless.ts +15 -7
  343. package/src/plugins/builtin/company-attention/index.tsx +1 -1
  344. package/src/plugins/builtin/company-attention/model.ts +49 -4
  345. package/src/plugins/builtin/company-attention/pane.tsx +11 -9
  346. package/src/plugins/builtin/company-kpis/headless.ts +4 -3
  347. package/src/plugins/builtin/company-kpis/index.tsx +2 -2
  348. package/src/plugins/builtin/company-kpis/pane.tsx +9 -3
  349. package/src/plugins/builtin/congress-trades/headless.ts +23 -2
  350. package/src/plugins/builtin/correlation/relationship/pane.tsx +18 -46
  351. package/src/plugins/builtin/cot/headless.ts +5 -2
  352. package/src/plugins/builtin/credit-boards/cdx-pane.tsx +41 -13
  353. package/src/plugins/builtin/credit-boards/client.ts +9 -2
  354. package/src/plugins/builtin/credit-boards/headless.ts +93 -27
  355. package/src/plugins/builtin/credit-boards/index.tsx +15 -4
  356. package/src/plugins/builtin/credit-boards/model.ts +105 -6
  357. package/src/plugins/builtin/credit-boards/sovr-pane.tsx +14 -3
  358. package/src/plugins/builtin/credit-documents/detail.tsx +2 -1
  359. package/src/plugins/builtin/credit-documents/index.tsx +3 -0
  360. package/src/plugins/builtin/credit-documents/model.ts +3 -10
  361. package/src/plugins/builtin/crypto-board/client.ts +152 -2
  362. package/src/plugins/builtin/crypto-board/headless.ts +138 -19
  363. package/src/plugins/builtin/crypto-board/index.tsx +5 -3
  364. package/src/plugins/builtin/crypto-board/model.ts +210 -12
  365. package/src/plugins/builtin/crypto-board/pane.tsx +148 -9
  366. package/src/plugins/builtin/crypto-board/series.ts +52 -1
  367. package/src/plugins/builtin/crypto-board/supply.ts +123 -0
  368. package/src/plugins/builtin/debt-maturities/client.ts +54 -1
  369. package/src/plugins/builtin/debt-maturities/headless.ts +27 -3
  370. package/src/plugins/builtin/debt-maturities/index.tsx +2 -0
  371. package/src/plugins/builtin/debt-maturities/model.ts +58 -13
  372. package/src/plugins/builtin/debt-maturities/pane.tsx +47 -7
  373. package/src/plugins/builtin/dividend-yield/client.ts +42 -36
  374. package/src/plugins/builtin/dividend-yield/headless.ts +113 -18
  375. package/src/plugins/builtin/dividend-yield/index.tsx +5 -2
  376. package/src/plugins/builtin/dividend-yield/pane.tsx +37 -13
  377. package/src/plugins/builtin/dividend-yield/provider-client.ts +7 -3
  378. package/src/plugins/builtin/dividend-yield/ranking.ts +187 -0
  379. package/src/plugins/builtin/dividend-yield/reference-price.ts +28 -5
  380. package/src/plugins/builtin/dividend-yield/types.ts +6 -1
  381. package/src/plugins/builtin/dividend-yield/view.ts +1 -1
  382. package/src/plugins/builtin/docs/blocks.tsx +54 -8
  383. package/src/plugins/builtin/docs/pane.tsx +8 -13
  384. package/src/plugins/builtin/earnings/headless.ts +3 -2
  385. package/src/plugins/builtin/earnings-calls/data.ts +51 -0
  386. package/src/plugins/builtin/earnings-calls/headless.ts +7 -0
  387. package/src/plugins/builtin/earnings-calls/index.tsx +1 -0
  388. package/src/plugins/builtin/earnings-calls/model.ts +97 -0
  389. package/src/plugins/builtin/earnings-calls/pane.tsx +107 -7
  390. package/src/plugins/builtin/earnings-calls/transcript-view.tsx +140 -22
  391. package/src/plugins/builtin/earnings-calls/use-call-playback.ts +194 -0
  392. package/src/plugins/builtin/econ/calendar-model.ts +22 -0
  393. package/src/plugins/builtin/econ/calendar-source.ts +35 -0
  394. package/src/plugins/builtin/econ/index.tsx +40 -8
  395. package/src/plugins/builtin/econ-statistics/defs.ts +7 -0
  396. package/src/plugins/builtin/econ-statistics/detail.tsx +8 -1
  397. package/src/plugins/builtin/econ-statistics/headless.ts +26 -5
  398. package/src/plugins/builtin/econ-statistics/pane.tsx +4 -2
  399. package/src/plugins/builtin/econ-statistics/stats.ts +10 -0
  400. package/src/plugins/builtin/econ-statistics/view.ts +19 -0
  401. package/src/plugins/builtin/equity-screener/client.ts +1 -1
  402. package/src/plugins/builtin/equity-screener/model.ts +46 -4
  403. package/src/plugins/builtin/equity-screener/pane.tsx +3 -0
  404. package/src/plugins/builtin/estimate-revisions/client.ts +32 -22
  405. package/src/plugins/builtin/estimate-revisions/headless.ts +1 -0
  406. package/src/plugins/builtin/estimate-revisions/index.tsx +1 -0
  407. package/src/plugins/builtin/estimate-revisions/pane.tsx +5 -3
  408. package/src/plugins/builtin/executives/index.tsx +1 -0
  409. package/src/plugins/builtin/exposure/editor.tsx +3 -3
  410. package/src/plugins/builtin/fear-greed/index.tsx +9 -0
  411. package/src/plugins/builtin/filing-events/index.tsx +1 -0
  412. package/src/plugins/builtin/futures/index.tsx +2 -2
  413. package/src/plugins/builtin/futures/model.ts +34 -21
  414. package/src/plugins/builtin/futures/table.tsx +1 -1
  415. package/src/plugins/builtin/futures/use-board-terms.ts +2 -2
  416. package/src/plugins/builtin/futures-curve/headless.ts +4 -2
  417. package/src/plugins/builtin/futures-curve/model.ts +5 -7
  418. package/src/plugins/builtin/help/index.tsx +55 -8
  419. package/src/plugins/builtin/help/shortcut-table.tsx +15 -2
  420. package/src/plugins/builtin/holders/headless.ts +12 -0
  421. package/src/plugins/builtin/insider/headless.ts +311 -41
  422. package/src/plugins/builtin/insider/index.tsx +280 -106
  423. package/src/plugins/builtin/insider/insiders.tsx +224 -0
  424. package/src/plugins/builtin/insider/signals-cells.tsx +52 -0
  425. package/src/plugins/builtin/insider/signals-client.ts +135 -11
  426. package/src/plugins/builtin/insider/signals-model.ts +628 -56
  427. package/src/plugins/builtin/insider/signals.tsx +283 -83
  428. package/src/plugins/builtin/ipo-calendar/headless.ts +17 -7
  429. package/src/plugins/builtin/ipo-calendar/index.tsx +23 -3
  430. package/src/plugins/builtin/ipo-calendar/model.ts +84 -36
  431. package/src/plugins/builtin/ipo-calendar/pane.tsx +20 -8
  432. package/src/plugins/builtin/iv-history/headless.ts +2 -0
  433. package/src/plugins/builtin/jobs/headless.ts +1 -0
  434. package/src/plugins/builtin/jobs/index.tsx +1 -0
  435. package/src/plugins/builtin/jodi/headless.ts +2 -0
  436. package/src/plugins/builtin/kelly-sizer/pane.tsx +1 -1
  437. package/src/plugins/builtin/kelly-sizer/portfolio.ts +1 -1
  438. package/src/plugins/builtin/market-heatmap/headless.ts +1 -0
  439. package/src/plugins/builtin/market-heatmap/portfolio.ts +3 -1
  440. package/src/plugins/builtin/market-valuation/pane.tsx +1 -1
  441. package/src/plugins/builtin/market-valuation/zone-scale/desktop.tsx +31 -57
  442. package/src/plugins/builtin/mna/distress/headless.ts +2 -1
  443. package/src/plugins/builtin/mna/headless.ts +14 -2
  444. package/src/plugins/builtin/mna/index.tsx +1 -0
  445. package/src/plugins/builtin/news/headless.ts +4 -0
  446. package/src/plugins/builtin/news/wire/news/footer.ts +5 -3
  447. package/src/plugins/builtin/news/wire/news/table.tsx +57 -11
  448. package/src/plugins/builtin/notes/cli.ts +8 -4
  449. package/src/plugins/builtin/notes/files.ts +66 -20
  450. package/src/plugins/builtin/notes/migration.ts +18 -6
  451. package/src/plugins/builtin/notes/owner.tsx +3 -2
  452. package/src/plugins/builtin/notes/quick-notes-pane.tsx +3 -2
  453. package/src/plugins/builtin/options-scenario/client.ts +7 -4
  454. package/src/plugins/builtin/options-scenario/headless.ts +5 -3
  455. package/src/plugins/builtin/pe-band/index.tsx +1 -1
  456. package/src/plugins/builtin/pe-band/model.ts +1 -15
  457. package/src/plugins/builtin/perps/headless.ts +30 -13
  458. package/src/plugins/builtin/perps/model.ts +45 -3
  459. package/src/plugins/builtin/perps/pane.tsx +7 -7
  460. package/src/plugins/builtin/portfolio-list/cell-version.ts +10 -4
  461. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +128 -14
  462. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +108 -46
  463. package/src/plugins/builtin/portfolio-list/cli/render.ts +368 -45
  464. package/src/plugins/builtin/portfolio-list/cli/shared.ts +8 -2
  465. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +24 -34
  466. package/src/plugins/builtin/portfolio-list/grid.tsx +3 -1
  467. package/src/plugins/builtin/portfolio-list/headless.ts +151 -29
  468. package/src/plugins/builtin/portfolio-list/income.ts +296 -0
  469. package/src/plugins/builtin/portfolio-list/metrics.ts +2 -2
  470. package/src/plugins/builtin/portfolio-list/pane/futures-terms.ts +58 -0
  471. package/src/plugins/builtin/portfolio-list/pane/index.tsx +27 -10
  472. package/src/plugins/builtin/portfolio-list/pane/supplemental.ts +47 -28
  473. package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +3 -2
  474. package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +10 -3
  475. package/src/plugins/builtin/portfolio-list/summary/index.tsx +26 -4
  476. package/src/plugins/builtin/portfolio-list/summary/totals.ts +31 -3
  477. package/src/plugins/builtin/portfolio-list/table.tsx +25 -5
  478. package/src/plugins/builtin/power/prices-headless.ts +2 -1
  479. package/src/plugins/builtin/realized-vol/chart-model.ts +29 -5
  480. package/src/plugins/builtin/realized-vol/charts.tsx +14 -8
  481. package/src/plugins/builtin/realized-vol/evidence.ts +2 -0
  482. package/src/plugins/builtin/realized-vol/headless.ts +6 -4
  483. package/src/plugins/builtin/realized-vol/model.ts +5 -1
  484. package/src/plugins/builtin/realized-vol/pane.tsx +31 -11
  485. package/src/plugins/builtin/realized-vol/settings.ts +1 -1
  486. package/src/plugins/builtin/research/analyst-headless.ts +4 -0
  487. package/src/plugins/builtin/research/corporate-actions-pane.tsx +2 -0
  488. package/src/plugins/builtin/research/event-model.ts +22 -2
  489. package/src/plugins/builtin/research/headless-schema.ts +1 -0
  490. package/src/plugins/builtin/research/headless.ts +3 -0
  491. package/src/plugins/builtin/research/index.tsx +3 -0
  492. package/src/plugins/builtin/research/relative-valuation-columns.ts +27 -5
  493. package/src/plugins/builtin/research/relative-valuation-headless.ts +2 -0
  494. package/src/plugins/builtin/revenue-breakdown/index.tsx +1 -0
  495. package/src/plugins/builtin/reverse-dcf/headless.ts +9 -6
  496. package/src/plugins/builtin/reverse-dcf/index.tsx +2 -2
  497. package/src/plugins/builtin/reverse-dcf/model.ts +51 -4
  498. package/src/plugins/builtin/reverse-dcf/pane.tsx +23 -10
  499. package/src/plugins/builtin/risk-factors/headless.ts +7 -0
  500. package/src/plugins/builtin/risk-factors/index.tsx +1 -0
  501. package/src/plugins/builtin/scanner/feed.ts +5 -3
  502. package/src/plugins/builtin/scanner/headless.ts +9 -57
  503. package/src/plugins/builtin/scanner/index.ts +1 -2
  504. package/src/plugins/builtin/sec/forms.ts +2 -6
  505. package/src/plugins/builtin/sec/fund-facts-view.tsx +53 -0
  506. package/src/plugins/builtin/sec/fund-facts.ts +328 -0
  507. package/src/plugins/builtin/sec/headless.ts +140 -44
  508. package/src/plugins/builtin/sec/index.tsx +95 -30
  509. package/src/plugins/builtin/sec/model.ts +2 -44
  510. package/src/plugins/builtin/shared/headless-options.ts +10 -0
  511. package/src/plugins/builtin/shared/locked-rows.tsx +3 -1
  512. package/src/plugins/builtin/shared/move-rank.ts +108 -0
  513. package/src/plugins/builtin/shared/report-freshness.ts +25 -9
  514. package/src/plugins/builtin/shared/scanner-capture.ts +95 -0
  515. package/src/plugins/builtin/shared/treasury-cutoffs.ts +15 -0
  516. package/src/plugins/builtin/shared/use-quote-board.ts +1 -0
  517. package/src/plugins/builtin/shared/volatility/live-session.ts +34 -0
  518. package/src/plugins/builtin/shared/volatility-indices.ts +32 -0
  519. package/src/plugins/builtin/short-interest/headless.ts +3 -0
  520. package/src/plugins/builtin/short-interest/watch-model.ts +2 -2
  521. package/src/plugins/builtin/social-mentions/client.ts +8 -1
  522. package/src/plugins/builtin/social-mentions/pane.tsx +8 -6
  523. package/src/plugins/builtin/supply-chain/client.ts +12 -3
  524. package/src/plugins/builtin/supply-chain/disclosure-quote.tsx +9 -5
  525. package/src/plugins/builtin/supply-chain/evidence.ts +3 -1
  526. package/src/plugins/builtin/supply-chain/flow-layout.ts +2 -1
  527. package/src/plugins/builtin/supply-chain/flow.tsx +23 -16
  528. package/src/plugins/builtin/supply-chain/graph-client.ts +8 -5
  529. package/src/plugins/builtin/supply-chain/graph-evidence.ts +1 -1
  530. package/src/plugins/builtin/supply-chain/graph-model.ts +10 -2
  531. package/src/plugins/builtin/supply-chain/graph-pane.tsx +9 -7
  532. package/src/plugins/builtin/supply-chain/graph.tsx +8 -6
  533. package/src/plugins/builtin/supply-chain/headless.ts +69 -27
  534. package/src/plugins/builtin/supply-chain/index.tsx +1 -1
  535. package/src/plugins/builtin/supply-chain/model.ts +76 -15
  536. package/src/plugins/builtin/supply-chain/pane.tsx +29 -15
  537. package/src/plugins/builtin/supply-chain/row-evidence.tsx +5 -4
  538. package/src/plugins/builtin/themes/model.ts +2 -5
  539. package/src/plugins/builtin/thirteenf/api.ts +50 -2
  540. package/src/plugins/builtin/thirteenf/data.ts +250 -11
  541. package/src/plugins/builtin/thirteenf/headless.ts +311 -28
  542. package/src/plugins/builtin/thirteenf/index.tsx +4 -1
  543. package/src/plugins/builtin/thirteenf/model.ts +244 -19
  544. package/src/plugins/builtin/thirteenf/overlap-pane.tsx +133 -33
  545. package/src/plugins/builtin/thirteenf/overlap.ts +1 -1
  546. package/src/plugins/builtin/thirteenf/pane.tsx +24 -5
  547. package/src/plugins/builtin/thirteenf/report-notes.ts +78 -0
  548. package/src/plugins/builtin/thirteenf/types.ts +49 -0
  549. package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +22 -8
  550. package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +17 -1
  551. package/src/plugins/builtin/ticker-detail/financials/model.ts +2 -42
  552. package/src/plugins/builtin/ticker-detail/financials/tab.tsx +1 -1
  553. package/src/plugins/builtin/ticker-detail/headless.ts +23 -10
  554. package/src/plugins/builtin/ticker-detail/overview/components.tsx +27 -3
  555. package/src/plugins/builtin/ticker-detail/overview/dividend.ts +60 -0
  556. package/src/plugins/builtin/ticker-detail/overview/model.ts +46 -9
  557. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +3 -0
  558. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +36 -3
  559. package/src/plugins/builtin/ticker-detail/quote-monitor/card.tsx +18 -19
  560. package/src/plugins/builtin/time-sales/client.ts +7 -4
  561. package/src/plugins/builtin/time-sales/headless.ts +71 -22
  562. package/src/plugins/builtin/time-sales/model.ts +12 -0
  563. package/src/plugins/builtin/time-sales/pane.tsx +31 -7
  564. package/src/plugins/builtin/time-sales/window.ts +128 -0
  565. package/src/plugins/builtin/trace-bonds/client.ts +351 -33
  566. package/src/plugins/builtin/trace-bonds/headless.ts +60 -22
  567. package/src/plugins/builtin/trace-bonds/index.tsx +4 -2
  568. package/src/plugins/builtin/trace-bonds/model.ts +27 -25
  569. package/src/plugins/builtin/trace-bonds/pane.tsx +63 -45
  570. package/src/plugins/builtin/treasury-auctions/cache.ts +61 -15
  571. package/src/plugins/builtin/treasury-auctions/client.ts +45 -10
  572. package/src/plugins/builtin/treasury-auctions/headless.ts +35 -13
  573. package/src/plugins/builtin/treasury-auctions/index.tsx +5 -2
  574. package/src/plugins/builtin/treasury-auctions/model.ts +20 -16
  575. package/src/plugins/builtin/treasury-auctions/pane.tsx +29 -12
  576. package/src/plugins/builtin/vol-surface/charts.tsx +2 -1
  577. package/src/plugins/builtin/vol-surface/headless.ts +3 -2
  578. package/src/plugins/builtin/vol-surface/pane.tsx +2 -1
  579. package/src/plugins/builtin/vol-surface/stored.ts +4 -7
  580. package/src/plugins/builtin/volatility/chart-model.ts +16 -15
  581. package/src/plugins/builtin/volatility/charts.tsx +5 -5
  582. package/src/plugins/builtin/volatility/client.ts +73 -2
  583. package/src/plugins/builtin/volatility/evidence.ts +13 -14
  584. package/src/plugins/builtin/volatility/headless.ts +13 -7
  585. package/src/plugins/builtin/volatility/index.tsx +1 -1
  586. package/src/plugins/builtin/volatility/model.ts +104 -38
  587. package/src/plugins/builtin/volatility/pane.tsx +42 -24
  588. package/src/plugins/builtin/volatility/series.ts +22 -13
  589. package/src/plugins/builtin/world-venue-map/geo-series.ts +9 -0
  590. package/src/plugins/builtin/world-venue-map/headless.ts +8 -5
  591. package/src/plugins/builtin/world-venue-map/index.ts +16 -2
  592. package/src/plugins/builtin/world-venue-map/map.tsx +13 -17
  593. package/src/plugins/builtin/yield-curve/curves.ts +29 -5
  594. package/src/plugins/builtin/yield-curve/headless.ts +41 -8
  595. package/src/plugins/builtin/yield-curve/history.ts +5 -5
  596. package/src/plugins/builtin/yield-curve/index.tsx +30 -13
  597. package/src/plugins/compat.ts +3 -1
  598. package/src/plugins/dependencies.ts +8 -2
  599. package/src/plugins/host-link.ts +12 -5
  600. package/src/plugins/installer.ts +16 -7
  601. package/src/plugins/loader.ts +9 -2
  602. package/src/plugins/marketplace/activation.ts +10 -4
  603. package/src/plugins/registry/host-actions.ts +3 -0
  604. package/src/plugins/registry/index.ts +3 -1
  605. package/src/{plugins/builtin/portfolio-list → portfolio}/allocation.ts +74 -12
  606. package/src/{plugins/builtin/portfolio-list → portfolio}/column-values.ts +140 -53
  607. package/src/portfolio/futures-positions.ts +213 -0
  608. package/src/portfolio/futures-terms.ts +75 -0
  609. package/src/portfolio/manual-lots.ts +78 -0
  610. package/src/portfolio/mutations.ts +54 -10
  611. package/src/portfolio/position-metrics.ts +44 -10
  612. package/src/portfolio/valuation-basis.ts +31 -4
  613. package/src/public/__snapshots__/public-api.test.ts.snap +4 -0
  614. package/src/public/time-series.ts +2 -1
  615. package/src/remote/confirm-change.tsx +2 -1
  616. package/src/remote/server.ts +1 -1
  617. package/src/remote/watchlist.ts +9 -1
  618. package/src/renderers/dom/data-table/row.tsx +1 -1
  619. package/src/renderers/dom/desktop/audio-player.tsx +312 -0
  620. package/src/renderers/dom/desktop/control-styles.ts +17 -82
  621. package/src/renderers/dom/desktop/controls.tsx +39 -63
  622. package/src/renderers/dom/desktop/dialog-actions.tsx +13 -53
  623. package/src/renderers/dom/desktop/icons.tsx +8 -0
  624. package/src/renderers/dom/desktop/list-view.tsx +6 -6
  625. package/src/renderers/dom/desktop/popover.tsx +0 -3
  626. package/src/renderers/dom/desktop/query-bar.tsx +6 -4
  627. package/src/renderers/dom/desktop/select-field.tsx +9 -8
  628. package/src/renderers/dom/desktop/stack-header.ts +3 -0
  629. package/src/renderers/dom/dom-ui-host.tsx +3 -2
  630. package/src/renderers/dom/host/chart-surface.tsx +3 -3
  631. package/src/renderers/dom/host/size-observer.ts +33 -4
  632. package/src/renderers/dom/host/surface-3d.tsx +3 -2
  633. package/src/renderers/dom/host/surface-fit.ts +4 -1
  634. package/src/renderers/dom/host/tabs.tsx +22 -132
  635. package/src/renderers/dom/styles.css +358 -160
  636. package/src/renderers/electrobun/bun/core-capabilities.ts +1 -1
  637. package/src/renderers/electrobun/bun/desktop/backend.ts +1 -1
  638. package/src/renderers/electrobun/bun/desktop/initialization.ts +1 -0
  639. package/src/renderers/electrobun/bun/desktop/state-broadcaster.ts +43 -1
  640. package/src/renderers/electrobun/bun/desktop/workspace/requests.ts +5 -1
  641. package/src/renderers/electrobun/shared/rpc-codec.ts +7 -0
  642. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +21 -17
  643. package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +3 -3
  644. package/src/renderers/electrobun/view/desktop/window/bridge.ts +6 -8
  645. package/src/renderers/electrobun/view/desktop/window/snapshot.ts +18 -0
  646. package/src/series/capability.ts +1 -0
  647. package/src/series/files.ts +9 -3
  648. package/src/series/registry.ts +40 -14
  649. package/src/series/resolve.ts +121 -18
  650. package/src/series/standalone.ts +3 -2
  651. package/src/series/types.ts +55 -1
  652. package/src/series/validate.ts +39 -0
  653. package/src/shares/api.ts +26 -7
  654. package/src/shares/bug-report-dialog.tsx +2 -2
  655. package/src/shares/bug-report-flow.tsx +4 -7
  656. package/src/shares/capture-flow.ts +5 -4
  657. package/src/shares/capture-preview.tsx +2 -2
  658. package/src/shares/chat.ts +7 -27
  659. package/src/shares/flow.tsx +86 -40
  660. package/src/shares/location.ts +1 -3
  661. package/src/shares/pane-image.ts +11 -9
  662. package/src/shares/pane.ts +5 -2
  663. package/src/shares/payload.ts +1 -1
  664. package/src/shares/personal-pane.ts +3 -3
  665. package/src/shares/portable-layout.ts +9 -2
  666. package/src/shares/ready.ts +42 -0
  667. package/src/shares/test-harness.ts +62 -0
  668. package/src/sources/gloomberb-cloud/batched-lookups.ts +73 -0
  669. package/src/sources/gloomberb-cloud/index.ts +64 -12
  670. package/src/sources/gloomberb-cloud/normalizers.ts +31 -2
  671. package/src/sources/gloomberb-cloud/perpetuals.ts +20 -1
  672. package/src/sources/history-omitted.ts +34 -0
  673. package/src/sources/history-result.ts +3 -0
  674. package/src/sources/history-retention.ts +1 -1
  675. package/src/sources/provider-errors.ts +43 -1
  676. package/src/sources/provider-router/batches.ts +3 -2
  677. package/src/sources/provider-router/cache.ts +2 -1
  678. package/src/sources/provider-router/cached-routes.ts +9 -3
  679. package/src/sources/provider-router/history.ts +9 -8
  680. package/src/sources/provider-router/index.ts +18 -3
  681. package/src/sources/provider-router/primary.ts +5 -4
  682. package/src/sources/provider-router/quote-route.ts +3 -1
  683. package/src/sources/provider-router/routing.ts +2 -1
  684. package/src/sources/provider-router/search.ts +47 -13
  685. package/src/sources/provider-router/streaming.ts +7 -4
  686. package/src/sources/sec-edgar.ts +1 -3
  687. package/src/state/app/context/index.tsx +9 -13
  688. package/src/state/app/tab-cursor.ts +149 -12
  689. package/src/state/hooks/quote-streaming.ts +3 -2
  690. package/src/state/hooks/session-snapshot.ts +3 -2
  691. package/src/state/persist-scheduler.ts +12 -4
  692. package/src/sync/controller.ts +22 -1
  693. package/src/sync/core-contributors.ts +58 -15
  694. package/src/team/collections-sync.ts +14 -4
  695. package/src/team/collections.ts +40 -11
  696. package/src/team/store.ts +5 -4
  697. package/src/telemetry/attention-counts.ts +8 -2
  698. package/src/telemetry/crash-reports-dom.ts +3 -0
  699. package/src/telemetry/crash-reports-node.ts +7 -4
  700. package/src/telemetry/crash-reports.ts +11 -11
  701. package/src/telemetry/usage-counts.ts +16 -12
  702. package/src/theme/colors.ts +2 -0
  703. package/src/theme/font-scale.ts +2 -0
  704. package/src/theme/ui-tokens.ts +71 -0
  705. package/src/tickers/batched-lookups.ts +186 -0
  706. package/src/tickers/company-name-listing.ts +97 -0
  707. package/src/tickers/company-name.ts +13 -0
  708. package/src/tickers/instrument-coverage.ts +112 -0
  709. package/src/tickers/listing-fate.ts +49 -9
  710. package/src/tickers/listing-venues.ts +24 -5
  711. package/src/tickers/open-target.ts +13 -5
  712. package/src/tickers/search/index.ts +112 -35
  713. package/src/tickers/search/ranking.ts +49 -1
  714. package/src/tickers/terminal-codes.ts +79 -0
  715. package/src/tickers/ticker-changes.ts +74 -3
  716. package/src/tickers/us-listing.ts +2 -1
  717. package/src/time-series/chart-data.ts +79 -8
  718. package/src/time-series/fundamentals.ts +55 -7
  719. package/src/time-series/ice-credit.ts +17 -2
  720. package/src/time-series/live-bars.ts +21 -8
  721. package/src/time-series/live-quotes.ts +2 -3
  722. package/src/time-series/price-comparison.ts +6 -1
  723. package/src/time-series/resolve.ts +65 -10
  724. package/src/time-series/spec.ts +2 -1
  725. package/src/time-series/studies.ts +3 -3
  726. package/src/time-series/types.ts +22 -0
  727. package/src/time-series/use-chart-resolution.ts +2 -1
  728. package/src/types/config.ts +7 -0
  729. package/src/types/data-provider.ts +20 -0
  730. package/src/types/headless.ts +142 -1
  731. package/src/types/instrument.ts +6 -0
  732. package/src/types/plugin.ts +32 -9
  733. package/src/types/price-history.ts +5 -0
  734. package/src/types/ticker-changes.ts +19 -0
  735. package/src/types/ticker.ts +10 -2
  736. package/src/ui/context-menu.tsx +2 -0
  737. package/src/ui/host.tsx +40 -4
  738. package/src/ui/measured-cells.ts +13 -7
  739. package/src/ui/qr.ts +7 -5
  740. package/src/updater/index.ts +5 -5
  741. package/src/utils/calendar-date.ts +86 -27
  742. package/src/utils/currency-units.ts +17 -0
  743. package/src/utils/debug-log.ts +1 -1
  744. package/src/utils/dividend-cash.ts +48 -0
  745. package/src/utils/dom-screenshot-rasters.ts +3 -1
  746. package/src/utils/dom-screenshot.ts +14 -10
  747. package/src/utils/exchange-rate-snapshot.ts +9 -4
  748. package/src/utils/external-url.ts +1 -0
  749. package/src/utils/fiscal-period.ts +47 -0
  750. package/src/utils/format.ts +5 -2
  751. package/src/utils/forward-dividend.ts +160 -11
  752. package/src/utils/futures-generic.ts +34 -8
  753. package/src/utils/http-proxy-response.ts +2 -1
  754. package/src/utils/local-utc-offset.ts +2 -0
  755. package/src/utils/log-failure.ts +31 -0
  756. package/src/utils/option-expiry.ts +12 -12
  757. package/src/utils/price-history-integrity.ts +56 -0
  758. package/src/utils/price-history.ts +13 -1
  759. package/src/utils/sec-filings.ts +245 -0
  760. package/src/utils/selection-clipboard.ts +5 -2
  761. package/src/utils/throttled-fetch.ts +1 -0
  762. package/src/{plugins/builtin/dividend-yield/trailing-cash.ts → utils/trailing-dividend.ts} +55 -8
  763. package/src/utils/url.ts +1 -0
  764. package/src/utils/utc-time.ts +11 -0
  765. package/src/plugins/builtin/chat/share/targets.ts +0 -27
  766. package/src/renderers/dom/host/top-surface.ts +0 -119
  767. package/src/shares/dialog.tsx +0 -221
  768. package/src/shares/live.ts +0 -19
@@ -13,6 +13,7 @@
13
13
  * later milestone as `experiments`, which the API turns into `exp_<key>` and
14
14
  * saves to the account once they sign in.
15
15
  */
16
+ import { logFailure } from "../utils/log-failure";
16
17
 
17
18
  export interface StorageLike {
18
19
  getItem(key: string): string | null;
@@ -75,6 +76,7 @@ function read(storage: StorageLike, key: string): string | null {
75
76
  try {
76
77
  return storage.getItem(key);
77
78
  } catch {
79
+ // Intentional ignore: Private browsing may deny optional experiment storage.
78
80
  return null;
79
81
  }
80
82
  }
@@ -83,7 +85,7 @@ function write(storage: StorageLike, key: string, value: string): void {
83
85
  try {
84
86
  storage.setItem(key, value);
85
87
  } catch {
86
- /* Private browsing still runs the terminal; the arm is just not remembered. */
88
+ // Intentional ignore: Private browsing may deny optional experiment storage.
87
89
  }
88
90
  }
89
91
 
@@ -112,7 +114,8 @@ export function exposeExperiment(experiment: string, env: WebExperimentEnvironme
112
114
  let answer: ExperimentAnswer;
113
115
  try {
114
116
  answer = await env.ask({ experiment, variant: assignments.get(experiment) });
115
- } catch {
117
+ } catch (error) {
118
+ logFailure("cloud-experiments", "Experiment exposure request failed")(error);
116
119
  // Not counted, so the next page load in this session may ask again.
117
120
  return null;
118
121
  }
@@ -33,9 +33,26 @@ export interface CloudCurveView {
33
33
  percentile1y: number | null;
34
34
  observations1y: number;
35
35
  }>;
36
+ /** Each tenor's 1D and 1W move ranked against its whole stored history; absent on servers older than it. */
37
+ moves?: CloudCurveMove[];
36
38
  checkedAt: string | null;
37
39
  }
38
40
 
41
+ /** How big a tenor's move into the session was, against every move of the same horizon through it. */
42
+ export interface CloudCurveMove {
43
+ tenor: string;
44
+ horizon: "1D" | "1W";
45
+ /** The session the move is measured from (the day before, or seven days before, within ten days). */
46
+ from: string | null;
47
+ /** Percentage points. */
48
+ change: number | null;
49
+ /** Midrank percentile of the move's size, 0 to 100; null below a year of moves. */
50
+ percentile: number | null;
51
+ observations: number;
52
+ /** The session the oldest ranked move ends on. */
53
+ since: string | null;
54
+ }
55
+
39
56
  /** One tenor of a stored curve over time, oldest first (`GET /cloud/econ/curves/:curve/history`). */
40
57
  export interface CloudCurveHistory {
41
58
  curve: CloudCurveHeader;
@@ -0,0 +1,38 @@
1
+ import type { AppConfig } from "../types/config";
2
+
3
+ /**
4
+ * The empty command bar's introduction: the Start Here rows in plain words and
5
+ * a placeholder with plain words to type. It shows for the first opens of the
6
+ * empty bar on this machine and then never again, so the bar settles into the
7
+ * list someone who knows the codes expects.
8
+ */
9
+ const COMMAND_BAR_INTRO_OPENS = 10;
10
+
11
+ /**
12
+ * Where the count stops: one past the last open with the introduction. It
13
+ * changes no more after that, so it is never saved again.
14
+ */
15
+ const COMMAND_BAR_OPENS_DONE = COMMAND_BAR_INTRO_OPENS + 1;
16
+
17
+ /**
18
+ * The saved count, or done when there is none. A new config starts at 0, so a
19
+ * config without one was made by a build from before the count, by someone who
20
+ * has been opening the bar all along.
21
+ */
22
+ export function sanitizeCommandBarOpens(value: unknown): number {
23
+ if (typeof value !== "number" || !Number.isFinite(value)) return COMMAND_BAR_OPENS_DONE;
24
+ return Math.min(COMMAND_BAR_OPENS_DONE, Math.max(0, Math.floor(value)));
25
+ }
26
+
27
+ /** The count after the empty bar opens once more. */
28
+ export function recordCommandBarOpen(opens: number | undefined): number {
29
+ return Math.min(COMMAND_BAR_OPENS_DONE, sanitizeCommandBarOpens(opens) + 1);
30
+ }
31
+
32
+ /**
33
+ * Whether the open bar is one of the first opens. The count already includes
34
+ * this open, so it reads the same for as long as the bar stays open.
35
+ */
36
+ export function showsCommandBarIntro(config: Pick<AppConfig, "commandBarOpens">): boolean {
37
+ return sanitizeCommandBarOpens(config.commandBarOpens) <= COMMAND_BAR_INTRO_OPENS;
38
+ }
@@ -231,7 +231,7 @@ export const KEYBINDING_ACTIONS: readonly KeybindingActionDef[] = [
231
231
  {
232
232
  id: "pane-share",
233
233
  category: "Pane Management",
234
- description: "Share the focused pane: post a picture to chat or copy its link.",
234
+ description: "Share the focused pane: copy a link to it.",
235
235
  defaults: ["CmdOrCtrl+Shift+S"],
236
236
  },
237
237
  {
@@ -11,6 +11,7 @@ import type { DataProvider } from "../../types/data-provider";
11
11
  import type {
12
12
  PaneDef,
13
13
  PaneTemplateCreateOptions,
14
+ PaneTemplateDef,
14
15
  PaneTemplateInstanceConfig,
15
16
  } from "../../types/plugin";
16
17
 
@@ -35,6 +36,39 @@ interface UseAppPaneTemplateRuntimeOptions {
35
36
  tickerRepository: AppTickerRepositoryPort;
36
37
  }
37
38
 
39
+ /**
40
+ * Whether shared data opens the pane by itself: the template takes it whole
41
+ * (a chart a plugin built), so its settings form would ask for what the data
42
+ * already says. A template that restores shares decides; any other takes data
43
+ * that holds something.
44
+ */
45
+ function shareDataOpens(template: Pick<PaneTemplateDef, "publicShare">, shareData: unknown): boolean {
46
+ if (!shareData || typeof shareData !== "object" || Array.isArray(shareData)) return false;
47
+ const restore = template.publicShare?.restore;
48
+ if (!restore) return Object.keys(shareData).length > 0;
49
+ try {
50
+ return restore(shareData as Record<string, unknown>) !== null;
51
+ } catch {
52
+ // Intentional ignore: data the template cannot restore asks for its settings form instead.
53
+ return false;
54
+ }
55
+ }
56
+
57
+ /**
58
+ * Whether opening a template asks for its settings first, in the same form the
59
+ * command bar opens, which creates the pane when it is sent.
60
+ */
61
+ export function templateAsksForSettings(
62
+ template: Pick<PaneTemplateDef, "wizard" | "publicShare">,
63
+ options: PaneTemplateCreateOptions | undefined,
64
+ ): boolean {
65
+ return !!template.wizard
66
+ && template.wizard.length > 0
67
+ && !options?.values
68
+ && !shareDataOpens(template, options?.shareData)
69
+ && (!options?.arg || template.wizard.some((step) => step.type === "textarea"));
70
+ }
71
+
38
72
  export function useAppPaneTemplateRuntime({
39
73
  buildPaneInstance,
40
74
  dataProvider,
@@ -49,13 +83,7 @@ export function useAppPaneTemplateRuntime({
49
83
  const template = pluginRegistry.paneTemplates.get(templateId);
50
84
  if (!template) return;
51
85
 
52
- // A template that asks for settings asks in the same form the command bar
53
- // opens, which creates the pane when it is sent.
54
- const asksForSettings = !!template.wizard
55
- && template.wizard.length > 0
56
- && !options?.values
57
- && (!options?.arg || template.wizard.some((step) => step.type === "textarea"));
58
- if (asksForSettings) {
86
+ if (templateAsksForSettings(template, options)) {
59
87
  openFormModal({ kind: "pane-template", templateId, arg: options?.arg, options });
60
88
  return;
61
89
  }
@@ -177,6 +177,10 @@ export function bindAppPanePluginRegistry({
177
177
  if (isDetachedWindow || isDialogOpen()) return;
178
178
  dispatch({ type: "SET_COMMAND_BAR", open: true, query });
179
179
  },
180
+ runCommandBarQuery: (query) => {
181
+ if (isDetachedWindow || isDialogOpen()) return;
182
+ dispatch({ type: "SET_COMMAND_BAR", open: true, query, launch: { kind: "run-query", query } });
183
+ },
180
184
  // Forms submit through the main window's state, so a detached window says where to go.
181
185
  openPluginCommandWorkflow: (commandId) => {
182
186
  if (isDetachedWindow) {
@@ -24,8 +24,8 @@ import {
24
24
  tickerOpenFailureMessage,
25
25
  type TickerOpenTarget,
26
26
  } from "../../tickers/open-target";
27
- import { AmbiguousTickerError, findExactTickerSearchMatch } from "../../tickers/search";
28
- import { isDialogOpen } from "../../ui/dialog-stack";
27
+ import { findExactTickerSearchMatch } from "../../tickers/search";
28
+ import { offerTickerListings, publishTickerOpenTarget as publishOpenTarget } from "./ticker-open-target";
29
29
  import { parsePublicTickerKey, publicTickerKey } from "../../utils/exchanges";
30
30
  import { attentionActionForPane, captureAttentionAction } from "../../telemetry/attention-counts";
31
31
  import { tickerHasListingSuffix } from "../../sources/listing-symbols";
@@ -79,11 +79,7 @@ export function useAppTickerOpenRuntime({
79
79
  return target;
80
80
  } catch (err) {
81
81
  if (!canPresentFeedback()) return null;
82
- // Ticker search offers the listings, unless a dialog would sit over the bar.
83
- if (err instanceof AmbiguousTickerError && !isDialogOpen()) {
84
- dispatch({ type: "SET_COMMAND_BAR", open: true, query: rawSymbol,
85
- launch: { kind: "ticker-search", query: rawSymbol } });
86
- }
82
+ offerTickerListings(err, rawSymbol, dispatch);
87
83
  const message = err instanceof Error ? err.message : String(err);
88
84
  pluginRegistry.notify({ body: `Failed to open ${rawSymbol}: ${message}`, type: "error" });
89
85
  return null;
@@ -91,13 +87,7 @@ export function useAppTickerOpenRuntime({
91
87
  }, [dataProvider, dispatch, pluginRegistry, stateRef, tickerRepository]);
92
88
 
93
89
  const publishTickerOpenTarget = useCallback((target: TickerOpenTarget) => {
94
- const currentTicker = stateRef.current.tickers.get(target.symbol);
95
- if (currentTicker !== target.ticker) {
96
- dispatch({ type: "UPDATE_TICKER", ticker: target.ticker });
97
- }
98
- if (target.created) {
99
- pluginRegistry.events.emit("ticker:added", { symbol: target.symbol, ticker: target.ticker });
100
- }
90
+ publishOpenTarget(target, { tickers: stateRef.current.tickers, dispatch, events: pluginRegistry.events });
101
91
  }, [dispatch, pluginRegistry.events, stateRef]);
102
92
 
103
93
  /**
@@ -0,0 +1,31 @@
1
+ import type { Dispatch } from "react";
2
+ import type { PluginRegistry } from "../../plugins/registry";
3
+ import type { AppAction } from "../../state/app/context";
4
+ import type { TickerRecord } from "../../types/ticker";
5
+ import type { TickerOpenTarget } from "../../tickers/open-target";
6
+ import { AmbiguousTickerError } from "../../tickers/search";
7
+ import { isDialogOpen } from "../../ui/dialog-stack";
8
+
9
+ /**
10
+ * A resolved open joins the app's tickers: the store takes the record when it
11
+ * is not the one it holds, and a ticker new to the app is announced once.
12
+ * Every open, from the command bar, a link or a pane, publishes it this way.
13
+ */
14
+ export function publishTickerOpenTarget(target: TickerOpenTarget, { tickers, dispatch, events }: {
15
+ tickers: ReadonlyMap<string, TickerRecord>;
16
+ dispatch: Dispatch<AppAction>;
17
+ events: Pick<PluginRegistry["events"], "emit">;
18
+ }): void {
19
+ if (tickers.get(target.symbol) !== target.ticker) {
20
+ dispatch({ type: "UPDATE_TICKER", ticker: target.ticker });
21
+ }
22
+ if (target.created) {
23
+ events.emit("ticker:added", { symbol: target.symbol, ticker: target.ticker });
24
+ }
25
+ }
26
+
27
+ /** An open whose symbol names several listings offers them in ticker search, unless a dialog would sit over the bar. */
28
+ export function offerTickerListings(error: unknown, rawSymbol: string, dispatch: Dispatch<AppAction>): void {
29
+ if (!(error instanceof AmbiguousTickerError) || isDialogOpen()) return;
30
+ dispatch({ type: "SET_COMMAND_BAR", open: true, query: rawSymbol, launch: { kind: "ticker-search", query: rawSymbol } });
31
+ }
@@ -1,3 +1,4 @@
1
+ import { logFailure } from "../../utils/log-failure";
1
2
  import { useEffect, type Dispatch } from "react";
2
3
  import { apiClient } from "../../api-client";
3
4
  import { getDockedPaneIds } from "../../layout/pane-manager";
@@ -81,9 +82,7 @@ function parseGloomUrl(rawUrl: string): ParsedGloomUrl | null {
81
82
  let url: URL;
82
83
  try {
83
84
  url = new URL(rawUrl);
84
- } catch {
85
- return null;
86
- }
85
+ } catch { /* Intentional ignore: Malformed external deep links are rejected as non-matches. */ return null; }
87
86
  if (url.protocol !== "gloomberb:") return null;
88
87
 
89
88
  const host = url.hostname.trim().toLowerCase();
@@ -575,7 +574,7 @@ export function handleDesktopDeepLink(rawUrl: string, options: DesktopDeepLinkHa
575
574
  if (action.route.kind === "cloud-success") {
576
575
  requestAccountManagementTab("pro");
577
576
  // Checkout just completed: re-read the session so the new plan shows at once.
578
- void chatController.refreshSession().catch(() => {});
577
+ void chatController.refreshSession().catch(logFailure("app.runtime.desktop-deeplink", "Checkout session refresh failed"));
579
578
  }
580
579
  options.pluginRegistry.showPane("account-management");
581
580
  notifySuccess(options.pluginRegistry, action.message);
@@ -1,3 +1,4 @@
1
+ import { logFailure } from "../../utils/log-failure";
1
2
  import type { Dispatch } from "react";
2
3
  import {
3
4
  clearPersistedBrokerAccounts,
@@ -136,7 +137,7 @@ export function bindPluginRegistryRuntimeAccess({
136
137
  const broker = pluginRegistry.brokers.get(instance.brokerType);
137
138
  if (!broker) throw new Error(`Broker "${instance.brokerType}" is not available.`);
138
139
 
139
- const valid = await broker.validate(instance).catch(() => false);
140
+ const valid = await broker.validate(instance).catch(logFailure("app.runtime.plugin-bindings", "Broker setup validation failed", false));
140
141
  if (!valid) throw new Error(`${broker.name} setup is incomplete.`);
141
142
 
142
143
  await broker.connect?.(instance);
@@ -272,7 +273,7 @@ export function bindPluginRegistryRuntimeAccess({
272
273
  pluginRegistry.events.emit("config:changed", { config: nextConfig });
273
274
  // The profile that kept a portfolio fills in what the removed one held there.
274
275
  for (const heirId of new Set(heirs.values())) {
275
- void importBrokerPositions(heirId).catch(() => {});
276
+ void importBrokerPositions(heirId).catch(logFailure("app.runtime.plugin-bindings", "Replacement broker positions import failed"));
276
277
  }
277
278
  },
278
279
  });
@@ -1,3 +1,4 @@
1
+ import { logFailure } from "../../utils/log-failure";
1
2
  import { useCallback, useEffect, type Dispatch } from "react";
2
3
  import { loadPersistedBrokerAccountMap } from "../../brokers/account-cache";
3
4
  import type { AppSessionSnapshot } from "../../core/state/session-persistence";
@@ -155,7 +156,7 @@ export function useAppStartupRuntime({
155
156
  sessionHydrationTargetCount: sessionSnapshot?.hydrationTargets.length ?? 0,
156
157
  });
157
158
  } catch (err) {
158
- // Will show empty state.
159
+ logFailure("app.runtime.startup", "Workspace startup hydration failed")(err);
159
160
  }
160
161
  })();
161
162
  }, [
@@ -215,9 +216,7 @@ export function useAppStartupRuntime({
215
216
  });
216
217
  void Promise.race([pluginsReady, waitForPlugins]).then(() => {
217
218
  recordRestoredFunctions(restoredUsageFunctions(config.layout, pluginRegistry, config.disabledPlugins));
218
- }).catch(() => {
219
- /* Counting is best effort and must not surface as a crash. */
220
- });
219
+ }).catch(logFailure("app.runtime.startup", "Restored function usage recording failed"));
221
220
  }, [getState, isDetachedWindow, pluginRegistry, pluginsReady, state.initialized]);
222
221
 
223
222
  useEffect(() => {
@@ -1,3 +1,4 @@
1
+ import { logFailure } from "../../utils/log-failure";
1
2
  import { useCallback, useEffect, useRef, type Dispatch } from "react";
2
3
  import type { MarketDataCoordinator } from "../../market-data/coordinator";
3
4
  import { instrumentFromTicker, type InstrumentRef } from "../../market-data/request-types";
@@ -75,10 +76,10 @@ export function useTickerRefreshRuntime({
75
76
  const data = entry.data ?? entry.lastGoodData;
76
77
  if (data) pluginRegistry.events.emit("ticker:refreshed", { symbol: instrument.symbol, financials: data });
77
78
  const currency = data?.quote?.currency;
78
- if (currency) void marketData.loadFxRate(currency).catch(() => {});
79
- void marketData.loadFxRate(baseCurrency).catch(() => {});
80
- } catch {
81
- // Silently fail - will show "—" for missing data.
79
+ if (currency) void marketData.loadFxRate(currency).catch(logFailure("app.runtime.ticker-refresh", "Refreshing an exchange rate failed"));
80
+ void marketData.loadFxRate(baseCurrency).catch(logFailure("app.runtime.ticker-refresh", "Refreshing an exchange rate failed"));
81
+ } catch (error) {
82
+ logFailure("app.runtime.ticker-refresh", "Ticker refresh failed")(error);
82
83
  } finally {
83
84
  refreshInFlight.delete(key);
84
85
  setRefreshing(instrument.symbol, false);
@@ -93,10 +94,10 @@ export function useTickerRefreshRuntime({
93
94
  const entry = await marketData.loadQuote(instrument, { forceRefresh: true });
94
95
  const quote = entry.data ?? entry.lastGoodData;
95
96
  if (!quote) return;
96
- if (quote.currency) void marketData.loadFxRate(quote.currency).catch(() => {});
97
- void marketData.loadFxRate(baseCurrency).catch(() => {});
98
- } catch {
99
- // Silently fail - the list can fall back to stale cache or the backend.
97
+ if (quote.currency) void marketData.loadFxRate(quote.currency).catch(logFailure("app.runtime.ticker-refresh", "Refreshing an exchange rate failed"));
98
+ void marketData.loadFxRate(baseCurrency).catch(logFailure("app.runtime.ticker-refresh", "Refreshing an exchange rate failed"));
99
+ } catch (error) {
100
+ logFailure("app.runtime.ticker-refresh", "Quote refresh failed")(error);
100
101
  } finally {
101
102
  quoteRefreshInFlight.delete(key);
102
103
  }
@@ -154,10 +155,10 @@ export function useTickerRefreshRuntime({
154
155
  const data = entry.data ?? entry.lastGoodData;
155
156
  if (instrument && data) {
156
157
  pluginRegistry.events.emit("ticker:refreshed", { symbol: instrument.symbol, financials: data });
157
- if (data.quote?.currency) void marketData.loadFxRate(data.quote.currency).catch(() => {});
158
+ if (data.quote?.currency) void marketData.loadFxRate(data.quote.currency).catch(logFailure("app.runtime.ticker-refresh", "Refreshing an exchange rate failed"));
158
159
  }
159
160
  });
160
- void marketData.loadFxRate(baseCurrency).catch(() => {});
161
+ void marketData.loadFxRate(baseCurrency).catch(logFailure("app.runtime.ticker-refresh", "Refreshing an exchange rate failed"));
161
162
  } finally {
162
163
  for (const { instrument, key } of runnable) {
163
164
  refreshInFlight.delete(key);
@@ -183,9 +184,9 @@ export function useTickerRefreshRuntime({
183
184
  const results = await marketData.loadQuotesBatch(runnable.map(({ instrument }) => instrument));
184
185
  for (const entry of results) {
185
186
  const quote = entry.data ?? entry.lastGoodData;
186
- if (quote?.currency) void marketData.loadFxRate(quote.currency).catch(() => {});
187
+ if (quote?.currency) void marketData.loadFxRate(quote.currency).catch(logFailure("app.runtime.ticker-refresh", "Refreshing an exchange rate failed"));
187
188
  }
188
- void marketData.loadFxRate(baseCurrency).catch(() => {});
189
+ void marketData.loadFxRate(baseCurrency).catch(logFailure("app.runtime.ticker-refresh", "Refreshing an exchange rate failed"));
189
190
  } finally {
190
191
  for (const { key } of runnable) {
191
192
  quoteRefreshInFlight.delete(key);
@@ -1,3 +1,4 @@
1
+ import { logFailure } from "../../utils/log-failure";
1
2
  import { useCallback, useEffect, useRef, type Dispatch } from "react";
2
3
  import type { PluginRegistry } from "../../plugins/registry";
3
4
  import { saveConfigImmediately } from "../../state/config-save-scheduler";
@@ -214,13 +215,13 @@ export function useAppUpdateRuntime({
214
215
  const isUpgrade = !!config.lastLaunchedVersion;
215
216
  const nextConfig = { ...config, lastLaunchedVersion: VERSION };
216
217
  dispatch({ type: "SET_CONFIG", config: nextConfig });
217
- void saveConfigImmediately(nextConfig).catch(() => {});
218
+ void saveConfigImmediately(nextConfig).catch(logFailure("update", "Saving the last launched version failed"));
218
219
  // Nightly builds come daily and the changelog lists stable releases only.
219
220
  if (!isUpgrade || isPrereleaseVersion(VERSION)) return;
220
221
  // Opened by the app, not the user: usage counts leave it out.
221
222
  void runAutomated(() => pluginRegistry.createPaneFromTemplateAsync("changelog-pane", {
222
223
  values: { version: VERSION },
223
- })).catch(() => {});
224
+ })).catch(logFailure("update", "Opening release notes failed"));
224
225
  }, [dispatch, enabled, isDetachedWindow, pluginRegistry, stateRef]);
225
226
 
226
227
  useEffect(() => {
@@ -20,10 +20,7 @@
20
20
  "src/cli/pane-functions/screenshot.ts": ["chart-composer","econ-statistics","market-valuation","portfolio-list","ticker-detail","time-sales"],
21
21
  "src/components/command-bar/commands/direct/index.ts": ["broker-manager"],
22
22
  "src/components/command-bar/routes/root/help-items.ts": ["help"],
23
- "src/components/command-bar/workflow/builtin.ts": ["portfolio-list"],
24
23
  "src/components/command-bar/workflow/ops.ts": ["correlation","portfolio-list","ticker-detail"],
25
- "src/components/form-modal/routes.ts": ["portfolio-list"],
26
- "src/components/index.ts": ["portfolio-list"],
27
24
  "src/components/layout/shell/index.tsx": ["cloud"],
28
25
  "src/components/onboarding/use-onboarding-upgrade.ts": ["chat"],
29
26
  "src/layout/desks.ts": ["chart-composer"],
@@ -0,0 +1,186 @@
1
+ {
2
+ "src/cli/desktop-pane-shot.ts": {
3
+ "literals": {
4
+ "font size": 1
5
+ },
6
+ "why": "A pane picture's caption, drawn by the CLI into a page without the app's styles."
7
+ },
8
+ "src/components/metric-treemap/heat-surface.tsx": {
9
+ "literals": {
10
+ "font size": 2,
11
+ "font weight": 1,
12
+ "radius": 2
13
+ },
14
+ "why": "Heat map tiles size, weigh and round their labels to fit each tile; the hover tooltip is the kit's tooltip surface."
15
+ },
16
+ "src/components/metric-treemap/index.tsx": {
17
+ "literals": {
18
+ "font size": 1,
19
+ "font weight": 1,
20
+ "radius": 1,
21
+ "spacing": 1
22
+ },
23
+ "why": "Treemap labels are fitted and padded to their tile's size."
24
+ },
25
+ "src/components/onboarding/onboarding-frame.tsx": {
26
+ "literals": {
27
+ "radius": 1
28
+ },
29
+ "why": "The progress bar is a 2px data mark rounded at its ends."
30
+ },
31
+ "src/components/ui/country-flag.tsx": {
32
+ "literals": {
33
+ "radius": 1
34
+ },
35
+ "why": "A flag is a data mark with its own small rounding."
36
+ },
37
+ "src/components/ui/fields.tsx": {
38
+ "literals": {
39
+ "spacing": 1
40
+ },
41
+ "why": "A framed text area's text keeps 6px off its frame above and below, the padding its fields were given in #1426; its sides are the inset."
42
+ },
43
+ "src/components/ui/range-track.tsx": {
44
+ "literals": {
45
+ "radius": 1,
46
+ "spacing": 1
47
+ },
48
+ "why": "The range track is a data mark rounded at its ends; its marker is centred on its value by a negative margin."
49
+ },
50
+ "src/components/ui/ratio-bar.tsx": {
51
+ "literals": {
52
+ "radius": 2
53
+ },
54
+ "why": "Ratio bar segments are data marks rounded at their ends."
55
+ },
56
+ "src/components/ui/split-bar.tsx": {
57
+ "literals": {
58
+ "radius": 1
59
+ },
60
+ "why": "Split bar segments are data marks rounded at their ends."
61
+ },
62
+ "src/plugins/builtin/chat/attachments/desktop.tsx": {
63
+ "literals": {
64
+ "font size": 3,
65
+ "radius": 5,
66
+ "spacing": 2
67
+ },
68
+ "why": "Chat has its own owner and conventions; reported, not changed (GLO-768)."
69
+ },
70
+ "src/plugins/builtin/chat/content/handle-prompt.tsx": {
71
+ "literals": {
72
+ "font weight": 1,
73
+ "spacing": 2
74
+ },
75
+ "why": "Chat has its own owner and conventions; reported, not changed (GLO-768)."
76
+ },
77
+ "src/plugins/builtin/chat/message/pane-chip.tsx": {
78
+ "literals": {
79
+ "font weight": 1,
80
+ "radius": 3,
81
+ "spacing": 2
82
+ },
83
+ "why": "Chat has its own owner and conventions; reported, not changed (GLO-768)."
84
+ },
85
+ "src/plugins/builtin/credit-documents/gauge.tsx": {
86
+ "literals": {
87
+ "radius": 1
88
+ },
89
+ "why": "The gauge's fill is a data mark rounded at its end."
90
+ },
91
+ "src/plugins/builtin/executives/pane.tsx": {
92
+ "literals": {
93
+ "radius": 1
94
+ },
95
+ "why": "A legend swatch is a data mark."
96
+ },
97
+ "src/plugins/builtin/gpu/ladder.tsx": {
98
+ "literals": {
99
+ "radius": 4,
100
+ "spacing": 6
101
+ },
102
+ "why": "Ladder rungs, ranges and markers are data marks, centred on their values by negative margins."
103
+ },
104
+ "src/plugins/builtin/revenue-breakdown/bars.tsx": {
105
+ "literals": {
106
+ "radius": 1,
107
+ "spacing": 3
108
+ },
109
+ "why": "Revenue bars are data marks, spaced by their own gaps."
110
+ },
111
+ "src/plugins/builtin/supply-chain/graph-pane.tsx": {
112
+ "literals": {
113
+ "radius": 1
114
+ },
115
+ "why": "A graph node's dot is a data mark."
116
+ },
117
+ "src/plugins/builtin/world-venue-map/geo-svg.tsx": {
118
+ "literals": {
119
+ "font weight": 1
120
+ },
121
+ "why": "Map labels are fitted to the map's shapes."
122
+ },
123
+ "src/plugins/builtin/world-venue-map/map.tsx": {
124
+ "literals": {
125
+ "radius": 1
126
+ },
127
+ "why": "A legend swatch is the series' line, drawn as a data mark."
128
+ },
129
+ "src/renderers/dom/build-assets.ts": {
130
+ "literals": {
131
+ "grey": 1
132
+ },
133
+ "why": "The page's background before the app's styles load."
134
+ },
135
+ "src/renderers/dom/desktop/controls.tsx": {
136
+ "literals": {
137
+ "font size": 1,
138
+ "grey": 4,
139
+ "spacing": 2
140
+ },
141
+ "why": "The checkbox's tick is white on the accent for contrast in every theme; the message composer (its size and padding) belongs to chat."
142
+ },
143
+ "src/renderers/dom/host/media-surface.tsx": {
144
+ "literals": {
145
+ "grey": 3
146
+ },
147
+ "why": "A video's letterbox is black in every theme."
148
+ },
149
+ "src/renderers/dom/host/overflow-fade.ts": {
150
+ "literals": {
151
+ "grey": 4
152
+ },
153
+ "why": "Black here is a mask's opacity, not a colour."
154
+ },
155
+ "src/renderers/dom/host/surface-3d.tsx": {
156
+ "literals": {
157
+ "grey": 1,
158
+ "radius": 2
159
+ },
160
+ "why": "The 3D surface's colour bar and probe are data marks."
161
+ },
162
+ "src/renderers/dom/styles.css": {
163
+ "literals": {
164
+ "font size": 2,
165
+ "grey": 9,
166
+ "radius": 1,
167
+ "spacing": 17
168
+ },
169
+ "why": "The root font size the tokens scale from, the fatal page drawn when the app could not start (its own size, button, spacing and fallbacks), theme fallbacks inside var(), Windows' red close button, the pane header's 7px beside its 1px edge, the 1px a band or bar leaves its hairline, the toast's own layout (indicator, heading, actions) and the call player's thumb centred on its track."
170
+ },
171
+ "src/renderers/share/styles.css": {
172
+ "literals": {
173
+ "font size": 8,
174
+ "grey": 2,
175
+ "radius": 2,
176
+ "spacing": 43
177
+ },
178
+ "why": "Share pages are a separate public page with their own styles."
179
+ },
180
+ "src/types/config.ts": {
181
+ "literals": {
182
+ "font size": 1
183
+ },
184
+ "why": "The default font size setting, a number of pixels the user changes."
185
+ }
186
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "ADJ": [
3
+ {
4
+ "measure": "inset",
5
+ "value": 0,
6
+ "component": "LevelLine",
7
+ "why": "Registry plugin (gloomberb-adjacent-indices): its detail's level line is its own code and is fixed in its repository."
8
+ }
9
+ ],
10
+ "CFNG": [
11
+ {
12
+ "measure": "font size",
13
+ "value": 31,
14
+ "component": "SvgText",
15
+ "why": "Registry plugin (gloomberb-crypto-fear-greed): the gauge's figure is drawn to the gauge's size, a fitted chart label."
16
+ },
17
+ {
18
+ "measure": "font weight",
19
+ "value": 800,
20
+ "component": "SvgText",
21
+ "why": "Registry plugin (gloomberb-crypto-fear-greed): the gauge's figure, as above."
22
+ }
23
+ ],
24
+ "CHAT": [
25
+ {
26
+ "measure": "inset",
27
+ "value": 7.2,
28
+ "component": "PaneSidebarRow",
29
+ "why": "Chat has its own owner: its channel rows start 7px in (reported, not changed, in GLO-768)."
30
+ }
31
+ ],
32
+ "FXMD_REST_HEALTH": [
33
+ {
34
+ "measure": "inset",
35
+ "value": 0,
36
+ "component": "ResearchPane",
37
+ "why": "Registry plugin (gloomberb-fxmacrodata): its results line is its own code and is fixed in its repository."
38
+ }
39
+ ]
40
+ }