gloomberb 0.17.6 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (768) hide show
  1. package/README.md +2 -0
  2. package/README.zh-CN.md +2 -0
  3. package/package.json +6 -1
  4. package/patches/electrobun@1.18.1.patch +74 -0
  5. package/src/account/auth-model.ts +3 -2
  6. package/src/account/device-signin-dialog.tsx +38 -13
  7. package/src/account/device-signin.ts +2 -1
  8. package/src/account/upgrade-dialog.tsx +6 -2
  9. package/src/api-client/askg.ts +5 -3
  10. package/src/api-client/bank-figures.ts +73 -0
  11. package/src/api-client/credit-boards.ts +21 -1
  12. package/src/api-client/crypto-markets.ts +88 -1
  13. package/src/api-client/data.ts +104 -4
  14. package/src/api-client/debt-maturities.ts +18 -0
  15. package/src/api-client/equity-screener.ts +3 -0
  16. package/src/api-client/errors.ts +13 -0
  17. package/src/api-client/fund-facts.ts +72 -0
  18. package/src/api-client/futures-curve.ts +26 -3
  19. package/src/api-client/geo.ts +11 -1
  20. package/src/api-client/index.ts +25 -2
  21. package/src/api-client/insider-signals.ts +95 -11
  22. package/src/api-client/normalizers.ts +1 -0
  23. package/src/api-client/paths.ts +20 -1
  24. package/src/api-client/request.ts +11 -3
  25. package/src/api-client/research-activity.ts +15 -8
  26. package/src/api-client/socket.ts +6 -3
  27. package/src/api-client/supply-chain-graph.ts +2 -2
  28. package/src/api-client/supply-chain.ts +8 -0
  29. package/src/api-client/tape.ts +12 -0
  30. package/src/api-client/types.ts +66 -2
  31. package/src/api-client/upgrade-experiment.ts +4 -3
  32. package/src/api-client/wall-experiments.ts +5 -3
  33. package/src/api-client/wall-summary.ts +3 -1
  34. package/src/api-client/web-experiments.ts +5 -2
  35. package/src/api-client/yield-curves.ts +17 -0
  36. package/src/app/command-bar-intro.ts +38 -0
  37. package/src/app/keybindings/actions.ts +1 -1
  38. package/src/app/pane-runtime/pane-template-runtime.ts +35 -7
  39. package/src/app/pane-runtime/plugin-bindings.ts +4 -0
  40. package/src/app/pane-runtime/ticker-open-runtime.ts +4 -14
  41. package/src/app/pane-runtime/ticker-open-target.ts +31 -0
  42. package/src/app/runtime/desktop-deeplink.ts +3 -4
  43. package/src/app/runtime/plugin-bindings.ts +3 -2
  44. package/src/app/runtime/startup.ts +3 -4
  45. package/src/app/runtime/ticker-refresh.ts +13 -12
  46. package/src/app/runtime/update.ts +3 -2
  47. package/src/architecture/core-builtin-allowlist.json +0 -3
  48. package/src/architecture/silent-catch-allowlist.json +3 -0
  49. package/src/architecture/ui-literals-allowlist.json +186 -0
  50. package/src/architecture/ui-tokens-allowlist.json +40 -0
  51. package/src/ask-gloom/pane-context.ts +3 -1
  52. package/src/brokers/signed-in/catalog.ts +2 -1
  53. package/src/brokers/signed-in/client.ts +7 -2
  54. package/src/brokers/signed-in/sign-in-dialog.tsx +120 -26
  55. package/src/brokers/signed-in/sign-in.ts +22 -20
  56. package/src/brokers/sync-broker-instance.ts +2 -1
  57. package/src/capabilities/chart-series.ts +2 -0
  58. package/src/capabilities/registry.ts +1 -3
  59. package/src/cli/bank-section.ts +147 -0
  60. package/src/cli/base-converter.ts +5 -2
  61. package/src/cli/board-coins.ts +70 -0
  62. package/src/cli/commands/fred-series.ts +90 -0
  63. package/src/cli/commands/market.ts +340 -69
  64. package/src/cli/commands/news-search.ts +35 -2
  65. package/src/cli/commands/options-chain.ts +7 -5
  66. package/src/cli/commands/options-leaps.ts +3 -3
  67. package/src/cli/commands/overview.ts +78 -29
  68. package/src/cli/commands/plugins.ts +1 -0
  69. package/src/cli/commands/search.ts +87 -24
  70. package/src/cli/commands/system.ts +5 -2
  71. package/src/cli/commands/ticker.ts +337 -60
  72. package/src/cli/context.ts +2 -1
  73. package/src/cli/desktop-pane-shot.ts +11 -3
  74. package/src/cli/earnings-calendar.ts +2 -1
  75. package/src/cli/errors.ts +10 -0
  76. package/src/cli/export-source.ts +18 -3
  77. package/src/cli/glossary.ts +196 -14
  78. package/src/cli/history-rows.ts +60 -9
  79. package/src/cli/index-roots.ts +26 -0
  80. package/src/cli/index.ts +34 -9
  81. package/src/cli/known-gaps.ts +156 -22
  82. package/src/cli/listing-arg.ts +156 -12
  83. package/src/cli/listing-suggestion.ts +4 -2
  84. package/src/cli/name-entries.ts +76 -0
  85. package/src/cli/not-a-ticker.ts +15 -6
  86. package/src/cli/pane-functions/access-gate.ts +22 -0
  87. package/src/cli/pane-functions/capabilities.ts +62 -4
  88. package/src/cli/pane-functions/catalog.ts +94 -39
  89. package/src/cli/pane-functions/data.ts +6 -5
  90. package/src/cli/pane-functions/discovery.ts +1 -1
  91. package/src/cli/pane-functions/dom.ts +3 -3
  92. package/src/cli/pane-functions/freshness.ts +49 -8
  93. package/src/cli/pane-functions/function-help.ts +13 -10
  94. package/src/cli/pane-functions/headless.ts +177 -42
  95. package/src/cli/pane-functions/index.ts +64 -8
  96. package/src/cli/pane-functions/options.ts +17 -3
  97. package/src/cli/pane-functions/report-notices.ts +17 -3
  98. package/src/cli/pane-functions/resolver.ts +48 -13
  99. package/src/cli/pane-functions/screenshot.ts +124 -23
  100. package/src/cli/pane-functions/shot-options.ts +68 -0
  101. package/src/cli/perpetual-contract.ts +3 -1
  102. package/src/cli/report-tables.ts +10 -2
  103. package/src/cli/staged-tickers.ts +5 -0
  104. package/src/cli/statement-filings.ts +261 -0
  105. package/src/cli/symbol-args.ts +47 -8
  106. package/src/cli/symbol-list.ts +9 -2
  107. package/src/cli/symbol-rows.ts +269 -29
  108. package/src/cli/ticker-resolution.ts +148 -34
  109. package/src/cli/treasury-yields.ts +86 -0
  110. package/src/cli/types.ts +3 -0
  111. package/src/cli/uncovered-instrument.ts +20 -0
  112. package/src/components/chart/composite/axis-overlays.tsx +16 -9
  113. package/src/components/chart/composite/composite-chart.tsx +85 -6
  114. package/src/components/chart/composite/downsample.ts +19 -3
  115. package/src/components/chart/composite/format.ts +3 -0
  116. package/src/components/chart/composite/legend.tsx +155 -76
  117. package/src/components/chart/composite/panel-bitmap.ts +8 -2
  118. package/src/components/chart/composite/panel-surface.tsx +3 -3
  119. package/src/components/chart/composite/toolbar.tsx +12 -7
  120. package/src/components/chart/composite/types.ts +6 -0
  121. package/src/components/chart/composite/use-composite-chart-keyboard.ts +28 -1
  122. package/src/components/chart/curve/curve-surface.tsx +1 -1
  123. package/src/components/chart/static/series.ts +39 -0
  124. package/src/components/chart/static/trail-chart-surface.tsx +2 -1
  125. package/src/components/command-bar/commands/collection-list.ts +45 -15
  126. package/src/components/command-bar/commands/collection.ts +10 -3
  127. package/src/components/command-bar/commands/registry.ts +2 -2
  128. package/src/components/command-bar/list/badge.ts +4 -3
  129. package/src/components/command-bar/list/model.ts +5 -0
  130. package/src/components/command-bar/list/view.tsx +1 -1
  131. package/src/components/command-bar/panel/index.tsx +19 -8
  132. package/src/components/command-bar/panel/native-surface.ts +6 -4
  133. package/src/components/command-bar/panel/prompt-example.ts +22 -0
  134. package/src/components/command-bar/routes/root/provider-search.ts +3 -9
  135. package/src/components/command-bar/routes/root/results.ts +13 -0
  136. package/src/components/command-bar/routes/root/start-here.ts +90 -0
  137. package/src/components/command-bar/routes/ticker-search/results.ts +42 -3
  138. package/src/components/command-bar/routes/ticker-search/route.ts +3 -10
  139. package/src/components/command-bar/theme-picker.tsx +3 -1
  140. package/src/components/command-bar/workflow/builtin.ts +5 -1
  141. package/src/components/command-bar/workflow/collection-actions.ts +21 -12
  142. package/src/components/command-bar/workflow/ops.ts +21 -1
  143. package/src/{plugins/builtin/portfolio-list/command-bar.ts → components/command-bar/workflow/portfolio-position.ts} +42 -9
  144. package/src/components/command-bar/workflow/tickers.ts +6 -4
  145. package/src/components/feedback-dialog.tsx +1 -1
  146. package/src/components/form-modal/broker-step.tsx +7 -63
  147. package/src/components/form-modal/content.tsx +7 -2
  148. package/src/components/form-modal/field-row.tsx +6 -8
  149. package/src/components/form-modal/host.tsx +3 -3
  150. package/src/components/form-modal/model.ts +3 -0
  151. package/src/components/form-modal/routes.ts +17 -2
  152. package/src/components/index.ts +6 -6
  153. package/src/components/input-search-bar.tsx +43 -6
  154. package/src/components/layout/detached-pane-shell.tsx +0 -1
  155. package/src/components/layout/floating-pane.tsx +0 -1
  156. package/src/components/layout/header.tsx +8 -7
  157. package/src/components/layout/pane/footer/index.tsx +7 -4
  158. package/src/components/layout/pane/footer/model.ts +28 -2
  159. package/src/components/layout/pane/header.tsx +9 -19
  160. package/src/components/layout/pane/index.tsx +0 -1
  161. package/src/components/layout/pane/instrument-coverage-gate.tsx +57 -0
  162. package/src/components/layout/pane/pane-tabs.tsx +4 -3
  163. package/src/components/layout/pane/sizing.ts +9 -0
  164. package/src/components/layout/pane/ticker-fate-gate.tsx +8 -2
  165. package/src/components/layout/shell/pane/capture.ts +44 -20
  166. package/src/components/layout/status-bar.tsx +3 -6
  167. package/src/components/markdown-text.tsx +17 -2
  168. package/src/components/market-board/index.tsx +19 -8
  169. package/src/components/metric-treemap/heat-surface.tsx +2 -7
  170. package/src/components/onboarding/account-step/qr-panel.tsx +5 -2
  171. package/src/components/onboarding/onboarding-frame.tsx +24 -21
  172. package/src/components/onboarding/portfolio-step/positions-panel.tsx +20 -10
  173. package/src/components/onboarding/wizard-positions.ts +40 -11
  174. package/src/components/pane-settings-dialog/desktop.tsx +12 -50
  175. package/src/components/pane-settings-dialog/field-dialogs.tsx +1 -1
  176. package/src/components/price-performance.tsx +18 -2
  177. package/src/components/reader/article-reader.tsx +11 -10
  178. package/src/components/reader/detail-reader.tsx +9 -5
  179. package/src/components/reader/reader-text.tsx +51 -24
  180. package/src/components/sign-in-code-panel.tsx +129 -75
  181. package/src/components/ticker/badge/index.tsx +2 -1
  182. package/src/components/ui/action-row.tsx +5 -2
  183. package/src/components/ui/audio-player.tsx +70 -0
  184. package/src/components/ui/card.tsx +75 -0
  185. package/src/components/ui/data-table/index.tsx +4 -2
  186. package/src/components/ui/data-table/types.ts +11 -0
  187. package/src/components/ui/detail-scroll-body.tsx +1 -1
  188. package/src/components/ui/dialog-actions.tsx +1 -21
  189. package/src/components/ui/display.tsx +13 -5
  190. package/src/components/ui/external-link.tsx +4 -2
  191. package/src/components/ui/fields.tsx +12 -0
  192. package/src/components/ui/figure.tsx +5 -3
  193. package/src/components/ui/frame.tsx +40 -6
  194. package/src/components/ui/icon.tsx +4 -0
  195. package/src/components/ui/index.ts +4 -1
  196. package/src/components/ui/list-view.tsx +8 -0
  197. package/src/components/ui/prose.tsx +97 -25
  198. package/src/components/ui/query-bar-keys.tsx +3 -1
  199. package/src/components/ui/query-bar.tsx +6 -0
  200. package/src/components/ui/quote.ts +42 -0
  201. package/src/components/ui/range-track.tsx +15 -2
  202. package/src/components/ui/reveal-in-scroll-box.ts +21 -3
  203. package/src/components/ui/select-button.tsx +38 -3
  204. package/src/components/ui/status.tsx +73 -4
  205. package/src/components/ui/table-layout.ts +20 -0
  206. package/src/components/use-pinned-moment.ts +19 -0
  207. package/src/core/app-runtime.ts +2 -2
  208. package/src/core/state/app/instrument.ts +18 -1
  209. package/src/core/state/app/layout.ts +6 -0
  210. package/src/core/state/app/state.ts +14 -2
  211. package/src/data/cached-query.ts +1 -1
  212. package/src/data/config/chart-settings.ts +3 -1
  213. package/src/data/config/home.ts +4 -1
  214. package/src/data/config/store/node.ts +9 -4
  215. package/src/data/config/store/normalize.ts +9 -0
  216. package/src/data/json-storage.ts +6 -3
  217. package/src/data/json-ticker-repository.ts +3 -1
  218. package/src/data/plugin-cache.ts +5 -1
  219. package/src/data/sqlite/json.ts +3 -1
  220. package/src/data/ticker-repository.ts +5 -2
  221. package/src/feedback/diagnostics.ts +2 -6
  222. package/src/i18n/es.ts +86 -6
  223. package/src/i18n/index.ts +3 -9
  224. package/src/i18n/ja.ts +86 -6
  225. package/src/i18n/ko.ts +86 -6
  226. package/src/i18n/zh-cn.ts +86 -6
  227. package/src/i18n/zh-tw.ts +86 -6
  228. package/src/layout-marketplace/gallery-desktop.tsx +8 -4
  229. package/src/market-data/bars-per-year.ts +43 -0
  230. package/src/market-data/bond-funds.ts +85 -0
  231. package/src/market-data/coordinator/auxiliary.ts +5 -2
  232. package/src/market-data/coordinator/index.ts +6 -5
  233. package/src/market-data/futures-contract.ts +102 -5
  234. package/src/market-data/hooks.tsx +20 -11
  235. package/src/market-data/market/bar-period.ts +36 -0
  236. package/src/market-data/market/format.ts +5 -13
  237. package/src/market-data/market/freshness.ts +1 -3
  238. package/src/market-data/market/index-level.ts +51 -0
  239. package/src/market-data/model-dividend-yield.ts +57 -16
  240. package/src/market-data/quotes/live-valuation.ts +48 -2
  241. package/src/market-data/realized-volatility.ts +16 -7
  242. package/src/market-data/tax-equivalent.ts +344 -0
  243. package/src/news/aggregator.ts +4 -2
  244. package/src/notifications/notification-log.ts +5 -3
  245. package/src/plugins/auto-update-node.ts +1 -0
  246. package/src/plugins/builtin/account-management/footer.ts +1 -1
  247. package/src/plugins/builtin/account-management/keyboard.ts +3 -0
  248. package/src/plugins/builtin/account-management/model.ts +1 -0
  249. package/src/plugins/builtin/account-management/pane.tsx +71 -19
  250. package/src/plugins/builtin/account-management/trial-cancel.ts +40 -0
  251. package/src/plugins/builtin/alerts/cli.ts +7 -18
  252. package/src/plugins/builtin/alerts/constants.ts +8 -0
  253. package/src/plugins/builtin/alerts/event-rows.ts +16 -0
  254. package/src/plugins/builtin/alerts/events-pane.tsx +2 -14
  255. package/src/plugins/builtin/alerts/headless.ts +182 -0
  256. package/src/plugins/builtin/alerts/index.tsx +3 -0
  257. package/src/plugins/builtin/alerts/pane.tsx +1 -7
  258. package/src/plugins/builtin/alerts/storage.ts +17 -1
  259. package/src/plugins/builtin/analytics/index.tsx +6 -1
  260. package/src/plugins/builtin/analytics/metrics.ts +47 -9
  261. package/src/plugins/builtin/analytics/risk-headless.ts +14 -2
  262. package/src/plugins/builtin/analytics/risk-math.ts +83 -0
  263. package/src/plugins/builtin/analytics/risk-model.ts +97 -4
  264. package/src/plugins/builtin/analytics/risk-pane.tsx +11 -6
  265. package/src/plugins/builtin/analytics/sector-model.ts +14 -3
  266. package/src/plugins/builtin/awards/headless.ts +6 -5
  267. package/src/plugins/builtin/awards/index.tsx +1 -1
  268. package/src/plugins/builtin/backtest/client.ts +38 -8
  269. package/src/plugins/builtin/backtest/engine.ts +25 -13
  270. package/src/plugins/builtin/backtest/export.ts +27 -0
  271. package/src/plugins/builtin/backtest/format.ts +19 -3
  272. package/src/plugins/builtin/backtest/headless.ts +42 -28
  273. package/src/plugins/builtin/backtest/index.tsx +3 -0
  274. package/src/plugins/builtin/backtest/pane.tsx +39 -10
  275. package/src/plugins/builtin/backtest/report.ts +160 -0
  276. package/src/plugins/builtin/backtest/rules.ts +2 -0
  277. package/src/plugins/builtin/backtest/window.ts +112 -0
  278. package/src/plugins/builtin/bond-calculator/headless.ts +3 -2
  279. package/src/plugins/builtin/broker-manager/add-flow.tsx +4 -4
  280. package/src/plugins/builtin/catalysts/headless.ts +24 -13
  281. package/src/plugins/builtin/catalysts/index.tsx +4 -2
  282. package/src/plugins/builtin/catalysts/model.ts +18 -1
  283. package/src/plugins/builtin/catalysts/pane.tsx +2 -2
  284. package/src/plugins/builtin/cds/client.ts +28 -5
  285. package/src/plugins/builtin/cds/headless.ts +183 -31
  286. package/src/plugins/builtin/cds/index.tsx +1 -1
  287. package/src/plugins/builtin/cds/model.ts +229 -53
  288. package/src/plugins/builtin/cds/pane.tsx +82 -26
  289. package/src/plugins/builtin/central-bank-rates/headless.ts +1 -1
  290. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +39 -1
  291. package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +77 -0
  292. package/src/plugins/builtin/chart-composer/chart-spec.ts +15 -0
  293. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +22 -2
  294. package/src/plugins/builtin/chart-composer/editor/desktop-view.tsx +2 -2
  295. package/src/plugins/builtin/chart-composer/headless-schema.ts +10 -2
  296. package/src/plugins/builtin/chart-composer/headless.ts +99 -21
  297. package/src/plugins/builtin/chart-composer/index.tsx +70 -13
  298. package/src/plugins/builtin/chart-composer/pane.tsx +65 -15
  299. package/src/plugins/builtin/chart-composer/presets.ts +79 -11
  300. package/src/plugins/builtin/chart-composer/series-catalog.ts +50 -14
  301. package/src/plugins/builtin/chart-composer/series-expression.ts +9 -7
  302. package/src/plugins/builtin/chart-composer/series-listings.ts +178 -0
  303. package/src/plugins/builtin/chart-composer/session-range.ts +87 -0
  304. package/src/plugins/builtin/chat/attachments/desktop.tsx +4 -1
  305. package/src/plugins/builtin/chat/content/composer-runtime.ts +49 -14
  306. package/src/plugins/builtin/chat/content/composer.tsx +22 -1
  307. package/src/plugins/builtin/chat/content/index.tsx +35 -5
  308. package/src/plugins/builtin/chat/content/layout-metrics.ts +3 -0
  309. package/src/plugins/builtin/chat/content/shortcuts.ts +32 -13
  310. package/src/plugins/builtin/chat/content/snapshot.ts +29 -6
  311. package/src/plugins/builtin/chat/ghost-user.ts +11 -3
  312. package/src/plugins/builtin/chat/layout.ts +2 -0
  313. package/src/plugins/builtin/chat/message/desktop.tsx +13 -5
  314. package/src/plugins/builtin/chat/message/header.tsx +26 -4
  315. package/src/plugins/builtin/chat/message/pane-chip.tsx +131 -35
  316. package/src/plugins/builtin/chat/message/render-state.ts +28 -1
  317. package/src/plugins/builtin/chat/message/terminal.tsx +9 -3
  318. package/src/plugins/builtin/chat/pane-links/composer.ts +87 -0
  319. package/src/plugins/builtin/chat/pane-links/model.ts +1 -1
  320. package/src/plugins/builtin/chat/share/flow.tsx +9 -73
  321. package/src/plugins/builtin/cloud/askg/controller.ts +5 -3
  322. package/src/plugins/builtin/cloud/askg/executor.ts +3 -1
  323. package/src/plugins/builtin/cloud/askg/lock-note.ts +16 -0
  324. package/src/plugins/builtin/cloud/askg/pane.tsx +6 -2
  325. package/src/plugins/builtin/cloud/auth-actions.tsx +4 -2
  326. package/src/plugins/builtin/cloud/company-picker.tsx +21 -26
  327. package/src/plugins/builtin/cloud/mcp-connect/dialog.tsx +5 -3
  328. package/src/plugins/builtin/cloud/plugin.tsx +2 -0
  329. package/src/plugins/builtin/cloud/team/module.tsx +5 -1
  330. package/src/plugins/builtin/cloud/team/pane.tsx +11 -4
  331. package/src/plugins/builtin/cloud/team/views.ts +11 -4
  332. package/src/plugins/builtin/cloud/terminal-relay/engine.ts +9 -4
  333. package/src/plugins/builtin/cloud/terminal-relay/prompts.tsx +3 -2
  334. package/src/plugins/builtin/cloud/thesis/detail.tsx +2 -1
  335. package/src/plugins/builtin/cloud/thesis/exposure.ts +3 -0
  336. package/src/plugins/builtin/cloud/thesis/prompts.tsx +3 -2
  337. package/src/plugins/builtin/cloud/thesis/ticker-tab.tsx +2 -1
  338. package/src/plugins/builtin/cloud/trial-offer-status-widget.tsx +2 -1
  339. package/src/plugins/builtin/cloud/verification-status-widget.tsx +2 -1
  340. package/src/plugins/builtin/commodities-energy/index.tsx +8 -5
  341. package/src/plugins/builtin/commodities-energy/view-state.ts +11 -0
  342. package/src/plugins/builtin/company-attention/headless.ts +15 -7
  343. package/src/plugins/builtin/company-attention/index.tsx +1 -1
  344. package/src/plugins/builtin/company-attention/model.ts +49 -4
  345. package/src/plugins/builtin/company-attention/pane.tsx +11 -9
  346. package/src/plugins/builtin/company-kpis/headless.ts +4 -3
  347. package/src/plugins/builtin/company-kpis/index.tsx +2 -2
  348. package/src/plugins/builtin/company-kpis/pane.tsx +9 -3
  349. package/src/plugins/builtin/congress-trades/headless.ts +23 -2
  350. package/src/plugins/builtin/correlation/relationship/pane.tsx +18 -46
  351. package/src/plugins/builtin/cot/headless.ts +5 -2
  352. package/src/plugins/builtin/credit-boards/cdx-pane.tsx +41 -13
  353. package/src/plugins/builtin/credit-boards/client.ts +9 -2
  354. package/src/plugins/builtin/credit-boards/headless.ts +93 -27
  355. package/src/plugins/builtin/credit-boards/index.tsx +15 -4
  356. package/src/plugins/builtin/credit-boards/model.ts +105 -6
  357. package/src/plugins/builtin/credit-boards/sovr-pane.tsx +14 -3
  358. package/src/plugins/builtin/credit-documents/detail.tsx +2 -1
  359. package/src/plugins/builtin/credit-documents/index.tsx +3 -0
  360. package/src/plugins/builtin/credit-documents/model.ts +3 -10
  361. package/src/plugins/builtin/crypto-board/client.ts +152 -2
  362. package/src/plugins/builtin/crypto-board/headless.ts +138 -19
  363. package/src/plugins/builtin/crypto-board/index.tsx +5 -3
  364. package/src/plugins/builtin/crypto-board/model.ts +210 -12
  365. package/src/plugins/builtin/crypto-board/pane.tsx +148 -9
  366. package/src/plugins/builtin/crypto-board/series.ts +52 -1
  367. package/src/plugins/builtin/crypto-board/supply.ts +123 -0
  368. package/src/plugins/builtin/debt-maturities/client.ts +54 -1
  369. package/src/plugins/builtin/debt-maturities/headless.ts +27 -3
  370. package/src/plugins/builtin/debt-maturities/index.tsx +2 -0
  371. package/src/plugins/builtin/debt-maturities/model.ts +58 -13
  372. package/src/plugins/builtin/debt-maturities/pane.tsx +47 -7
  373. package/src/plugins/builtin/dividend-yield/client.ts +42 -36
  374. package/src/plugins/builtin/dividend-yield/headless.ts +113 -18
  375. package/src/plugins/builtin/dividend-yield/index.tsx +5 -2
  376. package/src/plugins/builtin/dividend-yield/pane.tsx +37 -13
  377. package/src/plugins/builtin/dividend-yield/provider-client.ts +7 -3
  378. package/src/plugins/builtin/dividend-yield/ranking.ts +187 -0
  379. package/src/plugins/builtin/dividend-yield/reference-price.ts +28 -5
  380. package/src/plugins/builtin/dividend-yield/types.ts +6 -1
  381. package/src/plugins/builtin/dividend-yield/view.ts +1 -1
  382. package/src/plugins/builtin/docs/blocks.tsx +54 -8
  383. package/src/plugins/builtin/docs/pane.tsx +8 -13
  384. package/src/plugins/builtin/earnings/headless.ts +3 -2
  385. package/src/plugins/builtin/earnings-calls/data.ts +51 -0
  386. package/src/plugins/builtin/earnings-calls/headless.ts +7 -0
  387. package/src/plugins/builtin/earnings-calls/index.tsx +1 -0
  388. package/src/plugins/builtin/earnings-calls/model.ts +97 -0
  389. package/src/plugins/builtin/earnings-calls/pane.tsx +107 -7
  390. package/src/plugins/builtin/earnings-calls/transcript-view.tsx +140 -22
  391. package/src/plugins/builtin/earnings-calls/use-call-playback.ts +194 -0
  392. package/src/plugins/builtin/econ/calendar-model.ts +22 -0
  393. package/src/plugins/builtin/econ/calendar-source.ts +35 -0
  394. package/src/plugins/builtin/econ/index.tsx +40 -8
  395. package/src/plugins/builtin/econ-statistics/defs.ts +7 -0
  396. package/src/plugins/builtin/econ-statistics/detail.tsx +8 -1
  397. package/src/plugins/builtin/econ-statistics/headless.ts +26 -5
  398. package/src/plugins/builtin/econ-statistics/pane.tsx +4 -2
  399. package/src/plugins/builtin/econ-statistics/stats.ts +10 -0
  400. package/src/plugins/builtin/econ-statistics/view.ts +19 -0
  401. package/src/plugins/builtin/equity-screener/client.ts +1 -1
  402. package/src/plugins/builtin/equity-screener/model.ts +46 -4
  403. package/src/plugins/builtin/equity-screener/pane.tsx +3 -0
  404. package/src/plugins/builtin/estimate-revisions/client.ts +32 -22
  405. package/src/plugins/builtin/estimate-revisions/headless.ts +1 -0
  406. package/src/plugins/builtin/estimate-revisions/index.tsx +1 -0
  407. package/src/plugins/builtin/estimate-revisions/pane.tsx +5 -3
  408. package/src/plugins/builtin/executives/index.tsx +1 -0
  409. package/src/plugins/builtin/exposure/editor.tsx +3 -3
  410. package/src/plugins/builtin/fear-greed/index.tsx +9 -0
  411. package/src/plugins/builtin/filing-events/index.tsx +1 -0
  412. package/src/plugins/builtin/futures/index.tsx +2 -2
  413. package/src/plugins/builtin/futures/model.ts +34 -21
  414. package/src/plugins/builtin/futures/table.tsx +1 -1
  415. package/src/plugins/builtin/futures/use-board-terms.ts +2 -2
  416. package/src/plugins/builtin/futures-curve/headless.ts +4 -2
  417. package/src/plugins/builtin/futures-curve/model.ts +5 -7
  418. package/src/plugins/builtin/help/index.tsx +55 -8
  419. package/src/plugins/builtin/help/shortcut-table.tsx +15 -2
  420. package/src/plugins/builtin/holders/headless.ts +12 -0
  421. package/src/plugins/builtin/insider/headless.ts +311 -41
  422. package/src/plugins/builtin/insider/index.tsx +280 -106
  423. package/src/plugins/builtin/insider/insiders.tsx +224 -0
  424. package/src/plugins/builtin/insider/signals-cells.tsx +52 -0
  425. package/src/plugins/builtin/insider/signals-client.ts +135 -11
  426. package/src/plugins/builtin/insider/signals-model.ts +628 -56
  427. package/src/plugins/builtin/insider/signals.tsx +283 -83
  428. package/src/plugins/builtin/ipo-calendar/headless.ts +17 -7
  429. package/src/plugins/builtin/ipo-calendar/index.tsx +23 -3
  430. package/src/plugins/builtin/ipo-calendar/model.ts +84 -36
  431. package/src/plugins/builtin/ipo-calendar/pane.tsx +20 -8
  432. package/src/plugins/builtin/iv-history/headless.ts +2 -0
  433. package/src/plugins/builtin/jobs/headless.ts +1 -0
  434. package/src/plugins/builtin/jobs/index.tsx +1 -0
  435. package/src/plugins/builtin/jodi/headless.ts +2 -0
  436. package/src/plugins/builtin/kelly-sizer/pane.tsx +1 -1
  437. package/src/plugins/builtin/kelly-sizer/portfolio.ts +1 -1
  438. package/src/plugins/builtin/market-heatmap/headless.ts +1 -0
  439. package/src/plugins/builtin/market-heatmap/portfolio.ts +3 -1
  440. package/src/plugins/builtin/market-valuation/pane.tsx +1 -1
  441. package/src/plugins/builtin/market-valuation/zone-scale/desktop.tsx +31 -57
  442. package/src/plugins/builtin/mna/distress/headless.ts +2 -1
  443. package/src/plugins/builtin/mna/headless.ts +14 -2
  444. package/src/plugins/builtin/mna/index.tsx +1 -0
  445. package/src/plugins/builtin/news/headless.ts +4 -0
  446. package/src/plugins/builtin/news/wire/news/footer.ts +5 -3
  447. package/src/plugins/builtin/news/wire/news/table.tsx +57 -11
  448. package/src/plugins/builtin/notes/cli.ts +8 -4
  449. package/src/plugins/builtin/notes/files.ts +66 -20
  450. package/src/plugins/builtin/notes/migration.ts +18 -6
  451. package/src/plugins/builtin/notes/owner.tsx +3 -2
  452. package/src/plugins/builtin/notes/quick-notes-pane.tsx +3 -2
  453. package/src/plugins/builtin/options-scenario/client.ts +7 -4
  454. package/src/plugins/builtin/options-scenario/headless.ts +5 -3
  455. package/src/plugins/builtin/pe-band/index.tsx +1 -1
  456. package/src/plugins/builtin/pe-band/model.ts +1 -15
  457. package/src/plugins/builtin/perps/headless.ts +30 -13
  458. package/src/plugins/builtin/perps/model.ts +45 -3
  459. package/src/plugins/builtin/perps/pane.tsx +7 -7
  460. package/src/plugins/builtin/portfolio-list/cell-version.ts +10 -4
  461. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +128 -14
  462. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +108 -46
  463. package/src/plugins/builtin/portfolio-list/cli/render.ts +368 -45
  464. package/src/plugins/builtin/portfolio-list/cli/shared.ts +8 -2
  465. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +24 -34
  466. package/src/plugins/builtin/portfolio-list/grid.tsx +3 -1
  467. package/src/plugins/builtin/portfolio-list/headless.ts +151 -29
  468. package/src/plugins/builtin/portfolio-list/income.ts +296 -0
  469. package/src/plugins/builtin/portfolio-list/metrics.ts +2 -2
  470. package/src/plugins/builtin/portfolio-list/pane/futures-terms.ts +58 -0
  471. package/src/plugins/builtin/portfolio-list/pane/index.tsx +27 -10
  472. package/src/plugins/builtin/portfolio-list/pane/supplemental.ts +47 -28
  473. package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +3 -2
  474. package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +10 -3
  475. package/src/plugins/builtin/portfolio-list/summary/index.tsx +26 -4
  476. package/src/plugins/builtin/portfolio-list/summary/totals.ts +31 -3
  477. package/src/plugins/builtin/portfolio-list/table.tsx +25 -5
  478. package/src/plugins/builtin/power/prices-headless.ts +2 -1
  479. package/src/plugins/builtin/realized-vol/chart-model.ts +29 -5
  480. package/src/plugins/builtin/realized-vol/charts.tsx +14 -8
  481. package/src/plugins/builtin/realized-vol/evidence.ts +2 -0
  482. package/src/plugins/builtin/realized-vol/headless.ts +6 -4
  483. package/src/plugins/builtin/realized-vol/model.ts +5 -1
  484. package/src/plugins/builtin/realized-vol/pane.tsx +31 -11
  485. package/src/plugins/builtin/realized-vol/settings.ts +1 -1
  486. package/src/plugins/builtin/research/analyst-headless.ts +4 -0
  487. package/src/plugins/builtin/research/corporate-actions-pane.tsx +2 -0
  488. package/src/plugins/builtin/research/event-model.ts +22 -2
  489. package/src/plugins/builtin/research/headless-schema.ts +1 -0
  490. package/src/plugins/builtin/research/headless.ts +3 -0
  491. package/src/plugins/builtin/research/index.tsx +3 -0
  492. package/src/plugins/builtin/research/relative-valuation-columns.ts +27 -5
  493. package/src/plugins/builtin/research/relative-valuation-headless.ts +2 -0
  494. package/src/plugins/builtin/revenue-breakdown/index.tsx +1 -0
  495. package/src/plugins/builtin/reverse-dcf/headless.ts +9 -6
  496. package/src/plugins/builtin/reverse-dcf/index.tsx +2 -2
  497. package/src/plugins/builtin/reverse-dcf/model.ts +51 -4
  498. package/src/plugins/builtin/reverse-dcf/pane.tsx +23 -10
  499. package/src/plugins/builtin/risk-factors/headless.ts +7 -0
  500. package/src/plugins/builtin/risk-factors/index.tsx +1 -0
  501. package/src/plugins/builtin/scanner/feed.ts +5 -3
  502. package/src/plugins/builtin/scanner/headless.ts +9 -57
  503. package/src/plugins/builtin/scanner/index.ts +1 -2
  504. package/src/plugins/builtin/sec/forms.ts +2 -6
  505. package/src/plugins/builtin/sec/fund-facts-view.tsx +53 -0
  506. package/src/plugins/builtin/sec/fund-facts.ts +328 -0
  507. package/src/plugins/builtin/sec/headless.ts +140 -44
  508. package/src/plugins/builtin/sec/index.tsx +95 -30
  509. package/src/plugins/builtin/sec/model.ts +2 -44
  510. package/src/plugins/builtin/shared/headless-options.ts +10 -0
  511. package/src/plugins/builtin/shared/locked-rows.tsx +3 -1
  512. package/src/plugins/builtin/shared/move-rank.ts +108 -0
  513. package/src/plugins/builtin/shared/report-freshness.ts +25 -9
  514. package/src/plugins/builtin/shared/scanner-capture.ts +95 -0
  515. package/src/plugins/builtin/shared/treasury-cutoffs.ts +15 -0
  516. package/src/plugins/builtin/shared/use-quote-board.ts +1 -0
  517. package/src/plugins/builtin/shared/volatility/live-session.ts +34 -0
  518. package/src/plugins/builtin/shared/volatility-indices.ts +32 -0
  519. package/src/plugins/builtin/short-interest/headless.ts +3 -0
  520. package/src/plugins/builtin/short-interest/watch-model.ts +2 -2
  521. package/src/plugins/builtin/social-mentions/client.ts +8 -1
  522. package/src/plugins/builtin/social-mentions/pane.tsx +8 -6
  523. package/src/plugins/builtin/supply-chain/client.ts +12 -3
  524. package/src/plugins/builtin/supply-chain/disclosure-quote.tsx +9 -5
  525. package/src/plugins/builtin/supply-chain/evidence.ts +3 -1
  526. package/src/plugins/builtin/supply-chain/flow-layout.ts +2 -1
  527. package/src/plugins/builtin/supply-chain/flow.tsx +23 -16
  528. package/src/plugins/builtin/supply-chain/graph-client.ts +8 -5
  529. package/src/plugins/builtin/supply-chain/graph-evidence.ts +1 -1
  530. package/src/plugins/builtin/supply-chain/graph-model.ts +10 -2
  531. package/src/plugins/builtin/supply-chain/graph-pane.tsx +9 -7
  532. package/src/plugins/builtin/supply-chain/graph.tsx +8 -6
  533. package/src/plugins/builtin/supply-chain/headless.ts +69 -27
  534. package/src/plugins/builtin/supply-chain/index.tsx +1 -1
  535. package/src/plugins/builtin/supply-chain/model.ts +76 -15
  536. package/src/plugins/builtin/supply-chain/pane.tsx +29 -15
  537. package/src/plugins/builtin/supply-chain/row-evidence.tsx +5 -4
  538. package/src/plugins/builtin/themes/model.ts +2 -5
  539. package/src/plugins/builtin/thirteenf/api.ts +50 -2
  540. package/src/plugins/builtin/thirteenf/data.ts +250 -11
  541. package/src/plugins/builtin/thirteenf/headless.ts +311 -28
  542. package/src/plugins/builtin/thirteenf/index.tsx +4 -1
  543. package/src/plugins/builtin/thirteenf/model.ts +244 -19
  544. package/src/plugins/builtin/thirteenf/overlap-pane.tsx +133 -33
  545. package/src/plugins/builtin/thirteenf/overlap.ts +1 -1
  546. package/src/plugins/builtin/thirteenf/pane.tsx +24 -5
  547. package/src/plugins/builtin/thirteenf/report-notes.ts +78 -0
  548. package/src/plugins/builtin/thirteenf/types.ts +49 -0
  549. package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +22 -8
  550. package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +17 -1
  551. package/src/plugins/builtin/ticker-detail/financials/model.ts +2 -42
  552. package/src/plugins/builtin/ticker-detail/financials/tab.tsx +1 -1
  553. package/src/plugins/builtin/ticker-detail/headless.ts +23 -10
  554. package/src/plugins/builtin/ticker-detail/overview/components.tsx +27 -3
  555. package/src/plugins/builtin/ticker-detail/overview/dividend.ts +60 -0
  556. package/src/plugins/builtin/ticker-detail/overview/model.ts +46 -9
  557. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +3 -0
  558. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +36 -3
  559. package/src/plugins/builtin/ticker-detail/quote-monitor/card.tsx +18 -19
  560. package/src/plugins/builtin/time-sales/client.ts +7 -4
  561. package/src/plugins/builtin/time-sales/headless.ts +71 -22
  562. package/src/plugins/builtin/time-sales/model.ts +12 -0
  563. package/src/plugins/builtin/time-sales/pane.tsx +31 -7
  564. package/src/plugins/builtin/time-sales/window.ts +128 -0
  565. package/src/plugins/builtin/trace-bonds/client.ts +351 -33
  566. package/src/plugins/builtin/trace-bonds/headless.ts +60 -22
  567. package/src/plugins/builtin/trace-bonds/index.tsx +4 -2
  568. package/src/plugins/builtin/trace-bonds/model.ts +27 -25
  569. package/src/plugins/builtin/trace-bonds/pane.tsx +63 -45
  570. package/src/plugins/builtin/treasury-auctions/cache.ts +61 -15
  571. package/src/plugins/builtin/treasury-auctions/client.ts +45 -10
  572. package/src/plugins/builtin/treasury-auctions/headless.ts +35 -13
  573. package/src/plugins/builtin/treasury-auctions/index.tsx +5 -2
  574. package/src/plugins/builtin/treasury-auctions/model.ts +20 -16
  575. package/src/plugins/builtin/treasury-auctions/pane.tsx +29 -12
  576. package/src/plugins/builtin/vol-surface/charts.tsx +2 -1
  577. package/src/plugins/builtin/vol-surface/headless.ts +3 -2
  578. package/src/plugins/builtin/vol-surface/pane.tsx +2 -1
  579. package/src/plugins/builtin/vol-surface/stored.ts +4 -7
  580. package/src/plugins/builtin/volatility/chart-model.ts +16 -15
  581. package/src/plugins/builtin/volatility/charts.tsx +5 -5
  582. package/src/plugins/builtin/volatility/client.ts +73 -2
  583. package/src/plugins/builtin/volatility/evidence.ts +13 -14
  584. package/src/plugins/builtin/volatility/headless.ts +13 -7
  585. package/src/plugins/builtin/volatility/index.tsx +1 -1
  586. package/src/plugins/builtin/volatility/model.ts +104 -38
  587. package/src/plugins/builtin/volatility/pane.tsx +42 -24
  588. package/src/plugins/builtin/volatility/series.ts +22 -13
  589. package/src/plugins/builtin/world-venue-map/geo-series.ts +9 -0
  590. package/src/plugins/builtin/world-venue-map/headless.ts +8 -5
  591. package/src/plugins/builtin/world-venue-map/index.ts +16 -2
  592. package/src/plugins/builtin/world-venue-map/map.tsx +13 -17
  593. package/src/plugins/builtin/yield-curve/curves.ts +29 -5
  594. package/src/plugins/builtin/yield-curve/headless.ts +41 -8
  595. package/src/plugins/builtin/yield-curve/history.ts +5 -5
  596. package/src/plugins/builtin/yield-curve/index.tsx +30 -13
  597. package/src/plugins/compat.ts +3 -1
  598. package/src/plugins/dependencies.ts +8 -2
  599. package/src/plugins/host-link.ts +12 -5
  600. package/src/plugins/installer.ts +16 -7
  601. package/src/plugins/loader.ts +9 -2
  602. package/src/plugins/marketplace/activation.ts +10 -4
  603. package/src/plugins/registry/host-actions.ts +3 -0
  604. package/src/plugins/registry/index.ts +3 -1
  605. package/src/{plugins/builtin/portfolio-list → portfolio}/allocation.ts +74 -12
  606. package/src/{plugins/builtin/portfolio-list → portfolio}/column-values.ts +140 -53
  607. package/src/portfolio/futures-positions.ts +213 -0
  608. package/src/portfolio/futures-terms.ts +75 -0
  609. package/src/portfolio/manual-lots.ts +78 -0
  610. package/src/portfolio/mutations.ts +54 -10
  611. package/src/portfolio/position-metrics.ts +44 -10
  612. package/src/portfolio/valuation-basis.ts +31 -4
  613. package/src/public/__snapshots__/public-api.test.ts.snap +4 -0
  614. package/src/public/time-series.ts +2 -1
  615. package/src/remote/confirm-change.tsx +2 -1
  616. package/src/remote/server.ts +1 -1
  617. package/src/remote/watchlist.ts +9 -1
  618. package/src/renderers/dom/data-table/row.tsx +1 -1
  619. package/src/renderers/dom/desktop/audio-player.tsx +312 -0
  620. package/src/renderers/dom/desktop/control-styles.ts +17 -82
  621. package/src/renderers/dom/desktop/controls.tsx +39 -63
  622. package/src/renderers/dom/desktop/dialog-actions.tsx +13 -53
  623. package/src/renderers/dom/desktop/icons.tsx +8 -0
  624. package/src/renderers/dom/desktop/list-view.tsx +6 -6
  625. package/src/renderers/dom/desktop/popover.tsx +0 -3
  626. package/src/renderers/dom/desktop/query-bar.tsx +6 -4
  627. package/src/renderers/dom/desktop/select-field.tsx +9 -8
  628. package/src/renderers/dom/desktop/stack-header.ts +3 -0
  629. package/src/renderers/dom/dom-ui-host.tsx +3 -2
  630. package/src/renderers/dom/host/chart-surface.tsx +3 -3
  631. package/src/renderers/dom/host/size-observer.ts +33 -4
  632. package/src/renderers/dom/host/surface-3d.tsx +3 -2
  633. package/src/renderers/dom/host/surface-fit.ts +4 -1
  634. package/src/renderers/dom/host/tabs.tsx +22 -132
  635. package/src/renderers/dom/styles.css +358 -160
  636. package/src/renderers/electrobun/bun/core-capabilities.ts +1 -1
  637. package/src/renderers/electrobun/bun/desktop/backend.ts +1 -1
  638. package/src/renderers/electrobun/bun/desktop/initialization.ts +1 -0
  639. package/src/renderers/electrobun/bun/desktop/state-broadcaster.ts +43 -1
  640. package/src/renderers/electrobun/bun/desktop/workspace/requests.ts +5 -1
  641. package/src/renderers/electrobun/shared/rpc-codec.ts +7 -0
  642. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +21 -17
  643. package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +3 -3
  644. package/src/renderers/electrobun/view/desktop/window/bridge.ts +6 -8
  645. package/src/renderers/electrobun/view/desktop/window/snapshot.ts +18 -0
  646. package/src/series/capability.ts +1 -0
  647. package/src/series/files.ts +9 -3
  648. package/src/series/registry.ts +40 -14
  649. package/src/series/resolve.ts +121 -18
  650. package/src/series/standalone.ts +3 -2
  651. package/src/series/types.ts +55 -1
  652. package/src/series/validate.ts +39 -0
  653. package/src/shares/api.ts +26 -7
  654. package/src/shares/bug-report-dialog.tsx +2 -2
  655. package/src/shares/bug-report-flow.tsx +4 -7
  656. package/src/shares/capture-flow.ts +5 -4
  657. package/src/shares/capture-preview.tsx +2 -2
  658. package/src/shares/chat.ts +7 -27
  659. package/src/shares/flow.tsx +86 -40
  660. package/src/shares/location.ts +1 -3
  661. package/src/shares/pane-image.ts +11 -9
  662. package/src/shares/pane.ts +5 -2
  663. package/src/shares/payload.ts +1 -1
  664. package/src/shares/personal-pane.ts +3 -3
  665. package/src/shares/portable-layout.ts +9 -2
  666. package/src/shares/ready.ts +42 -0
  667. package/src/shares/test-harness.ts +62 -0
  668. package/src/sources/gloomberb-cloud/batched-lookups.ts +73 -0
  669. package/src/sources/gloomberb-cloud/index.ts +64 -12
  670. package/src/sources/gloomberb-cloud/normalizers.ts +31 -2
  671. package/src/sources/gloomberb-cloud/perpetuals.ts +20 -1
  672. package/src/sources/history-omitted.ts +34 -0
  673. package/src/sources/history-result.ts +3 -0
  674. package/src/sources/history-retention.ts +1 -1
  675. package/src/sources/provider-errors.ts +43 -1
  676. package/src/sources/provider-router/batches.ts +3 -2
  677. package/src/sources/provider-router/cache.ts +2 -1
  678. package/src/sources/provider-router/cached-routes.ts +9 -3
  679. package/src/sources/provider-router/history.ts +9 -8
  680. package/src/sources/provider-router/index.ts +18 -3
  681. package/src/sources/provider-router/primary.ts +5 -4
  682. package/src/sources/provider-router/quote-route.ts +3 -1
  683. package/src/sources/provider-router/routing.ts +2 -1
  684. package/src/sources/provider-router/search.ts +47 -13
  685. package/src/sources/provider-router/streaming.ts +7 -4
  686. package/src/sources/sec-edgar.ts +1 -3
  687. package/src/state/app/context/index.tsx +9 -13
  688. package/src/state/app/tab-cursor.ts +149 -12
  689. package/src/state/hooks/quote-streaming.ts +3 -2
  690. package/src/state/hooks/session-snapshot.ts +3 -2
  691. package/src/state/persist-scheduler.ts +12 -4
  692. package/src/sync/controller.ts +22 -1
  693. package/src/sync/core-contributors.ts +58 -15
  694. package/src/team/collections-sync.ts +14 -4
  695. package/src/team/collections.ts +40 -11
  696. package/src/team/store.ts +5 -4
  697. package/src/telemetry/attention-counts.ts +8 -2
  698. package/src/telemetry/crash-reports-dom.ts +3 -0
  699. package/src/telemetry/crash-reports-node.ts +7 -4
  700. package/src/telemetry/crash-reports.ts +11 -11
  701. package/src/telemetry/usage-counts.ts +16 -12
  702. package/src/theme/colors.ts +2 -0
  703. package/src/theme/font-scale.ts +2 -0
  704. package/src/theme/ui-tokens.ts +71 -0
  705. package/src/tickers/batched-lookups.ts +186 -0
  706. package/src/tickers/company-name-listing.ts +97 -0
  707. package/src/tickers/company-name.ts +13 -0
  708. package/src/tickers/instrument-coverage.ts +112 -0
  709. package/src/tickers/listing-fate.ts +49 -9
  710. package/src/tickers/listing-venues.ts +24 -5
  711. package/src/tickers/open-target.ts +13 -5
  712. package/src/tickers/search/index.ts +112 -35
  713. package/src/tickers/search/ranking.ts +49 -1
  714. package/src/tickers/terminal-codes.ts +79 -0
  715. package/src/tickers/ticker-changes.ts +74 -3
  716. package/src/tickers/us-listing.ts +2 -1
  717. package/src/time-series/chart-data.ts +79 -8
  718. package/src/time-series/fundamentals.ts +55 -7
  719. package/src/time-series/ice-credit.ts +17 -2
  720. package/src/time-series/live-bars.ts +21 -8
  721. package/src/time-series/live-quotes.ts +2 -3
  722. package/src/time-series/price-comparison.ts +6 -1
  723. package/src/time-series/resolve.ts +65 -10
  724. package/src/time-series/spec.ts +2 -1
  725. package/src/time-series/studies.ts +3 -3
  726. package/src/time-series/types.ts +22 -0
  727. package/src/time-series/use-chart-resolution.ts +2 -1
  728. package/src/types/config.ts +7 -0
  729. package/src/types/data-provider.ts +20 -0
  730. package/src/types/headless.ts +142 -1
  731. package/src/types/instrument.ts +6 -0
  732. package/src/types/plugin.ts +32 -9
  733. package/src/types/price-history.ts +5 -0
  734. package/src/types/ticker-changes.ts +19 -0
  735. package/src/types/ticker.ts +10 -2
  736. package/src/ui/context-menu.tsx +2 -0
  737. package/src/ui/host.tsx +40 -4
  738. package/src/ui/measured-cells.ts +13 -7
  739. package/src/ui/qr.ts +7 -5
  740. package/src/updater/index.ts +5 -5
  741. package/src/utils/calendar-date.ts +86 -27
  742. package/src/utils/currency-units.ts +17 -0
  743. package/src/utils/debug-log.ts +1 -1
  744. package/src/utils/dividend-cash.ts +48 -0
  745. package/src/utils/dom-screenshot-rasters.ts +3 -1
  746. package/src/utils/dom-screenshot.ts +14 -10
  747. package/src/utils/exchange-rate-snapshot.ts +9 -4
  748. package/src/utils/external-url.ts +1 -0
  749. package/src/utils/fiscal-period.ts +47 -0
  750. package/src/utils/format.ts +5 -2
  751. package/src/utils/forward-dividend.ts +160 -11
  752. package/src/utils/futures-generic.ts +34 -8
  753. package/src/utils/http-proxy-response.ts +2 -1
  754. package/src/utils/local-utc-offset.ts +2 -0
  755. package/src/utils/log-failure.ts +31 -0
  756. package/src/utils/option-expiry.ts +12 -12
  757. package/src/utils/price-history-integrity.ts +56 -0
  758. package/src/utils/price-history.ts +13 -1
  759. package/src/utils/sec-filings.ts +245 -0
  760. package/src/utils/selection-clipboard.ts +5 -2
  761. package/src/utils/throttled-fetch.ts +1 -0
  762. package/src/{plugins/builtin/dividend-yield/trailing-cash.ts → utils/trailing-dividend.ts} +55 -8
  763. package/src/utils/url.ts +1 -0
  764. package/src/utils/utc-time.ts +11 -0
  765. package/src/plugins/builtin/chat/share/targets.ts +0 -27
  766. package/src/renderers/dom/host/top-surface.ts +0 -119
  767. package/src/shares/dialog.tsx +0 -221
  768. package/src/shares/live.ts +0 -19
@@ -6,8 +6,30 @@ interface CryptoDailyCloses {
6
6
 
7
7
  export type CryptoAssetKind = "coin" | "stablecoin";
8
8
 
9
+ /** What a stablecoin holds to: a currency, or a dollar value that accrues yield. */
10
+ export interface CryptoPeg {
11
+ /** The currency it is pegged to: USD, EUR. */
12
+ currency: string;
13
+ /** Yield accrues into the price (USDY): it has no par to be off. */
14
+ accrues: boolean;
15
+ /** The target in dollars: 1 for USD, the EUR/USD rate for EUR; null when it accrues or the rate is unavailable. */
16
+ price: number | null;
17
+ /** When a target that moves (an exchange rate) was quoted; null for USD. */
18
+ asOf: string | null;
19
+ }
20
+
21
+ /** The lowest and highest trade in the 24 hours to `end`, and when each was. */
22
+ interface CryptoDayRange {
23
+ low: number;
24
+ lowAt: string;
25
+ high: number;
26
+ highAt: string;
27
+ start: string;
28
+ end: string;
29
+ }
30
+
9
31
  export interface CryptoMarketAsset {
10
- /** Quote symbol for streaming and the ticker pane, for example BTC-USD. */
32
+ /** The coin's one symbol for quotes, history, streaming and the ticker pane, for example BTC-USD or USDE-USD. */
11
33
  symbol: string;
12
34
  /** Display code, for example BTC. */
13
35
  code: string;
@@ -31,6 +53,10 @@ export interface CryptoMarketAsset {
31
53
  yearAgoPrice: number | null;
32
54
  quoteTime: string | null;
33
55
  history: CryptoDailyCloses | null;
56
+ /** A stablecoin's peg; absent from servers before it was served. */
57
+ peg?: CryptoPeg | null;
58
+ /** A stablecoin's 24-hour low and high; absent from servers before it was served. */
59
+ range24h?: CryptoDayRange | null;
34
60
  }
35
61
 
36
62
  export interface CryptoMarketsPayload {
@@ -47,3 +73,64 @@ export interface CryptoMarketsPayload {
47
73
  assets: CryptoMarketAsset[];
48
74
  warnings: string[];
49
75
  }
76
+
77
+ /** One stablecoin's supply across chains in USD, on the board's as-of day. */
78
+ export interface StablecoinSupplyCoin {
79
+ symbol: string;
80
+ name: string;
81
+ /** The currency the coin is pegged to, as the source names it: peggedUSD, peggedEUR, peggedVAR (a floating target). */
82
+ pegType: string;
83
+ pegMechanism: string | null;
84
+ /** USD per unit the day's supply is valued at; null when the source states no units that day. */
85
+ price: number | null;
86
+ /** USD on the as-of day: the same figure the coin's daily supply ends on. */
87
+ supply: number;
88
+ /** Change in USD over 7 and 30 days on the coin's daily supply, and in percent of the value then. */
89
+ change7d: number | null;
90
+ change7dPercent: number | null;
91
+ change30d: number | null;
92
+ change30dPercent: number | null;
93
+ /** Percent of the total stablecoin supply. */
94
+ share: number | null;
95
+ }
96
+
97
+ export interface StablecoinSupplyPayload {
98
+ version: 1;
99
+ generatedAt: string;
100
+ fetchedAt: string | null;
101
+ /** UTC date of the newest daily total. */
102
+ asOf: string | null;
103
+ status: "available" | "stale" | "unavailable";
104
+ source: { name: string; url: string };
105
+ total: {
106
+ supply: number;
107
+ change7d: number | null;
108
+ change7dPercent: number | null;
109
+ change30d: number | null;
110
+ change30dPercent: number | null;
111
+ } | null;
112
+ /** The largest stablecoins by supply, largest first. */
113
+ coins: StablecoinSupplyCoin[];
114
+ /** Daily supply in USD since `start`: the total and the largest coins, on the same days. */
115
+ history: {
116
+ start: string;
117
+ total: Array<number | null>;
118
+ coins: Array<{ symbol: string; name: string; values: Array<number | null> }>;
119
+ } | null;
120
+ warnings: string[];
121
+ }
122
+
123
+ /** One stablecoin's daily supply in USD. */
124
+ export interface StablecoinSupplyHistoryPayload {
125
+ version: 1;
126
+ generatedAt: string;
127
+ fetchedAt: string | null;
128
+ asOf: string | null;
129
+ status: "available" | "stale" | "unavailable";
130
+ source: { name: string; url: string };
131
+ symbol: string;
132
+ name: string;
133
+ pegType: string;
134
+ history: { start: string; values: Array<number | null> } | null;
135
+ warnings: string[];
136
+ }
@@ -13,6 +13,7 @@ import { supplyGraphQuery, type GraphOptions, type GraphPayload } from "./supply
13
13
  import type { AwardDetailPayload, AwardFilter, AwardsPayload } from "./awards";
14
14
  import type { EarningsEvent } from "../types/data-provider";
15
15
  import type { MarketDividendsPayload, MarketHeatmapResult, MarketHeatmapUniverseId, MarketMoversPayload } from "./market-discovery";
16
+ import type { BankFiguresPayload } from "./bank-figures";
16
17
  import type { DebtMaturitiesPayload } from "./debt-maturities";
17
18
  import type { RevenueBreakdownPayload, RevenueBreakdownView } from "./revenue-breakdown";
18
19
  import type { MnaDealPayload, MnaDealsParams, MnaDealsPayload } from "./mna";
@@ -27,7 +28,7 @@ import type { LettersParams } from "./letters";
27
28
  import type { IpoCalendarParams, IpoCalendarPayload } from "./ipo";
28
29
  import type { TickerChanges } from "../types/ticker-changes";
29
30
  import type { OrganizationTickersResponse } from "./organization-tickers";
30
- import type { CryptoMarketsPayload } from "./crypto-markets";
31
+ import type { CryptoMarketsPayload, StablecoinSupplyHistoryPayload, StablecoinSupplyPayload } from "./crypto-markets";
31
32
  import type { CentralBankRatesPayload } from "./central-bank-rates";
32
33
  import type { EstimateRevisionsPayload } from "./estimate-revisions";
33
34
  import type { MoneyMarketsPayload } from "./money-markets";
@@ -44,8 +45,9 @@ import type { JodiBoardPayload, PsdBoardPayload } from "./commodity-balances";
44
45
  import type { CarbonBoard, CarbonHistory, EuropePowerBoard, EuropePowerHistory, GasStorageBoard, GasStorageHistory, GasStorageSeasonal } from "./europe-energy";
45
46
  import type { GpuBoardPayload, GpuEventsPayload, GpuHistoryPayload, GpuHistoryQuery } from "./gpu";
46
47
  import type { CpiBoardPayload } from "./cpi";
47
- import type { TapeSnapshot } from "./tape";
48
+ import type { TapeRange, TapeSnapshot } from "./tape";
48
49
  import { signalWithTimeout } from "../utils/async-deadline";
50
+ import { ApiRequestError } from "./errors";
49
51
  import type { ExchangeRateSnapshot } from "../types/exchange-rate";
50
52
  import type { RatePathPayload } from "./rates";
51
53
  import type { EarningsCalendarPayload, EarningsCalendarQuery, EarningsHistoryPayload } from "./earnings";
@@ -67,6 +69,7 @@ import {
67
69
  cloudCdsPath,
68
70
  cloudCongressHousePath,
69
71
  cloudEarningsCallsPath,
72
+ cloudEarningsCallAudioPath,
70
73
  cloudEarningsTranscriptPath,
71
74
  cloudJobsMoversPath,
72
75
  cloudJobsPath,
@@ -74,6 +77,7 @@ import {
74
77
  type CloudJobsPostingsParams,
75
78
  type IssuerListingParams,
76
79
  cloudProxyStatementPath,
80
+ cloudBankFiguresPath,
77
81
  cloudDebtMaturitiesPath,
78
82
  cloudFilingEventsPath,
79
83
  cloudRiskReportPath,
@@ -122,6 +126,7 @@ import type {
122
126
  CloudCdsResponse,
123
127
  CloudCongressHousePayload,
124
128
  CloudEarningsCallListPayload,
129
+ CloudEarningsCallAudioPayload,
125
130
  CloudEarningsTranscriptPayload,
126
131
  CloudJobsMoversPayload,
127
132
  CloudJobsPostingsPayload,
@@ -169,6 +174,26 @@ import type {
169
174
  } from "./types";
170
175
  import type { CloudApiRequest } from "./request";
171
176
 
177
+ /** A batched lookup's answer: one item per key asked, with that key's own status. */
178
+ type CloudBatchAnswer<K extends string, T> = {
179
+ items?: Array<{ status?: string; data?: T | null } & Record<K, string>>;
180
+ };
181
+
182
+ /**
183
+ * A batched lookup's items by the key each was asked as: the data of an item
184
+ * that has some, null for one with nothing on record, and none for one the
185
+ * service could not answer (rate limited, an upstream failure).
186
+ */
187
+ function batchAnswers<K extends string, T>(response: CloudMarketResponse<CloudBatchAnswer<K, T>>, key: K): Map<string, T | null> {
188
+ const answers = new Map<string, T | null>();
189
+ for (const item of response.data?.items ?? []) {
190
+ if (typeof item?.[key] !== "string") continue;
191
+ if (item.status === "success" || item.status === "partial") answers.set(item[key], item.data ?? null);
192
+ else if (item.status === "empty") answers.set(item[key], null);
193
+ }
194
+ return answers;
195
+ }
196
+
172
197
  export class CloudDataApi {
173
198
  constructor(private readonly request: CloudApiRequest) {}
174
199
 
@@ -208,6 +233,11 @@ export class CloudDataApi {
208
233
  return this.request<import("./members").FundMembersPayload>(`/cloud/members/${encodeURIComponent(fund)}`);
209
234
  }
210
235
 
236
+ /** A US-listed fund's fee, NAV, premium and net assets as its sponsor publishes them. */
237
+ getFundFacts(ticker: string) {
238
+ return this.request<import("./fund-facts").FundFactsPayload>(`/cloud/fund-facts/${encodeURIComponent(ticker)}`);
239
+ }
240
+
211
241
  getFundChanges(fund: string) {
212
242
  return this.request<import("./members").FundChangesPayload>(`/cloud/members/${encodeURIComponent(fund)}/changes`);
213
243
  }
@@ -237,6 +267,10 @@ export class CloudDataApi {
237
267
  const response = await this.request<
238
268
  CloudMarketResponse<InstrumentSearchResult[]>
239
269
  >(cloudMarketSearchPath(query, limit));
270
+ // A search the service could not run (its catalogue rate limited, say) is no answer, not an empty one.
271
+ if (response.status === "retryable_error" || response.status === "fatal_error") {
272
+ throw new ApiRequestError(response.reasonCode ?? "Cloud search failed", undefined, undefined, response.status);
273
+ }
240
274
  return response.data ?? [];
241
275
  }
242
276
 
@@ -402,6 +436,40 @@ export class CloudDataApi {
402
436
  );
403
437
  }
404
438
 
439
+ /**
440
+ * `getCloudTickerChanges` for several symbols in one request: by symbol as
441
+ * asked, null for one with no change on record. A symbol the service could
442
+ * not answer for is left out.
443
+ */
444
+ async getCloudTickerChangesBatch(
445
+ symbols: readonly string[],
446
+ options: { signal?: AbortSignal } = {},
447
+ ): Promise<Map<string, TickerChanges | null>> {
448
+ const response = await this.request<CloudMarketResponse<CloudBatchAnswer<"symbol", TickerChanges>>>(
449
+ "/market/ticker-changes/batch",
450
+ { method: "POST", body: JSON.stringify({ symbols }), ...options.signal ? { signal: options.signal } : {} },
451
+ );
452
+ return batchAnswers(response, "symbol");
453
+ }
454
+
455
+ /**
456
+ * Several searches in one request, each answered as `searchInstruments`
457
+ * answers it: by query as asked, a query the service could not search left out.
458
+ */
459
+ async searchInstrumentsBatch(
460
+ queries: readonly string[],
461
+ limit = 10,
462
+ options: { signal?: AbortSignal } = {},
463
+ ): Promise<Map<string, InstrumentSearchResult[]>> {
464
+ const response = await this.request<CloudMarketResponse<CloudBatchAnswer<"query", InstrumentSearchResult[]>>>(
465
+ "/market/search/batch",
466
+ { method: "POST", body: JSON.stringify({ queries, limit }), ...options.signal ? { signal: options.signal } : {} },
467
+ );
468
+ const answers = new Map<string, InstrumentSearchResult[]>();
469
+ for (const [query, rows] of batchAnswers(response, "query")) answers.set(query, rows ?? []);
470
+ return answers;
471
+ }
472
+
405
473
  /** The listed company each organization name resolves to, if any: a trial's lead sponsors, a page at a time. */
406
474
  async getCloudOrganizationTickers(names: readonly string[], signal?: AbortSignal): Promise<OrganizationTickersResponse> {
407
475
  return this.request<OrganizationTickersResponse>("/market/organization-tickers", {
@@ -458,6 +526,11 @@ export class CloudDataApi {
458
526
  return this.request<CloudEconEventPayload[]>("/cloud/econ/calendar");
459
527
  }
460
528
 
529
+ /** The calendar from a UTC day, past events included, and the first day the stored calendar holds. */
530
+ async getCloudEconomicCalendarFrom(from: string): Promise<{ events: CloudEconEventPayload[]; storedFrom: string | null }> {
531
+ return this.request<{ events: CloudEconEventPayload[]; storedFrom: string | null }>(`/cloud/econ/calendar/history?from=${encodeURIComponent(from)}`);
532
+ }
533
+
461
534
  async getCloudMacroReleaseDays(): Promise<CloudMacroReleaseDaysPayload> {
462
535
  return this.request<CloudMacroReleaseDaysPayload>("/cloud/econ/release-days");
463
536
  }
@@ -692,8 +765,10 @@ export class CloudDataApi {
692
765
  return this.request<CpiBoardPayload>("/cloud/cpi/board");
693
766
  }
694
767
 
695
- async getCloudTape(symbol: string, exchange: string, signal?: AbortSignal): Promise<TapeSnapshot> {
696
- return this.request<TapeSnapshot>(`/cloud/tape/${encodeURIComponent(symbol)}?exchange=${encodeURIComponent(exchange)}`, { signal: signalWithTimeout(signal, 30_000) });
768
+ /** The latest tape, or with a `range` that window of the session, read forward from its start. */
769
+ async getCloudTape(symbol: string, exchange: string, signal?: AbortSignal, range?: TapeRange): Promise<TapeSnapshot> {
770
+ const window = range ? `&from=${encodeURIComponent(range.from)}&to=${encodeURIComponent(range.to)}` : "";
771
+ return this.request<TapeSnapshot>(`/cloud/tape/${encodeURIComponent(symbol)}?exchange=${encodeURIComponent(exchange)}${window}`, { signal: signalWithTimeout(signal, 30_000) });
697
772
  }
698
773
 
699
774
  async getCloudYieldCurve(): Promise<CloudYieldPointPayload[]> {
@@ -724,6 +799,19 @@ export class CloudDataApi {
724
799
  return this.request<CryptoMarketsPayload>("/cloud/crypto/markets", { signal: AbortSignal.timeout(45_000) });
725
800
  }
726
801
 
802
+ /** Total stablecoin supply and the largest coins', daily, with 7D and 30D changes and shares. */
803
+ async getCloudStablecoinSupply(): Promise<StablecoinSupplyPayload> {
804
+ return this.request<StablecoinSupplyPayload>("/cloud/crypto/stablecoins/supply", { signal: AbortSignal.timeout(30_000) });
805
+ }
806
+
807
+ /** One listed stablecoin's daily supply, by symbol. */
808
+ async getCloudStablecoinSupplyHistory(symbol: string): Promise<StablecoinSupplyHistoryPayload> {
809
+ return this.request<StablecoinSupplyHistoryPayload>(
810
+ `/cloud/crypto/stablecoins/supply/${encodeURIComponent(symbol)}`,
811
+ { signal: AbortSignal.timeout(30_000) },
812
+ );
813
+ }
814
+
727
815
  async getCloudCentralBankRates(): Promise<CentralBankRatesPayload> {
728
816
  return this.request<CentralBankRatesPayload>("/cloud/econ/central-bank-rates", { signal: AbortSignal.timeout(45_000) });
729
817
  }
@@ -745,6 +833,10 @@ export class CloudDataApi {
745
833
  return this.request<DebtMaturitiesPayload>(cloudDebtMaturitiesPath(symbol, listing), { signal: AbortSignal.timeout(45_000) });
746
834
  }
747
835
 
836
+ async getCloudBankFigures(symbol: string): Promise<BankFiguresPayload> {
837
+ return this.request<BankFiguresPayload>(cloudBankFiguresPath(symbol), { signal: AbortSignal.timeout(30_000) });
838
+ }
839
+
748
840
  async getCloudRevenueBreakdown(symbol: string, view?: RevenueBreakdownView, listing?: IssuerListingParams): Promise<RevenueBreakdownPayload> {
749
841
  return this.request<RevenueBreakdownPayload>(cloudRevenueBreakdownPath(symbol, view, listing), { signal: AbortSignal.timeout(30_000) });
750
842
  }
@@ -892,6 +984,14 @@ export class CloudDataApi {
892
984
  );
893
985
  }
894
986
 
987
+ async getCloudEarningsCallAudio(
988
+ id: string,
989
+ ): Promise<CloudEarningsCallAudioPayload> {
990
+ return this.request<CloudEarningsCallAudioPayload>(
991
+ cloudEarningsCallAudioPath(id),
992
+ );
993
+ }
994
+
895
995
  // A listing outside the US also sends its venue and company (listingAbroad).
896
996
  async getProxyStatements(
897
997
  ticker: string,
@@ -51,6 +51,22 @@ export interface DebtHistoryPoint {
51
51
  borrowingCostPercent: number | null;
52
52
  interestExpenseTag: string | null;
53
53
  borrowingCostDebtTags: string | null;
54
+ /** SEC's fiscal year for the period, when the server sends it. */
55
+ fy?: number | null;
56
+ }
57
+ /**
58
+ * The debt a 10-Q filed after the annual schedule reports on its balance
59
+ * sheet date: what is due within a year and what is due later.
60
+ */
61
+ export interface DebtQuarter {
62
+ asOf: string;
63
+ filed: string;
64
+ accession: string;
65
+ form: string;
66
+ currency: string;
67
+ filingUrl: string;
68
+ current: DebtFact | null;
69
+ noncurrent: DebtFact | null;
54
70
  }
55
71
  export interface DebtMaturitiesPayload {
56
72
  version: 1;
@@ -88,5 +104,7 @@ export interface DebtMaturitiesPayload {
88
104
  borrowingCostEvidence: DebtBorrowingCost | null;
89
105
  };
90
106
  history: DebtHistoryPoint[];
107
+ /** The latest 10-Q when it is newer than `latest`. Older servers and cached payloads leave it out. */
108
+ latestQuarter?: DebtQuarter | null;
91
109
  warnings: string[];
92
110
  }
@@ -1,5 +1,7 @@
1
1
  /** Cited company disclosures; Pro, omitted by older servers. */
2
2
  export const KPI_FIELDS = ["kpiArr", "kpiNrrPercent", "kpiRpo", "kpiCrpo", "kpiSubscribers", "kpiDau", "kpiMau", "kpiGmv", "kpiTakeRatePercent", "kpiSameStoreSalesPercent", "kpiStores", "kpiBacklog", "kpiBookToBill", "kpiNimPercent", "kpiCet1Percent", "kpiCombinedRatioPercent", "kpiOccupancyPercent", "kpiLoadFactorPercent", "guideRevenueChangePercent", "guideEpsChangePercent"] as const;
3
+ /** Payout ratio and dividend growth; listed only when asked (`include=dividends`), and omitted by a server from before them. */
4
+ export const DIVIDEND_FIELDS = ["payoutRatioPercent", "dividendGrowth1YPercent", "dividendGrowth3YPercent"] as const;
3
5
  export const NUMERIC_FIELDS = [
4
6
  ...KPI_FIELDS,
5
7
  "price",
@@ -12,6 +14,7 @@ export const NUMERIC_FIELDS = [
12
14
  "forwardPE",
13
15
  "enterpriseToRevenue",
14
16
  "dividendYieldPercent",
17
+ ...DIVIDEND_FIELDS,
15
18
  "revenueGrowthPercent",
16
19
  "earningsGrowthPercent",
17
20
  "grossMarginPercent",
@@ -50,6 +50,17 @@ export function isPermanentClientError(error: unknown): boolean {
50
50
  return status !== undefined && status >= 400 && status < 500 && status !== 408 && status !== 429;
51
51
  }
52
52
 
53
+ /**
54
+ * A failure asking again shortly may get past: a timeout, a rate limit or an
55
+ * overloaded server (408, 429, 5xx), or a market answer the service marked
56
+ * `retryable_error` because its own upstream was rate limited or timed out.
57
+ */
58
+ export function isRetryableApiError(error: unknown): boolean {
59
+ if (!(error instanceof ApiRequestError)) return false;
60
+ const status = error.status;
61
+ return error.code === "retryable_error" || status === 408 || status === 429 || (status !== undefined && status >= 500);
62
+ }
63
+
53
64
  /** Reads `Retry-After` as milliseconds, accepting seconds or an HTTP date. */
54
65
  export function parseRetryAfterMs(
55
66
  header: string | null,
@@ -97,6 +108,7 @@ export function parseApiErrorDetails(body: string): Readonly<Record<string, unkn
97
108
  const parsed = JSON.parse(body) as unknown;
98
109
  return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed as Record<string, unknown> : undefined;
99
110
  } catch {
111
+ // Intentional ignore: Non-JSON error responses retain their HTTP status and original body.
100
112
  return undefined;
101
113
  }
102
114
  }
@@ -107,6 +119,7 @@ export function parseApiErrorCode(body: string): string | undefined {
107
119
  const parsed = JSON.parse(body) as Record<string, unknown> | null;
108
120
  return typeof parsed?.error === "string" && parsed.error ? parsed.error : undefined;
109
121
  } catch {
122
+ // Intentional ignore: Non-JSON error responses retain their HTTP status and original body.
110
123
  return undefined;
111
124
  }
112
125
  }
@@ -0,0 +1,72 @@
1
+ /** One published figure: when it is as of and who published it (the fund's sponsor, or Gloom Cloud for a computed one). */
2
+ interface FundFact<T> {
3
+ value: T;
4
+ asOf: string | null;
5
+ source: string;
6
+ url?: string;
7
+ }
8
+
9
+ type FundStructure = "registered" | "trust";
10
+ type ExpenseRatioKind = "net" | "gross" | "sponsor-fee";
11
+ /**
12
+ * A bond fund as its sponsor classes it: `municipal` when its interest is
13
+ * exempt from federal income tax, `taxable` otherwise.
14
+ */
15
+ type BondFundClass = "municipal" | "taxable";
16
+
17
+ /**
18
+ * What a bond fund's sponsor publishes about its yield and rate risk, each
19
+ * figure dated. The 30-day SEC yield is the standardized yield (net
20
+ * investment income of the last 30 days, annualized, over the offering
21
+ * price); a distribution yield annualizes cash paid and is not it.
22
+ */
23
+ export interface FundBondFacts {
24
+ kind: BondFundClass;
25
+ /** A single-state municipal fund's state (`CA`, `NY`); null for a national fund. */
26
+ state: string | null;
27
+ /** Percent. */
28
+ secYield: FundFact<number> | null;
29
+ /** Percent. */
30
+ yieldToWorst: FundFact<number> | null;
31
+ /** Years: `effective` (option-adjusted) duration, or Vanguard's month-end `average` duration. */
32
+ duration: (FundFact<number> & { measure: "effective" | "average" }) | null;
33
+ }
34
+
35
+ /**
36
+ * `not-collected-yet`: a source Gloom reads covers the fund, but it has no
37
+ * figures yet. `not-published`: no source Gloom reads covers it. Servers
38
+ * before statuses leave it out.
39
+ */
40
+ type FundFactsStatus = "covered" | "not-collected-yet" | "not-published" | "not-a-fund";
41
+
42
+ /** GET /cloud/fund-facts/:ticker. Percent fields are in percent (0.03 is 0.03%). */
43
+ export interface FundFactsPayload {
44
+ ticker: string;
45
+ covered: boolean;
46
+ status?: FundFactsStatus;
47
+ /** Why there are no facts, when `covered` is false. */
48
+ reason?: string;
49
+ name: string | null;
50
+ /** `trust`: an exchange-traded trust or pool outside the 1940 Act, charging a sponsor fee. */
51
+ structure: FundStructure | null;
52
+ /** `document`: read from the fund's prospectus filed with the SEC on `asOf`, not from its sponsor. */
53
+ expenseRatio: (FundFact<number> & { kind: ExpenseRatioKind; document?: "prospectus" }) | null;
54
+ nav: FundFact<number> | null;
55
+ closingPrice: FundFact<number> | null;
56
+ /** `published` by the sponsor, or `computed` from the closing price against the NAV. */
57
+ premiumDiscount: (FundFact<number> & { basis: "published" | "computed" }) | null;
58
+ /**
59
+ * `period`: a `day`'s figure, or the last `month-end`'s (Vanguard and ARK
60
+ * ETFs, N-PORT), which is not today's. `document`: the fund's N-PORT report
61
+ * to the SEC for that month end.
62
+ */
63
+ netAssets: (FundFact<number> & { scope: "share-class" | "fund" | null; period?: "day" | "month-end"; document?: "N-PORT" }) | null;
64
+ sponsor: FundFact<string> | null;
65
+ inception: FundFact<string> | null;
66
+ index: FundFact<string> | null;
67
+ /** A bond fund's SEC yield, yield to worst and duration; null for any other fund. Servers before it leave it out. */
68
+ bond?: FundBondFacts | null;
69
+ /** The newest NAV is older than a few US trading days: every figure is older than it looks. */
70
+ stale: boolean;
71
+ fetchedAt: string | null;
72
+ }
@@ -32,14 +32,27 @@ export interface FuturesContractTermsPayload {
32
32
  settlement: { price: number; date: string } | null
33
33
  /**
34
34
  * For a continuous symbol (CL=F) or a front generic: the nearest contract
35
- * still trading when the symbol has rolled past it to the most active one,
36
- * with its last trade; null when it prices the nearest itself. Absent from
35
+ * still trading once the symbol has rolled past it on its roll date, with
36
+ * its last trade; null when it prices the nearest itself. Absent from
37
37
  * servers that do not send it.
38
38
  */
39
39
  nearest?: FuturesNearestContract | null
40
+ /**
41
+ * For a continuous symbol or a generic: how it rolls ("1 day before last
42
+ * trade") and the first session it is on the next contract; the date is
43
+ * null under the open interest switch. Absent from older servers.
44
+ */
45
+ roll?: { label: string; date: string | null } | null
46
+ /**
47
+ * The root's front contract (what its continuous symbol and first generic
48
+ * price) when the symbol prices another one (NGF27, NG2); null on the front.
49
+ */
50
+ front?: FuturesNearestContract | null
51
+ /** The contract that traded the most on the root's newest session with volumes: the day's volume alone. */
52
+ mostActive?: FuturesMostActiveContract | null
40
53
  }
41
54
 
42
- /** The nearest contract still trading, which a continuous symbol has rolled past (CLX26 under CL=F on Dec). */
55
+ /** A listed contract by its code, as the quote endpoints take it (CLX26.NYM), and its last trade. */
43
56
  interface FuturesNearestContract {
44
57
  contract: string
45
58
  contractSymbol: string
@@ -48,6 +61,16 @@ interface FuturesNearestContract {
48
61
  lastTrade: string | null
49
62
  }
50
63
 
64
+ /** The most active contract: its volume on that session (`date`). */
65
+ interface FuturesMostActiveContract {
66
+ contract: string
67
+ contractSymbol: string
68
+ /** YYYY-MM */
69
+ deliveryMonth: string
70
+ volume: number
71
+ date: string
72
+ }
73
+
51
74
  /** Gloom Cloud futures prices retain provider denomination and explicit quote units. */
52
75
  export interface FuturesContract {
53
76
  symbol: string
@@ -9,6 +9,8 @@
9
9
  * `geo_unavailable`. A layer that cannot serve still answers 200 with an
10
10
  * empty body and its `status` and `statusNote`.
11
11
  */
12
+ import { logFailure } from "../utils/log-failure";
13
+
12
14
  type Lon = number;
13
15
  type Lat = number;
14
16
 
@@ -79,6 +81,12 @@ export interface GeoLayerInfo {
79
81
  status: GeoLayerStatus;
80
82
  /** Short plain words, never a source name. */
81
83
  statusNote?: string;
84
+ /**
85
+ * Who published the data, as a reader cites it (`IMF PortWatch`), when the
86
+ * server names one: a public institution, never a vendor. Reports cite it
87
+ * as their source and publisher; absent, they cite Gloom Cloud.
88
+ */
89
+ publisher?: string;
82
90
  access: "free" | "pro";
83
91
  /** The entity table's columns; the first is the label. */
84
92
  columns: GeoColumn[];
@@ -162,6 +170,8 @@ export interface GeoSeriesPayload {
162
170
  /** [YYYY-MM-DD, value], oldest first. */
163
171
  points: [string, number][];
164
172
  asOf: string | null;
173
+ /** Its layer's `publisher`, when the server names one. */
174
+ publisher?: string;
165
175
  }
166
176
 
167
177
  /** West, south, east, north in degrees. */
@@ -329,7 +339,7 @@ export async function loadGeoCatalog(
329
339
  catalogInFlight = request<unknown>("layers")
330
340
  .then(normalizeCatalog)
331
341
  // A missing route or a refusal is an answer; a network blip is too, for a while.
332
- .catch(() => null)
342
+ .catch(logFailure("cloud-geo", "Geo catalog request failed", null))
333
343
  .then((payload) => {
334
344
  catalogEntry = { at: options.now ?? Date.now(), payload };
335
345
  return payload;
@@ -1,3 +1,4 @@
1
+ import { logFailure } from "../utils/log-failure";
1
2
  import {
2
3
  isMarketplaceLayoutId,
3
4
  parseMarketplaceLayoutEntry,
@@ -420,6 +421,19 @@ class GloomApiClient {
420
421
  return this.request<{ url: string }>("/stripe/portal", { method: "POST", body: JSON.stringify({}) });
421
422
  }
422
423
 
424
+ /**
425
+ * Ends the Pro trial and Pro now, unbilled. Call it only once the person
426
+ * confirmed a warning that says so. `endedNow` is false when the server
427
+ * scheduled the cancel at the period end instead: the subscription was no
428
+ * longer in its trial, or the server predates ending a trial early.
429
+ */
430
+ async endCloudTrial(): Promise<{ canceled: boolean; endedNow?: boolean }> {
431
+ return this.request<{ canceled: boolean; endedNow?: boolean }>("/stripe/subscription/cancel", {
432
+ method: "POST",
433
+ body: JSON.stringify({ endTrialNow: true }),
434
+ });
435
+ }
436
+
423
437
  /**
424
438
  * Asks which arm of an app experiment this account or web visitor is in, at the
425
439
  * moment it would show. The API counts the answer as the exposure.
@@ -636,8 +650,9 @@ class GloomApiClient {
636
650
  reportCommandSearch(report: CommandSearchReport): void {
637
651
  try {
638
652
  if (!this.isSignedIn()) return;
639
- void this.telemetry.reportCommandSearch(report).catch(() => {});
640
- } catch {
653
+ void this.telemetry.reportCommandSearch(report).catch(logFailure("cloud-telemetry", "Command search report failed"));
654
+ } catch (error) {
655
+ logFailure("cloud-telemetry", "Command search reporting failed")(error);
641
656
  /* A report must never get in the way of the command bar. */
642
657
  }
643
658
  }
@@ -758,9 +773,12 @@ class GloomApiClient {
758
773
  getCloudCorporateActions = this.data.getCloudCorporateActions.bind(this.data);
759
774
  getCloudTickerChanges = this.data.getCloudTickerChanges.bind(this.data);
760
775
  getCloudOrganizationTickers = this.data.getCloudOrganizationTickers.bind(this.data);
776
+ getCloudTickerChangesBatch = this.data.getCloudTickerChangesBatch.bind(this.data);
777
+ searchInstrumentsBatch = this.data.searchInstrumentsBatch.bind(this.data);
761
778
  getCloudHistory = this.data.getCloudHistory.bind(this.data);
762
779
  getCloudExchangeRate = this.data.getCloudExchangeRate.bind(this.data);
763
780
  getCloudEconomicCalendar = this.data.getCloudEconomicCalendar.bind(this.data);
781
+ getCloudEconomicCalendarFrom = this.data.getCloudEconomicCalendarFrom.bind(this.data);
764
782
  getCloudMacroReleaseDays = this.data.getCloudMacroReleaseDays.bind(this.data);
765
783
  getCloudEquityDiagnostic = this.data.getCloudEquityDiagnostic.bind(this.data);
766
784
  getCloudEarningsCalendar = this.data.getCloudEarningsCalendar.bind(this.data);
@@ -768,6 +786,8 @@ class GloomApiClient {
768
786
  getCloudFredSeries = this.data.getCloudFredSeries.bind(this.data);
769
787
  getCloudFredSeriesCatalog = this.data.getCloudFredSeriesCatalog.bind(this.data);
770
788
  getCloudCryptoMarkets = this.data.getCloudCryptoMarkets.bind(this.data);
789
+ getCloudStablecoinSupply = this.data.getCloudStablecoinSupply.bind(this.data);
790
+ getCloudStablecoinSupplyHistory = this.data.getCloudStablecoinSupplyHistory.bind(this.data);
771
791
  getCloudCentralBankRates = this.data.getCloudCentralBankRates.bind(this.data);
772
792
  getMobileAlertHistory = this.data.getMobileAlertHistory.bind(this.data);
773
793
  getScannerFlowHistory = this.data.getScannerFlowHistory.bind(this.data);
@@ -777,10 +797,12 @@ class GloomApiClient {
777
797
  getMemberFunds = this.data.getMemberFunds.bind(this.data);
778
798
  getFundMembers = this.data.getFundMembers.bind(this.data);
779
799
  getFundChanges = this.data.getFundChanges.bind(this.data);
800
+ getFundFacts = this.data.getFundFacts.bind(this.data);
780
801
  getCloudThemes = this.data.getCloudThemes.bind(this.data);
781
802
  getCloudThemeMembers = this.data.getCloudThemeMembers.bind(this.data);
782
803
  impliedVolatility = this.data.impliedVolatility.bind(this.data);
783
804
  optionsPositioning = this.data.optionsPositioning.bind(this.data);
805
+ getCloudBankFigures = this.data.getCloudBankFigures.bind(this.data);
784
806
  getCloudDebtMaturities = this.data.getCloudDebtMaturities.bind(this.data);
785
807
  getCloudRevenueBreakdown = this.data.getCloudRevenueBreakdown.bind(this.data);
786
808
  getCloudMnaDeals = this.data.getCloudMnaDeals.bind(this.data);
@@ -861,6 +883,7 @@ class GloomApiClient {
861
883
  getCloudJobsMovers = this.data.getCloudJobsMovers.bind(this.data);
862
884
  getCloudEarningsCalls = this.data.getCloudEarningsCalls.bind(this.data);
863
885
  getCloudEarningsTranscript = this.data.getCloudEarningsTranscript.bind(this.data);
886
+ getCloudEarningsCallAudio = this.data.getCloudEarningsCallAudio.bind(this.data);
864
887
  getProxyStatements = this.data.getProxyStatements.bind(this.data);
865
888
  getProxyStatement = this.data.getProxyStatement.bind(this.data);
866
889
  getFilingEvents = this.data.getFilingEvents.bind(this.data);