gloomberb 0.18.2 → 0.18.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (954) hide show
  1. package/README.md +8 -8
  2. package/README.zh-CN.md +11 -11
  3. package/bin/{gloomberb → gloom} +3 -1
  4. package/package.json +6 -2
  5. package/patches/electrobun@1.18.1.patch +106 -5
  6. package/src/account/checkout-handoff.tsx +225 -0
  7. package/src/account/device-signin-dialog.tsx +2 -2
  8. package/src/account/device-signin.ts +2 -2
  9. package/src/account/upgrade-dialog.tsx +1 -1
  10. package/src/api-client/askg.ts +2 -2
  11. package/src/api-client/auth.ts +2 -2
  12. package/src/api-client/central-bank-rates.ts +6 -0
  13. package/src/api-client/collections.ts +5 -1
  14. package/src/api-client/cot.ts +2 -0
  15. package/src/api-client/crypto-etf-flows.ts +37 -0
  16. package/src/api-client/crypto-markets.ts +60 -0
  17. package/src/api-client/data.ts +99 -5
  18. package/src/api-client/doe.ts +15 -0
  19. package/src/api-client/equity-screener.ts +28 -0
  20. package/src/api-client/exchange-announcements.ts +38 -0
  21. package/src/api-client/fund-facts.ts +39 -0
  22. package/src/api-client/futures-curve.ts +9 -1
  23. package/src/api-client/hiring.ts +301 -0
  24. package/src/api-client/index.ts +24 -5
  25. package/src/api-client/market-discovery.ts +14 -0
  26. package/src/api-client/members.ts +6 -0
  27. package/src/api-client/mna.ts +6 -0
  28. package/src/api-client/paths.ts +18 -1
  29. package/src/api-client/request.ts +26 -7
  30. package/src/api-client/short-side-publications.ts +37 -0
  31. package/src/api-client/socket.ts +64 -4
  32. package/src/api-client/swap-curve.ts +35 -0
  33. package/src/api-client/telemetry.ts +17 -0
  34. package/src/api-client/themes.ts +7 -1
  35. package/src/api-client/types.ts +90 -2
  36. package/src/app/global-shortcuts.ts +1 -16
  37. package/src/app/pane-runtime/plugin-bindings.ts +9 -2
  38. package/src/app/runtime/desktop-deeplink.ts +5 -5
  39. package/src/app/runtime/plugin-bindings.ts +2 -2
  40. package/src/app/runtime/startup.ts +13 -0
  41. package/src/app/runtime/update.ts +28 -8
  42. package/src/app/star-prompt/status-line.tsx +2 -2
  43. package/src/architecture/core-builtin-allowlist.json +5 -2
  44. package/src/architecture/pane-tabs-allowlist.json +65 -0
  45. package/src/architecture/ui-literals-allowlist.json +3 -3
  46. package/src/architecture/ui-tokens-allowlist.json +1 -1
  47. package/src/brokers/broker-portfolio-sync.ts +37 -0
  48. package/src/brokers/directory.ts +11 -0
  49. package/src/brokers/logos.ts +3 -1
  50. package/src/brokers/signed-in/adapter.ts +304 -26
  51. package/src/brokers/signed-in/client.ts +14 -2
  52. package/src/brokers/signed-in/connect.ts +10 -2
  53. package/src/brokers/sync-broker-instance.ts +9 -1
  54. package/src/capabilities/chart-series.ts +22 -6
  55. package/src/cli/bank-section.ts +1 -1
  56. package/src/cli/base-converter.ts +23 -14
  57. package/src/cli/central-bank-events.ts +1 -1
  58. package/src/cli/command-options.ts +59 -4
  59. package/src/cli/commands/api.ts +9 -6
  60. package/src/cli/commands/broker.ts +2 -2
  61. package/src/cli/commands/command-utils.ts +2 -2
  62. package/src/cli/commands/crypto-hints.ts +7 -20
  63. package/src/cli/commands/fred-series.ts +4 -2
  64. package/src/cli/commands/keybindings.ts +2 -2
  65. package/src/cli/commands/market.ts +1189 -296
  66. package/src/cli/commands/news-hints.ts +2 -2
  67. package/src/cli/commands/news-search.ts +59 -6
  68. package/src/cli/commands/options-leaps.ts +41 -26
  69. package/src/cli/commands/overview.ts +121 -48
  70. package/src/cli/commands/plugins.ts +9 -9
  71. package/src/cli/commands/remote.ts +13 -10
  72. package/src/cli/commands/search.ts +64 -44
  73. package/src/cli/commands/system.ts +27 -19
  74. package/src/cli/commands/themes.ts +1 -1
  75. package/src/cli/commands/ticker.ts +272 -70
  76. package/src/cli/context.ts +3 -2
  77. package/src/cli/desktop-pane-shot-view.ts +2 -2
  78. package/src/cli/desktop-pane-shot.ts +1 -1
  79. package/src/cli/earnings-calendar.ts +4 -4
  80. package/src/cli/entry.ts +18 -1
  81. package/src/cli/errors.ts +20 -2
  82. package/src/cli/exit-codes.ts +1 -1
  83. package/src/cli/export-source.ts +10 -4
  84. package/src/cli/freshness.ts +2 -8
  85. package/src/cli/fx-forward.ts +130 -0
  86. package/src/cli/fx-pair.ts +10 -9
  87. package/src/cli/glossary.ts +64 -20
  88. package/src/cli/help.ts +20 -14
  89. package/src/cli/history-export.ts +126 -0
  90. package/src/cli/history-rows.ts +196 -43
  91. package/src/cli/index-roots.ts +5 -45
  92. package/src/cli/index.ts +32 -18
  93. package/src/cli/issuer-membership.ts +103 -0
  94. package/src/cli/known-gaps.ts +118 -25
  95. package/src/cli/listing-arg.ts +315 -43
  96. package/src/cli/name-entries.ts +73 -22
  97. package/src/cli/native-smoke.ts +2 -0
  98. package/src/cli/not-a-ticker.ts +19 -9
  99. package/src/cli/opentui-libc.ts +5 -0
  100. package/src/cli/options.ts +12 -0
  101. package/src/cli/pane-functions/capabilities.ts +77 -20
  102. package/src/cli/pane-functions/catalog.ts +40 -23
  103. package/src/cli/pane-functions/discovery.ts +1 -1
  104. package/src/cli/pane-functions/dom.ts +12 -8
  105. package/src/cli/pane-functions/financial-ratio-shot.ts +2 -2
  106. package/src/cli/pane-functions/freshness.ts +174 -23
  107. package/src/cli/pane-functions/function-help.ts +66 -27
  108. package/src/cli/pane-functions/headless.ts +48 -16
  109. package/src/cli/pane-functions/index.ts +82 -21
  110. package/src/cli/pane-functions/options.ts +22 -2
  111. package/src/cli/pane-functions/report-notices.ts +12 -4
  112. package/src/cli/pane-functions/report.ts +5 -5
  113. package/src/cli/pane-functions/resolver.ts +65 -14
  114. package/src/cli/pane-functions/screenshot-assessment.ts +322 -0
  115. package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
  116. package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
  117. package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
  118. package/src/cli/pane-functions/screenshot-evidence.ts +1 -1
  119. package/src/cli/pane-functions/screenshot-payload.ts +453 -0
  120. package/src/cli/pane-functions/screenshot-render.ts +316 -0
  121. package/src/cli/pane-functions/screenshot-types.ts +162 -0
  122. package/src/cli/pane-functions/shot-options.ts +8 -3
  123. package/src/cli/peso-dollar-rates.ts +79 -0
  124. package/src/cli/quote-answer.ts +38 -3
  125. package/src/cli/report-tables.ts +190 -27
  126. package/src/cli/restore-plugins.ts +29 -14
  127. package/src/cli/result.ts +122 -25
  128. package/src/cli/series-search.ts +5 -5
  129. package/src/cli/statement-filings.ts +19 -0
  130. package/src/cli/suffixed-listing-rows.ts +49 -0
  131. package/src/cli/symbol-args.ts +50 -15
  132. package/src/cli/symbol-cells.ts +120 -0
  133. package/src/cli/symbol-list.ts +226 -60
  134. package/src/cli/symbol-rows.ts +131 -25
  135. package/src/cli/ticker-resolution.ts +108 -11
  136. package/src/cli/treasury-yields.ts +5 -5
  137. package/src/cli/types.ts +2 -0
  138. package/src/cli/uncovered-instrument.ts +3 -3
  139. package/src/cli/unknown-command.ts +6 -6
  140. package/src/components/chart/composite/chart-layout.ts +131 -0
  141. package/src/components/chart/composite/composite-chart.tsx +387 -21
  142. package/src/components/chart/composite/drawing-store.ts +26 -6
  143. package/src/components/chart/composite/interactions.ts +9 -3
  144. package/src/components/chart/composite/legend.tsx +75 -3
  145. package/src/components/chart/composite/levels.ts +5 -0
  146. package/src/components/chart/composite/panel-gestures.ts +41 -0
  147. package/src/components/chart/composite/panel-labels.ts +2 -1
  148. package/src/components/chart/composite/panel-surface.tsx +316 -11
  149. package/src/components/chart/composite/price-axis-labels.tsx +27 -3
  150. package/src/components/chart/composite/rasterizer.ts +44 -19
  151. package/src/components/chart/composite/scene.ts +16 -4
  152. package/src/components/chart/composite/text-renderer.ts +48 -21
  153. package/src/components/chart/composite/toolbar.tsx +52 -5
  154. package/src/components/chart/composite/types.ts +19 -0
  155. package/src/components/chart/composite/use-composite-chart-keyboard.ts +120 -13
  156. package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
  157. package/src/components/chart/composite/use-composite-viewport.ts +12 -3
  158. package/src/components/chart/composite/value-scale.ts +149 -0
  159. package/src/components/chart/composite/volume-profile-paint.ts +6 -3
  160. package/src/components/chart/core/pointer.ts +2 -0
  161. package/src/components/chart-table/index.ts +2 -0
  162. package/src/components/chart-table/read.tsx +74 -0
  163. package/src/components/command-bar/commands/collection-list.ts +41 -19
  164. package/src/components/command-bar/commands/collection.ts +9 -3
  165. package/src/components/command-bar/commands/direct/index.ts +1 -1
  166. package/src/components/command-bar/commands/direct/runtime.ts +3 -2
  167. package/src/components/command-bar/pane-templates/items.ts +59 -6
  168. package/src/components/command-bar/pane-templates/workflow.ts +10 -1
  169. package/src/components/command-bar/routes/root/command-items.ts +32 -6
  170. package/src/components/command-bar/routes/root/plugin-install.ts +1 -1
  171. package/src/components/command-bar/routes/root/provider-search.ts +42 -11
  172. package/src/components/command-bar/routes/root/results.ts +18 -4
  173. package/src/components/command-bar/routes/root/runtime.ts +15 -3
  174. package/src/components/command-bar/routes/root/search-providers.ts +25 -2
  175. package/src/components/command-bar/routes/root/selection.ts +6 -1
  176. package/src/components/command-bar/routes/root/shortcut-feedback.ts +4 -1
  177. package/src/components/command-bar/routes/root/shortcuts.ts +30 -3
  178. package/src/components/command-bar/routes/ticker-search/results.ts +73 -4
  179. package/src/components/command-bar/selection-runtime.ts +50 -10
  180. package/src/components/command-bar/surface/index.tsx +24 -2
  181. package/src/components/command-bar/view-model.ts +7 -0
  182. package/src/components/command-bar/workflow/broker.ts +2 -2
  183. package/src/components/command-bar/workflow/collection-actions.ts +46 -7
  184. package/src/components/command-bar/workflow/collection-ticker.ts +32 -4
  185. package/src/components/command-bar/workflow/fields.ts +8 -2
  186. package/src/components/command-bar/workflow/ops.ts +18 -4
  187. package/src/components/command-bar/workflow/portfolio-position.ts +53 -4
  188. package/src/components/command-bar/workflow/submit.ts +3 -2
  189. package/src/components/command-bar/workflow/tickers.ts +5 -1
  190. package/src/components/company-logo.tsx +39 -0
  191. package/src/components/data-table/sections.ts +4 -2
  192. package/src/components/data-table/view.tsx +23 -3
  193. package/src/components/form-modal/confirm.tsx +2 -1
  194. package/src/components/form-modal/request.ts +5 -0
  195. package/src/components/form-modal/routes.ts +4 -1
  196. package/src/components/index.ts +13 -6
  197. package/src/components/layout/detached-pane-shell.tsx +1 -0
  198. package/src/components/layout/floating-pane.tsx +1 -0
  199. package/src/components/layout/header.tsx +234 -60
  200. package/src/components/layout/market-summary.ts +9 -6
  201. package/src/components/layout/pane/capture-status.ts +1 -1
  202. package/src/components/layout/pane/footer/model.ts +11 -5
  203. package/src/components/layout/pane/header.tsx +10 -3
  204. package/src/components/layout/pane/index.tsx +1 -0
  205. package/src/components/layout/pane/pane-tabs.tsx +9 -1
  206. package/src/components/layout/shell/chrome.ts +19 -6
  207. package/src/components/layout/shell/index.tsx +2 -1
  208. package/src/components/layout/shell/pane/layers.tsx +19 -1
  209. package/src/components/layout/status-bar.tsx +2 -2
  210. package/src/components/market-board/index.tsx +11 -3
  211. package/src/components/onboarding/onboarding-wizard.tsx +1 -0
  212. package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +2 -2
  213. package/src/components/onboarding/wizard-broker-sync.ts +4 -1
  214. package/src/components/pane-settings-dialog/desktop.tsx +20 -7
  215. package/src/components/pane-settings-dialog/tui.tsx +17 -9
  216. package/src/components/pane-settings-dialog/value.ts +8 -1
  217. package/src/components/pane-settings-dialog.tsx +44 -13
  218. package/src/components/sign-in-code-panel.tsx +27 -19
  219. package/src/components/ui/column-grid.tsx +48 -4
  220. package/src/components/ui/country-flag-art.tsx +180 -0
  221. package/src/components/ui/country-flag.tsx +118 -12
  222. package/src/components/ui/data-table/opentui/index.tsx +61 -2
  223. package/src/components/ui/data-table/opentui/model.ts +109 -2
  224. package/src/components/ui/data-table/types.ts +1 -1
  225. package/src/components/ui/display.tsx +5 -1
  226. package/src/components/ui/index.ts +3 -1
  227. package/src/components/ui/logo-mark.tsx +11 -2
  228. package/src/components/ui/query-bar.tsx +1 -1
  229. package/src/components/ui/row-notes.ts +79 -0
  230. package/src/components/ui/stat-grid.tsx +28 -3
  231. package/src/components/ui/status.tsx +3 -1
  232. package/src/core/app-services.ts +4 -0
  233. package/src/core/state/app/layout.ts +4 -4
  234. package/src/data/cached-query.ts +8 -1
  235. package/src/data/config/chart-settings.ts +3 -3
  236. package/src/data/config/home.ts +10 -2
  237. package/src/data/config/layout.ts +4 -1
  238. package/src/data/config/store/node.ts +4 -0
  239. package/src/data/config/store/normalize.ts +13 -3
  240. package/src/data/config/store/portfolio-as-of-column.ts +2 -2
  241. package/src/data/json-storage.ts +2 -0
  242. package/src/data/saved-copies.ts +84 -0
  243. package/src/docs/snapshot.json +65 -32
  244. package/src/i18n/es.ts +51 -12
  245. package/src/i18n/ja.ts +51 -12
  246. package/src/i18n/ko.ts +51 -12
  247. package/src/i18n/zh-cn.ts +51 -12
  248. package/src/i18n/zh-tw.ts +51 -12
  249. package/src/layout/desks.ts +1 -1
  250. package/src/layout/launch-layout.ts +1 -1
  251. package/src/layout/pane-manager/floating-actions.ts +5 -3
  252. package/src/layout/pane-manager/floating.ts +43 -1
  253. package/src/layout/pane-manager/index.ts +2 -0
  254. package/src/layout/selected-ticker.ts +74 -0
  255. package/src/market-data/depositary-pair.ts +251 -0
  256. package/src/market-data/futures-board.ts +1 -1
  257. package/src/market-data/futures-contract.ts +124 -40
  258. package/src/market-data/fx-closes.ts +17 -2
  259. package/src/market-data/hooks.tsx +19 -11
  260. package/src/market-data/market/change-basis.ts +49 -7
  261. package/src/market-data/market/freshness.ts +34 -5
  262. package/src/market-data/market/period-return.ts +163 -0
  263. package/src/market-data/market/trading-sessions.ts +13 -0
  264. package/src/market-data/market/year-to-date.ts +8 -13
  265. package/src/market-data/performance.ts +20 -14
  266. package/src/market-data/perpetual-premium.ts +32 -0
  267. package/src/market-data/published-apac-sessions.ts +2 -1
  268. package/src/market-data/published-futures-sessions.ts +69 -0
  269. package/src/market-data/quotes/contributions.ts +5 -1
  270. package/src/market-data/quotes/freshness.ts +42 -0
  271. package/src/market-data/quotes/intraday-bar.ts +37 -0
  272. package/src/market-data/quotes/regular-session-valuation.ts +13 -8
  273. package/src/market-data/quotes/resolution.ts +4 -2
  274. package/src/market-data/tax-equivalent.ts +1 -1
  275. package/src/market-data/ticker-price-returns.ts +3 -1
  276. package/src/news/aggregator.ts +5 -1
  277. package/src/news/news-model.ts +4 -0
  278. package/src/news/types.ts +11 -0
  279. package/src/notifications/app-notifier.ts +1 -1
  280. package/src/plugins/auto-update.ts +2 -2
  281. package/src/plugins/builtin/account-management/index.tsx +1 -0
  282. package/src/plugins/builtin/account-management/pane.tsx +9 -8
  283. package/src/plugins/builtin/alerts/alert-engine.ts +30 -18
  284. package/src/plugins/builtin/alerts/calendar-events.ts +378 -0
  285. package/src/plugins/builtin/alerts/cli.ts +485 -76
  286. package/src/plugins/builtin/alerts/command.ts +5 -10
  287. package/src/plugins/builtin/alerts/event-rows.ts +9 -5
  288. package/src/plugins/builtin/alerts/events-pane.tsx +71 -56
  289. package/src/plugins/builtin/alerts/events.ts +108 -5
  290. package/src/plugins/builtin/alerts/fired-log.ts +78 -0
  291. package/src/plugins/builtin/alerts/format.ts +2 -1
  292. package/src/plugins/builtin/alerts/headless.ts +100 -39
  293. package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
  294. package/src/plugins/builtin/alerts/history-rows.ts +89 -0
  295. package/src/plugins/builtin/alerts/index.tsx +45 -18
  296. package/src/plugins/builtin/alerts/iv-level.ts +365 -0
  297. package/src/plugins/builtin/alerts/levels.ts +3 -3
  298. package/src/plugins/builtin/alerts/pane.tsx +97 -29
  299. package/src/plugins/builtin/alerts/price.ts +35 -0
  300. package/src/plugins/builtin/alerts/quotes.ts +24 -0
  301. package/src/plugins/builtin/alerts/research-builder.ts +84 -11
  302. package/src/plugins/builtin/alerts/research-rules.ts +77 -3
  303. package/src/plugins/builtin/alerts/scheduled-check.ts +206 -32
  304. package/src/plugins/builtin/alerts/scheduled-sources.ts +26 -3
  305. package/src/plugins/builtin/alerts/scheduled.ts +188 -29
  306. package/src/plugins/builtin/alerts/storage.ts +13 -10
  307. package/src/plugins/builtin/alerts/targets.ts +12 -3
  308. package/src/plugins/builtin/analytics/index.tsx +8 -2
  309. package/src/plugins/builtin/analytics/metrics.ts +1 -1
  310. package/src/plugins/builtin/analytics/risk-book.ts +215 -0
  311. package/src/plugins/builtin/analytics/risk-client.ts +13 -6
  312. package/src/plugins/builtin/analytics/risk-headless.ts +55 -21
  313. package/src/plugins/builtin/analytics/risk-math.ts +6 -3
  314. package/src/plugins/builtin/analytics/risk-model.ts +297 -104
  315. package/src/plugins/builtin/analytics/risk-options.ts +17 -2
  316. package/src/plugins/builtin/analytics/risk-pane.tsx +107 -43
  317. package/src/plugins/builtin/attention/pane.tsx +22 -16
  318. package/src/plugins/builtin/awards/headless.ts +7 -3
  319. package/src/plugins/builtin/awards/model.ts +18 -0
  320. package/src/plugins/builtin/awards/pane.tsx +12 -9
  321. package/src/plugins/builtin/backtest/export.ts +1 -1
  322. package/src/plugins/builtin/backtest/headless.ts +3 -3
  323. package/src/plugins/builtin/backtest/rules.ts +41 -5
  324. package/src/plugins/builtin/broker-manager/add-flow.tsx +12 -7
  325. package/src/plugins/builtin/broker-manager/detail.tsx +47 -19
  326. package/src/plugins/builtin/broker-manager/footer.ts +27 -11
  327. package/src/plugins/builtin/broker-manager/index.tsx +21 -12
  328. package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
  329. package/src/plugins/builtin/broker-manager/model.ts +12 -2
  330. package/src/plugins/builtin/broker-manager/pane-actions.tsx +183 -57
  331. package/src/plugins/builtin/broker-manager/table.ts +28 -12
  332. package/src/plugins/builtin/broker-trading/account-picker.tsx +2 -1
  333. package/src/plugins/builtin/broker-trading/chart-levels.ts +82 -13
  334. package/src/plugins/builtin/broker-trading/controller.ts +45 -13
  335. package/src/plugins/builtin/broker-trading/dock.tsx +24 -4
  336. package/src/plugins/builtin/broker-trading/headless.ts +2 -1
  337. package/src/plugins/builtin/broker-trading/index.tsx +7 -1
  338. package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
  339. package/src/plugins/builtin/broker-trading/order-feed.ts +75 -7
  340. package/src/plugins/builtin/broker-trading/orders.tsx +109 -31
  341. package/src/plugins/builtin/broker-trading/overview-orders.tsx +9 -3
  342. package/src/plugins/builtin/broker-trading/pane-model.ts +30 -2
  343. package/src/plugins/builtin/broker-trading/pane.tsx +115 -26
  344. package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
  345. package/src/plugins/builtin/broker-trading/ticket.tsx +122 -36
  346. package/src/plugins/builtin/buildout/cells.tsx +4 -0
  347. package/src/plugins/builtin/buildout/detail/index.tsx +5 -1
  348. package/src/plugins/builtin/buildout/detail/ui.tsx +7 -4
  349. package/src/plugins/builtin/buildout/pane/index.tsx +34 -18
  350. package/src/plugins/builtin/buildout/pane/status.tsx +0 -4
  351. package/src/plugins/builtin/builtin-plugin-meta.ts +1 -1
  352. package/src/plugins/builtin/catalysts/client.ts +2 -2
  353. package/src/plugins/builtin/catalysts/detail.tsx +3 -2
  354. package/src/plugins/builtin/catalysts/index.tsx +1 -1
  355. package/src/plugins/builtin/catalysts/model.ts +49 -4
  356. package/src/plugins/builtin/catalysts/pane.tsx +9 -11
  357. package/src/plugins/builtin/central-bank-rates/client.ts +5 -0
  358. package/src/plugins/builtin/central-bank-rates/headless.ts +36 -10
  359. package/src/plugins/builtin/central-bank-rates/model.ts +33 -8
  360. package/src/plugins/builtin/changelog/index.tsx +1 -0
  361. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +1 -0
  362. package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +2 -1
  363. package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
  364. package/src/plugins/builtin/chart-composer/cli-options.ts +2 -5
  365. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +2 -1
  366. package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -0
  367. package/src/plugins/builtin/chart-composer/editor.tsx +4 -1
  368. package/src/plugins/builtin/chart-composer/headless-schema.ts +28 -26
  369. package/src/plugins/builtin/chart-composer/headless.ts +253 -35
  370. package/src/plugins/builtin/chart-composer/index.tsx +12 -2
  371. package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
  372. package/src/plugins/builtin/chart-composer/pane.tsx +128 -28
  373. package/src/plugins/builtin/chart-composer/series-catalog.ts +1 -0
  374. package/src/plugins/builtin/chart-composer/series-expression.ts +65 -6
  375. package/src/plugins/builtin/chart-composer/session-history.ts +15 -21
  376. package/src/plugins/builtin/chart-composer/session-range.ts +4 -2
  377. package/src/plugins/builtin/chart-composer/settings.ts +31 -19
  378. package/src/plugins/builtin/chart-composer/use-series-catalog.ts +5 -6
  379. package/src/plugins/builtin/chart-composer/viewport-labels.ts +18 -8
  380. package/src/plugins/builtin/chat/attachments/model.ts +3 -1
  381. package/src/plugins/builtin/chat/content/index.tsx +1 -1
  382. package/src/plugins/builtin/chat/pane-links/open.ts +1 -1
  383. package/src/plugins/builtin/chat/people.ts +1 -1
  384. package/src/plugins/builtin/clinical-trials/client.ts +5 -2
  385. package/src/plugins/builtin/clinical-trials/model.ts +13 -4
  386. package/src/plugins/builtin/clinical-trials/pane.tsx +32 -12
  387. package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +17 -0
  388. package/src/plugins/builtin/cloud/askg/controller.ts +1 -1
  389. package/src/plugins/builtin/cloud/askg/lock-note.ts +1 -1
  390. package/src/plugins/builtin/cloud/askg/tool-display.ts +1 -1
  391. package/src/plugins/builtin/cloud/auth-commands.ts +3 -3
  392. package/src/plugins/builtin/cloud/team/pane-sections.tsx +105 -47
  393. package/src/plugins/builtin/cloud/team/pane-ui.tsx +42 -4
  394. package/src/plugins/builtin/cloud/team/pane.tsx +204 -64
  395. package/src/plugins/builtin/cloud/thesis/store.ts +45 -22
  396. package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
  397. package/src/plugins/builtin/commodities-energy/index.tsx +29 -2
  398. package/src/plugins/builtin/commodities-energy/view-state.ts +2 -0
  399. package/src/plugins/builtin/commodity-balances/pane.tsx +14 -8
  400. package/src/plugins/builtin/company-attention/app-rank.tsx +11 -10
  401. package/src/plugins/builtin/company-attention/building-model.ts +222 -0
  402. package/src/plugins/builtin/company-attention/building.tsx +172 -0
  403. package/src/plugins/builtin/company-attention/client.ts +117 -1
  404. package/src/plugins/builtin/company-attention/evidence.ts +16 -3
  405. package/src/plugins/builtin/company-attention/headless.ts +101 -5
  406. package/src/plugins/builtin/company-attention/index.tsx +6 -3
  407. package/src/plugins/builtin/company-attention/model.ts +33 -7
  408. package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
  409. package/src/plugins/builtin/company-attention/moves.tsx +159 -0
  410. package/src/plugins/builtin/company-attention/pane.tsx +89 -31
  411. package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
  412. package/src/plugins/builtin/company-attention/signals.tsx +160 -0
  413. package/src/plugins/builtin/company-kpis/headless.ts +3 -2
  414. package/src/plugins/builtin/company-kpis/model.ts +2 -2
  415. package/src/plugins/builtin/company-kpis/pane.tsx +5 -4
  416. package/src/plugins/builtin/composite-plugins.ts +2 -1
  417. package/src/plugins/builtin/congress-trades/headless.ts +1 -1
  418. package/src/plugins/builtin/connections/index.ts +1 -0
  419. package/src/plugins/builtin/correlation/headless-schema.ts +3 -2
  420. package/src/plugins/builtin/correlation/headless.ts +7 -4
  421. package/src/plugins/builtin/correlation/relationship/model.ts +1 -0
  422. package/src/plugins/builtin/correlation/settings.ts +1 -0
  423. package/src/plugins/builtin/cot/headless.ts +28 -6
  424. package/src/plugins/builtin/cot/model.ts +12 -0
  425. package/src/plugins/builtin/cot/pane.tsx +7 -5
  426. package/src/plugins/builtin/cpi/headless.ts +5 -1
  427. package/src/plugins/builtin/cpi/pane.tsx +11 -9
  428. package/src/plugins/builtin/credit-boards/model.ts +2 -0
  429. package/src/plugins/builtin/credit-documents/headless.ts +1 -1
  430. package/src/plugins/builtin/credit-documents/pane.tsx +8 -7
  431. package/src/plugins/builtin/crypto-board/client.ts +86 -0
  432. package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
  433. package/src/plugins/builtin/crypto-board/defi.ts +239 -0
  434. package/src/plugins/builtin/crypto-board/headless.ts +117 -6
  435. package/src/plugins/builtin/crypto-board/index.tsx +8 -3
  436. package/src/plugins/builtin/crypto-board/model.ts +40 -8
  437. package/src/plugins/builtin/crypto-board/pane.tsx +55 -21
  438. package/src/plugins/builtin/crypto-board/series.ts +19 -1
  439. package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
  440. package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
  441. package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
  442. package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
  443. package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
  444. package/src/plugins/builtin/debt-maturities/pane.tsx +4 -3
  445. package/src/plugins/builtin/debug/index.tsx +1 -0
  446. package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
  447. package/src/plugins/builtin/docs/index.tsx +1 -1
  448. package/src/plugins/builtin/docs/pane.tsx +2 -2
  449. package/src/plugins/builtin/docs/targets.ts +1 -1
  450. package/src/plugins/builtin/doe/client.ts +5 -1
  451. package/src/plugins/builtin/doe/headless.ts +12 -6
  452. package/src/plugins/builtin/doe/model.ts +43 -6
  453. package/src/plugins/builtin/doe/pane.tsx +19 -12
  454. package/src/plugins/builtin/earnings/board-model.ts +13 -6
  455. package/src/plugins/builtin/earnings/board-table.ts +4 -1
  456. package/src/plugins/builtin/earnings/board.tsx +253 -50
  457. package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
  458. package/src/plugins/builtin/earnings/calendar.tsx +338 -0
  459. package/src/plugins/builtin/earnings/client.ts +4 -3
  460. package/src/plugins/builtin/earnings/headless.ts +53 -15
  461. package/src/plugins/builtin/earnings/history-model.ts +53 -36
  462. package/src/plugins/builtin/earnings/index.tsx +15 -22
  463. package/src/plugins/builtin/earnings/model.ts +17 -12
  464. package/src/plugins/builtin/earnings/scope.ts +89 -0
  465. package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
  466. package/src/plugins/builtin/earnings-calls/data.ts +146 -2
  467. package/src/plugins/builtin/earnings-calls/headless.ts +151 -9
  468. package/src/plugins/builtin/earnings-calls/index.tsx +3 -3
  469. package/src/plugins/builtin/earnings-calls/lock-note.ts +1 -1
  470. package/src/plugins/builtin/earnings-calls/pane.tsx +149 -31
  471. package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
  472. package/src/plugins/builtin/earnings-ripple/pane.tsx +10 -5
  473. package/src/plugins/builtin/econ/calendar-model.ts +132 -20
  474. package/src/plugins/builtin/econ/detail-view.tsx +48 -10
  475. package/src/plugins/builtin/econ/fred-catalog.ts +23 -6
  476. package/src/plugins/builtin/econ/fred-series-map.ts +4 -0
  477. package/src/plugins/builtin/econ/index.tsx +112 -25
  478. package/src/plugins/builtin/econ/print-watch.ts +2 -1
  479. package/src/plugins/builtin/econ/types.ts +32 -1
  480. package/src/plugins/builtin/econ-statistics/client.ts +16 -3
  481. package/src/plugins/builtin/econ-statistics/defs.ts +4 -0
  482. package/src/plugins/builtin/econ-statistics/detail.tsx +2 -2
  483. package/src/plugins/builtin/econ-statistics/headless.ts +13 -2
  484. package/src/plugins/builtin/econ-statistics/index.tsx +3 -3
  485. package/src/plugins/builtin/econ-statistics/pane.tsx +2 -1
  486. package/src/plugins/builtin/econ-statistics/stats.ts +103 -0
  487. package/src/plugins/builtin/econ-statistics/view.ts +16 -1
  488. package/src/plugins/builtin/equity-screener/client.ts +21 -3
  489. package/src/plugins/builtin/equity-screener/headless.ts +77 -5
  490. package/src/plugins/builtin/equity-screener/live.ts +1 -1
  491. package/src/plugins/builtin/equity-screener/model.ts +34 -0
  492. package/src/plugins/builtin/equity-screener/pane.tsx +148 -106
  493. package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
  494. package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
  495. package/src/plugins/builtin/estimate-revisions/headless.ts +3 -1
  496. package/src/plugins/builtin/estimate-revisions/lock-note.ts +3 -3
  497. package/src/plugins/builtin/estimate-revisions/model.ts +8 -10
  498. package/src/plugins/builtin/exposure/headless.ts +51 -6
  499. package/src/plugins/builtin/exposure/index.tsx +28 -2
  500. package/src/plugins/builtin/exposure/model.ts +7 -0
  501. package/src/plugins/builtin/exposure/pane.tsx +16 -10
  502. package/src/plugins/builtin/fear-greed/index.tsx +1 -1
  503. package/src/plugins/builtin/filing-events/index.tsx +1 -1
  504. package/src/plugins/builtin/futures/model.ts +10 -9
  505. package/src/plugins/builtin/futures/returns.ts +8 -36
  506. package/src/plugins/builtin/futures/table.tsx +1 -1
  507. package/src/plugins/builtin/futures-curve/client.ts +40 -9
  508. package/src/plugins/builtin/futures-curve/headless.ts +39 -17
  509. package/src/plugins/builtin/futures-curve/model.ts +258 -69
  510. package/src/plugins/builtin/futures-curve/pane.tsx +46 -17
  511. package/src/plugins/builtin/fx-matrix/client.ts +15 -8
  512. package/src/plugins/builtin/fx-matrix/headless.ts +32 -14
  513. package/src/plugins/builtin/fx-matrix/index.tsx +13 -11
  514. package/src/plugins/builtin/fx-matrix/live-legs.ts +22 -0
  515. package/src/plugins/builtin/fx-matrix/settings.ts +2 -1
  516. package/src/plugins/builtin/gpu/board.tsx +4 -1
  517. package/src/plugins/builtin/gpu/changes.tsx +10 -10
  518. package/src/plugins/builtin/gpu/equities.tsx +4 -1
  519. package/src/plugins/builtin/gpu/headless.ts +9 -4
  520. package/src/plugins/builtin/gpu/history.tsx +4 -2
  521. package/src/plugins/builtin/gpu/pane.tsx +5 -3
  522. package/src/plugins/builtin/help/index.tsx +13 -3
  523. package/src/plugins/builtin/holders/beneficial-model.ts +8 -11
  524. package/src/plugins/builtin/holders/beneficial-report.ts +6 -5
  525. package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
  526. package/src/plugins/builtin/holders/client.ts +15 -2
  527. package/src/plugins/builtin/holders/format.ts +28 -17
  528. package/src/plugins/builtin/holders/headless.ts +48 -8
  529. package/src/plugins/builtin/holders/index-holders.ts +264 -0
  530. package/src/plugins/builtin/holders/pane.tsx +79 -15
  531. package/src/plugins/builtin/holders/report-rows.ts +35 -7
  532. package/src/plugins/builtin/holders/table-model.ts +2 -1
  533. package/src/plugins/builtin/holders/thirteenf-match.ts +3 -1
  534. package/src/plugins/builtin/holders/treemap.tsx +2 -2
  535. package/src/plugins/builtin/insider/base-values.ts +11 -7
  536. package/src/plugins/builtin/insider/client.ts +3 -0
  537. package/src/plugins/builtin/insider/headless.ts +20 -7
  538. package/src/plugins/builtin/insider/index.tsx +17 -8
  539. package/src/plugins/builtin/insider/issuer.ts +34 -4
  540. package/src/plugins/builtin/insider/signals-client.ts +3 -3
  541. package/src/plugins/builtin/insider/signals.tsx +1 -1
  542. package/src/plugins/builtin/insider/table-model.ts +35 -13
  543. package/src/plugins/builtin/insider/table.tsx +5 -2
  544. package/src/plugins/builtin/ipo-calendar/pane.tsx +7 -4
  545. package/src/plugins/builtin/iv-history/client.ts +20 -0
  546. package/src/plugins/builtin/iv-history/events.ts +145 -0
  547. package/src/plugins/builtin/iv-history/format.ts +3 -0
  548. package/src/plugins/builtin/iv-history/headless.ts +91 -7
  549. package/src/plugins/builtin/iv-history/index.tsx +1 -1
  550. package/src/plugins/builtin/iv-history/model.ts +13 -4
  551. package/src/plugins/builtin/iv-history/series.ts +3 -1
  552. package/src/plugins/builtin/jobs/lock-note.ts +1 -1
  553. package/src/plugins/builtin/jobs/model.ts +4 -15
  554. package/src/plugins/builtin/jobs/pane.tsx +7 -5
  555. package/src/plugins/builtin/jobs/share-bars.tsx +11 -5
  556. package/src/plugins/builtin/jodi/pane.tsx +14 -8
  557. package/src/plugins/builtin/layout-manager/index.tsx +1 -0
  558. package/src/plugins/builtin/macro-day/headless.ts +20 -7
  559. package/src/plugins/builtin/macro-day/index.tsx +3 -2
  560. package/src/plugins/builtin/macro-day/model.ts +29 -8
  561. package/src/plugins/builtin/macro-day/pane.tsx +46 -10
  562. package/src/plugins/builtin/macro-day/releases.ts +55 -13
  563. package/src/plugins/builtin/market-heatmap/data.ts +9 -2
  564. package/src/plugins/builtin/market-heatmap/evidence.ts +1 -1
  565. package/src/plugins/builtin/market-heatmap/headless.ts +9 -6
  566. package/src/plugins/builtin/market-heatmap/index.tsx +3 -3
  567. package/src/plugins/builtin/market-heatmap/model.ts +10 -7
  568. package/src/plugins/builtin/market-movers/client.ts +36 -21
  569. package/src/plugins/builtin/market-movers/headless.ts +8 -2
  570. package/src/plugins/builtin/market-movers/index.tsx +16 -10
  571. package/src/plugins/builtin/market-movers/screener.ts +33 -11
  572. package/src/plugins/builtin/market-movers/session-body.tsx +4 -2
  573. package/src/plugins/builtin/market-movers/session-table.ts +4 -2
  574. package/src/plugins/builtin/market-movers/table.ts +4 -1
  575. package/src/plugins/builtin/market-valuation/headless.ts +2 -0
  576. package/src/plugins/builtin/market-valuation/view.ts +5 -0
  577. package/src/plugins/builtin/members/headless.ts +6 -5
  578. package/src/plugins/builtin/members/pane.tsx +11 -4
  579. package/src/plugins/builtin/mna/client.ts +1 -0
  580. package/src/plugins/builtin/mna/detail.tsx +20 -32
  581. package/src/plugins/builtin/mna/distress/detail.tsx +16 -4
  582. package/src/plugins/builtin/mna/distress/model.ts +3 -2
  583. package/src/plugins/builtin/mna/distress/pane.tsx +7 -4
  584. package/src/plugins/builtin/mna/headless.ts +6 -13
  585. package/src/plugins/builtin/mna/model.ts +93 -15
  586. package/src/plugins/builtin/mna/pane.tsx +5 -4
  587. package/src/plugins/builtin/news/headless.ts +12 -6
  588. package/src/plugins/builtin/news/index.tsx +10 -1
  589. package/src/plugins/builtin/news/wire/index.tsx +3 -2
  590. package/src/plugins/builtin/news/wire/news/command-bar-search.ts +26 -10
  591. package/src/plugins/builtin/news/wire/news/query-presets.ts +6 -2
  592. package/src/plugins/builtin/news/wire/rss/cli.ts +3 -3
  593. package/src/plugins/builtin/notes/cli.ts +50 -15
  594. package/src/plugins/builtin/notes/export.ts +17 -6
  595. package/src/plugins/builtin/notes/files.ts +16 -5
  596. package/src/plugins/builtin/openfda/pane.tsx +1 -1
  597. package/src/plugins/builtin/options/carry.ts +2 -2
  598. package/src/plugins/builtin/options/enrichment-model.ts +10 -9
  599. package/src/plugins/builtin/options/index.tsx +1 -1
  600. package/src/plugins/builtin/options/model-spot.ts +70 -4
  601. package/src/plugins/builtin/options/view.tsx +51 -23
  602. package/src/plugins/builtin/options-calculator/headless.ts +46 -7
  603. package/src/plugins/builtin/options-calculator/pane.tsx +3 -2
  604. package/src/plugins/builtin/options-positioning/headless.ts +11 -3
  605. package/src/plugins/builtin/options-positioning/model.ts +24 -0
  606. package/src/plugins/builtin/options-positioning/pane.tsx +10 -12
  607. package/src/plugins/builtin/options-scenario/client.ts +142 -29
  608. package/src/plugins/builtin/options-scenario/collar.ts +8 -6
  609. package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +127 -0
  610. package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +165 -0
  611. package/src/plugins/builtin/options-scenario/csp-screen.ts +258 -0
  612. package/src/plugins/builtin/options-scenario/csp.ts +101 -21
  613. package/src/plugins/builtin/options-scenario/headless.ts +49 -21
  614. package/src/plugins/builtin/options-scenario/hedge.ts +20 -14
  615. package/src/plugins/builtin/options-scenario/index.tsx +28 -3
  616. package/src/plugins/builtin/options-scenario/model.ts +13 -0
  617. package/src/plugins/builtin/options-scenario/pane.tsx +22 -10
  618. package/src/plugins/builtin/perps/equity-row.tsx +11 -3
  619. package/src/plugins/builtin/perps/freshness.ts +8 -5
  620. package/src/plugins/builtin/perps/headless.ts +3 -1
  621. package/src/plugins/builtin/perps/list-perpetuals.ts +25 -4
  622. package/src/plugins/builtin/perps/live-rows.ts +161 -0
  623. package/src/plugins/builtin/perps/markets-section.tsx +154 -0
  624. package/src/plugins/builtin/perps/pane.tsx +36 -17
  625. package/src/plugins/builtin/perps/venue-markets.ts +96 -0
  626. package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -1
  627. package/src/plugins/builtin/plugin-marketplace/pane.tsx +145 -60
  628. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +78 -27
  629. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +158 -141
  630. package/src/plugins/builtin/portfolio-list/cli/render.ts +49 -20
  631. package/src/plugins/builtin/portfolio-list/cli/shared.ts +3 -3
  632. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +29 -24
  633. package/src/plugins/builtin/portfolio-list/headless.ts +6 -3
  634. package/src/plugins/builtin/portfolio-list/income.ts +13 -2
  635. package/src/plugins/builtin/portfolio-list/index.tsx +9 -2
  636. package/src/plugins/builtin/portfolio-list/pane/index.tsx +21 -8
  637. package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
  638. package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +16 -9
  639. package/src/plugins/builtin/portfolio-list/summary/totals.ts +2 -15
  640. package/src/plugins/builtin/power/client.ts +6 -3
  641. package/src/plugins/builtin/power/evidence.ts +22 -7
  642. package/src/plugins/builtin/power/gas.tsx +5 -1
  643. package/src/plugins/builtin/power/pane.tsx +44 -32
  644. package/src/plugins/builtin/power/prices.tsx +10 -3
  645. package/src/plugins/builtin/research/analyst-headless.ts +25 -8
  646. package/src/plugins/builtin/research/analyst-model.ts +68 -3
  647. package/src/plugins/builtin/research/corporate-actions-pane.tsx +63 -14
  648. package/src/plugins/builtin/research/event-model.ts +3 -1
  649. package/src/plugins/builtin/research/event-sources.ts +12 -4
  650. package/src/plugins/builtin/research/index.tsx +2 -1
  651. package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
  652. package/src/plugins/builtin/research/relative-valuation-columns.ts +31 -2
  653. package/src/plugins/builtin/research/relative-valuation-currency.ts +12 -5
  654. package/src/plugins/builtin/research/relative-valuation-headless.ts +84 -26
  655. package/src/plugins/builtin/research/relative-valuation-model.ts +88 -19
  656. package/src/plugins/builtin/research/relative-valuation-pane.tsx +76 -9
  657. package/src/plugins/builtin/research/relative-valuation-peers.ts +1 -1
  658. package/src/plugins/builtin/reverse-dcf/client.ts +2 -1
  659. package/src/plugins/builtin/reverse-dcf/model.ts +10 -5
  660. package/src/plugins/builtin/risk-factors/index.tsx +2 -2
  661. package/src/plugins/builtin/scanner/lock-note.ts +1 -1
  662. package/src/plugins/builtin/seasonality/client.ts +2 -1
  663. package/src/plugins/builtin/sec/forms.ts +13 -0
  664. package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
  665. package/src/plugins/builtin/sec/fund-facts.ts +68 -8
  666. package/src/plugins/builtin/sec/headless.ts +85 -8
  667. package/src/plugins/builtin/sec/index.tsx +58 -12
  668. package/src/plugins/builtin/sectors/client.ts +6 -4
  669. package/src/plugins/builtin/sectors/sector-model.ts +11 -15
  670. package/src/plugins/builtin/series-inventory.ts +2 -0
  671. package/src/plugins/builtin/shared/broker-reconnect.ts +107 -22
  672. package/src/plugins/builtin/shared/cloud-resource.ts +15 -2
  673. package/src/plugins/builtin/shared/cloud-upgrade.ts +34 -6
  674. package/src/plugins/builtin/shared/earnings-calendar.ts +375 -0
  675. package/src/plugins/builtin/{earnings/estimate-basis.ts → shared/earnings-estimate-basis.ts} +1 -1
  676. package/src/plugins/builtin/shared/earnings-report.ts +3 -3
  677. package/src/plugins/builtin/shared/fx-rate-freshness.ts +23 -1
  678. package/src/plugins/builtin/shared/job-posting.ts +129 -0
  679. package/src/plugins/builtin/shared/pro-lock-note.ts +3 -3
  680. package/src/plugins/builtin/shared/report-freshness.ts +3 -0
  681. package/src/plugins/builtin/shared/research-trading.tsx +23 -0
  682. package/src/plugins/builtin/shared/series-cache.ts +2 -0
  683. package/src/plugins/builtin/shared/series-list-detail.tsx +3 -1
  684. package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
  685. package/src/plugins/builtin/shared/volatility/options.ts +2 -1
  686. package/src/plugins/builtin/short-interest/client.ts +2 -0
  687. package/src/plugins/builtin/short-interest/headless.ts +41 -12
  688. package/src/plugins/builtin/short-interest/index.tsx +23 -1
  689. package/src/plugins/builtin/short-interest/model.ts +70 -19
  690. package/src/plugins/builtin/short-interest/pane.tsx +19 -2
  691. package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
  692. package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
  693. package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
  694. package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
  695. package/src/plugins/builtin/short-interest/schedule.ts +35 -2
  696. package/src/plugins/builtin/short-interest/surface.tsx +11 -4
  697. package/src/plugins/builtin/short-interest/types.ts +9 -0
  698. package/src/plugins/builtin/short-interest/watch-client.ts +14 -8
  699. package/src/plugins/builtin/short-interest/watch-model.ts +12 -25
  700. package/src/plugins/builtin/short-interest/watch-pane.tsx +5 -1
  701. package/src/plugins/builtin/social-mentions/client.ts +2 -1
  702. package/src/plugins/builtin/supply-chain/flow.tsx +33 -9
  703. package/src/plugins/builtin/supply-chain/model.ts +51 -3
  704. package/src/plugins/builtin/supply-chain/pane.tsx +78 -39
  705. package/src/plugins/builtin/supply-chain/row-evidence.tsx +1 -1
  706. package/src/plugins/builtin/themes/headless.ts +8 -5
  707. package/src/plugins/builtin/themes/model.ts +14 -4
  708. package/src/plugins/builtin/themes/pane.tsx +24 -5
  709. package/src/plugins/builtin/thirteenf/headless.ts +5 -5
  710. package/src/plugins/builtin/thirteenf/signals.ts +3 -1
  711. package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
  712. package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
  713. package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
  714. package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +40 -26
  715. package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +8 -4
  716. package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +67 -3
  717. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +112 -5
  718. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +17 -2
  719. package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +21 -7
  720. package/src/plugins/builtin/ticker-detail/financials/model.ts +36 -1
  721. package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
  722. package/src/plugins/builtin/ticker-detail/financials/ratios.ts +62 -13
  723. package/src/plugins/builtin/ticker-detail/financials/tab.tsx +30 -4
  724. package/src/plugins/builtin/ticker-detail/headless-schema.ts +14 -2
  725. package/src/plugins/builtin/ticker-detail/headless.ts +148 -35
  726. package/src/plugins/builtin/ticker-detail/index.tsx +37 -5
  727. package/src/plugins/builtin/ticker-detail/overview/model.ts +65 -10
  728. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +9 -1
  729. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +68 -11
  730. package/src/plugins/builtin/ticker-detail/pane.tsx +11 -0
  731. package/src/plugins/builtin/ticker-detail/quote-footer.ts +8 -3
  732. package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
  733. package/src/plugins/builtin/vol-surface/client.ts +28 -7
  734. package/src/plugins/builtin/vol-surface/headless.ts +43 -15
  735. package/src/plugins/builtin/vol-surface/model.ts +34 -12
  736. package/src/plugins/builtin/vol-surface/pane.tsx +33 -13
  737. package/src/plugins/builtin/vol-surface/stored.ts +34 -3
  738. package/src/plugins/builtin/vol-surface/tables.ts +14 -0
  739. package/src/plugins/builtin/volatility/model.ts +5 -10
  740. package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +4 -3
  741. package/src/plugins/builtin/world-venue-map/basemap.ts +3 -1
  742. package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -0
  743. package/src/plugins/builtin/world-venue-map/evidence.ts +1 -1
  744. package/src/plugins/builtin/world-venue-map/geo-series.ts +90 -11
  745. package/src/plugins/builtin/world-venue-map/headless.ts +1 -1
  746. package/src/plugins/builtin/world-venue-map/index.ts +3 -26
  747. package/src/plugins/builtin/world-venue-map/layers.ts +1 -1
  748. package/src/plugins/builtin/world-venue-map/map.tsx +2 -1
  749. package/src/plugins/builtin/world-venue-map/pane.tsx +4 -2
  750. package/src/plugins/builtin/world-venue-map/venue-header.tsx +15 -4
  751. package/src/plugins/builtin/yield-curve/client.ts +25 -0
  752. package/src/plugins/builtin/yield-curve/curves.ts +7 -4
  753. package/src/plugins/builtin/yield-curve/headless.ts +38 -4
  754. package/src/plugins/builtin/yield-curve/history.ts +4 -3
  755. package/src/plugins/builtin/yield-curve/index.tsx +12 -6
  756. package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
  757. package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
  758. package/src/plugins/bundle.ts +1 -1
  759. package/src/plugins/catalog-browser.ts +2 -1
  760. package/src/plugins/compat.ts +3 -3
  761. package/src/plugins/dependencies.ts +75 -14
  762. package/src/plugins/extracted-plugins.ts +132 -34
  763. package/src/plugins/host-link.ts +149 -34
  764. package/src/plugins/installer.ts +35 -10
  765. package/src/plugins/loader.ts +206 -38
  766. package/src/plugins/manager-node.ts +2 -2
  767. package/src/plugins/marketplace/deactivation.ts +22 -0
  768. package/src/plugins/marketplace/model.ts +2 -2
  769. package/src/plugins/marketplace/packs.ts +1 -1
  770. package/src/plugins/ownership.ts +1 -1
  771. package/src/plugins/peer-retry.ts +155 -0
  772. package/src/plugins/registry/contributions.ts +3 -1
  773. package/src/plugins/registry/index.ts +4 -3
  774. package/src/plugins/registry/plugin-state.ts +3 -0
  775. package/src/plugins/seed-notice.ts +20 -0
  776. package/src/plugins/shortcut-argument.ts +39 -0
  777. package/src/portfolio/allocation.ts +1 -1
  778. package/src/portfolio/collection-name.ts +31 -0
  779. package/src/portfolio/column-values.ts +10 -8
  780. package/src/portfolio/cost-fx.ts +296 -19
  781. package/src/portfolio/manual-lots.ts +75 -0
  782. package/src/portfolio/mutations.ts +60 -22
  783. package/src/portfolio/suffixed-listings.ts +209 -0
  784. package/src/portfolio/totals-currency.ts +24 -0
  785. package/src/public/__snapshots__/public-api.test.ts.snap +14 -0
  786. package/src/public/time-series.ts +11 -8
  787. package/src/remote/schema.ts +1 -1
  788. package/src/renderers/browser/config-host.ts +3 -0
  789. package/src/renderers/browser/main.tsx +23 -3
  790. package/src/renderers/dom/boot-frame-page.ts +187 -0
  791. package/src/renderers/dom/boot-frame.ts +237 -0
  792. package/src/renderers/dom/build-assets.ts +46 -8
  793. package/src/renderers/dom/desktop/controls.tsx +1 -1
  794. package/src/renderers/dom/desktop/query-bar.tsx +2 -0
  795. package/src/renderers/dom/dom-ui-host.tsx +4 -29
  796. package/src/renderers/dom/host/ascii-text.ts +16 -2
  797. package/src/renderers/dom/host/box.tsx +43 -2
  798. package/src/renderers/dom/host/chart-surface.tsx +2 -0
  799. package/src/renderers/dom/host/hls.chunk.ts +3 -0
  800. package/src/renderers/dom/host/image-surface.tsx +49 -0
  801. package/src/renderers/dom/host/media-surface.tsx +24 -18
  802. package/src/renderers/dom/host/mouse.ts +30 -0
  803. package/src/renderers/dom/host/size-observer.ts +1 -1
  804. package/src/renderers/dom/host/style.ts +1 -1
  805. package/src/renderers/dom/host/tabs.tsx +16 -5
  806. package/src/renderers/dom/host/top-surface.ts +127 -0
  807. package/src/renderers/dom/styles.css +115 -0
  808. package/src/renderers/dom/test-utils.tsx +2 -1
  809. package/src/renderers/electrobun/bun/application-menu/index.ts +3 -3
  810. package/src/renderers/electrobun/bun/core-capabilities.ts +9 -1
  811. package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
  812. package/src/renderers/electrobun/bun/desktop/backend.ts +56 -3
  813. package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
  814. package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
  815. package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
  816. package/src/renderers/electrobun/bun/desktop/update.ts +210 -30
  817. package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
  818. package/src/renderers/electrobun/bun/index.ts +11 -1
  819. package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
  820. package/src/renderers/electrobun/bun/window/create.ts +4 -1
  821. package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
  822. package/src/renderers/electrobun/shared/protocol.ts +6 -1
  823. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
  824. package/src/renderers/electrobun/view/config-host.ts +3 -0
  825. package/src/renderers/electrobun/view/fatal-screen.tsx +1 -1
  826. package/src/renderers/electrobun/view/main.tsx +30 -4
  827. package/src/renderers/electrobun/view/news-source.ts +9 -7
  828. package/src/renderers/electrobun/view/remote/asset-data-client.ts +9 -2
  829. package/src/renderers/electrobun/view/ui-host.tsx +1 -1
  830. package/src/renderers/opentui/browser-open.ts +88 -0
  831. package/src/renderers/opentui/host.tsx +5 -14
  832. package/src/renderers/opentui/image/loader.ts +3 -2
  833. package/src/renderers/opentui/native-smoke.ts +10 -1
  834. package/src/renderers/opentui/pane-image/index.ts +2 -1
  835. package/src/renderers/opentui/render-lib.ts +253 -0
  836. package/src/renderers/opentui/render-timing-smoke.ts +1 -1
  837. package/src/renderers/opentui/start.tsx +8 -1
  838. package/src/renderers/share/layout-view.tsx +2 -2
  839. package/src/renderers/share/main.tsx +4 -4
  840. package/src/renderers/share/view.tsx +1 -1
  841. package/src/series/resolve.ts +22 -6
  842. package/src/series/standalone.ts +30 -2
  843. package/src/series/types.ts +8 -1
  844. package/src/shares/api.ts +4 -1
  845. package/src/shares/pane.ts +1 -1
  846. package/src/sources/gloomberb-cloud/fred-series.ts +46 -1
  847. package/src/sources/gloomberb-cloud/index.ts +39 -16
  848. package/src/sources/gloomberb-cloud/news.ts +39 -0
  849. package/src/sources/gloomberb-cloud/normalizers.ts +14 -1
  850. package/src/sources/gloomberb-cloud/perpetuals.ts +49 -1
  851. package/src/sources/listing-symbols.ts +37 -0
  852. package/src/sources/provider-errors.ts +16 -2
  853. package/src/sources/provider-router/financial-routes.ts +21 -3
  854. package/src/sources/provider-router/financials.ts +15 -2
  855. package/src/sources/provider-router/history.ts +30 -8
  856. package/src/sources/provider-router/index.ts +16 -0
  857. package/src/sources/provider-router/primary.ts +1 -1
  858. package/src/state/app/bootstrap.ts +23 -0
  859. package/src/state/hooks/inline-tickers.ts +30 -5
  860. package/src/sync/controller.ts +1 -1
  861. package/src/sync/core-contributors.ts +46 -14
  862. package/src/team/collections-sync.ts +2 -1
  863. package/src/team/collections.ts +178 -17
  864. package/src/telemetry/crash-reports.ts +21 -4
  865. package/src/telemetry/update-failures-node.ts +59 -0
  866. package/src/telemetry/update-failures.ts +307 -0
  867. package/src/test-support/builtin-panes.ts +1 -1
  868. package/src/theme/colors.ts +3 -30
  869. package/src/theme/ui-tokens.ts +37 -1
  870. package/src/tickers/company-name-listing.ts +215 -36
  871. package/src/tickers/company-name.ts +43 -0
  872. package/src/tickers/index-roots.ts +47 -0
  873. package/src/tickers/instrument-label.ts +5 -1
  874. package/src/tickers/listing-fate.ts +30 -0
  875. package/src/tickers/metadata.ts +10 -0
  876. package/src/tickers/perpetual-listing.ts +5 -2
  877. package/src/tickers/search/home-listing.ts +75 -0
  878. package/src/tickers/search/index.ts +76 -27
  879. package/src/tickers/search/ranking.ts +54 -4
  880. package/src/tickers/search/upsert.ts +29 -0
  881. package/src/tickers/terminal-codes.ts +416 -40
  882. package/src/time-series/bar-aggregation.ts +243 -0
  883. package/src/time-series/base-series.ts +307 -0
  884. package/src/time-series/chart-bounds.ts +349 -0
  885. package/src/time-series/chart-seed.ts +142 -0
  886. package/src/time-series/economic.ts +5 -0
  887. package/src/time-series/fundamentals.ts +18 -3
  888. package/src/time-series/history-acquisition.ts +499 -0
  889. package/src/time-series/leverage.ts +100 -0
  890. package/src/time-series/market-resolution.ts +4 -2
  891. package/src/time-series/market.ts +2 -1
  892. package/src/time-series/price-comparison.ts +175 -30
  893. package/src/time-series/range.ts +9 -1
  894. package/src/time-series/resolution.ts +174 -16
  895. package/src/time-series/resolve-context.ts +157 -0
  896. package/src/time-series/resolve.ts +126 -1577
  897. package/src/time-series/series-name.ts +38 -0
  898. package/src/time-series/series-presentation.ts +208 -0
  899. package/src/time-series/spec.ts +11 -6
  900. package/src/time-series/studies.ts +109 -12
  901. package/src/time-series/tail-reconcile.ts +121 -0
  902. package/src/time-series/types.ts +29 -2
  903. package/src/time-series/use-chart-resolution.ts +4 -5
  904. package/src/types/broker.ts +10 -0
  905. package/src/types/config.ts +14 -0
  906. package/src/types/data-provider.ts +20 -0
  907. package/src/types/exchange-rate.ts +6 -0
  908. package/src/types/financials.ts +104 -7
  909. package/src/types/headless.ts +83 -6
  910. package/src/types/instrument.ts +3 -0
  911. package/src/types/issuer-listings.ts +28 -0
  912. package/src/types/plugin.ts +65 -8
  913. package/src/types/price-history.ts +2 -0
  914. package/src/types/ticker.ts +13 -0
  915. package/src/types/trading.ts +59 -1
  916. package/src/ui/ascii-font.ts +13 -1
  917. package/src/ui/host.tsx +6 -1
  918. package/src/updater/command-names.ts +175 -0
  919. package/src/updater/failure.ts +163 -0
  920. package/src/updater/index.ts +97 -28
  921. package/src/utils/calendar-date.ts +32 -15
  922. package/src/utils/cash-runway.ts +241 -0
  923. package/src/utils/central-banks.ts +42 -0
  924. package/src/utils/cli-output.ts +259 -80
  925. package/src/utils/contract-month.ts +16 -0
  926. package/src/utils/crypto-pair.ts +61 -3
  927. package/src/utils/currency-pair.ts +26 -0
  928. package/src/utils/currency-units.ts +29 -0
  929. package/src/utils/datetime-format.ts +10 -0
  930. package/src/utils/debug-log.ts +1 -1
  931. package/src/utils/decimal-comma.ts +39 -6
  932. package/src/utils/exchange-announcements.ts +71 -0
  933. package/src/utils/exchange-rate-snapshot.ts +10 -0
  934. package/src/utils/financial-statements.ts +83 -4
  935. package/src/utils/format.ts +34 -16
  936. package/src/utils/fundamentals.ts +150 -34
  937. package/src/utils/fx-market-hours.ts +10 -1
  938. package/src/utils/latest-financial-period.ts +8 -0
  939. package/src/utils/linux-libc.ts +54 -0
  940. package/src/utils/market-capitalization.ts +111 -15
  941. package/src/utils/max-drawdown.ts +64 -0
  942. package/src/utils/network-failure.ts +83 -0
  943. package/src/utils/option-expiry.ts +139 -7
  944. package/src/utils/price-earnings.ts +11 -5
  945. package/src/utils/price-history.ts +18 -8
  946. package/src/utils/price-window.ts +131 -0
  947. package/src/utils/release-date.ts +47 -0
  948. package/src/utils/sec.ts +71 -0
  949. package/src/utils/throttled-fetch.ts +11 -4
  950. package/src/utils/trailing-eps.ts +67 -0
  951. package/src/utils/typed-text.ts +21 -0
  952. package/src/utils/utc-time.ts +24 -1
  953. package/src/version.ts +6 -0
  954. package/src/cli/pane-functions/screenshot.ts +0 -2122
@@ -1,10 +1,14 @@
1
1
  import { logFailure } from "../../utils/log-failure";
2
2
  import { formatShortDate, parseDisplayDate } from "../../utils/datetime-format";
3
3
  import { formatReportedMoney } from "../../utils/reported-money";
4
- import { convertedPriceEarningsNote, enterpriseValueLabel, enterpriseValueReconciliationNote, epsConversionNote, fundamentalsCurrency, reportedEnterpriseValue, ttmConversionNote } from "../../utils/fundamentals";
4
+ import {
5
+ appTtmRate, computedEnterpriseValueNote, convertedPriceEarningsNote, enterpriseValueLabel, enterpriseValueReconciliationNote, epsConversionNote,
6
+ fundamentalsCurrency, reportedEnterpriseValue, ttmAtAppRate, ttmConversionNote,
7
+ } from "../../utils/fundamentals";
5
8
  import { latestFinancialPeriod } from "../../utils/latest-financial-period";
6
- import { exportedFundamentals, formatPriceEarnings, priceEarningsOnEarnings } from "../../utils/price-earnings";
7
- import { describeFundamentalMarketCap, marketCapShareBasisNote, selectMarketCapitalization } from "../../utils/market-capitalization";
9
+ import { burnsCash, cashRunway, SHORT_RUNWAY_HISTORY, formatRunwayMonths, offeringNote, offeringsAfter, runwayMethod, type CashRunway, type OfferingFiling, type RunwayEstimate } from "../../utils/cash-runway";
10
+ import { exportedFundamentals, formatPriceEarnings, NOT_MEANINGFUL, priceEarningsOnEarnings } from "../../utils/price-earnings";
11
+ import { describeFundamentalMarketCap, marketCapBasisNote, selectMarketCapitalization, viewMarketCapitalization } from "../../utils/market-capitalization";
8
12
  import {
9
13
  formatCompact,
10
14
  formatCurrency,
@@ -34,11 +38,14 @@ import {
34
38
  quoteMarketStateLabel,
35
39
  } from "../../market-data/market/status";
36
40
  import type { FuturesContractTermsPayload } from "../../api-client/futures-curve";
37
- import { changeBasisJson, quoteChangeBasis, quotePreviousCloseDate } from "../../market-data/market/change-basis";
38
- import { futuresContractLines, futuresSettleText, isFuturesInstrument, loadFuturesContractTerms, minorUnitPricePer } from "../../market-data/futures-contract";
39
- import { currencyCodeLabel } from "../../utils/currency-units";
41
+ import { changeBasisJson, quoteChangeBasis, quotePreviousCloseDate, quoteSettleText } from "../../market-data/market/change-basis";
42
+ import {
43
+ futuresContractLines, futuresPricePer, isFuturesInstrument, loadFuturesContractTerms, loadUsdPerMmbtu, usdPerMmbtuText, type UsdPerMmbtu,
44
+ } from "../../market-data/futures-contract";
45
+ import { currencyCodeLabel, heldCurrencyUnit } from "../../utils/currency-units";
46
+ import { quotedFxPair } from "../../utils/currency-pair";
40
47
  import type { AppConfig } from "../../types/config";
41
- import type { DeclaredDividendAction, FinancialStatement, Quote, TickerFinancials } from "../../types/financials";
48
+ import type { CompanyProfile, DeclaredDividendAction, FinancialStatement, Quote, TickerFinancials } from "../../types/financials";
42
49
  import { atRegularSessionPrice, regularSessionValuationPrice } from "../../market-data/quotes/regular-session-valuation";
43
50
  import { computeTickerPriceReturns } from "../../market-data/ticker-price-returns";
44
51
  import { instrumentTypeLabel, resolveTickerInstrumentKind } from "../../tickers/instrument-kind";
@@ -49,7 +56,7 @@ import type { TickerRecord } from "../../types/ticker";
49
56
  import type { CliCommandContext } from "../../types/plugin";
50
57
  import { getPortfolioPositionMetrics, getPortfolioQuoteDisplay, lotCostFxRate, resolvePortfolioMarketValue, resolvePortfolioPositionPnl } from "../../portfolio/position-metrics";
51
58
  import { isFuturesTicker } from "../../portfolio/futures-positions";
52
- import { createBaseConverter, type BaseConversion } from "../base-converter";
59
+ import { createBaseConverter, type BaseConverter } from "../base-converter";
53
60
  import { formatFxRate } from "../fx-pair";
54
61
  import { initMarketData, withMarketData } from "../context";
55
62
  import { fail } from "../errors";
@@ -65,7 +72,7 @@ import {
65
72
  quoteChangeText,
66
73
  } from "../helpers";
67
74
  import { NotesFiles } from "../../plugins/builtin/notes/files";
68
- import { isKnownNonUsListing, secFilingItemCodes } from "../../utils/sec";
75
+ import { isKnownNonUsListing, secFilingItemCodes, US_FUND_FACTS_ONLY } from "../../utils/sec";
69
76
  import { currentReportItemsLabel, hiddenFilingsNote, loadLatestFilings, type HiddenFilings } from "../../utils/sec-filings";
70
77
  import { canonicalExchange, exchangeLabel, isKnownExchangeCode, isUsListingExchange } from "../../utils/exchanges";
71
78
  import {
@@ -73,8 +80,10 @@ import {
73
80
  resolveCliListing, type CliListing, type ListingDataRequest,
74
81
  } from "../listing-arg";
75
82
  import { movedAwayChange } from "../../tickers/ticker-changes";
83
+ import { companyMemberships, loadCompanyMemberships, type CompanyMemberships, type ListMembership } from "../issuer-membership";
76
84
  import { isNotATickerMessage } from "../not-a-ticker";
77
85
  import { sharesOutstandingInReceipts } from "../../utils/depositary-receipt";
86
+ import { depositaryPairText, isReceiptSide, listingDepositaryPair } from "../../market-data/depositary-pair";
78
87
  import { cliFreshnessFooter } from "../result";
79
88
  import { providerMissReason } from "../../sources/provider-errors";
80
89
  import { exportEntriesTable, reportFooterLines, type CliReportTables } from "../report-tables";
@@ -84,12 +93,14 @@ import { distributionHistory, forwardDividendBasis, forwardDividendMayHaveLapsed
84
93
  import { declaredDividends } from "../../utils/declared-dividends";
85
94
  import { historyTrailingDividendYield, measuresTrailingYield } from "../../market-data/quotes/live-valuation";
86
95
  import { notTheCoinNote } from "./crypto-hints";
87
- import { loadStatementFilings, resultsReleaseText, statementPeriodText, type StatementFilingsReport } from "../statement-filings";
96
+ import { loadOfferingFilings, loadStatementFilings, resultsReleaseText, statementPeriodText, type StatementFilingsReport } from "../statement-filings";
88
97
  import type { BankFiguresPayload } from "../../api-client/bank-figures";
89
98
  import { bankSection } from "../bank-section";
90
99
  import type { FundBondFacts } from "../../api-client/fund-facts";
91
100
  import { bondFigures, fetchFundBondFacts, NOT_SEC_YIELD } from "../../market-data/bond-funds";
92
101
  import { taxEquivalentLines, type TaxEquivalentAnalysis } from "../../market-data/tax-equivalent";
102
+ import { isRoundTheClockCoin } from "../../utils/crypto-pair";
103
+ import { coinNewsFallbackNotice } from "../../sources/gloomberb-cloud/news";
93
104
 
94
105
  const NEWS_ITEM_LIMIT = 5;
95
106
  const SEC_FILING_LIMIT = 5;
@@ -164,7 +175,16 @@ function wrapProse(text: string): string {
164
175
  return wrapText(text, Math.min(cliTerminalWidth() ?? MAX_PROSE_WIDTH, MAX_PROSE_WIDTH)).join("\n");
165
176
  }
166
177
 
167
- function buildStatementMetrics(statement: FinancialStatement, currency?: string, codes = false): Array<[string, string]> {
178
+ /** The runway row: months at the latest quarter's burn and at the trailing year's, each with the period it is read over. */
179
+ function cashRunwayText(runway: CashRunway): string {
180
+ const { quarter, trailing, periodEnd } = runway;
181
+ if (quarter?.kind === "no-burn" && trailing?.kind === "no-burn") return `no burn (quarter and TTM to ${periodEnd})`;
182
+ const part = (estimate: RunwayEstimate | null, period: string) => estimate
183
+ ? `${estimate.kind === "no-burn" ? "no burn" : formatRunwayMonths(estimate.months)} (${period} to ${periodEnd})` : null;
184
+ return [part(quarter, "quarter"), trailing ? part(trailing, "TTM") : `TTM ${runway.trailingGap === "short-history" ? SHORT_RUNWAY_HISTORY : "not reported"}`].filter((text): text is string => !!text).join(" \u00b7 ");
185
+ }
186
+
187
+ function buildStatementMetrics(statement: FinancialStatement, currency?: string, codes = false, runway?: CashRunway | null): Array<[string, string]> {
168
188
  const money = (value: number | undefined, perShare = false) => formatReportedMoney(value, currency, perShare, codes);
169
189
  return [
170
190
  ["Revenue", money(statement.totalRevenue)],
@@ -177,6 +197,9 @@ function buildStatementMetrics(statement: FinancialStatement, currency?: string,
177
197
  ["Operating Cash Flow", money(statement.operatingCashFlow)],
178
198
  ["Free Cash Flow", money(statement.freeCashFlow)],
179
199
  ["Cash", money(statement.cashAndCashEquivalents)],
200
+ ["Cash + ST Inv", money(statement.cashCashEquivalentsAndShortTermInvestments)],
201
+ // The latest quarter's only: months of cash at its burn and the trailing year's.
202
+ ...runway ? [["Cash Runway", cashRunwayText(runway)] as [string, string]] : [],
180
203
  ["Total Assets", money(statement.totalAssets)],
181
204
  ["Total Liabilities", money(statement.totalLiabilities)],
182
205
  ["Total Debt", money(statement.totalDebt)],
@@ -193,9 +216,15 @@ function buildStatementMetrics(statement: FinancialStatement, currency?: string,
193
216
  * A receipt's count is its ordinary shares expressed in receipts, as its
194
217
  * market cap is; the ordinary count follows when the service gives it.
195
218
  */
219
+ /** `504.5M (as of 2026-09-03)`: a share count with the day it was counted, when that is known (a 10-K or 10-Q cover count). */
220
+ function datedCount(count: number, asOf: string | undefined): string {
221
+ return asOf ? `${formatCompact(count)} (as of ${asOf})` : formatCompact(count);
222
+ }
223
+
196
224
  function sharesOutstandingText(fundamentals: TickerFinancials["fundamentals"], inReceipts: boolean): string {
197
225
  const shares = fundamentals?.sharesOutstanding;
198
- if (shares == null || !inReceipts) return formatCompact(shares);
226
+ if (shares == null) return formatCompact(shares);
227
+ if (!inReceipts) return datedCount(shares, fundamentals?.sharesOutstandingAsOf);
199
228
  const ordinary = fundamentals?.shareBasis === "depositary_receipt" ? fundamentals.underlyingOrdinaryShares : undefined;
200
229
  return ordinary != null && Number.isFinite(ordinary) && ordinary > 0
201
230
  ? `${formatCompact(shares)} (ADR equivalent = ${formatCompact(ordinary)} ordinary shares)`
@@ -211,6 +240,19 @@ function appendTextSection(lines: string[], title: string, content: string | und
211
240
  lines.push(verbatim ? text : wrapProse(text));
212
241
  }
213
242
 
243
+ /** "Description from ChinaAMC (Hong Kong), Product Key Facts on HKEXnews: https://...": where a quoted description is from. */
244
+ function descriptionSourceLine(profile: CompanyProfile | undefined): string | null {
245
+ const source = profile?.description?.trim() ? profile.descriptionSource : undefined;
246
+ return source?.publisher && source.url ? `Description from ${source.publisher}: ${source.url}` : null;
247
+ }
248
+
249
+ /** The description with where it is from under it, when it is quoted. */
250
+ function appendDescription(lines: string[], profile: CompanyProfile | undefined) {
251
+ appendTextSection(lines, "Description", profile?.description);
252
+ const source = descriptionSourceLine(profile);
253
+ if (source) lines.push(cliStyles.muted(source));
254
+ }
255
+
214
256
  function appendFeedSection(
215
257
  lines: string[],
216
258
  title: string,
@@ -301,7 +343,7 @@ function shouldFetchSecFilings(
301
343
  }
302
344
 
303
345
  async function appendTickerPositions(lines: string[], tickerFile: TickerRecord | null, quote: TickerFinancials["quote"],
304
- config: AppConfig, toBase: ReportBaseConverter): Promise<void> {
346
+ config: AppConfig, toBase: ReportBaseConverter, rates: ReportRateNotes): Promise<void> {
305
347
  const quoteCurrency = quote?.currency?.trim() || tickerFile?.metadata.currency?.trim() || "";
306
348
  const codes = writesCurrencyCodes(config);
307
349
  const money = codes ? formatCurrencyCode : formatCurrency;
@@ -320,13 +362,15 @@ async function appendTickerPositions(lines: string[], tickerFile: TickerRecord |
320
362
  const currentPrice = getPortfolioQuoteDisplay(metrics, quote)?.price ?? null;
321
363
  const currentPriceBase = currentPrice != null && quoteCurrency ? await toBase(currentPrice, quoteCurrency) : null;
322
364
  const positionRate = positionCurrency ? await toBase(1, positionCurrency) : Number.NaN;
323
- if (positionCurrency) converted.add(positionCurrency.toUpperCase());
324
- if (quoteCurrency && currentPrice != null) converted.add(quoteCurrency.toUpperCase());
365
+ // By the major currency the converter states its rate in: pence (GBp, GBX) at GBP's.
366
+ if (positionCurrency) converted.add(heldCurrencyUnit(positionCurrency).currency);
367
+ if (quoteCurrency && currentPrice != null) converted.add(heldCurrencyUnit(quoteCurrency).currency);
325
368
  const baseMetrics = getPortfolioPositionMetrics({ ...tickerFile, metadata: { ...tickerFile.metadata, positions: [position] } }, undefined, quoteCurrency,
326
369
  { currency: config.baseCurrency, convert: value => value * positionRate }, quote);
327
- // A cost bought at an entered rate into the base currency converts at it, as its P&L does; any other at today's.
370
+ // A cost bought at an entered rate into the base currency converts at it, as its P&L does, and says so; any other at today's.
371
+ const boughtRate = positionCurrency ? lotCostFxRate(position, positionCurrency, config.baseCurrency) : null;
328
372
  const costBasisBase = !positionCurrency ? Number.NaN
329
- : lotCostFxRate(position, positionCurrency, config.baseCurrency) !== null ? baseMetrics.signedCost
373
+ : boughtRate !== null ? baseMetrics.signedCost
330
374
  : await toBase(metrics.signedCost, positionCurrency);
331
375
  const marketValueBase = resolvePortfolioMarketValue(baseMetrics, currentPriceBase)?.net ?? Number.NaN;
332
376
  const selectedPnl = resolvePortfolioPositionPnl(baseMetrics, currentPriceBase);
@@ -339,7 +383,8 @@ async function appendTickerPositions(lines: string[], tickerFile: TickerRecord |
339
383
  "Position",
340
384
  `${formatMarketQuantity(metrics.totalShares, { assetCategory: tickerFile.metadata.assetCategory, multiplier: position.multiplier, priceBasis: metrics.priceBasis, quantityCurrency: positionCurrency })} ${metrics.priceBasis === "percent-of-par" ? "@" : `${tickerFile.metadata.assetCategory === "BOND" ? "units" : contracts ? "contracts" : "shares"} @`} ${positionCurrency ? formatMarketCostWithCurrency(position.avgCost, positionCurrency, { assetCategory: tickerFile.metadata.assetCategory, multiplier: position.multiplier, priceBasis: metrics.priceBasis, currencyCode: codes }) : "—"}`,
341
385
  ],
342
- ["Cost Basis", money(costBasisBase, config.baseCurrency)],
386
+ ["Cost Basis", `${money(costBasisBase, config.baseCurrency)}${boughtRate !== null
387
+ ? ` (${formatFxRate(boughtRate)} ${config.baseCurrency.trim().toUpperCase()} per ${positionCurrency} when bought)` : ""}`],
343
388
  ["Market Value", money(marketValueBase, config.baseCurrency)],
344
389
  [
345
390
  selectedPnl.basis === "broker-snapshot" ? "Broker P&L" : "P&L",
@@ -354,12 +399,39 @@ async function appendTickerPositions(lines: string[], tickerFile: TickerRecord |
354
399
  lines.push("");
355
400
  }
356
401
  }
357
- for (const note of conversionNotes(toBase, converted)) lines.push(cliStyles.muted(note));
402
+ for (const note of conversionNotes(toBase, converted, rates)) lines.push(cliStyles.muted(note));
358
403
  }
359
404
  }
360
405
 
361
406
  /** The ticker report's converter: what `createBaseConverter` makes, whose rates a report states; a plain function in tests. */
362
- type ReportBaseConverter = ((value: number, fromCurrency: string) => Promise<number>) & { conversions?(): BaseConversion[] };
407
+ type ReportBaseConverter = ((value: number, fromCurrency: string) => Promise<number>) & Partial<Pick<BaseConverter, "conversions" | "usdRate">>;
408
+
409
+ /**
410
+ * The financials with a converted TTM block at the rate the report converts everything else at, the one `fx`
411
+ * reports (ttmAtAppRate), for the text and the JSON alike; as served when the converter has no rate for it.
412
+ */
413
+ export async function atReportTtmRate(financials: TickerFinancials, toBase: Partial<Pick<BaseConverter, "usdRate">>): Promise<TickerFinancials> {
414
+ const fundamentals = financials.fundamentals;
415
+ const from = fundamentals?.ttmConversion?.from?.trim();
416
+ const to = fundamentals?.financialCurrency?.trim();
417
+ if (!fundamentals || !from || !to || from === to || !toBase.usdRate) return financials;
418
+ const legs = new Map(await Promise.all([from, to].map(async (currency) =>
419
+ [heldCurrencyUnit(currency).currency, await toBase.usdRate!(currency)] as const)));
420
+ const shown = ttmAtAppRate(fundamentals, appTtmRate(fundamentals, (currency) => legs.get(currency)));
421
+ return shown === fundamentals ? financials : { ...financials, fundamentals: shown };
422
+ }
423
+
424
+ /**
425
+ * "TTM figures in ARS; the statements in USD.": a trailing block the source states in another currency than the
426
+ * statements shown below it, which no conversion explains (YPFD on BYMA: ARS figures beside USD statements).
427
+ */
428
+ function ttmCurrencySplitNote(fundamentals: TickerFinancials["fundamentals"], statementCurrencies: ReadonlyArray<string | undefined>): string | undefined {
429
+ const ttm = fundamentals?.financialCurrency?.trim();
430
+ const shown = new Set(statementCurrencies.map((currency) => currency?.trim()).filter((currency): currency is string => !!currency));
431
+ if (!ttm || fundamentals?.ttmConversion || shown.size !== 1) return undefined;
432
+ const [statements] = shown;
433
+ return heldCurrencyUnit(statements).currency === heldCurrencyUnit(ttm).currency ? undefined : `TTM figures in ${ttm}; the statements in ${statements}.`;
434
+ }
363
435
 
364
436
  /**
365
437
  * A base currency other than USD reads every amount with its code (259.36
@@ -372,14 +444,41 @@ export function writesCurrencyCodes(config: Pick<AppConfig, "baseCurrency"> | un
372
444
  }
373
445
 
374
446
  /**
375
- * "CAD at USD/CAD 1.40623, as of 2026-10-21 04:46 UTC.": the rate and its
376
- * date for each currency in `currencies` the report converted into the base
377
- * currency, so a converted figure is never without what it was converted at.
447
+ * What the report's rate notes have said and must say: each currency's rate
448
+ * is stated once, under the first section that converted it, and a lot whose
449
+ * cost converts at the rate entered when it was bought is left out of it.
450
+ */
451
+ interface ReportRateNotes {
452
+ /** Currencies whose rate a note already gave. */
453
+ noted: Set<string>;
454
+ /** Currencies of lots whose Cost Basis is at their own entered rate. */
455
+ boughtAt: ReadonlySet<string>;
456
+ }
457
+
458
+ /** The currencies of the shown lots whose cost converts into the base currency at the rate they were bought at, pence as GBP. */
459
+ function boughtRateCurrencies(tickerFile: TickerRecord | null, quoteCurrency: string, baseCurrency: string): Set<string> {
460
+ return new Set((tickerFile?.metadata.positions ?? []).flatMap((position) => {
461
+ const currency = (position.currency || quoteCurrency).trim();
462
+ return position.shares !== 0 && currency && lotCostFxRate(position, currency, baseCurrency) !== null ? [heldCurrencyUnit(currency).currency] : [];
463
+ }));
464
+ }
465
+
466
+ /**
467
+ * "CAD figures at USD/CAD 1.40623, as of 2026-10-21 04:46 UTC.": the rate
468
+ * and its date for each currency in `currencies` the report converted into
469
+ * the base currency, as markets quote the pair (USD/JPY, not JPY/USD), so a
470
+ * converted figure is never without what it was converted at. A rate already
471
+ * stated is not repeated, and a cost basis at its own rate is excepted.
378
472
  */
379
- function conversionNotes(toBase: ReportBaseConverter, currencies: ReadonlySet<string>): string[] {
473
+ function conversionNotes(toBase: ReportBaseConverter, currencies: ReadonlySet<string>, rates: ReportRateNotes): string[] {
380
474
  return (toBase.conversions?.() ?? [])
381
- .filter((conversion) => currencies.has(conversion.currency) && conversion.currency !== conversion.baseCurrency)
382
- .map(({ currency, baseCurrency, rate, asOf }) => `${baseCurrency} figures at ${currency}/${baseCurrency} ${formatFxRate(rate)}${asOf != null ? `, as of ${formatTimestamp(asOf)}` : ""}.`);
475
+ .filter((conversion) => currencies.has(conversion.currency) && conversion.currency !== conversion.baseCurrency && !rates.noted.has(conversion.currency))
476
+ .map(({ currency, baseCurrency, rate, asOf }) => {
477
+ rates.noted.add(currency);
478
+ const quoted = quotedFxPair(currency, baseCurrency, rate);
479
+ const except = rates.boughtAt.has(currency) ? ", except a cost basis at the rate it was bought at" : "";
480
+ return `${baseCurrency} figures at ${quoted.pair} ${formatFxRate(quoted.rate)}${asOf != null ? `, as of ${formatTimestamp(asOf)}` : ""}${except}.`;
481
+ });
383
482
  }
384
483
 
385
484
  /** A source's enterprise value is in the units of the capitalization it reports beside it,
@@ -411,9 +510,13 @@ function reportedMoney(value: number | undefined, currency: string | undefined,
411
510
  return { text: formatReportedMoney(value, currency, perShare, codes), value, unit: currency?.trim() || "ccy?" };
412
511
  }
413
512
 
414
- /** The EV line: labelled "(provider)" when it is more than 5% from market cap + debt - cash, "unavailable" when withdrawn. */
513
+ /**
514
+ * The EV line: labelled "(provider)" when it is more than 5% from market cap + debt - cash, "unavailable" when
515
+ * withdrawn, N/M at or below zero as a P/E over a loss is.
516
+ */
415
517
  function enterpriseValueFigure(figure: MetricFigure, fundamentals: TickerFinancials["fundamentals"]): MetricFigure {
416
518
  const label = enterpriseValueLabel(fundamentals);
519
+ if (label === "not-meaningful") return { ...multipleFigure(NOT_MEANINGFUL), unit: figure.unit };
417
520
  if (label === "unavailable") return { text: "unavailable", value: null, unit: figure.unit };
418
521
  return label === "provider" && figure.text !== "—" ? { ...figure, text: `${figure.text} (provider)` } : figure;
419
522
  }
@@ -633,6 +736,9 @@ function fundamentalsMetrics(
633
736
  value: fundamentals?.sharesOutstanding,
634
737
  ...(receipt ? { unit: "ADR equivalent" } : {}),
635
738
  },
739
+ ...(fundamentals?.sharesOutstanding != null && fundamentals.sharesOutstandingAsOf ? [{
740
+ label: "Shares Outstanding As Of", text: fundamentals.sharesOutstandingAsOf, value: fundamentals.sharesOutstandingAsOf, exportOnly: true,
741
+ }] : []),
636
742
  ];
637
743
  }
638
744
 
@@ -651,10 +757,12 @@ function floatAndShortInterestMetrics(
651
757
  const days = fundamentals?.shortRatio;
652
758
  const date = fundamentals?.shortInterestDate;
653
759
  const receipt = finite(float) && sharesOutstandingInReceipts(quote, fundamentals, profile?.description);
760
+ const floatAsOf = finite(float) && float > 0 ? fundamentals?.floatSharesAsOf : undefined;
654
761
  return [
655
762
  finite(float) && float > 0
656
- ? { label: "Float", text: formatCompact(float), value: float, ...(receipt ? { unit: "ADR equivalent" } : {}) }
763
+ ? { label: "Float", text: datedCount(float, floatAsOf), value: float, ...(receipt ? { unit: "ADR equivalent" } : {}) }
657
764
  : { label: "Float", text: "—" },
765
+ ...floatAsOf ? [{ label: "Float As Of", text: floatAsOf, value: floatAsOf, exportOnly: true }] : [],
658
766
  finite(short)
659
767
  ? { label: "Short Interest", text: `${formatCompact(short)}${date ? ` (settled ${date})` : ""}`, value: short, unit: "shares" }
660
768
  : { label: "Short Interest", text: "—" },
@@ -671,7 +779,7 @@ function metricLines(metrics: readonly FundamentalsMetric[]): Array<[string, str
671
779
  const TRAILING_MONEY_METRICS = new Set(["EPS (TTM)", "Revenue (TTM)", "Net Income (TTM)", "Operating Cash Flow (TTM)", "Free Cash Flow (TTM)"]);
672
780
 
673
781
  /**
674
- * The notes under shown fundamentals: a market cap that does not rest on the share count shown, how a labelled or
782
+ * The notes under shown fundamentals: a market cap shown as the share count times the price and the provider's, how a labelled or
675
783
  * withdrawn EV compares with market cap + debt - cash, what a converted TTM block was converted from, an EPS in
676
784
  * another currency than the amounts beside it, and what a P/E on such an EPS divides. `priced` is the snapshot at
677
785
  * the regular session price (atRegularSessionPrice), the figures the lines show, so each note reads those.
@@ -683,21 +791,24 @@ function fundamentalsNotes(
683
791
  ): string[] {
684
792
  const fundamentals = priced.fundamentals;
685
793
  const shown = (label: string) => metrics.some((metric) => metric.label === label && metric.text !== "—");
686
- const shareBasis = shown("Market Cap") && shown("Shares Outstanding")
687
- ? marketCapShareBasisNote(selectMarketCapitalization(priced.quote, fundamentals), fundamentals?.sharesOutstanding,
688
- regularSessionValuationPrice(priced.quote), priced.quote?.currency)
794
+ // The cap shown is the share count times the price where the provider's sits more than 2% from it; the note names the provider's.
795
+ const shareBasis = shown("Market Cap")
796
+ ? marketCapBasisNote(viewMarketCapitalization(priced.quote, fundamentals, regularSessionValuationPrice(priced.quote)))
689
797
  : undefined;
690
798
  const conversion = [...TRAILING_MONEY_METRICS].some(shown) ? ttmConversionNote(fundamentals) : undefined;
691
799
  const eps = shown("EPS (TTM)") ? epsConversionNote(fundamentals) : undefined;
692
800
  const priceEarnings = metrics.some((metric) => metric.label === "P/E (TTM)" && typeof metric.value === "number")
693
801
  ? convertedPriceEarningsNote(fundamentals, quoteCurrency)
694
802
  : undefined;
695
- const enterpriseValue = shown("Enterprise Value") ? enterpriseValueReconciliationNote(fundamentals) : undefined;
803
+ // Why the EV is labelled, withdrawn or N/M; for an insurer's, what Gloom Cloud computed it from.
804
+ const enterpriseValue = shown("Enterprise Value")
805
+ ? enterpriseValueReconciliationNote(fundamentals) ?? computedEnterpriseValueNote(fundamentals)
806
+ : undefined;
696
807
  return [shareBasis, enterpriseValue, conversion, eps, priceEarnings].filter((note): note is string => !!note);
697
808
  }
698
809
 
699
810
  // The share count is the market cap's basis: the cap is the count times the price, or a note says why not.
700
- const VALUATION_METRICS = new Set(["Market Cap", "Shares Outstanding", "Enterprise Value", "P/E (TTM)", "Forward P/E", "PEG", "EPS (TTM)"]);
811
+ const VALUATION_METRICS = new Set(["Market Cap", "Shares Outstanding", "Shares Outstanding As Of", "Enterprise Value", "P/E (TTM)", "Forward P/E", "PEG", "EPS (TTM)"]);
701
812
 
702
813
  type FundamentalsReportData = TickerFinancials & {
703
814
  symbol: string;
@@ -741,7 +852,7 @@ function fundFactsNote(
741
852
  if (resolveTickerInstrumentKind(tickerFile, financials) !== "fund") return null;
742
853
  return !exchange || isUsListingExchange(exchange)
743
854
  ? `Fund facts (fee, NAV, premium, net assets): fn ETF ${symbol}.`
744
- : "Fund facts (fee, NAV, premium) cover US-listed funds only.";
855
+ : US_FUND_FACTS_ONLY;
745
856
  }
746
857
 
747
858
  /**
@@ -797,7 +908,7 @@ function fundamentalsReportMetrics(snapshot: FundamentalsReportData, view: "fund
797
908
  const financials = atRegularSessionPrice(snapshot);
798
909
  const quote = financials.quote;
799
910
  const fundamentals = financials.fundamentals;
800
- const capitalization = selectMarketCapitalization(quote, fundamentals);
911
+ const capitalization = viewMarketCapitalization(quote, fundamentals, regularSessionValuationPrice(quote));
801
912
  const marketCap: MetricFigure = capitalization
802
913
  ? { text: `${formatCompact(capitalization.value)} ${capitalization.currency}`, value: capitalization.value, unit: capitalization.currency }
803
914
  : { text: "—" };
@@ -809,13 +920,14 @@ function fundamentalsReportMetrics(snapshot: FundamentalsReportData, view: "fund
809
920
  }
810
921
  const valued = metrics.filter(({ label, text }) => (VALUATION_METRICS.has(label) || isYieldMetric(label)) && text !== "—");
811
922
  // The share count follows the market cap it is the basis of.
812
- const shares = valued.filter((metric) => metric.label === "Shares Outstanding");
813
- const valuation = valued.flatMap((metric) => metric.label === "Shares Outstanding" ? [] : metric.label === "Market Cap" ? [metric, ...shares] : [metric]);
923
+ const isShares = (label: string) => label === "Shares Outstanding" || label === "Shares Outstanding As Of";
924
+ const shares = valued.filter((metric) => isShares(metric.label));
925
+ const valuation = valued.flatMap((metric) => isShares(metric.label) ? [] : metric.label === "Market Cap" ? [metric, ...shares] : [metric]);
814
926
  // A listing with no valuation (a fund) says so rather than printing its price alone.
815
927
  return valuation.length === 0 ? [] : [...valuationPriceMetrics(financials).filter((metric) => metric.text !== "—"), ...valuation];
816
928
  }
817
929
 
818
- /** Text for `gloomberb fundamentals` and `gloomberb valuation`: the ticker report's fundamentals without the rest. */
930
+ /** Text for `gloom fundamentals` and `gloom valuation`: the ticker report's fundamentals without the rest. */
819
931
  export function renderFundamentalsReport(
820
932
  financials: FundamentalsReportData,
821
933
  view: "fundamentals" | "valuation",
@@ -851,7 +963,7 @@ export function renderFundamentalsReport(
851
963
  } else if (financials.bankNote) {
852
964
  lines.push("", renderSection("Bank"), cliStyles.muted(financials.bankNote));
853
965
  }
854
- appendTextSection(lines, "Description", profile?.description);
966
+ appendDescription(lines, profile);
855
967
  }
856
968
  return lines.join("\n");
857
969
  }
@@ -898,6 +1010,10 @@ export function fundamentalsReportTables(
898
1010
  { label: "Sector", value: profile?.sector },
899
1011
  { label: "Industry", value: profile?.industry },
900
1012
  { label: "Description", value: profile?.description?.trim() },
1013
+ ...profile?.description?.trim() && profile.descriptionSource ? [
1014
+ { label: "Description Source", value: profile.descriptionSource.publisher },
1015
+ { label: "Description URL", value: profile.descriptionSource.url },
1016
+ ] : [],
901
1017
  ].filter((entry) => typeof entry.value === "string" && entry.value.trim().length > 0)));
902
1018
  }
903
1019
  return {
@@ -944,13 +1060,20 @@ export async function buildTickerReport({
944
1060
  recentSecFilings = [],
945
1061
  hiddenSecFilings = NOTHING_HIDDEN,
946
1062
  futuresContract = null,
1063
+ usdPerMmbtu = null,
947
1064
  distributions = null,
948
1065
  statementFilings = null,
949
1066
  bondFund = null,
1067
+ memberships,
1068
+ offerings = [],
950
1069
  }: {
951
1070
  symbol: string;
1071
+ /** The lists holding the company, by any of its listings (loadCompanyMemberships); the saved listing's own lists when absent. */
1072
+ memberships?: CompanyMemberships;
952
1073
  /** The filings behind the latest statements, and a newer quarter's results release. */
953
1074
  statementFilings?: StatementFilingsReport | null;
1075
+ /** The company's latest offering prospectuses (424B5, 424B4); those after the latest balance sheet get a note. */
1076
+ offerings?: readonly OfferingFiling[];
954
1077
  /** A bond fund's SEC yield, yield to worst and duration (loadReportBondFacts). */
955
1078
  bondFund?: FundBondFacts | null;
956
1079
  /** The distributions a dividend yield is read with (loadDividendDistributions). */
@@ -959,6 +1082,8 @@ export async function buildTickerReport({
959
1082
  listingExchange?: string;
960
1083
  /** A futures symbol's contract terms and latest confirmed settlement. */
961
1084
  futuresContract?: FuturesContractTermsPayload | null;
1085
+ /** A per-MWh gas price (Dutch TTF) in dollars per MMBtu, at the day's rate. */
1086
+ usdPerMmbtu?: UsdPerMmbtu | null;
962
1087
  tickerFile: TickerRecord | null;
963
1088
  financials: TickerFinancials;
964
1089
  config: AppConfig;
@@ -981,6 +1106,10 @@ export async function buildTickerReport({
981
1106
  const baseQuoteOptions = quoteFormatOptions(quote, tickerFile?.metadata.assetCategory, financials.quoteMetadata?.instrumentType);
982
1107
  const baseCurrency = config.baseCurrency.trim().toUpperCase();
983
1108
  const codes = writesCurrencyCodes(config);
1109
+ const rates: ReportRateNotes = {
1110
+ noted: new Set(),
1111
+ boughtAt: boughtRateCurrencies(tickerFile, quote?.currency?.trim() || tickerFile?.metadata.currency?.trim() || "", config.baseCurrency),
1112
+ };
984
1113
  // Pad money prices to the currency's minor unit so a range reads £35.10 - £35.485, never past it (JPY has none).
985
1114
  const quoteOptions = withCurrencyMinorDigits(codes ? { ...baseQuoteOptions, currencyCode: true } : baseQuoteOptions, quote?.currency);
986
1115
  const lines: string[] = [];
@@ -1014,15 +1143,21 @@ export async function buildTickerReport({
1014
1143
  if (metadataParts.length > 0) {
1015
1144
  lines.push(cliStyles.muted(metadataParts.join(METADATA_SEPARATOR)));
1016
1145
  }
1146
+ // A receipt and its home line each state the ratio, and where the two are compared.
1147
+ const depositaryPair = listingDepositaryPair(financials);
1148
+ if (depositaryPair) {
1149
+ lines.push(cliStyles.muted(`ADR ratio ${depositaryPairText(depositaryPair, isReceiptSide(financials))}. Implied FX and premium: gloom fn ADR ${quote?.symbol ?? symbol}`));
1150
+ }
1017
1151
 
1018
- const portfolioNames = tickerFile ? formatPortfolioNames(config, tickerFile.metadata.portfolios) : [];
1019
- const watchlistNames = tickerFile ? formatWatchlistNames(config, tickerFile.metadata.watchlists) : [];
1152
+ // A list that holds the company as another of its listings says which: "Watchlists R (as RCI.B:TSX)".
1153
+ const lists = memberships ?? companyMemberships(config, tickerFile, [], null);
1154
+ const listNames = (held: readonly ListMembership[]) => held.map((list) => list.via ? `${list.name} (as ${list.via})` : list.name).join(", ");
1020
1155
  const membershipParts = [
1021
- portfolioNames.length > 0
1022
- ? `Portfolios ${portfolioNames.join(", ")}`
1156
+ lists.portfolios.length > 0
1157
+ ? `Portfolios ${listNames(lists.portfolios)}`
1023
1158
  : undefined,
1024
- watchlistNames.length > 0
1025
- ? `Watchlists ${watchlistNames.join(", ")}`
1159
+ lists.watchlists.length > 0
1160
+ ? `Watchlists ${listNames(lists.watchlists)}`
1026
1161
  : undefined,
1027
1162
  ].filter((part): part is string => !!part);
1028
1163
  if (membershipParts.length > 0) {
@@ -1031,15 +1166,18 @@ export async function buildTickerReport({
1031
1166
 
1032
1167
  // Market cap and the multiples are measured at the regular session price the Quote section heads with.
1033
1168
  const priced = atRegularSessionPrice(financials);
1034
- const capitalization = selectMarketCapitalization(priced.quote, priced.fundamentals);
1169
+ const capitalization = viewMarketCapitalization(priced.quote, priced.fundamentals, regularSessionValuationPrice(priced.quote));
1035
1170
  // Market cap and EV read in the currency they are reported in, as the revenue and income beside them do,
1036
1171
  // with the base currency's figure after them when it differs: 627.2B USD (878.15B CAD).
1037
1172
  const convertedCurrencies = new Set<string>();
1038
1173
  const inBase = async (value: number, currency: string): Promise<string> => {
1039
- if (currency.trim().toUpperCase() === baseCurrency) return "";
1040
- const converted = await toBase(value, currency);
1174
+ // A minor unit converts as the hundredth of its currency it is: 2.75T GBp is 27.5B GBP, never 2.75T GBP.
1175
+ const unit = heldCurrencyUnit(currency);
1176
+ if (!unit.currency || (unit.currency === baseCurrency && unit.divisor === 1)) return "";
1177
+ const major = value / unit.divisor;
1178
+ const converted = unit.currency === baseCurrency ? major : await toBase(major, unit.currency);
1041
1179
  if (!Number.isFinite(converted)) return "";
1042
- convertedCurrencies.add(currency.trim().toUpperCase());
1180
+ if (unit.currency !== baseCurrency) convertedCurrencies.add(unit.currency);
1043
1181
  return ` (${formatCompact(converted)} ${baseCurrency})`;
1044
1182
  };
1045
1183
  const marketCapText = capitalization
@@ -1048,8 +1186,7 @@ export async function buildTickerReport({
1048
1186
  // Shown in the same currency as the market cap, so the two can be compared.
1049
1187
  const enterpriseValue = reportedEnterpriseValue(priced.fundamentals);
1050
1188
  const evCurrency = enterpriseValueCurrency(quote, fundamentals);
1051
- // A minor unit such as GBp stays as reported: the converter would read it as the major currency.
1052
- const enterpriseValueText = `${formatReportedMoney(enterpriseValue, evCurrency)}${enterpriseValue != null && evCurrency && /^[A-Z]{3}$/.test(evCurrency)
1189
+ const enterpriseValueText = `${formatReportedMoney(enterpriseValue, evCurrency)}${enterpriseValue != null && evCurrency
1053
1190
  ? await inBase(enterpriseValue, evCurrency) : ""}`;
1054
1191
 
1055
1192
  if (quote) {
@@ -1066,12 +1203,14 @@ export async function buildTickerReport({
1066
1203
  // A futures price is its latest trade; the exchange settlement is its own row, dated by its session.
1067
1204
  appendMetricSection(lines, "Quote", [
1068
1205
  // A price in cents says what it is per: 314.95¢/lb.
1069
- ["Last", colorBySign(`${formatMarketPriceWithCurrency(session.price, quote.currency, quoteOptions)}${minorUnitPricePer(futuresContract, quote.currency)}`, session.change)],
1206
+ ["Last", colorBySign(`${formatMarketPriceWithCurrency(session.price, quote.currency, quoteOptions)}${futuresPricePer(futuresContract, quote.currency)}`, session.change)],
1070
1207
  ...futuresContract
1071
- ? [["Settle", futuresSettleText(futuresContract, quote)] as [string, string]]
1208
+ ? [["Settle", quoteSettleText(quote, futuresContract)] as [string, string]]
1072
1209
  : [],
1073
1210
  // The move says what it is measured from: "vs Fri 16 Oct close", a future's "vs Fri 16 Oct settle".
1074
1211
  ["Change", quoteChangeText(quote, session, quoteOptions, futuresContract)],
1212
+ // European gas beside Henry Hub: "≈ $30.832/MMBtu at EUR/USD 1.1650", a conversion that says so.
1213
+ ...usdPerMmbtu ? [["In USD", usdPerMmbtuText(usdPerMmbtu)] as [string, string]] : [],
1075
1214
  ["Open", quote.open != null ? formatMarketPriceWithCurrency(quote.open, quote.currency, quoteOptions) : "—"],
1076
1215
  // A listing that no longer trades: its last session's range, never today's.
1077
1216
  [quote.delisting ? "Last Session" : "Day Range", quote.low != null || quote.high != null
@@ -1096,10 +1235,23 @@ export async function buildTickerReport({
1096
1235
 
1097
1236
  const metrics = fundamentalsMetrics(quote, priced.fundamentals, profile, { text: marketCapText }, priceReturns, fundamentalsCurrency(financials),
1098
1237
  { text: enterpriseValueText }, distributions, bondFund, codes);
1238
+ const reportedCurrency = financials.financialCurrency?.trim();
1239
+ const statements = [...financials.annualStatements, ...financials.quarterlyStatements];
1240
+ const fallbackCurrency = reportedCurrency && statements.every((row) => !row.currency?.trim() || row.currency.trim() === reportedCurrency)
1241
+ ? reportedCurrency : undefined;
1242
+ const statementCurrency = (row: FinancialStatement) => row.currency?.trim() || fallbackCurrency;
1243
+ const latestAnnual = latestFinancialPeriod(financials.annualStatements, row => row.date);
1244
+ const latestQuarter = latestFinancialPeriod(financials.quarterlyStatements, row => row.date);
1245
+
1099
1246
  const beforeFundamentals = lines.length;
1100
1247
  appendMetricSection(lines, "Fundamentals", metricLines(metrics));
1101
1248
  for (const note of fundamentalsNotes(priced, metrics, quote?.currency)) lines.push(cliStyles.muted(note));
1102
- if (lines.length > beforeFundamentals) for (const note of conversionNotes(toBase, convertedCurrencies)) lines.push(cliStyles.muted(note));
1249
+ // The trailing block beside statements in another currency, when no conversion says why.
1250
+ const split = metrics.some((metric) => TRAILING_MONEY_METRICS.has(metric.label) && metric.text !== "—")
1251
+ ? ttmCurrencySplitNote(priced.fundamentals, [latestAnnual, latestQuarter].flatMap((row) => row ? [statementCurrency(row)] : []))
1252
+ : undefined;
1253
+ if (split) lines.push(cliStyles.muted(split));
1254
+ if (lines.length > beforeFundamentals) for (const note of conversionNotes(toBase, convertedCurrencies, rates)) lines.push(cliStyles.muted(note));
1103
1255
  // Where a fund's facts would go: under its fundamentals, or in their place.
1104
1256
  const fund = fundFactsNote(quote?.symbol ?? symbol,
1105
1257
  quote?.tradingExchangeName || listingExchange || quote?.listingExchangeName || quote?.exchangeName || tickerFile?.metadata.exchange, financials, tickerFile);
@@ -1109,26 +1261,24 @@ export async function buildTickerReport({
1109
1261
  lines.push(cliStyles.muted(`Market cap: ${describeFundamentalMarketCap(capitalization.provenance)}.`));
1110
1262
  }
1111
1263
 
1112
- const reportedCurrency = financials.financialCurrency?.trim();
1113
- const statements = [...financials.annualStatements, ...financials.quarterlyStatements];
1114
- const fallbackCurrency = reportedCurrency && statements.every((row) => !row.currency?.trim() || row.currency.trim() === reportedCurrency)
1115
- ? reportedCurrency : undefined;
1116
- const statementCurrency = (row: FinancialStatement) => row.currency?.trim() || fallbackCurrency;
1117
- const latestAnnual = latestFinancialPeriod(financials.annualStatements, row => row.date);
1118
1264
  if (latestAnnual) {
1119
1265
  appendMetricSection(lines, `Latest Annual (${statementPeriodText(latestAnnual.date, statementFilings?.latestAnnual ?? null)})`,
1120
1266
  buildStatementMetrics(latestAnnual, statementCurrency(latestAnnual), codes));
1121
1267
  }
1122
1268
 
1123
- const latestQuarter = latestFinancialPeriod(financials.quarterlyStatements, row => row.date);
1124
1269
  if (latestQuarter) {
1270
+ const runway = cashRunway(financials);
1125
1271
  appendMetricSection(lines, `Latest Quarter (${statementPeriodText(latestQuarter.date, statementFilings?.latestQuarter ?? null)})`,
1126
- buildStatementMetrics(latestQuarter, statementCurrency(latestQuarter), codes));
1272
+ buildStatementMetrics(latestQuarter, statementCurrency(latestQuarter), codes, runway));
1273
+ // How the months are counted, and an offering since the balance sheet that the cash does not include yet.
1274
+ if (burnsCash(runway)) lines.push(cliStyles.muted(runwayMethod(runway.includesShortTerm)));
1275
+ const offering = runway ? offeringNote(offeringsAfter(offerings, runway.periodEnd), runway.periodEnd) : null;
1276
+ if (offering) lines.push(cliStyles.muted(offering));
1127
1277
  }
1128
1278
  // The statements stop a quarter short of the results the company has released.
1129
1279
  if (statementFilings?.resultsRelease && (latestAnnual || latestQuarter)) lines.push(cliStyles.muted(resultsReleaseText(statementFilings.resultsRelease)));
1130
1280
 
1131
- appendTextSection(lines, "Description", profile?.description);
1281
+ appendDescription(lines, profile);
1132
1282
 
1133
1283
  appendTextSection(lines, "Notes", notes, true);
1134
1284
 
@@ -1143,7 +1293,7 @@ export async function buildTickerReport({
1143
1293
  ],
1144
1294
  body: item.summary,
1145
1295
  link: item.url,
1146
- })));
1296
+ })), recentNews[0]?.searchedFor ? coinNewsFallbackNotice(symbol, recentNews[0].searchedFor) : null);
1147
1297
 
1148
1298
  appendFeedSection(lines, "Recent SEC Filings", recentSecFilings.map((filing) => ({
1149
1299
  title: (() => {
@@ -1159,7 +1309,7 @@ export async function buildTickerReport({
1159
1309
  link: filing.filingUrl,
1160
1310
  })), hiddenFilingsNote(hiddenSecFilings));
1161
1311
 
1162
- await appendTickerPositions(lines, tickerFile, quote, config, toBase);
1312
+ await appendTickerPositions(lines, tickerFile, quote, config, toBase, rates);
1163
1313
 
1164
1314
  return lines.join("\n");
1165
1315
  }
@@ -1175,15 +1325,22 @@ function buildTickerStructuredData({
1175
1325
  recentSecFilings,
1176
1326
  hiddenSecFilings,
1177
1327
  futuresContract,
1328
+ usdPerMmbtu = null,
1178
1329
  distributions,
1179
1330
  statementFilings,
1180
1331
  bondFund = null,
1332
+ memberships,
1333
+ offerings = [],
1181
1334
  }: {
1182
1335
  symbol: string;
1183
1336
  listing: CliListing;
1337
+ memberships: CompanyMemberships;
1184
1338
  statementFilings: StatementFilingsReport | null;
1339
+ offerings?: readonly OfferingFiling[];
1185
1340
  bondFund?: FundBondFacts | null;
1186
1341
  futuresContract: FuturesContractTermsPayload | null;
1342
+ /** A per-MWh gas price in dollars per MMBtu, and the rate it was converted at. */
1343
+ usdPerMmbtu?: UsdPerMmbtu | null;
1187
1344
  distributions: DividendDistributions | null;
1188
1345
  tickerFile: TickerRecord | null;
1189
1346
  financials: TickerFinancials;
@@ -1198,6 +1355,7 @@ function buildTickerStructuredData({
1198
1355
  const identity = listingIdentity(listing, quote);
1199
1356
  // Market cap and the multiples at the regular session price, as the text report gives them.
1200
1357
  const priced = atRegularSessionPrice(financials);
1358
+ const runway = cashRunway(financials);
1201
1359
  return {
1202
1360
  symbol,
1203
1361
  listing: { symbol: identity.symbol, exchange: identity.exchange || null, name: identity.name },
@@ -1223,8 +1381,11 @@ function buildTickerStructuredData({
1223
1381
  lastUpdated: quote.lastUpdated ? new Date(quote.lastUpdated).toISOString() : "",
1224
1382
  } : null,
1225
1383
  quoteMetadata: financials.quoteMetadata,
1384
+ // The receipt pair the listing is a side of, and which side.
1385
+ ...depositaryPairJson(financials),
1226
1386
  // Only for futures: the contract the symbol prices, its terms and its latest confirmed settlement.
1227
1387
  ...futuresContract ? { futuresContract } : {},
1388
+ ...usdPerMmbtu ? { usdPerMmbtu } : {},
1228
1389
  ticker: tickerFile ? {
1229
1390
  ticker: tickerFile.metadata.ticker,
1230
1391
  name: tickerFile.metadata.name ?? "",
@@ -1236,6 +1397,8 @@ function buildTickerStructuredData({
1236
1397
  watchlists: formatWatchlistNames(config, tickerFile.metadata.watchlists),
1237
1398
  positions: tickerFile.metadata.positions,
1238
1399
  } : null,
1400
+ // The lists holding the company by any of its listings; `via` names the other listing a list holds it as.
1401
+ memberships,
1239
1402
  fundamentals: financials.fundamentals || priceReturns.return1Y != null || priceReturns.return3Y != null ? exportedDividendFundamentals(exportedFundamentals({
1240
1403
  ...priced.fundamentals,
1241
1404
  ...priceReturns,
@@ -1249,6 +1412,10 @@ function buildTickerStructuredData({
1249
1412
  latestQuarter: latestFinancialPeriod(financials.quarterlyStatements, row => row.date) ?? null,
1250
1413
  annualStatementCount: financials.annualStatements.length,
1251
1414
  quarterlyStatementCount: financials.quarterlyStatements.length,
1415
+ // Months of cash at the latest quarter's balance sheet, at its operating burn and the trailing year's,
1416
+ // and the offering prospectuses filed since that the cash does not include.
1417
+ cashRunway: runway,
1418
+ offeringsAfterBalanceSheet: runway ? offeringsAfter(offerings, runway.periodEnd) : [],
1252
1419
  // The form and filed date of the latest periods' filings, and a newer quarter's results released before its statements.
1253
1420
  statementFilings,
1254
1421
  notes,
@@ -1276,6 +1443,13 @@ function buildTickerStructuredData({
1276
1443
  };
1277
1444
  }
1278
1445
 
1446
+ function depositaryPairJson(financials: TickerFinancials) {
1447
+ const pair = listingDepositaryPair(financials);
1448
+ if (!pair) return {};
1449
+ const receipt = isReceiptSide(financials);
1450
+ return { depositaryPair: { ...pair, side: receipt ? "receipt" : "home", text: depositaryPairText(pair, receipt) } };
1451
+ }
1452
+
1279
1453
  const QUOTE_UNAVAILABLE = "Quote unavailable.";
1280
1454
 
1281
1455
  /** Asks for the quote the report lacks once more, for the reason the data service gave when it had none. */
@@ -1368,6 +1542,17 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
1368
1542
  quarter: latestFinancialPeriod(resolvedFinancials.quarterlyStatements, (row) => row.date),
1369
1543
  annual: latestFinancialPeriod(resolvedFinancials.annualStatements, (row) => row.date),
1370
1544
  });
1545
+ // A list holding the company as another of its listings counts (a list of RCI.B:TSX holds RCI); read beside the rest. It never fails.
1546
+ const membershipsLoad = loadCompanyMemberships({
1547
+ config,
1548
+ own: tickerFile,
1549
+ symbol: listing.symbol,
1550
+ exchange: canonicalExchange(listing.exchange || quote?.listingExchangeName || quote?.exchangeName || tickerFile?.metadata.exchange),
1551
+ loadTickers: () => store.loadAllTickers(),
1552
+ dataProvider,
1553
+ });
1554
+ // An offering since the latest balance sheet, read only when the report has a runway to flag.
1555
+ const offerings = loadOfferingFilings(statementSources, { symbol: requestSymbol, exchange }, cashRunway(resolvedFinancials) != null);
1371
1556
  const [notesResult, newsResult, secFilingsResult] = await Promise.allSettled([
1372
1557
  notesFiles.load(tickerFile?.metadata.ticker ?? normalized),
1373
1558
  dataProvider.getNews({
@@ -1378,6 +1563,10 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
1378
1563
  exchange: exchange || quote?.exchangeName || "",
1379
1564
  tickerTier: "primary",
1380
1565
  limit: NEWS_ITEM_LIMIT,
1566
+ // A coin pair with no story filed under it searches for the coin by this name.
1567
+ ...(isRoundTheClockCoin(requestSymbol, exchange || quote?.exchangeName) && (quote?.name || tickerFile?.metadata.name)
1568
+ ? { listingName: quote?.name || tickerFile?.metadata.name }
1569
+ : {}),
1381
1570
  }),
1382
1571
  // Outside the US the lookup checks the SEC registrant against the listing's company,
1383
1572
  // and refuses another company's filings.
@@ -1388,6 +1577,9 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
1388
1577
  ]);
1389
1578
 
1390
1579
  const futuresContract = await cliFuturesContract(quote?.symbol ?? requestSymbol, quote?.instrumentType, dependencies.futuresContract);
1580
+ // A per-MWh gas price (TTF) adds its dollars per MMBtu at the day's rate, to read beside Henry Hub.
1581
+ const usdPerMmbtu = await loadUsdPerMmbtu(getRegularSessionDisplay(quote)?.price, futuresContract, quote?.currency,
1582
+ (currency) => dataProvider.getExchangeRate(currency));
1391
1583
  const notes = notesResult.status === "fulfilled" ? notesResult.value : "";
1392
1584
  const recentNews = newsResult.status === "fulfilled" ? newsResult.value : [];
1393
1585
  const { filings: recentSecFilings, hidden: hiddenSecFilings } = secFilingsResult.status === "fulfilled"
@@ -1401,8 +1593,12 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
1401
1593
  const coinNote = listing.exchange ? null
1402
1594
  : notTheCoinNote(listing.symbol, quote ?? (tickerFile ? { name: tickerFile.metadata.name, instrumentType: tickerFile.metadata.assetCategory } : null));
1403
1595
  const listingNote = [choiceNote, coinNote].filter((note): note is string => !!note).join("\n") || undefined;
1596
+ const memberships = await membershipsLoad;
1597
+ // A converted TTM block at the rate the rest of the report converts at, the one `fx` reports.
1598
+ const shownFinancials = await atReportTtmRate(resolvedFinancials, toBase);
1404
1599
  if (dependencies.printResult) {
1405
- const warnings = [choiceNote, coinNote, quoteNote].filter((note): note is string => !!note);
1600
+ const newsNote = recentNews[0]?.searchedFor ? coinNewsFallbackNotice(requestSymbol, recentNews[0].searchedFor) : null;
1601
+ const warnings = [choiceNote, coinNote, quoteNote, newsNote].filter((note): note is string => !!note);
1406
1602
  dependencies.printResult({
1407
1603
  freshness,
1408
1604
  warnings: warnings.length > 0 ? warnings : undefined,
@@ -1410,16 +1606,19 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
1410
1606
  symbol: normalized,
1411
1607
  listing,
1412
1608
  tickerFile,
1413
- financials: resolvedFinancials,
1609
+ financials: shownFinancials,
1414
1610
  config,
1415
1611
  notes,
1416
1612
  recentNews,
1417
1613
  recentSecFilings,
1418
1614
  hiddenSecFilings,
1419
1615
  futuresContract,
1616
+ usdPerMmbtu,
1420
1617
  distributions: await distributions,
1421
1618
  statementFilings: await statementFilings,
1422
1619
  bondFund: await bondFund,
1620
+ memberships,
1621
+ offerings: await offerings,
1423
1622
  }),
1424
1623
  });
1425
1624
  return;
@@ -1429,7 +1628,7 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
1429
1628
  symbol: normalized,
1430
1629
  listingExchange: listing.exchange,
1431
1630
  tickerFile,
1432
- financials: resolvedFinancials,
1631
+ financials: shownFinancials,
1433
1632
  config,
1434
1633
  toBase,
1435
1634
  notes,
@@ -1439,10 +1638,13 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
1439
1638
  recentSecFilings,
1440
1639
  hiddenSecFilings,
1441
1640
  futuresContract,
1641
+ usdPerMmbtu,
1442
1642
  distributions: await distributions,
1443
1643
  statementFilings: await statementFilings,
1444
1644
  bondFund: await bondFund,
1645
+ memberships,
1646
+ offerings: await offerings,
1445
1647
  }));
1446
- if (freshness) console.log(`\n${cliFreshnessFooter(freshness)}`);
1648
+ if (freshness) console.log(`\n${cliFreshnessFooter(freshness, quote ?? resolvedFinancials)}`);
1447
1649
  });
1448
1650
  }