gloomberb 0.18.3 → 0.18.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (886) hide show
  1. package/README.md +8 -8
  2. package/README.zh-CN.md +11 -11
  3. package/bin/{gloomberb → gloom} +3 -1
  4. package/package.json +6 -2
  5. package/src/account/checkout-handoff.tsx +225 -0
  6. package/src/account/device-signin-dialog.tsx +2 -2
  7. package/src/account/device-signin.ts +2 -2
  8. package/src/account/upgrade-dialog.tsx +1 -1
  9. package/src/api-client/askg.ts +2 -2
  10. package/src/api-client/auth.ts +2 -2
  11. package/src/api-client/central-bank-rates.ts +6 -0
  12. package/src/api-client/collections.ts +5 -1
  13. package/src/api-client/cot.ts +2 -0
  14. package/src/api-client/crypto-etf-flows.ts +37 -0
  15. package/src/api-client/crypto-markets.ts +60 -0
  16. package/src/api-client/data.ts +84 -5
  17. package/src/api-client/doe.ts +15 -0
  18. package/src/api-client/equity-screener.ts +28 -0
  19. package/src/api-client/exchange-announcements.ts +38 -0
  20. package/src/api-client/fund-facts.ts +39 -0
  21. package/src/api-client/futures-curve.ts +9 -1
  22. package/src/api-client/hiring.ts +301 -0
  23. package/src/api-client/index.ts +22 -5
  24. package/src/api-client/market-discovery.ts +14 -0
  25. package/src/api-client/members.ts +6 -0
  26. package/src/api-client/mna.ts +6 -0
  27. package/src/api-client/paths.ts +18 -1
  28. package/src/api-client/request.ts +21 -4
  29. package/src/api-client/short-side-publications.ts +37 -0
  30. package/src/api-client/socket.ts +64 -4
  31. package/src/api-client/swap-curve.ts +35 -0
  32. package/src/api-client/themes.ts +7 -1
  33. package/src/api-client/types.ts +90 -2
  34. package/src/app/pane-runtime/plugin-bindings.ts +9 -2
  35. package/src/app/runtime/desktop-deeplink.ts +5 -5
  36. package/src/app/runtime/plugin-bindings.ts +2 -2
  37. package/src/app/runtime/startup.ts +13 -0
  38. package/src/app/star-prompt/status-line.tsx +2 -2
  39. package/src/architecture/core-builtin-allowlist.json +5 -2
  40. package/src/architecture/ui-literals-allowlist.json +3 -3
  41. package/src/architecture/ui-tokens-allowlist.json +1 -1
  42. package/src/brokers/broker-portfolio-sync.ts +37 -0
  43. package/src/brokers/directory.ts +11 -0
  44. package/src/brokers/logos.ts +3 -1
  45. package/src/brokers/signed-in/adapter.ts +304 -26
  46. package/src/brokers/signed-in/client.ts +14 -2
  47. package/src/brokers/signed-in/connect.ts +10 -2
  48. package/src/brokers/sync-broker-instance.ts +9 -1
  49. package/src/capabilities/chart-series.ts +22 -6
  50. package/src/cli/bank-section.ts +1 -1
  51. package/src/cli/base-converter.ts +23 -14
  52. package/src/cli/central-bank-events.ts +1 -1
  53. package/src/cli/command-options.ts +59 -4
  54. package/src/cli/commands/api.ts +9 -6
  55. package/src/cli/commands/broker.ts +2 -2
  56. package/src/cli/commands/command-utils.ts +2 -2
  57. package/src/cli/commands/crypto-hints.ts +7 -20
  58. package/src/cli/commands/fred-series.ts +4 -2
  59. package/src/cli/commands/keybindings.ts +2 -2
  60. package/src/cli/commands/market.ts +1117 -264
  61. package/src/cli/commands/news-hints.ts +2 -2
  62. package/src/cli/commands/news-search.ts +59 -6
  63. package/src/cli/commands/options-leaps.ts +41 -26
  64. package/src/cli/commands/overview.ts +121 -48
  65. package/src/cli/commands/plugins.ts +9 -9
  66. package/src/cli/commands/remote.ts +13 -10
  67. package/src/cli/commands/search.ts +64 -44
  68. package/src/cli/commands/system.ts +27 -19
  69. package/src/cli/commands/themes.ts +1 -1
  70. package/src/cli/commands/ticker.ts +192 -47
  71. package/src/cli/context.ts +3 -2
  72. package/src/cli/desktop-pane-shot-view.ts +2 -2
  73. package/src/cli/desktop-pane-shot.ts +1 -1
  74. package/src/cli/earnings-calendar.ts +4 -4
  75. package/src/cli/entry.ts +18 -1
  76. package/src/cli/errors.ts +20 -2
  77. package/src/cli/exit-codes.ts +1 -1
  78. package/src/cli/export-source.ts +10 -4
  79. package/src/cli/freshness.ts +2 -8
  80. package/src/cli/fx-forward.ts +130 -0
  81. package/src/cli/fx-pair.ts +10 -9
  82. package/src/cli/glossary.ts +64 -20
  83. package/src/cli/help.ts +19 -13
  84. package/src/cli/history-export.ts +126 -0
  85. package/src/cli/history-rows.ts +196 -43
  86. package/src/cli/index-roots.ts +5 -45
  87. package/src/cli/index.ts +24 -18
  88. package/src/cli/known-gaps.ts +118 -25
  89. package/src/cli/listing-arg.ts +300 -41
  90. package/src/cli/name-entries.ts +30 -18
  91. package/src/cli/native-smoke.ts +2 -0
  92. package/src/cli/not-a-ticker.ts +19 -9
  93. package/src/cli/opentui-libc.ts +5 -0
  94. package/src/cli/options.ts +12 -0
  95. package/src/cli/pane-functions/capabilities.ts +75 -20
  96. package/src/cli/pane-functions/catalog.ts +24 -23
  97. package/src/cli/pane-functions/discovery.ts +1 -1
  98. package/src/cli/pane-functions/dom.ts +10 -7
  99. package/src/cli/pane-functions/financial-ratio-shot.ts +2 -2
  100. package/src/cli/pane-functions/freshness.ts +174 -23
  101. package/src/cli/pane-functions/function-help.ts +66 -27
  102. package/src/cli/pane-functions/headless.ts +24 -11
  103. package/src/cli/pane-functions/index.ts +18 -16
  104. package/src/cli/pane-functions/options.ts +22 -2
  105. package/src/cli/pane-functions/report-notices.ts +12 -4
  106. package/src/cli/pane-functions/report.ts +5 -5
  107. package/src/cli/pane-functions/resolver.ts +47 -10
  108. package/src/cli/pane-functions/screenshot-assessment.ts +322 -0
  109. package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
  110. package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
  111. package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
  112. package/src/cli/pane-functions/screenshot-evidence.ts +1 -1
  113. package/src/cli/pane-functions/screenshot-payload.ts +453 -0
  114. package/src/cli/pane-functions/screenshot-render.ts +316 -0
  115. package/src/cli/pane-functions/screenshot-types.ts +162 -0
  116. package/src/cli/pane-functions/shot-options.ts +8 -3
  117. package/src/cli/peso-dollar-rates.ts +79 -0
  118. package/src/cli/quote-answer.ts +38 -3
  119. package/src/cli/report-tables.ts +61 -16
  120. package/src/cli/restore-plugins.ts +29 -14
  121. package/src/cli/result.ts +111 -22
  122. package/src/cli/series-search.ts +5 -5
  123. package/src/cli/statement-filings.ts +19 -0
  124. package/src/cli/suffixed-listing-rows.ts +49 -0
  125. package/src/cli/symbol-args.ts +50 -15
  126. package/src/cli/symbol-cells.ts +120 -0
  127. package/src/cli/symbol-list.ts +198 -68
  128. package/src/cli/symbol-rows.ts +131 -25
  129. package/src/cli/ticker-resolution.ts +108 -11
  130. package/src/cli/treasury-yields.ts +5 -5
  131. package/src/cli/types.ts +2 -0
  132. package/src/cli/uncovered-instrument.ts +3 -3
  133. package/src/cli/unknown-command.ts +6 -6
  134. package/src/components/chart/composite/chart-layout.ts +131 -0
  135. package/src/components/chart/composite/composite-chart.tsx +373 -16
  136. package/src/components/chart/composite/interactions.ts +7 -2
  137. package/src/components/chart/composite/legend.tsx +75 -3
  138. package/src/components/chart/composite/levels.ts +5 -0
  139. package/src/components/chart/composite/panel-gestures.ts +41 -0
  140. package/src/components/chart/composite/panel-labels.ts +2 -1
  141. package/src/components/chart/composite/panel-surface.tsx +305 -11
  142. package/src/components/chart/composite/price-axis-labels.tsx +27 -3
  143. package/src/components/chart/composite/rasterizer.ts +44 -19
  144. package/src/components/chart/composite/scene.ts +16 -4
  145. package/src/components/chart/composite/text-renderer.ts +48 -21
  146. package/src/components/chart/composite/toolbar.tsx +52 -5
  147. package/src/components/chart/composite/types.ts +13 -0
  148. package/src/components/chart/composite/use-composite-chart-keyboard.ts +120 -13
  149. package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
  150. package/src/components/chart/composite/use-composite-viewport.ts +12 -3
  151. package/src/components/chart/composite/value-scale.ts +149 -0
  152. package/src/components/chart/composite/volume-profile-paint.ts +6 -3
  153. package/src/components/chart/core/pointer.ts +2 -0
  154. package/src/components/chart-table/index.ts +2 -0
  155. package/src/components/chart-table/read.tsx +74 -0
  156. package/src/components/command-bar/commands/collection-list.ts +41 -19
  157. package/src/components/command-bar/commands/collection.ts +9 -3
  158. package/src/components/command-bar/commands/direct/index.ts +1 -1
  159. package/src/components/command-bar/commands/direct/runtime.ts +3 -2
  160. package/src/components/command-bar/pane-templates/items.ts +59 -6
  161. package/src/components/command-bar/pane-templates/workflow.ts +10 -1
  162. package/src/components/command-bar/routes/root/plugin-install.ts +1 -1
  163. package/src/components/command-bar/routes/root/provider-search.ts +42 -11
  164. package/src/components/command-bar/routes/root/results.ts +18 -4
  165. package/src/components/command-bar/routes/root/runtime.ts +15 -3
  166. package/src/components/command-bar/routes/root/search-providers.ts +25 -2
  167. package/src/components/command-bar/routes/root/selection.ts +6 -1
  168. package/src/components/command-bar/routes/root/shortcut-feedback.ts +4 -1
  169. package/src/components/command-bar/routes/root/shortcuts.ts +30 -3
  170. package/src/components/command-bar/routes/ticker-search/results.ts +73 -4
  171. package/src/components/command-bar/selection-runtime.ts +50 -10
  172. package/src/components/command-bar/surface/index.tsx +24 -2
  173. package/src/components/command-bar/view-model.ts +7 -0
  174. package/src/components/command-bar/workflow/broker.ts +2 -2
  175. package/src/components/command-bar/workflow/collection-actions.ts +46 -7
  176. package/src/components/command-bar/workflow/collection-ticker.ts +32 -4
  177. package/src/components/command-bar/workflow/fields.ts +8 -2
  178. package/src/components/command-bar/workflow/ops.ts +18 -4
  179. package/src/components/command-bar/workflow/portfolio-position.ts +53 -4
  180. package/src/components/command-bar/workflow/submit.ts +3 -2
  181. package/src/components/command-bar/workflow/tickers.ts +5 -1
  182. package/src/components/company-logo.tsx +39 -0
  183. package/src/components/data-table/sections.ts +4 -2
  184. package/src/components/form-modal/confirm.tsx +2 -1
  185. package/src/components/form-modal/request.ts +5 -0
  186. package/src/components/form-modal/routes.ts +4 -1
  187. package/src/components/index.ts +12 -6
  188. package/src/components/layout/header.tsx +7 -6
  189. package/src/components/layout/market-summary.ts +9 -6
  190. package/src/components/layout/pane/capture-status.ts +1 -1
  191. package/src/components/layout/pane/footer/model.ts +11 -5
  192. package/src/components/layout/shell/chrome.ts +19 -6
  193. package/src/components/layout/shell/index.tsx +2 -1
  194. package/src/components/layout/shell/pane/layers.tsx +19 -1
  195. package/src/components/layout/status-bar.tsx +2 -2
  196. package/src/components/market-board/index.tsx +11 -3
  197. package/src/components/onboarding/onboarding-wizard.tsx +1 -0
  198. package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +2 -2
  199. package/src/components/onboarding/wizard-broker-sync.ts +4 -1
  200. package/src/components/pane-settings-dialog/desktop.tsx +20 -7
  201. package/src/components/pane-settings-dialog/tui.tsx +17 -9
  202. package/src/components/pane-settings-dialog/value.ts +8 -1
  203. package/src/components/pane-settings-dialog.tsx +44 -13
  204. package/src/components/sign-in-code-panel.tsx +27 -19
  205. package/src/components/ui/column-grid.tsx +48 -4
  206. package/src/components/ui/country-flag-art.tsx +180 -0
  207. package/src/components/ui/country-flag.tsx +118 -12
  208. package/src/components/ui/data-table/opentui/index.tsx +61 -2
  209. package/src/components/ui/data-table/opentui/model.ts +109 -2
  210. package/src/components/ui/data-table/types.ts +1 -1
  211. package/src/components/ui/display.tsx +5 -1
  212. package/src/components/ui/index.ts +3 -1
  213. package/src/components/ui/logo-mark.tsx +11 -2
  214. package/src/components/ui/query-bar.tsx +1 -1
  215. package/src/components/ui/row-notes.ts +79 -0
  216. package/src/core/state/app/layout.ts +4 -4
  217. package/src/data/cached-query.ts +8 -1
  218. package/src/data/config/chart-settings.ts +3 -3
  219. package/src/data/config/home.ts +10 -2
  220. package/src/data/config/layout.ts +4 -1
  221. package/src/data/config/store/node.ts +4 -0
  222. package/src/data/config/store/normalize.ts +13 -3
  223. package/src/data/config/store/portfolio-as-of-column.ts +2 -2
  224. package/src/data/json-storage.ts +2 -0
  225. package/src/data/saved-copies.ts +84 -0
  226. package/src/docs/snapshot.json +65 -32
  227. package/src/i18n/es.ts +29 -12
  228. package/src/i18n/ja.ts +29 -12
  229. package/src/i18n/ko.ts +29 -12
  230. package/src/i18n/zh-cn.ts +29 -12
  231. package/src/i18n/zh-tw.ts +29 -12
  232. package/src/layout/desks.ts +1 -1
  233. package/src/layout/launch-layout.ts +1 -1
  234. package/src/layout/pane-manager/floating-actions.ts +5 -3
  235. package/src/layout/pane-manager/floating.ts +43 -1
  236. package/src/layout/pane-manager/index.ts +2 -0
  237. package/src/layout/selected-ticker.ts +74 -0
  238. package/src/market-data/depositary-pair.ts +251 -0
  239. package/src/market-data/futures-board.ts +1 -1
  240. package/src/market-data/futures-contract.ts +124 -40
  241. package/src/market-data/fx-closes.ts +17 -2
  242. package/src/market-data/hooks.tsx +19 -11
  243. package/src/market-data/market/change-basis.ts +49 -7
  244. package/src/market-data/market/freshness.ts +34 -5
  245. package/src/market-data/market/period-return.ts +163 -0
  246. package/src/market-data/market/trading-sessions.ts +13 -0
  247. package/src/market-data/market/year-to-date.ts +8 -13
  248. package/src/market-data/performance.ts +20 -14
  249. package/src/market-data/perpetual-premium.ts +32 -0
  250. package/src/market-data/published-apac-sessions.ts +2 -1
  251. package/src/market-data/published-futures-sessions.ts +69 -0
  252. package/src/market-data/quotes/contributions.ts +5 -1
  253. package/src/market-data/quotes/freshness.ts +42 -0
  254. package/src/market-data/quotes/intraday-bar.ts +37 -0
  255. package/src/market-data/quotes/regular-session-valuation.ts +13 -8
  256. package/src/market-data/quotes/resolution.ts +4 -2
  257. package/src/market-data/tax-equivalent.ts +1 -1
  258. package/src/market-data/ticker-price-returns.ts +3 -1
  259. package/src/news/aggregator.ts +5 -1
  260. package/src/news/news-model.ts +4 -0
  261. package/src/news/types.ts +11 -0
  262. package/src/notifications/app-notifier.ts +1 -1
  263. package/src/plugins/auto-update.ts +2 -2
  264. package/src/plugins/builtin/account-management/index.tsx +1 -0
  265. package/src/plugins/builtin/account-management/pane.tsx +9 -8
  266. package/src/plugins/builtin/alerts/alert-engine.ts +29 -19
  267. package/src/plugins/builtin/alerts/calendar-events.ts +378 -0
  268. package/src/plugins/builtin/alerts/cli.ts +485 -76
  269. package/src/plugins/builtin/alerts/command.ts +5 -10
  270. package/src/plugins/builtin/alerts/event-rows.ts +9 -5
  271. package/src/plugins/builtin/alerts/events-pane.tsx +71 -56
  272. package/src/plugins/builtin/alerts/events.ts +107 -5
  273. package/src/plugins/builtin/alerts/fired-log.ts +78 -0
  274. package/src/plugins/builtin/alerts/format.ts +2 -1
  275. package/src/plugins/builtin/alerts/headless.ts +100 -39
  276. package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
  277. package/src/plugins/builtin/alerts/history-rows.ts +89 -0
  278. package/src/plugins/builtin/alerts/index.tsx +45 -18
  279. package/src/plugins/builtin/alerts/iv-level.ts +365 -0
  280. package/src/plugins/builtin/alerts/levels.ts +3 -3
  281. package/src/plugins/builtin/alerts/pane.tsx +97 -29
  282. package/src/plugins/builtin/alerts/price.ts +35 -0
  283. package/src/plugins/builtin/alerts/quotes.ts +24 -0
  284. package/src/plugins/builtin/alerts/research-builder.ts +84 -11
  285. package/src/plugins/builtin/alerts/research-rules.ts +76 -3
  286. package/src/plugins/builtin/alerts/scheduled-check.ts +206 -32
  287. package/src/plugins/builtin/alerts/scheduled-sources.ts +26 -3
  288. package/src/plugins/builtin/alerts/scheduled.ts +188 -29
  289. package/src/plugins/builtin/alerts/storage.ts +13 -10
  290. package/src/plugins/builtin/alerts/targets.ts +12 -3
  291. package/src/plugins/builtin/analytics/index.tsx +8 -2
  292. package/src/plugins/builtin/analytics/metrics.ts +1 -1
  293. package/src/plugins/builtin/analytics/risk-book.ts +215 -0
  294. package/src/plugins/builtin/analytics/risk-client.ts +13 -6
  295. package/src/plugins/builtin/analytics/risk-headless.ts +55 -21
  296. package/src/plugins/builtin/analytics/risk-math.ts +6 -3
  297. package/src/plugins/builtin/analytics/risk-model.ts +297 -104
  298. package/src/plugins/builtin/analytics/risk-options.ts +17 -2
  299. package/src/plugins/builtin/analytics/risk-pane.tsx +97 -36
  300. package/src/plugins/builtin/attention/pane.tsx +6 -2
  301. package/src/plugins/builtin/awards/headless.ts +7 -3
  302. package/src/plugins/builtin/awards/model.ts +18 -0
  303. package/src/plugins/builtin/awards/pane.tsx +6 -3
  304. package/src/plugins/builtin/backtest/headless.ts +3 -3
  305. package/src/plugins/builtin/backtest/rules.ts +41 -5
  306. package/src/plugins/builtin/broker-manager/add-flow.tsx +12 -7
  307. package/src/plugins/builtin/broker-manager/detail.tsx +47 -19
  308. package/src/plugins/builtin/broker-manager/footer.ts +27 -11
  309. package/src/plugins/builtin/broker-manager/index.tsx +21 -12
  310. package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
  311. package/src/plugins/builtin/broker-manager/model.ts +12 -2
  312. package/src/plugins/builtin/broker-manager/pane-actions.tsx +183 -57
  313. package/src/plugins/builtin/broker-manager/table.ts +28 -12
  314. package/src/plugins/builtin/broker-trading/account-picker.tsx +2 -1
  315. package/src/plugins/builtin/broker-trading/chart-levels.ts +82 -13
  316. package/src/plugins/builtin/broker-trading/controller.ts +45 -13
  317. package/src/plugins/builtin/broker-trading/dock.tsx +22 -4
  318. package/src/plugins/builtin/broker-trading/headless.ts +2 -1
  319. package/src/plugins/builtin/broker-trading/index.tsx +7 -1
  320. package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
  321. package/src/plugins/builtin/broker-trading/order-feed.ts +75 -7
  322. package/src/plugins/builtin/broker-trading/orders.tsx +109 -31
  323. package/src/plugins/builtin/broker-trading/overview-orders.tsx +9 -3
  324. package/src/plugins/builtin/broker-trading/pane-model.ts +30 -2
  325. package/src/plugins/builtin/broker-trading/pane.tsx +110 -23
  326. package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
  327. package/src/plugins/builtin/broker-trading/ticket.tsx +112 -31
  328. package/src/plugins/builtin/buildout/cells.tsx +4 -0
  329. package/src/plugins/builtin/buildout/detail/index.tsx +5 -1
  330. package/src/plugins/builtin/buildout/detail/ui.tsx +7 -4
  331. package/src/plugins/builtin/buildout/pane/index.tsx +25 -12
  332. package/src/plugins/builtin/buildout/pane/status.tsx +0 -4
  333. package/src/plugins/builtin/builtin-plugin-meta.ts +1 -1
  334. package/src/plugins/builtin/catalysts/detail.tsx +3 -2
  335. package/src/plugins/builtin/catalysts/index.tsx +1 -1
  336. package/src/plugins/builtin/catalysts/model.ts +49 -4
  337. package/src/plugins/builtin/catalysts/pane.tsx +6 -8
  338. package/src/plugins/builtin/central-bank-rates/client.ts +5 -0
  339. package/src/plugins/builtin/central-bank-rates/headless.ts +36 -10
  340. package/src/plugins/builtin/central-bank-rates/model.ts +33 -8
  341. package/src/plugins/builtin/changelog/index.tsx +1 -0
  342. package/src/plugins/builtin/chart-composer/catalog-inventory.ts +1 -0
  343. package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +2 -1
  344. package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
  345. package/src/plugins/builtin/chart-composer/cli-options.ts +2 -5
  346. package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +2 -1
  347. package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -0
  348. package/src/plugins/builtin/chart-composer/editor.tsx +4 -1
  349. package/src/plugins/builtin/chart-composer/headless-schema.ts +28 -26
  350. package/src/plugins/builtin/chart-composer/headless.ts +253 -35
  351. package/src/plugins/builtin/chart-composer/index.tsx +12 -2
  352. package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
  353. package/src/plugins/builtin/chart-composer/pane.tsx +127 -28
  354. package/src/plugins/builtin/chart-composer/series-catalog.ts +1 -0
  355. package/src/plugins/builtin/chart-composer/series-expression.ts +65 -6
  356. package/src/plugins/builtin/chart-composer/session-history.ts +15 -21
  357. package/src/plugins/builtin/chart-composer/session-range.ts +4 -2
  358. package/src/plugins/builtin/chart-composer/settings.ts +31 -19
  359. package/src/plugins/builtin/chart-composer/use-series-catalog.ts +5 -6
  360. package/src/plugins/builtin/chart-composer/viewport-labels.ts +18 -8
  361. package/src/plugins/builtin/chat/attachments/model.ts +3 -1
  362. package/src/plugins/builtin/chat/content/index.tsx +1 -1
  363. package/src/plugins/builtin/chat/pane-links/open.ts +1 -1
  364. package/src/plugins/builtin/chat/people.ts +1 -1
  365. package/src/plugins/builtin/clinical-trials/client.ts +5 -2
  366. package/src/plugins/builtin/clinical-trials/model.ts +13 -4
  367. package/src/plugins/builtin/clinical-trials/pane.tsx +32 -12
  368. package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +17 -0
  369. package/src/plugins/builtin/cloud/askg/controller.ts +1 -1
  370. package/src/plugins/builtin/cloud/askg/lock-note.ts +1 -1
  371. package/src/plugins/builtin/cloud/askg/tool-display.ts +1 -1
  372. package/src/plugins/builtin/cloud/auth-commands.ts +3 -3
  373. package/src/plugins/builtin/cloud/team/pane-sections.tsx +105 -47
  374. package/src/plugins/builtin/cloud/team/pane-ui.tsx +42 -4
  375. package/src/plugins/builtin/cloud/team/pane.tsx +204 -64
  376. package/src/plugins/builtin/cloud/thesis/store.ts +45 -22
  377. package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
  378. package/src/plugins/builtin/commodities-energy/index.tsx +29 -2
  379. package/src/plugins/builtin/commodities-energy/view-state.ts +2 -0
  380. package/src/plugins/builtin/commodity-balances/pane.tsx +11 -4
  381. package/src/plugins/builtin/company-attention/app-rank.tsx +7 -5
  382. package/src/plugins/builtin/company-attention/building-model.ts +222 -0
  383. package/src/plugins/builtin/company-attention/building.tsx +172 -0
  384. package/src/plugins/builtin/company-attention/client.ts +117 -1
  385. package/src/plugins/builtin/company-attention/evidence.ts +16 -3
  386. package/src/plugins/builtin/company-attention/headless.ts +101 -5
  387. package/src/plugins/builtin/company-attention/index.tsx +6 -3
  388. package/src/plugins/builtin/company-attention/model.ts +33 -7
  389. package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
  390. package/src/plugins/builtin/company-attention/moves.tsx +159 -0
  391. package/src/plugins/builtin/company-attention/pane.tsx +79 -23
  392. package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
  393. package/src/plugins/builtin/company-attention/signals.tsx +160 -0
  394. package/src/plugins/builtin/company-kpis/headless.ts +3 -2
  395. package/src/plugins/builtin/company-kpis/model.ts +2 -2
  396. package/src/plugins/builtin/company-kpis/pane.tsx +1 -1
  397. package/src/plugins/builtin/composite-plugins.ts +2 -1
  398. package/src/plugins/builtin/congress-trades/headless.ts +1 -1
  399. package/src/plugins/builtin/connections/index.ts +1 -0
  400. package/src/plugins/builtin/correlation/headless-schema.ts +3 -2
  401. package/src/plugins/builtin/correlation/headless.ts +5 -3
  402. package/src/plugins/builtin/cot/headless.ts +28 -6
  403. package/src/plugins/builtin/cot/model.ts +12 -0
  404. package/src/plugins/builtin/cot/pane.tsx +3 -2
  405. package/src/plugins/builtin/cpi/headless.ts +5 -1
  406. package/src/plugins/builtin/cpi/pane.tsx +11 -9
  407. package/src/plugins/builtin/credit-boards/model.ts +2 -0
  408. package/src/plugins/builtin/credit-documents/headless.ts +1 -1
  409. package/src/plugins/builtin/crypto-board/client.ts +86 -0
  410. package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
  411. package/src/plugins/builtin/crypto-board/defi.ts +239 -0
  412. package/src/plugins/builtin/crypto-board/headless.ts +117 -6
  413. package/src/plugins/builtin/crypto-board/index.tsx +8 -3
  414. package/src/plugins/builtin/crypto-board/model.ts +40 -8
  415. package/src/plugins/builtin/crypto-board/pane.tsx +55 -21
  416. package/src/plugins/builtin/crypto-board/series.ts +19 -1
  417. package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
  418. package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
  419. package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
  420. package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
  421. package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
  422. package/src/plugins/builtin/debug/index.tsx +1 -0
  423. package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
  424. package/src/plugins/builtin/docs/index.tsx +1 -1
  425. package/src/plugins/builtin/docs/pane.tsx +2 -2
  426. package/src/plugins/builtin/docs/targets.ts +1 -1
  427. package/src/plugins/builtin/doe/client.ts +5 -1
  428. package/src/plugins/builtin/doe/headless.ts +12 -6
  429. package/src/plugins/builtin/doe/model.ts +43 -6
  430. package/src/plugins/builtin/doe/pane.tsx +18 -11
  431. package/src/plugins/builtin/earnings/board-model.ts +13 -6
  432. package/src/plugins/builtin/earnings/board-table.ts +4 -1
  433. package/src/plugins/builtin/earnings/board.tsx +253 -50
  434. package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
  435. package/src/plugins/builtin/earnings/calendar.tsx +338 -0
  436. package/src/plugins/builtin/earnings/client.ts +4 -3
  437. package/src/plugins/builtin/earnings/headless.ts +53 -15
  438. package/src/plugins/builtin/earnings/history-model.ts +53 -36
  439. package/src/plugins/builtin/earnings/index.tsx +15 -22
  440. package/src/plugins/builtin/earnings/model.ts +17 -12
  441. package/src/plugins/builtin/earnings/scope.ts +89 -0
  442. package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
  443. package/src/plugins/builtin/earnings-calls/data.ts +146 -2
  444. package/src/plugins/builtin/earnings-calls/headless.ts +151 -9
  445. package/src/plugins/builtin/earnings-calls/index.tsx +3 -3
  446. package/src/plugins/builtin/earnings-calls/lock-note.ts +1 -1
  447. package/src/plugins/builtin/earnings-calls/pane.tsx +149 -31
  448. package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
  449. package/src/plugins/builtin/earnings-ripple/pane.tsx +10 -5
  450. package/src/plugins/builtin/econ/calendar-model.ts +132 -20
  451. package/src/plugins/builtin/econ/detail-view.tsx +48 -10
  452. package/src/plugins/builtin/econ/fred-catalog.ts +23 -6
  453. package/src/plugins/builtin/econ/fred-series-map.ts +4 -0
  454. package/src/plugins/builtin/econ/index.tsx +112 -25
  455. package/src/plugins/builtin/econ/print-watch.ts +2 -1
  456. package/src/plugins/builtin/econ/types.ts +32 -1
  457. package/src/plugins/builtin/econ-statistics/client.ts +16 -3
  458. package/src/plugins/builtin/econ-statistics/defs.ts +4 -0
  459. package/src/plugins/builtin/econ-statistics/detail.tsx +2 -2
  460. package/src/plugins/builtin/econ-statistics/headless.ts +13 -2
  461. package/src/plugins/builtin/econ-statistics/index.tsx +3 -3
  462. package/src/plugins/builtin/econ-statistics/pane.tsx +2 -1
  463. package/src/plugins/builtin/econ-statistics/stats.ts +103 -0
  464. package/src/plugins/builtin/econ-statistics/view.ts +16 -1
  465. package/src/plugins/builtin/equity-screener/client.ts +21 -3
  466. package/src/plugins/builtin/equity-screener/headless.ts +68 -6
  467. package/src/plugins/builtin/equity-screener/live.ts +1 -1
  468. package/src/plugins/builtin/equity-screener/model.ts +6 -0
  469. package/src/plugins/builtin/equity-screener/pane.tsx +45 -10
  470. package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
  471. package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
  472. package/src/plugins/builtin/estimate-revisions/headless.ts +3 -1
  473. package/src/plugins/builtin/estimate-revisions/lock-note.ts +3 -3
  474. package/src/plugins/builtin/estimate-revisions/model.ts +8 -10
  475. package/src/plugins/builtin/exposure/headless.ts +51 -6
  476. package/src/plugins/builtin/exposure/index.tsx +28 -2
  477. package/src/plugins/builtin/exposure/model.ts +7 -0
  478. package/src/plugins/builtin/exposure/pane.tsx +6 -1
  479. package/src/plugins/builtin/fear-greed/index.tsx +1 -1
  480. package/src/plugins/builtin/filing-events/index.tsx +1 -1
  481. package/src/plugins/builtin/futures/model.ts +10 -9
  482. package/src/plugins/builtin/futures/returns.ts +8 -36
  483. package/src/plugins/builtin/futures/table.tsx +1 -1
  484. package/src/plugins/builtin/futures-curve/client.ts +40 -9
  485. package/src/plugins/builtin/futures-curve/headless.ts +39 -17
  486. package/src/plugins/builtin/futures-curve/model.ts +258 -69
  487. package/src/plugins/builtin/futures-curve/pane.tsx +46 -17
  488. package/src/plugins/builtin/fx-matrix/client.ts +15 -8
  489. package/src/plugins/builtin/fx-matrix/headless.ts +32 -14
  490. package/src/plugins/builtin/fx-matrix/index.tsx +13 -11
  491. package/src/plugins/builtin/fx-matrix/live-legs.ts +22 -0
  492. package/src/plugins/builtin/fx-matrix/settings.ts +2 -1
  493. package/src/plugins/builtin/gpu/headless.ts +9 -4
  494. package/src/plugins/builtin/help/index.tsx +13 -3
  495. package/src/plugins/builtin/holders/beneficial-model.ts +8 -11
  496. package/src/plugins/builtin/holders/beneficial-report.ts +6 -5
  497. package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
  498. package/src/plugins/builtin/holders/client.ts +13 -1
  499. package/src/plugins/builtin/holders/format.ts +28 -17
  500. package/src/plugins/builtin/holders/headless.ts +46 -7
  501. package/src/plugins/builtin/holders/index-holders.ts +264 -0
  502. package/src/plugins/builtin/holders/pane.tsx +79 -15
  503. package/src/plugins/builtin/holders/report-rows.ts +35 -7
  504. package/src/plugins/builtin/holders/table-model.ts +2 -1
  505. package/src/plugins/builtin/holders/treemap.tsx +2 -2
  506. package/src/plugins/builtin/insider/headless.ts +1 -1
  507. package/src/plugins/builtin/insider/signals-client.ts +1 -1
  508. package/src/plugins/builtin/insider/signals.tsx +1 -1
  509. package/src/plugins/builtin/ipo-calendar/pane.tsx +7 -4
  510. package/src/plugins/builtin/iv-history/client.ts +20 -0
  511. package/src/plugins/builtin/iv-history/headless.ts +4 -4
  512. package/src/plugins/builtin/iv-history/index.tsx +1 -1
  513. package/src/plugins/builtin/iv-history/model.ts +13 -4
  514. package/src/plugins/builtin/iv-history/series.ts +3 -1
  515. package/src/plugins/builtin/jobs/lock-note.ts +1 -1
  516. package/src/plugins/builtin/jobs/model.ts +4 -15
  517. package/src/plugins/builtin/jobs/pane.tsx +7 -5
  518. package/src/plugins/builtin/jobs/share-bars.tsx +11 -5
  519. package/src/plugins/builtin/jodi/pane.tsx +10 -4
  520. package/src/plugins/builtin/layout-manager/index.tsx +1 -0
  521. package/src/plugins/builtin/macro-day/headless.ts +20 -7
  522. package/src/plugins/builtin/macro-day/index.tsx +3 -2
  523. package/src/plugins/builtin/macro-day/model.ts +29 -8
  524. package/src/plugins/builtin/macro-day/pane.tsx +46 -10
  525. package/src/plugins/builtin/macro-day/releases.ts +55 -13
  526. package/src/plugins/builtin/market-heatmap/data.ts +9 -2
  527. package/src/plugins/builtin/market-heatmap/evidence.ts +1 -1
  528. package/src/plugins/builtin/market-heatmap/headless.ts +9 -6
  529. package/src/plugins/builtin/market-heatmap/index.tsx +3 -3
  530. package/src/plugins/builtin/market-heatmap/model.ts +10 -7
  531. package/src/plugins/builtin/market-movers/client.ts +33 -19
  532. package/src/plugins/builtin/market-movers/headless.ts +8 -2
  533. package/src/plugins/builtin/market-movers/index.tsx +16 -10
  534. package/src/plugins/builtin/market-movers/screener.ts +29 -8
  535. package/src/plugins/builtin/market-movers/session-body.tsx +4 -2
  536. package/src/plugins/builtin/market-movers/session-table.ts +4 -2
  537. package/src/plugins/builtin/market-movers/table.ts +4 -1
  538. package/src/plugins/builtin/market-valuation/headless.ts +2 -0
  539. package/src/plugins/builtin/market-valuation/view.ts +5 -0
  540. package/src/plugins/builtin/members/headless.ts +6 -5
  541. package/src/plugins/builtin/members/pane.tsx +11 -4
  542. package/src/plugins/builtin/mna/client.ts +1 -0
  543. package/src/plugins/builtin/mna/detail.tsx +20 -32
  544. package/src/plugins/builtin/mna/distress/detail.tsx +16 -4
  545. package/src/plugins/builtin/mna/distress/model.ts +3 -2
  546. package/src/plugins/builtin/mna/distress/pane.tsx +7 -4
  547. package/src/plugins/builtin/mna/headless.ts +6 -13
  548. package/src/plugins/builtin/mna/model.ts +93 -15
  549. package/src/plugins/builtin/mna/pane.tsx +5 -4
  550. package/src/plugins/builtin/news/headless.ts +12 -6
  551. package/src/plugins/builtin/news/index.tsx +10 -1
  552. package/src/plugins/builtin/news/wire/index.tsx +3 -2
  553. package/src/plugins/builtin/news/wire/news/command-bar-search.ts +26 -10
  554. package/src/plugins/builtin/news/wire/news/query-presets.ts +6 -2
  555. package/src/plugins/builtin/news/wire/rss/cli.ts +3 -3
  556. package/src/plugins/builtin/notes/cli.ts +49 -14
  557. package/src/plugins/builtin/openfda/pane.tsx +1 -1
  558. package/src/plugins/builtin/options/carry.ts +2 -2
  559. package/src/plugins/builtin/options/index.tsx +1 -1
  560. package/src/plugins/builtin/options/view.tsx +10 -10
  561. package/src/plugins/builtin/options-calculator/headless.ts +46 -7
  562. package/src/plugins/builtin/options-scenario/client.ts +123 -28
  563. package/src/plugins/builtin/options-scenario/collar.ts +8 -6
  564. package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +127 -0
  565. package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +165 -0
  566. package/src/plugins/builtin/options-scenario/csp-screen.ts +258 -0
  567. package/src/plugins/builtin/options-scenario/csp.ts +101 -21
  568. package/src/plugins/builtin/options-scenario/headless.ts +36 -15
  569. package/src/plugins/builtin/options-scenario/hedge.ts +20 -14
  570. package/src/plugins/builtin/options-scenario/index.tsx +28 -3
  571. package/src/plugins/builtin/options-scenario/model.ts +13 -0
  572. package/src/plugins/builtin/options-scenario/pane.tsx +9 -5
  573. package/src/plugins/builtin/perps/equity-row.tsx +11 -3
  574. package/src/plugins/builtin/perps/freshness.ts +8 -5
  575. package/src/plugins/builtin/perps/headless.ts +3 -1
  576. package/src/plugins/builtin/perps/list-perpetuals.ts +25 -4
  577. package/src/plugins/builtin/perps/live-rows.ts +161 -0
  578. package/src/plugins/builtin/perps/markets-section.tsx +154 -0
  579. package/src/plugins/builtin/perps/pane.tsx +36 -17
  580. package/src/plugins/builtin/perps/venue-markets.ts +96 -0
  581. package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -1
  582. package/src/plugins/builtin/plugin-marketplace/pane.tsx +143 -59
  583. package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +72 -24
  584. package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +158 -141
  585. package/src/plugins/builtin/portfolio-list/cli/render.ts +49 -20
  586. package/src/plugins/builtin/portfolio-list/cli/shared.ts +3 -3
  587. package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +29 -24
  588. package/src/plugins/builtin/portfolio-list/headless.ts +6 -3
  589. package/src/plugins/builtin/portfolio-list/income.ts +13 -2
  590. package/src/plugins/builtin/portfolio-list/index.tsx +9 -2
  591. package/src/plugins/builtin/portfolio-list/pane/index.tsx +21 -8
  592. package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
  593. package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +16 -9
  594. package/src/plugins/builtin/portfolio-list/summary/totals.ts +2 -15
  595. package/src/plugins/builtin/power/client.ts +4 -1
  596. package/src/plugins/builtin/power/evidence.ts +22 -7
  597. package/src/plugins/builtin/power/gas.tsx +5 -1
  598. package/src/plugins/builtin/power/pane.tsx +8 -1
  599. package/src/plugins/builtin/power/prices.tsx +10 -3
  600. package/src/plugins/builtin/research/analyst-headless.ts +25 -8
  601. package/src/plugins/builtin/research/analyst-model.ts +68 -3
  602. package/src/plugins/builtin/research/corporate-actions-pane.tsx +63 -14
  603. package/src/plugins/builtin/research/event-model.ts +3 -1
  604. package/src/plugins/builtin/research/event-sources.ts +12 -4
  605. package/src/plugins/builtin/research/index.tsx +2 -1
  606. package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
  607. package/src/plugins/builtin/research/relative-valuation-columns.ts +31 -2
  608. package/src/plugins/builtin/research/relative-valuation-currency.ts +12 -5
  609. package/src/plugins/builtin/research/relative-valuation-headless.ts +84 -26
  610. package/src/plugins/builtin/research/relative-valuation-model.ts +88 -19
  611. package/src/plugins/builtin/research/relative-valuation-pane.tsx +76 -9
  612. package/src/plugins/builtin/research/relative-valuation-peers.ts +1 -1
  613. package/src/plugins/builtin/reverse-dcf/model.ts +6 -2
  614. package/src/plugins/builtin/risk-factors/index.tsx +2 -2
  615. package/src/plugins/builtin/scanner/lock-note.ts +1 -1
  616. package/src/plugins/builtin/sec/forms.ts +13 -0
  617. package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
  618. package/src/plugins/builtin/sec/fund-facts.ts +68 -8
  619. package/src/plugins/builtin/sec/headless.ts +85 -8
  620. package/src/plugins/builtin/sec/index.tsx +58 -12
  621. package/src/plugins/builtin/sectors/client.ts +2 -1
  622. package/src/plugins/builtin/sectors/sector-model.ts +11 -15
  623. package/src/plugins/builtin/series-inventory.ts +2 -0
  624. package/src/plugins/builtin/shared/broker-reconnect.ts +107 -22
  625. package/src/plugins/builtin/shared/cloud-upgrade.ts +34 -6
  626. package/src/plugins/builtin/shared/earnings-calendar.ts +375 -0
  627. package/src/plugins/builtin/{earnings/estimate-basis.ts → shared/earnings-estimate-basis.ts} +1 -1
  628. package/src/plugins/builtin/shared/earnings-report.ts +3 -3
  629. package/src/plugins/builtin/shared/fx-rate-freshness.ts +23 -1
  630. package/src/plugins/builtin/shared/job-posting.ts +129 -0
  631. package/src/plugins/builtin/shared/pro-lock-note.ts +3 -3
  632. package/src/plugins/builtin/shared/report-freshness.ts +3 -0
  633. package/src/plugins/builtin/shared/research-trading.tsx +21 -0
  634. package/src/plugins/builtin/shared/series-cache.ts +2 -0
  635. package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
  636. package/src/plugins/builtin/short-interest/client.ts +2 -0
  637. package/src/plugins/builtin/short-interest/headless.ts +41 -12
  638. package/src/plugins/builtin/short-interest/index.tsx +23 -1
  639. package/src/plugins/builtin/short-interest/model.ts +70 -19
  640. package/src/plugins/builtin/short-interest/pane.tsx +19 -2
  641. package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
  642. package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
  643. package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
  644. package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
  645. package/src/plugins/builtin/short-interest/schedule.ts +35 -2
  646. package/src/plugins/builtin/short-interest/surface.tsx +11 -4
  647. package/src/plugins/builtin/short-interest/types.ts +9 -0
  648. package/src/plugins/builtin/short-interest/watch-client.ts +14 -8
  649. package/src/plugins/builtin/short-interest/watch-model.ts +12 -25
  650. package/src/plugins/builtin/short-interest/watch-pane.tsx +5 -1
  651. package/src/plugins/builtin/supply-chain/flow.tsx +33 -9
  652. package/src/plugins/builtin/supply-chain/model.ts +51 -3
  653. package/src/plugins/builtin/supply-chain/pane.tsx +78 -39
  654. package/src/plugins/builtin/supply-chain/row-evidence.tsx +1 -1
  655. package/src/plugins/builtin/themes/headless.ts +8 -5
  656. package/src/plugins/builtin/themes/model.ts +14 -4
  657. package/src/plugins/builtin/themes/pane.tsx +24 -5
  658. package/src/plugins/builtin/thirteenf/headless.ts +5 -5
  659. package/src/plugins/builtin/thirteenf/signals.ts +3 -1
  660. package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
  661. package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
  662. package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
  663. package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +40 -26
  664. package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +8 -4
  665. package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +67 -3
  666. package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +112 -5
  667. package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +17 -2
  668. package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +21 -7
  669. package/src/plugins/builtin/ticker-detail/financials/model.ts +36 -1
  670. package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
  671. package/src/plugins/builtin/ticker-detail/financials/ratios.ts +62 -13
  672. package/src/plugins/builtin/ticker-detail/financials/tab.tsx +30 -4
  673. package/src/plugins/builtin/ticker-detail/headless-schema.ts +14 -2
  674. package/src/plugins/builtin/ticker-detail/headless.ts +148 -35
  675. package/src/plugins/builtin/ticker-detail/index.tsx +37 -5
  676. package/src/plugins/builtin/ticker-detail/overview/model.ts +65 -10
  677. package/src/plugins/builtin/ticker-detail/overview/pane.tsx +9 -1
  678. package/src/plugins/builtin/ticker-detail/overview-tab.tsx +68 -11
  679. package/src/plugins/builtin/ticker-detail/pane.tsx +11 -0
  680. package/src/plugins/builtin/ticker-detail/quote-footer.ts +8 -3
  681. package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
  682. package/src/plugins/builtin/vol-surface/client.ts +5 -4
  683. package/src/plugins/builtin/vol-surface/headless.ts +12 -3
  684. package/src/plugins/builtin/vol-surface/model.ts +4 -2
  685. package/src/plugins/builtin/volatility/model.ts +5 -10
  686. package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +4 -3
  687. package/src/plugins/builtin/world-venue-map/basemap.ts +3 -1
  688. package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -0
  689. package/src/plugins/builtin/world-venue-map/evidence.ts +1 -1
  690. package/src/plugins/builtin/world-venue-map/geo-series.ts +90 -11
  691. package/src/plugins/builtin/world-venue-map/headless.ts +1 -1
  692. package/src/plugins/builtin/world-venue-map/index.ts +3 -26
  693. package/src/plugins/builtin/world-venue-map/layers.ts +1 -1
  694. package/src/plugins/builtin/world-venue-map/map.tsx +2 -1
  695. package/src/plugins/builtin/world-venue-map/pane.tsx +4 -2
  696. package/src/plugins/builtin/world-venue-map/venue-header.tsx +15 -4
  697. package/src/plugins/builtin/yield-curve/client.ts +25 -0
  698. package/src/plugins/builtin/yield-curve/curves.ts +7 -4
  699. package/src/plugins/builtin/yield-curve/headless.ts +38 -4
  700. package/src/plugins/builtin/yield-curve/history.ts +4 -3
  701. package/src/plugins/builtin/yield-curve/index.tsx +12 -6
  702. package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
  703. package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
  704. package/src/plugins/bundle.ts +1 -1
  705. package/src/plugins/catalog-browser.ts +2 -1
  706. package/src/plugins/compat.ts +3 -3
  707. package/src/plugins/dependencies.ts +75 -14
  708. package/src/plugins/extracted-plugins.ts +132 -34
  709. package/src/plugins/host-link.ts +149 -34
  710. package/src/plugins/installer.ts +35 -10
  711. package/src/plugins/loader.ts +206 -38
  712. package/src/plugins/manager-node.ts +2 -2
  713. package/src/plugins/marketplace/deactivation.ts +22 -0
  714. package/src/plugins/marketplace/model.ts +2 -2
  715. package/src/plugins/marketplace/packs.ts +1 -1
  716. package/src/plugins/ownership.ts +1 -1
  717. package/src/plugins/peer-retry.ts +155 -0
  718. package/src/plugins/registry/contributions.ts +3 -1
  719. package/src/plugins/registry/index.ts +4 -3
  720. package/src/plugins/registry/plugin-state.ts +3 -0
  721. package/src/plugins/seed-notice.ts +20 -0
  722. package/src/plugins/shortcut-argument.ts +39 -0
  723. package/src/portfolio/allocation.ts +1 -1
  724. package/src/portfolio/collection-name.ts +31 -0
  725. package/src/portfolio/column-values.ts +10 -8
  726. package/src/portfolio/cost-fx.ts +296 -19
  727. package/src/portfolio/manual-lots.ts +75 -0
  728. package/src/portfolio/mutations.ts +60 -22
  729. package/src/portfolio/suffixed-listings.ts +209 -0
  730. package/src/portfolio/totals-currency.ts +24 -0
  731. package/src/public/__snapshots__/public-api.test.ts.snap +14 -0
  732. package/src/public/time-series.ts +11 -8
  733. package/src/remote/schema.ts +1 -1
  734. package/src/renderers/browser/config-host.ts +3 -0
  735. package/src/renderers/browser/main.tsx +23 -3
  736. package/src/renderers/dom/boot-frame-page.ts +187 -0
  737. package/src/renderers/dom/boot-frame.ts +237 -0
  738. package/src/renderers/dom/build-assets.ts +46 -8
  739. package/src/renderers/dom/dom-ui-host.tsx +4 -29
  740. package/src/renderers/dom/host/ascii-text.ts +16 -2
  741. package/src/renderers/dom/host/box.tsx +43 -2
  742. package/src/renderers/dom/host/chart-surface.tsx +2 -0
  743. package/src/renderers/dom/host/hls.chunk.ts +3 -0
  744. package/src/renderers/dom/host/image-surface.tsx +49 -0
  745. package/src/renderers/dom/host/media-surface.tsx +24 -18
  746. package/src/renderers/dom/host/mouse.ts +30 -0
  747. package/src/renderers/dom/host/size-observer.ts +1 -1
  748. package/src/renderers/dom/host/style.ts +1 -1
  749. package/src/renderers/dom/styles.css +76 -0
  750. package/src/renderers/dom/test-utils.tsx +2 -1
  751. package/src/renderers/electrobun/bun/application-menu/index.ts +3 -3
  752. package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
  753. package/src/renderers/electrobun/bun/desktop/backend.ts +46 -3
  754. package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
  755. package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
  756. package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
  757. package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
  758. package/src/renderers/electrobun/bun/index.ts +11 -1
  759. package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
  760. package/src/renderers/electrobun/bun/window/create.ts +4 -1
  761. package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
  762. package/src/renderers/electrobun/shared/protocol.ts +6 -1
  763. package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
  764. package/src/renderers/electrobun/view/config-host.ts +3 -0
  765. package/src/renderers/electrobun/view/fatal-screen.tsx +1 -1
  766. package/src/renderers/electrobun/view/main.tsx +30 -4
  767. package/src/renderers/electrobun/view/news-source.ts +5 -5
  768. package/src/renderers/electrobun/view/remote/asset-data-client.ts +1 -1
  769. package/src/renderers/electrobun/view/ui-host.tsx +1 -1
  770. package/src/renderers/opentui/browser-open.ts +88 -0
  771. package/src/renderers/opentui/host.tsx +5 -14
  772. package/src/renderers/opentui/image/loader.ts +3 -2
  773. package/src/renderers/opentui/native-smoke.ts +10 -1
  774. package/src/renderers/opentui/pane-image/index.ts +2 -1
  775. package/src/renderers/opentui/render-lib.ts +253 -0
  776. package/src/renderers/opentui/render-timing-smoke.ts +1 -1
  777. package/src/renderers/opentui/start.tsx +1 -1
  778. package/src/renderers/share/layout-view.tsx +2 -2
  779. package/src/renderers/share/main.tsx +4 -4
  780. package/src/renderers/share/view.tsx +1 -1
  781. package/src/series/resolve.ts +22 -6
  782. package/src/series/standalone.ts +30 -2
  783. package/src/series/types.ts +8 -1
  784. package/src/shares/api.ts +4 -1
  785. package/src/shares/pane.ts +1 -1
  786. package/src/sources/gloomberb-cloud/fred-series.ts +46 -1
  787. package/src/sources/gloomberb-cloud/index.ts +32 -16
  788. package/src/sources/gloomberb-cloud/news.ts +39 -0
  789. package/src/sources/gloomberb-cloud/normalizers.ts +14 -1
  790. package/src/sources/gloomberb-cloud/perpetuals.ts +49 -1
  791. package/src/sources/listing-symbols.ts +37 -0
  792. package/src/sources/provider-errors.ts +16 -2
  793. package/src/sources/provider-router/financial-routes.ts +21 -3
  794. package/src/sources/provider-router/financials.ts +15 -2
  795. package/src/sources/provider-router/history.ts +30 -8
  796. package/src/sources/provider-router/primary.ts +1 -1
  797. package/src/state/app/bootstrap.ts +23 -0
  798. package/src/state/hooks/inline-tickers.ts +30 -5
  799. package/src/sync/controller.ts +1 -1
  800. package/src/sync/core-contributors.ts +46 -14
  801. package/src/team/collections-sync.ts +2 -1
  802. package/src/team/collections.ts +178 -17
  803. package/src/telemetry/crash-reports.ts +17 -4
  804. package/src/test-support/builtin-panes.ts +1 -1
  805. package/src/theme/colors.ts +3 -30
  806. package/src/theme/ui-tokens.ts +37 -1
  807. package/src/tickers/company-name-listing.ts +210 -33
  808. package/src/tickers/index-roots.ts +47 -0
  809. package/src/tickers/instrument-label.ts +5 -1
  810. package/src/tickers/metadata.ts +10 -0
  811. package/src/tickers/perpetual-listing.ts +5 -2
  812. package/src/tickers/search/home-listing.ts +75 -0
  813. package/src/tickers/search/index.ts +76 -27
  814. package/src/tickers/search/ranking.ts +54 -4
  815. package/src/tickers/search/upsert.ts +29 -0
  816. package/src/tickers/terminal-codes.ts +416 -40
  817. package/src/time-series/bar-aggregation.ts +243 -0
  818. package/src/time-series/base-series.ts +307 -0
  819. package/src/time-series/chart-bounds.ts +349 -0
  820. package/src/time-series/chart-seed.ts +142 -0
  821. package/src/time-series/economic.ts +5 -0
  822. package/src/time-series/fundamentals.ts +18 -3
  823. package/src/time-series/history-acquisition.ts +499 -0
  824. package/src/time-series/leverage.ts +100 -0
  825. package/src/time-series/market-resolution.ts +4 -2
  826. package/src/time-series/market.ts +2 -1
  827. package/src/time-series/price-comparison.ts +175 -30
  828. package/src/time-series/range.ts +9 -1
  829. package/src/time-series/resolution.ts +174 -16
  830. package/src/time-series/resolve-context.ts +157 -0
  831. package/src/time-series/resolve.ts +126 -1577
  832. package/src/time-series/series-name.ts +38 -0
  833. package/src/time-series/series-presentation.ts +208 -0
  834. package/src/time-series/spec.ts +11 -6
  835. package/src/time-series/studies.ts +109 -12
  836. package/src/time-series/tail-reconcile.ts +121 -0
  837. package/src/time-series/types.ts +29 -2
  838. package/src/time-series/use-chart-resolution.ts +4 -5
  839. package/src/types/broker.ts +10 -0
  840. package/src/types/config.ts +14 -0
  841. package/src/types/data-provider.ts +14 -0
  842. package/src/types/exchange-rate.ts +6 -0
  843. package/src/types/financials.ts +104 -7
  844. package/src/types/headless.ts +76 -6
  845. package/src/types/instrument.ts +3 -0
  846. package/src/types/plugin.ts +65 -8
  847. package/src/types/price-history.ts +2 -0
  848. package/src/types/ticker.ts +13 -0
  849. package/src/types/trading.ts +59 -1
  850. package/src/ui/ascii-font.ts +13 -1
  851. package/src/ui/host.tsx +6 -1
  852. package/src/updater/command-names.ts +175 -0
  853. package/src/updater/index.ts +10 -5
  854. package/src/utils/calendar-date.ts +32 -15
  855. package/src/utils/cash-runway.ts +241 -0
  856. package/src/utils/central-banks.ts +42 -0
  857. package/src/utils/cli-output.ts +259 -80
  858. package/src/utils/contract-month.ts +16 -0
  859. package/src/utils/crypto-pair.ts +61 -3
  860. package/src/utils/currency-units.ts +29 -0
  861. package/src/utils/datetime-format.ts +10 -0
  862. package/src/utils/debug-log.ts +1 -1
  863. package/src/utils/decimal-comma.ts +39 -6
  864. package/src/utils/exchange-announcements.ts +71 -0
  865. package/src/utils/exchange-rate-snapshot.ts +10 -0
  866. package/src/utils/financial-statements.ts +83 -4
  867. package/src/utils/format.ts +34 -16
  868. package/src/utils/fundamentals.ts +150 -34
  869. package/src/utils/fx-market-hours.ts +10 -1
  870. package/src/utils/latest-financial-period.ts +8 -0
  871. package/src/utils/linux-libc.ts +54 -0
  872. package/src/utils/market-capitalization.ts +111 -15
  873. package/src/utils/max-drawdown.ts +64 -0
  874. package/src/utils/network-failure.ts +83 -0
  875. package/src/utils/option-expiry.ts +139 -7
  876. package/src/utils/price-earnings.ts +11 -5
  877. package/src/utils/price-history.ts +18 -8
  878. package/src/utils/price-window.ts +131 -0
  879. package/src/utils/release-date.ts +47 -0
  880. package/src/utils/sec.ts +3 -0
  881. package/src/utils/throttled-fetch.ts +11 -4
  882. package/src/utils/trailing-eps.ts +67 -0
  883. package/src/utils/typed-text.ts +21 -0
  884. package/src/utils/utc-time.ts +24 -1
  885. package/src/version.ts +6 -0
  886. package/src/cli/pane-functions/screenshot.ts +0 -2122
package/src/cli/help.ts CHANGED
@@ -14,10 +14,10 @@ import {
14
14
  /** `--section` of a command whose report has several tables. */
15
15
  export const TABLE_SECTION_OPTION = {
16
16
  flags: "--section <title|n>",
17
- description: "With --csv or --ndjson, write only that table, by its title or number",
17
+ description: "With --csv or --ndjson, write only that table, by its title, the start of it, or its number",
18
18
  };
19
19
 
20
- /** Headings of `gloomberb help`, in display order. */
20
+ /** Headings of `gloom help`, in display order. */
21
21
  export const CLI_COMMAND_GROUPS = {
22
22
  research: "Research",
23
23
  companyData: "Company data",
@@ -37,10 +37,10 @@ const PIPED_HELP_WIDTH = 80;
37
37
 
38
38
  /** Commands that run as written, for someone who has just installed it. */
39
39
  const START_HERE: Array<[string, string]> = [
40
- ["gloomberb search apple", "Find a ticker from a company name"],
41
- ["gloomberb quote AAPL", "Show the latest price"],
42
- ["gloomberb ticker AAPL", "Open the full research report"],
43
- ["gloomberb catalog earnings", "Find a function, then run it with fn"],
40
+ ["gloom search apple", "Find a ticker from a company name"],
41
+ ["gloom quote AAPL", "Show the latest price"],
42
+ ["gloom ticker AAPL", "Open the full research report"],
43
+ ["gloom catalog earnings", "Find a function, then run it with fn"],
44
44
  ];
45
45
 
46
46
  const GLOBAL_OPTIONS: Array<[string, string]> = [
@@ -52,7 +52,8 @@ const GLOBAL_OPTIONS: Array<[string, string]> = [
52
52
  ["--refresh", "Fetch fresh data instead of reading the cache"],
53
53
  ["--dry-run", "Preview config, cache, notes, alerts, plugin on/off, and remote changes without saving"],
54
54
  ["-q, --quiet", "Print no results or errors in text mode, for commands that print results"],
55
- ["--color, --no-color", "Force or turn off colors (NO_COLOR=1 also turns them off)"],
55
+ ["--color, --no-color", "Force or turn off colors (NO_COLOR also turns them off)"],
56
+ ["--plain, --no-plain", "Plain text for a screen reader or large text: no rule lines, arrows as words, every table column kept with a dash in empty cells. On by default when NO_COLOR is set or output is piped; --no-plain turns it off"],
56
57
  ["--width <n>", "Fit tables to n columns (default: the terminal width; piped output is not fitted). shot takes its own --width in pixels"],
57
58
  ];
58
59
 
@@ -75,8 +76,13 @@ function commandGroup(entry: CliHelpEntry): string {
75
76
  return entry.command.help?.group ?? (entry.source === "plugin" ? PLUGIN_COMMANDS_GROUP : OTHER_GROUP);
76
77
  }
77
78
 
79
+ /**
80
+ * A usage line as typed. Plugin help written before the rename may start
81
+ * with the old command name, which prints as `gloom`.
82
+ */
78
83
  function withProgramName(invocation: string): string {
79
- return invocation.startsWith("gloomberb ") ? invocation : `gloomberb ${invocation}`;
84
+ if (invocation.startsWith("gloom ")) return invocation;
85
+ return `gloom ${invocation.startsWith("gloomberb ") ? invocation.slice("gloomberb ".length) : invocation}`;
80
86
  }
81
87
 
82
88
  function renderInvocation(invocation: string, width: number): string[] {
@@ -112,7 +118,7 @@ export function renderCliHelp(entries: CliHelpEntry[], version: string, descript
112
118
  const listed = entries.filter(({ command }) => command.name !== "help");
113
119
  const nameWidth = Math.max(0, ...listed.map(({ command }) => visibleLength(command.name)));
114
120
  const lines = [
115
- `${cliStyles.bold("gloomberb")} ${cliStyles.muted(version)}`,
121
+ `${cliStyles.bold("gloom")} ${cliStyles.muted(version)}`,
116
122
  ...wrapText(description, width),
117
123
  "",
118
124
  renderSection("Start here"),
@@ -120,10 +126,10 @@ export function renderCliHelp(entries: CliHelpEntry[], version: string, descript
120
126
  "",
121
127
  renderSection("Usage"),
122
128
  ...renderDefinitions([
123
- ["gloomberb", "Open the terminal UI"],
124
- ["gloomberb <command> [args]", "Run a command and print the result"],
125
- ["gloomberb help <command>", "Show a command's usage, options, and examples"],
126
- ["gloomberb ticker SAN:EPA", "Name the listing of a symbol that trades in several places (or --exchange EPA)"],
129
+ ["gloom", "Open the terminal UI"],
130
+ ["gloom <command> [args]", "Run a command and print the result"],
131
+ ["gloom help <command>", "Show a command's usage, options, and examples"],
132
+ ["gloom ticker SAN:EPA", "Name the listing of a symbol that trades in several places (or --exchange EPA)"],
127
133
  ], { width }),
128
134
  ];
129
135
 
@@ -0,0 +1,126 @@
1
+ /**
2
+ * `history --csv` as one fixed table, whatever the symbol, its market's state
3
+ * or how many symbols were asked for: the prices, the bar's flag and marks,
4
+ * a coin's or one venue's volume, then the `status` column saying why a row
5
+ * has no figures and the five fixed columns naming what each row is. A list
6
+ * of symbols (`history --file`) writes every symbol's bars in one long table,
7
+ * its rows told apart by `symbol_or_series`, and a symbol that served no bars
8
+ * as one row with only its status.
9
+ */
10
+ import type { CliResultColumn } from "./result";
11
+ import type { HistoryRow } from "./history-rows";
12
+
13
+ /** A bar of one symbol of a list, or the one row of a symbol that served none. */
14
+ export interface HistoryListRow extends HistoryRow {
15
+ /** The listing the bar is of (`AAPL`, `000660.KS`), as `symbol_or_series` names it. */
16
+ symbol: string;
17
+ /** Why the symbol has no bars, as its warning says it; only on a symbol's one row with no bar. */
18
+ status?: string;
19
+ }
20
+
21
+ type ExportedRow = Record<string, unknown>;
22
+
23
+ /** A bar's mark as an export writes it: true or false on a bar, nothing on a symbol's row with no bar. */
24
+ function barMark(key: "partial" | "filled" | "unsettled") {
25
+ return (row: ExportedRow) => row.date ? row[key] === true : "";
26
+ }
27
+
28
+ /**
29
+ * The columns of every `history` export, in this order, in every market
30
+ * state: a bar still forming (Partial), rebuilt from hourly bars (Filled) or
31
+ * closing before its settlement (Unsettled) is marked in its own column
32
+ * whether or not any bar of this run has one, so files of different symbols
33
+ * or days line up when joined.
34
+ */
35
+ export const HISTORY_EXPORT_COLUMNS: CliResultColumn<ExportedRow>[] = [
36
+ { key: "date", header: "Date" },
37
+ { key: "open", header: "Open" },
38
+ { key: "high", header: "High" },
39
+ { key: "low", header: "Low" },
40
+ { key: "close", header: "Close" },
41
+ { key: "volume", header: "Volume" },
42
+ { key: "flag", header: "Flag" },
43
+ { key: "partial", header: "Partial", value: barMark("partial") },
44
+ { key: "filled", header: "Filled", value: barMark("filled") },
45
+ { key: "unsettled", header: "Unsettled", value: barMark("unsettled") },
46
+ { key: "volumeUnit", header: "Volume unit" },
47
+ { key: "volumeNote", header: "Volume note" },
48
+ { key: "venueVolume", header: "Venue volume" },
49
+ { key: "volumeVenue", header: "Volume venue" },
50
+ ];
51
+
52
+ /** Flags of a break before a bar, whose prices stay; every other code left the prices blank. */
53
+ const BREAK_FLAGS = new Set(["gap", "jump"]);
54
+
55
+ /**
56
+ * Why an exported history row has no prices: the symbol's failure, or the
57
+ * contradiction its source's prices had (`prices left blank: high<open`).
58
+ * Empty for a bar with its prices.
59
+ */
60
+ export function historyExportStatus(row: ExportedRow): string {
61
+ if (typeof row.status === "string" && row.status) return row.status;
62
+ const blanked = [row.open, row.high, row.low, row.close].every((value) => value == null);
63
+ const codes = (typeof row.flag === "string" ? row.flag : "").split(",").filter((code) => code && !BREAK_FLAGS.has(code));
64
+ return row.date && blanked && codes.length > 0 ? `prices left blank: ${codes.join(",")}` : "";
65
+ }
66
+
67
+ /** The one row a symbol that served no bars exports: its symbol and why, every figure empty. */
68
+ export function historyFailureRow(symbol: string, status: string): HistoryListRow {
69
+ return {
70
+ symbol, date: "", open: null, high: null, low: null, close: null, volume: null,
71
+ currency: null, unit: null, interval: null, flag: null, status,
72
+ };
73
+ }
74
+
75
+ /**
76
+ * A symbol's failure in one line, for its status cell and warning: the
77
+ * message, and the listings its details offer to choose between, as `quote`
78
+ * says it (`Choose an exchange for FP. Listings: FP:NEO, FP:TSXV.`).
79
+ */
80
+ export function oneLineFailure(message: string, details: unknown): string {
81
+ if (typeof details !== "string") return message;
82
+ const lines = details.split("\n");
83
+ const heading = lines.findIndex((line) => /^\S.*:$/.test(line));
84
+ if (heading < 0) return message;
85
+ const listings = lines.slice(heading + 1).flatMap((line) => /^\s+([^\s(]+)\s/.exec(line)?.[1] ?? []);
86
+ return listings.length > 0 ? `${message} ${lines[heading]} ${listings.join(", ")}.` : message;
87
+ }
88
+
89
+ /** At most this many symbols are named before a shared warning counts the rest. */
90
+ const NAMED_SYMBOLS = 8;
91
+
92
+ function symbolList(symbols: readonly string[]): string {
93
+ if (symbols.length <= NAMED_SYMBOLS) return symbols.join(", ");
94
+ return `${symbols.slice(0, NAMED_SYMBOLS).join(", ")} and ${symbols.length - NAMED_SYMBOLS} more`;
95
+ }
96
+
97
+ /**
98
+ * Whether a warning names a symbol as a whole word, in the case symbols are
99
+ * written in: `F` is named in "Not a ticker: F." but not in "AAPL, FB". A
100
+ * one-letter symbol is also an article that opens a sentence ("A gap of ..."),
101
+ * so it counts only where prose would not put one.
102
+ */
103
+ function namesSymbol(note: string, symbol: string): boolean {
104
+ const escaped = symbol.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
105
+ const after = symbol.length === 1 ? "(?![A-Za-z0-9]|\\s+[a-z])" : "(?![A-Za-z0-9])";
106
+ return new RegExp(`(?<![A-Za-z0-9])${escaped}${after}`).test(note);
107
+ }
108
+
109
+ /**
110
+ * The warnings of a list of symbols, each said once with the symbols it is
111
+ * about (`AAPL, MSFT: 2026-10-23 is still forming (partial)`), in the order
112
+ * they first came up. A warning that already names its symbol, as `Not a
113
+ * ticker: ZZZZQQ.` does, stands alone.
114
+ */
115
+ export function symbolListNotes(entries: ReadonlyArray<{ symbol: string; notes: readonly string[] }>): string[] {
116
+ const bySymbol = new Map<string, string[]>();
117
+ for (const { symbol, notes } of entries) {
118
+ for (const note of notes) {
119
+ const symbols = bySymbol.get(note) ?? [];
120
+ if (!symbols.includes(symbol)) bySymbol.set(note, [...symbols, symbol]);
121
+ }
122
+ }
123
+ return [...bySymbol].map(([note, symbols]) => (
124
+ symbols.length === 1 && namesSymbol(note, symbols[0]!) ? note : `${symbolList(symbols)}: ${note}`
125
+ ));
126
+ }
@@ -1,6 +1,6 @@
1
1
  import { INDEX_POINTS_EXPORT_UNIT, INDEX_POINTS_LABEL, isIndexLevel } from "../market-data/market/index-level";
2
2
  import type { PricePoint } from "../types/financials";
3
- import { marketPriceFractionDigitCeiling, resolveAssetDisplayKind } from "../market-data/market/format";
3
+ import { formatPriceObservation, marketPriceFractionDigitCeiling, resolveAssetDisplayKind } from "../market-data/market/format";
4
4
  import { TIME_RANGES, type TimeRange } from "../time-series/range";
5
5
  import { subtractTimeRange } from "../time-series/date-window";
6
6
  import {
@@ -28,8 +28,6 @@ const INTRADAY_RESOLUTIONS = ["1m", "5m", "15m", "30m", "45m", "1h"] as const;
28
28
  /** A first bar later than this after the range's start is a late start, not a weekend or holiday. */
29
29
  const LATE_START_MIN_MS = 10 * DAY_MS;
30
30
  const LATE_START_MIN_BARS = 3;
31
- /** A bar with more than this many calendar periods (`barPeriod`) since the one before follows a gap in the series. */
32
- const BREAK_GAP_PERIODS = 3;
33
31
  /** A close more than this many times the close before it, or less than its hundredth, follows a jump. */
34
32
  const BREAK_JUMP_RATIO = 100;
35
33
  /** Flag codes for a break before a bar, whose prices stay as served; every other code blanks them. */
@@ -76,6 +74,9 @@ export interface HistoryRow {
76
74
  volumeUnit?: string;
77
75
  /** Why a coin's bar has no volume: `day in progress`, `rebuilt from hourly bars`, `latest trade` (not a bar), `not reported`. */
78
76
  volumeNote?: string;
77
+ /** A bar without the market's volume: the trades of one venue alone (`volumeVenue`), never its volume. */
78
+ venueVolume?: number;
79
+ volumeVenue?: string;
79
80
  }
80
81
 
81
82
  /** A coin's volume: traded value in its quote currency, per UTC day on daily bars. */
@@ -148,8 +149,43 @@ function barPeriod(time: number, interval: ManualChartResolution): number {
148
149
  }
149
150
 
150
151
  /**
151
- * The breaks before each bar: `gap` after more than three calendar periods
152
- * with no bar (`barPeriod`), `jump` when its close is over 100 times the last
152
+ * How many periods (`barPeriod`) in a row without a bar break the series: a
153
+ * single month in monthly bars, since no market closes for a calendar month
154
+ * (GF=F's monthly chart went from 2002-08 to 2002-10); three weeks for weekly
155
+ * and finer bars, which a market's own closures do not reach.
156
+ */
157
+ function breakGapPeriods(interval: ManualChartResolution): number {
158
+ return interval === "1mo" ? 1 : 3;
159
+ }
160
+
161
+ /** A run of periods without a bar: the bars on either side of it, and how many periods it spans. */
162
+ interface HistoryHole {
163
+ before: number;
164
+ after: number;
165
+ periods: number;
166
+ }
167
+
168
+ /**
169
+ * The runs of periods without a bar between consecutive bars, oldest first:
170
+ * every missing month of monthly bars and every missing week of weekly bars,
171
+ * a closed week included, and for daily and finer bars each break in the
172
+ * series (breakGapPeriods), since their sessions follow a calendar the bars
173
+ * do not carry. `times` oldest first.
174
+ */
175
+ function historyHoles(times: readonly number[], interval: ManualChartResolution): HistoryHole[] {
176
+ const least = interval === "1mo" || interval === "1wk" ? 1 : breakGapPeriods(interval);
177
+ const finite = times.filter(Number.isFinite);
178
+ return finite.slice(1).flatMap((after, index) => {
179
+ const before = finite[index]!;
180
+ const periods = barPeriod(after, interval) - barPeriod(before, interval) - 1;
181
+ return periods >= least ? [{ before, after, periods }] : [];
182
+ });
183
+ }
184
+
185
+ /**
186
+ * The breaks before each bar: `gap` after a month with no bar in monthly
187
+ * bars, or more than three weeks in finer ones (breakGapPeriods), `jump`
188
+ * when its close is over 100 times the last
153
189
  * close before it, or under a hundredth of it. Closes that are blank, zero or
154
190
  * negative are skipped.
155
191
  */
@@ -163,7 +199,7 @@ function historyBreakFlags(
163
199
  return times.map((time, index) => {
164
200
  const flags: string[] = [];
165
201
  if (interval && Number.isFinite(time)) {
166
- if (previousTime != null && barPeriod(time, interval) - barPeriod(previousTime, interval) > BREAK_GAP_PERIODS) flags.push("gap");
202
+ if (previousTime != null && barPeriod(time, interval) - barPeriod(previousTime, interval) > breakGapPeriods(interval)) flags.push("gap");
167
203
  previousTime = time;
168
204
  }
169
205
  const close = closes[index];
@@ -218,6 +254,9 @@ export function historyRows(
218
254
  ...(point.filled ? { filled: true as const } : {}),
219
255
  ...(point.unsettled ? { unsettled: true as const } : {}),
220
256
  ...(volume ? { volumeUnit: volume.unit } : {}),
257
+ ...(values.volume == null && point.venueVolume
258
+ ? { venueVolume: point.venueVolume.volume, volumeVenue: point.venueVolume.venue }
259
+ : {}),
221
260
  // A coin trades every day, so a bar without volume says why.
222
261
  ...(volume && values.volume == null
223
262
  ? {
@@ -343,15 +382,28 @@ export function historyReportsVolume(rows: readonly Pick<HistoryRow, "volume">[]
343
382
  * are said by their own notes and not counted.
344
383
  */
345
384
  export function historyMissingVolumeNote(
346
- rows: readonly Pick<HistoryRow, "date" | "volume" | "partial" | "filled" | "flag">[],
385
+ rows: readonly Pick<HistoryRow, "date" | "volume" | "venueVolume" | "partial" | "filled" | "flag">[],
347
386
  ): string | null {
348
387
  if (!historyReportsVolume(rows)) return null;
349
388
  const latestTrade = latestTradeIndex(rows.map((row) => Date.parse(row.date)));
350
- const missing = rows.filter((row, index) => row.volume == null && !row.partial && !row.filled
389
+ const missing = rows.filter((row, index) => row.volume == null && row.venueVolume == null && !row.partial && !row.filled
351
390
  && !flagCodes(row).some((code) => !BREAK_FLAGS.has(code)) && index !== latestTrade).length;
352
391
  return missingVolumeNotice(missing, rows.length) ?? null;
353
392
  }
354
393
 
394
+ /**
395
+ * "9 of 9 bars count IEX trades only, not the market's volume" when bars carry one venue's count in place of the
396
+ * market's (`venueVolume`), or null.
397
+ */
398
+ export function historyVenueVolumeNote(rows: readonly Pick<HistoryRow, "venueVolume" | "volumeVenue">[]): string | null {
399
+ const counted = rows.filter((row) => row.venueVolume != null);
400
+ if (!counted.length) return null;
401
+ const venues = [...new Set(counted.map((row) => row.volumeVenue).filter(Boolean))].join(", ") || "one venue";
402
+ const one = counted.length === 1;
403
+ return `${counted.length} of ${rows.length} ${one && rows.length === 1 ? "bar" : "bars"} ${one ? "counts" : "count"} ${venues} trades only, `
404
+ + "not the market's volume";
405
+ }
406
+
355
407
  function neededDecimals(value: number, cap: number): number {
356
408
  for (let decimals = 0; decimals < cap; decimals++) {
357
409
  if (Number(value.toFixed(decimals)) === value) return decimals;
@@ -383,6 +435,32 @@ export function historyPriceDecimals(rows: readonly Pick<HistoryRow, typeof PRIC
383
435
  return largest >= 1 ? Math.max(2, decimals) : decimals;
384
436
  }
385
437
 
438
+ /** A bar's prices as a table lists them; a bar without a close adds nothing to the decimals. */
439
+ interface BarPrices {
440
+ open?: number | null;
441
+ high?: number | null;
442
+ low?: number | null;
443
+ close?: number | null;
444
+ }
445
+
446
+ /**
447
+ * The decimals one table of bars prints its prices with (`history`, HP's pane
448
+ * and `fn HP`): historyPriceDecimals over the float32-cleaned prices, so a
449
+ * feed's 4013.39990234 reads as the 4013.4 it is and the count follows the
450
+ * asset's display rules (two for gold, three for silver, cents for a US equity).
451
+ */
452
+ export function barPriceDecimals(bars: readonly BarPrices[], assetCategory?: string): number {
453
+ const clean = (value: number | null | undefined) => value == null ? null : cleanFloat32Price(value);
454
+ return historyPriceDecimals(bars.flatMap((bar) => bar.close == null ? [] : [{
455
+ date: "", open: clean(bar.open), high: clean(bar.high), low: clean(bar.low), close: clean(bar.close)!, volume: null,
456
+ }]), assetCategory);
457
+ }
458
+
459
+ /** A price at the table's decimal count (barPriceDecimals), within `maxWidth` when the pane gives one. */
460
+ export function formatBarPrice(value: number, decimals: number, maxWidth?: number): string {
461
+ return formatPriceObservation(Number(value.toFixed(Math.min(20, decimals))), { minimumFractionDigits: decimals, maxWidth });
462
+ }
463
+
386
464
  /** How far back ALL reaches, in whole years, from the window a history request for it asks for. */
387
465
  export function historyAllRangeYears(now = new Date()): number {
388
466
  return Math.round((now.getTime() - subtractTimeRange(now, "ALL").getTime()) / (365.25 * DAY_MS));
@@ -459,16 +537,48 @@ export function historyFacts(unit: HistoryUnit, rows: readonly Pick<HistoryRow,
459
537
  ].filter(Boolean);
460
538
  }
461
539
 
540
+ /** Whether a first bar dated `firstDate` lies well after the start of `range`: more than a few bars, weekends and holidays aside. */
541
+ function startsLate(range: TimeRange, interval: ManualChartResolution | null, firstDate: string, now: number): boolean {
542
+ const first = Date.parse(firstDate);
543
+ const tolerance = Math.max(LATE_START_MIN_MS, LATE_START_MIN_BARS * CHART_RESOLUTION_STEP_MS[interval ?? RANGE_HISTORY_RESOLUTION[range]]);
544
+ return Number.isFinite(first) && first - subtractTimeRange(new Date(now), range).getTime() > tolerance;
545
+ }
546
+
547
+ /**
548
+ * Where an ALL history starts when that is its source's first bar, well
549
+ * after the window ALL reaches back to (historyAllRangeYears): BTC-USD's
550
+ * monthly bars start 2014-09, though it traded from 2010. A monthly bar's
551
+ * month, otherwise its day. Null for other ranges, and for a history the
552
+ * window cuts.
553
+ */
554
+ export function historyAllStart(
555
+ range: TimeRange,
556
+ interval: ManualChartResolution | null,
557
+ firstDate: string | undefined,
558
+ now = Date.now(),
559
+ ): string | null {
560
+ if (range !== "ALL" || !firstDate || !startsLate(range, interval, firstDate, now)) return null;
561
+ return interval === "1mo" ? firstDate.slice(0, 7) : firstDate.slice(0, 10);
562
+ }
563
+
564
+ /** "ALL starts 2014-09; the source has no earlier bar", for the start historyAllStart finds. */
565
+ export function historyAllStartNote(start: string): string {
566
+ return `ALL starts ${start}; the source has no earlier bar`;
567
+ }
568
+
462
569
  /**
463
570
  * What an export should know that its rows do not show: bars coarser than the
464
- * range is served in, or a first bar well after the start asked for, as for a
465
- * listing younger than the range. Weekends and holidays are within tolerance.
571
+ * range is served in, a first bar well after the start asked for, as for a
572
+ * listing younger than the range, and where an ALL history starts when that
573
+ * is the source's first bar, unless a coverage line already says where the
574
+ * source starts (`coverageStated`). Weekends and holidays are within tolerance.
466
575
  */
467
576
  export function historyNotes(
468
577
  range: TimeRange,
469
578
  interval: ManualChartResolution | null,
470
579
  firstDate: string | undefined,
471
580
  now = Date.now(),
581
+ coverageStated = false,
472
582
  ): string[] {
473
583
  if (!firstDate) return [];
474
584
  const notes: string[] = [];
@@ -477,13 +587,11 @@ export function historyNotes(
477
587
  const from = interval === "1mo" ? firstDate.slice(0, 7) : firstDate.slice(0, 10);
478
588
  notes.push(`Asked ${range}, got ${BAR_INTERVAL_LABELS[interval]} bars from ${from}`);
479
589
  }
480
- const first = Date.parse(firstDate);
481
- if (range !== "ALL" && Number.isFinite(first)) {
482
- const tolerance = Math.max(LATE_START_MIN_MS, LATE_START_MIN_BARS * CHART_RESOLUTION_STEP_MS[interval ?? expected]);
483
- if (first - subtractTimeRange(new Date(now), range).getTime() > tolerance) {
484
- notes.push(`Asked ${range}, data starts ${firstDate.slice(0, 10)} (first available bar)`);
485
- }
590
+ if (range !== "ALL" && startsLate(range, interval, firstDate, now)) {
591
+ notes.push(`Asked ${range}, data starts ${firstDate.slice(0, 10)} (first available bar)`);
486
592
  }
593
+ const allStart = coverageStated ? null : historyAllStart(range, interval, firstDate, now);
594
+ if (allStart) notes.push(historyAllStartNote(allStart));
487
595
  return notes;
488
596
  }
489
597
 
@@ -511,36 +619,80 @@ function utcDay(time: number): string {
511
619
  return new Date(time).toISOString().slice(0, 10);
512
620
  }
513
621
 
514
- /** The bars flagged `code`, each with the bar before it. */
515
- function breaksFlagged<Row extends Pick<HistoryRow, "flag">>(rows: readonly Row[], code: string): Array<[Row, Row]> {
516
- return rows.flatMap((row, index) => index > 0 && flagCodes(row).includes(code) ? [[rows[index - 1]!, row] as [Row, Row]] : []);
622
+ function monthKey(year: number, month: number): string {
623
+ return utcDay(Date.UTC(year, month, 1)).slice(0, 7);
624
+ }
625
+
626
+ /** The first day of week `period` (`barPeriod`): its Monday. */
627
+ function weekStart(period: number): number {
628
+ return FIRST_MONDAY_MS + period * 7 * DAY_MS;
629
+ }
630
+
631
+ /** "2026-02", "2026-02 to 2026-03 (2 months)", "the week of 2025-09-29", "2015-06-27 to 2015-08-02 (5 weeks)". */
632
+ function holeText(hole: HistoryHole, interval: ManualChartResolution): string {
633
+ const { before, after, periods } = hole;
634
+ if (interval === "1mo") {
635
+ const period = barPeriod(before, interval) + 1;
636
+ const first = monthKey(Math.floor(period / 12), period % 12);
637
+ const last = monthKey(Math.floor((period + periods - 1) / 12), (period + periods - 1) % 12);
638
+ return periods === 1 ? first : `${first} to ${last} (${periods} months)`;
639
+ }
640
+ const length = `${periods} week${periods === 1 ? "" : "s"}`;
641
+ if (interval === "1wk") {
642
+ const first = barPeriod(before, interval) + 1;
643
+ return periods === 1 ? `the week of ${utcDay(weekStart(first))}`
644
+ : `${utcDay(weekStart(first))} to ${utcDay(weekStart(first + periods) - DAY_MS)} (${length})`;
645
+ }
646
+ return `${utcDay(before + DAY_MS)} to ${utcDay(after - DAY_MS)} (${length})`;
647
+ }
648
+
649
+ /**
650
+ * "No bar for 2026-02", "No bars for 2001-07, 2002-09 and 2026-02 to 2026-03
651
+ * (2 months)": every run of periods without a bar (historyHoles), oldest
652
+ * first, each named. `times` oldest first. Null when there is none.
653
+ */
654
+ export function historyMissingPeriodsNote(times: readonly number[], interval: ManualChartResolution | null): string | null {
655
+ const holes = interval ? historyHoles(times, interval) : [];
656
+ if (!interval || holes.length === 0) return null;
657
+ const one = holes.length === 1 && holes[0]!.periods === 1 && (interval === "1mo" || interval === "1wk");
658
+ return `${one ? "No bar" : "No bars"} for ${listItems(holes.map((hole) => holeText(hole, interval)))}`;
659
+ }
660
+
661
+ /** A bar's date as a history table shows it: the month of a monthly bar, the day of a daily or weekly one, else the UTC time. */
662
+ function holeBarDate(time: number, interval: ManualChartResolution): string {
663
+ const iso = new Date(time).toISOString();
664
+ return interval === "1mo" ? iso.slice(0, 7) : isIntradayResolution(interval) ? formatUtcTime(iso) : iso.slice(0, 10);
665
+ }
666
+
667
+ /**
668
+ * For each bar, oldest first, whether a run of periods without a bar
669
+ * (historyHoles) lies between it and the bar before: its change from that
670
+ * bar spans them. `times` oldest first.
671
+ */
672
+ export function historyBarsAfterHole(times: readonly number[], interval: ManualChartResolution | null): boolean[] {
673
+ const after = new Set(interval ? historyHoles(times, interval).map((hole) => hole.after) : []);
674
+ return times.map((time) => after.has(time));
675
+ }
676
+
677
+ /**
678
+ * "CHG marked * spans the missing bars: 2026-04 is from 2026-01": the bar
679
+ * each change after a run of periods without a bar (historyBarsAfterHole) is
680
+ * measured from. `times` oldest first. Null when there is none.
681
+ */
682
+ export function historyChangeBaseNote(times: readonly number[], interval: ManualChartResolution | null): string | null {
683
+ const holes = interval ? historyHoles(times, interval) : [];
684
+ if (!interval || holes.length === 0) return null;
685
+ const bases = holes.map(({ before, after }, index) =>
686
+ `${holeBarDate(after, interval)}${index === 0 ? " is" : ""} from ${holeBarDate(before, interval)}`);
687
+ return `CHG marked * spans the missing bars: ${listItems(bases)}`;
517
688
  }
518
689
 
519
690
  /**
520
- * "No bars for 1980-08 to 1992-11 (148 months)": the periods with no bar
521
- * before each bar flagged `gap`, the latest few by date and the rest counted.
691
+ * "No bars for 1980-08 to 1992-11 (148 months)": every run of periods with
692
+ * no bar between two bars (historyMissingPeriodsNote).
522
693
  */
523
694
  function historyBreakGapNote(rows: readonly Pick<HistoryRow, "date" | "interval" | "flag">[]): string | null {
524
- const interval = rows[0]?.interval;
525
- const gaps = interval ? breaksFlagged(rows, "gap") : [];
526
- if (!interval || gaps.length === 0) return null;
527
- const monthly = interval === "1mo";
528
- const spans = gaps.map(([before, after]) => {
529
- const [from, to] = [Date.parse(before.date), Date.parse(after.date)];
530
- const periods = barPeriod(to, interval) - barPeriod(from, interval) - 1;
531
- const length = `${periods} ${monthly ? "month" : "week"}${periods === 1 ? "" : "s"}`;
532
- if (monthly) {
533
- const month = (time: number, step: number) => {
534
- const date = new Date(time);
535
- return utcDay(Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + step, 1)).slice(0, 7);
536
- };
537
- return `${month(from, 1)} to ${month(to, -1)} (${length})`;
538
- }
539
- return `${utcDay(from + (interval === "1wk" ? 7 : 1) * DAY_MS)} to ${utcDay(to - DAY_MS)} (${length})`;
540
- });
541
- const shown = spans.slice(-LISTED_GAPS);
542
- const earlier = spans.length - shown.length;
543
- return `No bars for ${listItems([...earlier > 0 ? [`${earlier} earlier ${earlier === 1 ? "gap" : "gaps"}`] : [], ...shown])}`;
695
+ return historyMissingPeriodsNote(rows.map((row) => Date.parse(row.date)), rows[0]?.interval ?? null);
544
696
  }
545
697
 
546
698
  const closeFormat = new Intl.NumberFormat("en-US", { maximumSignificantDigits: 7, useGrouping: false });
@@ -573,8 +725,9 @@ export function historyJumpNote(rows: readonly Pick<HistoryRow, "date" | "close"
573
725
  * "No bar for 2026-10-10": the days a coin, which trades every day, has no
574
726
  * daily bar for between its first and last bar. Days before the first bar are
575
727
  * before the listing. A market that closes skips weekends and holidays, so its
576
- * gaps say nothing on their own: for it, and for a coin's other bar sizes, the
577
- * note names the gaps flagged `gap`, "No bars for 1980-08 to 1992-11 (148 months)".
728
+ * daily gaps say nothing on their own: for it, and for a coin's other bar
729
+ * sizes, the note names every month or week without a bar and each break in
730
+ * daily or finer bars (historyMissingPeriodsNote), "No bar for 2026-02".
578
731
  */
579
732
  export function historyGapNote(
580
733
  rows: readonly Pick<HistoryRow, "date" | "interval" | "flag">[],
@@ -1,44 +1,4 @@
1
- /**
2
- * Well-known index roots that people type bare. As a bare symbol each one is
3
- * another instrument (MOVE is Corvex, MID a fund) or nothing at all (VIX); the
4
- * index itself is quoted as ^ROOT. Every entry is offered as a command to run,
5
- * so only roots whose ^ symbol returns a quote belong here.
6
- */
7
- const INDEX_ROOTS = new Map([
8
- ["VIX", "Cboe Volatility Index"],
9
- ["VVIX", "Cboe VIX of VIX Index"],
10
- ["VIX9D", "Cboe S&P 500 9-Day Volatility Index"],
11
- ["VIX3M", "Cboe S&P 500 3-Month Volatility Index"],
12
- ["VXN", "Cboe Nasdaq-100 Volatility Index"],
13
- ["OVX", "Cboe Crude Oil ETF Volatility Index"],
14
- ["GVZ", "Cboe Gold ETF Volatility Index"],
15
- ["SKEW", "Cboe SKEW Index"],
16
- ["TNX", "Cboe 10-Year Treasury Yield Index"],
17
- ["SPX", "S&P 500 Index"],
18
- ["OEX", "S&P 100 Index"],
19
- ["MID", "S&P MidCap 400 Index"],
20
- ["DJI", "Dow Jones Industrial Average"],
21
- ["NDX", "Nasdaq-100 Index"],
22
- ["SOX", "PHLX Semiconductor Index"],
23
- ["RUT", "Russell 2000 Index"],
24
- ["RUI", "Russell 1000 Index"],
25
- ["RUA", "Russell 3000 Index"],
26
- ["MOVE", "ICE BofA MOVE Index"],
27
- ["NYA", "NYSE Composite Index"],
28
- ]);
29
-
30
- export interface IndexRoot {
31
- /** The index's own symbol: ^VIX. */
32
- symbol: string;
33
- name: string;
34
- }
35
-
36
- /** The index a bare root names (VIX is ^VIX); null for any other symbol, ^VIX included. */
37
- export function indexRootFor(symbol: string): IndexRoot | null {
38
- const root = symbol.trim().toUpperCase();
39
- const name = INDEX_ROOTS.get(root);
40
- return name ? { symbol: `^${root}`, name } : null;
41
- }
1
+ import { indexRootFor, type IndexRoot } from "../tickers/index-roots";
42
2
 
43
3
  /** A broker's code for an index: VIX.X and $VIX.X as thinkorswim writes it, $VIX as Schwab does. */
44
4
  export interface BrokerIndexCode extends IndexRoot {
@@ -66,14 +26,14 @@ export function brokerIndexReadAs(code: BrokerIndexCode): string {
66
26
  return `Read ${code.typed} as ${code.symbol} (${code.name}).`;
67
27
  }
68
28
 
69
- /** "^VIX Cboe Volatility Index (try: gloomberb quote ^VIX)", under a bare root that found nothing. */
29
+ /** "^VIX Cboe Volatility Index (try: gloom quote ^VIX)", under a bare root that found nothing. */
70
30
  export function indexRootTryLine(root: IndexRoot, command = "quote"): string {
71
- return `${root.symbol} ${root.name} (try: gloomberb ${command} ${root.symbol})`;
31
+ return `${root.symbol} ${root.name} (try: gloom ${command} ${root.symbol})`;
72
32
  }
73
33
 
74
- /** "also ^MOVE ICE BofA MOVE Index (gloomberb quote ^MOVE)", under a bare root that quoted another instrument. */
34
+ /** "also ^MOVE ICE BofA MOVE Index (gloom quote ^MOVE)", under a bare root that quoted another instrument. */
75
35
  export function indexRootAlsoLine(root: IndexRoot, command = "quote"): string {
76
- return `also ${root.symbol} ${root.name} (gloomberb ${command} ${root.symbol})`;
36
+ return `also ${root.symbol} ${root.name} (gloom ${command} ${root.symbol})`;
77
37
  }
78
38
 
79
39
  /** Cboe's Treasury yield indices: 13-week bill, 5-, 10- and 30-year notes. Each level is a yield in percent. */