gloomberb 0.18.3 → 0.18.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (886) hide show
  1. package/README.md +8 -8
  2. package/README.zh-CN.md +11 -11
  3. package/bin/{gloomberb → gloom} +3 -1
  4. package/package.json +6 -2
  5. package/src/account/checkout-handoff.tsx +225 -0
  6. package/src/account/device-signin-dialog.tsx +2 -2
  7. package/src/account/device-signin.ts +2 -2
  8. package/src/account/upgrade-dialog.tsx +1 -1
  9. package/src/api-client/askg.ts +2 -2
  10. package/src/api-client/auth.ts +2 -2
  11. package/src/api-client/central-bank-rates.ts +6 -0
  12. package/src/api-client/collections.ts +5 -1
  13. package/src/api-client/cot.ts +2 -0
  14. package/src/api-client/crypto-etf-flows.ts +37 -0
  15. package/src/api-client/crypto-markets.ts +60 -0
  16. package/src/api-client/data.ts +84 -5
  17. package/src/api-client/doe.ts +15 -0
  18. package/src/api-client/equity-screener.ts +28 -0
  19. package/src/api-client/exchange-announcements.ts +38 -0
  20. package/src/api-client/fund-facts.ts +39 -0
  21. package/src/api-client/futures-curve.ts +9 -1
  22. package/src/api-client/hiring.ts +301 -0
  23. package/src/api-client/index.ts +22 -5
  24. package/src/api-client/market-discovery.ts +14 -0
  25. package/src/api-client/members.ts +6 -0
  26. package/src/api-client/mna.ts +6 -0
  27. package/src/api-client/paths.ts +18 -1
  28. package/src/api-client/request.ts +21 -4
  29. package/src/api-client/short-side-publications.ts +37 -0
  30. package/src/api-client/socket.ts +64 -4
  31. package/src/api-client/swap-curve.ts +35 -0
  32. package/src/api-client/themes.ts +7 -1
  33. package/src/api-client/types.ts +90 -2
  34. package/src/app/pane-runtime/plugin-bindings.ts +9 -2
  35. package/src/app/runtime/desktop-deeplink.ts +5 -5
  36. package/src/app/runtime/plugin-bindings.ts +2 -2
  37. package/src/app/runtime/startup.ts +13 -0
  38. package/src/app/star-prompt/status-line.tsx +2 -2
  39. package/src/architecture/core-builtin-allowlist.json +5 -2
  40. package/src/architecture/ui-literals-allowlist.json +3 -3
  41. package/src/architecture/ui-tokens-allowlist.json +1 -1
  42. package/src/brokers/broker-portfolio-sync.ts +37 -0
  43. package/src/brokers/directory.ts +11 -0
  44. package/src/brokers/logos.ts +3 -1
  45. package/src/brokers/signed-in/adapter.ts +304 -26
  46. package/src/brokers/signed-in/client.ts +14 -2
  47. package/src/brokers/signed-in/connect.ts +10 -2
  48. package/src/brokers/sync-broker-instance.ts +9 -1
  49. package/src/capabilities/chart-series.ts +22 -6
  50. package/src/cli/bank-section.ts +1 -1
  51. package/src/cli/base-converter.ts +23 -14
  52. package/src/cli/central-bank-events.ts +1 -1
  53. package/src/cli/command-options.ts +59 -4
  54. package/src/cli/commands/api.ts +9 -6
  55. package/src/cli/commands/broker.ts +2 -2
  56. package/src/cli/commands/command-utils.ts +2 -2
  57. package/src/cli/commands/crypto-hints.ts +7 -20
  58. package/src/cli/commands/fred-series.ts +4 -2
  59. package/src/cli/commands/keybindings.ts +2 -2
  60. package/src/cli/commands/market.ts +1117 -264
  61. package/src/cli/commands/news-hints.ts +2 -2
  62. package/src/cli/commands/news-search.ts +59 -6
  63. package/src/cli/commands/options-leaps.ts +41 -26
  64. package/src/cli/commands/overview.ts +121 -48
  65. package/src/cli/commands/plugins.ts +9 -9
  66. package/src/cli/commands/remote.ts +13 -10
  67. package/src/cli/commands/search.ts +64 -44
  68. package/src/cli/commands/system.ts +27 -19
  69. package/src/cli/commands/themes.ts +1 -1
  70. package/src/cli/commands/ticker.ts +192 -47
  71. package/src/cli/context.ts +3 -2
  72. package/src/cli/desktop-pane-shot-view.ts +2 -2
  73. package/src/cli/desktop-pane-shot.ts +1 -1
  74. package/src/cli/earnings-calendar.ts +4 -4
  75. package/src/cli/entry.ts +18 -1
  76. package/src/cli/errors.ts +20 -2
  77. package/src/cli/exit-codes.ts +1 -1
  78. package/src/cli/export-source.ts +10 -4
  79. package/src/cli/freshness.ts +2 -8
  80. package/src/cli/fx-forward.ts +130 -0
  81. package/src/cli/fx-pair.ts +10 -9
  82. package/src/cli/glossary.ts +64 -20
  83. package/src/cli/help.ts +19 -13
  84. package/src/cli/history-export.ts +126 -0
  85. package/src/cli/history-rows.ts +196 -43
  86. package/src/cli/index-roots.ts +5 -45
  87. package/src/cli/index.ts +24 -18
  88. package/src/cli/known-gaps.ts +118 -25
  89. package/src/cli/listing-arg.ts +300 -41
  90. package/src/cli/name-entries.ts +30 -18
  91. package/src/cli/native-smoke.ts +2 -0
  92. package/src/cli/not-a-ticker.ts +19 -9
  93. package/src/cli/opentui-libc.ts +5 -0
  94. package/src/cli/options.ts +12 -0
  95. package/src/cli/pane-functions/capabilities.ts +75 -20
  96. package/src/cli/pane-functions/catalog.ts +24 -23
  97. package/src/cli/pane-functions/discovery.ts +1 -1
  98. package/src/cli/pane-functions/dom.ts +10 -7
  99. package/src/cli/pane-functions/financial-ratio-shot.ts +2 -2
  100. package/src/cli/pane-functions/freshness.ts +174 -23
  101. package/src/cli/pane-functions/function-help.ts +66 -27
  102. package/src/cli/pane-functions/headless.ts +24 -11
  103. package/src/cli/pane-functions/index.ts +18 -16
  104. package/src/cli/pane-functions/options.ts +22 -2
  105. package/src/cli/pane-functions/report-notices.ts +12 -4
  106. package/src/cli/pane-functions/report.ts +5 -5
  107. package/src/cli/pane-functions/resolver.ts +47 -10
  108. package/src/cli/pane-functions/screenshot-assessment.ts +322 -0
  109. package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
  110. package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
  111. package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
  112. package/src/cli/pane-functions/screenshot-evidence.ts +1 -1
  113. package/src/cli/pane-functions/screenshot-payload.ts +453 -0
  114. package/src/cli/pane-functions/screenshot-render.ts +316 -0
  115. package/src/cli/pane-functions/screenshot-types.ts +162 -0
  116. package/src/cli/pane-functions/shot-options.ts +8 -3
  117. package/src/cli/peso-dollar-rates.ts +79 -0
  118. package/src/cli/quote-answer.ts +38 -3
  119. package/src/cli/report-tables.ts +61 -16
  120. package/src/cli/restore-plugins.ts +29 -14
  121. package/src/cli/result.ts +111 -22
  122. package/src/cli/series-search.ts +5 -5
  123. package/src/cli/statement-filings.ts +19 -0
  124. package/src/cli/suffixed-listing-rows.ts +49 -0
  125. package/src/cli/symbol-args.ts +50 -15
  126. package/src/cli/symbol-cells.ts +120 -0
  127. package/src/cli/symbol-list.ts +198 -68
  128. package/src/cli/symbol-rows.ts +131 -25
  129. package/src/cli/ticker-resolution.ts +108 -11
  130. package/src/cli/treasury-yields.ts +5 -5
  131. package/src/cli/types.ts +2 -0
  132. package/src/cli/uncovered-instrument.ts +3 -3
  133. package/src/cli/unknown-command.ts +6 -6
  134. package/src/components/chart/composite/chart-layout.ts +131 -0
  135. package/src/components/chart/composite/composite-chart.tsx +373 -16
  136. package/src/components/chart/composite/interactions.ts +7 -2
  137. package/src/components/chart/composite/legend.tsx +75 -3
  138. package/src/components/chart/composite/levels.ts +5 -0
  139. package/src/components/chart/composite/panel-gestures.ts +41 -0
  140. package/src/components/chart/composite/panel-labels.ts +2 -1
  141. package/src/components/chart/composite/panel-surface.tsx +305 -11
  142. package/src/components/chart/composite/price-axis-labels.tsx +27 -3
  143. package/src/components/chart/composite/rasterizer.ts +44 -19
  144. package/src/components/chart/composite/scene.ts +16 -4
  145. package/src/components/chart/composite/text-renderer.ts +48 -21
  146. package/src/components/chart/composite/toolbar.tsx +52 -5
  147. package/src/components/chart/composite/types.ts +13 -0
  148. package/src/components/chart/composite/use-composite-chart-keyboard.ts +120 -13
  149. package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
  150. package/src/components/chart/composite/use-composite-viewport.ts +12 -3
  151. package/src/components/chart/composite/value-scale.ts +149 -0
  152. package/src/components/chart/composite/volume-profile-paint.ts +6 -3
  153. package/src/components/chart/core/pointer.ts +2 -0
  154. package/src/components/chart-table/index.ts +2 -0
  155. package/src/components/chart-table/read.tsx +74 -0
  156. package/src/components/command-bar/commands/collection-list.ts +41 -19
  157. package/src/components/command-bar/commands/collection.ts +9 -3
  158. package/src/components/command-bar/commands/direct/index.ts +1 -1
  159. package/src/components/command-bar/commands/direct/runtime.ts +3 -2
  160. package/src/components/command-bar/pane-templates/items.ts +59 -6
  161. package/src/components/command-bar/pane-templates/workflow.ts +10 -1
  162. package/src/components/command-bar/routes/root/plugin-install.ts +1 -1
  163. package/src/components/command-bar/routes/root/provider-search.ts +42 -11
  164. package/src/components/command-bar/routes/root/results.ts +18 -4
  165. package/src/components/command-bar/routes/root/runtime.ts +15 -3
  166. package/src/components/command-bar/routes/root/search-providers.ts +25 -2
  167. package/src/components/command-bar/routes/root/selection.ts +6 -1
  168. package/src/components/command-bar/routes/root/shortcut-feedback.ts +4 -1
  169. package/src/components/command-bar/routes/root/shortcuts.ts +30 -3
  170. package/src/components/command-bar/routes/ticker-search/results.ts +73 -4
  171. package/src/components/command-bar/selection-runtime.ts +50 -10
  172. package/src/components/command-bar/surface/index.tsx +24 -2
  173. package/src/components/command-bar/view-model.ts +7 -0
  174. package/src/components/command-bar/workflow/broker.ts +2 -2
  175. package/src/components/command-bar/workflow/collection-actions.ts +46 -7
  176. package/src/components/command-bar/workflow/collection-ticker.ts +32 -4
  177. package/src/components/command-bar/workflow/fields.ts +8 -2
  178. package/src/components/command-bar/workflow/ops.ts +18 -4
  179. package/src/components/command-bar/workflow/portfolio-position.ts +53 -4
  180. package/src/components/command-bar/workflow/submit.ts +3 -2
  181. package/src/components/command-bar/workflow/tickers.ts +5 -1
  182. package/src/components/company-logo.tsx +39 -0
  183. package/src/components/data-table/sections.ts +4 -2
  184. package/src/components/form-modal/confirm.tsx +2 -1
  185. package/src/components/form-modal/request.ts +5 -0
  186. package/src/components/form-modal/routes.ts +4 -1
  187. package/src/components/index.ts +12 -6
  188. package/src/components/layout/header.tsx +7 -6
  189. package/src/components/layout/market-summary.ts +9 -6
  190. package/src/components/layout/pane/capture-status.ts +1 -1
  191. package/src/components/layout/pane/footer/model.ts +11 -5
  192. package/src/components/layout/shell/chrome.ts +19 -6
  193. package/src/components/layout/shell/index.tsx +2 -1
  194. package/src/components/layout/shell/pane/layers.tsx +19 -1
  195. package/src/components/layout/status-bar.tsx +2 -2
  196. package/src/components/market-board/index.tsx +11 -3
  197. package/src/components/onboarding/onboarding-wizard.tsx +1 -0
  198. package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +2 -2
  199. package/src/components/onboarding/wizard-broker-sync.ts +4 -1
  200. package/src/components/pane-settings-dialog/desktop.tsx +20 -7
  201. package/src/components/pane-settings-dialog/tui.tsx +17 -9
  202. package/src/components/pane-settings-dialog/value.ts +8 -1
  203. package/src/components/pane-settings-dialog.tsx +44 -13
  204. package/src/components/sign-in-code-panel.tsx +27 -19
  205. package/src/components/ui/column-grid.tsx +48 -4
  206. package/src/components/ui/country-flag-art.tsx +180 -0
  207. package/src/components/ui/country-flag.tsx +118 -12
  208. package/src/components/ui/data-table/opentui/index.tsx +61 -2
  209. package/src/components/ui/data-table/opentui/model.ts +109 -2
  210. package/src/components/ui/data-table/types.ts +1 -1
  211. package/src/components/ui/display.tsx +5 -1
  212. package/src/components/ui/index.ts +3 -1
  213. package/src/components/ui/logo-mark.tsx +11 -2
  214. package/src/components/ui/query-bar.tsx +1 -1
  215. package/src/components/ui/row-notes.ts +79 -0
  216. package/src/core/state/app/layout.ts +4 -4
  217. package/src/data/cached-query.ts +8 -1
  218. package/src/data/config/chart-settings.ts +3 -3
  219. package/src/data/config/home.ts +10 -2
  220. package/src/data/config/layout.ts +4 -1
  221. package/src/data/config/store/node.ts +4 -0
  222. package/src/data/config/store/normalize.ts +13 -3
  223. package/src/data/config/store/portfolio-as-of-column.ts +2 -2
  224. package/src/data/json-storage.ts +2 -0
  225. package/src/data/saved-copies.ts +84 -0
  226. package/src/docs/snapshot.json +65 -32
  227. package/src/i18n/es.ts +29 -12
  228. package/src/i18n/ja.ts +29 -12
  229. package/src/i18n/ko.ts +29 -12
  230. package/src/i18n/zh-cn.ts +29 -12
  231. package/src/i18n/zh-tw.ts +29 -12
  232. package/src/layout/desks.ts +1 -1
  233. package/src/layout/launch-layout.ts +1 -1
  234. package/src/layout/pane-manager/floating-actions.ts +5 -3
  235. package/src/layout/pane-manager/floating.ts +43 -1
  236. package/src/layout/pane-manager/index.ts +2 -0
  237. package/src/layout/selected-ticker.ts +74 -0
  238. package/src/market-data/depositary-pair.ts +251 -0
  239. package/src/market-data/futures-board.ts +1 -1
  240. package/src/market-data/futures-contract.ts +124 -40
  241. package/src/market-data/fx-closes.ts +17 -2
  242. package/src/market-data/hooks.tsx +19 -11
  243. package/src/market-data/market/change-basis.ts +49 -7
  244. package/src/market-data/market/freshness.ts +34 -5
  245. package/src/market-data/market/period-return.ts +163 -0
  246. package/src/market-data/market/trading-sessions.ts +13 -0
  247. package/src/market-data/market/year-to-date.ts +8 -13
  248. package/src/market-data/performance.ts +20 -14
  249. package/src/market-data/perpetual-premium.ts +32 -0
  250. package/src/market-data/published-apac-sessions.ts +2 -1
  251. package/src/market-data/published-futures-sessions.ts +69 -0
  252. package/src/market-data/quotes/contributions.ts +5 -1
  253. package/src/market-data/quotes/freshness.ts +42 -0
  254. package/src/market-data/quotes/intraday-bar.ts +37 -0
  255. package/src/market-data/quotes/regular-session-valuation.ts +13 -8
  256. package/src/market-data/quotes/resolution.ts +4 -2
  257. package/src/market-data/tax-equivalent.ts +1 -1
  258. package/src/market-data/ticker-price-returns.ts +3 -1
  259. package/src/news/aggregator.ts +5 -1
  260. package/src/news/news-model.ts +4 -0
  261. package/src/news/types.ts +11 -0
  262. package/src/notifications/app-notifier.ts +1 -1
  263. package/src/plugins/auto-update.ts +2 -2
  264. package/src/plugins/builtin/account-management/index.tsx +1 -0
  265. package/src/plugins/builtin/account-management/pane.tsx +9 -8
  266. package/src/plugins/builtin/alerts/alert-engine.ts +29 -19
  267. package/src/plugins/builtin/alerts/calendar-events.ts +378 -0
  268. package/src/plugins/builtin/alerts/cli.ts +485 -76
  269. package/src/plugins/builtin/alerts/command.ts +5 -10
  270. package/src/plugins/builtin/alerts/event-rows.ts +9 -5
  271. package/src/plugins/builtin/alerts/events-pane.tsx +71 -56
  272. package/src/plugins/builtin/alerts/events.ts +107 -5
  273. package/src/plugins/builtin/alerts/fired-log.ts +78 -0
  274. package/src/plugins/builtin/alerts/format.ts +2 -1
  275. package/src/plugins/builtin/alerts/headless.ts +100 -39
  276. package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
  277. package/src/plugins/builtin/alerts/history-rows.ts +89 -0
  278. package/src/plugins/builtin/alerts/index.tsx +45 -18
  279. package/src/plugins/builtin/alerts/iv-level.ts +365 -0
  280. package/src/plugins/builtin/alerts/levels.ts +3 -3
  281. package/src/plugins/builtin/alerts/pane.tsx +97 -29
  282. package/src/plugins/builtin/alerts/price.ts +35 -0
  283. package/src/plugins/builtin/alerts/quotes.ts +24 -0
  284. package/src/plugins/builtin/alerts/research-builder.ts +84 -11
  285. package/src/plugins/builtin/alerts/research-rules.ts +76 -3
  286. package/src/plugins/builtin/alerts/scheduled-check.ts +206 -32
  287. package/src/plugins/builtin/alerts/scheduled-sources.ts +26 -3
  288. package/src/plugins/builtin/alerts/scheduled.ts +188 -29
  289. package/src/plugins/builtin/alerts/storage.ts +13 -10
  290. package/src/plugins/builtin/alerts/targets.ts +12 -3
  291. package/src/plugins/builtin/analytics/index.tsx +8 -2
  292. package/src/plugins/builtin/analytics/metrics.ts +1 -1
  293. package/src/plugins/builtin/analytics/risk-book.ts +215 -0
  294. package/src/plugins/builtin/analytics/risk-client.ts +13 -6
  295. package/src/plugins/builtin/analytics/risk-headless.ts +55 -21
  296. package/src/plugins/builtin/analytics/risk-math.ts +6 -3
  297. package/src/plugins/builtin/analytics/risk-model.ts +297 -104
  298. package/src/plugins/builtin/analytics/risk-options.ts +17 -2
  299. package/src/plugins/builtin/analytics/risk-pane.tsx +97 -36
  300. package/src/plugins/builtin/attention/pane.tsx +6 -2
  301. package/src/plugins/builtin/awards/headless.ts +7 -3
  302. package/src/plugins/builtin/awards/model.ts +18 -0
  303. package/src/plugins/builtin/awards/pane.tsx +6 -3
  304. package/src/plugins/builtin/backtest/headless.ts +3 -3
  305. package/src/plugins/builtin/backtest/rules.ts +41 -5
  306. package/src/plugins/builtin/broker-manager/add-flow.tsx +12 -7
  307. package/src/plugins/builtin/broker-manager/detail.tsx +47 -19
  308. package/src/plugins/builtin/broker-manager/footer.ts +27 -11
  309. package/src/plugins/builtin/broker-manager/index.tsx +21 -12
  310. package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
  311. package/src/plugins/builtin/broker-manager/model.ts +12 -2
  312. package/src/plugins/builtin/broker-manager/pane-actions.tsx +183 -57
  313. package/src/plugins/builtin/broker-manager/table.ts +28 -12
  314. package/src/plugins/builtin/broker-trading/account-picker.tsx +2 -1
  315. package/src/plugins/builtin/broker-trading/chart-levels.ts +82 -13
  316. package/src/plugins/builtin/broker-trading/controller.ts +45 -13
  317. package/src/plugins/builtin/broker-trading/dock.tsx +22 -4
  318. package/src/plugins/builtin/broker-trading/headless.ts +2 -1
  319. package/src/plugins/builtin/broker-trading/index.tsx +7 -1
  320. package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
  321. package/src/plugins/builtin/broker-trading/order-feed.ts +75 -7
  322. package/src/plugins/builtin/broker-trading/orders.tsx +109 -31
  323. package/src/plugins/builtin/broker-trading/overview-orders.tsx +9 -3
  324. package/src/plugins/builtin/broker-trading/pane-model.ts +30 -2
  325. package/src/plugins/builtin/broker-trading/pane.tsx +110 -23
  326. package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
  327. package/src/plugins/builtin/broker-trading/ticket.tsx +112 -31
  328. package/src/plugins/builtin/buildout/cells.tsx +4 -0
  329. package/src/plugins/builtin/buildout/detail/index.tsx +5 -1
  330. package/src/plugins/builtin/buildout/detail/ui.tsx +7 -4
  331. package/src/plugins/builtin/buildout/pane/index.tsx +25 -12
  332. package/src/plugins/builtin/buildout/pane/status.tsx +0 -4
  333. package/src/plugins/builtin/builtin-plugin-meta.ts +1 -1
  334. package/src/plugins/builtin/catalysts/detail.tsx +3 -2
  335. package/src/plugins/builtin/catalysts/index.tsx +1 -1
  336. package/src/plugins/builtin/catalysts/model.ts +49 -4
  337. package/src/plugins/builtin/catalysts/pane.tsx +6 -8
  338. package/src/plugins/builtin/central-bank-rates/client.ts +5 -0
  339. package/src/plugins/builtin/central-bank-rates/headless.ts +36 -10
  340. package/src/plugins/builtin/central-bank-rates/model.ts +33 -8
  341. package/src/plugins/builtin/changelog/index.tsx +1 -0
  342. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +1 -0
  343. package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +2 -1
  344. package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
  345. package/src/plugins/builtin/chart-composer/cli-options.ts +2 -5
  346. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +2 -1
  347. package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -0
  348. package/src/plugins/builtin/chart-composer/editor.tsx +4 -1
  349. package/src/plugins/builtin/chart-composer/headless-schema.ts +28 -26
  350. package/src/plugins/builtin/chart-composer/headless.ts +253 -35
  351. package/src/plugins/builtin/chart-composer/index.tsx +12 -2
  352. package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
  353. package/src/plugins/builtin/chart-composer/pane.tsx +127 -28
  354. package/src/plugins/builtin/chart-composer/series-catalog.ts +1 -0
  355. package/src/plugins/builtin/chart-composer/series-expression.ts +65 -6
  356. package/src/plugins/builtin/chart-composer/session-history.ts +15 -21
  357. package/src/plugins/builtin/chart-composer/session-range.ts +4 -2
  358. package/src/plugins/builtin/chart-composer/settings.ts +31 -19
  359. package/src/plugins/builtin/chart-composer/use-series-catalog.ts +5 -6
  360. package/src/plugins/builtin/chart-composer/viewport-labels.ts +18 -8
  361. package/src/plugins/builtin/chat/attachments/model.ts +3 -1
  362. package/src/plugins/builtin/chat/content/index.tsx +1 -1
  363. package/src/plugins/builtin/chat/pane-links/open.ts +1 -1
  364. package/src/plugins/builtin/chat/people.ts +1 -1
  365. package/src/plugins/builtin/clinical-trials/client.ts +5 -2
  366. package/src/plugins/builtin/clinical-trials/model.ts +13 -4
  367. package/src/plugins/builtin/clinical-trials/pane.tsx +32 -12
  368. package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +17 -0
  369. package/src/plugins/builtin/cloud/askg/controller.ts +1 -1
  370. package/src/plugins/builtin/cloud/askg/lock-note.ts +1 -1
  371. package/src/plugins/builtin/cloud/askg/tool-display.ts +1 -1
  372. package/src/plugins/builtin/cloud/auth-commands.ts +3 -3
  373. package/src/plugins/builtin/cloud/team/pane-sections.tsx +105 -47
  374. package/src/plugins/builtin/cloud/team/pane-ui.tsx +42 -4
  375. package/src/plugins/builtin/cloud/team/pane.tsx +204 -64
  376. package/src/plugins/builtin/cloud/thesis/store.ts +45 -22
  377. package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
  378. package/src/plugins/builtin/commodities-energy/index.tsx +29 -2
  379. package/src/plugins/builtin/commodities-energy/view-state.ts +2 -0
  380. package/src/plugins/builtin/commodity-balances/pane.tsx +11 -4
  381. package/src/plugins/builtin/company-attention/app-rank.tsx +7 -5
  382. package/src/plugins/builtin/company-attention/building-model.ts +222 -0
  383. package/src/plugins/builtin/company-attention/building.tsx +172 -0
  384. package/src/plugins/builtin/company-attention/client.ts +117 -1
  385. package/src/plugins/builtin/company-attention/evidence.ts +16 -3
  386. package/src/plugins/builtin/company-attention/headless.ts +101 -5
  387. package/src/plugins/builtin/company-attention/index.tsx +6 -3
  388. package/src/plugins/builtin/company-attention/model.ts +33 -7
  389. package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
  390. package/src/plugins/builtin/company-attention/moves.tsx +159 -0
  391. package/src/plugins/builtin/company-attention/pane.tsx +79 -23
  392. package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
  393. package/src/plugins/builtin/company-attention/signals.tsx +160 -0
  394. package/src/plugins/builtin/company-kpis/headless.ts +3 -2
  395. package/src/plugins/builtin/company-kpis/model.ts +2 -2
  396. package/src/plugins/builtin/company-kpis/pane.tsx +1 -1
  397. package/src/plugins/builtin/composite-plugins.ts +2 -1
  398. package/src/plugins/builtin/congress-trades/headless.ts +1 -1
  399. package/src/plugins/builtin/connections/index.ts +1 -0
  400. package/src/plugins/builtin/correlation/headless-schema.ts +3 -2
  401. package/src/plugins/builtin/correlation/headless.ts +5 -3
  402. package/src/plugins/builtin/cot/headless.ts +28 -6
  403. package/src/plugins/builtin/cot/model.ts +12 -0
  404. package/src/plugins/builtin/cot/pane.tsx +3 -2
  405. package/src/plugins/builtin/cpi/headless.ts +5 -1
  406. package/src/plugins/builtin/cpi/pane.tsx +11 -9
  407. package/src/plugins/builtin/credit-boards/model.ts +2 -0
  408. package/src/plugins/builtin/credit-documents/headless.ts +1 -1
  409. package/src/plugins/builtin/crypto-board/client.ts +86 -0
  410. package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
  411. package/src/plugins/builtin/crypto-board/defi.ts +239 -0
  412. package/src/plugins/builtin/crypto-board/headless.ts +117 -6
  413. package/src/plugins/builtin/crypto-board/index.tsx +8 -3
  414. package/src/plugins/builtin/crypto-board/model.ts +40 -8
  415. package/src/plugins/builtin/crypto-board/pane.tsx +55 -21
  416. package/src/plugins/builtin/crypto-board/series.ts +19 -1
  417. package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
  418. package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
  419. package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
  420. package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
  421. package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
  422. package/src/plugins/builtin/debug/index.tsx +1 -0
  423. package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
  424. package/src/plugins/builtin/docs/index.tsx +1 -1
  425. package/src/plugins/builtin/docs/pane.tsx +2 -2
  426. package/src/plugins/builtin/docs/targets.ts +1 -1
  427. package/src/plugins/builtin/doe/client.ts +5 -1
  428. package/src/plugins/builtin/doe/headless.ts +12 -6
  429. package/src/plugins/builtin/doe/model.ts +43 -6
  430. package/src/plugins/builtin/doe/pane.tsx +18 -11
  431. package/src/plugins/builtin/earnings/board-model.ts +13 -6
  432. package/src/plugins/builtin/earnings/board-table.ts +4 -1
  433. package/src/plugins/builtin/earnings/board.tsx +253 -50
  434. package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
  435. package/src/plugins/builtin/earnings/calendar.tsx +338 -0
  436. package/src/plugins/builtin/earnings/client.ts +4 -3
  437. package/src/plugins/builtin/earnings/headless.ts +53 -15
  438. package/src/plugins/builtin/earnings/history-model.ts +53 -36
  439. package/src/plugins/builtin/earnings/index.tsx +15 -22
  440. package/src/plugins/builtin/earnings/model.ts +17 -12
  441. package/src/plugins/builtin/earnings/scope.ts +89 -0
  442. package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
  443. package/src/plugins/builtin/earnings-calls/data.ts +146 -2
  444. package/src/plugins/builtin/earnings-calls/headless.ts +151 -9
  445. package/src/plugins/builtin/earnings-calls/index.tsx +3 -3
  446. package/src/plugins/builtin/earnings-calls/lock-note.ts +1 -1
  447. package/src/plugins/builtin/earnings-calls/pane.tsx +149 -31
  448. package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
  449. package/src/plugins/builtin/earnings-ripple/pane.tsx +10 -5
  450. package/src/plugins/builtin/econ/calendar-model.ts +132 -20
  451. package/src/plugins/builtin/econ/detail-view.tsx +48 -10
  452. package/src/plugins/builtin/econ/fred-catalog.ts +23 -6
  453. package/src/plugins/builtin/econ/fred-series-map.ts +4 -0
  454. package/src/plugins/builtin/econ/index.tsx +112 -25
  455. package/src/plugins/builtin/econ/print-watch.ts +2 -1
  456. package/src/plugins/builtin/econ/types.ts +32 -1
  457. package/src/plugins/builtin/econ-statistics/client.ts +16 -3
  458. package/src/plugins/builtin/econ-statistics/defs.ts +4 -0
  459. package/src/plugins/builtin/econ-statistics/detail.tsx +2 -2
  460. package/src/plugins/builtin/econ-statistics/headless.ts +13 -2
  461. package/src/plugins/builtin/econ-statistics/index.tsx +3 -3
  462. package/src/plugins/builtin/econ-statistics/pane.tsx +2 -1
  463. package/src/plugins/builtin/econ-statistics/stats.ts +103 -0
  464. package/src/plugins/builtin/econ-statistics/view.ts +16 -1
  465. package/src/plugins/builtin/equity-screener/client.ts +21 -3
  466. package/src/plugins/builtin/equity-screener/headless.ts +68 -6
  467. package/src/plugins/builtin/equity-screener/live.ts +1 -1
  468. package/src/plugins/builtin/equity-screener/model.ts +6 -0
  469. package/src/plugins/builtin/equity-screener/pane.tsx +45 -10
  470. package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
  471. package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
  472. package/src/plugins/builtin/estimate-revisions/headless.ts +3 -1
  473. package/src/plugins/builtin/estimate-revisions/lock-note.ts +3 -3
  474. package/src/plugins/builtin/estimate-revisions/model.ts +8 -10
  475. package/src/plugins/builtin/exposure/headless.ts +51 -6
  476. package/src/plugins/builtin/exposure/index.tsx +28 -2
  477. package/src/plugins/builtin/exposure/model.ts +7 -0
  478. package/src/plugins/builtin/exposure/pane.tsx +6 -1
  479. package/src/plugins/builtin/fear-greed/index.tsx +1 -1
  480. package/src/plugins/builtin/filing-events/index.tsx +1 -1
  481. package/src/plugins/builtin/futures/model.ts +10 -9
  482. package/src/plugins/builtin/futures/returns.ts +8 -36
  483. package/src/plugins/builtin/futures/table.tsx +1 -1
  484. package/src/plugins/builtin/futures-curve/client.ts +40 -9
  485. package/src/plugins/builtin/futures-curve/headless.ts +39 -17
  486. package/src/plugins/builtin/futures-curve/model.ts +258 -69
  487. package/src/plugins/builtin/futures-curve/pane.tsx +46 -17
  488. package/src/plugins/builtin/fx-matrix/client.ts +15 -8
  489. package/src/plugins/builtin/fx-matrix/headless.ts +32 -14
  490. package/src/plugins/builtin/fx-matrix/index.tsx +13 -11
  491. package/src/plugins/builtin/fx-matrix/live-legs.ts +22 -0
  492. package/src/plugins/builtin/fx-matrix/settings.ts +2 -1
  493. package/src/plugins/builtin/gpu/headless.ts +9 -4
  494. package/src/plugins/builtin/help/index.tsx +13 -3
  495. package/src/plugins/builtin/holders/beneficial-model.ts +8 -11
  496. package/src/plugins/builtin/holders/beneficial-report.ts +6 -5
  497. package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
  498. package/src/plugins/builtin/holders/client.ts +13 -1
  499. package/src/plugins/builtin/holders/format.ts +28 -17
  500. package/src/plugins/builtin/holders/headless.ts +46 -7
  501. package/src/plugins/builtin/holders/index-holders.ts +264 -0
  502. package/src/plugins/builtin/holders/pane.tsx +79 -15
  503. package/src/plugins/builtin/holders/report-rows.ts +35 -7
  504. package/src/plugins/builtin/holders/table-model.ts +2 -1
  505. package/src/plugins/builtin/holders/treemap.tsx +2 -2
  506. package/src/plugins/builtin/insider/headless.ts +1 -1
  507. package/src/plugins/builtin/insider/signals-client.ts +1 -1
  508. package/src/plugins/builtin/insider/signals.tsx +1 -1
  509. package/src/plugins/builtin/ipo-calendar/pane.tsx +7 -4
  510. package/src/plugins/builtin/iv-history/client.ts +20 -0
  511. package/src/plugins/builtin/iv-history/headless.ts +4 -4
  512. package/src/plugins/builtin/iv-history/index.tsx +1 -1
  513. package/src/plugins/builtin/iv-history/model.ts +13 -4
  514. package/src/plugins/builtin/iv-history/series.ts +3 -1
  515. package/src/plugins/builtin/jobs/lock-note.ts +1 -1
  516. package/src/plugins/builtin/jobs/model.ts +4 -15
  517. package/src/plugins/builtin/jobs/pane.tsx +7 -5
  518. package/src/plugins/builtin/jobs/share-bars.tsx +11 -5
  519. package/src/plugins/builtin/jodi/pane.tsx +10 -4
  520. package/src/plugins/builtin/layout-manager/index.tsx +1 -0
  521. package/src/plugins/builtin/macro-day/headless.ts +20 -7
  522. package/src/plugins/builtin/macro-day/index.tsx +3 -2
  523. package/src/plugins/builtin/macro-day/model.ts +29 -8
  524. package/src/plugins/builtin/macro-day/pane.tsx +46 -10
  525. package/src/plugins/builtin/macro-day/releases.ts +55 -13
  526. package/src/plugins/builtin/market-heatmap/data.ts +9 -2
  527. package/src/plugins/builtin/market-heatmap/evidence.ts +1 -1
  528. package/src/plugins/builtin/market-heatmap/headless.ts +9 -6
  529. package/src/plugins/builtin/market-heatmap/index.tsx +3 -3
  530. package/src/plugins/builtin/market-heatmap/model.ts +10 -7
  531. package/src/plugins/builtin/market-movers/client.ts +33 -19
  532. package/src/plugins/builtin/market-movers/headless.ts +8 -2
  533. package/src/plugins/builtin/market-movers/index.tsx +16 -10
  534. package/src/plugins/builtin/market-movers/screener.ts +29 -8
  535. package/src/plugins/builtin/market-movers/session-body.tsx +4 -2
  536. package/src/plugins/builtin/market-movers/session-table.ts +4 -2
  537. package/src/plugins/builtin/market-movers/table.ts +4 -1
  538. package/src/plugins/builtin/market-valuation/headless.ts +2 -0
  539. package/src/plugins/builtin/market-valuation/view.ts +5 -0
  540. package/src/plugins/builtin/members/headless.ts +6 -5
  541. package/src/plugins/builtin/members/pane.tsx +11 -4
  542. package/src/plugins/builtin/mna/client.ts +1 -0
  543. package/src/plugins/builtin/mna/detail.tsx +20 -32
  544. package/src/plugins/builtin/mna/distress/detail.tsx +16 -4
  545. package/src/plugins/builtin/mna/distress/model.ts +3 -2
  546. package/src/plugins/builtin/mna/distress/pane.tsx +7 -4
  547. package/src/plugins/builtin/mna/headless.ts +6 -13
  548. package/src/plugins/builtin/mna/model.ts +93 -15
  549. package/src/plugins/builtin/mna/pane.tsx +5 -4
  550. package/src/plugins/builtin/news/headless.ts +12 -6
  551. package/src/plugins/builtin/news/index.tsx +10 -1
  552. package/src/plugins/builtin/news/wire/index.tsx +3 -2
  553. package/src/plugins/builtin/news/wire/news/command-bar-search.ts +26 -10
  554. package/src/plugins/builtin/news/wire/news/query-presets.ts +6 -2
  555. package/src/plugins/builtin/news/wire/rss/cli.ts +3 -3
  556. package/src/plugins/builtin/notes/cli.ts +49 -14
  557. package/src/plugins/builtin/openfda/pane.tsx +1 -1
  558. package/src/plugins/builtin/options/carry.ts +2 -2
  559. package/src/plugins/builtin/options/index.tsx +1 -1
  560. package/src/plugins/builtin/options/view.tsx +10 -10
  561. package/src/plugins/builtin/options-calculator/headless.ts +46 -7
  562. package/src/plugins/builtin/options-scenario/client.ts +123 -28
  563. package/src/plugins/builtin/options-scenario/collar.ts +8 -6
  564. package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +127 -0
  565. package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +165 -0
  566. package/src/plugins/builtin/options-scenario/csp-screen.ts +258 -0
  567. package/src/plugins/builtin/options-scenario/csp.ts +101 -21
  568. package/src/plugins/builtin/options-scenario/headless.ts +36 -15
  569. package/src/plugins/builtin/options-scenario/hedge.ts +20 -14
  570. package/src/plugins/builtin/options-scenario/index.tsx +28 -3
  571. package/src/plugins/builtin/options-scenario/model.ts +13 -0
  572. package/src/plugins/builtin/options-scenario/pane.tsx +9 -5
  573. package/src/plugins/builtin/perps/equity-row.tsx +11 -3
  574. package/src/plugins/builtin/perps/freshness.ts +8 -5
  575. package/src/plugins/builtin/perps/headless.ts +3 -1
  576. package/src/plugins/builtin/perps/list-perpetuals.ts +25 -4
  577. package/src/plugins/builtin/perps/live-rows.ts +161 -0
  578. package/src/plugins/builtin/perps/markets-section.tsx +154 -0
  579. package/src/plugins/builtin/perps/pane.tsx +36 -17
  580. package/src/plugins/builtin/perps/venue-markets.ts +96 -0
  581. package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -1
  582. package/src/plugins/builtin/plugin-marketplace/pane.tsx +143 -59
  583. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +72 -24
  584. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +158 -141
  585. package/src/plugins/builtin/portfolio-list/cli/render.ts +49 -20
  586. package/src/plugins/builtin/portfolio-list/cli/shared.ts +3 -3
  587. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +29 -24
  588. package/src/plugins/builtin/portfolio-list/headless.ts +6 -3
  589. package/src/plugins/builtin/portfolio-list/income.ts +13 -2
  590. package/src/plugins/builtin/portfolio-list/index.tsx +9 -2
  591. package/src/plugins/builtin/portfolio-list/pane/index.tsx +21 -8
  592. package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
  593. package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +16 -9
  594. package/src/plugins/builtin/portfolio-list/summary/totals.ts +2 -15
  595. package/src/plugins/builtin/power/client.ts +4 -1
  596. package/src/plugins/builtin/power/evidence.ts +22 -7
  597. package/src/plugins/builtin/power/gas.tsx +5 -1
  598. package/src/plugins/builtin/power/pane.tsx +8 -1
  599. package/src/plugins/builtin/power/prices.tsx +10 -3
  600. package/src/plugins/builtin/research/analyst-headless.ts +25 -8
  601. package/src/plugins/builtin/research/analyst-model.ts +68 -3
  602. package/src/plugins/builtin/research/corporate-actions-pane.tsx +63 -14
  603. package/src/plugins/builtin/research/event-model.ts +3 -1
  604. package/src/plugins/builtin/research/event-sources.ts +12 -4
  605. package/src/plugins/builtin/research/index.tsx +2 -1
  606. package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
  607. package/src/plugins/builtin/research/relative-valuation-columns.ts +31 -2
  608. package/src/plugins/builtin/research/relative-valuation-currency.ts +12 -5
  609. package/src/plugins/builtin/research/relative-valuation-headless.ts +84 -26
  610. package/src/plugins/builtin/research/relative-valuation-model.ts +88 -19
  611. package/src/plugins/builtin/research/relative-valuation-pane.tsx +76 -9
  612. package/src/plugins/builtin/research/relative-valuation-peers.ts +1 -1
  613. package/src/plugins/builtin/reverse-dcf/model.ts +6 -2
  614. package/src/plugins/builtin/risk-factors/index.tsx +2 -2
  615. package/src/plugins/builtin/scanner/lock-note.ts +1 -1
  616. package/src/plugins/builtin/sec/forms.ts +13 -0
  617. package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
  618. package/src/plugins/builtin/sec/fund-facts.ts +68 -8
  619. package/src/plugins/builtin/sec/headless.ts +85 -8
  620. package/src/plugins/builtin/sec/index.tsx +58 -12
  621. package/src/plugins/builtin/sectors/client.ts +2 -1
  622. package/src/plugins/builtin/sectors/sector-model.ts +11 -15
  623. package/src/plugins/builtin/series-inventory.ts +2 -0
  624. package/src/plugins/builtin/shared/broker-reconnect.ts +107 -22
  625. package/src/plugins/builtin/shared/cloud-upgrade.ts +34 -6
  626. package/src/plugins/builtin/shared/earnings-calendar.ts +375 -0
  627. package/src/plugins/builtin/{earnings/estimate-basis.ts → shared/earnings-estimate-basis.ts} +1 -1
  628. package/src/plugins/builtin/shared/earnings-report.ts +3 -3
  629. package/src/plugins/builtin/shared/fx-rate-freshness.ts +23 -1
  630. package/src/plugins/builtin/shared/job-posting.ts +129 -0
  631. package/src/plugins/builtin/shared/pro-lock-note.ts +3 -3
  632. package/src/plugins/builtin/shared/report-freshness.ts +3 -0
  633. package/src/plugins/builtin/shared/research-trading.tsx +21 -0
  634. package/src/plugins/builtin/shared/series-cache.ts +2 -0
  635. package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
  636. package/src/plugins/builtin/short-interest/client.ts +2 -0
  637. package/src/plugins/builtin/short-interest/headless.ts +41 -12
  638. package/src/plugins/builtin/short-interest/index.tsx +23 -1
  639. package/src/plugins/builtin/short-interest/model.ts +70 -19
  640. package/src/plugins/builtin/short-interest/pane.tsx +19 -2
  641. package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
  642. package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
  643. package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
  644. package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
  645. package/src/plugins/builtin/short-interest/schedule.ts +35 -2
  646. package/src/plugins/builtin/short-interest/surface.tsx +11 -4
  647. package/src/plugins/builtin/short-interest/types.ts +9 -0
  648. package/src/plugins/builtin/short-interest/watch-client.ts +14 -8
  649. package/src/plugins/builtin/short-interest/watch-model.ts +12 -25
  650. package/src/plugins/builtin/short-interest/watch-pane.tsx +5 -1
  651. package/src/plugins/builtin/supply-chain/flow.tsx +33 -9
  652. package/src/plugins/builtin/supply-chain/model.ts +51 -3
  653. package/src/plugins/builtin/supply-chain/pane.tsx +78 -39
  654. package/src/plugins/builtin/supply-chain/row-evidence.tsx +1 -1
  655. package/src/plugins/builtin/themes/headless.ts +8 -5
  656. package/src/plugins/builtin/themes/model.ts +14 -4
  657. package/src/plugins/builtin/themes/pane.tsx +24 -5
  658. package/src/plugins/builtin/thirteenf/headless.ts +5 -5
  659. package/src/plugins/builtin/thirteenf/signals.ts +3 -1
  660. package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
  661. package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
  662. package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
  663. package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +40 -26
  664. package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +8 -4
  665. package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +67 -3
  666. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +112 -5
  667. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +17 -2
  668. package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +21 -7
  669. package/src/plugins/builtin/ticker-detail/financials/model.ts +36 -1
  670. package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
  671. package/src/plugins/builtin/ticker-detail/financials/ratios.ts +62 -13
  672. package/src/plugins/builtin/ticker-detail/financials/tab.tsx +30 -4
  673. package/src/plugins/builtin/ticker-detail/headless-schema.ts +14 -2
  674. package/src/plugins/builtin/ticker-detail/headless.ts +148 -35
  675. package/src/plugins/builtin/ticker-detail/index.tsx +37 -5
  676. package/src/plugins/builtin/ticker-detail/overview/model.ts +65 -10
  677. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +9 -1
  678. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +68 -11
  679. package/src/plugins/builtin/ticker-detail/pane.tsx +11 -0
  680. package/src/plugins/builtin/ticker-detail/quote-footer.ts +8 -3
  681. package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
  682. package/src/plugins/builtin/vol-surface/client.ts +5 -4
  683. package/src/plugins/builtin/vol-surface/headless.ts +12 -3
  684. package/src/plugins/builtin/vol-surface/model.ts +4 -2
  685. package/src/plugins/builtin/volatility/model.ts +5 -10
  686. package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +4 -3
  687. package/src/plugins/builtin/world-venue-map/basemap.ts +3 -1
  688. package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -0
  689. package/src/plugins/builtin/world-venue-map/evidence.ts +1 -1
  690. package/src/plugins/builtin/world-venue-map/geo-series.ts +90 -11
  691. package/src/plugins/builtin/world-venue-map/headless.ts +1 -1
  692. package/src/plugins/builtin/world-venue-map/index.ts +3 -26
  693. package/src/plugins/builtin/world-venue-map/layers.ts +1 -1
  694. package/src/plugins/builtin/world-venue-map/map.tsx +2 -1
  695. package/src/plugins/builtin/world-venue-map/pane.tsx +4 -2
  696. package/src/plugins/builtin/world-venue-map/venue-header.tsx +15 -4
  697. package/src/plugins/builtin/yield-curve/client.ts +25 -0
  698. package/src/plugins/builtin/yield-curve/curves.ts +7 -4
  699. package/src/plugins/builtin/yield-curve/headless.ts +38 -4
  700. package/src/plugins/builtin/yield-curve/history.ts +4 -3
  701. package/src/plugins/builtin/yield-curve/index.tsx +12 -6
  702. package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
  703. package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
  704. package/src/plugins/bundle.ts +1 -1
  705. package/src/plugins/catalog-browser.ts +2 -1
  706. package/src/plugins/compat.ts +3 -3
  707. package/src/plugins/dependencies.ts +75 -14
  708. package/src/plugins/extracted-plugins.ts +132 -34
  709. package/src/plugins/host-link.ts +149 -34
  710. package/src/plugins/installer.ts +35 -10
  711. package/src/plugins/loader.ts +206 -38
  712. package/src/plugins/manager-node.ts +2 -2
  713. package/src/plugins/marketplace/deactivation.ts +22 -0
  714. package/src/plugins/marketplace/model.ts +2 -2
  715. package/src/plugins/marketplace/packs.ts +1 -1
  716. package/src/plugins/ownership.ts +1 -1
  717. package/src/plugins/peer-retry.ts +155 -0
  718. package/src/plugins/registry/contributions.ts +3 -1
  719. package/src/plugins/registry/index.ts +4 -3
  720. package/src/plugins/registry/plugin-state.ts +3 -0
  721. package/src/plugins/seed-notice.ts +20 -0
  722. package/src/plugins/shortcut-argument.ts +39 -0
  723. package/src/portfolio/allocation.ts +1 -1
  724. package/src/portfolio/collection-name.ts +31 -0
  725. package/src/portfolio/column-values.ts +10 -8
  726. package/src/portfolio/cost-fx.ts +296 -19
  727. package/src/portfolio/manual-lots.ts +75 -0
  728. package/src/portfolio/mutations.ts +60 -22
  729. package/src/portfolio/suffixed-listings.ts +209 -0
  730. package/src/portfolio/totals-currency.ts +24 -0
  731. package/src/public/__snapshots__/public-api.test.ts.snap +14 -0
  732. package/src/public/time-series.ts +11 -8
  733. package/src/remote/schema.ts +1 -1
  734. package/src/renderers/browser/config-host.ts +3 -0
  735. package/src/renderers/browser/main.tsx +23 -3
  736. package/src/renderers/dom/boot-frame-page.ts +187 -0
  737. package/src/renderers/dom/boot-frame.ts +237 -0
  738. package/src/renderers/dom/build-assets.ts +46 -8
  739. package/src/renderers/dom/dom-ui-host.tsx +4 -29
  740. package/src/renderers/dom/host/ascii-text.ts +16 -2
  741. package/src/renderers/dom/host/box.tsx +43 -2
  742. package/src/renderers/dom/host/chart-surface.tsx +2 -0
  743. package/src/renderers/dom/host/hls.chunk.ts +3 -0
  744. package/src/renderers/dom/host/image-surface.tsx +49 -0
  745. package/src/renderers/dom/host/media-surface.tsx +24 -18
  746. package/src/renderers/dom/host/mouse.ts +30 -0
  747. package/src/renderers/dom/host/size-observer.ts +1 -1
  748. package/src/renderers/dom/host/style.ts +1 -1
  749. package/src/renderers/dom/styles.css +76 -0
  750. package/src/renderers/dom/test-utils.tsx +2 -1
  751. package/src/renderers/electrobun/bun/application-menu/index.ts +3 -3
  752. package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
  753. package/src/renderers/electrobun/bun/desktop/backend.ts +46 -3
  754. package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
  755. package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
  756. package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
  757. package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
  758. package/src/renderers/electrobun/bun/index.ts +11 -1
  759. package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
  760. package/src/renderers/electrobun/bun/window/create.ts +4 -1
  761. package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
  762. package/src/renderers/electrobun/shared/protocol.ts +6 -1
  763. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
  764. package/src/renderers/electrobun/view/config-host.ts +3 -0
  765. package/src/renderers/electrobun/view/fatal-screen.tsx +1 -1
  766. package/src/renderers/electrobun/view/main.tsx +30 -4
  767. package/src/renderers/electrobun/view/news-source.ts +5 -5
  768. package/src/renderers/electrobun/view/remote/asset-data-client.ts +1 -1
  769. package/src/renderers/electrobun/view/ui-host.tsx +1 -1
  770. package/src/renderers/opentui/browser-open.ts +88 -0
  771. package/src/renderers/opentui/host.tsx +5 -14
  772. package/src/renderers/opentui/image/loader.ts +3 -2
  773. package/src/renderers/opentui/native-smoke.ts +10 -1
  774. package/src/renderers/opentui/pane-image/index.ts +2 -1
  775. package/src/renderers/opentui/render-lib.ts +253 -0
  776. package/src/renderers/opentui/render-timing-smoke.ts +1 -1
  777. package/src/renderers/opentui/start.tsx +1 -1
  778. package/src/renderers/share/layout-view.tsx +2 -2
  779. package/src/renderers/share/main.tsx +4 -4
  780. package/src/renderers/share/view.tsx +1 -1
  781. package/src/series/resolve.ts +22 -6
  782. package/src/series/standalone.ts +30 -2
  783. package/src/series/types.ts +8 -1
  784. package/src/shares/api.ts +4 -1
  785. package/src/shares/pane.ts +1 -1
  786. package/src/sources/gloomberb-cloud/fred-series.ts +46 -1
  787. package/src/sources/gloomberb-cloud/index.ts +32 -16
  788. package/src/sources/gloomberb-cloud/news.ts +39 -0
  789. package/src/sources/gloomberb-cloud/normalizers.ts +14 -1
  790. package/src/sources/gloomberb-cloud/perpetuals.ts +49 -1
  791. package/src/sources/listing-symbols.ts +37 -0
  792. package/src/sources/provider-errors.ts +16 -2
  793. package/src/sources/provider-router/financial-routes.ts +21 -3
  794. package/src/sources/provider-router/financials.ts +15 -2
  795. package/src/sources/provider-router/history.ts +30 -8
  796. package/src/sources/provider-router/primary.ts +1 -1
  797. package/src/state/app/bootstrap.ts +23 -0
  798. package/src/state/hooks/inline-tickers.ts +30 -5
  799. package/src/sync/controller.ts +1 -1
  800. package/src/sync/core-contributors.ts +46 -14
  801. package/src/team/collections-sync.ts +2 -1
  802. package/src/team/collections.ts +178 -17
  803. package/src/telemetry/crash-reports.ts +17 -4
  804. package/src/test-support/builtin-panes.ts +1 -1
  805. package/src/theme/colors.ts +3 -30
  806. package/src/theme/ui-tokens.ts +37 -1
  807. package/src/tickers/company-name-listing.ts +210 -33
  808. package/src/tickers/index-roots.ts +47 -0
  809. package/src/tickers/instrument-label.ts +5 -1
  810. package/src/tickers/metadata.ts +10 -0
  811. package/src/tickers/perpetual-listing.ts +5 -2
  812. package/src/tickers/search/home-listing.ts +75 -0
  813. package/src/tickers/search/index.ts +76 -27
  814. package/src/tickers/search/ranking.ts +54 -4
  815. package/src/tickers/search/upsert.ts +29 -0
  816. package/src/tickers/terminal-codes.ts +416 -40
  817. package/src/time-series/bar-aggregation.ts +243 -0
  818. package/src/time-series/base-series.ts +307 -0
  819. package/src/time-series/chart-bounds.ts +349 -0
  820. package/src/time-series/chart-seed.ts +142 -0
  821. package/src/time-series/economic.ts +5 -0
  822. package/src/time-series/fundamentals.ts +18 -3
  823. package/src/time-series/history-acquisition.ts +499 -0
  824. package/src/time-series/leverage.ts +100 -0
  825. package/src/time-series/market-resolution.ts +4 -2
  826. package/src/time-series/market.ts +2 -1
  827. package/src/time-series/price-comparison.ts +175 -30
  828. package/src/time-series/range.ts +9 -1
  829. package/src/time-series/resolution.ts +174 -16
  830. package/src/time-series/resolve-context.ts +157 -0
  831. package/src/time-series/resolve.ts +126 -1577
  832. package/src/time-series/series-name.ts +38 -0
  833. package/src/time-series/series-presentation.ts +208 -0
  834. package/src/time-series/spec.ts +11 -6
  835. package/src/time-series/studies.ts +109 -12
  836. package/src/time-series/tail-reconcile.ts +121 -0
  837. package/src/time-series/types.ts +29 -2
  838. package/src/time-series/use-chart-resolution.ts +4 -5
  839. package/src/types/broker.ts +10 -0
  840. package/src/types/config.ts +14 -0
  841. package/src/types/data-provider.ts +14 -0
  842. package/src/types/exchange-rate.ts +6 -0
  843. package/src/types/financials.ts +104 -7
  844. package/src/types/headless.ts +76 -6
  845. package/src/types/instrument.ts +3 -0
  846. package/src/types/plugin.ts +65 -8
  847. package/src/types/price-history.ts +2 -0
  848. package/src/types/ticker.ts +13 -0
  849. package/src/types/trading.ts +59 -1
  850. package/src/ui/ascii-font.ts +13 -1
  851. package/src/ui/host.tsx +6 -1
  852. package/src/updater/command-names.ts +175 -0
  853. package/src/updater/index.ts +10 -5
  854. package/src/utils/calendar-date.ts +32 -15
  855. package/src/utils/cash-runway.ts +241 -0
  856. package/src/utils/central-banks.ts +42 -0
  857. package/src/utils/cli-output.ts +259 -80
  858. package/src/utils/contract-month.ts +16 -0
  859. package/src/utils/crypto-pair.ts +61 -3
  860. package/src/utils/currency-units.ts +29 -0
  861. package/src/utils/datetime-format.ts +10 -0
  862. package/src/utils/debug-log.ts +1 -1
  863. package/src/utils/decimal-comma.ts +39 -6
  864. package/src/utils/exchange-announcements.ts +71 -0
  865. package/src/utils/exchange-rate-snapshot.ts +10 -0
  866. package/src/utils/financial-statements.ts +83 -4
  867. package/src/utils/format.ts +34 -16
  868. package/src/utils/fundamentals.ts +150 -34
  869. package/src/utils/fx-market-hours.ts +10 -1
  870. package/src/utils/latest-financial-period.ts +8 -0
  871. package/src/utils/linux-libc.ts +54 -0
  872. package/src/utils/market-capitalization.ts +111 -15
  873. package/src/utils/max-drawdown.ts +64 -0
  874. package/src/utils/network-failure.ts +83 -0
  875. package/src/utils/option-expiry.ts +139 -7
  876. package/src/utils/price-earnings.ts +11 -5
  877. package/src/utils/price-history.ts +18 -8
  878. package/src/utils/price-window.ts +131 -0
  879. package/src/utils/release-date.ts +47 -0
  880. package/src/utils/sec.ts +3 -0
  881. package/src/utils/throttled-fetch.ts +11 -4
  882. package/src/utils/trailing-eps.ts +67 -0
  883. package/src/utils/typed-text.ts +21 -0
  884. package/src/utils/utc-time.ts +24 -1
  885. package/src/version.ts +6 -0
  886. package/src/cli/pane-functions/screenshot.ts +0 -2122
@@ -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,12 +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";
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";
39
45
  import { currencyCodeLabel, heldCurrencyUnit } from "../../utils/currency-units";
40
46
  import { quotedFxPair } from "../../utils/currency-pair";
41
47
  import type { AppConfig } from "../../types/config";
42
- import type { DeclaredDividendAction, FinancialStatement, Quote, TickerFinancials } from "../../types/financials";
48
+ import type { CompanyProfile, DeclaredDividendAction, FinancialStatement, Quote, TickerFinancials } from "../../types/financials";
43
49
  import { atRegularSessionPrice, regularSessionValuationPrice } from "../../market-data/quotes/regular-session-valuation";
44
50
  import { computeTickerPriceReturns } from "../../market-data/ticker-price-returns";
45
51
  import { instrumentTypeLabel, resolveTickerInstrumentKind } from "../../tickers/instrument-kind";
@@ -50,7 +56,7 @@ import type { TickerRecord } from "../../types/ticker";
50
56
  import type { CliCommandContext } from "../../types/plugin";
51
57
  import { getPortfolioPositionMetrics, getPortfolioQuoteDisplay, lotCostFxRate, resolvePortfolioMarketValue, resolvePortfolioPositionPnl } from "../../portfolio/position-metrics";
52
58
  import { isFuturesTicker } from "../../portfolio/futures-positions";
53
- import { createBaseConverter, type BaseConversion } from "../base-converter";
59
+ import { createBaseConverter, type BaseConverter } from "../base-converter";
54
60
  import { formatFxRate } from "../fx-pair";
55
61
  import { initMarketData, withMarketData } from "../context";
56
62
  import { fail } from "../errors";
@@ -66,7 +72,7 @@ import {
66
72
  quoteChangeText,
67
73
  } from "../helpers";
68
74
  import { NotesFiles } from "../../plugins/builtin/notes/files";
69
- import { isKnownNonUsListing, secFilingItemCodes } from "../../utils/sec";
75
+ import { isKnownNonUsListing, secFilingItemCodes, US_FUND_FACTS_ONLY } from "../../utils/sec";
70
76
  import { currentReportItemsLabel, hiddenFilingsNote, loadLatestFilings, type HiddenFilings } from "../../utils/sec-filings";
71
77
  import { canonicalExchange, exchangeLabel, isKnownExchangeCode, isUsListingExchange } from "../../utils/exchanges";
72
78
  import {
@@ -77,6 +83,7 @@ import { movedAwayChange } from "../../tickers/ticker-changes";
77
83
  import { companyMemberships, loadCompanyMemberships, type CompanyMemberships, type ListMembership } from "../issuer-membership";
78
84
  import { isNotATickerMessage } from "../not-a-ticker";
79
85
  import { sharesOutstandingInReceipts } from "../../utils/depositary-receipt";
86
+ import { depositaryPairText, isReceiptSide, listingDepositaryPair } from "../../market-data/depositary-pair";
80
87
  import { cliFreshnessFooter } from "../result";
81
88
  import { providerMissReason } from "../../sources/provider-errors";
82
89
  import { exportEntriesTable, reportFooterLines, type CliReportTables } from "../report-tables";
@@ -86,12 +93,14 @@ import { distributionHistory, forwardDividendBasis, forwardDividendMayHaveLapsed
86
93
  import { declaredDividends } from "../../utils/declared-dividends";
87
94
  import { historyTrailingDividendYield, measuresTrailingYield } from "../../market-data/quotes/live-valuation";
88
95
  import { notTheCoinNote } from "./crypto-hints";
89
- import { loadStatementFilings, resultsReleaseText, statementPeriodText, type StatementFilingsReport } from "../statement-filings";
96
+ import { loadOfferingFilings, loadStatementFilings, resultsReleaseText, statementPeriodText, type StatementFilingsReport } from "../statement-filings";
90
97
  import type { BankFiguresPayload } from "../../api-client/bank-figures";
91
98
  import { bankSection } from "../bank-section";
92
99
  import type { FundBondFacts } from "../../api-client/fund-facts";
93
100
  import { bondFigures, fetchFundBondFacts, NOT_SEC_YIELD } from "../../market-data/bond-funds";
94
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";
95
104
 
96
105
  const NEWS_ITEM_LIMIT = 5;
97
106
  const SEC_FILING_LIMIT = 5;
@@ -166,7 +175,16 @@ function wrapProse(text: string): string {
166
175
  return wrapText(text, Math.min(cliTerminalWidth() ?? MAX_PROSE_WIDTH, MAX_PROSE_WIDTH)).join("\n");
167
176
  }
168
177
 
169
- 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]> {
170
188
  const money = (value: number | undefined, perShare = false) => formatReportedMoney(value, currency, perShare, codes);
171
189
  return [
172
190
  ["Revenue", money(statement.totalRevenue)],
@@ -179,6 +197,9 @@ function buildStatementMetrics(statement: FinancialStatement, currency?: string,
179
197
  ["Operating Cash Flow", money(statement.operatingCashFlow)],
180
198
  ["Free Cash Flow", money(statement.freeCashFlow)],
181
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]] : [],
182
203
  ["Total Assets", money(statement.totalAssets)],
183
204
  ["Total Liabilities", money(statement.totalLiabilities)],
184
205
  ["Total Debt", money(statement.totalDebt)],
@@ -195,9 +216,15 @@ function buildStatementMetrics(statement: FinancialStatement, currency?: string,
195
216
  * A receipt's count is its ordinary shares expressed in receipts, as its
196
217
  * market cap is; the ordinary count follows when the service gives it.
197
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
+
198
224
  function sharesOutstandingText(fundamentals: TickerFinancials["fundamentals"], inReceipts: boolean): string {
199
225
  const shares = fundamentals?.sharesOutstanding;
200
- if (shares == null || !inReceipts) return formatCompact(shares);
226
+ if (shares == null) return formatCompact(shares);
227
+ if (!inReceipts) return datedCount(shares, fundamentals?.sharesOutstandingAsOf);
201
228
  const ordinary = fundamentals?.shareBasis === "depositary_receipt" ? fundamentals.underlyingOrdinaryShares : undefined;
202
229
  return ordinary != null && Number.isFinite(ordinary) && ordinary > 0
203
230
  ? `${formatCompact(shares)} (ADR equivalent = ${formatCompact(ordinary)} ordinary shares)`
@@ -213,6 +240,19 @@ function appendTextSection(lines: string[], title: string, content: string | und
213
240
  lines.push(verbatim ? text : wrapProse(text));
214
241
  }
215
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
+
216
256
  function appendFeedSection(
217
257
  lines: string[],
218
258
  title: string,
@@ -322,8 +362,9 @@ async function appendTickerPositions(lines: string[], tickerFile: TickerRecord |
322
362
  const currentPrice = getPortfolioQuoteDisplay(metrics, quote)?.price ?? null;
323
363
  const currentPriceBase = currentPrice != null && quoteCurrency ? await toBase(currentPrice, quoteCurrency) : null;
324
364
  const positionRate = positionCurrency ? await toBase(1, positionCurrency) : Number.NaN;
325
- if (positionCurrency) converted.add(positionCurrency.toUpperCase());
326
- 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);
327
368
  const baseMetrics = getPortfolioPositionMetrics({ ...tickerFile, metadata: { ...tickerFile.metadata, positions: [position] } }, undefined, quoteCurrency,
328
369
  { currency: config.baseCurrency, convert: value => value * positionRate }, quote);
329
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.
@@ -363,7 +404,34 @@ async function appendTickerPositions(lines: string[], tickerFile: TickerRecord |
363
404
  }
364
405
 
365
406
  /** The ticker report's converter: what `createBaseConverter` makes, whose rates a report states; a plain function in tests. */
366
- 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
+ }
367
435
 
368
436
  /**
369
437
  * A base currency other than USD reads every amount with its code (259.36
@@ -387,11 +455,11 @@ interface ReportRateNotes {
387
455
  boughtAt: ReadonlySet<string>;
388
456
  }
389
457
 
390
- /** The currencies of the shown lots whose cost converts into the base currency at the rate they were bought at. */
458
+ /** The currencies of the shown lots whose cost converts into the base currency at the rate they were bought at, pence as GBP. */
391
459
  function boughtRateCurrencies(tickerFile: TickerRecord | null, quoteCurrency: string, baseCurrency: string): Set<string> {
392
460
  return new Set((tickerFile?.metadata.positions ?? []).flatMap((position) => {
393
461
  const currency = (position.currency || quoteCurrency).trim();
394
- return position.shares !== 0 && currency && lotCostFxRate(position, currency, baseCurrency) !== null ? [currency.toUpperCase()] : [];
462
+ return position.shares !== 0 && currency && lotCostFxRate(position, currency, baseCurrency) !== null ? [heldCurrencyUnit(currency).currency] : [];
395
463
  }));
396
464
  }
397
465
 
@@ -442,9 +510,13 @@ function reportedMoney(value: number | undefined, currency: string | undefined,
442
510
  return { text: formatReportedMoney(value, currency, perShare, codes), value, unit: currency?.trim() || "ccy?" };
443
511
  }
444
512
 
445
- /** 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
+ */
446
517
  function enterpriseValueFigure(figure: MetricFigure, fundamentals: TickerFinancials["fundamentals"]): MetricFigure {
447
518
  const label = enterpriseValueLabel(fundamentals);
519
+ if (label === "not-meaningful") return { ...multipleFigure(NOT_MEANINGFUL), unit: figure.unit };
448
520
  if (label === "unavailable") return { text: "unavailable", value: null, unit: figure.unit };
449
521
  return label === "provider" && figure.text !== "—" ? { ...figure, text: `${figure.text} (provider)` } : figure;
450
522
  }
@@ -664,6 +736,9 @@ function fundamentalsMetrics(
664
736
  value: fundamentals?.sharesOutstanding,
665
737
  ...(receipt ? { unit: "ADR equivalent" } : {}),
666
738
  },
739
+ ...(fundamentals?.sharesOutstanding != null && fundamentals.sharesOutstandingAsOf ? [{
740
+ label: "Shares Outstanding As Of", text: fundamentals.sharesOutstandingAsOf, value: fundamentals.sharesOutstandingAsOf, exportOnly: true,
741
+ }] : []),
667
742
  ];
668
743
  }
669
744
 
@@ -682,10 +757,12 @@ function floatAndShortInterestMetrics(
682
757
  const days = fundamentals?.shortRatio;
683
758
  const date = fundamentals?.shortInterestDate;
684
759
  const receipt = finite(float) && sharesOutstandingInReceipts(quote, fundamentals, profile?.description);
760
+ const floatAsOf = finite(float) && float > 0 ? fundamentals?.floatSharesAsOf : undefined;
685
761
  return [
686
762
  finite(float) && float > 0
687
- ? { label: "Float", text: formatCompact(float), value: float, ...(receipt ? { unit: "ADR equivalent" } : {}) }
763
+ ? { label: "Float", text: datedCount(float, floatAsOf), value: float, ...(receipt ? { unit: "ADR equivalent" } : {}) }
688
764
  : { label: "Float", text: "—" },
765
+ ...floatAsOf ? [{ label: "Float As Of", text: floatAsOf, value: floatAsOf, exportOnly: true }] : [],
689
766
  finite(short)
690
767
  ? { label: "Short Interest", text: `${formatCompact(short)}${date ? ` (settled ${date})` : ""}`, value: short, unit: "shares" }
691
768
  : { label: "Short Interest", text: "—" },
@@ -702,7 +779,7 @@ function metricLines(metrics: readonly FundamentalsMetric[]): Array<[string, str
702
779
  const TRAILING_MONEY_METRICS = new Set(["EPS (TTM)", "Revenue (TTM)", "Net Income (TTM)", "Operating Cash Flow (TTM)", "Free Cash Flow (TTM)"]);
703
780
 
704
781
  /**
705
- * 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
706
783
  * withdrawn EV compares with market cap + debt - cash, what a converted TTM block was converted from, an EPS in
707
784
  * another currency than the amounts beside it, and what a P/E on such an EPS divides. `priced` is the snapshot at
708
785
  * the regular session price (atRegularSessionPrice), the figures the lines show, so each note reads those.
@@ -714,21 +791,24 @@ function fundamentalsNotes(
714
791
  ): string[] {
715
792
  const fundamentals = priced.fundamentals;
716
793
  const shown = (label: string) => metrics.some((metric) => metric.label === label && metric.text !== "—");
717
- const shareBasis = shown("Market Cap") && shown("Shares Outstanding")
718
- ? marketCapShareBasisNote(selectMarketCapitalization(priced.quote, fundamentals), fundamentals?.sharesOutstanding,
719
- 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)))
720
797
  : undefined;
721
798
  const conversion = [...TRAILING_MONEY_METRICS].some(shown) ? ttmConversionNote(fundamentals) : undefined;
722
799
  const eps = shown("EPS (TTM)") ? epsConversionNote(fundamentals) : undefined;
723
800
  const priceEarnings = metrics.some((metric) => metric.label === "P/E (TTM)" && typeof metric.value === "number")
724
801
  ? convertedPriceEarningsNote(fundamentals, quoteCurrency)
725
802
  : undefined;
726
- 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;
727
807
  return [shareBasis, enterpriseValue, conversion, eps, priceEarnings].filter((note): note is string => !!note);
728
808
  }
729
809
 
730
810
  // The share count is the market cap's basis: the cap is the count times the price, or a note says why not.
731
- 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)"]);
732
812
 
733
813
  type FundamentalsReportData = TickerFinancials & {
734
814
  symbol: string;
@@ -772,7 +852,7 @@ function fundFactsNote(
772
852
  if (resolveTickerInstrumentKind(tickerFile, financials) !== "fund") return null;
773
853
  return !exchange || isUsListingExchange(exchange)
774
854
  ? `Fund facts (fee, NAV, premium, net assets): fn ETF ${symbol}.`
775
- : "Fund facts (fee, NAV, premium) cover US-listed funds only.";
855
+ : US_FUND_FACTS_ONLY;
776
856
  }
777
857
 
778
858
  /**
@@ -828,7 +908,7 @@ function fundamentalsReportMetrics(snapshot: FundamentalsReportData, view: "fund
828
908
  const financials = atRegularSessionPrice(snapshot);
829
909
  const quote = financials.quote;
830
910
  const fundamentals = financials.fundamentals;
831
- const capitalization = selectMarketCapitalization(quote, fundamentals);
911
+ const capitalization = viewMarketCapitalization(quote, fundamentals, regularSessionValuationPrice(quote));
832
912
  const marketCap: MetricFigure = capitalization
833
913
  ? { text: `${formatCompact(capitalization.value)} ${capitalization.currency}`, value: capitalization.value, unit: capitalization.currency }
834
914
  : { text: "—" };
@@ -840,13 +920,14 @@ function fundamentalsReportMetrics(snapshot: FundamentalsReportData, view: "fund
840
920
  }
841
921
  const valued = metrics.filter(({ label, text }) => (VALUATION_METRICS.has(label) || isYieldMetric(label)) && text !== "—");
842
922
  // The share count follows the market cap it is the basis of.
843
- const shares = valued.filter((metric) => metric.label === "Shares Outstanding");
844
- 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]);
845
926
  // A listing with no valuation (a fund) says so rather than printing its price alone.
846
927
  return valuation.length === 0 ? [] : [...valuationPriceMetrics(financials).filter((metric) => metric.text !== "—"), ...valuation];
847
928
  }
848
929
 
849
- /** 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. */
850
931
  export function renderFundamentalsReport(
851
932
  financials: FundamentalsReportData,
852
933
  view: "fundamentals" | "valuation",
@@ -882,7 +963,7 @@ export function renderFundamentalsReport(
882
963
  } else if (financials.bankNote) {
883
964
  lines.push("", renderSection("Bank"), cliStyles.muted(financials.bankNote));
884
965
  }
885
- appendTextSection(lines, "Description", profile?.description);
966
+ appendDescription(lines, profile);
886
967
  }
887
968
  return lines.join("\n");
888
969
  }
@@ -929,6 +1010,10 @@ export function fundamentalsReportTables(
929
1010
  { label: "Sector", value: profile?.sector },
930
1011
  { label: "Industry", value: profile?.industry },
931
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
+ ] : [],
932
1017
  ].filter((entry) => typeof entry.value === "string" && entry.value.trim().length > 0)));
933
1018
  }
934
1019
  return {
@@ -975,16 +1060,20 @@ export async function buildTickerReport({
975
1060
  recentSecFilings = [],
976
1061
  hiddenSecFilings = NOTHING_HIDDEN,
977
1062
  futuresContract = null,
1063
+ usdPerMmbtu = null,
978
1064
  distributions = null,
979
1065
  statementFilings = null,
980
1066
  bondFund = null,
981
1067
  memberships,
1068
+ offerings = [],
982
1069
  }: {
983
1070
  symbol: string;
984
1071
  /** The lists holding the company, by any of its listings (loadCompanyMemberships); the saved listing's own lists when absent. */
985
1072
  memberships?: CompanyMemberships;
986
1073
  /** The filings behind the latest statements, and a newer quarter's results release. */
987
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[];
988
1077
  /** A bond fund's SEC yield, yield to worst and duration (loadReportBondFacts). */
989
1078
  bondFund?: FundBondFacts | null;
990
1079
  /** The distributions a dividend yield is read with (loadDividendDistributions). */
@@ -993,6 +1082,8 @@ export async function buildTickerReport({
993
1082
  listingExchange?: string;
994
1083
  /** A futures symbol's contract terms and latest confirmed settlement. */
995
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;
996
1087
  tickerFile: TickerRecord | null;
997
1088
  financials: TickerFinancials;
998
1089
  config: AppConfig;
@@ -1052,6 +1143,11 @@ export async function buildTickerReport({
1052
1143
  if (metadataParts.length > 0) {
1053
1144
  lines.push(cliStyles.muted(metadataParts.join(METADATA_SEPARATOR)));
1054
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
+ }
1055
1151
 
1056
1152
  // A list that holds the company as another of its listings says which: "Watchlists R (as RCI.B:TSX)".
1057
1153
  const lists = memberships ?? companyMemberships(config, tickerFile, [], null);
@@ -1070,7 +1166,7 @@ export async function buildTickerReport({
1070
1166
 
1071
1167
  // Market cap and the multiples are measured at the regular session price the Quote section heads with.
1072
1168
  const priced = atRegularSessionPrice(financials);
1073
- const capitalization = selectMarketCapitalization(priced.quote, priced.fundamentals);
1169
+ const capitalization = viewMarketCapitalization(priced.quote, priced.fundamentals, regularSessionValuationPrice(priced.quote));
1074
1170
  // Market cap and EV read in the currency they are reported in, as the revenue and income beside them do,
1075
1171
  // with the base currency's figure after them when it differs: 627.2B USD (878.15B CAD).
1076
1172
  const convertedCurrencies = new Set<string>();
@@ -1107,12 +1203,14 @@ export async function buildTickerReport({
1107
1203
  // A futures price is its latest trade; the exchange settlement is its own row, dated by its session.
1108
1204
  appendMetricSection(lines, "Quote", [
1109
1205
  // A price in cents says what it is per: 314.95¢/lb.
1110
- ["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)],
1111
1207
  ...futuresContract
1112
- ? [["Settle", futuresSettleText(futuresContract, quote)] as [string, string]]
1208
+ ? [["Settle", quoteSettleText(quote, futuresContract)] as [string, string]]
1113
1209
  : [],
1114
1210
  // The move says what it is measured from: "vs Fri 16 Oct close", a future's "vs Fri 16 Oct settle".
1115
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]] : [],
1116
1214
  ["Open", quote.open != null ? formatMarketPriceWithCurrency(quote.open, quote.currency, quoteOptions) : "—"],
1117
1215
  // A listing that no longer trades: its last session's range, never today's.
1118
1216
  [quote.delisting ? "Last Session" : "Day Range", quote.low != null || quote.high != null
@@ -1137,9 +1235,22 @@ export async function buildTickerReport({
1137
1235
 
1138
1236
  const metrics = fundamentalsMetrics(quote, priced.fundamentals, profile, { text: marketCapText }, priceReturns, fundamentalsCurrency(financials),
1139
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
+
1140
1246
  const beforeFundamentals = lines.length;
1141
1247
  appendMetricSection(lines, "Fundamentals", metricLines(metrics));
1142
1248
  for (const note of fundamentalsNotes(priced, metrics, quote?.currency)) 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));
1143
1254
  if (lines.length > beforeFundamentals) for (const note of conversionNotes(toBase, convertedCurrencies, rates)) lines.push(cliStyles.muted(note));
1144
1255
  // Where a fund's facts would go: under its fundamentals, or in their place.
1145
1256
  const fund = fundFactsNote(quote?.symbol ?? symbol,
@@ -1150,26 +1261,24 @@ export async function buildTickerReport({
1150
1261
  lines.push(cliStyles.muted(`Market cap: ${describeFundamentalMarketCap(capitalization.provenance)}.`));
1151
1262
  }
1152
1263
 
1153
- const reportedCurrency = financials.financialCurrency?.trim();
1154
- const statements = [...financials.annualStatements, ...financials.quarterlyStatements];
1155
- const fallbackCurrency = reportedCurrency && statements.every((row) => !row.currency?.trim() || row.currency.trim() === reportedCurrency)
1156
- ? reportedCurrency : undefined;
1157
- const statementCurrency = (row: FinancialStatement) => row.currency?.trim() || fallbackCurrency;
1158
- const latestAnnual = latestFinancialPeriod(financials.annualStatements, row => row.date);
1159
1264
  if (latestAnnual) {
1160
1265
  appendMetricSection(lines, `Latest Annual (${statementPeriodText(latestAnnual.date, statementFilings?.latestAnnual ?? null)})`,
1161
1266
  buildStatementMetrics(latestAnnual, statementCurrency(latestAnnual), codes));
1162
1267
  }
1163
1268
 
1164
- const latestQuarter = latestFinancialPeriod(financials.quarterlyStatements, row => row.date);
1165
1269
  if (latestQuarter) {
1270
+ const runway = cashRunway(financials);
1166
1271
  appendMetricSection(lines, `Latest Quarter (${statementPeriodText(latestQuarter.date, statementFilings?.latestQuarter ?? null)})`,
1167
- 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));
1168
1277
  }
1169
1278
  // The statements stop a quarter short of the results the company has released.
1170
1279
  if (statementFilings?.resultsRelease && (latestAnnual || latestQuarter)) lines.push(cliStyles.muted(resultsReleaseText(statementFilings.resultsRelease)));
1171
1280
 
1172
- appendTextSection(lines, "Description", profile?.description);
1281
+ appendDescription(lines, profile);
1173
1282
 
1174
1283
  appendTextSection(lines, "Notes", notes, true);
1175
1284
 
@@ -1184,7 +1293,7 @@ export async function buildTickerReport({
1184
1293
  ],
1185
1294
  body: item.summary,
1186
1295
  link: item.url,
1187
- })));
1296
+ })), recentNews[0]?.searchedFor ? coinNewsFallbackNotice(symbol, recentNews[0].searchedFor) : null);
1188
1297
 
1189
1298
  appendFeedSection(lines, "Recent SEC Filings", recentSecFilings.map((filing) => ({
1190
1299
  title: (() => {
@@ -1216,17 +1325,22 @@ function buildTickerStructuredData({
1216
1325
  recentSecFilings,
1217
1326
  hiddenSecFilings,
1218
1327
  futuresContract,
1328
+ usdPerMmbtu = null,
1219
1329
  distributions,
1220
1330
  statementFilings,
1221
1331
  bondFund = null,
1222
1332
  memberships,
1333
+ offerings = [],
1223
1334
  }: {
1224
1335
  symbol: string;
1225
1336
  listing: CliListing;
1226
1337
  memberships: CompanyMemberships;
1227
1338
  statementFilings: StatementFilingsReport | null;
1339
+ offerings?: readonly OfferingFiling[];
1228
1340
  bondFund?: FundBondFacts | null;
1229
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;
1230
1344
  distributions: DividendDistributions | null;
1231
1345
  tickerFile: TickerRecord | null;
1232
1346
  financials: TickerFinancials;
@@ -1241,6 +1355,7 @@ function buildTickerStructuredData({
1241
1355
  const identity = listingIdentity(listing, quote);
1242
1356
  // Market cap and the multiples at the regular session price, as the text report gives them.
1243
1357
  const priced = atRegularSessionPrice(financials);
1358
+ const runway = cashRunway(financials);
1244
1359
  return {
1245
1360
  symbol,
1246
1361
  listing: { symbol: identity.symbol, exchange: identity.exchange || null, name: identity.name },
@@ -1266,8 +1381,11 @@ function buildTickerStructuredData({
1266
1381
  lastUpdated: quote.lastUpdated ? new Date(quote.lastUpdated).toISOString() : "",
1267
1382
  } : null,
1268
1383
  quoteMetadata: financials.quoteMetadata,
1384
+ // The receipt pair the listing is a side of, and which side.
1385
+ ...depositaryPairJson(financials),
1269
1386
  // Only for futures: the contract the symbol prices, its terms and its latest confirmed settlement.
1270
1387
  ...futuresContract ? { futuresContract } : {},
1388
+ ...usdPerMmbtu ? { usdPerMmbtu } : {},
1271
1389
  ticker: tickerFile ? {
1272
1390
  ticker: tickerFile.metadata.ticker,
1273
1391
  name: tickerFile.metadata.name ?? "",
@@ -1294,6 +1412,10 @@ function buildTickerStructuredData({
1294
1412
  latestQuarter: latestFinancialPeriod(financials.quarterlyStatements, row => row.date) ?? null,
1295
1413
  annualStatementCount: financials.annualStatements.length,
1296
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) : [],
1297
1419
  // The form and filed date of the latest periods' filings, and a newer quarter's results released before its statements.
1298
1420
  statementFilings,
1299
1421
  notes,
@@ -1321,6 +1443,13 @@ function buildTickerStructuredData({
1321
1443
  };
1322
1444
  }
1323
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
+
1324
1453
  const QUOTE_UNAVAILABLE = "Quote unavailable.";
1325
1454
 
1326
1455
  /** Asks for the quote the report lacks once more, for the reason the data service gave when it had none. */
@@ -1422,6 +1551,8 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
1422
1551
  loadTickers: () => store.loadAllTickers(),
1423
1552
  dataProvider,
1424
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);
1425
1556
  const [notesResult, newsResult, secFilingsResult] = await Promise.allSettled([
1426
1557
  notesFiles.load(tickerFile?.metadata.ticker ?? normalized),
1427
1558
  dataProvider.getNews({
@@ -1432,6 +1563,10 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
1432
1563
  exchange: exchange || quote?.exchangeName || "",
1433
1564
  tickerTier: "primary",
1434
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
+ : {}),
1435
1570
  }),
1436
1571
  // Outside the US the lookup checks the SEC registrant against the listing's company,
1437
1572
  // and refuses another company's filings.
@@ -1442,6 +1577,9 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
1442
1577
  ]);
1443
1578
 
1444
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));
1445
1583
  const notes = notesResult.status === "fulfilled" ? notesResult.value : "";
1446
1584
  const recentNews = newsResult.status === "fulfilled" ? newsResult.value : [];
1447
1585
  const { filings: recentSecFilings, hidden: hiddenSecFilings } = secFilingsResult.status === "fulfilled"
@@ -1456,8 +1594,11 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
1456
1594
  : notTheCoinNote(listing.symbol, quote ?? (tickerFile ? { name: tickerFile.metadata.name, instrumentType: tickerFile.metadata.assetCategory } : null));
1457
1595
  const listingNote = [choiceNote, coinNote].filter((note): note is string => !!note).join("\n") || undefined;
1458
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);
1459
1599
  if (dependencies.printResult) {
1460
- 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);
1461
1602
  dependencies.printResult({
1462
1603
  freshness,
1463
1604
  warnings: warnings.length > 0 ? warnings : undefined,
@@ -1465,17 +1606,19 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
1465
1606
  symbol: normalized,
1466
1607
  listing,
1467
1608
  tickerFile,
1468
- financials: resolvedFinancials,
1609
+ financials: shownFinancials,
1469
1610
  config,
1470
1611
  notes,
1471
1612
  recentNews,
1472
1613
  recentSecFilings,
1473
1614
  hiddenSecFilings,
1474
1615
  futuresContract,
1616
+ usdPerMmbtu,
1475
1617
  distributions: await distributions,
1476
1618
  statementFilings: await statementFilings,
1477
1619
  bondFund: await bondFund,
1478
1620
  memberships,
1621
+ offerings: await offerings,
1479
1622
  }),
1480
1623
  });
1481
1624
  return;
@@ -1485,7 +1628,7 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
1485
1628
  symbol: normalized,
1486
1629
  listingExchange: listing.exchange,
1487
1630
  tickerFile,
1488
- financials: resolvedFinancials,
1631
+ financials: shownFinancials,
1489
1632
  config,
1490
1633
  toBase,
1491
1634
  notes,
@@ -1495,11 +1638,13 @@ export async function ticker(symbol: string, dependencies: TickerCommandDependen
1495
1638
  recentSecFilings,
1496
1639
  hiddenSecFilings,
1497
1640
  futuresContract,
1641
+ usdPerMmbtu,
1498
1642
  distributions: await distributions,
1499
1643
  statementFilings: await statementFilings,
1500
1644
  bondFund: await bondFund,
1501
1645
  memberships,
1646
+ offerings: await offerings,
1502
1647
  }));
1503
- if (freshness) console.log(`\n${cliFreshnessFooter(freshness)}`);
1648
+ if (freshness) console.log(`\n${cliFreshnessFooter(freshness, quote ?? resolvedFinancials)}`);
1504
1649
  });
1505
1650
  }
@@ -10,7 +10,7 @@ import type { PluginCapability } from "../capabilities";
10
10
  import type { AppConfig } from "../types/config";
11
11
  import type { GloomPlugin } from "../types/plugin";
12
12
  import { getLoadablePlugins } from "../plugins/catalog";
13
- import { standaloneSeriesInvoker } from "../series/standalone";
13
+ import { standaloneSeriesCatalog, standaloneSeriesInvoker } from "../series/standalone";
14
14
  import type { PluginRegistry } from "../plugins/registry";
15
15
  import type { LoadedExternalPlugin } from "../plugins/loader";
16
16
  import { apiClient } from "../api-client";
@@ -131,7 +131,8 @@ export async function initMarketData(options: CliContextOptions = {}): Promise<M
131
131
  dataProvider.setConfigAccessor(() => context.config);
132
132
  dataProvider.setBackgroundRevalidation(false);
133
133
  const seriesCapabilities = standaloneSeriesInvoker(plugins, context.dataDir, context.config.disabledPlugins);
134
- return { ...context, dataProvider, seriesCapabilities, statementSources: cloudStatementReportSources };
134
+ const findCatalogSeries = standaloneSeriesCatalog(plugins, context.config.disabledPlugins);
135
+ return { ...context, dataProvider, seriesCapabilities, findCatalogSeries, statementSources: cloudStatementReportSources };
135
136
  }
136
137
 
137
138
  export async function initCliServices(options: CliServicesOptions = {}) {