gloomberb 0.18.4 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (600) hide show
  1. package/README.md +1 -1
  2. package/README.zh-CN.md +1 -1
  3. package/package.json +1 -1
  4. package/patches/electrobun@1.18.1.patch +169 -5
  5. package/src/account/auth-model.ts +7 -3
  6. package/src/api-client/auth.ts +9 -4
  7. package/src/api-client/catalysts.ts +2 -1
  8. package/src/api-client/cot.ts +6 -2
  9. package/src/api-client/credit-documents.ts +6 -0
  10. package/src/api-client/data.ts +31 -6
  11. package/src/api-client/equity-screener.ts +24 -0
  12. package/src/api-client/fund-facts.ts +45 -4
  13. package/src/api-client/index.ts +171 -11
  14. package/src/api-client/live-scan.ts +91 -0
  15. package/src/api-client/market-discovery.ts +10 -0
  16. package/src/api-client/market-movers.ts +7 -0
  17. package/src/api-client/members.ts +13 -1
  18. package/src/api-client/perps.ts +43 -0
  19. package/src/api-client/request.ts +222 -41
  20. package/src/api-client/research-activity.ts +6 -12
  21. package/src/api-client/types.ts +74 -0
  22. package/src/app/keybindings/index.ts +3 -0
  23. package/src/app/keybindings/labels.ts +18 -1
  24. package/src/app/keybindings/resolve.ts +14 -0
  25. package/src/app/pane-runtime/plugin-bindings.ts +9 -5
  26. package/src/app/runtime/broker-import.ts +42 -27
  27. package/src/app/runtime/plugin-bindings.ts +73 -56
  28. package/src/architecture/core-builtin-allowlist.json +1 -1
  29. package/src/architecture/pane-tabs-allowlist.json +3 -0
  30. package/src/architecture/ttl-caches-allowlist.json +19 -0
  31. package/src/brokers/sync-broker-instance.ts +2 -8
  32. package/src/capabilities/chart-series.ts +1 -1
  33. package/src/cli/commands/crypto-hints.ts +40 -24
  34. package/src/cli/commands/fred-series.ts +5 -0
  35. package/src/cli/commands/keybindings.ts +23 -0
  36. package/src/cli/commands/market.ts +138 -46
  37. package/src/cli/commands/options-chain.ts +107 -10
  38. package/src/cli/commands/options-leaps.ts +9 -3
  39. package/src/cli/commands/overview.ts +176 -39
  40. package/src/cli/commands/search.ts +39 -3
  41. package/src/cli/commands/themes.ts +11 -2
  42. package/src/cli/commands/ticker.ts +57 -35
  43. package/src/cli/company-name-hint.ts +41 -0
  44. package/src/cli/earnings-calendar.ts +1 -1
  45. package/src/cli/errors.ts +10 -2
  46. package/src/cli/export-source.ts +29 -1
  47. package/src/cli/glossary.ts +73 -1
  48. package/src/cli/history-rows.ts +87 -16
  49. package/src/cli/index.ts +2 -0
  50. package/src/cli/known-gaps.ts +5 -2
  51. package/src/cli/listing-arg.ts +195 -56
  52. package/src/cli/output-file.ts +68 -0
  53. package/src/cli/pane-functions/capabilities.ts +3 -0
  54. package/src/cli/pane-functions/catalog.ts +80 -7
  55. package/src/cli/pane-functions/dom.ts +13 -3
  56. package/src/cli/pane-functions/freshness.ts +111 -16
  57. package/src/cli/pane-functions/function-help.ts +23 -13
  58. package/src/cli/pane-functions/headless.ts +56 -12
  59. package/src/cli/pane-functions/index.ts +58 -16
  60. package/src/cli/pane-functions/market-session.ts +81 -9
  61. package/src/cli/pane-functions/options.ts +19 -1
  62. package/src/cli/pane-functions/report.ts +5 -1
  63. package/src/cli/pane-functions/resolver.ts +35 -8
  64. package/src/cli/pane-functions/screenshot-assessment.ts +6 -4
  65. package/src/cli/pane-functions/screenshot-types.ts +5 -0
  66. package/src/cli/quote-answer.ts +30 -13
  67. package/src/cli/report-tables.ts +18 -7
  68. package/src/cli/restore-plugins.ts +13 -1
  69. package/src/cli/result.ts +57 -5
  70. package/src/cli/ticker-resolution.ts +3 -2
  71. package/src/components/chart/composite/composite-chart.tsx +26 -4
  72. package/src/components/chart/composite/format.ts +27 -0
  73. package/src/components/chart/composite/interactions.ts +6 -0
  74. package/src/components/chart/composite/legend.tsx +45 -7
  75. package/src/components/chart/composite/levels.ts +2 -0
  76. package/src/components/chart/composite/panel-gestures.ts +33 -0
  77. package/src/components/chart/composite/panel-series.ts +1 -0
  78. package/src/components/chart/composite/panel-surface.tsx +61 -5
  79. package/src/components/chart/composite/range-statistics.ts +62 -0
  80. package/src/components/chart/composite/rasterizer.ts +24 -13
  81. package/src/components/chart/composite/scene.ts +46 -7
  82. package/src/components/chart/composite/series-axis-tags.tsx +16 -9
  83. package/src/components/chart/composite/series-cues.ts +14 -0
  84. package/src/components/chart/composite/text-renderer.ts +9 -2
  85. package/src/components/chart/composite/tool-catalog.ts +36 -0
  86. package/src/components/chart/composite/tools.ts +203 -44
  87. package/src/components/chart/composite/types.ts +4 -0
  88. package/src/components/chart/composite/use-composite-chart-keyboard.ts +11 -4
  89. package/src/components/command-bar/assist/inventory.ts +2 -1
  90. package/src/components/command-bar/commands/direct/index.ts +28 -13
  91. package/src/components/command-bar/pane-templates/items.ts +3 -2
  92. package/src/components/command-bar/panel/prompt-binding.ts +0 -8
  93. package/src/components/command-bar/workflow/alert.ts +1 -1
  94. package/src/components/command-bar/workflow/collection-actions.ts +3 -3
  95. package/src/components/layout/header.tsx +26 -40
  96. package/src/components/layout/pane/footer/index.tsx +1 -0
  97. package/src/components/layout/pane/footer/model.ts +27 -0
  98. package/src/components/onboarding/onboarding-frame.tsx +1 -1
  99. package/src/components/onboarding/onboarding-wizard.tsx +4 -1
  100. package/src/components/onboarding/portfolio-step/positions-panel.tsx +14 -9
  101. package/src/components/onboarding/wizard-broker-sync.ts +0 -1
  102. package/src/components/onboarding/wizard-positions.ts +3 -3
  103. package/src/components/ticker/list-table-view.tsx +4 -1
  104. package/src/components/ui/choice-dialog.tsx +23 -18
  105. package/src/components/ui/choice-groups.ts +18 -0
  106. package/src/components/ui/data-table/opentui/index.tsx +9 -7
  107. package/src/components/ui/data-table/opentui/model.ts +26 -1
  108. package/src/components/ui/data-table/types.ts +2 -0
  109. package/src/components/ui/display.tsx +5 -1
  110. package/src/components/ui/list-view.tsx +8 -4
  111. package/src/components/ui/query-bar-keys.tsx +2 -0
  112. package/src/components/ui/query-bar.tsx +1 -0
  113. package/src/components/ui/select-button.tsx +5 -1
  114. package/src/components/ui/select-field.tsx +1 -0
  115. package/src/components/ui/table-layout.ts +8 -5
  116. package/src/core/app-runtime.ts +2 -0
  117. package/src/core/app-services.ts +2 -2
  118. package/src/core/state/app/layout.ts +2 -0
  119. package/src/core/state/app/state.ts +9 -0
  120. package/src/core/state/app/types.ts +3 -0
  121. package/src/data/config/chart-settings.ts +1 -1
  122. package/src/data/json-ticker-repository.ts +17 -8
  123. package/src/data/saved-copies.ts +55 -16
  124. package/src/data/ticker-repository.ts +16 -9
  125. package/src/data/ticker-writes.ts +81 -0
  126. package/src/data/ttl-cache.ts +165 -0
  127. package/src/docs/snapshot.json +427 -216
  128. package/src/i18n/es.ts +19 -3
  129. package/src/i18n/ja.ts +19 -3
  130. package/src/i18n/ko.ts +19 -3
  131. package/src/i18n/zh-cn.ts +19 -3
  132. package/src/i18n/zh-tw.ts +19 -3
  133. package/src/market-data/coordinator/financials.ts +10 -2
  134. package/src/market-data/coordinator/index.ts +3 -1
  135. package/src/market-data/coordinator/quotes.ts +4 -2
  136. package/src/market-data/depositary-pair.ts +2 -2
  137. package/src/market-data/fund-facts.ts +50 -0
  138. package/src/market-data/market/change-basis.ts +48 -7
  139. package/src/market-data/market/dated-previous-close.ts +203 -0
  140. package/src/market-data/market/format.ts +25 -0
  141. package/src/market-data/market/freshness.ts +2 -1
  142. package/src/market-data/market/futures-week.ts +68 -0
  143. package/src/market-data/market/status.ts +16 -4
  144. package/src/market-data/options-alternatives.ts +141 -4
  145. package/src/market-data/quotes/contributions.ts +20 -2
  146. package/src/market-data/quotes/resolution.ts +3 -0
  147. package/src/market-data/selectors.ts +3 -0
  148. package/src/news/aggregator.ts +113 -9
  149. package/src/news/cloud-session.ts +21 -0
  150. package/src/news/hooks.ts +1 -0
  151. package/src/news/news-model.ts +1 -0
  152. package/src/news/types.ts +11 -0
  153. package/src/notifications/notification-log.ts +6 -4
  154. package/src/plugins/builtin/alerts/alert-engine.ts +25 -2
  155. package/src/plugins/builtin/alerts/alert-log.ts +33 -0
  156. package/src/plugins/builtin/alerts/calendar-events.ts +57 -6
  157. package/src/plugins/builtin/alerts/cli-forms.ts +216 -0
  158. package/src/plugins/builtin/alerts/cli.ts +380 -82
  159. package/src/plugins/builtin/alerts/command.ts +31 -0
  160. package/src/plugins/builtin/alerts/constants.ts +1 -1
  161. package/src/plugins/builtin/alerts/events-pane.tsx +19 -4
  162. package/src/plugins/builtin/alerts/fired-log.ts +113 -8
  163. package/src/plugins/builtin/alerts/format.ts +80 -4
  164. package/src/plugins/builtin/alerts/headless.ts +30 -7
  165. package/src/plugins/builtin/alerts/history-rows.ts +7 -3
  166. package/src/plugins/builtin/alerts/history.ts +2 -0
  167. package/src/plugins/builtin/alerts/index.tsx +135 -22
  168. package/src/plugins/builtin/alerts/live.ts +3 -3
  169. package/src/plugins/builtin/alerts/metric-command.ts +134 -0
  170. package/src/plugins/builtin/alerts/metric-data.ts +111 -0
  171. package/src/plugins/builtin/alerts/metric-model.ts +324 -0
  172. package/src/plugins/builtin/alerts/metric-parity-fixture.json +725 -0
  173. package/src/plugins/builtin/alerts/pane.tsx +90 -39
  174. package/src/plugins/builtin/alerts/quotes.ts +6 -0
  175. package/src/plugins/builtin/alerts/storage.ts +37 -10
  176. package/src/plugins/builtin/alerts/types.ts +7 -0
  177. package/src/plugins/builtin/analytics/index.tsx +2 -1
  178. package/src/plugins/builtin/analytics/risk-client.ts +16 -5
  179. package/src/plugins/builtin/analytics/risk-fx.ts +70 -15
  180. package/src/plugins/builtin/analytics/risk-headless.ts +27 -0
  181. package/src/plugins/builtin/analytics/risk-model.ts +55 -9
  182. package/src/plugins/builtin/analytics/risk-pane.tsx +8 -2
  183. package/src/plugins/builtin/attention/index.tsx +2 -1
  184. package/src/plugins/builtin/attention/listing.ts +14 -0
  185. package/src/plugins/builtin/backtest/headless.ts +10 -5
  186. package/src/plugins/builtin/backtest/pane.tsx +9 -4
  187. package/src/plugins/builtin/backtest/presets.ts +29 -3
  188. package/src/plugins/builtin/broker-manager/index.tsx +10 -5
  189. package/src/plugins/builtin/broker-manager/model.ts +6 -1
  190. package/src/plugins/builtin/broker-trading/controller.ts +22 -12
  191. package/src/plugins/builtin/broker-trading/index.tsx +13 -1
  192. package/src/plugins/builtin/broker-trading/order-feed.ts +9 -4
  193. package/src/plugins/builtin/broker-trading/pane.tsx +1 -1
  194. package/src/plugins/builtin/buildout/cells.tsx +12 -4
  195. package/src/plugins/builtin/buildout/format.ts +38 -0
  196. package/src/plugins/builtin/buildout/model/normalizers.ts +36 -1
  197. package/src/plugins/builtin/buildout/pane/index.tsx +4 -1
  198. package/src/plugins/builtin/buildout/table-model.ts +23 -2
  199. package/src/plugins/builtin/builtin-plugin-meta.ts +7 -3
  200. package/src/plugins/builtin/catalysts/model.ts +2 -1
  201. package/src/plugins/builtin/changelog/index.tsx +9 -6
  202. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +6 -1
  203. package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +1 -1
  204. package/src/plugins/builtin/chart-composer/cli-options.ts +9 -5
  205. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +12 -2
  206. package/src/plugins/builtin/chart-composer/editor/controller.ts +4 -2
  207. package/src/plugins/builtin/chart-composer/editor/model.ts +2 -0
  208. package/src/plugins/builtin/chart-composer/editor.tsx +7 -5
  209. package/src/plugins/builtin/chart-composer/formula.ts +71 -18
  210. package/src/plugins/builtin/chart-composer/headless-schema.ts +21 -4
  211. package/src/plugins/builtin/chart-composer/headless.ts +19 -3
  212. package/src/plugins/builtin/chart-composer/index.tsx +1 -1
  213. package/src/plugins/builtin/chart-composer/pane.tsx +53 -9
  214. package/src/plugins/builtin/chart-composer/presets.ts +50 -15
  215. package/src/plugins/builtin/chart-composer/quick-add.tsx +40 -25
  216. package/src/plugins/builtin/chart-composer/session-history.ts +18 -9
  217. package/src/plugins/builtin/chart-composer/settings.ts +27 -0
  218. package/src/plugins/builtin/chart-composer/use-series-catalog.ts +40 -26
  219. package/src/plugins/builtin/chat/content/command-suggestions.ts +93 -0
  220. package/src/plugins/builtin/chat/content/composer.tsx +13 -6
  221. package/src/plugins/builtin/chat/content/footer.tsx +6 -3
  222. package/src/plugins/builtin/chat/content/index.tsx +50 -21
  223. package/src/plugins/builtin/chat/content/open-targets.ts +14 -3
  224. package/src/plugins/builtin/chat/controller/session-runtime.ts +4 -2
  225. package/src/plugins/builtin/chat/index.tsx +23 -0
  226. package/src/plugins/builtin/chat/message/desktop.tsx +1 -0
  227. package/src/plugins/builtin/chat/message/inline-tokens.tsx +23 -0
  228. package/src/plugins/builtin/chat/message/pane-chip.tsx +50 -20
  229. package/src/plugins/builtin/chat/pane-links/commands.ts +271 -0
  230. package/src/plugins/builtin/chat/pane-links/model.ts +12 -3
  231. package/src/plugins/builtin/chat/pane-links/open.ts +8 -1
  232. package/src/plugins/builtin/chat/unread-inbox-pane.tsx +10 -1
  233. package/src/plugins/builtin/clinical-trials/model.ts +0 -9
  234. package/src/plugins/builtin/clinical-trials/pane.tsx +15 -22
  235. package/src/plugins/builtin/clinical-trials/sponsor-tickers.ts +8 -6
  236. package/src/plugins/builtin/cloud/askg/manifest.ts +2 -0
  237. package/src/plugins/builtin/cloud/plugin.tsx +1 -1
  238. package/src/plugins/builtin/company-attention/building.tsx +5 -1
  239. package/src/plugins/builtin/company-attention/client.ts +8 -9
  240. package/src/plugins/builtin/company-attention/evidence.ts +4 -1
  241. package/src/plugins/builtin/company-attention/moves.tsx +5 -1
  242. package/src/plugins/builtin/company-attention/pane.tsx +9 -2
  243. package/src/plugins/builtin/company-attention/signals.tsx +5 -1
  244. package/src/plugins/builtin/correlation/headless.ts +13 -5
  245. package/src/plugins/builtin/correlation/history.ts +22 -0
  246. package/src/plugins/builtin/cot/client.ts +22 -18
  247. package/src/plugins/builtin/cot/headless.ts +15 -10
  248. package/src/plugins/builtin/cot/model.ts +14 -1
  249. package/src/plugins/builtin/cot/pane.tsx +22 -14
  250. package/src/plugins/builtin/credit-boards/client.ts +6 -10
  251. package/src/plugins/builtin/credit-conditions/headless.ts +8 -2
  252. package/src/plugins/builtin/credit-conditions/index.tsx +5 -1
  253. package/src/plugins/builtin/credit-conditions/model.ts +4 -0
  254. package/src/plugins/builtin/credit-conditions/series.ts +3 -1
  255. package/src/plugins/builtin/credit-documents/detail.tsx +2 -2
  256. package/src/plugins/builtin/credit-documents/export.ts +173 -0
  257. package/src/plugins/builtin/credit-documents/headless.ts +7 -7
  258. package/src/plugins/builtin/credit-documents/model.ts +104 -14
  259. package/src/plugins/builtin/credit-documents/pane.tsx +12 -5
  260. package/src/plugins/builtin/custom-view/sources.ts +2 -0
  261. package/src/plugins/builtin/dividend-yield/client.ts +131 -23
  262. package/src/plugins/builtin/dividend-yield/headless.ts +44 -16
  263. package/src/plugins/builtin/dividend-yield/model.ts +8 -5
  264. package/src/plugins/builtin/dividend-yield/pane.tsx +38 -13
  265. package/src/plugins/builtin/dividend-yield/ranking.ts +37 -14
  266. package/src/plugins/builtin/dividend-yield/types.ts +20 -2
  267. package/src/plugins/builtin/dividend-yield/view.ts +30 -2
  268. package/src/plugins/builtin/docs/targets.ts +5 -1
  269. package/src/plugins/builtin/earnings/board-model.ts +16 -15
  270. package/src/plugins/builtin/earnings/board.tsx +62 -71
  271. package/src/plugins/builtin/earnings/headless.ts +40 -4
  272. package/src/plugins/builtin/earnings/scope.ts +31 -43
  273. package/src/plugins/builtin/earnings-calls/calendar.tsx +2 -2
  274. package/src/plugins/builtin/earnings-calls/format.ts +31 -2
  275. package/src/plugins/builtin/earnings-calls/headless.ts +7 -2
  276. package/src/plugins/builtin/earnings-calls/model.ts +6 -1
  277. package/src/plugins/builtin/earnings-calls/pane.tsx +5 -4
  278. package/src/plugins/builtin/econ/calendar-model.ts +14 -9
  279. package/src/plugins/builtin/econ/figures.ts +72 -0
  280. package/src/plugins/builtin/econ/index.tsx +33 -3
  281. package/src/plugins/builtin/econ/types.ts +4 -0
  282. package/src/plugins/builtin/econ-statistics/defs.ts +6 -0
  283. package/src/plugins/builtin/econ-statistics/headless.ts +85 -35
  284. package/src/plugins/builtin/econ-statistics/stats.ts +37 -9
  285. package/src/plugins/builtin/econ-statistics/view.ts +3 -0
  286. package/src/plugins/builtin/equity-screener/categories.ts +179 -0
  287. package/src/plugins/builtin/equity-screener/client.ts +4 -2
  288. package/src/plugins/builtin/equity-screener/headless.ts +144 -13
  289. package/src/plugins/builtin/equity-screener/ideas.ts +49 -0
  290. package/src/plugins/builtin/equity-screener/model.ts +99 -10
  291. package/src/plugins/builtin/equity-screener/pane.tsx +70 -15
  292. package/src/plugins/builtin/exposure/charts.tsx +2 -2
  293. package/src/plugins/builtin/exposure/model.ts +13 -1
  294. package/src/plugins/builtin/exposure/pane.tsx +4 -4
  295. package/src/plugins/builtin/fixed-income/pane.tsx +2 -1
  296. package/src/plugins/builtin/futures/index.tsx +1 -0
  297. package/src/plugins/builtin/futures/model.ts +2 -1
  298. package/src/plugins/builtin/futures/table.tsx +2 -2
  299. package/src/plugins/builtin/futures/use-board-terms.ts +42 -28
  300. package/src/plugins/builtin/futures/use-front-returns.ts +45 -28
  301. package/src/plugins/builtin/fx-matrix/client.ts +11 -3
  302. package/src/plugins/builtin/fx-matrix/headless.ts +6 -3
  303. package/src/plugins/builtin/fx-matrix/index.tsx +16 -4
  304. package/src/plugins/builtin/fx-matrix/live-legs.ts +54 -3
  305. package/src/plugins/builtin/gpu/headless.ts +8 -2
  306. package/src/plugins/builtin/help/function-index.ts +4 -1
  307. package/src/plugins/builtin/help/index.tsx +1 -0
  308. package/src/plugins/builtin/help/keybindings-editor.tsx +18 -14
  309. package/src/plugins/builtin/help/shortcut-model.ts +1 -1
  310. package/src/plugins/builtin/holders/fund-holders.ts +51 -0
  311. package/src/plugins/builtin/holders/headless.ts +18 -1
  312. package/src/plugins/builtin/iv-history/client.ts +52 -11
  313. package/src/plugins/builtin/iv-history/format.ts +36 -23
  314. package/src/plugins/builtin/iv-history/headless.ts +36 -18
  315. package/src/plugins/builtin/iv-history/index.tsx +2 -2
  316. package/src/plugins/builtin/iv-history/model.ts +163 -27
  317. package/src/plugins/builtin/iv-history/pane.tsx +10 -6
  318. package/src/plugins/builtin/iv-history/screen-pane.tsx +22 -15
  319. package/src/plugins/builtin/iv-history/universe.ts +5 -1
  320. package/src/plugins/builtin/jobs/client.ts +25 -29
  321. package/src/plugins/builtin/kelly-sizer/model.ts +12 -8
  322. package/src/plugins/builtin/kelly-sizer/pane.tsx +9 -9
  323. package/src/plugins/builtin/kelly-sizer/sections.tsx +19 -10
  324. package/src/plugins/builtin/kelly-sizer/types.ts +10 -4
  325. package/src/plugins/builtin/macro-day/pane.tsx +7 -5
  326. package/src/plugins/builtin/macro-day/release-table.ts +2 -2
  327. package/src/plugins/builtin/market-heatmap/data.ts +8 -33
  328. package/src/plugins/builtin/market-movers/client.ts +25 -7
  329. package/src/plugins/builtin/market-movers/footer.ts +2 -2
  330. package/src/plugins/builtin/market-movers/headless.ts +32 -12
  331. package/src/plugins/builtin/market-movers/index.tsx +26 -14
  332. package/src/plugins/builtin/market-movers/min-float.ts +74 -0
  333. package/src/plugins/builtin/market-movers/model.ts +4 -1
  334. package/src/plugins/builtin/market-movers/screener.ts +14 -0
  335. package/src/plugins/builtin/market-movers/session-body.tsx +13 -8
  336. package/src/plugins/builtin/market-movers/session-table.ts +4 -3
  337. package/src/plugins/builtin/market-movers/table.ts +17 -5
  338. package/src/plugins/builtin/members/breadth-pane.tsx +82 -0
  339. package/src/plugins/builtin/members/client.ts +19 -4
  340. package/src/plugins/builtin/members/headless.ts +20 -7
  341. package/src/plugins/builtin/members/index.tsx +9 -9
  342. package/src/plugins/builtin/members/model.ts +23 -4
  343. package/src/plugins/builtin/members/pane.tsx +25 -15
  344. package/src/plugins/builtin/news/index.tsx +1 -0
  345. package/src/plugins/builtin/news/wire/categories.ts +19 -3
  346. package/src/plugins/builtin/news/wire/industry-pane.tsx +1 -0
  347. package/src/plugins/builtin/news/wire/news/footer.ts +31 -5
  348. package/src/plugins/builtin/news/wire/news/preset-pane.tsx +6 -1
  349. package/src/plugins/builtin/news/wire/news/table.tsx +2 -2
  350. package/src/plugins/builtin/openfda/client.ts +14 -2
  351. package/src/plugins/builtin/openfda/index.tsx +3 -2
  352. package/src/plugins/builtin/openfda/model.ts +9 -0
  353. package/src/plugins/builtin/openfda/pane.tsx +42 -6
  354. package/src/plugins/builtin/options/analytics.ts +54 -6
  355. package/src/plugins/builtin/options/enrichment.ts +17 -5
  356. package/src/plugins/builtin/options/model-spot.ts +5 -2
  357. package/src/plugins/builtin/options/strike-window.ts +2 -1
  358. package/src/plugins/builtin/options/table.ts +6 -9
  359. package/src/plugins/builtin/options/types.ts +2 -0
  360. package/src/plugins/builtin/options/view.tsx +42 -12
  361. package/src/plugins/builtin/options-positioning/client.ts +30 -0
  362. package/src/plugins/builtin/options-positioning/headless.ts +74 -21
  363. package/src/plugins/builtin/options-positioning/index.tsx +4 -4
  364. package/src/plugins/builtin/options-positioning/model.ts +122 -14
  365. package/src/plugins/builtin/options-positioning/pane.tsx +87 -42
  366. package/src/plugins/builtin/options-scenario/client.ts +116 -47
  367. package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +142 -10
  368. package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +206 -55
  369. package/src/plugins/builtin/options-scenario/csp-screen.ts +63 -23
  370. package/src/plugins/builtin/options-scenario/csp.ts +8 -2
  371. package/src/plugins/builtin/options-scenario/index.tsx +9 -7
  372. package/src/plugins/builtin/options-scenario/strategy-screen.ts +532 -0
  373. package/src/plugins/builtin/pe-band/model.ts +12 -49
  374. package/src/plugins/builtin/perps/cascade-tabs.tsx +161 -0
  375. package/src/plugins/builtin/perps/cascade.ts +236 -0
  376. package/src/plugins/builtin/perps/client.ts +56 -2
  377. package/src/plugins/builtin/perps/freshness.ts +12 -10
  378. package/src/plugins/builtin/perps/headless.ts +65 -9
  379. package/src/plugins/builtin/perps/index.tsx +7 -5
  380. package/src/plugins/builtin/perps/live-rows.ts +10 -3
  381. package/src/plugins/builtin/perps/model.ts +18 -4
  382. package/src/plugins/builtin/perps/pane.tsx +32 -31
  383. package/src/plugins/builtin/perps/status-line.ts +25 -0
  384. package/src/plugins/builtin/plugin-module.ts +5 -1
  385. package/src/plugins/builtin/portfolio-list/cached-account.ts +3 -1
  386. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +2 -8
  387. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +4 -4
  388. package/src/plugins/builtin/portfolio-list/cli/render.ts +12 -7
  389. package/src/plugins/builtin/portfolio-list/headless.ts +1 -1
  390. package/src/plugins/builtin/portfolio-list/pane/futures-front.ts +40 -0
  391. package/src/plugins/builtin/portfolio-list/pane/index.tsx +4 -1
  392. package/src/plugins/builtin/portfolio-list/pane/streaming.ts +5 -2
  393. package/src/plugins/builtin/portfolio-list/pane/supplemental.ts +3 -2
  394. package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +3 -1
  395. package/src/plugins/builtin/portfolio-list/summary/index.tsx +11 -8
  396. package/src/plugins/builtin/portfolio-list/table.tsx +11 -3
  397. package/src/plugins/builtin/primary-dealers/client.ts +13 -38
  398. package/src/plugins/builtin/rate-path/pane.tsx +2 -2
  399. package/src/plugins/builtin/realized-vol/index.tsx +2 -2
  400. package/src/plugins/builtin/realized-vol/pane.tsx +3 -3
  401. package/src/plugins/builtin/relative-rotation/client.ts +18 -4
  402. package/src/plugins/builtin/relative-rotation/headless.ts +3 -3
  403. package/src/plugins/builtin/relative-rotation/index.tsx +2 -1
  404. package/src/plugins/builtin/relative-rotation/model.ts +16 -40
  405. package/src/plugins/builtin/relative-rotation/pane.tsx +3 -2
  406. package/src/plugins/builtin/research/corporate-actions-pane.tsx +3 -2
  407. package/src/plugins/builtin/research/event-model.ts +10 -8
  408. package/src/plugins/builtin/research/headless.ts +1 -1
  409. package/src/plugins/builtin/research/relative-valuation-headless.ts +5 -1
  410. package/src/plugins/builtin/research/relative-valuation-model.ts +31 -3
  411. package/src/plugins/builtin/research/relative-valuation-pane.tsx +11 -9
  412. package/src/plugins/builtin/reverse-dcf/headless.ts +5 -3
  413. package/src/plugins/builtin/reverse-dcf/model.ts +61 -6
  414. package/src/plugins/builtin/reverse-dcf/pane.tsx +7 -4
  415. package/src/plugins/builtin/scanner/feed.ts +2 -2
  416. package/src/plugins/builtin/scanner/flow-model.ts +50 -4
  417. package/src/plugins/builtin/scanner/flow-pane.tsx +367 -65
  418. package/src/plugins/builtin/scanner/flow-session.ts +146 -0
  419. package/src/plugins/builtin/scanner/headless.ts +204 -35
  420. package/src/plugins/builtin/scanner/index.ts +40 -6
  421. package/src/plugins/builtin/scanner/live-condition-editor.tsx +222 -0
  422. package/src/plugins/builtin/scanner/live-feed.ts +168 -0
  423. package/src/plugins/builtin/scanner/live-headless.ts +138 -0
  424. package/src/plugins/builtin/scanner/live-model.ts +362 -0
  425. package/src/plugins/builtin/scanner/live-pane.tsx +677 -0
  426. package/src/plugins/builtin/scanner/live-track.ts +186 -0
  427. package/src/plugins/builtin/scanner/lock-note.ts +3 -2
  428. package/src/plugins/builtin/seasonality/headless.ts +10 -1
  429. package/src/plugins/builtin/sec/fund-facts-view.tsx +5 -2
  430. package/src/plugins/builtin/sec/fund-facts.ts +116 -34
  431. package/src/plugins/builtin/sec/headless.ts +2 -1
  432. package/src/plugins/builtin/series-inventory.ts +3 -0
  433. package/src/plugins/builtin/shared/cloud-resource.ts +3 -2
  434. package/src/plugins/builtin/shared/cloud-upgrade.ts +4 -3
  435. package/src/plugins/builtin/shared/earnings-calendar.ts +6 -2
  436. package/src/plugins/builtin/shared/earnings-report.ts +2 -2
  437. package/src/plugins/builtin/shared/job-posting.ts +1 -0
  438. package/src/plugins/builtin/shared/macro-releases.ts +65 -0
  439. package/src/plugins/builtin/shared/members-menu.tsx +3 -2
  440. package/src/plugins/builtin/shared/pro-lock-note.ts +12 -12
  441. package/src/plugins/builtin/shared/report-freshness.ts +3 -2
  442. package/src/plugins/builtin/shared/scanner-capture.ts +3 -0
  443. package/src/plugins/builtin/shared/ticker-choice.tsx +2 -1
  444. package/src/plugins/builtin/shared/ticker-company.ts +77 -0
  445. package/src/plugins/builtin/shared/use-quote-board.ts +10 -3
  446. package/src/plugins/builtin/shared/volatility/live-session.ts +34 -8
  447. package/src/plugins/builtin/shared/volatility/pricing.ts +26 -1
  448. package/src/plugins/builtin/shared/wall-view-lifecycle.ts +3 -1
  449. package/src/plugins/builtin/themes/headless.ts +6 -4
  450. package/src/plugins/builtin/themes/model.ts +17 -8
  451. package/src/plugins/builtin/themes/pane.tsx +7 -7
  452. package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +43 -18
  453. package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +3 -2
  454. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +62 -0
  455. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +83 -46
  456. package/src/plugins/builtin/ticker-detail/headless.ts +31 -16
  457. package/src/plugins/builtin/ticker-detail/overview/model.ts +1 -1
  458. package/src/plugins/builtin/ticker-detail/pane.tsx +3 -2
  459. package/src/plugins/builtin/ticker-detail/quote-footer.ts +6 -1
  460. package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +2 -1
  461. package/src/plugins/builtin/ticker-detail/settings.ts +1 -0
  462. package/src/plugins/builtin/time-sales/pane.tsx +31 -19
  463. package/src/plugins/builtin/treasury-daily/client.ts +41 -5
  464. package/src/plugins/builtin/treasury-daily/headless.ts +2 -2
  465. package/src/plugins/builtin/treasury-daily/index.tsx +1 -1
  466. package/src/plugins/builtin/treasury-daily/model.ts +50 -3
  467. package/src/plugins/builtin/treasury-daily/pane.tsx +81 -2
  468. package/src/plugins/builtin/vol-surface/charts.tsx +9 -4
  469. package/src/plugins/builtin/vol-surface/client.ts +9 -17
  470. package/src/plugins/builtin/vol-surface/headless.ts +63 -14
  471. package/src/plugins/builtin/vol-surface/index.tsx +2 -2
  472. package/src/plugins/builtin/vol-surface/model.ts +22 -7
  473. package/src/plugins/builtin/vol-surface/pane.tsx +48 -9
  474. package/src/plugins/builtin/vol-surface/tables.ts +31 -3
  475. package/src/plugins/builtin/volatility/dvol.ts +46 -0
  476. package/src/plugins/builtin/volatility/index.tsx +2 -2
  477. package/src/plugins/builtin/volatility/pane.tsx +4 -4
  478. package/src/plugins/builtin/volatility/series.ts +26 -0
  479. package/src/plugins/builtin/world-indices/footer.ts +1 -1
  480. package/src/plugins/builtin/world-venue-map/headless.ts +3 -3
  481. package/src/plugins/catalog-browser.ts +13 -8
  482. package/src/plugins/catalog-manifest.ts +2 -1
  483. package/src/plugins/marketplace/model.ts +18 -5
  484. package/src/portfolio/column-values.ts +5 -5
  485. package/src/portfolio/futures-positions.ts +6 -3
  486. package/src/portfolio/position-quantity.ts +15 -9
  487. package/src/public/__snapshots__/public-api.test.ts.snap +1 -0
  488. package/src/remote/resources.ts +2 -1
  489. package/src/renderers/browser/app-services.ts +1 -7
  490. package/src/renderers/browser/config-host.ts +2 -55
  491. package/src/renderers/browser/main.tsx +7 -57
  492. package/src/renderers/dom/data-table/row.tsx +26 -0
  493. package/src/renderers/dom/desktop/list-view.tsx +13 -10
  494. package/src/renderers/dom/desktop/query-bar.tsx +4 -2
  495. package/src/renderers/dom/desktop/select-field.tsx +4 -2
  496. package/src/renderers/dom/host/chart-surface.tsx +21 -0
  497. package/src/renderers/electrobun/bun/desktop/app-name.ts +222 -0
  498. package/src/renderers/electrobun/bun/desktop/backend.ts +29 -7
  499. package/src/renderers/electrobun/bun/desktop/host-requests.ts +7 -0
  500. package/src/renderers/electrobun/bun/desktop/initialization.ts +2 -0
  501. package/src/renderers/electrobun/bun/desktop/relaunch.ts +74 -25
  502. package/src/renderers/electrobun/bun/desktop/state-broadcaster.ts +1 -0
  503. package/src/renderers/electrobun/bun/desktop/update.ts +173 -5
  504. package/src/renderers/electrobun/bun/desktop/view-ids.ts +52 -0
  505. package/src/renderers/electrobun/bun/desktop/workspace/index.ts +2 -0
  506. package/src/renderers/electrobun/bun/index.ts +25 -1
  507. package/src/renderers/electrobun/shared/app-name.ts +30 -0
  508. package/src/renderers/electrobun/shared/protocol.ts +10 -0
  509. package/src/renderers/electrobun/view/backend-rpc.ts +6 -0
  510. package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +3 -3
  511. package/src/renderers/electrobun/view/desktop/window/snapshot.ts +1 -0
  512. package/src/renderers/electrobun/view/main.tsx +24 -1
  513. package/src/renderers/electrobun/view/news-source.ts +3 -1
  514. package/src/renderers/electrobun/view/remote/ticker-repository.ts +14 -7
  515. package/src/renderers/electrobun/view/view-ids.ts +85 -0
  516. package/src/renderers/opentui/start.tsx +5 -0
  517. package/src/renderers/opentui/toast-host.tsx +71 -43
  518. package/src/series/registry.ts +1 -0
  519. package/src/series/types.ts +6 -0
  520. package/src/series/validate.ts +1 -0
  521. package/src/sources/gloomberb-cloud/index.ts +1 -0
  522. package/src/sources/gloomberb-cloud/news.ts +47 -7
  523. package/src/sources/gloomberb-cloud/normalizers.ts +2 -0
  524. package/src/sources/provider-router/batches.ts +10 -2
  525. package/src/sources/provider-router/financial-routes.ts +3 -3
  526. package/src/sources/provider-router/financials.ts +15 -3
  527. package/src/sources/provider-router/history.ts +28 -7
  528. package/src/sources/provider-router/index.ts +149 -10
  529. package/src/sources/provider-router/search.ts +13 -2
  530. package/src/state/app/context/index.tsx +3 -0
  531. package/src/state/ticker-cleanup.ts +50 -0
  532. package/src/sync/auth-transition.ts +19 -9
  533. package/src/sync/baseline.ts +10 -4
  534. package/src/sync/controller.ts +70 -19
  535. package/src/sync/core-contributors.ts +90 -31
  536. package/src/sync/react.ts +4 -1
  537. package/src/sync/types.ts +3 -0
  538. package/src/telemetry/stall-reports-dom.ts +38 -0
  539. package/src/telemetry/stall-reports-node.ts +75 -0
  540. package/src/telemetry/stall-reports.ts +214 -0
  541. package/src/telemetry/usage-counts.ts +0 -18
  542. package/src/test-support/preload.ts +14 -0
  543. package/src/theme/colors.ts +8 -0
  544. package/src/theme/themes.ts +10 -0
  545. package/src/tickers/company-name.ts +103 -3
  546. package/src/tickers/listing-venues.ts +38 -3
  547. package/src/tickers/search/bare-symbol.ts +36 -0
  548. package/src/tickers/search/index.ts +36 -7
  549. package/src/tickers/search/ranking.ts +10 -1
  550. package/src/tickers/search/types.ts +5 -0
  551. package/src/tickers/terminal-codes.ts +19 -0
  552. package/src/time-series/alignment.ts +1 -1
  553. package/src/time-series/base-series.ts +13 -5
  554. package/src/time-series/daily-valuation.ts +62 -0
  555. package/src/time-series/economic.ts +18 -4
  556. package/src/time-series/field-catalog.ts +2 -4
  557. package/src/time-series/filed-trailing-eps.ts +197 -0
  558. package/src/time-series/forward-valuation.ts +32 -0
  559. package/src/time-series/fundamentals.ts +198 -7
  560. package/src/time-series/hooks.ts +1 -0
  561. package/src/time-series/ice-credit.ts +3 -0
  562. package/src/time-series/price-comparison.ts +30 -2
  563. package/src/time-series/price-units.ts +72 -2
  564. package/src/time-series/resolve-context.ts +7 -1
  565. package/src/time-series/resolve.ts +116 -15
  566. package/src/time-series/series-presentation.ts +40 -6
  567. package/src/time-series/session-bar.ts +11 -0
  568. package/src/time-series/spec.ts +5 -3
  569. package/src/time-series/studies.ts +278 -74
  570. package/src/time-series/total-return.ts +160 -0
  571. package/src/time-series/transforms.ts +3 -3
  572. package/src/time-series/types.ts +27 -1
  573. package/src/time-series/valuation-releases.ts +39 -0
  574. package/src/types/data-provider.ts +9 -1
  575. package/src/types/desktop-window.ts +2 -0
  576. package/src/types/financials.ts +73 -2
  577. package/src/types/headless.ts +61 -5
  578. package/src/types/instrument.ts +3 -0
  579. package/src/types/news-source.ts +1 -0
  580. package/src/types/plugin.ts +10 -1
  581. package/src/ui/host.tsx +3 -0
  582. package/src/updater/command-names.ts +12 -7
  583. package/src/updater/failure.ts +4 -1
  584. package/src/utils/cli-output.ts +42 -1
  585. package/src/utils/crypto-pair.ts +44 -0
  586. package/src/utils/financial-statements.ts +6 -1
  587. package/src/utils/forward-dividend.ts +2 -0
  588. package/src/utils/fundamentals.ts +24 -3
  589. package/src/utils/fx-market-hours.ts +26 -3
  590. package/src/utils/main-thread-stall.ts +35 -2
  591. package/src/utils/market-capitalization.ts +24 -1
  592. package/src/utils/network-failure.ts +9 -6
  593. package/src/utils/option-expiry.ts +48 -1
  594. package/src/utils/options.ts +10 -0
  595. package/src/utils/plugin-proxy-hosts.json +1 -0
  596. package/src/utils/price-history.ts +12 -1
  597. package/src/utils/shell-word.ts +8 -0
  598. package/src/utils/trailing-dividend.ts +53 -4
  599. package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +0 -17
  600. package/src/renderers/browser/first-screen.ts +0 -193
@@ -0,0 +1,160 @@
1
+ import type { CorporateActionsData } from "../types/financials";
2
+ import { cashInMajorUnits } from "../utils/dividend-cash";
3
+ import { resolveCurrencyUnit } from "../utils/currency-units";
4
+ import { logFailure } from "../utils/log-failure";
5
+ import { dividendReferencePrice } from "../utils/trailing-dividend";
6
+ import { observationDate } from "./price-comparison";
7
+ import { CHART_RESOLUTION_STEP_MS, chartBarSizeStepMs } from "./resolution";
8
+ import type { ResolvedSeries, TimeSeriesPoint } from "./types";
9
+
10
+ /** One cash distribution per share: its ex-date (`YYYY-MM-DD`) and its amount in the listing's major currency unit. */
11
+ export interface CashDistribution {
12
+ exDate: string;
13
+ amount: number;
14
+ }
15
+
16
+ export interface TotalReturnOptions {
17
+ /** The session day a bar belongs to, `YYYY-MM-DD`. */
18
+ dayOf: (point: TimeSeriesPoint) => string;
19
+ /**
20
+ * A bar's price in the distributions' currency unit, or null when the two
21
+ * currencies differ (nothing is converted).
22
+ */
23
+ cashPrice: (price: number) => number | null;
24
+ /**
25
+ * Bars longer than a session (weekly, monthly) are dated at their start, so a
26
+ * distribution belongs to the bar that holds its ex-date, not the first one
27
+ * dated on or after it. This is how many days a bar holds; the last bar holds
28
+ * that many from its own date, and a distribution after that precedes no bar.
29
+ */
30
+ barDays?: number;
31
+ /** Today, `YYYY-MM-DD`: a distribution dated after it has not gone ex. */
32
+ asOf?: string;
33
+ }
34
+
35
+ export interface TotalReturnResult {
36
+ points: TimeSeriesPoint[];
37
+ /** Distributions reinvested inside the series; one before its first bar or after its last is not. */
38
+ applied: number;
39
+ }
40
+
41
+ /** The day a bar of `barDays` days dated `day` ends on; 30-day multiples are calendar months. */
42
+ function barEnd(day: string, barDays: number): string {
43
+ const end = new Date(`${day}T00:00:00Z`);
44
+ if (barDays >= 28 && barDays % 30 === 0) end.setUTCMonth(end.getUTCMonth() + barDays / 30);
45
+ else end.setUTCDate(end.getUTCDate() + barDays);
46
+ return end.toISOString().slice(0, 10);
47
+ }
48
+
49
+ function scaled(value: number | null | undefined, factor: number): number | null | undefined {
50
+ return typeof value === "number" && Number.isFinite(value) ? value * factor : value;
51
+ }
52
+
53
+ /**
54
+ * A price series as its total return: every cash distribution is reinvested at
55
+ * the close of its ex-date bar, so the series moves by (close + cash) over the
56
+ * bar before. Each price is multiplied by the shares the cash has bought
57
+ * since the series began, which leaves its first bar as it was; volume is
58
+ * left alone. A distribution dated at or before the first bar precedes the
59
+ * series, so nothing is reinvested for it.
60
+ */
61
+ export function reinvestDistributions(
62
+ points: readonly TimeSeriesPoint[],
63
+ distributions: readonly CashDistribution[],
64
+ { dayOf, cashPrice, barDays, asOf }: TotalReturnOptions,
65
+ ): TotalReturnResult {
66
+ const ordered = [...points].sort((left, right) => left.date.getTime() - right.date.getTime());
67
+ const holdingBar = barDays !== undefined && barDays > 1;
68
+ const cash = distributions
69
+ .filter((entry) => /^\d{4}-\d{2}-\d{2}$/.test(entry.exDate) && Number.isFinite(entry.amount) && entry.amount > 0
70
+ && (asOf === undefined || entry.exDate <= asOf))
71
+ .sort((left, right) => left.exDate.localeCompare(right.exDate));
72
+ const days = ordered.map(dayOf);
73
+ let factor = 1;
74
+ let applied = 0;
75
+ let next = 0;
76
+ const adjusted = ordered.map((point, index) => {
77
+ const barDay = days[index]!;
78
+ const before = holdingBar ? days[index + 1] ?? barEnd(barDay, barDays!) : null;
79
+ while (next < cash.length) {
80
+ const entry = cash[next]!;
81
+ if (before !== null ? entry.exDate >= before : entry.exDate > barDay) break;
82
+ if (index === 0) { next += 1; continue; }
83
+ const close = point.close ?? point.value;
84
+ // A bar with no price leaves the cash for the next bar that has one.
85
+ if (typeof close !== "number" || !Number.isFinite(close) || close <= 0) break;
86
+ // Cash in another currency than the price buys nothing: the series stays a price series.
87
+ const price = cashPrice(close);
88
+ if (price !== null && price > 0) {
89
+ factor *= 1 + entry.amount / price;
90
+ applied += 1;
91
+ }
92
+ next += 1;
93
+ }
94
+ if (factor === 1) return point;
95
+ return {
96
+ ...point,
97
+ value: scaled(point.value, factor) ?? null,
98
+ ...point.rawValue !== undefined ? { rawValue: scaled(point.rawValue, factor) ?? null } : {},
99
+ ...point.open !== undefined ? { open: scaled(point.open, factor) } : {},
100
+ ...point.high !== undefined ? { high: scaled(point.high, factor) } : {},
101
+ ...point.low !== undefined ? { low: scaled(point.low, factor) } : {},
102
+ ...point.close !== undefined ? { close: scaled(point.close, factor) } : {},
103
+ };
104
+ });
105
+ return { points: adjusted, applied };
106
+ }
107
+
108
+ export interface TotalReturnOutcome {
109
+ series: ResolvedSeries;
110
+ /** Why the series stays a price series, when it does. */
111
+ notice?: string;
112
+ }
113
+
114
+ const DAY_MS = 86_400_000;
115
+
116
+ /** How many days a bar holds when it is longer than a session (a month counts as 30), so a distribution belongs to the bar holding its ex-date. */
117
+ function barDaysLongerThanSession(series: Pick<ResolvedSeries, "barSize" | "historyResolution">): number | undefined {
118
+ const step = series.barSize ? chartBarSizeStepMs(series.barSize)
119
+ : series.historyResolution ? CHART_RESOLUTION_STEP_MS[series.historyResolution] : null;
120
+ return step !== null && step > DAY_MS ? Math.round(step / DAY_MS) : undefined;
121
+ }
122
+
123
+ /**
124
+ * A price series as its total return, from the cash history its listing pays.
125
+ * The series says which basis it ended up on: `total` once its distributions
126
+ * are reinvested (a listing that pays none is its price), `price` with the
127
+ * reason when the history cannot be read, covers no distributions, or is in
128
+ * another currency than the prices. Nothing is converted.
129
+ */
130
+ export async function totalReturnSeries(
131
+ series: ResolvedSeries,
132
+ loadActions: () => Promise<CorporateActionsData | null>,
133
+ priceCurrency: string | undefined,
134
+ asOf: Date,
135
+ ): Promise<TotalReturnOutcome> {
136
+ const priceOnly = (notice: string): TotalReturnOutcome => ({ series: { ...series, returnBasis: "price" }, notice });
137
+ const actions = await loadActions().catch(logFailure("total-return", "Loading distribution history failed", null));
138
+ if (!actions) return priceOnly("distribution history unavailable; showing the price return.");
139
+ const cash = cashInMajorUnits(actions);
140
+ const dividends = Array.isArray(cash.dividends) ? cash.dividends : [];
141
+ if (cash.coverage?.dividends === "unavailable" || (cash.coverage?.dividends !== "available" && dividends.length === 0)) {
142
+ return priceOnly("distribution history unavailable; showing the price return.");
143
+ }
144
+ const currency = resolveCurrencyUnit(cash.currency).currency;
145
+ if (dividends.length > 0 && !currency) return priceOnly("distribution currency unknown; showing the price return.");
146
+ if (dividends.length > 0 && !resolveCurrencyUnit(priceCurrency).currency) {
147
+ return priceOnly("price currency unknown; showing the price return.");
148
+ }
149
+ if (dividends.length > 0 && dividendReferencePrice(1, priceCurrency, currency) === null) {
150
+ return priceOnly(`distributions are in ${currency}, not the price currency; showing the price return.`);
151
+ }
152
+ const { points } = reinvestDistributions(series.points, dividends, {
153
+ dayOf: (point) => observationDate(point.date.getTime(), series),
154
+ cashPrice: (price) => dividendReferencePrice(price, priceCurrency, currency),
155
+ barDays: barDaysLongerThanSession(series),
156
+ asOf: asOf.toISOString().slice(0, 10),
157
+ });
158
+ // "ECC Close" is its price: a label the chart wrote from the field says what the series is now.
159
+ return { series: { ...series, points, returnBasis: "total", label: series.label.replace(/ (?:Close|Price|Open|High|Low)$/, " Total return") } };
160
+ }
@@ -1,6 +1,7 @@
1
1
  import type { ResolvedSeries, SeriesTransform, TimeSeriesPoint } from "./types";
2
2
  import { calendarMonthsBefore } from "../utils/calendar-date";
3
3
  import { isFiniteNumber } from "../utils/guards";
4
+ import { isOhlcSeriesStyle } from "./spec";
4
5
 
5
6
  const DAY_MS = 24 * 60 * 60 * 1_000;
6
7
  // Volume is separate supporting data, not another price. A volume series has
@@ -160,14 +161,13 @@ export function applyResolvedSeriesTransform(
160
161
  ...series,
161
162
  // A rebased or log value no longer counts what the price did.
162
163
  ...(series.statedUnit ? { statedUnit: undefined } : {}),
164
+ ...(series.valueDecimals !== undefined ? { valueDecimals: undefined } : {}),
163
165
  transform,
164
166
  rawUnit: series.rawUnit ?? series.unit,
165
167
  unit: percent ? "%" : transform === "index100" ? "index" : "log",
166
168
  unitGroup: percent ? "percent" : transform === "index100" ? "index" : "log",
167
169
  dataShape: "scalar",
168
- style: series.style === "candles" || series.style === "ohlc" || series.style === "hlc"
169
- ? "line"
170
- : series.style,
170
+ style: isOhlcSeriesStyle(series.style) ? "line" : series.style,
171
171
  points: applySeriesTransform(series.points, transform, options),
172
172
  };
173
173
  }
@@ -10,7 +10,7 @@ export type SeriesPeriod = "auto" | "daily" | "weekly" | "monthly" | "quarterly"
10
10
  * "band" draws a line through each point's value inside a shaded range from
11
11
  * its `low` to its `high`: an average within its historical range.
12
12
  */
13
- export type SeriesStyle = "line" | "area" | "step" | "columns" | "points" | "candles" | "ohlc" | "hlc" | "band";
13
+ export type SeriesStyle = "line" | "area" | "step" | "columns" | "points" | "candles" | "hollow" | "heikin-ashi" | "ohlc" | "hlc" | "band";
14
14
  export type SeriesTransform = "raw" | "percent" | "index100" | "yoy" | "qoq" | "log";
15
15
  export type SeriesAxis = "auto" | "left" | "right";
16
16
  export type SeriesInterpolation = "none" | "step-after";
@@ -110,6 +110,11 @@ export interface ChartViewportSpec {
110
110
  maxPoints?: number;
111
111
  /** Intraday market history includes pre-market and after-hours bars where the venue has them. */
112
112
  extendedHours?: boolean;
113
+ /**
114
+ * Security price series are drawn as total returns: each cash distribution
115
+ * is reinvested at the close of its ex-date bar. Price returns otherwise.
116
+ */
117
+ totalReturn?: boolean;
113
118
  }
114
119
 
115
120
  export interface ChartSpec {
@@ -141,6 +146,8 @@ export interface TimeSeriesPoint {
141
146
  low?: number | null;
142
147
  close?: number | null;
143
148
  volume?: number | null;
149
+ /** The bar this figure traded in closed below its open: volume draws it in the falling colour. */
150
+ fell?: boolean;
144
151
  periodLabel?: string;
145
152
  /**
146
153
  * A financial statement period as the FA columns name it: `FY2025`, `Q3 FY26`,
@@ -183,6 +190,12 @@ export interface ResolvedSeries {
183
190
  unit: string;
184
191
  /** Unit of rawValue, retained when presentation transforms change unit. */
185
192
  rawUnit?: string;
193
+ /**
194
+ * What a price series' returns are, set when the chart asked for total
195
+ * returns: `total` once its distributions are reinvested, `price` when the
196
+ * source gave none to reinvest (`warning` says why).
197
+ */
198
+ returnBasis?: "total" | "price";
186
199
  unitGroup: string;
187
200
  /**
188
201
  * The unit the legend states beside each value, read bare as FUT prints its
@@ -192,6 +205,11 @@ export interface ResolvedSeries {
192
205
  statedUnit?: string;
193
206
  /** Source instrument category used only for monetary market-price precision. */
194
207
  priceAssetCategory?: string;
208
+ /**
209
+ * The decimals a value worked out from prices (a formula, a spread, a price
210
+ * over an FX rate) prints at: the most its legs print, from two to four.
211
+ */
212
+ valueDecimals?: number;
195
213
  /** Volume basis established by the source instrument; omitted when unspecified. */
196
214
  volumeUnit?: "shares" | "contracts";
197
215
  nativeFrequency: SeriesPeriod;
@@ -306,6 +324,14 @@ export interface ChartResolutionResult {
306
324
  loading: boolean;
307
325
  errors: string[];
308
326
  warnings: string[];
327
+ /**
328
+ * Where a series' source starts after the range asked for, and why (a
329
+ * publisher's cap on history), as `warnings` also carries it, so a report
330
+ * says it where it would otherwise print a range that quietly starts later.
331
+ */
332
+ coverageNotices?: string[];
333
+ /** What the price levels of a total-return chart without a comparison are (`warnings` also carries it). */
334
+ returnBasisNotice?: string;
309
335
  /**
310
336
  * Each charted listing that no longer trades: its symbol and label
311
337
  * ("Delisted Oct 27, 2022"), which `warnings` carries as "TWTR: Delisted Oct 27, 2022".
@@ -0,0 +1,39 @@
1
+ import type { EarningsAction, FinancialStatement } from "../types/financials";
2
+ import { regularSessionCloseOn } from "../market-data/market/freshness";
3
+ import { financialAvailabilityTime } from "../utils/financial-statements";
4
+
5
+ /** A reported event for this fiscal quarter, never a projected calendar date. */
6
+ function releaseFor(statement: FinancialStatement, releases: readonly EarningsAction[]) {
7
+ return releases.filter((release) => release.dateType !== "fiscal-period-end"
8
+ && release.dateStatus === "reported"
9
+ && release.fiscalPeriod === statement.date.slice(0, 7)
10
+ && Date.parse(release.date) >= Date.parse(statement.date))
11
+ .sort((a, b) => a.date.localeCompare(b.date))[0];
12
+ }
13
+
14
+ /** Preserve dated inputs; an earnings release can precede the filing of the same period. */
15
+ export function statementAtRelease(statement: FinancialStatement, releases: readonly EarningsAction[], exchange?: string): FinancialStatement {
16
+ const release = releaseFor(statement, releases);
17
+ if (!release) return statement;
18
+ const timestamp = release.reportedAt && Number.isFinite(Date.parse(release.reportedAt)) ? release.reportedAt : undefined;
19
+ const beforeClose = /^(bmo|dmh|pre[ -]?market|before (?:open|market)|during (?:market|hours))$/i.test(release.time ?? "");
20
+ const close = beforeClose ? regularSessionCloseOn(exchange, release.date) : null;
21
+ // A known session establishes availability by its close. Unknown timing,
22
+ // like an after-close release, takes effect on the following daily bar.
23
+ const publication = timestamp ?? (close != null ? new Date(close).toISOString() : release.date);
24
+ const earlier = (filed: string | undefined) => {
25
+ if (!filed) return undefined;
26
+ // A later comparative/restatement is not evidence that this value was in
27
+ // the original release. Restrict the substitution to this period's filing.
28
+ const lag = Date.parse(filed) - Date.parse(statement.date);
29
+ return lag >= 0 && lag <= 120 * 86_400_000 && financialAvailabilityTime(publication) <= financialAvailabilityTime(filed)
30
+ ? publication : filed;
31
+ };
32
+ return { ...statement,
33
+ availableAt: earlier(statement.availableAt),
34
+ ...(statement.fieldSources ? { fieldSources: Object.fromEntries(Object.entries(statement.fieldSources)
35
+ .map(([field, source]) => [field, source && { ...source, filed: earlier(source.filed) }])) } : {}),
36
+ ...(statement.fieldAvailability ? { fieldAvailability: Object.fromEntries(Object.entries(statement.fieldAvailability)
37
+ .map(([field, filed]) => [field, earlier(filed)!])) } : {}),
38
+ };
39
+ }
@@ -148,6 +148,12 @@ export interface MarketDataRequestContext {
148
148
  historySession?: "extended";
149
149
  /** The listing's company, from its own quote: an SEC lookup for a non-US listing checks the registrant against it. */
150
150
  listingName?: string;
151
+ /**
152
+ * The caller prints what the quote's move is from: a short-lived process
153
+ * (the CLI) waits briefly for the daily closes that date a previous close
154
+ * no venue calendar dates. The long-lived app dates every quote anyway.
155
+ */
156
+ datesChangeBasis?: boolean;
151
157
  }
152
158
 
153
159
  export interface CachedFinancialsTarget {
@@ -216,6 +222,8 @@ export interface QuoteBatchOptions {
216
222
  revalidate?: boolean;
217
223
  /** The caller stopped waiting; a transport that can abandon the request does. */
218
224
  signal?: AbortSignal;
225
+ /** The caller prints what each move is from (MarketDataRequestContext.datesChangeBasis). */
226
+ datesChangeBasis?: boolean;
219
227
  }
220
228
 
221
229
  export interface TickerFinancialsBatchResult {
@@ -244,7 +252,7 @@ export interface AssetDataProvider {
244
252
  primaryMarketSourceName?(): string | null | Promise<string | null>;
245
253
  getCachedFinancialsForTargets?(targets: CachedFinancialsTarget[], options?: { allowExpired?: boolean; includeStaleQuotes?: boolean }): Map<string, TickerFinancials> | Promise<Map<string, TickerFinancials>>;
246
254
  getQuotesBatch?(targets: QuoteSubscriptionTarget[], options?: QuoteBatchOptions): Promise<QuoteBatchResult[]>;
247
- getTickerFinancialsBatch?(targets: CachedFinancialsTarget[], options?: { forceRefresh?: boolean }): Promise<TickerFinancialsBatchResult[]>;
255
+ getTickerFinancialsBatch?(targets: CachedFinancialsTarget[], options?: { forceRefresh?: boolean; datesChangeBasis?: boolean }): Promise<TickerFinancialsBatchResult[]>;
248
256
  getTickerFinancials(ticker: string, exchange?: string, context?: MarketDataRequestContext): Promise<TickerFinancials>;
249
257
  getQuote(ticker: string, exchange?: string, context?: MarketDataRequestContext): Promise<Quote>;
250
258
  /** Listing facts may outlive the quote price; this method never returns price/session values. */
@@ -8,6 +8,8 @@ export interface DesktopSharedStateSnapshot {
8
8
  /** @deprecated Ignored and no longer sent. */
9
9
  activePanel?: "left" | "right";
10
10
  statusBarVisible: boolean;
11
+ /** Transient position-sync failures, shared with detached Brokers panes. */
12
+ brokerSyncErrors?: Record<string, string>;
11
13
  mainStateRevision?: number;
12
14
  layoutChanged?: boolean;
13
15
  }
@@ -120,6 +120,12 @@ export interface Quote extends DepositaryReceiptFacts {
120
120
  */
121
121
  changeBasis?: "24h" | "none";
122
122
  previousClose?: number;
123
+ /**
124
+ * Exchange-local date of previousClose. The app's quote router reads it
125
+ * from the listing's own daily closes where the venue's calendar cannot
126
+ * date the close (PreviousCloseDates); a source may set it too.
127
+ */
128
+ previousCloseDate?: string;
123
129
  /** Official close of a completed regular session, in this quote's currency. */
124
130
  regularClose?: number;
125
131
  /** Exchange-local date of regularClose; separate from the daily previous-close reference. */
@@ -324,7 +330,12 @@ export interface Fundamentals extends DepositaryReceiptFacts {
324
330
  /** Set where Gloom Cloud checked `enterpriseValue` against market cap + total debt - cash; pairs with that value only. */
325
331
  enterpriseValueCheck?: EnterpriseValueCheck;
326
332
  /** Explicit provider retractions; omitted fields alone remain eligible for fallback. */
327
- unavailableFields?: Array<"enterpriseValue" | "enterpriseToRevenue">;
333
+ unavailableFields?: Array<"enterpriseValue" | "enterpriseToRevenue" | "marketCap">;
334
+ /**
335
+ * Why `marketCap` is retracted, with "marketCap" in `unavailableFields`: a depositary receipt its source priced as
336
+ * an ordinary share (the receipt's price times the company's ordinary shares), with no ratio to convert them.
337
+ */
338
+ marketCapUnavailable?: "receipt-priced-as-ordinary";
328
339
  operatingCashFlow?: number;
329
340
  freeCashFlow?: number;
330
341
  dividendYield?: number;
@@ -339,6 +350,18 @@ export interface Fundamentals extends DepositaryReceiptFacts {
339
350
  revenue?: number;
340
351
  netIncome?: number;
341
352
  eps?: number;
353
+ /**
354
+ * Where `eps` and `trailingPE` come from: `filed-quarters` when `eps` is the
355
+ * diluted EPS of the last four filed quarters (or the fiscal year they end
356
+ * with), as PEB and GE read the statements, its last period ending
357
+ * `trailingEpsPeriodEnd`, and `trailingPE` the price over it; `served` when
358
+ * those quarters give none (or one that cannot be priced: see
359
+ * time-series/filed-trailing-eps) and both are Gloom Cloud's trailing
360
+ * figures, including a P/E it serves with no EPS (a fund's). Absent when
361
+ * there is neither an EPS nor a P/E.
362
+ */
363
+ trailingEpsSource?: "filed-quarters" | "served";
364
+ trailingEpsPeriodEnd?: string;
342
365
  operatingMargin?: number;
343
366
  profitMargin?: number;
344
367
  revenueGrowth?: number;
@@ -516,6 +539,8 @@ export type EarningsDateStatus = "reported" | "confirmed" | "projected";
516
539
 
517
540
  export interface EarningsAction {
518
541
  date: string;
542
+ /** Known release/acceptance timestamp, when the calendar has one. */
543
+ reportedAt?: string;
519
544
  dateType?: "announcement" | "fiscal-period-end";
520
545
  currency?: string;
521
546
  time?: string;
@@ -548,10 +573,24 @@ export interface CorporateActionsData {
548
573
  dividends: DividendAction[];
549
574
  /** Declared and unpaid, for the listings Gloom Cloud has them for; absent elsewhere and from older servers. */
550
575
  declaredDividends?: DeclaredDividendAction[];
576
+ /**
577
+ * What each paid row was declared as when the company declares in another
578
+ * currency than the listing pays (BP's dollars beside its London pence), per
579
+ * ordinary share, keyed by the paid row's ex-date. Absent elsewhere and from older servers.
580
+ */
581
+ declaredCash?: DeclaredCash;
582
+ /** Set when `dividends` is the last good history standing in for a refresh that could not read it: when that history was read. */
583
+ dividendsAsOf?: string;
551
584
  splits: SplitAction[];
552
585
  earnings: EarningsAction[];
553
586
  }
554
587
 
588
+ /** Paid rows as their company declared them, in `currency` (its major unit). */
589
+ export interface DeclaredCash {
590
+ currency: string;
591
+ rows: DividendAction[];
592
+ }
593
+
555
594
  export interface CompanyProfile {
556
595
  description?: string;
557
596
  /**
@@ -971,6 +1010,8 @@ export interface EpsEstimateHistory {
971
1010
  }
972
1011
 
973
1012
  export interface TickerFinancials {
1013
+ /** Reported earnings-release events retained with daily valuation snapshots. */
1014
+ earningsReleases?: EarningsAction[];
974
1015
  statementHistory?: StatementHistoryAttempt;
975
1016
  /** @deprecated No longer populated. */
976
1017
  operatingHistoryRetryAt?: number;
@@ -1014,6 +1055,29 @@ export interface OptionContract {
1014
1055
  lastTradeDate: number;
1015
1056
  /** Millisecond timestamp for the latest streamed quote applied to this snapshot. */
1016
1057
  lastUpdated?: number;
1058
+ /**
1059
+ * A venue's own mark, for a venue that marks every contract (Deribit): the
1060
+ * premium in `currency`, its implied volatility (a decimal) and Black-76
1061
+ * greeks at the expiry's forward (delta per 1.00, gamma per 1.00, vega per
1062
+ * volatility point, theta per calendar day). These replace the solved ones.
1063
+ */
1064
+ mark?: OptionMark;
1065
+ /**
1066
+ * The premiums in the coin a venue quotes them in (Deribit's BTC and ETH
1067
+ * options); null where there is none. The contract's own prices are these
1068
+ * at the expiry's forward.
1069
+ */
1070
+ coin?: { currency: string; bid: number | null; ask: number | null; mark: number; last: number | null };
1071
+ }
1072
+
1073
+ export interface OptionMark {
1074
+ price: number;
1075
+ iv: number;
1076
+ delta: number;
1077
+ gamma: number;
1078
+ vega: number;
1079
+ theta: number;
1080
+ forward: number;
1017
1081
  }
1018
1082
 
1019
1083
  export interface OptionsChain {
@@ -1023,11 +1087,18 @@ export interface OptionsChain {
1023
1087
  puts: OptionContract[];
1024
1088
  providerId?: string;
1025
1089
  dataSource?: "live" | "delayed";
1026
- feed?: "opra" | "gloom";
1090
+ feed?: "opra" | "gloom" | "deribit";
1027
1091
  delayMinutes?: number;
1028
1092
  realtimeEligible?: boolean;
1029
1093
  /** ISO timestamp for the upstream options snapshot. */
1030
1094
  asOf?: string;
1095
+ /**
1096
+ * The rate the venue prices its premiums at (Deribit marks at zero); the
1097
+ * model rate when absent, as for US listed options.
1098
+ */
1099
+ rate?: number;
1100
+ /** The venue a chain is listed on when it is not a US options exchange (Deribit). */
1101
+ venue?: string;
1031
1102
  /**
1032
1103
  * The session the chain's open interest counts, YYYY-MM-DD, as Gloom Cloud
1033
1104
  * states it; null when none of its counts is dated. Absent from a source
@@ -34,6 +34,12 @@ export interface HeadlessPaneArgumentDef {
34
34
  examples?: readonly string[];
35
35
  }
36
36
 
37
+ /** A list the catalog prints under a function's options, such as the sector names a screen's criteria match. */
38
+ export interface HeadlessPaneReference {
39
+ title: string;
40
+ items: readonly string[];
41
+ }
42
+
37
43
  export interface HeadlessPaneOptionValue {
38
44
  value: string;
39
45
  aliases?: string[];
@@ -83,6 +89,8 @@ export interface HeadlessPaneOptionDef {
83
89
  * absent.
84
90
  */
85
91
  valueWords?: number;
92
+ /** The value is a comma list (`--metric trailingPE,dividendYieldPercent`), and the flag typed again adds to it. */
93
+ list?: boolean;
86
94
  /** The option in use as typed after the function, such as `--expiration 2028-01-21`; the catalog shows it as an example. */
87
95
  example?: string;
88
96
  /** The example runs without the function's optional argument, as an option that works only then does (`fn INS --side sell`). */
@@ -138,8 +146,10 @@ export interface HeadlessPaneContext {
138
146
  * known. A code several companies list (BDI) throws asking which, with
139
147
  * `quote`'s message; `argumentWith(key)` is the function's argument naming
140
148
  * that listing instead (`BDI:TSX`), for the retry each listing offers.
149
+ * `coinNote` is what `quote` says of a bare coin ticker read as a listing
150
+ * that is not the coin (ETH, the Grayscale fund), for the report's warnings.
141
151
  */
142
- resolveListing?: (symbol: string, argumentWith: (key: string) => string) => Promise<{ symbol: string; exchange?: string; name?: string } | null>;
152
+ resolveListing?: (symbol: string, argumentWith: (key: string) => string) => Promise<{ symbol: string; exchange?: string; name?: string; coinNote?: string } | null>;
143
153
  /**
144
154
  * What a plugin keeps on this device only (its `ctx.resume` state, never
145
155
  * synced), such as ALRT's log of the alerts the app fired; null when none.
@@ -216,6 +226,14 @@ export interface HeadlessPaneEntry {
216
226
  * rather than read back the number `formatted` draws.
217
227
  */
218
228
  unit?: string;
229
+ /**
230
+ * In a report with `exportDated`, where this line is not of the section's own period and release (a previous
231
+ * reading, a year ago): the period it covers, when it was released and what it is as of. A null `released`
232
+ * or `asOf` leaves the cell blank rather than borrow the section's.
233
+ */
234
+ period?: string | null;
235
+ released?: string | null;
236
+ asOf?: string | null;
219
237
  }
220
238
 
221
239
  /**
@@ -353,7 +371,8 @@ export interface HeadlessPaneFreshness {
353
371
  * Each source's own newest observation, for data drawn from several venues
354
372
  * polled apart (a perpetuals board). The line then dates every source and
355
373
  * says how old the oldest of them is (`Binance 02:15 · Bybit 02:24 UTC ·
356
- * oldest 9 min`), and `asOf` is the newest of them unless declared.
374
+ * oldest 9 min`), or with `ageOnly` the oldest observation, and `asOf` is the
375
+ * newest of them unless declared.
357
376
  */
358
377
  sources?: Array<{ source: string; asOf: string | number | Date }>;
359
378
  /** Say how old the oldest observation is (`oldest 4 min`): rows polled apart from one source. */
@@ -363,7 +382,8 @@ export interface HeadlessPaneFreshness {
363
382
  * For rows priced apart from a snapshot refreshed on a schedule (CRYP's board), where `live` would call prices
364
383
  * that are minutes old real-time and `delayed` would call a snapshot renewed every few seconds held back. A row
365
384
  * that states its own feed (`dataSource`, `delayMinutes`) still says it, and so does a declared `status`.
366
- * Says how old the oldest observation is, as `oldestAge` does.
385
+ * Says how old the oldest observation is, as `oldestAge` does, even beside `sources`: a venue that streams some
386
+ * rows and not others is as old as its oldest row, not its newest.
367
387
  */
368
388
  ageOnly?: boolean;
369
389
  /**
@@ -527,6 +547,8 @@ export type HeadlessBundleSection =
527
547
  locked?: boolean;
528
548
  entries?: never;
529
549
  textEntries?: never;
550
+ period?: never;
551
+ released?: never;
530
552
  }
531
553
  | {
532
554
  title: string;
@@ -540,8 +562,14 @@ export type HeadlessBundleSection =
540
562
  textEntries?: HeadlessPaneEntry[];
541
563
  /** The symbol the figures are of, where the report's own is not: each exported line names it in `symbol_or_series`. */
542
564
  symbol?: string;
543
- /** When the figures were observed (an ISO date or instant), where it is not the report's newest: each exported line names it in `as_of`. */
544
- asOf?: string;
565
+ /**
566
+ * When the figures were observed (an ISO date or instant), where it is not the report's newest: each exported line names it in `as_of`.
567
+ * Null leaves `as_of` blank, for figures with no date of their own to state.
568
+ */
569
+ asOf?: string | null;
570
+ /** In a report with `exportDated`: the period the figures cover, and when they were released (an ISO date or instant), which each exported line names in `period` and `released`. */
571
+ period?: string;
572
+ released?: string;
545
573
  columns?: never;
546
574
  rows?: never;
547
575
  textColumns?: never;
@@ -584,6 +612,8 @@ export interface HeadlessSeries {
584
612
  interval?: string;
585
613
  /** Decimal places the text report prints the latest value to (a correlation to 3); JSON and CSV keep every digit. */
586
614
  textDecimals?: number;
615
+ /** The text report prints the latest value as the tables print an amount (63.33B), for a company's reported total; JSON and CSV keep every digit. */
616
+ textCompact?: boolean;
587
617
  /** Each point's `value` is its bar's close: `--csv` and `--ndjson` write Close alone, JSON keeps both. */
588
618
  valueIsClose?: boolean;
589
619
  points: HeadlessSeriesPoint[];
@@ -597,6 +627,8 @@ export interface HeadlessSeriesResult extends HeadlessPaneResultBase {
597
627
  export interface HeadlessSnapshotResult extends HeadlessPaneResultBase {
598
628
  asOf: string | number | Date;
599
629
  items: HeadlessPaneRow[];
630
+ /** What the report says when `items` is empty, in place of "No data.": why there are none. */
631
+ empty?: string;
600
632
  }
601
633
 
602
634
  export interface HeadlessPaneResultByShape {
@@ -622,6 +654,8 @@ export interface HeadlessPaneDefinition<Shape extends HeadlessPaneShape = Headle
622
654
  intents?: string[];
623
655
  dataRequirements?: string[];
624
656
  limitations?: string[];
657
+ /** Names an option's values match, listed by the catalog under each title: EQS's sectors and industries. */
658
+ reference?: HeadlessPaneReference[];
625
659
  screenshotReadiness?: "ready" | "partial" | "live-dom" | "unsupported";
626
660
  };
627
661
  /**
@@ -644,6 +678,21 @@ export interface HeadlessPaneDefinition<Shape extends HeadlessPaneShape = Headle
644
678
  * points at GIP's 1-minute bars). `key` is the listing as read, RMS:ASX.
645
679
  */
646
680
  usListingsOnlyHint?(key: string): string;
681
+ /**
682
+ * A typed symbol the function reads as another before it is resolved, with
683
+ * the note that says so: OPX and OVDV read a bare BTC or ETH as the coin
684
+ * (BTC-USD), whose options are the ones asked about, not the US fund that
685
+ * trades as BTC. Null reads the symbol as typed.
686
+ */
687
+ symbolAlias?(typed: string): { symbol: string; note: string } | null;
688
+ /**
689
+ * A listing the function has no data for, answered before any request with
690
+ * what exists instead: OPX and OVDV answer a coin nothing lists options on
691
+ * (SOL-USD) with BTC and ETH options, and OVDV, VCA and HIVG an FX pair with
692
+ * the currency funds' options. `key` is the listing as read; `details` is
693
+ * the line after `message`, left out when the message says it all.
694
+ */
695
+ refuseSymbol?(key: string): { message: string; details?: string } | null;
647
696
  /**
648
697
  * `fn` exits 1 when the report has no name with data: no rows, or every row
649
698
  * is one of `unavailableSymbols`. A list that gives data for some names
@@ -684,6 +733,13 @@ export interface HeadlessPaneDefinition<Shape extends HeadlessPaneShape = Headle
684
733
  * sessions), so a saved file keeps what stderr said.
685
734
  */
686
735
  exportWarnings?: boolean;
736
+ /**
737
+ * The rows are statistics dated by a period and a release, so `--csv` and
738
+ * `--ndjson` end every table with `period`, `released` and `retrieved` after
739
+ * the five fixed columns (a table's own columns of those names stand in for
740
+ * them), and `as_of` is the release, from the section's `rowAsOfKey` or `asOf`.
741
+ */
742
+ exportDated?: boolean;
687
743
  columns?: HeadlessPaneColumn[];
688
744
  /**
689
745
  * The report title. A report passes the loaded result, so a title can name
@@ -79,6 +79,9 @@ export interface InstrumentSearchResult {
79
79
  * carries that name. A leftover listing of the merged company (GOGLC on
80
80
  * BYMA) is linked to it by search, naming the `successor`. */
81
81
  formerIssuer?: { symbol: string; name: string; until: string; successor?: { symbol: string; name: string | null } };
82
+ /** The name a renamed company had (Cassava Sciences Inc, now Filana Therapeutics' FLNA), sent by newer cloud
83
+ * servers on the row a search by that name found. `searchAliases` then carries it as EDGAR files it. */
84
+ formerName?: string;
82
85
  /** A US listing that no longer trades, found by its exact symbol (TWTR). Untrusted until parsed. */
83
86
  delisting?: ListingDelisting;
84
87
  /** The company's home line, its common stock on its home exchange (7203 on JPX for Toyota), sent by newer
@@ -1,4 +1,5 @@
1
1
  export type {
2
+ NewsAccess,
2
3
  NewsArticle,
3
4
  NewsQuery,
4
5
  NewsQueryState,