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
@@ -3,6 +3,7 @@ import { getTimeSeriesField } from "./field-catalog";
3
3
  import type { ChartSpec, ResolvedSeries, TimeSeriesPoint } from "./types";
4
4
  import type { ManualChartResolution } from "./resolution";
5
5
  import { zonedDateTimeParts } from "../utils/zoned-date-time";
6
+ import { barLastSession } from "../market-data/market/bar-period";
6
7
 
7
8
  const PRICE_COMPARISON_BASIS = "Price returns in each listing's currency; cash distributions and FX conversion excluded.";
8
9
 
@@ -102,6 +103,10 @@ export function resolvePriceComparison(
102
103
  seriesIds, start: null, end: null,
103
104
  notice: `${PRICE_COMPARISON_BASIS} Comparison unavailable: need two shared dates and a nonzero baseline.`,
104
105
  };
106
+ // A weekly or monthly bar's close is from the last session of its period, which the notice dates it by.
107
+ const period = resolution === "1wk" ? "week" : resolution === "1mo" ? "month" : null;
108
+ const venue = byId.get(seriesIds[0]!)?.timeBasis?.exchange || byId.get(seriesIds[0]!)?.listing?.exchange || undefined;
109
+ const sessionDay = (key: string) => (period ? barLastSession(key, period, venue, Date.now()) : null) ?? key;
105
110
  const sourceBounds = Object.fromEntries(seriesIds.map((id, index) => [id, {
106
111
  start: observations[index]!.get(start)!.date.getTime(),
107
112
  end: observations[index]!.get(end)!.date.getTime(),
@@ -113,7 +118,7 @@ export function resolvePriceComparison(
113
118
  alignment: calendarBars ? "session-date" : "timestamp",
114
119
  sourceBounds,
115
120
  notice: calendarBars
116
- ? `${PRICE_COMPARISON_BASIS} Shared calendar dates: ${start} to ${end}; market session times may differ.`
121
+ ? `${PRICE_COMPARISON_BASIS} Shared calendar dates: ${sessionDay(start)} to ${sessionDay(end)}; market session times may differ.`
117
122
  : `${PRICE_COMPARISON_BASIS} Shared observations: ${displayDate(Number(start))} to ${displayDate(Number(end))}.`,
118
123
  };
119
124
  }
@@ -1,3 +1,4 @@
1
+ import { logFailure } from "../utils/log-failure";
1
2
  import { resolveAssetDisplayKind } from "../market-data/market/format";
2
3
  import { hasValidQuoteObservationTime } from "../market-data/quotes/freshness";
3
4
  import { SnapshotHistoryUnavailableError } from "../market-data/snapshot-provider";
@@ -45,6 +46,7 @@ import {
45
46
  } from "./field-catalog";
46
47
  import {
47
48
  fundamentalSeriesUsesAvailabilityFallback,
49
+ unreportedStatementPeriod,
48
50
  valuationCurrencyWarning,
49
51
  valuationPriceIssues,
50
52
  valuationSeriesUsesLiveQuote,
@@ -76,6 +78,7 @@ import {
76
78
  import {
77
79
  canonicalExchange,
78
80
  isUsListingExchange,
81
+ parsePublicTickerKey,
79
82
  publicTickerKey,
80
83
  resolveExchangeTimeZone,
81
84
  } from "../utils/exchanges";
@@ -86,6 +89,7 @@ import { latestSessionStart, latestTradingSessionOpen, listingTimeZone, priorSes
86
89
  import { futuresGenericCaption, futuresGenericListing, futuresListingPriceBasis } from "../utils/futures-generic";
87
90
  import { classifyInstrumentType, kindFromListingSyntax } from "../tickers/instrument-kind";
88
91
  import { contractPriceUnit } from "./price-units";
92
+ import { INDEX_POINTS_UNIT, isIndexLevel } from "../market-data/market/index-level";
89
93
  import { isDatasetChart, isOhlcSeriesStyle } from "./spec";
90
94
  import { SERIES_COLORS } from "../theme/series-colors";
91
95
  import type {
@@ -1177,6 +1181,7 @@ function baseSecuritySeries(
1177
1181
  const field = getTimeSeriesField(spec.source.fieldId);
1178
1182
  if (!field) return null;
1179
1183
  const points = extractSecuritySeries(financials, spec.source);
1184
+ const unreportedPeriod = points.length === 0 ? unreportedStatementPeriod(financials, spec.source) : null;
1180
1185
  const symbol = instrumentLabel(spec.source);
1181
1186
  const statementCurrency = field.id.startsWith("fundamental.") && field.unit.startsWith("currency")
1182
1187
  ? reportingCurrencySeries(points, financials.financialCurrency) : null;
@@ -1197,7 +1202,10 @@ function baseSecuritySeries(
1197
1202
  // future's continuous symbol or contract in points, not dollars, as its quote does.
1198
1203
  const genericBasis = field.unitGroup === "price" && isMarketFieldId(field.id)
1199
1204
  ? futuresListingPriceBasis(spec.source.instrument.symbol, spec.source.instrument.exchange) : null;
1200
- const genericUnit = genericBasis === "points" ? "points" : genericBasis === "thirty-seconds" ? "32nds" : null;
1205
+ // An index's level is points too, never the currency its members trade in.
1206
+ const indexLevel = field.unitGroup === "price" && isMarketFieldId(field.id)
1207
+ && isIndexLevel(financials.quote?.instrumentType || quoteMetadata?.instrumentType);
1208
+ const genericUnit = genericBasis === "points" || indexLevel ? INDEX_POINTS_UNIT : genericBasis === "thirty-seconds" ? "32nds" : null;
1201
1209
  // A future's price in a currency counts what its contract terms say: heating
1202
1210
  // oil is USD / gallon and crude USD / barrel, which a bare USD does not tell apart.
1203
1211
  const statedUnit = !genericUnit && unitTemplate === "currency" ? contractPriceUnit(contractUnit, currency) : null;
@@ -1241,6 +1249,7 @@ function baseSecuritySeries(
1241
1249
  ? "Volume unit unknown." : statementCurrency?.warning ?? valuationCurrencyWarning(financials, spec.source),
1242
1250
  nativeFrequency: marketField ? marketSeriesFrequency(spec.source, marketResolution)
1243
1251
  : spec.source.period && spec.source.period !== "auto" ? spec.source.period : field.nativeFrequency,
1252
+ ...(unreportedPeriod ? { unreportedPeriod } : {}),
1244
1253
  ...(marketField ? { historyResolution: marketResolution } : {}),
1245
1254
  timestampMode: spec.source.timestampMode,
1246
1255
  dataShape: field.dataShape,
@@ -1375,6 +1384,39 @@ function assignAxes(
1375
1384
  });
1376
1385
  }
1377
1386
 
1387
+ /**
1388
+ * A series drawn in a ticker's price (a moving average of it, a band around
1389
+ * it) takes the units of that ticker's price series when the chart has it, so
1390
+ * the two share an axis and the line sits on the price instead of on a scale
1391
+ * of its own.
1392
+ */
1393
+ function adoptPriceUnits(series: ResolvedSeries[], specs: readonly ChartSeriesSpec[]): ResolvedSeries[] {
1394
+ if (!series.some((entry) => entry.priceOf)) return series;
1395
+ const specsById = new Map(specs.map((spec) => [spec.id, spec]));
1396
+ const prices = series.filter((entry) => {
1397
+ const source = specsById.get(entry.id)?.source;
1398
+ return source?.kind === "security" && getTimeSeriesField(source.fieldId)?.unitGroup === "price"
1399
+ && entry.transform === "raw";
1400
+ });
1401
+ if (prices.length === 0) return series;
1402
+ return series.map((entry) => {
1403
+ if (!entry.priceOf) return entry;
1404
+ const wanted = parsePublicTickerKey(entry.priceOf.toUpperCase());
1405
+ const key = publicTickerKey(wanted.symbol, wanted.exchange);
1406
+ const named = (price: ResolvedSeries) => {
1407
+ const source = specsById.get(price.id)?.source;
1408
+ if (source?.kind !== "security") return false;
1409
+ return publicTickerKey(source.instrument.symbol, source.instrument.exchange) === key
1410
+ || (!wanted.exchange && source.instrument.symbol.toUpperCase() === wanted.symbol);
1411
+ };
1412
+ const price = prices.find((candidate) => named(candidate) && candidate.panelId === entry.panelId)
1413
+ ?? prices.find(named);
1414
+ return price && entry.transform === "raw"
1415
+ ? { ...entry, unit: price.unit, unitGroup: price.unitGroup }
1416
+ : entry;
1417
+ });
1418
+ }
1419
+
1378
1420
  function prepareBaseSeriesForStudies(
1379
1421
  series: ResolvedSeries,
1380
1422
  bounds: DateBounds,
@@ -1612,7 +1654,11 @@ async function resolveChartSpecPass(
1612
1654
  if (statementHistory && (!value.statementHistory || value.statementHistory.status === "retryable-failure")) cache.financialsByInstrument.delete(key);
1613
1655
  return value;
1614
1656
  })
1615
- .catch(() => { cache.financialsByInstrument.delete(key); return null; });
1657
+ .catch((error) => {
1658
+ logFailure("time-series-resolve", "Loading chart financials failed")(error);
1659
+ cache.financialsByInstrument.delete(key);
1660
+ return null;
1661
+ });
1616
1662
  cache.financialsByInstrument.set(key, pending);
1617
1663
  cache.revision += 1;
1618
1664
  }
@@ -1628,7 +1674,11 @@ async function resolveChartSpecPass(
1628
1674
  : provider.getQuote(source.instrument.symbol, source.instrument.exchange ?? "", requestContext(source)).then(quoteMetadataFromQuote))
1629
1675
  .then((metadata) => metadata && quoteMetadataMatchesTarget(metadata, source.instrument.symbol, source.instrument.exchange) ? metadata : null)
1630
1676
  .then((metadata) => { if (!metadata) cache.quoteMetadataByInstrument.delete(key); return metadata; })
1631
- .catch(() => { cache.quoteMetadataByInstrument.delete(key); return null; });
1677
+ .catch((error) => {
1678
+ logFailure("time-series-resolve", "Loading chart quote metadata failed")(error);
1679
+ cache.quoteMetadataByInstrument.delete(key);
1680
+ return null;
1681
+ });
1632
1682
  cache.quoteMetadataByInstrument.set(key, pending);
1633
1683
  cache.revision += 1;
1634
1684
  }
@@ -1671,7 +1721,7 @@ async function resolveChartSpecPass(
1671
1721
  // preset in charge, the same as a source without the capability.
1672
1722
  pending = Promise.resolve(result)
1673
1723
  .then((value) => normalizeChartResolutionSupport(value))
1674
- .catch(() => [] as ChartResolutionSupport[]);
1724
+ .catch(logFailure("time-series-resolve", "Could not load chart resolution support", [] as ChartResolutionSupport[]));
1675
1725
  const settledPending = pending;
1676
1726
  settledPending.then((settled) => {
1677
1727
  if (cache.resolutionSupportByInstrument.get(key) !== settledPending) return;
@@ -1976,7 +2026,7 @@ async function resolveChartSpecPass(
1976
2026
  const key = symbol.trim().toUpperCase();
1977
2027
  let pending = cache.futuresPriceUnits.get(key);
1978
2028
  if (!pending) {
1979
- pending = sources.loadFuturesPriceUnit(key).catch(() => null).then((unit) => {
2029
+ pending = sources.loadFuturesPriceUnit(key).catch(logFailure("time-series-resolve", "Could not load futures price unit", null)).then((unit) => {
1980
2030
  // Terms that did not say are asked again on a later pass, when the source allows.
1981
2031
  if (unit === null) cache.futuresPriceUnits.delete(key);
1982
2032
  else cache.revision += 1;
@@ -2250,7 +2300,7 @@ async function resolveChartSpecPass(
2250
2300
  errors.push(...studyResult.errors);
2251
2301
  }
2252
2302
 
2253
- const bufferedSeries = assignAxes(resolved, [...spec.series, ...spec.studies], warnings)
2303
+ const bufferedSeries = assignAxes(adoptPriceUnits(resolved, spec.series), [...spec.series, ...spec.studies], warnings)
2254
2304
  .map((entry) => clipPriceComparison(entry, priceComparison));
2255
2305
  resolved = bufferedSeries.map((entry) => {
2256
2306
  const entryBounds = presentationBounds(entry, spec.studies, priceComparison, bounds);
@@ -2297,8 +2347,10 @@ async function resolveChartSpecPass(
2297
2347
  ];
2298
2348
  for (const entry of resolved) {
2299
2349
  if (entry.warning) warnings.push(`${entry.label}: ${entry.warning}`);
2300
- // A currency mismatch already explains an empty valuation series.
2301
- if (entry.points.length === 0 && !entry.warning?.startsWith(VALUATION_CURRENCY_WARNING_PREFIX)) {
2350
+ if (entry.points.length === 0 && entry.unreportedPeriod) {
2351
+ warnings.push(`${entry.label}: no ${entry.unreportedPeriod} figures are reported; annual figures are available.`);
2352
+ } else if (entry.points.length === 0 && !entry.warning?.startsWith(VALUATION_CURRENCY_WARNING_PREFIX)) {
2353
+ // A currency mismatch already explains an empty valuation series.
2302
2354
  warnings.push(`${entry.label}: no observations in the selected date range.`);
2303
2355
  }
2304
2356
  }
@@ -2385,7 +2437,10 @@ export function reconcileChartTail(
2385
2437
  }
2386
2438
  const run: Promise<boolean> = Promise.all([...cache.liveTails].map(async ([key, tail]) => {
2387
2439
  const pending = cache.priceHistoryByRequest.get(key);
2388
- const loaded = pending ? await pending.catch(() => null) : null;
2440
+ const loaded = pending ? await pending.catch(() => {
2441
+ // Intentional ignore: resolveChartSpecPass already includes this history failure in the series errors.
2442
+ return null;
2443
+ }) : null;
2389
2444
  if (!pending || !loaded || loaded.resolution !== tail.resolution) return false;
2390
2445
  const accumulated = cache.accumulatedPriceHistory.get(tail.accumulationKey);
2391
2446
  const latest = latestObservationTime(accumulated?.points ?? loaded.points);
@@ -2406,7 +2461,7 @@ export function reconcileChartTail(
2406
2461
  if (!request) {
2407
2462
  const fetched = fetchHistoryResult(provider, symbol, exchange ?? "",
2408
2463
  { kind: "detail", start: new Date(start), end: new Date(end), interval: tail.resolution }, context)
2409
- .catch(() => null)
2464
+ .catch(logFailure("time-series-resolve", "Could not reconcile chart history", null))
2410
2465
  .finally(() => {
2411
2466
  if (shared.get(requestKey) === fetched) shared.delete(requestKey);
2412
2467
  });
@@ -36,7 +36,8 @@ import { recordOrNull } from "../utils/guards";
36
36
  const RANGE_SET = new Set<TimeRange>(TIME_RANGES);
37
37
  const RESOLUTIONS = new Set<ChartResolution>(CHART_RESOLUTIONS);
38
38
  const PERIODS = new Set<SeriesPeriod>(["auto", "daily", "weekly", "monthly", "quarterly", "annual", "ttm"]);
39
- const STYLES = new Set<SeriesStyle>(["line", "area", "step", "columns", "points", "candles", "ohlc", "hlc"]);
39
+ // `band` only stays on a capability series: a field's styles and an economic series' leave it out.
40
+ const STYLES = new Set<SeriesStyle>(["line", "area", "step", "columns", "points", "candles", "ohlc", "hlc", "band"]);
40
41
  const ECONOMIC_STYLES = new Set<SeriesStyle>(["line", "area", "step", "columns", "points"]);
41
42
  const TRANSFORMS = new Set<SeriesTransform>(["raw", "percent", "index100", "yoy", "qoq", "log"]);
42
43
  const AXES = new Set<SeriesAxis>(["auto", "left", "right"]);
@@ -377,9 +377,9 @@ function resolveMacd(spec: ChartStudySpec, input: ResolvedSeries, color: string)
377
377
  }
378
378
 
379
379
  function resolveVolume(spec: ChartStudySpec, input: ResolvedSeries, color: string, nameInput: boolean): ResolvedSeries[] {
380
- // Spot FX and similar quotes report 0 for every bar: there is no volume to
381
- // plot, so the study adds no panel rather than an empty one.
382
- if (input.points.some((point) => point.volume === 0) && input.points.every((point) => !point.volume)) return [];
380
+ // No bar has volume to plot (spot FX quotes 0 for every bar; a coin's window
381
+ // can miss every bar's), so the study adds no panel rather than an empty one.
382
+ if (input.points.length > 0 && !input.points.some((point) => isFiniteNumber(point.volume) && point.volume !== 0)) return [];
383
383
  const points = [...input.points]
384
384
  .sort((left, right) => left.date.getTime() - right.date.getTime())
385
385
  .flatMap((point) => isFiniteNumber(point.volume)
@@ -122,6 +122,12 @@ export interface TimeSeriesPoint {
122
122
  close?: number | null;
123
123
  volume?: number | null;
124
124
  periodLabel?: string;
125
+ /**
126
+ * A financial statement period as the FA columns name it: `FY2025`, `Q3 FY26`,
127
+ * `TTM Q3 FY26`, or the period's end date off the issuer's fiscal calendar.
128
+ * The legend prints it beside the value.
129
+ */
130
+ fiscalPeriod?: string;
125
131
  provenance?: {
126
132
  priceHistoryIntegrity?: import("../utils/price-history-integrity").PriceHistoryIntegrity;
127
133
  valuationPriceIssues?: import("./valuation-price").ValuationPriceIssue[];
@@ -169,6 +175,11 @@ export interface ResolvedSeries {
169
175
  /** Volume basis established by the source instrument; omitted when unspecified. */
170
176
  volumeUnit?: "shares" | "contracts";
171
177
  nativeFrequency: SeriesPeriod;
178
+ /**
179
+ * Set on a series with nothing to draw because its company reports no
180
+ * figures of the period asked for, while its annual ones exist.
181
+ */
182
+ unreportedPeriod?: "quarterly";
172
183
  /** Acquired market-history cadence; null is explicitly unknown, undefined is legacy or nonmarket. */
173
184
  historyResolution?: ManualChartResolution | null;
174
185
  /**
@@ -203,11 +214,22 @@ export interface ResolvedSeries {
203
214
  points: TimeSeriesPoint[];
204
215
  /** Who a report of a loaded series cites, when its loader names the dataset and publisher. */
205
216
  attribution?: SeriesAttribution;
217
+ /**
218
+ * The ticker whose price the values are in, such as a moving average of it:
219
+ * the chart draws the series on that price's axis when it shows the price.
220
+ */
221
+ priceOf?: string;
206
222
  /** Rejected valuation price inputs, retained independently of usable observations. */
207
223
  valuationPriceIssues?: import("./valuation-price").ValuationPriceIssue[];
208
224
  warning?: string;
209
225
  /** Listed in the legend so it can be restored, but not drawn. */
210
226
  hidden?: boolean;
227
+ /**
228
+ * A layer of a stacked area (`stackedSeries`): a band from the layers below
229
+ * to its own top, each point's `value` the top and `rawValue` the layer's own
230
+ * amount, which the legend shows.
231
+ */
232
+ stacked?: boolean;
211
233
  /** Columns below zero take this colour instead, so a change reads by its sign. */
212
234
  negativeColor?: string;
213
235
  /**
@@ -1,3 +1,4 @@
1
+ import { logFailure } from "../utils/log-failure";
1
2
  import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
2
3
  import {
3
4
  ChartResolveCache,
@@ -401,7 +402,7 @@ export function useChartResolution(
401
402
  if (disposed || quoteActivityAt <= lastReconcileAt) return;
402
403
  lastReconcileAt = Date.now();
403
404
  const changed = await reconcileChartTail(latestRequestRef.current.sources, resolveCacheRef.current)
404
- .catch(() => false);
405
+ .catch(logFailure("time-series-use-chart-resolution", "Could not reconcile live chart", false));
405
406
  if (disposed) return;
406
407
  if (!changed) {
407
408
  // A window that settles nothing, or that this history cannot take, is not asked for again at once.
@@ -299,6 +299,12 @@ export interface AppConfig {
299
299
  recentTickers: string[];
300
300
  /** Pane templates recently run from the command bar, newest first. */
301
301
  recentCommands: RecentCommand[];
302
+ /**
303
+ * How many times the empty command bar has opened, counted to one past its
304
+ * introduction (see `command-bar-intro.ts`). A new config starts at 0; one
305
+ * from an earlier build has none and reads as past it. Kept on this machine only.
306
+ */
307
+ commandBarOpens?: number;
302
308
  language?: LanguagePreference;
303
309
  onboardingComplete?: boolean;
304
310
  /** App version at the last launch, used to show release notes after an update. */
@@ -995,6 +1001,7 @@ export function createDefaultConfig(dataDir: string): AppConfig {
995
1001
  fontSize: 12,
996
1002
  recentTickers: [],
997
1003
  recentCommands: [],
1004
+ commandBarOpens: 0,
998
1005
  };
999
1006
  }
1000
1007
 
@@ -45,6 +45,13 @@ export interface SecFilingItem {
45
45
  companyName?: string;
46
46
  filingUrl: string;
47
47
  primaryDocumentUrl?: string;
48
+ /**
49
+ * The SEC file number EDGAR lists the filing under for this company, empty
50
+ * when it lists none: a 13D/13G about the company carries its 005- number,
51
+ * one it filed as a holder of another company none. Absent when the source
52
+ * does not say (an older server).
53
+ */
54
+ fileNumber?: string;
48
55
  }
49
56
 
50
57
  export interface SecFilingDocument {
@@ -235,6 +242,19 @@ export interface AssetDataProvider {
235
242
  * META), or what its holder was called before. Null when none is on record.
236
243
  */
237
244
  getTickerChanges?(symbol: string, options?: { signal?: AbortSignal }): Promise<TickerChanges | null>;
245
+ /**
246
+ * `getTickerChanges` for several symbols in a few requests, by symbol as
247
+ * asked: null for one with no change on record. A symbol the source could not
248
+ * answer for is left out; null when the source cannot answer a batch at all.
249
+ */
250
+ getTickerChangesBatch?(symbols: string[], options?: { signal?: AbortSignal }): Promise<Map<string, TickerChanges | null> | null>;
251
+ /**
252
+ * Several searches in a few requests, each answered with the rows `search`
253
+ * gives it from this source (up to `limit`), by query as asked. A query the
254
+ * source could not search is left out; null when it cannot search a batch at
255
+ * all, or when another source (a connected broker) adds rows of its own.
256
+ */
257
+ searchBatch?(queries: string[], options?: { limit?: number; signal?: AbortSignal }): Promise<Map<string, InstrumentSearchResult[]> | null>;
238
258
  getEarningsCalendar?(symbols: string[], context?: MarketDataRequestContext): Promise<EarningsEvent[]>;
239
259
  getSecFilingDocuments?(filing: SecFilingItem): Promise<SecFilingDocument[]>;
240
260
  getSecFilingContent?(filing: SecFilingItem): Promise<string | null>;
@@ -26,6 +26,12 @@ export interface HeadlessPaneArgumentDef {
26
26
  minimum?: number;
27
27
  /** Maximum item count for ticker and symbol list arguments. */
28
28
  maximum?: number;
29
+ /**
30
+ * Arguments as typed after the function (`GAS`, `EUA`), which the catalog
31
+ * shows as examples: for an argument that takes forms its placeholder does
32
+ * not name.
33
+ */
34
+ examples?: readonly string[];
29
35
  }
30
36
 
31
37
  export interface HeadlessPaneOptionValue {
@@ -33,6 +39,7 @@ export interface HeadlessPaneOptionValue {
33
39
  aliases?: string[];
34
40
  }
35
41
 
42
+
36
43
  /**
37
44
  * Declarative option schema shared by headless panes and the pane function CLI.
38
45
  * `settingKey` and `pluginState` keep existing screenshot state wiring compatible.
@@ -51,10 +58,21 @@ export interface HeadlessPaneOptionDef {
51
58
  pluginId: string;
52
59
  key?: string;
53
60
  };
54
- /** The value's name in the catalog's flag, `--expiration <YYYY-MM-DD|unix>`; the type when absent. */
61
+ /**
62
+ * Set when the pane does not draw the option and only the report reads it
63
+ * (`--limit`'s rows of text): `shot` refuses it rather than capture the
64
+ * pane without it; `reportOnly` says what the report does with it, for
65
+ * the refusal (`sets how many rows the report lists`). Left out, the pane
66
+ * draws it, through `settingKey`, `pluginState`, a setting of the option's
67
+ * own key, or `shotState`.
68
+ */
69
+ shot?: { reportOnly: string };
70
+ /** The value's name in the catalog's flag, `--expiration <date|unix>`; the type when absent. */
55
71
  placeholder?: string;
56
72
  /** The option in use as typed after the function, such as `--expiration 2028-01-21`; the catalog shows it as an example. */
57
73
  example?: string;
74
+ /** The example runs without the function's optional argument, as an option that works only then does (`fn INS --side sell`). */
75
+ exampleWithoutArgument?: boolean;
58
76
  /**
59
77
  * Checks a typed value and returns it as the pane reads it, in place of the
60
78
  * type's own check; throws an Error that names what is wrong.
@@ -96,6 +114,14 @@ export interface HeadlessPaneContext {
96
114
  resolveWatchlist?: (id: string) => Promise<import("./ticker").TickerRecord[] | null>;
97
115
  /** Resolve locally remembered exchange identities without coupling plugins to storage. */
98
116
  resolveInstrument?: (symbol: string) => Promise<{ symbol: string; exchange?: string }>;
117
+ /**
118
+ * Read a bare symbol as `quote` reads it: the listing its quote is for and
119
+ * that listing's company, or null when nothing better than the symbol is
120
+ * known. A code several companies list (BDI) throws asking which, with
121
+ * `quote`'s message; `argumentWith(key)` is the function's argument naming
122
+ * that listing instead (`BDI:TSX`), for the retry each listing offers.
123
+ */
124
+ resolveListing?: (symbol: string, argumentWith: (key: string) => string) => Promise<{ symbol: string; exchange?: string; name?: string } | null>;
99
125
  }
100
126
 
101
127
  export type HeadlessPaneRow = Record<string, unknown>;
@@ -254,6 +280,13 @@ export interface HeadlessPaneFreshness {
254
280
  * never a market's session. Rows that are quotes keep the market line.
255
281
  */
256
282
  dataset?: boolean;
283
+ /**
284
+ * The rows are a listing's price bars, which its quote carries on (`G AAPL`,
285
+ * `HP`). A screenshot dates them as it dates a quote board, by the quotes it
286
+ * shows with their delay and market. Any other report that declares a
287
+ * `status` ends its screenshot as it ends `fn`, whatever quotes the page loaded.
288
+ */
289
+ prices?: boolean;
257
290
  /**
258
291
  * What a dataset's newest observation is, when its every line names it:
259
292
  * `last trade` makes the `fn` footer, the pane footer and a screenshot read
@@ -282,6 +315,11 @@ export interface HeadlessPaneFreshness {
282
315
  * listing's Friday close and another's later print.
283
316
  */
284
317
  citeOldest?: boolean;
318
+ /**
319
+ * What the newest observation is, said before its time so the time is not read as when the report was read:
320
+ * `newest story` dates a news list `newest story Tue 29 Sep 2026 20:17 UTC`.
321
+ */
322
+ asOfLabel?: string;
285
323
  /** What the figures are, said after the status: `funding = current estimate, pays 08:00 UTC`. */
286
324
  note?: string;
287
325
  /**
@@ -318,6 +356,17 @@ interface HeadlessPaneResultBase {
318
356
  freshness?: HeadlessPaneFreshness;
319
357
  }
320
358
 
359
+ /** A table only `--csv` and `--ndjson` write, after the report's own rows. */
360
+ export interface HeadlessExportTable {
361
+ title: string;
362
+ columns: HeadlessPaneColumn[];
363
+ rows: HeadlessPaneRow[];
364
+ /** The unit every figure is in, which each exported row names in `currency_or_unit`. */
365
+ unit?: string;
366
+ /** The interval the rows are at (`1d`), which each exported row names in `interval`. */
367
+ interval?: string;
368
+ }
369
+
321
370
  export interface HeadlessRowsResult extends HeadlessPaneResultBase {
322
371
  columns?: HeadlessPaneColumn[];
323
372
  /**
@@ -327,8 +376,27 @@ export interface HeadlessRowsResult extends HeadlessPaneResultBase {
327
376
  */
328
377
  textColumns?: HeadlessPaneColumn[];
329
378
  rows: HeadlessPaneRow[];
379
+ /** The rows `textColumns` read, when the text report adds lines that are no record (the position under its lots); `rows` when absent. CSV, NDJSON and JSON keep `rows`. */
380
+ textRows?: HeadlessPaneRow[];
330
381
  /** What the report says when `rows` is empty, in place of "No data.": why there are none. */
331
382
  empty?: string;
383
+ /**
384
+ * The row fields naming each row's own unit, symbol and observation date
385
+ * (an ISO date or instant), for rows of several series dated apart: each
386
+ * exported row names them in `currency_or_unit`, `symbol_or_series` and
387
+ * `as_of`, as a bundle section's `rowUnitKey`, `rowSymbolKey` and `rowAsOfKey` do.
388
+ */
389
+ rowUnitKey?: string;
390
+ rowSymbolKey?: string;
391
+ rowAsOfKey?: string;
392
+ /** The interval every row is at (`daily`), which each exported row names in `interval`. */
393
+ interval?: string;
394
+ /**
395
+ * Tables `--csv` and `--ndjson` write after the rows, each in its own
396
+ * section, such as the dated history the rows sum up. The text report and
397
+ * JSON leave them out.
398
+ */
399
+ exportTables?: HeadlessExportTable[];
332
400
  }
333
401
 
334
402
  export type HeadlessBundleSection =
@@ -352,6 +420,35 @@ export type HeadlessBundleSection =
352
420
  * which every exported row names in `currency_or_unit`.
353
421
  */
354
422
  unit?: string;
423
+ /**
424
+ * The row field naming each row's own unit, for a table of metrics whose
425
+ * rows differ (`%`, a ratio, a count): each exported row names it in
426
+ * `currency_or_unit` in place of `unit`, blank when the field is empty.
427
+ */
428
+ rowUnitKey?: string;
429
+ /**
430
+ * The row field naming the symbol each row is of, for a table of several
431
+ * (a ranking): each exported row names it in `symbol_or_series`.
432
+ */
433
+ rowSymbolKey?: string;
434
+ /**
435
+ * The row field holding when each row's figures were observed (an ISO
436
+ * date or instant), for rows dated apart: each exported row names it in
437
+ * `as_of`, blank when the field is empty.
438
+ */
439
+ rowAsOfKey?: string;
440
+ /** The bar interval the rows are of (`1d`), which every exported row names in `interval`. */
441
+ interval?: string;
442
+ /** The symbol every row is of, where the report's own is not (a section per name): each exported row names it in `symbol_or_series`. */
443
+ symbol?: string;
444
+ /** When every row was observed (an ISO date or instant), where it is not the report's newest: each exported row names it in `as_of`. */
445
+ asOf?: string;
446
+ /**
447
+ * The free view holds this table back for Gloom Pro. Left empty, the text
448
+ * report leaves it out and says once, on its Pro line, what Pro adds, in
449
+ * place of a lock under each table; JSON keeps the section with `locked`.
450
+ */
451
+ locked?: boolean;
355
452
  entries?: never;
356
453
  textEntries?: never;
357
454
  }
@@ -365,15 +462,27 @@ export type HeadlessBundleSection =
365
462
  * JSON keep `entries`.
366
463
  */
367
464
  textEntries?: HeadlessPaneEntry[];
465
+ /** The symbol the figures are of, where the report's own is not: each exported line names it in `symbol_or_series`. */
466
+ symbol?: string;
467
+ /** 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`. */
468
+ asOf?: string;
368
469
  columns?: never;
369
470
  rows?: never;
370
471
  textColumns?: never;
371
472
  textRows?: never;
372
473
  unit?: never;
474
+ rowUnitKey?: never;
475
+ interval?: never;
476
+ locked?: never;
373
477
  };
374
478
 
375
479
  export interface HeadlessBundleResult extends HeadlessPaneResultBase {
376
480
  sections: HeadlessBundleSection[];
481
+ /**
482
+ * What the report says once when no section has a row, in place of each
483
+ * section's own `empty`: one reason covers them all (a ticker no source maps).
484
+ */
485
+ empty?: string;
377
486
  }
378
487
 
379
488
  export interface HeadlessSeriesPoint extends HeadlessPaneRow {
@@ -389,6 +498,8 @@ export interface HeadlessSeriesPoint extends HeadlessPaneRow {
389
498
  export interface HeadlessSeries {
390
499
  id: string;
391
500
  label: string;
501
+ /** The company or security a security's series is of (Apple Inc.), from its quote. */
502
+ name?: string;
392
503
  /** Explicit unit of the point values; report formatting does not rescale them. */
393
504
  unit?: string;
394
505
  /** The symbol or series ID the series was asked for as (`USDZAR=X`, `DEXSFUS`), which exports name each row by. */
@@ -462,8 +573,30 @@ export interface HeadlessPaneDefinition<Shape extends HeadlessPaneShape = Headle
462
573
  args: HeadlessPaneLoadArgs,
463
574
  ctx: HeadlessPaneContext,
464
575
  ): Promise<HeadlessArgumentExpansion | null>;
576
+ /**
577
+ * How `shot` opens the pane on a request, past the settings its options
578
+ * name: 13F opens the fund a name resolved to, on the tab its view names.
579
+ * `load` is the report's own load, for state that depends on what it found.
580
+ * `given` names the options typed, by key: `args` carries every option's
581
+ * default too, which the pane may open on differently (M&A of one company
582
+ * opens on every status, its report on pending), so state an option sets
583
+ * is written only when it was asked for.
584
+ * Throws when the pane cannot draw the request, which `shot` reports
585
+ * instead of capturing another view.
586
+ */
587
+ shotState?(
588
+ args: HeadlessPaneLoadArgs,
589
+ load: () => Promise<HeadlessPaneResultByShape[Shape]>,
590
+ given: ReadonlySet<string>,
591
+ ): HeadlessShotState | Promise<HeadlessShotState>;
465
592
  /** What is true of every load: its source, and whether it is a feed. */
466
593
  freshness?: HeadlessPaneFreshness;
594
+ /**
595
+ * A `--csv` export also closes with the report's warnings, as notes, for a
596
+ * report whose warnings say which rows it left out (a backtest's dropped
597
+ * sessions), so a saved file keeps what stderr said.
598
+ */
599
+ exportWarnings?: boolean;
467
600
  columns?: HeadlessPaneColumn[];
468
601
  /**
469
602
  * The report title. A report passes the loaded result, so a title can name
@@ -487,6 +620,14 @@ export interface HeadlessPaneDefinition<Shape extends HeadlessPaneShape = Headle
487
620
 
488
621
  export type HeadlessPaneResult = HeadlessPaneResultByShape[HeadlessPaneShape];
489
622
 
623
+ /** What `shot` merges into the captured pane for a request (`shotState`). */
624
+ export interface HeadlessShotState {
625
+ /** Merged into the pane's settings. */
626
+ settings?: Record<string, unknown>;
627
+ /** Merged into the pane's plugin state, by plugin id. */
628
+ pluginState?: Record<string, Record<string, unknown>>;
629
+ }
630
+
490
631
  /** What a function runs with once it has widened its argument (`expandArgument`). */
491
632
  export interface HeadlessArgumentExpansion {
492
633
  /** The argument as it would be typed: `DUOL, COUR, CHGG`. */
@@ -71,4 +71,10 @@ export interface InstrumentSearchResult {
71
71
  * Albemarle, which the lithium funds hold), sent by newer cloud servers on a
72
72
  * row a theme query added. Matched like the name, ranked after name matches. */
73
73
  searchKeywords?: string[];
74
+ /** The company that merged into this one whose old name the query is
75
+ * (Golden Ocean Group Ltd, GOGL until 2025-08-20, on CMB.Tech's CMBT), sent
76
+ * by newer cloud servers on a row such a query added. `searchAliases` then
77
+ * carries that name. A leftover listing of the merged company (GOGLC on
78
+ * BYMA) is linked to it by search, naming the `successor`. */
79
+ formerIssuer?: { symbol: string; name: string; until: string; successor?: { symbol: string; name: string | null } };
74
80
  }