gloomberb 0.18.3 → 0.18.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (886) hide show
  1. package/README.md +8 -8
  2. package/README.zh-CN.md +11 -11
  3. package/bin/{gloomberb → gloom} +3 -1
  4. package/package.json +6 -2
  5. package/src/account/checkout-handoff.tsx +225 -0
  6. package/src/account/device-signin-dialog.tsx +2 -2
  7. package/src/account/device-signin.ts +2 -2
  8. package/src/account/upgrade-dialog.tsx +1 -1
  9. package/src/api-client/askg.ts +2 -2
  10. package/src/api-client/auth.ts +2 -2
  11. package/src/api-client/central-bank-rates.ts +6 -0
  12. package/src/api-client/collections.ts +5 -1
  13. package/src/api-client/cot.ts +2 -0
  14. package/src/api-client/crypto-etf-flows.ts +37 -0
  15. package/src/api-client/crypto-markets.ts +60 -0
  16. package/src/api-client/data.ts +84 -5
  17. package/src/api-client/doe.ts +15 -0
  18. package/src/api-client/equity-screener.ts +28 -0
  19. package/src/api-client/exchange-announcements.ts +38 -0
  20. package/src/api-client/fund-facts.ts +39 -0
  21. package/src/api-client/futures-curve.ts +9 -1
  22. package/src/api-client/hiring.ts +301 -0
  23. package/src/api-client/index.ts +22 -5
  24. package/src/api-client/market-discovery.ts +14 -0
  25. package/src/api-client/members.ts +6 -0
  26. package/src/api-client/mna.ts +6 -0
  27. package/src/api-client/paths.ts +18 -1
  28. package/src/api-client/request.ts +21 -4
  29. package/src/api-client/short-side-publications.ts +37 -0
  30. package/src/api-client/socket.ts +64 -4
  31. package/src/api-client/swap-curve.ts +35 -0
  32. package/src/api-client/themes.ts +7 -1
  33. package/src/api-client/types.ts +90 -2
  34. package/src/app/pane-runtime/plugin-bindings.ts +9 -2
  35. package/src/app/runtime/desktop-deeplink.ts +5 -5
  36. package/src/app/runtime/plugin-bindings.ts +2 -2
  37. package/src/app/runtime/startup.ts +13 -0
  38. package/src/app/star-prompt/status-line.tsx +2 -2
  39. package/src/architecture/core-builtin-allowlist.json +5 -2
  40. package/src/architecture/ui-literals-allowlist.json +3 -3
  41. package/src/architecture/ui-tokens-allowlist.json +1 -1
  42. package/src/brokers/broker-portfolio-sync.ts +37 -0
  43. package/src/brokers/directory.ts +11 -0
  44. package/src/brokers/logos.ts +3 -1
  45. package/src/brokers/signed-in/adapter.ts +304 -26
  46. package/src/brokers/signed-in/client.ts +14 -2
  47. package/src/brokers/signed-in/connect.ts +10 -2
  48. package/src/brokers/sync-broker-instance.ts +9 -1
  49. package/src/capabilities/chart-series.ts +22 -6
  50. package/src/cli/bank-section.ts +1 -1
  51. package/src/cli/base-converter.ts +23 -14
  52. package/src/cli/central-bank-events.ts +1 -1
  53. package/src/cli/command-options.ts +59 -4
  54. package/src/cli/commands/api.ts +9 -6
  55. package/src/cli/commands/broker.ts +2 -2
  56. package/src/cli/commands/command-utils.ts +2 -2
  57. package/src/cli/commands/crypto-hints.ts +7 -20
  58. package/src/cli/commands/fred-series.ts +4 -2
  59. package/src/cli/commands/keybindings.ts +2 -2
  60. package/src/cli/commands/market.ts +1117 -264
  61. package/src/cli/commands/news-hints.ts +2 -2
  62. package/src/cli/commands/news-search.ts +59 -6
  63. package/src/cli/commands/options-leaps.ts +41 -26
  64. package/src/cli/commands/overview.ts +121 -48
  65. package/src/cli/commands/plugins.ts +9 -9
  66. package/src/cli/commands/remote.ts +13 -10
  67. package/src/cli/commands/search.ts +64 -44
  68. package/src/cli/commands/system.ts +27 -19
  69. package/src/cli/commands/themes.ts +1 -1
  70. package/src/cli/commands/ticker.ts +192 -47
  71. package/src/cli/context.ts +3 -2
  72. package/src/cli/desktop-pane-shot-view.ts +2 -2
  73. package/src/cli/desktop-pane-shot.ts +1 -1
  74. package/src/cli/earnings-calendar.ts +4 -4
  75. package/src/cli/entry.ts +18 -1
  76. package/src/cli/errors.ts +20 -2
  77. package/src/cli/exit-codes.ts +1 -1
  78. package/src/cli/export-source.ts +10 -4
  79. package/src/cli/freshness.ts +2 -8
  80. package/src/cli/fx-forward.ts +130 -0
  81. package/src/cli/fx-pair.ts +10 -9
  82. package/src/cli/glossary.ts +64 -20
  83. package/src/cli/help.ts +19 -13
  84. package/src/cli/history-export.ts +126 -0
  85. package/src/cli/history-rows.ts +196 -43
  86. package/src/cli/index-roots.ts +5 -45
  87. package/src/cli/index.ts +24 -18
  88. package/src/cli/known-gaps.ts +118 -25
  89. package/src/cli/listing-arg.ts +300 -41
  90. package/src/cli/name-entries.ts +30 -18
  91. package/src/cli/native-smoke.ts +2 -0
  92. package/src/cli/not-a-ticker.ts +19 -9
  93. package/src/cli/opentui-libc.ts +5 -0
  94. package/src/cli/options.ts +12 -0
  95. package/src/cli/pane-functions/capabilities.ts +75 -20
  96. package/src/cli/pane-functions/catalog.ts +24 -23
  97. package/src/cli/pane-functions/discovery.ts +1 -1
  98. package/src/cli/pane-functions/dom.ts +10 -7
  99. package/src/cli/pane-functions/financial-ratio-shot.ts +2 -2
  100. package/src/cli/pane-functions/freshness.ts +174 -23
  101. package/src/cli/pane-functions/function-help.ts +66 -27
  102. package/src/cli/pane-functions/headless.ts +24 -11
  103. package/src/cli/pane-functions/index.ts +18 -16
  104. package/src/cli/pane-functions/options.ts +22 -2
  105. package/src/cli/pane-functions/report-notices.ts +12 -4
  106. package/src/cli/pane-functions/report.ts +5 -5
  107. package/src/cli/pane-functions/resolver.ts +47 -10
  108. package/src/cli/pane-functions/screenshot-assessment.ts +322 -0
  109. package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
  110. package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
  111. package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
  112. package/src/cli/pane-functions/screenshot-evidence.ts +1 -1
  113. package/src/cli/pane-functions/screenshot-payload.ts +453 -0
  114. package/src/cli/pane-functions/screenshot-render.ts +316 -0
  115. package/src/cli/pane-functions/screenshot-types.ts +162 -0
  116. package/src/cli/pane-functions/shot-options.ts +8 -3
  117. package/src/cli/peso-dollar-rates.ts +79 -0
  118. package/src/cli/quote-answer.ts +38 -3
  119. package/src/cli/report-tables.ts +61 -16
  120. package/src/cli/restore-plugins.ts +29 -14
  121. package/src/cli/result.ts +111 -22
  122. package/src/cli/series-search.ts +5 -5
  123. package/src/cli/statement-filings.ts +19 -0
  124. package/src/cli/suffixed-listing-rows.ts +49 -0
  125. package/src/cli/symbol-args.ts +50 -15
  126. package/src/cli/symbol-cells.ts +120 -0
  127. package/src/cli/symbol-list.ts +198 -68
  128. package/src/cli/symbol-rows.ts +131 -25
  129. package/src/cli/ticker-resolution.ts +108 -11
  130. package/src/cli/treasury-yields.ts +5 -5
  131. package/src/cli/types.ts +2 -0
  132. package/src/cli/uncovered-instrument.ts +3 -3
  133. package/src/cli/unknown-command.ts +6 -6
  134. package/src/components/chart/composite/chart-layout.ts +131 -0
  135. package/src/components/chart/composite/composite-chart.tsx +373 -16
  136. package/src/components/chart/composite/interactions.ts +7 -2
  137. package/src/components/chart/composite/legend.tsx +75 -3
  138. package/src/components/chart/composite/levels.ts +5 -0
  139. package/src/components/chart/composite/panel-gestures.ts +41 -0
  140. package/src/components/chart/composite/panel-labels.ts +2 -1
  141. package/src/components/chart/composite/panel-surface.tsx +305 -11
  142. package/src/components/chart/composite/price-axis-labels.tsx +27 -3
  143. package/src/components/chart/composite/rasterizer.ts +44 -19
  144. package/src/components/chart/composite/scene.ts +16 -4
  145. package/src/components/chart/composite/text-renderer.ts +48 -21
  146. package/src/components/chart/composite/toolbar.tsx +52 -5
  147. package/src/components/chart/composite/types.ts +13 -0
  148. package/src/components/chart/composite/use-composite-chart-keyboard.ts +120 -13
  149. package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
  150. package/src/components/chart/composite/use-composite-viewport.ts +12 -3
  151. package/src/components/chart/composite/value-scale.ts +149 -0
  152. package/src/components/chart/composite/volume-profile-paint.ts +6 -3
  153. package/src/components/chart/core/pointer.ts +2 -0
  154. package/src/components/chart-table/index.ts +2 -0
  155. package/src/components/chart-table/read.tsx +74 -0
  156. package/src/components/command-bar/commands/collection-list.ts +41 -19
  157. package/src/components/command-bar/commands/collection.ts +9 -3
  158. package/src/components/command-bar/commands/direct/index.ts +1 -1
  159. package/src/components/command-bar/commands/direct/runtime.ts +3 -2
  160. package/src/components/command-bar/pane-templates/items.ts +59 -6
  161. package/src/components/command-bar/pane-templates/workflow.ts +10 -1
  162. package/src/components/command-bar/routes/root/plugin-install.ts +1 -1
  163. package/src/components/command-bar/routes/root/provider-search.ts +42 -11
  164. package/src/components/command-bar/routes/root/results.ts +18 -4
  165. package/src/components/command-bar/routes/root/runtime.ts +15 -3
  166. package/src/components/command-bar/routes/root/search-providers.ts +25 -2
  167. package/src/components/command-bar/routes/root/selection.ts +6 -1
  168. package/src/components/command-bar/routes/root/shortcut-feedback.ts +4 -1
  169. package/src/components/command-bar/routes/root/shortcuts.ts +30 -3
  170. package/src/components/command-bar/routes/ticker-search/results.ts +73 -4
  171. package/src/components/command-bar/selection-runtime.ts +50 -10
  172. package/src/components/command-bar/surface/index.tsx +24 -2
  173. package/src/components/command-bar/view-model.ts +7 -0
  174. package/src/components/command-bar/workflow/broker.ts +2 -2
  175. package/src/components/command-bar/workflow/collection-actions.ts +46 -7
  176. package/src/components/command-bar/workflow/collection-ticker.ts +32 -4
  177. package/src/components/command-bar/workflow/fields.ts +8 -2
  178. package/src/components/command-bar/workflow/ops.ts +18 -4
  179. package/src/components/command-bar/workflow/portfolio-position.ts +53 -4
  180. package/src/components/command-bar/workflow/submit.ts +3 -2
  181. package/src/components/command-bar/workflow/tickers.ts +5 -1
  182. package/src/components/company-logo.tsx +39 -0
  183. package/src/components/data-table/sections.ts +4 -2
  184. package/src/components/form-modal/confirm.tsx +2 -1
  185. package/src/components/form-modal/request.ts +5 -0
  186. package/src/components/form-modal/routes.ts +4 -1
  187. package/src/components/index.ts +12 -6
  188. package/src/components/layout/header.tsx +7 -6
  189. package/src/components/layout/market-summary.ts +9 -6
  190. package/src/components/layout/pane/capture-status.ts +1 -1
  191. package/src/components/layout/pane/footer/model.ts +11 -5
  192. package/src/components/layout/shell/chrome.ts +19 -6
  193. package/src/components/layout/shell/index.tsx +2 -1
  194. package/src/components/layout/shell/pane/layers.tsx +19 -1
  195. package/src/components/layout/status-bar.tsx +2 -2
  196. package/src/components/market-board/index.tsx +11 -3
  197. package/src/components/onboarding/onboarding-wizard.tsx +1 -0
  198. package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +2 -2
  199. package/src/components/onboarding/wizard-broker-sync.ts +4 -1
  200. package/src/components/pane-settings-dialog/desktop.tsx +20 -7
  201. package/src/components/pane-settings-dialog/tui.tsx +17 -9
  202. package/src/components/pane-settings-dialog/value.ts +8 -1
  203. package/src/components/pane-settings-dialog.tsx +44 -13
  204. package/src/components/sign-in-code-panel.tsx +27 -19
  205. package/src/components/ui/column-grid.tsx +48 -4
  206. package/src/components/ui/country-flag-art.tsx +180 -0
  207. package/src/components/ui/country-flag.tsx +118 -12
  208. package/src/components/ui/data-table/opentui/index.tsx +61 -2
  209. package/src/components/ui/data-table/opentui/model.ts +109 -2
  210. package/src/components/ui/data-table/types.ts +1 -1
  211. package/src/components/ui/display.tsx +5 -1
  212. package/src/components/ui/index.ts +3 -1
  213. package/src/components/ui/logo-mark.tsx +11 -2
  214. package/src/components/ui/query-bar.tsx +1 -1
  215. package/src/components/ui/row-notes.ts +79 -0
  216. package/src/core/state/app/layout.ts +4 -4
  217. package/src/data/cached-query.ts +8 -1
  218. package/src/data/config/chart-settings.ts +3 -3
  219. package/src/data/config/home.ts +10 -2
  220. package/src/data/config/layout.ts +4 -1
  221. package/src/data/config/store/node.ts +4 -0
  222. package/src/data/config/store/normalize.ts +13 -3
  223. package/src/data/config/store/portfolio-as-of-column.ts +2 -2
  224. package/src/data/json-storage.ts +2 -0
  225. package/src/data/saved-copies.ts +84 -0
  226. package/src/docs/snapshot.json +65 -32
  227. package/src/i18n/es.ts +29 -12
  228. package/src/i18n/ja.ts +29 -12
  229. package/src/i18n/ko.ts +29 -12
  230. package/src/i18n/zh-cn.ts +29 -12
  231. package/src/i18n/zh-tw.ts +29 -12
  232. package/src/layout/desks.ts +1 -1
  233. package/src/layout/launch-layout.ts +1 -1
  234. package/src/layout/pane-manager/floating-actions.ts +5 -3
  235. package/src/layout/pane-manager/floating.ts +43 -1
  236. package/src/layout/pane-manager/index.ts +2 -0
  237. package/src/layout/selected-ticker.ts +74 -0
  238. package/src/market-data/depositary-pair.ts +251 -0
  239. package/src/market-data/futures-board.ts +1 -1
  240. package/src/market-data/futures-contract.ts +124 -40
  241. package/src/market-data/fx-closes.ts +17 -2
  242. package/src/market-data/hooks.tsx +19 -11
  243. package/src/market-data/market/change-basis.ts +49 -7
  244. package/src/market-data/market/freshness.ts +34 -5
  245. package/src/market-data/market/period-return.ts +163 -0
  246. package/src/market-data/market/trading-sessions.ts +13 -0
  247. package/src/market-data/market/year-to-date.ts +8 -13
  248. package/src/market-data/performance.ts +20 -14
  249. package/src/market-data/perpetual-premium.ts +32 -0
  250. package/src/market-data/published-apac-sessions.ts +2 -1
  251. package/src/market-data/published-futures-sessions.ts +69 -0
  252. package/src/market-data/quotes/contributions.ts +5 -1
  253. package/src/market-data/quotes/freshness.ts +42 -0
  254. package/src/market-data/quotes/intraday-bar.ts +37 -0
  255. package/src/market-data/quotes/regular-session-valuation.ts +13 -8
  256. package/src/market-data/quotes/resolution.ts +4 -2
  257. package/src/market-data/tax-equivalent.ts +1 -1
  258. package/src/market-data/ticker-price-returns.ts +3 -1
  259. package/src/news/aggregator.ts +5 -1
  260. package/src/news/news-model.ts +4 -0
  261. package/src/news/types.ts +11 -0
  262. package/src/notifications/app-notifier.ts +1 -1
  263. package/src/plugins/auto-update.ts +2 -2
  264. package/src/plugins/builtin/account-management/index.tsx +1 -0
  265. package/src/plugins/builtin/account-management/pane.tsx +9 -8
  266. package/src/plugins/builtin/alerts/alert-engine.ts +29 -19
  267. package/src/plugins/builtin/alerts/calendar-events.ts +378 -0
  268. package/src/plugins/builtin/alerts/cli.ts +485 -76
  269. package/src/plugins/builtin/alerts/command.ts +5 -10
  270. package/src/plugins/builtin/alerts/event-rows.ts +9 -5
  271. package/src/plugins/builtin/alerts/events-pane.tsx +71 -56
  272. package/src/plugins/builtin/alerts/events.ts +107 -5
  273. package/src/plugins/builtin/alerts/fired-log.ts +78 -0
  274. package/src/plugins/builtin/alerts/format.ts +2 -1
  275. package/src/plugins/builtin/alerts/headless.ts +100 -39
  276. package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
  277. package/src/plugins/builtin/alerts/history-rows.ts +89 -0
  278. package/src/plugins/builtin/alerts/index.tsx +45 -18
  279. package/src/plugins/builtin/alerts/iv-level.ts +365 -0
  280. package/src/plugins/builtin/alerts/levels.ts +3 -3
  281. package/src/plugins/builtin/alerts/pane.tsx +97 -29
  282. package/src/plugins/builtin/alerts/price.ts +35 -0
  283. package/src/plugins/builtin/alerts/quotes.ts +24 -0
  284. package/src/plugins/builtin/alerts/research-builder.ts +84 -11
  285. package/src/plugins/builtin/alerts/research-rules.ts +76 -3
  286. package/src/plugins/builtin/alerts/scheduled-check.ts +206 -32
  287. package/src/plugins/builtin/alerts/scheduled-sources.ts +26 -3
  288. package/src/plugins/builtin/alerts/scheduled.ts +188 -29
  289. package/src/plugins/builtin/alerts/storage.ts +13 -10
  290. package/src/plugins/builtin/alerts/targets.ts +12 -3
  291. package/src/plugins/builtin/analytics/index.tsx +8 -2
  292. package/src/plugins/builtin/analytics/metrics.ts +1 -1
  293. package/src/plugins/builtin/analytics/risk-book.ts +215 -0
  294. package/src/plugins/builtin/analytics/risk-client.ts +13 -6
  295. package/src/plugins/builtin/analytics/risk-headless.ts +55 -21
  296. package/src/plugins/builtin/analytics/risk-math.ts +6 -3
  297. package/src/plugins/builtin/analytics/risk-model.ts +297 -104
  298. package/src/plugins/builtin/analytics/risk-options.ts +17 -2
  299. package/src/plugins/builtin/analytics/risk-pane.tsx +97 -36
  300. package/src/plugins/builtin/attention/pane.tsx +6 -2
  301. package/src/plugins/builtin/awards/headless.ts +7 -3
  302. package/src/plugins/builtin/awards/model.ts +18 -0
  303. package/src/plugins/builtin/awards/pane.tsx +6 -3
  304. package/src/plugins/builtin/backtest/headless.ts +3 -3
  305. package/src/plugins/builtin/backtest/rules.ts +41 -5
  306. package/src/plugins/builtin/broker-manager/add-flow.tsx +12 -7
  307. package/src/plugins/builtin/broker-manager/detail.tsx +47 -19
  308. package/src/plugins/builtin/broker-manager/footer.ts +27 -11
  309. package/src/plugins/builtin/broker-manager/index.tsx +21 -12
  310. package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
  311. package/src/plugins/builtin/broker-manager/model.ts +12 -2
  312. package/src/plugins/builtin/broker-manager/pane-actions.tsx +183 -57
  313. package/src/plugins/builtin/broker-manager/table.ts +28 -12
  314. package/src/plugins/builtin/broker-trading/account-picker.tsx +2 -1
  315. package/src/plugins/builtin/broker-trading/chart-levels.ts +82 -13
  316. package/src/plugins/builtin/broker-trading/controller.ts +45 -13
  317. package/src/plugins/builtin/broker-trading/dock.tsx +22 -4
  318. package/src/plugins/builtin/broker-trading/headless.ts +2 -1
  319. package/src/plugins/builtin/broker-trading/index.tsx +7 -1
  320. package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
  321. package/src/plugins/builtin/broker-trading/order-feed.ts +75 -7
  322. package/src/plugins/builtin/broker-trading/orders.tsx +109 -31
  323. package/src/plugins/builtin/broker-trading/overview-orders.tsx +9 -3
  324. package/src/plugins/builtin/broker-trading/pane-model.ts +30 -2
  325. package/src/plugins/builtin/broker-trading/pane.tsx +110 -23
  326. package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
  327. package/src/plugins/builtin/broker-trading/ticket.tsx +112 -31
  328. package/src/plugins/builtin/buildout/cells.tsx +4 -0
  329. package/src/plugins/builtin/buildout/detail/index.tsx +5 -1
  330. package/src/plugins/builtin/buildout/detail/ui.tsx +7 -4
  331. package/src/plugins/builtin/buildout/pane/index.tsx +25 -12
  332. package/src/plugins/builtin/buildout/pane/status.tsx +0 -4
  333. package/src/plugins/builtin/builtin-plugin-meta.ts +1 -1
  334. package/src/plugins/builtin/catalysts/detail.tsx +3 -2
  335. package/src/plugins/builtin/catalysts/index.tsx +1 -1
  336. package/src/plugins/builtin/catalysts/model.ts +49 -4
  337. package/src/plugins/builtin/catalysts/pane.tsx +6 -8
  338. package/src/plugins/builtin/central-bank-rates/client.ts +5 -0
  339. package/src/plugins/builtin/central-bank-rates/headless.ts +36 -10
  340. package/src/plugins/builtin/central-bank-rates/model.ts +33 -8
  341. package/src/plugins/builtin/changelog/index.tsx +1 -0
  342. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +1 -0
  343. package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +2 -1
  344. package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
  345. package/src/plugins/builtin/chart-composer/cli-options.ts +2 -5
  346. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +2 -1
  347. package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -0
  348. package/src/plugins/builtin/chart-composer/editor.tsx +4 -1
  349. package/src/plugins/builtin/chart-composer/headless-schema.ts +28 -26
  350. package/src/plugins/builtin/chart-composer/headless.ts +253 -35
  351. package/src/plugins/builtin/chart-composer/index.tsx +12 -2
  352. package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
  353. package/src/plugins/builtin/chart-composer/pane.tsx +127 -28
  354. package/src/plugins/builtin/chart-composer/series-catalog.ts +1 -0
  355. package/src/plugins/builtin/chart-composer/series-expression.ts +65 -6
  356. package/src/plugins/builtin/chart-composer/session-history.ts +15 -21
  357. package/src/plugins/builtin/chart-composer/session-range.ts +4 -2
  358. package/src/plugins/builtin/chart-composer/settings.ts +31 -19
  359. package/src/plugins/builtin/chart-composer/use-series-catalog.ts +5 -6
  360. package/src/plugins/builtin/chart-composer/viewport-labels.ts +18 -8
  361. package/src/plugins/builtin/chat/attachments/model.ts +3 -1
  362. package/src/plugins/builtin/chat/content/index.tsx +1 -1
  363. package/src/plugins/builtin/chat/pane-links/open.ts +1 -1
  364. package/src/plugins/builtin/chat/people.ts +1 -1
  365. package/src/plugins/builtin/clinical-trials/client.ts +5 -2
  366. package/src/plugins/builtin/clinical-trials/model.ts +13 -4
  367. package/src/plugins/builtin/clinical-trials/pane.tsx +32 -12
  368. package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +17 -0
  369. package/src/plugins/builtin/cloud/askg/controller.ts +1 -1
  370. package/src/plugins/builtin/cloud/askg/lock-note.ts +1 -1
  371. package/src/plugins/builtin/cloud/askg/tool-display.ts +1 -1
  372. package/src/plugins/builtin/cloud/auth-commands.ts +3 -3
  373. package/src/plugins/builtin/cloud/team/pane-sections.tsx +105 -47
  374. package/src/plugins/builtin/cloud/team/pane-ui.tsx +42 -4
  375. package/src/plugins/builtin/cloud/team/pane.tsx +204 -64
  376. package/src/plugins/builtin/cloud/thesis/store.ts +45 -22
  377. package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
  378. package/src/plugins/builtin/commodities-energy/index.tsx +29 -2
  379. package/src/plugins/builtin/commodities-energy/view-state.ts +2 -0
  380. package/src/plugins/builtin/commodity-balances/pane.tsx +11 -4
  381. package/src/plugins/builtin/company-attention/app-rank.tsx +7 -5
  382. package/src/plugins/builtin/company-attention/building-model.ts +222 -0
  383. package/src/plugins/builtin/company-attention/building.tsx +172 -0
  384. package/src/plugins/builtin/company-attention/client.ts +117 -1
  385. package/src/plugins/builtin/company-attention/evidence.ts +16 -3
  386. package/src/plugins/builtin/company-attention/headless.ts +101 -5
  387. package/src/plugins/builtin/company-attention/index.tsx +6 -3
  388. package/src/plugins/builtin/company-attention/model.ts +33 -7
  389. package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
  390. package/src/plugins/builtin/company-attention/moves.tsx +159 -0
  391. package/src/plugins/builtin/company-attention/pane.tsx +79 -23
  392. package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
  393. package/src/plugins/builtin/company-attention/signals.tsx +160 -0
  394. package/src/plugins/builtin/company-kpis/headless.ts +3 -2
  395. package/src/plugins/builtin/company-kpis/model.ts +2 -2
  396. package/src/plugins/builtin/company-kpis/pane.tsx +1 -1
  397. package/src/plugins/builtin/composite-plugins.ts +2 -1
  398. package/src/plugins/builtin/congress-trades/headless.ts +1 -1
  399. package/src/plugins/builtin/connections/index.ts +1 -0
  400. package/src/plugins/builtin/correlation/headless-schema.ts +3 -2
  401. package/src/plugins/builtin/correlation/headless.ts +5 -3
  402. package/src/plugins/builtin/cot/headless.ts +28 -6
  403. package/src/plugins/builtin/cot/model.ts +12 -0
  404. package/src/plugins/builtin/cot/pane.tsx +3 -2
  405. package/src/plugins/builtin/cpi/headless.ts +5 -1
  406. package/src/plugins/builtin/cpi/pane.tsx +11 -9
  407. package/src/plugins/builtin/credit-boards/model.ts +2 -0
  408. package/src/plugins/builtin/credit-documents/headless.ts +1 -1
  409. package/src/plugins/builtin/crypto-board/client.ts +86 -0
  410. package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
  411. package/src/plugins/builtin/crypto-board/defi.ts +239 -0
  412. package/src/plugins/builtin/crypto-board/headless.ts +117 -6
  413. package/src/plugins/builtin/crypto-board/index.tsx +8 -3
  414. package/src/plugins/builtin/crypto-board/model.ts +40 -8
  415. package/src/plugins/builtin/crypto-board/pane.tsx +55 -21
  416. package/src/plugins/builtin/crypto-board/series.ts +19 -1
  417. package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
  418. package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
  419. package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
  420. package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
  421. package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
  422. package/src/plugins/builtin/debug/index.tsx +1 -0
  423. package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
  424. package/src/plugins/builtin/docs/index.tsx +1 -1
  425. package/src/plugins/builtin/docs/pane.tsx +2 -2
  426. package/src/plugins/builtin/docs/targets.ts +1 -1
  427. package/src/plugins/builtin/doe/client.ts +5 -1
  428. package/src/plugins/builtin/doe/headless.ts +12 -6
  429. package/src/plugins/builtin/doe/model.ts +43 -6
  430. package/src/plugins/builtin/doe/pane.tsx +18 -11
  431. package/src/plugins/builtin/earnings/board-model.ts +13 -6
  432. package/src/plugins/builtin/earnings/board-table.ts +4 -1
  433. package/src/plugins/builtin/earnings/board.tsx +253 -50
  434. package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
  435. package/src/plugins/builtin/earnings/calendar.tsx +338 -0
  436. package/src/plugins/builtin/earnings/client.ts +4 -3
  437. package/src/plugins/builtin/earnings/headless.ts +53 -15
  438. package/src/plugins/builtin/earnings/history-model.ts +53 -36
  439. package/src/plugins/builtin/earnings/index.tsx +15 -22
  440. package/src/plugins/builtin/earnings/model.ts +17 -12
  441. package/src/plugins/builtin/earnings/scope.ts +89 -0
  442. package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
  443. package/src/plugins/builtin/earnings-calls/data.ts +146 -2
  444. package/src/plugins/builtin/earnings-calls/headless.ts +151 -9
  445. package/src/plugins/builtin/earnings-calls/index.tsx +3 -3
  446. package/src/plugins/builtin/earnings-calls/lock-note.ts +1 -1
  447. package/src/plugins/builtin/earnings-calls/pane.tsx +149 -31
  448. package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
  449. package/src/plugins/builtin/earnings-ripple/pane.tsx +10 -5
  450. package/src/plugins/builtin/econ/calendar-model.ts +132 -20
  451. package/src/plugins/builtin/econ/detail-view.tsx +48 -10
  452. package/src/plugins/builtin/econ/fred-catalog.ts +23 -6
  453. package/src/plugins/builtin/econ/fred-series-map.ts +4 -0
  454. package/src/plugins/builtin/econ/index.tsx +112 -25
  455. package/src/plugins/builtin/econ/print-watch.ts +2 -1
  456. package/src/plugins/builtin/econ/types.ts +32 -1
  457. package/src/plugins/builtin/econ-statistics/client.ts +16 -3
  458. package/src/plugins/builtin/econ-statistics/defs.ts +4 -0
  459. package/src/plugins/builtin/econ-statistics/detail.tsx +2 -2
  460. package/src/plugins/builtin/econ-statistics/headless.ts +13 -2
  461. package/src/plugins/builtin/econ-statistics/index.tsx +3 -3
  462. package/src/plugins/builtin/econ-statistics/pane.tsx +2 -1
  463. package/src/plugins/builtin/econ-statistics/stats.ts +103 -0
  464. package/src/plugins/builtin/econ-statistics/view.ts +16 -1
  465. package/src/plugins/builtin/equity-screener/client.ts +21 -3
  466. package/src/plugins/builtin/equity-screener/headless.ts +68 -6
  467. package/src/plugins/builtin/equity-screener/live.ts +1 -1
  468. package/src/plugins/builtin/equity-screener/model.ts +6 -0
  469. package/src/plugins/builtin/equity-screener/pane.tsx +45 -10
  470. package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
  471. package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
  472. package/src/plugins/builtin/estimate-revisions/headless.ts +3 -1
  473. package/src/plugins/builtin/estimate-revisions/lock-note.ts +3 -3
  474. package/src/plugins/builtin/estimate-revisions/model.ts +8 -10
  475. package/src/plugins/builtin/exposure/headless.ts +51 -6
  476. package/src/plugins/builtin/exposure/index.tsx +28 -2
  477. package/src/plugins/builtin/exposure/model.ts +7 -0
  478. package/src/plugins/builtin/exposure/pane.tsx +6 -1
  479. package/src/plugins/builtin/fear-greed/index.tsx +1 -1
  480. package/src/plugins/builtin/filing-events/index.tsx +1 -1
  481. package/src/plugins/builtin/futures/model.ts +10 -9
  482. package/src/plugins/builtin/futures/returns.ts +8 -36
  483. package/src/plugins/builtin/futures/table.tsx +1 -1
  484. package/src/plugins/builtin/futures-curve/client.ts +40 -9
  485. package/src/plugins/builtin/futures-curve/headless.ts +39 -17
  486. package/src/plugins/builtin/futures-curve/model.ts +258 -69
  487. package/src/plugins/builtin/futures-curve/pane.tsx +46 -17
  488. package/src/plugins/builtin/fx-matrix/client.ts +15 -8
  489. package/src/plugins/builtin/fx-matrix/headless.ts +32 -14
  490. package/src/plugins/builtin/fx-matrix/index.tsx +13 -11
  491. package/src/plugins/builtin/fx-matrix/live-legs.ts +22 -0
  492. package/src/plugins/builtin/fx-matrix/settings.ts +2 -1
  493. package/src/plugins/builtin/gpu/headless.ts +9 -4
  494. package/src/plugins/builtin/help/index.tsx +13 -3
  495. package/src/plugins/builtin/holders/beneficial-model.ts +8 -11
  496. package/src/plugins/builtin/holders/beneficial-report.ts +6 -5
  497. package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
  498. package/src/plugins/builtin/holders/client.ts +13 -1
  499. package/src/plugins/builtin/holders/format.ts +28 -17
  500. package/src/plugins/builtin/holders/headless.ts +46 -7
  501. package/src/plugins/builtin/holders/index-holders.ts +264 -0
  502. package/src/plugins/builtin/holders/pane.tsx +79 -15
  503. package/src/plugins/builtin/holders/report-rows.ts +35 -7
  504. package/src/plugins/builtin/holders/table-model.ts +2 -1
  505. package/src/plugins/builtin/holders/treemap.tsx +2 -2
  506. package/src/plugins/builtin/insider/headless.ts +1 -1
  507. package/src/plugins/builtin/insider/signals-client.ts +1 -1
  508. package/src/plugins/builtin/insider/signals.tsx +1 -1
  509. package/src/plugins/builtin/ipo-calendar/pane.tsx +7 -4
  510. package/src/plugins/builtin/iv-history/client.ts +20 -0
  511. package/src/plugins/builtin/iv-history/headless.ts +4 -4
  512. package/src/plugins/builtin/iv-history/index.tsx +1 -1
  513. package/src/plugins/builtin/iv-history/model.ts +13 -4
  514. package/src/plugins/builtin/iv-history/series.ts +3 -1
  515. package/src/plugins/builtin/jobs/lock-note.ts +1 -1
  516. package/src/plugins/builtin/jobs/model.ts +4 -15
  517. package/src/plugins/builtin/jobs/pane.tsx +7 -5
  518. package/src/plugins/builtin/jobs/share-bars.tsx +11 -5
  519. package/src/plugins/builtin/jodi/pane.tsx +10 -4
  520. package/src/plugins/builtin/layout-manager/index.tsx +1 -0
  521. package/src/plugins/builtin/macro-day/headless.ts +20 -7
  522. package/src/plugins/builtin/macro-day/index.tsx +3 -2
  523. package/src/plugins/builtin/macro-day/model.ts +29 -8
  524. package/src/plugins/builtin/macro-day/pane.tsx +46 -10
  525. package/src/plugins/builtin/macro-day/releases.ts +55 -13
  526. package/src/plugins/builtin/market-heatmap/data.ts +9 -2
  527. package/src/plugins/builtin/market-heatmap/evidence.ts +1 -1
  528. package/src/plugins/builtin/market-heatmap/headless.ts +9 -6
  529. package/src/plugins/builtin/market-heatmap/index.tsx +3 -3
  530. package/src/plugins/builtin/market-heatmap/model.ts +10 -7
  531. package/src/plugins/builtin/market-movers/client.ts +33 -19
  532. package/src/plugins/builtin/market-movers/headless.ts +8 -2
  533. package/src/plugins/builtin/market-movers/index.tsx +16 -10
  534. package/src/plugins/builtin/market-movers/screener.ts +29 -8
  535. package/src/plugins/builtin/market-movers/session-body.tsx +4 -2
  536. package/src/plugins/builtin/market-movers/session-table.ts +4 -2
  537. package/src/plugins/builtin/market-movers/table.ts +4 -1
  538. package/src/plugins/builtin/market-valuation/headless.ts +2 -0
  539. package/src/plugins/builtin/market-valuation/view.ts +5 -0
  540. package/src/plugins/builtin/members/headless.ts +6 -5
  541. package/src/plugins/builtin/members/pane.tsx +11 -4
  542. package/src/plugins/builtin/mna/client.ts +1 -0
  543. package/src/plugins/builtin/mna/detail.tsx +20 -32
  544. package/src/plugins/builtin/mna/distress/detail.tsx +16 -4
  545. package/src/plugins/builtin/mna/distress/model.ts +3 -2
  546. package/src/plugins/builtin/mna/distress/pane.tsx +7 -4
  547. package/src/plugins/builtin/mna/headless.ts +6 -13
  548. package/src/plugins/builtin/mna/model.ts +93 -15
  549. package/src/plugins/builtin/mna/pane.tsx +5 -4
  550. package/src/plugins/builtin/news/headless.ts +12 -6
  551. package/src/plugins/builtin/news/index.tsx +10 -1
  552. package/src/plugins/builtin/news/wire/index.tsx +3 -2
  553. package/src/plugins/builtin/news/wire/news/command-bar-search.ts +26 -10
  554. package/src/plugins/builtin/news/wire/news/query-presets.ts +6 -2
  555. package/src/plugins/builtin/news/wire/rss/cli.ts +3 -3
  556. package/src/plugins/builtin/notes/cli.ts +49 -14
  557. package/src/plugins/builtin/openfda/pane.tsx +1 -1
  558. package/src/plugins/builtin/options/carry.ts +2 -2
  559. package/src/plugins/builtin/options/index.tsx +1 -1
  560. package/src/plugins/builtin/options/view.tsx +10 -10
  561. package/src/plugins/builtin/options-calculator/headless.ts +46 -7
  562. package/src/plugins/builtin/options-scenario/client.ts +123 -28
  563. package/src/plugins/builtin/options-scenario/collar.ts +8 -6
  564. package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +127 -0
  565. package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +165 -0
  566. package/src/plugins/builtin/options-scenario/csp-screen.ts +258 -0
  567. package/src/plugins/builtin/options-scenario/csp.ts +101 -21
  568. package/src/plugins/builtin/options-scenario/headless.ts +36 -15
  569. package/src/plugins/builtin/options-scenario/hedge.ts +20 -14
  570. package/src/plugins/builtin/options-scenario/index.tsx +28 -3
  571. package/src/plugins/builtin/options-scenario/model.ts +13 -0
  572. package/src/plugins/builtin/options-scenario/pane.tsx +9 -5
  573. package/src/plugins/builtin/perps/equity-row.tsx +11 -3
  574. package/src/plugins/builtin/perps/freshness.ts +8 -5
  575. package/src/plugins/builtin/perps/headless.ts +3 -1
  576. package/src/plugins/builtin/perps/list-perpetuals.ts +25 -4
  577. package/src/plugins/builtin/perps/live-rows.ts +161 -0
  578. package/src/plugins/builtin/perps/markets-section.tsx +154 -0
  579. package/src/plugins/builtin/perps/pane.tsx +36 -17
  580. package/src/plugins/builtin/perps/venue-markets.ts +96 -0
  581. package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -1
  582. package/src/plugins/builtin/plugin-marketplace/pane.tsx +143 -59
  583. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +72 -24
  584. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +158 -141
  585. package/src/plugins/builtin/portfolio-list/cli/render.ts +49 -20
  586. package/src/plugins/builtin/portfolio-list/cli/shared.ts +3 -3
  587. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +29 -24
  588. package/src/plugins/builtin/portfolio-list/headless.ts +6 -3
  589. package/src/plugins/builtin/portfolio-list/income.ts +13 -2
  590. package/src/plugins/builtin/portfolio-list/index.tsx +9 -2
  591. package/src/plugins/builtin/portfolio-list/pane/index.tsx +21 -8
  592. package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
  593. package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +16 -9
  594. package/src/plugins/builtin/portfolio-list/summary/totals.ts +2 -15
  595. package/src/plugins/builtin/power/client.ts +4 -1
  596. package/src/plugins/builtin/power/evidence.ts +22 -7
  597. package/src/plugins/builtin/power/gas.tsx +5 -1
  598. package/src/plugins/builtin/power/pane.tsx +8 -1
  599. package/src/plugins/builtin/power/prices.tsx +10 -3
  600. package/src/plugins/builtin/research/analyst-headless.ts +25 -8
  601. package/src/plugins/builtin/research/analyst-model.ts +68 -3
  602. package/src/plugins/builtin/research/corporate-actions-pane.tsx +63 -14
  603. package/src/plugins/builtin/research/event-model.ts +3 -1
  604. package/src/plugins/builtin/research/event-sources.ts +12 -4
  605. package/src/plugins/builtin/research/index.tsx +2 -1
  606. package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
  607. package/src/plugins/builtin/research/relative-valuation-columns.ts +31 -2
  608. package/src/plugins/builtin/research/relative-valuation-currency.ts +12 -5
  609. package/src/plugins/builtin/research/relative-valuation-headless.ts +84 -26
  610. package/src/plugins/builtin/research/relative-valuation-model.ts +88 -19
  611. package/src/plugins/builtin/research/relative-valuation-pane.tsx +76 -9
  612. package/src/plugins/builtin/research/relative-valuation-peers.ts +1 -1
  613. package/src/plugins/builtin/reverse-dcf/model.ts +6 -2
  614. package/src/plugins/builtin/risk-factors/index.tsx +2 -2
  615. package/src/plugins/builtin/scanner/lock-note.ts +1 -1
  616. package/src/plugins/builtin/sec/forms.ts +13 -0
  617. package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
  618. package/src/plugins/builtin/sec/fund-facts.ts +68 -8
  619. package/src/plugins/builtin/sec/headless.ts +85 -8
  620. package/src/plugins/builtin/sec/index.tsx +58 -12
  621. package/src/plugins/builtin/sectors/client.ts +2 -1
  622. package/src/plugins/builtin/sectors/sector-model.ts +11 -15
  623. package/src/plugins/builtin/series-inventory.ts +2 -0
  624. package/src/plugins/builtin/shared/broker-reconnect.ts +107 -22
  625. package/src/plugins/builtin/shared/cloud-upgrade.ts +34 -6
  626. package/src/plugins/builtin/shared/earnings-calendar.ts +375 -0
  627. package/src/plugins/builtin/{earnings/estimate-basis.ts → shared/earnings-estimate-basis.ts} +1 -1
  628. package/src/plugins/builtin/shared/earnings-report.ts +3 -3
  629. package/src/plugins/builtin/shared/fx-rate-freshness.ts +23 -1
  630. package/src/plugins/builtin/shared/job-posting.ts +129 -0
  631. package/src/plugins/builtin/shared/pro-lock-note.ts +3 -3
  632. package/src/plugins/builtin/shared/report-freshness.ts +3 -0
  633. package/src/plugins/builtin/shared/research-trading.tsx +21 -0
  634. package/src/plugins/builtin/shared/series-cache.ts +2 -0
  635. package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
  636. package/src/plugins/builtin/short-interest/client.ts +2 -0
  637. package/src/plugins/builtin/short-interest/headless.ts +41 -12
  638. package/src/plugins/builtin/short-interest/index.tsx +23 -1
  639. package/src/plugins/builtin/short-interest/model.ts +70 -19
  640. package/src/plugins/builtin/short-interest/pane.tsx +19 -2
  641. package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
  642. package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
  643. package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
  644. package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
  645. package/src/plugins/builtin/short-interest/schedule.ts +35 -2
  646. package/src/plugins/builtin/short-interest/surface.tsx +11 -4
  647. package/src/plugins/builtin/short-interest/types.ts +9 -0
  648. package/src/plugins/builtin/short-interest/watch-client.ts +14 -8
  649. package/src/plugins/builtin/short-interest/watch-model.ts +12 -25
  650. package/src/plugins/builtin/short-interest/watch-pane.tsx +5 -1
  651. package/src/plugins/builtin/supply-chain/flow.tsx +33 -9
  652. package/src/plugins/builtin/supply-chain/model.ts +51 -3
  653. package/src/plugins/builtin/supply-chain/pane.tsx +78 -39
  654. package/src/plugins/builtin/supply-chain/row-evidence.tsx +1 -1
  655. package/src/plugins/builtin/themes/headless.ts +8 -5
  656. package/src/plugins/builtin/themes/model.ts +14 -4
  657. package/src/plugins/builtin/themes/pane.tsx +24 -5
  658. package/src/plugins/builtin/thirteenf/headless.ts +5 -5
  659. package/src/plugins/builtin/thirteenf/signals.ts +3 -1
  660. package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
  661. package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
  662. package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
  663. package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +40 -26
  664. package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +8 -4
  665. package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +67 -3
  666. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +112 -5
  667. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +17 -2
  668. package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +21 -7
  669. package/src/plugins/builtin/ticker-detail/financials/model.ts +36 -1
  670. package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
  671. package/src/plugins/builtin/ticker-detail/financials/ratios.ts +62 -13
  672. package/src/plugins/builtin/ticker-detail/financials/tab.tsx +30 -4
  673. package/src/plugins/builtin/ticker-detail/headless-schema.ts +14 -2
  674. package/src/plugins/builtin/ticker-detail/headless.ts +148 -35
  675. package/src/plugins/builtin/ticker-detail/index.tsx +37 -5
  676. package/src/plugins/builtin/ticker-detail/overview/model.ts +65 -10
  677. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +9 -1
  678. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +68 -11
  679. package/src/plugins/builtin/ticker-detail/pane.tsx +11 -0
  680. package/src/plugins/builtin/ticker-detail/quote-footer.ts +8 -3
  681. package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
  682. package/src/plugins/builtin/vol-surface/client.ts +5 -4
  683. package/src/plugins/builtin/vol-surface/headless.ts +12 -3
  684. package/src/plugins/builtin/vol-surface/model.ts +4 -2
  685. package/src/plugins/builtin/volatility/model.ts +5 -10
  686. package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +4 -3
  687. package/src/plugins/builtin/world-venue-map/basemap.ts +3 -1
  688. package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -0
  689. package/src/plugins/builtin/world-venue-map/evidence.ts +1 -1
  690. package/src/plugins/builtin/world-venue-map/geo-series.ts +90 -11
  691. package/src/plugins/builtin/world-venue-map/headless.ts +1 -1
  692. package/src/plugins/builtin/world-venue-map/index.ts +3 -26
  693. package/src/plugins/builtin/world-venue-map/layers.ts +1 -1
  694. package/src/plugins/builtin/world-venue-map/map.tsx +2 -1
  695. package/src/plugins/builtin/world-venue-map/pane.tsx +4 -2
  696. package/src/plugins/builtin/world-venue-map/venue-header.tsx +15 -4
  697. package/src/plugins/builtin/yield-curve/client.ts +25 -0
  698. package/src/plugins/builtin/yield-curve/curves.ts +7 -4
  699. package/src/plugins/builtin/yield-curve/headless.ts +38 -4
  700. package/src/plugins/builtin/yield-curve/history.ts +4 -3
  701. package/src/plugins/builtin/yield-curve/index.tsx +12 -6
  702. package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
  703. package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
  704. package/src/plugins/bundle.ts +1 -1
  705. package/src/plugins/catalog-browser.ts +2 -1
  706. package/src/plugins/compat.ts +3 -3
  707. package/src/plugins/dependencies.ts +75 -14
  708. package/src/plugins/extracted-plugins.ts +132 -34
  709. package/src/plugins/host-link.ts +149 -34
  710. package/src/plugins/installer.ts +35 -10
  711. package/src/plugins/loader.ts +206 -38
  712. package/src/plugins/manager-node.ts +2 -2
  713. package/src/plugins/marketplace/deactivation.ts +22 -0
  714. package/src/plugins/marketplace/model.ts +2 -2
  715. package/src/plugins/marketplace/packs.ts +1 -1
  716. package/src/plugins/ownership.ts +1 -1
  717. package/src/plugins/peer-retry.ts +155 -0
  718. package/src/plugins/registry/contributions.ts +3 -1
  719. package/src/plugins/registry/index.ts +4 -3
  720. package/src/plugins/registry/plugin-state.ts +3 -0
  721. package/src/plugins/seed-notice.ts +20 -0
  722. package/src/plugins/shortcut-argument.ts +39 -0
  723. package/src/portfolio/allocation.ts +1 -1
  724. package/src/portfolio/collection-name.ts +31 -0
  725. package/src/portfolio/column-values.ts +10 -8
  726. package/src/portfolio/cost-fx.ts +296 -19
  727. package/src/portfolio/manual-lots.ts +75 -0
  728. package/src/portfolio/mutations.ts +60 -22
  729. package/src/portfolio/suffixed-listings.ts +209 -0
  730. package/src/portfolio/totals-currency.ts +24 -0
  731. package/src/public/__snapshots__/public-api.test.ts.snap +14 -0
  732. package/src/public/time-series.ts +11 -8
  733. package/src/remote/schema.ts +1 -1
  734. package/src/renderers/browser/config-host.ts +3 -0
  735. package/src/renderers/browser/main.tsx +23 -3
  736. package/src/renderers/dom/boot-frame-page.ts +187 -0
  737. package/src/renderers/dom/boot-frame.ts +237 -0
  738. package/src/renderers/dom/build-assets.ts +46 -8
  739. package/src/renderers/dom/dom-ui-host.tsx +4 -29
  740. package/src/renderers/dom/host/ascii-text.ts +16 -2
  741. package/src/renderers/dom/host/box.tsx +43 -2
  742. package/src/renderers/dom/host/chart-surface.tsx +2 -0
  743. package/src/renderers/dom/host/hls.chunk.ts +3 -0
  744. package/src/renderers/dom/host/image-surface.tsx +49 -0
  745. package/src/renderers/dom/host/media-surface.tsx +24 -18
  746. package/src/renderers/dom/host/mouse.ts +30 -0
  747. package/src/renderers/dom/host/size-observer.ts +1 -1
  748. package/src/renderers/dom/host/style.ts +1 -1
  749. package/src/renderers/dom/styles.css +76 -0
  750. package/src/renderers/dom/test-utils.tsx +2 -1
  751. package/src/renderers/electrobun/bun/application-menu/index.ts +3 -3
  752. package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
  753. package/src/renderers/electrobun/bun/desktop/backend.ts +46 -3
  754. package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
  755. package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
  756. package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
  757. package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
  758. package/src/renderers/electrobun/bun/index.ts +11 -1
  759. package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
  760. package/src/renderers/electrobun/bun/window/create.ts +4 -1
  761. package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
  762. package/src/renderers/electrobun/shared/protocol.ts +6 -1
  763. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
  764. package/src/renderers/electrobun/view/config-host.ts +3 -0
  765. package/src/renderers/electrobun/view/fatal-screen.tsx +1 -1
  766. package/src/renderers/electrobun/view/main.tsx +30 -4
  767. package/src/renderers/electrobun/view/news-source.ts +5 -5
  768. package/src/renderers/electrobun/view/remote/asset-data-client.ts +1 -1
  769. package/src/renderers/electrobun/view/ui-host.tsx +1 -1
  770. package/src/renderers/opentui/browser-open.ts +88 -0
  771. package/src/renderers/opentui/host.tsx +5 -14
  772. package/src/renderers/opentui/image/loader.ts +3 -2
  773. package/src/renderers/opentui/native-smoke.ts +10 -1
  774. package/src/renderers/opentui/pane-image/index.ts +2 -1
  775. package/src/renderers/opentui/render-lib.ts +253 -0
  776. package/src/renderers/opentui/render-timing-smoke.ts +1 -1
  777. package/src/renderers/opentui/start.tsx +1 -1
  778. package/src/renderers/share/layout-view.tsx +2 -2
  779. package/src/renderers/share/main.tsx +4 -4
  780. package/src/renderers/share/view.tsx +1 -1
  781. package/src/series/resolve.ts +22 -6
  782. package/src/series/standalone.ts +30 -2
  783. package/src/series/types.ts +8 -1
  784. package/src/shares/api.ts +4 -1
  785. package/src/shares/pane.ts +1 -1
  786. package/src/sources/gloomberb-cloud/fred-series.ts +46 -1
  787. package/src/sources/gloomberb-cloud/index.ts +32 -16
  788. package/src/sources/gloomberb-cloud/news.ts +39 -0
  789. package/src/sources/gloomberb-cloud/normalizers.ts +14 -1
  790. package/src/sources/gloomberb-cloud/perpetuals.ts +49 -1
  791. package/src/sources/listing-symbols.ts +37 -0
  792. package/src/sources/provider-errors.ts +16 -2
  793. package/src/sources/provider-router/financial-routes.ts +21 -3
  794. package/src/sources/provider-router/financials.ts +15 -2
  795. package/src/sources/provider-router/history.ts +30 -8
  796. package/src/sources/provider-router/primary.ts +1 -1
  797. package/src/state/app/bootstrap.ts +23 -0
  798. package/src/state/hooks/inline-tickers.ts +30 -5
  799. package/src/sync/controller.ts +1 -1
  800. package/src/sync/core-contributors.ts +46 -14
  801. package/src/team/collections-sync.ts +2 -1
  802. package/src/team/collections.ts +178 -17
  803. package/src/telemetry/crash-reports.ts +17 -4
  804. package/src/test-support/builtin-panes.ts +1 -1
  805. package/src/theme/colors.ts +3 -30
  806. package/src/theme/ui-tokens.ts +37 -1
  807. package/src/tickers/company-name-listing.ts +210 -33
  808. package/src/tickers/index-roots.ts +47 -0
  809. package/src/tickers/instrument-label.ts +5 -1
  810. package/src/tickers/metadata.ts +10 -0
  811. package/src/tickers/perpetual-listing.ts +5 -2
  812. package/src/tickers/search/home-listing.ts +75 -0
  813. package/src/tickers/search/index.ts +76 -27
  814. package/src/tickers/search/ranking.ts +54 -4
  815. package/src/tickers/search/upsert.ts +29 -0
  816. package/src/tickers/terminal-codes.ts +416 -40
  817. package/src/time-series/bar-aggregation.ts +243 -0
  818. package/src/time-series/base-series.ts +307 -0
  819. package/src/time-series/chart-bounds.ts +349 -0
  820. package/src/time-series/chart-seed.ts +142 -0
  821. package/src/time-series/economic.ts +5 -0
  822. package/src/time-series/fundamentals.ts +18 -3
  823. package/src/time-series/history-acquisition.ts +499 -0
  824. package/src/time-series/leverage.ts +100 -0
  825. package/src/time-series/market-resolution.ts +4 -2
  826. package/src/time-series/market.ts +2 -1
  827. package/src/time-series/price-comparison.ts +175 -30
  828. package/src/time-series/range.ts +9 -1
  829. package/src/time-series/resolution.ts +174 -16
  830. package/src/time-series/resolve-context.ts +157 -0
  831. package/src/time-series/resolve.ts +126 -1577
  832. package/src/time-series/series-name.ts +38 -0
  833. package/src/time-series/series-presentation.ts +208 -0
  834. package/src/time-series/spec.ts +11 -6
  835. package/src/time-series/studies.ts +109 -12
  836. package/src/time-series/tail-reconcile.ts +121 -0
  837. package/src/time-series/types.ts +29 -2
  838. package/src/time-series/use-chart-resolution.ts +4 -5
  839. package/src/types/broker.ts +10 -0
  840. package/src/types/config.ts +14 -0
  841. package/src/types/data-provider.ts +14 -0
  842. package/src/types/exchange-rate.ts +6 -0
  843. package/src/types/financials.ts +104 -7
  844. package/src/types/headless.ts +76 -6
  845. package/src/types/instrument.ts +3 -0
  846. package/src/types/plugin.ts +65 -8
  847. package/src/types/price-history.ts +2 -0
  848. package/src/types/ticker.ts +13 -0
  849. package/src/types/trading.ts +59 -1
  850. package/src/ui/ascii-font.ts +13 -1
  851. package/src/ui/host.tsx +6 -1
  852. package/src/updater/command-names.ts +175 -0
  853. package/src/updater/index.ts +10 -5
  854. package/src/utils/calendar-date.ts +32 -15
  855. package/src/utils/cash-runway.ts +241 -0
  856. package/src/utils/central-banks.ts +42 -0
  857. package/src/utils/cli-output.ts +259 -80
  858. package/src/utils/contract-month.ts +16 -0
  859. package/src/utils/crypto-pair.ts +61 -3
  860. package/src/utils/currency-units.ts +29 -0
  861. package/src/utils/datetime-format.ts +10 -0
  862. package/src/utils/debug-log.ts +1 -1
  863. package/src/utils/decimal-comma.ts +39 -6
  864. package/src/utils/exchange-announcements.ts +71 -0
  865. package/src/utils/exchange-rate-snapshot.ts +10 -0
  866. package/src/utils/financial-statements.ts +83 -4
  867. package/src/utils/format.ts +34 -16
  868. package/src/utils/fundamentals.ts +150 -34
  869. package/src/utils/fx-market-hours.ts +10 -1
  870. package/src/utils/latest-financial-period.ts +8 -0
  871. package/src/utils/linux-libc.ts +54 -0
  872. package/src/utils/market-capitalization.ts +111 -15
  873. package/src/utils/max-drawdown.ts +64 -0
  874. package/src/utils/network-failure.ts +83 -0
  875. package/src/utils/option-expiry.ts +139 -7
  876. package/src/utils/price-earnings.ts +11 -5
  877. package/src/utils/price-history.ts +18 -8
  878. package/src/utils/price-window.ts +131 -0
  879. package/src/utils/release-date.ts +47 -0
  880. package/src/utils/sec.ts +3 -0
  881. package/src/utils/throttled-fetch.ts +11 -4
  882. package/src/utils/trailing-eps.ts +67 -0
  883. package/src/utils/typed-text.ts +21 -0
  884. package/src/utils/utc-time.ts +24 -1
  885. package/src/version.ts +6 -0
  886. package/src/cli/pane-functions/screenshot.ts +0 -2122
@@ -25,13 +25,17 @@ import { useQuoteBoard } from "../shared/use-quote-board";
25
25
  import { cachedMnaDeal, loadMnaDeal } from "./client";
26
26
  import {
27
27
  dealSpread,
28
+ electionLeg,
28
29
  formatDealValue,
29
30
  formatExpectedClose,
30
31
  formatListDate,
31
32
  formatPercentShort,
32
33
  formatPerShare,
33
34
  formatPrice,
35
+ inQuoteCurrency,
36
+ isElection,
34
37
  MISSING,
38
+ offerSeries,
35
39
  stageLabel,
36
40
  termsLabel,
37
41
  } from "./model";
@@ -70,11 +74,15 @@ async function dailyCloses(provider: AssetDataProvider, symbol: string, from: st
70
74
  return points.filter((point) => Number.isFinite(point.close) && dayOf(point) >= from);
71
75
  }
72
76
 
73
- /** The target's daily closes since before the announcement, and the listing a ratio pays in. */
74
- function useDealHistory(deal: MnaDeal | null) {
77
+ /**
78
+ * The target's daily closes since before the announcement, and the listing a
79
+ * ratio pays in when the offer line needs it (an election priced at its cash
80
+ * leg does not).
81
+ */
82
+ function useDealHistory(deal: MnaDeal | null, leg: "cash" | "stock" | null) {
75
83
  const provider = useAssetData();
76
84
  const target = deal?.target.symbol ?? null;
77
- const ratio = deal?.terms.exchangeRatio != null ? deal.terms.ratioSymbol : null;
85
+ const ratio = deal?.terms.exchangeRatio != null && leg !== "cash" ? deal.terms.ratioSymbol : null;
78
86
  const from = deal ? shiftDay(deal.announced, -LEAD_DAYS) : null;
79
87
  const [history, setHistory] = useState<{ key: string; target: PricePoint[]; ratio: PricePoint[] } | null>(null);
80
88
  const key = `${target}:${ratio}:${from}`;
@@ -94,30 +102,6 @@ function useDealHistory(deal: MnaDeal | null) {
94
102
  return history?.key === key ? history : null;
95
103
  }
96
104
 
97
- /**
98
- * What the terms were worth each day since the announcement: flat for cash,
99
- * the ratio times the paying listing's close for stock.
100
- */
101
- function offerSeries(deal: MnaDeal, ratioCloses: readonly PricePoint[], days: readonly string[]): Array<{ day: string; value: number }> {
102
- const { cashPerShare, exchangeRatio, currency } = deal.terms;
103
- if (cashPerShare == null && exchangeRatio == null) return [];
104
- const pence = currency === "GBp" || currency === "GBX";
105
- const cash = cashPerShare == null ? 0 : pence ? cashPerShare / 100 : cashPerShare;
106
- const ratioByDay = new Map(ratioCloses.map((point) => [dayOf(point), point.close]));
107
- const out: Array<{ day: string; value: number }> = [];
108
- let lastRatio: number | null = null;
109
- for (const day of days) {
110
- if (day < deal.announced) continue;
111
- if (exchangeRatio == null) {
112
- out.push({ day, value: cash });
113
- continue;
114
- }
115
- lastRatio = ratioByDay.get(day) ?? lastRatio;
116
- if (lastRatio != null) out.push({ day, value: cash + exchangeRatio * lastRatio });
117
- }
118
- return out;
119
- }
120
-
121
105
  export function MnaDealDetail({ id, seed, focused, width, height }: {
122
106
  id: string;
123
107
  /** The list's copy, drawn while the full deal loads. */
@@ -151,7 +135,9 @@ export function MnaDealDetail({ id, seed, focused, width, height }: {
151
135
  const targetQuote = deal?.target.symbol ? quotes.get(deal.target.symbol)?.quote ?? null : null;
152
136
  const ratioQuote = deal?.terms.ratioSymbol ? quotes.get(deal.terms.ratioSymbol)?.quote ?? null : null;
153
137
  const spread = deal ? dealSpread(deal, targetQuote, ratioQuote) : null;
154
- const history = useDealHistory(deal);
138
+ // The leg an election's Offer, premium and offer line are priced at; null for other terms.
139
+ const leg = deal && isElection(deal.terms) ? electionLeg(deal.terms, targetQuote) : null;
140
+ const history = useDealHistory(deal, leg);
155
141
 
156
142
  const unaffected = useMemo(() => {
157
143
  if (!deal || !history) return null;
@@ -175,7 +161,7 @@ export function MnaDealDetail({ id, seed, focused, width, height }: {
175
161
  tone: spread.spread < 0 ? "warning" : undefined,
176
162
  });
177
163
  if (spread.annualized != null) items.push({ id: "ann", label: "Ann.", value: formatPercentShort(spread.annualized) });
178
- if (unaffected && unaffected.close > 0 && deal.terms.exchangeRatio == null) {
164
+ if (unaffected && unaffected.close > 0 && (deal.terms.exchangeRatio == null || leg === "cash")) {
179
165
  items.push({
180
166
  id: "premium",
181
167
  label: "Premium",
@@ -199,12 +185,14 @@ export function MnaDealDetail({ id, seed, focused, width, height }: {
199
185
  if (spread) items.push({ id: "stage", label: "Stage", value: stageLabel(deal) });
200
186
  }
201
187
  return items;
202
- }, [deal, spread, targetQuote?.currency, unaffected]);
188
+ }, [deal, leg, spread, targetQuote?.currency, unaffected]);
203
189
 
204
190
  const series = useMemo(() => {
205
191
  if (!deal?.target.symbol || !history || history.target.length < 3) return [];
206
192
  const days = history.target.map(dayOf);
207
- const offer = offerSeries(deal, history.ratio, days);
193
+ const offer = leg === "stock"
194
+ ? offerSeries(deal, history.ratio, days, leg, (close) => inQuoteCurrency(close, ratioQuote?.currency ?? null, targetQuote?.currency))
195
+ : offerSeries(deal, history.ratio, days, leg);
208
196
  const priced = [
209
197
  staticSeries(
210
198
  history.target.map((point) => ({ date: point.date, observedAt: point.date, value: point.close })),
@@ -221,7 +209,7 @@ export function MnaDealDetail({ id, seed, focused, width, height }: {
221
209
  ));
222
210
  }
223
211
  return priced;
224
- }, [colors.positive, colors.text, deal, history]);
212
+ }, [colors.positive, colors.text, deal, history, leg, ratioQuote?.currency, targetQuote?.currency]);
225
213
 
226
214
  const selected = events.find((event) => event.id === selectedEvent) ?? events[0] ?? null;
227
215
  const openSource = useCallback((event: MnaDealEvent | null) => {
@@ -8,7 +8,8 @@ import type {
8
8
  } from "../../../../api-client/distress";
9
9
  import { BulletList, ExternalLinkText, Prose, READING_WIDTH } from "../../../../components";
10
10
  import { useThemeColors } from "../../../../theme/theme-context";
11
- import { Box, Text } from "../../../../ui";
11
+ import { Box, Text, useUiCapabilities } from "../../../../ui";
12
+ import { CountryFlagLead } from "../../../../components/ui/country-flag";
12
13
  import { truncateToDisplayWidth } from "../../../../utils/format";
13
14
  import {
14
15
  assessmentHorizonLabel,
@@ -42,16 +43,27 @@ const LABEL_WIDTH = 16;
42
43
  * source publishes under beside its rows.
43
44
  */
44
45
 
45
- function Field({ label, value, width, bright = false }: { label: string; value: string; width: number; bright?: boolean }) {
46
+ function Field({ label, value, width, bright = false, country }: {
47
+ label: string;
48
+ value: string;
49
+ width: number;
50
+ bright?: boolean;
51
+ /** The country the value names: the desktop and the web lead it with its flag. */
52
+ country?: string;
53
+ }) {
46
54
  const colors = useThemeColors();
55
+ const desktop = useUiCapabilities().nativePaneChrome === true;
47
56
  const valueWidth = Math.max(8, width - LABEL_WIDTH);
57
+ const prose = <Prose text={value || MISSING} width={valueWidth} color={bright ? colors.textBright : colors.text} figures={false} />;
48
58
  return (
49
59
  <Box flexDirection="row" width={width} flexShrink={0}>
50
60
  <Box width={LABEL_WIDTH} flexShrink={0} overflow="hidden">
51
61
  <Text fg={colors.textDim}>{label}</Text>
52
62
  </Box>
53
63
  <Box flexDirection="column" width={valueWidth} flexShrink={0}>
54
- <Prose text={value || MISSING} width={valueWidth} color={bright ? colors.textBright : colors.text} figures={false} />
64
+ {desktop && country
65
+ ? <Box flexDirection="row" alignItems="center"><CountryFlagLead value={country} /><Box flexDirection="column">{prose}</Box></Box>
66
+ : prose}
55
67
  </Box>
56
68
  </Box>
57
69
  );
@@ -227,7 +239,7 @@ export function InsolvencyDetail({ row, width, attributions }: { row: Insolvency
227
239
  <Field label="Published" value={isoDay(row.published_date)} width={bodyWidth} />
228
240
  {row.court.trim() ? <Field label="Court" value={cellText(row.court)} width={bodyWidth} /> : null}
229
241
  <Field label={registryLabel(row.country)} value={row.registry_id} width={bodyWidth} />
230
- <Field label="Country" value={france ? "France" : row.country === "GB" ? "United Kingdom" : row.country} width={bodyWidth} />
242
+ <Field label="Country" value={france ? "France" : row.country === "GB" ? "United Kingdom" : row.country} country={row.country} width={bodyWidth} />
231
243
  {/* A correction says which notice it corrects; an initial notice needs no line. */}
232
244
  {row.notice_type !== "annonce" ? (
233
245
  <Field
@@ -462,11 +462,12 @@ export function designationColumns(width: number): Column[] {
462
462
  ], ["exchange", "code"], width);
463
463
  }
464
464
 
465
- export function insolvencyColumns(width: number): Column[] {
465
+ /** `flagRoom` widens the country column for the flag the desktop draws before its code. */
466
+ export function insolvencyColumns(width: number, flagRoom = 0): Column[] {
466
467
  return fit([
467
468
  { id: "published", label: "Published", width: 10, align: "left" },
468
469
  { id: "company", label: "Company", width: 22, align: "left", flexGrow: 1 },
469
- { id: "country", label: "Ctry", width: 4, align: "left" },
470
+ { id: "country", label: "Ctry", width: 4 + flagRoom, align: "left" },
470
471
  { id: "registry", label: "Registry no.", width: 12, align: "left" },
471
472
  { id: "procedure", label: "Procedure", width: 22, align: "left" },
472
473
  { id: "notice", label: "Notice", width: 26, align: "left", flexGrow: 1 },
@@ -29,7 +29,8 @@ import type {
29
29
  import type { CloudFilingEventPayload } from "../../../../api-client";
30
30
  import { useAutoRefresh, usePluginPaneState } from "../../../../public/react";
31
31
  import { useThemeColors } from "../../../../theme/theme-context";
32
- import { Box, type ScrollBoxRenderable } from "../../../../ui";
32
+ import { Box, useUiCapabilities, type ScrollBoxRenderable } from "../../../../ui";
33
+ import { COUNTRY_FLAG_CELLS, withCountryFlag } from "../../../../components/ui/country-flag";
33
34
  import { usePluginTickerActions } from "../../../runtime";
34
35
  import { toneColor, type StateTone } from "../../shared/research-cells";
35
36
  import {
@@ -419,6 +420,8 @@ function InsolvencyList({ country, kind, namePrefix: prefix, search, searching,
419
420
  const rows = loaded.payload.notices;
420
421
  return { rows, hasMore: canPage(loaded.payload.hasMore, offset + rows.length), nextOffset: offset + rows.length, loaded, attributions: loaded.payload.attributions };
421
422
  }, [country, kind, prefix]);
423
+ // The desktop and the web lead each country code with its flag.
424
+ const flagged = useUiCapabilities().nativePaneChrome === true;
422
425
  const spec = useMemo<RowSpec<InsolvencyNotice>>(() => ({
423
426
  getId: insolvencyId,
424
427
  title: (row) => cellText(row.entity_name),
@@ -429,7 +432,7 @@ function InsolvencyList({ country, kind, namePrefix: prefix, search, searching,
429
432
  switch (column) {
430
433
  case "published": return { text: isoDay(row.published_date), color: muted };
431
434
  case "company": return { text: cellText(row.entity_name), color: base };
432
- case "country": return { text: row.country, color: muted };
435
+ case "country": return withCountryFlag({ text: row.country, color: muted }, row.country, flagged);
433
436
  case "registry": return { text: row.registry_id, color: muted };
434
437
  case "procedure": return { text: insolvencyProcedureCell(row), color: tone(insolvencyTone(row)) };
435
438
  case "notice": return { text: insolvencyNoticeLabel(row, "short"), color: muted };
@@ -437,7 +440,7 @@ function InsolvencyList({ country, kind, namePrefix: prefix, search, searching,
437
440
  }
438
441
  },
439
442
  detail: (row, width, attributions) => <InsolvencyDetail row={row} width={width} attributions={attributions} />,
440
- }), []);
443
+ }), [flagged]);
441
444
  const hints = useMemo<PaneHint[]>(() => [{ id: "distress-search", key: "/", label: "search", onPress: onSearch }], [onSearch]);
442
445
  return (
443
446
  <DistressTable
@@ -445,7 +448,7 @@ function InsolvencyList({ country, kind, namePrefix: prefix, search, searching,
445
448
  viewId="insolvency"
446
449
  loader={loader}
447
450
  spec={spec}
448
- columns={insolvencyColumns(props.width)}
451
+ columns={insolvencyColumns(props.width, flagged ? COUNTRY_FLAG_CELLS : 0)}
449
452
  subject="insolvency notices"
450
453
  search={search}
451
454
  searching={searching}
@@ -1,9 +1,7 @@
1
1
  import type { MnaDealsParams, MnaRegionFilter, MnaStatusFilter, MnaTargetFilter } from "../../../api-client/mna";
2
2
  import type { HeadlessPaneColumn, HeadlessPaneDefinition } from "../../../types/plugin";
3
3
  import { fetchMnaDeals } from "./client";
4
- import { formatDealValue, formatExpectedClose, stageLabel, termsLabel } from "./model";
5
- import { listingAbroadVenue } from "../../../utils/sec";
6
- import { shortCompanyName } from "../../../tickers/company-name";
4
+ import { dealsSymbol, formatDealValue, formatExpectedClose, stageLabel, termsLabel } from "./model";
7
5
  import { REPORT_ROWS } from "../shared/headless-options";
8
6
 
9
7
  const text = (value: unknown) => (typeof value === "string" ? value : "");
@@ -58,19 +56,14 @@ export const mnaHeadless: HeadlessPaneDefinition<"rows"> = {
58
56
  },
59
57
  async load(args, ctx) {
60
58
  const symbol = args.symbols[0];
61
- // Deals carry US tickers, where SAN is not SAN:EPA's company: a listing abroad is looked up by its company's name.
62
- const company = symbol && listingAbroadVenue(symbol)
63
- ? await ctx.marketData.getQuote(symbol, "").then((quote) => quote.name?.trim() || null, () => null)
64
- : null;
65
- if (symbol && listingAbroadVenue(symbol) && !company) {
66
- throw new Error(`Deals are filed by US ticker or company name, and ${symbol} has no company name to look them up by.`);
67
- }
59
+ // A listing abroad (ATH:TSX) asks by the quote symbol its deals are filed under (ATH.TO), as the pane does.
60
+ const filed = symbol ? dealsSymbol(symbol) : "";
68
61
  const params: MnaDealsParams = {
69
62
  status: ((args.options.status as MnaStatusFilter | undefined) ?? (symbol ? "all" : "pending")),
70
63
  target: symbol ? undefined : (args.options.target as MnaTargetFilter | undefined),
71
64
  region: symbol ? undefined : (args.options.region as MnaRegionFilter | undefined),
72
- symbol: company ? undefined : symbol,
73
- query: text(args.options.query) || (company ? shortCompanyName(company) : undefined),
65
+ symbol: filed || undefined,
66
+ query: text(args.options.query) || undefined,
74
67
  limit: Number(args.options.limit ?? 50),
75
68
  };
76
69
  const payload = await fetchMnaDeals(params, ctx.apiClient);
@@ -90,6 +83,7 @@ export const mnaHeadless: HeadlessPaneDefinition<"rows"> = {
90
83
  cashPerShare: deal.terms.cashPerShare,
91
84
  exchangeRatio: deal.terms.exchangeRatio,
92
85
  ratioSymbol: deal.terms.ratioSymbol,
86
+ election: deal.terms.election === true,
93
87
  currency: deal.terms.currency,
94
88
  value: formatDealValue(deal.value, deal.valueCurrency),
95
89
  valueUsd: deal.valueUsd,
@@ -100,7 +94,6 @@ export const mnaHeadless: HeadlessPaneDefinition<"rows"> = {
100
94
  errors: payload.lockedDeals > 0 ? [`${payload.lockedDeals} deals from the last ${payload.delayDays} days need Gloom Pro`] : [],
101
95
  metadata: {
102
96
  asOf: payload.asOf, access: payload.access, delayDays: payload.delayDays, hasMore: payload.hasMore,
103
- ...(company ? { notices: [`Deals are filed by US ticker, so ${symbol}'s are the ones naming ${shortCompanyName(company)}.`] } : {}),
104
97
  },
105
98
  };
106
99
  },
@@ -1,6 +1,9 @@
1
1
  import type { MnaDeal, MnaStatus, MnaTerms } from "../../../api-client/mna";
2
2
  import type { Quote } from "../../../types/financials";
3
+ import { getListingSymbol } from "../../../sources/listing-symbols";
4
+ import { parsePublicTickerKey } from "../../../utils/exchanges";
3
5
  import { formatCompact } from "../../../utils/format";
6
+ import { nonUsSecListingVenue } from "../../../utils/sec";
4
7
 
5
8
  export const MNA_PANE_ID = "mna";
6
9
  export const MISSING = "--";
@@ -33,6 +36,28 @@ function ratioLabel(ratio: number, symbol: string | null): string {
33
36
  return symbol ? `${shares} ${symbol}` : `${shares} sh`;
34
37
  }
35
38
 
39
+ /**
40
+ * The symbol a company's deals are filed under, from the ticker a pane is
41
+ * linked to. A deal carries its companies' quote symbols: plain for a US
42
+ * listing, suffixed by the venue elsewhere (ATH.TO, SHEL.L, 9984.T). A
43
+ * listing abroad therefore asks by that quote symbol: its bare symbol is
44
+ * another company's US ticker (ATH is Athene in New York, Athabasca in
45
+ * Toronto). A US listing, a symbol with no venue and a symbol already
46
+ * suffixed go as they are, so a US ticker is asked for exactly as before.
47
+ * `savedExchange` is the venue the saved ticker names, for a key with none.
48
+ */
49
+ export function dealsSymbol(key: string | null | undefined, savedExchange = ""): string {
50
+ const value = key?.trim();
51
+ if (!value) return "";
52
+ if (nonUsSecListingVenue(value, savedExchange)) return getListingSymbol(value, savedExchange).toUpperCase();
53
+ return parsePublicTickerKey(value).symbol;
54
+ }
55
+
56
+ /** Each holder gets the cash or the shares, not both. Older servers never say so. */
57
+ export function isElection(terms: MnaTerms): boolean {
58
+ return terms.election === true && terms.cashPerShare != null && terms.exchangeRatio != null;
59
+ }
60
+
36
61
  /** What one target share gets, in as few characters as the terms allow. */
37
62
  export function termsLabel(terms: MnaTerms): string {
38
63
  const parts: string[] = [];
@@ -48,7 +73,7 @@ export function termsLabel(terms: MnaTerms): string {
48
73
  : terms.consideration === "mixed" ? "Cash and stock"
49
74
  : MISSING);
50
75
  }
51
- let label = parts.join(" + ");
76
+ let label = parts.join(isElection(terms) ? " or " : " + ");
52
77
  if (terms.cvr) label += " + CVR";
53
78
  if (terms.partial) label += ", partial";
54
79
  return label;
@@ -75,7 +100,7 @@ const PENCE = new Set(["GBp", "GBX"]);
75
100
  * London quotes arrive in pounds while UK offers are often in pence, so the
76
101
  * two compare after scaling; any other currency mismatch has no price.
77
102
  */
78
- function inQuoteCurrency(amount: number, from: string | null, quoteCurrency: string | undefined): number | null {
103
+ export function inQuoteCurrency(amount: number, from: string | null, quoteCurrency: string | undefined): number | null {
79
104
  const offer = from ?? "USD";
80
105
  const quote = quoteCurrency ?? "USD";
81
106
  if (offer === quote) return amount;
@@ -85,28 +110,81 @@ function inQuoteCurrency(amount: number, from: string | null, quoteCurrency: str
85
110
  return offer.toUpperCase() === quote.toUpperCase() ? amount : null;
86
111
  }
87
112
 
113
+ function cashLeg(terms: MnaTerms, targetQuote: Quote | null): number | null {
114
+ return terms.cashPerShare == null ? null : inQuoteCurrency(terms.cashPerShare, terms.currency, targetQuote?.currency);
115
+ }
116
+
117
+ function stockLeg(terms: MnaTerms, targetQuote: Quote | null, ratioQuote: Quote | null): number | null {
118
+ const price = ratioQuote?.price;
119
+ if (terms.exchangeRatio == null || !terms.ratioSymbol || price == null || !Number.isFinite(price) || price <= 0) return null;
120
+ const leg = inQuoteCurrency(price, ratioQuote?.currency ?? null, targetQuote?.currency);
121
+ return leg == null ? null : terms.exchangeRatio * leg;
122
+ }
123
+
124
+ /**
125
+ * The leg an election is priced at. It pays each holder the cash or the
126
+ * shares, never both, so it is priced at its cash leg: the legs are set about
127
+ * equal at signing, proration means a holder cannot count on getting the
128
+ * stock, and the cash does not move. The stock leg stands in only when the
129
+ * cash cannot be compared with the target's quote. Without a quote, the cash.
130
+ */
131
+ export function electionLeg(terms: MnaTerms, targetQuote: Quote | null): "cash" | "stock" {
132
+ return !targetQuote || cashLeg(terms, targetQuote) != null ? "cash" : "stock";
133
+ }
134
+
88
135
  /**
89
136
  * What the terms pay per target share at the latest prices, in the target
90
137
  * quote's currency. Null when a leg cannot be priced: no terms, a ratio
91
- * without its listing, or cash in another currency.
138
+ * without its listing, or cash in another currency. An election is one leg,
139
+ * the one {@link electionLeg} picks.
92
140
  */
93
141
  function offerValue(deal: MnaDeal, targetQuote: Quote | null, ratioQuote: Quote | null): number | null {
94
142
  const { terms } = deal;
95
143
  if (terms.cashPerShare == null && terms.exchangeRatio == null) return null;
96
- let total = 0;
97
- if (terms.cashPerShare != null) {
98
- const cash = inQuoteCurrency(terms.cashPerShare, terms.currency, targetQuote?.currency);
99
- if (cash == null) return null;
100
- total += cash;
144
+ let total: number | null;
145
+ if (isElection(terms)) {
146
+ total = electionLeg(terms, targetQuote) === "cash"
147
+ ? cashLeg(terms, targetQuote)
148
+ : stockLeg(terms, targetQuote, ratioQuote);
149
+ } else {
150
+ const cash = terms.cashPerShare == null ? 0 : cashLeg(terms, targetQuote);
151
+ const stock = terms.exchangeRatio == null ? 0 : stockLeg(terms, targetQuote, ratioQuote);
152
+ total = cash == null || stock == null ? null : cash + stock;
101
153
  }
102
- if (terms.exchangeRatio != null) {
103
- const price = ratioQuote?.price;
104
- if (!terms.ratioSymbol || price == null || !Number.isFinite(price) || price <= 0) return null;
105
- const leg = inQuoteCurrency(price, ratioQuote?.currency ?? null, targetQuote?.currency);
106
- if (leg == null) return null;
107
- total += terms.exchangeRatio * leg;
154
+ return total != null && total > 0 ? total : null;
155
+ }
156
+
157
+ /**
158
+ * What the terms were worth each day since the announcement: flat for cash,
159
+ * the ratio times the paying listing's close for stock. An election draws
160
+ * the one leg its Offer is priced at (`leg`, from {@link electionLeg}), its
161
+ * stock leg in the target quote's currency as the Offer converts it.
162
+ */
163
+ export function offerSeries(
164
+ deal: MnaDeal,
165
+ ratioCloses: readonly { date: Date; close: number }[],
166
+ days: readonly string[],
167
+ leg: "cash" | "stock" | null,
168
+ toQuote: (close: number) => number | null = (close) => close,
169
+ ): Array<{ day: string; value: number }> {
170
+ const { cashPerShare, exchangeRatio, currency } = deal.terms;
171
+ if (cashPerShare == null && exchangeRatio == null) return [];
172
+ const pence = currency === "GBp" || currency === "GBX";
173
+ const cash = cashPerShare == null || leg === "stock" ? 0 : pence ? cashPerShare / 100 : cashPerShare;
174
+ const ratioByDay = new Map(ratioCloses.map((point) => [point.date.toISOString().slice(0, 10), point.close]));
175
+ const out: Array<{ day: string; value: number }> = [];
176
+ let lastRatio: number | null = null;
177
+ for (const day of days) {
178
+ if (day < deal.announced) continue;
179
+ if (exchangeRatio == null || leg === "cash") {
180
+ out.push({ day, value: cash });
181
+ continue;
182
+ }
183
+ const close = ratioByDay.get(day);
184
+ lastRatio = close == null ? lastRatio : toQuote(close) ?? lastRatio;
185
+ if (lastRatio != null) out.push({ day, value: cash + exchangeRatio * lastRatio });
108
186
  }
109
- return total > 0 ? total : null;
187
+ return out;
110
188
  }
111
189
 
112
190
  export interface DealSpread {
@@ -26,7 +26,6 @@ import { usePlanAccess } from "../../../api-client/plan-access";
26
26
  import { useAsyncResource, useAutoRefresh, usePaneSettingValue, usePluginPaneState, useShortcut } from "../../../public/react";
27
27
  import { usePaneInstance } from "../../../state/app/context";
28
28
  import { usePaneTickerIdentity } from "../../../state/hooks/pane-ticker";
29
- import { listingIdentity } from "../shared/ticker-request";
30
29
  import { blendHex } from "../../../theme/colors";
31
30
  import { useThemeColors } from "../../../theme/theme-context";
32
31
  import type { PaneProps, TickerResearchTabProps } from "../../../types/plugin";
@@ -42,6 +41,7 @@ import { MnaDealDetail, mnaDealTitle } from "./detail";
42
41
  import { DistressBoard } from "./distress/pane";
43
42
  import {
44
43
  dealSpread,
44
+ dealsSymbol,
45
45
  expectedCloseDate,
46
46
  formatDealValue,
47
47
  formatExpectedClose,
@@ -133,10 +133,11 @@ const MNA_TABS: { label: string; value: MnaTab }[] = [
133
133
 
134
134
  /** `MA`, or `MA ACVA`. A link supplies the ticker; an older pane still has it in settings. */
135
135
  export function MnaPane(props: PaneProps) {
136
- const { symbol: bound } = usePaneTickerIdentity();
136
+ const { symbol: bound, ticker: boundTicker } = usePaneTickerIdentity();
137
137
  const [ticker] = usePaneSettingValue("ticker", "");
138
138
  const fromSettings = typeof ticker === "string" ? ticker.trim().toUpperCase() : "";
139
- const symbol = listingIdentity(bound)?.symbol || fromSettings;
139
+ // Deals are filed under a listing's quote symbol (ATH.TO), not its bare symbol (ATH:TSX is not ATH).
140
+ const symbol = dealsSymbol(bound, boundTicker?.metadata.exchange) || fromSettings;
140
141
  // One company's deals have no market-wide distress tab beside them.
141
142
  if (symbol) return <MnaDealsView key={symbol} focused={props.focused} width={props.width} height={props.height} symbol={symbol} />;
142
143
  return <MnaBoard focused={props.focused} width={props.width} height={props.height} />;
@@ -172,7 +173,7 @@ function MnaBoard({ focused, width, height }: { focused: boolean; width: number;
172
173
 
173
174
  export function MnaTickerTab({ focused, width, height }: TickerResearchTabProps) {
174
175
  const { ticker } = usePaneTickerIdentity();
175
- const symbol = ticker?.metadata.ticker;
176
+ const symbol = dealsSymbol(ticker?.metadata.ticker, ticker?.metadata.exchange);
176
177
  if (!symbol) return <EmptyState title="Select a ticker." />;
177
178
  return <MnaDealsView key={symbol} focused={focused} width={width} height={height} symbol={symbol} />;
178
179
  }
@@ -1,4 +1,3 @@
1
- import type { CloudNewsListResponse } from "../../../api-client";
2
1
  import type {
3
2
  HeadlessPaneContext,
4
3
  HeadlessPaneDefinition,
@@ -7,8 +6,10 @@ import type {
7
6
  } from "../../../types/plugin";
8
7
  import type { NewsArticle, NewsQuery } from "../../../news/types";
9
8
  import {
10
- cloudNewsParams,
9
+ coinNewsFallbackNotice,
11
10
  mapCloudNewsArticle,
11
+ readCloudNews,
12
+ type CloudNewsRead,
12
13
  } from "../../../sources/gloomberb-cloud/news";
13
14
  import { parsePublicTickerKey } from "../../../utils/exchanges";
14
15
  import { formatUtcSeconds } from "../../../utils/utc-time";
@@ -29,14 +30,14 @@ export interface NewsHeadlessDependencies {
29
30
  loadNews(
30
31
  query: NewsQuery,
31
32
  context: HeadlessPaneContext,
32
- ): Promise<CloudNewsListResponse>;
33
+ ): Promise<CloudNewsRead>;
33
34
  now(): Date;
34
35
  /** Whether the session has real-time news; without it the stories are held back. */
35
36
  realtimeAccess?(): Promise<boolean | null>;
36
37
  }
37
38
 
38
39
  const defaultDependencies: NewsHeadlessDependencies = {
39
- loadNews: (query, context) => context.apiClient.getCloudNews(cloudNewsParams(query)),
40
+ loadNews: (query, context) => readCloudNews(context.apiClient, query),
40
41
  now: () => new Date(),
41
42
  realtimeAccess: cloudRealtimeAccess,
42
43
  };
@@ -71,7 +72,7 @@ function selectedSentiment(args: HeadlessPaneLoadArgs): string {
71
72
  }
72
73
 
73
74
  function projectNewsHeadless(
74
- response: CloudNewsListResponse,
75
+ response: CloudNewsRead,
75
76
  args: HeadlessPaneLoadArgs,
76
77
  now: Date,
77
78
  realtime: boolean | null,
@@ -80,7 +81,7 @@ function projectNewsHeadless(
80
81
  const minImportance = Number(args.options.minImportance ?? 0);
81
82
  const limit = Number(args.options.limit ?? 50);
82
83
  const matching = response.items
83
- .map((item) => mapCloudNewsArticle(item, args.symbols[0]))
84
+ .map((item) => mapCloudNewsArticle(item, response.searchedFor ? undefined : args.symbols[0]))
84
85
  .filter((article) => sentiment === "any" || article.sentiment === sentiment)
85
86
  .filter((article) => article.importance >= minImportance)
86
87
  .sort((left, right) => right.publishedAt.getTime() - left.publishedAt.getTime());
@@ -91,6 +92,10 @@ function projectNewsHeadless(
91
92
  items,
92
93
  // Dated by the newest story, held back for an account without real-time news.
93
94
  freshness: cloudNewsFreshness(realtime),
95
+ // A coin pair no story is filed under shows the stories that mention the coin, and says so.
96
+ ...(response.searchedFor && args.symbols[0]
97
+ ? { notes: [coinNewsFallbackNotice(parsePublicTickerKey(args.symbols[0]).symbol, response.searchedFor)] }
98
+ : {}),
94
99
  metadata: {
95
100
  nextCursor: response.nextCursor,
96
101
  sentiment,
@@ -98,6 +103,7 @@ function projectNewsHeadless(
98
103
  total: matching.length,
99
104
  returned: items.length,
100
105
  truncated: items.length < matching.length || response.nextCursor != null,
106
+ ...(response.searchedFor ? { searchedFor: response.searchedFor } : {}),
101
107
  },
102
108
  };
103
109
  }
@@ -5,7 +5,8 @@ import { useArticleSummary, useResolvedEntryValue } from "../../../market-data/h
5
5
  import { instrumentFromTicker } from "../../../market-data/request-types";
6
6
  import { useCallback } from "react";
7
7
  import { useDebouncedPluginPaneState, usePluginPaneState } from "../../runtime";
8
- import { EmptyState, PaneStatusBody, QueryBar } from "../../../components";
8
+ import { EmptyState, PaneStatusBody, QueryBar, usePaneNoticeFooter } from "../../../components";
9
+ import { coinNewsFallbackNotice } from "../../../sources/gloomberb-cloud/news";
9
10
  import { newsMuteSettingsDef, newsMutesApplyToFeed, useNewsMuteFilter } from "./wire/mutes";
10
11
  import { newsListEmptyCopy } from "./wire/filter-articles";
11
12
  import { NEWS_LIST_SEARCH_PLACEHOLDER, useNewsListSearch, useNewsListSearchHint } from "./wire/news/list-search";
@@ -45,6 +46,7 @@ function TickerNewsView({ width, height, focused }: { width: number; height: num
45
46
  exchange: instrument.exchange,
46
47
  tickerTier: "primary" as const,
47
48
  limit: NEWS_ITEM_LIMIT,
49
+ ...(ticker?.metadata.name ? { listingName: ticker.metadata.name } : {}),
48
50
  } : null;
49
51
  const newsState = useNewsArticles(newsQuery);
50
52
  const loaded = usePersistedNewsArticles(
@@ -91,6 +93,13 @@ function TickerNewsView({ width, height, focused }: { width: number; height: num
91
93
  }, [markArticleRead, popOutArticle, readableArticle]);
92
94
 
93
95
  useNewsListSearchHint("ticker-news", focused && !detailOpen, search.focusSearch);
96
+ // A coin pair no story is filed under lists the stories that mention the coin; the footer says so.
97
+ const searchedFor = loaded[0]?.searchedFor;
98
+ usePaneNoticeFooter({
99
+ registrationId: "ticker-news-notices",
100
+ notices: searchedFor && instrument ? [coinNewsFallbackNotice(instrument.symbol, searchedFor)] : [],
101
+ focused,
102
+ });
94
103
  useNewsArticleFooter({
95
104
  registrationId: "news",
96
105
  focused: listFocused,
@@ -92,6 +92,7 @@ const newsWirePanes: PluginModule["panes"] = [
92
92
  {
93
93
  id: NEWS_STORY_PANE_ID,
94
94
  reportFreshness: NEWS_REPORT_FRESHNESS,
95
+ reportArgument: { kind: "free-text", placeholder: "story id", description: "The id of the story to open." },
95
96
  name: "Story",
96
97
  icon: "A",
97
98
  component: NewsStoryPane,
@@ -147,8 +148,8 @@ const newsWirePaneTemplates: PluginModule["paneTemplates"] = [
147
148
  id: "news-industry-pane",
148
149
  paneId: "news-industry",
149
150
  label: TOPIC_NEWS_TITLE,
150
- description: "Market news by topic code (MNA, CB, ENERGY, REG, CRYPTO, EARN, IPO) or sector, and public fund letters (LTR)",
151
- keywords: ["news", "industry", "sector", "topic", "ni", "mna", "central banks", "crypto", "ipo", "earnings", "regulation", "letters", "ltr", "fund letters", "investor letters"],
151
+ description: "Market news by topic code (MNA, CB, ENERGY, METALS, REG, CRYPTO, EARN, IPO) or sector, and public fund letters (LTR)",
152
+ keywords: ["news", "industry", "sector", "topic", "ni", "mna", "central banks", "metals", "precious metals", "crypto", "ipo", "earnings", "regulation", "letters", "ltr", "fund letters", "investor letters"],
152
153
  shortcut: {
153
154
  prefix: "NI",
154
155
  argPlaceholder: "code",